diff --git a/.github/scripts/build_windows_executables.bat b/.github/scripts/build_windows_executables.bat index d93c3ac5e8..297a3b9a13 100644 --- a/.github/scripts/build_windows_executables.bat +++ b/.github/scripts/build_windows_executables.bat @@ -7,38 +7,72 @@ for /f "tokens=* usebackq" %%f in (`dir /b "C:\Program Files (x86)\Intel\oneAPI\ @REM since building the Visual Studio projects modifies files powershell -command "(Get-Content -Path '.\vs-build\CreateGitVersion.bat') -replace '--dirty', '' | Set-Content -Path '.\vs-build\CreateGitVersion.bat'" -echo on - -@REM Build all solutions -devenv vs-build/AeroDisk/AeroDisk_Driver.sln /Build "Release|x64" -devenv vs-build/AeroDyn/AeroDyn_Driver.sln /Build "Release|x64" -devenv vs-build/AeroDyn/AeroDyn_Driver.sln /Build "Release_OpenMP|x64" -devenv vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.sln /Build "Release|x64" -devenv vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.sln /Build "Release_OpenMP|x64" -devenv vs-build/BeamDyn/BeamDyn-w-registry.sln /Build "Release|x64" -devenv vs-build/Discon/Discon.sln /Build "Release|x64" -devenv vs-build/FAST-farm/FAST-Farm.sln /Build "Release|x64" -devenv vs-build/FAST-farm/FAST-Farm.sln /Build "Release_OpenMP|x64" -devenv vs-build/HydroDyn/HydroDynDriver.sln /Build "Release|x64" -devenv vs-build/HydroDyn_c_binding/HydroDyn_c_binding.sln /Build "Release|x64" -devenv vs-build/InflowWind_c_binding/InflowWind_c_binding.sln /Build "Release|x64" -devenv vs-build/InflowWind/InflowWind_driver.sln /Build "Release|x64" -devenv vs-build/InflowWind/InflowWind_driver.sln /Build "Release_OpenMP|x64" -devenv vs-build/MoorDyn/MoorDynDriver.sln /Build "Release|x64" -devenv vs-build/MoorDyn_c_binding/MoorDyn_c_binding.sln /Build "Release|x64" -devenv vs-build/FAST/FAST.sln /Build "Release|x64" -devenv vs-build/SeaState/SeaStateDriver.sln /Build "Release|x64" -devenv vs-build/SeaState_c_binding/SeaState_c_binding.sln /Build "Release|x64" -devenv vs-build/SimpleElastoDyn/SimpleElastoDyn_Driver.sln /Build "Release|x64" -devenv vs-build/SubDyn/SubDyn.sln /Build "Release|x64" -devenv vs-build/TurbSim/TurbSim.vfproj /Build "Release|x64" -devenv vs-build/UnsteadyAero/UnsteadyAero.sln /Build "Release|x64" - -@REM Build MATLAB solution last -rd /s /q .\build\lib -devenv vs-build/FAST/FAST.sln /Build "Release_Matlab|x64" - -@REM Copy controllers to bin directory -xcopy .\reg_tests\r-test\glue-codes\openfast\5MW_Baseline\ServoData\*.dll .\build\bin\ /y - -exit /b %ERRORLEVEL% +setlocal enabledelayedexpansion + +:: Initialize a variable to store failed solutions +set "FailedSolutions=" +set "OverallErrorLevel=0" + + +echo "Build all projects (Release|64)" +devenv vs-build/OpenFAST.sln /Build "Release|x64" +if %ERRORLEVEL% NEQ 0 ( + set "FailedSolutions=!FailedSolutions!Release " + set "OverallErrorLevel=1" + echo Build of OpenFAST.sln Release failed! +) + + +echo "Build all OpenMP projects (OpenMP_Release|64)" +devenv vs-build/OpenFAST.sln /Build "OpenMP_Release|x64" +if %ERRORLEVEL% NEQ 0 ( + set "FailedSolutions=!FailedSolutions!OpenMP_Release " + set "OverallErrorLevel=1" + echo Build of OpenFAST.sln OpenMP_Release failed! +) + + +echo "Build OpenFAST-Simulink shared library (Matlab_Release|x64)" +devenv vs-build/OpenFAST.sln /Build "Matlab_Release|x64" +if %ERRORLEVEL% NEQ 0 ( + set "FailedSolutions=!FailedSolutions!Matlab_Release " + set "OverallErrorLevel=1" + echo Build of OpenFAST.sln Matlab_Release failed! +) + + +echo "Build Summary:" +if defined FailedSolutions ( + echo The following solutions failed to build: + echo %FailedSolutions% +) else ( + echo All solutions built successfully. +) + +@echo off +setlocal enabledelayedexpansion + +cd /d build\bin || exit /b 1 + +for %%F in (*_Release*) do ( + set "name=%%~nxF" + set "newname=!name:_Release=!" + if not "!name!"=="!newname!" ( + ren "%%F" "!newname!" + ) +) +for %%F in (*_Matlab*) do ( + set "name=%%~nxF" + set "newname=!name:_Matlab=!" + if not "!name!"=="!newname!" ( + ren "%%F" "!newname!" + ) +) + +endlocal + +echo "List executables in build\bin" +dir build\bin + +:: Set the final error level based on the overall build status +exit /b %OverallErrorLevel% diff --git a/.github/scripts/test_windows_executables.bat b/.github/scripts/test_windows_executables.bat new file mode 100644 index 0000000000..ff29f259d9 --- /dev/null +++ b/.github/scripts/test_windows_executables.bat @@ -0,0 +1,66 @@ +@call "C:\Program Files (x86)\Intel\oneAPI\setvars-vcvarsall.bat" %VS_VER% + +for /f "tokens=* usebackq" %%f in (`dir /b "C:\Program Files (x86)\Intel\oneAPI\compiler\" ^| findstr /V latest ^| sort`) do @set "LATEST_VERSION=%%f" +@call "C:\Program Files (x86)\Intel\oneAPI\compiler\%LATEST_VERSION%\env\vars.bat" + +echo off +setlocal enabledelayedexpansion + +:: Initialize a variable to store failed solutions +set "FailedExecs=" +set "OverallErrorLevel=0" + +echo "Directory listing of executables" +dir build\bin +echo. + +:: test OpenFAST +echo on +build\bin\OpenFAST.exe -h +echo off +if %ERRORLEVEL% NEQ 0 ( + set "FailedExecs=!FailedExecs!OpenFAST " + set "OverallErrorLevel=1" + echo OpenFAST failed to run! +) +echo on + + +:: test TurbSim +echo on +build\bin\TurbSim.exe -h +echo off +if %ERRORLEVEL% NEQ 0 ( + set "FailedExecs=!FailedExecs!TurbSim " + set "OverallErrorLevel=1" + echo TurbSim failed to run! +) +echo on + + +:: test FAST.Farm +echo on +build\bin\FAST.Farm.exe -h +echo off +if %ERRORLEVEL% NEQ 0 ( + set "FailedExecs=!FailedExecs!FAST.Farm " + set "OverallErrorLevel=1" + echo FAST.Farm failed to run! +) +echo on + + + +echo. +echo Test Summary: +echo off +if defined FailedExecs ( + echo The following executables failed to run: + echo %FailedExecs% +) else ( + echo All executables ran successfully. +) +echo on + +:: Set the final error level based on the overall build status +exit /b %OverallErrorLevel% diff --git a/.github/workflows/automated-dev-tests.yml b/.github/workflows/automated-dev-tests.yml index 4920d86cea..e31e386222 100644 --- a/.github/workflows/automated-dev-tests.yml +++ b/.github/workflows/automated-dev-tests.yml @@ -1,6 +1,12 @@ name: 'Development Pipeline' +#------------------------------------------------------------------------------- +# Notes +# - ATLAS BLAS is used instead of OpenBLAS because it gives more consistent +# results when OpenMP is enabled. This is likely due to a bug in OpenBLAS. +#------------------------------------------------------------------------------- + on: push: paths-ignore: @@ -16,12 +22,13 @@ on: # paths-ignore: env: - FORTRAN_COMPILER: gfortran-12 - CXX_COMPILER: g++-12 - C_COMPILER: gcc-12 - GCOV_EXE: gcov-12 + FORTRAN_COMPILER: gfortran-14 + CXX_COMPILER: g++-14 + C_COMPILER: gcc-14 + GCOV_EXE: gcov-14 CMAKE_BUILD_PARALLEL_LEVEL: 8 CTEST_PARALLEL_LEVEL: 4 + OMP_NUM_THREADS: 1 jobs: @@ -33,14 +40,14 @@ jobs: # 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 # Debug speeds up the build. - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev + sudo apt-get install -y libatlas-base-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -52,7 +59,7 @@ jobs: -DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \ -DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \ -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ - -DBLA_VENDOR:STRING=OpenBLAS \ + -DBLA_VENDOR:STRING=ATLAS \ -DCMAKE_BUILD_TYPE:STRING=DEBUG \ -DVARIABLE_TRACKING:BOOL=OFF \ -DDOUBLE_PRECISION:BOOL=OFF \ @@ -66,9 +73,8 @@ jobs: run: | cmake --build . --target all - build-all-release: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 @@ -83,7 +89,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev + sudo apt-get install -y libatlas-base-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -96,7 +102,7 @@ jobs: -DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \ -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ -DBUILD_SHARED_LIBS:BOOL=OFF \ - -DBLA_VENDOR:STRING=OpenBLAS \ + -DBLA_VENDOR:STRING=ATLAS \ -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo \ -DVARIABLE_TRACKING:BOOL=OFF \ -DBUILD_TESTING:BOOL=ON \ @@ -107,6 +113,7 @@ jobs: -DBUILD_OPENFAST_LIB_DRIVER:BOOL=ON \ -DBUILD_OPENFAST_CPP_DRIVER:BOOL=ON \ -DBUILD_FASTFARM:BOOL=ON \ + -DAMREX_READER=ON \ ${GITHUB_WORKSPACE} - name: Build all working-directory: ${{github.workspace}}/build @@ -116,7 +123,7 @@ jobs: run: | tar -cvf workspace.tar -C ${{github.workspace}} \ --exclude='*.a' --exclude='*.o' --exclude='build/ftnmods' \ - --exclude='.git' --exclude='docs' --exclude='vs-build' \ + --exclude='docs' --exclude='vs-build' \ . - name: Save workspace for other jobs uses: actions/upload-artifact@v4 @@ -132,7 +139,7 @@ jobs: # 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 + runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 @@ -148,7 +155,7 @@ jobs: pip install -r requirements.txt pip install glue-codes/python/. # Installs the interface library sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -160,12 +167,13 @@ jobs: -DCMAKE_CXX_COMPILER:STRING=${{env.CXX_COMPILER}} \ -DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \ -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ - -DBLA_VENDOR:STRING=OpenBLAS \ + -DBLA_VENDOR:STRING=ATLAS \ -DCMAKE_BUILD_TYPE:STRING=DEBUG \ -DGENERATE_TYPES:BOOL=ON \ -DVARIABLE_TRACKING:BOOL=OFF \ -DBUILD_TESTING:BOOL=ON \ -DCTEST_PLOT_ERRORS:BOOL=ON \ + -DAMREX_READER=ON \ ${GITHUB_WORKSPACE} # -DDOUBLE_PRECISION=OFF \ - name: Build all @@ -209,7 +217,7 @@ jobs: build-test-OF-simulink: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Checkout uses: actions/checkout@v4 @@ -218,7 +226,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-dev + sudo apt-get install -y libatlas-base-dev - name: Set up MATLAB uses: matlab-actions/setup-matlab@v2 with: @@ -256,7 +264,7 @@ jobs: #----------------------------------------------------------------------------- rtest-module-drivers: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: build-all-release steps: - name: Restore workspace from artifact @@ -279,7 +287,7 @@ jobs: pip install -r requirements.txt pip install glue-codes/python/. # Installs the interface library sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -319,10 +327,8 @@ jobs: rtest-interfaces: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: build-all-release - env: - OMP_NUM_THREADS: 1 steps: - name: Restore workspace from artifact uses: actions/download-artifact@v4 @@ -344,7 +350,7 @@ jobs: pip install -r requirements.txt pip install glue-codes/python/. # Installs the interface library sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -378,10 +384,8 @@ jobs: rtest-OF: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: build-all-release - env: - OMP_NUM_THREADS: 1 steps: - name: Restore workspace from artifact uses: actions/download-artifact@v4 @@ -403,7 +407,7 @@ jobs: pip install -r requirements.txt pip install glue-codes/python/. # Installs the interface library sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -436,7 +440,7 @@ jobs: rtest-OF-offshore: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: build-all-release steps: - name: Restore workspace from artifact @@ -459,7 +463,7 @@ jobs: pip install -r requirements.txt pip install glue-codes/python/. # Installs the interface library sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -475,7 +479,7 @@ jobs: run: | ctest -VV \ -L openfast -L offshore \ - -LE "cpp|linear|python|fastlib" + -LE "cpp|linear|python|fastlib|multirotor" - name: Failing test artifacts uses: actions/upload-artifact@v4 if: failure() @@ -490,12 +494,64 @@ jobs: !${{github.workspace}}/build/reg_tests/glue-codes/openfast/UAE_VI !${{github.workspace}}/build/reg_tests/glue-codes/openfast/WP_Baseline - + rtest-OF-multirotor: + runs-on: ubuntu-24.04 + needs: build-all-release + steps: + - name: Restore workspace from artifact + uses: actions/download-artifact@v4 + with: + name: build-all-release + - name: Untar workspace + run: | + tar -xf workspace.tar -C${{github.workspace}} + rm workspace.tar + - name: List files in workspace + run: ls + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Install dependencies + working-directory: ${{github.workspace}} + run: | + pip install -r requirements.txt + pip install glue-codes/python/. # Installs the interface library + sudo apt-get update -y + sudo apt-get install -y libatlas-base-dev + sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev + - name: Configure Tests + working-directory: ${{github.workspace}}/build + run: | + cmake \ + -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 + working-directory: ${{github.workspace}}/build + run: | + ctest -VV \ + -L openfast -L multirotor \ + -LE "cpp|linear|python|fastlib" + - name: Failing test artifacts + uses: actions/upload-artifact@v4 + if: failure() + with: + name: rtest-OF-multirotor + path: | + ${{github.workspace}}/build/reg_tests/glue-codes/openfast + !${{github.workspace}}/build/reg_tests/glue-codes/openfast/5MW_Baseline + !${{github.workspace}}/build/reg_tests/glue-codes/openfast/AOC + !${{github.workspace}}/build/reg_tests/glue-codes/openfast/AWT27 + !${{github.workspace}}/build/reg_tests/glue-codes/openfast/SWRT + !${{github.workspace}}/build/reg_tests/glue-codes/openfast/UAE_VI + !${{github.workspace}}/build/reg_tests/glue-codes/openfast/WP_Baseline + rtest-OF-linearization: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: build-all-release - env: - OMP_NUM_THREADS: 1 steps: - name: Restore workspace from artifact uses: actions/download-artifact@v4 @@ -517,7 +573,7 @@ jobs: pip install -r requirements.txt pip install glue-codes/python/. # Installs the interface library sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -546,10 +602,8 @@ jobs: !${{github.workspace}}/build/reg_tests/glue-codes/openfast/WP_Baseline rtest-OF-aeromap: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: build-all-release - env: - OMP_NUM_THREADS: 1 steps: - name: Restore workspace from artifact uses: actions/download-artifact@v4 @@ -571,7 +625,7 @@ jobs: pip install -r requirements.txt pip install glue-codes/python/. # Installs the interface library sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -601,10 +655,8 @@ jobs: rtest-openfast_io: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: build-all-release - env: - OMP_NUM_THREADS: 1 steps: - name: Restore workspace from artifact uses: actions/download-artifact@v4 @@ -626,7 +678,7 @@ jobs: pip install -r requirements.txt pip install glue-codes/python/. # Installs the interface library sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Install openfast_io working-directory: ${{github.workspace}}/openfast_io @@ -655,9 +707,10 @@ jobs: rtest-FF: - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 needs: build-all-release env: + CTEST_PARALLEL_LEVEL: 2 OMP_NUM_THREADS: 2 steps: - name: Restore workspace from artifact @@ -680,7 +733,7 @@ jobs: pip install -r requirements.txt pip install glue-codes/python/. # Installs the interface library sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 94a795b802..f092623370 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -149,17 +149,14 @@ jobs: shell: cmd run: .github/scripts/windows_devenv_test.bat - - name: Install Intel oneAPI Fortran Essentials (Windows) + - name: Install Intel Fortran Essentials (Windows) shell: cmd env: - URL: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/b626b5cf-8a15-40a4-be9a-9edabbb7cf17/intel-fortran-essentials-2025.3.0.333_offline.exe + URL: https://registrationcenter-download.intel.com/akdlm/IRC_NAS/33676fcf-14a3-4e96-a9b9-72976b1145d9/intel-fortran-essentials-2025.3.1.25_offline.exe run: | curl.exe --output %TEMP%\webimage.exe --url %URL% --retry 5 --retry-delay 5 - start /b /wait %TEMP%\webimage.exe -s -x -f webimage_extracted --log extract.log - del %TEMP%\webimage.exe - webimage_extracted\bootstrapper.exe -s --action install --eula=accept -p=NEED_VS2017_INTEGRATION=0 -p=NEED_VS2019_INTEGRATION=0 -p=NEED_VS2022_INTEGRATION=1 --log-dir=. + %TEMP%\webimage.exe -s -a --silent --eula accept -p=NEED_VS2017_INTEGRATION=0 -p=NEED_VS2019_INTEGRATION=0 -p=NEED_VS2022_INTEGRATION=1 --log-dir=. set installer_exit_code=%ERRORLEVEL% - rd /s/q "webimage_extracted" exit /b %installer_exit_code% - name: Set up MATLAB @@ -168,33 +165,27 @@ jobs: with: products: Simulink - - name: Build Executables + - name: Build Executabless env: MATLAB_ROOT: ${{ steps.setup-matlab.outputs.matlabroot }} run: .github/scripts/build_windows_executables.bat - name: Test version output - run: | - build/bin/openfast_x64.exe -h - build/bin/TurbSim_x64.exe -h - build/bin/FAST.Farm_x64.exe -h + run: .github/scripts/test_windows_executables.bat - name: Build MATLAB Mex File uses: matlab-actions/run-command@v2 with: command: | mexname = 'FAST_SFunc'; - mex('-largeArrayDims', ... - '-v', ... + mex('-largeArrayDims', '-v', ... ['-L' fullfile('build','bin')], ... ['-I' fullfile('modules','openfast-library','src')], ... % "FAST_Library.h" ['-I' fullfile('modules','supercontroller','src')], ... % "SuperController_Types.h" ['-I' fullfile('modules','externalinflow','src')], ... % "ExternalInflow_Types.h" ['-I' fullfile('modules','extloads','src')], ... % "ExtLoadsDX_Types.h" - ['-I' fullfile(matlabroot,'simulink','include')], ... - ['-I' fullfile(matlabroot,'extern','include')], ... ['COMPFLAGS=$COMPFLAGS -MT -DS_FUNCTION_NAME=' mexname], ... - '-lOpenFAST-Simulink_x64', ... + '-lOpenFAST-Simulink', ... '-outdir', fullfile('build','bin'), ... '-output', mexname, ... fullfile('glue-codes','simulink','src','FAST_SFunc.c')); diff --git a/.gitmodules b/.gitmodules index e051a463bd..45b400967d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "reg_tests/r-test"] path = reg_tests/r-test - url = https://github.com/OpenFAST/r-test.git \ No newline at end of file + url = https://github.com/OpenFAST/r-test.git + shallow = true diff --git a/CMakeLists.txt b/CMakeLists.txt index f0b92ff991..8d6bfa66fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,7 +41,7 @@ option(BUILD_SHARED_LIBS "Enable building shared libraries" off) option(DOUBLE_PRECISION "Treat REAL as double precision" on) option(USE_DLL_INTERFACE "Enable runtime loading of dynamic libraries" on) option(FPE_TRAP_ENABLED "Enable FPE trap in compiler options" off) -option(ORCA_DLL_LOAD "Enable OrcaFlex Library Load" on) +option(WIN_DLL_LOAD "Enable loading of Windows only DLL's (OrcaFlex, SoilDyn)" on) # This is mostly for testing purposes option(BUILD_FASTFARM "Enable building FAST.Farm" off) option(BUILD_OPENFAST_CPP_API "Enable building OpenFAST - C++ API" off) option(BUILD_OPENFAST_CPP_DRIVER "Enable building OpenFAST C++ driver using C++ CFD API" off) @@ -166,6 +166,35 @@ else() endif() endif() +#------------------------------------------------------------------------------- +# AMReX reader inclusion in FAST.Farm +#------------------------------------------------------------------------------- +# Included as an external project, cloned to `dependencies` directory + +option(AMREX_READER "Include AMReX reader in FAST.Farm" off) +if (AMREX_READER) + if (WIN32) + message(FATAL_ERROR "AMREX_READER option not available on Windows (AMReX incompatible)") + endif() + include(FetchContent) + FetchContent_Declare( + AMReX + GIT_REPOSITORY https://github.com/AMReX-Codes/amrex.git + GIT_TAG 26.02 + ) + set(AMReX_AMRLEVEL Off CACHE BOOL "" FORCE) + set(AMReX_EXPORT_DYNAMIC Off CACHE BOOL "" FORCE) + set(AMReX_LINEAR_SOLVERS Off CACHE BOOL "" FORCE) + set(AMReX_LINEAR_SOLVERS_EM Off CACHE BOOL "" FORCE) + set(AMReX_LINEAR_SOLVERS_INCLFO Off CACHE BOOL "" FORCE) + set(AMReX_MPI Off CACHE BOOL "" FORCE) + set(AMReX_PARTICLES Off CACHE BOOL "" FORCE) + set(AMReX_FORTRAN On CACHE BOOL "" FORCE) + set(AMReX_FORTRAN_INTERFACES On CACHE BOOL "" FORCE) + set(AMReX_PRECISION DOUBLE CACHE STRING "" FORCE) + FetchContent_MakeAvailable(AMReX) +endif () + #------------------------------------------------------------------------------- # Simulink #------------------------------------------------------------------------------- @@ -197,6 +226,7 @@ set(OPENFAST_MODULES aerodyn aerodisk servodyn + soildyn elastodyn beamdyn subdyn @@ -289,9 +319,7 @@ if(BUILD_TESTING) # unit tests if(BUILD_UNIT_TESTING) - if(NOT (${CMAKE_Fortran_COMPILER_ID} STREQUAL "Flang")) - add_subdirectory(unit_tests) - endif() + add_subdirectory(unit_tests) endif() endif() @@ -303,4 +331,3 @@ option(BUILD_DOCUMENTATION "Build documentation." OFF) if(BUILD_DOCUMENTATION) add_subdirectory(docs) endif() - diff --git a/cmake/OpenfastFortranOptions.cmake b/cmake/OpenfastFortranOptions.cmake index 6a1c38539b..b93e027a5c 100644 --- a/cmake/OpenfastFortranOptions.cmake +++ b/cmake/OpenfastFortranOptions.cmake @@ -139,6 +139,10 @@ macro(set_fast_gfortran) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS},--stack,${stack_size}") endif() + # Profiling + # set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -pg") + # set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") + check_f2008_features() endmacro(set_fast_gfortran) diff --git a/docs/OtherSupporting/AeroDyn/Fluid_Inertia_Added_Mass_Implementation_Plan.docx b/docs/OtherSupporting/AeroDyn/Fluid_Inertia_Added_Mass_Implementation_Plan.docx new file mode 100644 index 0000000000..61d4a373ce Binary files /dev/null and b/docs/OtherSupporting/AeroDyn/Fluid_Inertia_Added_Mass_Implementation_Plan.docx differ diff --git a/docs/OtherSupporting/AeroDyn/UMERC24-Poster.pdf b/docs/OtherSupporting/AeroDyn/UMERC24-Poster.pdf new file mode 100644 index 0000000000..2e3b42a108 Binary files /dev/null and b/docs/OtherSupporting/AeroDyn/UMERC24-Poster.pdf differ diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf deleted file mode 100644 index 12e890f937..0000000000 Binary files a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf and /dev/null differ diff --git a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex b/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex deleted file mode 100644 index c6817cef8d..0000000000 --- a/docs/OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.tex +++ /dev/null @@ -1,607 +0,0 @@ -%---------------------------------------------------------- -% - -\documentclass[10pt,letterpaper,oneside,notitlepage]{article} -%\documentclass{report}% -\usepackage{algorithm} -\usepackage{algpseudocode} -\usepackage{enumitem} -\usepackage{nomencl} -\usepackage{amsmath} -\usepackage{amssymb} -%\usepackage{amsfonts}% -%\usepackage{graphicx} -%---------------------------------------------------------- -\makenomenclature -%\theoremstyle{plain} -%\newtheorem{acknowledgement}{Acknowledgement} -%\newtheorem{definition}{Definition} -%\newtheorem{remark}{Remark} -%\numberwithin{equation}{section} -\renewcommand*{\thefootnote}{\fnsymbol{footnote}} -%----------------------------------------------------------- -\begin{document} -\title{Solve Algorithms in OpenFAST} -\author{Bonnie Jonkman} -%\begin{abstract} -%This document is used to describe the algorithms implemented in FAST v8. -%\end{abstract} -\maketitle - -%\tableofcontents - -\section{Definitions and Nomenclature} - - -\begin{table}[h] - \centering - \begin{tabular}{c|c|c} - \textbf{Module} & \textbf{Abbreviation} & \textbf{Abbreviation}\\ - \textbf{Name} & \textbf{in Module} & \textbf{in this Document}\\ - \hline - ElastoDyn & ED & ED \\ - BeamDyn & BD & BD \\ - AeroDyn & AD & AD \\ - ServoDyn & SrvD & SrvD \\ - SubDyn & SD & SD \\ - ExtPtfm & ExtPtfm & ExtPtfm \\ - HydroDyn & HydroDyn & HD \\ - MAP++ & MAPp & MAP \\ - FEAMooring & FEAM & FEAM \\ - MoorDyn & MD & MD \\ - OrcaFlexInterface & Orca & Orca \\ - InflowWind & IfW & IfW \\ - IceFloe & IceFloe & IceF \\ - IceDyn & IceD & IceD \\ - \end{tabular} - \caption{Abbreviations for modules in FAST v8} - \label{tab:Abbrev} -\end{table} - - -\nomenclature{$u\_ED$}{$ElastoDyn$ inputs} -\nomenclature{$u\_AD$}{$AeroDyn$ inputs} -\printnomenclature - -\section{Initializations} - - -\pagebreak %break here for now so that it doesn't look so strange -\section{Input-Output Relationships} -\subsection {Input-Output Solves (Option 2 Before 1)} -This algorithm documents the procedure for the Input-Output solves in FAST, assuming -all modules are in use. If an individual module is not in use during a particular -simulation, the calls to that module's subroutines are omitted and the module's -inputs and outputs are neither set nor used. - -%\begin{algorithm}[ht] -%\caption{Input-Output Solves (Option 2 Before 1)} -%\label{IOSolves21} -\begin{algorithmic}[1] -\Procedure{CalcOutputs\_And\_SolveForInputs}{\null} - -%%%% -% \start SolveOption2 -\State -% SolveOption2a_Inp2BD - \State $\mathit{y\_ED} \gets \Call{ED\_CalcOutput}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ - \State $\mathit{u\_BD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED,y\_SrvD}}$ - -\State -% SolveOption2b_Inp2IfW - \State $\mathit{y\_BD} \gets \Call{BD\_CalcOutput}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ - \State $\mathit{u\_AD}($no IfW$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED,y\_BD}}$ - \State $\mathit{u\_IfW} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED} at \mathit{u\_AD} nodes}$ - -\State -% SolveOption2c_Inp2AD_SrvD - \State $\mathit{y\_IfW} \gets \Call{IfW\_CalcOutput}{\mathit{u\_IfW} and other \mathit{IfW} data structures}$ - \State $\mathit{u\_AD}($InflowWind only$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_IfW}}$ - \State $\mathit{u\_SrvD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED},\mathit{y\_IfW},\mathit{y\_BD}}$ - -\State -% main - \State $\mathit{y\_AD} \gets \Call{AD\_CalcOutput}{\mathit{p\_AD},\mathit{u\_AD},\mathit{x\_AD},\mathit{xd\_AD},\mathit{z\_AD}}$ - \State $\mathit{y\_SrvD} \gets \Call{SrvD\_CalcOutput}{}( \! - \begin{aligned}[t] - & \mathit{p\_SrvD},\mathit{u\_SrvD}, \\ - & \mathit{x\_SrvD},\mathit{xd\_SrvD},\mathit{z\_SrvD}) \\ - \end{aligned}$ - \State $\mathit{u\_ED} \gets \Call{TransferOutputsToInputs}{\mathit{y\_AD},\mathit{y\_SrvD}}$ - \State $\mathit{u\_BD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_AD,y\_SrvD}}$ -% \end SolveOption2 -%%%% - -%%%% -% \begin Transfer_ED_to_HD_SD_BD_Mooring -\State -% \State $\mathit{u\_ED}($not platform reference point$) \gets \Call{TransferOutputsToInputs}{y\_SrvD,y\_AD}$ %\Comment{sets all but platform reference point inputs} - -% \State $\mathit{u\_BD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ % only if not BD_Solve_Option1 - \State $\mathit{u\_HD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_SD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_ExtPtfm} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_MD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_Orca} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_SrvD\%PtfmStC} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$\footnote{Only if using ServoDyn Structural control with platform TMD.} -% \end Transfer_ED_to_HD_SD_BD_Mooring -%%%% - -\State -\State \Call{SolveOption1}{\null} -\State - \State $\mathit{u\_IfW} \gets \Call{TransferOutputsToInputs}{\mathit{u\_AD},\mathit{y\_ED}}$ - \State $\mathit{u\_AD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED}}$ - \State $\mathit{u\_SrvD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED},\mathit{y\_AD},\mathit{y\_BD},\mathit{y\_SD}}$ - -\EndProcedure -\end{algorithmic} -%\end{algorithm} - -Note that inputs to \emph{ElastoDyn} before calling CalcOutput() in the first step are not set in CalcOutputs\_And\_SolveForInputs(). -Instead, the \emph{ElastoDyn} inputs are set depending on where CalcOutputs\_And\_SolveForInputs() is called: -\begin{itemize}[noitemsep] %i don't like the double spaces between bulleted items. - \item At time 0, the inputs are the initial guess from \emph{ElastoDyn}; - \item On the prediction step, the inputs are extrapolated values from the time history of ElastoDyn inputs; - \item On the first correction step, the inputs are the values calculated in the prediction step; - \item On subsequent correction steps, the inputs are the values calculated in the previous correction step. -\end{itemize} - - -%\pagebreak %break here for now so that it doesn't look so strange -\subsection {Input-Output Solve for \textit{HydroDyn}, \textit{SubDyn}, \textit{OrcaFlexInterface}, \textit{BeamDyn}, \textit{ExtPtfm}, \textit{MAP}, \textit{FEAMooring}, \textit{MoorDyn}, - \textit{FEAMooring}, \textit{IceFloe}, \textit{IceDyn}, and the Platform Reference Point Mesh in \textit{ElastoDyn}} - -This procedure implements Solve Option 1 for the accelerations and loads in -\emph{HydroDyn},\emph{SubDyn},\emph{MAP},\emph{FEAMooring},\emph{OrcaFlexInterface},\emph{MoorDyn}, \emph{BeamDyn}, \emph{ExtPtfm}, \emph{IceFloe}, \emph{IceDyn}, and \emph{ElastoDyn} (at its platform reference point mesh). -The other input-output relationships for these modules are solved using Solve Option 2. - -%\begin{algorithm}[ht] -%\caption{Input-Output Solve for $HydroDyn$, $SubDyn$, $MAP$, $FEAMooring$, and the Platform Reference Point Mesh in $ElastoDyn$} -%\label{IOSolves_PlatformRef} -\begin{algorithmic}[1] - -\Procedure{SolveOption1}{\null} - \State - \State $\mathit{y\_MAP} \gets \Call{CalcOutput}{\mathit{p\_MAP},\mathit{u\_MAP},\mathit{x\_MAP},\mathit{xd\_MAP},\mathit{z\_MAP}}$ - \State $\mathit{y\_MD} \gets \Call{CalcOutput}{\mathit{p\_MD},\mathit{u\_MD},\mathit{x\_MD},\mathit{xd\_MD},\mathit{z\_MD}}$ - \State $\mathit{y\_FEAM} \gets \Call{CalcOutput}{\mathit{p\_FEAM},\mathit{u\_FEAM},\mathit{x\_FEAM},\mathit{xd\_FEAM},\mathit{z\_FEAM}}$ - \State $\mathit{y\_IceF} \gets \Call{CalcOutput}{\mathit{p\_IceF},\mathit{u\_IceF},\mathit{x\_IceF},\mathit{xd\_IceF},\mathit{z\_IceF}}$ - \State $\mathit{y\_IceD(:)} \gets \Call{CalcOutput}{\mathit{p\_IceD(:)},\mathit{u\_IceD(:)},\mathit{x\_IceD(:)},\mathit{xd\_IceD(:)},\mathit{z\_IceD(:)}}$ - \State $\mathit{y\_SrvD} \gets \Call{CalcOutput}{\mathit{p\_SrvD},\mathit{u\_SrvD},\mathit{x\_SrvD},\mathit{xd\_SrvD},\mathit{z\_SrvD}}$\footnote{Only if using ServoDyn Structural control with platform TMD.} - \State - \State\Comment{Form $u$ vector using loads and accelerations from $\mathit{u\_HD}$, $\mathit{u\_BD}$, $\mathit{u\_SD}$, $\mathit{u\_Orca}$, $\mathit{u\_ExtPtfm}$, $\mathit{u\_SrvD}$\footnote{Only if using ServoDyn Structural control with platform TMD and SubDyn.} and platform reference input from $\mathit{u\_ED}$} - \State - \State $u \gets \Call{u\_vec}{\mathit{u\_HD},\mathit{u\_SD},\mathit{u\_ED},\mathit{u\_BD},\mathit{u\_Orca},\mathit{u\_ExtPtfm}}$ - \State $k \gets 0$ - \Loop\Comment{Solve for loads and accelerations (direct feed-through terms)} - \State $y\_ED \gets \Call{ED\_CalcOutput}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ - \State $y\_SD \gets \Call{SD\_CalcOutput}{\mathit{p\_SD},\mathit{u\_SD},\mathit{x\_SD},\mathit{xd\_SD},\mathit{z\_SD}}$ - \State $y\_HD \gets \Call{HD\_CalcOutput}{\mathit{p\_HD},\mathit{u\_HD},\mathit{x\_HD},\mathit{xd\_HD},\mathit{z\_HD}}$ - \State $y\_BD \gets \Call{BD\_CalcOutput}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ - \State $y\_Orca \gets \Call{Orca\_CalcOutput}{\mathit{p\_Orca},\mathit{u\_Orca},\mathit{x\_Orca},\mathit{xd\_Orca},\mathit{z\_Orca}}$ - \State $\mathit{y\_ExtPtfm} \gets \Call{CalcOutput}{\mathit{p\_ExtPtfm},\mathit{u\_ExtPtfm},\mathit{x\_ExtPtfm},\mathit{xd\_ExtPtfm},\mathit{z\_ExtPtfm}}$ - - \If{ $k \geq k\_max$} - \State exit loop - \EndIf - - \State$\mathit{u\_BD\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ - \State$\mathit{u\_MAP\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ - \State$\mathit{u\_FEAM\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ - \State$\mathit{u\_Orca\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ - \State$\mathit{u\_MD\_tmp} \gets \Call{TransferMeshMotions}{y\_ED}$ - \State$\mathit{u\_IceF\_tmp} \gets \Call{TransferMeshMotions}{y\_SD}$ - \State$\mathit{u\_IceD\_tmp(:)} \gets \Call{TransferMeshMotions}{y\_SD}$ - \State$\mathit{u\_HD\_tmp} \gets \Call{TransferMeshMotions}{y\_ED,y\_SD}$ - \State$\mathit{u\_SrvD\_tmp} \gets \Call{TransferMeshMotions}{y\_BD,y\_ED,y\_SD}$\footnote{Only if using ServoDyn Structural control.} - \State$\mathit{u\_SD\_tmp} \gets \! - \begin{aligned}[t] - & \Call{TransferMeshMotions}{\mathit{y\_ED}} \\ - & \cup \Call{TransferMeshLoads}{}(\! - \begin{aligned}[t] - & \mathit{y\_SD}, \\ - & \mathit{y\_HD}, \mathit{u\_HD\_tmp}, \\ - & \mathit{y\_IceF}, \mathit{u\_IceF\_tmp}, \\ - & \mathit{y\_IceD(:)}, \mathit{u\_IceD\_tmp(:)}, \\ - \end{aligned} - \end{aligned}$ - \State$\mathit{u\_ED\_tmp} \gets \Call{TransferMeshLoads}{}( \! - \begin{aligned}[t] & \mathit{y\_ED}, \\ - & \mathit{y\_HD}, \mathit{u\_HD\_tmp}, \\ - & \mathit{y\_SD}, \mathit{u\_SD\_tmp}, \\ - & \mathit{y\_MAP}, \mathit{u\_MAP\_tmp}, \\ - & \mathit{y\_FEAM},\mathit{u\_FEAM\_tmp},\\ - & \mathit{y\_AD}, \mathit{u\_AD\_tmp}\footnote{Only if AD buoyancy at of hub enabled.}, \\ - & \mathit{y\_SrvD},\mathit{u\_SrvD\_tmp}\footnote{Only if using ServoDyn Structural control.} ) % SrvD%PtfmStC only - \end{aligned}$ - - \State - \State$\mathit{U\_Residual} \gets u - \Call{u\_vec}{}( \! - \begin{aligned}[t] & \mathit{u\_HD\_tmp}, \\ - & \mathit{u\_SD\_tmp}, \\ - & \mathit{u\_ED\_tmp}, \\ - & \mathit{u\_BD\_tmp}, \\ - & \mathit{u\_Orca\_tmp},\\ - & \mathit{u\_ExtPtfm\_tmp}) - \end{aligned}$ - \State - - \If{ last Jacobian was calculated at least $\mathit{DT\_UJac}$ seconds ago } - \State Calculate $\frac{\partial U}{\partial u}$ - \EndIf - - %\textit{ - %\State Perturb each input in $u$ - %\State Call $\Call{CalcOutput}{p,u,x,xd,z}$ for each module - %\State Transfer perturbed outputs to inputs - %\State Form new $u$ - %\State Compare new $u$ with $U\_Residual$ - %\State} - - \State Solve $\frac{\partial U}{\partial u} \Delta u = - \mathit{U\_Residual}$ for $\Delta u$ - - \State - \If{$\lVert \Delta u \rVert_2 < $ tolerance } \Comment{To be implemented later} - \State exit loop - \EndIf - \State - \State $u \gets u + \Delta u$ - \State Transfer $u$ to $\mathit{u\_HD}$, $\mathit{u\_SD}$, $\mathit{u\_BD}$, $\mathit{u\_Orca}$, $\mathit{u\_ExtPtfm}$, and $\mathit{u\_ED}$\Comment{loads and accelerations only} - \State $k=k+1$ - - \EndLoop - - \State\Comment{Transfer non-acceleration fields to motion input meshes} - \State - - \State$\mathit{u\_BD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State$\mathit{u\_HD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED},\mathit{y\_SD}}$ - \State$\mathit{u\_SD}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State$\mathit{u\_Orca}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ \State$\mathit{u\_ExtPtfm}($not accelerations$) \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State - \State $\mathit{u\_MAP} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_MD} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_FEAM} \gets \Call{TransferMeshMotions}{\mathit{y\_ED}}$ - \State $\mathit{u\_IceF} \gets \Call{TransferMeshMotions}{\mathit{y\_SD}}$ - \State $\mathit{u\_IceD(:)} \gets \Call{TransferMeshMotions}{\mathit{y\_SD}}$ - \State $\mathit{u\_SrvD} \gets \Call{TransferMeshMotions}{\mathit{y\_BD,y\_ED,y\_SD}}$\footnote{Only if using ServoDyn Structural control.} % For SrvD%PtfmStC - -\EndProcedure -\end{algorithmic} - - -\subsection {Implementation of line2-to-line2 loads mapping} -The inverse-lumping of loads is computed by a block matrix solve for the distributed forces and moments, -using the following equation: - -\begin{equation} -\label{EqLump} - \begin{bmatrix} - F^{DL} \\ - M^{DL} \\ - \end{bmatrix} -= - \begin{bmatrix} - A & 0 \\ - B & A \\ - \end{bmatrix} - \begin{bmatrix} - F^{D} \\ - M^{D} \\ - \end{bmatrix} -\end{equation} - -Because the forces do not depend on the moments, we first solve for the distributed forces, $F^D$: -\begin{equation} -\label{EqLumpF} - \begin{bmatrix} F^{DL} \\ \end{bmatrix} -= - \left[ A \right] - \left[ F^{D} \right] -\end{equation} - -We then use the known values to solve for the distributed moments, $M^D$: -\begin{equation} -\label{EqLumpM1} - \left[ M^{DL} \right] -= - \begin{bmatrix} B & A \\ \end{bmatrix} - \begin{bmatrix} - F^{D} \\ - M^{D} \\ - \end{bmatrix} -= \left[ B \right] \left[ F^D \right] + \left[ A \right] \left[ M^D \right] -\end{equation} -or -\begin{equation} -\label{EqLumpM2} -\left[ M^{DL} \right] - \left[ B \right] \left[ F^D \right] = \left[ A \right] \left[ M^D \right] -\end{equation} -Rather than store the matrix $B$, we directly perform the cross products that the matrix $B$ represents. -This makes the left-hand side of Equation \ref{EqLumpM2} known, leaving us with one matrix solve. This -solve uses the same matrix $A$ used to obtain the distributed forces in Equation \ref{EqLumpF}; $A$ depends -only on element reference positions and connectivity. We use -the $LU$ factorization of matrix $A$ so that the second solve does not introduce much additional overhead. - - - -\pagebreak %break here for now so that it doesn't look so strange -\section{Solve Option 2 Improvements} -\subsection {Input-Output Solves inside AdvanceStates} -This algorithm documents the procedure for advancing states with option 2 -Input-Output solves in FAST, assuming -all modules are in use. If an individual module is not in use during a particular -simulation, the calls to that module's subroutines are omitted and the module's -inputs and outputs are neither set nor used. - -\begin{algorithmic}[1] -\Procedure{FAST\_AdvanceStates}{\null} -\State $\Call{ED\_UpdateStates}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ -\State $\mathit{y\_ED} \gets \Call{ED\_CalcOutput}{\mathit{p\_ED},\mathit{u\_ED},\mathit{x\_ED},\mathit{xd\_ED},\mathit{z\_ED}}$ -\State -\State $\mathit{u\_BD}($hub and root motions$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED}}$ -\State $\Call{BD\_UpdateStates}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ -\State $\mathit{y\_BD} \gets \Call{BD\_CalcOutput}{\mathit{p\_BD},\mathit{u\_BD},\mathit{x\_BD},\mathit{xd\_BD},\mathit{z\_BD}}$ -\State -\State $\mathit{u\_AD}($not InflowWind$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED},\mathit{y\_BD}}$ -\State $\mathit{u\_IfW} \gets \Call{TransferOutputsToInputs}{\mathit{y\_ED},\mathit{y\_BD}$ at $\mathit{u\_AD}$ nodes$}$ -\State $\Call{IfW\_UpdateStates}{\mathit{p\_IfW},\mathit{u\_IfW},\mathit{x\_IfW},\mathit{xd\_IfW},\mathit{z\_IfW}}$ -\State $\mathit{y\_IfW} \gets \Call{IfW\_CalcOutput}{\mathit{u\_IfW}$ and other $\mathit{IfW}$ data structures$}$ -\State -\State $\mathit{u\_AD}($InflowWind only$) \gets \Call{TransferOutputsToInputs}{\mathit{y\_IfW}}$ -\State $\mathit{u\_SrvD} \gets \Call{TransferOutputsToInputs}{\mathit{y\_BD},\mathit{y\_ED},\mathit{y\_IfW},\mathit{y\_SD}}$ -\State $\Call{AD\_UpdateStates}{\mathit{p\_AD},\mathit{u\_AD},\mathit{x\_AD},\mathit{xd\_AD},\mathit{z\_AD}}$ -\State $\Call{SrvD\_UpdateStates}{\mathit{p\_SrvD},\mathit{u\_SrvD},\mathit{x\_SrvD},\mathit{xd\_SrvD},\mathit{z\_SrvD}}$ -\State -\State All other modules (used in Solve Option 1) advance their states -\EndProcedure -\end{algorithmic} - -Note that AeroDyn and ServoDyn outputs get calculated inside the ${CalcOutputs\_And\_SolveForInputs}$ routine. ElastoDyn, BeamDyn, and -InflowWind outputs do not get recalculated in ${CalcOutputs\_And\_SolveForInputs}$ except for the first time the routine is called -(because CalcOutput is called before UpdateStates at time 0). - - -\section {Linearization} -\subsection{Loads Transfer} -The loads transfer can be broken down into four components, all of which are used in the Line2-to-Line2 loads transfer: -\begin{enumerate} - \item Augment the source mesh with additional nodes. - \item Lump the distributed loads on the augmented Line2 source mesh to a Point mesh. - \item Perform Point-to-Point loads transfer. - \item Distribute (or "unlump") the point loads. -\end{enumerate} -The other loads transfers are just subsets of the Line2-to-Line2 transfer: -\begin{itemize} - \item Line2-to-Line2: Perform steps 1, 2, 3, and 4. - \item Line2-to-Point: Perform steps 1, 2, and 3. - \item Point-to-Line2: Perform steps 3 and 4. - \item Point-to-Point: Perform step 3. -\end{itemize} - - -Each of the four steps can be represented with a linear equation. The linearization of the loads transfers is just multiplying the -appropriate matrices generated in each of the steps. - - -\subsubsection{Step 1: Augment the source mesh} -The equation that linearizes mesh augmentation is -\begin{equation} -\label{Augment} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{SA} \\ \vec{f}^{SA} \\ \vec{m}^{SA} \end{matrix} \right\} -= - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 & 0 \\ - 0 & M^A & 0 & 0 \\ - 0 & 0 & M^A & 0 \\ - 0 & 0 & 0 & M^A \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^S \\ \vec{f}^S \\ \vec{m}^S \end{matrix} \right\} -\end{equation} -where $M^A \in \mathbb{R}^{ \mathit{N_{SA}},\mathit{N_{S}}}$ indicates the mapping of nodes from the source mesh (with $N_S$ nodes) to the augmented source mesh -(with $N_{SA}$ nodes). The destination mesh (with $N_D$ nodes) is unchanged, as is indicated by matrix $I_{\mathit{N_D}}$. - - - -\subsubsection{Step 2: Lump loads on a Line2 mesh to a Point mesh} -The equation that linearizes the lumping of loads is -\begin{equation} -\label{Lump} - \left\{ \begin{matrix} \vec{u}^{SA} \\ \vec{F}^{SAL} \\ \vec{M}^{SAL} \end{matrix} \right\} -= - \begin{bmatrix} - I_{\mathit{N_{SA}}} & 0 \ & 0 \\ - 0 & M_{li}^{SL} & 0 \\ - M_{uS}^{SL} & M_{f}^{SL} & M_{li}^{SL} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^{SA} \\ \vec{f}^{SA} \\ \vec{m}^{SA} \end{matrix} \right\} -\end{equation} -where $M_{li}^{SL}, M_{uS}^{SL}, M_{f}^{SL} \in \mathbb{R}^{ \mathit{N_{SA}},\mathit{N_{SA}}}$ are block matrices that indicate the mapping of the lumped values to distributed values. $M_{li}^{SL}$ is matrix $A$ in Equation \ref{EqLumpF}, which depends only on element reference positions and connectivity. Matrices $M_{uS}^{SL}$and $M_{f}^{SL}$ also depend on values at their operating point. - - -\subsubsection{Step 3: Perform Point-to-Point loads transfer} -The equation that performs Point-to-Point load transfer can be written as -\begin{equation} -\label{P2P} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} -= - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 & 0 \\ - 0 & I_{\mathit{N_{S}}} & 0 & 0 \\ - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{S} \\ \vec{D}^{S} \end{matrix} \right\} -\end{equation} -where $M_{li}^{D}, M_{uS}^{D}, M_{f}^{D} \in \mathbb{R}^{ \mathit{N_{D}},\mathit{N_{S}}}$ are block matrices that indicate the transfer of loads from one source -node to a node on the destination mesh. $M_{uD}^{D} \in \mathbb{R}^{ \mathit{N_{D}},\mathit{N_{D}}}$ is a diagonal matrix that indicates how the destination mesh's displaced position effects the transfer. - - -\subsubsection{Step 4: Distribute Point loads to a Line2 mesh} -Distributing loads from a Point mesh to a Line2 mesh is the inverse of step 2. - -From Equation \ref{Lump} the equation that linearizes the lumping of loads on a destination mesh is -\begin{equation} -\label{LumpD} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} -= - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 \\ - 0 & M_{li}^{DL} & 0 \\ - M_{uD}^{DL} & M_{f}^{DL} & M_{li}^{DL} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} -\end{equation} -where $M_{li}^{DL}, M_{uD}^{DL}, M_{f}^{DL} \in \mathbb{R}^{ \mathit{N_{D}},\mathit{N_{D}}}$ are block matrices that indicate the mapping of the lumped values to distributed values. It follows that the inverse of this equation is -\begin{equation} -\label{InvLumpD} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} -= - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 \\ - 0 & \left[ M_{li}^{DL} \right]^{-1} & 0 \\ - -\left[ M_{li}^{DL} \right]^{-1} M_{uD}^{DL} & - -\left[ M_{li}^{DL} \right]^{-1} M_{f}^{DL} \left[ M_{li}^{DL} \right]^{-1} & - \left[ M_{li}^{DL} \right]^{-1} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} -\end{equation} -The only inverse we need is already formed (stored as an LU decomposition) from the loads transfer, so we need not form it again. - - -\subsubsection{Putting it together} -To form the matrices for loads transfers for the various mappings available, we now need to multiply a few matrices to return the linearization -matrix that converts loads from the source mesh to loads on the line mesh: -\begin{equation} -\label{LinearEqn} - \left\{ \begin{matrix} \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} -= - \begin{bmatrix} - 0 & 0 & M_{li} & 0 \\ - M_{uD} & M_{uS} & M_f & M_{li} - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^S \\ \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} -\end{equation} - - - - -\begin{itemize} - \item Line2-to-Line2: Perform steps 1, 2, 3, and 4. - \begin{multline} - \left\{ \begin{matrix} \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} - = - \begin{bmatrix} - 0 & \left[ M_{li}^{DL} \right]^{-1} & 0 \\ - -\left[ M_{li}^{DL} \right]^{-1} M_{uD}^{DL} & - -\left[ M_{li}^{DL} \right]^{-1} M_{f}^{DL} \left[ M_{li}^{DL} \right]^{-1} & - \left[ M_{li}^{DL} \right]^{-1} \\ - \end{bmatrix} - \\ - \begin{bmatrix} - I_{N_D} & 0 & 0 & 0 \\ - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \begin{bmatrix} - I_{N_D} & 0 & 0 & 0 \\ - 0 & I_{\mathit{N_{SA}}} & 0 & 0 \\ - 0 & 0 & M_{li}^{SL} & 0 \\ - 0 & M_{uS}^{SL} & M_{f}^{SL} & M_{li}^{SL} \\ - \end{bmatrix} - \\ - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 & 0 \\ - 0 & M^A & 0 & 0 \\ - 0 & 0 & M^A & 0 \\ - 0 & 0 & 0 & M^A \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{f}^{S} \\ \vec{m}^{S} \end{matrix} \right\} - \end{multline} - \begin{align} - M_{li} &= \left(M_{li}^{DL}\right)^{-1}M_{li}^D M_{li}^{SL} M_A \\ - M_{uD} &= \left(M_{li}^{DL}\right)^{-1}\left[M_{uD}^D - M_{uD}^{DL}\right] \\ - M_{uS} &= \left(M_{li}^{DL}\right)^{-1} \left[ M_{uS}^D + M_{li}^D M_{uS}^{SL}\right] M_A \\ - M_{f} &= \left(M_{li}^{DL}\right)^{-1}\left( \left[M_{f}^D - M_{f}^{DL}\left(M_{li}^{DL}\right)^{-1}M_{li}^D\right] M_{li}^{SL} + - M_{li}^D M_{f}^{SL} \right)M_A \end{align} - - - \item Line2-to-Point: Perform steps 1, 2, and 3. - \begin{multline} - \left\{ \begin{matrix} \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} - = - \begin{bmatrix} - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \begin{bmatrix} - I_{N_D} & 0 & 0 & 0 \\ - 0 & I_{\mathit{N_{SA}}} & 0 & 0 \\ - 0 & 0 & M_{li}^{SL} & 0 \\ - 0 & M_{uS}^{SL} & M_{f}^{SL} & M_{li}^{SL} \\ - \end{bmatrix} - \\ - \begin{bmatrix} - I_{\mathit{N_D}} & 0 & 0 & 0 \\ - 0 & M^A & 0 & 0 \\ - 0 & 0 & M^A & 0 \\ - 0 & 0 & 0 & M^A \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{f}^{S} \\ \vec{m}^{S} \end{matrix} \right\} - \end{multline} - The linearization routine returns these four matrices: - \begin{align} - M_{li} &= M_{li}^D M_{li}^{SL} M_{A} \\ - M_{uD} &= M_{uD}^D \\ - M_{uS} &= \left[ M_{uS}^D + M_{li}^{D} M_{uS}^{SL}\right]M_{A} \\ - M_{f} &= \left[ M_{f}^D M_{li}^{SL} + M_{li}^{D} M_{f}^{SL} \right]M_{A} \end{align} - - - \item Point-to-Line2: Perform steps 3 and 4. - %\begin{equation} - \begin{multline} - \left\{ \begin{matrix} \vec{f}^{D} \\ \vec{m}^{D} \end{matrix} \right\} - = - \begin{bmatrix} - 0 & \left[ M_{li}^{DL} \right]^{-1} & 0 \\ - -\left[ M_{li}^{DL} \right]^{-1} M_{uD}^{DL} & - -\left[ M_{li}^{DL} \right]^{-1} M_{f}^{DL} \left[ M_{li}^{DL} \right]^{-1} & - \left[ M_{li}^{DL} \right]^{-1} \\ - \end{bmatrix} \\ - \begin{bmatrix} - I_{N_D} & 0 & 0 & 0 \\ - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{S} \\ \vec{M}^{S} \end{matrix} \right\} - \end{multline} - %\end{equation} - The linearization routine returns these four matrices: - \begin{align} M_{li} &= \left(M_{li}^{DL}\right)^{-1}M_{li}^D \\ - M_{uD} &= \left(M_{li}^{DL}\right)^{-1}\left[M_{uD}^D - M_{uD}^{DL}\right] \\ - M_{uS} &= \left(M_{li}^{DL}\right)^{-1}M_{uS}^D \\ - M_{f} &= \left(M_{li}^{DL}\right)^{-1}\left[M_{f}^D - M_{f}^{DL} M_{li} \right] \end{align} - - - \item Point-to-Point: Perform step 3. - \begin{equation} - \left\{ \begin{matrix} \vec{F}^{D} \\ \vec{M}^{D} \end{matrix} \right\} - = - \begin{bmatrix} - 0 & 0 & M_{li}^{D} & 0 \\ - M_{uD}^{D} & M_{uS}^{D} & M_{f}^{D} & M_{li}^{D} \\ - \end{bmatrix} - \left\{ \begin{matrix} \vec{u}^D \\ \vec{u}^{S} \\ \vec{F}^{S} \\ \vec{M}^{S} \end{matrix} \right\} - \end{equation} - The linearization routine returns these four matrices: - \begin{align} M_{li} &= M_{li}^D \\ - M_{uD} &= M_{uD}^D \\ - M_{uS} &= M_{uS}^D \\ - M_{f} &= M_{f}^D \end{align} - -\end{itemize} - -\end{document} diff --git a/docs/OtherSupporting/OpenFAST_Prescribing_Loads_at_Tower_Top.pdf b/docs/OtherSupporting/OpenFAST_Prescribing_Loads_at_Tower_Top.pdf new file mode 100644 index 0000000000..becf0dbad5 Binary files /dev/null and b/docs/OtherSupporting/OpenFAST_Prescribing_Loads_at_Tower_Top.pdf differ diff --git a/docs/OtherSupporting/OpenFAST_Using_a_Stiffness_Matrix_as_Boundary_Condition_in_SubDyn.pdf b/docs/OtherSupporting/OpenFAST_Using_a_Stiffness_Matrix_as_Boundary_Condition_in_SubDyn.pdf new file mode 100644 index 0000000000..f697381055 Binary files /dev/null and b/docs/OtherSupporting/OpenFAST_Using_a_Stiffness_Matrix_as_Boundary_Condition_in_SubDyn.pdf differ diff --git a/docs/OtherSupporting/OutListParameters.xlsx b/docs/OtherSupporting/OutListParameters.xlsx index 784d6e06b8..ded018604c 100644 Binary files a/docs/OtherSupporting/OutListParameters.xlsx and b/docs/OtherSupporting/OutListParameters.xlsx differ diff --git a/docs/OtherSupporting/SeaState/Improved Wave-Current Modeling.pdf b/docs/OtherSupporting/SeaState/Improved Wave-Current Modeling.pdf new file mode 100644 index 0000000000..eaa7178525 Binary files /dev/null and b/docs/OtherSupporting/SeaState/Improved Wave-Current Modeling.pdf differ diff --git a/docs/OtherSupporting/SoilDyn/Compiling OpenFAST with REDWIN_V3.docx b/docs/OtherSupporting/SoilDyn/Compiling OpenFAST with REDWIN_V3.docx new file mode 100644 index 0000000000..7b282ced51 Binary files /dev/null and b/docs/OtherSupporting/SoilDyn/Compiling OpenFAST with REDWIN_V3.docx differ diff --git a/docs/OtherSupporting/SoilDyn/OpenFAST_Prescribing_Loads_at_Tower_Top.pdf b/docs/OtherSupporting/SoilDyn/OpenFAST_Prescribing_Loads_at_Tower_Top.pdf new file mode 100644 index 0000000000..becf0dbad5 Binary files /dev/null and b/docs/OtherSupporting/SoilDyn/OpenFAST_Prescribing_Loads_at_Tower_Top.pdf differ diff --git a/docs/OtherSupporting/SoilDyn/README.txt b/docs/OtherSupporting/SoilDyn/README.txt new file mode 100644 index 0000000000..4c7d11b07b --- /dev/null +++ b/docs/OtherSupporting/SoilDyn/README.txt @@ -0,0 +1,2 @@ +2026.03.12 +The files included here were generated part way through the development of the SoilDyn module to couple the RedWin DLL from NGI. They are neither complete or fully accurate with the final implementation, but may serve as a starting point for modifying the code or using the RedWin module. diff --git a/docs/OtherSupporting/SoilDyn/REDWIN_coupling.pptx b/docs/OtherSupporting/SoilDyn/REDWIN_coupling.pptx new file mode 100644 index 0000000000..ae9d56f4ef Binary files /dev/null and b/docs/OtherSupporting/SoilDyn/REDWIN_coupling.pptx differ diff --git a/docs/OtherSupporting/SoilDyn/SoilDyn--update_20200430.pptx b/docs/OtherSupporting/SoilDyn/SoilDyn--update_20200430.pptx new file mode 100644 index 0000000000..3e1afb8af1 Binary files /dev/null and b/docs/OtherSupporting/SoilDyn/SoilDyn--update_20200430.pptx differ diff --git a/docs/OtherSupporting/SoilDyn/Wind Energy - 2021 - Bergua - OC6 Phase II Integration and verification of a new soil structure interaction model for.pdf b/docs/OtherSupporting/SoilDyn/Wind Energy - 2021 - Bergua - OC6 Phase II Integration and verification of a new soil structure interaction model for.pdf new file mode 100644 index 0000000000..05dc93638f Binary files /dev/null and b/docs/OtherSupporting/SoilDyn/Wind Energy - 2021 - Bergua - OC6 Phase II Integration and verification of a new soil structure interaction model for.pdf differ diff --git a/docs/OtherSupporting/TightCoupling_Rev4.doc b/docs/OtherSupporting/TightCoupling_Rev4.doc new file mode 100644 index 0000000000..13b042104c Binary files /dev/null and b/docs/OtherSupporting/TightCoupling_Rev4.doc differ diff --git a/docs/changelogs/v5.0.0.md b/docs/changelogs/v5.0.0.md new file mode 100644 index 0000000000..09648f7010 --- /dev/null +++ b/docs/changelogs/v5.0.0.md @@ -0,0 +1,362 @@ +**Feature or improvement description** +Pull request to merge `dev` into `main` for release version 5.0.0 + +See the milestone and project pages for additional information + + https://github.com/OpenFAST/openfast/milestone/6 + +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 (`openfast_io` package) +- [ ] Update version info in glue-codes/python/pyproject.toml (`pyOpenFAST` package for testing) +- [ ] 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)` + - [ ] `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` + - [ ] `SeaState_c_binding_x64.dll` + - [ ] `SimpleElastoDyn_x64.exe` + - [ ] `SubDyn_x64.exe` + - [ ] `Turbsim_x64.exe` + - [ ] `UnsteadyAero_x64.exe` + + + +# Release Overview +------ +_OpenFAST_ 5.0 delivers a major update to the glue code and introduces an implicit tight‑coupling solver for improved speed and stability. The revised glue code streamlines development by automating module interactions and supporting multiple solve methods, including the legacy loose‑coupling algorithm and a generalized‑alpha based tight‑coupling approach that solves structural modules together. With additional enhancements to the _SubDyn_, _HydroDyn_, and _ExtPtfm_ modules, _OpenFAST_ now supports modeling multiple rotors attached to a single support structure. Additional new features include hydroelastic super-elements, blade-pitch actuator dynamics, and a new _SoilDyn_ module for soil-structure interaction. For MHK turbines, new features include wave-current coupling, added mass effects, and fluid-inertia loads. + +_FAST.Farm_ adds substantial performance improvements: a k‑d tree algorithm to accelerate wake interaction calculations; dynamic wake‑plane management improving propagation and visualization; dynamic partitioning of the low-resolution domain to neglect partitions without wakes; and wind file reader improvements including a significantly faster VTK inflow reader and a native AMReX wind file reader. These improvements lead to substantially reduced compuational time for very large wind farms. + +### Contribution Acknowledgements +Thanks to @deslaughter, @jjonkman, @bjonkman, @luwang00, @RBergua, and @MattEHall for numerous code reviews and suggestions and testing. + +Many thanks to @jjonkman and others for theory development and guidance to developers. + +Special thanks to @deslaughter for developing the new glue code framework during his ~4 year tenure at NREL/NLR. You will be greatly missed by all who had the privelage of working with you during this time. + +### Statistics (since 4.0.0) +* Total PR's unique to 5.0.0: 59 +* Total unique commits: 1276 +* Total individual code contributors: 9 +* OpenFAST code/docs: 505 files changed, 137,399 insertions(+), 107,358 deletions(-) +* regression tests: 1214 files changed, 970336 insertions(+), 74612 deletions(-) + + + +# Changelog +------ + +## General + +### Build systems +There were several updates to the `CMake` and Visual Studio build systems to support code revisions and improve support for compilers such as Flang. + +#### CMake +Minor updates to the _CMake_ were included in various pull requests, but no major changes to the system setup itself. + + + +#### Visual Studio (Windows) +The VS build system was completely overhauled to split modules out as separate projects. + +#2814 Update VS Build dependencies for SeaState Changes (@deslaughter) + +#2964 Update VS solution/project files (@deslaughter) + +#3169 Update Visual Studio projects in dev-tc (@deslaughter) + +#3258 Remove `amrex_utils.cpp` from AWAE-C.vcxproj (@deslaughter) + + + +### Documentation +There were multiple improvements to documentation, notably with the new tight coupling algorithm, _ElastoDyn_, and _InflowWind_. + +#2929 Update SubDyn user documentation for the new multirotor capabilities (@luwang00) + +#3043 Documentation of WHOC and ROSCO for super controller in FAST.Farm (@abhineet-gupta) + +#3132 Update ED user manual with information on the new blade pitch DoF (@luwang00) + +#3168 Docs: Fix typos in OutListParameters.xlsx (@RBergua) + +#3225 Add User-defined wind documentation for InflowWind (@deslaughter) + +#3244 Tight-coupling code documentation (@deslaughter) + +#3255 Docs: add link to CSF tool and change NREL --> NLR in docs. (@andrew-platt) + + + +## Solvers + +### FAST.Farm +> Input file changes + +FAST.Farm delivers a significant performance upgrade with dynamic partitioning of the low resolution domain, compuationally efficient wake interaction with a k‑d tree approach across turbine and farm grids, and dynamic wake‑plane management ensuring wake planes propagate for an expected distance with a buffer region so the wakes do not end abruptly causing adverse loading of downstream turbines. The reading of wind data is also greatly improved with a new C++ VTK reader that cuts OpenMP overhead by 60–80%, and a native AMReX file reader to directly use AMReX-format wind precursors thereby simplifying AMR-Wind based workflows. Overall these modifications greatly improve the scalability and speed of calculation for large wind farm calculations. + + + +### OpenFAST +> _Major_ input file changes + +OpenFAST 5.0 introduces a significantly revised glue code and solver which aims to streamline the development experience by automating and managing the module interactions and using a generalized-alpha based solver for structural modules. Each module now defines which input, output, and state variables are visible to the glue-code, along with their attributes and locations in the data structures, and the glue code decides what data to use for the time-domain solve and linearization. Users can define mesh mapping between modules in one location and the glue-code handles all the connections and transfers automatically. Even adding new modules is relatively straightforward and the user will generally receive error messages instead of segmentation faults when issues arise. The goal is to improve the developer experience through automation and the user experience through faster and more stable solutions. A journal paper will be published soon that explains the algorithmic details and the impact on OpenFAST's solution and performance. + +With this restructuring, the glue-code now supports multiple solve methods including the loose-coupling algorithm used in earlier version of OpenFAST, as well as an implicit tight-coupling solve where all structural modules are solved together. With these changes and with changes to the _SubDyn_ module, modeling of multiple rotors attached to a single structure is now possible. + +Additional improvements to _ExtPtfm_ and _HydroDyn_ now support hydroelastic super-elements and linearization with platforms defined in the _ExtPtfm_ module. Other improvements include + +#2439 Tight-Coupling Algorithm for OpenFAST 5.0 (@deslaughter) + +#2817 Incorrect mesh mapping between BeamDyn and ServoDyn for Blade Structural Controller (@deslaughter) + +#2838 Multi-Rotor input file and glue-code changes (@deslaughter) + +#2965 Missing BD Blade VTK Output in dev-tc (@deslaughter) + +#2990 Updates to dev-tc: linearization visualization, bug fixes, sync with dev branch (@deslaughter) + +#3115 Updated SD NPropSets to NPropSetsCyl and NPropSetsRec and fixed typos in the HD input file (@deslaughter) + +#3125 Performance improvements in dev-tc (@deslaughter) + +#3213 Include ServoDyn in Option 1 solve if structural controllers are enabled (@deslaughter) + +#3261 Reduce module variables included in Option 1 solve with ServoDyn (@deslaughter) + + + +## Modules + +### Multiple modules + +#3252 Remove unused registry entries (leftover from old lin method) (@andrew-platt) + + +### AeroDyn +> Driver input file changes +> Input file changes +> Blade input file changes + +#2861 Add MHK loads to OLAF blade loads (@hkross) + +#2945 [OLAF] Implementation of a source panel method (@ebranlard) + +#3239 Fixed SeaState initialization in AeroDyn driver (@luwang00) + +#3240 UA: adding quasi steady outputs to UA driver outputs (@ebranlard) + + + +### AWAE +As part of the overhaul of wind data handling in _FAST.Farm_, the _AWAE_ module received a major overhaul with the inclusion of a k-d tree algorithm for wake interaction and wind domain calculations. + +#3066 Use k-d tree to speed up wake application to high-res grid in AWAE (@deslaughter) + +#3071 Various changes to the handling of wake planes (@luwang00) + +#3074 Use C++ to read VTK inflow in AWAE (@deslaughter) + +#3112 Move FAST.Farm K-d tree logic into `AWAE_UpdateStates` (@deslaughter) + +#3238 Add AMReX-based inflow reader to AWAE for FAST.Farm (@deslaughter) + + + +### BeamDyn +> Blade input file changes + +_BeamDyn_ now includes a modal damping option in the blade file. + +#3105 Remove blade pitch actuator from BeamDyn and blade PitchAxis from ElastoDyn (@luwang00) + +#3147 Modal damping (@JustinPorter88) + + +### ElastoDyn +> Input file changes +> Blade input file changes + +_ElastoDyn_ updates include tower offset and a new blade pitch actuator model. + +#2830 Add PtfmRefxt and PtfmRefyt in ElastoDyn to allow the tower to be offset from (0,0) (@luwang00) + +#3039 Blade pitch dynamics and actuation (@luwang) [also changed ServoDyn] + +#3114 ED blade input check, bug fix, and docs update (@luwang00) + +#3253 ED: update blade file parser to allow arbitrary column locations (@andrew-platt) + + + + +### ExtPtfm +> Input file changes + +_ExtPtfm_ has been overhauled to handle large rigid-body motion, define structural connection points for mooring coupling, and accept prescribed force time series at those points (forces only; no moments), with redesigned input files. + +#3210 Hydroelastic super-element capability for OpenFAST (@luwang00) + + +### HydroDyn +> Input file changes + +_HydroDyn_ now supports potential-flow bodies with extra generalized DOFs beyond 6 rigid-body modes for integration with improvements to _ExtPtfm_. + +#3219 Added flexibility for strip-theory hydrostatic load calculation (@luwang00) + + + + +### MoorDyn + +#2972 Add in missing passing of SS pointer to MD during FAST init (@RyanDavies19) + + +### NWTC-Library +Many _NWTC-Library_ modifications were made as part of the development of tight coupling (included in those PRs). + +#3233 NWTC Library: Adjust subroutines for converting between DCM and small angles (@bjonkman) + + +### Registry +_Registry_ modifications were made as part of the development of tight coupling (included in those PRs). + + + + +### SeaState +> Input file changes + +_SeaState_ module updates include wave-current coupling, turbulent currents modeled through _InflowWind_ (MHK only), and a few other small improvements. + +#2213 MHK wave-current superposition, added mass, inertia (@hkross) + +#2906 SeaState: Allow WaveStMod=1 with WaveMod=0 (@luwang00) + +#2978 Improved wave-current modeling in SeaState (@luwang00) + +#3202 SeaState: Small change in WavePkShp logic (@RBergua) + +#3231 SeaState: Small change in WaveTp logic (@RBergua) + + +### ServoDyn +> Input file changes + +_ServoDyn_ updates include a new 3 DOF TMD option, and minor improvements. + +#2960 Add connection from ElastoDyn platform motion mesh to ServoDyn (@dzalkind) + +#2970 Allow up to MaxStC outputs (@mayankchetan) + +#3221 Enhancements to the structural control submodule of ServoDyn (@luwang00) + + + +### SoilDyn +> New input file + +The _SoilDyn_ module primarily exists as a way to use the RedWin DLL from NGI for modeling soil interaction. This module also offers the option of a 6x6 stiffness and damping matrix connection to model soil interaction - however this capability is also available through _SubDyn_ and may be more stable when used there. + +#3126 Add SoilDyn to dev-tc (@deslaughter, @andrew-platt) + + +### SubDyn +> Input file changes + +_SubDyn_ now supports multiple transition pieces to enable multirotor wind and MHK turbine simulations. It also has the ability to solve the 6-DoF rigid-body motion of the floater internally with a user-selected reference joint. The latter is required for multirotor models but is optional for single-rotor models. However, when including the tower in _SubDyn_ instead of _ElastoDyn_, enabling the _SubDyn_ internal rigid-body solution can improve accuracy and stability even for single-rotor systems by allowing the user to select a rigid-body reference point near the floater center instead of at the tower-top interface joint. This minimizes the elastic deflection at the floater due to tower flexibility, thus improving the hydrodynamic and hydrostatic load calculations. +With the added support for multiple transition pieces, _SubDyn_ output channels have been expanded to cover the loads and motion at up to nine transition pieces with backward-compatible channel name defaults if only one transition piece is used. Note that the actual number of transition pieces in the simulation is not limited. + +A previous bug in _SubDyn_ causing incomplete external load calculations for interface DOFs when the interface joint is part of a rigid assembly is now fixed by including loads on all nodes in the assembly. The inputs NPropSets have been changed to NPropSetsCyl and NPropSetsRec to remove non-unique fields and align with _HydroDyn_. Lastly, rectangular members can now be visualized using the viz3Danim tool. + +#2782 SubDyn upgrade to support multiple transition pieces (@luwang00) + +#2905 SD: Fix a bug where interface DoF loads are incomplete if the interface joint is part of a rigid assembly (@RBergua) + +#3117 Updated SD NPropSets to NPropSetsCyl and NPropSetsRec and fixed typos in the HD input file (@luwang00) + +#3195 SubDyn: add rectangular beam properties to JSON output (@RBergua) + +#3205 Don't write to SubDyn output file if no outputs requested. (@deslaughter) + + +## Testing and input file processing +There were several updates and improvements to the testing system and GitHub actions. + +### openfast\_io +There were numerous incremental improvements to the `openfast_io` embeded in other PRs. + +### GitHub actions +There were numerous incremental improvements to the GH actions embeded in other PRs. + +### Regression and Unit testing + +#3041 Add RM1 MHK Multi-Rotor examples to regression test suite (@deslaughter) + +#3079 Add missing files for `5MW_MRSemi_DLL_WSt_WavesIrr` regression test (@deslaughter) + +#3113 Add IceDyn and IceFloe Regression Tests (@deslaughter) + +#3173 Add aerodyn driver test for MHK turbine with IfW based inflow (@deslaughter) + +#3215 Add a new r-test with blade pitch dynamics enabled (@luwang00) + + +## Input file changes +This release brings a large number of input file changes and rearrangements with multiple new modules. A partial list of changes can be found here: https://openfast.readthedocs.io/en/main/source/user/api_change.html. However, we recommend that if you start by comparing to the complete set of input files found in the regression tests: https://github.com/OpenFAST/r-test/tree/v5.0.0 (example input files from the regression testing) + + +## Known issues +There are several issues that have not been addressed in this release due to time constraints, but will be addressed in future releases. These include: + +- No visualization of rectangular members from _HydroDyn_ or _SubDyn_ through the VTK output options +- Missing and broken features from several c-binding library interfaces: + - the _AeroDyn\_Inflow\_c-binding_ library interface does not allow for coupling to the tower. This will require an interface update. + - the _HydroDyn\_c-binding_ library interface does not currently support vizualization. This will require an interface update. + - the `InitNodePositions` input to _HydroDyn\_c-binding_ library interface does not currently work with any non-zero `x` or `y` coordinates (non-zero `z` is ok) + - the _MoorDyn\_c-binding_ library interface does not currently support vizualization. This will require an interface update. +- Documentation on the new _pyOpenFAST_ module is incomplete. Partial documentation exists on how to use it in regression testing, but no documentation or examples exist on using it to call c-bindings modules from Python. +- Documentation is incomplete for _HydroDyn_, _SubDyn_, and a few other modules. + +## Unknown issues +There are likely a few bugs in the code. If you find one, please report it along with a full description so that we can reproduce and fix it, or post a solution we can implement. + + +# Precompiled Windows Binaries +The binary files in this release were built with the Visual Studio solution files distributed with OpenFAST (not using cmake), using + +- Intel Fortran Essentials 2025.3.0.333 +- Microsoft Visual Studio 2022 Version 17.14.23. +- MATLAB 2025.2.999 (R2025b) +- Executables with `_OpenMP` or `_OMP` in the name are built with OpenMP libraries and linked with dynamic libraries. + - You will need [this Intel Fortran redistributable package](https://registrationcenter-download.intel.com/akdlm/IRC_NAS/0dc56e76-d2c0-4bb8-9c83-c2ee3952b855/w_ifx_runtime_p_2025.2.1.1001.exe) installed to use these executables if you do not already have Intel Fortran OneAPI 2024 installed. See the installation instructions [here](https://software.intel.com/content/www/us/en/develop/articles/redistributable-libraries-for-intel-c-and-fortran-2022-compilers-for-windows.html). + +**The other OpenFAST executables DO NOT require these redistributable libraries to be installed. Instead, they were built with static libraries.** diff --git a/docs/conf.py b/docs/conf.py index 41518da7f5..e3ece79960 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -137,9 +137,9 @@ def runDoxygen(sourcfile, doxyfileIn, doxyfileOut): # built documents. # # The short X.Y version. -version = f'4.2' +version = f'5.0' # The full version, including alpha/beta/rc tags. -release = f'v4.2.1' +release = f'v5.0.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/source/acknowledgements.rst b/docs/source/acknowledgements.rst index dedd7a58bc..c4743ec2c8 100644 --- a/docs/source/acknowledgements.rst +++ b/docs/source/acknowledgements.rst @@ -4,15 +4,44 @@ Acknowledgements ================ This software is developed and maintained by researchers at the -`National Renewable Energy Laboratory `_ with funding +`National Laboratory of the Rockies `_ with funding from U.S. Department of Energy Wind Energy Technology Office through the `Atmosphere to electrons (A2e) `_ research initiative. -NREL gratefully acknowledges development contributions from the following +NLR gratefully acknowledges development contributions from the following organizations: -- Envision Energy USA, Ltd +- Accelerate Wind +- AirLoom Energy +- ARPA-E - Brigham Young University +- CENER +- Delft University of Technology +- DOE Water Power Technologies Office (WPTO) +- Equinor +- Envision Energy USA, Ltd +- Institute for Energy Technology +- GoogleX +- Hayman Consulting +- Norwegian University of Science and Technology +- NOWRDC +- Octue +- Orcina +- Oregon State University +- Principle Power +- RRD Engineering +- Sandia National Laboratory +- SENER +- Shell +- SOWENTO +- Technical University of Denmark +- TODA Corporation +- TotalEnergies +- University of Strathclyde +- University of Stuttgart +- University of Texas-Austin +- Vestas +- Windward Engineering -NREL gratefully acknowledges additional development support through designation +NLR gratefully acknowledges additional development support through designation as an `Intel® Parallel Computing Center (IPCC) `_. diff --git a/docs/source/dev/cppapi/index.rst b/docs/source/dev/cppapi/index.rst index 85d7d6e698..f065c11b0c 100644 --- a/docs/source/dev/cppapi/index.rst +++ b/docs/source/dev/cppapi/index.rst @@ -191,7 +191,7 @@ The mapping of loads and deflections to the actuator points is performed in the Test for mapping procedure -------------------------- -The test for the implementation of the mapping procedure is as follows. OpenFAST is run using the C++ API to simulate the NREL-5MW turbine for one time step with a prescribed velocity of :math:`8 m/s` at all the velocity nodes and no induction (:samp:`WakeMod=0`). The number of actuator force nodes is varied from 10 to 100 while the number of velocity nodes is fixed at 17. :numref:`actuator-force-nodes-mapping-test-thrust` and :numref:`actuator-force-nodes-mapping-test-torque` show that the thrust and torque vary by less than :math:`1.1 \times 10^{-6}\%` and :math:`2 \times 10^{-6}\%` respectively when the number of actuator force nodes is varied from :math:`10-100`. +The test for the implementation of the mapping procedure is as follows. OpenFAST is run using the C++ API to simulate the Jonkman 5-MW (formerly known as the NREL 5-MW) turbine for one time step with a prescribed velocity of :math:`8 m/s` at all the velocity nodes and no induction (:samp:`WakeMod=0`). The number of actuator force nodes is varied from 10 to 100 while the number of velocity nodes is fixed at 17. :numref:`actuator-force-nodes-mapping-test-thrust` and :numref:`actuator-force-nodes-mapping-test-torque` show that the thrust and torque vary by less than :math:`1.1 \times 10^{-6}\%` and :math:`2 \times 10^{-6}\%` respectively when the number of actuator force nodes is varied from :math:`10-100`. .. _actuator-force-nodes-mapping-test-thrust: diff --git a/docs/source/dev/github_workflow.rst b/docs/source/dev/github_workflow.rst index 8d690e0873..e973802cd9 100644 --- a/docs/source/dev/github_workflow.rst +++ b/docs/source/dev/github_workflow.rst @@ -7,7 +7,7 @@ on the `GitHub repository `__. There, `issues `__ and `pull requests `__ are discussed and new versions are released. It is the best mechanism for -engaging with the NREL OpenFAST team and other developers throughout +engaging with the NLR OpenFAST team and other developers throughout the OpenFAST community. Issues and work assignment @@ -22,7 +22,7 @@ make clear any intention to complete a task. Pull Requests ------------- When a code modification is ready for review, a pull request should be -submitted along with all appropriate documentation and tests. An NREL OpenFAST +submitted along with all appropriate documentation and tests. An NLR OpenFAST team member will assign a reviewer and work with the developer to have the code merged into the main repository. diff --git a/docs/source/dev/index.rst b/docs/source/dev/index.rst index 96ef271719..7295ce91d7 100644 --- a/docs/source/dev/index.rst +++ b/docs/source/dev/index.rst @@ -8,7 +8,7 @@ documented, and self-sustaining software.** To that end, we continually work to improve the documentation and test coverage along with feature additions and improvements. This section of the documentation outlines the processes and procedures we have established for external developers -to work with the NREL OpenFAST team on code development. +to work with the NLR OpenFAST team on code development. If you'd like to help with general OpenFAST development or work on a particular feature, then first install OpenFAST following the @@ -20,8 +20,8 @@ understand the general workflow for individual and coordinated development. Finally, be sure to review the :doc:`GitHub workflow ` to avoid any merge or code conflicts. -With development happening in parallel between NREL, industry partners, and -universities, NREL relies on GitHub to coordinate efforts: +With development happening in parallel between NLR, industry partners, and +universities, NLR relies on GitHub to coordinate efforts: - `GitHub Issues `_ is the place to ask usage or development questions, report bugs, and @@ -49,15 +49,15 @@ Development Philosophy and Guidelines ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ OpenFAST is intended to be a self-sustaining, community developed software. -While the NREL OpenFAST team serves as the gatekeeper of the repository, we +While the NLR OpenFAST team serves as the gatekeeper of the repository, we actively encourage the community to share new ideas and contribute code. Considerations for contributing code are outlined here. -Engagement with NREL --------------------- +Engagement with NLR +------------------- The process for community code contribution starts with engaging directly -with the NREL OpenFAST team to define the scope of the work and coordinate +with the NLR OpenFAST team to define the scope of the work and coordinate development efforts. This is particularly important since many groups work on OpenFAST simultaneously. By engaging early, all developers can stay up to date and minimize conflicts during the code merge. @@ -67,17 +67,17 @@ development work, the areas of the software that will be impacted, and any model validation materials. See :ref:`development_plan` for more information on describing the planned work. -The NREL OpenFAST team is always working on internal projects +The NLR OpenFAST team is always working on internal projects that require the majority of our attention, but we will make every effort to engage with the community and support development efforts in -a reasonable time frame. After posting an Issue, the NREL OpenFAST +a reasonable time frame. After posting an Issue, the NLR OpenFAST team may reach out to schedule a meeting to talk through the details. .. _development_plan: Development Plan / Implementation Plan -------------------------------------- -Significant code development efforts at NREL begin with the development +Significant code development efforts at NLR begin with the development of a detailed implementation plan, and a few such plans are available to download for reference: @@ -147,10 +147,10 @@ as any algorithms or lines of code that are unclear. Ask yourself what you would need to know to fully understand your code if you don't see it again for two years. -Submit for review and NREL feedback +Submit for review and NLR feedback ----------------------------------- -New code can be submitted for review from the NREL OpenFAST team by +New code can be submitted for review from the NLR OpenFAST team by opening a `pull request `_ as described in :ref:`github_workflow`. We will review the code for accuracy, validity, quality, and robustness. Reviewing open source @@ -225,7 +225,7 @@ Additional guidance ------------------- The following sections provide extended guidance on developing source code, -interacting with the NREL OpenFAST team and other community contributors, and +interacting with the NLR OpenFAST team and other community contributors, and generally debugging and building out features. .. toctree:: diff --git a/docs/source/dev/performance.rst b/docs/source/dev/performance.rst index 5d07b55af9..8dbb5d137c 100644 --- a/docs/source/dev/performance.rst +++ b/docs/source/dev/performance.rst @@ -6,7 +6,7 @@ for the most computationally expensive use cases. The process generally involves initial profiling and hotspot analysis, then identifying specific subroutines to target for optimization in the physics modules and glue-codes. -A portion of this work was supported by Intel® through its designation of NREL as an +A portion of this work was supported by Intel® through its designation of NLR as an `Intel® Parallel Computing Center (IPCC) `_. The procedures, findings, and recommended programming practices are presented here. @@ -245,17 +245,17 @@ The physics modules used in this case are: * AeroDyn 15 * ServoDyn -This is a land based NREL 5-MW turbine simulation using BeamDyn as the +This is a land based Jonkman 5-MW (formerly called the NREL 5-MW) turbine simulation using BeamDyn as the structural module. It simulates 20 seconds with a time step size of 0.001 seconds and executes in `3m 55s `__ -on NREL's `Peregrine `__ -supercomputer. +on NLR's former Peregrine +supercomputer (retired). **5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth** Download case files `here `__. -This is an offshore, fixed-bottom NREL 5-MW turbine simulation with the +This is an offshore, fixed-bottom Jonkman 5-MW (formerly called the NREL 5-MW) turbine simulation with the majority of the computational expense occurring in the HydroDyn wave-dynamics calculation. @@ -270,8 +270,8 @@ The physics modules used in this case are: It simulates 60 seconds with a time step size of 0.01 seconds and executes in `20m 27s `__ -on NREL's `Peregrine `__ -supercomputer. +on NLR's former Peregrine +supercomputer (retired). Profiling +++++++++ @@ -324,7 +324,7 @@ Some keys outcomes from the first year of the IPCC project are as follows: * Core algorithms need significant modification to enable OpenMP and SIMD benefits -Tuning the Intel® tools to perform best on NREL's hardware and adding high level +Tuning the Intel® tools to perform best on NLR's hardware and adding high level multithreading yielded a maximum 3.8x time-to-solution improvement for one of the benchmark cases. @@ -373,14 +373,14 @@ areas: .. has continuously contributed code and expertise in this area. -.. Furthermore, NREL is optimizing OpenFAST for the future through profiling on +.. Furthermore, NLR is optimizing OpenFAST for the future through profiling on .. Intel next generation platform (NGP) simulators. .. bd_5MW_dynamic .. ~~~~~~~~~~~~~~ .. Download files `here `__. -.. This is a standalone BeamDyn case of the NREL 5MW wind turbine. It simulates 30 +.. This is a standalone BeamDyn case of the Jonkman 5-MW (formerly called the NREL 5-MW) wind turbine. It simulates 30 .. seconds with a time step size of 0.002 seconds and executes in 24s on NREL's .. Peregrine supercomputer. diff --git a/docs/source/dev/versioning.rst b/docs/source/dev/versioning.rst index 8f742f1962..77d409b991 100644 --- a/docs/source/dev/versioning.rst +++ b/docs/source/dev/versioning.rst @@ -15,7 +15,7 @@ For example, ``OpenFAST-v1.0.0-123-gabcd1234-dirty`` describes OpenFAST as: =================== ============= Version Component Explanation =================== ============= - v1.0.0 MAJOR.MINOR.PATCH numbering system; corresponds to a tagged commit made by NREL on GitHub + v1.0.0 MAJOR.MINOR.PATCH numbering system; corresponds to a tagged commit made by NREL (now called NLR after 2025) on GitHub 123-g Number of additional commits after the most recent tag for a build (the ``-g`` is for ``git``) abcd1234 First 8 characters of the current commit hash dirty Denotes that local changes have been made but not committed; omitted if there are no local changes diff --git a/docs/source/help.rst b/docs/source/help.rst index d0c2fe9692..42a911805a 100644 --- a/docs/source/help.rst +++ b/docs/source/help.rst @@ -6,10 +6,6 @@ Getting Help For possible bugs, enhancement requests, or code questions, please submit an issue at the `OpenFAST Github repository `_. -For OpenFAST usage questions, users should consider the `FAST Forum `_, which provides a large 10+ year legacy of FAST-related Q&A; the forum's search functionality should be used before posting questions to either github issues or the forum. - -Users may find the established FAST v8 through the NWTC Information Portal: -https://nwtc.nrel.gov/ - -Please contact `Michael.A.Sprague@NREL.gov `_. with questions regarding the OpenFAST development plan or how to contribute. +For OpenFAST usage questions, users should consider the `FAST Forum `_, which provides a large 10+ year legacy of FAST-related Q&A; the forum's search functionality should be used before posting questions to either GitHub issues or the forum. +Please contact `Jason.Jonkman@nlr.gov `_ or `Andy.Platt@nlr.gov `_ with questions regarding the OpenFAST development plan or how to contribute. diff --git a/docs/source/install/index.rst b/docs/source/install/index.rst index 315d86675e..1a9fdbff0c 100644 --- a/docs/source/install/index.rst +++ b/docs/source/install/index.rst @@ -143,9 +143,9 @@ openfast_x64.exe 64-bit single precision openfast_x64_double.exe 64-bit double precision Map_Win32.dll 32-bit MAP++ library Map_x64.dll 64-bit MAP++ library -DISCON_DLLS/<64bit or Win32>/DISCON.dll Controller library for NREL 5MW -DISCON_DLLS/<64bit or Win32>/DISCON_ITIBarge.dll Controller library for NREL 5MW - ITI Barge -DISCON_DLLS/<64bit or Win32>/DISCON_OC3Hywind.dll Controller library for NREL 5MW - OC3 Hywind +DISCON_DLLS/<64bit or Win32>/DISCON.dll Controller library for Jonkman 5-MW (formerly called the NREL 5-MW) +DISCON_DLLS/<64bit or Win32>/DISCON_ITIBarge.dll Controller library for Jonkman 5-MW (formerly called the NREL 5-MW) - ITI Barge +DISCON_DLLS/<64bit or Win32>/DISCON_OC3Hywind.dll Controller library for Jonkman 5-MW (formerly called the NREL 5-MW) - OC3 Hywind ================================================== ============================================== After extracting the contents, the OpenFAST executables @@ -248,7 +248,7 @@ For more information and installation options, see the `OpenFAST Python readme < Compile from source ~~~~~~~~~~~~~~~~~~~ -To compile from source code, the NREL OpenFAST team has developed an +To compile from source code, the NLR OpenFAST team has developed an approach that uses CMake to generate build files for all platforms. Currently, CMake support for Visual Studio while doing active development is not well supported, so OpenFAST maintains a Visual Studio Solution @@ -494,7 +494,7 @@ The CMake options specific to OpenFAST and their default settings are: FPE_TRAP_ENABLED - Enable Floating Point Exception (FPE) trap in compiler options (Default: OFF) GENERATE_TYPES - Use the openfast-registry to autogenerate types modules (Default: OFF) OPENMP - Enable OpenMP support (Default: OFF) - ORCA_DLL_LOAD - Enable OrcaFlex library load (Default: ON) + WIN_DLL_LOAD - Enable loading of Windows DLLs for OrcaFlex and SoilDyn (Default: ON) USE_DLL_INTERFACE - Enable runtime loading of dynamic libraries (Default: ON) USE_LOCAL_STATIC_LAPACK - Enable downloading and building static LAPACK and BLAS libs (Default: OFF) VARIABLE_TRACKING - Enables variable tracking for better runtime debugging output. May increase compile time. Valid only for GNU. (Default: ON) diff --git a/docs/source/testing/regression_test.rst b/docs/source/testing/regression_test.rst index 099a581564..662b11713b 100644 --- a/docs/source/testing/regression_test.rst +++ b/docs/source/testing/regression_test.rst @@ -153,8 +153,8 @@ executing with the help option: .. note:: - For the NREL 5MW turbine test cases, an external ServoDyn controller must - be compiled and included in the appropriate directory or all NREL 5MW + For the Jonkman 5-MW (formerly called the NREL 5-MW) turbine test cases, an external ServoDyn controller must + be compiled and included in the appropriate directory or all Jonkman 5-MW (formerly called the NREL 5-MW) cases will fail without starting. More information is available in the documentation for the `r-test repository `__, but be aware that these three DISCON controllers must exist @@ -200,8 +200,8 @@ be sure to execute the build command with the ``install`` target: .. note:: - REMINDER: For the NREL 5MW turbine test cases, an external ServoDyn controller must - be compiled and included in the appropriate directory or all NREL 5MW + REMINDER: For the 5MW turbine test cases, an external ServoDyn controller must + be compiled and included in the appropriate directory or all 5MW cases will fail without starting. More information is available in the documentation for the `r-test repository `__, but be aware that these three DISCON controllers must exist @@ -443,7 +443,7 @@ with the naming scheme ``executeRegressionTest.py``. The first step to adding a new regression test case is to verify that a script exists for the target module. If it does not, an issue should be opened in `OpenFAST Issues `_ -to coordinate with the NREL team on creating this script. +to coordinate with the NLR team on creating this script. The next step is to add the test case in the appropriate location in the `r-test` submodule. The directory structure in r-test mirrors the @@ -481,4 +481,4 @@ CMake driver, so follow the instructions above to edit ``CTestList.cmake``. Finally, the new test cases in the r-test submodule must be added to the r-test repository. To do this, open a new issue in `r-test Issues `_ -requesting for support from the NREL team to commit your test. +requesting for support from the NLR team to commit your test. diff --git a/docs/source/user/aerodyn-aeroacoustics/02-noise-models.rst b/docs/source/user/aerodyn-aeroacoustics/02-noise-models.rst index 8422a63b62..18219d4c22 100644 --- a/docs/source/user/aerodyn-aeroacoustics/02-noise-models.rst +++ b/docs/source/user/aerodyn-aeroacoustics/02-noise-models.rst @@ -541,7 +541,7 @@ at high frequency, :math:`\overline{D}` is: {\left( 1 + M\cos\Theta_{e} \right)^{3}} :label: aa-eq:33 -Note that this equation was not reported in the NREL Tech Report NREL/TP-5000-75731! +Note that this equation was not reported in the NLR Tech Report NREL/TP-5000-75731! At low frequency, the equation is identical for both leading and trailing edges: diff --git a/docs/source/user/aerodyn-aeroacoustics/03-model-verification.rst b/docs/source/user/aerodyn-aeroacoustics/03-model-verification.rst index 6a3c13712c..3df16a6457 100644 --- a/docs/source/user/aerodyn-aeroacoustics/03-model-verification.rst +++ b/docs/source/user/aerodyn-aeroacoustics/03-model-verification.rst @@ -222,7 +222,7 @@ trailing edge (low :math:`\Theta_e`). .. [2] - https://github.com/NREL/ROSCO + https://github.com/NatLabRockies/ROSCO .. [3] https://github.com/OpenFAST/python-toolbox diff --git a/docs/source/user/aerodyn-aeroacoustics/acronyms.rst b/docs/source/user/aerodyn-aeroacoustics/acronyms.rst index d444c40537..8a98c4dd62 100644 --- a/docs/source/user/aerodyn-aeroacoustics/acronyms.rst +++ b/docs/source/user/aerodyn-aeroacoustics/acronyms.rst @@ -3,47 +3,49 @@ List of Acronyms ---------------- -+-----------+--------------------------------------------------------------+ -+ BPM + Brooks-Pope-Marcolini airfoil noise model + -+-----------+--------------------------------------------------------------+ -+ dB + decibels + -+-----------+--------------------------------------------------------------+ -+ dBA + A-weighted decibels + -+-----------+--------------------------------------------------------------+ -+ deg + degrees + -+-----------+--------------------------------------------------------------+ -+ Hz + hertz + -+-----------+--------------------------------------------------------------+ -+ IEA + International Energy Agency + -+-----------+--------------------------------------------------------------+ -+ kg + kilograms + -+-----------+--------------------------------------------------------------+ -+ kHz + kilohertz + -+-----------+--------------------------------------------------------------+ -+ LFC + low-frequency correction + -+-----------+--------------------------------------------------------------+ -+ m + meters + -+-----------+--------------------------------------------------------------+ -+ N + newtons + -+-----------+--------------------------------------------------------------+ -+ NREL + National Renewable Energy Laboratory + -+-----------+--------------------------------------------------------------+ -+ rad + radians + -+-----------+--------------------------------------------------------------+ -+ s + seconds + -+-----------+--------------------------------------------------------------+ -+ SPL + sound pressure level + -+-----------+--------------------------------------------------------------+ -+ TBL + turbulent boundary layer + -+-----------+--------------------------------------------------------------+ -+ TBL-TE + turbulent boundary layer – trailing edge + -+-----------+--------------------------------------------------------------+ -+ TNO + a Netherlands organization for applied scientific research + -+-----------+--------------------------------------------------------------+ -+ TE + trailing edge + -+-----------+--------------------------------------------------------------+ -+ TI + turbulent inflow + -+-----------+--------------------------------------------------------------+ -+ TUM + Technical University of Munich + -+-----------+--------------------------------------------------------------+ ++-----------+----------------------------------------------------------------+ ++ BPM + Brooks-Pope-Marcolini airfoil noise model + ++-----------+----------------------------------------------------------------+ ++ dB + decibels + ++-----------+----------------------------------------------------------------+ ++ dBA + A-weighted decibels + ++-----------+----------------------------------------------------------------+ ++ deg + degrees + ++-----------+----------------------------------------------------------------+ ++ Hz + hertz + ++-----------+----------------------------------------------------------------+ ++ IEA + International Energy Agency + ++-----------+----------------------------------------------------------------+ ++ kg + kilograms + ++-----------+----------------------------------------------------------------+ ++ kHz + kilohertz + ++-----------+----------------------------------------------------------------+ ++ LFC + low-frequency correction + ++-----------+----------------------------------------------------------------+ ++ m + meters + ++-----------+----------------------------------------------------------------+ ++ N + newtons + ++-----------+----------------------------------------------------------------+ ++ NREL + National Renewable Energy Laboratory (changed to NLR in 2025) + ++-----------+----------------------------------------------------------------+ ++ NLR + National Laboratory of the Rockies + ++-----------+----------------------------------------------------------------+ ++ rad + radians + ++-----------+----------------------------------------------------------------+ ++ s + seconds + ++-----------+----------------------------------------------------------------+ ++ SPL + sound pressure level + ++-----------+----------------------------------------------------------------+ ++ TBL + turbulent boundary layer + ++-----------+----------------------------------------------------------------+ ++ TBL-TE + turbulent boundary layer – trailing edge + ++-----------+----------------------------------------------------------------+ ++ TNO + a Netherlands organization for applied scientific research + ++-----------+----------------------------------------------------------------+ ++ TE + trailing edge + ++-----------+----------------------------------------------------------------+ ++ TI + turbulent inflow + ++-----------+----------------------------------------------------------------+ ++ TUM + Technical University of Munich + ++-----------+----------------------------------------------------------------+ diff --git a/docs/source/user/aerodyn-aeroacoustics/example/AeroDyn.ipt b/docs/source/user/aerodyn-aeroacoustics/example/AeroDyn.ipt index a7a30ffc94..9b3b57e107 100644 --- a/docs/source/user/aerodyn-aeroacoustics/example/AeroDyn.ipt +++ b/docs/source/user/aerodyn-aeroacoustics/example/AeroDyn.ipt @@ -3,18 +3,15 @@ IEA Wind Task 37 land-based reference wind turbine ====== General Options =================================================== False Echo - Echo the input to ".AD.ech"? (flag) "default" DTAero - Time interval for aerodynamic calculations {or "default"} (s) -1 WakeMod - Type of wake/induction model (switch) {0=none, 1=BEMT} -2 AFAeroMod - Type of blade airfoil aerodynamics model (switch -0 TwrPotent - Type of tower influence on wind around the tower (switch) -0 TwrShadow - Type of tower influence on wind based on downstream tower shadow (switch) {0=none, 1=Powles model, 2=Eames model} +1 Wake_Mod - Wake/induction model (switch) {0=none, 1=BEMT, 3=OLAF} [Wake_Mod cannot be 2 or 3 when linearizing] +0 TwrPotent - Type tower influence on wind based on potential flow around the tower (switch) {0=none, 1=baseline potential flow, 2=potential flow with Bak correction} +0 TwrShadow - Calculate tower influence on wind based on downstream tower shadow (switch) {0=none, 1=Powles model, 2=Eames model} False TwrAero - Calculate tower aerodynamic loads? (flag) -False FrozenWake - Assume frozen wake during linearization? (flag -False CavitCheck - Perform cavitation check? (flag) -False Buoyancy - Include buoyancy effects? (flag) +False CavitCheck - Perform cavitation check? (flag) [UA_Mod must be 0 when CavitCheck=true] False NacelleDrag - Include Nacelle Drag effects? (flag) -True CompAA - Flag to compute AeroAcoustics calculation -"AeroAcousticsInput.dat" AA_InputFile -====== Environmental Conditions ========================================== -"default" AirDens - Air density (kg/m^3) +True CompAA - Flag to compute AeroAcoustics calculation [used only when Wake_Mod = 1 or 2] +"AeroAcousticsInput.dat" AA_InputFile - AeroAcoustics input file [used only when CompAA=true] +====== Environmental Conditions =================================================================== +"default" AirDens - Air density (kg/m^3) File continues... diff --git a/docs/source/user/aerodyn-aeroacoustics/references.bib b/docs/source/user/aerodyn-aeroacoustics/references.bib index 3250183685..23c90916c6 100644 --- a/docs/source/user/aerodyn-aeroacoustics/references.bib +++ b/docs/source/user/aerodyn-aeroacoustics/references.bib @@ -108,7 +108,7 @@ @techreport{aa-Moriarty:2005 title= {NAFNoise User's Guide}, address= {Golden, CO}, institution= {National Renewable Energy Laboratory}, - URL= {https://github.com/NREL/NAFNoise/blob/master/NAFNoise.pdf} + URL= {https://github.com/NatLabRockies/NAFNoise/blob/master/NAFNoise.pdf} } @misc{aa-xfoil:699, diff --git a/docs/source/user/aerodyn-olaf/ExampleFiles/ExampleFile--OLAF.dat b/docs/source/user/aerodyn-olaf/ExampleFiles/ExampleFile--OLAF.dat index bd9d6a46d3..4fdfb0ad97 100644 --- a/docs/source/user/aerodyn-olaf/ExampleFiles/ExampleFile--OLAF.dat +++ b/docs/source/user/aerodyn-olaf/ExampleFiles/ExampleFile--OLAF.dat @@ -43,4 +43,8 @@ default VTK_fps - Frame rate for VTK output (frames per second) {"all 0 nGridOut - Number of grid outputs GridName GridType TStart TEnd DTGrid XStart XEnd nX YStart YEnd nY ZStart ZEnd nZ (-) (-) (s) (s) (s) (m) (m) (-) (m) (m) (-) (m) (m) (-) ------------------------------------------------------------------------------------------------- +=============================================================================================== +--------------------------- ADVANCED OPTIONS -------------------------------------------------- +=============================================================================================== +! Advanced options may be placed here in arbitrary order, with the regular format: +! Value Key - Comment diff --git a/docs/source/user/aerodyn-olaf/InputFiles.rst b/docs/source/user/aerodyn-olaf/InputFiles.rst index a841fbf814..3c6fabd8ad 100644 --- a/docs/source/user/aerodyn-olaf/InputFiles.rst +++ b/docs/source/user/aerodyn-olaf/InputFiles.rst @@ -312,6 +312,118 @@ of a box of shape 5x20x30 and dimension 1200x300x295. The grid contains both th The two other grids are vertical and horizontal planes containing only the velocity. +Advanced Options +~~~~~~~~~~~~~~~~ + + +Advanced options (typically used for developers or beta features) can be placed at the end of the OLAF input file: + + +- These options use the regular format: `Value Key - Comment`. +- They can be placed in arbitrary order. +- They can be commented out with a `!` character at the beginning of the line. +- Blank lines or unsupported options are ignored (display to screen). +- If not provided, a default value will be used, but the "DEFAULT" keyword is not supported for the advanced options. +- These are **beta features** and should mostly be used by developers. + + +The end of the OLAF input file would look as follows: + +.. code:: + + [...] + GridName GridType TStart TEnd DTGrid XStart XEnd nX YStart YEnd nY ZStart ZEnd nZ + (-) (-) (s) (s) (s) (m) (m) (-) (m) (m) (-) (m) (m) (-) + =============================================================================================== + --------------------------- ADVANCED OPTIONS -------------------------------------------------- + =============================================================================================== + ! Advanced options may be placed here in arbitrary order, with the regular format: + ! Value1 Key1 - Comment1 + ! Value2 Key2 - Comment2 + ! Lines starting with `!` are ignored, empty lines are ignored + [...] etc + +Currently, the advanced options supported are as follows: + +.. code:: + + =============================================================================================== + --------------------------- ADVANCED OPTIONS -------------------------------------------------- + =============================================================================================== + "Panels.vtk" SrcPnlFile - Name of VTK file containing source panels {default: ""} + 1 nSrcPnlUpdate - How often do src panel updates (in time steps of OLAF), {default: 1} + True Induction - Compute induced velocities from wake to blade and wake to wake, {default: True} + True InductionAtCP - Compute induced velocities at nodes or CP, {default: True} + True WakeAtTE - Start the wake at the trailing edge, or at the LL, {default: True} + False DStallOnWake - Dynamic stall has influence on wake, {default: False} + 0.75 kFrozenNWStart - Fraction of wake induced velocity at start of frozen wake, {default: 0.75} + 0.5 kFrozenNWEnd - Fraction of wake induced velocity at end of frozen wake, {default: 0.5} + 0.0 zGround - Ground height, used to enforce that no vortices go into the ground {default: 0.0} + 0.1 zGroundPush - Ground push back, vortices that are lower than zGround are placed back at zGroundPush {default: 0.1} + + + +**SrcPanlFile** [string] specifies the name of the VTK file used for the source panel method. +The VTK file should be a legacy ASCII VTK file, with DATASET POLYDATA POINTS and POLYGONS. +A sample VTK file is provided below for two panels forming a regular grid in the XY plane. +The connectivity of the polygons needs to be such that the normal points away from the body and +into the fluid. +In the example below, the polygons are defined clockwise when viewed from above, which results in the normals internally defined by OLAF pointing in the `+z` direction. This configuration is typical of a bottom wall with fluid above it: the OLAF normals point from the wall toward the fluid. However, when applying the right-hand-rule convention, the resulting normals point from the fluid toward the interior of the body. +When using **WrVTK**, OLAF will write separate VTK files containing various information related to the source panels, such as the pressure coefficient, area, force per area, normals. Looking at the orientation of the normals is extremely important (In Paraview, select 3D Glyph, Arrows, and select the `Normals` output, scaled by the `Normals`). +The BodyID CELL_DATA can be used to separate different patches, which can help the post processing. This is optional, OLAF doesn't use it currently, but it is written back in the output files of OLAF. + +Curious readers may look at the unittest `Test_SrcPnl_Sphere` of OLAF that test the pressure coefficient +about a sphere. + +.. code:: + + # vtk DataFile Version 2.0 + Comment + ASCII + DATASET POLYDATA + POINTS 6 double + 0.0 0.0 0.0 + 0.0 25.0 0.0 + 0.0 50.0 0.0 + 10.0 0.0 0.0 + 10.0 25.0 0.0 + 10.0 50.0 0.0 + + POLYGONS 2 10 + 4 0 1 4 3 + 4 1 2 5 4 + + CELL_DATA 2 + SCALARS BodyID int + LOOKUP_TABLE default + 0 + 0 + + + +**nSrcPnlUpdate** [int] Define how often the source panel updates (in time steps of OLAF), the default is `1`, at each time step. + +**Induction** [switch] Compute induced velocities, otherwise all induced velocity are 0 (no wake, no panels, etc) ! Default is `True`. + +**InductionAtCP** [switch] When performing the lifting line calculations, compute induced velocities at nodes (False) or at control points (CP, True). Default is `True`. + +**WakeAtTE** [switch] Start the wake at the trailing edge (True), or directly at the LL (False, no chordwise panel). Default is `True`. + +**DStallOnWake** [switch] Include the influence of the dynamic stall on the wake (True), i.e. use the dynamic Cl to update the circulation of the lifting line and wake panel. Default is `False`. + +**kFrozenNWStart** [float] Fraction of wake induced velocity at start of frozen wake, default is `0.75`. See OLAF theory related to Frozen NW, :numref:`sec:vortconvfrozen`. + +**kFrozenNWEnd** [float] Fraction of wake induced velocity at end of frozen wake, default is `0.5`. See OLAF theory related to Frozen NW, :numref:`sec:vortconvfrozen`. + +**zGround** [float] Height in meters below which vortex points are not allowed to be and if any are present they will be pushed back above the ground at the height defined by **zGroundPush** (in meters). Default is `0.0`. +For MHK, the sea bed location, based on the water depth is added to **zGround**. + +**zGroundPush** [float] Ground push back, see **zGround**. Default is `0.1`. + + + + + AeroDyn Input File -------------------- Input file modifications diff --git a/docs/source/user/aerodyn/appendix.rst b/docs/source/user/aerodyn/appendix.rst index ef7a0fbd09..173f84042d 100644 --- a/docs/source/user/aerodyn/appendix.rst +++ b/docs/source/user/aerodyn/appendix.rst @@ -21,11 +21,11 @@ to vary with time. This feature can be useful for debugging the aerodynamic resp outside of OpenFAST. 2) Multi-rotor AeroDyn Driver Input File -:download:`(driver input file example) `: +:download:`(driver input file example) ` 3) AeroDyn Primary Input File -:download:`(primary input file example) `: +:download:`(primary input file example) ` The primary AeroDyn input file defines modeling options, environmental conditions (except freestream flow), airfoils, tower nodal discretization and properties, tower, hub, and nacelle properties, as well as output file specifications. @@ -35,14 +35,14 @@ The input file begins with two lines of header information which is for your use 4) Airfoil Data Input File -:download:`(profile data) `: +:download:`(profile data) ` -:download:`(profile coordinates) `: +:download:`(profile coordinates) ` The airfoil data input files themselves (one for each airfoil) include tables containing coefficients of lift force, drag force, and pitching moment versus AoA, as well as UA model parameters. In these files, any line whose first non-blank character is an exclamation point (!) is ignored (for inserting comment lines). The non-comment lines should appear within the file in order, but comment lines may be intermixed as desired for reading clarity. 5) Blade Data Input File -:download:`(blade data input file example) `: +:download:`(blade data input file example) ` The blade data input file contains the nodal discretization, geometry, twist, chord, airfoil identifier, and buoyancy properties for a blade. Separate files are used for each blade, which permits modeling of aerodynamic imbalances. diff --git a/docs/source/user/aerodyn/driver.rst b/docs/source/user/aerodyn/driver.rst index dec9b71aa3..23577f3a34 100644 --- a/docs/source/user/aerodyn/driver.rst +++ b/docs/source/user/aerodyn/driver.rst @@ -118,6 +118,21 @@ An example of inputs is given below: +**SeaState data** + +SeaState can be called by the AeroDyn driver to define a wave field as part of the inflow information. +For MHK turbines with waves and currents, SeaState will query InflowWind and sum the velocities and +accelerations from the wave and current fields. If SeaState is activated, InflowWind must also be +activated, though the current can be set to 0 if desired. An example of inputs for this section is given below: + +.. code:: + + ----- SeaState Data --------------------------------------------------------------------- + 1 CompSeaSt - Compute wave velocities (switch) {0=No Waves; 1=SeaState} + "MHK_RM1_Floating_SeaState.dat" SeaStFile - Name of the SeaState input file [used only when CompSeaSt=1] + + + **Turbine data** The user specifies the number of turbines as follows: @@ -381,19 +396,19 @@ An example is given below for two turbines: .. code:: - ====== Hub Properties ============================================================================== [used only when Buoyancy=True] + ====== Hub Properties ============================================================================== [used only when MHK=1 or 2] 7.0 VolHub - Hub volume (m^3) 0.0 HubCenBx - Hub center of buoyancy x direction offset (m) - ====== Hub Properties ============================================================================== [used only when Buoyancy=True] + ====== Hub Properties ============================================================================== [used only when MHK=1 or 2] 5.0 VolHub - Hub volume (m^3) 0.2 HubCenBx - Hub center of buoyancy x direction offset (m) - ====== Nacelle Properties ========================================================================== [used only when Buoyancy=True or NacelleDrag=True] + ====== Nacelle Properties ========================================================================== [used only when MHK=1 or 2 or when NacelleDrag=True] 32.0 VolNac - Nacelle volume (m^3) 0.3, 0.0, 0.05 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) 4.67, 20.15, 20.15 NacArea - Projected area of the nacelle in X, Y, Z in the nacelle coordinate system (m^2) 0.5, 0.5, 0.5 NacCd - Drag coefficient for the nacelle areas defined above (-) 0.43, 0, 0 NacDragAC - Position of aerodynamic center of nacelle drag in nacelle coordinates (m) - ====== Nacelle Properties ========================================================================== [used only when Buoyancy=True or NacelleDrag=True] + ====== Nacelle Properties ========================================================================== [used only when MHK=1 or 2 or when NacelleDrag=True] 32.0 VolNac - Nacelle volume (m^3) 0.3, 0.0, 0.05 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) 4.67, 20.15, 20.15 NacArea - Projected area of the nacelle in X, Y, Z in the nacelle coordinate system (m^2) @@ -412,14 +427,14 @@ An example is given below for two turbines: .. code:: - ====== Turbine(1) Tower Influence and Aerodynamics ================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] - 2 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] + ====== Turbine(1) Tower Influence and Aerodynamics ================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] + 2 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] TwrElev TwrDiam TwrCd TwrTI TwrCb (m) (m) (-) (-) (-) 0.0 2.0 1.0 0.1 0.0 10.0 1.0 1.0 0.1 0.0 - ====== Turbine(2) Tower Influence and Aerodynamics ================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] - 3 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] + ====== Turbine(2) Tower Influence and Aerodynamics ================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] + 3 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] TwrElev TwrDiam TwrCd TwrTI TwrCb (m) (m) (-) (-) (-) 0.0 4.0 1.0 0.1 0.0 @@ -466,13 +481,16 @@ An example of an AeroDyn driver for a basic inflow, basic HAWT, and combined cas 1.700000000000000e+03 Pvap - Vapour pressure of working fluid (Pa) [used only for an MHK turbine cavitation check] 0 WtrDpth - Water depth (m) ----- Inflow Data ----------------------------------------------------------------------- - 0 CompInflow - Compute inflow wind velocities (switch) {0=Steady Wind; 1=InflowWind} - "unused" InflowFile - Name of the InflowWind input file [used only when CompInflow=1] - 9.0 HWindSpeed - Horizontal wind speed [used only when CompInflow=0 and AnalysisType=1] (m/s) - 140 RefHt - Reference height for horizontal wind speed [used only when CompInflow=0] (m) - 0.10 PLExp - Power law exponent [used only when CompInflow=0 and AnalysisType=1] (-) + 0 CompInflow - Compute inflow wind velocities (switch) {0=Steady Wind; 1=InflowWind} + "unused" InflowFile - Name of the InflowWind input file [used only when CompInflow=1] + 9.0 HWindSpeed - Horizontal wind speed [used only when CompInflow=0 and AnalysisType=1] (m/s) + 140 RefHt - Reference height for horizontal wind speed [used only when CompInflow=0] (m) + 0.10 PLExp - Power law exponent [used only when CompInflow=0 and AnalysisType=1] (-) + ----- SeaState Data --------------------------------------------------------------------- + 0 CompSeaSt - Compute wave velocities (switch) {0=No Waves; 1=SeaState} + "unused" SeaStFile - Name of the SeaState input file [used only when CompSeaSt=1] ----- Turbine Data ---------------------------------------------------------------------- - 1 NumTurbines - Number of turbines + 1 NumTurbines - Number of turbines ----- Turbine(1) Geometry --------------------------------------------------------------- True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: next 7 lines are basic inputs, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow} 0,0,0 BaseOriginInit(1) - Coordinate of tower base in base coordinates (m) diff --git a/docs/source/user/aerodyn/examples/ad_blade_example.dat b/docs/source/user/aerodyn/examples/ad_blade_example.dat index 80522dec0b..25e1435dce 100644 --- a/docs/source/user/aerodyn/examples/ad_blade_example.dat +++ b/docs/source/user/aerodyn/examples/ad_blade_example.dat @@ -2,29 +2,29 @@ Description line for this file -- file corresponds to inputs in Test01_UAE_AeroDyn.dat ====== Blade Properties ================================================================= 23 NumBlNds - Number of blade nodes used in the analysis (-) - BlSpn BlCrvAC BlSwpAC BlCrvAng BlTwist BlChord BlAFID BlCb BlCenBn BlCenBt - (m) (m) (m) (deg) (deg) (m) (-) (-) (m) (m) - 0.0 0.0 0.0 0.0 0.000 0.219 1 0.0 0.0 0.0 - 0.1360 0.0 0.0 0.0 0.000 0.219 1 0.0 0.0 0.0 - 0.4481 0.0 0.0 0.0 -0.098 0.181 1 0.0 0.0 0.0 - 0.8001 0.0 0.0 0.0 19.423 0.714 3 0.0 0.0 0.0 - 1.0767 0.0 0.0 0.0 14.318 0.711 4 0.0 0.0 0.0 - 1.2779 0.0 0.0 0.0 10.971 0.691 5 0.0 0.0 0.0 - 1.4958 0.0 0.0 0.0 8.244 0.668 6 0.0 0.0 0.0 - 1.7137 0.0 0.0 0.0 6.164 0.647 7 0.0 0.0 0.0 - 1.9149 0.0 0.0 0.0 4.689 0.627 7 0.0 0.0 0.0 - 2.1160 0.0 0.0 0.0 3.499 0.606 8 0.0 0.0 0.0 - 2.3340 0.0 0.0 0.0 2.478 0.584 8 0.0 0.0 0.0 - 2.5520 0.0 0.0 0.0 1.686 0.561 8 0.0 0.0 0.0 - 2.7530 0.0 0.0 0.0 1.115 0.542 8 0.0 0.0 0.0 - 2.9542 0.0 0.0 0.0 0.666 0.522 8 0.0 0.0 0.0 - 3.1721 0.0 0.0 0.0 0.267 0.499 8 0.0 0.0 0.0 - 3.3900 0.0 0.0 0.0 -0.079 0.478 8 0.0 0.0 0.0 - 3.5912 0.0 0.0 0.0 -0.381 0.457 9 0.0 0.0 0.0 - 3.7924 0.0 0.0 0.0 -0.679 0.437 9 0.0 0.0 0.0 - 3.9684 0.0 0.0 0.0 -0.933 0.419 9 0.0 0.0 0.0 - 4.1444 0.0 0.0 0.0 -1.184 0.401 10 0.0 0.0 0.0 - 4.3456 0.0 0.0 0.0 -1.466 0.381 10 0.0 0.0 0.0 - 4.5216 0.0 0.0 0.0 -1.711 0.363 10 0.0 0.0 0.0 - 4.5970 0.0 0.0 0.0 -1.711 0.363 10 0.0 0.0 0.0 + BlSpn BlCrvAC BlSwpAC BlCrvAng BlTwist BlChord BlAFID t_c BlCb BlCenBn BlCenBt BlCpn BlCpt BlCan BlCat BlCam + (m) (m) (m) (deg) (deg) (m) (-) (-) (-) (m) (m) (-) (-) (-) (-) (-) + 0.0 0.0 0.0 0.0 0.000 0.219 1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 0.1360 0.0 0.0 0.0 0.000 0.219 1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 0.4481 0.0 0.0 0.0 -0.098 0.181 1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 0.8001 0.0 0.0 0.0 19.423 0.714 3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 1.0767 0.0 0.0 0.0 14.318 0.711 4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 1.2779 0.0 0.0 0.0 10.971 0.691 5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 1.4958 0.0 0.0 0.0 8.244 0.668 6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 1.7137 0.0 0.0 0.0 6.164 0.647 7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 1.9149 0.0 0.0 0.0 4.689 0.627 7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 2.1160 0.0 0.0 0.0 3.499 0.606 8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 2.3340 0.0 0.0 0.0 2.478 0.584 8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 2.5520 0.0 0.0 0.0 1.686 0.561 8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 2.7530 0.0 0.0 0.0 1.115 0.542 8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 2.9542 0.0 0.0 0.0 0.666 0.522 8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 3.1721 0.0 0.0 0.0 0.267 0.499 8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 3.3900 0.0 0.0 0.0 -0.079 0.478 8 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 3.5912 0.0 0.0 0.0 -0.381 0.457 9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 3.7924 0.0 0.0 0.0 -0.679 0.437 9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 3.9684 0.0 0.0 0.0 -0.933 0.419 9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 4.1444 0.0 0.0 0.0 -1.184 0.401 10 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 4.3456 0.0 0.0 0.0 -1.466 0.381 10 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 4.5216 0.0 0.0 0.0 -1.711 0.363 10 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 4.5970 0.0 0.0 0.0 -1.711 0.363 10 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 diff --git a/docs/source/user/aerodyn/examples/ad_driver_example.dvr b/docs/source/user/aerodyn/examples/ad_driver_example.dvr index c93fcfe122..35c27d5f59 100644 --- a/docs/source/user/aerodyn/examples/ad_driver_example.dvr +++ b/docs/source/user/aerodyn/examples/ad_driver_example.dvr @@ -20,6 +20,9 @@ False Echo - Echo input parameters to ".ech"? 9.0 HWindSpeed - Horizontal wind speed [used only when CompInflow=0 and AnalysisType=1] (m/s) 140 RefHt - Reference height for horizontal wind speed [used only when CompInflow=0] (m) 0.10 PLExp - Power law exponent [used only when CompInflow=0 and AnalysisType=1] (-) +----- SeaState Data [used only when MHK = 1 or 2] --------------------------------------- + 0 CompSeaSt - Compute wave velocities (switch) {0=No Waves; 1=SeaState} +"unused" SeaStFile - Name of the SeaState input file [used only when CompSeaSt=1] ----- Turbine Data ---------------------------------------------------------------------- 1 NumTurbines - Number of turbines ----- Turbine(1) Geometry --------------------------------------------------------------- diff --git a/docs/source/user/aerodyn/examples/ad_driver_multiple.dvr b/docs/source/user/aerodyn/examples/ad_driver_multiple.dvr index 00cf198871..8cd074dfe0 100644 --- a/docs/source/user/aerodyn/examples/ad_driver_multiple.dvr +++ b/docs/source/user/aerodyn/examples/ad_driver_multiple.dvr @@ -20,6 +20,9 @@ False Echo - Echo input parameters to ".ech"? 10 HWindSpeed - Horizontal wind speed [used only when CompInflow=0 and AnalysisType=1] (m/s) 200 RefHt - Reference height for horizontal wind speed [used only when CompInflow=0] (m) 0 PLExp - Power law exponent [used only when CompInflow=0 and AnalysisType=1] (-) +----- SeaState Data [used only when MHK = 1 or 2] --------------------------------------- + 0 CompSeaSt - Compute wave velocities (switch) {0=No Waves; 1=SeaState} +"unused" SeaStFile - Name of the SeaState input file [used only when CompSeaSt=1] ----- Turbine Data ---------------------------------------------------------------------- 2 NumTurbines - Number of turbines ----- Turbine(1) ------------------------------------------------------------------------ diff --git a/docs/source/user/aerodyn/examples/ad_primary_example.dat b/docs/source/user/aerodyn/examples/ad_primary_example.dat index 6505544349..9199db451f 100644 --- a/docs/source/user/aerodyn/examples/ad_primary_example.dat +++ b/docs/source/user/aerodyn/examples/ad_primary_example.dat @@ -8,7 +8,6 @@ False Echo - Echo the input to ".AD.ech"? (flag 0 TwrShadow - Calculate tower influence on wind based on downstream tower shadow (switch) {0=none, 1=Powles model, 2=Eames model} False TwrAero - Calculate tower aerodynamic loads? (flag) False CavitCheck - Perform cavitation check? (flag) [UA_Mod must be 0 when CavitCheck=true] -False Buoyancy - Include buoyancy effects? (flag) False NacelleDrag - Include Nacelle Drag effects? (flag) False CompAA - Flag to compute AeroAcoustics calculation [used only when Wake_Mod = 1 or 2] "unused" AA_InputFile - AeroAcoustics input file [used only when CompAA=true] @@ -74,10 +73,10 @@ True UseBlCm - Include aerodynamic pitching moment in calcul "Test01_UAE_AeroDyn_blade.dat" ADBlFile(1) - Name of file containing distributed aerodynamic properties for Blade #1 (-) "Test01_UAE_AeroDyn_blade.dat" ADBlFile(2) - Name of file containing distributed aerodynamic properties for Blade #2 (-) [unused if NumBl < 2] "Test01_UAE_AeroDyn_blade.dat" ADBlFile(3) - Name of file containing distributed aerodynamic properties for Blade #3 (-) [unused if NumBl < 3] -====== Hub Properties ============================================================================== [used only when Buoyancy=True] +====== Hub Properties ============================================================================== [used only when MHK=1 or 2] 0 VolHub - Hub volume (m^3) 0 HubCenBx - Hub center of buoyancy x direction offset (m) -====== Nacelle Properties ========================================================================== [used only when Buoyancy=True or NacelleDrag=True] +====== Nacelle Properties ========================================================================== [used only when MHK=1 or 2 or when NacelleDrag=True] 0 VolNac - Nacelle volume (m^3) 0, 0, 0 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) 0, 0, 0 NacArea - Projected area of the nacelle in X, Y, Z in the nacelle coordinate system (m^2) @@ -86,15 +85,15 @@ True UseBlCm - Include aerodynamic pitching moment in calcul ====== Tail Fin Aerodynamics ======================================================================= False TFinAero - Calculate tail fin aerodynamics model (flag) "unused" TFinFile - Input file for tail fin aerodynamics [used only when TFinAero=True] -====== Tower Influence and Aerodynamics ============================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] - 5 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] -TwrElev TwrDiam TwrCd TwrTI TwrCb ! TwrTI used only when TwrShadow=2; TwrCb used only when Buoyancy=True -(m) (m) (-) (-) (-) -0.0000000E+00 6.0000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 -2.0000000E+01 5.5000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 -4.0000000E+01 5.0000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 -6.0000000E+01 4.5000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 -8.0000000E+01 4.0000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 +====== Tower Influence and Aerodynamics ============================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] + 5 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] +TwrElev TwrDiam TwrCd TwrTI TwrCb TwrCp TwrCa !TwrTI used only with TwrShadow=2, TwrCb/TwrCp/TwrCa used only with MHK=1 or 2 +(m) (m) (-) (-) (-) (-) (-) +0.0000000E+00 6.0000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 0.0000000E+00 0.0000000E+00 +2.0000000E+01 5.5000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 0.0000000E+00 0.0000000E+00 +4.0000000E+01 5.0000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 0.0000000E+00 0.0000000E+00 +6.0000000E+01 4.5000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 0.0000000E+00 0.0000000E+00 +8.0000000E+01 4.0000000E+00 0.0000000E+00 1.0000000E-01 0.0000000E+00 0.0000000E+00 0.0000000E+00 ====== Outputs ==================================================================================== True SumPrint - Generate a summary file listing input options and interpolated properties to ".AD.sum"? (flag) 4 NBlOuts - Number of blade node outputs [0 - 9] (-) diff --git a/docs/source/user/aerodyn/index.rst b/docs/source/user/aerodyn/index.rst index 7b414b4b28..534698a649 100644 --- a/docs/source/user/aerodyn/index.rst +++ b/docs/source/user/aerodyn/index.rst @@ -1,3 +1,5 @@ +.. _AD_user_guide: + AeroDyn Users Guide and Theory Manual ====================================== @@ -16,6 +18,8 @@ can be downladed from the list below. - :download:`Development Plan for the Aerodynamic Linearization of OpenFAST <../../../OtherSupporting/AeroDyn/AeroLin_2019-12.pdf>` - :download:`AeroDyn Meshes and Related Calculations <../../../OtherSupporting/AeroDyn/AeroDynMesh_Rev4.docx>` - :download:`Calculation of Buoyancy on a Marine Hydrokinetic Turbine in AeroDyn <../../../OtherSupporting/AeroDyn/Buoyancy_Implementation_Plan_Rev11.docx>` +- :download:`Calculation of Fluid Inertia and Added Mass Loads on an MHK Turbine in AeroDyn <../../../OtherSupporting/AeroDyn/Fluid_Inertia_Added_Mass_Implementation_Plan.docx>` +- :download:`Determination of Added Mass Coefficients for Floating Hydrokinetic Turbine Blades using Computational Fluid Dynamics <../../../OtherSupporting/AeroDyn/UMERC24-Poster.pdf>` .. - :download:` ` diff --git a/docs/source/user/aerodyn/input.rst b/docs/source/user/aerodyn/input.rst index 5013abbad5..70b2565ba4 100644 --- a/docs/source/user/aerodyn/input.rst +++ b/docs/source/user/aerodyn/input.rst @@ -129,11 +129,6 @@ not function with unsteady airfoil aerodynamics. If ``CavitCheck`` is TRUE, the ``MHK`` flag in the AeroDyn or OpenFAST driver input file must be set to 1 or 2 to indicate an MHK turbine is being modeled. -Set the ``Buoyancy`` flag to TRUE to calculate buoyant loads on the blades, -tower, nacelle, and hub of an MHK turbine or FALSE to disable this calculation. -If ``Buoyancy`` is TRUE, the ``MHK`` flag in the AeroDyn or OpenFAST driver -input file must be set to 1 or 2 to indicate an MHK turbine is being modeled. - Set the ``NacelleDrag`` flag to TRUE to calculate the drag loads on the nacelle or FALSE to disable this calculation. @@ -431,7 +426,7 @@ pitching-moment coefficient data must be included in the airfoil data tables with ``InCol_Cm`` not equal to zero. The blade nodal discretization, geometry, twist, chord, airfoil -identifier, and buoyancy properties are set in separate input files for each +identifier, and buoyancy/added mass/fluid inertia properties are set in separate input files for each blade, described in :numref:`blade_data_input_file`. ``ADBlFile(1)`` is the filename for blade 1, ``ADBlFile(2)`` is the filename for blade 2, and ``ADBlFile(3)`` is the filename for blade 3, respectively; the latter is not @@ -443,19 +438,19 @@ permits modeling of aerodynamic imbalances. Hub Properties ~~~~~~~~~~~~~~ The input parameters in this section pertain to the calculation of buoyant loads -on the hub and are only used when ``Buoyancy = TRUE``. +on the hub. ``VolHub`` is the volume of the hub and ``HubCenBx`` is the x offset of the hub center of buoyancy from the hub center in local hub coordinates; offsets in the y and z directions are assumed to be zero. To neglect buoyant loads on the hub, set ``VolHub`` to 0. -Since the hub and blades are joined elements, hub buoyancy should be turned on if blade buoyancy is on, and vice versa. +Since the hub and blades are joined elements, hub buoyancy should be included if blade buoyancy is included, and vice versa. Nacelle Properties ~~~~~~~~~~~~~~~~~~ The input parameters in this section pertain to the calculation of buoyant and drag loads -on the nacelle and are only used when ``Buoyancy = TRUE`` or ``NacelleDrag = TRUE``. +on the nacelle and are only used when ``MHK > 0`` or ``NacelleDrag = TRUE``. ``VolNac`` is the volume of the nacelle and ``NacCenB``` is the position (x,y,z vector) of the nacelle center of buoyancy from @@ -492,8 +487,8 @@ Tower Influence and Aerodynamics ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The input parameters in this section pertain to the tower influence, tower drag, -and/or tower buoyancy calculations and are only used when ``TwrPotent`` > -0, ``TwrShadow`` > 0, ``TwrAero = TRUE``, or ``Buoyancy = TRUE``. +tower buoyancy, tower added mass, and/or tower fluid inertia calculations and are only used when ``TwrPotent`` > +0, ``TwrShadow`` > 0, ``TwrAero = TRUE``, ``MHK = 1``, or ``MHK = 2``. ``NumTwrNds`` is the user-specified number of tower analysis nodes and determines the number of rows in the subsequent table (after two table @@ -507,7 +502,9 @@ to MSL for offshore wind and floating MHK turbines or relative to the seabed for local tower drag-force coefficient, ``TwrTI`` specifies the turbulence intensity used in the Eames tower shadow model (``TwrShadow`` = 2) as a fraction (rather than a percentage) of the -wind fluctuation, and ``TwrCb`` specifies the tower buoyancy coefficient. +wind fluctuation, ``TwrCb`` specifies the tower buoyancy coefficient, +``TwrCp`` specifies the tower dynamic pressure coefficient, and +``TwrCa`` specifies the tower added mass coefficient. ``TwrElev`` must be entered in monotonically increasing order—from the lowest (tower-base) to the highest (tower-top) elevation. For floating MHK turbines with the tower below MSL, tower nodes should be entered as increasingly negative values, @@ -519,7 +516,9 @@ defined at each node as the cross-sectional area of the tower divided by the area of a circle with diameter equal to the characteristic length of the tower cross section (i.e., ``TwrDiam``). For towers with circular cross-sections, ``TwrCb`` will likely be 1.0 at each node. To neglect buoyant loads on the -tower, set ``TwrCb`` to 0. See :numref:`ad_tower_geom`. +tower, set ``TwrCb`` to 0. To neglect added mass loads on the +tower, set ``TwrCa`` to 0. To neglect fluid inertia loads on the +tower, set ``TwrCp`` to 0. See :numref:`ad_tower_geom`. .. _AD-Outputs: @@ -903,8 +902,9 @@ Blade Data Input File --------------------- The blade data input file contains the nodal discretization, geometry, -twist, chord, airfoil identifier, and buoyancy properties for a blade. Separate -files are used for each blade, which permits modeling of aerodynamic imbalances. +twist, chord, airfoil identifier, and buoyancy/added mass/fluid inertia +properties for a blade. Separate files are used for each blade, which +permits modeling of aerodynamic imbalances. A sample blade data input file is given in :numref:`ad_appendix`. The input file begins with two lines of header information which is for @@ -958,18 +958,37 @@ nodes. For each node: table in the AeroDyn primary input file); multiple blade nodes can use the same airfoil data; +- ``t_c`` specifies the blade thickness-to-chord ratio, used to calculate the + reference cross-sectional area for added mass and fluid inertia loads, cannot be less than 0; + - ``BlCb`` specifies the blade buoyancy coefficient, defined as the local cross-sectional area of the blade divided by the area of a circle with diameter equal to ``BlChord``; to neglect buoyant loads on the blade, - set ``BlCb`` to 0; since the blades and hub are joined elements, blade buoyancy should be turned on if hub buoyancy is on, and vice versa; + set ``BlCb`` to 0; since the blades and hub are joined elements, + blade buoyancy should be included if hub buoyancy is included, and vice versa; - ``BlCenBn`` specifies the offset of the blade center of buoyancy from the aerodynamic center in the direction normal to the chord (positive pointing - toward the suction side of the blade); and + toward the suction side of the blade); - ``BlCenBt`` specifies the offset of the blade center of buoyancy from the aerodynamic center in the direction tangential to the chord - (positive pointing toward the trailing edge of the blade). + (positive pointing toward the trailing edge of the blade); + +- ``BlCpn`` specifies the blade normal-to-chord dynamic pressure coefficient; + to neglect normal-to-chord fluid inertia loads on the blade, set ``BlCpn`` to 0; + +- ``BlCpt`` specifies the blade tangential-to-chord dynamic pressure coefficient; + to neglect tangential-to-chord fluid inertia loads on the blade, set ``BlCpt`` to 0; + +- ``BlCan`` specifies the blade normal-to-chord added mass coefficient, cannot be less than 0; + to neglect normal-to-chord added mass loads on the blade, set ``BlCan`` to 0; + +- ``BlCat`` specifies the blade tangential-to-chord added mass coefficient, cannot be less than 0; + to neglect tangential-to-chord added mass loads on the blade, set ``BlCat`` to 0; and + +- ``BlCam`` specifies the blade pitch added mass coefficient, cannot be less than 0; + to neglect pitch added mass loads on the blade, set ``BlCam`` to 0. See :numref:`ad_blade_geom`. Twist is shown in :numref:`ad_blade_local_cs` of :numref:`ad_appendix`. diff --git a/docs/source/user/aerodyn/introduction.rst b/docs/source/user/aerodyn/introduction.rst index d4f845f374..0aadd67e9d 100644 --- a/docs/source/user/aerodyn/introduction.rst +++ b/docs/source/user/aerodyn/introduction.rst @@ -14,13 +14,13 @@ However, the module equally applies to the hydrodynamics of marine hydrokinetic (MHK) turbines (the terms “wind turbineâ€, “towerâ€, “aerodynamics†etc. in this document imply “MHK turbineâ€, “MHK support structureâ€, “hydrodynamics†etc. for MHK turbines). Additional physics important for MHK turbines, not applicable to -wind turbines, computed by AeroDyn include a cavitation check and buoyant forces -and moments on the blades, tower, hub, and nacelle. This -documentation pertains version of AeroDyn in the OpenFAST github repository. -The AeroDyn version released of OpenFAST 1.0.0 is most closely related to -AeroDyn version 15 in the legacy version numbering. AeroDyn version 15 was a -complete overhaul from earlier version of AeroDyn. AeroDyn version 15 and newer -follows the requirements of the FAST modularization framework. +wind turbines, computed by AeroDyn include a cavitation check, buoyant forces +and moments on the blades, tower, hub, and nacelle, and added mass and inertia +forces and moments on the blades and tower. This documentation pertains to the version +of AeroDyn in the OpenFAST github repository. The AeroDyn version released with OpenFAST +1.0.0 is most closely related to AeroDyn version 15 in the legacy version numbering. +AeroDyn version 15 was a complete overhaul from earlier versions of AeroDyn. +AeroDyn version 15 and newer follow the requirements of the FAST modularization framework. AeroDyn calculates aerodynamic loads on both the blades and tower. Aerodynamic calculations within AeroDyn are based on the principles of @@ -67,14 +67,15 @@ and returns them back to OpenFAST as part of the aero-elastic calculation. In standalone mode, the inputs to AeroDyn are prescribed by a simple driver code, without aero-elastic coupling. -AeroDyn consists of six submodels: (1) rotor wake/induction, (2) blade +AeroDyn consists of seven submodels: (1) rotor wake/induction, (2) blade airfoil aerodynamics, (3) tower influence on the fluid local to the -blade nodes, (4) tower and nacelle drag, (5) aeroacoustics, -and (6) buoyancy on the blades, hub, nacelle, and tower (for MHK turbines). -Nacelle, hub, and tail-vane fluid influence and loading (with the exception -of nacelle and hub buoyant loads) and wake and array effects between -multiple turbines in a wind plant are not yet available in AeroDyn. -Aeroacoustics are not available for MHK turbines. +blade nodes, (4) tower and nacelle drag, (5) aeroacoustics, (6) buoyancy +on the blades, hub, nacelle, and tower (for MHK turbines), and (7) added +mass and fluid inertia on the blades and tower (for MHK turbines). Nacelle, hub, +and tail-vane fluid influence and loading (with the exception +of nacelle drag and nacelle and hub buoyant loads) and wake and array +effects between multiple turbines in a wind plant are not yet available +in AeroDyn. Aeroacoustics are not available for MHK turbines. For operating wind and MHK turbine rotors, AeroDyn calculates the influence of the wake via induction factors based on the quasi-steady diff --git a/docs/source/user/aerodyn/theory.rst b/docs/source/user/aerodyn/theory.rst index edd4aa2f1f..606804a236 100644 --- a/docs/source/user/aerodyn/theory.rst +++ b/docs/source/user/aerodyn/theory.rst @@ -214,3 +214,84 @@ The buoyancy calculation for the hub and nacelle is completed according to the f 4. Move buoyant loads from the center of buoyancy to the aerodynamic center 5. For the hub, correct loads to account for the joints with each blade 6. For the nacelle, correct loads to account for the joint with the tower + +.. _AD_addedmass_inertia: + +Added Mass and Fluid Inertia +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Added mass loads are caused by body and fluid accelerations. +These forces can often be neglected in less dense fluids, such as air, but can be significant in denser +fluids, such as water. To capture the effects of these forces on MHK turbines, +added mass and fluid inertia loads are calculated for the turbine blades and tower. +Per-unit-length loads are estimated at each blade or tower node by calculating the added mass and fluid inertia +forces according to the appropriate terms from Morison's equation. The resulting loads are summed with the +previously calculated hydrodynamic and/or buoyant per-unit-length loads. +Loads for the blades are applied at the aerodynamic center. Loads for the tower are applied at the centerline. +Marine growth and end effects are neglected, and members are not allowed to cross the free surface +(i.e., members are always fully submerged). Ballast is not considered. Nodes do not need to be uniformly spaced, +and axial loads are neglected. The tower is assumed to be axisymmetric (with the same coefficients used in both transverse directions), +but the blade is not (with different coefficients normal and tangential to the chord, as well as an added mass coefficient for pitch). + +.. _AD_addedmass_inertia_Morison: + +Morison's Equation +------------------ +Added mass and fluid inertia loads are calculated according to the appropriate terms from Morison's equation. The added mass force is given as + +.. math:: + F_{a} = \rho C_a V (\dot{u} - \dot{v}) + +where :math:`\rho` is the fluid density, :math:`C_a` is the added mass coefficient, :math:`V` is the element volume, :math:`\dot{u}` is the +fluid acceleration, and :math:`\dot{v}` is the body acceleration. + +The fluid inertia force is given as + +.. math:: + F_{i} = \rho C_p V \dot{u} + +where :math:`C_p` is the dynamic pressure coefficient. + +The fluid density and added mass and dynamic pressure coefficients are user-specified. Added mass and fluid +inertia loads can be turned off by setting the relevant coefficients to zero. Additional information about calculating added mass coefficients can be +found in :numref:`AD_user_guide` ("Determination of Added Mass Coefficients for Floating Hydrokinetic Turbine Blades using Computational Fluid Dynamics"). +The body and fluid accelerations are calculated internally and passed to AeroDyn. Body accelerations are available from the structural solver (or driver), +and fluid accelerations are calculated based on the inflow velocity time series. Added mass and fluid inertia loads are calculated as per-unit-length within +AeroDyn. Therefore, :math:`V` is taken as the cross-sectional area at the node of interest. For the blades, the reference cross-sectional area for the normal +and tangential terms is chord*thickness (:math:`ct`). This is expressed as :math:`(c^2)(t/c)`, where :math:`t/c` (i.e., ``t_c``) is specified +in the AeroDyn blade input file and cannot be less than 0. For the tower, the reference cross-sectional area is :math:`\pi r^2` where :math:`r` +is calculated as (0.5 ``TwrDiam``). The normalization for the ``BlCpn``, ``BlCpt``, ``BlCan``, and ``BlCat`` coefficients should be :math:`\rho ct`; +the normalization for the ``BlCam`` coefficient should be :math:`(1/12)\rho ct(c^2+t^2)`; and the normalization for the ``TwrCp`` and ``TwrCa`` coefficients should +be :math:`\rho\pi(0.5` ``TwrDiam``) :math:`^2`. + +Blade Added Mass and Fluid Inertia +---------------------------------- +Added mass and fluid inertia loads are calculated for the normal-to-chord, tangential-to-chord, and pitch directions in the blade coordinate system. +The following coefficients are defined by the user in the AeroDyn blade input file: + +- ``BlCpn`` specifies the blade normal-to-chord dynamic pressure coefficient; + to neglect normal-to-chord fluid inertia loads on the blade, set ``BlCpn`` to 0 + +- ``BlCpt`` specifies the blade tangential-to-chord dynamic pressure coefficient; + to neglect tangential-to-chord fluid inertia loads on the blade, set ``BlCpt`` to 0 + +- ``BlCan`` specifies the blade normal-to-chord added mass coefficient, cannot be less than 0; + to neglect normal-to-chord added mass loads on the blade, set ``BlCan`` to 0 + +- ``BlCat`` specifies the blade tangential-to-chord added mass coefficient, cannot be less than 0; + to neglect tangential-to-chord added mass loads on the blade, set ``BlCat`` to 0 + +- ``BlCam`` specifies the blade pitch added mass coefficient, cannot be less than 0; + to neglect pitch added mass loads on the blade, set ``BlCam`` to 0 + +Tower Added Mass and Fluid Inertia +---------------------------------- +Added mass and fluid inertia loads are calculated for the transverse direction in the tower coordinate system. +The following coefficients are defined by the user in the AeroDyn primary input file: + +- ``TwrCp`` specifies the tower transverse dynamic pressure coefficient; + to neglect fluid inertia loads on the tower, set ``TwrCp`` to 0 + +- ``TwrCa`` specifies the tower transverse added mass coefficient, cannot be less than 0; + to neglect added mass loads on the tower, set ``TwrCa`` to 0 + diff --git a/docs/source/user/api_change.rst b/docs/source/user/api_change.rst index ca51edbf05..a00a37e1fa 100644 --- a/docs/source/user/api_change.rst +++ b/docs/source/user/api_change.rst @@ -9,6 +9,129 @@ The changes are tabulated according to the module input file, line number, and f The line number corresponds to the resulting line number after all changes are implemented. Thus, be sure to implement each in order so that subsequent line numbers are correct. +OpenFAST v4.2.x to OpenFAST v5.0.0 +----------------------------------- + +Added mass and fluid inertia loads were added to the rotor blades and tower in AeroDyn. +This results in new columns in the AeroDyn blade input file and new columns in the +"Tower Influence and Aerodynamics" section of the AeroDyn primary input file. Given the +addition of these loads, the Buoyancy flag was also removed, and the buoyancy, added mass, +and inertia loads can all be turned off by setting the appropriate coefficients to zero +rather than via a separate flag for each. + +Superposition of wave and current velocities between InflowWind and SeaState was enabled, +which requires a "SeaState Data" section in the AeroDyn driver input file. + +Changes to the OpenFAST input file support multiple rotors in one turbine. Line 16, NRotors, +is required to specify the number of rotors in the turbine. Lines 50-56 specify the +ElastoDyn, BeamDyn, and ServoDyn input files for the second rotor; all other modules use +the input files specified in the first section. The `MirrorRotor` line sets a flag to +reverse the direction the rotor is spinning. The first rotor always spins in the typical direction. +These lines are specified only if NRotors is greater than 1 and are repeated for subsequent rotors. + +============================================= ======== ==================== ======================================================================================================================================================================================================== +Added in OpenFAST `5.0.0` +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +Module Line Flag Name Example Value +============================================= ======== ==================== ======================================================================================================================================================================================================== +OpenFAST 8 ModCoupling 3 ModCoupling - Module coupling method (switch) {1=loose; 2=tight with fixed Jacobian updates (DT_UJac); 3=tight with automatic Jacobian updates} +OpenFAST 11 RhoInf 1.0 RhoInf - Numerical damping parameter for tight coupling generalized-alpha integrator (-) [0.0 to 1.0] +OpenFAST 12 ConvTol 1e-4 ConvTol - Convergence iteration error tolerance for tight coupling generalized alpha integrator (-) +OpenFAST 13 MaxConvIter 6 MaxConvIter - Maximum number of convergence iterations for tight coupling generalized alpha integrator (-) +OpenFAST 17 NRotors 2 NRotors - Number of rotors in turbine (-) +OpenFAST 20 CompSoil 0 CompSoil - Compute soil-structural dynamics (switch) {0=None; 1=SoilDyn} +OpenFAST 29 MirrorRotor F MirrorRotor - Flag to reverse rotor rotation direction [1 to NRotors] {F=Normal, T=Mirror} +OpenFAST 53 SoilFile "SoilDyn.dat" SoilFile - Name of the file containing the SoilDyn input parameters (quoted string) +OpenFAST 54 ---------------------- INPUT FILES Rotor 2 ------------------------------------- +OpenFAST 55 EDFile "ElastoDyn.dat" EDFile - Name of file containing ElastoDyn input parameters (quoted string) +OpenFAST 56 BDBldFile(1) "BeamDyn.dat" BDBldFile(1) - Name of file containing BeamDyn input parameters for blade 1 (quoted string) +OpenFAST 57 BDBldFile(2) "BeamDyn.dat" BDBldFile(2) - Name of file containing BeamDyn input parameters for blade 2 (quoted string) +OpenFAST 58 BDBldFile(3) "BeamDyn.dat" BDBldFile(3) - Name of file containing BeamDyn input parameters for blade 3 (quoted string) +OpenFAST 59 ServoFile "ServoDyn_R2.dat" ServoFile - Name of file containing control and electrical-drive input parameters (quoted string) +AeroDyn blade file t_c 0.8651 [additional column in *Blade Properties* table] +AeroDyn blade file BlCpn 1.0 [additional column in *Blade Properties* table] +AeroDyn blade file BlCpt 1.0 [additional column in *Blade Properties* table] +AeroDyn blade file BlCan 6.8459E+00 [additional column in *Blade Properties* table] +AeroDyn blade file BlCat 5.4605E-01 [additional column in *Blade Properties* table] +AeroDyn blade file BlCam 5.5180E-02 [additional column in *Blade Properties* table] +AeroDyn driver 23 ----- SeaState Data [used only when MHK = 1 or 2] --------------------------------------- +AeroDyn driver 24 CompSeaSt 1 CompSeaSt - Compute wave velocities (switch) {0=No Waves; 1=SeaState} +AeroDyn driver 25 SeaStFile "MHK_RM1_Fixed_SeaState.dat" SeaStFile - Name of the SeaState input file [used only when CompSeaSt=1] +AeroDyn \* TwrCp 1.0 [additional column in *Tower Influence and Aerodynamics* table] +AeroDyn \* TwrCa 1.0 [additional column in *Tower Influence and Aerodynamics* table] +SeaState 18 WvCrntMod 0 WvCrntMod - Combined wave-current modeling option {0: simple superposition, 1: include Doppler effect, 2: include both Doppler effect and wave amplitude/spectrum scaling} (switch) +ElastoDyn 11 PitchDOF False PitchDOF - Blade pitch DOF (flag) +ElastoDyn 70 PtfmRefxt 0 PtfmRefxt - Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters) +ElastoDyn 71 PtfmRefyt 0 PtfmRefyt - Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters) +ElastoDyn 77 PBrIner(1) 200 PBrIner(1) - Pitch bearing/actuator inertia, blade 1 (kg m^2) +ElastoDyn 78 PBrIner(2) 200 PBrIner(2) - Pitch bearing/actuator inertia, blade 2 (kg m^2) +ElastoDyn 79 PBrIner(3) 200 PBrIner(3) - Pitch bearing/actuator inertia, blade 3 (kg m^2) [unused for 2 blades] +ElastoDyn 80 BlPIner(1) 28578 BlPIner(1) - Pitch inertia of an undeflected blade, blade 1 (kg m^2) +ElastoDyn 81 BlPIner(2) 28578 BlPIner(2) - Pitch inertia of an undeflected blade, blade 2 (kg m^2) +ElastoDyn 82 BlPIner(3) 28578 BlPIner(3) - Pitch inertia of an undeflected blade, blade 3 (kg m^2) [unused for 2 blades] +BeamDyn blade file 10 ------ Modal Damping [used only if damp_type=2] -------------------------------- +BeamDyn blade file 11 n_modes 3 n_modes - Number of modal damping coefficients (-) +BeamDyn blade file 12 zeta 0.1, 0.2, 0.3 zeta - Damping coefficients for mode 1 through n_modes +ServoDyn 9 PitNeut(1) 0 PitNeut(1) - Blade 1 neutral pitch position--pitch spring moment is zero at this position *[unused when* **PCMode>0** and **t>=TPCOn** *]* +ServoDyn 10 PitNeut(2) 0 PitNeut(2) - Blade 2 neutral pitch position--pitch spring moment is zero at this position *[unused when* **PCMode>0** and **t>=TPCOn** *]* +ServoDyn 11 PitNeut(3) 0 PitNeut(3) - Blade 3 neutral pitch position--pitch spring moment is zero at this position *[unused when* **PCMode>0** and **t>=TPCOn** *]* *[unused for 2 blades]* +ServoDyn 12 PitSpr(1) 3.6E7 PitSpr(1) - Blade 1 pitch spring constant +ServoDyn 13 PitSpr(2) 3.6E7 PitSpr(2) - Blade 2 pitch spring constant +ServoDyn 14 PitSpr(3) 3.6E7 PitSpr(3) - Blade 3 pitch spring constant *[unused for 2 blades]* +ServoDyn 15 PitDamp(1) 1.4E6 PitDamp(1) - Blade 1 pitch damping constant +ServoDyn 16 PitDamp(2) 1.4E6 PitDamp(2) - Blade 2 pitch damping constant +ServoDyn 17 PitDamp(3) 1.4E6 PitDamp(3) - Blade 3 pitch damping constant *[unused for 2 blades]* +HydroDyn \* HstMod 1 HstMod - Method of computing hydrostatic loads. (0: Up to the still water level. 1: Up to the instantaneous free surface) *[overwrite to 0 when WaveStMod = 0 in SeaState]* +FAST.Farm 35 --- AMBIENT WIND: AMReX MODULE --- [used only for Mod_AmbWind=4] +FAST.Farm 36 WindDirPrefix "inflow/ffboxes" WindDirPrefix - Directory prefix of AMReX wind sub-volumes {0=low-res, 1+=high-res} (quoted string) +FAST.Farm 37 DirStartIndex 00110 DirStartIndex - AMReX sub-volume directory suffix to consider as time=0 (quoted string) +FAST.Farm 38 DT_Low-AMReX 2.0 DT_Low-AMReX - Time step for low-resolution wind data interpolation; will be used as the global FAST.Farm time step (s) [>0.0] +FAST.Farm 39 DT_High-AMReX 1.0 DT_High-AMReX - Time step for high-resolution wind data interpolation (s) [>0.0] +FAST.Farm 50 NumDFull DEFAULT NumDFull - Distance of full wake propagation, expressed as a multiple of RotorDiamRef [>0.0] or DEFAULT [DEFAULT=15] +FAST.Farm 51 NumDBuff DEFAULT NumDBuff - Length of wake propagation buffer region, expressed as a multiple of RotorDiamRef [>=0.0] or DEFAULT [DEFAULT=5] +SoilDyn all New module +============================================= ======== ==================== ======================================================================================================================================================================================================== + + + +============================================= ======== ==================== ======================================================================================================================================================================================================== +Modified in OpenFAST `5.0.0` +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +Module Line Flag Name Example Value +============================================= ======== ==================== ======================================================================================================================================================================================================== +AeroDyn blade file 5 BlSpn BlCrvAC BlSwpAC BlCrvAng BlTwist BlChord BlAFID t_c BlCb BlCenBn BlCenBt BlCpn BlCpt BlCan BlCat BlCam +AeroDyn blade file 6 (m) (m) (m) (deg) (deg) (m) (-) (-) (-) (m) (m) (-) (-) (-) (-) (-) +AeroDyn \* ====== Hub Properties ============================================================================== [used only when MHK=1 or 2] +AeroDyn \* ====== Nacelle Properties ========================================================================== [used only when MHK=1 or 2 or when NacelleDrag=True] +AeroDyn \* ====== Tower Influence and Aerodynamics ============================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] +AeroDyn \* NumTwrNds 5 NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] +AeroDyn \* TwrElev TwrDiam TwrCd TwrTI TwrCb TwrCp TwrCa !TwrTI used only with TwrShadow=2, TwrCb/TwrCp/TwrCa used only with MHK=1 or 2 +AeroDyn \* (m) (m) (-) (-) (-) (-) (-) +============================================= ======== ==================== ======================================================================================================================================================================================================== + + + +============================================= ======== ==================== ======================================================================================================================================================================================================== +Removed in OpenFAST `5.0.0` +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +Module Line Flag Name Example Value +============================================= ======== ==================== ======================================================================================================================================================================================================== +AeroDyn 11 Buoyancy False Buoyancy - Include buoyancy effects? (flag) +BeamDyn \* ---------------------- PITCH ACTUATOR PARAMETERS ------------------------------- +BeamDyn \* UsePitchAct False UsePitchAct - Whether a pitch actuator should be used (flag) +BeamDyn \* PitchJ 200 PitchJ - Pitch actuator inertia (kg-m^2) [used only when UsePitchAct is true] +BeamDyn \* PitchK 20000000 PitchK - Pitch actuator stiffness (kg-m^2/s^2) [used only when UsePitchAct is true] +BeamDyn \* PitchC 500000 PitchC - Pitch actuator damping (kg-m^2/s) [used only when UsePitchAct is true] +ElastoDyn Blade Input File \* The PitchAxis column has been removed from the DISTRIBUTED BLADE PROPERTIES table. The table should now only have 5 columns: BlFract, StrcTwst, BMassDen, FlpStff, and EdgStff +FAST.Farm 50 NumPlanes 140 NumPlanes - Number of wake planes (-) [>=2] +============================================= ======== ==================== ======================================================================================================================================================================================================== + +New Modules in v5.0.0 +~~~~~~~~~~~~~~~~~~~~~ + +- SoilDyn -- a soil interaction module specifically designed to work with the RedWin DLL from NGI for soil interaction. Documentation for this module is limited. + + OpenFAST v4.2.0 to OpenFAST v4.2.1 ---------------------------------- diff --git a/docs/source/user/beamdyn/appendix.rst b/docs/source/user/beamdyn/appendix.rst index 3e282ce5ae..45b943886b 100644 --- a/docs/source/user/beamdyn/appendix.rst +++ b/docs/source/user/beamdyn/appendix.rst @@ -16,6 +16,12 @@ OpenFAST+BeamDyn and stand-alone BeamDyn (static and dynamic) simulations all re :download:`(NREL 5MW static example) `: This file includes information on the numerical-solution parameters (e.g., numerical damping, quadrature rules), and the geometric definition of the beam reference line via "members" and "key points". This file also specifies the "blade input file." 2) BeamDyn blade input file :download:`(NREL 5MW example) `: + This file specifies the blade sectional properties at various stations along the blade. + The file includes stiffness and mass matrices at each station, as well as damping parameters. + Note that the example file uses stiffness-proportional damping (damp_flag = 1). For modal + damping (damp_flag = 2), the n_modes parameter should be set to a non-zero value and + followed by the corresponding modal damping ratios (zeta values) represented as the + fraction of critical damping. Stand-alone BeamDyn simulation also require a driver input file; we list here examples for static and dynamic simulations: @@ -56,3 +62,21 @@ outputs are expressed in one of the following three coordinate systems: :align: center BeamDyn Output Channel List + +.. note:: + + **New Output Channels (v5.0 and later):** + + BeamDyn now includes additional output channels for applied loads mapped to the root node. + These channels provide the total applied loads (both distributed and point loads) resolved + at the root of the blade, expressed in both the root coordinate system (r) and global + inertial frame (g): + + - **RootAppliedFxr, RootAppliedFyr, RootAppliedFzr**: Applied force components in r-frame + - **RootAppliedMxr, RootAppliedMyr, RootAppliedMzr**: Applied moment components in r-frame + - **RootAppliedFxg, RootAppliedFyg, RootAppliedFzg**: Applied force components in g-frame + - **RootAppliedMxg, RootAppliedMyg, RootAppliedMzg**: Applied moment components in g-frame + + These outputs are useful for understanding the total aerodynamic and other external loads + acting on the blade, particularly when diagnosing load imbalances or validating force + distributions. diff --git a/docs/source/user/beamdyn/examples/nrel_5mw_blade.inp b/docs/source/user/beamdyn/examples/nrel_5mw_blade.inp index 24e2192f2a..0a5ebced03 100644 --- a/docs/source/user/beamdyn/examples/nrel_5mw_blade.inp +++ b/docs/source/user/beamdyn/examples/nrel_5mw_blade.inp @@ -1,13 +1,16 @@ ------- BEAMDYN V1.00.* INDIVIDUAL BLADE INPUT FILE -------------------------- NREL 5MW Blade - ---------------------- BLADE PARAMETERS -------------------------------------- -49 station_total - Number of blade input stations (-) - 1 damp_flag - Damping flag: 0: no damping; 1: damped - ---------------------- DAMPING COEFFICIENT------------------------------------ +------ Blade Parameters -------------------------------------------------------- +49 station_total - Number of blade input stations (-) +1 damp_type - Damping type (switch) {0: none, 1: stiffness-proportional, 2: modal} +------ Stiffness-Proportional Damping [used only if damp_type=1] --------------- mu1 mu2 mu3 mu4 mu5 mu6 (-) (-) (-) (-) (-) (-) -1.0E-03 1.0E-03 1.0E-03 0.0014 0.0022 0.0022 - ---------------------- DISTRIBUTED PROPERTIES--------------------------------- +1.0E-03 1.0E-03 1.0E-03 0.0014 0.0022 0.0022 +------ Modal Damping [used only if damp_type=2] -------------------------------- +4 n_modes - Number of modal damping coefficients (-) +0.01 0.02 0.03 0.04 zeta - Damping coefficients for mode 1 through n_modes +------ Distributed Properties -------------------------------------------------- 0.000000 9.729480E+08 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 9.729480E+08 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/docs/source/user/beamdyn/index.rst b/docs/source/user/beamdyn/index.rst index ce14098d1c..616891821c 100644 --- a/docs/source/user/beamdyn/index.rst +++ b/docs/source/user/beamdyn/index.rst @@ -12,7 +12,7 @@ can be downladed from the list below. - :download:`BeamDyn inputs from sectional beam properties <../../../OtherSupporting/BeamDyn/beamdyn_inputs_sectional_props.pdf>` The authors are grateful to the U.S. Department of Energy Wind and Water -Power Program and the NREL Laboratory Directed Research and Development +Power Program and the NLR Laboratory Directed Research and Development (LDRD) program through the grant “High-Fidelity Computational Modeling of Wind-Turbine Structural Dynamics†for supporting the development of this software. diff --git a/docs/source/user/beamdyn/input_files.rst b/docs/source/user/beamdyn/input_files.rst index 2982145b09..412e921555 100644 --- a/docs/source/user/beamdyn/input_files.rst +++ b/docs/source/user/beamdyn/input_files.rst @@ -215,15 +215,22 @@ contents of the BeamDyn input file (useful for debugging errors in the input file). The ``QuasiStaticInit`` flag indicates if BeamDyn should perform a quasi-static -solution at initialization to better initialize its states. In general, this should -be set to true for better numerical performance (it reduces startup transients). +solution at initialization to better initialize its states. This option is only +available when coupled to OpenFAST with dynamic analysis enabled. When set to ``TRUE``, +BeamDyn will perform a steady-state startup (SSS) solve that includes centripetal +accelerations to reduce startup transients and improve numerical performance. This +is particularly useful for rotating blade simulations where the initial conditions +would otherwise cause spurious transients. The keyword "DEFAULT" sets this to ``FALSE``. ``rhoinf`` specifies the numerical damping parameter (spectral radius of the amplification matrix) in the range of :math:`[0.0,1.0]` used in the generalized-\ :math:`\alpha` time integrator implemented in BeamDyn -for dynamic analysis. For ``rhoinf = 1.0``, no -numerical damping is introduced and the generalized-\ :math:`\alpha` -scheme is identical to the Newmark scheme; for +for dynamic analysis. **Note: This parameter is only used when BeamDyn is run +in loose coupling mode (e.g., stand-alone with the driver or when loose coupling +is explicitly selected in OpenFAST). When tight coupling is used in OpenFAST, +time integration is handled by the glue code and this parameter is ignored.** +For ``rhoinf = 1.0``, no numerical damping is introduced and the +generalized-\ :math:`\alpha` scheme is identical to the Newmark scheme; for ``rhoinf = 0.0``, maximum numerical damping is introduced. Numerical damping may help produce numerically stable solutions. @@ -245,9 +252,11 @@ between two input stations into “Refine factor†of segments. The keyword This entry is not used in Gauss quadrature. ``N_Fact`` specifies a parameter used in the modified Newton-Raphson -scheme. If ``N_Fact = 1`` a full Newton -iteration scheme is used, i.e., the global tangent stiffness matrix is -computed and factorized at each iteration; if +scheme. **Note: This parameter is only used when BeamDyn is run in loose coupling +mode (stand-alone with the driver or when loose coupling is explicitly selected in +OpenFAST). When tight coupling is used in OpenFAST, this parameter is ignored.** +If ``N_Fact = 1`` a full Newton iteration scheme is used, i.e., the global tangent +stiffness matrix is computed and factorized at each iteration; if ``N_Fact > 1`` a modified Newton iteration scheme is used, i.e., the global stiffness matrix is computed and factorized every ``N_Fact`` iterations within each time step. The @@ -265,15 +274,19 @@ load steps as opposed to one single large load step which may cause divergence o Newton-Raphson scheme. The keyword “DEFAULT†sets ``load_retries = 20``. ``NRMax`` specifies the maximum number of iterations per time step in -the Newton-Raphson scheme. If convergence is not reached within this -number of iterations, BeamDyn returns an error message and terminates -the simulation. The keyword “DEFAULT†sets +the Newton-Raphson scheme. **Note: This parameter is only used when BeamDyn is run +in loose coupling mode (stand-alone with the driver or when loose coupling is explicitly +selected in OpenFAST). When tight coupling is used in OpenFAST, this parameter is ignored.** +If convergence is not reached within this number of iterations, BeamDyn returns an error +message and terminates the simulation. The keyword "DEFAULT" sets ``NRMax = 10``. ``Stop_Tol`` specifies a tolerance parameter used in convergence criteria of a nonlinear solution that is used for the termination of the -iteration. The keyword “DEFAULT†sets -``Stop_Tol = 1.0E-05``. Please refer to +iteration. **Note: This parameter is only used when BeamDyn is run in loose coupling +mode (stand-alone with the driver or when loose coupling is explicitly selected in +OpenFAST). When tight coupling is used in OpenFAST, this parameter is ignored.** +The keyword "DEFAULT" sets ``Stop_Tol = 1.0E-05``. Please refer to :numref:`convergence-criterion` for more details. ``tngt_stf_fd`` is a boolean that sets the flag to compute the tangent stiffness @@ -401,20 +414,6 @@ Material Parameter ``BldFile`` is the file name of the blade input file. This name should be in quotations and can contain an absolute path or a relative path. -Pitch Actuator Parameter -~~~~~~~~~~~~~~~~~~~~~~~~ - -In this release, the pitch actuator implemented in BeamDyn is not -available. The ``UsePitchAct`` should be set to “FALSE†in this -version, whereby the input blade-pitch angle prescribed by the driver -code is used to orient the blade directly. ``PitchJ``, ``PitchK``, -and ``PitchC`` specify the pitch actuator inertial, stiffness, and -damping coefficient, respectively. In future releases, specifying -``UsePitchAct`` :math:`=` TRUE will enable a second-order pitch -actuator, whereby the pitch angular orientation, velocity, and -acceleration are determined by the actuator based on the input -blade-pitch angle prescribed by the driver code. - .. _BD-Outputs: Outputs @@ -482,18 +481,26 @@ Blade Parameters ``Station_Total`` specifies the number cross-sectional stations along the blade axis used in the analysis. -``Damp_Type`` specifies if structural damping is considered in the -analysis. If ``Damp_Type = 0``, then no damping is -considered in the analysis and the six damping coefficient in the next -section will be ignored. If ``Damp_Type = 1``, structural -damping will be included in the analysis. +``damp_type`` specifies the type of structural damping to be used in the +analysis. There are three options: -Damping Coefficient -~~~~~~~~~~~~~~~~~~~ +- ``damp_type = 0``: No damping is considered in the analysis. The damping + coefficients in the following sections will be ignored. +- ``damp_type = 1``: Stiffness-proportional damping is applied. + The six damping coefficients (``beta``) in the Stiffness-Proportional Damping + section are used to scale the 6x6 stiffness matrix at each cross section. +- ``damp_type = 2``: Modal damping is applied. The modal fractions of critical damping + (``zeta``) for the first ``n_modes`` modes are used. BeamDyn internally computes + the modal properties and applies damping in the modal coordinates. + +Stiffness-Proportional Damping Coefficients +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -This section specifies six damping coefficients, :math:`\mu_{ii}` with +This section specifies six damping coefficients, :math:`\mu_{ii}` (also called ``beta``) with :math:`i \in [1,6]`, for six DOFs (three translations and three -rotations). Viscous damping is implemented in BeamDyn where the damping +rotations). These coefficients are only used when ``damp_flag = 1``. + +Viscous damping is implemented in BeamDyn where the damping forces are proportional to the strain rate. These are stiffness-proportional damping coefficients, whereby the :math:`6\times6` damping matrix at each cross section is scaled from the @@ -524,6 +531,53 @@ coefficient matrix defined as 0 & 0 & 0 & 0 & 0 & \mu_{66} \\ \end{bmatrix} +Modal Damping Coefficients +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This section specifies modal damping parameters and is only used when ``damp_flag = 2``. + +``n_modes`` specifies the number of modes for which modal damping coefficients +are provided. BeamDyn will compute the natural frequencies and mode shapes of the +blade and apply damping in the modal coordinates. + +``zeta`` is an array of ``n_modes`` modal damping ratios, one for each mode. +Each value should typically be between 0.0 (no damping) and 1.0 (critical damping), +though higher values are permitted. Common values for composite blade structures +are less than 0.05 (less than 5% of critical damping). The damping +ratios are applied to modes 1 through ``n_modes`` in order of increasing frequency. + +After ``n_modes`` damping values are assigned that grow proportional to the modal +natural frequency. This proportionality is assigned to match the ``zeta`` value +of last mode with prescribed damping. + +If modal damping is selected, BeamDyn calculates nodal damping forces based on the node velocities, +rotated to the initial node orientation, and the mode shape after quasi-static initialization has been performed, +if it was requested. These nodal damping forces are then transformed back to the current node orientation. + +When using modal damping, ``PitchDOF`` needs to be set to ``TRUE`` in ElastoDyn to give BeamDyn +a correct root pitch velocity. Otherwise, blade pitching will give spurious damping behavior. + +Recommendations: + +- It is recommended to stop inputting zeta values before reaching the first axial mode (typically around 18 modes). + Users may experiment with including more or fewer modes to observe the effect on results. +- Avoid prescribing a final zeta value of 1.0 (e.g., do not specify 18 modes with realistic zeta values followed by a 19th mode with zeta=1.0), as this can significantly degrade result quality. +- When attempting to match stiffness-proportional damping (:math:`\mu`), the OpenFAST toolbox may fail to + provide reliable damping values matched with mode numbers once some modes become critically damped. + Reducing the number of modes (e.g., from 40 to 30) can help if higher modes are indexed incorrectly. +- In some cases, axial loads appear to be driven by the axial motion of non-axial modes. +- Verify that the modal frequencies and modal participation factors output in ``InputFile.BD.R*.B*.modes.csv`` file are consistent with the expected modes. + This file is only output when modal damping is used. + The number of output modes in this file is equal to the degrees of freedom of the blade. + However, modes tend to become numerical artifacts past the first few modes of a given type. + +Notes: + +- Modal damping is experimental in OpenFAST 5.0, so should be used with care. +- Modal damping is mainly supported for tight coupling with OpenFAST. +- In some cases, when used with loose coupling or BeamDyn Driver, a much smaller time step may be needed to get reaction forces to converge with the tight coupling case and/or stiffness-proportional damping (:math:`\mu`) case. +- Output forces internal forces from BeamDyn at quadrature points do not capture contributions from the modal damping forces. + Distributed Properties ~~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/user/beamdyn/introduction.rst b/docs/source/user/beamdyn/introduction.rst index 95e54cfc36..b6e6c724f8 100644 --- a/docs/source/user/beamdyn/introduction.rst +++ b/docs/source/user/beamdyn/introduction.rst @@ -4,15 +4,15 @@ Introduction ============ BeamDyn is a time-domain structural-dynamics module for slender -structures created by the National Renewable Energy Laboratory (NREL) -through support from the U.S. Department of Energy Wind and Water Power -Program and the NREL Laboratory Directed Research and Development (LDRD) +structures created by the National Laboratory of the Rockies (NLR) +through support from the U.S. Department of Energy Wind and Water Power +Program and the NLR Laboratory Directed Research and Development (LDRD) program through the grant “High-Fidelity Computational Modeling of -Wind-Turbine Structural Dynamicsâ€, see References :cite:`Wang:SFE2013,Wang:GEBT2013,Wang:GEBT2014,Wang:2015`. +Wind-Turbine Structural Dynamicsâ€, see References :cite:`Wang:SFE2013,Wang:GEBT2013,Wang:GEBT2014,Wang:2015`. The module has been coupled into the FAST aero-hydro-servo-elastic wind turbine multi-physics engineering tool where it used to model blade structural dynamics. The BeamDyn module follows the requirements of the -FAST modularization framework, see References :cite:`Jonkman:2013`; +FAST modularization framework, see References :cite:`Jonkman:2013`; :cite:`Sprague:2013,Sprague:2014,website:FASTModularizationFramework`, couples to FAST version 8, and provides new capabilities for modeling initially curved and twisted composite wind turbine blades undergoing @@ -64,7 +64,7 @@ outputs the blade displacements, velocities, and accelerations along the beam length, which are used by AeroDyn to calculate the local aerodynamic loads (distributed along the length) that are used as inputs for BeamDyn. In addition, BeamDyn can calculate member internal reaction -loads, as requested by the user. Please refers to Figure [fig:FlowChart] +loads, as requested by the user. Please refers to Figure [fig:FlowChart] for the coupled interactions between BeamDyn and other modules in FAST. When coupled to FAST, BeamDyn replaces the more simplified blade structural model of ElastoDyn that is still available as an option, but @@ -100,12 +100,12 @@ loads specified at FE nodes, or a combination of the two. When BeamDyn is coupled to FAST, the blade analysis node discretization may be independent between BeamDyn and AeroDyn. -This document is organized as follows. Section :ref:`running-beamdyn` details how to +This document is organized as follows. Section :ref:`running-beamdyn` details how to obtain the BeamDyn and FAST software archives and run either the stand-alone version of BeamDyn or BeamDyn coupled to FAST. -Section :ref:`bd-input-files` describes the BeamDyn input files. -Section :ref:`bd-output-files` discusses the output files generated by -BeamDyn. Section :ref:`beamdyn-theory` summarizes the BeamDyn theory. -Section :ref:`bd-future-work` outlines potential future work. Example input -files are shown in Appendix :numref:`bd_input_files`. -A summary of available output channels is found in Appendix :ref:`app-output-channel`. +Section :ref:`bd-input-files` describes the BeamDyn input files. +Section :ref:`bd-output-files` discusses the output files generated by +BeamDyn. Section :ref:`beamdyn-theory` summarizes the BeamDyn theory. +Section :ref:`bd-future-work` outlines potential future work. Example input +files are shown in Appendix :numref:`bd_input_files`. +A summary of available output channels is found in Appendix :ref:`app-output-channel`. diff --git a/docs/source/user/beamdyn/output_files.rst b/docs/source/user/beamdyn/output_files.rst index 82a13535fd..a9f9e5dd48 100644 --- a/docs/source/user/beamdyn/output_files.rst +++ b/docs/source/user/beamdyn/output_files.rst @@ -26,7 +26,7 @@ Summary File In stand-alone mode, BeamDyn generates a summary file with the naming convention, ``InputFile.sum`` if the ``SumPrint`` parameter is set to TRUE. When coupled to FAST, the summary file is named -``InputFile.BD.sum``. This file summarizes key information about the +``InputFile.BD.R*.B*.sum.yaml``. This file summarizes key information about the simulation, including: - Blade mass. diff --git a/docs/source/user/beamdyn/running_bd.rst b/docs/source/user/beamdyn/running_bd.rst index a2885315fc..2f0d767aba 100644 --- a/docs/source/user/beamdyn/running_bd.rst +++ b/docs/source/user/beamdyn/running_bd.rst @@ -14,41 +14,10 @@ There are two forms of the BeamDyn software to choose from: stand-alone and coupled to the FAST simulator. Although the user may not necessarily need both forms, he/she would likely need to be familiar with and run the stand-alone model if building a model of the blade from scratch. The -stand-alone version is also helpful for model troubleshooting, even if +stand-alone driver is also helpful for model troubleshooting, even if the goal is to conduct aero-hydro-servo-elastic simulations of onshore/offshore wind turbines within FAST. -Stand-Alone BeamDyn Archive -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Users can download the stand-alone BeamDyn archive from our Web server -at https://nwtc.nrel.gov/BeamDyn. The file has a name similar to -``BD_v1.00.00a.exe``, but may have a different version number. The user -can then download the self-extracting archive (*.exe*) to expand the -archive into a folder he/she specifies. - -The archive contains the ``bin``, ``CertTest``, ``Compiling``, -``Docs``, and ``Source`` folders. The ``bin`` folder includes the -main executable file, ``BeamDyn_Driver.exe``, which is used to execute -the stand-alone BeamDyn program. The ``CertTest`` folder contains a -collection of sample BeamDyn input files and driver input files that can -be used as templates for the user’s own models. This document may be -found in the ``Docs`` folder. The ``Compiling`` folder contains files -for compiling the stand-alone ``BeamDyn_v1.00.00.exe`` file with either -Visual Studio or gFortran. The Fortran source code is located in the -``Source`` folder. - -FAST Archive -~~~~~~~~~~~~ - -Download the FAST archive, which includes BeamDyn, from our Web server -at https://nwtc.nrel.gov/FAST8. The file has a name similar to -``FAST_v8.12.00.exe``, but may have a different version number. Run the -downloaded self-extracting archive (``.exe``) to expand the archive into a -user-specified folder. The FAST executable file is located in the -archive’s ``bin`` folder. An example model using the NREL 5-MW -reference turbine is located in the ``CertTest`` folder. - Running BeamDyn --------------- @@ -56,7 +25,7 @@ Running the Stand-Alone BeamDyn Program ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The stand-alone BeamDyn program, ``BeamDyn_Driver.exe``, simulates static -and dynamic responses of the user’s input model, without coupling to +and dynamic responses of the user's input model, without coupling to FAST. Unlike the coupled version, the stand-alone software requires the use of a driver file in addition to the primary and blade BeamDyn input files. This driver file specifies inputs normally provided to BeamDyn by @@ -78,12 +47,12 @@ file, as described in Section :ref:`driver-input-file`. Running BeamDyn Coupled to FAST ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Run the coupled FAST software from a DOS command prompt by typing, for +Run the coupled FAST software from a command prompt by typing, for example: .. code-block:: bash - >FAST_Win32.exe Test26.fst + >openfast.exe Test26.fst where ``Test26.fst`` is the name of the primary FAST input file. This input file has a feature switch to enable or disable the BeamDyn diff --git a/docs/source/user/beamdyn/theory.rst b/docs/source/user/beamdyn/theory.rst index 78d14e6936..7257d395d9 100644 --- a/docs/source/user/beamdyn/theory.rst +++ b/docs/source/user/beamdyn/theory.rst @@ -27,7 +27,7 @@ Coordinate Systems :width: 100% :align: center - Global, blade reference, and internal coordinate systems in BeamDyn. Illustration by Al Hicks, NREL. + Global, blade reference, and internal coordinate systems in BeamDyn. Illustration by Al Hicks, NLR. Global Coordinate System @@ -605,6 +605,46 @@ where :math:`{\underline{\underline{O}}}_{12}` and matrices of :math:`\mathcal{{\underline{\underline{O}}}}` and :math:`\mathcal{{\underline{\underline{G}}}}` as :math:`{\underline{\underline{C}}}_{12}` in Eq. :eq:`E1-PartC`. +Modal Damping +------------- + +In addition to the stiffness-proportional viscous damping described above, BeamDyn +also supports modal damping. This is currently only supported when run in tight coupling +with OpenFAST. When modal damping is selected (``damp_flag = 2``), +BeamDyn computes the natural frequencies and mode shapes of the blade and applies +damping in the modal coordinates. + +The modal damping approach constructs a damping matrix :math:`{\underline{\underline{C}}}_{modal}` +based on user-specified modal damping ratios :math:`\zeta_i` for modes :math:`i = 1, 2, \ldots, n_{modes}`. +Past the user-specified :math:`n_{modes}`, BeamDyn assigns :math:`\zeta_i` to grow proportional to the +modal natural frequency and match the last prescribed :math:`\zeta_i` value. +The modal damping matrix is defined in terms of the modal properties: + +.. math:: + :label: ModalDamping + + {\underline{\underline{C}}}_{modal} = {\underline{\underline{\Phi}}}^{-T} {\underline{\underline{Z}}} {\underline{\underline{\Phi}}}^{-1} + = {\underline{\underline{M}}} {\underline{\underline{\Phi}}} {\underline{\underline{Z}}} {\underline{\underline{\Phi}}}^T {\underline{\underline{M}}} + + +where :math:`\underline{\underline{Z}}` is a diagonal matrix with diagonal entry :math:`i` equal to +:math:`2 \omega_i \zeta_i` for natural frequency in rad/s of :math:`\omega_i`. +Additionally, :math:`\underline{\underline{\Phi}}` is the matrix of mass-normalized mode shapes +(each as a column). +:math:`\underline{\underline{M}}` is the mass matrix after the quasi-static initialization. + +At each time step, a vector of nodal velocities is calculated subtracting off the rigid body motion of the root. +This vector of velocities is rotated at each node to be aligned with the beam as initialized. +Damping forces at nodes are then simply the product of the damping matrix and the vector of velocities. +These forces are then rotated back to the global coordinates with the inverse of the velocity rotation. +The extra rotations appear to give better modal damping results than fixing the damping matrix in the +root frame. + +Modal damping gives the user mode-specific control of damping levels to better match +experiments or theoretical damping predictions. +Furthermore, modal damping need not grow proportional to frequency (as prescribed by +stiffness proportional damping). Rather, more constant damping factors across frequency +can be used as have been observed in some experiments and model predictions. .. _convergence-criterion: @@ -637,7 +677,8 @@ Time integration is performed using the generalized-\ :math:`\alpha` scheme in BeamDyn, which is an unconditionally stable (for linear systems), second-order accurate algorithm. The scheme allows for users to choose integration parameters that introduce high-frequency numerical -dissipation. More details regarding the generalized-\ :math:`\alpha` +dissipation. The amount of numerical dissipation is controlled by the user-specified +spectral radius at infinity, :math:`\rho_{\infty}`. More details regarding the generalized-\ :math:`\alpha` method can be found in :cite:`Chung-Hulbert:1993,Bauchau:2010`. Calculation of Reaction Loads @@ -651,14 +692,14 @@ mode), the reaction loads at the root are needed to satisfy equality of the governing equations. The reaction loads at the root are also the loads passing from blade to hub in a full turbine analysis. -The governing equations in Eq. :eq:`GovernGEBT-1-2` can be recast in a compact form +The governing equations in Eq. :eq:`GovernGEBT-1-2` can be recast in a compact form .. math:: :label: CompactGovern {\underline{\mathcal{F}}}^I - {\underline{\mathcal{F}}}^{C\prime} + {\underline{\mathcal{F}}}^D = {\underline{\mathcal{F}}}^{ext} -with all the vectors defined in Section [sec:LinearProcess]. At the +with all the vectors defined in Section [sec:LinearProcess]. At the blade root, the governing equation is revised as .. math:: @@ -668,14 +709,14 @@ blade root, the governing equation is revised as where :math:`{\underline{\mathcal{F}}}^R = \left[ {\underline{F}}^R~~~{\underline{M}}^R\right]^T` is the reaction force vector and it can be solved from -Eq. :eq:`CompactGovernRoot` given that the motion fields are known at this +Eq. :eq:`CompactGovernRoot` given that the motion fields are known at this point. Calculation of Blade Loads -------------------------- BeamDyn can also calculate the blade loads at each finite element node -along the blade axis. The governing equation in Eq. :eq:`CompactGovern` are +along the blade axis. The governing equation in Eq. :eq:`CompactGovern` are recast as .. math:: diff --git a/docs/source/user/elastodyn/coordsys.rst b/docs/source/user/elastodyn/coordsys.rst index 614ab85535..7e4fda78e4 100644 --- a/docs/source/user/elastodyn/coordsys.rst +++ b/docs/source/user/elastodyn/coordsys.rst @@ -9,9 +9,9 @@ For the coordinates system not detailed in subsections below, please refer to th - :download:`OpenFAST_coords.pdf <../../../OtherSupporting/OpenFAST_coords.pdf>`: Presentation from 2024 overviewing some coordinate systems in OpenFAST. -- `FAST 7 Manual `_ +- `FAST 7 Manual `_ -- `Technical report `_ on FAST_AD and modeling of the UAE wind turbine (in section 3) +- `Technical report `_ on FAST_AD and modeling of the UAE wind turbine (in section 3) - :download:`FASTCoordinateSystems.doc <../../../OtherSupporting/ElastoDyn/FASTCoordinateSystems.doc>`: Documents the transformation matrices relating each coordinate system in OpenFAST. Unfortunately, there are no pictures in this document that diagram these coordinate systems. They can hopefully be visualized by means of the transformation matrices. diff --git a/docs/source/user/elastodyn/input.rst b/docs/source/user/elastodyn/input.rst index 1af07ef9b3..466cf16011 100644 --- a/docs/source/user/elastodyn/input.rst +++ b/docs/source/user/elastodyn/input.rst @@ -46,6 +46,8 @@ Degrees of Freedom **EdgeDOF** - First edgewise blade mode DOF (flag) +**PitchDOF** - Blade pitch DOF (flag) + **TeetDOF** - Rotor-teeter DOF (flag) [unused for 3 blades] **DrTrDOF** - Drivetrain rotational-flexibility DOF (flag) @@ -179,6 +181,18 @@ Mass and Inertia **TipMass(3)** - Tip-brake mass, blade 3 (kg) [unused for 2 blades] +**PBrIner(1)** - Pitch bearing/actuator inertia, blade 1 (kg m^2) + +**PBrIner(2)** - Pitch bearing/actuator inertia, blade 2 (kg m^2) + +**PBrIner(3)** - Pitch bearing/actuator inertia, blade 3 (kg m^2) [unused for 2 blades] + +**BlPIner(1)** - Pitch inertia of an undeflected blade, blade 1 (kg m^2) + +**BlPIner(2)** - Pitch inertia of an undeflected blade, blade 2 (kg m^2) + +**BlPIner(3)** - Pitch inertia of an undeflected blade, blade 3 (kg m^2) [unused for 2 blades] + **HubMass** - Hub mass (kg) **HubIner** - Hub inertia about rotor axis (2 or 3-blades) (kg m^2) diff --git a/docs/source/user/elastodyn/theory.rst b/docs/source/user/elastodyn/theory.rst index 09f2eec1e6..a31facac33 100644 --- a/docs/source/user/elastodyn/theory.rst +++ b/docs/source/user/elastodyn/theory.rst @@ -225,6 +225,62 @@ The static portion of the friction is omitted if the rotational acceleration is This is to account for the fact that a 'warm' joint may not feel stiction when crossing through zero velocity in a dynamic sense :cite:`ed-hammam2023`. When :math:`\omega=0`, the yaw-bearing static or dynamic friction is formulated such that the frictional resistance opposes the external applied moment, :math:`M_z`, without overcoming it. +Blade pitch dynamics +-------------------- + +Prior to OpenFAST v5, the blade pitch angles were either fixed or prescribed based on the pitch command from ServoDyn. The blade root pitch velocity and acceleration were always zero despite the pitch angle potentially changing following ServoDyn pitch command. There was also no pitch moment due to blade pitch inertia if the blades are modeled in ElastoDyn. Note that when BeamDyn was used to model the blades, only the blade root nodes had zero pitch velocity and acceleration. The pitch inertia and twisting of the rest of the blades following the root node were still accounted for, partially capturing the blade pitch dynamics. + +In OpenFAST v5, new blade pitch degrees of freedom, ``PitchDOF``, are introduced in ElastoDyn. By setting ``PitchDOF`` to true, blade pitching can now be simulated dynamically in ElastoDyn. To use this feature, users need to provide the moments of inertia of the pitch actuators/bearings about the pitch axis through the new ``PBrIner(I)`` inputs added to the ElastoDyn input file. If the blades are also modeled in ElastoDyn instead of BeamDyn, the total moments of inertia of the undeflected blades about the pitch axis must also be provided through the new ``BlPIner(I)`` inputs. Note that because ElastoDyn does not model blade twisting, it is not necessary to specify distributed blade pitch inertia. Furthermore, the effective blade pitch moments of inertia during the simulation might be higher than ``BlPIner(I)`` due to additional contributions coming from blade bending. When ElastoDyn is used to model the blades, ``PBrIner(I)`` and ``BlPIner(I)`` are simply added together to obtain the total pitch moment of inertia needed in the equations of motion. The results from the simulation will be the same as long as the sum of ``PBrIner(I)`` and ``BlPIner(I)`` remains unchanged. When BeamDyn is used to model the blades, ``BlPIner(I)`` is ignored because the distributions of pitch moment of inertia along the blades are considered in BeamDyn, which also models blade twisting. It is, however, still necessary to have realistic values for ``PBrIner(I)`` in ElastoDyn. Setting ``PBrIner(I)`` to zero or close to zero will result in numerical issues in ElastoDyn. + +When ``PitchDOF`` is true, the blade root pitch angles are solved dynamically instead of being prescribed. In this case, a pitch actuator torque is computed by ServoDyn for each blade as + +``BlPitchMom = - PitSpr * ( BlPitch - BlPitchCom ) - PitDamp * ( BlPRate - BlPRateCom )`` + +The pitch actuator stiffness/spring constant ``PitSpr`` and damping ``PitDamp`` for each blade are both defined in the ServoDyn input file. This actuator torque is applied to the blade at the root. An equal but opposite torque is applied to the rotor hub. The pitch command ``BlPitchCom`` and pitch rate command ``BlPRateCom`` are not used by ElastoDyn directly when ``PitchDOF`` is true. (ServoDyn will compute and output pitch actuator torques regardless of whether ``PitchDOF`` is true or false in ElastoDyn. However, in the latter case, the actuator torques are simply not used.) + +When active blade pitch control is on in ServoDyn, ``BlPitchCom`` is computed by the turbine controller. When active blade pitch control is off (``PCMode=0`` or during ``t0``), ``BlPitchCom`` is given by the neutral blade pitch position ``PitNeut(I)`` in the ServoDyn input file. Finally, during pitch maneuver, ``BlPitchCom`` approaches the final pitch position at a constant rate given by ``PitManRat(I)`` in the ServoDyn input file. + +In addition to pitch position commands, pitch rate commands ``BlPRateCom`` are also added to ServoDyn. Currently, ``BlPRateCom`` is only available with DLL controllers (``PCMode=5``) or during override pitch maneuvers. During normal operation, the pitch rate commands are estimated using finite differencing based on the pitch set points from two consecutive controller steps. During pitch maneuvers, the pitch rate command is simply set to ``PitManRat(I)`` in the ServoDyn input file until the final pitch position is reached. ``BlPRateCom`` is zero when ``PCMode`` is 0, 3, or 4 or after the pitch maneuver is completed. + +When ``PitchDOF`` is true in ElastoDyn, the following ServoDyn settings are recommended: + +* When using a DLL controller (``PCMode=5``), set ``BPCutoff`` to an appropriate value (on the order of 1 Hz depending on the turbine) to avoid discontinuities in the pitch-rate command. This can help reduce large fluctuations in the actuator torque. The same low-pass filter is applied to both pitch command and pitch rate command. + +* For consistency with the pitch rate command estimated using finite differencing, set ``DLL_Ramp`` to true. This can reduce small jitters in the actuator moment when ``DLL_DT`` is larger than the simulation time step. + +* Finally, the pitch actuator stiffness and damping must be set appropriately to obtain a reasonable time constant (on the order of a quarter of a second) and damping ratio (about 0.7). Higher ``PitSpr(I)`` and ``PitDamp(I)`` will require a smaller time step for numerical stability. To achieve a given damped period ``Td`` and damping ratio ``zeta``, the following equations can be used to obtain initial estimates of ``PitSpr(I)`` and ``PitDamp(I)``: + +``PitSpr = 4 * pi^2 * ( PBrIner + BlPIner ) / ( Td^2 * ( 1 - zeta^2 ) )`` + +``PitDamp = 2 * zeta * sqrt( PitSpr * ( PBrIner + BlPIner ) )`` + +When ``PitchDOF`` is true, the following new output channels from ElastoDyn become available: + +* ``BldPRate1`` - blade 1 pitch rate (deg/s) + +* ``BldPRate2`` - blade 2 pitch rate (deg/s) + +* ``BldPRate3`` - blade 3 pitch rate (deg/s) + +* ``BldPAcc1`` - blade 1 pitch acceleration (deg/s^2) + +* ``BldPAcc2`` - blade 2 pitch acceleration (deg/s^2) + +* ``BldPAcc3`` - blade 3 pitch acceleration (deg/s^2) + +These output channels are valid only if ``PitchDOF`` is true with positive values toward the feathered position. + +If ``PitchDOF`` is false in ElastoDyn, OpenFAST will function as before with the blade root pitch angles either fixed to the initial positions defined in ElastoDyn when ServoDyn is disabled or set to the pitch commands from ServoDyn. Setting ``PitchDOF`` to false does not mean the blade pitch angles will be constant. ``PBrIner(I)`` and ``BlPIner(I)`` in the ElastoDyn input file are both ignored when ``PitchDOF`` is false. The pitch actuator torques from ServoDyn are also ignored by ElastoDyn. Finally, note that the initial blade pitch positions specified in ElastoDyn will be superseded by ``PitNeut(I)`` in ServoDyn if ServoDyn is enabled but active blade pitch control is off (``PCMode=0`` or during ``t0``). + +**Usage guidance** + +The effect of enabling ``PitchDOF`` on blade root loads tends to be more significant when the blades are modeled in ElastoDyn. This is because ElastoDyn will entirely ignore the blade pitch inertia otherwise. When the blades are modeled in BeamDyn, the effect tends to be less significant because blade pitch inertia (except that of the root node) and blade twisting will always be accounted for. In this case, enabling ``PitchDOF`` in ElastoDyn allows the pitch inertia of the entire blade, including that of the root node, to be included in the dynamics. + +Furthermore, the impact of ``PitchDOF`` tends to be more significant after sudden starts or stops in blade pitching. For example, this can happen during normal operation when the blade pitch angle saturates (if the pitch command is not low-pass filtered as suggested above) or during emergency shutdown when the blades need to quickly pitch to the feathered position and stop. In these situations, enabling ``PitchDOF`` allows OpenFAST to capture the large pitch moments at the blade roots that would otherwise be missed if the blades are modeled in ElastoDyn. Alternatively, if the blades are modeled in BeamDyn, it prevents discontinuous pitch rates at the blade roots and can help smooth out large fluctuations in the root moments immediately following the impulsive start or sudden stop. + + + + .. _ed_dev_notes: @@ -252,3 +308,5 @@ The following (partial) list of coordinate systems are defined internally by Ela - `rf` : rotor furl coordinate system - `tf` : tail furl coordinate system - `g` : hub coordinate system + + diff --git a/docs/source/user/extptfm/input_files.rst b/docs/source/user/extptfm/input_files.rst index 6c14c98258..a8b7bfccff 100644 --- a/docs/source/user/extptfm/input_files.rst +++ b/docs/source/user/extptfm/input_files.rst @@ -26,21 +26,14 @@ The input parameters are: Runge-Kutta, Adams–Bashforth and Adams–Bashforth-Moutlon methods are available. -- ``FileFormat``: file format used for the reduction inputs. Available - formats are ``GuyanASCII`` (see :ref:`epGuyanInputFile`) and ``FlexASCII`` (see :ref:`epSuperelementInputFile`) + ``RBMod``: method for handling rigid-body motion of floating structures (switch). + 0: No special handling for rigid-body motion (fixed-bottom structures); + 1: Transform to rigid-body frame of reference; + 2: Transform to rigid-body frame of reference and add fictitious forces and exact self-weight. - ``Red_Filename``: path of file containing the Guyan/Craig-Bampton inputs. -- ``RedCst_Filename``: path of file containing the Guyan/Craig-Bampton - inputs that are constant. This input is not used yet but may be - introduced in the future to accommodate for reduction file formats - that use two files: one that contains the constants that are - structure dependent (static loads from e.g. gravity and matrices), - and one that contain the time-varying signals that are simulation - dependent (e.g. loads (on top of the constants loads) and wave - elevation) - - ``ActiveDOFList``: list of size ``NActiveDOFList`` containing the CB modes indices that are active. This list is not read if ``NActiveDOFList<=0``. When specified, all system matrices are reshaped as @@ -60,6 +53,20 @@ The input parameters are: ``NInitVelList<=0``, in which case all the CB DOF velocities are initialized to 0. + ``Connections``: flag for including connection points on the structure. + If true, a file specifiying the connections must be provided through + ``Conn_FileName``. Currently, this feature is only used to couple with + one of the mooring modules. + + ``UserForcing``: flag for user-defined modal forcing. If true, a file + containing the force time series to be applied must be provided through + ``Force_FileName``. + + ``ConnForcing``: flag for user-defined external force at connection points. + If true, a file containing the force time series to be applied at the connection + points must be provided through ``FConn_FileName``. This option requires + ``Connections`` to be true. Application of moments is not supported. + - ``SumPrint``: Print summary data to .sum - ``OutFile`` , ``TabDelim``, ``OutFmt``, ``TStart``: Output flags, currently unused @@ -95,128 +102,150 @@ list given below. The symbols used in the theory section (:ref:`ep-theory`) are ``IntrfMx`` Platform interface moment - Directed along the x-direction :math:`f_{C}[4]` (Nm) ``IntrfMy`` Platform interface moment - Directed along the y-direction :math:`f_{C}[5]` (Nm) ``IntrfMz`` Platform interface moment - Directed along the z-direction :math:`f_{C}[6]` (Nm) - ``InpF_Fx`` Reduced input force at interface point - Directed along the x-direction :math:`f_{r1}[1]` (N) - ``InpF_Fy`` Reduced input force at interface point - Directed along the y-direction :math:`f_{r1}[2]` (N) - ``InpF_Fz`` Reduced input force at interface point - Directed along the z-direction :math:`f_{r1}[3]` (N) - ``InpF_Mx`` Reduced input moment at interface point - Directed along the x-direction :math:`f_{r1}[4]` (Nm) - ``InpF_My`` Reduced input moment at interface point - Directed along the y-direction :math:`f_{r1}[5]` (Nm) - ``InpF_Mz`` Reduced input moment at interface point - Directed along the z-direction :math:`f_{r1}[6]` (Nm) - ``CBQ_XXX`` Displacement of CB DOF number XXX (e.g. ``CBQ_001``) :math:`\boldsymbol{x}_2[XXX]` (-) - ``CBQD_XXX`` Velocity of CB DOF number XXX (e.g. ``CBQD_001``) :math:`\boldsymbol{\dot{x}}_2[XXX]` (-) - ``CBQD2_XXX`` Acceleration of CB DOF number XXX :math:`\boldsymbol{\ddot{x}}_2[XXX]` (-) - ``CBF_XXX`` Reduced input modal force in CB DOF number XXX :math:`\boldsymbol{f}_{r2}[XXX]` (-) - ``WaveElevExt`` Wave elevation provided in the external file :math:`\eta` (m) + ``ExtrnFx`` Reduced input force at interface point - Directed along the x-direction :math:`f_{r1}[1]` (N) + ``ExtrnFy`` Reduced input force at interface point - Directed along the y-direction :math:`f_{r1}[2]` (N) + ``ExtrnFz`` Reduced input force at interface point - Directed along the z-direction :math:`f_{r1}[3]` (N) + ``ExtrnMx`` Reduced input moment at interface point - Directed along the x-direction :math:`f_{r1}[4]` (Nm) + ``ExtrnMy`` Reduced input moment at interface point - Directed along the y-direction :math:`f_{r1}[5]` (Nm) + ``ExtrnMz`` Reduced input moment at interface point - Directed along the z-direction :math:`f_{r1}[6]` (Nm) + ``CBDXXX`` Displacement of CB DOF number XXX (e.g. ``CBD001``) :math:`\boldsymbol{x}_2[XXX]` (-) + ``CBVXXX`` Velocity of CB DOF number XXX (e.g. ``CBV001``) :math:`\boldsymbol{\dot{x}}_2[XXX]` (-) + ``CBAXXX`` Acceleration of CB DOF number XXX (e.g. ``CBA001``) :math:`\boldsymbol{\ddot{x}}_2[XXX]` (-) + ``CBFXXX`` Reduced input modal force in CB DOF number XXX (e.g. ``CBF001``) :math:`\boldsymbol{f}_{r2}[XXX]` (-) ================ ======================================================================== ==================================== ========= +.. _epSuperelementInputFile: +Guyan/Craig-Bampton superelement input file (provided through ``Red_Filename``) +------------------------------------------------------------------------------- -.. _epGuyanInputFile: - -Guyan input file (``GuyanASCII``) ---------------------------------- - -The Guyan input files format is a legacy file format used for superelements -that only contains 6 interface degrees of freedom. +This superelement input file is used to provide the system matrices. Example ^^^^^^^ -An example of ASCII file that was used for Guyan-Reduced sub-structure -is given below, where numerical values are implied instead of ``M11``, -``t1``, ``Fx1`` etc. +An example of superelement file is available `here `_. +A "dummy" example is given below, where numerical values are +implied for: ``n``, ``M(i,j)``, ``K(i,j)``, ``C(i,j)``, etc. .. code:: - Comment - #Mass - M11 ... M16 - [...] - M61 ... M66 - #Damping - [6 x 6 matrix] - #Stiffness - [6 x 6 matrix] - # time-varying force - # Time Fx Fy Fz Mx My Mz - # s (N) (N) (N) (N-m) (N-m) (N-m) - t1 Fx1 Fy1 Fz1 Mx1 My1 Mz1 - [...] - tN FxN FyN FzN MxN MyN MzN + !Comment + !Comment + !Dimension: n + + !Mass Matrix (Units (kg,m)) + M(1,1) ... M(1,n) + [...] + M(n,1) ... M(n,n) + + !Stiffness Matrix (Units (N,m)) + K(1,1) ... K(1,n) + [...] + K(n,1) ... K(n,n) + + !Damping Matrix (Units (N,m,kg)) + C(1,1) ... C(1,n) + [...] + C(n,1) ... C(n,n) + + !Weight constant (Units (N,m)) + W_0(1) W_0(2) ... W_0(n) + + !Weight stiffness (Units (N,m)) + K_W(1,1) ... K_W(1,n) + [...] + K_W(n,1) ... K_W(n,n) Specifications ^^^^^^^^^^^^^^ -The format is a fixed form format -where the line number are assumed. The format specifications are defined -below: +The file follows the following specifications: - ASCII file -- Line 1 is an arbitrary comment - -- Line 2 must contain ‘\ ``#mass``\ ‘ (case insensitive). If not, the - file format is invalidated. This requirement is important to - differentiate between this format and other ASCII formats. - -- Lines: 9 and 16 are comment lines that are ignored - -- Lines 3-8, 10-15, 17-22 contain six float values, forming the - elements of the mass, damping and stiffness matrices respectively. - These values corresponds to :math:`\boldsymbol{M}_r`, - :math:`\boldsymbol{K}_r` and :math:`\boldsymbol{D}_r`. - -- Lines 23-25 are comment lines and are ignored +- The file can start with an arbitrary number of comment lines that + start with an exclamation mark ‘\ ``!``\ ‘ -- The remaining lines of the files contain 7 float values, - corresponding to the values: :math:`t`, :math:`[F_x(t)`, - :math:`F_y(t)`, :math:`F_z(t)`, :math:`M_x(t)`, :math:`M_y(t)`, - :math:`M_z(t)] = \boldsymbol{f}_{r1}(t)`. The number of time steps is - here noted :math:`N` but it is not specified in the file. +- The following (case insensitive) keyword must be provided next: -In particular the same file format -should be used for Guyan and Craig-Bampton reduced substructures. The -following sections define formats that can serve for both purposes. + - ‘\ ``!dimension``:‘ followed by the integer + ``n``\ :math:`=6+n_{CB}` -.. _epSuperelementInputFile: +- The remaining lines consist of the following special (case + insensitive) keywords: -Superelement input file (``FlexASCII``) ---------------------------------------- + - ‘\ ``!mass matrix``\ ‘: followed by some text. The next :math:`n` + lines each contain :math:`n` float values. These values correspond + to :math:`\boldsymbol{M}_r`. Note that when modeling a floating + structure with ``RBMod`` > 0, the first 6 modes, the interface modes, + also serve as rigid-body modes. Therefore, the first 6-by-6 entries + of :math:`\boldsymbol{M}_r` must be a self-consistent rigid-body mass + matrix. ExtPtfm will give a warning if this is not the case. + Internally, ExtPtfm uses this information to determine the mass, + rigid-body moments of inertia, and CoG location. -This superelement input file is used to provide the system matrices and time series of loads -for superelements with an arbitrary number of Craig-Bampton modes. + - ‘\ ``!stiffness matrix``\ ‘: similar to the mass matrix, the + values correspond to :math:`\boldsymbol{K}_r`. For a floating + structure, there should not be any structural stiffness associated + with rigid-body motion; therefore, the first 6 rows and 6 columns of + :math:`\boldsymbol{K}_r` should all be zeros. + + - ‘\ ``!weight constant``\ ‘: followed by some text. The next line + should contain :math:`n` float values. The values correspond to the + constant self-weight :math:`\boldsymbol{W}_0`. For a floating + structure, the 1st, 2nd, and 6th entries of :math:`\boldsymbol{W}_0` + must be zeros. The constant roll and pitch moments due to self-weight + must be consistent with the CoG location derived from the mass matrix. + + - ‘\ ``!weight stiffness``\ ‘: similar to the mass matrix, the values + correspond to :math:`\boldsymbol{K}_W`. For a floating structure, + the adopted convention requires + :math:`\boldsymbol{W}_0` - :math:`\boldsymbol{K}_W` * (modal displacment) + to return the self-weight in a frame of reference following the + rigid-body/interface motion. This implies that entry (1,5) of + :math:`\boldsymbol{K}_W` must be equal to :math:`\boldsymbol{W}_0(3)`. + Entry (2,4) must be equal to :math:`-\boldsymbol{W}_0(3)`. Entries (4,4) + and (5,5) must be equal to :math:`\boldsymbol{W}_0(3) * z_{CG}`. + Entry (6,4) must be equal to :math:`-\boldsymbol{W}_0(3) * x_{CG}`, and + entry (6,5) must be equal to :math:`-\boldsymbol{W}_0(3) * y_{CG}`, where + :math:`(x_{CG},y_{CG},z_{CG})` are the location of the rigid-body + center of mass measured from the platform reference point defined in + ElastoDyn, i.e., (*PtfmRefxt*, *PtfmRefyt*, *PtfmRefzt*). All entries in the + 1st, 2nd, and 6th columns of :math:`\boldsymbol{K}_W` should be + zeros. Again, if the input matrix does not follow this structure, a + warning will be given. + +.. _epConnectInputFile: + +Connections input file (provided through ``Conn_Filename``) +----------------------------------------------------------- + +The connection input file is used to provide the number and locations of connection +points on the structure. Currently, the connection points are only used to couple +with mooring fairleads when any of the available mooring modules is enabled. This file +also needs to provide the structural motion/deflection at each connection point for +each Guyan mode and Craig-Bampton mode. Example ^^^^^^^ - -An example of superelement file is available `here `_. A "dummy" example is given below, where numerical values are -implied for: ``n``, ``dt``, ``t``, ``M11``, ``F1`` etc. +implied for ``m``, ``X1``, ``Y1``, ``Z1``, etc. .. code:: !Comment - !Comment Flex 5 Format - !Dimension: n - !Time increment in simulation: dt - !Total simulation time in file: T - !Mass Matrix (Units (kg,m)) - !Dimension: n - M11 ... M1n + !Comment + !nConn: m + + !Connections (m) + X1 Y1 Z1 [...] - Mn1 ... Mnn - !Stiffness Matrix (Units (N,m)) - !Dimension: n - [n x n matrix] - !Damping Matrix (Units (N,m,kg)) - !Dimension: n - [n x n matrix] - !Loading and Wave Elevation (Units (N,m)) - !Dimension: 1 time column - n force columns - 1 wave elevation column - t1 F11 ... F1n eta1 - [...] - tN F1N ... FnN etaN - + Xm Ym Zm + + !Displacement (m) + [3m x n matrix] Specifications ^^^^^^^^^^^^^^ @@ -225,65 +254,88 @@ The file follows the following specifications: - ASCII file -- Line 1: arbitrary comment that needs to start with an exclamation - mark ‘\ ``!``\ ‘ - -- Line 2: comment which must contain the string ‘\ ``Flex 5 format``\ ‘ - (case insensitive) - -- The following lines are header lines that should start with an - exclamation mark. - -- The header lines are either comments or lines containing - keyword/value pairs +- The file can start with an arbitrary number of comment lines that + start with an exclamation mark ‘\ ``!``\ ‘ + +- The following (case insensitive) keywords must be provided next + in the order given: + + - ‘\ ``!nConn``:‘ followed by the integer + ``m`` giving the number of connection points on the structure + + - ‘\ ``!Connections``\ ‘: followed by some text. The next :math:`m` + lines each containing 3 float values give the :math:`x`, :math:`y`, + and :math:`z` coordinates of the :math:`m` connection points. Note + that the coordinates are in reference to the same global origin used + in, e.g., HydroDyn and MoorDyn input files, and are not relative to + the platform reference point defined in ElastoDyn. + + - ‘\ ``!Displacement``\ ‘: followed by some text. The next :math:`3m` + lines each contain :math:`n` float values. The columns of this matrix + correspond to the :math:`n` modes defined in the superelement input + file and give the :math:`x`, :math:`y`, and :math:`z` displacements + of the first connection point in the first 3 rows, followed by those + of the second connection point in the next 3 rows, and so on, for unit + motion of each mode. When modeling a floating body with ``RBMod`` > 0, + the first 6 modes are the Guyan interface modes that also serve as + rigid-body modes. Therefore, the first 6 columns of this matrix should + simply describe the linearized rigid-body motion of each connection + point following the platform reference point defined in ElastoDyn, + i.e., (*PtfmRefxt*, *PtfmRefyt*, *PtfmRefzt*). + + +User modal and connection force file (provided through ``Force_Filename`` and ``FConn_Filename`` ) +-------------------------------------------------------------------------------------------------- + +These two files allow the user to prescribe external forcing to the system modes +and the connection points. The two files have similar formatting. The only difference +is in the number of columns. -- The following (case insensitive) keywords are currently supported for - the header: - - - ‘\ ``!dimension``:‘ followed by the integer - ``n``\ :math:`=6+n_{CB}` - - - ‘\ ``!time increment in simulation:``\ ‘: followed by the time - step :math:`dt` - - - ‘\ ``!total simulation time in file:``\ ‘: following by the - simulation length :math:`T` - -- The remaining lines consists of the following special (case - insensitive) keywords: - - - ‘\ ``!mass matrix``\ ‘: followed by some text. The next line - provide a dimension, but it is ignored. The dimension line is then - followed by :math:`n` lines each containing :math:`n` float values - These values corresponds to :math:`\boldsymbol{M}_r`. - - - ‘\ ``!stiffness matrix``\ ‘: similar to the mass matrix, the - values corresponds to :math:`\boldsymbol{K}_r`. - - - ‘\ ``!damping matrix``\ ‘: similar to the mass matrix, the values - corresponds to :math:`\boldsymbol{D}_r`. - - - ‘\ ``!loading``\ ‘: followed by some text. The next line contains - the dimensions but is ignored. The remaining lines of the file - after this keyword should each contain ``n``\ +2 values, - corresponding to the time :math:`t`, the loads - :math:`\boldsymbol{f}_r(t)` and the wave elevation - :math:`\eta(t)` NOTE: the wave elevation is intended for outputs - only, but it is not outputed yet. - The number of lines :math:`N` should be - consistent with the definition of :math:`dt` and :math:`T` from - the header. The inputs are linearly interpolated if the time step is - different from the time step of *ExtPtfm*. +Example +^^^^^^^ -- For now, the units information and the dimension information after - the keywords are ignored. Only the dimension provided in the header - is read and should be respected throughout the file. The reason for - discarding these information is that at the time of writing, there is - no guarantee that this information is always provided, and the format - specifications of the units and dimension were not specified. +A "dummy" example is given below, where numerical values are +implied for ``k``, ``t1``, ``F1``, etc. +.. code:: + !Comment + !Comment + !nSteps: k + + !Forcing (N/-) + t(1) F_1(1) F_2(1) ... + [...] + t(k) F_1(k) F_2(k) ... + +Specifications +^^^^^^^^^^^^^^ +The files follow the following specifications: +- ASCII file +- The file can start with an arbitrary number of comment lines that + start with an exclamation mark ‘\ ``!``\ ‘ + +- The following (case insensitive) keywords must be provided next + in the order they are given: + + - ‘\ ``!NSteps``:‘ followed by the integer + ``k`` giving the number of time steps in the force time series + + - ‘\ ``!Forcing``\ ‘: followed by some text. The next :math:`k` + lines provide the user-defined modal or connection force time + series. The number of columns depends on whether this is for + modal forcing or connection forcing. In both cases, the first + column is time. For modal forcing, there should be :math:`n` + columns following the time column, with each column corresponding + to one of the modes defined in the superelement input file. + For connection forcing, there should be :math:`3m` columns + following the time column, giving the :math:`x`, :math:`y`, and + :math:`z` force components at the first connection point, + followed by that at the second connection point, and so on. Note + that the times in the first column need not match the simulation + time step or be evenly spaced. ExtPtfm will perform linear + interpolation between the provided times as needed. diff --git a/docs/source/user/extptfm/usage.rst b/docs/source/user/extptfm/usage.rst index 4ae57ad88b..d067888462 100644 --- a/docs/source/user/extptfm/usage.rst +++ b/docs/source/user/extptfm/usage.rst @@ -72,7 +72,32 @@ satisfying the following criteria: :math:`\Delta t=\frac{1}{10 f_\text{max}}`, w for an increasing number of Craig-Bampton modes to get an idea of how many modes are needed to reach convergence and see which modes contributes the most to the sytem response. - - +OpenFAST 5.0 +~~~~~~~~~~~~ + +With the release of OpenFAST 5.0, significant changes were made to the input files of ExtPtfm and its internal formulation. +Couplings between ExtPtfm and HydroDyn and between ExtPtfm and the mooring modules have been enabled to more conveniently +simulate a flexible floating structure. Finally, linearization with ExtPtfm is now possible. + +When simulating a floating structure in ExtPtfm, HydroDyn can be enabled in the glue-code to compute and provide +potential-flow wave excitation and radiation loads and hydrostatic loads for both rigid-body modes and additional +generalized degrees of freedom through the `NAddDOF` option (see HydroDyn documentation). With this setup, we need +the number of active modes in ExtPtfm to be equal to :math:`6+NAddDOF` in HydroDyn, with the first 6 modes being +rigid-body modes, followed by a number of elastic modes. + +Note that if HydroDyn also contains strip-theory members, the resulting strip-theory loads will all be mapped to +the ExtPtfm rigid-body modes only, not the elastic modes. Therefore, users are discouraged from using strip-theory-only +members in HydroDyn. The same applies to marine growth and ballast/flooding in HydroDyn. However, hybrid members +with drag only can still be used in many cases to help obtain more relastic floater motions. The drag force tends +to be small and does not have a strong direct impact on the structural loading. In this case, mapping the drag force +to the rigid-body modes only can be an acceptable simplification. The same consideration also applies to the +second-order potential-flow options in HydroDyn that do no support generalized degrees of freedom, yet. + +When coupling to mooring, a set of connection points must be defined in the ExtPtfm module. These connections points +are coupled to the fairleads in the mooring models. Generally, the connection points in ExtPtfm should be the same +set of points used as fairleads in the mooring model; however, they need not be exactly the same as OpenFAST automatically +introduces nearest-neighbor mapping between the two assuming rigid connections. + +Note that the above workflow with ExtPtfm coupling to HydroDyn and mooring is still a work-in-progress. diff --git a/docs/source/user/fast.farm/FFarmTheory.rst b/docs/source/user/fast.farm/FFarmTheory.rst index 3f58c3a53e..5b78a1064d 100644 --- a/docs/source/user/fast.farm/FFarmTheory.rst +++ b/docs/source/user/fast.farm/FFarmTheory.rst @@ -484,9 +484,9 @@ each rotor. The wake-dynamics calculations involve many user-specified parameters that may depend, e.g., on turbine operation or atmospheric conditions that can be calibrated to better match experimental data or HFM, e.g., -by running `SOWFA `__ (or equivalent) as a +by running `SOWFA `__ (or equivalent) as a benchmark. Default values have been derived for each calibrated -parameter based on `SOWFA `__ +parameter based on `SOWFA `__ simulations (:cite:`ff-Doubrawa18_1`), but these can be overwritten by the user of FAST.Farm. @@ -1474,13 +1474,13 @@ wind farms or a subset of wind turbines within a larger wind farm. FAST.Farm can also use ambient wind generated by a high-fidelity precursor LES simulation of the entire wind farm (without wind turbines present), such as the ABLSolver preprocessor of -`SOWFA `__. This atmospheric precursor +`SOWFA `__. This atmospheric precursor simulation captures more physics than synthetic turbulence -- as illustrated in :numref:`FF:ABLSolver` -- including atmospheric stability, wind-farm-wide turbulent length scales, and complex terrain effects. It is more computationally expensive than using the ambient wind modeling options of *InflowWind*, but it is much less -computationally expensive than a `SOWFA `__ +computationally expensive than a `SOWFA `__ simulation with multiple wind turbines present. FAST.Farm requires ambient wind to be available in two different @@ -1599,7 +1599,7 @@ In previous implementations of DWM, the wind turbine and wake dynamics were solved individually or serially, not considering two-way wake-merging interactions. Additionally, there was no method available to calculate the disturbed wind in zones of wake overlap. Wake merging -is illustrated by the `SOWFA `__ simulation +is illustrated by the `SOWFA `__ simulation of :numref:`FF:WakeMerg`. In FAST.Farm, the wake-merging submodel of the *AWAE* module identifies zones of wake overlap between all wakes across the wind farm by finding wake volumes that overlap in diff --git a/docs/source/user/fast.farm/FutureWork.rst b/docs/source/user/fast.farm/FutureWork.rst index 9d620cc1ec..34ecdc3179 100644 --- a/docs/source/user/fast.farm/FutureWork.rst +++ b/docs/source/user/fast.farm/FutureWork.rst @@ -93,7 +93,7 @@ releases: - Interface FAST.Farm to the Wind-Plant Integrated System Design & Engineering Model - (`WISDEM `__\ :math:`^\text{TM}`) for + (`WISDEM `__\ :math:`^\text{TM}`) for systems-engineering applications (multidisciplinary design, analysis, and optimization; uncertainty quantification; and so on). diff --git a/docs/source/user/fast.farm/InputFiles.rst b/docs/source/user/fast.farm/InputFiles.rst index d51bb97b40..bcc524f4e7 100644 --- a/docs/source/user/fast.farm/InputFiles.rst +++ b/docs/source/user/fast.farm/InputFiles.rst @@ -81,14 +81,18 @@ simulation length set in the OpenFAST primary input file of each wind turbine in the wind farm. **Mod_AmbWind** [switch] indicates the ambient wind source. There are -three options: 1) use ambient wind data generated by a high-fidelity +four options: 1) use ambient wind data generated by a high-fidelity precursor simulation in VTK format **[Mod_AmbWind=1]**, 2) use ambient wind data as defined by the FAST.Farm interface to the *InflowWind* -module, with one instance of *InflowWind* **[Mod_AmbWind=2]**, or 3) use +module, with one instance of *InflowWind* **[Mod_AmbWind=2]**, 3) use ambient wind data as defined by the FAST.Farm interface to the *InflowWind* module, with multiple instances of *InflowWind* -**[Mod_AmbWind=3]**. The distinct Ambient Wind subsections below pertain -to each option. +**[Mod_AmbWind=3]**, or 4) use ambient wind data generated by a +high-fidelity precursor simulation stored in AMReX plot file format +**[Mod_AmbWind=4]**. The distinct Ambient Wind subsections below pertain +to each option. Note that **Mod_AmbWind** = 4 requires FAST.Farm to be +compiled with AMReX support (``-DAMREX_READER=ON`` in CMake, not available when +compiling with Visual Studio). **Mod_WaveField** [switch] indicates how the wave field should be treated. The two options are: 1) use individual HydroDyn inputs at each turbine without @@ -297,6 +301,55 @@ there are spaces in the file or path names, these quotes are required. See :numref:`FF:AmbWindIfW` for information on the contents of this file. +.. _FF:Input:AMReX: + +Ambient Wind: Precursor in AMReX Format +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The input parameters in this section are only used when **Mod_AmbWind** += 4, indicating the use of ambient wind from a high-fidelity precursor +simulation stored in `AMReX `__ plot file +format. This option requires FAST.Farm to be compiled with the AMReX +library enabled (``-DAMREX_READER=ON`` with CMake). The grid dimensions, origin, +and spatial discretization are read directly from the AMReX plot file +headers and do not need to be specified in the input file. + +**WindDirPrefix** [quoted string] specifies the path prefix for the +AMReX wind sub-volume directories. Sub-volume directories follow the +naming convention *__*, where ** is the +sub-volume number (0 for the low-resolution domain; 1 through +**NumTurbines** for the high-resolution domain of each turbine) and +** is a zero-padded integer directory index. The path can be +specified relative to the location of the FAST.Farm primary input file +or with an absolute path. It is recommended to use quotes around the +path. See :numref:`FF:AmbWindAMReX` for further details on the expected +directory structure. + +**DirStartIndex** [quoted string] specifies the directory index suffix +(e.g., ``"00000"``) corresponding to the simulation start time +:math:`t=0`. The string length determines the zero-padding width applied +to all directory index numbers; the number of leading zeros in +**DirStartIndex** sets the total field width used when constructing +subsequent directory names. FAST.Farm automatically searches for all +available time steps beginning from this index. It is recommended to use +quotes around this value. + +**DT_Low-AMReX** [sec] sets the time step of the low-resolution ambient +wind data and the global (driver/glue-code) time step of FAST.Farm. All +FAST.Farm modules are called every **DT_Low-AMReX** seconds, although +OpenFAST and its modules may use a time step that is an integer multiple +smaller than or equal to **DT_Low-AMReX**. The value must match the time +step used when generating the precursor simulation data. + +**DT_High-AMReX** [sec] sets the time step of the high-resolution +ambient wind data and **must be an integer multiple smaller than or +equal to DT_Low-AMReX**. It must match the time resolution of the +high-resolution sub-volumes in the precursor data. **DT_Low-AMReX** +should be consistent with the timescales of wake dynamics (e.g., on the +order of seconds), and **DT_High-AMReX** should be sufficient for +accurate aerodynamic load calculations (e.g., on the order of fractions +of a second). Further guidance is given in :numref:`FF:ModGuidance`. + .. _FF:Input:WT: Wind Turbines @@ -1056,6 +1109,71 @@ used (**WindType** = 1). When using full-field turbulent wind data in *X-Y-Z* offsets of each turbine origin relative to the origin of the inertial frame coordinate system. +.. _FF:AmbWindAMReX: + +Ambient Wind Precursor Files in AMReX Plot File Format +------------------------------------------------------ + +When using **Mod_AmbWind** = 4, the ambient wind data must be +pre-generated and stored as `AMReX +`__ plot files. AMReX plot files are +directories containing a ``Header`` file and one or more cell-data files +storing three-component (*X*, *Y*, *Z*) velocity fields on a structured +Cartesian grid. FAST.Farm reads the grid dimensions, origin, and +spacing from the ``Header`` and requires exactly three velocity +components (``x_velocity``, ``y_velocity``, ``z_velocity`` or equivalent +names in order). + +The sub-volume directories must follow the naming convention +*__*, where: + +- **WindDirPrefix** is the path prefix specified in the FAST.Farm + primary input file. + +- ** is the sub-volume number: ``0`` for the low-resolution domain + and ``1`` through **NumTurbines** for the high-resolution domain of + each wind turbine. + +- ** is a zero-padded integer index with the same field width as + **DirStartIndex**. The index for time step :math:`n` is + :math:`\text{DirStartNum} + n \times \Delta_\text{index}`, where + :math:`\text{DirStartNum}` is the integer value of **DirStartIndex** + and :math:`\Delta_\text{index}` is the stride between successive + directory indices (determined automatically by FAST.Farm by scanning + the available directories). + +During initialization, FAST.Farm reads the header of the starting +sub-volume for each domain (low-resolution sub-volume 0 and each +high-resolution sub-volume 1 through **NumTurbines**) to obtain the +grid properties, then calls the directory-discovery routine to confirm +that a sufficient number of time steps exist and that the grid +properties are consistent across all time steps. Specifically, FAST.Farm +verifies: + +- That at least **NumDT** low-resolution and high-resolution + directories are available for the simulation duration. + +- That the grid dimensions, origin, and spacing are identical across + all time steps for a given sub-volume. + +- That the grid dimensions are the same for all high-resolution + sub-volumes (one per turbine). + +Because the grid properties are determined from the precursor data +files, the user does not specify low- or high-resolution grid dimensions +or origins in the FAST.Farm primary input file when using +**Mod_AmbWind** = 4. The Wind Turbines table also requires only the +standard four columns (**WT_X**, **WT_Y**, **WT_Z**, **WT_FASTInFile**), +without the six additional high-resolution grid columns that are needed +for **Mod_AmbWind** = 2 or 3. + +.. note:: + + AMReX support is only available when compiling with CMake and must be enabled at + compile time by passing ``-DAMREX_READER=ON`` during configuration. If FAST.Farm + is compiled without AMReX support, setting **Mod_AmbWind** = 4 will + produce a fatal error. + .. _FF:Input:OFInput: OpenFAST Input Files diff --git a/docs/source/user/fast.farm/Introduction.rst b/docs/source/user/fast.farm/Introduction.rst index ab847446aa..bbb173e8ef 100644 --- a/docs/source/user/fast.farm/Introduction.rst +++ b/docs/source/user/fast.farm/Introduction.rst @@ -133,7 +133,7 @@ many user-specified parameters that may depend, e.g., on turbine operation or atmospheric conditions and can be calibrated to better match experimental data or by using an HFM solution as a benchmark. Default values have been derived for each calibrated parameter based on -`SOWFA `__ simulations, but these can be +`SOWFA `__ simulations, but these can be overwritten by the user. The wake-deficit evolution is solved in discrete time on an axisymmetric @@ -289,7 +289,7 @@ wind farms or a subset of wind turbines within a larger wind farm. FAST.Farm can also use ambient wind generated by a high-fidelity precursor large-eddy simulation (LES) of the entire wind farm (without wind turbines present), such as the atmospheric boundary layer solver -(ABLSolver) preprocessor of `SOWFA `__. +(ABLSolver) preprocessor of `SOWFA `__. This atmospheric precursor simulation captures more physics than synthetic turbulence -- as illustrated in :numref:`FF:ABLSolver` -- including atmospheric stability, @@ -373,6 +373,32 @@ FAST.Farm and OpenFAST can be read with standard open-source visualization packages such as `ParaView `__ or `VisIt `__. +Turbine controller and super controller +--------------------------------------- + +FAST.Farm does not include its own modules for individual turbine controllers +or farm-level controller (super controllers) but relies on +separately compiled routines for them. +FAST.Farm defers to the OpenFAST model of individual turbine for the turbine controller. +The controller is specified in the ServoDyn module of OpenFAST. +OpenFAST allows for the use of bladed-style controllers in DLL format. +Tools like `Reference Open Source Controller` (`ROSCO `_) +can be used to design and integrate turbine controller in DLL format, if the user does not already have their own controller. + +Farm-level super controller can be designed and implemented using external tools. +The `Hycon` (`Hycon `_) tool +provides for rapid design of common farm-level controllers such as wake steering +control, spatial filtering/consensus and active power control etc. +Hycon includes examples demonstration the design of a wake steering controller and implementation on +a small farm using FAST.Farm. +The `Reference Open Source Controller` (`ROSCO `_) +also has wind farm control capability. +It gives the user low-level access to various turbine measurements and offsets, and +enables implementation of user-written, python-based controllers. +ROSCO also includes examples demonstrating the implementation of a farm-level +controller in FAST.Farm. + + FAST.Farm Parallelization ------------------------- diff --git a/docs/source/user/fast.farm/ModelGuidance.rst b/docs/source/user/fast.farm/ModelGuidance.rst index 73fde5ad84..6ac30dd503 100644 --- a/docs/source/user/fast.farm/ModelGuidance.rst +++ b/docs/source/user/fast.farm/ModelGuidance.rst @@ -194,7 +194,7 @@ High-Fidelity Precursor Ambient Inflow There are many different methods by which high-fidelity precursor ambient inflow can be generated. This section focuses on generating such inflow using -`SOWFA `__. +`SOWFA `__. When using SOWFA to generate FAST.Farm precursor inflow, the *ABLSolver* preprocessor is used. It is important to note the baseline high-fidelity @@ -931,15 +931,6 @@ simulations for the NREL 5MW turbine ( :cite:`ff-Doubrawa18_1`), but these can be overwritten by the user. -.. _FF:sec:SupCon: - -Farm Level Control ------------------- - -FAST.Farm does not include a module for farm level control. -Users are advised to utilize the wind farm control capability of -the `Reference Open Source Controller` (`ROSCO `_) -to implement farm level controller. Commonly Encountered Errors --------------------------- diff --git a/docs/source/user/fast_to_openfast.rst b/docs/source/user/fast_to_openfast.rst index 9f84b18b32..4b33d532c9 100644 --- a/docs/source/user/fast_to_openfast.rst +++ b/docs/source/user/fast_to_openfast.rst @@ -3,7 +3,7 @@ FAST v8 and the transition to OpenFAST ====================================== -This page describes the transition from FAST v8, a computer-aided engineering tool for simulating the coupled dynamic response of wind turbines, to OpenFAST. OpenFAST was established by researchers at the National Renewable Energy Laboratory (NREL) in 2017, who were supported by the U.S. Department of Energy Wind Energy Technology Office (DOE-WETO). +This page describes the transition from FAST v8, a computer-aided engineering tool for simulating the coupled dynamic response of wind turbines, to OpenFAST. OpenFAST was established by researchers at the National Renewable Energy Laboratory (NREL) in 2017, who were supported by the U.S. Department of Energy Wind Energy Technology Office (DOE-WETO). In the fall of 2025 the laboratory name changed to National Laboratory of the Rockies (NLR). FAST v8 ------- @@ -32,7 +32,7 @@ OpenFAST includes the following organizational changes relative to FAST v8.16: * Version numbering has been updated for OpenFAST (starting from OpenFAST v1.0.0), e.g., OpenFAST-v1.0.0-123-gabcd1234-dirty, where: - * v1.0.0 is the major-minor-bugfix numbering system and corresponds to a tagged commit made by NREL on GitHub + * v1.0.0 is the major-minor-bugfix numbering system and corresponds to a tagged commit made by NREL (now NLR) on GitHub * 123-g is the number of additional commits after the most recent tag for a build [the ‘-g’ is for ‘git’] @@ -46,13 +46,13 @@ OpenFAST includes the following organizational changes relative to FAST v8.16: * Unit testing has been introduced at the subroutine level (starting with BeamDyn from OpenFAST v1.0.0). -* An online documentation system has been established to replace existing documentation of FAST v8: http://openfast.readthedocs.io/; during the transition to OpenFAST, most user-related documentation is still provided through the NWTC Information Portal, https://nwtc.nrel.gov +* An online documentation system has been established to replace existing documentation of FAST v8: http://openfast.readthedocs.io/; during the transition to OpenFAST, most user-related documentation is still provided through the NWTC Information Portal, https://nwtc.nrel.gov (now deprecated) * Cross platform compiling is accomplished with CMake on macOS, Linux, and Cygwin (Windows) systems * Visual Studio Projects (VS-Build) are provided for compiling OpenFAST on Windows (starting from OpenFAST v1.0.0), but the development team is working to automate the generation of Visual Studio build files via CMake in a future release -* `GitHub Issues `__ has been made the primary platform for developers to report and track bugs, request feature enhancements, and to ask questions related to the source code, compiling, and regression/unit testing; general user-related questions on OpenFAST theory and usage should still be handled through the forum at https://wind.nrel.gov/forum/wind +* `GitHub Issues `__ has been made the primary platform for developers to report and track bugs, request feature enhancements, and to ask questions related to the source code, compiling, and regression/unit testing; general user-related questions on OpenFAST theory and usage should still be handled through the forum at https://forums.nlr.gov/ * A new API has been added that provides a high level interface to run OpenFAST through a C++ driver code helping to interface OpenFAST with external programs like CFD solvers written in C++ (starting in OpenFAST v1.0.0) @@ -77,7 +77,7 @@ Algorithmically, OpenFAST v0.1.0 is the release most closely related to FAST v8. * An online documentation system has been established to replace existing documentation of FAST v8: http://openfast.readthedocs.io/ - * `GitHub Issues `__ has been made the primary platform for developers to report and track bugs, request feature enhancements, and to ask questions related to the source code, compiling, and regression/unit testing; general user-related questions on OpenFAST theory and usage should still be handled through the forum at https://wind.nrel.gov/forum/wind + * `GitHub Issues `__ has been made the primary platform for developers to report and track bugs, request feature enhancements, and to ask questions related to the source code, compiling, and regression/unit testing; general user-related questions on OpenFAST theory and usage should still be handled through the forum at https://forums.nlr.gov/ * The AeroDyn v15 aerodynamics module has been significantly updated. The blade-element/momentum theory (BEMT) solution algorithm has been improved as follows: @@ -196,5 +196,4 @@ For unit testing, we will employ the pFUnit framework (https://sourceforge.net/p For the time being OpenFAST provides project and solution files to support users developing and compiling using Visual Studio. However, the team is continually working to automate the generation of Visual Studio build files via CMake in future releases. -Please contact `Michael.A.Sprague@NREL.gov `_ with questions regarding the OpenFAST -development plan. +Please contact `Jason.Jonkman@nlr.gov `_ or `Andy.Platt@nlr.gov `_ with questions regarding the OpenFAST development plan. diff --git a/docs/source/user/general.rst b/docs/source/user/general.rst index b29f26adbb..347e9c097d 100644 --- a/docs/source/user/general.rst +++ b/docs/source/user/general.rst @@ -39,6 +39,7 @@ of publications, presentations, and past studies on the subject. - :download:`Module and Mesh-Mapping Linearization Implementation Plan <../../OtherSupporting/LinearizationOfMeshMapping_Rev18_Rev2.doc>` - :download:`Interpolation of DCMs <../../OtherSupporting/DCM_Interpolation/DCM_Interpolation.pdf>` - A summary of the mathematics used in the interpolation of DCM (direction cosine matrices) using logarithmic mapping and matrix exponentials. - :download:`Set-point Linearization Development Plan <../../OtherSupporting/DevelopmentPlan-SetPoint-Linearization.pdf>` +- :download:`OpenFAST Tight-Coupling Solver <../../OtherSupporting/TightCoupling_Rev4.doc>` .. - :download:`OpenFAST Steady State Solution <../../OtherSupporting/OpenFASTSteadyStateSolution_Rev7.doc>` @@ -46,7 +47,9 @@ of publications, presentations, and past studies on the subject. Glue Code and Mesh Mapping ************************** +For current documentation on the glue code structure, module variable API, +solver, and linearization see :ref:`glue-code`. + - `FAST Modular Wind Turbine CAE Tool: Nonmatching Spatial and Temporal Meshes `_ - `FAST Modular Framework for Wind Turbine Simulation: New Algorithms and Numerical Examples `_ -- :download:`OpenFAST Algorithms <../../OtherSupporting/OpenFAST_Algorithms/OpenFAST_Algorithms.pdf>` - A summary of the solve method used in the glue code. - :download:`Predictor-Corrector Approach <../../OtherSupporting/ProposedPCApproach_Rev4.docx>` diff --git a/docs/source/user/glue-code/ModVar.svg b/docs/source/user/glue-code/ModVar.svg new file mode 100644 index 0000000000..465dc94dcf --- /dev/null +++ b/docs/source/user/glue-code/ModVar.svg @@ -0,0 +1,568 @@ + + + + + + +ModVarDiagram + + + +DatLoc + + + +DatLoc + + +Num + +IntKi + +i1 + +IntKi + +i2 + +IntKi + +i3 + +IntKi + +i4 + +IntKi + +i5 + +IntKi + + + +Field + + + +Field ID + + +FieldForce + +1 + +FieldMoment + +2 + +FieldOrientation + +3 + +FieldTransDisp + +4 + +FieldTransVel + +5 + +FieldAngularVel + +6 + +FieldTransAcc + +7 + +FieldAngularAcc + +8 + +FieldScalar + +9 + +FieldAngularDisp + +10 + + + +VF + + + +Variable Flag + + +VF_None + +0 + +VF_Mesh + +1 + +VF_Line + +2 + +VF_RotFrame + +4 + +VF_Linearize + +8 + +VF_ExtLin + +16 + +VF_2PI + +32 + +VF_WM_Rot + +64 + +VF_WriteOut + +128 + +VF_Solve + +256 + +VF_AeroMap + +512 + +VF_DerivOrder1 + +1024 + +VF_DerivOrder2 + +2048 + +VF_Mapping + +4096 + +VF_NoLin + +8192 + + + +ModVarType + + + +ModVarType + + +Field + +IntKi + +Nodes + +IntKi + +Num + +IntKi + +Flags + +IntKi + +DerivOrder + +IntKi + +iLoc(2) + +IntKi + +iGlu(2) + +IntKi + +iq(2) + +IntKi + +iLB + +IntKi + +iUB + +IntKi + +j + +IntKi + +k + +IntKi + +m + +IntKi + +n + +IntKi + +Perturb + +R8Ki + +DL + +DatLoc + +Name + +character + +LinNames(:) + +character + + + +ModVarType:e->DatLoc:w + + + + + +ModVarType:e->Field:w + + + + + +ModVarType:e->VF:w + + + + + +ModVarsType + + + +ModVarsType + + +Nx + +IntKi + +Nu + +IntKi + +Ny + +IntKi + +x(:) + +ModVarType + +u(:) + +ModVarType + +y(:) + +ModVarType + + + +ModVarsType:e->ModVarType:w + + + + + +ModVarsType:e->ModVarType:w + + + + + +ModVarsType:e->ModVarType:w + + + + + +ModLinType + + + +ModLinType + + +x(:) + +R8Ki + +dx(:) + +R8Ki + +u(:) + +R8Ki + +y(:) + +R8Ki + +J(:,:) + +R8Ki + +dYdx(:,:) + +R8Ki + +dXdx(:,:) + +R8Ki + +dYdu(:,:) + +R8Ki + +dXdu(:,:) + +R8Ki + +dXdy(:,:) + +R8Ki + +dUdu(:,:) + +R8Ki + +dUdy(:,:) + +R8Ki + + + +ModDataType + + + +ModDataType + + +Abbr + +character + +iMod + +IntKi + +ID + +IntKi + +Ins + +IntKi + +iRotor + +IntKi + +SubSteps + +IntKi + +Category + +IntKi + +DT + +R8Ki + +Vars + +ModVarsType + +Lin + +ModLinType + + + +ModDataType:e->ModVarsType:w + + + + + +ModDataType:e->ModLinType:w + + + + + +ModJacType + + + +ModJacType + +Owned by module + +x(:) + +R8Ki + +u(:) + +R8Ki + +y(:) + +R8Ki + +x_perturb(:) + +R8Ki + +u_perturb(:) + +R8Ki + +x_pos(:) + +R8Ki + +x_neg(:) + +R8Ki + +y_pos(:) + +R8Ki + +y_neg(:) + +R8Ki + + + +VarMapType + + + +VarMapType + + +iMapping + +IntKi + +iModSrc + +IntKi + +iModDst + +IntKi + +iVarSrc(10) + +IntKi + +iVarSrcDisp(10) + +IntKi + +iVarDst(10) + +IntKi + +iVarDstDisp(10) + +IntKi + + + +ModGlueType + + + +ModGlueType + + +Name + +character + +ModData(:) + +ModDataType + +Vars + +ModVarsType + +Lin + +ModLinType + +VarMaps + +VarMapType + + + +ModGlueType:e->ModVarsType:w + + + + + +ModGlueType:e->ModLinType:w + + + + + +ModGlueType:e->ModDataType:w + + + + + +ModGlueType:e->VarMapType:w + + + + + diff --git a/docs/source/user/glue-code/index.rst b/docs/source/user/glue-code/index.rst new file mode 100644 index 0000000000..cebb573088 --- /dev/null +++ b/docs/source/user/glue-code/index.rst @@ -0,0 +1,18 @@ +.. _glue-code: + +Glue Code +========= + +The OpenFAST *glue code* is the layer of software that initializes each physics +module, manages the flow of data between them, orchestrates the time-stepping +loop, and—optionally—linearizes the assembled system. This section documents +the glue code from a user and module-developer perspective. + +.. toctree:: + :maxdepth: 2 + + overview + modvar + modglue + solver + linearization diff --git a/docs/source/user/glue-code/linearization.rst b/docs/source/user/glue-code/linearization.rst new file mode 100644 index 0000000000..a2b3e413cc --- /dev/null +++ b/docs/source/user/glue-code/linearization.rst @@ -0,0 +1,269 @@ +.. _glue-code-linearization: + +Linearization +============= + +OpenFAST can linearise the full multi-physics system about a periodic (or +static) operating point to produce continuous-time, first-order state-space +matrices of the form + +.. math:: + + \dot{\mathbf{x}} &= A\,\mathbf{x} + B\,\mathbf{u} \\ + \mathbf{y} &= C\,\mathbf{x} + D\,\mathbf{u} + +together with the coupling matrices *dUdu* (input-to-input feed-through) and +*dUdy* (output-to-input coupling). The linearization engine lives in +``modules/openfast-library/src/FAST_ModGlue.f90``. + +.. contents:: + :local: + :depth: 2 + +User inputs for linearization +------------------------------ + +The following parameters appear in the main OpenFAST input file (``*.fst``) +under the **Linearization** section. + +.. list-table:: + :header-rows: 1 + :widths: 25 12 63 + + * - Parameter + - Type + - Description + * - ``Linearize`` + - logical + - Master switch. Set to ``True`` to enable all linearization + functionality. When ``False`` all other linearization parameters are + ignored. + * - ``CalcSteady`` + - logical + - When ``True``, OpenFAST first runs the simulation forward until the + outputs at each target azimuth converge from one rotor revolution to the + next (steady-state trimming), then performs linearization at each + azimuth. When ``False``, linearization is performed at user-specified + absolute simulation times (``LinTimes``). + * - ``TrimCase`` + - integer + - Controller degree of freedom trimmed during ``CalcSteady`` to achieve + periodic steady state. + + * ``1`` – yaw + * ``2`` – generator torque + * ``3`` – collective blade pitch + * - ``TrimTol`` + - real + - RMS convergence tolerance on normalised output error across one + rotor revolution. Trimming stops when the error falls below this + value. Typical value: ``1.0e-5``. + * - ``TrimGain`` + - real + - Proportional gain used by the built-in trim controller. + Units are rad/(rad/s) for yaw/pitch cases and N·m/(rad/s) for + the torque case. + * - ``Twr_Kdmp`` + - real + - Artificial tower damping coefficient (N/(m/s)) added during the + ``CalcSteady`` run to help damp transients and reach steady state + faster. Set to 0 to disable. + * - ``Bld_Kdmp`` + - real + - Artificial blade damping coefficient (N/(m/s)) during ``CalcSteady``. + * - ``NLinTimes`` + - integer + - Number of linearization time points per rotor revolution (or number of + equally spaced absolute time instants when ``CalcSteady=False``). + Must be ≥ 1. For a periodic model at least 12 azimuths are typically + needed to resolve the per-revolution variation. + * - ``LinTimes`` + - real array + - Absolute simulation times (seconds) at which to linearise when + ``CalcSteady=False``. Length must equal ``NLinTimes``. Ignored when + ``CalcSteady=True``. + * - ``LinInputs`` + - integer + - Controls which input variables appear in the **B** and **D** matrices. + + * ``0`` (``LIN_NONE``) – no inputs; produces state matrix only. + * ``1`` (``LIN_STANDARD``) – inputs flagged ``VF_Linearize`` by the + module (default set by each module's ``InitVars``). + * ``2`` (``LIN_ALL``) – all module inputs including debug ones. + * - ``LinOutputs`` + - integer + - Controls which output variables appear in the **C** and **D** matrices. + + * ``0`` (``LIN_NONE``) – no outputs. + * ``1`` (``LIN_STANDARD``) – ``WriteOutput`` channels only + (``VF_WriteOut`` flag). + * ``2`` (``LIN_ALL``) – all module outputs. + * - ``LinOutJac`` + - logical + - When ``True`` (requires ``LinInputs=LinOutputs=2``), the full module + Jacobian matrices are written to the linearization output file for + debugging. + * - ``LinOutMod`` + - logical + - When ``True``, per-module ``.lin`` files are written in addition to the + full-system file. + +Module support for linearization +---------------------------------- + +Modules that appear in the linearization variable ordering (set in +``ModGlue_Init``) are: + +InflowWind → SeaState → ServoDyn → ElastoDyn → BeamDyn → AeroDyn → +HydroDyn → SubDyn → MAP++ → MoorDyn + +A module that is not in this ordered list causes a fatal error if +``Linearize=True``. + +Variable selection +------------------ + +During ``ModGlue_Init``, the ``VF_Linearize`` flag is applied to variables +according to the ``LinInputs`` and ``LinOutputs`` settings: + +* **States (x)**: the ``VF_Linearize`` flag is always set on all continuous + state variables of every participating module. +* **Inputs (u)**: + + * ``LIN_NONE`` → flag cleared on all input variables. + * ``LIN_STANDARD`` → keeps whatever ``VF_Linearize`` flag was set in the + module's ``InitVars``; module developers choose the *standard* input set. + * ``LIN_ALL`` → flag set on all input variables. + * Variables with ``VF_NoLin`` always have ``VF_Linearize`` cleared, + regardless of the above setting. + +* **Outputs (y)**: + + * ``LIN_NONE`` → flag cleared on all output variables. + * ``LIN_STANDARD`` → flag set only on outputs that also carry ``VF_WriteOut``. + * ``LIN_ALL`` → flag set on all output variables. + * Variables with ``VF_NoLin`` are always excluded. + +The combined variable set is assembled into a ``ModGlueType`` named ``Lin`` +via ``ModGlue_CombineModules``. + +Steady-state trimming (``CalcSteady``) +--------------------------------------- + +When ``CalcSteady=True``, ``ModGlue_CalcSteady`` is called at each time step +to detect periodicity: + +1. The module outputs tagged ``VF_Linearize`` (excluding ``VF_WriteOut``) are + collected into a buffer indexed by azimuth angle. +2. After each complete revolution the outputs at each of the ``NLinTimes`` + azimuth targets are compared against the previous revolution via the + normalised RMS error: + + .. math:: + + \varepsilon = \sqrt{\frac{1}{N} \sum_{i=1}^{N} + \left(\frac{y_i^{\rm current} - y_i^{\rm previous}}{r_i}\right)^2} + + where :math:`r_i = \max(y_{i,\rm max} - y_{i,\rm min},\, 0.01)` is the + output range from the current revolution (with a floor to avoid division + by near-zero). + +3. When :math:`\varepsilon < \texttt{TrimTol}`, ``FoundSteady=True`` and + linearization at all ``NLinTimes`` azimuths proceeds automatically. + +4. If the simulation reaches within approximately two revolutions of ``TMax`` + without converging, a warning is issued and linearization is forced. + +The azimuth interpolation between buffer samples uses the extrapolation +routines from ``MV_ExtrapInterp`` (supports constant, linear, and quadratic +schemes depending on the number of available samples). + +linearization at an operating point +------------------------------------- + +``ModGlue_Linearize_OP`` assembles the full-system matrices at a single +operating point (time / azimuth): + +1. **Module Jacobians**: for each module, + ``FAST_JacobianPInput`` and ``FAST_JacobianPContState`` are called to + compute the per-module sub-matrices *dYdu*, *dXdu*, *dYdx*, *dXdx* by + central-difference finite differentiation. The perturbation magnitudes are + taken from each variable's ``Perturb`` field (see :ref:`glue-code-modvar`). + +2. **Operating point extraction**: ``FAST_GetOP`` packs the current states, + inputs, and outputs into the linearization arrays + (``ModGlue%Lin%x``, ``%u``, ``%y``). + +3. **Coupling matrices**: the input-output coupling matrices *dUdu* and *dUdy* + are assembled from the mesh-mapping Jacobians to account for the fact that + some module inputs are functions of other modules' outputs. + +4. **Full-system assembly**: the per-module sub-matrices are placed into the + combined glue-level matrices using the ``iGlu`` index ranges stored in + each ``ModVarType``. + +5. **Output**: ``ModGlue_CalcWriteLinearMatrices`` writes the ``.lin`` file + containing: + + * Operating point values (**x_op**, **u_op**, **y_op**) + * linearization channel names (from ``LinNames``) + * Derivative order indicators (``VF_DerivOrder1``, ``VF_DerivOrder2``) + * Rotating-frame flags (``VF_RotFrame``) + * Full-system matrices **A**, **B**, **C**, **D**, **dUdu**, **dUdy** + * Per-module matrices (if ``LinOutMod=True``) + * Full Jacobians (if ``LinOutJac=True``) + +Output file format +------------------- + +Each linearization call produces a file named +``..lin`` where *N* is the linearization index (1 … ``NLinTimes``). +The file is a plain-text ASCII file that can be read by the +`openfast_io `_ Python library or the +`pyFAST `_ post-processing tools. + +Key fields in the file header: + +* ``Rotor_Speed`` – rotor speed at linearization time (RPM) +* ``Azimuth`` – blade-1 azimuth at linearization time (deg) + +Variable naming conventions +---------------------------- + +In linearization output files each channel label follows the pattern: + +`` [, component [, node [, unit]]]`` + +Examples: + +* ``ED BlPitch1, rad`` – ElastoDyn individual blade-1 pitch state +* ``AD B1N001Fx force, node 1, N`` – AeroDyn blade 1 node 1 X-force input +* ``BD_1 B1TipTDxr translation displacement, node 10, m`` – BeamDyn instance 1 + +Module developers should ensure that the ``Name`` argument to ``MV_AddVar`` / +``MV_AddMeshVar`` and the entries in ``LinNames`` follow this convention for +consistency with post-processing tools. + +Module developer responsibilities +----------------------------------- + +To participate in linearization a module must: + +1. Call ``MV_AddVar`` / ``MV_AddMeshVar`` with appropriate ``VF_Linearize`` + flags and supply ``LinNames`` for all variables that may appear in the + standard linearization set. + +2. Implement ``_JacobianPInput`` and ``_JacobianPContState`` + subroutines (or supply analytical Jacobians through the registry). The + glue code calls these via the ``FAST_JacobianPInput`` / + ``FAST_JacobianPContState`` wrappers in ``FAST_Funcs.f90``. + +3. Implement ``_GetOP`` (via the registry) to extract the operating-point + values of states, inputs, and outputs. + +4. Mark variables that should **not** participate in linearization with + ``VF_NoLin``. + +5. Mark variables in the rotating reference frame with ``VF_RotFrame`` so that + multi-blade coordinate (MBC) transformations applied by post-processing + tools are aware of these variables. diff --git a/docs/source/user/glue-code/modglue.rst b/docs/source/user/glue-code/modglue.rst new file mode 100644 index 0000000000..c07a39d5ec --- /dev/null +++ b/docs/source/user/glue-code/modglue.rst @@ -0,0 +1,265 @@ +.. _glue-code-modglue: + +ModGlue – Combining Modules into Global Arrays +=============================================== + +``ModGlue_CombineModules`` is the single routine that transforms the +per-module variable descriptions registered by ``MV_AddVar`` / +``MV_AddMeshVar`` / ``MV_AddModule`` (see :ref:`glue-code-modvar`) into a +*monolithic* view of the coupled system. The output of the routine is a +``ModGlueType`` structure whose ``Vars`` member holds globally indexed +arrays for every state, input, and output variable that belongs to a +specified set of modules. These global arrays underpin both the solver +Jacobian construction (:ref:`glue-code-solver`) and the linearization +procedure (:ref:`glue-code-linearization`). + +.. _fig-modvar-types: + +.. figure:: ModVar.svg + :alt: ModVar data structure hierarchy + :align: center + :width: 100% + + Complete data-structure hierarchy used by the glue code. Types shown on + the left (``DatLoc``, ``Field ID``, ``Variable Flag``) are referenced from + each ``ModVarType``. ``ModDataType`` (centre, per module) is collected into + the top-level ``ModGlueType`` (right) by ``ModGlue_CombineModules``. + +.. contents:: + :local: + :depth: 2 + +The ``ModGlueType`` structure +------------------------------ + +``ModGlueType`` is defined in ``modules/openfast-library/src/Glue_Types.f90``: + +.. code-block:: fortran + + type ModGlueType + character(ChanLen) :: Name ! Label (e.g. 'Solver', 'Lin') + type(ModDataType), allocatable :: ModData(:) ! Per-module view + type(ModVarsType) :: Vars ! Combined variable arrays + type(ModLinType) :: Lin ! Linearization matrices + type(VarMapType), allocatable :: VarMaps(:) ! Relevant mappings + end type ModGlueType + +Key members: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Member + - Description + * - ``ModData(:)`` + - One entry per module included in this glue instance. Each entry is a + filtered copy of the original ``ModDataType``, containing only the + variable subset selected by ``FlagFilter``. Index ordering matches the + ``iModAry`` argument passed to ``ModGlue_CombineModules``. + * - ``Vars%x(:)`` + - Concatenated array of ``ModVarType`` descriptors for all *continuous-state* + variables across the selected modules. + * - ``Vars%u(:)`` + - Concatenated array of ``ModVarType`` descriptors for all *input* variables. + * - ``Vars%y(:)`` + - Concatenated array of ``ModVarType`` descriptors for all *output* variables. + * - ``Vars%Nx / %Nu / %Ny`` + - Total number of scalar values in each group (sum of ``Var%Num`` across + all variables in ``Vars%x / %u / %y`` respectively). These are the + row/column dimensions of the global data arrays and Jacobian matrices. + * - ``Lin`` + - Holds linearization operating-point arrays (``x``, ``dx``, ``u``, ``y``) + and the full-system matrices (``dXdx``, ``dXdu``, ``dYdx``, ``dYdu``, + ``dUdu``, ``dUdy``). Only allocated when ``Linearize=.true.``. + * - ``VarMaps(:)`` + - Filtered subset of the global ``Mappings`` array containing only the + mappings whose source **and** destination modules both appear in + ``iModAry``. Used during Jacobian finite-differencing to account for + output-to-input coupling. + +The ``iLoc`` index range +------------------------- + +After ``ModGlue_CombineModules`` returns, each variable in +``ModGlue%Vars%x / %u / %y`` carries an ``iLoc(1:2)`` range that locates it +inside the *glue-level* data vectors. Specifically, for a variable at position +*k* in ``ModGlue%Vars%x``: + +* ``iLoc(1)`` – index of its first scalar value in a length-``Vars%Nx`` array. +* ``iLoc(2)`` – index of its last scalar value. + +This is the *glue-local* index after filtration; the corresponding +per-module position is still available through the variable's ``iGlu`` range +(set earlier by ``FAST_SolverInit → CalcVarGlobalIndices``). +The ``iLoc / iGlu`` separation means the same variable descriptor can live +simultaneously in the per-module ``ModData`` view, the solver ``m%Mod`` +view, and the linearization ``m%ModGlue`` view with consistent, non-overlapping +index ranges in each context. + +What ``ModGlue_CombineModules`` does +-------------------------------------- + +The subroutine signature is: + +.. code-block:: fortran + + subroutine ModGlue_CombineModules(ModGlue, ModDataAry, Mappings, & + iModAry, FlagFilter, Linearize, & + ErrStat, ErrMsg, Name) + +.. list-table:: + :header-rows: 1 + :widths: 22 12 66 + + * - Argument + - Intent + - Description + * - ``ModGlue`` + - ``out`` + - The ``ModGlueType`` structure to populate. + * - ``ModDataAry(:)`` + - ``in`` + - Full array of per-module data registered by the glue code. + * - ``Mappings(:)`` + - ``in`` + - Full array of mesh and variable mappings. + * - ``iModAry(:)`` + - ``in`` + - Ordered list of indices into ``ModDataAry`` specifying *which* modules + to include and in *what order*. The order determines the row/column + layout of the global vectors and Jacobians. + * - ``FlagFilter`` + - ``in`` + - Bitmask of ``VF_*`` flags. Only variables that have **at least one** of + these flags set (i.e. ``MV_HasFlagsAny(Var, FlagFilter)`` is true) are + copied into the glue ``Vars`` arrays. + * - ``Linearize`` + - ``in`` + - When ``.true.``, allocates the ``Lin`` operating-point arrays and the + full-system Jacobian matrices. + * - ``Name`` + - ``in`` (optional) + - Human-readable label stored in ``ModGlue%Name`` (e.g. ``'Solver'``, + ``'Lin'``). + +The four main steps performed internally are: + +1. **Count and allocate**. Iterate over each module in ``iModAry`` and count + how many variable descriptors (and how many total scalar values) pass the + ``FlagFilter`` test for each of the *x*, *u*, *y* groups. Allocate + ``ModGlue%Vars%x / %u / %y`` to exactly those sizes. + +2. **Copy and re-index**. For each module, copy the filtered + ``ModVarType`` descriptors into ``ModGlue%Vars`` and assign contiguous + ``iLoc`` ranges so the glue-level index is consecutive across all + modules. The per-module ``ModGlue%ModData(i)%Vars`` sub-arrays receive + the same descriptors with the same ``iLoc`` so that + scatter/gather routines can operate directly on global vectors. + Linear name prefixes (e.g. ``"ED "``, ``"BD_1 "``) are prepended to + ``LinNames`` at this step to produce globally unique channel labels. + +3. **Filter mappings**. Iterate over the full ``Mappings`` array and retain + only those where both ``iModSrc`` and ``iModDst`` appear in ``iModAry``. + Re-index the retained entries against the local ``ModData`` position (not + the global ``ModDataAry`` position) and store them in + ``ModGlue%VarMaps``. + +4. **Allocate linearization storage** (only when ``Linearize=.true.``). + Allocate the ``Lin`` operating-point vectors (``x``, ``dx``, ``u``, ``y``) + and all six Jacobian matrices (``dXdx``, ``dXdu``, ``dYdx``, ``dYdu``, + ``dUdu``, ``dUdy``) dimensioned by ``Vars%Nx`` and ``Vars%Nu / Ny``. + +Where ``ModGlue_CombineModules`` is called +------------------------------------------ + +The routine is called twice during OpenFAST initialisation, producing two +distinct ``ModGlueType`` instances with different variable selections: + +``m%Mod`` – the Solver glue module (in ``FAST_SolverInit``) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: fortran + + iMod = [p%iModTC, p%iModOpt1] ! TC + Option-1 indices + + call ModGlue_CombineModules(m%Mod, GlueModData, GlueModMaps, iMod, & + VF_Solve, .true., ErrStat2, ErrMsg2, & + Name='Solver') + +* **Modules included**: tight-coupling (TC) modules plus Option-1 modules. +* **Variable filter**: ``VF_Solve``. This flag is set by + ``FAST_SolverInit → SetVarSolveFlags`` on every variable that must appear + in the Newton iteration: TC continuous states, motion/load mesh + inputs/outputs involved in inter-module couplings, and any + variable-to-variable mapped inputs/outputs (see :ref:`glue-code-solver` + for the full selection criteria). +* **Linearize**: ``.true.`` — the Jacobian matrices are allocated here + because the solver's Newton linear system reuses the same storage as the + operating-point linearization. +* **Result**: ``m%Mod%Vars%Nx`` equals the number of TC displacement/velocity + scalars (``p%NumQ``); ``m%Mod%Vars%Nu`` covers all TC and Option-1 inputs + flagged ``VF_Solve``. The Jacobian dimension ``p%NumJ = p%NumQ + p%NumU`` + follows directly. + +``m_FAST%ModGlue`` – the Linearization glue module (in ``ModGlue_Init``) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: fortran + + LinFlags = VF_Linearize + VF_Mapping + VF_Mesh + + call ModGlue_CombineModules(m%ModGlue, m%ModData, m%Mappings, & + p%Lin%iMod, LinFlags, & + p_FAST%Linearize, ErrStat2, ErrMsg2, & + Name="Lin") + +* **Modules included**: all modules participating in linearization, in the + canonical order set by ``p%Lin%iMod`` (InflowWind → SeaState → ServoDyn → + ElastoDyn → BeamDyn → AeroDyn → HydroDyn → SubDyn → MAP++ → MoorDyn). +* **Variable filter**: ``VF_Linearize + VF_Mapping + VF_Mesh``. The + ``VF_Linearize`` flag is applied per variable according to the + ``LinInputs`` / ``LinOutputs`` settings in the input file; + ``VF_Mapping`` / ``VF_Mesh`` ensure that mesh-coupled variables are always + included so that coupling Jacobians can be assembled even when a variable + is not a formal linearization output. +* **Linearize**: ``p_FAST%Linearize`` — only allocates the full full-system + matrices when linearization is requested. +* **Result**: ``m%ModGlue%Vars%Nx / %Nu / %Ny`` give the dimensions of the + **A**, **B**, **C**, **D**, **dUdu**, **dUdy** matrices written to the + ``.lin`` file. + +How the global index enables matrix assembly +-------------------------------------------- + +Because every variable descriptor carries its ``iLoc`` range in the glue +``Vars`` array, scatter and gather operations on global data vectors become +trivial index-range assignments. For example, to pack a module's state +vector into the global solver vector ``x_global``: + +.. code-block:: fortran + + do iVar = 1, size(ModData%Vars%x) + associate (Var => ModData%Vars%x(iVar)) + x_global(Var%iLoc(1):Var%iLoc(2)) = x_mod(Var%iGlu(1):Var%iGlu(2)) + end associate + end do + +And the corresponding gather from the global Jacobian column into a +per-module sub-column requires no offset arithmetic: the ``iLoc`` index +already encodes the correct global position. + +Similarly, the ``VarMaps`` array stored in ``ModGlueType`` makes the +Jacobian coupling terms self-contained. During +``BuildJacobianTC`` / ``BuildJacobianIO`` (in ``FAST_Solver.f90``) and +``ModGlue_Linearize_OP`` (in ``FAST_ModGlue.f90``), the loop is simply: + +.. code-block:: fortran + + do i = 1, size(ModGlue%VarMaps) + ! perturb source output, evaluate destination input change + ! scatter result into J(iVarDst%iLoc, iVarSrc%iLoc) + end do + +No module-specific knowledge is needed at this level — the ``ModGlueType`` +instance is fully self-describing. diff --git a/docs/source/user/glue-code/modvar.dot b/docs/source/user/glue-code/modvar.dot new file mode 100644 index 0000000000..ded9305eaa --- /dev/null +++ b/docs/source/user/glue-code/modvar.dot @@ -0,0 +1,167 @@ +digraph ModVarDiagram { + graph [fontname = "Helvetica,Arial,sans-serif"; rankdir = LR; ranksep = 1;]; + node [fontname = "Helvetica,Arial,sans-serif"; shape = record; style = filled; fillcolor = gray95;]; + edge [fontname = "Helvetica,Arial,sans-serif";]; + + + + + DatLoc [shape = plain;label = < + + + + + + + +
DatLoc
NumIntKi
i1IntKi
i2IntKi
i3IntKi
i4IntKi
i5IntKi
>;]; + + Field [shape = plain;label = < + + + + + + + + + + + +
Field ID
FieldForce1
FieldMoment2
FieldOrientation3
FieldTransDisp4
FieldTransVel5
FieldAngularVel6
FieldTransAcc7
FieldAngularAcc8
FieldScalar9
FieldAngularDisp10
>;]; + + VF [shape = plain;label = < + + + + + + + + + + + + + + + + +
Variable Flag
VF_None0
VF_Mesh1
VF_Line2
VF_RotFrame4
VF_Linearize8
VF_ExtLin16
VF_2PI32
VF_WM_Rot64
VF_WriteOut128
VF_Solve256
VF_AeroMap512
VF_DerivOrder11024
VF_DerivOrder22048
VF_Mapping4096
VF_NoLin8192
>;]; + + ModVarType [shape = plain;label = < + + + + + + + + + + + + + + + + + + + +
ModVarType
FieldIntKi
NodesIntKi
NumIntKi
FlagsIntKi
DerivOrderIntKi
iLoc(2)IntKi
iGlu(2)IntKi
iq(2)IntKi
iLBIntKi
iUBIntKi
jIntKi
kIntKi
mIntKi
nIntKi
PerturbR8Ki
DLDatLoc
Namecharacter
LinNames(:)character
>;]; + + ModVarsType [shape = plain;label = < + + + + + + + +
ModVarsType
NxIntKi
NuIntKi
NyIntKi
x(:)ModVarType
u(:)ModVarType
y(:)ModVarType
>;]; + + + + ModLinType [shape = plain;label = < + + + + + + + + + + + + + +
ModLinType
x(:)R8Ki
dx(:)R8Ki
u(:)R8Ki
y(:)R8Ki
J(:,:)R8Ki
dYdx(:,:)R8Ki
dXdx(:,:)R8Ki
dYdu(:,:)R8Ki
dXdu(:,:)R8Ki
dXdy(:,:)R8Ki
dUdu(:,:)R8Ki
dUdy(:,:)R8Ki
>;]; + + ModDataType [shape = plain;label = < + + + + + + + + + + + +
ModDataType
Abbrcharacter
iModIntKi
IDIntKi
InsIntKi
iRotorIntKi
SubStepsIntKi
CategoryIntKi
DTR8Ki
VarsModVarsType
LinModLinType
>;]; + + ModJacType [shape = plain;label = < + + + + + + + + + + +
ModJacType
Owned by module
x(:)R8Ki
u(:)R8Ki
y(:)R8Ki
x_perturb(:)R8Ki
u_perturb(:)R8Ki
x_pos(:)R8Ki
x_neg(:)R8Ki
y_pos(:)R8Ki
y_neg(:)R8Ki
>;]; + + + + VarMapType [shape = plain;label = < + + + + + + + + +
VarMapType
iMappingIntKi
iModSrcIntKi
iModDstIntKi
iVarSrc(10)IntKi
iVarSrcDisp(10)IntKi
iVarDst(10)IntKi
iVarDstDisp(10)IntKi
>;]; + + ModGlueType [shape = plain;label = < + + + + + + +
ModGlueType
Namecharacter
ModData(:)ModDataType
VarsModVarsType
LinModLinType
VarMapsVarMapType
>;]; + + + ModVarType:Field:e -> Field:header:w; + ModVarType:Flags:e -> VF:header:w; + ModVarType:DatLoc:e -> DatLoc:header:w; + ModVarsType:x:e -> ModVarType:header:w; + ModVarsType:u:e -> ModVarType:header:w; + ModVarsType:y:e -> ModVarType:header:w; + + ModDataType:Vars:e -> ModVarsType:header:w; + + ModDataType:Lin:e -> ModLinType:header:w; + + ModGlueType:ModData:e -> ModDataType:header:w; + ModGlueType:Vars:e -> ModVarsType:header:w; + ModGlueType:Lin:e -> ModLinType:header:w; + ModGlueType:VarMaps:e -> VarMapType:header:w; +} diff --git a/docs/source/user/glue-code/modvar.rst b/docs/source/user/glue-code/modvar.rst new file mode 100644 index 0000000000..e52f8a1747 --- /dev/null +++ b/docs/source/user/glue-code/modvar.rst @@ -0,0 +1,454 @@ +.. _glue-code-modvar: + +Module Variables (``ModVar``) +============================= + +The ``ModVar`` module (``modules/nwtc-library/src/ModVar.f90``) provides the data +structures and subroutines that allow each physics module to declare its +continuous states, inputs, and outputs in a way that the glue code can +manipulate generically—without knowing the internals of any particular module. + +The complete type hierarchy—from ``DatLoc`` and ``ModVarType`` through +``ModVarsType`` and ``ModDataType`` up to the top-level ``ModGlueType``—is +illustrated in :numref:`fig-modvar-types`. + +.. contents:: + :local: + :depth: 2 + +Data structures +--------------- + +``DatLoc`` +~~~~~~~~~~ + +A ``DatLoc`` (data location) is a small structure used to uniquely identify +where a particular variable lives inside a module's derived-type hierarchy: + +.. code-block:: fortran + + TYPE :: DatLoc + INTEGER :: Num ! Data identification number (from _Types.f90 file) + INTEGER :: i1 ! First index + INTEGER :: i2 ! Second index + INTEGER :: i3 ! Third index + INTEGER :: i4 + INTEGER :: i5 + END TYPE DatLoc + +A ``DatLoc`` value is created once per variable by the registry-generated +``DatLoc()`` constructor calls inside each module's ``InitVars`` subroutine and +passed to ``MV_AddVar`` / ``MV_AddMeshVar``. The glue code stores this value +inside each ``ModVarType`` and uses ``MV_EqualDL`` to match variables across +source and destination modules when setting up mesh mappings. + +``ModVarType`` +~~~~~~~~~~~~~~ + +Describes a single variable (or group of variables for a mesh field): + +.. code-block:: fortran + + TYPE :: ModVarType + INTEGER :: Field ! Field type (FieldForce, FieldTransDisp, ...) + INTEGER :: Nodes ! Number of nodes (mesh variables only) + INTEGER :: Num ! Total number of scalar values + INTEGER :: Flags ! Bit-mask of VF_* flags + INTEGER :: DerivOrder ! 0=disp/orientation, 1=velocity, 2=acceleration + INTEGER :: iLoc(2) ! [start, end] in module-local array + INTEGER :: iGlu(2) ! [start, end] in glue-level array + INTEGER :: iq(2) ! [start, end] in solver state (q) array + INTEGER :: iLB, iUB ! User array bounds (for array-valued scalars) + INTEGER :: j, k, m, n ! Additional user-defined indices + REAL(R8Ki) :: Perturb ! Perturbation size for Jacobian finite differences + TYPE(DatLoc) :: DL ! Data location + CHARACTER :: Name ! Human-readable variable name + CHARACTER(:), ALLOCATABLE :: LinNames(:) ! Per-value linearization labels + END TYPE ModVarType + +``ModVarsType`` +~~~~~~~~~~~~~~~ + +Holds all variables for one module, partitioned into three groups: + +.. code-block:: fortran + + TYPE :: ModVarsType + INTEGER :: Nx, Nu, Ny + TYPE(ModVarType), ALLOCATABLE :: x(:) ! Continuous states + TYPE(ModVarType), ALLOCATABLE :: u(:) ! Inputs + TYPE(ModVarType), ALLOCATABLE :: y(:) ! Outputs + END TYPE ModVarsType + +``ModDataType`` +~~~~~~~~~~~~~~~ + +Top-level container that the glue code holds for each module instance: + +.. code-block:: fortran + + TYPE :: ModDataType + CHARACTER :: Abbr ! Module abbreviation ("ED", "BD", ...) + INTEGER :: iMod ! Index in glue module array + INTEGER :: ID ! Module_ED, Module_BD, ... + INTEGER :: Ins ! Instance number + INTEGER :: iRotor ! Rotor index (0 = all rotors) + INTEGER :: SubSteps ! Module sub-steps per solver step + INTEGER :: Category ! Bit-mask of MC_* coupling flags + REAL(R8Ki) :: DT ! Module time step + TYPE(ModVarsType) :: Vars + TYPE(ModLinType) :: Lin + END TYPE ModDataType + +Variable flags (``VF_*``) +------------------------- + +Flags are combined via ``IOR`` and tested with ``MV_HasFlagsAll`` / +``MV_HasFlagsAny``. + +.. list-table:: + :header-rows: 1 + :widths: 25 10 65 + + * - Flag + - Value + - Meaning + * - ``VF_None`` + - 0 + - No flags set; used as a wildcard that matches any variable. + * - ``VF_Mesh`` + - 1 + - Variable is a mesh field (set automatically by ``MV_AddMeshVar``). + * - ``VF_Line`` + - 2 + - Mesh is a *line* mesh (loads per unit length); linearization labels get + ``/m`` suffix. + * - ``VF_RotFrame`` + - 4 + - Variable lives in the rotating reference frame. + * - ``VF_Linearize`` + - 8 + - Variable is included in the full-system linearization. + * - ``VF_ExtLin`` + - 16 + - Variable is included in extended linearization output. + * - ``VF_2PI`` + - 32 + - Scalar angle with range [0, 2Ï€] (e.g. generator azimuth). + * - ``VF_WriteOut`` + - 64 + - Output variable associated with a ``WriteOutput`` channel. + * - ``VF_Solve`` + - 256 + - Variable participates in the tight-coupling Jacobian or input-output + convergence solve. Set automatically by ``FAST_SolverInit``; + module developers should not set this flag manually. + * - ``VF_AeroMap`` + - 512 + - Variable used in aeromap computation. + * - ``VF_Mapping`` + - 1024 + - Variable participates in a module-to-module transfer mapping. + * - ``VF_NoLin`` + - 8192 + - Explicitly excludes a variable from both linearization and the solver + (overrides ``VF_Linearize`` and ``VF_Solve``). + +Field types (``Field*``) +------------------------ + +Used in the ``Field`` member of ``ModVarType`` and in ``MV_AddMeshVar``'s +``Fields`` argument: + +.. list-table:: + :header-rows: 1 + :widths: 30 70 + + * - Constant + - Meaning + * - ``FieldForce`` + - Nodal force (3 components per node, N) + * - ``FieldMoment`` + - Nodal moment (3 components per node, N·m) + * - ``FieldTransDisp`` + - Translational displacement (m) + * - ``FieldOrientation`` + - Orientation, stored internally as unit-quaternion parameters (rad) + * - ``FieldTransVel`` + - Translational velocity (m/s) + * - ``FieldAngularVel`` + - Angular velocity (rad/s) + * - ``FieldTransAcc`` + - Translational acceleration (m/s²) + * - ``FieldAngularAcc`` + - Angular acceleration (rad/s²) + * - ``FieldAngularDisp`` + - Angular displacement (rad) + * - ``FieldScalar`` + - Generic scalar values + +Convenience arrays defined in ``ModVar.f90``: + +* ``LoadFields`` = ``[FieldForce, FieldMoment]`` +* ``TransFields`` = ``[FieldTransDisp, FieldTransVel, FieldTransAcc]`` +* ``AngularFields``= ``[FieldOrientation, FieldAngularVel, FieldAngularAcc, FieldAngularDisp]`` +* ``MotionFields`` = all translational and angular motion fields + +Adding module variables +----------------------- + +Each module that participates in the glue code must implement an +``InitVars`` (or equivalent) subroutine that populates a ``ModVarsType`` +structure by calling the ``MV_Add*`` subroutines documented below. This +subroutine is called during the module's ``_Init`` routine and the resulting +``Vars`` is passed immediately to ``MV_AddModule``. + +``MV_AddVar`` +~~~~~~~~~~~~~ + +Adds a single (possibly multi-element) scalar variable to a variable array. + +.. code-block:: fortran + + subroutine MV_AddVar(VarAry, Name, Field, DL, & + Num, iAry, jAry, kAry, & + Flags, DerivOrder, Perturb, LinNames, Active) + +.. list-table:: + :header-rows: 1 + :widths: 20 10 70 + + * - Argument + - Intent + - Description + * - ``VarAry`` + - ``INOUT`` + - Allocatable array of ``ModVarType``; the new variable is appended. + * - ``Name`` + - ``IN`` + - Human-readable name used in debug output and linearization labels. + * - ``Field`` + - ``IN`` + - Field type constant (``FieldScalar``, ``FieldTransDisp``, etc). + * - ``DL`` + - ``IN`` + - ``DatLoc`` identifying where the data live in the module's derived type. + * - ``Num`` + - ``IN`` (optional) + - Number of scalar values. Defaults to 1. If 0, the call is a no-op. + * - ``iAry`` + - ``IN`` (optional) + - Starting lower-bound index if the data are stored in an array. + * - ``jAry``, ``kAry`` + - ``IN`` (optional) + - Second and third array indices (for 2-D or 3-D arrays). + * - ``Flags`` + - ``IN`` (optional) + - Initial ``VF_*`` flag bit-mask. Defaults to ``VF_None``. + * - ``DerivOrder`` + - ``IN`` (optional) + - Override the automatically-inferred derivative order (0, 1, or 2). + * - ``Perturb`` + - ``IN`` (optional) + - Finite-difference perturbation magnitude. A good default is roughly + 1 % of the expected variable magnitude. For mesh fields the default + computed inside ``ModVarType_Init`` is used when this is omitted. + * - ``LinNames`` + - ``IN`` (optional) + - Array of per-value linearization channel labels (length = ``Num``). + **Required** for non-mesh, non-scalar variables. + * - ``Active`` + - ``IN`` (optional) + - Set to ``.false.`` to conditionally skip adding the variable. + +**Example** – registering the generator torque input of ServoDyn: + +.. code-block:: fortran + + call MV_AddVar(Vars%u, 'Generator torque command', FieldScalar, & + DatLoc(SrvD_u_GenTrq), & + Flags=VF_Linearize, & + Perturb=1.0e3_R8Ki, & ! N*m + LinNames=['SrvD GenTrq, N*m']) + +``MV_AddMeshVar`` +~~~~~~~~~~~~~~~~~ + +Adds all requested mesh fields for a single ``MeshType`` to a variable array. +It is a convenience wrapper around ``MV_AddVar`` that iterates over the +``Fields`` argument and skips fields that are absent from the committed mesh. + +.. code-block:: fortran + + subroutine MV_AddMeshVar(VarAry, Name, Fields, DL, Mesh, & + Flags, Perturbs, Active, iVar) + +.. list-table:: + :header-rows: 1 + :widths: 20 10 70 + + * - Argument + - Intent + - Description + * - ``VarAry`` + - ``INOUT`` + - Allocatable array to append the new variable(s) to. + * - ``Name`` + - ``IN`` + - Base name for all fields on this mesh. + * - ``Fields`` + - ``IN`` + - Integer array of field-type constants; use the ``LoadFields``, + ``MotionFields``, etc. convenience parameters where appropriate. + * - ``DL`` + - ``IN`` + - ``DatLoc`` for this mesh within the module's data type. + * - ``Mesh`` + - ``INOUT`` + - The committed ``MeshType``. Its ``ID`` field is set to identify it in + mesh-mapping operations. The subroutine returns without adding anything + if the mesh has not been committed. + * - ``Flags`` + - ``IN`` (optional) + - Extra ``VF_*`` flags added on top of ``VF_Mesh``. + * - ``Perturbs`` + - ``IN`` (optional) + - Array of perturbation values, one per entry in ``Fields``. + * - ``Active`` + - ``IN`` (optional) + - Conditionally disable the entire mesh variable registration. + * - ``iVar`` + - ``OUT`` (optional) + - Returns the assigned mesh ``ID`` so the caller can store it for later + field look-ups. + +**Example** – registering ElastoDyn's blade-root output motion mesh: + +.. code-block:: fortran + + call MV_AddMeshVar(Vars%y, 'BladeRootMotion', MotionFields, & + DatLoc(ED_y_BladeRootMotion, i), & ! blade i + p%BladeRootMotion(i), & + Flags=VF_Linearize + VF_RotFrame) + +``MV_AddModule`` +~~~~~~~~~~~~~~~~ + +After a module's ``InitVars`` subroutine is complete, the caller registers the +module with the glue code using ``MV_AddModule``. + +.. code-block:: fortran + + subroutine MV_AddModule(ModDataAry, ModID, ModAbbr, Instance, & + ModDT, SolverDT, Vars, Linearize, & + ErrStat, ErrMsg, iRotor) + +.. list-table:: + :header-rows: 1 + :widths: 20 10 70 + + * - Argument + - Intent + - Description + * - ``ModDataAry`` + - ``INOUT`` + - Allocatable array of ``ModDataType``; the new entry is appended. + * - ``ModID`` + - ``IN`` + - Module identifier constant (``Module_ED``, ``Module_BD``, etc.). + * - ``ModAbbr`` + - ``IN`` + - Short abbreviation string used in output labels (``"ED"``, ``"BD"``). + * - ``Instance`` + - ``IN`` + - Instance number (1-based). Most modules have a single instance. + * - ``ModDT`` + - ``IN`` + - Module time step (seconds). Must be an exact integer divisor of + ``SolverDT``. + * - ``SolverDT`` + - ``IN`` + - Solver (global) time step. + * - ``Vars`` + - ``IN`` + - Populated ``ModVarsType`` from the module's ``InitVars`` call. + * - ``Linearize`` + - ``IN`` + - Whether linearization is enabled. When ``.false.``, ``LinNames`` + arrays are deallocated to save memory. + * - ``ErrStat`` / ``ErrMsg`` + - ``OUT`` + - Error status and message. + * - ``iRotor`` + - ``IN`` (optional) + - Rotor number for multi-rotor turbines (0 = all rotors). + +**Sub-stepping logic**: if ``ModDT < SolverDT``, ``MV_AddModule`` calculates +``ModData%SubSteps = NINT(SolverDT/ModDT)`` and validates that the module DT +divides the solver DT exactly. An error is returned if ``ModDT > SolverDT``. + +**Typical call sequence inside FAST_Subs.f90**: + +.. code-block:: fortran + + ! Module computes its own Vars in Init + call ED_Init(InitInp, u, p, ..., InitOut, ErrStat, ErrMsg) + ! Register with glue code + call MV_AddModule(m%ModData, Module_ED, 'ED', 1, p%DT, p_FAST%DT, & + InitOut%Vars, p_FAST%Linearize, ErrStat, ErrMsg, iRotor=1) + +``MV_InitVarsJac`` +~~~~~~~~~~~~~~~~~~ + +Called inside each module's ``InitVars`` after all ``MV_AddVar`` / +``MV_AddMeshVar`` calls are complete. It assigns the module-local ``iLoc`` +index ranges to each variable and allocates the ``ModJacType`` working arrays +used during Jacobian calculations. + +.. code-block:: fortran + + subroutine MV_InitVarsJac(Vars, Jac, Linearize, ErrStat, ErrMsg) + +Perturbation values +------------------- + +Every variable carries a ``Perturb`` value used for central-difference +finite-differencing when building module-level Jacobians. The ``Perturb`` +argument to ``MV_AddVar`` / ``MV_AddMeshVar`` should be chosen so that the +resulting output change is large enough to distinguish from numerical noise +but small enough to stay in the linear regime. Typical values: + +* Translational displacement: ``1.0e-4`` m +* Rotational (orientation): ``2.0e-5`` rad +* Translational velocity: ``1.0e-3`` m/s +* Angular velocity: ``2.0e-4`` rad/s +* Translational acceleration: ``1.0e-2`` m/s² +* Force: ``1.0e1`` N +* Moment: ``1.0e1`` N·m +* Generic scalar: context-dependent + +The ``UJacSclFact`` input parameter (see :ref:`glue-code-solver-inputs`) is a +global conditioning factor that the solver applies to load variables in the +Jacobian to improve matrix conditioning when force/moment magnitudes are very +different from state magnitudes. + +Orientation representation +-------------------------- + +Orientations are **not** stored or manipulated as direction cosine matrices +(DCMs) inside the glue-variable arrays. Instead, a compact three-component +unit-quaternion parameterization is used: + +.. math:: + + \mathbf{q}_p = [q_1, q_2, q_3] \quad \text{where } q_0 = \sqrt{1 - q_1^2 - q_2^2 - q_3^2} + +This parameterization avoids the redundancy in a full DCM and enables +straightforward finite-differencing via quaternion composition +(``quat_compose``). Conversion utilities exported from ``ModVar`` include +``dcm_to_quat``, ``quat_to_dcm``, ``quat_compose``, ``quat_inv``, +``quat_to_rvec``, ``rvec_to_quat``, ``wm_to_quat``, and ``quat_to_wm``. + +When computing orientation differences for Jacobian rows, ``MV_ComputeDiff`` +computes the relative rotation between the negative and positive-perturbation +quaternions and converts it to a rotation vector. diff --git a/docs/source/user/glue-code/overview.rst b/docs/source/user/glue-code/overview.rst new file mode 100644 index 0000000000..e775961555 --- /dev/null +++ b/docs/source/user/glue-code/overview.rst @@ -0,0 +1,103 @@ +.. _glue-code-overview: + +Glue Code Overview +================== + +The OpenFAST glue code is the software layer that connects individual physics modules +(ElastoDyn, AeroDyn, HydroDyn, ServoDyn, etc.) into a coupled simulation. It lives +primarily in ``modules/openfast-library/src/`` and relies on the ``ModVar`` module in +``modules/nwtc-library/src/ModVar.f90`` for an abstract description of every +variable exchanged between modules. + +High-level responsibilities include: + +* Initialising each module and registering its variables with the glue code +* Managing multi-rate sub-stepping (modules whose time step is a divisor of the + global time step) +* Mapping outputs of one module to inputs of another (motion meshes, load meshes, + and scalar variables) +* Running the time-stepping loop under either loose coupling or tight + generalized-alpha coupling +* Linearising the assembled system to produce state-space matrices + +Source files +------------ + +.. list-table:: + :header-rows: 1 + :widths: 35 65 + + * - File + - Purpose + * - ``FAST_Subs.f90`` + - Top-level initialisation: reads input file, calls each module's ``_Init``, + and calls ``MV_AddModule`` to register every module with the glue code. + * - ``FAST_ModGlue.f90`` + - Combines per-module variable descriptions into a monolithic ``ModGlueType`` + structure via ``ModGlue_CombineModules``; performs linearization + (``ModGlue_Linearize_OP``) and steady-state trimming + (``ModGlue_CalcSteady``). + * - ``FAST_Solver.f90`` + - Implements the generalized-alpha tight-coupling solver + (``FAST_SolverStep``), the input-output convergence loop + (``FAST_CalcOutputsAndSolveForInputs``), and Jacobian assembly. + * - ``FAST_Mapping.f90`` + - Mesh-to-mesh and variable-to-variable transfer mappings. + * - ``FAST_Funcs.f90`` + - Wrappers around module-level ``CalcOutput``, ``UpdateStates``, + ``CalcContStateDeriv``, ``GetOperatingPoint``, and ``SetOperatingPoint`` + that dispatch to the correct module instance. + * - ``ModVar.f90`` (nwtc-library) + - The ``ModVar`` module: data structures (``ModVarType``, ``ModVarsType``, + ``ModDataType``, ``DatLoc``) and all ``MV_*`` subroutines. + +Module coupling categories +-------------------------- + +Each module is assigned to exactly one coupling category during initialisation in +``FAST_SolverInit``: + +.. list-table:: + :header-rows: 1 + :widths: 20 15 65 + + * - Category + - Flag + - Description + * - Tight Coupling (TC) + - ``MC_Tight`` + - States and accelerations are solved simultaneously via the generalized-alpha + Newton iteration. ElastoDyn, BeamDyn, and SubDyn are tight-coupling modules + when ``ModCoupling`` ≥ 2. + * - Option 1 + - ``MC_Option1`` + - Modules whose inputs depend on TC outputs and are converged in the same + Newton loop (e.g. HydroDyn, MoorDyn, ServoDyn with structural controllers). + * - Option 2 + - ``MC_Option2`` + - Loosely coupled modules that are called once per step before the convergence + loop (InflowWind, SeaState, AeroDyn, etc.). + * - Post + - ``MC_Post`` + - Modules whose input solve is deferred until after the convergence loop + (ServoDyn, ExternalInflow). + +Time-stepping loop (overview) +------------------------------ + +Each call to ``FAST_SolverStep`` follows this sequence: + +1. **Correction iterations** (outer loop) – at most ``p%MaxConvIter`` iterations. +2. **Option 2** – input solve + state update + ``CalcOutput`` for loosely coupled modules. +3. **Option 1** – input solve + state update for semi-implicit modules. +4. **TC input solve** – gather inputs for the tight-coupling modules. +5. **Convergence iterations** (inner loop) – Newton-Raphson updates of TC + states and inputs until the update norm falls below ``ConvTol`` or the + iteration limit is reached. +6. **Post-solve input solves** – ServoDyn, ExternalInflow. + +Module registration and variable ordering are described in detail in +:ref:`glue-code-modvar`. How the per-module variables are assembled into +global arrays and Jacobian matrices is covered in :ref:`glue-code-modglue`. +The solver algorithm and Jacobian construction are covered in +:ref:`glue-code-solver`. diff --git a/docs/source/user/glue-code/solver.rst b/docs/source/user/glue-code/solver.rst new file mode 100644 index 0000000000..62bf2a6256 --- /dev/null +++ b/docs/source/user/glue-code/solver.rst @@ -0,0 +1,338 @@ +.. _glue-code-solver: + +Solver +====== + +The OpenFAST tight-coupling solver is implemented in +``modules/openfast-library/src/FAST_Solver.f90``. It integrates the continuous +states and resolves the input-output coupling between modules using a +generalized-alpha scheme with Newton-Raphson convergence iterations. + +.. contents:: + :local: + :depth: 2 + +.. _glue-code-solver-inputs: + +User input parameters +--------------------- + +All solver parameters are set in the main OpenFAST input file +(``*.fst``) under the **Feature Switches and Flags** and +**Tight-Coupling / Solver** sections. + +.. list-table:: + :header-rows: 1 + :widths: 22 12 66 + + * - Parameter + - Type + - Description + * - ``DT`` + - real + - Global (solver) time step in seconds. All module time steps must be + equal to or an integer sub-divisor of ``DT``. + * - ``ModCoupling`` + - integer + - Coupling method. + + * ``1`` – Loose coupling: structural modules (ED/BD/SD) are treated as + Option 1 and do **not** participate in the tight Newton loop. + * ``2`` – Tight coupling with fixed Jacobian updates (``DT_UJac`` + controls update frequency). + * ``3`` – Tight coupling with adaptive Jacobian updates (the Jacobian is + rebuilt whenever the Newton loop fails to converge within the + iteration budget). + * - ``RhoInf`` + - real + - Numerical damping parameter Ï∞ for the generalized-alpha integrator. + Range [0, 1]; 1 = no numerical damping (second-order accurate), 0 = + maximum damping (first-order accurate). Typical value: **0.9**. + Reducing ``RhoInf`` below 1 damps high-frequency numerical noise at the + cost of slightly reduced accuracy. + * - ``MaxConvIter`` + - integer + - Maximum number of Newton convergence iterations per time step before the + solver declares convergence failure. Typical value: **20**. + With ``ModCoupling=2`` or ``1``, a fatal error is issued on failure; + with ``ModCoupling=3`` the Jacobian is rebuilt first and the step is + retried before a warning is emitted. + * - ``ConvTol`` + - real + - Convergence tolerance. The iteration stops when the average + `L2`-norm of the Newton update vector falls below this value. + Typical value: ``1.0e-4``. Tighter tolerances increase + computational cost but may be needed for stiff problems. + * - ``DT_UJac`` + - real + - Time interval (seconds) between Jacobian rebuilds when + ``ModCoupling=2``. + + * If ``DT_UJac < DT``: the Jacobian is rebuilt at a fraction of the + convergence-iteration budget. + * If ``DT_UJac ≥ DT``: the Jacobian is rebuilt every + ``CEILING(DT_UJac/DT)`` time steps. + * Setting ``DT_UJac`` very large (e.g. ``9999``) freezes the Jacobian + for the entire simulation; useful for profiling or when the system + is nearly linear and the Jacobian is expensive. + * - ``UJacSclFact`` + - real + - Conditioning scale factor applied to load rows and columns of the + Jacobian. Force and moment variables are divided by this factor before + the linear solve and multiplied back afterwards, equalising the magnitude + of load entries relative to displacement/velocity entries. Typical + value: **1.0e5** for offshore systems; may need adjustment for very + large or very small turbines. + * - ``CompElast`` + - integer + - Select the structural dynamics module: ``1`` = ElastoDyn, + ``2`` = BeamDyn (blades only, ElastoDyn still handles the tower/platform), + ``3`` = Simplified ElastoDyn. The chosen modules become TC members when + ``ModCoupling ≥ 2``. + * - ``CompSub`` + - integer + - Sub-structural module: ``0`` = none, ``1`` = SubDyn, ``2`` = ExtPtfm, + ``3`` = SlD (SoilDyn). SubDyn joins the TC set when + ``ModCoupling ≥ 2``. + * - ``CompHydro`` + - integer + - ``0`` = none, ``1`` = HydroDyn. HydroDyn is always Option 1. + * - ``CompMooring`` + - integer + - ``0`` = none, ``1`` = MAP++, ``2`` = FEAMooring, ``3`` = MoorDyn, + ``4`` = OrcaFlex. Mooring modules are always Option 1. + * - ``CompAero`` + - integer + - Aerodynamics module: ``0`` = none, ``1`` = AeroDisk, ``2`` = AeroDyn. + AeroDyn is Option 2 for land-based turbines and Option 1 for MHK. + * - ``CompServo`` + - integer + - Controller module: ``0`` = none, ``1`` = ServoDyn. ServoDyn is + Post-solve by default but becomes Option 1 when structural controllers + (tower, blade, nacelle StC) are active. + +Generalized-alpha integration +------------------------------ + +The tight-coupling solver integrates second-order ODEs of the form + +.. math:: + + \mathbf{M}\,\ddot{\mathbf{q}} + \mathbf{f}(\mathbf{q}, \dot{\mathbf{q}}, t) = 0 + +using the **generalized-alpha method** (Chung & Hulbert, 1993). Given the +spectral radius Ï∞ specified by ``RhoInf``, the method parameters are: + +.. math:: + + \alpha_m &= \frac{2\rho_\infty - 1}{\rho_\infty + 1} \\ + \alpha_f &= \frac{\rho_\infty}{\rho_\infty + 1} \\ + \gamma &= \tfrac{1}{2} - \alpha_m + \alpha_f \\ + \beta &= \tfrac{1}{4}(1 - \alpha_m + \alpha_f)^2 + +Two derived coefficients used throughout the convergence loop are: + +.. math:: + + \beta' &= h^2 \beta \frac{1 - \alpha_f}{1 - \alpha_m} \\ + \gamma' &= h \gamma \frac{1 - \alpha_f}{1 - \alpha_m} + +where *h* = ``DT``. + +**State vector layout** – the solver maintains a per-module *generalized +coordinate* (q) vector with four columns: + +.. list-table:: + :header-rows: 1 + :widths: 15 85 + + * - Column + - Meaning + * - ``q`` + - Displacement / orientation states (``DerivOrder = 0``) + * - ``v`` + - Velocity states (``DerivOrder = 1``) + * - ``vd`` + - Acceleration (physical, from module ``CalcContStateDeriv``) + * - ``a`` + - Algorithmic acceleration (generalized-alpha internal variable) + +State prediction at the start of each step: + +.. math:: + + q_{n+1}^{\rm pred} &= q_n + h v_n + h^2[(\tfrac{1}{2} - \beta)a_n + \beta\, a_{n+1}] \\ + v_{n+1}^{\rm pred} &= v_n + h[(1-\gamma)a_n + \gamma\, a_{n+1}] + +Module ordering +--------------- + +During ``FAST_SolverInit`` each module is categorised based on ``ModCoupling`` +and its own physics type, and assigned to one of the ordered index arrays +in the ``Glue_TCParam`` structure: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Array + - Modules (in order) + * - ``iModTC`` + - ElastoDyn, BeamDyn, SubDyn (when ``ModCoupling ≥ 2``) + * - ``iModOpt1`` + - ServoDyn (when StC active), SED, AD (MHK), ExtPtfm, HydroDyn, OrcaFlex, + MoorDyn; ED/BD/SD also appear here when ``ModCoupling = 1`` + * - ``iModOpt2`` + - ServoDyn, SED, ED, BD, SD, InflowWind, SeaState, AeroDyn (land), + AeroDisk, ExtLoads, MAP++, FEAMooring, IceDyn, IceFloe, SoilDyn + * - ``iModPost`` + - ServoDyn, ExternalInflow + * - ``iModInit`` + - SED, ED, BD, SD, InflowWind, ExtLoads (Step 0 initialisation only) + +Jacobian construction +--------------------- + +Two separate Jacobians are assembled: + +1. **TC/Option-1 Jacobian** (``BuildJacobianTC``) — for the main time-stepping + convergence loop. +2. **IO Jacobian** (``BuildJacobianIO``) — for the initial and linearization + input-output solve. + +Variable selection (``VF_Solve`` flag) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +During ``FAST_SolverInit → SetVarSolveFlags``, the ``VF_Solve`` flag is set on +the variables that must appear in the Jacobian: + +* **Continuous states** of all TC modules (automatically). +* **Motion mesh** inputs/outputs of TC-to-TC mappings (all fields). +* **Motion mesh** input accelerations of TC-to-Option1 or + Option1-to-TC mappings. +* **Load mesh** inputs and outputs involved in any TC/Option1 mapping. +* **Load mesh** displacement outputs of the destination module when the mapping + carries moments (needed for moment-arm Jacobian terms). +* **Variable-to-variable** mapped inputs/outputs of TC/Option1 modules. +* Any variable with ``VF_NoLin`` is excluded from ``VF_Solve``. + +Jacobian structure (TC Jacobian) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The assembled TC Jacobian **J** has size ``NumJ × NumJ``, where: + +.. math:: + + N_J = \underbrace{N_Q}_{\text{TC states}} + + \underbrace{N_{U_T}}_{\text{TC inputs}} + + \underbrace{N_{U_1}}_{\text{Option-1 inputs}} + +The columns and rows are partitioned as: + +.. math:: + + \mathbf{J} = \begin{bmatrix} + J_{11} & J_{12} \\ + J_{21} & J_{22} + \end{bmatrix} + +where + +* **Jâ‚â‚** (``NumQ × NumQ``) — derivative of the acceleration residual with + respect to TC displacement/velocity states (formed from the module + ``dXdx`` sub-Jacobians plus the generalized-alpha tangent). +* **Jâ‚â‚‚** (``NumQ × NumU_T``) — derivative of the acceleration residual with + respect to TC inputs (from ``dXdu``). +* **Jâ‚‚â‚** (``NumU_T × NumQ``) — derivative of the input residual with + respect to TC states (from ``dUdx = dUdy · dydx``). +* **Jâ‚‚â‚‚** (``NumU × NumU``) — derivative of the input residual with + respect to inputs, including load conditioning rows/columns. + +The right-hand side (XB) contains the residuals: + +* **State residual** (rows ``iJX``): difference between the predicted + velocity derivative and the module-computed accelerations. +* **Input residual** (rows ``iJU``): difference between the inputs computed + from mesh mappings (``FAST_InputSolve``) and the current iterate. + +The loads portion (rows ``iJL``) is pre-divided by ``UJacSclFact`` before the +factorisation to improve conditioning. + +Jacobian update strategy +~~~~~~~~~~~~~~~~~~~~~~~~ + +``ModCoupling = 2`` (fixed updates) + The Jacobian is rebuilt if either of these counters reaches zero: + + * ``UJacStepsRemain`` — steps remaining; initialised to + ``CEILING(DT_UJac/DT)`` each time the Jacobian is rebuilt. + * ``UJacIterRemain`` — iteration budget; initialised to + ``CEILING(DT_UJac/DT · MaxConvIter)`` when ``DT_UJac < DT``. + + On convergence failure the solver returns a fatal error immediately. + +``ModCoupling = 3`` (adaptive updates) + The Jacobian is rebuilt the first time the convergence loop fails. If the + step still does not converge after the forced rebuild, a non-fatal warning + is issued and the simulation proceeds. + +Per-module Jacobian contributions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The module-level Jacobian sub-matrices are computed by finite differencing +inside ``BuildJacobianTC`` and ``BuildJacobianIO`` using the ``MV_Perturb`` / +``MV_ComputeDiff`` / ``MV_ComputeCentralDiff`` utilities from ``ModVar``. For +each variable flagged ``VF_Solve``: + +1. Apply a positive perturbation of magnitude ``Var%Perturb`` to the working + state/input array. +2. Call ``FAST_CalcOutput`` (or ``FAST_GetContStateDeriv``). +3. Apply an equal negative perturbation. +4. Call again. +5. Compute the central difference: ``(y_plus - y_minus) / (2·Perturb)``. + +For orientation variables (``FieldOrientation``), perturbations are applied by +quaternion composition rather than direct addition (``MV_Perturb``), and +differences are extracted as rotation vectors (``MV_ComputeDiff``). + +Linear solve +~~~~~~~~~~~~ + +The LU factorisation of **J** is computed with ``LAPACK_getrf`` and the system +is solved with ``LAPACK_getrs`` (packed in ``NWTC_LAPACK``). The same +factored matrix is reused across convergence iterations until the update +strategy triggers a rebuild. + +Convergence check +~~~~~~~~~~~~~~~~~ + +After each Newton step the convergence error is the average `L2`-norm of the +update vector: + +.. math:: + + e = \frac{\|\Delta \mathbf{z}\|_2}{N_J} + +where :math:`\Delta \mathbf{z}` combines state and input updates. The loop +exits if ``e < ConvTol`` (``ErrID_None``) or the iteration count reaches +``MaxConvIter`` (``ErrID_Fatal`` or ``ErrID_Warn`` depending on +``ModCoupling``). + +Output channels from the solver +-------------------------------- + +Three output channels are written to ``DriverWriteOutput`` each step and +appear in the output file when enabled: + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Index + - Content + * - 1 + - Total convergence iterations in the step (``TotalIter``) + * - 2 + - Final convergence error (``ConvError``) + * - 3 + - Number of Jacobian rebuilds in the step (``NumUJac``) diff --git a/docs/source/user/hydrodyn/appendix.rst b/docs/source/user/hydrodyn/appendix.rst index 558914dbaf..824778bf12 100644 --- a/docs/source/user/hydrodyn/appendix.rst +++ b/docs/source/user/hydrodyn/appendix.rst @@ -8,7 +8,7 @@ The following is a HydroDyn primary input file for OC4 semi-submersible structure:: ------- HydroDyn Input File ---------------------------------------------------- - NREL 5.0 MW offshore baseline floating platform HydroDyn input properties for the OC4 Semi-submersible. + historic NREL 5.0 MW offshore baseline floating platform HydroDyn input properties for the OC4 Semi-submersible. False Echo - Echo the input file data (flag) ---------------------- FLOATING PLATFORM --------------------------------------- [unused with WaveMod=6] 1 PotMod - Potential-flow model {0: none=no potential flow, 1: frequency-to-time-domain transforms based on WAMIT output, 2: fluid-impulse theory (FIT)} (switch) diff --git a/docs/source/user/hydrodyn/index.rst b/docs/source/user/hydrodyn/index.rst index 2dd19deb89..309e63a72d 100644 --- a/docs/source/user/hydrodyn/index.rst +++ b/docs/source/user/hydrodyn/index.rst @@ -26,11 +26,11 @@ development plans, and publications are made available for reference. Note that some of these may be outdated and pertain to older versions of HydroDyn. -- :download:`Computation of Wave Loads Under Multidirectional Sea States for Floating Offshore Wind Turbines ` -- :download:`Effects of Second-Order Hydrodynamic Forces on Floating Offshore Wind Turbines ` -- :download:`State-Space Realization of the Wave-Radiation Force within FAST ` +- :download:`Computation of Wave Loads Under Multidirectional Sea States for Floating Offshore Wind Turbines ` +- :download:`Effects of Second-Order Hydrodynamic Forces on Floating Offshore Wind Turbines ` +- :download:`State-Space Realization of the Wave-Radiation Force within FAST ` - :download:`Dynamics of Offshore Floating Wind Turbines—Model Development and Verification ` -- :download:`Dynamics Modeling and Loads Analysis of an Offshore Floating Wind Turbine ` +- :download:`Dynamics Modeling and Loads Analysis of an Offshore Floating Wind Turbine ` - :download:`Draft Implementation Plan - Changes in HydroDyn to Support Time-Varying Buoyancy Loads on Morison Members <../../../OtherSupporting/HydroDyn/HydroDyn_Plan_TCF_Morison.docx>` - :download:`Implementation Plan - Modifications to State-Space Modules in HydroDyn to Support Multiple WAMIT Bodies <../../../OtherSupporting/HydroDyn/HydroDyn_Plan_TCF_NBodyStateSpace.docx>` - :download:`Implementation Plan (Revised) - Changes in HydroDyn to Support Multiple WAMIT Bodies <../../../OtherSupporting/HydroDyn/HydroDyn_Plan_TCF_NBody.docx>` @@ -77,7 +77,7 @@ a separate frequency-domain panel code (e.g., WAMIT) from a pre-computation step. The radiation memory effect can be calculated either through direct time-domain convolution or through a linear state-space approach, with a state-space model derived through the -`SS_Fitting `_ +`SS_Fitting `_ preprocessor. The second-order terms can be derived from the full difference- and sum-frequency quadratic transfer functions (QTFs) or the difference-frequency terms can be estimated via Standing et al.’s :cite:`Standing:1987` diff --git a/docs/source/user/hydrodyn/input_files.rst b/docs/source/user/hydrodyn/input_files.rst index a1a12a4ba3..914d8e914c 100644 --- a/docs/source/user/hydrodyn/input_files.rst +++ b/docs/source/user/hydrodyn/input_files.rst @@ -70,7 +70,18 @@ rotation first, followed by pitch rotation, and roll last. Furthermore, HydroDyn now expects the first and second time derivatives of the Tait-Bryan roll, pitch, and yaw angles in place of angular velocity and acceleration. The standalone HydroDyn driver will convert these inputs -to angular velocity and acceleration internally. +to angular velocity and acceleration internally. + +**NAddDOF** indicates the number of additional degrees of freedom included +with a potential-flow body. These additional modes can be used to describe +a flexible or articulated body. **NAddDOF** > 0 is only allowed with a single +potential-flow body, and the value of **NAddDOF** in the driver input file +must match that in the HydroDyn primary input file. If more than one +potential-flow bodies are included, **NAddDOF** should be a single zero in +the driver input file. This is different from the HydroDyn primary input file, +where **NAddDOF** should contain **NBody** zeros. See details below on +the HydroDyn primary input file. Note that the generalized modes with +**NAddDOF** > 0 are still an experimental feature. Setting **PRPInputsMod** = 0 forces all platform reference point (PRP) input motions to zero for all time. If you set **PRPInputsMod** = 1, @@ -115,7 +126,7 @@ to specify different motions for the PRP, which controls the motion of all strip-theory members based on rigid-body kinematics, and for each potential-flow bodies separately. With this option, the user only specifies the translational and rotational displacements. HydroDyn will compute the -velocity and acceleration by numerically differentiating the displacement +velocity and acceleration by numerically differentiating the displacements with respect to time. .. _hd-prp_input_table_2: @@ -136,6 +147,26 @@ with respect to time. ... ... ... ============= =================================================================================== ======================== +Finally, when a single potential-flow body with additional generalized degrees +of freedom is modeled, motions of the generalized modes can be prescribed by +setting **PRPInputsMod** = -1 (only one body allowed). HydroDyn will compute the +velocity and acceleration of the generalized modes by numerically differentiating +the displacements with respect to time. + +.. _hd-prp_input_table_3: + +.. table:: PRP Inputs Time-Series Data File Contents (**PRPInputsMod** = -1 with **NAddDOF** > 0) + :widths: auto + + ============= =================================================================================== ======================== + Column Number Input Units + ============= =================================================================================== ======================== + 1 Time step value .. math:: s + 2-4 Translational displacements of the PRP along *X*, *Y*, and *Z* .. math:: m + 5-7 Tait-Bryan roll, pitch, and yaw angles of the PRP .. math:: \text{radians} + 8-(NAddDOF+7) Displacements of the **NAddDOF** generalized modes .. math:: - + ============= =================================================================================== ======================== + .. _hd-primary-input: HydroDyn Primary Input File @@ -349,7 +380,7 @@ any file headers. When the linear state-space model is used in place of frequency-to-time domain transformation for wave excitation or in place of convolution for radiation, the *.ssexctn* file for wave excitation (more information to be provided in the future) and/or the *.ss* file -for radiation generated by `SS_Fitting `__ +for radiation generated by `SS_Fitting `__ must have the same root name as the other WAMIT-related files. When **NBodyMod** = 1, **PotFile** should only contain one entry irrespective of @@ -389,6 +420,36 @@ to the value computed by WAMIT as output in the WAMIT ``.out`` file. center of buoyancy of each body from the origin/PRP, NOT from **PtfmRefxt** and **PtfmRefyt**. +*Experimental feature* + +**NAddDOF** is an array of **NBody** numbers indicating the number of +additional generalized degrees of freedom of each potential-flow body. These +additional modes can be used to describe flexible or articulated bodies and +must match the modes in the 1st-order WAMIT-style input files, i.e., the .1, +.3, and .hst files. The convention for the WAMIT-style input files requires +the first 6 modes to be rigid-body modes always, and the additional generalized +modes are numbered from 7 onward. The total number of modes in the 1st-order +WAMIT-style input files should be **6+NAddDOF** for each body. Currently, only +one potential-flow body is allowed when additional degrees of freedom are used, +requiring **NBody = 1**. In this case, the choice of **NBodyMod** does not +matter. If more than one potential-flow bodies are present, **NAddDOF** should +be populated with **NBody** zeros. This because, internally, HydroDyn supports +additional degrees of freedom for an arbitrary number of bodies with any of the +**NBodyMod** options. The limitation of one potential-flow body only is due +to constraints with coupling to ExtPtfm, the only module that can make use of the +additional modes so far and input file limitations. Generalized modes have not +been implemented for 2nd-order loads; therefore, the 2nd-order WAMIT-style input +files, if included, should always contain **6NBody** modes irrespective of +**NAddDOF**. Finally, when **NAddDOF > 0**, **WAMITULEN** must be 1. + +Currently, the HydroDyn loads for the additional degrees of freedom can only be +used by the ExtPtfm module of OpenFAST with externally generated structural +mass (M), stiffness (K), and damping (C) matrices. This workflow is intended for +floating structures only with 6DOF rigid-body motions and a user-defined number +of additional elastic modes. The number of modes in HydroDyn and ExtPtfm must match. +More specifically, the number of modes active in ExtPtfm must be equal to +**6+NAddDOF** with the first 6 modes also being rigid-body modes. + .. _hd-2nd_order_floating_platform_forces_input: 2\ :sup:`nd`-Order Floating Platform Forces @@ -486,20 +547,26 @@ where :math:`\overrightarrow{F}_{0}` corresponds to the **AddF0** static load (p :math:`\overrightarrow{q}` corresponds to the displacement vector of the potential-flow bodies (translation and rotation), where the overdot refers to the first time-derivative. +In the absence of additional degrees of freedom, i.e., **NAddDOF** is all zeros, **AddF0** is either a column vector with 6\ **NBody** entries if **NBodyMod** = 1 or **NBody** column vectors with six entries each if **NBodyMod** = 2 or 3. In the former case, **AddF0** will span 6\ **NBody** lines with each line containing a single number in the input file. In the latter case, **AddF0** will span six lines with each line -containing **NBody** numbers in the input file. +containing **NBody** numbers in the input file. When additional degrees of +freedom are included, only one potential-flow body is allowed, and **AddF0** +should be a column vector spanning 6 + **NAddDOF** rows. +In the absence of additional degrees of freedom, **AddCLin**, **AddBLin**, and **AddBQuad** are either a single 6\ **NBody**\ -by-6\ **NBody** matrix if **NBodyMod** = 1 or six 6-by-6 matrices if **NBodyMod** = 2 or 3. In the former case, each matrix spans 6\ **NBody** lines in the input file with each line containing 6\ **NBody** numbers. In the latter case, each matrix spans six lines in the input file, with each line containing 6\ **NBody** -numbers. +numbers. When additional degrees of freedom are included, only one +potential-flow body is allowed, and each of these matrices should span +6 + **NAddDOF** rows, with each row containing 6 + **NAddDOF** numbers. These terms can be used, e.g., to model a linearized mooring system, to augment strip-theory members with a linear hydrostatic restoring matrix @@ -508,7 +575,9 @@ HydroDyn to match damping to experimental results, such as free-decay tests. While likely most useful for floating systems, these matrices can also be used for fixed-bottom systems; in both cases, the resulting load is applied at the reference point of each potential-flow body given by **PtfmRefxt**, -**PtfmRefyt**, and **PtfmRefzt**. +**PtfmRefyt**, and **PtfmRefzt**. When additional generalized degrees of +freedom are included with a potential-flow body, **AddF0** can be used to +apply constant hydrostatic/buoyancy loads to the generalized modes. Strip theory options -------------------- @@ -536,6 +605,17 @@ accounted for if **WaveDisp** = 1. **AMMod** should only be set to 0 if wave stretching is causing numerical instabilities with flexible fixed-bottom support structures modeled in SubDyn. +**HstMod** controls the computation of distributed hydrostatic loads on +strip-theory members. If **HstMod** = 0, the hydrostatic pressure is always +integrated on the instantaneous wetted surface up to the SWL, even if wave +stretching is enabled. If **HstMod** = 1 and one of the wave stretching model is +selected with **WaveStMod** > 0, the hydrostatic pressure will be integrated up +to the instantaneous wave free surface, considering both wave elevation and wave +slope. If wave stretching is not used, **HstMod** will always be set to zero +internally, disregarding the user input. Irrespective of **HstMod**, the exact +displaced position of the structure is always used when computing hydrostatic +loads to obtain the correct hydrostatic restoring effect. + Axial Coefficients ------------------ This and the next several sections of the input file control the diff --git a/docs/source/user/index.rst b/docs/source/user/index.rst index f06e595df3..c74a99f6f4 100644 --- a/docs/source/user/index.rst +++ b/docs/source/user/index.rst @@ -14,6 +14,7 @@ This section contains documentation for the OpenFAST module-coupling environment :maxdepth: 1 General considerations + Glue Code AeroDyn OLAF Aeroacoustics @@ -40,7 +41,7 @@ Additional module documentation The following modules do not currently have formal documentation or are contributed to OpenFAST from organizations -external to NREL and the core OpenFAST team. As documentation is added, +external to NLR and the core OpenFAST team. As documentation is added, these resources will be moved to their appropriate location. If newer versions of the external resources are available, please open a `GitHub Issue `_ with the information for the new documentation. diff --git a/docs/source/user/inflowwind/index.rst b/docs/source/user/inflowwind/index.rst index 8bdb736093..3f58488619 100644 --- a/docs/source/user/inflowwind/index.rst +++ b/docs/source/user/inflowwind/index.rst @@ -19,4 +19,5 @@ InflowWind Users Guide and Theory Manual driver.rst input.rst + user_defined.rst appendix.rst diff --git a/docs/source/user/inflowwind/input.rst b/docs/source/user/inflowwind/input.rst index b2d9e97335..b9655b8427 100644 --- a/docs/source/user/inflowwind/input.rst +++ b/docs/source/user/inflowwind/input.rst @@ -115,3 +115,28 @@ be performed in a different order than if both angles are specified in the same [U V W] = R(wind direction: InflowWind) * R(upflow: InflowWind) * R(wind direction: UniformWind) * R(upflow: UniformWind) * [u v w] +.. _inflow_superposition: + +Superposition of Wave and Current Inflow +======================================== +For MHK turbines, wave and current velocities and accelerations are superimposed (i.e., summed) such that all submerged components are exposed +to the same inflow field. Both AeroDyn and HydroDyn can query SeaState for wave field information. SeaState then queries InflowWind for the current +field, sums the velocities and accelerations, and returns the superimposed flow field information. This has several implications for modeling +MHK turbines, which are listed below. Note that dynamic pressure contributions from InflowWind are neglected. + +When modeling a rotor or rotor/tower only (i.e., hydrodynamics modeled in AeroDyn only): + +- SeaState must be used when defining a flow field with waves +- Current definition in SeaState must always be set to 0 +- If SeaState is activated, InflowWind must also be activated, though the current can be set to 0 +- InflowWind must be used when defining a flow field with currents +- For combined wave and current flow fields, SeaState will query InflowWind + +When modeling a rotor or rotor/tower and support structure (i.e., hydrodynamics modeled in AeroDyn and HydroDyn): + +- SeaState must always be used, even when defining a flow field with no waves +- Current definition in SeaState must always be set to 0 +- If SeaState is activated, InflowWind must also be activated, though the current can be set to 0 +- InflowWind must be used when defining a flow field with currents +- For current only cases, set the SeaState wave field to 0; current information will be passed through SeaState from InflowWind +- For combined wave and current flow fields, SeaState will query InflowWind \ No newline at end of file diff --git a/docs/source/user/inflowwind/user_defined.rst b/docs/source/user/inflowwind/user_defined.rst new file mode 100644 index 0000000000..d7dee2f34e --- /dev/null +++ b/docs/source/user/inflowwind/user_defined.rst @@ -0,0 +1,303 @@ +.. _ifw_user_defined: + +User-Defined Wind Fields +========================= + +This section explains how to implement custom wind fields in InflowWind using ``WindType = 6``. + +Overview +-------- + +The user-defined wind field feature allows developers to implement custom wind models by: + +1. Defining a data structure to hold wind field parameters +2. Initializing that data structure from input files or parameters +3. Implementing a function to return wind velocities at any position and time + +This is useful for: + +- Analytical wind models (e.g., vortex, wake models) +- Custom wind profiles not available in standard formats +- Coupling to external wind solvers +- Real-time wind measurements from sensors +- Research and development of new wind field representations + +.. important:: + After modifying the registry files (``.txt`` files), you must rebuild the project + to regenerate the type definition files (``*_Types.f90``). The modifications to the + ``.txt`` files define the extended data structures, but they won't be available + until after regeneration. + +Implementation Steps +-------------------- + +Step 1: Define Data Structure +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Edit ``modules/inflowwind/src/IfW_FlowField.txt`` and add fields to ``UserFieldType``: + +.. code-block:: text + + typedef ^ UserFieldType ReKi RefHeight - - - "reference height; used to center the wind" meters + typedef ^ ^ IntKi NumDataLines - 0 - "number of data lines (for time-varying user wind)" - + typedef ^ ^ DbKi DTime : - - "time array for user-defined wind" seconds + typedef ^ ^ ReKi Data :: - - "user-defined wind data array [NumDataLines, NumDataColumns]" - + typedef ^ ^ CHARACTER(1024) FileName - - - "name of user wind file (if applicable)" - + +Add any custom fields needed for your wind model implementation. + +Step 2: Define Initialization Inputs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Edit ``modules/inflowwind/src/InflowWind_IO.txt`` and add fields to ``User_InitInputType``: + +.. code-block:: text + + typedef ^ User_InitInputType CHARACTER(1024) WindFileName - - - "name of file containing user-defined wind data (if applicable)" - + typedef ^ ^ ReKi RefHt - - - "reference height for user wind field" meters + typedef ^ ^ IntKi NumDataColumns - 0 - "number of data columns in user wind file (if applicable)" - + +Add any parameters needed to initialize your wind model. + +Step 3: Regenerate Type Files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +After modifying the registry files, rebuild the project to regenerate type definitions. When using Visual Studio +to build OpenFAST on Windows, the types files are automatically regenerated. When using CMake, +run the following commands to enable generation of the types files. + +.. code-block:: bash + + cd build + cmake .. -DGENERATE_TYPES=ON + make + +The build process automatically regenerates the ``*_Types.f90`` files from the ``.txt`` registry files. + +Step 4: Implement Initialization +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Edit ``modules/inflowwind/src/InflowWind_IO.f90`` and implement ``IfW_User_Init()``: + +.. code-block:: fortran + + subroutine IfW_User_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrMsg) + ! Initialize UF%RefHeight, read data files, allocate arrays + ! Set FileDat metadata (wind type, time range, spatial extent, etc.) + ! Write summary information to SumFileUnit if > 0 + end subroutine + +This routine: + +- Reads any necessary input files specified in ``InitInp`` +- Allocates and populates the ``UserFieldType`` (``UF``) data structure +- Sets appropriate metadata in the ``WindFileDat`` structure +- Writes initialization information to the summary file + +Step 5: Implement Velocity Function +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Edit ``modules/inflowwind/src/IfW_FlowField.f90`` and implement ``UserField_GetVel()``: + +.. code-block:: fortran + + subroutine UserField_GetVel(UF, Time, Position, Velocity, ErrStat, ErrMsg) + ! Use UF data to compute velocity at Position and Time + ! Position(1) = X, Position(2) = Y, Position(3) = Z (meters) + ! Return Velocity(1) = U, Velocity(2) = V, Velocity(3) = W (m/s) + end subroutine + +This function is called for each position where wind velocities are needed during simulation. + +Coordinate Systems +------------------ + +Input Coordinates (Position) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- **X**: Downstream direction (after rotation applied by InflowWind) +- **Y**: Lateral/crosswind direction +- **Z**: Vertical direction (measured from ground, Z=0 is ground level) +- **Units**: meters + +Output Velocities (Velocity) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- **U**: Velocity component along X (positive = downwind) +- **V**: Velocity component along Y (positive = to the left when looking downwind) +- **W**: Velocity component along Z (positive = upward) +- **Units**: m/s + +.. note:: + InflowWind handles the rotation between global coordinates and wind coordinates. + Your implementation should work in the wind coordinate system where X is aligned + with the mean wind direction. + +Example Implementation +---------------------- + +Power-Law Wind Profile +~~~~~~~~~~~~~~~~~~~~~~ + +This example implements a simple power-law wind profile. + +**Velocity Function** (in ``IfW_FlowField.f90``): + +.. code-block:: fortran + + subroutine UserField_GetVel(UF, Time, Position, Velocity, ErrStat, ErrMsg) + type(UserFieldType), intent(in) :: UF + real(DbKi), intent(in) :: Time + real(ReKi), intent(in) :: Position(3) + real(ReKi), intent(out) :: Velocity(3) + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + real(ReKi) :: RefSpeed, Exponent, Height + + ErrStat = ErrID_None + ErrMsg = "" + + ! Get reference speed and exponent from UF%Data + RefSpeed = UF%Data(1, 1) ! Reference wind speed (m/s) + Exponent = UF%Data(1, 2) ! Power law exponent + Height = Position(3) ! Height above ground + + ! Apply power law: U(z) = Uref * (z/zref)^alpha + if (Height > 0.0_ReKi) then + Velocity(1) = RefSpeed * (Height / UF%RefHeight)**Exponent + Velocity(2) = 0.0_ReKi ! No lateral wind + Velocity(3) = 0.0_ReKi ! No vertical wind + else + Velocity = 0.0_ReKi ! Below ground + end if + + end subroutine + +**Initialization** (in ``InflowWind_IO.f90``): + +.. code-block:: fortran + + subroutine IfW_User_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrMsg) + ! ... (declarations) + + ErrStat = ErrID_None + ErrMsg = "" + + ! Set reference height + UF%RefHeight = InitInp%RefHt + + ! Allocate data array for [RefSpeed, Exponent] + UF%NumDataLines = 1 + call AllocAry(UF%Data, 1, 2, 'User wind data', TmpErrStat, TmpErrMsg) + call SetErrStat(TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + ! Set values (could read from file instead) + UF%Data(1, 1) = 10.0_ReKi ! 10 m/s reference speed + UF%Data(1, 2) = 0.2_ReKi ! Power law exponent + + ! Set metadata + FileDat%WindType = 6 + FileDat%RefHt = UF%RefHeight + FileDat%MWS = UF%Data(1, 1) + FileDat%RefHt_Set = .true. + ! ... (set other FileDat fields as needed) + + end subroutine + +Common Use Cases +---------------- + +Steady Analytical Wind Field +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Define wind as a function of position only (ignore ``Time`` parameter). + +**Example**: Logarithmic wind profile, vortex wind field, uniform flow with shear. + +Time-Varying Wind Field +~~~~~~~~~~~~~~~~~~~~~~~ + +Store wind data in time series arrays and interpolate based on ``Time`` parameter. + +**Example**: Measured wind data, prescribed wind transients, wake models. + +Wind from External Solver +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Call external functions to get instantaneous wind fields. + +**Example**: CFD coupling, external wake models, prescribed turbulence. + +Real-Time Sensor Data +~~~~~~~~~~~~~~~~~~~~~ + +Load measured wind data from sensors and interpolate spatially/temporally. + +**Example**: LIDAR measurements, met mast data, field measurements. + +Limitations and Considerations +------------------------------- + +Current Limitations +~~~~~~~~~~~~~~~~~~~ + +1. **No Acceleration Support**: User-defined wind fields do not currently support + acceleration calculations needed by some modules (e.g., MHK turbines). + +Performance Considerations +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- ``UserField_GetVel()`` is called for every point at every time step +- Implement efficiently; pre-compute values in ``IfW_User_Init()`` when possible +- Consider caching or interpolation strategies for complex calculations + +Error Handling +~~~~~~~~~~~~~~ + +- Always validate input parameters in ``IfW_User_Init()`` +- Check array bounds in ``UserField_GetVel()`` +- Verify Position and Time values are within valid ranges +- Use ``SetErrStat()`` to report errors appropriately + +Best Practices +-------------- + +1. **Start Simple**: Begin with analytical models before implementing complex wind fields + +2. **Document Thoroughly**: Add detailed comments explaining your implementation and any file formats + +3. **Use SI Units**: Always use meters, seconds, and m/s + +4. **Pre-compute**: Calculate as much as possible during initialization rather than runtime + +5. **Validate**: Test with known analytical solutions before using in production + +6. **Handle Boundaries**: Implement appropriate behavior for points outside valid domain + +7. **Report Metadata**: Properly populate ``WindFileDat`` with time range, spatial extent, etc. + +File Locations +-------------- + +========================================== ========================================================== +File Purpose +========================================== ========================================================== +``modules/inflowwind/src/`` Source code directory +``IfW_FlowField.txt`` Type definitions for flow field data structures +``InflowWind_IO.txt`` Type definitions for initialization inputs +``IfW_FlowField.f90`` Flow field implementation (``UserField_GetVel()``) +``InflowWind_IO.f90`` Initialization implementation (``IfW_User_Init()``) +``IfW_FlowField_Types.f90`` Auto-generated type definitions (regenerated from .txt) +``InflowWind_IO_Types.f90`` Auto-generated type definitions (regenerated from .txt) +========================================== ========================================================== + +Additional Resources +-------------------- + +- See the original :download:`InflowWind Manual ` for general InflowWind information +- Review existing wind field implementations (Uniform, Grid3D) in the source code for reference +- Check :ref:`ifw_appendix` for example input files +- Refer to NWTC Library documentation for array allocation and error handling utilities +- See :ref:`ifw_angles` for information about wind coordinate systems and rotations diff --git a/docs/source/user/seastate/input_files.rst b/docs/source/user/seastate/input_files.rst index b7dcc5cf14..526533ebd6 100644 --- a/docs/source/user/seastate/input_files.rst +++ b/docs/source/user/seastate/input_files.rst @@ -175,6 +175,44 @@ always be evaluated up to the SWL. Extrapolation stretching (**WaveStMod** = 2) is not supported when **WaveMod** = 6 (externally generated full wave-kinematics time series). +**WvCrntMod** controls the modeling of combined wave and current conditions. +It can be set to 0, 1, or 2 with the following effects. + ++----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **WvCrntMod** value | Effects | ++======================+===============================================================================================================================================================================================================================================================================================+ +| 0 | Simple superposition where the current velocity and acceleration are added to those of the waves. Current has no direct impact on the waves. This option reproduces the behavior of previous versions of OpenFAST. | ++----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 1 | Include Doppler effect on the waves by solving the wave dispersion relation corrected for current. The input wave spectrum/time series are assumed to be those directly measured in a region with the current and are not modified by SeaState. Wavelengths are corrected for Doppler effect. | ++----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2 | Full interaction between waves and current with both Doppler effect and wave amplitude/spectrum scaling for wave-current interactions. The input wave spectrum/time series are assumed to be those measured in a region without current and rescaled based on the current velocity/direction. | ++----------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Setting **WvCrntMod** to 1 and 2 imposes additional restrictions on the allowed waves and current. + ++----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| **WvCrntMod** value | Restrictions | ++======================+==============================================================================================================================================================================================================================+ +| 0 | No additional restrictions | ++----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 1 | First-order long-crested waves without directional spreading | ++----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +| 2 | First-order long-crested waves without directional spreading; colinear (aligned or opposing) waves and current only; the amplitude/spectrum scaling implemented assumes deep-water conditions, although this is not checked. | ++----------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ + +Strictly speaking, options 1 and 2 of **WvCrntMod** are only valid for a uniform current; +however, sheared current is allowed, and it is up to the user to ensure that the current +profile near the surface down to a depth relevant to the waves is reasonably uniform. +SeaState simply takes the current velocity at the still water level when computing the +effects of the current on the waves. The improved wave-current modeling can be used with +either SeaState current or dynamic current from InflowWind when simulating marine +hydrokinetic turbines. For the latter, wave-current interaction is based on the +time-averaged current velocity at the still water level. For applicable **WindType** in +InflowWind, users should ensure that the flow-field grid from InflowWind reaches the still +water level. **WvCrntMod** has no effect when **WaveMod** = 0 or 6, or when there is no +current from either SeaState (**CurrMod** = 0) or InflowWind if simulating marine +hydrokinetic turbines. + **WaveTMax** sets the length of the incident wave kinematics time series, but it also determines the frequency step used in the inverse FFT, from which the internal wave time series are derived (*Δω* = diff --git a/docs/source/user/servodyn-stc/StC_input.rst b/docs/source/user/servodyn-stc/StC_input.rst index c132873d09..f5615bf176 100644 --- a/docs/source/user/servodyn-stc/StC_input.rst +++ b/docs/source/user/servodyn-stc/StC_input.rst @@ -106,8 +106,9 @@ StC Degrees of Freedom **StC_DOF_MODE** [switch] DOF mode {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF - (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: TLCD; - 4: Prescribed force/moment time series; 5: Force determined by external DLL} + (three independent StC DOFs); 2: StC_XY_DOF (2DOF Omni-Directional StC); 3: + StC_XYZ_DOF (3DOF Omni-Directional StC); 5: TLCD; 6: Prescribed force/moment + time series; 7: Force determined by external DLL} **StC_X_DOF** [flag] @@ -145,7 +146,7 @@ specified in the main ServoDyn input file. See description above. StC Initial Conditions ---------------------- -*used only when* **StC_DOF_MODE==1 or 2** +*used only when* **StC_DOF_MODE==1, 2, or 3** **StC_X_DSP** [m] @@ -158,7 +159,7 @@ StC Initial Conditions **StC_Z_DSP** [m] StC Z initial displacement *[relative to at rest position; used only when* - **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *]* + **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** *]* **StC_Z_PreLd** [N] @@ -167,13 +168,14 @@ StC Initial Conditions position of the StC Z mass when gravity is acting on it using :math:`F_{Z_{PreLoad}} = M_Z * G`, or **"none"** to disable spring pre-load. See :numref:`SrvD-StCz-PreLoad` for details of implementation. - *[used only when* **StC_DOF_MODE=1** and **StC_Z_DOF=TRUE** *]* + *[used only when* **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *or when* + **StC_DOF_MODE==3** *]* StC Configuration ----------------- -*used only when* **StC_DOF_MODE==1 or 2** +*used only when* **StC_DOF_MODE==1, 2, or 3** **StC_X_PSP** [m] @@ -194,17 +196,19 @@ StC Configuration **StC_Z_PSP** [m] Positive stop position -- maximum Z mass displacement *[used only when* - **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *]* + **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** + *]* **StC_Z_NSP** [m] Negative stop position -- minimum Z mass displacement *[used only when* - **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *]* + **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** + *]* StC Mass, Stiffness, & Damping ------------------------------ -*used only when* **StC_DOF_MODE==1 or 2** +*used only when* **StC_DOF_MODE==1, 2, or 3** **StC_X_M** [kg] @@ -221,9 +225,9 @@ StC Mass, Stiffness, & Damping StC Z mass *[used only when* **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *]* -**StC_XY_M** [kg] +**StC_Omni_M** [kg] - StC XY mass *[used only when* **StC_DOF_MODE==2** *]* + StC omni mass *[used only when* **StC_DOF_MODE==2 or 3** *]* **StC_X_K** [N/m] @@ -236,7 +240,7 @@ StC Mass, Stiffness, & Damping **StC_Z_K** [N/m] StC Z stiffness *[used only when* **StC_DOF_MODE==1** *and* - **StC_Z_DOF==TRUE** *]* + **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** *]* **StC_X_C** [N/(m/s)] @@ -249,7 +253,7 @@ StC Mass, Stiffness, & Damping **StC_Z_C** [N/(m/s)] StC Z damping *[used only when* **StC_DOF_MODE==1** *and* - **StC_Z_DOF==TRUE** *]* + **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** *]* **StC_X_KS** [N/m] @@ -261,8 +265,8 @@ StC Mass, Stiffness, & Damping **StC_Z_KS** [N/m] - Stop spring Z stiffness *[used only when* **StC_DOF_MODE==1** *and - StC_Z_DOF==TRUE]* + Stop spring Z stiffness *[used only when* **StC_DOF_MODE==1** *and* + **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** *]* **StC_X_CS** [N/(m/s)] @@ -275,13 +279,13 @@ StC Mass, Stiffness, & Damping **StC_Z_CS** [N/(m/s)] Stop spring Z damping *[used only when* **StC_DOF_MODE==1** *and* - **StC_Z_DOF==TRUE** *]* + **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** *]* StC User-Defined Spring Forces ------------------------------ -*used only when* **StC_DOF_MODE==1 or 2** +*used only when* **StC_DOF_MODE==1, 2, or 3** **Use_F_TBL** [flag] @@ -306,12 +310,18 @@ Example spring forces table: StructCtrl Control ------------------ -*used only when* **StC_DOF_MODE==1 or 2** +*used only when* **StC_DOF_MODE==1, 2, 3, or 7** **StC_CMODE** [switch] - Control mode {0:none; 1: Semi-Active Control Mode; 2: Active Control Mode}. - When using StC_DOF_MODE==5, StC_CMODE must be 2. + Control mode {0:none; 1: Semi-Active Control Mode; 3: Active Control + Mode through user subroutine; 5: Active Control Mode through Bladed + interface}. When using StC_DOF_MODE==7, StC_CMODE must be 3 or 5. + +**StC_CChan** [-] + + Control channel group (1:10) for stiffness and damping *[used only when* + **StC_DOF_MODE=1, 2, 3, or 7** *and* **StC_CMODE=5** *]* **StC_SA_MODE** [-] @@ -339,12 +349,12 @@ StructCtrl Control **StC_Z_C_HIGH** [-] StC Z high damping for ground hook control *[used only when* - **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *]* + **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** *]* **StC_Z_C_LOW** [-] StC Z low damping for ground hook control *[used only when* - **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *]* + **StC_DOF_MODE==1** *and* **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** *]* **StC_X_C_BRAKE** [-] @@ -357,14 +367,15 @@ StructCtrl Control **StC_Z_C_BRAKE** [-] StC Z high damping for braking the StC *[used only when* **StC_DOF_MODE==1** - *and* **StC_Z_DOF==TRUE** *]* *[currently unused. set to zero]* + *and* **StC_Z_DOF==TRUE** *or when* **StC_DOF_MODE==3** *]* *[currently + unused. set to zero]* TLCD -- Tuned Liquid Column Damper ---------------------------------- -*used only when* **StC_DOF_MODE==3** +*used only when* **StC_DOF_MODE==5** **L_X** [m] @@ -422,12 +433,12 @@ Prescribed Time Series A prescribed time series of forces and moments may be applied in place of the StC damper. The force and moment may be applied either in a global coordinate frame, or in a local (following) coordinate frame. This feature is *used only -when* **StC_DOF_MODE==4**. +when* **StC_DOF_MODE==6**. **PrescribedForcesCoord** [switch] Prescribed forces are in global or local coordinates {1: global; 2: local}. - When using StC_DOF_MODE==5, PrescribedForcesCoord must be 1. + When using StC_DOF_MODE==7, PrescribedForcesCoord must be 1. **PrescribedForcesFile** [-] @@ -437,6 +448,12 @@ when* **StC_DOF_MODE==4**. number of commented header lines, and commented lines at any location in the input file. + For blade mounted StCs, a different time sereis input file can be given for + each blade (add additional file names on new lines). If only one file is + provided, it will be used for all blades. See example in the regression + test: `StC_test_OC4Semi_blade2` for an example setup. + + Example prescribed time series file :download:`(example prescribed force timeseries) `: diff --git a/docs/source/user/servodyn/input.rst b/docs/source/user/servodyn/input.rst index 6fb3e43352..d2ead9a626 100644 --- a/docs/source/user/servodyn/input.rst +++ b/docs/source/user/servodyn/input.rst @@ -47,6 +47,45 @@ Pitch Control Time to enable active pitch control *[unused when* **PCMode==0** *]* +**PitNeut(1)** [deg] + + Blade 1 neutral pitch position--pitch spring moment is zero at this position + *[unused when* **PCMode>0** and **t>=TPCOn** *]* + +**PitNeut(2)** [deg] + + Blade 2 neutral pitch position--pitch spring moment is zero at this position + *[unused when* **PCMode>0** and **t>=TPCOn** *]* + +**PitNeut(3)** [deg] + + Blade 3 neutral pitch position--pitch spring moment is zero at this position + *[unused when* **PCMode>0** and **t>=TPCOn** *]* *[unused for 2 blades]* + +**PitSpr(1)** [N-m/rad] + + Blade 1 pitch spring constant + +**PitSpr(2)** [N-m/rad] + + Blade 2 pitch spring constant + +**PitSpr(3)** [N-m/rad] + + Blade 3 pitch spring constant *[unused for 2 blades]* + +**PitDamp(1)** [N-m/(rad/s)] + + Blade 1 pitch damping constant + +**PitDamp(2)** [N-m/(rad/s)] + + Blade 2 pitch damping constant + +**PitDamp(3)** [N-m/(rad/s)] + + Blade 3 pitch damping constant *[unused for 2 blades]* + **TPitManS(1)** [sec] Time to start override pitch maneuver for blade 1 and end standard pitch diff --git a/docs/source/user/subdyn/appendixD.rst b/docs/source/user/subdyn/appendixD.rst index 2da791afe9..e54a2cc9d5 100644 --- a/docs/source/user/subdyn/appendixD.rst +++ b/docs/source/user/subdyn/appendixD.rst @@ -6,7 +6,7 @@ Appendix D. List of Output Channels This is a list of all possible output parameters for the SubDyn module. The names are grouped by meaning, but can be ordered in the OUTPUT CHANNELS section of the SubDyn input file as the user sees fit. :math:`M \alpha N \beta`, -refers to node :math:`\beta` of member :math:`\alpha`, where :math:`\alpha` is a number in the range [1,9] and +refers to node :math:`\beta` of member :math:`\alpha`, where :math:`\alpha` is a number in the range [1,99] and corresponds to row :math:`\alpha` in the MEMBER OUTPUT LIST table (see :numref:`SD_Member_Output`) and :math:`\beta` is a number in the range [1,9] and corresponds to node :math:`\beta` in the **NodeCnt** list of that table entry. @@ -21,27 +21,45 @@ Table C-1. List of Output Channels. +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ | Channel Name(s) | Units | Description | +=======================================+==============================================================+=====================================================================================================================================+ -| *Base and Interface Reaction Loads* | | +| *Base and Interface Reaction Loads* | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ | ReactFXss, ReactFYss, ReactFZss, | (N), (N), (N), | Total base reaction forces and moments | | | | | | ReactMXss, ReactMYss, ReactMZss, | (Nm), (Nm), (Nm) | at the (0.,0.,-**WtrDpth**) location in SS coordinate system | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -| IntfFXss, IntfFYss, IntfFZss, | (N), (N), (N), | Total interface reaction forces and moments | -| | | | -| IntfMXss, IntfMYss, IntfMZss, | (Nm), (Nm), (Nm) | at the TP reference point (platform reference point) location in SS coordinate system | +| Intf?FXss, Intf?FYss, Intf?FZss, | (N), (N), (N), | Total interface reaction forces and moments at the TP reference points (platform reference points) in SS coordinate system. | +| | | ? can be replaced with any number between 1 and 9 to indicate which transition piece to output. | +| Intf?MXss, Intf?MYss, Intf?MZss, | (Nm), (Nm), (Nm) | Omitting ? defaults to transition piece 1 for backward compatibility. | ++---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ +| *Interface Kinematics* | ++---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ +| Intf?TDXss, Intf?TDYss, Intf?TDZss, | (m), (m), (m), | Displacements and rotations of the TP reference points in SS coordinate system. The rotation angles are Tait-Bryan angles following | +| | | the convention of intrinsic yaw first, pitch second, and roll last. ? can be replaced with any number between 1 and 9 to indicate | +| Intf?RDXss, Intf?RDYss, Intf?RDZss | (rad), (rad), (rad) | which transition piece to output. Omitting ? defaults to transition piece 1 for backward compatibility. | ++---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ +| Intf?TDXe, Intf?TDYe, Intf?TDZe, | (m), (m), (m), | Elastic part of the TP reference point displacements and (small angle) rotations in the rigid-body coordinate system. | +| | | ? can be replaced with any number between 1 and 9 to indicate which transition piece to output. | +| Intf?RDXe, Intf?RDYe, Intf?RDZe | (rad), (rad), (rad) | Omitting ? defaults to transition piece 1 for backward compatibility. | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -| Interface Kinematics | | +| Intf?TAXss, Intf?TAYss, Intf?TAZss, | (:math:`{m/s^2}`), (:math:`{m/s^2}`), (:math:`{m/s^2}`), | Translational and rotational accelerations of the TP reference points in SS coordinate system. | +| | | ? can be replaced with any number between 1 and 9 to indicate which transition piece to output. | +| Intf?RAXss, Intf?RAYss, Intf?RAZss | (:math:`{rad/s^2}`), (:math:`{rad/s^2}`), (:math:`{rad/s^2}`)| Omitting ? defaults to transition piece 1 for backward compatibility. | ++---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ +| *Rigid-Body Kinematics (floating only)* | ++---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ +| RBTDXss, RBTDYss, RBTDZss, | (m), (m), (m), | Displacements and rotations of the rigid-body reference point in SS coordinate system. | +| | | | +| RBRDXss, RBRDYss, RBRDZss | (rad), (rad), (rad) | The rotation angles are Tait-Bryan angles following the convention of intrinsic yaw first, pitch second, and roll last. | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -| IntfTDXss, IntfTDYss, IntfTDZss, | (m), (m), (m), | Displacements and rotations of the TP reference point | +| RBTVXss, RBTVYss, RBTVZss, | (m/s), (m/s), (m/s), | Translational and rotational velocities of the rigid-body reference point in SS coordinate system. | | | | | -| IntfRDXss, IntfRDYss IntfRDZss | (rad), (rad), (rad) | (platform reference point) location in SS coordinate system | +| RBRVXss, RBRVYss, RBRVZss | (rad/s), (rad/s), (rad/s) | | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -| IntfTAXss, IntfTAYss, IntfTAZss, | (:math:`{m/s^2}`), (:math:`{m/s^2}`), (:math:`{m/s^2}`), | Translational and rotational accelerations of the TP reference point | +| RBTAXss, RBTAYss, RBTAZss, | (:math:`{m/s^2}`), (:math:`{m/s^2}`), (:math:`{m/s^2}`), | Translational and rotational accelerations of the rigid-body reference point in SS coordinate system. | | | | | -| IntfRAXss, IntfRAYss IntfRAZss | (:math:`{rad/s^2}`), (:math:`{rad/s^2}`), (:math:`{rad/s^2}`)| (platform reference point) location in SS coordinate system | +| RBRAXss, RBRAYss, RBRAZss | (:math:`{rad/s^2}`), (:math:`{rad/s^2}`), (:math:`{rad/s^2}`)| | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -| *Modal Parameters* | | +| *Modal Parameters* | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ | SSqm01-SSqm99 | (-) | C-B modal variables (up to first 99) | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ @@ -49,7 +67,7 @@ Table C-1. List of Output Channels. +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ | SSqmdd01-SSqmdd99 | (:math:`{1/s^2}`) | Second time-derivatives of C-B modal variables (up to first 99) | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -| *Node Kinematics* | | +| *Node Kinematics* | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ | :math:`{M \alpha N \beta}` TDxss, | (m) | Nodal total translational displacements of :math:`M \alpha N \beta` | | | | | @@ -75,7 +93,7 @@ Table C-1. List of Output Channels. | | | (up to 81 designated locations) in member local coordinate system | | :math:`{M \alpha N \beta}` RAze | | | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ -| *Node Forces and Moments* | | +| *Node Forces and Moments* | +---------------------------------------+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------+ | :math:`{M \alpha N \beta}` FKxe, | (N), | Static (elastic) component of reaction forces and moments | | | | | diff --git a/docs/source/user/subdyn/input_files.rst b/docs/source/user/subdyn/input_files.rst index d417fc3d85..86573afb26 100644 --- a/docs/source/user/subdyn/input_files.rst +++ b/docs/source/user/subdyn/input_files.rst @@ -63,61 +63,101 @@ will be generated in that folder. If this output is left empty, the driver filename is used (without the extension) is used. **NSteps** specifies the number of simulation time steps, and **TimeStep** specifies the time between -steps. Next, the user must specify the location of the TP reference -point **TP\_RefPoint** (in the global reference system). This is -normally set by FAST through the ElastoDyn input file, and it is the -so-called *platform* reference point location. When coupled to FAST, the -*platform* reference point location is identified by only one (*Z*) -coordinate. The interface joints, defined in SubDyn’s main input file, -are rigidly connected to this reference point. To utilize the same -geometry definition within SubDyn’s main input file, while still -allowing for different substructure orientations about the vertical, the -user can set **SubRotateZ** to a prescribed angle in degrees with -respect to the global *Z*-axis. The entire substructure will be rotated -by that angle. (This feature is only available in stand-alone mode.) +steps. Next, the user must specify the locations of the transition piece (TP) +reference points. These are normally set by OpenFAST through the ElastoDyn +input files, and they are the so-called *platform* reference points +given by **PtfmRefxt**, **PtfmRefyt**, and **PtfmRefzt** in ElastoDyn. +The interface joints, defined in SubDyn’s main input file, +are rigidly connected to these ElastoDyn platform reference points. +When running the SubDyn standalone driver, the positions of these TP +reference points must be defined in the driver input file instead, +and prescribed motions can be defined for these transition pieces below. +**NTPs** is the number of actual transition pieces, excluding the +rigid-body reference point for a floating structure (see the **Interface Joints** +section of the SubDyn's main input file below). The next three lines are +**TP\_RefPoint\_X**, **TP\_RefPoint\_Y**, and **TP\_RefPoint\_Z**, which should +respectively contain the **X**, **Y**, and **Z** coordinates of each transition +pieces in the global coordinate system. Each line should contain exactly +**NTPs** entries. To utilize the same geometry definition within SubDyn’s main +input file, while still allowing for different substructure orientations about +the vertical, the user can set **SubRotateZ** to a prescribed angle in degrees +with respect to the global *Z*-axis. The entire substructure will be rotated +by that angle. (This feature is only available in standalone mode.) Input motion ~~~~~~~~~~~~ -Setting **InputsMod** = 0 sets all TP reference-point input motions to +Setting **InputsMod** = 0 sets all TP reference-point motions to zero for all time steps. Setting **InputsMod** = 1 allows the user to provide steady (fixed) inputs for the TP motion in the STEADY INPUTS section of the file—\ **uTPInSteady**, **uDotTPInSteady**, and -**uDotDotTPInSteady** following the same convention as Table 1 -(without time). Setting **InputsMod** = 2 allows the user to input a -time-series file whose name is specified via the **InputsFile** -parameter. The time-series input file is a text-formatted file. This -file has no header lines, **NSteps** rows, and each *i*\ :sup:`th` row -has the first column showing time as *t* = ( *i* – 1 )\*\ **TimeStep** -(the data will not be interpolated to other times). The remainder of -each row is made of white-space-separated columns of floating point -values representing the necessary motion inputs as shown in Table 1. All -motions are specified in the global, inertial-frame coordinate system. -SubDyn does not check for physical consistency between the displacement, -velocity, and acceleration motions specified for the TP reference point -in the driver file. - -Table 1. TP Reference Point Inputs Time-Series Data File Contents +**uDotDotTPInSteady**. Each line should contain 6 x **NTPs** inputs with +the first six entries for the first transition piece, the next six entries +for the second transition piece, and so on. The details of these inputs +are consistent with those for **InputsMod** = 2 below. + +Setting **InputsMod** = 2 allows the user to provide a time-series file +whose name is specified via the **InputsFile** parameter. The time-series +input file is a text-formatted file. This file has no header lines, +**NSteps** rows, and each *i*\ :sup:`th` row has the first column showing +the time *t*. SubDyn driver will linearly interpolate the input time series +as needed. The remainder of each row is made of white-space-separated +columns of floating point values representing the necessary motion inputs +as shown in Table 1. All motions are specified in the global, inertial-frame +coordinate system. The roll, pitch, and yaw angles are Tait-Bryan angles +following the intrinsic yaw first, pitch second, and roll last convention. +The angular velocity and acceleration components are those about the global +earth-fixed axes. Note that these are different from the time derivatives +of the Tait-Bryan angles in general. + +SubDyn does not check for physical consistency between the displacement, +velocity, and acceleration time series specified for the TP reference points +in the driver file and could provide unphysical results if the input motion +is not self-consistent. Note that if a rigid-body reference point is set for +a floating substructure in the main SubDyn input file (see the **Interface +Joints** section of the main input file below), SubDyn will solve for the +rigid-body motion internally based on the prescribed motion at the transition +pieces. In this case, the results can be highly sensitive to small +inconsistencies in the input motion. To obtain accurate results in this case, +it is suggested that the time step in the input file should match the SubDyn +solver time step exactly, so no time interpolation is required. Furthermore, +the input displacement, velocity, and acceleration should contain enough +digits to minimize inconsistencies due to truncation errors. + +Table 1. Formatting of the Motion Time-Series Input File for TP Reference Points +-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ | Column Number | Input | Units | +=================+=======================================================================================================+==========================================+ | 1 | Time step value | `s` | +-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ -| 2-4 | TP reference point translational displacements along *X*, *Y*, and *Z* | `m` | +| 2-4 | TP 1 reference point translational displacements along *X*, *Y*, and *Z* | `m` | +-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ -| 5-7 | TP reference point rotational displacements about *X*, *Y*, and *Z* (small angle assumptions apply) | `rad/s` | +| 5-7 | TP 1 reference point rotational displacements (Tait-Bryan roll, pitch, and yaw angles) | `rad` | +-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ -| 8-10 | TP reference point translational velocities along *X*, *Y*, and *Z* | `m/s` | +| 8-10 | TP 1 reference point translational velocities along *X*, *Y*, and *Z* | `m/s` | +-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ -| 11-13 | TP reference point rotational velocities about *X*, *Y*, and *Z* | `rad/s` | +| 11-13 | TP 1 reference point rotational velocities about *X*, *Y*, and *Z* | `rad/s` | +-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ -| 14-16 | TP reference point translational accelerations along *X*, *Y*, and *Z* | `m/s^2` | +| 14-16 | TP 1 reference point translational accelerations along *X*, *Y*, and *Z* | `m/s^2` | +-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ -| 17-19 | TP reference point rotational accelerations about *X*, *Y*, and *Z* | `rad/s^2` | +| 17-19 | TP 1 reference point rotational accelerations about *X*, *Y*, and *Z* | `rad/s^2` | ++-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ +| 20-22 | TP 2 reference point translational displacements along *X*, *Y*, and *Z* | `m` | ++-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ +| 23-25 | TP 2 reference point rotational displacements (Tait-Bryan roll, pitch, and yaw angles) | `rad` | ++-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ +| 26-28 | TP 2 reference point translational velocities along *X*, *Y*, and *Z* | `m/s` | ++-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ +| 29-31 | TP 2 reference point rotational velocities about *X*, *Y*, and *Z* | `rad/s` | ++-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ +| 32-34 | TP 2 reference point translational accelerations along *X*, *Y*, and *Z* | `m/s^2` | ++-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ +| 35-37 | TP 2 reference point rotational accelerations about *X*, *Y*, and *Z* | `rad/s^2` | ++-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ +| ... | ... | ... | +-----------------+-------------------------------------------------------------------------------------------------------+------------------------------------------+ - Applied loads ~~~~~~~~~~~~~ @@ -259,20 +299,20 @@ line, separated by white space. If the number of **JDampings** is less than the number of retained modes, the last value will be replicated for all the remaining modes. (see :numref:`SD_DampingSpecifications`) -**GuyanDampMod** Guyan damping [0=none, 1=Rayleigh Damping, 2= user specified 6x6 matrix] (see :numref:`SD_DampingSpecifications`) - +**GuyanDampMod** Guyan damping [0=none, 1=Rayleigh Damping, 2= user specified matrix] (see :numref:`SD_DampingSpecifications`) **RayleighDamp** Mass and stiffness proportional damping coefficients (:math:`(\alpha,\beta)` Rayleigh damping) [only if GuyanDampMod=1] -Guyan damping matrix (6x6) [only if GuyanDamgMod=2] (see :numref:`SD_DampingSpecifications`) - - -**Guyan damping matrix**: -The 6 lines following this input line consits of the 6x6 coefficients of the damping matrix to be applied at the interface. (see :numref:`SD_DampingSpecifications`) +**GuyanDampSize** Size of the square Guyan damping matrix [only if GuyanDampMod=2]. For a fixed-bottom structure, **GuyanDampSize** must be set to 6 x **nTP** where **nTP** is the number of independent transition pieces, i.e., the number of unique **TPID** in the **Interface Joints** section below. For a floating structure, the first six Guyan modes are always converted to rigid-body modes. Therefore, **GuyanDampSize** must be set to 6 x ( **nTP** - 1 ) because SubDyn no longer applies damping to rigid-body modes. Note that for a floating structure modeled with a rigid-body reference point, Guyan damping is only applied to the part of interface/transition piece velocity associated with elastic deflection of the structure, i.e., the velocity of the transition piece(s) relative to rigid-body motion. For more information on the rigid-body modes and the rigid-body reference point for a floating structure, see the **Interface Joints** section below. The next **GuyanDampSize** lines following this input line should provide the coefficients of the damping matrix to be applied at the interfaces/transition pieces. Each of the following lines should contain **GuyanDampSize** entries to provide the full square damping matrix. (see :numref:`SD_DampingSpecifications`) For more information on these parameters and guidelines on how to set them, see Sections :numref:`sd_modeling-considerations` and :numref:`subdyn-theory`. +Initial Rigid-Body Position +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For a floating structure modeled with a rigid-body reference point, i.e., with an interface joint assigned to **TPID** = 0 in the **Interface Joints** section below, users must specify the initial displacements of this rigid-body reference point. **RBSurge**, **RBSway**, and **RBHeave** are the initial displacements of the rigid-body reference point in the earth-fixed **X**, **Y**, and **Z** directions in meters. **RBRoll**, **RBPitch**, and **RBYaw** are the initial rigid-body rotation angles in degrees following the order of body-fixed yaw rotation first, pitch rotation next, and roll rotation last. Setting all entries in this section to zeros corresponds to an undisplaced structure at the start of the simulation. This section is ignored if a fixed-bottom substructure is modeled or if the floating structure does not use a rigid-body reference point with **TPID** = 0 abscent from the **Interface Joints** section below. + Structure Joints ~~~~~~~~~~~~~~~~ @@ -336,7 +376,7 @@ SubDyn requires the user to specify the boundary joints. **NReact** should be set equal to the number of joints (defined earlier) at the bottom of the structure (i.e., seabed) that are fully constrained; **NReact** also determines the number of rows in the subsequent table. -In SubDyn, **NReact** must be greater than or equal to one. Each joint +For a fixed-bottom structure, **NReact** must be greater than or equal to one. Each joint listed in the table is identified by a unique integer, **RJointID**, which must correspond to the **JointID** value found in the STRUCTURE JOINTS table. The flags **RctTDXss**, **RctTDYss**, **RctTDZss**, @@ -350,10 +390,10 @@ by setting one or more DOF flags to 0 and providing the appropriate stiffness and mass matrix elements for that DOF via the **SSIfile**. If a DOF flag is set to 1, then the node DOF is considered restrained and the associated matrix elements potentially provided in the -**SSIfile** will be ignored. +**SSIfile** will be ignored. To model a floating structure, **NReact** +should be zero with no reaction joints specified in this section. - -An example of base reaction and interface table is given below +An example of Base Reaction Joints table is given below .. code:: @@ -362,33 +402,87 @@ An example of base reaction and interface table is given below RJointID RctTDXss RctTDYss RctTDZss RctRDXss RctRDYss RctRDZss SSIfile (-) (flag) (flag) (flag) (flag) (flag) (flag) (string) 61 1 1 1 1 1 1 "SSI.txt" - ------------------- INTERFACE JOINTS - 1 NInterf - Number of interface joints locked to the Transition Piece (TP) - IJointID ItfTDXss ItfTDYss ItfTDZss ItfRDXss ItfRDYss ItfRDZss - (-) (flag) (flag) (flag) (flag) (flag) (flag) - 24 1 1 1 1 1 1 Interface Joints ~~~~~~~~~~~~~~~~ SubDyn requires the user to specify the interface joints. **NInterf** -should be set equal to the number of joints at the top of the structure -(i.e., TP); **NInterf** also determines the number of rows in the +should be set equal to the number of joints at the top of the structure, +i.e., transition pieces (TP). **NInterf** also determines the number of rows in the subsequent table. In SubDyn, **NInterf** must be greater than or equal -to one. Note that these joints will be assumed to be rigidly connected -to the platform reference point of ElastoDyn (see FAST documentation) -when coupled to FAST, or to the TP reference point if SubDyn is run in +to one. With the exception of the rigid-body reference point of a floating structure +with **TPID** = 0, these joints will be assumed to be rigidly connected +to the platform reference points of ElastoDyn instances (see FAST documentation) +when coupled to FAST, or to the TP reference points if SubDyn is run in stand-alone mode. Each joint listed in the table is identified by a unique integer, **IJointID**, which must correspond to the *JointID* -value found in the STRUCTURE JOINTS table. The flags **ItfTDXss**, -**ItfTDYss**, **ItfTDZss**, **ItfRDXss**, **ItfRDYss**, +value found in the STRUCTURE JOINTS table. Note that only cantilever joints can +serve as interface joints. Furthermore, it is not allowed to assign multiple joints +belonging to the same rigid-body assembly as interface joints. (This is also redundant.) + +Each interface joint must also be assigned a transition piece ID or **TPID**. +Each transition piece, identified by its unique **TPID**, can deflect +independently from all other transition pieces, and multiple joints can be +rigidly attached to each transition piece by assigning them the same +**TPID**. Note that all joints with the same **TPID** will effectively be +rigidly connected to each other through their rigid connection to the shared +transition piece. For a fixed-bottom structure, all **TPID** present in the +table must form a continuous sequence of integers starting from 1. For a floating +structure, one and exactly one joint can be assigned to **TPID** = 0. This +joint is a dummy transition piece that acts as the rigid-body reference point +for the floating substructure. Alternatively, **TPID** = 0 can be omitted for +a floating structure, in which case, there can only be one and exactly one +transition piece with **TPID** = 1 (though multiple joints can be assigned +to it). In this case, the single transition piece also serves as the rigid-body +reference point, replicating how previous versions of SubDyn models a floating +substructure. For accuracy and numerical stability, it is recommended to +select a joint near the center of the floater as the rigid-body reference point +to minimize elastic deflection relative to the rigid-body displacement. + +The ability to include multiple independent transition pieces is added +to SubDyn to enable the modeling of substructures (both fixed-bottom +and floating) of multirotor systems. For a fixed-bottom structure, interface +joints assigned to **TPID** = 1 are rigidly coupled to the platform reference +point of the first ElastoDyn instance simulating the first turbine; the +interface joints assigned to **TPID** = 2 are rigidly coupled to the platform +reference point of the second ElastoDyn instance simulating the second turbine; +and so on. For a floating structure, the same applies, except for the special +rigid-body reference point assigned to **TPID** = 0. SubDyn solves the rigid-body +motion of the floater about this point, which is not coupled to any ElastoDyn +instances (or transition pieces defined in the SubDyn standalone driver). +The motion of the rigid-body reference point defines the displaced +"rigid-body" position of the floater, and any small elastic deflection is +solved relative to this rigid-body configuration. This formulation is needed to +accommodate potentially large rigid-body motion, while keeping the elastic +defection linear. Alternatively, for a floating system with only one turbine, the +rigid-body reference point with **TPID** = 0 can be omitted, in which case, the +only transition piece allowed (with **TPID** = 1) serves as both the interface to +ElastoDyn and as the rigid-body reference point in SubDyn as in previous versions +of OpenFAST. + +The flags **ItfTDXss**, **ItfTDYss**, **ItfTDZss**, **ItfRDXss**, **ItfRDYss**, **ItfRDZss** indicate the fixity value for the three translations (TD) and three rotations (RD) in the SS coordinate system (global inertial-frame coordinate system). One denotes fixed and zero denotes free (instead of TRUE/FALSE). This version of SubDyn cannot handle -partially restrained joints, so all flags must be set to one; different -degrees of fixity will be considered in a future release. +partially restrained joints, so all flags must be set to one. The latest +formulation of SubDyn cannot be easily modified to support partially +restrained joints, and these inputs will likely be removed in a future release. + +An example of Interface Joints table is given below + +.. code:: + + ------------------- INTERFACE JOINTS + 4 NInterf - Number of interface joints locked to the Transition Piece (TP) + IJointID TPID ItfTDXss ItfTDYss ItfTDZss ItfRDXss ItfRDYss ItfRDZss ![Global Coordinate System] + (-) (-) (flag) (flag) (flag) (flag) (flag) (flag) + 1 0 1 1 1 1 1 1 ! Rigid-body reference point not actually coupled to any transition piece + 3 1 1 1 1 1 1 1 ! Joint attached to the 1st actual transition piece + 4 2 1 1 1 1 1 1 ! Joint attached to the 2nd actual transition piece + 5 2 1 1 1 1 1 1 ! Another joint also attached to the 2nd actual transition piece + Members ~~~~~~~ @@ -452,7 +546,7 @@ thickness, **XsecT**. Note that setting **XsecT** to a value less than or equal to zero implies a solid section. Users will need to create an entry in the first table within this section of the input file identified by **PropSetID**, for each unique combination of these five properties. -The member property-set table contains **NPropSets** rows. The member +The member property-set table contains **NPropSetsCyl** rows. The member property sets are referred to by their **PropSetID** in the MEMBERS table above. Note, however, that although diameter and thickness will be linearly interpolated within an individual member, SubDyn will not @@ -472,11 +566,11 @@ which might not be accurate. This is different from circular sections for which the shear area and torsion constant can be automatically computed by SubDyn for arbitrary wall thickness. The properties of unique rectangular beam sections are entered on separate rows of the second table of this input -file section. Again, the table should have **NPropSets** rows. +file section. Again, the table should have **NPropSetsRec** rows. The third table in this section of the input file have **NXPropSets** -rows and have additional entries when compared to the previous -table, including: cross-sectional area (**XsecA**), cross-sectional +rows and have additional entries when compared to the two previous +tables, including: cross-sectional area (**XsecA**), cross-sectional shear area along the local principal axes *x* and *y* (**XsecAsx**, **XsecAsy**), cross-sectional area second moment of inertia about *x* and *y* (**XsecJxx**, **XsecJyy**), cross-sectional polar area diff --git a/docs/source/user/subdyn/introduction.rst b/docs/source/user/subdyn/introduction.rst index c5b8e1bf23..707e81cbf4 100644 --- a/docs/source/user/subdyn/introduction.rst +++ b/docs/source/user/subdyn/introduction.rst @@ -5,7 +5,7 @@ Introduction `SubDyn `__ is a time-domain structural-dynamics module for multimember fixed-bottom substructures -created by the National Renewable Energy Laboratory (NREL) through U.S. +created by the National Laboratory of the Rockies (NLR) through U.S. Department of Energy Wind and Water Power Program support. The module has been coupled into the FAST aero-hydro-servo-elastic computer-aided engineering (CAE) tool. Substructure types supported by SubDyn include diff --git a/docs/source/user/subdyn/modeling.rst b/docs/source/user/subdyn/modeling.rst index 0afc9cad06..353b8d19ba 100644 --- a/docs/source/user/subdyn/modeling.rst +++ b/docs/source/user/subdyn/modeling.rst @@ -155,7 +155,7 @@ use of the SubDyn-derived equivalent substructure stiffness and mass matrices (the **KBBt** and **MBBt** matrices found in the SubDyn summary file) to prescribe the boundary conditions at the base of the tower. -For instance, using NREL’s BModes software, the SubDyn-obtained matrices +For instance, using NLR’s BModes software, the SubDyn-obtained matrices can be used in place of the hydrodynamic stiffness (**hydro\_K**) and mass matrices (**hydro\_M**) (**mooring\_K** can be set to zero). By setting the **hub\_conn** boundary condition to two (free-free), BModes will @@ -166,8 +166,7 @@ and no distributed rotational-inertia contribution to the eigenmodes), the tower-distributed properties should be modified accordingly in BModes (e.g., by reducing mass moments of inertia towards zero and by increasing torsional and axial stiffness while assuring convergence of -the results; see also -`https://wind.nrel.gov/forum/wind/viewtopic.php?f=4&t=742 `__). +the results. The rotational inertia of the undeflected tower about its centerline is not currently accounted for in ElastoDyn. Thus, when the nacelle-yaw DOF diff --git a/docs/source/working.rst b/docs/source/working.rst index 5860c41ddb..f15320aa39 100644 --- a/docs/source/working.rst +++ b/docs/source/working.rst @@ -106,7 +106,7 @@ The input file format specifications of OpenFAST input files are given in :ref:`input_file_overview`. We provide a minimal working example to get you started on your first OpenFAST run. -This example uses the `NREL 5-MW `__ wind turbine, which is a fictitious but representative multi-MW wind turbine, with rated power 5 MW, rated rotor speed +This example uses the `historic NREL 5-MW `__ wind turbine, which is a fictitious but representative multi-MW wind turbine, with rated power 5 MW, rated rotor speed 12.1 rpm, Hub Height 90 m, and rotor diameter 126 m. This example is for an "onshore" version of the turbine, with only the structure (no aerodynamics), where the tower is initially displaced by 3m at the tower top. The files are located in the following `github directory `__ . @@ -269,40 +269,50 @@ Guidelines for the different modules can be found throughout this documentation, -Scripting ---------- +Scripting and other support tools +--------------------------------- -NREL maintains several repositories of scripts to work with OpenFAST. +NLR maintains several repositories of scripts to work with OpenFAST. The scripts can for instance be used to read the input and outputs of OpenFAST, visualize them, and generate multiple simulation inputs, and postprocess them. Some of these applications will be detailed in the following sections. -The repositories maintained by NREL are the following: +NLR toolboxes +~~~~~~~~~~~~~ - `openfast_toolbox `__: collection of low-level Python tools to work with OpenFAST and perform simple operations, with granularity. - `matlab-toolbox `__: collection of low-level Matlab tools to work with OpenFAST. -- `WEIS `__ : high-level Python scripts, stands for Wind Energy with Integrated Servo-control. It can perform multifidelity co-design of wind turbines. WEIS is a framework that combines multiple NREL-developed tools to enable design optimization of floating offshore wind turbines. +- `WEIS `__ : high-level Python scripts, stands for Wind Energy with Integrated Servo-control. It can perform multifidelity co-design of wind turbines. WEIS is a framework that combines multiple NLR-developed tools to enable design optimization of floating offshore wind turbines. -The users are invited to consult the documentations of the individual repository, and discuss related issues on their individual github pages. Contribution by the community to the NREL repositories are welcome and encouraged. +Users are invited to consult the documentation of the individual repositories and discuss related issues on their individual GitHub pages. Contributions by the community to the NLR repositories are welcome and encouraged. -Additional repositories maintained by NREL are listed below: +Other related NLR tools +~~~~~~~~~~~~~~~~~~~~~~~ -- `WISDEM `__: models for assessing overall wind plant cost of energy (COE), also contains file IO, (DLC) case generation, polar manipulations, visualization, and much more! -- `ROSCO_toolbox `__: tools to work with the `ROSCO `__ controller that is supported by OpenFAST +Additional repositories maintained by NLR are listed below: +- `WISDEM `__: models for assessing overall wind plant cost of energy (COE), also contains file IO, (DLC) case generation, polar manipulations, visualization, and much more! +- `ROSCO_toolbox `__: tools to work with the `ROSCO `__ controller that is supported by OpenFAST -Repositories maintained by third-parties are listed below: +Third party tools +~~~~~~~~~~~~~~~~~ - `pyDatView `_ : tool to plot the input and output files of OpenFAST, CSV-files, and other files from other wind energy software (Hawc2, Flex, Bladed). Multiple files can be opened at once to compare results from different simulations. - `WindEnergyToolbox `_: library developed by DTU, providing some support for different file formats -- `FASTTool `_ : NREL FASTv8, MATLAB GUI and Simulink integration developed by TUDelft +- `FASTTool `_ : MATLAB GUI and Simulink integration developed by TUDelft for FASTv8 + +- `Continuous Section Field (CSF) `_: a small Python utility developed by Giovanni Boscu for calculating cross-sectional properties for towers. The tool focuses on: + + - Modeling non-prismatic members using ruled surfaces. + - Calculating sectional properties :math:`(A, I, Ip)` along the tower height. + - Providing a simplified estimation of torsional rigidity :math:`( J )`. @@ -317,7 +327,7 @@ Open-source OpenFAST wind turbine models can be found here: - `r-test `__: regression tests for OpenFAST, contains models for OpenFAST and its drivers (AeroDyn, SubDyn, HydroDyn, etc.). This repository is not intended to be used as a "database" of models, but it has the advantage that the input files are always up to date with the latest `format specifications `_ . OpenFAST input files for previous version can be accessed via the git tags of this repository. - `IEA Wind Task 37 repository `_ : contains OpenFAST models of the IEA Wind 3.4-MW, 10-MW, 15-MW, and up-and-coming 22-MW reference wind turbines. -- `openfast-turbine-models `_: open source wind turbine models (in development and out of date). +- `openfast-turbine-models `_: open source wind turbine models (in development and out of date). @@ -358,7 +368,7 @@ Parametric studies can be run by using the scripts to read and write OpenFAST in and the Python `openfast_toolbox `__ . The openfast_toolbox provides dedicated Python scripts and examples to automatize the process (see the README of the repository for more). -The `AeroelasticSE` module of `WEIS `__ can generate input files for the design load cases specified in the standards. +The `AeroelasticSE` module of `WEIS `__ can generate input files for the design load cases specified in the standards. Consult the WEIS repository for more information. @@ -384,7 +394,7 @@ It is necessary to linearize at different operating points over a period of revo An additional complication is that some of the states of OpenFAST are in the rotating frame of reference (e.g. the ElastoDyn blade states). To obtain a linear state space model of the system that is in a fixed (non-rotating) frame of reference the multiblade coordinate transformation (MBC) is applied. For a purely periodic system, the MBC can be applied to the linearized outputs at different azimuthal positions which can be combined to form a linearized system in a fixed frame of reference. We note that the MBC only applies to 3 or more blades. -Floquet theory would be needed 1 or 2 blades, although NREL does not currently have a post-processor that makes use of Floquet theory. +Floquet theory would be needed 1 or 2 blades, although NLR does not currently have a post-processor that makes use of Floquet theory. .. note:: diff --git a/glue-codes/fast-farm/src/FASTWrapper_Types.f90 b/glue-codes/fast-farm/src/FASTWrapper_Types.f90 index 9428d5d58c..a07c54b9b9 100644 --- a/glue-codes/fast-farm/src/FASTWrapper_Types.f90 +++ b/glue-codes/fast-farm/src/FASTWrapper_Types.f90 @@ -117,7 +117,19 @@ MODULE FASTWrapper_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AzimAvg_Cq !< Azimuthally averaged torque coefficient (normal to disk), distributed radially [-] END TYPE FWrap_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: FWrap_x_dummy = 1 ! FWrap%dummy + integer(IntKi), public, parameter :: FWrap_u_dummy = 2 ! FWrap%dummy + integer(IntKi), public, parameter :: FWrap_y_xHat_Disk = 3 ! FWrap%xHat_Disk + integer(IntKi), public, parameter :: FWrap_y_YawErr = 4 ! FWrap%YawErr + integer(IntKi), public, parameter :: FWrap_y_psi_skew = 5 ! FWrap%psi_skew + integer(IntKi), public, parameter :: FWrap_y_chi_skew = 6 ! FWrap%chi_skew + integer(IntKi), public, parameter :: FWrap_y_p_hub = 7 ! FWrap%p_hub + integer(IntKi), public, parameter :: FWrap_y_D_rotor = 8 ! FWrap%D_rotor + integer(IntKi), public, parameter :: FWrap_y_DiskAvg_Vx_Rel = 9 ! FWrap%DiskAvg_Vx_Rel + integer(IntKi), public, parameter :: FWrap_y_AzimAvg_Ct = 10 ! FWrap%AzimAvg_Ct + integer(IntKi), public, parameter :: FWrap_y_AzimAvg_Cq = 11 ! FWrap%AzimAvg_Cq + +contains subroutine FWrap_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(FWrap_InitInputType), intent(in) :: SrcInitInputData @@ -860,5 +872,268 @@ subroutine FWrap_UnPackOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%AzimAvg_Ct); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%AzimAvg_Cq); if (RegCheckErr(RF, RoutineName)) return end subroutine + +function FWrap_InputMeshPointer(u, DL) result(Mesh) + type(FWrap_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function FWrap_OutputMeshPointer(y, DL) result(Mesh) + type(FWrap_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine FWrap_VarsPackContState(Vars, x, ValAry) + type(FWrap_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call FWrap_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine FWrap_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(FWrap_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FWrap_x_dummy) + VarVals(1) = x%dummy ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FWrap_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(FWrap_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call FWrap_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine FWrap_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(FWrap_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FWrap_x_dummy) + x%dummy = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function FWrap_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (FWrap_x_dummy) + Name = "x%dummy" + case default + Name = "Unknown Field" + end select +end function + +subroutine FWrap_VarsPackContStateDeriv(Vars, x, ValAry) + type(FWrap_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call FWrap_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine FWrap_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(FWrap_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FWrap_x_dummy) + VarVals(1) = x%dummy ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FWrap_VarsPackInput(Vars, u, ValAry) + type(FWrap_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call FWrap_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine FWrap_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(FWrap_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FWrap_u_dummy) + VarVals(1) = u%dummy ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FWrap_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(FWrap_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call FWrap_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine FWrap_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(FWrap_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FWrap_u_dummy) + u%dummy = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function FWrap_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (FWrap_u_dummy) + Name = "u%dummy" + case default + Name = "Unknown Field" + end select +end function + +subroutine FWrap_VarsPackOutput(Vars, y, ValAry) + type(FWrap_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call FWrap_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine FWrap_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(FWrap_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FWrap_y_xHat_Disk) + VarVals = y%xHat_Disk(V%iLB:V%iUB) ! Rank 1 Array + case (FWrap_y_YawErr) + VarVals(1) = y%YawErr ! Scalar + case (FWrap_y_psi_skew) + VarVals(1) = y%psi_skew ! Scalar + case (FWrap_y_chi_skew) + VarVals(1) = y%chi_skew ! Scalar + case (FWrap_y_p_hub) + VarVals = y%p_hub(V%iLB:V%iUB) ! Rank 1 Array + case (FWrap_y_D_rotor) + VarVals(1) = y%D_rotor ! Scalar + case (FWrap_y_DiskAvg_Vx_Rel) + VarVals(1) = y%DiskAvg_Vx_Rel ! Scalar + case (FWrap_y_AzimAvg_Ct) + VarVals = y%AzimAvg_Ct(V%iLB:V%iUB) ! Rank 1 Array + case (FWrap_y_AzimAvg_Cq) + VarVals = y%AzimAvg_Cq(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FWrap_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(FWrap_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call FWrap_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine FWrap_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(FWrap_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FWrap_y_xHat_Disk) + y%xHat_Disk(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (FWrap_y_YawErr) + y%YawErr = VarVals(1) ! Scalar + case (FWrap_y_psi_skew) + y%psi_skew = VarVals(1) ! Scalar + case (FWrap_y_chi_skew) + y%chi_skew = VarVals(1) ! Scalar + case (FWrap_y_p_hub) + y%p_hub(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (FWrap_y_D_rotor) + y%D_rotor = VarVals(1) ! Scalar + case (FWrap_y_DiskAvg_Vx_Rel) + y%DiskAvg_Vx_Rel = VarVals(1) ! Scalar + case (FWrap_y_AzimAvg_Ct) + y%AzimAvg_Ct(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (FWrap_y_AzimAvg_Cq) + y%AzimAvg_Cq(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function FWrap_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (FWrap_y_xHat_Disk) + Name = "y%xHat_Disk" + case (FWrap_y_YawErr) + Name = "y%YawErr" + case (FWrap_y_psi_skew) + Name = "y%psi_skew" + case (FWrap_y_chi_skew) + Name = "y%chi_skew" + case (FWrap_y_p_hub) + Name = "y%p_hub" + case (FWrap_y_D_rotor) + Name = "y%D_rotor" + case (FWrap_y_DiskAvg_Vx_Rel) + Name = "y%DiskAvg_Vx_Rel" + case (FWrap_y_AzimAvg_Ct) + Name = "y%AzimAvg_Ct" + case (FWrap_y_AzimAvg_Cq) + Name = "y%AzimAvg_Cq" + case default + Name = "Unknown Field" + end select +end function + END MODULE FASTWrapper_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/glue-codes/fast-farm/src/FAST_Farm.f90 b/glue-codes/fast-farm/src/FAST_Farm.f90 index 6d2a8c141b..c3d63ed756 100644 --- a/glue-codes/fast-farm/src/FAST_Farm.f90 +++ b/glue-codes/fast-farm/src/FAST_Farm.f90 @@ -26,6 +26,7 @@ PROGRAM FAST_Farm USE FAST_Farm_Subs + USE amrex_utils IMPLICIT NONE @@ -83,6 +84,9 @@ PROGRAM FAST_Farm call NormStop() endif + ! Initialize AMReX library + call amrex_init(arg_parmparse=.false.) + CALL FAST_ProgStart( Farm_Ver ) ! put this after CheckArgs because CheckArgs assumes we haven't called this routine, yet. IF ( TRIM(FlagArg) == 'RESTART' ) THEN ! Restart from checkpoint file @@ -157,6 +161,9 @@ PROGRAM FAST_Farm !............................................................................................................................... call FARM_End(farm, ErrStat, ErrMsg) + + ! Finalize AMReX library + call amrex_finalize() CALL RunTimes( ProgStrtTime, ProgStrtCPU, SimStrtTime, SimStrtCPU, t ) call NormStop() @@ -190,6 +197,8 @@ SUBROUTINE CheckError(ErrID,Msg,ErrLocMsg) END IF call FARM_End(farm, ErrStat2, ErrMsg2) + ! Finalize AMReX library + call amrex_finalize() call ProgAbort('', TrapErrors=.FALSE., TimeWait=3._ReKi ) END IF diff --git a/glue-codes/fast-farm/src/FAST_Farm_IO.f90 b/glue-codes/fast-farm/src/FAST_Farm_IO.f90 index 00b38e6505..86e3f58cb3 100644 --- a/glue-codes/fast-farm/src/FAST_Farm_IO.f90 +++ b/glue-codes/fast-farm/src/FAST_Farm_IO.f90 @@ -72,20 +72,24 @@ SUBROUTINE Farm_PrintSum( farm, WD_InputFileData, ErrStat, ErrMsg ) WRITE (UnSum,'(/,A)') 'Ambient Wind:' - if ( farm%AWAE%p%mod_AmbWind == 1 ) then + select case(farm%AWAE%p%mod_AmbWind) + case(1,4) strModDescr = 'High-Fidelity Precursor' - elseif ( farm%AWAE%p%mod_AmbWind == 2 ) then + case(2) strModDescr = 'One InflowWind Module' - else ! farm%AWAE%p%mod_AmbWind == 3 + case(3) strModDescr = 'Multiple InflowWind Modules' - end if + end select - WRITE (UnSum,'(2X,A)') 'Ambient wind model: '//trim(strModDescr) - if ( farm%AWAE%p%mod_AmbWind == 1 ) then - WRITE (UnSum,'(2X,A)') 'Ambient wind input filepath: '//trim(farm%p%WindFilePath) - else - WRITE (UnSum,'(2X,A)') 'InflowWind module input file: '//trim(farm%p%WindFilePath) - end if + write (UnSum,'(2X,A)') 'Ambient wind model: '//trim(strModDescr) + select case(farm%AWAE%p%mod_AmbWind) + case (1) + write (UnSum,'(2X,A)') 'Ambient wind input filepath: '//trim(farm%p%WindFilePath) + case (2,3) + write (UnSum,'(2X,A)') 'InflowWind module input file: '//trim(farm%p%WindFilePath) + case (4) + write (UnSum,'(2X,A)') 'AMReX wind directories: '//trim(farm%p%WindFilePath) + end select !.................................. ! Turbine information. @@ -106,7 +110,7 @@ SUBROUTINE Farm_PrintSum( farm, WD_InputFileData, ErrStat, ErrMsg ) end do - WRITE (UnSum,'(/,A)' ) 'Wake Dynamics Finite-Difference Grid: '//trim(Num2LStr(farm%WD(1)%p%NumRadii))//' Radii, '//trim(Num2LStr(farm%WD(1)%p%NumPlanes))//' Planes' + WRITE (UnSum,'(/,A)' ) 'Wake Dynamics Finite-Difference Grid: '//trim(Num2LStr(farm%WD(1)%p%NumRadii))//' Radii' WRITE (UnSum,'(2X,A)') 'Radial Node Number Output Node Number Radius' WRITE (UnSum,'(2X,A)') ' (-) (-) (m) ' do I = 0, farm%WD(1)%p%NumRadii-1 @@ -284,7 +288,7 @@ SUBROUTINE Farm_InitOutput( farm, ErrStat, ErrMsg ) !============================================================ ! DEBUG OUTPUTS HERE ! -! DO I = 0,farm%WD(1)%p%NumPlanes-1 ! Loop through all selected output channels +! DO I = 0,NINT(farm%WD(1)%y%NumPlanes)-1 ! Loop through all selected output channels ! ! WRITE( farm%p%UnOu,'(A14)',ADVANCE='NO') 'PPLANEX'//trim(num2lstr(I)) ! WRITE( farm%p%UnOu,'(A14)',ADVANCE='NO') 'PPLANEY'//trim(num2lstr(I)) @@ -317,7 +321,7 @@ SUBROUTINE Farm_InitOutput( farm, ErrStat, ErrMsg ) !============================================================ ! DEBUG OUTPUTS HERE ! -! DO I = 0,farm%WD(1)%p%NumPlanes-1 ! Loop through all selected output channels +! DO I = 0,NINT(farm%WD(1)%y%NumPlanes)-1 ! Loop through all selected output channels ! ! WRITE( farm%p%UnOu,'(A14)',ADVANCE='NO') ' (m) ' ! WRITE( farm%p%UnOu,'(A14)',ADVANCE='NO') ' (m) ' @@ -329,7 +333,7 @@ SUBROUTINE Farm_InitOutput( farm, ErrStat, ErrMsg ) ! WRITE( farm%p%UnOu,'(A14)',ADVANCE='NO' ) ' (m/s) ' ! WRITE( farm%p%UnOu,'(A14)',ADVANCE='NO' ) ' (m/s) ' ! -! IF ( I < farm%WD(1)%p%NumPlanes-1 ) THEN +! IF ( I < NINT(farm%WD(1)%y%NumPlanes)-1 ) THEN ! WRITE( farm%p%UnOu,'(A14)',ADVANCE='NO' ) ' (-) ' ! END IF ! @@ -497,7 +501,7 @@ SUBROUTINE WriteFarmOutputToFile( t_global, farm, ErrStat, ErrMsg ) !============================================================ ! DEBUG OUTPUTS HERE ! -! DO I = 0,farm%WD(1)%p%NumPlanes-1 ! Loop through all selected output channels +! DO I = 0,NINT(farm%WD(1)%y%NumPlanes)-1 ! Loop through all selected output channels ! ! DO J = 1,3 ! WRITE( TmpStr2, '('//trim(farm%p%OutFmt)//')' ) farm%WD(1)%y%p_plane(J,I) @@ -569,6 +573,9 @@ SUBROUTINE Farm_ReadPrimaryFile( InputFile, p, WD_InitInp, AWAE_InitInp, OutList LOGICAL :: Echo ! Determines if an echo file should be written LOGICAL :: TabDelim ! Determines if text output should be delimited by tabs (true) or space (false) CHARACTER(1024) :: PriPath ! Path name of the primary file + CHARACTER(1024) :: InflowPathIfW ! Path name of the inflow file + CHARACTER(1024) :: InflowPathVTK ! Path name of the VTK directory + CHARACTER(1024) :: InflowPathAMReX ! Path name of the AMReX directory character(1024) :: sDummy ! Dummy string CHARACTER(10) :: AbortLevel ! String that indicates which error level should be used to abort the program: WARNING, SEVERE, or FATAL @@ -579,6 +586,9 @@ SUBROUTINE Farm_ReadPrimaryFile( InputFile, p, WD_InitInp, AWAE_InitInp, OutList CHARACTER(*), PARAMETER :: RoutineName = 'Farm_ReadPrimaryFile' Real(ReKi) :: DefaultReVal ! Default real value real(ReKi) :: TmpRAry5(5) ! Temporary array for reading in array of 5 + real(DbKi) :: DT_High_IfW, DT_Low_IfW + real(DbKi) :: DT_High_VTK, DT_Low_VTK + real(DbKi) :: DT_High_AMReX, DT_Low_AMReX ! Initialize some variables: UnEc = -1 @@ -641,7 +651,7 @@ SUBROUTINE Farm_ReadPrimaryFile( InputFile, p, WD_InitInp, AWAE_InitInp, OutList END SELECT CALL ReadVar( UnIn, InputFile, p%TMax, "TMax", "Total run time (s)", ErrStat2, ErrMsg2, UnEc); if (Failed()) return - CALL ReadVar( UnIn, InputFile, AWAE_InitInp%Mod_AmbWind, "Mod_AmbWind", "Ambient wind model (-) (switch) {1: high-fidelity precursor in VTK format, 2: one InflowWind module, 3: multiple InflowWind modules}", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadVar( UnIn, InputFile, AWAE_InitInp%Mod_AmbWind, "Mod_AmbWind", "Ambient wind model (-) (switch) {1: high-fidelity precursor in VTK format, 2: one InflowWind module, 3: multiple InflowWind modules, 4: high-fidelity precursor in AMReX format}", ErrStat2, ErrMsg2, UnEc); if (Failed()) return CALL ReadVar( UnIn, InputFile, p%WaveFieldMod, "Mod_WaveField", "Wave field handling (-) (switch) {1: use individual HydroDyn inputs without adjustment, 2: adjust wave phases based on turbine offsets from farm origin}", ErrStat2, ErrMsg2, UnEc); if (Failed()) return CALL ReadVar( UnIn, InputFile, p%MooringMod, "Mod_SharedMooring", "Array-level mooring handling (-) (switch) {0: none; 3: array-level MoorDyn model}", ErrStat2, ErrMsg2, UnEc); if (Failed()) return @@ -654,22 +664,16 @@ SUBROUTINE Farm_ReadPrimaryFile( InputFile, p, WD_InitInp, AWAE_InitInp, OutList !---------------------- AMBIENT WIND: PRECURSOR IN VTK FORMAT --------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Ambient Wind: Precursor in VTK Format', ErrStat2, ErrMsg2, UnEc ); if (Failed()) return - CALL ReadVar( UnIn, InputFile, p%DT_low, "DT_Low-VTK", "Time step for low-resolution wind data input files; will be used as the global FAST.Farm time step (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return - CALL ReadVar( UnIn, InputFile, p%DT_high, "DT_High-VTK", "Time step for high-resolution wind data input files (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return - CALL ReadVar( UnIn, InputFile, p%WindFilePath, "WindFilePath", "Path name of wind data files from ABLSolver precursor (string)", ErrStat2, ErrMsg2, UnEc); if (Failed()) return - IF ( PathIsRelative( p%WindFilePath ) ) p%WindFilePath = TRIM(PriPath)//TRIM(p%WindFilePath) + CALL ReadVar( UnIn, InputFile, DT_Low_VTK, "DT_Low-VTK", "Time step for low-resolution wind data input files; will be used as the global FAST.Farm time step (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadVar( UnIn, InputFile, DT_High_VTK, "DT_High-VTK", "Time step for high-resolution wind data input files (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadVar( UnIn, InputFile, InflowPathVTK, "WindFilePath", "Path name of wind data files from ABLSolver precursor (string)", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + IF (PathIsRelative(InflowPathVTK)) InflowPathVTK = TRIM(PriPath)//TRIM(InflowPathVTK) CALL ReadVar( UnIn, InputFile, AWAE_InitInp%ChkWndFiles, "ChkWndFiles", "Check all the ambient wind files for data consistency? (flag)", ErrStat2, ErrMsg2, UnEc); if (Failed()) return !---------------------- AMBIENT WIND: INFLOWWIND MODULE --------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Ambient Wind: InflowWind Module', ErrStat2, ErrMsg2, UnEc ); if (Failed()) return - CALL ReadVar( UnIn, InputFile, AWAE_InitInp%DT_low, "DT_Low", "Time step for low-resolution wind data input files; will be used as the global FAST.Farm time step (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return - CALL ReadVar( UnIn, InputFile, AWAE_InitInp%DT_high, "DT_High", "Time step for high-resolution wind data input files (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return - - ! Ensure consistency between AWAE_Inputs and FAST.Farm time steps - if ( AWAE_InitInp%Mod_AmbWind == 1) AWAE_InitInp%DT_high = p%DT_high - if ( AWAE_InitInp%Mod_AmbWind == 1) AWAE_InitInp%DT_low = p%DT_low - if ( AWAE_InitInp%Mod_AmbWind > 1 ) p%DT_low = AWAE_InitInp%DT_low - if ( AWAE_InitInp%Mod_AmbWind > 1 ) p%DT_high = AWAE_InitInp%DT_high + CALL ReadVar( UnIn, InputFile, DT_Low_IfW, "DT_Low", "Time step for low-resolution wind data input files; will be used as the global FAST.Farm time step (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadVar( UnIn, InputFile, DT_High_IfW, "DT_High", "Time step for high-resolution wind data input files (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return ! low res CALL ReadVar( UnIn, InputFile, AWAE_InitInp%nX_Low, "nX_Low", "Number of low-resolution spatial nodes in X direction for wind data interpolation (-) [>=2]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return @@ -688,9 +692,37 @@ SUBROUTINE Farm_ReadPrimaryFile( InputFile, p, WD_InitInp, AWAE_InitInp, OutList CALL ReadVar( UnIn, InputFile, AWAE_InitInp%nZ_High, "nZ_High", "Number of high-resolution spatial nodes in Z direction for wind data interpolation (-) [>=2]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return ! inflow file - CALL ReadVar( UnIn, InputFile, AWAE_InitInp%InflowFile, "InflowFile", "Name of file containing InflowWind module input parameters (quoted string)", ErrStat2, ErrMsg2, UnEc); if (Failed()) return - IF ( PathIsRelative( AWAE_InitInp%InflowFile ) ) AWAE_InitInp%InflowFile = TRIM(PriPath)//TRIM(AWAE_InitInp%InflowFile) - if ( AWAE_InitInp%Mod_AmbWind > 1 ) p%WindFilePath = AWAE_InitInp%InflowFile ! For the summary file + CALL ReadVar( UnIn, InputFile, InflowPathIfW, "InflowFile", "Name of file containing InflowWind module input parameters (quoted string)", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + IF (PathIsRelative(InflowPathIfW)) InflowPathIfW = TRIM(PriPath)//TRIM(InflowPathIfW) + + !---------------------- AMBIENT WIND: PRECURSOR IN AMReX FORMAT --------------------------------------------- + CALL ReadCom( UnIn, InputFile, 'Section Header: Ambient Wind: Precursor in AMReX Format', ErrStat2, ErrMsg2, UnEc ); if (Failed()) return + + CALL ReadVar( UnIn, InputFile, InflowPathAMReX, "WindDirPrefix", "Directory prefix of AMReX wind sub-volumes {0=low-res, 1+=high-res} (quoted string)", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + IF (PathIsRelative(InflowPathAMReX)) InflowPathAMReX = TRIM(PriPath)//TRIM(InflowPathAMReX) + + CALL ReadVar( UnIn, InputFile, AWAE_InitInp%DirStartIndex, "DirStartIndex", "AMReX sub-volume directory suffix to consider as time=0 (quoted string)", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadVar( UnIn, InputFile, DT_Low_AMReX, "DT_Low-AMReX", "Time step for low-resolution wind data input files; will be used as the global FAST.Farm time step (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadVar( UnIn, InputFile, DT_High_AMReX, "DT_High-AMReX", "Time step for high-resolution wind data input files (s) [>0.0]", ErrStat2, ErrMsg2, UnEc); if (Failed()) return + + ! Ensure consistency between AWAE_Inputs and FAST.Farm time steps + select case (AWAE_InitInp%Mod_AmbWind) + case (1) + p%DT_low = DT_Low_VTK + p%DT_high = DT_High_VTK + p%WindFilePath = InflowPathVTK + case (2,3) + p%DT_low = DT_Low_IfW + p%DT_high = DT_High_IfW + p%WindFilePath = InflowPathIfW + case (4) + p%DT_low = DT_Low_AMReX + p%DT_high = DT_High_AMReX + p%WindFilePath = InflowPathAMReX + end select + AWAE_InitInp%dt_low = p%DT_low + AWAE_InitInp%dt_high = p%DT_high + AWAE_InitInp%InflowFile = p%WindFilePath !---------------------- WIND TURBINES --------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Wind Turbines', ErrStat2, ErrMsg2, UnEc ); if (Failed()) return @@ -702,31 +734,33 @@ SUBROUTINE Farm_ReadPrimaryFile( InputFile, p, WD_InitInp, AWAE_InitInp, OutList call AllocAry( p%WT_FASTInFile, p%NumTurbines, 'WT_FASTInFile', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName); if (Failed()) return call AllocAry( AWAE_InitInp%WT_Position, 3, p%NumTurbines, 'AWAE_InitInp%WT_Position', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName); if (Failed()) return - if ( AWAE_InitInp%Mod_AmbWind > 1 ) then ! Using InflowWind + select case (AWAE_InitInp%Mod_AmbWind) + case (2,3) call AllocAry(AWAE_InitInp%X0_high, p%NumTurbines, 'AWAE_InitInp%X0_high', ErrStat2, ErrMsg2); if (Failed()) return call AllocAry(AWAE_InitInp%Y0_high, p%NumTurbines, 'AWAE_InitInp%Y0_high', ErrStat2, ErrMsg2); if (Failed()) return call AllocAry(AWAE_InitInp%Z0_high, p%NumTurbines, 'AWAE_InitInp%Z0_high', ErrStat2, ErrMsg2); if (Failed()) return call AllocAry(AWAE_InitInp%dX_high, p%NumTurbines, 'AWAE_InitInp%dX_high', ErrStat2, ErrMsg2); if (Failed()) return call AllocAry(AWAE_InitInp%dY_high, p%NumTurbines, 'AWAE_InitInp%dY_high', ErrStat2, ErrMsg2); if (Failed()) return call AllocAry(AWAE_InitInp%dZ_high, p%NumTurbines, 'AWAE_InitInp%dZ_high', ErrStat2, ErrMsg2); if (Failed()) return - end if + end select ! WT_Position (WT_X, WT_Y, WT_Z) and WT_FASTInFile do i=1,p%NumTurbines - if ( AWAE_InitInp%Mod_AmbWind == 1 ) then + select case (AWAE_InitInp%Mod_AmbWind) + case (1,4) READ (UnIn, *, IOSTAT=IOS) p%WT_Position(:,i), p%WT_FASTInFile(i) - else + case (2,3) READ (UnIn, *, IOSTAT=IOS) p%WT_Position(:,i), p%WT_FASTInFile(i), AWAE_InitInp%X0_high(i), AWAE_InitInp%Y0_high(i), AWAE_InitInp%Z0_high(i), AWAE_InitInp%dX_high(i), AWAE_InitInp%dY_high(i), AWAE_InitInp%dZ_high(i) - end if + end select AWAE_InitInp%WT_Position(:,i) = p%WT_Position(:,i) CALL CheckIOS ( IOS, InputFile, 'Wind Turbine Columns', NumType, ErrStat2, ErrMsg2 ); if (Failed()) return IF ( UnEc > 0 ) THEN - if ( AWAE_InitInp%Mod_AmbWind == 1 ) then + select case (AWAE_InitInp%Mod_AmbWind) + case (1,4) WRITE( UnEc, "(3(ES11.4e2,2X),'""',A,'""',T50,' - WT(',I5,')')" ) p%WT_Position(:,i), TRIM( p%WT_FASTInFile(i) ), I - else + case (2,3) WRITE( UnEc, "(3(ES11.4e2,2X),'""',A,'""',T50,6(ES11.4e2,2X),' - WT(',I5,')')" ) p%WT_Position(:,i), TRIM( p%WT_FASTInFile(i) ), AWAE_InitInp%X0_high(i), AWAE_InitInp%Y0_high(i), AWAE_InitInp%Z0_high(i), AWAE_InitInp%dX_high(i), AWAE_InitInp%dY_high(i), AWAE_InitInp%dZ_high(i), I - end if - + end select END IF IF ( PathIsRelative( p%WT_FASTInFile(i) ) ) p%WT_FASTInFile(i) = TRIM(PriPath)//TRIM(p%WT_FASTInFile(i)) end do @@ -738,7 +772,16 @@ SUBROUTINE Farm_ReadPrimaryFile( InputFile, p, WD_InitInp, AWAE_InitInp, OutList CALL ReadVar( UnIn, InputFile, p%RotorDiamRef , "RotorDiamRef", "Reference turbine rotor diameter for wake calculations (m) [>0.0]", ErrStat2, ErrMsg2, UnEc); if(failed()) return CALL ReadVar( UnIn, InputFile, WD_InitInp%dr , "dr" , "Radial increment of radial finite-difference grid (m) [>0.0]", ErrStat2, ErrMsg2, UnEc); if(failed()) return CALL ReadVar( UnIn, InputFile, WD_InitInp%NumRadii, "NumRadii", "Number of radii in the radial finite-difference grid (-) [>=2]", ErrStat2, ErrMsg2, UnEc); if(failed()) return - CALL ReadVar( UnIn, InputFile, WD_InitInp%NumPlanes,"NumPlanes", "Number of wake planes (-) [>=2]", ErrStat2, ErrMsg2, UnEc); if(failed()) return + + CALL ReadVarWDefault( UnIn, InputFile, WD_InitInp%NumDFull, "NumDFull", & + "Distance of full wake propagation, expressed as a multiple of RotorDiamRef [>0.0] or DEFAULT [DEFAULT=15]", & + 15_IntKi, ErrStat2, ErrMsg2, UnEc); if (Failed()) return + + CALL ReadVarWDefault( UnIn, InputFile, WD_InitInp%NumDBuff, "NumDBuff", & + "Length of wake propagation buffer region, expressed as a multiple of RotorDiamRef [>=0.0] or DEFAULT [DEFAULT=5]", & + 5_IntKi, ErrStat2, ErrMsg2, UnEc); if (Failed()) return + + WD_InitInp%RotorDiamRef = p%RotorDiamRef ! f_c - Cut-off (corner) frequency of the low-pass time-filter for the wake advection, deflection, and meandering model (Hz) [>0.0] or DEFAULT [DEFAULT=0.0007]: DefaultReVal = 12.5_ReKi/(p%RotorDiamRef/2._ReKi) ! Eq. (32) of https://doi.org/10.1002/we.2785, with U=10, a=1/3 @@ -1028,19 +1071,27 @@ SUBROUTINE Farm_ValidateInput( p, WD_InitInp, AWAE_InitInp, ErrStat, ErrMsg ) ! --- AMBIENT WIND: INFLOWWIND MODULE --- [used only for Mod_AmbWind=2 or 3] --- ! FIXME: this really should be checked with the turbine specific size diameter -- maybe relocate this check to AWAE or in FF after initializing all turbines? - if (AWAE_InitInp%Mod_AmbWind > 1) then - ! check that the grid is large enough to contain the turbine (only check Y and Z) + ! check that the grid is large enough to contain the turbine (only check Y and Z) + select case(AWAE_InitInp%Mod_AmbWind) + case (2) + call WrScr("Mod_AmbWind==2 will be depreciated and removed in a future release") do i=1,p%NumTurbines if (AWAE_InitInp%nY_High*AWAE_InitInp%dY_high(i) < p%RotorDiamRef) call SetErrStat(ErrID_Warn,'High res domain for turbine '//trim(Num2LStr(i))//' may be too small in Y (nY_High*dY_High < RotorDiamRef)',ErrStat,ErrMsg,RoutineName) if (AWAE_InitInp%nZ_High*AWAE_InitInp%dZ_high(i) < p%RotorDiamRef) call SetErrStat(ErrID_Warn,'High res domain for turbine '//trim(Num2LStr(i))//' may be too small in Z (nZ_High*dZ_High < RotorDiamRef)',ErrStat,ErrMsg,RoutineName) - enddo - endif + end do + case (3) + do i=1,p%NumTurbines + if (AWAE_InitInp%nY_High*AWAE_InitInp%dY_high(i) < p%RotorDiamRef) call SetErrStat(ErrID_Warn,'High res domain for turbine '//trim(Num2LStr(i))//' may be too small in Y (nY_High*dY_High < RotorDiamRef)',ErrStat,ErrMsg,RoutineName) + if (AWAE_InitInp%nZ_High*AWAE_InitInp%dZ_high(i) < p%RotorDiamRef) call SetErrStat(ErrID_Warn,'High res domain for turbine '//trim(Num2LStr(i))//' may be too small in Z (nZ_High*dZ_High < RotorDiamRef)',ErrStat,ErrMsg,RoutineName) + end do + end select ! --- WAKE DYNAMICS --- IF (WD_InitInp%Mod_Wake < 1 .or. WD_InitInp%Mod_Wake >3 ) CALL SetErrStat(ErrID_Fatal,'Mod_Wake needs to be 1,2 or 3',ErrStat,ErrMsg,RoutineName) IF (WD_InitInp%dr <= 0.0_ReKi) CALL SetErrStat(ErrID_Fatal,'dr (radial increment) must be larger than 0.',ErrStat,ErrMsg,RoutineName) IF (WD_InitInp%NumRadii < 2) CALL SetErrStat(ErrID_Fatal,'NumRadii (number of radii) must be at least 2.',ErrStat,ErrMsg,RoutineName) - IF (WD_InitInp%NumPlanes < 2) CALL SetErrStat(ErrID_Fatal,'NumPlanes (number of wake planes) must be at least 2.',ErrStat,ErrMsg,RoutineName) + IF (WD_InitInp%NumDFull <= 0.0_ReKi) CALL SetErrStat(ErrID_Fatal,'NumDFull (distance of full wake propagation as a multiple of RotorDiamRef) must be positive.',ErrStat,ErrMsg,RoutineName) + IF (WD_InitInp%NumDBuff < 0.0_ReKi) CALL SetErrStat(ErrID_Fatal,'NumDBuff (length of wake propagation buffer region as a multiple of RotorDiamRef) must be nonnegative.',ErrStat,ErrMsg,RoutineName) IF (WD_InitInp%k_VortexDecay < 0.0_ReKi) CALL SetErrStat(ErrID_Fatal,'k_VortexDecay must be >= 0',ErrStat,ErrMsg,RoutineName) IF (WD_InitInp%NumVortices < 2) CALL SetErrStat(ErrID_Fatal,'NumVorticies must be greater than 1',ErrStat,ErrMsg,RoutineName) diff --git a/glue-codes/fast-farm/src/FAST_Farm_IO_Params.f90 b/glue-codes/fast-farm/src/FAST_Farm_IO_Params.f90 index fbb4fe2471..bc6e1f58b3 100644 --- a/glue-codes/fast-farm/src/FAST_Farm_IO_Params.f90 +++ b/glue-codes/fast-farm/src/FAST_Farm_IO_Params.f90 @@ -9618,14 +9618,20 @@ MODULE FAST_Farm_IO_Params contains ! --- Functions not automatically generated -logical function PointInAABB(x, y, z, x0, y0, z0, x1, y1, z1) - real(ReKi), intent(in) :: x,y,z,x0,y0,z0,x1,y1,z1 +logical function PointInAABB(x, y, z, minXYZ, sizeXYZ) + real(ReKi), intent(in) :: x,y,z + real(ReKi), intent(in) :: minXYZ(3), sizeXYZ(3) + + ! Default to false + PointInAABB = .false. - ! default to return false - PointInAABB = .false.; - !Check if the point is less than max and greater than min - if (x >= x0 .and. x <= x1 .and. y >= y0 .and. y <= y1 .and. z >= z0 .and. z <= z1) PointInAABB = .true.; + ! If point is outside box, return false + if (x < minXYZ(1) .or. x > minXYZ(1) + sizeXYZ(1)) return + if (y < minXYZ(2) .or. y > minXYZ(2) + sizeXYZ(2)) return + if (z < minXYZ(3) .or. z > minXYZ(3) + sizeXYZ(3)) return + ! If we reach here, the point is inside the AABB + PointInAABB = .true. end function PointInAABB @@ -15504,7 +15510,8 @@ SUBROUTINE Farm_SetOutParam(OutList, farm, ErrStat, ErrMsg ) ! Add checks for the WindVel locations based on knowledge of the wind grids and NWindVel do i = 1, farm%p%NWindVel - if (.not. PointInAABB(farm%p%WindVelX(i), farm%p%WindVelY(i), farm%p%WindVelZ(i), farm%AWAE%p%X0_low, farm%AWAE%p%Y0_low,farm%AWAE%p%Z0_low, farm%AWAE%p%X0_low+(farm%AWAE%p%nX_low-1)*farm%AWAE%p%dX_low, farm%AWAE%p%Y0_low+(farm%AWAE%p%nY_low-1)*farm%AWAE%p%dY_low, farm%AWAE%p%Z0_low+(farm%AWAE%p%nZ_low-1)*farm%AWAE%p%dZ_low) ) then + if (.not. PointInAABB(farm%p%WindVelX(i), farm%p%WindVelY(i), farm%p%WindVelZ(i), & + farm%AWAE%p%LowRes%oXYZ, farm%AWAE%p%LowRes%Size)) then InvalidOutput( WVAmbX (i) ) = .true. InvalidOutput( WVAmbY (i) ) = .true. InvalidOutput( WVAmbZ (i) ) = .true. diff --git a/glue-codes/fast-farm/src/FAST_Farm_Registry.txt b/glue-codes/fast-farm/src/FAST_Farm_Registry.txt index 0119a1928b..110734ec5b 100644 --- a/glue-codes/fast-farm/src/FAST_Farm_Registry.txt +++ b/glue-codes/fast-farm/src/FAST_Farm_Registry.txt @@ -33,6 +33,7 @@ typedef ^ ParameterType DbKi DT_high - typedef ^ ParameterType DbKi TMax - - - "Total run time" seconds typedef ^ ParameterType IntKi n_high_low - - - "Number of high-resolution time steps per low-resolution time step" - typedef ^ ParameterType IntKi NumTurbines - - - "Number of turbines in the simulation" - +typedef ^ ParameterType IntKi MaxNumPlanes {:} - - "Maximum number of wake planes for each rotor" - typedef ^ ParameterType CHARACTER(1024) WindFilePath - - - "Path name of wind data files from ABLSolver precursor" - typedef ^ ParameterType ReKi WT_Position {:}{:} - - "X-Y-Z position of each wind turbine; index 1 = XYZ; index 2 = turbine number" meters typedef ^ ParameterType IntKi WaveFieldMod - - - "Wave field handling (-) (switch) {0: use individual HydroDyn inputs without adjustment, 1: adjust wave phases based on turbine offsets from farm origin}" - diff --git a/glue-codes/fast-farm/src/FAST_Farm_Subs.f90 b/glue-codes/fast-farm/src/FAST_Farm_Subs.f90 index 5cd2381d1b..30a7160478 100644 --- a/glue-codes/fast-farm/src/FAST_Farm_Subs.f90 +++ b/glue-codes/fast-farm/src/FAST_Farm_Subs.f90 @@ -32,12 +32,16 @@ MODULE FAST_Farm_Subs USE FAST_Farm_IO USE FAST_Subs USE FASTWrapper + USE InflowWind, only: InflowWind_End + USE MoorDyn, only: MD_UpdateStates, MD_CalcOutput, MD_End #ifdef _OPENMP USE OMP_LIB #endif IMPLICIT NONE + + integer(IntKi), private, parameter :: iED = 1 CONTAINS @@ -203,11 +207,14 @@ SUBROUTINE Farm_Initialize( farm, InputFile, ErrStat, ErrMsg ) ! [note that FAST uses the ceiling function, so it might think we're doing one more step than FAST.Farm; ! This difference will be a problem only if FAST thinks it's doing FEWER timesteps than FAST.Farm does.] - IF ( WD_InitInput%InputFileData%NumPlanes > farm%p%n_TMax ) THEN - WD_InitInput%InputFileData%NumPlanes = max( 2, min( WD_InitInput%InputFileData%NumPlanes, farm%p%n_TMax ) ) - call SetErrStat(ErrID_Warn, "For efficiency, NumPlanes has been reduced to the number of time steps ("//TRIM(Num2LStr(WD_InitInput%InputFileData%NumPlanes))//").", ErrStat, ErrMsg, RoutineName ) - ENDIF - + + call AllocAry( farm%p%MaxNumPlanes, farm%p%NumTurbines, 'farm%p%MaxNumPlanes', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName); if (Failed()) return + do i=1,farm%p%NumTurbines + ! Eventually, we will have different settings for different rotors + farm%p%MaxNumPlanes(i) = ceiling( 15.0 * Real( WD_InitInput%InputFileData%NumDFull + WD_InitInput%InputFileData%NumDBuff , ReKi ) / AWAE_InitInput%InputFileData%C_Meander ) + farm%p%MaxNumPlanes(i) = max( 2, min( farm%p%MaxNumPlanes(i) , farm%p%n_TMax + 2 ) ) + end do + !............................................................................................................................... ! step 3: initialize WAT, AWAE, and WD (b, c, and d can be done in parallel) !............................................................................................................................... @@ -227,7 +234,7 @@ SUBROUTINE Farm_Initialize( farm, InputFile, ErrStat, ErrMsg ) AWAE_InitInput%InputFileData%dt_low = farm%p%dt_low AWAE_InitInput%InputFileData%NumTurbines = farm%p%NumTurbines AWAE_InitInput%InputFileData%NumRadii = WD_InitInput%InputFileData%NumRadii - AWAE_InitInput%InputFileData%NumPlanes = WD_InitInput%InputFileData%NumPlanes + AWAE_InitInput%MaxPlanes = MAXVAL(farm%p%MaxNumPlanes) AWAE_InitInput%InputFileData%WindFilePath = farm%p%WindFilePath AWAE_InitInput%n_high_low = farm%p%n_high_low AWAE_InitInput%NumDT = farm%p%n_TMax @@ -241,15 +248,15 @@ SUBROUTINE Farm_Initialize( farm, InputFile, ErrStat, ErrMsg ) farm%AWAE%IsInitialized = .true. - farm%p%X0_Low = AWAE_InitOutput%X0_Low - farm%p%Y0_low = AWAE_InitOutput%Y0_low - farm%p%Z0_low = AWAE_InitOutput%Z0_low - farm%p%nX_Low = AWAE_InitOutput%nX_Low - farm%p%nY_low = AWAE_InitOutput%nY_low - farm%p%nZ_low = AWAE_InitOutput%nZ_low - farm%p%dX_low = AWAE_InitOutput%dX_low - farm%p%dY_low = AWAE_InitOutput%dY_low - farm%p%dZ_low = AWAE_InitOutput%dZ_low + farm%p%X0_Low = AWAE_InitOutput%oXYZ_Low(1) + farm%p%Y0_low = AWAE_InitOutput%oXYZ_Low(2) + farm%p%Z0_low = AWAE_InitOutput%oXYZ_Low(3) + farm%p%nX_Low = AWAE_InitOutput%nXYZ_Low(1) + farm%p%nY_low = AWAE_InitOutput%nXYZ_Low(2) + farm%p%nZ_low = AWAE_InitOutput%nXYZ_Low(3) + farm%p%dX_low = AWAE_InitOutput%dXYZ_Low(1) + farm%p%dY_low = AWAE_InitOutput%dXYZ_Low(2) + farm%p%dZ_low = AWAE_InitOutput%dXYZ_Low(3) farm%p%Module_Ver( ModuleFF_AWAE ) = AWAE_InitOutput%Ver !------------------- @@ -520,12 +527,15 @@ end subroutine MannLibDims subroutine Set_WAT_DxDyDz() real(ReKi) :: TmpDx,TmpDy,TmpDz logical :: HResDimsSame - ! If Mod_AmbWind<2, we don't read high res discretizations - if (AWAE_InitInput%InputFileData%Mod_AmbWind < 2) then + ! If Mod_AmbWind is 1 or 4, automatically calculate WAT DxDyDz + select case (AWAE_InitInput%InputFileData%Mod_AmbWind) + case (1,4) write(sDummy, '(3(F8.3,1X))') p%WAT_DxDyDz - call WrScr(' WAT: DxDyDz set to: '//trim(sDummy)//' (calculated based on guidance for Mod_AmbWind==1)') + call WrScr(' WAT: DxDyDz set to: '//trim(sDummy)// & + ' (calculated based on guidance for Mod_AmbWind=='// & + trim(Num2LStr(AWAE_InitInput%InputFileData%Mod_AmbWind))//')') return - endif + end select ! Check if all turbines use the same high res deltas HResDimsSame = .true. TmpDx = AWAE_InitInput%InputFileData%dX_high(1) @@ -607,8 +617,9 @@ SUBROUTINE Farm_InitWD( farm, WD_InitInp, ErrStat, ErrMsg ) ! initialization can be done in parallel (careful for FWrap_InitInp, though) !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - WD_InitInp%TurbNum = nt - WD_InitInp%OutFileRoot = farm%p%OutFileRoot + WD_InitInp%TurbNum = nt + WD_InitInp%MaxNumPlanes = farm%p%MaxNumPlanes(nt) + WD_InitInp%OutFileRoot = farm%p%OutFileRoot ! note that WD_Init has Interval as INTENT(IN) so, we don't need to worry about overwriting farm%p%dt_low here: call WD_Init( WD_InitInp, farm%WD(nt)%u, farm%WD(nt)%p, farm%WD(nt)%x, farm%WD(nt)%xd, farm%WD(nt)%z, & @@ -680,10 +691,6 @@ SUBROUTINE Farm_InitFAST( farm, WD_InitInp, AWAE_InitOutput, ErrStat, ErrMsg ) FWrap_InitInp%tmax = farm%p%TMax FWrap_InitInp%n_high_low = farm%p%n_high_low + 1 ! Add 1 because the FAST wrapper uses an index that starts at 1 FWrap_InitInp%dt_high = farm%p%dt_high - - FWrap_InitInp%nX_high = AWAE_InitOutput%nX_high - FWrap_InitInp%nY_high = AWAE_InitOutput%nY_high - FWrap_InitInp%nZ_high = AWAE_InitOutput%nZ_high if (farm%p%MooringMod > 0) then FWrap_Interval = farm%p%dt_mooring ! when there is a farm-level mooring model, FASTWrapper will be called at the mooring coupling time step @@ -703,14 +710,17 @@ SUBROUTINE Farm_InitFAST( farm, WD_InitInp, AWAE_InitOutput, ErrStat, ErrMsg ) FWrap_InitInp%TurbNum = nt FWrap_InitInp%RootName = trim(farm%p%OutFileRoot)//'.T'//num2lstr(nt) - - FWrap_InitInp%p_ref_high(1) = AWAE_InitOutput%X0_high(nt) - FWrap_InitInp%p_ref_high(2) = AWAE_InitOutput%Y0_high(nt) - FWrap_InitInp%p_ref_high(3) = AWAE_InitOutput%Z0_high(nt) + FWrap_InitInp%nX_high = AWAE_InitOutput%nXYZ_high(1,nt) + FWrap_InitInp%nY_high = AWAE_InitOutput%nXYZ_high(2,nt) + FWrap_InitInp%nZ_high = AWAE_InitOutput%nXYZ_high(3,nt) + + FWrap_InitInp%p_ref_high(1) = AWAE_InitOutput%oXYZ_high(1,nt) + FWrap_InitInp%p_ref_high(2) = AWAE_InitOutput%oXYZ_high(2,nt) + FWrap_InitInp%p_ref_high(3) = AWAE_InitOutput%oXYZ_high(3,nt) - FWrap_InitInp%dX_high = AWAE_InitOutput%dX_high(nt) - FWrap_InitInp%dY_high = AWAE_InitOutput%dY_high(nt) - FWrap_InitInp%dZ_high = AWAE_InitOutput%dZ_high(nt) + FWrap_InitInp%dX_high = AWAE_InitOutput%dXYZ_high(1,nt) + FWrap_InitInp%dY_high = AWAE_InitOutput%dXYZ_high(2,nt) + FWrap_InitInp%dZ_high = AWAE_InitOutput%dXYZ_high(3,nt) FWrap_InitInp%Vdist_High => AWAE_InitOutput%Vdist_High(nt)%data @@ -872,14 +882,14 @@ SUBROUTINE Farm_InitMD( farm, ErrStat, ErrMsg ) !if (farm%MD%p%NFairs(nt) > 0 ) then ! only set up a mesh map if MoorDyn has connections to this turbine ! loads - CALL MeshMapCreate( farm%MD%y%CoupledLoads(nt), farm%FWrap(nt)%m%Turbine%MeshMapData%SubstructureLoads_Tmp_Farm, farm%m%MD_2_FWrap(nt), ErrStat2, ErrMsg2 ) + CALL MeshMapCreate( farm%MD%y%CoupledLoads(nt), farm%FWrap(nt)%m%Turbine%m_Glue%Ext%SubstructureLoadsFF, farm%m%MD_2_FWrap(nt), ErrStat2, ErrMsg2 ) if (Failed()) return; ! kinematics IF (farm%FWrap(nt)%m%Turbine%p_FAST%CompSub == Module_SD) then SubstructureMotion => farm%FWrap(nt)%m%Turbine%SD%y%y3Mesh ELSE - SubstructureMotion => farm%FWrap(nt)%m%Turbine%ED%y%PlatformPtMesh + SubstructureMotion => farm%FWrap(nt)%m%Turbine%ED%y(iED)%PlatformPtMesh END IF CALL MeshMapCreate( SubstructureMotion, farm%MD%Input(1)%CoupledKinematics(nt), farm%m%FWrap_2_MD(nt), ErrStat2, ErrMsg2 ) @@ -963,7 +973,7 @@ subroutine FARM_MD_Increment(t, n, farm, ErrStat, ErrMsg) IF (farm%FWrap(nt)%m%Turbine%p_FAST%CompSub == Module_SD) then SubstructureMotion => farm%FWrap(nt)%m%Turbine%SD%y%y3Mesh ELSE - SubstructureMotion => farm%FWrap(nt)%m%Turbine%ED%y%PlatformPtMesh + SubstructureMotion => farm%FWrap(nt)%m%Turbine%ED%y(iED)%PlatformPtMesh END IF CALL Transfer_Point_to_Point( SubstructureMotion, farm%MD%Input(1)%CoupledKinematics(nt), farm%m%FWrap_2_MD(nt), ErrStat2, ErrMsg2 ) @@ -993,11 +1003,11 @@ subroutine FARM_MD_Increment(t, n, farm, ErrStat, ErrMsg) IF (farm%FWrap(nt)%m%Turbine%p_FAST%CompSub == Module_SD) then SubstructureMotion => farm%FWrap(nt)%m%Turbine%SD%y%y3Mesh ELSE - SubstructureMotion => farm%FWrap(nt)%m%Turbine%ED%y%PlatformPtMesh + SubstructureMotion => farm%FWrap(nt)%m%Turbine%ED%y(iED)%PlatformPtMesh END IF ! mapping; Note: SubstructureLoads_Tmp_Farm contains loads from the farm-level (at a previous step); gets integrated into individual turbines inside FWrap_Increment() - CALL Transfer_Point_to_Point( farm%MD%y%CoupledLoads(nt), farm%FWrap(nt)%m%Turbine%MeshMapData%SubstructureLoads_Tmp_Farm, & + CALL Transfer_Point_to_Point( farm%MD%y%CoupledLoads(nt), farm%FWrap(nt)%m%Turbine%m_Glue%Ext%SubstructureLoadsFF, & farm%m%MD_2_FWrap(nt), ErrStat2, ErrMsg2, & farm%MD%Input(1)%CoupledKinematics(nt), SubstructureMotion ) !u_MD and y_ED contain the displacements needed for moment calculations if (Failed()) return; @@ -1052,7 +1062,7 @@ subroutine FARM_InitialCO(farm, ErrStat, ErrMsg) farm%AWAE%u%Vy_wake = 0.0_ReKi ! Horizontal wake velocity deficit at wake planes, distributed radially, for each turbine farm%AWAE%u%Vz_wake = 0.0_ReKi ! "Vertical" wake velocity deficit at wake planes, distributed radially, for each turbine farm%AWAE%u%D_wake = 0.0_ReKi ! Wake diameters at wake planes for each turbine - + !-------------------- ! 1b. CALL AWAE_CO call AWAE_CalcOutput( 0.0_DbKi, farm%AWAE%u, farm%AWAE%p, farm%AWAE%x, farm%AWAE%xd, farm%AWAE%z, & @@ -1108,7 +1118,7 @@ subroutine FARM_InitialCO(farm, ErrStat, ErrMsg) !....................................................................................... ! CALL AWAE_CO !....................................................................................... - + call AWAE_CalcOutput( 0.0_DbKi, farm%AWAE%u, farm%AWAE%p, farm%AWAE%x, farm%AWAE%xd, farm%AWAE%z, & farm%AWAE%OtherSt, farm%AWAE%y, farm%AWAE%m, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -1148,7 +1158,7 @@ subroutine FARM_UpdateStates(t, n, farm, ErrStat, ErrMsg) INTEGER(IntKi) :: n_ss INTEGER(IntKi) :: n_FMD REAL(DbKi) :: t2 ! time within the FAST-MoorDyn substepping loop for shared moorings - INTEGER(IntKi) :: ErrStatAWAE, ErrStatMD, ErrStat2 + INTEGER(IntKi) :: ErrStatMD, ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 CHARACTER(ErrMsgLen) :: ErrMsgAWAE CHARACTER(ErrMsgLen) :: ErrMsgMD @@ -1275,22 +1285,12 @@ subroutine FARM_UpdateStates(t, n, farm, ErrStat, ErrMsg) ! write(*,*) 'Total FAST and Moordyn for FF_US took '//trim(num2lstr(tm2-tm1))//' seconds.' !#endif - call AWAE_UpdateStates( t, n, farm%AWAE%u, farm%AWAE%p, farm%AWAE%x, farm%AWAE%xd, farm%AWAE%z, & - farm%AWAE%OtherSt, farm%AWAE%m, ErrStatAWAE, ErrMsgAWAE ) - - !#ifdef printthreads - ! tm3 = omp_get_wtime() - ! write(*,*) 'AWAE_US took '//trim(num2lstr(tm3-tm2))//' seconds.' - ! write(*,*) 'Total Farm_US took '//trim(num2lstr(tm3-tm1))//' seconds.' - !#endif ! update error messages from FAST's and AWAE's time steps DO nt = 1,farm%p%NumTurbines call SetErrStat(ErrStatF(nt), ErrMsgF(nt), ErrStat, ErrMsg, 'T'//trim(num2lstr(nt))//':FARM_UpdateStates') ! FAST error status END DO - call SetErrStat(ErrStatAWAE, ErrMsgAWAE, ErrStat, ErrMsg, 'FARM_UpdateStates') ! AWAE error status - ! calculate outputs from FAST as needed by FAST.Farm do nt = 1,farm%p%NumTurbines call FWrap_CalcOutput(farm%FWrap(nt)%p, farm%FWrap(nt)%u, farm%FWrap(nt)%y, farm%FWrap(nt)%m, ErrStat2, ErrMsg2) @@ -1395,7 +1395,7 @@ subroutine Farm_WriteOutput(n, t, farm, ErrStat, ErrMsg) ! Loop over user-requested, downstream distances (OutDist), m do iOutDist = 1, farm%p%NOutDist - if ( farm%p%OutDist(iOutDist) >= maxval( farm%WD(nt)%y%x_plane(0:min(farm%WD(nt)%p%NumPlanes-1,n+1)) ) ) then + if ( farm%p%OutDist(iOutDist) >= maxval( farm%WD(nt)%y%x_plane( 0:NINT(farm%WD(nt)%y%NumPlanes)-1 ) ) ) then farm%m%AllOuts(WkAxsXTD(iOutDist,nt)) = 0.0_ReKi farm%m%AllOuts(WkAxsYTD(iOutDist,nt)) = 0.0_ReKi @@ -1432,7 +1432,7 @@ subroutine Farm_WriteOutput(n, t, farm, ErrStat, ErrMsg) else ! Find wake volume which contains the user-requested downstream location. - do np = 0, min(farm%WD(nt)%p%NumPlanes-2 , n) + do np = 0, NINT(farm%WD(nt)%y%NumPlanes)-2 if ( ( farm%p%OutDist(iOutDist) >= farm%WD(nt)%y%x_plane(np) ) .and. ( farm%p%OutDist(iOutDist) < farm%WD(nt)%y%x_plane(np+1) ) ) then ! A wake volume has been found @@ -1593,6 +1593,9 @@ subroutine FARM_CalcOutput(t, farm, ErrStat, ErrMsg) ! tm1 = omp_get_wtime() + ! Determine time step number + n = nint(t/farm%p%DT_low) + !....................................................................................... ! calculate module outputs and perform some input-output solves (steps 1. and 2. and 3. can be done in parallel, ! but be careful that step 3 doesn't modify the inputs to steps 1 or 2) @@ -1637,6 +1640,12 @@ subroutine FARM_CalcOutput(t, farm, ErrStat, ErrMsg) ! calculate AWAE outputs and perform rest of input-output solves !....................................................................................... + !-------------------- + ! 0. call AWAE_UpdateStates to get the ambient wind and calculate wake-grid interactions + call AWAE_UpdateStates( n, farm%AWAE%u, farm%AWAE%p, farm%AWAE%x, farm%AWAE%xd, farm%AWAE%z, & + farm%AWAE%OtherSt, farm%AWAE%m, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + !-------------------- ! 1. call AWAE_CO call AWAE_CalcOutput( t, farm%AWAE%u, farm%AWAE%p, farm%AWAE%x, farm%AWAE%xd, farm%AWAE%z, & @@ -1652,7 +1661,6 @@ subroutine FARM_CalcOutput(t, farm, ErrStat, ErrMsg) ! Write Output to File !....................................................................................... ! NOTE: Visualization data is output via the AWAE module - n = nint(t/farm%p%DT_low) call Farm_WriteOutput(n, t, farm, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -1802,12 +1810,14 @@ END SUBROUTINE Transfer_FAST_to_WD SUBROUTINE Transfer_AWAE_to_WD(farm) type(All_FastFarm_Data), INTENT(INOUT) :: farm !< FAST.Farm data - integer(intKi) :: nt + integer(IntKi) :: nt + integer(IntKi) :: MaxPln DO nt = 1,farm%p%NumTurbines - farm%WD(nt)%u%V_plane = farm%AWAE%y%V_plane(:,:,nt) ! Advection, deflection, and meandering velocity of wake planes, m/s - farm%WD(nt)%u%Vx_wind_disk = farm%AWAE%y%Vx_wind_disk(nt) ! Rotor-disk-averaged ambient wind speed, normal to planes, m/s - farm%WD(nt)%u%TI_amb = farm%AWAE%y%TI_amb(nt) ! Ambient turbulence intensity of wind at rotor disk + MaxPln = NINT(farm%WD(nt)%y%NumPlanes)-1 + farm%WD(nt)%u%V_plane(:,0:MaxPln) = farm%AWAE%y%V_plane(:,0:MaxPln,nt) ! Advection, deflection, and meandering velocity of wake planes, m/s + farm%WD(nt)%u%Vx_wind_disk = farm%AWAE%y%Vx_wind_disk(nt) ! Rotor-disk-averaged ambient wind speed, normal to planes, m/s + farm%WD(nt)%u%TI_amb = farm%AWAE%y%TI_amb(nt) ! Ambient turbulence intensity of wind at rotor disk END DO END SUBROUTINE Transfer_AWAE_to_WD @@ -1816,16 +1826,19 @@ SUBROUTINE Transfer_WD_to_AWAE(farm) type(All_FastFarm_Data), INTENT(INOUT) :: farm !< FAST.Farm data integer(intKi) :: nt + integer(IntKi) :: MaxPln - DO nt = 1,farm%p%NumTurbines - farm%AWAE%u%xhat_plane(:,:,nt) = farm%WD(nt)%y%xhat_plane ! Orientations of wake planes, normal to wake planes, for each turbine - farm%AWAE%u%p_plane(:,:,nt) = farm%WD(nt)%y%p_plane ! Center positions of wake planes for each turbine - farm%AWAE%u%Vx_wake(:,:,:,nt) = farm%WD(nt)%y%Vx_wake2 ! Axial wake velocity deficit at wake planes, distributed radially, for each turbine - farm%AWAE%u%Vy_wake(:,:,:,nt) = farm%WD(nt)%y%Vy_wake2 ! Horizontal wake velocity deficit at wake planes, distributed radially, for each turbine - farm%AWAE%u%Vz_wake(:,:,:,nt) = farm%WD(nt)%y%Vz_wake2 ! "Vertical" wake velocity deficit at wake planes, distributed radially, for each turbine - farm%AWAE%u%D_wake(:,nt) = farm%WD(nt)%y%D_wake ! Wake diameters at wake planes for each turbine + DO nt = 1,farm%p%NumTurbines + MaxPln = NINT(farm%WD(nt)%y%NumPlanes)-1 + farm%AWAE%u%NumPlanes ( nt) = farm%WD(nt)%y%NumPlanes ! Number of active wake planes for each turbine + farm%AWAE%u%xhat_plane( :,0:MaxPln,nt) = farm%WD(nt)%y%xhat_plane( :,0:MaxPln) ! Orientations of wake planes, normal to wake planes, for each turbine + farm%AWAE%u%p_plane ( :,0:MaxPln,nt) = farm%WD(nt)%y%p_plane ( :,0:MaxPln) ! Center positions of wake planes for each turbine + farm%AWAE%u%Vx_wake (:,:,0:MaxPln,nt) = farm%WD(nt)%y%Vx_wake2 (:,:,0:MaxPln) ! Axial wake velocity deficit at wake planes, distributed radially, for each turbine + farm%AWAE%u%Vy_wake (:,:,0:MaxPln,nt) = farm%WD(nt)%y%Vy_wake2 (:,:,0:MaxPln) ! Horizontal wake velocity deficit at wake planes, distributed radially, for each turbine + farm%AWAE%u%Vz_wake (:,:,0:MaxPln,nt) = farm%WD(nt)%y%Vz_wake2 (:,:,0:MaxPln) ! "Vertical" wake velocity deficit at wake planes, distributed radially, for each turbine + farm%AWAE%u%D_wake ( 0:MaxPln,nt) = farm%WD(nt)%y%D_wake ( 0:MaxPln) ! Wake diameters at wake planes for each turbine if (farm%p%WAT /= Mod_WAT_None) then - farm%AWAE%u%WAT_k(:,:,:,nt) = farm%WD(nt)%y%WAT_k ! scaling factor for each wake plane for WAT + farm%AWAE%u%WAT_k (:,:,0:MaxPln,nt) = farm%WD(nt)%y%WAT_k (:,:,0:MaxPln) ! scaling factor for each wake plane for WAT endif END DO diff --git a/glue-codes/fast-farm/src/FAST_Farm_Types.f90 b/glue-codes/fast-farm/src/FAST_Farm_Types.f90 index 68866a3cc3..e88cebf8e7 100644 --- a/glue-codes/fast-farm/src/FAST_Farm_Types.f90 +++ b/glue-codes/fast-farm/src/FAST_Farm_Types.f90 @@ -36,15 +36,15 @@ MODULE FAST_Farm_Types USE AWAE_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: NumFFModules = 5 ! The number of modules available in FAST.Farm [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_None = 0 ! No module selected [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_FWrap = 2 ! FAST Wrapper [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_WD = 3 ! Wake Dynamics [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_AWAE = 4 ! Ambient Wind and Array Effects [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_MD = 5 ! Farm-level MoorDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_WAT_None = 0 ! WAT: off [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_WAT_PreDef = 1 ! WAT: predefined turbulence boxes [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_WAT_UserDef = 2 ! WAT: user defined turbulence boxes [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: NumFFModules = 5 ! The number of modules available in FAST.Farm [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_None = 0 ! No module selected [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_FWrap = 2 ! FAST Wrapper [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_WD = 3 ! Wake Dynamics [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_AWAE = 4 ! Ambient Wind and Array Effects [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ModuleFF_MD = 5 ! Farm-level MoorDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_WAT_None = 0 ! WAT: off [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_WAT_PreDef = 1 ! WAT: predefined turbulence boxes [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_WAT_UserDef = 2 ! WAT: user defined turbulence boxes [-] ! ========= Farm_ParameterType ======= TYPE, PUBLIC :: Farm_ParameterType REAL(DbKi) :: DT_low = 0.0_R8Ki !< Time step for low-resolution wind data input files; will be used as the global FAST.Farm time step [seconds] @@ -52,6 +52,7 @@ MODULE FAST_Farm_Types REAL(DbKi) :: TMax = 0.0_R8Ki !< Total run time [seconds] INTEGER(IntKi) :: n_high_low = 0_IntKi !< Number of high-resolution time steps per low-resolution time step [-] INTEGER(IntKi) :: NumTurbines = 0_IntKi !< Number of turbines in the simulation [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: MaxNumPlanes !< Maximum number of wake planes for each rotor [-] CHARACTER(1024) :: WindFilePath !< Path name of wind data files from ABLSolver precursor [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WT_Position !< X-Y-Z position of each wind turbine; index 1 = XYZ; index 2 = turbine number [meters] INTEGER(IntKi) :: WaveFieldMod = 0_IntKi !< Wave field handling (-) (switch) {0: use individual HydroDyn inputs without adjustment, 1: adjust wave phases based on turbine offsets from farm origin} [-] @@ -197,7 +198,8 @@ MODULE FAST_Farm_Types TYPE(WAT_IfW_data) :: WAT_IfW !< IfW data for WAT (temporary location until pointers are enabled) [-] END TYPE All_FastFarm_Data ! ======================= -CONTAINS + +contains subroutine Farm_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) type(Farm_ParameterType), intent(in) :: SrcParamData @@ -217,6 +219,18 @@ subroutine Farm_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%TMax = SrcParamData%TMax DstParamData%n_high_low = SrcParamData%n_high_low DstParamData%NumTurbines = SrcParamData%NumTurbines + if (allocated(SrcParamData%MaxNumPlanes)) then + LB(1:1) = lbound(SrcParamData%MaxNumPlanes) + UB(1:1) = ubound(SrcParamData%MaxNumPlanes) + if (.not. allocated(DstParamData%MaxNumPlanes)) then + allocate(DstParamData%MaxNumPlanes(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MaxNumPlanes.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%MaxNumPlanes = SrcParamData%MaxNumPlanes + end if DstParamData%WindFilePath = SrcParamData%WindFilePath if (allocated(SrcParamData%WT_Position)) then LB(1:2) = lbound(SrcParamData%WT_Position) @@ -380,6 +394,9 @@ subroutine Farm_DestroyParam(ParamData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'Farm_DestroyParam' ErrStat = ErrID_None ErrMsg = '' + if (allocated(ParamData%MaxNumPlanes)) then + deallocate(ParamData%MaxNumPlanes) + end if if (allocated(ParamData%WT_Position)) then deallocate(ParamData%WT_Position) end if @@ -430,6 +447,7 @@ subroutine Farm_PackParam(RF, Indata) call RegPack(RF, InData%TMax) call RegPack(RF, InData%n_high_low) call RegPack(RF, InData%NumTurbines) + call RegPackAlloc(RF, InData%MaxNumPlanes) call RegPack(RF, InData%WindFilePath) call RegPackAlloc(RF, InData%WT_Position) call RegPack(RF, InData%WaveFieldMod) @@ -511,6 +529,7 @@ subroutine Farm_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%TMax); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%n_high_low); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumTurbines); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%MaxNumPlanes); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WindFilePath); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WT_Position); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveFieldMod); if (RegCheckErr(RF, RoutineName)) return @@ -1528,5 +1547,7 @@ subroutine Farm_UnPackAll_FastFarm_Data(RF, OutData) call Farm_UnpackMD_Data(RF, OutData%MD) ! MD call Farm_UnpackWAT_IfW_data(RF, OutData%WAT_IfW) ! WAT_IfW end subroutine + END MODULE FAST_Farm_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/glue-codes/labview/src/WaveTank_Types.f90 b/glue-codes/labview/src/WaveTank_Types.f90 index c134bcaa1e..822f48a3bd 100644 --- a/glue-codes/labview/src/WaveTank_Types.f90 +++ b/glue-codes/labview/src/WaveTank_Types.f90 @@ -215,7 +215,8 @@ MODULE WaveTank_Types REAL(c_float) , DIMENSION(:), ALLOCATABLE :: BldAcc_c !< Temp blade acceleration -- sequential by blade [(m/s^2,] END TYPE StructTmpType ! ======================= -CONTAINS + +contains subroutine WT_CopySimType(SrcSimTypeData, DstSimTypeData, CtrlCode, ErrStat, ErrMsg) type(SimType), intent(in) :: SrcSimTypeData @@ -1667,5 +1668,7 @@ subroutine WT_UnPackStructTmpType(RF, OutData) call RegUnpackAlloc(RF, OutData%BldVel_c); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BldAcc_c); if (RegCheckErr(RF, RoutineName)) return end subroutine + END MODULE WaveTank_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/glue-codes/openfast/src/FAST_Prog.f90 b/glue-codes/openfast/src/FAST_Prog.f90 index f4e9b2bfe2..d41dd0e376 100644 --- a/glue-codes/openfast/src/FAST_Prog.f90 +++ b/glue-codes/openfast/src/FAST_Prog.f90 @@ -32,7 +32,7 @@ PROGRAM FAST USE FAST_Subs ! all of the ModuleName and ModuleName_types modules are inherited from FAST_Subs -USE FAST_SS_Subs, ONLY : FAST_RunSteadyStateDriver +USE FAST_AeroMap, ONLY : FAST_RunSteadyStateDriver IMPLICIT NONE @@ -81,6 +81,7 @@ PROGRAM FAST ! this runs the steady-state solver driver and ENDS the program: CALL FAST_RunSteadyStateDriver( Turbine(1) ) + CALL ExitThisProgram_T( Turbine(1), ErrID_None, .true., SkipRunTimeMsg = .TRUE. ) ELSEIF ( LEN( TRIM(FlagArg) ) > 0 ) THEN ! Any other flag, end normally CALL NormStop() @@ -131,7 +132,7 @@ PROGRAM FAST ! write checkpoint file if requested - IF (mod(n_t_global, Turbine(1)%p_FAST%n_ChkptTime) == 0 .AND. Restart_step /= n_t_global .and. .not. Turbine(1)%m_FAST%Lin%FoundSteady) then + IF (mod(n_t_global, Turbine(1)%p_FAST%n_ChkptTime) == 0 .AND. Restart_step /= n_t_global .and. .not. Turbine(1)%m_Glue%CS%FoundSteady) then CheckpointRoot = TRIM(Turbine(1)%p_FAST%OutFileRoot)//'.'//TRIM(Num2LStr(n_t_global)) CALL FAST_CreateCheckpoint_Tary(t_initial, n_t_global, Turbine, CheckpointRoot, ErrStat, ErrMsg) @@ -155,13 +156,13 @@ PROGRAM FAST CALL FAST_Linearize_T(t_initial, n_t_global+1, Turbine(i_turb), ErrStat, ErrMsg) CALL CheckError( ErrStat, ErrMsg ) - IF ( Turbine(i_turb)%m_FAST%Lin%FoundSteady) EXIT TIME_STEP_LOOP + IF ( Turbine(i_turb)%m_Glue%CS%FoundSteady) EXIT TIME_STEP_LOOP END DO END DO TIME_STEP_LOOP ! n_t_global DO i_turb = 1,NumTurbines - if ( Turbine(i_turb)%p_FAST%CalcSteady .and. .not. Turbine(i_turb)%m_FAST%Lin%FoundSteady) then + if ( Turbine(i_turb)%p_FAST%CalcSteady .and. .not. Turbine(i_turb)%m_Glue%CS%FoundSteady) then CALL CheckError( ErrID_Fatal, "Unable to find steady-state solution." ) end if END DO diff --git a/glue-codes/python/pyproject.toml b/glue-codes/python/pyproject.toml index a56ca79d8d..41b6e7b763 100644 --- a/glue-codes/python/pyproject.toml +++ b/glue-codes/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "pyOpenFAST" -version = "4.2.1" +version = "5.0.0" description = "Python interface to OpenFAST FAST Library and physics modules." readme = "README.md" requires-python = ">=3.9" diff --git a/glue-codes/simulink/CMakeLists.txt b/glue-codes/simulink/CMakeLists.txt index a66d6ce71b..1d358ad812 100644 --- a/glue-codes/simulink/CMakeLists.txt +++ b/glue-codes/simulink/CMakeLists.txt @@ -33,6 +33,7 @@ set(MEX_LIBS $ $ # MATLAB Specific $ + $ $ $ $ @@ -55,10 +56,13 @@ matlab_add_mex( SRC src/FAST_SFunc.c ${PROJECT_SOURCE_DIR}/modules/openfast-library/src/FAST_Subs.f90 - ${PROJECT_SOURCE_DIR}/modules/openfast-library/src/FAST_Lin.f90 ${PROJECT_SOURCE_DIR}/modules/openfast-library/src/FAST_Mods.f90 ${PROJECT_SOURCE_DIR}/modules/openfast-library/src/FAST_Solver.f90 ${PROJECT_SOURCE_DIR}/modules/openfast-library/src/FAST_Library.f90 + ${PROJECT_SOURCE_DIR}/modules/openfast-library/src/FAST_Funcs.f90 + ${PROJECT_SOURCE_DIR}/modules/openfast-library/src/FAST_ModGlue.f90 + ${PROJECT_SOURCE_DIR}/modules/openfast-library/src/FAST_AeroMap.f90 + ${PROJECT_SOURCE_DIR}/modules/openfast-library/src/FAST_Mapping.f90 LINK_TO ${MEX_LIBS} ${MEX_LIBS} # DO NOT REMOVE (needed to ensure no unresolved symbols) diff --git a/glue-codes/simulink/src/create_FAST_SFunc.m b/glue-codes/simulink/src/create_FAST_SFunc.m index d3c85fb3df..47cabf087e 100644 --- a/glue-codes/simulink/src/create_FAST_SFunc.m +++ b/glue-codes/simulink/src/create_FAST_SFunc.m @@ -33,23 +33,13 @@ libDir = '../../../build/bin'; includeDir = '../../../modules/openfast-library/src'; % needed for visual studio builds to find "FAST_Library.h" outDir = libDir; - - switch computer('arch') - case 'win64' - % this is set up for files generated using the x64 configuration of vs-build - libName = 'OpenFAST-Simulink_x64'; - - case 'win32' - % this is set up for files generated using the x86 - % configuration of vs-build (win32 will work only on older versions of Matlab) - libName = 'OpenFAST-Simulink_Win32'; - end + libName = 'OpenFAST-Simulink'; else %% defaults for cmake builds: fprintf( '\n----------------------------\n' ); - fprintf( 'Do not use this script with Mac/Linux. Follow the CMake instructions at the top of the script instead.' ); + fprintf( 'Do not use this script with Mac/Linux. Follow the CMake instructions at the top of this script instead.' ); fprintf( '\n----------------------------\n' ); end diff --git a/modules/aerodisk/src/AeroDisk.f90 b/modules/aerodisk/src/AeroDisk.f90 index e6257ac2d7..da72cbc5a5 100644 --- a/modules/aerodisk/src/AeroDisk.f90 +++ b/modules/aerodisk/src/AeroDisk.f90 @@ -144,6 +144,10 @@ SUBROUTINE ADsk_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO ! Set some other stuff that the framework requires call Init_OtherStuff(ErrStat2,ErrMsg2); if (Failed()) return + ! Initialize module variables + call ADsk_InitVars(u, p, x, y, m, InitOut%Vars, InputFileData, .false., ErrStat2, ErrMsg2) + if (Failed()) return + contains logical function Failed() call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -266,6 +270,64 @@ subroutine Init_InitY(ErrStat3,ErrMsg3) end subroutine Init_InitY END SUBROUTINE ADsk_Init +subroutine ADsk_InitVars(u, p, x, y, m, Vars, InputFileData, Linearize, ErrStat, ErrMsg) + type(ADsk_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(ADsk_ParameterType), intent(inout) :: p !< Parameters + type(ADsk_ContinuousStateType), intent(inout) :: x !< Continuous state + type(ADsk_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(ADsk_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(ModVarsType), intent(inout) :: Vars !< Module variables + type(ADsk_InputFile), intent(in) :: InputFileData !< Input file data + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_No ne + + character(*), parameter :: RoutineName = 'ADsk_InitVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + real(R8Ki) :: MaxThrust, MaxTorque, ScaleLength + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%u, "Hub", MotionFields, & + DL=DatLoc(ADsk_u_HubMotion), & + Mesh=u%HubMotion) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%y, 'AeroLoads', LoadFields, & + DatLoc(ADsk_y_AeroLoads), & + Mesh=y%AeroLoads) + + !---------------------------------------------------------------------------- + ! Initialization dependent on linearization + !---------------------------------------------------------------------------- + + call MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call ADsk_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ADsk_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ADsk_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ADsk_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the end of the simulation. diff --git a/modules/aerodisk/src/AeroDisk_Registry.txt b/modules/aerodisk/src/AeroDisk_Registry.txt index e3247e633b..990dfbaafd 100644 --- a/modules/aerodisk/src/AeroDisk_Registry.txt +++ b/modules/aerodisk/src/AeroDisk_Registry.txt @@ -66,7 +66,7 @@ typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - typedef ^ InitOutputType ReKi AirDens - - - "Air density" "kg/m^3" - +typedef ^ InitOutputType ModVarsType Vars - - - "Module variables" - # ..... Inputs .................................................................................................................... # inputs on meshes: NONE @@ -136,4 +136,10 @@ typedef ^ MiscVarType SiKi Moment 3 - typedef ^ MiscVarType ReKi DiskWindPosAbs {:}{:} - - "Disk locations for sampling to get disk avarage velocity (absolute for getting wind)" m typedef ^ MiscVarType ReKi DiskWindVel {:}{:} - - "Wind speed at disk locations for disk velocity" m/s typedef ^ MiscVarType ReKi DiskAvgVel 3 - - "Average wind speed across rotor disk" m/s +typedef ^ MiscVarType ModJacType Jac - - - "Values corresponding to module variables" +typedef ^ MiscVarType ADsk_ContinuousStateType x_perturb - - - "Continuous state type for linearization perturbation" - +typedef ^ MiscVarType ADsk_ContinuousStateType dxdt_lin - - - "Continuous state type for linearization output" - +typedef ^ MiscVarType ADsk_InputType u_perturb - - - "Input type for linearization perturbation" - +typedef ^ MiscVarType ADsk_OutputType y_lin - - - "Output type for linearization output" - + diff --git a/modules/aerodisk/src/AeroDisk_Types.f90 b/modules/aerodisk/src/AeroDisk_Types.f90 index 61fef67b28..6113bb03c2 100644 --- a/modules/aerodisk/src/AeroDisk_Types.f90 +++ b/modules/aerodisk/src/AeroDisk_Types.f90 @@ -34,7 +34,7 @@ MODULE AeroDisk_Types USE IfW_FlowField_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: ADsk_NumPtsDiskAvg = 144 ! Number of points averaged for rotor-average wind speed [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ADsk_NumPtsDiskAvg = 144 ! Number of points averaged for rotor-average wind speed [-] ! ========= ADsk_AeroTable ======= TYPE, PUBLIC :: ADsk_AeroTable INTEGER(IntKi) :: N_TSR = 0_IntKi !< Number of rotor tip-speed ratios in tables [-] @@ -87,6 +87,7 @@ MODULE AeroDisk_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] REAL(ReKi) :: AirDens = 0.0_ReKi !< Air density [kg/m^3] + TYPE(ModVarsType) :: Vars !< Module variables [-] END TYPE ADsk_InitOutputType ! ======================= ! ========= ADsk_InputType ======= @@ -161,9 +162,27 @@ MODULE AeroDisk_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DiskWindPosAbs !< Disk locations for sampling to get disk avarage velocity (absolute for getting wind) [m] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DiskWindVel !< Wind speed at disk locations for disk velocity [m/s] REAL(ReKi) , DIMENSION(1:3) :: DiskAvgVel = 0.0_ReKi !< Average wind speed across rotor disk [m/s] + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] + TYPE(ADsk_ContinuousStateType) :: x_perturb !< Continuous state type for linearization perturbation [-] + TYPE(ADsk_ContinuousStateType) :: dxdt_lin !< Continuous state type for linearization output [-] + TYPE(ADsk_InputType) :: u_perturb !< Input type for linearization perturbation [-] + TYPE(ADsk_OutputType) :: y_lin !< Output type for linearization output [-] END TYPE ADsk_MiscVarType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: ADsk_x_DummyContState = 1 ! ADsk%DummyContState + integer(IntKi), public, parameter :: ADsk_u_HubMotion = 2 ! ADsk%HubMotion + integer(IntKi), public, parameter :: ADsk_u_RotSpeed = 3 ! ADsk%RotSpeed + integer(IntKi), public, parameter :: ADsk_u_BlPitch = 4 ! ADsk%BlPitch + integer(IntKi), public, parameter :: ADsk_y_AeroLoads = 5 ! ADsk%AeroLoads + integer(IntKi), public, parameter :: ADsk_y_YawErr = 6 ! ADsk%YawErr + integer(IntKi), public, parameter :: ADsk_y_PsiSkew = 7 ! ADsk%PsiSkew + integer(IntKi), public, parameter :: ADsk_y_ChiSkew = 8 ! ADsk%ChiSkew + integer(IntKi), public, parameter :: ADsk_y_VRel = 9 ! ADsk%VRel + integer(IntKi), public, parameter :: ADsk_y_Ct = 10 ! ADsk%Ct + integer(IntKi), public, parameter :: ADsk_y_Cq = 11 ! ADsk%Cq + integer(IntKi), public, parameter :: ADsk_y_WriteOutput = 12 ! ADsk%WriteOutput + +contains subroutine ADsk_CopyAeroTable(SrcAeroTableData, DstAeroTableData, CtrlCode, ErrStat, ErrMsg) type(ADsk_AeroTable), intent(in) :: SrcAeroTableData @@ -636,6 +655,9 @@ subroutine ADsk_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, E call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return DstInitOutputData%AirDens = SrcInitOutputData%AirDens + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine ADsk_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -655,6 +677,8 @@ subroutine ADsk_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine ADsk_PackInitOutput(RF, Indata) @@ -666,6 +690,7 @@ subroutine ADsk_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%WriteOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) call RegPack(RF, InData%AirDens) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -681,6 +706,7 @@ subroutine ADsk_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine ADsk_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) @@ -1144,13 +1170,14 @@ subroutine ADsk_UnPackParam(RF, OutData) end subroutine subroutine ADsk_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(ADsk_MiscVarType), intent(in) :: SrcMiscData + type(ADsk_MiscVarType), intent(inout) :: SrcMiscData type(ADsk_MiscVarType), intent(inout) :: DstMiscData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'ADsk_CopyMisc' ErrStat = ErrID_None ErrMsg = '' @@ -1203,12 +1230,29 @@ subroutine ADsk_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) DstMiscData%DiskWindVel = SrcMiscData%DiskWindVel end if DstMiscData%DiskAvgVel = SrcMiscData%DiskAvgVel + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ADsk_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ADsk_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ADsk_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ADsk_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine ADsk_DestroyMisc(MiscData, ErrStat, ErrMsg) type(ADsk_MiscVarType), intent(inout) :: MiscData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'ADsk_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' @@ -1221,6 +1265,16 @@ subroutine ADsk_DestroyMisc(MiscData, ErrStat, ErrMsg) if (allocated(MiscData%DiskWindVel)) then deallocate(MiscData%DiskWindVel) end if + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ADsk_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ADsk_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ADsk_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ADsk_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine ADsk_PackMisc(RF, Indata) @@ -1244,6 +1298,11 @@ subroutine ADsk_PackMisc(RF, Indata) call RegPackAlloc(RF, InData%DiskWindPosAbs) call RegPackAlloc(RF, InData%DiskWindVel) call RegPack(RF, InData%DiskAvgVel) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call ADsk_PackContState(RF, InData%x_perturb) + call ADsk_PackContState(RF, InData%dxdt_lin) + call ADsk_PackInput(RF, InData%u_perturb) + call ADsk_PackOutput(RF, InData%y_lin) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1271,6 +1330,11 @@ subroutine ADsk_UnPackMisc(RF, OutData) call RegUnpackAlloc(RF, OutData%DiskWindPosAbs); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%DiskWindVel); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DiskAvgVel); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call ADsk_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call ADsk_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call ADsk_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call ADsk_UnpackOutput(RF, OutData%y_lin) ! y_lin end subroutine subroutine ADsk_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -1610,5 +1674,278 @@ SUBROUTINE ADsk_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, E y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function ADsk_InputMeshPointer(u, DL) result(Mesh) + type(ADsk_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ADsk_u_HubMotion) + Mesh => u%HubMotion + end select +end function + +function ADsk_OutputMeshPointer(y, DL) result(Mesh) + type(ADsk_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ADsk_y_AeroLoads) + Mesh => y%AeroLoads + end select +end function + +subroutine ADsk_VarsPackContState(Vars, x, ValAry) + type(ADsk_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ADsk_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ADsk_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ADsk_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADsk_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ADsk_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ADsk_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ADsk_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine ADsk_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ADsk_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADsk_x_DummyContState) + x%DummyContState = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function ADsk_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ADsk_x_DummyContState) + Name = "x%DummyContState" + case default + Name = "Unknown Field" + end select +end function + +subroutine ADsk_VarsPackContStateDeriv(Vars, x, ValAry) + type(ADsk_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ADsk_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ADsk_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ADsk_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADsk_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ADsk_VarsPackInput(Vars, u, ValAry) + type(ADsk_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ADsk_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine ADsk_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(ADsk_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADsk_u_HubMotion) + call MV_PackMesh(V, u%HubMotion, ValAry) ! Mesh + case (ADsk_u_RotSpeed) + VarVals(1) = u%RotSpeed ! Scalar + case (ADsk_u_BlPitch) + VarVals(1) = u%BlPitch ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ADsk_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ADsk_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ADsk_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine ADsk_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ADsk_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADsk_u_HubMotion) + call MV_UnpackMesh(V, ValAry, u%HubMotion) ! Mesh + case (ADsk_u_RotSpeed) + u%RotSpeed = VarVals(1) ! Scalar + case (ADsk_u_BlPitch) + u%BlPitch = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function ADsk_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ADsk_u_HubMotion) + Name = "u%HubMotion" + case (ADsk_u_RotSpeed) + Name = "u%RotSpeed" + case (ADsk_u_BlPitch) + Name = "u%BlPitch" + case default + Name = "Unknown Field" + end select +end function + +subroutine ADsk_VarsPackOutput(Vars, y, ValAry) + type(ADsk_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ADsk_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine ADsk_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(ADsk_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADsk_y_AeroLoads) + call MV_PackMesh(V, y%AeroLoads, ValAry) ! Mesh + case (ADsk_y_YawErr) + VarVals(1) = y%YawErr ! Scalar + case (ADsk_y_PsiSkew) + VarVals(1) = y%PsiSkew ! Scalar + case (ADsk_y_ChiSkew) + VarVals(1) = y%ChiSkew ! Scalar + case (ADsk_y_VRel) + VarVals(1) = y%VRel ! Scalar + case (ADsk_y_Ct) + VarVals(1) = y%Ct ! Scalar + case (ADsk_y_Cq) + VarVals(1) = y%Cq ! Scalar + case (ADsk_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ADsk_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ADsk_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ADsk_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine ADsk_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ADsk_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADsk_y_AeroLoads) + call MV_UnpackMesh(V, ValAry, y%AeroLoads) ! Mesh + case (ADsk_y_YawErr) + y%YawErr = VarVals(1) ! Scalar + case (ADsk_y_PsiSkew) + y%PsiSkew = VarVals(1) ! Scalar + case (ADsk_y_ChiSkew) + y%ChiSkew = VarVals(1) ! Scalar + case (ADsk_y_VRel) + y%VRel = VarVals(1) ! Scalar + case (ADsk_y_Ct) + y%Ct = VarVals(1) ! Scalar + case (ADsk_y_Cq) + y%Cq = VarVals(1) ! Scalar + case (ADsk_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ADsk_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ADsk_y_AeroLoads) + Name = "y%AeroLoads" + case (ADsk_y_YawErr) + Name = "y%YawErr" + case (ADsk_y_PsiSkew) + Name = "y%PsiSkew" + case (ADsk_y_ChiSkew) + Name = "y%ChiSkew" + case (ADsk_y_VRel) + Name = "y%VRel" + case (ADsk_y_Ct) + Name = "y%Ct" + case (ADsk_y_Cq) + Name = "y%Cq" + case (ADsk_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE AeroDisk_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/CMakeLists.txt b/modules/aerodyn/CMakeLists.txt index 09f4ea1388..0c9fcda1a5 100644 --- a/modules/aerodyn/CMakeLists.txt +++ b/modules/aerodyn/CMakeLists.txt @@ -72,7 +72,7 @@ add_library(aerodynlib STATIC src/FVW_Tests.f90 src/FVW_Types.f90 ) -target_link_libraries(aerodynlib basicaerolib aeroacousticslib nwtclibs) +target_link_libraries(aerodynlib basicaerolib aeroacousticslib seastlib nwtclibs) # ADI lib add_library(adilib STATIC @@ -120,13 +120,14 @@ add_library(aerodyn_inflow_c_binding_object OBJECT ) target_link_libraries(aerodyn_inflow_c_binding_object adilib aerodyn_driver_subs nwtclibs versioninfolib) set_property(TARGET aerodyn_inflow_c_binding_object PROPERTY POSITION_INDEPENDENT_CODE 1) # required for shared libs +if(APPLE OR UNIX) + target_compile_definitions(aerodyn_inflow_c_binding_object PRIVATE IMPLICIT_DLLEXPORT) +endif() # shared add_library(aerodyn_inflow_c_binding SHARED $) target_link_libraries(aerodyn_inflow_c_binding adilib aerodyn_driver_subs nwtclibs versioninfolib) -if(APPLE OR UNIX) - target_compile_definitions(aerodyn_inflow_c_binding PRIVATE IMPLICIT_DLLEXPORT) -endif() + # C-bindings non-shared interface # This is a workaround for building wavetank into a single DLL (also allows setting CU globaly for sending screen to file for labview integration) diff --git a/modules/aerodyn/src/AeroAcoustics_Types.f90 b/modules/aerodyn/src/AeroAcoustics_Types.f90 index c7bec5de2b..78edce7d4c 100644 --- a/modules/aerodyn/src/AeroAcoustics_Types.f90 +++ b/modules/aerodyn/src/AeroAcoustics_Types.f90 @@ -227,7 +227,17 @@ MODULE AeroAcoustics_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutputNodes !< Data to be written to an output file: see WriteOutputHdr for names of each variable [see WriteOutputUnt] END TYPE AA_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: AA_u_RotGtoL = 1 ! AA%RotGtoL + integer(IntKi), public, parameter :: AA_u_AeroCent_G = 2 ! AA%AeroCent_G + integer(IntKi), public, parameter :: AA_u_Vrel = 3 ! AA%Vrel + integer(IntKi), public, parameter :: AA_u_AoANoise = 4 ! AA%AoANoise + integer(IntKi), public, parameter :: AA_u_Inflow = 5 ! AA%Inflow + integer(IntKi), public, parameter :: AA_y_WriteOutputForPE = 6 ! AA%WriteOutputForPE + integer(IntKi), public, parameter :: AA_y_WriteOutput = 7 ! AA%WriteOutput + integer(IntKi), public, parameter :: AA_y_WriteOutputSep = 8 ! AA%WriteOutputSep + integer(IntKi), public, parameter :: AA_y_WriteOutputNodes = 9 ! AA%WriteOutputNodes + +contains subroutine AA_CopyBladePropsType(SrcBladePropsTypeData, DstBladePropsTypeData, CtrlCode, ErrStat, ErrMsg) type(AA_BladePropsType), intent(in) :: SrcBladePropsTypeData @@ -2241,5 +2251,181 @@ subroutine AA_UnPackOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputSep); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputNodes); if (RegCheckErr(RF, RoutineName)) return end subroutine + +function AA_InputMeshPointer(u, DL) result(Mesh) + type(AA_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function AA_OutputMeshPointer(y, DL) result(Mesh) + type(AA_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine AA_VarsPackInput(Vars, u, ValAry) + type(AA_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call AA_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine AA_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(AA_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AA_u_RotGtoL) + VarVals = u%RotGtoL(V%iLB:V%iUB, V%j, V%k, V%m) ! Rank 4 Array + case (AA_u_AeroCent_G) + VarVals = u%AeroCent_G(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (AA_u_Vrel) + VarVals = u%Vrel(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (AA_u_AoANoise) + VarVals = u%AoANoise(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (AA_u_Inflow) + VarVals = u%Inflow(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AA_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(AA_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call AA_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine AA_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(AA_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AA_u_RotGtoL) + u%RotGtoL(V%iLB:V%iUB, V%j, V%k, V%m) = VarVals ! Rank 4 Array + case (AA_u_AeroCent_G) + u%AeroCent_G(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (AA_u_Vrel) + u%Vrel(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (AA_u_AoANoise) + u%AoANoise(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (AA_u_Inflow) + u%Inflow(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + end select + end associate +end subroutine + +function AA_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AA_u_RotGtoL) + Name = "u%RotGtoL" + case (AA_u_AeroCent_G) + Name = "u%AeroCent_G" + case (AA_u_Vrel) + Name = "u%Vrel" + case (AA_u_AoANoise) + Name = "u%AoANoise" + case (AA_u_Inflow) + Name = "u%Inflow" + case default + Name = "Unknown Field" + end select +end function + +subroutine AA_VarsPackOutput(Vars, y, ValAry) + type(AA_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call AA_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine AA_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(AA_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AA_y_WriteOutputForPE) + VarVals = y%WriteOutputForPE(V%iLB:V%iUB) ! Rank 1 Array + case (AA_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (AA_y_WriteOutputSep) + VarVals = y%WriteOutputSep(V%iLB:V%iUB) ! Rank 1 Array + case (AA_y_WriteOutputNodes) + VarVals = y%WriteOutputNodes(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AA_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(AA_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call AA_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine AA_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(AA_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AA_y_WriteOutputForPE) + y%WriteOutputForPE(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (AA_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (AA_y_WriteOutputSep) + y%WriteOutputSep(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (AA_y_WriteOutputNodes) + y%WriteOutputNodes(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function AA_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AA_y_WriteOutputForPE) + Name = "y%WriteOutputForPE" + case (AA_y_WriteOutput) + Name = "y%WriteOutput" + case (AA_y_WriteOutputSep) + Name = "y%WriteOutputSep" + case (AA_y_WriteOutputNodes) + Name = "y%WriteOutputNodes" + case default + Name = "Unknown Field" + end select +end function + END MODULE AeroAcoustics_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/src/AeroDyn.f90 b/modules/aerodyn/src/AeroDyn.f90 index 641c17c6cc..a96e045792 100644 --- a/modules/aerodyn/src/AeroDyn.f90 +++ b/modules/aerodyn/src/AeroDyn.f90 @@ -31,7 +31,9 @@ module AeroDyn use UnsteadyAero use FVW use FVW_Subs, only: FVW_AeroOuts - use IfW_FlowField, only: IfW_FlowField_GetVelAcc, IfW_UniformWind_GetOP, IfW_UniformWind_Perturb, IfW_FlowField_CopyFlowFieldType + use IfW_FlowField_Types + use IfW_FlowField, only: IfW_FlowField_GetVelAcc, IfW_FlowField_CopyFlowFieldType + use SeaSt_WaveField, only: WaveField_GetWaveVelAcc_AD implicit none private @@ -46,7 +48,7 @@ module AeroDyn ! continuous states, and updating discrete states public :: AD_CalcOutput ! Routine for computing outputs public :: AD_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual - + public :: RotCalcContStateDeriv PUBLIC :: AD_JacobianPInput ! Routine to compute the Jacobians of the output(Y), continuous - (X), discrete - ! (Xd), and constraint - state(Z) functions all with respect to the inputs(u) @@ -59,7 +61,8 @@ module AeroDyn PUBLIC :: AD_JacobianPConstrState ! Routine to compute the Jacobians of the output(Y), continuous - (X), discrete - ! (Xd), and constraint - state(Z) functions all with respect to the constraint ! states(z) - PUBLIC :: AD_GetOP !< Routine to pack the operating point values (for linearization) into arrays + PUBLIC :: AD_VarsPackExtInput !< Routine pack extended inputs + public :: AD_CalcWind_Rotor !< Routine to calculate rotor wind inputs contains !---------------------------------------------------------------------------------------------------------------------------------- @@ -409,7 +412,12 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut ! set the rest of the parameters - p%Skew_Mod = InputFileData%Skew_Mod + ! NOTE: some parameters need to be set even if no rotors + p%Skew_Mod = InputFileData%Skew_Mod + p%UA_Flag = InputFileData%UA_Init%UAMod > UA_None + p%CompAeroMaps = InitInp%CompAeroMaps + p%DT = InputFileData%DTAero + p%Wake_Mod = InputFileData%Wake_Mod do iR = 1, nRotors p%rotors(iR)%AeroProjMod = AeroProjMod(iR) call WrScr(' AeroDyn: projMod: '//trim(num2lstr(p%rotors(iR)%AeroProjMod))) @@ -447,12 +455,22 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut ! Calculate buoyancy parameters !............................................................................................ do iR = 1, nRotors - if ( p%rotors(iR)%Buoyancy ) then + if ( p%rotors(iR)%MHK /= MHK_None ) then call SetBuoyancyParameters( InputFileData%rotors(iR), u%rotors(iR), p%rotors(iR), ErrStat2, ErrMsg2 ) if (Failed()) return; end if end do + !............................................................................................ + ! Calculate inertia and added mass parameters + !............................................................................................ + do iR = 1, nRotors + if ( p%rotors(iR)%MHK /= MHK_None ) then + call SetAddedMassInertiaParameters( InputFileData%rotors(iR), p%rotors(iR), ErrStat2, ErrMsg2 ) + if (Failed()) return; + end if + end do + !............................................................................................ ! Initialize the BEMT module (also sets other variables for sub module) !............................................................................................ @@ -572,14 +590,18 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut enddo !............................................................................................ - ! Initialize Jacobian: + ! Module Variables !............................................................................................ - if (InitInp%Linearize .or. InitInp%CompAeroMaps) then - do iR = 1, nRotors - call Init_Jacobian(InputFileData%rotors(iR), p%rotors(iR), p, u%rotors(iR), y%rotors(iR), m%rotors(iR), InitOut%rotors(iR), errStat2, errMsg2) - if (Failed()) return; - enddo - end if + + do iR = 1, nRotors + call AD_InitVars(iR, u%rotors(iR), p%rotors(iR), x%rotors(iR), z%rotors(iR), OtherState%rotors(iR), y%rotors(iR), m%rotors(iR), InitOut%rotors(iR), & + InputFileData%rotors(iR), InitInp%Linearize, InitInp%CompAeroMaps, ErrStat2, ErrMsg2) + if (Failed()) return; + end do + + call AD_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return + call AD_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return + !............................................................................................ ! Print the summary file if requested: @@ -812,7 +834,7 @@ subroutine Init_MiscVars(m, p, p_AD, u, y, errStat, errMsg) if (ErrStat >= AbortErrLev) RETURN - if (p%Buoyancy) then + if (p%MHK /= MHK_None) then ! Point mesh for blade buoyant loads allocate(m%BladeBuoyLoadPoint(p%NumBlades), Stat = ErrStat2) if (ErrStat2 /= 0) then @@ -961,9 +983,22 @@ subroutine Init_MiscVars(m, p, p_AD, u, y, errStat, errMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':T_P_2_T_L') if (ErrStat >= AbortErrLev) RETURN + + call AllocAry( m%TwrFI, 3_IntKi, p%NumTwrNds, 'm%TwrFI', ErrStat2, ErrMsg2 ) + call SetErrStat( errStat2, errMsg2, errStat, errMsg, RoutineName ) + call AllocAry( m%TwrFA, 3_IntKi, p%NumTwrNds, 'm%TwrFA', ErrStat2, ErrMsg2 ) + call SetErrStat( errStat2, errMsg2, errStat, errMsg, RoutineName ) end if + + call AllocAry( m%BlFI, 3_IntKi, p%NumBlNds, p%numBlades, 'm%BlFI', ErrStat2, ErrMsg2 ) + call SetErrStat( errStat2, errMsg2, errStat, errMsg, RoutineName ) + + call AllocAry( m%BlFA, 3_IntKi, p%NumBlNds, p%numBlades, 'm%BlFA', ErrStat2, ErrMsg2 ) + call SetErrStat( errStat2, errMsg2, errStat, errMsg, RoutineName ) + call AllocAry( m%BlMA, 3_IntKi, p%NumBlNds, p%numBlades, 'm%BlMA', ErrStat2, ErrMsg2 ) + call SetErrStat( errStat2, errMsg2, errStat, errMsg, RoutineName ) end if ! @@ -1028,7 +1063,7 @@ subroutine Init_y(y, u, p, errStat, errMsg) errMsg = "" - if (p%NumTwrNds > 0 .and. (p%TwrAero /= TwrAero_None .or. p%Buoyancy)) then + if (p%NumTwrNds > 0 .and. (p%TwrAero /= TwrAero_None .or. p%MHK /= MHK_None)) then call MeshCopy ( SrcMesh = u%TowerMotion & , DestMesh = y%TowerLoad & @@ -1321,6 +1356,7 @@ subroutine Init_u( u, p, p_AD, InputFileData, MHK, WtrDpth, InitInp, errStat, er u%BladeMotion(k)%TranslationVel = 0.0_ReKi u%BladeMotion(k)%RotationVel = 0.0_ReKi u%BladeMotion(k)%TranslationAcc = 0.0_ReKi + u%BladeMotion(k)%RotationAcc = 0.0_ReKi if (p_AD%CompAeroMaps) then do j=1,InputFileData%BladeProps(k)%NumBlNds @@ -1431,6 +1467,7 @@ subroutine SetParameters( InitInp, InputFileData, RotData, p, p_AD, ErrStat, Err p_AD%UA_Flag = InputFileData%UA_Init%UAMod > UA_None p_AD%CompAeroMaps = InitInp%CompAeroMaps + p_AD%CompSeaSt = InitInp%CompSeaSt p_AD%SectAvg = InputFileData%SectAvg p_AD%SA_Weighting = InputFileData%SA_Weighting @@ -1440,14 +1477,12 @@ subroutine SetParameters( InitInp, InputFileData, RotData, p, p_AD, ErrStat, Err p%MHK = InitInp%MHK - p_AD%DT = InputFileData%DTAero - p_AD%Wake_Mod = InputFileData%Wake_Mod p%DBEMT_Mod = InputFileData%DBEMT_Mod + p%TwrPotent = InputFileData%TwrPotent p%TwrShadow = InputFileData%TwrShadow p%TwrAero = InputFileData%TwrAero p%CavitCheck = InputFileData%CavitCheck - p%Buoyancy = InputFileData%Buoyancy p%NacelleDrag = InputFileData%NacelleDrag p%NacArea = RotData%NacArea @@ -1464,24 +1499,26 @@ subroutine SetParameters( InitInp, InputFileData, RotData, p, p_AD, ErrStat, Err p%NumBlNds = 0 endif - if (p%NumBlades>0 .and. p%Buoyancy) then + if (p%NumBlades>0 .and. p%MHK /= MHK_None) then call AllocAry( p%BlCenBn, p%NumBlNds, p%NumBlades, 'BlCenBn', ErrStat2, ErrMsg2 ) call AllocAry( p%BlCenBt, p%NumBlNds, p%NumBlades, 'BlCenBt', ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) endif - if (RotData%NumTwrNds > 0 .and. (p%TwrPotent /= TwrPotent_none .or. p%TwrShadow /= TwrShadow_none .or. p%TwrAero /= TwrAero_none .or. p%Buoyancy)) then + if (RotData%NumTwrNds > 0 .and. (p%TwrPotent /= TwrPotent_none .or. p%TwrShadow /= TwrShadow_none .or. p%TwrAero /= TwrAero_none .or. p%MHK /= MHK_None)) then p%NumTwrNds = RotData%NumTwrNds call move_alloc( RotData%TwrDiam, p%TwrDiam ) - call move_alloc( RotData%TwrCd, p%TwrCd ) - call move_alloc( RotData%TwrTI, p%TwrTI ) - call move_alloc( RotData%TwrCb, p%TwrCb ) + call move_alloc( RotData%TwrCd , p%TwrCd ) + call move_alloc( RotData%TwrTI , p%TwrTI ) + call move_alloc( RotData%TwrCb , p%TwrCb ) + call move_alloc( RotData%TwrCp , p%TwrCp ) + call move_alloc( RotData%TwrCa , p%TwrCa ) else p%NumTwrNds = 0 end if - if (p%Buoyancy) then + if (p%MHK /= MHK_None) then do k = 1,p%NumBlades p%BlCenBn(:,k) = RotData%BladeProps(k)%BlCenBn p%BlCenBt(:,k) = RotData%BladeProps(k)%BlCenBt @@ -1635,6 +1672,72 @@ subroutine SetBuoyancyParameters( InputFileData, u, p, ErrStat, ErrMsg ) end subroutine SetBuoyancyParameters !---------------------------------------------------------------------------------------------------------------------------------- +!> This routine sets parameters for use during the inertia and added mass calculations; these variables are not changed after AD_Init. +subroutine SetAddedMassInertiaParameters( InputFileData, p, ErrStat, ErrMsg ) + TYPE(RotInputFile), INTENT(IN ) :: InputFileData !< All the data in the AeroDyn input file + TYPE(RotParameterType), INTENT(INOUT) :: p !< Parameters + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + ! Local variables + INTEGER(IntKi) :: ErrStat2 !< Temporary error status of the operation + CHARACTER(ErrMsgLen) :: ErrMsg2 !< Temporary error message if ErrStat /= ErrID_None + INTEGER(IntKi) :: k !< Loop counter for blades + INTEGER(IntKi) :: j !< Loop counter for nodes + + CHARACTER(*), PARAMETER :: RoutineName = 'SetAddedMassInertiaParameters' + + + ! Initialize variables for this routine + ErrStat = ErrID_None + ErrMsg = "" + + + ! Allocate inertia and added mass parameters + call AllocAry( p%BlIN, p%NumBlNds, p%NumBlades, 'BlIN', ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( p%BlIT, p%NumBlNds, p%NumBlades, 'BlIT', ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( p%BlAN, p%NumBlNds, p%NumBlades, 'BlAN', ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( p%BlAT, p%NumBlNds, p%NumBlades, 'BlAT', ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( p%BlAM, p%NumBlNds, p%NumBlades, 'BlAM', ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + if ( p%NumTwrNds > 0 ) then + call AllocAry( p%TwrIT, p%NumTwrNds, 'TwrIT', ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( p%TwrAT, p%NumTwrNds, 'TwrAT', ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + end if + + ! Calculate blade inertia and added mass parameters + do k = 1,p%NumBlades ! loop through all blades + + do j = 1,p%NumBlNds ! loop through all nodes + p%BlIN(j,k) = (InputFileData%BladeProps(k)%BlCpn(j) + InputFileData%BladeProps(k)%BlCan(j)) * p%airDens * InputFileData%BladeProps(k)%BlChord(j)**2 * InputFileData%BladeProps(k)%t_c(j) ! node j normal-to-chord inertia factor + p%BlIT(j,k) = (InputFileData%BladeProps(k)%BlCpt(j) + InputFileData%BladeProps(k)%BlCat(j)) * p%airDens * InputFileData%BladeProps(k)%BlChord(j)**2 * InputFileData%BladeProps(k)%t_c(j) ! node j tangential-to-chord inertia factor + p%BlAN(j,k) = -InputFileData%BladeProps(k)%BlCan(j) * p%airDens * InputFileData%BladeProps(k)%BlChord(j)**2 * InputFileData%BladeProps(k)%t_c(j) ! node j normal-to-chord added mass factor + p%BlAT(j,k) = -InputFileData%BladeProps(k)%BlCat(j) * p%airDens * InputFileData%BladeProps(k)%BlChord(j)**2 * InputFileData%BladeProps(k)%t_c(j) ! node j tangential-to-chord added mass factor + p%BlAM(j,k) = -InputFileData%BladeProps(k)%BlCam(j)/12.0_ReKi * p%airDens * InputFileData%BladeProps(k)%BlChord(j)**2 * InputFileData%BladeProps(k)%t_c(j) * (InputFileData%BladeProps(k)%BlChord(j)**2 + InputFileData%BladeProps(k)%BlChord(j)**2 * InputFileData%BladeProps(k)%t_c(j)**2) ! node j pitch added mass factor + end do ! j = nodes + + end do ! k = blades + + ! Calculate tower inertia and added mass parameters + if ( p%NumTwrNds > 0 ) then + + do j = 1,p%NumTwrNds ! loop through all nodes + p%TwrIT(j) = (p%TwrCp(j) + p%TwrCa(j)) * p%airDens * pi * (p%TwrDiam(j)/2.0_ReKi)**2 ! node j tangential inertia factor + p%TwrAT(j) = -p%TwrCa(j) * p%airDens * pi * (p%TwrDiam(j)/2.0_ReKi)**2 ! node j tangential added mass factor + end do ! j = nodes + + end if + +end subroutine SetAddedMassInertiaParameters +!---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the end of the simulation. subroutine AD_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1666,9 +1769,11 @@ subroutine AD_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) if (p%Wake_Mod == WakeMod_FVW ) then if ( p%UA_Flag ) then - do iW=1,p%FVW%nWings - call UA_End(m%FVW%W(iW)%p_UA) - enddo + if (allocated(m%FVW%W)) then + do iW=1,p%FVW%nWings + call UA_End(m%FVW%W(iW)%p_UA) + enddo + endif end if call FVW_End( m%FVW_u, p%FVW, x%FVW, xd%FVW, z%FVW, OtherState%FVW, m%FVW_y, m%FVW, ErrStat, ErrMsg ) @@ -1757,7 +1862,7 @@ subroutine AD_UpdateStates( t, n, u, utimes, p, x, xd, z, OtherState, m, errStat ! Set wind -- NOTE: this is inneficient since the previous input value resides at m%Inflow(2) do i=1,size(u) - call AD_CalcWind(utimes(i), u(i), p%FLowField, p, OtherState, m%Inflow(i), ErrStat2, ErrMsg2) + call AD_CalcWind(utimes(i), u(i), p%FLowField, p, m, OtherState, m%Inflow(i), ErrStat2, ErrMsg2) if (Failed()) return enddo @@ -1776,7 +1881,7 @@ subroutine AD_UpdateStates( t, n, u, utimes, p, x, xd, z, OtherState, m, errStat if (Failed()) return ! Calculate wind using uInterp - call AD_CalcWind(utimes(i),uInterp, p%FLowField, p, OtherState, m%Inflow(1), ErrStat2, ErrMsg2) + call AD_CalcWind(utimes(i),uInterp, p%FLowField, p, m, OtherState, m%Inflow(1), ErrStat2, ErrMsg2) if (Failed()) return do iR = 1,size(p%rotors) @@ -1836,11 +1941,12 @@ logical function Failed() end function Failed end subroutine AD_UpdateStates -subroutine AD_CalcWind(t, u, FLowField, p, o, Inflow, ErrStat, ErrMsg) +subroutine AD_CalcWind(t, u, FLowField, p, m, o, Inflow, ErrStat, ErrMsg) real(DbKi), intent(in ) :: t !< Current simulation time in seconds type(AD_InputType), intent(in ) :: u !< Inputs at Time t type(FlowFieldType),pointer, intent(in ) :: FlowField type(AD_ParameterType), intent(in ) :: p !< Parameters + type(AD_MiscVarType), intent(inout) :: m !< Misc/optimization variables type(AD_OtherStateType), intent(in ) :: o !< Other states at t type(AD_InflowType),target, intent(inout) :: Inflow !< calculated inflow integer(IntKi), intent( out) :: ErrStat !< Error status of the operation @@ -1863,7 +1969,7 @@ subroutine AD_CalcWind(t, u, FLowField, p, o, Inflow, ErrStat, ErrMsg) StartNode = 1 do iWT = 1, size(u%rotors) - call AD_CalcWind_Rotor(t, u%rotors(iWT), FLowField, p%rotors(iWT), Inflow%RotInflow(iWT), StartNode, ErrStat2, ErrMsg2) + call AD_CalcWind_Rotor(t, u%rotors(iWT), FLowField, p%rotors(iWT), p, m, Inflow%RotInflow(iWT), StartNode, ErrStat2, ErrMsg2) if(Failed()) return enddo @@ -1892,11 +1998,13 @@ logical function Failed() end function Failed end subroutine -subroutine AD_CalcWind_Rotor(t, u, FlowField, p, RotInflow, StartNode, ErrStat, ErrMsg) +subroutine AD_CalcWind_Rotor(t, u, FlowField, p, p_AD, m, RotInflow, StartNode, ErrStat, ErrMsg) real(DbKi), intent(in ) :: t !< Current simulation time in seconds type(RotInputType), intent(in ) :: u !< Inputs at Time t type(FlowFieldType),pointer, intent(in ) :: FlowField type(RotParameterType), intent(in ) :: p !< Parameters + type(AD_ParameterType), intent(in ) :: p_AD !< AD parameters + type(AD_MiscVarType), intent(inout) :: m !< Misc/optimization variables type(RotInflowType), intent(inout) :: RotInflow !< calculated inflow for rotor integer(IntKi), intent(inout) :: StartNode !< starting node for rotor wind integer(IntKi), intent( out) :: ErrStat !< Error status of the operation @@ -1920,55 +2028,108 @@ subroutine AD_CalcWind_Rotor(t, u, FlowField, p, RotInflow, StartNode, ErrStat, PosOffset = 0.0_ReKi end if - ! Hub - if (u%HubMotion%Committed) then - call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & - real(u%HubMotion%TranslationDisp + u%HubMotion%Position, ReKi), & - RotInflow%InflowOnHub, NoAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) - if(Failed()) return - else - RotInflow%InflowOnHub = 0.0_ReKi - end if - StartNode = StartNode + 1 + if (p%MHK /= MHK_None .and. p_AD%CompSeaSt) then ! MHK turbines with waves + ! Hub + if (u%HubMotion%Committed) then + call WaveField_GetWaveVelAcc_AD(p_AD%WaveField, m%WaveField_m, StartNode, t, & + real(u%HubMotion%TranslationDisp + u%HubMotion%Position, ReKi), & + RotInflow%InflowOnHub, NoAcc, ErrStat2, ErrMsg2) + if(Failed()) return + else + RotInflow%InflowOnHub = 0.0_ReKi + end if + StartNode = StartNode + 1 - ! Blade - do k = 1, p%NumBlades - call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & - real(u%BladeMotion(k)%TranslationDisp + u%BladeMotion(k)%Position, ReKi), & - RotInflow%Blade(k)%InflowVel, RotInflow%Blade(k)%InflowAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) - if(Failed()) return - StartNode = StartNode + p%NumBlNds - end do + ! Blade + do k = 1, p%NumBlades + call WaveField_GetWaveVelAcc_AD(p_AD%WaveField, m%WaveField_m, StartNode, t, & + real(u%BladeMotion(k)%TranslationDisp + u%BladeMotion(k)%Position, ReKi), & + RotInflow%Blade(k)%InflowVel, RotInflow%Blade(k)%InflowAcc, ErrStat2, ErrMsg2) + if(Failed()) return + StartNode = StartNode + p%NumBlNds + end do - ! Tower - if (u%TowerMotion%Nnodes > 0) then - call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & - real(u%TowerMotion%TranslationDisp + u%TowerMotion%Position, ReKi), & - RotInflow%Tower%InflowVel, RotInflow%Tower%InflowAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) - if(Failed()) return - StartNode = StartNode + p%NumTwrNds - end if + ! Tower + if (u%TowerMotion%Nnodes > 0) then + call WaveField_GetWaveVelAcc_AD(p_AD%WaveField, m%WaveField_m, StartNode, t, & + real(u%TowerMotion%TranslationDisp + u%TowerMotion%Position, ReKi), & + RotInflow%Tower%InflowVel, RotInflow%Tower%InflowAcc, ErrStat2, ErrMsg2) + if(Failed()) return + StartNode = StartNode + p%NumTwrNds + end if - ! Nacelle - if (u%NacelleMotion%Committed) then - call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & - real(u%NacelleMotion%TranslationDisp + u%NacelleMotion%Position, ReKi), & - RotInflow%InflowOnNacelle, NoAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) - if(Failed()) return - StartNode = StartNode + 1 - else - RotInflow%InflowOnNacelle = 0.0_ReKi - end if + ! Nacelle + if (u%NacelleMotion%Committed) then + call WaveField_GetWaveVelAcc_AD(p_AD%WaveField, m%WaveField_m, StartNode, t, & + real(u%NacelleMotion%TranslationDisp + u%NacelleMotion%Position, ReKi), & + RotInflow%InflowOnNacelle, NoAcc, ErrStat2, ErrMsg2) + if(Failed()) return + StartNode = StartNode + 1 + else + RotInflow%InflowOnNacelle = 0.0_ReKi + end if - ! TailFin - if (u%TFinMotion%Committed) then - call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & - real(u%TFinMotion%TranslationDisp + u%TFinMotion%Position, ReKi), & - RotInflow%InflowOnTailFin, NoAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) - if(Failed()) return + ! TailFin + if (u%TFinMotion%Committed) then + call WaveField_GetWaveVelAcc_AD(p_AD%WaveField, m%WaveField_m, StartNode, t, & + real(u%TFinMotion%TranslationDisp + u%TFinMotion%Position, ReKi), & + RotInflow%InflowOnTailFin, NoAcc, ErrStat2, ErrMsg2) + if(Failed()) return + StartNode = StartNode + 1 + else + RotInflow%InflowOnTailFin = 0.0_ReKi + end if + else ! Wind turbines or MHK turbines without waves + ! Hub + if (u%HubMotion%Committed) then + call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & + real(u%HubMotion%TranslationDisp + u%HubMotion%Position, ReKi), & + RotInflow%InflowOnHub, NoAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) + if(Failed()) return + else + RotInflow%InflowOnHub = 0.0_ReKi + end if StartNode = StartNode + 1 - else - RotInflow%InflowOnTailFin = 0.0_ReKi + + ! Blade + do k = 1, p%NumBlades + call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & + real(u%BladeMotion(k)%TranslationDisp + u%BladeMotion(k)%Position, ReKi), & + RotInflow%Blade(k)%InflowVel, RotInflow%Blade(k)%InflowAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) + if(Failed()) return + StartNode = StartNode + p%NumBlNds + end do + + ! Tower + if (u%TowerMotion%Nnodes > 0) then + call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & + real(u%TowerMotion%TranslationDisp + u%TowerMotion%Position, ReKi), & + RotInflow%Tower%InflowVel, RotInflow%Tower%InflowAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) + if(Failed()) return + StartNode = StartNode + p%NumTwrNds + end if + + ! Nacelle + if (u%NacelleMotion%Committed) then + call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & + real(u%NacelleMotion%TranslationDisp + u%NacelleMotion%Position, ReKi), & + RotInflow%InflowOnNacelle, NoAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) + if(Failed()) return + StartNode = StartNode + 1 + else + RotInflow%InflowOnNacelle = 0.0_ReKi + end if + + ! TailFin + if (u%TFinMotion%Committed) then + call IfW_FlowField_GetVelAcc(FlowField, StartNode, t, & + real(u%TFinMotion%TranslationDisp + u%TFinMotion%Position, ReKi), & + RotInflow%InflowOnTailFin, NoAcc, ErrStat2, ErrMsg2, PosOffset=PosOffset) + if(Failed()) return + StartNode = StartNode + 1 + else + RotInflow%InflowOnTailFin = 0.0_ReKi + end if end if contains @@ -2020,7 +2181,7 @@ subroutine AD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, end if ! Calculate wind based on current positions - call AD_CalcWind(t, u, p%FlowField, p, OtherState, m%Inflow(1), ErrStat2, ErrMsg2) + call AD_CalcWind(t, u, p%FlowField, p, m, OtherState, m%Inflow(1), ErrStat2, ErrMsg2) if(Failed()) return ! SetInputs, Calc BEM Outputs and Twr Outputs @@ -2044,31 +2205,9 @@ subroutine AD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, endif ! Cavitation check - call AD_CavtCrit(u, p, m, errStat2, errMsg2) + call RotCavtCrit(u, p, m, errStat2, errMsg2) if(Failed()) return - ! initialize nacelle mesh loads - do iR = 1,size(p%rotors) - y%rotors(iR)%NacelleLoad%Force = 0.0_ReKi - y%rotors(iR)%NacelleLoad%Moment = 0.0_ReKi - end do - - ! Calculate buoyant loads - do iR = 1,size(p%rotors) - if ( p%rotors(iR)%Buoyancy ) then - call CalcBuoyantLoads( u%rotors(iR), p%rotors(iR), m%rotors(iR), y%rotors(iR), ErrStat, ErrMsg ) - if(Failed()) return - end if - end do - - ! Calculate nacelle drag loads - do iR = 1,size(p%rotors) - if ( p%rotors(iR)%NacelleDrag ) then - call computeNacelleDrag( u%rotors(iR), p%rotors(iR), m%rotors(iR), y%rotors(iR), m%Inflow(1)%RotInflow(iR), ErrStat, ErrMsg ) - if(Failed()) return - end if - end do - !------------------------------------------------------- ! get values to output to file: !------------------------------------------------------- @@ -2157,6 +2296,28 @@ subroutine RotCalcOutput( t, u, RotInflow, p, p_AD, x, xd, z, OtherState, y, m, call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) endif + ! initialize nacelle mesh loads + y%NacelleLoad%Force = 0.0_ReKi + y%NacelleLoad%Moment = 0.0_ReKi + + ! Calculate buoyant loads + if ( p%MHK /= MHK_None ) then + call RotCalcBuoyantLoads(u, p, m, y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end if + + ! Calculate nacelle drag loads + if (p%NacelleDrag) then + call RotCalcNacelleDrag(u, p, m, y, RotInflow, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end if + + ! Calculate added mass and fluid inertia loads + if ( p%MHK /= MHK_None ) then + call RotCalcAddedMassInertiaLoads(u, p, m, y, RotInflow, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end if + ! --- Tail Fin if (p%TFinAero) then call TFin_CalcOutput(p, p_AD, u, RotInflow, m, y, ErrStat2, ErrMsg2) @@ -2267,7 +2428,7 @@ subroutine RotWriteOutputs( t, u, RotInflow, p, p_AD, x, xd, z, OtherState, y, m end subroutine RotWriteOutputs !---------------------------------------------------------------------------------------------------------------------------------- -subroutine AD_CavtCrit(u, p, m, errStat, errMsg) +subroutine RotCavtCrit(u, p, m, errStat, errMsg) TYPE(AD_InputType), INTENT(IN ) :: u !< Inputs at time t TYPE(AD_ParameterType), INTENT(IN ) :: p !< Parameters TYPE(AD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables @@ -2284,6 +2445,9 @@ subroutine AD_CavtCrit(u, p, m, errStat, errMsg) errStat = ErrID_None errMsg = '' + ! Skip the cavitation check if no wake mod + if ( p%Wake_Mod == WakeMod_none ) return + do iR = 1,size(p%rotors) if ( p%rotors(iR)%CavitCheck ) then ! Calculate the cavitation number for the airfoil at the node in quesiton, and compare to the critical cavitation number based on the vapour pressure and submerged depth do j = 1,p%rotors(iR)%numBlades ! Loop through all blades @@ -2316,10 +2480,10 @@ subroutine AD_CavtCrit(u, p, m, errStat, errMsg) end do ! p%numBlades end if ! Cavitation check end do ! p%numRotors -end subroutine AD_CavtCrit +end subroutine RotCavtCrit !---------------------------------------------------------------------------------------------------------------------------------- !> This routine calculates buoyant loads on an MHK turbine. -subroutine CalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) +subroutine RotCalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) TYPE(RotInputType), INTENT(IN ) :: u !< AD inputs - used for mesh node positions TYPE(RotParameterType), INTENT(IN ) :: p !< Parameters TYPE(RotMiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables @@ -2389,7 +2553,7 @@ subroutine CalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) REAL(ReKi), DIMENSION(3,p%NumBlades) :: MovmomentBR !< Moment from moving blade root buoyant force from blade root to hub center REAL(ReKi), DIMENSION(3) :: MovvectorTT !< Vector from nacelle reference position to center of buoyancy of tower top REAL(ReKi), DIMENSION(3) :: MovmomentTT !< Moment from moving tower top buoyant force from tower top to nacelle reference position - CHARACTER(*), PARAMETER :: RoutineName = 'CalcBuoyantLoads' + CHARACTER(*), PARAMETER :: RoutineName = 'RotCalcBuoyantLoads' ! Initialize variables for this routine @@ -2413,7 +2577,7 @@ subroutine CalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) ! Check that blade nodes do not go beneath the seabed or pierce the free surface if ( u%BladeMotion(k)%Position(3,j) + u%BladeMotion(k)%TranslationDisp(3,j) >= p%MSL2SWL .OR. u%BladeMotion(k)%Position(3,j) + u%BladeMotion(k)%TranslationDisp(3,j) <= -p%WtrDpth ) & - call SetErrStat( ErrID_Fatal, 'Blades cannot go beneath the seabed or pierce the free surface', ErrStat, ErrMsg, 'CalcBuoyantLoads' ) + call SetErrStat( ErrID_Fatal, 'Blades cannot go beneath the seabed or pierce the free surface', ErrStat, ErrMsg, 'RotCalcBuoyantLoads' ) if ( ErrStat >= AbortErrLev ) return end do ! j = nodes @@ -2526,17 +2690,30 @@ subroutine CalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) ! Tower if ( p%NumTwrNds > 0 ) then - do j = 1,p%NumTwrNds ! loop through all nodes - ! Check that tower nodes do not go beneath the seabed or pierce the free surface - if ( u%TowerMotion%Position(3,j) + u%TowerMotion%TranslationDisp(3,j) >= p%MSL2SWL .OR. u%TowerMotion%Position(3,j) + u%TowerMotion%TranslationDisp(3,j) < -p%WtrDpth ) & - call SetErrStat( ErrID_Fatal, 'The tower cannot go beneath the seabed or pierce the free surface', ErrStat, ErrMsg, 'CalcBuoyantLoads' ) + ! loop through all nodes + do j = 1, p%NumTwrNds + + ! Skip check for first node if this is a fixed bottom tower + if (j == 1 .and. p%MHK == MHK_FixedBottom) cycle + + ! Check that tower nodes do not go beneath the seabed or pierce the free surface + if ( u%TowerMotion%Position(3,j) + u%TowerMotion%TranslationDisp(3,j) >= p%MSL2SWL .OR. & + u%TowerMotion%Position(3,j) + u%TowerMotion%TranslationDisp(3,j) < -p%WtrDpth ) then + call SetErrStat( ErrID_Fatal, 'The tower cannot go beneath the seabed or pierce the free surface', ErrStat, ErrMsg, 'RotCalcBuoyantLoads' ) if ( ErrStat >= AbortErrLev ) return + end if end do do j = 1,p%NumTwrNds - 1 ! loop through all nodes, except the last ! Global position of tower node TwrtmpPos = u%TowerMotion%Position(:,j) + u%TowerMotion%TranslationDisp(:,j) - (/ 0.0_ReKi, 0.0_ReKi, p%MSL2SWL /) TwrtmpPosplus = u%TowerMotion%Position(:,j+1) + u%TowerMotion%TranslationDisp(:,j+1) - (/ 0.0_ReKi, 0.0_ReKi, p%MSL2SWL /) + + ! If base node on fixed bottom tower is below the water depth (during Jacobian perturbations), + ! clamp it to the water depth + if ((j == 1) .and. (p%MHK == MHK_FixedBottom) .and. (TwrtmpPos(3) < -p%WtrDpth)) then + TwrtmpPos(3) = -p%WtrDpth + end if ! Heading and inclination angles of tower element TwrheadAng = atan2( TwrtmpPosplus(2) - TwrtmpPos(2), TwrtmpPosplus(1) - TwrtmpPos(1) ) @@ -2619,7 +2796,7 @@ subroutine CalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) else ! Check that hub node does not go beneath the seabed or pierce the free surface if ( u%HubMotion%Position(3,1) + u%HubMotion%TranslationDisp(3,1) >= p%MSL2SWL .OR. u%HubMotion%Position(3,1) + u%HubMotion%TranslationDisp(3,1) <= -p%WtrDpth ) & - call SetErrStat( ErrID_Fatal, 'The hub cannot go beneath the seabed or pierce the free surface', ErrStat, ErrMsg, 'CalcBuoyantLoads' ) + call SetErrStat( ErrID_Fatal, 'The hub cannot go beneath the seabed or pierce the free surface', ErrStat, ErrMsg, 'RotCalcBuoyantLoads' ) if ( ErrStat >= AbortErrLev ) return ! Global position of hub node @@ -2673,7 +2850,7 @@ subroutine CalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) else ! Check that nacelle node does not go beneath the seabed or pierce the free surface if ( u%NacelleMotion%Position(3,1) + u%NacelleMotion%TranslationDisp(3,1) >= p%MSL2SWL .OR. u%NacelleMotion%Position(3,1) + u%NacelleMotion%TranslationDisp(3,1) <= -p%WtrDpth ) & - call SetErrStat( ErrID_Fatal, 'The nacelle cannot go beneath the seabed or pierce the free surface', ErrStat, ErrMsg, 'CalcBuoyantLoads' ) + call SetErrStat( ErrID_Fatal, 'The nacelle cannot go beneath the seabed or pierce the free surface', ErrStat, ErrMsg, 'RotCalcBuoyantLoads' ) if ( ErrStat >= AbortErrLev ) return ! Global position of nacelle node @@ -2717,7 +2894,122 @@ subroutine CalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) m%NacMi = y%NacelleLoad%Moment(:,1) -end subroutine CalcBuoyantLoads +end subroutine RotCalcBuoyantLoads +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine calculates added mass and fluid inertia loads on an MHK turbine. +subroutine RotCalcAddedMassInertiaLoads( u, p, m, y, RotInflow, ErrStat, ErrMsg ) + TYPE(RotInputType), INTENT(IN ) :: u !< AD inputs - used for mesh node positions + TYPE(RotParameterType), INTENT(IN ) :: p !< Parameters + TYPE(RotMiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + TYPE(RotOutputType), INTENT(INOUT) :: y !< Outputs computed at t + TYPE(RotInflowType), INTENT(IN ) :: RotInflow !< Rotor inflow + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + + ! Local variables + INTEGER(IntKi) :: k !< Loop counter for blades + INTEGER(IntKi) :: j !< Loop counter for nodes + REAL(ReKi), DIMENSION(3) :: aFBTemp !< Inflow acceleration at blade node in local coordinates + REAL(ReKi), DIMENSION(3) :: aBBTemp !< Body translational acceleration at blade node in local coordinates + REAL(ReKi), DIMENSION(3) :: alphaBBTemp !< Body rotational acceleration at blade node in local coordinates + REAL(ReKi), DIMENSION(3) :: BlFItmp !< Inertia force at blade node in local coordinates + REAL(ReKi), DIMENSION(3) :: BlFAtmp !< Added mass force at blade node in local coordinates + REAL(ReKi), DIMENSION(3) :: BlMAtmp !< Added mass moment at blade node in local coordinates + REAL(ReKi), DIMENSION(3) :: aFTTemp !< Inflow acceleration at tower node in local coordinates + REAL(ReKi), DIMENSION(3) :: aBTTemp !< Body translational acceleration at tower node in local coordinates + REAL(ReKi), DIMENSION(3) :: TwrFItmp !< Inertia force at tower node in local coordinates + REAL(ReKi), DIMENSION(3) :: TwrFAtmp !< Added mass force at tower node in local coordinates + CHARACTER(*), PARAMETER :: RoutineName = 'RotCalcAddedMassInertiaLoads' + + + ! Initialize variables for this routine + ErrStat = ErrID_None + ErrMsg = "" + aFBTemp = 0.0_ReKi + aBBTemp = 0.0_ReKi + alphaBBTemp = 0.0_ReKi + BlFItmp = 0.0_ReKi + BlFAtmp = 0.0_ReKi + BlMAtmp = 0.0_ReKi + aFTTemp = 0.0_ReKi + aBTTemp = 0.0_ReKi + TwrFItmp = 0.0_ReKi + TwrFAtmp = 0.0_ReKi + + ! Blades + do k = 1,p%NumBlades ! loop through all blades + do j = 1,p%NumBlNds ! loop through all nodes + + ! Convert fluid acceleration at node to local blade coordinates + aFBTemp = matmul( u%BladeMotion(k)%Orientation(:,:,j), RotInflow%Blade(k)%InflowAcc(:,j) ) + + ! Calculate per-unit-length inertia forces at node + BlFItmp(1) = p%BlIN(j,k) * aFBTemp(1) + BlFItmp(2) = p%BlIT(j,k) * aFBTemp(2) + + ! Convert inertia forces to global coordinates + m%BlFI(:,j,k) = matmul( transpose(u%BladeMotion(k)%Orientation(:,:,j)), BlFItmp ) + + ! Convert body acceleration at node to local blade coordinates + aBBTemp = matmul( u%BladeMotion(k)%Orientation(:,:,j), u%BladeMotion(k)%TranslationAcc(:,j) ) + alphaBBTemp(3) = u%BladeMotion(k)%Orientation(3,1,j)*u%BladeMotion(k)%RotationAcc(1,j) + u%BladeMotion(k)%Orientation(3,2,j)*u%BladeMotion(k)%RotationAcc(2,j) + u%BladeMotion(k)%Orientation(3,3,j)*u%BladeMotion(k)%RotationAcc(3,j) + + ! Calculate per-unit-length added mass forces at node + BlFAtmp(1) = p%BlAN(j,k) * aBBTemp(1) + BlFAtmp(2) = p%BlAT(j,k) * aBBTemp(2) + + ! Calculate per-unit-length added mass pitching moment at node + BlMAtmp(3) = p%BlAM(j,k) * alphaBBTemp(3) + + ! Convert added mass forces and moments to global coordinates + m%BlFA(:,j,k) = matmul( transpose(u%BladeMotion(k)%Orientation(:,:,j)), BlFAtmp ) + m%BlMA(:,j,k) = matmul( transpose(u%BladeMotion(k)%Orientation(:,:,j)), BlMAtmp ) + + end do + end do + + ! Add added mass and inertia loads to aerodynamic loads + do k = 1,p%NumBlades ! loop through all blades + do j = 1,p%NumBlNds ! loop through all nodes + y%BladeLoad(k)%Force(:,j) = y%BladeLoad(k)%Force(:,j) + m%BlFI(:,j,k) + m%BlFA(:,j,k) + y%BladeLoad(k)%Moment(:,j) = y%BladeLoad(k)%Moment(:,j) + m%BlMA(:,j,k) + end do ! j = nodes + end do ! k = blades + + ! Tower + if ( p%NumTwrNds > 0 ) then + do j = 1,p%NumTwrNds ! loop through all nodes + + ! Convert fluid acceleration at node to local tower coordinates + aFTTemp = matmul( u%TowerMotion%Orientation(:,:,j), RotInflow%Tower%InflowAcc(:,j) ) + + ! Calculate per-unit-length inertia forces at node + TwrFItmp(1) = p%TwrIT(j) * aFTTemp(1) + TwrFItmp(2) = p%TwrIT(j) * aFTTemp(2) + + ! Convert inertia forces to global coordinates + m%TwrFI(:,j) = matmul( transpose(u%TowerMotion%Orientation(:,:,j)), TwrFItmp ) + + ! Convert body acceleration at node to local tower coordinates + aBTTemp = matmul( u%TowerMotion%Orientation(:,:,j), u%TowerMotion%TranslationAcc(:,j) ) + + ! Calculate per-unit-length added mass forces at node + TwrFAtmp(1) = p%TwrAT(j) * aBTTemp(1) + TwrFAtmp(2) = p%TwrAT(j) * aBTTemp(2) + + ! Convert added mass forces to global coordinates + m%TwrFA(:,j) = matmul( transpose(u%TowerMotion%Orientation(:,:,j)), TwrFAtmp ) + + end do + end if + + ! Add buoyant loads to aerodynamic loads + do j = 1,p%NumTwrNds ! loop through all nodes + y%TowerLoad%Force(:,j) = y%TowerLoad%Force(:,j) + m%TwrFI(:,j) + m%TwrFA(:,j) + end do ! j = nodes + +end subroutine RotCalcAddedMassInertiaLoads !---------------------------------------------------------------------------------------------------------------------------------- !> Tight coupling routine for solving for the residual of the constraint state equations subroutine AD_CalcConstrStateResidual( Time, u, p, x, xd, z, OtherState, m, z_residual, ErrStat, ErrMsg ) @@ -3884,7 +4176,6 @@ subroutine SetOutputsFromFVW(t, u, p, OtherState, x, xd, m, y, ErrStat, ErrMsg) real(ReKi) :: Cx, Cy real(ReKi) :: Cl_Static, Cd_Static, Cm_Static, Cpmin real(ReKi) :: Cl_dyn, Cd_dyn, Cm_dyn - type(UA_InputType), pointer :: u_UA ! Alias to shorten notations integer(IntKi), parameter :: InputIndex=1 ! we will always use values at t in this routine integer(intKi) :: iR, iW integer(intKi) :: ErrStat2 @@ -3924,21 +4215,22 @@ subroutine SetOutputsFromFVW(t, u, p, OtherState, x, xd, m, y, ErrStat, ErrMsg) Cm_dyn = AFI_interp%Cm if (p%UA_Flag) then - u_UA => m%FVW%W(iW)%u_UA(j,InputIndex) ! Alias - ! ....... compute inputs to UA ........... - u_UA%alpha = alpha - u_UA%U = Vrel - u_UA%Re = Re - ! calculated in m%FVW%u_UA??? :u_UA%UserProp = 0.0_ReKi ! FIX ME - - u_UA%v_ac(1) = sin(u_UA%alpha)*u_UA%U - u_UA%v_ac(2) = cos(u_UA%alpha)*u_UA%U - ! calculated in m%FVW%u_UA??? : u_UA%omega = dot_product( u%rotors(iR)%BladeMotion(k)%RotationVel( :,j), m%rotors(iR)%orientationAnnulus(3,:,j,k) ) ! rotation of no-sweep-pitch coordinate system around z of the jth node in the kth blade - call UA_CalcOutput(j, 1, t, u_UA, m%FVW%W(iW)%p_UA, x%FVW%UA(iW), xd%FVW%UA(iW), OtherState%FVW%UA(iW), p%AFI(p%FVW%W(iW)%AFindx(j,1)), m%FVW%W(iW)%y_UA, m%FVW%W(iW)%m_UA, errStat2, errMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SetOutputsFromFVW') - Cl_dyn = m%FVW%W(iW)%y_UA%Cl - Cd_dyn = m%FVW%W(iW)%y_UA%Cd - Cm_dyn = m%FVW%W(iW)%y_UA%Cm + associate(u_UA => m%FVW%W(iW)%u_UA(j,InputIndex)) + ! ....... compute inputs to UA ........... + u_UA%alpha = alpha + u_UA%U = Vrel + u_UA%Re = Re + ! calculated in m%FVW%u_UA??? :u_UA%UserProp = 0.0_ReKi ! FIX ME + + u_UA%v_ac(1) = sin(u_UA%alpha)*u_UA%U + u_UA%v_ac(2) = cos(u_UA%alpha)*u_UA%U + ! calculated in m%FVW%u_UA??? : u_UA%omega = dot_product( u%rotors(iR)%BladeMotion(k)%RotationVel( :,j), m%rotors(iR)%orientationAnnulus(3,:,j,k) ) ! rotation of no-sweep-pitch coordinate system around z of the jth node in the kth blade + call UA_CalcOutput(j, 1, t, u_UA, m%FVW%W(iW)%p_UA, x%FVW%UA(iW), xd%FVW%UA(iW), OtherState%FVW%UA(iW), p%AFI(p%FVW%W(iW)%AFindx(j,1)), m%FVW%W(iW)%y_UA, m%FVW%W(iW)%m_UA, errStat2, errMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SetOutputsFromFVW') + Cl_dyn = m%FVW%W(iW)%y_UA%Cl + Cd_dyn = m%FVW%W(iW)%y_UA%Cd + Cm_dyn = m%FVW%W(iW)%y_UA%Cm + end associate end if cp = cos(phi) sp = sin(phi) @@ -3961,8 +4253,13 @@ subroutine SetOutputsFromFVW(t, u, p, OtherState, x, xd, m, y, ErrStat, ErrMsg) ! note: because force and moment are 1-d arrays, I'm calculating the transpose of the force and moment outputs ! so that I don't have to take the transpose of orientationAnnulus(:,:,j,k) - y%rotors(iR)%BladeLoad(k)%Force(:,j) = matmul( force, m%rotors(iR)%orientationAnnulus(:,:,j,k) ) ! force per unit length of the jth node in the kth blade - y%rotors(iR)%BladeLoad(k)%Moment(:,j) = matmul( moment, m%rotors(iR)%orientationAnnulus(:,:,j,k) ) ! moment per unit length of the jth node in the kth blade + if ( p%rotors(iR)%MHK == MHK_None ) then + y%rotors(iR)%BladeLoad(k)%Force(:,j) = matmul( force, m%rotors(iR)%orientationAnnulus(:,:,j,k) ) ! force per unit length of the jth node in the kth blade + y%rotors(iR)%BladeLoad(k)%Moment(:,j) = matmul( moment, m%rotors(iR)%orientationAnnulus(:,:,j,k) ) ! moment per unit length of the jth node in the kth blade + else + y%rotors(iR)%BladeLoad(k)%Force(:,j) = matmul( force, m%rotors(iR)%orientationAnnulus(:,:,j,k) ) + m%rotors(iR)%BladeBuoyLoad(k)%Force(:,j) + m%rotors(iR)%BlFI(:,j,k) + m%rotors(iR)%BlFA(:,j,k) ! force per unit length of the jth node in the kth blade + y%rotors(iR)%BladeLoad(k)%Moment(:,j) = matmul( moment, m%rotors(iR)%orientationAnnulus(:,:,j,k) ) + m%rotors(iR)%BladeBuoyLoad(k)%Moment(:,j) + m%rotors(iR)%BlMA(:,j,k) ! moment per unit length of the jth node in the kth blade + end if ! Save results for outputs so we don't have to recalculate them all when we write outputs m%FVW%W(iW)%BN_AxInd(j) = AxInd @@ -4019,6 +4316,8 @@ SUBROUTINE ValidateInputData( InitInp, InputFileData, NumBl, calcCrvAngle, ErrSt ! local variables + real(ReKi) :: BlCbSum + real(ReKi) :: TwrCbSum integer(IntKi) :: k ! Blade number integer(IntKi) :: j ! node number integer(IntKi) :: iR ! rotor index @@ -4081,7 +4380,6 @@ SUBROUTINE ValidateInputData( InitInp, InputFileData, NumBl, calcCrvAngle, ErrSt if (Failed()) return if (InitInp%MHK == MHK_None .and. InputFileData%CavitCheck) call SetErrStat ( ErrID_Fatal, 'A cavitation check can only be performed for an MHK turbine.', ErrStat, ErrMsg, RoutineName ) - if (InitInp%MHK == MHK_None .and. InputFileData%Buoyancy) call SetErrStat ( ErrID_Fatal, 'Buoyancy can only be calculated for an MHK turbine.', ErrStat, ErrMsg, RoutineName ) if (InitInp%MHK /= MHK_None .and. InputFileData%CompAA ) call SetErrStat ( ErrID_Fatal, 'The aeroacoustics module cannot be used with an MHK turbine.', ErrStat, ErrMsg, RoutineName ) do iR = 1,size(NumBl) if (InitInp%MHK /= MHK_None .and. InputFileData%rotors(iR)%TFinAero) call SetErrStat ( ErrID_Fatal, 'A tail fin cannot be modeled for an MHK turbine.', ErrStat, ErrMsg, RoutineName ) @@ -4181,15 +4479,36 @@ SUBROUTINE ValidateInputData( InitInp, InputFileData, NumBl, calcCrvAngle, ErrSt end do ! j=nodes end do ! k=blades - ! If the Buoyancy flag is True, check that the blade buoyancy coefficients are >= 0. - if ( InputFileData%Buoyancy ) then + ! If the MHK flag is set to 1 or 2, check that the blade buoyancy and added mass coefficients are >= 0. + if ( InitInp%MHK /= MHK_None ) then do k=1,NumBl(iR) + BlCbSum = 0.0_ReKi do j=1,InputFileData%rotors(iR)%BladeProps(k)%NumBlNds if ( InputFileData%rotors(iR)%BladeProps(k)%BlCb(j) < 0.0_ReKi ) then call SetErrStat( ErrID_Fatal, 'The buoyancy coefficient for blade '//trim(Num2LStr(k))//' node '//trim(Num2LStr(j)) & //' must be greater than or equal to 0.', ErrStat, ErrMsg, RoutineName ) endif + if ( InputFileData%rotors(iR)%BladeProps(k)%t_c(j) < 0.0_ReKi ) then + call SetErrStat( ErrID_Fatal, 'The thickness to chord ratio for blade '//trim(Num2LStr(k))//' node '//trim(Num2LStr(j)) & + //' must be greater than or equal to 0.', ErrStat, ErrMsg, RoutineName ) + endif + if ( InputFileData%rotors(iR)%BladeProps(k)%BlCan(j) < 0.0_ReKi ) then + call SetErrStat( ErrID_Fatal, 'The chordwise added mass coefficient for blade '//trim(Num2LStr(k))//' node '//trim(Num2LStr(j)) & + //' must be greater than or equal to 0.', ErrStat, ErrMsg, RoutineName ) + endif + if ( InputFileData%rotors(iR)%BladeProps(k)%BlCat(j) < 0.0_ReKi ) then + call SetErrStat( ErrID_Fatal, 'The edgewise added mass coefficient for blade '//trim(Num2LStr(k))//' node '//trim(Num2LStr(j)) & + //' must be greater than or equal to 0.', ErrStat, ErrMsg, RoutineName ) + endif + if ( InputFileData%rotors(iR)%BladeProps(k)%BlCam(j) < 0.0_ReKi ) then + call SetErrStat( ErrID_Fatal, 'The pitch added mass coefficient for blade '//trim(Num2LStr(k))//' node '//trim(Num2LStr(j)) & + //' must be greater than or equal to 0.', ErrStat, ErrMsg, RoutineName ) + endif + BlCbSum = BlCbSum + InputFileData%rotors(iR)%BladeProps(k)%BlCb(j) end do ! j=nodes + if ( BlCbSum <= 0.0_ReKi .and. InputFileData%rotors(iR)%VolHub > 0.0_ReKi .or. InputFileData%rotors(iR)%VolHub <= 0.0_ReKi .and. BlCbSum > 0.0_ReKi ) then + call SetErrStat( ErrID_Fatal, 'If blade buoyancy is calculated, hub buoyancy must be calculated, and vice versa.', ErrStat, ErrMsg, RoutineName ) + endif end do ! k=blades end if end do ! iR rotor @@ -4198,7 +4517,7 @@ SUBROUTINE ValidateInputData( InitInp, InputFileData, NumBl, calcCrvAngle, ErrSt ! ............................. ! check tower mesh data: ! ............................. - if (InputFileData%TwrPotent /= TwrPotent_none .or. InputFileData%TwrShadow /= TwrShadow_none .or. InputFileData%TwrAero /= TwrAero_none .or. InputFileData%Buoyancy) then + if (InputFileData%TwrPotent /= TwrPotent_none .or. InputFileData%TwrShadow /= TwrShadow_none .or. InputFileData%TwrAero /= TwrAero_none .or. InitInp%MHK > 0) then do iR = 1,size(NumBl) if (InputFileData%rotors(iR)%NumTwrNds <= 0) cycle !bjj: this could be removed since the loops here already take into account the number of tower nodes @@ -4229,13 +4548,22 @@ SUBROUTINE ValidateInputData( InitInp, InputFileData, NumBl, calcCrvAngle, ErrSt end do ! j=nodes end if - ! If the Buoyancy flag is True, check that the tower buoyancy coefficients are >= 0. - if ( InputFileData%Buoyancy .and. InputFileData%rotors(iR)%NumTwrNds > 0 ) then + ! If the MHK flag is set to 1 or 2, check that the tower buoyancy and added mass coefficients are >= 0. + if ( InitInp%MHK /= MHK_None .and. InputFileData%rotors(iR)%NumTwrNds > 0 ) then + TwrCbSum = 0.0_ReKi do j=1,InputFileData%rotors(iR)%NumTwrNds if ( InputFileData%rotors(iR)%TwrCb(j) < 0.0_ReKi ) then call SetErrStat( ErrID_Fatal, 'The buoyancy coefficient for tower node '//trim(Num2LStr(j))//' must be greater than or equal to 0.', ErrStat, ErrMsg, RoutineName ) endif + + if ( InputFileData%rotors(iR)%TwrCa(j) < 0.0_ReKi ) then + call SetErrStat( ErrID_Fatal, 'The added mass coefficient for tower node '//trim(Num2LStr(j))//' must be greater than or equal to 0.', ErrStat, ErrMsg, RoutineName ) + endif + TwrCbSum = TwrCbSum + InputFileData%rotors(iR)%TwrCb(j) end do ! j=nodes + if ( TwrCbSum <= 0.0_ReKi .and. InputFileData%rotors(iR)%VolNac > 0.0_ReKi .or. InputFileData%rotors(iR)%VolNac <= 0.0_ReKi .and. TwrCbSum > 0.0_ReKi ) then + call SetErrStat( ErrID_Fatal, 'If tower buoyancy is calculated, nacelle buoyancy must be calculated, and vice versa.', ErrStat, ErrMsg, RoutineName ) + endif end if end do ! iR rotor end if ! using the tower @@ -4247,7 +4575,7 @@ SUBROUTINE ValidateInputData( InitInp, InputFileData, NumBl, calcCrvAngle, ErrSt ! ............................. ! check hub mesh data: ! ............................. - if ( InputFileData%Buoyancy ) then + if ( InitInp%MHK /= MHK_None ) then ! Check that the hub volume is >= 0. do iR = 1,size(NumBl) @@ -4261,7 +4589,7 @@ SUBROUTINE ValidateInputData( InitInp, InputFileData, NumBl, calcCrvAngle, ErrSt ! ............................. ! check nacelle mesh data: ! ............................. - if ( InputFileData%Buoyancy ) then + if ( InitInp%MHK /= MHK_None ) then ! Check that the nacelle volume is >= 0. do iR = 1,size(NumBl) @@ -4825,11 +5153,25 @@ SUBROUTINE Init_OLAF( InputFileData, u_AD, u, p, x, xd, z, OtherState, m, ErrSta allocate(InitInp%W(nWings) , STAT = ErrStat2); ErrMsg2='Allocate W'; if(Failed()) return allocate(InitInp%WingsMesh(nWings), STAT = ErrStat2); ErrMsg2='Allocate Wings Mesh'; if(Failed()) return + ! --- Default inputs (not per retor) + ! UA and inputs that are not per rotor + InitInp%UA_Flag = p%UA_Flag + ! Important inputs if no rotors are present! + if (size(p%rotors)==0) then + InitInp%numBladeNodes = 0 + InitInp%AirDens = InputFileData%AirDens + InitInp%KinVisc = InputFileData%KinVisc + InitInp%MHK = 0 ! TODO this is an initinp of AeroDyn + InitInp%WtrDpth = 0.0_ReKi ! TODO this is an initinp of AeroDyn + InitInp%RootName = p%RootName(1:len_trim(p%RootName)-2) ! Removing "AD" + endif + ! --- Inputs per wings/blades iW_incr=0 do iR=1, size(p%rotors) InitInp%numBladeNodes = p%rotors(iR)%numBlNds ! TODO TODO TODO per wing + InitInp%AirDens = p%rotors(iR)%AirDens InitInp%KinVisc = p%rotors(iR)%KinVisc InitInp%MHK = p%rotors(iR)%MHK InitInp%WtrDpth = p%rotors(iR)%WtrDpth @@ -4892,9 +5234,6 @@ SUBROUTINE Init_OLAF( InputFileData, u_AD, u, p, x, xd, z, OtherState, m, ErrSta if(Failed()) return enddo ! iB, blades - - ! Unsteady Aero Data - InitInp%UA_Flag = p%UA_Flag call UA_CopyInitInput(InputFileData%UA_Init, InitInp%UA_Init, MESH_NEWCOPY, ErrStat2, ErrMsg2) iW_incr = iW_incr+p%rotors(iR)%numBlades @@ -5674,278 +6013,560 @@ SUBROUTINE TwrInfl_NearestPoint(p, u, RotInflow, BladeNodePosition, r_TowerBlade END SUBROUTINE TwrInfl_NearestPoint !---------------------------------------------------------------------------------------------------------------------------------- -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! ###### The following four routines are Jacobian routines for linearization capabilities ####### -! If the module does not implement them, set ErrStat = ErrID_Fatal in AD_Init() when InitInp%Linearize is .true. -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions -!! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and dZ/du are returned. -SUBROUTINE AD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(AD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(AD_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(AD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(AD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(AD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(AD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(AD_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); - TYPE(AD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with - integer(IntKi), parameter :: iR =1 ! Rotor index - integer(intKi) :: StartNode +subroutine AD_InitVars(iR, u, p, x, z, OtherState, y, m, InitOut, InputFileData, Linearize, CompAeroMaps, ErrStat, ErrMsg) + integer(IntKi), intent(in) :: iR !< Rotor number + type(RotInputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(RotParameterType), intent(inout) :: p !< Parameters + type(RotContinuousStateType), intent(inout) :: x !< States + type(RotConstraintStateType), intent(inout) :: z !< Constraint state type + type(RotOtherStateType), intent(inout) :: OtherState !< Other state type + type(RotOutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(RotMiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(RotInitOutputType), intent(inout) :: InitOut !< Output for initialization routine + type(RotInputFile), intent(in) :: InputFileData !< Input file data + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + logical, intent(in) :: CompAeroMaps !< Flag to compute aero maps + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'Init_ModuleVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(4) :: RotorLabel + character(64) :: NodeLabel + character(1), parameter :: UVW(3) = ['U','V','W'] + real(R8Ki) :: Perturb, PerturbTower, PerturbBlade(MaxBl) + integer(IntKi) :: i, j, n, state, Flags + logical :: LinearizeLoc - StartNode = 1 ! ignored during linearization since cannot linearize with ExtInflow - if (size(p%rotors)>1) then - errStat = ErrID_Fatal - errMsg = 'Linearization with more than one rotor not supported' + ErrStat = ErrID_None + ErrMsg = "" + + ! Combine linearization flags + LinearizeLoc = Linearize .or. CompAeroMaps .or. (p%MHK /= MHK_None) + + ! Create rotor label + RotorLabel = 'R'//trim(Num2LStr(iR)) + + !---------------------------------------------------------------------------- + ! Perturbation values + !---------------------------------------------------------------------------- + + Perturb = 2.0_R8Ki * D2R_D + + do i = 1, p%NumBlades + PerturbBlade(i) = 0.2_R8Ki * D2R_D * InputFileData%BladeProps(i)%BlSpn(InputFileData%BladeProps(i)%NumBlNds) + end do + + if (u%TowerMotion%NNodes > 0) then + PerturbTower = 0.2_R8Ki * D2R_D * u%TowerMotion%Position(3, u%TowerMotion%NNodes) + else + PerturbTower = 0.0_R8Ki + end if + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + allocate(InitOut%Vars%x(0)) + + ! DBEMT + if (p%BEMT%DBEMT%lin_nx/2 > 0) then + do j = 1, p%NumBlades + do i = 1, p%NumBlNds + call MV_AddVar(InitOut%Vars%x, "DBEMT%Element%vind", FieldScalar, & + DatLoc(AD_x_BEMT_DBEMT_element_vind, i, j), & + Num=2, & + Flags=ior(VF_DerivOrder2, VF_RotFrame), & + Perturb=Perturb, & + LinNames=[DBEMTLinName(j, i, "axial", .false.), & + DBEMTLinName(j, i, "tangential", .false.)]) + end do + end do + do j = 1, p%NumBlades + do i = 1, p%NumBlNds + call MV_AddVar(InitOut%Vars%x, "DBEMT%Element%vind_1", FieldScalar, & + DatLoc(AD_x_BEMT_DBEMT_element_vind_1, i, j), & + Num=2, & + Flags=ior(VF_DerivOrder2, VF_RotFrame), & + Perturb=Perturb, & + LinNames=[DBEMTLinName(j, i, "axial", .true.), & + DBEMTLinName(j, i, "tangential", .true.)]) + end do + end do + end if + + ! Unsteady Aero + do n = 1, p%BEMT%UA%lin_nx + + i = p%BEMT%UA%lin_xIndx(n,1) + j = p%BEMT%UA%lin_xIndx(n,2) + state = p%BEMT%UA%lin_xIndx(n,3) + + select case (state) + case (1, 2) ! x1 and x2 are radians + NodeLabel = 'x'//trim(Num2Lstr(state))//' blade '//trim(Num2Lstr(j))//', node '//trim(Num2Lstr(i))//', rad' + case (3, 4, 5) ! x3, x4 (and x5) are units of cl or cn + NodeLabel = 'x'//trim(Num2Lstr(state))//' blade '//trim(Num2Lstr(j))//', node '//trim(Num2Lstr(i))//', -' + end select + + call MV_AddVar(InitOut%Vars%x, NodeLabel, FieldScalar, & + DatLoc(AD_x_BEMT_UA_element_x, i, j), iAry=state, & + Flags=ior(VF_DerivOrder1, VF_RotFrame), & + Perturb=p%BEMT%UA%dx(state), & + LinNames=[NodeLabel]) + end do + + ! BEMT states + if (p%BEMT%lin_nx>0) then + call SetErrStat(ErrID_Fatal, 'Number of lin states for bem should be zero', ErrStat, ErrMsg, RoutineName) return - endif + end if + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + ! Add Nacelle motion + call MV_AddMeshVar(InitOut%Vars%u, "Nacelle", [FieldTransDisp, FieldOrientation], & + DatLoc(AD_u_NacelleMotion), & + Mesh=u%NacelleMotion, & + Perturbs=[PerturbBlade(1), Perturb]) + + ! Add hub motion + call MV_AddMeshVar(InitOut%Vars%u, "Hub", [FieldTransDisp, FieldOrientation, FieldAngularVel], & + DatLoc(AD_u_HubMotion), & + Mesh=u%HubMotion, & + Perturbs=[PerturbBlade(1), Perturb, Perturb]) + + ! Add tail fin motion + call MV_AddMeshVar(InitOut%Vars%u, "TFin", [FieldTransDisp, FieldOrientation, FieldTransVel], & + DatLoc(AD_u_TFinMotion), & + Mesh=u%TFinMotion, & + Perturbs=[Perturb, Perturb, Perturb]) + + ! Add tower motion + call MV_AddMeshVar(InitOut%Vars%u, "Tower", [FieldTransDisp, FieldOrientation, FieldTransVel, FieldTransAcc], & + DatLoc(AD_u_TowerMotion), & + Mesh=u%TowerMotion, & + Perturbs=[PerturbTower, Perturb, PerturbTower, PerturbTower]) + + ! Add blade root motion + do j = 1, p%NumBlades + call MV_AddMeshVar(InitOut%Vars%u, "Blade root "//Num2LStr(j), [FieldOrientation], & + DatLoc(AD_u_BladeRootMotion, j), & + Mesh=u%BladeRootMotion(j), & + Perturbs=[Perturb]) + end do + + ! Add blade motion + do j = 1, p%NumBlades + Flags = VF_None + if (j == 1) Flags = VF_AeroMap + call MV_AddMeshVar(InitOut%Vars%u, "Blade "//Num2LStr(j), [FieldTransDisp, FieldOrientation, FieldTransVel], & + DatLoc(AD_u_BladeMotion, j), & + Flags=Flags, & + Mesh=u%BladeMotion(j), & + Perturbs=[PerturbBlade(j), Perturb, PerturbBlade(j)]) + call MV_AddMeshVar(InitOut%Vars%u, "Blade "//Num2LStr(j), [FieldAngularVel, FieldTransAcc, FieldAngularAcc], & + DatLoc(AD_u_BladeMotion, j), & + Mesh=u%BladeMotion(j), & + Perturbs=[Perturb, PerturbBlade(j), Perturb]) + end do + + ! Add user props + do j = 1, p%NumBlades + call MV_AddVar(InitOut%Vars%u, "UserProp Blade"//IdxStr(j), FieldScalar, DatLoc(AD_u_UserProp), jAry=j, & + Flags=VF_Linearize + VF_RotFrame, & + Num=p%NumBlNds, & + Perturb=Perturb, & + LinNames=[('User property on blade '//trim(Num2LStr(j))//', node '//trim(Num2LStr(i))//', -', i = 1, p%NumBlNds)]) + end do + + ! Extended inputs + call MV_AddVar(InitOut%Vars%u, "HWindSpeed", FieldScalar, DatLoc(AD_u_HWindSpeed), & + Flags=VF_ExtLin + VF_Linearize, & + Perturb=Perturb, & + LinNames=['Extended input: horizontal wind speed (steady/uniform wind), m/s']) + + call MV_AddVar(InitOut%Vars%u, "PLExp", FieldScalar, DatLoc(AD_u_PLexp), & + Flags=VF_ExtLin + VF_Linearize, & + Perturb=Perturb, & + LinNames=['Extended input: vertical power-law shear exponent, -']) + + call MV_AddVar(InitOut%Vars%u, "PropagationDir", FieldScalar, DatLoc(AD_u_PropagationDir), & + Flags=VF_ExtLin + VF_Linearize, & + Perturb=Perturb, & + LinNames=['Extended input: propagation direction, rad']) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + ! Add nacelle load + call MV_AddMeshVar(InitOut%Vars%y, "Nacelle", LoadFields, DatLoc(AD_y_NacelleLoad), & + Mesh=y%NacelleLoad) + + ! Add hub load + call MV_AddMeshVar(InitOut%Vars%y, "Hub", LoadFields, DatLoc(AD_y_HubLoad), & + Mesh=y%HubLoad) + + ! Add tail fin load + call MV_AddMeshVar(InitOut%Vars%y, "TFin", LoadFields, DatLoc(AD_y_TFinLoad), & + Mesh=y%TFinLoad) + + ! Add tower load + call MV_AddMeshVar(InitOut%Vars%y, "Tower", LoadFields, DatLoc(AD_y_TowerLoad), & + Mesh=y%TowerLoad) + + ! Loop through blades, add blade loads + do j = 1, p%NumBlades + Flags = VF_Line + if (j == 1) Flags = ior(Flags, VF_AeroMap) + call MV_AddMeshVar(InitOut%Vars%y, "Blade "//Num2LStr(j), LoadFields, DatLoc(AD_y_BladeLoad, j), & + Flags=Flags, & + Mesh=y%BladeLoad(j)) + end do + + ! Rotor outputs + do j = 1, p%NumOuts + call MV_AddVar(InitOut%Vars%y, InitOut%WriteOutputHdr(j), FieldScalar, & + DatLoc(AD_y_WriteOutput), iAry=j, & + Flags=VF_WriteOut + OutParamFlags(p%OutParam(j)%Indx), & + LinNames=[trim(InitOut%WriteOutputHdr(j))//', '//trim(InitOut%WriteOutputUnt(j))]) + end do + + ! Blade node outputs + do j = p%NumOuts + 1, p%NumOuts + p%BldNd_TotNumOuts + call MV_AddVar(InitOut%Vars%y, InitOut%WriteOutputHdr(j), FieldScalar, & + DatLoc(AD_y_WriteOutput), iAry=j, & + Flags=VF_WriteOut + VF_RotFrame, & + LinNames=[trim(InitOut%WriteOutputHdr(j))//', '//trim(InitOut%WriteOutputUnt(j))]) + end do + + !---------------------------------------------------------------------------- + ! Initialize Variables and Linearization data + !---------------------------------------------------------------------------- + + call MV_InitVarsJac(InitOut%Vars, m%Jac, LinearizeLoc, ErrStat2, ErrMsg2); if (Failed()) return + + if (LinearizeLoc) then + call AD_CopyRotContinuousStateType(x, m%x_init, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotContinuousStateType(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotContinuousStateType(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotInputType(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotOutputType(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotOtherStateType(OtherState, m%OtherState_init, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotOtherStateType(OtherState, m%OtherState_jac, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotConstraintStateType(z, m%z_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + if (p%DBEMT_Mod == DBEMT_frozen) then + call AllocAry(m%BEMT%AxInd_op, p%NumBlNds, p%numBlades, 'm%BEMT%AxInd_op', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%BEMT%TnInd_op, p%NumBlNds, p%numBlades, 'm%BEMT%TnInd_op', ErrStat2, ErrMsg2); if (Failed()) return + end if + end if - call AD_CalcWind_Rotor( t, u%rotors(iR), p%FLowField, p%rotors(iR), m%Inflow(1)%RotInflow(iR), StartNode, ErrStat, ErrMsg) - call Rot_JacobianPInput( t, u%rotors(iR), m%Inflow(1)%RotInflow(iR), p%rotors(iR), p, x%rotors(iR), xd%rotors(iR), z%rotors(iR), OtherState%rotors(iR), y%rotors(iR), m%rotors(iR), m, iR, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +contains -END SUBROUTINE AD_JacobianPInput + character(LinChanLen) function DBEMTLinName(BladeNum, NodeNum, Direction, Deriv) + integer(IntKi), intent(in) :: BladeNum, NodeNum + character(*), intent(in) :: Direction + logical, intent(in) :: Deriv + DBEMTLinName = 'vind ('//trim(Direction)//') at blade '//trim(Num2LStr(BladeNum))//', node '//trim(Num2LStr(NodeNum))//', m/s' + if (Deriv) DBEMTLinName = 'First time derivative of '//trim(DBEMTLinName)//"/s" + end function + + pure integer(IntKi) function OutParamFlags(ind) + integer(IntKi), intent(in) :: ind + integer(IntKi), parameter :: RotFrameInds(*) = [& + BAzimuth, BPitch, & + BNVUndx, BNVUndy, BNVUndz, BNVDisx, BNVDisy, BNVDisz, BNSTVx, BNSTVy, & + BNSTVz, BNVRel, BNDynP, BNRe, BNM, BNVIndx, BNVIndy, BNAxInd, BNTnInd, & + BNAlpha, BNTheta, BNPhi, BNCurve, BNCl, BNCd, BNCm, BNCx, BNCy, BNCn, & + BNCt, BNFl, BNFd, BNMm, BNFx, BNFy, BNFn, BNFt, BNClrnc] + if (any(RotFrameInds == ind)) then + OutParamFlags = VF_RotFrame + else + OutParamFlags = VF_None + end if + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +! ###### The following four routines are Jacobian routines for linearization capabilities ####### +! If the module does not implement them, set ErrStat = ErrID_Fatal in AD_Init() when InitInp%Linearize is .true. +!---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and dZ/du are returned. -SUBROUTINE Rot_JacobianPInput( t, u, RotInflow, p, p_AD, x, xd, z, OtherState, y, m, m_AD, iRot, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(RotInputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(RotInflowType), INTENT(IN ) :: RotInflow !< Rotor inflow - TYPE(RotParameterType), INTENT(IN ) :: p !< Parameters - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< Parameters - TYPE(RotContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(RotDiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(RotConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(RotOtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(RotOutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); - TYPE(RotMiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - TYPE(AD_MiscVarType), INTENT(INOUT) :: m_AD !< misc variables - INTEGER, INTENT(IN ) :: iRot !< Rotor index, needed for OLAF - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) - ! local variables - TYPE(RotOutputType) :: y_p - TYPE(RotOutputType) :: y_m - TYPE(RotContinuousStateType) :: x_p - TYPE(RotContinuousStateType) :: x_m - TYPE(RotContinuousStateType) :: x_init - TYPE(RotConstraintStateType) :: z_copy - TYPE(RotOtherStateType) :: OtherState_copy - TYPE(RotOtherStateType) :: OtherState_init - TYPE(RotInputType) :: u_perturb - type(FLowFieldType),target :: FlowField_perturb - type(FLowFieldType),pointer :: FlowField_perturb_p ! need a pointer in the CalcWind_Rotor routine - type(RotInflowType) :: RotInflow_perturb !< Rotor inflow, perturbed by FlowField extended inputs - REAL(R8Ki) :: delta_p, delta_m ! delta change in input - INTEGER(IntKi) :: i - - integer, parameter :: indx = 1 ! m%BEMT_u(1) is at t; m%BEMT_u(2) is t+dt - integer(intKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'Rot_JacobianPInput' - +SUBROUTINE AD_JacobianPInput(Vars, iRotor, t, u_AD, p_AD, x_AD, xd_AD, z_AD, OtherState_AD, y_AD, m_AD, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) + use IfW_FlowField, only: FlowFieldType, UniformField_InterpLinear + + type(ModVarsType), INTENT(IN ) :: Vars !< Module vars + INTEGER(IntKi), INTENT(IN ) :: iRotor !< Rotor index + REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point + TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< Inputs at operating point (may change to inout if a mesh copy is required) + TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< Parameters + TYPE(AD_ContinuousStateType), INTENT(IN ) :: x_AD !< Continuous states at operating point + TYPE(AD_DiscreteStateType), INTENT(IN ) :: xd_AD !< Discrete states at operating point + TYPE(AD_ConstraintStateType), INTENT(IN ) :: z_AD !< Constraint states at operating point + TYPE(AD_OtherStateType), INTENT(IN ) :: OtherState_AD !< Other states at operating point + TYPE(AD_OutputType), INTENT(INOUT) :: y_AD !< Output (change to inout if a mesh copy is required); + TYPE(AD_MiscVarType), INTENT(INOUT) :: m_AD !< Misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with + + character(*), parameter :: RoutineName = 'AD_JacobianPInput' + integer, parameter :: indx = 1 ! m%BEMT_u(1) is at t; m%BEMT_u(2) is t+dt + integer(intKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + type(RotOtherStateType) :: OtherState_copy + integer(IntKi) :: i, j, col, StartNode + integer(IntKi) :: iVarHWindSpeed, iVarPLexp, iVarPropagationDir + type(UniformField_Interp) :: UF_op + type(FlowFieldType),target :: FF_perturb + type(FlowFieldType),pointer :: FF_ptr ! need a pointer in the CalcWind_Rotor routine + type(RotInflowType) :: RotInflow_perturb !< Rotor inflow, perturbed by FlowField extended inputs - ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' - ! get OP values here (i.e., set inputs for BEMT): - if ( p%DBEMT_Mod == DBEMT_frozen ) then - call SetInputs(t, p, p_AD, u, RotInflow, m, indx, errStat2, errMsg2); if (Failed()) return - - ! compare m%BEMT_y arguments with call to BEMT_CalcOutput - call computeFrozenWake(m%BEMT_u(indx), p%BEMT, m%BEMT_y, m%BEMT ) + StartNode = 1 ! ignored during linearization since cannot linearize with ExtInflow + + associate(p => p_AD%rotors(iRotor), & + u => u_AD%rotors(iRotor), & + u_perturb => m_AD%u_perturb%rotors(iRotor), & + m => m_AD%rotors(iRotor), & + x => x_AD%rotors(iRotor), & + xd => xd_AD%rotors(iRotor), & + z => z_AD%rotors(iRotor), & + OtherState => OtherState_AD%rotors(iRotor), & + y_lin => m_AD%y_lin%rotors(iRotor), & + RotInflow => m_AD%Inflow(1)%RotInflow(iRotor)) + + ! Find indices for extended input variables + iVarHWindSpeed = 0 + iVarPLexp = 0 + iVarPropagationDir = 0 + do i = 1, size(Vars%u) + select case(Vars%u(i)%DL%Num) + case (AD_u_HWindSpeed) + iVarHWindSpeed = i + case (AD_u_PLexp) + iVarPLexp = i + case (AD_u_PropagationDir) + iVarPropagationDir = i + end select + end do + + call AD_CalcWind_Rotor(t, u, p_AD%FlowField, p, p_AD, m_AD, RotInflow, StartNode, ErrStat, ErrMsg) + if (ErrStat >= AbortErrLev) return + + ! If flow field will need to be perturbed (HWindSpeed, PLexp, or PropagationDir variables) + if (iVarHWindSpeed > 0 .or. iVarPLexp > 0 .or. iVarPropagationDir > 0) then + ! Copy the flow field (Uniform type, which as minimal data) + call IfW_FlowField_CopyFlowFieldType(p_AD%FlowField, FF_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + FF_ptr => FF_perturb + else + ! Otherwise, associate flowfield pointer to flowfield in parameters since it won't be modified + FF_ptr => p_AD%FlowField + end if + + ! Get OP values here (i.e., set inputs for BEMT): + if (p%DBEMT_Mod == DBEMT_frozen) then + call SetInputs(t, p, p_AD, u, RotInflow, m, indx, errStat2, errMsg2); if (Failed()) return + + ! compare m%BEMT_y arguments with call to BEMT_CalcOutput + call computeFrozenWake(m%BEMT_u(indx), p%BEMT, m%BEMT_y, m%BEMT) m%BEMT%UseFrozenWake = .true. end if - - call AD_CopyRotContinuousStateType( x, x_init, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return - call AD_CopyRotOtherStateType( OtherState, OtherState_init, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return - ! Copy FlowField data -- ideally we would not do this, but we cannot linearize with turbulent winds - call IfW_FlowField_CopyFlowFieldType(p_AD%FlowField, FlowField_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return - FlowField_perturb_p => FlowField_perturb - call AD_CopyRotInflowType( RotInflow, RotInflow_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + ! Copy continuous and other states for initialization + call AD_CopyRotContinuousStateType(x, m%x_init, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotOtherStateType(OtherState, m%OtherState_init, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - ! initialize x_init so that we get accurrate values for first step - if (.not. OtherState%BEMT%nodesInitialized ) then + ! Copy all inputs for perturbation + call AD_CopyInput(u_AD, m_AD%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + + ! Initialize x_init so that we get accurrate values for first step + ! changes values only if states haven't been initialized + if ((p_AD%Wake_Mod /= WakeMod_FVW) .and. (.not. OtherState%BEMT%nodesInitialized)) then call SetInputs(t, p, p_AD, u, RotInflow, m, indx, errStat2, errMsg2); if (Failed()) return - call BEMT_InitStates(t, m%BEMT_u(indx), p%BEMT, x_init%BEMT, xd%BEMT, z%BEMT, OtherState_init%BEMT, m%BEMT, p_AD%AFI, ErrStat2, ErrMsg2 ) ! changes values only if states haven't been initialized - if (Failed()) return + call BEMT_InitStates(t, m%BEMT_u(indx), p%BEMT, m%x_init%BEMT, xd%BEMT, z%BEMT, & + m%OtherState_init%BEMT, m%BEMT, p_AD%AFI, ErrStat2, ErrMsg2); if (Failed()) return end if + + ! Copy inputs and pack them for perturbation + call AD_CopyRotInputType(u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_VarsPackInput(Vars, u, m%Jac%u) - - ! make a copy of the inputs to perturb - call AD_CopyRotInputType( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return - - - IF ( PRESENT( dYdu ) ) THEN - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: - - ! allocate dYdu - if (.not. allocated(dYdu) ) then - call AllocAry(dYdu,p%Jac_ny, size(p%Jac_u_indx,1),'dYdu', ErrStat2, ErrMsg2); if (Failed()) return + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdu)) then + + ! Allocate dYdu if not allocated + if (.not. allocated(dYdu)) then + call AllocAry(dYdu, Vars%Ny, Vars%Nu, 'dYdu', ErrStat2, ErrMsg2); if (Failed()) return end if + ! Copy rotor inflow type for perturbation + call AD_CopyRotInflowType(RotInflow, RotInflow_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + + ! Loop through input variables + do i = 1, size(Vars%u) - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call AD_CopyRotOutputType( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotOutputType( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return - ! make a copy of the states to perturb - call AD_CopyRotConstraintStateType( z, z_copy, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotOtherStateType( OtherState_init, OtherState_copy, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return - - - do i=1,size(p%Jac_u_indx,1) - - ! get u_op + delta_p u - call IfW_FlowField_CopyFlowFieldType(p_AD%FlowField, FlowField_perturb_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotInflowType( RotInflow, RotInflow_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotInputType( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return - call Perturb_u( p, i, 1, u_perturb, delta_p ) - call Perturb_uExtend( t, u_perturb, FlowField_perturb_p, RotInflow_perturb, p, OtherState, i, 1, u_perturb, delta_p, ErrStat2, ErrMsg2); if (Failed()) return - - call AD_CopyRotConstraintStateType( z, z_copy, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotOtherStateType( OtherState_init, OtherState_copy, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - - ! get updated z%phi values: - !bjj: this is what we want to do instead of the overkill of calling AD_UpdateStates - call SetInputs(t, p, p_AD, u_perturb, RotInflow_perturb, m, indx, errStat2, errMsg2); if (Failed()) return - call UpdatePhi( m%BEMT_u(indx), p%BEMT, z_copy%BEMT%phi, p_AD%AFI, m%BEMT, OtherState_copy%BEMT%ValidPhi, errStat2, errMsg2 ); if (Failed()) return - - ! compute y at u_op + delta_p u - call RotCalcOutput( t, u_perturb, RotInflow_perturb, p, p_AD, x_init, xd, z_copy, OtherState_copy, y_p, m, m_AD, iRot, ErrStat2, ErrMsg2 ); if (Failed()) return - + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num - ! get u_op - delta_m u - call IfW_FlowField_CopyFlowFieldType(p_AD%FlowField, FlowField_perturb_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotInflowType( RotInflow, RotInflow_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotInputType( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return - call Perturb_u( p, i, -1, u_perturb, delta_m ) - call Perturb_uExtend( t, u_perturb, FlowField_perturb_p, RotInflow_perturb, p, OtherState, i, -1, u_perturb, delta_m, ErrStat2, ErrMsg2); if (Failed()) return + ! Calculate positive perturbation + call AD_CopyRotConstraintStateType(z, m%z_lin, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotOtherStateType(m%OtherState_init, m%OtherState_jac, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call AD_VarsUnpackInput(Vars, m%Jac%u_perturb, u_perturb) + if (associated(FF_ptr, FF_perturb)) call PerturbFlowField(Vars%u(i), p_AD%FlowField, 1, FF_ptr) + StartNode = 1 + call AD_CalcWind_Rotor(t, u_perturb, FF_ptr, p, p_AD, m_AD, RotInflow_perturb, StartNode, ErrStat2, ErrMsg2); if (Failed()) return + call SetInputs(t, p, p_AD, u_perturb, RotInflow_perturb, m, indx, ErrStat2, ErrMsg2); if (Failed()) return + call UpdatePhi(m%BEMT_u(indx), p%BEMT, m%z_lin%BEMT%phi, p_AD%AFI, m%BEMT, m%OtherState_jac%BEMT%ValidPhi, ErrStat2, ErrMsg2); if (Failed()) return + call RotCalcOutput(t, u_perturb, RotInflow_perturb, p, p_AD, m%x_init, xd, m%z_lin, m%OtherState_jac, y_lin, m, m_AD, iRotor, ErrStat2, ErrMsg2); if (Failed()) return + if (p_AD%Wake_Mod == WakeMod_FVW) then + call SetInputsForFVW(p_AD, m_AD%u_perturb, 1, m_AD, ErrStat2, ErrMsg2); if(Failed()) return + call FVW_CalcOutput(t, m_AD%FVW_u(1), p_AD%FVW, x_AD%FVW, xd_AD%FVW, z_AD%FVW, OtherState_AD%FVW, m_AD%FVW_y, m_AD%FVW, ErrStat2, ErrMsg2); if(Failed()) return + call SetOutputsFromFVW(t, m_AD%u_perturb, p_AD, OtherState_AD, x_AD, xd_AD, m_AD, m_AD%y_lin, ErrStat2, ErrMsg2); if(Failed()) return + endif + call AD_VarsPackOutput(Vars, y_lin, m%Jac%y_pos) - call AD_CopyRotConstraintStateType( z, z_copy, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotOtherStateType( OtherState, OtherState_copy, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - - ! get updated z%phi values: - call SetInputs(t, p, p_AD, u_perturb, RotInflow_perturb, m, indx, errStat2, errMsg2); if (Failed()) return - call UpdatePhi( m%BEMT_u(indx), p%BEMT, z_copy%BEMT%phi, p_AD%AFI, m%BEMT, OtherState_copy%BEMT%ValidPhi, errStat2, errMsg2 ); if (Failed()) return + ! Calculate negative perturbation + call AD_CopyRotConstraintStateType(z, m%z_lin, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotOtherStateType(m%OtherState_init, m%OtherState_jac, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call AD_VarsUnpackInput(Vars, m%Jac%u_perturb, u_perturb) + if (associated(FF_ptr, FF_perturb)) call PerturbFlowField(Vars%u(i), p_AD%FlowField, -1, FF_ptr) + StartNode = 1 + call AD_CalcWind_Rotor(t, u_perturb, FF_ptr, p, p_AD, m_AD, RotInflow_perturb, StartNode, ErrStat2, ErrMsg2); if (Failed()) return + call SetInputs(t, p, p_AD, u_perturb, RotInflow_perturb, m, indx, ErrStat2, ErrMsg2); if (Failed()) return + call UpdatePhi(m%BEMT_u(indx), p%BEMT, m%z_lin%BEMT%phi, p_AD%AFI, m%BEMT, m%OtherState_jac%BEMT%ValidPhi, ErrStat2, ErrMsg2); if (Failed()) return + call RotCalcOutput(t, u_perturb, RotInflow_perturb, p, p_AD, m%x_init, xd, m%z_lin, m%OtherState_jac, y_lin, m, m_AD, iRotor, ErrStat2, ErrMsg2); if (Failed()) return + if (p_AD%Wake_Mod == WakeMod_FVW) then + call SetInputsForFVW(p_AD, m_AD%u_perturb, 1, m_AD, ErrStat2, ErrMsg2); if(Failed()) return + call FVW_CalcOutput(t, m_AD%FVW_u(1), p_AD%FVW, x_AD%FVW, xd_AD%FVW, z_AD%FVW, OtherState_AD%FVW, m_AD%FVW_y, m_AD%FVW, ErrStat2, ErrMsg2); if(Failed()) return + call SetOutputsFromFVW(t, m_AD%u_perturb, p_AD, OtherState_AD, x_AD, xd_AD, m_AD, m_AD%y_lin, ErrStat2, ErrMsg2); if(Failed()) return + endif + call AD_VarsPackOutput(Vars, y_lin, m%Jac%y_neg) + + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 - ! compute y at u_op - delta_m u - call RotCalcOutput( t, u_perturb, RotInflow_perturb, p, p_AD, x_init, xd, z_copy, OtherState_copy, y_m, m, m_AD, iRot, ErrStat2, ErrMsg2 ); if (Failed()) return - - ! get central difference: - call Compute_dY( p, p_AD, y_p, y_m, delta_p, delta_m, dYdu(:,i) ) - + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,col)) + end do + end do - + end if - if (ErrStat>=AbortErrLev) then - call cleanup() - return + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + if (present(dXdu) .and. (Vars%Nx > 0)) then + + ! Allocate dXdu if not allocated + if (.not. allocated(dXdu)) then + call AllocAry(dXdu, m%Jac%Nx, m%Jac%Nu, 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return end if - - END IF - IF ( PRESENT( dXdu ) ) THEN + ! Linearization not supported for FVW + if (p_AD%Wake_Mod == WakeMod_FVW) then + call SetErrStat(ErrID_Fatal, "dXdu linearization is not supported for FVW model", ErrStat, ErrMsg, RoutineName) + return + end if - ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call AD_VarsUnpackInput(Vars, m%Jac%u_perturb, u_perturb) + if (associated(FF_ptr, FF_perturb)) call PerturbFlowField(Vars%u(i), p_AD%FlowField, 1, FF_ptr) + StartNode = 1 + call AD_CalcWind_Rotor(t, u_perturb, FF_ptr, p, p_AD, m_AD, RotInflow_perturb, StartNode, ErrStat2, ErrMsg2); if (Failed()) return + call RotCalcContStateDeriv(t, u_perturb, RotInflow_perturb, p, p_AD, m%x_init, xd, z, m%OtherState_init, m, m%dxdt_lin, ErrStat2, ErrMsg2) ; if (Failed()) return + call AD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call AD_VarsUnpackInput(Vars, m%Jac%u_perturb, u_perturb) + if (associated(FF_ptr, FF_perturb)) call PerturbFlowField(Vars%u(i), p_AD%FlowField, -1, FF_ptr) + StartNode = 1 + call AD_CalcWind_Rotor(t, u_perturb, FF_ptr, p, p_AD, m_AD, RotInflow_perturb, StartNode, ErrStat2, ErrMsg2); if (Failed()) return + call RotCalcContStateDeriv(t, u_perturb, RotInflow_perturb, p, p_AD, m%x_init, xd, z, m%OtherState_init, m, m%dxdt_lin, ErrStat2, ErrMsg2) ; if (Failed()) return + call AD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 - ! allocate dXdu if necessary - if (.not. allocated(dXdu)) then - call AllocAry(dXdu, size(p%dx), size(p%Jac_u_indx,1), 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return - end if - - - do i=1,size(p%Jac_u_indx,1) - - ! get u_op + delta u - call IfW_FlowField_CopyFlowFieldType(p_AD%FlowField, FlowField_perturb_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotInflowType( RotInflow, RotInflow_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotInputType( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return - call Perturb_u( p, i, 1, u_perturb, delta_p ) - call Perturb_uExtend( t, u_perturb, FlowField_perturb_p, RotInflow_perturb, p, OtherState, i, 1, u_perturb, delta_p, ErrStat2, ErrMsg2); if (Failed()) return - - ! compute x at u_op + delta u - ! note that this routine updates z%phi instead of using the actual state value, so we don't need to call UpdateStates/UpdatePhi here to get z_op + delta_z: - call RotCalcContStateDeriv( t, u_perturb, RotInflow_perturb, p, p_AD, x_init, xd, z, OtherState_init, m, x_p, ErrStat2, ErrMsg2 ); if (Failed()) return - - ! get u_op - delta u - call IfW_FlowField_CopyFlowFieldType(p_AD%FlowField, FlowField_perturb_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotInflowType( RotInflow, RotInflow_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - call AD_CopyRotInputType( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return - call Perturb_u( p, i, -1, u_perturb, delta_m ) - call Perturb_uExtend( t, u_perturb, FlowField_perturb_p, RotInflow_perturb, p, OtherState, i, -1, u_perturb, delta_m, ErrStat2, ErrMsg2); if (Failed()) return - - ! compute x at u_op - delta u - ! note that this routine updates z%phi instead of using the actual state value, so we don't need to call UpdateStates here to get z_op + delta_z: - call RotCalcContStateDeriv( t, u_perturb, RotInflow_perturb, p, p_AD, x_init, xd, z, OtherState_init, m, x_m, ErrStat2, ErrMsg2 ); if (Failed()) return - - ! get central difference: - - ! we may have had an error allocating memory, so we'll check - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - ! get central difference: - call Compute_dX( p, x_p, x_m, delta_p, delta_m, dXdu(:,i) ) - + ! Get partial derivative via central difference and store in full linearization array + dXdu(:,col) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%u(i)%Perturb) + end do end do + + end if - call AD_DestroyRotContinuousStateType( x_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call AD_DestroyRotContinuousStateType( x_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - END IF - - IF ( PRESENT( dXddu ) ) THEN + if (present(dXddu)) then if (allocated(dXddu)) deallocate(dXddu) - END IF + end if - IF ( PRESENT( dZdu ) ) THEN + if (present(dZdu)) then if (allocated(dZdu)) deallocate(dZdu) - END IF + end if call cleanup() + + end associate contains + subroutine PerturbFlowField(Var, BaseFF, PerturbSign, PerturbFF) + type(ModVarType), intent(in) :: Var + type(FlowFieldType), intent(in) :: BaseFF + integer(IntKi), intent(in) :: PerturbSign + type(FlowFieldType), intent(inout) :: PerturbFF + PerturbFF%Uniform%VelH = BaseFF%Uniform%VelH + PerturbFF%Uniform%ShrV = BaseFF%Uniform%ShrV + PerturbFF%PropagationDir = BaseFF%PropagationDir + select case (Var%DL%Num) + case (AD_u_HWindSpeed) + PerturbFF%Uniform%VelH = BaseFF%Uniform%VelH + Var%Perturb*PerturbSign + case (AD_u_PLexp) + PerturbFF%Uniform%ShrV = BaseFF%Uniform%ShrV + Var%Perturb*PerturbSign + case (AD_u_PropagationDir) + PerturbFF%PropagationDir = BaseFF%PropagationDir + Var%Perturb*PerturbSign + end select + end subroutine + logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) Failed = ErrStat >= AbortErrLev - if (Failed) call Cleanup() - end function Failed + if (Failed) call cleanup() + end function subroutine cleanup() - m%BEMT%UseFrozenWake = .false. - call AD_DestroyRotOutputType( y_p, ErrStat2, ErrMsg2) - call AD_DestroyRotOutputType( y_m, ErrStat2, ErrMsg2) - call AD_DestroyRotContinuousStateType( x_p, ErrStat2, ErrMsg2) - call AD_DestroyRotContinuousStateType( x_m, ErrStat2, ErrMsg2) - call AD_DestroyRotContinuousStateType( x_init, ErrStat2, ErrMsg2) - call AD_DestroyRotConstraintStateType( z_copy, ErrStat2, ErrMsg2) - call AD_DestroyRotOtherStateType( OtherState_copy, ErrStat2, ErrMsg2) - call AD_DestroyRotOtherStateType( OtherState_init, ErrStat2, ErrMsg2) - call AD_DestroyRotInputType( u_perturb, ErrStat2, ErrMsg2 ) - call AD_DestroyRotInflowType( RotInflow_perturb, ErrStat2, ErrMsg2 ) - call IfW_FlowField_DestroyFlowFieldType( FlowField_perturb, ErrStat2, ErrMsg2 ) + m_AD%rotors(iRotor)%BEMT%UseFrozenWake = .false. end subroutine cleanup -END SUBROUTINE Rot_JacobianPInput +end subroutine !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. -SUBROUTINE AD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +SUBROUTINE AD_JacobianPContState(Vars, iRotor, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) !.................................................................................................................................. + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables for packing arrays + INTEGER(IntKi), INTENT(IN ) :: iRotor !< Rotor index REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(AD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(AD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -5972,26 +6593,23 @@ SUBROUTINE AD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state !! functions (Z) with respect to !! the continuous states (x) [intent in to avoid deallocation] - ! - integer(IntKi), parameter :: iR =1 ! Rotor index - - if (size(p%rotors)>1) then - errStat = ErrID_Fatal - errMsg = 'Linearization with more than one rotor not supported' - return - endif - - call RotJacobianPContState( t, u%rotors(iR), m%Inflow(1)%RotInflow(iR), p%rotors(iR), p, x%rotors(iR), xd%rotors(iR), z%rotors(iR), OtherState%rotors(iR), y%rotors(iR), m%rotors(iR), m, iR, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) + integer(IntKi) :: StartNode + StartNode = 1 + call AD_CalcWind_Rotor(t, u%rotors(iRotor), p%FlowField, p%rotors(iRotor), p, m, m%Inflow(1)%RotInflow(iRotor), StartNode, ErrStat, ErrMsg) + if (ErrStat >= AbortErrLev) return + call RotJacobianPContState(Vars, iRotor, t, u%rotors(iRotor), m%Inflow(1)%RotInflow(iRotor), p%rotors(iRotor), p, x%rotors(iRotor), xd%rotors(iRotor), z%rotors(iRotor), OtherState%rotors(iRotor), y%rotors(iRotor), m%rotors(iRotor), m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) END SUBROUTINE AD_JacobianPContState !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. -SUBROUTINE RotJacobianPContState( t, u, RotInflow, p, p_AD, x, xd, z, OtherState, y, m, m_AD, iRot, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +SUBROUTINE RotJacobianPContState(Vars, iRotor, t, u, RotInflow, p, p_AD, x, xd, z, OtherState, y, m, m_AD, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) !.................................................................................................................................. - + + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables for packing arrays + integer(IntKi), INTENT(IN ) :: iRotor !< Rotor index REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(RotInputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(RotInflowType), INTENT(IN ) :: RotInflow !< Rotor inflow @@ -6007,169 +6625,136 @@ SUBROUTINE RotJacobianPContState( t, u, RotInflow, p, p_AD, x, xd, z, OtherState !! connectivity) does not have to be recalculated for dYdx. TYPE(RotMiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables TYPE(AD_MiscVarType), INTENT(INOUT) :: m_AD !< misc variables - INTEGER, INTENT(IN ) :: iRot !< Rotor index, needed for OLAF INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions - !! (Y) with respect to the continuous - !! states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state - !! functions (X) with respect to - !! the continuous states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state - !! functions (Xd) with respect to - !! the continuous states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state - !! functions (Z) with respect to - !! the continuous states (x) [intent in to avoid deallocation] - - ! local variables - TYPE(RotOutputType) :: y_p - TYPE(RotOutputType) :: y_m - TYPE(RotContinuousStateType) :: x_p - TYPE(RotContinuousStateType) :: x_m - TYPE(RotContinuousStateType) :: x_perturb - TYPE(RotContinuousStateType) :: x_init - TYPE(RotOtherStateType) :: OtherState_init - REAL(R8Ki) :: delta_p, delta_m ! delta change in state - INTEGER(IntKi) :: i - - integer, parameter :: indx = 1 ! m%BEMT_u(1) is at t; m%BEMT_u(2) is t+dt - integer(intKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_JacobianPContState' + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions (Y) with respect to the continuous states (x) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state functions (X) with respect to the continuous states (x) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state functions (Xd) with respect to the continuous states (x) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state functions (Z) with respect to the continuous states (x) [intent in to avoid deallocation] - - ! Initialize ErrStat + character(*), parameter :: RoutineName = 'AD_JacobianPContState' + integer(intKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer, parameter :: indx = 1 ! m%BEMT_u(1) is at t; m%BEMT_u(2) is t+dt + integer(IntKi) :: i, j, col ErrStat = ErrID_None ErrMsg = '' + ! Get OP values here (i.e., set inputs for BEMT): + if (p%DBEMT_Mod == DBEMT_frozen) then + call SetInputs(t, p, p_AD, u, RotInflow, m, indx, errStat2, errMsg2); if (Failed()) return - if ( p%DBEMT_Mod == DBEMT_frozen ) then - call SetInputs(t, p, p_AD, u, RotInflow, m, indx, errStat2, errMsg2); if (Failed()) return; - - ! compare arguments with call to BEMT_CalcOutput - call computeFrozenWake(m%BEMT_u(indx), p%BEMT, m%BEMT_y, m%BEMT ) + ! compare m%BEMT_y arguments with call to BEMT_CalcOutput + call computeFrozenWake(m%BEMT_u(indx), p%BEMT, m%BEMT_y, m%BEMT) m%BEMT%UseFrozenWake = .true. end if - - call AD_CopyRotContinuousStateType( x, x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call AD_CopyRotContinuousStateType( x, x_init, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call AD_CopyRotOtherStateType( OtherState, OtherState_init, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return; + ! Copy continuous and other states for initialization + call AD_CopyRotContinuousStateType(x, m%x_init, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyRotOtherStateType(OtherState, m%OtherState_init, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - ! initialize x_init so that we get accurrate values for - if (.not. OtherState%BEMT%nodesInitialized ) then - call SetInputs(t, p, p_AD, u, RotInflow, m, indx, errStat2, errMsg2); if (Failed()) return; - call BEMT_InitStates(t, m%BEMT_u(indx), p%BEMT, x_init%BEMT, xd%BEMT, z%BEMT, OtherState_init%BEMT, m%BEMT, p_AD%AFI, ErrStat2, ErrMsg2 ); if (Failed()) return; ! changes values only if states haven't been initialized + ! Initialize x_init so that we get accurrate values for first step + ! changes values only if states haven't been initialized + if (.not. OtherState%BEMT%nodesInitialized) then + call SetInputs(t, p, p_AD, u, RotInflow, m, indx, errStat2, errMsg2); if (Failed()) return + call BEMT_InitStates(t, m%BEMT_u(indx), p%BEMT, m%x_init%BEMT, xd%BEMT, z%BEMT, & + m%OtherState_init%BEMT, m%BEMT, p_AD%AFI, ErrStat2, ErrMsg2); if (Failed()) return end if - - - IF ( PRESENT( dYdx ) ) THEN - ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + ! Copy and pack states for perturbation + call AD_CopyRotContinuousStateType(m%x_init, m%x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call AD_VarsPackContState(Vars, m%x_init, m%Jac%x) + + ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + if (present(dYdx)) then - ! allocate dYdx if necessary + ! Allocate dYdx if not allocated if (.not. allocated(dYdx)) then - call AllocAry(dYdx, p%Jac_ny, size(p%dx), 'dYdx', ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry(dYdx, m%Jac%Ny, m%Jac%Nx, 'dYdx', ErrStat2, ErrMsg2); if (Failed()) return end if - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call AD_CopyRotOutputType( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return; - call AD_CopyRotOutputType( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return; + ! Loop through state variables + do i = 1, size(Vars%x) - do i=1,size(p%dx) - - ! get x_op + delta_p x - call AD_CopyRotContinuousStateType( x_init, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Perturb_x( p, i, 1, x_perturb, delta_p ) + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call AD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call RotCalcOutput(t, u, RotInflow, p, p_AD, m%x_perturb, xd, z, m%OtherState_init, m%y_lin, m, m_AD, iRotor, ErrStat2, ErrMsg2) ; if (Failed()) return + call AD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) - ! compute y at x_op + delta_p x - ! NOTE: z_op is the same as z because x_perturb does not affect the values of phi, thus I am not updating the states or calling UpdatePhi to get z_perturb. - call RotCalcOutput( t, u, RotInflow, p, p_AD, x_perturb, xd, z, OtherState_init, y_p, m, m_AD, iRot, ErrStat2, ErrMsg2 ) ; if (Failed()) return; - - - ! get x_op - delta_m x - call AD_CopyRotContinuousStateType( x_init, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Perturb_x( p, i, -1, x_perturb, delta_m ) - - ! compute y at x_op - delta_m x - ! NOTE: z_op is the same as z because x_perturb does not affect the values of phi, thus I am not updating the states or calling UpdatePhi to get z_perturb. - call RotCalcOutput( t, u, RotInflow, p, p_AD, x_perturb, xd, z, OtherState_init, y_m, m, m_AD, iRot, ErrStat2, ErrMsg2 ); if (Failed()) return; - - - ! get central difference: - call Compute_dY( p, p_AD, y_p, y_m, delta_p, delta_m, dYdx(:,i) ) - + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call AD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call RotCalcOutput(t, u, RotInflow, p, p_AD, m%x_perturb, xd, z, m%OtherState_init, m%y_lin, m, m_AD, iRotor, ErrStat2, ErrMsg2) ; if (Failed()) return + call AD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Calculate column index + col = Vars%x(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%x(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdx(:,col)) + end do end do - END IF + + end if - IF ( PRESENT( dXdx ) ) THEN + ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + if (present(dXdx)) then - ! allocate dXdx if necessary + ! Allocate dXdx if not allocated if (.not. allocated(dXdx)) then - call AllocAry(dXdx, size(p%dx), size(p%dx), 'dXdx', ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry(dXdx, m%Jac%Nx, m%Jac%Nx, 'dXdx', ErrStat2, ErrMsg2); if (Failed()) return end if - - - do i=1,size(p%dx,1) - - ! get x_op + delta x - call AD_CopyRotContinuousStateType( x_init, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Perturb_x( p, i, 1, x_perturb, delta_p ) - ! compute X at x_op + delta x - ! NOTE: z_op is the same as z because x_perturb does not affect the values of phi, thus I am not updating the states or calling UpdatePhi to get z_perturb. - call RotCalcContStateDeriv( t, u, RotInflow, p, p_AD, x_perturb, xd, z, OtherState_init, m, x_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - - ! get x_op - delta x - call AD_CopyRotContinuousStateType( x_init, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Perturb_x( p, i, -1, x_perturb, delta_m ) - - ! compute x at u_op - delta u - ! NOTE: z_op is the same as z because x_perturb does not affect the values of phi, thus I am not updating the states or calling UpdatePhi to get z_perturb. - call RotCalcContStateDeriv( t, u, RotInflow, p, p_AD, x_perturb, xd, z, OtherState_init, m, x_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - - ! get central difference: - call Compute_dX( p, x_p, x_m, delta_p, delta_m, dXdx(:,i) ) + ! Loop through state variables + do i = 1, size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call AD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call RotCalcContStateDeriv(t, u, RotInflow, p, p_AD, m%x_perturb, xd, z, m%OtherState_init, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call AD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call AD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call RotCalcContStateDeriv(t, u, RotInflow, p, p_AD, m%x_perturb, xd, z, m%OtherState_init, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call AD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Calculate column index + col = Vars%x(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference and store in full linearization array + dXdx(:,col) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%x(i)%Perturb) + end do end do - END IF -! IF ( PRESENT( dXddx ) ) THEN -! END IF + end if -! IF ( PRESENT( dZdx ) ) THEN -! END IF + ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the continuous states (x) here: + if (present(dXddx)) then + end if + + ! Calculate the partial derivative of the constraint state functions (Z) with respect to the continuous states (x) here: + if (present(dZdx)) then + end if call cleanup() contains logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) Failed = ErrStat >= AbortErrLev - if (Failed) call Cleanup() - end function Failed - + if (Failed) call cleanup() + end function subroutine cleanup() m%BEMT%UseFrozenWake = .false. - - call AD_DestroyRotOutputType( y_p, ErrStat2, ErrMsg2) - call AD_DestroyRotOutputType( y_m, ErrStat2, ErrMsg2) - call AD_DestroyRotContinuousStateType( x_p, ErrStat2, ErrMsg2) - call AD_DestroyRotContinuousStateType( x_m, ErrStat2, ErrMsg2) - - call AD_DestroyRotContinuousStateType( x_perturb, ErrStat2, ErrMsg2 ) - call AD_DestroyRotContinuousStateType( x_init, ErrStat2, ErrMsg2 ) - call AD_DestroyRotOtherStateType( OtherState_init, ErrStat2, ErrMsg2 ) end subroutine cleanup END SUBROUTINE RotJacobianPContState @@ -6177,7 +6762,8 @@ END SUBROUTINE RotJacobianPContState !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the discrete states (xd). The partial derivatives dY/dxd, dX/dxd, dXd/dxd, and dZ/dxd are returned. -SUBROUTINE AD_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) +SUBROUTINE AD_JacobianPDiscState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables for packing arrays REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(AD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(AD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -6198,8 +6784,6 @@ SUBROUTINE AD_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrStat = ErrID_None ErrMsg = '' - return; ! nothing to do here - ! IF ( PRESENT( dYdxd ) ) THEN ! END IF ! @@ -6217,7 +6801,8 @@ END SUBROUTINE AD_JacobianPDiscState !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the constraint states (z). The partial derivatives dY/dz, dX/dz, dXd/dz, and dZ/dz are returned. -SUBROUTINE AD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) +SUBROUTINE AD_JacobianPConstrState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables for packing arrays REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(AD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(AD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -6235,6 +6820,7 @@ SUBROUTINE AD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdz(:,:) !< Partial derivatives of constraint integer(IntKi), parameter :: iR =1 ! Rotor index + integer(IntKi) :: StartNode if (size(p%rotors)>1) then errStat = ErrID_Fatal @@ -6242,7 +6828,10 @@ SUBROUTINE AD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat return endif - call RotJacobianPConstrState( t, u%rotors(iR), m%Inflow(1)%RotInflow(iR), p%rotors(iR), p, x%rotors(iR), xd%rotors(iR), z%rotors(iR), OtherState%rotors(iR), y%rotors(iR), m%rotors(iR), m, iR, errStat, errMsg, dYdz, dXdz, dXddz, dZdz ) + StartNode = 1 + call AD_CalcWind_Rotor(t, u%rotors(iR), p%FlowField, p%rotors(iR), p, m, m%Inflow(1)%RotInflow(iR), StartNode, ErrStat, ErrMsg) + if (ErrStat >= AbortErrLev) return + call RotJacobianPConstrState(t, u%rotors(iR), m%Inflow(1)%RotInflow(iR), p%rotors(iR), p, x%rotors(iR), xd%rotors(iR), z%rotors(iR), OtherState%rotors(iR), y%rotors(iR), m%rotors(iR), m, iR, errStat, errMsg, dYdz, dXdz, dXddz, dZdz) END SUBROUTINE AD_JacobianPConstrState @@ -6280,12 +6869,16 @@ SUBROUTINE RotJacobianPConstrState( t, u, RotInflow, p, p_AD, x, xd, z, OtherSta REAL(R8Ki) :: delta_p, delta_m ! delta change in state INTEGER(IntKi) :: i, j, k, n, k2, j2 - integer, parameter :: indx = 1 ! m%BEMT_u(1) is at t; m%BEMT_u(2) is t+dt - integer, parameter :: op_indx = 2 ! m%BEMT_u(1) is at t; m%BEMT_u(2) is t+dt or the input at OP + character(*), parameter :: RoutineName = 'AD_JacobianPConstrState' integer(intKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_JacobianPConstrState' + integer, parameter :: indx = 1 ! m%BEMT_u(1) is at t; m%BEMT_u(2) is t+dt + integer, parameter :: op_indx = 2 ! m%BEMT_u(1) is at t; m%BEMT_u(2) is t+dt or the input at OP + + ! local variables + + ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' @@ -6440,1234 +7033,49 @@ end subroutine cleanup END SUBROUTINE RotJacobianPConstrState -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE AD_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(AD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(AD_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(AD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(AD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(AD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(AD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(AD_OutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(AD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - ! - integer(IntKi), parameter :: iR =1 ! Rotor index - - if (size(p%rotors)>1) then - errStat = ErrID_Fatal - errMsg = 'Linearization with more than one rotor not supported' - return - endif - - call RotGetOP( t, u%rotors(iR), m%Inflow(1)%RotInflow(iR), p%rotors(iR), p, x%rotors(iR), xd%rotors(iR), z%rotors(iR), OtherState%rotors(iR), y%rotors(iR), m%rotors(iR), errStat, errMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) - -END SUBROUTINE AD_GetOP - -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> Routine to pack the data structures representing the operating points into arrays for linearization. -!! NOTE: the order here needs to exactly match the order in Init_Jacobian_u. -SUBROUTINE RotGetOP( t, u, RotInflow, p, p_AD, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(RotInputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(RotInflowType), INTENT(IN ) :: RotInflow !< Rotor Inflow at operating point (may change to inout if a mesh copy is required) - TYPE(RotParameterType), INTENT(IN ) :: p !< Parameters - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< Parameters - TYPE(RotContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(RotDiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(RotConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(RotOtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(RotOutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(RotMiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - - INTEGER(IntKi) :: index, i, j, k, n - INTEGER(IntKi) :: nu - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'AD_GetOP' - LOGICAL :: FieldMask(FIELDMASK_SIZE) - TYPE(RotContinuousStateType) :: dxdt - real(ReKi) :: OP_out(3) !< operating point of wind (HWindSpeed, PLexp, and AngleH) - - - ! Initialize ErrStat - - ErrStat = ErrID_None - ErrMsg = '' - - IF ( PRESENT( u_op ) ) THEN - nu = size(p%Jac_u_indx,1) - do i=1,p%NumBl_Lin - nu = nu + u%BladeMotion(i)%NNodes * 6 ! Jac_u_indx has 3 orientation angles, but the OP needs the full 9 elements of the DCM - end do - - if (.not. p_AD%CompAeroMaps) then - nu = nu + u%NacelleMotion%NNodes * 6 & ! Jac_u_indx has 3 orientation angles, but the OP needs the full 9 elements of the DCM - + u%HubMotion%NNodes * 6 & ! Jac_u_indx has 3 orientation angles, but the OP needs the full 9 elements of the DCM - + u%TowerMotion%NNodes * 6 & ! Jac_u_indx has 3 orientation angles, but the OP needs the full 9 elements of the DCM - + u%TFinMotion%NNodes * 6 ! Jac_u_indx has 3 orientation angles, but the OP needs the full 9 elements of the DCM - do i=1,p%NumBlades - nu = nu + u%BladeRootMotion(i)%NNodes * 6 ! Jac_u_indx has 3 orientation angles, but the OP needs the full 9 elements of the DCM - end do - end if - - if (.not. allocated(u_op)) then - call AllocAry(u_op, nu, 'u_op', ErrStat2, ErrMsg2); if (Failed()) return - end if - - - index = 1 - if (.not. p_AD%CompAeroMaps) then - !------------------------------ - ! Nacelle - ! Module/Mesh/Field: u%NacelleMotion%TranslationDisp - ! Module/Mesh/Field: u%NacelleMotion%Orientation - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - call PackMotionMesh(u%NacelleMotion, u_op, index, FieldMask=FieldMask) - - !------------------------------ - ! Hub - ! Module/Mesh/Field: u%HubMotion%TranslationDisp - ! Module/Mesh/Field: u%HubMotion%Orientation - ! Module/Mesh/Field: u%HubMotion%RotationVel - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_ROTATIONVEL) = .true. - call PackMotionMesh(u%HubMotion, u_op, index, FieldMask=FieldMask) - - !------------------------------ - ! TailFin - ! Module/Mesh/Field: u%TFinMotion%TranslationDisp - ! Module/Mesh/Field: u%TFinMotion%Orientation - ! Module/Mesh/Field: u%TFinMotion%TranslationVel - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_TRANSLATIONVEL) = .true. - call PackMotionMesh(u%TFinMotion, u_op, index, FieldMask=FieldMask) - - !------------------------------ - ! Tower - ! Module/Mesh/Field: u%TowerMotion%TranslationDisp - ! Module/Mesh/Field: u%TowerMotion%Orientation - ! Module/Mesh/Field: u%TowerMotion%TranslationVel - ! Module/Mesh/Field: u%TowerMotion%TranslationAcc - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_TRANSLATIONVEL) = .true. - FieldMask(MASKID_TRANSLATIONACC) = .true. - call PackMotionMesh(u%TowerMotion, u_op, index, FieldMask=FieldMask) - - !------------------------------ - ! Blade Root - ! Module/Mesh/Field: u%BladeRootMotion(1)%Orientation - ! Module/Mesh/Field: u%BladeRootMotion(2)%Orientation - ! Module/Mesh/Field: u%BladeRootMotion(3)%Orientation - FieldMask = .false. - FieldMask(MASKID_ORIENTATION) = .true. - do k = 1,p%NumBlades - call PackMotionMesh(u%BladeRootMotion(k), u_op, index, FieldMask=FieldMask) - end do - endif - - - !------------------------------ - ! Blade - ! Module/Mesh/Field: u%BladeMotion(k)%TranslationDisp - ! Module/Mesh/Field: u%BladeMotion(k)%Orientation - ! Module/Mesh/Field: u%BladeMotion(k)%TranslationVel - ! Module/Mesh/Field: u%BladeMotion(k)%RotationVel - ! Module/Mesh/Field: u%BladeMotion(k)%TranslationAcc - ! Module/Mesh/Field: u%BladeMotion(k)%RotationalAcc - if (.not. p_AD%CompAeroMaps) then - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_TRANSLATIONVEL) = .true. - FieldMask(MASKID_ROTATIONVEL) = .true. - FieldMask(MASKID_TRANSLATIONACC) = .true. - FieldMask(MASKID_ROTATIONACC) = .true. - else - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_TRANSLATIONVel) = .true. - end if - do k=1,p%NumBl_Lin - call PackMotionMesh(u%BladeMotion(k), u_op, index, FieldMask=FieldMask) - end do - - if (.not. p_AD%CompAeroMaps) then - !------------------------------ - ! UserProp - ! Module/Mesh/Field: u%UserProp(:,:) - do k=1,p%NumBlades - do j = 1, size(u%UserProp,1) ! Number of nodes for a blade - u_op(index) = u%UserProp(j,k) - index = index + 1 - end do - end do - - !------------------------------ - ! Extended inputs -- Linearization is only possible with Steady or Uniform Wind, so take advantage of that here - ! Module/Mesh/Field: HWindSpeed = 37 - ! Module/Mesh/Field: PLexp = 38 - ! Module/Mesh/Field: PropagationDir = 39 - call IfW_UniformWind_GetOP(p_AD%FlowField%Uniform, t, .false. , OP_out) - ! HWindSpeed - u_op(index) = OP_out(1); index = index + 1 - ! PLexp - u_op(index) = OP_out(2); index = index + 1 - ! PropagationDir (include AngleH in calculation if any) - u_op(index) = OP_out(3) + p_AD%FlowField%PropagationDir; index = index + 1 - - end if - END IF - - IF ( PRESENT( y_op ) ) THEN - - if (.not. allocated(y_op)) then - call AllocAry(y_op, p%Jac_ny, 'y_op', ErrStat2, ErrMsg2); if (Failed()) return - end if - - index = 1 - if (.not. p_AD%CompAeroMaps) then - call PackLoadMesh(y%NacelleLoad, y_op, index) - call PackLoadMesh(y%HubLoad, y_op, index) - call PackLoadMesh(y%TFinLoad, y_op, index) - call PackLoadMesh(y%TowerLoad, y_op, index) - endif - do k=1,p%NumBl_Lin - call PackLoadMesh(y%BladeLoad(k), y_op, index) - end do - - if (.not. p_AD%CompAeroMaps) then - index = index - 1 - do i=1,p%NumOuts + p%BldNd_TotNumOuts - y_op(i+index) = y%WriteOutput(i) - end do - end if - - END IF - - IF ( PRESENT( x_op ) ) THEN - - if (.not. allocated(x_op)) then - call AllocAry(x_op, p%BEMT%DBEMT%lin_nx + p%BEMT%UA%lin_nx + p%BEMT%lin_nx,'x_op',ErrStat2,ErrMsg2); if (Failed()) return - end if - - index = 1 - ! set linearization operating points: - if (p%BEMT%DBEMT%lin_nx>0) then - do j=1,p%NumBlades ! size(x%BEMT%DBEMT%element,2) - do i=1,p%NumBlNds ! size(x%BEMT%DBEMT%element,1) - do k=1,size(x%BEMT%DBEMT%element(i,j)%vind) - x_op(index) = x%BEMT%DBEMT%element(i,j)%vind(k) - index = index + 1 - end do - end do - end do - - do j=1,p%NumBlades ! size(x%BEMT%DBEMT%element,2) - do i=1,p%NumBlNds ! size(x%BEMT%DBEMT%element,1) - do k=1,size(x%BEMT%DBEMT%element(i,j)%vind_1) - x_op(index) = x%BEMT%DBEMT%element(i,j)%vind_1(k) - index = index + 1 - end do - end do - end do - end if - - ! UA states - if (p%BEMT%UA%lin_nx>0) then - do n=1,p%BEMT%UA%lin_nx - i = p%BEMT%UA%lin_xIndx(n,1) - j = p%BEMT%UA%lin_xIndx(n,2) - k = p%BEMT%UA%lin_xIndx(n,3) - x_op(index) = x%BEMT%UA%element(i,j)%x(k) - - index = index + 1 - end do - end if - - ! BEMT states - if (p%BEMT%lin_nx>0) then - !do k = 1,size(x%BEMT%V_w) - ! x_op(index) = x%BEMT%v_w(k) - ! index = index + 1 - !end do - end if - - END IF - - IF ( PRESENT( dx_op ) ) THEN - - if (.not. allocated(dx_op)) then - call AllocAry(dx_op, p%BEMT%DBEMT%lin_nx + p%BEMT%UA%lin_nx + p%BEMT%lin_nx,'dx_op',ErrStat2,ErrMsg2); if (Failed()) return - end if - - call RotCalcContStateDeriv(t, u, RotInflow, p, p_AD, x, xd, z, OtherState, m, dxdt, ErrStat2, ErrMsg2); if (Failed()) return - - index = 1 - ! set linearization operating points: - if (p%BEMT%DBEMT%lin_nx>0) then - - do j=1,p%NumBlades ! size(dxdt%BEMT%DBEMT%element,2) - do i=1,p%NumBlNds ! size(dxdt%BEMT%DBEMT%element,1) - do k=1,size(dxdt%BEMT%DBEMT%element(i,j)%vind) - dx_op(index) = dxdt%BEMT%DBEMT%element(i,j)%vind(k) - index = index + 1 - end do - end do - end do - - do j=1,p%NumBlades ! size(dxdt%BEMT%DBEMT%element,2) - do i=1,p%NumBlNds ! size(dxdt%BEMT%DBEMT%element,1) - do k=1,size(dxdt%BEMT%DBEMT%element(i,j)%vind_1) - dx_op(index) = dxdt%BEMT%DBEMT%element(i,j)%vind_1(k) - index = index + 1 - end do - end do - end do - - end if - ! UA states derivatives - if (p%BEMT%UA%lin_nx>0) then - do n=1,p%BEMT%UA%lin_nx - i = p%BEMT%UA%lin_xIndx(n,1) - j = p%BEMT%UA%lin_xIndx(n,2) - k = p%BEMT%UA%lin_xIndx(n,3) - dx_op(index) = dxdt%BEMT%UA%element(i,j)%x(k) - - index = index + 1 - end do - end if - ! BEMT states derivatives - if (p%BEMT%lin_nx>0) then - ErrStat2=ErrID_Fatal - ErrMsg2='Number of lin states for bem should be zero for now.' - if (Failed()) return - !do k = 1,size(x%BEMT%V_w) - ! dx_op(index) = dxdt%BEMT%v_w(k) - ! index = index + 1 - !end do - end if - - - END IF - - IF ( PRESENT( xd_op ) ) THEN - - END IF - - IF ( PRESENT( z_op ) ) THEN - - if (.not. allocated(z_op)) then - call AllocAry(z_op, p%NumBlades*p%NumBlNds, 'z_op', ErrStat2, ErrMsg2); if (Failed()) return - end if - - - index = 1 - do k=1,p%NumBlades ! size(z%BEMT%Phi,2) - do i=1,p%NumBlNds ! size(z%BEMT%Phi,1) - z_op(index) = z%BEMT%phi(i,k) - index = index + 1 - end do - end do - - END IF - -contains - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - if (Failed) call Cleanup() - end function Failed - - subroutine cleanup() - call AD_DestroyRotContinuousStateType( dxdt, ErrStat2, ErrMsg2) - end subroutine cleanup -END SUBROUTINE RotGetOP - - -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -SUBROUTINE Init_Jacobian_y( p, p_AD, y, InitOut, ErrStat, ErrMsg) - TYPE(RotParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(AD_ParameterType) , INTENT(INOUT) :: p_AD !< parameters - TYPE(RotOutputType) , INTENT(IN ) :: y !< outputs - TYPE(RotInitOutputType) , INTENT(INOUT) :: InitOut !< Initialization output data (for Jacobian row/column names) - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables: - INTEGER(IntKi) :: i, j, k, indx_next, indx_last - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Init_Jacobian_y' - logical, allocatable :: AllOut(:) - - - ErrStat = ErrID_None - ErrMsg = "" - - - ! determine how many outputs there are in the Jacobians - if (p_AD%CompAeroMaps) then - p%Jac_ny = 0 ! we skip tower and writeOutput values in the solve (note: y%TowerLoad%NNodes=0) - else - p%Jac_ny = y%NacelleLoad%NNodes * 6 & ! 3 forces + 3 moments at each node - + y%HubLoad%NNodes * 6 & ! 3 forces + 3 moments at each node - + y%TFinLoad%NNodes * 6 & ! 3 forces + 3 moments at each node - + y%TowerLoad%NNodes * 6 & ! 3 forces + 3 moments at each node - + p%NumOuts + p%BldNd_TotNumOuts ! WriteOutput values - end if - - do k=1,p%NumBl_Lin - p%Jac_ny = p%Jac_ny + y%BladeLoad(k)%NNodes * 6 ! 3 forces + 3 moments at each node - end do - - - ! get the names of the linearized outputs: - call AllocAry(InitOut%LinNames_y, p%Jac_ny,'LinNames_y',ErrStat2,ErrMsg2); if (Failed()) return - call AllocAry(InitOut%RotFrame_y, p%Jac_ny,'RotFrame_y',ErrStat2,ErrMsg2); if (Failed()) return - - - InitOut%RotFrame_y = .false. ! default all to false, then set the true ones below - indx_next = 1 - if (.not. p_AD%CompAeroMaps) then - p%Jac_y_idxStartList%NacelleLoad = indx_next; call PackLoadMesh_Names(y%NacelleLoad, 'Nacelle', InitOut%LinNames_y, indx_next) - p%Jac_y_idxStartList%HubLoad = indx_next; call PackLoadMesh_Names(y%HubLoad, 'Hub', InitOut%LinNames_y, indx_next) - p%Jac_y_idxStartList%TFinLoad = indx_next; call PackLoadMesh_Names(y%TFinLoad, 'TailFin', InitOut%LinNames_y, indx_next) - p%Jac_y_idxStartList%TowerLoad = indx_next; call PackLoadMesh_Names(y%TowerLoad, 'Tower', InitOut%LinNames_y, indx_next) ! note: y%TowerLoad%NNodes=0 for aeroMaps - endif - - indx_last = indx_next - p%Jac_y_idxStartList%BladeLoad = indx_next; - do k=1,p%NumBl_Lin - call PackLoadMesh_Names(y%BladeLoad(k), 'Blade '//trim(num2lstr(k)), InitOut%LinNames_y, indx_next) - end do - ! InitOut%RotFrame_y(indx_last:indx_next-1) = .true. ! The mesh fields are in the global frame, so are not in the rotating frame - - if (.not. p_AD%CompAeroMaps) then - ! Outputs - do i=1,p%NumOuts + p%BldNd_TotNumOuts - InitOut%LinNames_y(i+indx_next-1) = trim(InitOut%WriteOutputHdr(i))//', '//trim(InitOut%WriteOutputUnt(i)) !trim(p%OutParam(i)%Name)//', '//p%OutParam(i)%Units - end do - - ! check for all the WriteOutput values that are functions of blade number: - allocate( AllOut(0:MaxOutPts), STAT=ErrStat2 ) ! allocate starting at zero to account for invalid output channels - if (ErrStat2 /=0 ) then - ErrStat2 = ErrID_Info - ErrMsg2 = 'error allocating temporary space for AllOut' - if (Failed()) return - end if - - AllOut = .false. - do k=1,3 - AllOut( BAzimuth(k)) = .true. - AllOut( BPitch (k)) = .true. - - AllOut( BAeroFx( k)) = .true. - AllOut( BAeroFy( k)) = .true. - AllOut( BAeroFz( k)) = .true. - AllOut( BAeroMx( k)) = .true. - AllOut( BAeroMy( k)) = .true. - AllOut( BAeroMz( k)) = .true. - !AllOut( TipClrnc(k)) = .true. - - do j=1,9 - AllOut(BNVUndx(j,k)) = .true. - AllOut(BNVUndy(j,k)) = .true. - AllOut(BNVUndz(j,k)) = .true. - AllOut(BNVDisx(j,k)) = .true. - AllOut(BNVDisy(j,k)) = .true. - AllOut(BNVDisz(j,k)) = .true. - AllOut(BNSTVx (j,k)) = .true. - AllOut(BNSTVy (j,k)) = .true. - AllOut(BNSTVz (j,k)) = .true. - AllOut(BNVRel (j,k)) = .true. - AllOut(BNDynP (j,k)) = .true. - AllOut(BNRe (j,k)) = .true. - AllOut(BNM (j,k)) = .true. - AllOut(BNVIndx(j,k)) = .true. - AllOut(BNVIndy(j,k)) = .true. - AllOut(BNAxInd(j,k)) = .true. - AllOut(BNTnInd(j,k)) = .true. - AllOut(BNAlpha(j,k)) = .true. - AllOut(BNTheta(j,k)) = .true. - AllOut(BNPhi (j,k)) = .true. - AllOut(BNCurve(j,k)) = .true. - AllOut(BNCl (j,k)) = .true. - AllOut(BNCd (j,k)) = .true. - AllOut(BNCm (j,k)) = .true. - AllOut(BNCx (j,k)) = .true. - AllOut(BNCy (j,k)) = .true. - AllOut(BNCn (j,k)) = .true. - AllOut(BNCt (j,k)) = .true. - AllOut(BNFl (j,k)) = .true. - AllOut(BNFd (j,k)) = .true. - AllOut(BNMm (j,k)) = .true. - AllOut(BNFx (j,k)) = .true. - AllOut(BNFy (j,k)) = .true. - AllOut(BNFn (j,k)) = .true. - AllOut(BNFt (j,k)) = .true. - AllOut(BNClrnc(j,k)) = .true. - end do - end do - - - do i=1,p%NumOuts - InitOut%RotFrame_y(i+indx_next-1) = AllOut( p%OutParam(i)%Indx ) - end do - - do i=1,p%BldNd_TotNumOuts - InitOut%RotFrame_y(i+p%NumOuts+indx_next-1) = .true. - !AbsCant, AbsToe, AbsTwist should probably be set to .false. - end do - - end if - - call Cleanup() - -contains - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - if (Failed) call Cleanup() - end function Failed - - subroutine Cleanup() - if (allocated(AllOut)) deallocate(AllOut) - end subroutine Cleanup -END SUBROUTINE Init_Jacobian_y - - -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE Init_Jacobian_u( InputFileData, p, p_AD, u, InitOut, ErrStat, ErrMsg) - TYPE(RotInputFile) , INTENT(IN ) :: InputFileData !< input file data (for default blade perturbation) - TYPE(RotParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(AD_ParameterType) , INTENT(INOUT) :: p_AD !< parameters - TYPE(RotInputType) , INTENT(IN ) :: u !< inputs - TYPE(RotInitOutputType) , INTENT(INOUT) :: InitOut !< Initialization output data (for Jacobian row/column names) - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables: - INTEGER(IntKi) :: i, k, index, indexNames, index_last, nu, i_meshField - INTEGER(IntKi) :: NumFieldsForLinearization - REAL(ReKi) :: perturb, perturb_t, perturb_b(AD_MaxBl_Out) - LOGICAL :: FieldMask(FIELDMASK_SIZE) - CHARACTER(1), PARAMETER :: UVW(3) = (/'U','V','W'/) - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Init_Jacobian_u' - - ErrStat = ErrID_None - ErrMsg = "" - - p%NumExtendedInputs = 3 ! Extended inputs from InflowWind: HWindSpeed, PLexp, PropagationDir - - ! determine how many inputs there are in the Jacobians - if (p_AD%CompAeroMaps) then - nu = 0 - - NumFieldsForLinearization = 3 ! Translation Displacements + orientations + Translation velocities at each node on the blade mesh - else - nu = u%NacelleMotion%NNodes * 6 & ! 3 Translation Displacements + 3 orientations - + u%hubMotion%NNodes * 9 & ! 3 Translation Displacements + 3 orientations + 3 Rotation velocities - + u%TowerMotion%NNodes * 12 & ! 3 Translation Displacements + 3 orientations + 3 Translation velocities + 3 Translation Accelerations - + u%TFinMotion%NNodes * 9 & ! 3 Translation Displacements + 3 orientations + 3 Translation velocities - + size( u%UserProp) & ! typically number of blades - + p%NumExtendedInputs - - NumFieldsForLinearization = 6 ! Translation Displacements + orientations + Translation velocities + Rotation velocities + TranslationAcc + RotationAcc at each node on the blade mesh - do i=1,p%NumBlades - nu = nu + u%BladeRootMotion(i)%NNodes * 3 ! 3 orientations at each node - end do - end if - - do i=1,p%NumBl_Lin - nu = nu + u%BladeMotion(i)%NNodes * 3*NumFieldsForLinearization ! 3 components per additional field - end do - - ! all other inputs ignored - - - !............................ - ! fill matrix to store index to help us figure out what the ith value of the u vector really means - ! (see aerodyn::perturb_u ... these MUST match ) - ! column 1 indicates module's mesh and field - ! column 2 indicates the first index (x-y-z component) of the field - ! column 3 is the node - !............................ - - call allocAry( p%Jac_u_indx, nu, 3, 'p%Jac_u_indx', ErrStat2, ErrMsg2); if (Failed()) return - call AllocAry(InitOut%LinNames_u, nu, 'LinNames_u', ErrStat2, ErrMsg2); if (Failed()) return - call AllocAry(InitOut%RotFrame_u, nu, 'RotFrame_u', ErrStat2, ErrMsg2); if (Failed()) return - call AllocAry(InitOut%IsLoad_u, nu, 'IsLoad_u', ErrStat2, ErrMsg2); if (Failed()) return - - ! perturbations - call allocAry( p%du, 39, 'p%du', ErrStat2, ErrMsg2); if (Failed()) return ! number of unique values in p%Jac_u_indx(:,1) (check below) - perturb = 2*D2R - do k=1,p%NumBl_Lin - perturb_b(k) = 0.2_ReKi*D2R * InputFileData%BladeProps(k)%BlSpn( InputFileData%BladeProps(k)%NumBlNds ) +subroutine AD_VarsPackExtInput(Vars, t, p, ValAry) + use IfW_FlowField_Types, only : UniformField_Interp + use IfW_FlowField, only : UniformField_InterpCubic, UniformField_InterpLinear + type(ModVarsType), intent(in) :: Vars + real(DbKi), intent(in) :: t !< Time in seconds at operating point + type(AD_ParameterType), intent(in) :: p !< Parameters + real(R8Ki), intent(inout) :: ValAry(:) + type(UniformField_Interp) :: op !< Interpolated values of UniformField + integer(IntKi) :: i + logical :: first + first = .true. + do i = 1, size(Vars%u) + associate(Var => Vars%u(i)) + select case(Var%DL%Num) + case (AD_u_HWindSpeed) + call CalcExtOP() + ValAry(Var%iLoc(1)) = op%VelH + case (AD_u_PLExp) + call CalcExtOP() + ValAry(Var%iLoc(1)) = op%ShrV + case (AD_u_PropagationDir) + call CalcExtOP() + ValAry(Var%iLoc(1)) = op%AngleH + p%FlowField%PropagationDir + end select + end associate end do - if ( u%TowerMotion%NNodes > 0) then - perturb_t = 0.2_ReKi*D2R * u%TowerMotion%Position( 3, u%TowerMotion%NNodes ) - else - perturb_t = 0.0_ReKi - end if - - ! initialize - p%Jac_u_indx = 0 - p%du = 0.0_R8Ki - InitOut%IsLoad_u = .false. ! None of AeroDyn's inputs are loads - InitOut%RotFrame_u = .false. - - - !=========================================================================== - ! AD input mappings stored in p%Jac_u_indx, perturbations in p%du - !=========================================================================== - index = 1 - - if (.not. p_AD%CompAeroMaps) then - !------------------------------ - ! Nacelle - ! Module/Mesh/Field: u%NacelleMotion%TranslationDisp = 1; - ! Module/Mesh/Field: u%NacelleMotion%Orientation = 2; - indexNames=index - p%Jac_u_idxStartList%Nacelle = index - call SetJac_u_idx(1,2,u%NacelleMotion%NNodes,index) - ! Perturbations - p%du(1) = perturb_b(1) - p%du(2) = perturb - ! Names - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - call PackMotionMesh_Names(u%NacelleMotion, 'Nacelle', InitOut%LinNames_u, indexNames, FieldMask=FieldMask) - - !------------------------------ - ! Hub - ! Module/Mesh/Field: u%HubMotion%TranslationDisp = 3; - ! Module/Mesh/Field: u%HubMotion%Orientation = 4; - ! Module/Mesh/Field: u%HubMotion%RotationVel = 5; - indexNames=index - p%Jac_u_idxStartList%Hub = index - call SetJac_u_idx(3,5,u%HubMotion%NNodes,index) - ! Perturbations - p%du(3) = perturb_b(1) - p%du(4) = perturb - p%du(5) = perturb - ! Names - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_ROTATIONVEL) = .true. - call PackMotionMesh_Names(u%HubMotion, 'Hub', InitOut%LinNames_u, indexNames, FieldMask=FieldMask) - - - !------------------------------ - ! TailFin - ! Module/Mesh/Field: u%TFinMotion%TranslationDisp = 6; - ! Module/Mesh/Field: u%TFinMotion%Orientation = 7; - ! Module/Mesh/Field: u%TFinMotion%TranslationVel = 8; - indexNames=index - p%Jac_u_idxStartList%TFin = index - call SetJac_u_idx(6,8,u%TFinMotion%NNodes,index) - ! Perturbations - p%du(6) = perturb - p%du(7) = perturb - p%du(8) = perturb - ! Names - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_TRANSLATIONVEL) = .true. - call PackMotionMesh_Names(u%TFinMotion, 'TailFin', InitOut%LinNames_u, indexNames, FieldMask=FieldMask) - - - !------------------------------ - ! Tower - ! Module/Mesh/Field: u%TowerMotion%TranslationDisp = 9; - ! Module/Mesh/Field: u%TowerMotion%Orientation = 10; - ! Module/Mesh/Field: u%TowerMotion%TranslationVel = 11; - ! Module/Mesh/Field: u%TowerMotion%TranslationAcc = 12; - indexNames=index - p%Jac_u_idxStartList%Tower = index - call SetJac_u_idx(9,12,u%TowerMotion%NNodes,index) - ! Perturbations - p%du( 9) = perturb_t - p%du(10) = perturb - p%du(11) = perturb_t - p%du(12) = perturb_t - ! Names - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_TRANSLATIONVEL) = .true. - FieldMask(MASKID_TRANSLATIONACC) = .true. - call PackMotionMesh_Names(u%TowerMotion, 'Tower', InitOut%LinNames_u, indexNames, FieldMask=FieldMask) - - - !------------------------------ - ! Blade root (3 blade limit!!!!) - ! Module/Mesh/Field: u%BladeRootMotion(1)%Orientation = 13; - ! Module/Mesh/Field: u%BladeRootMotion(2)%Orientation = 14; - ! Module/Mesh/Field: u%BladeRootMotion(3)%Orientation = 15; - indexNames=index - p%Jac_u_idxStartList%BladeRoot = index - do k = 1,p%NumBl_Lin - call SetJac_u_idx(13+k-1,13+k-1,u%BladeRootMotion(k)%NNodes,index) - end do - ! Perturbations - p%du(13) = perturb - p%du(14) = perturb - p%du(15) = perturb - ! Names - FieldMask = .false. - FieldMask(MASKID_Orientation) = .true. - do k = 1,p%NumBl_Lin - call PackMotionMesh_Names(u%BladeRootMotion(k), 'Blade root '//trim(num2lstr(k)), InitOut%LinNames_u, indexNames, FieldMask=FieldMask) - end do - end if ! .not. compAeroMaps - - - !------------------------------ - ! Blades (3 blade limit!!!!!) - ! Module/Mesh/Field: u%BladeMotion(1)%TranslationDisp = 16 + (bladenum-1)*6; - ! Module/Mesh/Field: u%BladeMotion(1)%Orientation = 17 + (bladenum-1)*6; - ! Module/Mesh/Field: u%BladeMotion(1)%TranslationVel = 18 + (bladenum-1)*6; - ! Module/Mesh/Field: u%BladeMotion(1)%RotationVel = 19 + (bladenum-1)*6; full lin only - ! Module/Mesh/Field: u%BladeMotion(1)%TranslationAcc = 20 + (bladenum-1)*6; full lin only - ! Module/Mesh/Field: u%BladeMotion(1)%RotationalAcc = 21 + (bladenum-1)*6; full lin only - if (.not. p_AD%CompAeroMaps) then ! full linearization - indexNames=index - p%Jac_u_idxStartList%Blade = index - call SetJac_u_idx(16,21,u%BladeMotion(1)%NNodes,index) - if (p%NumBl_Lin > 1) call SetJac_u_idx(22,27,u%BladeMotion(2)%NNodes,index) - if (p%NumBl_Lin > 2) call SetJac_u_idx(28,33,u%BladeMotion(3)%NNodes,index) - ! Perturbations - do k=1,p%NumBl_Lin - p%du(16 + (k-1)*6) = perturb_b(k) - p%du(17 + (k-1)*6) = perturb - p%du(18 + (k-1)*6) = perturb_b(k) - p%du(19 + (k-1)*6) = perturb - p%du(20 + (k-1)*6) = perturb_b(k) - p%du(21 + (k-1)*6) = perturb - end do - ! Names - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_TRANSLATIONVEL) = .true. - FieldMask(MASKID_ROTATIONVEL) = .true. - FieldMask(MASKID_TRANSLATIONACC) = .true. - FieldMask(MASKID_ROTATIONACC) = .true. - do k=1,p%NumBl_Lin - call PackMotionMesh_Names(u%BladeMotion(k), 'Blade '//trim(num2lstr(k)), InitOut%LinNames_u, indexNames, FieldMask=FieldMask) - end do - else - indexNames=index - p%Jac_u_idxStartList%Blade = index - call SetJac_u_idx(16,18,u%BladeMotion(1)%NNodes,index) - if (p%NumBl_Lin > 1) call SetJac_u_idx(22,24,u%BladeMotion(2)%NNodes,index) - if (p%NumBl_Lin > 2) call SetJac_u_idx(28,30,u%BladeMotion(3)%NNodes,index) - ! Perturbations - do k=1,p%NumBl_Lin - p%du(16 + (k-1)*6) = perturb_b(k) - p%du(17 + (k-1)*6) = perturb - p%du(18 + (k-1)*6) = perturb_b(k) - end do - ! Names - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_TRANSLATIONVEL) = .true. - do k=1,p%NumBl_Lin - call PackMotionMesh_Names(u%BladeMotion(k), 'Blade '//trim(num2lstr(k)), InitOut%LinNames_u, indexNames, FieldMask=FieldMask) - end do - endif - - - if (.not. p_AD%CompAeroMaps) then - !------------------------------ - ! UserProp - ! Module/Mesh/Field: u%UserProp(:,:) = 34,35,36; - p%Jac_u_idxStartList%UserProp = index - do k=1,size(u%UserProp,2) ! p%NumBlades - do i=1,size(u%UserProp,1) ! numNodes - p%Jac_u_indx(index,1) = 34 + k-1 - p%Jac_u_indx(index,2) = 1 !component index: this is a scalar, so 1, but is never used - p%Jac_u_indx(index,3) = i !Node: i - ! Names - InitOut%LinNames_u(index) = 'User property on blade '//trim(num2lstr(k))//', node '//trim(num2lstr(i))//', -' - ! RotFrame - InitOut%RotFrame_u(index) = .true. - index = index + 1 - end do !i - ! Perturbations - p%du(34 + k-1) = perturb - end do ! - - - !------------------------------ - ! Extended inputs (number of these must be exactly p%NumExtendedInputs) - ! Module/Mesh/Field: HWindSpeed = 37 - ! Module/Mesh/Field: PLexp = 38 - ! Module/Mesh/Field: PropagationDir = 39 - p%Jac_u_idxStartList%Extended = index - p%Jac_u_indx(index,1)=37; p%Jac_u_indx(index,2)=1; p%Jac_u_indx(index,3)=1; InitOut%LinNames_u(index) = 'Extended input: horizontal wind speed (steady/uniform wind), m/s'; index=index+1 - p%Jac_u_indx(index,1)=38; p%Jac_u_indx(index,2)=1; p%Jac_u_indx(index,3)=1; InitOut%LinNames_u(index) = 'Extended input: vertical power-law shear exponent, -'; index=index+1 - p%Jac_u_indx(index,1)=39; p%Jac_u_indx(index,2)=1; p%Jac_u_indx(index,3)=1; InitOut%LinNames_u(index) = 'Extended input: propagation direction, rad'; index=index+1 - ! Perturbations - p%du(37) = perturb - p%du(38) = perturb - p%du(39) = perturb - - end if ! .not. compAeroMaps - -contains - subroutine SetJac_u_idx(FieldIdxStart,FieldIdxEnd,nNodes,idx) - integer, intent(in ) :: FieldIdxStart - integer, intent(in ) :: FieldIdxEnd - integer, intent(in ) :: nNodes - integer, intent(inout) :: idx - integer :: i_meshField,i,j - do i_meshField = FieldIdxStart,FieldIdxEnd - do i=1,nNodes - do j=1,3 - p%Jac_u_indx(idx,1) = i_meshField - p%Jac_u_indx(idx,2) = j !component index: j - p%Jac_u_indx(idx,3) = i !Node: i - idx = idx + 1 - end do !j - end do !i - end do - end subroutine - - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - !if (Failed) call Cleanup() - end function Failed -END SUBROUTINE Init_Jacobian_u - - -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE Init_Jacobian_x( p, InitOut, ErrStat, ErrMsg) - TYPE(RotParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(RotInitOutputType) , INTENT(INOUT) :: InitOut !< Output for initialization routine - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Init_Jacobian_x' - - ! local variables: - INTEGER(IntKi) :: i, j, k, n, state - INTEGER(IntKi) :: nx - INTEGER(IntKi) :: nx1 - CHARACTER(25) :: NodeTxt - - ErrStat = ErrID_None - ErrMsg = "" - - - nx = p%BEMT%DBEMT%lin_nx + p%BEMT%UA%lin_nx + p%BEMT%lin_nx - - ! allocate space for the row/column names and for perturbation sizes - ! always allocate this in case it is size zero ... (we use size(p%dx) for many calculations) - CALL AllocAry(p%dx, nx, 'p%dx', ErrStat2, ErrMsg2); if (Failed()) return - if (nx==0) return - - CALL AllocAry(InitOut%LinNames_x, nx, 'LinNames_x', ErrStat2, ErrMsg2); if (Failed()) return - CALL AllocAry(InitOut%RotFrame_x, nx, 'RotFrame_x', ErrStat2, ErrMsg2); if (Failed()) return - CALL AllocAry(InitOut%DerivOrder_x, nx, 'DerivOrder_x', ErrStat2, ErrMsg2); if (Failed()) return - - ! All DBEMT continuous states are order = 2; UA states are order 1 - - ! set default perturbation sizes: p%dx - p%dx = 2.0_R8Ki * D2R_D - - ! set linearization output names: - nx1 = p%BEMT%DBEMT%lin_nx/2 - if (nx1>0) then - InitOut%DerivOrder_x(1:p%BEMT%DBEMT%lin_nx) = 2 - InitOut%RotFrame_x( 1:p%BEMT%DBEMT%lin_nx) = .true. - - k = 1 - do j=1,p%NumBlades ! size(x%BEMT%DBEMT%element,2) - do i=1,p%NumBlNds ! size(x%BEMT%DBEMT%element,1) - NodeTxt = 'blade '//trim(num2lstr(j))//', node '//trim(num2lstr(i)) - InitOut%LinNames_x(k) = 'vind (axial) at '//trim(NodeTxt)//', m/s' - k = k + 1 - - InitOut%LinNames_x(k) = 'vind (tangential) at '//trim(NodeTxt)//', m/s' - k = k + 1 - end do - end do - - do i=1,nx1 - InitOut%LinNames_x(i+nx1) = 'First time derivative of '//trim(InitOut%LinNames_x(i))//'/s' - InitOut%RotFrame_x(i+nx1) = InitOut%RotFrame_x(i) - end do - end if - - ! UA states - if (p%BEMT%UA%lin_nx>0) then - InitOut%DerivOrder_x(1+p%BEMT%DBEMT%lin_nx:nx) = 1 - InitOut%RotFrame_x( 1+p%BEMT%DBEMT%lin_nx:nx) = .true. - - k = 1 + p%BEMT%DBEMT%lin_nx - do n=1,p%BEMT%UA%lin_nx - i = p%BEMT%UA%lin_xIndx(n,1) - j = p%BEMT%UA%lin_xIndx(n,2) - state = p%BEMT%UA%lin_xIndx(n,3) - - p%dx(k) = p%BEMT%UA%dx(state) - - NodeTxt = 'x'//trim(num2lstr(state))//' blade '//trim(num2lstr(j))//', node '//trim(num2lstr(i)) - if (state<3) then - InitOut%LinNames_x(k) = trim(NodeTxt)//', rad' ! x1 and x2 are radians +contains + subroutine CalcExtOP() + if (.not. first) return + first = .false. + if (p%FlowField%FieldType == Uniform_FieldType) then + if (P%FlowField%VelInterpCubic) then + op = UniformField_InterpCubic(p%FlowField%Uniform, t) else - InitOut%LinNames_x(k) = trim(NodeTxt)//', -' ! x3, x4 (and x5) are units of cl or cn + op = UniformField_InterpLinear(p%FlowField%Uniform, t) end if - InitOut%DerivOrder_x(k) = 1 - InitOut%RotFrame_x(k) = .true. - - k = k + 1 - end do - end if - - ! BEMT states - if (p%BEMT%lin_nx>0) then - call SetErrStat(ErrID_Fatal,'Number of lin states for bem should be zero for now.', ErrStat, ErrMsg, RoutineName) - return - !k = 1 + p%BEMT%DBEMT%lin_nx + p%BEMT%UA%lin_nx - - !InitOut%DerivOrder_x(k:nx) = 1 - !InitOut%RotFrame_x( k:nx) = .false. - ! - !InitOut%LinNames_x(k ) = 'X-component of wake velocity, m/s' - !InitOut%LinNames_x(k+1) = 'Y-component of wake velocity, m/s' - !InitOut%LinNames_x(k+2) = 'Z-component of wake velocity, m/s' - end if -contains - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - !if (Failed) call Cleanup() - end function Failed -END SUBROUTINE Init_Jacobian_x - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. -!! Do not change the order of this packing without changing corresponding parts of AD linearization ! -SUBROUTINE Init_Jacobian( InputFileData, p, p_AD, u, y, m, InitOut, ErrStat, ErrMsg) - type(RotInputFile) , intent(in ) :: InputFileData !< input file data (for default blade perturbation) - TYPE(RotParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(AD_ParameterType) , INTENT(INOUT) :: p_AD !< parameters - TYPE(RotInputType) , INTENT(IN ) :: u !< inputs - TYPE(RotOutputType) , INTENT(IN ) :: y !< outputs - TYPE(RotMiscVarType) , INTENT(IN ) :: m !< miscellaneous variable - TYPE(RotInitOutputType) , INTENT(INOUT) :: InitOut !< Initialization output data (for Jacobian row/column names) - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Init_Jacobian' - - - ErrStat = ErrID_None - ErrMsg = "" - - if (p_AD%CompAeroMaps) then - p%NumBl_Lin = 1 - else - p%NumBl_Lin = p%NumBlades - end if - - call Init_Jacobian_y( p, p_AD, y, InitOut, ErrStat, ErrMsg) - - ! these matrices will be needed for linearization with frozen wake feature - if ( p%DBEMT_Mod == DBEMT_frozen ) then - call AllocAry(m%BEMT%AxInd_op,p%NumBlNds,p%numBlades,'m%BEMT%AxInd_op', ErrStat2,ErrMsg2); if (Failed()) return - call AllocAry(m%BEMT%TnInd_op,p%NumBlNds,p%numBlades,'m%BEMT%TnInd_op', ErrStat2,ErrMsg2); if (Failed()) return - end if - - call Init_Jacobian_u( InputFileData, p, p_AD, u, InitOut, ErrStat2, ErrMsg2); if (Failed()) return - - call Init_Jacobian_x( p, InitOut, ErrStat2, ErrMsg2); if (Failed()) return - -contains - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - !if (Failed) call Cleanup() - end function Failed -END SUBROUTINE Init_Jacobian - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine aerodyn::init_jacobian is consistant with this routine! -SUBROUTINE Perturb_u( p, n, perturb_sign, u, du ) - TYPE(RotParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(RotInputType) , INTENT(INOUT) :: u !< perturbed AD inputs - REAL( R8Ki ) , INTENT( OUT) :: du !< amount that specific input was perturbed - - ! local variables - INTEGER :: fieldIndx - INTEGER :: node - - fieldIndx = p%Jac_u_indx(n,2) - node = p%Jac_u_indx(n,3) - du = p%du( p%Jac_u_indx(n,1) ) - - ! determine which mesh we're trying to perturb and perturb the input: - SELECT CASE( p%Jac_u_indx(n,1) ) - - ! Nacelle - ! Module/Mesh/Field: u%NacelleMotion%TranslationDisp = 1; - ! Module/Mesh/Field: u%NacelleMotion%Orientation = 2; - case( 1); u%NacelleMotion%TranslationDisp(fieldIndx,node) = u%NacelleMotion%TranslationDisp(fieldIndx,node) + du * perturb_sign - case( 2); call PerturbOrientationMatrix( u%NacelleMotion%Orientation(:,:,node), du * perturb_sign, fieldIndx ) - - ! Hub - ! Module/Mesh/Field: u%HubMotion%TranslationDisp = 3; - ! Module/Mesh/Field: u%HubMotion%Orientation = 4; - ! Module/Mesh/Field: u%HubMotion%RotationVel = 5; - case( 3); u%HubMotion%TranslationDisp(fieldIndx,node) = u%HubMotion%TranslationDisp(fieldIndx,node) + du * perturb_sign - case( 4); call PerturbOrientationMatrix( u%HubMotion%Orientation(:,:,node), du * perturb_sign, fieldIndx ) - case( 5); u%HubMotion%RotationVel( fieldIndx,node) = u%HubMotion%RotationVel(fieldIndx,node) + du * perturb_sign - - ! TailFin - ! Module/Mesh/Field: u%TFinMotion%TranslationDisp = 6; - ! Module/Mesh/Field: u%TFinMotion%Orientation = 7; - ! Module/Mesh/Field: u%TFinMotion%TranslationVel = 8; - case( 6); u%TFinMotion%TranslationDisp(fieldIndx,node) = u%TFinMotion%TranslationDisp(fieldIndx,node) + du * perturb_sign - case( 7); call PerturbOrientationMatrix( u%TFinMotion%Orientation(:,:,node), du * perturb_sign, fieldIndx ) - case( 8); u%TFinMotion%TranslationVel( fieldIndx,node) = u%TFinMotion%TranslationVel(fieldIndx,node) + du * perturb_sign - - ! Tower - ! Module/Mesh/Field: u%TowerMotion%TranslationDisp = 9; - ! Module/Mesh/Field: u%TowerMotion%Orientation = 10; - ! Module/Mesh/Field: u%TowerMotion%TranslationVel = 11; - ! Module/Mesh/Field: u%TowerMotion%TranslationAcc = 12; - case( 9); u%TowerMotion%TranslationDisp(fieldIndx,node) = u%TowerMotion%TranslationDisp( fieldIndx,node) + du * perturb_sign - case(10); CALL PerturbOrientationMatrix( u%TowerMotion%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - case(11); u%TowerMotion%TranslationVel( fieldIndx,node) = u%TowerMotion%TranslationVel( fieldIndx,node) + du * perturb_sign - case(12); u%TowerMotion%TranslationAcc( fieldIndx,node) = u%TowerMotion%TranslationAcc(fieldIndx,node) + du * perturb_sign - - ! BladeRoot - ! Module/Mesh/Field: u%BladeRootMotion(1)%Orientation = 13; - ! Module/Mesh/Field: u%BladeRootMotion(2)%Orientation = 14; - ! Module/Mesh/Field: u%BladeRootMotion(3)%Orientation = 15; - case(13); call PerturbOrientationMatrix( u%BladeRootMotion(1)%Orientation(:,:,node), du * perturb_sign, fieldIndx ) - case(14); call PerturbOrientationMatrix( u%BladeRootMotion(2)%Orientation(:,:,node), du * perturb_sign, fieldIndx ) - case(15); call PerturbOrientationMatrix( u%BladeRootMotion(3)%Orientation(:,:,node), du * perturb_sign, fieldIndx ) - - ! Blade 1 - ! Module/Mesh/Field: u%BladeMotion(1)%TranslationDisp = 16; - ! Module/Mesh/Field: u%BladeMotion(1)%Orientation = 17; - ! Module/Mesh/Field: u%BladeMotion(1)%TranslationVel = 18; - ! Module/Mesh/Field: u%BladeMotion(1)%RotationVel = 19; - ! Module/Mesh/Field: u%BladeMotion(1)%TranslationAcc = 20; - ! Module/Mesh/Field: u%BladeMotion(1)%RotationalAcc = 21; - case(16); u%BladeMotion(1)%TranslationDisp(fieldIndx,node) = u%BladeMotion(1)%TranslationDisp(fieldIndx,node) + du * perturb_sign - case(17); call PerturbOrientationMatrix( u%BladeMotion(1)%Orientation(:,:,node), du * perturb_sign, fieldIndx ) - case(18); u%BladeMotion(1)%TranslationVel( fieldIndx,node) = u%BladeMotion(1)%TranslationVel(fieldIndx,node) + du * perturb_sign - case(19); u%BladeMotion(1)%RotationVel( fieldIndx,node) = u%BladeMotion(1)%RotationVel( fieldIndx,node) + du * perturb_sign - case(20); u%BladeMotion(1)%TranslationAcc( fieldIndx,node) = u%BladeMotion(1)%TranslationAcc(fieldIndx,node) + du * perturb_sign - case(21); u%BladeMotion(1)%RotationAcc( fieldIndx,node) = u%BladeMotion(1)%RotationAcc( fieldIndx,node) + du * perturb_sign - - ! Blade 2 - ! Module/Mesh/Field: u%BladeMotion(2)%TranslationDisp = 22; - ! Module/Mesh/Field: u%BladeMotion(2)%Orientation = 23; - ! Module/Mesh/Field: u%BladeMotion(2)%TranslationVel = 24; - ! Module/Mesh/Field: u%BladeMotion(2)%RotationVel = 25; - ! Module/Mesh/Field: u%BladeMotion(2)%TranslationAcc = 26; - ! Module/Mesh/Field: u%BladeMotion(2)%RotationalAcc = 27; - case(22); u%BladeMotion(2)%TranslationDisp(fieldIndx,node) = u%BladeMotion(2)%TranslationDisp(fieldIndx,node) + du * perturb_sign - case(23); call PerturbOrientationMatrix( u%BladeMotion(2)%Orientation(:,:,node), du * perturb_sign, fieldIndx ) - case(24); u%BladeMotion(2)%TranslationVel( fieldIndx,node) = u%BladeMotion(2)%TranslationVel(fieldIndx,node) + du * perturb_sign - case(25); u%BladeMotion(2)%RotationVel( fieldIndx,node) = u%BladeMotion(2)%RotationVel( fieldIndx,node) + du * perturb_sign - case(26); u%BladeMotion(2)%TranslationAcc( fieldIndx,node) = u%BladeMotion(2)%TranslationAcc(fieldIndx,node) + du * perturb_sign - case(27); u%BladeMotion(2)%RotationAcc( fieldIndx,node) = u%BladeMotion(2)%RotationAcc( fieldIndx,node) + du * perturb_sign - - ! Blade 3 - ! Module/Mesh/Field: u%BladeMotion(3)%TranslationDisp = 28; - ! Module/Mesh/Field: u%BladeMotion(3)%Orientation = 29; - ! Module/Mesh/Field: u%BladeMotion(3)%TranslationVel = 30; - ! Module/Mesh/Field: u%BladeMotion(3)%RotationVel = 31; - ! Module/Mesh/Field: u%BladeMotion(3)%TranslationAcc = 32; - ! Module/Mesh/Field: u%BladeMotion(3)%RotationalAcc = 33; - case(28); u%BladeMotion(3)%TranslationDisp(fieldIndx,node) = u%BladeMotion(3)%TranslationDisp(fieldIndx,node) + du * perturb_sign - case(29); call PerturbOrientationMatrix( u%BladeMotion(3)%Orientation(:,:,node), du * perturb_sign, fieldIndx ) - case(30); u%BladeMotion(3)%TranslationVel( fieldIndx,node) = u%BladeMotion(3)%TranslationVel(fieldIndx,node) + du * perturb_sign - case(31); u%BladeMotion(3)%RotationVel( fieldIndx,node) = u%BladeMotion(3)%RotationVel( fieldIndx,node) + du * perturb_sign - case(32); u%BladeMotion(3)%TranslationAcc( fieldIndx,node) = u%BladeMotion(3)%TranslationAcc(fieldIndx,node) + du * perturb_sign - case(33); u%BladeMotion(3)%RotationAcc( fieldIndx,node) = u%BladeMotion(3)%RotationAcc( fieldIndx,node) + du * perturb_sign - - ! UserProp - ! Module/Mesh/Field: u%UserProp(:,:) = 34,35,36; - case(34); u%UserProp(node,1) = u%UserProp(node,1) + du * perturb_sign - case(35); u%UserProp(node,2) = u%UserProp(node,2) + du * perturb_sign - case(36); u%UserProp(node,3) = u%UserProp(node,3) + du * perturb_sign - - END SELECT - -END SUBROUTINE Perturb_u - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array extended inputs (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine aerodyn::init_jacobian is consistant with this routine! -subroutine Perturb_uExtend( t, u_perturb, FlowField_perturb, RotInflow_perturb, p, OtherState, n, perturb_sign, u, du, ErrStat, ErrMsg ) - real(DbKi), intent(in ) :: t !< Time in seconds at operating point - type(RotInputType), intent(inout) :: u_perturb - type(FLowFieldType),pointer, intent(inout) :: FlowField_perturb !< perturbed flowfield (only the uniform wind) - type(RotInflowType), intent(inout) :: RotInflow_perturb !< Rotor inflow, perturbed by FlowField extended inputs - type(RotParameterType), intent(in ) :: p !< parameters - type(RotOtherStateType), intent(in ) :: OtherState !< Other states at operating point - integer( IntKi ), intent(in ) :: n !< number of array element to use - integer( IntKi ), intent(in ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - type(RotInputType), intent(inout) :: u !< perturbed AD inputs - real( R8Ki ), intent( out) :: du !< amount that specific input was perturbed - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - integer :: fieldIndx - integer :: node - real(R8Ki) :: FlowField_du(3) !< vector of perturbations to apply to flow field - integer(intKi) :: StartNode - - ! Error handling - ErrStat = ErrID_None - ErrMsg = "" - - fieldIndx = p%Jac_u_indx(n,2) - node = p%Jac_u_indx(n,3) - du = p%du( p%Jac_u_indx(n,1) ) - StartNode = 1 ! ignored during linearization since cannot linearize with ExtInflow - - ! determine which mesh we're trying to perturb and perturb the input: - select case( p%Jac_u_indx(n,1) ) - ! Extended inputs - ! Module/Mesh/Field: HWindSpeed = 37 - ! Module/Mesh/Field: PLexp = 38 - ! Module/Mesh/Field: PropagationDir = 39 - case(37,38,39) - FlowField_du = 0.0_R8Ki - select case( p%Jac_u_indx(n,1) ) - case (37); FlowField_du(1) = du *perturb_sign - case (38); FlowField_du(2) = du *perturb_sign - case (39); FlowField_du(3) = du *perturb_sign - end select - call IfW_UniformWind_Perturb(FlowField_perturb, FlowField_du) - end select - call AD_CalcWind_Rotor(t, u_perturb, FlowField_perturb, p, RotInflow_perturb, StartNode, ErrStat, ErrMsg) -end subroutine Perturb_uExtend - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine aerodyn::init_jacobian is consistant with this routine! -SUBROUTINE Perturb_x( p, n, perturb_sign, x, dx ) - TYPE(RotParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(RotContinuousStateType) , INTENT(INOUT) :: x !< perturbed AD continuous states - REAL( R8Ki ) , INTENT( OUT) :: dx !< amount that specific input was perturbed - - ! local variables - INTEGER(IntKi) :: Blade ! loop over blade nodes - INTEGER(IntKi) :: BladeNode ! loop over blades - INTEGER(IntKi) :: StateIndex ! which state we are perturbing - INTEGER(IntKi) :: n_tmp ! - - - dx = p%dx( n ) - - if (n <= p%BEMT%DBEMT%lin_nx) then - - if (n <= p%BEMT%DBEMT%lin_nx/2) then ! x_p%BEMT%DBEMT%element(i,j)%vind, else x_p%BEMT%DBEMT%element(i,j)%vind_1 - call GetStateIndices( n, size(x%BEMT%DBEMT%element,2), size(x%BEMT%DBEMT%element,1), size(x%BEMT%DBEMT%element(1,1)%vind), Blade, BladeNode, StateIndex ) - x%BEMT%DBEMT%element(BladeNode,Blade)%vind(StateIndex) = x%BEMT%DBEMT%element(BladeNode,Blade)%vind(StateIndex) + dx * perturb_sign - else - call GetStateIndices( n - p%BEMT%DBEMT%lin_nx/2, size(x%BEMT%DBEMT%element,2), size(x%BEMT%DBEMT%element,1), size(x%BEMT%DBEMT%element(1,1)%vind_1), Blade, BladeNode, StateIndex ) - x%BEMT%DBEMT%element(BladeNode,Blade)%vind_1(StateIndex) = x%BEMT%DBEMT%element(BladeNode,Blade)%vind_1(StateIndex) + dx * perturb_sign - endif - - else - - n_tmp = n - p%BEMT%DBEMT%lin_nx - - if (n_tmp <= p%BEMT%UA%lin_nx) then - BladeNode = p%BEMT%UA%lin_xIndx(n_tmp,1) ! node - Blade = p%BEMT%UA%lin_xIndx(n_tmp,2) ! blade - StateIndex = p%BEMT%UA%lin_xIndx(n_tmp,3) ! state - - x%BEMT%UA%element(BladeNode,Blade)%x(StateIndex) = x%BEMT%UA%element(BladeNode,Blade)%x(StateIndex) + dx * perturb_sign else - StateIndex = n_tmp - p%BEMT%UA%lin_nx - x%BEMT%V_w(StateIndex) = x%BEMT%V_w(StateIndex) + dx * perturb_sign + op%VelH = 0.0_ReKi + op%ShrV = 0.0_ReKi + op%AngleH = 0.0_ReKi end if - end if - -contains - subroutine GetStateIndices( Indx, NumberOfBlades, NumberOfElementsPerBlade, NumberOfStatesPerElement, Blade, BladeNode, StateIndex ) - - integer(IntKi), intent(in ) :: Indx - integer(IntKi), intent(in ) :: NumberOfBlades !< how many blades (size of array) - integer(IntKi), intent(in ) :: NumberOfElementsPerBlade !< how many nodes per blades (size of array) - integer(IntKi), intent(in ) :: NumberOfStatesPerElement !< how many states at each blade element - - integer(IntKi), intent( out) :: Blade - integer(IntKi), intent( out) :: BladeNode - integer(IntKi), intent( out) :: StateIndex - - integer(IntKi) :: CheckNum - - - StateIndex = mod(Indx-1, NumberOfStatesPerElement ) + 1 ! returns a number in [1,NumberOfStatesPerElement] - - CheckNum = (Indx - StateIndex)/NumberOfStatesPerElement - BladeNode = mod(CheckNum, NumberOfElementsPerBlade ) + 1 ! returns a number in [1,NumberOfElementsPerBlade] - - Blade = (CheckNum - BladeNode + 1)/NumberOfElementsPerBlade + 1 - - end subroutine GetStateIndices -END SUBROUTINE Perturb_x - + end subroutine +end subroutine !---------------------------------------------------------------------------------------------------------------------------------- !> This routine uses values of two output types to compute an array of differences. @@ -7708,7 +7116,6 @@ SUBROUTINE Compute_dY(p, p_AD, y_p, y_m, delta_p, delta_m, dY) END SUBROUTINE Compute_dY - !---------------------------------------------------------------------------------------------------------------------------------- !> This routine uses values of two continuous state types to compute an array of differences. !! Do not change this packing without making sure subroutine aerodyn::init_jacobian is consistant with this routine! @@ -7772,7 +7179,7 @@ END SUBROUTINE Compute_dX !------------------------------------------------------------------------------------------------------- !> This routine calculates nacelle drag loads on a turbine. -SUBROUTINE computeNacelleDrag( u, p, m, y, RotInflow, ErrStat, ErrMsg ) +SUBROUTINE RotCalcNacelleDrag( u, p, m, y, RotInflow, ErrStat, ErrMsg ) TYPE(RotInputType) , INTENT(IN ) :: u !< AD inputs - used for mesh node positions TYPE(RotParameterType) , INTENT(IN ) :: p !< Parameters @@ -7847,7 +7254,7 @@ SUBROUTINE computeNacelleDrag( u, p, m, y, RotInflow, ErrStat, ErrMsg ) -END SUBROUTINE computeNacelleDrag +END SUBROUTINE RotCalcNacelleDrag !---------------------------------------------------------------------------------------------------------------------------------- END MODULE AeroDyn diff --git a/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 b/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 index c3cdd0febf..240a07ffe9 100644 --- a/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 +++ b/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 @@ -1526,7 +1526,7 @@ SUBROUTINE BldNdOuts_SetOutParam(BldNd_OutList, p, p_AD, ErrStat, ErrMsg ) ! ..... Developer must add checking for invalid inputs here: ..... - if (.not. p%Buoyancy) then + if ( p%MHK == MHK_None ) then InvalidOutput( BldNd_Fbxi ) = .true. InvalidOutput( BldNd_Fbyi ) = .true. InvalidOutput( BldNd_Fbzi ) = .true. diff --git a/modules/aerodyn/src/AeroDyn_Driver.f90 b/modules/aerodyn/src/AeroDyn_Driver.f90 index 63b9eaef79..fb23ead32e 100644 --- a/modules/aerodyn/src/AeroDyn_Driver.f90 +++ b/modules/aerodyn/src/AeroDyn_Driver.f90 @@ -41,12 +41,12 @@ program AeroDyn_Driver ! ----- dat%initialized=.false. - call Dvr_Init(dat%dvr, dat%ADI, dat%FED, dat%errStat, dat%errMsg); call CheckError() + call Dvr_Init(dat%dvr, dat%ADI, dat%FED, dat%SeaSt, dat%errStat, dat%errMsg); call CheckError() do iCase= 1,dat%dvr%numCases ! Initial case - call Dvr_InitCase(iCase, dat%dvr, dat%ADI, dat%FED, dat%errStat, dat%errMsg); call CheckError() + call Dvr_InitCase(iCase, dat%dvr, dat%ADI, dat%FED, dat%SeaSt, dat%errStat, dat%errMsg); call CheckError() dat%initialized=.true. ! Init of time estimator @@ -58,7 +58,7 @@ program AeroDyn_Driver ! One time loop do nt = 1, dat%dvr%numSteps - call Dvr_TimeStep(nt, dat%dvr, dat%ADI, dat%FED, dat%errStat, dat%errMsg); call CheckError() + call Dvr_TimeStep(nt, dat%dvr, dat%ADI, dat%FED, dat%SeaSt, dat%errStat, dat%errMsg); call CheckError() ! Time update to screen t_global=nt*dat%dvr%dt !if (dat%dvr%analysisType/=idAnalysisCombi) then diff --git a/modules/aerodyn/src/AeroDyn_Driver_Registry.txt b/modules/aerodyn/src/AeroDyn_Driver_Registry.txt index 47c55804f2..64ea7e4a2a 100644 --- a/modules/aerodyn/src/AeroDyn_Driver_Registry.txt +++ b/modules/aerodyn/src/AeroDyn_Driver_Registry.txt @@ -13,6 +13,7 @@ include Registry_NWTC_Library.txt usefrom AeroDyn_Registry.txt usefrom AeroDyn_Inflow_Registry.txt +usefrom SeaState.txt # # ..... Table of combined cases to run ....................................................................................................... typedef AeroDyn_Driver/AD_Dvr Dvr_Case ReKi HWindSpeed - - - "Hub wind speed" "m/s" @@ -152,13 +153,14 @@ typedef ^ ^ IntKi iTimeSe typedef ^ ^ character(1024) root - - - "Output file rootname" "-" typedef ^ ^ Dvr_Outputs out - - - "data for driver output file" "-" typedef ^ ^ ADI_IW_InputData IW_InitInp - - - "" - +typedef ^ ^ SeaSt_InitInputType SS_InitInp - - - "" - # ..... Data to wrap the driver .......................................................................................................... -typedef ^ AllData Dvr_SimData dvr - - - "Driver data" - -typedef ^ ^ ADI_Data ADI - - - "AeroDyn InflowWind Data" - -typedef ^ ^ FED_Data FED - - - "Elastic wind turbine data (Fake ElastoDyn)" "-" -typedef ^ ^ IntKi errStat - - - "" - -typedef ^ ^ character(ErrMsgLen) errMsg - - - "" - -typedef ^ ^ logical initialized - - - "" - - +typedef ^ AllData Dvr_SimData dvr - - - "Driver data" - +typedef ^ ^ ADI_Data ADI - - - "AeroDyn InflowWind Data" - +typedef ^ ^ FED_Data FED - - - "Elastic wind turbine data (Fake ElastoDyn)" "-" +typedef ^ ^ IntKi errStat - - - "" - +typedef ^ ^ character(ErrMsgLen) errMsg - - - "" - +typedef ^ ^ logical initialized - - - "" - +typedef ^ ^ SeaState_Data SeaSt - - - "SeaState data" - diff --git a/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 b/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 index 2328a3530f..f00ce5cb57 100644 --- a/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 +++ b/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 @@ -24,6 +24,7 @@ module AeroDyn_Driver_Subs use AeroDyn_Inflow, only: concatOutputHeaders use AeroDyn_Inflow, only: Init_MeshMap_For_ADI, Set_Inputs_For_ADI use AeroDyn_IO, only: AD_WrVTK_Surfaces, AD_WrVTK_LinesPoints + use SeaState, only: SeaSt_Init, SeaSt_CalcOutput use AeroDyn_Driver_Types use AeroDyn @@ -90,10 +91,11 @@ module AeroDyn_Driver_Subs !---------------------------------------------------------------------------------------------------------------------------------- !> -subroutine Dvr_Init(dvr, ADI, FED, errStat, errMsg ) +subroutine Dvr_Init(dvr, ADI, FED, SeaSt, errStat, errMsg ) type(Dvr_SimData), intent( out) :: dvr !< driver data type(ADI_Data), intent( out) :: ADI !< AeroDyn/InflowWind data type(FED_Data), intent( out) :: FED !< Elastic wind turbine data (Fake ElastoDyn) + type(SeaState_Data), intent( out) :: SeaSt !< SeaState data integer(IntKi) , intent( out) :: errStat !< Status of error message character(*) , intent( out) :: errMsg !< Error message if errStat /= ErrID_None ! local variables @@ -138,13 +140,15 @@ end subroutine Dvr_Init !---------------------------------------------------------------------------------------------------------------------------------- !> -subroutine Dvr_InitCase(iCase, dvr, ADI, FED, errStat, errMsg ) - integer(IntKi) , intent(in ) :: iCase - type(Dvr_SimData), intent(inout) :: dvr !< driver data - type(ADI_Data), intent(inout) :: ADI !< AeroDyn/InflowWind data - type(FED_Data), intent(inout) :: FED !< Elastic wind turbine data (Fake ElastoDyn) - integer(IntKi) , intent( out) :: errStat ! Status of error message - character(*) , intent( out) :: errMsg ! Error message if errStat /= ErrID_None +subroutine Dvr_InitCase(iCase, dvr, ADI, FED, SeaSt, errStat, errMsg ) + integer(IntKi) , intent(in ) :: iCase + type(Dvr_SimData) , intent(inout) :: dvr !< driver data + type(ADI_Data) , intent(inout) :: ADI !< AeroDyn/InflowWind data + type(FED_Data) , intent(inout) :: FED !< Elastic wind turbine data (Fake ElastoDyn) + type(SeaState_Data) , intent(inout) :: SeaSt !< SeaState data + integer(IntKi) , intent( out) :: errStat ! Status of error message + character(*) , intent( out) :: errMsg ! Error message if errStat /= ErrID_None + ! local variables integer(IntKi) :: errStat2 ! local status of error message character(ErrMsgLen) :: errMsg2 ! local error message if errStat /= ErrID_None @@ -239,7 +243,38 @@ subroutine Dvr_InitCase(iCase, dvr, ADI, FED, errStat, errMsg ) ! Compute driver outputs at t=0 call Set_Mesh_Motion(0, dvr, ADI, FED, errStat2, errMsg2); if(Failed()) return - ! --- Initialze AD inputs + ! --- Initialize SeaState + if ( dvr%SS_InitInp%CompSeaSt == 1 ) then + + SeaSt%InitInp%Gravity = 9.80665_ReKi + SeaSt%InitInp%hasIce = .FALSE. + SeaSt%InitInp%defWtrDens = dvr%FldDens + SeaSt%InitInp%defWtrDpth = dvr%WtrDpth + SeaSt%InitInp%defMSL2SWL = dvr%MSL2SWL + SeaSt%InitInp%MHK = dvr%MHK + SeaSt%InitInp%UseInputFile = .TRUE. + SeaSt%InitInp%Linearize = .FALSE. + SeaSt%InitInp%InputFile = dvr%SS_InitInp%InputFile + SeaSt%InitInp%OutRootName = trim(dvr%out%Root)//'.SEA' + SeaSt%InitInp%TMax = dvr%TMax + + IF ( dvr%MHK .NE. 0_IntKi .AND. dvr%IW_InitInp%CompInflow == 1) THEN + SeaSt%InitInp%hasCurrField = .TRUE. + SeaSt%InitInp%CurrField => ADI%p%AD%FlowField + ELSE + SeaSt%InitInp%hasCurrField = .FALSE. + END IF + + CALL SeaSt_Init( SeaSt%InitInp, SeaSt%u, SeaSt%p, SeaSt%x, SeaSt%xd, SeaSt%z, SeaSt%OtherState, SeaSt%y, SeaSt%m, dvr%dt, SeaSt%InitOut, ErrStat, ErrMsg ) + ADI%p%AD%WaveField => SeaSt%InitOut%WaveField + + if (iCase==1) then + call concatOutputHeaders(dvr%out%WriteOutputHdr, dvr%out%WriteOutputUnt, SeaSt%InitOut%WriteOutputHdr, SeaSt%InitOut%WriteOutputUnt, errStat2, errMsg2); if(Failed()) return + endif + + end if + + ! --- Initialize AD inputs DO j = 1-numInp, 0 call Shift_ADI_Inputs(j,dvr, ADI, errStat2, errMsg2); if(Failed()) return call Set_Inputs_For_ADI(ADI%u(1), FED, errStat2, errMsg2); if(Failed()) return @@ -274,11 +309,12 @@ end subroutine Dvr_InitCase !---------------------------------------------------------------------------------------------------------------------------------- !> Perform one time step -subroutine Dvr_TimeStep(nt, dvr, ADI, FED, errStat, errMsg) +subroutine Dvr_TimeStep(nt, dvr, ADI, FED, SeaSt, errStat, errMsg) integer(IntKi) , intent(in ) :: nt ! next time step (current time is nt-1) type(Dvr_SimData), intent(inout) :: dvr ! driver data type(ADI_Data), intent(inout) :: ADI ! Input data for initialization (intent out for getting AD WriteOutput names/units) type(FED_Data), intent(inout) :: FED ! Elastic wind turbine data (Fake ElastoDyn) + type(SeaState_Data) , intent(inout) :: SeaSt !< SeaState data integer(IntKi) , intent( out) :: errStat ! Status of error message character(*) , intent( out) :: errMsg ! Error message if errStat /= ErrID_None ! local variables @@ -301,8 +337,11 @@ subroutine Dvr_TimeStep(nt, dvr, ADI, FED, errStat, errMsg) ! Calculate outputs at nt - 1 (current time) call ADI_CalcOutput(time, ADI%u(2), ADI%p, ADI%x(1), ADI%xd(1), ADI%z(1), ADI%OtherState(1), ADI%y, ADI%m, errStat2, errMsg2 ); if(Failed()) return + ! Call SeaSt_CalcOutput for writing to the file + call SeaSt_CalcOutput( time, SeaSt%u, SeaSt%p, SeaSt%x, SeaSt%xd, SeaSt%z, SeaSt%OtherState, SeaSt%y, SeaSt%m, errStat2, errMsg2 ) + ! Write outputs for all turbines at nt-1 - call Dvr_WriteOutputs(nt, time, dvr, dvr%out, ADI%y, errStat2, errMsg2); if(Failed()) return + call Dvr_WriteOutputs(nt, time, dvr, dvr%out, ADI%y, SeaSt, errStat2, errMsg2); if(Failed()) return ! We store the "driver-level" outputs only now, above, the old outputs are used call Dvr_CalcOutputDriver(dvr, ADI%y, FED, errStat, errMsg) @@ -478,6 +517,9 @@ subroutine Init_ADI_ForDriver(iCase, ADI, dvr, FED, dt, needInitIW, errStat, err InitInp%IW_InitInp%MHK = dvr%MHK InitInp%IW_InitInp%OutputAccel= dvr%MHK /= MHK_None InitInp%IW_InitInp%FilePassingMethod = 0_IntKi ! read input file instead of passed file data + InitInp%IW_InitInp%WtrDpth = dvr%WtrDpth + InitInp%IW_InitInp%MSL2SWL = dvr%MSL2SWL + InitInp%IW_InitInp%RootName = trim(dvr%out%Root) ! AeroDyn InitInp%AD%Gravity = 9.80665_ReKi InitInp%AD%RootName = dvr%out%Root @@ -490,6 +532,7 @@ subroutine Init_ADI_ForDriver(iCase, ADI, dvr, FED, dt, needInitIW, errStat, err InitInp%AD%defPvap = dvr%Pvap InitInp%AD%WtrDpth = dvr%WtrDpth InitInp%AD%MSL2SWL = dvr%MSL2SWL + InitInp%AD%CompSeaSt = dvr%SS_InitInp%CompSeaSt /=0 ! Init data per rotor allocate(InitInp%AD%rotors(dvr%numTurbines), stat=errStat) if (errStat/=0) then @@ -986,7 +1029,7 @@ subroutine Dvr_ReadInputFile(fileName, dvr, errStat, errMsg ) call ParseCom(FileInfo_In, CurLine, Line, errStat2, errMsg2, unEc); if (Failed()) return call ParseVar(FileInfo_In, CurLine, "compInflow", dvr%IW_InitInp%compInflow , errStat2, errMsg2, unEc); if (Failed()) return call ParseVar(FileInfo_In, CurLine, "InflowFile", dvr%IW_InitInp%InputFile, errStat2, errMsg2, unEc, IsPath=.true.); if (Failed()) return - if (dvr%IW_InitInp%compInflow==0) then + if (dvr%IW_InitInp%compInflow/=1) then call ParseVar(FileInfo_In, CurLine, "HWindSpeed", dvr%IW_InitInp%HWindSpeed , errStat2, errMsg2, unEc); if (Failed()) return call ParseVar(FileInfo_In, CurLine, "RefHt" , dvr%IW_InitInp%RefHt , errStat2, errMsg2, unEc); if (Failed()) return call ParseVar(FileInfo_In, CurLine, "PLExp" , dvr%IW_InitInp%PLExp , errStat2, errMsg2, unEc); if (Failed()) return @@ -999,8 +1042,14 @@ subroutine Dvr_ReadInputFile(fileName, dvr, errStat, errMsg ) dvr%IW_InitInp%HWindSpeed = myNaN endif + ! --- SeaState data + call ParseCom(FileInfo_In, CurLine, Line, errStat2, errMsg2, unEc); if (Failed()) return + call ParseVar(FileInfo_In, CurLine, "CompSeaSt" , dvr%SS_InitInp%CompSeaSt , errStat2, errMsg2, unEc); if (Failed()) return + call ParseVar(FileInfo_In, CurLine, "SeaStFile" , dvr%SS_InitInp%InputFile , errStat2, errMsg2, unEc); if (Failed()) return + if (PathIsRelative(dvr%AD_InputFile)) dvr%AD_InputFile = trim(PriPath)//trim(dvr%AD_InputFile) if (PathIsRelative(dvr%IW_InitInp%InputFile)) dvr%IW_InitInp%InputFile = trim(PriPath)//trim(dvr%IW_InitInp%InputFile) + if (PathIsRelative(dvr%SS_InitInp%InputFile)) dvr%SS_InitInp%InputFile = trim(PriPath)//trim(dvr%SS_InitInp%InputFile) ! --- Turbines call ParseCom(FileInfo_In, CurLine, Line, errStat2, errMsg2, unEc); if (Failed()) return @@ -1356,10 +1405,15 @@ subroutine ValidateInputs(dvr, errStat, errMsg) ! Turbine Data: !if ( dvr%numBlades < 1 ) call SetErrStat( ErrID_Fatal, "There must be at least 1 blade (numBlades).", errStat, ErrMsg, RoutineName) ! Combined-Case Analysis: - if (dvr%MHK /= MHK_None .and. dvr%MHK /= MHK_FixedBottom .and. dvr%MHK /= MHK_Floating) call SetErrStat(ErrID_Fatal, 'MHK switch must be 0, 1, or 2.', ErrStat, ErrMsg, RoutineName) - if (dvr%DT < epsilon(0.0_ReKi) ) call SetErrStat(ErrID_Fatal,'dT must be larger than 0.',errStat, errMsg,RoutineName) if (Check(.not.(ANY((/0,1/) == dvr%IW_InitInp%compInflow) ), 'CompInflow needs to be 0 or 1')) return + if (Check(.not.(ANY((/0,1/) == dvr%SS_InitInp%CompSeaSt) ), 'CompSeaSt needs to be 0 or 1')) return + + if (dvr%MHK /= MHK_None .and. dvr%MHK /= MHK_FixedBottom .and. dvr%MHK /= MHK_Floating) call SetErrStat(ErrID_Fatal, 'MHK switch must be 0, 1, or 2.', ErrStat, ErrMsg, RoutineName) + + if (dvr%MHK /= MHK_None .and. dvr%SS_InitInp%CompSeaSt == 1 .and. dvr%IW_InitInp%CompInflow /= 1) call SetErrStat( ErrID_Fatal, 'InflowWind must be activated for MHK turbines when SeaState is used.', ErrStat, ErrMsg, RoutineName ) + + if (dvr%MHK == MHK_None .and. dvr%SS_InitInp%CompSeaSt /= 0) call SetErrStat( ErrID_Fatal, 'SeaState cannot be used with wind turbines.', ErrStat, ErrMsg, RoutineName ) if (Check(.not.(ANY(idAnalysisVALID == dvr%analysisType )), 'Analysis type not supported: '//trim(Num2LStr(dvr%analysisType)) )) return @@ -1481,6 +1535,9 @@ subroutine Dvr_InitializeOutputs(nWT, out, numSteps, errStat, errMsg) end do ! i write (out%unOutFile(iWT),'()') enddo + if (nWT==0) then + ! Special case, no turbine, TODO + endif endif ! --- Binary @@ -1652,26 +1709,43 @@ subroutine Dvr_CalcOutputDriver(dvr, y_ADI, FED, errStat, errMsg) end subroutine Dvr_CalcOutputDriver !---------------------------------------------------------------------------------------------------------------------------------- -subroutine Dvr_WriteOutputs(nt, t, dvr, out, yADI, errStat, errMsg) +subroutine Dvr_WriteOutputs(nt, t, dvr, out, yADI, SeaSt, errStat, errMsg) integer(IntKi) , intent(in ) :: nt ! simulation time step real(DbKi) , intent(in ) :: t ! simulation time (s) - type(Dvr_SimData), intent(inout) :: dvr ! driver data + type(Dvr_SimData) , intent(inout) :: dvr ! driver data type(Dvr_Outputs) , intent(inout) :: out ! driver uotput options type(ADI_OutputType) , intent(in ) :: yADI ! aerodyn outputs + type(SeaState_Data) , intent(inout) :: SeaSt ! SeaState data integer(IntKi) , intent(inout) :: errStat ! Status of error message character(*) , intent(inout) :: errMsg ! Error message if errStat /= ErrID_None ! Local variables. character(ChanLen) :: tmpStr ! temporary string to print the time output as text - integer :: nDV , nAD, nIW, iWT, k, j + integer :: nDV , nAD, nIW, nSS, iWT, k, j real(ReKi) :: rotations(3) integer(IntKi) :: errStat2 ! Status of error message character(ErrMsgLen) :: errMsg2 ! Error message errStat = ErrID_None errMsg = '' + IF ( .not. allocated( SeaSt%y%WriteOutput ) ) then + call AllocAry ( SeaSt%y%WriteOutput, SeaSt%p%NumOuts, 'WriteOutputSS', errStat, errMsg ) + + IF ( ErrStat /= 0 ) THEN + ErrMsg = ' Error allocating memory for the SeaState WriteOutput array.' + ErrStat = ErrID_Fatal + RETURN + END IF + SeaSt%y%WriteOutput = 0.0_ReKi + END IF + ! Packing all outputs excpet time into one array - nAD = size(yADI%AD%rotors(1)%WriteOutput) + if (size(yADI%AD%rotors)>=1) then + nAD = size(yADI%AD%rotors(1)%WriteOutput) + else + nAD = 0 + endif nIW = size(yADI%IW_WriteOutput) + nSS = size(SeaSt%y%WriteOutput) nDV = out%nDvrOutputs do iWT = 1, dvr%numTurbines if (dvr%wt(iWT)%numBlades >0 ) then ! TODO, export for tower only @@ -1679,8 +1753,9 @@ subroutine Dvr_WriteOutputs(nt, t, dvr, out, yADI, errStat, errMsg) out%outLine(1:nDV) = dvr%wt(iWT)%WriteOutput(1:nDV) ! Driver Write Outputs ! out%outLine(11) = dvr%WT(iWT)%hub%azimuth ! azimuth already stored a nt-1 - out%outLine(nDV+1:nDV+nIW) = yADI%IW_WriteOutput ! InflowWind WriteOutputs - out%outLine(nDV+nIW+1:) = yADI%AD%rotors(iWT)%WriteOutput ! AeroDyn WriteOutputs + out%outLine(nDV+1:nDV+nIW) = yADI%IW_WriteOutput ! InflowWind WriteOutputs + out%outLine(nDV+nIW+1:nDV+nIW+nAD) = yADI%AD%rotors(iWT)%WriteOutput ! AeroDyn WriteOutputs + out%outLine(nDV+nIW+nAD+1:) = SeaSt%y%WriteOutput ! SeaState WriteOutputs if (out%fileFmt==idFmtBoth .or. out%fileFmt == idFmtAscii) then ! ASCII @@ -1693,7 +1768,7 @@ subroutine Dvr_WriteOutputs(nt, t, dvr, out, yADI, errStat, errMsg) endif if (out%fileFmt==idFmtBoth .or. out%fileFmt == idFmtBinary) then ! Store for binary - out%storage(1:nDV+nIW+nAD, nt, iWT) = out%outLine(1:nDV+nIW+nAD) + out%storage(1:nDV+nIW+nAD+nSS, nt, iWT) = out%outLine(1:nDV+nIW+nAD+nSS) endif endif enddo @@ -1796,11 +1871,15 @@ subroutine setVTKParameters(DVR_Outs, dvr, ADI, errStat, errMsg, dirname) ! Get radius for ground (blade length + hub radius): GroundRad = MaxBladeLength + MaxTwrLength+ DVR_Outs%VTKHubRad ! write the ground or seabed reference polygon: - RefPoint(1:2) = dvr%WT(1)%originInit(1:2) - do iWT=2,dvr%numTurbines - RefPoint(1:2) = RefPoint(1:2) + dvr%WT(iWT)%originInit(1:2) - end do - RefPoint(1:2) = RefPoint(1:2) / dvr%numTurbines + if (dvr%numTurbines>0) then + RefPoint(1:2) = dvr%WT(1)%originInit(1:2) + do iWT=2,dvr%numTurbines + RefPoint(1:2) = RefPoint(1:2) + dvr%WT(iWT)%originInit(1:2) + end do + RefPoint(1:2) = RefPoint(1:2) / dvr%numTurbines + else + RefPoint(1:3) = 0.0_ReKi + endif RefPoint(3) = 0.0_ReKi RefLengths = GroundRad + sqrt((WorldBoxMax(1)-WorldBoxMin(1))**2 + (WorldBoxMax(2)-WorldBoxMin(2))**2) diff --git a/modules/aerodyn/src/AeroDyn_Driver_Types.f90 b/modules/aerodyn/src/AeroDyn_Driver_Types.f90 index f1122aded8..fd0ed3e19a 100644 --- a/modules/aerodyn/src/AeroDyn_Driver_Types.f90 +++ b/modules/aerodyn/src/AeroDyn_Driver_Types.f90 @@ -186,6 +186,7 @@ MODULE AeroDyn_Driver_Types character(1024) :: root !< Output file rootname [-] TYPE(Dvr_Outputs) :: out !< data for driver output file [-] TYPE(ADI_IW_InputData) :: IW_InitInp !< [-] + TYPE(SeaSt_InitInputType) :: SS_InitInp !< [-] END TYPE Dvr_SimData ! ======================= ! ========= AllData ======= @@ -196,9 +197,11 @@ MODULE AeroDyn_Driver_Types INTEGER(IntKi) :: errStat = 0_IntKi !< [-] character(ErrMsgLen) :: errMsg !< [-] LOGICAL :: initialized = .false. !< [-] + TYPE(SeaState_Data) :: SeaSt !< SeaState data [-] END TYPE AllData ! ======================= -CONTAINS + +contains subroutine AD_Dvr_CopyDvr_Case(SrcDvr_CaseData, DstDvr_CaseData, CtrlCode, ErrStat, ErrMsg) type(Dvr_Case), intent(in) :: SrcDvr_CaseData @@ -1200,6 +1203,9 @@ subroutine AD_Dvr_CopyDvr_SimData(SrcDvr_SimDataData, DstDvr_SimDataData, CtrlCo call ADI_CopyIW_InputData(SrcDvr_SimDataData%IW_InitInp, DstDvr_SimDataData%IW_InitInp, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call SeaSt_CopyInitInput(SrcDvr_SimDataData%SS_InitInp, DstDvr_SimDataData%SS_InitInp, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine AD_Dvr_DestroyDvr_SimData(Dvr_SimDataData, ErrStat, ErrMsg) @@ -1238,6 +1244,8 @@ subroutine AD_Dvr_DestroyDvr_SimData(Dvr_SimDataData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call ADI_DestroyIW_InputData(Dvr_SimDataData%IW_InitInp, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyInitInput(Dvr_SimDataData%SS_InitInp, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine AD_Dvr_PackDvr_SimData(RF, Indata) @@ -1286,6 +1294,7 @@ subroutine AD_Dvr_PackDvr_SimData(RF, Indata) call RegPack(RF, InData%root) call AD_Dvr_PackDvr_Outputs(RF, InData%out) call ADI_PackIW_InputData(RF, InData%IW_InitInp) + call SeaSt_PackInitInput(RF, InData%SS_InitInp) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1345,6 +1354,7 @@ subroutine AD_Dvr_UnPackDvr_SimData(RF, OutData) call RegUnpack(RF, OutData%root); if (RegCheckErr(RF, RoutineName)) return call AD_Dvr_UnpackDvr_Outputs(RF, OutData%out) ! out call ADI_UnpackIW_InputData(RF, OutData%IW_InitInp) ! IW_InitInp + call SeaSt_UnpackInitInput(RF, OutData%SS_InitInp) ! SS_InitInp end subroutine subroutine AD_Dvr_CopyAllData(SrcAllDataData, DstAllDataData, CtrlCode, ErrStat, ErrMsg) @@ -1370,6 +1380,9 @@ subroutine AD_Dvr_CopyAllData(SrcAllDataData, DstAllDataData, CtrlCode, ErrStat, DstAllDataData%errStat = SrcAllDataData%errStat DstAllDataData%errMsg = SrcAllDataData%errMsg DstAllDataData%initialized = SrcAllDataData%initialized + call ADI_CopySeaState_Data(SrcAllDataData%SeaSt, DstAllDataData%SeaSt, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine AD_Dvr_DestroyAllData(AllDataData, ErrStat, ErrMsg) @@ -1387,6 +1400,8 @@ subroutine AD_Dvr_DestroyAllData(AllDataData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call ADI_DestroyFED_Data(AllDataData%FED, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ADI_DestroySeaState_Data(AllDataData%SeaSt, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine AD_Dvr_PackAllData(RF, Indata) @@ -1400,6 +1415,7 @@ subroutine AD_Dvr_PackAllData(RF, Indata) call RegPack(RF, InData%errStat) call RegPack(RF, InData%errMsg) call RegPack(RF, InData%initialized) + call ADI_PackSeaState_Data(RF, InData%SeaSt) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1414,6 +1430,9 @@ subroutine AD_Dvr_UnPackAllData(RF, OutData) call RegUnpack(RF, OutData%errStat); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%errMsg); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%initialized); if (RegCheckErr(RF, RoutineName)) return + call ADI_UnpackSeaState_Data(RF, OutData%SeaSt) ! SeaSt end subroutine + END MODULE AeroDyn_Driver_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/src/AeroDyn_IO.f90 b/modules/aerodyn/src/AeroDyn_IO.f90 index fa0717bf7e..5f919bb211 100644 --- a/modules/aerodyn/src/AeroDyn_IO.f90 +++ b/modules/aerodyn/src/AeroDyn_IO.f90 @@ -177,7 +177,7 @@ subroutine Calc_WriteOutput_AD() m%AllOuts( TwNFdy( beta) ) = m%Y_Twr(j) end do ! out nodes - if ( p%Buoyancy ) then + if ( p%MHK /= MHK_None ) then do beta=1,p%NTwOuts j = p%TwOutNd(beta) @@ -194,7 +194,7 @@ subroutine Calc_WriteOutput_AD() end if ! hub outputs - if ( p%Buoyancy ) then + if ( p%MHK /= MHK_None ) then tmpHubFB = matmul( u%HubMotion%Orientation(:,:,1) , m%HubFB ) m%AllOuts( HbFbx ) = tmpHubFB(1) m%AllOuts( HbFby ) = tmpHubFB(2) @@ -210,7 +210,7 @@ subroutine Calc_WriteOutput_AD() end if ! nacelle buoyancy outputs - if ( p%Buoyancy ) then + if ( p%MHK /= MHK_None ) then tmp = matmul( u%NacelleMotion%Orientation(:,:,1) , m%NacFB ) m%AllOuts( NcFbx ) = tmp(1) m%AllOuts( NcFby ) = tmp(2) @@ -237,7 +237,7 @@ subroutine Calc_WriteOutput_AD() end if ! nacelle total forces and moments - if ( p%Buoyancy .OR. p%NacelleDrag) then + if ( (p%MHK /= MHK_None) .OR. p%NacelleDrag) then tmp = m%NacFi m%AllOuts( NcFxi ) = tmp(1) @@ -278,7 +278,7 @@ subroutine Calc_WriteOutput_AD() end do ! nodes end do ! blades - if ( p%Buoyancy ) then + if ( p%MHK /= MHK_None ) then do k=1,min(p%numBlades,AD_MaxBl_Out) ! limit this do beta=1,p%NBlOuts j=p%BlOutNd(beta) @@ -702,7 +702,7 @@ SUBROUTINE ParsePrimaryFileInfo( PriPath, InitInp, InputFile, RootName, NumBlade character(ErrMsgLen) :: ErrMsg2 !< Temporary Error message character(ErrMsgLen) :: ErrMsg_NoAllBldNdOuts integer(IntKi) :: CurLine !< current entry in FileInfo_In%Lines array - real(ReKi) :: TmpRe5(5) !< temporary 8 number array for reading values in + real(ReKi) :: TmpRe7(7) !< temporary 8 number array for reading values in logical :: TwrAeroLogical !< convert TwrAero from logical (input file) to integer (new) character(1024) :: sDummy !< temporary string character(1024) :: tmpOutStr !< temporary string for writing to screen @@ -804,9 +804,6 @@ SUBROUTINE ParsePrimaryFileInfo( PriPath, InitInp, InputFile, RootName, NumBlade frozenWakeProvided = legacyInputPresent('FrozenWake', Curline, ErrStat2, ErrMsg2, 'DBEMTMod=-1 (FrozenWake=True) or DBEMTMod>-1 (FrozenWake=False)') ! CavitCheck - Perform cavitation check? (flag) [AFAeroMod must be 1 when CavitCheck=true] call ParseVar( FileInfo_In, CurLine, "CavitCheck", InputFileData%CavitCheck, ErrStat2, ErrMsg2, UnEc ) - if (Failed()) return - ! Buoyancy - Include buoyancy effects? (flag) - call ParseVar( FileInfo_In, CurLine, "Buoyancy", InputFileData%Buoyancy, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return ! NacelleDrag - Include Nacelle Drag effects? (flag) call ParseVar( FileInfo_In, CurLine, "NacelleDrag", InputFileData%NacelleDrag, ErrStat2, ErrMsg2, UnEc ) @@ -1036,7 +1033,7 @@ SUBROUTINE ParsePrimaryFileInfo( PriPath, InitInp, InputFile, RootName, NumBlade IF ( PathIsRelative( InputFileData%ADBlFile(I) ) ) InputFileData%ADBlFile(I) = TRIM(PriPath)//TRIM(InputFileData%ADBlFile(I)) enddo - !====== Hub Properties ============================================================================== [used only when Buoyancy=True] + !====== Hub Properties ============================================================================== [used only when MHK=1 or 2] do iR = 1,size(NumBlades) ! Loop on rotors if ( InputFileData%Echo ) WRITE(UnEc, '(A)') FileInfo_In%Lines(CurLine) ! Write section break to echo CurLine = CurLine + 1 @@ -1048,7 +1045,7 @@ SUBROUTINE ParsePrimaryFileInfo( PriPath, InitInp, InputFile, RootName, NumBlade if (Failed()) return end do - !====== Nacelle Properties ========================================================================== [used only when Buoyancy=True] + !====== Nacelle Properties ========================================================================== [used only when MHK=1 or 2] do iR = 1,size(NumBlades) ! Loop on rotors if ( InputFileData%Echo ) WRITE(UnEc, '(A)') FileInfo_In%Lines(CurLine) ! Write section break to echo CurLine = CurLine + 1 @@ -1085,14 +1082,14 @@ SUBROUTINE ParsePrimaryFileInfo( PriPath, InitInp, InputFile, RootName, NumBlade endif enddo - !====== Tower Influence and Aerodynamics ============================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] + !====== Tower Influence and Aerodynamics ============================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] do iR = 1,size(NumBlades) ! Loop on rotors if ( InputFileData%Echo ) WRITE(UnEc, '(A)') FileInfo_In%Lines(CurLine) ! Write section break to echo CurLine = CurLine + 1 - ! NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True] + ! NumTwrNds - Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2] call ParseVar( FileInfo_In, CurLine, "NumTwrNds", InputFileData%rotors(iR)%NumTwrNds, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return - !TwrElev TwrDiam TwrCd TwrTI TwrCb + !TwrElev TwrDiam TwrCd TwrTI TwrCb TwrCp TwrCa if ( InputFileData%Echo ) WRITE(UnEc, '(A)') 'Tower Table Header: '//FileInfo_In%Lines(CurLine) ! Write section break to echo CurLine = CurLine + 1 !(m) (m) (-) (-) (-) @@ -1109,14 +1106,20 @@ SUBROUTINE ParsePrimaryFileInfo( PriPath, InitInp, InputFile, RootName, NumBlade if (Failed()) return CALL AllocAry( InputFileData%rotors(iR)%TwrCb, InputFileData%rotors(iR)%NumTwrNds, 'TwrCb', ErrStat2, ErrMsg2) if (Failed()) return + CALL AllocAry( InputFileData%rotors(iR)%TwrCp, InputFileData%rotors(iR)%NumTwrNds, 'TwrCp', ErrStat2, ErrMsg2) + if (Failed()) return + CALL AllocAry( InputFileData%rotors(iR)%TwrCa, InputFileData%rotors(iR)%NumTwrNds, 'TwrCa', ErrStat2, ErrMsg2) + if (Failed()) return do I=1,InputFileData%rotors(iR)%NumTwrNds - call ParseAry ( FileInfo_In, CurLine, 'Properties for tower node '//trim( Int2LStr( I ) )//'.', TmpRe5, 5, ErrStat2, ErrMsg2, UnEc ) + call ParseAry ( FileInfo_In, CurLine, 'Properties for tower node '//trim( Int2LStr( I ) )//'.', TmpRe7, 7, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; - InputFileData%rotors(iR)%TwrElev(I) = TmpRe5( 1) - InputFileData%rotors(iR)%TwrDiam(I) = TmpRe5( 2) - InputFileData%rotors(iR)%TwrCd(I) = TmpRe5( 3) - InputFileData%rotors(iR)%TwrTI(I) = TmpRe5( 4) - InputFileData%rotors(iR)%TwrCb(I) = TmpRe5( 5) + InputFileData%rotors(iR)%TwrElev(I) = TmpRe7( 1) + InputFileData%rotors(iR)%TwrDiam(I) = TmpRe7( 2) + InputFileData%rotors(iR)%TwrCd(I) = TmpRe7( 3) + InputFileData%rotors(iR)%TwrTI(I) = TmpRe7( 4) + InputFileData%rotors(iR)%TwrCb(I) = TmpRe7( 5) + InputFileData%rotors(iR)%TwrCp(I) = TmpRe7( 6) + InputFileData%rotors(iR)%TwrCa(I) = TmpRe7( 7) end do enddo @@ -1429,11 +1432,11 @@ SUBROUTINE ReadBladeInputs ( ADBlFile, BladeKInputFileData, AeroProjMod, UnEc, c INTEGER( IntKi ) :: UnIn ! Unit number for reading file INTEGER(IntKi) :: ErrStat2 , IOS ! Temporary Error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary Err msg - INTEGER, PARAMETER :: MaxCols = 10 + INTEGER, PARAMETER :: MaxCols = 16 CHARACTER(NWTC_SizeOfNumWord*(MaxCols+1)) :: Line INTEGER(IntKi) :: Indx(MaxCols) - CHARACTER(8), PARAMETER :: AvailableChanNames(MaxCols) = (/'BLSPN ', 'BLCRVAC ','BLSWPAC ','BLCRVANG','BLTWIST ','BLCHORD ', 'BLAFID ', 'BLCB ', 'BLCENBN ','BLCENBT ' /) ! in upper case only - LOGICAL, PARAMETER :: RequiredChanNames( MaxCols) = (/.true. , .true. ,.true. ,.false. ,.true. ,.true. , .true. , .false. , .false. ,.false. /) + CHARACTER(8), PARAMETER :: AvailableChanNames(MaxCols) = (/'BLSPN ', 'BLCRVAC ','BLSWPAC ','BLCRVANG','BLTWIST ','BLCHORD ', 'BLAFID ', 'T_C ', 'BLCB ', 'BLCENBN ','BLCENBT ','BLCPN ','BLCPT ','BLCAN ','BLCAT ','BLCAM ' /) ! in upper case only + LOGICAL, PARAMETER :: RequiredChanNames( MaxCols) = (/.true. , .true. ,.true. ,.false. ,.true. ,.true. , .true. , .false. , .false. ,.false. ,.false. ,.false. ,.false. ,.false. ,.false. ,.false. /) CHARACTER(*), PARAMETER :: RoutineName = 'ReadBladeInputs' @@ -1500,13 +1503,25 @@ SUBROUTINE ReadBladeInputs ( ADBlFile, BladeKInputFileData, AeroProjMod, UnEc, c CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL AllocAry( BladeKInputFileData%BlAFID, BladeKInputFileData%NumBlNds, 'BlAFID', ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocAry( BladeKInputFileData%t_c, BladeKInputFileData%NumBlNds, 't_c', ErrStat2, ErrMsg2) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL AllocAry( BladeKInputFileData%BlCb, BladeKInputFileData%NumBlNds, 'BlCb', ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL AllocAry( BladeKInputFileData%BlCenBn, BladeKInputFileData%NumBlNds, 'BlCenBn', ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL AllocAry( BladeKInputFileData%BlCenBt, BladeKInputFileData%NumBlNds, 'BlCenBt', ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - + CALL AllocAry( BladeKInputFileData%BlCpn, BladeKInputFileData%NumBlNds, 'BlCpn', ErrStat2, ErrMsg2) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocAry( BladeKInputFileData%BlCpt, BladeKInputFileData%NumBlNds, 'BlCpt', ErrStat2, ErrMsg2) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocAry( BladeKInputFileData%BlCan, BladeKInputFileData%NumBlNds, 'BlCan', ErrStat2, ErrMsg2) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocAry( BladeKInputFileData%BlCat, BladeKInputFileData%NumBlNds, 'BlCat', ErrStat2, ErrMsg2) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocAry( BladeKInputFileData%BlCam, BladeKInputFileData%NumBlNds, 'BlCam', ErrStat2, ErrMsg2) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Return on error if we didn't allocate space for the next inputs IF ( ErrStat >= AbortErrLev ) THEN CALL Cleanup() @@ -1515,9 +1530,15 @@ SUBROUTINE ReadBladeInputs ( ADBlFile, BladeKInputFileData, AeroProjMod, UnEc, c ! Initialize in case these columns are missing (e.g., no buoyancy, or cant angle) BladeKInputFileData%BlCrvAng = 0.0_ReKi + BladeKInputFileData%t_c = 0.0_ReKi BladeKInputFileData%BlCb = 0.0_ReKi BladeKInputFileData%BlCenBn = 0.0_ReKi BladeKInputFileData%BlCenBt = 0.0_ReKi + BladeKInputFileData%BlCpn = 0.0_ReKi + BladeKInputFileData%BlCpt = 0.0_ReKi + BladeKInputFileData%BlCan = 0.0_ReKi + BladeKInputFileData%BlCat = 0.0_ReKi + BladeKInputFileData%BlCam = 0.0_ReKi ! figure out what columns are specified in this file and in what order: @@ -1625,19 +1646,49 @@ SUBROUTINE ConvertLineToCols(Line, i, Indx, BladeKInputFileData, ErrStat, ErrMsg c=Indx(8) IF (c > 0) THEN - READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCb(I) + READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%t_c(I) END IF c=Indx(9) IF (c > 0) THEN - READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCenBn(I) + READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCb(I) END IF c=Indx(10) + IF (c > 0) THEN + READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCenBn(I) + END IF + + c=Indx(11) IF (c > 0) THEN READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCenBt(I) END IF + c=Indx(12) + IF (c > 0) THEN + READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCpn(I) + END IF + + c=Indx(13) + IF (c > 0) THEN + READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCpt(I) + END IF + + c=Indx(14) + IF (c > 0) THEN + READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCan(I) + END IF + + c=Indx(15) + IF (c > 0) THEN + READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCat(I) + END IF + + c=Indx(16) + IF (c > 0) THEN + READ( Words(c), *, IOStat=IOS(c) ) BladeKInputFileData%BlCam(I) + END IF + IF (ANY(IOS /= 0)) THEN CALL SetErrStat(ErrID_Fatal, "Unable to read numeric data from all columns in the table on row "//trim(num2lstr(i))//".", ErrStat, ErrMsg, RoutineName) RETURN @@ -1821,15 +1872,6 @@ SUBROUTINE AD_PrintSum( InputFileData, p, p_AD, u, y, NumBlades, BladeInputFileD Msg = 'No' end if WRITE (UnSu,Ec_LgFrmt) p%CavitCheck, 'CavitCheck', 'Perform cavitation check? '//TRIM(Msg) - - ! Buoyancy - if (p%Buoyancy) then - Msg = 'Yes' - else - Msg = 'No' - end if - WRITE (UnSu,Ec_LgFrmt) p%Buoyancy, 'Buoyancy', 'Include buoyancy effects? '//TRIM(Msg) - ! Nacelle Drag if (p%NacelleDrag) then Msg = 'Yes' @@ -2120,7 +2162,7 @@ SUBROUTINE SetOutParam(OutList, p, p_AD, ErrStat, ErrMsg ) InvalidOutput( DBEMTau1 ) = .true. end if - if (.not. p%Buoyancy) then ! Invalid buoyant loads + if ( p%MHK == MHK_None ) then ! Invalid buoyant loads InvalidOutput( HbFbx ) = .true. InvalidOutput( HbFby ) = .true. InvalidOutput( HbFbz ) = .true. @@ -2169,7 +2211,7 @@ SUBROUTINE SetOutParam(OutList, p, p_AD, ErrStat, ErrMsg ) end if - if (.not. (p%NacelleDrag .OR. p%Buoyancy)) then ! Invalid Nacelle Total loads + if ((.not. p%NacelleDrag) .AND. (p%MHK == MHK_None)) then ! Invalid Nacelle Total loads InvalidOutput( NcFxi ) = .true. InvalidOutput( NcFyi ) = .true. InvalidOutput( NcFzi ) = .true. diff --git a/modules/aerodyn/src/AeroDyn_Inflow.f90 b/modules/aerodyn/src/AeroDyn_Inflow.f90 index d730dfa2ee..042870b073 100644 --- a/modules/aerodyn/src/AeroDyn_Inflow.f90 +++ b/modules/aerodyn/src/AeroDyn_Inflow.f90 @@ -97,12 +97,18 @@ subroutine ADI_Init(InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut InitOut%Ver = InitOut_AD%ver ! Add writeoutput units and headers to driver, same for all cases and rotors! !TODO: this header is too short if we add more rotors. Should also add a rotor identifier - call concatOutputHeaders(InitOut%WriteOutputHdr, InitOut%WriteOutputUnt, InitOut_AD%rotors(1)%WriteOutputHdr, InitOut_AD%rotors(1)%WriteOutputUnt, errStat2, errMsg2); if(Failed()) return + if (size(InitOut_AD%rotors)>=1) then + call concatOutputHeaders(InitOut%WriteOutputHdr, InitOut%WriteOutputUnt, InitOut_AD%rotors(1)%WriteOutputHdr, InitOut_AD%rotors(1)%WriteOutputUnt, errStat2, errMsg2); if(Failed()) return + endif ! --- Initialize grouped outputs - !TODO: assumes one rotor - p%NumOuts = p%AD%rotors(1)%NumOuts + p%AD%rotors(1)%BldNd_TotNumOuts + m%IW%p%NumOuts - call AllocAry(y%WriteOutput, p%NumOuts, 'WriteOutput', errStat2, errMsg2); if (Failed()) return + if (size(InitOut_AD%rotors)>=1) then + !TODO: assumes one rotor + p%NumOuts = p%AD%rotors(1)%NumOuts + p%AD%rotors(1)%BldNd_TotNumOuts + m%IW%p%NumOuts + call AllocAry(y%WriteOutput, p%NumOuts, 'WriteOutput', errStat2, errMsg2); if (Failed()) return + else + p%NumOuts = m%IW%p%NumOuts + endif ! --- Initialize outputs call AllocAry(y%IW_WriteOutput, size(m%IW%y%WriteOutput),'IW_WriteOutput', errStat2, errMsg2); if(Failed()) return @@ -309,21 +315,26 @@ subroutine ADI_CalcOutput(t, u, p, x, xd, z, OtherState, y, m, errStat, errMsg) y%PLExp = m%IW%PLExp ! --- Set outputs - !TODO: this assumes one rotor!!! - associate(AD_NumOuts => p%AD%rotors(1)%NumOuts + p%AD%rotors(1)%BldNd_TotNumOuts, & - IW_NumOuts => m%IW%p%NumOuts) - y%WriteOutput(1:IW_NumOuts) = y%IW_WriteOutput(1:IW_NumOuts) - y%WriteOutput(IW_NumOuts+1:p%NumOuts) = y%AD%rotors(1)%WriteOutput(1:AD_NumOuts) - end associate - - !---------------------------------------------------------------------------- - ! Store hub height velocity calculated in CalcOutput - !---------------------------------------------------------------------------- + if (size(p%AD%rotors)>=1) then + !TODO: this assumes one rotor!!! + associate(AD_NumOuts => p%AD%rotors(1)%NumOuts + p%AD%rotors(1)%BldNd_TotNumOuts, & + IW_NumOuts => m%IW%p%NumOuts) + y%WriteOutput(1:IW_NumOuts) = y%IW_WriteOutput(1:IW_NumOuts) + y%WriteOutput(IW_NumOuts+1:p%NumOuts) = y%AD%rotors(1)%WriteOutput(1:AD_NumOuts) + end associate + + !---------------------------------------------------------------------------- + ! Store hub height velocity calculated in CalcOutput + !---------------------------------------------------------------------------- + + if (p%storeHHVel) then + do iWT = 1, size(u%AD%rotors) + y%HHVel(:,iWT) = m%AD%Inflow(1)%RotInflow(iWT)%InflowOnHub(:,1) + end do + endif - if (p%storeHHVel) then - do iWT = 1, size(u%AD%rotors) - y%HHVel(:,iWT) = m%AD%Inflow(1)%RotInflow(iWT)%InflowOnHub(:,1) - end do + else + y%WriteOutput(1:p%NumOuts) = y%IW_WriteOutput(1:m%IW%p%NumOuts) endif contains @@ -391,6 +402,8 @@ subroutine ADI_InitInflowWind(Root, i_IW, u_AD, o_AD, IW, dt, InitOutData, errSt InitInData%InputFileName = i_IW%InputFile InitInData%Linearize = i_IW%Linearize InitInData%FilePassingMethod= i_IW%FilePassingMethod + InitInData%WtrDpth = i_IW%WtrDpth + InitInData%MSL2SWL = i_IW%MSL2SWL InitInData%NumWindPoints = 1 if (i_IW%FilePassingMethod == 1_IntKi) then ! passing input file as an FileInfoType structure call NWTC_Library_Copyfileinfotype( i_IW%PassedFileInfo, InitInData%PassedFileInfo, MESH_NEWCOPY, errStat2, errMsg2 ); if (Failed()) return @@ -399,13 +412,12 @@ subroutine ADI_InitInflowWind(Root, i_IW, u_AD, o_AD, IW, dt, InitOutData, errSt endif InitInData%RootName = trim(Root)//'.IfW' InitInData%MHK = i_IW%MHK - InitInData%WtrDpth = i_IW%WtrDpth - InitInData%MSL2SWL = i_IW%MSL2SWL + InitInData%OutputAccel = i_IW%OutputAccel + ! OLAF might be used in AD, in which case we need to allow out of bounds for some calcs. To do that ! the average values for the entire wind profile must be calculated and stored (we don't know if OLAF ! is used until after AD_Init below). InitInData%BoxExceedAllow = .true. - InitInData%OutputAccel = i_IW%OutputAccel !FIXME: bjj: what about these initialization inputs? ! InitInData%HubPosition diff --git a/modules/aerodyn/src/AeroDyn_Inflow_C_Binding.f90 b/modules/aerodyn/src/AeroDyn_Inflow_C_Binding.f90 index df76ffa0e5..e97c8223e3 100644 --- a/modules/aerodyn/src/AeroDyn_Inflow_C_Binding.f90 +++ b/modules/aerodyn/src/AeroDyn_Inflow_C_Binding.f90 @@ -109,6 +109,9 @@ MODULE AeroDyn_Inflow_C_BINDING type(ADI_InitOutputType) :: InitOutData !< Initial output data -- Names, units, and version info. type(ADI_InputType) :: ADI_u !< ADI inputs -- set by AD_SetInputMotion. Copied as needed (necessary for correction steps) !------------------------------ + ! Primary SeaSt data derived data types + type(SeaState_Data) :: SeaSt !< SeaState data + !------------------------------ ! Simulation data type(Dvr_SimData) :: Sim !< Data about the simulation !------------------------------ @@ -915,7 +918,7 @@ subroutine SetupFileOutputs() WrOutputsData%unOutFile = -1 !FIXME: number of timesteps is incorrect! call Dvr_InitializeOutputs(Sim%numTurbines, WrOutputsData, Sim%numSteps-1, ErrStat_F2, ErrMsg_F2); if(Failed()) return - call Dvr_WriteOutputs(n_Global+1, ADI%InputTimes(INPUT_CURR), Sim, WrOutputsData, ADI%y, ErrStat_F2, ErrMsg_F2); if(Failed()) return + call Dvr_WriteOutputs(n_Global+1, ADI%InputTimes(INPUT_CURR), Sim, WrOutputsData, ADI%y, SeaSt, ErrStat_F2, ErrMsg_F2); if(Failed()) return end subroutine SetupFileOutputs @@ -1133,7 +1136,7 @@ SUBROUTINE ADI_C_CalcOutput(Time_C, & if (WrOutputsData%fileFmt > idFmtNone) then !FIXME: need some way to overwrite the correction timesteps (for text file)! - call Dvr_WriteOutputs(n_Global+1, ADI%InputTimes(INPUT_CURR), Sim, WrOutputsData, ADI%y, ErrStat_F2, ErrMsg_F2); if(Failed()) return + call Dvr_WriteOutputs(n_Global+1, ADI%InputTimes(INPUT_CURR), Sim, WrOutputsData, ADI%y, SeaSt, ErrStat_F2, ErrMsg_F2); if(Failed()) return endif ! Set error status diff --git a/modules/aerodyn/src/AeroDyn_Inflow_C_Binding_Types.f90 b/modules/aerodyn/src/AeroDyn_Inflow_C_Binding_Types.f90 index 6d02105ed9..3250aff6ad 100644 --- a/modules/aerodyn/src/AeroDyn_Inflow_C_Binding_Types.f90 +++ b/modules/aerodyn/src/AeroDyn_Inflow_C_Binding_Types.f90 @@ -33,7 +33,7 @@ MODULE AeroDyn_Inflow_C_Binding_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: NumPtsDiskAvg = 144 ! Number of points for disk average velocity calculations [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: NumPtsDiskAvg = 144 ! Number of points for disk average velocity calculations [-] ! ========= DiskAvgVelData ======= TYPE, PUBLIC :: DiskAvgVelData REAL(ReKi) , DIMENSION(1:3,1:NumPtsDiskAvg) :: DiskWindPosRel = 0.0_ReKi !< Position points for disk average sampling, relative to hub [-] @@ -70,7 +70,8 @@ MODULE AeroDyn_Inflow_C_Binding_Types TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BldMesh !< Mesh for motions/loads of external nodes at each blade (sized by number of blades on the rotor) [-] END TYPE MeshByBladeType ! ======================= -CONTAINS + +contains subroutine ADI_cbind_CopyDiskAvgVelData(SrcDiskAvgVelDataData, DstDiskAvgVelDataData, CtrlCode, ErrStat, ErrMsg) type(DiskAvgVelData), intent(in) :: SrcDiskAvgVelDataData @@ -576,5 +577,7 @@ subroutine ADI_cbind_UnPackMeshByBladeType(RF, OutData) end do end if end subroutine + END MODULE AeroDyn_Inflow_C_Binding_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/src/AeroDyn_Inflow_Registry.txt b/modules/aerodyn/src/AeroDyn_Inflow_Registry.txt index ffd1e56cb2..3dfe392fe6 100644 --- a/modules/aerodyn/src/AeroDyn_Inflow_Registry.txt +++ b/modules/aerodyn/src/AeroDyn_Inflow_Registry.txt @@ -13,6 +13,7 @@ include Registry_NWTC_Library.txt usefrom AeroDyn_Registry.txt usefrom InflowWind.txt +usefrom SeaState.txt param AeroDyn_Inflow/ADI - IntKi ADI_Version - 1 - "" - @@ -43,6 +44,7 @@ typedef ^ ^ IntKi FilePass typedef ^ ^ FileInfoType PassedFileInfo - - - "If we don't use the input file, pass everything through this as a FileInfo structure" - typedef ^ ^ InflowWind_InputFile PassedFileData - - - "If we don't use the input file, pass everything through this as an IfW InputFile structure" - typedef ^ ^ LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - +typedef ^ ^ Character(1024) RootName - - - "RootName for writing output files" - typedef ^ ^ LOGICAL OutputAccel - .FALSE. - "Flag to output wind acceleration" - @@ -114,6 +116,18 @@ typedef ^ ^ ADI_InputType u typedef ^ ^ ADI_OutputType y - - - "System outputs" typedef ^ ^ DbKi inputTimes {:} - - "Array of times associated with u array" +# ..... SeaState data ....................................................................................................... +typedef ^ SeaState_Data SeaSt_ContinuousStateType x - - - "Continuous states" +typedef ^ ^ SeaSt_DiscreteStateType xd - - - "Discrete states" +typedef ^ ^ SeaSt_ConstraintStateType z - - - "Constraint states" +typedef ^ ^ SeaSt_OtherStateType OtherState - - - "Other states" +typedef ^ ^ SeaSt_ParameterType p - - - "Parameters" +typedef ^ ^ SeaSt_InputType u - - - "System inputs" +typedef ^ ^ SeaSt_OutputType y - - - "System outputs" +typedef ^ ^ SeaSt_MiscVarType m - - - "Misc/optimization variables" +typedef ^ ^ SeaSt_InitInputType InitInp - - - "Array of inputs associated with InputTimes" +typedef ^ ^ SeaSt_InitOutputType InitOut - - - "Array of outputs associated with CalcSteady Azimuths" + # ..... Rotor elastic data .................................................................................................. # NOTE: useful for driver/wrapper of this module typedef ^ RotFED MeshType PlatformPtMesh - - - "Platform reference point positions/orientations/velocities/accelerations" - diff --git a/modules/aerodyn/src/AeroDyn_Inflow_Types.f90 b/modules/aerodyn/src/AeroDyn_Inflow_Types.f90 index c50a2238e8..470536defc 100644 --- a/modules/aerodyn/src/AeroDyn_Inflow_Types.f90 +++ b/modules/aerodyn/src/AeroDyn_Inflow_Types.f90 @@ -32,9 +32,10 @@ MODULE AeroDyn_Inflow_Types !--------------------------------------------------------------------------------------------------------------------------------- USE AeroDyn_Types +USE SeaState_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: ADI_Version = 1 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ADI_Version = 1 ! [-] ! ========= ADI_InflowWindData ======= TYPE, PUBLIC :: ADI_InflowWindData TYPE(InflowWind_ContinuousStateType) :: x !< Continuous states [-] @@ -65,6 +66,7 @@ MODULE AeroDyn_Inflow_Types TYPE(FileInfoType) :: PassedFileInfo !< If we don't use the input file, pass everything through this as a FileInfo structure [-] TYPE(InflowWind_InputFile) :: PassedFileData !< If we don't use the input file, pass everything through this as an IfW InputFile structure [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] + Character(1024) :: RootName !< RootName for writing output files [-] LOGICAL :: OutputAccel = .FALSE. !< Flag to output wind acceleration [-] END TYPE ADI_IW_InputData ! ======================= @@ -153,6 +155,20 @@ MODULE AeroDyn_Inflow_Types REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: inputTimes !< Array of times associated with u array [-] END TYPE ADI_Data ! ======================= +! ========= SeaState_Data ======= + TYPE, PUBLIC :: SeaState_Data + TYPE(SeaSt_ContinuousStateType) :: x !< Continuous states [-] + TYPE(SeaSt_DiscreteStateType) :: xd !< Discrete states [-] + TYPE(SeaSt_ConstraintStateType) :: z !< Constraint states [-] + TYPE(SeaSt_OtherStateType) :: OtherState !< Other states [-] + TYPE(SeaSt_ParameterType) :: p !< Parameters [-] + TYPE(SeaSt_InputType) :: u !< System inputs [-] + TYPE(SeaSt_OutputType) :: y !< System outputs [-] + TYPE(SeaSt_MiscVarType) :: m !< Misc/optimization variables [-] + TYPE(SeaSt_InitInputType) :: InitInp !< Array of inputs associated with InputTimes [-] + TYPE(SeaSt_InitOutputType) :: InitOut !< Array of outputs associated with CalcSteady Azimuths [-] + END TYPE SeaState_Data +! ======================= ! ========= RotFED ======= TYPE, PUBLIC :: RotFED TYPE(MeshType) :: PlatformPtMesh !< Platform reference point positions/orientations/velocities/accelerations [-] @@ -179,7 +195,36 @@ MODULE AeroDyn_Inflow_Types TYPE(RotFED) , DIMENSION(:), ALLOCATABLE :: WT !< Wind turbine/rotors elastic data [-] END TYPE FED_Data ! ======================= -CONTAINS + integer(IntKi), public, parameter :: ADI_x_AD_rotors_BEMT_UA_element_x = 1 ! ADI%AD%rotors(DL%i1)%BEMT%UA%element(DL%i2, DL%i3)%x + integer(IntKi), public, parameter :: ADI_x_AD_rotors_BEMT_DBEMT_element_vind = 2 ! ADI%AD%rotors(DL%i1)%BEMT%DBEMT%element(DL%i2, DL%i3)%vind + integer(IntKi), public, parameter :: ADI_x_AD_rotors_BEMT_DBEMT_element_vind_1 = 3 ! ADI%AD%rotors(DL%i1)%BEMT%DBEMT%element(DL%i2, DL%i3)%vind_1 + integer(IntKi), public, parameter :: ADI_x_AD_rotors_BEMT_V_w = 4 ! ADI%AD%rotors(DL%i1)%BEMT%V_w + integer(IntKi), public, parameter :: ADI_x_AD_FVW_W_Gamma_NW = 5 ! ADI%AD%FVW%W(DL%i1)%Gamma_NW + integer(IntKi), public, parameter :: ADI_x_AD_FVW_W_Gamma_FW = 6 ! ADI%AD%FVW%W(DL%i1)%Gamma_FW + integer(IntKi), public, parameter :: ADI_x_AD_FVW_W_Eps_NW = 7 ! ADI%AD%FVW%W(DL%i1)%Eps_NW + integer(IntKi), public, parameter :: ADI_x_AD_FVW_W_Eps_FW = 8 ! ADI%AD%FVW%W(DL%i1)%Eps_FW + integer(IntKi), public, parameter :: ADI_x_AD_FVW_W_r_NW = 9 ! ADI%AD%FVW%W(DL%i1)%r_NW + integer(IntKi), public, parameter :: ADI_x_AD_FVW_W_r_FW = 10 ! ADI%AD%FVW%W(DL%i1)%r_FW + integer(IntKi), public, parameter :: ADI_x_AD_FVW_UA_element_x = 11 ! ADI%AD%FVW%UA(DL%i1)%element(DL%i2, DL%i3)%x + integer(IntKi), public, parameter :: ADI_u_AD_rotors_NacelleMotion = 12 ! ADI%AD%rotors(DL%i1)%NacelleMotion + integer(IntKi), public, parameter :: ADI_u_AD_rotors_TowerMotion = 13 ! ADI%AD%rotors(DL%i1)%TowerMotion + integer(IntKi), public, parameter :: ADI_u_AD_rotors_HubMotion = 14 ! ADI%AD%rotors(DL%i1)%HubMotion + integer(IntKi), public, parameter :: ADI_u_AD_rotors_BladeRootMotion = 15 ! ADI%AD%rotors(DL%i1)%BladeRootMotion(DL%i2) + integer(IntKi), public, parameter :: ADI_u_AD_rotors_BladeMotion = 16 ! ADI%AD%rotors(DL%i1)%BladeMotion(DL%i2) + integer(IntKi), public, parameter :: ADI_u_AD_rotors_TFinMotion = 17 ! ADI%AD%rotors(DL%i1)%TFinMotion + integer(IntKi), public, parameter :: ADI_u_AD_rotors_UserProp = 18 ! ADI%AD%rotors(DL%i1)%UserProp + integer(IntKi), public, parameter :: ADI_y_AD_rotors_NacelleLoad = 19 ! ADI%AD%rotors(DL%i1)%NacelleLoad + integer(IntKi), public, parameter :: ADI_y_AD_rotors_HubLoad = 20 ! ADI%AD%rotors(DL%i1)%HubLoad + integer(IntKi), public, parameter :: ADI_y_AD_rotors_TowerLoad = 21 ! ADI%AD%rotors(DL%i1)%TowerLoad + integer(IntKi), public, parameter :: ADI_y_AD_rotors_BladeLoad = 22 ! ADI%AD%rotors(DL%i1)%BladeLoad(DL%i2) + integer(IntKi), public, parameter :: ADI_y_AD_rotors_TFinLoad = 23 ! ADI%AD%rotors(DL%i1)%TFinLoad + integer(IntKi), public, parameter :: ADI_y_AD_rotors_WriteOutput = 24 ! ADI%AD%rotors(DL%i1)%WriteOutput + integer(IntKi), public, parameter :: ADI_y_HHVel = 25 ! ADI%HHVel + integer(IntKi), public, parameter :: ADI_y_PLExp = 26 ! ADI%PLExp + integer(IntKi), public, parameter :: ADI_y_IW_WriteOutput = 27 ! ADI%IW_WriteOutput + integer(IntKi), public, parameter :: ADI_y_WriteOutput = 28 ! ADI%WriteOutput + +contains subroutine ADI_CopyInflowWindData(SrcInflowWindDataData, DstInflowWindDataData, CtrlCode, ErrStat, ErrMsg) type(ADI_InflowWindData), intent(in) :: SrcInflowWindDataData @@ -315,6 +360,7 @@ subroutine ADI_CopyIW_InputData(SrcIW_InputDataData, DstIW_InputDataData, CtrlCo call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return DstIW_InputDataData%Linearize = SrcIW_InputDataData%Linearize + DstIW_InputDataData%RootName = SrcIW_InputDataData%RootName DstIW_InputDataData%OutputAccel = SrcIW_InputDataData%OutputAccel end subroutine @@ -350,6 +396,7 @@ subroutine ADI_PackIW_InputData(RF, Indata) call NWTC_Library_PackFileInfoType(RF, InData%PassedFileInfo) call InflowWind_PackInputFile(RF, InData%PassedFileData) call RegPack(RF, InData%Linearize) + call RegPack(RF, InData%RootName) call RegPack(RF, InData%OutputAccel) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -371,6 +418,7 @@ subroutine ADI_UnPackIW_InputData(RF, OutData) call NWTC_Library_UnpackFileInfoType(RF, OutData%PassedFileInfo) ! PassedFileInfo call InflowWind_UnpackInputFile(RF, OutData%PassedFileData) ! PassedFileData call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%OutputAccel); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1393,6 +1441,115 @@ subroutine ADI_UnPackData(RF, OutData) call RegUnpackAlloc(RF, OutData%inputTimes); if (RegCheckErr(RF, RoutineName)) return end subroutine +subroutine ADI_CopySeaState_Data(SrcSeaState_DataData, DstSeaState_DataData, CtrlCode, ErrStat, ErrMsg) + type(SeaState_Data), intent(in) :: SrcSeaState_DataData + type(SeaState_Data), intent(inout) :: DstSeaState_DataData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'ADI_CopySeaState_Data' + ErrStat = ErrID_None + ErrMsg = '' + call SeaSt_CopyContState(SrcSeaState_DataData%x, DstSeaState_DataData%x, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyDiscState(SrcSeaState_DataData%xd, DstSeaState_DataData%xd, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyConstrState(SrcSeaState_DataData%z, DstSeaState_DataData%z, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyOtherState(SrcSeaState_DataData%OtherState, DstSeaState_DataData%OtherState, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyParam(SrcSeaState_DataData%p, DstSeaState_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyInput(SrcSeaState_DataData%u, DstSeaState_DataData%u, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyOutput(SrcSeaState_DataData%y, DstSeaState_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyMisc(SrcSeaState_DataData%m, DstSeaState_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyInitInput(SrcSeaState_DataData%InitInp, DstSeaState_DataData%InitInp, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyInitOutput(SrcSeaState_DataData%InitOut, DstSeaState_DataData%InitOut, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine ADI_DestroySeaState_Data(SeaState_DataData, ErrStat, ErrMsg) + type(SeaState_Data), intent(inout) :: SeaState_DataData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'ADI_DestroySeaState_Data' + ErrStat = ErrID_None + ErrMsg = '' + call SeaSt_DestroyContState(SeaState_DataData%x, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyDiscState(SeaState_DataData%xd, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyConstrState(SeaState_DataData%z, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyOtherState(SeaState_DataData%OtherState, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyParam(SeaState_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyInput(SeaState_DataData%u, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyOutput(SeaState_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyMisc(SeaState_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyInitInput(SeaState_DataData%InitInp, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyInitOutput(SeaState_DataData%InitOut, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine ADI_PackSeaState_Data(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SeaState_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'ADI_PackSeaState_Data' + if (RF%ErrStat >= AbortErrLev) return + call SeaSt_PackContState(RF, InData%x) + call SeaSt_PackDiscState(RF, InData%xd) + call SeaSt_PackConstrState(RF, InData%z) + call SeaSt_PackOtherState(RF, InData%OtherState) + call SeaSt_PackParam(RF, InData%p) + call SeaSt_PackInput(RF, InData%u) + call SeaSt_PackOutput(RF, InData%y) + call SeaSt_PackMisc(RF, InData%m) + call SeaSt_PackInitInput(RF, InData%InitInp) + call SeaSt_PackInitOutput(RF, InData%InitOut) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine ADI_UnPackSeaState_Data(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SeaState_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'ADI_UnPackSeaState_Data' + if (RF%ErrStat /= ErrID_None) return + call SeaSt_UnpackContState(RF, OutData%x) ! x + call SeaSt_UnpackDiscState(RF, OutData%xd) ! xd + call SeaSt_UnpackConstrState(RF, OutData%z) ! z + call SeaSt_UnpackOtherState(RF, OutData%OtherState) ! OtherState + call SeaSt_UnpackParam(RF, OutData%p) ! p + call SeaSt_UnpackInput(RF, OutData%u) ! u + call SeaSt_UnpackOutput(RF, OutData%y) ! y + call SeaSt_UnpackMisc(RF, OutData%m) ! m + call SeaSt_UnpackInitInput(RF, OutData%InitInp) ! InitInp + call SeaSt_UnpackInitOutput(RF, OutData%InitOut) ! InitOut +end subroutine + subroutine ADI_CopyRotFED(SrcRotFEDData, DstRotFEDData, CtrlCode, ErrStat, ErrMsg) type(RotFED), intent(inout) :: SrcRotFEDData type(RotFED), intent(inout) :: DstRotFEDData @@ -1804,5 +1961,412 @@ subroutine ADI_UnPackFED_Data(RF, OutData) end do end if end subroutine + +function ADI_InputMeshPointer(u, DL) result(Mesh) + type(ADI_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ADI_u_AD_rotors_NacelleMotion) + Mesh => u%AD%rotors(DL%i1)%NacelleMotion + case (ADI_u_AD_rotors_TowerMotion) + Mesh => u%AD%rotors(DL%i1)%TowerMotion + case (ADI_u_AD_rotors_HubMotion) + Mesh => u%AD%rotors(DL%i1)%HubMotion + case (ADI_u_AD_rotors_BladeRootMotion) + Mesh => u%AD%rotors(DL%i1)%BladeRootMotion(DL%i2) + case (ADI_u_AD_rotors_BladeMotion) + Mesh => u%AD%rotors(DL%i1)%BladeMotion(DL%i2) + case (ADI_u_AD_rotors_TFinMotion) + Mesh => u%AD%rotors(DL%i1)%TFinMotion + end select +end function + +function ADI_OutputMeshPointer(y, DL) result(Mesh) + type(ADI_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ADI_y_AD_rotors_NacelleLoad) + Mesh => y%AD%rotors(DL%i1)%NacelleLoad + case (ADI_y_AD_rotors_HubLoad) + Mesh => y%AD%rotors(DL%i1)%HubLoad + case (ADI_y_AD_rotors_TowerLoad) + Mesh => y%AD%rotors(DL%i1)%TowerLoad + case (ADI_y_AD_rotors_BladeLoad) + Mesh => y%AD%rotors(DL%i1)%BladeLoad(DL%i2) + case (ADI_y_AD_rotors_TFinLoad) + Mesh => y%AD%rotors(DL%i1)%TFinLoad + end select +end function + +subroutine ADI_VarsPackContState(Vars, x, ValAry) + type(ADI_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ADI_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ADI_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ADI_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADI_x_AD_rotors_BEMT_UA_element_x) + VarVals = x%AD%rotors(DL%i1)%BEMT%UA%element(DL%i2, DL%i3)%x(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_x_AD_rotors_BEMT_DBEMT_element_vind) + VarVals = x%AD%rotors(DL%i1)%BEMT%DBEMT%element(DL%i2, DL%i3)%vind(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_x_AD_rotors_BEMT_DBEMT_element_vind_1) + VarVals = x%AD%rotors(DL%i1)%BEMT%DBEMT%element(DL%i2, DL%i3)%vind_1(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_x_AD_rotors_BEMT_V_w) + VarVals = x%AD%rotors(DL%i1)%BEMT%V_w(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_x_AD_FVW_W_Gamma_NW) + VarVals = x%AD%FVW%W(DL%i1)%Gamma_NW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (ADI_x_AD_FVW_W_Gamma_FW) + VarVals = x%AD%FVW%W(DL%i1)%Gamma_FW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (ADI_x_AD_FVW_W_Eps_NW) + VarVals = x%AD%FVW%W(DL%i1)%Eps_NW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (ADI_x_AD_FVW_W_Eps_FW) + VarVals = x%AD%FVW%W(DL%i1)%Eps_FW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (ADI_x_AD_FVW_W_r_NW) + VarVals = x%AD%FVW%W(DL%i1)%r_NW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (ADI_x_AD_FVW_W_r_FW) + VarVals = x%AD%FVW%W(DL%i1)%r_FW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (ADI_x_AD_FVW_UA_element_x) + VarVals = x%AD%FVW%UA(DL%i1)%element(DL%i2, DL%i3)%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ADI_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ADI_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ADI_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine ADI_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ADI_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADI_x_AD_rotors_BEMT_UA_element_x) + x%AD%rotors(DL%i1)%BEMT%UA%element(DL%i2, DL%i3)%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ADI_x_AD_rotors_BEMT_DBEMT_element_vind) + x%AD%rotors(DL%i1)%BEMT%DBEMT%element(DL%i2, DL%i3)%vind(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ADI_x_AD_rotors_BEMT_DBEMT_element_vind_1) + x%AD%rotors(DL%i1)%BEMT%DBEMT%element(DL%i2, DL%i3)%vind_1(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ADI_x_AD_rotors_BEMT_V_w) + x%AD%rotors(DL%i1)%BEMT%V_w(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ADI_x_AD_FVW_W_Gamma_NW) + x%AD%FVW%W(DL%i1)%Gamma_NW(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (ADI_x_AD_FVW_W_Gamma_FW) + x%AD%FVW%W(DL%i1)%Gamma_FW(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (ADI_x_AD_FVW_W_Eps_NW) + x%AD%FVW%W(DL%i1)%Eps_NW(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (ADI_x_AD_FVW_W_Eps_FW) + x%AD%FVW%W(DL%i1)%Eps_FW(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (ADI_x_AD_FVW_W_r_NW) + x%AD%FVW%W(DL%i1)%r_NW(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (ADI_x_AD_FVW_W_r_FW) + x%AD%FVW%W(DL%i1)%r_FW(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (ADI_x_AD_FVW_UA_element_x) + x%AD%FVW%UA(DL%i1)%element(DL%i2, DL%i3)%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ADI_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ADI_x_AD_rotors_BEMT_UA_element_x) + Name = "x%AD%rotors("//trim(Num2LStr(DL%i1))//")%BEMT%UA%element("//trim(Num2LStr(DL%i2))//", "//trim(Num2LStr(DL%i3))//")%x" + case (ADI_x_AD_rotors_BEMT_DBEMT_element_vind) + Name = "x%AD%rotors("//trim(Num2LStr(DL%i1))//")%BEMT%DBEMT%element("//trim(Num2LStr(DL%i2))//", "//trim(Num2LStr(DL%i3))//")%vind" + case (ADI_x_AD_rotors_BEMT_DBEMT_element_vind_1) + Name = "x%AD%rotors("//trim(Num2LStr(DL%i1))//")%BEMT%DBEMT%element("//trim(Num2LStr(DL%i2))//", "//trim(Num2LStr(DL%i3))//")%vind_1" + case (ADI_x_AD_rotors_BEMT_V_w) + Name = "x%AD%rotors("//trim(Num2LStr(DL%i1))//")%BEMT%V_w" + case (ADI_x_AD_FVW_W_Gamma_NW) + Name = "x%AD%FVW%W("//trim(Num2LStr(DL%i1))//")%Gamma_NW" + case (ADI_x_AD_FVW_W_Gamma_FW) + Name = "x%AD%FVW%W("//trim(Num2LStr(DL%i1))//")%Gamma_FW" + case (ADI_x_AD_FVW_W_Eps_NW) + Name = "x%AD%FVW%W("//trim(Num2LStr(DL%i1))//")%Eps_NW" + case (ADI_x_AD_FVW_W_Eps_FW) + Name = "x%AD%FVW%W("//trim(Num2LStr(DL%i1))//")%Eps_FW" + case (ADI_x_AD_FVW_W_r_NW) + Name = "x%AD%FVW%W("//trim(Num2LStr(DL%i1))//")%r_NW" + case (ADI_x_AD_FVW_W_r_FW) + Name = "x%AD%FVW%W("//trim(Num2LStr(DL%i1))//")%r_FW" + case (ADI_x_AD_FVW_UA_element_x) + Name = "x%AD%FVW%UA("//trim(Num2LStr(DL%i1))//")%element("//trim(Num2LStr(DL%i2))//", "//trim(Num2LStr(DL%i3))//")%x" + case default + Name = "Unknown Field" + end select +end function + +subroutine ADI_VarsPackContStateDeriv(Vars, x, ValAry) + type(ADI_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ADI_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ADI_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ADI_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADI_x_AD_rotors_BEMT_UA_element_x) + VarVals = x%AD%rotors(DL%i1)%BEMT%UA%element(DL%i2, DL%i3)%x(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_x_AD_rotors_BEMT_DBEMT_element_vind) + VarVals = x%AD%rotors(DL%i1)%BEMT%DBEMT%element(DL%i2, DL%i3)%vind(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_x_AD_rotors_BEMT_DBEMT_element_vind_1) + VarVals = x%AD%rotors(DL%i1)%BEMT%DBEMT%element(DL%i2, DL%i3)%vind_1(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_x_AD_rotors_BEMT_V_w) + VarVals = x%AD%rotors(DL%i1)%BEMT%V_w(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_x_AD_FVW_W_Gamma_NW) + VarVals = x%AD%FVW%W(DL%i1)%Gamma_NW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (ADI_x_AD_FVW_W_Gamma_FW) + VarVals = x%AD%FVW%W(DL%i1)%Gamma_FW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (ADI_x_AD_FVW_W_Eps_NW) + VarVals = x%AD%FVW%W(DL%i1)%Eps_NW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (ADI_x_AD_FVW_W_Eps_FW) + VarVals = x%AD%FVW%W(DL%i1)%Eps_FW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (ADI_x_AD_FVW_W_r_NW) + VarVals = x%AD%FVW%W(DL%i1)%r_NW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (ADI_x_AD_FVW_W_r_FW) + VarVals = x%AD%FVW%W(DL%i1)%r_FW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (ADI_x_AD_FVW_UA_element_x) + VarVals = x%AD%FVW%UA(DL%i1)%element(DL%i2, DL%i3)%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ADI_VarsPackInput(Vars, u, ValAry) + type(ADI_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ADI_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine ADI_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(ADI_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADI_u_AD_rotors_NacelleMotion) + call MV_PackMesh(V, u%AD%rotors(DL%i1)%NacelleMotion, ValAry) ! Mesh + case (ADI_u_AD_rotors_TowerMotion) + call MV_PackMesh(V, u%AD%rotors(DL%i1)%TowerMotion, ValAry) ! Mesh + case (ADI_u_AD_rotors_HubMotion) + call MV_PackMesh(V, u%AD%rotors(DL%i1)%HubMotion, ValAry) ! Mesh + case (ADI_u_AD_rotors_BladeRootMotion) + call MV_PackMesh(V, u%AD%rotors(DL%i1)%BladeRootMotion(DL%i2), ValAry) ! Mesh + case (ADI_u_AD_rotors_BladeMotion) + call MV_PackMesh(V, u%AD%rotors(DL%i1)%BladeMotion(DL%i2), ValAry) ! Mesh + case (ADI_u_AD_rotors_TFinMotion) + call MV_PackMesh(V, u%AD%rotors(DL%i1)%TFinMotion, ValAry) ! Mesh + case (ADI_u_AD_rotors_UserProp) + VarVals = u%AD%rotors(DL%i1)%UserProp(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ADI_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ADI_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ADI_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine ADI_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ADI_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADI_u_AD_rotors_NacelleMotion) + call MV_UnpackMesh(V, ValAry, u%AD%rotors(DL%i1)%NacelleMotion) ! Mesh + case (ADI_u_AD_rotors_TowerMotion) + call MV_UnpackMesh(V, ValAry, u%AD%rotors(DL%i1)%TowerMotion) ! Mesh + case (ADI_u_AD_rotors_HubMotion) + call MV_UnpackMesh(V, ValAry, u%AD%rotors(DL%i1)%HubMotion) ! Mesh + case (ADI_u_AD_rotors_BladeRootMotion) + call MV_UnpackMesh(V, ValAry, u%AD%rotors(DL%i1)%BladeRootMotion(DL%i2)) ! Mesh + case (ADI_u_AD_rotors_BladeMotion) + call MV_UnpackMesh(V, ValAry, u%AD%rotors(DL%i1)%BladeMotion(DL%i2)) ! Mesh + case (ADI_u_AD_rotors_TFinMotion) + call MV_UnpackMesh(V, ValAry, u%AD%rotors(DL%i1)%TFinMotion) ! Mesh + case (ADI_u_AD_rotors_UserProp) + u%AD%rotors(DL%i1)%UserProp(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function ADI_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ADI_u_AD_rotors_NacelleMotion) + Name = "u%AD%rotors("//trim(Num2LStr(DL%i1))//")%NacelleMotion" + case (ADI_u_AD_rotors_TowerMotion) + Name = "u%AD%rotors("//trim(Num2LStr(DL%i1))//")%TowerMotion" + case (ADI_u_AD_rotors_HubMotion) + Name = "u%AD%rotors("//trim(Num2LStr(DL%i1))//")%HubMotion" + case (ADI_u_AD_rotors_BladeRootMotion) + Name = "u%AD%rotors("//trim(Num2LStr(DL%i1))//")%BladeRootMotion("//trim(Num2LStr(DL%i2))//")" + case (ADI_u_AD_rotors_BladeMotion) + Name = "u%AD%rotors("//trim(Num2LStr(DL%i1))//")%BladeMotion("//trim(Num2LStr(DL%i2))//")" + case (ADI_u_AD_rotors_TFinMotion) + Name = "u%AD%rotors("//trim(Num2LStr(DL%i1))//")%TFinMotion" + case (ADI_u_AD_rotors_UserProp) + Name = "u%AD%rotors("//trim(Num2LStr(DL%i1))//")%UserProp" + case default + Name = "Unknown Field" + end select +end function + +subroutine ADI_VarsPackOutput(Vars, y, ValAry) + type(ADI_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ADI_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine ADI_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(ADI_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADI_y_AD_rotors_NacelleLoad) + call MV_PackMesh(V, y%AD%rotors(DL%i1)%NacelleLoad, ValAry) ! Mesh + case (ADI_y_AD_rotors_HubLoad) + call MV_PackMesh(V, y%AD%rotors(DL%i1)%HubLoad, ValAry) ! Mesh + case (ADI_y_AD_rotors_TowerLoad) + call MV_PackMesh(V, y%AD%rotors(DL%i1)%TowerLoad, ValAry) ! Mesh + case (ADI_y_AD_rotors_BladeLoad) + call MV_PackMesh(V, y%AD%rotors(DL%i1)%BladeLoad(DL%i2), ValAry) ! Mesh + case (ADI_y_AD_rotors_TFinLoad) + call MV_PackMesh(V, y%AD%rotors(DL%i1)%TFinLoad, ValAry) ! Mesh + case (ADI_y_AD_rotors_WriteOutput) + VarVals = y%AD%rotors(DL%i1)%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_y_HHVel) + VarVals = y%HHVel(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (ADI_y_PLExp) + VarVals(1) = y%PLExp ! Scalar + case (ADI_y_IW_WriteOutput) + VarVals = y%IW_WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (ADI_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ADI_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ADI_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ADI_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine ADI_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ADI_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ADI_y_AD_rotors_NacelleLoad) + call MV_UnpackMesh(V, ValAry, y%AD%rotors(DL%i1)%NacelleLoad) ! Mesh + case (ADI_y_AD_rotors_HubLoad) + call MV_UnpackMesh(V, ValAry, y%AD%rotors(DL%i1)%HubLoad) ! Mesh + case (ADI_y_AD_rotors_TowerLoad) + call MV_UnpackMesh(V, ValAry, y%AD%rotors(DL%i1)%TowerLoad) ! Mesh + case (ADI_y_AD_rotors_BladeLoad) + call MV_UnpackMesh(V, ValAry, y%AD%rotors(DL%i1)%BladeLoad(DL%i2)) ! Mesh + case (ADI_y_AD_rotors_TFinLoad) + call MV_UnpackMesh(V, ValAry, y%AD%rotors(DL%i1)%TFinLoad) ! Mesh + case (ADI_y_AD_rotors_WriteOutput) + y%AD%rotors(DL%i1)%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ADI_y_HHVel) + y%HHVel(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (ADI_y_PLExp) + y%PLExp = VarVals(1) ! Scalar + case (ADI_y_IW_WriteOutput) + y%IW_WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ADI_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ADI_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ADI_y_AD_rotors_NacelleLoad) + Name = "y%AD%rotors("//trim(Num2LStr(DL%i1))//")%NacelleLoad" + case (ADI_y_AD_rotors_HubLoad) + Name = "y%AD%rotors("//trim(Num2LStr(DL%i1))//")%HubLoad" + case (ADI_y_AD_rotors_TowerLoad) + Name = "y%AD%rotors("//trim(Num2LStr(DL%i1))//")%TowerLoad" + case (ADI_y_AD_rotors_BladeLoad) + Name = "y%AD%rotors("//trim(Num2LStr(DL%i1))//")%BladeLoad("//trim(Num2LStr(DL%i2))//")" + case (ADI_y_AD_rotors_TFinLoad) + Name = "y%AD%rotors("//trim(Num2LStr(DL%i1))//")%TFinLoad" + case (ADI_y_AD_rotors_WriteOutput) + Name = "y%AD%rotors("//trim(Num2LStr(DL%i1))//")%WriteOutput" + case (ADI_y_HHVel) + Name = "y%HHVel" + case (ADI_y_PLExp) + Name = "y%PLExp" + case (ADI_y_IW_WriteOutput) + Name = "y%IW_WriteOutput" + case (ADI_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE AeroDyn_Inflow_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/src/AeroDyn_Registry.txt b/modules/aerodyn/src/AeroDyn_Registry.txt index d88fcb9473..d82817278f 100644 --- a/modules/aerodyn/src/AeroDyn_Registry.txt +++ b/modules/aerodyn/src/AeroDyn_Registry.txt @@ -13,10 +13,12 @@ include Registry_NWTC_Library.txt usefrom AirfoilInfo_Registry.txt usefrom BEMT_Registry.txt -usefrom FVW_Registry.txt +usefrom FVW_Registry.txt usefrom UnsteadyAero_Registry.txt usefrom AeroAcoustics_Registry.txt usefrom InflowWind.txt +usefrom SeaSt_WaveField.txt +usefrom GridInterp.txt param AeroDyn/AD - IntKi ModelUnknown - -1 - "" - param ^ - IntKi WakeMod_none - 0 - "Wake model - none" - @@ -52,6 +54,10 @@ param ^ - IntKi APM_LiftingLine - 3 - "Use the bl # if more than AD_MaxBl_Out blades are used in the simulation, not all channels will have output information for the "extra" blades. # Also, the AD input file will require more lines for the additional blades. param ^ - IntKi AD_MaxBl_Out - 3 - "Maximum number of blades for information output (or linearization)" - +# For extended inputs used in linearization, number with a unique negative number. This is for programming convenience so it doesn't conflict with Registry autogenerated values. +param ^ - IntKi AD_u_HWindSpeed - -1 - "DatLoc number for HWindSpeed extended input" - +param ^ - IntKi AD_u_PLExp - -2 - "DatLoc number for PLExp extended input" - +param ^ - IntKi AD_u_PropagationDir - -3 - "DatLoc number for PropagationDir extended input" - # Tail Fin parameters typedef ^ TFinParameterType IntKi TFinMod - - 0 "Tail fin aerodynamics model {0=none, 1=polar-based, 2=USB-based}" (switch) @@ -110,6 +116,7 @@ typedef ^ InitInputType Logical Linearize - .FALSE. - "Flag that tells this modu typedef ^ InitInputType LOGICAL CompAeroMaps - .FALSE. - "flag to determine if AeroDyn is computing aero maps (true) or running a normal simulation (false)" - typedef ^ InitInputType ReKi Gravity - - - "Gravity force" Nm/s^2 typedef ^ InitInputType IntKi MHK - - - "MHK turbine type switch" - +typedef ^ InitInputType LOGICAL CompSeaSt - - - "Flag to indicate whether SeaState is selected" - typedef ^ InitInputType ReKi defFldDens - - - "Default fluid density from the driver; may be overwritten" kg/m^3 typedef ^ InitInputType ReKi defKinVisc - - - "Default kinematic viscosity from the driver; may be overwritten" m^2/s typedef ^ InitInputType ReKi defSpdSound - - - "Default speed of sound from the driver; may be overwritten" m/s @@ -129,27 +136,26 @@ typedef ^ AD_BladePropsType ReKi BlCrvAng {:} - - "Curve angle at blade node" ra typedef ^ AD_BladePropsType ReKi BlTwist {:} - - "Twist at blade node" radians typedef ^ AD_BladePropsType ReKi BlChord {:} - - "Chord at blade node" m typedef ^ AD_BladePropsType IntKi BlAFID {:} - - "ID of Airfoil at blade node" - +typedef ^ AD_BladePropsType ReKi t_c {:} - - "Thickness to chord ratio at blade node" - typedef ^ AD_BladePropsType ReKi BlCb {:} - - "Coefficient of buoyancy at blade node" - typedef ^ AD_BladePropsType ReKi BlCenBn {:} - - "Center of buoyancy normal offset at blade node" m typedef ^ AD_BladePropsType ReKi BlCenBt {:} - - "Center of buoyancy tangential offset at blade node" m +typedef ^ AD_BladePropsType ReKi BlCpn {:} - - "Chordwise coefficient of dynamic pressure at blade node" - +typedef ^ AD_BladePropsType ReKi BlCpt {:} - - "Edgewise coefficient of dynamic pressure at blade node" - +typedef ^ AD_BladePropsType ReKi BlCan {:} - - "Chordwise coefficient of added mass at blade node" - +typedef ^ AD_BladePropsType ReKi BlCat {:} - - "Edgewise coefficient of added mass at blade node" - +typedef ^ AD_BladePropsType ReKi BlCam {:} - - "Pitch coefficient of added mass at blade node" - # Define outputs from the initialization routine here: typedef ^ AD_BladeShape SiKi AirfoilCoords {:}{:}{:} - - "x-y coordinates for airfoils, relative to node" m # Define outputs from the initialization routine here: +typedef ^ RotInitOutputType ModVarsType Vars - - - "Module Variables" typedef ^ RotInitOutputType ReKi AirDens - - - "Air density" kg/m^3 typedef ^ RotInitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ RotInitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ RotInitOutputType AD_BladeShape BladeShape {:} - - "airfoil coordinates for each blade" m -typedef ^ RotInitOutputType CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -typedef ^ RotInitOutputType CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - -typedef ^ RotInitOutputType CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -typedef ^ RotInitOutputType LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - -typedef ^ RotInitOutputType LOGICAL RotFrame_x {:} - - "Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame (not used for glue)" - -typedef ^ RotInitOutputType LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - -typedef ^ RotInitOutputType LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix)" - typedef ^ RotInitOutputType AD_BladePropsType BladeProps {:} - - "blade property information from blade input files" - -typedef ^ RotInitOutputType IntKi DerivOrder_x {:} - - "Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization" - typedef ^ RotInitOutputType ReKi TwrElev {:} - - "Elevation at tower node" m typedef ^ RotInitOutputType ReKi TwrDiam {:} - - "Diameter of tower at node" m @@ -167,6 +173,8 @@ typedef ^ RotInputFile ReKi TwrDiam {:} - - "Diameter of tower at node" m typedef ^ RotInputFile ReKi TwrCd {:} - - "Coefficient of drag at tower node" - typedef ^ RotInputFile ReKi TwrTI {:} - - "Turbulence intensity for tower shadow at tower node" - typedef ^ RotInputFile ReKi TwrCb {:} - - "Coefficient of buoyancy at tower node" - +typedef ^ RotInputFile ReKi TwrCp {:} - - "Coefficient of dynamic pressure at tower node" - +typedef ^ RotInputFile ReKi TwrCa {:} - - "Coefficient of added mass at tower node" - # Hub typedef ^ RotInputFile ReKi VolHub - - - "Hub volume" m^3 typedef ^ RotInputFile ReKi HubCenBx - - - "Hub center of buoyancy x direction offset" m @@ -189,7 +197,6 @@ typedef ^ AD_InputFile IntKi TwrPotent - - - "Type of tower influence on wind ba typedef ^ AD_InputFile IntKi TwrShadow - - - "Type of tower influence on wind based on downstream tower shadow {0=none, 1=Powles model, 2=Eames model}" - typedef ^ AD_InputFile IntKi TwrAero - - - "Calculate tower aerodynamic loads? {0=none, 1=aero without VIV, 2=aero with VIV}" - typedef ^ AD_InputFile Logical CavitCheck - - - "Flag that tells us if we want to check for cavitation" - -typedef ^ AD_InputFile Logical Buoyancy - - - "Include buoyancy effects?" flag typedef ^ AD_InputFile Logical NacelleDrag - - - "Include NacelleDrag effects?" flag typedef ^ AD_InputFile Logical CompAA - - - "Compute AeroAcoustic noise" flag typedef ^ AD_InputFile CHARACTER(1024) AA_InputFile - - - "AeroAcoustics input file name" "quoted strings" @@ -279,76 +286,6 @@ typedef ^ OtherStateType RotOtherStateType rotors {:} - - "OtherStates from the typedef ^ OtherStateType FVW_OtherStateType FVW - - - "OtherStates from the FVW module" - typedef ^ OtherStateType ReKi WakeLocationPoints {:}{:} - - "wake points velocity" m/s - -# Define misc/optimization variables (any data that are not considered actual states) here: -typedef ^ RotMiscVarType BEMT_MiscVarType BEMT - - - "MiscVars from the BEMT module" - -typedef ^ RotMiscVarType BEMT_OutputType BEMT_y - - - "Outputs from the BEMT module" - -typedef ^ RotMiscVarType BEMT_InputType BEMT_u 2 - - "Inputs to the BEMT module" - -typedef ^ RotMiscVarType AA_MiscVarType AA - - - "MiscVars from the AA module" - -typedef ^ RotMiscVarType AA_OutputType AA_y - - - "Outputs from the AA module" - -typedef ^ RotMiscVarType AA_InputType AA_u - - - "Inputs to the AA module" - - -typedef ^ RotMiscVarType ReKi DisturbedInflow {:}{:}{:} - - "InflowOnBlade values modified by tower influence" m/s -typedef ^ RotMiscVarType ReKi SectAvgInflow {:}{:}{:} - - "Sector averaged - disturbed inflow to improve BEM shear calculations" m/s -typedef ^ RotMiscVarType R8Ki orientationAnnulus {:}{:}{:}{:} - - "Coordinate system equivalent to BladeMotion Orientation, but without live sweep, blade-pitch, and twist angles" - -typedef ^ RotMiscVarType R8Ki R_li {:}{:}{:}{:} - - "Transformation matrix from inertial system to the staggered polar coordinate system of a given section" - -typedef ^ RotMiscVarType ReKi AllOuts {:} - - "An array holding the value of all of the calculated (not only selected) output channels" - -typedef ^ RotMiscVarType ReKi W_Twr {:} - - "relative wind speed normal to the tower at node j" m/s -typedef ^ RotMiscVarType ReKi X_Twr {:} - - "local x-component of force per unit length of the jth node in the tower" m/s -typedef ^ RotMiscVarType ReKi Y_Twr {:} - - "local y-component of force per unit length of the jth node in the tower" m/s -typedef ^ RotMiscVarType ReKi Cant {:}{:} - - "curvature angle, saved for possible output to file" rad -typedef ^ RotMiscVarType ReKi Toe {:}{:} - - "Toe angle, saved for possible output to file" rad -typedef ^ RotMiscVarType ReKi TwrClrnc {:}{:} - - "Distance between tower (including tower radius) and blade node (not including blade width), saved for possible output to file" m -typedef ^ RotMiscVarType ReKi X {:}{:} - - "normal force per unit length (normal to the plane, not chord) of the jth node in the kth blade" N/m -typedef ^ RotMiscVarType ReKi Y {:}{:} - - "tangential force per unit length (tangential to the plane, not chord) of the jth node in the kth blade" N/m -typedef ^ RotMiscVarType ReKi Z {:}{:} - - "axial force per unit length (tangential to the plane, not chord) of the jth node in the kth blade" N/m -typedef ^ RotMiscVarType ReKi M {:}{:} - - "pitching moment per unit length of the jth node in the kth blade" Nm/m -typedef ^ RotMiscVarType ReKi Mx {:}{:} - - "pitching moment per unit length of the jth node in the kth blade (in x direction)" Nm/m -typedef ^ RotMiscVarType ReKi My {:}{:} - - "pitching moment per unit length of the jth node in the kth blade (in y direction)" Nm/m -typedef ^ RotMiscVarType ReKi Mz {:}{:} - - "pitching moment per unit length of the jth node in the kth blade (in z direction)" Nm/m -typedef ^ RotMiscVarType ReKi Vind_i {:}{:}{:} - - "Induced velocities at jth node and kth blade (3xnSpanxnB)" m/s -typedef ^ RotMiscVarType ReKi V_DiskAvg {3} - - "disk-average relative wind speed" m/s -typedef ^ RotMiscVarType ReKi yaw - - - "Yaw calculated in SetInputsForBEMT" rad -typedef ^ RotMiscVarType ReKi tilt - - - "tilt calculated in SetInputsForBEMT" rad -typedef ^ RotMiscVarType ReKi hub_theta_x_root {:} - - "angles saved for FAST.Farm" rad -typedef ^ RotMiscVarType ReKi V_dot_x - - - -typedef ^ RotMiscVarType MeshType HubLoad - - - "mesh at hub; used to compute an integral for mapping the output blade loads to a single point (for writing to file only)" - -typedef ^ RotMiscVarType MeshMapType B_L_2_H_P {:} - - "mapping data structure to map each bladeLoad output mesh to the MiscVar%HubLoad mesh" -typedef ^ RotMiscVarType ReKi SigmaCavitCrit {:}{:} - - "critical cavitation number- inception value (above which cavit will occur)" - -typedef ^ RotMiscVarType ReKi SigmaCavit {:}{:} - - "cavitation number at node " - -typedef ^ RotMiscVarType Logical CavitWarnSet {:}{:} - - "cavitation warning issued " - -typedef ^ RotMiscVarType ReKi TwrFB {:}{:} - - "buoyant force per unit length at tower node" N/m -typedef ^ RotMiscVarType ReKi TwrMB {:}{:} - - "buoyant moment per unit length at tower node" Nm/m -typedef ^ RotMiscVarType ReKi HubFB {:} - - "buoyant force at hub node" N -typedef ^ RotMiscVarType ReKi HubMB {:} - - "buoyant moment at hub node" Nm -typedef ^ RotMiscVarType ReKi NacFB {:} - - "buoyant force at nacelle (tower top) node" N -typedef ^ RotMiscVarType ReKi NacMB {:} - - "buoyant moment at nacelle (tower top) node" Nm -typedef ^ RotMiscVarType ReKi NacDragF {:} - - "drag force at nacelle (tower top) node" N -typedef ^ RotMiscVarType ReKi NacDragM {:} - - "drag moment at nacelle (tower top) node" Nm -typedef ^ RotMiscVarType ReKi NacFi {:} - - "Total force at nacelle (tower top) node" N -typedef ^ RotMiscVarType ReKi NacMi {:} - - "Total moment at nacelle (tower top) node" Nm -typedef ^ RotMiscVarType MeshType BladeRootLoad {:} - - "meshes at blade root; used to compute an integral for mapping the output blade loads to single points (for writing to file only)" - -typedef ^ RotMiscVarType MeshMapType B_L_2_R_P {:} - - "mapping data structure to map each bladeLoad output mesh to corresponding MiscVar%BladeRootLoad mesh" -typedef ^ RotMiscVarType MeshType BladeBuoyLoadPoint {:} - - "point mesh for lumped buoyant blade loads" - -typedef ^ RotMiscVarType MeshType BladeBuoyLoad {:} - - "line mesh for per unit length buoyant blade loads" - -typedef ^ RotMiscVarType MeshMapType B_P_2_B_L {:} - - "mapping data structure to map buoyant blade point loads (m%BladeBuoyLoadPoint) to buoyant blade line loads (m%BladeBuoyLoad)" -typedef ^ RotMiscVarType MeshType TwrBuoyLoadPoint - - - "point mesh for lumped buoyant tower loads" - -typedef ^ RotMiscVarType MeshType TwrBuoyLoad - - - "line mesh for per unit length buoyant tower loads" - -typedef ^ RotMiscVarType MeshMapType T_P_2_T_L - - - "mapping data structure to map buoyant tower point loads (m%TwrBuoyLoadPoint) to buoyant tower line loads (m%TwrBuoyLoad)" -typedef ^ RotMiscVarType Logical FirstWarn_TowerStrike - - - "flag to avoid printing tower strike multiple times" - -typedef ^ RotMiscVarType ReKi AvgDiskVel {3} - - "disk-averaged U,V,W (undisturbed)" m/s -typedef ^ RotMiscVarType ReKi AvgDiskVelDist {3} - - "disk-averaged U,V,W (disturbed)" m/s -# TailFin -typedef ^ RotMiscVarType ReKi TFinAlpha - - - "Angle of attack for tailfin" -typedef ^ RotMiscVarType ReKi TFinRe - - - "Reynolds number for tailfin" -typedef ^ RotMiscVarType ReKi TFinVrel - - - "Orthogonal relative velocity nrom at the reference point" -typedef ^ RotMiscVarType ReKi TFinVund_i 3 - - "Undisturbed wind velocity at the reference point of the fin in the inertial system" -typedef ^ RotMiscVarType ReKi TFinVind_i 3 - - "Induced velocity at the reference point of the fin in the inertial system" -typedef ^ RotMiscVarType ReKi TFinVrel_i 3 - - "Relative velocity at the reference point of the fin in the inertial system" -typedef ^ RotMiscVarType ReKi TFinSTV_i 3 - - "Structural velocity at the reference point of the fin in the inertial system" -typedef ^ RotMiscVarType ReKi TFinF_i 3 - - "Forces at the reference point of the fin in the inertial system" -typedef ^ RotMiscVarType ReKi TFinM_i 3 - - "Moments at the reference point of the fin in the inertial system" - # Inflow data storage typedef ^ ElemInflowType ReKi InflowVel {:}{:} - - "U,V,W at nodes on element (note if we change the requirement that NumNodes is the same for each blade, this will need to change)" m/s typedef ^ ElemInflowType ReKi InflowAcc {:}{:} - - "Wind acceleration at nodes on element (blade or tower) (note if we change the requirement that NumNodes is the same for each blade, this will need to change)" m/s @@ -362,34 +299,12 @@ typedef ^ RotInflowType ReKi AvgDiskVel {3} - 0.0 "disk-averaged U,V,W" m/s typedef ^ AD_InflowType ReKi InflowWakeVel {:}{:} - - "U,V,W at wake points" m/s typedef ^ AD_InflowType RotInflowType RotInflow {:} - - "Inflow on rotor" - -typedef ^ MiscVarType RotMiscVarType rotors {:} - - "MiscVars for each rotor" - -typedef ^ MiscVarType FVW_InputType FVW_u : - - "Inputs to the FVW module" - -typedef ^ MiscVarType FVW_OutputType FVW_y - - - "Outputs from the FVW module" - -typedef ^ MiscVarType FVW_MiscVarType FVW - - - "MiscVars from the FVW module" - -typedef ^ MiscVarType ReKi WindPos {:}{:} - - "XYZ coordinates to query for wind velocity/acceleration" - -typedef ^ MiscVarType ReKi WindVel {:}{:} - - "XYZ components of wind velocity" - -typedef ^ MiscVarType ReKi WindAcc {:}{:} - - "XYZ components of wind acceleration" - -typedef ^ MiscVarType AD_InflowType Inflow {:} - - "Inflow storage (size of u for history of inputs)" - - # ..... Parameters ................................................................................................................ # Define parameters here: # Parameters for each rotor -typedef ^ Jac_u_idxStarts IntKi Nacelle - 1 - "Index to first point in u jacobian for Nacelle" - -typedef ^ Jac_u_idxStarts IntKi Hub - 1 - "Index to first point in u jacobian for Hub" - -typedef ^ Jac_u_idxStarts IntKi TFin - 1 - "Index to first point in u jacobian for TFin" - -typedef ^ Jac_u_idxStarts IntKi Tower - 1 - "Index to first point in u jacobian for Tower" - -typedef ^ Jac_u_idxStarts IntKi BladeRoot - 1 - "Index to first point in u jacobian for BladeRoot" - -typedef ^ Jac_u_idxStarts IntKi Blade - 1 - "Index to first point in u jacobian for Blade" - -typedef ^ Jac_u_idxStarts IntKi UserProp - 1 - "Index to first point in u jacobian for UserProp" - -typedef ^ Jac_u_idxStarts IntKi Extended - 1 - "Index to first point in u jacobian for Extended" - -typedef ^ Jac_y_idxStarts IntKi NacelleLoad - 1 - "Index to first point in y jacobian for NacelleLoad" - -typedef ^ Jac_y_idxStarts IntKi HubLoad - 1 - "Index to first point in y jacobian for HubLoad" - -typedef ^ Jac_y_idxStarts IntKi TFinLoad - 1 - "Index to first point in y jacobian for TFinLoad" - -typedef ^ Jac_y_idxStarts IntKi TowerLoad - 1 - "Index to first point in y jacobian for TowerLoad" - -typedef ^ Jac_y_idxStarts IntKi BladeLoad - 1 - "Index to first point in y jacobian for BladeLoad" - typedef ^ RotParameterType IntKi NumBlades - - - "Number of blades on the turbine" - typedef ^ RotParameterType IntKi NumBlNds - - - "Number of nodes on each blade" - typedef ^ RotParameterType IntKi NumTwrNds - - - "Number of nodes on the tower" - @@ -398,6 +313,8 @@ typedef ^ RotParameterType ReKi TwrCd {:} - - "Coefficient of drag at tower node typedef ^ RotParameterType ReKi TwrTI {:} - - "Turbulence intensity for tower shadow at tower node" - typedef ^ ^ ReKi BlTwist {:}{:} - - "Twist at blade node" radians typedef ^ RotParameterType ReKi TwrCb {:} - - "Coefficient of buoyancy at tower node" - +typedef ^ RotParameterType ReKi TwrCp {:} - - "Coefficient of dynamic pressure at tower node" - +typedef ^ RotParameterType ReKi TwrCa {:} - - "Coefficient of added mass at tower node" - typedef ^ RotParameterType ReKi BlCenBn {:}{:} - - "Normal offset between aerodynamic center and center of buoyancy at blade node" m typedef ^ RotParameterType ReKi BlCenBt {:}{:} - - "Tangential offset between aerodynamic center and center of buoyancy at blade node" m typedef ^ RotParameterType ReKi VolHub - - - "Hub volume" m^3 @@ -413,15 +330,19 @@ typedef ^ RotParameterType ReKi BlRad {:}{:} - - "Matrix of equivalent bla typedef ^ RotParameterType ReKi BlDL {:}{:} - - "Matrix of blade element length based on CB, used in buoyancy calculation" m typedef ^ RotParameterType ReKi BlTaper {:}{:} - - "Matrix of blade element taper, used in buoyancy calculation" - typedef ^ RotParameterType ReKi BlAxCent {:}{:} - - "Matrix of blade element axial centroid, used in buoyancy calculation" - +typedef ^ RotParameterType ReKi BlIN {:}{:} - - "Matrix of blade node normal-to-chord inertia factor" kg/m +typedef ^ RotParameterType ReKi BlIT {:}{:} - - "Matrix of blade node tangential-to-chord inertia factor" kg/m +typedef ^ RotParameterType ReKi BlAN {:}{:} - - "Matrix of blade node normal-to-chord added mass factor" kg/m +typedef ^ RotParameterType ReKi BlAT {:}{:} - - "Matrix of blade node tangential-to-chord added mass factor" kg/m +typedef ^ RotParameterType ReKi BlAM {:}{:} - - "Matrix of blade node pitch added mass factor" kgm typedef ^ RotParameterType ReKi TwrRad {:} - - "Array of equivalent tower radius at each node, used in buoyancy calculation" m typedef ^ RotParameterType ReKi TwrDL {:} - - "Array of tower element length, used in buoyancy calculation" m typedef ^ RotParameterType ReKi TwrTaper {:} - - "Array of tower element taper, used in buoyancy calculation" - typedef ^ RotParameterType ReKi TwrAxCent {:} - - "Array of tower element axial centroid, used in buoyancy calculation" - +typedef ^ RotParameterType ReKi TwrIT {:} - - "Array of tower node tangential inertia factor" kg/m +typedef ^ RotParameterType ReKi TwrAT {:} - - "Array of tower node tangential added mass factor" kg/m typedef ^ RotParameterType BEMT_ParameterType BEMT - - - "Parameters for BEMT module" typedef ^ RotParameterType AA_ParameterType AA - - - "Parameters for AA module" -typedef ^ RotParameterType IntKi Jac_u_indx {:}{:} - - "matrix to help fill/pack the u vector in computing the jacobian" - -typedef ^ RotParameterType Jac_u_idxStarts Jac_u_idxStartList - - - "Starting indices for all Jac_u components" - -typedef ^ RotParameterType Jac_y_idxStarts Jac_y_idxStartList - - - "Starting indices for all Jac_y components" - typedef ^ RotParameterType IntKi NumExtendedInputs - - - "number of extended inputs" - typedef ^ RotParameterType ReKi du {:} - - "vector that determines size of perturbation for u (inputs)" typedef ^ RotParameterType ReKi dx {:} - - "vector that determines size of perturbation for x (continuous states)" @@ -433,7 +354,6 @@ typedef ^ RotParameterType IntKi TwrShadow - - - "Type of tower influence on win typedef ^ RotParameterType IntKi TwrAero - - - "Calculate tower aerodynamic loads? {0=none, 1=aero without VIV, 2=aero with VIV}" switch typedef ^ RotParameterType Integer DBEMT_Mod - - - "DBEMT_Mod" - typedef ^ RotParameterType Logical CavitCheck - - - "Flag that tells us if we want to check for cavitation" - -typedef ^ RotParameterType Logical Buoyancy - - - "Include buoyancy effects?" flag typedef ^ RotParameterType Logical NacelleDrag - - - "Include NacelleDrag effects?" flag typedef ^ RotParameterType IntKi MHK - - - "MHK" flag typedef ^ RotParameterType Logical CompAA - - - "Compute AeroAcoustic noise" flag @@ -477,13 +397,14 @@ typedef ^ ParameterType IntKi Wake_Mod - - - "Type of wake/induction model {0=no typedef ^ ParameterType FVW_ParameterType FVW - - - "Parameters for FVW module" typedef ^ ParameterType LOGICAL CompAeroMaps - .FALSE. - "flag to determine if AeroDyn is computing aero maps (true) or running a normal simulation (false)" - typedef ^ ParameterType LOGICAL UA_Flag - - - "logical flag indicating whether to use UnsteadyAero" - +typedef ^ ParameterType LOGICAL CompSeaSt - - - "Flag to indicate whether SeaState is selected" - typedef ^ ParameterType FlowFieldType *FlowField - - - "Pointer of InflowWinds flow field data type" - typedef ^ ^ Logical SectAvg - - - "Use Sector average for BEM inflow velocity calculation" - typedef ^ ^ IntKi SA_Weighting - - 1 "Sector Average - Weighting function for sector average {1=Uniform, 2=Impulse} within a 360/nB sector centered on the blade (switch) [used only when SectAvg=True]" - typedef ^ ^ ReKi SA_PsiBwd - - - "Sector Average - Backard Azimuth (<0)" deg typedef ^ ^ ReKi SA_PsiFwd - - - "Sector Average - Forward Azimuth (>0)" deg typedef ^ ^ IntKi SA_nPerSec - - - "Sector Average - Number of points per sector (>1)" - - +typedef ^ ParameterType SeaSt_WaveFieldType *WaveField - - - "Pointer to SeaState wave field data type" - # ..... Inputs .................................................................................................................... # Define inputs that are contained on a mesh here: @@ -512,3 +433,99 @@ typedef ^ RotOutputType ReKi WriteOutput {:} - - "Data to be written to an outpu typedef ^ OutputType RotOutputType rotors {:} - - "Ouputs for each rotor" - + +# Define misc/optimization variables (any data that are not considered actual states) here: +typedef ^ RotMiscVarType ModJacType Jac - - - "Values corresponding to module variables" +typedef ^ RotMiscVarType RotContinuousStateType x_init - - - "" - +typedef ^ RotMiscVarType RotContinuousStateType x_perturb - - - "" - +typedef ^ RotMiscVarType RotContinuousStateType dxdt_lin - - - "" - +typedef ^ RotMiscVarType RotInputType u_perturb - - - "" - +typedef ^ RotMiscVarType RotOutputType y_lin - - - "" - +typedef ^ RotMiscVarType RotConstraintStateType z_lin - - - "" - +typedef ^ RotMiscVarType RotOtherStateType OtherState_init - - - "" - +typedef ^ RotMiscVarType RotOtherStateType OtherState_jac - - - "" - + +typedef ^ RotMiscVarType BEMT_MiscVarType BEMT - - - "MiscVars from the BEMT module" - +typedef ^ RotMiscVarType BEMT_OutputType BEMT_y - - - "Outputs from the BEMT module" - +typedef ^ RotMiscVarType BEMT_InputType BEMT_u 2 - - "Inputs to the BEMT module" - +typedef ^ RotMiscVarType AA_MiscVarType AA - - - "MiscVars from the AA module" - +typedef ^ RotMiscVarType AA_OutputType AA_y - - - "Outputs from the AA module" - +typedef ^ RotMiscVarType AA_InputType AA_u - - - "Inputs to the AA module" - + +typedef ^ RotMiscVarType ReKi DisturbedInflow {:}{:}{:} - - "InflowOnBlade values modified by tower influence" m/s +typedef ^ RotMiscVarType ReKi SectAvgInflow {:}{:}{:} - - "Sector averaged - disturbed inflow to improve BEM shear calculations" m/s +typedef ^ RotMiscVarType R8Ki orientationAnnulus {:}{:}{:}{:} - - "Coordinate system equivalent to BladeMotion Orientation, but without live sweep, blade-pitch, and twist angles" - +typedef ^ RotMiscVarType R8Ki R_li {:}{:}{:}{:} - - "Transformation matrix from inertial system to the staggered polar coordinate system of a given section" - +typedef ^ RotMiscVarType ReKi AllOuts {:} - - "An array holding the value of all of the calculated (not only selected) output channels" - +typedef ^ RotMiscVarType ReKi W_Twr {:} - - "relative wind speed normal to the tower at node j" m/s +typedef ^ RotMiscVarType ReKi X_Twr {:} - - "local x-component of force per unit length of the jth node in the tower" m/s +typedef ^ RotMiscVarType ReKi Y_Twr {:} - - "local y-component of force per unit length of the jth node in the tower" m/s +typedef ^ RotMiscVarType ReKi Cant {:}{:} - - "curvature angle, saved for possible output to file" rad +typedef ^ RotMiscVarType ReKi Toe {:}{:} - - "Toe angle, saved for possible output to file" rad +typedef ^ RotMiscVarType ReKi TwrClrnc {:}{:} - - "Distance between tower (including tower radius) and blade node (not including blade width), saved for possible output to file" m +typedef ^ RotMiscVarType ReKi X {:}{:} - - "normal force per unit length (normal to the plane, not chord) of the jth node in the kth blade" N/m +typedef ^ RotMiscVarType ReKi Y {:}{:} - - "tangential force per unit length (tangential to the plane, not chord) of the jth node in the kth blade" N/m +typedef ^ RotMiscVarType ReKi Z {:}{:} - - "axial force per unit length (tangential to the plane, not chord) of the jth node in the kth blade" N/m +typedef ^ RotMiscVarType ReKi M {:}{:} - - "pitching moment per unit length of the jth node in the kth blade" Nm/m +typedef ^ RotMiscVarType ReKi Mx {:}{:} - - "pitching moment per unit length of the jth node in the kth blade (in x direction)" Nm/m +typedef ^ RotMiscVarType ReKi My {:}{:} - - "pitching moment per unit length of the jth node in the kth blade (in y direction)" Nm/m +typedef ^ RotMiscVarType ReKi Mz {:}{:} - - "pitching moment per unit length of the jth node in the kth blade (in z direction)" Nm/m +typedef ^ RotMiscVarType ReKi Vind_i {:}{:}{:} - - "Induced velocities at jth node and kth blade (3xnSpanxnB)" m/s +typedef ^ RotMiscVarType ReKi V_DiskAvg {3} - - "disk-average relative wind speed" m/s +typedef ^ RotMiscVarType ReKi yaw - - - "Yaw calculated in SetInputsForBEMT" rad +typedef ^ RotMiscVarType ReKi tilt - - - "tilt calculated in SetInputsForBEMT" rad +typedef ^ RotMiscVarType ReKi hub_theta_x_root {:} - - "angles saved for FAST.Farm" rad +typedef ^ RotMiscVarType ReKi V_dot_x - - - +typedef ^ RotMiscVarType MeshType HubLoad - - - "mesh at hub; used to compute an integral for mapping the output blade loads to a single point (for writing to file only)" - +typedef ^ RotMiscVarType MeshMapType B_L_2_H_P {:} - - "mapping data structure to map each bladeLoad output mesh to the MiscVar%HubLoad mesh" +typedef ^ RotMiscVarType ReKi SigmaCavitCrit {:}{:} - - "critical cavitation number- inception value (above which cavit will occur)" - +typedef ^ RotMiscVarType ReKi SigmaCavit {:}{:} - - "cavitation number at node " - +typedef ^ RotMiscVarType Logical CavitWarnSet {:}{:} - - "cavitation warning issued " - +typedef ^ RotMiscVarType ReKi TwrFB {:}{:} - - "buoyant force per unit length at tower node" N/m +typedef ^ RotMiscVarType ReKi TwrMB {:}{:} - - "buoyant moment per unit length at tower node" Nm/m +typedef ^ RotMiscVarType ReKi HubFB {:} - - "buoyant force at hub node" N +typedef ^ RotMiscVarType ReKi HubMB {:} - - "buoyant moment at hub node" Nm +typedef ^ RotMiscVarType ReKi NacFB {:} - - "buoyant force at nacelle (tower top) node" N +typedef ^ RotMiscVarType ReKi NacMB {:} - - "buoyant moment at nacelle (tower top) node" Nm +typedef ^ RotMiscVarType ReKi NacDragF {:} - - "drag force at nacelle (tower top) node" N +typedef ^ RotMiscVarType ReKi NacDragM {:} - - "drag moment at nacelle (tower top) node" Nm +typedef ^ RotMiscVarType ReKi NacFi {:} - - "Total force at nacelle (tower top) node" N +typedef ^ RotMiscVarType ReKi NacMi {:} - - "Total moment at nacelle (tower top) node" Nm +typedef ^ RotMiscVarType ReKi BlFI {:}{:}{:} - - "inertia force per unit length at blade node" N/m +typedef ^ RotMiscVarType ReKi BlFA {:}{:}{:} - - "added mass force per unit length at blade node" N/m +typedef ^ RotMiscVarType ReKi BlMA {:}{:}{:} - - "added mass moment per unit length at blade node" N/m +typedef ^ RotMiscVarType ReKi TwrFI {:}{:} - - "inertia force per unit length at tower node" N/m +typedef ^ RotMiscVarType ReKi TwrFA {:}{:} - - "added mass force per unit length at tower node" N/m +typedef ^ RotMiscVarType MeshType BladeRootLoad {:} - - "meshes at blade root; used to compute an integral for mapping the output blade loads to single points (for writing to file only)" - +typedef ^ RotMiscVarType MeshMapType B_L_2_R_P {:} - - "mapping data structure to map each bladeLoad output mesh to corresponding MiscVar%BladeRootLoad mesh" +typedef ^ RotMiscVarType MeshType BladeBuoyLoadPoint {:} - - "point mesh for lumped buoyant blade loads" - +typedef ^ RotMiscVarType MeshType BladeBuoyLoad {:} - - "line mesh for per unit length buoyant blade loads" - +typedef ^ RotMiscVarType MeshMapType B_P_2_B_L {:} - - "mapping data structure to map buoyant blade point loads (m%BladeBuoyLoadPoint) to buoyant blade line loads (m%BladeBuoyLoad)" +typedef ^ RotMiscVarType MeshType TwrBuoyLoadPoint - - - "point mesh for lumped buoyant tower loads" - +typedef ^ RotMiscVarType MeshType TwrBuoyLoad - - - "line mesh for per unit length buoyant tower loads" - +typedef ^ RotMiscVarType MeshMapType T_P_2_T_L - - - "mapping data structure to map buoyant tower point loads (m%TwrBuoyLoadPoint) to buoyant tower line loads (m%TwrBuoyLoad)" +typedef ^ RotMiscVarType Logical FirstWarn_TowerStrike - - - "flag to avoid printing tower strike multiple times" - +typedef ^ RotMiscVarType ReKi AvgDiskVel {3} - - "disk-averaged U,V,W (undisturbed)" m/s +typedef ^ RotMiscVarType ReKi AvgDiskVelDist {3} - - "disk-averaged U,V,W (disturbed)" m/s +# TailFin +typedef ^ RotMiscVarType ReKi TFinAlpha - - - "Angle of attack for tailfin" +typedef ^ RotMiscVarType ReKi TFinRe - - - "Reynolds number for tailfin" +typedef ^ RotMiscVarType ReKi TFinVrel - - - "Orthogonal relative velocity nrom at the reference point" +typedef ^ RotMiscVarType ReKi TFinVund_i 3 - - "Undisturbed wind velocity at the reference point of the fin in the inertial system" +typedef ^ RotMiscVarType ReKi TFinVind_i 3 - - "Induced velocity at the reference point of the fin in the inertial system" +typedef ^ RotMiscVarType ReKi TFinVrel_i 3 - - "Relative velocity at the reference point of the fin in the inertial system" +typedef ^ RotMiscVarType ReKi TFinSTV_i 3 - - "Structural velocity at the reference point of the fin in the inertial system" +typedef ^ RotMiscVarType ReKi TFinF_i 3 - - "Forces at the reference point of the fin in the inertial system" +typedef ^ RotMiscVarType ReKi TFinM_i 3 - - "Moments at the reference point of the fin in the inertial system" + +typedef ^ MiscVarType RotMiscVarType rotors {:} - - "MiscVars for each rotor" - +typedef ^ MiscVarType FVW_InputType FVW_u : - - "Inputs to the FVW module" - +typedef ^ MiscVarType FVW_OutputType FVW_y - - - "Outputs from the FVW module" - +typedef ^ MiscVarType FVW_MiscVarType FVW - - - "MiscVars from the FVW module" - +typedef ^ MiscVarType ReKi WindPos {:}{:} - - "XYZ coordinates to query for wind velocity/acceleration" - +typedef ^ MiscVarType ReKi WindVel {:}{:} - - "XYZ components of wind velocity" - +typedef ^ MiscVarType ReKi WindAcc {:}{:} - - "XYZ components of wind acceleration" - +typedef ^ MiscVarType GridInterp_MiscVarType WaveField_m - - - "misc var information from the SeaState WaveField module" - +typedef ^ MiscVarType AD_InflowType Inflow {:} - - "Inflow storage (size of u for history of inputs)" - +typedef ^ MiscVarType AD_InputType u_perturb - - - "input perturbation for linearization" - +typedef ^ MiscVarType AD_OutputType y_lin - - - "output perturbation for linearization" - diff --git a/modules/aerodyn/src/AeroDyn_Types.f90 b/modules/aerodyn/src/AeroDyn_Types.f90 index 19a004baa0..d7cc9f3738 100644 --- a/modules/aerodyn/src/AeroDyn_Types.f90 +++ b/modules/aerodyn/src/AeroDyn_Types.f90 @@ -36,31 +36,35 @@ MODULE AeroDyn_Types USE FVW_Types USE AeroAcoustics_Types USE InflowWind_Types +USE SeaSt_WaveField_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: ModelUnknown = -1 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WakeMod_none = 0 ! Wake model - none [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WakeMod_BEMT = 1 ! Wake model - BEMT (blade elememnt momentum theory) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WakeMod_FVW = 3 ! Wake model - FVW (free vortex wake, OLAF) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TwrPotent_none = 0 ! no tower potential flow [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TwrPotent_baseline = 1 ! baseline tower potential flow [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TwrPotent_Bak = 2 ! tower potential flow with Bak correction [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TwrShadow_none = 0 ! no tower shadow [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TwrShadow_Powles = 1 ! Powles tower shadow model [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TwrShadow_Eames = 2 ! Eames tower shadow model [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TwrAero_none = 0 ! no tower aero [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TwrAero_noVIV = 1 ! Tower aero model without VIV [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TwrAero_VIV = 2 ! Tower aero model with VIV [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: SA_Wgt_Uniform = 1 ! Sector average weighting - Uniform [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TFinAero_none = 0 ! no tail fin aero [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TFinAero_polar = 1 ! polar-based tail fin aerodynamics [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TFinAero_USB = 2 ! unsteady slender body tail fin aerodynamics model [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TFinIndMod_none = 0 ! no induction [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TFinIndMod_rotavg = 1 ! rotor averaged induction [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: APM_BEM_NoSweepPitchTwist = 1 ! Original AeroDyn model where momentum balance is done in the WithoutSweepPitchTwist system [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: APM_BEM_Polar = 2 ! Use staggered polar grid for momentum balance in each annulus [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: APM_LiftingLine = 3 ! Use the blade lifting line (i.e. the structural) orientation (currently for OLAF with VAWT) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: AD_MaxBl_Out = 3 ! Maximum number of blades for information output (or linearization) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ModelUnknown = -1 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WakeMod_none = 0 ! Wake model - none [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WakeMod_BEMT = 1 ! Wake model - BEMT (blade elememnt momentum theory) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WakeMod_FVW = 3 ! Wake model - FVW (free vortex wake, OLAF) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TwrPotent_none = 0 ! no tower potential flow [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TwrPotent_baseline = 1 ! baseline tower potential flow [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TwrPotent_Bak = 2 ! tower potential flow with Bak correction [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TwrShadow_none = 0 ! no tower shadow [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TwrShadow_Powles = 1 ! Powles tower shadow model [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TwrShadow_Eames = 2 ! Eames tower shadow model [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TwrAero_none = 0 ! no tower aero [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TwrAero_noVIV = 1 ! Tower aero model without VIV [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TwrAero_VIV = 2 ! Tower aero model with VIV [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SA_Wgt_Uniform = 1 ! Sector average weighting - Uniform [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TFinAero_none = 0 ! no tail fin aero [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TFinAero_polar = 1 ! polar-based tail fin aerodynamics [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TFinAero_USB = 2 ! unsteady slender body tail fin aerodynamics model [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TFinIndMod_none = 0 ! no induction [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TFinIndMod_rotavg = 1 ! rotor averaged induction [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: APM_BEM_NoSweepPitchTwist = 1 ! Original AeroDyn model where momentum balance is done in the WithoutSweepPitchTwist system [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: APM_BEM_Polar = 2 ! Use staggered polar grid for momentum balance in each annulus [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: APM_LiftingLine = 3 ! Use the blade lifting line (i.e. the structural) orientation (currently for OLAF with VAWT) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: AD_MaxBl_Out = 3 ! Maximum number of blades for information output (or linearization) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: AD_u_HWindSpeed = -1 ! DatLoc number for HWindSpeed extended input [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: AD_u_PLExp = -2 ! DatLoc number for PLExp extended input [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: AD_u_PropagationDir = -3 ! DatLoc number for PropagationDir extended input [-] ! ========= TFinParameterType ======= TYPE, PUBLIC :: TFinParameterType INTEGER(IntKi) :: TFinMod = 0_IntKi !< Tail fin aerodynamics model {0=none, 1=polar-based, 2=USB-based} [(switch)] @@ -127,6 +131,7 @@ MODULE AeroDyn_Types LOGICAL :: CompAeroMaps = .FALSE. !< flag to determine if AeroDyn is computing aero maps (true) or running a normal simulation (false) [-] REAL(ReKi) :: Gravity = 0.0_ReKi !< Gravity force [Nm/s^2] INTEGER(IntKi) :: MHK = 0_IntKi !< MHK turbine type switch [-] + LOGICAL :: CompSeaSt = .false. !< Flag to indicate whether SeaState is selected [-] REAL(ReKi) :: defFldDens = 0.0_ReKi !< Default fluid density from the driver; may be overwritten [kg/m^3] REAL(ReKi) :: defKinVisc = 0.0_ReKi !< Default kinematic viscosity from the driver; may be overwritten [m^2/s] REAL(ReKi) :: defSpdSound = 0.0_ReKi !< Default speed of sound from the driver; may be overwritten [m/s] @@ -147,9 +152,15 @@ MODULE AeroDyn_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlTwist !< Twist at blade node [radians] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlChord !< Chord at blade node [m] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BlAFID !< ID of Airfoil at blade node [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: t_c !< Thickness to chord ratio at blade node [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlCb !< Coefficient of buoyancy at blade node [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlCenBn !< Center of buoyancy normal offset at blade node [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlCenBt !< Center of buoyancy tangential offset at blade node [m] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlCpn !< Chordwise coefficient of dynamic pressure at blade node [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlCpt !< Edgewise coefficient of dynamic pressure at blade node [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlCan !< Chordwise coefficient of added mass at blade node [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlCat !< Edgewise coefficient of added mass at blade node [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlCam !< Pitch coefficient of added mass at blade node [-] END TYPE AD_BladePropsType ! ======================= ! ========= AD_BladeShape ======= @@ -159,19 +170,12 @@ MODULE AeroDyn_Types ! ======================= ! ========= RotInitOutputType ======= TYPE, PUBLIC :: RotInitOutputType + TYPE(ModVarsType) :: Vars !< Module Variables [-] REAL(ReKi) :: AirDens = 0.0_ReKi !< Air density [kg/m^3] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(AD_BladeShape) , DIMENSION(:), ALLOCATABLE :: BladeShape !< airfoil coordinates for each blade [m] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_x !< Names of the continuous states used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_y !< Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_x !< Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame (not used for glue) [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_u !< Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) [-] TYPE(AD_BladePropsType) , DIMENSION(:), ALLOCATABLE :: BladeProps !< blade property information from blade input files [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: DerivOrder_x !< Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrElev !< Elevation at tower node [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrDiam !< Diameter of tower at node [m] END TYPE RotInitOutputType @@ -192,6 +196,8 @@ MODULE AeroDyn_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrCd !< Coefficient of drag at tower node [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrTI !< Turbulence intensity for tower shadow at tower node [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrCb !< Coefficient of buoyancy at tower node [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrCp !< Coefficient of dynamic pressure at tower node [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrCa !< Coefficient of added mass at tower node [-] REAL(ReKi) :: VolHub = 0.0_ReKi !< Hub volume [m^3] REAL(ReKi) :: HubCenBx = 0.0_ReKi !< Hub center of buoyancy x direction offset [m] REAL(ReKi) :: VolNac = 0.0_ReKi !< Nacelle volume [m^3] @@ -214,7 +220,6 @@ MODULE AeroDyn_Types INTEGER(IntKi) :: TwrShadow = 0_IntKi !< Type of tower influence on wind based on downstream tower shadow {0=none, 1=Powles model, 2=Eames model} [-] INTEGER(IntKi) :: TwrAero = 0_IntKi !< Calculate tower aerodynamic loads? {0=none, 1=aero without VIV, 2=aero with VIV} [-] LOGICAL :: CavitCheck = .false. !< Flag that tells us if we want to check for cavitation [-] - LOGICAL :: Buoyancy = .false. !< Include buoyancy effects? [flag] LOGICAL :: NacelleDrag = .false. !< Include NacelleDrag effects? [flag] LOGICAL :: CompAA = .false. !< Compute AeroAcoustic noise [flag] CHARACTER(1024) :: AA_InputFile !< AeroAcoustics input file name [quoted strings] @@ -317,75 +322,6 @@ MODULE AeroDyn_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WakeLocationPoints !< wake points velocity [m/s] END TYPE AD_OtherStateType ! ======================= -! ========= RotMiscVarType ======= - TYPE, PUBLIC :: RotMiscVarType - TYPE(BEMT_MiscVarType) :: BEMT !< MiscVars from the BEMT module [-] - TYPE(BEMT_OutputType) :: BEMT_y !< Outputs from the BEMT module [-] - TYPE(BEMT_InputType) , DIMENSION(1:2) :: BEMT_u !< Inputs to the BEMT module [-] - TYPE(AA_MiscVarType) :: AA !< MiscVars from the AA module [-] - TYPE(AA_OutputType) :: AA_y !< Outputs from the AA module [-] - TYPE(AA_InputType) :: AA_u !< Inputs to the AA module [-] - REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: DisturbedInflow !< InflowOnBlade values modified by tower influence [m/s] - REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: SectAvgInflow !< Sector averaged - disturbed inflow to improve BEM shear calculations [m/s] - REAL(R8Ki) , DIMENSION(:,:,:,:), ALLOCATABLE :: orientationAnnulus !< Coordinate system equivalent to BladeMotion Orientation, but without live sweep, blade-pitch, and twist angles [-] - REAL(R8Ki) , DIMENSION(:,:,:,:), ALLOCATABLE :: R_li !< Transformation matrix from inertial system to the staggered polar coordinate system of a given section [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AllOuts !< An array holding the value of all of the calculated (not only selected) output channels [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: W_Twr !< relative wind speed normal to the tower at node j [m/s] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: X_Twr !< local x-component of force per unit length of the jth node in the tower [m/s] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Y_Twr !< local y-component of force per unit length of the jth node in the tower [m/s] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Cant !< curvature angle, saved for possible output to file [rad] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Toe !< Toe angle, saved for possible output to file [rad] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TwrClrnc !< Distance between tower (including tower radius) and blade node (not including blade width), saved for possible output to file [m] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: X !< normal force per unit length (normal to the plane, not chord) of the jth node in the kth blade [N/m] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Y !< tangential force per unit length (tangential to the plane, not chord) of the jth node in the kth blade [N/m] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Z !< axial force per unit length (tangential to the plane, not chord) of the jth node in the kth blade [N/m] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: M !< pitching moment per unit length of the jth node in the kth blade [Nm/m] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Mx !< pitching moment per unit length of the jth node in the kth blade (in x direction) [Nm/m] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: My !< pitching moment per unit length of the jth node in the kth blade (in y direction) [Nm/m] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Mz !< pitching moment per unit length of the jth node in the kth blade (in z direction) [Nm/m] - REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: Vind_i !< Induced velocities at jth node and kth blade (3xnSpanxnB) [m/s] - REAL(ReKi) , DIMENSION(1:3) :: V_DiskAvg = 0.0_ReKi !< disk-average relative wind speed [m/s] - REAL(ReKi) :: yaw = 0.0_ReKi !< Yaw calculated in SetInputsForBEMT [rad] - REAL(ReKi) :: tilt = 0.0_ReKi !< tilt calculated in SetInputsForBEMT [rad] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: hub_theta_x_root !< angles saved for FAST.Farm [rad] - REAL(ReKi) :: V_dot_x = 0.0_ReKi - TYPE(MeshType) :: HubLoad !< mesh at hub; used to compute an integral for mapping the output blade loads to a single point (for writing to file only) [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: B_L_2_H_P !< mapping data structure to map each bladeLoad output mesh to the MiscVar%HubLoad mesh [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: SigmaCavitCrit !< critical cavitation number- inception value (above which cavit will occur) [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: SigmaCavit !< cavitation number at node [-] - LOGICAL , DIMENSION(:,:), ALLOCATABLE :: CavitWarnSet !< cavitation warning issued [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TwrFB !< buoyant force per unit length at tower node [N/m] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TwrMB !< buoyant moment per unit length at tower node [Nm/m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: HubFB !< buoyant force at hub node [N] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: HubMB !< buoyant moment at hub node [Nm] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacFB !< buoyant force at nacelle (tower top) node [N] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacMB !< buoyant moment at nacelle (tower top) node [Nm] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacDragF !< drag force at nacelle (tower top) node [N] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacDragM !< drag moment at nacelle (tower top) node [Nm] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacFi !< Total force at nacelle (tower top) node [N] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacMi !< Total moment at nacelle (tower top) node [Nm] - TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeRootLoad !< meshes at blade root; used to compute an integral for mapping the output blade loads to single points (for writing to file only) [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: B_L_2_R_P !< mapping data structure to map each bladeLoad output mesh to corresponding MiscVar%BladeRootLoad mesh [-] - TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeBuoyLoadPoint !< point mesh for lumped buoyant blade loads [-] - TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeBuoyLoad !< line mesh for per unit length buoyant blade loads [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: B_P_2_B_L !< mapping data structure to map buoyant blade point loads (m%BladeBuoyLoadPoint) to buoyant blade line loads (m%BladeBuoyLoad) [-] - TYPE(MeshType) :: TwrBuoyLoadPoint !< point mesh for lumped buoyant tower loads [-] - TYPE(MeshType) :: TwrBuoyLoad !< line mesh for per unit length buoyant tower loads [-] - TYPE(MeshMapType) :: T_P_2_T_L !< mapping data structure to map buoyant tower point loads (m%TwrBuoyLoadPoint) to buoyant tower line loads (m%TwrBuoyLoad) [-] - LOGICAL :: FirstWarn_TowerStrike = .false. !< flag to avoid printing tower strike multiple times [-] - REAL(ReKi) , DIMENSION(1:3) :: AvgDiskVel = 0.0_ReKi !< disk-averaged U,V,W (undisturbed) [m/s] - REAL(ReKi) , DIMENSION(1:3) :: AvgDiskVelDist = 0.0_ReKi !< disk-averaged U,V,W (disturbed) [m/s] - REAL(ReKi) :: TFinAlpha = 0.0_ReKi !< Angle of attack for tailfin [-] - REAL(ReKi) :: TFinRe = 0.0_ReKi !< Reynolds number for tailfin [-] - REAL(ReKi) :: TFinVrel = 0.0_ReKi !< Orthogonal relative velocity nrom at the reference point [-] - REAL(ReKi) , DIMENSION(1:3) :: TFinVund_i = 0.0_ReKi !< Undisturbed wind velocity at the reference point of the fin in the inertial system [-] - REAL(ReKi) , DIMENSION(1:3) :: TFinVind_i = 0.0_ReKi !< Induced velocity at the reference point of the fin in the inertial system [-] - REAL(ReKi) , DIMENSION(1:3) :: TFinVrel_i = 0.0_ReKi !< Relative velocity at the reference point of the fin in the inertial system [-] - REAL(ReKi) , DIMENSION(1:3) :: TFinSTV_i = 0.0_ReKi !< Structural velocity at the reference point of the fin in the inertial system [-] - REAL(ReKi) , DIMENSION(1:3) :: TFinF_i = 0.0_ReKi !< Forces at the reference point of the fin in the inertial system [-] - REAL(ReKi) , DIMENSION(1:3) :: TFinM_i = 0.0_ReKi !< Moments at the reference point of the fin in the inertial system [-] - END TYPE RotMiscVarType -! ======================= ! ========= ElemInflowType ======= TYPE, PUBLIC :: ElemInflowType REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: InflowVel !< U,V,W at nodes on element (note if we change the requirement that NumNodes is the same for each blade, this will need to change) [m/s] @@ -408,39 +344,6 @@ MODULE AeroDyn_Types TYPE(RotInflowType) , DIMENSION(:), ALLOCATABLE :: RotInflow !< Inflow on rotor [-] END TYPE AD_InflowType ! ======================= -! ========= AD_MiscVarType ======= - TYPE, PUBLIC :: AD_MiscVarType - TYPE(RotMiscVarType) , DIMENSION(:), ALLOCATABLE :: rotors !< MiscVars for each rotor [-] - TYPE(FVW_InputType) , DIMENSION(:), ALLOCATABLE :: FVW_u !< Inputs to the FVW module [-] - TYPE(FVW_OutputType) :: FVW_y !< Outputs from the FVW module [-] - TYPE(FVW_MiscVarType) :: FVW !< MiscVars from the FVW module [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WindPos !< XYZ coordinates to query for wind velocity/acceleration [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WindVel !< XYZ components of wind velocity [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WindAcc !< XYZ components of wind acceleration [-] - TYPE(AD_InflowType) , DIMENSION(:), ALLOCATABLE :: Inflow !< Inflow storage (size of u for history of inputs) [-] - END TYPE AD_MiscVarType -! ======================= -! ========= Jac_u_idxStarts ======= - TYPE, PUBLIC :: Jac_u_idxStarts - INTEGER(IntKi) :: Nacelle = 1 !< Index to first point in u jacobian for Nacelle [-] - INTEGER(IntKi) :: Hub = 1 !< Index to first point in u jacobian for Hub [-] - INTEGER(IntKi) :: TFin = 1 !< Index to first point in u jacobian for TFin [-] - INTEGER(IntKi) :: Tower = 1 !< Index to first point in u jacobian for Tower [-] - INTEGER(IntKi) :: BladeRoot = 1 !< Index to first point in u jacobian for BladeRoot [-] - INTEGER(IntKi) :: Blade = 1 !< Index to first point in u jacobian for Blade [-] - INTEGER(IntKi) :: UserProp = 1 !< Index to first point in u jacobian for UserProp [-] - INTEGER(IntKi) :: Extended = 1 !< Index to first point in u jacobian for Extended [-] - END TYPE Jac_u_idxStarts -! ======================= -! ========= Jac_y_idxStarts ======= - TYPE, PUBLIC :: Jac_y_idxStarts - INTEGER(IntKi) :: NacelleLoad = 1 !< Index to first point in y jacobian for NacelleLoad [-] - INTEGER(IntKi) :: HubLoad = 1 !< Index to first point in y jacobian for HubLoad [-] - INTEGER(IntKi) :: TFinLoad = 1 !< Index to first point in y jacobian for TFinLoad [-] - INTEGER(IntKi) :: TowerLoad = 1 !< Index to first point in y jacobian for TowerLoad [-] - INTEGER(IntKi) :: BladeLoad = 1 !< Index to first point in y jacobian for BladeLoad [-] - END TYPE Jac_y_idxStarts -! ======================= ! ========= RotParameterType ======= TYPE, PUBLIC :: RotParameterType INTEGER(IntKi) :: NumBlades = 0_IntKi !< Number of blades on the turbine [-] @@ -451,6 +354,8 @@ MODULE AeroDyn_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrTI !< Turbulence intensity for tower shadow at tower node [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlTwist !< Twist at blade node [radians] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrCb !< Coefficient of buoyancy at tower node [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrCp !< Coefficient of dynamic pressure at tower node [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrCa !< Coefficient of added mass at tower node [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlCenBn !< Normal offset between aerodynamic center and center of buoyancy at blade node [m] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlCenBt !< Tangential offset between aerodynamic center and center of buoyancy at blade node [m] REAL(ReKi) :: VolHub = 0.0_ReKi !< Hub volume [m^3] @@ -466,15 +371,19 @@ MODULE AeroDyn_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlDL !< Matrix of blade element length based on CB, used in buoyancy calculation [m] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlTaper !< Matrix of blade element taper, used in buoyancy calculation [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlAxCent !< Matrix of blade element axial centroid, used in buoyancy calculation [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlIN !< Matrix of blade node normal-to-chord inertia factor [kg/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlIT !< Matrix of blade node tangential-to-chord inertia factor [kg/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlAN !< Matrix of blade node normal-to-chord added mass factor [kg/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlAT !< Matrix of blade node tangential-to-chord added mass factor [kg/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlAM !< Matrix of blade node pitch added mass factor [kgm] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrRad !< Array of equivalent tower radius at each node, used in buoyancy calculation [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrDL !< Array of tower element length, used in buoyancy calculation [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrTaper !< Array of tower element taper, used in buoyancy calculation [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrAxCent !< Array of tower element axial centroid, used in buoyancy calculation [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrIT !< Array of tower node tangential inertia factor [kg/m] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrAT !< Array of tower node tangential added mass factor [kg/m] TYPE(BEMT_ParameterType) :: BEMT !< Parameters for BEMT module [-] TYPE(AA_ParameterType) :: AA !< Parameters for AA module [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] - TYPE(Jac_u_idxStarts) :: Jac_u_idxStartList !< Starting indices for all Jac_u components [-] - TYPE(Jac_y_idxStarts) :: Jac_y_idxStartList !< Starting indices for all Jac_y components [-] INTEGER(IntKi) :: NumExtendedInputs = 0_IntKi !< number of extended inputs [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: du !< vector that determines size of perturbation for u (inputs) [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: dx !< vector that determines size of perturbation for x (continuous states) [-] @@ -485,7 +394,6 @@ MODULE AeroDyn_Types INTEGER(IntKi) :: TwrAero = 0_IntKi !< Calculate tower aerodynamic loads? {0=none, 1=aero without VIV, 2=aero with VIV} [switch] INTEGER(IntKi) :: DBEMT_Mod = 0_IntKi !< DBEMT_Mod [-] LOGICAL :: CavitCheck = .false. !< Flag that tells us if we want to check for cavitation [-] - LOGICAL :: Buoyancy = .false. !< Include buoyancy effects? [flag] LOGICAL :: NacelleDrag = .false. !< Include NacelleDrag effects? [flag] INTEGER(IntKi) :: MHK = 0_IntKi !< MHK [flag] LOGICAL :: CompAA = .false. !< Compute AeroAcoustic noise [flag] @@ -527,12 +435,14 @@ MODULE AeroDyn_Types TYPE(FVW_ParameterType) :: FVW !< Parameters for FVW module [-] LOGICAL :: CompAeroMaps = .FALSE. !< flag to determine if AeroDyn is computing aero maps (true) or running a normal simulation (false) [-] LOGICAL :: UA_Flag = .false. !< logical flag indicating whether to use UnsteadyAero [-] + LOGICAL :: CompSeaSt = .false. !< Flag to indicate whether SeaState is selected [-] TYPE(FlowFieldType) , POINTER :: FlowField => NULL() !< Pointer of InflowWinds flow field data type [-] LOGICAL :: SectAvg = .false. !< Use Sector average for BEM inflow velocity calculation [-] INTEGER(IntKi) :: SA_Weighting = 0_IntKi !< Sector Average - Weighting function for sector average {1=Uniform, 2=Impulse} within a 360/nB sector centered on the blade (switch) [used only when SectAvg=True] [-] REAL(ReKi) :: SA_PsiBwd = 0.0_ReKi !< Sector Average - Backard Azimuth (<0) [deg] REAL(ReKi) :: SA_PsiFwd = 0.0_ReKi !< Sector Average - Forward Azimuth (>0) [deg] INTEGER(IntKi) :: SA_nPerSec = 0_IntKi !< Sector Average - Number of points per sector (>1) [-] + TYPE(SeaSt_WaveFieldType) , POINTER :: WaveField => NULL() !< Pointer to SeaState wave field data type [-] END TYPE AD_ParameterType ! ======================= ! ========= RotInputType ======= @@ -566,7 +476,123 @@ MODULE AeroDyn_Types TYPE(RotOutputType) , DIMENSION(:), ALLOCATABLE :: rotors !< Ouputs for each rotor [-] END TYPE AD_OutputType ! ======================= -CONTAINS +! ========= RotMiscVarType ======= + TYPE, PUBLIC :: RotMiscVarType + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] + TYPE(RotContinuousStateType) :: x_init !< [-] + TYPE(RotContinuousStateType) :: x_perturb !< [-] + TYPE(RotContinuousStateType) :: dxdt_lin !< [-] + TYPE(RotInputType) :: u_perturb !< [-] + TYPE(RotOutputType) :: y_lin !< [-] + TYPE(RotConstraintStateType) :: z_lin !< [-] + TYPE(RotOtherStateType) :: OtherState_init !< [-] + TYPE(RotOtherStateType) :: OtherState_jac !< [-] + TYPE(BEMT_MiscVarType) :: BEMT !< MiscVars from the BEMT module [-] + TYPE(BEMT_OutputType) :: BEMT_y !< Outputs from the BEMT module [-] + TYPE(BEMT_InputType) , DIMENSION(1:2) :: BEMT_u !< Inputs to the BEMT module [-] + TYPE(AA_MiscVarType) :: AA !< MiscVars from the AA module [-] + TYPE(AA_OutputType) :: AA_y !< Outputs from the AA module [-] + TYPE(AA_InputType) :: AA_u !< Inputs to the AA module [-] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: DisturbedInflow !< InflowOnBlade values modified by tower influence [m/s] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: SectAvgInflow !< Sector averaged - disturbed inflow to improve BEM shear calculations [m/s] + REAL(R8Ki) , DIMENSION(:,:,:,:), ALLOCATABLE :: orientationAnnulus !< Coordinate system equivalent to BladeMotion Orientation, but without live sweep, blade-pitch, and twist angles [-] + REAL(R8Ki) , DIMENSION(:,:,:,:), ALLOCATABLE :: R_li !< Transformation matrix from inertial system to the staggered polar coordinate system of a given section [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AllOuts !< An array holding the value of all of the calculated (not only selected) output channels [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: W_Twr !< relative wind speed normal to the tower at node j [m/s] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: X_Twr !< local x-component of force per unit length of the jth node in the tower [m/s] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Y_Twr !< local y-component of force per unit length of the jth node in the tower [m/s] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Cant !< curvature angle, saved for possible output to file [rad] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Toe !< Toe angle, saved for possible output to file [rad] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TwrClrnc !< Distance between tower (including tower radius) and blade node (not including blade width), saved for possible output to file [m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: X !< normal force per unit length (normal to the plane, not chord) of the jth node in the kth blade [N/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Y !< tangential force per unit length (tangential to the plane, not chord) of the jth node in the kth blade [N/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Z !< axial force per unit length (tangential to the plane, not chord) of the jth node in the kth blade [N/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: M !< pitching moment per unit length of the jth node in the kth blade [Nm/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Mx !< pitching moment per unit length of the jth node in the kth blade (in x direction) [Nm/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: My !< pitching moment per unit length of the jth node in the kth blade (in y direction) [Nm/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Mz !< pitching moment per unit length of the jth node in the kth blade (in z direction) [Nm/m] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: Vind_i !< Induced velocities at jth node and kth blade (3xnSpanxnB) [m/s] + REAL(ReKi) , DIMENSION(1:3) :: V_DiskAvg = 0.0_ReKi !< disk-average relative wind speed [m/s] + REAL(ReKi) :: yaw = 0.0_ReKi !< Yaw calculated in SetInputsForBEMT [rad] + REAL(ReKi) :: tilt = 0.0_ReKi !< tilt calculated in SetInputsForBEMT [rad] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: hub_theta_x_root !< angles saved for FAST.Farm [rad] + REAL(ReKi) :: V_dot_x = 0.0_ReKi + TYPE(MeshType) :: HubLoad !< mesh at hub; used to compute an integral for mapping the output blade loads to a single point (for writing to file only) [-] + TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: B_L_2_H_P !< mapping data structure to map each bladeLoad output mesh to the MiscVar%HubLoad mesh [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: SigmaCavitCrit !< critical cavitation number- inception value (above which cavit will occur) [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: SigmaCavit !< cavitation number at node [-] + LOGICAL , DIMENSION(:,:), ALLOCATABLE :: CavitWarnSet !< cavitation warning issued [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TwrFB !< buoyant force per unit length at tower node [N/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TwrMB !< buoyant moment per unit length at tower node [Nm/m] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: HubFB !< buoyant force at hub node [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: HubMB !< buoyant moment at hub node [Nm] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacFB !< buoyant force at nacelle (tower top) node [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacMB !< buoyant moment at nacelle (tower top) node [Nm] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacDragF !< drag force at nacelle (tower top) node [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacDragM !< drag moment at nacelle (tower top) node [Nm] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacFi !< Total force at nacelle (tower top) node [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacMi !< Total moment at nacelle (tower top) node [Nm] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: BlFI !< inertia force per unit length at blade node [N/m] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: BlFA !< added mass force per unit length at blade node [N/m] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: BlMA !< added mass moment per unit length at blade node [N/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TwrFI !< inertia force per unit length at tower node [N/m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TwrFA !< added mass force per unit length at tower node [N/m] + TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeRootLoad !< meshes at blade root; used to compute an integral for mapping the output blade loads to single points (for writing to file only) [-] + TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: B_L_2_R_P !< mapping data structure to map each bladeLoad output mesh to corresponding MiscVar%BladeRootLoad mesh [-] + TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeBuoyLoadPoint !< point mesh for lumped buoyant blade loads [-] + TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeBuoyLoad !< line mesh for per unit length buoyant blade loads [-] + TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: B_P_2_B_L !< mapping data structure to map buoyant blade point loads (m%BladeBuoyLoadPoint) to buoyant blade line loads (m%BladeBuoyLoad) [-] + TYPE(MeshType) :: TwrBuoyLoadPoint !< point mesh for lumped buoyant tower loads [-] + TYPE(MeshType) :: TwrBuoyLoad !< line mesh for per unit length buoyant tower loads [-] + TYPE(MeshMapType) :: T_P_2_T_L !< mapping data structure to map buoyant tower point loads (m%TwrBuoyLoadPoint) to buoyant tower line loads (m%TwrBuoyLoad) [-] + LOGICAL :: FirstWarn_TowerStrike = .false. !< flag to avoid printing tower strike multiple times [-] + REAL(ReKi) , DIMENSION(1:3) :: AvgDiskVel = 0.0_ReKi !< disk-averaged U,V,W (undisturbed) [m/s] + REAL(ReKi) , DIMENSION(1:3) :: AvgDiskVelDist = 0.0_ReKi !< disk-averaged U,V,W (disturbed) [m/s] + REAL(ReKi) :: TFinAlpha = 0.0_ReKi !< Angle of attack for tailfin [-] + REAL(ReKi) :: TFinRe = 0.0_ReKi !< Reynolds number for tailfin [-] + REAL(ReKi) :: TFinVrel = 0.0_ReKi !< Orthogonal relative velocity nrom at the reference point [-] + REAL(ReKi) , DIMENSION(1:3) :: TFinVund_i = 0.0_ReKi !< Undisturbed wind velocity at the reference point of the fin in the inertial system [-] + REAL(ReKi) , DIMENSION(1:3) :: TFinVind_i = 0.0_ReKi !< Induced velocity at the reference point of the fin in the inertial system [-] + REAL(ReKi) , DIMENSION(1:3) :: TFinVrel_i = 0.0_ReKi !< Relative velocity at the reference point of the fin in the inertial system [-] + REAL(ReKi) , DIMENSION(1:3) :: TFinSTV_i = 0.0_ReKi !< Structural velocity at the reference point of the fin in the inertial system [-] + REAL(ReKi) , DIMENSION(1:3) :: TFinF_i = 0.0_ReKi !< Forces at the reference point of the fin in the inertial system [-] + REAL(ReKi) , DIMENSION(1:3) :: TFinM_i = 0.0_ReKi !< Moments at the reference point of the fin in the inertial system [-] + END TYPE RotMiscVarType +! ======================= +! ========= AD_MiscVarType ======= + TYPE, PUBLIC :: AD_MiscVarType + TYPE(RotMiscVarType) , DIMENSION(:), ALLOCATABLE :: rotors !< MiscVars for each rotor [-] + TYPE(FVW_InputType) , DIMENSION(:), ALLOCATABLE :: FVW_u !< Inputs to the FVW module [-] + TYPE(FVW_OutputType) :: FVW_y !< Outputs from the FVW module [-] + TYPE(FVW_MiscVarType) :: FVW !< MiscVars from the FVW module [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WindPos !< XYZ coordinates to query for wind velocity/acceleration [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WindVel !< XYZ components of wind velocity [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WindAcc !< XYZ components of wind acceleration [-] + TYPE(GridInterp_MiscVarType) :: WaveField_m !< misc var information from the SeaState WaveField module [-] + TYPE(AD_InflowType) , DIMENSION(:), ALLOCATABLE :: Inflow !< Inflow storage (size of u for history of inputs) [-] + TYPE(AD_InputType) :: u_perturb !< input perturbation for linearization [-] + TYPE(AD_OutputType) :: y_lin !< output perturbation for linearization [-] + END TYPE AD_MiscVarType +! ======================= + integer(IntKi), public, parameter :: AD_x_BEMT_UA_element_x = 1 ! AD%BEMT%UA%element(DL%i1, DL%i2)%x + integer(IntKi), public, parameter :: AD_x_BEMT_DBEMT_element_vind = 2 ! AD%BEMT%DBEMT%element(DL%i1, DL%i2)%vind + integer(IntKi), public, parameter :: AD_x_BEMT_DBEMT_element_vind_1 = 3 ! AD%BEMT%DBEMT%element(DL%i1, DL%i2)%vind_1 + integer(IntKi), public, parameter :: AD_x_BEMT_V_w = 4 ! AD%BEMT%V_w + integer(IntKi), public, parameter :: AD_u_NacelleMotion = 5 ! AD%NacelleMotion + integer(IntKi), public, parameter :: AD_u_TowerMotion = 6 ! AD%TowerMotion + integer(IntKi), public, parameter :: AD_u_HubMotion = 7 ! AD%HubMotion + integer(IntKi), public, parameter :: AD_u_BladeRootMotion = 8 ! AD%BladeRootMotion(DL%i1) + integer(IntKi), public, parameter :: AD_u_BladeMotion = 9 ! AD%BladeMotion(DL%i1) + integer(IntKi), public, parameter :: AD_u_TFinMotion = 10 ! AD%TFinMotion + integer(IntKi), public, parameter :: AD_u_UserProp = 11 ! AD%UserProp + integer(IntKi), public, parameter :: AD_y_NacelleLoad = 12 ! AD%NacelleLoad + integer(IntKi), public, parameter :: AD_y_HubLoad = 13 ! AD%HubLoad + integer(IntKi), public, parameter :: AD_y_TowerLoad = 14 ! AD%TowerLoad + integer(IntKi), public, parameter :: AD_y_BladeLoad = 15 ! AD%BladeLoad(DL%i1) + integer(IntKi), public, parameter :: AD_y_TFinLoad = 16 ! AD%TFinLoad + integer(IntKi), public, parameter :: AD_y_WriteOutput = 17 ! AD%WriteOutput + +contains subroutine AD_CopyTFinParameterType(SrcTFinParameterTypeData, DstTFinParameterTypeData, CtrlCode, ErrStat, ErrMsg) type(TFinParameterType), intent(in) :: SrcTFinParameterTypeData @@ -1011,6 +1037,7 @@ subroutine AD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSta DstInitInputData%CompAeroMaps = SrcInitInputData%CompAeroMaps DstInitInputData%Gravity = SrcInitInputData%Gravity DstInitInputData%MHK = SrcInitInputData%MHK + DstInitInputData%CompSeaSt = SrcInitInputData%CompSeaSt DstInitInputData%defFldDens = SrcInitInputData%defFldDens DstInitInputData%defKinVisc = SrcInitInputData%defKinVisc DstInitInputData%defSpdSound = SrcInitInputData%defSpdSound @@ -1071,6 +1098,7 @@ subroutine AD_PackInitInput(RF, Indata) call RegPack(RF, InData%CompAeroMaps) call RegPack(RF, InData%Gravity) call RegPack(RF, InData%MHK) + call RegPack(RF, InData%CompSeaSt) call RegPack(RF, InData%defFldDens) call RegPack(RF, InData%defKinVisc) call RegPack(RF, InData%defSpdSound) @@ -1120,6 +1148,7 @@ subroutine AD_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%CompAeroMaps); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Gravity); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%MHK); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CompSeaSt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%defFldDens); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%defKinVisc); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%defSpdSound); if (RegCheckErr(RF, RoutineName)) return @@ -1243,6 +1272,18 @@ subroutine AD_CopyBladePropsType(SrcBladePropsTypeData, DstBladePropsTypeData, C end if DstBladePropsTypeData%BlAFID = SrcBladePropsTypeData%BlAFID end if + if (allocated(SrcBladePropsTypeData%t_c)) then + LB(1:1) = lbound(SrcBladePropsTypeData%t_c) + UB(1:1) = ubound(SrcBladePropsTypeData%t_c) + if (.not. allocated(DstBladePropsTypeData%t_c)) then + allocate(DstBladePropsTypeData%t_c(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstBladePropsTypeData%t_c.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstBladePropsTypeData%t_c = SrcBladePropsTypeData%t_c + end if if (allocated(SrcBladePropsTypeData%BlCb)) then LB(1:1) = lbound(SrcBladePropsTypeData%BlCb) UB(1:1) = ubound(SrcBladePropsTypeData%BlCb) @@ -1279,6 +1320,66 @@ subroutine AD_CopyBladePropsType(SrcBladePropsTypeData, DstBladePropsTypeData, C end if DstBladePropsTypeData%BlCenBt = SrcBladePropsTypeData%BlCenBt end if + if (allocated(SrcBladePropsTypeData%BlCpn)) then + LB(1:1) = lbound(SrcBladePropsTypeData%BlCpn) + UB(1:1) = ubound(SrcBladePropsTypeData%BlCpn) + if (.not. allocated(DstBladePropsTypeData%BlCpn)) then + allocate(DstBladePropsTypeData%BlCpn(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstBladePropsTypeData%BlCpn.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstBladePropsTypeData%BlCpn = SrcBladePropsTypeData%BlCpn + end if + if (allocated(SrcBladePropsTypeData%BlCpt)) then + LB(1:1) = lbound(SrcBladePropsTypeData%BlCpt) + UB(1:1) = ubound(SrcBladePropsTypeData%BlCpt) + if (.not. allocated(DstBladePropsTypeData%BlCpt)) then + allocate(DstBladePropsTypeData%BlCpt(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstBladePropsTypeData%BlCpt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstBladePropsTypeData%BlCpt = SrcBladePropsTypeData%BlCpt + end if + if (allocated(SrcBladePropsTypeData%BlCan)) then + LB(1:1) = lbound(SrcBladePropsTypeData%BlCan) + UB(1:1) = ubound(SrcBladePropsTypeData%BlCan) + if (.not. allocated(DstBladePropsTypeData%BlCan)) then + allocate(DstBladePropsTypeData%BlCan(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstBladePropsTypeData%BlCan.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstBladePropsTypeData%BlCan = SrcBladePropsTypeData%BlCan + end if + if (allocated(SrcBladePropsTypeData%BlCat)) then + LB(1:1) = lbound(SrcBladePropsTypeData%BlCat) + UB(1:1) = ubound(SrcBladePropsTypeData%BlCat) + if (.not. allocated(DstBladePropsTypeData%BlCat)) then + allocate(DstBladePropsTypeData%BlCat(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstBladePropsTypeData%BlCat.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstBladePropsTypeData%BlCat = SrcBladePropsTypeData%BlCat + end if + if (allocated(SrcBladePropsTypeData%BlCam)) then + LB(1:1) = lbound(SrcBladePropsTypeData%BlCam) + UB(1:1) = ubound(SrcBladePropsTypeData%BlCam) + if (.not. allocated(DstBladePropsTypeData%BlCam)) then + allocate(DstBladePropsTypeData%BlCam(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstBladePropsTypeData%BlCam.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstBladePropsTypeData%BlCam = SrcBladePropsTypeData%BlCam + end if end subroutine subroutine AD_DestroyBladePropsType(BladePropsTypeData, ErrStat, ErrMsg) @@ -1309,6 +1410,9 @@ subroutine AD_DestroyBladePropsType(BladePropsTypeData, ErrStat, ErrMsg) if (allocated(BladePropsTypeData%BlAFID)) then deallocate(BladePropsTypeData%BlAFID) end if + if (allocated(BladePropsTypeData%t_c)) then + deallocate(BladePropsTypeData%t_c) + end if if (allocated(BladePropsTypeData%BlCb)) then deallocate(BladePropsTypeData%BlCb) end if @@ -1318,6 +1422,21 @@ subroutine AD_DestroyBladePropsType(BladePropsTypeData, ErrStat, ErrMsg) if (allocated(BladePropsTypeData%BlCenBt)) then deallocate(BladePropsTypeData%BlCenBt) end if + if (allocated(BladePropsTypeData%BlCpn)) then + deallocate(BladePropsTypeData%BlCpn) + end if + if (allocated(BladePropsTypeData%BlCpt)) then + deallocate(BladePropsTypeData%BlCpt) + end if + if (allocated(BladePropsTypeData%BlCan)) then + deallocate(BladePropsTypeData%BlCan) + end if + if (allocated(BladePropsTypeData%BlCat)) then + deallocate(BladePropsTypeData%BlCat) + end if + if (allocated(BladePropsTypeData%BlCam)) then + deallocate(BladePropsTypeData%BlCam) + end if end subroutine subroutine AD_PackBladePropsType(RF, Indata) @@ -1333,9 +1452,15 @@ subroutine AD_PackBladePropsType(RF, Indata) call RegPackAlloc(RF, InData%BlTwist) call RegPackAlloc(RF, InData%BlChord) call RegPackAlloc(RF, InData%BlAFID) + call RegPackAlloc(RF, InData%t_c) call RegPackAlloc(RF, InData%BlCb) call RegPackAlloc(RF, InData%BlCenBn) call RegPackAlloc(RF, InData%BlCenBt) + call RegPackAlloc(RF, InData%BlCpn) + call RegPackAlloc(RF, InData%BlCpt) + call RegPackAlloc(RF, InData%BlCan) + call RegPackAlloc(RF, InData%BlCat) + call RegPackAlloc(RF, InData%BlCam) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1355,9 +1480,15 @@ subroutine AD_UnPackBladePropsType(RF, OutData) call RegUnpackAlloc(RF, OutData%BlTwist); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BlChord); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BlAFID); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%t_c); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BlCb); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BlCenBn); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BlCenBt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlCpn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlCpt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlCan); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlCat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlCam); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine AD_CopyBladeShape(SrcBladeShapeData, DstBladeShapeData, CtrlCode, ErrStat, ErrMsg) @@ -1430,6 +1561,9 @@ subroutine AD_CopyRotInitOutputType(SrcRotInitOutputTypeData, DstRotInitOutputTy character(*), parameter :: RoutineName = 'AD_CopyRotInitOutputType' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_CopyModVarsType(SrcRotInitOutputTypeData%Vars, DstRotInitOutputTypeData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return DstRotInitOutputTypeData%AirDens = SrcRotInitOutputTypeData%AirDens if (allocated(SrcRotInitOutputTypeData%WriteOutputHdr)) then LB(1:1) = lbound(SrcRotInitOutputTypeData%WriteOutputHdr) @@ -1471,90 +1605,6 @@ subroutine AD_CopyRotInitOutputType(SrcRotInitOutputTypeData, DstRotInitOutputTy if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcRotInitOutputTypeData%LinNames_y)) then - LB(1:1) = lbound(SrcRotInitOutputTypeData%LinNames_y) - UB(1:1) = ubound(SrcRotInitOutputTypeData%LinNames_y) - if (.not. allocated(DstRotInitOutputTypeData%LinNames_y)) then - allocate(DstRotInitOutputTypeData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInitOutputTypeData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotInitOutputTypeData%LinNames_y = SrcRotInitOutputTypeData%LinNames_y - end if - if (allocated(SrcRotInitOutputTypeData%LinNames_x)) then - LB(1:1) = lbound(SrcRotInitOutputTypeData%LinNames_x) - UB(1:1) = ubound(SrcRotInitOutputTypeData%LinNames_x) - if (.not. allocated(DstRotInitOutputTypeData%LinNames_x)) then - allocate(DstRotInitOutputTypeData%LinNames_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInitOutputTypeData%LinNames_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotInitOutputTypeData%LinNames_x = SrcRotInitOutputTypeData%LinNames_x - end if - if (allocated(SrcRotInitOutputTypeData%LinNames_u)) then - LB(1:1) = lbound(SrcRotInitOutputTypeData%LinNames_u) - UB(1:1) = ubound(SrcRotInitOutputTypeData%LinNames_u) - if (.not. allocated(DstRotInitOutputTypeData%LinNames_u)) then - allocate(DstRotInitOutputTypeData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInitOutputTypeData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotInitOutputTypeData%LinNames_u = SrcRotInitOutputTypeData%LinNames_u - end if - if (allocated(SrcRotInitOutputTypeData%RotFrame_y)) then - LB(1:1) = lbound(SrcRotInitOutputTypeData%RotFrame_y) - UB(1:1) = ubound(SrcRotInitOutputTypeData%RotFrame_y) - if (.not. allocated(DstRotInitOutputTypeData%RotFrame_y)) then - allocate(DstRotInitOutputTypeData%RotFrame_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInitOutputTypeData%RotFrame_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotInitOutputTypeData%RotFrame_y = SrcRotInitOutputTypeData%RotFrame_y - end if - if (allocated(SrcRotInitOutputTypeData%RotFrame_x)) then - LB(1:1) = lbound(SrcRotInitOutputTypeData%RotFrame_x) - UB(1:1) = ubound(SrcRotInitOutputTypeData%RotFrame_x) - if (.not. allocated(DstRotInitOutputTypeData%RotFrame_x)) then - allocate(DstRotInitOutputTypeData%RotFrame_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInitOutputTypeData%RotFrame_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotInitOutputTypeData%RotFrame_x = SrcRotInitOutputTypeData%RotFrame_x - end if - if (allocated(SrcRotInitOutputTypeData%RotFrame_u)) then - LB(1:1) = lbound(SrcRotInitOutputTypeData%RotFrame_u) - UB(1:1) = ubound(SrcRotInitOutputTypeData%RotFrame_u) - if (.not. allocated(DstRotInitOutputTypeData%RotFrame_u)) then - allocate(DstRotInitOutputTypeData%RotFrame_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInitOutputTypeData%RotFrame_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotInitOutputTypeData%RotFrame_u = SrcRotInitOutputTypeData%RotFrame_u - end if - if (allocated(SrcRotInitOutputTypeData%IsLoad_u)) then - LB(1:1) = lbound(SrcRotInitOutputTypeData%IsLoad_u) - UB(1:1) = ubound(SrcRotInitOutputTypeData%IsLoad_u) - if (.not. allocated(DstRotInitOutputTypeData%IsLoad_u)) then - allocate(DstRotInitOutputTypeData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInitOutputTypeData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotInitOutputTypeData%IsLoad_u = SrcRotInitOutputTypeData%IsLoad_u - end if if (allocated(SrcRotInitOutputTypeData%BladeProps)) then LB(1:1) = lbound(SrcRotInitOutputTypeData%BladeProps) UB(1:1) = ubound(SrcRotInitOutputTypeData%BladeProps) @@ -1571,18 +1621,6 @@ subroutine AD_CopyRotInitOutputType(SrcRotInitOutputTypeData, DstRotInitOutputTy if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcRotInitOutputTypeData%DerivOrder_x)) then - LB(1:1) = lbound(SrcRotInitOutputTypeData%DerivOrder_x) - UB(1:1) = ubound(SrcRotInitOutputTypeData%DerivOrder_x) - if (.not. allocated(DstRotInitOutputTypeData%DerivOrder_x)) then - allocate(DstRotInitOutputTypeData%DerivOrder_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInitOutputTypeData%DerivOrder_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotInitOutputTypeData%DerivOrder_x = SrcRotInitOutputTypeData%DerivOrder_x - end if if (allocated(SrcRotInitOutputTypeData%TwrElev)) then LB(1:1) = lbound(SrcRotInitOutputTypeData%TwrElev) UB(1:1) = ubound(SrcRotInitOutputTypeData%TwrElev) @@ -1620,6 +1658,8 @@ subroutine AD_DestroyRotInitOutputType(RotInitOutputTypeData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'AD_DestroyRotInitOutputType' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_DestroyModVarsType(RotInitOutputTypeData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(RotInitOutputTypeData%WriteOutputHdr)) then deallocate(RotInitOutputTypeData%WriteOutputHdr) end if @@ -1635,27 +1675,6 @@ subroutine AD_DestroyRotInitOutputType(RotInitOutputTypeData, ErrStat, ErrMsg) end do deallocate(RotInitOutputTypeData%BladeShape) end if - if (allocated(RotInitOutputTypeData%LinNames_y)) then - deallocate(RotInitOutputTypeData%LinNames_y) - end if - if (allocated(RotInitOutputTypeData%LinNames_x)) then - deallocate(RotInitOutputTypeData%LinNames_x) - end if - if (allocated(RotInitOutputTypeData%LinNames_u)) then - deallocate(RotInitOutputTypeData%LinNames_u) - end if - if (allocated(RotInitOutputTypeData%RotFrame_y)) then - deallocate(RotInitOutputTypeData%RotFrame_y) - end if - if (allocated(RotInitOutputTypeData%RotFrame_x)) then - deallocate(RotInitOutputTypeData%RotFrame_x) - end if - if (allocated(RotInitOutputTypeData%RotFrame_u)) then - deallocate(RotInitOutputTypeData%RotFrame_u) - end if - if (allocated(RotInitOutputTypeData%IsLoad_u)) then - deallocate(RotInitOutputTypeData%IsLoad_u) - end if if (allocated(RotInitOutputTypeData%BladeProps)) then LB(1:1) = lbound(RotInitOutputTypeData%BladeProps) UB(1:1) = ubound(RotInitOutputTypeData%BladeProps) @@ -1665,9 +1684,6 @@ subroutine AD_DestroyRotInitOutputType(RotInitOutputTypeData, ErrStat, ErrMsg) end do deallocate(RotInitOutputTypeData%BladeProps) end if - if (allocated(RotInitOutputTypeData%DerivOrder_x)) then - deallocate(RotInitOutputTypeData%DerivOrder_x) - end if if (allocated(RotInitOutputTypeData%TwrElev)) then deallocate(RotInitOutputTypeData%TwrElev) end if @@ -1683,6 +1699,7 @@ subroutine AD_PackRotInitOutputType(RF, Indata) integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return + call NWTC_Library_PackModVarsType(RF, InData%Vars) call RegPack(RF, InData%AirDens) call RegPackAlloc(RF, InData%WriteOutputHdr) call RegPackAlloc(RF, InData%WriteOutputUnt) @@ -1695,13 +1712,6 @@ subroutine AD_PackRotInitOutputType(RF, Indata) call AD_PackBladeShape(RF, InData%BladeShape(i1)) end do end if - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_x) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%RotFrame_y) - call RegPackAlloc(RF, InData%RotFrame_x) - call RegPackAlloc(RF, InData%RotFrame_u) - call RegPackAlloc(RF, InData%IsLoad_u) call RegPack(RF, allocated(InData%BladeProps)) if (allocated(InData%BladeProps)) then call RegPackBounds(RF, 1, lbound(InData%BladeProps), ubound(InData%BladeProps)) @@ -1711,7 +1721,6 @@ subroutine AD_PackRotInitOutputType(RF, Indata) call AD_PackBladePropsType(RF, InData%BladeProps(i1)) end do end if - call RegPackAlloc(RF, InData%DerivOrder_x) call RegPackAlloc(RF, InData%TwrElev) call RegPackAlloc(RF, InData%TwrDiam) if (RegCheckErr(RF, RoutineName)) return @@ -1726,6 +1735,7 @@ subroutine AD_UnPackRotInitOutputType(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return @@ -1742,13 +1752,6 @@ subroutine AD_UnPackRotInitOutputType(RF, OutData) call AD_UnpackBladeShape(RF, OutData%BladeShape(i1)) ! BladeShape end do end if - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%BladeProps)) deallocate(OutData%BladeProps) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -1762,7 +1765,6 @@ subroutine AD_UnPackRotInitOutputType(RF, OutData) call AD_UnpackBladePropsType(RF, OutData%BladeProps(i1)) ! BladeProps end do end if - call RegUnpackAlloc(RF, OutData%DerivOrder_x); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%TwrElev); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%TwrDiam); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1963,11 +1965,35 @@ subroutine AD_CopyRotInputFile(SrcRotInputFileData, DstRotInputFileData, CtrlCod end if DstRotInputFileData%TwrCb = SrcRotInputFileData%TwrCb end if - DstRotInputFileData%VolHub = SrcRotInputFileData%VolHub - DstRotInputFileData%HubCenBx = SrcRotInputFileData%HubCenBx - DstRotInputFileData%VolNac = SrcRotInputFileData%VolNac - DstRotInputFileData%NacCenB = SrcRotInputFileData%NacCenB - DstRotInputFileData%NacArea = SrcRotInputFileData%NacArea + if (allocated(SrcRotInputFileData%TwrCp)) then + LB(1:1) = lbound(SrcRotInputFileData%TwrCp) + UB(1:1) = ubound(SrcRotInputFileData%TwrCp) + if (.not. allocated(DstRotInputFileData%TwrCp)) then + allocate(DstRotInputFileData%TwrCp(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInputFileData%TwrCp.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotInputFileData%TwrCp = SrcRotInputFileData%TwrCp + end if + if (allocated(SrcRotInputFileData%TwrCa)) then + LB(1:1) = lbound(SrcRotInputFileData%TwrCa) + UB(1:1) = ubound(SrcRotInputFileData%TwrCa) + if (.not. allocated(DstRotInputFileData%TwrCa)) then + allocate(DstRotInputFileData%TwrCa(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInputFileData%TwrCa.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotInputFileData%TwrCa = SrcRotInputFileData%TwrCa + end if + DstRotInputFileData%VolHub = SrcRotInputFileData%VolHub + DstRotInputFileData%HubCenBx = SrcRotInputFileData%HubCenBx + DstRotInputFileData%VolNac = SrcRotInputFileData%VolNac + DstRotInputFileData%NacCenB = SrcRotInputFileData%NacCenB + DstRotInputFileData%NacArea = SrcRotInputFileData%NacArea DstRotInputFileData%NacCd = SrcRotInputFileData%NacCd DstRotInputFileData%NacDragAC = SrcRotInputFileData%NacDragAC DstRotInputFileData%TFinAero = SrcRotInputFileData%TFinAero @@ -2012,6 +2038,12 @@ subroutine AD_DestroyRotInputFile(RotInputFileData, ErrStat, ErrMsg) if (allocated(RotInputFileData%TwrCb)) then deallocate(RotInputFileData%TwrCb) end if + if (allocated(RotInputFileData%TwrCp)) then + deallocate(RotInputFileData%TwrCp) + end if + if (allocated(RotInputFileData%TwrCa)) then + deallocate(RotInputFileData%TwrCa) + end if call AD_DestroyTFinInputFileType(RotInputFileData%TFin, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine @@ -2038,6 +2070,8 @@ subroutine AD_PackRotInputFile(RF, Indata) call RegPackAlloc(RF, InData%TwrCd) call RegPackAlloc(RF, InData%TwrTI) call RegPackAlloc(RF, InData%TwrCb) + call RegPackAlloc(RF, InData%TwrCp) + call RegPackAlloc(RF, InData%TwrCa) call RegPack(RF, InData%VolHub) call RegPack(RF, InData%HubCenBx) call RegPack(RF, InData%VolNac) @@ -2079,6 +2113,8 @@ subroutine AD_UnPackRotInputFile(RF, OutData) call RegUnpackAlloc(RF, OutData%TwrCd); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%TwrTI); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%TwrCb); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrCp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrCa); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VolHub); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HubCenBx); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VolNac); if (RegCheckErr(RF, RoutineName)) return @@ -2112,7 +2148,6 @@ subroutine AD_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSta DstInputFileData%TwrShadow = SrcInputFileData%TwrShadow DstInputFileData%TwrAero = SrcInputFileData%TwrAero DstInputFileData%CavitCheck = SrcInputFileData%CavitCheck - DstInputFileData%Buoyancy = SrcInputFileData%Buoyancy DstInputFileData%NacelleDrag = SrcInputFileData%NacelleDrag DstInputFileData%CompAA = SrcInputFileData%CompAA DstInputFileData%AA_InputFile = SrcInputFileData%AA_InputFile @@ -2280,7 +2315,6 @@ subroutine AD_PackInputFile(RF, Indata) call RegPack(RF, InData%TwrShadow) call RegPack(RF, InData%TwrAero) call RegPack(RF, InData%CavitCheck) - call RegPack(RF, InData%Buoyancy) call RegPack(RF, InData%NacelleDrag) call RegPack(RF, InData%CompAA) call RegPack(RF, InData%AA_InputFile) @@ -2362,7 +2396,6 @@ subroutine AD_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%TwrShadow); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TwrAero); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CavitCheck); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Buoyancy); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NacelleDrag); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompAA); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%AA_InputFile); if (RegCheckErr(RF, RoutineName)) return @@ -3057,1109 +3090,1309 @@ subroutine AD_UnPackOtherState(RF, OutData) call RegUnpackAlloc(RF, OutData%WakeLocationPoints); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_CopyRotMiscVarType(SrcRotMiscVarTypeData, DstRotMiscVarTypeData, CtrlCode, ErrStat, ErrMsg) - type(RotMiscVarType), intent(inout) :: SrcRotMiscVarTypeData - type(RotMiscVarType), intent(inout) :: DstRotMiscVarTypeData +subroutine AD_CopyElemInflowType(SrcElemInflowTypeData, DstElemInflowTypeData, CtrlCode, ErrStat, ErrMsg) + type(ElemInflowType), intent(in) :: SrcElemInflowTypeData + type(ElemInflowType), intent(inout) :: DstElemInflowTypeData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3, i4 - integer(B4Ki) :: LB(4), UB(4) + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyRotMiscVarType' + character(*), parameter :: RoutineName = 'AD_CopyElemInflowType' ErrStat = ErrID_None ErrMsg = '' - call BEMT_CopyMisc(SrcRotMiscVarTypeData%BEMT, DstRotMiscVarTypeData%BEMT, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call BEMT_CopyOutput(SrcRotMiscVarTypeData%BEMT_y, DstRotMiscVarTypeData%BEMT_y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - LB(1:1) = lbound(SrcRotMiscVarTypeData%BEMT_u) - UB(1:1) = ubound(SrcRotMiscVarTypeData%BEMT_u) - do i1 = LB(1), UB(1) - call BEMT_CopyInput(SrcRotMiscVarTypeData%BEMT_u(i1), DstRotMiscVarTypeData%BEMT_u(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call AA_CopyMisc(SrcRotMiscVarTypeData%AA, DstRotMiscVarTypeData%AA, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call AA_CopyOutput(SrcRotMiscVarTypeData%AA_y, DstRotMiscVarTypeData%AA_y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call AA_CopyInput(SrcRotMiscVarTypeData%AA_u, DstRotMiscVarTypeData%AA_u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcRotMiscVarTypeData%DisturbedInflow)) then - LB(1:3) = lbound(SrcRotMiscVarTypeData%DisturbedInflow) - UB(1:3) = ubound(SrcRotMiscVarTypeData%DisturbedInflow) - if (.not. allocated(DstRotMiscVarTypeData%DisturbedInflow)) then - allocate(DstRotMiscVarTypeData%DisturbedInflow(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%DisturbedInflow.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotMiscVarTypeData%DisturbedInflow = SrcRotMiscVarTypeData%DisturbedInflow - end if - if (allocated(SrcRotMiscVarTypeData%SectAvgInflow)) then - LB(1:3) = lbound(SrcRotMiscVarTypeData%SectAvgInflow) - UB(1:3) = ubound(SrcRotMiscVarTypeData%SectAvgInflow) - if (.not. allocated(DstRotMiscVarTypeData%SectAvgInflow)) then - allocate(DstRotMiscVarTypeData%SectAvgInflow(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (allocated(SrcElemInflowTypeData%InflowVel)) then + LB(1:2) = lbound(SrcElemInflowTypeData%InflowVel) + UB(1:2) = ubound(SrcElemInflowTypeData%InflowVel) + if (.not. allocated(DstElemInflowTypeData%InflowVel)) then + allocate(DstElemInflowTypeData%InflowVel(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%SectAvgInflow.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstElemInflowTypeData%InflowVel.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%SectAvgInflow = SrcRotMiscVarTypeData%SectAvgInflow + DstElemInflowTypeData%InflowVel = SrcElemInflowTypeData%InflowVel end if - if (allocated(SrcRotMiscVarTypeData%orientationAnnulus)) then - LB(1:4) = lbound(SrcRotMiscVarTypeData%orientationAnnulus) - UB(1:4) = ubound(SrcRotMiscVarTypeData%orientationAnnulus) - if (.not. allocated(DstRotMiscVarTypeData%orientationAnnulus)) then - allocate(DstRotMiscVarTypeData%orientationAnnulus(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) + if (allocated(SrcElemInflowTypeData%InflowAcc)) then + LB(1:2) = lbound(SrcElemInflowTypeData%InflowAcc) + UB(1:2) = ubound(SrcElemInflowTypeData%InflowAcc) + if (.not. allocated(DstElemInflowTypeData%InflowAcc)) then + allocate(DstElemInflowTypeData%InflowAcc(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%orientationAnnulus.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstElemInflowTypeData%InflowAcc.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%orientationAnnulus = SrcRotMiscVarTypeData%orientationAnnulus + DstElemInflowTypeData%InflowAcc = SrcElemInflowTypeData%InflowAcc end if - if (allocated(SrcRotMiscVarTypeData%R_li)) then - LB(1:4) = lbound(SrcRotMiscVarTypeData%R_li) - UB(1:4) = ubound(SrcRotMiscVarTypeData%R_li) - if (.not. allocated(DstRotMiscVarTypeData%R_li)) then - allocate(DstRotMiscVarTypeData%R_li(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%R_li.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotMiscVarTypeData%R_li = SrcRotMiscVarTypeData%R_li +end subroutine + +subroutine AD_DestroyElemInflowType(ElemInflowTypeData, ErrStat, ErrMsg) + type(ElemInflowType), intent(inout) :: ElemInflowTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'AD_DestroyElemInflowType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(ElemInflowTypeData%InflowVel)) then + deallocate(ElemInflowTypeData%InflowVel) end if - if (allocated(SrcRotMiscVarTypeData%AllOuts)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%AllOuts) - UB(1:1) = ubound(SrcRotMiscVarTypeData%AllOuts) - if (.not. allocated(DstRotMiscVarTypeData%AllOuts)) then - allocate(DstRotMiscVarTypeData%AllOuts(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%AllOuts.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotMiscVarTypeData%AllOuts = SrcRotMiscVarTypeData%AllOuts + if (allocated(ElemInflowTypeData%InflowAcc)) then + deallocate(ElemInflowTypeData%InflowAcc) end if - if (allocated(SrcRotMiscVarTypeData%W_Twr)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%W_Twr) - UB(1:1) = ubound(SrcRotMiscVarTypeData%W_Twr) - if (.not. allocated(DstRotMiscVarTypeData%W_Twr)) then - allocate(DstRotMiscVarTypeData%W_Twr(LB(1):UB(1)), stat=ErrStat2) +end subroutine + +subroutine AD_PackElemInflowType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(ElemInflowType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackElemInflowType' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%InflowVel) + call RegPackAlloc(RF, InData%InflowAcc) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AD_UnPackElemInflowType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(ElemInflowType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackElemInflowType' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%InflowVel); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%InflowAcc); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AD_CopyRotInflowType(SrcRotInflowTypeData, DstRotInflowTypeData, CtrlCode, ErrStat, ErrMsg) + type(RotInflowType), intent(in) :: SrcRotInflowTypeData + type(RotInflowType), intent(inout) :: DstRotInflowTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AD_CopyRotInflowType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcRotInflowTypeData%Blade)) then + LB(1:1) = lbound(SrcRotInflowTypeData%Blade) + UB(1:1) = ubound(SrcRotInflowTypeData%Blade) + if (.not. allocated(DstRotInflowTypeData%Blade)) then + allocate(DstRotInflowTypeData%Blade(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%W_Twr.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInflowTypeData%Blade.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%W_Twr = SrcRotMiscVarTypeData%W_Twr + do i1 = LB(1), UB(1) + call AD_CopyElemInflowType(SrcRotInflowTypeData%Blade(i1), DstRotInflowTypeData%Blade(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcRotMiscVarTypeData%X_Twr)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%X_Twr) - UB(1:1) = ubound(SrcRotMiscVarTypeData%X_Twr) - if (.not. allocated(DstRotMiscVarTypeData%X_Twr)) then - allocate(DstRotMiscVarTypeData%X_Twr(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%X_Twr.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotMiscVarTypeData%X_Twr = SrcRotMiscVarTypeData%X_Twr + call AD_CopyElemInflowType(SrcRotInflowTypeData%Tower, DstRotInflowTypeData%Tower, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstRotInflowTypeData%InflowOnHub = SrcRotInflowTypeData%InflowOnHub + DstRotInflowTypeData%InflowOnNacelle = SrcRotInflowTypeData%InflowOnNacelle + DstRotInflowTypeData%InflowOnTailFin = SrcRotInflowTypeData%InflowOnTailFin + DstRotInflowTypeData%AvgDiskVel = SrcRotInflowTypeData%AvgDiskVel +end subroutine + +subroutine AD_DestroyRotInflowType(RotInflowTypeData, ErrStat, ErrMsg) + type(RotInflowType), intent(inout) :: RotInflowTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AD_DestroyRotInflowType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(RotInflowTypeData%Blade)) then + LB(1:1) = lbound(RotInflowTypeData%Blade) + UB(1:1) = ubound(RotInflowTypeData%Blade) + do i1 = LB(1), UB(1) + call AD_DestroyElemInflowType(RotInflowTypeData%Blade(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(RotInflowTypeData%Blade) end if - if (allocated(SrcRotMiscVarTypeData%Y_Twr)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%Y_Twr) - UB(1:1) = ubound(SrcRotMiscVarTypeData%Y_Twr) - if (.not. allocated(DstRotMiscVarTypeData%Y_Twr)) then - allocate(DstRotMiscVarTypeData%Y_Twr(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Y_Twr.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotMiscVarTypeData%Y_Twr = SrcRotMiscVarTypeData%Y_Twr + call AD_DestroyElemInflowType(RotInflowTypeData%Tower, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine AD_PackRotInflowType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(RotInflowType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackRotInflowType' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%Blade)) + if (allocated(InData%Blade)) then + call RegPackBounds(RF, 1, lbound(InData%Blade), ubound(InData%Blade)) + LB(1:1) = lbound(InData%Blade) + UB(1:1) = ubound(InData%Blade) + do i1 = LB(1), UB(1) + call AD_PackElemInflowType(RF, InData%Blade(i1)) + end do end if - if (allocated(SrcRotMiscVarTypeData%Cant)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%Cant) - UB(1:2) = ubound(SrcRotMiscVarTypeData%Cant) - if (.not. allocated(DstRotMiscVarTypeData%Cant)) then - allocate(DstRotMiscVarTypeData%Cant(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Cant.', ErrStat, ErrMsg, RoutineName) - return - end if + call AD_PackElemInflowType(RF, InData%Tower) + call RegPack(RF, InData%InflowOnHub) + call RegPack(RF, InData%InflowOnNacelle) + call RegPack(RF, InData%InflowOnTailFin) + call RegPack(RF, InData%AvgDiskVel) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AD_UnPackRotInflowType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(RotInflowType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackRotInflowType' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%Blade)) deallocate(OutData%Blade) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Blade(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Blade.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if - DstRotMiscVarTypeData%Cant = SrcRotMiscVarTypeData%Cant + do i1 = LB(1), UB(1) + call AD_UnpackElemInflowType(RF, OutData%Blade(i1)) ! Blade + end do end if - if (allocated(SrcRotMiscVarTypeData%Toe)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%Toe) - UB(1:2) = ubound(SrcRotMiscVarTypeData%Toe) - if (.not. allocated(DstRotMiscVarTypeData%Toe)) then - allocate(DstRotMiscVarTypeData%Toe(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + call AD_UnpackElemInflowType(RF, OutData%Tower) ! Tower + call RegUnpack(RF, OutData%InflowOnHub); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%InflowOnNacelle); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%InflowOnTailFin); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AvgDiskVel); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AD_CopyInflowType(SrcInflowTypeData, DstInflowTypeData, CtrlCode, ErrStat, ErrMsg) + type(AD_InflowType), intent(in) :: SrcInflowTypeData + type(AD_InflowType), intent(inout) :: DstInflowTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AD_CopyInflowType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcInflowTypeData%InflowWakeVel)) then + LB(1:2) = lbound(SrcInflowTypeData%InflowWakeVel) + UB(1:2) = ubound(SrcInflowTypeData%InflowWakeVel) + if (.not. allocated(DstInflowTypeData%InflowWakeVel)) then + allocate(DstInflowTypeData%InflowWakeVel(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Toe.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowTypeData%InflowWakeVel.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%Toe = SrcRotMiscVarTypeData%Toe + DstInflowTypeData%InflowWakeVel = SrcInflowTypeData%InflowWakeVel end if - if (allocated(SrcRotMiscVarTypeData%TwrClrnc)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%TwrClrnc) - UB(1:2) = ubound(SrcRotMiscVarTypeData%TwrClrnc) - if (.not. allocated(DstRotMiscVarTypeData%TwrClrnc)) then - allocate(DstRotMiscVarTypeData%TwrClrnc(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcInflowTypeData%RotInflow)) then + LB(1:1) = lbound(SrcInflowTypeData%RotInflow) + UB(1:1) = ubound(SrcInflowTypeData%RotInflow) + if (.not. allocated(DstInflowTypeData%RotInflow)) then + allocate(DstInflowTypeData%RotInflow(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%TwrClrnc.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowTypeData%RotInflow.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%TwrClrnc = SrcRotMiscVarTypeData%TwrClrnc + do i1 = LB(1), UB(1) + call AD_CopyRotInflowType(SrcInflowTypeData%RotInflow(i1), DstInflowTypeData%RotInflow(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcRotMiscVarTypeData%X)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%X) - UB(1:2) = ubound(SrcRotMiscVarTypeData%X) - if (.not. allocated(DstRotMiscVarTypeData%X)) then - allocate(DstRotMiscVarTypeData%X(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) +end subroutine + +subroutine AD_DestroyInflowType(InflowTypeData, ErrStat, ErrMsg) + type(AD_InflowType), intent(inout) :: InflowTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AD_DestroyInflowType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(InflowTypeData%InflowWakeVel)) then + deallocate(InflowTypeData%InflowWakeVel) + end if + if (allocated(InflowTypeData%RotInflow)) then + LB(1:1) = lbound(InflowTypeData%RotInflow) + UB(1:1) = ubound(InflowTypeData%RotInflow) + do i1 = LB(1), UB(1) + call AD_DestroyRotInflowType(InflowTypeData%RotInflow(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(InflowTypeData%RotInflow) + end if +end subroutine + +subroutine AD_PackInflowType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(AD_InflowType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackInflowType' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%InflowWakeVel) + call RegPack(RF, allocated(InData%RotInflow)) + if (allocated(InData%RotInflow)) then + call RegPackBounds(RF, 1, lbound(InData%RotInflow), ubound(InData%RotInflow)) + LB(1:1) = lbound(InData%RotInflow) + UB(1:1) = ubound(InData%RotInflow) + do i1 = LB(1), UB(1) + call AD_PackRotInflowType(RF, InData%RotInflow(i1)) + end do + end if + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AD_UnPackInflowType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(AD_InflowType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackInflowType' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%InflowWakeVel); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%RotInflow)) deallocate(OutData%RotInflow) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%RotInflow(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%RotInflow.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call AD_UnpackRotInflowType(RF, OutData%RotInflow(i1)) ! RotInflow + end do + end if +end subroutine + +subroutine AD_CopyRotParameterType(SrcRotParameterTypeData, DstRotParameterTypeData, CtrlCode, ErrStat, ErrMsg) + type(RotParameterType), intent(in) :: SrcRotParameterTypeData + type(RotParameterType), intent(inout) :: DstRotParameterTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AD_CopyRotParameterType' + ErrStat = ErrID_None + ErrMsg = '' + DstRotParameterTypeData%NumBlades = SrcRotParameterTypeData%NumBlades + DstRotParameterTypeData%NumBlNds = SrcRotParameterTypeData%NumBlNds + DstRotParameterTypeData%NumTwrNds = SrcRotParameterTypeData%NumTwrNds + if (allocated(SrcRotParameterTypeData%TwrDiam)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrDiam) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrDiam) + if (.not. allocated(DstRotParameterTypeData%TwrDiam)) then + allocate(DstRotParameterTypeData%TwrDiam(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%X.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrDiam.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%X = SrcRotMiscVarTypeData%X + DstRotParameterTypeData%TwrDiam = SrcRotParameterTypeData%TwrDiam end if - if (allocated(SrcRotMiscVarTypeData%Y)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%Y) - UB(1:2) = ubound(SrcRotMiscVarTypeData%Y) - if (.not. allocated(DstRotMiscVarTypeData%Y)) then - allocate(DstRotMiscVarTypeData%Y(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrCd)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrCd) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrCd) + if (.not. allocated(DstRotParameterTypeData%TwrCd)) then + allocate(DstRotParameterTypeData%TwrCd(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Y.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrCd.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%Y = SrcRotMiscVarTypeData%Y + DstRotParameterTypeData%TwrCd = SrcRotParameterTypeData%TwrCd end if - if (allocated(SrcRotMiscVarTypeData%Z)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%Z) - UB(1:2) = ubound(SrcRotMiscVarTypeData%Z) - if (.not. allocated(DstRotMiscVarTypeData%Z)) then - allocate(DstRotMiscVarTypeData%Z(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrTI)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrTI) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrTI) + if (.not. allocated(DstRotParameterTypeData%TwrTI)) then + allocate(DstRotParameterTypeData%TwrTI(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Z.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrTI.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%Z = SrcRotMiscVarTypeData%Z + DstRotParameterTypeData%TwrTI = SrcRotParameterTypeData%TwrTI end if - if (allocated(SrcRotMiscVarTypeData%M)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%M) - UB(1:2) = ubound(SrcRotMiscVarTypeData%M) - if (.not. allocated(DstRotMiscVarTypeData%M)) then - allocate(DstRotMiscVarTypeData%M(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlTwist)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlTwist) + UB(1:2) = ubound(SrcRotParameterTypeData%BlTwist) + if (.not. allocated(DstRotParameterTypeData%BlTwist)) then + allocate(DstRotParameterTypeData%BlTwist(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%M.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlTwist.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%M = SrcRotMiscVarTypeData%M + DstRotParameterTypeData%BlTwist = SrcRotParameterTypeData%BlTwist end if - if (allocated(SrcRotMiscVarTypeData%Mx)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%Mx) - UB(1:2) = ubound(SrcRotMiscVarTypeData%Mx) - if (.not. allocated(DstRotMiscVarTypeData%Mx)) then - allocate(DstRotMiscVarTypeData%Mx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrCb)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrCb) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrCb) + if (.not. allocated(DstRotParameterTypeData%TwrCb)) then + allocate(DstRotParameterTypeData%TwrCb(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Mx.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrCb.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%Mx = SrcRotMiscVarTypeData%Mx + DstRotParameterTypeData%TwrCb = SrcRotParameterTypeData%TwrCb end if - if (allocated(SrcRotMiscVarTypeData%My)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%My) - UB(1:2) = ubound(SrcRotMiscVarTypeData%My) - if (.not. allocated(DstRotMiscVarTypeData%My)) then - allocate(DstRotMiscVarTypeData%My(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrCp)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrCp) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrCp) + if (.not. allocated(DstRotParameterTypeData%TwrCp)) then + allocate(DstRotParameterTypeData%TwrCp(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%My.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrCp.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%My = SrcRotMiscVarTypeData%My + DstRotParameterTypeData%TwrCp = SrcRotParameterTypeData%TwrCp end if - if (allocated(SrcRotMiscVarTypeData%Mz)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%Mz) - UB(1:2) = ubound(SrcRotMiscVarTypeData%Mz) - if (.not. allocated(DstRotMiscVarTypeData%Mz)) then - allocate(DstRotMiscVarTypeData%Mz(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrCa)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrCa) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrCa) + if (.not. allocated(DstRotParameterTypeData%TwrCa)) then + allocate(DstRotParameterTypeData%TwrCa(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Mz.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrCa.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%Mz = SrcRotMiscVarTypeData%Mz + DstRotParameterTypeData%TwrCa = SrcRotParameterTypeData%TwrCa end if - if (allocated(SrcRotMiscVarTypeData%Vind_i)) then - LB(1:3) = lbound(SrcRotMiscVarTypeData%Vind_i) - UB(1:3) = ubound(SrcRotMiscVarTypeData%Vind_i) - if (.not. allocated(DstRotMiscVarTypeData%Vind_i)) then - allocate(DstRotMiscVarTypeData%Vind_i(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlCenBn)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlCenBn) + UB(1:2) = ubound(SrcRotParameterTypeData%BlCenBn) + if (.not. allocated(DstRotParameterTypeData%BlCenBn)) then + allocate(DstRotParameterTypeData%BlCenBn(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Vind_i.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlCenBn.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%Vind_i = SrcRotMiscVarTypeData%Vind_i + DstRotParameterTypeData%BlCenBn = SrcRotParameterTypeData%BlCenBn end if - DstRotMiscVarTypeData%V_DiskAvg = SrcRotMiscVarTypeData%V_DiskAvg - DstRotMiscVarTypeData%yaw = SrcRotMiscVarTypeData%yaw - DstRotMiscVarTypeData%tilt = SrcRotMiscVarTypeData%tilt - if (allocated(SrcRotMiscVarTypeData%hub_theta_x_root)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%hub_theta_x_root) - UB(1:1) = ubound(SrcRotMiscVarTypeData%hub_theta_x_root) - if (.not. allocated(DstRotMiscVarTypeData%hub_theta_x_root)) then - allocate(DstRotMiscVarTypeData%hub_theta_x_root(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlCenBt)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlCenBt) + UB(1:2) = ubound(SrcRotParameterTypeData%BlCenBt) + if (.not. allocated(DstRotParameterTypeData%BlCenBt)) then + allocate(DstRotParameterTypeData%BlCenBt(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%hub_theta_x_root.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlCenBt.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%hub_theta_x_root = SrcRotMiscVarTypeData%hub_theta_x_root + DstRotParameterTypeData%BlCenBt = SrcRotParameterTypeData%BlCenBt end if - DstRotMiscVarTypeData%V_dot_x = SrcRotMiscVarTypeData%V_dot_x - call MeshCopy(SrcRotMiscVarTypeData%HubLoad, DstRotMiscVarTypeData%HubLoad, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcRotMiscVarTypeData%B_L_2_H_P)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%B_L_2_H_P) - UB(1:1) = ubound(SrcRotMiscVarTypeData%B_L_2_H_P) - if (.not. allocated(DstRotMiscVarTypeData%B_L_2_H_P)) then - allocate(DstRotMiscVarTypeData%B_L_2_H_P(LB(1):UB(1)), stat=ErrStat2) + DstRotParameterTypeData%VolHub = SrcRotParameterTypeData%VolHub + DstRotParameterTypeData%HubCenBx = SrcRotParameterTypeData%HubCenBx + DstRotParameterTypeData%VolNac = SrcRotParameterTypeData%VolNac + DstRotParameterTypeData%NacCenB = SrcRotParameterTypeData%NacCenB + DstRotParameterTypeData%NacArea = SrcRotParameterTypeData%NacArea + DstRotParameterTypeData%NacCd = SrcRotParameterTypeData%NacCd + DstRotParameterTypeData%NacDragAC = SrcRotParameterTypeData%NacDragAC + DstRotParameterTypeData%VolBl = SrcRotParameterTypeData%VolBl + DstRotParameterTypeData%VolTwr = SrcRotParameterTypeData%VolTwr + if (allocated(SrcRotParameterTypeData%BlRad)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlRad) + UB(1:2) = ubound(SrcRotParameterTypeData%BlRad) + if (.not. allocated(DstRotParameterTypeData%BlRad)) then + allocate(DstRotParameterTypeData%BlRad(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%B_L_2_H_P.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlRad.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcRotMiscVarTypeData%B_L_2_H_P(i1), DstRotMiscVarTypeData%B_L_2_H_P(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstRotParameterTypeData%BlRad = SrcRotParameterTypeData%BlRad end if - if (allocated(SrcRotMiscVarTypeData%SigmaCavitCrit)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%SigmaCavitCrit) - UB(1:2) = ubound(SrcRotMiscVarTypeData%SigmaCavitCrit) - if (.not. allocated(DstRotMiscVarTypeData%SigmaCavitCrit)) then - allocate(DstRotMiscVarTypeData%SigmaCavitCrit(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlDL)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlDL) + UB(1:2) = ubound(SrcRotParameterTypeData%BlDL) + if (.not. allocated(DstRotParameterTypeData%BlDL)) then + allocate(DstRotParameterTypeData%BlDL(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%SigmaCavitCrit.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlDL.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%SigmaCavitCrit = SrcRotMiscVarTypeData%SigmaCavitCrit + DstRotParameterTypeData%BlDL = SrcRotParameterTypeData%BlDL end if - if (allocated(SrcRotMiscVarTypeData%SigmaCavit)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%SigmaCavit) - UB(1:2) = ubound(SrcRotMiscVarTypeData%SigmaCavit) - if (.not. allocated(DstRotMiscVarTypeData%SigmaCavit)) then - allocate(DstRotMiscVarTypeData%SigmaCavit(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlTaper)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlTaper) + UB(1:2) = ubound(SrcRotParameterTypeData%BlTaper) + if (.not. allocated(DstRotParameterTypeData%BlTaper)) then + allocate(DstRotParameterTypeData%BlTaper(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%SigmaCavit.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlTaper.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%SigmaCavit = SrcRotMiscVarTypeData%SigmaCavit + DstRotParameterTypeData%BlTaper = SrcRotParameterTypeData%BlTaper end if - if (allocated(SrcRotMiscVarTypeData%CavitWarnSet)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%CavitWarnSet) - UB(1:2) = ubound(SrcRotMiscVarTypeData%CavitWarnSet) - if (.not. allocated(DstRotMiscVarTypeData%CavitWarnSet)) then - allocate(DstRotMiscVarTypeData%CavitWarnSet(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlAxCent)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlAxCent) + UB(1:2) = ubound(SrcRotParameterTypeData%BlAxCent) + if (.not. allocated(DstRotParameterTypeData%BlAxCent)) then + allocate(DstRotParameterTypeData%BlAxCent(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%CavitWarnSet.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlAxCent.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%CavitWarnSet = SrcRotMiscVarTypeData%CavitWarnSet + DstRotParameterTypeData%BlAxCent = SrcRotParameterTypeData%BlAxCent end if - if (allocated(SrcRotMiscVarTypeData%TwrFB)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%TwrFB) - UB(1:2) = ubound(SrcRotMiscVarTypeData%TwrFB) - if (.not. allocated(DstRotMiscVarTypeData%TwrFB)) then - allocate(DstRotMiscVarTypeData%TwrFB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlIN)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlIN) + UB(1:2) = ubound(SrcRotParameterTypeData%BlIN) + if (.not. allocated(DstRotParameterTypeData%BlIN)) then + allocate(DstRotParameterTypeData%BlIN(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%TwrFB.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlIN.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%TwrFB = SrcRotMiscVarTypeData%TwrFB + DstRotParameterTypeData%BlIN = SrcRotParameterTypeData%BlIN end if - if (allocated(SrcRotMiscVarTypeData%TwrMB)) then - LB(1:2) = lbound(SrcRotMiscVarTypeData%TwrMB) - UB(1:2) = ubound(SrcRotMiscVarTypeData%TwrMB) - if (.not. allocated(DstRotMiscVarTypeData%TwrMB)) then - allocate(DstRotMiscVarTypeData%TwrMB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlIT)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlIT) + UB(1:2) = ubound(SrcRotParameterTypeData%BlIT) + if (.not. allocated(DstRotParameterTypeData%BlIT)) then + allocate(DstRotParameterTypeData%BlIT(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%TwrMB.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlIT.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%TwrMB = SrcRotMiscVarTypeData%TwrMB + DstRotParameterTypeData%BlIT = SrcRotParameterTypeData%BlIT end if - if (allocated(SrcRotMiscVarTypeData%HubFB)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%HubFB) - UB(1:1) = ubound(SrcRotMiscVarTypeData%HubFB) - if (.not. allocated(DstRotMiscVarTypeData%HubFB)) then - allocate(DstRotMiscVarTypeData%HubFB(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlAN)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlAN) + UB(1:2) = ubound(SrcRotParameterTypeData%BlAN) + if (.not. allocated(DstRotParameterTypeData%BlAN)) then + allocate(DstRotParameterTypeData%BlAN(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%HubFB.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlAN.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%HubFB = SrcRotMiscVarTypeData%HubFB + DstRotParameterTypeData%BlAN = SrcRotParameterTypeData%BlAN end if - if (allocated(SrcRotMiscVarTypeData%HubMB)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%HubMB) - UB(1:1) = ubound(SrcRotMiscVarTypeData%HubMB) - if (.not. allocated(DstRotMiscVarTypeData%HubMB)) then - allocate(DstRotMiscVarTypeData%HubMB(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlAT)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlAT) + UB(1:2) = ubound(SrcRotParameterTypeData%BlAT) + if (.not. allocated(DstRotParameterTypeData%BlAT)) then + allocate(DstRotParameterTypeData%BlAT(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%HubMB.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlAT.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%HubMB = SrcRotMiscVarTypeData%HubMB + DstRotParameterTypeData%BlAT = SrcRotParameterTypeData%BlAT end if - if (allocated(SrcRotMiscVarTypeData%NacFB)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%NacFB) - UB(1:1) = ubound(SrcRotMiscVarTypeData%NacFB) - if (.not. allocated(DstRotMiscVarTypeData%NacFB)) then - allocate(DstRotMiscVarTypeData%NacFB(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%BlAM)) then + LB(1:2) = lbound(SrcRotParameterTypeData%BlAM) + UB(1:2) = ubound(SrcRotParameterTypeData%BlAM) + if (.not. allocated(DstRotParameterTypeData%BlAM)) then + allocate(DstRotParameterTypeData%BlAM(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacFB.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlAM.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%NacFB = SrcRotMiscVarTypeData%NacFB + DstRotParameterTypeData%BlAM = SrcRotParameterTypeData%BlAM end if - if (allocated(SrcRotMiscVarTypeData%NacMB)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%NacMB) - UB(1:1) = ubound(SrcRotMiscVarTypeData%NacMB) - if (.not. allocated(DstRotMiscVarTypeData%NacMB)) then - allocate(DstRotMiscVarTypeData%NacMB(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrRad)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrRad) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrRad) + if (.not. allocated(DstRotParameterTypeData%TwrRad)) then + allocate(DstRotParameterTypeData%TwrRad(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacMB.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrRad.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%NacMB = SrcRotMiscVarTypeData%NacMB + DstRotParameterTypeData%TwrRad = SrcRotParameterTypeData%TwrRad end if - if (allocated(SrcRotMiscVarTypeData%NacDragF)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%NacDragF) - UB(1:1) = ubound(SrcRotMiscVarTypeData%NacDragF) - if (.not. allocated(DstRotMiscVarTypeData%NacDragF)) then - allocate(DstRotMiscVarTypeData%NacDragF(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrDL)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrDL) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrDL) + if (.not. allocated(DstRotParameterTypeData%TwrDL)) then + allocate(DstRotParameterTypeData%TwrDL(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacDragF.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrDL.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%NacDragF = SrcRotMiscVarTypeData%NacDragF + DstRotParameterTypeData%TwrDL = SrcRotParameterTypeData%TwrDL end if - if (allocated(SrcRotMiscVarTypeData%NacDragM)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%NacDragM) - UB(1:1) = ubound(SrcRotMiscVarTypeData%NacDragM) - if (.not. allocated(DstRotMiscVarTypeData%NacDragM)) then - allocate(DstRotMiscVarTypeData%NacDragM(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrTaper)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrTaper) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrTaper) + if (.not. allocated(DstRotParameterTypeData%TwrTaper)) then + allocate(DstRotParameterTypeData%TwrTaper(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacDragM.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrTaper.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%NacDragM = SrcRotMiscVarTypeData%NacDragM + DstRotParameterTypeData%TwrTaper = SrcRotParameterTypeData%TwrTaper end if - if (allocated(SrcRotMiscVarTypeData%NacFi)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%NacFi) - UB(1:1) = ubound(SrcRotMiscVarTypeData%NacFi) - if (.not. allocated(DstRotMiscVarTypeData%NacFi)) then - allocate(DstRotMiscVarTypeData%NacFi(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrAxCent)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrAxCent) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrAxCent) + if (.not. allocated(DstRotParameterTypeData%TwrAxCent)) then + allocate(DstRotParameterTypeData%TwrAxCent(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacFi.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrAxCent.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%NacFi = SrcRotMiscVarTypeData%NacFi + DstRotParameterTypeData%TwrAxCent = SrcRotParameterTypeData%TwrAxCent end if - if (allocated(SrcRotMiscVarTypeData%NacMi)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%NacMi) - UB(1:1) = ubound(SrcRotMiscVarTypeData%NacMi) - if (.not. allocated(DstRotMiscVarTypeData%NacMi)) then - allocate(DstRotMiscVarTypeData%NacMi(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrIT)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrIT) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrIT) + if (.not. allocated(DstRotParameterTypeData%TwrIT)) then + allocate(DstRotParameterTypeData%TwrIT(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacMi.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrIT.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotMiscVarTypeData%NacMi = SrcRotMiscVarTypeData%NacMi + DstRotParameterTypeData%TwrIT = SrcRotParameterTypeData%TwrIT end if - if (allocated(SrcRotMiscVarTypeData%BladeRootLoad)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%BladeRootLoad) - UB(1:1) = ubound(SrcRotMiscVarTypeData%BladeRootLoad) - if (.not. allocated(DstRotMiscVarTypeData%BladeRootLoad)) then - allocate(DstRotMiscVarTypeData%BladeRootLoad(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%TwrAT)) then + LB(1:1) = lbound(SrcRotParameterTypeData%TwrAT) + UB(1:1) = ubound(SrcRotParameterTypeData%TwrAT) + if (.not. allocated(DstRotParameterTypeData%TwrAT)) then + allocate(DstRotParameterTypeData%TwrAT(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%BladeRootLoad.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrAT.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcRotMiscVarTypeData%BladeRootLoad(i1), DstRotMiscVarTypeData%BladeRootLoad(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstRotParameterTypeData%TwrAT = SrcRotParameterTypeData%TwrAT end if - if (allocated(SrcRotMiscVarTypeData%B_L_2_R_P)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%B_L_2_R_P) - UB(1:1) = ubound(SrcRotMiscVarTypeData%B_L_2_R_P) - if (.not. allocated(DstRotMiscVarTypeData%B_L_2_R_P)) then - allocate(DstRotMiscVarTypeData%B_L_2_R_P(LB(1):UB(1)), stat=ErrStat2) + call BEMT_CopyParam(SrcRotParameterTypeData%BEMT, DstRotParameterTypeData%BEMT, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AA_CopyParam(SrcRotParameterTypeData%AA, DstRotParameterTypeData%AA, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstRotParameterTypeData%NumExtendedInputs = SrcRotParameterTypeData%NumExtendedInputs + if (allocated(SrcRotParameterTypeData%du)) then + LB(1:1) = lbound(SrcRotParameterTypeData%du) + UB(1:1) = ubound(SrcRotParameterTypeData%du) + if (.not. allocated(DstRotParameterTypeData%du)) then + allocate(DstRotParameterTypeData%du(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%B_L_2_R_P.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%du.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcRotMiscVarTypeData%B_L_2_R_P(i1), DstRotMiscVarTypeData%B_L_2_R_P(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstRotParameterTypeData%du = SrcRotParameterTypeData%du end if - if (allocated(SrcRotMiscVarTypeData%BladeBuoyLoadPoint)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%BladeBuoyLoadPoint) - UB(1:1) = ubound(SrcRotMiscVarTypeData%BladeBuoyLoadPoint) - if (.not. allocated(DstRotMiscVarTypeData%BladeBuoyLoadPoint)) then - allocate(DstRotMiscVarTypeData%BladeBuoyLoadPoint(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotParameterTypeData%dx)) then + LB(1:1) = lbound(SrcRotParameterTypeData%dx) + UB(1:1) = ubound(SrcRotParameterTypeData%dx) + if (.not. allocated(DstRotParameterTypeData%dx)) then + allocate(DstRotParameterTypeData%dx(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%BladeBuoyLoadPoint.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%dx.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcRotMiscVarTypeData%BladeBuoyLoadPoint(i1), DstRotMiscVarTypeData%BladeBuoyLoadPoint(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstRotParameterTypeData%dx = SrcRotParameterTypeData%dx end if - if (allocated(SrcRotMiscVarTypeData%BladeBuoyLoad)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%BladeBuoyLoad) - UB(1:1) = ubound(SrcRotMiscVarTypeData%BladeBuoyLoad) - if (.not. allocated(DstRotMiscVarTypeData%BladeBuoyLoad)) then - allocate(DstRotMiscVarTypeData%BladeBuoyLoad(LB(1):UB(1)), stat=ErrStat2) + DstRotParameterTypeData%Jac_ny = SrcRotParameterTypeData%Jac_ny + DstRotParameterTypeData%NumBl_Lin = SrcRotParameterTypeData%NumBl_Lin + DstRotParameterTypeData%TwrPotent = SrcRotParameterTypeData%TwrPotent + DstRotParameterTypeData%TwrShadow = SrcRotParameterTypeData%TwrShadow + DstRotParameterTypeData%TwrAero = SrcRotParameterTypeData%TwrAero + DstRotParameterTypeData%DBEMT_Mod = SrcRotParameterTypeData%DBEMT_Mod + DstRotParameterTypeData%CavitCheck = SrcRotParameterTypeData%CavitCheck + DstRotParameterTypeData%NacelleDrag = SrcRotParameterTypeData%NacelleDrag + DstRotParameterTypeData%MHK = SrcRotParameterTypeData%MHK + DstRotParameterTypeData%CompAA = SrcRotParameterTypeData%CompAA + DstRotParameterTypeData%AirDens = SrcRotParameterTypeData%AirDens + DstRotParameterTypeData%KinVisc = SrcRotParameterTypeData%KinVisc + DstRotParameterTypeData%SpdSound = SrcRotParameterTypeData%SpdSound + DstRotParameterTypeData%Gravity = SrcRotParameterTypeData%Gravity + DstRotParameterTypeData%Patm = SrcRotParameterTypeData%Patm + DstRotParameterTypeData%Pvap = SrcRotParameterTypeData%Pvap + DstRotParameterTypeData%WtrDpth = SrcRotParameterTypeData%WtrDpth + DstRotParameterTypeData%MSL2SWL = SrcRotParameterTypeData%MSL2SWL + DstRotParameterTypeData%AeroProjMod = SrcRotParameterTypeData%AeroProjMod + DstRotParameterTypeData%BEM_Mod = SrcRotParameterTypeData%BEM_Mod + DstRotParameterTypeData%NumOuts = SrcRotParameterTypeData%NumOuts + DstRotParameterTypeData%RootName = SrcRotParameterTypeData%RootName + if (allocated(SrcRotParameterTypeData%OutParam)) then + LB(1:1) = lbound(SrcRotParameterTypeData%OutParam) + UB(1:1) = ubound(SrcRotParameterTypeData%OutParam) + if (.not. allocated(DstRotParameterTypeData%OutParam)) then + allocate(DstRotParameterTypeData%OutParam(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%BladeBuoyLoad.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%OutParam.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcRotMiscVarTypeData%BladeBuoyLoad(i1), DstRotMiscVarTypeData%BladeBuoyLoad(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call NWTC_Library_CopyOutParmType(SrcRotParameterTypeData%OutParam(i1), DstRotParameterTypeData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcRotMiscVarTypeData%B_P_2_B_L)) then - LB(1:1) = lbound(SrcRotMiscVarTypeData%B_P_2_B_L) - UB(1:1) = ubound(SrcRotMiscVarTypeData%B_P_2_B_L) - if (.not. allocated(DstRotMiscVarTypeData%B_P_2_B_L)) then - allocate(DstRotMiscVarTypeData%B_P_2_B_L(LB(1):UB(1)), stat=ErrStat2) + DstRotParameterTypeData%NBlOuts = SrcRotParameterTypeData%NBlOuts + DstRotParameterTypeData%BlOutNd = SrcRotParameterTypeData%BlOutNd + DstRotParameterTypeData%NTwOuts = SrcRotParameterTypeData%NTwOuts + DstRotParameterTypeData%TwOutNd = SrcRotParameterTypeData%TwOutNd + DstRotParameterTypeData%BldNd_NumOuts = SrcRotParameterTypeData%BldNd_NumOuts + DstRotParameterTypeData%BldNd_TotNumOuts = SrcRotParameterTypeData%BldNd_TotNumOuts + if (allocated(SrcRotParameterTypeData%BldNd_OutParam)) then + LB(1:1) = lbound(SrcRotParameterTypeData%BldNd_OutParam) + UB(1:1) = ubound(SrcRotParameterTypeData%BldNd_OutParam) + if (.not. allocated(DstRotParameterTypeData%BldNd_OutParam)) then + allocate(DstRotParameterTypeData%BldNd_OutParam(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%B_P_2_B_L.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BldNd_OutParam.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcRotMiscVarTypeData%B_P_2_B_L(i1), DstRotMiscVarTypeData%B_P_2_B_L(i1), CtrlCode, ErrStat2, ErrMsg2) + call NWTC_Library_CopyOutParmType(SrcRotParameterTypeData%BldNd_OutParam(i1), DstRotParameterTypeData%BldNd_OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call MeshCopy(SrcRotMiscVarTypeData%TwrBuoyLoadPoint, DstRotMiscVarTypeData%TwrBuoyLoadPoint, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcRotMiscVarTypeData%TwrBuoyLoad, DstRotMiscVarTypeData%TwrBuoyLoad, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcRotMiscVarTypeData%T_P_2_T_L, DstRotMiscVarTypeData%T_P_2_T_L, CtrlCode, ErrStat2, ErrMsg2) + if (allocated(SrcRotParameterTypeData%BldNd_BlOutNd)) then + LB(1:1) = lbound(SrcRotParameterTypeData%BldNd_BlOutNd) + UB(1:1) = ubound(SrcRotParameterTypeData%BldNd_BlOutNd) + if (.not. allocated(DstRotParameterTypeData%BldNd_BlOutNd)) then + allocate(DstRotParameterTypeData%BldNd_BlOutNd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BldNd_BlOutNd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotParameterTypeData%BldNd_BlOutNd = SrcRotParameterTypeData%BldNd_BlOutNd + end if + DstRotParameterTypeData%BldNd_BladesOut = SrcRotParameterTypeData%BldNd_BladesOut + DstRotParameterTypeData%BldNd_NumNodesOut = SrcRotParameterTypeData%BldNd_NumNodesOut + DstRotParameterTypeData%TFinAero = SrcRotParameterTypeData%TFinAero + call AD_CopyTFinParameterType(SrcRotParameterTypeData%TFin, DstRotParameterTypeData%TFin, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - DstRotMiscVarTypeData%FirstWarn_TowerStrike = SrcRotMiscVarTypeData%FirstWarn_TowerStrike - DstRotMiscVarTypeData%AvgDiskVel = SrcRotMiscVarTypeData%AvgDiskVel - DstRotMiscVarTypeData%AvgDiskVelDist = SrcRotMiscVarTypeData%AvgDiskVelDist - DstRotMiscVarTypeData%TFinAlpha = SrcRotMiscVarTypeData%TFinAlpha - DstRotMiscVarTypeData%TFinRe = SrcRotMiscVarTypeData%TFinRe - DstRotMiscVarTypeData%TFinVrel = SrcRotMiscVarTypeData%TFinVrel - DstRotMiscVarTypeData%TFinVund_i = SrcRotMiscVarTypeData%TFinVund_i - DstRotMiscVarTypeData%TFinVind_i = SrcRotMiscVarTypeData%TFinVind_i - DstRotMiscVarTypeData%TFinVrel_i = SrcRotMiscVarTypeData%TFinVrel_i - DstRotMiscVarTypeData%TFinSTV_i = SrcRotMiscVarTypeData%TFinSTV_i - DstRotMiscVarTypeData%TFinF_i = SrcRotMiscVarTypeData%TFinF_i - DstRotMiscVarTypeData%TFinM_i = SrcRotMiscVarTypeData%TFinM_i end subroutine -subroutine AD_DestroyRotMiscVarType(RotMiscVarTypeData, ErrStat, ErrMsg) - type(RotMiscVarType), intent(inout) :: RotMiscVarTypeData +subroutine AD_DestroyRotParameterType(RotParameterTypeData, ErrStat, ErrMsg) + type(RotParameterType), intent(inout) :: RotParameterTypeData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3, i4 - integer(B4Ki) :: LB(4), UB(4) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyRotMiscVarType' + character(*), parameter :: RoutineName = 'AD_DestroyRotParameterType' ErrStat = ErrID_None ErrMsg = '' - call BEMT_DestroyMisc(RotMiscVarTypeData%BEMT, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call BEMT_DestroyOutput(RotMiscVarTypeData%BEMT_y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - LB(1:1) = lbound(RotMiscVarTypeData%BEMT_u) - UB(1:1) = ubound(RotMiscVarTypeData%BEMT_u) - do i1 = LB(1), UB(1) - call BEMT_DestroyInput(RotMiscVarTypeData%BEMT_u(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call AA_DestroyMisc(RotMiscVarTypeData%AA, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AA_DestroyOutput(RotMiscVarTypeData%AA_y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AA_DestroyInput(RotMiscVarTypeData%AA_u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(RotMiscVarTypeData%DisturbedInflow)) then - deallocate(RotMiscVarTypeData%DisturbedInflow) - end if - if (allocated(RotMiscVarTypeData%SectAvgInflow)) then - deallocate(RotMiscVarTypeData%SectAvgInflow) - end if - if (allocated(RotMiscVarTypeData%orientationAnnulus)) then - deallocate(RotMiscVarTypeData%orientationAnnulus) - end if - if (allocated(RotMiscVarTypeData%R_li)) then - deallocate(RotMiscVarTypeData%R_li) - end if - if (allocated(RotMiscVarTypeData%AllOuts)) then - deallocate(RotMiscVarTypeData%AllOuts) - end if - if (allocated(RotMiscVarTypeData%W_Twr)) then - deallocate(RotMiscVarTypeData%W_Twr) - end if - if (allocated(RotMiscVarTypeData%X_Twr)) then - deallocate(RotMiscVarTypeData%X_Twr) - end if - if (allocated(RotMiscVarTypeData%Y_Twr)) then - deallocate(RotMiscVarTypeData%Y_Twr) - end if - if (allocated(RotMiscVarTypeData%Cant)) then - deallocate(RotMiscVarTypeData%Cant) + if (allocated(RotParameterTypeData%TwrDiam)) then + deallocate(RotParameterTypeData%TwrDiam) end if - if (allocated(RotMiscVarTypeData%Toe)) then - deallocate(RotMiscVarTypeData%Toe) + if (allocated(RotParameterTypeData%TwrCd)) then + deallocate(RotParameterTypeData%TwrCd) end if - if (allocated(RotMiscVarTypeData%TwrClrnc)) then - deallocate(RotMiscVarTypeData%TwrClrnc) + if (allocated(RotParameterTypeData%TwrTI)) then + deallocate(RotParameterTypeData%TwrTI) end if - if (allocated(RotMiscVarTypeData%X)) then - deallocate(RotMiscVarTypeData%X) + if (allocated(RotParameterTypeData%BlTwist)) then + deallocate(RotParameterTypeData%BlTwist) end if - if (allocated(RotMiscVarTypeData%Y)) then - deallocate(RotMiscVarTypeData%Y) + if (allocated(RotParameterTypeData%TwrCb)) then + deallocate(RotParameterTypeData%TwrCb) end if - if (allocated(RotMiscVarTypeData%Z)) then - deallocate(RotMiscVarTypeData%Z) + if (allocated(RotParameterTypeData%TwrCp)) then + deallocate(RotParameterTypeData%TwrCp) end if - if (allocated(RotMiscVarTypeData%M)) then - deallocate(RotMiscVarTypeData%M) + if (allocated(RotParameterTypeData%TwrCa)) then + deallocate(RotParameterTypeData%TwrCa) end if - if (allocated(RotMiscVarTypeData%Mx)) then - deallocate(RotMiscVarTypeData%Mx) + if (allocated(RotParameterTypeData%BlCenBn)) then + deallocate(RotParameterTypeData%BlCenBn) end if - if (allocated(RotMiscVarTypeData%My)) then - deallocate(RotMiscVarTypeData%My) + if (allocated(RotParameterTypeData%BlCenBt)) then + deallocate(RotParameterTypeData%BlCenBt) end if - if (allocated(RotMiscVarTypeData%Mz)) then - deallocate(RotMiscVarTypeData%Mz) + if (allocated(RotParameterTypeData%BlRad)) then + deallocate(RotParameterTypeData%BlRad) end if - if (allocated(RotMiscVarTypeData%Vind_i)) then - deallocate(RotMiscVarTypeData%Vind_i) + if (allocated(RotParameterTypeData%BlDL)) then + deallocate(RotParameterTypeData%BlDL) end if - if (allocated(RotMiscVarTypeData%hub_theta_x_root)) then - deallocate(RotMiscVarTypeData%hub_theta_x_root) + if (allocated(RotParameterTypeData%BlTaper)) then + deallocate(RotParameterTypeData%BlTaper) end if - call MeshDestroy( RotMiscVarTypeData%HubLoad, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(RotMiscVarTypeData%B_L_2_H_P)) then - LB(1:1) = lbound(RotMiscVarTypeData%B_L_2_H_P) - UB(1:1) = ubound(RotMiscVarTypeData%B_L_2_H_P) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(RotMiscVarTypeData%B_L_2_H_P(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(RotMiscVarTypeData%B_L_2_H_P) + if (allocated(RotParameterTypeData%BlAxCent)) then + deallocate(RotParameterTypeData%BlAxCent) end if - if (allocated(RotMiscVarTypeData%SigmaCavitCrit)) then - deallocate(RotMiscVarTypeData%SigmaCavitCrit) + if (allocated(RotParameterTypeData%BlIN)) then + deallocate(RotParameterTypeData%BlIN) end if - if (allocated(RotMiscVarTypeData%SigmaCavit)) then - deallocate(RotMiscVarTypeData%SigmaCavit) + if (allocated(RotParameterTypeData%BlIT)) then + deallocate(RotParameterTypeData%BlIT) end if - if (allocated(RotMiscVarTypeData%CavitWarnSet)) then - deallocate(RotMiscVarTypeData%CavitWarnSet) + if (allocated(RotParameterTypeData%BlAN)) then + deallocate(RotParameterTypeData%BlAN) end if - if (allocated(RotMiscVarTypeData%TwrFB)) then - deallocate(RotMiscVarTypeData%TwrFB) + if (allocated(RotParameterTypeData%BlAT)) then + deallocate(RotParameterTypeData%BlAT) end if - if (allocated(RotMiscVarTypeData%TwrMB)) then - deallocate(RotMiscVarTypeData%TwrMB) + if (allocated(RotParameterTypeData%BlAM)) then + deallocate(RotParameterTypeData%BlAM) end if - if (allocated(RotMiscVarTypeData%HubFB)) then - deallocate(RotMiscVarTypeData%HubFB) + if (allocated(RotParameterTypeData%TwrRad)) then + deallocate(RotParameterTypeData%TwrRad) end if - if (allocated(RotMiscVarTypeData%HubMB)) then - deallocate(RotMiscVarTypeData%HubMB) + if (allocated(RotParameterTypeData%TwrDL)) then + deallocate(RotParameterTypeData%TwrDL) end if - if (allocated(RotMiscVarTypeData%NacFB)) then - deallocate(RotMiscVarTypeData%NacFB) + if (allocated(RotParameterTypeData%TwrTaper)) then + deallocate(RotParameterTypeData%TwrTaper) end if - if (allocated(RotMiscVarTypeData%NacMB)) then - deallocate(RotMiscVarTypeData%NacMB) + if (allocated(RotParameterTypeData%TwrAxCent)) then + deallocate(RotParameterTypeData%TwrAxCent) end if - if (allocated(RotMiscVarTypeData%NacDragF)) then - deallocate(RotMiscVarTypeData%NacDragF) + if (allocated(RotParameterTypeData%TwrIT)) then + deallocate(RotParameterTypeData%TwrIT) end if - if (allocated(RotMiscVarTypeData%NacDragM)) then - deallocate(RotMiscVarTypeData%NacDragM) + if (allocated(RotParameterTypeData%TwrAT)) then + deallocate(RotParameterTypeData%TwrAT) end if - if (allocated(RotMiscVarTypeData%NacFi)) then - deallocate(RotMiscVarTypeData%NacFi) + call BEMT_DestroyParam(RotParameterTypeData%BEMT, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AA_DestroyParam(RotParameterTypeData%AA, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(RotParameterTypeData%du)) then + deallocate(RotParameterTypeData%du) end if - if (allocated(RotMiscVarTypeData%NacMi)) then - deallocate(RotMiscVarTypeData%NacMi) + if (allocated(RotParameterTypeData%dx)) then + deallocate(RotParameterTypeData%dx) end if - if (allocated(RotMiscVarTypeData%BladeRootLoad)) then - LB(1:1) = lbound(RotMiscVarTypeData%BladeRootLoad) - UB(1:1) = ubound(RotMiscVarTypeData%BladeRootLoad) + if (allocated(RotParameterTypeData%OutParam)) then + LB(1:1) = lbound(RotParameterTypeData%OutParam) + UB(1:1) = ubound(RotParameterTypeData%OutParam) do i1 = LB(1), UB(1) - call MeshDestroy( RotMiscVarTypeData%BladeRootLoad(i1), ErrStat2, ErrMsg2) + call NWTC_Library_DestroyOutParmType(RotParameterTypeData%OutParam(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(RotMiscVarTypeData%BladeRootLoad) + deallocate(RotParameterTypeData%OutParam) end if - if (allocated(RotMiscVarTypeData%B_L_2_R_P)) then - LB(1:1) = lbound(RotMiscVarTypeData%B_L_2_R_P) - UB(1:1) = ubound(RotMiscVarTypeData%B_L_2_R_P) + if (allocated(RotParameterTypeData%BldNd_OutParam)) then + LB(1:1) = lbound(RotParameterTypeData%BldNd_OutParam) + UB(1:1) = ubound(RotParameterTypeData%BldNd_OutParam) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(RotMiscVarTypeData%B_L_2_R_P(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(RotMiscVarTypeData%B_L_2_R_P) - end if - if (allocated(RotMiscVarTypeData%BladeBuoyLoadPoint)) then - LB(1:1) = lbound(RotMiscVarTypeData%BladeBuoyLoadPoint) - UB(1:1) = ubound(RotMiscVarTypeData%BladeBuoyLoadPoint) - do i1 = LB(1), UB(1) - call MeshDestroy( RotMiscVarTypeData%BladeBuoyLoadPoint(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(RotMiscVarTypeData%BladeBuoyLoadPoint) - end if - if (allocated(RotMiscVarTypeData%BladeBuoyLoad)) then - LB(1:1) = lbound(RotMiscVarTypeData%BladeBuoyLoad) - UB(1:1) = ubound(RotMiscVarTypeData%BladeBuoyLoad) - do i1 = LB(1), UB(1) - call MeshDestroy( RotMiscVarTypeData%BladeBuoyLoad(i1), ErrStat2, ErrMsg2) + call NWTC_Library_DestroyOutParmType(RotParameterTypeData%BldNd_OutParam(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(RotMiscVarTypeData%BladeBuoyLoad) + deallocate(RotParameterTypeData%BldNd_OutParam) end if - if (allocated(RotMiscVarTypeData%B_P_2_B_L)) then - LB(1:1) = lbound(RotMiscVarTypeData%B_P_2_B_L) - UB(1:1) = ubound(RotMiscVarTypeData%B_P_2_B_L) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(RotMiscVarTypeData%B_P_2_B_L(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(RotMiscVarTypeData%B_P_2_B_L) + if (allocated(RotParameterTypeData%BldNd_BlOutNd)) then + deallocate(RotParameterTypeData%BldNd_BlOutNd) end if - call MeshDestroy( RotMiscVarTypeData%TwrBuoyLoadPoint, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( RotMiscVarTypeData%TwrBuoyLoad, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(RotMiscVarTypeData%T_P_2_T_L, ErrStat2, ErrMsg2) + call AD_DestroyTFinParameterType(RotParameterTypeData%TFin, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine -subroutine AD_PackRotMiscVarType(RF, Indata) +subroutine AD_PackRotParameterType(RF, Indata) type(RegFile), intent(inout) :: RF - type(RotMiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackRotMiscVarType' - integer(B4Ki) :: i1, i2, i3, i4 - integer(B4Ki) :: LB(4), UB(4) + type(RotParameterType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackRotParameterType' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return - call BEMT_PackMisc(RF, InData%BEMT) - call BEMT_PackOutput(RF, InData%BEMT_y) - LB(1:1) = lbound(InData%BEMT_u) - UB(1:1) = ubound(InData%BEMT_u) - do i1 = LB(1), UB(1) - call BEMT_PackInput(RF, InData%BEMT_u(i1)) - end do - call AA_PackMisc(RF, InData%AA) - call AA_PackOutput(RF, InData%AA_y) - call AA_PackInput(RF, InData%AA_u) - call RegPackAlloc(RF, InData%DisturbedInflow) - call RegPackAlloc(RF, InData%SectAvgInflow) - call RegPackAlloc(RF, InData%orientationAnnulus) - call RegPackAlloc(RF, InData%R_li) - call RegPackAlloc(RF, InData%AllOuts) - call RegPackAlloc(RF, InData%W_Twr) - call RegPackAlloc(RF, InData%X_Twr) - call RegPackAlloc(RF, InData%Y_Twr) - call RegPackAlloc(RF, InData%Cant) - call RegPackAlloc(RF, InData%Toe) - call RegPackAlloc(RF, InData%TwrClrnc) - call RegPackAlloc(RF, InData%X) - call RegPackAlloc(RF, InData%Y) - call RegPackAlloc(RF, InData%Z) - call RegPackAlloc(RF, InData%M) - call RegPackAlloc(RF, InData%Mx) - call RegPackAlloc(RF, InData%My) - call RegPackAlloc(RF, InData%Mz) - call RegPackAlloc(RF, InData%Vind_i) - call RegPack(RF, InData%V_DiskAvg) - call RegPack(RF, InData%yaw) - call RegPack(RF, InData%tilt) - call RegPackAlloc(RF, InData%hub_theta_x_root) - call RegPack(RF, InData%V_dot_x) - call MeshPack(RF, InData%HubLoad) - call RegPack(RF, allocated(InData%B_L_2_H_P)) - if (allocated(InData%B_L_2_H_P)) then - call RegPackBounds(RF, 1, lbound(InData%B_L_2_H_P), ubound(InData%B_L_2_H_P)) - LB(1:1) = lbound(InData%B_L_2_H_P) - UB(1:1) = ubound(InData%B_L_2_H_P) - do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%B_L_2_H_P(i1)) - end do - end if - call RegPackAlloc(RF, InData%SigmaCavitCrit) - call RegPackAlloc(RF, InData%SigmaCavit) - call RegPackAlloc(RF, InData%CavitWarnSet) - call RegPackAlloc(RF, InData%TwrFB) - call RegPackAlloc(RF, InData%TwrMB) - call RegPackAlloc(RF, InData%HubFB) - call RegPackAlloc(RF, InData%HubMB) - call RegPackAlloc(RF, InData%NacFB) - call RegPackAlloc(RF, InData%NacMB) - call RegPackAlloc(RF, InData%NacDragF) - call RegPackAlloc(RF, InData%NacDragM) - call RegPackAlloc(RF, InData%NacFi) - call RegPackAlloc(RF, InData%NacMi) - call RegPack(RF, allocated(InData%BladeRootLoad)) - if (allocated(InData%BladeRootLoad)) then - call RegPackBounds(RF, 1, lbound(InData%BladeRootLoad), ubound(InData%BladeRootLoad)) - LB(1:1) = lbound(InData%BladeRootLoad) - UB(1:1) = ubound(InData%BladeRootLoad) - do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BladeRootLoad(i1)) - end do - end if - call RegPack(RF, allocated(InData%B_L_2_R_P)) - if (allocated(InData%B_L_2_R_P)) then - call RegPackBounds(RF, 1, lbound(InData%B_L_2_R_P), ubound(InData%B_L_2_R_P)) - LB(1:1) = lbound(InData%B_L_2_R_P) - UB(1:1) = ubound(InData%B_L_2_R_P) - do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%B_L_2_R_P(i1)) - end do - end if - call RegPack(RF, allocated(InData%BladeBuoyLoadPoint)) - if (allocated(InData%BladeBuoyLoadPoint)) then - call RegPackBounds(RF, 1, lbound(InData%BladeBuoyLoadPoint), ubound(InData%BladeBuoyLoadPoint)) - LB(1:1) = lbound(InData%BladeBuoyLoadPoint) - UB(1:1) = ubound(InData%BladeBuoyLoadPoint) - do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BladeBuoyLoadPoint(i1)) - end do - end if - call RegPack(RF, allocated(InData%BladeBuoyLoad)) - if (allocated(InData%BladeBuoyLoad)) then - call RegPackBounds(RF, 1, lbound(InData%BladeBuoyLoad), ubound(InData%BladeBuoyLoad)) - LB(1:1) = lbound(InData%BladeBuoyLoad) - UB(1:1) = ubound(InData%BladeBuoyLoad) + call RegPack(RF, InData%NumBlades) + call RegPack(RF, InData%NumBlNds) + call RegPack(RF, InData%NumTwrNds) + call RegPackAlloc(RF, InData%TwrDiam) + call RegPackAlloc(RF, InData%TwrCd) + call RegPackAlloc(RF, InData%TwrTI) + call RegPackAlloc(RF, InData%BlTwist) + call RegPackAlloc(RF, InData%TwrCb) + call RegPackAlloc(RF, InData%TwrCp) + call RegPackAlloc(RF, InData%TwrCa) + call RegPackAlloc(RF, InData%BlCenBn) + call RegPackAlloc(RF, InData%BlCenBt) + call RegPack(RF, InData%VolHub) + call RegPack(RF, InData%HubCenBx) + call RegPack(RF, InData%VolNac) + call RegPack(RF, InData%NacCenB) + call RegPack(RF, InData%NacArea) + call RegPack(RF, InData%NacCd) + call RegPack(RF, InData%NacDragAC) + call RegPack(RF, InData%VolBl) + call RegPack(RF, InData%VolTwr) + call RegPackAlloc(RF, InData%BlRad) + call RegPackAlloc(RF, InData%BlDL) + call RegPackAlloc(RF, InData%BlTaper) + call RegPackAlloc(RF, InData%BlAxCent) + call RegPackAlloc(RF, InData%BlIN) + call RegPackAlloc(RF, InData%BlIT) + call RegPackAlloc(RF, InData%BlAN) + call RegPackAlloc(RF, InData%BlAT) + call RegPackAlloc(RF, InData%BlAM) + call RegPackAlloc(RF, InData%TwrRad) + call RegPackAlloc(RF, InData%TwrDL) + call RegPackAlloc(RF, InData%TwrTaper) + call RegPackAlloc(RF, InData%TwrAxCent) + call RegPackAlloc(RF, InData%TwrIT) + call RegPackAlloc(RF, InData%TwrAT) + call BEMT_PackParam(RF, InData%BEMT) + call AA_PackParam(RF, InData%AA) + call RegPack(RF, InData%NumExtendedInputs) + call RegPackAlloc(RF, InData%du) + call RegPackAlloc(RF, InData%dx) + call RegPack(RF, InData%Jac_ny) + call RegPack(RF, InData%NumBl_Lin) + call RegPack(RF, InData%TwrPotent) + call RegPack(RF, InData%TwrShadow) + call RegPack(RF, InData%TwrAero) + call RegPack(RF, InData%DBEMT_Mod) + call RegPack(RF, InData%CavitCheck) + call RegPack(RF, InData%NacelleDrag) + call RegPack(RF, InData%MHK) + call RegPack(RF, InData%CompAA) + call RegPack(RF, InData%AirDens) + call RegPack(RF, InData%KinVisc) + call RegPack(RF, InData%SpdSound) + call RegPack(RF, InData%Gravity) + call RegPack(RF, InData%Patm) + call RegPack(RF, InData%Pvap) + call RegPack(RF, InData%WtrDpth) + call RegPack(RF, InData%MSL2SWL) + call RegPack(RF, InData%AeroProjMod) + call RegPack(RF, InData%BEM_Mod) + call RegPack(RF, InData%NumOuts) + call RegPack(RF, InData%RootName) + call RegPack(RF, allocated(InData%OutParam)) + if (allocated(InData%OutParam)) then + call RegPackBounds(RF, 1, lbound(InData%OutParam), ubound(InData%OutParam)) + LB(1:1) = lbound(InData%OutParam) + UB(1:1) = ubound(InData%OutParam) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BladeBuoyLoad(i1)) + call NWTC_Library_PackOutParmType(RF, InData%OutParam(i1)) end do end if - call RegPack(RF, allocated(InData%B_P_2_B_L)) - if (allocated(InData%B_P_2_B_L)) then - call RegPackBounds(RF, 1, lbound(InData%B_P_2_B_L), ubound(InData%B_P_2_B_L)) - LB(1:1) = lbound(InData%B_P_2_B_L) - UB(1:1) = ubound(InData%B_P_2_B_L) + call RegPack(RF, InData%NBlOuts) + call RegPack(RF, InData%BlOutNd) + call RegPack(RF, InData%NTwOuts) + call RegPack(RF, InData%TwOutNd) + call RegPack(RF, InData%BldNd_NumOuts) + call RegPack(RF, InData%BldNd_TotNumOuts) + call RegPack(RF, allocated(InData%BldNd_OutParam)) + if (allocated(InData%BldNd_OutParam)) then + call RegPackBounds(RF, 1, lbound(InData%BldNd_OutParam), ubound(InData%BldNd_OutParam)) + LB(1:1) = lbound(InData%BldNd_OutParam) + UB(1:1) = ubound(InData%BldNd_OutParam) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%B_P_2_B_L(i1)) + call NWTC_Library_PackOutParmType(RF, InData%BldNd_OutParam(i1)) end do end if - call MeshPack(RF, InData%TwrBuoyLoadPoint) - call MeshPack(RF, InData%TwrBuoyLoad) - call NWTC_Library_PackMeshMapType(RF, InData%T_P_2_T_L) - call RegPack(RF, InData%FirstWarn_TowerStrike) - call RegPack(RF, InData%AvgDiskVel) - call RegPack(RF, InData%AvgDiskVelDist) - call RegPack(RF, InData%TFinAlpha) - call RegPack(RF, InData%TFinRe) - call RegPack(RF, InData%TFinVrel) - call RegPack(RF, InData%TFinVund_i) - call RegPack(RF, InData%TFinVind_i) - call RegPack(RF, InData%TFinVrel_i) - call RegPack(RF, InData%TFinSTV_i) - call RegPack(RF, InData%TFinF_i) - call RegPack(RF, InData%TFinM_i) + call RegPackAlloc(RF, InData%BldNd_BlOutNd) + call RegPack(RF, InData%BldNd_BladesOut) + call RegPack(RF, InData%BldNd_NumNodesOut) + call RegPack(RF, InData%TFinAero) + call AD_PackTFinParameterType(RF, InData%TFin) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_UnPackRotMiscVarType(RF, OutData) +subroutine AD_UnPackRotParameterType(RF, OutData) type(RegFile), intent(inout) :: RF - type(RotMiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackRotMiscVarType' - integer(B4Ki) :: i1, i2, i3, i4 - integer(B4Ki) :: LB(4), UB(4) + type(RotParameterType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackRotParameterType' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call BEMT_UnpackMisc(RF, OutData%BEMT) ! BEMT - call BEMT_UnpackOutput(RF, OutData%BEMT_y) ! BEMT_y - LB(1:1) = lbound(OutData%BEMT_u) - UB(1:1) = ubound(OutData%BEMT_u) - do i1 = LB(1), UB(1) - call BEMT_UnpackInput(RF, OutData%BEMT_u(i1)) ! BEMT_u - end do - call AA_UnpackMisc(RF, OutData%AA) ! AA - call AA_UnpackOutput(RF, OutData%AA_y) ! AA_y - call AA_UnpackInput(RF, OutData%AA_u) ! AA_u - call RegUnpackAlloc(RF, OutData%DisturbedInflow); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%SectAvgInflow); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%orientationAnnulus); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%R_li); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AllOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%W_Twr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%X_Twr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Y_Twr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Cant); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Toe); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrClrnc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%X); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Z); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%M); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Mx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%My); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Mz); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Vind_i); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%V_DiskAvg); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%yaw); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%tilt); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%hub_theta_x_root); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%V_dot_x); if (RegCheckErr(RF, RoutineName)) return - call MeshUnpack(RF, OutData%HubLoad) ! HubLoad - if (allocated(OutData%B_L_2_H_P)) deallocate(OutData%B_L_2_H_P) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%B_L_2_H_P(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%B_L_2_H_P.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%B_L_2_H_P(i1)) ! B_L_2_H_P - end do - end if - call RegUnpackAlloc(RF, OutData%SigmaCavitCrit); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%SigmaCavit); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%CavitWarnSet); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrFB); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrMB); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%HubFB); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%HubMB); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%NacFB); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%NacMB); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%NacDragF); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%NacDragM); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%NacFi); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%NacMi); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%BladeRootLoad)) deallocate(OutData%BladeRootLoad) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BladeRootLoad(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeRootLoad.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BladeRootLoad(i1)) ! BladeRootLoad - end do - end if - if (allocated(OutData%B_L_2_R_P)) deallocate(OutData%B_L_2_R_P) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%B_L_2_R_P(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%B_L_2_R_P.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%B_L_2_R_P(i1)) ! B_L_2_R_P - end do - end if - if (allocated(OutData%BladeBuoyLoadPoint)) deallocate(OutData%BladeBuoyLoadPoint) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BladeBuoyLoadPoint(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeBuoyLoadPoint.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BladeBuoyLoadPoint(i1)) ! BladeBuoyLoadPoint - end do - end if - if (allocated(OutData%BladeBuoyLoad)) deallocate(OutData%BladeBuoyLoad) + call RegUnpack(RF, OutData%NumBlades); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumBlNds); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumTwrNds); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrDiam); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrCd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrTI); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlTwist); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrCb); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrCp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrCa); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlCenBn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlCenBt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VolHub); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HubCenBx); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VolNac); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacCenB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacArea); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacCd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacDragAC); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VolBl); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VolTwr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlRad); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlDL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlTaper); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlAxCent); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlIN); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlIT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlAN); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlAT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlAM); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrRad); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrDL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrTaper); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrAxCent); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrIT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrAT); if (RegCheckErr(RF, RoutineName)) return + call BEMT_UnpackParam(RF, OutData%BEMT) ! BEMT + call AA_UnpackParam(RF, OutData%AA) ! AA + call RegUnpack(RF, OutData%NumExtendedInputs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%dx); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumBl_Lin); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TwrPotent); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TwrShadow); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TwrAero); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DBEMT_Mod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CavitCheck); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacelleDrag); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MHK); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CompAA); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%KinVisc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SpdSound); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Gravity); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Patm); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Pvap); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MSL2SWL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AeroProjMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%BEM_Mod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%OutParam)) deallocate(OutData%OutParam) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BladeBuoyLoad(LB(1):UB(1)),stat=stat) + allocate(OutData%OutParam(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeBuoyLoad.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BladeBuoyLoad(i1)) ! BladeBuoyLoad + call NWTC_Library_UnpackOutParmType(RF, OutData%OutParam(i1)) ! OutParam end do end if - if (allocated(OutData%B_P_2_B_L)) deallocate(OutData%B_P_2_B_L) + call RegUnpack(RF, OutData%NBlOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%BlOutNd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NTwOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TwOutNd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%BldNd_NumOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%BldNd_TotNumOuts); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%BldNd_OutParam)) deallocate(OutData%BldNd_OutParam) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%B_P_2_B_L(LB(1):UB(1)),stat=stat) + allocate(OutData%BldNd_OutParam(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%B_P_2_B_L.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BldNd_OutParam.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%B_P_2_B_L(i1)) ! B_P_2_B_L + call NWTC_Library_UnpackOutParmType(RF, OutData%BldNd_OutParam(i1)) ! BldNd_OutParam end do end if - call MeshUnpack(RF, OutData%TwrBuoyLoadPoint) ! TwrBuoyLoadPoint - call MeshUnpack(RF, OutData%TwrBuoyLoad) ! TwrBuoyLoad - call NWTC_Library_UnpackMeshMapType(RF, OutData%T_P_2_T_L) ! T_P_2_T_L - call RegUnpack(RF, OutData%FirstWarn_TowerStrike); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AvgDiskVel); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AvgDiskVelDist); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinAlpha); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinRe); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinVrel); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinVund_i); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinVind_i); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinVrel_i); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinSTV_i); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinF_i); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinM_i); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BldNd_BlOutNd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%BldNd_BladesOut); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%BldNd_NumNodesOut); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinAero); if (RegCheckErr(RF, RoutineName)) return + call AD_UnpackTFinParameterType(RF, OutData%TFin) ! TFin end subroutine -subroutine AD_CopyElemInflowType(SrcElemInflowTypeData, DstElemInflowTypeData, CtrlCode, ErrStat, ErrMsg) - type(ElemInflowType), intent(in) :: SrcElemInflowTypeData - type(ElemInflowType), intent(inout) :: DstElemInflowTypeData +subroutine AD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) + type(AD_ParameterType), intent(in) :: SrcParamData + type(AD_ParameterType), intent(inout) :: DstParamData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 - character(*), parameter :: RoutineName = 'AD_CopyElemInflowType' + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AD_CopyParam' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcElemInflowTypeData%InflowVel)) then - LB(1:2) = lbound(SrcElemInflowTypeData%InflowVel) - UB(1:2) = ubound(SrcElemInflowTypeData%InflowVel) - if (.not. allocated(DstElemInflowTypeData%InflowVel)) then - allocate(DstElemInflowTypeData%InflowVel(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%rotors)) then + LB(1:1) = lbound(SrcParamData%rotors) + UB(1:1) = ubound(SrcParamData%rotors) + if (.not. allocated(DstParamData%rotors)) then + allocate(DstParamData%rotors(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstElemInflowTypeData%InflowVel.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%rotors.', ErrStat, ErrMsg, RoutineName) return end if end if - DstElemInflowTypeData%InflowVel = SrcElemInflowTypeData%InflowVel + do i1 = LB(1), UB(1) + call AD_CopyRotParameterType(SrcParamData%rotors(i1), DstParamData%rotors(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcElemInflowTypeData%InflowAcc)) then - LB(1:2) = lbound(SrcElemInflowTypeData%InflowAcc) - UB(1:2) = ubound(SrcElemInflowTypeData%InflowAcc) - if (.not. allocated(DstElemInflowTypeData%InflowAcc)) then - allocate(DstElemInflowTypeData%InflowAcc(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + DstParamData%DT = SrcParamData%DT + DstParamData%RootName = SrcParamData%RootName + if (allocated(SrcParamData%AFI)) then + LB(1:1) = lbound(SrcParamData%AFI) + UB(1:1) = ubound(SrcParamData%AFI) + if (.not. allocated(DstParamData%AFI)) then + allocate(DstParamData%AFI(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstElemInflowTypeData%InflowAcc.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AFI.', ErrStat, ErrMsg, RoutineName) return end if end if - DstElemInflowTypeData%InflowAcc = SrcElemInflowTypeData%InflowAcc + do i1 = LB(1), UB(1) + call AFI_CopyParam(SrcParamData%AFI(i1), DstParamData%AFI(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if + DstParamData%Skew_Mod = SrcParamData%Skew_Mod + DstParamData%Wake_Mod = SrcParamData%Wake_Mod + call FVW_CopyParam(SrcParamData%FVW, DstParamData%FVW, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstParamData%CompAeroMaps = SrcParamData%CompAeroMaps + DstParamData%UA_Flag = SrcParamData%UA_Flag + DstParamData%CompSeaSt = SrcParamData%CompSeaSt + DstParamData%FlowField => SrcParamData%FlowField + DstParamData%SectAvg = SrcParamData%SectAvg + DstParamData%SA_Weighting = SrcParamData%SA_Weighting + DstParamData%SA_PsiBwd = SrcParamData%SA_PsiBwd + DstParamData%SA_PsiFwd = SrcParamData%SA_PsiFwd + DstParamData%SA_nPerSec = SrcParamData%SA_nPerSec + DstParamData%WaveField => SrcParamData%WaveField end subroutine -subroutine AD_DestroyElemInflowType(ElemInflowTypeData, ErrStat, ErrMsg) - type(ElemInflowType), intent(inout) :: ElemInflowTypeData +subroutine AD_DestroyParam(ParamData, ErrStat, ErrMsg) + type(AD_ParameterType), intent(inout) :: ParamData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'AD_DestroyElemInflowType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(ElemInflowTypeData%InflowVel)) then - deallocate(ElemInflowTypeData%InflowVel) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AD_DestroyParam' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(ParamData%rotors)) then + LB(1:1) = lbound(ParamData%rotors) + UB(1:1) = ubound(ParamData%rotors) + do i1 = LB(1), UB(1) + call AD_DestroyRotParameterType(ParamData%rotors(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ParamData%rotors) end if - if (allocated(ElemInflowTypeData%InflowAcc)) then - deallocate(ElemInflowTypeData%InflowAcc) + if (allocated(ParamData%AFI)) then + LB(1:1) = lbound(ParamData%AFI) + UB(1:1) = ubound(ParamData%AFI) + do i1 = LB(1), UB(1) + call AFI_DestroyParam(ParamData%AFI(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ParamData%AFI) end if + call FVW_DestroyParam(ParamData%FVW, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + nullify(ParamData%FlowField) + nullify(ParamData%WaveField) end subroutine -subroutine AD_PackElemInflowType(RF, Indata) +subroutine AD_PackParam(RF, Indata) type(RegFile), intent(inout) :: RF - type(ElemInflowType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackElemInflowType' + type(AD_ParameterType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackParam' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + logical :: PtrInIndex if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%InflowVel) - call RegPackAlloc(RF, InData%InflowAcc) + call RegPack(RF, allocated(InData%rotors)) + if (allocated(InData%rotors)) then + call RegPackBounds(RF, 1, lbound(InData%rotors), ubound(InData%rotors)) + LB(1:1) = lbound(InData%rotors) + UB(1:1) = ubound(InData%rotors) + do i1 = LB(1), UB(1) + call AD_PackRotParameterType(RF, InData%rotors(i1)) + end do + end if + call RegPack(RF, InData%DT) + call RegPack(RF, InData%RootName) + call RegPack(RF, allocated(InData%AFI)) + if (allocated(InData%AFI)) then + call RegPackBounds(RF, 1, lbound(InData%AFI), ubound(InData%AFI)) + LB(1:1) = lbound(InData%AFI) + UB(1:1) = ubound(InData%AFI) + do i1 = LB(1), UB(1) + call AFI_PackParam(RF, InData%AFI(i1)) + end do + end if + call RegPack(RF, InData%Skew_Mod) + call RegPack(RF, InData%Wake_Mod) + call FVW_PackParam(RF, InData%FVW) + call RegPack(RF, InData%CompAeroMaps) + call RegPack(RF, InData%UA_Flag) + call RegPack(RF, InData%CompSeaSt) + call RegPack(RF, associated(InData%FlowField)) + if (associated(InData%FlowField)) then + call RegPackPointer(RF, c_loc(InData%FlowField), PtrInIndex) + if (.not. PtrInIndex) then + call IfW_FlowField_PackFlowFieldType(RF, InData%FlowField) + end if + end if + call RegPack(RF, InData%SectAvg) + call RegPack(RF, InData%SA_Weighting) + call RegPack(RF, InData%SA_PsiBwd) + call RegPack(RF, InData%SA_PsiFwd) + call RegPack(RF, InData%SA_nPerSec) + call RegPack(RF, associated(InData%WaveField)) + if (associated(InData%WaveField)) then + call RegPackPointer(RF, c_loc(InData%WaveField), PtrInIndex) + if (.not. PtrInIndex) then + call SeaSt_WaveField_PackSeaSt_WaveFieldType(RF, InData%WaveField) + end if + end if if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_UnPackElemInflowType(RF, OutData) +subroutine AD_UnPackParam(RF, OutData) type(RegFile), intent(inout) :: RF - type(ElemInflowType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackElemInflowType' - integer(B4Ki) :: LB(2), UB(2) + type(AD_ParameterType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackParam' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc + integer(B8Ki) :: PtrIdx + type(c_ptr) :: Ptr if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%InflowVel); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InflowAcc); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%rotors)) deallocate(OutData%rotors) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%rotors(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%rotors.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call AD_UnpackRotParameterType(RF, OutData%rotors(i1)) ! rotors + end do + end if + call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%AFI)) deallocate(OutData%AFI) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%AFI(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%AFI.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call AFI_UnpackParam(RF, OutData%AFI(i1)) ! AFI + end do + end if + call RegUnpack(RF, OutData%Skew_Mod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Wake_Mod); if (RegCheckErr(RF, RoutineName)) return + call FVW_UnpackParam(RF, OutData%FVW) ! FVW + call RegUnpack(RF, OutData%CompAeroMaps); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UA_Flag); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CompSeaSt); if (RegCheckErr(RF, RoutineName)) return + if (associated(OutData%FlowField)) deallocate(OutData%FlowField) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackPointer(RF, Ptr, PtrIdx); if (RegCheckErr(RF, RoutineName)) return + if (c_associated(Ptr)) then + call c_f_pointer(Ptr, OutData%FlowField) + else + allocate(OutData%FlowField,stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%FlowField.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + RF%Pointers(PtrIdx) = c_loc(OutData%FlowField) + call IfW_FlowField_UnpackFlowFieldType(RF, OutData%FlowField) ! FlowField + end if + else + OutData%FlowField => null() + end if + call RegUnpack(RF, OutData%SectAvg); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SA_Weighting); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SA_PsiBwd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SA_PsiFwd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SA_nPerSec); if (RegCheckErr(RF, RoutineName)) return + if (associated(OutData%WaveField)) deallocate(OutData%WaveField) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackPointer(RF, Ptr, PtrIdx); if (RegCheckErr(RF, RoutineName)) return + if (c_associated(Ptr)) then + call c_f_pointer(Ptr, OutData%WaveField) + else + allocate(OutData%WaveField,stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveField.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + RF%Pointers(PtrIdx) = c_loc(OutData%WaveField) + call SeaSt_WaveField_UnpackSeaSt_WaveFieldType(RF, OutData%WaveField) ! WaveField + end if + else + OutData%WaveField => null() + end if end subroutine -subroutine AD_CopyRotInflowType(SrcRotInflowTypeData, DstRotInflowTypeData, CtrlCode, ErrStat, ErrMsg) - type(RotInflowType), intent(in) :: SrcRotInflowTypeData - type(RotInflowType), intent(inout) :: DstRotInflowTypeData +subroutine AD_CopyRotInputType(SrcRotInputTypeData, DstRotInputTypeData, CtrlCode, ErrStat, ErrMsg) + type(RotInputType), intent(inout) :: SrcRotInputTypeData + type(RotInputType), intent(inout) :: DstRotInputTypeData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -4167,388 +4400,480 @@ subroutine AD_CopyRotInflowType(SrcRotInflowTypeData, DstRotInflowTypeData, Ctrl integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyRotInflowType' + character(*), parameter :: RoutineName = 'AD_CopyRotInputType' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcRotInflowTypeData%Blade)) then - LB(1:1) = lbound(SrcRotInflowTypeData%Blade) - UB(1:1) = ubound(SrcRotInflowTypeData%Blade) - if (.not. allocated(DstRotInflowTypeData%Blade)) then - allocate(DstRotInflowTypeData%Blade(LB(1):UB(1)), stat=ErrStat2) + call MeshCopy(SrcRotInputTypeData%NacelleMotion, DstRotInputTypeData%NacelleMotion, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcRotInputTypeData%TowerMotion, DstRotInputTypeData%TowerMotion, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcRotInputTypeData%HubMotion, DstRotInputTypeData%HubMotion, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcRotInputTypeData%BladeRootMotion)) then + LB(1:1) = lbound(SrcRotInputTypeData%BladeRootMotion) + UB(1:1) = ubound(SrcRotInputTypeData%BladeRootMotion) + if (.not. allocated(DstRotInputTypeData%BladeRootMotion)) then + allocate(DstRotInputTypeData%BladeRootMotion(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInflowTypeData%Blade.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInputTypeData%BladeRootMotion.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call AD_CopyElemInflowType(SrcRotInflowTypeData%Blade(i1), DstRotInflowTypeData%Blade(i1), CtrlCode, ErrStat2, ErrMsg2) + call MeshCopy(SrcRotInputTypeData%BladeRootMotion(i1), DstRotInputTypeData%BladeRootMotion(i1), CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call AD_CopyElemInflowType(SrcRotInflowTypeData%Tower, DstRotInflowTypeData%Tower, CtrlCode, ErrStat2, ErrMsg2) + if (allocated(SrcRotInputTypeData%BladeMotion)) then + LB(1:1) = lbound(SrcRotInputTypeData%BladeMotion) + UB(1:1) = ubound(SrcRotInputTypeData%BladeMotion) + if (.not. allocated(DstRotInputTypeData%BladeMotion)) then + allocate(DstRotInputTypeData%BladeMotion(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInputTypeData%BladeMotion.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MeshCopy(SrcRotInputTypeData%BladeMotion(i1), DstRotInputTypeData%BladeMotion(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call MeshCopy(SrcRotInputTypeData%TFinMotion, DstRotInputTypeData%TFinMotion, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - DstRotInflowTypeData%InflowOnHub = SrcRotInflowTypeData%InflowOnHub - DstRotInflowTypeData%InflowOnNacelle = SrcRotInflowTypeData%InflowOnNacelle - DstRotInflowTypeData%InflowOnTailFin = SrcRotInflowTypeData%InflowOnTailFin - DstRotInflowTypeData%AvgDiskVel = SrcRotInflowTypeData%AvgDiskVel + if (allocated(SrcRotInputTypeData%UserProp)) then + LB(1:2) = lbound(SrcRotInputTypeData%UserProp) + UB(1:2) = ubound(SrcRotInputTypeData%UserProp) + if (.not. allocated(DstRotInputTypeData%UserProp)) then + allocate(DstRotInputTypeData%UserProp(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInputTypeData%UserProp.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotInputTypeData%UserProp = SrcRotInputTypeData%UserProp + end if end subroutine -subroutine AD_DestroyRotInflowType(RotInflowTypeData, ErrStat, ErrMsg) - type(RotInflowType), intent(inout) :: RotInflowTypeData +subroutine AD_DestroyRotInputType(RotInputTypeData, ErrStat, ErrMsg) + type(RotInputType), intent(inout) :: RotInputTypeData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyRotInflowType' + character(*), parameter :: RoutineName = 'AD_DestroyRotInputType' ErrStat = ErrID_None ErrMsg = '' - if (allocated(RotInflowTypeData%Blade)) then - LB(1:1) = lbound(RotInflowTypeData%Blade) - UB(1:1) = ubound(RotInflowTypeData%Blade) + call MeshDestroy( RotInputTypeData%NacelleMotion, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( RotInputTypeData%TowerMotion, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( RotInputTypeData%HubMotion, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(RotInputTypeData%BladeRootMotion)) then + LB(1:1) = lbound(RotInputTypeData%BladeRootMotion) + UB(1:1) = ubound(RotInputTypeData%BladeRootMotion) do i1 = LB(1), UB(1) - call AD_DestroyElemInflowType(RotInflowTypeData%Blade(i1), ErrStat2, ErrMsg2) + call MeshDestroy( RotInputTypeData%BladeRootMotion(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(RotInflowTypeData%Blade) + deallocate(RotInputTypeData%BladeRootMotion) end if - call AD_DestroyElemInflowType(RotInflowTypeData%Tower, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) -end subroutine - -subroutine AD_PackRotInflowType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(RotInflowType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackRotInflowType' - integer(B4Ki) :: i1, i2 + if (allocated(RotInputTypeData%BladeMotion)) then + LB(1:1) = lbound(RotInputTypeData%BladeMotion) + UB(1:1) = ubound(RotInputTypeData%BladeMotion) + do i1 = LB(1), UB(1) + call MeshDestroy( RotInputTypeData%BladeMotion(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(RotInputTypeData%BladeMotion) + end if + call MeshDestroy( RotInputTypeData%TFinMotion, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(RotInputTypeData%UserProp)) then + deallocate(RotInputTypeData%UserProp) + end if +end subroutine + +subroutine AD_PackRotInputType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(RotInputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackRotInputType' + integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%Blade)) - if (allocated(InData%Blade)) then - call RegPackBounds(RF, 1, lbound(InData%Blade), ubound(InData%Blade)) - LB(1:1) = lbound(InData%Blade) - UB(1:1) = ubound(InData%Blade) + call MeshPack(RF, InData%NacelleMotion) + call MeshPack(RF, InData%TowerMotion) + call MeshPack(RF, InData%HubMotion) + call RegPack(RF, allocated(InData%BladeRootMotion)) + if (allocated(InData%BladeRootMotion)) then + call RegPackBounds(RF, 1, lbound(InData%BladeRootMotion), ubound(InData%BladeRootMotion)) + LB(1:1) = lbound(InData%BladeRootMotion) + UB(1:1) = ubound(InData%BladeRootMotion) do i1 = LB(1), UB(1) - call AD_PackElemInflowType(RF, InData%Blade(i1)) + call MeshPack(RF, InData%BladeRootMotion(i1)) end do end if - call AD_PackElemInflowType(RF, InData%Tower) - call RegPack(RF, InData%InflowOnHub) - call RegPack(RF, InData%InflowOnNacelle) - call RegPack(RF, InData%InflowOnTailFin) - call RegPack(RF, InData%AvgDiskVel) + call RegPack(RF, allocated(InData%BladeMotion)) + if (allocated(InData%BladeMotion)) then + call RegPackBounds(RF, 1, lbound(InData%BladeMotion), ubound(InData%BladeMotion)) + LB(1:1) = lbound(InData%BladeMotion) + UB(1:1) = ubound(InData%BladeMotion) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%BladeMotion(i1)) + end do + end if + call MeshPack(RF, InData%TFinMotion) + call RegPackAlloc(RF, InData%UserProp) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_UnPackRotInflowType(RF, OutData) +subroutine AD_UnPackRotInputType(RF, OutData) type(RegFile), intent(inout) :: RF - type(RotInflowType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackRotInflowType' + type(RotInputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackRotInputType' integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%Blade)) deallocate(OutData%Blade) + call MeshUnpack(RF, OutData%NacelleMotion) ! NacelleMotion + call MeshUnpack(RF, OutData%TowerMotion) ! TowerMotion + call MeshUnpack(RF, OutData%HubMotion) ! HubMotion + if (allocated(OutData%BladeRootMotion)) deallocate(OutData%BladeRootMotion) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Blade(LB(1):UB(1)),stat=stat) + allocate(OutData%BladeRootMotion(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Blade.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeRootMotion.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call AD_UnpackElemInflowType(RF, OutData%Blade(i1)) ! Blade + call MeshUnpack(RF, OutData%BladeRootMotion(i1)) ! BladeRootMotion end do end if - call AD_UnpackElemInflowType(RF, OutData%Tower) ! Tower - call RegUnpack(RF, OutData%InflowOnHub); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%InflowOnNacelle); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%InflowOnTailFin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AvgDiskVel); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%BladeMotion)) deallocate(OutData%BladeMotion) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BladeMotion(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeMotion.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%BladeMotion(i1)) ! BladeMotion + end do + end if + call MeshUnpack(RF, OutData%TFinMotion) ! TFinMotion + call RegUnpackAlloc(RF, OutData%UserProp); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_CopyInflowType(SrcInflowTypeData, DstInflowTypeData, CtrlCode, ErrStat, ErrMsg) - type(AD_InflowType), intent(in) :: SrcInflowTypeData - type(AD_InflowType), intent(inout) :: DstInflowTypeData +subroutine AD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) + type(AD_InputType), intent(inout) :: SrcInputData + type(AD_InputType), intent(inout) :: DstInputData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyInflowType' + character(*), parameter :: RoutineName = 'AD_CopyInput' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcInflowTypeData%InflowWakeVel)) then - LB(1:2) = lbound(SrcInflowTypeData%InflowWakeVel) - UB(1:2) = ubound(SrcInflowTypeData%InflowWakeVel) - if (.not. allocated(DstInflowTypeData%InflowWakeVel)) then - allocate(DstInflowTypeData%InflowWakeVel(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowTypeData%InflowWakeVel.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInflowTypeData%InflowWakeVel = SrcInflowTypeData%InflowWakeVel - end if - if (allocated(SrcInflowTypeData%RotInflow)) then - LB(1:1) = lbound(SrcInflowTypeData%RotInflow) - UB(1:1) = ubound(SrcInflowTypeData%RotInflow) - if (.not. allocated(DstInflowTypeData%RotInflow)) then - allocate(DstInflowTypeData%RotInflow(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInputData%rotors)) then + LB(1:1) = lbound(SrcInputData%rotors) + UB(1:1) = ubound(SrcInputData%rotors) + if (.not. allocated(DstInputData%rotors)) then + allocate(DstInputData%rotors(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowTypeData%RotInflow.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%rotors.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call AD_CopyRotInflowType(SrcInflowTypeData%RotInflow(i1), DstInflowTypeData%RotInflow(i1), CtrlCode, ErrStat2, ErrMsg2) + call AD_CopyRotInputType(SrcInputData%rotors(i1), DstInputData%rotors(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if end subroutine -subroutine AD_DestroyInflowType(InflowTypeData, ErrStat, ErrMsg) - type(AD_InflowType), intent(inout) :: InflowTypeData +subroutine AD_DestroyInput(InputData, ErrStat, ErrMsg) + type(AD_InputType), intent(inout) :: InputData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyInflowType' + character(*), parameter :: RoutineName = 'AD_DestroyInput' ErrStat = ErrID_None ErrMsg = '' - if (allocated(InflowTypeData%InflowWakeVel)) then - deallocate(InflowTypeData%InflowWakeVel) - end if - if (allocated(InflowTypeData%RotInflow)) then - LB(1:1) = lbound(InflowTypeData%RotInflow) - UB(1:1) = ubound(InflowTypeData%RotInflow) + if (allocated(InputData%rotors)) then + LB(1:1) = lbound(InputData%rotors) + UB(1:1) = ubound(InputData%rotors) do i1 = LB(1), UB(1) - call AD_DestroyRotInflowType(InflowTypeData%RotInflow(i1), ErrStat2, ErrMsg2) + call AD_DestroyRotInputType(InputData%rotors(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(InflowTypeData%RotInflow) + deallocate(InputData%rotors) end if end subroutine -subroutine AD_PackInflowType(RF, Indata) +subroutine AD_PackInput(RF, Indata) type(RegFile), intent(inout) :: RF - type(AD_InflowType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackInflowType' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + type(AD_InputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackInput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%InflowWakeVel) - call RegPack(RF, allocated(InData%RotInflow)) - if (allocated(InData%RotInflow)) then - call RegPackBounds(RF, 1, lbound(InData%RotInflow), ubound(InData%RotInflow)) - LB(1:1) = lbound(InData%RotInflow) - UB(1:1) = ubound(InData%RotInflow) + call RegPack(RF, allocated(InData%rotors)) + if (allocated(InData%rotors)) then + call RegPackBounds(RF, 1, lbound(InData%rotors), ubound(InData%rotors)) + LB(1:1) = lbound(InData%rotors) + UB(1:1) = ubound(InData%rotors) do i1 = LB(1), UB(1) - call AD_PackRotInflowType(RF, InData%RotInflow(i1)) + call AD_PackRotInputType(RF, InData%rotors(i1)) end do end if if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_UnPackInflowType(RF, OutData) +subroutine AD_UnPackInput(RF, OutData) type(RegFile), intent(inout) :: RF - type(AD_InflowType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackInflowType' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + type(AD_InputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackInput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%InflowWakeVel); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%RotInflow)) deallocate(OutData%RotInflow) + if (allocated(OutData%rotors)) deallocate(OutData%rotors) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%RotInflow(LB(1):UB(1)),stat=stat) + allocate(OutData%rotors(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%RotInflow.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%rotors.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call AD_UnpackRotInflowType(RF, OutData%RotInflow(i1)) ! RotInflow + call AD_UnpackRotInputType(RF, OutData%rotors(i1)) ! rotors end do end if end subroutine -subroutine AD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(AD_MiscVarType), intent(inout) :: SrcMiscData - type(AD_MiscVarType), intent(inout) :: DstMiscData +subroutine AD_CopyRotOutputType(SrcRotOutputTypeData, DstRotOutputTypeData, CtrlCode, ErrStat, ErrMsg) + type(RotOutputType), intent(inout) :: SrcRotOutputTypeData + type(RotOutputType), intent(inout) :: DstRotOutputTypeData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyMisc' + character(*), parameter :: RoutineName = 'AD_CopyRotOutputType' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcMiscData%rotors)) then - LB(1:1) = lbound(SrcMiscData%rotors) - UB(1:1) = ubound(SrcMiscData%rotors) - if (.not. allocated(DstMiscData%rotors)) then - allocate(DstMiscData%rotors(LB(1):UB(1)), stat=ErrStat2) + call MeshCopy(SrcRotOutputTypeData%NacelleLoad, DstRotOutputTypeData%NacelleLoad, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcRotOutputTypeData%HubLoad, DstRotOutputTypeData%HubLoad, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcRotOutputTypeData%TowerLoad, DstRotOutputTypeData%TowerLoad, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcRotOutputTypeData%BladeLoad)) then + LB(1:1) = lbound(SrcRotOutputTypeData%BladeLoad) + UB(1:1) = ubound(SrcRotOutputTypeData%BladeLoad) + if (.not. allocated(DstRotOutputTypeData%BladeLoad)) then + allocate(DstRotOutputTypeData%BladeLoad(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%rotors.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotOutputTypeData%BladeLoad.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call AD_CopyRotMiscVarType(SrcMiscData%rotors(i1), DstMiscData%rotors(i1), CtrlCode, ErrStat2, ErrMsg2) + call MeshCopy(SrcRotOutputTypeData%BladeLoad(i1), DstRotOutputTypeData%BladeLoad(i1), CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMiscData%FVW_u)) then - LB(1:1) = lbound(SrcMiscData%FVW_u) - UB(1:1) = ubound(SrcMiscData%FVW_u) - if (.not. allocated(DstMiscData%FVW_u)) then - allocate(DstMiscData%FVW_u(LB(1):UB(1)), stat=ErrStat2) + call MeshCopy(SrcRotOutputTypeData%TFinLoad, DstRotOutputTypeData%TFinLoad, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcRotOutputTypeData%WriteOutput)) then + LB(1:1) = lbound(SrcRotOutputTypeData%WriteOutput) + UB(1:1) = ubound(SrcRotOutputTypeData%WriteOutput) + if (.not. allocated(DstRotOutputTypeData%WriteOutput)) then + allocate(DstRotOutputTypeData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FVW_u.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotOutputTypeData%WriteOutput.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call FVW_CopyInput(SrcMiscData%FVW_u(i1), DstMiscData%FVW_u(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstRotOutputTypeData%WriteOutput = SrcRotOutputTypeData%WriteOutput end if - call FVW_CopyOutput(SrcMiscData%FVW_y, DstMiscData%FVW_y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call FVW_CopyMisc(SrcMiscData%FVW, DstMiscData%FVW, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcMiscData%WindPos)) then - LB(1:2) = lbound(SrcMiscData%WindPos) - UB(1:2) = ubound(SrcMiscData%WindPos) - if (.not. allocated(DstMiscData%WindPos)) then - allocate(DstMiscData%WindPos(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WindPos.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%WindPos = SrcMiscData%WindPos +end subroutine + +subroutine AD_DestroyRotOutputType(RotOutputTypeData, ErrStat, ErrMsg) + type(RotOutputType), intent(inout) :: RotOutputTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AD_DestroyRotOutputType' + ErrStat = ErrID_None + ErrMsg = '' + call MeshDestroy( RotOutputTypeData%NacelleLoad, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( RotOutputTypeData%HubLoad, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( RotOutputTypeData%TowerLoad, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(RotOutputTypeData%BladeLoad)) then + LB(1:1) = lbound(RotOutputTypeData%BladeLoad) + UB(1:1) = ubound(RotOutputTypeData%BladeLoad) + do i1 = LB(1), UB(1) + call MeshDestroy( RotOutputTypeData%BladeLoad(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(RotOutputTypeData%BladeLoad) end if - if (allocated(SrcMiscData%WindVel)) then - LB(1:2) = lbound(SrcMiscData%WindVel) - UB(1:2) = ubound(SrcMiscData%WindVel) - if (.not. allocated(DstMiscData%WindVel)) then - allocate(DstMiscData%WindVel(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WindVel.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%WindVel = SrcMiscData%WindVel + call MeshDestroy( RotOutputTypeData%TFinLoad, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(RotOutputTypeData%WriteOutput)) then + deallocate(RotOutputTypeData%WriteOutput) end if - if (allocated(SrcMiscData%WindAcc)) then - LB(1:2) = lbound(SrcMiscData%WindAcc) - UB(1:2) = ubound(SrcMiscData%WindAcc) - if (.not. allocated(DstMiscData%WindAcc)) then - allocate(DstMiscData%WindAcc(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WindAcc.', ErrStat, ErrMsg, RoutineName) - return - end if +end subroutine + +subroutine AD_PackRotOutputType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(RotOutputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackRotOutputType' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call MeshPack(RF, InData%NacelleLoad) + call MeshPack(RF, InData%HubLoad) + call MeshPack(RF, InData%TowerLoad) + call RegPack(RF, allocated(InData%BladeLoad)) + if (allocated(InData%BladeLoad)) then + call RegPackBounds(RF, 1, lbound(InData%BladeLoad), ubound(InData%BladeLoad)) + LB(1:1) = lbound(InData%BladeLoad) + UB(1:1) = ubound(InData%BladeLoad) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%BladeLoad(i1)) + end do + end if + call MeshPack(RF, InData%TFinLoad) + call RegPackAlloc(RF, InData%WriteOutput) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AD_UnPackRotOutputType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(RotOutputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackRotOutputType' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call MeshUnpack(RF, OutData%NacelleLoad) ! NacelleLoad + call MeshUnpack(RF, OutData%HubLoad) ! HubLoad + call MeshUnpack(RF, OutData%TowerLoad) ! TowerLoad + if (allocated(OutData%BladeLoad)) deallocate(OutData%BladeLoad) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BladeLoad(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeLoad.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if - DstMiscData%WindAcc = SrcMiscData%WindAcc + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%BladeLoad(i1)) ! BladeLoad + end do end if - if (allocated(SrcMiscData%Inflow)) then - LB(1:1) = lbound(SrcMiscData%Inflow) - UB(1:1) = ubound(SrcMiscData%Inflow) - if (.not. allocated(DstMiscData%Inflow)) then - allocate(DstMiscData%Inflow(LB(1):UB(1)), stat=ErrStat2) + call MeshUnpack(RF, OutData%TFinLoad) ! TFinLoad + call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) + type(AD_OutputType), intent(inout) :: SrcOutputData + type(AD_OutputType), intent(inout) :: DstOutputData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AD_CopyOutput' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcOutputData%rotors)) then + LB(1:1) = lbound(SrcOutputData%rotors) + UB(1:1) = ubound(SrcOutputData%rotors) + if (.not. allocated(DstOutputData%rotors)) then + allocate(DstOutputData%rotors(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Inflow.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%rotors.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call AD_CopyInflowType(SrcMiscData%Inflow(i1), DstMiscData%Inflow(i1), CtrlCode, ErrStat2, ErrMsg2) + call AD_CopyRotOutputType(SrcOutputData%rotors(i1), DstOutputData%rotors(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if end subroutine -subroutine AD_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(AD_MiscVarType), intent(inout) :: MiscData +subroutine AD_DestroyOutput(OutputData, ErrStat, ErrMsg) + type(AD_OutputType), intent(inout) :: OutputData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyMisc' + character(*), parameter :: RoutineName = 'AD_DestroyOutput' ErrStat = ErrID_None ErrMsg = '' - if (allocated(MiscData%rotors)) then - LB(1:1) = lbound(MiscData%rotors) - UB(1:1) = ubound(MiscData%rotors) - do i1 = LB(1), UB(1) - call AD_DestroyRotMiscVarType(MiscData%rotors(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%rotors) - end if - if (allocated(MiscData%FVW_u)) then - LB(1:1) = lbound(MiscData%FVW_u) - UB(1:1) = ubound(MiscData%FVW_u) - do i1 = LB(1), UB(1) - call FVW_DestroyInput(MiscData%FVW_u(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%FVW_u) - end if - call FVW_DestroyOutput(MiscData%FVW_y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call FVW_DestroyMisc(MiscData%FVW, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MiscData%WindPos)) then - deallocate(MiscData%WindPos) - end if - if (allocated(MiscData%WindVel)) then - deallocate(MiscData%WindVel) - end if - if (allocated(MiscData%WindAcc)) then - deallocate(MiscData%WindAcc) - end if - if (allocated(MiscData%Inflow)) then - LB(1:1) = lbound(MiscData%Inflow) - UB(1:1) = ubound(MiscData%Inflow) + if (allocated(OutputData%rotors)) then + LB(1:1) = lbound(OutputData%rotors) + UB(1:1) = ubound(OutputData%rotors) do i1 = LB(1), UB(1) - call AD_DestroyInflowType(MiscData%Inflow(i1), ErrStat2, ErrMsg2) + call AD_DestroyRotOutputType(OutputData%rotors(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MiscData%Inflow) + deallocate(OutputData%rotors) end if end subroutine -subroutine AD_PackMisc(RF, Indata) +subroutine AD_PackOutput(RF, Indata) type(RegFile), intent(inout) :: RF - type(AD_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackMisc' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + type(AD_OutputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, allocated(InData%rotors)) if (allocated(InData%rotors)) then @@ -4556,41 +4881,18 @@ subroutine AD_PackMisc(RF, Indata) LB(1:1) = lbound(InData%rotors) UB(1:1) = ubound(InData%rotors) do i1 = LB(1), UB(1) - call AD_PackRotMiscVarType(RF, InData%rotors(i1)) - end do - end if - call RegPack(RF, allocated(InData%FVW_u)) - if (allocated(InData%FVW_u)) then - call RegPackBounds(RF, 1, lbound(InData%FVW_u), ubound(InData%FVW_u)) - LB(1:1) = lbound(InData%FVW_u) - UB(1:1) = ubound(InData%FVW_u) - do i1 = LB(1), UB(1) - call FVW_PackInput(RF, InData%FVW_u(i1)) - end do - end if - call FVW_PackOutput(RF, InData%FVW_y) - call FVW_PackMisc(RF, InData%FVW) - call RegPackAlloc(RF, InData%WindPos) - call RegPackAlloc(RF, InData%WindVel) - call RegPackAlloc(RF, InData%WindAcc) - call RegPack(RF, allocated(InData%Inflow)) - if (allocated(InData%Inflow)) then - call RegPackBounds(RF, 1, lbound(InData%Inflow), ubound(InData%Inflow)) - LB(1:1) = lbound(InData%Inflow) - UB(1:1) = ubound(InData%Inflow) - do i1 = LB(1), UB(1) - call AD_PackInflowType(RF, InData%Inflow(i1)) + call AD_PackRotOutputType(RF, InData%rotors(i1)) end do end if if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_UnPackMisc(RF, OutData) +subroutine AD_UnPackOutput(RF, OutData) type(RegFile), intent(inout) :: RF - type(AD_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackMisc' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + type(AD_OutputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return @@ -4604,1484 +4906,1364 @@ subroutine AD_UnPackMisc(RF, OutData) return end if do i1 = LB(1), UB(1) - call AD_UnpackRotMiscVarType(RF, OutData%rotors(i1)) ! rotors - end do - end if - if (allocated(OutData%FVW_u)) deallocate(OutData%FVW_u) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%FVW_u(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%FVW_u.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call FVW_UnpackInput(RF, OutData%FVW_u(i1)) ! FVW_u + call AD_UnpackRotOutputType(RF, OutData%rotors(i1)) ! rotors end do end if - call FVW_UnpackOutput(RF, OutData%FVW_y) ! FVW_y - call FVW_UnpackMisc(RF, OutData%FVW) ! FVW - call RegUnpackAlloc(RF, OutData%WindPos); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%WindVel); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%WindAcc); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%Inflow)) deallocate(OutData%Inflow) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Inflow(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Inflow.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call AD_UnpackInflowType(RF, OutData%Inflow(i1)) ! Inflow - end do - end if -end subroutine - -subroutine AD_CopyJac_u_idxStarts(SrcJac_u_idxStartsData, DstJac_u_idxStartsData, CtrlCode, ErrStat, ErrMsg) - type(Jac_u_idxStarts), intent(in) :: SrcJac_u_idxStartsData - type(Jac_u_idxStarts), intent(inout) :: DstJac_u_idxStartsData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'AD_CopyJac_u_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' - DstJac_u_idxStartsData%Nacelle = SrcJac_u_idxStartsData%Nacelle - DstJac_u_idxStartsData%Hub = SrcJac_u_idxStartsData%Hub - DstJac_u_idxStartsData%TFin = SrcJac_u_idxStartsData%TFin - DstJac_u_idxStartsData%Tower = SrcJac_u_idxStartsData%Tower - DstJac_u_idxStartsData%BladeRoot = SrcJac_u_idxStartsData%BladeRoot - DstJac_u_idxStartsData%Blade = SrcJac_u_idxStartsData%Blade - DstJac_u_idxStartsData%UserProp = SrcJac_u_idxStartsData%UserProp - DstJac_u_idxStartsData%Extended = SrcJac_u_idxStartsData%Extended -end subroutine - -subroutine AD_DestroyJac_u_idxStarts(Jac_u_idxStartsData, ErrStat, ErrMsg) - type(Jac_u_idxStarts), intent(inout) :: Jac_u_idxStartsData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'AD_DestroyJac_u_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine AD_PackJac_u_idxStarts(RF, Indata) - type(RegFile), intent(inout) :: RF - type(Jac_u_idxStarts), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackJac_u_idxStarts' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%Nacelle) - call RegPack(RF, InData%Hub) - call RegPack(RF, InData%TFin) - call RegPack(RF, InData%Tower) - call RegPack(RF, InData%BladeRoot) - call RegPack(RF, InData%Blade) - call RegPack(RF, InData%UserProp) - call RegPack(RF, InData%Extended) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_UnPackJac_u_idxStarts(RF, OutData) - type(RegFile), intent(inout) :: RF - type(Jac_u_idxStarts), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackJac_u_idxStarts' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%Nacelle); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Hub); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Tower); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BladeRoot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Blade); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UserProp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Extended); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_CopyJac_y_idxStarts(SrcJac_y_idxStartsData, DstJac_y_idxStartsData, CtrlCode, ErrStat, ErrMsg) - type(Jac_y_idxStarts), intent(in) :: SrcJac_y_idxStartsData - type(Jac_y_idxStarts), intent(inout) :: DstJac_y_idxStartsData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'AD_CopyJac_y_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' - DstJac_y_idxStartsData%NacelleLoad = SrcJac_y_idxStartsData%NacelleLoad - DstJac_y_idxStartsData%HubLoad = SrcJac_y_idxStartsData%HubLoad - DstJac_y_idxStartsData%TFinLoad = SrcJac_y_idxStartsData%TFinLoad - DstJac_y_idxStartsData%TowerLoad = SrcJac_y_idxStartsData%TowerLoad - DstJac_y_idxStartsData%BladeLoad = SrcJac_y_idxStartsData%BladeLoad -end subroutine - -subroutine AD_DestroyJac_y_idxStarts(Jac_y_idxStartsData, ErrStat, ErrMsg) - type(Jac_y_idxStarts), intent(inout) :: Jac_y_idxStartsData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'AD_DestroyJac_y_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine AD_PackJac_y_idxStarts(RF, Indata) - type(RegFile), intent(inout) :: RF - type(Jac_y_idxStarts), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackJac_y_idxStarts' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%NacelleLoad) - call RegPack(RF, InData%HubLoad) - call RegPack(RF, InData%TFinLoad) - call RegPack(RF, InData%TowerLoad) - call RegPack(RF, InData%BladeLoad) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_UnPackJac_y_idxStarts(RF, OutData) - type(RegFile), intent(inout) :: RF - type(Jac_y_idxStarts), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackJac_y_idxStarts' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%NacelleLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HubLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TowerLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BladeLoad); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_CopyRotParameterType(SrcRotParameterTypeData, DstRotParameterTypeData, CtrlCode, ErrStat, ErrMsg) - type(RotParameterType), intent(in) :: SrcRotParameterTypeData - type(RotParameterType), intent(inout) :: DstRotParameterTypeData +subroutine AD_CopyRotMiscVarType(SrcRotMiscVarTypeData, DstRotMiscVarTypeData, CtrlCode, ErrStat, ErrMsg) + type(RotMiscVarType), intent(inout) :: SrcRotMiscVarTypeData + type(RotMiscVarType), intent(inout) :: DstRotMiscVarTypeData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1, i2, i3, i4 + integer(B4Ki) :: LB(4), UB(4) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyRotParameterType' + character(*), parameter :: RoutineName = 'AD_CopyRotMiscVarType' ErrStat = ErrID_None ErrMsg = '' - DstRotParameterTypeData%NumBlades = SrcRotParameterTypeData%NumBlades - DstRotParameterTypeData%NumBlNds = SrcRotParameterTypeData%NumBlNds - DstRotParameterTypeData%NumTwrNds = SrcRotParameterTypeData%NumTwrNds - if (allocated(SrcRotParameterTypeData%TwrDiam)) then - LB(1:1) = lbound(SrcRotParameterTypeData%TwrDiam) - UB(1:1) = ubound(SrcRotParameterTypeData%TwrDiam) - if (.not. allocated(DstRotParameterTypeData%TwrDiam)) then - allocate(DstRotParameterTypeData%TwrDiam(LB(1):UB(1)), stat=ErrStat2) + call NWTC_Library_CopyModJacType(SrcRotMiscVarTypeData%Jac, DstRotMiscVarTypeData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyRotContinuousStateType(SrcRotMiscVarTypeData%x_init, DstRotMiscVarTypeData%x_init, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyRotContinuousStateType(SrcRotMiscVarTypeData%x_perturb, DstRotMiscVarTypeData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyRotContinuousStateType(SrcRotMiscVarTypeData%dxdt_lin, DstRotMiscVarTypeData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyRotInputType(SrcRotMiscVarTypeData%u_perturb, DstRotMiscVarTypeData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyRotOutputType(SrcRotMiscVarTypeData%y_lin, DstRotMiscVarTypeData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyRotConstraintStateType(SrcRotMiscVarTypeData%z_lin, DstRotMiscVarTypeData%z_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyRotOtherStateType(SrcRotMiscVarTypeData%OtherState_init, DstRotMiscVarTypeData%OtherState_init, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyRotOtherStateType(SrcRotMiscVarTypeData%OtherState_jac, DstRotMiscVarTypeData%OtherState_jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call BEMT_CopyMisc(SrcRotMiscVarTypeData%BEMT, DstRotMiscVarTypeData%BEMT, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call BEMT_CopyOutput(SrcRotMiscVarTypeData%BEMT_y, DstRotMiscVarTypeData%BEMT_y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + LB(1:1) = lbound(SrcRotMiscVarTypeData%BEMT_u) + UB(1:1) = ubound(SrcRotMiscVarTypeData%BEMT_u) + do i1 = LB(1), UB(1) + call BEMT_CopyInput(SrcRotMiscVarTypeData%BEMT_u(i1), DstRotMiscVarTypeData%BEMT_u(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + call AA_CopyMisc(SrcRotMiscVarTypeData%AA, DstRotMiscVarTypeData%AA, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AA_CopyOutput(SrcRotMiscVarTypeData%AA_y, DstRotMiscVarTypeData%AA_y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AA_CopyInput(SrcRotMiscVarTypeData%AA_u, DstRotMiscVarTypeData%AA_u, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcRotMiscVarTypeData%DisturbedInflow)) then + LB(1:3) = lbound(SrcRotMiscVarTypeData%DisturbedInflow) + UB(1:3) = ubound(SrcRotMiscVarTypeData%DisturbedInflow) + if (.not. allocated(DstRotMiscVarTypeData%DisturbedInflow)) then + allocate(DstRotMiscVarTypeData%DisturbedInflow(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrDiam.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%DisturbedInflow.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%TwrDiam = SrcRotParameterTypeData%TwrDiam + DstRotMiscVarTypeData%DisturbedInflow = SrcRotMiscVarTypeData%DisturbedInflow end if - if (allocated(SrcRotParameterTypeData%TwrCd)) then - LB(1:1) = lbound(SrcRotParameterTypeData%TwrCd) - UB(1:1) = ubound(SrcRotParameterTypeData%TwrCd) - if (.not. allocated(DstRotParameterTypeData%TwrCd)) then - allocate(DstRotParameterTypeData%TwrCd(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%SectAvgInflow)) then + LB(1:3) = lbound(SrcRotMiscVarTypeData%SectAvgInflow) + UB(1:3) = ubound(SrcRotMiscVarTypeData%SectAvgInflow) + if (.not. allocated(DstRotMiscVarTypeData%SectAvgInflow)) then + allocate(DstRotMiscVarTypeData%SectAvgInflow(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrCd.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%SectAvgInflow.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%TwrCd = SrcRotParameterTypeData%TwrCd + DstRotMiscVarTypeData%SectAvgInflow = SrcRotMiscVarTypeData%SectAvgInflow end if - if (allocated(SrcRotParameterTypeData%TwrTI)) then - LB(1:1) = lbound(SrcRotParameterTypeData%TwrTI) - UB(1:1) = ubound(SrcRotParameterTypeData%TwrTI) - if (.not. allocated(DstRotParameterTypeData%TwrTI)) then - allocate(DstRotParameterTypeData%TwrTI(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%orientationAnnulus)) then + LB(1:4) = lbound(SrcRotMiscVarTypeData%orientationAnnulus) + UB(1:4) = ubound(SrcRotMiscVarTypeData%orientationAnnulus) + if (.not. allocated(DstRotMiscVarTypeData%orientationAnnulus)) then + allocate(DstRotMiscVarTypeData%orientationAnnulus(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrTI.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%orientationAnnulus.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%TwrTI = SrcRotParameterTypeData%TwrTI + DstRotMiscVarTypeData%orientationAnnulus = SrcRotMiscVarTypeData%orientationAnnulus end if - if (allocated(SrcRotParameterTypeData%BlTwist)) then - LB(1:2) = lbound(SrcRotParameterTypeData%BlTwist) - UB(1:2) = ubound(SrcRotParameterTypeData%BlTwist) - if (.not. allocated(DstRotParameterTypeData%BlTwist)) then - allocate(DstRotParameterTypeData%BlTwist(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%R_li)) then + LB(1:4) = lbound(SrcRotMiscVarTypeData%R_li) + UB(1:4) = ubound(SrcRotMiscVarTypeData%R_li) + if (.not. allocated(DstRotMiscVarTypeData%R_li)) then + allocate(DstRotMiscVarTypeData%R_li(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlTwist.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%R_li.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%BlTwist = SrcRotParameterTypeData%BlTwist + DstRotMiscVarTypeData%R_li = SrcRotMiscVarTypeData%R_li end if - if (allocated(SrcRotParameterTypeData%TwrCb)) then - LB(1:1) = lbound(SrcRotParameterTypeData%TwrCb) - UB(1:1) = ubound(SrcRotParameterTypeData%TwrCb) - if (.not. allocated(DstRotParameterTypeData%TwrCb)) then - allocate(DstRotParameterTypeData%TwrCb(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%AllOuts)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%AllOuts) + UB(1:1) = ubound(SrcRotMiscVarTypeData%AllOuts) + if (.not. allocated(DstRotMiscVarTypeData%AllOuts)) then + allocate(DstRotMiscVarTypeData%AllOuts(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrCb.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%AllOuts.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%TwrCb = SrcRotParameterTypeData%TwrCb + DstRotMiscVarTypeData%AllOuts = SrcRotMiscVarTypeData%AllOuts end if - if (allocated(SrcRotParameterTypeData%BlCenBn)) then - LB(1:2) = lbound(SrcRotParameterTypeData%BlCenBn) - UB(1:2) = ubound(SrcRotParameterTypeData%BlCenBn) - if (.not. allocated(DstRotParameterTypeData%BlCenBn)) then - allocate(DstRotParameterTypeData%BlCenBn(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%W_Twr)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%W_Twr) + UB(1:1) = ubound(SrcRotMiscVarTypeData%W_Twr) + if (.not. allocated(DstRotMiscVarTypeData%W_Twr)) then + allocate(DstRotMiscVarTypeData%W_Twr(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlCenBn.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%W_Twr.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%BlCenBn = SrcRotParameterTypeData%BlCenBn + DstRotMiscVarTypeData%W_Twr = SrcRotMiscVarTypeData%W_Twr end if - if (allocated(SrcRotParameterTypeData%BlCenBt)) then - LB(1:2) = lbound(SrcRotParameterTypeData%BlCenBt) - UB(1:2) = ubound(SrcRotParameterTypeData%BlCenBt) - if (.not. allocated(DstRotParameterTypeData%BlCenBt)) then - allocate(DstRotParameterTypeData%BlCenBt(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%X_Twr)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%X_Twr) + UB(1:1) = ubound(SrcRotMiscVarTypeData%X_Twr) + if (.not. allocated(DstRotMiscVarTypeData%X_Twr)) then + allocate(DstRotMiscVarTypeData%X_Twr(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlCenBt.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%X_Twr.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%BlCenBt = SrcRotParameterTypeData%BlCenBt + DstRotMiscVarTypeData%X_Twr = SrcRotMiscVarTypeData%X_Twr end if - DstRotParameterTypeData%VolHub = SrcRotParameterTypeData%VolHub - DstRotParameterTypeData%HubCenBx = SrcRotParameterTypeData%HubCenBx - DstRotParameterTypeData%VolNac = SrcRotParameterTypeData%VolNac - DstRotParameterTypeData%NacCenB = SrcRotParameterTypeData%NacCenB - DstRotParameterTypeData%NacArea = SrcRotParameterTypeData%NacArea - DstRotParameterTypeData%NacCd = SrcRotParameterTypeData%NacCd - DstRotParameterTypeData%NacDragAC = SrcRotParameterTypeData%NacDragAC - DstRotParameterTypeData%VolBl = SrcRotParameterTypeData%VolBl - DstRotParameterTypeData%VolTwr = SrcRotParameterTypeData%VolTwr - if (allocated(SrcRotParameterTypeData%BlRad)) then - LB(1:2) = lbound(SrcRotParameterTypeData%BlRad) - UB(1:2) = ubound(SrcRotParameterTypeData%BlRad) - if (.not. allocated(DstRotParameterTypeData%BlRad)) then - allocate(DstRotParameterTypeData%BlRad(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%Y_Twr)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%Y_Twr) + UB(1:1) = ubound(SrcRotMiscVarTypeData%Y_Twr) + if (.not. allocated(DstRotMiscVarTypeData%Y_Twr)) then + allocate(DstRotMiscVarTypeData%Y_Twr(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlRad.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Y_Twr.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%BlRad = SrcRotParameterTypeData%BlRad + DstRotMiscVarTypeData%Y_Twr = SrcRotMiscVarTypeData%Y_Twr end if - if (allocated(SrcRotParameterTypeData%BlDL)) then - LB(1:2) = lbound(SrcRotParameterTypeData%BlDL) - UB(1:2) = ubound(SrcRotParameterTypeData%BlDL) - if (.not. allocated(DstRotParameterTypeData%BlDL)) then - allocate(DstRotParameterTypeData%BlDL(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%Cant)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%Cant) + UB(1:2) = ubound(SrcRotMiscVarTypeData%Cant) + if (.not. allocated(DstRotMiscVarTypeData%Cant)) then + allocate(DstRotMiscVarTypeData%Cant(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlDL.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Cant.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%BlDL = SrcRotParameterTypeData%BlDL + DstRotMiscVarTypeData%Cant = SrcRotMiscVarTypeData%Cant end if - if (allocated(SrcRotParameterTypeData%BlTaper)) then - LB(1:2) = lbound(SrcRotParameterTypeData%BlTaper) - UB(1:2) = ubound(SrcRotParameterTypeData%BlTaper) - if (.not. allocated(DstRotParameterTypeData%BlTaper)) then - allocate(DstRotParameterTypeData%BlTaper(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%Toe)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%Toe) + UB(1:2) = ubound(SrcRotMiscVarTypeData%Toe) + if (.not. allocated(DstRotMiscVarTypeData%Toe)) then + allocate(DstRotMiscVarTypeData%Toe(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlTaper.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Toe.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%BlTaper = SrcRotParameterTypeData%BlTaper + DstRotMiscVarTypeData%Toe = SrcRotMiscVarTypeData%Toe end if - if (allocated(SrcRotParameterTypeData%BlAxCent)) then - LB(1:2) = lbound(SrcRotParameterTypeData%BlAxCent) - UB(1:2) = ubound(SrcRotParameterTypeData%BlAxCent) - if (.not. allocated(DstRotParameterTypeData%BlAxCent)) then - allocate(DstRotParameterTypeData%BlAxCent(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%TwrClrnc)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%TwrClrnc) + UB(1:2) = ubound(SrcRotMiscVarTypeData%TwrClrnc) + if (.not. allocated(DstRotMiscVarTypeData%TwrClrnc)) then + allocate(DstRotMiscVarTypeData%TwrClrnc(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BlAxCent.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%TwrClrnc.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%BlAxCent = SrcRotParameterTypeData%BlAxCent + DstRotMiscVarTypeData%TwrClrnc = SrcRotMiscVarTypeData%TwrClrnc end if - if (allocated(SrcRotParameterTypeData%TwrRad)) then - LB(1:1) = lbound(SrcRotParameterTypeData%TwrRad) - UB(1:1) = ubound(SrcRotParameterTypeData%TwrRad) - if (.not. allocated(DstRotParameterTypeData%TwrRad)) then - allocate(DstRotParameterTypeData%TwrRad(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%X)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%X) + UB(1:2) = ubound(SrcRotMiscVarTypeData%X) + if (.not. allocated(DstRotMiscVarTypeData%X)) then + allocate(DstRotMiscVarTypeData%X(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrRad.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%X.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%TwrRad = SrcRotParameterTypeData%TwrRad + DstRotMiscVarTypeData%X = SrcRotMiscVarTypeData%X end if - if (allocated(SrcRotParameterTypeData%TwrDL)) then - LB(1:1) = lbound(SrcRotParameterTypeData%TwrDL) - UB(1:1) = ubound(SrcRotParameterTypeData%TwrDL) - if (.not. allocated(DstRotParameterTypeData%TwrDL)) then - allocate(DstRotParameterTypeData%TwrDL(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%Y)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%Y) + UB(1:2) = ubound(SrcRotMiscVarTypeData%Y) + if (.not. allocated(DstRotMiscVarTypeData%Y)) then + allocate(DstRotMiscVarTypeData%Y(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrDL.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Y.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%TwrDL = SrcRotParameterTypeData%TwrDL + DstRotMiscVarTypeData%Y = SrcRotMiscVarTypeData%Y end if - if (allocated(SrcRotParameterTypeData%TwrTaper)) then - LB(1:1) = lbound(SrcRotParameterTypeData%TwrTaper) - UB(1:1) = ubound(SrcRotParameterTypeData%TwrTaper) - if (.not. allocated(DstRotParameterTypeData%TwrTaper)) then - allocate(DstRotParameterTypeData%TwrTaper(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%Z)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%Z) + UB(1:2) = ubound(SrcRotMiscVarTypeData%Z) + if (.not. allocated(DstRotMiscVarTypeData%Z)) then + allocate(DstRotMiscVarTypeData%Z(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrTaper.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Z.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%TwrTaper = SrcRotParameterTypeData%TwrTaper + DstRotMiscVarTypeData%Z = SrcRotMiscVarTypeData%Z end if - if (allocated(SrcRotParameterTypeData%TwrAxCent)) then - LB(1:1) = lbound(SrcRotParameterTypeData%TwrAxCent) - UB(1:1) = ubound(SrcRotParameterTypeData%TwrAxCent) - if (.not. allocated(DstRotParameterTypeData%TwrAxCent)) then - allocate(DstRotParameterTypeData%TwrAxCent(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%M)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%M) + UB(1:2) = ubound(SrcRotMiscVarTypeData%M) + if (.not. allocated(DstRotMiscVarTypeData%M)) then + allocate(DstRotMiscVarTypeData%M(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%TwrAxCent.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%M.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%TwrAxCent = SrcRotParameterTypeData%TwrAxCent + DstRotMiscVarTypeData%M = SrcRotMiscVarTypeData%M end if - call BEMT_CopyParam(SrcRotParameterTypeData%BEMT, DstRotParameterTypeData%BEMT, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call AA_CopyParam(SrcRotParameterTypeData%AA, DstRotParameterTypeData%AA, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcRotParameterTypeData%Jac_u_indx)) then - LB(1:2) = lbound(SrcRotParameterTypeData%Jac_u_indx) - UB(1:2) = ubound(SrcRotParameterTypeData%Jac_u_indx) - if (.not. allocated(DstRotParameterTypeData%Jac_u_indx)) then - allocate(DstRotParameterTypeData%Jac_u_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%Mx)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%Mx) + UB(1:2) = ubound(SrcRotMiscVarTypeData%Mx) + if (.not. allocated(DstRotMiscVarTypeData%Mx)) then + allocate(DstRotMiscVarTypeData%Mx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%Jac_u_indx.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Mx.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%Jac_u_indx = SrcRotParameterTypeData%Jac_u_indx + DstRotMiscVarTypeData%Mx = SrcRotMiscVarTypeData%Mx end if - call AD_CopyJac_u_idxStarts(SrcRotParameterTypeData%Jac_u_idxStartList, DstRotParameterTypeData%Jac_u_idxStartList, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call AD_CopyJac_y_idxStarts(SrcRotParameterTypeData%Jac_y_idxStartList, DstRotParameterTypeData%Jac_y_idxStartList, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstRotParameterTypeData%NumExtendedInputs = SrcRotParameterTypeData%NumExtendedInputs - if (allocated(SrcRotParameterTypeData%du)) then - LB(1:1) = lbound(SrcRotParameterTypeData%du) - UB(1:1) = ubound(SrcRotParameterTypeData%du) - if (.not. allocated(DstRotParameterTypeData%du)) then - allocate(DstRotParameterTypeData%du(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%My)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%My) + UB(1:2) = ubound(SrcRotMiscVarTypeData%My) + if (.not. allocated(DstRotMiscVarTypeData%My)) then + allocate(DstRotMiscVarTypeData%My(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%du.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%My.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%du = SrcRotParameterTypeData%du + DstRotMiscVarTypeData%My = SrcRotMiscVarTypeData%My end if - if (allocated(SrcRotParameterTypeData%dx)) then - LB(1:1) = lbound(SrcRotParameterTypeData%dx) - UB(1:1) = ubound(SrcRotParameterTypeData%dx) - if (.not. allocated(DstRotParameterTypeData%dx)) then - allocate(DstRotParameterTypeData%dx(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%Mz)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%Mz) + UB(1:2) = ubound(SrcRotMiscVarTypeData%Mz) + if (.not. allocated(DstRotMiscVarTypeData%Mz)) then + allocate(DstRotMiscVarTypeData%Mz(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%dx.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Mz.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%dx = SrcRotParameterTypeData%dx + DstRotMiscVarTypeData%Mz = SrcRotMiscVarTypeData%Mz end if - DstRotParameterTypeData%Jac_ny = SrcRotParameterTypeData%Jac_ny - DstRotParameterTypeData%NumBl_Lin = SrcRotParameterTypeData%NumBl_Lin - DstRotParameterTypeData%TwrPotent = SrcRotParameterTypeData%TwrPotent - DstRotParameterTypeData%TwrShadow = SrcRotParameterTypeData%TwrShadow - DstRotParameterTypeData%TwrAero = SrcRotParameterTypeData%TwrAero - DstRotParameterTypeData%DBEMT_Mod = SrcRotParameterTypeData%DBEMT_Mod - DstRotParameterTypeData%CavitCheck = SrcRotParameterTypeData%CavitCheck - DstRotParameterTypeData%Buoyancy = SrcRotParameterTypeData%Buoyancy - DstRotParameterTypeData%NacelleDrag = SrcRotParameterTypeData%NacelleDrag - DstRotParameterTypeData%MHK = SrcRotParameterTypeData%MHK - DstRotParameterTypeData%CompAA = SrcRotParameterTypeData%CompAA - DstRotParameterTypeData%AirDens = SrcRotParameterTypeData%AirDens - DstRotParameterTypeData%KinVisc = SrcRotParameterTypeData%KinVisc - DstRotParameterTypeData%SpdSound = SrcRotParameterTypeData%SpdSound - DstRotParameterTypeData%Gravity = SrcRotParameterTypeData%Gravity - DstRotParameterTypeData%Patm = SrcRotParameterTypeData%Patm - DstRotParameterTypeData%Pvap = SrcRotParameterTypeData%Pvap - DstRotParameterTypeData%WtrDpth = SrcRotParameterTypeData%WtrDpth - DstRotParameterTypeData%MSL2SWL = SrcRotParameterTypeData%MSL2SWL - DstRotParameterTypeData%AeroProjMod = SrcRotParameterTypeData%AeroProjMod - DstRotParameterTypeData%BEM_Mod = SrcRotParameterTypeData%BEM_Mod - DstRotParameterTypeData%NumOuts = SrcRotParameterTypeData%NumOuts - DstRotParameterTypeData%RootName = SrcRotParameterTypeData%RootName - if (allocated(SrcRotParameterTypeData%OutParam)) then - LB(1:1) = lbound(SrcRotParameterTypeData%OutParam) - UB(1:1) = ubound(SrcRotParameterTypeData%OutParam) - if (.not. allocated(DstRotParameterTypeData%OutParam)) then - allocate(DstRotParameterTypeData%OutParam(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%Vind_i)) then + LB(1:3) = lbound(SrcRotMiscVarTypeData%Vind_i) + UB(1:3) = ubound(SrcRotMiscVarTypeData%Vind_i) + if (.not. allocated(DstRotMiscVarTypeData%Vind_i)) then + allocate(DstRotMiscVarTypeData%Vind_i(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%OutParam.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%Vind_i.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call NWTC_Library_CopyOutParmType(SrcRotParameterTypeData%OutParam(i1), DstRotParameterTypeData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstRotMiscVarTypeData%Vind_i = SrcRotMiscVarTypeData%Vind_i end if - DstRotParameterTypeData%NBlOuts = SrcRotParameterTypeData%NBlOuts - DstRotParameterTypeData%BlOutNd = SrcRotParameterTypeData%BlOutNd - DstRotParameterTypeData%NTwOuts = SrcRotParameterTypeData%NTwOuts - DstRotParameterTypeData%TwOutNd = SrcRotParameterTypeData%TwOutNd - DstRotParameterTypeData%BldNd_NumOuts = SrcRotParameterTypeData%BldNd_NumOuts - DstRotParameterTypeData%BldNd_TotNumOuts = SrcRotParameterTypeData%BldNd_TotNumOuts - if (allocated(SrcRotParameterTypeData%BldNd_OutParam)) then - LB(1:1) = lbound(SrcRotParameterTypeData%BldNd_OutParam) - UB(1:1) = ubound(SrcRotParameterTypeData%BldNd_OutParam) - if (.not. allocated(DstRotParameterTypeData%BldNd_OutParam)) then - allocate(DstRotParameterTypeData%BldNd_OutParam(LB(1):UB(1)), stat=ErrStat2) + DstRotMiscVarTypeData%V_DiskAvg = SrcRotMiscVarTypeData%V_DiskAvg + DstRotMiscVarTypeData%yaw = SrcRotMiscVarTypeData%yaw + DstRotMiscVarTypeData%tilt = SrcRotMiscVarTypeData%tilt + if (allocated(SrcRotMiscVarTypeData%hub_theta_x_root)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%hub_theta_x_root) + UB(1:1) = ubound(SrcRotMiscVarTypeData%hub_theta_x_root) + if (.not. allocated(DstRotMiscVarTypeData%hub_theta_x_root)) then + allocate(DstRotMiscVarTypeData%hub_theta_x_root(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BldNd_OutParam.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%hub_theta_x_root.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%hub_theta_x_root = SrcRotMiscVarTypeData%hub_theta_x_root + end if + DstRotMiscVarTypeData%V_dot_x = SrcRotMiscVarTypeData%V_dot_x + call MeshCopy(SrcRotMiscVarTypeData%HubLoad, DstRotMiscVarTypeData%HubLoad, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcRotMiscVarTypeData%B_L_2_H_P)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%B_L_2_H_P) + UB(1:1) = ubound(SrcRotMiscVarTypeData%B_L_2_H_P) + if (.not. allocated(DstRotMiscVarTypeData%B_L_2_H_P)) then + allocate(DstRotMiscVarTypeData%B_L_2_H_P(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%B_L_2_H_P.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyOutParmType(SrcRotParameterTypeData%BldNd_OutParam(i1), DstRotParameterTypeData%BldNd_OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) + call NWTC_Library_CopyMeshMapType(SrcRotMiscVarTypeData%B_L_2_H_P(i1), DstRotMiscVarTypeData%B_L_2_H_P(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcRotParameterTypeData%BldNd_BlOutNd)) then - LB(1:1) = lbound(SrcRotParameterTypeData%BldNd_BlOutNd) - UB(1:1) = ubound(SrcRotParameterTypeData%BldNd_BlOutNd) - if (.not. allocated(DstRotParameterTypeData%BldNd_BlOutNd)) then - allocate(DstRotParameterTypeData%BldNd_BlOutNd(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%SigmaCavitCrit)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%SigmaCavitCrit) + UB(1:2) = ubound(SrcRotMiscVarTypeData%SigmaCavitCrit) + if (.not. allocated(DstRotMiscVarTypeData%SigmaCavitCrit)) then + allocate(DstRotMiscVarTypeData%SigmaCavitCrit(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotParameterTypeData%BldNd_BlOutNd.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%SigmaCavitCrit.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotParameterTypeData%BldNd_BlOutNd = SrcRotParameterTypeData%BldNd_BlOutNd + DstRotMiscVarTypeData%SigmaCavitCrit = SrcRotMiscVarTypeData%SigmaCavitCrit end if - DstRotParameterTypeData%BldNd_BladesOut = SrcRotParameterTypeData%BldNd_BladesOut - DstRotParameterTypeData%BldNd_NumNodesOut = SrcRotParameterTypeData%BldNd_NumNodesOut - DstRotParameterTypeData%TFinAero = SrcRotParameterTypeData%TFinAero - call AD_CopyTFinParameterType(SrcRotParameterTypeData%TFin, DstRotParameterTypeData%TFin, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return -end subroutine - -subroutine AD_DestroyRotParameterType(RotParameterTypeData, ErrStat, ErrMsg) - type(RotParameterType), intent(inout) :: RotParameterTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyRotParameterType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(RotParameterTypeData%TwrDiam)) then - deallocate(RotParameterTypeData%TwrDiam) + if (allocated(SrcRotMiscVarTypeData%SigmaCavit)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%SigmaCavit) + UB(1:2) = ubound(SrcRotMiscVarTypeData%SigmaCavit) + if (.not. allocated(DstRotMiscVarTypeData%SigmaCavit)) then + allocate(DstRotMiscVarTypeData%SigmaCavit(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%SigmaCavit.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%SigmaCavit = SrcRotMiscVarTypeData%SigmaCavit end if - if (allocated(RotParameterTypeData%TwrCd)) then - deallocate(RotParameterTypeData%TwrCd) + if (allocated(SrcRotMiscVarTypeData%CavitWarnSet)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%CavitWarnSet) + UB(1:2) = ubound(SrcRotMiscVarTypeData%CavitWarnSet) + if (.not. allocated(DstRotMiscVarTypeData%CavitWarnSet)) then + allocate(DstRotMiscVarTypeData%CavitWarnSet(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%CavitWarnSet.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%CavitWarnSet = SrcRotMiscVarTypeData%CavitWarnSet end if - if (allocated(RotParameterTypeData%TwrTI)) then - deallocate(RotParameterTypeData%TwrTI) - end if - if (allocated(RotParameterTypeData%BlTwist)) then - deallocate(RotParameterTypeData%BlTwist) - end if - if (allocated(RotParameterTypeData%TwrCb)) then - deallocate(RotParameterTypeData%TwrCb) - end if - if (allocated(RotParameterTypeData%BlCenBn)) then - deallocate(RotParameterTypeData%BlCenBn) - end if - if (allocated(RotParameterTypeData%BlCenBt)) then - deallocate(RotParameterTypeData%BlCenBt) - end if - if (allocated(RotParameterTypeData%BlRad)) then - deallocate(RotParameterTypeData%BlRad) - end if - if (allocated(RotParameterTypeData%BlDL)) then - deallocate(RotParameterTypeData%BlDL) - end if - if (allocated(RotParameterTypeData%BlTaper)) then - deallocate(RotParameterTypeData%BlTaper) - end if - if (allocated(RotParameterTypeData%BlAxCent)) then - deallocate(RotParameterTypeData%BlAxCent) - end if - if (allocated(RotParameterTypeData%TwrRad)) then - deallocate(RotParameterTypeData%TwrRad) - end if - if (allocated(RotParameterTypeData%TwrDL)) then - deallocate(RotParameterTypeData%TwrDL) - end if - if (allocated(RotParameterTypeData%TwrTaper)) then - deallocate(RotParameterTypeData%TwrTaper) - end if - if (allocated(RotParameterTypeData%TwrAxCent)) then - deallocate(RotParameterTypeData%TwrAxCent) - end if - call BEMT_DestroyParam(RotParameterTypeData%BEMT, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AA_DestroyParam(RotParameterTypeData%AA, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(RotParameterTypeData%Jac_u_indx)) then - deallocate(RotParameterTypeData%Jac_u_indx) - end if - call AD_DestroyJac_u_idxStarts(RotParameterTypeData%Jac_u_idxStartList, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AD_DestroyJac_y_idxStarts(RotParameterTypeData%Jac_y_idxStartList, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(RotParameterTypeData%du)) then - deallocate(RotParameterTypeData%du) - end if - if (allocated(RotParameterTypeData%dx)) then - deallocate(RotParameterTypeData%dx) - end if - if (allocated(RotParameterTypeData%OutParam)) then - LB(1:1) = lbound(RotParameterTypeData%OutParam) - UB(1:1) = ubound(RotParameterTypeData%OutParam) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyOutParmType(RotParameterTypeData%OutParam(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(RotParameterTypeData%OutParam) - end if - if (allocated(RotParameterTypeData%BldNd_OutParam)) then - LB(1:1) = lbound(RotParameterTypeData%BldNd_OutParam) - UB(1:1) = ubound(RotParameterTypeData%BldNd_OutParam) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyOutParmType(RotParameterTypeData%BldNd_OutParam(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(RotParameterTypeData%BldNd_OutParam) + if (allocated(SrcRotMiscVarTypeData%TwrFB)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%TwrFB) + UB(1:2) = ubound(SrcRotMiscVarTypeData%TwrFB) + if (.not. allocated(DstRotMiscVarTypeData%TwrFB)) then + allocate(DstRotMiscVarTypeData%TwrFB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%TwrFB.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%TwrFB = SrcRotMiscVarTypeData%TwrFB end if - if (allocated(RotParameterTypeData%BldNd_BlOutNd)) then - deallocate(RotParameterTypeData%BldNd_BlOutNd) + if (allocated(SrcRotMiscVarTypeData%TwrMB)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%TwrMB) + UB(1:2) = ubound(SrcRotMiscVarTypeData%TwrMB) + if (.not. allocated(DstRotMiscVarTypeData%TwrMB)) then + allocate(DstRotMiscVarTypeData%TwrMB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%TwrMB.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%TwrMB = SrcRotMiscVarTypeData%TwrMB end if - call AD_DestroyTFinParameterType(RotParameterTypeData%TFin, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) -end subroutine - -subroutine AD_PackRotParameterType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(RotParameterType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackRotParameterType' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%NumBlades) - call RegPack(RF, InData%NumBlNds) - call RegPack(RF, InData%NumTwrNds) - call RegPackAlloc(RF, InData%TwrDiam) - call RegPackAlloc(RF, InData%TwrCd) - call RegPackAlloc(RF, InData%TwrTI) - call RegPackAlloc(RF, InData%BlTwist) - call RegPackAlloc(RF, InData%TwrCb) - call RegPackAlloc(RF, InData%BlCenBn) - call RegPackAlloc(RF, InData%BlCenBt) - call RegPack(RF, InData%VolHub) - call RegPack(RF, InData%HubCenBx) - call RegPack(RF, InData%VolNac) - call RegPack(RF, InData%NacCenB) - call RegPack(RF, InData%NacArea) - call RegPack(RF, InData%NacCd) - call RegPack(RF, InData%NacDragAC) - call RegPack(RF, InData%VolBl) - call RegPack(RF, InData%VolTwr) - call RegPackAlloc(RF, InData%BlRad) - call RegPackAlloc(RF, InData%BlDL) - call RegPackAlloc(RF, InData%BlTaper) - call RegPackAlloc(RF, InData%BlAxCent) - call RegPackAlloc(RF, InData%TwrRad) - call RegPackAlloc(RF, InData%TwrDL) - call RegPackAlloc(RF, InData%TwrTaper) - call RegPackAlloc(RF, InData%TwrAxCent) - call BEMT_PackParam(RF, InData%BEMT) - call AA_PackParam(RF, InData%AA) - call RegPackAlloc(RF, InData%Jac_u_indx) - call AD_PackJac_u_idxStarts(RF, InData%Jac_u_idxStartList) - call AD_PackJac_y_idxStarts(RF, InData%Jac_y_idxStartList) - call RegPack(RF, InData%NumExtendedInputs) - call RegPackAlloc(RF, InData%du) - call RegPackAlloc(RF, InData%dx) - call RegPack(RF, InData%Jac_ny) - call RegPack(RF, InData%NumBl_Lin) - call RegPack(RF, InData%TwrPotent) - call RegPack(RF, InData%TwrShadow) - call RegPack(RF, InData%TwrAero) - call RegPack(RF, InData%DBEMT_Mod) - call RegPack(RF, InData%CavitCheck) - call RegPack(RF, InData%Buoyancy) - call RegPack(RF, InData%NacelleDrag) - call RegPack(RF, InData%MHK) - call RegPack(RF, InData%CompAA) - call RegPack(RF, InData%AirDens) - call RegPack(RF, InData%KinVisc) - call RegPack(RF, InData%SpdSound) - call RegPack(RF, InData%Gravity) - call RegPack(RF, InData%Patm) - call RegPack(RF, InData%Pvap) - call RegPack(RF, InData%WtrDpth) - call RegPack(RF, InData%MSL2SWL) - call RegPack(RF, InData%AeroProjMod) - call RegPack(RF, InData%BEM_Mod) - call RegPack(RF, InData%NumOuts) - call RegPack(RF, InData%RootName) - call RegPack(RF, allocated(InData%OutParam)) - if (allocated(InData%OutParam)) then - call RegPackBounds(RF, 1, lbound(InData%OutParam), ubound(InData%OutParam)) - LB(1:1) = lbound(InData%OutParam) - UB(1:1) = ubound(InData%OutParam) - do i1 = LB(1), UB(1) - call NWTC_Library_PackOutParmType(RF, InData%OutParam(i1)) - end do + if (allocated(SrcRotMiscVarTypeData%HubFB)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%HubFB) + UB(1:1) = ubound(SrcRotMiscVarTypeData%HubFB) + if (.not. allocated(DstRotMiscVarTypeData%HubFB)) then + allocate(DstRotMiscVarTypeData%HubFB(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%HubFB.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%HubFB = SrcRotMiscVarTypeData%HubFB end if - call RegPack(RF, InData%NBlOuts) - call RegPack(RF, InData%BlOutNd) - call RegPack(RF, InData%NTwOuts) - call RegPack(RF, InData%TwOutNd) - call RegPack(RF, InData%BldNd_NumOuts) - call RegPack(RF, InData%BldNd_TotNumOuts) - call RegPack(RF, allocated(InData%BldNd_OutParam)) - if (allocated(InData%BldNd_OutParam)) then - call RegPackBounds(RF, 1, lbound(InData%BldNd_OutParam), ubound(InData%BldNd_OutParam)) - LB(1:1) = lbound(InData%BldNd_OutParam) - UB(1:1) = ubound(InData%BldNd_OutParam) - do i1 = LB(1), UB(1) - call NWTC_Library_PackOutParmType(RF, InData%BldNd_OutParam(i1)) - end do + if (allocated(SrcRotMiscVarTypeData%HubMB)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%HubMB) + UB(1:1) = ubound(SrcRotMiscVarTypeData%HubMB) + if (.not. allocated(DstRotMiscVarTypeData%HubMB)) then + allocate(DstRotMiscVarTypeData%HubMB(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%HubMB.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%HubMB = SrcRotMiscVarTypeData%HubMB end if - call RegPackAlloc(RF, InData%BldNd_BlOutNd) - call RegPack(RF, InData%BldNd_BladesOut) - call RegPack(RF, InData%BldNd_NumNodesOut) - call RegPack(RF, InData%TFinAero) - call AD_PackTFinParameterType(RF, InData%TFin) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_UnPackRotParameterType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(RotParameterType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackRotParameterType' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%NumBlades); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumBlNds); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumTwrNds); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrDiam); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrCd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrTI); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlTwist); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrCb); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlCenBn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlCenBt); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VolHub); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HubCenBx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VolNac); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NacCenB); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NacArea); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NacCd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NacDragAC); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VolBl); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VolTwr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlRad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlDL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlTaper); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlAxCent); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrRad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrDL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrTaper); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TwrAxCent); if (RegCheckErr(RF, RoutineName)) return - call BEMT_UnpackParam(RF, OutData%BEMT) ! BEMT - call AA_UnpackParam(RF, OutData%AA) ! AA - call RegUnpackAlloc(RF, OutData%Jac_u_indx); if (RegCheckErr(RF, RoutineName)) return - call AD_UnpackJac_u_idxStarts(RF, OutData%Jac_u_idxStartList) ! Jac_u_idxStartList - call AD_UnpackJac_y_idxStarts(RF, OutData%Jac_y_idxStartList) ! Jac_y_idxStartList - call RegUnpack(RF, OutData%NumExtendedInputs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumBl_Lin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TwrPotent); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TwrShadow); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TwrAero); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%DBEMT_Mod); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%CavitCheck); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Buoyancy); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NacelleDrag); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%MHK); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%CompAA); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%KinVisc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SpdSound); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Gravity); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Patm); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Pvap); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%MSL2SWL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AeroProjMod); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BEM_Mod); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%OutParam)) deallocate(OutData%OutParam) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OutParam(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcRotMiscVarTypeData%NacFB)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacFB) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacFB) + if (.not. allocated(DstRotMiscVarTypeData%NacFB)) then + allocate(DstRotMiscVarTypeData%NacFB(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacFB.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackOutParmType(RF, OutData%OutParam(i1)) ! OutParam - end do + DstRotMiscVarTypeData%NacFB = SrcRotMiscVarTypeData%NacFB end if - call RegUnpack(RF, OutData%NBlOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BlOutNd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NTwOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TwOutNd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BldNd_NumOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BldNd_TotNumOuts); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%BldNd_OutParam)) deallocate(OutData%BldNd_OutParam) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BldNd_OutParam(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BldNd_OutParam.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcRotMiscVarTypeData%NacMB)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacMB) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacMB) + if (.not. allocated(DstRotMiscVarTypeData%NacMB)) then + allocate(DstRotMiscVarTypeData%NacMB(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacMB.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackOutParmType(RF, OutData%BldNd_OutParam(i1)) ! BldNd_OutParam - end do + DstRotMiscVarTypeData%NacMB = SrcRotMiscVarTypeData%NacMB end if - call RegUnpackAlloc(RF, OutData%BldNd_BlOutNd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BldNd_BladesOut); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BldNd_NumNodesOut); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinAero); if (RegCheckErr(RF, RoutineName)) return - call AD_UnpackTFinParameterType(RF, OutData%TFin) ! TFin -end subroutine - -subroutine AD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) - type(AD_ParameterType), intent(in) :: SrcParamData - type(AD_ParameterType), intent(inout) :: DstParamData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyParam' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcParamData%rotors)) then - LB(1:1) = lbound(SrcParamData%rotors) - UB(1:1) = ubound(SrcParamData%rotors) - if (.not. allocated(DstParamData%rotors)) then - allocate(DstParamData%rotors(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%NacDragF)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacDragF) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacDragF) + if (.not. allocated(DstRotMiscVarTypeData%NacDragF)) then + allocate(DstRotMiscVarTypeData%NacDragF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacDragF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%NacDragF = SrcRotMiscVarTypeData%NacDragF + end if + if (allocated(SrcRotMiscVarTypeData%NacDragM)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacDragM) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacDragM) + if (.not. allocated(DstRotMiscVarTypeData%NacDragM)) then + allocate(DstRotMiscVarTypeData%NacDragM(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%rotors.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacDragM.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call AD_CopyRotParameterType(SrcParamData%rotors(i1), DstParamData%rotors(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstRotMiscVarTypeData%NacDragM = SrcRotMiscVarTypeData%NacDragM end if - DstParamData%DT = SrcParamData%DT - DstParamData%RootName = SrcParamData%RootName - if (allocated(SrcParamData%AFI)) then - LB(1:1) = lbound(SrcParamData%AFI) - UB(1:1) = ubound(SrcParamData%AFI) - if (.not. allocated(DstParamData%AFI)) then - allocate(DstParamData%AFI(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%NacFi)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacFi) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacFi) + if (.not. allocated(DstRotMiscVarTypeData%NacFi)) then + allocate(DstRotMiscVarTypeData%NacFi(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AFI.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacFi.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call AFI_CopyParam(SrcParamData%AFI(i1), DstParamData%AFI(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - DstParamData%Skew_Mod = SrcParamData%Skew_Mod - DstParamData%Wake_Mod = SrcParamData%Wake_Mod - call FVW_CopyParam(SrcParamData%FVW, DstParamData%FVW, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstParamData%CompAeroMaps = SrcParamData%CompAeroMaps - DstParamData%UA_Flag = SrcParamData%UA_Flag - DstParamData%FlowField => SrcParamData%FlowField - DstParamData%SectAvg = SrcParamData%SectAvg - DstParamData%SA_Weighting = SrcParamData%SA_Weighting - DstParamData%SA_PsiBwd = SrcParamData%SA_PsiBwd - DstParamData%SA_PsiFwd = SrcParamData%SA_PsiFwd - DstParamData%SA_nPerSec = SrcParamData%SA_nPerSec -end subroutine - -subroutine AD_DestroyParam(ParamData, ErrStat, ErrMsg) - type(AD_ParameterType), intent(inout) :: ParamData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyParam' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(ParamData%rotors)) then - LB(1:1) = lbound(ParamData%rotors) - UB(1:1) = ubound(ParamData%rotors) - do i1 = LB(1), UB(1) - call AD_DestroyRotParameterType(ParamData%rotors(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ParamData%rotors) + DstRotMiscVarTypeData%NacFi = SrcRotMiscVarTypeData%NacFi end if - if (allocated(ParamData%AFI)) then - LB(1:1) = lbound(ParamData%AFI) - UB(1:1) = ubound(ParamData%AFI) - do i1 = LB(1), UB(1) - call AFI_DestroyParam(ParamData%AFI(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ParamData%AFI) + if (allocated(SrcRotMiscVarTypeData%NacMi)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacMi) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacMi) + if (.not. allocated(DstRotMiscVarTypeData%NacMi)) then + allocate(DstRotMiscVarTypeData%NacMi(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacMi.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%NacMi = SrcRotMiscVarTypeData%NacMi end if - call FVW_DestroyParam(ParamData%FVW, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - nullify(ParamData%FlowField) -end subroutine - -subroutine AD_PackParam(RF, Indata) - type(RegFile), intent(inout) :: RF - type(AD_ParameterType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackParam' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - logical :: PtrInIndex - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%rotors)) - if (allocated(InData%rotors)) then - call RegPackBounds(RF, 1, lbound(InData%rotors), ubound(InData%rotors)) - LB(1:1) = lbound(InData%rotors) - UB(1:1) = ubound(InData%rotors) - do i1 = LB(1), UB(1) - call AD_PackRotParameterType(RF, InData%rotors(i1)) - end do + if (allocated(SrcRotMiscVarTypeData%BlFI)) then + LB(1:3) = lbound(SrcRotMiscVarTypeData%BlFI) + UB(1:3) = ubound(SrcRotMiscVarTypeData%BlFI) + if (.not. allocated(DstRotMiscVarTypeData%BlFI)) then + allocate(DstRotMiscVarTypeData%BlFI(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%BlFI.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%BlFI = SrcRotMiscVarTypeData%BlFI end if - call RegPack(RF, InData%DT) - call RegPack(RF, InData%RootName) - call RegPack(RF, allocated(InData%AFI)) - if (allocated(InData%AFI)) then - call RegPackBounds(RF, 1, lbound(InData%AFI), ubound(InData%AFI)) - LB(1:1) = lbound(InData%AFI) - UB(1:1) = ubound(InData%AFI) - do i1 = LB(1), UB(1) - call AFI_PackParam(RF, InData%AFI(i1)) - end do + if (allocated(SrcRotMiscVarTypeData%BlFA)) then + LB(1:3) = lbound(SrcRotMiscVarTypeData%BlFA) + UB(1:3) = ubound(SrcRotMiscVarTypeData%BlFA) + if (.not. allocated(DstRotMiscVarTypeData%BlFA)) then + allocate(DstRotMiscVarTypeData%BlFA(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%BlFA.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%BlFA = SrcRotMiscVarTypeData%BlFA end if - call RegPack(RF, InData%Skew_Mod) - call RegPack(RF, InData%Wake_Mod) - call FVW_PackParam(RF, InData%FVW) - call RegPack(RF, InData%CompAeroMaps) - call RegPack(RF, InData%UA_Flag) - call RegPack(RF, associated(InData%FlowField)) - if (associated(InData%FlowField)) then - call RegPackPointer(RF, c_loc(InData%FlowField), PtrInIndex) - if (.not. PtrInIndex) then - call IfW_FlowField_PackFlowFieldType(RF, InData%FlowField) + if (allocated(SrcRotMiscVarTypeData%BlMA)) then + LB(1:3) = lbound(SrcRotMiscVarTypeData%BlMA) + UB(1:3) = ubound(SrcRotMiscVarTypeData%BlMA) + if (.not. allocated(DstRotMiscVarTypeData%BlMA)) then + allocate(DstRotMiscVarTypeData%BlMA(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%BlMA.', ErrStat, ErrMsg, RoutineName) + return + end if end if + DstRotMiscVarTypeData%BlMA = SrcRotMiscVarTypeData%BlMA end if - call RegPack(RF, InData%SectAvg) - call RegPack(RF, InData%SA_Weighting) - call RegPack(RF, InData%SA_PsiBwd) - call RegPack(RF, InData%SA_PsiFwd) - call RegPack(RF, InData%SA_nPerSec) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_UnPackParam(RF, OutData) - type(RegFile), intent(inout) :: RF - type(AD_ParameterType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackParam' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - integer(B8Ki) :: PtrIdx - type(c_ptr) :: Ptr - if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%rotors)) deallocate(OutData%rotors) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%rotors(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%rotors.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcRotMiscVarTypeData%TwrFI)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%TwrFI) + UB(1:2) = ubound(SrcRotMiscVarTypeData%TwrFI) + if (.not. allocated(DstRotMiscVarTypeData%TwrFI)) then + allocate(DstRotMiscVarTypeData%TwrFI(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%TwrFI.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i1 = LB(1), UB(1) - call AD_UnpackRotParameterType(RF, OutData%rotors(i1)) ! rotors - end do + DstRotMiscVarTypeData%TwrFI = SrcRotMiscVarTypeData%TwrFI end if - call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%AFI)) deallocate(OutData%AFI) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%AFI(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%AFI.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcRotMiscVarTypeData%TwrFA)) then + LB(1:2) = lbound(SrcRotMiscVarTypeData%TwrFA) + UB(1:2) = ubound(SrcRotMiscVarTypeData%TwrFA) + if (.not. allocated(DstRotMiscVarTypeData%TwrFA)) then + allocate(DstRotMiscVarTypeData%TwrFA(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%TwrFA.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i1 = LB(1), UB(1) - call AFI_UnpackParam(RF, OutData%AFI(i1)) ! AFI - end do + DstRotMiscVarTypeData%TwrFA = SrcRotMiscVarTypeData%TwrFA end if - call RegUnpack(RF, OutData%Skew_Mod); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Wake_Mod); if (RegCheckErr(RF, RoutineName)) return - call FVW_UnpackParam(RF, OutData%FVW) ! FVW - call RegUnpack(RF, OutData%CompAeroMaps); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UA_Flag); if (RegCheckErr(RF, RoutineName)) return - if (associated(OutData%FlowField)) deallocate(OutData%FlowField) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackPointer(RF, Ptr, PtrIdx); if (RegCheckErr(RF, RoutineName)) return - if (c_associated(Ptr)) then - call c_f_pointer(Ptr, OutData%FlowField) - else - allocate(OutData%FlowField,stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%FlowField.', RF%ErrStat, RF%ErrMsg, RoutineName) + if (allocated(SrcRotMiscVarTypeData%BladeRootLoad)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%BladeRootLoad) + UB(1:1) = ubound(SrcRotMiscVarTypeData%BladeRootLoad) + if (.not. allocated(DstRotMiscVarTypeData%BladeRootLoad)) then + allocate(DstRotMiscVarTypeData%BladeRootLoad(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%BladeRootLoad.', ErrStat, ErrMsg, RoutineName) return end if - RF%Pointers(PtrIdx) = c_loc(OutData%FlowField) - call IfW_FlowField_UnpackFlowFieldType(RF, OutData%FlowField) ! FlowField end if - else - OutData%FlowField => null() + do i1 = LB(1), UB(1) + call MeshCopy(SrcRotMiscVarTypeData%BladeRootLoad(i1), DstRotMiscVarTypeData%BladeRootLoad(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - call RegUnpack(RF, OutData%SectAvg); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SA_Weighting); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SA_PsiBwd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SA_PsiFwd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SA_nPerSec); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_CopyRotInputType(SrcRotInputTypeData, DstRotInputTypeData, CtrlCode, ErrStat, ErrMsg) - type(RotInputType), intent(inout) :: SrcRotInputTypeData - type(RotInputType), intent(inout) :: DstRotInputTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyRotInputType' - ErrStat = ErrID_None - ErrMsg = '' - call MeshCopy(SrcRotInputTypeData%NacelleMotion, DstRotInputTypeData%NacelleMotion, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcRotInputTypeData%TowerMotion, DstRotInputTypeData%TowerMotion, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcRotInputTypeData%HubMotion, DstRotInputTypeData%HubMotion, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcRotInputTypeData%BladeRootMotion)) then - LB(1:1) = lbound(SrcRotInputTypeData%BladeRootMotion) - UB(1:1) = ubound(SrcRotInputTypeData%BladeRootMotion) - if (.not. allocated(DstRotInputTypeData%BladeRootMotion)) then - allocate(DstRotInputTypeData%BladeRootMotion(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%B_L_2_R_P)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%B_L_2_R_P) + UB(1:1) = ubound(SrcRotMiscVarTypeData%B_L_2_R_P) + if (.not. allocated(DstRotMiscVarTypeData%B_L_2_R_P)) then + allocate(DstRotMiscVarTypeData%B_L_2_R_P(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInputTypeData%BladeRootMotion.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%B_L_2_R_P.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcRotInputTypeData%BladeRootMotion(i1), DstRotInputTypeData%BladeRootMotion(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call NWTC_Library_CopyMeshMapType(SrcRotMiscVarTypeData%B_L_2_R_P(i1), DstRotMiscVarTypeData%B_L_2_R_P(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcRotInputTypeData%BladeMotion)) then - LB(1:1) = lbound(SrcRotInputTypeData%BladeMotion) - UB(1:1) = ubound(SrcRotInputTypeData%BladeMotion) - if (.not. allocated(DstRotInputTypeData%BladeMotion)) then - allocate(DstRotInputTypeData%BladeMotion(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%BladeBuoyLoadPoint)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%BladeBuoyLoadPoint) + UB(1:1) = ubound(SrcRotMiscVarTypeData%BladeBuoyLoadPoint) + if (.not. allocated(DstRotMiscVarTypeData%BladeBuoyLoadPoint)) then + allocate(DstRotMiscVarTypeData%BladeBuoyLoadPoint(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInputTypeData%BladeMotion.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%BladeBuoyLoadPoint.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcRotInputTypeData%BladeMotion(i1), DstRotInputTypeData%BladeMotion(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call MeshCopy(SrcRotMiscVarTypeData%BladeBuoyLoadPoint(i1), DstRotMiscVarTypeData%BladeBuoyLoadPoint(i1), CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call MeshCopy(SrcRotInputTypeData%TFinMotion, DstRotInputTypeData%TFinMotion, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcRotInputTypeData%UserProp)) then - LB(1:2) = lbound(SrcRotInputTypeData%UserProp) - UB(1:2) = ubound(SrcRotInputTypeData%UserProp) - if (.not. allocated(DstRotInputTypeData%UserProp)) then - allocate(DstRotInputTypeData%UserProp(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcRotMiscVarTypeData%BladeBuoyLoad)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%BladeBuoyLoad) + UB(1:1) = ubound(SrcRotMiscVarTypeData%BladeBuoyLoad) + if (.not. allocated(DstRotMiscVarTypeData%BladeBuoyLoad)) then + allocate(DstRotMiscVarTypeData%BladeBuoyLoad(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotInputTypeData%UserProp.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%BladeBuoyLoad.', ErrStat, ErrMsg, RoutineName) return end if end if - DstRotInputTypeData%UserProp = SrcRotInputTypeData%UserProp + do i1 = LB(1), UB(1) + call MeshCopy(SrcRotMiscVarTypeData%BladeBuoyLoad(i1), DstRotMiscVarTypeData%BladeBuoyLoad(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcRotMiscVarTypeData%B_P_2_B_L)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%B_P_2_B_L) + UB(1:1) = ubound(SrcRotMiscVarTypeData%B_P_2_B_L) + if (.not. allocated(DstRotMiscVarTypeData%B_P_2_B_L)) then + allocate(DstRotMiscVarTypeData%B_P_2_B_L(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%B_P_2_B_L.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call NWTC_Library_CopyMeshMapType(SrcRotMiscVarTypeData%B_P_2_B_L(i1), DstRotMiscVarTypeData%B_P_2_B_L(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if + call MeshCopy(SrcRotMiscVarTypeData%TwrBuoyLoadPoint, DstRotMiscVarTypeData%TwrBuoyLoadPoint, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcRotMiscVarTypeData%TwrBuoyLoad, DstRotMiscVarTypeData%TwrBuoyLoad, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyMeshMapType(SrcRotMiscVarTypeData%T_P_2_T_L, DstRotMiscVarTypeData%T_P_2_T_L, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstRotMiscVarTypeData%FirstWarn_TowerStrike = SrcRotMiscVarTypeData%FirstWarn_TowerStrike + DstRotMiscVarTypeData%AvgDiskVel = SrcRotMiscVarTypeData%AvgDiskVel + DstRotMiscVarTypeData%AvgDiskVelDist = SrcRotMiscVarTypeData%AvgDiskVelDist + DstRotMiscVarTypeData%TFinAlpha = SrcRotMiscVarTypeData%TFinAlpha + DstRotMiscVarTypeData%TFinRe = SrcRotMiscVarTypeData%TFinRe + DstRotMiscVarTypeData%TFinVrel = SrcRotMiscVarTypeData%TFinVrel + DstRotMiscVarTypeData%TFinVund_i = SrcRotMiscVarTypeData%TFinVund_i + DstRotMiscVarTypeData%TFinVind_i = SrcRotMiscVarTypeData%TFinVind_i + DstRotMiscVarTypeData%TFinVrel_i = SrcRotMiscVarTypeData%TFinVrel_i + DstRotMiscVarTypeData%TFinSTV_i = SrcRotMiscVarTypeData%TFinSTV_i + DstRotMiscVarTypeData%TFinF_i = SrcRotMiscVarTypeData%TFinF_i + DstRotMiscVarTypeData%TFinM_i = SrcRotMiscVarTypeData%TFinM_i end subroutine -subroutine AD_DestroyRotInputType(RotInputTypeData, ErrStat, ErrMsg) - type(RotInputType), intent(inout) :: RotInputTypeData +subroutine AD_DestroyRotMiscVarType(RotMiscVarTypeData, ErrStat, ErrMsg) + type(RotMiscVarType), intent(inout) :: RotMiscVarTypeData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1, i2, i3, i4 + integer(B4Ki) :: LB(4), UB(4) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyRotInputType' + character(*), parameter :: RoutineName = 'AD_DestroyRotMiscVarType' ErrStat = ErrID_None ErrMsg = '' - call MeshDestroy( RotInputTypeData%NacelleMotion, ErrStat2, ErrMsg2) + call NWTC_Library_DestroyModJacType(RotMiscVarTypeData%Jac, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( RotInputTypeData%TowerMotion, ErrStat2, ErrMsg2) + call AD_DestroyRotContinuousStateType(RotMiscVarTypeData%x_init, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( RotInputTypeData%HubMotion, ErrStat2, ErrMsg2) + call AD_DestroyRotContinuousStateType(RotMiscVarTypeData%x_perturb, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(RotInputTypeData%BladeRootMotion)) then - LB(1:1) = lbound(RotInputTypeData%BladeRootMotion) - UB(1:1) = ubound(RotInputTypeData%BladeRootMotion) + call AD_DestroyRotContinuousStateType(RotMiscVarTypeData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AD_DestroyRotInputType(RotMiscVarTypeData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AD_DestroyRotOutputType(RotMiscVarTypeData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AD_DestroyRotConstraintStateType(RotMiscVarTypeData%z_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AD_DestroyRotOtherStateType(RotMiscVarTypeData%OtherState_init, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AD_DestroyRotOtherStateType(RotMiscVarTypeData%OtherState_jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call BEMT_DestroyMisc(RotMiscVarTypeData%BEMT, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call BEMT_DestroyOutput(RotMiscVarTypeData%BEMT_y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + LB(1:1) = lbound(RotMiscVarTypeData%BEMT_u) + UB(1:1) = ubound(RotMiscVarTypeData%BEMT_u) + do i1 = LB(1), UB(1) + call BEMT_DestroyInput(RotMiscVarTypeData%BEMT_u(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + call AA_DestroyMisc(RotMiscVarTypeData%AA, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AA_DestroyOutput(RotMiscVarTypeData%AA_y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AA_DestroyInput(RotMiscVarTypeData%AA_u, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(RotMiscVarTypeData%DisturbedInflow)) then + deallocate(RotMiscVarTypeData%DisturbedInflow) + end if + if (allocated(RotMiscVarTypeData%SectAvgInflow)) then + deallocate(RotMiscVarTypeData%SectAvgInflow) + end if + if (allocated(RotMiscVarTypeData%orientationAnnulus)) then + deallocate(RotMiscVarTypeData%orientationAnnulus) + end if + if (allocated(RotMiscVarTypeData%R_li)) then + deallocate(RotMiscVarTypeData%R_li) + end if + if (allocated(RotMiscVarTypeData%AllOuts)) then + deallocate(RotMiscVarTypeData%AllOuts) + end if + if (allocated(RotMiscVarTypeData%W_Twr)) then + deallocate(RotMiscVarTypeData%W_Twr) + end if + if (allocated(RotMiscVarTypeData%X_Twr)) then + deallocate(RotMiscVarTypeData%X_Twr) + end if + if (allocated(RotMiscVarTypeData%Y_Twr)) then + deallocate(RotMiscVarTypeData%Y_Twr) + end if + if (allocated(RotMiscVarTypeData%Cant)) then + deallocate(RotMiscVarTypeData%Cant) + end if + if (allocated(RotMiscVarTypeData%Toe)) then + deallocate(RotMiscVarTypeData%Toe) + end if + if (allocated(RotMiscVarTypeData%TwrClrnc)) then + deallocate(RotMiscVarTypeData%TwrClrnc) + end if + if (allocated(RotMiscVarTypeData%X)) then + deallocate(RotMiscVarTypeData%X) + end if + if (allocated(RotMiscVarTypeData%Y)) then + deallocate(RotMiscVarTypeData%Y) + end if + if (allocated(RotMiscVarTypeData%Z)) then + deallocate(RotMiscVarTypeData%Z) + end if + if (allocated(RotMiscVarTypeData%M)) then + deallocate(RotMiscVarTypeData%M) + end if + if (allocated(RotMiscVarTypeData%Mx)) then + deallocate(RotMiscVarTypeData%Mx) + end if + if (allocated(RotMiscVarTypeData%My)) then + deallocate(RotMiscVarTypeData%My) + end if + if (allocated(RotMiscVarTypeData%Mz)) then + deallocate(RotMiscVarTypeData%Mz) + end if + if (allocated(RotMiscVarTypeData%Vind_i)) then + deallocate(RotMiscVarTypeData%Vind_i) + end if + if (allocated(RotMiscVarTypeData%hub_theta_x_root)) then + deallocate(RotMiscVarTypeData%hub_theta_x_root) + end if + call MeshDestroy( RotMiscVarTypeData%HubLoad, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(RotMiscVarTypeData%B_L_2_H_P)) then + LB(1:1) = lbound(RotMiscVarTypeData%B_L_2_H_P) + UB(1:1) = ubound(RotMiscVarTypeData%B_L_2_H_P) + do i1 = LB(1), UB(1) + call NWTC_Library_DestroyMeshMapType(RotMiscVarTypeData%B_L_2_H_P(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(RotMiscVarTypeData%B_L_2_H_P) + end if + if (allocated(RotMiscVarTypeData%SigmaCavitCrit)) then + deallocate(RotMiscVarTypeData%SigmaCavitCrit) + end if + if (allocated(RotMiscVarTypeData%SigmaCavit)) then + deallocate(RotMiscVarTypeData%SigmaCavit) + end if + if (allocated(RotMiscVarTypeData%CavitWarnSet)) then + deallocate(RotMiscVarTypeData%CavitWarnSet) + end if + if (allocated(RotMiscVarTypeData%TwrFB)) then + deallocate(RotMiscVarTypeData%TwrFB) + end if + if (allocated(RotMiscVarTypeData%TwrMB)) then + deallocate(RotMiscVarTypeData%TwrMB) + end if + if (allocated(RotMiscVarTypeData%HubFB)) then + deallocate(RotMiscVarTypeData%HubFB) + end if + if (allocated(RotMiscVarTypeData%HubMB)) then + deallocate(RotMiscVarTypeData%HubMB) + end if + if (allocated(RotMiscVarTypeData%NacFB)) then + deallocate(RotMiscVarTypeData%NacFB) + end if + if (allocated(RotMiscVarTypeData%NacMB)) then + deallocate(RotMiscVarTypeData%NacMB) + end if + if (allocated(RotMiscVarTypeData%NacDragF)) then + deallocate(RotMiscVarTypeData%NacDragF) + end if + if (allocated(RotMiscVarTypeData%NacDragM)) then + deallocate(RotMiscVarTypeData%NacDragM) + end if + if (allocated(RotMiscVarTypeData%NacFi)) then + deallocate(RotMiscVarTypeData%NacFi) + end if + if (allocated(RotMiscVarTypeData%NacMi)) then + deallocate(RotMiscVarTypeData%NacMi) + end if + if (allocated(RotMiscVarTypeData%BlFI)) then + deallocate(RotMiscVarTypeData%BlFI) + end if + if (allocated(RotMiscVarTypeData%BlFA)) then + deallocate(RotMiscVarTypeData%BlFA) + end if + if (allocated(RotMiscVarTypeData%BlMA)) then + deallocate(RotMiscVarTypeData%BlMA) + end if + if (allocated(RotMiscVarTypeData%TwrFI)) then + deallocate(RotMiscVarTypeData%TwrFI) + end if + if (allocated(RotMiscVarTypeData%TwrFA)) then + deallocate(RotMiscVarTypeData%TwrFA) + end if + if (allocated(RotMiscVarTypeData%BladeRootLoad)) then + LB(1:1) = lbound(RotMiscVarTypeData%BladeRootLoad) + UB(1:1) = ubound(RotMiscVarTypeData%BladeRootLoad) + do i1 = LB(1), UB(1) + call MeshDestroy( RotMiscVarTypeData%BladeRootLoad(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(RotMiscVarTypeData%BladeRootLoad) + end if + if (allocated(RotMiscVarTypeData%B_L_2_R_P)) then + LB(1:1) = lbound(RotMiscVarTypeData%B_L_2_R_P) + UB(1:1) = ubound(RotMiscVarTypeData%B_L_2_R_P) + do i1 = LB(1), UB(1) + call NWTC_Library_DestroyMeshMapType(RotMiscVarTypeData%B_L_2_R_P(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(RotMiscVarTypeData%B_L_2_R_P) + end if + if (allocated(RotMiscVarTypeData%BladeBuoyLoadPoint)) then + LB(1:1) = lbound(RotMiscVarTypeData%BladeBuoyLoadPoint) + UB(1:1) = ubound(RotMiscVarTypeData%BladeBuoyLoadPoint) + do i1 = LB(1), UB(1) + call MeshDestroy( RotMiscVarTypeData%BladeBuoyLoadPoint(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(RotMiscVarTypeData%BladeBuoyLoadPoint) + end if + if (allocated(RotMiscVarTypeData%BladeBuoyLoad)) then + LB(1:1) = lbound(RotMiscVarTypeData%BladeBuoyLoad) + UB(1:1) = ubound(RotMiscVarTypeData%BladeBuoyLoad) do i1 = LB(1), UB(1) - call MeshDestroy( RotInputTypeData%BladeRootMotion(i1), ErrStat2, ErrMsg2) + call MeshDestroy( RotMiscVarTypeData%BladeBuoyLoad(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(RotInputTypeData%BladeRootMotion) + deallocate(RotMiscVarTypeData%BladeBuoyLoad) end if - if (allocated(RotInputTypeData%BladeMotion)) then - LB(1:1) = lbound(RotInputTypeData%BladeMotion) - UB(1:1) = ubound(RotInputTypeData%BladeMotion) + if (allocated(RotMiscVarTypeData%B_P_2_B_L)) then + LB(1:1) = lbound(RotMiscVarTypeData%B_P_2_B_L) + UB(1:1) = ubound(RotMiscVarTypeData%B_P_2_B_L) do i1 = LB(1), UB(1) - call MeshDestroy( RotInputTypeData%BladeMotion(i1), ErrStat2, ErrMsg2) + call NWTC_Library_DestroyMeshMapType(RotMiscVarTypeData%B_P_2_B_L(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(RotInputTypeData%BladeMotion) + deallocate(RotMiscVarTypeData%B_P_2_B_L) end if - call MeshDestroy( RotInputTypeData%TFinMotion, ErrStat2, ErrMsg2) + call MeshDestroy( RotMiscVarTypeData%TwrBuoyLoadPoint, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( RotMiscVarTypeData%TwrBuoyLoad, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyMeshMapType(RotMiscVarTypeData%T_P_2_T_L, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(RotInputTypeData%UserProp)) then - deallocate(RotInputTypeData%UserProp) - end if end subroutine -subroutine AD_PackRotInputType(RF, Indata) +subroutine AD_PackRotMiscVarType(RF, Indata) type(RegFile), intent(inout) :: RF - type(RotInputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackRotInputType' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + type(RotMiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackRotMiscVarType' + integer(B4Ki) :: i1, i2, i3, i4 + integer(B4Ki) :: LB(4), UB(4) if (RF%ErrStat >= AbortErrLev) return - call MeshPack(RF, InData%NacelleMotion) - call MeshPack(RF, InData%TowerMotion) - call MeshPack(RF, InData%HubMotion) - call RegPack(RF, allocated(InData%BladeRootMotion)) - if (allocated(InData%BladeRootMotion)) then - call RegPackBounds(RF, 1, lbound(InData%BladeRootMotion), ubound(InData%BladeRootMotion)) - LB(1:1) = lbound(InData%BladeRootMotion) - UB(1:1) = ubound(InData%BladeRootMotion) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call AD_PackRotContinuousStateType(RF, InData%x_init) + call AD_PackRotContinuousStateType(RF, InData%x_perturb) + call AD_PackRotContinuousStateType(RF, InData%dxdt_lin) + call AD_PackRotInputType(RF, InData%u_perturb) + call AD_PackRotOutputType(RF, InData%y_lin) + call AD_PackRotConstraintStateType(RF, InData%z_lin) + call AD_PackRotOtherStateType(RF, InData%OtherState_init) + call AD_PackRotOtherStateType(RF, InData%OtherState_jac) + call BEMT_PackMisc(RF, InData%BEMT) + call BEMT_PackOutput(RF, InData%BEMT_y) + LB(1:1) = lbound(InData%BEMT_u) + UB(1:1) = ubound(InData%BEMT_u) + do i1 = LB(1), UB(1) + call BEMT_PackInput(RF, InData%BEMT_u(i1)) + end do + call AA_PackMisc(RF, InData%AA) + call AA_PackOutput(RF, InData%AA_y) + call AA_PackInput(RF, InData%AA_u) + call RegPackAlloc(RF, InData%DisturbedInflow) + call RegPackAlloc(RF, InData%SectAvgInflow) + call RegPackAlloc(RF, InData%orientationAnnulus) + call RegPackAlloc(RF, InData%R_li) + call RegPackAlloc(RF, InData%AllOuts) + call RegPackAlloc(RF, InData%W_Twr) + call RegPackAlloc(RF, InData%X_Twr) + call RegPackAlloc(RF, InData%Y_Twr) + call RegPackAlloc(RF, InData%Cant) + call RegPackAlloc(RF, InData%Toe) + call RegPackAlloc(RF, InData%TwrClrnc) + call RegPackAlloc(RF, InData%X) + call RegPackAlloc(RF, InData%Y) + call RegPackAlloc(RF, InData%Z) + call RegPackAlloc(RF, InData%M) + call RegPackAlloc(RF, InData%Mx) + call RegPackAlloc(RF, InData%My) + call RegPackAlloc(RF, InData%Mz) + call RegPackAlloc(RF, InData%Vind_i) + call RegPack(RF, InData%V_DiskAvg) + call RegPack(RF, InData%yaw) + call RegPack(RF, InData%tilt) + call RegPackAlloc(RF, InData%hub_theta_x_root) + call RegPack(RF, InData%V_dot_x) + call MeshPack(RF, InData%HubLoad) + call RegPack(RF, allocated(InData%B_L_2_H_P)) + if (allocated(InData%B_L_2_H_P)) then + call RegPackBounds(RF, 1, lbound(InData%B_L_2_H_P), ubound(InData%B_L_2_H_P)) + LB(1:1) = lbound(InData%B_L_2_H_P) + UB(1:1) = ubound(InData%B_L_2_H_P) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BladeRootMotion(i1)) + call NWTC_Library_PackMeshMapType(RF, InData%B_L_2_H_P(i1)) end do end if - call RegPack(RF, allocated(InData%BladeMotion)) - if (allocated(InData%BladeMotion)) then - call RegPackBounds(RF, 1, lbound(InData%BladeMotion), ubound(InData%BladeMotion)) - LB(1:1) = lbound(InData%BladeMotion) - UB(1:1) = ubound(InData%BladeMotion) + call RegPackAlloc(RF, InData%SigmaCavitCrit) + call RegPackAlloc(RF, InData%SigmaCavit) + call RegPackAlloc(RF, InData%CavitWarnSet) + call RegPackAlloc(RF, InData%TwrFB) + call RegPackAlloc(RF, InData%TwrMB) + call RegPackAlloc(RF, InData%HubFB) + call RegPackAlloc(RF, InData%HubMB) + call RegPackAlloc(RF, InData%NacFB) + call RegPackAlloc(RF, InData%NacMB) + call RegPackAlloc(RF, InData%NacDragF) + call RegPackAlloc(RF, InData%NacDragM) + call RegPackAlloc(RF, InData%NacFi) + call RegPackAlloc(RF, InData%NacMi) + call RegPackAlloc(RF, InData%BlFI) + call RegPackAlloc(RF, InData%BlFA) + call RegPackAlloc(RF, InData%BlMA) + call RegPackAlloc(RF, InData%TwrFI) + call RegPackAlloc(RF, InData%TwrFA) + call RegPack(RF, allocated(InData%BladeRootLoad)) + if (allocated(InData%BladeRootLoad)) then + call RegPackBounds(RF, 1, lbound(InData%BladeRootLoad), ubound(InData%BladeRootLoad)) + LB(1:1) = lbound(InData%BladeRootLoad) + UB(1:1) = ubound(InData%BladeRootLoad) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BladeMotion(i1)) + call MeshPack(RF, InData%BladeRootLoad(i1)) end do end if - call MeshPack(RF, InData%TFinMotion) - call RegPackAlloc(RF, InData%UserProp) + call RegPack(RF, allocated(InData%B_L_2_R_P)) + if (allocated(InData%B_L_2_R_P)) then + call RegPackBounds(RF, 1, lbound(InData%B_L_2_R_P), ubound(InData%B_L_2_R_P)) + LB(1:1) = lbound(InData%B_L_2_R_P) + UB(1:1) = ubound(InData%B_L_2_R_P) + do i1 = LB(1), UB(1) + call NWTC_Library_PackMeshMapType(RF, InData%B_L_2_R_P(i1)) + end do + end if + call RegPack(RF, allocated(InData%BladeBuoyLoadPoint)) + if (allocated(InData%BladeBuoyLoadPoint)) then + call RegPackBounds(RF, 1, lbound(InData%BladeBuoyLoadPoint), ubound(InData%BladeBuoyLoadPoint)) + LB(1:1) = lbound(InData%BladeBuoyLoadPoint) + UB(1:1) = ubound(InData%BladeBuoyLoadPoint) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%BladeBuoyLoadPoint(i1)) + end do + end if + call RegPack(RF, allocated(InData%BladeBuoyLoad)) + if (allocated(InData%BladeBuoyLoad)) then + call RegPackBounds(RF, 1, lbound(InData%BladeBuoyLoad), ubound(InData%BladeBuoyLoad)) + LB(1:1) = lbound(InData%BladeBuoyLoad) + UB(1:1) = ubound(InData%BladeBuoyLoad) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%BladeBuoyLoad(i1)) + end do + end if + call RegPack(RF, allocated(InData%B_P_2_B_L)) + if (allocated(InData%B_P_2_B_L)) then + call RegPackBounds(RF, 1, lbound(InData%B_P_2_B_L), ubound(InData%B_P_2_B_L)) + LB(1:1) = lbound(InData%B_P_2_B_L) + UB(1:1) = ubound(InData%B_P_2_B_L) + do i1 = LB(1), UB(1) + call NWTC_Library_PackMeshMapType(RF, InData%B_P_2_B_L(i1)) + end do + end if + call MeshPack(RF, InData%TwrBuoyLoadPoint) + call MeshPack(RF, InData%TwrBuoyLoad) + call NWTC_Library_PackMeshMapType(RF, InData%T_P_2_T_L) + call RegPack(RF, InData%FirstWarn_TowerStrike) + call RegPack(RF, InData%AvgDiskVel) + call RegPack(RF, InData%AvgDiskVelDist) + call RegPack(RF, InData%TFinAlpha) + call RegPack(RF, InData%TFinRe) + call RegPack(RF, InData%TFinVrel) + call RegPack(RF, InData%TFinVund_i) + call RegPack(RF, InData%TFinVind_i) + call RegPack(RF, InData%TFinVrel_i) + call RegPack(RF, InData%TFinSTV_i) + call RegPack(RF, InData%TFinF_i) + call RegPack(RF, InData%TFinM_i) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_UnPackRotInputType(RF, OutData) +subroutine AD_UnPackRotMiscVarType(RF, OutData) type(RegFile), intent(inout) :: RF - type(RotInputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackRotInputType' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + type(RotMiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackRotMiscVarType' + integer(B4Ki) :: i1, i2, i3, i4 + integer(B4Ki) :: LB(4), UB(4) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call MeshUnpack(RF, OutData%NacelleMotion) ! NacelleMotion - call MeshUnpack(RF, OutData%TowerMotion) ! TowerMotion - call MeshUnpack(RF, OutData%HubMotion) ! HubMotion - if (allocated(OutData%BladeRootMotion)) deallocate(OutData%BladeRootMotion) + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call AD_UnpackRotContinuousStateType(RF, OutData%x_init) ! x_init + call AD_UnpackRotContinuousStateType(RF, OutData%x_perturb) ! x_perturb + call AD_UnpackRotContinuousStateType(RF, OutData%dxdt_lin) ! dxdt_lin + call AD_UnpackRotInputType(RF, OutData%u_perturb) ! u_perturb + call AD_UnpackRotOutputType(RF, OutData%y_lin) ! y_lin + call AD_UnpackRotConstraintStateType(RF, OutData%z_lin) ! z_lin + call AD_UnpackRotOtherStateType(RF, OutData%OtherState_init) ! OtherState_init + call AD_UnpackRotOtherStateType(RF, OutData%OtherState_jac) ! OtherState_jac + call BEMT_UnpackMisc(RF, OutData%BEMT) ! BEMT + call BEMT_UnpackOutput(RF, OutData%BEMT_y) ! BEMT_y + LB(1:1) = lbound(OutData%BEMT_u) + UB(1:1) = ubound(OutData%BEMT_u) + do i1 = LB(1), UB(1) + call BEMT_UnpackInput(RF, OutData%BEMT_u(i1)) ! BEMT_u + end do + call AA_UnpackMisc(RF, OutData%AA) ! AA + call AA_UnpackOutput(RF, OutData%AA_y) ! AA_y + call AA_UnpackInput(RF, OutData%AA_u) ! AA_u + call RegUnpackAlloc(RF, OutData%DisturbedInflow); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%SectAvgInflow); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%orientationAnnulus); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%R_li); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AllOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%W_Twr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%X_Twr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Y_Twr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Cant); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Toe); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrClrnc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%X); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Y); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Z); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%M); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Mx); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%My); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Mz); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Vind_i); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%V_DiskAvg); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%yaw); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%tilt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%hub_theta_x_root); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%V_dot_x); if (RegCheckErr(RF, RoutineName)) return + call MeshUnpack(RF, OutData%HubLoad) ! HubLoad + if (allocated(OutData%B_L_2_H_P)) deallocate(OutData%B_L_2_H_P) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%B_L_2_H_P(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%B_L_2_H_P.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call NWTC_Library_UnpackMeshMapType(RF, OutData%B_L_2_H_P(i1)) ! B_L_2_H_P + end do + end if + call RegUnpackAlloc(RF, OutData%SigmaCavitCrit); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%SigmaCavit); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%CavitWarnSet); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrFB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrMB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%HubFB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%HubMB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacFB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacMB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacDragF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacDragM); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacFi); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacMi); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlFI); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlFA); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlMA); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrFI); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TwrFA); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%BladeRootLoad)) deallocate(OutData%BladeRootLoad) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BladeRootLoad(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeRootLoad.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%BladeRootLoad(i1)) ! BladeRootLoad + end do + end if + if (allocated(OutData%B_L_2_R_P)) deallocate(OutData%B_L_2_R_P) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BladeRootMotion(LB(1):UB(1)),stat=stat) + allocate(OutData%B_L_2_R_P(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeRootMotion.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%B_L_2_R_P.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BladeRootMotion(i1)) ! BladeRootMotion + call NWTC_Library_UnpackMeshMapType(RF, OutData%B_L_2_R_P(i1)) ! B_L_2_R_P end do end if - if (allocated(OutData%BladeMotion)) deallocate(OutData%BladeMotion) + if (allocated(OutData%BladeBuoyLoadPoint)) deallocate(OutData%BladeBuoyLoadPoint) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BladeMotion(LB(1):UB(1)),stat=stat) + allocate(OutData%BladeBuoyLoadPoint(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeMotion.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeBuoyLoadPoint.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BladeMotion(i1)) ! BladeMotion + call MeshUnpack(RF, OutData%BladeBuoyLoadPoint(i1)) ! BladeBuoyLoadPoint end do end if - call MeshUnpack(RF, OutData%TFinMotion) ! TFinMotion - call RegUnpackAlloc(RF, OutData%UserProp); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) - type(AD_InputType), intent(inout) :: SrcInputData - type(AD_InputType), intent(inout) :: DstInputData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyInput' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcInputData%rotors)) then - LB(1:1) = lbound(SrcInputData%rotors) - UB(1:1) = ubound(SrcInputData%rotors) - if (.not. allocated(DstInputData%rotors)) then - allocate(DstInputData%rotors(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%rotors.', ErrStat, ErrMsg, RoutineName) - return - end if + if (allocated(OutData%BladeBuoyLoad)) deallocate(OutData%BladeBuoyLoad) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BladeBuoyLoad(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeBuoyLoad.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if do i1 = LB(1), UB(1) - call AD_CopyRotInputType(SrcInputData%rotors(i1), DstInputData%rotors(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if -end subroutine - -subroutine AD_DestroyInput(InputData, ErrStat, ErrMsg) - type(AD_InputType), intent(inout) :: InputData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyInput' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(InputData%rotors)) then - LB(1:1) = lbound(InputData%rotors) - UB(1:1) = ubound(InputData%rotors) - do i1 = LB(1), UB(1) - call AD_DestroyRotInputType(InputData%rotors(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(InputData%rotors) - end if -end subroutine - -subroutine AD_PackInput(RF, Indata) - type(RegFile), intent(inout) :: RF - type(AD_InputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackInput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%rotors)) - if (allocated(InData%rotors)) then - call RegPackBounds(RF, 1, lbound(InData%rotors), ubound(InData%rotors)) - LB(1:1) = lbound(InData%rotors) - UB(1:1) = ubound(InData%rotors) - do i1 = LB(1), UB(1) - call AD_PackRotInputType(RF, InData%rotors(i1)) + call MeshUnpack(RF, OutData%BladeBuoyLoad(i1)) ! BladeBuoyLoad end do end if - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_UnPackInput(RF, OutData) - type(RegFile), intent(inout) :: RF - type(AD_InputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackInput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%rotors)) deallocate(OutData%rotors) + if (allocated(OutData%B_P_2_B_L)) deallocate(OutData%B_P_2_B_L) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%rotors(LB(1):UB(1)),stat=stat) + allocate(OutData%B_P_2_B_L(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%rotors.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%B_P_2_B_L.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call AD_UnpackRotInputType(RF, OutData%rotors(i1)) ! rotors + call NWTC_Library_UnpackMeshMapType(RF, OutData%B_P_2_B_L(i1)) ! B_P_2_B_L end do end if + call MeshUnpack(RF, OutData%TwrBuoyLoadPoint) ! TwrBuoyLoadPoint + call MeshUnpack(RF, OutData%TwrBuoyLoad) ! TwrBuoyLoad + call NWTC_Library_UnpackMeshMapType(RF, OutData%T_P_2_T_L) ! T_P_2_T_L + call RegUnpack(RF, OutData%FirstWarn_TowerStrike); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AvgDiskVel); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AvgDiskVelDist); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinAlpha); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinRe); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinVrel); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinVund_i); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinVind_i); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinVrel_i); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinSTV_i); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinF_i); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TFinM_i); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_CopyRotOutputType(SrcRotOutputTypeData, DstRotOutputTypeData, CtrlCode, ErrStat, ErrMsg) - type(RotOutputType), intent(inout) :: SrcRotOutputTypeData - type(RotOutputType), intent(inout) :: DstRotOutputTypeData +subroutine AD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(AD_MiscVarType), intent(inout) :: SrcMiscData + type(AD_MiscVarType), intent(inout) :: DstMiscData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyRotOutputType' + character(*), parameter :: RoutineName = 'AD_CopyMisc' ErrStat = ErrID_None ErrMsg = '' - call MeshCopy(SrcRotOutputTypeData%NacelleLoad, DstRotOutputTypeData%NacelleLoad, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcRotOutputTypeData%HubLoad, DstRotOutputTypeData%HubLoad, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcRotOutputTypeData%TowerLoad, DstRotOutputTypeData%TowerLoad, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcRotOutputTypeData%BladeLoad)) then - LB(1:1) = lbound(SrcRotOutputTypeData%BladeLoad) - UB(1:1) = ubound(SrcRotOutputTypeData%BladeLoad) - if (.not. allocated(DstRotOutputTypeData%BladeLoad)) then - allocate(DstRotOutputTypeData%BladeLoad(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%rotors)) then + LB(1:1) = lbound(SrcMiscData%rotors) + UB(1:1) = ubound(SrcMiscData%rotors) + if (.not. allocated(DstMiscData%rotors)) then + allocate(DstMiscData%rotors(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotOutputTypeData%BladeLoad.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%rotors.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcRotOutputTypeData%BladeLoad(i1), DstRotOutputTypeData%BladeLoad(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call AD_CopyRotMiscVarType(SrcMiscData%rotors(i1), DstMiscData%rotors(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call MeshCopy(SrcRotOutputTypeData%TFinLoad, DstRotOutputTypeData%TFinLoad, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcRotOutputTypeData%WriteOutput)) then - LB(1:1) = lbound(SrcRotOutputTypeData%WriteOutput) - UB(1:1) = ubound(SrcRotOutputTypeData%WriteOutput) - if (.not. allocated(DstRotOutputTypeData%WriteOutput)) then - allocate(DstRotOutputTypeData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRotOutputTypeData%WriteOutput.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRotOutputTypeData%WriteOutput = SrcRotOutputTypeData%WriteOutput - end if -end subroutine - -subroutine AD_DestroyRotOutputType(RotOutputTypeData, ErrStat, ErrMsg) - type(RotOutputType), intent(inout) :: RotOutputTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyRotOutputType' - ErrStat = ErrID_None - ErrMsg = '' - call MeshDestroy( RotOutputTypeData%NacelleLoad, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( RotOutputTypeData%HubLoad, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( RotOutputTypeData%TowerLoad, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(RotOutputTypeData%BladeLoad)) then - LB(1:1) = lbound(RotOutputTypeData%BladeLoad) - UB(1:1) = ubound(RotOutputTypeData%BladeLoad) - do i1 = LB(1), UB(1) - call MeshDestroy( RotOutputTypeData%BladeLoad(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(RotOutputTypeData%BladeLoad) - end if - call MeshDestroy( RotOutputTypeData%TFinLoad, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(RotOutputTypeData%WriteOutput)) then - deallocate(RotOutputTypeData%WriteOutput) - end if -end subroutine - -subroutine AD_PackRotOutputType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(RotOutputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackRotOutputType' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - call MeshPack(RF, InData%NacelleLoad) - call MeshPack(RF, InData%HubLoad) - call MeshPack(RF, InData%TowerLoad) - call RegPack(RF, allocated(InData%BladeLoad)) - if (allocated(InData%BladeLoad)) then - call RegPackBounds(RF, 1, lbound(InData%BladeLoad), ubound(InData%BladeLoad)) - LB(1:1) = lbound(InData%BladeLoad) - UB(1:1) = ubound(InData%BladeLoad) - do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BladeLoad(i1)) - end do - end if - call MeshPack(RF, InData%TFinLoad) - call RegPackAlloc(RF, InData%WriteOutput) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_UnPackRotOutputType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(RotOutputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackRotOutputType' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call MeshUnpack(RF, OutData%NacelleLoad) ! NacelleLoad - call MeshUnpack(RF, OutData%HubLoad) ! HubLoad - call MeshUnpack(RF, OutData%TowerLoad) ! TowerLoad - if (allocated(OutData%BladeLoad)) deallocate(OutData%BladeLoad) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BladeLoad(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeLoad.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcMiscData%FVW_u)) then + LB(1:1) = lbound(SrcMiscData%FVW_u) + UB(1:1) = ubound(SrcMiscData%FVW_u) + if (.not. allocated(DstMiscData%FVW_u)) then + allocate(DstMiscData%FVW_u(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FVW_u.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BladeLoad(i1)) ! BladeLoad + call FVW_CopyInput(SrcMiscData%FVW_u(i1), DstMiscData%FVW_u(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - call MeshUnpack(RF, OutData%TFinLoad) ! TFinLoad - call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine AD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) - type(AD_OutputType), intent(inout) :: SrcOutputData - type(AD_OutputType), intent(inout) :: DstOutputData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_CopyOutput' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcOutputData%rotors)) then - LB(1:1) = lbound(SrcOutputData%rotors) - UB(1:1) = ubound(SrcOutputData%rotors) - if (.not. allocated(DstOutputData%rotors)) then - allocate(DstOutputData%rotors(LB(1):UB(1)), stat=ErrStat2) + call FVW_CopyOutput(SrcMiscData%FVW_y, DstMiscData%FVW_y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call FVW_CopyMisc(SrcMiscData%FVW, DstMiscData%FVW, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcMiscData%WindPos)) then + LB(1:2) = lbound(SrcMiscData%WindPos) + UB(1:2) = ubound(SrcMiscData%WindPos) + if (.not. allocated(DstMiscData%WindPos)) then + allocate(DstMiscData%WindPos(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%rotors.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WindPos.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%WindPos = SrcMiscData%WindPos + end if + if (allocated(SrcMiscData%WindVel)) then + LB(1:2) = lbound(SrcMiscData%WindVel) + UB(1:2) = ubound(SrcMiscData%WindVel) + if (.not. allocated(DstMiscData%WindVel)) then + allocate(DstMiscData%WindVel(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WindVel.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%WindVel = SrcMiscData%WindVel + end if + if (allocated(SrcMiscData%WindAcc)) then + LB(1:2) = lbound(SrcMiscData%WindAcc) + UB(1:2) = ubound(SrcMiscData%WindAcc) + if (.not. allocated(DstMiscData%WindAcc)) then + allocate(DstMiscData%WindAcc(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WindAcc.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%WindAcc = SrcMiscData%WindAcc + end if + call GridInterp_CopyMisc(SrcMiscData%WaveField_m, DstMiscData%WaveField_m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcMiscData%Inflow)) then + LB(1:1) = lbound(SrcMiscData%Inflow) + UB(1:1) = ubound(SrcMiscData%Inflow) + if (.not. allocated(DstMiscData%Inflow)) then + allocate(DstMiscData%Inflow(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Inflow.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call AD_CopyRotOutputType(SrcOutputData%rotors(i1), DstOutputData%rotors(i1), CtrlCode, ErrStat2, ErrMsg2) + call AD_CopyInflowType(SrcMiscData%Inflow(i1), DstMiscData%Inflow(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if + call AD_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine -subroutine AD_DestroyOutput(OutputData, ErrStat, ErrMsg) - type(AD_OutputType), intent(inout) :: OutputData +subroutine AD_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(AD_MiscVarType), intent(inout) :: MiscData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AD_DestroyOutput' + character(*), parameter :: RoutineName = 'AD_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' - if (allocated(OutputData%rotors)) then - LB(1:1) = lbound(OutputData%rotors) - UB(1:1) = ubound(OutputData%rotors) + if (allocated(MiscData%rotors)) then + LB(1:1) = lbound(MiscData%rotors) + UB(1:1) = ubound(MiscData%rotors) do i1 = LB(1), UB(1) - call AD_DestroyRotOutputType(OutputData%rotors(i1), ErrStat2, ErrMsg2) + call AD_DestroyRotMiscVarType(MiscData%rotors(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%rotors) + deallocate(MiscData%rotors) + end if + if (allocated(MiscData%FVW_u)) then + LB(1:1) = lbound(MiscData%FVW_u) + UB(1:1) = ubound(MiscData%FVW_u) + do i1 = LB(1), UB(1) + call FVW_DestroyInput(MiscData%FVW_u(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%FVW_u) + end if + call FVW_DestroyOutput(MiscData%FVW_y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call FVW_DestroyMisc(MiscData%FVW, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%WindPos)) then + deallocate(MiscData%WindPos) end if + if (allocated(MiscData%WindVel)) then + deallocate(MiscData%WindVel) + end if + if (allocated(MiscData%WindAcc)) then + deallocate(MiscData%WindAcc) + end if + call GridInterp_DestroyMisc(MiscData%WaveField_m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%Inflow)) then + LB(1:1) = lbound(MiscData%Inflow) + UB(1:1) = ubound(MiscData%Inflow) + do i1 = LB(1), UB(1) + call AD_DestroyInflowType(MiscData%Inflow(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%Inflow) + end if + call AD_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AD_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine -subroutine AD_PackOutput(RF, Indata) +subroutine AD_PackMisc(RF, Indata) type(RegFile), intent(inout) :: RF - type(AD_OutputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'AD_PackOutput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(AD_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AD_PackMisc' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, allocated(InData%rotors)) if (allocated(InData%rotors)) then @@ -6089,18 +6271,44 @@ subroutine AD_PackOutput(RF, Indata) LB(1:1) = lbound(InData%rotors) UB(1:1) = ubound(InData%rotors) do i1 = LB(1), UB(1) - call AD_PackRotOutputType(RF, InData%rotors(i1)) + call AD_PackRotMiscVarType(RF, InData%rotors(i1)) + end do + end if + call RegPack(RF, allocated(InData%FVW_u)) + if (allocated(InData%FVW_u)) then + call RegPackBounds(RF, 1, lbound(InData%FVW_u), ubound(InData%FVW_u)) + LB(1:1) = lbound(InData%FVW_u) + UB(1:1) = ubound(InData%FVW_u) + do i1 = LB(1), UB(1) + call FVW_PackInput(RF, InData%FVW_u(i1)) + end do + end if + call FVW_PackOutput(RF, InData%FVW_y) + call FVW_PackMisc(RF, InData%FVW) + call RegPackAlloc(RF, InData%WindPos) + call RegPackAlloc(RF, InData%WindVel) + call RegPackAlloc(RF, InData%WindAcc) + call GridInterp_PackMisc(RF, InData%WaveField_m) + call RegPack(RF, allocated(InData%Inflow)) + if (allocated(InData%Inflow)) then + call RegPackBounds(RF, 1, lbound(InData%Inflow), ubound(InData%Inflow)) + LB(1:1) = lbound(InData%Inflow) + UB(1:1) = ubound(InData%Inflow) + do i1 = LB(1), UB(1) + call AD_PackInflowType(RF, InData%Inflow(i1)) end do end if + call AD_PackInput(RF, InData%u_perturb) + call AD_PackOutput(RF, InData%y_lin) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AD_UnPackOutput(RF, OutData) +subroutine AD_UnPackMisc(RF, OutData) type(RegFile), intent(inout) :: RF - type(AD_OutputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'AD_UnPackOutput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(AD_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AD_UnPackMisc' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return @@ -6114,9 +6322,43 @@ subroutine AD_UnPackOutput(RF, OutData) return end if do i1 = LB(1), UB(1) - call AD_UnpackRotOutputType(RF, OutData%rotors(i1)) ! rotors + call AD_UnpackRotMiscVarType(RF, OutData%rotors(i1)) ! rotors + end do + end if + if (allocated(OutData%FVW_u)) deallocate(OutData%FVW_u) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%FVW_u(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%FVW_u.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call FVW_UnpackInput(RF, OutData%FVW_u(i1)) ! FVW_u + end do + end if + call FVW_UnpackOutput(RF, OutData%FVW_y) ! FVW_y + call FVW_UnpackMisc(RF, OutData%FVW) ! FVW + call RegUnpackAlloc(RF, OutData%WindPos); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%WindVel); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%WindAcc); if (RegCheckErr(RF, RoutineName)) return + call GridInterp_UnpackMisc(RF, OutData%WaveField_m) ! WaveField_m + if (allocated(OutData%Inflow)) deallocate(OutData%Inflow) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Inflow(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Inflow.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call AD_UnpackInflowType(RF, OutData%Inflow(i1)) ! Inflow end do end if + call AD_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call AD_UnpackOutput(RF, OutData%y_lin) ! y_lin end subroutine subroutine AD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -6816,5 +7058,332 @@ SUBROUTINE AD_InflowType_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, END DO END IF ! check if allocated END SUBROUTINE + +function AD_InputMeshPointer(u, DL) result(Mesh) + type(RotInputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (AD_u_NacelleMotion) + Mesh => u%NacelleMotion + case (AD_u_TowerMotion) + Mesh => u%TowerMotion + case (AD_u_HubMotion) + Mesh => u%HubMotion + case (AD_u_BladeRootMotion) + Mesh => u%BladeRootMotion(DL%i1) + case (AD_u_BladeMotion) + Mesh => u%BladeMotion(DL%i1) + case (AD_u_TFinMotion) + Mesh => u%TFinMotion + end select +end function + +function AD_OutputMeshPointer(y, DL) result(Mesh) + type(RotOutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (AD_y_NacelleLoad) + Mesh => y%NacelleLoad + case (AD_y_HubLoad) + Mesh => y%HubLoad + case (AD_y_TowerLoad) + Mesh => y%TowerLoad + case (AD_y_BladeLoad) + Mesh => y%BladeLoad(DL%i1) + case (AD_y_TFinLoad) + Mesh => y%TFinLoad + end select +end function + +subroutine AD_VarsPackContState(Vars, x, ValAry) + type(RotContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call AD_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine AD_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(RotContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AD_x_BEMT_UA_element_x) + VarVals = x%BEMT%UA%element(DL%i1, DL%i2)%x(V%iLB:V%iUB) ! Rank 1 Array + case (AD_x_BEMT_DBEMT_element_vind) + VarVals = x%BEMT%DBEMT%element(DL%i1, DL%i2)%vind(V%iLB:V%iUB) ! Rank 1 Array + case (AD_x_BEMT_DBEMT_element_vind_1) + VarVals = x%BEMT%DBEMT%element(DL%i1, DL%i2)%vind_1(V%iLB:V%iUB) ! Rank 1 Array + case (AD_x_BEMT_V_w) + VarVals = x%BEMT%V_w(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AD_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(RotContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call AD_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine AD_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(RotContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AD_x_BEMT_UA_element_x) + x%BEMT%UA%element(DL%i1, DL%i2)%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (AD_x_BEMT_DBEMT_element_vind) + x%BEMT%DBEMT%element(DL%i1, DL%i2)%vind(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (AD_x_BEMT_DBEMT_element_vind_1) + x%BEMT%DBEMT%element(DL%i1, DL%i2)%vind_1(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (AD_x_BEMT_V_w) + x%BEMT%V_w(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function AD_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AD_x_BEMT_UA_element_x) + Name = "x%BEMT%UA%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%x" + case (AD_x_BEMT_DBEMT_element_vind) + Name = "x%BEMT%DBEMT%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%vind" + case (AD_x_BEMT_DBEMT_element_vind_1) + Name = "x%BEMT%DBEMT%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%vind_1" + case (AD_x_BEMT_V_w) + Name = "x%BEMT%V_w" + case default + Name = "Unknown Field" + end select +end function + +subroutine AD_VarsPackContStateDeriv(Vars, x, ValAry) + type(RotContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call AD_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine AD_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(RotContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AD_x_BEMT_UA_element_x) + VarVals = x%BEMT%UA%element(DL%i1, DL%i2)%x(V%iLB:V%iUB) ! Rank 1 Array + case (AD_x_BEMT_DBEMT_element_vind) + VarVals = x%BEMT%DBEMT%element(DL%i1, DL%i2)%vind(V%iLB:V%iUB) ! Rank 1 Array + case (AD_x_BEMT_DBEMT_element_vind_1) + VarVals = x%BEMT%DBEMT%element(DL%i1, DL%i2)%vind_1(V%iLB:V%iUB) ! Rank 1 Array + case (AD_x_BEMT_V_w) + VarVals = x%BEMT%V_w(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AD_VarsPackInput(Vars, u, ValAry) + type(RotInputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call AD_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine AD_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(RotInputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AD_u_NacelleMotion) + call MV_PackMesh(V, u%NacelleMotion, ValAry) ! Mesh + case (AD_u_TowerMotion) + call MV_PackMesh(V, u%TowerMotion, ValAry) ! Mesh + case (AD_u_HubMotion) + call MV_PackMesh(V, u%HubMotion, ValAry) ! Mesh + case (AD_u_BladeRootMotion) + call MV_PackMesh(V, u%BladeRootMotion(DL%i1), ValAry) ! Mesh + case (AD_u_BladeMotion) + call MV_PackMesh(V, u%BladeMotion(DL%i1), ValAry) ! Mesh + case (AD_u_TFinMotion) + call MV_PackMesh(V, u%TFinMotion, ValAry) ! Mesh + case (AD_u_UserProp) + VarVals = u%UserProp(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AD_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(RotInputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call AD_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine AD_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(RotInputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AD_u_NacelleMotion) + call MV_UnpackMesh(V, ValAry, u%NacelleMotion) ! Mesh + case (AD_u_TowerMotion) + call MV_UnpackMesh(V, ValAry, u%TowerMotion) ! Mesh + case (AD_u_HubMotion) + call MV_UnpackMesh(V, ValAry, u%HubMotion) ! Mesh + case (AD_u_BladeRootMotion) + call MV_UnpackMesh(V, ValAry, u%BladeRootMotion(DL%i1)) ! Mesh + case (AD_u_BladeMotion) + call MV_UnpackMesh(V, ValAry, u%BladeMotion(DL%i1)) ! Mesh + case (AD_u_TFinMotion) + call MV_UnpackMesh(V, ValAry, u%TFinMotion) ! Mesh + case (AD_u_UserProp) + u%UserProp(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function AD_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AD_u_NacelleMotion) + Name = "u%NacelleMotion" + case (AD_u_TowerMotion) + Name = "u%TowerMotion" + case (AD_u_HubMotion) + Name = "u%HubMotion" + case (AD_u_BladeRootMotion) + Name = "u%BladeRootMotion("//trim(Num2LStr(DL%i1))//")" + case (AD_u_BladeMotion) + Name = "u%BladeMotion("//trim(Num2LStr(DL%i1))//")" + case (AD_u_TFinMotion) + Name = "u%TFinMotion" + case (AD_u_UserProp) + Name = "u%UserProp" + case default + Name = "Unknown Field" + end select +end function + +subroutine AD_VarsPackOutput(Vars, y, ValAry) + type(RotOutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call AD_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine AD_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(RotOutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AD_y_NacelleLoad) + call MV_PackMesh(V, y%NacelleLoad, ValAry) ! Mesh + case (AD_y_HubLoad) + call MV_PackMesh(V, y%HubLoad, ValAry) ! Mesh + case (AD_y_TowerLoad) + call MV_PackMesh(V, y%TowerLoad, ValAry) ! Mesh + case (AD_y_BladeLoad) + call MV_PackMesh(V, y%BladeLoad(DL%i1), ValAry) ! Mesh + case (AD_y_TFinLoad) + call MV_PackMesh(V, y%TFinLoad, ValAry) ! Mesh + case (AD_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AD_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(RotOutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call AD_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine AD_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(RotOutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AD_y_NacelleLoad) + call MV_UnpackMesh(V, ValAry, y%NacelleLoad) ! Mesh + case (AD_y_HubLoad) + call MV_UnpackMesh(V, ValAry, y%HubLoad) ! Mesh + case (AD_y_TowerLoad) + call MV_UnpackMesh(V, ValAry, y%TowerLoad) ! Mesh + case (AD_y_BladeLoad) + call MV_UnpackMesh(V, ValAry, y%BladeLoad(DL%i1)) ! Mesh + case (AD_y_TFinLoad) + call MV_UnpackMesh(V, ValAry, y%TFinLoad) ! Mesh + case (AD_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function AD_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AD_y_NacelleLoad) + Name = "y%NacelleLoad" + case (AD_y_HubLoad) + Name = "y%HubLoad" + case (AD_y_TowerLoad) + Name = "y%TowerLoad" + case (AD_y_BladeLoad) + Name = "y%BladeLoad("//trim(Num2LStr(DL%i1))//")" + case (AD_y_TFinLoad) + Name = "y%TFinLoad" + case (AD_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE AeroDyn_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/src/AirfoilInfo_Types.f90 b/modules/aerodyn/src/AirfoilInfo_Types.f90 index 3ee973c9d5..ae02f958b3 100644 --- a/modules/aerodyn/src/AirfoilInfo_Types.f90 +++ b/modules/aerodyn/src/AirfoilInfo_Types.f90 @@ -33,18 +33,18 @@ MODULE AirfoilInfo_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: AFITable_1 = 1 ! 1D interpolation on AoA (first table only) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: AFITable_2Re = 2 ! 2D interpolation on AoA and Re [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: AFITable_2User = 3 ! 2D interpolation on AoA and UserProp [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_None = 0 ! Steady aerodynamics, using the same angle of attack convention as UA [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Baseline = 1 ! UAMod = 1 [Baseline model (Original)] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Gonzalez = 2 ! UAMod = 2 [Gonzalez's variant (changes in Cn,Cc,Cm)] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_MinnemaPierce = 3 ! Minnema/Pierce variant (changes in Cc and Cm) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_HGM = 4 ! continuous variant of HGM (Hansen) model [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_HGMV = 5 ! continuous variant of HGM (Hansen) model with vortex modifications [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Oye = 6 ! Stieg Oye dynamic stall model [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_BV = 7 ! Boeing-Vertol dynamic stall model (e.g. used in CACTUS) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_HGMV360 = 8 ! continuous variant of HGM (Hansen) model with vortex modifications modified for 360-deg [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: AFITable_1 = 1 ! 1D interpolation on AoA (first table only) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: AFITable_2Re = 2 ! 2D interpolation on AoA and Re [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: AFITable_2User = 3 ! 2D interpolation on AoA and UserProp [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_None = 0 ! Steady aerodynamics, using the same angle of attack convention as UA [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Baseline = 1 ! UAMod = 1 [Baseline model (Original)] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Gonzalez = 2 ! UAMod = 2 [Gonzalez's variant (changes in Cn,Cc,Cm)] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_MinnemaPierce = 3 ! Minnema/Pierce variant (changes in Cc and Cm) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_HGM = 4 ! continuous variant of HGM (Hansen) model [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_HGMV = 5 ! continuous variant of HGM (Hansen) model with vortex modifications [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Oye = 6 ! Stieg Oye dynamic stall model [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_BV = 7 ! Boeing-Vertol dynamic stall model (e.g. used in CACTUS) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_HGMV360 = 8 ! continuous variant of HGM (Hansen) model with vortex modifications modified for 360-deg [-] ! ========= AFI_UA_BL_Type ======= TYPE, PUBLIC :: AFI_UA_BL_Type REAL(ReKi) :: alpha0 = 0.0_ReKi !< Angle of attack for zero lift (also used in HGM) [input in degrees; stored as radians] @@ -204,7 +204,20 @@ MODULE AirfoilInfo_Types REAL(ReKi) :: FullyAttached = 0. !< fully attached cn or cl polar function (used for UA models) [-] END TYPE AFI_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: AFI_u_AoA = 1 ! AFI%AoA + integer(IntKi), public, parameter :: AFI_u_UserProp = 2 ! AFI%UserProp + integer(IntKi), public, parameter :: AFI_u_Re = 3 ! AFI%Re + integer(IntKi), public, parameter :: AFI_y_Cl = 4 ! AFI%Cl + integer(IntKi), public, parameter :: AFI_y_Cd = 5 ! AFI%Cd + integer(IntKi), public, parameter :: AFI_y_Cm = 6 ! AFI%Cm + integer(IntKi), public, parameter :: AFI_y_Cpmin = 7 ! AFI%Cpmin + integer(IntKi), public, parameter :: AFI_y_Cd0 = 8 ! AFI%Cd0 + integer(IntKi), public, parameter :: AFI_y_Cm0 = 9 ! AFI%Cm0 + integer(IntKi), public, parameter :: AFI_y_f_st = 10 ! AFI%f_st + integer(IntKi), public, parameter :: AFI_y_FullySeparate = 11 ! AFI%FullySeparate + integer(IntKi), public, parameter :: AFI_y_FullyAttached = 12 ! AFI%FullyAttached + +contains subroutine AFI_CopyUA_BL_Type(SrcUA_BL_TypeData, DstUA_BL_TypeData, CtrlCode, ErrStat, ErrMsg) type(AFI_UA_BL_Type), intent(in) :: SrcUA_BL_TypeData @@ -1438,5 +1451,199 @@ SUBROUTINE AFI_UA_BL_Type_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat CALL Angles_ExtrapInterp( u1%alphaBreakLower, u2%alphaBreakLower, u3%alphaBreakLower, tin, u_out%alphaBreakLower, tin_out ) u_out%CnBreakLower = a1*u1%CnBreakLower + a2*u2%CnBreakLower + a3*u3%CnBreakLower END SUBROUTINE + +function AFI_InputMeshPointer(u, DL) result(Mesh) + type(AFI_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function AFI_OutputMeshPointer(y, DL) result(Mesh) + type(AFI_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine AFI_VarsPackInput(Vars, u, ValAry) + type(AFI_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call AFI_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine AFI_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(AFI_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AFI_u_AoA) + VarVals(1) = u%AoA ! Scalar + case (AFI_u_UserProp) + VarVals(1) = u%UserProp ! Scalar + case (AFI_u_Re) + VarVals(1) = u%Re ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AFI_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(AFI_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call AFI_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine AFI_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(AFI_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AFI_u_AoA) + u%AoA = VarVals(1) ! Scalar + case (AFI_u_UserProp) + u%UserProp = VarVals(1) ! Scalar + case (AFI_u_Re) + u%Re = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function AFI_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AFI_u_AoA) + Name = "u%AoA" + case (AFI_u_UserProp) + Name = "u%UserProp" + case (AFI_u_Re) + Name = "u%Re" + case default + Name = "Unknown Field" + end select +end function + +subroutine AFI_VarsPackOutput(Vars, y, ValAry) + type(AFI_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call AFI_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine AFI_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(AFI_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AFI_y_Cl) + VarVals(1) = y%Cl ! Scalar + case (AFI_y_Cd) + VarVals(1) = y%Cd ! Scalar + case (AFI_y_Cm) + VarVals(1) = y%Cm ! Scalar + case (AFI_y_Cpmin) + VarVals(1) = y%Cpmin ! Scalar + case (AFI_y_Cd0) + VarVals(1) = y%Cd0 ! Scalar + case (AFI_y_Cm0) + VarVals(1) = y%Cm0 ! Scalar + case (AFI_y_f_st) + VarVals(1) = y%f_st ! Scalar + case (AFI_y_FullySeparate) + VarVals(1) = y%FullySeparate ! Scalar + case (AFI_y_FullyAttached) + VarVals(1) = y%FullyAttached ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AFI_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(AFI_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call AFI_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine AFI_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(AFI_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AFI_y_Cl) + y%Cl = VarVals(1) ! Scalar + case (AFI_y_Cd) + y%Cd = VarVals(1) ! Scalar + case (AFI_y_Cm) + y%Cm = VarVals(1) ! Scalar + case (AFI_y_Cpmin) + y%Cpmin = VarVals(1) ! Scalar + case (AFI_y_Cd0) + y%Cd0 = VarVals(1) ! Scalar + case (AFI_y_Cm0) + y%Cm0 = VarVals(1) ! Scalar + case (AFI_y_f_st) + y%f_st = VarVals(1) ! Scalar + case (AFI_y_FullySeparate) + y%FullySeparate = VarVals(1) ! Scalar + case (AFI_y_FullyAttached) + y%FullyAttached = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function AFI_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AFI_y_Cl) + Name = "y%Cl" + case (AFI_y_Cd) + Name = "y%Cd" + case (AFI_y_Cm) + Name = "y%Cm" + case (AFI_y_Cpmin) + Name = "y%Cpmin" + case (AFI_y_Cd0) + Name = "y%Cd0" + case (AFI_y_Cm0) + Name = "y%Cm0" + case (AFI_y_f_st) + Name = "y%f_st" + case (AFI_y_FullySeparate) + Name = "y%FullySeparate" + case (AFI_y_FullyAttached) + Name = "y%FullyAttached" + case default + Name = "Unknown Field" + end select +end function + END MODULE AirfoilInfo_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/src/BEMT_Types.f90 b/modules/aerodyn/src/BEMT_Types.f90 index 88dfc7823e..fecc70a8f0 100644 --- a/modules/aerodyn/src/BEMT_Types.f90 +++ b/modules/aerodyn/src/BEMT_Types.f90 @@ -36,14 +36,14 @@ MODULE BEMT_Types USE DBEMT_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: Skew_Mod_Orthogonal = -1 ! Inflow orthogonal to rotor [-] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Skew_Mod_None = 0 ! No skew model [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Skew_Mod_Active = 1 ! Skew model active [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Skew_Mod_PittPeters_Cont = 4 ! Pitt/Peters continuous formulation [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: SkewRedistrMod_None = 0 ! No redistribution [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: SkewRedistrMod_PittPeters = 1 ! Pitt/Peters/Glauert redistribution [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: BEMMod_2D = 1 ! 2D BEM assuming Cx, Cy, phi, L, D are in the same plane [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: BEMMod_3D = 2 ! 3D BEM assuming a momentum balance system, and an airfoil system [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Skew_Mod_Orthogonal = -1 ! Inflow orthogonal to rotor [-] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Skew_Mod_None = 0 ! No skew model [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Skew_Mod_Active = 1 ! Skew model active [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Skew_Mod_PittPeters_Cont = 4 ! Pitt/Peters continuous formulation [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SkewRedistrMod_None = 0 ! No redistribution [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SkewRedistrMod_PittPeters = 1 ! Pitt/Peters/Glauert redistribution [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BEMMod_2D = 1 ! 2D BEM assuming Cx, Cy, phi, L, D are in the same plane [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BEMMod_3D = 2 ! 3D BEM assuming a momentum balance system, and an airfoil system [-] ! ========= BEMT_InitInputType ======= TYPE, PUBLIC :: BEMT_InitInputType REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: chord !< Chord length at node [m] @@ -226,7 +226,53 @@ MODULE BEMT_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Cpmin !< min Cpressure [-] END TYPE BEMT_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: BEMT_x_UA_element_x = 1 ! BEMT%UA%element(DL%i1, DL%i2)%x + integer(IntKi), public, parameter :: BEMT_x_DBEMT_element_vind = 2 ! BEMT%DBEMT%element(DL%i1, DL%i2)%vind + integer(IntKi), public, parameter :: BEMT_x_DBEMT_element_vind_1 = 3 ! BEMT%DBEMT%element(DL%i1, DL%i2)%vind_1 + integer(IntKi), public, parameter :: BEMT_x_V_w = 4 ! BEMT%V_w + integer(IntKi), public, parameter :: BEMT_u_theta = 5 ! BEMT%theta + integer(IntKi), public, parameter :: BEMT_u_chi0 = 6 ! BEMT%chi0 + integer(IntKi), public, parameter :: BEMT_u_psiSkewOffset = 7 ! BEMT%psiSkewOffset + integer(IntKi), public, parameter :: BEMT_u_psi_s = 8 ! BEMT%psi_s + integer(IntKi), public, parameter :: BEMT_u_omega = 9 ! BEMT%omega + integer(IntKi), public, parameter :: BEMT_u_TSR = 10 ! BEMT%TSR + integer(IntKi), public, parameter :: BEMT_u_Vx = 11 ! BEMT%Vx + integer(IntKi), public, parameter :: BEMT_u_Vy = 12 ! BEMT%Vy + integer(IntKi), public, parameter :: BEMT_u_Vz = 13 ! BEMT%Vz + integer(IntKi), public, parameter :: BEMT_u_omega_z = 14 ! BEMT%omega_z + integer(IntKi), public, parameter :: BEMT_u_xVelCorr = 15 ! BEMT%xVelCorr + integer(IntKi), public, parameter :: BEMT_u_rLocal = 16 ! BEMT%rLocal + integer(IntKi), public, parameter :: BEMT_u_Un_disk = 17 ! BEMT%Un_disk + integer(IntKi), public, parameter :: BEMT_u_V0 = 18 ! BEMT%V0 + integer(IntKi), public, parameter :: BEMT_u_x_hat_disk = 19 ! BEMT%x_hat_disk + integer(IntKi), public, parameter :: BEMT_u_UserProp = 20 ! BEMT%UserProp + integer(IntKi), public, parameter :: BEMT_u_CantAngle = 21 ! BEMT%CantAngle + integer(IntKi), public, parameter :: BEMT_u_drdz = 22 ! BEMT%drdz + integer(IntKi), public, parameter :: BEMT_u_toeAngle = 23 ! BEMT%toeAngle + integer(IntKi), public, parameter :: BEMT_y_Vrel = 24 ! BEMT%Vrel + integer(IntKi), public, parameter :: BEMT_y_phi = 25 ! BEMT%phi + integer(IntKi), public, parameter :: BEMT_y_axInduction = 26 ! BEMT%axInduction + integer(IntKi), public, parameter :: BEMT_y_tanInduction = 27 ! BEMT%tanInduction + integer(IntKi), public, parameter :: BEMT_y_axInduction_qs = 28 ! BEMT%axInduction_qs + integer(IntKi), public, parameter :: BEMT_y_tanInduction_qs = 29 ! BEMT%tanInduction_qs + integer(IntKi), public, parameter :: BEMT_y_k = 30 ! BEMT%k + integer(IntKi), public, parameter :: BEMT_y_k_p = 31 ! BEMT%k_p + integer(IntKi), public, parameter :: BEMT_y_F = 32 ! BEMT%F + integer(IntKi), public, parameter :: BEMT_y_Re = 33 ! BEMT%Re + integer(IntKi), public, parameter :: BEMT_y_AOA = 34 ! BEMT%AOA + integer(IntKi), public, parameter :: BEMT_y_Cx = 35 ! BEMT%Cx + integer(IntKi), public, parameter :: BEMT_y_Cy = 36 ! BEMT%Cy + integer(IntKi), public, parameter :: BEMT_y_Cz = 37 ! BEMT%Cz + integer(IntKi), public, parameter :: BEMT_y_Cmx = 38 ! BEMT%Cmx + integer(IntKi), public, parameter :: BEMT_y_Cmy = 39 ! BEMT%Cmy + integer(IntKi), public, parameter :: BEMT_y_Cmz = 40 ! BEMT%Cmz + integer(IntKi), public, parameter :: BEMT_y_Cm = 41 ! BEMT%Cm + integer(IntKi), public, parameter :: BEMT_y_Cl = 42 ! BEMT%Cl + integer(IntKi), public, parameter :: BEMT_y_Cd = 43 ! BEMT%Cd + integer(IntKi), public, parameter :: BEMT_y_chi = 44 ! BEMT%chi + integer(IntKi), public, parameter :: BEMT_y_Cpmin = 45 ! BEMT%Cpmin + +contains subroutine BEMT_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(BEMT_InitInputType), intent(in) :: SrcInitInputData @@ -2615,5 +2661,478 @@ SUBROUTINE BEMT_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, E y_out%Cpmin = a1*y1%Cpmin + a2*y2%Cpmin + a3*y3%Cpmin END IF ! check if allocated END SUBROUTINE + +function BEMT_InputMeshPointer(u, DL) result(Mesh) + type(BEMT_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function BEMT_OutputMeshPointer(y, DL) result(Mesh) + type(BEMT_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine BEMT_VarsPackContState(Vars, x, ValAry) + type(BEMT_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call BEMT_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine BEMT_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(BEMT_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BEMT_x_UA_element_x) + VarVals = x%UA%element(DL%i1, DL%i2)%x(V%iLB:V%iUB) ! Rank 1 Array + case (BEMT_x_DBEMT_element_vind) + VarVals = x%DBEMT%element(DL%i1, DL%i2)%vind(V%iLB:V%iUB) ! Rank 1 Array + case (BEMT_x_DBEMT_element_vind_1) + VarVals = x%DBEMT%element(DL%i1, DL%i2)%vind_1(V%iLB:V%iUB) ! Rank 1 Array + case (BEMT_x_V_w) + VarVals = x%V_w(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine BEMT_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(BEMT_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call BEMT_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine BEMT_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(BEMT_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BEMT_x_UA_element_x) + x%UA%element(DL%i1, DL%i2)%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (BEMT_x_DBEMT_element_vind) + x%DBEMT%element(DL%i1, DL%i2)%vind(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (BEMT_x_DBEMT_element_vind_1) + x%DBEMT%element(DL%i1, DL%i2)%vind_1(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (BEMT_x_V_w) + x%V_w(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function BEMT_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (BEMT_x_UA_element_x) + Name = "x%UA%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%x" + case (BEMT_x_DBEMT_element_vind) + Name = "x%DBEMT%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%vind" + case (BEMT_x_DBEMT_element_vind_1) + Name = "x%DBEMT%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%vind_1" + case (BEMT_x_V_w) + Name = "x%V_w" + case default + Name = "Unknown Field" + end select +end function + +subroutine BEMT_VarsPackContStateDeriv(Vars, x, ValAry) + type(BEMT_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call BEMT_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine BEMT_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(BEMT_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BEMT_x_UA_element_x) + VarVals = x%UA%element(DL%i1, DL%i2)%x(V%iLB:V%iUB) ! Rank 1 Array + case (BEMT_x_DBEMT_element_vind) + VarVals = x%DBEMT%element(DL%i1, DL%i2)%vind(V%iLB:V%iUB) ! Rank 1 Array + case (BEMT_x_DBEMT_element_vind_1) + VarVals = x%DBEMT%element(DL%i1, DL%i2)%vind_1(V%iLB:V%iUB) ! Rank 1 Array + case (BEMT_x_V_w) + VarVals = x%V_w(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine BEMT_VarsPackInput(Vars, u, ValAry) + type(BEMT_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call BEMT_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine BEMT_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(BEMT_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BEMT_u_theta) + VarVals = u%theta(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_chi0) + VarVals(1) = u%chi0 ! Scalar + case (BEMT_u_psiSkewOffset) + VarVals(1) = u%psiSkewOffset ! Scalar + case (BEMT_u_psi_s) + VarVals = u%psi_s(V%iLB:V%iUB) ! Rank 1 Array + case (BEMT_u_omega) + VarVals(1) = u%omega ! Scalar + case (BEMT_u_TSR) + VarVals(1) = u%TSR ! Scalar + case (BEMT_u_Vx) + VarVals = u%Vx(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_Vy) + VarVals = u%Vy(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_Vz) + VarVals = u%Vz(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_omega_z) + VarVals = u%omega_z(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_xVelCorr) + VarVals = u%xVelCorr(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_rLocal) + VarVals = u%rLocal(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_Un_disk) + VarVals(1) = u%Un_disk ! Scalar + case (BEMT_u_V0) + VarVals = u%V0(V%iLB:V%iUB) ! Rank 1 Array + case (BEMT_u_x_hat_disk) + VarVals = u%x_hat_disk(V%iLB:V%iUB) ! Rank 1 Array + case (BEMT_u_UserProp) + VarVals = u%UserProp(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_CantAngle) + VarVals = u%CantAngle(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_drdz) + VarVals = u%drdz(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_u_toeAngle) + VarVals = u%toeAngle(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine BEMT_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(BEMT_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call BEMT_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine BEMT_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(BEMT_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BEMT_u_theta) + u%theta(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_chi0) + u%chi0 = VarVals(1) ! Scalar + case (BEMT_u_psiSkewOffset) + u%psiSkewOffset = VarVals(1) ! Scalar + case (BEMT_u_psi_s) + u%psi_s(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (BEMT_u_omega) + u%omega = VarVals(1) ! Scalar + case (BEMT_u_TSR) + u%TSR = VarVals(1) ! Scalar + case (BEMT_u_Vx) + u%Vx(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_Vy) + u%Vy(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_Vz) + u%Vz(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_omega_z) + u%omega_z(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_xVelCorr) + u%xVelCorr(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_rLocal) + u%rLocal(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_Un_disk) + u%Un_disk = VarVals(1) ! Scalar + case (BEMT_u_V0) + u%V0(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (BEMT_u_x_hat_disk) + u%x_hat_disk(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (BEMT_u_UserProp) + u%UserProp(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_CantAngle) + u%CantAngle(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_drdz) + u%drdz(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_u_toeAngle) + u%toeAngle(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function BEMT_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (BEMT_u_theta) + Name = "u%theta" + case (BEMT_u_chi0) + Name = "u%chi0" + case (BEMT_u_psiSkewOffset) + Name = "u%psiSkewOffset" + case (BEMT_u_psi_s) + Name = "u%psi_s" + case (BEMT_u_omega) + Name = "u%omega" + case (BEMT_u_TSR) + Name = "u%TSR" + case (BEMT_u_Vx) + Name = "u%Vx" + case (BEMT_u_Vy) + Name = "u%Vy" + case (BEMT_u_Vz) + Name = "u%Vz" + case (BEMT_u_omega_z) + Name = "u%omega_z" + case (BEMT_u_xVelCorr) + Name = "u%xVelCorr" + case (BEMT_u_rLocal) + Name = "u%rLocal" + case (BEMT_u_Un_disk) + Name = "u%Un_disk" + case (BEMT_u_V0) + Name = "u%V0" + case (BEMT_u_x_hat_disk) + Name = "u%x_hat_disk" + case (BEMT_u_UserProp) + Name = "u%UserProp" + case (BEMT_u_CantAngle) + Name = "u%CantAngle" + case (BEMT_u_drdz) + Name = "u%drdz" + case (BEMT_u_toeAngle) + Name = "u%toeAngle" + case default + Name = "Unknown Field" + end select +end function + +subroutine BEMT_VarsPackOutput(Vars, y, ValAry) + type(BEMT_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call BEMT_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine BEMT_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(BEMT_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BEMT_y_Vrel) + VarVals = y%Vrel(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_phi) + VarVals = y%phi(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_axInduction) + VarVals = y%axInduction(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_tanInduction) + VarVals = y%tanInduction(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_axInduction_qs) + VarVals = y%axInduction_qs(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_tanInduction_qs) + VarVals = y%tanInduction_qs(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_k) + VarVals = y%k(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_k_p) + VarVals = y%k_p(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_F) + VarVals = y%F(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Re) + VarVals = y%Re(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_AOA) + VarVals = y%AOA(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cx) + VarVals = y%Cx(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cy) + VarVals = y%Cy(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cz) + VarVals = y%Cz(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cmx) + VarVals = y%Cmx(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cmy) + VarVals = y%Cmy(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cmz) + VarVals = y%Cmz(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cm) + VarVals = y%Cm(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cl) + VarVals = y%Cl(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cd) + VarVals = y%Cd(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_chi) + VarVals = y%chi(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BEMT_y_Cpmin) + VarVals = y%Cpmin(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine BEMT_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(BEMT_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call BEMT_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine BEMT_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(BEMT_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BEMT_y_Vrel) + y%Vrel(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_phi) + y%phi(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_axInduction) + y%axInduction(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_tanInduction) + y%tanInduction(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_axInduction_qs) + y%axInduction_qs(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_tanInduction_qs) + y%tanInduction_qs(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_k) + y%k(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_k_p) + y%k_p(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_F) + y%F(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Re) + y%Re(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_AOA) + y%AOA(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cx) + y%Cx(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cy) + y%Cy(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cz) + y%Cz(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cmx) + y%Cmx(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cmy) + y%Cmy(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cmz) + y%Cmz(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cm) + y%Cm(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cl) + y%Cl(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cd) + y%Cd(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_chi) + y%chi(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (BEMT_y_Cpmin) + y%Cpmin(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function BEMT_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (BEMT_y_Vrel) + Name = "y%Vrel" + case (BEMT_y_phi) + Name = "y%phi" + case (BEMT_y_axInduction) + Name = "y%axInduction" + case (BEMT_y_tanInduction) + Name = "y%tanInduction" + case (BEMT_y_axInduction_qs) + Name = "y%axInduction_qs" + case (BEMT_y_tanInduction_qs) + Name = "y%tanInduction_qs" + case (BEMT_y_k) + Name = "y%k" + case (BEMT_y_k_p) + Name = "y%k_p" + case (BEMT_y_F) + Name = "y%F" + case (BEMT_y_Re) + Name = "y%Re" + case (BEMT_y_AOA) + Name = "y%AOA" + case (BEMT_y_Cx) + Name = "y%Cx" + case (BEMT_y_Cy) + Name = "y%Cy" + case (BEMT_y_Cz) + Name = "y%Cz" + case (BEMT_y_Cmx) + Name = "y%Cmx" + case (BEMT_y_Cmy) + Name = "y%Cmy" + case (BEMT_y_Cmz) + Name = "y%Cmz" + case (BEMT_y_Cm) + Name = "y%Cm" + case (BEMT_y_Cl) + Name = "y%Cl" + case (BEMT_y_Cd) + Name = "y%Cd" + case (BEMT_y_chi) + Name = "y%chi" + case (BEMT_y_Cpmin) + Name = "y%Cpmin" + case default + Name = "Unknown Field" + end select +end function + END MODULE BEMT_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/src/DBEMT_Types.f90 b/modules/aerodyn/src/DBEMT_Types.f90 index 967e43cf06..96f15f7fe9 100644 --- a/modules/aerodyn/src/DBEMT_Types.f90 +++ b/modules/aerodyn/src/DBEMT_Types.f90 @@ -33,11 +33,11 @@ MODULE DBEMT_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_frozen = -1 ! use frozen-wake for linearization (not DBEMT) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_none = 0 ! use BEMT instead (not DBEMT) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_tauConst = 1 ! use constant tau1 [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_tauVaries = 2 ! use time-dependent tau1 [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_cont_tauConst = 3 ! use continuous formulation with constant tau1 [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_frozen = -1 ! use frozen-wake for linearization (not DBEMT) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_none = 0 ! use BEMT instead (not DBEMT) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_tauConst = 1 ! use constant tau1 [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_tauVaries = 2 ! use time-dependent tau1 [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: DBEMT_cont_tauConst = 3 ! use continuous formulation with constant tau1 [-] ! ========= DBEMT_InitInputType ======= TYPE, PUBLIC :: DBEMT_InitInputType INTEGER(IntKi) :: NumBlades = 0_IntKi !< Number of blades on the turbine [-] @@ -118,7 +118,16 @@ MODULE DBEMT_Types REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: vind !< The filtered induced velocity, [1,i,j] is the axial induced velocity (-Vx*a) at node i on blade j and [2,i,j] is the tangential induced velocity (Vy*a') at node i on blade j [m/s] END TYPE DBEMT_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: DBEMT_x_element_vind = 1 ! DBEMT%element(DL%i1, DL%i2)%vind + integer(IntKi), public, parameter :: DBEMT_x_element_vind_1 = 2 ! DBEMT%element(DL%i1, DL%i2)%vind_1 + integer(IntKi), public, parameter :: DBEMT_u_AxInd_disk = 3 ! DBEMT%AxInd_disk + integer(IntKi), public, parameter :: DBEMT_u_Un_disk = 4 ! DBEMT%Un_disk + integer(IntKi), public, parameter :: DBEMT_u_R_disk = 5 ! DBEMT%R_disk + integer(IntKi), public, parameter :: DBEMT_u_element_vind_s = 6 ! DBEMT%element(DL%i1, DL%i2)%vind_s + integer(IntKi), public, parameter :: DBEMT_u_element_spanRatio = 7 ! DBEMT%element(DL%i1, DL%i2)%spanRatio + integer(IntKi), public, parameter :: DBEMT_y_vind = 8 ! DBEMT%vind + +contains subroutine DBEMT_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(DBEMT_InitInputType), intent(in) :: SrcInitInputData @@ -1414,5 +1423,252 @@ SUBROUTINE DBEMT_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, y_out%vind = a1*y1%vind + a2*y2%vind + a3*y3%vind END IF ! check if allocated END SUBROUTINE + +function DBEMT_InputMeshPointer(u, DL) result(Mesh) + type(DBEMT_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function DBEMT_OutputMeshPointer(y, DL) result(Mesh) + type(DBEMT_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine DBEMT_VarsPackContState(Vars, x, ValAry) + type(DBEMT_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call DBEMT_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine DBEMT_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(DBEMT_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (DBEMT_x_element_vind) + VarVals = x%element(DL%i1, DL%i2)%vind(V%iLB:V%iUB) ! Rank 1 Array + case (DBEMT_x_element_vind_1) + VarVals = x%element(DL%i1, DL%i2)%vind_1(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine DBEMT_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(DBEMT_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call DBEMT_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine DBEMT_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(DBEMT_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (DBEMT_x_element_vind) + x%element(DL%i1, DL%i2)%vind(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (DBEMT_x_element_vind_1) + x%element(DL%i1, DL%i2)%vind_1(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function DBEMT_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (DBEMT_x_element_vind) + Name = "x%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%vind" + case (DBEMT_x_element_vind_1) + Name = "x%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%vind_1" + case default + Name = "Unknown Field" + end select +end function + +subroutine DBEMT_VarsPackContStateDeriv(Vars, x, ValAry) + type(DBEMT_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call DBEMT_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine DBEMT_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(DBEMT_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (DBEMT_x_element_vind) + VarVals = x%element(DL%i1, DL%i2)%vind(V%iLB:V%iUB) ! Rank 1 Array + case (DBEMT_x_element_vind_1) + VarVals = x%element(DL%i1, DL%i2)%vind_1(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine DBEMT_VarsPackInput(Vars, u, ValAry) + type(DBEMT_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call DBEMT_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine DBEMT_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(DBEMT_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (DBEMT_u_AxInd_disk) + VarVals(1) = u%AxInd_disk ! Scalar + case (DBEMT_u_Un_disk) + VarVals(1) = u%Un_disk ! Scalar + case (DBEMT_u_R_disk) + VarVals(1) = u%R_disk ! Scalar + case (DBEMT_u_element_vind_s) + VarVals = u%element(DL%i1, DL%i2)%vind_s(V%iLB:V%iUB) ! Rank 1 Array + case (DBEMT_u_element_spanRatio) + VarVals(1) = u%element(DL%i1, DL%i2)%spanRatio ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine DBEMT_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(DBEMT_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call DBEMT_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine DBEMT_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(DBEMT_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (DBEMT_u_AxInd_disk) + u%AxInd_disk = VarVals(1) ! Scalar + case (DBEMT_u_Un_disk) + u%Un_disk = VarVals(1) ! Scalar + case (DBEMT_u_R_disk) + u%R_disk = VarVals(1) ! Scalar + case (DBEMT_u_element_vind_s) + u%element(DL%i1, DL%i2)%vind_s(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (DBEMT_u_element_spanRatio) + u%element(DL%i1, DL%i2)%spanRatio = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function DBEMT_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (DBEMT_u_AxInd_disk) + Name = "u%AxInd_disk" + case (DBEMT_u_Un_disk) + Name = "u%Un_disk" + case (DBEMT_u_R_disk) + Name = "u%R_disk" + case (DBEMT_u_element_vind_s) + Name = "u%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%vind_s" + case (DBEMT_u_element_spanRatio) + Name = "u%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%spanRatio" + case default + Name = "Unknown Field" + end select +end function + +subroutine DBEMT_VarsPackOutput(Vars, y, ValAry) + type(DBEMT_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call DBEMT_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine DBEMT_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(DBEMT_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (DBEMT_y_vind) + VarVals = y%vind(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine DBEMT_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(DBEMT_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call DBEMT_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine DBEMT_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(DBEMT_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (DBEMT_y_vind) + y%vind(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + end select + end associate +end subroutine + +function DBEMT_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (DBEMT_y_vind) + Name = "y%vind" + case default + Name = "Unknown Field" + end select +end function + END MODULE DBEMT_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/src/FVW.f90 b/modules/aerodyn/src/FVW.f90 index 5b519f14c8..d2fca5b80c 100644 --- a/modules/aerodyn/src/FVW.f90 +++ b/modules/aerodyn/src/FVW.f90 @@ -106,6 +106,12 @@ subroutine FVW_Init(AFInfo, InitInp, u, p, x, xd, z, OtherState, y, m, Interval, p%iNWStart=1 endif + ! Source panels (parameters, misc and constraints) + ! NOTE: needs to be before FVW_InitMiscVars otherwise number of panels not accounted for + if (len_trim(InputFileData%SrcPnlFile)>0) then + call srcPnl_init(p%SrcPnl, m%SrcPnl, z%SrcPnl, ErrStat2, ErrMsg2, filename=InputFileData%SrcPnlFile); if(Failed()) return + endif + ! Initialize Misc Vars (may depend on input file) CALL FVW_InitMiscVars( p, m, ErrStat2, ErrMsg2 ); if(Failed()) return @@ -148,8 +154,19 @@ subroutine FVW_Init(AFInfo, InitInp, u, p, x, xd, z, OtherState, y, m, Interval, interval = InitInp%DTAero ! important, gluecode and UA, needs proper interval call UA_Init_Wrapper(AFInfo, InitInp, interval, p, x, xd, OtherState, m, ErrStat2, ErrMsg2); if (Failed()) return + ! --- Other States + OtherState%Initialized = .true. + OtherState%ShedScale = 1.0_ReKi ! Will be overriden + ! TODO: should be otherstate + !m%FirstCall = .True. + !m%nNW = p%iNWStart-1 ! Number of active nearwake panels + !m%nFW = 0 ! Number of active farwake panels + !m%iStep = 0 ! Current step number + !m%VTKstep = -1 ! Counter of VTK outputs + !m%VTKlastTime = -HUGE(1.0_DbKi) + !m%OldWakeTime = -HUGE(1.0_DbKi) + ! Framework types unused - OtherState%Dummy = 0 xd%Dummy = 0 InitOut%Dummy = 0 CONTAINS @@ -267,6 +284,8 @@ subroutine FVW_InitMiscVars( p, m, ErrStat, ErrMsg ) endif m%GridOutputs(iGrid)%tLastOutput = -HUGE(1.0_DbKi) enddo + ! Panels + nMax = nMax + p%SrcPnl%n call AllocAry( m%r_wind, 3, nMax, 'Requested wind points', ErrStat2, ErrMsg2 );call SetErrStat ( ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName ) m%r_wind = 0.0_ReKi ! set to zero so InflowWind can shortcut calculations @@ -362,6 +381,7 @@ subroutine FVW_SetParametersFromInputs( InitInp, p, ErrStat, ErrMsg ) ! p%nWings = size(InitInp%WingsMesh) p%DTaero = InitInp%DTaero ! AeroDyn Time step + p%AirDens = InitInp%AirDens ! Air Density p%KinVisc = InitInp%KinVisc ! Kinematic air viscosity p%MHK = InitInp%MHK ! MHK flag p%WtrDpth = InitInp%WtrDpth ! Water depth @@ -421,6 +441,8 @@ SUBROUTINE FVW_SetParametersFromInputFile( InputFileData, p, ErrStat, ErrMsg ) character(ErrMsgLen) :: ErrMsg2 ErrStat = ErrID_None ErrMsg = "" + errStat2 = ErrID_None + errMsg2 = "" ! Set parameters from input file p%IntMethod = InputFileData%IntMethod @@ -451,26 +473,32 @@ SUBROUTINE FVW_SetParametersFromInputFile( InputFileData, p, ErrStat, ErrMsg ) do iW=1,p%nWings if (allocated(p%W(iW)%PrescribedCirculation)) deallocate(p%W(iW)%PrescribedCirculation) if (InputFileData%CircSolvMethod==idCircPrescribed) then - call AllocAry(p%W(iW)%PrescribedCirculation, p%W(iW)%nSpan, 'Prescribed Circulation', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,'FVW_SetParameters'); + call AllocAry(p%W(iW)%PrescribedCirculation, p%W(iW)%nSpan, 'Prescribed Circulation', ErrStat2, ErrMsg2); if(Failed()) return p%W(iW)%PrescribedCirculation = -999999_ReKi; if (.not. allocated(p%W(iW)%s_CP)) then - ErrMsg = 'Spanwise coordinate not allocated.' - ErrStat = ErrID_Fatal - return + ErrMsg2 = 'Spanwise coordinate not allocated.' + ErrStat2 = ErrID_Fatal + if (Failed()) return endif - call ReadAndInterpGamma(trim(InputFileData%CirculationFile), p%W(iW)%s_CP(1:p%W(iW)%nSpan), p%W(iW)%s_LL(p%W(iW)%nSpan+1), p%W(iW)%PrescribedCirculation, ErrStat2, ErrMsg2) - call SetErrStat ( ErrStat2, ErrMsg2, ErrStat,ErrMsg,'FVW_SetParameters' ); + call ReadAndInterpGamma(trim(InputFileData%CirculationFile), p%W(iW)%s_CP(1:p%W(iW)%nSpan), p%W(iW)%s_LL(p%W(iW)%nSpan+1), p%W(iW)%PrescribedCirculation, ErrStat2, ErrMsg2); if(Failed()) return endif enddo - + if(Failed()) return +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'FVW_SetParametersFromInputFile') + Failed = ErrStat >= AbortErrLev + end function Failed end subroutine FVW_SetParametersFromInputFile !---------------------------------------------------------------------------------------------------------------------------------- -!> This routine is called at the end of the simulation. -subroutine FVW_FinalWrite(u, p, x, z, m, ErrStat, ErrMsg) +!> This routine is called at the end of the simulation. +!! NOTE: we don't want to call this if OLAF is not fully initialized as some variables might be unallocated +subroutine FVW_FinalWrite(u, p, x, z, OtherState, m, ErrStat, ErrMsg) type(FVW_InputType), intent(in ) :: u !< System inputs type(FVW_ParameterType), intent(in ) :: p !< Parameters type(FVW_ContinuousStateType), intent(in ) :: x !< Continuous states type(FVW_ConstraintStateType), intent(in ) :: z !< Constraint states + type(FVW_OtherStateType), intent(inout) :: OtherState !< Input: Other states at t; Output: at t+DTaero type(FVW_MiscVarType), intent(inout) :: m !< Misc/optimization variables integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -479,7 +507,7 @@ subroutine FVW_FinalWrite(u, p, x, z, m, ErrStat, ErrMsg) ErrStat = ErrID_None ErrMsg = "" ! Place any last minute operations or calculations here: - if (p%WrVTK>0 .and. m%VTKstep0 .and. m%VTKstep This is a tight coupling routine for solving for the residual of the constraint state functions. +!> Solves for the residual of the constraint state functions. +!! Constraints are: +!! - Lifting line circulation +!! - Intensity of the source panels +!! In theory, we should solve for both at the same time, or iterate between the two +!! Here, we do it sequentially, and only once. subroutine FVW_CalcConstrStateResidual( t, u, p, x, xd, z_guess, OtherState, m, z_out, AFInfo, ErrStat, ErrMsg, iLabel) real(DbKi), intent(in ) :: t !< Current simulation time in seconds type(FVW_InputType), intent(in ) :: u !< Inputs at t type(FVW_ParameterType), intent(in ) :: p !< Parameters - type(FVW_ContinuousStateType), intent(in ) :: x !< Continuous states at t + type(FVW_ContinuousStateType), intent(inout) :: x !< Continuous states at t. NOTE: inout because of LL mapping for panels type(FVW_DiscreteStateType), intent(in ) :: xd !< Discrete states at t type(FVW_ConstraintStateType), intent(in ) :: z_guess !< Constraint states at t (possibly a guess) type(FVW_OtherStateType), intent(in ) :: OtherState !< Other states at t @@ -1336,7 +1367,9 @@ subroutine FVW_CalcConstrStateResidual( t, u, p, x, xd, z_guess, OtherState, m, integer(IntKi), intent(in ) :: iLabel integer(IntKi), intent( OUT) :: ErrStat !< Error status of the operation character(*), intent( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - integer :: iW + integer :: iW + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 ! Initialize ErrStat ErrStat = ErrID_None @@ -1350,16 +1383,45 @@ subroutine FVW_CalcConstrStateResidual( t, u, p, x, xd, z_guess, OtherState, m, ! Solve for the residual of the constraint state functions here: !z%residual = 0.0_ReKi !z%W(iW)%Gamma_LL = 0.0_ReKi + !if (.not.allocated(z_out%W)) allocate(z_out%W(p%nWings)) allocate(z_out%W(p%nWings)) do iW= 1,p%nWings - call AllocAry( z_out%W(iW)%Gamma_LL, p%W(iW)%nSpan, 'Lifting line Circulation', ErrStat, ErrMsg ); + call AllocAry( z_out%W(iW)%Gamma_LL, p%W(iW)%nSpan, 'Lifting line Circulation', ErrStat2, ErrMsg2); z_out%W(iW)%Gamma_LL = -999999_ReKi; enddo - CALL Wings_ComputeCirculation(t, z_out, z_guess, p, x, m, AFInfo, ErrStat, ErrMsg, iLabel) + CALL Wings_ComputeCirculation(t, z_out, z_guess, p, x, m, AFInfo, ErrStat2, ErrMsg2, iLabel); if(Failed()) return + + ! ---- Source panels + if (p%SrcPnl%n>0) then + if (mod(m%iStep, p%nSrcPnlUpdate)==0 .or. m%iStep<3) then + ! NOTE: panels don't move for now, so no need to recompute influence matrix + ! call srcPnl_build_mat(p%SrcPnl, m%SrcPnl%AI) + + ! Map LL circulation to states + call Map_LL_NW(p, m, z_out, x, OtherState%ShedScale, errStat2, errMsg2); if(Failed()) return + + ! Compute Wind (Uwnd) and induced velocity (Uext) from elements different than panels + ! NOTE: Both are summed and stored into Uext + call srcPnl_ExtVelocities_OnPanels(u, p, x, m, errStat2, errMsg2); if(Failed()) return + !m%SrcPnl%Uext = 0.0_ReKi ! HACK + !m%SrcPnl%Uwnd = (/1.0, 0., 0./) + + ! Compute the value of the source panel (sigma) ! assumes that Uext and AI were computed before + if (.not.allocated(z_out%SrcPnl%Sigma)) allocate(z_out%SrcPnl%Sigma(p%SrcPnl%n)) + z_out%SrcPnl%Sigma = 0.0_ReKi + call srcPnl_solve(p%SrcPnl, m%SrcPnl, z_out%SrcPnl, errStat2, errMsg2); if(Failed()) return + else + z_out%SrcPnl%Sigma = m%SrcPnl%RHS ! Use previous intensities + endif + endif - if(.false.) print*,OtherState%Dummy !unused var if(.false.) print*,xd%Dummy +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'FVW_CalcConstrStateResidual') + Failed = ErrStat >= AbortErrLev + end function Failed end subroutine FVW_CalcConstrStateResidual @@ -1445,6 +1507,11 @@ subroutine FVW_CalcOutput(t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg) ! Compute induced velocity at AD nodes call CalcOutputForAD(u,p,x,y,m, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! --- Source Panels: Compute velocity, pressure, loads on the source panels + if (p%SrcPnl%n>0) then + call srcPnl_calcOutput(p%SrcPnl, m%SrcPnl, z%SrcPnl, p%AirDens) + endif ! Write some info to screen when major milestone achieved if (m%iStep == p%nNWFree .and. p%nNWFree0) then @@ -1553,6 +1620,7 @@ subroutine WriteVTKOutputs(t, force, VTKstep, u, p, x, z, m, ErrStat, ErrMsg) endif enddo endif + if (OLAF_PROFILING) call toc() end subroutine WriteVTKOutputs !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/aerodyn/src/FVW_BiotSavart.f90 b/modules/aerodyn/src/FVW_BiotSavart.f90 index 99dc7d0aca..fcc301511d 100644 --- a/modules/aerodyn/src/FVW_BiotSavart.f90 +++ b/modules/aerodyn/src/FVW_BiotSavart.f90 @@ -2,12 +2,13 @@ !! NOTE: these functions should be independent of the framework types module FVW_BiotSavart - use NWTC_Library, only: ReKi, IntKi + use NWTC_Library, only: ReKi, IntKi, Pi, EqualRealNos use OMP_LIB implicit none real(ReKi),parameter :: PRECISION_UI = epsilon(1.0_ReKi)/100 !< NOTE assuming problem of size 1 + real(ReKi),parameter :: PRECISION_EPS = epsilon(1.0_ReKi) !< Machine Precision For the given ReKi for problems of scale 1! real(ReKi),parameter :: MIN_EXP_VALUE=-10.0_ReKi real(ReKi),parameter :: MINDENOM=0.0_ReKi ! real(ReKi),parameter :: MINDENOM=1e-15_ReKi @@ -24,6 +25,7 @@ module FVW_BiotSavart integer(IntKi), parameter, dimension(3) :: idRegPartVALID = (/idRegNone,idRegExp,idRegCompact/) real(ReKi),parameter :: fourpi_inv = 0.25_ReKi / ACOS(-1.0_Reki ) + real(ReKi),parameter :: fourpi = 4.00_ReKi * ACOS(-1.0_Reki ) contains @@ -48,55 +50,61 @@ subroutine ui_seg_11(DeltaPa, DeltaPb, SegGamma, RegFunction, RegParam1, Uind) real(ReKi) :: xa, ya, za, xb, yb, zb !< Coordinates of X-Xa and X-Xb real(ReKi) :: exp_value !< ! - Uind(1:3)=0.0_ReKi + Uind(1:3) = 0.0_ReKi xa=DeltaPa(1); ya=DeltaPa(2); za=DeltaPa(3) xb=DeltaPb(1); yb=DeltaPb(2); zb=DeltaPb(3) norm_a = sqrt(xa*xa + ya*ya + za*za) norm_b = sqrt(xb*xb + yb*yb + zb*zb) denominator = norm_a*norm_b*(norm_a*norm_b + xa*xb+ya*yb+za*zb) ! |r1|*|r2|*(|r1|*|r2| + r1.r2) - if (denominator>PRECISION_UI) then - crossprod(1) = ya*zb-za*yb; crossprod(2) = za*xb-xa*zb; crossprod(3) = xa*yb-ya*xb - norm2_orth = crossprod(1)**2 + crossprod(2)**2 + crossprod(3)**2 - if (norm2_orth>PRECISION_UI) then ! On the singularity, Uind(1:3)=0.0_ReKi - norm2_r0 = (xa-xb)*(xa-xb) + (ya-yb)*(ya-yb) +(za-zb)*(za-zb) - if (norm2_r0>PRECISION_UI) then ! segment of zero length - ! --- Far field TODO - ! --- Regularization (close field) - norm2_orth = norm2_orth/norm2_r0 ! d = (r1xr2)/r0 - select case (RegFunction) ! - case ( idRegNone ) ! No vortex core model - Kv=1.0_ReKi - case ( idRegRankine ) ! Rankine - r_bar2 = norm2_orth/ RegParam1**2 - if (r_bar2<1) then - Kv=r_bar2 - else - Kv=1.0_ReKi - end if - case ( idRegLambOseen ) ! Lamb-Oseen - r_bar2 = norm2_orth/ RegParam1**2 - exp_value = -1.25643_ReKi*r_bar2 - if(exp_valuePRECISION_UI) then - crossprod(1) = ya*zb-za*yb; crossprod(2) = za*xb-xa*zb; crossprod(3) = xa*yb-ya*xb - norm2_orth = crossprod(1)**2 + crossprod(2)**2 + crossprod(3)**2 - if (norm2_orth>PRECISION_UI) then ! On the singularity, Uind(1:3)=0.0_ReKi - norm2_r0 = (xa-xb)*(xa-xb) + (ya-yb)*(ya-yb) +(za-zb)*(za-zb) - if (norm2_r0>PRECISION_UI) then - ! --- Far field TODO - ! --- Regularization (close field) --- Vatistas - norm2_orth = norm2_orth/norm2_r0 ! d = (r1xr2)/r0 - r_bar2 = norm2_orth/RegParam(is)**2 - Kv = r_bar2/sqrt(1+r_bar2**2) - Kv = SegGamma(is)*fourpi_inv*Kv*(norm_a+norm_b)/(denominator + MINDENOM) - Uind(1:3) = Kv*crossprod(1:3) - end if - end if ! denominator size or distances too small - end if ! - Uind_out(1:3,icp) = Uind_out(1:3,icp)+Uind(1:3) + ! denominator size or distances too small + if (denominator <= PRECISION_UI) cycle + crossprod(1) = ya*zb-za*yb; crossprod(2) = za*xb-xa*zb; crossprod(3) = xa*yb-ya*xb + norm2_orth = crossprod(1)**2 + crossprod(2)**2 + crossprod(3)**2 + ! On the singularity, cycle + if (norm2_orth <= PRECISION_UI) cycle + norm2_r0 = (xa-xb)*(xa-xb) + (ya-yb)*(ya-yb) +(za-zb)*(za-zb) + ! segment of zero length + if (norm2_r0 <= PRECISION_UI) cycle + ! --- Far field TODO + ! --- Regularization (close field) --- Vatistas + norm2_orth = norm2_orth/norm2_r0 ! d = (r1xr2)/r0 + r_bar2 = norm2_orth/RegParam(is)**2 + Kv = r_bar2/sqrt(1.0_ReKi+r_bar2**2) + Kv = SegGamma(is)*fourpi_inv*Kv*(norm_a+norm_b)/(denominator + MINDENOM) + Uind(1:3) = Uind(1:3) + Kv*crossprod(1:3) end do ! Loop on segments + Uind_out(1:3,icp) = Uind_out(1:3,icp) + Uind(1:3) enddo ! Loop on control points !$OMP END DO !$OMP END PARALLEL case ( idRegOffset ) ! Denominator offset !$OMP PARALLEL default(shared) - !$OMP do private(icp,is,Uind,P1,P2,crossprod,denominator,r_bar2,Kv,norm_a,norm_b,norm2_r0,norm2_orth,xa,ya,za,xb,yb,zb) schedule(runtime) + !$OMP do private(icp,is,CPs_icp,Uind,P1,P2,crossprod,denominator,r_bar2,Kv,norm_a,norm_b,norm2_r0,norm2_orth,xa,ya,za,xb,yb,zb) schedule(runtime) do icp=iCPStart,iCPEnd ! loop on CPs + Uind = 0.0_ReKi + CPs_icp = CPs(:,icp) do is=iSegStart,iSegEnd ! loop on selected segments - Uind = 0.0_ReKi P1 = SegPoints(1:3, SegConnct(1,is)) ! Segment extremity points P2 = SegPoints(1:3, SegConnct(2,is)) - xa=CPs(1,icp)-P1(1); ya=CPs(2,icp)-P1(2); za=CPs(3,icp)-P1(3); - xb=CPs(1,icp)-P2(1); yb=CPs(2,icp)-P2(2); zb=CPs(3,icp)-P2(3); + xa=CPs_icp(1)-P1(1); ya=CPs_icp(2)-P1(2); za=CPs_icp(3)-P1(3); + xb=CPs_icp(1)-P2(1); yb=CPs_icp(2)-P2(2); zb=CPs_icp(3)-P2(3); norm_a = sqrt(xa*xa + ya*ya + za*za) norm_b = sqrt(xb*xb + yb*yb + zb*zb) denominator = norm_a*norm_b*(norm_a*norm_b + xa*xb+ya*yb+za*zb) @@ -307,12 +321,12 @@ subroutine ui_seg(iCPStart, iCPEnd, CPs, & ! --- Regularization (close field) -- Offset denominator = denominator+RegParam(is)**2*norm2_r0 Kv = SegGamma(is)*fourpi_inv*(norm_a+norm_b)/(denominator + MINDENOM) - Uind(1:3) = Kv*crossprod(1:3) + Uind(1:3) = Uind(1:3) + Kv*crossprod(1:3) end if end if ! denominator size or distances too small end if ! - Uind_out(1:3,icp) = Uind_out(1:3,icp)+Uind(1:3) end do ! Loop on segments + Uind_out(1:3,icp) = Uind_out(1:3,icp)+Uind(1:3) enddo ! Loop on control points !$OMP END DO !$OMP END PARALLEL @@ -429,4 +443,176 @@ subroutine ui_quad_n1(CPs, nCPs, P1, P2, P3, P4, Gamm, RegFunction, RegParam, Ui !OMP END PARALLEL end subroutine ui_quad_n1 + +subroutine ui_quad_src_11(CP, Sigma, xi, eta, RefPoint, R_g2p, UI) + real(ReKi), intent(in) :: Sigma !< Source panel intensity + real(ReKi), dimension(3), intent(in) :: CP !< Control Point + real(ReKi), dimension(3), intent(out) :: UI !< Induced velocity + real(ReKi), dimension(3), intent(in) :: RefPoint !< Coordinate of panel origin in ref coordinates + real(ReKi), dimension(4), intent(in) :: xi !< Panel points coordinates + real(ReKi), dimension(4), intent(in) :: eta !< Panel points coordinates + real(ReKi), dimension(3,3), intent(in) :: R_g2p !< 3 x 3, global 2 panel + real(ReKi),parameter :: eps_quadsource=1e-6_ReKi !!!!!!!!!!!!!!!!!! !< Used if z coordinate close to zero + real(ReKi), dimension(3,3) :: tA !< + real(ReKi) :: d12, d23, d34, d41 !< + real(ReKi) :: m12, m23, m34, m41 !< + real(ReKi) :: xi1, xi2, xi3, xi4 !< + real(ReKi) :: eta1, eta2, eta3, eta4 !< + real(ReKi) :: e1, e2, e3, e4 !< + real(ReKi) :: h1, h2, h3, h4 !< + real(ReKi) :: r1, r2, r3, r4 !< + real(ReKi) :: RJ12, RJ23, RJ34, RJ41 !< + real(ReKi) :: TAN12, TAN23, TAN34, TAN41 !< + real(ReKi), dimension(3) :: Vp !< + real(ReKi), dimension(3) :: DP !< + real(ReKi), dimension(3) :: DPp !< + xi1=xi(1) + xi2=xi(2) + xi3=xi(3) + xi4=xi(4) + eta1=eta(1) + eta2=eta(2) + eta3=eta(3) + eta4=eta(4) + !param that are constant for each panel, distances and slopes - The slopes can be if divided by zero NaN => security required + d12 = sqrt((xi2-xi1)**2+(eta2-eta1)**2) + d23 = sqrt((xi3-xi2)**2+(eta3-eta2)**2) + d34 = sqrt((xi4-xi3)**2+(eta4-eta3)**2) + d41 = sqrt((xi1-xi4)**2+(eta1-eta4)**2) + + ! transform control points in panel coordinate system using matrix + DP(1:3) = CP(1:3)-RefPoint(1:3) + DPp = matmul(R_g2p, DP) ! transfo in element coordinate system, noted x,y,z, but in fact xi eta zeta + ! scalars + r1 = sqrt((DPp(1)-xi1)**2 + (DPp(2)-eta1)**2 + DPp(3)**2) + r2 = sqrt((DPp(1)-xi2)**2 + (DPp(2)-eta2)**2 + DPp(3)**2) + r3 = sqrt((DPp(1)-xi3)**2 + (DPp(2)-eta3)**2 + DPp(3)**2) + r4 = sqrt((DPp(1)-xi4)**2 + (DPp(2)-eta4)**2 + DPp(3)**2) + ! + e1 = DPp(3)**2 + (DPp(1)-xi1)**2 + e2 = DPp(3)**2 + (DPp(1)-xi2)**2 + e3 = DPp(3)**2 + (DPp(1)-xi3)**2 + e4 = DPp(3)**2 + (DPp(1)-xi4)**2 + ! + h1 = (DPp(2)-eta1)*(DPp(1)-xi1) + h2 = (DPp(2)-eta2)*(DPp(1)-xi2) + h3 = (DPp(2)-eta3)*(DPp(1)-xi3) + h4 = (DPp(2)-eta4)*(DPp(1)-xi4) + ! Velocities in element frame + ! --- Log term + ! Security - Katz Plotkin page 608 appendix D Code 11 + if ( r1+r2-d12<=0.0_ReKi .or. d12 <=0.0_ReKi ) then + RJ12=0._ReKi + else + RJ12=1/d12 * log((r1+r2-d12)/(r1+r2+d12)) + endif + + if ( r2+r3-d23<=0.0_ReKi .or. d23 <=0.0_ReKi ) then + RJ23=0._ReKi + else + RJ23=1/d23 * log((r2+r3-d23)/(r2+r3+d23)) + endif + + if ( r3+r4-d34<=0.0_ReKi .or. d34 <=0.0_ReKi ) then + RJ34=0._ReKi + else + RJ34=1/d34 * log((r3+r4-d34)/(r3+r4+d34)) + endif + + if ( r4+r1-d41<=0.0_ReKi .or. d41 <=0.0_ReKi ) then + RJ41=0._ReKi + else + RJ41=1/d41 * log((r4+r1-d41)/(r4+r1+d41)) + endif + ! --- Tan term + ! 12 + if (EqualRealNos(xi2,xi1)) then ! Security - Hess 1962 - page 47 - bottom + TAN12=0._ReKi + else + m12=(eta2-eta1)/(xi2-xi1) + if( abs(DPp(3)) Induced velocity by several flat quadrilateral source panels on multiple control points (CPs) +subroutine ui_quad_src_nn(CPs, Sigmas, xi, eta, RefPoint, R_g2p, UI, nCPs, nPanels) + integer, intent(in) :: nCPs + integer, intent(in) :: nPanels + real(ReKi), dimension(3,nCPs), intent(in) :: CPs !< 3 x nCPs, coordinates of the control points + real(ReKi), dimension(3,nCPs), intent(inout) :: UI !< 3 x nCPs, induced velocity on control points (side effects) + real(ReKi), dimension(nPanels), intent(in) :: Sigmas !< np, intensities of Panels + real(ReKi), dimension(3,nPanels), intent(in) :: RefPoint !< 3 x np , coordinate of panel origin in ref coordinates + real(ReKi), dimension(4,nPanels), intent(in) :: xi !< 4 x np + real(ReKi), dimension(4,nPanels), intent(in) :: eta !< 4 x np + real(ReKi), dimension(3,3,nPanels), intent(in) :: R_g2p !< 3 x 3 x np, transformation matrix global to panel + real(ReKi) :: Uind_tmp(3) !< + real(ReKi) :: Uind_cum(3) !< + integer :: ip, icp !< loop index + !$OMP PARALLEL DEFAULT(SHARED) + !$OMP DO PRIVATE(icp, Uind_cum, Uind_tmp, ip) schedule(runtime) + do icp=1,nCPs ! loop on Control Points + Uind_cum = 0.0_ReKi + do ip=1,nPanels !loop on panels + call ui_quad_src_11(CPs(:,icp), Sigmas(ip), xi(:,ip), eta(:,ip), RefPoint(:,ip), R_g2p(:,:,ip), Uind_tmp) + Uind_cum = Uind_cum + Uind_tmp + enddo + UI(1:3,icp) = UI(1:3,icp) + Uind_cum + end do ! control points + !$OMP END DO + !$OMP END PARALLEL +end subroutine ui_quad_src_nn + +elemental real(ReKi) function signit(ref, val) + real(ReKi),intent(in) ::ref + real(ReKi),intent(in) ::val + if ( abs(val)>PRECISION_EPS ) then + signit = sign(ref, val) + else + signit = 1.0_ReKi + endif +endfunction + end module FVW_BiotSavart diff --git a/modules/aerodyn/src/FVW_IO.f90 b/modules/aerodyn/src/FVW_IO.f90 index 48580e578e..4cde5064d4 100644 --- a/modules/aerodyn/src/FVW_IO.f90 +++ b/modules/aerodyn/src/FVW_IO.f90 @@ -24,6 +24,7 @@ SUBROUTINE FVW_ReadInputFile( FileName, p, m, Inp, ErrStat, ErrMsg ) character(ErrMsgLen) :: ErrMsg2 ErrStat = ErrID_None ErrMsg = "" + Inp%SrcPnlFile = '' ! TODO registry init for empty strings ! Open file CALL GetNewUnit( UnIn ) CALL OpenFInpfile(UnIn, TRIM(FileName), ErrStat2, ErrMsg2) @@ -117,37 +118,50 @@ SUBROUTINE FVW_ReadInputFile( FileName, p, m, Inp, ErrStat, ErrMsg ) if(ErrStat2==ErrID_None) then call WrScr(' - Reading advanced options for OLAF:') do while(ErrStat2==ErrID_None) - read(UnIn, '(A)', iostat=ErrStat2) sDummy + read(UnIn, '(A)', iostat=ErrStat2) sLine if (ErrStat2/=ErrID_None) exit + sDummy = sLine call Conv2UC(sDummy) ! to uppercase if (index(sDummy, '!') == 1 .or. index(sDummy, '=') == 1 .or. index(sDummy, '#') == 1) then ! pass comment lines elseif (index(sDummy, 'INDUCTIONATCP')>1) then - read(sDummy, '(L1)') p%InductionAtCP + read(sLine, '(L1)') p%InductionAtCP print*,' >>> InductionAtCP ',p%InductionAtCP elseif (index(sDummy, 'WAKEATTE')>1) then - read(sDummy, '(L1)') p%WakeAtTE + read(sLine, '(L1)') p%WakeAtTE print*,' >>> WakeAtTE ',p%WakeAtTE elseif (index(sDummy, 'DSTALLONWAKE')>1) then - read(sDummy, '(L1)') p%DStallOnWake + read(sLine, '(L1)') p%DStallOnWake print*,' >>> DStallOnWake ',p%DStallOnWake elseif (index(sDummy, 'INDUCTION')>1) then - read(sDummy, '(L1)') p%Induction + read(sLine, '(L1)') p%Induction print*,' >>> Induction ',p%Induction elseif (index(sDummy, 'KFROZENNWEND')>1) then - read(sDummy, *) p%kFrozenNWEnd + read(sLine, *) p%kFrozenNWEnd print*,' >>> kFrozenNWEnd ',p%kFrozenNWEnd elseif (index(sDummy, 'KFROZENNWSTART')>1) then - read(sDummy, *) p%kFrozenNWStart + read(sLine, *) p%kFrozenNWStart print*,' >>> kFrozenNWStart ',p%kFrozenNWStart elseif (index(sDummy, 'VELOCITYMETHODLL')>1) then - read(sDummy, *) Inp%VelocityMethod(2) + read(sLine, *) Inp%VelocityMethod(2) print*,' >>> VelocityMethod ',Inp%VelocityMethod elseif (index(sDummy, 'TREEBRANCHFACTORLL')>1) then - read(sDummy, *) Inp%TreeBranchFactor(2) + read(sLine, *) Inp%TreeBranchFactor(2) print*,' >>> TreeBranchFactor ',Inp%TreeBranchFactor + elseif (index(sDummy, 'SRCPNLFILE')>1) then + read(sLine, *) Inp%SrcPnlFile + print*,' >>> SrcPnlFile ',trim(Inp%SrcPnlFile) + elseif (index(sDummy, 'ZGROUNDPUSH')>1) then + read(sLine, *) p%zGroundPush + print*,' >>> zGroundPush ',p%zGroundPush + elseif (index(sDummy, 'ZGROUND')>1) then + read(sLine, *) p%zGround + print*,' >>> zGround ',p%zGround + elseif (index(sDummy, 'NSRCPNLUPDATE')>1) then + read(sLine, *) p%nSrcPnlUpdate + print*,' >>> nSrcPnlUpdate ',p%nSrcPnlUpdate else - print*,'[WARN] Line ignored: '//trim(sDummy) + print*,'[WARN] Line ignored: '//trim(sLine) endif enddo endif @@ -453,8 +467,15 @@ subroutine WrVTK_FVW(p, x, z, m, FileRootName, VTKcount, Twidth, bladeFrame, Hub nSeg = 2*nSeg nSegP = 2*nSegP endif - Filename = TRIM(FileRootName)//'.AllSeg.'//Tstr//'.vtk' - CALL WrVTK_Segments(Filename, mvtk, m%Sgmt%Points(:,1:nSegP), m%Sgmt%Connct(:,1:nSeg), m%Sgmt%Gamma(1:nSeg), m%Sgmt%Epsilon(1:nSeg), bladeFrame) + if (nSeg>0) then + Filename = TRIM(FileRootName)//'.AllSeg.'//Tstr//'.vtk' + CALL WrVTK_Segments(Filename, mvtk, m%Sgmt%Points(:,1:nSegP), m%Sgmt%Connct(:,1:nSeg), m%Sgmt%Gamma(1:nSeg), m%Sgmt%Epsilon(1:nSeg), bladeFrame) + endif + + if (p%SrcPnl%n>0) then + Filename = TRIM(FileRootName)//'.SrcPnl.'//Tstr//'.vtk' + CALL WrVTK_Panels(Filename, mvtk, p%SrcPnl, m%SrcPnl, z%SrcPnl) + endif if(.false.) print*,z%W(1)%Gamma_LL(1) ! unused var for now end subroutine WrVTK_FVW @@ -511,6 +532,42 @@ subroutine WrVTK_FVW_Grid(p, m, iGrid, FileRootName, VTKcount, Twidth, HubOrient end subroutine WrVTK_FVW_Grid +subroutine WrVTK_Panels(filename, mvtk, p, m, z) + use VTK + character(len=*), intent(in) :: filename + type(VTK_Misc), intent(inout) :: mvtk !< miscvars for VTK output + type(T_SrcPanlParam), intent(in) :: p + type(T_SrcPanlMisc) , intent(in) :: m + type(T_SrcPanlVar) , intent(in) :: z + if ( vtk_new_ascii_file(trim(filename), 'SourcePanels '//trim(p%Comment), mvtk) ) then + call vtk_dataset_polydata(p%P, mvtk, bladeFrame=.false.) + call vtk_quad(p%IDs-1, mvtk) + call vtk_cell_data_init(mvtk) + if (.not. allocated(z%Sigma)) then ! First time step + call vtk_cell_data_scalar(m%RHS ,'Intensities', mvtk) + else + call vtk_cell_data_scalar(z%Sigma ,'Intensities', mvtk) + endif + call vtk_cell_data_scalar(p%BodyIDs,'BodyID' , mvtk) + call vtk_cell_data_scalar(m%Cp ,'Cp' , mvtk) + call vtk_cell_data_scalar(m%p ,'p' , mvtk) + call vtk_cell_data_scalar(p%Area ,'Area' , mvtk) + call vtk_cell_data_vector(m%F ,'F' , mvtk) + call vtk_cell_data_vector(m%FpA ,'F/A' , mvtk) + call vtk_cell_data_vector(p%Pmid ,'Pmid' , mvtk) + call vtk_cell_data_vector(p%Pcent ,'Pcent' , mvtk) + call vtk_cell_data_vector(m%Uwnd ,'Uwnd' , mvtk) + call vtk_cell_data_vector(m%Uext ,'Uext' , mvtk) + call vtk_cell_data_vector(m%Uind ,'Uind' , mvtk) + call vtk_cell_data_vector(m%Utot ,'Utot' , mvtk) + call vtk_cell_data_vector(p%Normal ,'Normal' , mvtk) + !call vtk_cell_data_vector(p%Ts ,'Ts',mvtk) + !call vtk_cell_data_vector(p%Tc ,'Tc',mvtk) + !call vtk_cell_data_vector(p%To ,'To',mvtk) + call vtk_close_file(mvtk) + endif +endsubroutine WrVTK_Panels + subroutine WrVTK_Segments(filename, mvtk, SegPoints, SegConnct, SegGamma, SegEpsilon, bladeFrame) use VTK diff --git a/modules/aerodyn/src/FVW_Registry.txt b/modules/aerodyn/src/FVW_Registry.txt index bdfef5796e..45a7aff474 100644 --- a/modules/aerodyn/src/FVW_Registry.txt +++ b/modules/aerodyn/src/FVW_Registry.txt @@ -22,9 +22,9 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi xEnd - - - "xEnd" - typedef ^ ^ ReKi yEnd - - - "yEnd" - typedef ^ ^ ReKi zEnd - - - "zEnd" - -typedef ^ ^ IntKi nx - - - "nx" - -typedef ^ ^ IntKi ny - - - "ny" - -typedef ^ ^ IntKi nz - - - "nz" - +typedef ^ ^ IntKi nx - 0 - "nx" - +typedef ^ ^ IntKi ny - 0 - "ny" - +typedef ^ ^ IntKi nz - 0 - "nz" - typedef ^ ^ ReKi uGrid {:}{:}{:}{:} - - "Grid velocity 3 x nz x ny x nx" - typedef ^ ^ ReKi omGrid {:}{:}{:}{:} - - "Grid vorticity 3 x nz x ny x nx" - typedef ^ ^ DbKi tLastOutput - - - "Last output time" - @@ -35,15 +35,43 @@ typedef ^ ^ IntKi typedef ^ ^ ReKi Gamma : - - "Segment circulations" - typedef ^ ^ ReKi Epsilon : - - "Segment regularization parameter" - typedef ^ ^ IntKi RegFunction - - - "Type of regularizaion function (LambOseen, Vatistas, see FVW_BiotSavart)" - -typedef ^ ^ IntKi nAct - - - "Number of active segments" - -typedef ^ ^ IntKi nActP - - - "Number of active segment points" - +typedef ^ ^ IntKi nAct - 0 - "Number of active segments" - +typedef ^ ^ IntKi nActP - 0 - "Number of active segment points" - # TODO add tree ##################### Particles ############### typedef FVW/FVW T_Part ReKi P :: - - "Particle Points" - typedef ^ ^ ReKi Alpha :: - - "Particle intensity 3 x nP" - typedef ^ ^ ReKi RegParam : - - "Particle regularization parameter" - typedef ^ ^ IntKi RegFunction - - - "Type of regularizaion function (FVW_BiotSavart)" - -typedef ^ ^ IntKi nAct - - - "Number of active particles <=nP" - +typedef ^ ^ IntKi nAct - 0 - "Number of active particles <=nP" - +##################### Panels ############### +typedef FVW/FVW T_SrcPanlParam IntKi n - 0 - "Number of panels" - +typedef ^ ^ CHARACTER(1024) Comment - "" - "Area" - +typedef ^ ^ ReKi Area : - - "Area" - +typedef ^ ^ ReKi P :: - - "Points database" - +typedef ^ ^ IntKi IDs :: - - "Points connectivity ID for each panel 4xnPn" - +typedef ^ ^ IntKi BodyIDs : - - "Body ID for each panel" - +typedef ^ ^ ReKi Pcent :: - - "Centroid point" - +typedef ^ ^ ReKi Pmid :: - - "Mid point" - +typedef ^ ^ ReKi Normal :: - - "Normal to panel" - +typedef ^ ^ ReKi xi :: - - "Xi coordinate for each panel point" - +typedef ^ ^ ReKi eta :: - - "eta coordinate for each panel point" - +typedef ^ ^ ReKi R_g2p ::: - - "Transformation matrix global to Panel" - + +typedef FVW/FVW T_SrcPanlVar ReKi Sigma : - - "Intensities" - + +typedef FVW/FVW T_SrcPanlMisc ReKi AI :: - - "Influence matrix to solve for intensity" - +typedef ^ ^ ReKi UUI ::: - - "Unit induced velocity" - +typedef ^ ^ ReKi Uext :: - - "External inflow velocity at panel control points" - +typedef ^ ^ ReKi Uwnd :: - - "Inflow velocity vector at panel control points" - +typedef ^ ^ ReKi Uind :: - - "Induced velocity vector at panel control points" - +typedef ^ ^ ReKi Utot :: - - "Full velocity (include induced) vector at panel control points" - +typedef ^ ^ ReKi Cp : - - "Pressure coefficient" - +typedef ^ ^ ReKi p : - - "Pressure (1/2 rho Utot^2)" - +typedef ^ ^ ReKi F :: - - "Force from pressure" - +typedef ^ ^ ReKi FpA :: - - "Force per area" - +typedef ^ ^ ReKi RHS : - - "Right hand side" - +typedef ^ ^ IntKi IPIV : - - "Pivot for factorization" - ##################### Registry for FVW ############### # ..... PARAMETERS ............. @@ -51,24 +79,24 @@ typedef FVW/FVW Wng_ParameterType ReKi typedef ^ ^ ReKi chord_CP : - - "Chord on LL cp " m typedef ^ ^ ReKi s_LL : - - "Spanwise coordinate of LL elements" m typedef ^ ^ ReKi s_CP : - - "Spanwise coordinate of LL CP" m -typedef ^ ^ IntKi iRotor - - - "Index of rotor the wing belong to" - +typedef ^ ^ IntKi iRotor - 0 - "Index of rotor the wing belong to" - typedef ^ ^ IntKi AFindx :: - - "Index to the airfoils from AD15 [BladeNode,BladeIndex=1]" - -typedef ^ ^ IntKi nSpan - - - "TODO, should be defined per wing. Number of spanwise element" - +typedef ^ ^ IntKi nSpan - 0 - "TODO, should be defined per wing. Number of spanwise element" - typedef ^ ^ ReKi PrescribedCirculation : - - "Prescribed circulation on all lifting lines" "m/s" #FVW_ParameterType -typedef FVW/FVW ParameterType IntKi nRotors - - - "Number of Wings" - -typedef ^ ^ IntKi nWings - - - "Number of Wings" - +typedef FVW/FVW ParameterType IntKi nRotors - 0 - "Number of Rotors" - +typedef ^ ^ IntKi nWings - 0 - "Number of Wings" - #typedef ^ ^ IntKi Rot2Wings : - - "Index mapping from wings to rotors" - typedef ^ ^ Wng_ParameterType W : - - "Wings parameters" - typedef ^ ^ IntKi Bld2Wings :: - - "Index mapping from blades to wings" - -typedef ^ ^ IntKi iNWStart - - - "Index where NW start in r_NW. (iNWStart=2, the first panel contains the lifting line panel, otherwise, start at 1)" - -typedef ^ ^ IntKi nNWMax - - - "Maximum number of nw panels, per wing" - -typedef ^ ^ IntKi nNWFree - - - "Number of nw panels that are free, per wing" - -typedef ^ ^ IntKi nFWMax - - - "Maximum number of fw panels, per wing" - -typedef ^ ^ IntKi nFWFree - - - "Number of fw panels that are free, per wing" - +typedef ^ ^ IntKi iNWStart - 0 - "Index where NW start in r_NW. (iNWStart=2, the first panel contains the lifting line panel, otherwise, start at 1)" - +typedef ^ ^ IntKi nNWMax - 0 - "Maximum number of nw panels, per wing" - +typedef ^ ^ IntKi nNWFree - 0 - "Number of nw panels that are free, per wing" - +typedef ^ ^ IntKi nFWMax - 0 - "Maximum number of fw panels, per wing" - +typedef ^ ^ IntKi nFWFree - 0 - "Number of fw panels that are free, per wing" - typedef ^ ^ Logical FWShedVorticity - - - "Include shed vorticity in the far wake" - typedef ^ ^ IntKi IntMethod - - - "Integration Method (1=RK4, 2=AB4, 3=ABM4, 5=Euler1)" - typedef ^ ^ ReKi FreeWakeStart - - - "Time when wake starts convecting (rolling up)" s @@ -92,6 +120,7 @@ typedef ^ ^ ReKi typedef ^ ^ IntKi PartPerSegment 2 - - "Number of particles per segment, e.g. for tree method, for full wake and lifting line" typedef ^ ^ DbKi DTaero - - - "Time interval for calls calculations" s typedef ^ ^ DbKi DTfvw - - - "Time interval for calculating wake induced velocities" s +typedef ^ ^ ReKi AirDens - - - "Air density" kg/m^3 typedef ^ ^ ReKi KinVisc - - - "Kinematic air viscosity" m^2/s typedef ^ ^ IntKi MHK - - - "MHK flag" - typedef ^ ^ ReKi WtrDpth - - - "Water depth" m @@ -103,7 +132,7 @@ typedef ^ ^ IntKi typedef ^ ^ CHARACTER(1024) RootName - - - "RootName for writing output files" - typedef ^ ^ CHARACTER(1024) VTK_OutFileRoot - - - "Rootdirectory for writing VTK files" - typedef ^ ^ CHARACTER(1024) VTK_OutFileBase - - - "Basename for writing VTK files" - -typedef ^ ^ IntKi nGridOut - - - "Number of VTK grid to output" - +typedef ^ ^ IntKi nGridOut - 0 - "Number of VTK grid to output" - # Parameters advanced options typedef ^ ^ Logical InductionAtCP - .true. - "Compute induced velocities at nodes or CP" typedef ^ ^ Logical WakeAtTE - .true. - "Start the wake at the trailing edge, or at the LL" @@ -111,6 +140,11 @@ typedef ^ ^ Logical typedef ^ ^ Logical Induction - .true. - "Compute induction" typedef ^ ^ ReKi kFrozenNWStart - 0.75 - "Fraction of wake induced velocity at start of frozen wake. 1 seems too strong." typedef ^ ^ ReKi kFrozenNWEnd - 0.5 - "Fraction of wake induced velocity at end of frozen wake" +typedef ^ ^ ReKi zGround - 0.0 - "Ground height" +typedef ^ ^ ReKi zGroundPush - 0.1 - "Distance above ground where vortices are pushed back" +typedef ^ ^ IntKi nSrcPnlUpdate - 1 - "How often do src panel updates (in time steps of OLAF)" +# Parameters panels +typedef ^ ^ T_SrcPanlParam SrcPnl - - - "Source panel parameters" - #.......... ContinuousStateType ...... typedef FVW/FVW Wng_ContinuousStateType ReKi Gamma_NW :: - - "Circulation of the near wake panels ( nSpan x nNW )" - @@ -204,6 +238,7 @@ typedef ^ ^ LOGICAL # Element storage (buffers) typedef ^ ^ T_Sgmt Sgmt - - - "Segments storage" - typedef ^ ^ T_Part Part - - - "Particle storage" - +typedef ^ ^ T_SrcPanlMisc SrcPnl - - - "Source panels storage" - # Wake rollup storage (buffer) typedef ^ ^ ReKi CPs :: - - "Control points used for wake rollup computation" - typedef ^ ^ ReKi Uind :: - - "Induced velocities obtained at control points" - @@ -237,11 +272,13 @@ typedef FVW/FVW Wng_ConstraintStateType Reki # FVW_ConstraintStateType typedef FVW/FVW ConstraintStateType Wng_ConstraintStateType W : - - "rotors constr. states" - typedef ^ ^ Reki residual - - - "Residual" - +typedef ^ ^ T_SrcPanlVar SrcPnl - - - "Source panel constraints" - # ....... OtherStateType ............ # FVW_OtherStateType -typedef FVW/FVW OtherStateType IntKi Dummy - - - "Empty to satisfy framework" +typedef FVW/FVW OtherStateType ReKi ShedScale - - - "Scale shed vorticity at begining of simulation" typedef ^ ^ UA_OtherStateType UA : - - "other states for UnsteadyAero for each wing" - +typedef ^ ^ LOGICAL Initialized - .false. - "True if OLAF is initialized" - #.......... InitInputType ...... @@ -260,6 +297,7 @@ typedef ^ ^ Wng_InitInputType typedef ^ ^ MeshType WingsMesh : - - "Input Mesh defining position and orientation of wings (nSpan+1) " - typedef ^ ^ IntKi numBladeNodes - - - "Number of nodes on each blade" - typedef ^ ^ DbKi DTaero - - - "Time interval for calls (from AD15)" s +typedef ^ ^ ReKi AirDens - - - "Air density" kg/m^3 typedef ^ ^ ReKi KinVisc - - - "Kinematic air viscosity" m^2/s typedef ^ ^ IntKi MHK - - - "MHK flag" - typedef ^ ^ ReKi WtrDpth - - - "Water depth" m @@ -302,6 +340,7 @@ typedef ^ ^ IntKi typedef ^ ^ IntKi VTKBlades - - - "Outputs VTk for each blade 0=no blade, 1=Bld 1" - typedef ^ ^ DbKi DTvtk - - - "Requested timestep between VTK outputs (calculated from the VTK_fps read in)" s typedef ^ ^ IntKi VTKCoord - - - "Switch for VTK outputs coordinate system" - +typedef ^ ^ CHARACTER(1024) SrcPnlFile - - '' "Input file for source panels" - #.......... InitOutputType ...... # FVW_InitOutputType diff --git a/modules/aerodyn/src/FVW_Subs.f90 b/modules/aerodyn/src/FVW_Subs.f90 index a0faa364bd..29b310b274 100644 --- a/modules/aerodyn/src/FVW_Subs.f90 +++ b/modules/aerodyn/src/FVW_Subs.f90 @@ -6,6 +6,11 @@ module FVW_SUBS use FVW_BiotSavart implicit none + type :: T_Panl + type(T_SrcPanlParam), pointer :: p_Src =>null() + type(T_SrcPanlMisc) , pointer :: m_Src =>null() + type(T_SrcPanlVar) , pointer :: z_Src =>null() + endtype ! --- Module parameters ! Circulation solving methods @@ -105,7 +110,7 @@ subroutine Output_Gamma(CP, Gamma_LL, iW, iStep, iLabel, iIter) norm=sqrt(CP(1,i)**2+CP(2,i)**2+CP(3,i)**2) write(iUnit,'(E14.7,A,E14.7,A,E14.7,A,E14.7,A,E14.7)') norm,',', CP(1,i),',',CP(2,i),',',CP(3,i),',', Gamma_LL(i) enddo - close(iUnit) + if (iUnit>0) close(iUnit) endsubroutine Output_Gamma ! ===================================================================================== !> Read a delimited file containing a circulation and interpolate it on the requested Control Points @@ -500,7 +505,7 @@ subroutine find_nan_1D(array, varname) endif enddo if (found) then - print*,'>>>>>>>>>>>>> NAN ',trim(varname),tot,n + print*,'OLAF NAN ',trim(varname),tot,n STOP endif end subroutine @@ -522,7 +527,7 @@ subroutine find_nan_2D(array, varname) endif enddo if (found) then - print*,'>>>>>>>>>>>>> NAN ',trim(varname),tot,n + print*,'OLAF NAN ',trim(varname),tot,n STOP endif end subroutine @@ -547,7 +552,7 @@ subroutine find_nan_3D(array, varname) enddo enddo if (found) then - print*,'>>>>>>>>>>>>> NAN ',trim(varname), tot,n*m + print*,'OLAF: NAN ',trim(varname), tot,n*m STOP endif end subroutine @@ -561,7 +566,7 @@ subroutine find_nan_3D(array, varname) !! ensure that we do not violate requirements in the framework later for changing the size !! of input and output arrays. subroutine SetRequestedWindPoints(r_wind, x, p, m) - real(ReKi), dimension(:,:), allocatable, intent(inout) :: r_wind !< Position where wind is requested + real(ReKi), dimension(:,:), intent(inout) :: r_wind !< Position where wind is requested type(FVW_ContinuousStateType), intent(inout) :: x !< States type(FVW_ParameterType), intent(in ) :: p !< Parameters type(FVW_MiscVarType), intent(in ), target :: m !< Initial misc/optimization variables @@ -574,17 +579,7 @@ subroutine SetRequestedWindPoints(r_wind, x, p, m) ! NOTE: Maximum number of points are passed, whether they "exist" or not. ! NOTE: InflowWind ignores points at (0,0,0) !if (DEV_VERSION) then - ! ! Removing points that don't exist - ! !call print_x_NW_FW(p,m,x,'wind befr') - ! if (m%nNW<=p%nNWMax) then - ! x%W(iW)%r_NW(1:3, 1:p%W(iW)%nSpan+1, m%nNW+2:p%nNWMax+1, 1:p%nWings) = 0.0_ReKi - ! endif - ! if ( ((p%nNWMax<=1) .and. (m%nFW==0)) .or. ((m%nFW>0) .and. (m%nFW<=p%nFWMax))) then - ! x%W(iW)%r_FW(1:3, 1:FWnSpan+1, m%nFW+2:p%nFWMax+1, 1:p%nWings) = 0.0_ReKi - ! else - ! x%W(iW)%r_FW(1:3, 1:FWnSpan+1, m%nFW+1:p%nFWMax+1, 1:p%nWings) = 0.0_ReKi - ! endif - ! !call print_x_NW_FW(p,m,x,'wind after') + ! r_wind = -99999_ReKi !endif iP_end=0 @@ -629,22 +624,18 @@ subroutine SetRequestedWindPoints(r_wind, x, p, m) enddo ! Loop on z enddo ! Loop on grids + ! --- Panels + if (p%SrcPnl%n>0) then + r_wind(1:3,iP_start:iP_start-1+p%SrcPnl%n) = p%SrcPnl%Pcent(1:3,1:p%SrcPnl%n) + endif + !if (DEV_VERSION) then ! ! Additional checks - ! if (any(r_wind(3,:)<=-99999_ReKi)) then - ! call print_x_NW_FW(p,m,x,'wind after') - ! print*,'Error in wind' - ! STOP - ! endif - ! ! Removing points that don't exist - ! if (m%nNW<=p%nNWMax) then - ! x%W(iW)%r_NW(1:3, 1:p%W(iW)%nSpan+1, m%nNW+2:p%nNWMax+1, 1:p%nWings) = -999999.0_ReKi - ! endif - ! if ( ((p%nNWMax<=1) .and. (m%nFW==0)) .or. ((m%nFW>0) .and. (m%nFW<=p%nFWMax))) then - ! x%W(iW)%r_FW(1:3, 1:FWnSpan+1, m%nFW+2:p%nFWMax+1, 1:p%nWings) =-999999.0_ReKi - ! else - ! x%W(iW)%r_FW(1:3, 1:FWnSpan+1, m%nFW+1:p%nFWMax+1, 1:p%nWings) =-999999.0_ReKi - ! endif + ! if (any(r_wind(3,:)<=-99999_ReKi)) then + ! call print_x_NW_FW(p,m,x,'wind after') + ! print*,'Error in wind' + ! STOP + ! endif !endif end subroutine SetRequestedWindPoints @@ -749,6 +740,35 @@ subroutine DistributeRequestedWind_Grid(V_wind, p, m) enddo ! Loop on grids end subroutine DistributeRequestedWind_Grid +subroutine DistributeRequestedWind_Panels(V_wind, p, m) + real(ReKi), dimension(:,:), intent(in ) :: V_wind !< Requested wind, packed + type(FVW_ParameterType), intent(in ) :: p !< Parameters + type(FVW_MiscVarType), target, intent(inout) :: m !< Initial misc/optimization variables + integer(IntKi) :: iP_start,iP_end ! Current index of point, start and end of range + integer(IntKi) :: iGrid,i,j,k,iW + type(GridOutType), pointer :: g + iP_end=0 + ! --- LL/NW/FW + do iW=1,p%nWings; iP_end = iP_end + p%W(iW)%nSpan; enddo + do iW=1,p%nWings; iP_end = iP_end+(p%W(iW)%nSpan+1)*(p%nNWMax+1) ; enddo + if (p%nFWMax>0) then + do iW=1,p%nWings; iP_end = iP_end+(FWnSpan+1)*(p%nFWMax+1); enddo + endif + ! --- VTK points + iP_end=iP_end+1 + do iGrid=1,p%nGridOut + g => m%GridOutputs(iGrid) + do k=1,g%nz + do j=1,g%ny + do i=1,g%nx + iP_end=iP_end+1 + enddo + enddo + enddo ! Loop on x + enddo ! Loop on grids + iP_start=iP_end + m%SrcPnl%Uwnd(:,1:p%SrcPnl%n) = V_wind(:,iP_start:iP_start+p%SrcPnl%n-1) +end subroutine DistributeRequestedWind_Panels !> Init States @@ -808,31 +828,35 @@ subroutine FVW_InitMiscVarsPostParam( p, m, ErrStat, ErrMsg ) nSeg = nSeg*2 nSegP = nSegP*2 endif - call AllocAry( m%Sgmt%Connct, 4, nSeg , 'SegConnct' , ErrStat2, ErrMsg2 );call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName); m%Sgmt%Connct = -999; - call AllocAry( m%Sgmt%Points, 3, nSegP, 'SegPoints' , ErrStat2, ErrMsg2 );call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName); m%Sgmt%Points = -999999_ReKi; - call AllocAry( m%Sgmt%Gamma , nSeg, 'SegGamma' , ErrStat2, ErrMsg2 );call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName); m%Sgmt%Gamma = -999999_ReKi; - call AllocAry( m%Sgmt%Epsilon, nSeg, 'SegEpsilon', ErrStat2, ErrMsg2 );call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName); m%Sgmt%Epsilon= -999999_ReKi; + call AllocAry( m%Sgmt%Connct, 4, nSeg , 'SegConnct' , ErrStat2, ErrMsg2 ); if(Failed())return; m%Sgmt%Connct = -999; + call AllocAry( m%Sgmt%Points, 3, nSegP, 'SegPoints' , ErrStat2, ErrMsg2 ); if(Failed())return; m%Sgmt%Points = -999999_ReKi; + call AllocAry( m%Sgmt%Gamma , nSeg, 'SegGamma' , ErrStat2, ErrMsg2 ); if(Failed())return; m%Sgmt%Gamma = -999999_ReKi; + call AllocAry( m%Sgmt%Epsilon, nSeg, 'SegEpsilon', ErrStat2, ErrMsg2 ); if(Failed())return; m%Sgmt%Epsilon= -999999_ReKi; m%Sgmt%nAct = -1 ! Active segments m%Sgmt%nActP = -1 m%Sgmt%RegFunction = p%RegFunction - bWakeNeedsPart = p%VelocityMethod(1)==idVelocityPart .or.p%VelocityMethod(1)==idVelocityTreePart + bWakeNeedsPart = p%VelocityMethod(1)==idVelocityPart .or. p%VelocityMethod(1)==idVelocityTreePart bLLNeedsPart = p%VelocityMethod(2)==idVelocityPart .or. p%VelocityMethod(2)==idVelocityTreePart if (bLLNeedsPart .or. bWakeNeedsPart) then nPart = 0 if (bWakeNeedsPart) nPart = max(nPart, nSeg * p%PartPerSegment(1)) if (bLLNeedsPart) nPart = max(nPart, nSeg * p%PartPerSegment(2)) - call AllocAry( m%Part%P , 3, nPart, 'PartP' , ErrStat2, ErrMsg2 );call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName); m%Part%P = -999999_ReKi; - call AllocAry( m%Part%Alpha , 3, nPart, 'PartAlpha' , ErrStat2, ErrMsg2 );call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName); m%Part%Alpha = -999999_ReKi; - call AllocAry( m%Part%RegParam, nPart, 'PartEpsilon', ErrStat2, ErrMsg2 );call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName); m%Part%RegParam= -999999_ReKi; + call AllocAry( m%Part%P , 3, nPart, 'PartP' , ErrStat2, ErrMsg2 ); if(Failed())return; m%Part%P = -999999_ReKi; + call AllocAry( m%Part%Alpha , 3, nPart, 'PartAlpha' , ErrStat2, ErrMsg2 ); if(Failed())return; m%Part%Alpha = -999999_ReKi; + call AllocAry( m%Part%RegParam, nPart, 'PartEpsilon', ErrStat2, ErrMsg2 ); if(Failed())return; m%Part%RegParam= -999999_ReKi; m%Part%nAct = -1 ! Active particles m%Part%RegFunction = p%RegFunction endif ! TODO Figure out Uind, CPs needed for grid - call AllocAry( m%CPs , 3, nCPs, 'CPs' , ErrStat2, ErrMsg2 );call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName); m%CPs= -999999_ReKi; - call AllocAry( m%Uind , 3, nCPs, 'Uind' , ErrStat2, ErrMsg2 );call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg,RoutineName); m%Uind= -999999_ReKi; - + call AllocAry( m%CPs , 3, nCPs, 'CPs' , ErrStat2, ErrMsg2 ); if(Failed())return; m%CPs= -999999_ReKi; + call AllocAry( m%Uind , 3, nCPs, 'Uind' , ErrStat2, ErrMsg2 ); if(Failed())return; m%Uind= -999999_ReKi; +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'FVW_InitMiscVarsPostParam') + Failed = ErrStat >= AbortErrLev + end function Failed end subroutine FVW_InitMiscVarsPostParam !> Count how many segments are needed to represent the Near wake and far wakes, starting at a given depth @@ -1117,10 +1141,12 @@ subroutine InducedVelocitiesAll_OnGrid(g, p, x, m, ErrStat, ErrMsg) real(ReKi) :: xP,yP,zP,dx,dy,dz ! TODO new options type(T_Tree) :: Tree + type(T_Panl) :: Panl real(ReKi), dimension(:,:), allocatable :: CPs ! TODO get rid of me with dedicated functions real(ReKi), dimension(:,:), allocatable :: Uind ! TODO get rid of me with dedicated functions ErrStat= ErrID_None ErrMsg ='' + if (OLAF_PROFILING) call tic('InducedVelocitiesAll_OnGrid') ! --- Packing control points nCPs = g%nx * g%ny * g%nz @@ -1148,9 +1174,9 @@ subroutine InducedVelocitiesAll_OnGrid(g, p, x, m, ErrStat, ErrMsg) ! --- Compute induced velocity ! Convert Panels to segments, segments to particles, particles to tree - call InducedVelocitiesAll_Init(p, x, m, m%Sgmt, m%Part, Tree, ErrStat, ErrMsg, allocPart=.false.) - call InducedVelocitiesAll_Calc(CPs, nCPs, Uind, p, m%Sgmt, m%Part, Tree, ErrStat, ErrMsg) - call InducedVelocitiesAll_End(p, Tree, m%Part, ErrStat, ErrMsg, deallocPart=.false.) + call InducedVelocitiesAll_Init(p, x, m, m%Sgmt, m%Part, Tree, Panl, ErrStat, ErrMsg, allocPart=.false.) + call InducedVelocitiesAll_Calc(CPs, nCPs, Uind, p, m%Sgmt, m%Part, Tree, Panl, ErrStat, ErrMsg) + call InducedVelocitiesAll_End(p, Tree, m%Part, Panl, ErrStat, ErrMsg, deallocPart=.false.) ! --- Unpacking induced velocity points iHeadP=1 @@ -1159,6 +1185,8 @@ subroutine InducedVelocitiesAll_OnGrid(g, p, x, m, ErrStat, ErrMsg) if(allocated(CPs )) deallocate(CPs , stat=ErrStat) if(allocated(Uind)) deallocate(Uind, stat=ErrStat) + if (OLAF_PROFILING) call toc() + end subroutine InducedVelocitiesAll_OnGrid !> Wrapper to setup part from set of segments @@ -1213,13 +1241,14 @@ end subroutine SegmentsToPartWrap !> Perform initialization steps before requesting induced velocities from All vortex elements !! In : x%W(iW)%r_NW, x%W(iW)%r_FW, x%W(iW)%Gamma_NW, x%W(iW)%Gamma_FW !! Out: Tree, Part, m -subroutine InducedVelocitiesAll_Init(p, x, m, Sgmt, Part, Tree, ErrStat, ErrMsg, allocPart) - type(FVW_ParameterType), intent(in ) :: p !< Parameters +subroutine InducedVelocitiesAll_Init(p, x, m, Sgmt, Part, Tree, Panl, ErrStat, ErrMsg, allocPart) + type(FVW_ParameterType), intent(in ), target :: p !< Parameters type(FVW_ContinuousStateType), intent(in ) :: x !< States - type(FVW_MiscVarType), intent(in ) :: m !< Misc + type(FVW_MiscVarType), intent(in ), target :: m !< Misc type(T_Sgmt), intent(inout) :: Sgmt !< Segments type(T_Part), intent(inout) :: Part !< Particle storage if needed type(T_Tree), intent(out) :: Tree !< Tree of particles if needed + type(T_Panl), intent(out ) :: Panl !< Panel storage if needed integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None logical, intent(in ) :: allocPart !< allocate particles @@ -1251,16 +1280,22 @@ subroutine InducedVelocitiesAll_Init(p, x, m, Sgmt, Part, Tree, ErrStat, ErrMsg call grow_tree_segment(Tree, nSeg, Sgmt%Points, Sgmt%Connct(:,1:nSeg), Sgmt%Gamma(1:nSeg), p%RegFunction, Sgmt%Epsilon(1:nSeg), 0) endif + ! --- Src + Panl%p_Src => p%SrcPnl + Panl%m_Src => m%SrcPnl + !Panl%z_Src => z%SrcPanel !we will use RHS for sigmas.. + end subroutine InducedVelocitiesAll_Init !> Compute induced velocity on flat CPs -subroutine InducedVelocitiesAll_Calc(CPs, nCPs, Uind, p, Sgmt, Part, Tree, ErrStat, ErrMsg) +subroutine InducedVelocitiesAll_Calc(CPs, nCPs, Uind, p, Sgmt, Part, Tree, Panl, ErrStat, ErrMsg) real(ReKi), dimension(:,:), intent(in) :: CPs !< Control points (3 x nCPs++) integer(IntKi) , intent(in) :: nCPs !< Number of control points on which to compute (nCPs <= size(CPs,2)) real(ReKi), dimension(:,: ) , intent(inout) :: Uind !< Induced velocity vector - Side effects!!! (3 x nCPs++) type(FVW_ParameterType), intent(in ) :: p !< Parameters type(T_Sgmt), intent(in ) :: Sgmt !< Segments type(T_Part), intent(in ) :: Part !< Particle storage if needed + type(T_Panl), intent(in ) :: Panl !< Panel storage if needed type(T_Tree), intent(inout) :: Tree !< Tree of particles if needed integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -1283,15 +1318,24 @@ subroutine InducedVelocitiesAll_Calc(CPs, nCPs, Uind, p, Sgmt, Part, Tree, ErrSt elseif (p%VelocityMethod(iVel)==idVelocityTreeSeg) then call ui_tree_segment(Tree, CPs, nCPs, p%TreeBranchFactor(iVel), Tree%DistanceDirect, Uind, ErrStat, ErrMsg) endif + + ! --- Src Panels + if (associated(Panl%p_Src)) then + if (Panl%p_Src%n>0) then + call ui_quad_src_nn(CPs, Panl%m_Src%RHS, Panl%p_Src%xi, Panl%p_Src%eta, Panl%p_Src%Pcent, Panl%p_Src%R_g2p, Uind, nCPs, Panl%p_Src%n) + !call ui_quad_src_11(Panl%Pcent(:,icp), UnitIntensity, Panl%xi(1:4,ip), Panl%eta(1:4,ip), Panl%Pcent(1:3,ip), Panl%R_g2p(1:3,1:3,ip), Uind_tmp) + endif + endif end subroutine InducedVelocitiesAll_Calc !> Perform termination steps after velocity was requested from all vortex elements !! InOut: Tree, Part, m -subroutine InducedVelocitiesAll_End(p, Tree, Part, ErrStat, ErrMsg, deallocPart) +subroutine InducedVelocitiesAll_End(p, Tree, Part, Panl, ErrStat, ErrMsg, deallocPart) type(FVW_ParameterType), intent(in ) :: p !< Parameters type(T_Tree), intent(inout) :: Tree !< Tree of particles if needed type(T_Part), intent(inout) :: Part !< Particle storage if needed + type(T_Panl), intent(inout) :: Panl !< Panel storage if needed integer(IntKi), intent( out) :: ErrStat !< Error status of the operation character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None logical, intent(in ) :: deallocPart @@ -1314,6 +1358,10 @@ subroutine InducedVelocitiesAll_End(p, Tree, Part, ErrStat, ErrMsg, deallocPart) call cut_tree(Tree) ! We do not deallocate segment endif + ! Src Panels (we nullify only) + nullify(Panl%p_Src) + nullify(Panl%m_Src) + nullify(Panl%z_Src) end subroutine InducedVelocitiesAll_End @@ -1333,6 +1381,7 @@ subroutine WakeInducedVelocities(p, x, m, ErrStat, ErrMsg) integer(IntKi) :: nFWEff ! Number of farwake panels that are free at current time step integer(IntKi) :: nNWEff ! Number of nearwake panels that are free at current time step type(T_Tree) :: Tree + type(T_Panl) :: Panl if (OLAF_PROFILING) call tic('WakeInduced Calc') ErrStat= ErrID_None ErrMsg ='' @@ -1347,9 +1396,9 @@ subroutine WakeInducedVelocities(p, x, m, ErrStat, ErrMsg) ! Convert Panels to segments, segments to particles, particles to tree m%Uind=0.0_ReKi ! very important due to side effects of ui_* methods m%Uind(:,nCPs+1:)=1000.0_ReKi ! TODO For debugging only - call InducedVelocitiesAll_Init(p, x, m, m%Sgmt, m%Part, Tree, ErrStat, ErrMsg, allocPart=.false.) - call InducedVelocitiesAll_Calc(m%CPs, nCPs, m%Uind, p, m%Sgmt, m%Part, Tree, ErrStat, ErrMsg) - call InducedVelocitiesAll_End(p, Tree, m%Part, ErrStat, ErrMsg, deallocPart=.false.) + call InducedVelocitiesAll_Init(p, x, m, m%Sgmt, m%Part, Tree, Panl, ErrStat, ErrMsg, allocPart=.false.) + call InducedVelocitiesAll_Calc(m%CPs, nCPs, m%Uind, p, m%Sgmt, m%Part, Tree, Panl, ErrStat, ErrMsg) + call InducedVelocitiesAll_End(p, Tree, m%Part, Panl, ErrStat, ErrMsg, deallocPart=.false.) call UnPackInducedVelocity() if (DEV_VERSION) then @@ -1524,6 +1573,10 @@ subroutine LiftingLineInducedVelocities(p, x, InductionAtCP, iDepthStart, m, Err !deallocate(Part%P, Part%Alpha, Part%RegParam) call cut_tree(Tree) endif + ! --- Src Panel contribution + if (p%SrcPnl%n>0) then + call ui_quad_src_nn(CPs, m%SrcPnl%RHS, p%SrcPnl%xi, p%SrcPnl%eta, p%SrcPnl%Pcent, p%SrcPnl%R_g2p, Uind, nCPs, p%SrcPnl%n) + endif ! --- Unpack call UnPackLiftingLineVelocities() @@ -1608,13 +1661,11 @@ subroutine FakeGroundEffect(p, x, m, ErrStat, ErrMsg) ErrStat = ErrID_None ErrMsg = "" + GROUND = 1.e-4_ReKi + p%zGround if ( p%MHK /= MHK_None ) then - GROUND = 1.e-4_ReKi - p%WtrDpth - ABOVE_GROUND = 0.1_ReKi - p%WtrDpth - else - GROUND = 1.e-4_ReKi - ABOVE_GROUND = 0.1_ReKi + GROUND = GROUND - p%WtrDpth endif + ABOVE_GROUND = GROUND + p%zGroundPush ! Typically 0.1m above ground nBelow=0 nBelowFW=0 @@ -1742,4 +1793,421 @@ subroutine AlphaVrel_Generic(M_ag, Vstr_g, Vind_g, Vwnd_g, KinVisc, Chord, Vrel end subroutine AlphaVrel_Generic +!> Initialize / allocated main variables for source panels. +!! If an non empty input file is provided, the panels points and connectivity are read +!! Otherwise, Points and IDs should be provided in "p" +!! +!! Acknowledgements: +!! The original implementation of the source panel method was funded by Accelerate Wind, +!! and implemented by E. Branlard. +!! For more acknowledgements, visit: https://openfast.readthedocs.io/en/main/source/acknowledgements.html +!! +subroutine srcPnl_init(p, m, z, errStat, errMsg, filename) + use VTK !, only: ReadVTK_PD_info, ReadVTK_PD_fields + type(T_SrcPanlParam), intent(inout) :: p + type(T_SrcPanlMisc) , intent(inout) :: m + type(T_SrcPanlVar) , intent(inout) :: z + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + character(len=*), intent(in), optional :: filename + integer(IntKi) :: fid !< Unit number for file reading + character(ErrMsgLen) :: descr !< Description in input file + integer(IntKi) :: errStat2 !< temporary Error status + character(ErrMsgLen) :: errMsg2 !< temporary Error message + type(vtk_field), pointer :: fields + type(vtk_field), pointer :: bodyID + integer :: nPanels + nullify(fields) + nullify(bodyID) + fid = 0 + + errStat = ErrID_None + errMsg = "" + fid = 0 + ! --- Read points and connectivity + if (present(filename)) then + if (len_trim(filename)>0) then + !call EllipsoidPanels(17, 15, 1., 1., 1., p%P, p%IDs) + ! --- Read Source Panels + call WrScr(' - Source panel file: '//trim(filename)) + call ReadVTK_PD_info(filename, descr, p%P, p%IDs, fid, errStat2, errMsg2); if(Failed()) return + call ReadVTK_CD_fields(filename, fid, size(p%IDs, 2), fields, errStat2, errMsg2); if(Failed()) return + if (errStat2==ErrID_Warn) then + call WrScr('[WARN] Fields not found in VTK file, see '//trim(errMsg)) + errMsg='' + endif + if (fid>0) close(fid) + + ! --- Extract Body ID + !call VTK_printFields(fields) + call VTK_getField(fields, 'BODYID', bodyID) ! If not found, we'll replace by dummy ID + nPanels = size(p%IDs, 2) + call AllocAry(p%BodyIDs, nPanels, 'BodyIDs', errStat2, errMsg2); if(Failed()) return + if (associated(bodyID)) then + p%BodyIDs(1:nPanels) = bodyID%values(1,1:nPanels) + else + call WrScr('[WARN] Body IDs not found in source panel input file') + p%BodyIDs(:) = 1 + endif + call VTK_destroyFields(fields) + print'(A,I0,A,I0)',' - Number of panels: ', nPanels, ' , Points per panels: ',size(p%IDs,1) + p%IDs = p%IDs+1 ! VTK index starts at 0 + + else + errStat2 = ErrID_Fatal + errMsg2 = 'Filename should not be of length zero if provided.' + if (Failed()) return + endif + endif + if (.not. allocated(p%P) .or. .not.allocated(p%IDs)) then + errStat2 = ErrID_Fatal + errMsg2 = 'Points and connectivity (`IDs`) should be allocated (when an input file for source panels is not provided).' + if (Failed()) return + endif + + ! --- geometrical parameters (Area, normal vector, transformation matrices, etc) + p%Comment = '' + p%n = 0 + call srcPnl_geometry(p, errStat2, errMsg2); if(Failed()) return + + if (p%n>0) then + ! --- Allocations + call AllocAry(m%AI , p%n, p%n, 'AI ', errStat2, errMsg2); if(Failed())return + call AllocAry(m%UUI , 3, p%n, p%n, 'UUI ', errStat2, errMsg2); if(Failed())return + call AllocAry(m%Uwnd , 3 , p%n, 'Uwnd', errStat2, errMsg2); if(Failed())return + call AllocAry(m%Uext , 3 , p%n, 'Uext', errStat2, errMsg2); if(Failed())return + call AllocAry(m%Uind , 3 , p%n, 'Uind', errStat2, errMsg2); if(Failed())return + call AllocAry(m%Utot , 3 , p%n, 'Utot', errStat2, errMsg2); if(Failed())return + call AllocAry(m%F , 3 ,p%n, 'Fs ', errStat2, errMsg2); if(Failed())return + call AllocAry(m%FpA , 3 ,p%n, 'FpA ', errStat2, errMsg2); if(Failed())return + call AllocAry(m%Cp ,p%n, 'Cps ', errStat2, errMsg2); if(Failed())return + call AllocAry(m%p ,p%n, 'ps ', errStat2, errMsg2); if(Failed())return + call AllocAry(m%RHS ,p%n, 'RHS ', errStat2, errMsg2); if(Failed())return + call AllocAry(m%IPIV ,p%n, 'IPIV', errStat2, errMsg2); if(Failed())return + call AllocAry(z%Sigma ,p%n, 'Sigm', errStat2, errMsg2); if(Failed())return + m%AI = -999999_ReKi + m%UUI = -999999_ReKi + m%Uwnd = 0_ReKi + m%Uext = 0_ReKi + m%Uind = -999999_ReKi + m%Utot = -999999_ReKi + m%F = 0_ReKi + m%Cp = 0_ReKi + m%p = 0_ReKi + m%RHS = 0_ReKi + m%IPIV = -999999_ReKi + z%Sigma= 0_ReKi + + ! --- Compute influence matrix + ! For now, panels don't move so we compute this only once, otherwise, put this in FVW_CalcConstrStateResidual + call srcPnl_build_mat(p, m%AI, m%UUI) + + ! --- Factorization + call linalg_factor(m%AI, m%IPIV, errStat2, errMsg2); if(Failed()) return + endif +contains + logical function Failed() + call SeterrStat(errStat2, errMsg2, errStat, errMsg, 'srcPnl_init') + Failed = errStat >= AbortErrLev + if (Failed .and. fid>0) close(fid) + end function +end subroutine srcPnl_init + +!> Geometrical parameters (Area, normal vector, transformation matrices, etc) +subroutine srcPnl_geometry(Panl, errStat, errMsg) + type(T_SrcPanlParam), intent(inout) :: Panl + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + real(ReKi) :: alpha !< + real(ReKi) :: d1 !< + real(ReKi) :: DLastRingTE !< + real(ReKi) :: eta0 !< + integer(IntKi), dimension(4) :: IDs !< + real(ReKi), dimension(3) :: P1 !< + real(ReKi), dimension(3) :: P1e !< + real(ReKi), dimension(3) :: P1es !< + real(ReKi), dimension(3) :: P1p !< + real(ReKi), dimension(3) :: P2 !< + real(ReKi), dimension(3) :: P2e !< + real(ReKi), dimension(3) :: P2es !< + real(ReKi), dimension(3) :: P2p !< + real(ReKi), dimension(3) :: P3 !< + real(ReKi), dimension(3) :: P3e !< + real(ReKi), dimension(3) :: P3es !< + real(ReKi), dimension(3) :: P3p !< + real(ReKi), dimension(3) :: P4 !< + real(ReKi), dimension(3) :: P4e !< + real(ReKi), dimension(3) :: P4es !< + real(ReKi), dimension(3) :: P4p !< + real(ReKi), dimension(3) :: T1 + real(ReKi), dimension(3) :: T2 + real(ReKi), dimension(3) :: Ptmp !< temp for computing norm of delta points + real(ReKi), dimension(3,3) :: Mat + real(ReKi) :: norm_1 + real(ReKi) :: norm_T1 + real(ReKi) :: norm_T2 + integer :: ip + real(ReKi) :: xi0 !< + integer(IntKi) :: errStat2 !< temporary Error status + character(ErrMsgLen) :: errMsg2 !< temporary Error message + errStat = ErrID_None + errMsg = "" + Panl%n = size(Panl%IDs, 2) ! Number of panels + + ! --- Allocate storage for geometrical variables + if (allocated(Panl%R_g2p)) deallocate(Panl%R_g2p) + if (allocated(Panl%Pmid)) deallocate(Panl%Pmid) + if (allocated(Panl%Pcent)) deallocate(Panl%Pcent) + if (allocated(Panl%Normal))deallocate(Panl%Normal) + if (allocated(Panl%eta)) deallocate(Panl%eta) + if (allocated(Panl%xi)) deallocate(Panl%xi) + if (allocated(Panl%Area)) deallocate(Panl%Area) + + call AllocAry(Panl%R_g2p, 3, 3 ,Panl%n,'Normal',errStat2,errMsg2); if(Failed())return + call AllocAry(Panl%Pmid , 3, Panl%n,'Pmid ' ,errStat2,errMsg2); if(Failed())return + call AllocAry(Panl%Pcent , 3, Panl%n,'Pcent' ,errStat2,errMsg2); if(Failed())return + call AllocAry(Panl%Normal, 3, Panl%n,'Normal',errStat2,errMsg2); if(Failed())return + call AllocAry(Panl%eta , 4, Panl%n,'eta ' ,errStat2,errMsg2); if(Failed())return + call AllocAry(Panl%xi , 4, Panl%n,'xi ' ,errStat2,errMsg2); if(Failed())return + call AllocAry(Panl%Area , Panl%n,'Area ' ,errStat2,errMsg2); if(Failed())return + + do ip = 1, Panl%n + IDs = Panl%IDs(:,ip) + P1 = Panl%P(:,IDs(1)) + P2 = Panl%P(:,IDs(2)) + P3 = Panl%P(:,IDs(3)) + P4 = Panl%P(:,IDs(4)) + Panl%Pmid(1:3,ip) = (P1+P2+P3+p4)/4 ! that's hess's barred coordinates + T1 = P3-P1 + T2 = P4-P2 + ! maximum diagonal + norm_T1 = sqrt(T1(1)**2+ T1(2)**2+ T1(3)**2) + norm_T2 = sqrt(T2(1)**2+ T2(2)**2+ T2(3)**2) + ! flat panel coordinate system + Ptmp(1) = T2(2) * T1(3) - T2(3) * T1(2) + Ptmp(2) = T2(3) * T1(1) - T2(1) * T1(3) + Ptmp(3) = T2(1) * T1(2) - T2(2) * T1(1) + norm_1=sqrt(Ptmp(1)**2+ Ptmp(2)**2+ Ptmp(3)**2) + Panl%Normal(1:3,ip) = Ptmp/norm_1 !z or zeta axis + ! CP will be centroid ref (at the end, the middle) for Source panels + T1 = T1/norm_T1 ! x or xi axis + ! T2 = cross(N,T1) + T2(1) = Panl%Normal(2,ip) * T1(3) - Panl%Normal(3,ip) * T1(2) + T2(2) = Panl%Normal(3,ip) * T1(1) - Panl%Normal(1,ip) * T1(3) + T2(3) = Panl%Normal(1,ip) * T1(2) - Panl%Normal(2,ip) * T1(1) + norm_T2 = sqrt(T2(1)**2+ T2(2)**2+ T2(3)**2) + T2 = T2/norm_T2 ! y or eta axis + Panl%R_g2p(1, 1:3, ip) = T1 + Panl%R_g2p(2, 1:3, ip) = T2 + Panl%R_g2p(3, 1:3, ip) = Panl%Normal(:,ip) + Mat = Panl%R_g2p(:,:,ip) + ! Projection of the surface into a flat panel - Hess primed coordinates + d1 = dot_product(Panl%Normal(:,ip),Panl%Pmid(:,ip)-P1) + P1p = P1+Panl%Normal(:,ip)*(-1)**(1-1)*d1 + P2p = P2+Panl%Normal(:,ip)*(-1)**(2-1)*d1 + P3p = P3+Panl%Normal(:,ip)*(-1)**(3-1)*d1 + P4p = P4+Panl%Normal(:,ip)*(-1)**(4-1)*d1 + !Coordinates of flat panel points in panel coordinate system - Hess starred coordinates with greek letters + ! the transformation is such that the zeta coordinate will always be zero + P1es = matmul(Mat,(P1p-Panl%Pmid(:,ip))) + P2es = matmul(Mat,(P2p-Panl%Pmid(:,ip))) + P3es = matmul(Mat,(P3p-Panl%Pmid(:,ip))) + P4es = matmul(Mat,(P4p-Panl%Pmid(:,ip))) + ! Coordinates of the centroid + xi0 = 1._ReKi/3._ReKi*1.0_ReKi/(P2es(2)-P4es(2)) * (P4es(1)*(P1es(2)-P2es(2))+P2es(1)*(P4es(2)-P1es(2) )) + eta0 = -1._ReKi/3._ReKi * P1es(2) + ! Coordinates based on centroid - Hess greek letters coordinates + P1e = P1es-(/ xi0,eta0,0.0_ReKi /) + P2e = P2es-(/ xi0,eta0,0.0_ReKi /) + P3e = P3es-(/ xi0,eta0,0.0_ReKi /) + P4e = P4es-(/ xi0,eta0,0.0_ReKi /) + Panl%xi(:,ip) = (/ P1e(1), P2e(1), P3e(1), P4e(1)/) + Panl%eta(:,ip) = (/ P1e(2), P2e(2), P3e(2), P4e(2)/) + ! Centroid in reference frame + Panl%Pcent(:,ip) = Panl%Pmid(:,ip) + matmul( (/ xi0,eta0,0.0_ReKi /),Mat) + ! Area + Panl%Area(ip) = 0.5_ReKi*(Panl%xi(3,ip)-Panl%xi(1,ip))*(Panl%eta(2,ip)-Panl%eta(4,ip)) + end do ! Loop on panels +contains + logical function Failed() + call SeterrStat(errStat2, errMsg2, errStat, errMsg, 'srcPnl_geometry') + Failed = errStat >= AbortErrLev + end function +end subroutine srcPnl_geometry + +subroutine srcPnl_build_mat(Panl, AI, UUI) + ! Arguments + type(T_SrcPanlParam), intent(in) :: Panl + real(ReKi), dimension(:,:), intent(out) :: AI !< (nCPs x nPanels) Self Induced Velocities matrix along normal + real(ReKi), dimension(:,:,:), intent(out) :: UUI !< (3 x nCPs x nPanels) Unit induced velocity + ! Variables + real(ReKi), parameter :: UnitIntensity=1.0_ReKi !< + real(ReKi), dimension(3) :: Uind_tmp !< + integer :: icp, ip !< loop variables + if (OLAF_PROFILING) call tic('SrcPanel build matrix') + !$OMP PARALLEL DEFAULT(shared) + !$OMP DO PRIVATE(icp, ip, Uind_tmp) schedule(runtime) + ! Loop on control points + do icp = 1, Panl%n + ! Control Point (for a given panel) + ! ---- loop on all panls + do ip = 1, Panl%n + call ui_quad_src_11(Panl%Pcent(:,icp), UnitIntensity, Panl%xi(1:4,ip), Panl%eta(1:4,ip), Panl%Pcent(1:3,ip), Panl%R_g2p(1:3,1:3,ip), Uind_tmp) + ! AI= Vi . N + AI(icp, ip) = dot_product(Uind_tmp, Panl%Normal(1:3,icp)) + UUI(:, icp, ip) = Uind_tmp + end do + end do + !$OMP END DO + !$OMP END PARALLEL + if (OLAF_PROFILING) call toc() +end subroutine srcPnl_build_mat + + +!> Compute Wind + induced velocities from all vortex elements except panels on panel points +!! In : Control points p%SrcPnl%Pcent +!! Out: induced velocity m%SrcPnl%Uext +subroutine srcPnl_ExtVelocities_OnPanels(u, p, x, m, errStat, errMsg) + type(FVW_InputType), intent(in ) :: u !< Inputs + type(FVW_ParameterType), intent(in ) :: p !< Parameters + type(FVW_ContinuousStateType), intent(in ) :: x !< States + type(FVW_MiscVarType), intent(inout) :: m !< Initial misc/optimization variables + integer(IntKi), intent( out) :: errStat !< Error status of the operation + character(*), intent( out) :: errMsg !< Error message if ErrStat /= ErrID_None + integer :: icpp + ! TODO new options + type(T_Tree) :: Tree + type(T_Panl) :: Panl + errStat= ErrID_None + errMsg ='' + if (OLAF_PROFILING) call tic('SrcPanel ExtVelocities') + ! --- Induced velocities from all but panels + m%SrcPnl%Uext(1:3,:) = 0.0_ReKi ! Due to side effects of ui_ functions + ! Convert Panels to segments, segments to particles, particles to tree + call InducedVelocitiesAll_Init(p, x, m, m%Sgmt, m%Part, Tree, Panl, errStat, errMsg, allocPart=.false.) + ! We don't want the influence of panels so we nullify + nullify(Panl%p_Src); nullify(Panl%m_Src) + call InducedVelocitiesAll_Calc(p%SrcPnl%Pcent(1:3,:), p%SrcPnl%n, m%SrcPnl%Uext, p, m%Sgmt, m%Part, Tree, Panl, errStat, errMsg) + call InducedVelocitiesAll_End(p, Tree, m%Part, Panl, errStat, errMsg, deallocPart=.false.) + + ! Compute external inflow m%SrcPnl%Uwnd + CALL DistributeRequestedWind_Panels(u%V_wind, p, m) + ! Combine Free stream and external velocity + m%SrcPnl%Uext = m%SrcPnl%Uext + m%SrcPnl%Uwnd + + if (OLAF_PROFILING) call toc() +end subroutine srcPnl_ExtVelocities_OnPanels + +!> Compute the value of the source panel (sigma) +!! assumes that Uext and AI were computed before +subroutine srcPnl_solve(p, m, z, errStat, errMsg) + type(T_SrcPanlParam), intent(in ) :: p + type(T_SrcPanlMisc) , intent(inout) :: m + type(T_SrcPanlVar) , intent(inout) :: z + integer(IntKi) , intent(out) :: errStat ! < Error status of the operation + character(errMsgLen), intent(out) :: errMsg ! < Error message if errStat / = ErrID_None + integer :: icpp + if (OLAF_PROFILING) call tic('SrcPanel Solve') + ! Compute RHS + do icpp = 1, p%n + m%RHS(icpp) = -dot_product(m%Uext(1:3,icpp), p%Normal(1:3,icpp)) + enddo + ! Solve for source intensities Sigma + call linalg_solve(m%AI, m%RHS, m%IPIV, errStat, errMsg) + z%Sigma = m%RHS + if (OLAF_PROFILING) call toc() +end subroutine srcPnl_solve + + +!> Compute velocity, pressure, loads on the source panels +subroutine srcPnl_calcOutput(p, m, z, rho) !, errStat, errMsg + type(T_SrcPanlParam), intent(in ) :: p + type(T_SrcPanlMisc) , intent(inout) :: m + type(T_SrcPanlVar) , intent(in ) :: z + real(ReKi) , intent(in ) :: rho +! integer(IntKi) , intent(out) :: errStat ! < Error status of the operation +! character(errMsgLen), intent(out) :: errMsg ! < Error message if errStat / = ErrID_None + integer :: ip + real(ReKi) :: Uwnd_norm2 + real(ReKi) :: Cp, qinf + if (OLAF_PROFILING) call tic('SrcPanel CalcOutput') + + ! --- Compute induced and total velocity + m%Uind(1,:) = matmul(m%UUI(1,:,:), m%RHS) + m%Uind(2,:) = matmul(m%UUI(2,:,:), m%RHS) + m%Uind(3,:) = matmul(m%UUI(3,:,:), m%RHS) + m%Utot = m%Uind + m%Uext + + ! --- Compute loads + do ip = 1, p%n + Uwnd_norm2 = norm2(m%Uwnd(1:3,ip))**2 + qinf = (0.5_ReKi * rho * Uwnd_norm2) ! TODO use Vinfty... + ! Static pressure ps = 1/2 rho Utot**2 + ! Reference pressure qinf = 1/2 rho Uwnd**2 + ! Pressure Coefficient Cp = ps-pinf/qinf (by convention) + ! Pressure force F = (ps-p0) A e_n + if (Uwnd_norm2>0) then + Cp = max( 1-(norm2(m%Utot(1:3,ip))**2)/Uwnd_norm2, -10._ReKi) ! Bernoulli. + else + Cp = -10._ReKi !!! + endif + !m%p (ip) = (1.0_ReKi - Cp) * qinf + m%p (ip) = Cp * qinf ! Delta p + m%F (1:3,ip) = - Cp * p%Area(ip) * qinf * p%Normal(1:3,ip) + m%FpA(1:3,ip)= m%F (1:3,ip)/p%Area(ip) + m%Cp(ip) = Cp + enddo + if (OLAF_PROFILING) call toc() +endsubroutine srcPnl_calcOutput + +! --- Linear Solve module +subroutine linalg_factor(AA, IPIV, errStat, errMsg) + use NWTC_LAPACK, only : LAPACK_GETRF + real(ReKi), dimension(:, :), intent(inout) :: AA + integer(IntKi),dimension(:), intent(inout) :: IPIV + integer(IntKi), intent(out) :: errStat !< Error status of the operation + character(*), intent(out) :: errMsg !< Error message if ErrStat /= ErrID_None + integer :: m, n + errStat = ErrID_None + errMsg = '' + n = size(AA,1) + m = n + call LAPACK_GETRF(m, n, AA, IPIV, errStat, errMsg) +endsubroutine + +subroutine linalg_solve(AFact, RHS, IPIV, errStat, errMsg) + use NWTC_LAPACK, only : LAPACK_GETRS + real(ReKi), dimension(:, :), intent(in) :: AFact + real(ReKi), dimension(:), intent(inout) :: RHS + integer(IntKi),dimension(:), intent(inout) :: IPIV + integer(IntKi), intent(out) :: errStat !< Error status of the operation + character(*), intent(out) :: errMsg !< Error message if ErrStat /= ErrID_None + integer :: n + n = size(AFact,1) + call LAPACK_GETRS('N', n, AFact, IPIV, RHS, errStat, errMsg) +end subroutine + +!> Solve A x = B +subroutine linalg_solveWrap(AA, B, X, errStat, errMsg) + real(ReKi), dimension(:, :), intent(in) :: AA !< + real(ReKi), dimension(:), intent(in) :: B !< + real(ReKi), dimension(:), intent(out) :: X !< + integer(IntKi), intent(out) :: errStat !< Error status of the operation + character(*), intent(out) :: errMsg !< Error message if ErrStat /= ErrID_None + real(ReKi), dimension(:, :), allocatable :: AA2 + real(ReKi), dimension(:), allocatable :: B2 + integer(IntKi), dimension(:), allocatable :: IPIV + allocate(AA2(size(AA,1), size(AA,2))) + allocate(B2 (size(B,1))) + allocate(IPIV(size(B,1))) + AA2 = AA + B2 = B + call linalg_factor(AA2, IPIV, errStat, errMsg) + call linalg_solve (AA2, B2, IPIV, errStat, errMsg) + X(:) = B2(:) + deallocate(AA2) + deallocate(B2) + deallocate(IPIV) +endsubroutine + end module FVW_Subs diff --git a/modules/aerodyn/src/FVW_Tests.f90 b/modules/aerodyn/src/FVW_Tests.f90 index e2299e97e1..ff83e56bc5 100644 --- a/modules/aerodyn/src/FVW_Tests.f90 +++ b/modules/aerodyn/src/FVW_Tests.f90 @@ -1,7 +1,5 @@ module FVW_Tests - use NWTC_Library - use FVW_Types use FVW_Subs use FVW_VortexTools @@ -13,216 +11,184 @@ module FVW_Tests implicit none public :: FVW_RunTests + public :: Test_LinSolve + public :: Test_SrcPnl_Sphere + public :: Test_BiotSavart_SrcPnl + public :: Test_BiotSavart_Sgmt + public :: Test_BiotSavart_Part + public :: Test_BiotSavart_PartTree + public :: Test_SegmentsToPart + public :: FVW_Test_WakeInducedVelocities + + private + character(len=*), parameter :: testname = 'FVW' interface test_equal; module procedure & test_equal_i1, & test_equal_i0 end interface - interface test_almost_equal; module procedure & - test_almost_equal_0, & - test_almost_equal_1, & - test_almost_equal_2 - end interface + interface test_almost_equal; module procedure & + test_almost_equal_0, & + test_almost_equal_1, & + test_almost_equal_2 + end interface contains ! -------------------------------------------------------------------------------- ! --- Helper functions (should be part of NWTC library) ! -------------------------------------------------------------------------------- - subroutine test_success(testname,info,bPrint_in) - character(len=*), intent(in) :: testname - character(len=*), intent(in) :: info - logical, intent(in), optional :: bPrint_in - if(present(bPrint_in)) then - if(bPrint_in) then - write(*,'(A)')'[ OK ] '//trim(testname)//': '//trim(Info) - endif - else - write(*,'(A)')'[ OK ] '//trim(testname)//': '//trim(Info) - endif - end subroutine - - subroutine test_fail(testname,info,bPrint_in,bStop_in) - character(len=*), intent(in) :: testname - character(len=*), intent(in) :: info - logical, intent(in), optional :: bPrint_in - logical, intent(in), optional :: bStop_in - if(present(bPrint_in)) then - if(bPrint_in) then - write(*,'(A)')'[FAIL] '//trim(testname)//': '//trim(Info) - endif - else - write(*,'(A)')'[FAIL] '//trim(testname)//': '//trim(Info) - endif - if(present(bStop_in)) then - if(bStop_in) then - STOP - endif - else - STOP - endif - end subroutine - - subroutine test_equal_i0(testname,Var,iTry,iRef) - ! Arguments - character(len=*), intent(in) :: testname - character(len=*), intent(in) :: Var - integer, intent(in) :: iTry !< - integer, intent(in) :: iRef !< - ! Variables - character(len=255) :: InfoAbs - if(iRef/=iTry) then - write(InfoAbs,'(A,I0,A,I0)') trim(Var),iRef,'/',iTry - call test_fail(testname,InfoAbs) - STOP - else - write(InfoAbs,'(A,A,I0)') trim(Var),' ok ',iRef - call test_success(testname,InfoAbs) - endif - end subroutine - - subroutine test_equal_i1(testname,Var,VecTry,VecRef,bTest,bPrintOnly,bPassed) - ! Arguments - character(len=*), intent(in) :: testname - character(len=*), intent(in) :: Var - integer, dimension(:), intent(in) :: VecTry !< - integer, dimension(:), intent(in) :: VecRef !< - logical, intent(in) :: bTest - logical, intent(in) :: bPrintOnly - logical, intent(out),optional :: bPassed - ! Variables - character(len=255) :: InfoAbs - integer :: i,cpt - ! - cpt=0 - do i=1,size(VecRef) - if(VecRef(i)/=VecTry(i)) then - cpt=cpt+1 - endif - enddo - if(cpt>0) then - write(InfoAbs,'(A,I0)') trim(Var)//' Elements different: ',cpt - if(present(bPassed)) then - bPassed=.false. - endif - else - write(InfoAbs,'(A)') trim(Var)//' reproduced to identity' - if(present(bPassed)) then - bPassed=.true. - endif - endif - if(bPrintOnly) then - print'(A)',trim(InfoAbs) - endif - if(bTest) then - if(cpt>0) then - call test_fail(testname,InfoAbs) - STOP - else - call test_success(testname,InfoAbs) - endif - endif - end subroutine - - subroutine test_almost_equal_0(testname,Var,Ref,Try,MINNORM,bStop,bPrint,bPassed) - ! Arguments - character(len=*), intent(in) :: testname - character(len=*), intent(in) :: Var - real(ReKi), intent(in) :: Ref !< - real(ReKi), intent(in) :: Try !< - real(ReKi), intent(in) :: MINNORM - logical, intent(in) :: bStop - logical, intent(in) :: bPrint - logical, intent(out),optional :: bPassed - ! Variables - character(len=255) :: InfoAbs - real(ReKi) :: delta - integer :: cpt - ! - cpt=0 - delta=abs(Ref-Try) - if(delta>MINNORM) then - write(InfoAbs,'(A,ES8.1E2,A,ES8.1E2,A,I0)') trim(Var)//' tol: ',MINNORM,', mean: ',delta,' - Failed:',cpt - call test_fail(testname,InfoAbs,bPrint,bStop) - else - write(InfoAbs,'(A,ES8.1E2,A,ES8.1E2)') trim(Var)//' tol: ',MINNORM,', mean: ',delta - call test_success(testname,InfoAbs,bPrint) - endif - if(present(bPassed)) then - bPassed=delta>MINNORM - endif - end subroutine - subroutine test_almost_equal_1(testname,Var,VecRef,VecTry,MINNORM,bStop,bPrint,bPassed) - ! Arguments - character(len=*), intent(in) :: testname - character(len=*), intent(in) :: Var - real(ReKi), dimension(:), intent(in) :: VecRef !< - real(ReKi), dimension(:), intent(in) :: VecTry !< - real(ReKi), intent(in) :: MINNORM - logical, intent(in) :: bStop - logical, intent(in) :: bPrint - logical, intent(out),optional :: bPassed - ! Variables - character(len=255) :: InfoAbs - integer :: i,cpt - real(ReKi) :: delta - real(ReKi) :: delta_cum - ! - cpt=0 - delta_cum=0.0_ReKi - do i=1,size(VecRef,1) - delta=abs(VecRef(i)-VecTry(i)) - delta_cum=delta_cum+delta - if(delta>MINNORM) then - cpt=cpt+1 - endif - enddo - delta_cum=delta_cum/size(VecRef) - - if(cpt>0) then - write(InfoAbs,'(A,ES8.1E2,A,ES8.1E2,A,I0)') trim(Var)//' tol: ',MINNORM,', mean: ',delta_cum,' - Failed:',cpt - call test_fail(testname,InfoAbs,bPrint,bStop) - else - write(InfoAbs,'(A,ES8.1E2,A,ES8.1E2)') trim(Var)//' tol: ',MINNORM,', mean: ',delta_cum - call test_success(testname,InfoAbs,bPrint) - endif - if(present(bPassed)) then - bPassed=(cpt==0) - endif - end subroutine - subroutine test_almost_equal_2(testname,Var,VecRef,VecTry,MINNORM,bStop,bPrint,bPassed) - ! Arguments - character(len=*), intent(in) :: testname - character(len=*), intent(in) :: Var - real(ReKi), dimension(:,:), intent(in) :: VecRef !< - real(ReKi), dimension(:,:), intent(in) :: VecTry !< - real(ReKi), intent(in) :: MINNORM - logical, intent(in) :: bStop - logical, intent(in) :: bPrint - logical, intent(out),optional :: bPassed - ! Variables - real(ReKi), dimension(:),allocatable :: VecRef2 !< - real(ReKi), dimension(:),allocatable :: VecTry2 !< - integer :: p, i,j,n1,n2,nCPs - ! - n1 = size(VecRef,1); n2 = size(VecRef,2); nCPs=n1*n2 - allocate ( VecRef2 (n1*n2) ) ; allocate ( VecTry2 (n1*n2) ) - p=0 - do j=1,n2; do i=1,n1 - p=p+1 - VecRef2(p)=VecRef(i,j) - VecTry2(p)=VecTry(i,j) - enddo; enddo; - call test_almost_equal(testname,Var,VecRef2,VecTry2,MINNORM,bStop,bPrint,bPassed) - end subroutine + subroutine test_success(info, errStat, errMsg) + character(len=*), intent(in) :: info + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + write(*,'(A)')'[ OK ] '//trim(testname)//': '//trim(Info) + errStat = ErrID_None + errMsg = '' + end subroutine + + subroutine test_fail(info, errStat, errMsg) + character(len=*), intent(in) :: info + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + write(*,'(A)')'[FAIL] '//trim(testname)//': '//trim(Info) + errStat = ErrID_Fatal + errMsg = '[FAIL] '//trim(testname)//': '//trim(Info) + end subroutine + + subroutine test_equal_i0(Var, iTry, iRef, errStat, errMsg) + ! Arguments + character(len=*), intent(in) :: Var + integer, intent(in) :: iTry !< + integer, intent(in) :: iRef !< + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + ! Variables + character(len=255) :: InfoAbs + if(iRef/=iTry) then + write(InfoAbs,'(A,I0,A,I0)') trim(Var),iRef,'/',iTry + call test_fail(InfoAbs, errStat, errMsg) + else + write(InfoAbs,'(A,A,I0)') trim(Var),' ok ',iRef + call test_success(InfoAbs, errStat, errMsg) + endif + end subroutine + + subroutine test_equal_i1(Var, VecTry, VecRef, errStat, errMsg) + ! Arguments + character(len=*), intent(in) :: Var + integer, dimension(:), intent(in) :: VecTry !< + integer, dimension(:), intent(in) :: VecRef !< + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + ! Variables + character(len=255) :: InfoAbs + integer :: i,cpt + ! + cpt=0 + do i=1,size(VecRef) + if(VecRef(i)/=VecTry(i)) then + cpt=cpt+1 + endif + enddo + if(cpt>0) then + write(InfoAbs,'(A,I0)') trim(Var)//' Elements different: ',cpt + else + write(InfoAbs,'(A)') trim(Var)//' reproduced to identity' + endif + if(cpt>0) then + call test_fail(InfoAbs, errStat, errMsg) + else + call test_success(InfoAbs, errStat, errMsg) + endif + end subroutine + + subroutine test_almost_equal_0(Var, Ref, Try, MINNORM, errStat, errMsg) + ! Arguments + character(len=*), intent(in) :: Var + real(ReKi), intent(in) :: Ref !< + real(ReKi), intent(in) :: Try !< + real(ReKi), intent(in) :: MINNORM + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + ! Variables + character(len=255) :: InfoAbs + real(ReKi) :: delta + integer :: cpt + ! + cpt=0 + delta=abs(Ref-Try) + if(delta>MINNORM) then + write(InfoAbs,'(A,ES8.1E2,A,ES8.1E2,A,I0)') trim(Var)//' tol: ',MINNORM,', mean: ',delta,' - Failed:',cpt + call test_fail(InfoAbs, errStat, errMsg) + else + write(InfoAbs,'(A,ES8.1E2,A,ES8.1E2)') trim(Var)//' tol: ',MINNORM,', mean: ',delta + call test_success(InfoAbs, errStat, errMsg) + endif + end subroutine + subroutine test_almost_equal_1(Var, VecRef, VecTry, MINNORM, errStat, errMsg) + ! Arguments + character(len=*), intent(in) :: Var + real(ReKi), dimension(:), intent(in) :: VecRef !< + real(ReKi), dimension(:), intent(in) :: VecTry !< + real(ReKi), intent(in) :: MINNORM + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + ! Variables + character(len=255) :: InfoAbs + integer :: i,cpt + real(ReKi) :: delta + real(ReKi) :: delta_cum + ! + cpt=0 + delta_cum=0.0_ReKi + do i=1,size(VecRef,1) + delta=abs(VecRef(i)-VecTry(i)) + delta_cum=delta_cum+delta + if(delta>MINNORM) then + cpt=cpt+1 + endif + enddo + delta_cum=delta_cum/size(VecRef) + + if(cpt>0) then + write(InfoAbs,'(A,ES8.1E2,A,ES8.1E2,A,I0)') trim(Var)//' tol: ',MINNORM,', mean: ',delta_cum,' - Failed:',cpt + call test_fail(InfoAbs, errStat, errMsg) + else + write(InfoAbs,'(A,ES8.1E2,A,ES8.1E2)') trim(Var)//' tol: ',MINNORM,', mean: ',delta_cum + call test_success(InfoAbs, errStat, errMsg) + endif + end subroutine + subroutine test_almost_equal_2(Var, VecRef, VecTry, MINNORM, errStat, errMsg) + ! Arguments + character(len=*), intent(in) :: Var + real(ReKi), dimension(:,:), intent(in) :: VecRef !< + real(ReKi), dimension(:,:), intent(in) :: VecTry !< + real(ReKi), intent(in) :: MINNORM + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + ! Variables + real(ReKi), dimension(:),allocatable :: VecRef2 !< + real(ReKi), dimension(:),allocatable :: VecTry2 !< + integer :: p, i,j,n1,n2,nCPs + ! + n1 = size(VecRef,1); n2 = size(VecRef,2); nCPs=n1*n2 + allocate ( VecRef2 (n1*n2) ) ; allocate ( VecTry2 (n1*n2) ) + p=0 + do j=1,n2; do i=1,n1 + p=p+1 + VecRef2(p)=VecRef(i,j) + VecTry2(p)=VecTry(i,j) + enddo; enddo; + call test_almost_equal(Var,VecRef2,VecTry2,MINNORM, errStat, errMsg) + end subroutine ! --------------------------------------------------------------------------------} ! --- Specific FVW tests ! --------------------------------------------------------------------------------{ !> - subroutine Test_BiotSavart_Sgmt(testname, ErrStat, ErrMsg) - character(len=*), intent(in) :: testname - integer(IntKi) , intent(out) :: ErrStat !< Error status of the operation - character(ErrMsgLen), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + subroutine Test_BiotSavart_Sgmt(errStat, errMsg) + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None real(ReKi), dimension(3) :: P1,P2,P3,CP real(ReKi), dimension(3) :: U1 real(ReKi) :: SegGamma1 !< Circulation [m^2/s] @@ -239,9 +205,9 @@ subroutine Test_BiotSavart_Sgmt(testname, ErrStat, ErrMsg) real(ReKi), dimension(nSegTot) :: RegParam !< Regularization parameter real(ReKi), dimension(3,nCPsTot) :: Uind_out !< Induced velocity vector - Side effects!!! real(ReKi), dimension(3,4) :: CPs_test !< - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" + ! Initialize errStat + errStat = ErrID_None + errMsg = "" ! --- Test that the two functions return the same values P1=(/0. ,0.,-1./) P2=(/0. ,0., 1./) @@ -274,7 +240,7 @@ subroutine Test_BiotSavart_Sgmt(testname, ErrStat, ErrMsg) !print*,'Reg function', RegFunction, 'CP',CP !print*,'Uind_out',Uind_out !print*,'U1 ',U1 - call test_almost_equal(testname,'Uind method1/2', U1, Uind_out(:,1), 1e-4_ReKi, .true.,.true.) + call test_almost_equal('Uind method1/2', U1, Uind_out(:,1), 1e-4_ReKi, errStat, errMsg) !call test_almost_equal('Uind method1/2', U1, Uind_out(:,1), 1e-4, .false.,.true.) enddo enddo @@ -313,16 +279,15 @@ subroutine Test_BiotSavart_Sgmt(testname, ErrStat, ErrMsg) !print*,'Reg function', RegFunction, 'CP',CP !print*,'Uind_out',Uind_out !print*,'U1 ',U1 - call test_almost_equal(testname,'Uind 1seg/2seg', U1, Uind_out(:,1), 1e-4_ReKi, .true.,.true.) + call test_almost_equal('Uind 1seg/2seg', U1, Uind_out(:,1), 1e-4_ReKi, errStat, errMsg) enddo enddo end subroutine !> - subroutine Test_BiotSavart_Part(testname, ErrStat, ErrMsg) - character(len=*), intent(in) :: testname - integer(IntKi) , intent(out) :: ErrStat !< Error status of the operation - character(ErrMsgLen), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + subroutine Test_BiotSavart_Part(errStat, errMsg) + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None real(ReKi), dimension(3) :: P1,CP real(ReKi), dimension(3) :: U1 real(ReKi), dimension(3) :: PartAlpha1 !< Particle intensity alpha=om.dV [m^3/s] @@ -337,9 +302,9 @@ subroutine Test_BiotSavart_Part(testname, ErrStat, ErrMsg) real(ReKi), dimension(nPart) :: RegParam !< Regularization parameter real(ReKi), dimension(3,nCPs) :: Uind_out !< Induced velocity vector - Side effects!!! real(ReKi), dimension(3,4) :: CPs_test !< - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" + ! Initialize errStat + errStat = ErrID_None + errMsg = "" ! --- Test that the two functions return the same values P1=(/0.0, 0.0, -1.0 /) CPs_test(:,1) = (/ 0.0, 0., 0.0 /) ! Middle @@ -368,16 +333,15 @@ subroutine Test_BiotSavart_Part(testname, ErrStat, ErrMsg) !print*,'Reg function', RegFunction, 'CP',CP !print*,'Uind_out',Uind_out !print*,'U1 ',U1 - call test_almost_equal(testname,'Uind part method1/2', U1, Uind_out(:,1), 1e-4_ReKi, .true.,.true.) + call test_almost_equal('Uind part method1/2', U1, Uind_out(:,1), 1e-4_ReKi, errStat, errMsg) enddo enddo end subroutine Test_BiotSavart_Part !> This test compares calls using the tree algorithm and the direct N^2 evaluation - subroutine Test_BiotSavart_PartTree(testname, ErrStat, ErrMsg) - character(len=*), intent(in) :: testname - integer(IntKi) , intent(out) :: ErrStat !< Error status of the operation - character(ErrMsgLen), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + subroutine Test_BiotSavart_PartTree(errStat, errMsg) + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None type(T_Tree) :: Tree real(ReKi), dimension(3) :: U_ref integer(IntKi) :: i1,i2,i3,k, iCP @@ -392,9 +356,9 @@ subroutine Test_BiotSavart_PartTree(testname, ErrStat, ErrMsg) real(ReKi), dimension(:,:), allocatable :: Uind2 !< Induced velocity vector - Side effects!!! real(ReKi) :: BranchFactor, BranchSmall real(ReKi), dimension(3,5) :: CPs_test !< - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" + ! Initialize errStat + errStat = ErrID_None + errMsg = "" BranchFactor = 2.0_ReKi !< Should be above1 BranchSmall = 0.0_ReKi RegFunction = 1 @@ -408,10 +372,10 @@ subroutine Test_BiotSavart_PartTree(testname, ErrStat, ErrMsg) U_ref =0.0_ReKi call grow_tree_part(Tree, nPart, PartPoints, PartAlpha, RegFunction, RegParam, 0) !call print_tree(Tree) - call ui_tree_part(Tree, nCPs, CPs, BranchFactor, BranchSmall, Uind2, ErrStat, ErrMsg) + call ui_tree_part(Tree, nCPs, CPs, BranchFactor, BranchSmall, Uind2, errStat, errMsg) call ui_part_nograd(nCPS, CPs, nPart, PartPoints, PartAlpha, RegFunction, RegParam, Uind1) ! Test - call test_almost_equal(testname,'Uind tree 0 part', U_ref, Uind2(:,1), 1e-4_ReKi, .true.,.true.) + call test_almost_equal('Uind tree 0 part', U_ref, Uind2(:,1), 1e-4_ReKi, errStat, errMsg) call cut_tree(Tree) call dealloc() @@ -424,10 +388,10 @@ subroutine Test_BiotSavart_PartTree(testname, ErrStat, ErrMsg) U_ref =0.0_ReKi call grow_tree_part(Tree, nPart, PartPoints, PartAlpha, RegFunction, RegParam, 0) !call print_tree(Tree) - call ui_tree_part(Tree, nCPs, CPs, BranchFactor, BranchSmall, Uind2, ErrStat, ErrMsg) + call ui_tree_part(Tree, nCPs, CPs, BranchFactor, BranchSmall, Uind2, errStat, errMsg) call ui_part_nograd(nCPS, CPs, nPart, PartPoints, PartAlpha, RegFunction, RegParam, Uind1) ! Test - call test_almost_equal(testname,'Uind tree 1 part', Uind1, Uind2, 1e-4_ReKi, .true.,.true.) + call test_almost_equal('Uind tree 1 part', Uind1, Uind2, 1e-4_ReKi, errStat, errMsg) call cut_tree(Tree) !call print_tree(Tree) call dealloc() @@ -457,16 +421,16 @@ subroutine Test_BiotSavart_PartTree(testname, ErrStat, ErrMsg) do iCP=1,4 CPs(:,1) = CPs_test(:,icp) Uind2=0.0_ReKi; Uind1=0.0_ReKi - call ui_tree_part(Tree, nCPs, CPs, BranchFactor, BranchSmall, Uind2, ErrStat, ErrMsg) + call ui_tree_part(Tree, nCPs, CPs, BranchFactor, BranchSmall, Uind2, errStat, errMsg) call ui_part_nograd(nCPs, CPs, nPart, PartPoints, PartAlpha, RegFunction, RegParam, Uind1) !print*,'Uind',Uind1, Uind2 ! Test - call test_almost_equal(testname,'Uind tree 81 part', Uind1, Uind2, 1e-2_ReKi, .true.,.true.) + call test_almost_equal('Uind tree 81 part', Uind1, Uind2, 1e-2_ReKi, errStat, errMsg) enddo call cut_tree(Tree) ! --- Test that tree ui cannot be called after tree has been cut - call ui_tree_part(Tree, nCPs, CPs, BranchFactor, BranchSmall, Uind2, ErrStat, ErrMsg) - call test_equal(testname,'Err. stat tree cut',ErrStat,ErrID_Fatal) + call ui_tree_part(Tree, nCPs, CPs, BranchFactor, BranchSmall, Uind2, errStat, errMsg) + call test_equal('Err. stat tree cut', errStat, ErrID_Fatal, errStat, errMsg) call dealloc() contains @@ -487,11 +451,49 @@ subroutine dealloc() end subroutine end subroutine Test_BiotSavart_PartTree + subroutine Test_BiotSavart_SrcPnl(errStat, errMsg) + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + integer, parameter :: ncp=5 + integer, parameter :: np=1 + real(ReKi), dimension(3,ncp) :: CPs + real(ReKi), dimension(3,ncp) :: UI + real(ReKi), dimension(3,ncp) :: UI_ref + real(ReKi), dimension(3,ncp) :: Grad + real(ReKi), dimension(np) :: Sigmas + real(ReKi), dimension(3,np) :: RefPoint + real(ReKi), dimension(4,np) :: xi + real(ReKi), dimension(4,np) :: eta + real(ReKi), dimension(3,3,np) :: TransfoMat + errStat = ErrID_None + errMsg = "" + Sigmas(1) = 2._ReKi + xi (1:4,1)= [-1,0,1,0] + eta(1:4,1)= [0 ,1,0,-1] + TransfoMat = 0.0_ReKi + TransfoMat(1,1,1) = 1._ReKi + TransfoMat(2,2,1) = 1._ReKi + TransfoMat(3,3,1) = 1._ReKi + RefPoint(1:3,1) = [0,0,0] + UI = 0.0_ReKi + CPs(1:3,1)= [ 0.0_ReKi, 0.0_ReKi, 0.0_ReKi] + CPs(1:3,2)= [-1.0_ReKi, 1.0_ReKi, 1.0_ReKi] + CPs(1:3,3)= [ 1.0_ReKi,-1.0_ReKi, 1.0_ReKi] + CPs(1:3,4)= [ 2.0_ReKi, 2.0_ReKi, 2.0_ReKi] + CPs(1:3,5)= [ 0.0_ReKi, 0.0_ReKi, 1.0_ReKi] + call ui_quad_src_nn(CPs, Sigmas, xi, eta, RefPoint, TransfoMat, UI, ncp, np) + + UI_ref(1,:)= [0.0000e+00,-5.676174595996415e-02, 5.676174595996415e-02, 1.508218771767720e-02, 0.000000000000000e+00] + UI_ref(2,:)= [0.0000e+00, 5.676174595996415e-02 ,-5.676174595996415e-02, 1.508218771767721e-02, 0.000000000000000e+00] + UI_ref(3,:)= [1.0000e+00, 6.672740817112868e-02 , 6.672740817112868e-02, 1.571922940762083e-02, 2.163468959387855e-01] + call test_almost_equal('Uind src', UI, UI_ref, 1e-6_ReKi, errStat, errMsg) + end subroutine Test_BiotSavart_SrcPnl + + !> Compares the velocity field obtained from a segment and its convert to particle version - subroutine Test_SegmentsToPart(testname, ErrStat, ErrMsg) - character(len=*), intent(in) :: testname - integer(IntKi) , intent(out) :: ErrStat !< Error status of the operation - character(ErrMsgLen), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + subroutine Test_SegmentsToPart(errStat, errMsg) + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None real(ReKi), dimension(:,:), allocatable :: PartPoints !< Particle points real(ReKi), dimension(:,:), allocatable :: PartAlpha !< Particle circulation real(ReKi), dimension(:) , allocatable :: PartEpsilon !< Regularization parameter @@ -508,8 +510,10 @@ subroutine Test_SegmentsToPart(testname, ErrStat, ErrMsg) real(ReKi) :: RegParam1 !< integer(IntKi) :: nPartPerSeg, nPart, iHeadP integer(IntKi) :: RegFunctionPart, RegFunctionSeg - ErrStat = ErrID_None - ErrMsg = "" + integer(IntKi) :: errStat2 !< Error status of the operation + character(errMsgLen) :: errMsg2 !< Error message if errStat /= ErrID_None + errStat = ErrID_None + errMsg = "" RegParam1=1.0 ! Creating two aligned segments SegConnct(:,1)=(/1,2/) @@ -544,7 +548,7 @@ subroutine Test_SegmentsToPart(testname, ErrStat, ErrMsg) Uind1 =0.0_ReKi; Uind2 =0.0_ReKi; call ui_seg(1, nCPsTot, CPs, 1, nSegTot, SegPoints, SegConnct, SegGamma, RegFunctionSeg, SegEpsilon, Uind1) call ui_part_nograd(nCPSTot, CPs, nPart, PartPoints, PartAlpha, RegFunctionPart, PartEpsilon, Uind2) - call test_almost_equal(testname,'Uind 10 part/sgmt no reg', Uind1, Uind2, 1e-3_ReKi, .true.,.true.) + call test_almost_equal('Uind 10 part/sgmt no reg', Uind1, Uind2, 1e-3_ReKi, errStat2, errMsg2); if(Failed())return call dealloc() ! --- Test 1 - 2 particles, no regularization @@ -560,7 +564,7 @@ subroutine Test_SegmentsToPart(testname, ErrStat, ErrMsg) Uind1 =0.0_ReKi; Uind2 =0.0_ReKi; call ui_seg(1, nCPsTot, CPs, 1, nSegTot, SegPoints, SegConnct, SegGamma, RegFunctionSeg, SegEpsilon, Uind1) call ui_part_nograd(nCPsTot, CPs, nPart, PartPoints, PartAlpha, RegFunctionPart, PartEpsilon, Uind2) - call test_almost_equal(testname,'Uind 2 part/sgmt noreg', Uind1, Uind2, 3e-1_ReKi, .true.,.true.) + call test_almost_equal('Uind 2 part/sgmt noreg', Uind1, Uind2, 3e-1_ReKi, errStat2, errMsg2); if(Failed())return call dealloc() @@ -584,7 +588,7 @@ subroutine Test_SegmentsToPart(testname, ErrStat, ErrMsg) !print'(A,10F7.3)','Uind2',Uind2(2,:) !print'(A,10F7.3)','Uind1',Uind1(3,:) !print'(A,10F7.3)','Uind2',Uind2(3,:) - call test_almost_equal(testname,'Uind 10 part/sgmt w.reg', Uind1, Uind2, 5e-2_ReKi, .true.,.true.) + call test_almost_equal('Uind 10 part/sgmt w.reg', Uind1, Uind2, 5e-2_ReKi, errStat, errMsg) call dealloc() contains @@ -598,6 +602,10 @@ subroutine alloc(n) subroutine dealloc() deallocate(PartPoints, PartAlpha, PartEpsilon) end subroutine + logical function Failed() + call SeterrStat(errStat2, errMsg2, errStat, errMsg, 'Test_SegmentsToPart') + Failed = errStat >= AbortErrLev + end function end subroutine Test_SegmentsToPart !> @@ -748,25 +756,25 @@ subroutine MeshMe(M,offset) !> Test Wake Induced velocity calcualtion when using nNWMax or nNWFree !! A dummy helical wake is created. The induced velocity is computed on !! either the full wake, or just the "free" wake (which should be way faster) - subroutine FVW_Test_WakeInducedVelocities(ErrStat, ErrMsg) - integer(IntKi) , intent(out) :: ErrStat !< Error status of the operation - character(ErrMsgLen), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + subroutine FVW_Test_WakeInducedVelocities(errStat, errMsg) + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None type(FVW_ParameterType) :: p !< Parameters type(FVW_ContinuousStateType) :: x !< States type(FVW_MiscVarType) :: m !< Initial misc/optimization variables !type(FVW_VTK_Misc) :: mvtk integer :: iW, j, k, nSpan - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FVW_Test_CPUTime' + integer(IntKi) :: errStat2 + character(errMsgLen) :: errMsg2 + character(*), parameter :: RoutineName = 'Test_CPUTime' integer(ReKi), parameter :: nR = 20 real(ReKi), parameter :: R = 100 real(ReKi), parameter :: G = 100 real(ReKi), allocatable, dimension(:,:) :: V1 real(ReKi), allocatable, dimension(:,:) :: V2 real(ReKi) :: t1,t2 - ErrStat = ErrID_None - ErrMsg = "" + errStat = ErrID_None + errMsg = "" ! --- Create a helical wake TODO, put me into FVW_* p%nWings = 3 @@ -784,7 +792,7 @@ subroutine FVW_Test_WakeInducedVelocities(ErrStat, ErrMsg) p%PartPerSegment = 1 allocate(p%W(p%nWings)) p%W(:)%nSpan = nSpan - call FVW_InitStates( x, p, ErrStat, ErrMsg ) + call FVW_InitStates( x, p, errStat, errMsg ) do iW=1,size(x%W); do j=1,size(x%W(iW)%r_NW,2); do k=1,size(x%W(iW)%r_NW,3); @@ -802,61 +810,152 @@ subroutine FVW_Test_WakeInducedVelocities(ErrStat, ErrMsg) enddo allocate(m%W(p%nWings)) do iW = 1,p%nWings - call AllocAry( m%W(iW)%Vind_NW , 3 , nSpan+1 ,p%nNWMax+1, 'Vind on NW ', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName); m%W(iW)%Vind_NW= -999_ReKi; - call AllocAry( m%W(iW)%Vind_FW , 3 , FWnSpan+1,p%nFWMax+1, 'Vind on FW ', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName); m%W(iW)%Vind_FW= -999_ReKi; + call AllocAry( m%W(iW)%Vind_NW , 3 , nSpan+1 ,p%nNWMax+1, 'Vind on NW ', errStat2, errMsg2); call SeterrStat(errStat2, errMsg2, errStat, errMsg, RoutineName); m%W(iW)%Vind_NW= -999_ReKi; + call AllocAry( m%W(iW)%Vind_FW , 3 , FWnSpan+1,p%nFWMax+1, 'Vind on FW ', errStat2, errMsg2); call SeterrStat(errStat2, errMsg2, errStat, errMsg, RoutineName); m%W(iW)%Vind_FW= -999_ReKi; enddo - call FVW_InitMiscVarsPostParam( p, m, ErrStat2, ErrMsg2) ! Alloc Sgmt, CPs, Uind + call FVW_InitMiscVarsPostParam( p, m, errStat2, errMsg2) ! Alloc Sgmt, CPs, Uind ! --- Compute induced velocity on full wake allocate(V1(3,nSpan+1)) p%nNWFree=p%nNWMax call cpu_time(t1) - call WakeInducedVelocities(p, x, m, ErrStat2, ErrMsg2); + call WakeInducedVelocities(p, x, m, errStat2, errMsg2); call cpu_time(t2) - print*,'Ellapsed time',t2-t1 + !print*,'Ellapsed time',t2-t1 V1 = m%W(1)%Vind_NW(:,:,1) ! --- Compute induced velocity on free wake only allocate(V2(3,nSpan+1)) p%nNWFree=int(p%nNWMax/5) call cpu_time(t1) - call WakeInducedVelocities(p, x, m, ErrStat2, ErrMsg2); + call WakeInducedVelocities(p, x, m, errStat2, errMsg2); call cpu_time(t2) - print*,'Ellapsed time',t2-t1 + !print*,'Ellapsed time',t2-t1 V2 = m%W(1)%Vind_NW(:,:,1) - !print*,'>>>Vx mean ',sum(abs((V1(1,:))))/nSpan - !print*,'>>>Vx mean ',sum(abs((V2(1,:))))/nSpan - !print*,'>>> Vx error',sum(abs(V1(1,:)-V2(1,:)))/nSpan - !print*,'>>> Vy error',sum(abs(V1(2,:)-V2(2,:)))/nSpan - !print*,'>>> Vz error',sum(abs(V1(3,:)-V2(3,:)))/nSpan - !call WrVTK_Segments('_TEST.vtk', mvtk, m%Sgmt%Points(:,:), m%Sgmt%Connct(:,:), m%Sgmt%Gamma(:), m%Sgmt%Epsilon(:), .false.) - call test_almost_equal(RoutineName,'Uind nNW/nNWFree', V1, V2, 1e-6_ReKi, .true.,.true.) + call test_almost_equal('Uind nNW/nNWFree', V1, V2, 1e-6_ReKi, errStat, errMsg) deallocate(V1) deallocate(V2) - call FVW_DestroyParam(p, ErrStat2, ErrMsg2) - call FVW_DestroyContState(x, ErrStat2, ErrMsg2) - call FVW_DestroyMisc(m, ErrStat2, ErrMsg2) + call FVW_DestroyParam(p, errStat2, errMsg2) + call FVW_DestroyContState(x, errStat2, errMsg2) + call FVW_DestroyMisc(m, errStat2, errMsg2) end subroutine FVW_Test_WakeInducedVelocities + + !> Test the resolution of a system A x = b + subroutine Test_LinSolve(errStat, errMsg) + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + real(ReKi) :: AA(3,3) + real(ReKi) :: B(3) + real(ReKi) :: B2(3) + real(ReKi) :: X(3) + errStat = ErrID_None + errMsg = "" + ! --- Test for non singular system + AA(1,:) = (/ 0., 1., 1./) + AA(2,:) = (/ 1., 2., 0./) + AA(3,:) = (/ 0., 0., 3./) + B(1:3) = (/ 1., 1., 1./) + call linalg_solveWrap(AA, B, X, errStat, errMsg) + B2 = matmul(AA, X) + call test_almost_equal('LinSolve 3x3 ', B, B2, 1e-8, errStat, errMsg) + + end subroutine Test_LinSolve + + !> Test that the pressure coefficient on a sphere (made of source panel) match potential flow theory + subroutine Test_SrcPnl_Sphere(errStat, errMsg) + use VTK, only: vtk_misc_init + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + ! + type(T_SrcPanlParam) :: p_SrcPnl + type(T_SrcPanlVar) :: z_SrcPnl + type(T_SrcPanlMisc) :: m_SrcPnl + integer(IntKi) :: errStat2 + character(errMsgLen) :: errMsg2 + integer, parameter :: nMain = 17 !< + integer, parameter :: nScnd = 15 !< + !integer, parameter :: nMain =67 !< + !integer, parameter :: nScnd =65 !< + integer :: ncp + integer :: np , icpp, ip + real(ReKi), dimension(3) :: Uwnd + real(ReKi) :: Uwnd_norm2 + real(ReKi) :: rho, Cp + character(32) :: label + type(VTK_Misc) :: mvtk + errStat = ErrID_None + errMsg = "" + + call EllipsoidPanels(nMain, nScnd, 1., 1., 1., p_SrcPnl%P, p_SrcPnl%IDs, 5.0) + call srcPnl_init(p_SrcPnl, m_SrcPnl, z_SrcPnl, errStat2, errMsg2); if(Failed()) return + label = 'n1='//trim(num2lstr(nMain))//' - n2='//trim(num2lstr(nScnd)) + call AllocAry(p_SrcPnl%BodyIDs, p_SrcPnl%n, 'BodyIDs', errStat2, errMsg2); if(Failed()) return + p_SrcPnl%BodyIDs(:) = 1 + p_SrcPnl%Comment = ' - Sphere - '//trim(label) + + ! --- Compute Uext + do icpp = 1, p_SrcPnl%n + m_SrcPnl%Uwnd(:, icpp) = (/1.0, 0., 0./) + enddo + m_SrcPnl%Uext = m_SrcPnl%Uwnd ! + Uind_other + + ! Compute the value of the source panel (sigma) ! assumes that Uext and AI were computed before + call srcPnl_solve(p_SrcPnl, m_SrcPnl, z_SrcPnl, errStat2, errMsg2); if(Failed()) return + + ! Compute velocity, pressure, loads on the source panels + call srcPnl_calcOutput(p_SrcPnl, m_SrcPnl, z_SrcPnl, 1.225_ReKi) !, errStat, errMsg + + call vtk_misc_init(mvtk) + call WrVTK_Panels('_FVW_Tests_Sphere_'//trim(label)//'.vtk', mvtk, p_SrcPnl, m_SrcPnl, z_SrcPnl) + + !print*,'>>>> CP Min Max',(/minval(m_SrcPnl%Cp), maxval(m_SrcPnl%Cp)/) + !print*,'>>>> P Min Max',(/minval(m_SrcPnl%p), maxval(m_SrcPnl%p)/) + if (nMain==17) then + call test_almost_equal('Cp sphere', (/minval(m_SrcPnl%Cp), maxval(m_SrcPnl%Cp)/), (/-1.2987,1.0000/), 1e-3_ReKi, errStat2, errMsg2);if(Failed())return + !call test_almost_equal('p sphere' , (/minval(m_SrcPnl%p), maxval(m_SrcPnl%p)/) , (/0.000,1.4079/), 1e-3_ReKi, errStat2, errMsg2);if(Failed())return + call test_almost_equal('p sphere' , (/minval(m_SrcPnl%p), maxval(m_SrcPnl%p)/) , (/-0.7955,0.6125/), 1e-3_ReKi, errStat2, errMsg2);if(Failed())return + else if (nMain==67) then + call test_almost_equal('Cp sphere', (/minval(m_SrcPnl%Cp), maxval(m_SrcPnl%Cp)/), (/-1.26739,1.0000/), 1e-3_ReKi, errStat2, errMsg2);if(Failed())return + !call test_almost_equal('p sphere' , (/minval(m_SrcPnl%p), maxval(m_SrcPnl%p)/) , (/0.000,1.38878/), 1e-3_ReKi, errStat2, errMsg2);if(Failed())return + call test_almost_equal('p sphere' , (/minval(m_SrcPnl%p), maxval(m_SrcPnl%p)/) , (/-0.7955,0.6125/), 1e-3_ReKi, errStat2, errMsg2);if(Failed())return + endif + call FVW_DestroyT_SrcPanlParam(p_SrcPnl, errStat2, errMsg2); if(Failed()) return + call FVW_DestroyT_SrcPanlMisc(m_SrcPnl, errStat2, errMsg2); if(Failed()) return + call FVW_DestroyT_SrcPanlVar(z_SrcPnl, errStat2, errMsg2); if(Failed()) return + contains + logical function Failed() + call SeterrStat(errStat2, errMsg2, errStat, errMsg, 'Test_SrcPnl_Sphere') + Failed = errStat >= AbortErrLev + end function + end subroutine Test_SrcPnl_Sphere + !> Main test function - subroutine FVW_RunTests(ErrStat,ErrMsg) - integer(IntKi) , intent(out) :: ErrStat !< Error status of the operation - character(ErrMsgLen), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(len=255) :: testname - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" - testname='FVW' - call Test_BiotSavart_Sgmt(testname, ErrStat2, ErrMsg2) - call Test_BiotSavart_Part(testname, ErrStat2, ErrMsg2) - call Test_BiotSavart_PartTree(testname, ErrStat2, ErrMsg2) - call Test_SegmentsToPart(testname, ErrStat2, ErrMsg2) - call FVW_Test_WakeInducedVelocities(ErrStat2, ErrMsg2) + !! NOTE: Potentially edit ../tests/test_FVW_testsuite.f90 as well + subroutine FVW_RunTests(errStat,errMsg) + integer(IntKi) , intent(out) :: errStat !< Error status of the operation + character(errMsgLen), intent(out) :: errMsg !< Error message if errStat /= ErrID_None + integer(IntKi) :: errStat2 + character(errMsgLen) :: errMsg2 + ! Initialize errStat + errStat = ErrID_None + errMsg = "" + call Test_LinSolve (errStat2,errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, 'FVW_RunTests') + call Test_SrcPnl_Sphere (errStat2,errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, 'FVW_RunTests') + call Test_BiotSavart_SrcPnl (errStat2,errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, 'FVW_RunTests') + call Test_BiotSavart_Sgmt (errStat2,errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, 'FVW_RunTests') + call Test_BiotSavart_Part (errStat2,errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, 'FVW_RunTests') + call Test_BiotSavart_PartTree (errStat2,errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, 'FVW_RunTests') + call Test_SegmentsToPart (errStat2,errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, 'FVW_RunTests') + call FVW_Test_WakeInducedVelocities(errStat2,errMsg2); call SetErrStat(errStat2, errMsg2, errStat, errMsg, 'FVW_RunTests') + contains + logical function Failed() + call SetErrStat(errStat2, errMsg2, errStat, errMsg, 'FVW_RunTests') + Failed = errStat >= AbortErrLev + end function end subroutine FVW_RunTests end module FVW_Tests diff --git a/modules/aerodyn/src/FVW_Types.f90 b/modules/aerodyn/src/FVW_Types.f90 index caad8c1935..53ff476c2f 100644 --- a/modules/aerodyn/src/FVW_Types.f90 +++ b/modules/aerodyn/src/FVW_Types.f90 @@ -35,8 +35,8 @@ MODULE FVW_Types USE UnsteadyAero_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: idGridVelocity = 1 ! Grid stores velocity field [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: idGridVelVorticity = 2 ! Grid stores velocity and vorticity [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: idGridVelocity = 1 ! Grid stores velocity field [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: idGridVelVorticity = 2 ! Grid stores velocity and vorticity [-] ! ========= GridOutType ======= TYPE, PUBLIC :: GridOutType CHARACTER(100) :: name !< Grid name [-] @@ -50,9 +50,9 @@ MODULE FVW_Types REAL(ReKi) :: xEnd = 0.0_ReKi !< xEnd [-] REAL(ReKi) :: yEnd = 0.0_ReKi !< yEnd [-] REAL(ReKi) :: zEnd = 0.0_ReKi !< zEnd [-] - INTEGER(IntKi) :: nx = 0_IntKi !< nx [-] - INTEGER(IntKi) :: ny = 0_IntKi !< ny [-] - INTEGER(IntKi) :: nz = 0_IntKi !< nz [-] + INTEGER(IntKi) :: nx = 0 !< nx [-] + INTEGER(IntKi) :: ny = 0 !< ny [-] + INTEGER(IntKi) :: nz = 0 !< nz [-] REAL(ReKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: uGrid !< Grid velocity 3 x nz x ny x nx [-] REAL(ReKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: omGrid !< Grid vorticity 3 x nz x ny x nx [-] REAL(DbKi) :: tLastOutput = 0.0_R8Ki !< Last output time [-] @@ -65,8 +65,8 @@ MODULE FVW_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Gamma !< Segment circulations [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Epsilon !< Segment regularization parameter [-] INTEGER(IntKi) :: RegFunction = 0_IntKi !< Type of regularizaion function (LambOseen, Vatistas, see FVW_BiotSavart) [-] - INTEGER(IntKi) :: nAct = 0_IntKi !< Number of active segments [-] - INTEGER(IntKi) :: nActP = 0_IntKi !< Number of active segment points [-] + INTEGER(IntKi) :: nAct = 0 !< Number of active segments [-] + INTEGER(IntKi) :: nActP = 0 !< Number of active segment points [-] END TYPE T_Sgmt ! ======================= ! ========= T_Part ======= @@ -75,32 +75,69 @@ MODULE FVW_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Alpha !< Particle intensity 3 x nP [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: RegParam !< Particle regularization parameter [-] INTEGER(IntKi) :: RegFunction = 0_IntKi !< Type of regularizaion function (FVW_BiotSavart) [-] - INTEGER(IntKi) :: nAct = 0_IntKi !< Number of active particles <=nP [-] + INTEGER(IntKi) :: nAct = 0 !< Number of active particles <=nP [-] END TYPE T_Part ! ======================= +! ========= T_SrcPanlParam ======= + TYPE, PUBLIC :: T_SrcPanlParam + INTEGER(IntKi) :: n = 0 !< Number of panels [-] + CHARACTER(1024) :: Comment !< Area [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Area !< Area [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: P !< Points database [-] + INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: IDs !< Points connectivity ID for each panel 4xnPn [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BodyIDs !< Body ID for each panel [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Pcent !< Centroid point [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Pmid !< Mid point [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Normal !< Normal to panel [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: xi !< Xi coordinate for each panel point [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: eta !< eta coordinate for each panel point [-] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: R_g2p !< Transformation matrix global to Panel [-] + END TYPE T_SrcPanlParam +! ======================= +! ========= T_SrcPanlVar ======= + TYPE, PUBLIC :: T_SrcPanlVar + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Sigma !< Intensities [-] + END TYPE T_SrcPanlVar +! ======================= +! ========= T_SrcPanlMisc ======= + TYPE, PUBLIC :: T_SrcPanlMisc + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: AI !< Influence matrix to solve for intensity [-] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: UUI !< Unit induced velocity [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Uext !< External inflow velocity at panel control points [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Uwnd !< Inflow velocity vector at panel control points [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Uind !< Induced velocity vector at panel control points [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Utot !< Full velocity (include induced) vector at panel control points [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Cp !< Pressure coefficient [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: p !< Pressure (1/2 rho Utot^2) [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: F !< Force from pressure [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: FpA !< Force per area [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: RHS !< Right hand side [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IPIV !< Pivot for factorization [-] + END TYPE T_SrcPanlMisc +! ======================= ! ========= Wng_ParameterType ======= TYPE, PUBLIC :: Wng_ParameterType REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: chord_LL !< Chord of each blade element from input file [idx1=BladeNode, idx2=Blade number] [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: chord_CP !< Chord on LL cp [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: s_LL !< Spanwise coordinate of LL elements [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: s_CP !< Spanwise coordinate of LL CP [m] - INTEGER(IntKi) :: iRotor = 0_IntKi !< Index of rotor the wing belong to [-] + INTEGER(IntKi) :: iRotor = 0 !< Index of rotor the wing belong to [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: AFindx !< Index to the airfoils from AD15 [BladeNode,BladeIndex=1] [-] - INTEGER(IntKi) :: nSpan = 0_IntKi !< TODO, should be defined per wing. Number of spanwise element [-] + INTEGER(IntKi) :: nSpan = 0 !< TODO, should be defined per wing. Number of spanwise element [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PrescribedCirculation !< Prescribed circulation on all lifting lines [m/s] END TYPE Wng_ParameterType ! ======================= ! ========= FVW_ParameterType ======= TYPE, PUBLIC :: FVW_ParameterType - INTEGER(IntKi) :: nRotors = 0_IntKi !< Number of Wings [-] - INTEGER(IntKi) :: nWings = 0_IntKi !< Number of Wings [-] + INTEGER(IntKi) :: nRotors = 0 !< Number of Rotors [-] + INTEGER(IntKi) :: nWings = 0 !< Number of Wings [-] TYPE(Wng_ParameterType) , DIMENSION(:), ALLOCATABLE :: W !< Wings parameters [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Bld2Wings !< Index mapping from blades to wings [-] - INTEGER(IntKi) :: iNWStart = 0_IntKi !< Index where NW start in r_NW. (iNWStart=2, the first panel contains the lifting line panel, otherwise, start at 1) [-] - INTEGER(IntKi) :: nNWMax = 0_IntKi !< Maximum number of nw panels, per wing [-] - INTEGER(IntKi) :: nNWFree = 0_IntKi !< Number of nw panels that are free, per wing [-] - INTEGER(IntKi) :: nFWMax = 0_IntKi !< Maximum number of fw panels, per wing [-] - INTEGER(IntKi) :: nFWFree = 0_IntKi !< Number of fw panels that are free, per wing [-] + INTEGER(IntKi) :: iNWStart = 0 !< Index where NW start in r_NW. (iNWStart=2, the first panel contains the lifting line panel, otherwise, start at 1) [-] + INTEGER(IntKi) :: nNWMax = 0 !< Maximum number of nw panels, per wing [-] + INTEGER(IntKi) :: nNWFree = 0 !< Number of nw panels that are free, per wing [-] + INTEGER(IntKi) :: nFWMax = 0 !< Maximum number of fw panels, per wing [-] + INTEGER(IntKi) :: nFWFree = 0 !< Number of fw panels that are free, per wing [-] LOGICAL :: FWShedVorticity = .false. !< Include shed vorticity in the far wake [-] INTEGER(IntKi) :: IntMethod = 0_IntKi !< Integration Method (1=RK4, 2=AB4, 3=ABM4, 5=Euler1) [-] REAL(ReKi) :: FreeWakeStart = 0.0_ReKi !< Time when wake starts convecting (rolling up) [s] @@ -124,6 +161,7 @@ MODULE FVW_Types INTEGER(IntKi) , DIMENSION(1:2) :: PartPerSegment = 0_IntKi !< Number of particles per segment, e.g. for tree method, for full wake and lifting line [-] REAL(DbKi) :: DTaero = 0.0_R8Ki !< Time interval for calls calculations [s] REAL(DbKi) :: DTfvw = 0.0_R8Ki !< Time interval for calculating wake induced velocities [s] + REAL(ReKi) :: AirDens = 0.0_ReKi !< Air density [kg/m^3] REAL(ReKi) :: KinVisc = 0.0_ReKi !< Kinematic air viscosity [m^2/s] INTEGER(IntKi) :: MHK = 0_IntKi !< MHK flag [-] REAL(ReKi) :: WtrDpth = 0.0_ReKi !< Water depth [m] @@ -134,13 +172,17 @@ MODULE FVW_Types CHARACTER(1024) :: RootName !< RootName for writing output files [-] CHARACTER(1024) :: VTK_OutFileRoot !< Rootdirectory for writing VTK files [-] CHARACTER(1024) :: VTK_OutFileBase !< Basename for writing VTK files [-] - INTEGER(IntKi) :: nGridOut = 0_IntKi !< Number of VTK grid to output [-] + INTEGER(IntKi) :: nGridOut = 0 !< Number of VTK grid to output [-] LOGICAL :: InductionAtCP = .true. !< Compute induced velocities at nodes or CP [-] LOGICAL :: WakeAtTE = .true. !< Start the wake at the trailing edge, or at the LL [-] LOGICAL :: DStallOnWake = .false. !< Dynamic stall has influence on wake [-] LOGICAL :: Induction = .true. !< Compute induction [-] REAL(ReKi) :: kFrozenNWStart = 0.75 !< Fraction of wake induced velocity at start of frozen wake. 1 seems too strong. [-] REAL(ReKi) :: kFrozenNWEnd = 0.5 !< Fraction of wake induced velocity at end of frozen wake [-] + REAL(ReKi) :: zGround = 0.0 !< Ground height [-] + REAL(ReKi) :: zGroundPush = 0.1 !< Distance above ground where vortices are pushed back [-] + INTEGER(IntKi) :: nSrcPnlUpdate = 1 !< How often do src panel updates (in time steps of OLAF) [-] + TYPE(T_SrcPanlParam) :: SrcPnl !< Source panel parameters [-] END TYPE FVW_ParameterType ! ======================= ! ========= Wng_ContinuousStateType ======= @@ -237,6 +279,7 @@ MODULE FVW_Types LOGICAL :: UA_Flag = .false. !< logical flag indicating whether to use UnsteadyAero [-] TYPE(T_Sgmt) :: Sgmt !< Segments storage [-] TYPE(T_Part) :: Part !< Particle storage [-] + TYPE(T_SrcPanlMisc) :: SrcPnl !< Source panels storage [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: CPs !< Control points used for wake rollup computation [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Uind !< Induced velocities obtained at control points [-] TYPE(GridOutType) , DIMENSION(:), ALLOCATABLE :: GridOutputs !< Number of VTK grid to output [-] @@ -278,12 +321,14 @@ MODULE FVW_Types TYPE, PUBLIC :: FVW_ConstraintStateType TYPE(Wng_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: W !< rotors constr. states [-] REAL(ReKi) :: residual = 0.0_ReKi !< Residual [-] + TYPE(T_SrcPanlVar) :: SrcPnl !< Source panel constraints [-] END TYPE FVW_ConstraintStateType ! ======================= ! ========= FVW_OtherStateType ======= TYPE, PUBLIC :: FVW_OtherStateType - INTEGER(IntKi) :: Dummy = 0_IntKi !< Empty to satisfy framework [-] + REAL(ReKi) :: ShedScale = 0.0_ReKi !< Scale shed vorticity at begining of simulation [-] TYPE(UA_OtherStateType) , DIMENSION(:), ALLOCATABLE :: UA !< other states for UnsteadyAero for each wing [-] + LOGICAL :: Initialized = .false. !< True if OLAF is initialized [-] END TYPE FVW_OtherStateType ! ======================= ! ========= Wng_InitInputType ======= @@ -304,6 +349,7 @@ MODULE FVW_Types TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: WingsMesh !< Input Mesh defining position and orientation of wings (nSpan+1) [-] INTEGER(IntKi) :: numBladeNodes = 0_IntKi !< Number of nodes on each blade [-] REAL(DbKi) :: DTaero = 0.0_R8Ki !< Time interval for calls (from AD15) [s] + REAL(ReKi) :: AirDens = 0.0_ReKi !< Air density [kg/m^3] REAL(ReKi) :: KinVisc = 0.0_ReKi !< Kinematic air viscosity [m^2/s] INTEGER(IntKi) :: MHK = 0_IntKi !< MHK flag [-] REAL(ReKi) :: WtrDpth = 0.0_ReKi !< Water depth [m] @@ -345,6 +391,7 @@ MODULE FVW_Types INTEGER(IntKi) :: VTKBlades = 0_IntKi !< Outputs VTk for each blade 0=no blade, 1=Bld 1 [-] REAL(DbKi) :: DTvtk = 0.0_R8Ki !< Requested timestep between VTK outputs (calculated from the VTK_fps read in) [s] INTEGER(IntKi) :: VTKCoord = 0_IntKi !< Switch for VTK outputs coordinate system [-] + CHARACTER(1024) :: SrcPnlFile !< Input file for source panels [-] END TYPE FVW_InputFile ! ======================= ! ========= FVW_InitOutputType ======= @@ -352,7 +399,22 @@ MODULE FVW_Types INTEGER(IntKi) :: Dummy = 0_IntKi !< Empty parameter to satisfy framework [-] END TYPE FVW_InitOutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: FVW_x_W_Gamma_NW = 1 ! FVW%W(DL%i1)%Gamma_NW + integer(IntKi), public, parameter :: FVW_x_W_Gamma_FW = 2 ! FVW%W(DL%i1)%Gamma_FW + integer(IntKi), public, parameter :: FVW_x_W_Eps_NW = 3 ! FVW%W(DL%i1)%Eps_NW + integer(IntKi), public, parameter :: FVW_x_W_Eps_FW = 4 ! FVW%W(DL%i1)%Eps_FW + integer(IntKi), public, parameter :: FVW_x_W_r_NW = 5 ! FVW%W(DL%i1)%r_NW + integer(IntKi), public, parameter :: FVW_x_W_r_FW = 6 ! FVW%W(DL%i1)%r_FW + integer(IntKi), public, parameter :: FVW_x_UA_element_x = 7 ! FVW%UA(DL%i1)%element(DL%i2, DL%i3)%x + integer(IntKi), public, parameter :: FVW_u_rotors_HubOrientation = 8 ! FVW%rotors(DL%i1)%HubOrientation + integer(IntKi), public, parameter :: FVW_u_rotors_HubPosition = 9 ! FVW%rotors(DL%i1)%HubPosition + integer(IntKi), public, parameter :: FVW_u_W_Vwnd_LL = 10 ! FVW%W(DL%i1)%Vwnd_LL + integer(IntKi), public, parameter :: FVW_u_W_omega_z = 11 ! FVW%W(DL%i1)%omega_z + integer(IntKi), public, parameter :: FVW_u_WingsMesh = 12 ! FVW%WingsMesh(DL%i1) + integer(IntKi), public, parameter :: FVW_u_V_wind = 13 ! FVW%V_wind + integer(IntKi), public, parameter :: FVW_y_W_Vind = 14 ! FVW%W(DL%i1)%Vind + +contains subroutine FVW_CopyGridOutType(SrcGridOutTypeData, DstGridOutTypeData, CtrlCode, ErrStat, ErrMsg) type(GridOutType), intent(in) :: SrcGridOutTypeData @@ -687,6 +749,523 @@ subroutine FVW_UnPackT_Part(RF, OutData) call RegUnpack(RF, OutData%nAct); if (RegCheckErr(RF, RoutineName)) return end subroutine +subroutine FVW_CopyT_SrcPanlParam(SrcT_SrcPanlParamData, DstT_SrcPanlParamData, CtrlCode, ErrStat, ErrMsg) + type(T_SrcPanlParam), intent(in) :: SrcT_SrcPanlParamData + type(T_SrcPanlParam), intent(inout) :: DstT_SrcPanlParamData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'FVW_CopyT_SrcPanlParam' + ErrStat = ErrID_None + ErrMsg = '' + DstT_SrcPanlParamData%n = SrcT_SrcPanlParamData%n + DstT_SrcPanlParamData%Comment = SrcT_SrcPanlParamData%Comment + if (allocated(SrcT_SrcPanlParamData%Area)) then + LB(1:1) = lbound(SrcT_SrcPanlParamData%Area) + UB(1:1) = ubound(SrcT_SrcPanlParamData%Area) + if (.not. allocated(DstT_SrcPanlParamData%Area)) then + allocate(DstT_SrcPanlParamData%Area(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%Area.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%Area = SrcT_SrcPanlParamData%Area + end if + if (allocated(SrcT_SrcPanlParamData%P)) then + LB(1:2) = lbound(SrcT_SrcPanlParamData%P) + UB(1:2) = ubound(SrcT_SrcPanlParamData%P) + if (.not. allocated(DstT_SrcPanlParamData%P)) then + allocate(DstT_SrcPanlParamData%P(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%P.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%P = SrcT_SrcPanlParamData%P + end if + if (allocated(SrcT_SrcPanlParamData%IDs)) then + LB(1:2) = lbound(SrcT_SrcPanlParamData%IDs) + UB(1:2) = ubound(SrcT_SrcPanlParamData%IDs) + if (.not. allocated(DstT_SrcPanlParamData%IDs)) then + allocate(DstT_SrcPanlParamData%IDs(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%IDs.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%IDs = SrcT_SrcPanlParamData%IDs + end if + if (allocated(SrcT_SrcPanlParamData%BodyIDs)) then + LB(1:1) = lbound(SrcT_SrcPanlParamData%BodyIDs) + UB(1:1) = ubound(SrcT_SrcPanlParamData%BodyIDs) + if (.not. allocated(DstT_SrcPanlParamData%BodyIDs)) then + allocate(DstT_SrcPanlParamData%BodyIDs(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%BodyIDs.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%BodyIDs = SrcT_SrcPanlParamData%BodyIDs + end if + if (allocated(SrcT_SrcPanlParamData%Pcent)) then + LB(1:2) = lbound(SrcT_SrcPanlParamData%Pcent) + UB(1:2) = ubound(SrcT_SrcPanlParamData%Pcent) + if (.not. allocated(DstT_SrcPanlParamData%Pcent)) then + allocate(DstT_SrcPanlParamData%Pcent(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%Pcent.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%Pcent = SrcT_SrcPanlParamData%Pcent + end if + if (allocated(SrcT_SrcPanlParamData%Pmid)) then + LB(1:2) = lbound(SrcT_SrcPanlParamData%Pmid) + UB(1:2) = ubound(SrcT_SrcPanlParamData%Pmid) + if (.not. allocated(DstT_SrcPanlParamData%Pmid)) then + allocate(DstT_SrcPanlParamData%Pmid(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%Pmid.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%Pmid = SrcT_SrcPanlParamData%Pmid + end if + if (allocated(SrcT_SrcPanlParamData%Normal)) then + LB(1:2) = lbound(SrcT_SrcPanlParamData%Normal) + UB(1:2) = ubound(SrcT_SrcPanlParamData%Normal) + if (.not. allocated(DstT_SrcPanlParamData%Normal)) then + allocate(DstT_SrcPanlParamData%Normal(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%Normal.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%Normal = SrcT_SrcPanlParamData%Normal + end if + if (allocated(SrcT_SrcPanlParamData%xi)) then + LB(1:2) = lbound(SrcT_SrcPanlParamData%xi) + UB(1:2) = ubound(SrcT_SrcPanlParamData%xi) + if (.not. allocated(DstT_SrcPanlParamData%xi)) then + allocate(DstT_SrcPanlParamData%xi(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%xi.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%xi = SrcT_SrcPanlParamData%xi + end if + if (allocated(SrcT_SrcPanlParamData%eta)) then + LB(1:2) = lbound(SrcT_SrcPanlParamData%eta) + UB(1:2) = ubound(SrcT_SrcPanlParamData%eta) + if (.not. allocated(DstT_SrcPanlParamData%eta)) then + allocate(DstT_SrcPanlParamData%eta(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%eta.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%eta = SrcT_SrcPanlParamData%eta + end if + if (allocated(SrcT_SrcPanlParamData%R_g2p)) then + LB(1:3) = lbound(SrcT_SrcPanlParamData%R_g2p) + UB(1:3) = ubound(SrcT_SrcPanlParamData%R_g2p) + if (.not. allocated(DstT_SrcPanlParamData%R_g2p)) then + allocate(DstT_SrcPanlParamData%R_g2p(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlParamData%R_g2p.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlParamData%R_g2p = SrcT_SrcPanlParamData%R_g2p + end if +end subroutine + +subroutine FVW_DestroyT_SrcPanlParam(T_SrcPanlParamData, ErrStat, ErrMsg) + type(T_SrcPanlParam), intent(inout) :: T_SrcPanlParamData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'FVW_DestroyT_SrcPanlParam' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(T_SrcPanlParamData%Area)) then + deallocate(T_SrcPanlParamData%Area) + end if + if (allocated(T_SrcPanlParamData%P)) then + deallocate(T_SrcPanlParamData%P) + end if + if (allocated(T_SrcPanlParamData%IDs)) then + deallocate(T_SrcPanlParamData%IDs) + end if + if (allocated(T_SrcPanlParamData%BodyIDs)) then + deallocate(T_SrcPanlParamData%BodyIDs) + end if + if (allocated(T_SrcPanlParamData%Pcent)) then + deallocate(T_SrcPanlParamData%Pcent) + end if + if (allocated(T_SrcPanlParamData%Pmid)) then + deallocate(T_SrcPanlParamData%Pmid) + end if + if (allocated(T_SrcPanlParamData%Normal)) then + deallocate(T_SrcPanlParamData%Normal) + end if + if (allocated(T_SrcPanlParamData%xi)) then + deallocate(T_SrcPanlParamData%xi) + end if + if (allocated(T_SrcPanlParamData%eta)) then + deallocate(T_SrcPanlParamData%eta) + end if + if (allocated(T_SrcPanlParamData%R_g2p)) then + deallocate(T_SrcPanlParamData%R_g2p) + end if +end subroutine + +subroutine FVW_PackT_SrcPanlParam(RF, Indata) + type(RegFile), intent(inout) :: RF + type(T_SrcPanlParam), intent(in) :: InData + character(*), parameter :: RoutineName = 'FVW_PackT_SrcPanlParam' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%n) + call RegPack(RF, InData%Comment) + call RegPackAlloc(RF, InData%Area) + call RegPackAlloc(RF, InData%P) + call RegPackAlloc(RF, InData%IDs) + call RegPackAlloc(RF, InData%BodyIDs) + call RegPackAlloc(RF, InData%Pcent) + call RegPackAlloc(RF, InData%Pmid) + call RegPackAlloc(RF, InData%Normal) + call RegPackAlloc(RF, InData%xi) + call RegPackAlloc(RF, InData%eta) + call RegPackAlloc(RF, InData%R_g2p) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FVW_UnPackT_SrcPanlParam(RF, OutData) + type(RegFile), intent(inout) :: RF + type(T_SrcPanlParam), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FVW_UnPackT_SrcPanlParam' + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%n); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Comment); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Area); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%P); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%IDs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BodyIDs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Pcent); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Pmid); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Normal); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%xi); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%eta); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%R_g2p); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FVW_CopyT_SrcPanlVar(SrcT_SrcPanlVarData, DstT_SrcPanlVarData, CtrlCode, ErrStat, ErrMsg) + type(T_SrcPanlVar), intent(in) :: SrcT_SrcPanlVarData + type(T_SrcPanlVar), intent(inout) :: DstT_SrcPanlVarData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'FVW_CopyT_SrcPanlVar' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcT_SrcPanlVarData%Sigma)) then + LB(1:1) = lbound(SrcT_SrcPanlVarData%Sigma) + UB(1:1) = ubound(SrcT_SrcPanlVarData%Sigma) + if (.not. allocated(DstT_SrcPanlVarData%Sigma)) then + allocate(DstT_SrcPanlVarData%Sigma(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlVarData%Sigma.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlVarData%Sigma = SrcT_SrcPanlVarData%Sigma + end if +end subroutine + +subroutine FVW_DestroyT_SrcPanlVar(T_SrcPanlVarData, ErrStat, ErrMsg) + type(T_SrcPanlVar), intent(inout) :: T_SrcPanlVarData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'FVW_DestroyT_SrcPanlVar' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(T_SrcPanlVarData%Sigma)) then + deallocate(T_SrcPanlVarData%Sigma) + end if +end subroutine + +subroutine FVW_PackT_SrcPanlVar(RF, Indata) + type(RegFile), intent(inout) :: RF + type(T_SrcPanlVar), intent(in) :: InData + character(*), parameter :: RoutineName = 'FVW_PackT_SrcPanlVar' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%Sigma) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FVW_UnPackT_SrcPanlVar(RF, OutData) + type(RegFile), intent(inout) :: RF + type(T_SrcPanlVar), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FVW_UnPackT_SrcPanlVar' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%Sigma); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FVW_CopyT_SrcPanlMisc(SrcT_SrcPanlMiscData, DstT_SrcPanlMiscData, CtrlCode, ErrStat, ErrMsg) + type(T_SrcPanlMisc), intent(in) :: SrcT_SrcPanlMiscData + type(T_SrcPanlMisc), intent(inout) :: DstT_SrcPanlMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'FVW_CopyT_SrcPanlMisc' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcT_SrcPanlMiscData%AI)) then + LB(1:2) = lbound(SrcT_SrcPanlMiscData%AI) + UB(1:2) = ubound(SrcT_SrcPanlMiscData%AI) + if (.not. allocated(DstT_SrcPanlMiscData%AI)) then + allocate(DstT_SrcPanlMiscData%AI(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%AI.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%AI = SrcT_SrcPanlMiscData%AI + end if + if (allocated(SrcT_SrcPanlMiscData%UUI)) then + LB(1:3) = lbound(SrcT_SrcPanlMiscData%UUI) + UB(1:3) = ubound(SrcT_SrcPanlMiscData%UUI) + if (.not. allocated(DstT_SrcPanlMiscData%UUI)) then + allocate(DstT_SrcPanlMiscData%UUI(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%UUI.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%UUI = SrcT_SrcPanlMiscData%UUI + end if + if (allocated(SrcT_SrcPanlMiscData%Uext)) then + LB(1:2) = lbound(SrcT_SrcPanlMiscData%Uext) + UB(1:2) = ubound(SrcT_SrcPanlMiscData%Uext) + if (.not. allocated(DstT_SrcPanlMiscData%Uext)) then + allocate(DstT_SrcPanlMiscData%Uext(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%Uext.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%Uext = SrcT_SrcPanlMiscData%Uext + end if + if (allocated(SrcT_SrcPanlMiscData%Uwnd)) then + LB(1:2) = lbound(SrcT_SrcPanlMiscData%Uwnd) + UB(1:2) = ubound(SrcT_SrcPanlMiscData%Uwnd) + if (.not. allocated(DstT_SrcPanlMiscData%Uwnd)) then + allocate(DstT_SrcPanlMiscData%Uwnd(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%Uwnd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%Uwnd = SrcT_SrcPanlMiscData%Uwnd + end if + if (allocated(SrcT_SrcPanlMiscData%Uind)) then + LB(1:2) = lbound(SrcT_SrcPanlMiscData%Uind) + UB(1:2) = ubound(SrcT_SrcPanlMiscData%Uind) + if (.not. allocated(DstT_SrcPanlMiscData%Uind)) then + allocate(DstT_SrcPanlMiscData%Uind(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%Uind.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%Uind = SrcT_SrcPanlMiscData%Uind + end if + if (allocated(SrcT_SrcPanlMiscData%Utot)) then + LB(1:2) = lbound(SrcT_SrcPanlMiscData%Utot) + UB(1:2) = ubound(SrcT_SrcPanlMiscData%Utot) + if (.not. allocated(DstT_SrcPanlMiscData%Utot)) then + allocate(DstT_SrcPanlMiscData%Utot(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%Utot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%Utot = SrcT_SrcPanlMiscData%Utot + end if + if (allocated(SrcT_SrcPanlMiscData%Cp)) then + LB(1:1) = lbound(SrcT_SrcPanlMiscData%Cp) + UB(1:1) = ubound(SrcT_SrcPanlMiscData%Cp) + if (.not. allocated(DstT_SrcPanlMiscData%Cp)) then + allocate(DstT_SrcPanlMiscData%Cp(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%Cp.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%Cp = SrcT_SrcPanlMiscData%Cp + end if + if (allocated(SrcT_SrcPanlMiscData%p)) then + LB(1:1) = lbound(SrcT_SrcPanlMiscData%p) + UB(1:1) = ubound(SrcT_SrcPanlMiscData%p) + if (.not. allocated(DstT_SrcPanlMiscData%p)) then + allocate(DstT_SrcPanlMiscData%p(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%p.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%p = SrcT_SrcPanlMiscData%p + end if + if (allocated(SrcT_SrcPanlMiscData%F)) then + LB(1:2) = lbound(SrcT_SrcPanlMiscData%F) + UB(1:2) = ubound(SrcT_SrcPanlMiscData%F) + if (.not. allocated(DstT_SrcPanlMiscData%F)) then + allocate(DstT_SrcPanlMiscData%F(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%F.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%F = SrcT_SrcPanlMiscData%F + end if + if (allocated(SrcT_SrcPanlMiscData%FpA)) then + LB(1:2) = lbound(SrcT_SrcPanlMiscData%FpA) + UB(1:2) = ubound(SrcT_SrcPanlMiscData%FpA) + if (.not. allocated(DstT_SrcPanlMiscData%FpA)) then + allocate(DstT_SrcPanlMiscData%FpA(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%FpA.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%FpA = SrcT_SrcPanlMiscData%FpA + end if + if (allocated(SrcT_SrcPanlMiscData%RHS)) then + LB(1:1) = lbound(SrcT_SrcPanlMiscData%RHS) + UB(1:1) = ubound(SrcT_SrcPanlMiscData%RHS) + if (.not. allocated(DstT_SrcPanlMiscData%RHS)) then + allocate(DstT_SrcPanlMiscData%RHS(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%RHS.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%RHS = SrcT_SrcPanlMiscData%RHS + end if + if (allocated(SrcT_SrcPanlMiscData%IPIV)) then + LB(1:1) = lbound(SrcT_SrcPanlMiscData%IPIV) + UB(1:1) = ubound(SrcT_SrcPanlMiscData%IPIV) + if (.not. allocated(DstT_SrcPanlMiscData%IPIV)) then + allocate(DstT_SrcPanlMiscData%IPIV(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstT_SrcPanlMiscData%IPIV.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstT_SrcPanlMiscData%IPIV = SrcT_SrcPanlMiscData%IPIV + end if +end subroutine + +subroutine FVW_DestroyT_SrcPanlMisc(T_SrcPanlMiscData, ErrStat, ErrMsg) + type(T_SrcPanlMisc), intent(inout) :: T_SrcPanlMiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'FVW_DestroyT_SrcPanlMisc' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(T_SrcPanlMiscData%AI)) then + deallocate(T_SrcPanlMiscData%AI) + end if + if (allocated(T_SrcPanlMiscData%UUI)) then + deallocate(T_SrcPanlMiscData%UUI) + end if + if (allocated(T_SrcPanlMiscData%Uext)) then + deallocate(T_SrcPanlMiscData%Uext) + end if + if (allocated(T_SrcPanlMiscData%Uwnd)) then + deallocate(T_SrcPanlMiscData%Uwnd) + end if + if (allocated(T_SrcPanlMiscData%Uind)) then + deallocate(T_SrcPanlMiscData%Uind) + end if + if (allocated(T_SrcPanlMiscData%Utot)) then + deallocate(T_SrcPanlMiscData%Utot) + end if + if (allocated(T_SrcPanlMiscData%Cp)) then + deallocate(T_SrcPanlMiscData%Cp) + end if + if (allocated(T_SrcPanlMiscData%p)) then + deallocate(T_SrcPanlMiscData%p) + end if + if (allocated(T_SrcPanlMiscData%F)) then + deallocate(T_SrcPanlMiscData%F) + end if + if (allocated(T_SrcPanlMiscData%FpA)) then + deallocate(T_SrcPanlMiscData%FpA) + end if + if (allocated(T_SrcPanlMiscData%RHS)) then + deallocate(T_SrcPanlMiscData%RHS) + end if + if (allocated(T_SrcPanlMiscData%IPIV)) then + deallocate(T_SrcPanlMiscData%IPIV) + end if +end subroutine + +subroutine FVW_PackT_SrcPanlMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(T_SrcPanlMisc), intent(in) :: InData + character(*), parameter :: RoutineName = 'FVW_PackT_SrcPanlMisc' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%AI) + call RegPackAlloc(RF, InData%UUI) + call RegPackAlloc(RF, InData%Uext) + call RegPackAlloc(RF, InData%Uwnd) + call RegPackAlloc(RF, InData%Uind) + call RegPackAlloc(RF, InData%Utot) + call RegPackAlloc(RF, InData%Cp) + call RegPackAlloc(RF, InData%p) + call RegPackAlloc(RF, InData%F) + call RegPackAlloc(RF, InData%FpA) + call RegPackAlloc(RF, InData%RHS) + call RegPackAlloc(RF, InData%IPIV) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FVW_UnPackT_SrcPanlMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(T_SrcPanlMisc), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FVW_UnPackT_SrcPanlMisc' + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%AI); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UUI); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Uext); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Uwnd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Uind); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Utot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Cp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%p); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%F); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%FpA); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%RHS); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%IPIV); if (RegCheckErr(RF, RoutineName)) return +end subroutine + subroutine FVW_CopyWng_ParameterType(SrcWng_ParameterTypeData, DstWng_ParameterTypeData, CtrlCode, ErrStat, ErrMsg) type(Wng_ParameterType), intent(in) :: SrcWng_ParameterTypeData type(Wng_ParameterType), intent(inout) :: DstWng_ParameterTypeData @@ -906,6 +1485,7 @@ subroutine FVW_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%PartPerSegment = SrcParamData%PartPerSegment DstParamData%DTaero = SrcParamData%DTaero DstParamData%DTfvw = SrcParamData%DTfvw + DstParamData%AirDens = SrcParamData%AirDens DstParamData%KinVisc = SrcParamData%KinVisc DstParamData%MHK = SrcParamData%MHK DstParamData%WtrDpth = SrcParamData%WtrDpth @@ -923,6 +1503,12 @@ subroutine FVW_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%Induction = SrcParamData%Induction DstParamData%kFrozenNWStart = SrcParamData%kFrozenNWStart DstParamData%kFrozenNWEnd = SrcParamData%kFrozenNWEnd + DstParamData%zGround = SrcParamData%zGround + DstParamData%zGroundPush = SrcParamData%zGroundPush + DstParamData%nSrcPnlUpdate = SrcParamData%nSrcPnlUpdate + call FVW_CopyT_SrcPanlParam(SrcParamData%SrcPnl, DstParamData%SrcPnl, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine FVW_DestroyParam(ParamData, ErrStat, ErrMsg) @@ -948,6 +1534,8 @@ subroutine FVW_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%Bld2Wings)) then deallocate(ParamData%Bld2Wings) end if + call FVW_DestroyT_SrcPanlParam(ParamData%SrcPnl, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine FVW_PackParam(RF, Indata) @@ -997,6 +1585,7 @@ subroutine FVW_PackParam(RF, Indata) call RegPack(RF, InData%PartPerSegment) call RegPack(RF, InData%DTaero) call RegPack(RF, InData%DTfvw) + call RegPack(RF, InData%AirDens) call RegPack(RF, InData%KinVisc) call RegPack(RF, InData%MHK) call RegPack(RF, InData%WtrDpth) @@ -1014,6 +1603,10 @@ subroutine FVW_PackParam(RF, Indata) call RegPack(RF, InData%Induction) call RegPack(RF, InData%kFrozenNWStart) call RegPack(RF, InData%kFrozenNWEnd) + call RegPack(RF, InData%zGround) + call RegPack(RF, InData%zGroundPush) + call RegPack(RF, InData%nSrcPnlUpdate) + call FVW_PackT_SrcPanlParam(RF, InData%SrcPnl) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1070,6 +1663,7 @@ subroutine FVW_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%PartPerSegment); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DTaero); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DTfvw); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%KinVisc); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%MHK); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return @@ -1087,6 +1681,10 @@ subroutine FVW_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%Induction); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%kFrozenNWStart); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%kFrozenNWEnd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%zGround); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%zGroundPush); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nSrcPnlUpdate); if (RegCheckErr(RF, RoutineName)) return + call FVW_UnpackT_SrcPanlParam(RF, OutData%SrcPnl) ! SrcPnl end subroutine subroutine FVW_CopyWng_ContinuousStateType(SrcWng_ContinuousStateTypeData, DstWng_ContinuousStateTypeData, CtrlCode, ErrStat, ErrMsg) @@ -2371,6 +2969,9 @@ subroutine FVW_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) call FVW_CopyT_Part(SrcMiscData%Part, DstMiscData%Part, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call FVW_CopyT_SrcPanlMisc(SrcMiscData%SrcPnl, DstMiscData%SrcPnl, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return if (allocated(SrcMiscData%CPs)) then LB(1:2) = lbound(SrcMiscData%CPs) UB(1:2) = ubound(SrcMiscData%CPs) @@ -2447,6 +3048,8 @@ subroutine FVW_DestroyMisc(MiscData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call FVW_DestroyT_Part(MiscData%Part, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call FVW_DestroyT_SrcPanlMisc(MiscData%SrcPnl, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(MiscData%CPs)) then deallocate(MiscData%CPs) end if @@ -2497,6 +3100,7 @@ subroutine FVW_PackMisc(RF, Indata) call RegPack(RF, InData%UA_Flag) call FVW_PackT_Sgmt(RF, InData%Sgmt) call FVW_PackT_Part(RF, InData%Part) + call FVW_PackT_SrcPanlMisc(RF, InData%SrcPnl) call RegPackAlloc(RF, InData%CPs) call RegPackAlloc(RF, InData%Uind) call RegPack(RF, allocated(InData%GridOutputs)) @@ -2551,6 +3155,7 @@ subroutine FVW_UnPackMisc(RF, OutData) call RegUnpack(RF, OutData%UA_Flag); if (RegCheckErr(RF, RoutineName)) return call FVW_UnpackT_Sgmt(RF, OutData%Sgmt) ! Sgmt call FVW_UnpackT_Part(RF, OutData%Part) ! Part + call FVW_UnpackT_SrcPanlMisc(RF, OutData%SrcPnl) ! SrcPnl call RegUnpackAlloc(RF, OutData%CPs); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Uind); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%GridOutputs)) deallocate(OutData%GridOutputs) @@ -3077,6 +3682,9 @@ subroutine FVW_CopyConstrState(SrcConstrStateData, DstConstrStateData, CtrlCode, end do end if DstConstrStateData%residual = SrcConstrStateData%residual + call FVW_CopyT_SrcPanlVar(SrcConstrStateData%SrcPnl, DstConstrStateData%SrcPnl, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine FVW_DestroyConstrState(ConstrStateData, ErrStat, ErrMsg) @@ -3099,6 +3707,8 @@ subroutine FVW_DestroyConstrState(ConstrStateData, ErrStat, ErrMsg) end do deallocate(ConstrStateData%W) end if + call FVW_DestroyT_SrcPanlVar(ConstrStateData%SrcPnl, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine FVW_PackConstrState(RF, Indata) @@ -3118,6 +3728,7 @@ subroutine FVW_PackConstrState(RF, Indata) end do end if call RegPack(RF, InData%residual) + call FVW_PackT_SrcPanlVar(RF, InData%SrcPnl) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -3144,6 +3755,7 @@ subroutine FVW_UnPackConstrState(RF, OutData) end do end if call RegUnpack(RF, OutData%residual); if (RegCheckErr(RF, RoutineName)) return + call FVW_UnpackT_SrcPanlVar(RF, OutData%SrcPnl) ! SrcPnl end subroutine subroutine FVW_CopyOtherState(SrcOtherStateData, DstOtherStateData, CtrlCode, ErrStat, ErrMsg) @@ -3159,7 +3771,7 @@ subroutine FVW_CopyOtherState(SrcOtherStateData, DstOtherStateData, CtrlCode, Er character(*), parameter :: RoutineName = 'FVW_CopyOtherState' ErrStat = ErrID_None ErrMsg = '' - DstOtherStateData%Dummy = SrcOtherStateData%Dummy + DstOtherStateData%ShedScale = SrcOtherStateData%ShedScale if (allocated(SrcOtherStateData%UA)) then LB(1:1) = lbound(SrcOtherStateData%UA) UB(1:1) = ubound(SrcOtherStateData%UA) @@ -3176,6 +3788,7 @@ subroutine FVW_CopyOtherState(SrcOtherStateData, DstOtherStateData, CtrlCode, Er if (ErrStat >= AbortErrLev) return end do end if + DstOtherStateData%Initialized = SrcOtherStateData%Initialized end subroutine subroutine FVW_DestroyOtherState(OtherStateData, ErrStat, ErrMsg) @@ -3207,7 +3820,7 @@ subroutine FVW_PackOtherState(RF, Indata) integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%Dummy) + call RegPack(RF, InData%ShedScale) call RegPack(RF, allocated(InData%UA)) if (allocated(InData%UA)) then call RegPackBounds(RF, 1, lbound(InData%UA), ubound(InData%UA)) @@ -3217,6 +3830,7 @@ subroutine FVW_PackOtherState(RF, Indata) call UA_PackOtherState(RF, InData%UA(i1)) end do end if + call RegPack(RF, InData%Initialized) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -3229,7 +3843,7 @@ subroutine FVW_UnPackOtherState(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%Dummy); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ShedScale); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%UA)) deallocate(OutData%UA) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -3243,6 +3857,7 @@ subroutine FVW_UnPackOtherState(RF, OutData) call UA_UnpackOtherState(RF, OutData%UA(i1)) ! UA end do end if + call RegUnpack(RF, OutData%Initialized); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine FVW_CopyWng_InitInputType(SrcWng_InitInputTypeData, DstWng_InitInputTypeData, CtrlCode, ErrStat, ErrMsg) @@ -3394,6 +4009,7 @@ subroutine FVW_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSt end if DstInitInputData%numBladeNodes = SrcInitInputData%numBladeNodes DstInitInputData%DTaero = SrcInitInputData%DTaero + DstInitInputData%AirDens = SrcInitInputData%AirDens DstInitInputData%KinVisc = SrcInitInputData%KinVisc DstInitInputData%MHK = SrcInitInputData%MHK DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth @@ -3465,6 +4081,7 @@ subroutine FVW_PackInitInput(RF, Indata) end if call RegPack(RF, InData%numBladeNodes) call RegPack(RF, InData%DTaero) + call RegPack(RF, InData%AirDens) call RegPack(RF, InData%KinVisc) call RegPack(RF, InData%MHK) call RegPack(RF, InData%WtrDpth) @@ -3512,6 +4129,7 @@ subroutine FVW_UnPackInitInput(RF, OutData) end if call RegUnpack(RF, OutData%numBladeNodes); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DTaero); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%KinVisc); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%MHK); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return @@ -3560,6 +4178,7 @@ subroutine FVW_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSt DstInputFileData%VTKBlades = SrcInputFileData%VTKBlades DstInputFileData%DTvtk = SrcInputFileData%DTvtk DstInputFileData%VTKCoord = SrcInputFileData%VTKCoord + DstInputFileData%SrcPnlFile = SrcInputFileData%SrcPnlFile end subroutine subroutine FVW_DestroyInputFile(InputFileData, ErrStat, ErrMsg) @@ -3608,6 +4227,7 @@ subroutine FVW_PackInputFile(RF, Indata) call RegPack(RF, InData%VTKBlades) call RegPack(RF, InData%DTvtk) call RegPack(RF, InData%VTKCoord) + call RegPack(RF, InData%SrcPnlFile) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -3648,6 +4268,7 @@ subroutine FVW_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%VTKBlades); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DTvtk); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VTKCoord); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SrcPnlFile); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine FVW_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg) @@ -4079,5 +4700,300 @@ SUBROUTINE FVW_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Er END DO END IF ! check if allocated END SUBROUTINE + +function FVW_InputMeshPointer(u, DL) result(Mesh) + type(FVW_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (FVW_u_WingsMesh) + Mesh => u%WingsMesh(DL%i1) + end select +end function + +function FVW_OutputMeshPointer(y, DL) result(Mesh) + type(FVW_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine FVW_VarsPackContState(Vars, x, ValAry) + type(FVW_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call FVW_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine FVW_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(FVW_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FVW_x_W_Gamma_NW) + VarVals = x%W(DL%i1)%Gamma_NW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (FVW_x_W_Gamma_FW) + VarVals = x%W(DL%i1)%Gamma_FW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (FVW_x_W_Eps_NW) + VarVals = x%W(DL%i1)%Eps_NW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (FVW_x_W_Eps_FW) + VarVals = x%W(DL%i1)%Eps_FW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (FVW_x_W_r_NW) + VarVals = x%W(DL%i1)%r_NW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (FVW_x_W_r_FW) + VarVals = x%W(DL%i1)%r_FW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (FVW_x_UA_element_x) + VarVals = x%UA(DL%i1)%element(DL%i2, DL%i3)%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FVW_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(FVW_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call FVW_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine FVW_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(FVW_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FVW_x_W_Gamma_NW) + x%W(DL%i1)%Gamma_NW(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (FVW_x_W_Gamma_FW) + x%W(DL%i1)%Gamma_FW(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (FVW_x_W_Eps_NW) + x%W(DL%i1)%Eps_NW(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (FVW_x_W_Eps_FW) + x%W(DL%i1)%Eps_FW(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (FVW_x_W_r_NW) + x%W(DL%i1)%r_NW(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (FVW_x_W_r_FW) + x%W(DL%i1)%r_FW(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (FVW_x_UA_element_x) + x%UA(DL%i1)%element(DL%i2, DL%i3)%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function FVW_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (FVW_x_W_Gamma_NW) + Name = "x%W("//trim(Num2LStr(DL%i1))//")%Gamma_NW" + case (FVW_x_W_Gamma_FW) + Name = "x%W("//trim(Num2LStr(DL%i1))//")%Gamma_FW" + case (FVW_x_W_Eps_NW) + Name = "x%W("//trim(Num2LStr(DL%i1))//")%Eps_NW" + case (FVW_x_W_Eps_FW) + Name = "x%W("//trim(Num2LStr(DL%i1))//")%Eps_FW" + case (FVW_x_W_r_NW) + Name = "x%W("//trim(Num2LStr(DL%i1))//")%r_NW" + case (FVW_x_W_r_FW) + Name = "x%W("//trim(Num2LStr(DL%i1))//")%r_FW" + case (FVW_x_UA_element_x) + Name = "x%UA("//trim(Num2LStr(DL%i1))//")%element("//trim(Num2LStr(DL%i2))//", "//trim(Num2LStr(DL%i3))//")%x" + case default + Name = "Unknown Field" + end select +end function + +subroutine FVW_VarsPackContStateDeriv(Vars, x, ValAry) + type(FVW_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call FVW_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine FVW_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(FVW_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FVW_x_W_Gamma_NW) + VarVals = x%W(DL%i1)%Gamma_NW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (FVW_x_W_Gamma_FW) + VarVals = x%W(DL%i1)%Gamma_FW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (FVW_x_W_Eps_NW) + VarVals = x%W(DL%i1)%Eps_NW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (FVW_x_W_Eps_FW) + VarVals = x%W(DL%i1)%Eps_FW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (FVW_x_W_r_NW) + VarVals = x%W(DL%i1)%r_NW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (FVW_x_W_r_FW) + VarVals = x%W(DL%i1)%r_FW(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (FVW_x_UA_element_x) + VarVals = x%UA(DL%i1)%element(DL%i2, DL%i3)%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FVW_VarsPackInput(Vars, u, ValAry) + type(FVW_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call FVW_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine FVW_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(FVW_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FVW_u_rotors_HubOrientation) + VarVals = u%rotors(DL%i1)%HubOrientation(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (FVW_u_rotors_HubPosition) + VarVals = u%rotors(DL%i1)%HubPosition(V%iLB:V%iUB) ! Rank 1 Array + case (FVW_u_W_Vwnd_LL) + VarVals = u%W(DL%i1)%Vwnd_LL(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (FVW_u_W_omega_z) + VarVals = u%W(DL%i1)%omega_z(V%iLB:V%iUB) ! Rank 1 Array + case (FVW_u_WingsMesh) + call MV_PackMesh(V, u%WingsMesh(DL%i1), ValAry) ! Mesh + case (FVW_u_V_wind) + VarVals = u%V_wind(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FVW_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(FVW_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call FVW_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine FVW_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(FVW_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FVW_u_rotors_HubOrientation) + u%rotors(DL%i1)%HubOrientation(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (FVW_u_rotors_HubPosition) + u%rotors(DL%i1)%HubPosition(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (FVW_u_W_Vwnd_LL) + u%W(DL%i1)%Vwnd_LL(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (FVW_u_W_omega_z) + u%W(DL%i1)%omega_z(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (FVW_u_WingsMesh) + call MV_UnpackMesh(V, ValAry, u%WingsMesh(DL%i1)) ! Mesh + case (FVW_u_V_wind) + u%V_wind(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function FVW_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (FVW_u_rotors_HubOrientation) + Name = "u%rotors("//trim(Num2LStr(DL%i1))//")%HubOrientation" + case (FVW_u_rotors_HubPosition) + Name = "u%rotors("//trim(Num2LStr(DL%i1))//")%HubPosition" + case (FVW_u_W_Vwnd_LL) + Name = "u%W("//trim(Num2LStr(DL%i1))//")%Vwnd_LL" + case (FVW_u_W_omega_z) + Name = "u%W("//trim(Num2LStr(DL%i1))//")%omega_z" + case (FVW_u_WingsMesh) + Name = "u%WingsMesh("//trim(Num2LStr(DL%i1))//")" + case (FVW_u_V_wind) + Name = "u%V_wind" + case default + Name = "Unknown Field" + end select +end function + +subroutine FVW_VarsPackOutput(Vars, y, ValAry) + type(FVW_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call FVW_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine FVW_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(FVW_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FVW_y_W_Vind) + VarVals = y%W(DL%i1)%Vind(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FVW_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(FVW_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call FVW_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine FVW_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(FVW_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FVW_y_W_Vind) + y%W(DL%i1)%Vind(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function FVW_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (FVW_y_W_Vind) + Name = "y%W("//trim(Num2LStr(DL%i1))//")%Vind" + case default + Name = "Unknown Field" + end select +end function + END MODULE FVW_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/src/FVW_VortexTools.f90 b/modules/aerodyn/src/FVW_VortexTools.f90 index 7537b8e814..a4c5c6f920 100644 --- a/modules/aerodyn/src/FVW_VortexTools.f90 +++ b/modules/aerodyn/src/FVW_VortexTools.f90 @@ -8,6 +8,7 @@ module FVW_VortexTools use NWTC_LIBRARY, only: ReKi, IntKi, num2lstr, ErrID_Fatal, ErrID_None, EqualRealNos !< Not desired use NWTC_LIBRARY, only: InterpArray + use NWTC_LIBRARY, only: Pi use FVW_BiotSavart, only: fourpi_inv implicit none @@ -2147,7 +2148,56 @@ subroutine curl_regular_grid(f,rotf,ix,iy,iz,nx,ny,nz,dx,dy,dz) !endif end subroutine curl_regular_grid - + !> Return an ellipsoid made of panels + subroutine EllipsoidPanels(n1, n2, L1, L2, L3, Points, IDs, zoff) + integer, intent(in) :: n1, n2 !< Number of points in main and secondary direction (spherical coordinates) + real(ReKi), intent(in) :: L1, L2, L3 !< Main axes of ellipsoid in 3 directions + real(ReKi), dimension(:,:), allocatable, intent(out) :: Points !< 3 x nP + integer, dimension(:,:), allocatable, intent(out) :: IDs !< 4 x nPanels, connectivity + real(ReKi), intent(in) :: zOff !< zoffset + ! Variables + integer :: ip, it, node,e + real(ReKi) :: phi !< + real(ReKi) :: theta !< + real(ReKi) :: dphi !< + real(ReKi) :: dtheta !< + integer :: nphi !< + integer :: ntheta !< + real(ReKi), dimension(3) :: P + ntheta = n2+1 + nphi = n1 + dtheta = pi/(ntheta-1) ! -1 + dphi = 2*pi/nphi + allocate(Points(3, nphi*ntheta )) + allocate(IDs (4, nphi*(ntheta-1))) + IDs = 0.0_ReKi + Points = 0.0_ReKi + + ! Building Points + do it=1,ntheta + theta=-pi/2 + real((it-1),ReKi)*dtheta ! + do ip=1,nphi + phi = (ip-1)*dphi + node = (it-1)*nphi +ip + Points(1, node) = L1*cos(theta)*cos(phi) + Points(2, node) = L2*cos(theta)*sin(phi) + Points(3, node) = L3*sin(theta) +zoff + end do + end do + ! Ugly for loops for Panl + do it=1,ntheta-1 + do ip=1,nphi-1 + node = (it-1)*nphi +ip + e = (it-1)*(nphi)+ip + IDs(:, e)=(/node,node+nphi,node+nphi+1,node+1 /) + end do + ! special case, ip=nphi + ip = nphi ! + node = (it-1)*nphi +ip + e = (it-1)*(nphi)+ip + IDs(:, e) = (/node,node+nphi,node+nphi-ip+1,node-ip+1/) + end do + end subroutine EllipsoidPanels ! --- TIC TOC MODULE !> Simpler version of matlab tic diff --git a/modules/aerodyn/src/FVW_Wings.f90 b/modules/aerodyn/src/FVW_Wings.f90 index 443653caac..4279d9d59c 100644 --- a/modules/aerodyn/src/FVW_Wings.f90 +++ b/modules/aerodyn/src/FVW_Wings.f90 @@ -281,23 +281,25 @@ subroutine Wings_ComputeCirculation(t, z, z_prev, p, x, m, AFInfo, ErrStat, ErrM GammaScale=1.0_ReKi endif - if (p%CircSolvMethod==idCircPrescribed) then + select case (p%CircSolvMethod) + ! Prescribed circulation + case (idCircPrescribed) do iW = 1, p%nWings !Loop over lifting lines z%W(iW)%Gamma_LL(1:p%W(iW)%nSpan) = p%W(iW)%PrescribedCirculation(1:p%W(iW)%nSpan) m%W(iW)%Vind_CP=-9999._ReKi !< Safety m%W(iW)%Vtot_CP=-9999._ReKi !< Safety enddo - else if (p%CircSolvMethod==idCircPolarData) then - ! --- Solve for circulation using polar data + ! Solve for circulation using polar data + case (idCircPolarData) CALL Wings_ComputeCirculationPolarData(z, z_prev, p, x, m, AFInfo, GammaScale, ErrStat, ErrMsg, iLabel) - else if (p%CircSolvMethod==idCircNoFlowThrough) then + case (idCircNoFlowThrough) ! --- Solve for circulation using the no-flow through condition ErrMsg='Circulation method nor implemented'; ErrStat=ErrID_Fatal; return ! should never happen - else + case default ErrMsg='Circulation method nor implemented'; ErrStat=ErrID_Fatal; return ! should never happen - endif + end select ! Scale circulation (for initial transient) do iW = 1, p%nWings !Loop over lifting lines @@ -428,9 +430,9 @@ subroutine Wings_ComputeCirculationPolarData(z, z_prev, p, x, m, AFInfo, GammaSc do iDepth=1,p%iNWStart ! Two first panels ! --- Defining a ring P1=x%W(iW)%r_NW(1:3,iSpan ,iDepth ) + P4=x%W(iW)%r_NW(1:3,iSpan ,iDepth+1) P2=x%W(iW)%r_NW(1:3,iSpan+1,iDepth ) P3=x%W(iW)%r_NW(1:3,iSpan+1,iDepth+1) - P4=x%W(iW)%r_NW(1:3,iSpan ,iDepth+1) ! --- Induced velocity from ring, on all other control points (have to loop on rotors and wings and span again) kCP2=1 do iWCP=1,p%nWings diff --git a/modules/aerodyn/src/UnsteadyAero.f90 b/modules/aerodyn/src/UnsteadyAero.f90 index ffe3a16363..396cc74197 100644 --- a/modules/aerodyn/src/UnsteadyAero.f90 +++ b/modules/aerodyn/src/UnsteadyAero.f90 @@ -1175,7 +1175,7 @@ subroutine UA_Init_Outputs(InitInp, p, y, InitOut, errStat, errMsg) integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None character(6) :: TmpChar ! Temporary char array to hold the node digits (3 places only!!!!) - integer(IntKi) :: i,j, iNode, iOffset + integer(IntKi) :: i,j, iNode, iOffset, iOffAcc character(64) :: chanPrefix character(ErrMsgLen) :: errMsg2 ! temporary Error message if ErrStat /= ErrID_None integer(IntKi) :: errStat2 ! temporary Error status of the operation @@ -1205,6 +1205,7 @@ subroutine UA_Init_Outputs(InitInp, p, y, InitOut, errStat, errMsg) else p%NumOuts = 45 end if + p%NumOuts = p%NumOuts+6 ! Always including C*(alpha_T) and C*(alpha_Q) allocate(InitOut%WriteOutputHdr(p%NumOuts*p%numBlades*p%nNodesPerBlade),STAT=ErrStat2) if (ErrStat2 /= 0) call SetErrStat(ErrID_Fatal,'Error allocating WriteOutputHdr.',ErrStat,ErrMsg,RoutineName) @@ -1257,6 +1258,7 @@ subroutine UA_Init_Outputs(InitInp, p, y, InitOut, errStat, errMsg) InitOut%WriteOutputUnt(iOffset+ 9) = '(deg)' InitOut%WriteOutputUnt(iOffset+10) = '(s)' InitOut%WriteOutputUnt(iOffset+11) = '(deg)' + iOffAcc = iOffset+11 elseif (p%UAmod == UA_HGM .or. p%UAMod == UA_HGMV .or. p%UAMod == UA_OYE .or. p%UAMod == UA_HGMV360) then @@ -1290,16 +1292,19 @@ subroutine UA_Init_Outputs(InitInp, p, y, InitOut, errStat, errMsg) InitOut%WriteOutputUnt(iOffset+18) = '(-)' InitOut%WriteOutputUnt(iOffset+19) = '(-)' InitOut%WriteOutputUnt(iOffset+20) = '(-)' + iOffAcc = iOffset+20 if (p%UAmod == UA_HGMV) then InitOut%WriteOutputHdr(iOffset+21) = trim(chanPrefix)//'x5' InitOut%WriteOutputUnt(iOffset+21) = '(-)' + iOffAcc = iOffset+21 else if (p%UAmod == UA_HGMV360) then InitOut%WriteOutputHdr(iOffset+21) = trim(chanPrefix)//'Q' InitOut%WriteOutputHdr(iOffset+22) = trim(chanPrefix)//'Qdot' InitOut%WriteOutputUnt(iOffset+21) = '(-)' InitOut%WriteOutputUnt(iOffset+22) = '(-)' + iOffAcc = iOffset+22 end if elseif(p%UAMod == UA_BV) then @@ -1342,6 +1347,7 @@ subroutine UA_Init_Outputs(InitInp, p, y, InitOut, errStat, errMsg) InitOut%WriteOutputUnt(iOffset+24) = '(-)' InitOut%WriteOutputUnt(iOffset+25) = '(m/s)' InitOut%WriteOutputUnt(iOffset+26) = '(m/s)' + iOffAcc = iOffset+26 else if (p%UAmod == UA_Baseline .or. p%UAMod == UA_Gonzalez .or. p%UAMod == UA_MinnemaPierce) then @@ -1423,10 +1429,19 @@ subroutine UA_Init_Outputs(InitInp, p, y, InitOut, errStat, errMsg) InitOut%WriteOutputUnt(iOffset+43) ='(-)' InitOut%WriteOutputUnt(iOffset+44) ='(-)' InitOut%WriteOutputUnt(iOffset+45) ='(deg)' + iOffAcc = iOffset+45 else call SetErrStat( ErrID_Fatal, 'Programming error UAmod case not accounted for.', ErrStat, ErrMsg, RoutineName ); return end if + + ! Quasi-steady airfoil coefficients at quarter chord (Q) and three quarter chord (T) + iOffAcc = iOffAcc +1 ; InitOut%WriteOutputHdr(iOffAcc) = trim(chanPrefix)//'Cl_qs_Q'; InitOut%WriteOutputUnt(iOffAcc) = '(-)' + iOffAcc = iOffAcc +1 ; InitOut%WriteOutputHdr(iOffAcc) = trim(chanPrefix)//'Cd_qs_Q'; InitOut%WriteOutputUnt(iOffAcc) = '(-)' + iOffAcc = iOffAcc +1 ; InitOut%WriteOutputHdr(iOffAcc) = trim(chanPrefix)//'Cm_qs_Q'; InitOut%WriteOutputUnt(iOffAcc) = '(-)' + iOffAcc = iOffAcc +1 ; InitOut%WriteOutputHdr(iOffAcc) = trim(chanPrefix)//'Cl_qs_T'; InitOut%WriteOutputUnt(iOffAcc) = '(-)' + iOffAcc = iOffAcc +1 ; InitOut%WriteOutputHdr(iOffAcc) = trim(chanPrefix)//'Cd_qs_T'; InitOut%WriteOutputUnt(iOffAcc) = '(-)' + iOffAcc = iOffAcc +1 ; InitOut%WriteOutputHdr(iOffAcc) = trim(chanPrefix)//'Cm_qs_T'; InitOut%WriteOutputUnt(iOffAcc) = '(-)' end do end do @@ -3862,6 +3877,7 @@ subroutine UA_CalcOutput( i, j, t, u_in, p, x, xd, OtherState, AFInfo, y, misc, subroutine CalcWriteOutputs() integer :: iOffset + integer :: iOffAcc ! Accumulated offset iOffset = (i-1)*p%NumOuts + (j-1)*p%nNodesPerBlade*p%NumOuts y%WriteOutput(iOffset+ 1) = u%alpha*R2D @@ -3877,6 +3893,7 @@ subroutine CalcWriteOutputs() y%WriteOutput(iOffset+ 9) = alpha_34*R2D y%WriteOutput(iOffset+10) = Tu y%WriteOutput(iOffset+11) = alpha_34*R2D + iOffAcc = iOffset+11 elseif (p%UAMod == UA_HGM .or. p%UAMod == UA_HGMV .or. p%UAMod == UA_OYE .or. p%UAMod == UA_HGMV360) then y%WriteOutput(iOffset+ 8) = u%omega*R2D @@ -3893,12 +3910,15 @@ subroutine CalcWriteOutputs() y%WriteOutput(iOffset+18) = k y%WriteOutput(iOffset+19) = misc%weight(i,j) y%WriteOutput(iOffset+20) = cl_fa + iOffAcc = iOffset+20 if (p%UAMod == UA_HGMV) then y%WriteOutput(iOffset+21) = x_in%x(5) !x%element(i,j)%x(5) + iOffAcc = iOffset+21 else if (p%UAMod == UA_HGMV360) then y%WriteOutput(iOffset+21) = x_in%x(6) !x%element(i,j)%x(6) y%WriteOutput(iOffset+22) = x_in%x(7) !x%element(i,j)%x(7) + iOffAcc = iOffset+22 end if elseif(p%UAMod == UA_BV) then @@ -3921,6 +3941,7 @@ subroutine CalcWriteOutputs() y%WriteOutput(iOffset+24) = delN y%WriteOutput(iOffset+25) = u%v_ac(1) y%WriteOutput(iOffset+26) = u%v_ac(2) + iOffAcc = iOffset+26 else ! Baseline, Gonzales, MinnemaPierce @@ -3976,8 +3997,23 @@ subroutine CalcWriteOutputs() y%WriteOutput(iOffset+43) = k y%WriteOutput(iOffset+44) = misc%weight(i,j) y%WriteOutput(iOffset+45) = KC%alpha_filt_cur*R2D + iOffAcc = iOffset+45 end if + + ! --- Quasi steady airfoil coefficients at alpha + call AFI_ComputeAirfoilCoefs( u%alpha, u%Re, u%UserProp, AFInfo, AFI_interp, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + iOffAcc=iOffAcc+1; y%WriteOutput(iOffAcc) = AFI_interp%Cl + iOffAcc=iOffAcc+1; y%WriteOutput(iOffAcc) = AFI_interp%Cd + iOffAcc=iOffAcc+1; y%WriteOutput(iOffAcc) = AFI_interp%Cm + + ! --- Quasi steady airfoil coefficients at alpha_34 + alpha_34 = Get_Alpha34(u%v_ac, u%omega, p%d_34_to_ac*p%c(i,j)) + call AFI_ComputeAirfoilCoefs( alpha_34, u%Re, u%UserProp, AFInfo, AFI_interp, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + iOffAcc=iOffAcc+1; y%WriteOutput(iOffAcc) = AFI_interp%Cl + iOffAcc=iOffAcc+1; y%WriteOutput(iOffAcc) = AFI_interp%Cd + iOffAcc=iOffAcc+1; y%WriteOutput(iOffAcc) = AFI_interp%Cm + end subroutine CalcWriteOutputs !> Calc Outputs for Boeing-Vertol dynamic stall diff --git a/modules/aerodyn/src/UnsteadyAero_Types.f90 b/modules/aerodyn/src/UnsteadyAero_Types.f90 index 8f26807364..41a52d6d4c 100644 --- a/modules/aerodyn/src/UnsteadyAero_Types.f90 +++ b/modules/aerodyn/src/UnsteadyAero_Types.f90 @@ -34,10 +34,10 @@ MODULE UnsteadyAero_Types USE AirfoilInfo_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Method_RK4 = 1 ! RK4 integration method [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Method_AB4 = 2 ! AB4 integration method [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Method_ABM4 = 3 ! ABM4 integration method [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Method_BDF2 = 4 ! BDF2 integration method [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Method_RK4 = 1 ! RK4 integration method [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Method_AB4 = 2 ! AB4 integration method [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Method_ABM4 = 3 ! ABM4 integration method [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: UA_Method_BDF2 = 4 ! BDF2 integration method [-] ! ========= UA_InitInputType ======= TYPE, PUBLIC :: UA_InitInputType REAL(DbKi) :: dt = 0.0_R8Ki !< time step [s] @@ -249,7 +249,21 @@ MODULE UnsteadyAero_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< outputs to be written to a file [-] END TYPE UA_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: UA_x_element_x = 1 ! UA%element(DL%i1, DL%i2)%x + integer(IntKi), public, parameter :: UA_u_U = 2 ! UA%U + integer(IntKi), public, parameter :: UA_u_alpha = 3 ! UA%alpha + integer(IntKi), public, parameter :: UA_u_Re = 4 ! UA%Re + integer(IntKi), public, parameter :: UA_u_UserProp = 5 ! UA%UserProp + integer(IntKi), public, parameter :: UA_u_v_ac = 6 ! UA%v_ac + integer(IntKi), public, parameter :: UA_u_omega = 7 ! UA%omega + integer(IntKi), public, parameter :: UA_y_Cn = 8 ! UA%Cn + integer(IntKi), public, parameter :: UA_y_Cc = 9 ! UA%Cc + integer(IntKi), public, parameter :: UA_y_Cm = 10 ! UA%Cm + integer(IntKi), public, parameter :: UA_y_Cl = 11 ! UA%Cl + integer(IntKi), public, parameter :: UA_y_Cd = 12 ! UA%Cd + integer(IntKi), public, parameter :: UA_y_WriteOutput = 13 ! UA%WriteOutput + +contains subroutine UA_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(UA_InitInputType), intent(in) :: SrcInitInputData @@ -2524,5 +2538,280 @@ SUBROUTINE UA_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Err y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function UA_InputMeshPointer(u, DL) result(Mesh) + type(UA_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function UA_OutputMeshPointer(y, DL) result(Mesh) + type(UA_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine UA_VarsPackContState(Vars, x, ValAry) + type(UA_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call UA_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine UA_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(UA_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (UA_x_element_x) + VarVals = x%element(DL%i1, DL%i2)%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine UA_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(UA_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call UA_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine UA_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(UA_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (UA_x_element_x) + x%element(DL%i1, DL%i2)%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function UA_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (UA_x_element_x) + Name = "x%element("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")%x" + case default + Name = "Unknown Field" + end select +end function + +subroutine UA_VarsPackContStateDeriv(Vars, x, ValAry) + type(UA_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call UA_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine UA_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(UA_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (UA_x_element_x) + VarVals = x%element(DL%i1, DL%i2)%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine UA_VarsPackInput(Vars, u, ValAry) + type(UA_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call UA_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine UA_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(UA_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (UA_u_U) + VarVals(1) = u%U ! Scalar + case (UA_u_alpha) + VarVals(1) = u%alpha ! Scalar + case (UA_u_Re) + VarVals(1) = u%Re ! Scalar + case (UA_u_UserProp) + VarVals(1) = u%UserProp ! Scalar + case (UA_u_v_ac) + VarVals = u%v_ac(V%iLB:V%iUB) ! Rank 1 Array + case (UA_u_omega) + VarVals(1) = u%omega ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine UA_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(UA_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call UA_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine UA_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(UA_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (UA_u_U) + u%U = VarVals(1) ! Scalar + case (UA_u_alpha) + u%alpha = VarVals(1) ! Scalar + case (UA_u_Re) + u%Re = VarVals(1) ! Scalar + case (UA_u_UserProp) + u%UserProp = VarVals(1) ! Scalar + case (UA_u_v_ac) + u%v_ac(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (UA_u_omega) + u%omega = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function UA_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (UA_u_U) + Name = "u%U" + case (UA_u_alpha) + Name = "u%alpha" + case (UA_u_Re) + Name = "u%Re" + case (UA_u_UserProp) + Name = "u%UserProp" + case (UA_u_v_ac) + Name = "u%v_ac" + case (UA_u_omega) + Name = "u%omega" + case default + Name = "Unknown Field" + end select +end function + +subroutine UA_VarsPackOutput(Vars, y, ValAry) + type(UA_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call UA_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine UA_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(UA_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (UA_y_Cn) + VarVals(1) = y%Cn ! Scalar + case (UA_y_Cc) + VarVals(1) = y%Cc ! Scalar + case (UA_y_Cm) + VarVals(1) = y%Cm ! Scalar + case (UA_y_Cl) + VarVals(1) = y%Cl ! Scalar + case (UA_y_Cd) + VarVals(1) = y%Cd ! Scalar + case (UA_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine UA_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(UA_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call UA_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine UA_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(UA_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (UA_y_Cn) + y%Cn = VarVals(1) ! Scalar + case (UA_y_Cc) + y%Cc = VarVals(1) ! Scalar + case (UA_y_Cm) + y%Cm = VarVals(1) ! Scalar + case (UA_y_Cl) + y%Cl = VarVals(1) ! Scalar + case (UA_y_Cd) + y%Cd = VarVals(1) ! Scalar + case (UA_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function UA_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (UA_y_Cn) + Name = "y%Cn" + case (UA_y_Cc) + Name = "y%Cc" + case (UA_y_Cm) + Name = "y%Cm" + case (UA_y_Cl) + Name = "y%Cl" + case (UA_y_Cd) + Name = "y%Cd" + case (UA_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE UnsteadyAero_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/aerodyn/tests/aerodyn_utest.F90 b/modules/aerodyn/tests/aerodyn_utest.F90 index 5d2097235a..83e3116809 100644 --- a/modules/aerodyn/tests/aerodyn_utest.F90 +++ b/modules/aerodyn/tests/aerodyn_utest.F90 @@ -21,7 +21,7 @@ program aerodyn_utest total_tests = 0 do is = 1, size(testsuites) write (error_unit, fmt) "Testing:", testsuites(is)%name - call run_testsuite(testsuites(is)%collect, error_unit, stat) + call run_testsuite(testsuites(is)%collect, error_unit, stat, parallel=.false.) end do if (stat > 0) then diff --git a/modules/aerodyn/tests/test_FVW_testsuite.F90 b/modules/aerodyn/tests/test_FVW_testsuite.F90 new file mode 100644 index 0000000000..17d40598f6 --- /dev/null +++ b/modules/aerodyn/tests/test_FVW_testsuite.F90 @@ -0,0 +1,42 @@ +@test +subroutine test_AD_FVW() + ! test branches + ! - known valid checks for various FVW routines (contained in own module) + ! - known invalid rotation matrix: halve the angle of the diagonal elements + + use pFUnit_mod + use NWTC_Num + use FVW_Tests + + implicit none + + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg + character(1024) :: testname + + ! initialize NWTC_Num constants + call SetConstants() + + ! --- Run all tests at once + call FVW_RunTests (errStat,errMsg); + @assertEqual(0, errStat, 'All FVW tests ') + + ! --- Run individual tests + !call Test_LinSolve (errStat,errMsg); + !@assertEqual(0, errStat, 'Test_LinSolve ') + !call Test_SrcPnl_Sphere (errStat,errMsg); + !@assertEqual(0, errStat, 'Test_SrcPnl_Sphere ') + !call Test_BiotSavart_SrcPnl (errStat,errMsg); + !@assertEqual(0, errStat, 'Test_BiotSavart_SrcPnl ') + !call Test_BiotSavart_Sgmt (errStat,errMsg); + !@assertEqual(0, errStat, 'Test_BiotSavart_Sgmt ') + !call Test_BiotSavart_Part (errStat,errMsg); + !@assertEqual(0, errStat, 'Test_BiotSavart_Part ') + !call Test_BiotSavart_PartTree (errStat,errMsg); + !@assertEqual(0, errStat, 'Test_BiotSavart_PartTree ') + !call Test_SegmentsToPart (errStat,errMsg); + !@assertEqual(0, errStat, 'Test_SegmentsToPart ') + !call FVW_Test_WakeInducedVelocities(errStat,errMsg); + !@assertEqual(0, errStat, 'FVW_Test_WakeInducedVelocities') + +end subroutine test_AD_FVW diff --git a/modules/awae/CMakeLists.txt b/modules/awae/CMakeLists.txt index 25beec5ace..fdb66b91b6 100644 --- a/modules/awae/CMakeLists.txt +++ b/modules/awae/CMakeLists.txt @@ -1,5 +1,5 @@ # -# Copyright 2016 National Renewable Energy Laboratory +# Copyright 2026 National Lab of the Rockies # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,14 +17,27 @@ if (GENERATE_TYPES) generate_f90_types(src/AWAE_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/AWAE_Types.f90 -noextrap) endif() +add_library(awaelib_c STATIC + src/vtk.cpp +) +target_link_libraries(awaelib_c nwtclibs) + add_library(awaelib STATIC src/AWAE.f90 src/AWAE_IO.f90 src/AWAE_Types.f90 + src/amrex_utils.F90 ) -target_link_libraries(awaelib ifwlib nwtclibs) +target_link_libraries(awaelib awaelib_c ifwlib nwtclibs) + +# If AMReX reader enabled, build library and link amrex_3d +if (AMREX_READER) + target_sources(awaelib_c PRIVATE src/amrex_utils.cpp) + target_link_libraries(awaelib_c amrex_3d) + target_compile_definitions(awaelib PRIVATE ENABLE_AMREX_LIB) +endif() -install(TARGETS awaelib +install(TARGETS awaelib awaelib_c EXPORT "${CMAKE_PROJECT_NAME}Libraries" RUNTIME DESTINATION bin LIBRARY DESTINATION lib diff --git a/modules/awae/src/AWAE.f90 b/modules/awae/src/AWAE.f90 index 2eb80fff69..0f8360cc54 100644 --- a/modules/awae/src/AWAE.f90 +++ b/modules/awae/src/AWAE.f90 @@ -28,6 +28,8 @@ module AWAE use AWAE_Types use AWAE_IO use InflowWind + use IfW_FlowField + use KdTree #ifdef _OPENMP use OMP_LIB @@ -54,7 +56,6 @@ module AWAE public :: AWAE_TEST_CalcOutput public :: AWAE_TEST_Interp2D - contains @@ -111,8 +112,7 @@ subroutine ComputeLocals(n, u, p, y, m, errStat, errMsg) integer(IntKi), intent(in ) :: n !< Current simulation time increment (zero-based) type(AWAE_InputType), intent(in ) :: u !< Inputs at Time t type(AWAE_ParameterType), intent(in ) :: p !< Parameters - type(AWAE_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- - !! nectivity information does not have to be recalculated) + type(AWAE_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh connectivity information does not have to be recalculated) type(AWAE_MiscVarType), intent(inout) :: m !< Misc/optimization variables integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None @@ -122,9 +122,10 @@ subroutine ComputeLocals(n, u, p, y, m, errStat, errMsg) errStat = 0 errMsg = "" - maxPln = min(n,p%NumPlanes-2) + rmax = p%y(p%NumRadii-1) do nt = 1,p%NumTurbines + maxPln = NINT(u%NumPlanes(nt))-2 do np = 0, maxPln cosTerm = dot_product(u%xhat_plane(:,np+1,nt),u%xhat_plane(:,np,nt)) if (EqualRealNos(cosTerm, 1.0_ReKi)) then @@ -175,46 +176,59 @@ end function jinc !! Orientations from plane to inertial for each wake, shape: 3x3xnWake !! R_p2i = [xphat|i^t yphat|i^t zphat|i^t] subroutine interp_planes_2_point(u, p, m, GridP, iWT, maxPln, & - iw, wk_R_p2i, wk_V, wk_WAT_k) + iw, wk_R_p2i, wk_V, wk_WAT_k, start_plane, end_plane) type(AWAE_InputType), intent(in ) :: u !< Inputs at Time t type(AWAE_ParameterType), intent(in ) :: p !< Parameters type(AWAE_MiscVarType), intent(in ) :: m !< Misc/optimization variables integer(IntKi), intent(in ) :: iWT integer(IntKi), intent(in ) :: maxPln real(ReKi), intent(in ) :: GridP(3) !< grid point, 3 x nFlat - integer(IntKi), intent(inout) :: iw !< Cumulative index on numbre of wakes intersecting at that point + integer(IntKi), intent(inout) :: iw !< Cumulative index on number of wakes intersecting at that point real(ReKi), intent(inout) :: wk_R_p2i(:,:,:)!< Orientations from plane to inertial for each wake, shape: 3x3xnWake real(ReKi), intent(inout) :: wk_V(:,:) !< Wake velocity from each overlapping wake, shape: 3xnWake real(ReKi), intent(inout) :: wk_WAT_k(:) !< WAT scaling factors for all wakes (for overlap), shape: nWake + integer(IntKi), optional, intent(in) :: start_plane !< Start plane index for interpolation + integer(IntKi), optional, intent(in) :: end_plane !< End plane index for interpolation + ! Local real(ReKi) :: x_end_plane real(ReKi) :: x_start_plane real(ReKi) :: p_tmp_plane(3) real(ReKi) :: r_vec_plane(3) - integer(IntKi) :: np, np1 + integer(IntKi) :: np, np1, sp, ep real(ReKi) :: delta, deltad real(ReKi) :: tmp_vec(3) real(ReKi) :: xHat_plane(3), yHat_plane(3), zHat_plane(3) real(ReKi) :: y_tmp_plane real(ReKi) :: z_tmp_plane + if (present(start_plane)) then + sp = start_plane + else + sp = 0 + end if + if (present(end_plane)) then + ep = end_plane - 1 + else + ep = maxPln + end if + !x_end_plane = dot_product(u%xhat_plane(:,0,iWT), (GridP(:) - u%p_plane(:,0,iWT)) ) - x_end_plane = u%xhat_plane(1,0,iWT) * (GridP(1) - u%p_plane(1,0,iWT)) & - &+ u%xhat_plane(2,0,iWT) * (GridP(2) - u%p_plane(2,0,iWT)) & - &+ u%xhat_plane(3,0,iWT) * (GridP(3) - u%p_plane(3,0,iWT)) + x_end_plane = u%xhat_plane(1,sp,iWT) * (GridP(1) - u%p_plane(1,sp,iWT)) & + + u%xhat_plane(2,sp,iWT) * (GridP(2) - u%p_plane(2,sp,iWT)) & + + u%xhat_plane(3,sp,iWT) * (GridP(3) - u%p_plane(3,sp,iWT)) - do np = 0, maxPln !p%NumPlanes-2 + do np = sp, ep np1 = np + 1 ! Construct the endcaps of the current wake plane volume x_start_plane = x_end_plane !x_end_plane = dot_product(u%xhat_plane(:,np1,iWT), (GridP(:) - u%p_plane(:,np1,iWT)) ) x_end_plane = u%xhat_plane(1,np1,iWT) * (GridP(1) - u%p_plane(1,np1,iWT)) & - &+ u%xhat_plane(2,np1,iWT) * (GridP(2) - u%p_plane(2,np1,iWT)) & - &+ u%xhat_plane(3,np1,iWT) * (GridP(3) - u%p_plane(3,np1,iWT)) + + u%xhat_plane(2,np1,iWT) * (GridP(2) - u%p_plane(2,np1,iWT)) & + + u%xhat_plane(3,np1,iWT) * (GridP(3) - u%p_plane(3,np1,iWT)) - ! test if the point is within the endcaps of the wake volume - if ( ( ( x_start_plane >= 0.0_ReKi ) .and. ( x_end_plane < 0.0_ReKi ) ) .or. & - ( ( x_start_plane <= 0.0_ReKi ) .and. ( x_end_plane > 0.0_ReKi ) ) ) then + ! test if the point is within the end caps of the wake volume + if ((x_start_plane * x_end_plane) < 0.0_ReKi) then ! Plane interpolation factor if ( EqualRealNos( x_start_plane, x_end_plane ) ) then @@ -276,10 +290,14 @@ subroutine interp_planes_2_point(u, p, m, GridP, iWT, maxPln, & endif end if ! if the point is within radial finite-difference grid + + ! Return from function because bounding planes were found + return + end if ! if the point is within the endcaps of the wake volume end do ! np = 0, p%NumPlanes-2 -endsubroutine interp_planes_2_point +end subroutine interp_planes_2_point !> subroutine mergeWakeVel(n_wake, wk_V, wk_R_p2i, V_qs) @@ -343,6 +361,183 @@ subroutine mergeWakeWAT_k(n_wake, wk_WAT_k, WAT_k) WAT_k = sqrt(WAT_k) end subroutine mergeWakeWAT_k +! Update K-d Tree with current wake point locations from all turbines +subroutine CalcWakePointTurbineGridInteractions(p, m, u) + + type(AWAE_ParameterType), intent(in ) :: p !< Parameters + type(AWAE_MiscVarType), intent(inout) :: m !< Misc/optimization variables + type(AWAE_InputType), intent(in ) :: u !< Inputs at Time t + + real(ReKi) :: WakePointSep ! Distance between adjacent wake points + real(ReKi) :: MaxWakeRadius ! maximum wake radius + real(ReKi) :: search_radius ! radius to search for wakes interacting with grid + integer(IntKi) :: n_wake_found + integer(IntKi) :: t_src, c_dst, t_dst, i_wp + integer(IntKi) :: i, j, k + + ! Maximum wake radius for interaction + MaxWakeRadius = p%y(p%NumRadii-1) + + !---------------------------------------------------------------------------- + ! Update K-d Tree with current wake point locations from all turbines + !---------------------------------------------------------------------------- + + ! Initialize the maximum wake point separation to zero + m%MaxWakePointSep = 0.0_ReKi + + ! Initialize the point counter + k = 0 + + ! Loop through the turbines in the farm + do i = 1, p%NumTurbines + + ! Loop through the plane indices + do j = 0, nint(u%NumPlanes(i)) - 1 + + ! Increment point counter + k = k + 1 + + ! Copy point location (X,Y only) into array of points + m%AllPlanePoints(:, k) = u%p_plane(:2, j, i) + + ! Copy plane and turbine indices into array + m%KdTPointData(:, k) = [j, i] + + ! Calculate distance from current wake point to previous wake point + ! Update maximum wake point separation + if (j > 0) then + WakePointSep = norm2(u%p_plane(:, j, i) - u%p_plane(:, j-1, i)) + m%MaxWakePointSep = max(m%MaxWakePointSep, WakePointSep) + end if + end do + end do + + ! Update K-d Tree with new wake point locations + call kdtree_update(m%KdT, m%AllPlanePoints(:,1:k)) + + !---------------------------------------------------------------------------- + ! Populate start/end plane indices for each source turbine that + ! interact with each low-resolution grid destination chunk + !---------------------------------------------------------------------------- + + ! Initialize start/end plane indices by turbine and chunk to invalid value + m%iPlaneTurbChunk = -1 + + ! Initialize array of flags that indicate if a chunk has any wake influence + m%LowResChunkHasWake = .false. + + ! Loop through low res-grid chunks + do c_dst = 1, size(p%LowRes%WakeChunks) + + ! Radius to search for wakes interacting with grid + ! max of (grid radius + max wake radius) or half of max wake point separation + search_radius = max(p%LowRes%WakeChunks(c_dst)%Radius + MaxWakeRadius, & + m%MaxWakePointSep/2.0_ReKi) + + ! Get indices of wake centers within search radius + call kdtree_points_in_radius(m%KdT, p%LowRes%WakeChunks(c_dst)%Center, & + search_radius, m%KdTResults, n_wake_found) + + ! If no wake points found within search radius, continue to next turbine + if (n_wake_found == 0) cycle + + ! Set flag that wake was found in this chunk + m%LowResChunkHasWake(c_dst) = .true. + + ! Loop through the wake points found, and group first/last point by turbine + do i = 1, n_wake_found + + ! Get the source turbine index for this wake plane point + t_src = m%KdTPointData(2, m%KdTResults(i)) + + ! Get the plane index of the wake point + i_wp = m%KdTPointData(1, m%KdTResults(i)) + + ! If no start or end plane previously set for this turbine, set both + ! Otherwise, if plane index is above or below current bounds, update bounds + if (m%iPlaneTurbChunk(1, t_src, c_dst) == -1) then + m%iPlaneTurbChunk(:, t_src, c_dst) = i_wp + else + if (i_wp < m%iPlaneTurbChunk(1, t_src, c_dst)) m%iPlaneTurbChunk(1, t_src, c_dst) = i_wp + if (i_wp > m%iPlaneTurbChunk(2, t_src, c_dst)) m%iPlaneTurbChunk(2, t_src, c_dst) = i_wp + end if + end do + + ! Loop through start and end planes by turbine and expand by one plane if applicable + do t_src = 1, p%NumTurbines + + ! Skip turbines with no planes in this grid + if (m%iPlaneTurbChunk(1, t_src, c_dst) == -1) cycle + + ! Include the plane before the first or clamp to first plane + m%iPlaneTurbChunk(1, t_src, c_dst) = max(0, m%iPlaneTurbChunk(1, t_src, c_dst) - 1) + + ! Include the plane after the last or clamp to last plane + m%iPlaneTurbChunk(2, t_src, c_dst) = min(nint(u%NumPlanes(t_src)) - 1, m%iPlaneTurbChunk(2, t_src, c_dst) + 1) + end do + end do + + !---------------------------------------------------------------------------- + ! Populate start/end plane indices for each source turbine that + ! interact with each destination turbine for the high-resolution grid + !---------------------------------------------------------------------------- + + ! Initialize start/end plane indices by turbine to invalid value + m%iPlaneTurbTurb = -1 + + ! Loop through destination turbines + do t_dst = 1, p%NumTurbines + + ! Radius to search for wakes interacting with grid + ! max of (grid radius + max wake radius) or half of max wake point separation + search_radius = max((p%HighRes(t_dst)%Radius + MaxWakeRadius), & + m%MaxWakePointSep/2.0_ReKi) + + ! Get indices of wake centers within search radius + call kdtree_points_in_radius(m%KdT, p%HighRes(t_dst)%Center, search_radius, m%KdTResults, n_wake_found) + + ! If no wake points found within search radius, continue to next turbine + if (n_wake_found == 0) cycle + + ! Loop through the wake points found, and group first/last point by turbine + do i = 1, n_wake_found + + ! Get the source turbine index for this wake plane point + t_src = m%KdTPointData(2, m%KdTResults(i)) + + ! If this plane belongs to the destination turbine, skip it + if (t_dst == t_src) cycle + + ! Get the plane index of the wake point + j = m%KdTPointData(1, m%KdTResults(i)) + + ! If no start or end plane previously set for this turbine, set for both + if (m%iPlaneTurbTurb(1, t_src, t_dst) == -1) then + m%iPlaneTurbTurb(:, t_src, t_dst) = j + else + ! Otherwise, if plane index is above or below current bounds, update bounds + if (j < m%iPlaneTurbTurb(1, t_src, t_dst)) m%iPlaneTurbTurb(1, t_src, t_dst) = j + if (j > m%iPlaneTurbTurb(2, t_src, t_dst)) m%iPlaneTurbTurb(2, t_src, t_dst) = j + end if + end do + + ! Loop through start and end planes by turbine and expand by one plane if applicable + do t_src = 1, p%NumTurbines + + ! Skip turbines with no planes in this grid + if (m%iPlaneTurbTurb(1, t_src, t_dst) == -1) cycle + + ! Include the plane before the first or clamp to first plane + m%iPlaneTurbTurb(1, t_src, t_dst) = max(0, m%iPlaneTurbTurb(1, t_src, t_dst) - 1) + + ! Include the plane after the last or clamp to last plane + m%iPlaneTurbTurb(2, t_src, t_dst) = min(NINT(u%NumPlanes(t_src)) - 1, m%iPlaneTurbTurb(2, t_src, t_dst) + 1) + + end do + end do + +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- !> Loop over the entire grid of low resolution ambient wind data to compute: !! 1) the disturbed flow at each point and 2) the averaged disturbed velocity of each wake plane @@ -352,286 +547,332 @@ subroutine LowResGridCalcOutput(n, u, p, xd, y, m, errStat, errMsg) type(AWAE_InputType), intent(in ) :: u !< Inputs at Time t type(AWAE_ParameterType), intent(in ) :: p !< Parameters type(AWAE_DiscreteStateType), intent(in ) :: xd !< Discrete states at t - type(AWAE_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- - !! nectivity information does not have to be recalculated) + type(AWAE_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh connectivity information does not have to be recalculated) type(AWAE_MiscVarType), intent(inout) :: m !< Misc/optimization variables integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None - integer(IntKi) :: nt, np, ix, iy, iz, nr, npsi, wamb, iwsum !< loop counters - integer(IntKi) :: n_wake, n_r_polar, n_psi_polar !< accumulating counters - real(SiKi) :: V_qs(3) ! Quasi-steady wake deficit , after wake-intersection averaging (without WAT) - real(ReKi) :: Vave_amb_low_norm, Vamb_lowpol_tmp(3), Vdist_lowpol_tmp(3), Vamb_low_tmp(3,8) - real(ReKi) :: wsum_tmp, w - real(ReKi) :: tmp_x,tmp_y,tmp_z !, tm1, tm2 - real(ReKi) :: xxplane(3), xyplane(3), yyplane(3), yxplane(3), psi_polar, r_polar, p_polar(3) - real(ReKi) :: yzplane_Y(3), xyplane_norm - real(ReKi) :: xplane_sq, yplane_sq, xysq_Z(3), xzplane_X(3) - real(ReKi) :: WAT_k ! WAT scaling factor (averaged from overlapping wakes) - real(ReKi) :: WAT_V(3) ! WAT velocity contribution - real(ReKi) :: Pos_global(3) ! global position - integer(IntKi) :: tmpPln + character(*), parameter :: RoutineName = 'LowResGridCalcOutput' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: nt, np, ix, iy, iz, nr, npsi, wamb, iwsum !< loop counters + integer(IntKi) :: n_wake, n_r_polar, n_psi_polar !< accumulating counters + real(SiKi) :: V_qs(3) ! Quasi-steady wake deficit , after wake-intersection averaging (without WAT) + real(ReKi) :: Vave_amb_low_norm, Vamb_lowpol_tmp(3), Vdist_lowpol_tmp(3), Vamb_low_tmp(3,8) + real(ReKi) :: wsum_tmp, w + real(ReKi) :: tmp_x,tmp_y,tmp_z !, tm1, tm2 + real(ReKi) :: xxplane(3), xyplane(3), yyplane(3), yxplane(3), psi_polar, r_polar, p_polar(3) + real(ReKi) :: yzplane_Y(3), xyplane_norm + real(ReKi) :: xplane_sq, yplane_sq, xysq_Z(3), xzplane_X(3) + real(ReKi) :: WAT_k ! WAT scaling factor (averaged from overlapping wakes) + real(ReKi) :: WAT_V(3) ! WAT velocity contribution + real(ReKi) :: Pos_global(3) ! global position + real(SiKi) :: Vamb_low(3) ! Local copy of ambient velocity + real(SiKi) :: Vdist_low(3) ! Local copy of disturbed velocity + real(SiKi) :: Vdist_low_full(3) ! Local copy of full disturbed velocity real(ReKi), allocatable :: wk_R_p2i(:,:,:)!< Orientations from plane to inertial for each wake, shape: 3x3xnWake real(ReKi), allocatable :: wk_V(:,:) !< Wake velocity from each overlapping wake, shape: 3xnWake real(ReKi), allocatable :: wk_WAT_k(:) !< WAT scaling factors for all wakes (for overlap) - integer(IntKi) :: iXYZ !< Flat counter on X,Y,Z grid - integer(IntKi) :: i - integer(IntKi) :: maxPln - integer(IntKi) :: maxN_wake - integer(IntKi) :: WAT_iT,WAT_iY,WAT_iZ !< indexes for WAT point (Time interchangeable with X) - integer(IntKi) :: errStat2 - character(ErrMsgLen):: errMsg2 - character(*), parameter :: RoutineName = 'LowResGridCalcOutput' - logical :: within - real(ReKi) :: yHat_plane(3), zHat_plane(3) - real(SiKi), dimension(3,3) :: C_rot - real(SiKi) :: C_rot_norm + integer(IntKi) :: iXYZ !< Flat counter on X,Y,Z grid + integer(IntKi) :: i, j + integer(IntKi) :: maxPln + integer(IntKi) :: maxN_wake + integer(IntKi) :: WAT_iT,WAT_iY,WAT_iZ !< indexes for WAT point (Time interchangeable with X) + logical :: within + real(ReKi) :: yHat_plane(3), zHat_plane(3) + real(SiKi) :: C_rot(3,3) + real(SiKi) :: C_rot_norm + integer(IntKi) :: t_src, c_dst + real(ReKi) :: dist errStat = ErrID_None errMsg = "" - maxPln = min(n,p%NumPlanes-2) - tmpPln = min(p%NumPlanes-1, n+1) + maxN_wake = p%NumTurbines*(p%MaxPlanes-1) - maxN_wake = p%NumTurbines*( p%NumPlanes-1 ) - ! Variables stored for each wake crossing at a given point - allocate ( wk_R_p2i (3, 3, 1:maxN_wake ), STAT=errStat2 ); if (errStat2 /= 0) call SetErrStat ( ErrID_Fatal, 'Could not allocate memory for wk_R_p2i.', errStat, errMsg, RoutineName ) - allocate ( wk_V ( 3, 1:maxN_wake ), STAT=errStat2 ); if (errStat2 /= 0) call SetErrStat ( ErrID_Fatal, 'Could not allocate memory for wk_V.', errStat, errMsg, RoutineName ) - allocate ( wk_WAT_k ( 1:maxN_wake ), STAT=errStat2 ); if (errStat2 /= 0) call SetErrStat ( ErrID_Fatal, 'Could not allocate memory for wk_WAT_k.', errStat, errMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return + ! Allocate variables stored for each wake crossing at a given point + call AllocAry(wk_R_p2i, 3, 3, maxN_wake, "wk_R_p2i", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(wk_V, 3, maxN_wake, "wk_V", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(wk_WAT_k, maxN_wake, "wk_WAT_k", ErrStat2, ErrMsg2); if (Failed()) return - ! --- Loop over the entire grid of low resolution ambient wind data to compute: - ! 1) the disturbed flow at each point and 2) the averaged disturbed velocity of each wake plane - !$OMP PARALLEL DO & - !$OMP PRIVATE(iXYZ, ix, iy, iz, n_wake, nt, np, & - !$OMP& wk_R_p2i, wk_V,& - !$OMP& V_qs, & - !$OMP& C_rot, C_rot_norm, Pos_global,& - !$OMP& wk_WAT_k, WAT_k, WAT_iT, WAT_iY, WAT_iZ, WAT_V)& - !$OMP SHARED(m, u, p, xd, maxPln, errStat, errMsg) DEFAULT(NONE) - do iXYZ = 1 , p%NumGrid_low - ! From flat index iXYZ to grid indices - ix = mod( (iXYZ-1) ,p%nX_low) - iy = mod(int( (iXYZ-1) / (p%nX_low ) ),p%nY_low) - iz = int( (iXYZ-1) / (p%nX_low*p%nY_low) ) - ! set the disturbed flow equal to the ambient flow for this time step - m%Vdist_low (:,ix,iy,iz) = m%Vamb_low(:,ix,iy,iz) - m%Vdist_low_full(:,ix,iy,iz) = m%Vamb_low(:,ix,iy,iz) + !---------------------------------------------------------------------------- + ! Add wake contribution to each destination turbine's low-res inflow grid + !---------------------------------------------------------------------------- - ! --- Compute variables wk_* (e.g. velocity) from each wakes reaching the current grid point - n_wake = 0 ! cumulative index, increases if point is at intersection of multiple wakes - do nt = 1,p%NumTurbines - call interp_planes_2_point(u, p, m, p%Grid_low(:,iXYZ), nt, maxPln, & ! In - n_wake, wk_R_p2i, wk_V, wk_WAT_k ) ! InOut - end do ! do nt = 1,p%NumTurbines + ! Initialize the disturbed flow equal to the ambient flow for this time step + m%Vdist_low = m%Vamb_low + m%Vdist_low_full = m%Vamb_low - if (n_wake > 0) then + ! Loop through chunks in the low-res grid + !$OMP parallel do default(none) & + !$OMP shared(p, m, u, xd, maxN_wake) & + !$OMP private(maxPln, c_dst, C_rot, c_rot_norm, i, ix, iy, iz, iXYZ, Pos_global, Vamb_low, Vdist_low, Vdist_low_full, & + !$OMP t_src, n_wake, WAT_k, WAT_V, wk_R_p2i, wk_V, wk_WAT_k, V_qs, WAT_iT, WAT_iY, WAT_iZ) + do c_dst = 1, size(p%LowRes%WakeChunks) - ! --- Compute merged wake velocity V_qs - call mergeWakeVel(n_wake, wk_V, wk_R_p2i, V_qs) + ! If no wake planes interact with the destination chunk's grid, continue + if (.not. m%LowResChunkHasWake(c_dst)) cycle - ! --- Compute average WAT scaling factor and WAT velocity - if (p%WAT_Enabled) then - call mergeWakeWAT_k(n_wake, wk_WAT_k, WAT_k) - ! Position of current grid point - Pos_global(1) = real(ix,ReKi) * p%dX_low + p%X0_low - Pos_global(2) = real(iy,ReKi) * p%dY_low + p%Y0_low - Pos_global(3) = real(iz,ReKi) * p%dZ_low + p%Z0_low - ! The FlowField stores data in Y,Z,T -- Mean wind speed was set to 1.0, so Rate is 1/DT = 1/DX - ! NOTE: the field moves with the average wind field. So the +X is -T in the Mann box - WAT_iT = modulo( nint( (Pos_global(1) - xd%WAT_B_Box(1)) * p%WAT_FlowField%Grid3D%Rate ), p%WAT_FlowField%Grid3D%NSteps ) + 1 ! eq 23 - WAT_iY = modulo( nint( (Pos_global(2) + xd%WAT_B_Box(2)) * p%WAT_FlowField%Grid3D%InvDY ), p%WAT_FlowField%Grid3D%NYGrids) + 1 ! eq 24 - WAT_iZ = modulo( nint( (Pos_global(3) + xd%WAT_B_Box(3)) * p%WAT_FlowField%Grid3D%InvDZ ), p%WAT_FlowField%Grid3D%NZGrids) + 1 ! eq 25 - WAT_V(1:3) = real(p%WAT_FlowField%Grid3D%Vel(1:3,WAT_iY,WAT_iZ,WAT_iT) * WAT_k, SiKi) - else - WAT_V = 0.0_SiKi - endif + ! Loop through the grid point indices in the chunk + do i = 1, size(p%LowRes%WakeChunks(c_dst)%iGridPoints) - !--- Store full velocity (Ambient + Wake QS + WAT) in grid - if(p%Mod_Projection==3) then - ! We do not convect using WAT_T, but we include it in outputs - m%Vdist_low (:,ix,iy,iz) = m%Vdist_low (:,ix,iy,iz) + V_qs - m%Vdist_low_full(:,ix,iy,iz) = m%Vdist_low_full(:,ix,iy,iz) + V_qs + WAT_V + ! Set the grid point index + iXYZ = p%LowRes%WakeChunks(c_dst)%iGridPoints(i) - else if(p%Mod_Projection==1) then - ! We keep the full field (including cross flow components), done for outputs and VTK outputs - m%Vdist_low (:,ix,iy,iz) = m%Vdist_low (:,ix,iy,iz) + V_qs + WAT_V - m%Vdist_low_full(:,ix,iy,iz) = m%Vdist_low_full(:,ix,iy,iz) + V_qs + WAT_V - - else if (p%Mod_Projection==2) then - ! We project against the normal of the plane to remove the cross flow components - C_rot(1,1) = m%Vamb_low(1,ix,iy,iz) * m%Vamb_low(1,ix,iy,iz) - C_rot(1,2) = m%Vamb_low(1,ix,iy,iz) * m%Vamb_low(2,ix,iy,iz) - C_rot(1,3) = m%Vamb_low(1,ix,iy,iz) * m%Vamb_low(3,ix,iy,iz) + ! Get the position of the current grid point + Pos_global = p%LowRes%GridPoints(:,iXYZ) + + ! From flat index iXYZ to grid indices + ix = mod( (iXYZ-1) ,p%LowRes%nXYZ(1)) + iy = mod(int((iXYZ-1) / (p%LowRes%nXYZ(1))),p%LowRes%nXYZ(2)) + iz = int((iXYZ-1) / (p%LowRes%nXYZ(1)*p%LowRes%nXYZ(2))) + + ! Get the ambient flow at this point and initialize the local disturbed velocity + Vamb_low = m%Vamb_low(:,ix,iy,iz) + Vdist_low = Vamb_low + Vdist_low_full = Vamb_low - C_rot(2,1) = m%Vamb_low(2,ix,iy,iz) * m%Vamb_low(1,ix,iy,iz) - C_rot(2,2) = m%Vamb_low(2,ix,iy,iz) * m%Vamb_low(2,ix,iy,iz) - C_rot(2,3) = m%Vamb_low(2,ix,iy,iz) * m%Vamb_low(3,ix,iy,iz) + ! Loop through source turbines + ! Compute variables wk_* (e.g. velocity) from each wakes reaching the current grid point + n_wake = 0 ! cumulative index, increases if point is at intersection of multiple wakes + do t_src = 1, p%NumTurbines - C_rot(3,1) = m%Vamb_low(3,ix,iy,iz) * m%Vamb_low(1,ix,iy,iz) - C_rot(3,2) = m%Vamb_low(3,ix,iy,iz) * m%Vamb_low(2,ix,iy,iz) - C_rot(3,3) = m%Vamb_low(3,ix,iy,iz) * m%Vamb_low(3,ix,iy,iz) + ! Skip turbines with no planes in this chunk + if (m%iPlaneTurbChunk(1, t_src, c_dst) < 0) cycle + + ! Number of active wake volumes from the source turbine + maxPln = NINT(u%NumPlanes(t_src))-2 + + ! Interpolate applied wake effects from source turbine to the current point + call interp_planes_2_point(u, p, m, Pos_global, t_src, & ! In + maxPln, n_wake, wk_R_p2i, wk_V, wk_WAT_k, & ! InOut + start_plane=m%iPlaneTurbChunk(1, t_src, c_dst), & ! Start plane index + end_plane=m%iPlaneTurbChunk(2, t_src, c_dst)) ! End plane index + end do + + if (n_wake > 0) then - C_rot_norm = C_rot(1,1) + C_rot(2,2) + C_rot(3,3) - if (EqualRealNos( C_rot_norm, 0.0_SiKi) ) then - ! do nothing + ! --- Compute merged wake velocity V_qs + call mergeWakeVel(n_wake, wk_V, wk_R_p2i, V_qs) + + ! --- Compute average WAT scaling factor and WAT velocity + if (p%WAT_Enabled) then + + call mergeWakeWAT_k(n_wake, wk_WAT_k, WAT_k) + + ! The FlowField stores data in Y,Z,T -- Mean wind speed was set to 1.0, so Rate is 1/DT = 1/DX + ! NOTE: the field moves with the average wind field. So the +X is -T in the Mann box + WAT_iT = modulo( nint( (Pos_global(1) - xd%WAT_B_Box(1)) * p%WAT_FlowField%Grid3D%Rate ), p%WAT_FlowField%Grid3D%NSteps ) + 1 ! eq 23 + WAT_iY = modulo( nint( (Pos_global(2) + xd%WAT_B_Box(2)) * p%WAT_FlowField%Grid3D%InvDY ), p%WAT_FlowField%Grid3D%NYGrids) + 1 ! eq 24 + WAT_iZ = modulo( nint( (Pos_global(3) + xd%WAT_B_Box(3)) * p%WAT_FlowField%Grid3D%InvDZ ), p%WAT_FlowField%Grid3D%NZGrids) + 1 ! eq 25 + + WAT_V(1:3) = real(p%WAT_FlowField%Grid3D%Vel(1:3,WAT_iY,WAT_iZ,WAT_iT) * WAT_k, SiKi) else - C_rot = C_rot / C_rot_norm - ! Full field is for VTK outputs, contains the cross flow components - m%Vdist_low (:,ix,iy,iz) = m%Vdist_low (:,ix,iy,iz) + matmul(C_rot, V_qs + WAT_V) - m%Vdist_low_full(:,ix,iy,iz) = m%Vdist_low_full(:,ix,iy,iz) + V_qs + WAT_V + WAT_V = 0.0_SiKi endif - endif - - end if ! (n_wake > 0) - end do ! iXYZ, loop NumGrid_low points - !$OMP END PARALLEL DO - do nt = 1,p%NumTurbines - - do np = 0,tmpPln + !---------------------------------------------------------------------- + ! Store full velocity (Ambient + Wake QS + WAT) in grid + !---------------------------------------------------------------------- + select case (p%Mod_Projection) + + ! We do not convect using WAT_T, but we include it in outputs + case (3) + Vdist_low = Vdist_low + V_qs + Vdist_low_full = Vdist_low_full + V_qs + WAT_V + + ! We keep the full field (including cross flow components), done for outputs and VTK outputs + case (1) + Vdist_low = Vdist_low + V_qs + WAT_V + Vdist_low_full = Vdist_low_full + V_qs + WAT_V + + ! We project against the normal of the plane to remove the cross flow components + case (2) + C_rot(1,1) = Vamb_low(1) * Vamb_low(1) + C_rot(1,2) = Vamb_low(1) * Vamb_low(2) + C_rot(1,3) = Vamb_low(1) * Vamb_low(3) + + C_rot(2,1) = Vamb_low(2) * Vamb_low(1) + C_rot(2,2) = Vamb_low(2) * Vamb_low(2) + C_rot(2,3) = Vamb_low(2) * Vamb_low(3) + + C_rot(3,1) = Vamb_low(3) * Vamb_low(1) + C_rot(3,2) = Vamb_low(3) * Vamb_low(2) + C_rot(3,3) = Vamb_low(3) * Vamb_low(3) + + C_rot_norm = C_rot(1,1) + C_rot(2,2) + C_rot(3,3) + + if (.not. EqualRealNos(C_rot_norm, 0.0_SiKi)) then + C_rot = C_rot / C_rot_norm + ! Full field is for VTK outputs, contains the cross flow components + Vdist_low = Vdist_low + matmul(C_rot, V_qs + WAT_V) + Vdist_low_full = Vdist_low_full + V_qs + WAT_V + end if + end select + + ! Update disturbed velocity fields from local values + m%Vdist_low(:,ix,iy,iz) = Vdist_low + m%Vdist_low_full(:,ix,iy,iz) = Vdist_low_full + + end if ! (n_wake > 0) + end do ! iXYZ, loop NumGrid_low points + end do + + !---------------------------------------------------------------------------- + ! Calculate plane velocity vector + !---------------------------------------------------------------------------- + + ! Loop through turbines + do nt = 1, p%NumTurbines + + maxPln = NINT(u%NumPlanes(nt))-1 + + ! Loop through wake planes + do np = 0, maxPln - !!Defining yhat and zhat - xxplane = (/u%xhat_plane(1,np,nt), 0.0_ReKi, 0.0_ReKi/) - xyplane = (/0.0_ReKi, u%xhat_plane(1,np,nt), 0.0_ReKi/) - yyplane = (/0.0_ReKi, u%xhat_plane(2,np,nt), 0.0_ReKi/) - yxplane = (/u%xhat_plane(2,np,nt), 0.0_ReKi, 0.0_ReKi/) + ! Define yhat and zhat for this plane + xxplane = [u%xhat_plane(1,np,nt), 0.0_ReKi, 0.0_ReKi] + xyplane = [0.0_ReKi, u%xhat_plane(1,np,nt), 0.0_ReKi] + yyplane = [0.0_ReKi, u%xhat_plane(2,np,nt), 0.0_ReKi] + yxplane = [u%xhat_plane(2,np,nt), 0.0_ReKi, 0.0_ReKi] xyplane_norm = TwoNorm(xxplane+yyplane) - IF (EqualRealNos(xyplane_norm, 0.0_ReKi)) THEN ! This should only be true during the first call to AWAE_CalcOutput at model initialization + ! If xy-plane norm is zero, set turbine outputs to zero + ! This should only be true during the first call to AWAE_CalcOutput at model initialization + IF (EqualRealNos(xyplane_norm, 0.0_ReKi)) THEN y%Vx_wind_disk(nt) = 0.0_ReKi y%TI_amb( nt) = 0.0_ReKi y%V_plane(:,np,nt) = 0.0_ReKi - ELSE ! All subsequent calls to AWAE_CalcOutput - + ELSE ! All subsequent calls to AWAE_CalcOutput - xplane_sq = u%xhat_plane(1,np,nt)**2.0_ReKi - yplane_sq = u%xhat_plane(2,np,nt)**2.0_ReKi - xysq_Z = (/0.0_ReKi, 0.0_ReKi, xplane_sq+yplane_sq/) - xzplane_X = (/u%xhat_plane(1,np,nt)*u%xhat_plane(3,np,nt), 0.0_ReKi, 0.0_ReKi/) - yzplane_Y = (/0.0_ReKi, u%xhat_plane(2,np,nt)*u%xhat_plane(3,np,nt), 0.0_ReKi/) - yHat_plane = (xyplane-yxplane)/xyplane_norm - zHat_plane = (xysq_Z-xzplane_X-yzplane_Y)/xyplane_norm + xplane_sq = u%xhat_plane(1,np,nt)**2.0_ReKi + yplane_sq = u%xhat_plane(2,np,nt)**2.0_ReKi + xysq_Z = [0.0_ReKi, 0.0_ReKi, xplane_sq+yplane_sq] + xzplane_X = [u%xhat_plane(1,np,nt)*u%xhat_plane(3,np,nt), 0.0_ReKi, 0.0_ReKi] + yzplane_Y = [0.0_ReKi, u%xhat_plane(2,np,nt)*u%xhat_plane(3,np,nt), 0.0_ReKi] + yHat_plane = (xyplane-yxplane)/xyplane_norm + zHat_plane = (xysq_Z-xzplane_X-yzplane_Y)/xyplane_norm + !------------------------------------------------------------------- + ! Calculate y%Vx_wind_disk and y%TI_amb at the rotor disk + !------------------------------------------------------------------- - ! Calculate y%Vx_wind_disk and y%TI_amb at the rotor disk + ! If this is the first plane for the turbine + if (np == 0) then - if ( np == 0 ) then + m%V_amb_low_disk(1:3,nt) = 0.0_ReKi + iwsum = 0 + n_r_polar = FLOOR((p%C_Meander*u%D_wake(np,nt))/(2.0_ReKi*p%dpol)) - m%V_amb_low_disk(1:3,nt) = 0.0_ReKi - iwsum = 0 - n_r_polar = FLOOR((p%C_Meander*u%D_wake(np,nt))/(2.0_ReKi*p%dpol)) + do nr = 0,n_r_polar - do nr = 0,n_r_polar + r_polar = REAL(nr,ReKi)*p%dpol + n_psi_polar = MAX(CEILING(TwoPi*REAL(nr,ReKi))-1,0) - r_polar = REAL(nr,ReKi)*p%dpol - n_psi_polar = MAX(CEILING(TwoPi*REAL(nr,ReKi))-1,0) + do npsi = 0,n_psi_polar - do npsi = 0,n_psi_polar + psi_polar = (TwoPi*REAL(npsi,ReKi))/(REAL(n_psi_polar+1,ReKi)) + p_polar = u%p_plane(:,np,nt) + r_polar*COS(psi_polar)*yHat_plane + r_polar*SIN(psi_polar)*zHat_plane + Vamb_lowpol_tmp = INTERP3D(p_polar, p%LowRes%oXYZ, p%LowRes%dXYZ, m%Vamb_low, within, Vbox=Vamb_low_tmp) + if (within) then + m%V_amb_low_disk(1:3,nt) = m%V_amb_low_disk(1:3,nt) + Vamb_lowpol_tmp + do i = 1,8 + iwsum = iwsum + 1 + m%Vamb_lowpol(:,iwsum) = Vamb_low_tmp(:,i) + end do + end if - psi_polar = (TwoPi*REAL(npsi,ReKi))/(REAL(n_psi_polar+1,ReKi)) - p_polar = u%p_plane(:,np,nt) + r_polar*COS(psi_polar)*yHat_plane + r_polar*SIN(psi_polar)*zHat_plane - Vamb_lowpol_tmp = INTERP3D( p_polar, p%Grid_Low(:,1), p%dXYZ_Low, m%Vamb_low, within, p%nX_low, p%nY_low, p%nZ_low, Vbox=Vamb_low_tmp ) - if ( within ) then - m%V_amb_low_disk(1:3,nt) = m%V_amb_low_disk(1:3,nt) + Vamb_lowpol_tmp - do i = 1,8 - iwsum = iwsum + 1 - m%Vamb_lowpol(:,iwsum) = Vamb_low_tmp(:,i) - end do - end if + end do - end do - - end do + end do - if ( iwsum == 0 ) then + if ( iwsum == 0 ) then - call SetErrStat( ErrID_Fatal, 'The rotor plane for turbine '//trim(num2lstr(nt))//' has left the low-resolution domain (i.e., there are no points in the polar grid that lie within the low-resolution domain).', errStat, errMsg, RoutineName ) - return + call SetErrStat( ErrID_Fatal, 'The rotor plane for turbine '//trim(num2lstr(nt))//' has left the low-resolution domain (i.e., there are no points in the polar grid that lie within the low-resolution domain).', errStat, errMsg, RoutineName ) + return - else + else - m%V_amb_low_disk(1:3,nt) = m%V_amb_low_disk(1:3,nt)/REAL(iwsum/8,ReKi) ! iwsum is always a multiple of 8 - Vave_amb_low_norm = TwoNorm(m%V_amb_low_disk(1:3,nt)) - if ( EqualRealNos(Vave_amb_low_norm, 0.0_ReKi ) ) then - call SetErrStat( ErrID_Fatal, 'The magnitude of the spatial-averaged ambient wind speed in the low-resolution domain associated with the wake plane at the rotor disk for turbine #'//trim(num2lstr(nt))//' is zero.', errStat, errMsg, RoutineName ) - return - else - y%Vx_wind_disk(nt) = dot_product( u%xhat_plane(:,np,nt),m%V_amb_low_disk(1:3,nt) ) - y%TI_amb(nt) = 0.0_ReKi - do wamb = 1, iwsum - y%TI_amb(nt) = y%TI_amb(nt)+TwoNorm(m%Vamb_lowpol(:,wamb)-m%V_amb_low_disk(1:3,nt))**2.0_ReKi - end do !wamb - y%TI_amb(nt) = sqrt(y%TI_amb(nt)/(3.0_ReKi*REAL(iwsum,ReKi)))/Vave_amb_low_norm - end if !Vave_amb_low_norm + m%V_amb_low_disk(1:3,nt) = m%V_amb_low_disk(1:3,nt)/REAL(iwsum/8,ReKi) ! iwsum is always a multiple of 8 + Vave_amb_low_norm = TwoNorm(m%V_amb_low_disk(1:3,nt)) + if ( EqualRealNos(Vave_amb_low_norm, 0.0_ReKi ) ) then + call SetErrStat( ErrID_Fatal, 'The magnitude of the spatial-averaged ambient wind speed in the low-resolution domain associated with the wake plane at the rotor disk for turbine #'//trim(num2lstr(nt))//' is zero.', errStat, errMsg, RoutineName ) + return + else + y%Vx_wind_disk(nt) = dot_product( u%xhat_plane(:,np,nt),m%V_amb_low_disk(1:3,nt) ) + y%TI_amb(nt) = 0.0_ReKi + do wamb = 1, iwsum + y%TI_amb(nt) = y%TI_amb(nt)+TwoNorm(m%Vamb_lowpol(:,wamb)-m%V_amb_low_disk(1:3,nt))**2.0_ReKi + end do !wamb + y%TI_amb(nt) = sqrt(y%TI_amb(nt)/(3.0_ReKi*REAL(iwsum,ReKi)))/Vave_amb_low_norm + end if !Vave_amb_low_norm - end if + end if - end if + end if - ! Calculate y%V_plane + ! - no messages if inside bounds, so put error handling inside if + call PlaneOutOfDomain(u%D_wake(np,nt),u%p_plane(:,np,nt),y%V_plane(:,np,nt),m%planeDomainExit(np,nt),ErrStat2,ErrMsg2) + if (m%planeDomainExit(np,nt) /= 0_IntKi) then + call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + cycle + endif - y%V_plane(:,np,nt) = 0.0_ReKi - wsum_tmp = 0.0_ReKi - n_r_polar = FLOOR((p%C_ScaleDiam*u%D_wake(np,nt))/p%dpol) - ! if a wake plane exits domain, velocity is set differently, so skip remaining velocity logic after this - ! - no messages if inside bounds, so put error handling inside if - call PlaneOutOfDomain(u%D_wake(np,nt),u%p_plane(:,np,nt),y%V_plane(:,np,nt),m%planeDomainExit(np,nt),ErrStat2,ErrMsg2) - if (m%planeDomainExit(np,nt) /= 0_IntKi) then - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - cycle - endif + ! Calculate y%V_plane + y%V_plane(:,np,nt) = 0.0_ReKi + wsum_tmp = 0.0_ReKi + n_r_polar = FLOOR((p%C_ScaleDiam*u%D_wake(np,nt))/p%dpol) - do nr = 0, n_r_polar + do nr = 0, n_r_polar - r_polar = REAL(nr,ReKi)*p%dpol + r_polar = REAL(nr,ReKi)*p%dpol - select case ( p%Mod_Meander ) - case (MeanderMod_Uniform) - w = 1.0_ReKi - case (MeanderMod_TruncJinc) - w = jinc( r_polar/(p%C_Meander*u%D_wake(np,nt) ) ) - case (MeanderMod_WndwdJinc) - w = jinc( r_polar/(p%C_Meander*u%D_wake(np,nt) ) )*jinc( r_polar/(2.0_ReKi*p%C_Meander*u%D_wake(np,nt) ) ) - end select + select case ( p%Mod_Meander ) + case (MeanderMod_Uniform) + w = 1.0_ReKi + case (MeanderMod_TruncJinc) + w = jinc( r_polar/(p%C_Meander*u%D_wake(np,nt) ) ) + case (MeanderMod_WndwdJinc) + w = jinc( r_polar/(p%C_Meander*u%D_wake(np,nt) ) )*jinc( r_polar/(2.0_ReKi*p%C_Meander*u%D_wake(np,nt) ) ) + end select - n_psi_polar = MAX(CEILING(TwoPi*REAL(nr,ReKi))-1,0) + n_psi_polar = MAX(CEILING(TwoPi*REAL(nr,ReKi))-1,0) - do npsi = 0,n_psi_polar + do npsi = 0,n_psi_polar - psi_polar = (TwoPi*REAL(npsi,ReKi))/(REAL(n_psi_polar+1,ReKi)) - p_polar = u%p_plane(:,np,nt) + r_polar*COS(psi_polar)*yHat_plane + r_polar*SIN(psi_polar)*zHat_plane - Vdist_lowpol_tmp = INTERP3D( p_polar, p%Grid_Low(:,1), p%dXYZ_Low, m%Vdist_low, within, p%nX_low, p%nY_low, p%nZ_low ) - if ( within ) then - y%V_plane(:,np,nt) = y%V_plane(:,np,nt) + w*Vdist_lowpol_tmp - wsum_tmp = wsum_tmp + w - end if + psi_polar = (TwoPi*REAL(npsi,ReKi))/(REAL(n_psi_polar+1,ReKi)) + p_polar = u%p_plane(:,np,nt) + r_polar*COS(psi_polar)*yHat_plane + r_polar*SIN(psi_polar)*zHat_plane + Vdist_lowpol_tmp = INTERP3D(p_polar, p%LowRes%GridPoints(:,1), p%LowRes%dXYZ, m%Vdist_low, within) + if (within) then + y%V_plane(:,np,nt) = y%V_plane(:,np,nt) + w*Vdist_lowpol_tmp + wsum_tmp = wsum_tmp + w + end if - end do !npsi + end do !npsi - end do!nr + end do !nr - if ( EqualRealNos( wsum_tmp, 0.0_ReKi ) ) then - y%V_plane(:,np,nt) = 0.0_ReKi - else - y%V_plane(:,np,nt) = y%V_plane(:,np,nt)/wsum_tmp - end if + if ( EqualRealNos( wsum_tmp, 0.0_ReKi ) ) then + y%V_plane(:,np,nt) = 0.0_ReKi + else + y%V_plane(:,np,nt) = y%V_plane(:,np,nt)/wsum_tmp + end if end if - end do ! np, tmpPln end do ! nt, turbines - if (allocated(wk_R_p2i)) deallocate(wk_R_p2i) - if (allocated(wk_V)) deallocate(wk_V) - if (allocated(wk_WAT_k)) deallocate(wk_WAT_k) - contains + + logical function Failed() + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed !> Check if the center of this wwake plane has left the domain. !! If a plane exits the domain, or previously exited the domain: @@ -666,27 +907,27 @@ subroutine PlaneOutOfDomain(D_Wake,p_plane,V_plane,planeDomainExit,ErrStat3,ErrM ! Step 1: did a plane that was in the low res domain just cross out? ! If plane crossed boundary, set message and tracking of it if (planeDomainExit == 0_IntKi) then - if (p_plane(1) < p%Grid_Low(1,1) ) then ! lower x boundary + if (p_plane(1) < p%LowRes%oXYZ(1)) then ! lower x boundary ErrStat3 = ErrID_Warn tmpStr12 = 'lower-most X' planeDomainExit = -1 - elseif ( p_plane(1) > p%Grid_Low(1,p%NumGrid_low) ) then ! upper x boundary + elseif ( p_plane(1) > p%LowRes%oXYZ(1) + p%LowRes%Size(1)) then ! upper x boundary ErrStat3 = ErrID_Warn tmpStr12 = 'upper-most X' planeDomainExit = 1 - elseif ( p_plane(2) < p%Grid_Low(2,1) ) then ! lower y boundary + elseif ( p_plane(2) < p%LowRes%oXYZ(2)) then ! lower y boundary ErrStat3 = ErrID_Warn tmpStr12 = 'lower-most Y' planeDomainExit = -2 - elseif ( p_plane(2) > p%Grid_Low(2,p%NumGrid_low) ) then ! upper y boundary + elseif ( p_plane(2) > p%LowRes%oXYZ(2) + p%LowRes%Size(2)) then ! upper y boundary ErrStat3 = ErrID_Warn tmpStr12 = 'upper-most Y' planeDomainExit = 2 - elseif ( p_plane(3) < p%Grid_Low(3,1) ) then ! lower z boundary + elseif ( p_plane(3) < p%LowRes%oXYZ(3)) then ! lower z boundary ErrStat3 = ErrID_Warn tmpStr12 = 'lower-most Z' planeDomainExit = -3 - elseif ( p_plane(3) > p%Grid_Low(3,p%NumGrid_low) ) then ! upper z boundary + elseif ( p_plane(3) > p%LowRes%oXYZ(3) + p%LowRes%Size(3)) then ! upper z boundary ErrStat3 = ErrID_Warn tmpStr12 = 'upper-most Z' planeDomainExit = 3 @@ -705,22 +946,22 @@ subroutine PlaneOutOfDomain(D_Wake,p_plane,V_plane,planeDomainExit,ErrStat3,ErrM case (0_IntKi) return case (-1_IntKi) ! Crossed -X - D_tgt = p%Grid_Low(1,1) - D_wake + D_tgt = p%LowRes%oXYZ(1) - D_wake V_plane(1) = (D_tgt - p_plane(1)) / (2.0_ReKi * real(p%dt_low,ReKi)) ! push towards (-X_bound - D_wake) case ( 1_IntKi) ! Crossed +X - D_tgt = p%Grid_Low(1,p%NumGrid_low) + D_wake + D_tgt = p%LowRes%oXYZ(1) + p%LowRes%Size(1) + D_wake V_plane(1) = (D_tgt - p_plane(1)) / (2.0_ReKi * real(p%dt_low,ReKi)) ! push towards (+X_bound + D_wake) case (-2_IntKi) ! Crossed -Y - D_tgt = p%Grid_Low(2,1) - D_wake + D_tgt = p%LowRes%oXYZ(2) - D_wake V_plane(2) = (D_tgt - p_plane(2)) / (2.0_ReKi * real(p%dt_low,ReKi)) ! push towards (-Y_bound - D_wake) case ( 2_IntKi) ! Crossed +Y - D_tgt = p%Grid_Low(2,p%NumGrid_low) + D_wake + D_tgt = p%LowRes%oXYZ(2) + p%LowRes%Size(2) + D_wake V_plane(2) = (D_tgt - p_plane(2)) / (2.0_ReKi * real(p%dt_low,ReKi)) ! push towards (-Y_bound - D_wake) case (-3_IntKi) ! Crossed -Z - D_tgt = p%Grid_Low(3,1) - D_wake + D_tgt = p%LowRes%oXYZ(3) - D_wake V_plane(3) = (D_tgt - p_plane(3)) / (2.0_ReKi * real(p%dt_low,ReKi)) ! push towards (-Z_bound - D_wake) case ( 3_IntKi) ! Crossed +Z - D_tgt = p%Grid_Low(3,p%NumGrid_low) + D_wake + D_tgt = p%LowRes%oXYZ(3) + p%LowRes%Size(3) + D_wake V_plane(3) = (D_tgt - p_plane(3)) / (2.0_ReKi * real(p%dt_low,ReKi)) ! push towards (+Z_bound + D_wake) end select @@ -745,7 +986,10 @@ subroutine HighResGridCalcOutput(n, u, p, xd, y, m, errStat, errMsg) integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None - integer(IntKi) :: nt, nt2, np, ix, iy, iz, i_hl !< loop counters + character(*), parameter :: RoutineName = 'HighResGridCalcOutput' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen):: ErrMsg2 + integer(IntKi) :: t_dst, t_src, np, ix, iy, iz, i_hl !< loop counters integer(IntKi) :: n_wake !< accumulating counters real(SiKi) :: V_qs(3) ! Quasi-steady wake deficit , after wake-intersection averaging (without WAT) real(ReKi) :: WAT_k ! WAT scaling factor (averaged from overlapping wakes) @@ -755,6 +999,7 @@ subroutine HighResGridCalcOutput(n, u, p, xd, y, m, errStat, errMsg) real(ReKi), allocatable :: wk_R_p2i(:,:,:)!< Orientations from plane to inertial for each wake, shape: 3x3xnWake real(ReKi), allocatable :: wk_V(:,:) !< Wake velocity from each overlapping wake, shape: 3xnWake real(ReKi), allocatable :: wk_WAT_k(:) !< WAT scaling factors for all wakes (for overlap) + real(ReKi) :: MaxWakeRadius ! maximum wake radius integer(IntKi) :: np1 integer(IntKi) :: iXYZ !< Flat counter on X,Y,Z high res grid integer(IntKi) :: maxPln @@ -762,13 +1007,13 @@ subroutine HighResGridCalcOutput(n, u, p, xd, y, m, errStat, errMsg) integer(IntKi) :: NumGrid_high !< number of points in high res grid grid integer(IntKi) :: n_high_low_p1 integer(IntKi) :: WAT_iT,WAT_iY,WAT_iZ !< indexes for WAT point (Time interchangeable with X) - integer(IntKi) :: errStat2 - character(*), parameter :: RoutineName = 'HighResGridCalcOutput' + real(ReKi) :: search_radius ! radius to search for wakes interacting with grid + integer(IntKi) :: n_wake_found + integer(IntKi) :: i, j + errStat = ErrID_None errMsg = "" - maxPln = min(n,p%NumPlanes-2) - ! We only need one high res file for that last simulation time if ( (n/p%n_high_low) == (p%NumDT-1) ) then n_high_low_p1 = 1 @@ -776,20 +1021,25 @@ subroutine HighResGridCalcOutput(n, u, p, xd, y, m, errStat, errMsg) n_high_low_p1 = p%n_high_low_p1 end if - maxN_wake = p%NumTurbines*( p%NumPlanes-1 ) + ! Maximum number of wake points + maxN_wake = p%NumTurbines*( p%MaxPlanes-1 ) + ! Variables stored for each wake crossing at a given point - allocate ( wk_R_p2i (3, 3, 1:maxN_wake ), STAT=errStat2 ); if (errStat2 /= 0) call SetErrStat ( ErrID_Fatal, 'Could not allocate memory for wk_R_p2i.', errStat, errMsg, RoutineName ) - allocate ( wk_V ( 3, 1:maxN_wake ), STAT=errStat2 ); if (errStat2 /= 0) call SetErrStat ( ErrID_Fatal, 'Could not allocate memory for wk_V.', errStat, errMsg, RoutineName ) - allocate ( wk_WAT_k ( 1:maxN_wake ), STAT=errStat2 ); if (errStat2 /= 0) call SetErrStat ( ErrID_Fatal, 'Could not allocate memory for wk_WAT_k.', errStat, errMsg, RoutineName ) + call AllocAry(wk_R_p2i, 3, 3, maxN_wake, "wk_R_p2i", errStat2, errMsg2); if (Failed()) return + call AllocAry(wk_V, 3, maxN_wake, "wk_V", errStat2, errMsg2); if (Failed()) return + call AllocAry(wk_WAT_k, maxN_wake, "wk_WAT_k", errStat2, errMsg2); if (Failed()) return if (ErrStat >= AbortErrLev) return ! Convect WAT Box tracer for each intermediate step ! Note: we substract because the high-res points are "before" current low res point if (p%WAT_Enabled) then - allocate ( WAT_B_BoxHi ( 3, 0:n_high_low_p1), STAT=errStat2 ); if (errStat2 /= 0) call SetErrStat ( ErrID_Fatal, 'Could not allocate memory for WAT_B_BoxHi.', errStat, errMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return - do i_hl=0, n_high_low_p1 - WAT_B_BoxHi(1:3, i_hl) = xd%WAT_B_Box(1:3) - (n_high_low_p1-i_hl) * xd%Ufarm(1:3) * real(p%DT_high,ReKi) + allocate(WAT_B_BoxHi(3, 0:n_high_low_p1), STAT=errStat2) + if (errStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate memory for WAT_B_BoxHi.', errStat, errMsg, RoutineName) + return + endif + do i_hl = 0, n_high_low_p1 + WAT_B_BoxHi(:, i_hl) = xd%WAT_B_Box - (n_high_low_p1-i_hl) * xd%Ufarm * real(p%DT_high,ReKi) enddo endif @@ -805,70 +1055,96 @@ subroutine HighResGridCalcOutput(n, u, p, xd, y, m, errStat, errMsg) ! maxN_wake * 13 * OMP_NUM_THREADS * = size in bytes ! HOWEVER, real world testing shows that for 103 threads with 114 turbines and maxN_wake=101346 is more like ! maxN_wake * 40 * = size in bytes - NumGrid_high = p%nX_high*p%nY_high*p%nZ_high - do nt = 1,p%NumTurbines + !---------------------------------------------------------------------------- + ! Add wake contribution to each destination turbine's high-res inflow grid + !---------------------------------------------------------------------------- + + ! Loop through turbines where wake interaction is possible + !$OMP parallel do default(none) & + !$OMP shared(p, m, u, y, n_high_low_p1, WAT_B_BoxHi) & + !$OMP private(maxPln, t_dst, iXYZ, ix, iy, iz, t_src, n_wake, V_qs, WAT_k, WAT_V, & + !$OMP wk_R_p2i, wk_V, wk_WAT_k, i_hl, Pos_global, wat_iT, WAT_iY, WAT_iZ) + do t_dst = 1, p%NumTurbines + ! set the disturbed flow equal to the ambient flow for this time step - y%Vdist_high(nt)%data = m%Vamb_high(nt)%data - - !$OMP PARALLEL DO DEFAULT(NONE) & - !$OMP PRIVATE (iXYZ, ix, iy, iz, n_wake, nt2, np,& - !$OMP& wk_R_p2i, wk_V, & - !$OMP& V_qs, & - !$OMP& i_hl, Pos_global,& - !$OMP& wk_WAT_k, WAT_k, WAT_iT, WAT_iY, WAT_iZ, WAT_V)& - !$OMP SHARED(NumGrid_High, m, u, p, y, xd, nt, maxPln, n_high_low_p1, WAT_B_BoxHi, errStat, errMsg) + y%Vdist_high(t_dst)%data = m%Vamb_high(t_dst)%data + + ! If no wake planes interact with the destination turbine's grid, continue + if (all(m%iPlaneTurbTurb(1, :, t_dst) == -1)) cycle + ! Loop over all points of the high resolution ambient wind - do iXYZ=1, NumGrid_high + do iXYZ = 1, p%HighRes(t_dst)%nPoints + ! From flat index iXYZ to grid indices - ix = mod( (iXYZ-1) ,p%nX_high) - iy = mod(int( (iXYZ-1) / (p%nX_high ) ),p%nY_high) - iz = int( (iXYZ-1) / (p%nX_high*p%nY_high) ) + ix = mod( (iXYZ-1), p%HighRes(t_dst)%nXYZ(1)) + iy = mod(int( (iXYZ-1) / (p%HighRes(t_dst)%nXYZ(1)) ),p%HighRes(t_dst)%nXYZ(2)) + iz = int( (iXYZ-1) / (p%HighRes(t_dst)%nXYZ(1)*p%HighRes(t_dst)%nXYZ(2)) ) ! --- Compute variables wk_* (e.g. velocity) from each wakes reaching the current grid point n_wake = 0 ! cumulative index, increases if point is at intersection of multiple wakes - do nt2 = 1,p%NumTurbines - if (nt /= nt2) then - call interp_planes_2_point(u, p, m, p%Grid_high(:,iXYZ,nt), nt2, maxPln, & ! In - n_wake, wk_R_p2i, wk_V, wk_WAT_k ) ! InOut - end if ! nt /= nt2 - end do ! nt2 = 1,p%NumTurbines - if (n_wake > 0) then - ! --- Compute merged wake velocity V_qs - call mergeWakeVel(n_wake, wk_V, wk_R_p2i, V_qs) - ! --- Compute average WAT scaling factor and WAT velocity - if (p%WAT_Enabled) then - call mergeWakeWAT_k(n_wake, wk_WAT_k, WAT_k) - ! Position of current grid point - Pos_global(1) = real(ix,ReKi) * p%dX_high(nt) + p%X0_high(nt) - Pos_global(2) = real(iy,ReKi) * p%dY_high(nt) + p%Y0_high(nt) - Pos_global(3) = real(iz,ReKi) * p%dZ_high(nt) + p%Z0_high(nt) - else - WAT_V = 0.0_SiKi - endif + ! Loop through source turbines + do t_src = 1,p%NumTurbines + + ! If source turbine doesn't have any interacting planes, skip + if (m%iPlaneTurbTurb(1, t_src, t_dst) == -1) cycle + + maxPln = NINT(u%NumPlanes(t_src)) - 2 + + ! Sum wake interactions from turbine at this point + call interp_planes_2_point(u, p, m, p%HighRes(t_dst)%GridPoints(:,iXYZ), t_src, maxPln, & ! In + n_wake, wk_R_p2i, wk_V, wk_WAT_k, & ! InOut + start_plane=m%iPlaneTurbTurb(1, t_src, t_dst), & ! Start plane index + end_plane=m%iPlaneTurbTurb(2, t_src, t_dst)) ! End plane index + end do + + ! If no wake interaction found for this point, go to next point + if (n_wake == 0) cycle + + ! Compute merged wake velocity V_qs + call mergeWakeVel(n_wake, wk_V, wk_R_p2i, V_qs) + + ! Compute average WAT scaling factor and WAT velocity + if (p%WAT_Enabled) then - ! --- Store full velocity (Ambient + Wake QS + WAT) in grid + ! Compute average WAT scaling factor + call mergeWakeWAT_k(n_wake, wk_WAT_k, WAT_k) + + ! Position of current grid point + Pos_global = p%HighRes(t_dst)%GridPoints(:,iXYZ) + + ! Loop through time slices do i_hl=0, n_high_low_p1 + + ! find location of grid point in the turbulent box, accounting for the convection of the box in between high res and low res + WAT_iT = modulo( nint((Pos_global(1) - WAT_B_BoxHi(1, i_hl)) * p%WAT_FlowField%Grid3D%Rate ), p%WAT_FlowField%Grid3D%NSteps ) + 1 ! eq 23 + WAT_iY = modulo( nint((Pos_global(2) + WAT_B_BoxHi(2, i_hl)) * p%WAT_FlowField%Grid3D%InvDY ), p%WAT_FlowField%Grid3D%NYGrids) + 1 ! eq 24 + WAT_iZ = modulo( nint((Pos_global(3) + WAT_B_BoxHi(3, i_hl)) * p%WAT_FlowField%Grid3D%InvDZ ), p%WAT_FlowField%Grid3D%NZGrids) + 1 ! eq 25 + ! Compute WAT velocity - if (p%WAT_Enabled) then - ! find location of grid point in the turbulent box, accounting for the convection of the box in between high res and low res - WAT_iT = modulo( nint( (Pos_global(1) - WAT_B_BoxHi(1, i_hl)) * p%WAT_FlowField%Grid3D%Rate ), p%WAT_FlowField%Grid3D%NSteps ) + 1 ! eq 23 - WAT_iY = modulo( nint( (Pos_global(2) + WAT_B_BoxHi(2, i_hl)) * p%WAT_FlowField%Grid3D%InvDY ), p%WAT_FlowField%Grid3D%NYGrids) + 1 ! eq 24 - WAT_iZ = modulo( nint( (Pos_global(3) + WAT_B_BoxHi(3, i_hl)) * p%WAT_FlowField%Grid3D%InvDZ ), p%WAT_FlowField%Grid3D%NZGrids) + 1 ! eq 25 - WAT_V(1:3) = p%WAT_FlowField%Grid3D%Vel(1:3,WAT_iY,WAT_iZ,WAT_iT) * WAT_k - endif - y%Vdist_high(nt)%data(:,ix,iy,iz,i_hl) = y%Vdist_high(nt)%data(:,ix,iy,iz,i_hl) + V_qs + WAT_V + WAT_V(1:3) = p%WAT_FlowField%Grid3D%Vel(1:3,WAT_iY,WAT_iZ,WAT_iT) * WAT_k + + ! Add Wake and WAT contribution to the high-resolution grid + y%Vdist_high(t_dst)%data(:,ix,iy,iz,i_hl) = y%Vdist_high(t_dst)%data(:,ix,iy,iz,i_hl) + V_qs + WAT_V end do - end if ! (n_wake > 0) + + else + + ! Loop through time slices and add wake contribution to the high-resolution grid + do i_hl=0, n_high_low_p1 + y%Vdist_high(t_dst)%data(:,ix,iy,iz,i_hl) = y%Vdist_high(t_dst)%data(:,ix,iy,iz,i_hl) + V_qs + end do + end if end do ! iXYZ=0,NumGrid_high-1 - !$OMP END PARALLEL DO end do ! nt = 1,p%NumTurbines - if (allocated(wk_R_p2i)) deallocate(wk_R_p2i) - if (allocated(wk_V)) deallocate(wk_V) - if (allocated(wk_WAT_k)) deallocate(wk_WAT_k) - if (allocated(WAT_B_BoxHi)) deallocate(WAT_B_BoxHi) +contains + + logical function Failed() + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed end subroutine HighResGridCalcOutput @@ -897,13 +1173,18 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None character(1024) :: rootDir, baseName, OutFileVTKDir ! Simulation root dir, basename for outputs - integer(IntKi) :: i,j,nt ! loop counter + integer(IntKi) :: i,j,nt,c ! loop counter real(ReKi) :: gridLoc ! Location of requested output slice in grid coordinates [0,sz-1] integer(IntKi) :: errStat2 ! temporary error status of the operation character(ErrMsgLen) :: errMsg2 ! temporary error message character(*), parameter :: RoutineName = 'AWAE_Init' type(InflowWind_InitInputType) :: IfW_InitInp type(InflowWind_InitOutputType) :: IfW_InitOut + type(InflowWind_ContinuousStateType) :: IfW_x + type(InflowWind_DiscreteStateType) :: IfW_xd + type(InflowWind_OtherStateType) :: IfW_OtherState + type(InflowWind_ConstraintStateType) :: IfW_z + type(InflowWind_MiscVarType) :: IfW_m ! Initialize variables for this routine errStat = ErrID_None @@ -919,15 +1200,16 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO ! Validate the initialization inputs call ValidateInitInputData( InitInp%InputFileData, ErrStat2, ErrMsg2 ); if(Failed()) return; - ! -------------------------------------------------------------------------------- - ! --- Initialize parameters - ! -------------------------------------------------------------------------------- + !---------------------------------------------------------------------------- + ! Initialize parameters + !---------------------------------------------------------------------------- + p%Mod_AmbWind = InitInp%InputFileData%Mod_AmbWind p%dt_high = InitInp%InputFileData%dt_high p%dt_low = InitInp%InputFileData%dt_low - p%NumPlanes = InitInp%InputFileData%NumPlanes p%NumRadii = InitInp%InputFileData%NumRadii p%NumTurbines = InitInp%InputFileData%NumTurbines + p%MaxPlanes = InitInp%MaxPlanes p%WindFilePath = InitInp%InputFileData%WindFilePath ! TODO: Make sure this wasn't specified with the trailing folder separator. Note: on Windows a trailing / or \ causes no problem! GJH p%n_high_low = InitInp%n_high_low ! number of timesteps between low res steps p%n_high_low_p1 = InitInp%n_high_low + 1 ! include a time slice at t_low-DT_high (for interpolation in AeroDyn -- this is a hack) @@ -940,6 +1222,12 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO p%Mod_Meander = InitInp%InputFileData%Mod_Meander p%C_Meander = InitInp%InputFileData%C_Meander p%Mod_Projection = InitInp%InputFileData%Mod_Projection + + ! AMReX Wind Parameters + p%DirStartIndex = InitInp%InputFileData%DirStartIndex + p%DirIndexLen = len_trim(InitInp%InputFileData%DirStartIndex) + read(p%DirStartIndex, *) p%DirStartNum + ! Wake Added Turbulence (WAT) Parameters p%WAT_Enabled = InitInp%WAT_Enabled if (p%WAT_Enabled) then @@ -983,25 +1271,23 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO p%z(i) = InitInp%InputFileData%dr*i end do - allocate( p%WT_Position(3,p%NumTurbines),stat=errStat2); if (Failed0('Could not allocate memory for p%WT_Position.')) return; - p%WT_Position = InitInp%InputFileData%WT_Position - - - - ! Obtain the precursor grid information by parsing the necessary input files - ! This will establish certain parameters as well as all of the initialization outputs - ! Sets: - ! Parameters: nX_low, nY_low, nZ_low, nX_high, nY_high, nZ_high, Grid_low, - ! Grid_high, n_high_low_p1, n_rp_max - ! InitOutput: X0_high, Y0_high, Z0_high, dX_high, dY_high, dZ_high, nX_high, nY_high, nZ_high + ! Obtain the precursor grid information by parsing the necessary input files + ! This will establish certain parameters as well as all of the initialization outputs + ! Populates p%LowRes and p%HighRes grid information call AWAE_IO_InitGridInfo(InitInp, p, InitOut, errStat2, errMsg2); if(Failed()) return; ! -------------------------------------------------------------------------------- ! --- Initialize states ! -------------------------------------------------------------------------------- + + allocate(m%u_IfW_High(p%NumTurbines), stat=errStat2); if (Failed0('InflowWind input data')) return; + allocate(m%y_IfW_High(p%NumTurbines), stat=errStat2); if (Failed0('InflowWind output data')) return; + ! initialize tracer for WAT box location xd%WAT_B_Box(1:3) = 0.0_ReKi - if ( p%Mod_AmbWind > 1 ) then + + if (p%Mod_AmbWind > 1) then + ! Using InflowWind, so initialize that module now IfW_InitInp%Linearize = .false. IfW_InitInp%RootName = TRIM(p%OutFileRoot)//'.IfW' @@ -1013,88 +1299,81 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO IfW_InitInp%WtrDpth = 0.0_ReKi IfW_InitInp%MSL2SWL = 0.0_ReKi - if ( p%Mod_AmbWind == 2 ) then ! one InflowWind module + if (p%Mod_AmbWind == 2) then ! one InflowWind module - ALLOCATE(p%IfW( 0:0),STAT=ErrStat2); if (Failed0('InflowWind parameter data' )) return; - ALLOCATE(x%IfW( 0:0),STAT=ErrStat2); if (Failed0('InflowWind continuous states data')) return; - ALLOCATE(xd%IfW( 0:0),STAT=ErrStat2); if (Failed0('InflowWind discrete states data' )) return; - ALLOCATE(z%IfW( 0:0),STAT=ErrStat2); if (Failed0('InflowWind constraint states data')) return; - ALLOCATE(OtherState%IfW(0:0),STAT=ErrStat2); if (Failed0('InflowWind other states data' )) return; - ALLOCATE(m%IfW( 0:0),STAT=ErrStat2); if (Failed0('InflowWind miscvar data' )) return; + allocate(p%IfW(0:0), stat=ErrStat2); if (Failed0('InflowWind parameter data')) return; ! Initialize InflowWind IfW_InitInp%FixedWindFileRootName = .false. - IfW_InitInp%NumWindPoints = p%NumGrid_low - IfW_InitInp%RadAvg = 0.25 * p%nZ_low * p%dX_low ! arbitrary garbage, just must be bigger than zero, but not bigger than grid (IfW will complain if this isn't set when it tries to calculate disk average vel) - IfW_InitInp%MHK = 0 ! not an MHK turbine setup + IfW_InitInp%NumWindPoints = p%LowRes%nPoints + IfW_InitInp%RadAvg = 0.25 * p%LowRes%nXYZ(3) * p%LowRes%dXYZ(1) ! arbitrary garbage, just must be bigger than zero, but not bigger than grid (IfW will complain if this isn't set when it tries to calculate disk average vel) - call InflowWind_Init( IfW_InitInp, m%u_IfW_Low, p%IfW(0), x%IfW(0), xd%IfW(0), z%IfW(0), OtherState%IfW(0), m%y_IfW_Low, m%IfW(0), Interval, IfW_InitOut, ErrStat2, ErrMsg2 ); if(Failed()) return; - p%IfW(0)%NumOuts = 0 ! override outputs that might be in the input file + call InflowWind_Init(IfW_InitInp, m%u_IfW_Low, p%IfW(0), IfW_x, IfW_xd, IfW_z, IfW_OtherState, & + m%y_IfW_Low, IfW_m, Interval, IfW_InitOut, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Initialize InflowWind input/output for each high-resolution domain + do nt = 1,p%NumTurbines + call AllocAry(m%u_IfW_High(nt)%PositionXYZ, 3, p%HighRes(nt)%nPoints, "m%u_IfW_High(nt)%PositionXYZ", errStat2, errMsg2); if (Failed()) return + call AllocAry(m%y_IfW_High(nt)%VelocityUVW, 3, p%HighRes(nt)%nPoints, "m%y_IfW_High(nt)%VelocityUVW", errStat2, errMsg2); if (Failed()) return + m%u_IfW_High(nt)%PositionXYZ = p%HighRes(nt)%GridPoints + end do - else if ( p%Mod_AmbWind == 3 ) then ! multiple InflowWind modules + else if (p%Mod_AmbWind == 3) then ! multiple InflowWind modules - ALLOCATE(p%IfW( 0:p%NumTurbines),STAT=ErrStat2); if (Failed0('InflowWind parameter data' )) return; - ALLOCATE(x%IfW( 0:p%NumTurbines),STAT=ErrStat2); if (Failed0('InflowWind continuous states data')) return; - ALLOCATE(xd%IfW( 0:p%NumTurbines),STAT=ErrStat2); if (Failed0('InflowWind discrete states data' )) return; - ALLOCATE(z%IfW( 0:p%NumTurbines),STAT=ErrStat2); if (Failed0('InflowWind constraint states data')) return; - ALLOCATE(OtherState%IfW(0:p%NumTurbines),STAT=ErrStat2); if (Failed0('InflowWind other states data' )) return; - ALLOCATE(m%IfW( 0:p%NumTurbines),STAT=ErrStat2); if (Failed0('InflowWind miscvar data' )) return; + allocate(p%IfW(0:p%NumTurbines), stat=ErrStat2); if (Failed0('InflowWind parameter data')) return; ! Initialize InflowWind for the low-resolution domain IfW_InitInp%FixedWindFileRootName = .true. - IfW_InitInp%NumWindPoints = p%NumGrid_low + IfW_InitInp%NumWindPoints = p%LowRes%nPoints IfW_InitInp%TurbineID = 0 IfW_InitInp%MHK = MHK_None - call InflowWind_Init( IfW_InitInp, m%u_IfW_Low, p%IfW(0), x%IfW(0), xd%IfW(0), z%IfW(0), OtherState%IfW(0), m%y_IfW_Low, m%IfW(0), Interval, IfW_InitOut, ErrStat2, ErrMsg2 ); if(Failed()) return; - p%IfW(0)%NumOuts = 0 ! override outputs that might be in the input file + call InflowWind_Init(IfW_InitInp, m%u_IfW_Low, p%IfW(0), IfW_x, IfW_xd, IfW_z, IfW_OtherState, & + m%y_IfW_Low, IfW_m, Interval, IfW_InitOut, ErrStat2, ErrMsg2) + if (Failed()) return ! Initialize InflowWind for each high-resolution domain - IfW_InitInp%NumWindPoints = p%nX_high*p%nY_high*p%nZ_high do nt = 1,p%NumTurbines - IfW_InitInp%TurbineID = nt - call InflowWind_Init( IfW_InitInp, m%u_IfW_High, p%IfW(nt), x%IfW(nt), xd%IfW(nt), z%IfW(nt), OtherState%IfW(nt), m%y_IfW_High, m%IfW(nt), Interval, IfW_InitOut, ErrStat2, ErrMsg2 ); if(Failed()) return; - p%IfW(nt)%NumOuts = 0 ! override outputs that might be in the input file + + ! Destroy any previous data in types used only for initialization + call InflowWind_DestroyContState(IfW_x, errStat2, errMsg2) + call InflowWind_DestroyDiscState(IfW_xd, errStat2, errMsg2) + call InflowWind_DestroyOtherState(IfW_OtherState, errStat2, errMsg2) + call InflowWind_DestroyConstrState(IfW_z, errStat2, errMsg2) + call InflowWind_DestroyMisc(IfW_m, errStat2, errMsg2) + + ! Update initialization inputs for this turbine + IfW_InitInp%TurbineID = nt + IfW_InitInp%NumWindPoints = p%HighRes(nt)%nPoints + + call InflowWind_Init(IfW_InitInp, m%u_IfW_High(nt), p%IfW(nt), IfW_x, IfW_xd, IfW_z, IfW_OtherState, & + m%y_IfW_High(nt), IfW_m, Interval, IfW_InitOut, ErrStat2, ErrMsg2) + if (Failed()) return ! Check that the high resolution grid placement is correct ! The InflowWind grid location is exactly centered on the TurbPos location in the Y direction. The high resolution grid ! must exactly match the sizing and location of the InflowWind grid. We are only going to check the Y and Z locations ! for now and throw an error if these don't match appropriately. - call CheckModAmb3Boundaries() + call CheckModAmb3Boundaries(); if (Failed()) return - end do - if (errStat >= AbortErrLev) return + ! Set the position of the high-resolution grid points relative to the turbine position + do c = 1, p%HighRes(nt)%nPoints + m%u_IfW_High(nt)%PositionXYZ(:,c) = p%HighRes(nt)%GridPoints(:,c) - p%HighRes(nt)%WT_Position + end do + end do end if - ! Set the position inputs once for the low-resolution grid - m%u_IfW_Low%PositionXYZ = p%Grid_low - ! Set the hub position and orientation to pass to IfW (FIXME: IfW always calculates hub and disk avg vel. Change this after IfW pointers fully enabled.) - m%u_IfW_Low%HubPosition = (/ p%X0_low + 0.5*p%nX_low*p%dX_low, p%Y0_low + 0.5*p%nY_low*p%dY_low, p%Z0_low + 0.5*p%nZ_low*p%dZ_low /) - call Eye(m%u_IfW_Low%HubOrientation,ErrStat2,ErrMsg2) - - ! Initialize the high-resolution grid inputs and outputs - IF ( .NOT. ALLOCATED( m%u_IfW_High%PositionXYZ ) ) THEN - call AllocAry(m%u_IfW_High%PositionXYZ, 3, p%nX_high*p%nY_high*p%nZ_high, 'm%u_IfW_High%PositionXYZ', ErrStat2, ErrMsg2); if(Failed()) return; - call AllocAry(m%y_IfW_High%VelocityUVW, 3, p%nX_high*p%nY_high*p%nZ_high, 'm%y_IfW_High%VelocityUVW', ErrStat2, ErrMsg2); if(Failed()) return; - call AllocAry(m%y_IfW_High%WriteOutput, size(m%y_IfW_Low%WriteOutput), 'm%y_IfW_High%WriteOutput', ErrStat2, ErrMsg2); if(Failed()) return; - if (allocated(m%y_IfW_Low%lidar%LidSpeed)) then - call AllocAry(m%y_IfW_High%lidar%LidSpeed, size(m%y_IfW_Low%lidar%LidSpeed ), 'm%y_IfW_High%lidar%LidSpeed', ErrStat2, ErrMsg2); if(Failed()) return; - endif - if (allocated(m%y_IfW_High%lidar%MsrPositionsX)) then - call AllocAry(m%y_IfW_High%lidar%MsrPositionsX, size(m%y_IfW_High%lidar%MsrPositionsX), 'm%y_IfW_High%lidar%MsrPositionsX', ErrStat2, ErrMsg2); if(Failed()) return; - endif - if (allocated(m%y_IfW_High%lidar%MsrPositionsY)) then - call AllocAry(m%y_IfW_High%lidar%MsrPositionsY, size(m%y_IfW_High%lidar%MsrPositionsY), 'm%y_IfW_High%lidar%MsrPositionsY', ErrStat2, ErrMsg2); if(Failed()) return; - endif - if (allocated(m%y_IfW_High%lidar%MsrPositionsZ)) then - call AllocAry(m%y_IfW_High%lidar%MsrPositionsZ, size(m%y_IfW_High%lidar%MsrPositionsZ), 'm%y_IfW_High%lidar%MsrPositionsZ', ErrStat2, ErrMsg2); if(Failed()) return; - endif + ! Set the position inputs once for the low-resolution grid + m%u_IfW_Low%PositionXYZ = p%LowRes%GridPoints - END IF - if (ErrStat >= AbortErrLev) then - return - end if + ! Destroy any previous data in types used only for initialization + call InflowWind_DestroyInitInput(IfW_InitInp, errStat2, errMsg2) + call InflowWind_DestroyInitOutput(IfW_InitOut, errStat2, errMsg2) + call InflowWind_DestroyContState(IfW_x, errStat2, errMsg2) + call InflowWind_DestroyDiscState(IfW_xd, errStat2, errMsg2) + call InflowWind_DestroyMisc(IfW_m, errStat2, errMsg2) end if @@ -1102,11 +1381,11 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO ! Test the request output wind locations against grid information ! XY plane slices - call AllocAry(p%OutDisWindZvalid,p%NOutDisWindXY,'p%OutDisWindZvalid', ErrStat2, ErrMsg2); if(Failed()) return; + call AllocAry(p%OutDisWindZvalid, p%NOutDisWindXY, 'p%OutDisWindZvalid', ErrStat2, ErrMsg2); if(Failed()) return; p%OutDisWindZvalid = .true. do i = 1,p%NOutDisWindXY - gridLoc = (p%OutDisWindZ(i) - p%Z0_low) / p%dZ_low - if ( ( gridLoc < 0.0_ReKi ) .or. ( gridLoc > real(p%nZ_low-1, ReKi) ) ) then + gridLoc = (p%OutDisWindZ(i) - p%LowRes%oXYZ(3)) / p%LowRes%dXYZ(3) + if ( ( gridLoc < 0.0_ReKi ) .or. ( gridLoc > real(p%LowRes%nXYZ(3)-1, ReKi) ) ) then call SetErrStat(ErrID_Warn, "The requested low-resolution XY output slice location, Z="//TRIM(Num2LStr(p%OutDisWindZ(i)))//", is outside of the low-resolution grid. Ignoring this slice.", errStat, errMsg, RoutineName ) p%OutDisWindZvalid(i) = .false. end if @@ -1116,8 +1395,8 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO call AllocAry(p%OutDisWindYvalid,p%NOutDisWindXZ,'p%OutDisWindYvalid', ErrStat2, ErrMsg2); if(Failed()) return; p%OutDisWindYvalid = .true. do i = 1,p%NOutDisWindXZ - gridLoc = (p%OutDisWindY(i) - p%Y0_low) / p%dY_low - if ( ( gridLoc < 0.0_ReKi ) .or. ( gridLoc > real(p%nY_low-1, ReKi) ) ) then + gridLoc = (p%OutDisWindY(i) - p%LowRes%oXYZ(2)) / p%LowRes%dXYZ(2) + if ( ( gridLoc < 0.0_ReKi ) .or. ( gridLoc > real(p%LowRes%nXYZ(2)-1, ReKi) ) ) then call SetErrStat(ErrID_Warn, "The requested low-resolution XZ output slice location, Y="//TRIM(Num2LStr(p%OutDisWindY(i)))//", is outside of the low-resolution grid. Ignoring this slice.", errStat, errMsg, RoutineName ) p%OutDisWindYvalid(i) = .false. end if @@ -1127,8 +1406,8 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO call AllocAry(p%OutDisWindXvalid,p%NOutDisWindYZ,'p%OutDisWindXvalid', ErrStat2, ErrMsg2); if(Failed()) return; p%OutDisWindXvalid = .true. do i = 1,p%NOutDisWindYZ - gridLoc = (p%OutDisWindX(i) - p%X0_low) / p%dX_low - if ( ( gridLoc < 0.0_ReKi ) .or. ( gridLoc > real(p%nX_low-1, ReKi) ) ) then + gridLoc = (p%OutDisWindX(i) - p%LowRes%oXYZ(1)) / p%LowRes%dXYZ(1) + if ( ( gridLoc < 0.0_ReKi ) .or. ( gridLoc > real(p%LowRes%nXYZ(1)-1, ReKi) ) ) then call SetErrStat(ErrID_Warn, "The requested low-resolution YZ output slice location, X="//TRIM(Num2LStr(p%OutDisWindX(i)))//", is outside of the low-resolution grid. Ignoring this slice.", errStat, errMsg, RoutineName ) p%OutDisWindXvalid(i) = .false. end if @@ -1136,39 +1415,45 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO if (errStat >= AbortErrLev) return - ! -------------------------------------------------------------------------------- - ! --- Initialize inputs - ! -------------------------------------------------------------------------------- - allocate ( u%xhat_plane( 3, 0:p%NumPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%xhat_plane.')) return; - allocate ( u%p_plane ( 3, 0:p%NumPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%p_plane.' )) return; - allocate ( u%Vx_wake (-p%NumRadii+1:p%NumRadii-1, -p%NumRadii+1:p%NumRadii-1, 0:p%NumPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%Vx_wake.' )) return; - allocate ( u%Vy_wake (-p%NumRadii+1:p%NumRadii-1, -p%NumRadii+1:p%NumRadii-1, 0:p%NumPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%Vy_wake.' )) return; - allocate ( u%Vz_wake (-p%NumRadii+1:p%NumRadii-1, -p%NumRadii+1:p%NumRadii-1, 0:p%NumPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%Vz_wake.' )) return; - allocate ( u%D_wake ( 0:p%NumPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%D_wake.' )) return; - allocate ( u%WAT_k (-p%NumRadii+1:p%NumRadii-1, -p%NumRadii+1:p%NumRadii-1, 0:p%NumPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%WAT_k.' )) return; + !---------------------------------------------------------------------------- + ! Initialize inputs + !---------------------------------------------------------------------------- + + allocate ( u%NumPlanes ( 1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%NumPlanes.' )) return; + allocate ( u%xhat_plane( 3, 0:p%MaxPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%xhat_plane.')) return; + allocate ( u%p_plane ( 3, 0:p%MaxPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%p_plane.' )) return; + allocate ( u%Vx_wake (1-p%NumRadii:p%NumRadii-1, 1-p%NumRadii:p%NumRadii-1, 0:p%MaxPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%Vx_wake.' )) return; + allocate ( u%Vy_wake (1-p%NumRadii:p%NumRadii-1, 1-p%NumRadii:p%NumRadii-1, 0:p%MaxPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%Vy_wake.' )) return; + allocate ( u%Vz_wake (1-p%NumRadii:p%NumRadii-1, 1-p%NumRadii:p%NumRadii-1, 0:p%MaxPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%Vz_wake.' )) return; + allocate ( u%D_wake ( 0:p%MaxPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%D_wake.' )) return; + allocate ( u%WAT_k (1-p%NumRadii:p%NumRadii-1, 1-p%NumRadii:p%NumRadii-1, 0:p%MaxPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('u%WAT_k.' )) return; + u%NumPlanes = 2.0_ReKi u%Vx_wake=0.0_ReKi u%Vy_wake=0.0_ReKi u%Vz_wake=0.0_ReKi - !---------------- - ! initialize outputs - allocate ( y%V_plane(3,0:p%NumPlanes-1,1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('y%V_plane.' )) return; - allocate ( y%Vdist_High(1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('y%Vdist_High.')) return; - do i = 1, p%NumTurbines - allocate ( y%Vdist_High(i)%data(3,0:p%nX_high-1,0:p%nY_high-1,0:p%nZ_high-1,0:p%n_high_low_p1), STAT=ErrStat2 ); if (Failed0('y%Vdist_High%data.')) return; - y%Vdist_High(i)%data = 0.0_Siki + !---------------------------------------------------------------------------- + ! Initialize outputs + !---------------------------------------------------------------------------- + + allocate (y%V_plane(3,0:p%MaxPlanes-1,1:p%NumTurbines), STAT=ErrStat2); if (Failed0('y%V_plane.' )) return; + allocate (y%Vdist_High(1:p%NumTurbines), STAT=ErrStat2); if (Failed0('y%Vdist_High.')) return; + do nt = 1, p%NumTurbines + allocate (y%Vdist_High(nt)%data(3, 0:p%HighRes(nt)%nXYZ(1)-1, 0:p%HighRes(nt)%nXYZ(2)-1, 0:p%HighRes(nt)%nXYZ(3)-1, 0:p%n_high_low_p1), STAT=ErrStat2) + if (Failed0('y%Vdist_High%data.')) return + y%Vdist_High(nt)%data = 0.0_Siki end do - allocate ( y%Vx_wind_disk (1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('y%Vx_rel_disk.')) return; - allocate ( y%TI_amb (1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('y%TI_amb.')) return; + allocate (y%Vx_wind_disk (1:p%NumTurbines), STAT=ErrStat2); if (Failed0('y%Vx_rel_disk.')) return; + allocate (y%TI_amb (1:p%NumTurbines), STAT=ErrStat2); if (Failed0('y%TI_amb.')) return; ! Set pointers to high resolution wind in InitOutput allocate(InitOut%Vdist_High(1:p%NumTurbines), STAT=ErrStat2 ) if (errStat2 /= 0) call SetErrStat ( ErrID_Fatal, 'Could not allocate memory for y%Vdist_High.', errStat, errMsg, RoutineName ) - do i = 1, p%NumTurbines - InitOut%Vdist_High(i)%data => y%Vdist_High(i)%data + do nt = 1, p%NumTurbines + InitOut%Vdist_High(nt)%data => y%Vdist_High(nt)%data end do ! This next step is not strictly necessary @@ -1176,52 +1461,78 @@ subroutine AWAE_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO y%Vx_wind_disk = 0.0_Reki y%TI_amb = 0.0_Reki - ! -------------------------------------------------------------------------------- - ! --- Initialize misc - ! -------------------------------------------------------------------------------- + !---------------------------------------------------------------------------- + ! Initialize misc + !---------------------------------------------------------------------------- ! Initialize misc vars : Note these are not the correct initializations because ! that would require valid input data, which we do not have here. Instead we will check for ! an firstPass flag on the miscVars and if it is false we will properly initialize these state ! in CalcOutput or UpdateStates, as necessary. + if ( p%NOutDisWindXY > 0 ) then - ALLOCATE ( m%OutVizXYPlane(3,p%nX_low, p%nY_low,1) , STAT=ErrStat2 ); if (Failed0('the Fast.Farm OutVizXYPlane arrays.')) return; + ALLOCATE ( m%OutVizXYPlane(3,p%LowRes%nXYZ(1), p%LowRes%nXYZ(2),1) , STAT=ErrStat2 ); if (Failed0('the Fast.Farm OutVizXYPlane arrays.')) return; end if if ( p%NOutDisWindYZ > 0 ) then - ALLOCATE ( m%OutVizYZPlane(3,p%nY_low, p%nZ_low,1) , STAT=ErrStat2 ); if (Failed0('the Fast.Farm OutVizYZPlane arrays.')) return; + ALLOCATE ( m%OutVizYZPlane(3,p%LowRes%nXYZ(2), p%LowRes%nXYZ(3),1) , STAT=ErrStat2 ); if (Failed0('the Fast.Farm OutVizYZPlane arrays.')) return; end if if ( p%NOutDisWindXZ > 0 ) then - ALLOCATE ( m%OutVizXZPlane(3,p%nX_low, p%nZ_low,1) , STAT=ErrStat2 ); if (Failed0('the Fast.Farm OutVizXZPlane arrays.')) return; + ALLOCATE ( m%OutVizXZPlane(3,p%LowRes%nXYZ(1), p%LowRes%nXYZ(3),1) , STAT=ErrStat2 ); if (Failed0('the Fast.Farm OutVizXZPlane arrays.')) return; end if ! miscvars to avoid the allocation per timestep - allocate ( m%Vamb_low( 3, 0:p%nX_low-1 , 0:p%nY_low-1 , 0:p%nZ_low-1 ), STAT=errStat2 ); if (Failed0('m%Vamb_low.' )) return; - allocate ( m%Vamb_lowpol( 3, 0:p%n_rp_max*8 ), STAT=errStat2 ); if (Failed0('m%Vamb_lowpol.' )) return; - allocate ( m%Vdist_low( 3, 0:p%nX_low-1 , 0:p%nY_low-1 , 0:p%nZ_low-1 ), STAT=errStat2 ); if (Failed0('m%Vdist_low.' )) return; - allocate ( m%Vdist_low_full( 3, 0:p%nX_low-1 , 0:p%nY_low-1 , 0:p%nZ_low-1 ), STAT=errStat2 ); if (Failed0('m%Vdist_low_full')) return; - - allocate ( m%Vamb_high(1:p%NumTurbines), STAT=ErrStat2 ); if (Failed0('Could not allocate memory for m%Vamb_high.')) return; - do i = 1, p%NumTurbines - allocate ( m%Vamb_high(i)%data(3,0:p%nX_high-1,0:p%nY_high-1,0:p%nZ_high-1,0:p%n_high_low_p1), STAT=ErrStat2 ); if (Failed0('m%Vamb_high%data.')) return; + allocate(m%Vamb_lowpol( 3, 0:p%n_rp_max*8 ), STAT=errStat2); if (Failed0('m%Vamb_lowpol.' )) return; + allocate(m%Vamb_low( 3, 0:p%LowRes%nXYZ(1)-1 , 0:p%LowRes%nXYZ(2)-1 , 0:p%LowRes%nXYZ(3)-1 ), STAT=errStat2); if (Failed0('m%Vamb_low.' )) return; + allocate(m%Vdist_low( 3, 0:p%LowRes%nXYZ(1)-1 , 0:p%LowRes%nXYZ(2)-1 , 0:p%LowRes%nXYZ(3)-1 ), STAT=errStat2); if (Failed0('m%Vdist_low.' )) return; + allocate(m%Vdist_low_full( 3, 0:p%LowRes%nXYZ(1)-1 , 0:p%LowRes%nXYZ(2)-1 , 0:p%LowRes%nXYZ(3)-1 ), STAT=errStat2); if (Failed0('m%Vdist_low_full')) return; + + allocate(m%Vamb_high(1:p%NumTurbines), STAT=ErrStat2); if (Failed0('Could not allocate memory for m%Vamb_high.')) return; + do nt = 1, p%NumTurbines + allocate(m%Vamb_high(nt)%data(3,0:p%HighRes(nt)%nXYZ(1)-1, 0:p%HighRes(nt)%nXYZ(2)-1, 0:p%HighRes(nt)%nXYZ(3)-1, 0:p%n_high_low_p1), STAT=ErrStat2) + if (Failed0('m%Vamb_high%data.')) return; end do - allocate ( m%parallelFlag( 0:p%NumPlanes-2,1:p%NumTurbines ), STAT=errStat2 ); if (Failed0('m%parallelFlag.')) return; - allocate ( m%r_s( 0:p%NumPlanes-2,1:p%NumTurbines ), STAT=errStat2 ); if (Failed0('m%r_s.' )) return; - allocate ( m%r_e( 0:p%NumPlanes-2,1:p%NumTurbines ), STAT=errStat2 ); if (Failed0('m%r_e.' )) return; - allocate ( m%rhat_s( 3,0:p%NumPlanes-2,1:p%NumTurbines ), STAT=errStat2 ); if (Failed0('m%rhat_s.' )) return; - allocate ( m%rhat_e( 3,0:p%NumPlanes-2,1:p%NumTurbines ), STAT=errStat2 ); if (Failed0('m%rhat_e.' )) return; - allocate ( m%pvec_cs( 3,0:p%NumPlanes-2,1:p%NumTurbines ), STAT=errStat2 ); if (Failed0('m%pvec_cs.' )) return; - allocate ( m%pvec_ce( 3,0:p%NumPlanes-2,1:p%NumTurbines ), STAT=errStat2 ); if (Failed0('m%pvec_ce.' )) return; + allocate(m%parallelFlag( 0:p%MaxPlanes-2,1:p%NumTurbines ), STAT=errStat2); if (Failed0('m%parallelFlag.')) return; + allocate(m%r_s( 0:p%MaxPlanes-2,1:p%NumTurbines ), STAT=errStat2); if (Failed0('m%r_s.' )) return; + allocate(m%r_e( 0:p%MaxPlanes-2,1:p%NumTurbines ), STAT=errStat2); if (Failed0('m%r_e.' )) return; + allocate(m%rhat_s( 3,0:p%MaxPlanes-2,1:p%NumTurbines ), STAT=errStat2); if (Failed0('m%rhat_s.' )) return; + allocate(m%rhat_e( 3,0:p%MaxPlanes-2,1:p%NumTurbines ), STAT=errStat2); if (Failed0('m%rhat_e.' )) return; + allocate(m%pvec_cs( 3,0:p%MaxPlanes-2,1:p%NumTurbines ), STAT=errStat2); if (Failed0('m%pvec_cs.' )) return; + allocate(m%pvec_ce( 3,0:p%MaxPlanes-2,1:p%NumTurbines ), STAT=errStat2); if (Failed0('m%pvec_ce.' )) return; + ! WAT - store array of disk average velocities for all turbines call AllocAry(m%V_amb_low_disk,3,p%NumTurbines,'m%V_amb_low_disk', ErrStat2, ErrMsg2); if(Failed()) return; m%V_amb_low_disk=0.0_ReKi ! IMPORTANT ALLOCATION. This misc var is not set before a low res calcoutput + ! Initialize array to hold all wake plane point data used in constructing the KdTree + call AllocAry(m%AllPlanePoints, 2, p%MaxPlanes*p%NumTurbines, 'm%AllPlanePoints', ErrStat2, ErrMsg2); if(Failed()) return; + + ! Create array to hold data associated with the points in the KdTree (plane and turbine indices for each point) + call AllocAry(m%KdTPointData, 2, p%MaxPlanes*p%NumTurbines, 'm%KdTPointData', ErrStat2, ErrMsg2); if(Failed()) return; + + ! Create array to hold KdTree search result indices (reduces allocations but keeps search from being done in parallel) + call AllocAry(m%KdTResults, max(p%MaxPlanes*p%NumTurbines, p%MaxPlanes*size(p%LowRes%WakeChunks)), 'm%KdTResults', ErrStat2, ErrMsg2); if(Failed()) return; + + ! Create array to hold the start and end plane index of the source turbine wake for each destination turbine + ! array dimensions = (start & end plane index, wake source turbine, destination turbine) + call AllocAry(m%iPlaneTurbTurb, 2, p%NumTurbines, p%NumTurbines, "m%iPlaneTurbTurb", ErrStat2, ErrMsg2); if(Failed()) return; + + ! Create array to hold the start and end plane index of the source turbine wake for each destination low-res chunk + ! array dimensions = (start & end plane index, wake source turbine, destination low-res grid chunk) + call AllocAry(m%iPlaneTurbChunk, 2, p%NumTurbines, size(p%LowRes%WakeChunks), "m%iPlaneTurbChunk", ErrStat2, ErrMsg2); if(Failed()) return; + + ! Allocate array for holding flags for if the chunk was updated because it had wake pass through it + call AllocAry(m%LowResChunkHasWake, size(p%LowRes%WakeChunks), "m%LowResChunkHasWake", ErrStat2, ErrMsg2); if(Failed()) return; + + ! Initialize the KdTree with no active points + call kdtree_build(m%KdT, m%AllPlanePoints(:,1:1), n_max=p%MaxPlanes*p%NumTurbines) + ! track if a plan has left the domain (all planes start in domain). ! Value indicates edge number (+/-1: +/-X, +/-2: +/-Y, +/-3: +/-Z) the plane crossed - allocate(m%planeDomainExit(0:p%NumPlanes-1,1:p%NumTurbines), STAT=ErrStat2); if (Failed0('m%planeDomainExit.')) return; + allocate(m%planeDomainExit(0:p%MaxPlanes-1,1:p%NumTurbines), STAT=ErrStat2); if (Failed0('m%planeDomainExit.')) return; m%planeDomainExit = 0_IntKi ! Read-in the ambient wind data for the initial calculate output - call AWAE_UpdateStates( 0.0_DbKi, -1, u, p, x, xd, z, OtherState, m, errStat2, errMsg2 ); if(Failed()) return; + call AWAE_UpdateStates(0, u, p, x, xd, z, OtherState, m, errStat2, errMsg2 ); if(Failed()) return; contains subroutine CheckModAmb3Boundaries() @@ -1238,19 +1549,22 @@ subroutine CheckModAmb3Boundaries() ! check Z limits, if ZRange is limited (we don't care what kind of wind) if (wfi%ZRange_Limited) then + ! flow field limits (with grid tolerance) - ff_lim(1) = p%WT_Position(3,nt) + wfi%ZRange(1) - GridTol - ff_lim(2) = p%WT_Position(3,nt) + wfi%ZRange(2) + GridTol + ff_lim(1) = p%HighRes(nt)%WT_Position(3) + wfi%ZRange(1) - GridTol + ff_lim(2) = p%HighRes(nt)%WT_Position(3) + wfi%ZRange(2) + GridTol + ! high-res Z limits - hr_lim(1) = p%Z0_High(nt) - hr_lim(2) = p%Z0_High(nt) + (real(p%nZ_high,ReKi)-1.0_ReKi)*p%dZ_high(nt) + hr_lim(1) = p%HighRes(nt)%oXYZ(3) + hr_lim(2) = p%HighRes(nt)%oXYZ(3) + p%HighRes(nt)%Size(3) + if ((hr_lim(1) < ff_lim(1)) .or. & (hr_lim(2) > ff_lim(2)) ) then ErrStat2 = ErrID_Fatal ErrMsg2 = trim(tmpMsg)// & - ' Z0_high = '//trim(Num2LStr(p%WT_Position(3,nt)+wfi%ZRange(1))) + ' Z0_high = '//trim(Num2LStr(p%HighRes(nt)%WT_Position(3)+wfi%ZRange(1))) if (allocated(ff%Grid3D%Vel)) then - Dxyz = abs(wfi%ZRange(2)-wfi%ZRange(1))/(real(p%nZ_high,ReKi)-1.0_ReKi) + Dxyz = abs(wfi%ZRange(2)-wfi%ZRange(1))/(real(p%HighRes(nt)%nXYZ(3),ReKi)-1.0_ReKi) ErrMsg2=trim(ErrMsg2)//NewLine//' dZ_High = '//trim(Num2LStr(Dxyz)) call SetErrStat ( errStat2, errMsg2, errStat, errMsg, RoutineName ) endif @@ -1263,18 +1577,18 @@ subroutine CheckModAmb3Boundaries() ! wind X aligned with high-res X if ((.not. ff%RotateWindBox) .or. EqualRealNos(abs(ff%PropagationDir),Pi)) then ! flow field limits (with grid tolerance) - ff_lim(1) = p%WT_Position(2,nt) + wfi%YRange(1) - GridTol - ff_lim(2) = p%WT_Position(2,nt) + wfi%YRange(2) + GridTol + ff_lim(1) = p%HighRes(nt)%WT_Position(2) + wfi%YRange(1) - GridTol + ff_lim(2) = p%HighRes(nt)%WT_Position(2) + wfi%YRange(2) + GridTol ! high-res Y limits - hr_lim(1) = p%Y0_High(nt) - hr_lim(2) = p%Y0_High(nt) + (real(p%nY_high,ReKi)-1.0_ReKi)*p%dY_high(nt) + hr_lim(1) = p%HighRes(nt)%oXYZ(2) + hr_lim(2) = p%HighRes(nt)%oXYZ(2) + p%HighRes(nt)%Size(2) if ((hr_lim(1) < ff_lim(1)) .or. & (hr_lim(2) > ff_lim(2)) ) then ErrStat2 = ErrID_Fatal ErrMsg2 = trim(tmpMsg)// & - ' Y0_high = '//trim(Num2LStr(p%WT_Position(2,nt)+wfi%YRange(1))) + ' Y0_high = '//trim(Num2LStr(p%HighRes(nt)%WT_Position(2)+wfi%YRange(1))) if (allocated(ff%Grid3D%Vel)) then - Dxyz = abs(wfi%YRange(2)-wfi%YRange(1))/(real(p%nY_high,ReKi)-1.0_ReKi) + Dxyz = abs(wfi%YRange(2)-wfi%YRange(1))/(real(p%HighRes(nt)%nXYZ(2),ReKi)-1.0_ReKi) ErrMsg2=trim(ErrMsg2)//NewLine//' dY_High = '//trim(Num2LStr(Dxyz)) call SetErrStat ( errStat2, errMsg2, errStat, errMsg, RoutineName ) endif @@ -1284,18 +1598,18 @@ subroutine CheckModAmb3Boundaries() ! wind X aligned with high-res Y elseif (EqualRealNos(abs(ff%PropagationDir),PiBy2)) then ! flow field limits (with grid tolerance) - ff_lim(1) = p%WT_Position(1,nt) + wfi%YRange(1) - GridTol - ff_lim(2) = p%WT_Position(1,nt) + wfi%YRange(2) + GridTol + ff_lim(1) = p%HighRes(nt)%WT_Position(1) + wfi%YRange(1) - GridTol + ff_lim(2) = p%HighRes(nt)%WT_Position(1) + wfi%YRange(2) + GridTol ! high-res X limits - hr_lim(1) = p%X0_High(nt) - hr_lim(2) = p%X0_High(nt) + (real(p%nX_high,ReKi)-1.0_ReKi)*p%dX_high(nt) + hr_lim(1) = p%HighRes(nt)%oXYZ(1) + hr_lim(2) = p%HighRes(nt)%oXYZ(1) + (real(p%HighRes(nt)%nXYZ(1),ReKi)-1.0_ReKi)*p%HighRes(nt)%dXYZ(1) if ((hr_lim(1) < ff_lim(1)) .or. & (hr_lim(2) > ff_lim(2)) ) then ErrStat2 = ErrID_Fatal ErrMsg2 = trim(tmpMsg)// & - ' X0_high = '//trim(Num2LStr(p%WT_Position(1,nt)+wfi%YRange(1))) + ' X0_high = '//trim(Num2LStr(p%HighRes(nt)%WT_Position(1)+wfi%YRange(1))) if (allocated(ff%Grid3D%Vel)) then - Dxyz = abs(wfi%YRange(2)-wfi%YRange(1))/(real(p%nX_high,ReKi)-1.0_ReKi) + Dxyz = abs(wfi%YRange(2)-wfi%YRange(1))/(real(p%HighRes(nt)%nXYZ(1),ReKi)-1.0_ReKi) ErrMsg2=trim(ErrMsg2)//NewLine//' dX_High = '//trim(Num2LStr(Dxyz)) call SetErrStat ( errStat2, errMsg2, errStat, errMsg, RoutineName ) endif @@ -1346,15 +1660,22 @@ subroutine AWAE_End( u, p, x, xd, z, OtherState, y, m, errStat, errMsg ) errStat = ErrID_None errMsg = "" - ! End all instances of the InflowWind module - if ( p%Mod_AmbWind == 2 ) then - call InflowWind_End( m%u_IfW_Low, p%IfW(0 ), x%IfW(0 ), xd%IfW(0 ), z%IfW(0 ), OtherState%IfW(0 ), m%y_IfW_Low, m%IfW(0 ), errStat, errMsg ) - else if ( p%Mod_AmbWind == 3 ) then - call InflowWind_End( m%u_IfW_Low, p%IfW(0 ), x%IfW(0 ), xd%IfW(0 ), z%IfW(0 ), OtherState%IfW(0 ), m%y_IfW_Low, m%IfW(0 ), errStat, errMsg ) + ! Destroy InflowWind data + select case(p%Mod_AmbWind) + case (2) + call InflowWind_DestroyInput(m%u_IfW_Low, errStat, errMsg) + call InflowWind_DestroyParam(p%IfW(0), errStat, errMsg) + call InflowWind_DestroyOutput(m%y_IfW_Low, errStat, errMsg) + case (3) + call InflowWind_DestroyInput(m%u_IfW_Low, errStat, errMsg) + call InflowWind_DestroyParam(p%IfW(0), errStat, errMsg) + call InflowWind_DestroyOutput(m%y_IfW_Low, errStat, errMsg) do nt = 1,p%NumTurbines - call InflowWind_End( m%u_IfW_Low, p%IfW(nt), x%IfW(nt), xd%IfW(nt), z%IfW(nt), OtherState%IfW(nt), m%y_IfW_Low, m%IfW(nt), errStat, errMsg ) + call InflowWind_DestroyInput(m%u_IfW_High(nt), errStat, errMsg) + call InflowWind_DestroyParam(p%IfW(nt), errStat, errMsg) + call InflowWind_DestroyOutput(m%y_IfW_High(nt), errStat, errMsg) end do - end if + end select ! Destroy the input data: call AWAE_DestroyInput( u, errStat, errMsg ) @@ -1376,8 +1697,8 @@ end subroutine AWAE_End !---------------------------------------------------------------------------------------------------------------------------------- !> Loose coupling routine for solving for constraint states, integrating continuous states, and updating discrete and other states. !! Continuous, constraint, discrete, and other states are updated for t + Interval -subroutine AWAE_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errMsg ) - real(DbKi), intent(in ) :: t !< Current simulation time in seconds +!! Populates the ambient wind data in low and high resolution grids that is needed for t+dt, i.e., n+1 +subroutine AWAE_UpdateStates(n, u, p, x, xd, z, OtherState, m, errStat, errMsg) integer(IntKi), intent(in ) :: n !< Current simulation time step n = 0,1,... type(AWAE_InputType), intent(inout) :: u !< Inputs at utimes (out only for mesh record-keeping in ExtrapInterp routine) type(AWAE_ParameterType), intent(in ) :: p !< Parameters @@ -1393,24 +1714,30 @@ subroutine AWAE_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errM integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None - character(*), parameter :: RoutineName = 'AWAE_UpdateStates' - integer(intKi) :: errStat2 ! temporary Error status - character(ErrMsgLen) :: errMsg2 ! temporary Error message - type(AWAE_InputType) :: uInterp ! Interpolated/Extrapolated input - integer(IntKi) :: n_high_low, nt, i_hl - integer(IntKi) :: i,j,k,c + character(*), parameter :: RoutineName = 'AWAE_UpdateStates' + integer(intKi) :: errStat2 ! temporary Error status + character(ErrMsgLen) :: errMsg2 ! temporary Error message + type(AWAE_InputType) :: uInterp ! Interpolated/Extrapolated input + integer(IntKi) :: n_high_low, nt, i_hl + integer(IntKi) :: i,j,k,c real(ReKi), pointer :: V_Grid(:,:,:,:) + real(ReKi), allocatable :: AccUVW(:,:) + logical :: WriteWindVTK + real(DbKi) :: t errStat = ErrID_None errMsg = "" - + ! If last time step, don't populate high-resolution grid - if ( (n+1) == (p%NumDT-1) ) then + if (n == (p%NumDT - 1)) then n_high_low = 0 else n_high_low = p%n_high_low end if + ! Current simulation time + t = n * p%DT_low + !---------------------------------------------------------------------------- ! Populate low resolution grids based on ambient wind source !---------------------------------------------------------------------------- @@ -1420,21 +1747,16 @@ subroutine AWAE_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errM ! File-based ambient wind case (1) - ! Read from file the ambient flow for the n+1 time step - call ReadLowResWindFile(n+1, p, m%Vamb_Low, errStat2, errMsg2); if (Failed()) return; - + ! Read from file the ambient flow for the n time step + call ReadLowResWindVTK(n, p, m%Vamb_Low, errStat2, errMsg2); if (Failed()) return; + ! InflowWind-based ambient wind (single or multiple instances) case (2, 3) -!FIXME:merge5.0 remove next 3 lines - ! Set the hub position and orientation to pass to IfW (IfW always calculates hub and disk avg vel) -- note that this is garbage data. - m%u_IfW_Low%HubPosition = (/ p%X0_low + 0.5*p%nX_low*p%dX_low, p%Y0_low + 0.5*p%nY_low*p%dY_low, p%Z0_low + 0.5*p%nZ_low*p%dZ_low /) - call Eye(m%u_IfW_Low%HubOrientation,ErrStat2,ErrMsg2); if (Failed()) return; - ! Calculate the low-resolution grid inflow velocities - call InflowWind_CalcOutput(t+p%dt_low, m%u_IfW_Low, p%IfW(0), x%IfW(0), xd%IfW(0), z%IfW(0), OtherState%IfW(0), m%y_IfW_Low, m%IfW(0), errStat2, errMsg2) + call IfW_FlowField_GetVelAcc(p%IfW(0)%FlowField, 1, t, p%LowRes%GridPoints, m%y_IfW_Low%VelocityUVW, AccUVW, errStat2, errMsg2) if (Failed()) return - + ! Transfer velocities to low resolution grid V_Grid(lbound(m%Vamb_low,1):ubound(m%Vamb_low,1),& lbound(m%Vamb_low,2):ubound(m%Vamb_low,2),& @@ -1442,6 +1764,12 @@ subroutine AWAE_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errM lbound(m%Vamb_low,4):ubound(m%Vamb_low,4)) => m%y_IfW_Low%VelocityUVW m%Vamb_Low = V_Grid + ! AMReX-based inflow + case (4) + + call ReadWindAMReX(0, n, p, m%Vamb_low, errStat2, errMsg2) + if (Failed()) return + end select !---------------------------------------------------------------------------- @@ -1457,15 +1785,13 @@ subroutine AWAE_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errM !$OMP SHARED(p, n_high_low, n, m, errStat, errMsg, AbortErrLev) do nt = 1,p%NumTurbines - ! Copy T=T_low_previous-DT_high (end-1 index in Vamb_high) into T=T_low_now-DT_high (0 index in Vamb_high). Note that n starts at -1 - if (n/=-1_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,ubound(m%Vamb_high(nt)%data,5)-1) + ! Copy T=T_low_previous-DT_high (end-1 index in Vamb_high) into T=T_low_now-DT_high (0 index in Vamb_high). Note that n starts at 0 + if (n /= 0_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,ubound(m%Vamb_high(nt)%data,5)-1) do i_hl=0, n_high_low - + ! read from file the ambient flow for the current time step -!FIXME:merge5.0 replace next line with the following - call ReadHighResWindFile(nt, (n+1)*p%n_high_low + i_hl, p, m%Vamb_high(nt)%data(:,:,:,:,i_hl+1), errStat2, errMsg2) -! call ReadHighResWindVTK(nt, n*p%n_high_low + i_hl, p, m%Vamb_high(nt)%data(:,:,:,:,i_hl+1), errStat2, errMsg2) + call ReadHighResWindVTK(nt, n*p%n_high_low + i_hl, p, m%Vamb_high(nt)%data(:,:,:,:,i_hl+1), errStat2, errMsg2) if (ErrStat2 >= AbortErrLev) then !$OMP CRITICAL ! Needed to avoid data race on ErrStat and ErrMsg call SetErrStat( ErrStat2, ErrMsg2, errStat, errMsg, RoutineName ) @@ -1473,9 +1799,9 @@ subroutine AWAE_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errM endif end do - ! Special handling at T=0 for time slice at -DT_high (0 index in Vamb_high). Note that n starts at -1 + ! Special handling at T=0 for time slice at -DT_high (0 index in Vamb_high). Note that n starts at 0 ! -> Copy T=0 data into T=-DT_high for AD extrap/interp - if (n==-1_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,1) + if (n == 0_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,1) end do !$OMP END PARALLEL DO @@ -1488,45 +1814,29 @@ subroutine AWAE_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errM ! Loop through turbines do nt = 1, p%NumTurbines -!FIXME:merge5.0 remove next 4 lines - ! Set the hub position and orientation to pass to IfW (IfW always calculates hub and disk avg vel) - m%u_IfW_High%HubPosition = (/ p%X0_high(nt) + 0.5*p%nX_high*p%dX_high(nt), p%Y0_high(nt) + 0.5*p%nY_high*p%dY_high(nt), p%Z0_high(nt) + 0.5*p%nZ_high*p%dZ_high(nt) /) - call Eye(m%u_IfW_High%HubOrientation,ErrStat2,ErrMsg2) - -!FIXME:merge5.0 remove next 3 lines - ! Set input position - m%u_IfW_High%PositionXYZ = p%Grid_high(:,:,nt) - - ! Copy T=T_low_previous-DT_high (end-1 index in Vamb_high) into T=T_low_now-DT_high (0 index in Vamb_high). Note that n starts at -1 - if (n/=-1_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,ubound(m%Vamb_high(nt)%data,5)-1) + ! Copy T=T_low_previous-DT_high (end-1 index in Vamb_high) into T=T_low_now-DT_high (0 index in Vamb_high). Note that n starts at 0 + if (n /= 0_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,ubound(m%Vamb_high(nt)%data,5)-1) ! Loop through high resolution grids do i_hl = 0, n_high_low ! Calculate wind velocities at grid locations from InflowWind -!FIXME:merge5.0 replace next line with the next - call InflowWind_CalcOutput(t+p%dt_low+i_hl*p%DT_high, m%u_IfW_High, p%IfW(0), x%IfW(0), xd%IfW(0), z%IfW(0), OtherState%IfW(0), m%y_IfW_High, m%IfW(0), errStat2, errMsg2) -! call IfW_FlowField_GetVelAcc(p%IfW(0)%FlowField, 1, t + i_hl*p%DT_high, & -! m%u_IfW_High(nt)%PositionXYZ, & -! m%y_IfW_High(nt)%VelocityUVW, AccUVW, errStat2, errMsg2) + call IfW_FlowField_GetVelAcc(p%IfW(0)%FlowField, 1, t + i_hl*p%DT_high, & + m%u_IfW_High(nt)%PositionXYZ, & + m%y_IfW_High(nt)%VelocityUVW, AccUVW, errStat2, errMsg2) if (Failed()) return ! Transfer velocities to high resolution grid -!FIXME:merge5.0 remove following 4 lines and uncomment block after V_Grid(lbound(m%Vamb_high(nt)%data,1):ubound(m%Vamb_high(nt)%data,1),& lbound(m%Vamb_high(nt)%data,2):ubound(m%Vamb_high(nt)%data,2),& lbound(m%Vamb_high(nt)%data,3):ubound(m%Vamb_high(nt)%data,3),& - lbound(m%Vamb_high(nt)%data,4):ubound(m%Vamb_high(nt)%data,4)) => m%y_IfW_High%VelocityUVW -! V_Grid(lbound(m%Vamb_high(nt)%data,1):ubound(m%Vamb_high(nt)%data,1),& -! lbound(m%Vamb_high(nt)%data,2):ubound(m%Vamb_high(nt)%data,2),& -! lbound(m%Vamb_high(nt)%data,3):ubound(m%Vamb_high(nt)%data,3),& -! lbound(m%Vamb_high(nt)%data,4):ubound(m%Vamb_high(nt)%data,4)) => m%y_IfW_High(nt)%VelocityUVW + lbound(m%Vamb_high(nt)%data,4):ubound(m%Vamb_high(nt)%data,4)) => m%y_IfW_High(nt)%VelocityUVW m%Vamb_high(nt)%data(:,:,:,:,i_hl+1) = V_Grid end do - ! Special handling at T=0 for time slice at -DT_high (0 index in Vamb_high). Note that n starts at -1 + ! Special handling at T=0 for time slice at -DT_high (0 index in Vamb_high). Note that n starts at 0 ! -> Copy T=0 data into T=-DT_high for AD extrap/interp - if (n==-1_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,1) + if (n == 0_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,1) end do @@ -1536,53 +1846,52 @@ subroutine AWAE_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errM ! Loop through turbines do nt = 1, p%NumTurbines -!FIXME:merge5.0 remove next 10 lines - ! Set input velocity - c = 1 - do k = 0,p%nZ_high-1 - do j = 0,p%nY_high-1 - do i = 0,p%nX_high-1 - m%u_IfW_High%PositionXYZ(:,c) = p%Grid_high(:,c,nt) - p%WT_Position(:,nt) - c = c+1 - end do - end do - end do - - ! Copy T=T_low_previous-DT_high (end-1 index in Vamb_high) into T=T_low_now-DT_high (0 index in Vamb_high). Note that n starts at -1 - if (n/=-1_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,ubound(m%Vamb_high(nt)%data,5)-1) + ! Copy T=T_low_previous-DT_high (end-1 index in Vamb_high) into T=T_low_now-DT_high (0 index in Vamb_high). Note that n starts at 0 + if (n /= 0_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,ubound(m%Vamb_high(nt)%data,5)-1) ! Loop through high resolution grids do i_hl = 0, n_high_low -!FIXME:merge5.0 remove next 4 lines - ! Set the hub position and orientation to pass to IfW (IfW always calculates hub and disk avg vel) - m%u_IfW_High%HubPosition = (/ p%X0_high(nt) + 0.5*p%nX_high*p%dX_high(nt), p%Y0_high(nt) + 0.5*p%nY_high*p%dY_high(nt), p%Z0_high(nt) + 0.5*p%nZ_high*p%dZ_high(nt) /) - p%WT_Position(:,nt) - call Eye(m%u_IfW_High%HubOrientation,ErrStat2,ErrMsg2) - ! Calculate wind velocities at grid locations from InflowWind -!FIXME:merge5.0 replace next line with the next - call InflowWind_CalcOutput(t+p%dt_low+i_hl*p%DT_high, m%u_IfW_High, p%IfW(nt), x%IfW(nt), xd%IfW(nt), z%IfW(nt), OtherState%IfW(nt), m%y_IfW_High, m%IfW(nt), errStat2, errMsg2) -! call IfW_FlowField_GetVelAcc(p%IfW(nt)%FlowField, 1, t + i_hl*p%DT_high, & -! m%u_IfW_High(nt)%PositionXYZ, & -! m%y_IfW_High(nt)%VelocityUVW, AccUVW, errStat2, errMsg2) + call IfW_FlowField_GetVelAcc(p%IfW(nt)%FlowField, 1, t + i_hl*p%DT_high, & + m%u_IfW_High(nt)%PositionXYZ, & + m%y_IfW_High(nt)%VelocityUVW, AccUVW, errStat2, errMsg2) if (Failed()) return ! Transfer velocities to high resolution grid -!FIXME:merge5.0 remove following 4 lines and uncomment block after V_Grid(lbound(m%Vamb_high(nt)%data,1):ubound(m%Vamb_high(nt)%data,1),& lbound(m%Vamb_high(nt)%data,2):ubound(m%Vamb_high(nt)%data,2),& lbound(m%Vamb_high(nt)%data,3):ubound(m%Vamb_high(nt)%data,3),& - lbound(m%Vamb_high(nt)%data,4):ubound(m%Vamb_high(nt)%data,4)) => m%y_IfW_High%VelocityUVW -! V_Grid(lbound(m%Vamb_high(nt)%data,1):ubound(m%Vamb_high(nt)%data,1),& -! lbound(m%Vamb_high(nt)%data,2):ubound(m%Vamb_high(nt)%data,2),& -! lbound(m%Vamb_high(nt)%data,3):ubound(m%Vamb_high(nt)%data,3),& -! lbound(m%Vamb_high(nt)%data,4):ubound(m%Vamb_high(nt)%data,4)) => m%y_IfW_High(nt)%VelocityUVW + lbound(m%Vamb_high(nt)%data,4):ubound(m%Vamb_high(nt)%data,4)) => m%y_IfW_High(nt)%VelocityUVW m%Vamb_high(nt)%data(:,:,:,:,i_hl+1) = V_Grid end do - ! Special handling at T=0 for time slice at -DT_high. Note that n starts at -1 + ! Special handling at T=0 for time slice at -DT_high. Note that n starts at 0 ! -> Copy T=0 data into T=-DT_high for AD extrap/interp - if (n==-1_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,1) + if (n == 0_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,1) + + end do + + ! AMReX-based ambient wind + case (4) + + ! Loop through turbines + do nt = 1, p%NumTurbines + + ! Copy T=T_low_previous-DT_high (end-1 index in Vamb_high) into T=T_low_now-DT_high (0 index in Vamb_high). Note that n starts at 0 + if (n /= 0_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,ubound(m%Vamb_high(nt)%data,5)-1) + + ! Loop through high resolution grids + do i_hl = 0, n_high_low + + call ReadWindAMReX(nt, n*p%n_high_low + i_hl, p, m%Vamb_high(nt)%data(:,:,:,:,i_hl+1), errStat2, errMsg2) + if (Failed()) return + + end do + + ! Special handling at T=0 for time slice at -DT_high. Note that n starts at 0 + ! -> Copy T=0 data into T=-DT_high for AD extrap/interp + if (n == 0_IntKi) m%Vamb_high(nt)%data(:,:,:,:,0) = m%Vamb_high(nt)%data(:,:,:,:,1) end do @@ -1597,18 +1906,18 @@ subroutine AWAE_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errM ! Find mean velocity of all turbine disks xd%Ufarm = 0.0_ReKi do nt=1,p%NumTurbines - xd%Ufarm(1:3) = xd%Ufarm(1:3) + m%V_amb_low_disk(1:3,nt) + xd%Ufarm = xd%Ufarm + m%V_amb_low_disk(:,nt) enddo xd%Ufarm(1:3) = xd%Ufarm(1:3) / real(p%NumTurbines,ReKi) ! add mean velocity * dt to the tracer for the position of the WAT box - xd%WAT_B_Box(1:3) = xd%WAT_B_Box(1:3) + xd%Ufarm(1:3)*real(p%dt_low,ReKi) + xd%WAT_B_Box = xd%WAT_B_Box + xd%Ufarm*real(p%dt_low,ReKi) endif contains logical function Failed() call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - Failed = ErrStat >= AbortErrLev + Failed = ErrStat >= AbortErrLev end function Failed end subroutine AWAE_UpdateStates @@ -1624,7 +1933,7 @@ subroutine AWAE_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, errStat, errMsg ! placed in the y%WriteOutput(:) array. use VTK real(DbKi), intent(in ) :: t !< Current simulation time in seconds - type(AWAE_InputType), intent(in ) :: u !< Inputs at Time t + type(AWAE_InputType), target, intent(in ) :: u !< Inputs at Time t type(AWAE_ParameterType), intent(in ) :: p !< Parameters type(AWAE_ContinuousStateType), intent(in ) :: x !< Continuous states at t type(AWAE_DiscreteStateType), intent(in ) :: xd !< Discrete states at t @@ -1636,16 +1945,18 @@ subroutine AWAE_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, errStat, errMsg integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None - integer, parameter :: indx = 1 character(p%VTK_tWidth) :: Tstr ! string for current VTK write-out step (padded with zeros) integer(intKi) :: i, j, k - integer(intKi) :: errStat2 - character(ErrMsgLen) :: errMsg2 + integer(intKi) :: PrevPoint + + integer(intKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_CalcOutput' integer(intKi) :: n, n_high character(3) :: PlaneNumStr ! 2 digit number of the output plane CHARACTER(1024) :: FileName INTEGER(IntKi) :: Un ! unit number of opened file + logical :: WriteWindVTK errStat = ErrID_None errMsg = "" @@ -1653,63 +1964,97 @@ subroutine AWAE_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, errStat, errMsg ! some variables and indexing n = nint(t / p%dt_low) n_high = n*p%n_high_low - call ComputeLocals(n, u, p, y, m, errStat2, errMsg2); if (Failed()) return; + call ComputeLocals(n, u, p, y, m, ErrStat2, ErrMsg2); if (Failed()) return; + + ! Set flag to write wind VTK files if it's the correct step + WriteWindVTK = mod(n, p%WrDisSkp1) == 0 + + !---------------------------------------------------------------------------- + ! Calculate the wake planes that interact with the grids. Populates: + ! m%iPlaneTurbChunk(2,p%NumTurbines,size(p%LowRes%WakeChunks)) (Low-res grid) + ! m%iPlaneTurbTurb(2,p%NumTurbines,p%NumTurbines) (High-res grid) + !---------------------------------------------------------------------------- - ! high-res - call HighResGridCalcOutput(n_high, u, p, xd, y, m, errStat2, errMsg2); if (Failed()) return; + call CalcWakePointTurbineGridInteractions(p, m, u) - ! low-res - call LowResGridCalcOutput(n, u, p, xd, y, m, errStat2, errMsg2); if (Failed()) return; + ! High-resolution grid output + call HighResGridCalcOutput(n_high, u, p, xd, y, m, ErrStat2, ErrMsg2) + if (Failed()) return + ! Low-resolution grid output + call LowResGridCalcOutput(n, u, p, xd, y, m, ErrStat2, ErrMsg2) + if (Failed()) return - if (mod(n,p%WrDisSkp1) == 0) then + ! If it's time to write wind VTK files + if (WriteWindVTK) then - if ( p%WrDisWind ) then - call WriteDisWindFiles( n, p%WrDisSkp1, p, y, m, ErrStat2, ErrMsg2 ) + if (p%WrDisWind) then + call WriteDisWindFiles(n, p%WrDisSkp1, p, y, m, ErrStat2, ErrMsg2) + if (Failed()) return end if ! TimeStamp write(Tstr, '(i' // trim(Num2LStr(p%VTK_tWidth)) //'.'// trim(Num2LStr(p%VTK_tWidth)) // ')') n/p%WrDisSkp1 ! TODO use n instead.. - ! XY plane slices - do k = 1,p%NOutDisWindXY - if (.not. p%OutDisWindZvalid(k)) cycle ! skip if invalid + ! XY plane slices + do k = 1, p%NOutDisWindXY + ! skip if invalid + if (.not. p%OutDisWindZvalid(k)) cycle write(PlaneNumStr, '(i3.3)') k - call ExtractSlice( XYSlice, p%OutDisWindZ(k), p%Z0_low, p%nZ_low, p%nX_low, p%nY_low, p%dZ_low, m%Vdist_low_full, m%outVizXYPlane(:,:,:,1)) - ! Create the output vtk file with naming /Low/DisXY.t.vtk + call ExtractSlice(XYSlice, p%OutDisWindZ(k), p%LowRes%oXYZ(3), p%LowRes%nXYZ(3), p%LowRes%nXYZ(1), p%LowRes%nXYZ(2), p%LowRes%dXYZ(3), m%Vdist_low_full, m%outVizXYPlane(:,:,:,1)) + + ! Create the output vtk file with naming /Low/DisXY.t.vtk FileName = trim(p%OutFileVTKRoot)//".Low.DisXY"//PlaneNumStr//"."//trim(Tstr)//".vtk" - call WrVTK_SP_header( FileName, "Low resolution, disturbed wind of XY Slice at time = "//trim(num2lstr(t))//" seconds.", Un, ErrStat2, ErrMsg2 ); if (Failed()) return; - call WrVTK_SP_vectors3D( Un, "Velocity", (/p%nX_low,p%nY_low,1_IntKi/), (/p%X0_low,p%Y0_low,p%OutDisWindZ(k)/), (/p%dX_low,p%dY_low,p%dZ_low/), m%outVizXYPlane, ErrStat2, ErrMsg2 ); if (Failed()) return; + call WrVTK_SP_header(FileName, "Low resolution, disturbed wind of XY Slice at time = "//trim(num2lstr(t))//" seconds.", Un, ErrStat2, ErrMsg2 ); if (Failed()) return; + call WrVTK_SP_vectors3D(Un, "Velocity", & + [p%LowRes%nXYZ(1), p%LowRes%nXYZ(2), 1_IntKi], & + [p%LowRes%oXYZ(1), p%LowRes%oXYZ(2), p%OutDisWindZ(k)], & + p%LowRes%dXYZ, m%outVizXYPlane, ErrStat2, ErrMsg2) + if (Failed()) return end do - ! YZ plane slices - do k = 1,p%NOutDisWindYZ - if (.not. p%OutDisWindXvalid(k)) cycle ! skip if invalid + ! YZ plane slices + do k = 1, p%NOutDisWindYZ + ! skip if invalid + if (.not. p%OutDisWindXvalid(k)) cycle write(PlaneNumStr, '(i3.3)') k - call ExtractSlice( YZSlice, p%OutDisWindX(k), p%X0_low, p%nX_low, p%nY_low, p%nZ_low, p%dX_low, m%Vdist_low_full, m%outVizYZPlane(:,:,:,1)) - ! Create the output vtk file with naming /Low/DisYZ.t.vtk + call ExtractSlice(YZSlice, p%OutDisWindX(k), p%LowRes%oXYZ(1), p%LowRes%nXYZ(1), p%LowRes%nXYZ(2), p%LowRes%nXYZ(3), p%LowRes%dXYZ(1), m%Vdist_low_full, m%outVizYZPlane(:,:,:,1)) + + ! Create the output vtk file with naming /Low/DisYZ.t.vtk FileName = trim(p%OutFileVTKRoot)//".Low.DisYZ"//PlaneNumStr//"."//trim(Tstr)//".vtk" - call WrVTK_SP_header( FileName, "Low resolution, disturbed wind of YZ Slice at time = "//trim(num2lstr(t))//" seconds.", Un, ErrStat2, ErrMsg2 ); if (Failed()) return; - call WrVTK_SP_vectors3D( Un, "Velocity", (/1,p%nY_low,p%nZ_low/), (/p%OutDisWindX(k),p%Y0_low,p%Z0_low/), (/p%dX_low,p%dY_low,p%dZ_low/), m%outVizYZPlane, ErrStat2, ErrMsg2 ); if (Failed()) return; + call WrVTK_SP_header(FileName, "Low resolution, disturbed wind of YZ Slice at time = "//trim(num2lstr(t))//" seconds.", Un, ErrStat2, ErrMsg2 ); if (Failed()) return; + call WrVTK_SP_vectors3D(Un, "Velocity", & + [1, p%LowRes%nXYZ(2), p%LowRes%nXYZ(3)], & + [p%OutDisWindX(k),p%LowRes%oXYZ(2),p%LowRes%oXYZ(3)], & + p%LowRes%dXYZ, m%outVizYZPlane, ErrStat2, ErrMsg2) + if (Failed()) return end do - ! XZ plane slices - do k = 1,p%NOutDisWindXZ - if (.not. p%OutDisWindYvalid(k)) cycle ! skip if invalid + ! XZ plane slices + do k = 1, p%NOutDisWindXZ + ! skip if invalid + if (.not. p%OutDisWindYvalid(k)) cycle write(PlaneNumStr, '(i3.3)') k - call ExtractSlice( XZSlice, p%OutDisWindY(k), p%Y0_low, p%nY_low, p%nX_low, p%nZ_low, p%dY_low, m%Vdist_low_full, m%outVizXZPlane(:,:,:,1)) - ! Create the output vtk file with naming /Low/DisXZ.t.vtk + call ExtractSlice(XZSlice, p%OutDisWindY(k), p%LowRes%oXYZ(2), p%LowRes%nXYZ(2), p%LowRes%nXYZ(1), p%LowRes%nXYZ(3), p%LowRes%dXYZ(2), m%Vdist_low_full, m%outVizXZPlane(:,:,:,1)) + + ! Create the output vtk file with naming /Low/DisXZ.t.vtk FileName = trim(p%OutFileVTKRoot)//".Low.DisXZ"//PlaneNumStr//"."//trim(Tstr)//".vtk" - call WrVTK_SP_header( FileName, "Low resolution, disturbed wind of XZ Slice at time = "//trim(num2lstr(t))//" seconds.", Un, ErrStat2, ErrMsg2 ); if (Failed()) return; - call WrVTK_SP_vectors3D( Un, "Velocity", (/p%nX_low,1,p%nZ_low/), (/p%X0_low,p%OutDisWindY(k),p%Z0_low/), (/p%dX_low,p%dY_low,p%dZ_low/), m%outVizXZPlane, ErrStat2, ErrMsg2 ); if (Failed()) return; + call WrVTK_SP_header(FileName, "Low resolution, disturbed wind of XZ Slice at time = "//trim(num2lstr(t))//" seconds.", Un, ErrStat2, ErrMsg2); if (Failed()) return; + call WrVTK_SP_vectors3D(Un, "Velocity", & + [p%LowRes%nXYZ(1), 1, p%LowRes%nXYZ(3)], & + [p%LowRes%oXYZ(1), p%OutDisWindY(k), p%LowRes%oXYZ(3)], & + p%LowRes%dXYZ, m%outVizXZPlane, ErrStat2, ErrMsg2) + if (Failed()) return end do end if contains + logical function Failed() call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) Failed = ErrStat >= AbortErrLev end function Failed + end subroutine AWAE_CalcOutput !---------------------------------------------------------------------------------------------------------------------------------- @@ -1759,10 +2104,10 @@ subroutine ValidateInitInputData( InputFileData, errStat, errMsg ) errStat = ErrID_None errMsg = "" - if ( (InputFileData%Mod_AmbWind < 1) .or. (InputFileData%Mod_AmbWind > 3) ) call SetErrStat ( ErrID_Fatal, 'Mod_AmbWind must be 1: high-fidelity precursor in VTK format, 2: one instance of InflowWind module, or 3: multiple instances of InflowWind module.', errStat, errMsg, RoutineName ) - if ( InputFileData%Mod_AmbWind == 1 ) then + select case (InputFileData%Mod_AmbWind) + case (1,4) if (len_trim(InputFileData%WindFilePath) == 0) call SetErrStat ( ErrID_Fatal, 'WindFilePath must contain at least one character.', errStat, errMsg, RoutineName ) - else + case (2,3) if (len_trim(InputFileData%InflowFile) == 0) call SetErrStat ( ErrID_Fatal, 'InflowFile must contain at least one character.', errStat, errMsg, RoutineName ) if ( (InputFileData%nX_low < 2) .or. (InputFileData%nY_low < 2) .or. (InputFileData%nZ_low < 2) ) & call SetErrStat ( ErrID_Fatal, 'The low resolution grid dimensions must contain a minimum of 2 nodes in each spatial direction. ', errStat, errMsg, RoutineName ) @@ -1770,10 +2115,11 @@ subroutine ValidateInitInputData( InputFileData, errStat, errMsg ) call SetErrStat ( ErrID_Fatal, 'The high resolution grid dimensions must contain a minimum of 2 nodes in each spatial direction. ', errStat, errMsg, RoutineName ) if ( (InputFileData%dX_low <= 0.0_ReKi) .or. (InputFileData%dY_low <= 0.0_ReKi) .or. (InputFileData%dY_low <= 0.0_ReKi) ) & call SetErrStat ( ErrID_Fatal, 'The low resolution spatial resolution must be greater than zero in each spatial direction. ', errStat, errMsg, RoutineName ) - end if + case default + call SetErrStat ( ErrID_Fatal, 'Mod_AmbWind must be 1: high-fidelity precursor in VTK format, 2: one instance of InflowWind module (will be deprecated in future), 3: multiple instances of InflowWind module, 4: high-fidelity precursor in AMReX format', errStat, errMsg, RoutineName ) + end select if ( InputFileData%NumTurbines < 1 ) call SetErrStat ( ErrID_Fatal, 'Number of turbines must be greater than zero.', errStat, errMsg, RoutineName ) - if ( InputFileData%NumPlanes < 2 ) call SetErrStat ( ErrID_Fatal, 'Number of wake planes must be greater than one.', errStat, errMsg, RoutineName ) if ( InputFileData%NumRadii < 2 ) call SetErrStat ( ErrID_Fatal, 'Number of radii in the radial finite-difference grid must be greater than one.', errStat, errMsg, RoutineName ) if ( InputFileData%dr <= 0.0) call SetErrStat ( ErrID_Fatal, 'dr must be greater than zero.', errStat, errMsg, RoutineName ) if (.not. ((InputFileData%Mod_Meander == 1) .or. (InputFileData%Mod_Meander == 2) .or. (InputFileData%Mod_Meander == 3)) ) call SetErrStat ( ErrID_Fatal, 'Mod_Meander must be equal to 1, 2, or 3.', errStat, errMsg, RoutineName ) @@ -1810,7 +2156,6 @@ subroutine AWAE_TEST_Init_BadData(errStat, errMsg) interval = 0.0_DbKi InitInp%InputFileData%WindFilePath = '' InitInp%InputFileData%NumTurbines = 0 - InitInp%InputFileData%NumPlanes = 0 InitInp%InputFileData%NumRadii = 0 InitInp%InputFileData%dr = 0.0_ReKi InitInp%InputFileData%Mod_Meander = 0 @@ -1830,7 +2175,6 @@ subroutine AWAE_TEST_SetGoodInitInpData(interval, InitInp) InitInp%InputFileData%WindFilePath = 'C:\Dev\OpenFAST-farm\OpenFAST-test\fast-farm\steady' InitInp%InputFileData%WindFilePath = 'Y:\Wind\Public\Projects\Projects F\FAST.Farm\AmbWind\04' InitInp%InputFileData%NumTurbines = 1 - InitInp%InputFileData%NumPlanes = 140 InitInp%InputFileData%NumRadii = 40 InitInp%InputFileData%dr = 5.0_ReKi InitInp%n_high_low = 6 @@ -1923,7 +2267,6 @@ subroutine AWAE_TEST_CalcOutput(errStat, errMsg) interval = 1.0_DbKi InitInp%InputFileData%WindFilePath = 'C:\Dev\NWTC Github\FAST.Farm\data' InitInp%InputFileData%NumTurbines = 3 - InitInp%InputFileData%NumPlanes = 500 InitInp%InputFileData%NumRadii = 40 InitInp%InputFileData%dr = 5.0_ReKi @@ -1935,7 +2278,7 @@ subroutine AWAE_TEST_CalcOutput(errStat, errMsg) ! Set up the inputs do nt = 1,p%NumTurbines - do np = 0,p%NumPlanes-1 + do np = 0,NINT(u%NumPlanes(nt))-1 do nz = -p%NumRadii+1,p%NumRadii-1 do ny = -p%NumRadii+1,p%NumRadii-1 u%Vx_wake(ny,nz,np,nt) = -1.0_ReKi @@ -1951,7 +2294,7 @@ subroutine AWAE_TEST_CalcOutput(errStat, errMsg) u%xhat_plane(3,:,:) = 0.0_ReKi do nt = 1,p%NumTurbines - do np = 0,p%NumPlanes-1 + do np = 0,NINT(u%NumPlanes(nt))-1 u%p_plane(1,np,nt) = 0.0_ReKi + 8.0*np*interval + 250.0_ReKi*(nt-1) u%p_Plane(2,np,nt) = 0.0_ReKi u%p_Plane(3,np,nt) = 90.0_ReKi @@ -2012,39 +2355,37 @@ subroutine TurbPlane(Uconv, t, nr, u_p, v_p, w_p) enddo end subroutine -FUNCTION INTERP3D(p,p0,del,V,within,nX,nY,nZ,Vbox) - ! I/O variables - Real(ReKi), INTENT( IN ) :: p(3) !< Position where the 3D velocity field will be interpreted (m) - Real(ReKi), INTENT( IN ) :: p0(3) !< Origin of the spatial domain (m) - Real(ReKi), INTENT( IN ) :: del(3) !< XYZ-components of the spatial increment of the domain (m) - INTEGER(IntKi), INTENT( IN) :: nX, nY, nZ !< Size of XYZ spatial dimensions - Real(SiKi), INTENT( IN ) :: V(3,0:nX-1,0:nY-1,0:nZ-1) !< 3D velocity field to be interpolated - - Real(SiKi) :: INTERP3D(3) !Vint(3) !< Interpolated velocity (m/s) - Logical, INTENT( OUT ) :: within !< Logical flag indicating weather or not the input position lies within the domain (flag) - REAL(ReKi), OPTIONAL, INTENT(OUT) :: Vbox(3,8) !< Wind velocities at the 8 points in the 3D spatial domain surrounding the input position - - ! Local variables - INTEGER(IntKi) :: i - Real(ReKi) :: f(3), N(8) - Real(SiKi) :: Vtmp(3,8) - INTEGER(IntKi) :: n_lo(3), n_hi(3) - - - !!! CHECK BOUNDS - within = .TRUE. +function Interp3D(p, p0, delta, V, within, Vbox) result(v_out) + real(ReKi), intent(in) :: p(3) !< Position where the 3D velocity field will be interpreted (m) + real(ReKi), intent(in) :: p0(3) !< Origin of the spatial domain (m) + real(ReKi), intent(in) :: delta(3) !< XYZ-components of the spatial increment of the domain (m) + real(SiKi), intent(in) :: V(:,:,:,:) !< 3D velocity field to be interpolated + logical, intent(out) :: within !< Logical flag indicating weather or not the input position lies within the domain (flag) + real(ReKi), optional, intent(out) :: Vbox(3,8) !< Wind velocities at the 8 points in the 3D spatial domain surrounding the input position + + real(SiKi) :: v_out(3) !< Interpolated velocity (m/s) + integer(IntKi) :: i + real(ReKi) :: f(3), N(8) + real(SiKi) :: Vtmp(3,8) + integer(IntKi) :: n_lo(3), n_hi(3) + + ! Determine if point is within the field being interpolated + within = .true. + f = (p - p0) / delta + n_lo = floor(f) + n_hi = n_lo + 1_IntKi + f = 2.0_ReKi*(f - real(n_lo,ReKi)) - 1.0_ReKi ! convert to value between -1 and 1 + n_lo = n_lo + 1_IntKi + n_hi = n_hi + 1_IntKi do i = 1, 3 - f(i) = (p(i)-p0(i))/del(i) - n_lo(i) = FLOOR(f(i)) - n_hi(i) = n_lo(i)+1_IntKi - f(i) = 2.0_ReKi*( f(i)-REAL(n_lo(i),ReKi) )-1.0_ReKi ! convert to value between -1 and 1 - if (( n_lo(i) < 0) .OR. (n_hi(i) > size(V,i+1)-1)) THEN - within = .FALSE. - END IF + if ((n_lo(i) < 1) .OR. (n_hi(i) > size(V,i+1))) then + within = .false. + end if end do - !!! INTERPOLATE - INTERP3D = 0.0_SiKi + v_out = 0.0_SiKi + + ! If point is within the grid, interpolate if (within) then N(1) = ((1.0_ReKi-f(1))*(1.0_ReKi-f(2))*(1.0_ReKi-f(3)))/8.0_ReKi @@ -2055,6 +2396,7 @@ FUNCTION INTERP3D(p,p0,del,V,within,nX,nY,nZ,Vbox) N(6) = ((1.0_ReKi+f(1))*(1.0_ReKi-f(2))*(1.0_ReKi+f(3)))/8.0_ReKi N(7) = ((1.0_ReKi-f(1))*(1.0_ReKi+f(2))*(1.0_ReKi+f(3)))/8.0_ReKi N(8) = ((1.0_ReKi+f(1))*(1.0_ReKi+f(2))*(1.0_ReKi+f(3)))/8.0_ReKi + Vtmp(:,1) = V(:,n_lo(1),n_lo(2),n_lo(3)) Vtmp(:,2) = V(:,n_hi(1),n_lo(2),n_lo(3)) Vtmp(:,3) = V(:,n_lo(1),n_hi(2),n_lo(3)) @@ -2064,27 +2406,27 @@ FUNCTION INTERP3D(p,p0,del,V,within,nX,nY,nZ,Vbox) Vtmp(:,7) = V(:,n_lo(1),n_hi(2),n_hi(3)) Vtmp(:,8) = V(:,n_hi(1),n_hi(2),n_hi(3)) - do i=1,8 + do i = 1, 8 ! To support complex terrain, the wind data will have NaNs at any point in the domain below the ground; throw away these points. - if ( Is_NaN( REAL(vtmp(1,i),DbKi) ) .OR. Is_NaN( REAL(vtmp(2,i),DbKi) ) .OR. Is_NaN( REAL(vtmp(3,i),DbKi) ) ) then + if (Is_NaN(real(vtmp(1,i), DbKi)) .OR. Is_NaN(real(vtmp(2,i), DbKi)) .OR. Is_NaN(real(vtmp(3,i), DbKi))) then within = .FALSE. - INTERP3D(:) = 0.0_SiKi - EXIT + v_out(:) = 0.0_SiKi + exit end if - INTERP3D(:) = INTERP3D(:) + N(i)*Vtmp(:,i) + v_out(:) = v_out(:) + N(i)*Vtmp(:,i) end do else - vtmp = 0.0_SiKi + Vtmp = 0.0_SiKi end if ! Output the wind velocities at the 8 points in the 3D spatial domain surrounding the input position (if necessary) - IF ( PRESENT( Vbox ) ) Vbox = REAL( Vtmp, ReKi ) + if (present(Vbox)) Vbox = REAL(Vtmp, ReKi) END FUNCTION INTERP3D diff --git a/modules/awae/src/AWAE_IO.f90 b/modules/awae/src/AWAE_IO.f90 index 17e79eed66..663c9e2dc5 100644 --- a/modules/awae/src/AWAE_IO.f90 +++ b/modules/awae/src/AWAE_IO.f90 @@ -26,7 +26,8 @@ MODULE AWAE_IO use NWTC_Library use VTK use AWAE_Types - + use iso_c_binding, only: c_char, c_int, c_double, c_float, c_null_char + use amrex_utils implicit none @@ -34,66 +35,44 @@ MODULE AWAE_IO character(*), parameter :: AWAE_Nickname = 'AWAE' public :: AWAE_IO_InitGridInfo - public :: ReadLowResWindFile + public :: ReadLowResWindVTK, ReadWindAMReX + + interface + subroutine ReadVTK_inflow_info(FileName, Desc, dims, origin, gridSpacing, vecLabel, values, read_values, err_stat, err_msg) BIND(C,name='ReadVTK_inflow_info') + use iso_c_binding, only: c_char, c_int, c_double, c_float, c_null_char + implicit none + character(kind=c_char), intent(in) :: FileName(*) + character(kind=c_char), intent(out) :: Desc(1024) + integer(c_int), intent(out) :: dims(3) + real(c_double), intent(out) :: origin(3) + real(c_double), intent(out) :: gridSpacing(3) + character(kind=c_char), intent(out) :: vecLabel(1024) + real(c_float), intent(out) :: values(*) + integer(c_int), intent(in) :: read_values + integer(c_int), intent(out) :: err_stat + character(kind=c_char), intent(out) :: err_msg(1024) + end subroutine + end interface contains -subroutine HiResWindCheck(n, nt, dims1, gridSpacing1, origin1, dims2, gridSpacing2, origin2, callingRoutine, errMsg, errStat) - integer(IntKi), intent(in ) :: n !< high-resolution time step number (0-based) - integer(IntKi), intent(in ) :: nt !< turbine number - integer(IntKi), intent(in ) :: dims1(3) !< dimensions of the grid for turbine nt at high-res time step 0 (m) - real(ReKi), intent(in ) :: gridSpacing1(3) !< spacing between grid points for turbine nt at high-res time step 0 (m) - real(ReKi), intent(in ) :: origin1(3) !< starting coordinates of the grid for turbine nt at high-res time step 0 (m) - integer(IntKi), intent(in ) :: dims2(3) !< dimensions of the grid for turbine nt at high-res time step n (m) - real(ReKi), intent(in ) :: gridSpacing2(3)!< spacing between grid points for turbine nt at high-res time step n (m) - real(ReKi), intent(in ) :: origin2(3) !< starting coordinates of the grid for turbine nt at high-res time step n (m) - character(*), intent(in ) :: callingRoutine !< string containing the name of the calling routine. - integer(IntKi), intent( out) :: errStat !< Error status of the operation - character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None - - ! grid must have two points in each direction - if ( (dims1(1) < 2) .or. (dims1(2) < 2) .or. (dims1(3) < 2) ) then - call SetErrStat ( ErrID_Fatal, 'The high resolution grid dimensions must contain a minimum of 2 nodes in each spatial direction. Turbine #'//trim(num2lstr(nt))//', time step '//trim(num2lstr(n)), errStat, errMsg, callingRoutine ) - return - end if - - ! All turbines and all time steps must have the same grid dimensions due to array allocation assumptions - if ( any(dims1 .ne. dims2) ) then - call SetErrStat ( ErrID_Fatal, 'The high resolution grid dimensions for turbine #'//trim(num2lstr(nt))//' and high-res time step '//trim(num2lstr(n))//' do not match turbine #1 and time step 0.', errStat, errMsg, callingRoutine ) - return - end if - - ! spacing must be consistent for a given turbine across all time steps - if ( any(gridSpacing1 .ne. gridSpacing2) ) then - call SetErrStat ( ErrID_Fatal, 'The high resolution grid spacing for turbine #'//trim(num2lstr(nt))//' and high-res time step '//trim(num2lstr(n))//' do not match time step 0.', errStat, errMsg, callingRoutine ) - return - end if - - ! verify origin of any given turbine is not changing with time step. - if ( any(origin1 .ne. origin2) ) then - call SetErrStat ( ErrID_Fatal, 'The high resolution grid origin for turbine #'//trim(num2lstr(nt))//' and high-res time step '//trim(num2lstr(n))//' do not match time step 0.', errStat, errMsg, callingRoutine ) - return - end if - -end subroutine HiResWindCheck - subroutine WriteDisWindFiles( n, WrDisSkp1, p, y, m, errStat, errMsg ) - integer(IntKi), intent(in ) :: n !< Low-resolution time step increment - integer(IntKi), intent(in ) :: WrDisSkp1 !< Number of low resolution time step increments per one output increment + integer(IntKi), intent(in ) :: n !< Low-resolution time step increment + integer(IntKi), intent(in ) :: WrDisSkp1 !< Number of low resolution time step increments per one output increment type(AWAE_ParameterType), intent(in ) :: p !< Parameters - type(AWAE_OutputType), intent(in ) :: y !< Outputs + type(AWAE_OutputType), intent(in ) :: y !< Outputs type(AWAE_MiscVarType), intent(inout) :: m !< Misc/optimization variables integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None - CHARACTER(1024) :: FileName - INTEGER(IntKi) :: Un ! unit number of opened file - INTEGER(IntKi) :: ErrStat2 ! Temporary Error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary Error message - CHARACTER(*), PARAMETER :: RoutineName = 'WriteDisWindFiles' - INTEGER(IntKi) :: nt, n_out - REAL(ReKi) :: t_out - character(p%VTK_tWidth) :: Tstr ! string for current VTK write-out step (padded with zeros) + CHARACTER(*),PARAMETER :: RoutineName = 'WriteDisWindFiles' + INTEGER(IntKi) :: ErrStat2 ! Temporary Error status + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary Error message + CHARACTER(1024) :: FileName + INTEGER(IntKi) :: Un ! unit number of opened file + INTEGER(IntKi) :: nt, n_out + REAL(ReKi) :: t_out + character(p%VTK_tWidth) :: Tstr ! string for current VTK write-out step (padded with zeros) n_out = n/WrDisSkp1 t_out = n*p%DT_low @@ -105,7 +84,7 @@ subroutine WriteDisWindFiles( n, WrDisSkp1, p, y, m, errStat, errMsg ) call WrVTK_SP_header( FileName, "Low resolution disturbed wind for time = "//trim(num2lstr(t_out))//" seconds.", Un, errStat2, errMsg2 ) call SetErrStat(errStat2, errMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call WrVTK_SP_vectors3D( Un, "Velocity", (/p%nX_low,p%nY_low,p%nZ_low/), (/p%X0_low,p%Y0_low,p%Z0_low/), (/p%dX_low,p%dY_low,p%dZ_low/), m%Vdist_low, errStat2, errMsg2 ) + call WrVTK_SP_vectors3D( Un, "Velocity", p%LowRes%nXYZ, p%LowRes%oXYZ, p%LowRes%dXYZ, m%Vdist_low, errStat2, errMsg2 ) call SetErrStat(errStat2, errMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -117,7 +96,8 @@ subroutine WriteDisWindFiles( n, WrDisSkp1, p, y, m, errStat, errMsg ) call WrVTK_SP_header( FileName, "High resolution disturbed wind for time = "//trim(num2lstr(t_out))//" seconds.", Un, errStat2, errMsg2 ) call SetErrStat(errStat2, errMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call WrVTK_SP_vectors3D( Un, "Velocity", (/p%nX_high,p%nY_high,p%nZ_high/), (/p%X0_high(nt),p%Y0_high(nt),p%Z0_high(nt)/), (/p%dX_high(nt),p%dY_high(nt),p%dZ_high(nt)/), y%Vdist_high(nt)%data(:,:,:,:,1), errStat2, errMsg2 ) + + call WrVTK_SP_vectors3D( Un, "Velocity", p%HighRes(nt)%nXYZ, p%HighRes(nt)%oXYZ, p%HighRes(nt)%dXYZ, y%Vdist_high(nt)%data(:,:,:,:,1), errStat2, errMsg2 ) call SetErrStat(ErrStat2, errMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -128,60 +108,91 @@ end subroutine WriteDisWindFiles !---------------------------------------------------------------------------------------------------------------------------------- !> This subroutine read the low res wind file (VTK) at a given time step `n` -subroutine ReadLowResWindFile(n, p, Vamb_Low, errStat, errMsg) +subroutine ReadLowResWindVTK(n, p, Vamb_Low, errStat, errMsg) integer(IntKi), intent(in ) :: n !< Current simulation timestep increment (zero-based) type(AWAE_ParameterType), intent(in ) :: p !< Parameters - real(SiKi), intent(inout) :: Vamb_Low(:,0:,0:,0:) !< Array which will contain the low resolution grid of ambient wind velocities + real(SiKi), contiguous, intent(inout) :: Vamb_Low(:,0:,0:,0:) !< Array which will contain the low resolution grid of ambient wind velocities integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None - integer(IntKi) :: dims(3) ! dimension of the 3D grid (nX,nY,nZ) - real(ReKi) :: origin(3) ! the lower-left corner of the 3D grid (X0,Y0,Z0) - real(ReKi) :: gridSpacing(3) ! spacing between grid points in each of the 3 directions (dX,dY,dZ) - integer(IntKi) :: Un ! unit number of opened file - character(1024) :: FileName ! Name of output file - character(1024) :: descr ! Line describing the contents of the file - character(1024) :: vecLabel ! descriptor of the vector data + integer(IntKi) :: dims(3) ! Dimension of the 3D grid (nX,nY,nZ) + real(R8Ki) :: origin(3) ! The lower-left corner of the 3D grid (X0,Y0,Z0) + real(R8Ki) :: gridSpacing(3) ! Spacing between grid points in each of the 3 directions (dX,dY,dZ) + character(kind=c_char) :: FileName(2048) ! Name of output file + character(kind=c_char) :: desc(1024) ! Line describing the contents of the file + character(kind=c_char) :: vecLabel(1024) ! descriptor of the vector data errStat = ErrID_None errMsg = "" - FileName = trim(p%WindFilePath)//trim(PathSep)//"Low"//trim(PathSep)//"Amb.t"//trim(num2lstr(n))//".vtk" - Un = 0; ! Initialization different from -1, important to prevent file closing - call ReadVTK_SP_info( FileName, descr, dims, origin, gridSpacing, vecLabel, Un, ErrStat, ErrMsg ) - if (ErrStat >= AbortErrLev) return - call ReadVTK_SP_vectors( FileName, Un, dims, Vamb_Low, ErrStat, ErrMsg ) -end subroutine ReadLowResWindFile + FileName = transfer(trim(p%WindFilePath)//trim(PathSep)//"Low"//trim(PathSep)//"Amb.t"//trim(Num2LStr(n))//".vtk"//c_null_char, FileName) + call ReadVTK_inflow_info(FileName, desc, dims, origin, gridSpacing, vecLabel, Vamb_Low, 1, ErrStat, ErrMsg) + if (ErrStat /= ErrID_None) ErrMsg = "ReadLowResWindVTK:"//trim(ErrMsg) + +end subroutine ReadLowResWindVTK + !---------------------------------------------------------------------------------------------------------------------------------- !> This subroutine read the high res wind file (VTK) at a given time step `n` -subroutine ReadHighResWindFile(nt, n, p, Vamb_high, errStat, errMsg) +subroutine ReadHighResWindVTK(nt, n, p, Vamb_high, errStat, errMsg) integer(IntKi), intent(in ) :: nt integer(IntKi), intent(in ) :: n !< high-res time increment type(AWAE_ParameterType), intent(in ) :: p !< Parameters - real(SiKi), intent(inout) :: Vamb_high(:,0:,0:,0:) !< Array which will contain the low resolution grid of ambient wind velocities + real(SiKi), contiguous, intent(inout) :: Vamb_high(:,0:,0:,0:) !< Array which will contain the low resolution grid of ambient wind velocities integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if errStat /= ErrID_None - - integer(IntKi) :: dims(3) ! dimension of the 3D grid (nX,nY,nZ) - real(ReKi) :: origin(3) ! the lower-left corner of the 3D grid (X0,Y0,Z0) - real(ReKi) :: gridSpacing(3) ! spacing between grid points in each of the 3 directions (dX,dY,dZ) - integer(IntKi) :: Un ! unit number of opened file - character(1024) :: FileName ! Name of output file - character(1024) :: descr ! Line describing the contents of the file - character(1024) :: vecLabel ! descriptor of the vector data + integer(IntKi) :: dims(3) ! Dimension of the 3D grid (nX,nY,nZ) + real(R8Ki) :: origin(3) ! The lower-left corner of the 3D grid (X0,Y0,Z0) + real(R8Ki) :: gridSpacing(3) ! Spacing between grid points in each of the 3 directions (dX,dY,dZ) + character(kind=c_char) :: FileName(2048) ! Name of output file + character(kind=c_char) :: desc(1024) ! Line describing the contents of the file + character(kind=c_char) :: vecLabel(1024) ! descriptor of the vector data errStat = ErrID_None errMsg = "" - FileName = trim(p%WindFilePath)//trim(PathSep)//"HighT"//trim(num2lstr(nt))//trim(PathSep)//"Amb.t"//trim(num2lstr(n))//".vtk" - Un = 0; ! Initialization different from -1, important to prevent file closing - call ReadVTK_SP_info( FileName, descr, dims, origin, gridSpacing, vecLabel, Un, ErrStat, ErrMsg ) - if (ErrStat >= AbortErrLev) return - call ReadVTK_SP_vectors( FileName, Un, dims, Vamb_high, ErrStat, ErrMsg ) - -end subroutine ReadHighResWindFile + FileName = transfer(trim(p%WindFilePath)//trim(PathSep)//"HighT"//trim(num2lstr(nt))//trim(PathSep)//"Amb.t"//trim(num2lstr(n))//".vtk"//c_null_char, FileName) + call ReadVTK_inflow_info(FileName, desc, dims, origin, gridSpacing, vecLabel, Vamb_high, 1, ErrStat, ErrMsg) + if (ErrStat /= ErrID_None) ErrMsg = "ReadHighResWindVTK:"//trim(ErrMsg) + +end subroutine ReadHighResWindVTK + + +!---------------------------------------------------------------------------------------------------------------------------------- +!> This subroutine read the AMReX at a given time step `n` +subroutine ReadWindAMReX(sv, n, p, Vamb, ErrStat, ErrMsg) + use amrex_utils + + integer(IntKi), intent(in ) :: sv ! Sub-volume {0: low-res, 1+: high-res turbine} + integer(IntKi), intent(in ) :: n !< time increment + type(AWAE_ParameterType), intent(in ) :: p !< Parameters + real(SiKi), contiguous, intent(inout) :: Vamb(:,:,:,:) !< Array which will contain the grid of ambient wind velocities + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if errStat /= ErrID_None + + character(len=2048) :: FileName ! Name of output file + character(len=12) :: DirIndex ! Directory index suffix + integer(IntKi) :: i + + ! If sub-volume is 0 then this is low-resolution file + if (sv == 0) then + write(DirIndex,'(i'//trim(Num2LStr(p%DirIndexLen))//')') p%DirStartNum + p%DirIndexDeltaLow * n + else + write(DirIndex,'(i'//trim(Num2LStr(p%DirIndexLen))//')') p%DirStartNum + p%DirIndexDeltaHigh * n + end if + + ! Prepend zeros in front of index number + do i = 1, p%DirIndexLen + if (DirIndex(i:i) /= " ") exit + DirIndex(i:i) = '0' + end do + + FileName = trim(p%WindFilePath)//"_"//trim(num2lstr(sv))//"_"//DirIndex(1:p%DirIndexLen) + call amrex_read_data(FileName, Vamb, ErrStat, ErrMsg) + +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- !> Flat array of Cartesian point coordinates !! Grid runs from (X0, Y0, Z0) to (X0 + (p%nX-1)*dX, Y0+ (p%nY-1)*dY, Z0+ (p%nZ-1)*dZ) @@ -215,268 +226,539 @@ subroutine AWAE_IO_InitGridInfo(InitInp, p, InitOut, errStat, errMsg) integer(IntKi), intent( out) :: errStat character(*), intent( out) :: errMsg - integer(IntKi) :: NumGrid_high - integer(IntKi) :: errStat2 ! temporary error status of the operation - character(ErrMsgLen) :: errMsg2 ! temporary error message character(*), parameter :: RoutineName = 'AWAE_IO_InitGridInfo' - integer(IntKi) :: i, k, nXYZ_low, nx_low, ny_low, nz_low, nXYZ_high, nx_high, ny_high, nz_high + integer(IntKi) :: ErrStat2 ! temporary error status of the operation + character(ErrMsgLen) :: ErrMsg2 ! temporary error message + integer(IntKi) :: i, j, k + integer(IntKi) :: nXYZ_low, nx_low, ny_low, nz_low + integer(IntKi) :: nXYZ_high, nx_high, ny_high, nz_high integer(IntKi) :: dims(3) ! dimension of the 3D grid (nX,nY,nZ) real(ReKi) :: origin(3) ! the lower-left corner of the 3D grid (X0,Y0,Z0) real(ReKi) :: gridSpacing(3) ! spacing between grid points in each of the 3 directions (dX,dY,dZ) real(ReKi) :: gridSpacingWAT(3) ! + real(DbKi) :: Time character(1024) :: FileName ! Name of output file - character(1024) :: descr ! Line describing the contents of the file + character(1024) :: desc ! Line describing the contents of the file character(1024) :: vecLabel ! descriptor of the vector data integer(IntKi) :: Un ! file unit integer(IntKi) :: n, nt, nh, n_high_low, nhigh - + real(ReKi) :: gridRatio ! Temporary real for checking WAT resolution + character(ErrMsgLen) :: TmpMsg ! Temporary Error message text for WAT resolution checks + real(ReKi), parameter :: fstretch = 2.0_ReKi ! stretching factor for checking WAT resolution + real(ReKi) :: TargetChunkSize + integer(IntKi) :: nChunksX, nChunksY + integer(IntKi) :: nChunkPointsX, nChunkPointsY + integer(IntKi), allocatable :: ChunkIndicesX(:,:), ChunkIndicesY(:,:) + integer(IntKi) :: StartIndexNum, IndexDelta errStat = ErrID_None errMsg = "" + !============================================================================ + ! Low-resolution grid + !============================================================================ + + ! Get grid origin, spacing, and dimensions depending on wind type + select case (p%Mod_AmbWind) - ! -------------------------------------------------------------------------------- - ! --- LOW RES - ! -------------------------------------------------------------------------------- - !--------------------------------------------------------------------------- - ! Parse time 0.0, low res wind input file to gather the grid - ! information and set data associated with the low res grid - !--------------------------------------------------------------------------- - - if ( p%Mod_AmbWind == 1 ) then + ! VTK-based inflow + case (1) + + ! Parse time 0.0, low res wind input file to gather the grid information FileName = trim(p%WindFilePath)//trim(PathSep)//"Low"//trim(PathSep)//"Amb.t0.vtk" Un = -1 ! Set to force closing of file on return - call ReadVTK_SP_info( FileName, descr, dims, origin, gridSpacing, vecLabel, Un, ErrStat, ErrMsg ) - if (ErrStat >= AbortErrLev) return - - if ( (dims(1) < 2) .or. (dims(2) < 2) .or. (dims(3) < 2) ) then - call SetErrStat ( ErrID_Fatal, 'The low resolution grid dimensions most contain a minimum of 2 nodes in each spatial direction.', errStat, errMsg, RoutineName ) - return - end if - else - ! Using InflowWind, so data has been passed in via the InitInp data structure + call ReadVTK_SP_info(FileName, desc, dims, origin, gridSpacing, vecLabel, Un, ErrStat2, ErrMsg2) + if (Failed()) return + + ! InflowWind-based inflow + case (2,3) + + ! Grid dimensions from initialization input + dims(1) = InitInp%InputFileData%nX_low + dims(2) = InitInp%InputFileData%nY_low + dims(3) = InitInp%InputFileData%nZ_low + + ! Grid origin from initialization input origin(1) = InitInp%InputFileData%X0_low origin(2) = InitInp%InputFileData%Y0_low origin(3) = InitInp%InputFileData%Z0_low - dims(1) = InitInp%InputFileData%nX_low - dims(2) = InitInp%InputFileData%nY_low - dims(3) = InitInp%InputFileData%nZ_low + + ! Grid spacing from initialization input gridSpacing(1) = InitInp%InputFileData%dX_low gridSpacing(2) = InitInp%InputFileData%dY_low gridSpacing(3) = InitInp%InputFileData%dZ_low - - end if - ! --- Checks for grid spacing - if ( (gridSpacing(1) <= 0.0_ReKi) .or. (gridSpacing(2) <= 0.0_ReKi) .or. (gridSpacing(3) <= 0.0_ReKi) ) & - call SetErrStat ( ErrID_Fatal, 'The low resolution spatial resolution for Turbine 1 must be greater than zero in each spatial direction. ', errStat, errMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return + ! AMReX-based inflow + case (4) - p%X0_low = origin(1) - p%Y0_low = origin(2) - p%Z0_low = origin(3) - p%nX_low = dims(1) - p%nY_low = dims(2) - p%nZ_low = dims(3) - p%dX_low = gridSpacing(1) - p%dY_low = gridSpacing(2) - p%dZ_low = gridSpacing(3) - - InitOut%X0_Low = origin(1) - InitOut%Y0_low = origin(2) - InitOut%Z0_low = origin(3) - InitOut%nX_Low = dims(1) - InitOut%nY_low = dims(2) - InitOut%nZ_low = dims(3) - InitOut%dX_low = gridSpacing(1) - InitOut%dY_low = gridSpacing(2) - InitOut%dZ_low = gridSpacing(3) - - p%NumGrid_low = p%nX_Low*p%nY_Low*p%nZ_Low - - p%dXYZ_Low = gridSpacing - p%dpol = (gridSpacing(1)+gridSpacing(2)+gridSpacing(3))/3.0_ReKi - p%n_rp_max = ceiling(pi*((p%C_Meander*((p%NumRadii-1)*InitInp%InputFileData%dr+p%dpol))/p%dpol)**2.0_ReKi) + ! Read first low-res file + FileName = trim(p%WindFilePath)//"_0_"//p%DirStartIndex + call amrex_read_header(FileName, Time, dims, gridSpacing, origin, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Search directory for time slices of this sub-volume + call amrex_find_subvols(p%WindFilePath, 0, p%dt_low, p%NumDT, p%DirStartIndex, & + StartIndexNum, p%DirIndexDeltaLow, ErrStat2, ErrMsg2) + if (Failed()) return + + end select + + !---------------------------------------------------------------------------- + ! Check low-res grid properties + !---------------------------------------------------------------------------- + + ! If the grid spacing is less than or equal to zero, return error + if (any(gridSpacing <= 0.0_ReKi)) then + call SetErrStat(ErrID_Fatal, 'Low resolution spatial resolution must be greater than zero in each spatial direction. ', errStat, errMsg, RoutineName) + return + endif + + ! If any grid dimensions are less than 2, return error + if (any(dims < 2)) then + call SetErrStat(ErrID_Fatal, 'Low resolution grid dimensions must be >= 2 in all directions.', errStat, errMsg, RoutineName) + return + end if + + !---------------------------------------------------------------------------- + ! Save properties in low-res grid + !---------------------------------------------------------------------------- - ! Set coordinates of points in a flat array (Grid_low) - call AllocAry( p%Grid_low, 3, p%NumGrid_low, 'Grid_low', errStat2, errMsg2); if(Failed()) return - call flatCartGridCoordinates(origin, dims, gridSpacing, p%Grid_low) + p%LowRes%oXYZ = origin + p%LowRes%dXYZ = gridSpacing + p%LowRes%nXYZ = dims + p%LowRes%nPoints = product(dims) + p%LowRes%Size = gridSpacing * real(dims - 1, ReKi) + p%LowRes%Center = origin + 0.5_ReKi * p%LowRes%Size + ! Polar data + p%dPol = (gridSpacing(1)+gridSpacing(2)+gridSpacing(3))/3.0_ReKi + p%n_rp_max = ceiling(pi*((p%C_Meander*((p%NumRadii-1)*InitInp%InputFileData%dr+p%dPol))/p%dPol)**2.0_ReKi) + + ! Set coordinates of points in a flat array + call AllocAry(p%LowRes%GridPoints, 3, p%LowRes%nPoints, 'LowRes%GridPoints', errStat2, errMsg2); if(Failed()) return + call flatCartGridCoordinates(origin, dims, gridSpacing, p%LowRes%GridPoints) + + ! Save low-res grid initialization output + InitOut%oXYZ_Low = origin + InitOut%nXYZ_Low = dims + InitOut%dXYZ_Low = gridSpacing + + !---------------------------------------------------------------------------- + ! Check that all low-res wind files have the same grid dimensions + !---------------------------------------------------------------------------- + + if (InitInp%InputFileData%ChkWndFiles) then + + select case (p%Mod_AmbWind) + + ! VTK-based inflow + case (1) + + ! Loop through step indices + ! Start at 1 because the first step was already checked + do n = 1, p%NumDT-1 + + ! Read VTK header for low-res wind data + FileName = trim(p%WindFilePath)//trim(PathSep)//"Low"//trim(PathSep)//"Amb.t"//trim(Num2LStr(n))//".vtk" + Un = -1 ! Set to force closing of file on return + call ReadVTK_SP_info(FileName, desc, dims, origin, gridSpacing, vecLabel, Un, ErrStat, ErrMsg) + if (ErrStat >= AbortErrLev) return + + ! Check that VTK properties match grid + call CheckLowResGridProps(p%LowRes, n, origin, gridSpacing, dims, ErrStat, ErrMsg) + end do + + end select + end if + + !---------------------------------------------------------------------------- + ! Divide low-resolution grid into chunks for selectively updating the domain + !---------------------------------------------------------------------------- + + ! Approximate a chunk size based on the max wake diameter + TargetChunkSize = p%y(p%NumRadii-1) + + ! Target number of points in each chunk + nChunkPointsX = nint(TargetChunkSize/p%LowRes%dXYZ(1), IntKi) + nChunkPointsY = nint(TargetChunkSize/p%LowRes%dXYZ(2), IntKi) + + nChunksX = int(ceiling(real(p%LowRes%nXYZ(1), ReKi) / real(nChunkPointsX, ReKi)), IntKi) + nChunksY = int(ceiling(real(p%LowRes%nXYZ(2), ReKi) / real(nChunkPointsY, ReKi)), IntKi) + + ! Allocate arrays to store chunk start and end indices for X dimension, check that each chunk has at least 2 points + call AllocAry(ChunkIndicesX, 2, nChunksX, 'ChunkIndicesX', errStat2, errMsg2); if(Failed()) return + call BalancedChunks(p%LowRes%nXYZ(1), nChunksX, ChunkIndicesX, errStat2, errMsg2); if(Failed()) return + do i = 1, nChunksX + if (ChunkIndicesX(2,i) - ChunkIndicesX(1,i) + 1 < 2) then + call SetErrStat(ErrID_Fatal, 'Chunk size in X direction is less than 2.', errStat, errMsg, RoutineName) + return + end if + end do - ! -------------------------------------------------------------------------------- - ! --- HIGH RES - ! -------------------------------------------------------------------------------- - call AllocAry(InitOut%X0_high, p%NumTurbines, 'X0_high', errStat2, errMsg2); if(Failed()) return - call AllocAry(InitOut%Y0_high, p%NumTurbines, 'Y0_high', errStat2, errMsg2); if(Failed()) return - call AllocAry(InitOut%Z0_high, p%NumTurbines, 'Z0_high', errStat2, errMsg2); if(Failed()) return - call AllocAry(InitOut%dX_high, p%NumTurbines, 'dX_high', errStat2, errMsg2); if(Failed()) return - call AllocAry(InitOut%dY_high, p%NumTurbines, 'dY_high', errStat2, errMsg2); if(Failed()) return - call AllocAry(InitOut%dZ_high, p%NumTurbines, 'dZ_high', errStat2, errMsg2); if(Failed()) return - call AllocAry( p%X0_high, p%NumTurbines, 'X0_high', errStat2, errMsg2); if(Failed()) return - call AllocAry( p%Y0_high, p%NumTurbines, 'Y0_high', errStat2, errMsg2); if(Failed()) return - call AllocAry( p%Z0_high, p%NumTurbines, 'Z0_high', errStat2, errMsg2); if(Failed()) return - call AllocAry( p%dX_high, p%NumTurbines, 'dX_high', errStat2, errMsg2); if(Failed()) return - call AllocAry( p%dY_high, p%NumTurbines, 'dY_high', errStat2, errMsg2); if(Failed()) return - call AllocAry( p%dZ_high, p%NumTurbines, 'dZ_high', errStat2, errMsg2); if(Failed()) return + ! Allocate arrays to store chunk start and end indices for Y dimension, check that each chunk has at least 2 points + call AllocAry(ChunkIndicesY, 2, nChunksY, 'ChunkIndicesY', errStat2, errMsg2); if(Failed()) return + call BalancedChunks(p%LowRes%nXYZ(2), nChunksY, ChunkIndicesY, errStat2, errMsg2); if(Failed()) return + do i = 1, nChunksY + if (ChunkIndicesY(2,i) - ChunkIndicesY(1,i) + 1 < 2) then + call SetErrStat(ErrID_Fatal, 'Chunk size in Y direction is less than 2.', errStat, errMsg, RoutineName) + return + end if + end do + ! Allocate array to store chunk information + allocate(p%LowRes%WakeChunks(nChunksX*nChunksY), stat=errStat2) + if (errStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Allocation failure for p%LowRes%WakeChunks array.', errStat, errMsg, RoutineName) + return + end if + + ! Loop through chunks and populate data + k = 0 + do i = 1, nChunksX + do j = 1, nChunksY + k = k + 1 + associate (chunk => p%LowRes%WakeChunks(k)) + chunk%iChunk = [i, j, 1] + chunk%iSubGridX = ChunkIndicesX(:,i) + chunk%iSubGridY = ChunkIndicesY(:,j) + chunk%iSubGridZ = [1, p%LowRes%nXYZ(3)] ! All points in Z + chunk%nPoints = (ChunkIndicesX(2,i) - ChunkIndicesX(1,i) + 1) * & + (ChunkIndicesY(2,j) - ChunkIndicesY(1,j) + 1) * & + p%LowRes%nXYZ(3) + call AllocAry(chunk%iGridPoints, chunk%nPoints, "iGridPoints", ErrStat2, ErrMsg2); if (Failed()) return + call ChunkPointIndices(p%LowRes%nXYZ, chunk%iSubGridX, chunk%iSubGridY, chunk%iSubGridZ, chunk%iGridPoints) + chunk%oXYZ = [p%LowRes%oXYZ(1) + (chunk%iSubGridX(1) - 1) * p%LowRes%dXYZ(1), & + p%LowRes%oXYZ(2) + (chunk%iSubGridY(1) - 1) * p%LowRes%dXYZ(2), & + p%LowRes%oXYZ(3)] + chunk%Size = [(chunk%iSubGridX(2) - chunk%iSubGridX(1)) * p%LowRes%dXYZ(1), & + (chunk%iSubGridY(2) - chunk%iSubGridY(1)) * p%LowRes%dXYZ(2), & + p%LowRes%Size(3)] + chunk%Center = chunk%oXYZ + chunk%Size / 2.0_ReKi + chunk%Radius = norm2(chunk%Size(1:2)) / 2.0_ReKi ! XY only for k-d tree + end associate + end do + end do + + !============================================================================ + ! High-resolution grid + !============================================================================ + + ! Allocate array of high-res parameter data + allocate(p%HighRes(p%NumTurbines), stat=errStat2); if (errStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Allocation failure for p%HighRes array.', errStat, errMsg, RoutineName) + return + end if + + ! Allocate initialization output arrays + call AllocAry(InitOut%oXYZ_high, 3, p%NumTurbines, 'oXYZ_high', errStat2, errMsg2); if(Failed()) return + call AllocAry(InitOut%dXYZ_high, 3, p%NumTurbines, 'dXYZ_high', errStat2, errMsg2); if(Failed()) return + call AllocAry(InitOut%nXYZ_high, 3, p%NumTurbines, 'nXYZ_high', errStat2, errMsg2); if(Failed()) return + + ! If wake-added turbulence is enabled, calculate spacing if (p%WAT_Enabled) then - gridSpacingWAT = (/ 0.0_ReKi, 1/p%WAT_FlowField%Grid3D%InvDY, 1/p%WAT_FlowField%Grid3D%InvDZ /) + gridSpacingWAT = [0.0_ReKi, 1/p%WAT_FlowField%Grid3D%InvDY, 1/p%WAT_FlowField%Grid3D%InvDZ] endif - !--------------------------------------------------------------------------- - ! Parse the turbine's 1st timestep, high res wind input files to - ! gather the grid information and set data associated with those turbines - !--------------------------------------------------------------------------- + !---------------------------------------------------------------------------- + ! Loop through high-resolution grids (one per turbine) + !---------------------------------------------------------------------------- do nt = 1, p%NumTurbines - - if ( p%Mod_AmbWind == 1 ) then - FileName = trim(p%WindFilePath)//trim(PathSep)//"HighT"//trim(num2lstr(nt))//trim(PathSep)//"Amb.t0.vtk" + + ! Get high-res grid origin, dimensions, and spacing based on wind type + select case (p%Mod_AmbWind) + + ! VTK-based wind + case (1) + Un = -1 ! Set to force closing of file on return - call ReadVTK_SP_info( FileName, descr, dims, origin, gridSpacing, vecLabel, Un, ErrStat2, ErrMsg2 ) - call SetErrStat( ErrStat2, ErrMsg2, errStat, errMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return - else - ! Using InflowWind, so data has been passed in via the InitInp data structure + FileName = trim(p%WindFilePath)//trim(PathSep)//"HighT"//trim(num2lstr(nt))//trim(PathSep)//"Amb.t0.vtk" + call ReadVTK_SP_info(FileName, desc, dims, origin, gridSpacing, vecLabel, Un, ErrStat2, ErrMsg2) + if(Failed()) return + + ! InflowWind-based wind + case (2,3) + + ! Grid dimensions from initialization input (same for all high-res grids) + dims(1) = InitInp%InputFileData%nX_high + dims(2) = InitInp%InputFileData%nY_high + dims(3) = InitInp%InputFileData%nZ_high + + ! Grid origin from initialization input origin(1) = InitInp%InputFileData%X0_high(nt) origin(2) = InitInp%InputFileData%Y0_high(nt) origin(3) = InitInp%InputFileData%Z0_high(nt) - dims(1) = InitInp%InputFileData%nX_high - dims(2) = InitInp%InputFileData%nY_high - dims(3) = InitInp%InputFileData%nZ_high + + ! Grid spacing from initialization input gridSpacing(1) = InitInp%InputFileData%dX_high(nt) gridSpacing(2) = InitInp%InputFileData%dY_high(nt) gridSpacing(3) = InitInp%InputFileData%dZ_high(nt) - end if - - ! --- Checks for grid spacing - call checkHighResSpacing(iWT=nt); if(Failed()) return - - if (nt==1) then - p%nX_high = dims(1) - p%nY_high = dims(2) - p%nZ_high = dims(3) - NumGrid_high = p%nX_high*p%nY_high*p%nZ_high - call AllocAry( p%Grid_high, 3, NumGrid_high, p%NumTurbines, 'Grid_high', errStat2, errMsg2); if(Failed()) return - endif - p%X0_high(nt) = origin(1) - p%Y0_high(nt) = origin(2) - p%Z0_high(nt) = origin(3) - p%dX_high(nt) = gridSpacing(1) - p%dY_high(nt) = gridSpacing(2) - p%dZ_high(nt) = gridSpacing(3) + ! AMReX-based wind + case (4) - - if ( p%Mod_AmbWind == 1 ) then - ! Using this to make sure dims are >=2 points in each direction, and number of grid points in each direction matches turbine 1. Other tests will be true. - call HiResWindCheck(0, nt, (/p%nX_high, p%nY_high, p%nZ_high/), (/p%dX_high(nt), p%dY_high(nt), p%dZ_high(nt)/), (/p%X0_high(nt), p%Y0_high(nt), p%Z0_high(nt)/), dims, gridSpacing, origin, RoutineName, errMsg2, errStat2); if (Failed()) return - end if + FileName = trim(p%WindFilePath)//"_"//trim(Num2LStr(nt))//"_"//p%DirStartIndex + call amrex_read_header(FileName, Time, dims, gridSpacing, origin, ErrStat2, ErrMsg2) + if (Failed()) return - ! Set coordinates of points in a flat array (Grid_low) - call flatCartGridCoordinates(origin, dims, gridSpacing, p%Grid_high(:,:,nt)) - - end do - - ! --- Transfer from parameters to InitOut - InitOut%X0_high(:) = p%X0_high(:) - InitOut%Y0_high(:) = p%Y0_high(:) - InitOut%Z0_high(:) = p%Z0_high(:) - InitOut%dX_high(:) = p%dX_high(:) - InitOut%dY_high(:) = p%dY_high(:) - InitOut%dZ_high(:) = p%dZ_high(:) - InitOut%nx_high = p%nx_high - InitOut%ny_high = p%ny_high - InitOut%nz_high = p%nz_high - + ! Search directory for time slices of this sub-volume + call amrex_find_subvols(p%WindFilePath, nt, p%dt_high, p%NumDT*p%n_high_low-1, p%DirStartIndex, & + StartIndexNum, IndexDelta, ErrStat2, ErrMsg2) + if (Failed()) return - ! --- Check low res for all time steps and turbines - if ( (InitInp%InputFileData%ChkWndFiles) .and. (p%Mod_AmbWind == 1) ) then - do n=1,p%NumDT-1 ! We have already checked the first low res time step - - FileName = trim(p%WindFilePath)//trim(PathSep)//"Low"//trim(PathSep)//"Amb.t"//trim(num2lstr(n))//".vtk" - Un = -1 ! Set to force closing of file on return - call ReadVTK_SP_info( FileName, descr, dims, origin, gridSpacing, vecLabel, Un, ErrStat, ErrMsg ) - if (ErrStat >= AbortErrLev) return - - ! verify dims, origin, gridSpacing match the first input file - if ( ( dims(1) .ne. p%nX_low ) .or. ( dims(2) .ne. p%nY_low ) .or. ( dims(3) .ne. p%nZ_low ) ) then - call SetErrStat ( ErrID_Fatal, 'The low resolution grid dimensions for time step '//trim(num2lstr(n))//' do not match time step 0.', errStat, errMsg, RoutineName ) - return - end if - if ( ( origin(1) .ne. InitOut%X0_Low ) .or. ( origin(2) .ne. InitOut%Y0_Low ) .or. ( origin(3) .ne. InitOut%Z0_Low ) ) then - call SetErrStat ( ErrID_Fatal, 'The low resolution grid origins for time step '//trim(num2lstr(n))//' do not match time step 0.', errStat, errMsg, RoutineName ) + ! If first turbine, save index delta, otherwise ensure that it is the same + if (nt == 1) then + p%DirIndexDeltaHigh = IndexDelta + else if (p%DirIndexDeltaHigh /= IndexDelta) then + call SetErrStat(ErrID_Fatal, "got different index delta for sub-volume "//trim(Num2LStr(nt))//" than for sub-volume 1", & + ErrStat, ErrMsg, RoutineName) return - end if - if ( ( gridSpacing(1) .ne. p%dX_low ) .or. ( gridSpacing(2) .ne. p%dY_low ) .or. ( gridSpacing(3) .ne. p%dZ_low ) ) then - call SetErrStat ( ErrID_Fatal, 'The low resolution grid spacing for time step '//trim(num2lstr(n))//' do not match time step 0.', errStat, errMsg, RoutineName ) - return - end if - - end do - end if - - ! --- Check all high res for all time steps and turbines - if ( (InitInp%InputFileData%ChkWndFiles) .and. (p%Mod_AmbWind == 1) ) then - do nt=1,p%NumTurbines - do n=0,p%NumDT-1 ! We have already checked the first high-res files associated with n=0, but need to check the remaining, so for simplicity of code we will repeat the check on the first file - - ! We only have one high res input for for the very last low res timestep - if ( n == (p%NumDT-1) ) then - n_high_low = 1 - else - n_high_low = p%n_high_low - end if - - do nh=1,n_high_low - nhigh = nh+n*p%n_high_low-1 - FileName = trim(p%WindFilePath)//trim(PathSep)//"HighT"//trim(num2lstr(nt))//trim(PathSep)//"Amb.t"//trim(num2lstr(nhigh))//".vtk" !TODO: Should the turbine numbers be padding with leading zero(es)? - Un = -1 ! Set to force closing of file on return - call ReadVTK_SP_info( FileName, descr, dims, origin, gridSpacing, vecLabel, Un, ErrStat2, ErrMsg2 ) - call SetErrStat( ErrStat2, ErrMsg2, errStat, errMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return - - call HiResWindCheck(nhigh, nt, (/p%nX_high, p%nY_high, p%nZ_high/), (/p%dX_high(nt), p%dY_high(nt), p%dZ_high(nt)/), (/p%X0_high(nt), p%Y0_high(nt), p%Z0_high(nt)/), dims, gridSpacing, origin, RoutineName, errMsg2, errStat2); if (Failed()) return - - end do - end do - end do - end if - -contains + end if - logical function Failed() - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - Failed = ErrStat >= AbortErrLev - end function Failed + end select - subroutine checkHighResSpacing(iWT) - integer(IntKi) :: iWT - real(ReKi) :: gridRatio ! Temporary real for checking WAT resolution - integer(IntKi) :: k - character(ErrMsgLen) :: TmpMsg ! Temporary Error message text for WAT resolution checks - real(ReKi), parameter :: fstretch = 2.0_ReKi ! stretching factor for checking WAT resolution + !------------------------------------------------------------------------- + ! Check grid properties + !------------------------------------------------------------------------- - if ( (gridSpacing(1) <= 0.0_ReKi) .or. (gridSpacing(2) <= 0.0_ReKi) .or. (gridSpacing(3) <= 0.0_ReKi) ) then - errStat2 = ErrID_Fatal - errMsg2 = 'The high resolution spatial resolution for Turbine '//trim(num2lstr(iWT))//' must be greater than zero in each spatial direction. ' + ! If the grid spacing is less than or equal to zero, return error + if (any(gridSpacing <= 0.0_ReKi)) then + call SetErrStat(ErrID_Fatal, 'The high resolution spatial resolution for Turbine '//trim(num2lstr(nt))//' must be greater than zero in each spatial direction. ', errStat, errMsg, RoutineName) return endif + ! If any grid dimensions are less than 2, return error + if (any(dims < 2)) then + call SetErrStat(ErrID_Fatal, 'High resolution grid dimensions must be >= 2 in all directions.', errStat, errMsg, RoutineName) + return + end if + + ! Checks for grid spacing if (p%WAT_Enabled) then - TmpMsg='Ratio of high res domain resolution to wake added turblence resolution should be between '//trim(Num2LStr(1.0_ReKi/fstretch))//' and '//trim(Num2LStr(fstretch))//', but is ' - do k=2,3 + do k= 2, 3 gridRatio = gridSpacing(k)/gridSpacingWAT(k) if (gridRatio < 1.0_ReKi/fstretch .or. gridRatio > fstretch) then - errStat2 = ErrID_Fatal - errMsg2 = trim(TmpMsg)//' '//trim(Num2LStr(gridSpacing(k)))//' / '//trim(Num2LStr(gridSpacingWAT(k)))// ' = '//trim(Num2LStr(gridRatio))//' for turbine '//trim(Num2LStr(iWT))//' in X.' + call SetErrStat(ErrID_Fatal, & + 'Ratio of high res domain resolution to wake added turbulence resolution should be between '// & + trim(Num2LStr(1.0_ReKi/fstretch))//' and '//trim(Num2LStr(fstretch))//', but is '// & + trim(Num2LStr(gridSpacing(k)))//' / '//trim(Num2LStr(gridSpacingWAT(k)))// ' = '// & + trim(Num2LStr(gridRatio))//' for turbine '//trim(Num2LStr(nt))//' in X.', & + errStat, errMsg, RoutineName) return endif - enddo + end do endif - end subroutine checkHighResSpacing + + !------------------------------------------------------------------------- + ! Set properties in high-res grid + !------------------------------------------------------------------------- + + p%HighRes(nt)%WT_Position = InitInp%InputFileData%WT_Position(:,nt) + p%HighRes(nt)%oXYZ = origin + p%HighRes(nt)%dXYZ = gridSpacing + p%HighRes(nt)%nXYZ = dims + p%HighRes(nt)%nPoints = product(dims) + p%HighRes(nt)%Size = gridSpacing * real(dims - 1, ReKi) + p%HighRes(nt)%Center = origin + 0.5_ReKi * p%HighRes(nt)%Size + p%HighRes(nt)%Radius = norm2(p%HighRes(nt)%Size(1:2)) / 2.0_ReKi ! XY only for k-d tree + + ! Allocate and set coordinates of grid points in a flat array + call AllocAry(p%HighRes(nt)%GridPoints, 3, p%HighRes(nt)%nPoints, 'HighRes%GridPoints', errStat2, errMsg2); if (Failed()) return + + ! Calculate grid coordinates as a flattened array + call flatCartGridCoordinates(origin, dims, gridSpacing, p%HighRes(nt)%GridPoints) + + ! Set high-res parameters in InitOut + InitOut%oXYZ_high(:,nt) = p%HighRes(nt)%oXYZ + InitOut%dXYZ_high(:,nt) = p%HighRes(nt)%dXYZ + InitOut%nXYZ_high(:,nt) = p%HighRes(nt)%nXYZ + + !------------------------------------------------------------------------- + ! Check that all high-res wind files have the same grid properties + !------------------------------------------------------------------------- + + if (InitInp%InputFileData%ChkWndFiles) then + + select case (p%Mod_AmbWind) + + ! VTK-based inflow + case (1) + + ! We have already checked the first high-res files associated with n=0, + ! but need to check the remaining, so for simplicity of code we will repeat the check on the first file + do n = 0, p%NumDT-1 + + ! We only have one high res input for for the very last low res time step + if (n == (p%NumDT-1)) then + n_high_low = 1 + else + n_high_low = p%n_high_low + end if + + ! Loop through high-res time slices + do nh = 1, n_high_low + + ! Step index + nhigh = nh + n*p%n_high_low - 1 + + ! Read VTK info + FileName = trim(p%WindFilePath)//trim(PathSep)//"HighT"//trim(Num2LStr(nt))//trim(PathSep)//"Amb.t"//trim(Num2LStr(nhigh))//".vtk" + Un = -1 ! Set to force closing of file on return + call ReadVTK_SP_info(FileName, desc, dims, origin, gridSpacing, vecLabel, Un, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Check that file properties match high-res grid + call CheckHighResGridProps(p%HighRes(nt), nt, nhigh, origin, gridSpacing, dims, ErrStat2, ErrMsg2) + if (Failed()) return + end do + end do + + end select + end if + end do + +contains + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed end subroutine AWAE_IO_InitGridInfo +pure subroutine ChunkPointIndices(dims, ix, iy, iz, indices) + integer, intent(in) :: dims(3), ix(2), iy(2), iz(2) + integer, intent(inout) :: indices(:) + integer :: i, j, k, n + n = 0 + do k = iz(1), iz(2) + do j = iy(1), iy(2) + do i = ix(1), ix(2) + n = n + 1 + indices(n) = i + (j - 1) * dims(1) + (k - 1) * dims(1) * dims(2) + end do + end do + end do +end subroutine + +! Divide 1..N points into n_chunks of nearly equal size +subroutine BalancedChunks(N, n_chunks, chunk_indices, ErrStat, ErrMsg) + integer, intent(in) :: N, n_chunks + integer, intent(out) :: chunk_indices(:,:) + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'BalancedChunks' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: base, remainder, i, offset + + ErrStat = ErrID_None + ErrMsg = "" + + if (n_chunks <= 0) then + call SetErrStat(ErrID_Fatal, "n_chunks must be positive", ErrStat, ErrMsg, RoutineName) + return + end if + + if (N < 0) then + call SetErrStat(ErrID_Fatal, "N must be nonnegative", ErrStat, ErrMsg, RoutineName) + return + end if + + base = N / n_chunks + remainder = mod(N, n_chunks) + + offset = 0 + do i = 1, n_chunks + ! First 'remainder' chunks get one extra point + if (i <= remainder) then + chunk_indices(1,i) = offset + 1 + chunk_indices(2,i) = offset + base + 1 + offset = offset + base + 1 + else + chunk_indices(1,i) = offset + 1 + chunk_indices(2,i) = offset + base + offset = offset + base + end if + end do +end subroutine + + + + +subroutine CheckLowResGridProps(Grid, step, origin, spacing, dims, ErrStat, ErrMsg) + type(LRGParamType), intent(in) :: Grid + integer(IntKi), intent(in) :: step + real(ReKi), intent(in) :: origin(3), spacing(3) + integer(IntKi), intent(in) :: dims(3) + integer(IntKi), intent(out) :: ErrStat ! temporary error status of the operation + character(ErrMsgLen), intent(out) :: ErrMsg ! temporary error message + + character(*), parameter :: RoutineName = 'CheckLowResGridProps' + + ErrStat = ErrID_None + ErrMsg = "" + + ! Verify that low-res wind file dimensions match input + if (any(dims /= Grid%nXYZ)) then + call SetErrStat(ErrID_Fatal, 'The low resolution grid dimensions for time step '// & + trim(Num2LStr(step))//' do not match time step 0.', errStat, errMsg, RoutineName) + return + end if + + ! Verify that low-res wind file origin matches input + if (any(origin /= Grid%oXYZ)) then + call SetErrStat(ErrID_Fatal, 'The low resolution grid origins for time step '// & + trim(Num2LStr(step))//' do not match time step 0.', errStat, errMsg, RoutineName) + return + end if + + ! Verify that low-res wind file grid spacing matches input + if (any(spacing /= Grid%dXYZ)) then + call SetErrStat(ErrID_Fatal, 'The low resolution grid spacing for time step '// & + trim(Num2LStr(step))//' do not match time step 0.', errStat, errMsg, RoutineName) + return + end if +end subroutine + +subroutine CheckHighResGridProps(Grid, iWT, step, origin, spacing, dims, ErrStat, ErrMsg) + type(HRGParamType), intent(in) :: Grid + integer(IntKi), intent(in) :: iWT, step + real(ReKi), intent(in) :: origin(3), spacing(3) + integer(IntKi), intent(in) :: dims(3) + integer(IntKi), intent(out) :: ErrStat ! temporary error status of the operation + character(ErrMsgLen), intent(out) :: ErrMsg ! temporary error message + + character(*), parameter :: RoutineName = 'CheckHighResGridProps' + + ErrStat = ErrID_None + ErrMsg = "" + + ! If inflow grid dimensions do not match grid, return error + if (any(dims /= Grid%nXYZ)) then + call SetErrStat(ErrID_Fatal, 'The high resolution grid dimensions for turbine #'//trim(Num2LStr(iWT))// & + ' and high-res time step '//trim(Num2LStr(step))//' do not match turbine #1 and time step 0.', & + errStat, errMsg, RoutineName) + return + end if + + ! If inflow grid spacing does not match grid, return error + if (any(spacing /= Grid%dXYZ)) then + call SetErrStat(ErrID_Fatal, 'The high resolution grid spacing for turbine #'//trim(Num2LStr(iWT))// & + ' and high-res time step '//trim(Num2LStr(step))//' do not match time step 0.', & + errStat, errMsg, RoutineName) + return + end if + + ! If inflow grid origin does not match grid, return error + if (any(origin /= Grid%oXYZ)) then + call SetErrStat(ErrID_Fatal, 'The high resolution grid origin for turbine #'//trim(Num2LStr(iWT))// & + ' and high-res time step '//trim(Num2LStr(step))//' do not match time step 0.', & + errStat, errMsg, RoutineName) + return + end if +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE AWAE_PrintSum( p, u, y, ErrStat, ErrMsg ) ! This routine generates the summary file, which contains a summary of input file options. diff --git a/modules/awae/src/AWAE_Registry.txt b/modules/awae/src/AWAE_Registry.txt index 5627f31bf3..7a52d7e940 100644 --- a/modules/awae/src/AWAE_Registry.txt +++ b/modules/awae/src/AWAE_Registry.txt @@ -31,7 +31,6 @@ typedef AWAE/AWAE AWAE_InputFileType ReKi dr - - - typedef ^ ^ DbKi dt_low - - - "Low-resolution (FAST.Farm driver/glue code) time step" s typedef ^ ^ IntKi NumTurbines - - - "Number of wind turbines in the farm [>=1]" - typedef ^ ^ IntKi NumRadii - - - "Number of radii in the radial finite-difference grid [>=2]" - -typedef ^ ^ IntKi NumPlanes - - - "Number of wake planes downwind of the rotor where the wake is propagated [>=2]" - typedef ^ ^ CHARACTER(1024) WindFilePath - - - "Path name to the Root folder containing the wind data files from ABLSolver precursor" - typedef ^ ^ LOGICAL WrDisWind - - - "Write disturbed wind data to /Low/Dis.t.vtk etc.?" - typedef ^ ^ IntKi NOutDisWindXY - - - "Number of XY planes for output of disturbed wind data across the low-resolution domain to /Low/DisXY..t.vtk [0 to 9]" - @@ -46,6 +45,7 @@ typedef ^ ^ IntKi Mod_Meander - - - typedef ^ ^ ReKi C_Meander - - - "Calibrated parameter for wake meandering [>=1.0] [DEFAULT=1.9]" - typedef ^ ^ IntKi Mod_AmbWind - - - "Ambient wind model {1: high-fidelity precursor in VTK format, 2: InflowWind module}" - typedef ^ ^ CHARACTER(1024) InflowFile - - - "Name of file containing InflowWind module input parameters" - +typedef ^ ^ character(12) DirStartIndex - - - "Starting directory index suffix for AMReX wind" - typedef ^ ^ DbKi dt_high - - - "High-resolution (FAST) time step" s typedef ^ ^ ReKi X0_high {:} - - "X-component of the origin of the high-resolution spatial domain for each turbine" m typedef ^ ^ ReKi Y0_high {:} - - "Y-component of the origin of the high-resolution spatial domain for each turbine" m @@ -76,6 +76,7 @@ typedef ^ ^ IntKi Mod_Projection - - - typedef ^ InitInputType AWAE_InputFileType InputFileData - - - "FAST.Farm input-file data for AWAE module" - typedef ^ InitInputType IntKi n_high_low - - - "Number of high-resolution time steps per low" - typedef ^ InitInputType IntKi NumDT - - - "Number of low-resolution (FAST.Farm driver/glue code) time steps" - +typedef ^ InitInputType IntKi MaxPlanes - - - "Maximum number of wake planes downwind of the rotor where the wake is propagated [>=2]" - typedef ^ InitInputType CHARACTER(1024) OutFileRoot - - - "The root name derived from the primary FAST.Farm input file" - #wake added turbulence (WAT) typedef ^ ^ Logical WAT_Enabled - .false. - "Is WAT enabled?" - @@ -86,41 +87,29 @@ typedef ^ InitInputType FlowFieldType *WAT_FlowField - - - "Pointer #typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - #typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - -typedef ^ InitOutputType ReKi X0_high {:} - - "X-component of the origin of the high-resolution spatial domain for each turbine" m -typedef ^ InitOutputType ReKi Y0_high {:} - - "Y-component of the origin of the high-resolution spatial domain for each turbine" m -typedef ^ InitOutputType ReKi Z0_high {:} - - "Z-component of the origin of the high-resolution spatial domain for each turbine" m -typedef ^ InitOutputType ReKi dX_high {:} - - "X-component of the spatial increment of the high-resolution spatial domain for each turbine" m -typedef ^ InitOutputType ReKi dY_high {:} - - "Y-component of the spatial increment of the high-resolution spatial domain for each turbine" m -typedef ^ InitOutputType ReKi dZ_high {:} - - "Z-component of the spatial increment of the high-resolution spatial domain for each turbine" m -typedef ^ InitOutputType IntKi nX_high - - - "Number of high-resolution spatial nodes in X direction " - -typedef ^ InitOutputType IntKi nY_high - - - "Number of high-resolution spatial nodes in Y direction" - -typedef ^ InitOutputType IntKi nZ_high - - - "Number of high-resolution spatial nodes in Z direction" - -typedef ^ InitOutputType ReKi dX_low - - - "The spacing of the low-resolution nodes in X direction" m -typedef ^ InitOutputType ReKi dY_low - - - "The spacing of the low-resolution nodes in Y direction" m -typedef ^ InitOutputType ReKi dZ_low - - - "The spacing of the low-resolution nodes in Z direction" m -typedef ^ InitOutputType IntKi nX_low - - - "Number of low-resolution spatial nodes in X direction" - -typedef ^ InitOutputType IntKi nY_low - - - "Number of low-resolution spatial nodes in Y direction" - -typedef ^ InitOutputType IntKi nZ_low - - - "Number of low-resolution spatial nodes in Z direction" - -typedef ^ InitOutputType ReKi X0_low - - - "X-component of the origin of the low-resolution spatial domain" m -typedef ^ InitOutputType ReKi Y0_low - - - "Y-component of the origin of the low-resolution spatial domain" m -typedef ^ InitOutputType ReKi Z0_low - - - "Z-component of the origin of the low-resolution spatial domain" m +typedef ^ InitOutputType ReKi oXYZ_high {:}{:} - - "XYZ components of the origin of the high-resolution spatial domain for each turbine" m +typedef ^ InitOutputType ReKi dXYZ_high {:}{:} - - "XYZ components of the spatial increment of the high-resolution spatial domain for each turbine" m +typedef ^ InitOutputType IntKi nXYZ_high {:}{:} - - "Number of high-resolution spatial nodes in XYZ directions" - +typedef ^ InitOutputType ReKi dXYZ_low {3} - - "The spacing of the low-resolution nodes in XYZ directions" m +typedef ^ InitOutputType IntKi nXYZ_low {3} - - "Number of low-resolution spatial nodes in XYZ directions" - +typedef ^ InitOutputType ReKi oXYZ_low {3} - - "XYZ components of the origin of the low-resolution spatial domain" m typedef ^ InitOutputType AWAE_HighWindGridPtr Vdist_High {:} - - "Pointers to Wind velocity of disturbed wind (ambient + wakes) across each high-resolution domain around a turbine for each high-resolution step within a low-resolution step" m/s # ..... States .................................................................................................................... # Define continuous (differentiable) states here: -typedef ^ ContinuousStateType InflowWind_ContinuousStateType IfW {:} - - "Dummy IfW continuous states" - +typedef ^ ContinuousStateType ReKi Dummy - - - "Dummy continuous states" - # Define discrete (nondifferentiable) states here: -typedef ^ DiscreteStateType InflowWind_DiscreteStateType IfW {:} - - "Dummy IfW discrete states" - +typedef ^ DiscreteStateType ReKi Dummy - - - "Dummy discrete states" - #wake added turbulence -typedef ^ DiscreteStateType ReKi WAT_B_Box {3} - - "Position of passive tracer used to offset the WAT box at each low res time step" m -typedef ^ DiscreteStateType ReKi Ufarm {3} - - "mean velocity of all disk average flow for all turbines in farm" m/s +typedef ^ DiscreteStateType ReKi WAT_B_Box {3} - - "Position of passive tracer used to offset the WAT box at each low res time step" m +typedef ^ DiscreteStateType ReKi Ufarm {3} - - "mean velocity of all disk average flow for all turbines in farm" m/s # Define constraint states here: -typedef ^ ConstraintStateType InflowWind_ConstraintStateType IfW {:} - - "Dummy IfW constraint states" - +typedef ^ ConstraintStateType ReKi Dummy - - - "Dummy constraint states" - # Define any other states, including integer or logical states here: -typedef ^ OtherStateType InflowWind_OtherStateType IfW {:} - - "Dummy IfW other states" - +typedef ^ OtherStateType ReKi Dummy - - - "Dummy other states" - # ..... Misc/Optimization variables................................................................................................. # Define any data that are used only for efficiency purposes (these variables are not associated with time): @@ -130,6 +119,14 @@ typedef ^ MiscVarType ReKi Vamb_lowpol {:}{:} - - "UVW components typedef ^ MiscVarType SiKi Vdist_low {:}{:}{:}{:} - - "UVW components of disturbed wind (ambient + deficits) across the low-resolution domain throughout the farm" m/s typedef ^ MiscVarType SiKi Vdist_low_full {:}{:}{:}{:} - - "UVW components of disturbed wind (ambient + deficits) across the low-resolution domain throughout the farm, for outputs" m/s typedef ^ MiscVarType AWAE_HighWindGrid Vamb_High {:} - - "UVW components of ambient wind across each high-resolution domain around a turbine (one for each turbine) for each high-resolution time step within a low-resolution time step" m/s +typedef ^ MiscVarType KdTreeType KdT - - - "K-d Tree structure for fast lookup of wake points" - +typedef ^ MiscVarType IntKi KdTPointData {:}{:} - - "Plane and turbine index for points in K-d tree" - +typedef ^ MiscVarType IntKi KdTResults {:} - - "KdTree search result indices" - +typedef ^ MiscVarType ReKi AllPlanePoints {:}{:} - - "X,Y plane coordinates for points (all planes/turbines) in K-d tree" - +typedef ^ MiscVarType IntKi iPlaneTurbTurb {:}{:}{:} - - "First and Last plane index by source turbine and destination turbine index" - +typedef ^ MiscVarType IntKi iPlaneTurbChunk {:}{:}{:} - - "First and Last plane index by source turbine and destination chunk index" - +typedef ^ MiscVarType Logical LowResChunkHasWake {:} - - "Low-res gridFirst and Last plane index by source turbine and destination chunk index" - +typedef ^ MiscVarType ReKi MaxWakePointSep - - - "Maximum separation between wake points" - typedef ^ MiscVarType Logical parallelFlag {:}{:} - - "" - typedef ^ MiscVarType ReKi r_s {:}{:} - - "" - typedef ^ MiscVarType ReKi r_e {:}{:} - - "" - @@ -141,16 +138,49 @@ typedef ^ MiscVarType ReKi pvec_ce {:}{:}{:} - - "" - typedef ^ MiscVarType SiKi outVizXYPlane {:}{:}{:}{:} - - "An array holding the output data for a 2D visualization slice" - typedef ^ MiscVarType SiKi outVizYZPlane {:}{:}{:}{:} - - "An array holding the output data for a 2D visualization slice" - typedef ^ MiscVarType SiKi outVizXZPlane {:}{:}{:}{:} - - "An array holding the output data for a 2D visualization slice" - -typedef ^ MiscVarType InflowWind_MiscVarType IfW {:} - - "InflowWind module misc vars" - typedef ^ MiscVarType InflowWind_InputType u_IfW_Low - - - "InflowWind module inputs for the low-resolution grid" - -typedef ^ MiscVarType InflowWind_InputType u_IfW_High - - - "InflowWind module inputs for the high-resolution grid" - +typedef ^ MiscVarType InflowWind_InputType u_IfW_High {:} - - "InflowWind module inputs for the high-resolution grid" - typedef ^ MiscVarType InflowWind_OutputType y_IfW_Low - - - "InflowWind module outputs for the low-resolution grid" - -typedef ^ MiscVarType InflowWind_OutputType y_IfW_High - - - "InflowWind module outputs for the high-resolution grid" - +typedef ^ MiscVarType InflowWind_OutputType y_IfW_High {:} - - "InflowWind module outputs for the high-resolution grid" - #wake added turbulence typedef ^ MiscVarType ReKi V_amb_low_disk {:}{:} - - "Rotor averaged ambiend wind speed for each wind turbine (3 x nWT)" m/s typedef ^ MiscVarType IntKi planeDomainExit {:}{:} 0 - "Value indicates edge number (0: still in domain, +/-1: +/-X, +/-2: +/-Y, +/-3: +/-Z) the plane crossed" - +# Low-resolution grid chunk data +typedef ^ LRGChunkType IntKi iChunk {3} - - "XYZ index of chunk" - +typedef ^ LRGChunkType IntKi iSubGridX {2} - - "start and end grid indices in X direction" - +typedef ^ LRGChunkType IntKi iSubGridY {2} - - "start and end grid indices in Y direction" - +typedef ^ LRGChunkType IntKi iSubGridZ {2} - - "start and end grid indices in Z direction" - +typedef ^ LRGChunkType IntKi iGridPoints {:} - - "Indices into GridPoints array to get locations" - +typedef ^ LRGChunkType IntKi nPoints - - - "Number of points in sub-grid" - +typedef ^ LRGChunkType ReKi oXYZ {3} - - "XYZ components of the origin of the resolution spatial domain" m +typedef ^ LRGChunkType ReKi Size {3} - - "size of the grid chunk" m +typedef ^ LRGChunkType ReKi Center {3} - - "center coordinates of the grid chunk" m +typedef ^ LRGChunkType ReKi Radius - - - "Radius of cylinder encompassing grid" m + +# Low-resolution grid parameter data +typedef ^ LRGParamType ReKi oXYZ {3} - - "XYZ components of the origin of the resolution spatial domain" m +typedef ^ LRGParamType ReKi dXYZ {3} - - "XYZ components of the spatial increment of the spatial domain" m +typedef ^ LRGParamType IntKi nXYZ {3} - - "Number of spatial nodes in XYZ directions" - +typedef ^ LRGParamType IntKi nPoints - - - "Number of spatial nodes" - +typedef ^ LRGParamType ReKi GridPoints {:}{:} - - "XYZ components (global positions) of the spatial discretization of the grid" m +typedef ^ LRGParamType ReKi Size {3} - - "XYZ size of the grid" m +typedef ^ LRGParamType ReKi Center {3} - - "XYZ coordinates of the grid center" m +typedef ^ LRGParamType LRGChunkType WakeChunks {:} - - "Chunks for updating grid from wake" - + + +# High-resolution grid parameter data +typedef ^ HRGParamType ReKi WT_Position {3} - - "Turbine position" m +typedef ^ HRGParamType ReKi oXYZ {3} - - "XYZ components of the origin of the resolution spatial domain" m +typedef ^ HRGParamType ReKi dXYZ {3} - - "XYZ components of the spatial increment of the spatial domain" m +typedef ^ HRGParamType IntKi nXYZ {3} - - "Number of spatial nodes in XYZ directions" - +typedef ^ HRGParamType IntKi nPoints - - - "Number of spatial nodes" - +typedef ^ HRGParamType ReKi GridPoints {:}{:} - - "XYZ components (global positions) of the spatial discretization of the grid" m +typedef ^ HRGParamType ReKi Size {3} - - "XYZ size of the grid" m +typedef ^ HRGParamType ReKi Center {3} - - "XYZ coordinates of the grid center" m +typedef ^ HRGParamType ReKi Radius - - - "Radius of cylinder encompassing grid" m + # ..... Parameters ................................................................................................................ # Define parameters here: @@ -158,35 +188,14 @@ typedef ^ MiscVarType IntKi planeDomainExit {:}{:} 0 - "Value indi typedef ^ ParameterType CHARACTER(1024) WindFilePath - - - "Path name to the Root folder containing the wind data files from ABLSolver precursor" - typedef ^ ParameterType IntKi NumTurbines - - - "Number of wind turbines in the farm [>=1]" - typedef ^ ParameterType IntKi NumRadii - - - "Number of radii in the radial finite-difference grid [>=2]" - -typedef ^ ParameterType IntKi NumPlanes - - - "Number of wake planes downwind of the rotor where the wake is propagated [>=2]" - +typedef ^ ParameterType IntKi MaxPlanes - - - "Maximum number of wake planes downwind of the rotor where the wake is propagated [>=2]" - +typedef ^ ParameterType LRGParamType LowRes - - - "Low-resolution grid data" - +typedef ^ ParameterType HRGParamType HighRes {:} - - "High-resolution grid data" - typedef ^ ParameterType ReKi y {:} - - "Horizontal discretization of the wake planes" m typedef ^ ParameterType ReKi z {:} - - "Vertical discretization of the wake planes" m +typedef ^ ParameterType ReKi dPol - - - "Spatial resolution of the polar grid for each wake plane of each turbine" m typedef ^ ^ IntKi Mod_AmbWind - - - "Ambient wind model {1: high-fidelity precursor in VTK format, 2: InflowWind module}" - -typedef ^ ParameterType IntKi nX_low - - - "Number of low-resolution spatial nodes in X direction" - -typedef ^ ParameterType IntKi nY_low - - - "Number of low-resolution spatial nodes in Y direction" - -typedef ^ ParameterType IntKi nZ_low - - - "Number of low-resolution spatial nodes in Z direction" - -typedef ^ ParameterType IntKi NumGrid_low - - - "Total number of low-resolution spatial nodes" - typedef ^ ParameterType IntKi n_rp_max - - - "Maximum possible number of points in the polar grid for the wake plane at each rotor" - -typedef ^ ParameterTYpe ReKi dpol - - - "Spatial resolution of the polar grid for each wake plane of each turbine" m -typedef ^ ParameterType ReKi dXYZ_low {3} - - "XYZ-components of the spatial increment of the low-resolution domain" m -typedef ^ ParameterType ReKi dX_low - - - "The spacing of the low-resolution nodes in X direction" m -typedef ^ ParameterType ReKi dY_low - - - "The spacing of the low-resolution nodes in Y direction" m -typedef ^ ParameterType ReKi dZ_low - - - "The spacing of the low-resolution nodes in Z direction" m -typedef ^ ParameterType ReKi X0_low - - - "X-component of the origin of the low-resolution spatial domain" m -typedef ^ ParameterType ReKi Y0_low - - - "Y-component of the origin of the low-resolution spatial domain" m -typedef ^ ParameterType ReKi Z0_low - - - "Z-component of the origin of the low-resolution spatial domain" m -typedef ^ ParameterType ReKi X0_high {:} - - "X-component of the origin of the high-resolution spatial domain for each turbine" m -typedef ^ ParameterType ReKi Y0_high {:} - - "Y-component of the origin of the high-resolution spatial domain for each turbine" m -typedef ^ ParameterType ReKi Z0_high {:} - - "Z-component of the origin of the high-resolution spatial domain for each turbine" m -typedef ^ ParameterType ReKi dX_high {:} - - "X-component of the spatial increment of the high-resolution spatial domain for each turbine" m -typedef ^ ParameterType ReKi dY_high {:} - - "Y-component of the spatial increment of the high-resolution spatial domain for each turbine" m -typedef ^ ParameterType ReKi dZ_high {:} - - "Z-component of the spatial increment of the high-resolution spatial domain for each turbine" m -typedef ^ ParameterType IntKi nX_high - - - "Number of high-resolution spatial nodes in X direction " - -typedef ^ ParameterType IntKi nY_high - - - "Number of high-resolution spatial nodes in Y direction" - -typedef ^ ParameterType IntKi nZ_high - - - "Number of high-resolution spatial nodes in Z direction" - -typedef ^ ParameterType ReKi Grid_low {:}{:} - - "XYZ components (global positions) of the spatial discretization of the low-resolution spatial domain" m -typedef ^ ParameterType ReKi Grid_high {:}{:}{:} - - "XYZ components (global positions) of the spatial discretization of the high-resolution spatial domain for each turbine " m -typedef ^ ParameterType ReKi WT_Position {:}{:} - - "X-Y-Z position of each wind turbine; index 1 = XYZ; index 2 = turbine number" meters typedef ^ ParameterType IntKi n_high_low - - - "Number of high-resolution time steps per low" - typedef ^ ParameterType IntKi n_high_low_p1 - - - "Number of high-resolution time steps per low, plus one at t_low-dt_high" - typedef ^ ParameterType DbKi dt_low - - - "Low-resolution (FAST.Farm driver/glue code) time step" s @@ -196,6 +205,11 @@ typedef ^ ParameterType IntKi Mod_Meander - - - "Spatial f typedef ^ ParameterType ReKi C_Meander - - - "Calibrated parameter for wake meandering" - typedef ^ ParameterType ReKi C_ScaleDiam - - - "Normalized wake volume radius for wake meandering (normalized by the wake diameter)" - typedef ^ ParameterType IntKi Mod_Projection - - - "Switch to select how the wake plane velocity is projected in AWAE {1: keep all components, 2: project against plane normal} or DEFAULT [DEFAULT=1: if Mod_Wake is 1 or 3, or DEFAULT=2: if Mod_Wake is 2]" +typedef ^ ParameterType character(12) DirStartIndex - - - "Starting directory index suffix for AMReX wind" - +typedef ^ ParameterType IntKi DirIndexLen - - - "Number of characters in directory index" +typedef ^ ParameterType IntKi DirStartNum - - - "Starting directory index number for AMReX wind" +typedef ^ ParameterType IntKi DirIndexDeltaLow - - - "Directory index delta for low-resolution AMReX wind" +typedef ^ ParameterType IntKi DirIndexDeltaHigh - - - "Directory index delta for high-resolution AMReX wind" typedef ^ ParameterType InflowWind_ParameterType IfW {:} - - "InflowWind module parameters" - # parameters for output #typedef ^ ParameterType IntKi NumOuts - - - "Number of parameters in the output list (number of outputs requested)" - @@ -229,6 +243,7 @@ typedef ^ OutputType ReKi Vx_wind_disk {:} - # ..... Inputs ........................................................................................................... # Define inputs that are contained on the mesh here: +typedef ^ InputType ReKi NumPlanes {:} - - "Number of active wake planes for each turbine" - typedef ^ InputType ReKi xhat_plane {:}{:}{:} - - "Orientations of wake planes, normal to wake planes, for each turbine" - typedef ^ InputType ReKi p_plane {:}{:}{:} - - "Center positions of wake planes for each turbine" m typedef ^ InputType ReKi Vx_wake {:}{:}{:}{:} - - "Axial wake velocity deficit at wake planes, distributed across the plane, for each turbine (ny,nz,np,nWT)" m/s diff --git a/modules/awae/src/AWAE_Types.f90 b/modules/awae/src/AWAE_Types.f90 index 3cbe84a334..ad08ebfd35 100644 --- a/modules/awae/src/AWAE_Types.f90 +++ b/modules/awae/src/AWAE_Types.f90 @@ -34,12 +34,12 @@ MODULE AWAE_Types USE InflowWind_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: XYSlice = 1 ! Extract an XY slice of data from the 3D grid [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: YZSlice = 2 ! Extract an YZ slice of data from the 3D grid [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: XZSlice = 3 ! Extract an XZ slice of data from the 3D grid [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: MeanderMod_Uniform = 1 ! Spatial filter model for wake meandering: uniform [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: MeanderMod_TruncJinc = 2 ! Spatial filter model for wake meandering: truncated jinc [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: MeanderMod_WndwdJinc = 3 ! Spatial filter model for wake meandering: windowed jinc [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: XYSlice = 1 ! Extract an XY slice of data from the 3D grid [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: YZSlice = 2 ! Extract an YZ slice of data from the 3D grid [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: XZSlice = 3 ! Extract an XZ slice of data from the 3D grid [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MeanderMod_Uniform = 1 ! Spatial filter model for wake meandering: uniform [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MeanderMod_TruncJinc = 2 ! Spatial filter model for wake meandering: truncated jinc [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MeanderMod_WndwdJinc = 3 ! Spatial filter model for wake meandering: windowed jinc [-] ! ========= AWAE_HighWindGrid ======= TYPE, PUBLIC :: AWAE_HighWindGrid REAL(SiKi) , DIMENSION(:,:,:,:,:), POINTER :: data => NULL() !< UVW components of wind data across the high-res regularly-spaced grid [m/s] @@ -56,7 +56,6 @@ MODULE AWAE_Types REAL(DbKi) :: dt_low = 0.0_R8Ki !< Low-resolution (FAST.Farm driver/glue code) time step [s] INTEGER(IntKi) :: NumTurbines = 0_IntKi !< Number of wind turbines in the farm [>=1] [-] INTEGER(IntKi) :: NumRadii = 0_IntKi !< Number of radii in the radial finite-difference grid [>=2] [-] - INTEGER(IntKi) :: NumPlanes = 0_IntKi !< Number of wake planes downwind of the rotor where the wake is propagated [>=2] [-] CHARACTER(1024) :: WindFilePath !< Path name to the Root folder containing the wind data files from ABLSolver precursor [-] LOGICAL :: WrDisWind = .false. !< Write disturbed wind data to /Low/Dis.t.vtk etc.? [-] INTEGER(IntKi) :: NOutDisWindXY = 0_IntKi !< Number of XY planes for output of disturbed wind data across the low-resolution domain to /Low/DisXY..t.vtk [0 to 9] [-] @@ -71,6 +70,7 @@ MODULE AWAE_Types REAL(ReKi) :: C_Meander = 0.0_ReKi !< Calibrated parameter for wake meandering [>=1.0] [DEFAULT=1.9] [-] INTEGER(IntKi) :: Mod_AmbWind = 0_IntKi !< Ambient wind model {1: high-fidelity precursor in VTK format, 2: InflowWind module} [-] CHARACTER(1024) :: InflowFile !< Name of file containing InflowWind module input parameters [-] + character(12) :: DirStartIndex !< Starting directory index suffix for AMReX wind [-] REAL(DbKi) :: dt_high = 0.0_R8Ki !< High-resolution (FAST) time step [s] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: X0_high !< X-component of the origin of the high-resolution spatial domain for each turbine [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Y0_high !< Y-component of the origin of the high-resolution spatial domain for each turbine [m] @@ -99,6 +99,7 @@ MODULE AWAE_Types TYPE(AWAE_InputFileType) :: InputFileData !< FAST.Farm input-file data for AWAE module [-] INTEGER(IntKi) :: n_high_low = 0_IntKi !< Number of high-resolution time steps per low [-] INTEGER(IntKi) :: NumDT = 0_IntKi !< Number of low-resolution (FAST.Farm driver/glue code) time steps [-] + INTEGER(IntKi) :: MaxPlanes = 0_IntKi !< Maximum number of wake planes downwind of the rotor where the wake is propagated [>=2] [-] CHARACTER(1024) :: OutFileRoot !< The root name derived from the primary FAST.Farm input file [-] LOGICAL :: WAT_Enabled = .false. !< Is WAT enabled? [-] TYPE(FlowFieldType) , POINTER :: WAT_FlowField => NULL() !< Pointer to the InflowWinds flow field data type [-] @@ -107,47 +108,35 @@ MODULE AWAE_Types ! ========= AWAE_InitOutputType ======= TYPE, PUBLIC :: AWAE_InitOutputType TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: X0_high !< X-component of the origin of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Y0_high !< Y-component of the origin of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Z0_high !< Z-component of the origin of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: dX_high !< X-component of the spatial increment of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: dY_high !< Y-component of the spatial increment of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: dZ_high !< Z-component of the spatial increment of the high-resolution spatial domain for each turbine [m] - INTEGER(IntKi) :: nX_high = 0_IntKi !< Number of high-resolution spatial nodes in X direction [-] - INTEGER(IntKi) :: nY_high = 0_IntKi !< Number of high-resolution spatial nodes in Y direction [-] - INTEGER(IntKi) :: nZ_high = 0_IntKi !< Number of high-resolution spatial nodes in Z direction [-] - REAL(ReKi) :: dX_low = 0.0_ReKi !< The spacing of the low-resolution nodes in X direction [m] - REAL(ReKi) :: dY_low = 0.0_ReKi !< The spacing of the low-resolution nodes in Y direction [m] - REAL(ReKi) :: dZ_low = 0.0_ReKi !< The spacing of the low-resolution nodes in Z direction [m] - INTEGER(IntKi) :: nX_low = 0_IntKi !< Number of low-resolution spatial nodes in X direction [-] - INTEGER(IntKi) :: nY_low = 0_IntKi !< Number of low-resolution spatial nodes in Y direction [-] - INTEGER(IntKi) :: nZ_low = 0_IntKi !< Number of low-resolution spatial nodes in Z direction [-] - REAL(ReKi) :: X0_low = 0.0_ReKi !< X-component of the origin of the low-resolution spatial domain [m] - REAL(ReKi) :: Y0_low = 0.0_ReKi !< Y-component of the origin of the low-resolution spatial domain [m] - REAL(ReKi) :: Z0_low = 0.0_ReKi !< Z-component of the origin of the low-resolution spatial domain [m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: oXYZ_high !< XYZ components of the origin of the high-resolution spatial domain for each turbine [m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: dXYZ_high !< XYZ components of the spatial increment of the high-resolution spatial domain for each turbine [m] + INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: nXYZ_high !< Number of high-resolution spatial nodes in XYZ directions [-] + REAL(ReKi) , DIMENSION(1:3) :: dXYZ_low = 0.0_ReKi !< The spacing of the low-resolution nodes in XYZ directions [m] + INTEGER(IntKi) , DIMENSION(1:3) :: nXYZ_low = 0_IntKi !< Number of low-resolution spatial nodes in XYZ directions [-] + REAL(ReKi) , DIMENSION(1:3) :: oXYZ_low = 0.0_ReKi !< XYZ components of the origin of the low-resolution spatial domain [m] TYPE(AWAE_HighWindGridPtr) , DIMENSION(:), ALLOCATABLE :: Vdist_High !< Pointers to Wind velocity of disturbed wind (ambient + wakes) across each high-resolution domain around a turbine for each high-resolution step within a low-resolution step [m/s] END TYPE AWAE_InitOutputType ! ======================= ! ========= AWAE_ContinuousStateType ======= TYPE, PUBLIC :: AWAE_ContinuousStateType - TYPE(InflowWind_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: IfW !< Dummy IfW continuous states [-] + REAL(ReKi) :: Dummy = 0.0_ReKi !< Dummy continuous states [-] END TYPE AWAE_ContinuousStateType ! ======================= ! ========= AWAE_DiscreteStateType ======= TYPE, PUBLIC :: AWAE_DiscreteStateType - TYPE(InflowWind_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: IfW !< Dummy IfW discrete states [-] + REAL(ReKi) :: Dummy = 0.0_ReKi !< Dummy discrete states [-] REAL(ReKi) , DIMENSION(1:3) :: WAT_B_Box = 0.0_ReKi !< Position of passive tracer used to offset the WAT box at each low res time step [m] REAL(ReKi) , DIMENSION(1:3) :: Ufarm = 0.0_ReKi !< mean velocity of all disk average flow for all turbines in farm [m/s] END TYPE AWAE_DiscreteStateType ! ======================= ! ========= AWAE_ConstraintStateType ======= TYPE, PUBLIC :: AWAE_ConstraintStateType - TYPE(InflowWind_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: IfW !< Dummy IfW constraint states [-] + REAL(ReKi) :: Dummy = 0.0_ReKi !< Dummy constraint states [-] END TYPE AWAE_ConstraintStateType ! ======================= ! ========= AWAE_OtherStateType ======= TYPE, PUBLIC :: AWAE_OtherStateType - TYPE(InflowWind_OtherStateType) , DIMENSION(:), ALLOCATABLE :: IfW !< Dummy IfW other states [-] + REAL(ReKi) :: Dummy = 0.0_ReKi !< Dummy other states [-] END TYPE AWAE_OtherStateType ! ======================= ! ========= AWAE_MiscVarType ======= @@ -157,6 +146,14 @@ MODULE AWAE_Types REAL(SiKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: Vdist_low !< UVW components of disturbed wind (ambient + deficits) across the low-resolution domain throughout the farm [m/s] REAL(SiKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: Vdist_low_full !< UVW components of disturbed wind (ambient + deficits) across the low-resolution domain throughout the farm, for outputs [m/s] TYPE(AWAE_HighWindGrid) , DIMENSION(:), ALLOCATABLE :: Vamb_High !< UVW components of ambient wind across each high-resolution domain around a turbine (one for each turbine) for each high-resolution time step within a low-resolution time step [m/s] + TYPE(KdTreeType) :: KdT !< K-d Tree structure for fast lookup of wake points [-] + INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: KdTPointData !< Plane and turbine index for points in K-d tree [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: KdTResults !< KdTree search result indices [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: AllPlanePoints !< X,Y plane coordinates for points (all planes/turbines) in K-d tree [-] + INTEGER(IntKi) , DIMENSION(:,:,:), ALLOCATABLE :: iPlaneTurbTurb !< First and Last plane index by source turbine and destination turbine index [-] + INTEGER(IntKi) , DIMENSION(:,:,:), ALLOCATABLE :: iPlaneTurbChunk !< First and Last plane index by source turbine and destination chunk index [-] + LOGICAL , DIMENSION(:), ALLOCATABLE :: LowResChunkHasWake !< Low-res gridFirst and Last plane index by source turbine and destination chunk index [-] + REAL(ReKi) :: MaxWakePointSep = 0.0_ReKi !< Maximum separation between wake points [-] LOGICAL , DIMENSION(:,:), ALLOCATABLE :: parallelFlag !< [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: r_s !< [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: r_e !< [-] @@ -167,49 +164,66 @@ MODULE AWAE_Types REAL(SiKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: outVizXYPlane !< An array holding the output data for a 2D visualization slice [-] REAL(SiKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: outVizYZPlane !< An array holding the output data for a 2D visualization slice [-] REAL(SiKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: outVizXZPlane !< An array holding the output data for a 2D visualization slice [-] - TYPE(InflowWind_MiscVarType) , DIMENSION(:), ALLOCATABLE :: IfW !< InflowWind module misc vars [-] TYPE(InflowWind_InputType) :: u_IfW_Low !< InflowWind module inputs for the low-resolution grid [-] - TYPE(InflowWind_InputType) :: u_IfW_High !< InflowWind module inputs for the high-resolution grid [-] + TYPE(InflowWind_InputType) , DIMENSION(:), ALLOCATABLE :: u_IfW_High !< InflowWind module inputs for the high-resolution grid [-] TYPE(InflowWind_OutputType) :: y_IfW_Low !< InflowWind module outputs for the low-resolution grid [-] - TYPE(InflowWind_OutputType) :: y_IfW_High !< InflowWind module outputs for the high-resolution grid [-] + TYPE(InflowWind_OutputType) , DIMENSION(:), ALLOCATABLE :: y_IfW_High !< InflowWind module outputs for the high-resolution grid [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: V_amb_low_disk !< Rotor averaged ambiend wind speed for each wind turbine (3 x nWT) [m/s] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: planeDomainExit !< Value indicates edge number (0: still in domain, +/-1: +/-X, +/-2: +/-Y, +/-3: +/-Z) the plane crossed [-] END TYPE AWAE_MiscVarType ! ======================= +! ========= LRGChunkType ======= + TYPE, PUBLIC :: LRGChunkType + INTEGER(IntKi) , DIMENSION(1:3) :: iChunk = 0_IntKi !< XYZ index of chunk [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iSubGridX = 0_IntKi !< start and end grid indices in X direction [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iSubGridY = 0_IntKi !< start and end grid indices in Y direction [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iSubGridZ = 0_IntKi !< start and end grid indices in Z direction [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iGridPoints !< Indices into GridPoints array to get locations [-] + INTEGER(IntKi) :: nPoints = 0_IntKi !< Number of points in sub-grid [-] + REAL(ReKi) , DIMENSION(1:3) :: oXYZ = 0.0_ReKi !< XYZ components of the origin of the resolution spatial domain [m] + REAL(ReKi) , DIMENSION(1:3) :: Size = 0.0_ReKi !< size of the grid chunk [m] + REAL(ReKi) , DIMENSION(1:3) :: Center = 0.0_ReKi !< center coordinates of the grid chunk [m] + REAL(ReKi) :: Radius = 0.0_ReKi !< Radius of cylinder encompassing grid [m] + END TYPE LRGChunkType +! ======================= +! ========= LRGParamType ======= + TYPE, PUBLIC :: LRGParamType + REAL(ReKi) , DIMENSION(1:3) :: oXYZ = 0.0_ReKi !< XYZ components of the origin of the resolution spatial domain [m] + REAL(ReKi) , DIMENSION(1:3) :: dXYZ = 0.0_ReKi !< XYZ components of the spatial increment of the spatial domain [m] + INTEGER(IntKi) , DIMENSION(1:3) :: nXYZ = 0_IntKi !< Number of spatial nodes in XYZ directions [-] + INTEGER(IntKi) :: nPoints = 0_IntKi !< Number of spatial nodes [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: GridPoints !< XYZ components (global positions) of the spatial discretization of the grid [m] + REAL(ReKi) , DIMENSION(1:3) :: Size = 0.0_ReKi !< XYZ size of the grid [m] + REAL(ReKi) , DIMENSION(1:3) :: Center = 0.0_ReKi !< XYZ coordinates of the grid center [m] + TYPE(LRGChunkType) , DIMENSION(:), ALLOCATABLE :: WakeChunks !< Chunks for updating grid from wake [-] + END TYPE LRGParamType +! ======================= +! ========= HRGParamType ======= + TYPE, PUBLIC :: HRGParamType + REAL(ReKi) , DIMENSION(1:3) :: WT_Position = 0.0_ReKi !< Turbine position [m] + REAL(ReKi) , DIMENSION(1:3) :: oXYZ = 0.0_ReKi !< XYZ components of the origin of the resolution spatial domain [m] + REAL(ReKi) , DIMENSION(1:3) :: dXYZ = 0.0_ReKi !< XYZ components of the spatial increment of the spatial domain [m] + INTEGER(IntKi) , DIMENSION(1:3) :: nXYZ = 0_IntKi !< Number of spatial nodes in XYZ directions [-] + INTEGER(IntKi) :: nPoints = 0_IntKi !< Number of spatial nodes [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: GridPoints !< XYZ components (global positions) of the spatial discretization of the grid [m] + REAL(ReKi) , DIMENSION(1:3) :: Size = 0.0_ReKi !< XYZ size of the grid [m] + REAL(ReKi) , DIMENSION(1:3) :: Center = 0.0_ReKi !< XYZ coordinates of the grid center [m] + REAL(ReKi) :: Radius = 0.0_ReKi !< Radius of cylinder encompassing grid [m] + END TYPE HRGParamType +! ======================= ! ========= AWAE_ParameterType ======= TYPE, PUBLIC :: AWAE_ParameterType CHARACTER(1024) :: WindFilePath !< Path name to the Root folder containing the wind data files from ABLSolver precursor [-] INTEGER(IntKi) :: NumTurbines = 0_IntKi !< Number of wind turbines in the farm [>=1] [-] INTEGER(IntKi) :: NumRadii = 0_IntKi !< Number of radii in the radial finite-difference grid [>=2] [-] - INTEGER(IntKi) :: NumPlanes = 0_IntKi !< Number of wake planes downwind of the rotor where the wake is propagated [>=2] [-] + INTEGER(IntKi) :: MaxPlanes = 0_IntKi !< Maximum number of wake planes downwind of the rotor where the wake is propagated [>=2] [-] + TYPE(LRGParamType) :: LowRes !< Low-resolution grid data [-] + TYPE(HRGParamType) , DIMENSION(:), ALLOCATABLE :: HighRes !< High-resolution grid data [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: y !< Horizontal discretization of the wake planes [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: z !< Vertical discretization of the wake planes [m] + REAL(ReKi) :: dPol = 0.0_ReKi !< Spatial resolution of the polar grid for each wake plane of each turbine [m] INTEGER(IntKi) :: Mod_AmbWind = 0_IntKi !< Ambient wind model {1: high-fidelity precursor in VTK format, 2: InflowWind module} [-] - INTEGER(IntKi) :: nX_low = 0_IntKi !< Number of low-resolution spatial nodes in X direction [-] - INTEGER(IntKi) :: nY_low = 0_IntKi !< Number of low-resolution spatial nodes in Y direction [-] - INTEGER(IntKi) :: nZ_low = 0_IntKi !< Number of low-resolution spatial nodes in Z direction [-] - INTEGER(IntKi) :: NumGrid_low = 0_IntKi !< Total number of low-resolution spatial nodes [-] INTEGER(IntKi) :: n_rp_max = 0_IntKi !< Maximum possible number of points in the polar grid for the wake plane at each rotor [-] - REAL(ReKi) :: dpol = 0.0_ReKi !< Spatial resolution of the polar grid for each wake plane of each turbine [m] - REAL(ReKi) , DIMENSION(1:3) :: dXYZ_low = 0.0_ReKi !< XYZ-components of the spatial increment of the low-resolution domain [m] - REAL(ReKi) :: dX_low = 0.0_ReKi !< The spacing of the low-resolution nodes in X direction [m] - REAL(ReKi) :: dY_low = 0.0_ReKi !< The spacing of the low-resolution nodes in Y direction [m] - REAL(ReKi) :: dZ_low = 0.0_ReKi !< The spacing of the low-resolution nodes in Z direction [m] - REAL(ReKi) :: X0_low = 0.0_ReKi !< X-component of the origin of the low-resolution spatial domain [m] - REAL(ReKi) :: Y0_low = 0.0_ReKi !< Y-component of the origin of the low-resolution spatial domain [m] - REAL(ReKi) :: Z0_low = 0.0_ReKi !< Z-component of the origin of the low-resolution spatial domain [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: X0_high !< X-component of the origin of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Y0_high !< Y-component of the origin of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Z0_high !< Z-component of the origin of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: dX_high !< X-component of the spatial increment of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: dY_high !< Y-component of the spatial increment of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: dZ_high !< Z-component of the spatial increment of the high-resolution spatial domain for each turbine [m] - INTEGER(IntKi) :: nX_high = 0_IntKi !< Number of high-resolution spatial nodes in X direction [-] - INTEGER(IntKi) :: nY_high = 0_IntKi !< Number of high-resolution spatial nodes in Y direction [-] - INTEGER(IntKi) :: nZ_high = 0_IntKi !< Number of high-resolution spatial nodes in Z direction [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Grid_low !< XYZ components (global positions) of the spatial discretization of the low-resolution spatial domain [m] - REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: Grid_high !< XYZ components (global positions) of the spatial discretization of the high-resolution spatial domain for each turbine [m] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WT_Position !< X-Y-Z position of each wind turbine; index 1 = XYZ; index 2 = turbine number [meters] INTEGER(IntKi) :: n_high_low = 0_IntKi !< Number of high-resolution time steps per low [-] INTEGER(IntKi) :: n_high_low_p1 = 0_IntKi !< Number of high-resolution time steps per low, plus one at t_low-dt_high [-] REAL(DbKi) :: dt_low = 0.0_R8Ki !< Low-resolution (FAST.Farm driver/glue code) time step [s] @@ -219,6 +233,11 @@ MODULE AWAE_Types REAL(ReKi) :: C_Meander = 0.0_ReKi !< Calibrated parameter for wake meandering [-] REAL(ReKi) :: C_ScaleDiam = 0.0_ReKi !< Normalized wake volume radius for wake meandering (normalized by the wake diameter) [-] INTEGER(IntKi) :: Mod_Projection = 0_IntKi !< Switch to select how the wake plane velocity is projected in AWAE {1: keep all components, 2: project against plane normal} or DEFAULT [DEFAULT=1: if Mod_Wake is 1 or 3, or DEFAULT=2: if Mod_Wake is 2] [-] + character(12) :: DirStartIndex !< Starting directory index suffix for AMReX wind [-] + INTEGER(IntKi) :: DirIndexLen = 0_IntKi !< Number of characters in directory index [-] + INTEGER(IntKi) :: DirStartNum = 0_IntKi !< Starting directory index number for AMReX wind [-] + INTEGER(IntKi) :: DirIndexDeltaLow = 0_IntKi !< Directory index delta for low-resolution AMReX wind [-] + INTEGER(IntKi) :: DirIndexDeltaHigh = 0_IntKi !< Directory index delta for high-resolution AMReX wind [-] TYPE(InflowWind_ParameterType) , DIMENSION(:), ALLOCATABLE :: IfW !< InflowWind module parameters [-] INTEGER(IntKi) :: WrDisSkp1 = 0_IntKi !< Number of time steps to skip plus one [-] LOGICAL :: WrDisWind = .false. !< Write disturbed wind data to /Low/Dis.t.vtk etc.? [-] @@ -248,6 +267,7 @@ MODULE AWAE_Types ! ======================= ! ========= AWAE_InputType ======= TYPE, PUBLIC :: AWAE_InputType + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NumPlanes !< Number of active wake planes for each turbine [-] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: xhat_plane !< Orientations of wake planes, normal to wake planes, for each turbine [-] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: p_plane !< Center positions of wake planes for each turbine [m] REAL(ReKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: Vx_wake !< Axial wake velocity deficit at wake planes, distributed across the plane, for each turbine (ny,nz,np,nWT) [m/s] @@ -257,7 +277,21 @@ MODULE AWAE_Types REAL(ReKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: WAT_k !< Scaling factor for each wake plane and turbine (ny, nz, np, nWT) [-] END TYPE AWAE_InputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: AWAE_x_Dummy = 1 ! AWAE%Dummy + integer(IntKi), public, parameter :: AWAE_u_NumPlanes = 2 ! AWAE%NumPlanes + integer(IntKi), public, parameter :: AWAE_u_xhat_plane = 3 ! AWAE%xhat_plane + integer(IntKi), public, parameter :: AWAE_u_p_plane = 4 ! AWAE%p_plane + integer(IntKi), public, parameter :: AWAE_u_Vx_wake = 5 ! AWAE%Vx_wake + integer(IntKi), public, parameter :: AWAE_u_Vy_wake = 6 ! AWAE%Vy_wake + integer(IntKi), public, parameter :: AWAE_u_Vz_wake = 7 ! AWAE%Vz_wake + integer(IntKi), public, parameter :: AWAE_u_D_wake = 8 ! AWAE%D_wake + integer(IntKi), public, parameter :: AWAE_u_WAT_k = 9 ! AWAE%WAT_k + integer(IntKi), public, parameter :: AWAE_y_Vdist_High_data = 10 ! AWAE%Vdist_High(DL%i1)%data + integer(IntKi), public, parameter :: AWAE_y_V_plane = 11 ! AWAE%V_plane + integer(IntKi), public, parameter :: AWAE_y_TI_amb = 12 ! AWAE%TI_amb + integer(IntKi), public, parameter :: AWAE_y_Vx_wind_disk = 13 ! AWAE%Vx_wind_disk + +contains subroutine AWAE_CopyHighWindGrid(SrcHighWindGridData, DstHighWindGridData, CtrlCode, ErrStat, ErrMsg) type(AWAE_HighWindGrid), intent(in) :: SrcHighWindGridData @@ -382,7 +416,6 @@ subroutine AWAE_CopyInputFileType(SrcInputFileTypeData, DstInputFileTypeData, Ct DstInputFileTypeData%dt_low = SrcInputFileTypeData%dt_low DstInputFileTypeData%NumTurbines = SrcInputFileTypeData%NumTurbines DstInputFileTypeData%NumRadii = SrcInputFileTypeData%NumRadii - DstInputFileTypeData%NumPlanes = SrcInputFileTypeData%NumPlanes DstInputFileTypeData%WindFilePath = SrcInputFileTypeData%WindFilePath DstInputFileTypeData%WrDisWind = SrcInputFileTypeData%WrDisWind DstInputFileTypeData%NOutDisWindXY = SrcInputFileTypeData%NOutDisWindXY @@ -430,6 +463,7 @@ subroutine AWAE_CopyInputFileType(SrcInputFileTypeData, DstInputFileTypeData, Ct DstInputFileTypeData%C_Meander = SrcInputFileTypeData%C_Meander DstInputFileTypeData%Mod_AmbWind = SrcInputFileTypeData%Mod_AmbWind DstInputFileTypeData%InflowFile = SrcInputFileTypeData%InflowFile + DstInputFileTypeData%DirStartIndex = SrcInputFileTypeData%DirStartIndex DstInputFileTypeData%dt_high = SrcInputFileTypeData%dt_high if (allocated(SrcInputFileTypeData%X0_high)) then LB(1:1) = lbound(SrcInputFileTypeData%X0_high) @@ -578,7 +612,6 @@ subroutine AWAE_PackInputFileType(RF, Indata) call RegPack(RF, InData%dt_low) call RegPack(RF, InData%NumTurbines) call RegPack(RF, InData%NumRadii) - call RegPack(RF, InData%NumPlanes) call RegPack(RF, InData%WindFilePath) call RegPack(RF, InData%WrDisWind) call RegPack(RF, InData%NOutDisWindXY) @@ -593,6 +626,7 @@ subroutine AWAE_PackInputFileType(RF, Indata) call RegPack(RF, InData%C_Meander) call RegPack(RF, InData%Mod_AmbWind) call RegPack(RF, InData%InflowFile) + call RegPack(RF, InData%DirStartIndex) call RegPack(RF, InData%dt_high) call RegPackAlloc(RF, InData%X0_high) call RegPackAlloc(RF, InData%Y0_high) @@ -629,7 +663,6 @@ subroutine AWAE_UnPackInputFileType(RF, OutData) call RegUnpack(RF, OutData%dt_low); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumTurbines); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumRadii); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumPlanes); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WindFilePath); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WrDisWind); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NOutDisWindXY); if (RegCheckErr(RF, RoutineName)) return @@ -644,6 +677,7 @@ subroutine AWAE_UnPackInputFileType(RF, OutData) call RegUnpack(RF, OutData%C_Meander); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Mod_AmbWind); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%InflowFile); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DirStartIndex); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%dt_high); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%X0_high); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Y0_high); if (RegCheckErr(RF, RoutineName)) return @@ -684,6 +718,7 @@ subroutine AWAE_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrS if (ErrStat >= AbortErrLev) return DstInitInputData%n_high_low = SrcInitInputData%n_high_low DstInitInputData%NumDT = SrcInitInputData%NumDT + DstInitInputData%MaxPlanes = SrcInitInputData%MaxPlanes DstInitInputData%OutFileRoot = SrcInitInputData%OutFileRoot DstInitInputData%WAT_Enabled = SrcInitInputData%WAT_Enabled DstInitInputData%WAT_FlowField => SrcInitInputData%WAT_FlowField @@ -712,6 +747,7 @@ subroutine AWAE_PackInitInput(RF, Indata) call AWAE_PackInputFileType(RF, InData%InputFileData) call RegPack(RF, InData%n_high_low) call RegPack(RF, InData%NumDT) + call RegPack(RF, InData%MaxPlanes) call RegPack(RF, InData%OutFileRoot) call RegPack(RF, InData%WAT_Enabled) call RegPack(RF, associated(InData%WAT_FlowField)) @@ -737,6 +773,7 @@ subroutine AWAE_UnPackInitInput(RF, OutData) call AWAE_UnpackInputFileType(RF, OutData%InputFileData) ! InputFileData call RegUnpack(RF, OutData%n_high_low); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumDT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MaxPlanes); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%OutFileRoot); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WAT_Enabled); if (RegCheckErr(RF, RoutineName)) return if (associated(OutData%WAT_FlowField)) deallocate(OutData%WAT_FlowField) @@ -765,8 +802,8 @@ subroutine AWAE_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, E integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_CopyInitOutput' @@ -775,90 +812,45 @@ subroutine AWAE_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, E call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcInitOutputData%X0_high)) then - LB(1:1) = lbound(SrcInitOutputData%X0_high) - UB(1:1) = ubound(SrcInitOutputData%X0_high) - if (.not. allocated(DstInitOutputData%X0_high)) then - allocate(DstInitOutputData%X0_high(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%X0_high.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%X0_high = SrcInitOutputData%X0_high - end if - if (allocated(SrcInitOutputData%Y0_high)) then - LB(1:1) = lbound(SrcInitOutputData%Y0_high) - UB(1:1) = ubound(SrcInitOutputData%Y0_high) - if (.not. allocated(DstInitOutputData%Y0_high)) then - allocate(DstInitOutputData%Y0_high(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%Y0_high.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%Y0_high = SrcInitOutputData%Y0_high - end if - if (allocated(SrcInitOutputData%Z0_high)) then - LB(1:1) = lbound(SrcInitOutputData%Z0_high) - UB(1:1) = ubound(SrcInitOutputData%Z0_high) - if (.not. allocated(DstInitOutputData%Z0_high)) then - allocate(DstInitOutputData%Z0_high(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%Z0_high.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%Z0_high = SrcInitOutputData%Z0_high - end if - if (allocated(SrcInitOutputData%dX_high)) then - LB(1:1) = lbound(SrcInitOutputData%dX_high) - UB(1:1) = ubound(SrcInitOutputData%dX_high) - if (.not. allocated(DstInitOutputData%dX_high)) then - allocate(DstInitOutputData%dX_high(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInitOutputData%oXYZ_high)) then + LB(1:2) = lbound(SrcInitOutputData%oXYZ_high) + UB(1:2) = ubound(SrcInitOutputData%oXYZ_high) + if (.not. allocated(DstInitOutputData%oXYZ_high)) then + allocate(DstInitOutputData%oXYZ_high(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%dX_high.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%oXYZ_high.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInitOutputData%dX_high = SrcInitOutputData%dX_high + DstInitOutputData%oXYZ_high = SrcInitOutputData%oXYZ_high end if - if (allocated(SrcInitOutputData%dY_high)) then - LB(1:1) = lbound(SrcInitOutputData%dY_high) - UB(1:1) = ubound(SrcInitOutputData%dY_high) - if (.not. allocated(DstInitOutputData%dY_high)) then - allocate(DstInitOutputData%dY_high(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInitOutputData%dXYZ_high)) then + LB(1:2) = lbound(SrcInitOutputData%dXYZ_high) + UB(1:2) = ubound(SrcInitOutputData%dXYZ_high) + if (.not. allocated(DstInitOutputData%dXYZ_high)) then + allocate(DstInitOutputData%dXYZ_high(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%dY_high.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%dXYZ_high.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInitOutputData%dY_high = SrcInitOutputData%dY_high + DstInitOutputData%dXYZ_high = SrcInitOutputData%dXYZ_high end if - if (allocated(SrcInitOutputData%dZ_high)) then - LB(1:1) = lbound(SrcInitOutputData%dZ_high) - UB(1:1) = ubound(SrcInitOutputData%dZ_high) - if (.not. allocated(DstInitOutputData%dZ_high)) then - allocate(DstInitOutputData%dZ_high(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInitOutputData%nXYZ_high)) then + LB(1:2) = lbound(SrcInitOutputData%nXYZ_high) + UB(1:2) = ubound(SrcInitOutputData%nXYZ_high) + if (.not. allocated(DstInitOutputData%nXYZ_high)) then + allocate(DstInitOutputData%nXYZ_high(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%dZ_high.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%nXYZ_high.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInitOutputData%dZ_high = SrcInitOutputData%dZ_high + DstInitOutputData%nXYZ_high = SrcInitOutputData%nXYZ_high end if - DstInitOutputData%nX_high = SrcInitOutputData%nX_high - DstInitOutputData%nY_high = SrcInitOutputData%nY_high - DstInitOutputData%nZ_high = SrcInitOutputData%nZ_high - DstInitOutputData%dX_low = SrcInitOutputData%dX_low - DstInitOutputData%dY_low = SrcInitOutputData%dY_low - DstInitOutputData%dZ_low = SrcInitOutputData%dZ_low - DstInitOutputData%nX_low = SrcInitOutputData%nX_low - DstInitOutputData%nY_low = SrcInitOutputData%nY_low - DstInitOutputData%nZ_low = SrcInitOutputData%nZ_low - DstInitOutputData%X0_low = SrcInitOutputData%X0_low - DstInitOutputData%Y0_low = SrcInitOutputData%Y0_low - DstInitOutputData%Z0_low = SrcInitOutputData%Z0_low + DstInitOutputData%dXYZ_low = SrcInitOutputData%dXYZ_low + DstInitOutputData%nXYZ_low = SrcInitOutputData%nXYZ_low + DstInitOutputData%oXYZ_low = SrcInitOutputData%oXYZ_low if (allocated(SrcInitOutputData%Vdist_High)) then LB(1:1) = lbound(SrcInitOutputData%Vdist_High) UB(1:1) = ubound(SrcInitOutputData%Vdist_High) @@ -881,8 +873,8 @@ subroutine AWAE_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) type(AWAE_InitOutputType), intent(inout) :: InitOutputData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_DestroyInitOutput' @@ -890,23 +882,14 @@ subroutine AWAE_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) ErrMsg = '' call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(InitOutputData%X0_high)) then - deallocate(InitOutputData%X0_high) - end if - if (allocated(InitOutputData%Y0_high)) then - deallocate(InitOutputData%Y0_high) - end if - if (allocated(InitOutputData%Z0_high)) then - deallocate(InitOutputData%Z0_high) + if (allocated(InitOutputData%oXYZ_high)) then + deallocate(InitOutputData%oXYZ_high) end if - if (allocated(InitOutputData%dX_high)) then - deallocate(InitOutputData%dX_high) + if (allocated(InitOutputData%dXYZ_high)) then + deallocate(InitOutputData%dXYZ_high) end if - if (allocated(InitOutputData%dY_high)) then - deallocate(InitOutputData%dY_high) - end if - if (allocated(InitOutputData%dZ_high)) then - deallocate(InitOutputData%dZ_high) + if (allocated(InitOutputData%nXYZ_high)) then + deallocate(InitOutputData%nXYZ_high) end if if (allocated(InitOutputData%Vdist_High)) then LB(1:1) = lbound(InitOutputData%Vdist_High) @@ -923,28 +906,16 @@ subroutine AWAE_PackInitOutput(RF, Indata) type(RegFile), intent(inout) :: RF type(AWAE_InitOutputType), intent(in) :: InData character(*), parameter :: RoutineName = 'AWAE_PackInitOutput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return call NWTC_Library_PackProgDesc(RF, InData%Ver) - call RegPackAlloc(RF, InData%X0_high) - call RegPackAlloc(RF, InData%Y0_high) - call RegPackAlloc(RF, InData%Z0_high) - call RegPackAlloc(RF, InData%dX_high) - call RegPackAlloc(RF, InData%dY_high) - call RegPackAlloc(RF, InData%dZ_high) - call RegPack(RF, InData%nX_high) - call RegPack(RF, InData%nY_high) - call RegPack(RF, InData%nZ_high) - call RegPack(RF, InData%dX_low) - call RegPack(RF, InData%dY_low) - call RegPack(RF, InData%dZ_low) - call RegPack(RF, InData%nX_low) - call RegPack(RF, InData%nY_low) - call RegPack(RF, InData%nZ_low) - call RegPack(RF, InData%X0_low) - call RegPack(RF, InData%Y0_low) - call RegPack(RF, InData%Z0_low) + call RegPackAlloc(RF, InData%oXYZ_high) + call RegPackAlloc(RF, InData%dXYZ_high) + call RegPackAlloc(RF, InData%nXYZ_high) + call RegPack(RF, InData%dXYZ_low) + call RegPack(RF, InData%nXYZ_low) + call RegPack(RF, InData%oXYZ_low) call RegPack(RF, allocated(InData%Vdist_High)) if (allocated(InData%Vdist_High)) then call RegPackBounds(RF, 1, lbound(InData%Vdist_High), ubound(InData%Vdist_High)) @@ -961,30 +932,18 @@ subroutine AWAE_UnPackInitOutput(RF, OutData) type(RegFile), intent(inout) :: RF type(AWAE_InitOutputType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'AWAE_UnPackInitOutput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver - call RegUnpackAlloc(RF, OutData%X0_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Y0_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Z0_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dX_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dY_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dZ_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nX_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nY_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nZ_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dX_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dY_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dZ_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nX_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nY_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nZ_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%X0_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Y0_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Z0_low); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%oXYZ_high); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%dXYZ_high); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%nXYZ_high); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%dXYZ_low); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nXYZ_low); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%oXYZ_low); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%Vdist_High)) deallocate(OutData%Vdist_High) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -1006,69 +965,27 @@ subroutine AWAE_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrS integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_CopyContState' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcContStateData%IfW)) then - LB(1:1) = lbound(SrcContStateData%IfW) - UB(1:1) = ubound(SrcContStateData%IfW) - if (.not. allocated(DstContStateData%IfW)) then - allocate(DstContStateData%IfW(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstContStateData%IfW.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call InflowWind_CopyContState(SrcContStateData%IfW(i1), DstContStateData%IfW(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if + DstContStateData%Dummy = SrcContStateData%Dummy end subroutine subroutine AWAE_DestroyContState(ContStateData, ErrStat, ErrMsg) type(AWAE_ContinuousStateType), intent(inout) :: ContStateData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_DestroyContState' ErrStat = ErrID_None ErrMsg = '' - if (allocated(ContStateData%IfW)) then - LB(1:1) = lbound(ContStateData%IfW) - UB(1:1) = ubound(ContStateData%IfW) - do i1 = LB(1), UB(1) - call InflowWind_DestroyContState(ContStateData%IfW(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ContStateData%IfW) - end if end subroutine subroutine AWAE_PackContState(RF, Indata) type(RegFile), intent(inout) :: RF type(AWAE_ContinuousStateType), intent(in) :: InData character(*), parameter :: RoutineName = 'AWAE_PackContState' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%IfW)) - if (allocated(InData%IfW)) then - call RegPackBounds(RF, 1, lbound(InData%IfW), ubound(InData%IfW)) - LB(1:1) = lbound(InData%IfW) - UB(1:1) = ubound(InData%IfW) - do i1 = LB(1), UB(1) - call InflowWind_PackContState(RF, InData%IfW(i1)) - end do - end if + call RegPack(RF, InData%Dummy) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1076,24 +993,8 @@ subroutine AWAE_UnPackContState(RF, OutData) type(RegFile), intent(inout) :: RF type(AWAE_ContinuousStateType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'AWAE_UnPackContState' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%IfW)) deallocate(OutData%IfW) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%IfW(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call InflowWind_UnpackContState(RF, OutData%IfW(i1)) ! IfW - end do - end if + call RegUnpack(RF, OutData%Dummy); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine AWAE_CopyDiscState(SrcDiscStateData, DstDiscStateData, CtrlCode, ErrStat, ErrMsg) @@ -1102,29 +1003,10 @@ subroutine AWAE_CopyDiscState(SrcDiscStateData, DstDiscStateData, CtrlCode, ErrS integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_CopyDiscState' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcDiscStateData%IfW)) then - LB(1:1) = lbound(SrcDiscStateData%IfW) - UB(1:1) = ubound(SrcDiscStateData%IfW) - if (.not. allocated(DstDiscStateData%IfW)) then - allocate(DstDiscStateData%IfW(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstDiscStateData%IfW.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call InflowWind_CopyDiscState(SrcDiscStateData%IfW(i1), DstDiscStateData%IfW(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if + DstDiscStateData%Dummy = SrcDiscStateData%Dummy DstDiscStateData%WAT_B_Box = SrcDiscStateData%WAT_B_Box DstDiscStateData%Ufarm = SrcDiscStateData%Ufarm end subroutine @@ -1133,40 +1015,17 @@ subroutine AWAE_DestroyDiscState(DiscStateData, ErrStat, ErrMsg) type(AWAE_DiscreteStateType), intent(inout) :: DiscStateData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_DestroyDiscState' ErrStat = ErrID_None ErrMsg = '' - if (allocated(DiscStateData%IfW)) then - LB(1:1) = lbound(DiscStateData%IfW) - UB(1:1) = ubound(DiscStateData%IfW) - do i1 = LB(1), UB(1) - call InflowWind_DestroyDiscState(DiscStateData%IfW(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(DiscStateData%IfW) - end if end subroutine subroutine AWAE_PackDiscState(RF, Indata) type(RegFile), intent(inout) :: RF type(AWAE_DiscreteStateType), intent(in) :: InData character(*), parameter :: RoutineName = 'AWAE_PackDiscState' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%IfW)) - if (allocated(InData%IfW)) then - call RegPackBounds(RF, 1, lbound(InData%IfW), ubound(InData%IfW)) - LB(1:1) = lbound(InData%IfW) - UB(1:1) = ubound(InData%IfW) - do i1 = LB(1), UB(1) - call InflowWind_PackDiscState(RF, InData%IfW(i1)) - end do - end if + call RegPack(RF, InData%Dummy) call RegPack(RF, InData%WAT_B_Box) call RegPack(RF, InData%Ufarm) if (RegCheckErr(RF, RoutineName)) return @@ -1176,24 +1035,8 @@ subroutine AWAE_UnPackDiscState(RF, OutData) type(RegFile), intent(inout) :: RF type(AWAE_DiscreteStateType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'AWAE_UnPackDiscState' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%IfW)) deallocate(OutData%IfW) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%IfW(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call InflowWind_UnpackDiscState(RF, OutData%IfW(i1)) ! IfW - end do - end if + call RegUnpack(RF, OutData%Dummy); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WAT_B_Box); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Ufarm); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1204,69 +1047,27 @@ subroutine AWAE_CopyConstrState(SrcConstrStateData, DstConstrStateData, CtrlCode integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_CopyConstrState' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcConstrStateData%IfW)) then - LB(1:1) = lbound(SrcConstrStateData%IfW) - UB(1:1) = ubound(SrcConstrStateData%IfW) - if (.not. allocated(DstConstrStateData%IfW)) then - allocate(DstConstrStateData%IfW(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstConstrStateData%IfW.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call InflowWind_CopyConstrState(SrcConstrStateData%IfW(i1), DstConstrStateData%IfW(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if + DstConstrStateData%Dummy = SrcConstrStateData%Dummy end subroutine subroutine AWAE_DestroyConstrState(ConstrStateData, ErrStat, ErrMsg) type(AWAE_ConstraintStateType), intent(inout) :: ConstrStateData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_DestroyConstrState' ErrStat = ErrID_None ErrMsg = '' - if (allocated(ConstrStateData%IfW)) then - LB(1:1) = lbound(ConstrStateData%IfW) - UB(1:1) = ubound(ConstrStateData%IfW) - do i1 = LB(1), UB(1) - call InflowWind_DestroyConstrState(ConstrStateData%IfW(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ConstrStateData%IfW) - end if end subroutine subroutine AWAE_PackConstrState(RF, Indata) type(RegFile), intent(inout) :: RF type(AWAE_ConstraintStateType), intent(in) :: InData character(*), parameter :: RoutineName = 'AWAE_PackConstrState' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%IfW)) - if (allocated(InData%IfW)) then - call RegPackBounds(RF, 1, lbound(InData%IfW), ubound(InData%IfW)) - LB(1:1) = lbound(InData%IfW) - UB(1:1) = ubound(InData%IfW) - do i1 = LB(1), UB(1) - call InflowWind_PackConstrState(RF, InData%IfW(i1)) - end do - end if + call RegPack(RF, InData%Dummy) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1274,24 +1075,8 @@ subroutine AWAE_UnPackConstrState(RF, OutData) type(RegFile), intent(inout) :: RF type(AWAE_ConstraintStateType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'AWAE_UnPackConstrState' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%IfW)) deallocate(OutData%IfW) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%IfW(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call InflowWind_UnpackConstrState(RF, OutData%IfW(i1)) ! IfW - end do - end if + call RegUnpack(RF, OutData%Dummy); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine AWAE_CopyOtherState(SrcOtherStateData, DstOtherStateData, CtrlCode, ErrStat, ErrMsg) @@ -1300,69 +1085,27 @@ subroutine AWAE_CopyOtherState(SrcOtherStateData, DstOtherStateData, CtrlCode, E integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_CopyOtherState' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcOtherStateData%IfW)) then - LB(1:1) = lbound(SrcOtherStateData%IfW) - UB(1:1) = ubound(SrcOtherStateData%IfW) - if (.not. allocated(DstOtherStateData%IfW)) then - allocate(DstOtherStateData%IfW(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOtherStateData%IfW.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call InflowWind_CopyOtherState(SrcOtherStateData%IfW(i1), DstOtherStateData%IfW(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if + DstOtherStateData%Dummy = SrcOtherStateData%Dummy end subroutine subroutine AWAE_DestroyOtherState(OtherStateData, ErrStat, ErrMsg) type(AWAE_OtherStateType), intent(inout) :: OtherStateData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_DestroyOtherState' ErrStat = ErrID_None ErrMsg = '' - if (allocated(OtherStateData%IfW)) then - LB(1:1) = lbound(OtherStateData%IfW) - UB(1:1) = ubound(OtherStateData%IfW) - do i1 = LB(1), UB(1) - call InflowWind_DestroyOtherState(OtherStateData%IfW(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(OtherStateData%IfW) - end if end subroutine subroutine AWAE_PackOtherState(RF, Indata) type(RegFile), intent(inout) :: RF type(AWAE_OtherStateType), intent(in) :: InData character(*), parameter :: RoutineName = 'AWAE_PackOtherState' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%IfW)) - if (allocated(InData%IfW)) then - call RegPackBounds(RF, 1, lbound(InData%IfW), ubound(InData%IfW)) - LB(1:1) = lbound(InData%IfW) - UB(1:1) = ubound(InData%IfW) - do i1 = LB(1), UB(1) - call InflowWind_PackOtherState(RF, InData%IfW(i1)) - end do - end if + call RegPack(RF, InData%Dummy) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1370,24 +1113,8 @@ subroutine AWAE_UnPackOtherState(RF, OutData) type(RegFile), intent(inout) :: RF type(AWAE_OtherStateType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'AWAE_UnPackOtherState' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%IfW)) deallocate(OutData%IfW) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%IfW(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call InflowWind_UnpackOtherState(RF, OutData%IfW(i1)) ! IfW - end do - end if + call RegUnpack(RF, OutData%Dummy); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine AWAE_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) @@ -1467,6 +1194,82 @@ subroutine AWAE_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) if (ErrStat >= AbortErrLev) return end do end if + call NWTC_Library_CopyKdTreeType(SrcMiscData%KdT, DstMiscData%KdT, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcMiscData%KdTPointData)) then + LB(1:2) = lbound(SrcMiscData%KdTPointData) + UB(1:2) = ubound(SrcMiscData%KdTPointData) + if (.not. allocated(DstMiscData%KdTPointData)) then + allocate(DstMiscData%KdTPointData(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%KdTPointData.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%KdTPointData = SrcMiscData%KdTPointData + end if + if (allocated(SrcMiscData%KdTResults)) then + LB(1:1) = lbound(SrcMiscData%KdTResults) + UB(1:1) = ubound(SrcMiscData%KdTResults) + if (.not. allocated(DstMiscData%KdTResults)) then + allocate(DstMiscData%KdTResults(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%KdTResults.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%KdTResults = SrcMiscData%KdTResults + end if + if (allocated(SrcMiscData%AllPlanePoints)) then + LB(1:2) = lbound(SrcMiscData%AllPlanePoints) + UB(1:2) = ubound(SrcMiscData%AllPlanePoints) + if (.not. allocated(DstMiscData%AllPlanePoints)) then + allocate(DstMiscData%AllPlanePoints(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AllPlanePoints.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AllPlanePoints = SrcMiscData%AllPlanePoints + end if + if (allocated(SrcMiscData%iPlaneTurbTurb)) then + LB(1:3) = lbound(SrcMiscData%iPlaneTurbTurb) + UB(1:3) = ubound(SrcMiscData%iPlaneTurbTurb) + if (.not. allocated(DstMiscData%iPlaneTurbTurb)) then + allocate(DstMiscData%iPlaneTurbTurb(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%iPlaneTurbTurb.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%iPlaneTurbTurb = SrcMiscData%iPlaneTurbTurb + end if + if (allocated(SrcMiscData%iPlaneTurbChunk)) then + LB(1:3) = lbound(SrcMiscData%iPlaneTurbChunk) + UB(1:3) = ubound(SrcMiscData%iPlaneTurbChunk) + if (.not. allocated(DstMiscData%iPlaneTurbChunk)) then + allocate(DstMiscData%iPlaneTurbChunk(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%iPlaneTurbChunk.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%iPlaneTurbChunk = SrcMiscData%iPlaneTurbChunk + end if + if (allocated(SrcMiscData%LowResChunkHasWake)) then + LB(1:1) = lbound(SrcMiscData%LowResChunkHasWake) + UB(1:1) = ubound(SrcMiscData%LowResChunkHasWake) + if (.not. allocated(DstMiscData%LowResChunkHasWake)) then + allocate(DstMiscData%LowResChunkHasWake(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%LowResChunkHasWake.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%LowResChunkHasWake = SrcMiscData%LowResChunkHasWake + end if + DstMiscData%MaxWakePointSep = SrcMiscData%MaxWakePointSep if (allocated(SrcMiscData%parallelFlag)) then LB(1:2) = lbound(SrcMiscData%parallelFlag) UB(1:2) = ubound(SrcMiscData%parallelFlag) @@ -1587,34 +1390,44 @@ subroutine AWAE_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) end if DstMiscData%outVizXZPlane = SrcMiscData%outVizXZPlane end if - if (allocated(SrcMiscData%IfW)) then - LB(1:1) = lbound(SrcMiscData%IfW) - UB(1:1) = ubound(SrcMiscData%IfW) - if (.not. allocated(DstMiscData%IfW)) then - allocate(DstMiscData%IfW(LB(1):UB(1)), stat=ErrStat2) + call InflowWind_CopyInput(SrcMiscData%u_IfW_Low, DstMiscData%u_IfW_Low, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcMiscData%u_IfW_High)) then + LB(1:1) = lbound(SrcMiscData%u_IfW_High) + UB(1:1) = ubound(SrcMiscData%u_IfW_High) + if (.not. allocated(DstMiscData%u_IfW_High)) then + allocate(DstMiscData%u_IfW_High(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%IfW.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_IfW_High.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call InflowWind_CopyMisc(SrcMiscData%IfW(i1), DstMiscData%IfW(i1), CtrlCode, ErrStat2, ErrMsg2) + call InflowWind_CopyInput(SrcMiscData%u_IfW_High(i1), DstMiscData%u_IfW_High(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call InflowWind_CopyInput(SrcMiscData%u_IfW_Low, DstMiscData%u_IfW_Low, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call InflowWind_CopyInput(SrcMiscData%u_IfW_High, DstMiscData%u_IfW_High, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return call InflowWind_CopyOutput(SrcMiscData%y_IfW_Low, DstMiscData%y_IfW_Low, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call InflowWind_CopyOutput(SrcMiscData%y_IfW_High, DstMiscData%y_IfW_High, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + if (allocated(SrcMiscData%y_IfW_High)) then + LB(1:1) = lbound(SrcMiscData%y_IfW_High) + UB(1:1) = ubound(SrcMiscData%y_IfW_High) + if (.not. allocated(DstMiscData%y_IfW_High)) then + allocate(DstMiscData%y_IfW_High(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%y_IfW_High.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call InflowWind_CopyOutput(SrcMiscData%y_IfW_High(i1), DstMiscData%y_IfW_High(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if if (allocated(SrcMiscData%V_amb_low_disk)) then LB(1:2) = lbound(SrcMiscData%V_amb_low_disk) UB(1:2) = ubound(SrcMiscData%V_amb_low_disk) @@ -1673,6 +1486,26 @@ subroutine AWAE_DestroyMisc(MiscData, ErrStat, ErrMsg) end do deallocate(MiscData%Vamb_High) end if + call NWTC_Library_DestroyKdTreeType(MiscData%KdT, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%KdTPointData)) then + deallocate(MiscData%KdTPointData) + end if + if (allocated(MiscData%KdTResults)) then + deallocate(MiscData%KdTResults) + end if + if (allocated(MiscData%AllPlanePoints)) then + deallocate(MiscData%AllPlanePoints) + end if + if (allocated(MiscData%iPlaneTurbTurb)) then + deallocate(MiscData%iPlaneTurbTurb) + end if + if (allocated(MiscData%iPlaneTurbChunk)) then + deallocate(MiscData%iPlaneTurbChunk) + end if + if (allocated(MiscData%LowResChunkHasWake)) then + deallocate(MiscData%LowResChunkHasWake) + end if if (allocated(MiscData%parallelFlag)) then deallocate(MiscData%parallelFlag) end if @@ -1703,23 +1536,28 @@ subroutine AWAE_DestroyMisc(MiscData, ErrStat, ErrMsg) if (allocated(MiscData%outVizXZPlane)) then deallocate(MiscData%outVizXZPlane) end if - if (allocated(MiscData%IfW)) then - LB(1:1) = lbound(MiscData%IfW) - UB(1:1) = ubound(MiscData%IfW) + call InflowWind_DestroyInput(MiscData%u_IfW_Low, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%u_IfW_High)) then + LB(1:1) = lbound(MiscData%u_IfW_High) + UB(1:1) = ubound(MiscData%u_IfW_High) do i1 = LB(1), UB(1) - call InflowWind_DestroyMisc(MiscData%IfW(i1), ErrStat2, ErrMsg2) + call InflowWind_DestroyInput(MiscData%u_IfW_High(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MiscData%IfW) + deallocate(MiscData%u_IfW_High) end if - call InflowWind_DestroyInput(MiscData%u_IfW_Low, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call InflowWind_DestroyInput(MiscData%u_IfW_High, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call InflowWind_DestroyOutput(MiscData%y_IfW_Low, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call InflowWind_DestroyOutput(MiscData%y_IfW_High, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%y_IfW_High)) then + LB(1:1) = lbound(MiscData%y_IfW_High) + UB(1:1) = ubound(MiscData%y_IfW_High) + do i1 = LB(1), UB(1) + call InflowWind_DestroyOutput(MiscData%y_IfW_High(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%y_IfW_High) + end if if (allocated(MiscData%V_amb_low_disk)) then deallocate(MiscData%V_amb_low_disk) end if @@ -1748,6 +1586,14 @@ subroutine AWAE_PackMisc(RF, Indata) call AWAE_PackHighWindGrid(RF, InData%Vamb_High(i1)) end do end if + call NWTC_Library_PackKdTreeType(RF, InData%KdT) + call RegPackAlloc(RF, InData%KdTPointData) + call RegPackAlloc(RF, InData%KdTResults) + call RegPackAlloc(RF, InData%AllPlanePoints) + call RegPackAlloc(RF, InData%iPlaneTurbTurb) + call RegPackAlloc(RF, InData%iPlaneTurbChunk) + call RegPackAlloc(RF, InData%LowResChunkHasWake) + call RegPack(RF, InData%MaxWakePointSep) call RegPackAlloc(RF, InData%parallelFlag) call RegPackAlloc(RF, InData%r_s) call RegPackAlloc(RF, InData%r_e) @@ -1758,19 +1604,26 @@ subroutine AWAE_PackMisc(RF, Indata) call RegPackAlloc(RF, InData%outVizXYPlane) call RegPackAlloc(RF, InData%outVizYZPlane) call RegPackAlloc(RF, InData%outVizXZPlane) - call RegPack(RF, allocated(InData%IfW)) - if (allocated(InData%IfW)) then - call RegPackBounds(RF, 1, lbound(InData%IfW), ubound(InData%IfW)) - LB(1:1) = lbound(InData%IfW) - UB(1:1) = ubound(InData%IfW) + call InflowWind_PackInput(RF, InData%u_IfW_Low) + call RegPack(RF, allocated(InData%u_IfW_High)) + if (allocated(InData%u_IfW_High)) then + call RegPackBounds(RF, 1, lbound(InData%u_IfW_High), ubound(InData%u_IfW_High)) + LB(1:1) = lbound(InData%u_IfW_High) + UB(1:1) = ubound(InData%u_IfW_High) do i1 = LB(1), UB(1) - call InflowWind_PackMisc(RF, InData%IfW(i1)) + call InflowWind_PackInput(RF, InData%u_IfW_High(i1)) end do end if - call InflowWind_PackInput(RF, InData%u_IfW_Low) - call InflowWind_PackInput(RF, InData%u_IfW_High) call InflowWind_PackOutput(RF, InData%y_IfW_Low) - call InflowWind_PackOutput(RF, InData%y_IfW_High) + call RegPack(RF, allocated(InData%y_IfW_High)) + if (allocated(InData%y_IfW_High)) then + call RegPackBounds(RF, 1, lbound(InData%y_IfW_High), ubound(InData%y_IfW_High)) + LB(1:1) = lbound(InData%y_IfW_High) + UB(1:1) = ubound(InData%y_IfW_High) + do i1 = LB(1), UB(1) + call InflowWind_PackOutput(RF, InData%y_IfW_High(i1)) + end do + end if call RegPackAlloc(RF, InData%V_amb_low_disk) call RegPackAlloc(RF, InData%planeDomainExit) if (RegCheckErr(RF, RoutineName)) return @@ -1802,6 +1655,14 @@ subroutine AWAE_UnPackMisc(RF, OutData) call AWAE_UnpackHighWindGrid(RF, OutData%Vamb_High(i1)) ! Vamb_High end do end if + call NWTC_Library_UnpackKdTreeType(RF, OutData%KdT) ! KdT + call RegUnpackAlloc(RF, OutData%KdTPointData); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%KdTResults); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AllPlanePoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%iPlaneTurbTurb); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%iPlaneTurbChunk); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%LowResChunkHasWake); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MaxWakePointSep); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%parallelFlag); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%r_s); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%r_e); if (RegCheckErr(RF, RoutineName)) return @@ -1812,193 +1673,397 @@ subroutine AWAE_UnPackMisc(RF, OutData) call RegUnpackAlloc(RF, OutData%outVizXYPlane); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%outVizYZPlane); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%outVizXZPlane); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%IfW)) deallocate(OutData%IfW) + call InflowWind_UnpackInput(RF, OutData%u_IfW_Low) ! u_IfW_Low + if (allocated(OutData%u_IfW_High)) deallocate(OutData%u_IfW_High) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%IfW(LB(1):UB(1)),stat=stat) + allocate(OutData%u_IfW_High(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_IfW_High.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call InflowWind_UnpackMisc(RF, OutData%IfW(i1)) ! IfW + call InflowWind_UnpackInput(RF, OutData%u_IfW_High(i1)) ! u_IfW_High end do end if - call InflowWind_UnpackInput(RF, OutData%u_IfW_Low) ! u_IfW_Low - call InflowWind_UnpackInput(RF, OutData%u_IfW_High) ! u_IfW_High call InflowWind_UnpackOutput(RF, OutData%y_IfW_Low) ! y_IfW_Low - call InflowWind_UnpackOutput(RF, OutData%y_IfW_High) ! y_IfW_High + if (allocated(OutData%y_IfW_High)) deallocate(OutData%y_IfW_High) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%y_IfW_High(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_IfW_High.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call InflowWind_UnpackOutput(RF, OutData%y_IfW_High(i1)) ! y_IfW_High + end do + end if call RegUnpackAlloc(RF, OutData%V_amb_low_disk); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%planeDomainExit); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine AWAE_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) - type(AWAE_ParameterType), intent(in) :: SrcParamData - type(AWAE_ParameterType), intent(inout) :: DstParamData +subroutine AWAE_CopyLRGChunkType(SrcLRGChunkTypeData, DstLRGChunkTypeData, CtrlCode, ErrStat, ErrMsg) + type(LRGChunkType), intent(in) :: SrcLRGChunkTypeData + type(LRGChunkType), intent(inout) :: DstLRGChunkTypeData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'AWAE_CopyParam' + character(*), parameter :: RoutineName = 'AWAE_CopyLRGChunkType' ErrStat = ErrID_None ErrMsg = '' - DstParamData%WindFilePath = SrcParamData%WindFilePath - DstParamData%NumTurbines = SrcParamData%NumTurbines - DstParamData%NumRadii = SrcParamData%NumRadii - DstParamData%NumPlanes = SrcParamData%NumPlanes - if (allocated(SrcParamData%y)) then - LB(1:1) = lbound(SrcParamData%y) - UB(1:1) = ubound(SrcParamData%y) - if (.not. allocated(DstParamData%y)) then - allocate(DstParamData%y(LB(1):UB(1)), stat=ErrStat2) + DstLRGChunkTypeData%iChunk = SrcLRGChunkTypeData%iChunk + DstLRGChunkTypeData%iSubGridX = SrcLRGChunkTypeData%iSubGridX + DstLRGChunkTypeData%iSubGridY = SrcLRGChunkTypeData%iSubGridY + DstLRGChunkTypeData%iSubGridZ = SrcLRGChunkTypeData%iSubGridZ + if (allocated(SrcLRGChunkTypeData%iGridPoints)) then + LB(1:1) = lbound(SrcLRGChunkTypeData%iGridPoints) + UB(1:1) = ubound(SrcLRGChunkTypeData%iGridPoints) + if (.not. allocated(DstLRGChunkTypeData%iGridPoints)) then + allocate(DstLRGChunkTypeData%iGridPoints(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%y.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstLRGChunkTypeData%iGridPoints.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%y = SrcParamData%y + DstLRGChunkTypeData%iGridPoints = SrcLRGChunkTypeData%iGridPoints end if - if (allocated(SrcParamData%z)) then - LB(1:1) = lbound(SrcParamData%z) - UB(1:1) = ubound(SrcParamData%z) - if (.not. allocated(DstParamData%z)) then - allocate(DstParamData%z(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%z.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%z = SrcParamData%z + DstLRGChunkTypeData%nPoints = SrcLRGChunkTypeData%nPoints + DstLRGChunkTypeData%oXYZ = SrcLRGChunkTypeData%oXYZ + DstLRGChunkTypeData%Size = SrcLRGChunkTypeData%Size + DstLRGChunkTypeData%Center = SrcLRGChunkTypeData%Center + DstLRGChunkTypeData%Radius = SrcLRGChunkTypeData%Radius +end subroutine + +subroutine AWAE_DestroyLRGChunkType(LRGChunkTypeData, ErrStat, ErrMsg) + type(LRGChunkType), intent(inout) :: LRGChunkTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'AWAE_DestroyLRGChunkType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(LRGChunkTypeData%iGridPoints)) then + deallocate(LRGChunkTypeData%iGridPoints) end if - DstParamData%Mod_AmbWind = SrcParamData%Mod_AmbWind - DstParamData%nX_low = SrcParamData%nX_low - DstParamData%nY_low = SrcParamData%nY_low - DstParamData%nZ_low = SrcParamData%nZ_low - DstParamData%NumGrid_low = SrcParamData%NumGrid_low - DstParamData%n_rp_max = SrcParamData%n_rp_max - DstParamData%dpol = SrcParamData%dpol - DstParamData%dXYZ_low = SrcParamData%dXYZ_low - DstParamData%dX_low = SrcParamData%dX_low - DstParamData%dY_low = SrcParamData%dY_low - DstParamData%dZ_low = SrcParamData%dZ_low - DstParamData%X0_low = SrcParamData%X0_low - DstParamData%Y0_low = SrcParamData%Y0_low - DstParamData%Z0_low = SrcParamData%Z0_low - if (allocated(SrcParamData%X0_high)) then - LB(1:1) = lbound(SrcParamData%X0_high) - UB(1:1) = ubound(SrcParamData%X0_high) - if (.not. allocated(DstParamData%X0_high)) then - allocate(DstParamData%X0_high(LB(1):UB(1)), stat=ErrStat2) +end subroutine + +subroutine AWAE_PackLRGChunkType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(LRGChunkType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AWAE_PackLRGChunkType' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%iChunk) + call RegPack(RF, InData%iSubGridX) + call RegPack(RF, InData%iSubGridY) + call RegPack(RF, InData%iSubGridZ) + call RegPackAlloc(RF, InData%iGridPoints) + call RegPack(RF, InData%nPoints) + call RegPack(RF, InData%oXYZ) + call RegPack(RF, InData%Size) + call RegPack(RF, InData%Center) + call RegPack(RF, InData%Radius) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AWAE_UnPackLRGChunkType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(LRGChunkType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AWAE_UnPackLRGChunkType' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%iChunk); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iSubGridX); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iSubGridY); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iSubGridZ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%iGridPoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nPoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%oXYZ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Size); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Center); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Radius); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AWAE_CopyLRGParamType(SrcLRGParamTypeData, DstLRGParamTypeData, CtrlCode, ErrStat, ErrMsg) + type(LRGParamType), intent(in) :: SrcLRGParamTypeData + type(LRGParamType), intent(inout) :: DstLRGParamTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AWAE_CopyLRGParamType' + ErrStat = ErrID_None + ErrMsg = '' + DstLRGParamTypeData%oXYZ = SrcLRGParamTypeData%oXYZ + DstLRGParamTypeData%dXYZ = SrcLRGParamTypeData%dXYZ + DstLRGParamTypeData%nXYZ = SrcLRGParamTypeData%nXYZ + DstLRGParamTypeData%nPoints = SrcLRGParamTypeData%nPoints + if (allocated(SrcLRGParamTypeData%GridPoints)) then + LB(1:2) = lbound(SrcLRGParamTypeData%GridPoints) + UB(1:2) = ubound(SrcLRGParamTypeData%GridPoints) + if (.not. allocated(DstLRGParamTypeData%GridPoints)) then + allocate(DstLRGParamTypeData%GridPoints(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%X0_high.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstLRGParamTypeData%GridPoints.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%X0_high = SrcParamData%X0_high + DstLRGParamTypeData%GridPoints = SrcLRGParamTypeData%GridPoints end if - if (allocated(SrcParamData%Y0_high)) then - LB(1:1) = lbound(SrcParamData%Y0_high) - UB(1:1) = ubound(SrcParamData%Y0_high) - if (.not. allocated(DstParamData%Y0_high)) then - allocate(DstParamData%Y0_high(LB(1):UB(1)), stat=ErrStat2) + DstLRGParamTypeData%Size = SrcLRGParamTypeData%Size + DstLRGParamTypeData%Center = SrcLRGParamTypeData%Center + if (allocated(SrcLRGParamTypeData%WakeChunks)) then + LB(1:1) = lbound(SrcLRGParamTypeData%WakeChunks) + UB(1:1) = ubound(SrcLRGParamTypeData%WakeChunks) + if (.not. allocated(DstLRGParamTypeData%WakeChunks)) then + allocate(DstLRGParamTypeData%WakeChunks(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Y0_high.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstLRGParamTypeData%WakeChunks.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%Y0_high = SrcParamData%Y0_high + do i1 = LB(1), UB(1) + call AWAE_CopyLRGChunkType(SrcLRGParamTypeData%WakeChunks(i1), DstLRGParamTypeData%WakeChunks(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcParamData%Z0_high)) then - LB(1:1) = lbound(SrcParamData%Z0_high) - UB(1:1) = ubound(SrcParamData%Z0_high) - if (.not. allocated(DstParamData%Z0_high)) then - allocate(DstParamData%Z0_high(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Z0_high.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Z0_high = SrcParamData%Z0_high +end subroutine + +subroutine AWAE_DestroyLRGParamType(LRGParamTypeData, ErrStat, ErrMsg) + type(LRGParamType), intent(inout) :: LRGParamTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AWAE_DestroyLRGParamType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(LRGParamTypeData%GridPoints)) then + deallocate(LRGParamTypeData%GridPoints) end if - if (allocated(SrcParamData%dX_high)) then - LB(1:1) = lbound(SrcParamData%dX_high) - UB(1:1) = ubound(SrcParamData%dX_high) - if (.not. allocated(DstParamData%dX_high)) then - allocate(DstParamData%dX_high(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%dX_high.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%dX_high = SrcParamData%dX_high + if (allocated(LRGParamTypeData%WakeChunks)) then + LB(1:1) = lbound(LRGParamTypeData%WakeChunks) + UB(1:1) = ubound(LRGParamTypeData%WakeChunks) + do i1 = LB(1), UB(1) + call AWAE_DestroyLRGChunkType(LRGParamTypeData%WakeChunks(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(LRGParamTypeData%WakeChunks) end if - if (allocated(SrcParamData%dY_high)) then - LB(1:1) = lbound(SrcParamData%dY_high) - UB(1:1) = ubound(SrcParamData%dY_high) - if (.not. allocated(DstParamData%dY_high)) then - allocate(DstParamData%dY_high(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%dY_high.', ErrStat, ErrMsg, RoutineName) - return - end if +end subroutine + +subroutine AWAE_PackLRGParamType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(LRGParamType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AWAE_PackLRGParamType' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%oXYZ) + call RegPack(RF, InData%dXYZ) + call RegPack(RF, InData%nXYZ) + call RegPack(RF, InData%nPoints) + call RegPackAlloc(RF, InData%GridPoints) + call RegPack(RF, InData%Size) + call RegPack(RF, InData%Center) + call RegPack(RF, allocated(InData%WakeChunks)) + if (allocated(InData%WakeChunks)) then + call RegPackBounds(RF, 1, lbound(InData%WakeChunks), ubound(InData%WakeChunks)) + LB(1:1) = lbound(InData%WakeChunks) + UB(1:1) = ubound(InData%WakeChunks) + do i1 = LB(1), UB(1) + call AWAE_PackLRGChunkType(RF, InData%WakeChunks(i1)) + end do + end if + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AWAE_UnPackLRGParamType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(LRGParamType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AWAE_UnPackLRGParamType' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%oXYZ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%dXYZ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nXYZ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nPoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%GridPoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Size); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Center); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%WakeChunks)) deallocate(OutData%WakeChunks) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%WakeChunks(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%WakeChunks.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if - DstParamData%dY_high = SrcParamData%dY_high + do i1 = LB(1), UB(1) + call AWAE_UnpackLRGChunkType(RF, OutData%WakeChunks(i1)) ! WakeChunks + end do end if - if (allocated(SrcParamData%dZ_high)) then - LB(1:1) = lbound(SrcParamData%dZ_high) - UB(1:1) = ubound(SrcParamData%dZ_high) - if (.not. allocated(DstParamData%dZ_high)) then - allocate(DstParamData%dZ_high(LB(1):UB(1)), stat=ErrStat2) +end subroutine + +subroutine AWAE_CopyHRGParamType(SrcHRGParamTypeData, DstHRGParamTypeData, CtrlCode, ErrStat, ErrMsg) + type(HRGParamType), intent(in) :: SrcHRGParamTypeData + type(HRGParamType), intent(inout) :: DstHRGParamTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'AWAE_CopyHRGParamType' + ErrStat = ErrID_None + ErrMsg = '' + DstHRGParamTypeData%WT_Position = SrcHRGParamTypeData%WT_Position + DstHRGParamTypeData%oXYZ = SrcHRGParamTypeData%oXYZ + DstHRGParamTypeData%dXYZ = SrcHRGParamTypeData%dXYZ + DstHRGParamTypeData%nXYZ = SrcHRGParamTypeData%nXYZ + DstHRGParamTypeData%nPoints = SrcHRGParamTypeData%nPoints + if (allocated(SrcHRGParamTypeData%GridPoints)) then + LB(1:2) = lbound(SrcHRGParamTypeData%GridPoints) + UB(1:2) = ubound(SrcHRGParamTypeData%GridPoints) + if (.not. allocated(DstHRGParamTypeData%GridPoints)) then + allocate(DstHRGParamTypeData%GridPoints(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%dZ_high.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstHRGParamTypeData%GridPoints.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%dZ_high = SrcParamData%dZ_high + DstHRGParamTypeData%GridPoints = SrcHRGParamTypeData%GridPoints end if - DstParamData%nX_high = SrcParamData%nX_high - DstParamData%nY_high = SrcParamData%nY_high - DstParamData%nZ_high = SrcParamData%nZ_high - if (allocated(SrcParamData%Grid_low)) then - LB(1:2) = lbound(SrcParamData%Grid_low) - UB(1:2) = ubound(SrcParamData%Grid_low) - if (.not. allocated(DstParamData%Grid_low)) then - allocate(DstParamData%Grid_low(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + DstHRGParamTypeData%Size = SrcHRGParamTypeData%Size + DstHRGParamTypeData%Center = SrcHRGParamTypeData%Center + DstHRGParamTypeData%Radius = SrcHRGParamTypeData%Radius +end subroutine + +subroutine AWAE_DestroyHRGParamType(HRGParamTypeData, ErrStat, ErrMsg) + type(HRGParamType), intent(inout) :: HRGParamTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'AWAE_DestroyHRGParamType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(HRGParamTypeData%GridPoints)) then + deallocate(HRGParamTypeData%GridPoints) + end if +end subroutine + +subroutine AWAE_PackHRGParamType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(HRGParamType), intent(in) :: InData + character(*), parameter :: RoutineName = 'AWAE_PackHRGParamType' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%WT_Position) + call RegPack(RF, InData%oXYZ) + call RegPack(RF, InData%dXYZ) + call RegPack(RF, InData%nXYZ) + call RegPack(RF, InData%nPoints) + call RegPackAlloc(RF, InData%GridPoints) + call RegPack(RF, InData%Size) + call RegPack(RF, InData%Center) + call RegPack(RF, InData%Radius) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AWAE_UnPackHRGParamType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(HRGParamType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'AWAE_UnPackHRGParamType' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%WT_Position); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%oXYZ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%dXYZ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nXYZ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nPoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%GridPoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Size); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Center); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Radius); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine AWAE_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) + type(AWAE_ParameterType), intent(in) :: SrcParamData + type(AWAE_ParameterType), intent(inout) :: DstParamData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'AWAE_CopyParam' + ErrStat = ErrID_None + ErrMsg = '' + DstParamData%WindFilePath = SrcParamData%WindFilePath + DstParamData%NumTurbines = SrcParamData%NumTurbines + DstParamData%NumRadii = SrcParamData%NumRadii + DstParamData%MaxPlanes = SrcParamData%MaxPlanes + call AWAE_CopyLRGParamType(SrcParamData%LowRes, DstParamData%LowRes, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcParamData%HighRes)) then + LB(1:1) = lbound(SrcParamData%HighRes) + UB(1:1) = ubound(SrcParamData%HighRes) + if (.not. allocated(DstParamData%HighRes)) then + allocate(DstParamData%HighRes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Grid_low.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%HighRes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%Grid_low = SrcParamData%Grid_low + do i1 = LB(1), UB(1) + call AWAE_CopyHRGParamType(SrcParamData%HighRes(i1), DstParamData%HighRes(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcParamData%Grid_high)) then - LB(1:3) = lbound(SrcParamData%Grid_high) - UB(1:3) = ubound(SrcParamData%Grid_high) - if (.not. allocated(DstParamData%Grid_high)) then - allocate(DstParamData%Grid_high(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (allocated(SrcParamData%y)) then + LB(1:1) = lbound(SrcParamData%y) + UB(1:1) = ubound(SrcParamData%y) + if (.not. allocated(DstParamData%y)) then + allocate(DstParamData%y(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Grid_high.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%y.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%Grid_high = SrcParamData%Grid_high + DstParamData%y = SrcParamData%y end if - if (allocated(SrcParamData%WT_Position)) then - LB(1:2) = lbound(SrcParamData%WT_Position) - UB(1:2) = ubound(SrcParamData%WT_Position) - if (.not. allocated(DstParamData%WT_Position)) then - allocate(DstParamData%WT_Position(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%z)) then + LB(1:1) = lbound(SrcParamData%z) + UB(1:1) = ubound(SrcParamData%z) + if (.not. allocated(DstParamData%z)) then + allocate(DstParamData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WT_Position.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%z.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%WT_Position = SrcParamData%WT_Position + DstParamData%z = SrcParamData%z end if + DstParamData%dPol = SrcParamData%dPol + DstParamData%Mod_AmbWind = SrcParamData%Mod_AmbWind + DstParamData%n_rp_max = SrcParamData%n_rp_max DstParamData%n_high_low = SrcParamData%n_high_low DstParamData%n_high_low_p1 = SrcParamData%n_high_low_p1 DstParamData%dt_low = SrcParamData%dt_low @@ -2008,6 +2073,11 @@ subroutine AWAE_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%C_Meander = SrcParamData%C_Meander DstParamData%C_ScaleDiam = SrcParamData%C_ScaleDiam DstParamData%Mod_Projection = SrcParamData%Mod_Projection + DstParamData%DirStartIndex = SrcParamData%DirStartIndex + DstParamData%DirIndexLen = SrcParamData%DirIndexLen + DstParamData%DirStartNum = SrcParamData%DirStartNum + DstParamData%DirIndexDeltaLow = SrcParamData%DirIndexDeltaLow + DstParamData%DirIndexDeltaHigh = SrcParamData%DirIndexDeltaHigh if (allocated(SrcParamData%IfW)) then LB(1:1) = lbound(SrcParamData%IfW) UB(1:1) = ubound(SrcParamData%IfW) @@ -2112,46 +2182,30 @@ subroutine AWAE_DestroyParam(ParamData, ErrStat, ErrMsg) type(AWAE_ParameterType), intent(inout) :: ParamData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'AWAE_DestroyParam' ErrStat = ErrID_None ErrMsg = '' + call AWAE_DestroyLRGParamType(ParamData%LowRes, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(ParamData%HighRes)) then + LB(1:1) = lbound(ParamData%HighRes) + UB(1:1) = ubound(ParamData%HighRes) + do i1 = LB(1), UB(1) + call AWAE_DestroyHRGParamType(ParamData%HighRes(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ParamData%HighRes) + end if if (allocated(ParamData%y)) then deallocate(ParamData%y) end if if (allocated(ParamData%z)) then deallocate(ParamData%z) end if - if (allocated(ParamData%X0_high)) then - deallocate(ParamData%X0_high) - end if - if (allocated(ParamData%Y0_high)) then - deallocate(ParamData%Y0_high) - end if - if (allocated(ParamData%Z0_high)) then - deallocate(ParamData%Z0_high) - end if - if (allocated(ParamData%dX_high)) then - deallocate(ParamData%dX_high) - end if - if (allocated(ParamData%dY_high)) then - deallocate(ParamData%dY_high) - end if - if (allocated(ParamData%dZ_high)) then - deallocate(ParamData%dZ_high) - end if - if (allocated(ParamData%Grid_low)) then - deallocate(ParamData%Grid_low) - end if - if (allocated(ParamData%Grid_high)) then - deallocate(ParamData%Grid_high) - end if - if (allocated(ParamData%WT_Position)) then - deallocate(ParamData%WT_Position) - end if if (allocated(ParamData%IfW)) then LB(1:1) = lbound(ParamData%IfW) UB(1:1) = ubound(ParamData%IfW) @@ -2186,42 +2240,29 @@ subroutine AWAE_PackParam(RF, Indata) type(RegFile), intent(inout) :: RF type(AWAE_ParameterType), intent(in) :: InData character(*), parameter :: RoutineName = 'AWAE_PackParam' - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) logical :: PtrInIndex if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%WindFilePath) call RegPack(RF, InData%NumTurbines) call RegPack(RF, InData%NumRadii) - call RegPack(RF, InData%NumPlanes) + call RegPack(RF, InData%MaxPlanes) + call AWAE_PackLRGParamType(RF, InData%LowRes) + call RegPack(RF, allocated(InData%HighRes)) + if (allocated(InData%HighRes)) then + call RegPackBounds(RF, 1, lbound(InData%HighRes), ubound(InData%HighRes)) + LB(1:1) = lbound(InData%HighRes) + UB(1:1) = ubound(InData%HighRes) + do i1 = LB(1), UB(1) + call AWAE_PackHRGParamType(RF, InData%HighRes(i1)) + end do + end if call RegPackAlloc(RF, InData%y) call RegPackAlloc(RF, InData%z) + call RegPack(RF, InData%dPol) call RegPack(RF, InData%Mod_AmbWind) - call RegPack(RF, InData%nX_low) - call RegPack(RF, InData%nY_low) - call RegPack(RF, InData%nZ_low) - call RegPack(RF, InData%NumGrid_low) call RegPack(RF, InData%n_rp_max) - call RegPack(RF, InData%dpol) - call RegPack(RF, InData%dXYZ_low) - call RegPack(RF, InData%dX_low) - call RegPack(RF, InData%dY_low) - call RegPack(RF, InData%dZ_low) - call RegPack(RF, InData%X0_low) - call RegPack(RF, InData%Y0_low) - call RegPack(RF, InData%Z0_low) - call RegPackAlloc(RF, InData%X0_high) - call RegPackAlloc(RF, InData%Y0_high) - call RegPackAlloc(RF, InData%Z0_high) - call RegPackAlloc(RF, InData%dX_high) - call RegPackAlloc(RF, InData%dY_high) - call RegPackAlloc(RF, InData%dZ_high) - call RegPack(RF, InData%nX_high) - call RegPack(RF, InData%nY_high) - call RegPack(RF, InData%nZ_high) - call RegPackAlloc(RF, InData%Grid_low) - call RegPackAlloc(RF, InData%Grid_high) - call RegPackAlloc(RF, InData%WT_Position) call RegPack(RF, InData%n_high_low) call RegPack(RF, InData%n_high_low_p1) call RegPack(RF, InData%dt_low) @@ -2231,6 +2272,11 @@ subroutine AWAE_PackParam(RF, Indata) call RegPack(RF, InData%C_Meander) call RegPack(RF, InData%C_ScaleDiam) call RegPack(RF, InData%Mod_Projection) + call RegPack(RF, InData%DirStartIndex) + call RegPack(RF, InData%DirIndexLen) + call RegPack(RF, InData%DirStartNum) + call RegPack(RF, InData%DirIndexDeltaLow) + call RegPack(RF, InData%DirIndexDeltaHigh) call RegPack(RF, allocated(InData%IfW)) if (allocated(InData%IfW)) then call RegPackBounds(RF, 1, lbound(InData%IfW), ubound(InData%IfW)) @@ -2269,8 +2315,8 @@ subroutine AWAE_UnPackParam(RF, OutData) type(RegFile), intent(inout) :: RF type(AWAE_ParameterType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'AWAE_UnPackParam' - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc integer(B8Ki) :: PtrIdx @@ -2279,35 +2325,26 @@ subroutine AWAE_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%WindFilePath); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumTurbines); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumRadii); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumPlanes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MaxPlanes); if (RegCheckErr(RF, RoutineName)) return + call AWAE_UnpackLRGParamType(RF, OutData%LowRes) ! LowRes + if (allocated(OutData%HighRes)) deallocate(OutData%HighRes) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%HighRes(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%HighRes.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call AWAE_UnpackHRGParamType(RF, OutData%HighRes(i1)) ! HighRes + end do + end if call RegUnpackAlloc(RF, OutData%y); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%z); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%dPol); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Mod_AmbWind); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nX_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nY_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nZ_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumGrid_low); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%n_rp_max); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dpol); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dXYZ_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dX_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dY_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dZ_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%X0_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Y0_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Z0_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%X0_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Y0_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Z0_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dX_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dY_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dZ_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nX_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nY_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nZ_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Grid_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Grid_high); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%WT_Position); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%n_high_low); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%n_high_low_p1); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%dt_low); if (RegCheckErr(RF, RoutineName)) return @@ -2317,6 +2354,11 @@ subroutine AWAE_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%C_Meander); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%C_ScaleDiam); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Mod_Projection); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DirStartIndex); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DirIndexLen); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DirStartNum); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DirIndexDeltaLow); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DirIndexDeltaHigh); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%IfW)) deallocate(OutData%IfW) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -2523,6 +2565,18 @@ subroutine AWAE_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'AWAE_CopyInput' ErrStat = ErrID_None ErrMsg = '' + if (allocated(SrcInputData%NumPlanes)) then + LB(1:1) = lbound(SrcInputData%NumPlanes) + UB(1:1) = ubound(SrcInputData%NumPlanes) + if (.not. allocated(DstInputData%NumPlanes)) then + allocate(DstInputData%NumPlanes(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%NumPlanes.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputData%NumPlanes = SrcInputData%NumPlanes + end if if (allocated(SrcInputData%xhat_plane)) then LB(1:3) = lbound(SrcInputData%xhat_plane) UB(1:3) = ubound(SrcInputData%xhat_plane) @@ -2616,6 +2670,9 @@ subroutine AWAE_DestroyInput(InputData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'AWAE_DestroyInput' ErrStat = ErrID_None ErrMsg = '' + if (allocated(InputData%NumPlanes)) then + deallocate(InputData%NumPlanes) + end if if (allocated(InputData%xhat_plane)) then deallocate(InputData%xhat_plane) end if @@ -2644,6 +2701,7 @@ subroutine AWAE_PackInput(RF, Indata) type(AWAE_InputType), intent(in) :: InData character(*), parameter :: RoutineName = 'AWAE_PackInput' if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%NumPlanes) call RegPackAlloc(RF, InData%xhat_plane) call RegPackAlloc(RF, InData%p_plane) call RegPackAlloc(RF, InData%Vx_wake) @@ -2662,6 +2720,7 @@ subroutine AWAE_UnPackInput(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%NumPlanes); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%xhat_plane); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%p_plane); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Vx_wake); if (RegCheckErr(RF, RoutineName)) return @@ -2670,5 +2729,280 @@ subroutine AWAE_UnPackInput(RF, OutData) call RegUnpackAlloc(RF, OutData%D_wake); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WAT_k); if (RegCheckErr(RF, RoutineName)) return end subroutine + +function AWAE_InputMeshPointer(u, DL) result(Mesh) + type(AWAE_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function AWAE_OutputMeshPointer(y, DL) result(Mesh) + type(AWAE_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine AWAE_VarsPackContState(Vars, x, ValAry) + type(AWAE_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call AWAE_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine AWAE_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(AWAE_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AWAE_x_Dummy) + VarVals(1) = x%Dummy ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AWAE_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(AWAE_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call AWAE_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine AWAE_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(AWAE_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AWAE_x_Dummy) + x%Dummy = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function AWAE_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AWAE_x_Dummy) + Name = "x%Dummy" + case default + Name = "Unknown Field" + end select +end function + +subroutine AWAE_VarsPackContStateDeriv(Vars, x, ValAry) + type(AWAE_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call AWAE_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine AWAE_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(AWAE_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AWAE_x_Dummy) + VarVals(1) = x%Dummy ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AWAE_VarsPackInput(Vars, u, ValAry) + type(AWAE_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call AWAE_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine AWAE_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(AWAE_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AWAE_u_NumPlanes) + VarVals = u%NumPlanes(V%iLB:V%iUB) ! Rank 1 Array + case (AWAE_u_xhat_plane) + VarVals = u%xhat_plane(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (AWAE_u_p_plane) + VarVals = u%p_plane(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (AWAE_u_Vx_wake) + VarVals = u%Vx_wake(V%iLB:V%iUB, V%j, V%k, V%m) ! Rank 4 Array + case (AWAE_u_Vy_wake) + VarVals = u%Vy_wake(V%iLB:V%iUB, V%j, V%k, V%m) ! Rank 4 Array + case (AWAE_u_Vz_wake) + VarVals = u%Vz_wake(V%iLB:V%iUB, V%j, V%k, V%m) ! Rank 4 Array + case (AWAE_u_D_wake) + VarVals = u%D_wake(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (AWAE_u_WAT_k) + VarVals = u%WAT_k(V%iLB:V%iUB, V%j, V%k, V%m) ! Rank 4 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AWAE_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(AWAE_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call AWAE_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine AWAE_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(AWAE_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AWAE_u_NumPlanes) + u%NumPlanes(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (AWAE_u_xhat_plane) + u%xhat_plane(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (AWAE_u_p_plane) + u%p_plane(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (AWAE_u_Vx_wake) + u%Vx_wake(V%iLB:V%iUB, V%j, V%k, V%m) = VarVals ! Rank 4 Array + case (AWAE_u_Vy_wake) + u%Vy_wake(V%iLB:V%iUB, V%j, V%k, V%m) = VarVals ! Rank 4 Array + case (AWAE_u_Vz_wake) + u%Vz_wake(V%iLB:V%iUB, V%j, V%k, V%m) = VarVals ! Rank 4 Array + case (AWAE_u_D_wake) + u%D_wake(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (AWAE_u_WAT_k) + u%WAT_k(V%iLB:V%iUB, V%j, V%k, V%m) = VarVals ! Rank 4 Array + end select + end associate +end subroutine + +function AWAE_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AWAE_u_NumPlanes) + Name = "u%NumPlanes" + case (AWAE_u_xhat_plane) + Name = "u%xhat_plane" + case (AWAE_u_p_plane) + Name = "u%p_plane" + case (AWAE_u_Vx_wake) + Name = "u%Vx_wake" + case (AWAE_u_Vy_wake) + Name = "u%Vy_wake" + case (AWAE_u_Vz_wake) + Name = "u%Vz_wake" + case (AWAE_u_D_wake) + Name = "u%D_wake" + case (AWAE_u_WAT_k) + Name = "u%WAT_k" + case default + Name = "Unknown Field" + end select +end function + +subroutine AWAE_VarsPackOutput(Vars, y, ValAry) + type(AWAE_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call AWAE_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine AWAE_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(AWAE_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AWAE_y_Vdist_High_data) + VarVals = y%Vdist_High(DL%i1)%data(V%iLB:V%iUB, V%j, V%k, V%m, V%n) ! Rank 5 Array + case (AWAE_y_V_plane) + VarVals = y%V_plane(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (AWAE_y_TI_amb) + VarVals = y%TI_amb(V%iLB:V%iUB) ! Rank 1 Array + case (AWAE_y_Vx_wind_disk) + VarVals = y%Vx_wind_disk(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine AWAE_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(AWAE_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call AWAE_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine AWAE_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(AWAE_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (AWAE_y_Vdist_High_data) + y%Vdist_High(DL%i1)%data(V%iLB:V%iUB, V%j, V%k, V%m, V%n) = VarVals ! Rank 5 Array + case (AWAE_y_V_plane) + y%V_plane(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (AWAE_y_TI_amb) + y%TI_amb(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (AWAE_y_Vx_wind_disk) + y%Vx_wind_disk(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function AWAE_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (AWAE_y_Vdist_High_data) + Name = "y%Vdist_High("//trim(Num2LStr(DL%i1))//")%data" + case (AWAE_y_V_plane) + Name = "y%V_plane" + case (AWAE_y_TI_amb) + Name = "y%TI_amb" + case (AWAE_y_Vx_wind_disk) + Name = "y%Vx_wind_disk" + case default + Name = "Unknown Field" + end select +end function + END MODULE AWAE_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/awae/src/amrex_utils.F90 b/modules/awae/src/amrex_utils.F90 new file mode 100644 index 0000000000..26d271bfe1 --- /dev/null +++ b/modules/awae/src/amrex_utils.F90 @@ -0,0 +1,201 @@ +module amrex_utils +use iso_c_binding +use NWTC_Library + +#ifdef ENABLE_AMREX_LIB +use amrex_base_module, only: amrex_init, amrex_finalize +#endif + +implicit none + +private + +interface + subroutine amrex_read_header_c(dir_path, t, dims, dx, origin, err_stat, err_msg, err_msg_len) bind(c) + import + implicit none + character(kind=c_char), intent(in) :: dir_path(*) + real(kind=c_double), intent(out) :: t + integer(kind=c_int), intent(out) :: dims(3) + real(kind=c_double), intent(out) :: dx(3) + real(kind=c_double), intent(out) :: origin(3) + integer(kind=c_int), intent(out) :: err_stat + character(kind=c_char), intent(out) :: err_msg(*) + integer(kind=c_int), intent(in) :: err_msg_len + end subroutine + + subroutine amrex_read_data_c(dir_path, data, err_stat, err_msg, err_msg_len) bind(c) + import + implicit none + character(kind=c_char), intent(in) :: dir_path(*) + real(kind=c_float), intent(out) :: data(*) + integer(kind=c_int), intent(out) :: err_stat + character(kind=c_char), intent(out) :: err_msg(*) + integer(kind=c_int), intent(in) :: err_msg_len + end subroutine + + subroutine amrex_find_subvols_c(dir_path, subvol, dt, num_step, start_index, first_index, & + index_delta, err_stat, err_msg, err_msg_len) bind(c) + import + implicit none + character(kind=c_char), intent(in) :: dir_path(*) + integer(kind=c_int), intent(in) :: subvol + character(kind=c_char), intent(in) :: start_index(*) + real(kind=c_double), intent(in) :: dt + integer(kind=c_int), intent(in) :: num_step + integer(kind=c_int), intent(out) :: first_index + integer(kind=c_int), intent(out) :: index_delta + integer(kind=c_int), intent(out) :: err_stat + character(kind=c_char), intent(out) :: err_msg(*) + integer(kind=c_int), intent(in) :: err_msg_len + end subroutine +end interface + +public :: amrex_init, amrex_finalize +public :: amrex_read_header, amrex_read_data, amrex_find_subvols + +contains + +#ifndef ENABLE_AMREX_LIB + +subroutine amrex_init(arg_parmparse) + logical, optional, intent(in) :: arg_parmparse +end subroutine + +subroutine amrex_finalize() +end subroutine + +#endif + +! Read the header information for the AMReX grid and return it. +subroutine amrex_read_header(DirPath, time, nXYZ, dXYZ, oXYZ, ErrStat, ErrMsg) + character(*), intent(in) :: DirPath + real(DbKi), intent(out) :: Time + Integer(IntKi), intent(out) :: nXYZ(3) + real(ReKi), intent(out) :: dXYZ(3) + real(ReKi), intent(out) :: oXYZ(3) + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(c_char), allocatable :: dir_path(:) + integer(c_int) :: err_stat_c + character(c_char) :: err_msg_c(ErrMsgLen) + integer(c_int) :: dims(3) + real(c_double) :: t, origin(3), gridSpacing(3) + integer(IntKi) :: i + +#ifdef ENABLE_AMREX_LIB + + ! Convert directory path to C type + allocate(dir_path(len_trim(DirPath) + 1)) + dir_path = transfer(trim(DirPath) // c_null_char, dir_path) + + ! Call C++ function to read header + call amrex_read_header_c(dir_path, t, dims, gridSpacing, origin, err_stat_c, err_msg_c, ErrMsgLen) + + ! Transfer outputs back to fortran types + time = real(t, DbKi) + nXYZ = int(dims, IntKi) + dXYZ = real(gridSpacing, ReKi) + oXYZ = real(origin, ReKi) + ErrStat = int(err_stat_c, IntKi) + ErrMsg = transfer(err_msg_c, ErrMsg) + i = index(ErrMsg, c_null_char) + if (i > 0) ErrMsg = ErrMsg(:i-1) + +#else + call SetErrStat(ErrID_Fatal, "AMReX library unavailable. Enable with -DAMREX_READER during compile with cmake on Linux, or change FAST.Farm Mod_AmbWind type", ErrStat, ErrMsg, "amrex_read_header") +#endif +end subroutine + +! Read the XYZ velocity grid data into the FAST.Farm ambient wind data array [XYZ,NX,NY,NZ]. +! This function cannot be called in parallel due to internal restrictions of the AMReX library. +subroutine amrex_read_data(DirPath, gridData, ErrStat, ErrMsg) + character(*), intent(in) :: DirPath + real(SiKi), intent(out) :: gridData(:,:,:,:) + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(c_char), allocatable :: dir_path(:) + integer(c_int) :: err_stat_c + character(c_char) :: err_msg_c(ErrMsgLen) + integer(IntKi) :: i + +#ifdef ENABLE_AMREX_LIB + + ! Convert directory path to C type + allocate(dir_path(len_trim(DirPath) + 1)) + dir_path = transfer(trim(DirPath) // c_null_char, dir_path) + + ! Call C++ function to read header + call amrex_read_data_c(dir_path, gridData, err_stat_c, err_msg_c, ErrMsgLen) + + ! Transfer outputs back to fortran types + ErrStat = int(err_stat_c, IntKi) + ErrMsg = transfer(err_msg_c, ErrMsg) + i = index(ErrMsg, c_null_char) + if (i > 0) ErrMsg = ErrMsg(:i-1) + +#else + call SetErrStat(ErrID_Fatal, "AMReX library unavailable. Enable with -DAMREX_READER during compile with cmake on Linux, or change FAST.Farm Mod_AmbWind type", ErrStat, ErrMsg, "amrex_read_data") +#endif +end subroutine + +! Search for AMReX directories based on given directory prefix, sub-volume +! number, time step, total number of steps, and the starting index string +! (e.g. `00000`). This function returns first index as a number, and the delta +! between successive directory indices. It also checks that a sufficient number +! of directories are available, that the data matches the requested time step, +! and the grid properties are consistent (size, origin, spacing). +subroutine amrex_find_subvols(DirPath, SubVol, DT, NumStep, StartIndex, & + FirstIndex, IndexDelta, ErrStat, ErrMsg) + character(*), intent(in) :: DirPath + integer(IntKi), intent(in) :: SubVol + real(DbKi), intent(in) :: DT ! Time step + integer(IntKi), intent(in) :: NumStep ! Number of steps + character(*), intent(in) :: StartIndex + integer(IntKi), intent(out) :: FirstIndex, IndexDelta + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(c_char), allocatable :: dir_path(:) + character(c_char), allocatable :: start_index(:) + real(c_double) :: dt_c + integer(c_int) :: num_step, first_index, index_delta, subvol_c + integer(c_int) :: err_stat_c + character(c_char) :: err_msg_c(ErrMsgLen) + integer(IntKi) :: i + +#ifdef ENABLE_AMREX_LIB + + ! Convert directory path to C type + allocate(dir_path(len_trim(DirPath) + 1)) + dir_path = transfer(trim(DirPath) // c_null_char, dir_path) + + ! Convert start directory to C type + allocate(start_index(len_trim(StartIndex) + 1)) + start_index = transfer(trim(StartIndex) // c_null_char, start_index) + + ! Transfer inputs to C types + subvol_c = int(SubVol, c_int) + num_step = int(NumStep, c_int) + dt_c = real(DT, c_double) + + ! Call C++ routine to find first index and index delta values + call amrex_find_subvols_c(dir_path, subvol_c, dt_c, num_step, start_index, first_index, & + index_delta, err_stat_c, err_msg_c, ErrMsgLen) + + ! Transfer outputs to fortran types + FirstIndex = int(first_index, IntKi) + IndexDelta = int(index_delta, IntKi) + ErrStat = int(err_stat_c, IntKi) + ErrMsg = transfer(err_msg_c, ErrMsg) + i = index(ErrMsg, c_null_char) + if (i > 0) ErrMsg = ErrMsg(:i-1) + +#else + call SetErrStat(ErrID_Fatal, "AMReX library unavailable. Enable with -DAMREX_READER during compile with cmake on Linux, or change FAST.Farm Mod_AmbWind type", ErrStat, ErrMsg, "amrex_find_subvols") +#endif +end subroutine + +end module diff --git a/modules/awae/src/amrex_utils.cpp b/modules/awae/src/amrex_utils.cpp new file mode 100644 index 0000000000..0725ed0a91 --- /dev/null +++ b/modules/awae/src/amrex_utils.cpp @@ -0,0 +1,442 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +const auto ErrID_None = 0; +const auto ErrID_Info = 1; +const auto ErrID_Warn = 2; +const auto ErrID_Severe = 3; +const auto ErrID_Fatal = 4; + +using namespace amrex; + +// Set the value of err_stat and err_msg +void set_err(int err_stat_id, std::string err_msg_str, const std::string &routine, int &err_stat, char *err_msg, int err_msg_len) +{ + err_stat = err_stat_id; + if (err_stat != ErrID_None) + { + err_msg_str = routine + ": " + err_msg_str; + err_msg_str.resize(err_msg_len, ' '); + } + else + { + err_msg_str.assign(err_msg_len, ' '); + } + err_msg_str.copy(err_msg, err_msg_len); +} + +inline int get_grid_data_index(int w, int x, int y, int z, + int dim_w, int dim_x, int dim_y) +{ + // Note: dim_z is not needed for the math because 'z' is the + // slowest varying dimension in this column-major layout. + return w + dim_w * (x + dim_x * (y + dim_y * z)); +} + +// Calculate grid bounds +// This requires looping over all of the boxes and finding the +// max of the maximum indices and the min of the minimum indices +// across all boxes. +void get_grid_bounds(const PlotFileData &pf, int level, + std::array &gridLo, + std::array &gridHi) +{ + for (auto i = 0; i < 3; ++i) + { + gridLo[i] = std::numeric_limits::max(); + gridHi[i] = std::numeric_limits::lowest(); + } + const auto ba = pf.boxArray(level); + for (auto i = 0; i < ba.size(); ++i) + { + const auto &b = ba[i]; + for (auto j = 0; j < 3; ++j) + { + gridLo[j] = std::min(gridLo[j], b.smallEnd(j)); + gridHi[j] = std::max(gridHi[j], b.bigEnd(j)); + } + } +} + +// Define the variable names +// const std::array var_names{"x_velocity", "y_velocity", "z_velocity"}; + +extern "C" +{ + // Read the header information for the AMReX grid and return it. + void amrex_read_header_c(char const *dir, double &time, int dims[3], double dx[3], + double origin[3], int &err_stat, char *err_msg, int &err_msg_len) + { + const std::string routine{"amrex_read_header_c"}; + + // Initialize error status and message to no error + set_err(ErrID_None, "", routine, err_stat, err_msg, err_msg_len); + + // Try to open directory containing plot file data + std::optional pf; + try + { + pf = std::optional(dir); + } + // Catch any exceptions + catch (...) + { + set_err(ErrID_Fatal, "error opening '" + std::string{dir} + "'", + routine, err_stat, err_msg, err_msg_len); + return; + } + + // Read finest level, return error if not 0 + int fine_level = pf->finestLevel(); + if (fine_level != 0) + { + set_err(ErrID_Fatal, std::string{dir} + ": finest level must be 0, got " + std::to_string(fine_level), + routine, err_stat, err_msg, err_msg_len); + return; + } + + // Read number of dimensions, return error if not 3 + const int ncomp = pf->nComp(); + if (ncomp != 3) + { + set_err(ErrID_Fatal, std::string{dir} + ": data dimensionality must be 3, got " + std::to_string(ncomp), + routine, err_stat, err_msg, err_msg_len); + return; + } + + // Get the time + time = pf->time(); + + // Get the grid dimensions + std::array gridLo{0}, gridHi{0}, n_cells{0}; + get_grid_bounds(*pf, fine_level, gridLo, gridHi); + for (auto i = 0; i < 3; ++i) + { + n_cells[i] = gridHi[i] - gridLo[i] + 1; + dims[i] = n_cells[i]; + } + + // Get the grid discretization + auto cellSize = pf->cellSize(fine_level); + for (auto i = 0; i < 3; ++i) + { + dx[i] = cellSize[i]; + } + + // Calculate the origin (problem origin + (grid index + 1/2) * cell size) + const auto probLo = pf->probLo(); + for (auto i = 0; i < 3; ++i) + { + origin[i] = probLo[i] + static_cast(gridLo[i] + 0.5) * dx[i]; + } + + // Get variable names and check that there are at least 3 variables + const auto &var_names_pf = pf->varNames(); + if (var_names_pf.size() < 3) + { + set_err(ErrID_Fatal, std::string{dir} + ": at least 3 variables required, found " + std::to_string(var_names_pf.size()), + routine, err_stat, err_msg, err_msg_len); + return; + } + } + + // Read the XYZ velocity grid data into the FAST.Farm ambient wind data array [XYZ,NX,NY,NZ]. + // This function cannot be called in parallel due to internal restrictions of the AMReX library. + void amrex_read_data_c(char const *dir, float *data, int &err_stat, char *err_msg, int &err_msg_len) + { + const std::string routine{"amrex_read_data_c"}; + + // Initialize error status and message to no error + set_err(ErrID_None, "", routine, err_stat, err_msg, err_msg_len); + + // Try to open directory containing plot file data + std::optional pf; + try + { + pf = std::optional(dir); + } + // Catch any exceptions + catch (...) + { + set_err(ErrID_Fatal, "error opening '" + std::string{dir} + "'", + routine, err_stat, err_msg, err_msg_len); + return; + } + + // Read finest level, return error if not 0 + int fine_level = pf->finestLevel(); + if (fine_level != 0) + { + set_err(ErrID_Fatal, std::string{dir} + ": finest level must be 0, got " + std::to_string(fine_level), + routine, err_stat, err_msg, err_msg_len); + return; + } + + // Get overall grid bounds + std::array dims{0}, gridLo{0}, gridHi{0}; + get_grid_bounds(*pf, fine_level, gridLo, gridHi); + for (auto i = 0; i < 3; ++i) + { + dims[i] = gridHi[i] - gridLo[i] + 1; + } + + // Get the variable names + const auto var_names = pf->varNames(); + + // Loop through variables + for (int ivar = 0; ivar < 3; ++ivar) + { + // Get data for variable at given level + const auto &mf = pf->get(fine_level, var_names[ivar]); + + // Loop through boxes of data + for (MFIter mfi(mf); mfi.isValid(); ++mfi) + { + // Get box, if not valid, continue + const auto &bx = mfi.validbox(); + if (!bx.ok()) + { + continue; + } + + // Get reference to data + const auto &fab = mf.array(mfi); + + // Get box upper and lower bounds + const auto lo = amrex::lbound(bx); + const auto hi = amrex::ubound(bx); + + // Loop through box dimensions + for (int k = lo.z; k <= hi.z; ++k) + { + const auto gk = k - gridLo[2]; + for (int j = lo.y; j <= hi.y; ++j) + { + const auto gj = j - gridLo[1]; + for (int i = lo.x; i <= hi.x; ++i) + { + const auto gi = i - gridLo[0]; + const auto di = get_grid_data_index(ivar, gi, gj, gk, 3, dims[0], dims[1]); + const auto v = fab(i, j, k); + data[di] = static_cast(v); + } + } + } + } + } + } + + // Search for AMReX directories based on given directory prefix, subvolume number, time step, total number of steps, + // and the starting index string (e.g. `00000`). This function returns first index as a number, and the delta + // between successive directory indices. It also checks that a sufficient number of directories are available, + // that the data matches the requested time step, and the grid properties are consistent (size, origin, spacing). + void amrex_find_subvols_c(char const *dir_prefix, int &subvol, double &dt, int &num_steps, char const *start_index, + int &first_index, int &index_delta, int &err_stat, char *err_msg, int &err_msg_len) + { + const std::string routine{"amrex_find_subvols_c"}; + + // Initialize error status and message to no error + set_err(ErrID_None, "", routine, err_stat, err_msg, err_msg_len); + + // Construct path prefix based on directory prefix and subvolume number + const std::filesystem::path path_prefix{std::string{dir_prefix} + "_" + std::to_string(subvol) + "_"}; + + // Vector of index strings that match directory prefix and are + // greater than or equal to starting index + std::vector indices; + + //---------------------------------------------------------------------- + // Starting subvolume path + //---------------------------------------------------------------------- + + // Open subvolume with starting index + const auto first_path = path_prefix.string() + std::string{start_index}; + + // If file does not exist, return error + if (!std::filesystem::exists(first_path)) + { + set_err(ErrID_Fatal, first_path + ": directory does not exist", + routine, err_stat, err_msg, err_msg_len); + return; + } + + // Read start header + double start_time{0.}; + std::array start_dims; + std::array start_dx, start_origin; + amrex_read_header_c(first_path.c_str(), start_time, start_dims.data(), + start_dx.data(), start_origin.data(), err_stat, err_msg, err_msg_len); + if (err_stat != ErrID_None) + { + return; + } + + // Save integer value of start index + first_index = std::stoi(start_index); + + // Add first index to list of valid indices + indices.emplace_back(first_index); + + //---------------------------------------------------------------------- + // Subsequent subvolume paths + //---------------------------------------------------------------------- + + // If path prefix has parent directory use it, otherwise assume current directory + const auto parent_path = path_prefix.has_parent_path() ? path_prefix.parent_path() : "."; + + // Calculate maximum length of time from start time + const auto max_time = static_cast(num_steps) * dt; + + // Loop through entries in the parent directory + for (auto const &dir_entry : std::filesystem::directory_iterator{parent_path}) + { + // If entry is not a directory, continue + if (!dir_entry.is_directory()) + { + continue; + } + + // Convert entry to path string + const auto dir_path{dir_entry.path().string()}; + + // If path doesn't contain the prefix, continue + if (dir_path.find(path_prefix.string()) == std::string::npos) + { + continue; + } + + // Get the index string + const auto index = dir_path.substr(dir_path.find_last_of("_") + 1); + + // If index string is less than starting index, continue + if (index.compare(start_index) <= 0) + { + continue; + } + + // Read the header + double time{0.}; + std::array dims; + std::array dx, origin; + amrex_read_header_c(dir_path.c_str(), time, dims.data(), + dx.data(), origin.data(), err_stat, err_msg, err_msg_len); + if (err_stat != ErrID_None) + { + return; + } + + // Get time delta from start time + const auto delta_time{time - start_time}; + + // If the delta time is greater than the max time plus dt (for safety), continue + if (delta_time > (max_time + dt / 4.)) + { + continue; + } + + // If delta time is not a multiple of dt, continue + // (remainder must be nearly zero or nearly equal to dt) + // A tolerance of 1e-6 seconds seems reasonable + const auto remainder{std::fmod(delta_time, dt)}; + if (!((std::abs(remainder - 0.0) <= 1e-6) || + ((std::abs(remainder - dt) <= 1e-6)))) + { + continue; + } + + // Check that grid properties from this directory match those of + // the starting directory + if ((start_dims[0] != dims[0]) || (start_dims[1] != dims[1]) || (start_dims[2] != dims[2])) + { + const auto dims_str = "(" + std::to_string(dims[0]) + ", " + std::to_string(dims[1]) + ", " + std::to_string(dims[2]) + ")"; + const auto start_dims_str = "(" + std::to_string(start_dims[0]) + ", " + std::to_string(start_dims[1]) + ", " + std::to_string(start_dims[2]) + ")"; + set_err(ErrID_Fatal, dir_path + ": grid dimensions " + dims_str + " doesn't match starting grid dimensions " + start_dims_str, + routine, err_stat, err_msg, err_msg_len); + return; + } + if ((std::abs(start_dx[0] - dx[0]) > 1e-8) || (std::abs(start_dx[1] - dx[1]) > 1e-8) || (std::abs(start_dx[2] - dx[2]) > 1e-8)) + { + const auto dx_str = "(" + std::to_string(dx[0]) + ", " + std::to_string(dx[1]) + ", " + std::to_string(dx[2]) + ")"; + const auto start_dx_str = "(" + std::to_string(start_dx[0]) + ", " + std::to_string(start_dx[1]) + ", " + std::to_string(start_dx[2]) + ")"; + set_err(ErrID_Fatal, dir_path + ": grid spacing " + dx_str + " doesn't match starting grid spacing " + start_dx_str, + routine, err_stat, err_msg, err_msg_len); + return; + } + if ((std::abs(start_origin[0] - origin[0]) > 1e-8) || (std::abs(start_origin[1] - origin[1]) > 1e-8) || (std::abs(start_origin[2] - origin[2]) > 1e-8)) + { + const auto origin_str = "(" + std::to_string(origin[0]) + ", " + std::to_string(origin[1]) + ", " + std::to_string(origin[2]) + ")"; + const auto start_origin_str = "(" + std::to_string(start_origin[0]) + ", " + std::to_string(start_origin[1]) + ", " + std::to_string(start_origin[2]) + ")"; + set_err(ErrID_Fatal, dir_path + ": grid origin " + origin_str + " doesn't match starting grid origin " + start_origin_str, + routine, err_stat, err_msg, err_msg_len); + return; + } + + // Add index to list of indices + indices.emplace_back(std::stoi(index)); + } + + //---------------------------------------------------------------------- + // Check indices + //---------------------------------------------------------------------- + + // Check that more than one index was found + if (indices.size() < 2) + { + set_err(ErrID_Fatal, path_prefix.string() + ": only 1 subvolume found, at least 2 required", + routine, err_stat, err_msg, err_msg_len); + return; + } + + // Sort indices in ascending order + std::sort(indices.begin(), indices.end()); + + // If more indices found that requested steps, discard extra + if (indices.size() > num_steps) + { + indices.resize(num_steps); + } + + // Calculate delta between first two indices + const auto first_index_delta = indices[1] - indices[0]; + + // If fewer indices found than requested steps, return error + if (indices.size() < num_steps) + { + std::string msg{path_prefix.string() + ": "}; + msg += "found " + std::to_string(indices.size()) + " dirs, "; + msg += std::to_string(num_steps) + " dirs were requested "; + msg += "with a dt of " + std::to_string(dt) + " seconds ("; + msg += "first index=" + std::to_string(indices[0]) + ", "; + msg += "last index=" + std::to_string(indices.back()) + ", "; + msg += "index step=" + std::to_string(first_index_delta) + ")"; + set_err(ErrID_Fatal, msg, routine, err_stat, err_msg, err_msg_len); + return; + } + + // Loop through indices and check that none are missing + // ie, same delta between all adjacent indicies + for (auto i = 1; i < indices.size(); ++i) + { + // Calculate index delta between current and previous indices + index_delta = indices[i] - indices[i - 1]; + + // If delta doesn't match first delta, return error + if (index_delta != first_index_delta) + { + std::string msg{path_prefix.string() + ": "}; + msg += "inconsistent delta between indices '" + std::to_string(indices[i - 1]); + msg += "' and '" + std::to_string(indices[i]) + "'"; + set_err(ErrID_Fatal, msg, routine, err_stat, err_msg, err_msg_len); + return; + } + } + } +} diff --git a/modules/awae/src/vtk.cpp b/modules/awae/src/vtk.cpp new file mode 100644 index 0000000000..3b4e5bbf11 --- /dev/null +++ b/modules/awae/src/vtk.cpp @@ -0,0 +1,233 @@ +//------------------------------------------------------------------------------ +// VTK inflow reading utilities for the AWAE module +//------------------------------------------------------------------------------ + +#include +#include +#include +#include +#include +#include + +#include "fast_float.h" + +const auto MaxChars{1023}; + +void convert_string_to_uppercase(std::string &str) +{ + std::transform(str.begin(), str.end(), str.begin(), + [](unsigned char c) + { return std::toupper(c); }); +} + +void copy_string_to_array(const std::string &source, char destination[MaxChars]) +{ + const auto n_chars = source.copy(destination, MaxChars); + for (auto i = n_chars; i < MaxChars; ++i) + { + destination[i] = ' '; + } +} + +const auto ErrID_None{0}; +const auto ErrID_Info{1}; +const auto ErrID_Warn{2}; +const auto ErrID_Severe{3}; +const auto ErrID_Fatal{4}; + +extern "C" +{ + void ReadVTK_inflow_info(const char filename[], char desc[MaxChars], + int dims[3], double origin[3], double spacing[3], + char vec_label[MaxChars], float values[], int *read_values, + int *err_stat, char err_msg[MaxChars]) + { + // Initialize error status and message + *err_stat = ErrID_Fatal; + copy_string_to_array("", err_msg); + + // Open the file + std::ifstream inputFile(filename); + + // If file wasn't opened, return error + if (!inputFile.is_open()) + { + copy_string_to_array((std::string("Error opening file: '") + filename + "'"), err_msg); + return; + } + + // Read entire file into buffer + std::stringstream buffer; + buffer << inputFile.rdbuf(); + + std::string line; + std::string label; + + std::getline(buffer, line); // Header + std::getline(buffer, line); // Description + copy_string_to_array(line, desc); + + // Format label + std::getline(buffer, line); + convert_string_to_uppercase(line); + if (line.find("ASCII") == std::string::npos) + { + copy_string_to_array("Invalid vtk structured_points file: did not find ASCII label", err_msg); + return; + } + + // Dataset + std::getline(buffer, line); + convert_string_to_uppercase(line); + if (line.find("DATASET") == std::string::npos) + { + copy_string_to_array("Invalid vtk structured_points file: did not find DATASET label", err_msg); + return; + } + if (line.find("STRUCTURED_POINTS") == std::string::npos) + { + copy_string_to_array("Invalid vtk structured_points file: did not find STRUCTURED_POINTS label", err_msg); + return; + } + + // Dimensions + std::getline(buffer, line); + convert_string_to_uppercase(line); + if (line.find("DIMENSIONS") == std::string::npos) + { + copy_string_to_array("Invalid vtk structured_points file: did not find DIMENSIONS label", err_msg); + return; + } + { + std::istringstream iss(line); + iss >> label >> dims[0] >> dims[1] >> dims[2]; + } + + // Origin + std::getline(buffer, line); + convert_string_to_uppercase(line); + if (line.find("ORIGIN") == std::string::npos) + { + copy_string_to_array("Invalid vtk structured_points file: did not find ORIGIN label", err_msg); + return; + } + { + std::istringstream iss(line); + iss >> label >> origin[0] >> origin[1] >> origin[2]; + } + + // Spacing + std::getline(buffer, line); + convert_string_to_uppercase(line); + if (line.find("SPACING") == std::string::npos) + { + copy_string_to_array("Invalid vtk structured_points file: did not find SPACING label", err_msg); + return; + } + { + std::istringstream iss(line); + iss >> label >> spacing[0] >> spacing[1] >> spacing[2]; + } + + // Point data + std::getline(buffer, line); + convert_string_to_uppercase(line); + if (line.find("POINT_DATA") == std::string::npos) + { + copy_string_to_array("Invalid vtk structured_points file: did not find POINT_DATA label", err_msg); + return; + } + int n_points{0}; + { + std::istringstream iss(line); + iss >> label >> n_points; + } + if (n_points != (dims[0] * dims[1] * dims[2])) + { + copy_string_to_array("Invalid vtk structured_points file: POINT_DATA does not match DIMENSIONS", err_msg); + return; + } + + // vector or field data + std::getline(buffer, line); + convert_string_to_uppercase(line); + if (line.find("VECTORS") != std::string::npos) + { + if (line.find("FLOAT") == std::string::npos) + { + copy_string_to_array("Invalid VECTORS datatype. Must be set to float.", err_msg); + return; + } + copy_string_to_array(line.substr(9), vec_label); + } + else if (line.find("FIELD") != std::string::npos) + { + std::istringstream iss(line); + int n_arrays{0}; + iss >> label >> label >> n_arrays; + if (n_arrays != 1) + { + copy_string_to_array("Invalid vtk structured_points file: FIELD label must have only 1 array", err_msg); + return; + } + + std::getline(buffer, line); + convert_string_to_uppercase(line); + if (line.find("FLOAT") == std::string::npos) + { + copy_string_to_array("Invalid FIELD datatype. Must be set to float.", err_msg); + return; + } + + int n_components{0}; + { + std::istringstream iss(line); + iss >> label >> n_components >> n_points; + } + if (n_components != 3) + { + copy_string_to_array("Invalid FIELD components. Must be set to 3.", err_msg); + return; + } + if (n_points != (dims[0] * dims[1] * dims[2])) + { + copy_string_to_array("Invalid vtk structured_points file: FIELD array does not match DIMENSIONS", err_msg); + return; + } + } + else + { + copy_string_to_array("Invalid vtk structured_points file: did not find VECTORS or FIELD label", err_msg); + return; + } + + // If reading of values was not requested, return + if (*read_values == 0) + { + *err_stat = ErrID_None; + return; + } + + // Get the remainder of the input as a string + std::string input = buffer.str().substr(buffer.tellg()); + + // Read first value + auto answer = fast_float::from_chars(input.data(), input.data() + input.size(), values[0]); + + // Read remaining values + const auto n_values{n_points * 3}; + for (auto i = 1; i < n_values; ++i) + { + answer = fast_float::from_chars(answer.ptr, input.data() + input.size(), values[i], + fast_float::chars_format::skip_white_space); + if (answer.ec != std::errc()) + { + copy_string_to_array("Error parsing value", err_msg); + return; + } + } + + // Set no errors + *err_stat = ErrID_None; + } +} diff --git a/modules/awae/tests/AMReX_reader_utest.F90 b/modules/awae/tests/AMReX_reader_utest.F90 new file mode 100644 index 0000000000..75d661389d --- /dev/null +++ b/modules/awae/tests/AMReX_reader_utest.F90 @@ -0,0 +1,37 @@ +program AMReX_reader_utest +use, intrinsic :: iso_fortran_env, only: error_unit +use testdrive, only: run_testsuite, new_testsuite, testsuite_type +use amrex_utils +use test_AMReX_reader + +implicit none +integer :: stat, is, total_tests +type(testsuite_type), allocatable :: testsuites(:) +character(len=*), parameter :: fmt = '("#", *(1x, a))' + +stat = 0 + +call amrex_init() + +call SetConstants() + +testsuites = [ & + new_testsuite("AMReX", run_test_AMReX_reader) & + ] + +total_tests = 0 +do is = 1, size(testsuites) + write (error_unit, fmt) "Testing:", testsuites(is)%name + call run_testsuite(testsuites(is)%collect, error_unit, stat, parallel=.false.) +end do + +if (stat > 0) then + write (error_unit, '(i0, 1x, a)') stat, "test(s) failed!" + error stop +end if + +write (error_unit, fmt) "All tests PASSED" + +call amrex_finalize() + +end program diff --git a/modules/awae/tests/data/subvolmultiple_0_00000/Header b/modules/awae/tests/data/subvolmultiple_0_00000/Header new file mode 100644 index 0000000000..3ecc6d0a90 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00000/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +0 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +0 +1 1 1 +0 +0 +0 2 0 +0 +6 9 +6 10 +6 9 +6 9 +6 10 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_0_00000/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_0_00000/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..fd33ae991c Binary files /dev/null and b/modules/awae/tests/data/subvolmultiple_0_00000/Level_0/Cell_D_00064 differ diff --git a/modules/awae/tests/data/subvolmultiple_0_00000/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_0_00000/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..93c211c471 Binary files /dev/null and b/modules/awae/tests/data/subvolmultiple_0_00000/Level_0/Cell_D_00065 differ diff --git a/modules/awae/tests/data/subvolmultiple_0_00000/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_0_00000/Level_0/Cell_H new file mode 100644 index 0000000000..523080d05c --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00000/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (8,9,8) (0,0,0)) +((6,6,9) (8,9,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +1.00000000000000000e+01,0.00000000000000000e+00,0.00000000000000000e+00, +1.00000000000000000e+01,0.00000000000000000e+00,0.00000000000000000e+00, + +2,3 +1.00000000000000000e+01,0.00000000000000000e+00,0.00000000000000000e+00, +1.00000000000000000e+01,0.00000000000000000e+00,0.00000000000000000e+00, + diff --git a/modules/awae/tests/data/subvolmultiple_0_00006/Header b/modules/awae/tests/data/subvolmultiple_0_00006/Header new file mode 100644 index 0000000000..024c804727 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00006/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +0.59999999999999998 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +6 +1 1 1 +0 +0 +0 2 0.59999999999999998 +6 +6 9 +6 10 +6 9 +6 9 +6 10 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_0_00006/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_0_00006/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..16f27e3c2a --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00006/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (8,9,8) (0,0,0)) 3 +:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@:§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@9§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@0§²ÿÿÿ#@€å#0*©3¿€å#0*©3¿€å#0*©3¿€å#0*©3¿€å#0*©3¿€å#0*©3¿€å#0*©3¿€å#0*©3¿€å#0*©3¿€å#0*©3¿€å#0*©3¿€å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿}å#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿oå#0*©3¿»,1CͰ=»,1CͰ=»,1CͰ=»,1CͰ=»,1CͰ=»,1CͰ=»,1CͰ=»,1CͰ=»,1CͰ=»,1CͰ=»,1CͰ=»,1CͰ=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=¦õDVÄ^³=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ=þª£÷Yîµ= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00006/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_0_00006/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..e610d75f57 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00006/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (8,9,10) (0,0,0)) 3 +&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@&§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@§²ÿÿÿ#@`å#0*©3¿`å#0*©3¿`å#0*©3¿`å#0*©3¿`å#0*©3¿`å#0*©3¿`å#0*©3¿`å#0*©3¿`å#0*©3¿`å#0*©3¿`å#0*©3¿`å#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Qå#0*©3¿Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=Dì%g½{¸=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»=ì\¾ô¥»= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00006/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_0_00006/Level_0/Cell_H new file mode 100644 index 0000000000..b8ab56cb74 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00006/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (8,9,8) (0,0,0)) +((6,6,9) (8,9,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999999099563297e+00,-2.99999999824850094e-04,1.52811540057185985e-11, +9.99999999099559922e+00,-2.99999999824848360e-04,2.22674851186100937e-11, + +2,3 +9.99999999099565073e+00,-2.99999999824849173e-04,1.99461831404557719e-11, +9.99999999099561521e+00,-2.99999999824847546e-04,2.45799763325075873e-11, + diff --git a/modules/awae/tests/data/subvolmultiple_0_00012/Header b/modules/awae/tests/data/subvolmultiple_0_00012/Header new file mode 100644 index 0000000000..5bbb99d8ce --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00012/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +1.2 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +12 +1 1 1 +0 +0 +0 2 1.2 +12 +6 9 +6 10 +6 9 +6 9 +6 10 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_0_00012/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_0_00012/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..e9fbd9e505 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00012/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (8,9,8) (0,0,0)) 3 +o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@o£Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@r¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@t¥Êþÿÿ#@ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿ Å‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿aÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿bÈ‹/*©C¿¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=¸9$UÅ-’=.çá•=.çá•=.çá•=.çá•=.çá•=.çá•=.çá•=.çá•=.çá•=.çá•=.çá•=.çá•=‘$ Bè—=‘$ Bè—=‘$ Bè—=‘$ Bè—=‘$ Bè—=‘$ Bè—=‘$ Bè—=‘$ Bè—=‘$ Bè—=‘$ Bè—=‘$ Bè—=‘$ Bè—= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00012/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_0_00012/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..c01bfa5945 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00012/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (8,9,10) (0,0,0)) 3 +s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@s¥Êþÿÿ#@_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿_È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿[È‹/*©C¿|ØIÏš=|ØIÏš=|ØIÏš=|ØIÏš=|ØIÏš=|ØIÏš=|ØIÏš=|ØIÏš=|ØIÏš=|ØIÏš=|ØIÏš=|ØIÏš=±^[<ɽ=±^[<ɽ=±^[<ɽ=±^[<ɽ=±^[<ɽ=±^[<ɽ=±^[<ɽ=±^[<ɽ=±^[<ɽ=±^[<ɽ=±^[<ɽ=±^[<ɽ= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00012/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_0_00012/Level_0/Cell_H new file mode 100644 index 0000000000..db7b80651e --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00012/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (8,9,8) (0,0,0)) +((6,6,9) (8,9,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999996398557123e+00,-5.99999998568867066e-04,4.13337882179678592e-12, +9.99999996398648783e+00,-5.99999998568866741e-04,6.09582389256213733e-12, + +2,3 +9.99999996398648960e+00,-5.99999998568774367e-04,5.43588103594662372e-12, +9.99999996398648783e+00,-5.99999998568866307e-04,6.76240048600310705e-12, + diff --git a/modules/awae/tests/data/subvolmultiple_0_00018/Header b/modules/awae/tests/data/subvolmultiple_0_00018/Header new file mode 100644 index 0000000000..672809f04c --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00018/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +1.8000000000000005 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +18 +1 1 1 +0 +0 +0 2 1.8000000000000005 +18 +6 9 +6 10 +6 9 +6 9 +6 10 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_0_00018/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_0_00018/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..af49a02bd7 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00018/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (8,9,8) (0,0,0)) 3 +aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@aðGýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@ Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@= Hýÿÿ#@=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿=FÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿“ÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿óÕE¿}M¿ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=ˆH}ê¡£=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=LEõdú¥¦=%°U©©=%°U©©=%°U©©=%°U©©=%°U©©=%°U©©=%°U©©=%°U©©=%°U©©=%°U©©=%°U©©=%°U©©= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00018/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_0_00018/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..d809ad39eb --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00018/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (8,9,10) (0,0,0)) 3 +5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@5 Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@/ Hýÿÿ#@áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿áÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿ÍÕE¿}M¿°­»e¬¬=°­»e¬¬=°­»e¬¬=°­»e¬¬=°­»e¬¬=°­»e¬¬=°­»e¬¬=°­»e¬¬=°­»e¬¬=°­»e¬¬=°­»e¬¬=°­»e¬¬=|t›®¯=|t›®¯=|t›®¯=|t›®¯=|t›®¯=|t›®¯=|t›®¯=|t›®¯=|t›®¯=|t›®¯=|t›®¯=|t›®¯= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00018/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_0_00018/Level_0/Cell_H new file mode 100644 index 0000000000..b286f7201e --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00018/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (8,9,8) (0,0,0)) +((6,6,9) (8,9,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999991896783236e+00,-8.99999995152443700e-04,8.92782020965090072e-12, +9.99999991898047647e+00,-8.99999995152441748e-04,1.30391635459053699e-11, + +2,3 +9.99999991898050133e+00,-8.99999995150397810e-04,1.16697699771399217e-11, +9.99999991898048712e+00,-8.99999995152439580e-04,1.44073326534093930e-11, + diff --git a/modules/awae/tests/data/subvolmultiple_0_00024/Header b/modules/awae/tests/data/subvolmultiple_0_00024/Header new file mode 100644 index 0000000000..1e4be6efd7 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00024/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +2.4000000000000008 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +24 +1 1 1 +0 +0 +0 2 2.4000000000000008 +24 +6 9 +6 10 +6 9 +6 9 +6 10 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_0_00024/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_0_00024/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..29875c4f45 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00024/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (8,9,8) (0,0,0)) 3 +ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00024/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_0_00024/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..8eebbe3b37 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00024/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (8,9,10) (0,0,0)) 3 +bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00024/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_0_00024/Level_0/Cell_H new file mode 100644 index 0000000000..11ba7b946c --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00024/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (8,9,8) (0,0,0)) +((6,6,9) (8,9,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999985589827389e+00,-1.19999998849532269e-03,6.12154597694764886e-12, +9.99999985597349372e+00,-1.19999998849531966e-03,8.94347692689361677e-12, + +2,3 +9.99999985597352037e+00,-1.19999998847877907e-03,8.00307196855157467e-12, +9.99999985597350260e+00,-1.19999998849531619e-03,9.88376412410311311e-12, + diff --git a/modules/awae/tests/data/subvolmultiple_0_00030/Header b/modules/awae/tests/data/subvolmultiple_0_00030/Header new file mode 100644 index 0000000000..7494c77109 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00030/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +3.0000000000000013 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +30 +1 1 1 +0 +0 +0 2 3.0000000000000013 +30 +6 9 +6 10 +6 9 +6 9 +6 10 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_0_00030/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_0_00030/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..a091476eee --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00030/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (8,9,8) (0,0,0)) 3 +~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@~pøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@.örøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ ürøÿÿ#@ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿ÆÉ6¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿Ïd<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿ö{¬5ww=ö{¬5ww=ö{¬5ww=ö{¬5ww=ö{¬5ww=ö{¬5ww=ö{¬5ww=ö{¬5ww=ö{¬5ww=ö{¬5ww=ö{¬5ww=ö{¬5ww=™-mV%ý =™-mV%ý =™-mV%ý =™-mV%ý =™-mV%ý =™-mV%ý =™-mV%ý =™-mV%ý =™-mV%ý =™-mV%ý =™-mV%ý =™-mV%ý =x€c=£=x€c=£=x€c=£=x€c=£=x€c=£=x€c=£=x€c=£=x€c=£=x€c=£=x€c=£=x€c=£=x€c=£= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00030/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_0_00030/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..b33d592f25 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00030/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (8,9,10) (0,0,0)) 3 +ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@ürøÿÿ#@^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿^r<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Gr<¶t“X¿Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=Ž%BÍX|¥=&Îókï¹§=&Îókï¹§=&Îókï¹§=&Îókï¹§=&Îókï¹§=&Îókï¹§=&Îókï¹§=&Îókï¹§=&Îókï¹§=&Îókï¹§=&Îókï¹§=&Îókï¹§= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00030/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_0_00030/Level_0/Cell_H new file mode 100644 index 0000000000..6c22a47840 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00030/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (8,9,8) (0,0,0)) +((6,6,9) (8,9,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999977467748913e+00,-1.49999997751772791e-03,6.69994341140050508e-12, +9.99999977496739589e+00,-1.49999997751772791e-03,9.77057880290460945e-12, + +2,3 +9.99999977496742076e+00,-1.49999997743731480e-03,8.74924442525881193e-12, +9.99999977496741010e+00,-1.49999997751772292e-03,1.07894764073754531e-11, + diff --git a/modules/awae/tests/data/subvolmultiple_0_00036/Header b/modules/awae/tests/data/subvolmultiple_0_00036/Header new file mode 100644 index 0000000000..32289dcb0a --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00036/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +3.6000000000000019 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +36 +1 1 1 +0 +0 +0 2 3.6000000000000019 +36 +6 9 +6 10 +6 9 +6 9 +6 10 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_0_00036/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_0_00036/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..e6b5691d3f --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00036/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (8,9,8) (0,0,0)) 3 +ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@ãõÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@Ír õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@)‡ õÿÿ#@ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ò¼=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ùÑ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ô;Ñ=¿}]¿ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=ž>"ÃF –=þmøNj€™=þmøNj€™=þmøNj€™=þmøNj€™=þmøNj€™=þmøNj€™=þmøNj€™=þmøNj€™=þmøNj€™=þmøNj€™=þmøNj€™=þmøNj€™=Ðüœ=Ðüœ=Ðüœ=Ðüœ=Ðüœ=Ðüœ=Ðüœ=Ðüœ=Ðüœ=Ðüœ=Ðüœ=Ðüœ= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00036/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_0_00036/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..91995adaa0 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00036/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (8,9,10) (0,0,0)) 3 +L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@L‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@J‡ õÿÿ#@[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿[<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿L<Ñ=¿}]¿¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¿ÿ99@ =¯ð®’p¢=¯ð®’p¢=¯ð®’p¢=¯ð®’p¢=¯ð®’p¢=¯ð®’p¢=¯ð®’p¢=¯ð®’p¢=¯ð®’p¢=¯ð®’p¢=¯ð®’p¢=¯ð®’p¢= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00036/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_0_00036/Level_0/Cell_H new file mode 100644 index 0000000000..b148cb41f0 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00036/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (8,9,8) (0,0,0)) +((6,6,9) (8,9,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999967509842769e+00,-1.79999996113955080e-03,5.01223632821013282e-12, +9.99999967596126638e+00,-1.79999996113957314e-03,7.39004070683491493e-12, + +2,3 +9.99999967596120776e+00,-1.79999996085122957e-03,6.59076457600999994e-12, +9.99999967596126993e+00,-1.79999996113956989e-03,8.19689158897043383e-12, + diff --git a/modules/awae/tests/data/subvolmultiple_0_00040/Header b/modules/awae/tests/data/subvolmultiple_0_00040/Header new file mode 100644 index 0000000000..d333b5f707 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00040/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +4 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +40 +1 1 1 +0 +0 +0 2 4 +40 +6 9 +6 10 +6 9 +6 9 +6 10 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_0_00040/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_0_00040/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..5abf189f3d --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00040/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (8,9,8) (0,0,0)) 3 +:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ= B“e = B“e = B“e = B“e = B“e = B“e = B“e = B“e = B“e = B“e = B“e = B“e =;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00040/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_0_00040/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..b5563d8c1a --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00040/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (8,9,10) (0,0,0)) 3 +'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_0_00040/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_0_00040/Level_0/Cell_H new file mode 100644 index 0000000000..4a615857bb --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_0_00040/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (8,9,8) (0,0,0)) +((6,6,9) (8,9,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999959833950314e+00,-1.99999994668716282e-03,6.46317135180300068e-12, +9.99999959995744270e+00,-1.99999994668722484e-03,9.44163322406804561e-12, + +2,3 +9.99999959995730592e+00,-1.99999994608572509e-03,8.44921190591222131e-12, +9.99999959995746046e+00,-1.99999994668721790e-03,1.04336651669266396e-11, + diff --git a/modules/awae/tests/data/subvolmultiple_1_00000/Header b/modules/awae/tests/data/subvolmultiple_1_00000/Header new file mode 100644 index 0000000000..e780b2d3ef --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00000/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +0 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +0 +1 1 1 +0 +0 +0 2 0 +0 +6 8 +6 9 +6 9 +6 8 +6 9 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_1_00000/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_1_00000/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..2053e741d5 Binary files /dev/null and b/modules/awae/tests/data/subvolmultiple_1_00000/Level_0/Cell_D_00064 differ diff --git a/modules/awae/tests/data/subvolmultiple_1_00000/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_1_00000/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..1d62f2a852 Binary files /dev/null and b/modules/awae/tests/data/subvolmultiple_1_00000/Level_0/Cell_D_00065 differ diff --git a/modules/awae/tests/data/subvolmultiple_1_00000/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_1_00000/Level_0/Cell_H new file mode 100644 index 0000000000..6f35cc6918 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00000/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (7,8,8) (0,0,0)) +((6,6,9) (7,8,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +1.00000000000000000e+01,0.00000000000000000e+00,0.00000000000000000e+00, +1.00000000000000000e+01,0.00000000000000000e+00,0.00000000000000000e+00, + +2,3 +1.00000000000000000e+01,0.00000000000000000e+00,0.00000000000000000e+00, +1.00000000000000000e+01,0.00000000000000000e+00,0.00000000000000000e+00, + diff --git a/modules/awae/tests/data/subvolmultiple_1_00008/Header b/modules/awae/tests/data/subvolmultiple_1_00008/Header new file mode 100644 index 0000000000..7b0010f640 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00008/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +0.79999999999999993 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +8 +1 1 1 +0 +0 +0 2 0.79999999999999993 +8 +6 8 +6 9 +6 9 +6 8 +6 9 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_1_00008/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_1_00008/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..ed015e6078 Binary files /dev/null and b/modules/awae/tests/data/subvolmultiple_1_00008/Level_0/Cell_D_00064 differ diff --git a/modules/awae/tests/data/subvolmultiple_1_00008/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_1_00008/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..f4adb714a8 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00008/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (7,8,10) (0,0,0)) 3 +å{vÿÿÿ#@å{vÿÿÿ#@å{vÿÿÿ#@å{vÿÿÿ#@å{vÿÿÿ#@å{vÿÿÿ#@è{vÿÿÿ#@è{vÿÿÿ#@è{vÿÿÿ#@è{vÿÿÿ#@è{vÿÿÿ#@è{vÿÿÿ#@Ïê¥êâ6:¿Ïê¥êâ6:¿Ïê¥êâ6:¿Ïê¥êâ6:¿Ïê¥êâ6:¿Ïê¥êâ6:¿Ìê¥êâ6:¿Ìê¥êâ6:¿Ìê¥êâ6:¿Ìê¥êâ6:¿Ìê¥êâ6:¿Ìê¥êâ6:¿zOT÷µF³=zOT÷µF³=zOT÷µF³=zOT÷µF³=zOT÷µF³=zOT÷µF³=ÐqiïŒKµ=ÐqiïŒKµ=ÐqiïŒKµ=ÐqiïŒKµ=ÐqiïŒKµ=ÐqiïŒKµ= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_1_00008/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_1_00008/Level_0/Cell_H new file mode 100644 index 0000000000..87e7dee776 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00008/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (7,8,8) (0,0,0)) +((6,6,9) (7,8,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999998399096235e+00,-3.99999999579554060e-04,1.20089399424229782e-11, +9.99999998399102630e+00,-3.99999999579553464e-04,1.75316145785451496e-11, + +2,3 +9.99999998399102452e+00,-3.99999999579550808e-04,1.56929103616181663e-11, +9.99999998399103163e+00,-3.99999999579553301e-04,1.93677981319793442e-11, + diff --git a/modules/awae/tests/data/subvolmultiple_1_00016/Header b/modules/awae/tests/data/subvolmultiple_1_00016/Header new file mode 100644 index 0000000000..2b2965f011 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00016/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +1.6000000000000003 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +16 +1 1 1 +0 +0 +0 2 1.6000000000000003 +16 +6 8 +6 9 +6 9 +6 8 +6 9 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_1_00016/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_1_00016/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..6e79668cc0 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00016/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (7,8,8) (0,0,0)) 3 +s Úýÿÿ#@s Úýÿÿ#@s Úýÿÿ#@s Úýÿÿ#@s Úýÿÿ#@s Úýÿÿ#@•Úýÿÿ#@•Úýÿÿ#@•Úýÿÿ#@•Úýÿÿ#@•Úýÿÿ#@•Úýÿÿ#@žÚýÿÿ#@žÚýÿÿ#@žÚýÿÿ#@žÚýÿÿ#@žÚýÿÿ#@žÚýÿÿ#@ñ[=éâ6J¿ñ[=éâ6J¿ñ[=éâ6J¿ñ[=éâ6J¿ñ[=éâ6J¿ñ[=éâ6J¿nz=éâ6J¿nz=éâ6J¿nz=éâ6J¿nz=éâ6J¿nz=éâ6J¿nz=éâ6J¿‰z=éâ6J¿‰z=éâ6J¿‰z=éâ6J¿‰z=éâ6J¿‰z=éâ6J¿‰z=éâ6J¿¾m¸¬þ =¾m¸¬þ =¾m¸¬þ =¾m¸¬þ =¾m¸¬þ =¾m¸¬þ =ì‘0£=ì‘0£=ì‘0£=ì‘0£=ì‘0£=ì‘0£=ðê´²ï;¦=ðê´²ï;¦=ðê´²ï;¦=ðê´²ï;¦=ðê´²ï;¦=ðê´²ï;¦= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_1_00016/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_1_00016/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..c307017019 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00016/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (7,8,10) (0,0,0)) 3 +”Úýÿÿ#@”Úýÿÿ#@”Úýÿÿ#@”Úýÿÿ#@”Úýÿÿ#@”Úýÿÿ#@ŒÚýÿÿ#@ŒÚýÿÿ#@ŒÚýÿÿ#@ŒÚýÿÿ#@ŒÚýÿÿ#@ŒÚýÿÿ#@wz=éâ6J¿wz=éâ6J¿wz=éâ6J¿wz=éâ6J¿wz=éâ6J¿wz=éâ6J¿ez=éâ6J¿ez=éâ6J¿ez=éâ6J¿ez=éâ6J¿ez=éâ6J¿ez=éâ6J¿¹*mZJÛ¨=¹*mZJÛ¨=¹*mZJÛ¨=¹*mZJÛ¨=¹*mZJÛ¨=¹*mZJÛ¨=6”ùà9{«=6”ùà9{«=6”ùà9{«=6”ùà9{«=6”ùà9{«=6”ùà9{«= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_1_00016/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_1_00016/Level_0/Cell_H new file mode 100644 index 0000000000..fcdf3c7ce5 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00016/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (7,8,8) (0,0,0)) +((6,6,9) (7,8,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999993597723424e+00,-7.99999996598036865e-04,7.72835074002443921e-12, +9.99999993598319037e+00,-7.99999996598034914e-04,1.13034744982660645e-11, + +2,3 +9.99999993598322234e+00,-7.99999996597187718e-04,1.01109100125249360e-11, +9.99999993598320458e+00,-7.99999996598032962e-04,1.24970719800906497e-11, + diff --git a/modules/awae/tests/data/subvolmultiple_1_00024/Header b/modules/awae/tests/data/subvolmultiple_1_00024/Header new file mode 100644 index 0000000000..5a6d6b80cd --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00024/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +2.4000000000000008 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +24 +1 1 1 +0 +0 +0 2 2.4000000000000008 +24 +6 8 +6 9 +6 9 +6 8 +6 9 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_1_00024/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_1_00024/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..164e024267 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00024/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (7,8,8) (0,0,0)) 3 +ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@ô,*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@*Ñ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@lÒ*ûÿÿ#@„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿„v*-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿@ž+-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Š +-*©S¿Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Jˆã?ìš=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ=Ôçe@œŸ='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡='Ð8T™¡= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_1_00024/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_1_00024/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..d09fb993a4 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00024/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (7,8,10) (0,0,0)) 3 +bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@bÒ*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@]Ò*ûÿÿ#@| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿| +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿l +-*©S¿ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£=ÈÂÿÛºª£= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= ‚†¼¥= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_1_00024/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_1_00024/Level_0/Cell_H new file mode 100644 index 0000000000..3ae2e2557f --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00024/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (7,8,8) (0,0,0)) +((6,6,9) (7,8,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999985589827389e+00,-1.19999998849532269e-03,6.12154597694764886e-12, +9.99999985597349372e+00,-1.19999998849531966e-03,8.94347692689361677e-12, + +2,3 +9.99999985597352037e+00,-1.19999998847877907e-03,8.00307196855157467e-12, +9.99999985597350260e+00,-1.19999998849531619e-03,9.88376412410311311e-12, + diff --git a/modules/awae/tests/data/subvolmultiple_1_00032/Header b/modules/awae/tests/data/subvolmultiple_1_00032/Header new file mode 100644 index 0000000000..46b067a247 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00032/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +3.2000000000000015 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +32 +1 1 1 +0 +0 +0 2 3.2000000000000015 +32 +6 8 +6 9 +6 9 +6 8 +6 9 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_1_00032/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_1_00032/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..20888ff7a9 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00032/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (7,8,8) (0,0,0)) 3 +\e÷ÿÿ#@\e÷ÿÿ#@\e÷ÿÿ#@\e÷ÿÿ#@\e÷ÿÿ#@\e÷ÿÿ#@Ƥh÷ÿÿ#@Ƥh÷ÿÿ#@Ƥh÷ÿÿ#@Ƥh÷ÿÿ#@Ƥh÷ÿÿ#@Ƥh÷ÿÿ#@ü­h÷ÿÿ#@ü­h÷ÿÿ#@ü­h÷ÿÿ#@ü­h÷ÿÿ#@ü­h÷ÿÿ#@ü­h÷ÿÿ#@Ø“ãâ6Z¿Ø“ãâ6Z¿Ø“ãâ6Z¿Ø“ãâ6Z¿Ø“ãâ6Z¿Ø“ãâ6Z¿,ï›ãâ6Z¿,ï›ãâ6Z¿,ï›ãâ6Z¿,ï›ãâ6Z¿,ï›ãâ6Z¿,ï›ãâ6Z¿¢œãâ6Z¿¢œãâ6Z¿¢œãâ6Z¿¢œãâ6Z¿¢œãâ6Z¿¢œãâ6Z¿dŒyÓØž=dŒyÓØž=dŒyÓØž=dŒyÓØž=dŒyÓØž=dŒyÓØž=.Y_Ì¡=.Y_Ì¡=.Y_Ì¡=.Y_Ì¡=.Y_Ì¡=.Y_Ì¡=I†þz,¤=I†þz,¤=I†þz,¤=I†þz,¤=I†þz,¤=I†þz,¤= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_1_00032/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_1_00032/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..977ed4ffa6 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00032/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (7,8,10) (0,0,0)) 3 +ý­h÷ÿÿ#@ý­h÷ÿÿ#@ý­h÷ÿÿ#@ý­h÷ÿÿ#@ý­h÷ÿÿ#@ý­h÷ÿÿ#@ö­h÷ÿÿ#@ö­h÷ÿÿ#@ö­h÷ÿÿ#@ö­h÷ÿÿ#@ö­h÷ÿÿ#@ö­h÷ÿÿ#@²œãâ6Z¿²œãâ6Z¿²œãâ6Z¿²œãâ6Z¿²œãâ6Z¿²œãâ6Z¿šœãâ6Z¿šœãâ6Z¿šœãâ6Z¿šœãâ6Z¿šœãâ6Z¿šœãâ6Z¿Ú윆¾Œ¦=Ú윆¾Œ¦=Ú윆¾Œ¦=Ú윆¾Œ¦=Ú윆¾Œ¦=Ú윆¾Œ¦=°»ûk)í¨=°»ûk)í¨=°»ûk)í¨=°»ûk)í¨=°»ûk)í¨=°»ûk)í¨= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_1_00032/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_1_00032/Level_0/Cell_H new file mode 100644 index 0000000000..a465227771 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00032/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (7,8,8) (0,0,0)) +((6,6,9) (7,8,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999974353857368e+00,-1.59999997271174270e-03,7.01379050253265985e-12, +9.99999974396540026e+00,-1.59999997271174617e-03,1.02544537155523679e-11, + +2,3 +9.99999974396541091e+00,-1.59999997258524450e-03,9.17396016262099325e-12, +9.99999974396541269e+00,-1.59999997271174097e-03,1.13352204137571543e-11, + diff --git a/modules/awae/tests/data/subvolmultiple_1_00040/Header b/modules/awae/tests/data/subvolmultiple_1_00040/Header new file mode 100644 index 0000000000..3e03fd62e0 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00040/Header @@ -0,0 +1,25 @@ +HyperCLaw-V1.1 +3 +x_velocity +y_velocity +z_velocity +3 +4 +0 +0 0 0 +256 256 128 + +((0,0,0) (255,255,127) (0,0,0)) +40 +1 1 1 +0 +0 +0 2 4 +40 +6 8 +6 9 +6 9 +6 8 +6 9 +9 11 +Level_0/Cell diff --git a/modules/awae/tests/data/subvolmultiple_1_00040/Level_0/Cell_D_00064 b/modules/awae/tests/data/subvolmultiple_1_00040/Level_0/Cell_D_00064 new file mode 100644 index 0000000000..48da1afacc --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00040/Level_0/Cell_D_00064 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,6) (7,8,8) (0,0,0)) 3 +:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@:Ã…òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ì“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@Ш“òÿÿ#@^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿^¹ˆËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿Î£ËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿£âËMb`¿ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ=ï0SOâlœ= B“e = B“e = B“e = B“e = B“e = B“e =;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢=;INÃ{”¢= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_1_00040/Level_0/Cell_D_00065 b/modules/awae/tests/data/subvolmultiple_1_00040/Level_0/Cell_D_00065 new file mode 100644 index 0000000000..69c8e2c094 --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00040/Level_0/Cell_D_00065 @@ -0,0 +1,2 @@ +FAB ((8, (64 11 52 0 1 12 0 1023)),(8, (8 7 6 5 4 3 2 1)))((6,6,9) (7,8,10) (0,0,0)) 3 +'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@'©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@©“òÿÿ#@2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿2ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿"ãËMb`¿ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ZÆq¿*ä=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦=ÊŽ+ž¡ñ¦= \ No newline at end of file diff --git a/modules/awae/tests/data/subvolmultiple_1_00040/Level_0/Cell_H b/modules/awae/tests/data/subvolmultiple_1_00040/Level_0/Cell_H new file mode 100644 index 0000000000..42a0bc8c0f --- /dev/null +++ b/modules/awae/tests/data/subvolmultiple_1_00040/Level_0/Cell_H @@ -0,0 +1,20 @@ +1 +1 +3 +0 +(2 0 +((6,6,6) (7,8,8) (0,0,0)) +((6,6,9) (7,8,10) (0,0,0)) +) +2 +FabOnDisk: Cell_D_00064 0 +FabOnDisk: Cell_D_00065 0 + +2,3 +9.99999959833950314e+00,-1.99999994668716282e-03,6.46317135180300068e-12, +9.99999959995744270e+00,-1.99999994668722484e-03,9.44163322406804561e-12, + +2,3 +9.99999959995730592e+00,-1.99999994608572509e-03,8.44921190591222131e-12, +9.99999959995746046e+00,-1.99999994668721790e-03,1.04336651669266396e-11, + diff --git a/modules/awae/tests/test_AMReX_reader.f90 b/modules/awae/tests/test_AMReX_reader.f90 new file mode 100644 index 0000000000..b382ed4750 --- /dev/null +++ b/modules/awae/tests/test_AMReX_reader.f90 @@ -0,0 +1,254 @@ +module test_AMReX_reader + use testdrive, only: new_unittest, unittest_type, error_type, check + use NWTC_Library + use amrex_utils + + implicit none + +contains + + subroutine run_test_AMReX_reader(testsuite) + type(unittest_type), allocatable, intent(out) :: testsuite(:) + testsuite = [ & + new_unittest("AMReX_test_read_subvol_0", AMReX_test_read_subvol_0), & + new_unittest("AMReX_test_read_subvol_1", AMReX_test_read_subvol_1), & + new_unittest("AMReX_test_amrex_find_subvols_1", AMReX_test_amrex_find_subvols_1), & + new_unittest("AMReX_test_amrex_find_subvols_2", AMReX_test_amrex_find_subvols_2), & + new_unittest("AMReX_test_amrex_find_subvols_3", AMReX_test_amrex_find_subvols_3) & + ] + end subroutine + + subroutine AMReX_test_read_subvol_0(error) + + type(error_type), allocatable, intent(out) :: error + character(*), parameter :: DirPath = "data/subvolmultiple_0_00006" + real(SiKi), allocatable :: data(:,:,:,:) + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg + integer(IntKi) :: i, j, k + integer(IntKi) :: dims(3) + real(ReKi) :: time, origin(3), gridSpacing(3), gridSize(3), bounds(2,3) + + ! Read header + call amrex_read_header(trim(DirPath), time, dims, gridSpacing, origin, ErrStat, ErrMsg) + call check(error, ErrStat, ErrID_None); if (allocated(error)) return + if (ErrStat /= ErrID_None) print*, "ErrMsg = ", ErrMsg + + ! Calculate grid size + gridSize = gridSpacing*real(dims - 1, c_double) + + ! Calculate the grid bounds + bounds(1,:) = origin + bounds(2,:) = origin + gridSize + + ! Check time + call check(error, time, 0.6_c_double); if (allocated(error)) return + + ! Check dimensions + call check(error, dims(1), 3_c_int, more="dims(1)"); if (allocated(error)) return + call check(error, dims(2), 4_c_int, more="dims(2)"); if (allocated(error)) return + call check(error, dims(3), 5_c_int, more="dims(3)"); if (allocated(error)) return + + ! Check spacing + call check(error, gridSpacing(1), 1.0_c_double, more="gridSpacing(1)"); if (allocated(error)) return + call check(error, gridSpacing(2), 1.0_c_double, more="gridSpacing(2)"); if (allocated(error)) return + call check(error, gridSpacing(3), 1.0_c_double, more="gridSpacing(3)"); if (allocated(error)) return + + ! Check grid size + call check(error, gridSize(1), 2.0_c_double, more="gridSize(1)"); if (allocated(error)) return + call check(error, gridSize(2), 3.0_c_double, more="gridSize(2)"); if (allocated(error)) return + call check(error, gridSize(3), 4.0_c_double, more="gridSize(3)"); if (allocated(error)) return + + ! Check lower bounds + call check(error, bounds(1,1), 6.5_c_double, more="origin(1)"); if (allocated(error)) return + call check(error, bounds(1,2), 6.5_c_double, more="origin(2)"); if (allocated(error)) return + call check(error, bounds(1,3), 6.5_c_double, more="origin(3)"); if (allocated(error)) return + + ! Check upper bounds + call check(error, bounds(2,1), 8.5_c_double, more="ub(1)"); if (allocated(error)) return + call check(error, bounds(2,2), 9.5_c_double, more="ub(2)"); if (allocated(error)) return + call check(error, bounds(2,3), 10.5_c_double, more="ub(3)"); if (allocated(error)) return + + ! Display grid properties + print*, "dir = ", trim(DirPath) + print*, "time = ", time + print*, "dims = ", dims + print*, "origin = ", origin + print*, "gridSpacing = ", gridSpacing + print*, "gridSize = ", gridSize + print*, "lb = ", bounds(1,:) + print*, "ub = ", bounds(2,:) + print*, "nPoints = ", product(dims) + + ! Allocate data array and fill with value + call AllocAry(data, 3, dims(1), dims(2), dims(3), "data", ErrStat, ErrMsg) + call check(error, ErrStat, ErrID_None); if (allocated(error)) return + data = 9999.0_c_float + + ! Read grid data + call amrex_read_data(trim(DirPath), data, ErrStat, ErrMsg) + call check(error, ErrStat, ErrID_None); if (allocated(error)) return + + ! Print the grid data + do k = 1, dims(3) + do j = 1, dims(2) + do i = 1, dims(1) + print*, i,j,k, data(1,i,j,k), data(2,i,j,k), data(3,i,j,k) + end do + end do + end do + + end subroutine + + subroutine AMReX_test_read_subvol_1(error) + + type(error_type), allocatable, intent(out) :: error + character(*), parameter :: DirPath = "data/subvolmultiple_1_00016" + real(SiKi), allocatable :: data(:,:,:,:) + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg + integer(IntKi) :: i, j, k + integer(IntKi) :: dims(3) + real(ReKi) :: time, origin(3), gridSpacing(3), gridSize(3), bounds(2,3) + + ! Read header + call amrex_read_header(trim(DirPath), time, dims, gridSpacing, origin, ErrStat, ErrMsg) + call check(error, ErrStat, ErrID_None); if (allocated(error)) return + if (ErrStat /= ErrID_None) print*, "ErrMsg = ", ErrMsg + + ! Calculate grid size + gridSize = gridSpacing*real(dims - 1, c_double) + + ! Calculate the grid bounds + bounds(1,:) = origin + bounds(2,:) = origin + gridSize + + ! Check time + call check(error, time, 1.6_c_double); if (allocated(error)) return + + ! Check dimensions + call check(error, dims(1), 2_c_int, more="dims(1)"); if (allocated(error)) return + call check(error, dims(2), 3_c_int, more="dims(2)"); if (allocated(error)) return + call check(error, dims(3), 5_c_int, more="dims(3)"); if (allocated(error)) return + + ! Check spacing + call check(error, gridSpacing(1), 1.0_c_double, more="gridSpacing(1)"); if (allocated(error)) return + call check(error, gridSpacing(2), 1.0_c_double, more="gridSpacing(2)"); if (allocated(error)) return + call check(error, gridSpacing(3), 1.0_c_double, more="gridSpacing(3)"); if (allocated(error)) return + + ! Check grid size + call check(error, gridSize(1), 1.0_c_double, more="gridSize(1)"); if (allocated(error)) return + call check(error, gridSize(2), 2.0_c_double, more="gridSize(2)"); if (allocated(error)) return + call check(error, gridSize(3), 4.0_c_double, more="gridSize(3)"); if (allocated(error)) return + + ! Check lower bounds + call check(error, bounds(1,1), 6.5_c_double, more="origin(1)"); if (allocated(error)) return + call check(error, bounds(1,2), 6.5_c_double, more="origin(2)"); if (allocated(error)) return + call check(error, bounds(1,3), 6.5_c_double, more="origin(3)"); if (allocated(error)) return + + ! Check upper bounds + call check(error, bounds(2,1), 7.5_c_double, more="ub(1)"); if (allocated(error)) return + call check(error, bounds(2,2), 8.5_c_double, more="ub(2)"); if (allocated(error)) return + call check(error, bounds(2,3), 10.5_c_double, more="ub(3)"); if (allocated(error)) return + + ! Display grid properties + print*, "dir = ", trim(DirPath) + print*, "time = ", time + print*, "dims = ", dims + print*, "origin = ", origin + print*, "gridSpacing = ", gridSpacing + print*, "gridSize = ", gridSize + print*, "lb = ", bounds(1,:) + print*, "ub = ", bounds(2,:) + print*, "nPoints = ", product(dims) + + ! Allocate data array and fill with value + call AllocAry(data, 3, dims(1), dims(2), dims(3), "data", ErrStat, ErrMsg) + call check(error, ErrStat, ErrID_None); if (allocated(error)) return + data = 9999.0_c_float + + ! Read grid data + call amrex_read_data(trim(DirPath), data, ErrStat, ErrMsg) + call check(error, ErrStat, ErrID_None); if (allocated(error)) return + + ! Print the grid data + do k = 1, dims(3) + do j = 1, dims(2) + do i = 1, dims(1) + print*, i,j,k, data(1,i,j,k), data(2,i,j,k), data(3,i,j,k) + end do + end do + end do + + end subroutine + + ! Test finding sub-volumes with start index of 0 and actual DT + subroutine AMReX_test_amrex_find_subvols_1(error) + type(error_type), allocatable, intent(out) :: error + character(*), parameter :: DirPath = "data/subvolmultiple" + integer(IntKi), parameter :: SubVol = 0 + real(DbKi), parameter :: DT = 0.6_DbKi + integer(IntKi), parameter :: NumSteps = 5 + character(*), parameter :: StartIndex = "00000" + + integer(IntKi) :: FirstIndex, IndexDelta + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg + + call amrex_find_subvols(DirPath, SubVol, DT, NumSteps, StartIndex, & + FirstIndex, IndexDelta, ErrStat, ErrMsg) + call check(error, ErrStat, ErrID_None, more="amrex_find_subvols: "//trim(ErrMsg)); if (allocated(error)) return + + call check(error, FirstIndex, 0); if (allocated(error)) return + call check(error, IndexDelta, 6); if (allocated(error)) return + + end subroutine + + ! Test finding sub-volumes with nonzero start index and actual DT + ! Sub-volume 1 has DT = 0.8 so this finds every directory starting at index 16 + subroutine AMReX_test_amrex_find_subvols_2(error) + type(error_type), allocatable, intent(out) :: error + character(*), parameter :: DirPath = "data/subvolmultiple" + integer(IntKi), parameter :: SubVol = 1 + real(DbKi), parameter :: DT = 0.8_DbKi + integer(IntKi), parameter :: NumSteps = 3 + character(*), parameter :: StartIndex = "00016" + + integer(IntKi) :: FirstIndex, IndexDelta + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg + + call amrex_find_subvols(DirPath, SubVol, DT, NumSteps, StartIndex, & + FirstIndex, IndexDelta, ErrStat, ErrMsg) + call check(error, ErrStat, ErrID_None, more="amrex_find_subvols: "//trim(ErrMsg)); if (allocated(error)) return + + call check(error, FirstIndex, 16); if (allocated(error)) return + call check(error, IndexDelta, 8); if (allocated(error)) return + + end subroutine + + ! Test finding sub-volumes with nonzero start index and larger DT + ! Sub-volume 0 actual DT = 0.6 so this test skips every other directory + ! starting at index 6 + subroutine AMReX_test_amrex_find_subvols_3(error) + type(error_type), allocatable, intent(out) :: error + character(*), parameter :: DirPath = "data/subvolmultiple" + integer(IntKi), parameter :: SubVol = 0 + real(DbKi), parameter :: DT = 1.2_DbKi + integer(IntKi), parameter :: NumSteps = 3 + character(*), parameter :: StartIndex = "00006" + + integer(IntKi) :: FirstIndex, IndexDelta + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg + + call amrex_find_subvols(DirPath, SubVol, DT, NumSteps, StartIndex, & + FirstIndex, IndexDelta, ErrStat, ErrMsg) + call check(error, ErrStat, ErrID_None, more="amrex_find_subvols: "//trim(ErrMsg)); if (allocated(error)) return + + call check(error, FirstIndex, 6, more="FirstIndex"); if (allocated(error)) return + call check(error, IndexDelta, 12, more="IndexDelta"); if (allocated(error)) return + + end subroutine + +end module diff --git a/modules/beamdyn/src/BeamDyn.f90 b/modules/beamdyn/src/BeamDyn.f90 index ab3564d5fb..65791d3b43 100644 --- a/modules/beamdyn/src/BeamDyn.f90 +++ b/modules/beamdyn/src/BeamDyn.f90 @@ -24,6 +24,8 @@ MODULE BeamDyn IMPLICIT NONE + INTEGER, PARAMETER :: FEKi = R8Ki ! Define the kind to be used for FEM/eigenanalysis + #ifndef UNIT_TEST PRIVATE @@ -48,7 +50,6 @@ MODULE BeamDyn PUBLIC :: BD_JacobianPConstrState ! Routine to compute the Jacobians of the output(Y), continuous - (X), discrete - ! (Xd), and constraint - state(Z) functions all with respect to the constraint ! states(z) - PUBLIC :: BD_GetOP !< Routine to pack the operating point values (for linearization) into arrays PUBLIC :: BD_UpdateGlobalRef !< update the BeamDyn reference. The reference for the calculations follows u%RootMotionMesh ! and therefore x%q must be updated from T -> T+DT to include the root motion from T->T+DT @@ -58,8 +59,8 @@ MODULE BeamDyn ! the development of the tight coupling algorithm for OpenFAST, we decided to try changing all the states in BeamDyn to ! follow the moving BladeRootMotion mesh. This requires changing the states after an UpdateStates call to be relative to ! the new BladeRootMotion mesh orientation and position. - ! Upadate the reference frame after each State update (or use the old method)? - LOGICAL, PARAMETER :: ChangeRefFrame = .false. + ! Update the reference frame after each State update (or use the old method)? + LOGICAL, PARAMETER :: ChangeRefFrame = .true. CONTAINS @@ -91,9 +92,7 @@ SUBROUTINE BD_Init( InitInp, u, p, x, xd, z, OtherState, y, MiscVar, Interval, I ! local variables TYPE(BD_InputFile) :: InputFileData ! Data stored in the module's input file - REAL(BDKi) :: temp_CRV(3) REAL(BDKi),ALLOCATABLE :: GLL_nodes(:) - REAL(BDKi) :: TmpDCM(3,3) LOGICAL :: QuasiStaticInitialized !< True if quasi-static solution was found @@ -161,17 +160,6 @@ SUBROUTINE BD_Init( InitInp, u, p, x, xd, z, OtherState, y, MiscVar, Interval, I ! compute blade mass, CG, and IN for summary file: CALL BD_ComputeBladeMassNew( p, ErrStat2, ErrMsg2 ); if (Failed()) return !computes p%blade_mass,p%blade_CG,p%blade_IN - - if (p%UsePitchAct) then - - ! Calculate the pitch angle - TmpDCM(:,:) = MATMUL(u%RootMotion%Orientation(:,:,1),TRANSPOSE(u%HubMotion%Orientation(:,:,1))) - temp_CRV(:) = EulerExtract(TmpDCM) - xd%thetaP = -temp_CRV(3) - xd%thetaPD = 0.0_BDKi - end if - - ! Define and initialize system inputs (set up and initialize input meshes) here: call Init_u(InitInp, p, OtherState, u, ErrStat2, ErrMsg2); if (Failed()) return @@ -202,7 +190,12 @@ SUBROUTINE BD_Init( InitInp, u, p, x, xd, z, OtherState, y, MiscVar, Interval, I QuasiStaticInitialized = .FALSE. ENDIF - + !................................. + ! Calculation of modal damping here + + IF(p%damp_flag .EQ. 2) THEN + call Init_ModalDamping(InitInp, x, OtherState, p, MiscVar, ErrStat2, ErrMsg2); if (Failed()) return + ENDIF !................................. ! initialization of output mesh values (used for initial guess to AeroDyn) @@ -246,16 +239,19 @@ SUBROUTINE BD_Init( InitInp, u, p, x, xd, z, OtherState, y, MiscVar, Interval, I !............................................................................................ - ! Initialize Jacobian: + ! Module Variables + !............................................................................................ + + ! call BD_InitVars(u, p, x, y, MiscVar, InitOut, InitInp%Linearize, ErrStat2, ErrMsg2) + call BD_InitVars(u, p, x, y, MiscVar, InitOut, .true., ErrStat2, ErrMsg2) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + !............................................................................................ + ! Summary and cleanup !............................................................................................ - if (InitInp%Linearize) then - call Init_Jacobian( p, u, y, MiscVar, InitOut, ErrStat2, ErrMsg2); if (Failed()) return - end if - call Cleanup() - return CONTAINS SUBROUTINE Cleanup() if (allocated(GLL_nodes )) deallocate(GLL_nodes ) @@ -887,7 +883,6 @@ subroutine SetParameters(InitInp, InputFileData, p, OtherState, ErrStat, ErrMsg) INTEGER(IntKi) :: i, j ! generic counter index INTEGER(IntKi) :: indx ! counter into index array (p%NdIndx) INTEGER(IntKi) :: nUniqueQP ! number of unique quadrature points (not double-counting nodes at element boundaries) - REAL(BDKi) :: denom integer(intKi) :: ErrStat2 ! temporary Error status character(ErrMsgLen) :: ErrMsg2 ! temporary Error message character(*), parameter :: RoutineName = 'SetParameters' @@ -921,8 +916,6 @@ subroutine SetParameters(InitInp, InputFileData, p, OtherState, ErrStat, ErrMsg) p%RotStates = InputFileData%RotStates ! Rotate states in linearization? - if (ChangeRefFrame) p%RotStates = .true. - p%RelStates = InputFileData%RelStates ! Define states relative to root motion in linearization? p%rhoinf = InputFileData%rhoinf ! Numerical damping coefficient: [0,1]. No numerical damping if rhoinf = 1; maximum numerical damping if rhoinf = 0. p%dt = InputFileData%DTBeam ! Time step size @@ -1116,32 +1109,16 @@ subroutine SetParameters(InitInp, InputFileData, p, OtherState, ErrStat, ErrMsg) ! Physical damping flag and 6 damping coefficients !............................................... p%damp_flag = InputFileData%InpBl%damp_flag - p%beta = InputFileData%InpBl%beta - - !............................................... - ! set parameters for pitch actuator: - !............................................... - - ! Actuator - p%UsePitchAct = InputFileData%UsePitchAct - if (p%UsePitchAct) then - p%pitchK = InputFileData%pitchK - p%pitchC = InputFileData%pitchC - p%pitchJ = InputFileData%pitchJ - - ! calculate (I-hA)^-1 - p%torqM(1,1) = p%pitchJ + p%pitchC*p%dt - p%torqM(2,1) = -p%pitchK * p%dt - p%torqM(1,2) = p%pitchJ * p%dt - p%torqM(2,2) = p%pitchJ - denom = p%pitchJ + p%pitchC*p%dt + p%pitchK*p%dt**2 - if (EqualRealNos(denom,0.0_BDKi)) then - call SetErrStat(ErrID_Fatal, "Cannot invert matrix for pitch actuator: J+c*dt+k*dt^2 is zero.", ErrStat, ErrMsg, RoutineName) - return - else - p%torqM(:,:) = p%torqM / denom - end if - end if + select case (p%damp_flag) + case (0) ! No damping + case (1) ! Stiffness-proportional damping + p%beta = InputFileData%InpBl%beta + case (2) ! Modal damping + p%zeta = InputFileData%InpBl%zeta + case default + call SetErrStat(ErrID_Fatal, "Invalid value for physical damping flag in input file.", ErrStat, ErrMsg, RoutineName ) + return + end select !............................................... ! set parameters for File I/O data: @@ -1154,7 +1131,7 @@ subroutine SetParameters(InitInp, InputFileData, p, OtherState, ErrStat, ErrMsg) p%OutInputs = .false. ! will get set to true in SetOutParam if we request the inputs as output values - call SetOutParam(InputFileData%OutList, p, ErrStat2, ErrMsg2 ) ! requires: p%NumOuts, p%NNodeOuts, p%UsePitchAct; sets: p%OutParam. + call SetOutParam(InputFileData%OutList, p, ErrStat2, ErrMsg2 ) ! requires: p%NumOuts, p%NNodeOuts; sets: p%OutParam. call setErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) if (ErrStat >= AbortErrLev) return @@ -1339,44 +1316,6 @@ subroutine Init_u( InitInp, p, OtherState, u, ErrStat, ErrMsg ) ErrStat = ErrID_None ErrMsg = "" - !................................. - ! u%HubMotion (from ElastoDyn for pitch actuator) - !................................. - - CALL MeshCreate( BlankMesh = u%HubMotion & - ,IOS = COMPONENT_INPUT & - ,NNodes = 1 & - , TranslationDisp = .TRUE. & - , Orientation = .TRUE. & - ,ErrStat = ErrStat2 & - ,ErrMess = ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - if (ErrStat>=AbortErrLev) return - - ! possible type conversions here: - DCM = InitInp%HubRot - Pos = InitInp%HubPos - CALL MeshPositionNode ( Mesh = u%HubMotion & - , INode = 1 & - , Pos = Pos & - , ErrStat = ErrStat2 & - , ErrMess = ErrMsg2 & - , Orient = DCM ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL MeshConstructElement ( Mesh = u%HubMotion & - , Xelement = ELEMENT_POINT & - , P1 = 1 & - , ErrStat = ErrStat2 & - , ErrMess = ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL MeshCommit(u%HubMotion, ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! initial guesses - u%HubMotion%TranslationDisp(1:3,1) = 0.0_ReKi - u%HubMotion%Orientation(1:3,1:3,1) = InitInp%HubRot !................................. ! u%RootMotion (for coupling with ElastoDyn) @@ -1663,6 +1602,7 @@ subroutine Init_MiscVars( p, u, y, m, ErrStat, ErrMsg ) ! E1, kappa -- used in force calculations CALL AllocAry(m%qp%E1, p%dof_node/2,p%nqp,p%elem_total, 'm%qp%E1 at quadrature point',ErrStat2,ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL AllocAry(m%qp%kappa, p%dof_node/2,p%nqp,p%elem_total, 'm%qp%kappa at quadrature point',ErrStat2,ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL AllocAry(m%qp%strain, p%dof_node ,p%nqp,p%elem_total, 'm%qp%strain at quadrature point',ErrStat2,ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL AllocAry(m%qp%RR0, 3,3, p%nqp,p%elem_total, 'm%qp%RR0 at quadrature point',ErrStat2,ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL AllocAry(m%qp%Stif, 6,6, p%nqp,p%elem_total, 'm%qp%Stif at quadrature point',ErrStat2,ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -1743,9 +1683,6 @@ subroutine Init_MiscVars( p, u, y, m, ErrStat, ErrMsg ) CALL BD_CopyInput(u, m%u, MESH_NEWCOPY, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - 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 @@ -1866,6 +1803,188 @@ END SUBROUTINE cleanup END SUBROUTINE Init_ContinuousStates +!----------------------------------------------------------------------------------------------------------------------------------- +!> This routine initializes modal damping. +SUBROUTINE Init_ModalDamping(InitInp, x, OtherState, p, m, ErrStat, ErrMsg) + + TYPE(BD_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization routine + TYPE(BD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t on input at t + dt on output + type(BD_OtherStateType), INTENT(IN ) :: OtherState !< Global rotations are stored in otherstate + TYPE(BD_ParameterType), INTENT(INOUT) :: p !< Parameters, output modal damping matrix in original frame here + TYPE(BD_MiscVarType), INTENT(INOUT) :: m !< misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + + CHARACTER(*), PARAMETER :: RoutineName = 'Init_ModalDamping' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: nDOF + INTEGER(IntKi) :: j, k ! looping indexing variable + INTEGER(IntKi) :: numZeta ! number of damping values + REAL(R8Ki) :: Zj ! diagonal element of the modal damping matrix + REAL(R8Ki), ALLOCATABLE :: eigenvectors(:, :) ! mode shapes + REAL(R8Ki), ALLOCATABLE :: omega(:) ! modal frequencies (rad/s) + REAL(R8Ki), ALLOCATABLE :: phiT_M(:, :) ! mode shapes transpose times mass matrix + REAL(R8Ki), ALLOCATABLE :: phi0T_M_phi0(:, :) ! normalization calculation of mass matrix + REAL(R8Ki), ALLOCATABLE :: StifK(:,:) ! Copy of stiffness matrix for eigenanalysis (modified during solve) + REAL(R8Ki), ALLOCATABLE :: MassM(:,:) ! Copy of mass matrix for eigenanalysis (modified during solve) + real(R8Ki) :: NodeRot(3, 3) + + ErrStat = ErrID_None + ErrMsg = '' + + numZeta = size(p%zeta) + + ! 0. Setup quadrature points + CALL BD_QuadraturePointData(p, x, m) + + ! 1. Generates K, M Matrices + ! These go into 'm%StifK' and 'm%MassM' + CALL BD_GenerateDynamicElementGA2( x, OtherState, p, m, .TRUE.) + + ! 2. Copy lines from 'BD_CalcForceAcc' for M, K -> 2D and apply Boundary conditions + ! Full mass matrix (n_dof, n_dof) + m%LP_MassM = reshape(m%MassM, [p%dof_total, p%dof_total]) + + ! Mass matrix for free nodes + m%LP_MassM_LU = m%LP_MassM(7:p%dof_total, 7:p%dof_total) + + ! Full stiffness matrix (n_dof, n_dof) + m%LP_StifK = reshape(m%StifK, [p%dof_total, p%dof_total]) + + ! Stiffness matrix for free nodes + m%LP_StifK_LU = m%LP_StifK(7:p%dof_total, 7:p%dof_total) + + ! 3. Do eigenanalysis + ! For now, calculate all eigenpairs + nDOF = p%dof_total - 6 + + ! Allocate eigenvector matrix and eigenvalue arrays + call AllocAry(eigenvectors, nDOF, nDOF, 'eigenvectors', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(omega, nDOF, 'omega', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(StifK, nDOF, nDOF, 'StifK', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(MassM, nDOF, nDOF, 'MassM', ErrStat2, ErrMsg2); if (Failed()) return + + ! EigenSolve modifies the input matrices, so make copies before calling + StifK = m%LP_StifK_LU + MassM = m%LP_MassM_LU + call EigenSolve(StifK, MassM, nDOF, .TRUE., eigenvectors, omega, ErrStat2, ErrMsg2); if (Failed()) return + + ! Mass-normalize the mode shapes + call AllocAry(phi0T_M_phi0, nDOF, nDOF, 'phi0T_M_phi0', ErrStat2, ErrMsg2); if (Failed()) return + + phi0T_M_phi0 = matmul(transpose(eigenvectors), matmul(m%LP_MassM_LU, eigenvectors)) + + do j = 1, nDOF + eigenvectors(:, j) = eigenvectors(:, j) / sqrt(phi0T_M_phi0(j, j)) + end do + + ! 4. Generate damping matrix in original frame + call AllocAry(phiT_M, nDOF, nDOF, 'phiT_M', ErrStat2, ErrMsg2); if (Failed()) return + + phiT_M = matmul(transpose(eigenvectors), m%LP_MassM_LU) ! after normalization + + call AllocAry(p%ModalDampingMat, nDOF, nDOF, 'p%ModalDampingMat', ErrStat2, ErrMsg2); if (Failed()) return + + do j = 1, nDOF + + if( j <= numZeta) then + Zj = 2.0_R8Ki * omega(j) * p%zeta(j) + else + ! Stiffness proportional damping is used past the last prescribed value + ! at a rate equal to the last prescribed value. + Zj = 2.0_R8Ki * omega(j) * (p%zeta(numZeta) * omega(j) / omega(numZeta)) + endif + + p%ModalDampingMat(j, :) = Zj * phiT_M(j, :) + end do + + p%ModalDampingMat = matmul(transpose(phiT_M), p%ModalDampingMat) + + ! Apply the rotation of q here. When the actual dynamics are at the same position + ! as this, then this cancels with a rotation applied at the modal damping force. + ! Transforms as a tensor, so pre and post multiply by nodal rotations. + do j = 2, p%node_total + + ! Loop over the nodes that apply to the damping matrix, so don't include the root node. + call BD_CrvMatrixR(x%q(4:6, j), NodeRot) + + k = (j-2)*6 + p%ModalDampingMat(:, k+1:k+3) = matmul(p%ModalDampingMat(:, k+1:k+3), NodeRot) + p%ModalDampingMat(:, k+4:k+6) = matmul(p%ModalDampingMat(:, k+4:k+6), NodeRot) + end do + do j = 2, p%node_total + + ! Loop over the nodes that apply to the damping matrix, so don't include the root node. + call BD_CrvMatrixR(x%q(4:6, j), NodeRot) + + k = (j-2)*6 + p%ModalDampingMat(k+1:k+3, :) = matmul(transpose(NodeRot), p%ModalDampingMat(k+1:k+3, :)) + p%ModalDampingMat(k+4:k+6, :) = matmul(transpose(NodeRot), p%ModalDampingMat(k+4:k+6, :)) + end do + + call CalcModalParticipation() + + ! Allocate memory for the velocity vector that will be multiplied by the modal damping matrix + call AllocAry(m%DampedVelocities, nDOF, 'DampedVelocities', ErrStat2, ErrMsg2); if (Failed()) return + + ! Allocate memory for the velocity vector that will be multiplied by the modal damping matrix + call AllocAry(m%ModalDampingF, nDOF, 'ModalDampingF', ErrStat2, ErrMsg2); if (Failed()) return + + call AllocAry(m%RotatedDamping, nDOF, nDOF, 'RotatedDamping', ErrStat2, ErrMsg2); if (Failed()) return + +contains + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed + + subroutine CalcModalParticipation() + + REAL(R8Ki), ALLOCATABLE :: modal_participation (:, :) ! Modal participation factor + INTEGER(IntKi) :: bdModesFile ! Unit numbers for file with BD modes + + ! Theory based on Abaqus documentation + ! Only using rotational DOFs for rotations and not including + ! contributions from translations + + CALL AllocAry(modal_participation, nDOF, 6, 'modal_participation', ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'Init_ModalDamping') + + do j = 1, 6 + modal_participation(:, j) = sum(phiT_M(:, j::6)*phiT_M(:, j::6), dim=2) + end do + + ! Write to a file + CALL GetNewUnit(bdModesFile) + open(unit=bdModesFile, file=TRIM( InitInp%RootName )//'.modes.csv') + + write(bdModesFile,*) '#Frequency [Hz], Zeta [Frac. Critical],'// & + 'Participation X, Participation Y, Participation Z,'// & + 'Participation RX, Participation RY, Participation RZ' + + ! Loop over modes to output + do j = 1, nDOF + + if( j <= numZeta) then + Zj = p%zeta(j) + else + ! Stiffness proportional damping is used past the last prescribed value + ! at a rate equal to the last prescribed value. + Zj = (p%zeta(numZeta) * omega(j) / omega(numZeta)) + endif + + write(bdModesFile, ' (1F12.4,1F12.8,6E14.5) ') omega(j)/TwoPi_D, & + Zj, modal_participation(j, :) / sum(modal_participation(j, :)) + end do + + close(bdModesFile) + + END SUBROUTINE + +END SUBROUTINE + !----------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the end of the simulation. SUBROUTINE BD_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) @@ -1987,46 +2106,32 @@ SUBROUTINE BD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, INTEGER(IntKi) :: ErrStat2 ! Temporary Error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary Error message CHARACTER(*), PARAMETER :: RoutineName = 'BD_CalcOutput' - LOGICAL :: CalcWriteOutput + LOGICAL :: IsFullLin - ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = "" AllOuts = 0.0_ReKi if (present(NeedWriteOutput)) then - CalcWriteOutput = NeedWriteOutput + IsFullLin = NeedWriteOutput else - CalcWriteOutput = .true. ! by default, calculate WriteOutput unless told that we do not need it + IsFullLin = .true. ! by default, calculate WriteOutput unless told that we do not need it end if ! Since x is passed in, but we need to update it, we must work with a copy. CALL BD_CopyContState(x, x_tmp, MESH_NEWCOPY, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! we may change the inputs (u) by applying the pitch actuator, so we will use m%u in this routine + ! We need to convert the inputs (u) to BD coordinates, so we will use m%u in this routine CALL BD_CopyInput(u, m%u, MESH_UPDATECOPY, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! Actuator - IF( p%UsePitchAct ) THEN - CALL PitchActuator_SetBC(p, m%u, xd, AllOuts) - ENDIF - ! END Actuator - - - CALL BD_CopyInput(m%u, m%u2, MESH_UPDATECOPY, ErrStat2, ErrMsg2) ! this is a copy of the inputs after the pitch actuator has been applied, but before converting to BD coordinates. will use this for computing WriteOutput values. - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - if (ErrStat >= AbortErrLev) then call cleanup() return end if - - ! We are trying to use quasistatic solve with loads, but do not know the input loads during initialization (no mesh yet). ! So, we need to rerun the solve routine to set the states at T=0 for the outputs to make sense. ! bjj: do we need to do a hack to get the jacobian set properly? @@ -2074,7 +2179,7 @@ SUBROUTINE BD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, CALL BD_QPDataVelocity( p, x_tmp, m ) ! x%dqdt --> m%qp%vvv, m%qp%vvp ! calculate accelerations and reaction loads (in m%RHS): - CALL BD_CalcForceAcc(m%u, p, OtherState, m, ErrStat2,ErrMsg2) + CALL BD_CalcForceAcc(m%u, p, x, OtherState, m, ErrStat2,ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ELSE @@ -2094,19 +2199,19 @@ SUBROUTINE BD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, ! set y%BldMotion fields: - CALL Set_BldMotion_Mesh( p, m%u2, x_tmp, OtherState, m, y) + CALL Set_BldMotion_Mesh( p, u, x_tmp, OtherState, m, y) !------------------------------------------------------- ! compute RootMxr and RootMyr for ServoDyn and ! get values to output to file: !------------------------------------------------------- - call Calc_WriteOutput( p, AllOuts, y, m, ErrStat2, ErrMsg2, CalcWriteOutput ) !uses m%u2 + call Calc_WriteOutput( u, p, AllOuts, y, m, ErrStat2, ErrMsg2, IsFullLin ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) y%RootMxr = AllOuts( RootMxr ) y%RootMyr = AllOuts( RootMyr ) - if (CalcWriteOutput) then + if (IsFullLin) then !............................................................................................................................... ! Place the selected output channels into the WriteOutput(:) array with the proper sign: !............................................................................................................................... @@ -2121,7 +2226,7 @@ SUBROUTINE BD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, y%WriteOutput(p%NumOuts+1:) = 0.0_ReKi ! Now we need to populate the blade node outputs here - call Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat2, ErrMsg2 ) ! Call after normal writeoutput. Will just postpend data on here. + call Calc_WriteBldNdOutput( u, p, OtherState, m, y, ErrStat2, ErrMsg2 ) ! Call after normal writeoutput. Will just postpend data on here. CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ENDIF end if @@ -2169,12 +2274,6 @@ SUBROUTINE BD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrSta CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) if (ErrStat >= AbortErrLev) return - ! Actuator - !!!IF( p%UsePitchAct ) THEN - !!! CALL PitchActuator_SetBC(p, m%u, xd, AllOuts) - !!!ENDIF - ! END Actuator - ! convert to BD coordinates and apply boundary conditions CALL BD_InputGlobalLocal(p,OtherState,m%u) @@ -2204,7 +2303,7 @@ SUBROUTINE BD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrSta CALL BD_QPDataVelocity( p, dxdt, m ) ! x%dqdt --> m%qp%vvv, m%qp%vvp ! calculate accelerations and reaction loads (in m%RHS): - CALL BD_CalcForceAcc(m%u, p, OtherState, m, ErrStat2,ErrMsg2) + CALL BD_CalcForceAcc(m%u, p, x, OtherState, m, ErrStat2,ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) if (ErrStat >= AbortErrLev) return @@ -2237,9 +2336,6 @@ SUBROUTINE BD_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, Err CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables - REAL(BDKi) :: temp_R(3,3) - REAL(BDKi) :: Hub_theta_Root(3) - REAL(BDKi) :: u_theta_pitch ! Initialize ErrStat @@ -2248,20 +2344,6 @@ SUBROUTINE BD_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, Err ! Update discrete states here: -! Actuator - IF( p%UsePitchAct ) THEN - !bjj: note that we've cheated a bit here because we have inputs at t+dt - temp_R = MATMUL(u%RootMotion%Orientation(:,:,1),TRANSPOSE(u%HubMotion%Orientation(:,:,1))) - Hub_theta_Root = EulerExtract(temp_R) - u_theta_pitch = -Hub_theta_Root(3) - - xd%thetaP = p%torqM(1,1)*xd%thetaP + p%torqM(1,2)*xd%thetaPD + p%torqM(1,2)*(p%pitchK*p%dt/p%pitchJ)*(-Hub_theta_Root(3)) - xd%thetaPD = p%torqM(2,1)*xd%thetaP + p%torqM(2,2)*xd%thetaPD + p%torqM(2,2)*(p%pitchK*p%dt/p%pitchJ)*(-Hub_theta_Root(3)) - - - ENDIF -! END Actuator - END SUBROUTINE BD_UpdateDiscState @@ -2386,8 +2468,8 @@ SUBROUTINE BD_DisplacementQP( nelem, p, x, m ) TYPE(BD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t TYPE(BD_MiscVarType), INTENT(INOUT) :: m !< misc/optimization variables - INTEGER(IntKi) :: ErrStat !< Ignored error handling for LAPACK_GEMM - CHARACTER(ErrMsgLen) :: ErrMsg !< Ignored error handling for LAPACK_GEMM + INTEGER(IntKi) :: ErrStat !< index to current element + CHARACTER(ErrMsgLen) :: ErrMsg !< index to current element INTEGER(IntKi) :: idx_qp !< index to the current quadrature point INTEGER(IntKi) :: elem_start !< Node point of first node in current element @@ -2413,9 +2495,8 @@ SUBROUTINE BD_DisplacementQP( nelem, p, x, m ) elem_start = p%node_elem_idx(nelem,1) ! Use matrix multiplication to interpolate position and position derivative to quadrature points - ! NOTE: errors from LAPACK_GEMM can only be due to matrix size mismatch, so they can be safely ignored if matrices are correct size - call LAPACK_GEMM('N','N', 1.0_BDKi, x%q(1:3,elem_start:elem_start+p%nodes_per_elem-1), p%Shp, 0.0_BDKi, m%qp%uuu(1:3,:,nelem), ErrStat, ErrMsg) - call LAPACK_GEMM('N','N', 1.0_BDKi, x%q(1:3,elem_start:elem_start+p%nodes_per_elem-1), p%ShpDer, 0.0_BDKi, m%qp%uup(1:3,:,nelem), ErrStat, ErrMsg) + call LAPACK_DGEMM('N','N', 1.0_BDKi, x%q(1:3,elem_start:elem_start+p%nodes_per_elem-1), p%Shp, 0.0_BDKi, m%qp%uuu(1:3,:,nelem), ErrStat, ErrMsg) + call LAPACK_DGEMM('N','N', 1.0_BDKi, x%q(1:3,elem_start:elem_start+p%nodes_per_elem-1), p%ShpDer, 0.0_BDKi, m%qp%uup(1:3,:,nelem), ErrStat, ErrMsg) ! Apply Jacobian to get position derivative with respect to X-axis do idx_qp = 1, p%nqp @@ -2507,9 +2588,8 @@ SUBROUTINE BD_RotationalInterpQP( nelem, p, x, m ) ! Use matrix multiplication to interpolate rotation and rotation derivative to quadrature points ! These rotations do not include the root node rotation at this point (added later in function) - ! NOTE: errors from LAPACK_GEMM can only be due to matrix size mismatch, so they can be safely ignored if matrices are correct size - call LAPACK_GEMM('N','N', 1.0_BDKi, m%Nrrr(:,:,nelem), p%Shp, 0.0_BDKi, m%qp%uuu(4:6,:,nelem), ErrStat, ErrMsg) - call LAPACK_GEMM('N','N', 1.0_BDKi, m%Nrrr(:,:,nelem), p%ShpDer, 0.0_BDKi, m%qp%uup(4:6,:,nelem), ErrStat, ErrMsg) + call LAPACK_DGEMM('N','N', 1.0_BDKi, m%Nrrr(:,:,nelem), p%Shp, 0.0_BDKi, m%qp%uuu(4:6,:,nelem), ErrStat, ErrMsg) + call LAPACK_DGEMM('N','N', 1.0_BDKi, m%Nrrr(:,:,nelem), p%ShpDer, 0.0_BDKi, m%qp%uup(4:6,:,nelem), ErrStat, ErrMsg) ! Apply Jacobian to get rotation derivative with respect to X-axis do idx_qp = 1, p%nqp @@ -2735,6 +2815,7 @@ SUBROUTINE BD_ElasticForce(nelem,p,m,fact) p%E10(:,idx_qp,nelem), & m%qp%E1(:,idx_qp,nelem), & m%qp%kappa(1:3,idx_qp,nelem), & + m%qp%strain(:,idx_qp,nelem), & p%Stif0_QP(:,:,(nelem-1)*p%nqp+idx_qp), & m%qp%Stif(:,:,idx_qp,nelem), & m%qp%Fc(:,idx_qp,nelem), & @@ -2748,6 +2829,7 @@ SUBROUTINE BD_ElasticForce(nelem,p,m,fact) p%E10(:,idx_qp,nelem), & m%qp%E1(:,idx_qp,nelem), & m%qp%kappa(1:3,idx_qp,nelem), & + m%qp%strain(:,idx_qp,nelem), & p%Stif0_QP(:,:,(nelem-1)*p%nqp+idx_qp), & m%qp%Stif(:,:,idx_qp,nelem), & m%qp%Fc(:,idx_qp,nelem), & @@ -2833,11 +2915,10 @@ subroutine Calc_Oe_Pe_Qe(RR0, Stif, E1, Fc, cet, k1s, Oe, Pe, Qe) Qe(4:6,4:6) = -MATMUL(tildeE,Oe(1:3,4:6)) end subroutine - subroutine Calc_Fc_Fd(RR0, uuu, E10, E1, kappa, Stif0, Stif, Fc, Fd, cet, k1s) + subroutine Calc_Fc_Fd(RR0, uuu, E10, E1, kappa, strain, Stif0, Stif, Fc, Fd, cet, k1s) REAL(BDKi), intent(in) :: RR0(:,:), uuu(:), E10(:), E1(:), kappa(:), Stif0(:,:), Stif(:,:) - REAL(BDKi), intent(out) :: Fc(:), Fd(:), cet, k1s + REAL(BDKi), intent(out) :: strain(:), Fc(:), Fd(:), cet, k1s REAL(BDKi) :: e1s - REAL(BDKi) :: eee(6) !< intermediate array for calculation Strain and curvature terms of Fc REAL(BDKi) :: fff(6) !< intermediate array for calculation of the elastic force, Fc REAL(BDKi) :: R(3,3) !< rotation matrix at quatrature point REAL(BDKi) :: Rx0p(3) !< \f$ \underline{R} \underline{x}^\prime_0 \f$ @@ -2856,7 +2937,7 @@ subroutine Calc_Fc_Fd(RR0, uuu, E10, E1, kappa, Stif0, Stif, Fc, Fd, cet, k1s) ! eee(1:3) = m%qp%E1(1:3,idx_qp,nelem) - m%qp%RR0(1:3,3,idx_qp,nelem) ! Using RR0 z direction in IEC coords call BD_CrvMatrixR(uuu(4:6), R) ! Get rotation at QP as a matrix Rx0p = matmul(R,E10) ! Calculate rotated initial tangent - eee(1:3) = E1(1:3) - Rx0p ! Use rotated initial tangent in place of RR0*i1 to eliminate likely mismatch between R0*i1 and x0' + strain(1:3) = E1(1:3) - Rx0p ! Use rotated initial tangent in place of RR0*i1 to eliminate likely mismatch between R0*i1 and x0' !> ### Set the 1D sectional curvature, \f$ \underline{\kappa} \f$, equation (5) !! \f$ \underline{\kappa} = \underline{k} + \underline{\underline{R}}\underline{k}_i \f$ @@ -2876,7 +2957,7 @@ subroutine Calc_Fc_Fd(RR0, uuu, E10, E1, kappa, Stif0, Stif, Fc, Fd, cet, k1s) !! \f$ !! In other words, \f$ \tilde{k} = \left(\underline{\underline{R}}^\prime\underline{\underline{R}}^T \right) \f$. !! Note: \f$ \underline{\kappa} \f$ was already calculated in the BD_DisplacementQP routine - eee(4:6) = kappa(1:3) + strain(4:6) = kappa(1:3) !FIXME: note that the k_i terms may not be documented correctly here. @@ -2908,7 +2989,7 @@ subroutine Calc_Fc_Fd(RR0, uuu, E10, E1, kappa, Stif0, Stif, Fc, Fd, cet, k1s) !! \underline{k} !! \end{array} \right\} \f$ !! - fff(1:6) = MATMUL(Stif,eee) + fff(1:6) = MATMUL(Stif,strain) !> ###Calculate the extension twist coupling. @@ -2919,13 +3000,13 @@ subroutine Calc_Fc_Fd(RR0, uuu, E10, E1, kappa, Stif0, Stif, Fc, Fd, cet, k1s) !! \f$ \kappa_{m} = \left( \underline{\underline{R}}\underline{\underline{R}}_0 \right) ^T \underline{k}\f$ \n ! Strain into the material basis (eq (39) of Dymore manual) - !Wrk(:) = MATMUL(TRANSPOSE(m%qp%RR0(:,:,idx_qp,nelem)),eee(1:3)) + !Wrk(:) = MATMUL(TRANSPOSE(m%qp%RR0(:,:,idx_qp,nelem)),strain(1:3)) !e1s = Wrk(3) !epsilon_{1} in material basis (for major axis of blade, which is z in the IEC formulation) - e1s = dot_product( RR0(:,3), eee(1:3) ) + e1s = dot_product( RR0(:,3), strain(1:3) ) - !Wrk(:) = MATMUL(TRANSPOSE(m%qp%RR0(:,:,idx_qp,nelem)),eee(4:6)) + !Wrk(:) = MATMUL(TRANSPOSE(m%qp%RR0(:,:,idx_qp,nelem)),strain(4:6)) !k1s = Wrk(3) !kappa_{1} in material basis (for major axis of blade, which is z in the IEC formulation) - k1s = dot_product( RR0(:,3), eee(4:6) ) + k1s = dot_product( RR0(:,3), strain(4:6) ) !> Add extension twist coupling terms to the \f$ \underline{F}^c_{a} \f$\n @@ -2994,9 +3075,8 @@ SUBROUTINE BD_QPDataVelocity( p, x, m ) elem_start = p%node_elem_idx(nelem,1) ! Use matrix multiplication to interpolate velocity and velocity derivative to quadrature points - ! NOTE: errors from LAPACK_GEMM can only be due to matrix size mismatch, so they can be safely ignored if matrices are correct size - call LAPACK_GEMM('N','N', 1.0_BDKi, x%dqdt(:,elem_start:elem_start+p%nodes_per_elem-1), p%Shp, 0.0_BDKi, m%qp%vvv(:,:,nelem), ErrStat, ErrMsg) - call LAPACK_GEMM('N','N', 1.0_BDKi, x%dqdt(:,elem_start:elem_start+p%nodes_per_elem-1), p%ShpDer, 0.0_BDKi, m%qp%vvp(:,:,nelem), ErrStat, ErrMsg) + call LAPACK_DGEMM('N','N', 1.0_BDKi, x%dqdt(:,elem_start:elem_start+p%nodes_per_elem-1), p%Shp, 0.0_BDKi, m%qp%vvv(:,:,nelem), ErrStat, ErrMsg) + call LAPACK_DGEMM('N','N', 1.0_BDKi, x%dqdt(:,elem_start:elem_start+p%nodes_per_elem-1), p%ShpDer, 0.0_BDKi, m%qp%vvp(:,:,nelem), ErrStat, ErrMsg) ! Apply Jacobian to get velocity derivative with respect to X-axis do idx_qp = 1, p%nqp @@ -3334,7 +3414,7 @@ SUBROUTINE BD_ElementMatrixAcc( nelem, p, OtherState, m ) CALL BD_ElasticForce( nelem, p, m, .FALSE. ) ! Calculate Fc, Fd only - IF(p%damp_flag .NE. 0) THEN + IF(p%damp_flag .EQ. 1) THEN CALL BD_DissipativeForce( nelem, p, m, .FALSE. ) ! Calculate dissipative terms on Fc, Fd ENDIF CALL BD_GravityForce( nelem, p, m, MATMUL(p%gravity,OtherState%GlbRot) ) ! Calculate Fg @@ -4576,14 +4656,6 @@ SUBROUTINE BD_GA2(t,n,u,utimes,p,x,xd,z,OtherState,m,ErrStat,ErrMsg) call BD_Input_extrapinterp( u, utimes, u_interp, t+p%dt, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL BD_UpdateDiscState( t, n, u_interp, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! Actuator - IF( p%UsePitchAct ) THEN - CALL PitchActuator_SetBC(p, u_interp, xd) - ENDIF - ! Transform quantities from global frame to local (blade in BD coords) frame CALL BD_InputGlobalLocal(p,OtherState,u_interp) @@ -4797,16 +4869,33 @@ SUBROUTINE BD_DynamicSolutionGA2( x, OtherState, p, m, ErrStat, ErrMsg) ! extract the unconstrained stifness matrix m%LP_StifK_LU = m%LP_StifK(7:p%dof_total,7:p%dof_total) - ! note m%LP_indx is allocated larger than necessary (to allow us to use it in multiple places) - CALL LAPACK_getrf( p%dof_total-6, p%dof_total-6, m%LP_StifK_LU, m%LP_indx, ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return + ! Factoring of the matrix is done below after modal damping is added (if applicable). ENDIF ! Reshape 2d array into 1d for the use with the LAPACK solver m%LP_RHS = RESHAPE(m%RHS(:,:), (/p%dof_total/)) m%LP_RHS_LU = m%LP_RHS(7:p%dof_total) + ! Modal damping + IF(p%damp_flag .EQ. 2) THEN + CALL BD_AddModalDampingRHS(p, x, OtherState, m, fact) + + IF ( (p%tngt_stf_fd .OR. p%tngt_stf_comp) .AND. fact ) then + ! FD does not get incorporated to everything else, + ! but this function prints the error comparison. + CALL BD_FD_GA2_DAMPING(p, x, OtherState, m) + end if + ENDIF + + if (fact) then + ! Factor iteration matrix after the damping matrix from modal damping is added. + CALL LAPACK_getrf( p%dof_total-6, p%dof_total-6, m%LP_StifK_LU, m%LP_indx, ErrStat2, ErrMsg2) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + ! note m%LP_indx is allocated larger than necessary (to allow us to use it in multiple places) + if (ErrStat >= AbortErrLev) return + end if + ! Solve for X in A*X=B to get the accelerations of blade CALL LAPACK_getrs( 'N',p%dof_total-6, m%LP_StifK_LU, m%LP_indx, m%LP_RHS_LU, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4969,6 +5058,131 @@ SUBROUTINE BD_FD_GA2( x, OtherState, p, m ) END SUBROUTINE BD_FD_GA2 +! This subroutine does finite differencing for only the modal damping +! of the GA2 algorithm. This is applied in a consistent way as the Newton update. +SUBROUTINE BD_FD_GA2_DAMPING(p_in, x_in, OtherState_in, m_in) + + TYPE(BD_ParameterType), INTENT(IN ) :: p_in !< Parameters + TYPE(BD_ContinuousStateType), INTENT(IN ) :: x_in !< Continuous states + TYPE(BD_OtherStateType), INTENT(IN ) :: OtherState_in !< other states (contains ref orientation) + TYPE(BD_MiscVarType), INTENT(INOUT) :: m_in !< Misc/optimization variables + + TYPE(BD_ParameterType) :: p !< Parameters + TYPE(BD_ContinuousStateType) :: x !< Continuous states + TYPE(BD_OtherStateType) :: OtherState !< other states (contains ref orientation) + TYPE(BD_MiscVarType) :: m !< Misc/optimization variables + + integer(IntKi) :: i, j, k ! looping indexing variable + integer(IntKi) :: nDOF ! number of DOFs + real(BDKi) :: delta ! number of DOFs + + INTEGER(IntKi) :: ErrStat ! Temporary Error status + CHARACTER(ErrMsgLen) :: ErrMsg ! Temporary Error message + REAL(BDKi), allocatable :: Damping_FD(:,:) + REAL(BDKi), allocatable :: Damping_Diff(:,:) + + ErrStat = ErrID_None + ErrMsg = "" + + ! Debugging work suggests at 1e-6 works well here. + delta = 1.0d-6 ! p_in%tngt_stf_pert + + nDOF = p_in%dof_total - 6 + + ! allocate local array and initialize to all zeros + CALL AllocAry(Damping_FD, nDOF, nDOF,'Damping_FD', ErrStat, ErrMsg) + CALL AllocAry(Damping_Diff, nDOF, nDOF,'Damping_Diff', ErrStat, ErrMsg) + + Damping_FD(:, :) = 0.0_BDKi + Damping_Diff(:, :) = 0.0_BDKi + + CALL BD_CopyMisc(m_in, m, MESH_NEWCOPY, ErrStat, ErrMsg) + + ! Loop over doing Finite Differencing + DO i = 2,p_in%nodes_per_elem ! skip first node + DO j = 1,p_in%dof_node + + ! Global DOF + k = 6 * (i - 2) + j + + !!!!!!!!!!!!!!!!!!!!!!!!! + ! Positive Perturbation + ! Copy Everything about the problem + CALL BD_CopyParam(p_in, p, MESH_UPDATECOPY, ErrStat, ErrMsg) + CALL BD_CopyContState(x_in, x, MESH_UPDATECOPY, ErrStat, ErrMsg) + CALL BD_CopyOtherState(OtherState_in, OtherState, MESH_UPDATECOPY, ErrStat, ErrMsg) + CALL BD_CopyMisc(m_in, m, MESH_UPDATECOPY, ErrStat, ErrMsg) + + ! Apply perturbation as a solution is applied + m%Solution = 0.0_BDKi + m%Solution(j,i) = delta + + ! Recalculate Everything + CALL BD_UpdateDynamicGA2(p,m,x,OtherState) + CALL BD_QuadraturePointData( p,x,m ) + CALL BD_GenerateDynamicElementGA2( x, OtherState, p, m, .FALSE.) + + m%LP_RHS_LU = 0.0_BDKi + + CALL BD_AddModalDampingRHS(p, x, OtherState, m, .FALSE.) + + Damping_FD(:, k) = Damping_FD(:, k) + m%LP_RHS_LU + + !!!!!!!!!!!!!!!!!!!!!!!!! + ! Negative Perturbation + ! Copy Everything about the problem + CALL BD_CopyParam(p_in, p, MESH_UPDATECOPY, ErrStat, ErrMsg) + CALL BD_CopyContState(x_in, x, MESH_UPDATECOPY, ErrStat, ErrMsg) + CALL BD_CopyOtherState(OtherState_in, OtherState, MESH_UPDATECOPY, ErrStat, ErrMsg) + CALL BD_CopyMisc(m_in, m, MESH_UPDATECOPY, ErrStat, ErrMsg) + + ! Apply perturbation as a solution is applied + m%Solution = 0.0_BDKi + m%Solution(j,i) = -1.0_BDKi * delta + + ! Recalculate Everything + CALL BD_UpdateDynamicGA2(p,m,x,OtherState) + CALL BD_QuadraturePointData( p,x,m ) + CALL BD_GenerateDynamicElementGA2( x, OtherState, p, m, .FALSE.) + + m%LP_RHS_LU = 0.0_BDKi + + CALL BD_AddModalDampingRHS(p, x, OtherState, m, .FALSE.) + + Damping_FD(:, k) = Damping_FD(:, k) - m%LP_RHS_LU + + ! Include Negative Sign because solver actually uses -dRHS/dX + Damping_FD(:, k) = Damping_FD(:, k) / (-2.0_BDKi * delta) + + END DO + END DO + + ! Reference Analytical Damping Matrix + + ! Copy Everything about the problem + CALL BD_CopyParam(p_in, p, MESH_UPDATECOPY, ErrStat, ErrMsg) + CALL BD_CopyContState(x_in, x, MESH_UPDATECOPY, ErrStat, ErrMsg) + CALL BD_CopyOtherState(OtherState_in, OtherState, MESH_UPDATECOPY, ErrStat, ErrMsg) + CALL BD_CopyMisc(m_in, m, MESH_UPDATECOPY, ErrStat, ErrMsg) + + ! Recalculate Everything + CALL BD_QuadraturePointData( p,x,m ) + CALL BD_GenerateDynamicElementGA2( x, OtherState, p, m, .FALSE.) + + m%LP_StifK_LU = 0.0_BDKi + CALL BD_AddModalDampingRHS(p, x, OtherState, m, .TRUE.) + + Damping_Diff = m%LP_StifK_LU - Damping_FD + + ! print *, 'Finite Diff matrix: \n', Damping_FD + ! print *, 'Difference in damping matrices: \n', Damping_Diff + + print *, 'Finite Difference Matrix Norm: \n', sum(Damping_FD*Damping_FD) + print *, 'Error Diff Norm: \n', sum(Damping_Diff*Damping_Diff) + print *, 'Relative Error Norm: \n', sum(Damping_Diff*Damping_Diff) / sum(Damping_FD*Damping_FD) + +END SUBROUTINE BD_FD_GA2_DAMPING + !----------------------------------------------------------------------------------------------------------------------------------- !> This subroutine updates the 1) displacements/rotations(uf) !! 2) linear/angular velocities(vf); 3) linear/angular accelerations(af); and @@ -5081,7 +5295,7 @@ SUBROUTINE BD_ElementMatrixGA2( fact, nelem, p, OtherState, m ) CALL BD_ElasticForce( nelem,p,m,fact ) ! Calculate Fc, Fd [and if(fact): Oe, Pe, and Qe for N-R algorithm] using m%qp%E1, m%qp%RR0, m%qp%kappa, m%qp%Stif CALL BD_InertialForce( nelem,p,m,fact ) ! Calculate Fi [and Mi,Gi,Ki IF(fact)] - IF(p%damp_flag .NE. 0) THEN + IF(p%damp_flag .EQ. 1) THEN CALL BD_DissipativeForce( nelem,p,m,fact ) ! Calculate dissipative terms on Fc, Fd [and Sd, Od, Pd and Qd, betaC, Gd, Xd, Yd for N-R algorithm] ENDIF @@ -5135,7 +5349,7 @@ SUBROUTINE BD_ElementMatrixGA2( fact, nelem, p, OtherState, m ) END DO ! Dissipative terms - IF (p%damp_flag .NE. 0) THEN + IF (p%damp_flag .EQ. 1) THEN DO j=1,p%nodes_per_elem DO idx_dof2=1,p%dof_node DO i=1,p%nodes_per_elem @@ -5551,7 +5765,7 @@ SUBROUTINE BD_InitAcc( u, p, x, OtherState, m, qdotdot, ErrStat, ErrMsg ) CALL BD_QPDataVelocity(p, x, m) ! set misc vars, particularly m%RHS - CALL BD_CalcForceAcc( u, p, OtherState, m, ErrStat2, ErrMsg2 ) + CALL BD_CalcForceAcc( u, p, x, OtherState, m, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! set accelerations with inputs from the root and BD_CalcForceAcc solution @@ -5635,10 +5849,11 @@ END SUBROUTINE BD_InitAcc !! !! The root reaction force is therefore calculated afterwards as !! \f$ F_\textrm{root} = f_1 - \sum_{i} m_{1,i} a_{i} \f$. -SUBROUTINE BD_CalcForceAcc( u, p, OtherState, m, ErrStat, ErrMsg ) +SUBROUTINE BD_CalcForceAcc( u, p, x, OtherState, m, ErrStat, ErrMsg ) TYPE(BD_InputType), INTENT(IN ) :: u !< Inputs at t TYPE(BD_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(BD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states TYPE(BD_OtherStateType), INTENT(IN ) :: OtherState !< other states (contains ref orientation) TYPE(BD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation @@ -5647,6 +5862,7 @@ SUBROUTINE BD_CalcForceAcc( u, p, OtherState, m, ErrStat, ErrMsg ) INTEGER(IntKi) :: j REAL(BDKi) :: RootAcc(6) REAL(BDKi) :: NodeMassAcc(6) + INTEGER(IntKi) :: n_free INTEGER(IntKi) :: nelem ! number of elements INTEGER(IntKi) :: ErrStat2 ! Temporary Error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary Error message @@ -5654,73 +5870,59 @@ SUBROUTINE BD_CalcForceAcc( u, p, OtherState, m, ErrStat, ErrMsg ) ErrStat = ErrID_None ErrMsg = "" - - ! must initialize these because BD_AssembleStiffK and BD_AssembleRHS are INOUT + ! must initialize these because BD_AssembleStiffK and BD_AssembleRHS are INOUT m%RHS = 0.0_BDKi m%MassM = 0.0_BDKi - ! Store the root accelerations as they will be used multiple times + ! Store the root accelerations as they will be used multiple times RootAcc(1:3) = u%RootMotion%TranslationAcc(1:3,1) RootAcc(4:6) = u%RootMotion%RotationAcc(1:3,1) - - ! Calculate the global mass matrix and force vector for the beam + ! Calculate the global mass matrix and force vector for the beam DO nelem=1,p%elem_total CALL BD_ElementMatrixAcc( nelem, p, OtherState, m ) ! Calculate m%elm and m%elf CALL BD_AssembleStiffK(nelem,p,m%elm, m%MassM) ! Assemble full mass matrix CALL BD_AssembleRHS(nelem,p,m%elf, m%RHS) ! Assemble right hand side force terms ENDDO - - ! Add point forces at GLL points to RHS of equation. + ! Add point forces at GLL points to RHS of equation. m%RHS = m%RHS + m%PointLoadLcl + ! Number of free degrees of freedom + n_free = p%dof_total - 6 - ! Now set the root reaction force. - ! Note: m%RHS currently holds the force terms for the RHS of the equation. - !> The root reaction force is first node force minus mass time acceleration terms: - !! \f$ F_\textrm{root} = F_1 - \sum_{i} m_{1,i} a_{i} \f$. - m%FirstNodeReactionLclForceMoment(1:6) = m%RHS(1:6,1) + ! Full mass matrix (n_dof, n_dof) + m%LP_MassM = reshape(m%MassM, [p%dof_total, p%dof_total]) - ! Setup the RHS of the m*a=F equation. Skip the first node as that is handled separately. - DO j=2,p%node_total - m%RHS(:,j) = m%RHS(:,j) - MATMUL( RESHAPE(m%MassM(:,j,:,1),(/6,6/)), RootAcc) - ENDDO + ! Mass matrix for free nodes + m%LP_MassM_LU = m%LP_MassM(7:p%dof_total, 7:p%dof_total) + ! Residual vector for free nodes + m%LP_RHS_LU = reshape(m%RHS(:,2:p%node_total), [n_free]) - ! Solve for the accelerations! - ! Reshape for the use with the LAPACK solver. Only solving for nodes 2:p%node_total (node 1 accelerations are known) - m%LP_RHS_LU = RESHAPE(m%RHS(:,2:p%node_total), (/p%dof_total-6/)) - m%LP_MassM = RESHAPE(m%MassM, (/p%dof_total,p%dof_total/)) ! Flatten out the dof dimensions of the matrix. - m%LP_MassM_LU = m%LP_MassM(7:p%dof_total,7:p%dof_total) + ! Add force contributions from root acceleration + m%LP_RHS_LU = m%LP_RHS_LU - matmul(m%LP_MassM(7:,1:6), RootAcc) - ! Solve linear equations A * X = B for acceleration (F=ma) for nodes 2:p%node_total - CALL LAPACK_getrf( p%dof_total-6, p%dof_total-6, m%LP_MassM_LU, m%LP_indx, ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL LAPACK_getrs( 'N',p%dof_total-6, m%LP_MassM_LU, m%LP_indx, m%LP_RHS_LU,ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF(p%damp_flag .EQ. 2) THEN + ! Because modal damping is already global, it wouldn't make sense in BD_AssembleRHS. + CALL BD_AddModalDampingRHS(p, x, OtherState, m, .False.) + ENDIF + ! Solve linear equations A * X = B for acceleration (F=ma) for nodes 2:p%node_total + CALL LAPACK_getrf(n_free, n_free, m%LP_MassM_LU, m%LP_indx, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + CALL LAPACK_getrs('N', n_free, m%LP_MassM_LU, m%LP_indx, m%LP_RHS_LU, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - ! Reshape for copy over to output overall accelerations of system - m%RHS(:,2:p%node_total) = RESHAPE( m%LP_RHS_LU, (/ p%dof_node, p%node_total-1 /) ) - m%RHS(:,1) = RootAcc ! This is known at the start. - - - - !> Now that we have all the accelerations, complete the summation \f$ \sum_{i} m_{1,i} a_{i} \f$ - ! First node: - NodeMassAcc = MATMUL( RESHAPE(m%MassM(:,1,:,1),(/6,6/)),m%RHS(:,1) ) - m%FirstNodeReactionLclForceMoment(1:6) = m%FirstNodeReactionLclForceMoment(1:6) - NodeMassAcc(1:6) + ! Get reaction force at root node + m%FirstNodeReactionLclForceMoment = m%RHS(1:6,1) - & + matmul(m%LP_MassM(1:6,7:), m%LP_RHS_LU) - & + matmul(m%LP_MassM(1:6,1:6), RootAcc) - ! remaining nodes - DO j=2,p%Node_total - NodeMassAcc = MATMUL( RESHAPE(m%MassM(:,j,:,1),(/6,6/)),m%RHS(:,j) ) - m%FirstNodeReactionLclForceMoment(1:6) = m%FirstNodeReactionLclForceMoment(1:6) - NodeMassAcc(1:6) - ENDDO - - - RETURN + ! Populate RHS with prescribed root acceleration and solved accelerations + m%RHS(:,1) = RootAcc + m%RHS(:,2:p%node_total) = RESHAPE(m%LP_RHS_LU, [p%dof_node, p%node_total-1]) END SUBROUTINE BD_CalcForceAcc @@ -5837,476 +6039,451 @@ SUBROUTINE BD_ComputeElementMass(nelem,p,NQPpos,EMass0_GL,elem_mass,elem_CG,elem END SUBROUTINE BD_ComputeElementMass - !----------------------------------------------------------------------------------------------------------------------------------- -!> This routine alters the RootMotion inputs based on the pitch-actuator parameters and discrete states -SUBROUTINE PitchActuator_SetBC(p, u, xd, AllOuts) +!> This subroutine calculates the modal damping force +! Adds modal damping contributions to m%LP_RHS_LU +SUBROUTINE BD_AddModalDampingRHS(p, x, OtherState, m, fact) - TYPE(BD_ParameterType), INTENT(IN ) :: p !< The module parameters - TYPE(BD_InputType), INTENT(INOUT) :: u !< inputs - TYPE(BD_DiscreteStateType),INTENT(IN ) :: xd !< The module discrete states - REAL(ReKi), OPTIONAL,INTENT(INOUT) :: AllOuts(0:) !< all output array for writing to file - ! local variables - REAL(BDKi) :: temp_R(3,3) - REAL(BDKi) :: temp_cc(3) - REAL(BDKi) :: u_theta_pitch - REAL(BDKi) :: thetaP - REAL(BDKi) :: omegaP - REAL(BDKi) :: alphaP - - - temp_R = MATMUL(u%RootMotion%Orientation(:,:,1),TRANSPOSE(u%HubMotion%Orientation(:,:,1))) - temp_cc = EulerExtract(temp_R) != Hub_theta_Root - u_theta_pitch = -temp_cc(3) - - thetaP = xd%thetaP - omegaP = xd%thetaPD - alphaP = -(p%pitchK/p%pitchJ) * xd%thetaP - (p%pitchC/p%pitchJ) * xd%thetaPD + (p%pitchK/p%pitchJ) * u_theta_pitch - - ! Calculate new root motions for use as BeamDyn boundary conditions: - !note: we alter the orientation last because we need the input (before actuator) root orientation for the rotational velocity and accelerations - u%RootMotion%RotationVel(:,1) = u%RootMotion%RotationVel(:,1) - omegaP * u%RootMotion%Orientation(3,:,1) - u%RootMotion%RotationAcc(:,1) = u%RootMotion%RotationAcc(:,1) - alphaP * u%RootMotion%Orientation(3,:,1) - - temp_cc(3) = -thetaP - temp_R = EulerConstruct(temp_cc) - u%RootMotion%Orientation(:,:,1) = MATMUL(temp_R,u%HubMotion%Orientation(:,:,1)) - - if (present(AllOuts)) then - AllOuts(PAngInp) = u_theta_pitch - AllOuts(PAngAct) = thetaP - AllOuts(PRatAct) = omegaP - AllOuts(PAccAct) = alphaP - end if + TYPE(BD_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(BD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states + TYPE(BD_OtherStateType), INTENT(IN ) :: OtherState !< other states (contains ref orientation) + TYPE(BD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + LOGICAL, INTENT(IN ) :: fact !< Boolean to calculate the Jacobian -END SUBROUTINE PitchActuator_SetBC + integer(IntKi) :: j, k ! looping indexing variable + integer(IntKi) :: nDOF ! number of DOFs + integer(IntKi) :: elem ! looping indexing for element number + integer(IntKi) :: elem_node ! looping indexing for node in the element number + real(R8Ki) :: r(3) ! nodal position relative to root + real(R8Ki) :: NodeRot(3, 3) -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! ###### The following four routines are Jacobian routines for linearization capabilities ####### -! If the module does not implement them, set ErrStat = ErrID_Fatal in BD_Init() when InitInp%Linearize is .true. -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions -!! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and DZ/du are returned. -SUBROUTINE BD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu, StateRel_x, StateRel_xdot) -!.................................................................................................................................. + ! 1. Velocities relative to root + ! element loops + do elem = 1, p%elem_total - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(BD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(BD_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(BD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(BD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(BD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(BD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(BD_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); - !! Output fields are not used by this routine, but type is - !! available here so that mesh parameter information (i.e., - !! connectivity) does not have to be recalculated for dYdu. - TYPE(BD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect - !! to the inputs (u) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with - !! respect to the inputs (u) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with - !! respect to the inputs (u) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with - !! respect to the inputs (u) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: StateRel_x(:,:) !< Matrix by which the displacement states are optionally converted relative to root - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: StateRel_xdot(:,:) !< Matrix by which the velocity states are optionally converted relative to root + do elem_node = 2, p%nodes_per_elem - - ! local variables - TYPE(BD_OutputType) :: y_p - TYPE(BD_OutputType) :: y_m - TYPE(BD_ContinuousStateType) :: x_p - TYPE(BD_ContinuousStateType) :: x_m - TYPE(BD_InputType) :: u_perturb - REAL(R8Ki) :: delta_p, delta_m ! delta change in input (plus, minus) - INTEGER(IntKi) :: i - REAL(R8Ki) :: RotateStates(3,3) - REAL(R8Ki), ALLOCATABLE :: RelState_x(:,:) - REAL(R8Ki), ALLOCATABLE :: RelState_xdot(:,:) - - integer(intKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'BD_JacobianPInput' + ! Global node index, excluding root + j = (elem - 1) * (p%nodes_per_elem - 1) + elem_node + ! DOF index + k = (j - 2) * 6 - ! Initialize ErrStat + ! 1.a. Node translational velocity minus root velocity + ! x%... is at j+1 because skipping the root node and j is 1 at the first node after root. + m%DampedVelocities(k+1:k+6) = x%dqdt(:, j) - x%dqdt(:, 1) - ErrStat = ErrID_None - ErrMsg = '' + ! 1.b. Subtract out the rigid body rotational velocity based on the blade root rotation - - ! get OP values here: - call BD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! make a copy of the inputs to perturb - call BD_CopyInput( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + ! Vector from root to node + ! r = OtherState%GlbPos + p%uuN0(1:3, elem_node, elem) + x%q(1:3, j) - & + ! (u%RootMotion%Position(:, 1) + u%RootMotion%TranslationDisp(:, 1)) + r = p%uuN0(1:3, elem_node, elem) + x%q(1:3, j) - if (p%RelStates) then - if (.not. allocated(RelState_x)) then - call AllocAry(RelState_x, p%Jac_nx * 2, size(p%Jac_u_indx,1), 'RelState_x', ErrStat2, ErrMsg2) ! 18=6 motion fields on mesh x 3 directions for each field - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - if (.not. allocated(RelState_xdot)) then - call AllocAry(RelState_xdot, size(RelState_x,1), size(RelState_x,2), 'RelState_xdot', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - call Compute_RelState_Matrix(p, u, x, OtherState, RelState_x, RelState_xdot) - - if ( present(StateRel_x) ) then - if (.not. allocated(StateRel_x)) then - call AllocAry(StateRel_x, size(RelState_x,1), size(RelState_x,2), 'StateRel_x', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - end if - StateRel_x = RelState_x - end if - if ( present(StateRel_xdot) ) then - if (.not. allocated(StateRel_xdot)) then - call AllocAry(StateRel_xdot, size(RelState_xdot,1), size(RelState_xdot,2), 'StateRel_xdot', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - end if - StateRel_xdot = RelState_xdot - end if - else - if ( present(StateRel_x) ) then - if (allocated(StateRel_x)) deallocate(StateRel_x) - end if - if ( present(StateRel_xdot) ) then - if (allocated(StateRel_xdot)) deallocate(StateRel_xdot) - end if - end if - + m%DampedVelocities(k+1:k+3) = m%DampedVelocities(k+1:k+3) - Cross_Product(x%dqdt(4:6, 1), r) + end do - IF ( PRESENT( dYdu ) ) THEN - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: - - ! allocate dYdu - if (.not. allocated(dYdu) ) then - call AllocAry(dYdu,p%Jac_ny, size(p%Jac_u_indx,1),'dYdu', ErrStat2, ErrMsg2) - call setErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - end if - - if (p%CompAeroMaps) then - dYdu = 0.0_R8Ki - else - - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call BD_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call BD_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - do i=1,size(p%Jac_u_indx,1) - - ! get u_op + delta_p u - call BD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call Perturb_u( p, i, 1, u_perturb, delta_p ) - - ! compute y at u_op + delta_p u - call BD_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - ! get u_op - delta_m u - call BD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call Perturb_u( p, i, -1, u_perturb, delta_m ) - - ! compute y at u_op - delta_m u - call BD_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - ! get central difference: - call Compute_dY( p, y_p, y_m, delta_p, dYdu(:,i) ) - - end do - - - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - call BD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call BD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - - if (p%RelStates) then - call BD_JacobianPContState_noRotate( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx=m%lin_C ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - dYdu = dYdu + matmul(m%lin_C, RelState_x) - end if - - end if ! CompAeroMaps - - END IF + end do - IF ( PRESENT( dXdu ) ) THEN - ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + ! 2. rotate velocities by matmul(u%RootMotion%Orientation, OtherState%GlbRot) + ! Solve is done at the coordinate system based on time n for states at time n+1 + ! The damping matrix is technically defined for the n+1 coordinate system since that's where accel is evaluated. + ! Therefore, need to resolve the coordinate differences. + ! + ! OtherState%GlbRot = tranpose(u%RootMotion%Orientation(:, :, 1) evaluated at n) + ! here, u%RootMotion%Orientation(:, :, 1) is evaluated at n+1, but is tranposed at this point - ! allocate dXdu if necessary - if (.not. allocated(dXdu)) then - call AllocAry(dXdu, p%Jac_nx * 2, size(p%Jac_u_indx,1), 'dXdu', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - end if - - - do i=1,size(p%Jac_u_indx,1) - - ! get u_op + delta u - call BD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call Perturb_u( p, i, 1, u_perturb, delta_p ) + do j = 2, p%node_total + + ! Loop over the nodes that apply to the damping matrix, so don't include the root node. + call BD_CrvMatrixR(x%q(4:6, j), NodeRot) + + k = (j - 2) * 6 + m%DampedVelocities(k+1:k+3) = matmul(transpose(NodeRot), m%DampedVelocities(k+1:k+3)) + m%DampedVelocities(k+4:k+6) = matmul(transpose(NodeRot), m%DampedVelocities(k+4:k+6)) + end do + + ! 3. Multiply by modal damping matrix + m%ModalDampingF = matmul(p%ModalDampingMat, m%DampedVelocities) + + ! 4. Rotate to correct coordinates and subtract from m%LP_RHS_LU + do j = 2, p%node_total + + call BD_CrvMatrixR(x%q(4:6, j), NodeRot) + + k = (j - 2) * 6 + m%LP_RHS_LU(k+1:k+3) = m%LP_RHS_LU(k+1:k+3) - matmul(NodeRot, m%ModalDampingF(k+1:k+3)) + m%LP_RHS_LU(k+4:k+6) = m%LP_RHS_LU(k+4:k+6) - matmul(NodeRot, m%ModalDampingF(k+4:k+6)) + end do + + IF (fact) THEN + ! Calculate Jacobian and add to 'm%LP_StifK_LU' + ! Do not consider any derivative effects of displacements on portions of this calculation + nDOF = p%dof_total - 6 + + m%RotatedDamping = p%ModalDampingMat + + do j = 2, p%node_total + + ! Loop over the nodes that apply to the damping matrix, so don't include the root node. + call BD_CrvMatrixR(x%q(4:6, j), NodeRot) + + k = (j - 2) * 6 + + ! Rotations of the velocity side + m%RotatedDamping(:, k+1:k+3) = matmul(m%RotatedDamping(:, k+1:k+3), transpose(NodeRot)) + m%RotatedDamping(:, k+4:k+6) = matmul(m%RotatedDamping(:, k+4:k+6), transpose(NodeRot)) + + ! rotations on the force side + m%RotatedDamping(k+1:k+3, :) = matmul(NodeRot, m%RotatedDamping(k+1:k+3, :)) + m%RotatedDamping(k+4:k+6, :) = matmul(NodeRot, m%RotatedDamping(k+4:k+6, :)) - ! compute x at u_op + delta u - call BD_CalcContStateDeriv( t, u_perturb, p, x, xd, z, OtherState, m, x_p, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - ! get u_op - delta u - call BD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - call Perturb_u( p, i, -1, u_perturb, delta_m ) - - ! compute x at u_op - delta u - call BD_CalcContStateDeriv( t, u_perturb, p, x, xd, z, OtherState, m, x_m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - ! get central difference: - - ! we may have had an error allocating memory, so we'll check - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - ! get central difference: - call Compute_dX( p, x_p, x_m, delta_p, dXdu(:,i) ) - end do - - call BD_DestroyContState( x_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call BD_DestroyContState( x_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - if (p%RelStates) then - call BD_JacobianPContState_noRotate( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dXdx=m%lin_A ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - dXdu = dXdu + matmul(m%lin_A, RelState_x) - RelState_xdot - end if - - if (p%RotStates) then - ! Calculate difference between input root orientation and root reference orientation - RotateStates = matmul( u%RootMotion%Orientation(:,:,1), OtherState%GlbRot ) - do i=1,size(dXdu,1),3 - dXdu(i:i+2, :) = matmul( RotateStates, dXdu(i:i+2, :) ) - end do - end if + m%LP_StifK_LU = m%LP_StifK_LU + p%coef(7) * m%RotatedDamping + ENDIF - END IF ! dXdu +END SUBROUTINE BD_AddModalDampingRHS - IF ( PRESENT( dXddu ) ) THEN - if (allocated(dXddu)) deallocate(dXddu) - END IF - IF ( PRESENT( dZdu ) ) THEN - if (allocated(dZdu)) deallocate(dZdu) - END IF +subroutine BD_InitVars(u, p, x, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(BD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(BD_ParameterType), intent(inout) :: p !< Parameters + type(BD_ContinuousStateType), intent(inout) :: x !< Continuous state + type(BD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(BD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(BD_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in ) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'BD_InitVars' + INTEGER(IntKi) :: ErrStat2 ! Temporary Error status + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary Error message + + integer(IntKi) :: i, j, Flags, idx + REAL(R8Ki) :: MaxThrust, MaxTorque + CHARACTER(200) :: label + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + ! Set flags to AeroMap, if rotating states is true, set flags to rotating states + Flags = ior(VF_AeroMap, VF_DerivOrder2) + if (p%RotStates) Flags = ior(Flags, VF_RotFrame) + + ! Add translation displacement and orientation variables at blade nodes + ! Note: the first node is not included as it is a constraint state + do i = 2, p%node_total + label = 'finite element node '//trim(num2lstr(i))//' (number of elements = '//& + trim(num2lstr(p%elem_total))//'; element order = '//trim(num2lstr(p%nodes_per_elem-1))//')' + + call MV_AddVar(InitOut%Vars%x, "Blade Node "//trim(num2lstr(i)), FieldTransDisp, & + DatLoc(BD_x_q), iAry=1, jAry=i, Num=3, & + Flags=Flags, & + Perturb=0.2_BDKi*D2R_D * p%blade_length, & + LinNames=[trim(label)//' translational displacement in X, m', & + trim(label)//' translational displacement in Y, m', & + trim(label)//' translational displacement in Z, m']) + + call MV_AddVar(InitOut%Vars%x, "Blade Node "//trim(num2lstr(i)), FieldOrientation, & + DatLoc(BD_x_q), iAry=4, jAry=i, Num=3, & + Flags=ior(Flags, VF_WM_Rot), & + Perturb=0.2_BDKi*D2R_D, & + LinNames=[trim(label)//' rotational displacement in X, rad', & + trim(label)//' rotational displacement in Y, rad', & + trim(label)//' rotational displacement in Z, rad']) + end do + + ! Add translation and angular velocity at blade nodes + do i = 2, p%node_total + label = 'First time derivative of finite element node '//trim(num2lstr(i))//' (number of elements = '//& + trim(num2lstr(p%elem_total))//'; element order = '//trim(num2lstr(p%nodes_per_elem-1))//')' + + call MV_AddVar(InitOut%Vars%x, "Blade Node "//trim(num2lstr(i)), FieldTransVel, & + DatLoc(BD_x_dqdt), iAry=1, jAry=i, Num=3, & + Flags=Flags, & + Perturb=0.2_BDKi*D2R_D * p%blade_length, & + LinNames=[trim(label)//' translational displacement in X, m/s', & + trim(label)//' translational displacement in Y, m/s', & + trim(label)//' translational displacement in Z, m/s']) + + call MV_AddVar(InitOut%Vars%x, "Blade Node "//trim(num2lstr(i)), FieldAngularVel, & + DatLoc(BD_x_dqdt), iAry=4, jAry=i, Num=3, & + Flags=Flags, & + Perturb=0.2_BDKi*D2R_D, & + LinNames=[trim(label)//' rotational displacement in X, rad/s', & + trim(label)//' rotational displacement in Y, rad/s', & + trim(label)//' rotational displacement in Z, rad/s']) + end do + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- - call cleanup() + MaxThrust = 170.0_R8Ki*p%blade_length**2 + MaxTorque = 14.0_R8Ki*p%blade_length**3 + + call MV_AddMeshVar(InitOut%Vars%u, "RootMotion", MotionFields, & + DatLoc(BD_u_RootMotion), & + Mesh=u%RootMotion, & + Perturbs=[0.2_R8Ki*D2R_D * p%blade_length, & ! FieldTransDisp + 0.2_R8Ki*D2R_D, & ! FieldOrientation + 0.2_R8Ki*D2R_D * p%blade_length, & ! FieldTransVel + 0.2_R8Ki*D2R_D, & ! FieldAngularVel + 0.2_R8Ki*D2R_D * p%blade_length, & ! FieldTransAcc + 0.2_R8Ki*D2R_D]) ! FieldAngularAcc + + call MV_AddMeshVar(InitOut%Vars%u, "PointLoad", LoadFields, & + DatLoc(BD_u_PointLoad), & + Mesh=u%PointLoad, & + Perturbs=[MaxThrust/(100.0_R8Ki*3.0_R8Ki*u%PointLoad%Nnodes), & ! FieldForce + MaxTorque/(100.0_R8Ki*3.0_R8Ki*u%PointLoad%Nnodes)]) ! FieldMoment + + call MV_AddMeshVar(InitOut%Vars%u, "DistrLoad", LoadFields, & + DatLoc(BD_u_DistrLoad), & + Flags=ior(VF_Line, VF_AeroMap), & + Mesh=u%DistrLoad, & + Perturbs=[MaxThrust/(100.0_R8Ki*3.0_R8Ki*u%PointLoad%Nnodes), & ! FieldForce + MaxTorque/(100.0_R8Ki*3.0_R8Ki*u%PointLoad%Nnodes)]) ! FieldMoment + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(InitOut%Vars%y, 'Reaction force', LoadFields, DatLoc(BD_y_ReactionForce), Mesh=y%ReactionForce) + + call MV_AddMeshVar(InitOut%Vars%y, 'Blade motion', [FieldTransDisp, FieldOrientation, FieldTransVel, FieldAngularVel], & + DatLoc(BD_y_BldMotion), & + Flags=VF_AeroMap, & + Mesh=y%BldMotion) + call MV_AddMeshVar(InitOut%Vars%y, 'Blade motion', [FieldTransAcc, FieldAngularAcc], DatLoc(BD_y_BldMotion), & + Mesh=y%BldMotion) + + do i = 1, p%NumOuts + call MV_AddVar(InitOut%Vars%y, p%OutParam(i)%Name, FieldScalar, & + DatLoc(BD_y_WriteOutput), iAry=i, & + Flags=VF_WriteOut + OutParamFlags(p%OutParam(i)%Indx), & + LinNames=[trim(p%OutParam(i)%Name)//', '//trim(p%OutParam(i)%Units)], & + Active=p%OutParam(i)%Indx > 0) + end do + + idx = p%NumOuts + 1 + do i = 1, p%BldNd_NumOuts + call MV_AddVar(InitOut%Vars%y, p%BldNd_OutParam(i)%Name, FieldScalar, & + DatLoc(BD_y_WriteOutput), iAry=idx, & + Num=size(p%BldNd_BlOutNd), & + Flags=VF_WriteOut + BldNd_OutParamFlags(p%BldNd_OutParam(i)%Name), & + LinNames=[(BldNd_LinChan(p%BldNd_OutParam(i), j), j=1,size(p%BldNd_BlOutNd))], & + Active=p%BldNd_OutParam(i)%Indx > 0) + idx = idx + size(p%BldNd_BlOutNd) + end do + + !---------------------------------------------------------------------------- + ! Initialize Variables and Values + !---------------------------------------------------------------------------- + + CALL MV_InitVarsJac(InitOut%Vars, m%Jac, Linearize .or. p%CompAeroMaps, ErrStat2, ErrMsg2); if (Failed()) return + + call BD_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call BD_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call BD_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call BD_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + contains - subroutine cleanup() - call BD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call BD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call BD_DestroyInput( u_perturb, ErrStat2, ErrMsg2 ) - - if (allocated(RelState_x)) deallocate(RelState_x) - if (allocated(RelState_xdot)) deallocate(RelState_xdot) - end subroutine cleanup -END SUBROUTINE BD_JacobianPInput -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions -!! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. -SUBROUTINE BD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx, StateRotation ) -!.................................................................................................................................. + pure integer(IntKi) function OutParamFlags(indx) + integer(IntKi), intent(in) :: indx + integer(IntKi), parameter :: GlobalFrameIndices(*) = [& + TipTVXg, TipTVYg, TipTVZg, TipRVXg, TipRVYg, TipRVZg, NTVg, NRVg] + if (any(GlobalFrameIndices == indx)) then + OutParamFlags = VF_None + else + OutParamFlags = VF_RotFrame + end if + end function + + pure integer(IntKi) function BldNd_OutParamFlags(ChannelName) + character(*), intent(in) :: ChannelName + integer(IntKi) :: k + ! Get index of last character in channel name + k = len_trim(ChannelName) + ! If last letter is uppercase or lowercase G, then frame is global + if (ChannelName(k:k) == 'G' .or. ChannelName(k:k) == 'g') then + BldNd_OutParamFlags = VF_None + else + BldNd_OutParamFlags = VF_RotFrame + end if + end function - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(BD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(BD_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(BD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(BD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(BD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(BD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(BD_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); - !! Output fields are not used by this routine, but type is - !! available here so that mesh parameter information (i.e., - !! connectivity) does not have to be recalculated for dYdx. - TYPE(BD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions - !! (Y) with respect to the continuous - !! states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state - !! functions (X) with respect to - !! the continuous states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state - !! functions (Xd) with respect to - !! the continuous states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state - !! functions (Z) with respect to - !! the continuous states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: StateRotation(:,:) !< Matrix by which the states are optionally rotated + pure character(LinChanLen) function BldNd_LinChan(BldNd_OutParam, IdxNode) result(name) + type(OutParmType), intent(in) :: BldNd_OutParam + integer(IntKi), intent(in) :: IdxNode + write(name, '("N",I3.3,A,", ",A)') IdxNode, trim(BldNd_OutParam%Name), trim(BldNd_OutParam%Units) + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine - ! local variables - TYPE(BD_OutputType) :: y_p - TYPE(BD_OutputType) :: y_m - TYPE(BD_ContinuousStateType) :: x_p - TYPE(BD_ContinuousStateType) :: x_m - TYPE(BD_ContinuousStateType) :: x_perturb - INTEGER(IntKi) :: i - REAL(R8Ki) :: RotateStates(3,3) - REAL(R8Ki) :: RotateStatesTranspose(3,3) - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'BD_JacobianPContState' - + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +! ###### The following four routines are Jacobian routines for linearization capabilities ####### +! If the module does not implement them, set ErrStat = ErrID_Fatal in BD_Init() when InitInp%Linearize is .true. +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions +!! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and DZ/du are returned. +SUBROUTINE BD_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) + + type(ModVarsType), INTENT(IN ) :: Vars !< Module variables + REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point + TYPE(BD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) + TYPE(BD_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(BD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point + TYPE(BD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point + TYPE(BD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point + TYPE(BD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point + TYPE(BD_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); + !! Output fields are not used by this routine, but type is + !! available here so that mesh parameter information (i.e., + !! connectivity) does not have to be recalculated for dYdu. + TYPE(BD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with respect to the inputs (u) [intent in to avoid deallocation] - ! Initialize ErrStat + character(*), parameter :: RoutineName = 'BD_JacobianPInput' + integer(intKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + REAL(R8Ki) :: RotateStates(3,3) + logical :: NeedWriteOutput + INTEGER(IntKi) :: i, j, col ErrStat = ErrID_None ErrMsg = '' - IF ( PRESENT( dYdx ) .AND. PRESENT( dXdx )) THEN - call BD_JacobianPContState_noRotate(t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2, dYdx, dXdx) -! call BD_JacobianPContState_noRotate(t, u, p, x, xd, z, OtherState, y, m, LIN_X_CALLED_FIRST, ErrStat2, ErrMsg2, dYdx, dXdx) - ELSEIF ( PRESENT( dYdx ) ) THEN - call BD_JacobianPContState_noRotate(t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2, dYdx=dYdx ) -! call BD_JacobianPContState_noRotate(t, u, p, x, xd, z, OtherState, y, m, LIN_X_CALLED_FIRST, ErrStat2, ErrMsg2, dYdx=dYdx ) - ELSEIF ( PRESENT( dXdx ) ) THEN - call BD_JacobianPContState_noRotate(t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2, dXdx=dXdx) -! call BD_JacobianPContState_noRotate(t, u, p, x, xd, z, OtherState, y, m, LIN_X_CALLED_FIRST, ErrStat2, ErrMsg2, dXdx=dXdx) - END IF - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Get OP values here + call BD_CalcOutput(t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2); if (Failed()) return - if (p%RotStates) then - ! Calculate difference between input root orientation and root reference orientation - RotateStates = matmul( u%RootMotion%Orientation(:,:,1), OtherState%GlbRot ) - RotateStatesTranspose = transpose( RotateStates ) - - if ( present(StateRotation) ) then - if (.not. allocated(StateRotation)) then - call AllocAry(StateRotation, 3, 3, 'StateRotation', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - end if - StateRotation = RotateStates - end if - else - if ( present(StateRotation) ) then - if (allocated(StateRotation)) deallocate(StateRotation) + ! Make a copy of the inputs to perturb + call BD_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call BD_VarsPackInput(Vars, u, m%Jac%u) + + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdu)) then + + ! Allocate dYdu if not allocated + if (.not. allocated(dYdu)) then + call AllocAry(dYdu, m%Jac%Ny, m%Jac%Nu, 'dYdu', ErrStat2, ErrMsg2); if (Failed()) return end if - end if - IF ( PRESENT( dYdx ) ) THEN + ! Determine if write outputs need to be calculated (usually at end of output variables) + NeedWriteOutput = .false. + do i = size(Vars%y), 1, -1 + if (MV_HasFlagsAll(Vars%y(i), VF_WriteOut)) then + NeedWriteOutput = .true. + exit + end if + end do + + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num + + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call BD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call BD_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2, NeedWriteOutput); if (Failed()) return + call BD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call BD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call BD_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2, NeedWriteOutput); if (Failed()) return + call BD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) - if (p%RotStates) then - do i=1,size(dYdx,2),3 - dYdx(:, i:i+2) = matmul( dYdx(:, i:i+2), RotateStatesTranspose ) + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,col)) end do + end do + + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + if (present(dXdu)) then + + ! Allocate dXdu if not allocated + if (.not. allocated(dXdu)) then + call AllocAry(dXdu, m%Jac%Nx, m%Jac%Nu, 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return end if - - END IF + + ! Loop through input variables + do i = 1, size(Vars%u) - IF ( PRESENT( dXdx ) ) THEN + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num - ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 - if (p%RotStates) then - do i=1,size(dXdx,1),3 - dXdx(i:i+2,:) = matmul( RotateStates, dXdx(i:i+2,:) ) - end do - do i=1,size(dXdx,2),3 - dXdx(:, i:i+2) = matmul( dXdx(:, i:i+2), RotateStatesTranspose ) + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call BD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call BD_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call BD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call BD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call BD_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call BD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdu(:,col) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%u(i)%Perturb) end do - end if - - END IF + end do + end if - IF ( PRESENT( dXddx ) ) THEN - if (allocated(dXddx)) deallocate(dXddx) - END IF + !---------------------------------------------------------------------------- - IF ( PRESENT( dZdx ) ) THEN - if (allocated(dZdx)) deallocate(dZdx) - END IF + ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the inputs (u) here: + if (present(dXddu)) then + if (allocated(dXddu)) deallocate(dXddu) + end if - call cleanup() + !---------------------------------------------------------------------------- + + ! Calculate the partial derivative of the constraint state functions (Z) with respect to the inputs (u) here: + if (present(dZdu)) then + if (allocated(dZdu)) deallocate(dZdu) + end if contains - subroutine cleanup() - call BD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call BD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call BD_DestroyContState( x_p, ErrStat2, ErrMsg2 ) - call BD_DestroyContState( x_m, ErrStat2, ErrMsg2 ) - call BD_DestroyContState(x_perturb, ErrStat2, ErrMsg2 ) - end subroutine cleanup - -END SUBROUTINE BD_JacobianPContState + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +END SUBROUTINE BD_JacobianPInput !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions -!! with respect to the continuous states (x). The partial derivatives dY/dx, and dX/dx are returned. -!SUBROUTINE BD_JacobianPContState_noRotate( t, u, p, x, xd, z, OtherState, y, m, calledFrom, ErrStat, ErrMsg, dYdx, dXdx ) -SUBROUTINE BD_JacobianPContState_noRotate( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx ) -!.................................................................................................................................. +!! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. +SUBROUTINE BD_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(BD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(BD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -6319,194 +6496,135 @@ SUBROUTINE BD_JacobianPContState_noRotate( t, u, p, x, xd, z, OtherState, y, m, !! available here so that mesh parameter information (i.e., !! connectivity) does not have to be recalculated for dYdx. TYPE(BD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - !INTEGER(IntKi), INTENT(IN ) :: calledFrom !< flag to help determine logic for when these matrices need to be recalculated INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions - !! (Y) with respect to the continuous - !! states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state - !! functions (X) with respect to - !! the continuous states (x) [intent in to avoid deallocation] - - - ! local variables - TYPE(BD_OutputType) :: y_p - TYPE(BD_OutputType) :: y_m - TYPE(BD_ContinuousStateType) :: x_p - TYPE(BD_ContinuousStateType) :: x_m - TYPE(BD_ContinuousStateType) :: x_perturb - REAL(R8Ki) :: delta ! delta change in input or state - INTEGER(IntKi) :: i, k - INTEGER(IntKi) :: index - INTEGER(IntKi) :: dof - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'BD_JacobianPContState_noRotate' - - - ! Initialize ErrStat + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions (Y) with respect to the continuous states (x) + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state functions (X) with respect to the continuous states (x) + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state functions (Xd) with respect to the continuous states (x) + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state functions (Z) with respect to the continuous states (x) + + CHARACTER(*), PARAMETER :: RoutineName = 'BD_JacobianPContState' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + REAL(R8Ki) :: RotateStates(3,3) + REAL(R8Ki) :: RotateStatesTranspose(3,3) + INTEGER(IntKi) :: i, j, col + logical :: NeedWriteOutput ErrStat = ErrID_None ErrMsg = '' - ! make a copy of the continuous states to perturb - call BD_CopyContState( x, x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + ! Copy state values + call BD_CopyContState(x, m%x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call BD_VarsPackContState(Vars, x, m%Jac%x) - IF ( PRESENT( dYdx ) ) THEN + !---------------------------------------------------------------------------- - ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + if (present(dYdx)) then - ! allocate dYdx if necessary + ! Allocate dYdx if not allocated if (.not. allocated(dYdx)) then - call AllocAry(dYdx, p%Jac_ny, p%Jac_nx*2, 'dYdx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dYdx, m%Jac%Ny, m%Jac%Nx, 'dYdx', ErrStat2, ErrMsg2); if (Failed()) return end if - - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call BD_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call BD_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return + + ! Determine if write outputs need to be calculated (usually at end of output variables) + NeedWriteOutput = .false. + do i = size(Vars%y), 1, -1 + if (MV_HasFlagsAll(Vars%y(i), VF_WriteOut)) then + NeedWriteOutput = .true. + exit end if - - - index = 1 - do k=1,2 - do i=2,p%node_total - do dof=1,p%dof_node - - ! get x_op + delta x - call BD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call perturb_x(p, k, i, dof, 1, x_perturb, delta ) - - ! compute y at x_op + delta x - call BD_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get x_op - delta x - call BD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call perturb_x(p, k, i, dof, -1, x_perturb, delta ) - - ! compute y at x_op - delta x - call BD_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get central difference: - call Compute_dY( p, y_p, y_m, delta, dYdx(:,index) ) - - index = index+1 - end do - end do end do - - - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - call BD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call BD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - - END IF + ! Loop through state variables + do i = 1, size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate column index + col = Vars%x(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call BD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call BD_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2, NeedWriteOutput); if (Failed()) return + call BD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call BD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call BD_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2, NeedWriteOutput); if (Failed()) return + call BD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%x(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdx(:,col)) + end do + end do + end if - IF ( PRESENT( dXdx ) ) THEN + !---------------------------------------------------------------------------- - ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + if (present(dXdx)) then - ! allocate dXdu if necessary + ! Allocate dXdx if not allocated if (.not. allocated(dXdx)) then - call AllocAry(dXdx, p%Jac_nx * 2, p%Jac_nx * 2, 'dXdx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dXdx, m%Jac%Nx, m%Jac%Nx, 'dXdx', ErrStat2, ErrMsg2); if (Failed()) return end if - - index = 1 ! counter into dXdx - do k=1,2 ! 1=positions (x_perturb%q); 2=velocities (x_perturb%dqdt) - do i=2,p%node_total - do dof=1,p%dof_node - - ! get x_op + delta x - call BD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call perturb_x(p, k, i, dof, 1, x_perturb, delta ) - ! compute x at x_op + delta x - call BD_CalcContStateDeriv( t, u, p, x_perturb, xd, z, OtherState, m, x_p, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Loop through state variables + do i = 1, size(Vars%x) + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num - ! get x_op - delta x - call BD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call perturb_x(p, k, i, dof, -1, x_perturb, delta ) - - ! compute x at x_op - delta x - call BD_CalcContStateDeriv( t, u, p, x_perturb, xd, z, OtherState, m, x_m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Calculate column index + col = Vars%x(i)%iLoc(1) + j - 1 - - ! get central difference: - - ! we may have had an error allocating memory, so we'll check - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - ! get central difference: - call Compute_dX( p, x_p, x_m, delta, dXdx(:,index) ) - - index = index+1 - end do + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call BD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call BD_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call BD_VarsPackContStateDeriv(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call BD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call BD_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call BD_VarsPackContStateDeriv(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdx(:,col) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%x(i)%Perturb) end do end do - - call BD_DestroyContState( x_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call BD_DestroyContState( x_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - - END IF - + end if + + !---------------------------------------------------------------------------- + + if (present(dXddx)) then + if (allocated(dXddx)) deallocate(dXddx) + end if + + !---------------------------------------------------------------------------- + + if (present(dZdx)) then + if (allocated(dZdx)) deallocate(dZdx) + end if - call cleanup() - contains - subroutine cleanup() - call BD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call BD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call BD_DestroyContState( x_p, ErrStat2, ErrMsg2 ) - call BD_DestroyContState( x_m, ErrStat2, ErrMsg2 ) - call BD_DestroyContState(x_perturb, ErrStat2, ErrMsg2 ) - end subroutine cleanup - -END SUBROUTINE BD_JacobianPContState_noRotate + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +END SUBROUTINE BD_JacobianPContState !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the discrete states (xd). The partial derivatives dY/dxd, dX/dxd, dXd/dxd, and DZ/dxd are returned. -SUBROUTINE BD_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) +SUBROUTINE BD_JacobianPDiscState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) !.................................................................................................................................. - + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(BD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(BD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -6578,9 +6696,9 @@ END SUBROUTINE BD_JacobianPDiscState !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the constraint states (z). The partial derivatives dY/dz, dX/dz, dXd/dz, and DZ/dz are returned. -SUBROUTINE BD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) -!.................................................................................................................................. +SUBROUTINE BD_JacobianPConstrState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(BD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(BD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -6631,208 +6749,9 @@ SUBROUTINE BD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat IF ( PRESENT(dZdz) ) THEN END IF - END SUBROUTINE BD_JacobianPConstrState -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE BD_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op, NeedTrimOP ) - - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(BD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(BD_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(BD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(BD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(BD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(BD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(BD_OutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(BD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - LOGICAL, OPTIONAL, INTENT(IN ) :: NeedTrimOP !< whether a y_op values should contain values for trim solution (3-value representation instead of full orientation matrices, no rotation acc) - - INTEGER(IntKi) :: index, i, dof - INTEGER(IntKi) :: nu - INTEGER(IntKi) :: ny - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'BD_GetOP' - LOGICAL :: FieldMask(FIELDMASK_SIZE) - LOGICAL :: ReturnTrimOP - TYPE(BD_ContinuousStateType) :: dx ! derivative of continuous states at operating point - - - ! Initialize ErrStat - - ErrStat = ErrID_None - ErrMsg = '' - - IF ( PRESENT( u_op ) ) THEN - - nu = size(p%Jac_u_indx,1) + u%RootMotion%NNodes * 6 ! Jac_u_indx has 3 orientation angles, but the OP needs the full 9 elements of the DCM (thus 6 more per node) - - if (.not. allocated(u_op)) then - call AllocAry(u_op, nu, 'u_op', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end if - - - index = 1 - if (.not. p%CompAeroMaps) then - FieldMask = .false. - FieldMask(MASKID_TranslationDisp) = .true. - FieldMask(MASKID_Orientation) = .true. - FieldMask(MASKID_TranslationVel) = .true. - FieldMask(MASKID_RotationVel) = .true. - FieldMask(MASKID_TranslationAcc) = .true. - FieldMask(MASKID_RotationAcc) = .true. - call PackMotionMesh(u%RootMotion, u_op, index, FieldMask=FieldMask) - - call PackLoadMesh(u%PointLoad, u_op, index) - end if - - call PackLoadMesh(u%DistrLoad, u_op, index) - - END IF - - - IF ( PRESENT( y_op ) ) THEN - ! Only the y operating points need to potentially return a smaller array than the "normal" call to this return. In the trim solution, we use a smaller array for y. - if (present(NeedTrimOP)) then - ReturnTrimOP = NeedTrimOP - else - ReturnTrimOP = .false. - end if - - if (.not. allocated(y_op)) then - ny = p%Jac_ny + y%BldMotion%NNodes * 6 ! Jac_ny has 3 orientation angles, but the OP needs the full 9 elements of the DCM (thus 6 more per node) - - call AllocAry(y_op, ny, 'y_op', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end if - - if (ReturnTrimOP) y_op = 0.0_ReKi ! initialize in case we are returning packed orientations and don't fill the entire array - - index = 1 - FieldMask = .false. - FieldMask(MASKID_TranslationDisp) = .true. - FieldMask(MASKID_Orientation) = .true. - FieldMask(MASKID_TranslationVel) = .true. - - if (.not. p%CompAeroMaps) then - - call PackLoadMesh(y%ReactionForce, y_op, index) - - FieldMask(MASKID_RotationVel) = .true. - FieldMask(MASKID_TranslationAcc) = .true. - FieldMask(MASKID_RotationAcc) = .true. - end if - call PackMotionMesh(y%BldMotion, y_op, index, FieldMask=FieldMask, TrimOP=ReturnTrimOP) - - if (.not. p%CompAeroMaps) then - index = index - 1 - do i=1,p%NumOuts + p%BldNd_TotNumOuts - y_op(i+index) = y%WriteOutput(i) - end do - end if - - - END IF - - IF ( PRESENT( x_op ) ) THEN - - if (.not. allocated(x_op)) then - call AllocAry(x_op, p%Jac_nx * 2,'x_op',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - index = 1 - do i=2,p%node_total - do dof=1,p%dof_node - x_op(index) = x%q( dof, i ) - index = index+1 - end do - end do - - do i=2,p%node_total - do dof=1,p%dof_node - x_op(index) = x%dqdt( dof, i ) - index = index+1 - end do - end do - - END IF - - IF ( PRESENT( dx_op ) ) THEN - - if (.not. allocated(dx_op)) then - call AllocAry(dx_op, p%Jac_nx * 2,'dx_op',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - call BD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dx, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call BD_DestroyContState( dx, ErrStat2, ErrMsg2) - return - end if - - index = 1 - do i=2,p%node_total - do dof=1,p%dof_node - dx_op(index) = dx%q( dof, i ) - index = index+1 - end do - end do - - do i=2,p%node_total - do dof=1,p%dof_node - dx_op(index) = dx%dqdt( dof, i ) - index = index+1 - end do - end do - - call BD_DestroyContState( dx, ErrStat2, ErrMsg2) - - END IF - - IF ( PRESENT( xd_op ) ) THEN - - END IF - - IF ( PRESENT( z_op ) ) THEN - ! this is a little weird, but seems to be how BD has implemented the first node in the continuous state array. - - if (.not. allocated(z_op)) then - call AllocAry(z_op, p%dof_node * 2,'z_op',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - index = 1 - do dof=1,p%dof_node - z_op(index) = x%q( dof, 1 ) - index = index+1 - end do - - do dof=1,p%dof_node - z_op(index) = x%dqdt( dof, 1 ) - index = index+1 - end do - - END IF -END SUBROUTINE BD_GetOP !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -6936,6 +6855,7 @@ END SUBROUTINE BD_WriteMassStiffInFirstNodeFrame !> Update the state information to follow the blade rootmotion mesh. !! - move the state information in x from the previous reference frame at time T (u(2)%rootmotion) to the new reference frame at T+dt (u(1)%rootmation) !! - the GlbRot, GlbPos, and Glb_crv values are stored as otherstates and updated +!! - subroutine BD_UpdateGlobalRef(u, p, x, OtherState, ErrStat, ErrMsg) type(BD_InputType), intent(in ) :: u !< Inputs at utimes type(BD_ParameterType), intent(in ) :: p !< Parameters @@ -6951,7 +6871,6 @@ subroutine BD_UpdateGlobalRef(u, p, x, OtherState, ErrStat, ErrMsg) real(R8Ki) :: GlbRot_old(3, 3), GlbRot_new(3, 3), GlbRot_diff(3, 3) real(R8Ki) :: NodeRot_old(3) real(R8Ki) :: GlbPos_old(3), GlbPos_new(3) - real(R8Ki) :: pos(3), rot(3), trans_vel(3), rot_vel(3), uuN0(3) integer(IntKi) :: i, j, temp_id ErrStat = ErrID_None diff --git a/modules/beamdyn/src/BeamDyn_BldNdOuts_IO.f90 b/modules/beamdyn/src/BeamDyn_BldNdOuts_IO.f90 index d976d83777..1f056b2615 100644 --- a/modules/beamdyn/src/BeamDyn_BldNdOuts_IO.f90 +++ b/modules/beamdyn/src/BeamDyn_BldNdOuts_IO.f90 @@ -275,7 +275,9 @@ END SUBROUTINE BldNdOuts_InitOut !---------------------------------------------------------------------------------------------------------------------------------- !> This subroutine populates the headers with the blade node outputs. The iteration cycle is blade:node:channel (channel iterated !! fastest). If this iteration order is changed, it should be changed in the Calc_WriteBldNdOutput routine as well. -SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) +SUBROUTINE Calc_WriteBldNdOutput( u, p, OtherState, m, y, ErrStat, ErrMsg ) + + TYPE(BD_InputType), INTENT(IN ) :: u ! Module inputs TYPE(BD_ParameterType), INTENT(IN ) :: p ! The module parameters TYPE(BD_OtherStateType), INTENT(IN ) :: OtherState ! Other states at time t TYPE(BD_MiscVarType), INTENT(INOUT) :: m ! misc variables @@ -323,7 +325,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) ! Set the root rotation DCM relative to the reference. ! NOTE: the orientations used in this routine are DCM's. These are directly from the mesh. - call LAPACK_GEMM('T', 'N', 1.0_BDKi, m%u2%RootMotion%Orientation(:,:,1), m%u2%RootMotion%RefOrientation(:,:,1), 0.0_BDKi, RootRelOrient, ErrStat2, ErrMsg2 ) + call LAPACK_GEMM('T', 'N', 1.0_BDKi, u%RootMotion%Orientation(:,:,1), u%RootMotion%RefOrientation(:,:,1), 0.0_BDKi, RootRelOrient, ErrStat2, ErrMsg2 ) ! Loop over the channel sets @@ -363,14 +365,14 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) CASE (BldNd_TDxr,BldNd_TDyr,BldNd_TDzr,BldNd_AbsXr,BldNd_AbsYr,BldNd_AbsZr) DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output - d = y%BldMotion%TranslationDisp(:, idx_node) - m%u2%RootMotion%TranslationDisp(:,1) - d_ref = y%BldMotion%Position( :, idx_node) - m%u2%RootMotion%Position( :,1) + d = y%BldMotion%TranslationDisp(:, idx_node) - u%RootMotion%TranslationDisp(:,1) + d_ref = y%BldMotion%Position( :, idx_node) - u%RootMotion%Position( :,1) ! For relative change in location temp_vec2 = d + d_ref - matmul( RootRelOrient, d_ref ) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),temp_vec2) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),temp_vec2) ! For actual location relative to root temp_vec2 = d + d_ref - temp_vec3 = MATMUL(m%u2%RootMotion%Orientation(:,:,1),temp_vec2) + temp_vec3 = MATMUL(u%RootMotion%Orientation(:,:,1),temp_vec2) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_TDxr) y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -410,7 +412,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) call LAPACK_GEMM('N', 'T', 1.0_BDKi, y%BldMotion%RefOrientation(:,:,idx_node), RootRelOrient, 0.0_BDKi, Tmp33b, ErrStat2, ErrMsg2 ) call LAPACK_GEMM('T', 'N', 1.0_BDKi, y%BldMotion%Orientation( :,:,idx_node), Tmp33b, 0.0_BDKi, Tmp33a, ErrStat2, ErrMsg2 ) call BD_CrvExtractCrv(Tmp33a,temp_vec2, ErrStat2, ErrMsg2) ! temp_vec2 = the Wiener-Milenkovic parameters of the node's angular/rotational defelctions - WM_ParamRD = MATMUL(m%u2%RootMotion%Orientation(:,:,1),temp_vec2) ! Rotate the parameters to the correct coordinate system for output + WM_ParamRD = MATMUL(u%RootMotion%Orientation(:,:,1),temp_vec2) ! Rotate the parameters to the correct coordinate system for output y%WriteOutput( IdxOutList ) = WM_ParamRD(compIndx) END DO @@ -500,7 +502,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) END SELECT DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),y%BldMotion%TranslationVel(:,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),y%BldMotion%TranslationVel(:,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO !---------------------------------------- @@ -516,7 +518,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) END SELECT DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),y%BldMotion%RotationVel(:,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),y%BldMotion%RotationVel(:,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx)*R2D ENDDO @@ -568,7 +570,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) END SELECT DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),y%BldMotion%TranslationAcc(:,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),y%BldMotion%TranslationAcc(:,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO !---------------------------------------- @@ -584,7 +586,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) END SELECT DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),y%BldMotion%RotationAcc(:,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),y%BldMotion%RotationAcc(:,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx)*R2D ENDDO @@ -602,7 +604,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) if (p%BldMotionNodeLoc == BD_MESH_FE) THEN DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(y%BldMotion%Orientation(:,:,idx_node), m%u2%PointLoad%Force( :,p%NdIndxInverse(idx_node))) + temp_vec = MATMUL(y%BldMotion%Orientation(:,:,idx_node), u%PointLoad%Force( :,p%NdIndxInverse(idx_node))) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO else ! we need to do a mesh mapping first @@ -631,7 +633,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) if (p%BldMotionNodeLoc == BD_MESH_FE) THEN DO idx_node=1,y%BldMotion%NNodes IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(y%BldMotion%Orientation(:,:,idx_node), m%u2%PointLoad%Moment( :,p%NdIndxInverse(idx_node))) + temp_vec = MATMUL(y%BldMotion%Orientation(:,:,idx_node), u%PointLoad%Moment( :,p%NdIndxInverse(idx_node))) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO else ! we need to do a mesh mapping first @@ -656,13 +658,13 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) if (p%BldMotionNodeLoc == BD_MESH_QP) THEN ! If we are on the quadrature points, the input and output meshes are siblings DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(y%BldMotion%Orientation(:,:,idx_node), m%u2%DistrLoad%Force( :,idx_node)) + temp_vec = MATMUL(y%BldMotion%Orientation(:,:,idx_node), u%DistrLoad%Force( :,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO else DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%u_DistrLoad_at_y%Force( :,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), m%u_DistrLoad_at_y%Force( :,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO end if @@ -680,13 +682,13 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) if (p%BldMotionNodeLoc == BD_MESH_QP) THEN ! If we are on the quadrature points, the input and output meshes are siblings DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(y%BldMotion%Orientation(:,:,idx_node), m%u2%DistrLoad%Moment( :,idx_node)) + temp_vec = MATMUL(y%BldMotion%Orientation(:,:,idx_node), u%DistrLoad%Moment( :,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO else DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%u_DistrLoad_at_y%Moment( :,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), m%u_DistrLoad_at_y%Moment( :,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO end if @@ -705,13 +707,13 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) if (p%BldMotionNodeLoc == BD_MESH_QP) THEN ! If we are on the quadrature points, the input and output meshes are siblings DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%u2%DistrLoad%Force( :,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), u%DistrLoad%Force( :,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO else DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%u_DistrLoad_at_y%Force( :,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), m%u_DistrLoad_at_y%Force( :,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO end if @@ -729,13 +731,13 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) if (p%BldMotionNodeLoc == BD_MESH_QP) THEN ! If we are on the quadrature points, the input and output meshes are siblings DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%u2%DistrLoad%Moment( :,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), u%DistrLoad%Moment( :,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO else DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%u_DistrLoad_at_y%Moment( :,idx_node)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), m%u_DistrLoad_at_y%Moment( :,idx_node)) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO end if @@ -806,13 +808,13 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) if (p%BldMotionNodeLoc == BD_MESH_QP) then DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%BldInternalForceQP(1:3,p%NdIndxInverse(idx_node))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), m%BldInternalForceQP(1:3,p%NdIndxInverse(idx_node))) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO else DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%BldInternalForceFE(1:3,p%NdIndxInverse(idx_node))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), m%BldInternalForceFE(1:3,p%NdIndxInverse(idx_node))) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO end if @@ -832,13 +834,13 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) if (p%BldMotionNodeLoc == BD_MESH_QP) then DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%BldInternalForceQP(4:6,p%NdIndxInverse(idx_node))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), m%BldInternalForceQP(4:6,p%NdIndxInverse(idx_node))) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO else DO idx_node=1,y%BldMotion%NNodes ! Note p%node_total is total number of nodes including all elements IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%BldInternalForceFE(4:6,p%NdIndxInverse(idx_node))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), m%BldInternalForceFE(4:6,p%NdIndxInverse(idx_node))) y%WriteOutput( IdxOutList ) = temp_vec(compIndx) ENDDO end if @@ -980,7 +982,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fb(1:3,idx_node_in_elem,nelem))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fb(1:3,idx_node_in_elem,nelem))) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_FFbxr) ! Gyroscopic force Fc x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -995,7 +997,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fb(4:6,idx_node_in_elem,nelem))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fb(4:6,idx_node_in_elem,nelem))) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_MFbxr) ! Gyroscopic moment Fc about x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -1011,7 +1013,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fc(1:3,idx_node_in_elem,nelem))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fc(1:3,idx_node_in_elem,nelem))) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_FFcxr) ! Gyroscopic force Fc x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -1026,7 +1028,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fc(4:6,idx_node_in_elem,nelem))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fc(4:6,idx_node_in_elem,nelem))) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_MFcxr) ! Gyroscopic moment Fc about x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -1042,7 +1044,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fd(1:3,idx_node_in_elem,nelem))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fd(1:3,idx_node_in_elem,nelem))) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_FFdxr) ! Gyroscopic force Fc x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -1057,7 +1059,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fd(4:6,idx_node_in_elem,nelem))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fd(4:6,idx_node_in_elem,nelem))) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_MFdxr) ! Gyroscopic moment Fc about x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -1073,7 +1075,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fg(1:3,idx_node_in_elem,nelem))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fg(1:3,idx_node_in_elem,nelem))) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_FFgxr) ! Gyroscopic force Fc x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -1088,7 +1090,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), m%qp%Fg(4:6,idx_node_in_elem,nelem)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), m%qp%Fg(4:6,idx_node_in_elem,nelem)) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_MFgxr) ! Gyroscopic moment Fc about x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -1140,7 +1142,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fi(1:3,idx_node_in_elem,nelem))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fi(1:3,idx_node_in_elem,nelem))) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_FFixr) ! Gyroscopic force Fc x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) @@ -1155,7 +1157,7 @@ SUBROUTINE Calc_WriteBldNdOutput( p, OtherState, m, y, ErrStat, ErrMsg ) IdxOutList = p%NumOuts + idx_node + (IdxChan-1)*y%BldMotion%NNodes ! Index to current output nelem = p%OutNd2NdElem(2,idx_node) idx_node_in_elem = p%OutNd2NdElem(1,idx_node) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fi(4:6,idx_node_in_elem,nelem))) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1), MATMUL(OtherState%GlbRot,m%qp%Fi(4:6,idx_node_in_elem,nelem))) SELECT CASE( p%BldNd_OutParam(IdxChan)%Indx ) ! Indx contains the information on what channel should be output CASE (BldNd_MFixr) ! Gyroscopic moment Fc about x, root frame y%WriteOutput( IdxOutList ) = temp_vec(1) diff --git a/modules/beamdyn/src/BeamDyn_IO.f90 b/modules/beamdyn/src/BeamDyn_IO.f90 index 5840b4b160..e0322d6bb1 100644 --- a/modules/beamdyn/src/BeamDyn_IO.f90 +++ b/modules/beamdyn/src/BeamDyn_IO.f90 @@ -438,16 +438,8 @@ MODULE BeamDyn_IO INTEGER(IntKi), PARAMETER :: RootAppliedMzg = 360 - ! Pitch Actuator: - - 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 = 364 + INTEGER(IntKi), PARAMETER :: MaxOutPts = 360 !End of code generated by Matlab script ! =================================================================================================== @@ -774,10 +766,6 @@ SUBROUTINE BD_ReadPrimaryFile(InputFile,InputFileData,OutFileRoot,UnEc,ErrStat,E CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF if (InputFileData%tngt_stf_fd) CALL WrScr( 'Using finite difference to compute tangent stiffness matrix'//NewLine ) - ! ! RelStates - Define states relative to root motion during linearization? (flag) [used only when linearizing] - !CALL ReadVar(UnIn,InputFile,InputFileData%RelStates,"RelStates", "Define states relative to root motion during linearization? (flag) [used only when linearizing]",ErrStat2,ErrMsg2,UnEc) - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - InputFileData%RelStates = .false. ! this doesn't seem to be needed anymore (and I think there is a problem with using it in MBC3) Line = "" CALL ReadVar(UnIn, InputFile, Line, 'tngt_stf_comp','compare tangent stiffness using finite difference flag', ErrStat2, ErrMsg2, UnEc) @@ -925,23 +913,6 @@ SUBROUTINE BD_ReadPrimaryFile(InputFile,InputFileData,OutFileRoot,UnEc,ErrStat,E IF ( PathIsRelative( InputFileData%BldFile ) ) InputFileData%BldFile = TRIM(PriPath)//TRIM(InputFileData%BldFile) - !---------------------- PITCH ACTUATOR PARAMETER ---------------------------------------- - CALL ReadCom(UnIn,InputFile,'Section Header: Pitch Actuator Parameter',ErrStat2,ErrMsg2,UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ReadVar ( UnIn, InputFile, InputFileData%UsePitchAct, 'UsePitchAct', 'Whether a pitch actuator should be used (flag)', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ReadVar ( UnIn, InputFile, InputFileData%PitchJ, 'PitchJ', 'Pitch actuator inertia (kg-m^2)', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ReadVar ( UnIn, InputFile, InputFileData%PitchK, 'PitchK', 'Pitch actuator stiffness (kg-m^2/s^2)', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ReadVar ( UnIn, InputFile, InputFileData%PitchC, 'PitchC', 'Pitch actuator damping (kg-m^2/s)', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - !----------- OUTPUTS ----------------------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Outputs', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -1085,49 +1056,28 @@ SUBROUTINE BD_ReadBladeFile(BldFile,BladeInputFileData,UnEc,ErrStat,ErrMsg) CALL ReadCom(UnIn,BldFile,'unused beam file header line 2',ErrStat2,ErrMsg2,UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! -------------- BLADE PARAMETER----------------------------------------------- - CALL ReadCom(UnIn,BldFile,'beam parameters',ErrStat2,ErrMsg2,UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ReadVar(UnIn,BldFile,BladeInputFileData%station_total,'station_total','Number of blade input stations',ErrStat2,ErrMsg2,UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL AllocAry(BladeInputFileData%stiff0,6,6,BladeInputFileData%station_total,'Cross-sectional 6 by 6 stiffness matrix',ErrStat2,ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocAry(BladeInputFileData%mass0,6,6,BladeInputFileData%station_total,'Cross-sectional 6 by 6 mass matrix',ErrStat2,ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AllocAry(BladeInputFileData%station_eta,BladeInputFileData%station_total,'Station eta array',ErrStat2,ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - !after allocating these arrays, we'll make sure it was successful: - if (ErrStat >= AbortErrLev) then - call cleanup() - return - end if - -!FIXME: any reason not to use a logical for this? - CALL ReadVar(UnIn,BldFile,BladeInputFileData%damp_flag,'damp_flag','Damping flag',ErrStat2,ErrMsg2,UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! -------------- DAMPING PARAMETER----------------------------------------------- - CALL ReadCom(UnIn,BldFile,'damping parameters',ErrStat2,ErrMsg2,UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ReadCom(UnIn,BldFile,'mu1 to mu6',ErrStat2,ErrMsg2,UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ReadCom(UnIn,BldFile,'units',ErrStat2,ErrMsg2,UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ReadAry(UnIn,BldFile,BladeInputFileData%beta,6,'damping coefficient','damping coefficient',ErrStat2,ErrMsg2,UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - if (ErrStat >= AbortErrLev) then - call cleanup() - return - end if - - -! -------------- DISTRIBUTED PROPERTIES-------------------------------------------- - CALL ReadCom(UnIn,BldFile,'Distributed properties',ErrStat2,ErrMsg2,UnEc) + ! Blade Parameters ---------------------------------------------------------- + CALL ReadCom(UnIn, BldFile, 'Blade Parameters', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadVar(UnIn, BldFile, BladeInputFileData%station_total,'station_total','Number of blade input stations', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL AllocAry(BladeInputFileData%stiff0, 6, 6, BladeInputFileData%station_total, 'Cross-sectional 6 by 6 stiffness matrix', ErrStat2, ErrMsg2); if (Failed()) return + CALL AllocAry(BladeInputFileData%mass0, 6, 6, BladeInputFileData%station_total, 'Cross-sectional 6 by 6 mass matrix', ErrStat2, ErrMsg2); if (Failed()) return + CALL AllocAry(BladeInputFileData%station_eta, BladeInputFileData%station_total, 'Station eta array', ErrStat2, ErrMsg2); if (Failed()) return + CALL ReadVar(UnIn, BldFile, BladeInputFileData%damp_flag, 'damp_flag', 'Damping type (switch) {0: None, 1: Stiffness-Proportional, 2: Modal}', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + + ! Stiffness Proportional Damping -------------------------------------------- + CALL ReadCom(UnIn, BldFile, 'Stiffness-Proportional Damping Header', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadCom(UnIn, BldFile, 'Mu Table Header 1', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadCom(UnIn, BldFile, 'Mu Table Header 2', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadAry(UnIn, BldFile, BladeInputFileData%beta, 6, 'beta', 'Mu damping coefficients', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + + ! Modal Damping ------------------------------------------------------------- + CALL ReadCom(UnIn, BldFile, 'Modal Damping Header', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL ReadVar(UnIn, BldFile, BladeInputFileData%n_modes, 'n_modes', 'Number of modal damping coefficients (-)', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + CALL AllocAry(BladeInputFileData%zeta, BladeInputFileData%n_modes, 'Modal damping coefficients (zeta)', ErrStat2, ErrMsg2); if (Failed()) return + CALL ReadAry(UnIn, BldFile, BladeInputFileData%zeta, BladeInputFileData%n_modes, 'zeta', 'Damping coefficients for mode 1 through n_modes', ErrStat2, ErrMsg2, UnEc); if (Failed()) return + + ! Distributed Properties ---------------------------------------------------- + CALL ReadCom(UnIn,BldFile,'Distributed Properties',ErrStat2,ErrMsg2,UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) DO i=1,BladeInputFileData%station_total @@ -1140,7 +1090,7 @@ SUBROUTINE BD_ReadBladeFile(BldFile,BladeInputFileData,UnEc,ErrStat,ErrMsg) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) DO j=1,6 - CALL ReadAry(UnIn,BldFile,temp66(j,:),6,'siffness_matrix','Blade C/S stiffness matrix',ErrStat2,ErrMsg2,UnEc) + CALL ReadAry(UnIn,BldFile,temp66(j,:),6,'stiffness_matrix','Blade C/S stiffness matrix',ErrStat2,ErrMsg2,UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ENDDO if (ErrStat >= AbortErrLev) then @@ -1166,7 +1116,10 @@ SUBROUTINE BD_ReadBladeFile(BldFile,BladeInputFileData,UnEc,ErrStat,ErrMsg) return contains - !..................... + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function subroutine cleanup() close(UnIn) return @@ -1208,7 +1161,7 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(364) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(360) = (/ & ! 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 ", & @@ -1273,16 +1226,15 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) "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(:) + "N9TDZR ","N9TVXG ","N9TVYG ","N9TVZG ","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(360) = (/ & ! 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 , & @@ -1347,16 +1299,15 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) 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 + N9TDzr , N9TVXg , N9TVYg , N9TVZg , 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(360) = (/ character(ChanLen) :: & ! 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) ", & @@ -1421,15 +1372,14 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) "(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) ", & + "(m) ","(m/s) ","(m/s) ","(m/s) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ", & "(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) "/) + "(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, & @@ -1459,13 +1409,6 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) InvalidOutput( NDMl(i,:) ) = .true. END DO - - IF (.not. p%UsePitchAct) THEN - InvalidOutput( PAngInp ) = .true. - InvalidOutput( PAngAct ) = .true. - InvalidOutput( PRatAct ) = .true. - InvalidOutput( PAccAct ) = .true. - END IF if (p%BldMotionNodeLoc /= BD_MESH_FE) then DO I = 1,9 @@ -1643,10 +1586,6 @@ SUBROUTINE BD_ValidateInputData( InitInp, InputFileData, ErrStat, ErrMsg ) IF (InputFileData%stop_tol < EPSILON(InputFileData%stop_tol) ) & CALL SetErrStat ( ErrID_Fatal, 'Tolerance for stopping (stop_tol) must be larger than machine precision ('//trim(num2lstr(EPSILON(InputFileData%stop_tol)))//').', ErrStat, ErrMsg, RoutineName ) - if (InputFileData%UsePitchAct) then - if ( EqualRealNos(InputFileData%pitchJ, 0.0_BDKi) ) call SetErrStat(ErrID_Fatal,'Pitch actuator inertia must not be 0.',ErrStat,ErrMsg,RoutineName) - end if - !bjj: should check that there aren't any overlapping trapezoidal quadrature points (is this done in the input file section??) ! Check that the values for the damping are similar. @@ -1714,17 +1653,14 @@ SUBROUTINE BD_ValidateInputData( InitInp, InputFileData, ErrStat, ErrMsg ) if (.NOT. InitInp%DynamicSolve) THEN call SetErrStat( ErrID_Fatal, 'Static analysis cannot be used for BeamDyn linearization. Set DynamicSolve to TRUE.', ErrStat, ErrMsg, RoutineName ) end if - - if (InputFileData%UsePitchAct) then - call SetErrStat( ErrID_Fatal, 'Pitch actuator model cannot currently be used for linearization in BeamDyn. Set UsePitchAct=False.', ErrStat, ErrMsg, RoutineName ) - end if end if END SUBROUTINE BD_ValidateInputData !---------------------------------------------------------------------------------------------------------------------------------- !> this routine fills the AllOuts array, which is used to send data to the glue code to be written to an output file. -SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput ) +SUBROUTINE Calc_WriteOutput( u, p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput ) + TYPE(BD_InputType), INTENT(IN ) :: u !< Module inputs TYPE(BD_ParameterType), INTENT(IN ) :: p !< The module parameters REAL(ReKi), INTENT(INOUT) :: AllOuts(0:) !< array of values to potentially write to file TYPE(BD_OutputType), INTENT(IN ) :: y !< outputs @@ -1757,14 +1693,14 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput !------------------------- ! Reaction forces - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),y%ReactionForce%Force(:,1)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),y%ReactionForce%Force(:,1)) AllOuts( RootFxr ) = temp_vec(1) AllOuts( RootFyr ) = temp_vec(2) AllOuts( RootFzr ) = temp_vec(3) !------------------------- ! Reaction moments (these are being computed for ServoDyn output, as well as for WriteOutput) - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),y%ReactionForce%Moment(:,1)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),y%ReactionForce%Moment(:,1)) AllOuts( RootMxr ) = temp_vec(1) AllOuts( RootMyr ) = temp_vec(2) AllOuts( RootMzr ) = temp_vec(3) @@ -1777,15 +1713,15 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput ! compute the root relative orientation, RootRelOrient, which is used in several calculations below - ! RootRelOrient = matmul( transpose(m%u2%RootMotion%Orientation(:,:,1)), m%u2%RootMotion%RefOrientation(:,:,1)) - call LAPACK_GEMM('T', 'N', 1.0_BDKi, m%u2%RootMotion%Orientation(:,:,1), m%u2%RootMotion%RefOrientation(:,:,1), 0.0_BDKi, RootRelOrient, ErrStat2, ErrMsg2 ) + ! RootRelOrient = matmul( transpose(u%RootMotion%Orientation(:,:,1)), u%RootMotion%RefOrientation(:,:,1)) + call LAPACK_GEMM('T', 'N', 1.0_BDKi, u%RootMotion%Orientation(:,:,1), u%RootMotion%RefOrientation(:,:,1), 0.0_BDKi, RootRelOrient, ErrStat2, ErrMsg2 ) !------------------------------------ ! Tip translational deflection (relative to the undeflected position) expressed in r - d = y%BldMotion%TranslationDisp(:, y%BldMotion%NNodes) - m%u2%RootMotion%TranslationDisp(:,1) - d_ref = y%BldMotion%Position( :, y%BldMotion%NNodes) - m%u2%RootMotion%Position( :,1) + d = y%BldMotion%TranslationDisp(:, y%BldMotion%NNodes) - u%RootMotion%TranslationDisp(:,1) + d_ref = y%BldMotion%Position( :, y%BldMotion%NNodes) - u%RootMotion%Position( :,1) temp_vec2 = d + d_ref - matmul( RootRelOrient, d_ref ) ! tip displacement - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),temp_vec2) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),temp_vec2) AllOuts( TipTDxr ) = temp_vec(1) AllOuts( TipTDyr ) = temp_vec(2) @@ -1798,7 +1734,7 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput call BD_CrvExtractCrv(temp33,temp_vec2, ErrStat2, ErrMsg2) ! temp_vec2 = the Wiener-Milenkovic parameters of the tip angular/rotational defelctions CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),temp_vec2) ! translate these parameters to the correct system for output + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),temp_vec2) ! translate these parameters to the correct system for output AllOuts( TipRDxr ) = temp_vec(1) AllOuts( TipRDyr ) = temp_vec(2) @@ -1868,10 +1804,10 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput !------------------------------------ ! Sectional translational deflection (relative to the undeflected position) expressed in r - d = y%BldMotion%TranslationDisp(:, j_BldMotion) - m%u2%RootMotion%TranslationDisp(:,1) - d_ref = y%BldMotion%Position( :, j_BldMotion) - m%u2%RootMotion%Position( :,1) + d = y%BldMotion%TranslationDisp(:, j_BldMotion) - u%RootMotion%TranslationDisp(:,1) + d_ref = y%BldMotion%Position( :, j_BldMotion) - u%RootMotion%Position( :,1) temp_vec2 = d + d_ref - MATMUL( RootRelOrient, d_ref ) ! tip displacement - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),temp_vec2) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),temp_vec2) AllOuts( NTDr( beta,1 ) ) = temp_vec(1) AllOuts( NTDr( beta,2 ) ) = temp_vec(2) @@ -1884,7 +1820,7 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput call BD_CrvExtractCrv(temp33,temp_vec2, ErrStat2, ErrMsg2) ! temp_vec2 = the Wiener-Milenkovic parameters of the node's angular/rotational defelctions CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),temp_vec2) ! translate these parameters to the correct system for output + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),temp_vec2) ! translate these parameters to the correct system for output AllOuts( NRDr( beta,1 ) ) = temp_vec(1) AllOuts( NRDr( beta,2 ) ) = temp_vec(2) @@ -1922,14 +1858,14 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput !! with the nodes meaning something different) or we need to map the u2%PointLoad like we do for the m%u2%DistrLoad%Force loads. !------------------------- ! Applied point forces at Node 1 expressed in l, given in N - temp_vec = MATMUL(y%BldMotion%Orientation(1:3,1:3,j_BldMotion),m%u2%PointLoad%Force(:,j)) + temp_vec = MATMUL(y%BldMotion%Orientation(1:3,1:3,j_BldMotion),u%PointLoad%Force(:,j)) AllOuts( NPFl( beta,1 ) ) = temp_vec(1) AllOuts( NPFl( beta,2 ) ) = temp_vec(2) AllOuts( NPFl( beta,3 ) ) = temp_vec(3) !------------------------- ! Applied point moments at Node 1 expressed in l, given in N-m - temp_vec = MATMUL(y%BldMotion%Orientation(1:3,1:3,j_BldMotion),m%u2%PointLoad%Moment(:,j)) + temp_vec = MATMUL(y%BldMotion%Orientation(1:3,1:3,j_BldMotion),u%PointLoad%Moment(:,j)) AllOuts( NPMl( beta,1 ) ) = temp_vec(1) AllOuts( NPMl( beta,2 ) ) = temp_vec(2) AllOuts( NPMl( beta,3 ) ) = temp_vec(3) @@ -1950,14 +1886,14 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput !------------------------- ! Applied distributed forces at Node 1 expressed in l, in N/m - temp_vec = MATMUL(y%BldMotion%Orientation(:,:,j_BldMotion), m%u2%DistrLoad%Force( :,j_BldMotion)) + temp_vec = MATMUL(y%BldMotion%Orientation(:,:,j_BldMotion), u%DistrLoad%Force( :,j_BldMotion)) AllOuts( NDFl( beta,1 ) ) = temp_vec(1) AllOuts( NDFl( beta,2 ) ) = temp_vec(2) AllOuts( NDFl( beta,3 ) ) = temp_vec(3) !------------------------- ! Applied distributed moments at Node 1 expressed in l, in N-m/m - temp_vec = MATMUL(y%BldMotion%Orientation(:,:,j_BldMotion), m%u2%DistrLoad%Moment(:,j_BldMotion)) + temp_vec = MATMUL(y%BldMotion%Orientation(:,:,j_BldMotion), u%DistrLoad%Moment(:,j_BldMotion)) AllOuts( NDMl( beta,1 ) ) = temp_vec(1) AllOuts( NDMl( beta,2 ) ) = temp_vec(2) AllOuts( NDMl( beta,3 ) ) = temp_vec(3) @@ -1973,7 +1909,7 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! transfer the input loads to the output nodes for writing output - CALL Transfer_Line2_to_Line2( m%u2%DistrLoad, m%u_DistrLoad_at_y, m%Map_u_DistrLoad_to_y, ErrStat2, ErrMsg2, m%y_BldMotion_at_u, y%BldMotion) + CALL Transfer_Line2_to_Line2( u%DistrLoad, m%u_DistrLoad_at_y, m%Map_u_DistrLoad_to_y, ErrStat2, ErrMsg2, m%y_BldMotion_at_u, y%BldMotion) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -2016,7 +1952,7 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput 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 Transfer_Line2_to_Point( u%DistrLoad, m%LoadsAtRoot, m%Map_u_DistrLoad_to_R, ErrStat2, ErrMsg2, y%BldMotion, u%RootMotion ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! Global coords @@ -2028,11 +1964,11 @@ SUBROUTINE Calc_WriteOutput( p, AllOuts, y, m, ErrStat, ErrMsg, CalcWriteOutput AllOuts( RootAppliedMzg ) = RM(3,1) ! Root coords - temp_vec = MATMUL(m%u2%RootMotion%Orientation(:,:,1),RF(:,1)) + temp_vec = MATMUL(u%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)) + temp_vec = MATMUL(u%RootMotion%Orientation(:,:,1),RM(:,1)) AllOuts( RootAppliedMxr ) = temp_vec(1) AllOuts( RootAppliedMyr ) = temp_vec(2) AllOuts( RootAppliedMzr ) = temp_vec(3) @@ -2181,613 +2117,6 @@ SUBROUTINE BD_PrintSum( p, x, OtherState, m, InitInp, ErrStat, ErrMsg ) RETURN END SUBROUTINE BD_PrintSum -!---------------------------------------------------------------------------------------------------------------------------------- - -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. -!! Do not change the order of this packing without changing subroutine ! -SUBROUTINE Init_Jacobian( p, u, y, m, InitOut, ErrStat, ErrMsg) - - TYPE(BD_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(BD_InputType) , INTENT(IN ) :: u !< inputs - TYPE(BD_OutputType) , INTENT(IN ) :: y !< outputs - TYPE(BD_MiscVarType) , INTENT(INOUT) :: m !< misc var data - TYPE(BD_InitOutputType) , INTENT(INOUT) :: InitOut !< Initialization output data (for Jacobian row/column names) - - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Init_Jacobian' - - ! local variables: - INTEGER(IntKi) :: i, j, index, nu, i_meshField - REAL(R8Ki) :: perturb, perturb_b - REAL(R8Ki) :: MaxThrust, MaxTorque - CHARACTER(1), PARAMETER :: UVW(3) = (/'U','V','W'/) - - - - ErrStat = ErrID_None - ErrMsg = "" - - call Init_Jacobian_y( p, y, InitOut, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - call Init_Jacobian_x_z( p, InitOut, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - ! determine how many inputs there are in the Jacobians - if (p%CompAeroMaps) then - nu = u%DistrLoad%NNodes * 6 ! 3 forces + 3 moments at each node - else - nu = u%RootMotion%NNodes * 18 & ! 3 Translation Displacements + 3 orientations + 6 velocities (rotation+translation) + 6 accelerations at each node - + u%PointLoad%NNodes * 6 & ! 3 forces + 3 moments at each node - + u%DistrLoad%NNodes * 6 ! 3 forces + 3 moments at each node - end if - - ! all other inputs (e.g., hub motion) ignored - - !............................ - ! fill matrix to store index to help us figure out what the ith value of the u vector really means - ! (see beamdyn::perturb_u ... these MUST match ) - ! column 1 indicates module's mesh and field - ! column 2 indicates the first index (x-y-z component) of the field - ! column 3 is the node - !............................ - - call allocAry( p%Jac_u_indx, nu, 3, 'p%Jac_u_indx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - !............... - ! BD input mappings stored in p%Jac_u_indx: - !............... - index = 1 - !Module/Mesh/Field: u%RootMotion%TranslationDisp = 1; - !Module/Mesh/Field: u%RootMotion%Orientation = 2; - !Module/Mesh/Field: u%RootMotion%TranslationVel = 3; - !Module/Mesh/Field: u%RootMotion%RotationVel = 4; - !Module/Mesh/Field: u%RootMotion%TranslationAcc = 5; - !Module/Mesh/Field: u%RootMotion%RotationAcc = 6; - if (.not. p%CompAeroMaps) then - do i_meshField = 1,6 - do i=1,u%RootMotion%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField - p%Jac_u_indx(index,2) = j !component index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - end do - - !Module/Mesh/Field: u%PointLoad%Force = 7; - !Module/Mesh/Field: u%PointLoad%Moment = 8; - do i_meshField = 7,8 - do i=1,u%PointLoad%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField - p%Jac_u_indx(index,2) = j !component index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - end do - end if - - !Module/Mesh/Field: u%DistrLoad%Force = 9; - !Module/Mesh/Field: u%DistrLoad%Moment = 10; - do i_meshField = 9,10 - do i=1,u%DistrLoad%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField - p%Jac_u_indx(index,2) = j !component index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - end do !i_meshField - - - - !...................................... - ! default perturbations, p%du: - !...................................... - call allocAry( p%du, 10, 'p%du', ErrStat2, ErrMsg2) ! 10 = number of unique values in p%Jac_u_indx(:,1) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - perturb = 0.2_R8Ki*D2R_D - perturb_b = 0.2_R8Ki*D2R_D * p%blade_length - - MaxThrust = 170.0_R8Ki*p%blade_length**2 - MaxTorque = 14.0_R8Ki*p%blade_length**3 - - p%du( 1) = perturb_b ! u%RootMotion%TranslationDisp = 1; - p%du( 2) = perturb ! u%RootMotion%Orientation = 2; - p%du( 3) = perturb_b ! u%RootMotion%TranslationVel = 3; - p%du( 4) = perturb ! u%RootMotion%RotationVel = 4; - p%du( 5) = perturb_b ! u%RootMotion%TranslationAcc = 5; - p%du( 6) = perturb ! u%RootMotion%RotationAcc = 6; - - p%du( 7) = MaxThrust / (100.0_R8Ki * 3.0_R8Ki * u%PointLoad%NNodes ) ! u%PointLoad%Force = 7; - p%du( 8) = MaxTorque / (100.0_R8Ki * 3.0_R8Ki * u%PointLoad%NNodes ) ! u%PointLoad%Moment = 8; - - p%du( 9) = MaxThrust / (100.0_R8Ki * 3.0_R8Ki * u%DistrLoad%NNodes ) ! u%DistrLoad%Force = 9; - p%du(10) = MaxTorque / (100.0_R8Ki * 3.0_R8Ki * u%DistrLoad%NNodes ) ! u%DistrLoad%Moment =10; - - !..................... - ! get names of linearized inputs - !..................... - call AllocAry(InitOut%LinNames_u, nu, 'LinNames_u', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry(InitOut%RotFrame_u, nu, 'RotFrame_u', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry(InitOut%IsLoad_u, nu, 'IsLoad_u', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - InitOut%RotFrame_u = .false. ! every input is on a mesh, which stores values in the global (not rotating) frame - - index = 1 - InitOut%IsLoad_u = .true. ! initialize all inputs as loads, and overwrite for the RootMotion mesh, below: - if (.not. p%CompAeroMaps) then - call PackMotionMesh_Names(u%RootMotion, 'RootMotion', InitOut%LinNames_u, index) ! all 6 motion fields - InitOut%IsLoad_u(1:index-1) = .false. ! the RootMotion inputs are not loads - call PackLoadMesh_Names( u%PointLoad, 'PointLoad', InitOut%LinNames_u, index) - end if - call PackLoadMesh_Names( u%DistrLoad, 'DistrLoad', InitOut%LinNames_u, index) - - -END SUBROUTINE Init_Jacobian -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the Jacobian parameters and initialization outputs for the linearized outputs. -SUBROUTINE Init_Jacobian_y( p, y, InitOut, ErrStat, ErrMsg) - - TYPE(BD_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(BD_OutputType) , INTENT(IN ) :: y !< outputs - TYPE(BD_InitOutputType) , INTENT(INOUT) :: InitOut !< Initialization output data (for Jacobian row/column names) - - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables: - INTEGER(IntKi) :: i - INTEGER(IntKi) :: j - INTEGER(IntKi) :: index_next - LOGICAL :: AllOut(MaxOutPts) - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Init_Jacobian_y' - - CHARACTER(ChanLen) :: ChannelName - LOGICAL :: isRotating - LOGICAL :: BladeMask(FIELDMASK_SIZE) ! flags to determine if this field is part of the packing - - ErrStat = ErrID_None - ErrMsg = "" - - if (p%CompAeroMaps) then - p%Jac_ny = y%BldMotion%NNodes * 12 ! 6 displacements (translation, rotation) + 6 velocities - else - - ! determine how many outputs there are in the Jacobians - p%Jac_ny = y%ReactionForce%NNodes * 6 & ! 3 forces + 3 moments at each node - + y%BldMotion%NNodes * 18 & ! 6 displacements (translation, rotation) + 6 velocities + 6 accelerations at each node - + p%NumOuts + p%BldNd_TotNumOuts ! WriteOutput values - end if - - ! get the names of the linearized outputs: - call AllocAry(InitOut%LinNames_y, p%Jac_ny,'LinNames_y',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry(InitOut%RotFrame_y, p%Jac_ny,'RotFrame_y',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) return - - - InitOut%RotFrame_y = .false. ! need to set all the values in the global system to .false - - index_next = 1 - if (p%CompAeroMaps) then - BladeMask = .true. ! default is all the fields - BladeMask(MASKID_TRANSLATIONACC) = .false. - BladeMask(MASKID_ROTATIONACC) = .false. - - call PackMotionMesh_Names(y%BldMotion, 'Blade motion', InitOut%LinNames_y, index_next, FieldMask=BladeMask) - else - call PackLoadMesh_Names( y%ReactionForce, 'Reaction force', InitOut%LinNames_y, index_next) - call PackMotionMesh_Names(y%BldMotion, 'Blade motion', InitOut%LinNames_y, index_next) - - do i=1,p%NumOuts + p%BldNd_TotNumOuts - InitOut%LinNames_y(i+index_next-1) = trim(InitOut%WriteOutputHdr(i))//', '//trim(InitOut%WriteOutputUnt(i)) - end do - - AllOut = .true. ! all output values except those specifically in the global system are in the rotating system - AllOut(TipTVXg) = .false. - AllOut(TipTVYg) = .false. - AllOut(TipTVZg) = .false. - AllOut(TipRVXg) = .false. - AllOut(TipRVYg) = .false. - AllOut(TipRVZg) = .false. - - do j=1,9 - do i=1,3 !x,y,z - AllOut(NTVg(j,i)) = .false. - AllOut(NRVg(j,i)) = .false. - end do - end do - - do i=1,p%NumOuts - if (p%OutParam(i)%Indx == 0 ) then - InitOut%RotFrame_y(i+index_next-1) = .false. - else - InitOut%RotFrame_y(i+index_next-1) = AllOut( p%OutParam(i)%Indx ) - end if - end do - - - ! set outputs for all nodes out: - index_next = index_next + p%NumOuts - DO i=1,p%BldNd_NumOuts - ChannelName = p%BldNd_OutParam(i)%Name - call Conv2UC(ChannelName) - if ( ChannelName( LEN_TRIM(ChannelName):LEN_TRIM(ChannelName) ) == 'G') then ! channel is in global coordinate system - isRotating = .false. - else - isRotating = .true. - end if - InitOut%RotFrame_y(index_next : index_next+size(p%BldNd_BlOutNd)-1 ) = isRotating - index_next = index_next + size(p%BldNd_BlOutNd) - ENDDO - end if - - -END SUBROUTINE Init_Jacobian_y -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the Jacobian parameters and initialization outputs for the linearized continuous states. -SUBROUTINE Init_Jacobian_x_z( p, InitOut, ErrStat, ErrMsg) - - TYPE(BD_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(BD_InitOutputType) , INTENT(INOUT) :: InitOut !< Output for initialization routine - - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Init_Jacobian_x' - CHARACTER(200) :: Describe - - ! local variables: - INTEGER(IntKi) :: i - INTEGER(IntKi) :: indx - - ErrStat = ErrID_None - ErrMsg = "" - - p%Jac_nx = p%dof_node * (p%node_total-1) ! the first node is actually a constraint state - - ! allocate space for the row/column names and for perturbation sizes - !call allocAry(p%dx, p%dof_node*(p%node_total-1), 'p%dx', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry(InitOut%LinNames_x, p%Jac_nx*2, 'LinNames_x', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry(InitOut%RotFrame_x, p%Jac_nx*2, 'RotFrame_x', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry(InitOut%DerivOrder_x, p%Jac_nx*2, 'DerivOrder_x', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - !CALL AllocAry(InitOut%LinNames_z, p%dof_node*2, 'LinNames_z', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - !CALL AllocAry(InitOut%RotFrame_z, p%dof_node*2, 'RotFrame_z', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - - !...................................... - ! default perturbations, p%dx: - !...................................... - p%dx(1:3) = 0.2_BDKi*D2R_D * p%blade_length ! deflection states in m and m/s - p%dx(4:6) = 0.2_BDKi*D2R_D ! deflection states in rad and rad/s - - InitOut%RotFrame_x = p%RotStates - InitOut%DerivOrder_x = 2 - - !...................................... - ! set linearization output names: - !...................................... - indx = 1 - DO i=2, p%node_total - Describe = 'finite element node '//trim(num2lstr(i))//' (number of elements = '//trim(num2lstr(p%elem_total))//'; element order = '//trim(num2lstr(p%nodes_per_elem-1))//')' - InitOut%LinNames_x(indx) = trim(Describe)//' translational displacement in X, m' - indx = indx + 1 - InitOut%LinNames_x(indx) = trim(Describe)//' translational displacement in Y, m' - indx = indx + 1 - InitOut%LinNames_x(indx) = trim(Describe)//' translational displacement in Z, m' - indx = indx + 1 - InitOut%LinNames_x(indx) = trim(Describe)//' rotational displacement in X, rad' - indx = indx + 1 - InitOut%LinNames_x(indx) = trim(Describe)//' rotational displacement in Y, rad' - indx = indx + 1 - InitOut%LinNames_x(indx) = trim(Describe)//' rotational displacement in Z, rad' - indx = indx + 1 - END DO - - do i=1,p%Jac_nx - InitOut%LinNames_x(i+p%Jac_nx) = 'First time derivative of '//trim(InitOut%LinNames_x(i))//'/s' - InitOut%RotFrame_x(i+p%Jac_nx) = InitOut%RotFrame_x(i) - end do - - - !InitOut%RotFrame_z = .true. - !InitOut%LinNames_z(1) = 'Node 1 translational displacement in X, m' - !InitOut%LinNames_z(2) = 'Node 1 translational displacement in Y, m' - !InitOut%LinNames_z(3) = 'Node 1 translational displacement in Z, m' - !InitOut%LinNames_z(4) = 'Node 1 rotational displacement in X, -' - !InitOut%LinNames_z(5) = 'Node 1 rotational displacement in Y, -' - !InitOut%LinNames_z(6) = 'Node 1 rotational displacement in Z, -' - ! - !do i=1,6 - ! InitOut%LinNames_x(i+6) = 'First time derivative of '//trim(InitOut%LinNames_z(i))//'/s' - !end do - - -END SUBROUTINE Init_Jacobian_x_z -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine beamdyn::init_jacobian is consistant with this routine! -SUBROUTINE Perturb_u( p, n, perturb_sign, u, du ) - - TYPE(BD_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(BD_InputType) , INTENT(INOUT) :: u !< perturbed BD inputs - REAL( R8Ki ) , INTENT( OUT) :: du !< amount that specific input was perturbed - - - ! local variables - INTEGER :: fieldIndx - INTEGER :: node - - fieldIndx = p%Jac_u_indx(n,2) - node = p%Jac_u_indx(n,3) - - du = p%du( p%Jac_u_indx(n,1) ) - - ! determine which mesh we're trying to perturb and perturb the input: - SELECT CASE( p%Jac_u_indx(n,1) ) - - CASE ( 1) !Module/Mesh/Field: u%RootMotion%TranslationDisp = 1; - u%RootMotion%TranslationDisp( fieldIndx,node) = u%RootMotion%TranslationDisp( fieldIndx,node) + du * perturb_sign - CASE ( 2) !Module/Mesh/Field: u%RootMotion%Orientation = 2; - CALL PerturbOrientationMatrix( u%RootMotion%Orientation(:,:,node), du * perturb_sign, fieldIndx ) ! NOTE: call not using DCM_logmap - CASE ( 3) !Module/Mesh/Field: u%RootMotion%TranslationVel = 3; - u%RootMotion%TranslationVel( fieldIndx,node) = u%RootMotion%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE ( 4) !Module/Mesh/Field: u%RootMotion%RotationVel = 4; - u%RootMotion%RotationVel(fieldIndx,node) = u%RootMotion%RotationVel(fieldIndx,node) + du * perturb_sign - CASE ( 5) !Module/Mesh/Field: u%RootMotion%TranslationAcc = 5; - u%RootMotion%TranslationAcc( fieldIndx,node) = u%RootMotion%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE ( 6) !Module/Mesh/Field: u%RootMotion%RotationAcc = 6; - u%RootMotion%RotationAcc(fieldIndx,node) = u%RootMotion%RotationAcc(fieldIndx,node) + du * perturb_sign - - CASE ( 7) !Module/Mesh/Field: u%PointLoad%Force = 7; - u%PointLoad%Force(fieldIndx,node) = u%PointLoad%Force(fieldIndx,node) + du * perturb_sign - CASE ( 8) !Module/Mesh/Field: u%PointLoad%Moment = 8; - u%PointLoad%Moment(fieldIndx,node) = u%PointLoad%Moment(fieldIndx,node) + du * perturb_sign - - CASE ( 9) !Module/Mesh/Field: u%DistrLoad%Force = 9; - u%DistrLoad%Force( fieldIndx,node) = u%DistrLoad%Force( fieldIndx,node) + du * perturb_sign - CASE (10) !Module/Mesh/Field: u%DistrLoad%Moment = 10; - u%DistrLoad%Moment(fieldIndx,node) = u%DistrLoad%Moment(fieldIndx,node) + du * perturb_sign - - END SELECT - -END SUBROUTINE Perturb_u -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine beamdyn::init_jacobian is consistant with this routine! -SUBROUTINE Compute_dY(p, y_p, y_m, delta, dY) - - TYPE(BD_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(BD_OutputType) , INTENT(IN ) :: y_p !< BD outputs at \f$ u + \Delta_p u \f$ or \f$ z + \Delta_p z \f$ (p=plus) - TYPE(BD_OutputType) , INTENT(IN ) :: y_m !< BD outputs at \f$ u - \Delta_m u \f$ or \f$ z - \Delta_m z \f$ (m=minus) - REAL(R8Ki) , INTENT(IN ) :: delta !< difference in inputs or states \f$ delta_p = \Delta_p u \f$ or \f$ delta_p = \Delta_p x \f$ - REAL(R8Ki) , INTENT(INOUT) :: dY(:) !< column of dYdu or dYdx: \f$ \frac{\partial Y}{\partial u_i} = \frac{y_p - y_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial Y}{\partial z_i} = \frac{y_p - y_m}{2 \, \Delta x}\f$ - - ! local variables: - INTEGER(IntKi) :: i ! loop over outputs - INTEGER(IntKi) :: indx_first ! index indicating next value of dY to be filled - LOGICAL :: Mask(FIELDMASK_SIZE) ! flags to determine if this field is part of the packing - - indx_first = 1 - if (p%CompAeroMaps) then - Mask = .true. - Mask(MASKID_TRANSLATIONACC) = .false. - Mask(MASKID_ROTATIONACC) = .false. - call PackMotionMesh_dY(y_p%BldMotion, y_m%BldMotion, dY, indx_first, FieldMask=Mask) ! 4 motion fields - else - call PackLoadMesh_dY( y_p%ReactionForce, y_m%ReactionForce, dY, indx_first) - call PackMotionMesh_dY(y_p%BldMotion, y_m%BldMotion, dY, indx_first) ! all 6 motion fields - - do i=1,p%NumOuts + p%BldNd_TotNumOuts - dY(i+indx_first-1) = y_p%WriteOutput(i) - y_m%WriteOutput(i) - end do - end if - - - dY = dY / (2.0_R8Ki*delta) - -END SUBROUTINE Compute_dY -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the x array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine beamdyn::init_jacobian is consistant with this routine! -SUBROUTINE Perturb_x( p, fieldIndx, node, dof, perturb_sign, x, dx ) - - TYPE(BD_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: fieldIndx !< field in the state type: 1=displacements; 2=velocities - INTEGER( IntKi ) , INTENT(IN ) :: node !< node number - INTEGER( IntKi ) , INTENT(IN ) :: dof !< dof for this perturbation - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(BD_ContinuousStateType) , INTENT(INOUT) :: x !< perturbed BD states - REAL( R8Ki ) , INTENT( OUT) :: dx !< amount that specific state was perturbed - - - ! local variables - integer(intKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - - REAL(R8Ki) :: orientation(3,3) - REAL(R8Ki) :: rotation(3,3) - REAL(R8Ki) :: CrvPerturb(3), CrvBase(3) - - dx = p%dx(dof) - - if (fieldIndx==1) then - if (dof < 4) then ! translational displacement - x%q( dof, node ) = x%q( dof, node ) + dx * perturb_sign - else ! w-m parameters - - ! Calculate perturbation in WM parameters - CrvPerturb = 0.0_R8Ki - CrvPerturb(dof-3) = 4.0_R8Ki * tan(dx * perturb_sign / 4.0_R8Ki) - - ! Get base rotation in WM parameters - CrvBase = x%q(4:6, node) - - ! Compose pertubation and base rotation and store in state - call BD_CrvCompose(x%q(4:6, node), CrvPerturb, CrvBase, FLAG_R1R2) - end if - else - x%dqdt( dof, node ) = x%dqdt( dof, node ) + dx * perturb_sign - end if - - -END SUBROUTINE Perturb_x -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine beamdyn::init_jacobian is consistant with this routine! -SUBROUTINE Compute_dX(p, x_p, x_m, delta, dX) - - TYPE(BD_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(BD_ContinuousStateType) , INTENT(IN ) :: x_p !< BD continuous states at \f$ u + \Delta_p u \f$ or \f$ x + \Delta_p x \f$ (p=plus) - TYPE(BD_ContinuousStateType) , INTENT(IN ) :: x_m !< BD continuous states at \f$ u - \Delta_m u \f$ or \f$ x - \Delta_m x \f$ (m=minus) - REAL(R8Ki) , INTENT(IN ) :: delta !< difference in inputs or states \f$ delta_p = \Delta_p u \f$ or \f$ delta_p = \Delta_p x \f$ - REAL(R8Ki) , INTENT(INOUT) :: dX(:) !< column of dXdu or dXdx: \f$ \frac{\partial X}{\partial u_i} = \frac{x_p - x_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial X}{\partial x_i} = \frac{x_p - x_m}{2 \, \Delta x}\f$ - - ! local variables: - INTEGER(IntKi) :: i ! loop over nodes - INTEGER(IntKi) :: dof ! loop over dofs - INTEGER(IntKi) :: index ! index indicating next value of dX to be filled - - index = 1 - do i=2,p%node_total - do dof=1,p%dof_node - dX(index) = x_p%q( dof, i ) - x_m%q( dof, i ) - index = index+1 - end do - end do - - do i=2,p%node_total - do dof=1,p%dof_node - dX(index) = x_p%dqdt( dof, i ) - x_m%dqdt( dof, i ) - index = index+1 - end do - end do - - dX = dX / ( 2.0_R8Ki*delta) - -END SUBROUTINE Compute_dX -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine beamdyn::init_jacobian is consistant with this routine! -SUBROUTINE Compute_RelState_Matrix(p, u, x, OtherState, RelState_x, RelState_xdot) - - TYPE(BD_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(BD_InputType) , INTENT(IN ) :: u !< BD inputs - TYPE(BD_ContinuousStateType) , INTENT(IN ) :: x !< BD continuous states - TYPE(BD_OtherStateType) , INTENT(IN ) :: OtherState !< Other states at t - REAL(R8Ki) , INTENT(INOUT) :: RelState_x(:,:) !< - REAL(R8Ki) , INTENT(INOUT) :: RelState_xdot(:,:) !< - - ! local variables: - INTEGER(IntKi) :: i ! loop counter - INTEGER(IntKi) :: j ! loop counter - INTEGER(IntKi) :: dof ! loop over dofs - INTEGER(IntKi) :: q_index ! index into the state arrays - INTEGER(IntKi) :: dqdt_index ! index into the state arrays - INTEGER(IntKi) :: node ! node in the state arrays - - REAL(R8Ki) :: dp ! temporary dot product - REAL(R8Ki) :: cp(3) ! temporary cross product - REAL(R8Ki) :: RotVel(3) ! temporary velocity - REAL(R8Ki) :: RotAcc(3) ! temporary acceleration - REAL(R8Ki) :: DisplacedPosition(3) - REAL(R8Ki) :: fx_p(3,3) - - RelState_x = 0.0_ReKi - RelState_xdot = 0.0_ReKi - - !----------------------------------- - do i=1,p%elem_total - do j=2,p%nodes_per_elem - - node = (i-1)*(p%nodes_per_elem-1) + j ! index to state array (rows of conversion matrices) - q_index = (node - 2)*p%dof_node + 1 ! index into displacement portion of x (skipping node 1) - dqdt_index = p%Jac_nx + q_index - - DisplacedPosition = u%RootMotion%Position(:,1) + u%RootMotion%TranslationDisp(:,1) & - - OtherState%GlbPos - MATMUL(OtherState%GlbRot, p%uuN0(1:3,j,i) + x%q(1:3,node) ) - - RotVel = real(u%RootMotion%RotationVel(:,1),R8Ki) - RotAcc = real(u%RootMotion%RotationAcc(:,1),R8Ki) - - fx_p = SkewSymMat(DisplacedPosition) - - do dof=0,5 - RelState_x( q_index+dof, 1+dof ) = 1.0_R8Ki ! root displacements to node displacements - end do - do dof=0,5 - RelState_x( dqdt_index+dof, 7+dof ) = 1.0_R8Ki ! root velocities to node velocities - end do - - - RelState_x( q_index:q_index+2, 4: 6 ) = fx_p ! root rotational displacement to node translational displacement - RelState_x( dqdt_index:dqdt_index+2, 10:12 ) = fx_p ! root rotational velocity to node translational velocity - - ! root rotational displacement to node translational velocity: - RelState_x( dqdt_index:dqdt_index+2, 4:6 ) = OuterProduct( DisplacedPosition, RotVel ) - dp = dot_product( DisplacedPosition, RotVel ) - do dof=0,2 - RelState_x( dqdt_index+dof, 4+dof ) = RelState_x( dqdt_index+dof, 4+dof ) - dp ! root rotational displacement to node translational velocity - end do - !---------- - - - !............................................. - ! The first p%Jac_nx rows of RelState_xdot are the same as the last p%Jac_nx rows of RelState_x, so I'm not going to recalculate these rows, we'll set them after the loops: - !do dof=0,5 - ! RelState_xdot( q_index+dof, 7+dof ) = 1.0_ReKi ! root velocities to node velocities - !end do - !RelState_xdot( q_index:q_index+2, 4:6 ) = RelState_x( dqdt_index:dqdt_index+2, 4:6 ) ! root rotational displacement to node translational velocity - !RelState_xdot( q_index:q_index+2, 10:12 ) = fx_p ! root rotational velocity to node translational velocity - - do dof=0,5 - RelState_xdot( dqdt_index+dof, 13+dof ) = 1.0_R8Ki ! root accelerations to node accelerations - end do - - - ! root translational velocity to node translational acceleration: - cp = cross_product(u%RootMotion%RotationVel(:,1), DisplacedPosition) - RelState_xdot( dqdt_index:dqdt_index+2, 7:9 ) = OuterProduct( DisplacedPosition, RotAcc ) & - + OuterProduct( cp, RotVel ) - dp*SkewSymMat(RotVel) - dp = dot_product( DisplacedPosition, RotAcc ) - do dof=0,2 - RelState_xdot( dqdt_index+dof, 7+dof ) = RelState_xdot( dqdt_index+dof, 7+dof ) - dp - end do - !----------- - - RelState_xdot( dqdt_index:dqdt_index+2, 10:12 ) = RelState_x( dqdt_index:dqdt_index+2, 4:6 ) + SkewSymMat(cp) ! root rotational velocity to node translational acceleration - RelState_xdot( dqdt_index:dqdt_index+2, 16:18 ) = fx_p ! root rotational acceleration to node translational acceleration - - end do - end do - RelState_xdot(1:p%Jac_nx,:) = RelState_x(p%Jac_nx+1:,:) - -END SUBROUTINE Compute_RelState_Matrix -!---------------------------------------------------------------------------------------------------------------------------------- !---------------------------------------------------------------------------------------------------------------------------------- END MODULE BeamDyn_IO diff --git a/modules/beamdyn/src/BeamDyn_Types.f90 b/modules/beamdyn/src/BeamDyn_Types.f90 index 81b34982b8..09d754db0b 100644 --- a/modules/beamdyn/src/BeamDyn_Types.f90 +++ b/modules/beamdyn/src/BeamDyn_Types.f90 @@ -33,12 +33,12 @@ MODULE BeamDyn_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: BD_STATIC_ANALYSIS = 1 ! Constant for static analysis. InputType%Dynamic = FALSE. [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: BD_DYNAMIC_ANALYSIS = 2 ! Constant for dynamic analysis. InputType%Dynamic = TRUE .AND. BD_InputFile%QuasiStaticSolve = FALSE [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: BD_DYN_SSS_ANALYSIS = 3 ! Constant for dynamic analysis with Steady State Startup solve. InputType%Dynamic = TRUE .AND. BD_InputFile%QuasiStaticSolve = TRUE [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: BD_MESH_FE = 1 ! Constant for creating y%BldMotion at the FE (GLL) nodes [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: BD_MESH_QP = 2 ! Constant for creating y%BldMotion at the quadrature nodes [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: BD_MESH_STATIONS = 3 ! Constant for creating y%BldMotion at the blade property input stations [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BD_STATIC_ANALYSIS = 1 ! Constant for static analysis. InputType%Dynamic = FALSE. [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BD_DYNAMIC_ANALYSIS = 2 ! Constant for dynamic analysis. InputType%Dynamic = TRUE .AND. BD_InputFile%QuasiStaticSolve = FALSE [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BD_DYN_SSS_ANALYSIS = 3 ! Constant for dynamic analysis with Steady State Startup solve. InputType%Dynamic = TRUE .AND. BD_InputFile%QuasiStaticSolve = TRUE [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BD_MESH_FE = 1 ! Constant for creating y%BldMotion at the FE (GLL) nodes [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BD_MESH_QP = 2 ! Constant for creating y%BldMotion at the quadrature nodes [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BD_MESH_STATIONS = 3 ! Constant for creating y%BldMotion at the blade property input stations [-] ! ========= BD_InitInputType ======= TYPE, PUBLIC :: BD_InitInputType CHARACTER(1024) :: InputFile !< Name of the input file; remove if there is no file [-] @@ -49,8 +49,6 @@ MODULE BeamDyn_Types REAL(R8Ki) , DIMENSION(1:3) :: RootDisp = 0.0_R8Ki !< Initial root displacement [-] REAL(R8Ki) , DIMENSION(1:3,1:3) :: RootOri = 0.0_R8Ki !< Initial root orientation [-] REAL(ReKi) , DIMENSION(1:6) :: RootVel = 0.0_ReKi !< Initial root velocities and angular veolcities [-] - REAL(ReKi) , DIMENSION(1:3) :: HubPos = 0.0_ReKi !< Initial Hub position vector [-] - REAL(R8Ki) , DIMENSION(1:3,1:3) :: HubRot = 0.0_R8Ki !< Initial Hub direction cosine matrix [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] LOGICAL :: DynamicSolve = .TRUE. !< Use dynamic solve option. Set to False for static solving (handled by glue code or driver code). [-] LOGICAL :: CompAeroMaps = .FALSE. !< flag to determine if BeamDyn is computing aero maps (true) or running a normal simulation (false) [-] @@ -61,14 +59,7 @@ MODULE BeamDyn_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_x !< Names of the continuous states used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_y !< Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_x !< Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame (not used for glue) [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_u !< Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: DerivOrder_x !< Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE BD_InitOutputType ! ======================= ! ========= BladeInputData ======= @@ -79,7 +70,9 @@ MODULE BeamDyn_Types REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: stiff0 !< C/S stiffness matrix arrays [-] REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: mass0 !< C/S mass matrix arrays [-] REAL(R8Ki) , DIMENSION(1:6) :: beta = 0.0_R8Ki !< Damping Coefficient [-] - INTEGER(IntKi) :: damp_flag = 0_IntKi !< Damping Flag: 0-No Damping, 1-Damped [-] + INTEGER(IntKi) :: n_modes = 0_IntKi !< Number of modal damping coefficients [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: zeta !< Modal damping coefficient array [-] + INTEGER(IntKi) :: damp_flag = 0_IntKi !< Damping Flag: 0-No Damping, 1-Stiffness Prop. Damped, 2-Modal Damping [-] END TYPE BladeInputData ! ======================= ! ========= BD_InputFile ======= @@ -97,18 +90,13 @@ MODULE BeamDyn_Types REAL(DbKi) :: DTBeam = 0.0_R8Ki !< Time interval for BeamDyn calculations {or default} (s) [-] TYPE(BladeInputData) :: InpBl !< Input data for individual blades [see BladeInputData Type] CHARACTER(1024) :: BldFile !< Name of blade input file [-] - LOGICAL :: UsePitchAct = .false. !< Whether to use a pitch actuator inside BeamDyn [(flag)] LOGICAL :: QuasiStaticInit = .false. !< Use quasistatic pre-conditioning with centripetal accelerations in initialization (flag) [dynamic solve and enFAST only] [-] REAL(R8Ki) :: stop_tol = 0.0_R8Ki !< Tolerance for stopping criterion [-] REAL(R8Ki) :: tngt_stf_pert = 0.0_R8Ki !< Perturbation size for computing finite differenced tangent stiffness [-] REAL(R8Ki) :: tngt_stf_difftol = 0.0_R8Ki !< When comparing tangent stiffness matrix, stop simulation if error greater than this [-] REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: kp_coordinate !< Key point coordinates array [-] - REAL(R8Ki) :: pitchJ = 0.0_R8Ki !< Pitch actuator inertia [(kg-m^2)] - REAL(R8Ki) :: pitchK = 0.0_R8Ki !< Pitch actuator stiffness [(kg-m^2/s^2)] - REAL(R8Ki) :: pitchC = 0.0_R8Ki !< Pitch actuator damping [-] LOGICAL :: Echo = .false. !< Echo [-] LOGICAL :: RotStates = .TRUE. !< Orient states in rotating frame during linearization? (flag) [-] - LOGICAL :: RelStates = .FALSE. !< Define states relative to root motion during linearization? (flag) [-] LOGICAL :: tngt_stf_fd = .false. !< Flag to compute tangent stifness matrix via finite difference [-] LOGICAL :: tngt_stf_comp = .false. !< Flag to compare finite differenced and analytical tangent stifness [-] INTEGER(IntKi) :: NNodeOuts = 0_IntKi !< Number of node outputs [0 - 9] [-] @@ -131,8 +119,7 @@ MODULE BeamDyn_Types ! ======================= ! ========= BD_DiscreteStateType ======= TYPE, PUBLIC :: BD_DiscreteStateType - REAL(ReKi) :: thetaP = 0.0_ReKi !< Pitch angle state [-] - REAL(ReKi) :: thetaPD = 0.0_ReKi !< Pitch rate state [-] + REAL(ReKi) :: DummyDiscState = 0.0_ReKi !< A variable, Replace if you have discrete states [-] END TYPE BD_DiscreteStateType ! ======================= ! ========= BD_ConstraintStateType ======= @@ -173,6 +160,7 @@ MODULE BeamDyn_Types REAL(R8Ki) , DIMENSION(1:3) :: blade_CG = 0.0_R8Ki !< Blade center of gravity [-] REAL(R8Ki) , DIMENSION(1:3,1:3) :: blade_IN = 0.0_R8Ki !< Blade Length [-] REAL(R8Ki) , DIMENSION(1:6) :: beta = 0.0_R8Ki !< Damping Coefficient [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: zeta !< Modal Damping Coefficients [-] REAL(R8Ki) :: tol = 0.0_R8Ki !< Tolerance used in stopping criterion [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: QPtN !< Quadrature (QuadPt) point locations in natural frame [-1, 1] [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: QPtWeight !< Weights at each quadrature point (QuadPt) [-] @@ -207,11 +195,6 @@ MODULE BeamDyn_Types INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: NdIndxInverse !< Index from BldMotion mesh to unique nodes (to number the nodes for output without using collocated nodes) [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: OutNd2NdElem !< To go from an output node number to a node/elem pair [-] CHARACTER(20) :: OutFmt !< Format specifier [-] - LOGICAL :: UsePitchAct = .false. !< Whether to use a pitch actuator inside BeamDyn [(flag)] - REAL(ReKi) :: pitchJ = 0.0_ReKi !< Pitch actuator inertia [(kg-m^2)] - REAL(ReKi) :: pitchK = 0.0_ReKi !< Pitch actuator stiffness [(kg-m^2/s^2)] - REAL(ReKi) :: pitchC = 0.0_ReKi !< Pitch actuator damping [-] - REAL(ReKi) , DIMENSION(1:2,1:2) :: torqM = 0.0_ReKi !< Pitch actuator matrix: (I-hA)^-1 [-] TYPE(qpParam) :: qp !< Quadrature point info that does not change during simulation [-] INTEGER(IntKi) :: qp_indx_offset = 0_IntKi !< Offset for computing index of the quadrature arrays (gauss skips the first [end-point] node) [-] INTEGER(IntKi) :: BldMotionNodeLoc = 0_IntKi !< switch to determine where the nodes on the blade motion mesh should be located 1=FE (GLL) nodes; 2=quadrature nodes; 3=blade input stations [-] @@ -229,15 +212,10 @@ MODULE BeamDyn_Types REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: QPtw_Shp_Jac !< optimization variable: QPtw_Shp_Jac(idx_qp,i,nelem) = p%Shp(i,idx_qp)*p%QPtWeight(idx_qp)*p%Jacobian(idx_qp,nelem) [-] REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: QPtw_ShpDer !< optimization variable: QPtw_ShpDer(idx_qp,i) = p%ShpDer(i,idx_qp)*p%QPtWeight(idx_qp) [-] REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: FEweight !< weighting factors for integrating local sectional loads [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: du !< vector that determines size of perturbation for u (inputs) [-] - REAL(R8Ki) , DIMENSION(1:6) :: dx = 0.0_R8Ki !< vector that determines size of perturbation for x (continuous states) [-] - INTEGER(IntKi) :: Jac_ny = 0_IntKi !< number of outputs in jacobian matrix [-] - INTEGER(IntKi) :: Jac_nx = 0_IntKi !< half the number of continuous states in jacobian matrix [-] 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 [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: ModalDampingMat !< Modal damping matrix in the rotating frame [-] END TYPE BD_ParameterType ! ======================= ! ========= BD_InputType ======= @@ -245,7 +223,6 @@ MODULE BeamDyn_Types TYPE(MeshType) :: RootMotion !< contains motion [-] TYPE(MeshType) :: PointLoad !< Applied point forces along beam axis [-] TYPE(MeshType) :: DistrLoad !< Applied distributed forces along beam axis [-] - TYPE(MeshType) :: HubMotion !< motion (orientation) at the hub [-] END TYPE BD_InputType ! ======================= ! ========= BD_OutputType ======= @@ -267,6 +244,7 @@ MODULE BeamDyn_Types REAL(R8Ki) , DIMENSION(:,:,:,:), ALLOCATABLE :: RR0 !< Rotation tensor at current QP \f$ \left(\underline{\underline{R}}\underline{\underline{R}}_0\right) \f$ [-] REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: kappa !< Curvature vector \f$ \underline{k} \f$ at current QP (note this is not \kappa, but a term in \kappa) [-] REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: E1 !< \vec{e_1} = x_0^\prime + u^\prime (3) at current QP [-] + REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: strain !< strain vector [-] REAL(R8Ki) , DIMENSION(:,:,:,:), ALLOCATABLE :: Stif !< C/S stiffness matrix resolved in inertial frame at current QP. 6x6 [-] REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: Fb !< Gyroscopic forces at current QP. 6 [-] REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: Fc !< Elastic force \f$ \underline{F}^c \f$ at current QP. 6 [-] @@ -331,12 +309,30 @@ MODULE BeamDyn_Types REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: LP_RHS !< Right-hand-side vector [-] REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: LP_StifK_LU !< Stiffness Matrix for LU [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: LP_RHS_LU !< Right-hand-side vector for LU [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: DampedVelocities !< Velocity vector for applying modal damping [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: ModalDampingF !< Modal damping force in the modal damping matrix coordinates [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: RotatedDamping !< Rotated damping matrix for linearization at time step in GA2 [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: LP_indx !< Index vector for LU [-] TYPE(BD_InputType) :: u !< Inputs converted to the internal BD coordinate system [-] - TYPE(BD_InputType) :: u2 !< Inputs in the FAST coordinate system, possibly modified by pitch actuator [-] + TYPE(ModJacType) :: Jac !< Jacobian matrices and arrays corresponding to module variables [-] + TYPE(BD_ContinuousStateType) :: x_perturb !< [-] + TYPE(BD_ContinuousStateType) :: dxdt_lin !< [-] + TYPE(BD_InputType) :: u_perturb !< [-] + TYPE(BD_OutputType) :: y_lin !< [-] END TYPE BD_MiscVarType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: BD_x_q = 1 ! BD%q + integer(IntKi), public, parameter :: BD_x_dqdt = 2 ! BD%dqdt + integer(IntKi), public, parameter :: BD_u_RootMotion = 3 ! BD%RootMotion + integer(IntKi), public, parameter :: BD_u_PointLoad = 4 ! BD%PointLoad + integer(IntKi), public, parameter :: BD_u_DistrLoad = 5 ! BD%DistrLoad + integer(IntKi), public, parameter :: BD_y_ReactionForce = 6 ! BD%ReactionForce + integer(IntKi), public, parameter :: BD_y_BldMotion = 7 ! BD%BldMotion + integer(IntKi), public, parameter :: BD_y_RootMxr = 8 ! BD%RootMxr + integer(IntKi), public, parameter :: BD_y_RootMyr = 9 ! BD%RootMyr + integer(IntKi), public, parameter :: BD_y_WriteOutput = 10 ! BD%WriteOutput + +contains subroutine BD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(BD_InitInputType), intent(in) :: SrcInitInputData @@ -355,8 +351,6 @@ subroutine BD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSta DstInitInputData%RootDisp = SrcInitInputData%RootDisp DstInitInputData%RootOri = SrcInitInputData%RootOri DstInitInputData%RootVel = SrcInitInputData%RootVel - DstInitInputData%HubPos = SrcInitInputData%HubPos - DstInitInputData%HubRot = SrcInitInputData%HubRot DstInitInputData%Linearize = SrcInitInputData%Linearize DstInitInputData%DynamicSolve = SrcInitInputData%DynamicSolve DstInitInputData%CompAeroMaps = SrcInitInputData%CompAeroMaps @@ -384,8 +378,6 @@ subroutine BD_PackInitInput(RF, Indata) call RegPack(RF, InData%RootDisp) call RegPack(RF, InData%RootOri) call RegPack(RF, InData%RootVel) - call RegPack(RF, InData%HubPos) - call RegPack(RF, InData%HubRot) call RegPack(RF, InData%Linearize) call RegPack(RF, InData%DynamicSolve) call RegPack(RF, InData%CompAeroMaps) @@ -405,8 +397,6 @@ subroutine BD_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%RootDisp); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RootOri); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RootVel); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HubPos); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HubRot); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DynamicSolve); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompAeroMaps); if (RegCheckErr(RF, RoutineName)) return @@ -451,102 +441,9 @@ subroutine BD_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, Err call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcInitOutputData%LinNames_y)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_y) - UB(1:1) = ubound(SrcInitOutputData%LinNames_y) - if (.not. allocated(DstInitOutputData%LinNames_y)) then - allocate(DstInitOutputData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_y = SrcInitOutputData%LinNames_y - end if - if (allocated(SrcInitOutputData%LinNames_x)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_x) - UB(1:1) = ubound(SrcInitOutputData%LinNames_x) - if (.not. allocated(DstInitOutputData%LinNames_x)) then - allocate(DstInitOutputData%LinNames_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_x = SrcInitOutputData%LinNames_x - end if - if (allocated(SrcInitOutputData%LinNames_u)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_u) - UB(1:1) = ubound(SrcInitOutputData%LinNames_u) - if (.not. allocated(DstInitOutputData%LinNames_u)) then - allocate(DstInitOutputData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_u = SrcInitOutputData%LinNames_u - end if - if (allocated(SrcInitOutputData%RotFrame_y)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_y) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_y) - if (.not. allocated(DstInitOutputData%RotFrame_y)) then - allocate(DstInitOutputData%RotFrame_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_y = SrcInitOutputData%RotFrame_y - end if - if (allocated(SrcInitOutputData%RotFrame_x)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_x) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_x) - if (.not. allocated(DstInitOutputData%RotFrame_x)) then - allocate(DstInitOutputData%RotFrame_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_x = SrcInitOutputData%RotFrame_x - end if - if (allocated(SrcInitOutputData%RotFrame_u)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_u) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_u) - if (.not. allocated(DstInitOutputData%RotFrame_u)) then - allocate(DstInitOutputData%RotFrame_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_u = SrcInitOutputData%RotFrame_u - end if - if (allocated(SrcInitOutputData%IsLoad_u)) then - LB(1:1) = lbound(SrcInitOutputData%IsLoad_u) - UB(1:1) = ubound(SrcInitOutputData%IsLoad_u) - if (.not. allocated(DstInitOutputData%IsLoad_u)) then - allocate(DstInitOutputData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%IsLoad_u = SrcInitOutputData%IsLoad_u - end if - if (allocated(SrcInitOutputData%DerivOrder_x)) then - LB(1:1) = lbound(SrcInitOutputData%DerivOrder_x) - UB(1:1) = ubound(SrcInitOutputData%DerivOrder_x) - if (.not. allocated(DstInitOutputData%DerivOrder_x)) then - allocate(DstInitOutputData%DerivOrder_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%DerivOrder_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%DerivOrder_x = SrcInitOutputData%DerivOrder_x - end if + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine BD_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -566,30 +463,8 @@ subroutine BD_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(InitOutputData%LinNames_y)) then - deallocate(InitOutputData%LinNames_y) - end if - if (allocated(InitOutputData%LinNames_x)) then - deallocate(InitOutputData%LinNames_x) - end if - if (allocated(InitOutputData%LinNames_u)) then - deallocate(InitOutputData%LinNames_u) - end if - if (allocated(InitOutputData%RotFrame_y)) then - deallocate(InitOutputData%RotFrame_y) - end if - if (allocated(InitOutputData%RotFrame_x)) then - deallocate(InitOutputData%RotFrame_x) - end if - if (allocated(InitOutputData%RotFrame_u)) then - deallocate(InitOutputData%RotFrame_u) - end if - if (allocated(InitOutputData%IsLoad_u)) then - deallocate(InitOutputData%IsLoad_u) - end if - if (allocated(InitOutputData%DerivOrder_x)) then - deallocate(InitOutputData%DerivOrder_x) - end if + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine BD_PackInitOutput(RF, Indata) @@ -600,14 +475,7 @@ subroutine BD_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%WriteOutputHdr) call RegPackAlloc(RF, InData%WriteOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_x) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%RotFrame_y) - call RegPackAlloc(RF, InData%RotFrame_x) - call RegPackAlloc(RF, InData%RotFrame_u) - call RegPackAlloc(RF, InData%IsLoad_u) - call RegPackAlloc(RF, InData%DerivOrder_x) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -622,14 +490,7 @@ subroutine BD_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DerivOrder_x); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine BD_CopyBladeInputData(SrcBladeInputDataData, DstBladeInputDataData, CtrlCode, ErrStat, ErrMsg) @@ -682,6 +543,19 @@ subroutine BD_CopyBladeInputData(SrcBladeInputDataData, DstBladeInputDataData, C DstBladeInputDataData%mass0 = SrcBladeInputDataData%mass0 end if DstBladeInputDataData%beta = SrcBladeInputDataData%beta + DstBladeInputDataData%n_modes = SrcBladeInputDataData%n_modes + if (allocated(SrcBladeInputDataData%zeta)) then + LB(1:1) = lbound(SrcBladeInputDataData%zeta) + UB(1:1) = ubound(SrcBladeInputDataData%zeta) + if (.not. allocated(DstBladeInputDataData%zeta)) then + allocate(DstBladeInputDataData%zeta(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstBladeInputDataData%zeta.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstBladeInputDataData%zeta = SrcBladeInputDataData%zeta + end if DstBladeInputDataData%damp_flag = SrcBladeInputDataData%damp_flag end subroutine @@ -701,6 +575,9 @@ subroutine BD_DestroyBladeInputData(BladeInputDataData, ErrStat, ErrMsg) if (allocated(BladeInputDataData%mass0)) then deallocate(BladeInputDataData%mass0) end if + if (allocated(BladeInputDataData%zeta)) then + deallocate(BladeInputDataData%zeta) + end if end subroutine subroutine BD_PackBladeInputData(RF, Indata) @@ -714,6 +591,8 @@ subroutine BD_PackBladeInputData(RF, Indata) call RegPackAlloc(RF, InData%stiff0) call RegPackAlloc(RF, InData%mass0) call RegPack(RF, InData%beta) + call RegPack(RF, InData%n_modes) + call RegPackAlloc(RF, InData%zeta) call RegPack(RF, InData%damp_flag) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -732,6 +611,8 @@ subroutine BD_UnPackBladeInputData(RF, OutData) call RegUnpackAlloc(RF, OutData%stiff0); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%mass0); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%beta); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%n_modes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%zeta); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%damp_flag); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -773,7 +654,6 @@ subroutine BD_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSta call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return DstInputFileData%BldFile = SrcInputFileData%BldFile - DstInputFileData%UsePitchAct = SrcInputFileData%UsePitchAct DstInputFileData%QuasiStaticInit = SrcInputFileData%QuasiStaticInit DstInputFileData%stop_tol = SrcInputFileData%stop_tol DstInputFileData%tngt_stf_pert = SrcInputFileData%tngt_stf_pert @@ -790,12 +670,8 @@ subroutine BD_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSta end if DstInputFileData%kp_coordinate = SrcInputFileData%kp_coordinate end if - DstInputFileData%pitchJ = SrcInputFileData%pitchJ - DstInputFileData%pitchK = SrcInputFileData%pitchK - DstInputFileData%pitchC = SrcInputFileData%pitchC DstInputFileData%Echo = SrcInputFileData%Echo DstInputFileData%RotStates = SrcInputFileData%RotStates - DstInputFileData%RelStates = SrcInputFileData%RelStates DstInputFileData%tngt_stf_fd = SrcInputFileData%tngt_stf_fd DstInputFileData%tngt_stf_comp = SrcInputFileData%tngt_stf_comp DstInputFileData%NNodeOuts = SrcInputFileData%NNodeOuts @@ -889,18 +765,13 @@ subroutine BD_PackInputFile(RF, Indata) call RegPack(RF, InData%DTBeam) call BD_PackBladeInputData(RF, InData%InpBl) call RegPack(RF, InData%BldFile) - call RegPack(RF, InData%UsePitchAct) call RegPack(RF, InData%QuasiStaticInit) call RegPack(RF, InData%stop_tol) call RegPack(RF, InData%tngt_stf_pert) call RegPack(RF, InData%tngt_stf_difftol) call RegPackAlloc(RF, InData%kp_coordinate) - call RegPack(RF, InData%pitchJ) - call RegPack(RF, InData%pitchK) - call RegPack(RF, InData%pitchC) call RegPack(RF, InData%Echo) call RegPack(RF, InData%RotStates) - call RegPack(RF, InData%RelStates) call RegPack(RF, InData%tngt_stf_fd) call RegPack(RF, InData%tngt_stf_comp) call RegPack(RF, InData%NNodeOuts) @@ -937,18 +808,13 @@ subroutine BD_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%DTBeam); if (RegCheckErr(RF, RoutineName)) return call BD_UnpackBladeInputData(RF, OutData%InpBl) ! InpBl call RegUnpack(RF, OutData%BldFile); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UsePitchAct); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%QuasiStaticInit); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%stop_tol); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%tngt_stf_pert); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%tngt_stf_difftol); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%kp_coordinate); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%pitchJ); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%pitchK); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%pitchC); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Echo); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RotStates); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RelStates); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%tngt_stf_fd); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%tngt_stf_comp); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NNodeOuts); if (RegCheckErr(RF, RoutineName)) return @@ -1046,8 +912,7 @@ subroutine BD_CopyDiscState(SrcDiscStateData, DstDiscStateData, CtrlCode, ErrSta character(*), parameter :: RoutineName = 'BD_CopyDiscState' ErrStat = ErrID_None ErrMsg = '' - DstDiscStateData%thetaP = SrcDiscStateData%thetaP - DstDiscStateData%thetaPD = SrcDiscStateData%thetaPD + DstDiscStateData%DummyDiscState = SrcDiscStateData%DummyDiscState end subroutine subroutine BD_DestroyDiscState(DiscStateData, ErrStat, ErrMsg) @@ -1064,8 +929,7 @@ subroutine BD_PackDiscState(RF, Indata) type(BD_DiscreteStateType), intent(in) :: InData character(*), parameter :: RoutineName = 'BD_PackDiscState' if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%thetaP) - call RegPack(RF, InData%thetaPD) + call RegPack(RF, InData%DummyDiscState) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1074,8 +938,7 @@ subroutine BD_UnPackDiscState(RF, OutData) type(BD_DiscreteStateType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'BD_UnPackDiscState' if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%thetaP); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%thetaPD); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DummyDiscState); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine BD_CopyConstrState(SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg) @@ -1361,6 +1224,18 @@ subroutine BD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%blade_CG = SrcParamData%blade_CG DstParamData%blade_IN = SrcParamData%blade_IN DstParamData%beta = SrcParamData%beta + if (allocated(SrcParamData%zeta)) then + LB(1:1) = lbound(SrcParamData%zeta) + UB(1:1) = ubound(SrcParamData%zeta) + if (.not. allocated(DstParamData%zeta)) then + allocate(DstParamData%zeta(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%zeta.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%zeta = SrcParamData%zeta + end if DstParamData%tol = SrcParamData%tol if (allocated(SrcParamData%QPtN)) then LB(1:1) = lbound(SrcParamData%QPtN) @@ -1542,11 +1417,6 @@ subroutine BD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%OutNd2NdElem = SrcParamData%OutNd2NdElem end if DstParamData%OutFmt = SrcParamData%OutFmt - DstParamData%UsePitchAct = SrcParamData%UsePitchAct - DstParamData%pitchJ = SrcParamData%pitchJ - DstParamData%pitchK = SrcParamData%pitchK - DstParamData%pitchC = SrcParamData%pitchC - DstParamData%torqM = SrcParamData%torqM call BD_CopyqpParam(SrcParamData%qp, DstParamData%qp, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -1658,37 +1528,21 @@ subroutine BD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) end if DstParamData%FEweight = SrcParamData%FEweight end if - if (allocated(SrcParamData%Jac_u_indx)) then - LB(1:2) = lbound(SrcParamData%Jac_u_indx) - UB(1:2) = ubound(SrcParamData%Jac_u_indx) - if (.not. allocated(DstParamData%Jac_u_indx)) then - allocate(DstParamData%Jac_u_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_u_indx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_u_indx = SrcParamData%Jac_u_indx - end if - if (allocated(SrcParamData%du)) then - LB(1:1) = lbound(SrcParamData%du) - UB(1:1) = ubound(SrcParamData%du) - if (.not. allocated(DstParamData%du)) then - allocate(DstParamData%du(LB(1):UB(1)), stat=ErrStat2) + DstParamData%RotStates = SrcParamData%RotStates + DstParamData%CompAeroMaps = SrcParamData%CompAeroMaps + DstParamData%CompAppliedLdAtRoot = SrcParamData%CompAppliedLdAtRoot + if (allocated(SrcParamData%ModalDampingMat)) then + LB(1:2) = lbound(SrcParamData%ModalDampingMat) + UB(1:2) = ubound(SrcParamData%ModalDampingMat) + if (.not. allocated(DstParamData%ModalDampingMat)) then + allocate(DstParamData%ModalDampingMat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%du.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ModalDampingMat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%du = SrcParamData%du + DstParamData%ModalDampingMat = SrcParamData%ModalDampingMat end if - DstParamData%dx = SrcParamData%dx - DstParamData%Jac_ny = SrcParamData%Jac_ny - DstParamData%Jac_nx = SrcParamData%Jac_nx - DstParamData%RotStates = SrcParamData%RotStates - DstParamData%RelStates = SrcParamData%RelStates - DstParamData%CompAeroMaps = SrcParamData%CompAeroMaps - DstParamData%CompAppliedLdAtRoot = SrcParamData%CompAppliedLdAtRoot end subroutine subroutine BD_DestroyParam(ParamData, ErrStat, ErrMsg) @@ -1717,6 +1571,9 @@ subroutine BD_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%member_eta)) then deallocate(ParamData%member_eta) end if + if (allocated(ParamData%zeta)) then + deallocate(ParamData%zeta) + end if if (allocated(ParamData%QPtN)) then deallocate(ParamData%QPtN) end if @@ -1794,11 +1651,8 @@ subroutine BD_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%FEweight)) then deallocate(ParamData%FEweight) end if - if (allocated(ParamData%Jac_u_indx)) then - deallocate(ParamData%Jac_u_indx) - end if - if (allocated(ParamData%du)) then - deallocate(ParamData%du) + if (allocated(ParamData%ModalDampingMat)) then + deallocate(ParamData%ModalDampingMat) end if end subroutine @@ -1823,6 +1677,7 @@ subroutine BD_PackParam(RF, Indata) call RegPack(RF, InData%blade_CG) call RegPack(RF, InData%blade_IN) call RegPack(RF, InData%beta) + call RegPackAlloc(RF, InData%zeta) call RegPack(RF, InData%tol) call RegPackAlloc(RF, InData%QPtN) call RegPackAlloc(RF, InData%QPtWeight) @@ -1865,11 +1720,6 @@ subroutine BD_PackParam(RF, Indata) call RegPackAlloc(RF, InData%NdIndxInverse) call RegPackAlloc(RF, InData%OutNd2NdElem) call RegPack(RF, InData%OutFmt) - call RegPack(RF, InData%UsePitchAct) - call RegPack(RF, InData%pitchJ) - call RegPack(RF, InData%pitchK) - call RegPack(RF, InData%pitchC) - call RegPack(RF, InData%torqM) call BD_PackqpParam(RF, InData%qp) call RegPack(RF, InData%qp_indx_offset) call RegPack(RF, InData%BldMotionNodeLoc) @@ -1895,15 +1745,10 @@ subroutine BD_PackParam(RF, Indata) call RegPackAlloc(RF, InData%QPtw_Shp_Jac) call RegPackAlloc(RF, InData%QPtw_ShpDer) call RegPackAlloc(RF, InData%FEweight) - call RegPackAlloc(RF, InData%Jac_u_indx) - call RegPackAlloc(RF, InData%du) - call RegPack(RF, InData%dx) - call RegPack(RF, InData%Jac_ny) - call RegPack(RF, InData%Jac_nx) call RegPack(RF, InData%RotStates) - call RegPack(RF, InData%RelStates) call RegPack(RF, InData%CompAeroMaps) call RegPack(RF, InData%CompAppliedLdAtRoot) + call RegPackAlloc(RF, InData%ModalDampingMat) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1930,6 +1775,7 @@ subroutine BD_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%blade_CG); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%blade_IN); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%beta); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%zeta); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%tol); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%QPtN); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%QPtWeight); if (RegCheckErr(RF, RoutineName)) return @@ -1976,11 +1822,6 @@ subroutine BD_UnPackParam(RF, OutData) call RegUnpackAlloc(RF, OutData%NdIndxInverse); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%OutNd2NdElem); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%OutFmt); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UsePitchAct); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%pitchJ); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%pitchK); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%pitchC); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%torqM); if (RegCheckErr(RF, RoutineName)) return call BD_UnpackqpParam(RF, OutData%qp) ! qp call RegUnpack(RF, OutData%qp_indx_offset); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%BldMotionNodeLoc); if (RegCheckErr(RF, RoutineName)) return @@ -2010,15 +1851,10 @@ subroutine BD_UnPackParam(RF, OutData) call RegUnpackAlloc(RF, OutData%QPtw_Shp_Jac); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%QPtw_ShpDer); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%FEweight); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_u_indx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_nx); if (RegCheckErr(RF, RoutineName)) return 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 + call RegUnpackAlloc(RF, OutData%ModalDampingMat); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine BD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) @@ -2041,9 +1877,6 @@ subroutine BD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) call MeshCopy(SrcInputData%DistrLoad, DstInputData%DistrLoad, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcInputData%HubMotion, DstInputData%HubMotion, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return end subroutine subroutine BD_DestroyInput(InputData, ErrStat, ErrMsg) @@ -2061,8 +1894,6 @@ subroutine BD_DestroyInput(InputData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call MeshDestroy( InputData%DistrLoad, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( InputData%HubMotion, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine BD_PackInput(RF, Indata) @@ -2073,7 +1904,6 @@ subroutine BD_PackInput(RF, Indata) call MeshPack(RF, InData%RootMotion) call MeshPack(RF, InData%PointLoad) call MeshPack(RF, InData%DistrLoad) - call MeshPack(RF, InData%HubMotion) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -2085,7 +1915,6 @@ subroutine BD_UnPackInput(RF, OutData) call MeshUnpack(RF, OutData%RootMotion) ! RootMotion call MeshUnpack(RF, OutData%PointLoad) ! PointLoad call MeshUnpack(RF, OutData%DistrLoad) ! DistrLoad - call MeshUnpack(RF, OutData%HubMotion) ! HubMotion end subroutine subroutine BD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) @@ -2275,6 +2104,18 @@ subroutine BD_CopyEqMotionQP(SrcEqMotionQPData, DstEqMotionQPData, CtrlCode, Err end if DstEqMotionQPData%E1 = SrcEqMotionQPData%E1 end if + if (allocated(SrcEqMotionQPData%strain)) then + LB(1:3) = lbound(SrcEqMotionQPData%strain) + UB(1:3) = ubound(SrcEqMotionQPData%strain) + if (.not. allocated(DstEqMotionQPData%strain)) then + allocate(DstEqMotionQPData%strain(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstEqMotionQPData%strain.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstEqMotionQPData%strain = SrcEqMotionQPData%strain + end if if (allocated(SrcEqMotionQPData%Stif)) then LB(1:4) = lbound(SrcEqMotionQPData%Stif) UB(1:4) = ubound(SrcEqMotionQPData%Stif) @@ -2584,6 +2425,9 @@ subroutine BD_DestroyEqMotionQP(EqMotionQPData, ErrStat, ErrMsg) if (allocated(EqMotionQPData%E1)) then deallocate(EqMotionQPData%E1) end if + if (allocated(EqMotionQPData%strain)) then + deallocate(EqMotionQPData%strain) + end if if (allocated(EqMotionQPData%Stif)) then deallocate(EqMotionQPData%Stif) end if @@ -2668,6 +2512,7 @@ subroutine BD_PackEqMotionQP(RF, Indata) call RegPackAlloc(RF, InData%RR0) call RegPackAlloc(RF, InData%kappa) call RegPackAlloc(RF, InData%E1) + call RegPackAlloc(RF, InData%strain) call RegPackAlloc(RF, InData%Stif) call RegPackAlloc(RF, InData%Fb) call RegPackAlloc(RF, InData%Fc) @@ -2710,6 +2555,7 @@ subroutine BD_UnPackEqMotionQP(RF, OutData) call RegUnpackAlloc(RF, OutData%RR0); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%kappa); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%E1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%strain); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Stif); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Fb); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Fc); if (RegCheckErr(RF, RoutineName)) return @@ -3117,6 +2963,42 @@ subroutine BD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) end if DstMiscData%LP_RHS_LU = SrcMiscData%LP_RHS_LU end if + if (allocated(SrcMiscData%DampedVelocities)) then + LB(1:1) = lbound(SrcMiscData%DampedVelocities) + UB(1:1) = ubound(SrcMiscData%DampedVelocities) + if (.not. allocated(DstMiscData%DampedVelocities)) then + allocate(DstMiscData%DampedVelocities(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%DampedVelocities.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%DampedVelocities = SrcMiscData%DampedVelocities + end if + if (allocated(SrcMiscData%ModalDampingF)) then + LB(1:1) = lbound(SrcMiscData%ModalDampingF) + UB(1:1) = ubound(SrcMiscData%ModalDampingF) + if (.not. allocated(DstMiscData%ModalDampingF)) then + allocate(DstMiscData%ModalDampingF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%ModalDampingF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%ModalDampingF = SrcMiscData%ModalDampingF + end if + if (allocated(SrcMiscData%RotatedDamping)) then + LB(1:2) = lbound(SrcMiscData%RotatedDamping) + UB(1:2) = ubound(SrcMiscData%RotatedDamping) + if (.not. allocated(DstMiscData%RotatedDamping)) then + allocate(DstMiscData%RotatedDamping(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%RotatedDamping.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%RotatedDamping = SrcMiscData%RotatedDamping + end if if (allocated(SrcMiscData%LP_indx)) then LB(1:1) = lbound(SrcMiscData%LP_indx) UB(1:1) = ubound(SrcMiscData%LP_indx) @@ -3132,7 +3014,19 @@ subroutine BD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) call BD_CopyInput(SrcMiscData%u, DstMiscData%u, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call BD_CopyInput(SrcMiscData%u2, DstMiscData%u2, CtrlCode, ErrStat2, ErrMsg2) + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call BD_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call BD_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call BD_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call BD_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end subroutine @@ -3247,12 +3141,29 @@ subroutine BD_DestroyMisc(MiscData, ErrStat, ErrMsg) if (allocated(MiscData%LP_RHS_LU)) then deallocate(MiscData%LP_RHS_LU) end if + if (allocated(MiscData%DampedVelocities)) then + deallocate(MiscData%DampedVelocities) + end if + if (allocated(MiscData%ModalDampingF)) then + deallocate(MiscData%ModalDampingF) + end if + if (allocated(MiscData%RotatedDamping)) then + deallocate(MiscData%RotatedDamping) + end if if (allocated(MiscData%LP_indx)) then deallocate(MiscData%LP_indx) end if call BD_DestroyInput(MiscData%u, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call BD_DestroyInput(MiscData%u2, ErrStat2, ErrMsg2) + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call BD_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call BD_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call BD_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call BD_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine @@ -3298,9 +3209,16 @@ subroutine BD_PackMisc(RF, Indata) call RegPackAlloc(RF, InData%LP_RHS) call RegPackAlloc(RF, InData%LP_StifK_LU) call RegPackAlloc(RF, InData%LP_RHS_LU) + call RegPackAlloc(RF, InData%DampedVelocities) + call RegPackAlloc(RF, InData%ModalDampingF) + call RegPackAlloc(RF, InData%RotatedDamping) call RegPackAlloc(RF, InData%LP_indx) call BD_PackInput(RF, InData%u) - call BD_PackInput(RF, InData%u2) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call BD_PackContState(RF, InData%x_perturb) + call BD_PackContState(RF, InData%dxdt_lin) + call BD_PackInput(RF, InData%u_perturb) + call BD_PackOutput(RF, InData%y_lin) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -3349,9 +3267,16 @@ subroutine BD_UnPackMisc(RF, OutData) call RegUnpackAlloc(RF, OutData%LP_RHS); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%LP_StifK_LU); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%LP_RHS_LU); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%DampedVelocities); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%ModalDampingF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%RotatedDamping); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%LP_indx); if (RegCheckErr(RF, RoutineName)) return call BD_UnpackInput(RF, OutData%u) ! u - call BD_UnpackInput(RF, OutData%u2) ! u2 + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call BD_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call BD_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call BD_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call BD_UnpackOutput(RF, OutData%y_lin) ! y_lin end subroutine subroutine BD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -3455,8 +3380,6 @@ SUBROUTINE BD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp1(u1%DistrLoad, u2%DistrLoad, tin, u_out%DistrLoad, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - CALL MeshExtrapInterp1(u1%HubMotion, u2%HubMotion, tin, u_out%HubMotion, tin_out, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE SUBROUTINE BD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) @@ -3518,8 +3441,6 @@ SUBROUTINE BD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrM CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp2(u1%DistrLoad, u2%DistrLoad, u3%DistrLoad, tin, u_out%DistrLoad, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - CALL MeshExtrapInterp2(u1%HubMotion, u2%HubMotion, u3%HubMotion, tin, u_out%HubMotion, tin_out, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE subroutine BD_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg) @@ -3695,5 +3616,282 @@ SUBROUTINE BD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Err y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function BD_InputMeshPointer(u, DL) result(Mesh) + type(BD_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (BD_u_RootMotion) + Mesh => u%RootMotion + case (BD_u_PointLoad) + Mesh => u%PointLoad + case (BD_u_DistrLoad) + Mesh => u%DistrLoad + end select +end function + +function BD_OutputMeshPointer(y, DL) result(Mesh) + type(BD_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (BD_y_ReactionForce) + Mesh => y%ReactionForce + case (BD_y_BldMotion) + Mesh => y%BldMotion + end select +end function + +subroutine BD_VarsPackContState(Vars, x, ValAry) + type(BD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call BD_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine BD_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(BD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BD_x_q) + if (V%Field == FieldOrientation) then + VarVals = wm_to_quat(wm_inv(x%q(4:6, V%j))) ! Convert WM parameters to quaternions + else + VarVals = x%q(V%iLB:V%iUB,V%j) ! Rank 2 Array + end if + case (BD_x_dqdt) + VarVals = x%dqdt(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine BD_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(BD_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call BD_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine BD_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(BD_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BD_x_q) + if (V%Field == FieldOrientation) then + x%q(4:6, V%j) = wm_inv(quat_to_wm(VarVals)) ! Convert quaternion to WM parameters + else + x%q(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end if + case (BD_x_dqdt) + x%dqdt(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function BD_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (BD_x_q) + Name = "x%q" + case (BD_x_dqdt) + Name = "x%dqdt" + case default + Name = "Unknown Field" + end select +end function + +subroutine BD_VarsPackContStateDeriv(Vars, x, ValAry) + type(BD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call BD_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine BD_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(BD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BD_x_q) + VarVals = x%q(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (BD_x_dqdt) + VarVals = x%dqdt(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine BD_VarsPackInput(Vars, u, ValAry) + type(BD_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call BD_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine BD_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(BD_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BD_u_RootMotion) + call MV_PackMesh(V, u%RootMotion, ValAry) ! Mesh + case (BD_u_PointLoad) + call MV_PackMesh(V, u%PointLoad, ValAry) ! Mesh + case (BD_u_DistrLoad) + call MV_PackMesh(V, u%DistrLoad, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine BD_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(BD_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call BD_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine BD_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(BD_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BD_u_RootMotion) + call MV_UnpackMesh(V, ValAry, u%RootMotion) ! Mesh + case (BD_u_PointLoad) + call MV_UnpackMesh(V, ValAry, u%PointLoad) ! Mesh + case (BD_u_DistrLoad) + call MV_UnpackMesh(V, ValAry, u%DistrLoad) ! Mesh + end select + end associate +end subroutine + +function BD_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (BD_u_RootMotion) + Name = "u%RootMotion" + case (BD_u_PointLoad) + Name = "u%PointLoad" + case (BD_u_DistrLoad) + Name = "u%DistrLoad" + case default + Name = "Unknown Field" + end select +end function + +subroutine BD_VarsPackOutput(Vars, y, ValAry) + type(BD_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call BD_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine BD_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(BD_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BD_y_ReactionForce) + call MV_PackMesh(V, y%ReactionForce, ValAry) ! Mesh + case (BD_y_BldMotion) + call MV_PackMesh(V, y%BldMotion, ValAry) ! Mesh + case (BD_y_RootMxr) + VarVals(1) = y%RootMxr ! Scalar + case (BD_y_RootMyr) + VarVals(1) = y%RootMyr ! Scalar + case (BD_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine BD_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(BD_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call BD_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine BD_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(BD_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (BD_y_ReactionForce) + call MV_UnpackMesh(V, ValAry, y%ReactionForce) ! Mesh + case (BD_y_BldMotion) + call MV_UnpackMesh(V, ValAry, y%BldMotion) ! Mesh + case (BD_y_RootMxr) + y%RootMxr = VarVals(1) ! Scalar + case (BD_y_RootMyr) + y%RootMyr = VarVals(1) ! Scalar + case (BD_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function BD_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (BD_y_ReactionForce) + Name = "y%ReactionForce" + case (BD_y_BldMotion) + Name = "y%BldMotion" + case (BD_y_RootMxr) + Name = "y%RootMxr" + case (BD_y_RootMyr) + Name = "y%RootMyr" + case (BD_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE BeamDyn_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/beamdyn/src/Registry_BeamDyn.txt b/modules/beamdyn/src/Registry_BeamDyn.txt index 1500bd2a20..b07e467e99 100644 --- a/modules/beamdyn/src/Registry_BeamDyn.txt +++ b/modules/beamdyn/src/Registry_BeamDyn.txt @@ -30,8 +30,6 @@ typedef ^ InitInputType R8Ki GlbRot {3}{3} - - "Initial typedef ^ InitInputType R8Ki RootDisp {3} - - "Initial root displacement" typedef ^ InitInputType R8Ki RootOri {3}{3} - - "Initial root orientation" typedef ^ InitInputType ReKi RootVel {6} - - "Initial root velocities and angular veolcities" -typedef ^ InitInputType ReKi HubPos {3} - - "Initial Hub position vector" -typedef ^ InitInputType R8Ki HubRot {3}{3} - - "Initial Hub direction cosine matrix" typedef ^ InitInputType Logical Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - typedef ^ InitInputType Logical DynamicSolve - .TRUE. - "Use dynamic solve option. Set to False for static solving (handled by glue code or driver code)." - typedef ^ InitInputType LOGICAL CompAeroMaps - .FALSE. - "flag to determine if BeamDyn is computing aero maps (true) or running a normal simulation (false)" - @@ -42,16 +40,7 @@ typedef ^ InitInputType LOGICAL CompAeroMaps - .FALSE. - "fl typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - -typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_z {:} - - "Names of the constraint states used in linearization" - -typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - -typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -typedef ^ InitOutputType LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - -#typedef ^ InitOutputType LOGICAL RotFrame_z {:} - - "Flag that tells FAST/MBC3 if the constraint states used in linearization are in the rotating frame (not used for glue)" - -typedef ^ InitOutputType LOGICAL RotFrame_x {:} - - "Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame (not used for glue)" - -typedef ^ InitOutputType LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - -typedef ^ InitOutputType LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix)" - -typedef ^ InitOutputType IntKi DerivOrder_x {:} - - "Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization" - +typedef ^ InitOutputType ModVarsType Vars - - - "Module Variables" # ..... Blade Input file data........................................................................ typedef ^ BladeInputData IntKi station_total - - - "Number of blade input stations" @@ -59,12 +48,14 @@ typedef ^ BladeInputData IntKi format_index - - - #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv #the following are BDKi = R8Ki typedef ^ BladeInputData R8Ki station_eta {:} - - "Station location in eta [0,1]" -typedef ^ BladeInputData ^ stiff0 {:}{:}{:} - - "C/S stiffness matrix arrays" -typedef ^ BladeInputData ^ mass0 {:}{:}{:} - - "C/S mass matrix arrays" -typedef ^ BladeInputData ^ beta {6} - - "Damping Coefficient" - +typedef ^ BladeInputData R8Ki stiff0 {:}{:}{:} - - "C/S stiffness matrix arrays" +typedef ^ BladeInputData R8Ki mass0 {:}{:}{:} - - "C/S mass matrix arrays" +typedef ^ BladeInputData R8Ki beta {6} - - "Damping Coefficient" - +typedef ^ BladeInputData IntKi n_modes - - - "Number of modal damping coefficients" - +typedef ^ BladeInputData R8Ki zeta : - - "Modal damping coefficient array" - #end of BDKi-type variables #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -typedef ^ BladeInputData IntKi damp_flag - - - "Damping Flag: 0-No Damping, 1-Damped" +typedef ^ BladeInputData IntKi damp_flag - - - "Damping Flag: 0-No Damping, 1-Stiffness Prop. Damped, 2-Modal Damping" # ..... Input file data.............................................................................. @@ -83,7 +74,6 @@ typedef ^ BD_InputFile DbKi rhoinf - - - "Numeri typedef ^ BD_InputFile DbKi DTBeam - - - "Time interval for BeamDyn calculations {or default} (s)" - typedef ^ BD_InputFile BladeInputData InpBl - - - "Input data for individual blades" "see BladeInputData Type" typedef ^ BD_InputFile CHARACTER(1024) BldFile - - - "Name of blade input file" -typedef ^ BD_InputFile Logical UsePitchAct - - - "Whether to use a pitch actuator inside BeamDyn" (flag) typedef ^ BD_InputFile Logical QuasiStaticInit - - - "Use quasistatic pre-conditioning with centripetal accelerations in initialization (flag) [dynamic solve and enFAST only]" - #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv #the following are BDKi = R8Ki @@ -91,14 +81,10 @@ typedef ^ BD_InputFile R8Ki stop_tol - - - "Tolerance fo typedef ^ BD_InputFile ^ tngt_stf_pert - - - "Perturbation size for computing finite differenced tangent stiffness" - typedef ^ BD_InputFile ^ tngt_stf_difftol - - - "When comparing tangent stiffness matrix, stop simulation if error greater than this" - typedef ^ BD_InputFile ^ kp_coordinate {:}{:} - - "Key point coordinates array" - -typedef ^ BD_InputFile ^ pitchJ - - - "Pitch actuator inertia" (kg-m^2) -typedef ^ BD_InputFile ^ pitchK - - - "Pitch actuator stiffness" (kg-m^2/s^2) -typedef ^ BD_InputFile ^ pitchC - - - "Pitch actuator damping" - (kg-m^2/s) #end of BDKi-type variables #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ typedef ^ BD_InputFile Logical Echo - - - "Echo" - typedef ^ BD_InputFile Logical RotStates - .TRUE. - "Orient states in rotating frame during linearization? (flag)" - -typedef ^ BD_InputFile Logical RelStates - .FALSE. - "Define states relative to root motion during linearization? (flag)" - typedef ^ BD_InputFile Logical tngt_stf_fd - - - "Flag to compute tangent stifness matrix via finite difference" - typedef ^ BD_InputFile Logical tngt_stf_comp - - - "Flag to compare finite differenced and analytical tangent stifness" - typedef ^ BD_InputFile IntKi NNodeOuts - - - "Number of node outputs [0 - 9]" - @@ -126,9 +112,8 @@ typedef ^ ContinuousStateType ^ dqdt {:}{:} - - "dqdt - velocit #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Define discrete (nondifferentiable) states here: +typedef ^ BD_DiscreteStateType ReKi DummyDiscState - - - "A variable, Replace if you have discrete states" - #typedef ^ BD_DiscreteStateType ReKi rot {3} - - "For filter" - -typedef ^ BD_DiscreteStateType ReKi thetaP - - - "Pitch angle state" - -typedef ^ BD_DiscreteStateType ReKi thetaPD - - - "Pitch rate state" - # Define constraint states here: typedef ^ ConstraintStateType ReKi DummyConstrState - - - "A variable, Replace if you have constraint states" - @@ -181,6 +166,7 @@ typedef ^ ParameterType ^ blade_mass - - - typedef ^ ParameterType ^ blade_CG {3} - - "Blade center of gravity" - typedef ^ ParameterType ^ blade_IN {3}{3} - - "Blade Length" - typedef ^ ParameterType ^ beta {6} - - "Damping Coefficient" - +typedef ^ ParameterType ^ zeta {:} - - "Modal Damping Coefficients" - typedef ^ ParameterType ^ tol - - - "Tolerance used in stopping criterion" - typedef ^ ParameterType ^ QPtN {:} - - "Quadrature (QuadPt) point locations in natural frame [-1, 1]" - typedef ^ ParameterType ^ QPtWeight {:} - - "Weights at each quadrature point (QuadPt)" - @@ -217,11 +203,6 @@ typedef ^ ParameterType IntKi NdIndx {:} - - typedef ^ ParameterType IntKi NdIndxInverse {:} - - "Index from BldMotion mesh to unique nodes (to number the nodes for output without using collocated nodes)" - typedef ^ ParameterType IntKi OutNd2NdElem {:}{:} - - "To go from an output node number to a node/elem pair" - typedef ^ ParameterType CHARACTER(20) OutFmt - - - "Format specifier" - -typedef ^ ParameterType Logical UsePitchAct - - - "Whether to use a pitch actuator inside BeamDyn" (flag) -typedef ^ ParameterType ReKi pitchJ - - - "Pitch actuator inertia" (kg-m^2) -typedef ^ ParameterType ReKi pitchK - - - "Pitch actuator stiffness" (kg-m^2/s^2) -typedef ^ ParameterType ReKi pitchC - - - "Pitch actuator damping" - (kg-m^2/s) -typedef ^ ParameterType ReKi torqM {2}{2} - - "Pitch actuator matrix: (I-hA)^-1" - typedef ^ ParameterType qpParam qp - - - "Quadrature point info that does not change during simulation" - typedef ^ ParameterType IntKi qp_indx_offset - - - "Offset for computing index of the quadrature arrays (gauss skips the first [end-point] node)" - typedef ^ ParameterType IntKi BldMotionNodeLoc - - - "switch to determine where the nodes on the blade motion mesh should be located 1=FE (GLL) nodes; 2=quadrature nodes; 3=blade input stations" @@ -241,16 +222,11 @@ typedef ^ ParameterType ^ QPtw_ShpDer_ShpDer_Jac {:}{:}{:} typedef ^ ParameterType ^ QPtw_Shp_Jac {:}{:}{:} - - "optimization variable: QPtw_Shp_Jac(idx_qp,i,nelem) = p%Shp(i,idx_qp)*p%QPtWeight(idx_qp)*p%Jacobian(idx_qp,nelem)" - typedef ^ ParameterType ^ QPtw_ShpDer {:}{:} - - "optimization variable: QPtw_ShpDer(idx_qp,i) = p%ShpDer(i,idx_qp)*p%QPtWeight(idx_qp)" - typedef ^ ParameterType ^ FEweight {:}{:} - - "weighting factors for integrating local sectional loads" - - -typedef ^ ParameterType Integer Jac_u_indx {:}{:} - - "matrix to help fill/pack the u vector in computing the jacobian" - -typedef ^ ParameterType R8Ki du {:} - - "vector that determines size of perturbation for u (inputs)" -typedef ^ ParameterType R8Ki dx {6} - - "vector that determines size of perturbation for x (continuous states)" -typedef ^ ParameterType Integer Jac_ny - - - "number of outputs in jacobian matrix" - -typedef ^ ParameterType Integer Jac_nx - - - "half the number of continuous states in jacobian matrix" - 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" - +# .... arrays for modal damping ........................................................................................................ +typedef ^ ParameterType R8Ki ModalDampingMat {:}{:} - - "Modal damping matrix in the rotating frame" - # ..... Inputs @@ -259,7 +235,7 @@ typedef ^ ParameterType LOGICAL CompAppliedLdAtRoot - .FAL typedef ^ InputType MeshType RootMotion - - - "contains motion" - typedef ^ InputType MeshType PointLoad - - - "Applied point forces along beam axis" - typedef ^ InputType MeshType DistrLoad - - - "Applied distributed forces along beam axis" - -typedef ^ InputType MeshType HubMotion - - - "motion (orientation) at the hub" - + # ..... Outputs # ................................................................................................................... @@ -290,6 +266,7 @@ typedef ^ EqMotionQP ^ aaa ::: - - "Translatio typedef ^ EqMotionQP ^ RR0 :::: - - "Rotation tensor at current QP \\f$ \\left(\\underline{\\underline{R}}\\underline{\\underline{R}}_0\\right) \\f$" - typedef ^ EqMotionQP ^ kappa ::: - - "Curvature vector \\f$ \\underline{k} \\f$ at current QP (note this is not \\kappa, but a term in \\kappa)" - typedef ^ EqMotionQP ^ E1 ::: - - "\\vec{e_1} = x_0^\\prime + u^\\prime (3) at current QP" - +typedef ^ EqMotionQP ^ strain ::: - - "strain vector" - typedef ^ EqMotionQP ^ Stif :::: - - "C/S stiffness matrix resolved in inertial frame at current QP. 6x6" - typedef ^ EqMotionQP ^ Fb ::: - - "Gyroscopic forces at current QP. 6" - @@ -372,9 +349,16 @@ typedef ^ MiscVarType ^ LP_MassM_LU {:}{:} - - "M typedef ^ MiscVarType ^ LP_RHS {:} - - "Right-hand-side vector" - typedef ^ MiscVarType ^ LP_StifK_LU {:}{:} - - "Stiffness Matrix for LU" - typedef ^ MiscVarType ^ LP_RHS_LU {:} - - "Right-hand-side vector for LU" - +# Velocity array for modal damping calculation +typedef ^ MiscVarType ^ DampedVelocities {:} - - "Velocity vector for applying modal damping" - +typedef ^ MiscVarType ^ ModalDampingF {:} - - "Modal damping force in the modal damping matrix coordinates" - +typedef ^ MiscVarType ^ RotatedDamping {:}{:} - - "Rotated damping matrix for linearization at time step in GA2" - #end of BDKi-type variables #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ typedef ^ MiscVarType IntKi LP_indx {:} - - "Index vector for LU" - typedef ^ MiscVarType BD_InputType u - - - "Inputs converted to the internal BD coordinate system" - -typedef ^ MiscVarType BD_InputType u2 - - - "Inputs in the FAST coordinate system, possibly modified by pitch actuator" - - +typedef ^ MiscVarType ModJacType Jac - - - "Jacobian matrices and arrays corresponding to module variables" +typedef ^ MiscVarType BD_ContinuousStateType x_perturb - - - "" - +typedef ^ MiscVarType BD_ContinuousStateType dxdt_lin - - - "" - +typedef ^ MiscVarType BD_InputType u_perturb - - - "" - +typedef ^ MiscVarType BD_OutputType y_lin - - - "" - diff --git a/modules/beamdyn/tests/beamdyn_utest.F90 b/modules/beamdyn/tests/beamdyn_utest.F90 index f535668ad1..ee549641a0 100644 --- a/modules/beamdyn/tests/beamdyn_utest.F90 +++ b/modules/beamdyn/tests/beamdyn_utest.F90 @@ -34,7 +34,7 @@ program beamdyn_utest do is = 1, size(testsuites) write (error_unit, fmt) "Testing:", testsuites(is)%name - call run_testsuite(testsuites(is)%collect, error_unit, stat) + call run_testsuite(testsuites(is)%collect, error_unit, stat, parallel=.false.) end do if (stat > 0) then diff --git a/modules/beamdyn/tests/test_tools.F90 b/modules/beamdyn/tests/test_tools.F90 index 7030862c2d..f63b8e6614 100644 --- a/modules/beamdyn/tests/test_tools.F90 +++ b/modules/beamdyn/tests/test_tools.F90 @@ -351,10 +351,6 @@ type(BD_InputFile) function simpleInputFile() result(i) i%refine = 1 ! - - - "FE mesh refinement factor for trapezoidal quadrature" - i%rhoinf = 0.0 ! - - - "Numerical damping parameter for generalized-alpha integrator" - i%DTBeam = 2E-03 ! - - - "Time interval for BeamDyn calculations {or default} (s)" - - i%UsePitchAct = .false. ! - - - "Whether to use a pitch actuator inside BeamDyn" (flag) - i%pitchJ = 0.0 ! - - - "Pitch actuator inertia" (kg-m^2) - i%pitchK = 0.0 ! - - - "Pitch actuator stiffness" (kg-m^2/s^2) - i%pitchC = 0.0 ! - - - "Pitch actuator damping" - (kg-m^2/s) i%Echo = .true. ! - - - "Echo" i%NNodeOuts = 1 ! - - - "Number of node outputs [0 - 9]" - i%OutNd = 1 ! {9} - - "Nodes whose values will be output" - diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index a14c174504..f087c68256 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -62,9 +62,14 @@ MODULE ElastoDyn ! (Xd), and constraint-state (Z) equations all with respect to the constraint ! states (z) - PUBLIC :: ED_GetOP ! Routine to pack the operating point values (for linearization) into arrays + PUBLIC :: ED_PackExtInputAry ! Routine to pack extended inputs for linearization + + + PUBLIC :: ED_UpdateAzimuth + PUBLIC :: ED_UpdateBlPitch CONTAINS + !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the start of the simulation to perform initialization steps. !! The parameters are set here and not changed during the simulation. @@ -99,7 +104,8 @@ SUBROUTINE ED_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation INTEGER(IntKi) :: i, K ! loop counters CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - REAL(R8Ki) :: TransMat(3,3) ! Initial rotation matrix at Platform Refz + REAL(R8Ki) :: TransMat(3,3) ! Initial rotation matrix at Platform Refz + REAL(ReKi) :: TmpVec(3) ! Initialize variables for this routine @@ -293,12 +299,12 @@ SUBROUTINE ED_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut ! Platform reference point wrt to global origin (0,0,0) InitOut%PlatformPos = x%QT(1:6) - ! CALL SmllRotTrans('initial platform rotation', x%QT(4), x%QT(5), x%QT(6), TransMat, '', ErrStat2, ErrMsg2) TransMat = EulerConstructZYX((/x%QT(4),x%QT(5),x%QT(6)/)) + TmpVec = MATMUL((/p%PtfmRefxt,p%PtfmRefyt,p%PtfmRefzt/),TransMat) - InitOut%PlatformPos(1) = InitOut%PlatformPos(1) - TransMat(3,1)*p%PtfmRefzt - InitOut%PlatformPos(2) = InitOut%PlatformPos(2) - TransMat(3,2)*p%PtfmRefzt - InitOut%PlatformPos(3) = InitOut%PlatformPos(3) - TransMat(3,3)*p%PtfmRefzt + p%PtfmRefzt + InitOut%PlatformPos(1) = InitOut%PlatformPos(1) - TmpVec(1) + p%PtfmRefxt + InitOut%PlatformPos(2) = InitOut%PlatformPos(2) - TmpVec(2) + p%PtfmRefyt + InitOut%PlatformPos(3) = InitOut%PlatformPos(3) - TmpVec(3) + p%PtfmRefzt InitOut%HubHt = p%HubHt InitOut%TwrBaseRefPos = y%TowerLn2Mesh%Position(:,p%TwrNodes + 2) @@ -334,17 +340,6 @@ SUBROUTINE ED_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut IF (ErrStat >= AbortErrLev) RETURN InitOut%BlPitch = InputFileData%BlPitch(1:p%NumBl) - !............................................................................................ - ! set up data needed for linearization analysis - !............................................................................................ - - if (InitInp%Linearize .or. p%CompAeroMaps) then - call ED_Init_Jacobian(p, u, y, InitOut, ErrStat2, ErrMsg2) - call CheckError( ErrStat2, ErrMsg2 ) - if (ErrStat >= AbortErrLev) return - end if - - !............................................................................................ ! If you want to choose your own rate instead of using what the glue code suggests, tell the glue code the rate at which ! this module must be called here: @@ -352,6 +347,16 @@ SUBROUTINE ED_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut Interval = p%DT + !............................................................................................ + ! Module Variables + !............................................................................................ + + CALL ED_InitVars(u, p, x, y, m, InitOut%Vars, InputFileData, .true., ErrStat2, ErrMsg2) + CALL CheckError( ErrStat2, ErrMsg2 ) + + !............................................................................................ + ! Summary and cleanup + !............................................................................................ ! Print the summary file if requested: IF (InputFileData%SumPrint) THEN @@ -485,7 +490,7 @@ SUBROUTINE ED_UpdateStates( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - + INTEGER(IntKi) :: K ! Initialize ErrStat @@ -525,8 +530,48 @@ SUBROUTINE ED_UpdateStates( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat ! bjj: why don't we just do a modulo on x%QT(DOF_GeAz) instead of using x%QT(DOF_DrTr) with it? IF ( ( x%QT(DOF_GeAz) + x%QT(DOF_DrTr) ) >= TwoPi_D ) x%QT(DOF_GeAz) = x%QT(DOF_GeAz) - TwoPi_D + + DO K = 1,p%NumBl + IF ( p%DOF_Flag(DOF_BP(K)) ) THEN + IF ( x%QT(DOF_BP(K)) >= Pi_D ) THEN + x%QT(DOF_BP(K)) = x%QT(DOF_BP(K)) - TwoPi_D + ELSE IF ( x%QT(DOF_BP(K)) < -Pi_D ) THEN + x%QT(DOF_BP(K)) = x%QT(DOF_BP(K)) + TwoPi_D + END IF + END IF + END DO END SUBROUTINE ED_UpdateStates + +!> Limit azimuth to be between 0 and 2pi +SUBROUTINE ED_UpdateAzimuth(p, x, DT) + TYPE(ED_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(ED_ContinuousStateType), INTENT(INOUT) :: x + real(DbKi), INTENT(IN ) :: DT + + ! If the generator degree of freedom is not active, update the azimuth angle + IF (.not. p%DOF_Flag(DOF_GeAz)) x%QT(DOF_GeAz) = x%QT(DOF_GeAz) + DT*x%QDT(DOF_GeAz) + + ! If the azimuth is greater than 2pi, subtract 2pi + IF ((x%QT(DOF_GeAz) + x%QT(DOF_DrTr)) >= TwoPi_D) x%QT(DOF_GeAz) = x%QT(DOF_GeAz) - TwoPi_D +END SUBROUTINE + +SUBROUTINE ED_UpdateBlPitch(p, x) + TYPE(ED_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(ED_ContinuousStateType), INTENT(INOUT) :: x + INTEGER(IntKi) :: K + + DO K = 1,p%NumBl + IF ( p%DOF_Flag(DOF_BP(K)) ) THEN + IF ( x%QT(DOF_BP(K)) >= Pi_D ) THEN + x%QT(DOF_BP(K)) = x%QT(DOF_BP(K)) - TwoPi_D + ELSE IF ( x%QT(DOF_BP(K)) < -Pi_D ) THEN + x%QT(DOF_BP(K)) = x%QT(DOF_BP(K)) + TwoPi_D + END IF + END IF + END DO +END SUBROUTINE + !---------------------------------------------------------------------------------------------------------------------------------- !> Routine for computing outputs, used in both loose and tight coupling. !! This SUBROUTINE is used to compute the output channels (motions and loads) and place them in the WriteOutput() array. @@ -871,27 +916,48 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) END DO !K - ! Blade Pitch Motions: - m%AllOuts(PtchPMzc1) = u%BlPitchCom(1)*R2D -IF ( p%NumBl > 1 ) THEN - m%AllOuts(PtchPMzc2) = u%BlPitchCom(2)*R2D - IF ( p%NumBl > 2 ) THEN ! 3-blader + IF ( p%DOF_Flag(DOF_BP(1)) ) THEN + m%AllOuts(PtchPMzc1) = x%QT (DOF_BP(1))*R2D + m%AllOuts(BldPRate1) = x%QDT (DOF_BP(1))*R2D + m%AllOuts(BldPAcc1 ) = m%QD2T(DOF_BP(1))*R2D + ELSE + m%AllOuts(PtchPMzc1) = u%BlPitchCom(1)*R2D + END IF + + IF ( p%NumBl > 1_IntKi ) THEN + + IF ( p%DOF_Flag(DOF_BP(2)) ) THEN + m%AllOuts(PtchPMzc2) = x%QT (DOF_BP(2))*R2D + m%AllOuts(BldPRate2) = x%QDT (DOF_BP(2))*R2D + m%AllOuts(BldPAcc2 ) = m%QD2T(DOF_BP(2))*R2D + ELSE + m%AllOuts(PtchPMzc2) = u%BlPitchCom(2)*R2D + END IF - m%AllOuts(PtchPMzc3) = u%BlPitchCom(3)*R2D + IF ( p%NumBl > 2_IntKi ) THEN ! 3-blader - ELSE ! 2-blader + IF ( p%DOF_Flag(DOF_BP(3)) ) THEN + m%AllOuts(PtchPMzc3) = x%QT (DOF_BP(3))*R2D + m%AllOuts(BldPRate3) = x%QDT (DOF_BP(3))*R2D + m%AllOuts(BldPAcc3 ) = m%QD2T(DOF_BP(3))*R2D + ELSE + m%AllOuts(PtchPMzc3) = u%BlPitchCom(3)*R2D + END IF + ELSE ! 2-blader - ! Teeter Motions: + ! Teeter Motions: - m%AllOuts( TeetPya) = x%QT (DOF_Teet)*R2D - m%AllOuts( TeetVya) = x%QDT (DOF_Teet)*R2D - m%AllOuts( TeetAya) = m%QD2T(DOF_Teet)*R2D + m%AllOuts(TeetPya) = x%QT (DOF_Teet)*R2D + m%AllOuts(TeetVya) = x%QDT (DOF_Teet)*R2D + m%AllOuts(TeetAya) = m%QD2T(DOF_Teet)*R2D + + END IF + + END IF - ENDIF -END IF ! Shaft Motions: @@ -963,8 +1029,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! p%TwrNodes+1 is the tower top: J = p%TwrNodes+1 - m%AllOuts(TwrTpTDxi) = m%RtHS%rO(1) - y%TowerLn2Mesh%Position(1,J) - m%AllOuts(TwrTpTDyi) = -1.*m%RtHS%rO(3) - y%TowerLn2Mesh%Position(2,J) + m%AllOuts(TwrTpTDxi) = m%RtHS%rO(1) - y%TowerLn2Mesh%Position(1,J) + p%PtfmRefxt + m%AllOuts(TwrTpTDyi) = -1.*m%RtHS%rO(3) - y%TowerLn2Mesh%Position(2,J) + p%PtfmRefyt m%AllOuts(TwrTpTDzi) = m%RtHS%rO(2) - y%TowerLn2Mesh%Position(3,J) + p%PtfmRefzt m%AllOuts(YawBrTDxp) = DOT_PRODUCT( rOPO, m%CoordSys%b1 ) m%AllOuts(YawBrTDyp) = -DOT_PRODUCT( rOPO, m%CoordSys%b3 ) @@ -1015,8 +1081,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! m%AllOuts( TwHtRDzt(I) ) = DOT_PRODUCT( m%RtHS%AngPosXF(:,p%TwrGagNd(I)), m%CoordSys%a2 )*R2D !this will always be 0 in FAST, so no need to calculate - m%AllOuts( TwHtTPxi(I) ) = m%RtHS%rT(1,p%TwrGagNd(I)) - m%AllOuts( TwHtTPyi(I) ) = -1.0*m%RtHS%rT(3,p%TwrGagNd(I)) + m%AllOuts( TwHtTPxi(I) ) = m%RtHS%rT(1,p%TwrGagNd(I)) + p%PtfmRefxt + m%AllOuts( TwHtTPyi(I) ) = -1.0*m%RtHS%rT(3,p%TwrGagNd(I)) + p%PtfmRefyt m%AllOuts( TwHtTPzi(I) ) = m%RtHS%rT(2,p%TwrGagNd(I)) + p%PtfmRefzt ! m%AllOuts( TwHtRPxi(I) ) = m%RtHS%AngPosEF(1,p%TwrGagNd(I))*R2D @@ -1465,8 +1531,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) end if ! Translational Displacement (first calculate absolute position) - y%BladeLn2Mesh(K)%TranslationDisp(1,NodeNum) = m%RtHS%rS (1,K,J2) ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction - y%BladeLn2Mesh(K)%TranslationDisp(2,NodeNum) = -1.*m%RtHS%rS (3,K,J2) ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction + y%BladeLn2Mesh(K)%TranslationDisp(1,NodeNum) = m%RtHS%rS (1,K,J2) + p%PtfmRefxt ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction + y%BladeLn2Mesh(K)%TranslationDisp(2,NodeNum) = -1.*m%RtHS%rS (3,K,J2) + p%PtfmRefyt ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction y%BladeLn2Mesh(K)%TranslationDisp(3,NodeNum) = m%RtHS%rS (2,K,J2) + p%PtfmRefzt ! = the distance from the nominal tower base position (i.e., the undeflected position of the tower base) to the current blade node in the zi ( z2) direction ! Orientation @@ -1515,8 +1581,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !........... ! Translation (absolute position - starting position): - y%HubPtMotion%TranslationDisp(1,1) = m%RtHS%rQ(1) - y%HubPtMotion%TranslationDisp(2,1) = -1.*m%RtHS%rQ(3) + y%HubPtMotion%TranslationDisp(1,1) = m%RtHS%rQ(1) + p%PtfmRefxt + y%HubPtMotion%TranslationDisp(2,1) = -1.*m%RtHS%rQ(3) + p%PtfmRefyt y%HubPtMotion%TranslationDisp(3,1) = m%RtHS%rQ(2) + p%PtfmRefzt y%HubPtMotion%TranslationDisp = y%HubPtMotion%TranslationDisp - y%HubPtMotion%Position ! relative position @@ -1543,8 +1609,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) DO K=1,p%NumBl ! Translation displacement ! rS at the root - y%BladeRootMotion(K)%TranslationDisp(1,1) = m%RtHS%rS (1,K,0) ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction - y%BladeRootMotion(K)%TranslationDisp(2,1) = -1.*m%RtHS%rS (3,K,0) ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction + y%BladeRootMotion(K)%TranslationDisp(1,1) = m%RtHS%rS (1,K,0) + p%PtfmRefxt ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction + y%BladeRootMotion(K)%TranslationDisp(2,1) = -1.*m%RtHS%rS (3,K,0) + p%PtfmRefyt ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction y%BladeRootMotion(K)%TranslationDisp(3,1) = m%RtHS%rS (2,K,0) + p%PtfmRefzt ! = the distance from the nominal tower base position (i.e., the undeflected position of the tower base) to the current blade node in the zi ( z2) direction y%BladeRootMotion(K)%TranslationDisp = y%BladeRootMotion(K)%TranslationDisp - y%BladeRootMotion(K)%Position ! make it relative @@ -1566,9 +1632,9 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) y%BladeRootMotion(K)%TranslationVel(3,1) = m%RtHS%LinVelES(2,0,K) ! Rotation velocity - y%BladeRootMotion(K)%RotationVel(1,1) = m%RtHS%AngVelEH(1) - y%BladeRootMotion(K)%RotationVel(2,1) = -1.*m%RtHS%AngVelEH(3) - y%BladeRootMotion(K)%RotationVel(3,1) = m%RtHS%AngVelEH(2) + y%BladeRootMotion(K)%RotationVel(1,1) = m%RtHS%AngVelEM(1,0,K) + y%BladeRootMotion(K)%RotationVel(2,1) = -1.*m%RtHS%AngVelEM(3,0,K) + y%BladeRootMotion(K)%RotationVel(3,1) = m%RtHS%AngVelEM(2,0,K) ! Translation acceleration y%BladeRootMotion(K)%TranslationAcc(1,1) = LinAccES(1,0,K) @@ -1576,9 +1642,9 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) y%BladeRootMotion(K)%TranslationAcc(3,1) = LinAccES(2,0,K) ! Rotation acceleration - y%BladeRootMotion(K)%RotationAcc(1,1) = AngAccEH(1) - y%BladeRootMotion(K)%RotationAcc(2,1) = -1.*AngAccEH(3) - y%BladeRootMotion(K)%RotationAcc(3,1) = AngAccEH(2) + y%BladeRootMotion(K)%RotationAcc(1,1) = AngAccEK(1,0,K) + y%BladeRootMotion(K)%RotationAcc(2,1) = -1.*AngAccEK(3,0,K) + y%BladeRootMotion(K)%RotationAcc(3,1) = AngAccEK(2,0,K) END DO @@ -1587,8 +1653,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! TailFin : !........... ! Translation (absolute position - starting position): - y%TFinCMMotion%TranslationDisp(1,1) = m%RtHS%rJ(1) - y%TFinCMMotion%TranslationDisp(2,1) = -1.*m%RtHS%rJ(3) + y%TFinCMMotion%TranslationDisp(1,1) = m%RtHS%rJ(1) + p%PtfmRefxt + y%TFinCMMotion%TranslationDisp(2,1) = -1.*m%RtHS%rJ(3) + p%PtfmRefyt y%TFinCMMotion%TranslationDisp(3,1) = m%RtHS%rJ(2) + p%PtfmRefzt y%TFinCMMotion%TranslationDisp = y%TFinCMMotion%TranslationDisp - y%TFinCMMotion%Position ! Orientation: @@ -1616,8 +1682,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! Nacelle : !........... - y%NacelleMotion%TranslationDisp(1,1) = m%RtHS%rO(1) - y%NacelleMotion%TranslationDisp(2,1) = -1.*m%RtHS%rO(3) + y%NacelleMotion%TranslationDisp(1,1) = m%RtHS%rO(1) + p%PtfmRefxt + y%NacelleMotion%TranslationDisp(2,1) = -1.*m%RtHS%rO(3) + p%PtfmRefyt y%NacelleMotion%TranslationDisp(3,1) = m%RtHS%rO(2) + p%PtfmRefzt y%NacelleMotion%TranslationDisp = y%NacelleMotion%TranslationDisp - y%NacelleMotion%Position @@ -1696,8 +1762,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !............................................................................................................................... DO J=1,p%TwrNodes - y%TowerLn2Mesh%TranslationDisp(1,J) = m%RtHS%rT( 1,J) - y%TowerLn2Mesh%Position(1,J) - y%TowerLn2Mesh%TranslationDisp(2,J) = -1.*m%RtHS%rT( 3,J) - y%TowerLn2Mesh%Position(2,J) + y%TowerLn2Mesh%TranslationDisp(1,J) = m%RtHS%rT( 1,J) - y%TowerLn2Mesh%Position(1,J) + p%PtfmRefxt + y%TowerLn2Mesh%TranslationDisp(2,J) = -1.*m%RtHS%rT( 3,J) - y%TowerLn2Mesh%Position(2,J) + p%PtfmRefyt y%TowerLn2Mesh%TranslationDisp(3,J) = m%RtHS%rT( 2,J) - y%TowerLn2Mesh%Position(3,J) + p%PtfmRefzt y%TowerLn2Mesh%Orientation(1,1,J) = m%CoordSys%t1(J,1) @@ -1732,8 +1798,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! p%TwrNodes+1 is the tower top: J = p%TwrNodes+1 - y%TowerLn2Mesh%TranslationDisp(1,J) = m%RtHS%rO(1) - y%TowerLn2Mesh%Position(1,J) - y%TowerLn2Mesh%TranslationDisp(2,J) = -1.*m%RtHS%rO(3) - y%TowerLn2Mesh%Position(2,J) + y%TowerLn2Mesh%TranslationDisp(1,J) = m%RtHS%rO(1) - y%TowerLn2Mesh%Position(1,J) + p%PtfmRefxt + y%TowerLn2Mesh%TranslationDisp(2,J) = -1.*m%RtHS%rO(3) - y%TowerLn2Mesh%Position(2,J) + p%PtfmRefyt y%TowerLn2Mesh%TranslationDisp(3,J) = m%RtHS%rO(2) - y%TowerLn2Mesh%Position(3,J) + p%PtfmRefzt y%TowerLn2Mesh%Orientation(1,1,J) = m%CoordSys%b1(1) @@ -1766,8 +1832,8 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! p%TwrNodes+2 is the tower base: J = p%TwrNodes+2 - y%TowerLn2Mesh%TranslationDisp(1,J) = m%RtHS%rZ(1) + m%RtHS%rZT0(1) - y%TowerLn2Mesh%Position(1,J) - y%TowerLn2Mesh%TranslationDisp(2,J) = -1.*m%RtHS%rZ(3) - m%RtHS%rZT0(3) - y%TowerLn2Mesh%Position(2,J) + y%TowerLn2Mesh%TranslationDisp(1,J) = m%RtHS%rZ(1) + m%RtHS%rZT0(1) - y%TowerLn2Mesh%Position(1,J) + p%PtfmRefxt + y%TowerLn2Mesh%TranslationDisp(2,J) = -1.*m%RtHS%rZ(3) - m%RtHS%rZT0(3) - y%TowerLn2Mesh%Position(2,J) + p%PtfmRefyt y%TowerLn2Mesh%TranslationDisp(3,J) = m%RtHS%rZ(2) + m%RtHS%rZT0(2) - y%TowerLn2Mesh%Position(3,J) + p%PtfmRefzt y%TowerLn2Mesh%Orientation(1,1,J) = m%CoordSys%a1(1) @@ -1802,8 +1868,16 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) y%Yaw = x%QT( DOF_Yaw) y%YawRate = x%QDT(DOF_Yaw) - y%YawAngle = x%QT( DOF_Yaw) + x%QT(DOF_Y) !crude approximation for yaw error... (without subtracting it from the wind direction) - y%BlPitch = u%BlPitchCom !OtherState%BlPitch + y%YawAngle = x%QT( DOF_Yaw) + x%QT(DOF_Y) !crude approximation for yaw error... (without subtracting it from the wind direction) + DO K=1,p%NumBl + IF ( p%DOF_Flag(DOF_BP(K)) ) THEN + y%BlPRate(K) = x%QDT( DOF_BP(K) ) + y%BlPitch(K) = x%QT( DOF_BP(K) ) + ELSE + y%BlPRate(K) = 0.0_ReKi + y%BlPitch(K) = u%BlPitchCom(K) + END IF + END DO y%LSS_Spd = x%QDT(DOF_GeAz) y%HSS_Spd = ABS(p%GBRatio)*x%QDT(DOF_GeAz) y%RotSpeed = x%QDT(DOF_GeAz) + x%QDT(DOF_DrTr) @@ -1975,7 +2049,9 @@ SUBROUTINE ED_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrSta ENDDO ! I - All active (enabled) DOFs m%QD2T = dxdt%QDT - + + ! If computing AeroMaps, put accelerations where velocities would be located + if (p%CompAeroMaps) dxdt%QT = dxdt%QDT ! Let's calculate the sign (+/-1) of the low-speed shaft torque for this time step and store it in SgnPrvLSTQ. ! This will be used during the next call to RtHS (bjj: currently violates framework, but DOE wants a hack for HSS brake). @@ -2160,9 +2236,9 @@ SUBROUTINE Init_DOFparameters( InputFileData, p, ErrStat, ErrMsg ) ErrMsg = '' IF ( p%NumBl == 1 ) THEN - p%NDOF = 18 + p%NDOF = 19 ELSEIF ( p%NumBl == 2 ) THEN - p%NDOF = 22 + p%NDOF = 24 ELSE p%NDOF = ED_MaxDOFs ENDIF @@ -2187,6 +2263,10 @@ SUBROUTINE Init_DOFparameters( InputFileData, p, ErrStat, ErrMsg ) DO K = 1,p%NumBl + p%DOF_Flag( DOF_BP(K ) ) = InputFileData%PitchDOF + p%DOF_Desc( DOF_BP(K ) ) = 'Blade pitch DOF of blade '//TRIM(Num2LStr( K ))// & + ' (internal DOF index = DOF_BP(' //TRIM(Num2LStr( K ))//' )), rad' + p%DOF_Flag( DOF_BF(K,1) ) = InputFileData%FlapDOF1 p%DOF_Desc( DOF_BF(K,1) ) = '1st flapwise bending-mode DOF of blade '//TRIM(Num2LStr( K ))// & ' (internal DOF index = DOF_BF(' //TRIM(Num2LStr( K ))//',1)), m' @@ -2266,7 +2346,7 @@ SUBROUTINE Init_DOFparameters( InputFileData, p, ErrStat, ErrMsg ) !bjj was ALLOCATE ( p%DOFs%PSBE(p%NumBl,3), p%DOFs%PSE(p%NumBl,p%NDOF), STAT=ErrStat ) - ALLOCATE ( p%DOFs%PSBE(p%NumBl,(NumBE+NumBF)), p%DOFs%PSE(p%NumBl,p%NDOF), STAT=ErrStat ) + ALLOCATE ( p%DOFs%PSBE(p%NumBl,(1+NumBE+NumBF)), p%DOFs%PSE(p%NumBl,p%NDOF), STAT=ErrStat ) IF ( ErrStat /= 0 ) THEN CALL ExitThisRoutine( ErrID_Fatal, ' Could not allocate memory for the ActiveAOFs PSBE and PSE arrays.' ) RETURN @@ -2295,10 +2375,10 @@ SUBROUTINE Init_DOFparameters( InputFileData, p, ErrStat, ErrMsg ) IF ( p%NumBl == 2 ) THEN ! 2-blader p%NPH = 12 ! Number of DOFs that contribute to the angular velocity of the hub (body H) in the inertia frame. - p%NPM = 15 ! Number of DOFs that contribute to the angular velocity of the blade elements (body M) in the inertia frame. + p%NPM = 16 ! Number of DOFs that contribute to the angular velocity of the blade elements (body M) in the inertia frame. ELSE ! 3-blader p%NPH = 11 ! Number of DOFs that contribute to the angular velocity of the hub (body H) in the inertia frame. - p%NPM = 14 ! Number of DOFs that contribute to the angular velocity of the blade elements (body M) in the inertia frame. + p%NPM = 15 ! Number of DOFs that contribute to the angular velocity of the blade elements (body M) in the inertia frame. ENDIF @@ -2318,7 +2398,7 @@ SUBROUTINE Init_DOFparameters( InputFileData, p, ErrStat, ErrMsg ) ! Array of DOF indices (pointers) that contribute to the angular velocity of the blade elements (body M) in the inertia frame: DO K = 1,p%NumBl ! Loop through all blades p%PM(K,:) = (/ DOF_R, DOF_P, DOF_Y, DOF_TFA1, DOF_TSS1, DOF_TFA2, DOF_TSS2, DOF_Yaw, DOF_RFrl, DOF_GeAz, DOF_DrTr, & - DOF_Teet, DOF_BF(K,1) , DOF_BE(K,1) , DOF_BF(K,2) /) + DOF_Teet, DOF_BP(K) , DOF_BF(K,1) , DOF_BE(K,1) , DOF_BF(K,2) /) ENDDO ! K - All blades ELSE ! 3-blader @@ -2326,7 +2406,7 @@ SUBROUTINE Init_DOFparameters( InputFileData, p, ErrStat, ErrMsg ) ! Array of DOF indices (pointers) that contribute to the angular velocity of the blade elements (body M) in the inertia frame: DO K = 1,p%NumBl ! Loop through all blades p%PM(K,:) = (/ DOF_R, DOF_P, DOF_Y, DOF_TFA1, DOF_TSS1, DOF_TFA2, DOF_TSS2, DOF_Yaw, DOF_RFrl, DOF_GeAz, DOF_DrTr, & - DOF_BF(K,1) , DOF_BE(K,1) , DOF_BF(K,2) /) + DOF_BP(K) , DOF_BF(K,1) , DOF_BE(K,1) , DOF_BF(K,2) /) ENDDO ! K - All blades ENDIF @@ -2597,7 +2677,6 @@ SUBROUTINE SetBladeParameters( p, BladeInData, BladeMeshData, ErrStat, ErrMsg ) ! Input Interp Description ! ----- ------ ----------- ! BlFract RNodesNorm Fractional radius (0 at root, 1 at tip) - ! PitchAx PitchAxis Pitch axis (0 at LE, 1 at TE) ! StrcTwst ThetaS Structural twist ! BMassDen MassB Lineal mass density ! FlpStff StiffBF Flapwise stiffness @@ -2622,11 +2701,8 @@ SUBROUTINE SetBladeParameters( p, BladeInData, BladeMeshData, ErrStat, ErrMsg ) DO J=1,p%BldNodes ! Get the index into BlFract for all of the arrays, using the NWTC Subroutine Library - !p%ThetaS (K,J) = InterpStp( p%RNodesNorm(J), BladeInData(K)%BlFract, BladeInData(K)%StrcTwst, & - ! InterpInd, BladeInData(K)%NBlInpSt ) - p%PitchAxis(K,J) = InterpStp( p%RNodesNorm(J), BladeInData(K)%BlFract, BladeInData(K)%PitchAx, & - InterpInd, BladeInData(K)%NBlInpSt ) - + p%ThetaS (K,J) = InterpStp( p%RNodesNorm(J), BladeInData(K)%BlFract, BladeInData(K)%StrcTwst, & + InterpInd, BladeInData(K)%NBlInpSt ) ! The remaining arrays will have the same x value for the linear interpolation, ! so we'll do it manually (with a local subroutine) instead of calling the InterpStp routine again @@ -2638,7 +2714,6 @@ SUBROUTINE SetBladeParameters( p, BladeInData, BladeMeshData, ErrStat, ErrMsg ) ( BladeInData(K)%BlFract(InterpInd+1) - BladeInData(K)%BlFract(InterpInd) ) END IF - p%ThetaS (K,J) = InterpAry( x, BladeInData(K)%StrcTwst, InterpInd ) p%MassB (K,J) = InterpAry( x, BladeInData(K)%BMassDen, InterpInd ) p%StiffBF (K,J) = InterpAry( x, BladeInData(K)%FlpStff , InterpInd ) p%StiffBE (K,J) = InterpAry( x, BladeInData(K)%EdgStff , InterpInd ) @@ -2729,8 +2804,7 @@ SUBROUTINE Alloc_BladeParameters( p, ErrStat, ErrMsg ) ! Allocate arrays to hold blade data at the analysis nodes. CALL AllocAry ( p%RNodesNorm, p%BldNodes, 'RNodesNorm' , ErrStat, ErrMsg ); IF ( ErrStat /= ErrID_None ) RETURN - CALL AllocAry ( p%PitchAxis, p%NumBl, p%BldNodes, 'PitchAxis' , ErrStat, ErrMsg ); IF ( ErrStat /= ErrID_None ) RETURN - + ALLOCATE( p%ThetaS( p%NumBl,0:P%TipNode) & , p%CThetaS(p%NumBl,0:P%TipNode) & , p%SThetaS(p%NumBl,0:P%TipNode), STAT=ErrStat ) @@ -2842,8 +2916,6 @@ SUBROUTINE SetOtherParameters( p, InputFileData, ErrStat, ErrMsg ) CALL AllocAry( p%FreqBE, p%NumBl, NumBE, 3_IntKi, 'FreqBE', ErrStat, ErrMsg ); IF ( ErrStat /= ErrID_None ) RETURN CALL AllocAry( p%FreqBF, p%NumBl, NumBF, 3_IntKi, 'FreqBF', ErrStat, ErrMsg ); IF ( ErrStat /= ErrID_None ) RETURN CALL AllocAry( p%BldMass, p%NumBl, 'BldMass', ErrStat, ErrMsg ); IF ( ErrStat /= ErrID_None ) RETURN - CALL AllocAry( p%rSAerCenn1,p%NumBl,p%BldNodes, 'rSAerCenn1', ErrStat, ErrMsg ); IF ( ErrStat /= ErrID_None ) RETURN - CALL AllocAry( p%rSAerCenn2,p%NumBl,p%BldNodes, 'rSAerCenn2', ErrStat, ErrMsg ); IF ( ErrStat /= ErrID_None ) RETURN CALL AllocAry(p%BElmntMass, p%BldNodes, p%NumBl, 'BElmntMass', ErrStat, ErrMsg ); IF ( ErrStat /= ErrID_None ) RETURN CALL AllocAry(p%TElmntMass, p%TwrNodes, 'TElmntMass', ErrStat, ErrMsg ); IF ( ErrStat /= ErrID_None ) RETURN @@ -2902,7 +2974,6 @@ SUBROUTINE Alloc_RtHS( RtHS, p, ErrStat, ErrMsg ) !call AllocAry( RtHS%rS, Dims, p%NumBl,p%TipNode, 'rS', ErrStat2, ErrMsg2 ); if (Failed()) return; RtHS%rS = 0.0_ReKi call AllocAry( RtHS%rS0S, Dims, p%NumBl,p%TipNode, 'rS0S', ErrStat2, ErrMsg2 ); if (Failed()) return; RtHS%rS0S = 0.0_ReKi call AllocAry( RtHS%rPS0, Dims, p%NumBl, 'rPS0', ErrStat2, ErrMsg2 ); if (Failed()) return; RtHS%rPS0 = 0.0_ReKi - call AllocAry( RtHS%rSAerCen, Dims, p%TipNode, p%NumBl,'rSAerCen', ErrStat2, ErrMsg2 ); if (Failed()) return; RtHS%rSAerCen = 0.0_ReKi ! tower allocate(RtHS%rZT( Dims, 0:p%TwrNodes), STAT=ErrStat2); if (Failed0('rZT ')) return; RtHS%rZT = 0.0_ReKi @@ -3262,12 +3333,15 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message + INTEGER(IntKi) :: K + !bjj: ERROR CHECKING!!! ! Initialize error data ErrStat = ErrID_None ErrMsg = '' + !p%Twr2Shft = InputFileData%Twr2Shft !p%HubIner = InputFileData%HubIner !p%HubIner_Teeter = InputFileData%HubIner_Teeter @@ -3290,6 +3364,9 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) p%DT = InputFileData%DT p%OverHang = InputFileData%OverHang p%ShftGagL = InputFileData%ShftGagL + + p%PtfmRefxt = InputFileData%PtfmRefxt + p%PtfmRefyt = InputFileData%PtfmRefyt IF ( InitInp%MHK == MHK_FixedBottom ) THEN p%TowerHt = InputFileData%TowerHt - InitInp%WtrDpth p%TowerBsHt = InputFileData%TowerBsHt - InitInp%WtrDpth @@ -3365,12 +3442,23 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) CALL AllocAry( p%TipMass, p%NumBl, 'TipMass', ErrStat, ErrMsg ) IF ( ErrStat >= AbortErrLev ) RETURN - p%TipMass = InputFileData%TipMass + p%TipMass = InputFileData%TipMass(1:p%NumBl) + + CALL AllocAry( p%PitchIner, p%NumBl, 'PitchIner', ErrStat, ErrMsg ) + IF ( ErrStat >= AbortErrLev ) RETURN + p%PitchIner = InputFileData%PBrIner(1:p%NumBl) + IF (.not.p%BD4Blades) THEN + p%PitchIner = p%PitchIner + InputFileData%BlPIner(1:p%NumBl) + END IF ! initialize all of the DOF parameters: CALL Init_DOFparameters( InputFileData, p, ErrStat, ErrMsg ) !sets p%NDOF and p%NAug IF (ErrStat >= AbortErrLev) RETURN + DO K = 1,p%NumBl + IF ( .not.p%DOF_Flag(DOF_BP(K)) ) p%PitchIner(K) = 0.0_ReKi + END DO + ! Set parameters for output channels: CALL SetOutParam(InputFileData%OutList, p, ErrStat, ErrMsg ) ! requires: p%NumOuts, p%NumBl, p%NBlGages, p%NTwGages; sets: p%OutParam. IF (ErrStat >= AbortErrLev) RETURN @@ -3394,6 +3482,8 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) p%BldFlexL = p%TipRad - p%HubRad ! Length of the flexible portion of the blade. if (p%BD4Blades) p%BldFlexL = 0.0_ReKi + p%rZYxt = InputFileData%PtfmCMxt - p%PtfmRefxt + p%rZYyt = InputFileData%PtfmCMyt - p%PtfmRefyt IF ( InitInp%MHK == MHK_FixedBottom ) THEN p%rZYzt = InputFileData%PtfmCMzt - InitInp%WtrDpth - p%PtfmRefzt ELSE @@ -3515,10 +3605,11 @@ SUBROUTINE Init_ContStates( x, p, InputFileData, OtherState, ErrStat, ErrMsg ) InitQE1 = 0.0_ReKi END IF - + x%QT ( DOF_BP(1:p%NumBl ) ) = InputFileData%BlPitch(1:p%NumBl) x%QT ( DOF_BF(1:p%NumBl,1) ) = InitQF1 ! These come from InitBlDefl(). x%QT ( DOF_BF(1:p%NumBl,2) ) = InitQF2 ! These come from InitBlDefl(). x%QT ( DOF_BE(1:p%NumBl,1) ) = InitQE1 ! These come from InitBlDefl(). + x%QDT( DOF_BP(1:p%NumBl ) ) = 0.0 x%QDT( DOF_BF(1:p%NumBl,1) ) = 0.0 x%QDT( DOF_BF(1:p%NumBl,2) ) = 0.0 x%QDT( DOF_BE(1:p%NumBl,1) ) = 0.0 @@ -3768,369 +3859,395 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) LOGICAL :: InvalidOutput(0:MaxOutPts) ! This array determines if the output channel is valid for this configuration CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(1115) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "AZIMUTH ","BLDPITCH1 ","BLDPITCH2 ","BLDPITCH3 ","BLPITCH1 ","BLPITCH2 ","BLPITCH3 ", & - "DOMEGAYF ","GENACCEL ","GENSPEED ","HSSBRTQ ","HSSHFTA ","HSSHFTPWR ","HSSHFTTQ ", & - "HSSHFTV ","IPDEFL1 ","IPDEFL2 ","IPDEFL3 ","LSSGAGA ","LSSGAGAXA ","LSSGAGAXS ", & - "LSSGAGFXA ","LSSGAGFXS ","LSSGAGFYA ","LSSGAGFYS ","LSSGAGFZA ","LSSGAGFZS ","LSSGAGMXA ", & - "LSSGAGMXS ","LSSGAGMYA ","LSSGAGMYS ","LSSGAGMZA ","LSSGAGMZS ","LSSGAGP ","LSSGAGPXA ", & - "LSSGAGPXS ","LSSGAGV ","LSSGAGVXA ","LSSGAGVXS ","LSSHFTFXA ","LSSHFTFXS ","LSSHFTFYA ", & - "LSSHFTFYS ","LSSHFTFZA ","LSSHFTFZS ","LSSHFTMXA ","LSSHFTMXS ","LSSHFTPWR ","LSSHFTTQ ", & - "LSSTIPA ","LSSTIPAXA ","LSSTIPAXS ","LSSTIPMYA ","LSSTIPMYS ","LSSTIPMZA ","LSSTIPMZS ", & - "LSSTIPP ","LSSTIPPXA ","LSSTIPPXS ","LSSTIPV ","LSSTIPVXA ","LSSTIPVXS ","NACYAW ", & - "NACYAWA ","NACYAWP ","NACYAWV ","NCIMURAXS ","NCIMURAYS ","NCIMURAZS ","NCIMURVXS ", & - "NCIMURVYS ","NCIMURVZS ","NCIMUTAGXS","NCIMUTAGYS","NCIMUTAGZS","NCIMUTAXS ","NCIMUTAYS ", & - "NCIMUTAZS ","NCIMUTVXS ","NCIMUTVYS ","NCIMUTVZS ","OMEGAYF ","OOPDEFL1 ","OOPDEFL2 ", & - "OOPDEFL3 ","PTCHDEFL1 ","PTCHDEFL2 ","PTCHDEFL3 ","PTCHPMZB1 ","PTCHPMZB2 ","PTCHPMZB3 ", & - "PTCHPMZC1 ","PTCHPMZC2 ","PTCHPMZC3 ","PTFMHEAVE ","PTFMPITCH ","PTFMRAXI ","PTFMRAXT ", & - "PTFMRAYI ","PTFMRAYT ","PTFMRAZI ","PTFMRAZT ","PTFMRDXI ","PTFMRDYI ","PTFMRDZI ", & - "PTFMROLL ","PTFMRVXI ","PTFMRVXT ","PTFMRVYI ","PTFMRVYT ","PTFMRVZI ","PTFMRVZT ", & - "PTFMSURGE ","PTFMSWAY ","PTFMTAGXI ","PTFMTAGXT ","PTFMTAGYI ","PTFMTAGYT ","PTFMTAGZI ", & - "PTFMTAGZT ","PTFMTAXI ","PTFMTAXT ","PTFMTAYI ","PTFMTAYT ","PTFMTAZI ","PTFMTAZT ", & - "PTFMTDXI ","PTFMTDXT ","PTFMTDYI ","PTFMTDYT ","PTFMTDZI ","PTFMTDZT ","PTFMTVXI ", & - "PTFMTVXT ","PTFMTVYI ","PTFMTVYT ","PTFMTVZI ","PTFMTVZT ","PTFMYAW ","QD2_B1E1 ", & - "QD2_B1F1 ","QD2_B1F2 ","QD2_B2E1 ","QD2_B2F1 ","QD2_B2F2 ","QD2_B3E1 ","QD2_B3F1 ", & - "QD2_B3F2 ","QD2_DRTR ","QD2_GEAZ ","QD2_HV ","QD2_P ","QD2_R ","QD2_RFRL ", & - "QD2_SG ","QD2_SW ","QD2_TEET ","QD2_TFA1 ","QD2_TFA2 ","QD2_TFRL ","QD2_TSS1 ", & - "QD2_TSS2 ","QD2_Y ","QD2_YAW ","QD_B1E1 ","QD_B1F1 ","QD_B1F2 ","QD_B2E1 ", & - "QD_B2F1 ","QD_B2F2 ","QD_B3E1 ","QD_B3F1 ","QD_B3F2 ","QD_DRTR ","QD_GEAZ ", & - "QD_HV ","QD_P ","QD_R ","QD_RFRL ","QD_SG ","QD_SW ","QD_TEET ", & - "QD_TFA1 ","QD_TFA2 ","QD_TFRL ","QD_TSS1 ","QD_TSS2 ","QD_Y ","QD_YAW ", & - "Q_B1E1 ","Q_B1F1 ","Q_B1F2 ","Q_B2E1 ","Q_B2F1 ","Q_B2F2 ","Q_B3E1 ", & - "Q_B3F1 ","Q_B3F2 ","Q_DRTR ","Q_GEAZ ","Q_HV ","Q_P ","Q_R ", & - "Q_RFRL ","Q_SG ","Q_SW ","Q_TEET ","Q_TFA1 ","Q_TFA2 ","Q_TFRL ", & - "Q_TSS1 ","Q_TSS2 ","Q_Y ","Q_YAW ","RFRLBRM ","ROLLDEFL1 ","ROLLDEFL2 ", & - "ROLLDEFL3 ","ROOTFXB1 ","ROOTFXB2 ","ROOTFXB3 ","ROOTFXC1 ","ROOTFXC2 ","ROOTFXC3 ", & - "ROOTFYB1 ","ROOTFYB2 ","ROOTFYB3 ","ROOTFYC1 ","ROOTFYC2 ","ROOTFYC3 ","ROOTFZB1 ", & - "ROOTFZB2 ","ROOTFZB3 ","ROOTFZC1 ","ROOTFZC2 ","ROOTFZC3 ","ROOTMEDG1 ","ROOTMEDG2 ", & - "ROOTMEDG3 ","ROOTMFLP1 ","ROOTMFLP2 ","ROOTMFLP3 ","ROOTMIP1 ","ROOTMIP2 ","ROOTMIP3 ", & - "ROOTMOOP1 ","ROOTMOOP2 ","ROOTMOOP3 ","ROOTMXB1 ","ROOTMXB2 ","ROOTMXB3 ","ROOTMXC1 ", & - "ROOTMXC2 ","ROOTMXC3 ","ROOTMYB1 ","ROOTMYB2 ","ROOTMYB3 ","ROOTMYC1 ","ROOTMYC2 ", & - "ROOTMYC3 ","ROOTMZB1 ","ROOTMZB2 ","ROOTMZB3 ","ROOTMZC1 ","ROOTMZC2 ","ROOTMZC3 ", & - "ROTACCEL ","ROTFURL ","ROTFURLA ","ROTFURLP ","ROTFURLV ","ROTPWR ","ROTSPEED ", & - "ROTTEETA ","ROTTEETP ","ROTTEETV ","ROTTHRUST ","ROTTORQ ","SPN1ALGXB1","SPN1ALGXB2", & - "SPN1ALGXB3","SPN1ALGYB1","SPN1ALGYB2","SPN1ALGYB3","SPN1ALGZB1","SPN1ALGZB2","SPN1ALGZB3", & - "SPN1ALXB1 ","SPN1ALXB2 ","SPN1ALXB3 ","SPN1ALYB1 ","SPN1ALYB2 ","SPN1ALYB3 ","SPN1ALZB1 ", & - "SPN1ALZB2 ","SPN1ALZB3 ","SPN1FLXB1 ","SPN1FLXB2 ","SPN1FLXB3 ","SPN1FLYB1 ","SPN1FLYB2 ", & - "SPN1FLYB3 ","SPN1FLZB1 ","SPN1FLZB2 ","SPN1FLZB3 ","SPN1MLXB1 ","SPN1MLXB2 ","SPN1MLXB3 ", & - "SPN1MLYB1 ","SPN1MLYB2 ","SPN1MLYB3 ","SPN1MLZB1 ","SPN1MLZB2 ","SPN1MLZB3 ","SPN1RDXB1 ", & - "SPN1RDXB2 ","SPN1RDXB3 ","SPN1RDYB1 ","SPN1RDYB2 ","SPN1RDYB3 ","SPN1RDZB1 ","SPN1RDZB2 ", & - "SPN1RDZB3 ","SPN1TDXB1 ","SPN1TDXB2 ","SPN1TDXB3 ","SPN1TDYB1 ","SPN1TDYB2 ","SPN1TDYB3 ", & - "SPN1TDZB1 ","SPN1TDZB2 ","SPN1TDZB3 ","SPN2ALGXB1","SPN2ALGXB2","SPN2ALGXB3","SPN2ALGYB1", & - "SPN2ALGYB2","SPN2ALGYB3","SPN2ALGZB1","SPN2ALGZB2","SPN2ALGZB3","SPN2ALXB1 ","SPN2ALXB2 ", & - "SPN2ALXB3 ","SPN2ALYB1 ","SPN2ALYB2 ","SPN2ALYB3 ","SPN2ALZB1 ","SPN2ALZB2 ","SPN2ALZB3 ", & - "SPN2FLXB1 ","SPN2FLXB2 ","SPN2FLXB3 ","SPN2FLYB1 ","SPN2FLYB2 ","SPN2FLYB3 ","SPN2FLZB1 ", & - "SPN2FLZB2 ","SPN2FLZB3 ","SPN2MLXB1 ","SPN2MLXB2 ","SPN2MLXB3 ","SPN2MLYB1 ","SPN2MLYB2 ", & - "SPN2MLYB3 ","SPN2MLZB1 ","SPN2MLZB2 ","SPN2MLZB3 ","SPN2RDXB1 ","SPN2RDXB2 ","SPN2RDXB3 ", & - "SPN2RDYB1 ","SPN2RDYB2 ","SPN2RDYB3 ","SPN2RDZB1 ","SPN2RDZB2 ","SPN2RDZB3 ","SPN2TDXB1 ", & - "SPN2TDXB2 ","SPN2TDXB3 ","SPN2TDYB1 ","SPN2TDYB2 ","SPN2TDYB3 ","SPN2TDZB1 ","SPN2TDZB2 ", & - "SPN2TDZB3 ","SPN3ALGXB1","SPN3ALGXB2","SPN3ALGXB3","SPN3ALGYB1","SPN3ALGYB2","SPN3ALGYB3", & - "SPN3ALGZB1","SPN3ALGZB2","SPN3ALGZB3","SPN3ALXB1 ","SPN3ALXB2 ","SPN3ALXB3 ","SPN3ALYB1 ", & - "SPN3ALYB2 ","SPN3ALYB3 ","SPN3ALZB1 ","SPN3ALZB2 ","SPN3ALZB3 ","SPN3FLXB1 ","SPN3FLXB2 ", & - "SPN3FLXB3 ","SPN3FLYB1 ","SPN3FLYB2 ","SPN3FLYB3 ","SPN3FLZB1 ","SPN3FLZB2 ","SPN3FLZB3 ", & - "SPN3MLXB1 ","SPN3MLXB2 ","SPN3MLXB3 ","SPN3MLYB1 ","SPN3MLYB2 ","SPN3MLYB3 ","SPN3MLZB1 ", & - "SPN3MLZB2 ","SPN3MLZB3 ","SPN3RDXB1 ","SPN3RDXB2 ","SPN3RDXB3 ","SPN3RDYB1 ","SPN3RDYB2 ", & - "SPN3RDYB3 ","SPN3RDZB1 ","SPN3RDZB2 ","SPN3RDZB3 ","SPN3TDXB1 ","SPN3TDXB2 ","SPN3TDXB3 ", & - "SPN3TDYB1 ","SPN3TDYB2 ","SPN3TDYB3 ","SPN3TDZB1 ","SPN3TDZB2 ","SPN3TDZB3 ","SPN4ALGXB1", & - "SPN4ALGXB2","SPN4ALGXB3","SPN4ALGYB1","SPN4ALGYB2","SPN4ALGYB3","SPN4ALGZB1","SPN4ALGZB2", & - "SPN4ALGZB3","SPN4ALXB1 ","SPN4ALXB2 ","SPN4ALXB3 ","SPN4ALYB1 ","SPN4ALYB2 ","SPN4ALYB3 ", & - "SPN4ALZB1 ","SPN4ALZB2 ","SPN4ALZB3 ","SPN4FLXB1 ","SPN4FLXB2 ","SPN4FLXB3 ","SPN4FLYB1 ", & - "SPN4FLYB2 ","SPN4FLYB3 ","SPN4FLZB1 ","SPN4FLZB2 ","SPN4FLZB3 ","SPN4MLXB1 ","SPN4MLXB2 ", & - "SPN4MLXB3 ","SPN4MLYB1 ","SPN4MLYB2 ","SPN4MLYB3 ","SPN4MLZB1 ","SPN4MLZB2 ","SPN4MLZB3 ", & - "SPN4RDXB1 ","SPN4RDXB2 ","SPN4RDXB3 ","SPN4RDYB1 ","SPN4RDYB2 ","SPN4RDYB3 ","SPN4RDZB1 ", & - "SPN4RDZB2 ","SPN4RDZB3 ","SPN4TDXB1 ","SPN4TDXB2 ","SPN4TDXB3 ","SPN4TDYB1 ","SPN4TDYB2 ", & - "SPN4TDYB3 ","SPN4TDZB1 ","SPN4TDZB2 ","SPN4TDZB3 ","SPN5ALGXB1","SPN5ALGXB2","SPN5ALGXB3", & - "SPN5ALGYB1","SPN5ALGYB2","SPN5ALGYB3","SPN5ALGZB1","SPN5ALGZB2","SPN5ALGZB3","SPN5ALXB1 ", & - "SPN5ALXB2 ","SPN5ALXB3 ","SPN5ALYB1 ","SPN5ALYB2 ","SPN5ALYB3 ","SPN5ALZB1 ","SPN5ALZB2 ", & - "SPN5ALZB3 ","SPN5FLXB1 ","SPN5FLXB2 ","SPN5FLXB3 ","SPN5FLYB1 ","SPN5FLYB2 ","SPN5FLYB3 ", & - "SPN5FLZB1 ","SPN5FLZB2 ","SPN5FLZB3 ","SPN5MLXB1 ","SPN5MLXB2 ","SPN5MLXB3 ","SPN5MLYB1 ", & - "SPN5MLYB2 ","SPN5MLYB3 ","SPN5MLZB1 ","SPN5MLZB2 ","SPN5MLZB3 ","SPN5RDXB1 ","SPN5RDXB2 ", & - "SPN5RDXB3 ","SPN5RDYB1 ","SPN5RDYB2 ","SPN5RDYB3 ","SPN5RDZB1 ","SPN5RDZB2 ","SPN5RDZB3 ", & - "SPN5TDXB1 ","SPN5TDXB2 ","SPN5TDXB3 ","SPN5TDYB1 ","SPN5TDYB2 ","SPN5TDYB3 ","SPN5TDZB1 ", & - "SPN5TDZB2 ","SPN5TDZB3 ","SPN6ALGXB1","SPN6ALGXB2","SPN6ALGXB3","SPN6ALGYB1","SPN6ALGYB2", & - "SPN6ALGYB3","SPN6ALGZB1","SPN6ALGZB2","SPN6ALGZB3","SPN6ALXB1 ","SPN6ALXB2 ","SPN6ALXB3 ", & - "SPN6ALYB1 ","SPN6ALYB2 ","SPN6ALYB3 ","SPN6ALZB1 ","SPN6ALZB2 ","SPN6ALZB3 ","SPN6FLXB1 ", & - "SPN6FLXB2 ","SPN6FLXB3 ","SPN6FLYB1 ","SPN6FLYB2 ","SPN6FLYB3 ","SPN6FLZB1 ","SPN6FLZB2 ", & - "SPN6FLZB3 ","SPN6MLXB1 ","SPN6MLXB2 ","SPN6MLXB3 ","SPN6MLYB1 ","SPN6MLYB2 ","SPN6MLYB3 ", & - "SPN6MLZB1 ","SPN6MLZB2 ","SPN6MLZB3 ","SPN6RDXB1 ","SPN6RDXB2 ","SPN6RDXB3 ","SPN6RDYB1 ", & - "SPN6RDYB2 ","SPN6RDYB3 ","SPN6RDZB1 ","SPN6RDZB2 ","SPN6RDZB3 ","SPN6TDXB1 ","SPN6TDXB2 ", & - "SPN6TDXB3 ","SPN6TDYB1 ","SPN6TDYB2 ","SPN6TDYB3 ","SPN6TDZB1 ","SPN6TDZB2 ","SPN6TDZB3 ", & - "SPN7ALGXB1","SPN7ALGXB2","SPN7ALGXB3","SPN7ALGYB1","SPN7ALGYB2","SPN7ALGYB3","SPN7ALGZB1", & - "SPN7ALGZB2","SPN7ALGZB3","SPN7ALXB1 ","SPN7ALXB2 ","SPN7ALXB3 ","SPN7ALYB1 ","SPN7ALYB2 ", & - "SPN7ALYB3 ","SPN7ALZB1 ","SPN7ALZB2 ","SPN7ALZB3 ","SPN7FLXB1 ","SPN7FLXB2 ","SPN7FLXB3 ", & - "SPN7FLYB1 ","SPN7FLYB2 ","SPN7FLYB3 ","SPN7FLZB1 ","SPN7FLZB2 ","SPN7FLZB3 ","SPN7MLXB1 ", & - "SPN7MLXB2 ","SPN7MLXB3 ","SPN7MLYB1 ","SPN7MLYB2 ","SPN7MLYB3 ","SPN7MLZB1 ","SPN7MLZB2 ", & - "SPN7MLZB3 ","SPN7RDXB1 ","SPN7RDXB2 ","SPN7RDXB3 ","SPN7RDYB1 ","SPN7RDYB2 ","SPN7RDYB3 ", & - "SPN7RDZB1 ","SPN7RDZB2 ","SPN7RDZB3 ","SPN7TDXB1 ","SPN7TDXB2 ","SPN7TDXB3 ","SPN7TDYB1 ", & - "SPN7TDYB2 ","SPN7TDYB3 ","SPN7TDZB1 ","SPN7TDZB2 ","SPN7TDZB3 ","SPN8ALGXB1","SPN8ALGXB2", & - "SPN8ALGXB3","SPN8ALGYB1","SPN8ALGYB2","SPN8ALGYB3","SPN8ALGZB1","SPN8ALGZB2","SPN8ALGZB3", & - "SPN8ALXB1 ","SPN8ALXB2 ","SPN8ALXB3 ","SPN8ALYB1 ","SPN8ALYB2 ","SPN8ALYB3 ","SPN8ALZB1 ", & - "SPN8ALZB2 ","SPN8ALZB3 ","SPN8FLXB1 ","SPN8FLXB2 ","SPN8FLXB3 ","SPN8FLYB1 ","SPN8FLYB2 ", & - "SPN8FLYB3 ","SPN8FLZB1 ","SPN8FLZB2 ","SPN8FLZB3 ","SPN8MLXB1 ","SPN8MLXB2 ","SPN8MLXB3 ", & - "SPN8MLYB1 ","SPN8MLYB2 ","SPN8MLYB3 ","SPN8MLZB1 ","SPN8MLZB2 ","SPN8MLZB3 ","SPN8RDXB1 ", & - "SPN8RDXB2 ","SPN8RDXB3 ","SPN8RDYB1 ","SPN8RDYB2 ","SPN8RDYB3 ","SPN8RDZB1 ","SPN8RDZB2 ", & - "SPN8RDZB3 ","SPN8TDXB1 ","SPN8TDXB2 ","SPN8TDXB3 ","SPN8TDYB1 ","SPN8TDYB2 ","SPN8TDYB3 ", & - "SPN8TDZB1 ","SPN8TDZB2 ","SPN8TDZB3 ","SPN9ALGXB1","SPN9ALGXB2","SPN9ALGXB3","SPN9ALGYB1", & - "SPN9ALGYB2","SPN9ALGYB3","SPN9ALGZB1","SPN9ALGZB2","SPN9ALGZB3","SPN9ALXB1 ","SPN9ALXB2 ", & - "SPN9ALXB3 ","SPN9ALYB1 ","SPN9ALYB2 ","SPN9ALYB3 ","SPN9ALZB1 ","SPN9ALZB2 ","SPN9ALZB3 ", & - "SPN9FLXB1 ","SPN9FLXB2 ","SPN9FLXB3 ","SPN9FLYB1 ","SPN9FLYB2 ","SPN9FLYB3 ","SPN9FLZB1 ", & - "SPN9FLZB2 ","SPN9FLZB3 ","SPN9MLXB1 ","SPN9MLXB2 ","SPN9MLXB3 ","SPN9MLYB1 ","SPN9MLYB2 ", & - "SPN9MLYB3 ","SPN9MLZB1 ","SPN9MLZB2 ","SPN9MLZB3 ","SPN9RDXB1 ","SPN9RDXB2 ","SPN9RDXB3 ", & - "SPN9RDYB1 ","SPN9RDYB2 ","SPN9RDYB3 ","SPN9RDZB1 ","SPN9RDZB2 ","SPN9RDZB3 ","SPN9TDXB1 ", & - "SPN9TDXB2 ","SPN9TDXB3 ","SPN9TDYB1 ","SPN9TDYB2 ","SPN9TDYB3 ","SPN9TDZB1 ","SPN9TDZB2 ", & - "SPN9TDZB3 ","TAILFURL ","TAILFURLA ","TAILFURLP ","TAILFURLV ","TEETAYA ","TEETDEFL ", & - "TEETPYA ","TEETVYA ","TFRLBRM ","TIP2TWR1 ","TIP2TWR2 ","TIP2TWR3 ","TIPALGXB1 ", & - "TIPALGXB2 ","TIPALGXB3 ","TIPALGYB1 ","TIPALGYB2 ","TIPALGYB3 ","TIPALGZB1 ","TIPALGZB2 ", & - "TIPALGZB3 ","TIPALXB1 ","TIPALXB2 ","TIPALXB3 ","TIPALYB1 ","TIPALYB2 ","TIPALYB3 ", & - "TIPALZB1 ","TIPALZB2 ","TIPALZB3 ","TIPCLRNC1 ","TIPCLRNC2 ","TIPCLRNC3 ","TIPDXB1 ", & - "TIPDXB2 ","TIPDXB3 ","TIPDXC1 ","TIPDXC2 ","TIPDXC3 ","TIPDYB1 ","TIPDYB2 ", & - "TIPDYB3 ","TIPDYC1 ","TIPDYC2 ","TIPDYC3 ","TIPDZB1 ","TIPDZB2 ","TIPDZB3 ", & - "TIPDZC1 ","TIPDZC2 ","TIPDZC3 ","TIPRDXB1 ","TIPRDXB2 ","TIPRDXB3 ","TIPRDYB1 ", & - "TIPRDYB2 ","TIPRDYB3 ","TIPRDZB1 ","TIPRDZB2 ","TIPRDZB3 ","TIPRDZC1 ","TIPRDZC2 ", & - "TIPRDZC3 ","TTDSPAX ","TTDSPFA ","TTDSPPTCH ","TTDSPROLL ","TTDSPSS ","TTDSPTWST ", & - "TWHT1ALGXT","TWHT1ALGYT","TWHT1ALGZT","TWHT1ALXT ","TWHT1ALYT ","TWHT1ALZT ","TWHT1FLXT ", & - "TWHT1FLYT ","TWHT1FLZT ","TWHT1MLXT ","TWHT1MLYT ","TWHT1MLZT ","TWHT1RDXT ","TWHT1RDYT ", & - "TWHT1RDZT ","TWHT1RPXI ","TWHT1RPYI ","TWHT1RPZI ","TWHT1TDXT ","TWHT1TDYT ","TWHT1TDZT ", & - "TWHT1TPXI ","TWHT1TPYI ","TWHT1TPZI ","TWHT2ALGXT","TWHT2ALGYT","TWHT2ALGZT","TWHT2ALXT ", & - "TWHT2ALYT ","TWHT2ALZT ","TWHT2FLXT ","TWHT2FLYT ","TWHT2FLZT ","TWHT2MLXT ","TWHT2MLYT ", & - "TWHT2MLZT ","TWHT2RDXT ","TWHT2RDYT ","TWHT2RDZT ","TWHT2RPXI ","TWHT2RPYI ","TWHT2RPZI ", & - "TWHT2TDXT ","TWHT2TDYT ","TWHT2TDZT ","TWHT2TPXI ","TWHT2TPYI ","TWHT2TPZI ","TWHT3ALGXT", & - "TWHT3ALGYT","TWHT3ALGZT","TWHT3ALXT ","TWHT3ALYT ","TWHT3ALZT ","TWHT3FLXT ","TWHT3FLYT ", & - "TWHT3FLZT ","TWHT3MLXT ","TWHT3MLYT ","TWHT3MLZT ","TWHT3RDXT ","TWHT3RDYT ","TWHT3RDZT ", & - "TWHT3RPXI ","TWHT3RPYI ","TWHT3RPZI ","TWHT3TDXT ","TWHT3TDYT ","TWHT3TDZT ","TWHT3TPXI ", & - "TWHT3TPYI ","TWHT3TPZI ","TWHT4ALGXT","TWHT4ALGYT","TWHT4ALGZT","TWHT4ALXT ","TWHT4ALYT ", & - "TWHT4ALZT ","TWHT4FLXT ","TWHT4FLYT ","TWHT4FLZT ","TWHT4MLXT ","TWHT4MLYT ","TWHT4MLZT ", & - "TWHT4RDXT ","TWHT4RDYT ","TWHT4RDZT ","TWHT4RPXI ","TWHT4RPYI ","TWHT4RPZI ","TWHT4TDXT ", & - "TWHT4TDYT ","TWHT4TDZT ","TWHT4TPXI ","TWHT4TPYI ","TWHT4TPZI ","TWHT5ALGXT","TWHT5ALGYT", & - "TWHT5ALGZT","TWHT5ALXT ","TWHT5ALYT ","TWHT5ALZT ","TWHT5FLXT ","TWHT5FLYT ","TWHT5FLZT ", & - "TWHT5MLXT ","TWHT5MLYT ","TWHT5MLZT ","TWHT5RDXT ","TWHT5RDYT ","TWHT5RDZT ","TWHT5RPXI ", & - "TWHT5RPYI ","TWHT5RPZI ","TWHT5TDXT ","TWHT5TDYT ","TWHT5TDZT ","TWHT5TPXI ","TWHT5TPYI ", & - "TWHT5TPZI ","TWHT6ALGXT","TWHT6ALGYT","TWHT6ALGZT","TWHT6ALXT ","TWHT6ALYT ","TWHT6ALZT ", & - "TWHT6FLXT ","TWHT6FLYT ","TWHT6FLZT ","TWHT6MLXT ","TWHT6MLYT ","TWHT6MLZT ","TWHT6RDXT ", & - "TWHT6RDYT ","TWHT6RDZT ","TWHT6RPXI ","TWHT6RPYI ","TWHT6RPZI ","TWHT6TDXT ","TWHT6TDYT ", & - "TWHT6TDZT ","TWHT6TPXI ","TWHT6TPYI ","TWHT6TPZI ","TWHT7ALGXT","TWHT7ALGYT","TWHT7ALGZT", & - "TWHT7ALXT ","TWHT7ALYT ","TWHT7ALZT ","TWHT7FLXT ","TWHT7FLYT ","TWHT7FLZT ","TWHT7MLXT ", & - "TWHT7MLYT ","TWHT7MLZT ","TWHT7RDXT ","TWHT7RDYT ","TWHT7RDZT ","TWHT7RPXI ","TWHT7RPYI ", & - "TWHT7RPZI ","TWHT7TDXT ","TWHT7TDYT ","TWHT7TDZT ","TWHT7TPXI ","TWHT7TPYI ","TWHT7TPZI ", & - "TWHT8ALGXT","TWHT8ALGYT","TWHT8ALGZT","TWHT8ALXT ","TWHT8ALYT ","TWHT8ALZT ","TWHT8FLXT ", & - "TWHT8FLYT ","TWHT8FLZT ","TWHT8MLXT ","TWHT8MLYT ","TWHT8MLZT ","TWHT8RDXT ","TWHT8RDYT ", & - "TWHT8RDZT ","TWHT8RPXI ","TWHT8RPYI ","TWHT8RPZI ","TWHT8TDXT ","TWHT8TDYT ","TWHT8TDZT ", & - "TWHT8TPXI ","TWHT8TPYI ","TWHT8TPZI ","TWHT9ALGXT","TWHT9ALGYT","TWHT9ALGZT","TWHT9ALXT ", & - "TWHT9ALYT ","TWHT9ALZT ","TWHT9FLXT ","TWHT9FLYT ","TWHT9FLZT ","TWHT9MLXT ","TWHT9MLYT ", & - "TWHT9MLZT ","TWHT9RDXT ","TWHT9RDYT ","TWHT9RDZT ","TWHT9RPXI ","TWHT9RPYI ","TWHT9RPZI ", & - "TWHT9TDXT ","TWHT9TDYT ","TWHT9TDZT ","TWHT9TPXI ","TWHT9TPYI ","TWHT9TPZI ","TWRBSFXT ", & - "TWRBSFYT ","TWRBSFZT ","TWRBSMXT ","TWRBSMYT ","TWRBSMZT ","TWRCLRNC1 ","TWRCLRNC2 ", & - "TWRCLRNC3 ","TWRTPTDXI ","TWRTPTDYI ","TWRTPTDZI ","TWSTDEFL1 ","TWSTDEFL2 ","TWSTDEFL3 ", & - "YAWACCEL ","YAWAZN ","YAWAZP ","YAWBRFXN ","YAWBRFXP ","YAWBRFYN ","YAWBRFYP ", & - "YAWBRFZN ","YAWBRFZP ","YAWBRMXN ","YAWBRMXP ","YAWBRMYN ","YAWBRMYP ","YAWBRMZN ", & - "YAWBRMZP ","YAWBRRAXP ","YAWBRRAYP ","YAWBRRAZP ","YAWBRRDXT ","YAWBRRDYT ","YAWBRRDZT ", & - "YAWBRRVXP ","YAWBRRVYP ","YAWBRRVZP ","YAWBRTAGXP","YAWBRTAGYP","YAWBRTAGZP","YAWBRTAXP ", & - "YAWBRTAYP ","YAWBRTAZP ","YAWBRTDXI ","YAWBRTDXP ","YAWBRTDXT ","YAWBRTDYI ","YAWBRTDYP ", & - "YAWBRTDYT ","YAWBRTDZI ","YAWBRTDZP ","YAWBRTDZT ","YAWBRTVXP ","YAWBRTVYP ","YAWBRTVZP ", & - "YAWFRIMFP ","YAWFRIMOM ","YAWFRIMZ ","YAWPOS ","YAWPZN ","YAWPZP ","YAWRATE ", & - "YAWVZN ","YAWVZP "/) - INTEGER(IntKi), PARAMETER :: ParamIndxAry(1115) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - LSSTipPxa , PtchPMzc1 , PtchPMzc2 , PtchPMzc3 , PtchPMzc1 , PtchPMzc2 , PtchPMzc3 , & - dOmegaYF , HSShftA , HSShftV , HSSBrTq , HSShftA , HSShftPwr , HSShftTq , & - HSShftV , TipDyc1 , TipDyc2 , TipDyc3 , LSSGagAxa , LSSGagAxa , LSSGagAxa , & - LSShftFxa , LSShftFxa , LSShftFya , LSShftFys , LSShftFza , LSShftFzs , LSShftMxa , & - LSShftMxa , LSSGagMya , LSSGagMys , LSSGagMza , LSSGagMzs , LSSGagPxa , LSSGagPxa , & - LSSGagPxa , LSSGagVxa , LSSGagVxa , LSSGagVxa , LSShftFxa , LSShftFxa , LSShftFya , & - LSShftFys , LSShftFza , LSShftFzs , LSShftMxa , LSShftMxa , RotPwr , LSShftMxa , & - LSSTipAxa , LSSTipAxa , LSSTipAxa , LSSTipMya , LSSTipMys , LSSTipMza , LSSTipMzs , & - LSSTipPxa , LSSTipPxa , LSSTipPxa , LSSTipVxa , LSSTipVxa , LSSTipVxa , YawPzn , & - YawAzn , YawPzn , YawVzn , NcIMURAxs , NcIMURAys , NcIMURAzs , NcIMURVxs , & - NcIMURVys , NcIMURVzs , NcIMUTAgxs , NcIMUTAgys , NcIMUTAgzs , NcIMUTAxs , NcIMUTAys , & - NcIMUTAzs , NcIMUTVxs , NcIMUTVys , NcIMUTVzs , OmegaYF , TipDxc1 , TipDxc2 , & - TipDxc3 , TipRDyb1 , TipRDyb2 , TipRDyb3 , PtchPMzc1 , PtchPMzc2 , PtchPMzc3 , & - PtchPMzc1 , PtchPMzc2 , PtchPMzc3 , PtfmTDzi , PtfmRDyi , PtfmRAxi , PtfmRAxt , & - PtfmRAyi , PtfmRAyt , PtfmRAzi , PtfmRAzt , PtfmRDxi , PtfmRDyi , PtfmRDzi , & - PtfmRDxi , PtfmRVxi , PtfmRVxt , PtfmRVyi , PtfmRVyt , PtfmRVzi , PtfmRVzt , & - PtfmTDxi , PtfmTDyi , PtfmTAgxi , PtfmTAgxt , PtfmTAgyi , PtfmTAgyt , PtfmTAgzi , & - PtfmTAgzt , PtfmTAxi , PtfmTAxt , PtfmTAyi , PtfmTAyt , PtfmTAzi , PtfmTAzt , & - PtfmTDxi , PtfmTDxt , PtfmTDyi , PtfmTDyt , PtfmTDzi , PtfmTDzt , PtfmTVxi , & - PtfmTVxt , PtfmTVyi , PtfmTVyt , PtfmTVzi , PtfmTVzt , PtfmRDzi , QD2_B1E1 , & - QD2_B1F1 , QD2_B1F2 , QD2_B2E1 , QD2_B2F1 , QD2_B2F2 , QD2_B3E1 , QD2_B3F1 , & - QD2_B3F2 , QD2_DrTr , QD2_GeAz , QD2_Hv , QD2_P , QD2_R , QD2_RFrl , & - QD2_Sg , QD2_Sw , QD2_Teet , QD2_TFA1 , QD2_TFA2 , QD2_TFrl , QD2_TSS1 , & - QD2_TSS2 , QD2_Y , QD2_Yaw , QD_B1E1 , QD_B1F1 , QD_B1F2 , QD_B2E1 , & - QD_B2F1 , QD_B2F2 , QD_B3E1 , QD_B3F1 , QD_B3F2 , QD_DrTr , QD_GeAz , & - QD_Hv , QD_P , QD_R , QD_RFrl , QD_Sg , QD_Sw , QD_Teet , & - QD_TFA1 , QD_TFA2 , QD_TFrl , QD_TSS1 , QD_TSS2 , QD_Y , QD_Yaw , & - Q_B1E1 , Q_B1F1 , Q_B1F2 , Q_B2E1 , Q_B2F1 , Q_B2F2 , Q_B3E1 , & - Q_B3F1 , Q_B3F2 , Q_DrTr , Q_GeAz , Q_Hv , Q_P , Q_R , & - Q_RFrl , Q_Sg , Q_Sw , Q_Teet , Q_TFA1 , Q_TFA2 , Q_TFrl , & - Q_TSS1 , Q_TSS2 , Q_Y , Q_Yaw , RFrlBrM , TipRDxb1 , TipRDxb2 , & - TipRDxb3 , RootFxb1 , RootFxb2 , RootFxb3 , RootFxc1 , RootFxc2 , RootFxc3 , & - RootFyb1 , RootFyb2 , RootFyb3 , RootFyc1 , RootFyc2 , RootFyc3 , RootFzc1 , & - RootFzc2 , RootFzc3 , RootFzc1 , RootFzc2 , RootFzc3 , RootMxb1 , RootMxb2 , & - RootMxb3 , RootMyb1 , RootMyb2 , RootMyb3 , RootMxc1 , RootMxc2 , RootMxc3 , & - RootMyc1 , RootMyc2 , RootMyc3 , RootMxb1 , RootMxb2 , RootMxb3 , RootMxc1 , & - RootMxc2 , RootMxc3 , RootMyb1 , RootMyb2 , RootMyb3 , RootMyc1 , RootMyc2 , & - RootMyc3 , RootMzc1 , RootMzc2 , RootMzc3 , RootMzc1 , RootMzc2 , RootMzc3 , & - LSSTipAxa , RotFurlP , RotFurlA , RotFurlP , RotFurlV , RotPwr , LSSTipVxa , & - TeetAya , TeetPya , TeetVya , LSShftFxa , LSShftMxa , Spn1ALgxb1 , Spn1ALgxb2 , & - Spn1ALgxb3 , Spn1ALgyb1 , Spn1ALgyb2 , Spn1ALgyb3 , Spn1ALgzb1 , Spn1ALgzb2 , Spn1ALgzb3 , & - Spn1ALxb1 , Spn1ALxb2 , Spn1ALxb3 , Spn1ALyb1 , Spn1ALyb2 , Spn1ALyb3 , Spn1ALzb1 , & - Spn1ALzb2 , Spn1ALzb3 , Spn1FLxb1 , Spn1FLxb2 , Spn1FLxb3 , Spn1FLyb1 , Spn1FLyb2 , & - Spn1FLyb3 , Spn1FLzb1 , Spn1FLzb2 , Spn1FLzb3 , Spn1MLxb1 , Spn1MLxb2 , Spn1MLxb3 , & - Spn1MLyb1 , Spn1MLyb2 , Spn1MLyb3 , Spn1MLzb1 , Spn1MLzb2 , Spn1MLzb3 , Spn1RDxb1 , & - Spn1RDxb2 , Spn1RDxb3 , Spn1RDyb1 , Spn1RDyb2 , Spn1RDyb3 , Spn1RDzb1 , Spn1RDzb2 , & - Spn1RDzb3 , Spn1TDxb1 , Spn1TDxb2 , Spn1TDxb3 , Spn1TDyb1 , Spn1TDyb2 , Spn1TDyb3 , & - Spn1TDzb1 , Spn1TDzb2 , Spn1TDzb3 , Spn2ALgxb1 , Spn2ALgxb2 , Spn2ALgxb3 , Spn2ALgyb1 , & - Spn2ALgyb2 , Spn2ALgyb3 , Spn2ALgzb1 , Spn2ALgzb2 , Spn2ALgzb3 , Spn2ALxb1 , Spn2ALxb2 , & - Spn2ALxb3 , Spn2ALyb1 , Spn2ALyb2 , Spn2ALyb3 , Spn2ALzb1 , Spn2ALzb2 , Spn2ALzb3 , & - Spn2FLxb1 , Spn2FLxb2 , Spn2FLxb3 , Spn2FLyb1 , Spn2FLyb2 , Spn2FLyb3 , Spn2FLzb1 , & - Spn2FLzb2 , Spn2FLzb3 , Spn2MLxb1 , Spn2MLxb2 , Spn2MLxb3 , Spn2MLyb1 , Spn2MLyb2 , & - Spn2MLyb3 , Spn2MLzb1 , Spn2MLzb2 , Spn2MLzb3 , Spn2RDxb1 , Spn2RDxb2 , Spn2RDxb3 , & - Spn2RDyb1 , Spn2RDyb2 , Spn2RDyb3 , Spn2RDzb1 , Spn2RDzb2 , Spn2RDzb3 , Spn2TDxb1 , & - Spn2TDxb2 , Spn2TDxb3 , Spn2TDyb1 , Spn2TDyb2 , Spn2TDyb3 , Spn2TDzb1 , Spn2TDzb2 , & - Spn2TDzb3 , Spn3ALgxb1 , Spn3ALgxb2 , Spn3ALgxb3 , Spn3ALgyb1 , Spn3ALgyb2 , Spn3ALgyb3 , & - Spn3ALgzb1 , Spn3ALgzb2 , Spn3ALgzb3 , Spn3ALxb1 , Spn3ALxb2 , Spn3ALxb3 , Spn3ALyb1 , & - Spn3ALyb2 , Spn3ALyb3 , Spn3ALzb1 , Spn3ALzb2 , Spn3ALzb3 , Spn3FLxb1 , Spn3FLxb2 , & - Spn3FLxb3 , Spn3FLyb1 , Spn3FLyb2 , Spn3FLyb3 , Spn3FLzb1 , Spn3FLzb2 , Spn3FLzb3 , & - Spn3MLxb1 , Spn3MLxb2 , Spn3MLxb3 , Spn3MLyb1 , Spn3MLyb2 , Spn3MLyb3 , Spn3MLzb1 , & - Spn3MLzb2 , Spn3MLzb3 , Spn3RDxb1 , Spn3RDxb2 , Spn3RDxb3 , Spn3RDyb1 , Spn3RDyb2 , & - Spn3RDyb3 , Spn3RDzb1 , Spn3RDzb2 , Spn3RDzb3 , Spn3TDxb1 , Spn3TDxb2 , Spn3TDxb3 , & - Spn3TDyb1 , Spn3TDyb2 , Spn3TDyb3 , Spn3TDzb1 , Spn3TDzb2 , Spn3TDzb3 , Spn4ALgxb1 , & - Spn4ALgxb2 , Spn4ALgxb3 , Spn4ALgyb1 , Spn4ALgyb2 , Spn4ALgyb3 , Spn4ALgzb1 , Spn4ALgzb2 , & - Spn4ALgzb3 , Spn4ALxb1 , Spn4ALxb2 , Spn4ALxb3 , Spn4ALyb1 , Spn4ALyb2 , Spn4ALyb3 , & - Spn4ALzb1 , Spn4ALzb2 , Spn4ALzb3 , Spn4FLxb1 , Spn4FLxb2 , Spn4FLxb3 , Spn4FLyb1 , & - Spn4FLyb2 , Spn4FLyb3 , Spn4FLzb1 , Spn4FLzb2 , Spn4FLzb3 , Spn4MLxb1 , Spn4MLxb2 , & - Spn4MLxb3 , Spn4MLyb1 , Spn4MLyb2 , Spn4MLyb3 , Spn4MLzb1 , Spn4MLzb2 , Spn4MLzb3 , & - Spn4RDxb1 , Spn4RDxb2 , Spn4RDxb3 , Spn4RDyb1 , Spn4RDyb2 , Spn4RDyb3 , Spn4RDzb1 , & - Spn4RDzb2 , Spn4RDzb3 , Spn4TDxb1 , Spn4TDxb2 , Spn4TDxb3 , Spn4TDyb1 , Spn4TDyb2 , & - Spn4TDyb3 , Spn4TDzb1 , Spn4TDzb2 , Spn4TDzb3 , Spn5ALgxb1 , Spn5ALgxb2 , Spn5ALgxb3 , & - Spn5ALgyb1 , Spn5ALgyb2 , Spn5ALgyb3 , Spn5ALgzb1 , Spn5ALgzb2 , Spn5ALgzb3 , Spn5ALxb1 , & - Spn5ALxb2 , Spn5ALxb3 , Spn5ALyb1 , Spn5ALyb2 , Spn5ALyb3 , Spn5ALzb1 , Spn5ALzb2 , & - Spn5ALzb3 , Spn5FLxb1 , Spn5FLxb2 , Spn5FLxb3 , Spn5FLyb1 , Spn5FLyb2 , Spn5FLyb3 , & - Spn5FLzb1 , Spn5FLzb2 , Spn5FLzb3 , Spn5MLxb1 , Spn5MLxb2 , Spn5MLxb3 , Spn5MLyb1 , & - Spn5MLyb2 , Spn5MLyb3 , Spn5MLzb1 , Spn5MLzb2 , Spn5MLzb3 , Spn5RDxb1 , Spn5RDxb2 , & - Spn5RDxb3 , Spn5RDyb1 , Spn5RDyb2 , Spn5RDyb3 , Spn5RDzb1 , Spn5RDzb2 , Spn5RDzb3 , & - Spn5TDxb1 , Spn5TDxb2 , Spn5TDxb3 , Spn5TDyb1 , Spn5TDyb2 , Spn5TDyb3 , Spn5TDzb1 , & - Spn5TDzb2 , Spn5TDzb3 , Spn6ALgxb1 , Spn6ALgxb2 , Spn6ALgxb3 , Spn6ALgyb1 , Spn6ALgyb2 , & - Spn6ALgyb3 , Spn6ALgzb1 , Spn6ALgzb2 , Spn6ALgzb3 , Spn6ALxb1 , Spn6ALxb2 , Spn6ALxb3 , & - Spn6ALyb1 , Spn6ALyb2 , Spn6ALyb3 , Spn6ALzb1 , Spn6ALzb2 , Spn6ALzb3 , Spn6FLxb1 , & - Spn6FLxb2 , Spn6FLxb3 , Spn6FLyb1 , Spn6FLyb2 , Spn6FLyb3 , Spn6FLzb1 , Spn6FLzb2 , & - Spn6FLzb3 , Spn6MLxb1 , Spn6MLxb2 , Spn6MLxb3 , Spn6MLyb1 , Spn6MLyb2 , Spn6MLyb3 , & - Spn6MLzb1 , Spn6MLzb2 , Spn6MLzb3 , Spn6RDxb1 , Spn6RDxb2 , Spn6RDxb3 , Spn6RDyb1 , & - Spn6RDyb2 , Spn6RDyb3 , Spn6RDzb1 , Spn6RDzb2 , Spn6RDzb3 , Spn6TDxb1 , Spn6TDxb2 , & - Spn6TDxb3 , Spn6TDyb1 , Spn6TDyb2 , Spn6TDyb3 , Spn6TDzb1 , Spn6TDzb2 , Spn6TDzb3 , & - Spn7ALgxb1 , Spn7ALgxb2 , Spn7ALgxb3 , Spn7ALgyb1 , Spn7ALgyb2 , Spn7ALgyb3 , Spn7ALgzb1 , & - Spn7ALgzb2 , Spn7ALgzb3 , Spn7ALxb1 , Spn7ALxb2 , Spn7ALxb3 , Spn7ALyb1 , Spn7ALyb2 , & - Spn7ALyb3 , Spn7ALzb1 , Spn7ALzb2 , Spn7ALzb3 , Spn7FLxb1 , Spn7FLxb2 , Spn7FLxb3 , & - Spn7FLyb1 , Spn7FLyb2 , Spn7FLyb3 , Spn7FLzb1 , Spn7FLzb2 , Spn7FLzb3 , Spn7MLxb1 , & - Spn7MLxb2 , Spn7MLxb3 , Spn7MLyb1 , Spn7MLyb2 , Spn7MLyb3 , Spn7MLzb1 , Spn7MLzb2 , & - Spn7MLzb3 , Spn7RDxb1 , Spn7RDxb2 , Spn7RDxb3 , Spn7RDyb1 , Spn7RDyb2 , Spn7RDyb3 , & - Spn7RDzb1 , Spn7RDzb2 , Spn7RDzb3 , Spn7TDxb1 , Spn7TDxb2 , Spn7TDxb3 , Spn7TDyb1 , & - Spn7TDyb2 , Spn7TDyb3 , Spn7TDzb1 , Spn7TDzb2 , Spn7TDzb3 , Spn8ALgxb1 , Spn8ALgxb2 , & - Spn8ALgxb3 , Spn8ALgyb1 , Spn8ALgyb2 , Spn8ALgyb3 , Spn8ALgzb1 , Spn8ALgzb2 , Spn8ALgzb3 , & - Spn8ALxb1 , Spn8ALxb2 , Spn8ALxb3 , Spn8ALyb1 , Spn8ALyb2 , Spn8ALyb3 , Spn8ALzb1 , & - Spn8ALzb2 , Spn8ALzb3 , Spn8FLxb1 , Spn8FLxb2 , Spn8FLxb3 , Spn8FLyb1 , Spn8FLyb2 , & - Spn8FLyb3 , Spn8FLzb1 , Spn8FLzb2 , Spn8FLzb3 , Spn8MLxb1 , Spn8MLxb2 , Spn8MLxb3 , & - Spn8MLyb1 , Spn8MLyb2 , Spn8MLyb3 , Spn8MLzb1 , Spn8MLzb2 , Spn8MLzb3 , Spn8RDxb1 , & - Spn8RDxb2 , Spn8RDxb3 , Spn8RDyb1 , Spn8RDyb2 , Spn8RDyb3 , Spn8RDzb1 , Spn8RDzb2 , & - Spn8RDzb3 , Spn8TDxb1 , Spn8TDxb2 , Spn8TDxb3 , Spn8TDyb1 , Spn8TDyb2 , Spn8TDyb3 , & - Spn8TDzb1 , Spn8TDzb2 , Spn8TDzb3 , Spn9ALgxb1 , Spn9ALgxb2 , Spn9ALgxb3 , Spn9ALgyb1 , & - Spn9ALgyb2 , Spn9ALgyb3 , Spn9ALgzb1 , Spn9ALgzb2 , Spn9ALgzb3 , Spn9ALxb1 , Spn9ALxb2 , & - Spn9ALxb3 , Spn9ALyb1 , Spn9ALyb2 , Spn9ALyb3 , Spn9ALzb1 , Spn9ALzb2 , Spn9ALzb3 , & - Spn9FLxb1 , Spn9FLxb2 , Spn9FLxb3 , Spn9FLyb1 , Spn9FLyb2 , Spn9FLyb3 , Spn9FLzb1 , & - Spn9FLzb2 , Spn9FLzb3 , Spn9MLxb1 , Spn9MLxb2 , Spn9MLxb3 , Spn9MLyb1 , Spn9MLyb2 , & - Spn9MLyb3 , Spn9MLzb1 , Spn9MLzb2 , Spn9MLzb3 , Spn9RDxb1 , Spn9RDxb2 , Spn9RDxb3 , & - Spn9RDyb1 , Spn9RDyb2 , Spn9RDyb3 , Spn9RDzb1 , Spn9RDzb2 , Spn9RDzb3 , Spn9TDxb1 , & - Spn9TDxb2 , Spn9TDxb3 , Spn9TDyb1 , Spn9TDyb2 , Spn9TDyb3 , Spn9TDzb1 , Spn9TDzb2 , & - Spn9TDzb3 , TailFurlP , TailFurlA , TailFurlP , TailFurlV , TeetAya , TeetPya , & - TeetPya , TeetVya , TFrlBrM , TipClrnc1 , TipClrnc2 , TipClrnc3 , TipALgxb1 , & - TipALgxb2 , TipALgxb3 , TipALgyb1 , TipALgyb2 , TipALgyb3 , TipALgzb1 , TipALgzb2 , & - TipALgzb3 , TipALxb1 , TipALxb2 , TipALxb3 , TipALyb1 , TipALyb2 , TipALyb3 , & - TipALzb1 , TipALzb2 , TipALzb3 , TipClrnc1 , TipClrnc2 , TipClrnc3 , TipDxb1 , & - TipDxb2 , TipDxb3 , TipDxc1 , TipDxc2 , TipDxc3 , TipDyb1 , TipDyb2 , & - TipDyb3 , TipDyc1 , TipDyc2 , TipDyc3 , TipDzc1 , TipDzc2 , TipDzc3 , & - TipDzc1 , TipDzc2 , TipDzc3 , TipRDxb1 , TipRDxb2 , TipRDxb3 , TipRDyb1 , & - TipRDyb2 , TipRDyb3 , TipRDzc1 , TipRDzc2 , TipRDzc3 , TipRDzc1 , TipRDzc2 , & - TipRDzc3 , YawBrTDzt , YawBrTDxt , YawBrRDyt , YawBrRDxt , YawBrTDyt , YawBrRDzt , & - TwHt1ALgxt , TwHt1ALgyt , TwHt1ALgzt , TwHt1ALxt , TwHt1ALyt , TwHt1ALzt , TwHt1FLxt , & - TwHt1FLyt , TwHt1FLzt , TwHt1MLxt , TwHt1MLyt , TwHt1MLzt , TwHt1RDxt , TwHt1RDyt , & - TwHt1RDzt , TwHt1RPxi , TwHt1RPyi , TwHt1RPzi , TwHt1TDxt , TwHt1TDyt , TwHt1TDzt , & - TwHt1TPxi , TwHt1TPyi , TwHt1TPzi , TwHt2ALgxt , TwHt2ALgyt , TwHt2ALgzt , TwHt2ALxt , & - TwHt2ALyt , TwHt2ALzt , TwHt2FLxt , TwHt2FLyt , TwHt2FLzt , TwHt2MLxt , TwHt2MLyt , & - TwHt2MLzt , TwHt2RDxt , TwHt2RDyt , TwHt2RDzt , TwHt2RPxi , TwHt2RPyi , TwHt2RPzi , & - TwHt2TDxt , TwHt2TDyt , TwHt2TDzt , TwHt2TPxi , TwHt2TPyi , TwHt2TPzi , TwHt3ALgxt , & - TwHt3ALgyt , TwHt3ALgzt , TwHt3ALxt , TwHt3ALyt , TwHt3ALzt , TwHt3FLxt , TwHt3FLyt , & - TwHt3FLzt , TwHt3MLxt , TwHt3MLyt , TwHt3MLzt , TwHt3RDxt , TwHt3RDyt , TwHt3RDzt , & - TwHt3RPxi , TwHt3RPyi , TwHt3RPzi , TwHt3TDxt , TwHt3TDyt , TwHt3TDzt , TwHt3TPxi , & - TwHt3TPyi , TwHt3TPzi , TwHt4ALgxt , TwHt4ALgyt , TwHt4ALgzt , TwHt4ALxt , TwHt4ALyt , & - TwHt4ALzt , TwHt4FLxt , TwHt4FLyt , TwHt4FLzt , TwHt4MLxt , TwHt4MLyt , TwHt4MLzt , & - TwHt4RDxt , TwHt4RDyt , TwHt4RDzt , TwHt4RPxi , TwHt4RPyi , TwHt4RPzi , TwHt4TDxt , & - TwHt4TDyt , TwHt4TDzt , TwHt4TPxi , TwHt4TPyi , TwHt4TPzi , TwHt5ALgxt , TwHt5ALgyt , & - TwHt5ALgzt , TwHt5ALxt , TwHt5ALyt , TwHt5ALzt , TwHt5FLxt , TwHt5FLyt , TwHt5FLzt , & - TwHt5MLxt , TwHt5MLyt , TwHt5MLzt , TwHt5RDxt , TwHt5RDyt , TwHt5RDzt , TwHt5RPxi , & - TwHt5RPyi , TwHt5RPzi , TwHt5TDxt , TwHt5TDyt , TwHt5TDzt , TwHt5TPxi , TwHt5TPyi , & - TwHt5TPzi , TwHt6ALgxt , TwHt6ALgyt , TwHt6ALgzt , TwHt6ALxt , TwHt6ALyt , TwHt6ALzt , & - TwHt6FLxt , TwHt6FLyt , TwHt6FLzt , TwHt6MLxt , TwHt6MLyt , TwHt6MLzt , TwHt6RDxt , & - TwHt6RDyt , TwHt6RDzt , TwHt6RPxi , TwHt6RPyi , TwHt6RPzi , TwHt6TDxt , TwHt6TDyt , & - TwHt6TDzt , TwHt6TPxi , TwHt6TPyi , TwHt6TPzi , TwHt7ALgxt , TwHt7ALgyt , TwHt7ALgzt , & - TwHt7ALxt , TwHt7ALyt , TwHt7ALzt , TwHt7FLxt , TwHt7FLyt , TwHt7FLzt , TwHt7MLxt , & - TwHt7MLyt , TwHt7MLzt , TwHt7RDxt , TwHt7RDyt , TwHt7RDzt , TwHt7RPxi , TwHt7RPyi , & - TwHt7RPzi , TwHt7TDxt , TwHt7TDyt , TwHt7TDzt , TwHt7TPxi , TwHt7TPyi , TwHt7TPzi , & - TwHt8ALgxt , TwHt8ALgyt , TwHt8ALgzt , TwHt8ALxt , TwHt8ALyt , TwHt8ALzt , TwHt8FLxt , & - TwHt8FLyt , TwHt8FLzt , TwHt8MLxt , TwHt8MLyt , TwHt8MLzt , TwHt8RDxt , TwHt8RDyt , & - TwHt8RDzt , TwHt8RPxi , TwHt8RPyi , TwHt8RPzi , TwHt8TDxt , TwHt8TDyt , TwHt8TDzt , & - TwHt8TPxi , TwHt8TPyi , TwHt8TPzi , TwHt9ALgxt , TwHt9ALgyt , TwHt9ALgzt , TwHt9ALxt , & - TwHt9ALyt , TwHt9ALzt , TwHt9FLxt , TwHt9FLyt , TwHt9FLzt , TwHt9MLxt , TwHt9MLyt , & - TwHt9MLzt , TwHt9RDxt , TwHt9RDyt , TwHt9RDzt , TwHt9RPxi , TwHt9RPyi , TwHt9RPzi , & - TwHt9TDxt , TwHt9TDyt , TwHt9TDzt , TwHt9TPxi , TwHt9TPyi , TwHt9TPzi , TwrBsFxt , & - TwrBsFyt , TwrBsFzt , TwrBsMxt , TwrBsMyt , TwrBsMzt , TipClrnc1 , TipClrnc2 , & - TipClrnc3 , TwrTpTDxi , TwrTpTDyi , TwrTpTDzi , TipRDzc1 , TipRDzc2 , TipRDzc3 , & - YawAzn , YawAzn , YawAzn , YawBrFxn , YawBrFxp , YawBrFyn , YawBrFyp , & - YawBrFzn , YawBrFzn , YawBrMxn , YawBrMxp , YawBrMyn , YawBrMyp , YawBrMzn , & - YawBrMzn , YawBrRAxp , YawBrRAyp , YawBrRAzp , YawBrRDxt , YawBrRDyt , YawBrRDzt , & - YawBrRVxp , YawBrRVyp , YawBrRVzp , YawBrTAgxp , YawBrTAgyp , YawBrTAgzp , YawBrTAxp , & - YawBrTAyp , YawBrTAzp , TwrTpTDxi , YawBrTDxp , YawBrTDxt , TwrTpTDyi , YawBrTDyp , & - YawBrTDyt , TwrTpTDzi , YawBrTDzp , YawBrTDzt , YawBrTVxp , YawBrTVyp , YawBrTVzp , & - YawFriMfp , YawFriMom , YawFriMz , YawPzn , YawPzn , YawPzn , YawVzn , & - YawVzn , YawVzn /) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(1115) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(1121) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "AZIMUTH ","BLDPACC1 ","BLDPACC2 ","BLDPACC3 ","BLDPITCH1 ","BLDPITCH2 ","BLDPITCH3 ", & + "BLDPRATE1 ","BLDPRATE2 ","BLDPRATE3 ","BLPITCH1 ","BLPITCH2 ","BLPITCH3 ","DOMEGAYF ", & + "GENACCEL ","GENSPEED ","HSSBRTQ ","HSSHFTA ","HSSHFTPWR ","HSSHFTTQ ","HSSHFTV ", & + "IPDEFL1 ","IPDEFL2 ","IPDEFL3 ","LSSGAGA ","LSSGAGAXA ","LSSGAGAXS ","LSSGAGFXA ", & + "LSSGAGFXS ","LSSGAGFYA ","LSSGAGFYS ","LSSGAGFZA ","LSSGAGFZS ","LSSGAGMXA ","LSSGAGMXS ", & + "LSSGAGMYA ","LSSGAGMYS ","LSSGAGMZA ","LSSGAGMZS ","LSSGAGP ","LSSGAGPXA ","LSSGAGPXS ", & + "LSSGAGV ","LSSGAGVXA ","LSSGAGVXS ","LSSHFTFXA ","LSSHFTFXS ","LSSHFTFYA ","LSSHFTFYS ", & + "LSSHFTFZA ","LSSHFTFZS ","LSSHFTMXA ","LSSHFTMXS ","LSSHFTPWR ","LSSHFTTQ ","LSSTIPA ", & + "LSSTIPAXA ","LSSTIPAXS ","LSSTIPMYA ","LSSTIPMYS ","LSSTIPMZA ","LSSTIPMZS ","LSSTIPP ", & + "LSSTIPPXA ","LSSTIPPXS ","LSSTIPV ","LSSTIPVXA ","LSSTIPVXS ","NACYAW ","NACYAWA ", & + "NACYAWP ","NACYAWV ","NCIMURAXS ","NCIMURAYS ","NCIMURAZS ","NCIMURVXS ","NCIMURVYS ", & + "NCIMURVZS ","NCIMUTAGXS","NCIMUTAGYS","NCIMUTAGZS","NCIMUTAXS ","NCIMUTAYS ","NCIMUTAZS ", & + "NCIMUTVXS ","NCIMUTVYS ","NCIMUTVZS ","OMEGAYF ","OOPDEFL1 ","OOPDEFL2 ","OOPDEFL3 ", & + "PTCHDEFL1 ","PTCHDEFL2 ","PTCHDEFL3 ","PTCHPMZB1 ","PTCHPMZB2 ","PTCHPMZB3 ","PTCHPMZC1 ", & + "PTCHPMZC2 ","PTCHPMZC3 ","PTFMHEAVE ","PTFMPITCH ","PTFMRAXI ","PTFMRAXT ","PTFMRAYI ", & + "PTFMRAYT ","PTFMRAZI ","PTFMRAZT ","PTFMRDXI ","PTFMRDYI ","PTFMRDZI ","PTFMROLL ", & + "PTFMRVXI ","PTFMRVXT ","PTFMRVYI ","PTFMRVYT ","PTFMRVZI ","PTFMRVZT ","PTFMSURGE ", & + "PTFMSWAY ","PTFMTAGXI ","PTFMTAGXT ","PTFMTAGYI ","PTFMTAGYT ","PTFMTAGZI ","PTFMTAGZT ", & + "PTFMTAXI ","PTFMTAXT ","PTFMTAYI ","PTFMTAYT ","PTFMTAZI ","PTFMTAZT ","PTFMTDXI ", & + "PTFMTDXT ","PTFMTDYI ","PTFMTDYT ","PTFMTDZI ","PTFMTDZT ","PTFMTVXI ","PTFMTVXT ", & + "PTFMTVYI ","PTFMTVYT ","PTFMTVZI ","PTFMTVZT ","PTFMYAW ","QD2_B1E1 ","QD2_B1F1 ", & + "QD2_B1F2 ","QD2_B2E1 ","QD2_B2F1 ","QD2_B2F2 ","QD2_B3E1 ","QD2_B3F1 ","QD2_B3F2 ", & + "QD2_DRTR ","QD2_GEAZ ","QD2_HV ","QD2_P ","QD2_R ","QD2_RFRL ","QD2_SG ", & + "QD2_SW ","QD2_TEET ","QD2_TFA1 ","QD2_TFA2 ","QD2_TFRL ","QD2_TSS1 ","QD2_TSS2 ", & + "QD2_Y ","QD2_YAW ","QD_B1E1 ","QD_B1F1 ","QD_B1F2 ","QD_B2E1 ","QD_B2F1 ", & + "QD_B2F2 ","QD_B3E1 ","QD_B3F1 ","QD_B3F2 ","QD_DRTR ","QD_GEAZ ","QD_HV ", & + "QD_P ","QD_R ","QD_RFRL ","QD_SG ","QD_SW ","QD_TEET ","QD_TFA1 ", & + "QD_TFA2 ","QD_TFRL ","QD_TSS1 ","QD_TSS2 ","QD_Y ","QD_YAW ","Q_B1E1 ", & + "Q_B1F1 ","Q_B1F2 ","Q_B2E1 ","Q_B2F1 ","Q_B2F2 ","Q_B3E1 ","Q_B3F1 ", & + "Q_B3F2 ","Q_DRTR ","Q_GEAZ ","Q_HV ","Q_P ","Q_R ","Q_RFRL ", & + "Q_SG ","Q_SW ","Q_TEET ","Q_TFA1 ","Q_TFA2 ","Q_TFRL ","Q_TSS1 ", & + "Q_TSS2 ","Q_Y ","Q_YAW ","RFRLBRM ","ROLLDEFL1 ","ROLLDEFL2 ","ROLLDEFL3 ", & + "ROOTFXB1 ","ROOTFXB2 ","ROOTFXB3 ","ROOTFXC1 ","ROOTFXC2 ","ROOTFXC3 ","ROOTFYB1 ", & + "ROOTFYB2 ","ROOTFYB3 ","ROOTFYC1 ","ROOTFYC2 ","ROOTFYC3 ","ROOTFZB1 ","ROOTFZB2 ", & + "ROOTFZB3 ","ROOTFZC1 ","ROOTFZC2 ","ROOTFZC3 ","ROOTMEDG1 ","ROOTMEDG2 ","ROOTMEDG3 ", & + "ROOTMFLP1 ","ROOTMFLP2 ","ROOTMFLP3 ","ROOTMIP1 ","ROOTMIP2 ","ROOTMIP3 ","ROOTMOOP1 ", & + "ROOTMOOP2 ","ROOTMOOP3 ","ROOTMXB1 ","ROOTMXB2 ","ROOTMXB3 ","ROOTMXC1 ","ROOTMXC2 ", & + "ROOTMXC3 ","ROOTMYB1 ","ROOTMYB2 ","ROOTMYB3 ","ROOTMYC1 ","ROOTMYC2 ","ROOTMYC3 ", & + "ROOTMZB1 ","ROOTMZB2 ","ROOTMZB3 ","ROOTMZC1 ","ROOTMZC2 ","ROOTMZC3 ","ROTACCEL ", & + "ROTFURL ","ROTFURLA ","ROTFURLP ","ROTFURLV ","ROTPWR ","ROTSPEED ","ROTTEETA ", & + "ROTTEETP ","ROTTEETV ","ROTTHRUST ","ROTTORQ ","SPN1ALGXB1","SPN1ALGXB2","SPN1ALGXB3", & + "SPN1ALGYB1","SPN1ALGYB2","SPN1ALGYB3","SPN1ALGZB1","SPN1ALGZB2","SPN1ALGZB3","SPN1ALXB1 ", & + "SPN1ALXB2 ","SPN1ALXB3 ","SPN1ALYB1 ","SPN1ALYB2 ","SPN1ALYB3 ","SPN1ALZB1 ","SPN1ALZB2 ", & + "SPN1ALZB3 ","SPN1FLXB1 ","SPN1FLXB2 ","SPN1FLXB3 ","SPN1FLYB1 ","SPN1FLYB2 ","SPN1FLYB3 ", & + "SPN1FLZB1 ","SPN1FLZB2 ","SPN1FLZB3 ","SPN1MLXB1 ","SPN1MLXB2 ","SPN1MLXB3 ","SPN1MLYB1 ", & + "SPN1MLYB2 ","SPN1MLYB3 ","SPN1MLZB1 ","SPN1MLZB2 ","SPN1MLZB3 ","SPN1RDXB1 ","SPN1RDXB2 ", & + "SPN1RDXB3 ","SPN1RDYB1 ","SPN1RDYB2 ","SPN1RDYB3 ","SPN1RDZB1 ","SPN1RDZB2 ","SPN1RDZB3 ", & + "SPN1TDXB1 ","SPN1TDXB2 ","SPN1TDXB3 ","SPN1TDYB1 ","SPN1TDYB2 ","SPN1TDYB3 ","SPN1TDZB1 ", & + "SPN1TDZB2 ","SPN1TDZB3 ","SPN2ALGXB1","SPN2ALGXB2","SPN2ALGXB3","SPN2ALGYB1","SPN2ALGYB2", & + "SPN2ALGYB3","SPN2ALGZB1","SPN2ALGZB2","SPN2ALGZB3","SPN2ALXB1 ","SPN2ALXB2 ","SPN2ALXB3 ", & + "SPN2ALYB1 ","SPN2ALYB2 ","SPN2ALYB3 ","SPN2ALZB1 ","SPN2ALZB2 ","SPN2ALZB3 ","SPN2FLXB1 ", & + "SPN2FLXB2 ","SPN2FLXB3 ","SPN2FLYB1 ","SPN2FLYB2 ","SPN2FLYB3 ","SPN2FLZB1 ","SPN2FLZB2 ", & + "SPN2FLZB3 ","SPN2MLXB1 ","SPN2MLXB2 ","SPN2MLXB3 ","SPN2MLYB1 ","SPN2MLYB2 ","SPN2MLYB3 ", & + "SPN2MLZB1 ","SPN2MLZB2 ","SPN2MLZB3 ","SPN2RDXB1 ","SPN2RDXB2 ","SPN2RDXB3 ","SPN2RDYB1 ", & + "SPN2RDYB2 ","SPN2RDYB3 ","SPN2RDZB1 ","SPN2RDZB2 ","SPN2RDZB3 ","SPN2TDXB1 ","SPN2TDXB2 ", & + "SPN2TDXB3 ","SPN2TDYB1 ","SPN2TDYB2 ","SPN2TDYB3 ","SPN2TDZB1 ","SPN2TDZB2 ","SPN2TDZB3 ", & + "SPN3ALGXB1","SPN3ALGXB2","SPN3ALGXB3","SPN3ALGYB1","SPN3ALGYB2","SPN3ALGYB3","SPN3ALGZB1", & + "SPN3ALGZB2","SPN3ALGZB3","SPN3ALXB1 ","SPN3ALXB2 ","SPN3ALXB3 ","SPN3ALYB1 ","SPN3ALYB2 ", & + "SPN3ALYB3 ","SPN3ALZB1 ","SPN3ALZB2 ","SPN3ALZB3 ","SPN3FLXB1 ","SPN3FLXB2 ","SPN3FLXB3 ", & + "SPN3FLYB1 ","SPN3FLYB2 ","SPN3FLYB3 ","SPN3FLZB1 ","SPN3FLZB2 ","SPN3FLZB3 ","SPN3MLXB1 ", & + "SPN3MLXB2 ","SPN3MLXB3 ","SPN3MLYB1 ","SPN3MLYB2 ","SPN3MLYB3 ","SPN3MLZB1 ","SPN3MLZB2 ", & + "SPN3MLZB3 ","SPN3RDXB1 ","SPN3RDXB2 ","SPN3RDXB3 ","SPN3RDYB1 ","SPN3RDYB2 ","SPN3RDYB3 ", & + "SPN3RDZB1 ","SPN3RDZB2 ","SPN3RDZB3 ","SPN3TDXB1 ","SPN3TDXB2 ","SPN3TDXB3 ","SPN3TDYB1 ", & + "SPN3TDYB2 ","SPN3TDYB3 ","SPN3TDZB1 ","SPN3TDZB2 ","SPN3TDZB3 ","SPN4ALGXB1","SPN4ALGXB2", & + "SPN4ALGXB3","SPN4ALGYB1","SPN4ALGYB2","SPN4ALGYB3","SPN4ALGZB1","SPN4ALGZB2","SPN4ALGZB3", & + "SPN4ALXB1 ","SPN4ALXB2 ","SPN4ALXB3 ","SPN4ALYB1 ","SPN4ALYB2 ","SPN4ALYB3 ","SPN4ALZB1 ", & + "SPN4ALZB2 ","SPN4ALZB3 ","SPN4FLXB1 ","SPN4FLXB2 ","SPN4FLXB3 ","SPN4FLYB1 ","SPN4FLYB2 ", & + "SPN4FLYB3 ","SPN4FLZB1 ","SPN4FLZB2 ","SPN4FLZB3 ","SPN4MLXB1 ","SPN4MLXB2 ","SPN4MLXB3 ", & + "SPN4MLYB1 ","SPN4MLYB2 ","SPN4MLYB3 ","SPN4MLZB1 ","SPN4MLZB2 ","SPN4MLZB3 ","SPN4RDXB1 ", & + "SPN4RDXB2 ","SPN4RDXB3 ","SPN4RDYB1 ","SPN4RDYB2 ","SPN4RDYB3 ","SPN4RDZB1 ","SPN4RDZB2 ", & + "SPN4RDZB3 ","SPN4TDXB1 ","SPN4TDXB2 ","SPN4TDXB3 ","SPN4TDYB1 ","SPN4TDYB2 ","SPN4TDYB3 ", & + "SPN4TDZB1 ","SPN4TDZB2 ","SPN4TDZB3 ","SPN5ALGXB1","SPN5ALGXB2","SPN5ALGXB3","SPN5ALGYB1", & + "SPN5ALGYB2","SPN5ALGYB3","SPN5ALGZB1","SPN5ALGZB2","SPN5ALGZB3","SPN5ALXB1 ","SPN5ALXB2 ", & + "SPN5ALXB3 ","SPN5ALYB1 ","SPN5ALYB2 ","SPN5ALYB3 ","SPN5ALZB1 ","SPN5ALZB2 ","SPN5ALZB3 ", & + "SPN5FLXB1 ","SPN5FLXB2 ","SPN5FLXB3 ","SPN5FLYB1 ","SPN5FLYB2 ","SPN5FLYB3 ","SPN5FLZB1 ", & + "SPN5FLZB2 ","SPN5FLZB3 ","SPN5MLXB1 ","SPN5MLXB2 ","SPN5MLXB3 ","SPN5MLYB1 ","SPN5MLYB2 ", & + "SPN5MLYB3 ","SPN5MLZB1 ","SPN5MLZB2 ","SPN5MLZB3 ","SPN5RDXB1 ","SPN5RDXB2 ","SPN5RDXB3 ", & + "SPN5RDYB1 ","SPN5RDYB2 ","SPN5RDYB3 ","SPN5RDZB1 ","SPN5RDZB2 ","SPN5RDZB3 ","SPN5TDXB1 ", & + "SPN5TDXB2 ","SPN5TDXB3 ","SPN5TDYB1 ","SPN5TDYB2 ","SPN5TDYB3 ","SPN5TDZB1 ","SPN5TDZB2 ", & + "SPN5TDZB3 ","SPN6ALGXB1","SPN6ALGXB2","SPN6ALGXB3","SPN6ALGYB1","SPN6ALGYB2","SPN6ALGYB3", & + "SPN6ALGZB1","SPN6ALGZB2","SPN6ALGZB3","SPN6ALXB1 ","SPN6ALXB2 ","SPN6ALXB3 ","SPN6ALYB1 ", & + "SPN6ALYB2 ","SPN6ALYB3 ","SPN6ALZB1 ","SPN6ALZB2 ","SPN6ALZB3 ","SPN6FLXB1 ","SPN6FLXB2 ", & + "SPN6FLXB3 ","SPN6FLYB1 ","SPN6FLYB2 ","SPN6FLYB3 ","SPN6FLZB1 ","SPN6FLZB2 ","SPN6FLZB3 ", & + "SPN6MLXB1 ","SPN6MLXB2 ","SPN6MLXB3 ","SPN6MLYB1 ","SPN6MLYB2 ","SPN6MLYB3 ","SPN6MLZB1 ", & + "SPN6MLZB2 ","SPN6MLZB3 ","SPN6RDXB1 ","SPN6RDXB2 ","SPN6RDXB3 ","SPN6RDYB1 ","SPN6RDYB2 ", & + "SPN6RDYB3 ","SPN6RDZB1 ","SPN6RDZB2 ","SPN6RDZB3 ","SPN6TDXB1 ","SPN6TDXB2 ","SPN6TDXB3 ", & + "SPN6TDYB1 ","SPN6TDYB2 ","SPN6TDYB3 ","SPN6TDZB1 ","SPN6TDZB2 ","SPN6TDZB3 ","SPN7ALGXB1", & + "SPN7ALGXB2","SPN7ALGXB3","SPN7ALGYB1","SPN7ALGYB2","SPN7ALGYB3","SPN7ALGZB1","SPN7ALGZB2", & + "SPN7ALGZB3","SPN7ALXB1 ","SPN7ALXB2 ","SPN7ALXB3 ","SPN7ALYB1 ","SPN7ALYB2 ","SPN7ALYB3 ", & + "SPN7ALZB1 ","SPN7ALZB2 ","SPN7ALZB3 ","SPN7FLXB1 ","SPN7FLXB2 ","SPN7FLXB3 ","SPN7FLYB1 ", & + "SPN7FLYB2 ","SPN7FLYB3 ","SPN7FLZB1 ","SPN7FLZB2 ","SPN7FLZB3 ","SPN7MLXB1 ","SPN7MLXB2 ", & + "SPN7MLXB3 ","SPN7MLYB1 ","SPN7MLYB2 ","SPN7MLYB3 ","SPN7MLZB1 ","SPN7MLZB2 ","SPN7MLZB3 ", & + "SPN7RDXB1 ","SPN7RDXB2 ","SPN7RDXB3 ","SPN7RDYB1 ","SPN7RDYB2 ","SPN7RDYB3 ","SPN7RDZB1 ", & + "SPN7RDZB2 ","SPN7RDZB3 ","SPN7TDXB1 ","SPN7TDXB2 ","SPN7TDXB3 ","SPN7TDYB1 ","SPN7TDYB2 ", & + "SPN7TDYB3 ","SPN7TDZB1 ","SPN7TDZB2 ","SPN7TDZB3 ","SPN8ALGXB1","SPN8ALGXB2","SPN8ALGXB3", & + "SPN8ALGYB1","SPN8ALGYB2","SPN8ALGYB3","SPN8ALGZB1","SPN8ALGZB2","SPN8ALGZB3","SPN8ALXB1 ", & + "SPN8ALXB2 ","SPN8ALXB3 ","SPN8ALYB1 ","SPN8ALYB2 ","SPN8ALYB3 ","SPN8ALZB1 ","SPN8ALZB2 ", & + "SPN8ALZB3 ","SPN8FLXB1 ","SPN8FLXB2 ","SPN8FLXB3 ","SPN8FLYB1 ","SPN8FLYB2 ","SPN8FLYB3 ", & + "SPN8FLZB1 ","SPN8FLZB2 ","SPN8FLZB3 ","SPN8MLXB1 ","SPN8MLXB2 ","SPN8MLXB3 ","SPN8MLYB1 ", & + "SPN8MLYB2 ","SPN8MLYB3 ","SPN8MLZB1 ","SPN8MLZB2 ","SPN8MLZB3 ","SPN8RDXB1 ","SPN8RDXB2 ", & + "SPN8RDXB3 ","SPN8RDYB1 ","SPN8RDYB2 ","SPN8RDYB3 ","SPN8RDZB1 ","SPN8RDZB2 ","SPN8RDZB3 ", & + "SPN8TDXB1 ","SPN8TDXB2 ","SPN8TDXB3 ","SPN8TDYB1 ","SPN8TDYB2 ","SPN8TDYB3 ","SPN8TDZB1 ", & + "SPN8TDZB2 ","SPN8TDZB3 ","SPN9ALGXB1","SPN9ALGXB2","SPN9ALGXB3","SPN9ALGYB1","SPN9ALGYB2", & + "SPN9ALGYB3","SPN9ALGZB1","SPN9ALGZB2","SPN9ALGZB3","SPN9ALXB1 ","SPN9ALXB2 ","SPN9ALXB3 ", & + "SPN9ALYB1 ","SPN9ALYB2 ","SPN9ALYB3 ","SPN9ALZB1 ","SPN9ALZB2 ","SPN9ALZB3 ","SPN9FLXB1 ", & + "SPN9FLXB2 ","SPN9FLXB3 ","SPN9FLYB1 ","SPN9FLYB2 ","SPN9FLYB3 ","SPN9FLZB1 ","SPN9FLZB2 ", & + "SPN9FLZB3 ","SPN9MLXB1 ","SPN9MLXB2 ","SPN9MLXB3 ","SPN9MLYB1 ","SPN9MLYB2 ","SPN9MLYB3 ", & + "SPN9MLZB1 ","SPN9MLZB2 ","SPN9MLZB3 ","SPN9RDXB1 ","SPN9RDXB2 ","SPN9RDXB3 ","SPN9RDYB1 ", & + "SPN9RDYB2 ","SPN9RDYB3 ","SPN9RDZB1 ","SPN9RDZB2 ","SPN9RDZB3 ","SPN9TDXB1 ","SPN9TDXB2 ", & + "SPN9TDXB3 ","SPN9TDYB1 ","SPN9TDYB2 ","SPN9TDYB3 ","SPN9TDZB1 ","SPN9TDZB2 ","SPN9TDZB3 ", & + "TAILFURL ","TAILFURLA ","TAILFURLP ","TAILFURLV ","TEETAYA ","TEETDEFL ","TEETPYA ", & + "TEETVYA ","TFRLBRM ","TIP2TWR1 ","TIP2TWR2 ","TIP2TWR3 ","TIPALGXB1 ","TIPALGXB2 ", & + "TIPALGXB3 ","TIPALGYB1 ","TIPALGYB2 ","TIPALGYB3 ","TIPALGZB1 ","TIPALGZB2 ","TIPALGZB3 ", & + "TIPALXB1 ","TIPALXB2 ","TIPALXB3 ","TIPALYB1 ","TIPALYB2 ","TIPALYB3 ","TIPALZB1 ", & + "TIPALZB2 ","TIPALZB3 ","TIPCLRNC1 ","TIPCLRNC2 ","TIPCLRNC3 ","TIPDXB1 ","TIPDXB2 ", & + "TIPDXB3 ","TIPDXC1 ","TIPDXC2 ","TIPDXC3 ","TIPDYB1 ","TIPDYB2 ","TIPDYB3 ", & + "TIPDYC1 ","TIPDYC2 ","TIPDYC3 ","TIPDZB1 ","TIPDZB2 ","TIPDZB3 ","TIPDZC1 ", & + "TIPDZC2 ","TIPDZC3 ","TIPRDXB1 ","TIPRDXB2 ","TIPRDXB3 ","TIPRDYB1 ","TIPRDYB2 ", & + "TIPRDYB3 ","TIPRDZB1 ","TIPRDZB2 ","TIPRDZB3 ","TIPRDZC1 ","TIPRDZC2 ","TIPRDZC3 ", & + "TTDSPAX ","TTDSPFA ","TTDSPPTCH ","TTDSPROLL ","TTDSPSS ","TTDSPTWST ","TWHT1ALGXT", & + "TWHT1ALGYT","TWHT1ALGZT","TWHT1ALXT ","TWHT1ALYT ","TWHT1ALZT ","TWHT1FLXT ","TWHT1FLYT ", & + "TWHT1FLZT ","TWHT1MLXT ","TWHT1MLYT ","TWHT1MLZT ","TWHT1RDXT ","TWHT1RDYT ","TWHT1RDZT ", & + "TWHT1RPXI ","TWHT1RPYI ","TWHT1RPZI ","TWHT1TDXT ","TWHT1TDYT ","TWHT1TDZT ","TWHT1TPXI ", & + "TWHT1TPYI ","TWHT1TPZI ","TWHT2ALGXT","TWHT2ALGYT","TWHT2ALGZT","TWHT2ALXT ","TWHT2ALYT ", & + "TWHT2ALZT ","TWHT2FLXT ","TWHT2FLYT ","TWHT2FLZT ","TWHT2MLXT ","TWHT2MLYT ","TWHT2MLZT ", & + "TWHT2RDXT ","TWHT2RDYT ","TWHT2RDZT ","TWHT2RPXI ","TWHT2RPYI ","TWHT2RPZI ","TWHT2TDXT ", & + "TWHT2TDYT ","TWHT2TDZT ","TWHT2TPXI ","TWHT2TPYI ","TWHT2TPZI ","TWHT3ALGXT","TWHT3ALGYT", & + "TWHT3ALGZT","TWHT3ALXT ","TWHT3ALYT ","TWHT3ALZT ","TWHT3FLXT ","TWHT3FLYT ","TWHT3FLZT ", & + "TWHT3MLXT ","TWHT3MLYT ","TWHT3MLZT ","TWHT3RDXT ","TWHT3RDYT ","TWHT3RDZT ","TWHT3RPXI ", & + "TWHT3RPYI ","TWHT3RPZI ","TWHT3TDXT ","TWHT3TDYT ","TWHT3TDZT ","TWHT3TPXI ","TWHT3TPYI ", & + "TWHT3TPZI ","TWHT4ALGXT","TWHT4ALGYT","TWHT4ALGZT","TWHT4ALXT ","TWHT4ALYT ","TWHT4ALZT ", & + "TWHT4FLXT ","TWHT4FLYT ","TWHT4FLZT ","TWHT4MLXT ","TWHT4MLYT ","TWHT4MLZT ","TWHT4RDXT ", & + "TWHT4RDYT ","TWHT4RDZT ","TWHT4RPXI ","TWHT4RPYI ","TWHT4RPZI ","TWHT4TDXT ","TWHT4TDYT ", & + "TWHT4TDZT ","TWHT4TPXI ","TWHT4TPYI ","TWHT4TPZI ","TWHT5ALGXT","TWHT5ALGYT","TWHT5ALGZT", & + "TWHT5ALXT ","TWHT5ALYT ","TWHT5ALZT ","TWHT5FLXT ","TWHT5FLYT ","TWHT5FLZT ","TWHT5MLXT ", & + "TWHT5MLYT ","TWHT5MLZT ","TWHT5RDXT ","TWHT5RDYT ","TWHT5RDZT ","TWHT5RPXI ","TWHT5RPYI ", & + "TWHT5RPZI ","TWHT5TDXT ","TWHT5TDYT ","TWHT5TDZT ","TWHT5TPXI ","TWHT5TPYI ","TWHT5TPZI ", & + "TWHT6ALGXT","TWHT6ALGYT","TWHT6ALGZT","TWHT6ALXT ","TWHT6ALYT ","TWHT6ALZT ","TWHT6FLXT ", & + "TWHT6FLYT ","TWHT6FLZT ","TWHT6MLXT ","TWHT6MLYT ","TWHT6MLZT ","TWHT6RDXT ","TWHT6RDYT ", & + "TWHT6RDZT ","TWHT6RPXI ","TWHT6RPYI ","TWHT6RPZI ","TWHT6TDXT ","TWHT6TDYT ","TWHT6TDZT ", & + "TWHT6TPXI ","TWHT6TPYI ","TWHT6TPZI ","TWHT7ALGXT","TWHT7ALGYT","TWHT7ALGZT","TWHT7ALXT ", & + "TWHT7ALYT ","TWHT7ALZT ","TWHT7FLXT ","TWHT7FLYT ","TWHT7FLZT ","TWHT7MLXT ","TWHT7MLYT ", & + "TWHT7MLZT ","TWHT7RDXT ","TWHT7RDYT ","TWHT7RDZT ","TWHT7RPXI ","TWHT7RPYI ","TWHT7RPZI ", & + "TWHT7TDXT ","TWHT7TDYT ","TWHT7TDZT ","TWHT7TPXI ","TWHT7TPYI ","TWHT7TPZI ","TWHT8ALGXT", & + "TWHT8ALGYT","TWHT8ALGZT","TWHT8ALXT ","TWHT8ALYT ","TWHT8ALZT ","TWHT8FLXT ","TWHT8FLYT ", & + "TWHT8FLZT ","TWHT8MLXT ","TWHT8MLYT ","TWHT8MLZT ","TWHT8RDXT ","TWHT8RDYT ","TWHT8RDZT ", & + "TWHT8RPXI ","TWHT8RPYI ","TWHT8RPZI ","TWHT8TDXT ","TWHT8TDYT ","TWHT8TDZT ","TWHT8TPXI ", & + "TWHT8TPYI ","TWHT8TPZI ","TWHT9ALGXT","TWHT9ALGYT","TWHT9ALGZT","TWHT9ALXT ","TWHT9ALYT ", & + "TWHT9ALZT ","TWHT9FLXT ","TWHT9FLYT ","TWHT9FLZT ","TWHT9MLXT ","TWHT9MLYT ","TWHT9MLZT ", & + "TWHT9RDXT ","TWHT9RDYT ","TWHT9RDZT ","TWHT9RPXI ","TWHT9RPYI ","TWHT9RPZI ","TWHT9TDXT ", & + "TWHT9TDYT ","TWHT9TDZT ","TWHT9TPXI ","TWHT9TPYI ","TWHT9TPZI ","TWRBSFXT ","TWRBSFYT ", & + "TWRBSFZT ","TWRBSMXT ","TWRBSMYT ","TWRBSMZT ","TWRCLRNC1 ","TWRCLRNC2 ","TWRCLRNC3 ", & + "TWRTPTDXI ","TWRTPTDYI ","TWRTPTDZI ","TWSTDEFL1 ","TWSTDEFL2 ","TWSTDEFL3 ","YAWACCEL ", & + "YAWAZN ","YAWAZP ","YAWBRFXN ","YAWBRFXP ","YAWBRFYN ","YAWBRFYP ","YAWBRFZN ", & + "YAWBRFZP ","YAWBRMXN ","YAWBRMXP ","YAWBRMYN ","YAWBRMYP ","YAWBRMZN ","YAWBRMZP ", & + "YAWBRRAXP ","YAWBRRAYP ","YAWBRRAZP ","YAWBRRDXT ","YAWBRRDYT ","YAWBRRDZT ","YAWBRRVXP ", & + "YAWBRRVYP ","YAWBRRVZP ","YAWBRTAGXP","YAWBRTAGYP","YAWBRTAGZP","YAWBRTAXP ","YAWBRTAYP ", & + "YAWBRTAZP ","YAWBRTDXI ","YAWBRTDXP ","YAWBRTDXT ","YAWBRTDYI ","YAWBRTDYP ","YAWBRTDYT ", & + "YAWBRTDZI ","YAWBRTDZP ","YAWBRTDZT ","YAWBRTVXP ","YAWBRTVYP ","YAWBRTVZP ","YAWFRIMFP ", & + "YAWFRIMOM ","YAWFRIMZ ","YAWPOS ","YAWPZN ","YAWPZP ","YAWRATE ","YAWVZN ", & + "YAWVZP "/) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(1121) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + LSSTipPxa , BldPAcc1 , BldPAcc2 , BldPAcc3 , PtchPMzc1 , PtchPMzc2 , PtchPMzc3 , & + BldPRate1 , BldPRate2 , BldPRate3 , PtchPMzc1 , PtchPMzc2 , PtchPMzc3 , dOmegaYF , & + HSShftA , HSShftV , HSSBrTq , HSShftA , HSShftPwr , HSShftTq , HSShftV , & + TipDyc1 , TipDyc2 , TipDyc3 , LSSGagAxa , LSSGagAxa , LSSGagAxa , LSShftFxa , & + LSShftFxa , LSShftFya , LSShftFys , LSShftFza , LSShftFzs , LSShftMxa , LSShftMxa , & + LSSGagMya , LSSGagMys , LSSGagMza , LSSGagMzs , LSSGagPxa , LSSGagPxa , LSSGagPxa , & + LSSGagVxa , LSSGagVxa , LSSGagVxa , LSShftFxa , LSShftFxa , LSShftFya , LSShftFys , & + LSShftFza , LSShftFzs , LSShftMxa , LSShftMxa , RotPwr , LSShftMxa , LSSTipAxa , & + LSSTipAxa , LSSTipAxa , LSSTipMya , LSSTipMys , LSSTipMza , LSSTipMzs , LSSTipPxa , & + LSSTipPxa , LSSTipPxa , LSSTipVxa , LSSTipVxa , LSSTipVxa , YawPzn , YawAzn , & + YawPzn , YawVzn , NcIMURAxs , NcIMURAys , NcIMURAzs , NcIMURVxs , NcIMURVys , & + NcIMURVzs , NcIMUTAgxs , NcIMUTAgys , NcIMUTAgzs , NcIMUTAxs , NcIMUTAys , NcIMUTAzs , & + NcIMUTVxs , NcIMUTVys , NcIMUTVzs , OmegaYF , TipDxc1 , TipDxc2 , TipDxc3 , & + TipRDyb1 , TipRDyb2 , TipRDyb3 , PtchPMzc1 , PtchPMzc2 , PtchPMzc3 , PtchPMzc1 , & + PtchPMzc2 , PtchPMzc3 , PtfmTDzi , PtfmRDyi , PtfmRAxi , PtfmRAxt , PtfmRAyi , & + PtfmRAyt , PtfmRAzi , PtfmRAzt , PtfmRDxi , PtfmRDyi , PtfmRDzi , PtfmRDxi , & + PtfmRVxi , PtfmRVxt , PtfmRVyi , PtfmRVyt , PtfmRVzi , PtfmRVzt , PtfmTDxi , & + PtfmTDyi , PtfmTAgxi , PtfmTAgxt , PtfmTAgyi , PtfmTAgyt , PtfmTAgzi , PtfmTAgzt , & + PtfmTAxi , PtfmTAxt , PtfmTAyi , PtfmTAyt , PtfmTAzi , PtfmTAzt , PtfmTDxi , & + PtfmTDxt , PtfmTDyi , PtfmTDyt , PtfmTDzi , PtfmTDzt , PtfmTVxi , PtfmTVxt , & + PtfmTVyi , PtfmTVyt , PtfmTVzi , PtfmTVzt , PtfmRDzi , QD2_B1E1 , QD2_B1F1 , & + QD2_B1F2 , QD2_B2E1 , QD2_B2F1 , QD2_B2F2 , QD2_B3E1 , QD2_B3F1 , QD2_B3F2 , & + QD2_DrTr , QD2_GeAz , QD2_Hv , QD2_P , QD2_R , QD2_RFrl , QD2_Sg , & + QD2_Sw , QD2_Teet , QD2_TFA1 , QD2_TFA2 , QD2_TFrl , QD2_TSS1 , QD2_TSS2 , & + QD2_Y , QD2_Yaw , QD_B1E1 , QD_B1F1 , QD_B1F2 , QD_B2E1 , QD_B2F1 , & + QD_B2F2 , QD_B3E1 , QD_B3F1 , QD_B3F2 , QD_DrTr , QD_GeAz , QD_Hv , & + QD_P , QD_R , QD_RFrl , QD_Sg , QD_Sw , QD_Teet , QD_TFA1 , & + QD_TFA2 , QD_TFrl , QD_TSS1 , QD_TSS2 , QD_Y , QD_Yaw , Q_B1E1 , & + Q_B1F1 , Q_B1F2 , Q_B2E1 , Q_B2F1 , Q_B2F2 , Q_B3E1 , Q_B3F1 , & + Q_B3F2 , Q_DrTr , Q_GeAz , Q_Hv , Q_P , Q_R , Q_RFrl , & + Q_Sg , Q_Sw , Q_Teet , Q_TFA1 , Q_TFA2 , Q_TFrl , Q_TSS1 , & + Q_TSS2 , Q_Y , Q_Yaw , RFrlBrM , TipRDxb1 , TipRDxb2 , TipRDxb3 , & + RootFxb1 , RootFxb2 , RootFxb3 , RootFxc1 , RootFxc2 , RootFxc3 , RootFyb1 , & + RootFyb2 , RootFyb3 , RootFyc1 , RootFyc2 , RootFyc3 , RootFzc1 , RootFzc2 , & + RootFzc3 , RootFzc1 , RootFzc2 , RootFzc3 , RootMxb1 , RootMxb2 , RootMxb3 , & + RootMyb1 , RootMyb2 , RootMyb3 , RootMxc1 , RootMxc2 , RootMxc3 , RootMyc1 , & + RootMyc2 , RootMyc3 , RootMxb1 , RootMxb2 , RootMxb3 , RootMxc1 , RootMxc2 , & + RootMxc3 , RootMyb1 , RootMyb2 , RootMyb3 , RootMyc1 , RootMyc2 , RootMyc3 , & + RootMzc1 , RootMzc2 , RootMzc3 , RootMzc1 , RootMzc2 , RootMzc3 , LSSTipAxa , & + RotFurlP , RotFurlA , RotFurlP , RotFurlV , RotPwr , LSSTipVxa , TeetAya , & + TeetPya , TeetVya , LSShftFxa , LSShftMxa , Spn1ALgxb1 , Spn1ALgxb2 , Spn1ALgxb3 , & + Spn1ALgyb1 , Spn1ALgyb2 , Spn1ALgyb3 , Spn1ALgzb1 , Spn1ALgzb2 , Spn1ALgzb3 , Spn1ALxb1 , & + Spn1ALxb2 , Spn1ALxb3 , Spn1ALyb1 , Spn1ALyb2 , Spn1ALyb3 , Spn1ALzb1 , Spn1ALzb2 , & + Spn1ALzb3 , Spn1FLxb1 , Spn1FLxb2 , Spn1FLxb3 , Spn1FLyb1 , Spn1FLyb2 , Spn1FLyb3 , & + Spn1FLzb1 , Spn1FLzb2 , Spn1FLzb3 , Spn1MLxb1 , Spn1MLxb2 , Spn1MLxb3 , Spn1MLyb1 , & + Spn1MLyb2 , Spn1MLyb3 , Spn1MLzb1 , Spn1MLzb2 , Spn1MLzb3 , Spn1RDxb1 , Spn1RDxb2 , & + Spn1RDxb3 , Spn1RDyb1 , Spn1RDyb2 , Spn1RDyb3 , Spn1RDzb1 , Spn1RDzb2 , Spn1RDzb3 , & + Spn1TDxb1 , Spn1TDxb2 , Spn1TDxb3 , Spn1TDyb1 , Spn1TDyb2 , Spn1TDyb3 , Spn1TDzb1 , & + Spn1TDzb2 , Spn1TDzb3 , Spn2ALgxb1 , Spn2ALgxb2 , Spn2ALgxb3 , Spn2ALgyb1 , Spn2ALgyb2 , & + Spn2ALgyb3 , Spn2ALgzb1 , Spn2ALgzb2 , Spn2ALgzb3 , Spn2ALxb1 , Spn2ALxb2 , Spn2ALxb3 , & + Spn2ALyb1 , Spn2ALyb2 , Spn2ALyb3 , Spn2ALzb1 , Spn2ALzb2 , Spn2ALzb3 , Spn2FLxb1 , & + Spn2FLxb2 , Spn2FLxb3 , Spn2FLyb1 , Spn2FLyb2 , Spn2FLyb3 , Spn2FLzb1 , Spn2FLzb2 , & + Spn2FLzb3 , Spn2MLxb1 , Spn2MLxb2 , Spn2MLxb3 , Spn2MLyb1 , Spn2MLyb2 , Spn2MLyb3 , & + Spn2MLzb1 , Spn2MLzb2 , Spn2MLzb3 , Spn2RDxb1 , Spn2RDxb2 , Spn2RDxb3 , Spn2RDyb1 , & + Spn2RDyb2 , Spn2RDyb3 , Spn2RDzb1 , Spn2RDzb2 , Spn2RDzb3 , Spn2TDxb1 , Spn2TDxb2 , & + Spn2TDxb3 , Spn2TDyb1 , Spn2TDyb2 , Spn2TDyb3 , Spn2TDzb1 , Spn2TDzb2 , Spn2TDzb3 , & + Spn3ALgxb1 , Spn3ALgxb2 , Spn3ALgxb3 , Spn3ALgyb1 , Spn3ALgyb2 , Spn3ALgyb3 , Spn3ALgzb1 , & + Spn3ALgzb2 , Spn3ALgzb3 , Spn3ALxb1 , Spn3ALxb2 , Spn3ALxb3 , Spn3ALyb1 , Spn3ALyb2 , & + Spn3ALyb3 , Spn3ALzb1 , Spn3ALzb2 , Spn3ALzb3 , Spn3FLxb1 , Spn3FLxb2 , Spn3FLxb3 , & + Spn3FLyb1 , Spn3FLyb2 , Spn3FLyb3 , Spn3FLzb1 , Spn3FLzb2 , Spn3FLzb3 , Spn3MLxb1 , & + Spn3MLxb2 , Spn3MLxb3 , Spn3MLyb1 , Spn3MLyb2 , Spn3MLyb3 , Spn3MLzb1 , Spn3MLzb2 , & + Spn3MLzb3 , Spn3RDxb1 , Spn3RDxb2 , Spn3RDxb3 , Spn3RDyb1 , Spn3RDyb2 , Spn3RDyb3 , & + Spn3RDzb1 , Spn3RDzb2 , Spn3RDzb3 , Spn3TDxb1 , Spn3TDxb2 , Spn3TDxb3 , Spn3TDyb1 , & + Spn3TDyb2 , Spn3TDyb3 , Spn3TDzb1 , Spn3TDzb2 , Spn3TDzb3 , Spn4ALgxb1 , Spn4ALgxb2 , & + Spn4ALgxb3 , Spn4ALgyb1 , Spn4ALgyb2 , Spn4ALgyb3 , Spn4ALgzb1 , Spn4ALgzb2 , Spn4ALgzb3 , & + Spn4ALxb1 , Spn4ALxb2 , Spn4ALxb3 , Spn4ALyb1 , Spn4ALyb2 , Spn4ALyb3 , Spn4ALzb1 , & + Spn4ALzb2 , Spn4ALzb3 , Spn4FLxb1 , Spn4FLxb2 , Spn4FLxb3 , Spn4FLyb1 , Spn4FLyb2 , & + Spn4FLyb3 , Spn4FLzb1 , Spn4FLzb2 , Spn4FLzb3 , Spn4MLxb1 , Spn4MLxb2 , Spn4MLxb3 , & + Spn4MLyb1 , Spn4MLyb2 , Spn4MLyb3 , Spn4MLzb1 , Spn4MLzb2 , Spn4MLzb3 , Spn4RDxb1 , & + Spn4RDxb2 , Spn4RDxb3 , Spn4RDyb1 , Spn4RDyb2 , Spn4RDyb3 , Spn4RDzb1 , Spn4RDzb2 , & + Spn4RDzb3 , Spn4TDxb1 , Spn4TDxb2 , Spn4TDxb3 , Spn4TDyb1 , Spn4TDyb2 , Spn4TDyb3 , & + Spn4TDzb1 , Spn4TDzb2 , Spn4TDzb3 , Spn5ALgxb1 , Spn5ALgxb2 , Spn5ALgxb3 , Spn5ALgyb1 , & + Spn5ALgyb2 , Spn5ALgyb3 , Spn5ALgzb1 , Spn5ALgzb2 , Spn5ALgzb3 , Spn5ALxb1 , Spn5ALxb2 , & + Spn5ALxb3 , Spn5ALyb1 , Spn5ALyb2 , Spn5ALyb3 , Spn5ALzb1 , Spn5ALzb2 , Spn5ALzb3 , & + Spn5FLxb1 , Spn5FLxb2 , Spn5FLxb3 , Spn5FLyb1 , Spn5FLyb2 , Spn5FLyb3 , Spn5FLzb1 , & + Spn5FLzb2 , Spn5FLzb3 , Spn5MLxb1 , Spn5MLxb2 , Spn5MLxb3 , Spn5MLyb1 , Spn5MLyb2 , & + Spn5MLyb3 , Spn5MLzb1 , Spn5MLzb2 , Spn5MLzb3 , Spn5RDxb1 , Spn5RDxb2 , Spn5RDxb3 , & + Spn5RDyb1 , Spn5RDyb2 , Spn5RDyb3 , Spn5RDzb1 , Spn5RDzb2 , Spn5RDzb3 , Spn5TDxb1 , & + Spn5TDxb2 , Spn5TDxb3 , Spn5TDyb1 , Spn5TDyb2 , Spn5TDyb3 , Spn5TDzb1 , Spn5TDzb2 , & + Spn5TDzb3 , Spn6ALgxb1 , Spn6ALgxb2 , Spn6ALgxb3 , Spn6ALgyb1 , Spn6ALgyb2 , Spn6ALgyb3 , & + Spn6ALgzb1 , Spn6ALgzb2 , Spn6ALgzb3 , Spn6ALxb1 , Spn6ALxb2 , Spn6ALxb3 , Spn6ALyb1 , & + Spn6ALyb2 , Spn6ALyb3 , Spn6ALzb1 , Spn6ALzb2 , Spn6ALzb3 , Spn6FLxb1 , Spn6FLxb2 , & + Spn6FLxb3 , Spn6FLyb1 , Spn6FLyb2 , Spn6FLyb3 , Spn6FLzb1 , Spn6FLzb2 , Spn6FLzb3 , & + Spn6MLxb1 , Spn6MLxb2 , Spn6MLxb3 , Spn6MLyb1 , Spn6MLyb2 , Spn6MLyb3 , Spn6MLzb1 , & + Spn6MLzb2 , Spn6MLzb3 , Spn6RDxb1 , Spn6RDxb2 , Spn6RDxb3 , Spn6RDyb1 , Spn6RDyb2 , & + Spn6RDyb3 , Spn6RDzb1 , Spn6RDzb2 , Spn6RDzb3 , Spn6TDxb1 , Spn6TDxb2 , Spn6TDxb3 , & + Spn6TDyb1 , Spn6TDyb2 , Spn6TDyb3 , Spn6TDzb1 , Spn6TDzb2 , Spn6TDzb3 , Spn7ALgxb1 , & + Spn7ALgxb2 , Spn7ALgxb3 , Spn7ALgyb1 , Spn7ALgyb2 , Spn7ALgyb3 , Spn7ALgzb1 , Spn7ALgzb2 , & + Spn7ALgzb3 , Spn7ALxb1 , Spn7ALxb2 , Spn7ALxb3 , Spn7ALyb1 , Spn7ALyb2 , Spn7ALyb3 , & + Spn7ALzb1 , Spn7ALzb2 , Spn7ALzb3 , Spn7FLxb1 , Spn7FLxb2 , Spn7FLxb3 , Spn7FLyb1 , & + Spn7FLyb2 , Spn7FLyb3 , Spn7FLzb1 , Spn7FLzb2 , Spn7FLzb3 , Spn7MLxb1 , Spn7MLxb2 , & + Spn7MLxb3 , Spn7MLyb1 , Spn7MLyb2 , Spn7MLyb3 , Spn7MLzb1 , Spn7MLzb2 , Spn7MLzb3 , & + Spn7RDxb1 , Spn7RDxb2 , Spn7RDxb3 , Spn7RDyb1 , Spn7RDyb2 , Spn7RDyb3 , Spn7RDzb1 , & + Spn7RDzb2 , Spn7RDzb3 , Spn7TDxb1 , Spn7TDxb2 , Spn7TDxb3 , Spn7TDyb1 , Spn7TDyb2 , & + Spn7TDyb3 , Spn7TDzb1 , Spn7TDzb2 , Spn7TDzb3 , Spn8ALgxb1 , Spn8ALgxb2 , Spn8ALgxb3 , & + Spn8ALgyb1 , Spn8ALgyb2 , Spn8ALgyb3 , Spn8ALgzb1 , Spn8ALgzb2 , Spn8ALgzb3 , Spn8ALxb1 , & + Spn8ALxb2 , Spn8ALxb3 , Spn8ALyb1 , Spn8ALyb2 , Spn8ALyb3 , Spn8ALzb1 , Spn8ALzb2 , & + Spn8ALzb3 , Spn8FLxb1 , Spn8FLxb2 , Spn8FLxb3 , Spn8FLyb1 , Spn8FLyb2 , Spn8FLyb3 , & + Spn8FLzb1 , Spn8FLzb2 , Spn8FLzb3 , Spn8MLxb1 , Spn8MLxb2 , Spn8MLxb3 , Spn8MLyb1 , & + Spn8MLyb2 , Spn8MLyb3 , Spn8MLzb1 , Spn8MLzb2 , Spn8MLzb3 , Spn8RDxb1 , Spn8RDxb2 , & + Spn8RDxb3 , Spn8RDyb1 , Spn8RDyb2 , Spn8RDyb3 , Spn8RDzb1 , Spn8RDzb2 , Spn8RDzb3 , & + Spn8TDxb1 , Spn8TDxb2 , Spn8TDxb3 , Spn8TDyb1 , Spn8TDyb2 , Spn8TDyb3 , Spn8TDzb1 , & + Spn8TDzb2 , Spn8TDzb3 , Spn9ALgxb1 , Spn9ALgxb2 , Spn9ALgxb3 , Spn9ALgyb1 , Spn9ALgyb2 , & + Spn9ALgyb3 , Spn9ALgzb1 , Spn9ALgzb2 , Spn9ALgzb3 , Spn9ALxb1 , Spn9ALxb2 , Spn9ALxb3 , & + Spn9ALyb1 , Spn9ALyb2 , Spn9ALyb3 , Spn9ALzb1 , Spn9ALzb2 , Spn9ALzb3 , Spn9FLxb1 , & + Spn9FLxb2 , Spn9FLxb3 , Spn9FLyb1 , Spn9FLyb2 , Spn9FLyb3 , Spn9FLzb1 , Spn9FLzb2 , & + Spn9FLzb3 , Spn9MLxb1 , Spn9MLxb2 , Spn9MLxb3 , Spn9MLyb1 , Spn9MLyb2 , Spn9MLyb3 , & + Spn9MLzb1 , Spn9MLzb2 , Spn9MLzb3 , Spn9RDxb1 , Spn9RDxb2 , Spn9RDxb3 , Spn9RDyb1 , & + Spn9RDyb2 , Spn9RDyb3 , Spn9RDzb1 , Spn9RDzb2 , Spn9RDzb3 , Spn9TDxb1 , Spn9TDxb2 , & + Spn9TDxb3 , Spn9TDyb1 , Spn9TDyb2 , Spn9TDyb3 , Spn9TDzb1 , Spn9TDzb2 , Spn9TDzb3 , & + TailFurlP , TailFurlA , TailFurlP , TailFurlV , TeetAya , TeetPya , TeetPya , & + TeetVya , TFrlBrM , TipClrnc1 , TipClrnc2 , TipClrnc3 , TipALgxb1 , TipALgxb2 , & + TipALgxb3 , TipALgyb1 , TipALgyb2 , TipALgyb3 , TipALgzb1 , TipALgzb2 , TipALgzb3 , & + TipALxb1 , TipALxb2 , TipALxb3 , TipALyb1 , TipALyb2 , TipALyb3 , TipALzb1 , & + TipALzb2 , TipALzb3 , TipClrnc1 , TipClrnc2 , TipClrnc3 , TipDxb1 , TipDxb2 , & + TipDxb3 , TipDxc1 , TipDxc2 , TipDxc3 , TipDyb1 , TipDyb2 , TipDyb3 , & + TipDyc1 , TipDyc2 , TipDyc3 , TipDzc1 , TipDzc2 , TipDzc3 , TipDzc1 , & + TipDzc2 , TipDzc3 , TipRDxb1 , TipRDxb2 , TipRDxb3 , TipRDyb1 , TipRDyb2 , & + TipRDyb3 , TipRDzc1 , TipRDzc2 , TipRDzc3 , TipRDzc1 , TipRDzc2 , TipRDzc3 , & + YawBrTDzt , YawBrTDxt , YawBrRDyt , YawBrRDxt , YawBrTDyt , YawBrRDzt , TwHt1ALgxt , & + TwHt1ALgyt , TwHt1ALgzt , TwHt1ALxt , TwHt1ALyt , TwHt1ALzt , TwHt1FLxt , TwHt1FLyt , & + TwHt1FLzt , TwHt1MLxt , TwHt1MLyt , TwHt1MLzt , TwHt1RDxt , TwHt1RDyt , TwHt1RDzt , & + TwHt1RPxi , TwHt1RPyi , TwHt1RPzi , TwHt1TDxt , TwHt1TDyt , TwHt1TDzt , TwHt1TPxi , & + TwHt1TPyi , TwHt1TPzi , TwHt2ALgxt , TwHt2ALgyt , TwHt2ALgzt , TwHt2ALxt , TwHt2ALyt , & + TwHt2ALzt , TwHt2FLxt , TwHt2FLyt , TwHt2FLzt , TwHt2MLxt , TwHt2MLyt , TwHt2MLzt , & + TwHt2RDxt , TwHt2RDyt , TwHt2RDzt , TwHt2RPxi , TwHt2RPyi , TwHt2RPzi , TwHt2TDxt , & + TwHt2TDyt , TwHt2TDzt , TwHt2TPxi , TwHt2TPyi , TwHt2TPzi , TwHt3ALgxt , TwHt3ALgyt , & + TwHt3ALgzt , TwHt3ALxt , TwHt3ALyt , TwHt3ALzt , TwHt3FLxt , TwHt3FLyt , TwHt3FLzt , & + TwHt3MLxt , TwHt3MLyt , TwHt3MLzt , TwHt3RDxt , TwHt3RDyt , TwHt3RDzt , TwHt3RPxi , & + TwHt3RPyi , TwHt3RPzi , TwHt3TDxt , TwHt3TDyt , TwHt3TDzt , TwHt3TPxi , TwHt3TPyi , & + TwHt3TPzi , TwHt4ALgxt , TwHt4ALgyt , TwHt4ALgzt , TwHt4ALxt , TwHt4ALyt , TwHt4ALzt , & + TwHt4FLxt , TwHt4FLyt , TwHt4FLzt , TwHt4MLxt , TwHt4MLyt , TwHt4MLzt , TwHt4RDxt , & + TwHt4RDyt , TwHt4RDzt , TwHt4RPxi , TwHt4RPyi , TwHt4RPzi , TwHt4TDxt , TwHt4TDyt , & + TwHt4TDzt , TwHt4TPxi , TwHt4TPyi , TwHt4TPzi , TwHt5ALgxt , TwHt5ALgyt , TwHt5ALgzt , & + TwHt5ALxt , TwHt5ALyt , TwHt5ALzt , TwHt5FLxt , TwHt5FLyt , TwHt5FLzt , TwHt5MLxt , & + TwHt5MLyt , TwHt5MLzt , TwHt5RDxt , TwHt5RDyt , TwHt5RDzt , TwHt5RPxi , TwHt5RPyi , & + TwHt5RPzi , TwHt5TDxt , TwHt5TDyt , TwHt5TDzt , TwHt5TPxi , TwHt5TPyi , TwHt5TPzi , & + TwHt6ALgxt , TwHt6ALgyt , TwHt6ALgzt , TwHt6ALxt , TwHt6ALyt , TwHt6ALzt , TwHt6FLxt , & + TwHt6FLyt , TwHt6FLzt , TwHt6MLxt , TwHt6MLyt , TwHt6MLzt , TwHt6RDxt , TwHt6RDyt , & + TwHt6RDzt , TwHt6RPxi , TwHt6RPyi , TwHt6RPzi , TwHt6TDxt , TwHt6TDyt , TwHt6TDzt , & + TwHt6TPxi , TwHt6TPyi , TwHt6TPzi , TwHt7ALgxt , TwHt7ALgyt , TwHt7ALgzt , TwHt7ALxt , & + TwHt7ALyt , TwHt7ALzt , TwHt7FLxt , TwHt7FLyt , TwHt7FLzt , TwHt7MLxt , TwHt7MLyt , & + TwHt7MLzt , TwHt7RDxt , TwHt7RDyt , TwHt7RDzt , TwHt7RPxi , TwHt7RPyi , TwHt7RPzi , & + TwHt7TDxt , TwHt7TDyt , TwHt7TDzt , TwHt7TPxi , TwHt7TPyi , TwHt7TPzi , TwHt8ALgxt , & + TwHt8ALgyt , TwHt8ALgzt , TwHt8ALxt , TwHt8ALyt , TwHt8ALzt , TwHt8FLxt , TwHt8FLyt , & + TwHt8FLzt , TwHt8MLxt , TwHt8MLyt , TwHt8MLzt , TwHt8RDxt , TwHt8RDyt , TwHt8RDzt , & + TwHt8RPxi , TwHt8RPyi , TwHt8RPzi , TwHt8TDxt , TwHt8TDyt , TwHt8TDzt , TwHt8TPxi , & + TwHt8TPyi , TwHt8TPzi , TwHt9ALgxt , TwHt9ALgyt , TwHt9ALgzt , TwHt9ALxt , TwHt9ALyt , & + TwHt9ALzt , TwHt9FLxt , TwHt9FLyt , TwHt9FLzt , TwHt9MLxt , TwHt9MLyt , TwHt9MLzt , & + TwHt9RDxt , TwHt9RDyt , TwHt9RDzt , TwHt9RPxi , TwHt9RPyi , TwHt9RPzi , TwHt9TDxt , & + TwHt9TDyt , TwHt9TDzt , TwHt9TPxi , TwHt9TPyi , TwHt9TPzi , TwrBsFxt , TwrBsFyt , & + TwrBsFzt , TwrBsMxt , TwrBsMyt , TwrBsMzt , TipClrnc1 , TipClrnc2 , TipClrnc3 , & + TwrTpTDxi , TwrTpTDyi , TwrTpTDzi , TipRDzc1 , TipRDzc2 , TipRDzc3 , YawAzn , & + YawAzn , YawAzn , YawBrFxn , YawBrFxp , YawBrFyn , YawBrFyp , YawBrFzn , & + YawBrFzn , YawBrMxn , YawBrMxp , YawBrMyn , YawBrMyp , YawBrMzn , YawBrMzn , & + YawBrRAxp , YawBrRAyp , YawBrRAzp , YawBrRDxt , YawBrRDyt , YawBrRDzt , YawBrRVxp , & + YawBrRVyp , YawBrRVzp , YawBrTAgxp , YawBrTAgyp , YawBrTAgzp , YawBrTAxp , YawBrTAyp , & + YawBrTAzp , TwrTpTDxi , YawBrTDxp , YawBrTDxt , TwrTpTDyi , YawBrTDyp , YawBrTDyt , & + TwrTpTDzi , YawBrTDzp , YawBrTDzt , YawBrTVxp , YawBrTVyp , YawBrTVzp , YawFriMfp , & + YawFriMom , YawFriMz , YawPzn , YawPzn , YawPzn , YawVzn , YawVzn , & + YawVzn /) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(1121) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(deg) ","(deg/s^2)","(deg/s^2)","(deg/s^2)","(deg) ","(deg) ","(deg) ", & + "(deg/s) ","(deg/s) ","(deg/s) ","(deg) ","(deg) ","(deg) ","(deg/s^2)", & + "(deg/s^2)","(rpm) ","(kN-m) ","(deg/s^2)","(kW) ","(kN-m) ","(rpm) ", & + "(m) ","(m) ","(m) ","(deg/s^2)","(deg/s^2)","(deg/s^2)","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ", & + "(rpm) ","(rpm) ","(rpm) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kW) ","(kN-m) ","(deg/s^2)", & + "(deg/s^2)","(deg/s^2)","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ", & + "(deg) ","(deg) ","(rpm) ","(rpm) ","(rpm) ","(deg) ","(deg/s^2)", & + "(deg) ","(deg/s) ","(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/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s) ","(m/s) ","(m/s) ","(deg/s) ","(m) ","(m) ","(m) ", & "(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & - "(deg/s^2)","(deg/s^2)","(rpm) ","(kN-m) ","(deg/s^2)","(kW) ","(kN-m) ", & - "(rpm) ","(m) ","(m) ","(m) ","(deg/s^2)","(deg/s^2)","(deg/s^2)", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN-m) ", & - "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ", & - "(deg) ","(rpm) ","(rpm) ","(rpm) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kW) ","(kN-m) ", & - "(deg/s^2)","(deg/s^2)","(deg/s^2)","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & - "(deg) ","(deg) ","(deg) ","(rpm) ","(rpm) ","(rpm) ","(deg) ", & - "(deg/s^2)","(deg) ","(deg/s) ","(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/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(deg/s) ","(m) ","(m) ", & - "(m) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & - "(deg) ","(deg) ","(deg) ","(m) ","(deg) ","(deg/s^2)","(deg/s^2)", & - "(deg/s^2)","(deg/s^2)","(deg/s^2)","(deg/s^2)","(deg) ","(deg) ","(deg) ", & - "(deg) ","(deg/s) ","(deg/s) ","(deg/s) ","(deg/s) ","(deg/s) ","(deg/s) ", & - "(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(deg) ","(m/s^2) ", & + "(deg) ","(deg) ","(m) ","(deg) ","(deg/s^2)","(deg/s^2)","(deg/s^2)", & + "(deg/s^2)","(deg/s^2)","(deg/s^2)","(deg) ","(deg) ","(deg) ","(deg) ", & + "(deg/s) ","(deg/s) ","(deg/s) ","(deg/s) ","(deg/s) ","(deg/s) ","(m) ", & + "(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(deg) ","(m/s^2) ","(m/s^2) ", & "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(rad/s^2)","(rad/s^2)","(m/s^2) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(m/s^2) ","(m/s^2) ","(rad/s^2)","(m/s^2) ","(m/s^2) ","(rad/s^2)","(m/s^2) ", & - "(m/s^2) ","(rad/s^2)","(rad/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(rad/s) ","(rad/s) ", & - "(m/s) ","(rad/s) ","(rad/s) ","(rad/s) ","(m/s) ","(m/s) ","(rad/s) ", & - "(m/s) ","(m/s) ","(rad/s) ","(m/s) ","(m/s) ","(rad/s) ","(rad/s) ", & + "(rad/s^2)","(rad/s^2)","(m/s^2) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(m/s^2) ", & + "(m/s^2) ","(rad/s^2)","(m/s^2) ","(m/s^2) ","(rad/s^2)","(m/s^2) ","(m/s^2) ", & + "(rad/s^2)","(rad/s^2)","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(rad/s) ","(rad/s) ","(m/s) ", & + "(rad/s) ","(rad/s) ","(rad/s) ","(m/s) ","(m/s) ","(rad/s) ","(m/s) ", & + "(m/s) ","(rad/s) ","(m/s) ","(m/s) ","(rad/s) ","(rad/s) ","(m) ", & "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & - "(m) ","(m) ","(rad) ","(rad) ","(m) ","(rad) ","(rad) ", & - "(rad) ","(m) ","(m) ","(rad) ","(m) ","(m) ","(rad) ", & - "(m) ","(m) ","(rad) ","(rad) ","(kN-m) ","(deg) ","(deg) ", & - "(deg) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(m) ","(rad) ","(rad) ","(m) ","(rad) ","(rad) ","(rad) ", & + "(m) ","(m) ","(rad) ","(m) ","(m) ","(rad) ","(m) ", & + "(m) ","(rad) ","(rad) ","(kN-m) ","(deg) ","(deg) ","(deg) ", & "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg/s^2)", & + "(deg) ","(deg/s^2)","(deg) ","(deg/s) ","(kW) ","(rpm) ","(deg/s^2)", & + "(deg) ","(deg/s) ","(kN) ","(kN-m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ", & + "(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ","(deg) ", & + "(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(m) ","(m) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN-m) ", & "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & - "(deg/s^2)","(deg) ","(deg/s^2)","(deg) ","(deg/s) ","(kW) ","(rpm) ", & - "(deg/s^2)","(deg) ","(deg/s) ","(kN) ","(kN-m) ","(m/s^2) ","(m/s^2) ", & + "(kN-m) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & + "(deg) ","(deg) ","(deg) ","(m) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ", & "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & "(m/s^2) ","(m/s^2) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & @@ -4177,46 +4294,16 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) "(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ","(deg) ", & "(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(m) ","(m) ", & "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & + "(deg) ","(deg/s^2)","(deg) ","(deg/s) ","(deg/s^2)","(deg) ","(deg) ", & + "(deg/s) ","(kN-m) ","(m) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ", & "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN-m) ", & - "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & - "(kN-m) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & - "(deg) ","(deg) ","(deg) ","(m) ","(m) ","(m) ","(m) ", & - "(m) ","(m) ","(m) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & - "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ", & - "(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & - "(deg) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & - "(m) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & - "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ", & - "(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(m) ", & - "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & - "(m) ","(deg) ","(deg/s^2)","(deg) ","(deg/s) ","(deg/s^2)","(deg) ", & - "(deg) ","(deg/s) ","(kN-m) ","(m) ","(m) ","(m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m) ","(m) ", & "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & - "(m) ","(m) ","(m) ","(deg) ","(deg) ","(deg) ","(deg) ", & + "(m) ","(m) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & "(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & - "(deg) ","(m) ","(m) ","(deg) ","(deg) ","(m) ","(deg) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(kN) ", & - "(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ", & - "(deg) ","(deg) ","(deg) ","(deg) ","(m) ","(m) ","(m) ", & - "(m) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ", & - "(kN-m) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & - "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m/s^2) ", & + "(m) ","(m) ","(deg) ","(deg) ","(m) ","(deg) ","(m/s^2) ", & "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(kN) ","(kN) ", & "(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ", & "(deg) ","(deg) ","(deg) ","(m) ","(m) ","(m) ","(m) ", & @@ -4240,17 +4327,24 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) "(m) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & "(m/s^2) ","(m/s^2) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ", & "(kN-m) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ", & - "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(kN) ", & - "(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m) ", & - "(m) ","(m) ","(m) ","(m) ","(deg) ","(deg) ","(deg) ", & - "(deg/s^2)","(deg/s^2)","(deg/s^2)","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & - "(kN-m) ","(deg/s^2)","(deg/s^2)","(deg/s^2)","(deg) ","(deg) ","(deg) ", & - "(deg/s) ","(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m) ","(m) ", & - "(m) ","(m) ","(m) ","(m) ","(m/s) ","(m/s) ","(m/s) ", & - "(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ","(deg/s) ", & - "(deg/s) ","(deg/s) "/) + "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(kN) ","(kN) ", & + "(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ", & + "(deg) ","(deg) ","(deg) ","(m) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(m) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(kN) ","(kN) ", & + "(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(m) ","(deg) ","(deg) ","(deg) ","(deg/s^2)", & + "(deg/s^2)","(deg/s^2)","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(deg/s^2)","(deg/s^2)","(deg/s^2)","(deg) ","(deg) ","(deg) ","(deg/s) ", & + "(deg/s) ","(deg/s) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(m) ","(m/s) ","(m/s) ","(m/s) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ","(deg/s) ","(deg/s) ", & + "(deg/s) "/) ! Initialize values @@ -4365,6 +4459,13 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) END DO !I + DO J = 1,p%NumBl + IF ( .NOT. p%DOF_Flag(DOF_BP(J)) ) THEN + InvalidOutput( BldPRate(J) ) = .TRUE. + InvalidOutput( BldPAcc (J) ) = .TRUE. + END IF + END DO + DO J = p%NTwGages+1,9 !Invalid tower gages ! Motions @@ -4409,6 +4510,8 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) ! Invalid outputs based on number of blades IF ( p%NumBl < 3 ) THEN InvalidOutput(PtchPMzc3) = .TRUE. + InvalidOutput(BldPRate3) = .TRUE. + InvalidOutput( BldPAcc3) = .TRUE. InvalidOutput( Q_B3E1) = .TRUE. InvalidOutput( Q_B3F1) = .TRUE. InvalidOutput( Q_B3F2) = .TRUE. @@ -4421,6 +4524,8 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) ENDIF IF ( p%NumBl < 2 ) THEN InvalidOutput(PtchPMzc2) = .TRUE. + InvalidOutput(BldPRate2) = .TRUE. + InvalidOutput( BldPAcc2) = .TRUE. InvalidOutput( Q_B2E1) = .TRUE. InvalidOutput( Q_B2F1) = .TRUE. InvalidOutput( Q_B2F2) = .TRUE. @@ -4570,9 +4675,6 @@ SUBROUTINE Coeff(p,InputFileData, ErrStat, ErrMsg) REAL(ReKi) :: AxRdTFAOld(2,2) ! Previous AxRdTFA (i.e., AxRdTFA from the previous node) REAL(ReKi) :: AxRdTSS (2,2) ! Temporary result holding the current addition to the AxRedTSS() array. REAL(ReKi) :: AxRdTSSOld(2,2) ! Previous AxRdTSS (i.e., AxRdTSS from the previous node) - REAL(ReKi) :: TmpDist ! Temporary distance used in the calculation of the aero center locations. - REAL(ReKi) :: TmpDistj1 ! Temporary distance used in the calculation of the aero center locations. - REAL(ReKi) :: TmpDistj2 ! Temporary distance used in the calculation of the aero center locations. REAL(ReKi) :: ElmntStff ! (Temporary) stiffness of an element. REAL(ReKi) :: ElStffFA ! (Temporary) tower fore-aft stiffness of an element REAL(ReKi) :: ElStffSS ! (Temporary) tower side-to-side stiffness of an element @@ -4601,25 +4703,6 @@ SUBROUTINE Coeff(p,InputFileData, ErrStat, ErrMsg) ErrStat = ErrID_None ErrMsg = '' - !............................................................................................................................... - ! Calculate the distances from point S on a blade to the aerodynamic center in the j1 and j2 directions: - !............................................................................................................................... - - DO K = 1,p%NumBl ! Loop through the blades - - DO J = 1,p%BldNodes ! Loop through the blade nodes / elements - - TmpDist = ( 0.25 - p%PitchAxis(K,J) )*p%Chord(J) ! Distance along the chordline from point S (25% chord) to the aerodynamic center of the blade element J--positive towards the trailing edge. - TmpDistj1 = TmpDist*p%SAeroTwst(J) ! Distance along the j1-axis from point S (25% chord) to the aerodynamic center of the blade element J - TmpDistj2 = TmpDist*p%CAeroTwst(J) ! Distance along the j2-axis from point S (25% chord) to the aerodynamic center of the blade element J - p%rSAerCenn1(K,J) = TmpDistj1*p%CThetaS(K,J) - TmpDistj2*p%SThetaS(K,J) - p%rSAerCenn2(K,J) = TmpDistj1*p%SThetaS(K,J) + TmpDistj2*p%CThetaS(K,J) - - ENDDO ! J - Blade nodes / elements - - ENDDO ! K - Blades - - !............................................................................................................................... ! Calculate the structure that furls with the rotor inertia term: !............................................................................................................................... @@ -5858,6 +5941,21 @@ SUBROUTINE SetEnabledDOFIndexArrays( p ) ENDIF + DO K = 1,p%NumBl ! Loop through all blades + IF ( p%DOF_Flag(DOF_BP(K )) ) THEN ! Blade pitch. + + p%DOFs%NActvDOF = p%DOFs%NActvDOF + 1 + p%DOFs%NPSBE(K) = p%DOFs%NPSBE(K) + 1 + p%DOFs%NPSE (K) = p%DOFs%NPSE (K) + 1 + + p%DOFs%PS ( p%DOFs%NActvDOF) = DOF_BP(K ) + p%DOFs%PSBE (K,p%DOFs%NPSBE(K)) = DOF_BP(K ) + p%DOFs%PSE (K,p%DOFs%NPSE (K)) = DOF_BP(K ) + + ENDIF + ENDDO ! K - Blades + + DO K = 1,p%NumBl ! Loop through all blades IF ( p%DOF_Flag(DOF_BF(K,1)) ) THEN ! 1st blade flap. @@ -5937,7 +6035,7 @@ SUBROUTINE SetCoordSy( t, CoordSys, RtHSdat, BlPitch, p, x, ErrStat, ErrMsg ) ! Subroutine arguments (passed variables) REAL(DbKi), INTENT(IN) :: t !< Current simulation time, in seconds (used only for SmllRotTrans error messages) - REAL(ReKi), INTENT(IN) :: BlPitch (:) !< The current blade pitch + REAL(ReKi), INTENT(IN) :: BlPitch (:) !< The current blade pitch command TYPE(ED_CoordSys), INTENT(INOUT) :: CoordSys !< The coordinate systems to be set TYPE(ED_RtHndSide), INTENT(INOUT) :: RtHSdat !< data from the RtHndSid module TYPE(ED_ParameterType), INTENT(IN) :: p !< The module's parameters @@ -6032,7 +6130,7 @@ SUBROUTINE SetCoordSy( t, CoordSys, RtHSdat, BlPitch, p, x, ErrStat, ErrMsg ) ThetaFA = -p%TwrFASF(1,J ,1)*x%QT(DOF_TFA1) - p%TwrFASF(2,J ,1)*x%QT(DOF_TFA2) ThetaSS = p%TwrSSSF(1,J ,1)*x%QT(DOF_TSS1) + p%TwrSSSF(2,J ,1)*x%QT(DOF_TSS2) - CALL SmllRotTrans( 'tower deflection (ElastoDyn SetCoordSy)', ThetaSS, 0.0_R8Ki, ThetaFA, TransMat, TRIM(Num2LStr(t))//' s', ErrStat2, ErrMsg2 ) ! Get the transformation matrix, TransMat, from tower-base to tower element-fixed coordinate systems. + CALL SmllRotTrans( 'tower deflection (ElastoDyn SetCoordSy)', ThetaSS, 0.0_R8Ki, ThetaFA, TransMat, ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) ! Get the transformation matrix, TransMat, from tower-base to tower element-fixed coordinate systems. CALL CheckError( ErrStat2, ErrMsg2 ) IF (ErrStat >= AbortErrLev) RETURN @@ -6049,7 +6147,7 @@ SUBROUTINE SetCoordSy( t, CoordSys, RtHSdat, BlPitch, p, x, ErrStat, ErrMsg ) ThetaFA = -p%TwrFASF(1,p%TTopNode,1)*x%QT(DOF_TFA1) - p%TwrFASF(2,p%TTopNode,1)*x%QT(DOF_TFA2) ThetaSS = p%TwrSSSF(1,p%TTopNode,1)*x%QT(DOF_TSS1) + p%TwrSSSF(2,p%TTopNode,1)*x%QT(DOF_TSS2) - CALL SmllRotTrans( 'tower deflection (ElastoDyn SetCoordSy)', ThetaSS, 0.0_R8Ki, ThetaFA, TransMat, TRIM(Num2LStr(t))//' s', ErrStat2, ErrMsg2 ) ! Get the transformation matrix, TransMat, from tower-base to tower-top/base-plate coordinate systems. + CALL SmllRotTrans( 'tower deflection (ElastoDyn SetCoordSy)', ThetaSS, 0.0_R8Ki, ThetaFA, TransMat, ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) ! Get the transformation matrix, TransMat, from tower-base to tower-top/base-plate coordinate systems. CALL CheckError( ErrStat2, ErrMsg2 ) IF (ErrStat >= AbortErrLev) RETURN @@ -6155,8 +6253,13 @@ SUBROUTINE SetCoordSy( t, CoordSys, RtHSdat, BlPitch, p, x, ErrStat, ErrMsg ) ! Blade / pitched coordinate system: - CosPitch = COS( REAL(BlPitch(K),R8Ki) ) - SinPitch = SIN( REAL(BlPitch(K),R8Ki) ) + IF ( p%DOF_Flag(DOF_BP(K)) ) THEN + CosPitch = COS( x%QT(DOF_BP(K)) ) + SinPitch = SIN( x%QT(DOF_BP(K)) ) + ELSE + CosPitch = COS( REAL(BlPitch(K),R8Ki) ) + SinPitch = SIN( REAL(BlPitch(K),R8Ki) ) + END IF CoordSys%j1(K,:) = CosPitch*CoordSys%i1(K,:) - SinPitch*CoordSys%i2(K,:) ! j1(K,:) = vector / direction j1 for blade K (= xbK from the IEC coord. system). CoordSys%j2(K,:) = SinPitch*CoordSys%i1(K,:) + CosPitch*CoordSys%i2(K,:) ! j2(K,:) = vector / direction j2 for blade K (= ybK from the IEC coord. system). @@ -6185,7 +6288,7 @@ SUBROUTINE SetCoordSy( t, CoordSys, RtHSdat, BlPitch, p, x, ErrStat, ErrMsg ) ThetaLxb = p%CThetaS(K,J)*ThetaIP - p%SThetaS(K,J)*ThetaOoP ThetaLyb = p%SThetaS(K,J)*ThetaIP + p%CThetaS(K,J)*ThetaOoP - CALL SmllRotTrans( 'blade deflection (ElastoDyn SetCoordSy)', ThetaLxb, ThetaLyb, 0.0_R8Ki, TransMat, TRIM(Num2LStr(t))//' s', ErrStat2, ErrMsg2 ) ! Get the transformation matrix, TransMat, from blade coordinate system aligned with local structural axes (not element fixed) to blade element-fixed coordinate system aligned with local structural axes. + CALL SmllRotTrans( 'blade deflection (ElastoDyn SetCoordSy)', ThetaLxb, ThetaLyb, 0.0_R8Ki, TransMat, ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) ! Get the transformation matrix, TransMat, from blade coordinate system aligned with local structural axes (not element fixed) to blade element-fixed coordinate system aligned with local structural axes. CALL CheckError( ErrStat2, ErrMsg2 ) IF (ErrStat >= AbortErrLev) RETURN @@ -6598,7 +6701,7 @@ SUBROUTINE CalculatePositions( p, x, CoordSys, RtHSdat ) ! that are not dependent on the distributed tower or blade parameters: RtHSdat%rZ = x%QT(DOF_Sg)* CoordSys%z1 + x%QT(DOF_Hv)* CoordSys%z2 - x%QT(DOF_Sw)* CoordSys%z3 ! Position vector from inertia frame origin to platform reference (point Z). - RtHSdat%rZY = p%rZYzt* CoordSys%a2 + p%PtfmCMxt*CoordSys%a1 - p%PtfmCMyt*CoordSys%a3 ! Position vector from platform reference (point Z) to platform mass center (point Y). + RtHSdat%rZY = p%rZYxt*CoordSys%a1 - p%rZYyt*CoordSys%a3 + p%rZYzt*CoordSys%a2 ! Position vector from platform reference (point Z) to platform mass center (point Y). RtHSdat%rZT0 = p%rZT0zt* CoordSys%a2 ! Position vector from platform reference (point Z) to tower base (point T(0)) RtHSdat%rZO = ( x%QT(DOF_TFA1) + x%QT(DOF_TFA2) )*CoordSys%a1 & ! Position vector from platform reference (point Z) to tower-top / base plate (point O). + ( p%RefTwrHt - 0.5*( p%AxRedTFA(1,1,p%TTopNode)*x%QT(DOF_TFA1)*x%QT(DOF_TFA1) & @@ -6730,7 +6833,7 @@ SUBROUTINE CalculateAngularPosVelPAcc( p, x, CoordSys, RtHSdat, ErrStat, ErrMsg CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message !Local variables - + REAL(ReKi) :: AngVelHM (3) ! Angular velocity of eleMent J of blade K (body M) in the hub (body H). ! REAL(ReKi) :: AngVelEN (3) ! Angular velocity of the nacelle (body N) in the inertia frame (body E for earth). REAL(ReKi) :: AngAccELt (3) ! Portion of the angular acceleration of the low-speed shaft (body L) in the inertia frame (body E for earth) associated with everything but the QD2T()'s. @@ -6873,34 +6976,33 @@ SUBROUTINE CalculateAngularPosVelPAcc( p, x, CoordSys, RtHSdat, ErrStat, ErrMsg ! of DOF I for body M of blade K, element J in body E. RtHSdat%PAngVelEM(K,J, :,0,:) = RtHSdat%PAngVelEH(:,0,:) + RtHSdat%PAngVelEM(K,J,DOF_BP(K ),0,:) = -CoordSys%j3(K,:) RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),0,:) = - p%TwistedSF(K,2,1,J,1)*CoordSys%j1(K,:) & + p%TwistedSF(K,1,1,J,1)*CoordSys%j2(K,:) RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),0,:) = - p%TwistedSF(K,2,2,J,1)*CoordSys%j1(K,:) & + p%TwistedSF(K,1,2,J,1)*CoordSys%j2(K,:) RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),0,:) = - p%TwistedSF(K,2,3,J,1)*CoordSys%j1(K,:) & + p%TwistedSF(K,1,3,J,1)*CoordSys%j2(K,:) - AngVelHM = x%QDT(DOF_BF(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),0,:) & + AngVelHM = x%QDT(DOF_BP(K ))*RtHSdat%PAngVelEM(K,J,DOF_BP(K ),0,:) & + + x%QDT(DOF_BF(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),0,:) & + x%QDT(DOF_BF(K,2))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),0,:) & + x%QDT(DOF_BE(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),0,:) RtHSdat%AngVelEM(:,J,K ) = RtHSdat%AngVelEH + AngVelHM - RtHSdat%AngPosHM(:,K,J ) = x%QT (DOF_BF(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),0,:) & + RtHSdat%AngPosHM(:,K,J ) = x%QT (DOF_BF(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),0,:) & ! Used for local blade rotational deflection output only; no need to introduce pitch here. + x%QT (DOF_BF(K,2))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),0,:) & + x%QT (DOF_BE(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),0,:) - RtHSdat%AngAccEKt(:,J ,K) = RtHSdat%AngAccEHt + x%QDT(DOF_BF(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),1,:) & - + x%QDT(DOF_BF(K,2))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),1,:) & - + x%QDT(DOF_BE(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),1,:) ! Define the 1st derivatives of the partial angular velocities of the current node (body M(RNodes(J))) in the inertia frame: - ! NOTE: These are currently unused by the code, therefore, they need not - ! be calculated. Thus, they are currently commented out. If it - ! turns out that they are ever needed (i.e., if inertias of the - ! blade elements are ever added, etc...) simply uncomment out these computations: - ! RtHSdat%PAngVelEM(K,J, :,1,:) = RtHSdat%PAngVelEH(:,1,:) - ! RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEH, PAngVelEM(K,J,DOF_BF(K,1),0,:) ) - ! RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEH, PAngVelEM(K,J,DOF_BF(K,2),0,:) ) - ! RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEH, PAngVelEM(K,J,DOF_BE(K,1),0,:) ) - + RtHSdat%PAngVelEM(K,J, :,1,:) = RtHSdat%PAngVelEH(:,1,:) + RtHSdat%PAngVelEM(K,J,DOF_BP(K ),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K) , RtHSdat%PAngVelEM(K,J,DOF_BP(K ),0,:) ) + RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K) , RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),0,:) ) + RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K) , RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),0,:) ) + RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),1,:) = CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K) , RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),0,:) ) + RtHSdat%AngAccEKt(:,J ,K) = RtHSdat%AngAccEHt + x%QDT(DOF_BP(K ))*RtHSdat%PAngVelEM(K,J,DOF_BP(K ),1,:) & + + x%QDT(DOF_BF(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,1),1,:) & + + x%QDT(DOF_BF(K,2))*RtHSdat%PAngVelEM(K,J,DOF_BF(K,2),1,:) & + + x%QDT(DOF_BE(K,1))*RtHSdat%PAngVelEM(K,J,DOF_BE(K,1),1,:) END DO !J = 1,p%BldNodes ! Loop through the blade nodes / elements @@ -6989,7 +7091,7 @@ SUBROUTINE CalculateLinearVelPAcc( p, x, CoordSys, RtHSdat ) REAL(ReKi) :: EwAXrWJ (3) ! = AngVelEA X rWJ REAL(ReKi) :: EwHXrPQ (3) ! = AngVelEH X rPQ REAL(ReKi) :: EwHXrQC (3) ! = AngVelEH X rQC - REAL(ReKi) :: EwHXrQS (3) ! = AngVelEH X rQS of the current blade point S. + REAL(ReKi) :: EwM0XrQS (3) ! = AngVelEM(0) X rQS of the current blade point S. REAL(ReKi) :: EwNXrOU (3) ! = AngVelEN X rOU REAL(ReKi) :: EwNXrOV (3) ! = AngVelEN X rOV REAL(ReKi) :: EwNXrOW (3) ! = AngVelEN X rOW @@ -7251,8 +7353,6 @@ SUBROUTINE CalculateLinearVelPAcc( p, x, CoordSys, RtHSdat ) ! Also, define the portion of the linear acceleration of the current node ! in the inertia frame associated with everything but the QD2T()'s: - EwHXrQS = CROSS_PRODUCT( RtHSdat%AngVelEH, RtHSdat%rQS(:,K,J) ) - RtHSdat%PLinVelES(K,J, :,:,:) = RtHSdat%PLinVelEQ(:,:,:) RtHSdat%PLinVelES(K,J,DOF_BF(K,1),0,:) = p%TwistedSF(K,1,1,J,0) *CoordSys%j1(K,:) & !bjj: this line can be optimized + p%TwistedSF(K,2,1,J,0) *CoordSys%j2(K,:) & @@ -7270,9 +7370,9 @@ SUBROUTINE CalculateLinearVelPAcc( p, x, CoordSys, RtHSdat ) + p%AxRedBld(K,1,2,J)*x%QT ( DOF_BF(K,1) ) & + p%AxRedBld(K,2,3,J)*x%QT ( DOF_BE(K,1) ) )*CoordSys%j3(K,:) - TmpVec1 = CROSS_PRODUCT( RtHSdat%AngVelEH, RtHSdat%PLinVelES(K,J,DOF_BF(K,1),0,:) ) - TmpVec2 = CROSS_PRODUCT( RtHSdat%AngVelEH, RtHSdat%PLinVelES(K,J,DOF_BE(K,1),0,:) ) - TmpVec3 = CROSS_PRODUCT( RtHSdat%AngVelEH, RtHSdat%PLinVelES(K,J,DOF_BF(K,2),0,:) ) + TmpVec1 = CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K), RtHSdat%PLinVelES(K,J,DOF_BF(K,1),0,:) ) + TmpVec2 = CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K), RtHSdat%PLinVelES(K,J,DOF_BE(K,1),0,:) ) + TmpVec3 = CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K), RtHSdat%PLinVelES(K,J,DOF_BF(K,2),0,:) ) RtHSdat%PLinVelES(K,J,DOF_BF(K,1),1,:) = TmpVec1 & - ( p%AxRedBld(K,1,1,J)*x%QDT( DOF_BF(K,1) ) & @@ -7295,20 +7395,33 @@ SUBROUTINE CalculateLinearVelPAcc( p, x, CoordSys, RtHSdat ) + x%QDT( DOF_BF(K,2) )*RtHSdat%PLinVelES(K,J,DOF_BF(K,2),1,:) RtHSdat%LinVelES(:,J,K) = LinVelHS + RtHSdat%LinVelEZ + EwM0XrQS = CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K) , RtHSdat%rQS(:,K,J) ) + DO I = 1,p%NPH ! Loop through all DOFs associated with the angular motion of the hub (body H) - TmpVec0 = CROSS_PRODUCT( RtHSdat%PAngVelEH(p%PH(I),0,:), RtHSdat%rQS(:,K,J) ) !bjj: this line can be optimized - TmpVec1 = CROSS_PRODUCT( RtHSdat%PAngVelEH(p%PH(I),0,:), EwHXrQS + LinVelHS ) !bjj: this line can be optimized - TmpVec2 = CROSS_PRODUCT( RtHSdat%PAngVelEH(p%PH(I),1,:), RtHSdat%rQS(:,K,J) ) !bjj: this line can be optimized + TmpVec0 = CROSS_PRODUCT( RtHSdat%PAngVelEM(K,0,p%PH(I),0,:), RtHSdat%rQS(:,K,J) ) !bjj: this line can be optimized + TmpVec1 = CROSS_PRODUCT( RtHSdat%PAngVelEM(K,0,p%PH(I),0,:), LinVelHS + EwM0XrQS ) + TmpVec2 = CROSS_PRODUCT( RtHSdat%PAngVelEM(K,0,p%PH(I),1,:), RtHSdat%rQS(:,K,J) ) - RtHSdat%PLinVelES(K,J,p%PH(I),0,:) = RtHSdat%PLinVelES(K,J,p%PH(I),0,:) + TmpVec0 !bjj: this line can be optimized - RtHSdat%PLinVelES(K,J,p%PH(I),1,:) = RtHSdat%PLinVelES(K,J,p%PH(I),1,:) + TmpVec1 + TmpVec2 !bjj: this line can be optimized + RtHSdat%PLinVelES(K,J,p%PH(I),0,:) = RtHSdat%PLinVelES(K,J,p%PH(I),0,:) + TmpVec0 + RtHSdat%PLinVelES(K,J,p%PH(I),1,:) = RtHSdat%PLinVelES(K,J,p%PH(I),1,:) + TmpVec1 + TmpVec2 RtHSdat%LinVelES(:,J,K) = RtHSdat%LinVelES(:,J,K) + x%QDT(p%PH(I))*RtHSdat%PLinVelES(K,J,p%PH(I),0,:) !bjj: this line can be optimized RtHSdat%LinAccESt(:,K,J) = RtHSdat%LinAccESt(:,K,J) + x%QDT(p%PH(I))*RtHSdat%PLinVelES(K,J,p%PH(I),1,:) !bjj: this line can be optimized END DO ! I - all DOFs associated with the angular motion of the hub (body H) + ! Add contribution from blade pitch DoF + TmpVec0 = CROSS_PRODUCT( RtHSdat%PAngVelEM(K,0,DOF_BP(K),0,:) , RtHSdat%rQS(:,K,J) ) + TmpVec1 = CROSS_PRODUCT( RtHSdat%PAngVelEM(K,0,DOF_BP(K),0,:) , LinVelHS + EwM0XrQS ) + TmpVec2 = CROSS_PRODUCT( RtHSdat%PAngVelEM(K,0,DOF_BP(K),1,:) , RtHSdat%rQS(:,K,J) ) + + RtHSdat%PLinVelES(K,J,DOF_BP(K),0,:) = RtHSdat%PLinVelES(K,J,DOF_BP(K),0,:) + TmpVec0 + RtHSdat%PLinVelES(K,J,DOF_BP(K),1,:) = RtHSdat%PLinVelES(K,J,DOF_BP(K),1,:) + TmpVec1 + TmpVec2 + + RtHSdat%LinVelES(:,J,K) = RtHSdat%LinVelES(:,J,K) + x%QDT(DOF_BP(K))*RtHSdat%PLinVelES(K,J,DOF_BP(K),0,:) + RtHSdat%LinAccESt(:,K,J) = RtHSdat%LinAccESt(:,K,J) + x%QDT(DOF_BP(K))*RtHSdat%PLinVelES(K,J,DOF_BP(K),1,:) + END DO !J = 0,p%TipNodes ! Loop through the blade nodes / elements @@ -7478,16 +7591,6 @@ SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat ) DO J = 1,p%BldNodes ! Loop through the blade nodes / elements - - ! Calculate the aerodynamic pitching moment arm (i.e., the position vector - ! from point S on the blade to the aerodynamic center of the element): - - RtHSdat%rSAerCen(:,J,K) = p%rSAerCenn1(K,J)*CoordSys%n1(K,J,:) + p%rSAerCenn2(K,J)*CoordSys%n2(K,J,:) - -! rPAerCen = m%RtHS%rPQ + m%RtHS%rQS(:,K,J) + m%RtHS%rSAerCen(:,J,K) ! Position vector from teeter pin (point P) to blade analysis node aerodynamic center. -! rAerCen = m%RtHS%rS (:,K,J) + m%RtHS%rSAerCen(:,J,K) ! Position vector from inertial frame origin to blade analysis node aerodynamic center. - - ! fill FSAero() and MMAero() with the forces resulting from inputs u%BladeLn2Mesh(K)%Force(1:2,:) and u%BladeLn2Mesh(K)%Moment(3,:): ! [except, we're ignoring the additional nodes we added on the mesh end points] @@ -7509,7 +7612,7 @@ SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat ) !..................................... ! PFrcS0B and PMomH0B !..................................... -DO K = 1,p%NumBl ! Loop through all blades + DO K = 1,p%NumBl ! Loop through all blades ! Initialize the partial forces and moments (including those associated ! with the QD2T()'s and those that are not) at the blade root (point S(0)) @@ -7519,14 +7622,15 @@ SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat ) RtHSdat%PMomH0B(:,K,:) = 0.0 ! forces and moments to zero DO I = 1,p%DOFs%NPSE(K) ! Loop through all active (enabled) DOFs that contribute to the QD2T-related linear accelerations of blade K - TmpVec1 = -p%TipMass(K)*RtHSdat%PLinVelES(K,p%TipNode,p%DOFs%PSE(K,I),0,:) ! The portion of PFrcS0B associated with the tip brake + TmpVec1 = -p%TipMass(K)*RtHSdat%PLinVelES(K,p%TipNode,p%DOFs%PSE(K,I),0,:) ! The portion of PFrcS0B associated with the tip brake + TmpVec2 = -p%PitchIner(K) * CoordSys%j3(K,:) * DOT_PRODUCT( CoordSys%j3(K,:), RtHSdat%PAngVelEM(K,0,p%DOFs%PSE(K,I),0,:) ) RtHSdat%PFrcS0B(:,K,p%DOFs%PSE(K,I)) = TmpVec1 - RtHSdat%PMomH0B(:,K,p%DOFs%PSE(K,I)) = CROSS_PRODUCT( RtHSdat%rS0S(:,K,p%TipNode), TmpVec1 ) ! The portion of PMomH0B associated with the tip brake + RtHSdat%PMomH0B(:,K,p%DOFs%PSE(K,I)) = CROSS_PRODUCT( RtHSdat%rS0S(:,K,p%TipNode), TmpVec1 ) + TmpVec2 ! The portion of PMomH0B associated with the tip brake ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of blade K - - + + DO J = 1,p%BldNodes ! Loop through the blade nodes / elements ! Integrate to find the partial forces and moments (including those associated @@ -7543,7 +7647,6 @@ SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat ) ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of blade K END DO - END DO @@ -7551,10 +7654,13 @@ SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat ) ! FrcS0Bt and MomH0Bt !..................................... DO K = 1,p%NumBl ! Loop through all blades - + TmpVec1 = RtHSdat%FSTipDrag(:,K) - p%TipMass(K)*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccESt(:,K,p%TipNode) ) ! The portion of FrcS0Bt associated with the tip brake + TmpVec2 = - p%PitchIner(K)*CoordSys%j3(K,:)*DOT_PRODUCT(CoordSys%j3(K,:), RtHSdat%AngAccEKt(:,0,K) ) + TmpVec3 = - CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K), p%PitchIner(K)*CoordSys%j3(K,:)*DOT_PRODUCT(CoordSys%j3(K,:), RtHSdat%AngVelEM(:,0,K)) ) + RtHSdat%FrcS0Bt(:,K) = TmpVec1 - RtHSdat%MomH0Bt(:,K) = CROSS_PRODUCT( RtHSdat%rS0S(:,K,p%TipNode), TmpVec1 ) ! The portion of MomH0Bt associated with the tip brake + RtHSdat%MomH0Bt(:,K) = CROSS_PRODUCT( RtHSdat%rS0S(:,K,p%TipNode), TmpVec1 ) + TmpVec2 + TmpVec3 ! The portion of MomH0Bt associated with the tip brake DO J = 1,p%BldNodes ! Loop through the blade nodes / elements @@ -7566,7 +7672,14 @@ SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat ) RtHSdat%MomH0Bt(:,K) = RtHSdat%MomH0Bt(:,K) + TmpVec2 + TmpVec3 END DO !J - + + IF (p%BD4Blades) THEN + + RtHSdat%FrcS0Bt(:,K) = RtHSdat%FrcS0Bt(:,K) + (/u%BladeRootLoads(K)%Force (1,1), u%BladeRootLoads(K)%Force (3,1), -u%BladeRootLoads(K)%Force (2,1)/) + RtHSdat%MomH0Bt(:,K) = RtHSdat%MomH0Bt(:,K) + (/u%BladeRootLoads(K)%Moment(1,1), u%BladeRootLoads(K)%Moment(3,1), -u%BladeRootLoads(K)%Moment(2,1)/) + + END IF + END DO !K @@ -7633,7 +7746,7 @@ SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat ) RtHSdat%MomLPRott(1) = RtHSdat%MomLPRott(1) + u%HubPtLoad%Moment(1,1) RtHSdat%MomLPRott(2) = RtHSdat%MomLPRott(2) + u%HubPtLoad%Moment(3,1) RtHSdat%MomLPRott(3) = RtHSdat%MomLPRott(3) - u%HubPtLoad%Moment(2,1) - + DO K = 1,p%NumBl ! Loop through all blades ! Calculate the position vector from the teeter pin to the blade root: @@ -8108,6 +8221,7 @@ SUBROUTINE FillAugMat( p, x, CoordSys, u, HSSBrTrq, RtHSdat, AugMat ) ! Local variables REAL(ReKi) :: TmpVec (3) ! A temporary vector used in various computations. REAL(ReKi) :: TmpVec1 (3) ! A temporary vector used in various computations. + REAL(ReKi) :: TmpVec2 (3) ! A temporary vector used in various computations. REAL(ReKi) :: TmpVec3 (3) ! A temporary vector used in various computations. REAL(ReKi) :: GBoxTrq ! Gearbox torque on the LSS side in N-m (calculated from inputs and parameters). REAL(ReKi) :: GBoxEffFac2 ! A second gearbox efficiency factor = ( 1 / GBoxEff^SgnPrvLSTQ - 1 ) @@ -8136,19 +8250,34 @@ SUBROUTINE FillAugMat( p, x, CoordSys, u, HSSBrTrq, RtHSdat, AugMat ) DO L = 1,p%DOFs%NPSBE(K) ! Loop through all active (enabled) blade DOFs that contribute to the QD2T-related linear accelerations of the tip of blade K (point S(p%BldFlexL)) DO I = L,p%DOFs%NPSBE(K) ! Loop through all active (enabled) blade DOFs greater than or equal to L - AugMat(p%DOFs%PSBE(K,I),p%DOFs%PSBE(K,L)) = p%TipMass(K)*& - DOT_PRODUCT( RtHSdat%PLinVelES(K, p%TipNode, p%DOFs%PSBE(K,I),0,:), & ! [C(q,t)]B - RtHSdat%PLinVelES(K, p%TipNode, p%DOFs%PSBE(K,L),0,:) ) + AugMat(p%DOFs%PSBE(K,I),p%DOFs%PSBE(K,L)) = p%TipMass(K) * & + DOT_PRODUCT( RtHSdat%PLinVelES(K, p%TipNode, p%DOFs%PSBE(K,I),0,:), & ! [C(q,t)]B + RtHSdat%PLinVelES(K, p%TipNode, p%DOFs%PSBE(K,L),0,:) ) & + + DOT_PRODUCT( RtHSdat%PAngVelEM(K,0,p%DOFs%PSBE(K,I),0,:), & + p%PitchIner(K)*CoordSys%j3(K,:)*DOT_PRODUCT(CoordSys%j3(K,:),RtHSdat%PAngVelEM(K,0,p%DOFs%PSBE(K,L),0,:)) ) + ENDDO ! I - All active (enabled) blade DOFs greater than or equal to L ENDDO ! L - All active (enabled) blade DOFs that contribute to the QD2T-related linear accelerations of the tip of blade K (point S(p%BldFlexL)) TmpVec1 = RtHSdat%FSTipDrag(:,K) - p%TipMass(K)*( p%Gravity*CoordSys%z2 + RtHSdat%LinAccESt(:,K,p%TipNode) ) ! The portion of FrcS0Bt associated with the tip brake + TmpVec2 = -p%PitchIner(K)*CoordSys%j3(K,:)*DOT_PRODUCT(CoordSys%j3(K,:),RtHSdat%AngAccEKt(:,0,K)) + TmpVec3 = -CROSS_PRODUCT( RtHSdat%AngVelEM(:,0,K) , p%PitchIner(K)*CoordSys%j3(K,:)*DOT_PRODUCT(CoordSys%j3(K,:),RtHSdat%AngVelEM(:,0,K)) ) DO I = 1,p%DOFs%NPSBE(K) ! Loop through all active (enabled) blade DOFs that contribute to the QD2T-related linear accelerations of the tip of blade K (point S(p%BldFlexL)) AugMat(p%DOFs%PSBE(K,I), p%NAug) = DOT_PRODUCT( RtHSdat%PLinVelES(K,p%TipNode,p%DOFs%PSBE(K,I),0,:), & ! {-f(qd,q,t)}B + {-f(qd,q,t)}GravB + {-f(qd,q,t)}AeroB - TmpVec1 ) ! NOTE: TmpVec1 is still the portion of FrcS0Bt associated with the tip brake + TmpVec1 ) & ! NOTE: TmpVec1 is still the portion of FrcS0Bt associated with the tip brake + + DOT_PRODUCT( RtHSdat%PAngVelEM(K,0,p%DOFs%PSBE(K,I),0,:), & + TmpVec2 + TmpVec3 ) ENDDO ! I - All active (enabled) blade DOFs that contribute to the QD2T-related linear accelerations of the tip of blade K (point S(p%BldFlexL)) - - + + ! Apply BeamDyn blade-root loads. Note: When BeamDyn is used, blade bending DoF in ED are disabled, so PSBE should only contain the pitch modes if enabled. + IF (p%BD4Blades) THEN + TmpVec1 = (/u%BladeRootLoads(K)%Force (1,1), u%BladeRootLoads(K)%Force (3,1), -u%BladeRootLoads(K)%Force (2,1)/) + TmpVec2 = (/u%BladeRootLoads(K)%Moment(1,1), u%BladeRootLoads(K)%Moment(3,1), -u%BladeRootLoads(K)%Moment(2,1)/) + DO I = 1,p%DOFs%NPSBE(K) + AugMat(p%DOFs%PSBE(K,I), p%NAug) = DOT_PRODUCT( RtHSdat%PLinVelES(K,0,p%DOFs%PSBE(K,I),0,:), TmpVec1 ) & + + DOT_PRODUCT( RtHSdat%PAngVelEM(K,0,p%DOFs%PSBE(K,I),0,:), TmpVec2 ) + ENDDO + END IF DO J = 1,p%BldNodes ! Loop through the blade nodes / elements @@ -8194,7 +8323,12 @@ SUBROUTINE FillAugMat( p, x, CoordSys, u, HSSBrTrq, RtHSdat, AugMat ) ENDIF ENDIF + ! If blade pitch DOFs are enabled, add input blade pitch torque + IF ( p%DOF_Flag(DOF_BP(K )) ) THEN + AugMat( DOF_BP(K ),p%NAug) = AugMat(DOF_BP(K ),p%NAug) & + + u%BlPitchMom(K) + END IF ! If the associated DOFs are enabled, add the blade elasticity and damping ! forces to the forcing vector (these portions can't be calculated using @@ -8556,7 +8690,11 @@ SUBROUTINE ED_AllocOutput( p, m, u, y, ErrStat, ErrMsg ) CALL AllocAry( y%BlPitch, p%NumBl, 'BlPitch', ErrStat2, ErrMsg2 ) CALL CheckError( ErrStat2, ErrMsg2 ) IF (ErrStat >= AbortErrLev) RETURN - + + CALL AllocAry( y%BlPRate, p%NumBl, 'BlPRate', ErrStat2, ErrMsg2 ) + CALL CheckError( ErrStat2, ErrMsg2 ) + IF (ErrStat >= AbortErrLev) RETURN + !....................................................... ! Create Line2 Mesh for motion outputs on blades: !....................................................... @@ -8610,8 +8748,8 @@ SUBROUTINE ED_AllocOutput( p, m, u, y, ErrStat, ErrMsg ) Orientation(3,3) = m%CoordSys%n3(K,J,2) ! Translational Displacement - position(1) = m%RtHS%rS (1,K,J) ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction - position(2) = -1.*m%RtHS%rS (3,K,J) ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction + position(1) = m%RtHS%rS (1,K,J) + p%PtfmRefxt ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction + position(2) = -1.*m%RtHS%rS (3,K,J) + p%PtfmRefyt ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction position(3) = m%RtHS%rS (2,K,J) + p%PtfmRefzt ! = the distance from the nominal tower base position (i.e., the undeflected position of the tower base) to the current blade node in the zi ( z2) direction @@ -8786,7 +8924,8 @@ SUBROUTINE ED_AllocOutput( p, m, u, y, ErrStat, ErrMsg ) ,ErrStat = ErrStat2 & ,ErrMess = ErrMsg2 ) CALL CheckError(ErrStat2,ErrMsg2) - IF (ErrStat >= AbortErrLev) RETURN + IF (ErrStat >= AbortErrLev) RETURN + END DO @@ -8794,8 +8933,8 @@ SUBROUTINE ED_AllocOutput( p, m, u, y, ErrStat, ErrMsg ) - position(1) = m%RtHS%rS (1,K,0) ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction - position(2) = -1.*m%RtHS%rS (3,K,0) ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction + position(1) = m%RtHS%rS (1,K,0) + p%PtfmRefxt ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction + position(2) = -1.*m%RtHS%rS (3,K,0) + p%PtfmRefyt ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction position(3) = m%RtHS%rS (2,K,0) + p%PtfmRefzt ! = the distance from the nominal tower base position (i.e., the undeflected position of the tower base) to the current blade node in the zi ( z2) direction @@ -8821,7 +8960,24 @@ SUBROUTINE ED_AllocOutput( p, m, u, y, ErrStat, ErrMsg ) IF (ErrStat >= AbortErrLev) RETURN END DO - + IF (p%BD4Blades) THEN + ALLOCATE( u%BladeRootLoads(p%NumBl), Stat=ErrStat2 ) + IF ( ErrStat2 /= 0 ) THEN + CALL CheckError( ErrID_Fatal, 'ED: Could not allocate space for y%BladeRootLoads{p%NumBl}' ) + RETURN + END IF + + DO k=1,p%NumBl + CALL MeshCopy( SrcMesh = y%BladeRootMotion(K) & + , DestMesh = u%BladeRootLoads(K) & + , CtrlCode = MESH_SIBLING & + , IOS = COMPONENT_INPUT & + , Force = .TRUE. & + , Moment = .TRUE. & + , ErrStat = ErrStat2 & + , ErrMess = ErrMsg2 ) + END DO + END IF ! -------------- Nacelle ----------------------------------- CALL MeshCopy ( SrcMesh = u%NacelleLoads & @@ -8948,13 +9104,20 @@ SUBROUTINE Init_u( u, p, x, InputFileData, m, ErrStat, ErrMsg ) ErrMsg = "" !....................................................... - ! allocate the u%BlPitchCom array + ! allocate the u%BlPitchCom array !....................................................... CALL AllocAry( u%BlPitchCom, p%NumBl, 'BlPitchCom', ErrStat2, ErrMsg2 ) if (Failed()) return ! will initialize u%BlPitchCom later, after getting undisplaced positions - + + !....................................................... + ! allocate the u%BlPitchMom array + !....................................................... + + CALL AllocAry( u%BlPitchMom, p%NumBl, 'BlPitchMom', ErrStat2, ErrMsg2 ) + if (Failed()) return + !....................................................... ! we're going to calculate the non-displaced positions of ! several variables so we can set up meshes properly later. @@ -8968,6 +9131,7 @@ SUBROUTINE Init_u( u, p, x, InputFileData, m, ErrStat, ErrMsg ) CALL Zero2TwoPi( x_tmp%QT (DOF_GeAz) ) u%BlPitchCom = 0.0_ReKi + u%BlPitchMom = 0.0_ReKi ! set the coordinate system variables: CALL SetCoordSy( -p%DT, m%CoordSys, m%RtHS, u%BlPitchCom, p, x_tmp, ErrStat2, ErrMsg2 ) @@ -9024,8 +9188,8 @@ SUBROUTINE Init_u( u, p, x, InputFileData, m, ErrStat, ErrMsg ) Orientation(3,3) = m%CoordSys%n3(K,J,2) ! Translational Displacement - position(1) = m%RtHS%rS (1,K,J) ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction - position(2) = -1.*m%RtHS%rS (3,K,J) ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction + position(1) = m%RtHS%rS (1,K,J) + p%PtfmRefxt ! = the distance from the undeflected tower centerline to the current blade node in the xi ( z1) direction + position(2) = -1.*m%RtHS%rS (3,K,J) + p%PtfmRefyt ! = the distance from the undeflected tower centerline to the current blade node in the yi (-z3) direction position(3) = m%RtHS%rS (2,K,J) + p%PtfmRefzt ! = the distance from the nominal tower base position (i.e., the undeflected position of the tower base) to the current blade node in the zi ( z2) direction @@ -9073,8 +9237,8 @@ SUBROUTINE Init_u( u, p, x, InputFileData, m, ErrStat, ErrMsg ) ! Create Point Mesh for loads input at hub point (from BeamDyn): !....................................................... ! place single node at hub; position affects mapping/coupling with other modules - Position(1) = m%RtHS%rQ(1) - Position(2) = -1.*m%RtHS%rQ(3) + Position(1) = m%RtHS%rQ(1) + p%PtfmRefxt + Position(2) = -1.*m%RtHS%rQ(3) + p%PtfmRefyt Position(3) = m%RtHS%rQ(2) + p%PtfmRefzt Orientation(1,1) = m%CoordSys%g1(1) @@ -9093,7 +9257,7 @@ SUBROUTINE Init_u( u, p, x, InputFileData, m, ErrStat, ErrMsg ) !....................................................... ! Create Point Mesh for loads input at Platform Reference Point: !....................................................... - Position = (/0.0_ReKi, 0.0_ReKi, p%PtfmRefzt /) + Position = [p%PtfmRefxt, p%PtfmRefyt, p%PtfmRefzt] call Eye(Orientation, ErrStat2, errMsg2) call CreateInputPointMesh(u%PlatformPtMesh, Position, Orientation, errStat2, errMsg2, hasMotion=.False., hasLoads=.True.) if (Failed()) return @@ -9101,7 +9265,7 @@ SUBROUTINE Init_u( u, p, x, InputFileData, m, ErrStat, ErrMsg ) !....................................................... ! Create Point Mesh for loads input at nacelle: !....................................................... - Position = (/0.0_ReKi, 0.0_ReKi, p%TowerHt /) + Position = [p%PtfmRefxt, p%PtfmRefyt, p%TowerHt] call Eye(Orientation, ErrStat2, errMsg2) call CreateInputPointMesh(u%NacelleLoads, Position, Orientation, errStat2, errMsg2, hasMotion=.False., hasLoads=.True.) if (Failed()) return @@ -9109,8 +9273,8 @@ SUBROUTINE Init_u( u, p, x, InputFileData, m, ErrStat, ErrMsg ) !....................................................... ! Create Point Mesh for loads on Rotor tailfin: !....................................................... - Position(1) = m%RtHS%rJ(1) ! undeflected position of the tailfin CM in the xi ( z1) direction - Position(2) = -1.*m%RtHS%rJ(3) ! undeflected position of the tailfin CM in the yi (-z3) direction + Position(1) = m%RtHS%rJ(1) + p%PtfmRefxt ! undeflected position of the tailfin CM in the xi ( z1) direction + Position(2) = -1.*m%RtHS%rJ(3) + p%PtfmRefyt ! undeflected position of the tailfin CM in the yi (-z3) direction Position(3) = m%RtHS%rJ(2) + p%PtfmRefzt ! undeflected position of the tailfin CM in the zi ( z2) direction Orientation(1,1) = m%CoordSys%tf1(1) Orientation(2,1) = m%CoordSys%tf2(1) @@ -9914,12 +10078,12 @@ SUBROUTINE ED_PrintSum( p, OtherState, ErrStat, ErrMsg ) WRITE (UnSu,'(//,A,I1,A,/)') 'Interpolated blade ', K, ' properties:' - WRITE (UnSu,'(A)') 'Node BlFract RNodes DRNodes PitchAxis StrcTwst BMassDen FlpStff EdgStff' - WRITE (UnSu,'(A)') ' (-) (-) (m) (m) (-) (deg) (kg/m) (Nm^2) (Nm^2)' + WRITE (UnSu,'(A)') 'Node BlFract RNodes DRNodes StrcTwst BMassDen FlpStff EdgStff' + WRITE (UnSu,'(A)') ' (-) (-) (m) (m) (deg) (kg/m) (Nm^2) (Nm^2)' DO I=1,p%BldNodes - WRITE(UnSu,'(I4,3F9.3,3F10.3,2ES11.3)') I, p%RNodesNorm(I), p%RNodes(I) + p%HubRad, p%DRNodes(I), & - p%PitchAxis(K,I),p%ThetaS(K,I)*R2D, p%MassB(K,I), & + WRITE(UnSu,'(I4,3F9.3,2F10.3,2ES11.3)') I, p%RNodesNorm(I), p%RNodes(I) + p%HubRad, p%DRNodes(I), & + p%ThetaS(K,I)*R2D, p%MassB(K,I), & p%StiffBF(K,I), p%StiffBE(K,I) ENDDO ! I @@ -10369,9 +10533,10 @@ END SUBROUTINE FixYawFric !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and dZ/du are returned. -SUBROUTINE ED_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu ) +SUBROUTINE ED_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) !.................................................................................................................................. + type(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(ED_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(ED_ParameterType), INTENT(IN ) :: p !< Parameters @@ -10386,214 +10551,164 @@ SUBROUTINE ED_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM TYPE(ED_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect - !! to the inputs (u) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with - !! respect to the inputs (u) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with - !! respect to the inputs (u) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with - !! respect to the inputs (u) [intent in to avoid deallocation] - - - ! local variables - TYPE(ED_OutputType) :: y_p - TYPE(ED_OutputType) :: y_m - TYPE(ED_ContinuousStateType) :: x_p - TYPE(ED_ContinuousStateType) :: x_m - TYPE(ED_InputType) :: u_perturb - REAL(R8Ki) :: delta ! delta change in input or state - INTEGER(IntKi) :: i, j - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ED_JacobianPInput' + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with respect to the inputs (u) [intent in to avoid deallocation] + CHARACTER(*), PARAMETER :: RoutineName = 'ED_JacobianPInput' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, iCol + integer(IntKi) :: iVarBlPitchCom, iVarBlPitchComC - ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = '' - m%IgnoreMod = .true. ! to compute perturbations, we need to ignore the modulo function - - ! make a copy of the inputs to perturb - call ED_CopyInput( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - - IF ( PRESENT( dYdu ) ) THEN + ! To compute perturbations, we need to ignore the modulo function + m%IgnoreMod = .true. + + ! Initialize pitch command variable indices + iVarBlPitchCom = 0 + iVarBlPitchComC = 0 + do i = 1, size(Vars%u) + select case (Vars%u(i)%DL%Num) + case (ED_u_BlPitchCom) + iVarBlPitchCom = i + case (ED_u_BlPitchComC) + iVarBlPitchComC = i + end select + end do + + ! Update copy of the inputs to perturb + call ED_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackInput(Vars, u, m%Jac%u) - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdu)) then - ! allocate dYdu if necessary + ! Allocate dYdu if not allocated if (.not. allocated(dYdu)) then - call AllocAry(dYdu, p%Jac_ny, size(p%Jac_u_indx,1)+p%NumExtendedInputs, 'dYdu', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dYdu, m%Jac%Ny, m%Jac%Nu, 'dYdu', ErrStat2, ErrMsg2); if (Failed()) return end if - - if (p%CompAeroMaps) then - dYdu = 0.0_R8Ki - else - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call ED_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call ED_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - do i=1,size(p%Jac_u_indx,1) - - ! get u_op + delta u - call ED_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call ED_Perturb_u( p, i, 1, u_perturb, delta ) - - ! compute y at u_op + delta u - call ED_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get u_op - delta u - call ED_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call ED_Perturb_u( p, i, -1, u_perturb, delta ) - - ! compute y at u_op - delta u - call ED_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get central difference: - call Compute_dY( p, y_p, y_m, delta, dYdu(:,i) ) - + + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Skip extended variable + if (i == iVarBlPitchComC) cycle + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num + + ! Calculate column index + iCol = Vars%u(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call ED_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call ED_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call ED_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call ED_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,iCol)) end do - - ! now do the extended input: sum the p%NumBl blade pitch columns - if (p%NumExtendedInputs > 0) then - dYdu(:,size(p%Jac_u_indx,1)+1) = dYdu(:,size(p%Jac_u_indx,1)-p%NumBl-1) ! last NumBl+2 columns are: GenTrq, YawMom, and BlPitchCom - do i=2,p%NumBl - dYdu(:,size(p%Jac_u_indx,1)+1) = dYdu(:,size(p%Jac_u_indx,1)+1) + dYdu(:,size(p%Jac_u_indx,1)-p%NumBl-2+i) - end do - end if - - - if (ErrStat>=AbortErrLev) then - call cleanup() - return + end do + + ! Extended: BlPitchComC is the sum of BlPitchCom across all blades + if (iVarBlPitchComC > 0) then + if (iVarBlPitchCom > 0) then + associate (Var => Vars%u(iVarBlPitchCom)) + dYdu(:,Vars%u(iVarBlPitchComC)%iLoc(1)) = sum(dYdu(:,Var%iLoc(1):Var%iLoc(2)), dim=2) + end associate + else + dYdu(:,Vars%u(iVarBlPitchComC)%iLoc(1)) = 0.0_R8Ki end if - call ED_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call ED_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - end if !CompAeroMaps + end if + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + if (present(dXdu) .and. (m%Jac%Nx > 0)) then - END IF + ! Allocate dXdu if not allocated + if (.not. allocated(dXdu)) then + call AllocAry(dXdu, m%Jac%Nx, m%Jac%Nu, 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return + end if + ! Loop through input variables + do i = 1, size(Vars%u) - IF ( PRESENT( dXdu ) ) THEN + ! Skip extended variable + if (i == iVarBlPitchComC) cycle - ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num - ! allocate dXdu if necessary - if (.not. allocated(dXdu)) then - call AllocAry(dXdu, p%NActvDOF_Lin + p%NActvVelDOF_Lin, size(p%Jac_u_indx,1)+p%NumExtendedInputs, 'dXdu', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - end if - - - do i=1,size(p%Jac_u_indx,1) - - ! get u_op + delta u - call ED_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call ED_Perturb_u( p, i, 1, u_perturb, delta ) - - ! compute x at u_op + delta u - call ED_CalcContStateDeriv( t, u_perturb, p, x, xd, z, OtherState, m, x_p, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - ! get u_op - delta u - call ED_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - call ED_Perturb_u( p, i, -1, u_perturb, delta ) - - ! compute x at u_op - delta u - call ED_CalcContStateDeriv( t, u_perturb, p, x, xd, z, OtherState, m, x_m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - ! we may have had an error allocating memory, so we'll check - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - ! get central difference: - call Compute_dX( p, x_p, x_m, delta, dXdu(:,i) ) + ! Calculate column index + iCol = Vars%u(i)%iLoc(1) + j - 1 - end do - - - ! now do the extended input: sum the p%NumBl blade pitch columns - if (p%NumExtendedInputs > 0) then - dXdu(:,size(p%Jac_u_indx,1)+1) = dXdu(:,size(p%Jac_u_indx,1)-p%NumBl-1) ! last NumBl+2 columns are: GenTrq, YawMom, and BlPitchCom - do i=2,p%NumBl - dXdu(:,size(p%Jac_u_indx,1)+1) = dXdu(:,size(p%Jac_u_indx,1)+1) + dXdu(:,size(p%Jac_u_indx,1)-p%NumBl-2+i) + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call ED_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call ED_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call ED_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call ED_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdu(:,iCol) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%u(i)%Perturb) end do + end do + + ! Extended: BlPitchComC is the sum of BlPitchCom across all blades + if (iVarBlPitchComC > 0) then + if (iVarBlPitchCom > 0) then + associate (Var => Vars%u(iVarBlPitchCom)) + dXdu(:,Vars%u(iVarBlPitchComC)%iLoc(1)) = sum(dXdu(:,Var%iLoc(1):Var%iLoc(2)), dim=2) + end associate + else + dXdu(:,Vars%u(iVarBlPitchComC)%iLoc(1)) = 0.0_R8Ki + end if end if - - call ED_DestroyContState( x_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call ED_DestroyContState( x_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - - - - END IF + end if - - IF ( PRESENT( dXddu ) ) THEN + if (present(dXddu)) then if (allocated(dXddu)) deallocate(dXddu) - END IF + end if - IF ( PRESENT( dZdu ) ) THEN + if (present(dZdu)) then if (allocated(dZdu)) deallocate(dZdu) - END IF + end if call cleanup() contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + if (Failed) call cleanup() + end function subroutine cleanup() - call ED_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call ED_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call ED_DestroyContState( x_p, ErrStat2, ErrMsg2 ) - call ED_DestroyContState( x_m, ErrStat2, ErrMsg2 ) - call ED_DestroyInput( u_perturb, ErrStat2, ErrMsg2 ) m%IgnoreMod = .false. end subroutine cleanup - END SUBROUTINE ED_JacobianPInput !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. -SUBROUTINE ED_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) -!.................................................................................................................................. +SUBROUTINE ED_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) + type(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(ED_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(ED_ParameterType), INTENT(IN ) :: p !< Parameters @@ -10608,177 +10723,115 @@ SUBROUTINE ED_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, TYPE(ED_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions (Y) with respect - !! to the continuous states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state functions (X) with respect - !! to the continuous states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state functions (Xd) with respect - !! to the continuous states (x) [intent in to avoid deallocation] - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state functions (Z) with respect - !! to the continuous states (x) [intent in to avoid deallocation] - - ! local variables - TYPE(ED_OutputType) :: y_p - TYPE(ED_OutputType) :: y_m - TYPE(ED_ContinuousStateType) :: x_p - TYPE(ED_ContinuousStateType) :: x_m - TYPE(ED_ContinuousStateType) :: x_perturb - REAL(R8Ki) :: delta ! delta change in input or state - INTEGER(IntKi) :: i, j - + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions (Y) with respect to the continuous states (x) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state functions (X) with respect to the continuous states (x) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state functions (Xd) with respect to the continuous states (x) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state functions (Z) with respect to the continuous states (x) [intent in to avoid deallocation] + + CHARACTER(*), PARAMETER :: RoutineName = 'ED_JacobianPContState' INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ED_JacobianPContState' + INTEGER(IntKi) :: i, j, iCol - - ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = '' + m%IgnoreMod = .true. ! to get true perturbations, we can't use the modulo function - ! make a copy of the continuous states to perturb - call ED_CopyContState( x, x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - IF ( PRESENT( dYdx ) ) THEN + ! Copy state values + call ED_CopyContState(x, m%x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackContState(Vars, x, m%Jac%x) - ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + if (present(dYdx)) then - ! allocate dYdx if necessary + ! Allocate dYdx if not allocated if (.not. allocated(dYdx)) then - call AllocAry(dYdx, p%Jac_ny, p%NActvDOF_Lin + p%NActvVelDOF_Lin, 'dYdx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dYdx, m%Jac%Ny, m%Jac%Nx, 'dYdx', ErrStat2, ErrMsg2); if (Failed()) return end if - - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call ED_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call ED_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - - do i=1,p%NActvDOF_Lin + p%NActvVelDOF_Lin - - ! get x_op + delta x - call ED_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call ED_Perturb_x( p, i, 1, x_perturb, delta ) - - ! compute y at x_op + delta x - call ED_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get x_op - delta x - call ED_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call ED_Perturb_x( p, i, -1, x_perturb, delta ) - - ! compute y at x_op - delta x - call ED_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get central difference: - call Compute_dY( p, y_p, y_m, delta, dYdx(:,i) ) - - end do - - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - call ED_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call ED_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - - END IF - IF ( PRESENT( dXdx ) ) THEN + ! Loop through state variables + do i = 1, size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate column index + iCol = Vars%x(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call ED_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call ED_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) - ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call ED_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call ED_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) - ! allocate dXdx if necessary + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%x(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdx(:,iCol)) + end do + end do + + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + if (present(dXdx) .and. (m%Jac%Nx > 0)) then + + ! Allocate dXdx if not allocated if (.not. allocated(dXdx)) then - call AllocAry(dXdx, p%NActvDOF_Lin + p%NActvVelDOF_Lin, p%NActvDOF_Lin + p%NActvVelDOF_Lin, 'dXdx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dXdx, m%Jac%Nx, m%Jac%Nx, 'dXdx', ErrStat2, ErrMsg2); if (Failed()) return end if - - do i=1,p%NActvDOF_Lin + p%NActvVelDOF_Lin - - ! get x_op + delta x - call ED_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call ED_Perturb_x( p, i, 1, x_perturb, delta ) - - ! compute x at x_op + delta x - call ED_CalcContStateDeriv( t, u, p, x_perturb, xd, z, OtherState, m, x_p, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - ! get x_op - delta x - call ED_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call ED_Perturb_x( p, i, -1, x_perturb, delta ) - - ! compute x at x_op - delta x - call ED_CalcContStateDeriv( t, u, p, x_perturb, xd, z, OtherState, m, x_m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - ! we may have had an error allocating memory, so we'll check - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - ! get central difference: - - call Compute_dX( p, x_p, x_m, delta, dXdx(:,i) ) - + ! Loop through state variables + do i = 1, size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate column index + iCol = Vars%x(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call ED_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call ED_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call ED_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call ED_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call ED_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdx(:,iCol) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%x(i)%Perturb) + end do end do - - call ED_DestroyContState( x_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call ED_DestroyContState( x_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - END IF + end if - IF ( PRESENT( dXddx ) ) THEN + if (present(dXddx)) then if (allocated(dXddx)) deallocate(dXddx) - END IF + end if - IF ( PRESENT( dZdx ) ) THEN + if (present(dZdx)) then if (allocated(dZdx)) deallocate(dZdx) - END IF + end if call cleanup() contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + if (Failed) call cleanup() + end function subroutine cleanup() - call ED_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call ED_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call ED_DestroyContState( x_p, ErrStat2, ErrMsg2 ) - call ED_DestroyContState( x_m, ErrStat2, ErrMsg2 ) - call ED_DestroyContState(x_perturb, ErrStat2, ErrMsg2 ) m%IgnoreMod = .false. end subroutine cleanup - END SUBROUTINE ED_JacobianPContState !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions @@ -10813,45 +10866,25 @@ SUBROUTINE ED_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, !! functions (Z) with respect to the !! discrete states (xd) [intent in to avoid deallocation] - - ! Initialize ErrStat - + ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' + ! Calculate the partial derivative of the output functions (Y) with respect to the discrete states (xd) here: + if (present(dYdxd)) then + end if - IF ( PRESENT( dYdxd ) ) THEN - - ! Calculate the partial derivative of the output functions (Y) with respect to the discrete states (xd) here: - - ! allocate and set dYdxd - - END IF - - IF ( PRESENT( dXdxd ) ) THEN - - ! Calculate the partial derivative of the continuous state functions (X) with respect to the discrete states (xd) here: - - ! allocate and set dXdxd - - END IF - - IF ( PRESENT( dXddxd ) ) THEN - - ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the discrete states (xd) here: - - ! allocate and set dXddxd - - END IF - - IF ( PRESENT( dZdxd ) ) THEN - - ! Calculate the partial derivative of the constraint state functions (Z) with respect to the discrete states (xd) here: - - ! allocate and set dZdxd - - END IF + ! Calculate the partial derivative of the continuous state functions (X) with respect to the discrete states (xd) here: + if (present(dXdxd)) then + end if + ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the discrete states (xd) here: + if (present(dXddxd)) then + end if + + ! Calculate the partial derivative of the constraint state functions (Z) with respect to the discrete states (xd) here: + if (present(dZdxd)) then + end if END SUBROUTINE ED_JacobianPDiscState !---------------------------------------------------------------------------------------------------------------------------------- @@ -10883,1035 +10916,516 @@ SUBROUTINE ED_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdz(:,:) !< Partial derivatives of constraint state functions (Z) with respect !! to the constraint states (z) [intent in to avoid deallocation] - - ! Initialize ErrStat - + ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' - IF ( PRESENT( dYdz ) ) THEN - - ! Calculate the partial derivative of the output functions (Y) with respect to the constraint states (z) here: - - ! allocate and set dYdz - - END IF - - IF ( PRESENT( dXdz ) ) THEN - - ! Calculate the partial derivative of the continuous state functions (X) with respect to the constraint states (z) here: - - ! allocate and set dXdz - - END IF - - IF ( PRESENT( dXddz ) ) THEN - - ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the constraint states (z) here: - - ! allocate and set dXddz - - END IF - - IF ( PRESENT( dZdz ) ) THEN - - ! Calculate the partial derivative of the constraint state functions (Z) with respect to the constraint states (z) here: + ! Calculate the partial derivative of the output functions (Y) with respect to the constraint states (z) here: + if (present(dYdz)) then + end if - ! allocate and set dZdz + ! Calculate the partial derivative of the continuous state functions (X) with respect to the constraint states (z) here: + if (present(dXdz)) then + end if - END IF + ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the constraint states (z) here: + if (present(dXddz)) then + end if + ! Calculate the partial derivative of the constraint state functions (Z) with respect to the constraint states (z) here: + if (present(dZdz)) then + end if END SUBROUTINE ED_JacobianPConstrState !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the Jacobian parameters and initialization outputs for the linearized outputs. -SUBROUTINE ED_Init_Jacobian_y( p, y, InitOut, ErrStat, ErrMsg) +subroutine ED_PackExtInputAry(Vars, u, ValAry, ErrStat, ErrMsg) + type(ModVarsType), intent(in) :: Vars + type(ED_InputType), intent(in) :: u !< Inputs + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi),intent(out) :: ErrStat !< Error status of the operation + character(*),intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'ED_PackExtInputAry' + integer(IntKi) :: i - TYPE(ED_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(ED_OutputType) , INTENT(IN ) :: y !< outputs - TYPE(ED_InitOutputType) , INTENT(INOUT) :: InitOut !< Output for initialization routine - - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables: - INTEGER(IntKi) :: i,j,k, index_last, index_next - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ED_Init_Jacobian_y' - LOGICAL :: Mask(FIELDMASK_SIZE) ! flags to determine if this field is part of the packing - LOGICAL :: BladeMask(FIELDMASK_SIZE) ! flags to determine if this field is part of the packing - logical, allocatable :: AllOut(:) - - - ErrStat = ErrID_None - ErrMsg = "" - - - ! determine how many outputs there are in the Jacobians - p%Jac_ny = 0 - BladeMask = .true. ! default is all the fields - if (p%CompAeroMaps) then - if (allocated(y%BladeLn2Mesh)) then - do i=1,p%NumBl_Lin - p%Jac_ny = p%Jac_ny + y%BladeLn2Mesh(i)%NNodes * 12 ! 3 TranslationDisp, Orientation, TranslationVel, and RotationVel at each node on each blade (skip accelerations) - end do - end if - BladeMask(MASKID_TRANSLATIONACC) = .false. - BladeMask(MASKID_ROTATIONACC) = .false. - else - - if (allocated(y%BladeLn2Mesh)) then - do i=1,p%NumBl_Lin - p%Jac_ny = p%Jac_ny + y%BladeLn2Mesh(i)%NNodes * 18 ! 3 TranslationDisp, Orientation, TranslationVel, RotationVel, TranslationAcc, and RotationAcc at each node on each blade - end do - end if - - p%Jac_ny = p%Jac_ny & - + y%PlatformPtMesh%NNodes * 18 & ! 3 TranslationDisp, Orientation, TranslationVel, RotationVel, TranslationAcc, RotationAcc at each node - + y%TowerLn2Mesh%NNodes * 18 & ! 3 TranslationDisp, Orientation, TranslationVel, RotationVel, TranslationAcc, RotationAcc at each node - + y%HubPtMotion%NNodes * 9 & ! 3 TranslationDisp, Orientation, RotationVel at each node - + y%NacelleMotion%NNodes * 18 & ! 3 TranslationDisp, Orientation, TranslationVel, RotationVel, TranslationAcc, RotationAcc at each node - + y%TFinCMMotion%NNodes * 12 & ! 3 TranslationDisp, Orientation, TranslationVel, RotationVel at each node - + 3 & ! Yaw, YawRate, and HSS_Spd - + p%NumOuts + p%BldNd_TotNumOuts ! WriteOutput values - - do i=1,p%NumBl_Lin - p%Jac_ny = p%Jac_ny + y%BladeRootMotion(i)%NNodes * 18 ! 3 TranslationDisp, Orientation, TranslationVel, RotationVel, TranslationAcc, and RotationAcc at each (1) node on each blade - end do + ErrMsg = "" - end if - - !................. - ! set linearization output names: - !................. - CALL AllocAry(InitOut%LinNames_y, p%Jac_ny, 'LinNames_y', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry(InitOut%RotFrame_y, p%Jac_ny, 'RotFrame_y', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - InitOut%RotFrame_y = .false. ! note that meshes are in the global, not rotating frame - - - index_next = 1 - if (allocated(y%BladeLn2Mesh)) then - index_last = index_next - p%Jac_y_idxStartList%Blade = index_next - do i=1,p%NumBl_Lin - call PackMotionMesh_Names(y%BladeLn2Mesh(i), 'Blade '//trim(num2lstr(i)), InitOut%LinNames_y, index_next, FieldMask=BladeMask) - end do - end if - - if (.not. p%CompAeroMaps) then - p%Jac_y_idxStartList%Platform = index_next - call PackMotionMesh_Names(y%PlatformPtMesh, 'Platform', InitOut%LinNames_y, index_next) - p%Jac_y_idxStartList%Tower = index_next - call PackMotionMesh_Names(y%TowerLn2Mesh, 'Tower', InitOut%LinNames_y, index_next) - - ! note that this Mask is for the y%HubPtMotion mesh ONLY. The others pack *all* of the motion fields - Mask = .false. - Mask(MASKID_TRANSLATIONDISP) = .true. - Mask(MASKID_ORIENTATION) = .true. - Mask(MASKID_ROTATIONVEL) = .true. - - p%Jac_y_idxStartList%Hub = index_next - call PackMotionMesh_Names(y%HubPtMotion, 'Hub', InitOut%LinNames_y, index_next, FieldMask=Mask) - index_last = index_next - p%Jac_y_idxStartList%BladeRoot = index_next - do i=1,p%NumBl_Lin - call PackMotionMesh_Names(y%BladeRootMotion(i), 'Blade root '//trim(num2lstr(i)), InitOut%LinNames_y, index_next) - end do - - p%Jac_y_idxStartList%Nacelle = index_next - call PackMotionMesh_Names(y%NacelleMotion, 'Nacelle', InitOut%LinNames_y, index_next) - - Mask = .false. - Mask(MASKID_TRANSLATIONDISP) = .true. - Mask(MASKID_ORIENTATION) = .true. - Mask(MASKID_TRANSLATIONVEL) = .true. - Mask(MASKID_ROTATIONVEL) = .true. - p%Jac_y_idxStartList%TFin = index_next - call PackMotionMesh_Names(y%TFinCMMotion, 'TailFin', InitOut%LinNames_y, index_next, FieldMask=Mask) - - InitOut%LinNames_y(index_next) = 'Yaw, rad'; index_next = index_next+1 - InitOut%LinNames_y(index_next) = 'YawRate, rad/s'; index_next = index_next+1 - InitOut%LinNames_y(index_next) = 'HSS_Spd, rad/s' - - do i=1,p%NumOuts + p%BldNd_TotNumOuts - InitOut%LinNames_y(i+index_next) = trim(InitOut%WriteOutputHdr(i))//', '//trim(InitOut%WriteOutputUnt(i)) !trim(p%OutParam(i)%Name)//', '//p%OutParam(i)%Units - end do - - - !! check for AllOuts in rotating frame - allocate( AllOut(0:MaxOutPts), STAT=ErrStat2 ) ! allocate starting at zero to account for invalid output channels - if (ErrStat2 /=0 ) then - call SetErrStat(ErrID_Info, 'error allocating temporary space for AllOut',ErrStat,ErrMsg,RoutineName) - return; - end if - - AllOut = .false. - do k=1,3 - AllOut(TipDxc( k)) = .true. - AllOut(TipDyc( k)) = .true. - AllOut(TipDzc( k)) = .true. - AllOut(TipDxb( k)) = .true. - AllOut(TipDyb( k)) = .true. - AllOut(TipALxb( k)) = .true. - AllOut(TipALyb( k)) = .true. - AllOut(TipALzb( k)) = .true. - AllOut(TipRDxb( k)) = .true. - AllOut(TipRDyb( k)) = .true. - AllOut(TipRDzc( k)) = .true. - AllOut(TipClrnc(k)) = .true. - AllOut(PtchPMzc(k)) = .true. - AllOut(RootFxc( k)) = .true. - AllOut(RootFyc( k)) = .true. - AllOut(RootFzc( k)) = .true. - AllOut(RootFxb( k)) = .true. - AllOut(RootFyb( k)) = .true. - AllOut(RootMxc( k)) = .true. - AllOut(RootMyc( k)) = .true. - AllOut(RootMzc( k)) = .true. - AllOut(RootMxb( k)) = .true. - AllOut(RootMyb( k)) = .true. - - do j=1,9 - AllOut(SpnALxb( j,k)) = .true. - AllOut(SpnALyb( j,k)) = .true. - AllOut(SpnALzb( j,k)) = .true. - AllOut(SpnFLxb( j,k)) = .true. - AllOut(SpnFLyb( j,k)) = .true. - AllOut(SpnFLzb( j,k)) = .true. - AllOut(SpnMLxb( j,k)) = .true. - AllOut(SpnMLyb( j,k)) = .true. - AllOut(SpnMLzb( j,k)) = .true. - AllOut(SpnTDxb( j,k)) = .true. - AllOut(SpnTDyb( j,k)) = .true. - AllOut(SpnTDzb( j,k)) = .true. - AllOut(SpnRDxb( j,k)) = .true. - AllOut(SpnRDyb( j,k)) = .true. - AllOut(SpnRDzb( j,k)) = .true. - end do - end do - - do i=1,p%NumOuts - InitOut%RotFrame_y(i+index_next) = AllOut( p%OutParam(i)%Indx ) - end do + ! Find variable index corresponding to blade pitch command collective + i = MV_FindVarDatLoc(Vars%u, DatLoc(ED_u_BlPitchComC)) - do i=1, p%BldNd_TotNumOuts - InitOut%RotFrame_y(i+p%NumOuts+index_next) = .true. + ! If variable found + if (i > 0) then + + ! Copy to value array + ValAry(Vars%u(i)%iLoc(1):Vars%u(i)%iLoc(2)) = u%BlPitchCom(1) + + ! Check that all blades have the same pitch command + do i = 2, size(u%BlPitchCom) + if (.not. EqualRealNos(u%BlPitchCom(1), u%BlPitchCom(i))) then + call SetErrStat(ErrID_Info,"Operating point of collective pitch extended input is invalid because "// & + "the commanded blade pitch angles are not the same for each blade.", & + ErrStat, ErrMsg, RoutineName) + exit + end if end do - - deallocate(AllOut) - end if !.not. p%CompAeroMaps - -END SUBROUTINE ED_Init_Jacobian_y -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the Jacobian parameters and initialization outputs for the linearized continuous states. -SUBROUTINE ED_Init_Jacobian_x( p, InitOut, ErrStat, ErrMsg) + end if +end subroutine + +subroutine ED_InitVars(u, p, x, y, m, Vars, InputFileData, Linearize, ErrStat, ErrMsg) + type(ED_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(ED_ParameterType), intent(inout) :: p !< Parameters + type(ED_ContinuousStateType), intent(inout) :: x !< Continuous state + type(ED_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(ED_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(ModVarsType), intent(inout) :: Vars !< Module variables + type(ED_InputFile), intent(in) :: InputFileData !< Input file data + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'ED_InitVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i, j, k + integer(IntKi), allocatable :: BladeMeshFields(:) + real(R8Ki) :: MaxThrust, MaxTorque, ScaleLength + integer(IntKi) :: Flags, Field - TYPE(ED_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(ED_InitOutputType) , INTENT(INOUT) :: InitOut !< Output for initialization routine - - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ED_Init_Jacobian_x' - - ! local variables: - INTEGER(IntKi) :: i, indx - ErrStat = ErrID_None - ErrMsg = "" - - if (p%CompAeroMaps) then - p%NActvDOF_Lin = p%DOFs%NActvDOF / p%NumBl ! we have only blade DOFs, and we are going to use only 1 of the blades - p%NActvDOF_Stride = p%NumBl - p%NActvVelDOF_Lin = 0 ! we do NOT have velocity states - else - p%NActvDOF_Lin = p%DOFs%NActvDOF - p%NActvDOF_Stride = 1 - p%NActvVelDOF_Lin = p%NActvDOF_Lin ! we have velocity states - end if - - ! allocate space for the row/column names and for perturbation sizes - call allocAry(p%dx, p%NDof, 'p%dx', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry(InitOut%LinNames_x, p%NActvDOF_Lin + p%NActvVelDOF_Lin,'LinNames_x', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry(InitOut%RotFrame_x, p%NActvDOF_Lin + p%NActvVelDOF_Lin,'RotFrame_x', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry(InitOut%DerivOrder_x, p%NActvDOF_Lin + p%NActvVelDOF_Lin,'DerivOrder_x', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - ! All Elastodyn continuous states are max order = 2 - if ( allocated(InitOut%DerivOrder_x) ) InitOut%DerivOrder_x = 2 - - p%dx = 0.0_R8Ki ! initialize in case we have only 1 blade - - ! set perturbation sizes: p%dx - p%dx(DOF_Sg :DOF_Hv) = 0.2_R8Ki * D2R_D * max(p%TowerHt, 1.0_ReKi) ! platform translational displacement states - p%dx(DOF_R :DOF_Y ) = 2.0_R8Ki * D2R_D ! platform rotational states - p%dx(DOF_TFA1:DOF_TSS1) = 0.020_R8Ki * D2R_D * p%TwrFlexL ! tower deflection states: 1st tower - p%dx(DOF_TFA2:DOF_TSS2) = 0.002_R8Ki * D2R_D * p%TwrFlexL ! tower deflection states: 2nd tower - p%dx(DOF_Yaw :DOF_TFrl) = 2.0_R8Ki * D2R_D ! nacelle-yaw, rotor-furl, generator azimuth, drivetrain, and tail-furl rotational states - - do i=1,p%NumBl - p%dx(DOF_BF(i,1))= 0.20_R8Ki * D2R_D * p%BldFlexL ! blade-deflection states: 1st blade flap mode - p%dx(DOF_BF(i,2))= 0.02_R8Ki * D2R_D * p%BldFlexL ! blade-deflection states: 2nd blade flap mode for blades (1/10 of the other perturbations) - p%dx(DOF_BE(i,1))= 0.20_R8Ki * D2R_D * p%BldFlexL ! blade-deflection states: 1st blade edge mode + ErrMsg = "" + + ! Clear module variables type + call NWTC_Library_DestroyModVarsType(Vars, ErrStat2, ErrMsg2); if (Failed()) return + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + ! Add continuous state variables (translation and rotation) + call MV_AddVar(Vars%x, 'PlatformSurge', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_Sg, & + Flags=VF_DerivOrder2, & + Perturb=0.2_R8Ki * D2R_D * max(p%TowerHt, 1.0_ReKi), & + LinNames=['Platform horizontal surge translation DOF (internal DOF index = DOF_Sg), m'], & + Active=InputFileData%PtfmSgDOF) + + call MV_AddVar(Vars%x, 'PlatformSway', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_Sw, & + Flags=VF_DerivOrder2, & + Perturb=0.2_R8Ki * D2R_D * max(p%TowerHt, 1.0_ReKi), & + LinNames=['Platform horizontal sway translation DOF (internal DOF index = DOF_Sw), m'], & + Active=InputFileData%PtfmSwDOF) + + call MV_AddVar(Vars%x, 'PlatformHeave', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_Hv, & + Flags=VF_DerivOrder2, & + Perturb=0.2_R8Ki * D2R_D * max(p%TowerHt, 1.0_ReKi), & + LinNames=['Platform vertical heave translation DOF (internal DOF index = DOF_Hv), m'], & + Active=InputFileData%PtfmHvDOF) + + call MV_AddVar(Vars%x, 'PlatformRoll', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_R, & + Flags=VF_DerivOrder2, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Platform roll tilt rotation DOF (internal DOF index = DOF_R), rad'], & + Active=InputFileData%PtfmRDOF) + + call MV_AddVar(Vars%x, 'PlatformPitch', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_P, & + Flags=VF_DerivOrder2, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Platform pitch tilt rotation DOF (internal DOF index = DOF_P), rad'], & + Active=InputFileData%PtfmPDOF) + + call MV_AddVar(Vars%x, 'PlatformYaw', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_Y, & + Flags=VF_DerivOrder2, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Platform yaw rotation DOF (internal DOF index = DOF_Y), rad'], & + Active=InputFileData%PtfmYDOF) + + call MV_AddVar(Vars%x, 'TowerFA1', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_TFA1, & + Flags=VF_DerivOrder2, & + Perturb=0.020_R8Ki * D2R_D * p%TwrFlexL, & + LinNames=['1st tower fore-aft bending mode DOF (internal DOF index = DOF_TFA1), m'], & + Active=InputFileData%TwFADOF1) + + call MV_AddVar(Vars%x, 'TowerSS1', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_TSS1, & + Flags=VF_DerivOrder2, & + Perturb=0.020_R8Ki * D2R_D * p%TwrFlexL, & + LinNames=['1st tower side-to-side bending mode DOF (internal DOF index = DOF_TSS1), m'], & + Active=InputFileData%TwSSDOF1) + + call MV_AddVar(Vars%x, 'TowerFA2', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_TFA2, & + Flags=VF_DerivOrder2, & + Perturb=0.002_R8Ki * D2R_D * p%TwrFlexL, & + LinNames=['2nd tower fore-aft bending mode DOF (internal DOF index = DOF_TFA2), m'], & + Active=InputFileData%TwFADOF2) + + call MV_AddVar(Vars%x, 'TowerSS2', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_TSS2, & + Flags=VF_DerivOrder2, & + Perturb=0.002_R8Ki * D2R_D * p%TwrFlexL, & + LinNames=['2nd tower side-to-side bending mode DOF (internal DOF index = DOF_TSS2), m'], & + Active=InputFileData%TwSSDOF2) + + call MV_AddVar(Vars%x, 'NacelleYaw', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_Yaw, & + Flags=VF_DerivOrder2, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Nacelle yaw DOF (internal DOF index = DOF_Yaw), rad'], & + Active=InputFileData%YawDOF) + + call MV_AddVar(Vars%x, 'RotorFurl', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_RFrl, & + Flags=VF_DerivOrder2 + VF_AeroMap, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Rotor-furl DOF (internal DOF index = DOF_RFrl), rad'], & + Active=InputFileData%RFrlDOF) + + call MV_AddVar(Vars%x, 'GeneratorAzimuth', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_GeAz, & + Flags=VF_DerivOrder2, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Variable speed generator DOF (internal DOF index = DOF_GeAz), rad'], & + Active=InputFileData%GenDOF) + + call MV_AddVar(Vars%x, 'DrivetrainFlexibility', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_DrTr, & + Flags=VF_DerivOrder2, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Drivetrain rotational-flexibility DOF (internal DOF index = DOF_DrTr), rad'], & + Active=InputFileData%DrTrDOF) + + call MV_AddVar(Vars%x, 'TailFurl', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_TFrl, & + Flags=VF_DerivOrder2 + VF_AeroMap, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Tail-furl DOF (internal DOF index = DOF_TFrl), rad'], & + Active=InputFileData%TFrlDOF) + + call MV_AddVar(Vars%x, 'RotorTeeter', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_Teet, & + Flags=VF_DerivOrder2, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Hub teetering DOF (internal DOF index = DOF_Teet), rad'], & + Active=InputFileData%TeetDOF) + + do i = 1, p%NumBl + call MV_AddVar(Vars%x, 'Blade'//trim(Num2LStr(i))//'Pitch', FieldAngularDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_BP(i), & + Flags=ior(VF_RotFrame, VF_DerivOrder2), & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Blade pitch DOF (internal DOF index = DOF_BP('//trim(Num2LStr(i))//')), rad'], & + Active=InputFileData%PitchDOF) end do - - if ( p%NumBl == 2 ) then - p%dx(DOF_Teet) = 2.0_R8Ki * D2R_D ! rotor-teeter rotational state - end if - - !Set some limits in case perturbation is very small - do i=1,p%NDof - p%dx(i) = max(p%dx(i), MinPerturb) + + do i = 1, p%NumBl + Flags = ior(VF_RotFrame, VF_DerivOrder2) + if (i == 1) Flags = ior(Flags, VF_AeroMap) + call MV_AddVar(Vars%x, 'Blade'//trim(Num2LStr(i))//'Flap1', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_BF(i,1), & + Flags=Flags, & + Perturb=0.20_R8Ki * D2R_D * p%BldFlexL, & + LinNames=['1st flapwise bending-mode DOF of blade '//trim(Num2LStr(i))//& + ' (internal DOF index = DOF_BF('//trim(Num2LStr(i))//',1)), m'], & + Active=InputFileData%FlapDOF1) end do - - if (p%CompAeroMaps) then - InitOut%RotFrame_x = .true. - else - InitOut%RotFrame_x = .false. - do i=1,p%DOFs%NActvDOF - if ( p%DOFs%PS(i) >= DOF_BF(1,1) ) then - if ( p%NumBl == 2 ) then - InitOut%RotFrame_x(i) = p%DOFs%PS(i) < DOF_Teet - else - InitOut%RotFrame_x(i) = .true. ! = p%DOFs%PS(i) <= DOF_BF (MaxBl,NumBF) - end if - end if - end do - end if - - ! set linearization output names: - indx = 0 - do i=1,p%DOFs%NActvDOF,p%NActvDOF_Stride - indx = indx + 1 - InitOut%LinNames_x(indx) = p%DOF_Desc( p%DOFs%PS(i) ) + + do i = 1, p%NumBl + Flags = ior(VF_RotFrame, VF_DerivOrder2) + if (i == 1) Flags = ior(Flags, VF_AeroMap) + call MV_AddVar(Vars%x, 'Blade'//trim(Num2LStr(i))//'Edge1', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_BE(i,1), & + Flags=Flags, & + Perturb=0.20_R8Ki * D2R_D * p%BldFlexL, & + LinNames=['1st edgewise bending-mode DOF of blade '//trim(Num2LStr(i))//& + ' (internal DOF index = DOF_BE('//trim(Num2LStr(i))//',1)), m'], & + Active=InputFileData%EdgeDOF) end do - - do i=1,p%NActvVelDOF_Lin - InitOut%LinNames_x(i+p%NActvDOF_Lin) = 'First time derivative of '//trim(InitOut%LinNames_x(i))//'/s' - InitOut%RotFrame_x(i+p%NActvDOF_Lin) = InitOut%RotFrame_x(i) + do i = 1, p%NumBl + Flags = ior(VF_RotFrame, VF_DerivOrder2) + if (i == 1) Flags = ior(Flags, VF_AeroMap) + call MV_AddVar(Vars%x, 'Blade'//trim(Num2LStr(i))//'Flap2', FieldTransDisp, & + DL=DatLoc(ED_x_QT), iAry=DOF_BF(i,2), & + Flags=Flags, & + Perturb=0.02_R8Ki * D2R_D * p%BldFlexL, & + LinNames=['2nd flapwise bending-mode DOF of blade '//trim(Num2LStr(i))//& + ' (internal DOF index = DOF_BF('//trim(Num2LStr(i))//',2)), m'], & + Active=InputFileData%FlapDOF2) end do - -END SUBROUTINE ED_Init_Jacobian_x -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. -!! Do not change the order of this packing without changing corresponding linearization routines ! -SUBROUTINE ED_Init_Jacobian( p, u, y, InitOut, ErrStat, ErrMsg) - TYPE(ED_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(ED_InputType) , INTENT(IN ) :: u !< inputs - TYPE(ED_OutputType) , INTENT(IN ) :: y !< outputs - TYPE(ED_InitOutputType) , INTENT(INOUT) :: InitOut !< Output for initialization routine - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ED_Init_Jacobian' - - ! local variables: - INTEGER(IntKi) :: i, j, k, index, index_last, nu, i_meshField, m - REAL(R8Ki) :: MaxThrust, MaxTorque - REAL(R8Ki) :: ScaleLength - - - ErrStat = ErrID_None - ErrMsg = "" - - if (p%CompAeroMaps) then - p%NumBl_Lin = 1 - else - p%NumBl_Lin = p%NumBl - end if - - - call ED_Init_Jacobian_y( p, y, InitOut, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - call ED_Init_Jacobian_x( p, InitOut, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - - - ! determine how many inputs there are in the Jacobians - nu = 0; - if (allocated(u%BladePtLoads)) then - do i=1,p%NumBl_Lin - nu = nu + u%BladePtLoads(i)%NNodes * 6 ! 3 forces + 3 moments at each node on each blade - end do - end if - - if (p%CompAeroMaps) then - p%NumExtendedInputs = 0 - else - nu = nu & - + u%PlatformPtMesh%NNodes * 6 & ! 3 forces + 3 moments at each node - + u%TowerPtLoads%NNodes * 6 & ! 3 forces + 3 moments at each node - + u%HubPtLoad%NNodes * 6 & ! 3 forces + 3 moments at each node - + u%NacelleLoads%NNodes * 6 & ! 3 forces + 3 moments at each node - + u%TFinCMLoads%NNodes * 6 & ! 3 forces + 3 moments at each node - + p%NumBl & ! blade pitch command (BlPitchCom) - + 2 ! YawMom and GenTrq - p%NumExtendedInputs = 1 - end if - ! note: all other inputs are ignored - - !.................... - ! fill matrix to store index to help us figure out what the ith value of the u vector really means - ! (see elastodyn::ed_perturb_u ... these MUST match ) - ! column 1 indicates module's mesh and field - ! column 2 indicates the first index of the acceleration/load field - ! column 3 is the node - !.................... - - !............... - ! ED input mappings stored in p%Jac_u_indx: - !............... - call AllocAry(p%Jac_u_indx, nu, 3, 'p%Jac_u_indx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - - index = 1 - if (allocated(u%BladePtLoads)) then - p%Jac_u_idxStartList%BladeLoad = index - !Module/Mesh/Field: u%BladePtLoads(1)%Force = 1; - !Module/Mesh/Field: u%BladePtLoads(1)%Moment = 2; - !Module/Mesh/Field: u%BladePtLoads(2)%Force = 3; - !Module/Mesh/Field: u%BladePtLoads(2)%Moment = 4; - !Module/Mesh/Field: u%BladePtLoads(3)%Force = 5; - !Module/Mesh/Field: u%BladePtLoads(3)%Moment = 6; - do k=1,p%NumBl_Lin - - do i_meshField = 1,2 - do i=1,u%BladePtLoads(k)%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField + (k-1)*2 !Module/Mesh/Field: u%BladePtLoads(k)%{Force/Moment} = m - p%Jac_u_indx(index,2) = j !index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - end do !i_meshField - end do !k - - end if + ! Derivatives of continuous state variables + if (allocated(Vars%x)) then + do i = 1, size(Vars%x) - if (.not. p%CompAeroMaps) then - p%Jac_u_idxStartList%PlatformLoad = index - do i_meshField = 7,8 - do i=1,u%PlatformPtMesh%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField !Module/Mesh/Field: u%PlatformPtMesh%Force = 7; u%PlatformPtMesh%Moment = 8; - p%Jac_u_indx(index,2) = j !index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - end do + ! Increase variable perturbation if below minimum + Vars%x(i)%Perturb = max(Vars%x(i)%Perturb, MinPerturb) - p%Jac_u_idxStartList%TowerLoad = index - do i_meshField = 9,10 - do i=1,u%TowerPtLoads%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField !Module/Mesh/Field: u%TowerPtLoads%Force = 9; u%TowerPtLoads%Moment = 10; - p%Jac_u_indx(index,2) = j !index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i + ! Update from position to velocity + select case (Vars%x(i)%Field) + case (FieldTransDisp) + Field = FieldTransVel + case (FieldAngularDisp) + Field = FieldAngularVel + end select + + ! Add variable (only active variables are in x) + call MV_AddVar(Vars%x, Vars%x(i)%Name, Field, & + DatLoc(ED_x_QDT), iAry=Vars%x(i)%iLB, & + Flags=Vars%x(i)%Flags, & + Perturb=Vars%x(i)%Perturb, & + LinNames=['First time derivative of '//trim(Vars%x(i)%LinNames(1))//'/s']) + + ! Remove aero map flag from velocity variable + call MV_ClearFlags(Vars%x(size(Vars%x)), VF_AeroMap) end do + end if - p%Jac_u_idxStartList%HubLoad = index - do i_meshField = 11,12 - do i=1,u%HubPtLoad%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField !Module/Mesh/Field: u%HubPtLoad%Force = 11; u%HubPtLoad%Moment = 12; - p%Jac_u_indx(index,2) = j !index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - end do - - p%Jac_u_idxStartList%NacelleLoad = index - do i_meshField = 13,14 - do i=1,u%NacelleLoads%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField !Module/Mesh/Field: u%NacelleLoads%Force = 13; u%NacelleLoads%Moment = 14; - p%Jac_u_indx(index,2) = j !index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - end do + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- - p%Jac_u_idxStartList%TFinLoad = index - do i_meshField = 15,16 - do i=1,u%TFinCMLoads%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField !Module/Mesh/Field: u%TFinCMLoads%Force = 15; u%TFinCMLoads%Moment = 16; - p%Jac_u_indx(index,2) = j !index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - end do - - p%Jac_u_idxStartList%BlPitchCom = index - do i_meshField = 1,p%NumBl ! scalars - p%Jac_u_indx(index,1) = 17 !Module/Mesh/Field: u%BlPitchCom = 17; - p%Jac_u_indx(index,2) = 1 !index: n/a - p%Jac_u_indx(index,3) = i_meshField !Node: blade - index = index + 1 - end do - - do i_meshField = 18,19 ! scalars - p%Jac_u_indx(index,1) = i_meshField !Module/Mesh/Field: u%YawMom = 18; u%GenTrq = 19; - p%Jac_u_indx(index,2) = 1 !index: j - p%Jac_u_indx(index,3) = 1 !Node: i - index = index + 1 - end do - end if ! .not. p%CompAeroMaps - - !................ - ! input perturbations, du: - !................ - call AllocAry(p%du, 19, 'p%du', ErrStat2, ErrMsg2) ! 19 = number of unique values in p%Jac_u_indx(:,1) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - ! p%TipRad is set to 0 for BeamDyn simulations, so we're using a copy of the value from the input file here + ! Calculate values used for input perturbations + ! p%TipRad is set to 0 for BeamDyn simulations, so we're using a copy of the value from the input file here ScaleLength = max(p%TipRad, p%TowerHt, 1.0_ReKi) MaxThrust = 490.0_R8Ki * pi_D / 9.0_R8Ki * ScaleLength**2 MaxTorque = 122.5_R8Ki * pi_D / 27.0_R8Ki * ScaleLength**3 - - if (allocated(u%BladePtLoads)) then - do k=1,p%NumBl - p%du(2*k-1) = MaxThrust / real(100*p%NumBl*u%BladePtLoads(k)%NNodes,R8Ki) ! u%BladePtLoads(k)%Force = 2*k-1 - p%du(2*k ) = MaxTorque / real(100*p%NumBl*u%BladePtLoads(k)%NNodes,R8Ki) ! u%BladePtLoads(k)%Moment = 2*k - end do !k - else - p%du(1:6) = 0.0_R8Ki - end if - - p%du( 7) = MaxThrust / 100.0_R8Ki ! u%PlatformPtMesh%Force = 7 - p%du( 8) = MaxTorque / 100.0_R8Ki ! u%PlatformPtMesh%Moment = 8 - p%du( 9) = MaxThrust / real(100*u%TowerPtLoads%NNodes,R8Ki) ! u%TowerPtLoads%Force = 9 - p%du(10) = MaxTorque / real(100*u%TowerPtLoads%NNodes,R8Ki) ! u%TowerPtLoads%Moment = 10 - p%du(11) = MaxThrust / 100.0_R8Ki ! u%HubPtLoad%Force = 11 - p%du(12) = MaxTorque / 100.0_R8Ki ! u%HubPtLoad%Moment = 12 - p%du(13) = MaxThrust / 100.0_R8Ki ! u%NacelleLoads%Force = 13 - p%du(14) = MaxTorque / 100.0_R8Ki ! u%NacelleLoads%Moment = 14 - p%du(15) = MaxThrust / 100.0_R8Ki ! u%TFinCMLoads%Force = 15 - p%du(16) = MaxTorque / 100.0_R8Ki ! u%TFinCMLoads%Moment = 16 - p%du(17) = 2.0_R8Ki * D2R_D ! u%BlPitchCom = 17 - p%du(18) = MaxTorque / 100.0_R8Ki ! u%YawMom = 18 - p%du(19) = MaxTorque / (100.0_R8Ki*p%GBRatio) ! u%GenTrq = 19 - - !Set some limits in case perturbation is very small - do i=1,size(p%du) - p%du(i) = max(p%du(i), MinPerturb) - end do - !................ - ! names of the columns, InitOut%LinNames_u: - !................ - call AllocAry(InitOut%LinNames_u, nu+p%NumExtendedInputs, 'LinNames_u', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry(InitOut%RotFrame_u, nu+p%NumExtendedInputs, 'RotFrame_u', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry(InitOut%IsLoad_u, nu+p%NumExtendedInputs, 'IsLoad_u', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - InitOut%IsLoad_u = .true. ! most of ED's inputs are loads; we will override the non-load inputs below. - InitOut%RotFrame_u = .false. - index = 1 + ! Blade Point Loads if (allocated(u%BladePtLoads)) then - index_last = index - do k=1,p%NumBl_Lin - call PackLoadMesh_Names(u%BladePtLoads(k), 'Blade '//trim(num2lstr(k)), InitOut%LinNames_u, index) + do i = 1, p%NumBl + Flags = VF_None + if (i == 1) Flags = ior(Flags, VF_AeroMap) + call MV_AddMeshVar(Vars%u, "Blade "//Num2LStr(i), LoadFields, & + DL=DatLoc(ED_u_BladePtLoads, i), & + Mesh=u%BladePtLoads(i), & + Flags=Flags, & + Perturbs=[MaxThrust / (100.0_R8Ki*p%NumBl*p%BldNodes), & + MaxTorque / (100.0_R8Ki*p%NumBl*p%BldNodes)]) end do - !InitOut%RotFrame_u(index_last:index-1) = .true. ! values on the mesh are in global, not rotating frame end if - if (.not. p%CompAeroMaps) then - call PackLoadMesh_Names(u%PlatformPtMesh, 'Platform', InitOut%LinNames_u, index) - call PackLoadMesh_Names(u%TowerPtLoads, 'Tower', InitOut%LinNames_u, index) - call PackLoadMesh_Names(u%HubPtLoad, 'Hub', InitOut%LinNames_u, index) - call PackLoadMesh_Names(u%NacelleLoads, 'Nacelle', InitOut%LinNames_u, index) - call PackLoadMesh_Names(u%TFinCMLoads, 'Tailfin', InitOut%LinNames_u, index) - - do k = 1,p%NumBl ! scalars - InitOut%LinNames_u(index) = 'Blade '//trim(num2lstr(k))//' pitch command, rad' - InitOut%IsLoad_u( index) = .false. - InitOut%RotFrame_u(index) = .true. - index = index + 1 - end do - - InitOut%LinNames_u(index) = 'Yaw moment, Nm' ; index = index + 1 - InitOut%LinNames_u(index) = 'Generator torque, Nm' ; index = index + 1 - InitOut%LinNames_u(index) = 'Extended input: collective blade-pitch command, rad' - InitOut%IsLoad_u( index) = .false. - end if - -END SUBROUTINE ED_Init_Jacobian -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine elastodyn::ed_init_jacobian is consistant with this routine! -SUBROUTINE ED_Perturb_u( p, n, perturb_sign, u, du ) - - TYPE(ED_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(ED_InputType) , INTENT(INOUT) :: u !< perturbed ED inputs - REAL( R8Ki ) , INTENT( OUT) :: du !< amount that specific input was perturbed - - ! local variables - INTEGER :: fieldIndx - INTEGER :: node - - - fieldIndx = p%Jac_u_indx(n,2) - node = p%Jac_u_indx(n,3) - - du = p%du( p%Jac_u_indx(n,1) ) - - ! determine which mesh we're trying to perturb and perturb the input: - SELECT CASE( p%Jac_u_indx(n,1) ) - - ! BladePtLoads - ! Module/Mesh/Field: u%BladePtLoads(1)%Force = 1 - ! Module/Mesh/Field: u%BladePtLoads(1)%Moment = 2 - ! Module/Mesh/Field: u%BladePtLoads(2)%Force = 3 - ! Module/Mesh/Field: u%BladePtLoads(2)%Moment = 4 - ! Module/Mesh/Field: u%BladePtLoads(3)%Force = 5 - ! Module/Mesh/Field: u%BladePtLoads(3)%Moment = 6 - CASE ( 1); u%BladePtLoads(1)%Force( fieldIndx,node) = u%BladePtLoads(1)%Force( fieldIndx,node) + du * perturb_sign - CASE ( 2); u%BladePtLoads(1)%Moment(fieldIndx,node) = u%BladePtLoads(1)%Moment(fieldIndx,node) + du * perturb_sign - CASE ( 3); u%BladePtLoads(2)%Force( fieldIndx,node) = u%BladePtLoads(2)%Force( fieldIndx,node) + du * perturb_sign - CASE ( 4); u%BladePtLoads(2)%Moment(fieldIndx,node) = u%BladePtLoads(2)%Moment(fieldIndx,node) + du * perturb_sign - CASE ( 5); u%BladePtLoads(3)%Force( fieldIndx,node) = u%BladePtLoads(3)%Force( fieldIndx,node) + du * perturb_sign - CASE ( 6); u%BladePtLoads(3)%Moment(fieldIndx,node) = u%BladePtLoads(3)%Moment(fieldIndx,node) + du * perturb_sign - - ! PlatformPtMesh - ! Module/Mesh/Field: u%PlatformPtMesh%Force = 7 - ! Module/Mesh/Field: u%PlatformPtMesh%Moment = 8 - CASE ( 7); u%PlatformPtMesh%Force( fieldIndx,node) = u%PlatformPtMesh%Force( fieldIndx,node) + du * perturb_sign - CASE ( 8); u%PlatformPtMesh%Moment(fieldIndx,node) = u%PlatformPtMesh%Moment(fieldIndx,node) + du * perturb_sign - - ! TowerPtLoads - ! Module/Mesh/Field: u%TowerPtLoads%Force = 9 - ! Module/Mesh/Field: u%TowerPtLoads%Moment = 10 - CASE ( 9); u%TowerPtLoads%Force( fieldIndx,node) = u%TowerPtLoads%Force( fieldIndx,node) + du * perturb_sign - CASE (10); u%TowerPtLoads%Moment(fieldIndx,node) = u%TowerPtLoads%Moment(fieldIndx,node) + du * perturb_sign - - ! HubPtLoad - ! Module/Mesh/Field: u%HubPtLoad%Force = 11 - ! Module/Mesh/Field: u%HubPtLoad%Moment = 12 - CASE (11); u%HubPtLoad%Force( fieldIndx,node) = u%HubPtLoad%Force( fieldIndx,node) + du * perturb_sign - CASE (12); u%HubPtLoad%Moment(fieldIndx,node) = u%HubPtLoad%Moment(fieldIndx,node) + du * perturb_sign - - ! NacelleLoads - ! Module/Mesh/Field: u%NacelleLoads%Force = 13 - ! Module/Mesh/Field: u%NacelleLoads%Moment = 14 - CASE (13); u%NacelleLoads%Force( fieldIndx,node) = u%NacelleLoads%Force( fieldIndx,node) + du * perturb_sign - CASE (14); u%NacelleLoads%Moment(fieldIndx,node) = u%NacelleLoads%Moment(fieldIndx,node) + du * perturb_sign - - ! TFinCMLoads - ! Module/Mesh/Field: u%TFinCMLoads%Force = 15 - ! Module/Mesh/Field: u%TFinCMLoads%Moment = 16 - CASE (15); u%TFinCMLoads%Force( fieldIndx,node) = u%TFinCMLoads%Force( fieldIndx,node) + du * perturb_sign - CASE (16); u%TFinCMLoads%Moment(fieldIndx,node) = u%TFinCMLoads%Moment(fieldIndx,node) + du * perturb_sign - - ! Controller inputs - ! Module/Mesh/Field: u%BlPitchCom = 17 - ! Module/Mesh/Field: u%YawMom = 18 - ! Module/Mesh/Field: u%GenTrq = 19 - CASE (17); u%BlPitchCom(node) = u%BlPitchCom(node) + du * perturb_sign - CASE (18); u%YawMom = u%YawMom + du * perturb_sign - CASE (19); u%GenTrq = u%GenTrq + du * perturb_sign - - END SELECT - -END SUBROUTINE ED_Perturb_u -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the continuous state array. -!! Do not change this without making sure subroutine elastodyn::ed_init_jacobian is consistant with this routine! -SUBROUTINE ED_Perturb_x( p, n_in, perturb_sign, x, dx ) - - TYPE(ED_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n_in !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(ED_ContinuousStateType) , INTENT(INOUT) :: x !< perturbed ED states - REAL( R8Ki ) , INTENT( OUT) :: dx !< amount that specific state was perturbed - - - ! local variables - integer(intKi) :: indx - integer(intKi) :: n - - n = (n_in - 1) * p%NActvDOF_Stride + 1 - - if (n > p%DOFs%NActvDOF) then - - indx = p%DOFs%PS(n-p%DOFs%NActvDOF) - dx = p%dx( indx ) - - x%QDT( indx ) = x%QDT( indx ) + dx * perturb_sign - - else - - indx = p%DOFs%PS(n) - dx = p%dx( indx ) - - x%QT( indx ) = x%QT( indx ) + dx * perturb_sign - end if - -END SUBROUTINE ED_Perturb_x -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine elastodyn::ed_init_jacobian is consistant with this routine! -SUBROUTINE Compute_dY(p, y_p, y_m, delta, dY) - - TYPE(ED_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(ED_OutputType) , INTENT(IN ) :: y_p !< ED outputs at \f$ u + \Delta u \f$ or \f$ x + \Delta x \f$ (p=plus) - TYPE(ED_OutputType) , INTENT(IN ) :: y_m !< ED outputs at \f$ u - \Delta u \f$ or \f$ x - \Delta x \f$ (m=minus) - REAL(R8Ki) , INTENT(IN ) :: delta !< difference in inputs or states \f$ delta = \Delta u \f$ or \f$ delta = \Delta x \f$ - REAL(R8Ki) , INTENT(INOUT) :: dY(:) !< column of dYdu or dYdx: \f$ \frac{\partial Y}{\partial u_i} = \frac{y_p - y_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial Y}{\partial x_i} = \frac{y_p - y_m}{2 \, \Delta x}\f$ - - ! local variables: - INTEGER(IntKi) :: k ! loop over blades - INTEGER(IntKi) :: indx_first ! index indicating next value of dY to be filled - LOGICAL :: Mask(FIELDMASK_SIZE) ! flags to determine if this field is part of the packing - - - indx_first = 1 - if (allocated(y_p%BladeLn2Mesh)) then - Mask = .true. - if (p%CompAeroMaps) then - Mask(MASKID_TRANSLATIONACC) = .false. - Mask(MASKID_ROTATIONACC) = .false. - end if - - do k=1,p%NumBl_Lin - call PackMotionMesh_dY(y_p%BladeLn2Mesh(k), y_m%BladeLn2Mesh(k), dY, indx_first, FieldMask=Mask) - end do - end if - - if (.not. p%CompAeroMaps) then - call PackMotionMesh_dY(y_p%PlatformPtMesh, y_m%PlatformPtMesh, dY, indx_first, UseSmlAngle=.false.) ! all fields - call PackMotionMesh_dY(y_p%TowerLn2Mesh, y_m%TowerLn2Mesh, dY, indx_first, UseSmlAngle=.false.) ! all fields - - Mask = .false. - Mask(MASKID_TRANSLATIONDISP) = .true. - Mask(MASKID_ORIENTATION) = .true. - Mask(MASKID_ROTATIONVEL) = .true. - call PackMotionMesh_dY(y_p%HubPtMotion, y_m%HubPtMotion, dY, indx_first, FieldMask=Mask) - - do k=1,p%NumBl_Lin - call PackMotionMesh_dY(y_p%BladeRootMotion(k), y_m%BladeRootMotion(k), dY, indx_first) - end do - call PackMotionMesh_dY(y_p%NacelleMotion, y_m%NacelleMotion, dY, indx_first) - - Mask = .false. - Mask(MASKID_TRANSLATIONDISP) = .true. - Mask(MASKID_ORIENTATION) = .true. - Mask(MASKID_TRANSLATIONVEL) = .true. - Mask(MASKID_ROTATIONVEL) = .true. - call PackMotionMesh_dY(y_p%TFinCMMotion, y_m%TFinCMMotion, dY, indx_first, FieldMask=Mask) - - dY(indx_first) = y_p%Yaw - y_m%Yaw; indx_first = indx_first + 1 - dY(indx_first) = y_p%YawRate - y_m%YawRate; indx_first = indx_first + 1 - dY(indx_first) = y_p%HSS_Spd - y_m%HSS_Spd; indx_first = indx_first + 1 - - !indx_last = indx_first + p%NumOuts - 1 - do k=1,p%NumOuts + p%BldNd_TotNumOuts - dY(k+indx_first-1) = y_p%WriteOutput(k) - y_m%WriteOutput(k) - end do - end if - - dY = dY / (2.0_R8Ki*delta) - -END SUBROUTINE Compute_dY -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two continuous state types to compute an array of differences. -!! Do not change this packing without making sure subroutine elastodyn::init_jacobian is consistant with this routine! -SUBROUTINE Compute_dX(p, x_p, x_m, delta, dX) - - TYPE(ED_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(ED_ContinuousStateType) , INTENT(IN ) :: x_p !< ED continuous states at \f$ u + \Delta_p u \f$ or \f$ x + \Delta_p x \f$ (p=plus) - TYPE(ED_ContinuousStateType) , INTENT(IN ) :: x_m !< ED continuous states at \f$ u - \Delta_m u \f$ or \f$ x - \Delta_m x \f$ (m=minus) - REAL(R8Ki) , INTENT(IN ) :: delta !< difference in inputs or states \f$ delta = \Delta u \f$ or \f$ delta = \Delta_p x \f$ - REAL(R8Ki) , INTENT(INOUT) :: dX(:) !< column of dXdu or dXdx: \f$ \frac{\partial Y}{\partial u_i} = \frac{y_p - y_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial Y}{\partial x_i} = \frac{y_p - y_m}{2 \, \Delta x}\f$ - - ! local variables: - INTEGER(IntKi) :: i ! loop over blade nodes - INTEGER(IntKi) :: j ! loop over blades - INTEGER(IntKi) :: indx_first ! index indicating next value of dY to be filled - - indx_first = 0 - - if (p%NActvVelDOF_Lin > 0) then - do j=1,p%DOFs%NActvDOF, p%NActvDOF_Stride ! Loop through all active (enabled) DOFs for linearization - indx_first = indx_first + 1 - dX(indx_first) = x_p%QT( p%DOFs%PS(j) ) - x_m%QT( p%DOFs%PS(j) ) + ! Blade Root Loads + if (p%BD4Blades) then + do i = 1, p%NumBl + call MV_AddMeshVar(Vars%u, "Blade root "//Num2LStr(i), LoadFields, & + DL=DatLoc(ED_u_BladeRootLoads, i), & + Mesh=u%BladeRootLoads(i), & + Flags = VF_None, & + Perturbs=[MaxThrust / (100.0_R8Ki*p%NumBl), & + MaxTorque / (100.0_R8Ki*p%NumBl)]) end do end if - - do j=1,p%DOFs%NActvDOF, p%NActvDOF_Stride ! Loop through all active (enabled) DOFs for linearization - indx_first = indx_first + 1 - dX(indx_first) = x_p%QDT( p%DOFs%PS(j) ) - x_m%QDT( p%DOFs%PS(j) ) - end do - - dX = dX / (2*delta) ! whole array operation - -END SUBROUTINE Compute_dX -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE ED_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op, NeedTrimOP ) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(ED_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(ED_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(ED_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(ED_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(ED_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(ED_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(ED_OutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(ED_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - LOGICAL, OPTIONAL, INTENT(IN ) :: NeedTrimOP !< whether a y_op values should contain values for trim solution (3-value representation instead of full orientation matrices, no rotation acc) - - - - INTEGER(IntKi) :: i, k, index - INTEGER(IntKi) :: ny - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ED_GetOP' - LOGICAL :: ReturnTrimOP - TYPE(ED_ContinuousStateType) :: dx !< derivative of continuous states at operating point - LOGICAL :: Mask(FIELDMASK_SIZE) !< flags to determine if this field is part of the packing - - - ! Initialize ErrStat + ! Platform point loads + call MV_AddMeshVar(Vars%u, "Platform", LoadFields, & + DL=DatLoc(ED_u_PlatformPtMesh), & + Mesh=u%PlatformPtMesh, & + Perturbs=[MaxThrust / 100.0_R8Ki, & + MaxTorque / 100.0_R8Ki]) + ! Tower point loads + call MV_AddMeshVar(Vars%u, "Tower", LoadFields, & + DL=DatLoc(ED_u_TowerPtLoads), & + Mesh=u%TowerPtLoads, & + Perturbs=[MaxThrust / (100.0_R8Ki*p%NumBl*p%TwrNodes), & + MaxTorque / (100.0_R8Ki*p%NumBl*p%TwrNodes)]) + ! Hub point loads + call MV_AddMeshVar(Vars%u, "Hub", LoadFields, & + DL=DatLoc(ED_u_HubPtLoad), & + Mesh=u%HubPtLoad, & + Perturbs=[MaxThrust / 100.0_R8Ki, & + MaxTorque / 100.0_R8Ki]) + ! Nacelle point loads + call MV_AddMeshVar(Vars%u, "Nacelle", LoadFields, & + DL=DatLoc(ED_u_NacelleLoads), & + Mesh=u%NacelleLoads, & + Perturbs=[MaxThrust / 100.0_R8Ki, & + MaxTorque / 100.0_R8Ki]) + + ! TFinCM point loads + call MV_AddMeshVar(Vars%u, "Tailfin", LoadFields, & + DL=DatLoc(ED_u_TFinCMLoads), & + Mesh=u%TFinCMLoads, & + Perturbs=[MaxThrust / 100.0_R8Ki, & + MaxTorque / 100.0_R8Ki]) + + ! Non-mesh input variables + call MV_AddVar(Vars%u, "BlPitchCom", FieldScalar, & + DL=DatLoc(ED_u_BlPitchCom), iAry=1, & + Num=p%NumBl, & + Flags=VF_RotFrame + VF_Linearize + VF_2PI, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=[('Blade '//trim(num2lstr(i))//' pitch command, rad', i=1,p%NumBl)]) + + call MV_AddVar(Vars%u, "BlPitchMom", FieldScalar, & + DL=DatLoc(ED_u_BlPitchMom), iAry=1, & + Num=p%NumBl, & + Flags=VF_RotFrame + VF_Linearize, & + Perturb=MaxTorque / 100.0_R8Ki, & + LinNames=[('Blade '//trim(num2lstr(i))//' pitch moment, Nm', i=1,p%NumBl)]) + + call MV_AddVar(Vars%u, "YawMom", FieldScalar, & + DL=DatLoc(ED_u_YawMom), & + Flags=VF_Linearize, & + Perturb=MaxTorque / 100.0_R8Ki, & + LinNames=['Yaw moment, Nm']) + + call MV_AddVar(Vars%u, "GenTrq", FieldScalar, & + DL=DatLoc(ED_u_GenTrq), & + Flags=VF_Linearize, & + Perturb=MaxTorque / (100.0_R8Ki*p%GBRatio), & + LinNames=['Generator torque, Nm']) + + call MV_AddVar(Vars%u, "BlPitchComC", FieldScalar, & + DL=DatLoc(ED_u_BlPitchComC), & + Flags=VF_ExtLin + VF_Linearize + VF_2PI, & + LinNames=['Extended input: collective blade-pitch command, rad']) + + ! Set minimum input perturbations + do i = 1,size(Vars%u) + Vars%u(i)%Perturb = max(Vars%u(i)%Perturb, MinPerturb) + end do - ErrStat = ErrID_None - ErrMsg = '' - - !.................................. - IF ( PRESENT( u_op ) ) THEN - if (.not. allocated(u_op)) then - call AllocAry(u_op, size(p%Jac_u_indx,1)+p%NumExtendedInputs,'u_op',ErrStat2,ErrMsg2) ! +1 for extended input here - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - index = 1 - if (allocated(u%BladePtLoads)) then - do k=1,p%NumBl_Lin - call PackLoadMesh(u%BladePtLoads(k), u_op, index) - end do - end if - if (.not. p%CompAeroMaps) then - call PackLoadMesh(u%PlatformPtMesh, u_op, index) - call PackLoadMesh(u%TowerPtLoads, u_op, index) - call PackLoadMesh(u%HubPtLoad, u_op, index) - call PackLoadMesh(u%NacelleLoads, u_op, index) - call PackLoadMesh(u%TFinCMLoads, u_op, index) - - do k = 1,p%NumBl_Lin ! scalars - u_op(index) = u%BlPitchCom(k) - index = index + 1 - end do - u_op(index) = u%YawMom ; index = index + 1 - u_op(index) = u%GenTrq ; index = index + 1 - - ! extended input: ! note this happens only if .not. p%CompAeroMaps, so p%NumExtendedInputs > 0 - u_op(index) = u%BlPitchCom(1) - - do k = 2,p%NumBl_Lin - if (.not. EqualRealNos( u%BlPitchCom(1), u%BlPitchCom(k) ) ) then - call SetErrStat(ErrID_Info,"Operating point of collective pitch extended input is invalid because "// & - "the commanded blade pitch angles are not the same for each blade.", ErrStat, ErrMsg, RoutineName) - exit - end if - end do - end if - - END IF + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + if (allocated(y%BladeLn2Mesh))then + do i = 1, p%NumBl + Flags = VF_None + if (i == 1) Flags = ior(Flags, VF_AeroMap) + call MV_AddMeshVar(Vars%y, 'Blade '//Num2LStr(i), [FieldTransDisp, FieldOrientation, FieldTransVel, FieldAngularVel], & + DatLoc(ED_y_BladeLn2Mesh, i), & + Flags=Flags, & + Mesh=y%BladeLn2Mesh(i)) + call MV_AddMeshVar(Vars%y, 'Blade '//Num2LStr(i), [FieldTransAcc, FieldAngularAcc], & + DatLoc(ED_y_BladeLn2Mesh, i), & + Mesh=y%BladeLn2Mesh(i)) + end do + end if - !.................................. - IF ( PRESENT( y_op ) ) THEN - if (present(NeedTrimOP)) then - ReturnTrimOP = NeedTrimOP - else - ReturnTrimOP = .false. - end if - - if (.not. allocated(y_op)) then - ! our operating point includes DCM (orientation) matrices, not just small angles like the perturbation matrices do - if (p%CompAeroMaps) then - ny = p%Jac_ny - else - ny = p%Jac_ny + y%PlatformPtMesh%NNodes * 6 & ! Jac_ny has 3 for Orientation, but we need 9 at each node - + y%TowerLn2Mesh%NNodes * 6 & ! Jac_ny has 3 for Orientation, but we need 9 at each node - + y%HubPtMotion%NNodes * 6 & ! Jac_ny has 3 for Orientation, but we need 9 at each node - + y%NacelleMotion%NNodes * 6 & ! Jac_ny has 3 for Orientation, but we need 9 at each node - + y%TFinCMMotion%NNodes * 6 ! Jac_ny has 3 for Orientation, but we need 9 at each node - - do k=1,p%NumBl_Lin - ny = ny + y%BladeRootMotion(k)%NNodes * 6 ! Jac_ny has 3 for Orientation, but we need 9 at each node on each blade - end do - - end if - - if (allocated(y%BladeLn2Mesh)) then - do k=1,p%NumBl_Lin - ny = ny + y%BladeLn2Mesh(k)%NNodes * 6 ! Jac_ny has 3 for Orientation, but we need 9 (at each node on each blade) - end do - end if - - call AllocAry(y_op, ny,'y_op',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - if (ReturnTrimOP) y_op = 0.0_ReKi ! initialize in case we are returning packed orientations and don't fill the entire array + call MV_AddMeshVar(Vars%y, 'Platform', MotionFields, & + DatLoc(ED_y_PlatformPtMesh), & + Mesh=y%PlatformPtMesh) - - if ( p%CompAeroMaps ) then - Mask = .false. - Mask(MASKID_TRANSLATIONDISP) = .true. - Mask(MASKID_ORIENTATION) = .true. - Mask(MASKID_TRANSLATIONVEL) = .true. - Mask(MASKID_ROTATIONVEL) = .true. - else - Mask = .true. - end if + call MV_AddMeshVar(Vars%y, 'Tower', MotionFields, & + DatLoc(ED_y_TowerLn2Mesh), & + Mesh=y%TowerLn2Mesh, & + Flags=VF_Line) - index = 1 - if (allocated(y%BladeLn2Mesh)) then - do k=1,p%NumBl_Lin - call PackMotionMesh(y%BladeLn2Mesh(k), y_op, index, FieldMask=Mask, TrimOP=ReturnTrimOP) - end do - end if - if (.not. p%CompAeroMaps) then - call PackMotionMesh(y%PlatformPtMesh, y_op, index, TrimOP=ReturnTrimOP) - call PackMotionMesh(y%TowerLn2Mesh, y_op, index, TrimOP=ReturnTrimOP) - - Mask = .false. - Mask(MASKID_TRANSLATIONDISP) = .true. - Mask(MASKID_ORIENTATION) = .true. - Mask(MASKID_ROTATIONVEL) = .true. - call PackMotionMesh(y%HubPtMotion, y_op, index, FieldMask=Mask, TrimOP=ReturnTrimOP) - - do k=1,p%NumBl_Lin - call PackMotionMesh(y%BladeRootMotion(k), y_op, index, TrimOP=ReturnTrimOP) - end do - call PackMotionMesh(y%NacelleMotion, y_op, index, TrimOP=ReturnTrimOP) - - Mask = .false. - Mask(MASKID_TRANSLATIONDISP) = .true. - Mask(MASKID_ORIENTATION) = .true. - Mask(MASKID_TRANSLATIONVEL) = .true. - Mask(MASKID_ROTATIONVEL) = .true. - call PackMotionMesh(y%TFinCMMotion, y_op, index, FieldMask=Mask, TrimOP=ReturnTrimOP) - - y_op(index) = y%Yaw ; index = index + 1 - y_op(index) = y%YawRate ; index = index + 1 - y_op(index) = y%HSS_Spd - - do i=1,p%NumOuts + p%BldNd_TotNumOuts - y_op(i+index) = y%WriteOutput(i) - end do - end if - - END IF + call MV_AddMeshVar(Vars%y, 'Hub', [FieldTransDisp, FieldOrientation, FieldAngularVel], & + DatLoc(ED_y_HubPtMotion), & + Mesh=y%HubPtMotion) - !.................................. - IF ( PRESENT( x_op ) ) THEN + do i = 1, p%NumBl + call MV_AddMeshVar(Vars%y, 'Blade root '//Num2LStr(i), MotionFields, & + DatLoc(ED_y_BladeRootMotion, i), & + Mesh=y%BladeRootMotion(i)) + end do - if (.not. allocated(x_op)) then - call AllocAry(x_op, p%NActvDOF_Lin + p%NActvVelDOF_Lin,'x_op',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - index = 0 - do i=1,p%DOFs%NActvDOF,p%NActvDOF_Stride ! Loop through all active (enabled) DOFs in the Jacobian - index = index + 1 - x_op(index) = x%QT( p%DOFs%PS(i) ) + call MV_AddVar(Vars%y, 'BlPitch', FieldScalar, & + DatLoc(ED_y_BlPitch), & + Num=p%NumBl, & + LinNames=[('Blade '//trim(num2lstr(i))//' pitch angle, rad', i=1,p%NumBl)]) + + call MV_AddVar(Vars%y, 'BlPRate', FieldScalar, & + DatLoc(ED_y_BlPRate), & + Num=p%NumBl, & + LinNames=[('Blade '//trim(num2lstr(i))//' pitch rate, rad/s', i=1,p%NumBl)]) + + call MV_AddMeshVar(Vars%y, 'Nacelle', MotionFields, & + DatLoc(ED_y_NacelleMotion), & + Mesh=y%NacelleMotion) + + call MV_AddMeshVar(Vars%y, 'TailFin', [FieldTransDisp, FieldOrientation, FieldTransVel, FieldAngularVel], & + DatLoc(ED_y_TFinCMMotion), & + Mesh=y%TFinCMMotion) + + call MV_AddVar(Vars%y, 'Yaw', FieldScalar, & + DatLoc(ED_y_Yaw), & + Flags=VF_2PI, & + LinNames=['Yaw, rad']) + + call MV_AddVar(Vars%y, 'YawRate', FieldScalar, & + DatLoc(ED_y_YawRate), & + LinNames=['YawRate, rad/s']) + + call MV_AddVar(Vars%y, 'HSS_Spd', FieldScalar, & + DatLoc(ED_y_HSS_Spd), & + LinNames=['HSS_Spd, rad/s']) + + ! Write output variables + do i = 1, p%NumOuts + call MV_AddVar(Vars%y, p%OutParam(i)%Name, FieldScalar, & + DatLoc(ED_y_WriteOutput), iAry=i, & + Flags=VF_WriteOut + OutParamFlags(p%OutParam(i)%Indx), & + LinNames=[trim(p%OutParam(i)%Name)//', '//trim(p%OutParam(i)%Units)], & + Active=(p%OutParam(i)%Indx > 0)) + end do + k = p%NumOuts + 1 + do i = 1, p%BldNd_NumOuts + do j = 1, p%BldNd_BladesOut + call MV_AddVar(Vars%y, p%BldNd_OutParam(i)%Name, FieldScalar, & + DatLoc(ED_y_WriteOutput), iAry=k, & + Num=p%BldNodes, & + Flags=VF_WriteOut + VF_RotFrame, & + LinNames=[(BldOutLinName(p%BldNd_OutParam(i), j, k), k=1, p%BldNodes)], & + Active=(p%BldNd_OutParam(i)%Indx > 0)) + k = k + p%BldNodes end do - - if (p%NActvVelDOF_Lin > 0) then ! .not. p%CompAeroMaps - do i=1,p%DOFs%NActvDOF,p%NActvDOF_Stride ! Loop through all active (enabled) DOFs in the Jacobian - index = index + 1 - x_op(index) = x%QDT( p%DOFs%PS(i) ) - end do - end if - - END IF + end do - !.................................. - IF ( PRESENT( dx_op ) ) THEN + !---------------------------------------------------------------------------- + ! Initialization dependent on linearization + !---------------------------------------------------------------------------- - if (.not. allocated(dx_op)) then - call AllocAry(dx_op, p%NActvDOF_Lin + p%NActvVelDOF_Lin,'dx_op',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - call ED_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dx, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call ED_DestroyContState( dx, ErrStat2, ErrMsg2) - return - end if - - index = 0 - if (p%NActvVelDOF_Lin > 0) then ! p%CompAeroMaps - do i=1,p%DOFs%NActvDOF,p%NActvDOF_Stride ! Loop through all active (enabled) DOFs in the Jacobian - index = index + 1 - dx_op(index) = dx%QT( p%DOFs%PS(i) ) - end do - end if - - do i=1,p%DOFs%NActvDOF,p%NActvDOF_Stride ! Loop through all active (enabled) DOFs in the Jacobian - index = index + 1 - dx_op(index) = dx%QDT( p%DOFs%PS(i) ) - end do - - call ED_DestroyContState( dx, ErrStat2, ErrMsg2) - - END IF + call MV_InitVarsJac(Vars, m%Jac, Linearize .or. p%CompAeroMaps, ErrStat2, ErrMsg2); if (Failed()) return - !.................................. - IF ( PRESENT( xd_op ) ) THEN - END IF - - !.................................. - IF ( PRESENT( z_op ) ) THEN - END IF - -END SUBROUTINE ED_GetOP -!---------------------------------------------------------------------------------------------------------------------------------- + if (Linearize .or. p%CompAeroMaps) then + call ED_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ED_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ED_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ED_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + end if +contains + function BldOutLinName(OutParam, iBlade, iNode) result(Name) + integer(IntKi), intent(in) :: iBlade, iNode + type(OutParmType), intent(in) :: OutParam + character(LinChanLen) :: Name + write(Name, '("B",I1.1,"N",I3.3,A,", ",A)') iBlade, iNode, trim(OutParam%Name), trim(OutParam%Units) + end function + function OutParamFlags(indx) result(flagsRes) + integer(IntKi), intent(in) :: indx + integer(IntKi) :: flagsRes + integer(IntKi), parameter :: RotatingFrameIndices(*) = [& + TipDxc, TipDyc, TipDzc, TipDxb, TipDyb, & + TipALxb, TipALyb, TipALzb, TipRDxb, TipRDyb, TipRDzc, TipClrnc, & + PtchPMzc, & + RootFxc, RootFyc, RootFzc, RootFxb, RootFyb, & + RootMxc, RootMyc, RootMzc, RootMxb, RootMyb, & + SpnALxb, SpnALyb, SpnALzb, SpnFLxb, SpnFLyb, SpnFLzb, & + SpnMLxb, SpnMLyb, SpnMLzb, SpnTDxb, SpnTDyb, SpnTDzb, & + SpnRDxb, SpnRDyb, SpnRDzb] + if (any(RotatingFrameIndices == indx)) then + flagsRes = VF_RotFrame + else + flagsRes = VF_None + end if + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine END MODULE ElastoDyn !********************************************************************************************************************************** diff --git a/modules/elastodyn/src/ElastoDyn_IO.f90 b/modules/elastodyn/src/ElastoDyn_IO.f90 index bd41a97ca9..33996cd46f 100644 --- a/modules/elastodyn/src/ElastoDyn_IO.f90 +++ b/modules/elastodyn/src/ElastoDyn_IO.f90 @@ -55,15 +55,17 @@ MODULE ElastoDyn_Parameters INTEGER(IntKi), PARAMETER :: DOF_DrTr = 14 ! DOF index for drivetrain rotational-flexibility INTEGER(IntKi), PARAMETER :: DOF_TFrl = 15 ! DOF index for tail-furl + INTEGER(IntKi), PARAMETER :: DOF_BP (MaxBl) = (/ 16, 20, 24 /) ! DOF indices for blade pitch + INTEGER(IntKi), PARAMETER :: DOF_BE (MaxBl,NumBE) = RESHAPE( & ! DOF indices for blade edge: - (/ 17, 20, 23 /), (/MaxBl,NumBE/) ) ! 1st blade edge mode for blades 1,2, and 3, respectively 17 + 3*(K-1) + (/ 18, 22, 26 /), (/MaxBl,NumBE/) ) ! 1st blade edge mode for blades 1,2, and 3, respectively 17 + 3*(K-1) INTEGER(IntKi), PARAMETER :: DOF_BF (MaxBl,NumBF) = RESHAPE( & ! DOF indices for blade flap: - (/ 16, 19, 22, & ! 1st blade flap mode for blades 1,2, and 3, respectively 16 + 3*(K-1) - 18, 21, 24 /), (/MaxBl,NumBF/) ) ! 2nd blade flap mode for blades 1,2, and 3, respectively 18 + 3*(K-1) + (/ 17, 21, 25, & ! 1st blade flap mode for blades 1,2, and 3, respectively 16 + 3*(K-1) + 19, 23, 27 /), (/MaxBl,NumBF/) ) ! 2nd blade flap mode for blades 1,2, and 3, respectively 18 + 3*(K-1) - INTEGER(IntKi), PARAMETER :: DOF_Teet = 22 !DOF_TFrl + 2*(NumBE+NumBF)+ 1 ! DOF index for rotor-teeter - INTEGER(IntKi), PARAMETER :: ED_MaxDOFs = 24 + INTEGER(IntKi), PARAMETER :: DOF_Teet = 24 !DOF_TFrl + 2*(NumBE+NumBF)+ 1 ! DOF index for rotor-teeter + INTEGER(IntKi), PARAMETER :: ED_MaxDOFs = 27 INTEGER(IntKi), PARAMETER :: NPA = 9 ! Number of DOFs that contribute to the angular velocity of the tail (body A) in the inertia frame. @@ -94,21 +96,12 @@ MODULE ElastoDyn_Parameters INTEGER(IntKi), PARAMETER :: PolyOrd = 6 ! Order of the polynomial describing the mode shape - - ! =================================================================================================== ! 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". -!MODULE ElastoDyn_IO_Params -! -! USE NWTC_Library -! USE ElastoDyn_Types -! -! IMPLICIT NONE - +! This code was generated by "Write_ChckOutLst.m" at 29-Oct-2025 14:47:34. ! Indices for computing output channels: ! NOTES: @@ -518,738 +511,745 @@ MODULE ElastoDyn_Parameters INTEGER(IntKi), PARAMETER :: PtchPMzc1 = 370 INTEGER(IntKi), PARAMETER :: PtchPMzc2 = 371 INTEGER(IntKi), PARAMETER :: PtchPMzc3 = 372 + INTEGER(IntKi), PARAMETER :: BldPRate1 = 373 + INTEGER(IntKi), PARAMETER :: BldPRate2 = 374 + INTEGER(IntKi), PARAMETER :: BldPRate3 = 375 + INTEGER(IntKi), PARAMETER :: BldPAcc1 = 376 + INTEGER(IntKi), PARAMETER :: BldPAcc2 = 377 + INTEGER(IntKi), PARAMETER :: BldPAcc3 = 378 ! Teeter Motions: - INTEGER(IntKi), PARAMETER :: TeetPya = 373 - INTEGER(IntKi), PARAMETER :: TeetVya = 374 - INTEGER(IntKi), PARAMETER :: TeetAya = 375 + INTEGER(IntKi), PARAMETER :: TeetPya = 379 + INTEGER(IntKi), PARAMETER :: TeetVya = 380 + INTEGER(IntKi), PARAMETER :: TeetAya = 381 ! Shaft Motions: - INTEGER(IntKi), PARAMETER :: LSSTipPxa = 376 - INTEGER(IntKi), PARAMETER :: LSSTipVxa = 377 - INTEGER(IntKi), PARAMETER :: LSSTipAxa = 378 - INTEGER(IntKi), PARAMETER :: LSSGagPxa = 379 - INTEGER(IntKi), PARAMETER :: LSSGagVxa = 380 - INTEGER(IntKi), PARAMETER :: LSSGagAxa = 381 - INTEGER(IntKi), PARAMETER :: HSShftV = 382 - INTEGER(IntKi), PARAMETER :: HSShftA = 383 + INTEGER(IntKi), PARAMETER :: LSSTipPxa = 382 + INTEGER(IntKi), PARAMETER :: LSSTipVxa = 383 + INTEGER(IntKi), PARAMETER :: LSSTipAxa = 384 + INTEGER(IntKi), PARAMETER :: LSSGagPxa = 385 + INTEGER(IntKi), PARAMETER :: LSSGagVxa = 386 + INTEGER(IntKi), PARAMETER :: LSSGagAxa = 387 + INTEGER(IntKi), PARAMETER :: HSShftV = 388 + INTEGER(IntKi), PARAMETER :: HSShftA = 389 ! Nacelle IMU Motions: - INTEGER(IntKi), PARAMETER :: NcIMUTVxs = 384 - INTEGER(IntKi), PARAMETER :: NcIMUTVys = 385 - INTEGER(IntKi), PARAMETER :: NcIMUTVzs = 386 - INTEGER(IntKi), PARAMETER :: NcIMUTAxs = 387 - INTEGER(IntKi), PARAMETER :: NcIMUTAys = 388 - INTEGER(IntKi), PARAMETER :: NcIMUTAzs = 389 - INTEGER(IntKi), PARAMETER :: NcIMUTAgxs = 390 - INTEGER(IntKi), PARAMETER :: NcIMUTAgys = 391 - INTEGER(IntKi), PARAMETER :: NcIMUTAgzs = 392 - INTEGER(IntKi), PARAMETER :: NcIMURVxs = 393 - INTEGER(IntKi), PARAMETER :: NcIMURVys = 394 - INTEGER(IntKi), PARAMETER :: NcIMURVzs = 395 - INTEGER(IntKi), PARAMETER :: NcIMURAxs = 396 - INTEGER(IntKi), PARAMETER :: NcIMURAys = 397 - INTEGER(IntKi), PARAMETER :: NcIMURAzs = 398 + INTEGER(IntKi), PARAMETER :: NcIMUTVxs = 390 + INTEGER(IntKi), PARAMETER :: NcIMUTVys = 391 + INTEGER(IntKi), PARAMETER :: NcIMUTVzs = 392 + INTEGER(IntKi), PARAMETER :: NcIMUTAxs = 393 + INTEGER(IntKi), PARAMETER :: NcIMUTAys = 394 + INTEGER(IntKi), PARAMETER :: NcIMUTAzs = 395 + INTEGER(IntKi), PARAMETER :: NcIMUTAgxs = 396 + INTEGER(IntKi), PARAMETER :: NcIMUTAgys = 397 + INTEGER(IntKi), PARAMETER :: NcIMUTAgzs = 398 + INTEGER(IntKi), PARAMETER :: NcIMURVxs = 399 + INTEGER(IntKi), PARAMETER :: NcIMURVys = 400 + INTEGER(IntKi), PARAMETER :: NcIMURVzs = 401 + INTEGER(IntKi), PARAMETER :: NcIMURAxs = 402 + INTEGER(IntKi), PARAMETER :: NcIMURAys = 403 + INTEGER(IntKi), PARAMETER :: NcIMURAzs = 404 ! Rotor-Furl Motions: - INTEGER(IntKi), PARAMETER :: RotFurlP = 399 - INTEGER(IntKi), PARAMETER :: RotFurlV = 400 - INTEGER(IntKi), PARAMETER :: RotFurlA = 401 + INTEGER(IntKi), PARAMETER :: RotFurlP = 405 + INTEGER(IntKi), PARAMETER :: RotFurlV = 406 + INTEGER(IntKi), PARAMETER :: RotFurlA = 407 ! Tail-Furl Motions: - INTEGER(IntKi), PARAMETER :: TailFurlP = 402 - INTEGER(IntKi), PARAMETER :: TailFurlV = 403 - INTEGER(IntKi), PARAMETER :: TailFurlA = 404 + INTEGER(IntKi), PARAMETER :: TailFurlP = 408 + INTEGER(IntKi), PARAMETER :: TailFurlV = 409 + INTEGER(IntKi), PARAMETER :: TailFurlA = 410 ! Nacelle Yaw Motions: - INTEGER(IntKi), PARAMETER :: YawPzn = 405 - INTEGER(IntKi), PARAMETER :: YawVzn = 406 - INTEGER(IntKi), PARAMETER :: YawAzn = 407 + INTEGER(IntKi), PARAMETER :: YawPzn = 411 + INTEGER(IntKi), PARAMETER :: YawVzn = 412 + INTEGER(IntKi), PARAMETER :: YawAzn = 413 ! Tower-Top / Yaw Bearing Motions: - INTEGER(IntKi), PARAMETER :: TwrTpTDxi = 408 - INTEGER(IntKi), PARAMETER :: TwrTpTDyi = 409 - INTEGER(IntKi), PARAMETER :: TwrTpTDzi = 410 - INTEGER(IntKi), PARAMETER :: YawBrTDxp = 411 - INTEGER(IntKi), PARAMETER :: YawBrTDyp = 412 - INTEGER(IntKi), PARAMETER :: YawBrTDzp = 413 - INTEGER(IntKi), PARAMETER :: YawBrTDxt = 414 - INTEGER(IntKi), PARAMETER :: YawBrTDyt = 415 - INTEGER(IntKi), PARAMETER :: YawBrTDzt = 416 - INTEGER(IntKi), PARAMETER :: YawBrTVxp = 417 - INTEGER(IntKi), PARAMETER :: YawBrTVyp = 418 - INTEGER(IntKi), PARAMETER :: YawBrTVzp = 419 - INTEGER(IntKi), PARAMETER :: YawBrTAxp = 420 - INTEGER(IntKi), PARAMETER :: YawBrTAyp = 421 - INTEGER(IntKi), PARAMETER :: YawBrTAzp = 422 - INTEGER(IntKi), PARAMETER :: YawBrTAgxp = 423 - INTEGER(IntKi), PARAMETER :: YawBrTAgyp = 424 - INTEGER(IntKi), PARAMETER :: YawBrTAgzp = 425 - INTEGER(IntKi), PARAMETER :: YawBrRDxt = 426 - INTEGER(IntKi), PARAMETER :: YawBrRDyt = 427 - INTEGER(IntKi), PARAMETER :: YawBrRDzt = 428 - INTEGER(IntKi), PARAMETER :: YawBrRVxp = 429 - INTEGER(IntKi), PARAMETER :: YawBrRVyp = 430 - INTEGER(IntKi), PARAMETER :: YawBrRVzp = 431 - INTEGER(IntKi), PARAMETER :: YawBrRAxp = 432 - INTEGER(IntKi), PARAMETER :: YawBrRAyp = 433 - INTEGER(IntKi), PARAMETER :: YawBrRAzp = 434 + INTEGER(IntKi), PARAMETER :: TwrTpTDxi = 414 + INTEGER(IntKi), PARAMETER :: TwrTpTDyi = 415 + INTEGER(IntKi), PARAMETER :: TwrTpTDzi = 416 + INTEGER(IntKi), PARAMETER :: YawBrTDxp = 417 + INTEGER(IntKi), PARAMETER :: YawBrTDyp = 418 + INTEGER(IntKi), PARAMETER :: YawBrTDzp = 419 + INTEGER(IntKi), PARAMETER :: YawBrTDxt = 420 + INTEGER(IntKi), PARAMETER :: YawBrTDyt = 421 + INTEGER(IntKi), PARAMETER :: YawBrTDzt = 422 + INTEGER(IntKi), PARAMETER :: YawBrTVxp = 423 + INTEGER(IntKi), PARAMETER :: YawBrTVyp = 424 + INTEGER(IntKi), PARAMETER :: YawBrTVzp = 425 + INTEGER(IntKi), PARAMETER :: YawBrTAxp = 426 + INTEGER(IntKi), PARAMETER :: YawBrTAyp = 427 + INTEGER(IntKi), PARAMETER :: YawBrTAzp = 428 + INTEGER(IntKi), PARAMETER :: YawBrTAgxp = 429 + INTEGER(IntKi), PARAMETER :: YawBrTAgyp = 430 + INTEGER(IntKi), PARAMETER :: YawBrTAgzp = 431 + INTEGER(IntKi), PARAMETER :: YawBrRDxt = 432 + INTEGER(IntKi), PARAMETER :: YawBrRDyt = 433 + INTEGER(IntKi), PARAMETER :: YawBrRDzt = 434 + INTEGER(IntKi), PARAMETER :: YawBrRVxp = 435 + INTEGER(IntKi), PARAMETER :: YawBrRVyp = 436 + INTEGER(IntKi), PARAMETER :: YawBrRVzp = 437 + INTEGER(IntKi), PARAMETER :: YawBrRAxp = 438 + INTEGER(IntKi), PARAMETER :: YawBrRAyp = 439 + INTEGER(IntKi), PARAMETER :: YawBrRAzp = 440 ! Local Tower Motions: - INTEGER(IntKi), PARAMETER :: TwHt1ALxt = 435 - INTEGER(IntKi), PARAMETER :: TwHt1ALyt = 436 - INTEGER(IntKi), PARAMETER :: TwHt1ALzt = 437 - INTEGER(IntKi), PARAMETER :: TwHt2ALxt = 438 - INTEGER(IntKi), PARAMETER :: TwHt2ALyt = 439 - INTEGER(IntKi), PARAMETER :: TwHt2ALzt = 440 - INTEGER(IntKi), PARAMETER :: TwHt3ALxt = 441 - INTEGER(IntKi), PARAMETER :: TwHt3ALyt = 442 - INTEGER(IntKi), PARAMETER :: TwHt3ALzt = 443 - INTEGER(IntKi), PARAMETER :: TwHt4ALxt = 444 - INTEGER(IntKi), PARAMETER :: TwHt4ALyt = 445 - INTEGER(IntKi), PARAMETER :: TwHt4ALzt = 446 - INTEGER(IntKi), PARAMETER :: TwHt5ALxt = 447 - INTEGER(IntKi), PARAMETER :: TwHt5ALyt = 448 - INTEGER(IntKi), PARAMETER :: TwHt5ALzt = 449 - INTEGER(IntKi), PARAMETER :: TwHt6ALxt = 450 - INTEGER(IntKi), PARAMETER :: TwHt6ALyt = 451 - INTEGER(IntKi), PARAMETER :: TwHt6ALzt = 452 - INTEGER(IntKi), PARAMETER :: TwHt7ALxt = 453 - INTEGER(IntKi), PARAMETER :: TwHt7ALyt = 454 - INTEGER(IntKi), PARAMETER :: TwHt7ALzt = 455 - INTEGER(IntKi), PARAMETER :: TwHt8ALxt = 456 - INTEGER(IntKi), PARAMETER :: TwHt8ALyt = 457 - INTEGER(IntKi), PARAMETER :: TwHt8ALzt = 458 - INTEGER(IntKi), PARAMETER :: TwHt9ALxt = 459 - INTEGER(IntKi), PARAMETER :: TwHt9ALyt = 460 - INTEGER(IntKi), PARAMETER :: TwHt9ALzt = 461 - INTEGER(IntKi), PARAMETER :: TwHt1ALgxt = 462 - INTEGER(IntKi), PARAMETER :: TwHt1ALgyt = 463 - INTEGER(IntKi), PARAMETER :: TwHt1ALgzt = 464 - INTEGER(IntKi), PARAMETER :: TwHt2ALgxt = 465 - INTEGER(IntKi), PARAMETER :: TwHt2ALgyt = 466 - INTEGER(IntKi), PARAMETER :: TwHt2ALgzt = 467 - INTEGER(IntKi), PARAMETER :: TwHt3ALgxt = 468 - INTEGER(IntKi), PARAMETER :: TwHt3ALgyt = 469 - INTEGER(IntKi), PARAMETER :: TwHt3ALgzt = 470 - INTEGER(IntKi), PARAMETER :: TwHt4ALgxt = 471 - INTEGER(IntKi), PARAMETER :: TwHt4ALgyt = 472 - INTEGER(IntKi), PARAMETER :: TwHt4ALgzt = 473 - INTEGER(IntKi), PARAMETER :: TwHt5ALgxt = 474 - INTEGER(IntKi), PARAMETER :: TwHt5ALgyt = 475 - INTEGER(IntKi), PARAMETER :: TwHt5ALgzt = 476 - INTEGER(IntKi), PARAMETER :: TwHt6ALgxt = 477 - INTEGER(IntKi), PARAMETER :: TwHt6ALgyt = 478 - INTEGER(IntKi), PARAMETER :: TwHt6ALgzt = 479 - INTEGER(IntKi), PARAMETER :: TwHt7ALgxt = 480 - INTEGER(IntKi), PARAMETER :: TwHt7ALgyt = 481 - INTEGER(IntKi), PARAMETER :: TwHt7ALgzt = 482 - INTEGER(IntKi), PARAMETER :: TwHt8ALgxt = 483 - INTEGER(IntKi), PARAMETER :: TwHt8ALgyt = 484 - INTEGER(IntKi), PARAMETER :: TwHt8ALgzt = 485 - INTEGER(IntKi), PARAMETER :: TwHt9ALgxt = 486 - INTEGER(IntKi), PARAMETER :: TwHt9ALgyt = 487 - INTEGER(IntKi), PARAMETER :: TwHt9ALgzt = 488 - INTEGER(IntKi), PARAMETER :: TwHt1TDxt = 489 - INTEGER(IntKi), PARAMETER :: TwHt1TDyt = 490 - INTEGER(IntKi), PARAMETER :: TwHt1TDzt = 491 - INTEGER(IntKi), PARAMETER :: TwHt2TDxt = 492 - INTEGER(IntKi), PARAMETER :: TwHt2TDyt = 493 - INTEGER(IntKi), PARAMETER :: TwHt2TDzt = 494 - INTEGER(IntKi), PARAMETER :: TwHt3TDxt = 495 - INTEGER(IntKi), PARAMETER :: TwHt3TDyt = 496 - INTEGER(IntKi), PARAMETER :: TwHt3TDzt = 497 - INTEGER(IntKi), PARAMETER :: TwHt4TDxt = 498 - INTEGER(IntKi), PARAMETER :: TwHt4TDyt = 499 - INTEGER(IntKi), PARAMETER :: TwHt4TDzt = 500 - INTEGER(IntKi), PARAMETER :: TwHt5TDxt = 501 - INTEGER(IntKi), PARAMETER :: TwHt5TDyt = 502 - INTEGER(IntKi), PARAMETER :: TwHt5TDzt = 503 - INTEGER(IntKi), PARAMETER :: TwHt6TDxt = 504 - INTEGER(IntKi), PARAMETER :: TwHt6TDyt = 505 - INTEGER(IntKi), PARAMETER :: TwHt6TDzt = 506 - INTEGER(IntKi), PARAMETER :: TwHt7TDxt = 507 - INTEGER(IntKi), PARAMETER :: TwHt7TDyt = 508 - INTEGER(IntKi), PARAMETER :: TwHt7TDzt = 509 - INTEGER(IntKi), PARAMETER :: TwHt8TDxt = 510 - INTEGER(IntKi), PARAMETER :: TwHt8TDyt = 511 - INTEGER(IntKi), PARAMETER :: TwHt8TDzt = 512 - INTEGER(IntKi), PARAMETER :: TwHt9TDxt = 513 - INTEGER(IntKi), PARAMETER :: TwHt9TDyt = 514 - INTEGER(IntKi), PARAMETER :: TwHt9TDzt = 515 - INTEGER(IntKi), PARAMETER :: TwHt1RDxt = 516 - INTEGER(IntKi), PARAMETER :: TwHt1RDyt = 517 - INTEGER(IntKi), PARAMETER :: TwHt1RDzt = 518 - INTEGER(IntKi), PARAMETER :: TwHt2RDxt = 519 - INTEGER(IntKi), PARAMETER :: TwHt2RDyt = 520 - INTEGER(IntKi), PARAMETER :: TwHt2RDzt = 521 - INTEGER(IntKi), PARAMETER :: TwHt3RDxt = 522 - INTEGER(IntKi), PARAMETER :: TwHt3RDyt = 523 - INTEGER(IntKi), PARAMETER :: TwHt3RDzt = 524 - INTEGER(IntKi), PARAMETER :: TwHt4RDxt = 525 - INTEGER(IntKi), PARAMETER :: TwHt4RDyt = 526 - INTEGER(IntKi), PARAMETER :: TwHt4RDzt = 527 - INTEGER(IntKi), PARAMETER :: TwHt5RDxt = 528 - INTEGER(IntKi), PARAMETER :: TwHt5RDyt = 529 - INTEGER(IntKi), PARAMETER :: TwHt5RDzt = 530 - INTEGER(IntKi), PARAMETER :: TwHt6RDxt = 531 - INTEGER(IntKi), PARAMETER :: TwHt6RDyt = 532 - INTEGER(IntKi), PARAMETER :: TwHt6RDzt = 533 - INTEGER(IntKi), PARAMETER :: TwHt7RDxt = 534 - INTEGER(IntKi), PARAMETER :: TwHt7RDyt = 535 - INTEGER(IntKi), PARAMETER :: TwHt7RDzt = 536 - INTEGER(IntKi), PARAMETER :: TwHt8RDxt = 537 - INTEGER(IntKi), PARAMETER :: TwHt8RDyt = 538 - INTEGER(IntKi), PARAMETER :: TwHt8RDzt = 539 - INTEGER(IntKi), PARAMETER :: TwHt9RDxt = 540 - INTEGER(IntKi), PARAMETER :: TwHt9RDyt = 541 - INTEGER(IntKi), PARAMETER :: TwHt9RDzt = 542 - INTEGER(IntKi), PARAMETER :: TwHt1TPxi = 543 - INTEGER(IntKi), PARAMETER :: TwHt1TPyi = 544 - INTEGER(IntKi), PARAMETER :: TwHt1TPzi = 545 - INTEGER(IntKi), PARAMETER :: TwHt2TPxi = 546 - INTEGER(IntKi), PARAMETER :: TwHt2TPyi = 547 - INTEGER(IntKi), PARAMETER :: TwHt2TPzi = 548 - INTEGER(IntKi), PARAMETER :: TwHt3TPxi = 549 - INTEGER(IntKi), PARAMETER :: TwHt3TPyi = 550 - INTEGER(IntKi), PARAMETER :: TwHt3TPzi = 551 - INTEGER(IntKi), PARAMETER :: TwHt4TPxi = 552 - INTEGER(IntKi), PARAMETER :: TwHt4TPyi = 553 - INTEGER(IntKi), PARAMETER :: TwHt4TPzi = 554 - INTEGER(IntKi), PARAMETER :: TwHt5TPxi = 555 - INTEGER(IntKi), PARAMETER :: TwHt5TPyi = 556 - INTEGER(IntKi), PARAMETER :: TwHt5TPzi = 557 - INTEGER(IntKi), PARAMETER :: TwHt6TPxi = 558 - INTEGER(IntKi), PARAMETER :: TwHt6TPyi = 559 - INTEGER(IntKi), PARAMETER :: TwHt6TPzi = 560 - INTEGER(IntKi), PARAMETER :: TwHt7TPxi = 561 - INTEGER(IntKi), PARAMETER :: TwHt7TPyi = 562 - INTEGER(IntKi), PARAMETER :: TwHt7TPzi = 563 - INTEGER(IntKi), PARAMETER :: TwHt8TPxi = 564 - INTEGER(IntKi), PARAMETER :: TwHt8TPyi = 565 - INTEGER(IntKi), PARAMETER :: TwHt8TPzi = 566 - INTEGER(IntKi), PARAMETER :: TwHt9TPxi = 567 - INTEGER(IntKi), PARAMETER :: TwHt9TPyi = 568 - INTEGER(IntKi), PARAMETER :: TwHt9TPzi = 569 - INTEGER(IntKi), PARAMETER :: TwHt1RPxi = 570 - INTEGER(IntKi), PARAMETER :: TwHt1RPyi = 571 - INTEGER(IntKi), PARAMETER :: TwHt1RPzi = 572 - INTEGER(IntKi), PARAMETER :: TwHt2RPxi = 573 - INTEGER(IntKi), PARAMETER :: TwHt2RPyi = 574 - INTEGER(IntKi), PARAMETER :: TwHt2RPzi = 575 - INTEGER(IntKi), PARAMETER :: TwHt3RPxi = 576 - INTEGER(IntKi), PARAMETER :: TwHt3RPyi = 577 - INTEGER(IntKi), PARAMETER :: TwHt3RPzi = 578 - INTEGER(IntKi), PARAMETER :: TwHt4RPxi = 579 - INTEGER(IntKi), PARAMETER :: TwHt4RPyi = 580 - INTEGER(IntKi), PARAMETER :: TwHt4RPzi = 581 - INTEGER(IntKi), PARAMETER :: TwHt5RPxi = 582 - INTEGER(IntKi), PARAMETER :: TwHt5RPyi = 583 - INTEGER(IntKi), PARAMETER :: TwHt5RPzi = 584 - INTEGER(IntKi), PARAMETER :: TwHt6RPxi = 585 - INTEGER(IntKi), PARAMETER :: TwHt6RPyi = 586 - INTEGER(IntKi), PARAMETER :: TwHt6RPzi = 587 - INTEGER(IntKi), PARAMETER :: TwHt7RPxi = 588 - INTEGER(IntKi), PARAMETER :: TwHt7RPyi = 589 - INTEGER(IntKi), PARAMETER :: TwHt7RPzi = 590 - INTEGER(IntKi), PARAMETER :: TwHt8RPxi = 591 - INTEGER(IntKi), PARAMETER :: TwHt8RPyi = 592 - INTEGER(IntKi), PARAMETER :: TwHt8RPzi = 593 - INTEGER(IntKi), PARAMETER :: TwHt9RPxi = 594 - INTEGER(IntKi), PARAMETER :: TwHt9RPyi = 595 - INTEGER(IntKi), PARAMETER :: TwHt9RPzi = 596 + INTEGER(IntKi), PARAMETER :: TwHt1ALxt = 441 + INTEGER(IntKi), PARAMETER :: TwHt1ALyt = 442 + INTEGER(IntKi), PARAMETER :: TwHt1ALzt = 443 + INTEGER(IntKi), PARAMETER :: TwHt2ALxt = 444 + INTEGER(IntKi), PARAMETER :: TwHt2ALyt = 445 + INTEGER(IntKi), PARAMETER :: TwHt2ALzt = 446 + INTEGER(IntKi), PARAMETER :: TwHt3ALxt = 447 + INTEGER(IntKi), PARAMETER :: TwHt3ALyt = 448 + INTEGER(IntKi), PARAMETER :: TwHt3ALzt = 449 + INTEGER(IntKi), PARAMETER :: TwHt4ALxt = 450 + INTEGER(IntKi), PARAMETER :: TwHt4ALyt = 451 + INTEGER(IntKi), PARAMETER :: TwHt4ALzt = 452 + INTEGER(IntKi), PARAMETER :: TwHt5ALxt = 453 + INTEGER(IntKi), PARAMETER :: TwHt5ALyt = 454 + INTEGER(IntKi), PARAMETER :: TwHt5ALzt = 455 + INTEGER(IntKi), PARAMETER :: TwHt6ALxt = 456 + INTEGER(IntKi), PARAMETER :: TwHt6ALyt = 457 + INTEGER(IntKi), PARAMETER :: TwHt6ALzt = 458 + INTEGER(IntKi), PARAMETER :: TwHt7ALxt = 459 + INTEGER(IntKi), PARAMETER :: TwHt7ALyt = 460 + INTEGER(IntKi), PARAMETER :: TwHt7ALzt = 461 + INTEGER(IntKi), PARAMETER :: TwHt8ALxt = 462 + INTEGER(IntKi), PARAMETER :: TwHt8ALyt = 463 + INTEGER(IntKi), PARAMETER :: TwHt8ALzt = 464 + INTEGER(IntKi), PARAMETER :: TwHt9ALxt = 465 + INTEGER(IntKi), PARAMETER :: TwHt9ALyt = 466 + INTEGER(IntKi), PARAMETER :: TwHt9ALzt = 467 + INTEGER(IntKi), PARAMETER :: TwHt1ALgxt = 468 + INTEGER(IntKi), PARAMETER :: TwHt1ALgyt = 469 + INTEGER(IntKi), PARAMETER :: TwHt1ALgzt = 470 + INTEGER(IntKi), PARAMETER :: TwHt2ALgxt = 471 + INTEGER(IntKi), PARAMETER :: TwHt2ALgyt = 472 + INTEGER(IntKi), PARAMETER :: TwHt2ALgzt = 473 + INTEGER(IntKi), PARAMETER :: TwHt3ALgxt = 474 + INTEGER(IntKi), PARAMETER :: TwHt3ALgyt = 475 + INTEGER(IntKi), PARAMETER :: TwHt3ALgzt = 476 + INTEGER(IntKi), PARAMETER :: TwHt4ALgxt = 477 + INTEGER(IntKi), PARAMETER :: TwHt4ALgyt = 478 + INTEGER(IntKi), PARAMETER :: TwHt4ALgzt = 479 + INTEGER(IntKi), PARAMETER :: TwHt5ALgxt = 480 + INTEGER(IntKi), PARAMETER :: TwHt5ALgyt = 481 + INTEGER(IntKi), PARAMETER :: TwHt5ALgzt = 482 + INTEGER(IntKi), PARAMETER :: TwHt6ALgxt = 483 + INTEGER(IntKi), PARAMETER :: TwHt6ALgyt = 484 + INTEGER(IntKi), PARAMETER :: TwHt6ALgzt = 485 + INTEGER(IntKi), PARAMETER :: TwHt7ALgxt = 486 + INTEGER(IntKi), PARAMETER :: TwHt7ALgyt = 487 + INTEGER(IntKi), PARAMETER :: TwHt7ALgzt = 488 + INTEGER(IntKi), PARAMETER :: TwHt8ALgxt = 489 + INTEGER(IntKi), PARAMETER :: TwHt8ALgyt = 490 + INTEGER(IntKi), PARAMETER :: TwHt8ALgzt = 491 + INTEGER(IntKi), PARAMETER :: TwHt9ALgxt = 492 + INTEGER(IntKi), PARAMETER :: TwHt9ALgyt = 493 + INTEGER(IntKi), PARAMETER :: TwHt9ALgzt = 494 + INTEGER(IntKi), PARAMETER :: TwHt1TDxt = 495 + INTEGER(IntKi), PARAMETER :: TwHt1TDyt = 496 + INTEGER(IntKi), PARAMETER :: TwHt1TDzt = 497 + INTEGER(IntKi), PARAMETER :: TwHt2TDxt = 498 + INTEGER(IntKi), PARAMETER :: TwHt2TDyt = 499 + INTEGER(IntKi), PARAMETER :: TwHt2TDzt = 500 + INTEGER(IntKi), PARAMETER :: TwHt3TDxt = 501 + INTEGER(IntKi), PARAMETER :: TwHt3TDyt = 502 + INTEGER(IntKi), PARAMETER :: TwHt3TDzt = 503 + INTEGER(IntKi), PARAMETER :: TwHt4TDxt = 504 + INTEGER(IntKi), PARAMETER :: TwHt4TDyt = 505 + INTEGER(IntKi), PARAMETER :: TwHt4TDzt = 506 + INTEGER(IntKi), PARAMETER :: TwHt5TDxt = 507 + INTEGER(IntKi), PARAMETER :: TwHt5TDyt = 508 + INTEGER(IntKi), PARAMETER :: TwHt5TDzt = 509 + INTEGER(IntKi), PARAMETER :: TwHt6TDxt = 510 + INTEGER(IntKi), PARAMETER :: TwHt6TDyt = 511 + INTEGER(IntKi), PARAMETER :: TwHt6TDzt = 512 + INTEGER(IntKi), PARAMETER :: TwHt7TDxt = 513 + INTEGER(IntKi), PARAMETER :: TwHt7TDyt = 514 + INTEGER(IntKi), PARAMETER :: TwHt7TDzt = 515 + INTEGER(IntKi), PARAMETER :: TwHt8TDxt = 516 + INTEGER(IntKi), PARAMETER :: TwHt8TDyt = 517 + INTEGER(IntKi), PARAMETER :: TwHt8TDzt = 518 + INTEGER(IntKi), PARAMETER :: TwHt9TDxt = 519 + INTEGER(IntKi), PARAMETER :: TwHt9TDyt = 520 + INTEGER(IntKi), PARAMETER :: TwHt9TDzt = 521 + INTEGER(IntKi), PARAMETER :: TwHt1RDxt = 522 + INTEGER(IntKi), PARAMETER :: TwHt1RDyt = 523 + INTEGER(IntKi), PARAMETER :: TwHt1RDzt = 524 + INTEGER(IntKi), PARAMETER :: TwHt2RDxt = 525 + INTEGER(IntKi), PARAMETER :: TwHt2RDyt = 526 + INTEGER(IntKi), PARAMETER :: TwHt2RDzt = 527 + INTEGER(IntKi), PARAMETER :: TwHt3RDxt = 528 + INTEGER(IntKi), PARAMETER :: TwHt3RDyt = 529 + INTEGER(IntKi), PARAMETER :: TwHt3RDzt = 530 + INTEGER(IntKi), PARAMETER :: TwHt4RDxt = 531 + INTEGER(IntKi), PARAMETER :: TwHt4RDyt = 532 + INTEGER(IntKi), PARAMETER :: TwHt4RDzt = 533 + INTEGER(IntKi), PARAMETER :: TwHt5RDxt = 534 + INTEGER(IntKi), PARAMETER :: TwHt5RDyt = 535 + INTEGER(IntKi), PARAMETER :: TwHt5RDzt = 536 + INTEGER(IntKi), PARAMETER :: TwHt6RDxt = 537 + INTEGER(IntKi), PARAMETER :: TwHt6RDyt = 538 + INTEGER(IntKi), PARAMETER :: TwHt6RDzt = 539 + INTEGER(IntKi), PARAMETER :: TwHt7RDxt = 540 + INTEGER(IntKi), PARAMETER :: TwHt7RDyt = 541 + INTEGER(IntKi), PARAMETER :: TwHt7RDzt = 542 + INTEGER(IntKi), PARAMETER :: TwHt8RDxt = 543 + INTEGER(IntKi), PARAMETER :: TwHt8RDyt = 544 + INTEGER(IntKi), PARAMETER :: TwHt8RDzt = 545 + INTEGER(IntKi), PARAMETER :: TwHt9RDxt = 546 + INTEGER(IntKi), PARAMETER :: TwHt9RDyt = 547 + INTEGER(IntKi), PARAMETER :: TwHt9RDzt = 548 + INTEGER(IntKi), PARAMETER :: TwHt1TPxi = 549 + INTEGER(IntKi), PARAMETER :: TwHt1TPyi = 550 + INTEGER(IntKi), PARAMETER :: TwHt1TPzi = 551 + INTEGER(IntKi), PARAMETER :: TwHt2TPxi = 552 + INTEGER(IntKi), PARAMETER :: TwHt2TPyi = 553 + INTEGER(IntKi), PARAMETER :: TwHt2TPzi = 554 + INTEGER(IntKi), PARAMETER :: TwHt3TPxi = 555 + INTEGER(IntKi), PARAMETER :: TwHt3TPyi = 556 + INTEGER(IntKi), PARAMETER :: TwHt3TPzi = 557 + INTEGER(IntKi), PARAMETER :: TwHt4TPxi = 558 + INTEGER(IntKi), PARAMETER :: TwHt4TPyi = 559 + INTEGER(IntKi), PARAMETER :: TwHt4TPzi = 560 + INTEGER(IntKi), PARAMETER :: TwHt5TPxi = 561 + INTEGER(IntKi), PARAMETER :: TwHt5TPyi = 562 + INTEGER(IntKi), PARAMETER :: TwHt5TPzi = 563 + INTEGER(IntKi), PARAMETER :: TwHt6TPxi = 564 + INTEGER(IntKi), PARAMETER :: TwHt6TPyi = 565 + INTEGER(IntKi), PARAMETER :: TwHt6TPzi = 566 + INTEGER(IntKi), PARAMETER :: TwHt7TPxi = 567 + INTEGER(IntKi), PARAMETER :: TwHt7TPyi = 568 + INTEGER(IntKi), PARAMETER :: TwHt7TPzi = 569 + INTEGER(IntKi), PARAMETER :: TwHt8TPxi = 570 + INTEGER(IntKi), PARAMETER :: TwHt8TPyi = 571 + INTEGER(IntKi), PARAMETER :: TwHt8TPzi = 572 + INTEGER(IntKi), PARAMETER :: TwHt9TPxi = 573 + INTEGER(IntKi), PARAMETER :: TwHt9TPyi = 574 + INTEGER(IntKi), PARAMETER :: TwHt9TPzi = 575 + INTEGER(IntKi), PARAMETER :: TwHt1RPxi = 576 + INTEGER(IntKi), PARAMETER :: TwHt1RPyi = 577 + INTEGER(IntKi), PARAMETER :: TwHt1RPzi = 578 + INTEGER(IntKi), PARAMETER :: TwHt2RPxi = 579 + INTEGER(IntKi), PARAMETER :: TwHt2RPyi = 580 + INTEGER(IntKi), PARAMETER :: TwHt2RPzi = 581 + INTEGER(IntKi), PARAMETER :: TwHt3RPxi = 582 + INTEGER(IntKi), PARAMETER :: TwHt3RPyi = 583 + INTEGER(IntKi), PARAMETER :: TwHt3RPzi = 584 + INTEGER(IntKi), PARAMETER :: TwHt4RPxi = 585 + INTEGER(IntKi), PARAMETER :: TwHt4RPyi = 586 + INTEGER(IntKi), PARAMETER :: TwHt4RPzi = 587 + INTEGER(IntKi), PARAMETER :: TwHt5RPxi = 588 + INTEGER(IntKi), PARAMETER :: TwHt5RPyi = 589 + INTEGER(IntKi), PARAMETER :: TwHt5RPzi = 590 + INTEGER(IntKi), PARAMETER :: TwHt6RPxi = 591 + INTEGER(IntKi), PARAMETER :: TwHt6RPyi = 592 + INTEGER(IntKi), PARAMETER :: TwHt6RPzi = 593 + INTEGER(IntKi), PARAMETER :: TwHt7RPxi = 594 + INTEGER(IntKi), PARAMETER :: TwHt7RPyi = 595 + INTEGER(IntKi), PARAMETER :: TwHt7RPzi = 596 + INTEGER(IntKi), PARAMETER :: TwHt8RPxi = 597 + INTEGER(IntKi), PARAMETER :: TwHt8RPyi = 598 + INTEGER(IntKi), PARAMETER :: TwHt8RPzi = 599 + INTEGER(IntKi), PARAMETER :: TwHt9RPxi = 600 + INTEGER(IntKi), PARAMETER :: TwHt9RPyi = 601 + INTEGER(IntKi), PARAMETER :: TwHt9RPzi = 602 ! Platform Motions: - INTEGER(IntKi), PARAMETER :: PtfmTDxt = 597 - INTEGER(IntKi), PARAMETER :: PtfmTDyt = 598 - INTEGER(IntKi), PARAMETER :: PtfmTDzt = 599 - INTEGER(IntKi), PARAMETER :: PtfmTDxi = 600 - INTEGER(IntKi), PARAMETER :: PtfmTDyi = 601 - INTEGER(IntKi), PARAMETER :: PtfmTDzi = 602 - INTEGER(IntKi), PARAMETER :: PtfmTVxt = 603 - INTEGER(IntKi), PARAMETER :: PtfmTVyt = 604 - INTEGER(IntKi), PARAMETER :: PtfmTVzt = 605 - INTEGER(IntKi), PARAMETER :: PtfmTVxi = 606 - INTEGER(IntKi), PARAMETER :: PtfmTVyi = 607 - INTEGER(IntKi), PARAMETER :: PtfmTVzi = 608 - INTEGER(IntKi), PARAMETER :: PtfmTAxt = 609 - INTEGER(IntKi), PARAMETER :: PtfmTAyt = 610 - INTEGER(IntKi), PARAMETER :: PtfmTAzt = 611 - INTEGER(IntKi), PARAMETER :: PtfmTAgxt = 612 - INTEGER(IntKi), PARAMETER :: PtfmTAgyt = 613 - INTEGER(IntKi), PARAMETER :: PtfmTAgzt = 614 - INTEGER(IntKi), PARAMETER :: PtfmTAxi = 615 - INTEGER(IntKi), PARAMETER :: PtfmTAyi = 616 - INTEGER(IntKi), PARAMETER :: PtfmTAzi = 617 - INTEGER(IntKi), PARAMETER :: PtfmTAgxi = 618 - INTEGER(IntKi), PARAMETER :: PtfmTAgyi = 619 - INTEGER(IntKi), PARAMETER :: PtfmTAgzi = 620 - INTEGER(IntKi), PARAMETER :: PtfmRDxi = 621 - INTEGER(IntKi), PARAMETER :: PtfmRDyi = 622 - INTEGER(IntKi), PARAMETER :: PtfmRDzi = 623 - INTEGER(IntKi), PARAMETER :: PtfmRVxt = 624 - INTEGER(IntKi), PARAMETER :: PtfmRVyt = 625 - INTEGER(IntKi), PARAMETER :: PtfmRVzt = 626 - INTEGER(IntKi), PARAMETER :: PtfmRVxi = 627 - INTEGER(IntKi), PARAMETER :: PtfmRVyi = 628 - INTEGER(IntKi), PARAMETER :: PtfmRVzi = 629 - INTEGER(IntKi), PARAMETER :: PtfmRAxt = 630 - INTEGER(IntKi), PARAMETER :: PtfmRAyt = 631 - INTEGER(IntKi), PARAMETER :: PtfmRAzt = 632 - INTEGER(IntKi), PARAMETER :: PtfmRAxi = 633 - INTEGER(IntKi), PARAMETER :: PtfmRAyi = 634 - INTEGER(IntKi), PARAMETER :: PtfmRAzi = 635 + INTEGER(IntKi), PARAMETER :: PtfmTDxt = 603 + INTEGER(IntKi), PARAMETER :: PtfmTDyt = 604 + INTEGER(IntKi), PARAMETER :: PtfmTDzt = 605 + INTEGER(IntKi), PARAMETER :: PtfmTDxi = 606 + INTEGER(IntKi), PARAMETER :: PtfmTDyi = 607 + INTEGER(IntKi), PARAMETER :: PtfmTDzi = 608 + INTEGER(IntKi), PARAMETER :: PtfmTVxt = 609 + INTEGER(IntKi), PARAMETER :: PtfmTVyt = 610 + INTEGER(IntKi), PARAMETER :: PtfmTVzt = 611 + INTEGER(IntKi), PARAMETER :: PtfmTVxi = 612 + INTEGER(IntKi), PARAMETER :: PtfmTVyi = 613 + INTEGER(IntKi), PARAMETER :: PtfmTVzi = 614 + INTEGER(IntKi), PARAMETER :: PtfmTAxt = 615 + INTEGER(IntKi), PARAMETER :: PtfmTAyt = 616 + INTEGER(IntKi), PARAMETER :: PtfmTAzt = 617 + INTEGER(IntKi), PARAMETER :: PtfmTAgxt = 618 + INTEGER(IntKi), PARAMETER :: PtfmTAgyt = 619 + INTEGER(IntKi), PARAMETER :: PtfmTAgzt = 620 + INTEGER(IntKi), PARAMETER :: PtfmTAxi = 621 + INTEGER(IntKi), PARAMETER :: PtfmTAyi = 622 + INTEGER(IntKi), PARAMETER :: PtfmTAzi = 623 + INTEGER(IntKi), PARAMETER :: PtfmTAgxi = 624 + INTEGER(IntKi), PARAMETER :: PtfmTAgyi = 625 + INTEGER(IntKi), PARAMETER :: PtfmTAgzi = 626 + INTEGER(IntKi), PARAMETER :: PtfmRDxi = 627 + INTEGER(IntKi), PARAMETER :: PtfmRDyi = 628 + INTEGER(IntKi), PARAMETER :: PtfmRDzi = 629 + INTEGER(IntKi), PARAMETER :: PtfmRVxt = 630 + INTEGER(IntKi), PARAMETER :: PtfmRVyt = 631 + INTEGER(IntKi), PARAMETER :: PtfmRVzt = 632 + INTEGER(IntKi), PARAMETER :: PtfmRVxi = 633 + INTEGER(IntKi), PARAMETER :: PtfmRVyi = 634 + INTEGER(IntKi), PARAMETER :: PtfmRVzi = 635 + INTEGER(IntKi), PARAMETER :: PtfmRAxt = 636 + INTEGER(IntKi), PARAMETER :: PtfmRAyt = 637 + INTEGER(IntKi), PARAMETER :: PtfmRAzt = 638 + INTEGER(IntKi), PARAMETER :: PtfmRAxi = 639 + INTEGER(IntKi), PARAMETER :: PtfmRAyi = 640 + INTEGER(IntKi), PARAMETER :: PtfmRAzi = 641 ! Blade 1 Root Loads: - INTEGER(IntKi), PARAMETER :: RootFxc1 = 636 - INTEGER(IntKi), PARAMETER :: RootFyc1 = 637 - INTEGER(IntKi), PARAMETER :: RootFzc1 = 638 - INTEGER(IntKi), PARAMETER :: RootFxb1 = 639 - INTEGER(IntKi), PARAMETER :: RootFyb1 = 640 - INTEGER(IntKi), PARAMETER :: RootMxc1 = 641 - INTEGER(IntKi), PARAMETER :: RootMyc1 = 642 - INTEGER(IntKi), PARAMETER :: RootMzc1 = 643 - INTEGER(IntKi), PARAMETER :: RootMxb1 = 644 - INTEGER(IntKi), PARAMETER :: RootMyb1 = 645 + INTEGER(IntKi), PARAMETER :: RootFxc1 = 642 + INTEGER(IntKi), PARAMETER :: RootFyc1 = 643 + INTEGER(IntKi), PARAMETER :: RootFzc1 = 644 + INTEGER(IntKi), PARAMETER :: RootFxb1 = 645 + INTEGER(IntKi), PARAMETER :: RootFyb1 = 646 + INTEGER(IntKi), PARAMETER :: RootMxc1 = 647 + INTEGER(IntKi), PARAMETER :: RootMyc1 = 648 + INTEGER(IntKi), PARAMETER :: RootMzc1 = 649 + INTEGER(IntKi), PARAMETER :: RootMxb1 = 650 + INTEGER(IntKi), PARAMETER :: RootMyb1 = 651 ! Blade 2 Root Loads: - INTEGER(IntKi), PARAMETER :: RootFxc2 = 646 - INTEGER(IntKi), PARAMETER :: RootFyc2 = 647 - INTEGER(IntKi), PARAMETER :: RootFzc2 = 648 - INTEGER(IntKi), PARAMETER :: RootFxb2 = 649 - INTEGER(IntKi), PARAMETER :: RootFyb2 = 650 - INTEGER(IntKi), PARAMETER :: RootMxc2 = 651 - INTEGER(IntKi), PARAMETER :: RootMyc2 = 652 - INTEGER(IntKi), PARAMETER :: RootMzc2 = 653 - INTEGER(IntKi), PARAMETER :: RootMxb2 = 654 - INTEGER(IntKi), PARAMETER :: RootMyb2 = 655 + INTEGER(IntKi), PARAMETER :: RootFxc2 = 652 + INTEGER(IntKi), PARAMETER :: RootFyc2 = 653 + INTEGER(IntKi), PARAMETER :: RootFzc2 = 654 + INTEGER(IntKi), PARAMETER :: RootFxb2 = 655 + INTEGER(IntKi), PARAMETER :: RootFyb2 = 656 + INTEGER(IntKi), PARAMETER :: RootMxc2 = 657 + INTEGER(IntKi), PARAMETER :: RootMyc2 = 658 + INTEGER(IntKi), PARAMETER :: RootMzc2 = 659 + INTEGER(IntKi), PARAMETER :: RootMxb2 = 660 + INTEGER(IntKi), PARAMETER :: RootMyb2 = 661 ! Blade 3 Root Loads: - INTEGER(IntKi), PARAMETER :: RootFxc3 = 656 - INTEGER(IntKi), PARAMETER :: RootFyc3 = 657 - INTEGER(IntKi), PARAMETER :: RootFzc3 = 658 - INTEGER(IntKi), PARAMETER :: RootFxb3 = 659 - INTEGER(IntKi), PARAMETER :: RootFyb3 = 660 - INTEGER(IntKi), PARAMETER :: RootMxc3 = 661 - INTEGER(IntKi), PARAMETER :: RootMyc3 = 662 - INTEGER(IntKi), PARAMETER :: RootMzc3 = 663 - INTEGER(IntKi), PARAMETER :: RootMxb3 = 664 - INTEGER(IntKi), PARAMETER :: RootMyb3 = 665 + INTEGER(IntKi), PARAMETER :: RootFxc3 = 662 + INTEGER(IntKi), PARAMETER :: RootFyc3 = 663 + INTEGER(IntKi), PARAMETER :: RootFzc3 = 664 + INTEGER(IntKi), PARAMETER :: RootFxb3 = 665 + INTEGER(IntKi), PARAMETER :: RootFyb3 = 666 + INTEGER(IntKi), PARAMETER :: RootMxc3 = 667 + INTEGER(IntKi), PARAMETER :: RootMyc3 = 668 + INTEGER(IntKi), PARAMETER :: RootMzc3 = 669 + INTEGER(IntKi), PARAMETER :: RootMxb3 = 670 + INTEGER(IntKi), PARAMETER :: RootMyb3 = 671 ! Blade 1 Local Span Loads: - INTEGER(IntKi), PARAMETER :: Spn1MLxb1 = 666 - INTEGER(IntKi), PARAMETER :: Spn1MLyb1 = 667 - INTEGER(IntKi), PARAMETER :: Spn1MLzb1 = 668 - INTEGER(IntKi), PARAMETER :: Spn2MLxb1 = 669 - INTEGER(IntKi), PARAMETER :: Spn2MLyb1 = 670 - INTEGER(IntKi), PARAMETER :: Spn2MLzb1 = 671 - INTEGER(IntKi), PARAMETER :: Spn3MLxb1 = 672 - INTEGER(IntKi), PARAMETER :: Spn3MLyb1 = 673 - INTEGER(IntKi), PARAMETER :: Spn3MLzb1 = 674 - INTEGER(IntKi), PARAMETER :: Spn4MLxb1 = 675 - INTEGER(IntKi), PARAMETER :: Spn4MLyb1 = 676 - INTEGER(IntKi), PARAMETER :: Spn4MLzb1 = 677 - INTEGER(IntKi), PARAMETER :: Spn5MLxb1 = 678 - INTEGER(IntKi), PARAMETER :: Spn5MLyb1 = 679 - INTEGER(IntKi), PARAMETER :: Spn5MLzb1 = 680 - INTEGER(IntKi), PARAMETER :: Spn6MLxb1 = 681 - INTEGER(IntKi), PARAMETER :: Spn6MLyb1 = 682 - INTEGER(IntKi), PARAMETER :: Spn6MLzb1 = 683 - INTEGER(IntKi), PARAMETER :: Spn7MLxb1 = 684 - INTEGER(IntKi), PARAMETER :: Spn7MLyb1 = 685 - INTEGER(IntKi), PARAMETER :: Spn7MLzb1 = 686 - INTEGER(IntKi), PARAMETER :: Spn8MLxb1 = 687 - INTEGER(IntKi), PARAMETER :: Spn8MLyb1 = 688 - INTEGER(IntKi), PARAMETER :: Spn8MLzb1 = 689 - INTEGER(IntKi), PARAMETER :: Spn9MLxb1 = 690 - INTEGER(IntKi), PARAMETER :: Spn9MLyb1 = 691 - INTEGER(IntKi), PARAMETER :: Spn9MLzb1 = 692 - INTEGER(IntKi), PARAMETER :: Spn1FLxb1 = 693 - INTEGER(IntKi), PARAMETER :: Spn1FLyb1 = 694 - INTEGER(IntKi), PARAMETER :: Spn1FLzb1 = 695 - INTEGER(IntKi), PARAMETER :: Spn2FLxb1 = 696 - INTEGER(IntKi), PARAMETER :: Spn2FLyb1 = 697 - INTEGER(IntKi), PARAMETER :: Spn2FLzb1 = 698 - INTEGER(IntKi), PARAMETER :: Spn3FLxb1 = 699 - INTEGER(IntKi), PARAMETER :: Spn3FLyb1 = 700 - INTEGER(IntKi), PARAMETER :: Spn3FLzb1 = 701 - INTEGER(IntKi), PARAMETER :: Spn4FLxb1 = 702 - INTEGER(IntKi), PARAMETER :: Spn4FLyb1 = 703 - INTEGER(IntKi), PARAMETER :: Spn4FLzb1 = 704 - INTEGER(IntKi), PARAMETER :: Spn5FLxb1 = 705 - INTEGER(IntKi), PARAMETER :: Spn5FLyb1 = 706 - INTEGER(IntKi), PARAMETER :: Spn5FLzb1 = 707 - INTEGER(IntKi), PARAMETER :: Spn6FLxb1 = 708 - INTEGER(IntKi), PARAMETER :: Spn6FLyb1 = 709 - INTEGER(IntKi), PARAMETER :: Spn6FLzb1 = 710 - INTEGER(IntKi), PARAMETER :: Spn7FLxb1 = 711 - INTEGER(IntKi), PARAMETER :: Spn7FLyb1 = 712 - INTEGER(IntKi), PARAMETER :: Spn7FLzb1 = 713 - INTEGER(IntKi), PARAMETER :: Spn8FLxb1 = 714 - INTEGER(IntKi), PARAMETER :: Spn8FLyb1 = 715 - INTEGER(IntKi), PARAMETER :: Spn8FLzb1 = 716 - INTEGER(IntKi), PARAMETER :: Spn9FLxb1 = 717 - INTEGER(IntKi), PARAMETER :: Spn9FLyb1 = 718 - INTEGER(IntKi), PARAMETER :: Spn9FLzb1 = 719 + INTEGER(IntKi), PARAMETER :: Spn1MLxb1 = 672 + INTEGER(IntKi), PARAMETER :: Spn1MLyb1 = 673 + INTEGER(IntKi), PARAMETER :: Spn1MLzb1 = 674 + INTEGER(IntKi), PARAMETER :: Spn2MLxb1 = 675 + INTEGER(IntKi), PARAMETER :: Spn2MLyb1 = 676 + INTEGER(IntKi), PARAMETER :: Spn2MLzb1 = 677 + INTEGER(IntKi), PARAMETER :: Spn3MLxb1 = 678 + INTEGER(IntKi), PARAMETER :: Spn3MLyb1 = 679 + INTEGER(IntKi), PARAMETER :: Spn3MLzb1 = 680 + INTEGER(IntKi), PARAMETER :: Spn4MLxb1 = 681 + INTEGER(IntKi), PARAMETER :: Spn4MLyb1 = 682 + INTEGER(IntKi), PARAMETER :: Spn4MLzb1 = 683 + INTEGER(IntKi), PARAMETER :: Spn5MLxb1 = 684 + INTEGER(IntKi), PARAMETER :: Spn5MLyb1 = 685 + INTEGER(IntKi), PARAMETER :: Spn5MLzb1 = 686 + INTEGER(IntKi), PARAMETER :: Spn6MLxb1 = 687 + INTEGER(IntKi), PARAMETER :: Spn6MLyb1 = 688 + INTEGER(IntKi), PARAMETER :: Spn6MLzb1 = 689 + INTEGER(IntKi), PARAMETER :: Spn7MLxb1 = 690 + INTEGER(IntKi), PARAMETER :: Spn7MLyb1 = 691 + INTEGER(IntKi), PARAMETER :: Spn7MLzb1 = 692 + INTEGER(IntKi), PARAMETER :: Spn8MLxb1 = 693 + INTEGER(IntKi), PARAMETER :: Spn8MLyb1 = 694 + INTEGER(IntKi), PARAMETER :: Spn8MLzb1 = 695 + INTEGER(IntKi), PARAMETER :: Spn9MLxb1 = 696 + INTEGER(IntKi), PARAMETER :: Spn9MLyb1 = 697 + INTEGER(IntKi), PARAMETER :: Spn9MLzb1 = 698 + INTEGER(IntKi), PARAMETER :: Spn1FLxb1 = 699 + INTEGER(IntKi), PARAMETER :: Spn1FLyb1 = 700 + INTEGER(IntKi), PARAMETER :: Spn1FLzb1 = 701 + INTEGER(IntKi), PARAMETER :: Spn2FLxb1 = 702 + INTEGER(IntKi), PARAMETER :: Spn2FLyb1 = 703 + INTEGER(IntKi), PARAMETER :: Spn2FLzb1 = 704 + INTEGER(IntKi), PARAMETER :: Spn3FLxb1 = 705 + INTEGER(IntKi), PARAMETER :: Spn3FLyb1 = 706 + INTEGER(IntKi), PARAMETER :: Spn3FLzb1 = 707 + INTEGER(IntKi), PARAMETER :: Spn4FLxb1 = 708 + INTEGER(IntKi), PARAMETER :: Spn4FLyb1 = 709 + INTEGER(IntKi), PARAMETER :: Spn4FLzb1 = 710 + INTEGER(IntKi), PARAMETER :: Spn5FLxb1 = 711 + INTEGER(IntKi), PARAMETER :: Spn5FLyb1 = 712 + INTEGER(IntKi), PARAMETER :: Spn5FLzb1 = 713 + INTEGER(IntKi), PARAMETER :: Spn6FLxb1 = 714 + INTEGER(IntKi), PARAMETER :: Spn6FLyb1 = 715 + INTEGER(IntKi), PARAMETER :: Spn6FLzb1 = 716 + INTEGER(IntKi), PARAMETER :: Spn7FLxb1 = 717 + INTEGER(IntKi), PARAMETER :: Spn7FLyb1 = 718 + INTEGER(IntKi), PARAMETER :: Spn7FLzb1 = 719 + INTEGER(IntKi), PARAMETER :: Spn8FLxb1 = 720 + INTEGER(IntKi), PARAMETER :: Spn8FLyb1 = 721 + INTEGER(IntKi), PARAMETER :: Spn8FLzb1 = 722 + INTEGER(IntKi), PARAMETER :: Spn9FLxb1 = 723 + INTEGER(IntKi), PARAMETER :: Spn9FLyb1 = 724 + INTEGER(IntKi), PARAMETER :: Spn9FLzb1 = 725 ! Blade 2 Local Span Loads: - INTEGER(IntKi), PARAMETER :: Spn1MLxb2 = 720 - INTEGER(IntKi), PARAMETER :: Spn1MLyb2 = 721 - INTEGER(IntKi), PARAMETER :: Spn1MLzb2 = 722 - INTEGER(IntKi), PARAMETER :: Spn2MLxb2 = 723 - INTEGER(IntKi), PARAMETER :: Spn2MLyb2 = 724 - INTEGER(IntKi), PARAMETER :: Spn2MLzb2 = 725 - INTEGER(IntKi), PARAMETER :: Spn3MLxb2 = 726 - INTEGER(IntKi), PARAMETER :: Spn3MLyb2 = 727 - INTEGER(IntKi), PARAMETER :: Spn3MLzb2 = 728 - INTEGER(IntKi), PARAMETER :: Spn4MLxb2 = 729 - INTEGER(IntKi), PARAMETER :: Spn4MLyb2 = 730 - INTEGER(IntKi), PARAMETER :: Spn4MLzb2 = 731 - INTEGER(IntKi), PARAMETER :: Spn5MLxb2 = 732 - INTEGER(IntKi), PARAMETER :: Spn5MLyb2 = 733 - INTEGER(IntKi), PARAMETER :: Spn5MLzb2 = 734 - INTEGER(IntKi), PARAMETER :: Spn6MLxb2 = 735 - INTEGER(IntKi), PARAMETER :: Spn6MLyb2 = 736 - INTEGER(IntKi), PARAMETER :: Spn6MLzb2 = 737 - INTEGER(IntKi), PARAMETER :: Spn7MLxb2 = 738 - INTEGER(IntKi), PARAMETER :: Spn7MLyb2 = 739 - INTEGER(IntKi), PARAMETER :: Spn7MLzb2 = 740 - INTEGER(IntKi), PARAMETER :: Spn8MLxb2 = 741 - INTEGER(IntKi), PARAMETER :: Spn8MLyb2 = 742 - INTEGER(IntKi), PARAMETER :: Spn8MLzb2 = 743 - INTEGER(IntKi), PARAMETER :: Spn9MLxb2 = 744 - INTEGER(IntKi), PARAMETER :: Spn9MLyb2 = 745 - INTEGER(IntKi), PARAMETER :: Spn9MLzb2 = 746 - INTEGER(IntKi), PARAMETER :: Spn1FLxb2 = 747 - INTEGER(IntKi), PARAMETER :: Spn1FLyb2 = 748 - INTEGER(IntKi), PARAMETER :: Spn1FLzb2 = 749 - INTEGER(IntKi), PARAMETER :: Spn2FLxb2 = 750 - INTEGER(IntKi), PARAMETER :: Spn2FLyb2 = 751 - INTEGER(IntKi), PARAMETER :: Spn2FLzb2 = 752 - INTEGER(IntKi), PARAMETER :: Spn3FLxb2 = 753 - INTEGER(IntKi), PARAMETER :: Spn3FLyb2 = 754 - INTEGER(IntKi), PARAMETER :: Spn3FLzb2 = 755 - INTEGER(IntKi), PARAMETER :: Spn4FLxb2 = 756 - INTEGER(IntKi), PARAMETER :: Spn4FLyb2 = 757 - INTEGER(IntKi), PARAMETER :: Spn4FLzb2 = 758 - INTEGER(IntKi), PARAMETER :: Spn5FLxb2 = 759 - INTEGER(IntKi), PARAMETER :: Spn5FLyb2 = 760 - INTEGER(IntKi), PARAMETER :: Spn5FLzb2 = 761 - INTEGER(IntKi), PARAMETER :: Spn6FLxb2 = 762 - INTEGER(IntKi), PARAMETER :: Spn6FLyb2 = 763 - INTEGER(IntKi), PARAMETER :: Spn6FLzb2 = 764 - INTEGER(IntKi), PARAMETER :: Spn7FLxb2 = 765 - INTEGER(IntKi), PARAMETER :: Spn7FLyb2 = 766 - INTEGER(IntKi), PARAMETER :: Spn7FLzb2 = 767 - INTEGER(IntKi), PARAMETER :: Spn8FLxb2 = 768 - INTEGER(IntKi), PARAMETER :: Spn8FLyb2 = 769 - INTEGER(IntKi), PARAMETER :: Spn8FLzb2 = 770 - INTEGER(IntKi), PARAMETER :: Spn9FLxb2 = 771 - INTEGER(IntKi), PARAMETER :: Spn9FLyb2 = 772 - INTEGER(IntKi), PARAMETER :: Spn9FLzb2 = 773 + INTEGER(IntKi), PARAMETER :: Spn1MLxb2 = 726 + INTEGER(IntKi), PARAMETER :: Spn1MLyb2 = 727 + INTEGER(IntKi), PARAMETER :: Spn1MLzb2 = 728 + INTEGER(IntKi), PARAMETER :: Spn2MLxb2 = 729 + INTEGER(IntKi), PARAMETER :: Spn2MLyb2 = 730 + INTEGER(IntKi), PARAMETER :: Spn2MLzb2 = 731 + INTEGER(IntKi), PARAMETER :: Spn3MLxb2 = 732 + INTEGER(IntKi), PARAMETER :: Spn3MLyb2 = 733 + INTEGER(IntKi), PARAMETER :: Spn3MLzb2 = 734 + INTEGER(IntKi), PARAMETER :: Spn4MLxb2 = 735 + INTEGER(IntKi), PARAMETER :: Spn4MLyb2 = 736 + INTEGER(IntKi), PARAMETER :: Spn4MLzb2 = 737 + INTEGER(IntKi), PARAMETER :: Spn5MLxb2 = 738 + INTEGER(IntKi), PARAMETER :: Spn5MLyb2 = 739 + INTEGER(IntKi), PARAMETER :: Spn5MLzb2 = 740 + INTEGER(IntKi), PARAMETER :: Spn6MLxb2 = 741 + INTEGER(IntKi), PARAMETER :: Spn6MLyb2 = 742 + INTEGER(IntKi), PARAMETER :: Spn6MLzb2 = 743 + INTEGER(IntKi), PARAMETER :: Spn7MLxb2 = 744 + INTEGER(IntKi), PARAMETER :: Spn7MLyb2 = 745 + INTEGER(IntKi), PARAMETER :: Spn7MLzb2 = 746 + INTEGER(IntKi), PARAMETER :: Spn8MLxb2 = 747 + INTEGER(IntKi), PARAMETER :: Spn8MLyb2 = 748 + INTEGER(IntKi), PARAMETER :: Spn8MLzb2 = 749 + INTEGER(IntKi), PARAMETER :: Spn9MLxb2 = 750 + INTEGER(IntKi), PARAMETER :: Spn9MLyb2 = 751 + INTEGER(IntKi), PARAMETER :: Spn9MLzb2 = 752 + INTEGER(IntKi), PARAMETER :: Spn1FLxb2 = 753 + INTEGER(IntKi), PARAMETER :: Spn1FLyb2 = 754 + INTEGER(IntKi), PARAMETER :: Spn1FLzb2 = 755 + INTEGER(IntKi), PARAMETER :: Spn2FLxb2 = 756 + INTEGER(IntKi), PARAMETER :: Spn2FLyb2 = 757 + INTEGER(IntKi), PARAMETER :: Spn2FLzb2 = 758 + INTEGER(IntKi), PARAMETER :: Spn3FLxb2 = 759 + INTEGER(IntKi), PARAMETER :: Spn3FLyb2 = 760 + INTEGER(IntKi), PARAMETER :: Spn3FLzb2 = 761 + INTEGER(IntKi), PARAMETER :: Spn4FLxb2 = 762 + INTEGER(IntKi), PARAMETER :: Spn4FLyb2 = 763 + INTEGER(IntKi), PARAMETER :: Spn4FLzb2 = 764 + INTEGER(IntKi), PARAMETER :: Spn5FLxb2 = 765 + INTEGER(IntKi), PARAMETER :: Spn5FLyb2 = 766 + INTEGER(IntKi), PARAMETER :: Spn5FLzb2 = 767 + INTEGER(IntKi), PARAMETER :: Spn6FLxb2 = 768 + INTEGER(IntKi), PARAMETER :: Spn6FLyb2 = 769 + INTEGER(IntKi), PARAMETER :: Spn6FLzb2 = 770 + INTEGER(IntKi), PARAMETER :: Spn7FLxb2 = 771 + INTEGER(IntKi), PARAMETER :: Spn7FLyb2 = 772 + INTEGER(IntKi), PARAMETER :: Spn7FLzb2 = 773 + INTEGER(IntKi), PARAMETER :: Spn8FLxb2 = 774 + INTEGER(IntKi), PARAMETER :: Spn8FLyb2 = 775 + INTEGER(IntKi), PARAMETER :: Spn8FLzb2 = 776 + INTEGER(IntKi), PARAMETER :: Spn9FLxb2 = 777 + INTEGER(IntKi), PARAMETER :: Spn9FLyb2 = 778 + INTEGER(IntKi), PARAMETER :: Spn9FLzb2 = 779 ! Blade 3 Local Span Loads: - INTEGER(IntKi), PARAMETER :: Spn1MLxb3 = 774 - INTEGER(IntKi), PARAMETER :: Spn1MLyb3 = 775 - INTEGER(IntKi), PARAMETER :: Spn1MLzb3 = 776 - INTEGER(IntKi), PARAMETER :: Spn2MLxb3 = 777 - INTEGER(IntKi), PARAMETER :: Spn2MLyb3 = 778 - INTEGER(IntKi), PARAMETER :: Spn2MLzb3 = 779 - INTEGER(IntKi), PARAMETER :: Spn3MLxb3 = 780 - INTEGER(IntKi), PARAMETER :: Spn3MLyb3 = 781 - INTEGER(IntKi), PARAMETER :: Spn3MLzb3 = 782 - INTEGER(IntKi), PARAMETER :: Spn4MLxb3 = 783 - INTEGER(IntKi), PARAMETER :: Spn4MLyb3 = 784 - INTEGER(IntKi), PARAMETER :: Spn4MLzb3 = 785 - INTEGER(IntKi), PARAMETER :: Spn5MLxb3 = 786 - INTEGER(IntKi), PARAMETER :: Spn5MLyb3 = 787 - INTEGER(IntKi), PARAMETER :: Spn5MLzb3 = 788 - INTEGER(IntKi), PARAMETER :: Spn6MLxb3 = 789 - INTEGER(IntKi), PARAMETER :: Spn6MLyb3 = 790 - INTEGER(IntKi), PARAMETER :: Spn6MLzb3 = 791 - INTEGER(IntKi), PARAMETER :: Spn7MLxb3 = 792 - INTEGER(IntKi), PARAMETER :: Spn7MLyb3 = 793 - INTEGER(IntKi), PARAMETER :: Spn7MLzb3 = 794 - INTEGER(IntKi), PARAMETER :: Spn8MLxb3 = 795 - INTEGER(IntKi), PARAMETER :: Spn8MLyb3 = 796 - INTEGER(IntKi), PARAMETER :: Spn8MLzb3 = 797 - INTEGER(IntKi), PARAMETER :: Spn9MLxb3 = 798 - INTEGER(IntKi), PARAMETER :: Spn9MLyb3 = 799 - INTEGER(IntKi), PARAMETER :: Spn9MLzb3 = 800 - INTEGER(IntKi), PARAMETER :: Spn1FLxb3 = 801 - INTEGER(IntKi), PARAMETER :: Spn1FLyb3 = 802 - INTEGER(IntKi), PARAMETER :: Spn1FLzb3 = 803 - INTEGER(IntKi), PARAMETER :: Spn2FLxb3 = 804 - INTEGER(IntKi), PARAMETER :: Spn2FLyb3 = 805 - INTEGER(IntKi), PARAMETER :: Spn2FLzb3 = 806 - INTEGER(IntKi), PARAMETER :: Spn3FLxb3 = 807 - INTEGER(IntKi), PARAMETER :: Spn3FLyb3 = 808 - INTEGER(IntKi), PARAMETER :: Spn3FLzb3 = 809 - INTEGER(IntKi), PARAMETER :: Spn4FLxb3 = 810 - INTEGER(IntKi), PARAMETER :: Spn4FLyb3 = 811 - INTEGER(IntKi), PARAMETER :: Spn4FLzb3 = 812 - INTEGER(IntKi), PARAMETER :: Spn5FLxb3 = 813 - INTEGER(IntKi), PARAMETER :: Spn5FLyb3 = 814 - INTEGER(IntKi), PARAMETER :: Spn5FLzb3 = 815 - INTEGER(IntKi), PARAMETER :: Spn6FLxb3 = 816 - INTEGER(IntKi), PARAMETER :: Spn6FLyb3 = 817 - INTEGER(IntKi), PARAMETER :: Spn6FLzb3 = 818 - INTEGER(IntKi), PARAMETER :: Spn7FLxb3 = 819 - INTEGER(IntKi), PARAMETER :: Spn7FLyb3 = 820 - INTEGER(IntKi), PARAMETER :: Spn7FLzb3 = 821 - INTEGER(IntKi), PARAMETER :: Spn8FLxb3 = 822 - INTEGER(IntKi), PARAMETER :: Spn8FLyb3 = 823 - INTEGER(IntKi), PARAMETER :: Spn8FLzb3 = 824 - INTEGER(IntKi), PARAMETER :: Spn9FLxb3 = 825 - INTEGER(IntKi), PARAMETER :: Spn9FLyb3 = 826 - INTEGER(IntKi), PARAMETER :: Spn9FLzb3 = 827 + INTEGER(IntKi), PARAMETER :: Spn1MLxb3 = 780 + INTEGER(IntKi), PARAMETER :: Spn1MLyb3 = 781 + INTEGER(IntKi), PARAMETER :: Spn1MLzb3 = 782 + INTEGER(IntKi), PARAMETER :: Spn2MLxb3 = 783 + INTEGER(IntKi), PARAMETER :: Spn2MLyb3 = 784 + INTEGER(IntKi), PARAMETER :: Spn2MLzb3 = 785 + INTEGER(IntKi), PARAMETER :: Spn3MLxb3 = 786 + INTEGER(IntKi), PARAMETER :: Spn3MLyb3 = 787 + INTEGER(IntKi), PARAMETER :: Spn3MLzb3 = 788 + INTEGER(IntKi), PARAMETER :: Spn4MLxb3 = 789 + INTEGER(IntKi), PARAMETER :: Spn4MLyb3 = 790 + INTEGER(IntKi), PARAMETER :: Spn4MLzb3 = 791 + INTEGER(IntKi), PARAMETER :: Spn5MLxb3 = 792 + INTEGER(IntKi), PARAMETER :: Spn5MLyb3 = 793 + INTEGER(IntKi), PARAMETER :: Spn5MLzb3 = 794 + INTEGER(IntKi), PARAMETER :: Spn6MLxb3 = 795 + INTEGER(IntKi), PARAMETER :: Spn6MLyb3 = 796 + INTEGER(IntKi), PARAMETER :: Spn6MLzb3 = 797 + INTEGER(IntKi), PARAMETER :: Spn7MLxb3 = 798 + INTEGER(IntKi), PARAMETER :: Spn7MLyb3 = 799 + INTEGER(IntKi), PARAMETER :: Spn7MLzb3 = 800 + INTEGER(IntKi), PARAMETER :: Spn8MLxb3 = 801 + INTEGER(IntKi), PARAMETER :: Spn8MLyb3 = 802 + INTEGER(IntKi), PARAMETER :: Spn8MLzb3 = 803 + INTEGER(IntKi), PARAMETER :: Spn9MLxb3 = 804 + INTEGER(IntKi), PARAMETER :: Spn9MLyb3 = 805 + INTEGER(IntKi), PARAMETER :: Spn9MLzb3 = 806 + INTEGER(IntKi), PARAMETER :: Spn1FLxb3 = 807 + INTEGER(IntKi), PARAMETER :: Spn1FLyb3 = 808 + INTEGER(IntKi), PARAMETER :: Spn1FLzb3 = 809 + INTEGER(IntKi), PARAMETER :: Spn2FLxb3 = 810 + INTEGER(IntKi), PARAMETER :: Spn2FLyb3 = 811 + INTEGER(IntKi), PARAMETER :: Spn2FLzb3 = 812 + INTEGER(IntKi), PARAMETER :: Spn3FLxb3 = 813 + INTEGER(IntKi), PARAMETER :: Spn3FLyb3 = 814 + INTEGER(IntKi), PARAMETER :: Spn3FLzb3 = 815 + INTEGER(IntKi), PARAMETER :: Spn4FLxb3 = 816 + INTEGER(IntKi), PARAMETER :: Spn4FLyb3 = 817 + INTEGER(IntKi), PARAMETER :: Spn4FLzb3 = 818 + INTEGER(IntKi), PARAMETER :: Spn5FLxb3 = 819 + INTEGER(IntKi), PARAMETER :: Spn5FLyb3 = 820 + INTEGER(IntKi), PARAMETER :: Spn5FLzb3 = 821 + INTEGER(IntKi), PARAMETER :: Spn6FLxb3 = 822 + INTEGER(IntKi), PARAMETER :: Spn6FLyb3 = 823 + INTEGER(IntKi), PARAMETER :: Spn6FLzb3 = 824 + INTEGER(IntKi), PARAMETER :: Spn7FLxb3 = 825 + INTEGER(IntKi), PARAMETER :: Spn7FLyb3 = 826 + INTEGER(IntKi), PARAMETER :: Spn7FLzb3 = 827 + INTEGER(IntKi), PARAMETER :: Spn8FLxb3 = 828 + INTEGER(IntKi), PARAMETER :: Spn8FLyb3 = 829 + INTEGER(IntKi), PARAMETER :: Spn8FLzb3 = 830 + INTEGER(IntKi), PARAMETER :: Spn9FLxb3 = 831 + INTEGER(IntKi), PARAMETER :: Spn9FLyb3 = 832 + INTEGER(IntKi), PARAMETER :: Spn9FLzb3 = 833 ! Hub and Rotor Loads: - INTEGER(IntKi), PARAMETER :: LSShftFxa = 828 - INTEGER(IntKi), PARAMETER :: LSShftFya = 829 - INTEGER(IntKi), PARAMETER :: LSShftFza = 830 - INTEGER(IntKi), PARAMETER :: LSShftFys = 831 - INTEGER(IntKi), PARAMETER :: LSShftFzs = 832 - INTEGER(IntKi), PARAMETER :: LSShftMxa = 833 - INTEGER(IntKi), PARAMETER :: LSSTipMya = 834 - INTEGER(IntKi), PARAMETER :: LSSTipMza = 835 - INTEGER(IntKi), PARAMETER :: LSSTipMys = 836 - INTEGER(IntKi), PARAMETER :: LSSTipMzs = 837 - INTEGER(IntKi), PARAMETER :: RotPwr = 838 + INTEGER(IntKi), PARAMETER :: LSShftFxa = 834 + INTEGER(IntKi), PARAMETER :: LSShftFya = 835 + INTEGER(IntKi), PARAMETER :: LSShftFza = 836 + INTEGER(IntKi), PARAMETER :: LSShftFys = 837 + INTEGER(IntKi), PARAMETER :: LSShftFzs = 838 + INTEGER(IntKi), PARAMETER :: LSShftMxa = 839 + INTEGER(IntKi), PARAMETER :: LSSTipMya = 840 + INTEGER(IntKi), PARAMETER :: LSSTipMza = 841 + INTEGER(IntKi), PARAMETER :: LSSTipMys = 842 + INTEGER(IntKi), PARAMETER :: LSSTipMzs = 843 + INTEGER(IntKi), PARAMETER :: RotPwr = 844 ! Shaft Strain Gage Loads: - INTEGER(IntKi), PARAMETER :: LSSGagMya = 839 - INTEGER(IntKi), PARAMETER :: LSSGagMza = 840 - INTEGER(IntKi), PARAMETER :: LSSGagMys = 841 - INTEGER(IntKi), PARAMETER :: LSSGagMzs = 842 + INTEGER(IntKi), PARAMETER :: LSSGagMya = 845 + INTEGER(IntKi), PARAMETER :: LSSGagMza = 846 + INTEGER(IntKi), PARAMETER :: LSSGagMys = 847 + INTEGER(IntKi), PARAMETER :: LSSGagMzs = 848 ! High-Speed Shaft Loads: - INTEGER(IntKi), PARAMETER :: HSShftTq = 843 - INTEGER(IntKi), PARAMETER :: HSSBrTq = 844 - INTEGER(IntKi), PARAMETER :: HSShftPwr = 845 + INTEGER(IntKi), PARAMETER :: HSShftTq = 849 + INTEGER(IntKi), PARAMETER :: HSSBrTq = 850 + INTEGER(IntKi), PARAMETER :: HSShftPwr = 851 ! Rotor-Furl Bearing Loads: - INTEGER(IntKi), PARAMETER :: RFrlBrM = 846 + INTEGER(IntKi), PARAMETER :: RFrlBrM = 852 ! Tail-Furl Bearing Loads: - INTEGER(IntKi), PARAMETER :: TFrlBrM = 847 + INTEGER(IntKi), PARAMETER :: TFrlBrM = 853 ! Tower-Top / Yaw Bearing Loads: - INTEGER(IntKi), PARAMETER :: YawBrFxn = 848 - INTEGER(IntKi), PARAMETER :: YawBrFyn = 849 - INTEGER(IntKi), PARAMETER :: YawBrFzn = 850 - INTEGER(IntKi), PARAMETER :: YawBrFxp = 851 - INTEGER(IntKi), PARAMETER :: YawBrFyp = 852 - INTEGER(IntKi), PARAMETER :: YawBrMxn = 853 - INTEGER(IntKi), PARAMETER :: YawBrMyn = 854 - INTEGER(IntKi), PARAMETER :: YawBrMzn = 855 - INTEGER(IntKi), PARAMETER :: YawBrMxp = 856 - INTEGER(IntKi), PARAMETER :: YawBrMyp = 857 + INTEGER(IntKi), PARAMETER :: YawBrFxn = 854 + INTEGER(IntKi), PARAMETER :: YawBrFyn = 855 + INTEGER(IntKi), PARAMETER :: YawBrFzn = 856 + INTEGER(IntKi), PARAMETER :: YawBrFxp = 857 + INTEGER(IntKi), PARAMETER :: YawBrFyp = 858 + INTEGER(IntKi), PARAMETER :: YawBrMxn = 859 + INTEGER(IntKi), PARAMETER :: YawBrMyn = 860 + INTEGER(IntKi), PARAMETER :: YawBrMzn = 861 + INTEGER(IntKi), PARAMETER :: YawBrMxp = 862 + INTEGER(IntKi), PARAMETER :: YawBrMyp = 863 ! Yaw Friction: - INTEGER(IntKi), PARAMETER :: YawFriMom = 858 - INTEGER(IntKi), PARAMETER :: YawFriMfp = 859 - INTEGER(IntKi), PARAMETER :: YawFriMz = 860 - INTEGER(IntKi), PARAMETER :: OmegaYF = 861 - INTEGER(IntKi), PARAMETER :: dOmegaYF = 862 + INTEGER(IntKi), PARAMETER :: YawFriMom = 864 + INTEGER(IntKi), PARAMETER :: YawFriMfp = 865 + INTEGER(IntKi), PARAMETER :: YawFriMz = 866 + INTEGER(IntKi), PARAMETER :: OmegaYF = 867 + INTEGER(IntKi), PARAMETER :: dOmegaYF = 868 ! Tower Base Loads: - INTEGER(IntKi), PARAMETER :: TwrBsFxt = 863 - INTEGER(IntKi), PARAMETER :: TwrBsFyt = 864 - INTEGER(IntKi), PARAMETER :: TwrBsFzt = 865 - INTEGER(IntKi), PARAMETER :: TwrBsMxt = 866 - INTEGER(IntKi), PARAMETER :: TwrBsMyt = 867 - INTEGER(IntKi), PARAMETER :: TwrBsMzt = 868 + INTEGER(IntKi), PARAMETER :: TwrBsFxt = 869 + INTEGER(IntKi), PARAMETER :: TwrBsFyt = 870 + INTEGER(IntKi), PARAMETER :: TwrBsFzt = 871 + INTEGER(IntKi), PARAMETER :: TwrBsMxt = 872 + INTEGER(IntKi), PARAMETER :: TwrBsMyt = 873 + INTEGER(IntKi), PARAMETER :: TwrBsMzt = 874 ! Local Tower Loads: - INTEGER(IntKi), PARAMETER :: TwHt1MLxt = 869 - INTEGER(IntKi), PARAMETER :: TwHt1MLyt = 870 - INTEGER(IntKi), PARAMETER :: TwHt1MLzt = 871 - INTEGER(IntKi), PARAMETER :: TwHt2MLxt = 872 - INTEGER(IntKi), PARAMETER :: TwHt2MLyt = 873 - INTEGER(IntKi), PARAMETER :: TwHt2MLzt = 874 - INTEGER(IntKi), PARAMETER :: TwHt3MLxt = 875 - INTEGER(IntKi), PARAMETER :: TwHt3MLyt = 876 - INTEGER(IntKi), PARAMETER :: TwHt3MLzt = 877 - INTEGER(IntKi), PARAMETER :: TwHt4MLxt = 878 - INTEGER(IntKi), PARAMETER :: TwHt4MLyt = 879 - INTEGER(IntKi), PARAMETER :: TwHt4MLzt = 880 - INTEGER(IntKi), PARAMETER :: TwHt5MLxt = 881 - INTEGER(IntKi), PARAMETER :: TwHt5MLyt = 882 - INTEGER(IntKi), PARAMETER :: TwHt5MLzt = 883 - INTEGER(IntKi), PARAMETER :: TwHt6MLxt = 884 - INTEGER(IntKi), PARAMETER :: TwHt6MLyt = 885 - INTEGER(IntKi), PARAMETER :: TwHt6MLzt = 886 - INTEGER(IntKi), PARAMETER :: TwHt7MLxt = 887 - INTEGER(IntKi), PARAMETER :: TwHt7MLyt = 888 - INTEGER(IntKi), PARAMETER :: TwHt7MLzt = 889 - INTEGER(IntKi), PARAMETER :: TwHt8MLxt = 890 - INTEGER(IntKi), PARAMETER :: TwHt8MLyt = 891 - INTEGER(IntKi), PARAMETER :: TwHt8MLzt = 892 - INTEGER(IntKi), PARAMETER :: TwHt9MLxt = 893 - INTEGER(IntKi), PARAMETER :: TwHt9MLyt = 894 - INTEGER(IntKi), PARAMETER :: TwHt9MLzt = 895 - INTEGER(IntKi), PARAMETER :: TwHt1FLxt = 896 - INTEGER(IntKi), PARAMETER :: TwHt1FLyt = 897 - INTEGER(IntKi), PARAMETER :: TwHt1FLzt = 898 - INTEGER(IntKi), PARAMETER :: TwHt2FLxt = 899 - INTEGER(IntKi), PARAMETER :: TwHt2FLyt = 900 - INTEGER(IntKi), PARAMETER :: TwHt2FLzt = 901 - INTEGER(IntKi), PARAMETER :: TwHt3FLxt = 902 - INTEGER(IntKi), PARAMETER :: TwHt3FLyt = 903 - INTEGER(IntKi), PARAMETER :: TwHt3FLzt = 904 - INTEGER(IntKi), PARAMETER :: TwHt4FLxt = 905 - INTEGER(IntKi), PARAMETER :: TwHt4FLyt = 906 - INTEGER(IntKi), PARAMETER :: TwHt4FLzt = 907 - INTEGER(IntKi), PARAMETER :: TwHt5FLxt = 908 - INTEGER(IntKi), PARAMETER :: TwHt5FLyt = 909 - INTEGER(IntKi), PARAMETER :: TwHt5FLzt = 910 - INTEGER(IntKi), PARAMETER :: TwHt6FLxt = 911 - INTEGER(IntKi), PARAMETER :: TwHt6FLyt = 912 - INTEGER(IntKi), PARAMETER :: TwHt6FLzt = 913 - INTEGER(IntKi), PARAMETER :: TwHt7FLxt = 914 - INTEGER(IntKi), PARAMETER :: TwHt7FLyt = 915 - INTEGER(IntKi), PARAMETER :: TwHt7FLzt = 916 - INTEGER(IntKi), PARAMETER :: TwHt8FLxt = 917 - INTEGER(IntKi), PARAMETER :: TwHt8FLyt = 918 - INTEGER(IntKi), PARAMETER :: TwHt8FLzt = 919 - INTEGER(IntKi), PARAMETER :: TwHt9FLxt = 920 - INTEGER(IntKi), PARAMETER :: TwHt9FLyt = 921 - INTEGER(IntKi), PARAMETER :: TwHt9FLzt = 922 + INTEGER(IntKi), PARAMETER :: TwHt1MLxt = 875 + INTEGER(IntKi), PARAMETER :: TwHt1MLyt = 876 + INTEGER(IntKi), PARAMETER :: TwHt1MLzt = 877 + INTEGER(IntKi), PARAMETER :: TwHt2MLxt = 878 + INTEGER(IntKi), PARAMETER :: TwHt2MLyt = 879 + INTEGER(IntKi), PARAMETER :: TwHt2MLzt = 880 + INTEGER(IntKi), PARAMETER :: TwHt3MLxt = 881 + INTEGER(IntKi), PARAMETER :: TwHt3MLyt = 882 + INTEGER(IntKi), PARAMETER :: TwHt3MLzt = 883 + INTEGER(IntKi), PARAMETER :: TwHt4MLxt = 884 + INTEGER(IntKi), PARAMETER :: TwHt4MLyt = 885 + INTEGER(IntKi), PARAMETER :: TwHt4MLzt = 886 + INTEGER(IntKi), PARAMETER :: TwHt5MLxt = 887 + INTEGER(IntKi), PARAMETER :: TwHt5MLyt = 888 + INTEGER(IntKi), PARAMETER :: TwHt5MLzt = 889 + INTEGER(IntKi), PARAMETER :: TwHt6MLxt = 890 + INTEGER(IntKi), PARAMETER :: TwHt6MLyt = 891 + INTEGER(IntKi), PARAMETER :: TwHt6MLzt = 892 + INTEGER(IntKi), PARAMETER :: TwHt7MLxt = 893 + INTEGER(IntKi), PARAMETER :: TwHt7MLyt = 894 + INTEGER(IntKi), PARAMETER :: TwHt7MLzt = 895 + INTEGER(IntKi), PARAMETER :: TwHt8MLxt = 896 + INTEGER(IntKi), PARAMETER :: TwHt8MLyt = 897 + INTEGER(IntKi), PARAMETER :: TwHt8MLzt = 898 + INTEGER(IntKi), PARAMETER :: TwHt9MLxt = 899 + INTEGER(IntKi), PARAMETER :: TwHt9MLyt = 900 + INTEGER(IntKi), PARAMETER :: TwHt9MLzt = 901 + INTEGER(IntKi), PARAMETER :: TwHt1FLxt = 902 + INTEGER(IntKi), PARAMETER :: TwHt1FLyt = 903 + INTEGER(IntKi), PARAMETER :: TwHt1FLzt = 904 + INTEGER(IntKi), PARAMETER :: TwHt2FLxt = 905 + INTEGER(IntKi), PARAMETER :: TwHt2FLyt = 906 + INTEGER(IntKi), PARAMETER :: TwHt2FLzt = 907 + INTEGER(IntKi), PARAMETER :: TwHt3FLxt = 908 + INTEGER(IntKi), PARAMETER :: TwHt3FLyt = 909 + INTEGER(IntKi), PARAMETER :: TwHt3FLzt = 910 + INTEGER(IntKi), PARAMETER :: TwHt4FLxt = 911 + INTEGER(IntKi), PARAMETER :: TwHt4FLyt = 912 + INTEGER(IntKi), PARAMETER :: TwHt4FLzt = 913 + INTEGER(IntKi), PARAMETER :: TwHt5FLxt = 914 + INTEGER(IntKi), PARAMETER :: TwHt5FLyt = 915 + INTEGER(IntKi), PARAMETER :: TwHt5FLzt = 916 + INTEGER(IntKi), PARAMETER :: TwHt6FLxt = 917 + INTEGER(IntKi), PARAMETER :: TwHt6FLyt = 918 + INTEGER(IntKi), PARAMETER :: TwHt6FLzt = 919 + INTEGER(IntKi), PARAMETER :: TwHt7FLxt = 920 + INTEGER(IntKi), PARAMETER :: TwHt7FLyt = 921 + INTEGER(IntKi), PARAMETER :: TwHt7FLzt = 922 + INTEGER(IntKi), PARAMETER :: TwHt8FLxt = 923 + INTEGER(IntKi), PARAMETER :: TwHt8FLyt = 924 + INTEGER(IntKi), PARAMETER :: TwHt8FLzt = 925 + INTEGER(IntKi), PARAMETER :: TwHt9FLxt = 926 + INTEGER(IntKi), PARAMETER :: TwHt9FLyt = 927 + INTEGER(IntKi), PARAMETER :: TwHt9FLzt = 928 ! Internal Degrees of Freedom: - INTEGER(IntKi), PARAMETER :: Q_B1E1 = 923 - INTEGER(IntKi), PARAMETER :: Q_B2E1 = 924 - INTEGER(IntKi), PARAMETER :: Q_B3E1 = 925 - INTEGER(IntKi), PARAMETER :: Q_B1F1 = 926 - INTEGER(IntKi), PARAMETER :: Q_B2F1 = 927 - INTEGER(IntKi), PARAMETER :: Q_B3F1 = 928 - INTEGER(IntKi), PARAMETER :: Q_B1F2 = 929 - INTEGER(IntKi), PARAMETER :: Q_B2F2 = 930 - INTEGER(IntKi), PARAMETER :: Q_B3F2 = 931 - INTEGER(IntKi), PARAMETER :: Q_Teet = 932 - INTEGER(IntKi), PARAMETER :: Q_DrTr = 933 - INTEGER(IntKi), PARAMETER :: Q_GeAz = 934 - INTEGER(IntKi), PARAMETER :: Q_RFrl = 935 - INTEGER(IntKi), PARAMETER :: Q_TFrl = 936 - INTEGER(IntKi), PARAMETER :: Q_Yaw = 937 - INTEGER(IntKi), PARAMETER :: Q_TFA1 = 938 - INTEGER(IntKi), PARAMETER :: Q_TSS1 = 939 - INTEGER(IntKi), PARAMETER :: Q_TFA2 = 940 - INTEGER(IntKi), PARAMETER :: Q_TSS2 = 941 - INTEGER(IntKi), PARAMETER :: Q_Sg = 942 - INTEGER(IntKi), PARAMETER :: Q_Sw = 943 - INTEGER(IntKi), PARAMETER :: Q_Hv = 944 - INTEGER(IntKi), PARAMETER :: Q_R = 945 - INTEGER(IntKi), PARAMETER :: Q_P = 946 - INTEGER(IntKi), PARAMETER :: Q_Y = 947 - INTEGER(IntKi), PARAMETER :: QD_B1E1 = 948 - INTEGER(IntKi), PARAMETER :: QD_B2E1 = 949 - INTEGER(IntKi), PARAMETER :: QD_B3E1 = 950 - INTEGER(IntKi), PARAMETER :: QD_B1F1 = 951 - INTEGER(IntKi), PARAMETER :: QD_B2F1 = 952 - INTEGER(IntKi), PARAMETER :: QD_B3F1 = 953 - INTEGER(IntKi), PARAMETER :: QD_B1F2 = 954 - INTEGER(IntKi), PARAMETER :: QD_B2F2 = 955 - INTEGER(IntKi), PARAMETER :: QD_B3F2 = 956 - INTEGER(IntKi), PARAMETER :: QD_Teet = 957 - INTEGER(IntKi), PARAMETER :: QD_DrTr = 958 - INTEGER(IntKi), PARAMETER :: QD_GeAz = 959 - INTEGER(IntKi), PARAMETER :: QD_RFrl = 960 - INTEGER(IntKi), PARAMETER :: QD_TFrl = 961 - INTEGER(IntKi), PARAMETER :: QD_Yaw = 962 - INTEGER(IntKi), PARAMETER :: QD_TFA1 = 963 - INTEGER(IntKi), PARAMETER :: QD_TSS1 = 964 - INTEGER(IntKi), PARAMETER :: QD_TFA2 = 965 - INTEGER(IntKi), PARAMETER :: QD_TSS2 = 966 - INTEGER(IntKi), PARAMETER :: QD_Sg = 967 - INTEGER(IntKi), PARAMETER :: QD_Sw = 968 - INTEGER(IntKi), PARAMETER :: QD_Hv = 969 - INTEGER(IntKi), PARAMETER :: QD_R = 970 - INTEGER(IntKi), PARAMETER :: QD_P = 971 - INTEGER(IntKi), PARAMETER :: QD_Y = 972 - INTEGER(IntKi), PARAMETER :: QD2_B1E1 = 973 - INTEGER(IntKi), PARAMETER :: QD2_B2E1 = 974 - INTEGER(IntKi), PARAMETER :: QD2_B3E1 = 975 - INTEGER(IntKi), PARAMETER :: QD2_B1F1 = 976 - INTEGER(IntKi), PARAMETER :: QD2_B2F1 = 977 - INTEGER(IntKi), PARAMETER :: QD2_B3F1 = 978 - INTEGER(IntKi), PARAMETER :: QD2_B1F2 = 979 - INTEGER(IntKi), PARAMETER :: QD2_B2F2 = 980 - INTEGER(IntKi), PARAMETER :: QD2_B3F2 = 981 - INTEGER(IntKi), PARAMETER :: QD2_Teet = 982 - INTEGER(IntKi), PARAMETER :: QD2_DrTr = 983 - INTEGER(IntKi), PARAMETER :: QD2_GeAz = 984 - INTEGER(IntKi), PARAMETER :: QD2_RFrl = 985 - INTEGER(IntKi), PARAMETER :: QD2_TFrl = 986 - INTEGER(IntKi), PARAMETER :: QD2_Yaw = 987 - INTEGER(IntKi), PARAMETER :: QD2_TFA1 = 988 - INTEGER(IntKi), PARAMETER :: QD2_TSS1 = 989 - INTEGER(IntKi), PARAMETER :: QD2_TFA2 = 990 - INTEGER(IntKi), PARAMETER :: QD2_TSS2 = 991 - INTEGER(IntKi), PARAMETER :: QD2_Sg = 992 - INTEGER(IntKi), PARAMETER :: QD2_Sw = 993 - INTEGER(IntKi), PARAMETER :: QD2_Hv = 994 - INTEGER(IntKi), PARAMETER :: QD2_R = 995 - INTEGER(IntKi), PARAMETER :: QD2_P = 996 - INTEGER(IntKi), PARAMETER :: QD2_Y = 997 + INTEGER(IntKi), PARAMETER :: Q_B1E1 = 929 + INTEGER(IntKi), PARAMETER :: Q_B2E1 = 930 + INTEGER(IntKi), PARAMETER :: Q_B3E1 = 931 + INTEGER(IntKi), PARAMETER :: Q_B1F1 = 932 + INTEGER(IntKi), PARAMETER :: Q_B2F1 = 933 + INTEGER(IntKi), PARAMETER :: Q_B3F1 = 934 + INTEGER(IntKi), PARAMETER :: Q_B1F2 = 935 + INTEGER(IntKi), PARAMETER :: Q_B2F2 = 936 + INTEGER(IntKi), PARAMETER :: Q_B3F2 = 937 + INTEGER(IntKi), PARAMETER :: Q_Teet = 938 + INTEGER(IntKi), PARAMETER :: Q_DrTr = 939 + INTEGER(IntKi), PARAMETER :: Q_GeAz = 940 + INTEGER(IntKi), PARAMETER :: Q_RFrl = 941 + INTEGER(IntKi), PARAMETER :: Q_TFrl = 942 + INTEGER(IntKi), PARAMETER :: Q_Yaw = 943 + INTEGER(IntKi), PARAMETER :: Q_TFA1 = 944 + INTEGER(IntKi), PARAMETER :: Q_TSS1 = 945 + INTEGER(IntKi), PARAMETER :: Q_TFA2 = 946 + INTEGER(IntKi), PARAMETER :: Q_TSS2 = 947 + INTEGER(IntKi), PARAMETER :: Q_Sg = 948 + INTEGER(IntKi), PARAMETER :: Q_Sw = 949 + INTEGER(IntKi), PARAMETER :: Q_Hv = 950 + INTEGER(IntKi), PARAMETER :: Q_R = 951 + INTEGER(IntKi), PARAMETER :: Q_P = 952 + INTEGER(IntKi), PARAMETER :: Q_Y = 953 + INTEGER(IntKi), PARAMETER :: QD_B1E1 = 954 + INTEGER(IntKi), PARAMETER :: QD_B2E1 = 955 + INTEGER(IntKi), PARAMETER :: QD_B3E1 = 956 + INTEGER(IntKi), PARAMETER :: QD_B1F1 = 957 + INTEGER(IntKi), PARAMETER :: QD_B2F1 = 958 + INTEGER(IntKi), PARAMETER :: QD_B3F1 = 959 + INTEGER(IntKi), PARAMETER :: QD_B1F2 = 960 + INTEGER(IntKi), PARAMETER :: QD_B2F2 = 961 + INTEGER(IntKi), PARAMETER :: QD_B3F2 = 962 + INTEGER(IntKi), PARAMETER :: QD_Teet = 963 + INTEGER(IntKi), PARAMETER :: QD_DrTr = 964 + INTEGER(IntKi), PARAMETER :: QD_GeAz = 965 + INTEGER(IntKi), PARAMETER :: QD_RFrl = 966 + INTEGER(IntKi), PARAMETER :: QD_TFrl = 967 + INTEGER(IntKi), PARAMETER :: QD_Yaw = 968 + INTEGER(IntKi), PARAMETER :: QD_TFA1 = 969 + INTEGER(IntKi), PARAMETER :: QD_TSS1 = 970 + INTEGER(IntKi), PARAMETER :: QD_TFA2 = 971 + INTEGER(IntKi), PARAMETER :: QD_TSS2 = 972 + INTEGER(IntKi), PARAMETER :: QD_Sg = 973 + INTEGER(IntKi), PARAMETER :: QD_Sw = 974 + INTEGER(IntKi), PARAMETER :: QD_Hv = 975 + INTEGER(IntKi), PARAMETER :: QD_R = 976 + INTEGER(IntKi), PARAMETER :: QD_P = 977 + INTEGER(IntKi), PARAMETER :: QD_Y = 978 + INTEGER(IntKi), PARAMETER :: QD2_B1E1 = 979 + INTEGER(IntKi), PARAMETER :: QD2_B2E1 = 980 + INTEGER(IntKi), PARAMETER :: QD2_B3E1 = 981 + INTEGER(IntKi), PARAMETER :: QD2_B1F1 = 982 + INTEGER(IntKi), PARAMETER :: QD2_B2F1 = 983 + INTEGER(IntKi), PARAMETER :: QD2_B3F1 = 984 + INTEGER(IntKi), PARAMETER :: QD2_B1F2 = 985 + INTEGER(IntKi), PARAMETER :: QD2_B2F2 = 986 + INTEGER(IntKi), PARAMETER :: QD2_B3F2 = 987 + INTEGER(IntKi), PARAMETER :: QD2_Teet = 988 + INTEGER(IntKi), PARAMETER :: QD2_DrTr = 989 + INTEGER(IntKi), PARAMETER :: QD2_GeAz = 990 + INTEGER(IntKi), PARAMETER :: QD2_RFrl = 991 + INTEGER(IntKi), PARAMETER :: QD2_TFrl = 992 + INTEGER(IntKi), PARAMETER :: QD2_Yaw = 993 + INTEGER(IntKi), PARAMETER :: QD2_TFA1 = 994 + INTEGER(IntKi), PARAMETER :: QD2_TSS1 = 995 + INTEGER(IntKi), PARAMETER :: QD2_TFA2 = 996 + INTEGER(IntKi), PARAMETER :: QD2_TSS2 = 997 + INTEGER(IntKi), PARAMETER :: QD2_Sg = 998 + INTEGER(IntKi), PARAMETER :: QD2_Sw = 999 + INTEGER(IntKi), PARAMETER :: QD2_Hv = 1000 + INTEGER(IntKi), PARAMETER :: QD2_R = 1001 + INTEGER(IntKi), PARAMETER :: QD2_P = 1002 + INTEGER(IntKi), PARAMETER :: QD2_Y = 1003 ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER :: MaxOutPts = 997 + INTEGER(IntKi), PARAMETER :: MaxOutPts = 1003 !End of code generated by Matlab script Write_ChckOutLst ! =================================================================================================== + INTEGER, PARAMETER :: TipDxc( 3) = (/TipDxc1, TipDxc2, TipDxc3/) INTEGER, PARAMETER :: TipDyc( 3) = (/TipDyc1, TipDyc2, TipDyc3/) INTEGER, PARAMETER :: TipDzc( 3) = (/TipDzc1, TipDzc2, TipDzc3/) @@ -1266,6 +1266,8 @@ MODULE ElastoDyn_Parameters INTEGER, PARAMETER :: TipRDzc(3) = (/TipRDzc1, TipRDzc2, TipRDzc3/) INTEGER, PARAMETER :: TipClrnc(3) = (/TipClrnc1,TipClrnc2,TipClrnc3/) INTEGER, PARAMETER :: PtchPMzc(3) = (/PtchPMzc1,PtchPMzc2,PtchPMzc3/) +INTEGER, PARAMETER :: BldPRate(3) = (/BldPRate1,BldPRate2,BldPRate3/) +INTEGER, PARAMETER :: BldPAcc(3) = (/BldPAcc1, BldPAcc2, BldPAcc3/) INTEGER, PARAMETER :: RootFxc(3) = (/ RootFxc1,RootFxc2,RootFxc3 /) INTEGER, PARAMETER :: RootFyc(3) = (/ RootFyc1,RootFyc2,RootFyc3 /) @@ -1724,8 +1726,9 @@ SUBROUTINE ReadBladeFile ( BldFile, BladeKInputFileData, UnEc, ErrStat, ErrMsg ) REAL(ReKi) :: AdjBlMs ! Factor to adjust blade mass density. REAL(ReKi) :: AdjEdSt ! Factor to adjust edge stiffness. REAL(ReKi) :: AdjFlSt ! Factor to adjust flap stiffness. - REAL(ReKi) :: TmpRAry(6) ! Temporary variable to read table from file (up to 6 columns) INTEGER(IntKi) :: i ! A generic DO index. + integer(IntKi) :: colIdxOrder(5) ! Column index order + integer(IntKi) :: numColumn ! number of columns INTEGER( IntKi ) :: UnIn ! Unit number for reading file INTEGER(IntKi) :: ErrStat2 ! Temporary Error status CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary Err msg @@ -1785,22 +1788,9 @@ SUBROUTINE ReadBladeFile ( BldFile, BladeKInputFileData, UnEc, ErrStat, ErrMsg ) ! -------------- DISTRIBUTED BLADE PROPERTIES --------------------------------- ! Skip the comment lines. call ParseCom( InFileInfo, CurLine, TmpComment, ErrStat2, ErrMsg2, UnEc ); if (Failed()) return; ! Separator - call ParseCom( InFileInfo, CurLine, TmpComment, ErrStat2, ErrMsg2, UnEc ); if (Failed()) return; ! Col Names + call GetBldTbleCols( CurLine, colIdxOrder, numColumn, ErrStat2, ErrMsg2 ); if (Failed()) return; ! Col Names call ParseCom( InFileInfo, CurLine, TmpComment, ErrStat2, ErrMsg2, UnEc ); if (Failed()) return; ! Col Units - - ! The table may contain 6 columns if it includes PitchAxis (older format), otherwise it should only contain 5 columns - ! Attempt to read 6 columns: - call ParseAry( InFileInfo, CurLine, 'Blade input station table', TmpRAry, 6, ErrStat2, ErrMsg2) ! Don't write to echo - -!FIXME: remove the deprecated format at some point in the future!!! - ! 6 Columns -- deprecated format - if (ErrStat2 == ErrID_None) then ! contains PitchAxis input - CurLine = CurLine - 1 ! Backup one line to read entire table - call ParseTable6Col(ErrStat2, ErrMsg2); if (Failed()) return; - else ! no PitchAxis input - ! NOTE: don't backup a line as a failed ParesAry above won't increment the current line - call ParseTable5Col(ErrStat2, ErrMsg2); if (Failed()) return; - endif + call ParseTable5Col( colIdxOrder, numColumn, ErrStat2, ErrMsg2); if (Failed()) return; ! -------------- BLADE MODE SHAPES -------------------------------------------- ! NOTE: there is no coefficient for mode 0, so starts at BldFl1Sh(2), hence using (i+1) @@ -1838,38 +1828,61 @@ subroutine CheckAdjVars() IF ( AdjFlSt <= 0.0_ReKi ) call SetErrStat( ErrID_Warn, 'AdjFlSt must be greater than zero.', ErrStat, ErrMsg, RoutineName ) IF ( AdjEdSt <= 0.0_ReKi ) call SetErrStat( ErrID_Warn, 'AdjEdSt must be greater than zero.', ErrStat, ErrMsg, RoutineName ) end subroutine - subroutine ParseTable5Col(ErrStat3, ErrMsg3) - integer(IntKi), intent(out) :: ErrStat3 - character(ErrMsgLen), intent(out) :: ErrMsg3 - integer(IntKi), parameter :: NInputCols = 5 - do I=1,BladeKInputFileData%NBlInpSt - call ParseAry( InFileInfo, CurLine, 'Blade input station table', TmpRAry, NInputCols, ErrStat3, ErrMsg3, UnEc) - if (ErrStat3 >= AbortErrLev) return; - BladeKInputFileData%BlFract( I) = TmpRAry(1) - BladeKInputFileData%StrcTwst(I) = TmpRAry(2)*D2R ! Input in degrees; converted to radians here - BladeKInputFileData%BMassDen(I) = TmpRAry(3)*AdjBlMs ! Apply the correction factors to the elemental data. - BladeKInputFileData%FlpStff( I) = TmpRAry(4)*AdjFlSt ! Apply the correction factors to the elemental data. - BladeKInputFileData%EdgStff( I) = TmpRAry(5)*AdjEdSt ! Apply the correction factors to the elemental data. + !> Read the header line for the table to find out which column number holds each of the expected data types needed + subroutine GetBldTbleCols( CurLine, IdxOrder, numCol, ErrStat3, ErrMsg3 ) + integer(IntKi), intent(inout) :: CurLine + integer(IntKi), intent( out) :: IdxOrder(5) + integer(IntKi), intent( out) :: numCol + integer(IntKi), intent( out) :: ErrStat3 + character(ErrMsgLen), intent( out) :: ErrMsg3 + character(len=12), allocatable :: ColHdrNames(:) + character(len=8), parameter :: ColNames(5)=["BlFract ","StrcTwst","BMassDen","FlpStff ","EdgStff "] + integer(IntKi) :: j,k + character(len=12) :: TmpName,TmpNameRead + character(len=:), allocatable :: HeaderLine + ! get the number of column headers + HeaderLine = InFileInfo%Lines(CurLine) + numCol = CountWords( HeaderLine ) + call AllocAry(ColHdrNames, numCol, 'ColHdrNames', ErrStat3, ErrMsg3 ); if (ErrStat3 >= AbortErrLev) return + ! get column names (use GetWords on a local copy to avoid mutating InFileInfo%Lines) + call GetWords(HeaderLine, ColHdrNames, numCol) + ! Find the column number for each name. + IdxOrder = -1 + do j=1,5 + TmpName = ColNames(j); call Conv2UC(TmpName); + do k=1,numCol + TmpNameRead = ColHdrNames(k); call Conv2UC(TmpNameRead) + if (TmpName == TmpNameRead) then + IdxOrder(j) = k + cycle + endif + enddo + ! if couldn't find a column + if (IdxOrder(j) == -1) then + ErrStat3 = ErrID_Fatal + ErrMsg3 = " Could not find column "//trim(ColNames(j))//" in the blade input station table header in ElastoDyn blade file "//trim(InFileInfo%FileList(1)) + return + endif enddo + ! successfully read header line, so increment line number + CurLine = CurLine + 1 end subroutine - subroutine ParseTable6Col(ErrStat3, ErrMsg3) + subroutine ParseTable5Col(ColIdx, NInputCols, ErrStat3, ErrMsg3) + integer(IntKi), intent(in ) :: ColIdx(5) + integer(IntKi), intent(in ) :: NInputCols integer(IntKi), intent(out) :: ErrStat3 character(ErrMsgLen), intent(out) :: ErrMsg3 - integer(IntKi), parameter :: NInputCols = 6 + real(ReKi), allocatable :: TmpRAry(:) ! Temporary variable to read table from file + call AllocAry(TmpRAry, NInputCols, 'TmpRAry', ErrStat3, ErrMsg3); if (ErrStat3 >= AbortErrLev) return do I=1,BladeKInputFileData%NBlInpSt call ParseAry( InFileInfo, CurLine, 'Blade input station table', TmpRAry, NInputCols, ErrStat3, ErrMsg3, UnEc) if (ErrStat3 >= AbortErrLev) return; - BladeKInputFileData%BlFract( I) = TmpRAry(1) - BladeKInputFileData%PitchAx( I) = TmpRAry(2) - BladeKInputFileData%StrcTwst(I) = TmpRAry(3)*D2R ! Input in degrees; converted to radians here - BladeKInputFileData%BMassDen(I) = TmpRAry(4)*AdjBlMs ! Apply the correction factors to the elemental data. - BladeKInputFileData%FlpStff( I) = TmpRAry(5)*AdjFlSt ! Apply the correction factors to the elemental data. - BladeKInputFileData%EdgStff( I) = TmpRAry(6)*AdjEdSt ! Apply the correction factors to the elemental data. + BladeKInputFileData%BlFract( I) = TmpRAry(ColIdx(1)) + BladeKInputFileData%StrcTwst(I) = TmpRAry(ColIdx(2))*D2R ! Input in degrees; converted to radians here + BladeKInputFileData%BMassDen(I) = TmpRAry(ColIdx(3))*AdjBlMs ! Apply the correction factors to the elemental data. + BladeKInputFileData%FlpStff( I) = TmpRAry(ColIdx(4))*AdjFlSt ! Apply the correction factors to the elemental data. + BladeKInputFileData%EdgStff( I) = TmpRAry(ColIdx(5))*AdjEdSt ! Apply the correction factors to the elemental data. enddo - ! Set warning that this is a depricated format (grab filename corresponding to the main blade file in case the table is separate) - ErrStat3 = ErrID_Warn - ErrMsg3 = "The ElastoDyn Blade file, "//trim(InFileInfo%FileList(1))// & - ", DISTRIBUTED BLADE PROPERTIES table contains the PitchAxis column. This column is unused and will be removed in future releases" end subroutine !> write out the blade file contents to screen (use in debugging only) subroutine PrintBladeFileContents() @@ -2507,6 +2520,20 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, BldFile, FurlFile, TwrFile RETURN END IF + CALL AllocAry( InputFileData%PBrIner, MaxBl, 'PBrIner input array', ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + + CALL AllocAry( InputFileData%BlPIner, MaxBl, 'BlPIner input array', ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + CALL AllocAry( InputFileData%OutList, MaxOutPts, "ElastoDyn Input File's Outlist", ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) IF ( ErrStat >= AbortErrLev ) THEN @@ -2648,6 +2675,14 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, BldFile, FurlFile, TwrFile RETURN END IF + ! PitchDOF - Blade pitch DOF (flag): + CALL ReadVar( UnIn, InputFile, InputFileData%PitchDOF, "PitchDOF", "Blade pitch DOF (flag)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + ! TeetDOF - Rotor-teeter DOF (flag): CALL ReadVar( UnIn, InputFile, InputFileData%TeetDOF, "TeetDOF", "Rotor-teeter DOF (flag)", ErrStat2, ErrMsg2, UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -3092,6 +3127,22 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, BldFile, FurlFile, TwrFile RETURN END IF + ! PtfmRefxt - Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters): + CALL ReadVar( UnIn, InputFile, InputFileData%PtfmRefxt, "PtfmRefxt", "Downwind distance from the ground [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + + ! PtfmRefyt - Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters): + CALL ReadVar( UnIn, InputFile, InputFileData%PtfmRefyt, "PtfmRefyt", "Lateral distance from the ground [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + ! PtfmRefzt - Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters): CALL ReadVar( UnIn, InputFile, InputFileData%PtfmRefzt, "PtfmRefzt", "Vertical distance from the ground [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters)", ErrStat2, ErrMsg2, UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -3116,6 +3167,22 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, BldFile, FurlFile, TwrFile RETURN END IF + ! PBrIner - Pitch bearing inertia about the pitch axis (kg m^2): + CALL ReadAryLines( UnIn, InputFile, InputFileData%PBrIner, MaxBl, "PBrIner", "Pitch bearing inertia about the pitch axis (kg m^2)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + + ! BlPIner - Blade inertia about the pitch axis (kg m^2): + CALL ReadAryLines( UnIn, InputFile, InputFileData%BlPIner, MaxBl, "BlPIner", "Blade inertia about the pitch axis (kg m^2)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + ! HubMass - Hub mass (kg): CALL ReadVar( UnIn, InputFile, InputFileData%HubMass, "HubMass", "Hub mass (kg)", ErrStat2, ErrMsg2, UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -3757,8 +3824,6 @@ SUBROUTINE Alloc_BladeInputProperties( BladeKInputFileData, ErrStat, ErrMsg ) CALL AllocAry ( BladeKInputFileData%BlFract, BladeKInputFileData%NBlInpSt, 'BlFract' , ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) RETURN - CALL AllocAry ( BladeKInputFileData%PitchAx, BladeKInputFileData%NBlInpSt, 'PitchAx' , ErrStat, ErrMsg ) - IF ( ErrStat /= ErrID_None ) RETURN CALL AllocAry ( BladeKInputFileData%StrcTwst, BladeKInputFileData%NBlInpSt, 'StrcTwst' , ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) RETURN CALL AllocAry ( BladeKInputFileData%BMassDen, BladeKInputFileData%NBlInpSt, 'BMassDen' , ErrStat, ErrMsg ) @@ -3885,11 +3950,6 @@ SUBROUTINE ValidateBladeData ( BladeKInputFileData, ErrStat, ErrMsg ) DO I = 1,BladeKInputFileData%NBlInpSt - ! Check that PitchAx is contained in [0.0, 1.0]: - IF ( ( BladeKInputFileData%PitchAx(I) ) < 0.0_ReKi .OR. ( BladeKInputFileData%PitchAx(I) > 1.0_ReKi ) ) THEN - CALL SetErrStat( ErrID_Fatal,'PitchAx('//TRIM( Num2LStr( I ) )//') must be between 0 and 1 (inclusive).',ErrStat,ErrMsg,RoutineName) - END IF - ! Check that StrcTwst is contained in (-pi,pi] radians ( i.e., (-180.0, 180.0] degrees): IF ( ( BladeKInputFileData%StrcTwst(I) <= -pi ) .OR. ( BladeKInputFileData%StrcTwst(I) > pi ) ) THEN CALL SetErrStat( ErrID_Fatal,'StrcTwst('//TRIM( Num2LStr( I ) ) // & @@ -4302,6 +4362,14 @@ SUBROUTINE ValidatePrimaryData( InputFileData, BD4Blades, Linearize, MHK, ErrSta IF ( InputFileData%TipMass(K) < 0.0_ReKi) call SetErrStat(ErrID_Fatal,'TipMass('//TRIM( Num2LStr( K ) )//') must not be negative.',ErrStat,ErrMsg,RoutineName) ENDDO ! K + DO K=1,InputFileData%NumBl + IF ( InputFileData%PBrIner(K) < 0.0_ReKi) call SetErrStat(ErrID_Fatal,'PBrIner('//TRIM( Num2LStr( K ) )//') must not be negative.',ErrStat,ErrMsg,RoutineName) + ENDDO ! K + + DO K=1,InputFileData%NumBl + IF ( InputFileData%BlPIner(K) < 0.0_ReKi) call SetErrStat(ErrID_Fatal,'BlPIner('//TRIM( Num2LStr( K ) )//') must not be negative.',ErrStat,ErrMsg,RoutineName) + ENDDO ! K + IF ( InputFileData%NacYIner < 0.0_ReKi) call SetErrStat(ErrID_Fatal,'NacYIner must not be negative.',ErrStat,ErrMsg,RoutineName) IF ( InputFileData%GenIner < 0.0_ReKi) call SetErrStat(ErrID_Fatal,'GenIner must not be negative.',ErrStat,ErrMsg,RoutineName) IF ( InputFileData%HubIner < 0.0_ReKi) call SetErrStat(ErrID_Fatal,'HubIner must not be negative.',ErrStat,ErrMsg,RoutineName) diff --git a/modules/elastodyn/src/ElastoDyn_Registry.txt b/modules/elastodyn/src/ElastoDyn_Registry.txt index 48bfc6321b..e0988d4c0d 100644 --- a/modules/elastodyn/src/ElastoDyn_Registry.txt +++ b/modules/elastodyn/src/ElastoDyn_Registry.txt @@ -14,7 +14,7 @@ include Registry_NWTC_Library.txt # ElastoDyn Constants param ElastoDyn/ED - IntKi ED_NMX - 4 - "Used in updating predictor-corrector values (size of state history)" - - +param ^ - IntKi ED_u_BlPitchComC - -1 - "DatLoc number for collective blade pitch extended input" - # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: @@ -49,20 +49,12 @@ typedef ^ InitOutputType R8Ki TwrBaseOrient {3}{3} - - "initial orientation of t typedef ^ InitOutputType ReKi HubRad - - - "Preconed hub radius (distance from the rotor apex to the blade root)" m typedef ^ InitOutputType ReKi RotSpeed - - - "Initial or fixed rotor speed" rad/s typedef ^ InitOutputType LOGICAL isFixed_GenDOF - - - "whether the generator is fixed or free" - -typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - -typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -typedef ^ InitOutputType LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - -typedef ^ InitOutputType LOGICAL RotFrame_x {:} - - "Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame" - -typedef ^ InitOutputType IntKi DerivOrder_x {:} - - "Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization" - -typedef ^ InitOutputType LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - -typedef ^ InitOutputType LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix)" - typedef ^ InitOutputType IntKi GearBox_index - - - "Index to gearbox rotation in state array (for steady-state calculations)" - +typedef ^ InitOutputType ModVarsType Vars - - - "Module Variables" # ..... Blade Input file data ........................................................................................................... typedef ElastoDyn/ED BladeInputData IntKi NBlInpSt - - - "Number of blade input stations" - typedef ^ BladeInputData ReKi BlFract {:} - - "Blade fractional radius for distributed input data" - -typedef ^ BladeInputData ReKi PitchAx {:} - - "Pitch axis for distributed input data" - typedef ^ BladeInputData ReKi StrcTwst {:} - - "Structural twist for distributed input data" radians typedef ^ BladeInputData ReKi BMassDen {:} - - "Blade mass density for distributed input data" typedef ^ BladeInputData ReKi FlpStff {:} - - "Blade flap stiffness for distributed input data" @@ -89,6 +81,7 @@ typedef ElastoDyn/ED ED_InputFile DbKi DT - - - "Requested integration time for typedef ^ ED_InputFile LOGICAL FlapDOF1 - - - "First flapwise blade mode DOF" - typedef ^ ED_InputFile LOGICAL FlapDOF2 - - - "Second flapwise blade mode DOF" - typedef ^ ED_InputFile LOGICAL EdgeDOF - - - "Edgewise blade mode DOF" - +typedef ^ ED_InputFile LOGICAL PitchDOF - - - "Blade pitch DOF" - typedef ^ ED_InputFile LOGICAL TeetDOF - - - "Rotor-teeter DOF" - typedef ^ ED_InputFile LOGICAL DrTrDOF - - - "Drivetrain rotational-flexibility DOF" - typedef ^ ED_InputFile LOGICAL GenDOF - - - "Generator DOF" - @@ -141,8 +134,12 @@ typedef ^ ED_InputFile ReKi TowerBsHt - - - "Height of tower base relative to gr typedef ^ ED_InputFile ReKi PtfmCMxt - - - "Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform CM" meters typedef ^ ED_InputFile ReKi PtfmCMyt - - - "Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform CM" meters typedef ^ ED_InputFile ReKi PtfmCMzt - - - "Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform CM" meters +typedef ^ ED_InputFile ReKi PtfmRefxt - - - "Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point" meters +typedef ^ ED_InputFile ReKi PtfmRefyt - - - "Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point" meters typedef ^ ED_InputFile ReKi PtfmRefzt - - - "Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point" meters typedef ^ ED_InputFile ReKi TipMass {:} - - "Tip-brake masses" kg +typedef ^ ED_InputFile ReKi PBrIner {:} - - "Pitch bearing inertia about the pitch axis" kg m^2 +typedef ^ ED_InputFile ReKi BlPIner {:} - - "Blade inertia about the pitch axis" kg m^2 typedef ^ ED_InputFile ReKi HubMass - - - "Hub mass" kg typedef ^ ED_InputFile ReKi HubIner - - - "Hub inertia about rotor axis (2 or 3-blader)" "kg m^2" typedef ^ ED_InputFile ReKi HubIner_Teeter - - - "Hub inertia about teeter axis (2-blader)" "kg m^2" @@ -514,7 +511,6 @@ typedef ^ ED_RtHndSide ReKi TeetMom - - - "The total moment supplied by the stop typedef ^ ED_RtHndSide ReKi TFrlMom - - - "The total tail-furl spring and damper moment" typedef ^ ED_RtHndSide ReKi RFrlMom - - - "The total rotor-furl spring and damper moment" typedef ^ ED_RtHndSide ReKi GBoxEffFac - - - "The factor used to apply the gearbox efficiency effects to the equation associated with the generator DOF" -typedef ^ ED_RtHndSide ReKi rSAerCen {:}{:}{:} - - "aerodynamic pitching moment arm (i.e., the position vector from point S on the blade to the aerodynamic center of the element)" typedef ^ ED_RtHndSide ReKi YawFriMom - - - "Yaw Friction Moment" kN-m # ..... States .................................................................................................................... @@ -541,40 +537,10 @@ typedef ^ OtherStateType ReKi YawFriMfp - - - "Y typedef ^ OtherStateType R8Ki OmegaTn - - - "Yaw rate at t_n used to calculate friction torque and yaw rate at t_n+1" rad/s typedef ^ OtherStateType R8Ki OmegaDotTn - - - "Yaw acceleration at t_n used to calculate friction torque and yaw rate at t_n+1" rad/s^2 -# ..... Misc Vars ................................................................................................................ -typedef ^ MiscVarType ED_CoordSys CoordSys - - - "Coordinate systems in the FAST framework" - -typedef ^ MiscVarType ED_RtHndSide RtHS - - - "Values used in calculating the right-hand-side RtHS (and outputs)" -typedef ^ MiscVarType ReKi AllOuts {:} - - "An array holding the value of all of the calculated (not only selected) output channels" "see OutListParameters.xlsx spreadsheet" -typedef ^ MiscVarType R8Ki AugMat {:}{:} - - "The augmented matrix used for the solution of the QD2T()s" -typedef ^ MiscVarType R8Ki AugMat_factor {:}{:} - - "factored version of AugMat matrix" -typedef ^ MiscVarType R8Ki SolnVec {:} - - "b in the equation Ax=b (last column of AugMat)" -typedef ^ MiscVarType IntKi AugMat_pivot {:} - - "Pivot column for AugMat in LAPACK factorization" -typedef ^ MiscVarType ReKi OgnlGeAzRo {:} - - "Original DOF_GeAz row in AugMat" - -typedef ^ MiscVarType R8Ki QD2T {:} - - "Solution (acceleration) vector; the first time derivative of QDT" -typedef ^ MiscVarType Logical IgnoreMod - - - "whether to ignore the modulo in ED outputs (necessary for linearization perturbations)" - -typedef ^ MiscVarType ReKi OgnlYawRow {:} - - "Original DOF_Yaw row in AugMat" - -typedef ^ MiscVarType ReKi FrcONcRt 3 - - "Force acting on yaw bearing including inertial contributions" N -typedef ^ MiscVarType ReKi MomONcRt 3 - - "Moment acting on yaw bearing including inertial contributions" N-m -typedef ^ MiscVarType ReKi YawFriMz - - - "External loading on yaw bearing not including inertial contributions" N-m # ..... Parameters ................................................................................................................ # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: -typedef ^ Jac_u_idxStarts IntKi BladeLoad - 1 - "Index to first point in y jacobian for BladeLoad" - -typedef ^ Jac_u_idxStarts IntKi PlatformLoad - 1 - "Index to first point in y jacobian for PlatformLoad" - -typedef ^ Jac_u_idxStarts IntKi TowerLoad - 1 - "Index to first point in y jacobian for TowerLoad" - -typedef ^ Jac_u_idxStarts IntKi HubLoad - 1 - "Index to first point in y jacobian for HubLoad" - -typedef ^ Jac_u_idxStarts IntKi NacelleLoad - 1 - "Index to first point in y jacobian for NacelleLoad" - -typedef ^ Jac_u_idxStarts IntKi TFinLoad - 1 - "Index to first point in y jacobian for TFinLoad" - -typedef ^ Jac_u_idxStarts IntKi BlPitchCom - 1 - "Index to first point in y jacobian for BlPitchCom" - -typedef ^ Jac_y_idxStarts IntKi Blade - 1 - "Index to first point in u jacobian for Blade" - -typedef ^ Jac_y_idxStarts IntKi Platform - 1 - "Index to first point in u jacobian for Platform" - -typedef ^ Jac_y_idxStarts IntKi Tower - 1 - "Index to first point in u jacobian for Tower" - -typedef ^ Jac_y_idxStarts IntKi Hub - 1 - "Index to first point in u jacobian for Hub" - -typedef ^ Jac_y_idxStarts IntKi BladeRoot - 1 - "Index to first point in u jacobian for BladeRoot" - -typedef ^ Jac_y_idxStarts IntKi Nacelle - 1 - "Index to first point in u jacobian for Nacelle" - -typedef ^ Jac_y_idxStarts IntKi TFin - 1 - "Index to first point in u jacobian for TFin" - - typedef ^ ParameterType DbKi DT - - - "Time step for continuous state integration & discrete state update" seconds typedef ^ ParameterType DbKi DT24 - - - "=DT/24 (used in loose coupling)" seconds typedef ^ ParameterType IntKi BldNodes - - - "Number of blade nodes used in the analysis" - @@ -621,6 +587,8 @@ typedef ^ ParameterType ReKi NacCMyn - - - "Lateral distance from tower-top to n typedef ^ ParameterType ReKi NacCMzn - - - "Vertical distance from tower-top to nacelle CM" typedef ^ ParameterType ReKi OverHang - - - "Distance from yaw axis to rotor apex or teeter pin" typedef ^ ParameterType ReKi ProjArea - - - "Swept area of the rotor projected onto the rotor plane (the plane normal to the low-speed shaft)" +typedef ^ ParameterType ReKi PtfmRefxt - - - "Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point" +typedef ^ ParameterType ReKi PtfmRefyt - - - "Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point" typedef ^ ParameterType ReKi PtfmRefzt - - - "Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point" typedef ^ ParameterType ReKi RefTwrHt - - - "Vertical distance between FAST's undisplaced tower height (variable TowerHt) and FAST's inertia frame reference point (variable PtfmRef); that is, RefTwrHt = TowerHt - PtfmRefzt" typedef ^ ParameterType ReKi RFrlPnt_n 3 - - "Vector from tower-top to arbitrary point on rotor-furl axis" @@ -640,6 +608,8 @@ typedef ^ ParameterType ReKi rWJxn - - - "xn-component of position vector rWJ" typedef ^ ParameterType ReKi rWJyn - - - "yn-component of position vector rWJ" typedef ^ ParameterType ReKi rWJzn - - - "zn-component of position vector rWJ" typedef ^ ParameterType ReKi rZT0zt - - - "zt-component of position vector rZT0" +typedef ^ ParameterType ReKi rZYxt - - - "xt-component of position vector rZY" +typedef ^ ParameterType ReKi rZYyt - - - "yt-component of position vector rZY" typedef ^ ParameterType ReKi rZYzt - - - "zt-component of position vector rZY" typedef ^ ParameterType R8Ki SinDel3 - - - "Sine of the Delta-3 angle for teetering rotors" typedef ^ ParameterType R8Ki SinPreC {:} - - "Sines of the precone angles" @@ -703,13 +673,13 @@ typedef ^ ParameterType ReKi SecondMom {:} - - "Second mass moment of inertia of typedef ^ ParameterType ReKi TFinMass - - - "Tail fin mass" typedef ^ ParameterType ReKi TFrlIner - - - "Tail boom inertia about tail-furl axis" typedef ^ ParameterType ReKi TipMass {:} - - "Tip-brake masses" +typedef ^ ParameterType ReKi PitchIner {:} - - "Blade inertia about the pitch axis" typedef ^ ParameterType ReKi TurbMass - - - "Mass of turbine (tower + rotor + nacelle)" typedef ^ ParameterType ReKi TwrMass - - - "Mass of tower" typedef ^ ParameterType ReKi TwrTpMass - - - "Tower-top mass (rotor + nacelle)" typedef ^ ParameterType ReKi YawBrMass - - - "Yaw bearing mass" #typedef ^ ParameterType ReKi AirDens - - - "Air density = RHO" typedef ^ ParameterType ReKi Gravity - - - "Gravitational acceleration" m/s^2 -typedef ^ ParameterType ReKi PitchAxis {:}{:} - - "Pitch axis for analysis nodes" - typedef ^ ParameterType ReKi AeroTwst {:} - - "Aerodynamic twist of the blade at the analysis nodes" typedef ^ ParameterType ReKi AxRedBld {:}{:}{:}{:} - - "The axial-reduction terms of the blade shape function" typedef ^ ParameterType ReKi BldEDamp {:}{:} - - "Blade edgewise damping coefficients" @@ -727,8 +697,6 @@ typedef ^ ParameterType ReKi KBF {:}{:}{:} - - "Generalized flapwise stiffness o typedef ^ ParameterType ReKi MassB {:}{:} - - "Interpolated lineal blade mass density" typedef ^ ParameterType ReKi RNodes {:} - - "Radius to analysis nodes relative to hub ( 0 < RNodes(:) < BldFlexL )" typedef ^ ParameterType ReKi RNodesNorm {:} - - "Normalized radius to analysis nodes relative to hub ( 0 < RNodesNorm(:) < 1 )" -typedef ^ ParameterType ReKi rSAerCenn1 {:}{:} - - "Distance from point S on a blade to the aerodynamic center in the n1 direction (m)" -typedef ^ ParameterType ReKi rSAerCenn2 {:}{:} - - "Distance from point S on a blade to the aerodynamic center in the n2 direction (m)" typedef ^ ParameterType ReKi SAeroTwst {:} - - "Sine of the aerodynamic twist of the blade at the analysis nodes" typedef ^ ParameterType ReKi StiffBE {:}{:} - - "Interpolated edgewise blade stiffness" typedef ^ ParameterType ReKi StiffBF {:}{:} - - "Interpolated flapwise blade stiffness" @@ -800,8 +768,6 @@ typedef ^ ParameterType R8Ki M_MCSMAX - - - "Maximum typedef ^ ParameterType R8Ki sig_v - - - "Linear viscous friction coefficient" N-m/(rad/s) typedef ^ ParameterType R8Ki sig_v2 - - - "Quadratic viscous friction coefficient" N-m/(rad/s)^2 typedef ^ ParameterType R8Ki OmgCut - - - "Nacelle yaw angular velocity cutoff below which viscous friction is to be linearized" rad/s -#typedef ^ ParameterType R8Ki thr_omg - - - "Yaw rate stiction threshold" rad/s -#typedef ^ ParameterType R8Ki thr_omgdot - - - "Yaw acceleration stiction threshold" rad/s^2 # .... ED_AllBlNds option ........................................................................................................ typedef ^ ParameterType IntKi BldNd_NumOuts - - - "Number of requested output channels per blade node (ED_AllBldNdOuts)" - @@ -810,24 +776,14 @@ typedef ^ ParameterType OutParmType BldNd_OutParam {:} - - "Names and unit #typedef ^ ParameterType IntKi BldNd_BlOutNd {:} - - "The blade nodes to actually output (ED_AllBldNdOuts)" - typedef ^ ParameterType IntKi BldNd_BladesOut - - - "The blades to output (ED_AllBldNdOuts)" - -typedef ^ ParameterType Jac_u_idxStarts Jac_u_idxStartList - - - "Starting indices for all Jac_u compenents" - -typedef ^ ParameterType Jac_y_idxStarts Jac_y_idxStartList - - - "Starting indices for all Jac_u compenents" - -typedef ^ ParameterType Integer Jac_u_indx {:}{:} - - "matrix to help fill/pack the u vector in computing the jacobian" - -typedef ^ ParameterType R8Ki du {:} - - "vector that determines size of perturbation for u (inputs)" -typedef ^ ParameterType R8Ki dx {:} - - "vector that determines size of perturbation for x (continuous states)" -typedef ^ ParameterType Integer Jac_ny - - - "number of outputs in jacobian matrix" - typedef ^ ParameterType Logical CompAeroMaps - - - "number of outputs in jacobian matrix" - -typedef ^ ParameterType Integer NumExtendedInputs - - - "number of extended inputs for linearization" - -typedef ^ ParameterType Integer NumBl_Lin - - - "number of blades in the jacobian" - -typedef ^ ParameterType Integer NActvVelDOF_Lin - - - "number of velocity states in the jacobian" - -typedef ^ ParameterType Integer NActvDOF_Lin - - - "number of active DOFs to use in the jacobian" - -typedef ^ ParameterType Integer NActvDOF_Stride - - - "stride for active DOFs to use in the jacobian" - # ..... Inputs .................................................................................................................... # Define inputs that are contained on the mesh here: typedef ^ InputType MeshType BladePtLoads {:} - - "A mesh on each blade, containing aerodynamic forces and moments (formerly AeroBladeForce and AeroBladeMoment)" typedef ^ InputType MeshType PlatformPtMesh - - - "A mesh at the platform reference (point Z), containing force: surge/xi (1), sway/yi (2), and heave/zi (3)-components; and moments: roll/xi (1), pitch/yi (2), and yaw/zi (3)-components acting at the platform (body X) / platform reference (point Z) associated with everything but the QD2T()s" N typedef ^ InputType MeshType TowerPtLoads - - - "Tower line2 mesh with forces: surge/xi (1), sway/yi (2), and heave/zi (3)-components of the portion of the tower force at the current tower node (point T); and moments: roll/xi (1), pitch/yi (2), and yaw/zi (3)-components of the portion of the tower moment acting at the current tower node" N/m +typedef ^ InputType MeshType BladeRootLoads {:} - - "For BeamDyn: loads at the blade roots" typedef ^ InputType MeshType HubPtLoad - - - "A mesh at the teeter pin, containing forces: surge/xi (1), sway/yi (2), and heave/zi (3)-components; and moments: roll/xi (1), pitch/yi (2), and yaw/zi (3)-components acting at the hub. Passed from BeamDyn" typedef ^ InputType MeshType NacelleLoads - - - "From ServoDyn/TMD: loads on the nacelle." typedef ^ InputType MeshType TFinCMLoads - - - "Aerodynamic forces and moments at the tail-fin center of mass point (point J)" @@ -835,6 +791,7 @@ typedef ^ InputType MeshType TFinCMLoads - - - "Aerodynamic forces and moments typedef ^ InputType ReKi TwrAddedMass {:}{:}{:} - - "6-by-6 added mass matrix of the tower elements, per unit length-bjj: place on a mesh" "per unit length" typedef ^ InputType ReKi PtfmAddedMass {6}{6} - - "Platform added mass matrix" "kg, kg-m, kg-m^2" typedef ^ InputType ReKi BlPitchCom {:} - 2pi "Commanded blade pitch angles" radians +typedef ^ InputType ReKi BlPitchMom {:} - - "Blade pitch motor torque" N-m typedef ^ InputType ReKi YawMom - - - "Torque transmitted through the yaw bearing" N-m typedef ^ InputType ReKi GenTrq - - - "Electrical generator torque" N-m typedef ^ InputType ReKi HSSBrTrqC - - - "Commanded HSS brake torque" N-m @@ -852,6 +809,7 @@ typedef ^ OutputType MeshType TFinCMMotion - - - "For AeroDyn: motions of th # Define outputs that are not on this mesh here: typedef ^ OutputType ReKi WriteOutput {:} - - "Data to be written to an output file: see WriteOutputHdr for names of each variable" "see WriteOutputUnt" typedef ^ OutputType ReKi BlPitch {:} - 2pi "Current blade pitch angles" radians +typedef ^ OutputType ReKi BlPRate {:} - - "Current blade pitch rate" rad/s typedef ^ OutputType ReKi Yaw - - 2pi "Current nacelle yaw" radians typedef ^ OutputType ReKi YawRate - - - "Current nacelle yaw rate" rad/s typedef ^ OutputType ReKi LSS_Spd - - - "Low-speed shaft (LSS) speed at entrance to gearbox" rad/s @@ -878,3 +836,24 @@ typedef ^ OutputType ReKi RotPwr - - - "Rotor power (this is equivalent to the l typedef ^ OutputType ReKi LSShftFxa - - - "Rotating low-speed shaft force x" N typedef ^ OutputType ReKi LSShftFys - - - "Nonrotating low-speed shaft force y" N typedef ^ OutputType ReKi LSShftFzs - - - "Nonrotating low-speed shaft force z" N + +# ..... Misc Vars ................................................................................................................ +typedef ^ MiscVarType ED_CoordSys CoordSys - - - "Coordinate systems in the FAST framework" - +typedef ^ MiscVarType ED_RtHndSide RtHS - - - "Values used in calculating the right-hand-side RtHS (and outputs)" +typedef ^ MiscVarType ReKi AllOuts {:} - - "An array holding the value of all of the calculated (not only selected) output channels" "see OutListParameters.xlsx spreadsheet" +typedef ^ MiscVarType R8Ki AugMat {:}{:} - - "The augmented matrix used for the solution of the QD2T()s" +typedef ^ MiscVarType R8Ki AugMat_factor {:}{:} - - "factored version of AugMat matrix" +typedef ^ MiscVarType R8Ki SolnVec {:} - - "b in the equation Ax=b (last column of AugMat)" +typedef ^ MiscVarType IntKi AugMat_pivot {:} - - "Pivot column for AugMat in LAPACK factorization" +typedef ^ MiscVarType ReKi OgnlGeAzRo {:} - - "Original DOF_GeAz row in AugMat" - +typedef ^ MiscVarType R8Ki QD2T {:} - - "Solution (acceleration) vector; the first time derivative of QDT" +typedef ^ MiscVarType Logical IgnoreMod - - - "whether to ignore the modulo in ED outputs (necessary for linearization perturbations)" - +typedef ^ MiscVarType ReKi OgnlYawRow {:} - - "Original DOF_Yaw row in AugMat" - +typedef ^ MiscVarType ReKi FrcONcRt 3 - - "Force acting on yaw bearing including inertial contributions" N +typedef ^ MiscVarType ReKi MomONcRt 3 - - "Moment acting on yaw bearing including inertial contributions" N-m +typedef ^ MiscVarType ReKi YawFriMz - - - "External loading on yaw bearing not including inertial contributions" N-m +typedef ^ MiscVarType ModJacType Jac - - - "Values corresponding to module variables" +typedef ^ MiscVarType ED_ContinuousStateType x_perturb - - - "" - +typedef ^ MiscVarType ED_ContinuousStateType dxdt_lin - - - "" - +typedef ^ MiscVarType ED_InputType u_perturb - - - "" - +typedef ^ MiscVarType ED_OutputType y_lin - - - "" - diff --git a/modules/elastodyn/src/ElastoDyn_Types.f90 b/modules/elastodyn/src/ElastoDyn_Types.f90 index aaaf95a422..6eb00b68c1 100644 --- a/modules/elastodyn/src/ElastoDyn_Types.f90 +++ b/modules/elastodyn/src/ElastoDyn_Types.f90 @@ -33,7 +33,8 @@ MODULE ElastoDyn_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: ED_NMX = 4 ! Used in updating predictor-corrector values (size of state history) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ED_NMX = 4 ! Used in updating predictor-corrector values (size of state history) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ED_u_BlPitchComC = -1 ! DatLoc number for collective blade pitch extended input [-] ! ========= ED_InitInputType ======= TYPE, PUBLIC :: ED_InitInputType CHARACTER(1024) :: InputFile !< Name of the input file [-] @@ -69,22 +70,14 @@ MODULE ElastoDyn_Types REAL(ReKi) :: HubRad = 0.0_ReKi !< Preconed hub radius (distance from the rotor apex to the blade root) [m] REAL(ReKi) :: RotSpeed = 0.0_ReKi !< Initial or fixed rotor speed [rad/s] LOGICAL :: isFixed_GenDOF = .false. !< whether the generator is fixed or free [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_x !< Names of the continuous states used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_y !< Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_x !< Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: DerivOrder_x !< Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_u !< Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) [-] INTEGER(IntKi) :: GearBox_index = 0_IntKi !< Index to gearbox rotation in state array (for steady-state calculations) [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE ED_InitOutputType ! ======================= ! ========= BladeInputData ======= TYPE, PUBLIC :: BladeInputData INTEGER(IntKi) :: NBlInpSt = 0_IntKi !< Number of blade input stations [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlFract !< Blade fractional radius for distributed input data [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PitchAx !< Pitch axis for distributed input data [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: StrcTwst !< Structural twist for distributed input data [radians] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BMassDen !< Blade mass density for distributed input data [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FlpStff !< Blade flap stiffness for distributed input data [-] @@ -111,6 +104,7 @@ MODULE ElastoDyn_Types LOGICAL :: FlapDOF1 = .false. !< First flapwise blade mode DOF [-] LOGICAL :: FlapDOF2 = .false. !< Second flapwise blade mode DOF [-] LOGICAL :: EdgeDOF = .false. !< Edgewise blade mode DOF [-] + LOGICAL :: PitchDOF = .false. !< Blade pitch DOF [-] LOGICAL :: TeetDOF = .false. !< Rotor-teeter DOF [-] LOGICAL :: DrTrDOF = .false. !< Drivetrain rotational-flexibility DOF [-] LOGICAL :: GenDOF = .false. !< Generator DOF [-] @@ -163,8 +157,12 @@ MODULE ElastoDyn_Types REAL(ReKi) :: PtfmCMxt = 0.0_ReKi !< Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform CM [meters] REAL(ReKi) :: PtfmCMyt = 0.0_ReKi !< Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform CM [meters] REAL(ReKi) :: PtfmCMzt = 0.0_ReKi !< Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform CM [meters] + REAL(ReKi) :: PtfmRefxt = 0.0_ReKi !< Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point [meters] + REAL(ReKi) :: PtfmRefyt = 0.0_ReKi !< Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point [meters] REAL(ReKi) :: PtfmRefzt = 0.0_ReKi !< Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point [meters] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TipMass !< Tip-brake masses [kg] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PBrIner !< Pitch bearing inertia about the pitch axis [kg] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPIner !< Blade inertia about the pitch axis [kg] REAL(ReKi) :: HubMass = 0.0_ReKi !< Hub mass [kg] REAL(ReKi) :: HubIner = 0.0_ReKi !< Hub inertia about rotor axis (2 or 3-blader) [kg m^2] REAL(ReKi) :: HubIner_Teeter = 0.0_ReKi !< Hub inertia about teeter axis (2-blader) [kg m^2] @@ -514,7 +512,6 @@ MODULE ElastoDyn_Types REAL(ReKi) :: TFrlMom = 0.0_ReKi !< The total tail-furl spring and damper moment [-] REAL(ReKi) :: RFrlMom = 0.0_ReKi !< The total rotor-furl spring and damper moment [-] REAL(ReKi) :: GBoxEffFac = 0.0_ReKi !< The factor used to apply the gearbox efficiency effects to the equation associated with the generator DOF [-] - REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: rSAerCen !< aerodynamic pitching moment arm (i.e., the position vector from point S on the blade to the aerodynamic center of the element) [-] REAL(ReKi) :: YawFriMom = 0.0_ReKi !< Yaw Friction Moment [kN-m] END TYPE ED_RtHndSide ! ======================= @@ -549,46 +546,6 @@ MODULE ElastoDyn_Types REAL(R8Ki) :: OmegaDotTn = 0.0_R8Ki !< Yaw acceleration at t_n used to calculate friction torque and yaw rate at t_n+1 [rad/s^2] END TYPE ED_OtherStateType ! ======================= -! ========= ED_MiscVarType ======= - TYPE, PUBLIC :: ED_MiscVarType - TYPE(ED_CoordSys) :: CoordSys !< Coordinate systems in the FAST framework [-] - TYPE(ED_RtHndSide) :: RtHS !< Values used in calculating the right-hand-side RtHS (and outputs) [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AllOuts !< An array holding the value of all of the calculated (not only selected) output channels [see OutListParameters.xlsx spreadsheet] - REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: AugMat !< The augmented matrix used for the solution of the QD2T()s [-] - REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: AugMat_factor !< factored version of AugMat matrix [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: SolnVec !< b in the equation Ax=b (last column of AugMat) [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: AugMat_pivot !< Pivot column for AugMat in LAPACK factorization [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: OgnlGeAzRo !< Original DOF_GeAz row in AugMat [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: QD2T !< Solution (acceleration) vector; the first time derivative of QDT [-] - LOGICAL :: IgnoreMod = .false. !< whether to ignore the modulo in ED outputs (necessary for linearization perturbations) [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: OgnlYawRow !< Original DOF_Yaw row in AugMat [-] - REAL(ReKi) , DIMENSION(1:3) :: FrcONcRt = 0.0_ReKi !< Force acting on yaw bearing including inertial contributions [N] - REAL(ReKi) , DIMENSION(1:3) :: MomONcRt = 0.0_ReKi !< Moment acting on yaw bearing including inertial contributions [N-m] - REAL(ReKi) :: YawFriMz = 0.0_ReKi !< External loading on yaw bearing not including inertial contributions [N-m] - END TYPE ED_MiscVarType -! ======================= -! ========= Jac_u_idxStarts ======= - TYPE, PUBLIC :: Jac_u_idxStarts - INTEGER(IntKi) :: BladeLoad = 1 !< Index to first point in y jacobian for BladeLoad [-] - INTEGER(IntKi) :: PlatformLoad = 1 !< Index to first point in y jacobian for PlatformLoad [-] - INTEGER(IntKi) :: TowerLoad = 1 !< Index to first point in y jacobian for TowerLoad [-] - INTEGER(IntKi) :: HubLoad = 1 !< Index to first point in y jacobian for HubLoad [-] - INTEGER(IntKi) :: NacelleLoad = 1 !< Index to first point in y jacobian for NacelleLoad [-] - INTEGER(IntKi) :: TFinLoad = 1 !< Index to first point in y jacobian for TFinLoad [-] - INTEGER(IntKi) :: BlPitchCom = 1 !< Index to first point in y jacobian for BlPitchCom [-] - END TYPE Jac_u_idxStarts -! ======================= -! ========= Jac_y_idxStarts ======= - TYPE, PUBLIC :: Jac_y_idxStarts - INTEGER(IntKi) :: Blade = 1 !< Index to first point in u jacobian for Blade [-] - INTEGER(IntKi) :: Platform = 1 !< Index to first point in u jacobian for Platform [-] - INTEGER(IntKi) :: Tower = 1 !< Index to first point in u jacobian for Tower [-] - INTEGER(IntKi) :: Hub = 1 !< Index to first point in u jacobian for Hub [-] - INTEGER(IntKi) :: BladeRoot = 1 !< Index to first point in u jacobian for BladeRoot [-] - INTEGER(IntKi) :: Nacelle = 1 !< Index to first point in u jacobian for Nacelle [-] - INTEGER(IntKi) :: TFin = 1 !< Index to first point in u jacobian for TFin [-] - END TYPE Jac_y_idxStarts -! ======================= ! ========= ED_ParameterType ======= TYPE, PUBLIC :: ED_ParameterType REAL(DbKi) :: DT = 0.0_R8Ki !< Time step for continuous state integration & discrete state update [seconds] @@ -637,6 +594,8 @@ MODULE ElastoDyn_Types REAL(ReKi) :: NacCMzn = 0.0_ReKi !< Vertical distance from tower-top to nacelle CM [-] REAL(ReKi) :: OverHang = 0.0_ReKi !< Distance from yaw axis to rotor apex or teeter pin [-] REAL(ReKi) :: ProjArea = 0.0_ReKi !< Swept area of the rotor projected onto the rotor plane (the plane normal to the low-speed shaft) [-] + REAL(ReKi) :: PtfmRefxt = 0.0_ReKi !< Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point [-] + REAL(ReKi) :: PtfmRefyt = 0.0_ReKi !< Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point [-] REAL(ReKi) :: PtfmRefzt = 0.0_ReKi !< Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point [-] REAL(ReKi) :: RefTwrHt = 0.0_ReKi !< Vertical distance between FAST's undisplaced tower height (variable TowerHt) and FAST's inertia frame reference point (variable PtfmRef); that is, RefTwrHt = TowerHt - PtfmRefzt [-] REAL(ReKi) , DIMENSION(1:3) :: RFrlPnt_n = 0.0_ReKi !< Vector from tower-top to arbitrary point on rotor-furl axis [-] @@ -656,6 +615,8 @@ MODULE ElastoDyn_Types REAL(ReKi) :: rWJyn = 0.0_ReKi !< yn-component of position vector rWJ [-] REAL(ReKi) :: rWJzn = 0.0_ReKi !< zn-component of position vector rWJ [-] REAL(ReKi) :: rZT0zt = 0.0_ReKi !< zt-component of position vector rZT0 [-] + REAL(ReKi) :: rZYxt = 0.0_ReKi !< xt-component of position vector rZY [-] + REAL(ReKi) :: rZYyt = 0.0_ReKi !< yt-component of position vector rZY [-] REAL(ReKi) :: rZYzt = 0.0_ReKi !< zt-component of position vector rZY [-] REAL(R8Ki) :: SinDel3 = 0.0_R8Ki !< Sine of the Delta-3 angle for teetering rotors [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: SinPreC !< Sines of the precone angles [-] @@ -719,12 +680,12 @@ MODULE ElastoDyn_Types REAL(ReKi) :: TFinMass = 0.0_ReKi !< Tail fin mass [-] REAL(ReKi) :: TFrlIner = 0.0_ReKi !< Tail boom inertia about tail-furl axis [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TipMass !< Tip-brake masses [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PitchIner !< Blade inertia about the pitch axis [-] REAL(ReKi) :: TurbMass = 0.0_ReKi !< Mass of turbine (tower + rotor + nacelle) [-] REAL(ReKi) :: TwrMass = 0.0_ReKi !< Mass of tower [-] REAL(ReKi) :: TwrTpMass = 0.0_ReKi !< Tower-top mass (rotor + nacelle) [-] REAL(ReKi) :: YawBrMass = 0.0_ReKi !< Yaw bearing mass [-] REAL(ReKi) :: Gravity = 0.0_ReKi !< Gravitational acceleration [m/s^2] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PitchAxis !< Pitch axis for analysis nodes [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AeroTwst !< Aerodynamic twist of the blade at the analysis nodes [-] REAL(ReKi) , DIMENSION(:,:,:,:), ALLOCATABLE :: AxRedBld !< The axial-reduction terms of the blade shape function [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BldEDamp !< Blade edgewise damping coefficients [-] @@ -742,8 +703,6 @@ MODULE ElastoDyn_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: MassB !< Interpolated lineal blade mass density [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: RNodes !< Radius to analysis nodes relative to hub ( 0 < RNodes(:) < BldFlexL ) [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: RNodesNorm !< Normalized radius to analysis nodes relative to hub ( 0 < RNodesNorm(:) < 1 ) [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: rSAerCenn1 !< Distance from point S on a blade to the aerodynamic center in the n1 direction (m) [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: rSAerCenn2 !< Distance from point S on a blade to the aerodynamic center in the n2 direction (m) [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: SAeroTwst !< Sine of the aerodynamic twist of the blade at the analysis nodes [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: StiffBE !< Interpolated edgewise blade stiffness [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: StiffBF !< Interpolated flapwise blade stiffness [-] @@ -818,18 +777,7 @@ MODULE ElastoDyn_Types INTEGER(IntKi) :: BldNd_TotNumOuts = 0_IntKi !< Total number of requested output channels of blade node information (BldNd_NumOuts * BldNd_BlOutNd * BldNd_BladesOut -- ED_AllBldNdOuts) [-] TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: BldNd_OutParam !< Names and units (and other characteristics) of all requested output parameters [-] INTEGER(IntKi) :: BldNd_BladesOut = 0_IntKi !< The blades to output (ED_AllBldNdOuts) [-] - TYPE(Jac_u_idxStarts) :: Jac_u_idxStartList !< Starting indices for all Jac_u compenents [-] - TYPE(Jac_y_idxStarts) :: Jac_y_idxStartList !< Starting indices for all Jac_u compenents [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: du !< vector that determines size of perturbation for u (inputs) [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: dx !< vector that determines size of perturbation for x (continuous states) [-] - INTEGER(IntKi) :: Jac_ny = 0_IntKi !< number of outputs in jacobian matrix [-] LOGICAL :: CompAeroMaps = .false. !< number of outputs in jacobian matrix [-] - INTEGER(IntKi) :: NumExtendedInputs = 0_IntKi !< number of extended inputs for linearization [-] - INTEGER(IntKi) :: NumBl_Lin = 0_IntKi !< number of blades in the jacobian [-] - INTEGER(IntKi) :: NActvVelDOF_Lin = 0_IntKi !< number of velocity states in the jacobian [-] - INTEGER(IntKi) :: NActvDOF_Lin = 0_IntKi !< number of active DOFs to use in the jacobian [-] - INTEGER(IntKi) :: NActvDOF_Stride = 0_IntKi !< stride for active DOFs to use in the jacobian [-] END TYPE ED_ParameterType ! ======================= ! ========= ED_InputType ======= @@ -837,12 +785,14 @@ MODULE ElastoDyn_Types TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladePtLoads !< A mesh on each blade, containing aerodynamic forces and moments (formerly AeroBladeForce and AeroBladeMoment) [-] TYPE(MeshType) :: PlatformPtMesh !< A mesh at the platform reference (point Z), containing force: surge/xi (1), sway/yi (2), and heave/zi (3)-components; and moments: roll/xi (1), pitch/yi (2), and yaw/zi (3)-components acting at the platform (body X) / platform reference (point Z) associated with everything but the QD2T()s [N] TYPE(MeshType) :: TowerPtLoads !< Tower line2 mesh with forces: surge/xi (1), sway/yi (2), and heave/zi (3)-components of the portion of the tower force at the current tower node (point T); and moments: roll/xi (1), pitch/yi (2), and yaw/zi (3)-components of the portion of the tower moment acting at the current tower node [N/m] + TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeRootLoads !< For BeamDyn: loads at the blade roots [-] TYPE(MeshType) :: HubPtLoad !< A mesh at the teeter pin, containing forces: surge/xi (1), sway/yi (2), and heave/zi (3)-components; and moments: roll/xi (1), pitch/yi (2), and yaw/zi (3)-components acting at the hub. Passed from BeamDyn [-] TYPE(MeshType) :: NacelleLoads !< From ServoDyn/TMD: loads on the nacelle. [-] TYPE(MeshType) :: TFinCMLoads !< Aerodynamic forces and moments at the tail-fin center of mass point (point J) [-] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: TwrAddedMass !< 6-by-6 added mass matrix of the tower elements, per unit length-bjj: place on a mesh [per unit length] REAL(ReKi) , DIMENSION(1:6,1:6) :: PtfmAddedMass = 0.0_ReKi !< Platform added mass matrix [kg, kg-m, kg-m^2] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPitchCom !< Commanded blade pitch angles [radians] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPitchMom !< Blade pitch motor torque [N-m] REAL(ReKi) :: YawMom = 0.0_ReKi !< Torque transmitted through the yaw bearing [N-m] REAL(ReKi) :: GenTrq = 0.0_ReKi !< Electrical generator torque [N-m] REAL(ReKi) :: HSSBrTrqC = 0.0_ReKi !< Commanded HSS brake torque [N-m] @@ -859,6 +809,7 @@ MODULE ElastoDyn_Types TYPE(MeshType) :: TFinCMMotion !< For AeroDyn: motions of the tail find CM point (point J) [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Data to be written to an output file: see WriteOutputHdr for names of each variable [see WriteOutputUnt] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPitch !< Current blade pitch angles [radians] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPRate !< Current blade pitch rate [rad/s] REAL(ReKi) :: Yaw = 0.0_ReKi !< Current nacelle yaw [radians] REAL(ReKi) :: YawRate = 0.0_ReKi !< Current nacelle yaw rate [rad/s] REAL(ReKi) :: LSS_Spd = 0.0_ReKi !< Low-speed shaft (LSS) speed at entrance to gearbox [rad/s] @@ -887,7 +838,83 @@ MODULE ElastoDyn_Types REAL(ReKi) :: LSShftFzs = 0.0_ReKi !< Nonrotating low-speed shaft force z [N] END TYPE ED_OutputType ! ======================= -CONTAINS +! ========= ED_MiscVarType ======= + TYPE, PUBLIC :: ED_MiscVarType + TYPE(ED_CoordSys) :: CoordSys !< Coordinate systems in the FAST framework [-] + TYPE(ED_RtHndSide) :: RtHS !< Values used in calculating the right-hand-side RtHS (and outputs) [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AllOuts !< An array holding the value of all of the calculated (not only selected) output channels [see OutListParameters.xlsx spreadsheet] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: AugMat !< The augmented matrix used for the solution of the QD2T()s [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: AugMat_factor !< factored version of AugMat matrix [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: SolnVec !< b in the equation Ax=b (last column of AugMat) [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: AugMat_pivot !< Pivot column for AugMat in LAPACK factorization [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: OgnlGeAzRo !< Original DOF_GeAz row in AugMat [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: QD2T !< Solution (acceleration) vector; the first time derivative of QDT [-] + LOGICAL :: IgnoreMod = .false. !< whether to ignore the modulo in ED outputs (necessary for linearization perturbations) [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: OgnlYawRow !< Original DOF_Yaw row in AugMat [-] + REAL(ReKi) , DIMENSION(1:3) :: FrcONcRt = 0.0_ReKi !< Force acting on yaw bearing including inertial contributions [N] + REAL(ReKi) , DIMENSION(1:3) :: MomONcRt = 0.0_ReKi !< Moment acting on yaw bearing including inertial contributions [N-m] + REAL(ReKi) :: YawFriMz = 0.0_ReKi !< External loading on yaw bearing not including inertial contributions [N-m] + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] + TYPE(ED_ContinuousStateType) :: x_perturb !< [-] + TYPE(ED_ContinuousStateType) :: dxdt_lin !< [-] + TYPE(ED_InputType) :: u_perturb !< [-] + TYPE(ED_OutputType) :: y_lin !< [-] + END TYPE ED_MiscVarType +! ======================= + integer(IntKi), public, parameter :: ED_x_QT = 1 ! ED%QT + integer(IntKi), public, parameter :: ED_x_QDT = 2 ! ED%QDT + integer(IntKi), public, parameter :: ED_u_BladePtLoads = 3 ! ED%BladePtLoads(DL%i1) + integer(IntKi), public, parameter :: ED_u_PlatformPtMesh = 4 ! ED%PlatformPtMesh + integer(IntKi), public, parameter :: ED_u_TowerPtLoads = 5 ! ED%TowerPtLoads + integer(IntKi), public, parameter :: ED_u_BladeRootLoads = 6 ! ED%BladeRootLoads(DL%i1) + integer(IntKi), public, parameter :: ED_u_HubPtLoad = 7 ! ED%HubPtLoad + integer(IntKi), public, parameter :: ED_u_NacelleLoads = 8 ! ED%NacelleLoads + integer(IntKi), public, parameter :: ED_u_TFinCMLoads = 9 ! ED%TFinCMLoads + integer(IntKi), public, parameter :: ED_u_TwrAddedMass = 10 ! ED%TwrAddedMass + integer(IntKi), public, parameter :: ED_u_PtfmAddedMass = 11 ! ED%PtfmAddedMass + integer(IntKi), public, parameter :: ED_u_BlPitchCom = 12 ! ED%BlPitchCom + integer(IntKi), public, parameter :: ED_u_BlPitchMom = 13 ! ED%BlPitchMom + integer(IntKi), public, parameter :: ED_u_YawMom = 14 ! ED%YawMom + integer(IntKi), public, parameter :: ED_u_GenTrq = 15 ! ED%GenTrq + integer(IntKi), public, parameter :: ED_u_HSSBrTrqC = 16 ! ED%HSSBrTrqC + integer(IntKi), public, parameter :: ED_y_BladeLn2Mesh = 17 ! ED%BladeLn2Mesh(DL%i1) + integer(IntKi), public, parameter :: ED_y_PlatformPtMesh = 18 ! ED%PlatformPtMesh + integer(IntKi), public, parameter :: ED_y_TowerLn2Mesh = 19 ! ED%TowerLn2Mesh + integer(IntKi), public, parameter :: ED_y_HubPtMotion = 20 ! ED%HubPtMotion + integer(IntKi), public, parameter :: ED_y_BladeRootMotion = 21 ! ED%BladeRootMotion(DL%i1) + integer(IntKi), public, parameter :: ED_y_NacelleMotion = 22 ! ED%NacelleMotion + integer(IntKi), public, parameter :: ED_y_TFinCMMotion = 23 ! ED%TFinCMMotion + integer(IntKi), public, parameter :: ED_y_WriteOutput = 24 ! ED%WriteOutput + integer(IntKi), public, parameter :: ED_y_BlPitch = 25 ! ED%BlPitch + integer(IntKi), public, parameter :: ED_y_BlPRate = 26 ! ED%BlPRate + integer(IntKi), public, parameter :: ED_y_Yaw = 27 ! ED%Yaw + integer(IntKi), public, parameter :: ED_y_YawRate = 28 ! ED%YawRate + integer(IntKi), public, parameter :: ED_y_LSS_Spd = 29 ! ED%LSS_Spd + integer(IntKi), public, parameter :: ED_y_HSS_Spd = 30 ! ED%HSS_Spd + integer(IntKi), public, parameter :: ED_y_RotSpeed = 31 ! ED%RotSpeed + integer(IntKi), public, parameter :: ED_y_TwrAccel = 32 ! ED%TwrAccel + integer(IntKi), public, parameter :: ED_y_YawAngle = 33 ! ED%YawAngle + integer(IntKi), public, parameter :: ED_y_RootMyc = 34 ! ED%RootMyc + integer(IntKi), public, parameter :: ED_y_YawBrTAxp = 35 ! ED%YawBrTAxp + integer(IntKi), public, parameter :: ED_y_YawBrTAyp = 36 ! ED%YawBrTAyp + integer(IntKi), public, parameter :: ED_y_LSSTipPxa = 37 ! ED%LSSTipPxa + integer(IntKi), public, parameter :: ED_y_RootMxc = 38 ! ED%RootMxc + integer(IntKi), public, parameter :: ED_y_LSSTipMxa = 39 ! ED%LSSTipMxa + integer(IntKi), public, parameter :: ED_y_LSSTipMya = 40 ! ED%LSSTipMya + integer(IntKi), public, parameter :: ED_y_LSSTipMza = 41 ! ED%LSSTipMza + integer(IntKi), public, parameter :: ED_y_LSSTipMys = 42 ! ED%LSSTipMys + integer(IntKi), public, parameter :: ED_y_LSSTipMzs = 43 ! ED%LSSTipMzs + integer(IntKi), public, parameter :: ED_y_YawBrMyn = 44 ! ED%YawBrMyn + integer(IntKi), public, parameter :: ED_y_YawBrMzn = 45 ! ED%YawBrMzn + integer(IntKi), public, parameter :: ED_y_NcIMURAxs = 46 ! ED%NcIMURAxs + integer(IntKi), public, parameter :: ED_y_NcIMURAys = 47 ! ED%NcIMURAys + integer(IntKi), public, parameter :: ED_y_NcIMURAzs = 48 ! ED%NcIMURAzs + integer(IntKi), public, parameter :: ED_y_RotPwr = 49 ! ED%RotPwr + integer(IntKi), public, parameter :: ED_y_LSShftFxa = 50 ! ED%LSShftFxa + integer(IntKi), public, parameter :: ED_y_LSShftFys = 51 ! ED%LSShftFys + integer(IntKi), public, parameter :: ED_y_LSShftFzs = 52 ! ED%LSShftFzs + +contains subroutine ED_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(ED_InitInputType), intent(in) :: SrcInitInputData @@ -1042,103 +1069,10 @@ subroutine ED_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, Err DstInitOutputData%HubRad = SrcInitOutputData%HubRad DstInitOutputData%RotSpeed = SrcInitOutputData%RotSpeed DstInitOutputData%isFixed_GenDOF = SrcInitOutputData%isFixed_GenDOF - if (allocated(SrcInitOutputData%LinNames_y)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_y) - UB(1:1) = ubound(SrcInitOutputData%LinNames_y) - if (.not. allocated(DstInitOutputData%LinNames_y)) then - allocate(DstInitOutputData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_y = SrcInitOutputData%LinNames_y - end if - if (allocated(SrcInitOutputData%LinNames_x)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_x) - UB(1:1) = ubound(SrcInitOutputData%LinNames_x) - if (.not. allocated(DstInitOutputData%LinNames_x)) then - allocate(DstInitOutputData%LinNames_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_x = SrcInitOutputData%LinNames_x - end if - if (allocated(SrcInitOutputData%LinNames_u)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_u) - UB(1:1) = ubound(SrcInitOutputData%LinNames_u) - if (.not. allocated(DstInitOutputData%LinNames_u)) then - allocate(DstInitOutputData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_u = SrcInitOutputData%LinNames_u - end if - if (allocated(SrcInitOutputData%RotFrame_y)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_y) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_y) - if (.not. allocated(DstInitOutputData%RotFrame_y)) then - allocate(DstInitOutputData%RotFrame_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_y = SrcInitOutputData%RotFrame_y - end if - if (allocated(SrcInitOutputData%RotFrame_x)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_x) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_x) - if (.not. allocated(DstInitOutputData%RotFrame_x)) then - allocate(DstInitOutputData%RotFrame_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_x = SrcInitOutputData%RotFrame_x - end if - if (allocated(SrcInitOutputData%DerivOrder_x)) then - LB(1:1) = lbound(SrcInitOutputData%DerivOrder_x) - UB(1:1) = ubound(SrcInitOutputData%DerivOrder_x) - if (.not. allocated(DstInitOutputData%DerivOrder_x)) then - allocate(DstInitOutputData%DerivOrder_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%DerivOrder_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%DerivOrder_x = SrcInitOutputData%DerivOrder_x - end if - if (allocated(SrcInitOutputData%RotFrame_u)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_u) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_u) - if (.not. allocated(DstInitOutputData%RotFrame_u)) then - allocate(DstInitOutputData%RotFrame_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_u = SrcInitOutputData%RotFrame_u - end if - if (allocated(SrcInitOutputData%IsLoad_u)) then - LB(1:1) = lbound(SrcInitOutputData%IsLoad_u) - UB(1:1) = ubound(SrcInitOutputData%IsLoad_u) - if (.not. allocated(DstInitOutputData%IsLoad_u)) then - allocate(DstInitOutputData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%IsLoad_u = SrcInitOutputData%IsLoad_u - end if DstInitOutputData%GearBox_index = SrcInitOutputData%GearBox_index + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine ED_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -1167,30 +1101,8 @@ subroutine ED_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) if (allocated(InitOutputData%TwrHNodes)) then deallocate(InitOutputData%TwrHNodes) end if - if (allocated(InitOutputData%LinNames_y)) then - deallocate(InitOutputData%LinNames_y) - end if - if (allocated(InitOutputData%LinNames_x)) then - deallocate(InitOutputData%LinNames_x) - end if - if (allocated(InitOutputData%LinNames_u)) then - deallocate(InitOutputData%LinNames_u) - end if - if (allocated(InitOutputData%RotFrame_y)) then - deallocate(InitOutputData%RotFrame_y) - end if - if (allocated(InitOutputData%RotFrame_x)) then - deallocate(InitOutputData%RotFrame_x) - end if - if (allocated(InitOutputData%DerivOrder_x)) then - deallocate(InitOutputData%DerivOrder_x) - end if - if (allocated(InitOutputData%RotFrame_u)) then - deallocate(InitOutputData%RotFrame_u) - end if - if (allocated(InitOutputData%IsLoad_u)) then - deallocate(InitOutputData%IsLoad_u) - end if + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine ED_PackInitOutput(RF, Indata) @@ -1217,15 +1129,8 @@ subroutine ED_PackInitOutput(RF, Indata) call RegPack(RF, InData%HubRad) call RegPack(RF, InData%RotSpeed) call RegPack(RF, InData%isFixed_GenDOF) - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_x) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%RotFrame_y) - call RegPackAlloc(RF, InData%RotFrame_x) - call RegPackAlloc(RF, InData%DerivOrder_x) - call RegPackAlloc(RF, InData%RotFrame_u) - call RegPackAlloc(RF, InData%IsLoad_u) call RegPack(RF, InData%GearBox_index) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1256,15 +1161,8 @@ subroutine ED_UnPackInitOutput(RF, OutData) call RegUnpack(RF, OutData%HubRad); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%isFixed_GenDOF); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DerivOrder_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GearBox_index); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine ED_CopyBladeInputData(SrcBladeInputDataData, DstBladeInputDataData, CtrlCode, ErrStat, ErrMsg) @@ -1291,18 +1189,6 @@ subroutine ED_CopyBladeInputData(SrcBladeInputDataData, DstBladeInputDataData, C end if DstBladeInputDataData%BlFract = SrcBladeInputDataData%BlFract end if - if (allocated(SrcBladeInputDataData%PitchAx)) then - LB(1:1) = lbound(SrcBladeInputDataData%PitchAx) - UB(1:1) = ubound(SrcBladeInputDataData%PitchAx) - if (.not. allocated(DstBladeInputDataData%PitchAx)) then - allocate(DstBladeInputDataData%PitchAx(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBladeInputDataData%PitchAx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstBladeInputDataData%PitchAx = SrcBladeInputDataData%PitchAx - end if if (allocated(SrcBladeInputDataData%StrcTwst)) then LB(1:1) = lbound(SrcBladeInputDataData%StrcTwst) UB(1:1) = ubound(SrcBladeInputDataData%StrcTwst) @@ -1402,9 +1288,6 @@ subroutine ED_DestroyBladeInputData(BladeInputDataData, ErrStat, ErrMsg) if (allocated(BladeInputDataData%BlFract)) then deallocate(BladeInputDataData%BlFract) end if - if (allocated(BladeInputDataData%PitchAx)) then - deallocate(BladeInputDataData%PitchAx) - end if if (allocated(BladeInputDataData%StrcTwst)) then deallocate(BladeInputDataData%StrcTwst) end if @@ -1435,7 +1318,6 @@ subroutine ED_PackBladeInputData(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%NBlInpSt) call RegPackAlloc(RF, InData%BlFract) - call RegPackAlloc(RF, InData%PitchAx) call RegPackAlloc(RF, InData%StrcTwst) call RegPackAlloc(RF, InData%BMassDen) call RegPackAlloc(RF, InData%FlpStff) @@ -1459,7 +1341,6 @@ subroutine ED_UnPackBladeInputData(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%NBlInpSt); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BlFract); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%PitchAx); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%StrcTwst); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BMassDen); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%FlpStff); if (RegCheckErr(RF, RoutineName)) return @@ -1583,6 +1464,7 @@ subroutine ED_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSta DstInputFileData%FlapDOF1 = SrcInputFileData%FlapDOF1 DstInputFileData%FlapDOF2 = SrcInputFileData%FlapDOF2 DstInputFileData%EdgeDOF = SrcInputFileData%EdgeDOF + DstInputFileData%PitchDOF = SrcInputFileData%PitchDOF DstInputFileData%TeetDOF = SrcInputFileData%TeetDOF DstInputFileData%DrTrDOF = SrcInputFileData%DrTrDOF DstInputFileData%GenDOF = SrcInputFileData%GenDOF @@ -1657,6 +1539,8 @@ subroutine ED_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSta DstInputFileData%PtfmCMxt = SrcInputFileData%PtfmCMxt DstInputFileData%PtfmCMyt = SrcInputFileData%PtfmCMyt DstInputFileData%PtfmCMzt = SrcInputFileData%PtfmCMzt + DstInputFileData%PtfmRefxt = SrcInputFileData%PtfmRefxt + DstInputFileData%PtfmRefyt = SrcInputFileData%PtfmRefyt DstInputFileData%PtfmRefzt = SrcInputFileData%PtfmRefzt if (allocated(SrcInputFileData%TipMass)) then LB(1:1) = lbound(SrcInputFileData%TipMass) @@ -1670,6 +1554,30 @@ subroutine ED_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSta end if DstInputFileData%TipMass = SrcInputFileData%TipMass end if + if (allocated(SrcInputFileData%PBrIner)) then + LB(1:1) = lbound(SrcInputFileData%PBrIner) + UB(1:1) = ubound(SrcInputFileData%PBrIner) + if (.not. allocated(DstInputFileData%PBrIner)) then + allocate(DstInputFileData%PBrIner(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PBrIner.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%PBrIner = SrcInputFileData%PBrIner + end if + if (allocated(SrcInputFileData%BlPIner)) then + LB(1:1) = lbound(SrcInputFileData%BlPIner) + UB(1:1) = ubound(SrcInputFileData%BlPIner) + if (.not. allocated(DstInputFileData%BlPIner)) then + allocate(DstInputFileData%BlPIner(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%BlPIner.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%BlPIner = SrcInputFileData%BlPIner + end if DstInputFileData%HubMass = SrcInputFileData%HubMass DstInputFileData%HubIner = SrcInputFileData%HubIner DstInputFileData%HubIner_Teeter = SrcInputFileData%HubIner_Teeter @@ -1970,6 +1878,12 @@ subroutine ED_DestroyInputFile(InputFileData, ErrStat, ErrMsg) if (allocated(InputFileData%TipMass)) then deallocate(InputFileData%TipMass) end if + if (allocated(InputFileData%PBrIner)) then + deallocate(InputFileData%PBrIner) + end if + if (allocated(InputFileData%BlPIner)) then + deallocate(InputFileData%BlPIner) + end if if (allocated(InputFileData%InpBlMesh)) then LB(1:1) = lbound(InputFileData%InpBlMesh) UB(1:1) = ubound(InputFileData%InpBlMesh) @@ -2037,6 +1951,7 @@ subroutine ED_PackInputFile(RF, Indata) call RegPack(RF, InData%FlapDOF1) call RegPack(RF, InData%FlapDOF2) call RegPack(RF, InData%EdgeDOF) + call RegPack(RF, InData%PitchDOF) call RegPack(RF, InData%TeetDOF) call RegPack(RF, InData%DrTrDOF) call RegPack(RF, InData%GenDOF) @@ -2089,8 +2004,12 @@ subroutine ED_PackInputFile(RF, Indata) call RegPack(RF, InData%PtfmCMxt) call RegPack(RF, InData%PtfmCMyt) call RegPack(RF, InData%PtfmCMzt) + call RegPack(RF, InData%PtfmRefxt) + call RegPack(RF, InData%PtfmRefyt) call RegPack(RF, InData%PtfmRefzt) call RegPackAlloc(RF, InData%TipMass) + call RegPackAlloc(RF, InData%PBrIner) + call RegPackAlloc(RF, InData%BlPIner) call RegPack(RF, InData%HubMass) call RegPack(RF, InData%HubIner) call RegPack(RF, InData%HubIner_Teeter) @@ -2239,6 +2158,7 @@ subroutine ED_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%FlapDOF1); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%FlapDOF2); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%EdgeDOF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PitchDOF); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TeetDOF); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DrTrDOF); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GenDOF); if (RegCheckErr(RF, RoutineName)) return @@ -2291,8 +2211,12 @@ subroutine ED_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%PtfmCMxt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmCMyt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmCMzt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmRefxt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmRefyt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmRefzt); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%TipMass); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PBrIner); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HubMass); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HubIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HubIner_Teeter); if (RegCheckErr(RF, RoutineName)) return @@ -4115,18 +4039,6 @@ subroutine ED_CopyRtHndSide(SrcRtHndSideData, DstRtHndSideData, CtrlCode, ErrSta DstRtHndSideData%TFrlMom = SrcRtHndSideData%TFrlMom DstRtHndSideData%RFrlMom = SrcRtHndSideData%RFrlMom DstRtHndSideData%GBoxEffFac = SrcRtHndSideData%GBoxEffFac - if (allocated(SrcRtHndSideData%rSAerCen)) then - LB(1:3) = lbound(SrcRtHndSideData%rSAerCen) - UB(1:3) = ubound(SrcRtHndSideData%rSAerCen) - if (.not. allocated(DstRtHndSideData%rSAerCen)) then - allocate(DstRtHndSideData%rSAerCen(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstRtHndSideData%rSAerCen.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstRtHndSideData%rSAerCen = SrcRtHndSideData%rSAerCen - end if DstRtHndSideData%YawFriMom = SrcRtHndSideData%YawFriMom end subroutine @@ -4341,9 +4253,6 @@ subroutine ED_DestroyRtHndSide(RtHndSideData, ErrStat, ErrMsg) if (allocated(RtHndSideData%PMomXAll)) then deallocate(RtHndSideData%PMomXAll) end if - if (allocated(RtHndSideData%rSAerCen)) then - deallocate(RtHndSideData%rSAerCen) - end if end subroutine subroutine ED_PackRtHndSide(RF, Indata) @@ -4493,7 +4402,6 @@ subroutine ED_PackRtHndSide(RF, Indata) call RegPack(RF, InData%TFrlMom) call RegPack(RF, InData%RFrlMom) call RegPack(RF, InData%GBoxEffFac) - call RegPackAlloc(RF, InData%rSAerCen) call RegPack(RF, InData%YawFriMom) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -4648,7 +4556,6 @@ subroutine ED_UnPackRtHndSide(RF, OutData) call RegUnpack(RF, OutData%TFrlMom); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RFrlMom); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GBoxEffFac); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%rSAerCen); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%YawFriMom); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -4918,431 +4825,114 @@ subroutine ED_UnPackOtherState(RF, OutData) call RegUnpack(RF, OutData%OmegaDotTn); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine ED_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(ED_MiscVarType), intent(in) :: SrcMiscData - type(ED_MiscVarType), intent(inout) :: DstMiscData +subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) + type(ED_ParameterType), intent(in) :: SrcParamData + type(ED_ParameterType), intent(inout) :: DstParamData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1, i2, i3, i4, i5 + integer(B4Ki) :: LB(5), UB(5) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'ED_CopyMisc' + character(*), parameter :: RoutineName = 'ED_CopyParam' ErrStat = ErrID_None ErrMsg = '' - call ED_CopyCoordSys(SrcMiscData%CoordSys, DstMiscData%CoordSys, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ED_CopyRtHndSide(SrcMiscData%RtHS, DstMiscData%RtHS, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcMiscData%AllOuts)) then - LB(1:1) = lbound(SrcMiscData%AllOuts) - UB(1:1) = ubound(SrcMiscData%AllOuts) - if (.not. allocated(DstMiscData%AllOuts)) then - allocate(DstMiscData%AllOuts(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AllOuts.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%AllOuts = SrcMiscData%AllOuts - end if - if (allocated(SrcMiscData%AugMat)) then - LB(1:2) = lbound(SrcMiscData%AugMat) - UB(1:2) = ubound(SrcMiscData%AugMat) - if (.not. allocated(DstMiscData%AugMat)) then - allocate(DstMiscData%AugMat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + DstParamData%DT = SrcParamData%DT + DstParamData%DT24 = SrcParamData%DT24 + DstParamData%BldNodes = SrcParamData%BldNodes + DstParamData%TipNode = SrcParamData%TipNode + DstParamData%NDOF = SrcParamData%NDOF + DstParamData%TwoPiNB = SrcParamData%TwoPiNB + DstParamData%NAug = SrcParamData%NAug + DstParamData%NPH = SrcParamData%NPH + if (allocated(SrcParamData%PH)) then + LB(1:1) = lbound(SrcParamData%PH) + UB(1:1) = ubound(SrcParamData%PH) + if (.not. allocated(DstParamData%PH)) then + allocate(DstParamData%PH(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AugMat.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PH.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%AugMat = SrcMiscData%AugMat + DstParamData%PH = SrcParamData%PH end if - if (allocated(SrcMiscData%AugMat_factor)) then - LB(1:2) = lbound(SrcMiscData%AugMat_factor) - UB(1:2) = ubound(SrcMiscData%AugMat_factor) - if (.not. allocated(DstMiscData%AugMat_factor)) then - allocate(DstMiscData%AugMat_factor(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + DstParamData%NPM = SrcParamData%NPM + if (allocated(SrcParamData%PM)) then + LB(1:2) = lbound(SrcParamData%PM) + UB(1:2) = ubound(SrcParamData%PM) + if (.not. allocated(DstParamData%PM)) then + allocate(DstParamData%PM(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AugMat_factor.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PM.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%AugMat_factor = SrcMiscData%AugMat_factor + DstParamData%PM = SrcParamData%PM end if - if (allocated(SrcMiscData%SolnVec)) then - LB(1:1) = lbound(SrcMiscData%SolnVec) - UB(1:1) = ubound(SrcMiscData%SolnVec) - if (.not. allocated(DstMiscData%SolnVec)) then - allocate(DstMiscData%SolnVec(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%DOF_Flag)) then + LB(1:1) = lbound(SrcParamData%DOF_Flag) + UB(1:1) = ubound(SrcParamData%DOF_Flag) + if (.not. allocated(DstParamData%DOF_Flag)) then + allocate(DstParamData%DOF_Flag(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%SolnVec.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DOF_Flag.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%SolnVec = SrcMiscData%SolnVec + DstParamData%DOF_Flag = SrcParamData%DOF_Flag end if - if (allocated(SrcMiscData%AugMat_pivot)) then - LB(1:1) = lbound(SrcMiscData%AugMat_pivot) - UB(1:1) = ubound(SrcMiscData%AugMat_pivot) - if (.not. allocated(DstMiscData%AugMat_pivot)) then - allocate(DstMiscData%AugMat_pivot(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%DOF_Desc)) then + LB(1:1) = lbound(SrcParamData%DOF_Desc) + UB(1:1) = ubound(SrcParamData%DOF_Desc) + if (.not. allocated(DstParamData%DOF_Desc)) then + allocate(DstParamData%DOF_Desc(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AugMat_pivot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DOF_Desc.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%AugMat_pivot = SrcMiscData%AugMat_pivot + DstParamData%DOF_Desc = SrcParamData%DOF_Desc end if - if (allocated(SrcMiscData%OgnlGeAzRo)) then - LB(1:1) = lbound(SrcMiscData%OgnlGeAzRo) - UB(1:1) = ubound(SrcMiscData%OgnlGeAzRo) - if (.not. allocated(DstMiscData%OgnlGeAzRo)) then - allocate(DstMiscData%OgnlGeAzRo(LB(1):UB(1)), stat=ErrStat2) + call ED_CopyActiveDOFs(SrcParamData%DOFs, DstParamData%DOFs, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstParamData%NumOuts = SrcParamData%NumOuts + DstParamData%OutFmt = SrcParamData%OutFmt + DstParamData%NBlGages = SrcParamData%NBlGages + DstParamData%NTwGages = SrcParamData%NTwGages + if (allocated(SrcParamData%OutParam)) then + LB(1:1) = lbound(SrcParamData%OutParam) + UB(1:1) = ubound(SrcParamData%OutParam) + if (.not. allocated(DstParamData%OutParam)) then + allocate(DstParamData%OutParam(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%OgnlGeAzRo.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%OgnlGeAzRo = SrcMiscData%OgnlGeAzRo + do i1 = LB(1), UB(1) + call NWTC_Library_CopyOutParmType(SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcMiscData%QD2T)) then - LB(1:1) = lbound(SrcMiscData%QD2T) - UB(1:1) = ubound(SrcMiscData%QD2T) - if (.not. allocated(DstMiscData%QD2T)) then - allocate(DstMiscData%QD2T(LB(1):UB(1)), stat=ErrStat2) + DstParamData%Delim = SrcParamData%Delim + DstParamData%AvgNrmTpRd = SrcParamData%AvgNrmTpRd + DstParamData%AzimB1Up = SrcParamData%AzimB1Up + DstParamData%CosDel3 = SrcParamData%CosDel3 + if (allocated(SrcParamData%CosPreC)) then + LB(1:1) = lbound(SrcParamData%CosPreC) + UB(1:1) = ubound(SrcParamData%CosPreC) + if (.not. allocated(DstParamData%CosPreC)) then + allocate(DstParamData%CosPreC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%QD2T.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CosPreC.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%QD2T = SrcMiscData%QD2T - end if - DstMiscData%IgnoreMod = SrcMiscData%IgnoreMod - if (allocated(SrcMiscData%OgnlYawRow)) then - LB(1:1) = lbound(SrcMiscData%OgnlYawRow) - UB(1:1) = ubound(SrcMiscData%OgnlYawRow) - if (.not. allocated(DstMiscData%OgnlYawRow)) then - allocate(DstMiscData%OgnlYawRow(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%OgnlYawRow.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%OgnlYawRow = SrcMiscData%OgnlYawRow - end if - DstMiscData%FrcONcRt = SrcMiscData%FrcONcRt - DstMiscData%MomONcRt = SrcMiscData%MomONcRt - DstMiscData%YawFriMz = SrcMiscData%YawFriMz -end subroutine - -subroutine ED_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(ED_MiscVarType), intent(inout) :: MiscData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'ED_DestroyMisc' - ErrStat = ErrID_None - ErrMsg = '' - call ED_DestroyCoordSys(MiscData%CoordSys, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ED_DestroyRtHndSide(MiscData%RtHS, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MiscData%AllOuts)) then - deallocate(MiscData%AllOuts) - end if - if (allocated(MiscData%AugMat)) then - deallocate(MiscData%AugMat) - end if - if (allocated(MiscData%AugMat_factor)) then - deallocate(MiscData%AugMat_factor) - end if - if (allocated(MiscData%SolnVec)) then - deallocate(MiscData%SolnVec) - end if - if (allocated(MiscData%AugMat_pivot)) then - deallocate(MiscData%AugMat_pivot) - end if - if (allocated(MiscData%OgnlGeAzRo)) then - deallocate(MiscData%OgnlGeAzRo) - end if - if (allocated(MiscData%QD2T)) then - deallocate(MiscData%QD2T) - end if - if (allocated(MiscData%OgnlYawRow)) then - deallocate(MiscData%OgnlYawRow) - end if -end subroutine - -subroutine ED_PackMisc(RF, Indata) - type(RegFile), intent(inout) :: RF - type(ED_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'ED_PackMisc' - if (RF%ErrStat >= AbortErrLev) return - call ED_PackCoordSys(RF, InData%CoordSys) - call ED_PackRtHndSide(RF, InData%RtHS) - call RegPackAlloc(RF, InData%AllOuts) - call RegPackAlloc(RF, InData%AugMat) - call RegPackAlloc(RF, InData%AugMat_factor) - call RegPackAlloc(RF, InData%SolnVec) - call RegPackAlloc(RF, InData%AugMat_pivot) - call RegPackAlloc(RF, InData%OgnlGeAzRo) - call RegPackAlloc(RF, InData%QD2T) - call RegPack(RF, InData%IgnoreMod) - call RegPackAlloc(RF, InData%OgnlYawRow) - call RegPack(RF, InData%FrcONcRt) - call RegPack(RF, InData%MomONcRt) - call RegPack(RF, InData%YawFriMz) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine ED_UnPackMisc(RF, OutData) - type(RegFile), intent(inout) :: RF - type(ED_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'ED_UnPackMisc' - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call ED_UnpackCoordSys(RF, OutData%CoordSys) ! CoordSys - call ED_UnpackRtHndSide(RF, OutData%RtHS) ! RtHS - call RegUnpackAlloc(RF, OutData%AllOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AugMat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AugMat_factor); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%SolnVec); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AugMat_pivot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%OgnlGeAzRo); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%QD2T); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%IgnoreMod); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%OgnlYawRow); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%FrcONcRt); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%MomONcRt); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawFriMz); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine ED_CopyJac_u_idxStarts(SrcJac_u_idxStartsData, DstJac_u_idxStartsData, CtrlCode, ErrStat, ErrMsg) - type(Jac_u_idxStarts), intent(in) :: SrcJac_u_idxStartsData - type(Jac_u_idxStarts), intent(inout) :: DstJac_u_idxStartsData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'ED_CopyJac_u_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' - DstJac_u_idxStartsData%BladeLoad = SrcJac_u_idxStartsData%BladeLoad - DstJac_u_idxStartsData%PlatformLoad = SrcJac_u_idxStartsData%PlatformLoad - DstJac_u_idxStartsData%TowerLoad = SrcJac_u_idxStartsData%TowerLoad - DstJac_u_idxStartsData%HubLoad = SrcJac_u_idxStartsData%HubLoad - DstJac_u_idxStartsData%NacelleLoad = SrcJac_u_idxStartsData%NacelleLoad - DstJac_u_idxStartsData%TFinLoad = SrcJac_u_idxStartsData%TFinLoad - DstJac_u_idxStartsData%BlPitchCom = SrcJac_u_idxStartsData%BlPitchCom -end subroutine - -subroutine ED_DestroyJac_u_idxStarts(Jac_u_idxStartsData, ErrStat, ErrMsg) - type(Jac_u_idxStarts), intent(inout) :: Jac_u_idxStartsData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'ED_DestroyJac_u_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine ED_PackJac_u_idxStarts(RF, Indata) - type(RegFile), intent(inout) :: RF - type(Jac_u_idxStarts), intent(in) :: InData - character(*), parameter :: RoutineName = 'ED_PackJac_u_idxStarts' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%BladeLoad) - call RegPack(RF, InData%PlatformLoad) - call RegPack(RF, InData%TowerLoad) - call RegPack(RF, InData%HubLoad) - call RegPack(RF, InData%NacelleLoad) - call RegPack(RF, InData%TFinLoad) - call RegPack(RF, InData%BlPitchCom) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine ED_UnPackJac_u_idxStarts(RF, OutData) - type(RegFile), intent(inout) :: RF - type(Jac_u_idxStarts), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'ED_UnPackJac_u_idxStarts' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%BladeLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%PlatformLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TowerLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HubLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NacelleLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFinLoad); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BlPitchCom); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine ED_CopyJac_y_idxStarts(SrcJac_y_idxStartsData, DstJac_y_idxStartsData, CtrlCode, ErrStat, ErrMsg) - type(Jac_y_idxStarts), intent(in) :: SrcJac_y_idxStartsData - type(Jac_y_idxStarts), intent(inout) :: DstJac_y_idxStartsData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'ED_CopyJac_y_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' - DstJac_y_idxStartsData%Blade = SrcJac_y_idxStartsData%Blade - DstJac_y_idxStartsData%Platform = SrcJac_y_idxStartsData%Platform - DstJac_y_idxStartsData%Tower = SrcJac_y_idxStartsData%Tower - DstJac_y_idxStartsData%Hub = SrcJac_y_idxStartsData%Hub - DstJac_y_idxStartsData%BladeRoot = SrcJac_y_idxStartsData%BladeRoot - DstJac_y_idxStartsData%Nacelle = SrcJac_y_idxStartsData%Nacelle - DstJac_y_idxStartsData%TFin = SrcJac_y_idxStartsData%TFin -end subroutine - -subroutine ED_DestroyJac_y_idxStarts(Jac_y_idxStartsData, ErrStat, ErrMsg) - type(Jac_y_idxStarts), intent(inout) :: Jac_y_idxStartsData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'ED_DestroyJac_y_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine ED_PackJac_y_idxStarts(RF, Indata) - type(RegFile), intent(inout) :: RF - type(Jac_y_idxStarts), intent(in) :: InData - character(*), parameter :: RoutineName = 'ED_PackJac_y_idxStarts' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%Blade) - call RegPack(RF, InData%Platform) - call RegPack(RF, InData%Tower) - call RegPack(RF, InData%Hub) - call RegPack(RF, InData%BladeRoot) - call RegPack(RF, InData%Nacelle) - call RegPack(RF, InData%TFin) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine ED_UnPackJac_y_idxStarts(RF, OutData) - type(RegFile), intent(inout) :: RF - type(Jac_y_idxStarts), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'ED_UnPackJac_y_idxStarts' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%Blade); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Platform); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Tower); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Hub); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BladeRoot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Nacelle); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TFin); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) - type(ED_ParameterType), intent(in) :: SrcParamData - type(ED_ParameterType), intent(inout) :: DstParamData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3, i4, i5 - integer(B4Ki) :: LB(5), UB(5) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'ED_CopyParam' - ErrStat = ErrID_None - ErrMsg = '' - DstParamData%DT = SrcParamData%DT - DstParamData%DT24 = SrcParamData%DT24 - DstParamData%BldNodes = SrcParamData%BldNodes - DstParamData%TipNode = SrcParamData%TipNode - DstParamData%NDOF = SrcParamData%NDOF - DstParamData%TwoPiNB = SrcParamData%TwoPiNB - DstParamData%NAug = SrcParamData%NAug - DstParamData%NPH = SrcParamData%NPH - if (allocated(SrcParamData%PH)) then - LB(1:1) = lbound(SrcParamData%PH) - UB(1:1) = ubound(SrcParamData%PH) - if (.not. allocated(DstParamData%PH)) then - allocate(DstParamData%PH(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PH.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%PH = SrcParamData%PH - end if - DstParamData%NPM = SrcParamData%NPM - if (allocated(SrcParamData%PM)) then - LB(1:2) = lbound(SrcParamData%PM) - UB(1:2) = ubound(SrcParamData%PM) - if (.not. allocated(DstParamData%PM)) then - allocate(DstParamData%PM(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PM.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%PM = SrcParamData%PM - end if - if (allocated(SrcParamData%DOF_Flag)) then - LB(1:1) = lbound(SrcParamData%DOF_Flag) - UB(1:1) = ubound(SrcParamData%DOF_Flag) - if (.not. allocated(DstParamData%DOF_Flag)) then - allocate(DstParamData%DOF_Flag(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DOF_Flag.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%DOF_Flag = SrcParamData%DOF_Flag - end if - if (allocated(SrcParamData%DOF_Desc)) then - LB(1:1) = lbound(SrcParamData%DOF_Desc) - UB(1:1) = ubound(SrcParamData%DOF_Desc) - if (.not. allocated(DstParamData%DOF_Desc)) then - allocate(DstParamData%DOF_Desc(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DOF_Desc.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%DOF_Desc = SrcParamData%DOF_Desc - end if - call ED_CopyActiveDOFs(SrcParamData%DOFs, DstParamData%DOFs, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstParamData%NumOuts = SrcParamData%NumOuts - DstParamData%OutFmt = SrcParamData%OutFmt - DstParamData%NBlGages = SrcParamData%NBlGages - DstParamData%NTwGages = SrcParamData%NTwGages - if (allocated(SrcParamData%OutParam)) then - LB(1:1) = lbound(SrcParamData%OutParam) - UB(1:1) = ubound(SrcParamData%OutParam) - if (.not. allocated(DstParamData%OutParam)) then - allocate(DstParamData%OutParam(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call NWTC_Library_CopyOutParmType(SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - DstParamData%Delim = SrcParamData%Delim - DstParamData%AvgNrmTpRd = SrcParamData%AvgNrmTpRd - DstParamData%AzimB1Up = SrcParamData%AzimB1Up - DstParamData%CosDel3 = SrcParamData%CosDel3 - if (allocated(SrcParamData%CosPreC)) then - LB(1:1) = lbound(SrcParamData%CosPreC) - UB(1:1) = ubound(SrcParamData%CosPreC) - if (.not. allocated(DstParamData%CosPreC)) then - allocate(DstParamData%CosPreC(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CosPreC.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%CosPreC = SrcParamData%CosPreC + DstParamData%CosPreC = SrcParamData%CosPreC end if DstParamData%CRFrlSkew = SrcParamData%CRFrlSkew DstParamData%CRFrlSkw2 = SrcParamData%CRFrlSkw2 @@ -5366,6 +4956,8 @@ subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%NacCMzn = SrcParamData%NacCMzn DstParamData%OverHang = SrcParamData%OverHang DstParamData%ProjArea = SrcParamData%ProjArea + DstParamData%PtfmRefxt = SrcParamData%PtfmRefxt + DstParamData%PtfmRefyt = SrcParamData%PtfmRefyt DstParamData%PtfmRefzt = SrcParamData%PtfmRefzt DstParamData%RefTwrHt = SrcParamData%RefTwrHt DstParamData%RFrlPnt_n = SrcParamData%RFrlPnt_n @@ -5385,6 +4977,8 @@ subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%rWJyn = SrcParamData%rWJyn DstParamData%rWJzn = SrcParamData%rWJzn DstParamData%rZT0zt = SrcParamData%rZT0zt + DstParamData%rZYxt = SrcParamData%rZYxt + DstParamData%rZYyt = SrcParamData%rZYyt DstParamData%rZYzt = SrcParamData%rZYzt DstParamData%SinDel3 = SrcParamData%SinDel3 if (allocated(SrcParamData%SinPreC)) then @@ -5624,24 +5218,24 @@ subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) end if DstParamData%TipMass = SrcParamData%TipMass end if - DstParamData%TurbMass = SrcParamData%TurbMass - DstParamData%TwrMass = SrcParamData%TwrMass - DstParamData%TwrTpMass = SrcParamData%TwrTpMass - DstParamData%YawBrMass = SrcParamData%YawBrMass - DstParamData%Gravity = SrcParamData%Gravity - if (allocated(SrcParamData%PitchAxis)) then - LB(1:2) = lbound(SrcParamData%PitchAxis) - UB(1:2) = ubound(SrcParamData%PitchAxis) - if (.not. allocated(DstParamData%PitchAxis)) then - allocate(DstParamData%PitchAxis(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%PitchIner)) then + LB(1:1) = lbound(SrcParamData%PitchIner) + UB(1:1) = ubound(SrcParamData%PitchIner) + if (.not. allocated(DstParamData%PitchIner)) then + allocate(DstParamData%PitchIner(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PitchAxis.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PitchIner.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%PitchAxis = SrcParamData%PitchAxis + DstParamData%PitchIner = SrcParamData%PitchIner end if - if (allocated(SrcParamData%AeroTwst)) then + DstParamData%TurbMass = SrcParamData%TurbMass + DstParamData%TwrMass = SrcParamData%TwrMass + DstParamData%TwrTpMass = SrcParamData%TwrTpMass + DstParamData%YawBrMass = SrcParamData%YawBrMass + DstParamData%Gravity = SrcParamData%Gravity + if (allocated(SrcParamData%AeroTwst)) then LB(1:1) = lbound(SrcParamData%AeroTwst) UB(1:1) = ubound(SrcParamData%AeroTwst) if (.not. allocated(DstParamData%AeroTwst)) then @@ -5834,30 +5428,6 @@ subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) end if DstParamData%RNodesNorm = SrcParamData%RNodesNorm end if - if (allocated(SrcParamData%rSAerCenn1)) then - LB(1:2) = lbound(SrcParamData%rSAerCenn1) - UB(1:2) = ubound(SrcParamData%rSAerCenn1) - if (.not. allocated(DstParamData%rSAerCenn1)) then - allocate(DstParamData%rSAerCenn1(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%rSAerCenn1.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%rSAerCenn1 = SrcParamData%rSAerCenn1 - end if - if (allocated(SrcParamData%rSAerCenn2)) then - LB(1:2) = lbound(SrcParamData%rSAerCenn2) - UB(1:2) = ubound(SrcParamData%rSAerCenn2) - if (.not. allocated(DstParamData%rSAerCenn2)) then - allocate(DstParamData%rSAerCenn2(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%rSAerCenn2.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%rSAerCenn2 = SrcParamData%rSAerCenn2 - end if if (allocated(SrcParamData%SAeroTwst)) then LB(1:1) = lbound(SrcParamData%SAeroTwst) UB(1:1) = ubound(SrcParamData%SAeroTwst) @@ -6090,55 +5660,7 @@ subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) end do end if DstParamData%BldNd_BladesOut = SrcParamData%BldNd_BladesOut - call ED_CopyJac_u_idxStarts(SrcParamData%Jac_u_idxStartList, DstParamData%Jac_u_idxStartList, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ED_CopyJac_y_idxStarts(SrcParamData%Jac_y_idxStartList, DstParamData%Jac_y_idxStartList, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcParamData%Jac_u_indx)) then - LB(1:2) = lbound(SrcParamData%Jac_u_indx) - UB(1:2) = ubound(SrcParamData%Jac_u_indx) - if (.not. allocated(DstParamData%Jac_u_indx)) then - allocate(DstParamData%Jac_u_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_u_indx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_u_indx = SrcParamData%Jac_u_indx - end if - if (allocated(SrcParamData%du)) then - LB(1:1) = lbound(SrcParamData%du) - UB(1:1) = ubound(SrcParamData%du) - if (.not. allocated(DstParamData%du)) then - allocate(DstParamData%du(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%du.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%du = SrcParamData%du - end if - if (allocated(SrcParamData%dx)) then - LB(1:1) = lbound(SrcParamData%dx) - UB(1:1) = ubound(SrcParamData%dx) - if (.not. allocated(DstParamData%dx)) then - allocate(DstParamData%dx(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%dx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%dx = SrcParamData%dx - end if - DstParamData%Jac_ny = SrcParamData%Jac_ny DstParamData%CompAeroMaps = SrcParamData%CompAeroMaps - DstParamData%NumExtendedInputs = SrcParamData%NumExtendedInputs - DstParamData%NumBl_Lin = SrcParamData%NumBl_Lin - DstParamData%NActvVelDOF_Lin = SrcParamData%NActvVelDOF_Lin - DstParamData%NActvDOF_Lin = SrcParamData%NActvDOF_Lin - DstParamData%NActvDOF_Stride = SrcParamData%NActvDOF_Stride end subroutine subroutine ED_DestroyParam(ParamData, ErrStat, ErrMsg) @@ -6226,8 +5748,8 @@ subroutine ED_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%TipMass)) then deallocate(ParamData%TipMass) end if - if (allocated(ParamData%PitchAxis)) then - deallocate(ParamData%PitchAxis) + if (allocated(ParamData%PitchIner)) then + deallocate(ParamData%PitchIner) end if if (allocated(ParamData%AeroTwst)) then deallocate(ParamData%AeroTwst) @@ -6277,12 +5799,6 @@ subroutine ED_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%RNodesNorm)) then deallocate(ParamData%RNodesNorm) end if - if (allocated(ParamData%rSAerCenn1)) then - deallocate(ParamData%rSAerCenn1) - end if - if (allocated(ParamData%rSAerCenn2)) then - deallocate(ParamData%rSAerCenn2) - end if if (allocated(ParamData%SAeroTwst)) then deallocate(ParamData%SAeroTwst) end if @@ -6331,19 +5847,6 @@ subroutine ED_DestroyParam(ParamData, ErrStat, ErrMsg) end do deallocate(ParamData%BldNd_OutParam) end if - call ED_DestroyJac_u_idxStarts(ParamData%Jac_u_idxStartList, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ED_DestroyJac_y_idxStarts(ParamData%Jac_y_idxStartList, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ParamData%Jac_u_indx)) then - deallocate(ParamData%Jac_u_indx) - end if - if (allocated(ParamData%du)) then - deallocate(ParamData%du) - end if - if (allocated(ParamData%dx)) then - deallocate(ParamData%dx) - end if end subroutine subroutine ED_PackParam(RF, Indata) @@ -6407,6 +5910,8 @@ subroutine ED_PackParam(RF, Indata) call RegPack(RF, InData%NacCMzn) call RegPack(RF, InData%OverHang) call RegPack(RF, InData%ProjArea) + call RegPack(RF, InData%PtfmRefxt) + call RegPack(RF, InData%PtfmRefyt) call RegPack(RF, InData%PtfmRefzt) call RegPack(RF, InData%RefTwrHt) call RegPack(RF, InData%RFrlPnt_n) @@ -6426,6 +5931,8 @@ subroutine ED_PackParam(RF, Indata) call RegPack(RF, InData%rWJyn) call RegPack(RF, InData%rWJzn) call RegPack(RF, InData%rZT0zt) + call RegPack(RF, InData%rZYxt) + call RegPack(RF, InData%rZYyt) call RegPack(RF, InData%rZYzt) call RegPack(RF, InData%SinDel3) call RegPackAlloc(RF, InData%SinPreC) @@ -6489,12 +5996,12 @@ subroutine ED_PackParam(RF, Indata) call RegPack(RF, InData%TFinMass) call RegPack(RF, InData%TFrlIner) call RegPackAlloc(RF, InData%TipMass) + call RegPackAlloc(RF, InData%PitchIner) call RegPack(RF, InData%TurbMass) call RegPack(RF, InData%TwrMass) call RegPack(RF, InData%TwrTpMass) call RegPack(RF, InData%YawBrMass) call RegPack(RF, InData%Gravity) - call RegPackAlloc(RF, InData%PitchAxis) call RegPackAlloc(RF, InData%AeroTwst) call RegPackAlloc(RF, InData%AxRedBld) call RegPackAlloc(RF, InData%BldEDamp) @@ -6512,8 +6019,6 @@ subroutine ED_PackParam(RF, Indata) call RegPackAlloc(RF, InData%MassB) call RegPackAlloc(RF, InData%RNodes) call RegPackAlloc(RF, InData%RNodesNorm) - call RegPackAlloc(RF, InData%rSAerCenn1) - call RegPackAlloc(RF, InData%rSAerCenn2) call RegPackAlloc(RF, InData%SAeroTwst) call RegPackAlloc(RF, InData%StiffBE) call RegPackAlloc(RF, InData%StiffBF) @@ -6596,18 +6101,7 @@ subroutine ED_PackParam(RF, Indata) end do end if call RegPack(RF, InData%BldNd_BladesOut) - call ED_PackJac_u_idxStarts(RF, InData%Jac_u_idxStartList) - call ED_PackJac_y_idxStarts(RF, InData%Jac_y_idxStartList) - call RegPackAlloc(RF, InData%Jac_u_indx) - call RegPackAlloc(RF, InData%du) - call RegPackAlloc(RF, InData%dx) - call RegPack(RF, InData%Jac_ny) call RegPack(RF, InData%CompAeroMaps) - call RegPack(RF, InData%NumExtendedInputs) - call RegPack(RF, InData%NumBl_Lin) - call RegPack(RF, InData%NActvVelDOF_Lin) - call RegPack(RF, InData%NActvDOF_Lin) - call RegPack(RF, InData%NActvDOF_Stride) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -6678,6 +6172,8 @@ subroutine ED_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%NacCMzn); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%OverHang); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%ProjArea); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmRefxt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmRefyt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmRefzt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RefTwrHt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RFrlPnt_n); if (RegCheckErr(RF, RoutineName)) return @@ -6697,6 +6193,8 @@ subroutine ED_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%rWJyn); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%rWJzn); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%rZT0zt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%rZYxt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%rZYyt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%rZYzt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SinDel3); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%SinPreC); if (RegCheckErr(RF, RoutineName)) return @@ -6760,12 +6258,12 @@ subroutine ED_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%TFinMass); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TFrlIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%TipMass); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PitchIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TurbMass); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TwrMass); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TwrTpMass); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%YawBrMass); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Gravity); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%PitchAxis); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%AeroTwst); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%AxRedBld); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BldEDamp); if (RegCheckErr(RF, RoutineName)) return @@ -6783,8 +6281,6 @@ subroutine ED_UnPackParam(RF, OutData) call RegUnpackAlloc(RF, OutData%MassB); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%RNodes); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%RNodesNorm); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%rSAerCenn1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%rSAerCenn2); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%SAeroTwst); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%StiffBE); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%StiffBF); if (RegCheckErr(RF, RoutineName)) return @@ -6871,18 +6367,7 @@ subroutine ED_UnPackParam(RF, OutData) end do end if call RegUnpack(RF, OutData%BldNd_BladesOut); if (RegCheckErr(RF, RoutineName)) return - call ED_UnpackJac_u_idxStarts(RF, OutData%Jac_u_idxStartList) ! Jac_u_idxStartList - call ED_UnpackJac_y_idxStarts(RF, OutData%Jac_y_idxStartList) ! Jac_y_idxStartList - call RegUnpackAlloc(RF, OutData%Jac_u_indx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompAeroMaps); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumExtendedInputs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumBl_Lin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NActvVelDOF_Lin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NActvDOF_Lin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NActvDOF_Stride); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine ED_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) @@ -6920,6 +6405,22 @@ subroutine ED_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) call MeshCopy(SrcInputData%TowerPtLoads, DstInputData%TowerPtLoads, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + if (allocated(SrcInputData%BladeRootLoads)) then + LB(1:1) = lbound(SrcInputData%BladeRootLoads) + UB(1:1) = ubound(SrcInputData%BladeRootLoads) + if (.not. allocated(DstInputData%BladeRootLoads)) then + allocate(DstInputData%BladeRootLoads(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%BladeRootLoads.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MeshCopy(SrcInputData%BladeRootLoads(i1), DstInputData%BladeRootLoads(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if call MeshCopy(SrcInputData%HubPtLoad, DstInputData%HubPtLoad, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -6954,6 +6455,18 @@ subroutine ED_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) end if DstInputData%BlPitchCom = SrcInputData%BlPitchCom end if + if (allocated(SrcInputData%BlPitchMom)) then + LB(1:1) = lbound(SrcInputData%BlPitchMom) + UB(1:1) = ubound(SrcInputData%BlPitchMom) + if (.not. allocated(DstInputData%BlPitchMom)) then + allocate(DstInputData%BlPitchMom(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%BlPitchMom.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputData%BlPitchMom = SrcInputData%BlPitchMom + end if DstInputData%YawMom = SrcInputData%YawMom DstInputData%GenTrq = SrcInputData%GenTrq DstInputData%HSSBrTrqC = SrcInputData%HSSBrTrqC @@ -6983,6 +6496,15 @@ subroutine ED_DestroyInput(InputData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call MeshDestroy( InputData%TowerPtLoads, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InputData%BladeRootLoads)) then + LB(1:1) = lbound(InputData%BladeRootLoads) + UB(1:1) = ubound(InputData%BladeRootLoads) + do i1 = LB(1), UB(1) + call MeshDestroy( InputData%BladeRootLoads(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(InputData%BladeRootLoads) + end if call MeshDestroy( InputData%HubPtLoad, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call MeshDestroy( InputData%NacelleLoads, ErrStat2, ErrMsg2) @@ -6995,6 +6517,9 @@ subroutine ED_DestroyInput(InputData, ErrStat, ErrMsg) if (allocated(InputData%BlPitchCom)) then deallocate(InputData%BlPitchCom) end if + if (allocated(InputData%BlPitchMom)) then + deallocate(InputData%BlPitchMom) + end if end subroutine subroutine ED_PackInput(RF, Indata) @@ -7015,12 +6540,22 @@ subroutine ED_PackInput(RF, Indata) end if call MeshPack(RF, InData%PlatformPtMesh) call MeshPack(RF, InData%TowerPtLoads) + call RegPack(RF, allocated(InData%BladeRootLoads)) + if (allocated(InData%BladeRootLoads)) then + call RegPackBounds(RF, 1, lbound(InData%BladeRootLoads), ubound(InData%BladeRootLoads)) + LB(1:1) = lbound(InData%BladeRootLoads) + UB(1:1) = ubound(InData%BladeRootLoads) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%BladeRootLoads(i1)) + end do + end if call MeshPack(RF, InData%HubPtLoad) call MeshPack(RF, InData%NacelleLoads) call MeshPack(RF, InData%TFinCMLoads) call RegPackAlloc(RF, InData%TwrAddedMass) call RegPack(RF, InData%PtfmAddedMass) call RegPackAlloc(RF, InData%BlPitchCom) + call RegPackAlloc(RF, InData%BlPitchMom) call RegPack(RF, InData%YawMom) call RegPack(RF, InData%GenTrq) call RegPack(RF, InData%HSSBrTrqC) @@ -7051,12 +6586,26 @@ subroutine ED_UnPackInput(RF, OutData) end if call MeshUnpack(RF, OutData%PlatformPtMesh) ! PlatformPtMesh call MeshUnpack(RF, OutData%TowerPtLoads) ! TowerPtLoads + if (allocated(OutData%BladeRootLoads)) deallocate(OutData%BladeRootLoads) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BladeRootLoads(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeRootLoads.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%BladeRootLoads(i1)) ! BladeRootLoads + end do + end if call MeshUnpack(RF, OutData%HubPtLoad) ! HubPtLoad call MeshUnpack(RF, OutData%NacelleLoads) ! NacelleLoads call MeshUnpack(RF, OutData%TFinCMLoads) ! TFinCMLoads call RegUnpackAlloc(RF, OutData%TwrAddedMass); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmAddedMass); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BlPitchCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPitchMom); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%YawMom); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GenTrq); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HSSBrTrqC); if (RegCheckErr(RF, RoutineName)) return @@ -7146,6 +6695,18 @@ subroutine ED_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg end if DstOutputData%BlPitch = SrcOutputData%BlPitch end if + if (allocated(SrcOutputData%BlPRate)) then + LB(1:1) = lbound(SrcOutputData%BlPRate) + UB(1:1) = ubound(SrcOutputData%BlPRate) + if (.not. allocated(DstOutputData%BlPRate)) then + allocate(DstOutputData%BlPRate(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BlPRate.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%BlPRate = SrcOutputData%BlPRate + end if DstOutputData%Yaw = SrcOutputData%Yaw DstOutputData%YawRate = SrcOutputData%YawRate DstOutputData%LSS_Spd = SrcOutputData%LSS_Spd @@ -7194,162 +6755,407 @@ subroutine ED_DestroyOutput(OutputData, ErrStat, ErrMsg) end do deallocate(OutputData%BladeLn2Mesh) end if - call MeshDestroy( OutputData%PlatformPtMesh, ErrStat2, ErrMsg2) + call MeshDestroy( OutputData%PlatformPtMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( OutputData%TowerLn2Mesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( OutputData%HubPtMotion, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(OutputData%BladeRootMotion)) then + LB(1:1) = lbound(OutputData%BladeRootMotion) + UB(1:1) = ubound(OutputData%BladeRootMotion) + do i1 = LB(1), UB(1) + call MeshDestroy( OutputData%BladeRootMotion(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(OutputData%BladeRootMotion) + end if + call MeshDestroy( OutputData%NacelleMotion, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( OutputData%TFinCMMotion, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(OutputData%WriteOutput)) then + deallocate(OutputData%WriteOutput) + end if + if (allocated(OutputData%BlPitch)) then + deallocate(OutputData%BlPitch) + end if + if (allocated(OutputData%BlPRate)) then + deallocate(OutputData%BlPRate) + end if +end subroutine + +subroutine ED_PackOutput(RF, Indata) + type(RegFile), intent(inout) :: RF + type(ED_OutputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'ED_PackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%BladeLn2Mesh)) + if (allocated(InData%BladeLn2Mesh)) then + call RegPackBounds(RF, 1, lbound(InData%BladeLn2Mesh), ubound(InData%BladeLn2Mesh)) + LB(1:1) = lbound(InData%BladeLn2Mesh) + UB(1:1) = ubound(InData%BladeLn2Mesh) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%BladeLn2Mesh(i1)) + end do + end if + call MeshPack(RF, InData%PlatformPtMesh) + call MeshPack(RF, InData%TowerLn2Mesh) + call MeshPack(RF, InData%HubPtMotion) + call RegPack(RF, allocated(InData%BladeRootMotion)) + if (allocated(InData%BladeRootMotion)) then + call RegPackBounds(RF, 1, lbound(InData%BladeRootMotion), ubound(InData%BladeRootMotion)) + LB(1:1) = lbound(InData%BladeRootMotion) + UB(1:1) = ubound(InData%BladeRootMotion) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%BladeRootMotion(i1)) + end do + end if + call MeshPack(RF, InData%NacelleMotion) + call MeshPack(RF, InData%TFinCMMotion) + call RegPackAlloc(RF, InData%WriteOutput) + call RegPackAlloc(RF, InData%BlPitch) + call RegPackAlloc(RF, InData%BlPRate) + call RegPack(RF, InData%Yaw) + call RegPack(RF, InData%YawRate) + call RegPack(RF, InData%LSS_Spd) + call RegPack(RF, InData%HSS_Spd) + call RegPack(RF, InData%RotSpeed) + call RegPack(RF, InData%TwrAccel) + call RegPack(RF, InData%YawAngle) + call RegPack(RF, InData%RootMyc) + call RegPack(RF, InData%YawBrTAxp) + call RegPack(RF, InData%YawBrTAyp) + call RegPack(RF, InData%LSSTipPxa) + call RegPack(RF, InData%RootMxc) + call RegPack(RF, InData%LSSTipMxa) + call RegPack(RF, InData%LSSTipMya) + call RegPack(RF, InData%LSSTipMza) + call RegPack(RF, InData%LSSTipMys) + call RegPack(RF, InData%LSSTipMzs) + call RegPack(RF, InData%YawBrMyn) + call RegPack(RF, InData%YawBrMzn) + call RegPack(RF, InData%NcIMURAxs) + call RegPack(RF, InData%NcIMURAys) + call RegPack(RF, InData%NcIMURAzs) + call RegPack(RF, InData%RotPwr) + call RegPack(RF, InData%LSShftFxa) + call RegPack(RF, InData%LSShftFys) + call RegPack(RF, InData%LSShftFzs) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine ED_UnPackOutput(RF, OutData) + type(RegFile), intent(inout) :: RF + type(ED_OutputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'ED_UnPackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%BladeLn2Mesh)) deallocate(OutData%BladeLn2Mesh) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BladeLn2Mesh(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeLn2Mesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%BladeLn2Mesh(i1)) ! BladeLn2Mesh + end do + end if + call MeshUnpack(RF, OutData%PlatformPtMesh) ! PlatformPtMesh + call MeshUnpack(RF, OutData%TowerLn2Mesh) ! TowerLn2Mesh + call MeshUnpack(RF, OutData%HubPtMotion) ! HubPtMotion + if (allocated(OutData%BladeRootMotion)) deallocate(OutData%BladeRootMotion) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BladeRootMotion(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeRootMotion.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%BladeRootMotion(i1)) ! BladeRootMotion + end do + end if + call MeshUnpack(RF, OutData%NacelleMotion) ! NacelleMotion + call MeshUnpack(RF, OutData%TFinCMMotion) ! TFinCMMotion + call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPitch); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPRate); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Yaw); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawRate); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSS_Spd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HSS_Spd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TwrAccel); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawAngle); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootMyc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawBrTAxp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawBrTAyp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipPxa); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootMxc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMxa); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMya); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMza); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMys); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMzs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawBrMyn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawBrMzn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NcIMURAxs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NcIMURAys); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NcIMURAzs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotPwr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSShftFxa); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSShftFys); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSShftFzs); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine ED_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(ED_MiscVarType), intent(inout) :: SrcMiscData + type(ED_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'ED_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + call ED_CopyCoordSys(SrcMiscData%CoordSys, DstMiscData%CoordSys, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ED_CopyRtHndSide(SrcMiscData%RtHS, DstMiscData%RtHS, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcMiscData%AllOuts)) then + LB(1:1) = lbound(SrcMiscData%AllOuts) + UB(1:1) = ubound(SrcMiscData%AllOuts) + if (.not. allocated(DstMiscData%AllOuts)) then + allocate(DstMiscData%AllOuts(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AllOuts.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AllOuts = SrcMiscData%AllOuts + end if + if (allocated(SrcMiscData%AugMat)) then + LB(1:2) = lbound(SrcMiscData%AugMat) + UB(1:2) = ubound(SrcMiscData%AugMat) + if (.not. allocated(DstMiscData%AugMat)) then + allocate(DstMiscData%AugMat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AugMat.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AugMat = SrcMiscData%AugMat + end if + if (allocated(SrcMiscData%AugMat_factor)) then + LB(1:2) = lbound(SrcMiscData%AugMat_factor) + UB(1:2) = ubound(SrcMiscData%AugMat_factor) + if (.not. allocated(DstMiscData%AugMat_factor)) then + allocate(DstMiscData%AugMat_factor(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AugMat_factor.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AugMat_factor = SrcMiscData%AugMat_factor + end if + if (allocated(SrcMiscData%SolnVec)) then + LB(1:1) = lbound(SrcMiscData%SolnVec) + UB(1:1) = ubound(SrcMiscData%SolnVec) + if (.not. allocated(DstMiscData%SolnVec)) then + allocate(DstMiscData%SolnVec(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%SolnVec.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%SolnVec = SrcMiscData%SolnVec + end if + if (allocated(SrcMiscData%AugMat_pivot)) then + LB(1:1) = lbound(SrcMiscData%AugMat_pivot) + UB(1:1) = ubound(SrcMiscData%AugMat_pivot) + if (.not. allocated(DstMiscData%AugMat_pivot)) then + allocate(DstMiscData%AugMat_pivot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AugMat_pivot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AugMat_pivot = SrcMiscData%AugMat_pivot + end if + if (allocated(SrcMiscData%OgnlGeAzRo)) then + LB(1:1) = lbound(SrcMiscData%OgnlGeAzRo) + UB(1:1) = ubound(SrcMiscData%OgnlGeAzRo) + if (.not. allocated(DstMiscData%OgnlGeAzRo)) then + allocate(DstMiscData%OgnlGeAzRo(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%OgnlGeAzRo.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%OgnlGeAzRo = SrcMiscData%OgnlGeAzRo + end if + if (allocated(SrcMiscData%QD2T)) then + LB(1:1) = lbound(SrcMiscData%QD2T) + UB(1:1) = ubound(SrcMiscData%QD2T) + if (.not. allocated(DstMiscData%QD2T)) then + allocate(DstMiscData%QD2T(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%QD2T.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%QD2T = SrcMiscData%QD2T + end if + DstMiscData%IgnoreMod = SrcMiscData%IgnoreMod + if (allocated(SrcMiscData%OgnlYawRow)) then + LB(1:1) = lbound(SrcMiscData%OgnlYawRow) + UB(1:1) = ubound(SrcMiscData%OgnlYawRow) + if (.not. allocated(DstMiscData%OgnlYawRow)) then + allocate(DstMiscData%OgnlYawRow(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%OgnlYawRow.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%OgnlYawRow = SrcMiscData%OgnlYawRow + end if + DstMiscData%FrcONcRt = SrcMiscData%FrcONcRt + DstMiscData%MomONcRt = SrcMiscData%MomONcRt + DstMiscData%YawFriMz = SrcMiscData%YawFriMz + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ED_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ED_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ED_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ED_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine ED_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(ED_MiscVarType), intent(inout) :: MiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'ED_DestroyMisc' + ErrStat = ErrID_None + ErrMsg = '' + call ED_DestroyCoordSys(MiscData%CoordSys, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ED_DestroyRtHndSide(MiscData%RtHS, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%AllOuts)) then + deallocate(MiscData%AllOuts) + end if + if (allocated(MiscData%AugMat)) then + deallocate(MiscData%AugMat) + end if + if (allocated(MiscData%AugMat_factor)) then + deallocate(MiscData%AugMat_factor) + end if + if (allocated(MiscData%SolnVec)) then + deallocate(MiscData%SolnVec) + end if + if (allocated(MiscData%AugMat_pivot)) then + deallocate(MiscData%AugMat_pivot) + end if + if (allocated(MiscData%OgnlGeAzRo)) then + deallocate(MiscData%OgnlGeAzRo) + end if + if (allocated(MiscData%QD2T)) then + deallocate(MiscData%QD2T) + end if + if (allocated(MiscData%OgnlYawRow)) then + deallocate(MiscData%OgnlYawRow) + end if + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( OutputData%TowerLn2Mesh, ErrStat2, ErrMsg2) + call ED_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( OutputData%HubPtMotion, ErrStat2, ErrMsg2) + call ED_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(OutputData%BladeRootMotion)) then - LB(1:1) = lbound(OutputData%BladeRootMotion) - UB(1:1) = ubound(OutputData%BladeRootMotion) - do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%BladeRootMotion(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(OutputData%BladeRootMotion) - end if - call MeshDestroy( OutputData%NacelleMotion, ErrStat2, ErrMsg2) + call ED_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( OutputData%TFinCMMotion, ErrStat2, ErrMsg2) + call ED_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(OutputData%WriteOutput)) then - deallocate(OutputData%WriteOutput) - end if - if (allocated(OutputData%BlPitch)) then - deallocate(OutputData%BlPitch) - end if end subroutine -subroutine ED_PackOutput(RF, Indata) +subroutine ED_PackMisc(RF, Indata) type(RegFile), intent(inout) :: RF - type(ED_OutputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'ED_PackOutput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(ED_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'ED_PackMisc' if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%BladeLn2Mesh)) - if (allocated(InData%BladeLn2Mesh)) then - call RegPackBounds(RF, 1, lbound(InData%BladeLn2Mesh), ubound(InData%BladeLn2Mesh)) - LB(1:1) = lbound(InData%BladeLn2Mesh) - UB(1:1) = ubound(InData%BladeLn2Mesh) - do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BladeLn2Mesh(i1)) - end do - end if - call MeshPack(RF, InData%PlatformPtMesh) - call MeshPack(RF, InData%TowerLn2Mesh) - call MeshPack(RF, InData%HubPtMotion) - call RegPack(RF, allocated(InData%BladeRootMotion)) - if (allocated(InData%BladeRootMotion)) then - call RegPackBounds(RF, 1, lbound(InData%BladeRootMotion), ubound(InData%BladeRootMotion)) - LB(1:1) = lbound(InData%BladeRootMotion) - UB(1:1) = ubound(InData%BladeRootMotion) - do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BladeRootMotion(i1)) - end do - end if - call MeshPack(RF, InData%NacelleMotion) - call MeshPack(RF, InData%TFinCMMotion) - call RegPackAlloc(RF, InData%WriteOutput) - call RegPackAlloc(RF, InData%BlPitch) - call RegPack(RF, InData%Yaw) - call RegPack(RF, InData%YawRate) - call RegPack(RF, InData%LSS_Spd) - call RegPack(RF, InData%HSS_Spd) - call RegPack(RF, InData%RotSpeed) - call RegPack(RF, InData%TwrAccel) - call RegPack(RF, InData%YawAngle) - call RegPack(RF, InData%RootMyc) - call RegPack(RF, InData%YawBrTAxp) - call RegPack(RF, InData%YawBrTAyp) - call RegPack(RF, InData%LSSTipPxa) - call RegPack(RF, InData%RootMxc) - call RegPack(RF, InData%LSSTipMxa) - call RegPack(RF, InData%LSSTipMya) - call RegPack(RF, InData%LSSTipMza) - call RegPack(RF, InData%LSSTipMys) - call RegPack(RF, InData%LSSTipMzs) - call RegPack(RF, InData%YawBrMyn) - call RegPack(RF, InData%YawBrMzn) - call RegPack(RF, InData%NcIMURAxs) - call RegPack(RF, InData%NcIMURAys) - call RegPack(RF, InData%NcIMURAzs) - call RegPack(RF, InData%RotPwr) - call RegPack(RF, InData%LSShftFxa) - call RegPack(RF, InData%LSShftFys) - call RegPack(RF, InData%LSShftFzs) + call ED_PackCoordSys(RF, InData%CoordSys) + call ED_PackRtHndSide(RF, InData%RtHS) + call RegPackAlloc(RF, InData%AllOuts) + call RegPackAlloc(RF, InData%AugMat) + call RegPackAlloc(RF, InData%AugMat_factor) + call RegPackAlloc(RF, InData%SolnVec) + call RegPackAlloc(RF, InData%AugMat_pivot) + call RegPackAlloc(RF, InData%OgnlGeAzRo) + call RegPackAlloc(RF, InData%QD2T) + call RegPack(RF, InData%IgnoreMod) + call RegPackAlloc(RF, InData%OgnlYawRow) + call RegPack(RF, InData%FrcONcRt) + call RegPack(RF, InData%MomONcRt) + call RegPack(RF, InData%YawFriMz) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call ED_PackContState(RF, InData%x_perturb) + call ED_PackContState(RF, InData%dxdt_lin) + call ED_PackInput(RF, InData%u_perturb) + call ED_PackOutput(RF, InData%y_lin) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine ED_UnPackOutput(RF, OutData) +subroutine ED_UnPackMisc(RF, OutData) type(RegFile), intent(inout) :: RF - type(ED_OutputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'ED_UnPackOutput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(ED_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'ED_UnPackMisc' + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%BladeLn2Mesh)) deallocate(OutData%BladeLn2Mesh) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BladeLn2Mesh(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeLn2Mesh.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BladeLn2Mesh(i1)) ! BladeLn2Mesh - end do - end if - call MeshUnpack(RF, OutData%PlatformPtMesh) ! PlatformPtMesh - call MeshUnpack(RF, OutData%TowerLn2Mesh) ! TowerLn2Mesh - call MeshUnpack(RF, OutData%HubPtMotion) ! HubPtMotion - if (allocated(OutData%BladeRootMotion)) deallocate(OutData%BladeRootMotion) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BladeRootMotion(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeRootMotion.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BladeRootMotion(i1)) ! BladeRootMotion - end do - end if - call MeshUnpack(RF, OutData%NacelleMotion) ! NacelleMotion - call MeshUnpack(RF, OutData%TFinCMMotion) ! TFinCMMotion - call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlPitch); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Yaw); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawRate); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSS_Spd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HSS_Spd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TwrAccel); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawAngle); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RootMyc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawBrTAxp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawBrTAyp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipPxa); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RootMxc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMxa); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMya); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMza); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMys); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMzs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawBrMyn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawBrMzn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NcIMURAxs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NcIMURAys); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NcIMURAzs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RotPwr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSShftFxa); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSShftFys); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSShftFzs); if (RegCheckErr(RF, RoutineName)) return + call ED_UnpackCoordSys(RF, OutData%CoordSys) ! CoordSys + call ED_UnpackRtHndSide(RF, OutData%RtHS) ! RtHS + call RegUnpackAlloc(RF, OutData%AllOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AugMat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AugMat_factor); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%SolnVec); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AugMat_pivot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%OgnlGeAzRo); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%QD2T); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%IgnoreMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%OgnlYawRow); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%FrcONcRt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MomONcRt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawFriMz); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call ED_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call ED_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call ED_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call ED_UnpackOutput(RF, OutData%y_lin) ! y_lin end subroutine subroutine ED_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -7463,6 +7269,12 @@ SUBROUTINE ED_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp1(u1%TowerPtLoads, u2%TowerPtLoads, tin, u_out%TowerPtLoads, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%BladeRootLoads) .AND. ALLOCATED(u1%BladeRootLoads)) THEN + do i1 = lbound(u_out%BladeRootLoads,1),ubound(u_out%BladeRootLoads,1) + CALL MeshExtrapInterp1(u1%BladeRootLoads(i1), u2%BladeRootLoads(i1), tin, u_out%BladeRootLoads(i1), tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END DO + END IF ! check if allocated CALL MeshExtrapInterp1(u1%HubPtLoad, u2%HubPtLoad, tin, u_out%HubPtLoad, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp1(u1%NacelleLoads, u2%NacelleLoads, tin, u_out%NacelleLoads, tin_out, ErrStat2, ErrMsg2) @@ -7478,6 +7290,9 @@ SUBROUTINE ED_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) CALL Angles_ExtrapInterp( u1%BlPitchCom(i1), u2%BlPitchCom(i1), tin, u_out%BlPitchCom(i1), tin_out ) END DO END IF ! check if allocated + IF (ALLOCATED(u_out%BlPitchMom) .AND. ALLOCATED(u1%BlPitchMom)) THEN + u_out%BlPitchMom = a1*u1%BlPitchMom + a2*u2%BlPitchMom + END IF ! check if allocated u_out%YawMom = a1*u1%YawMom + a2*u2%YawMom u_out%GenTrq = a1*u1%GenTrq + a2*u2%GenTrq u_out%HSSBrTrqC = a1*u1%HSSBrTrqC + a2*u2%HSSBrTrqC @@ -7552,6 +7367,12 @@ SUBROUTINE ED_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrM CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp2(u1%TowerPtLoads, u2%TowerPtLoads, u3%TowerPtLoads, tin, u_out%TowerPtLoads, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%BladeRootLoads) .AND. ALLOCATED(u1%BladeRootLoads)) THEN + do i1 = lbound(u_out%BladeRootLoads,1),ubound(u_out%BladeRootLoads,1) + CALL MeshExtrapInterp2(u1%BladeRootLoads(i1), u2%BladeRootLoads(i1), u3%BladeRootLoads(i1), tin, u_out%BladeRootLoads(i1), tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END DO + END IF ! check if allocated CALL MeshExtrapInterp2(u1%HubPtLoad, u2%HubPtLoad, u3%HubPtLoad, tin, u_out%HubPtLoad, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp2(u1%NacelleLoads, u2%NacelleLoads, u3%NacelleLoads, tin, u_out%NacelleLoads, tin_out, ErrStat2, ErrMsg2) @@ -7567,6 +7388,9 @@ SUBROUTINE ED_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrM CALL Angles_ExtrapInterp( u1%BlPitchCom(i1), u2%BlPitchCom(i1), u3%BlPitchCom(i1), tin, u_out%BlPitchCom(i1), tin_out ) END DO END IF ! check if allocated + IF (ALLOCATED(u_out%BlPitchMom) .AND. ALLOCATED(u1%BlPitchMom)) THEN + u_out%BlPitchMom = a1*u1%BlPitchMom + a2*u2%BlPitchMom + a3*u3%BlPitchMom + END IF ! check if allocated u_out%YawMom = a1*u1%YawMom + a2*u2%YawMom + a3*u3%YawMom u_out%GenTrq = a1*u1%GenTrq + a2*u2%GenTrq + a3*u3%GenTrq u_out%HSSBrTrqC = a1*u1%HSSBrTrqC + a2*u2%HSSBrTrqC + a3*u3%HSSBrTrqC @@ -7699,6 +7523,9 @@ SUBROUTINE ED_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg CALL Angles_ExtrapInterp( y1%BlPitch(i1), y2%BlPitch(i1), tin, y_out%BlPitch(i1), tin_out ) END DO END IF ! check if allocated + IF (ALLOCATED(y_out%BlPRate) .AND. ALLOCATED(y1%BlPRate)) THEN + y_out%BlPRate = a1*y1%BlPRate + a2*y2%BlPRate + END IF ! check if allocated CALL Angles_ExtrapInterp( y1%Yaw, y2%Yaw, tin, y_out%Yaw, tin_out ) y_out%YawRate = a1*y1%YawRate + a2*y2%YawRate y_out%LSS_Spd = a1*y1%LSS_Spd + a2*y2%LSS_Spd @@ -7812,6 +7639,9 @@ SUBROUTINE ED_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Err CALL Angles_ExtrapInterp( y1%BlPitch(i1), y2%BlPitch(i1), y3%BlPitch(i1), tin, y_out%BlPitch(i1), tin_out ) END DO END IF ! check if allocated + IF (ALLOCATED(y_out%BlPRate) .AND. ALLOCATED(y1%BlPRate)) THEN + y_out%BlPRate = a1*y1%BlPRate + a2*y2%BlPRate + a3*y3%BlPRate + END IF ! check if allocated CALL Angles_ExtrapInterp( y1%Yaw, y2%Yaw, y3%Yaw, tin, y_out%Yaw, tin_out ) y_out%YawRate = a1*y1%YawRate + a2*y2%YawRate + a3*y3%YawRate y_out%LSS_Spd = a1*y1%LSS_Spd + a2*y2%LSS_Spd + a3*y3%LSS_Spd @@ -7839,5 +7669,544 @@ SUBROUTINE ED_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Err y_out%LSShftFys = a1*y1%LSShftFys + a2*y2%LSShftFys + a3*y3%LSShftFys y_out%LSShftFzs = a1*y1%LSShftFzs + a2*y2%LSShftFzs + a3*y3%LSShftFzs END SUBROUTINE + +function ED_InputMeshPointer(u, DL) result(Mesh) + type(ED_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ED_u_BladePtLoads) + Mesh => u%BladePtLoads(DL%i1) + case (ED_u_PlatformPtMesh) + Mesh => u%PlatformPtMesh + case (ED_u_TowerPtLoads) + Mesh => u%TowerPtLoads + case (ED_u_BladeRootLoads) + Mesh => u%BladeRootLoads(DL%i1) + case (ED_u_HubPtLoad) + Mesh => u%HubPtLoad + case (ED_u_NacelleLoads) + Mesh => u%NacelleLoads + case (ED_u_TFinCMLoads) + Mesh => u%TFinCMLoads + end select +end function + +function ED_OutputMeshPointer(y, DL) result(Mesh) + type(ED_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ED_y_BladeLn2Mesh) + Mesh => y%BladeLn2Mesh(DL%i1) + case (ED_y_PlatformPtMesh) + Mesh => y%PlatformPtMesh + case (ED_y_TowerLn2Mesh) + Mesh => y%TowerLn2Mesh + case (ED_y_HubPtMotion) + Mesh => y%HubPtMotion + case (ED_y_BladeRootMotion) + Mesh => y%BladeRootMotion(DL%i1) + case (ED_y_NacelleMotion) + Mesh => y%NacelleMotion + case (ED_y_TFinCMMotion) + Mesh => y%TFinCMMotion + end select +end function + +subroutine ED_VarsPackContState(Vars, x, ValAry) + type(ED_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ED_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ED_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ED_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ED_x_QT) + VarVals = x%QT(V%iLB:V%iUB) ! Rank 1 Array + case (ED_x_QDT) + VarVals = x%QDT(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ED_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ED_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ED_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine ED_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ED_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ED_x_QT) + x%QT(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ED_x_QDT) + x%QDT(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ED_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ED_x_QT) + Name = "x%QT" + case (ED_x_QDT) + Name = "x%QDT" + case default + Name = "Unknown Field" + end select +end function + +subroutine ED_VarsPackContStateDeriv(Vars, x, ValAry) + type(ED_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ED_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ED_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ED_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ED_x_QT) + VarVals = x%QT(V%iLB:V%iUB) ! Rank 1 Array + case (ED_x_QDT) + VarVals = x%QDT(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ED_VarsPackInput(Vars, u, ValAry) + type(ED_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ED_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine ED_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(ED_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ED_u_BladePtLoads) + call MV_PackMesh(V, u%BladePtLoads(DL%i1), ValAry) ! Mesh + case (ED_u_PlatformPtMesh) + call MV_PackMesh(V, u%PlatformPtMesh, ValAry) ! Mesh + case (ED_u_TowerPtLoads) + call MV_PackMesh(V, u%TowerPtLoads, ValAry) ! Mesh + case (ED_u_BladeRootLoads) + call MV_PackMesh(V, u%BladeRootLoads(DL%i1), ValAry) ! Mesh + case (ED_u_HubPtLoad) + call MV_PackMesh(V, u%HubPtLoad, ValAry) ! Mesh + case (ED_u_NacelleLoads) + call MV_PackMesh(V, u%NacelleLoads, ValAry) ! Mesh + case (ED_u_TFinCMLoads) + call MV_PackMesh(V, u%TFinCMLoads, ValAry) ! Mesh + case (ED_u_TwrAddedMass) + VarVals = u%TwrAddedMass(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (ED_u_PtfmAddedMass) + VarVals = u%PtfmAddedMass(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (ED_u_BlPitchCom) + VarVals = u%BlPitchCom(V%iLB:V%iUB) ! Rank 1 Array + case (ED_u_BlPitchMom) + VarVals = u%BlPitchMom(V%iLB:V%iUB) ! Rank 1 Array + case (ED_u_YawMom) + VarVals(1) = u%YawMom ! Scalar + case (ED_u_GenTrq) + VarVals(1) = u%GenTrq ! Scalar + case (ED_u_HSSBrTrqC) + VarVals(1) = u%HSSBrTrqC ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ED_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ED_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ED_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine ED_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ED_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ED_u_BladePtLoads) + call MV_UnpackMesh(V, ValAry, u%BladePtLoads(DL%i1)) ! Mesh + case (ED_u_PlatformPtMesh) + call MV_UnpackMesh(V, ValAry, u%PlatformPtMesh) ! Mesh + case (ED_u_TowerPtLoads) + call MV_UnpackMesh(V, ValAry, u%TowerPtLoads) ! Mesh + case (ED_u_BladeRootLoads) + call MV_UnpackMesh(V, ValAry, u%BladeRootLoads(DL%i1)) ! Mesh + case (ED_u_HubPtLoad) + call MV_UnpackMesh(V, ValAry, u%HubPtLoad) ! Mesh + case (ED_u_NacelleLoads) + call MV_UnpackMesh(V, ValAry, u%NacelleLoads) ! Mesh + case (ED_u_TFinCMLoads) + call MV_UnpackMesh(V, ValAry, u%TFinCMLoads) ! Mesh + case (ED_u_TwrAddedMass) + u%TwrAddedMass(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (ED_u_PtfmAddedMass) + u%PtfmAddedMass(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (ED_u_BlPitchCom) + u%BlPitchCom(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ED_u_BlPitchMom) + u%BlPitchMom(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ED_u_YawMom) + u%YawMom = VarVals(1) ! Scalar + case (ED_u_GenTrq) + u%GenTrq = VarVals(1) ! Scalar + case (ED_u_HSSBrTrqC) + u%HSSBrTrqC = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function ED_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ED_u_BladePtLoads) + Name = "u%BladePtLoads("//trim(Num2LStr(DL%i1))//")" + case (ED_u_PlatformPtMesh) + Name = "u%PlatformPtMesh" + case (ED_u_TowerPtLoads) + Name = "u%TowerPtLoads" + case (ED_u_BladeRootLoads) + Name = "u%BladeRootLoads("//trim(Num2LStr(DL%i1))//")" + case (ED_u_HubPtLoad) + Name = "u%HubPtLoad" + case (ED_u_NacelleLoads) + Name = "u%NacelleLoads" + case (ED_u_TFinCMLoads) + Name = "u%TFinCMLoads" + case (ED_u_TwrAddedMass) + Name = "u%TwrAddedMass" + case (ED_u_PtfmAddedMass) + Name = "u%PtfmAddedMass" + case (ED_u_BlPitchCom) + Name = "u%BlPitchCom" + case (ED_u_BlPitchMom) + Name = "u%BlPitchMom" + case (ED_u_YawMom) + Name = "u%YawMom" + case (ED_u_GenTrq) + Name = "u%GenTrq" + case (ED_u_HSSBrTrqC) + Name = "u%HSSBrTrqC" + case default + Name = "Unknown Field" + end select +end function + +subroutine ED_VarsPackOutput(Vars, y, ValAry) + type(ED_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ED_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine ED_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(ED_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ED_y_BladeLn2Mesh) + call MV_PackMesh(V, y%BladeLn2Mesh(DL%i1), ValAry) ! Mesh + case (ED_y_PlatformPtMesh) + call MV_PackMesh(V, y%PlatformPtMesh, ValAry) ! Mesh + case (ED_y_TowerLn2Mesh) + call MV_PackMesh(V, y%TowerLn2Mesh, ValAry) ! Mesh + case (ED_y_HubPtMotion) + call MV_PackMesh(V, y%HubPtMotion, ValAry) ! Mesh + case (ED_y_BladeRootMotion) + call MV_PackMesh(V, y%BladeRootMotion(DL%i1), ValAry) ! Mesh + case (ED_y_NacelleMotion) + call MV_PackMesh(V, y%NacelleMotion, ValAry) ! Mesh + case (ED_y_TFinCMMotion) + call MV_PackMesh(V, y%TFinCMMotion, ValAry) ! Mesh + case (ED_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (ED_y_BlPitch) + VarVals = y%BlPitch(V%iLB:V%iUB) ! Rank 1 Array + case (ED_y_BlPRate) + VarVals = y%BlPRate(V%iLB:V%iUB) ! Rank 1 Array + case (ED_y_Yaw) + VarVals(1) = y%Yaw ! Scalar + case (ED_y_YawRate) + VarVals(1) = y%YawRate ! Scalar + case (ED_y_LSS_Spd) + VarVals(1) = y%LSS_Spd ! Scalar + case (ED_y_HSS_Spd) + VarVals(1) = y%HSS_Spd ! Scalar + case (ED_y_RotSpeed) + VarVals(1) = y%RotSpeed ! Scalar + case (ED_y_TwrAccel) + VarVals(1) = y%TwrAccel ! Scalar + case (ED_y_YawAngle) + VarVals(1) = y%YawAngle ! Scalar + case (ED_y_RootMyc) + VarVals = y%RootMyc(V%iLB:V%iUB) ! Rank 1 Array + case (ED_y_YawBrTAxp) + VarVals(1) = y%YawBrTAxp ! Scalar + case (ED_y_YawBrTAyp) + VarVals(1) = y%YawBrTAyp ! Scalar + case (ED_y_LSSTipPxa) + VarVals(1) = y%LSSTipPxa ! Scalar + case (ED_y_RootMxc) + VarVals = y%RootMxc(V%iLB:V%iUB) ! Rank 1 Array + case (ED_y_LSSTipMxa) + VarVals(1) = y%LSSTipMxa ! Scalar + case (ED_y_LSSTipMya) + VarVals(1) = y%LSSTipMya ! Scalar + case (ED_y_LSSTipMza) + VarVals(1) = y%LSSTipMza ! Scalar + case (ED_y_LSSTipMys) + VarVals(1) = y%LSSTipMys ! Scalar + case (ED_y_LSSTipMzs) + VarVals(1) = y%LSSTipMzs ! Scalar + case (ED_y_YawBrMyn) + VarVals(1) = y%YawBrMyn ! Scalar + case (ED_y_YawBrMzn) + VarVals(1) = y%YawBrMzn ! Scalar + case (ED_y_NcIMURAxs) + VarVals(1) = y%NcIMURAxs ! Scalar + case (ED_y_NcIMURAys) + VarVals(1) = y%NcIMURAys ! Scalar + case (ED_y_NcIMURAzs) + VarVals(1) = y%NcIMURAzs ! Scalar + case (ED_y_RotPwr) + VarVals(1) = y%RotPwr ! Scalar + case (ED_y_LSShftFxa) + VarVals(1) = y%LSShftFxa ! Scalar + case (ED_y_LSShftFys) + VarVals(1) = y%LSShftFys ! Scalar + case (ED_y_LSShftFzs) + VarVals(1) = y%LSShftFzs ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ED_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ED_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ED_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine ED_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ED_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ED_y_BladeLn2Mesh) + call MV_UnpackMesh(V, ValAry, y%BladeLn2Mesh(DL%i1)) ! Mesh + case (ED_y_PlatformPtMesh) + call MV_UnpackMesh(V, ValAry, y%PlatformPtMesh) ! Mesh + case (ED_y_TowerLn2Mesh) + call MV_UnpackMesh(V, ValAry, y%TowerLn2Mesh) ! Mesh + case (ED_y_HubPtMotion) + call MV_UnpackMesh(V, ValAry, y%HubPtMotion) ! Mesh + case (ED_y_BladeRootMotion) + call MV_UnpackMesh(V, ValAry, y%BladeRootMotion(DL%i1)) ! Mesh + case (ED_y_NacelleMotion) + call MV_UnpackMesh(V, ValAry, y%NacelleMotion) ! Mesh + case (ED_y_TFinCMMotion) + call MV_UnpackMesh(V, ValAry, y%TFinCMMotion) ! Mesh + case (ED_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ED_y_BlPitch) + y%BlPitch(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ED_y_BlPRate) + y%BlPRate(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ED_y_Yaw) + y%Yaw = VarVals(1) ! Scalar + case (ED_y_YawRate) + y%YawRate = VarVals(1) ! Scalar + case (ED_y_LSS_Spd) + y%LSS_Spd = VarVals(1) ! Scalar + case (ED_y_HSS_Spd) + y%HSS_Spd = VarVals(1) ! Scalar + case (ED_y_RotSpeed) + y%RotSpeed = VarVals(1) ! Scalar + case (ED_y_TwrAccel) + y%TwrAccel = VarVals(1) ! Scalar + case (ED_y_YawAngle) + y%YawAngle = VarVals(1) ! Scalar + case (ED_y_RootMyc) + y%RootMyc(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ED_y_YawBrTAxp) + y%YawBrTAxp = VarVals(1) ! Scalar + case (ED_y_YawBrTAyp) + y%YawBrTAyp = VarVals(1) ! Scalar + case (ED_y_LSSTipPxa) + y%LSSTipPxa = VarVals(1) ! Scalar + case (ED_y_RootMxc) + y%RootMxc(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ED_y_LSSTipMxa) + y%LSSTipMxa = VarVals(1) ! Scalar + case (ED_y_LSSTipMya) + y%LSSTipMya = VarVals(1) ! Scalar + case (ED_y_LSSTipMza) + y%LSSTipMza = VarVals(1) ! Scalar + case (ED_y_LSSTipMys) + y%LSSTipMys = VarVals(1) ! Scalar + case (ED_y_LSSTipMzs) + y%LSSTipMzs = VarVals(1) ! Scalar + case (ED_y_YawBrMyn) + y%YawBrMyn = VarVals(1) ! Scalar + case (ED_y_YawBrMzn) + y%YawBrMzn = VarVals(1) ! Scalar + case (ED_y_NcIMURAxs) + y%NcIMURAxs = VarVals(1) ! Scalar + case (ED_y_NcIMURAys) + y%NcIMURAys = VarVals(1) ! Scalar + case (ED_y_NcIMURAzs) + y%NcIMURAzs = VarVals(1) ! Scalar + case (ED_y_RotPwr) + y%RotPwr = VarVals(1) ! Scalar + case (ED_y_LSShftFxa) + y%LSShftFxa = VarVals(1) ! Scalar + case (ED_y_LSShftFys) + y%LSShftFys = VarVals(1) ! Scalar + case (ED_y_LSShftFzs) + y%LSShftFzs = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function ED_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ED_y_BladeLn2Mesh) + Name = "y%BladeLn2Mesh("//trim(Num2LStr(DL%i1))//")" + case (ED_y_PlatformPtMesh) + Name = "y%PlatformPtMesh" + case (ED_y_TowerLn2Mesh) + Name = "y%TowerLn2Mesh" + case (ED_y_HubPtMotion) + Name = "y%HubPtMotion" + case (ED_y_BladeRootMotion) + Name = "y%BladeRootMotion("//trim(Num2LStr(DL%i1))//")" + case (ED_y_NacelleMotion) + Name = "y%NacelleMotion" + case (ED_y_TFinCMMotion) + Name = "y%TFinCMMotion" + case (ED_y_WriteOutput) + Name = "y%WriteOutput" + case (ED_y_BlPitch) + Name = "y%BlPitch" + case (ED_y_BlPRate) + Name = "y%BlPRate" + case (ED_y_Yaw) + Name = "y%Yaw" + case (ED_y_YawRate) + Name = "y%YawRate" + case (ED_y_LSS_Spd) + Name = "y%LSS_Spd" + case (ED_y_HSS_Spd) + Name = "y%HSS_Spd" + case (ED_y_RotSpeed) + Name = "y%RotSpeed" + case (ED_y_TwrAccel) + Name = "y%TwrAccel" + case (ED_y_YawAngle) + Name = "y%YawAngle" + case (ED_y_RootMyc) + Name = "y%RootMyc" + case (ED_y_YawBrTAxp) + Name = "y%YawBrTAxp" + case (ED_y_YawBrTAyp) + Name = "y%YawBrTAyp" + case (ED_y_LSSTipPxa) + Name = "y%LSSTipPxa" + case (ED_y_RootMxc) + Name = "y%RootMxc" + case (ED_y_LSSTipMxa) + Name = "y%LSSTipMxa" + case (ED_y_LSSTipMya) + Name = "y%LSSTipMya" + case (ED_y_LSSTipMza) + Name = "y%LSSTipMza" + case (ED_y_LSSTipMys) + Name = "y%LSSTipMys" + case (ED_y_LSSTipMzs) + Name = "y%LSSTipMzs" + case (ED_y_YawBrMyn) + Name = "y%YawBrMyn" + case (ED_y_YawBrMzn) + Name = "y%YawBrMzn" + case (ED_y_NcIMURAxs) + Name = "y%NcIMURAxs" + case (ED_y_NcIMURAys) + Name = "y%NcIMURAys" + case (ED_y_NcIMURAzs) + Name = "y%NcIMURAzs" + case (ED_y_RotPwr) + Name = "y%RotPwr" + case (ED_y_LSShftFxa) + Name = "y%LSShftFxa" + case (ED_y_LSShftFys) + Name = "y%LSShftFys" + case (ED_y_LSShftFzs) + Name = "y%LSShftFzs" + case default + Name = "Unknown Field" + end select +end function + END MODULE ElastoDyn_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/externalinflow/src/ExternalInflow.f90 b/modules/externalinflow/src/ExternalInflow.f90 index e645ece874..c12b324caa 100644 --- a/modules/externalinflow/src/ExternalInflow.f90 +++ b/modules/externalinflow/src/ExternalInflow.f90 @@ -268,13 +268,20 @@ SUBROUTINE Init_ExtInfw( InitInp, p_FAST, AirDens, u_AD, initOut_AD, y_AD, ExtIn !............................................................................................ CALL AllocAry( InitOut%WriteOutputHdr, 3, 'WriteOutputHdr', ErrStat2, ErrMsg2 ); if (Failed()) return; CALL AllocAry( InitOut%WriteOutputUnt, 3, 'WriteOutputUnt', ErrStat2, ErrMsg2 ); if (Failed()) return; - CALL AllocAry( ExtInfw%y%WriteOutput, 3, 'WriteOutput', ErrStat2, ErrMsg2 ); if (Failed()) return; + CALL AllocAry( ExtInfw%y%WriteOutput, 3, 'WriteOutput', ErrStat2, ErrMsg2 ); if (Failed()) return; InitOut%WriteOutputHdr(1) = 'Wind1VelX'; InitOut%WriteOutputUnt(1) = '(m/s)' InitOut%WriteOutputHdr(2) = 'Wind1VelY'; InitOut%WriteOutputUnt(2) = '(m/s)' InitOut%WriteOutputHdr(3) = 'Wind1VelZ'; InitOut%WriteOutputUnt(3) = '(m/s)' ExtInfw%y%WriteOutput = 0.0_ReKi + !............................................................................................ + ! Module Variables + !............................................................................................ + + call ExtInfw_InitVars(ExtInfw%u, ExtInfw%p, ExtInfw%y, ExtInfw%m, InitOut, .false., ErrStat2, ErrMsg2) + if (Failed()) return + InitOut%Ver = ExtInfw_Ver RETURN @@ -292,6 +299,51 @@ logical function Failed2() endif end function Failed2 END SUBROUTINE Init_ExtInfw + +!---------------------------------------------------------------------------------------------------------------------------------- + +subroutine ExtInfw_InitVars(u, p, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(ExtInfw_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(ExtInfw_ParameterType), intent(inout) :: p !< Parameters + type(ExtInfw_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(ExtInfw_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(ExtInfw_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in ) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'ExtInfw_InitVars' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + !---------------------------------------------------------------------------- + ! Initialize Variables and Values + !---------------------------------------------------------------------------- + + CALL MV_InitVarsJac(InitOut%Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE ExtInfw_UpdateFlowField(p_FAST, ExtInfw, ErrStat, ErrMsg) TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST ! Parameters for the glue code diff --git a/modules/externalinflow/src/ExternalInflow_Registry.txt b/modules/externalinflow/src/ExternalInflow_Registry.txt index 346b559395..6e3bf5bcd8 100644 --- a/modules/externalinflow/src/ExternalInflow_Registry.txt +++ b/modules/externalinflow/src/ExternalInflow_Registry.txt @@ -29,8 +29,10 @@ typedef ExternalInflow/ExtInfw InitOutputType CHARACTER(ChanLen) WriteOu typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - typedef ^ InitOutputType FlowFieldType *FlowField - - - "Pointer of flow field data type" - +typedef ^ InitOutputType ModVarsType Vars - - - "Module Variables" # ..... MiscVars ................................................................................................................ +typedef ExternalInflow/ExtInfw ExtInfw_MiscVarType ModJacType Jac - - - "Jacobian matrices and arrays corresponding to module variables" typedef ExternalInflow/ExtInfw ExtInfw_MiscVarType MeshType ActForceMotionsPoints {:} - - "point mesh for transferring AeroDyn motions to ExternalInflow (includes hub+blades+nacelle+tower+tailfin)" - typedef ExternalInflow/ExtInfw ExtInfw_MiscVarType MeshType ActForceLoadsPoints {:} - - "point mesh for transferring AeroDyn distributed loads to ExternalInflow (includes hub+blades+nacelle+tower+tailfin)" - typedef ExternalInflow/ExtInfw ExtInfw_MiscVarType MeshMapType Line2_to_Point_Loads {:} - - "mapping data structure to convert line2 loads to point loads" - diff --git a/modules/externalinflow/src/ExternalInflow_Types.f90 b/modules/externalinflow/src/ExternalInflow_Types.f90 index 963b0a9b46..1c478fe073 100644 --- a/modules/externalinflow/src/ExternalInflow_Types.f90 +++ b/modules/externalinflow/src/ExternalInflow_Types.f90 @@ -74,6 +74,7 @@ MODULE ExternalInflow_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] TYPE(FlowFieldType) , POINTER :: FlowField => NULL() !< Pointer of flow field data type [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE ExtInfw_InitOutputType ! ======================= ! ========= ExtInfw_MiscVarType_C ======= @@ -82,6 +83,7 @@ MODULE ExternalInflow_Types END TYPE ExtInfw_MiscVarType_C TYPE, PUBLIC :: ExtInfw_MiscVarType TYPE( ExtInfw_MiscVarType_C ) :: C_obj + TYPE(ModJacType) :: Jac !< Jacobian matrices and arrays corresponding to module variables [-] TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: ActForceMotionsPoints !< point mesh for transferring AeroDyn motions to ExternalInflow (includes hub+blades+nacelle+tower+tailfin) [-] TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: ActForceLoadsPoints !< point mesh for transferring AeroDyn distributed loads to ExternalInflow (includes hub+blades+nacelle+tower+tailfin) [-] TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: Line2_to_Point_Loads !< mapping data structure to convert line2 loads to point loads [-] @@ -204,7 +206,29 @@ MODULE ExternalInflow_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Data to be written to an output file: see WriteOutputHdr for names of each variable [see WriteOutputUnt] END TYPE ExtInfw_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: ExtInfw_u_pxVel = 1 ! ExtInfw%pxVel + integer(IntKi), public, parameter :: ExtInfw_u_pyVel = 2 ! ExtInfw%pyVel + integer(IntKi), public, parameter :: ExtInfw_u_pzVel = 3 ! ExtInfw%pzVel + integer(IntKi), public, parameter :: ExtInfw_u_pxForce = 4 ! ExtInfw%pxForce + integer(IntKi), public, parameter :: ExtInfw_u_pyForce = 5 ! ExtInfw%pyForce + integer(IntKi), public, parameter :: ExtInfw_u_pzForce = 6 ! ExtInfw%pzForce + integer(IntKi), public, parameter :: ExtInfw_u_xdotForce = 7 ! ExtInfw%xdotForce + integer(IntKi), public, parameter :: ExtInfw_u_ydotForce = 8 ! ExtInfw%ydotForce + integer(IntKi), public, parameter :: ExtInfw_u_zdotForce = 9 ! ExtInfw%zdotForce + integer(IntKi), public, parameter :: ExtInfw_u_pOrientation = 10 ! ExtInfw%pOrientation + integer(IntKi), public, parameter :: ExtInfw_u_fx = 11 ! ExtInfw%fx + integer(IntKi), public, parameter :: ExtInfw_u_fy = 12 ! ExtInfw%fy + integer(IntKi), public, parameter :: ExtInfw_u_fz = 13 ! ExtInfw%fz + integer(IntKi), public, parameter :: ExtInfw_u_momentx = 14 ! ExtInfw%momentx + integer(IntKi), public, parameter :: ExtInfw_u_momenty = 15 ! ExtInfw%momenty + integer(IntKi), public, parameter :: ExtInfw_u_momentz = 16 ! ExtInfw%momentz + integer(IntKi), public, parameter :: ExtInfw_u_forceNodesChord = 17 ! ExtInfw%forceNodesChord + integer(IntKi), public, parameter :: ExtInfw_y_u = 18 ! ExtInfw%u + integer(IntKi), public, parameter :: ExtInfw_y_v = 19 ! ExtInfw%v + integer(IntKi), public, parameter :: ExtInfw_y_w = 20 ! ExtInfw%w + integer(IntKi), public, parameter :: ExtInfw_y_WriteOutput = 21 ! ExtInfw%WriteOutput + +contains subroutine ExtInfw_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(ExtInfw_InitInputType), intent(in) :: SrcInitInputData @@ -461,6 +485,9 @@ subroutine ExtInfw_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return DstInitOutputData%FlowField => SrcInitOutputData%FlowField + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine ExtInfw_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -481,6 +508,8 @@ subroutine ExtInfw_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) nullify(InitOutputData%FlowField) + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine ExtInfw_PackInitOutput(RF, Indata) @@ -499,6 +528,7 @@ subroutine ExtInfw_PackInitOutput(RF, Indata) call IfW_FlowField_PackFlowFieldType(RF, InData%FlowField) end if end if + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -533,6 +563,7 @@ subroutine ExtInfw_UnPackInitOutput(RF, OutData) else OutData%FlowField => null() end if + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine SUBROUTINE ExtInfw_C2Fary_CopyInitOutput(InitOutputData, ErrStat, ErrMsg, SkipPointers) @@ -582,6 +613,9 @@ subroutine ExtInfw_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'ExtInfw_CopyMisc' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return if (allocated(SrcMiscData%ActForceMotionsPoints)) then LB(1:1) = lbound(SrcMiscData%ActForceMotionsPoints) UB(1:1) = ubound(SrcMiscData%ActForceMotionsPoints) @@ -671,6 +705,8 @@ subroutine ExtInfw_DestroyMisc(MiscData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'ExtInfw_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(MiscData%ActForceMotionsPoints)) then LB(1:1) = lbound(MiscData%ActForceMotionsPoints) UB(1:1) = ubound(MiscData%ActForceMotionsPoints) @@ -723,6 +759,7 @@ subroutine ExtInfw_PackMisc(RF, Indata) integer(B4Ki) :: LB(1), UB(1) logical :: PtrInIndex if (RF%ErrStat >= AbortErrLev) return + call NWTC_Library_PackModJacType(RF, InData%Jac) call RegPack(RF, allocated(InData%ActForceMotionsPoints)) if (allocated(InData%ActForceMotionsPoints)) then call RegPackBounds(RF, 1, lbound(InData%ActForceMotionsPoints), ubound(InData%ActForceMotionsPoints)) @@ -780,6 +817,7 @@ subroutine ExtInfw_UnPackMisc(RF, OutData) integer(B8Ki) :: PtrIdx type(c_ptr) :: Ptr if (RF%ErrStat /= ErrID_None) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac if (allocated(OutData%ActForceMotionsPoints)) deallocate(OutData%ActForceMotionsPoints) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -2704,5 +2742,253 @@ SUBROUTINE ExtInfw_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function ExtInfw_InputMeshPointer(u, DL) result(Mesh) + type(ExtInfw_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function ExtInfw_OutputMeshPointer(y, DL) result(Mesh) + type(ExtInfw_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine ExtInfw_VarsPackInput(Vars, u, ValAry) + type(ExtInfw_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ExtInfw_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine ExtInfw_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(ExtInfw_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtInfw_u_pxVel) + VarVals = u%pxVel(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_pyVel) + VarVals = u%pyVel(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_pzVel) + VarVals = u%pzVel(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_pxForce) + VarVals = u%pxForce(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_pyForce) + VarVals = u%pyForce(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_pzForce) + VarVals = u%pzForce(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_xdotForce) + VarVals = u%xdotForce(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_ydotForce) + VarVals = u%ydotForce(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_zdotForce) + VarVals = u%zdotForce(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_pOrientation) + VarVals = u%pOrientation(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_fx) + VarVals = u%fx(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_fy) + VarVals = u%fy(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_fz) + VarVals = u%fz(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_momentx) + VarVals = u%momentx(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_momenty) + VarVals = u%momenty(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_momentz) + VarVals = u%momentz(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_u_forceNodesChord) + VarVals = u%forceNodesChord(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtInfw_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtInfw_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ExtInfw_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine ExtInfw_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtInfw_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtInfw_u_pxVel) + u%pxVel(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_pyVel) + u%pyVel(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_pzVel) + u%pzVel(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_pxForce) + u%pxForce(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_pyForce) + u%pyForce(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_pzForce) + u%pzForce(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_xdotForce) + u%xdotForce(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_ydotForce) + u%ydotForce(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_zdotForce) + u%zdotForce(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_pOrientation) + u%pOrientation(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_fx) + u%fx(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_fy) + u%fy(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_fz) + u%fz(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_momentx) + u%momentx(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_momenty) + u%momenty(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_momentz) + u%momentz(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_u_forceNodesChord) + u%forceNodesChord(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ExtInfw_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtInfw_u_pxVel) + Name = "u%pxVel" + case (ExtInfw_u_pyVel) + Name = "u%pyVel" + case (ExtInfw_u_pzVel) + Name = "u%pzVel" + case (ExtInfw_u_pxForce) + Name = "u%pxForce" + case (ExtInfw_u_pyForce) + Name = "u%pyForce" + case (ExtInfw_u_pzForce) + Name = "u%pzForce" + case (ExtInfw_u_xdotForce) + Name = "u%xdotForce" + case (ExtInfw_u_ydotForce) + Name = "u%ydotForce" + case (ExtInfw_u_zdotForce) + Name = "u%zdotForce" + case (ExtInfw_u_pOrientation) + Name = "u%pOrientation" + case (ExtInfw_u_fx) + Name = "u%fx" + case (ExtInfw_u_fy) + Name = "u%fy" + case (ExtInfw_u_fz) + Name = "u%fz" + case (ExtInfw_u_momentx) + Name = "u%momentx" + case (ExtInfw_u_momenty) + Name = "u%momenty" + case (ExtInfw_u_momentz) + Name = "u%momentz" + case (ExtInfw_u_forceNodesChord) + Name = "u%forceNodesChord" + case default + Name = "Unknown Field" + end select +end function + +subroutine ExtInfw_VarsPackOutput(Vars, y, ValAry) + type(ExtInfw_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ExtInfw_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine ExtInfw_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(ExtInfw_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtInfw_y_u) + VarVals = y%u(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_y_v) + VarVals = y%v(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_y_w) + VarVals = y%w(V%iLB:V%iUB) ! Rank 1 Array + case (ExtInfw_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtInfw_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtInfw_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ExtInfw_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine ExtInfw_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtInfw_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtInfw_y_u) + y%u(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_y_v) + y%v(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_y_w) + y%w(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtInfw_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ExtInfw_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtInfw_y_u) + Name = "y%u" + case (ExtInfw_y_v) + Name = "y%v" + case (ExtInfw_y_w) + Name = "y%w" + case (ExtInfw_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE ExternalInflow_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/extloads/src/ExtLoads.f90 b/modules/extloads/src/ExtLoads.f90 index d92cba0389..0a584cb41c 100644 --- a/modules/extloads/src/ExtLoads.f90 +++ b/modules/extloads/src/ExtLoads.f90 @@ -26,8 +26,6 @@ module ExtLoads use NWTC_Library use ExtLoads_Types - use InflowWind_IO_Types - use InflowWind_IO implicit none @@ -80,7 +78,6 @@ end subroutine ExtLd_SetInitOut !! The parameters are set here and not changed during the simulation. !! The initial states and initial guess for the input are defined. subroutine ExtLd_Init( InitInp, u, xd, p, y, m, interval, InitOut, ErrStat, ErrMsg ) -!.................................................................................................................................. type(ExtLd_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine type(ExtLd_InputType), intent( out) :: u !< An initial guess for the input; input mesh must be defined @@ -99,28 +96,23 @@ subroutine ExtLd_Init( InitInp, u, xd, p, y, m, interval, InitOut, ErrStat, ErrM integer(IntKi), intent( out) :: errStat !< Error status of the operation character(*), intent( out) :: errMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables + character(*), parameter :: RoutineName = 'ExtLd_Init' + integer(IntKi) :: ErrStat2 ! temporary error status of the operation + character(ErrMsgLen) :: ErrMsg2 ! temporary error message integer(IntKi) :: i ! loop counter - type(Points_InitInputType) :: Points_InitInput - integer(IntKi) :: errStat2 ! temporary error status of the operation - character(ErrMsgLen) :: errMsg2 ! temporary error message - character(*), parameter :: RoutineName = 'ExtLd_Init' - - - ! Initialize variables for this routine - errStat = ErrID_None errMsg = "" - ! Initialize the NWTC Subroutine Library + !---------------------------------------------------------------------------- + ! Set parameters + !---------------------------------------------------------------------------- - ! Set parameters here p%NumBlds = InitInp%NumBlades + call AllocAry(p%NumBldNds, p%NumBlds, 'NumBldNds', ErrStat2,ErrMsg2) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return + if (Failed()) return + p%NumBldNds(:) = InitInp%NumBldNodes(:) p%nTotBldNds = sum(p%NumBldNds(:)) p%NumTwrNds = InitInp%NumTwrNds @@ -129,45 +121,113 @@ subroutine ExtLd_Init( InitInp, u, xd, p, y, m, interval, InitOut, ErrStat, ErrM p%az_blend_mean = InitInp%az_blend_mean p%az_blend_delta = InitInp%az_blend_delta - !............................................................................................ - ! Define and initialize inputs here - !............................................................................................ + !---------------------------------------------------------------------------- + ! Define and initialize inputs + !---------------------------------------------------------------------------- - write(*,*) 'Initializing U ' - - call Init_u( u, p, InitInp, errStat2, errMsg2 ) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return + call Init_u( u, p, InitInp, ErrStat2, ErrMsg2 ) + if (Failed()) return + !---------------------------------------------------------------------------- + ! Initialize misc vars states + !---------------------------------------------------------------------------- - ! Initialize discrete states m%az = 0.0 m%phi_cfd = 0.0 + + !---------------------------------------------------------------------------- + ! Initialize outputs + !---------------------------------------------------------------------------- - write(*,*) 'Initializing y ' - - !............................................................................................ - ! Define outputs here - !............................................................................................ - call Init_y(y, u, m, p, errStat2, errMsg2) ! do this after input meshes have been initialized - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return + ! Initialize outputs after input meshes have been initialized + call Init_y(y, u, m, p, ErrStat2, ErrMsg2) + if (Failed()) return - - !............................................................................................ - ! Define initialization output here - !............................................................................................ - call ExtLd_SetInitOut(p, InitOut, errStat2, errMsg2) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + !---------------------------------------------------------------------------- + ! Define initialization output here + !---------------------------------------------------------------------------- + call ExtLd_SetInitOut(p, InitOut, errStat2, errMsg2) + if (Failed()) return + + !---------------------------------------------------------------------------- + ! Initialize Module Variables + !---------------------------------------------------------------------------- + + call ExtLd_InitVars(u, p, y, m, InitOut, .false., ErrStat2, ErrMsg2) + if (Failed()) return contains logical function Failed() CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) Failed = ErrStat >= AbortErrLev end function Failed - end subroutine ExtLd_Init + +!---------------------------------------------------------------------------------------------------------------------------------- +subroutine ExtLd_InitVars(u, p, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(ExtLd_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(ExtLd_ParameterType), intent(inout) :: p !< Parameters + type(ExtLd_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(ExtLd_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(ExtLd_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in ) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'ExtLd_InitVars' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(InitOut%Vars%u, "TowerMotion", MotionFields, DatLoc(ExtLd_u_TowerMotion), Mesh=u%TowerMotion) + call MV_AddMeshVar(InitOut%Vars%u, "HubMotion", MotionFields, DatLoc(ExtLd_u_HubMotion), Mesh=u%HubMotion) + call MV_AddMeshVar(InitOut%Vars%u, "NacelleMotion", MotionFields, DatLoc(ExtLd_u_NacelleMotion), Mesh=u%NacelleMotion) + do i = 1, size(u%BladeRootMotion) + call MV_AddMeshVar(InitOut%Vars%u, "BladeRootMotion"//IdxStr(i), MotionFields, DatLoc(ExtLd_u_BladeRootMotion, i), Mesh=u%BladeRootMotion(i)) + end do + do i = 1, size(u%BladeRootMotion) + call MV_AddMeshVar(InitOut%Vars%u, "BladeMotion"//IdxStr(i), MotionFields, DatLoc(ExtLd_u_BladeMotion, i), Mesh=u%BladeMotion(i)) + end do + call MV_AddMeshVar(InitOut%Vars%u, 'TowerLoadAD', LoadFields, DatLoc(ExtLd_u_TowerLoadAD), Mesh=u%TowerLoadAD) + do i = 1, size(u%BladeLoadAD) + call MV_AddMeshVar(InitOut%Vars%u, 'BladeLoadAD'//IdxStr(i), LoadFields, DatLoc(ExtLd_u_BladeLoadAD, i), Mesh=u%BladeLoadAD(i)) + end do + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(InitOut%Vars%y, 'TowerLoad', LoadFields, DatLoc(ExtLd_y_TowerLoad), Mesh=y%TowerLoad) + do i = 1, size(y%BladeLoad) + call MV_AddMeshVar(InitOut%Vars%y, 'BladeLoad'//IdxStr(i), LoadFields, DatLoc(ExtLd_y_BladeLoad, i), Mesh=y%BladeLoad(i)) + end do + + !---------------------------------------------------------------------------- + ! Initialize Variables and Values + !---------------------------------------------------------------------------- + + CALL MV_InitVarsJac(InitOut%Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- !> This routine initializes ExtLoads meshes and output array variables for use during the simulation. subroutine Init_y(y, u, m, p, errStat, errMsg) @@ -205,7 +265,7 @@ subroutine Init_y(y, u, m, p, errStat, errMsg) if (ErrStat >= AbortErrLev) RETURN call MeshCopy ( SrcMesh = u%TowerMotion & - , DestMesh = y%TowerLoadAD & + , DestMesh = u%TowerLoadAD & , CtrlCode = MESH_COUSIN & , IOS = COMPONENT_OUTPUT & , force = .TRUE. & @@ -216,14 +276,14 @@ subroutine Init_y(y, u, m, p, errStat, errMsg) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) if (ErrStat >= AbortErrLev) RETURN - !call MeshCommit(y%TowerLoadAD, errStat2, errMsg2 ) + !call MeshCommit(u%TowerLoadAD, errStat2, errMsg2 ) !call SetErrStat( errStat2, errMsg2, errStat, errMsg, RoutineName ) !y%TowerLoad%force = 0.0_ReKi ! shouldn't have to initialize this !y%TowerLoad%moment= 0.0_ReKi ! shouldn't have to initialize this else y%TowerLoad%nnodes = 0 - y%TowerLoadAD%nnodes = 0 + u%TowerLoadAD%nnodes = 0 end if allocate( y%BladeLoad(p%NumBlds), stat=ErrStat2 ) @@ -232,7 +292,7 @@ subroutine Init_y(y, u, m, p, errStat, errMsg) return end if - allocate( y%BladeLoadAD(p%NumBlds), stat=ErrStat2 ) + allocate( u%BladeLoadAD(p%NumBlds), stat=ErrStat2 ) if (errStat2 /= 0) then call SetErrStat( ErrID_Fatal, 'Error allocating y%BladeLoad.', ErrStat, ErrMsg, RoutineName ) return @@ -252,7 +312,7 @@ subroutine Init_y(y, u, m, p, errStat, errMsg) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) call MeshCopy ( SrcMesh = u%BladeMotion(k) & - , DestMesh = y%BladeLoadAD(k) & + , DestMesh = u%BladeLoadAD(k) & , CtrlCode = MESH_COUSIN & , IOS = COMPONENT_OUTPUT & , force = .TRUE. & @@ -262,7 +322,7 @@ subroutine Init_y(y, u, m, p, errStat, errMsg) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !call MeshCommit(y%BladeLoadAD(k), errStat2, errMsg2 ) + !call MeshCommit(u%BladeLoadAD(k), errStat2, errMsg2 ) !call SetErrStat( errStat2, errMsg2, errStat, errMsg, RoutineName ) @@ -762,16 +822,16 @@ subroutine ExtLd_ConvertOpDataForOpenFAST(y, u, m, p, errStat, errMsg ) if (p%TwrAero) then do j=1,p%NumTwrNds - y%TowerLoad%Force(:,j) = m%phi_cfd * y%DX_y%twrLd((j-1)*6+1:(j-1)*6+3) + (1.0 - m%phi_cfd) * y%TowerLoadAD%Force(:,j) - y%TowerLoad%Moment(:,j) = m%phi_cfd * y%DX_y%twrLd((j-1)*6+4:(j-1)*6+6) + (1.0 - m%phi_cfd) * y%TowerLoadAD%Moment(:,j) + y%TowerLoad%Force(:,j) = m%phi_cfd * y%DX_y%twrLd((j-1)*6+1:(j-1)*6+3) + (1.0 - m%phi_cfd) * u%TowerLoadAD%Force(:,j) + y%TowerLoad%Moment(:,j) = m%phi_cfd * y%DX_y%twrLd((j-1)*6+4:(j-1)*6+6) + (1.0 - m%phi_cfd) * u%TowerLoadAD%Moment(:,j) end do end if jTot = 1 do k=1,p%NumBlds do j=1,p%NumBldNds(k) - y%BladeLoad(k)%Force(:,j) = m%phi_cfd * y%DX_y%bldLd((jTot-1)*6+1:(jTot-1)*6+3) + (1.0 - m%phi_cfd) * y%BladeLoadAD(k)%Force(:,j) - y%BladeLoad(k)%Moment(:,j) = m%phi_cfd * y%DX_y%bldLd((jTot-1)*6+4:(jTot-1)*6+6) + (1.0 - m%phi_cfd) * y%BladeLoadAD(k)%Moment(:,j) + y%BladeLoad(k)%Force(:,j) = m%phi_cfd * y%DX_y%bldLd((jTot-1)*6+1:(jTot-1)*6+3) + (1.0 - m%phi_cfd) * u%BladeLoadAD(k)%Force(:,j) + y%BladeLoad(k)%Moment(:,j) = m%phi_cfd * y%DX_y%bldLd((jTot-1)*6+4:(jTot-1)*6+6) + (1.0 - m%phi_cfd) * u%BladeLoadAD(k)%Moment(:,j) jTot = jTot+1 end do end do @@ -870,7 +930,6 @@ subroutine ExtLd_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMs INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - integer, parameter :: indx = 1 ! m%BEMT_u(1) is at t; m%BEMT_u(2) is t+dt integer(intKi) :: i integer(intKi) :: j @@ -882,6 +941,9 @@ subroutine ExtLd_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMs ErrStat = ErrID_None ErrMsg = "" + call ExtLd_ConvertOpDataForOpenFAST(y, u, m, p, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end subroutine ExtLd_CalcOutput subroutine apply_wm(c, v, vrot, transpose) diff --git a/modules/extloads/src/ExtLoadsDX_Types.f90 b/modules/extloads/src/ExtLoadsDX_Types.f90 index f1c3ddcf92..87ce9d0f91 100644 --- a/modules/extloads/src/ExtLoadsDX_Types.f90 +++ b/modules/extloads/src/ExtLoadsDX_Types.f90 @@ -117,7 +117,16 @@ MODULE ExtLoadsDX_Types REAL(KIND=C_DOUBLE) , DIMENSION(:), POINTER :: bldLd => NULL() !< Loads on all blades - Externally supplied [-] END TYPE ExtLdDX_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: ExtLdDX_u_twrDef = 1 ! ExtLdDX%twrDef + integer(IntKi), public, parameter :: ExtLdDX_u_bldDef = 2 ! ExtLdDX%bldDef + integer(IntKi), public, parameter :: ExtLdDX_u_hubDef = 3 ! ExtLdDX%hubDef + integer(IntKi), public, parameter :: ExtLdDX_u_nacDef = 4 ! ExtLdDX%nacDef + integer(IntKi), public, parameter :: ExtLdDX_u_bldRootDef = 5 ! ExtLdDX%bldRootDef + integer(IntKi), public, parameter :: ExtLdDX_u_bldPitch = 6 ! ExtLdDX%bldPitch + integer(IntKi), public, parameter :: ExtLdDX_y_twrLd = 7 ! ExtLdDX%twrLd + integer(IntKi), public, parameter :: ExtLdDX_y_bldLd = 8 ! ExtLdDX%bldLd + +contains subroutine ExtLdDX_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) type(ExtLdDX_InputType), intent(in) :: SrcInputData @@ -1669,5 +1678,175 @@ SUBROUTINE ExtLdDX_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat y_out%bldLd = a1*y1%bldLd + a2*y2%bldLd + a3*y3%bldLd END IF ! check if allocated END SUBROUTINE + +function ExtLdDX_InputMeshPointer(u, DL) result(Mesh) + type(ExtLdDX_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function ExtLdDX_OutputMeshPointer(y, DL) result(Mesh) + type(ExtLdDX_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine ExtLdDX_VarsPackInput(Vars, u, ValAry) + type(ExtLdDX_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ExtLdDX_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine ExtLdDX_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(ExtLdDX_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLdDX_u_twrDef) + VarVals = u%twrDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLdDX_u_bldDef) + VarVals = u%bldDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLdDX_u_hubDef) + VarVals = u%hubDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLdDX_u_nacDef) + VarVals = u%nacDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLdDX_u_bldRootDef) + VarVals = u%bldRootDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLdDX_u_bldPitch) + VarVals = u%bldPitch(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtLdDX_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLdDX_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ExtLdDX_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine ExtLdDX_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLdDX_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLdDX_u_twrDef) + u%twrDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLdDX_u_bldDef) + u%bldDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLdDX_u_hubDef) + u%hubDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLdDX_u_nacDef) + u%nacDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLdDX_u_bldRootDef) + u%bldRootDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLdDX_u_bldPitch) + u%bldPitch(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ExtLdDX_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtLdDX_u_twrDef) + Name = "u%twrDef" + case (ExtLdDX_u_bldDef) + Name = "u%bldDef" + case (ExtLdDX_u_hubDef) + Name = "u%hubDef" + case (ExtLdDX_u_nacDef) + Name = "u%nacDef" + case (ExtLdDX_u_bldRootDef) + Name = "u%bldRootDef" + case (ExtLdDX_u_bldPitch) + Name = "u%bldPitch" + case default + Name = "Unknown Field" + end select +end function + +subroutine ExtLdDX_VarsPackOutput(Vars, y, ValAry) + type(ExtLdDX_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ExtLdDX_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine ExtLdDX_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(ExtLdDX_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLdDX_y_twrLd) + VarVals = y%twrLd(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLdDX_y_bldLd) + VarVals = y%bldLd(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtLdDX_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLdDX_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ExtLdDX_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine ExtLdDX_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLdDX_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLdDX_y_twrLd) + y%twrLd(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLdDX_y_bldLd) + y%bldLd(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ExtLdDX_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtLdDX_y_twrLd) + Name = "y%twrLd" + case (ExtLdDX_y_bldLd) + Name = "y%bldLd" + case default + Name = "Unknown Field" + end select +end function + END MODULE ExtLoadsDX_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/extloads/src/ExtLoads_Registry.txt b/modules/extloads/src/ExtLoads_Registry.txt index b287d01a90..c9c694b06f 100644 --- a/modules/extloads/src/ExtLoads_Registry.txt +++ b/modules/extloads/src/ExtLoads_Registry.txt @@ -15,7 +15,6 @@ ################################################################################################################################### # ...... Include files (definitions from NWTC Library) ............................................................................ include Registry_NWTC_Library.txt -include IfW_FlowField.txt usefrom ExtLoadsDX_Registry.txt # ..... Initialization data ....................................................................................................... @@ -47,6 +46,7 @@ typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - typedef ^ InitOutputType ReKi AirDens - - - "Air density" kg/m^3 +typedef ^ InitOutputType ModVarsType Vars - - - "Module Variables" # ..... States .................................................................................................................... # Define continuous (differentiable) states here: @@ -58,7 +58,7 @@ typedef ^ DiscreteStateType ReKi blah - - - "Somethin #Defin misc variables here typedef ^ MiscVarType ReKi az - - - "Current azimuth" - typedef ^ MiscVarType ReKi phi_cfd - - - "Blending ratio of load from external driver [0-1]" - -typedef ^ MiscVarType FlowFieldType &FlowField - - - "Flow field data type" - +typedef ^ MiscVarType ModJacType Jac - - - "Jacobian matrices and arrays corresponding to module variables" # Define constraint states here: typedef ^ ConstraintStateType ReKi blah - - - "Something" - @@ -89,11 +89,12 @@ typedef ^ InputType MeshType HubMotion - - - "motion on the hub" - typedef ^ InputType MeshType NacelleMotion - - - "motion on the nacelle" - typedef ^ InputType MeshType BladeRootMotion {:} - - "motion on each blade root" - typedef ^ InputType MeshType BladeMotion {:} - - "motion on each blade" - +typedef ^ InputType MeshType TowerLoadAD - - - "loads on the tower from aerodyn" - +typedef ^ InputType MeshType BladeLoadAD {:} - - "loads on each blade from aerodyn" - # ..... Outputs ................................................................................................................... # Define outputs that are contained on the mesh here: typedef ^ OutputType ExtLdDX_OutputType DX_y - - - "Data to get from external driver" typedef ^ OutputType MeshType TowerLoad - - - "loads on the tower" - typedef ^ OutputType MeshType BladeLoad {:} - - "loads on each blade" - -typedef ^ OutputType MeshType TowerLoadAD - - - "loads on the tower from aerodyn" - -typedef ^ OutputType MeshType BladeLoadAD {:} - - "loads on each blade from aerodyn" - + diff --git a/modules/extloads/src/ExtLoads_Types.f90 b/modules/extloads/src/ExtLoads_Types.f90 index bccf4a53a5..f69d8e10ae 100644 --- a/modules/extloads/src/ExtLoads_Types.f90 +++ b/modules/extloads/src/ExtLoads_Types.f90 @@ -31,7 +31,6 @@ !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. MODULE ExtLoads_Types !--------------------------------------------------------------------------------------------------------------------------------- -USE IfW_FlowField_Types USE ExtLoadsDX_Types USE NWTC_Library IMPLICIT NONE @@ -66,6 +65,7 @@ MODULE ExtLoads_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] REAL(ReKi) :: AirDens = 0.0_ReKi !< Air density [kg/m^3] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE ExtLd_InitOutputType ! ======================= ! ========= ExtLd_ContinuousStateType ======= @@ -82,7 +82,7 @@ MODULE ExtLoads_Types TYPE, PUBLIC :: ExtLd_MiscVarType REAL(ReKi) :: az = 0.0_ReKi !< Current azimuth [-] REAL(ReKi) :: phi_cfd = 0.0_ReKi !< Blending ratio of load from external driver [0-1] [-] - TYPE(FlowFieldType) , POINTER :: FlowField => NULL() !< Flow field data type [-] + TYPE(ModJacType) :: Jac !< Jacobian matrices and arrays corresponding to module variables [-] END TYPE ExtLd_MiscVarType ! ======================= ! ========= ExtLd_ConstraintStateType ======= @@ -116,6 +116,8 @@ MODULE ExtLoads_Types TYPE(MeshType) :: NacelleMotion !< motion on the nacelle [-] TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeRootMotion !< motion on each blade root [-] TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeMotion !< motion on each blade [-] + TYPE(MeshType) :: TowerLoadAD !< loads on the tower from aerodyn [-] + TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeLoadAD !< loads on each blade from aerodyn [-] END TYPE ExtLd_InputType ! ======================= ! ========= ExtLd_OutputType ======= @@ -123,11 +125,29 @@ MODULE ExtLoads_Types TYPE(ExtLdDX_OutputType) :: DX_y !< Data to get from external driver [-] TYPE(MeshType) :: TowerLoad !< loads on the tower [-] TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeLoad !< loads on each blade [-] - TYPE(MeshType) :: TowerLoadAD !< loads on the tower from aerodyn [-] - TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeLoadAD !< loads on each blade from aerodyn [-] END TYPE ExtLd_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: ExtLd_x_blah = 1 ! ExtLd%blah + integer(IntKi), public, parameter :: ExtLd_u_DX_u_twrDef = 2 ! ExtLd%DX_u%twrDef + integer(IntKi), public, parameter :: ExtLd_u_DX_u_bldDef = 3 ! ExtLd%DX_u%bldDef + integer(IntKi), public, parameter :: ExtLd_u_DX_u_hubDef = 4 ! ExtLd%DX_u%hubDef + integer(IntKi), public, parameter :: ExtLd_u_DX_u_nacDef = 5 ! ExtLd%DX_u%nacDef + integer(IntKi), public, parameter :: ExtLd_u_DX_u_bldRootDef = 6 ! ExtLd%DX_u%bldRootDef + integer(IntKi), public, parameter :: ExtLd_u_DX_u_bldPitch = 7 ! ExtLd%DX_u%bldPitch + integer(IntKi), public, parameter :: ExtLd_u_az = 8 ! ExtLd%az + integer(IntKi), public, parameter :: ExtLd_u_TowerMotion = 9 ! ExtLd%TowerMotion + integer(IntKi), public, parameter :: ExtLd_u_HubMotion = 10 ! ExtLd%HubMotion + integer(IntKi), public, parameter :: ExtLd_u_NacelleMotion = 11 ! ExtLd%NacelleMotion + integer(IntKi), public, parameter :: ExtLd_u_BladeRootMotion = 12 ! ExtLd%BladeRootMotion(DL%i1) + integer(IntKi), public, parameter :: ExtLd_u_BladeMotion = 13 ! ExtLd%BladeMotion(DL%i1) + integer(IntKi), public, parameter :: ExtLd_u_TowerLoadAD = 14 ! ExtLd%TowerLoadAD + integer(IntKi), public, parameter :: ExtLd_u_BladeLoadAD = 15 ! ExtLd%BladeLoadAD(DL%i1) + integer(IntKi), public, parameter :: ExtLd_y_DX_y_twrLd = 16 ! ExtLd%DX_y%twrLd + integer(IntKi), public, parameter :: ExtLd_y_DX_y_bldLd = 17 ! ExtLd%DX_y%bldLd + integer(IntKi), public, parameter :: ExtLd_y_TowerLoad = 18 ! ExtLd%TowerLoad + integer(IntKi), public, parameter :: ExtLd_y_BladeLoad = 19 ! ExtLd%BladeLoad(DL%i1) + +contains subroutine ExtLd_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(ExtLd_InitInputType), intent(in) :: SrcInitInputData @@ -426,6 +446,9 @@ subroutine ExtLd_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return DstInitOutputData%AirDens = SrcInitOutputData%AirDens + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine ExtLd_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -445,6 +468,8 @@ subroutine ExtLd_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine ExtLd_PackInitOutput(RF, Indata) @@ -456,6 +481,7 @@ subroutine ExtLd_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%WriteOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) call RegPack(RF, InData%AirDens) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -471,6 +497,7 @@ subroutine ExtLd_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine ExtLd_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg) @@ -555,7 +582,6 @@ subroutine ExtLd_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(0), UB(0) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'ExtLd_CopyMisc' @@ -563,18 +589,9 @@ subroutine ExtLd_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) ErrMsg = '' DstMiscData%az = SrcMiscData%az DstMiscData%phi_cfd = SrcMiscData%phi_cfd - if (associated(SrcMiscData%FlowField)) then - if (.not. associated(DstMiscData%FlowField)) then - allocate(DstMiscData%FlowField, stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FlowField.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - call IfW_FlowField_CopyFlowFieldType(SrcMiscData%FlowField, DstMiscData%FlowField, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end if + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine ExtLd_DestroyMisc(MiscData, ErrStat, ErrMsg) @@ -586,29 +603,18 @@ subroutine ExtLd_DestroyMisc(MiscData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'ExtLd_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' - if (associated(MiscData%FlowField)) then - call IfW_FlowField_DestroyFlowFieldType(MiscData%FlowField, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - deallocate(MiscData%FlowField) - MiscData%FlowField => null() - end if + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine ExtLd_PackMisc(RF, Indata) type(RegFile), intent(inout) :: RF type(ExtLd_MiscVarType), intent(in) :: InData character(*), parameter :: RoutineName = 'ExtLd_PackMisc' - logical :: PtrInIndex if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%az) call RegPack(RF, InData%phi_cfd) - call RegPack(RF, associated(InData%FlowField)) - if (associated(InData%FlowField)) then - call RegPackPointer(RF, c_loc(InData%FlowField), PtrInIndex) - if (.not. PtrInIndex) then - call IfW_FlowField_PackFlowFieldType(RF, InData%FlowField) - end if - end if + call NWTC_Library_PackModJacType(RF, InData%Jac) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -616,32 +622,10 @@ subroutine ExtLd_UnPackMisc(RF, OutData) type(RegFile), intent(inout) :: RF type(ExtLd_MiscVarType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'ExtLd_UnPackMisc' - integer(B4Ki) :: LB(0), UB(0) - integer(IntKi) :: stat - logical :: IsAllocAssoc - integer(B8Ki) :: PtrIdx - type(c_ptr) :: Ptr if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%az); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%phi_cfd); if (RegCheckErr(RF, RoutineName)) return - if (associated(OutData%FlowField)) deallocate(OutData%FlowField) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackPointer(RF, Ptr, PtrIdx); if (RegCheckErr(RF, RoutineName)) return - if (c_associated(Ptr)) then - call c_f_pointer(Ptr, OutData%FlowField) - else - allocate(OutData%FlowField,stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%FlowField.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - RF%Pointers(PtrIdx) = c_loc(OutData%FlowField) - call IfW_FlowField_UnpackFlowFieldType(RF, OutData%FlowField) ! FlowField - end if - else - OutData%FlowField => null() - end if + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac end subroutine subroutine ExtLd_CopyConstrState(SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg) @@ -863,6 +847,25 @@ subroutine ExtLd_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg if (ErrStat >= AbortErrLev) return end do end if + call MeshCopy(SrcInputData%TowerLoadAD, DstInputData%TowerLoadAD, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcInputData%BladeLoadAD)) then + LB(1:1) = lbound(SrcInputData%BladeLoadAD) + UB(1:1) = ubound(SrcInputData%BladeLoadAD) + if (.not. allocated(DstInputData%BladeLoadAD)) then + allocate(DstInputData%BladeLoadAD(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%BladeLoadAD.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MeshCopy(SrcInputData%BladeLoadAD(i1), DstInputData%BladeLoadAD(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if end subroutine subroutine ExtLd_DestroyInput(InputData, ErrStat, ErrMsg) @@ -902,6 +905,17 @@ subroutine ExtLd_DestroyInput(InputData, ErrStat, ErrMsg) end do deallocate(InputData%BladeMotion) end if + call MeshDestroy( InputData%TowerLoadAD, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InputData%BladeLoadAD)) then + LB(1:1) = lbound(InputData%BladeLoadAD) + UB(1:1) = ubound(InputData%BladeLoadAD) + do i1 = LB(1), UB(1) + call MeshDestroy( InputData%BladeLoadAD(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(InputData%BladeLoadAD) + end if end subroutine subroutine ExtLd_PackInput(RF, Indata) @@ -934,6 +948,16 @@ subroutine ExtLd_PackInput(RF, Indata) call MeshPack(RF, InData%BladeMotion(i1)) end do end if + call MeshPack(RF, InData%TowerLoadAD) + call RegPack(RF, allocated(InData%BladeLoadAD)) + if (allocated(InData%BladeLoadAD)) then + call RegPackBounds(RF, 1, lbound(InData%BladeLoadAD), ubound(InData%BladeLoadAD)) + LB(1:1) = lbound(InData%BladeLoadAD) + UB(1:1) = ubound(InData%BladeLoadAD) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%BladeLoadAD(i1)) + end do + end if if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -977,6 +1001,20 @@ subroutine ExtLd_UnPackInput(RF, OutData) call MeshUnpack(RF, OutData%BladeMotion(i1)) ! BladeMotion end do end if + call MeshUnpack(RF, OutData%TowerLoadAD) ! TowerLoadAD + if (allocated(OutData%BladeLoadAD)) deallocate(OutData%BladeLoadAD) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BladeLoadAD(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeLoadAD.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%BladeLoadAD(i1)) ! BladeLoadAD + end do + end if end subroutine subroutine ExtLd_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) @@ -1014,25 +1052,6 @@ subroutine ExtLd_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, Err if (ErrStat >= AbortErrLev) return end do end if - call MeshCopy(SrcOutputData%TowerLoadAD, DstOutputData%TowerLoadAD, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcOutputData%BladeLoadAD)) then - LB(1:1) = lbound(SrcOutputData%BladeLoadAD) - UB(1:1) = ubound(SrcOutputData%BladeLoadAD) - if (.not. allocated(DstOutputData%BladeLoadAD)) then - allocate(DstOutputData%BladeLoadAD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BladeLoadAD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%BladeLoadAD(i1), DstOutputData%BladeLoadAD(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if end subroutine subroutine ExtLd_DestroyOutput(OutputData, ErrStat, ErrMsg) @@ -1059,17 +1078,6 @@ subroutine ExtLd_DestroyOutput(OutputData, ErrStat, ErrMsg) end do deallocate(OutputData%BladeLoad) end if - call MeshDestroy( OutputData%TowerLoadAD, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(OutputData%BladeLoadAD)) then - LB(1:1) = lbound(OutputData%BladeLoadAD) - UB(1:1) = ubound(OutputData%BladeLoadAD) - do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%BladeLoadAD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(OutputData%BladeLoadAD) - end if end subroutine subroutine ExtLd_PackOutput(RF, Indata) @@ -1090,16 +1098,6 @@ subroutine ExtLd_PackOutput(RF, Indata) call MeshPack(RF, InData%BladeLoad(i1)) end do end if - call MeshPack(RF, InData%TowerLoadAD) - call RegPack(RF, allocated(InData%BladeLoadAD)) - if (allocated(InData%BladeLoadAD)) then - call RegPackBounds(RF, 1, lbound(InData%BladeLoadAD), ubound(InData%BladeLoadAD)) - LB(1:1) = lbound(InData%BladeLoadAD) - UB(1:1) = ubound(InData%BladeLoadAD) - do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BladeLoadAD(i1)) - end do - end if if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1127,20 +1125,6 @@ subroutine ExtLd_UnPackOutput(RF, OutData) call MeshUnpack(RF, OutData%BladeLoad(i1)) ! BladeLoad end do end if - call MeshUnpack(RF, OutData%TowerLoadAD) ! TowerLoadAD - if (allocated(OutData%BladeLoadAD)) deallocate(OutData%BladeLoadAD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BladeLoadAD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BladeLoadAD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BladeLoadAD(i1)) ! BladeLoadAD - end do - end if end subroutine subroutine ExtLd_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -1261,6 +1245,14 @@ SUBROUTINE ExtLd_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMs CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END DO END IF ! check if allocated + CALL MeshExtrapInterp1(u1%TowerLoadAD, u2%TowerLoadAD, tin, u_out%TowerLoadAD, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%BladeLoadAD) .AND. ALLOCATED(u1%BladeLoadAD)) THEN + do i1 = lbound(u_out%BladeLoadAD,1),ubound(u_out%BladeLoadAD,1) + CALL MeshExtrapInterp1(u1%BladeLoadAD(i1), u2%BladeLoadAD(i1), tin, u_out%BladeLoadAD(i1), tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END DO + END IF ! check if allocated END SUBROUTINE SUBROUTINE ExtLd_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) @@ -1339,6 +1331,14 @@ SUBROUTINE ExtLd_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, E CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END DO END IF ! check if allocated + CALL MeshExtrapInterp2(u1%TowerLoadAD, u2%TowerLoadAD, u3%TowerLoadAD, tin, u_out%TowerLoadAD, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%BladeLoadAD) .AND. ALLOCATED(u1%BladeLoadAD)) THEN + do i1 = lbound(u_out%BladeLoadAD,1),ubound(u_out%BladeLoadAD,1) + CALL MeshExtrapInterp2(u1%BladeLoadAD(i1), u2%BladeLoadAD(i1), u3%BladeLoadAD(i1), tin, u_out%BladeLoadAD(i1), tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END DO + END IF ! check if allocated END SUBROUTINE subroutine ExtLd_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg) @@ -1448,14 +1448,6 @@ SUBROUTINE ExtLd_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrM CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END DO END IF ! check if allocated - CALL MeshExtrapInterp1(y1%TowerLoadAD, y2%TowerLoadAD, tin, y_out%TowerLoadAD, tin_out, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ALLOCATED(y_out%BladeLoadAD) .AND. ALLOCATED(y1%BladeLoadAD)) THEN - do i1 = lbound(y_out%BladeLoadAD,1),ubound(y_out%BladeLoadAD,1) - CALL MeshExtrapInterp1(y1%BladeLoadAD(i1), y2%BladeLoadAD(i1), tin, y_out%BladeLoadAD(i1), tin_out, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - END DO - END IF ! check if allocated END SUBROUTINE SUBROUTINE ExtLd_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) @@ -1523,14 +1515,335 @@ SUBROUTINE ExtLd_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END DO END IF ! check if allocated - CALL MeshExtrapInterp2(y1%TowerLoadAD, y2%TowerLoadAD, y3%TowerLoadAD, tin, y_out%TowerLoadAD, tin_out, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - IF (ALLOCATED(y_out%BladeLoadAD) .AND. ALLOCATED(y1%BladeLoadAD)) THEN - do i1 = lbound(y_out%BladeLoadAD,1),ubound(y_out%BladeLoadAD,1) - CALL MeshExtrapInterp2(y1%BladeLoadAD(i1), y2%BladeLoadAD(i1), y3%BladeLoadAD(i1), tin, y_out%BladeLoadAD(i1), tin_out, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) - END DO - END IF ! check if allocated END SUBROUTINE + +function ExtLd_InputMeshPointer(u, DL) result(Mesh) + type(ExtLd_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ExtLd_u_TowerMotion) + Mesh => u%TowerMotion + case (ExtLd_u_HubMotion) + Mesh => u%HubMotion + case (ExtLd_u_NacelleMotion) + Mesh => u%NacelleMotion + case (ExtLd_u_BladeRootMotion) + Mesh => u%BladeRootMotion(DL%i1) + case (ExtLd_u_BladeMotion) + Mesh => u%BladeMotion(DL%i1) + case (ExtLd_u_TowerLoadAD) + Mesh => u%TowerLoadAD + case (ExtLd_u_BladeLoadAD) + Mesh => u%BladeLoadAD(DL%i1) + end select +end function + +function ExtLd_OutputMeshPointer(y, DL) result(Mesh) + type(ExtLd_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ExtLd_y_TowerLoad) + Mesh => y%TowerLoad + case (ExtLd_y_BladeLoad) + Mesh => y%BladeLoad(DL%i1) + end select +end function + +subroutine ExtLd_VarsPackContState(Vars, x, ValAry) + type(ExtLd_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ExtLd_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ExtLd_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ExtLd_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLd_x_blah) + VarVals(1) = x%blah ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtLd_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLd_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ExtLd_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine ExtLd_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLd_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLd_x_blah) + x%blah = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function ExtLd_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtLd_x_blah) + Name = "x%blah" + case default + Name = "Unknown Field" + end select +end function + +subroutine ExtLd_VarsPackContStateDeriv(Vars, x, ValAry) + type(ExtLd_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ExtLd_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ExtLd_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ExtLd_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLd_x_blah) + VarVals(1) = x%blah ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtLd_VarsPackInput(Vars, u, ValAry) + type(ExtLd_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ExtLd_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine ExtLd_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(ExtLd_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLd_u_DX_u_twrDef) + VarVals = u%DX_u%twrDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLd_u_DX_u_bldDef) + VarVals = u%DX_u%bldDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLd_u_DX_u_hubDef) + VarVals = u%DX_u%hubDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLd_u_DX_u_nacDef) + VarVals = u%DX_u%nacDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLd_u_DX_u_bldRootDef) + VarVals = u%DX_u%bldRootDef(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLd_u_DX_u_bldPitch) + VarVals = u%DX_u%bldPitch(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLd_u_az) + VarVals(1) = u%az ! Scalar + case (ExtLd_u_TowerMotion) + call MV_PackMesh(V, u%TowerMotion, ValAry) ! Mesh + case (ExtLd_u_HubMotion) + call MV_PackMesh(V, u%HubMotion, ValAry) ! Mesh + case (ExtLd_u_NacelleMotion) + call MV_PackMesh(V, u%NacelleMotion, ValAry) ! Mesh + case (ExtLd_u_BladeRootMotion) + call MV_PackMesh(V, u%BladeRootMotion(DL%i1), ValAry) ! Mesh + case (ExtLd_u_BladeMotion) + call MV_PackMesh(V, u%BladeMotion(DL%i1), ValAry) ! Mesh + case (ExtLd_u_TowerLoadAD) + call MV_PackMesh(V, u%TowerLoadAD, ValAry) ! Mesh + case (ExtLd_u_BladeLoadAD) + call MV_PackMesh(V, u%BladeLoadAD(DL%i1), ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtLd_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLd_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ExtLd_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine ExtLd_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLd_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLd_u_DX_u_twrDef) + u%DX_u%twrDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLd_u_DX_u_bldDef) + u%DX_u%bldDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLd_u_DX_u_hubDef) + u%DX_u%hubDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLd_u_DX_u_nacDef) + u%DX_u%nacDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLd_u_DX_u_bldRootDef) + u%DX_u%bldRootDef(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLd_u_DX_u_bldPitch) + u%DX_u%bldPitch(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLd_u_az) + u%az = VarVals(1) ! Scalar + case (ExtLd_u_TowerMotion) + call MV_UnpackMesh(V, ValAry, u%TowerMotion) ! Mesh + case (ExtLd_u_HubMotion) + call MV_UnpackMesh(V, ValAry, u%HubMotion) ! Mesh + case (ExtLd_u_NacelleMotion) + call MV_UnpackMesh(V, ValAry, u%NacelleMotion) ! Mesh + case (ExtLd_u_BladeRootMotion) + call MV_UnpackMesh(V, ValAry, u%BladeRootMotion(DL%i1)) ! Mesh + case (ExtLd_u_BladeMotion) + call MV_UnpackMesh(V, ValAry, u%BladeMotion(DL%i1)) ! Mesh + case (ExtLd_u_TowerLoadAD) + call MV_UnpackMesh(V, ValAry, u%TowerLoadAD) ! Mesh + case (ExtLd_u_BladeLoadAD) + call MV_UnpackMesh(V, ValAry, u%BladeLoadAD(DL%i1)) ! Mesh + end select + end associate +end subroutine + +function ExtLd_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtLd_u_DX_u_twrDef) + Name = "u%DX_u%twrDef" + case (ExtLd_u_DX_u_bldDef) + Name = "u%DX_u%bldDef" + case (ExtLd_u_DX_u_hubDef) + Name = "u%DX_u%hubDef" + case (ExtLd_u_DX_u_nacDef) + Name = "u%DX_u%nacDef" + case (ExtLd_u_DX_u_bldRootDef) + Name = "u%DX_u%bldRootDef" + case (ExtLd_u_DX_u_bldPitch) + Name = "u%DX_u%bldPitch" + case (ExtLd_u_az) + Name = "u%az" + case (ExtLd_u_TowerMotion) + Name = "u%TowerMotion" + case (ExtLd_u_HubMotion) + Name = "u%HubMotion" + case (ExtLd_u_NacelleMotion) + Name = "u%NacelleMotion" + case (ExtLd_u_BladeRootMotion) + Name = "u%BladeRootMotion("//trim(Num2LStr(DL%i1))//")" + case (ExtLd_u_BladeMotion) + Name = "u%BladeMotion("//trim(Num2LStr(DL%i1))//")" + case (ExtLd_u_TowerLoadAD) + Name = "u%TowerLoadAD" + case (ExtLd_u_BladeLoadAD) + Name = "u%BladeLoadAD("//trim(Num2LStr(DL%i1))//")" + case default + Name = "Unknown Field" + end select +end function + +subroutine ExtLd_VarsPackOutput(Vars, y, ValAry) + type(ExtLd_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ExtLd_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine ExtLd_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(ExtLd_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLd_y_DX_y_twrLd) + VarVals = y%DX_y%twrLd(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLd_y_DX_y_bldLd) + VarVals = y%DX_y%bldLd(V%iLB:V%iUB) ! Rank 1 Array + case (ExtLd_y_TowerLoad) + call MV_PackMesh(V, y%TowerLoad, ValAry) ! Mesh + case (ExtLd_y_BladeLoad) + call MV_PackMesh(V, y%BladeLoad(DL%i1), ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtLd_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLd_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ExtLd_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine ExtLd_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtLd_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtLd_y_DX_y_twrLd) + y%DX_y%twrLd(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLd_y_DX_y_bldLd) + y%DX_y%bldLd(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtLd_y_TowerLoad) + call MV_UnpackMesh(V, ValAry, y%TowerLoad) ! Mesh + case (ExtLd_y_BladeLoad) + call MV_UnpackMesh(V, ValAry, y%BladeLoad(DL%i1)) ! Mesh + end select + end associate +end subroutine + +function ExtLd_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtLd_y_DX_y_twrLd) + Name = "y%DX_y%twrLd" + case (ExtLd_y_DX_y_bldLd) + Name = "y%DX_y%bldLd" + case (ExtLd_y_TowerLoad) + Name = "y%TowerLoad" + case (ExtLd_y_BladeLoad) + Name = "y%BladeLoad("//trim(Num2LStr(DL%i1))//")" + case default + Name = "Unknown Field" + end select +end function + END MODULE ExtLoads_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/extptfm/src/ExtPtfm_MCKF.f90 b/modules/extptfm/src/ExtPtfm_MCKF.f90 index 0af5205be2..61f3fe3aab 100644 --- a/modules/extptfm/src/ExtPtfm_MCKF.f90 +++ b/modules/extptfm/src/ExtPtfm_MCKF.f90 @@ -29,7 +29,7 @@ MODULE ExtPtfm_MCKF USE ExtPtfm_MCKF_Types - USE ExtPtfm_MCKF_Parameters ! ID_*, N_INPUTS, N_OUTPUTS + USE ExtPtfm_MCKF_Parameters ! ID_* USE NWTC_Library USE NWTC_LAPACK @@ -59,10 +59,6 @@ MODULE ExtPtfm_MCKF PUBLIC :: ExtPtfm_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- ! (Xd), and constraint-state (Z) functions all with respect to the constraint ! states (z) - PUBLIC :: ExtPtfm_GetOP ! Routine to get the operating-point values for linearization (from data structures to arrays) - - - CONTAINS @@ -127,7 +123,7 @@ SUBROUTINE ExtPtfm_Init( InitInp, u, p, x, xd, z, OtherState, y, m, dt_gluecode, p%nTot = -1 p%nCB = -1 - call ReadPrimaryFile(InitInp%InputFile, p, InitInp%RootName, InputFileData, ErrStat, ErrMsg); if(Failed()) return + call ReadPrimaryFile(InitInp%InputFile, InitInp, p, InitInp%RootName, InputFileData, ErrStat, ErrMsg); if(Failed()) return ! --- Setting Params from Input file data p%IntMethod = InputFileData%IntMethod @@ -136,6 +132,9 @@ SUBROUTINE ExtPtfm_Init( InitInp, u, p, x, xd, z, OtherState, y, m, dt_gluecode, else p%EP_DeltaT = InputFileData%DT endif + ! Switch for modeling rigid-body modes + p%RBMod = InputFileData%RBMod + p%hasRBMode = InputFileData%hasRBMode ! Setting p%OutParam from OutList call SetOutParam(InputFileData%OutList, InputFileData%NumOuts, p, ErrStat, ErrMsg); if(Failed()) return ! Set the constant state matrices A,B,C,D @@ -181,19 +180,37 @@ SUBROUTINE ExtPtfm_Init( InitInp, u, p, x, xd, z, OtherState, y, m, dt_gluecode, !m%EquilStart = InputFileData%EquilStart m%EquilStart = .False. ! Feature not yet implemented - m%Indx = 1 ! used to optimize interpolation of loads in time - call AllocAry( m%F_at_t, p%nTot,'Loads at t', ErrStat,ErrMsg); if(Failed()) return - do I=1,p%nTot; m%F_at_t(I)=0; end do + m%Indx_UsrModeF = 1 ! used to optimize interpolation of loads in time + m%Indx_UsrConnF = 1 ! used to optimize interpolation of loads in time + call AllocAry( m%F_at_t, p%nTot,'User-defined modal loads at t', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( m%FConn_at_t, 3*p%nConn,'User-defined connection loads at t', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( m%F1, 6,'Interface/rigid-body mode forcing', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( m%F2, p%nCB,'Internal elastic mode forcing', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( m%Weight, p%nTot,'Structure self-weight', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( m%DConn, 3_IntKi*p%nConn, 'Connection point displacement', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( m%VConn, 3_IntKi*p%nConn, 'Connection point velocity', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( m%AConn, 3_IntKi*p%nConn, 'Connection point acceleration', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( m%FConn, 3_IntKi*p%nConn, 'Connection force vector', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( m%FConnCB, p%nTot, 'Connection force vector', ErrStat,ErrMsg); if(Failed()) return call AllocAry( m%xFlat, 2*p%nCB,'xFlat', ErrStat,ErrMsg); if(Failed()) return - do I=1,2*p%nCB; m%xFlat(I)=0; end do - do I=1,N_INPUTS; m%uFlat(I)=0; end do + m%xFlat=0.0_ReKi + m%uFlat=0.0_ReKi ! Define initial guess (set up mesh first) for the system inputs here: - call Init_meshes(u, y, InitInp, ErrStat, ErrMsg); if(Failed()) return + call Init_meshes(u, p, y, InitInp, ErrStat, ErrMsg); if(Failed()) return + call AllocAry( u%Fm, p%nCB, 'Internal elastic mode forcing', ErrStat,ErrMsg); if(Failed()) return + u%Fm = 0.0_ReKi ! --- Outputs - CALL AllocAry( m%AllOuts, ID_QStart+3*p%nCBFull-1, "ExtPtfm AllOut", ErrStat,ErrMsg ); if(Failed()) return - m%AllOuts(1:ID_QStart+3*p%nCBFull-1) = 0.0 + call AllocAry( y%qm, p%nCB, 'Internal elastic mode displacement', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( y%qmdot, p%nCB, 'Internal elastic mode velocity', ErrStat,ErrMsg); if(Failed()) return + call AllocAry( y%qmdotdot, p%nCB, 'Internal elastic mode acceleration', ErrStat,ErrMsg); if(Failed()) return + y%qm = x%qm + y%qmdot = x%qmdot + y%qmdotdot = 0.0_ReKi + + CALL AllocAry( m%AllOuts, ID_QStart+4*p%nCBFull-1, "ExtPtfm AllOut", ErrStat,ErrMsg ); if(Failed()) return + m%AllOuts(1:ID_QStart+4*p%nCBFull-1) = 0.0 call AllocAry( y%WriteOutput, p%NumOuts,'WriteOutput', ErrStat,ErrMsg); if(Failed()) return call AllocAry(InitOut%WriteOutputHdr,p%NumOuts,'WriteOutputHdr',ErrStat,ErrMsg); if(Failed()) return call AllocAry(InitOut%WriteOutputUnt,p%NumOuts,'WriteOutputUnt',ErrStat,ErrMsg); if(Failed()) return @@ -201,49 +218,10 @@ SUBROUTINE ExtPtfm_Init( InitInp, u, p, x, xd, z, OtherState, y, m, dt_gluecode, InitOut%WriteOutputHdr(1:p%NumOuts) = p%OutParam(1:p%NumOuts)%Name InitOut%WriteOutputUnt(1:p%NumOuts) = p%OutParam(1:p%NumOuts)%Units InitOut%Ver = ExtPtfm_Ver - - if (InitInp%Linearize) then - ! TODO The linearization features are in place but waiting for glue-code changes, and testing. - CALL SetErrStat( ErrID_Fatal, 'ExtPtfm_MCKF linearization analysis is currently not supported by the glue code.', ErrStat, ErrMsg, 'ExtPtfm_Init'); - if(Failed())return - !Appropriate Jacobian row/column names and rotating-frame flags here: - CALL AllocAry(InitOut%LinNames_y, 6+p%NumOuts , 'LinNames_y', ErrStat, ErrMsg); if(Failed()) return - CALL AllocAry(InitOut%RotFrame_y, 6+p%NumOuts , 'RotFrame_y', ErrStat, ErrMsg); if(Failed()) return - CALL AllocAry(InitOut%LinNames_x, 2*p%nCB , 'LinNames_x', ErrStat, ErrMsg); if(Failed()) return - CALL AllocAry(InitOut%RotFrame_x, 2*p%nCB , 'RotFrame_x', ErrStat, ErrMsg); if(Failed()) return - CALL AllocAry(InitOut%DerivOrder_x, 2*p%nCB , 'DerivOrd_x', ErrStat, ErrMsg); if(Failed()) return - CALL AllocAry(InitOut%LinNames_u, N_INPUTS , 'LinNames_u', ErrStat, ErrMsg); if(Failed()) return - CALL AllocAry(InitOut%RotFrame_u, N_INPUTS , 'RotFrame_u', ErrStat, ErrMsg); if(Failed()) return - CALL AllocAry(InitOut%IsLoad_u , N_INPUTS , 'IsLoad_u' , ErrStat, ErrMsg); if(Failed()) return - InitOut%DerivOrder_x(:)=2 - ! LinNames_y - do I=1,3; - InitOut%LinNames_y(I) = 'Interface node '//XYZ(I)//' force, N' - InitOut%LinNames_y(I+3) = 'Interface node '//XYZ(I)//' moment, Nm' - enddo - do i=1,p%NumOuts - InitOut%LinNames_y(N_OUTPUTS+i) = trim(p%OutParam(i)%Name)//', '//p%OutParam(i)%Units - end do - ! LinNames_u - do I=1,3; - InitOut%LinNames_u(I+ 0) = 'Interface node '//XYZ(I)//' translation displacement, m' - InitOut%LinNames_u(I+ 3) = 'Interface node '//XYZ(I)//' rotation, rad' - InitOut%LinNames_u(I+ 6) = 'Interface node '//XYZ(I)//' translation velocity, m/s' - InitOut%LinNames_u(I+ 9) = 'Interface node '//XYZ(I)//' rotation velocity, rad/s' - InitOut%LinNames_u(I+12) = 'Interface node '//XYZ(I)//' translation acceleration, m/s^2' - InitOut%LinNames_u(I+15) = 'Interface node '//XYZ(I)//' rotation acceleration, rad/s^2' - enddo - ! LinNames_x - do I=1,p%nCB; - InitOut%LinNames_x(I) = 'Mode '//trim(Num2LStr(p%ActiveCBDOF(I)))//' displacement, -'; - InitOut%LinNames_x(I+p%nCB) = 'Mode '//trim(Num2LStr(p%ActiveCBDOF(I)))//' velocity, -'; - enddo - ! - InitOut%RotFrame_x = .false. ! note that meshes are in the global, not rotating frame - InitOut%RotFrame_y = .false. ! note that meshes are in the global, not rotating frame - InitOut%RotFrame_u = .false. ! note that meshes are in the global, not rotating frame - InitOut%IsLoad_u = .false. ! the inputs are not loads but kinematics - end if + + ! --- Module variables + call ExtPtfm_InitVars(u, p, x, y, m, InitOut%Vars, InputFileData, InitInp%Linearize, ErrStat, ErrMsg) + if (Failed()) return ! --- Summary file if (InputFileData%SumPrint) then @@ -257,6 +235,161 @@ logical function Failed() end function Failed END SUBROUTINE ExtPtfm_Init +subroutine ExtPtfm_InitVars(u, p, x, y, m, Vars, InputFileData, Linearize, ErrStat, ErrMsg) + type(ExtPtfm_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(ExtPtfm_ParameterType), intent(inout) :: p !< Parameters + type(ExtPtfm_ContinuousStateType), intent(inout) :: x !< Continuous state + type(ExtPtfm_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(ExtPtfm_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(ModVarsType), intent(inout) :: Vars !< Module variables + type(ExtPtfm_InputFile), intent(in) :: InputFileData !< Input file data + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'ExtPtfm_InitVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i, j, k + integer(IntKi), allocatable :: BladeMeshFields(:) + real(R8Ki) :: MaxThrust, MaxTorque, ScaleLength + integer(IntKi) :: Flags, Field + + ErrStat = ErrID_None + ErrMsg = "" + + ScaleLength = 100 + MaxThrust = 490.0_R8Ki * pi_D / 9.0_R8Ki * ScaleLength**2 + MaxTorque = 122.5_R8Ki * pi_D / 27.0_R8Ki * ScaleLength**3 + + ! Clear module variables type + call NWTC_Library_DestroyModVarsType(Vars, ErrStat2, ErrMsg2); if (Failed()) return + + !--------------------------------------------------------------------------- + ! Continuous State Variables + !--------------------------------------------------------------------------- + + do i = 1, p%nCB + call MV_AddVar(Vars%x, "Mode"//trim(Num2LStr(p%ActiveCBDOF(i))), FieldTransDisp, & + DL=DatLoc(ExtPtfm_x_qm), iAry=i, & + DerivOrder=0, & + Perturb=2.0_ReKi*D2R_D, & + Flags=VF_Solve, & + LinNames=['Mode '//trim(Num2LStr(p%ActiveCBDOF(i)))//' displacement, -']) + end do + + do i = 1, p%nCB + call MV_AddVar(Vars%x, "Mode"//trim(Num2LStr(p%ActiveCBDOF(i))), FieldTransVel, & + DL=DatLoc(ExtPtfm_x_qmdot), iAry=i, & + DerivOrder=1, & + Perturb=2.0_ReKi*D2R_D, & + Flags=VF_Solve, & + LinNames=['Mode '//trim(Num2LStr(p%ActiveCBDOF(i)))//' velocity, -/s']) + end do + + !--------------------------------------------------------------------------- + ! Input variables + !--------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%u, 'Interface node', MotionFields, & + DatLoc(ExtPtfm_u_PtfmMesh), & + Mesh=u%PtfmMesh, & + Perturbs=[2.0_R8Ki*D2R_D, & ! TranslationDisp + 2.0_R8Ki*D2R_D, & ! Orientation + 2.0_R8Ki*D2R_D, & ! TranslationVel + 2.0_R8Ki*D2R_D, & ! RotationVel + 2.0_R8Ki*D2R_D, & ! TranslationAcc + 2.0_R8Ki*D2R_D]) ! RotationalAcc + + call MV_AddMeshVar(Vars%u, 'Rigid-body load mesh', LoadFields, & + DatLoc(ExtPtfm_u_FBMesh), & + Mesh=u%FBMesh, & + Perturbs=[MaxThrust/100.0_R8Ki, & ! Force + MaxTorque/100.0_R8Ki]) ! Moment + + call MV_AddMeshVar(Vars%u, 'Connection load mesh', LoadFields, & + DatLoc(ExtPtfm_u_ConnLDMesh), & + Mesh=u%ConnLdMesh, & + PerTurbs=[MaxThrust/100.0_R8Ki, & ! Force + MaxTorque/100.0_R8Ki], & ! Moment + Active=p%nConn > 0_IntKi) + + if ( p%nCB > 0_IntKi ) then + call MV_AddVar(Vars%u, 'Fm', FieldScalar, & + DL=DatLoc(ExtPtfm_u_Fm), & + Num=size(u%Fm), & + Flags = ior(VF_Linearize,VF_Solve), & + Perturb = 2.0_R8Ki*D2R_D, & ! The inertias of Craig-Bampton modes are normalized to O(1) + LinNames=[('Follower mode '//trim(num2lstr(i))//' forcing, -', i=1,size(u%Fm))]) + end if + + !--------------------------------------------------------------------------- + ! Output variables + !--------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%y, "Interface node", LoadFields, & + DL=DatLoc(ExtPtfm_y_PtfmMesh), & + Mesh=y%PtfmMesh) + + call MV_AddMeshVar(Vars%y, "Rigid-body motion mesh", MotionFields, & + DL=DatLoc(ExtPtfm_y_FBMesh), & + Mesh=y%FBMesh) + + call MV_AddMeshVar(Vars%y, 'Connection point mesh', MotionFields, & + DL=DatLoc(ExtPtfm_y_ConnMesh), & + Mesh=y%ConnMesh, & + Active=p%nConn > 0_IntKi) + + if ( p%nCB>0_IntKi ) then + call MV_AddVar(Vars%y, "qm", FieldScalar, & + DL=DatLoc(ExtPtfm_y_qm), & + Num=size(y%qm), & + Flags=VF_Solve, & + LinNames=[('Follower mode '//trim(num2lstr(i))//' displacement, -', i=1,size(y%qm))]) + + call MV_AddVar(Vars%y, "qmdot", FieldScalar, & + DL=DatLoc(ExtPtfm_y_qmdot), & + Num=size(y%qmdot), & + Flags=VF_Solve, & + LinNames=[('Follower mode '//trim(num2lstr(i))//' velocity, -/s', i=1,size(y%qmdot))]) + + call MV_AddVar(Vars%y, "qmdotdot", FieldScalar, & + DL=DatLoc(ExtPtfm_y_qmdotdot), & + Num=size(y%qmdotdot), & + Flags=VF_Solve, & + LinNames=[('Follower mode '//trim(num2lstr(i))//' acceleration, -/s^2', i=1,size(y%qmdotdot))]) + end if + + if ( p%NumOuts > 0_IntKi ) then + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, & + DL=DatLoc(ExtPtfm_y_WriteOutput), & + Num=p%NumOuts, & + Flags=VF_WriteOut, & + LinNames=[(WriteOutLinName(i), i=1, p%NumOuts)]) + end if + + !--------------------------------------------------------------------------- + ! Initialization dependent on linearization + !--------------------------------------------------------------------------- + + call MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + +contains + function WriteOutLinName(iParam) result(Name) + integer(IntKi), intent(in) :: iParam + character(LinChanLen) :: Name + Name = trim(p%OutParam(iParam)%Name)//', '//p%OutParam(iParam)%Units + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine !---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE SetStateMatrices( p, ErrStat, ErrMsg) @@ -266,89 +399,103 @@ SUBROUTINE SetStateMatrices( p, ErrStat, ErrMsg) CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message ! Local variables: INTEGER(IntKi) :: I ! loop counter - INTEGER(IntKi) :: nX ! Number of states - INTEGER(IntKi) :: nU ! Number of inputs - INTEGER(IntKi) :: nY ! Number of ouputs INTEGER(IntKi) :: n1 ! Number of interface DOF INTEGER(IntKi) :: n2 ! Number of CB DOF - real(ReKi), dimension(:,:), allocatable :: I22 - ! Init - nX = 2*p%nCB - nU = 3*6 - nY = 6 - n1 = 6 + + ErrStat = ErrID_None + ErrMsg = "" + + n1 = 6_IntKi n2 = p%nCB - if (allocated(p%AMat)) deallocate(p%AMat) - if (allocated(p%BMat)) deallocate(p%BMat) - if (allocated(p%CMat)) deallocate(p%CMat) - if (allocated(p%DMat)) deallocate(p%DMat) - if (allocated(p%M11)) deallocate(p%M11) - if (allocated(p%M12)) deallocate(p%M12) - if (allocated(p%M22)) deallocate(p%M22) - if (allocated(p%M21)) deallocate(p%M21) - if (allocated(p%C11)) deallocate(p%C11) - if (allocated(p%C12)) deallocate(p%C12) - if (allocated(p%C22)) deallocate(p%C22) - if (allocated(p%C21)) deallocate(p%C21) - if (allocated(p%K11)) deallocate(p%C11) - if (allocated(p%K22)) deallocate(p%C22) - ! Allocation - call allocAry(p%AMat, nX, nX, 'p%AMat', ErrStat, ErrMsg); if(Failed()) return ; p%AMat(1:nX,1:nX) =0 - call allocAry(p%BMat, nX, nU, 'p%BMat', ErrStat, ErrMsg); if(Failed()) return ; p%BMat(1:nX,1:nU) =0 - call allocAry(p%FX , nX, 'p%FX' , ErrStat, ErrMsg); if(Failed()) return ; p%Fx (1:nX) =0 - call allocAry(p%CMat, nY, nX, 'p%CMat', ErrStat, ErrMsg); if(Failed()) return ; p%CMat(1:nY,1:nX) =0 - call allocAry(p%DMat, nY, nU, 'p%DMat', ErrStat, ErrMsg); if(Failed()) return ; p%DMat(1:nY,1:nU) =0 - call allocAry(p%FY , nY, 'p%FY' , ErrStat, ErrMsg); if(Failed()) return ; p%FY (1:nY) =0 - call allocAry(p%M11 , n1, n1, 'p%M11' , ErrStat, ErrMsg); if(Failed()) return ; p%M11 (1:n1,1:n1) =0 - call allocAry(p%K11 , n1, n1, 'p%K11' , ErrStat, ErrMsg); if(Failed()) return ; p%K11 (1:n1,1:n1) =0 - call allocAry(p%C11 , n1, n1, 'p%C11' , ErrStat, ErrMsg); if(Failed()) return ; p%C11 (1:n1,1:n1) =0 - call allocAry(p%M22 , n2, n2, 'p%M22' , ErrStat, ErrMsg); if(Failed()) return ; p%M22 (1:n2,1:n2) =0 - call allocAry(p%K22 , n2, n2, 'p%K22' , ErrStat, ErrMsg); if(Failed()) return ; p%K22 (1:n2,1:n2) =0 - call allocAry(p%C22 , n2, n2, 'p%C22' , ErrStat, ErrMsg); if(Failed()) return ; p%C22 (1:n2,1:n2) =0 - call allocAry(p%M12 , n1, n2, 'p%M12' , ErrStat, ErrMsg); if(Failed()) return ; p%M12 (1:n1,1:n2) =0 - call allocAry(p%C12 , n1, n2, 'p%C12' , ErrStat, ErrMsg); if(Failed()) return ; p%C12 (1:n1,1:n2) =0 - call allocAry(p%M21 , n2, n1, 'p%M21' , ErrStat, ErrMsg); if(Failed()) return ; p%M21 (1:n2,1:n1) =0 - call allocAry(p%C21 , n2, n1, 'p%C21' , ErrStat, ErrMsg); if(Failed()) return ; p%C21 (1:n2,1:n1) =0 - call allocAry( I22 , n2, n2, ' I22' , ErrStat, ErrMsg); if(Failed()) return ; I22 (1:n2,1:n2) =0 - do I=1,n2 ; I22(I,I)=1; enddo ! Identity matrix + + call allocAry(p%M11 , n1, n1, 'p%M11' , ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%M12 , n1, n2, 'p%M12' , ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%M21 , n2, n1, 'p%M21' , ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%M22 , n2, n2, 'p%M22' , ErrStat, ErrMsg); if(Failed()) return + + call allocAry(p%K11 , n1, n1, 'p%K11' , ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%K12 , n1, n2, 'p%K12' , ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%K21 , n2, n1, 'p%K21' , ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%K22 , n2, n2, 'p%K22' , ErrStat, ErrMsg); if(Failed()) return + + call allocAry(p%C11 , n1, n1, 'p%C11' , ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%C12 , n1, n2, 'p%C12' , ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%C21 , n2, n1, 'p%C21' , ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%C22 , n2, n2, 'p%C22' , ErrStat, ErrMsg); if(Failed()) return + + call allocAry(p%A1Mat, n2, n2, 'p%A1Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%A2Mat, n2, n2, 'p%A2Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%B1Mat, n2, n1, 'p%A1Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%B2Mat, n2, n1, 'p%A2Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%B3Mat, n2, n1, 'p%A1Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%B4Mat, n2, n2, 'p%A2Mat', ErrStat, ErrMsg); if(Failed()) return + + call allocAry(p%C1Mat, n1, n2, 'p%A1Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%C2Mat, n1, n2, 'p%A2Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%D1Mat, n1, n1, 'p%A1Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%D2Mat, n1, n1, 'p%A2Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%D3Mat, n1, n1, 'p%A1Mat', ErrStat, ErrMsg); if(Failed()) return + call allocAry(p%D4Mat, n1, n2, 'p%A2Mat', ErrStat, ErrMsg); if(Failed()) return + ! Submatrices - p%M11(1:n1,1:n1) = p%Mass(1:n1 ,1:n1 ) - p%C11(1:n1,1:n1) = p%Damp(1:n1 ,1:n1 ) - p%K11(1:n1,1:n1) = p%Stff(1:n1 ,1:n1 ) - p%M12(1:n1,1:n2) = p%Mass(1:n1 ,n1+1:n1+n2) - p%C12(1:n1,1:n2) = p%Damp(1:n1 ,n1+1:n1+n2) - p%M21(1:n2,1:n1) = p%Mass(n1+1:n1+n2,1:n1 ) - p%C21(1:n2,1:n1) = p%Damp(n1+1:n1+n2,1:n1 ) - p%M22(1:n2,1:n2) = p%Mass(n1+1:n1+n2,n1+1:n1+n2) - p%C22(1:n2,1:n2) = p%Damp(n1+1:n1+n2,n1+1:n1+n2) - p%K22(1:n2,1:n2) = p%Stff(n1+1:n1+n2,n1+1:n1+n2) - ! A matrix - p%AMat(1:n2 ,n2+1:nX) = I22 (1:n2,1:n2) - p%AMat(n2+1:nX,1:n2 ) = -p%K22(1:n2,1:n2) - p%AMat(n2+1:nX,n2+1:nX) = -p%C22(1:n2,1:n2) - ! B matrix - p%BMat(n2+1:nX,7 :12 ) = -p%C21(1:n2,1:6) - p%BMat(n2+1:nX,13:18 ) = -p%M21(1:n2,1:6) - ! C matrix - p%CMat(1:nY,1:n2 ) = matmul(p%M12,p%K22) - p%CMat(1:nY,n2+1:nX) = matmul(p%M12,p%C22) - p%C12 - ! D matrix - p%DMat(1:nY,1:6 ) = -p%K11 - p%DMat(1:nY,7:12 ) = -p%C11 + matmul(p%M12,p%C21) - p%DMat(1:nY,13:18 ) = -p%M11 + matmul(p%M12,p%M21) -CONTAINS + p%M11 = p%Mass( 1:n1 , 1:n1 ) + p%M12 = p%Mass( 1:n1 ,n1+1:n1+n2) + p%M21 = p%Mass(n1+1:n1+n2, 1:n1 ) + p%M22 = p%Mass(n1+1:n1+n2,n1+1:n1+n2) + if ( n2 > 0_IntKi ) then + call PseudoInverse(p%M22, p%M22Inv, ErrStat, ErrMsg); if(Failed()) return + else + call allocAry( p%M22Inv , n2, n2, 'p%M22Inv' , ErrStat, ErrMsg); if(Failed()) return ! Empty placeholder array + end if + + p%C11 = p%Damp( 1:n1 , 1:n1 ) + p%C12 = p%Damp( 1:n1 ,n1+1:n1+n2) + p%C21 = p%Damp(n1+1:n1+n2, 1:n1 ) + p%C22 = p%Damp(n1+1:n1+n2,n1+1:n1+n2) + + p%K11 = p%Stff( 1:n1 , 1:n1 ) + p%K12 = p%Stff( 1:n1 ,n1+1:n1+n2) + p%K21 = p%Stff(n1+1:n1+n2, 1:n1 ) + p%K22 = p%Stff(n1+1:n1+n2,n1+1:n1+n2) + + ! A matrices + p%A1Mat = - matmul(p%M22Inv, p%K22) + p%A2Mat = - matmul(p%M22Inv, p%C22) + + ! B matrices + p%B1Mat = - matmul(p%M22Inv, p%K21) + p%B2Mat = - matmul(p%M22Inv, p%C21) + p%B3Mat = - matmul(p%M22Inv, p%M21) + p%B4Mat = p%M22Inv + + ! C matrices + p%C1Mat = p%K12 + matmul( p%M12, p%A1Mat ) + p%C2Mat = p%C12 + matmul( p%M12, p%A2Mat ) + + ! D matrices + p%D1Mat = p%K11 + matmul( p%M12, p%B1Mat ) + p%D2Mat = p%C11 + matmul( p%M12, p%B2Mat ) + p%D3Mat = p%M11 + matmul( p%M12, p%B3Mat ) + p%D4Mat = matmul( p%M12, p%B4Mat ) + + CONTAINS logical function Failed() CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_SetStateMatrices') Failed = ErrStat >= AbortErrLev end function Failed END SUBROUTINE SetStateMatrices !---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE Init_meshes(u, y, InitInp, ErrStat, ErrMsg) +SUBROUTINE Init_meshes(u, p, y, InitInp, ErrStat, ErrMsg) TYPE(ExtPtfm_InputType), INTENT(INOUT) :: u !< System inputs + TYPE(ExtPtfm_ParameterType), INTENT(IN ) :: p !< All the parameter matrices stored in this input file TYPE(ExtPtfm_OutputType), INTENT(INOUT) :: y !< System outputs TYPE(ExtPtfm_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization routine INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! Local variables: + INTEGER(IntKi) :: I ! loop counter + ! Create the input and output meshes associated with platform loads CALL MeshCreate( BlankMesh = u%PtfmMesh , & IOS = COMPONENT_INPUT , & @@ -362,16 +509,73 @@ SUBROUTINE Init_meshes(u, y, InitInp, ErrStat, ErrMsg) TranslationAcc = .TRUE. , & RotationAcc = .TRUE.) if(Failed()) return - ! Create the node on the mesh, the node is located at the PlatformRefzt, to match ElastoDyn - CALL MeshPositionNode (u%PtfmMesh, 1, (/0.0_ReKi, 0.0_ReKi, InitInp%PtfmRefzt/), ErrStat, ErrMsg ); if(Failed()) return + CALL MeshPositionNode (u%PtfmMesh, 1, [InitInp%PtfmRefxt, InitInp%PtfmRefyt, InitInp%PtfmRefzt], ErrStat, ErrMsg ); if(Failed()) return ! Create the mesh element CALL MeshConstructElement ( u%PtfmMesh, ELEMENT_POINT, ErrStat, ErrMsg, 1 ); if(Failed()) return CALL MeshCommit ( u%PtfmMesh, ErrStat, ErrMsg ); if(Failed()) return + ! the output mesh is a sibling of the input: CALL MeshCopy( SrcMesh=u%PtfmMesh, DestMesh=y%PtfmMesh, CtrlCode=MESH_SIBLING, IOS=COMPONENT_OUTPUT, & ErrStat=ErrStat, ErrMess=ErrMsg, Force=.TRUE., Moment=.TRUE. ) if(Failed()) return + + ! Create the input and output meshes associated with platform loads + CALL MeshCreate( BlankMesh = u%FBMesh , & + IOS = COMPONENT_INPUT , & + Nnodes = 1 , & + ErrStat = ErrStat , & + ErrMess = ErrMsg , & + Force = .TRUE. , & + Moment = .TRUE.) + if(Failed()) return + ! Create the node on the mesh, the node is located at the PlatformRefzt, to match ElastoDyn + CALL MeshPositionNode (u%FBMesh, 1, [InitInp%PtfmRefxt, InitInp%PtfmRefyt, InitInp%PtfmRefzt], ErrStat, ErrMsg ); if(Failed()) return + ! Create the mesh element + CALL MeshConstructElement ( u%FBMesh, ELEMENT_POINT, ErrStat, ErrMsg, 1 ); if(Failed()) return + CALL MeshCommit ( u%FBMesh, ErrStat, ErrMsg ); if(Failed()) return + + ! the output mesh is a sibling of the input: + CALL MeshCopy( SrcMesh=u%FBMesh, DestMesh=y%FBMesh, CtrlCode=MESH_SIBLING, IOS=COMPONENT_OUTPUT, & + ErrStat=ErrStat, ErrMess=ErrMsg , & + TranslationDisp = .TRUE. , & + Orientation = .TRUE. , & + TranslationVel = .TRUE. , & + RotationVel = .TRUE. , & + TranslationAcc = .TRUE. , & + RotationAcc = .TRUE. ) + if(Failed()) return + + if (p%nConn>0_IntKi) then + ! Create the input and output meshes associated with platform loads + CALL MeshCreate( BlankMesh = u%ConnLdMesh , & + IOS = COMPONENT_INPUT , & + Nnodes = p%nConn , & + ErrStat = ErrStat , & + ErrMess = ErrMsg , & + Force = .TRUE. , & + Moment = .TRUE.) + if(Failed()) return + do i = 1,p%nConn + ! Create the node on the mesh, the node is located at the user-defined connection points + CALL MeshPositionNode(u%ConnLdMesh, i, p%PosConn(i,:), ErrStat, ErrMsg ); if(Failed()) return + ! Create the mesh element + CALL MeshConstructElement(u%ConnLdMesh, ELEMENT_POINT, ErrStat, ErrMsg, i ); if(Failed()) return + end do + CALL MeshCommit ( u%ConnLdMesh, ErrStat, ErrMsg ); if(Failed()) return + + ! the output mesh is a sibling of the input: + CALL MeshCopy( SrcMesh=u%ConnLdMesh, DestMesh=y%ConnMesh, CtrlCode=MESH_SIBLING, IOS=COMPONENT_OUTPUT, & + ErrStat=ErrStat, ErrMess=ErrMsg , & + TranslationDisp = .TRUE. , & + Orientation = .TRUE. , & + TranslationVel = .TRUE. , & + RotationVel = .TRUE. , & + TranslationAcc = .TRUE. , & + RotationAcc = .TRUE. ) + if(Failed()) return + end if + CONTAINS logical function Failed() CALL SetErrStatSimple(ErrStat, ErrMsg, 'Init_meshes') @@ -690,45 +894,195 @@ SUBROUTINE ExtPtfm_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! Local variables - INTEGER(IntKi) :: I !< Generic counters - real(ReKi), dimension(6) :: Fc !< Output coupling force - ! Compute the loads `fr1 fr2` at t (fr1 without added mass) by time interpolation of the inputs loads p%Forces - call InterpStpMat(REAL(t,ReKi), p%times, p%Forces, m%Indx, p%nTimeSteps, m%F_at_t) - - ! --- Flatening vectors and using linear state formulation y=Cx+Du+Fy - ! u flat (x1, \dot{x1}, \ddot{x1}) - m%uFlat(1:3) = u%PtfmMesh%TranslationDisp(:,1) - m%uFlat(4:6) = GetSmllRotAngs(u%PtfmMesh%Orientation(:,:,1), ErrStat, ErrMsg); CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_CalcOutput') - m%uFlat(7:9 ) = u%PtfmMesh%TranslationVel(:,1) - m%uFlat(10:12) = u%PtfmMesh%RotationVel (:,1) - m%uFlat(13:15) = u%PtfmMesh%TranslationAcc(:,1) - m%uFlat(16:18) = u%PtfmMesh%RotationAcc (:,1) - - !--- Computing output: y = Cx + Du + Fy - ! - if (p%nCB>0) then - ! x flat - m%xFlat( 1:p%nCB ) = x%qm (1:p%nCB) - m%xFlat(p%nCB+1:2*p%nCB) = x%qmdot(1:p%nCB) - - ! >>> MATMUL implementation - !Fc = matmul(p%CMat, m%xFlat) + matmul(p%DMat, m%uFlat) + m%F_at_t(1:6) - matmul(p%M12, m%F_at_t(6+1:6+p%nCB)) - - ! >>> LAPACK implementation - Fc(1:6) = m%F_at_t(1:6) ! Fc = F1r + ... - ! GEMV(TRS, M , N , alpha , A , LDA, X ,INCX, Beta , Y, IncY) - CALL LAPACK_GEMV('n', 6 , 2*p%nCB, 1.0_ReKi, p%CMat, 6 , m%xFlat , 1, 1.0_ReKi, Fc, 1 ) ! = C*x + (F1r) - CALL LAPACK_GEMV('n', 6 , 18 , 1.0_ReKi, p%DMat, 6 , m%uFlat , 1, 1.0_ReKi, Fc, 1 ) ! + D*u - CALL LAPACK_GEMV('n', 6 , p%nCB , -1.0_ReKi, p%M12 , 6 , m%F_at_t(6+1:6+p%nCB), 1, 1.0_ReKi, Fc, 1 ) ! - M12*F2r + INTEGER(IntKi) :: I !< Generic counters + real(ReKi), dimension(6) :: Fc !< Output coupling force + TYPE(ExtPtfm_ContinuousStateType) :: xdot ! time derivatives of continuous states + real(R8Ki), dimension(3,3) :: Rg2b ! Rotation matrix from global earth-fixed coordinate system to rigid-body coordinate system + real(R8Ki), dimension(3,3) :: Rb2g ! Rotation matrix from rigid-body coordinate system to global earth-fixed coordinate system + real(ReKi), dimension(3) :: RelPosConn + real(ReKi), dimension(3) :: RelPosConn0 + real(ReKi), dimension(3) :: RelVelConn + real(ReKi), dimension(3) :: omega + real(ReKi), dimension(3) :: omega_dot + real(ReKi), dimension(3) :: RdU + real(ReKi), dimension(3) :: RdUdot + real(ReKi), dimension(3) :: RdUdotdot + + ErrStat = ErrID_None + ErrMsg = "" + + ! Compute the loads `fr1 fr2` at t (fr1 without added mass) by time interpolation of the inputs loads p%UsrModeF%Forces + call InterpStpMat(REAL(t,ReKi), p%UsrModeF%times, p%UsrModeF%Forces, m%Indx_UsrModeF, p%UsrModeF%nTimeSteps, m%F_at_t) + call InterpStpMat(REAL(t,ReKi), p%UsrConnF%times, p%UsrConnF%Forces, m%Indx_UsrConnF, p%UsrConnF%nTimeSteps, m%FConn_at_t) + + if ( p%hasRBMode ) then + Rg2b = u%PtfmMesh%Orientation(:,:,1) + Rb2g = transpose(Rg2b) + ! u flat (x1, \dot{x1}, \ddot{x1}) in body-fixed coordinate system + m%uFlat(1:3) = 0.0_ReKi ! Translational displacement is zero in body-fixed system - corresponding stiffness terms must be zero + m%uFlat(4:6) = EulerExtractZYX(u%PtfmMesh%Orientation(:,:,1)) + m%uFlat(7:9 ) = matmul( Rg2b, u%PtfmMesh%TranslationVel(:,1) ) + m%uFlat(10:12) = matmul( Rg2b, u%PtfmMesh%RotationVel (:,1) ) + m%uFlat(13:15) = matmul( Rg2b, u%PtfmMesh%TranslationAcc(:,1) ) + m%uFlat(16:18) = matmul( Rg2b, u%PtfmMesh%RotationAcc (:,1) ) + do i=1,p%nConn + m%FConn((i-1)*3+1:(i-1)*3+3) = matmul( Rg2b, u%ConnLdMesh%Force(:,i) + m%FConn_at_t((i-1)*3+1:(i-1)*3+3) ) + end do else - Fc = matmul(p%DMat, m%uFlat) + m%F_at_t(1:6) - endif + call eye(Rg2b,ErrStat,ErrMsg); if (failed()) return + call eye(Rb2g,ErrStat,ErrMsg); if (failed()) return + ! u flat (x1, \dot{x1}, \ddot{x1}) in global coordinate system + m%uFlat(1:3) = u%PtfmMesh%TranslationDisp(:,1) + m%uFlat(4:6) = GetSmllRotAngs(u%PtfmMesh%Orientation(:,:,1), ErrStat, ErrMsg); CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_CalcOutput') + m%uFlat(7:9 ) = u%PtfmMesh%TranslationVel(:,1) + m%uFlat(10:12) = u%PtfmMesh%RotationVel (:,1) + m%uFlat(13:15) = u%PtfmMesh%TranslationAcc(:,1) + m%uFlat(16:18) = u%PtfmMesh%RotationAcc (:,1) + do i=1,p%nConn + m%FConn((i-1)*3+1:(i-1)*3+3) = u%ConnLdMesh%Force(:,i) + m%FConn_at_t((i-1)*3+1:(i-1)*3+3) + end do + end if + + !--- Compute external loads + ! Note: m%F1 is the interface/rigid-body mode forcing kept in earth-fixed system + ! m%F2 is the forcing to the internal elastic modes + m%F1(1:3) = u%FBMesh%Force (:,1) + m%F1(4:6) = u%FBMesh%Moment(:,1) + m%F1 = m%F1 + m%F_at_t(1:6) + m%F2 = u%Fm + m%F_at_t(6+1:6+p%nCB) + + ! Structure self-weight + if ( p%hasRBMode ) then + select case (p%RBMod) + case (1_IntKi) + ! Compute self-weight based on stiffness and convert to earth-fixed frame + m%Weight(1:6) = p%W0(1:6) & + - matmul( p%WStff(1:6,4:5) , m%uFlat(4:5) ) & + - matmul( p%WStff(1:6,6+1:6+p%nCB) , x%qm ) + m%Weight(1:3) = matmul( Rb2g, m%Weight(1:3)) + m%Weight(4:6) = matmul( Rb2g, m%Weight(4:6)) + case (2_IntKi) + ! Compute exact self-weight in earth-fixed frame + m%Weight(1:3) = [0.0_ReKi,0.0_ReKi,p%W0(3)] + m%Weight(4:6) = cross_product( matmul( Rb2g , p%RBCoG), m%Weight(1:3) ) + end select + m%Weight(6+1:6+p%nCB) = p%W0(6+1:6+p%nCB) & + - matmul( p%WStff(6+1:6+p%nCB,4:5) , m%uFlat(4:5) ) & + - matmul( p%WStff(6+1:6+p%nCB,6+1:6+p%nCB) , x%qm ) + else + ! Fully linearized formulation + m%Weight = p%W0 & + - matmul( p%WStff(:,1:6) , m%uFlat(1:6) ) & + - matmul( p%WStff(:,6+1:6+p%nCB) , x%qm ) + end if + m%F1 = m%F1 + m%Weight(1:6) + m%F2 = m%F2 + m%Weight(6+1:6+p%nCB) + + ! Loads from connection points + if (p%nConn>0_IntKi) then + m%FConnCB = matmul( transpose(p%PhiConn) , m%FConn ) + if ( p%hasRBMode ) then + m%F1(1:3) = m%F1(1:3) + matmul( Rb2g, m%FConnCB(1:3) ) + m%F1(4:6) = m%F1(4:6) + matmul( Rb2g, m%FConnCB(4:6) ) + else + m%F1 = m%F1 + m%FConnCB(1:6) + end if + m%F2 = m%F2 + m%FConnCB(6+1:6+p%nCB) + end if + + !--- Compute reaction load applied to tower base. Output y = Cx + Du + Fy + Fc = matmul( p%D1Mat, m%uFlat(1:6) ) + matmul( p%D2Mat, m%uFlat(7:12) ) + matmul( p%D3Mat, m%uFlat(13:18) ) + if (p%nCB>0) then + Fc = Fc + matmul( p%C1Mat, x%qm ) + matmul( p%C2Mat, x%qmdot ) + matmul( p%D4Mat, m%F2 ) + end if + if ( p%hasRBMode ) then + if (p%RBMod==2_IntKi) then + Fc(1:3) = Fc(1:3) + p%RBMass*cross_product( m%uFlat(10:12), cross_product( m%uFlat(10:12), p%RBCoG ) ) + Fc(4:6) = Fc(4:6) + cross_product( m%uFlat(10:12), matmul( p%RBInertia, m%uFlat(10:12)) ) + end if + Fc(1:3) = matmul( Rb2g, Fc(1:3) ) + Fc(4:6) = matmul( Rb2g, Fc(4:6) ) + end if + Fc = -Fc + m%F1 + + ! Update output states + if (p%nCB>0) then + CALL ExtPtfm_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, xdot, ErrStat, ErrMsg ) + y%qm = x%qm + y%qmdot = x%qmdot + y%qmdotdot = xdot%qmdot + end if ! Update the output mesh - do i=1,3 - y%PtfmMesh%Force(I,1) = Fc(I) - y%PtfmMesh%Moment(I,1) = Fc(I+3) - enddo + y%PtfmMesh%Force(:,1) = Fc(1:3) + y%PtfmMesh%Moment(:,1) = Fc(4:6) + if (.not.p%HasRBMode) then + ! Interface moment correction for fixed-bottom structure similar to SubDyn + y%PtfmMesh%Moment(:,1) = y%PtfmMesh%Moment(:,1) - cross_product( u%PtfmMesh%TranslationDisp(:,1), Fc(1:3) ) + end if + + if (p%HasRBMode) then + y%FBMesh%TranslationDisp = u%PtfmMesh%TranslationDisp + y%FBMesh%Orientation = u%PtfmMesh%Orientation + y%FBMesh%TranslationVel = u%PtfmMesh%TranslationVel + y%FBMesh%RotationVel = u%PtfmMesh%RotationVel + y%FBMesh%TranslationAcc = u%PtfmMesh%TranslationAcc + y%FBMesh%RotationAcc = u%PtfmMesh%RotationAcc + end if + + if (p%nConn > 0_IntKi) then + if (p%HasRBMode) then + if (p%nCB>0) then + ! Elastic mode contributions in rigid-body frame + m%DConn = matmul( p%PhiConn(:,7:6+p%nCB), y%qm ) + m%VConn = matmul( p%PhiConn(:,7:6+p%nCB), y%qmdot ) + m%AConn = matmul( p%PhiConn(:,7:6+p%nCB), y%qmdotdot ) + else + m%DConn = 0.0_ReKi + m%VConn = 0.0_ReKi + m%AConn = 0.0_ReKi + end if + do i = 1,p%nConn + RdU = matmul( Rb2g, m%DConn(3*(i-1)+1:3*(i-1)+3) ) + RdUdot = matmul( Rb2g, m%VConn(3*(i-1)+1:3*(i-1)+3) ) + RdUdotdot = matmul( Rb2g, m%AConn(3*(i-1)+1:3*(i-1)+3) ) + RelPosConn0 = y%ConnMesh%Position(:,i) - u%PtfmMesh%Position(:,1) + RelPosConn = matmul( Rb2g, RelPosConn0 ) + RdU + omega = u%PtfmMesh%RotationVel(:,1) + omega_dot = u%PtfmMesh%RotationAcc(:,1) + + ! Compute absolute translation displacement, velocity, and acceleration of connection points in earth-fixed frame + y%ConnMesh%TranslationDisp(:,i) = u%PtfmMesh%TranslationDisp(:,1) + RelPosConn - RelPosConn0 + y%ConnMesh%TranslationVel (:,i) = u%PtfmMesh%TranslationVel (:,1) + RdUdot + cross_product( omega, RelPosConn ) + RelVelConn = y%ConnMesh%TranslationVel(:,i) - u%PtfmMesh%TranslationVel(:,1) + y%ConnMesh%TranslationAcc (:,i) = u%PtfmMesh%TranslationAcc (:,1) + RdUdotdot + cross_product( omega_dot, RelPosConn ) + cross_product( omega, RdUdot + RelVelConn ) + + ! No contribution from elasticity to rotation for now + y%ConnMesh%Orientation(:,:,i) = Rg2b + y%ConnMesh%RotationVel(:,i) = u%PtfmMesh%RotationVel(:,1) + y%ConnMesh%RotationAcc(:,i) = u%PtfmMesh%RotationAcc(:,1) + end do + else + ! Interface mode contributions + m%DConn = matmul( p%PhiConn(:,1:6), m%uFlat( 1: 6) ) + m%VConn = matmul( p%PhiConn(:,1:6), m%uFlat( 7:12) ) + m%AConn = matmul( p%PhiConn(:,1:6), m%uFlat(13:18) ) + if (p%nCB>0) then ! Elastic mode contributions + m%DConn = m%DConn + matmul( p%PhiConn(:,7:6+p%nCB), y%qm ) + m%VConn = m%VConn + matmul( p%PhiConn(:,7:6+p%nCB), y%qmdot ) + m%AConn = m%AConn + matmul( p%PhiConn(:,7:6+p%nCB), y%qmdotdot ) + end if + do i = 1,p%nConn + ! No contribution from elasticity to rotation for now + y%ConnMesh%TranslationDisp(:,i) = m%DConn(3*(i-1)+1:3*(i-1)+3) + y%ConnMesh%Orientation(:,:,i) = Rg2b + y%ConnMesh%TranslationVel(:,i) = m%VConn(3*(i-1)+1:3*(i-1)+3) + y%ConnMesh%RotationVel(:,i) = 0.0_ReKi + y%ConnMesh%TranslationAcc(:,i) = m%AConn(3*(i-1)+1:3*(i-1)+3) + y%ConnMesh%RotationAcc(:,i) = 0.0_ReKi + end do + end if + end if ! --- All Outputs m%AllOuts(ID_PtfFx) = y%PtfmMesh%Force (1,1) @@ -737,17 +1091,17 @@ SUBROUTINE ExtPtfm_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err m%AllOuts(ID_PtfMx) = y%PtfmMesh%Moment(1,1) m%AllOuts(ID_PtfMy) = y%PtfmMesh%Moment(2,1) m%AllOuts(ID_PtfMz) = y%PtfmMesh%Moment(3,1) - m%AllOuts(ID_InpFx) = m%F_at_t(1) - m%AllOuts(ID_InpFy) = m%F_at_t(2) - m%AllOuts(ID_InpFz) = m%F_at_t(3) - m%AllOuts(ID_InpMx) = m%F_at_t(4) - m%AllOuts(ID_InpMy) = m%F_at_t(5) - m%AllOuts(ID_InpMz) = m%F_at_t(6) - !y%WriteOutput(ID_WaveElev) = .. ! TODO + m%AllOuts(ID_InpFx) = m%F1(1) + m%AllOuts(ID_InpFy) = m%F1(2) + m%AllOuts(ID_InpFz) = m%F1(3) + m%AllOuts(ID_InpMx) = m%F1(4) + m%AllOuts(ID_InpMy) = m%F1(5) + m%AllOuts(ID_InpMz) = m%F1(6) do i=1,p%nCB - m%AllOuts(ID_QStart + 0*p%nCBFull -1 + p%ActiveCBDOF(I)) = x%qm (I) ! CBQ - DOF Positions - m%AllOuts(ID_QStart + 1*p%nCBFull -1 + p%ActiveCBDOF(I)) = x%qmdot(I) ! CBQD - DOF Velocities - m%AllOuts(ID_QStart + 2*p%nCBFull -1 + p%ActiveCBDOF(I)) = m%F_at_t(6+I) ! CBF - DOF Forces + m%AllOuts(ID_QStart + 0*p%nCBFull -1 + p%ActiveCBDOF(I)) = y%qm (I) ! CBD - DOF Displacements + m%AllOuts(ID_QStart + 1*p%nCBFull -1 + p%ActiveCBDOF(I)) = y%qmdot (I) ! CBV - DOF Velocities + m%AllOuts(ID_QStart + 2*p%nCBFull -1 + p%ActiveCBDOF(I)) = y%qmdotdot(I) ! CBA - DOF Accelerations + m%AllOuts(ID_QStart + 3*p%nCBFull -1 + p%ActiveCBDOF(I)) = m%F2 (I) ! CBF - DOF External Forces enddo ! --- Selected output channels only do I = 1,p%NumOuts @@ -756,7 +1110,13 @@ SUBROUTINE ExtPtfm_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Err else y%WriteOutput(I) = -9.9999e20 endif - enddo + enddo + + CONTAINS + logical function Failed() + CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_CalcContStateDeriv') + Failed = ErrStat >= AbortErrLev + end function Failed END SUBROUTINE ExtPtfm_CalcOutput !---------------------------------------------------------------------------------------------------------------------------------- @@ -776,42 +1136,71 @@ SUBROUTINE ExtPtfm_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, E TYPE(ExtPtfm_ContinuousStateType), INTENT( OUT) :: dxdt !< Continuous state derivatives at t INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + ! Local variables INTEGER(IntKi) :: I + REAL(R8Ki), dimension(3,3) :: Rg2b ! Rotation matrix global 2 body coordinates + REAL(R8Ki), dimension(3,3) :: Rb2g ! Rotation matrix body 2 global coordinates + ! Allocation of output dxdt (since intent(out)) call AllocAry(dxdt%qm, p%nCB, 'dxdt%qm', ErrStat, ErrMsg); if(Failed()) return call AllocAry(dxdt%qmdot, p%nCB, 'dxdt%qmdot', ErrStat, ErrMsg); if(Failed()) return if ( p%nCB == 0 ) return - do I=1,p%nCB; dxdt%qm (I)=0; enddo - do I=1,p%nCB; dxdt%qmdot(I)=0; enddo - - ! Compute the loads `fr1 fr2` at t (fr1 without added mass) by time interpolation of the inputs loads p%F - call InterpStpMat(REAL(t,ReKi), p%times, p%Forces, m%Indx, p%nTimeSteps, m%F_at_t) - - ! u flat (x1, \dot{x1}, \ddot{x1}) - m%uFlat(1:3) = u%PtfmMesh%TranslationDisp(:,1) - m%uFlat(4:6) = GetSmllRotAngs(u%PtfmMesh%Orientation(:,:,1), ErrStat, ErrMsg); if(Failed()) return - m%uFlat(7:9 ) = u%PtfmMesh%TranslationVel(:,1) - m%uFlat(10:12) = u%PtfmMesh%RotationVel (:,1) - m%uFlat(13:15) = u%PtfmMesh%TranslationAcc(:,1) - m%uFlat(16:18) = u%PtfmMesh%RotationAcc (:,1) - - ! --- Computation of qm and qmdot - ! >>> Latex formulae: - ! \ddot{x2} = -K22 x2 - C22 \dot{x2} - C21 \dot{x1} - M21 \ddot{x1} + fr2 - ! >>> MATMUL IMPLEMENTATION - !dxdt%qm= x%qmdot - !dxdt%qmdot = - matmul(p%K22,x%qm) - matmul(p%C22,x%qmdot) & - ! - matmul(p%C21,m%uFlat(7:12)) - matmul(p%M21, m%uFlat(13:18)) + m%F_at_t(6+1:6+p%nCB) - ! >>> BLAS IMPLEMENTATION - ! COPY( N , X , INCX, Y , INCY) - CALL LAPACK_COPY(p%nCB, x%qmdot , 1 , dxdt%qm , 1 ) ! qmdot=qmdot - CALL LAPACK_COPY(p%nCB, m%F_at_t(6+1:6+p%nCB), 1 , dxdt%qmdot , 1 ) ! qmddot = fr2 - ! GEMV(TRS, M , N , alpha , A , LDA , X ,INCX, Beta , Y , IncY) - CALL LAPACK_GEMV('n', p%nCB, p%nCB , -1.0_ReKi, p%K22, p%nCB, x%qm , 1 , 1.0_ReKi, dxdt%qmdot, 1 ) ! - K22 x2 - CALL LAPACK_GEMV('n', p%nCB, 6 , -1.0_ReKi, p%C21, p%nCB, m%uFlat(7:12) , 1 , 1.0_ReKi, dxdt%qmdot, 1 ) ! - C21 \dot{x1} - CALL LAPACK_GEMV('n', p%nCB, p%nCB , -1.0_ReKi, p%C22, p%nCB, x%qmdot , 1 , 1.0_ReKi, dxdt%qmdot, 1 ) ! - C22 \dot{x2} - CALL LAPACK_GEMV('n', p%nCB, 6 , -1.0_ReKi, p%M21, p%nCB, m%uFlat(13:18), 1 , 1.0_ReKi, dxdt%qmdot, 1 ) ! - M21 \ddot{x1} + dxdt%qm =0.0_ReKi + dxdt%qmdot=0.0_ReKi + + ! Compute the loads `fr1 fr2` at t (fr1 without added mass) by time interpolation of the inputs loads p%UsrModeF%Forces + call InterpStpMat(REAL(t,ReKi), p%UsrModeF%times, p%UsrModeF%Forces, m%Indx_UsrModeF, p%UsrModeF%nTimeSteps, m%F_at_t) + call InterpStpMat(REAL(t,ReKi), p%UsrConnF%times, p%UsrConnF%Forces, m%Indx_UsrConnF, p%UsrConnF%nTimeSteps, m%FConn_at_t) + + if ( p%hasRBMode ) then + Rg2b = u%PtfmMesh%Orientation(:,:,1) + Rb2g = transpose(Rg2b) + ! u flat (x1, \dot{x1}, \ddot{x1}) in body-fixed coordinate system + m%uFlat(1:3) = 0.0_ReKi ! u%PtfmMesh%TranslationDisp(:,1) + m%uFlat(4:6) = EulerExtractZYX(u%PtfmMesh%Orientation(:,:,1)) + m%uFlat(7:9 ) = matmul( Rg2b, u%PtfmMesh%TranslationVel(:,1) ) + m%uFlat(10:12) = matmul( Rg2b, u%PtfmMesh%RotationVel (:,1) ) + m%uFlat(13:15) = matmul( Rg2b, u%PtfmMesh%TranslationAcc(:,1) ) + m%uFlat(16:18) = matmul( Rg2b, u%PtfmMesh%RotationAcc (:,1) ) + do i=1,p%nConn + m%FConn((i-1)*3+1:(i-1)*3+3) = matmul( Rg2b, u%ConnLdMesh%Force(:,i) + m%FConn_at_t((i-1)*3+1:(i-1)*3+3) ) + end do + else + ! u flat (x1, \dot{x1}, \ddot{x1}) in global coordinate system + m%uFlat(1:3) = u%PtfmMesh%TranslationDisp(:,1) + m%uFlat(4:6) = GetSmllRotAngs(u%PtfmMesh%Orientation(:,:,1), ErrStat, ErrMsg); if(Failed()) return + m%uFlat(7:9 ) = u%PtfmMesh%TranslationVel(:,1) + m%uFlat(10:12) = u%PtfmMesh%RotationVel (:,1) + m%uFlat(13:15) = u%PtfmMesh%TranslationAcc(:,1) + m%uFlat(16:18) = u%PtfmMesh%RotationAcc (:,1) + do i=1,p%nConn + m%FConn((i-1)*3+1:(i-1)*3+3) = u%ConnLdMesh%Force(:,i) + m%FConn_at_t((i-1)*3+1:(i-1)*3+3) + end do + end if + + ! --- Compute modal forcing + m%F2 = m%F_at_t(6+1:6+p%nCB) & ! User prescribed forces + + u%Fm(1:p%nCB) ! Modal forcing from HydroDyn generalized DOF + ! Structure self-weight + if ( p%hasRBMode ) then + m%Weight(6+1:6+p%nCB) = p%W0(6+1:6+p%nCB) & + - matmul( p%WStff(6+1:6+p%nCB,4:5) , m%uFlat(4:5) ) - matmul( p%WStff(6+1:6+p%nCB,6+1:6+p%nCB) , x%qm ) + else + m%Weight(6+1:6+p%nCB) = p%W0(6+1:6+p%nCB) & + - matmul( p%WStff(6+1:6+p%nCB,1:6) , m%uFlat(1:6) ) - matmul( p%WStff(6+1:6+p%nCB,6+1:6+p%nCB) , x%qm ) + end if + m%F2 = m%F2 + m%Weight(6+1:6+p%nCB) + ! Loads from connection points + if (p%nConn>0_IntKi) then + m%FConnCB = matmul( transpose(p%PhiConn) , m%FConn ) + m%F2 = m%F2 + m%FConnCB(6+1:6+p%nCB) + end if + + ! --- Compute qm and qmdot + dxdt%qm = x%qmdot + dxdt%qmdot = matmul( p%A1Mat, x%qm ) + matmul( p%A2Mat, x%qmdot ) & + + matmul( p%B1Mat, m%uFlat(1:6) ) + matmul( p%B2Mat, m%uFlat(7:12) ) + matmul( p%B3Mat, m%uFlat(13:18) ) + matmul( p%B4Mat, m%F2 ) CONTAINS logical function Failed() @@ -872,16 +1261,16 @@ END SUBROUTINE ExtPtfm_CalcConstrStateResidual !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and DZ/du are returned. -SUBROUTINE ExtPtfm_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) -!.................................................................................................................................. +SUBROUTINE ExtPtfm_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(ExtPtfm_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) + TYPE(ExtPtfm_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(ExtPtfm_ParameterType), INTENT(IN ) :: p !< Parameters TYPE(ExtPtfm_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point TYPE(ExtPtfm_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point TYPE(ExtPtfm_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point TYPE(ExtPtfm_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(ExtPtfm_OutputType), INTENT(IN ) :: y !< Output (change to inout if a mesh copy is required); + TYPE(ExtPtfm_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); !! Output fields are not used by this routine, but type is !! available here so that mesh parameter information (i.e., !! connectivity) does not have to be recalculated for dYdu. @@ -896,43 +1285,96 @@ SUBROUTINE ExtPtfm_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, !! respect to the inputs (u) [intent in to avoid deallocation] REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with !! respect to the inputs (u) [intent in to avoid deallocation] - INTEGER(IntKi) :: i,j ! Loop index - INTEGER(IntKi) :: idx ! Index of output channel in AllOuts - ! Initialize ErrStat + character(*), parameter :: RoutineName = 'ExtPtfm_JacobianPInput' + integer(intKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: i, j, col ! Loop index + ! logical :: CalcOutputs + ErrStat = ErrID_None ErrMsg = '' + + ! Calculate OP values here + call ExtPtfm_CalcOutput(t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2 ); if(Failed()) return + + ! Make a copy of the inputs to perturb + call ExtPtfm_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if(Failed()) return + call ExtPtfm_VarsPackInput(Vars, u, m%Jac%u) + + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: if (present(dYdu)) then - ! allocate and set dYdu + if (.not. allocated(dYdu)) then - call AllocAry(dYdu, N_OUTPUTS+p%NumOuts, N_INPUTS, 'dYdu', ErrStat, ErrMsg); if(Failed()) return - do i=1,size(dYdu,1); do j=1,size(dYdu,2); dYdu(i,j)=0.0_ReKi; enddo;enddo + call AllocAry(dYdu, m%Jac%Ny, m%Jac%Nu, 'dYdu', ErrStat2, ErrMsg2); if(Failed()) return end if - dYdu(1:6,1:N_INPUTS) = p%DMat(1:6,1:N_INPUTS) - !dYdu is zero except if WriteOutput is the interface loads - do i = 1,p%NumOuts - idx = p%OutParam(i)%Indx - if (idx==ID_PtfFx) then; dYdu(6+i,1:N_INPUTS) = p%DMat(1,1:N_INPUTS) - elseif (idx==ID_PtfFy) then; dYdu(6+i,1:N_INPUTS) = p%DMat(2,1:N_INPUTS) - elseif (idx==ID_PtfFx) then; dYdu(6+i,1:N_INPUTS) = p%DMat(3,1:N_INPUTS) - elseif (idx==ID_PtfMz) then; dYdu(6+i,1:N_INPUTS) = p%DMat(4,1:N_INPUTS) - elseif (idx==ID_PtfMy) then; dYdu(6+i,1:N_INPUTS) = p%DMat(5,1:N_INPUTS) - elseif (idx==ID_PtfMz) then; dYdu(6+i,1:N_INPUTS) = p%DMat(6,1:N_INPUTS) - else ; dYdu(6+i,1:N_INPUTS) = 0.0_ReKi - endif + + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1,Vars%u(i)%Num + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call ExtPtfm_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call ExtPtfm_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call ExtPtfm_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call ExtPtfm_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,col)) + end do end do - end if - if (present(dXdu)) then - ! allocate and set dXdu + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + if (present(dXdu) .and. (m%Jac%Nx > 0)) then + if (.not. allocated(dXdu)) then - call AllocAry(dXdu, 2*p%nCB, N_INPUTS, 'dXdu', ErrStat, ErrMsg); if(Failed()) return - do i=1,size(dXdu,1); do j=1,size(dXdu,2); dXdu(i,j)=0.0_ReKi; enddo;enddo - end if - dXdu(1:2*p%nCB,1:N_INPUTS) = p%BMat(1:2*p%nCB,1:N_INPUTS) + call AllocAry(dXdu, m%Jac%Nx, m%Jac%Nu, 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return + endif + + ! Loop through input variables + do i = 1,size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1,Vars%u(i)%Num + + ! Calculate positive perturbation and resulting continuous state derivatives + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call ExtPtfm_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call ExtPtfm_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation and resulting continuous state derivatives + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call ExtPtfm_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call ExtPtfm_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference + dXdu(:,col) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%u(i)%Perturb) + end do + end do end if + if (present(dXddu)) then end if + if (present(dZdu)) then end if + CONTAINS logical function Failed() CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_JacobianPInput') @@ -942,8 +1384,9 @@ END SUBROUTINE ExtPtfm_JacobianPInput !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and DZ/dx are returned. -SUBROUTINE ExtPtfm_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +SUBROUTINE ExtPtfm_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) !.................................................................................................................................. + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(ExtPtfm_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(ExtPtfm_ParameterType), INTENT(IN ) :: p !< Parameters @@ -970,59 +1413,101 @@ SUBROUTINE ExtPtfm_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrS REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state !! functions (Z) with respect to !! the continuous states (x) [intent in to avoid deallocation] - INTEGER(IntKi) :: i,j ! Loop index - INTEGER(IntKi) :: idx ! Index of output channel in AllOuts - INTEGER(IntKi) :: iDOF ! Mode number + + character(*), parameter :: RoutineName = 'ExtPtfm_JacobianPContState' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: i,j,col ! Loop index + ! INTEGER(IntKi) :: idx ! Index of output channel in AllOuts + ! INTEGER(IntKi) :: iDOF ! Mode number + ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' + + ! If no state variables, return + if (m%Jac%Nx == 0) return + + ! make a copy of the continuous states to perturb NOTE: MESH_NEWCOPY + call ExtPtfm_CopyContState(x, m%x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if(Failed()) return + call ExtPtfm_VarsPackContState(Vars, x, m%Jac%x) + + ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: if (present(dYdx)) then - ! allocate and set dYdx + + ! Allocate dYdx if not allocated if (.not. allocated(dYdx)) then - call AllocAry(dYdx, N_OUTPUTS+p%NumOuts, 2*p%nCB, 'dYdx', ErrStat, ErrMsg); if(Failed()) return - do i=1,size(dYdx,1); do j=1,size(dYdx,2); dYdx(i,j)=0.0_ReKi; enddo;enddo + call AllocAry(dYdx, m%Jac%Ny, m%Jac%Nx, 'dYdx', ErrStat2, ErrMsg2); if(Failed()) return end if - dYdx(1:6,1:2*p%nCB) = p%CMat(1:6, 1:2*p%nCB) - ! WriteOutputs - do i = 1,p%NumOuts - idx = p%OutParam(i)%Indx - iDOF = mod(idx-ID_QSTART, p%nCB)+1 - ! if output is an interface load dYdx is a row of the Cmatrix - if (idx==ID_PtfFx) then; dYdx(6+i,1:2*p%nCB) = p%CMat(1,1:2*p%nCB) - elseif (idx==ID_PtfFy) then; dYdx(6+i,1:2*p%nCB) = p%CMat(2,1:2*p%nCB) - elseif (idx==ID_PtfFx) then; dYdx(6+i,1:2*p%nCB) = p%CMat(3,1:2*p%nCB) - elseif (idx==ID_PtfMx) then; dYdx(6+i,1:2*p%nCB) = p%CMat(4,1:2*p%nCB) - elseif (idx==ID_PtfMy) then; dYdx(6+i,1:2*p%nCB) = p%CMat(5,1:2*p%nCB) - elseif (idx==ID_PtfMz) then; dYdx(6+i,1:2*p%nCB) = p%CMat(6,1:2*p%nCB) - ! Below we look at the index, we assumed an order for the outputs - ! where after the index ID_Qstart, the AllOutputs are: Q,QDot and Qf - ! An alternative coulbe to look at the name of the DOF instead: - ! e.g. if (index(p%OutParam,'CBQ_')>0) then ... (see SetOutParam) - else if ((idx-ID_QStart>= 0 ) .and. (idx-ID_QStart= p%nCB) .and. (idx-ID_QStart<2*p%nCB) ) then - ! Output is a DOF velocity, dYdx has a 1 at the proper location - dYdx(6+i,1:2*p%nCB ) = 0.0_ReKi - dYdx(6+i,p%nCB + iDOF) = 1.0_ReKi ! TODO TODO TODO ALLDOF_2_DOF - else ! e.g. WaveElevation or CB Forces - dYdx(6+i,1:2*p%nCB ) = 0.0_ReKi - endif + + ! Loop through state variables + do i = 1,size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1,Vars%x(i)%Num + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call ExtPtfm_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call ExtPtfm_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call ExtPtfm_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call ExtPtfm_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Calculate column index + col = Vars%x(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%x(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdx(:,col)) + end do end do end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: if (present(dXdx)) then - ! allocate and set dXdx + + ! Allocate dXdx if not allocated if (.not. allocated(dXdx)) then - call AllocAry(dXdx, 2*p%nCB, 2*p%nCB, 'dXdx', ErrStat, ErrMsg); if(Failed()) return - do i=1,size(dXdx,1); do j=1,size(dXdx,2); dXdx(i,j)=0.0_ReKi; enddo;enddo + call AllocAry(dXdx, m%Jac%Nx, m%Jac%Nx, 'dXdx', ErrStat2, ErrMsg2); if(Failed()) return end if - dXdx(1:2*p%nCB,1:2*p%nCB) = p%AMat(1:2*p%nCB,1:2*p%nCB) + + ! Loop through state variables + do i = 1,size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call ExtPtfm_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call ExtPtfm_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call ExtPtfm_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call ExtPtfm_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Calculate column index + col = Vars%x(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference and store in full linearization array + dXdx(:,col) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%x(i)%Perturb) + end do + end do end if + if (present(dXddx)) then end if + if (present(dZdx)) then end if + CONTAINS logical function Failed() CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_JacobianPInput') @@ -1113,85 +1598,63 @@ SUBROUTINE ExtPtfm_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, Er if (present(dZdz)) then end if END SUBROUTINE ExtPtfm_JacobianPConstrState -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE ExtPtfm_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(ExtPtfm_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(ExtPtfm_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(ExtPtfm_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(ExtPtfm_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(ExtPtfm_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(ExtPtfm_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(ExtPtfm_OutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(ExtPtfm_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - INTEGER(IntKi) :: I - TYPE(ExtPtfm_ContinuousStateType) :: dx !< derivative of continuous states at operating point - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = '' - - if ( present( u_op ) ) then - if (.not. allocated(u_op)) then - call AllocAry(u_op, N_INPUTS, 'u_op', ErrStat, ErrMsg); if(Failed())return - endif - u_op(1:3) = u%PtfmMesh%TranslationDisp(:,1) - u_op(4:6) = GetSmllRotAngs(u%PtfmMesh%Orientation(:,:,1), ErrStat, ErrMsg); if(Failed())return - u_op(7:9 ) = u%PtfmMesh%TranslationVel(:,1) - u_op(10:12) = u%PtfmMesh%RotationVel (:,1) - u_op(13:15) = u%PtfmMesh%TranslationAcc(:,1) - u_op(16:18) = u%PtfmMesh%RotationAcc (:,1) - end if - - if ( present( y_op ) ) then - if (.not. allocated(y_op)) then - call AllocAry(y_op, N_OUTPUTS+p%NumOuts, 'y_op', ErrStat, ErrMsg); if(Failed())return - endif - ! Update the output mesh - y_op(1:3)=y%PtfmMesh%Force(1:3,1) - y_op(4:6)=y%PtfmMesh%Moment(1:3,1) - do i=1,p%NumOuts - y_op(i+N_OUTPUTS) = y%WriteOutput(i) - end do - end if - if ( present( x_op ) ) then - if (.not. allocated(x_op)) then - call AllocAry(x_op, 2*p%nCB, 'x_op', ErrStat, ErrMsg); if (Failed())return - endif - x_op(1:p%nCB) = x%qm(1:p%nCB) - x_op(p%nCB+1:2*p%nCB) = x%qmdot(1:p%nCB) - end if +SUBROUTINE PseudoInverse(A, Ainv, ErrStat, ErrMsg) + use NWTC_LAPACK, only: LAPACK_GESVD, LAPACK_GEMM + real(ReKi), dimension(:,:), intent(in) :: A + real(ReKi), dimension(:,:), allocatable :: Ainv + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! < Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! < Error message if ErrStat / = ErrID_None + ! + real(ReKi), dimension(:), allocatable :: S + real(ReKi), dimension(:,:), allocatable :: U + real(ReKi), dimension(:,:), allocatable :: Vt + real(ReKi), dimension(:), allocatable :: WORK + real(ReKi), dimension(:,:), allocatable :: Acopy + integer :: j ! Loop indices + integer :: M !< The number of rows of the input matrix A + integer :: N !< The number of columns of the input matrix A + integer :: K !< + integer :: L !< + integer :: LWORK !< + M = size(A,1) + N = size(A,2) + K = min(M,N) + L = max(M,N) + LWORK = MAX(1,3*K +L,5*K) + allocate(S(K)); S = 0; + !! LWORK >= MAX(1,3*MIN(M,N) + MAX(M,N),5*MIN(M,N)) for the other paths + allocate(Work(LWORK)); Work=0 + allocate(U (M,K) ); U=0; + allocate(Vt(K,N) ); Vt=0; + allocate(Ainv(N,M)); Ainv=0; + allocate(Acopy(M,N)); Acopy=A; - if ( present( dx_op ) ) then - if (.not. allocated(dx_op)) then - call AllocAry(dx_op, 2*p%nCB, 'dx_op', ErrStat, ErrMsg); if (Failed())return - endif - call ExtPtfm_CalcContStateDeriv(t, u, p, x, xd, z, OtherState, m, dx, ErrStat, ErrMsg); if(Failed()) return - dx_op(1:p%nCB) = dx%qm(1:p%nCB) - dx_op(p%nCB+1:2*p%nCB) = dx%qmdot(1:p%nCB) - end if + ! --- Compute the SVD of A + ! [U,S,V] = svd(A) + !call DGESVD ('S', 'S', M, N, A, M, S, U, M , Vt , K, WORK, LWORK, INFO) + call LAPACK_GESVD('S', 'S', M, N, Acopy, S, U, Vt, WORK, LWORK, ErrStat, ErrMsg) - if ( present( xd_op ) ) then - end if - - if ( present( z_op ) ) then - end if + !--- Compute PINV = V**T * SIGMA * U**T in two steps + ! SIGMA = S^(-1)=1/S(j), S is diagonal + do j = 1, K + U(:,j) = U(:,j)/S(j) + end do + ! Compute Ainv = 1.0*V^t * U^t + 0.0*Ainv V*(inv(S))*U' + !call DGEMM( 'T', 'T', N, M, K, 1.0, V, K, U, M, 0.0, Ainv, N) + call LAPACK_GEMM( 'T', 'T', 1.0_ReKi, Vt, U, 0.0_ReKi, Ainv, ErrStat, ErrMsg) + ! --- Compute rank + !tol=maxval(shape(A))*epsilon(maxval(S)) + !rank=0 + !do i=1,K + ! if(S(i) .gt. tol)then + ! rank=rank+1 + ! end if + !end do + !print*,'Rank',rank + ! Ainv=transpose(matmul(matmul(U(:,1:r),S_inv(1:r,1:r)),Vt(1:r,:))) + END SUBROUTINE PseudoInverse -contains - logical function Failed() - CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_GetOP') - Failed = ErrStat >= AbortErrLev - end function Failed -END SUBROUTINE ExtPtfm_GetOP !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ END MODULE ExtPtfm_MCKF diff --git a/modules/extptfm/src/ExtPtfm_MCKF_IO.f90 b/modules/extptfm/src/ExtPtfm_MCKF_IO.f90 index 4fefde8a42..f6c3f6bc49 100644 --- a/modules/extptfm/src/ExtPtfm_MCKF_IO.f90 +++ b/modules/extptfm/src/ExtPtfm_MCKF_IO.f90 @@ -27,19 +27,11 @@ MODULE ExtPtfm_MCKF_Parameters TYPE(ProgDesc), PARAMETER :: ExtPtfm_Ver = ProgDesc( 'ExtPtfm_MCKF', '', '' ) !< module date/version information ! - INTEGER(IntKi), parameter :: N_INPUTS = 18 - INTEGER(IntKi), parameter :: N_OUTPUTS = 6 - - CHARACTER(len=4), DIMENSION(3), PARAMETER :: StrIntMethod = (/'RK4 ','AB4 ','ABM4'/) ! Variables for output channels - INTEGER(IntKi), PARAMETER :: FILEFORMAT_GUYANASCII = 0 - INTEGER(IntKi), PARAMETER :: FILEFORMAT_FLEXASCII = 1 - - ! Variables for output channels - INTEGER(IntKi), PARAMETER :: MaxOutChs = 9 + 3*200 ! Maximum number of output channels - ! Harcoded to outputs of 200 CB modes + INTEGER(IntKi), PARAMETER :: MaxOutChs = 1 + 12 + 4*200 ! Maximum number of output channels + ! Harcoded to outputs of 200 CB modes INTEGER(IntKi), PARAMETER :: ID_Time = 0 INTEGER(IntKi), PARAMETER :: ID_PtfFx = 1 INTEGER(IntKi), PARAMETER :: ID_PtfFy = 2 @@ -47,14 +39,13 @@ MODULE ExtPtfm_MCKF_Parameters INTEGER(IntKi), PARAMETER :: ID_PtfMx = 4 INTEGER(IntKi), PARAMETER :: ID_PtfMy = 5 INTEGER(IntKi), PARAMETER :: ID_PtfMz = 6 - INTEGER(IntKi), PARAMETER :: ID_WaveElev = 7 - INTEGER(IntKi), PARAMETER :: ID_InpFx = 8 - INTEGER(IntKi), PARAMETER :: ID_InpFy = 9 - INTEGER(IntKi), PARAMETER :: ID_InpFz = 10 - INTEGER(IntKi), PARAMETER :: ID_InpMx = 11 - INTEGER(IntKi), PARAMETER :: ID_InpMy = 12 - INTEGER(IntKi), PARAMETER :: ID_InpMz = 13 - INTEGER(IntKi), PARAMETER :: ID_QStart = 14 + INTEGER(IntKi), PARAMETER :: ID_InpFx = 7 + INTEGER(IntKi), PARAMETER :: ID_InpFy = 8 + INTEGER(IntKi), PARAMETER :: ID_InpFz = 9 + INTEGER(IntKi), PARAMETER :: ID_InpMx = 10 + INTEGER(IntKi), PARAMETER :: ID_InpMy = 11 + INTEGER(IntKi), PARAMETER :: ID_InpMz = 12 + INTEGER(IntKi), PARAMETER :: ID_QStart = 13 END MODULE ExtPtfm_MCKF_Parameters !********************************************************************************************************************************** @@ -82,7 +73,7 @@ subroutine SetErrStatSimple(ErrStat, ErrMess, RoutineName, LineNumber) CHARACTER(*), INTENT(IN ) :: RoutineName ! Name of the routine error occurred in INTEGER(IntKi), INTENT(IN), OPTIONAL :: LineNumber ! Line of input file if (ErrStat /= ErrID_None) then - print*,'ErrMess',ErrMess + print*,'ErrMess',TRIM(ErrMess) write(ErrMess,'(A)') TRIM(RoutineName)//':'//TRIM(ErrMess) if (present(LineNumber)) then ErrMess = TRIM(ErrMess)//' Line: '//TRIM(Num2LStr(LineNumber))//'.' @@ -208,21 +199,19 @@ SUBROUTINE SetOutParam(OutList, NumOuts_in, p, ErrStat, ErrMsg ) CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(13) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "INPF_FX ","INPF_FY ","INPF_FZ ","INPF_MX ","INPF_MY ","INPF_MZ ",& - "INTRFFX ","INTRFFY ","INTRFFZ ","INTRFMX ","INTRFMY ","INTRFMZ ",& - "WAVELEV "/) - CHARACTER(OutStrLenM1), PARAMETER :: ParamUnitsAry(13) = (/ & ! This lists the units corresponding to the allowed parameters + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(12) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "EXTRNFX ","EXTRNFY ","EXTRNFZ ","EXTRNMX ","EXTRNMY ","EXTRNMZ ",& + "INTRFFX ","INTRFFY ","INTRFFZ ","INTRFMX ","INTRFMY ","INTRFMZ "/) + CHARACTER(OutStrLenM1), PARAMETER :: ParamUnitsAry(12) = (/ & ! This lists the units corresponding to the allowed parameters "(N) ","(N) ","(N) ","(Nm) ","(Nm) ","(Nm) ",& - "(N) ","(N) ","(N) ","(Nm) ","(Nm) ","(Nm) ","(m) "/) - INTEGER(IntKi), PARAMETER :: ParamIndxAry(13) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + "(N) ","(N) ","(N) ","(Nm) ","(Nm) ","(Nm) "/) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(12) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) ID_InpFx, ID_InpFy, ID_InpFz, ID_InpMx, ID_InpMy, ID_InpMz,& - ID_PtfFx, ID_PtfFy, ID_PtfFz, ID_PtfMx, ID_PtfMy, ID_PtfMz,& - ID_WaveElev /) + ID_PtfFx, ID_PtfFy, ID_PtfFz, ID_PtfMx, ID_PtfMy, ID_PtfMz/) character(ErrMsgLen) :: WarnMsg !Warning Message ErrStat = ErrID_None ErrMsg = "" - WarnMsg = "" + WarnMsg = "" p%NumOuts = NumOuts_in allocate(p%OutParam(0:p%NumOuts) , stat=ErrStat ) @@ -256,18 +245,20 @@ SUBROUTINE SetOutParam(OutList, NumOuts_in, p, ErrStat, ErrMsg ) if (Indx>0) then p%OutParam(I)%Indx = ParamIndxAry(Indx) p%OutParam(I)%Units = ParamUnitsAry(Indx) - else if (index(OutListTmp,'CBQ_') > 0 ) then - call setDOFChannel(5,ID_QStart+0*p%nCBFull-1); if(Failed()) return ! NOTE: using full CB - else if (index(OutListTmp,'CBQD_') > 0 ) then - call setDOFChannel(6,ID_QStart+1*p%nCBFull-1); if(Failed()) return ! NOTE: using full CB - else if (index(OutListTmp,'CBF_') > 0 ) then - call setDOFChannel(5,ID_QStart+2*p%nCBFull-1); if(Failed()) return ! NOTE: using full CB + else if (index(OutListTmp,'CBD') > 0 ) then + call setDOFChannel(4,ID_QStart+0*p%nCBFull-1); if(Failed()) return ! NOTE: using full CB + else if (index(OutListTmp,'CBV') > 0 ) then + call setDOFChannel(4,ID_QStart+1*p%nCBFull-1); if(Failed()) return ! NOTE: using full CB + else if (index(OutListTmp,'CBA') > 0 ) then + call setDOFChannel(4,ID_QStart+2*p%nCBFull-1); if(Failed()) return ! NOTE: using full CB + else if (index(OutListTmp,'CBF') > 0 ) then + call setDOFChannel(4,ID_QStart+3*p%nCBFull-1); if(Failed()) return ! NOTE: using full CB else call setInvalidChannel() ! INVALID endif !write(*,*) p%OutParam(I)%Name, p%OutParam(I)%Indx, p%OutParam(I)%Units end do - if (len(WarnMsg)>0) then + if (len(trim(WarnMsg))>0) then call SetErrStat(ErrID_Warn, WarnMsg,ErrStat,ErrMsg,'ExtPtfm_SetOutParam') write(*,'(A)')trim(WarnMsg) endif @@ -304,31 +295,201 @@ subroutine setInvalidChannel() END SUBROUTINE SetOutParam !---------------------------------------------------------------------------------------------------------------------------------- !> Checks that all inputs were correctly read -subroutine CheckInputs(Inp, p, ErrStat, ErrMsg) +subroutine CheckReducedInputs(Inp, p, ErrStat, ErrMsg) TYPE(ExtPtfm_InputFile), INTENT(INOUT) :: Inp !< Data stored in the module's input file TYPE(ExtPtfm_ParameterType), INTENT(INOUT) :: p !< All the parameter matrices stored in this input file - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message + INTEGER(IntKi) :: i,j + REAL(ReKi), PARAMETER :: RelTol = 0.001_ReKi + REAL(ReKi), PARAMETER :: AbsTol = 0.0001_ReKi ErrStat = ErrID_None ErrMsg = "" - if (ErrStat/=0) return + if (p%nTot<0) then ; ErrStat=ErrID_Fatal; ErrMsg='The total number of DOF was not set'; return; endif if (.not.allocated(p%Mass)) then ; ErrStat=ErrID_Fatal; ErrMsg='The mass matrix was not allocated.' ; return; endif if (.not.allocated(p%Stff)) then ; ErrStat=ErrID_Fatal; ErrMsg='The stiffness matrix was not allocated.' ; return; endif if (.not.allocated(p%Damp)) then ; ErrStat=ErrID_Fatal; ErrMsg='The damping matrix was not allocated.' ; return; endif - if (.not.allocated(p%Forces)) then ; ErrStat=ErrID_Fatal; ErrMsg='The loads were not allocated.';return; endif - if (.not.allocated(p%times)) then ; ErrStat=ErrID_Fatal; ErrMsg='The time vector was not allocated.'; return; endif + if (.not.allocated(p%W0)) then ; ErrStat=ErrID_Fatal; ErrMsg='Constant self-weight was not allocated.';return; endif + if (.not.allocated(p%WStff)) then ; ErrStat=ErrID_Fatal; ErrMsg='Self-weight stiffness matrix was not allocated.';return; endif + !if (.not.allocated(p%Forces)) then ; ErrStat=ErrID_Fatal; ErrMsg='The loads were not allocated.';return; endif + !if (.not.allocated(p%times)) then ; ErrStat=ErrID_Fatal; ErrMsg='The time vector was not allocated.'; return; endif if (allocated(Inp%ActiveCBDOF)) then if (maxval(Inp%ActiveCBDOF)>size(p%Mass,1)-6) then ErrStat=ErrID_Fatal; ErrMsg='The maximum index of `ActiveCBDOF` (active CB DOF) should be less than the total number of CB DOF.'; return; endif endif -end subroutine CheckInputs + + ! Check mass matrix + do i = 1,p%nTot + do j = i+1,p%nTot + if ( ABS( p%Mass(i,j) - p%Mass(j,i) ) > MAX(RelTol*ABS(p%Mass(i,j)),AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='Mass matrix is not symmetric'; IF (ErrStat >= AbortErrLev) RETURN + end if + end do + end do + if (Inp%HasRBMode) then + ! Check stiffness matrix + do i = 1,p%nTot + do j = 1,6 + if ( ABS( p%Stff(i,j) ) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='When rigid-body modes are enabled, the stiffness matrix should have only zeros in the first 6 rows and columns.'; IF (ErrStat >= AbortErrLev) RETURN + end if + end do + end do + do i = 1,6 + do j = 7,p%nTot + if ( ABS( p%Stff(i,j) ) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='When rigid-body modes are enabled, the stiffness matrix should have only zeros in the first 6 rows and columns.'; IF (ErrStat >= AbortErrLev) RETURN + end if + end do + end do + ! Check mass matrix + p%RBMass = p%Mass(1,1) + p%RBCoG(1) = p%Mass(2,6)/p%RBMass + p%RBCoG(2) = -p%Mass(1,6)/p%RBMass + p%RBCoG(3) = p%Mass(1,5)/p%RBMass + p%RBInertia = p%Mass(4:6,4:6) + do i = 1,3 + do j = i,3 + if ( i == j ) then + if ( ABS( p%Mass(i,j) - p%RBMass ) > MAX( RelTol*ABS(p%RBMass), AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='Mass matrix associated with the first 6 modes inconsistent with rigid-body modes.'; IF (ErrStat >= AbortErrLev) RETURN + end if + else + if ( ABS( p%Mass(i,j) ) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='Mass matrix associated with the first 6 modes inconsistent with rigid-body modes.'; IF (ErrStat >= AbortErrLev) RETURN + end if + end if + end do + if ( ABS( p%Mass(i,i+3) ) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='Mass matrix associated with the first 6 modes inconsistent with rigid-body modes.'; IF (ErrStat >= AbortErrLev) RETURN + end if + end do + if ( ABS( p%Mass(1,5) + p%Mass(2,4) ) > MAX( RelTol*ABS(p%Mass(1,5)), AbsTol ) ) then + ErrStat=ErrID_Warn; ErrMsg='Mass matrix associated with the first 6 modes inconsistent with rigid-body modes.'; IF (ErrStat >= AbortErrLev) RETURN + end if + if ( ABS( p%Mass(1,6) + p%Mass(3,4) ) > MAX( RelTol*ABS(p%Mass(1,6)), AbsTol ) ) then + ErrStat=ErrID_Warn; ErrMsg='Mass matrix associated with the first 6 modes inconsistent with rigid-body modes.'; IF (ErrStat >= AbortErrLev) RETURN + end if + if ( ABS( p%Mass(2,6) + p%Mass(3,5) ) > MAX( RelTol*ABS(p%Mass(2,6)), AbsTol ) ) then + ErrStat=ErrID_Warn; ErrMsg='Mass matrix associated with the first 6 modes inconsistent with rigid-body modes.'; IF (ErrStat >= AbortErrLev) RETURN + end if + ! Check W0 + if ( ABS(p%W0(1)) > AbsTol & + .or. ABS(p%W0(2)) > AbsTol & + .or. ABS(p%W0(6)) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, constant self-weight can only have non-zero entires in the (3) heave, (4) roll, and (5) pitch directions.'; IF (ErrStat >= AbortErrLev) RETURN + end if + if ( ABS( p%W0(4) - p%W0(3)*p%RBCoG(2) ) > MAX(RelTol*ABS(p%W0(4)), AbsTol) .or. & + ABS( p%W0(5) + p%W0(3)*p%RBCoG(1) ) > MAX(RelTol*ABS(p%W0(4)), AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, rigid-body center of mass inconsistent between constant self-weight and mass matrix.'; IF (ErrStat >= AbortErrLev) RETURN + end if + ! Check WStff + do i = 1,p%nTot + if ( ABS(p%WStff(i,1)) > AbsTol & + .or. ABS(p%WStff(i,2)) > AbsTol & + .or. ABS(p%WStff(i,3)) > AbsTol & + .or. ABS(p%WStff(i,6)) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, self-weight stiffness matrix must contain only zeros in the first (surge), second (sway), third (heave), and sixth (yaw) columns.'; IF (ErrStat >= AbortErrLev) RETURN + end if + end do + do i = 1,6 + do j = 4,5 + if (i==1 .and. j==5) then + if ( ABS( p%WStff(i,j) - p%W0(3)) > MAX( RelTol * ABS(p%W0(3)), AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, self-weight stiffness matrix entry (1,5) must be equal to W0(3).'; IF (ErrStat >= AbortErrLev) RETURN + end if + else if (i==2 .and. j==4) then + if ( ABS( p%WStff(i,j) + p%W0(3)) > MAX( RelTol * ABS(p%W0(3)), AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, self-weight stiffness matrix entry (2,4) must be equal to -W0(3).'; IF (ErrStat >= AbortErrLev) RETURN + end if + else if (i==4 .and. j==4) then + if ( ABS( p%WStff(i,j) - p%W0(3)*p%RBCoG(3) ) > MAX( RelTol * ABS(p%W0(3)*p%RBCoG(3)), AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, self-weight stiffness matrix entry (4,4) must be equal to W0(3)*zCG.'; IF (ErrStat >= AbortErrLev) RETURN + end if + else if (i==5 .and. j==5) then + if ( ABS( p%WStff(i,j) - p%W0(3)*p%RBCoG(3) ) > MAX( RelTol * ABS(p%W0(3)*p%RBCoG(3)), AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, self-weight stiffness matrix entry (5,5) must be equal to W0(3)*zCG.'; IF (ErrStat >= AbortErrLev) RETURN + end if + else if (i==6 .and. j==4) then + if ( ABS( p%WStff(i,j) + p%W0(3)*p%RBCoG(1) ) > MAX( RelTol * ABS(p%W0(3)*p%RBCoG(1)), AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, self-weight stiffness matrix entry (6,4) must be equal to -W0(3)*xCG.'; IF (ErrStat >= AbortErrLev) RETURN + end if + else if (i==6 .and. j==5) then + if ( ABS( p%WStff(i,j) + p%W0(3)*p%RBCoG(2) ) > MAX( RelTol * ABS(p%W0(3)*p%RBCoG(2)), AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, self-weight stiffness matrix entry (6,5) must be equal to -W0(3)*yCG.'; IF (ErrStat >= AbortErrLev) RETURN + end if + else + if ( ABS( p%WStff(i,j) ) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='With RBMod>0, self-weight stiffness matrix entry ('//TRIM(num2lstr(i))//','//TRIM(num2lstr(j))//') should be zero.'; IF (ErrStat >= AbortErrLev) RETURN + end if + end if + end do + end do + end if +end subroutine CheckReducedInputs +subroutine CheckConnInputs(Inp, InitInp, p, ErrStat, ErrMsg) + TYPE(ExtPtfm_InputFile), INTENT(INOUT) :: Inp !< Data stored in the module's input file + TYPE(ExtPtfm_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization routine + TYPE(ExtPtfm_ParameterType), INTENT(INOUT) :: p !< All the parameter matrices stored in this input file + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message + INTEGER(IntKi) :: i,j,iConn + real(ReKi), dimension(3) :: RelPosConn0 + REAL(ReKi), PARAMETER :: RelTol = 0.001_ReKi + REAL(ReKi), PARAMETER :: AbsTol = 0.0001_ReKi + ErrStat = ErrID_None + ErrMsg = "" + + if ( Inp%HasRBMode ) then + ! If rigid-body modes are present, the first six columns of PhiConn must be consistent with rigid-body kinematics + do iConn=1,p%nConn + RelPosConn0 = p%PosConn(iConn,:) - [InitInp%PtfmRefxt,InitInp%PtfmRefyt,InitInp%PtfmRefzt] + do i = 1,3 + do j = 1,3 + if ( i == j ) then + if ( ABS( p%PhiConn(3*(iConn-1)+i,j) - 1.0_ReKi ) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='With rigid-body modes, entry ('//TRIM(num2lstr(3*(iConn-1)+i))//','//TRIM(num2lstr(j))//') of the connection displacement matrix should be 1.'; IF (ErrStat >= AbortErrLev) RETURN + end if + else + if ( ABS( p%PhiConn(3*(iConn-1)+i,j) ) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='With rigid-body modes, entry ('//TRIM(num2lstr(3*(iConn-1)+i))//','//TRIM(num2lstr(j))//') of the connection displacement matrix should be 0.'; IF (ErrStat >= AbortErrLev) RETURN + end if + end if + end do + if ( ABS( p%PhiConn(3*(iConn-1)+i,i+3) ) > AbsTol ) then + ErrStat=ErrID_Warn; ErrMsg='With rigid-body modes, entry ('//TRIM(num2lstr(3*(iConn-1)+i))//','//TRIM(num2lstr(i+3))//') of the connection displacement matrix should be 0.'; IF (ErrStat >= AbortErrLev) RETURN + end if + end do + if ( ABS( p%PhiConn(3*(iConn-1)+1,5) - RelPosConn0(3) ) > MAX( RelTol*ABS(RelPosConn0(3)) , AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With rigid-body modes, entry ('//TRIM(num2lstr(3*(iConn-1)+1))//','//TRIM(num2lstr(5))//') of the connection displacement matrix should be '//TRIM(num2lstr( RelPosConn0(3)))//'.'; IF (ErrStat >= AbortErrLev) RETURN + end if + if ( ABS( p%PhiConn(3*(iConn-1)+1,6) + RelPosConn0(2) ) > MAX( RelTol*ABS(RelPosConn0(2)) , AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With rigid-body modes, entry ('//TRIM(num2lstr(3*(iConn-1)+1))//','//TRIM(num2lstr(6))//') of the connection displacement matrix should be '//TRIM(num2lstr(-RelPosConn0(2)))//'.'; IF (ErrStat >= AbortErrLev) RETURN + end if + if ( ABS( p%PhiConn(3*(iConn-1)+2,4) + RelPosConn0(3) ) > MAX( RelTol*ABS(RelPosConn0(3)) , AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With rigid-body modes, entry ('//TRIM(num2lstr(3*(iConn-1)+2))//','//TRIM(num2lstr(4))//') of the connection displacement matrix should be '//TRIM(num2lstr(-RelPosConn0(3)))//'.'; IF (ErrStat >= AbortErrLev) RETURN + end if + if ( ABS( p%PhiConn(3*(iConn-1)+2,6) - RelPosConn0(1) ) > MAX( RelTol*ABS(RelPosConn0(1)) , AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With rigid-body modes, entry ('//TRIM(num2lstr(3*(iConn-1)+2))//','//TRIM(num2lstr(6))//') of the connection displacement matrix should be '//TRIM(num2lstr( RelPosConn0(1)))//'.'; IF (ErrStat >= AbortErrLev) RETURN + end if + if ( ABS( p%PhiConn(3*(iConn-1)+3,4) - RelPosConn0(2) ) > MAX( RelTol*ABS(RelPosConn0(2)) , AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With rigid-body modes, entry ('//TRIM(num2lstr(3*(iConn-1)+3))//','//TRIM(num2lstr(4))//') of the connection displacement matrix should be '//TRIM(num2lstr( RelPosConn0(2)))//'.'; IF (ErrStat >= AbortErrLev) RETURN + end if + if ( ABS( p%PhiConn(3*(iConn-1)+3,5) + RelPosConn0(1) ) > MAX( RelTol*ABS(RelPosConn0(1)) , AbsTol) ) then + ErrStat=ErrID_Warn; ErrMsg='With rigid-body modes, entry ('//TRIM(num2lstr(3*(iConn-1)+3))//','//TRIM(num2lstr(5))//') of the connection displacement matrix should be '//TRIM(num2lstr(-RelPosConn0(1)))//'.'; IF (ErrStat >= AbortErrLev) RETURN + end if + end do + end if + +end subroutine CheckConnInputs !---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE ReadPrimaryFile(InputFile, p, OutFileRoot, InputFileData, ErrStat, ErrMsg) +SUBROUTINE ReadPrimaryFile(InputFile, InitInp, p, OutFileRoot, InputFileData, ErrStat, ErrMsg) !.................................................................................................................................. ! Passed variables CHARACTER(*), INTENT(IN) :: InputFile !< Name of the file containing the primary input data + TYPE(ExtPtfm_InitInputType), INTENT(IN) :: InitInp !< Initialization input TYPE(ExtPtfm_ParameterType), INTENT(INOUT) :: p !< All the parameter matrices stored in this input file CHARACTER(*), INTENT(IN) :: OutFileRoot !< The rootname of all the output files written by this routine. TYPE(ExtPtfm_InputFile), INTENT(OUT) :: InputFileData ! Data stored in the module's input file @@ -401,13 +562,14 @@ SUBROUTINE ReadPrimaryFile(InputFile, p, OutFileRoot, InputFileData, ErrStat, Er !---------------------- REDUCTION INPUTS --------------------------------------------------- CALL ReadCom(UnIn, InputFile, 'Section Header: ReductionInputs', ErrStat, ErrMsg, UnEc); if(LineFailed()) return - ! File Format switch - CALL ReadVar(UnIn, InputFile, InputFileData%FileFormat, "FileFormat", "File format switch", ErrStat, ErrMsg, UnEc); if(LineFailed()) return + ! Rigid-body mode flag + CALL ReadVar(UnIn, InputFile, InputFileData%RBMod, "RBMod", "Method for handling rigid-body motion", ErrStat, ErrMsg, UnEc); if(LineFailed()) return + InputFileData%hasRBMode = InputFileData%RBMod > 0_IntKi ! Reduction Filename CALL ReadVar(UnIn, InputFile, InputFileData%RedFile , 'Red_FileName', 'Path containing Guyan/Craig-Bampton inputs', ErrStat, ErrMsg, UnEc); if(LineFailed()) return IF ( PathIsRelative(InputFileData%RedFile) ) InputFileData%RedFile = TRIM(PriPath)//TRIM(InputFileData%RedFile) - CALL ReadVar(UnIn, InputFile, InputFileData%RedFileCst, 'RedCst_FileName', 'Path containing Guyan/Craig-Bampton constant inputs', ErrStat, ErrMsg, UnEc); if(LineFailed()) return - IF ( PathIsRelative(InputFileData%RedFileCst) ) InputFileData%RedFileCst = TRIM(PriPath)//TRIM(InputFileData%RedFileCst) + !CALL ReadVar(UnIn, InputFile, InputFileData%RedFileCst, 'RedCst_FileName', 'Path containing Guyan/Craig-Bampton constant inputs', ErrStat, ErrMsg, UnEc); if(LineFailed()) return + !IF ( PathIsRelative(InputFileData%RedFileCst) ) InputFileData%RedFileCst = TRIM(PriPath)//TRIM(InputFileData%RedFileCst) CALL ReadVar(UnIn, InputFile, N , 'NActiveCBDOF','Number of active CB mode listed in ActiveCBDOF, -1 for all modes', ErrStat, ErrMsg, UnEc ); if(LineFailed()) return if (N<0) then CALL ReadCom(UnIn, InputFile, 'ActiveCBDOF', ErrStat, ErrMsg, UnEc); if(LineFailed()) return @@ -434,6 +596,19 @@ SUBROUTINE ReadPrimaryFile(InputFile, p, OutFileRoot, InputFileData, ErrStat, Er CALL AllocAry(InputFileData%InitVelList, N, 'InitVelList', ErrStat, ErrMsg ); if (Failed()) return CALL ReadAry(UnIn, InputFile, InputFileData%InitVelList, N, 'InitVelList', 'Initial velocities', ErrStat, ErrMsg, UnEc); if(LineFailed()) return endif + !---------------------- CONNECTION INPUTS --------------------------------------- + CALL ReadCom(UnIn, InputFile, 'Section Header: Connections', ErrStat, ErrMsg, UnEc); if(LineFailed()) return + CALL ReadVar(UnIn, InputFile, InputFileData%HasConnections, 'Connections','Flag for connections', ErrStat, ErrMsg, UnEc ); if(LineFailed()) return + CALL ReadVar(UnIn, InputFile, InputFileData%ConnFile, 'Conn_FileName', 'Path containing connections inputs', ErrStat, ErrMsg, UnEc); if(LineFailed()) return + IF ( PathIsRelative(InputFileData%ConnFile) ) InputFileData%ConnFile = TRIM(PriPath)//TRIM(InputFileData%ConnFile) + !---------------------- USER FORCING INPUTS --------------------------------------- + CALL ReadCom(UnIn, InputFile, 'Section Header: User Forcing', ErrStat, ErrMsg, UnEc); if(LineFailed()) return + CALL ReadVar(UnIn, InputFile, InputFileData%HasUserForcing, 'UserForcing','Flag for user prescribed modal forcing', ErrStat, ErrMsg, UnEc ); if(LineFailed()) return + CALL ReadVar(UnIn, InputFile, InputFileData%ForceFile, 'Force_FileName', 'Path containing user modal forcing inputs', ErrStat, ErrMsg, UnEc); if(LineFailed()) return + IF ( PathIsRelative(InputFileData%ForceFile) ) InputFileData%ForceFile = TRIM(PriPath)//TRIM(InputFileData%ForceFile) + CALL ReadVar(UnIn, InputFile, InputFileData%HasConnForcing, 'ConnForcing','Flag for user prescribed connection forcing', ErrStat, ErrMsg, UnEc ); if(LineFailed()) return + CALL ReadVar(UnIn, InputFile, InputFileData%FConnFile, 'FConn_FileName', 'Path containing user connection forcing inputs', ErrStat, ErrMsg, UnEc); if(LineFailed()) return + IF ( PathIsRelative(InputFileData%FConnFile) ) InputFileData%FConnFile = TRIM(PriPath)//TRIM(InputFileData%FConnFile) !---------------------- OUTPUT -------------------------------------------------- CALL ReadCom(UnIn, InputFile, 'Section Header: Output', ErrStat, ErrMsg, UnEc); if(LineFailed()) return ! SumPrint - Print summary data to .sum (flag): @@ -454,10 +629,39 @@ SUBROUTINE ReadPrimaryFile(InputFile, p, OutFileRoot, InputFileData, ErrStat, Er call cleanup() ! --- Reading Reduced file - call ReadReducedFile(InputFileData%RedFile, p, InputFileData%FileFormat, ErrStat, ErrMsg); if(Failed()) return; + call ReadReducedFile(InputFileData%RedFile, p, ErrStat, ErrMsg); if(Failed()) return ! Checking that everyting was correctly read and set - call CheckInputs(InputFileData, p, ErrStat, ErrMsg); if(Failed()) return + call CheckReducedInputs(InputFileData, p, ErrStat, ErrMsg); if(Failed()) return + + ! --- Reading connection file + if (InputFileData%hasConnections) then + call ReadConnFile(InputFileData%ConnFile, p, ErrStat, ErrMsg); if(Failed()) return + call CheckConnInputs(InputFileData, InitInp, p, ErrStat, ErrMsg); if(Failed()) return + else + p%NConn = 0_IntKi + end if + + ! --- Reading user modal forcing file + if (InputFileData%HasUserForcing) then + call ReadForceFile(InputFileData%ForceFile, p%nTot, p%UsrModeF, ErrStat, ErrMsg); if(Failed()) return + else + p%UsrModeF%nTimeSteps = 1_IntKi + call allocAry( p%UsrModeF%Forces, 1_IntKi, p%nTot, 'p%UsrModeF%Forces', ErrStat, ErrMsg); if(Failed()) return + call allocAry( p%UsrModeF%times , 1_IntKi, 'p%UsrModeF%times' , ErrStat, ErrMsg); if(Failed()) return + p%UsrModeF%Forces= 0.0_ReKi + p%UsrModeF%times = 0.0_ReKi + end if + ! --- Reading user connection forcing file + if (InputFileData%HasConnForcing) then + call ReadForceFile(InputFileData%FConnFile, p%nConn*3, p%UsrConnF, ErrStat, ErrMsg); if(Failed()) return + else + p%UsrConnF%nTimeSteps = 1_IntKi + call allocAry( p%UsrConnF%Forces, 1_IntKi, p%nConn*3, 'p%UsrConnF%Forces', ErrStat, ErrMsg); if(Failed()) return + call allocAry( p%UsrConnF%times , 1_IntKi, 'p%UsrConnF%times' , ErrStat, ErrMsg); if(Failed()) return + p%UsrConnF%Forces= 0.0_ReKi + p%UsrConnF%times = 0.0_ReKi + end if ! --- Reducing the number of DOF if needed p%nCBFull=p%nCB @@ -515,7 +719,10 @@ SUBROUTINE ReduceNumberOfDOF(p, ErrStat, ErrMsg) call SquareMatRed(p%Mass) call SquareMatRed(p%Stff) call SquareMatRed(p%Damp) - call TimeMatRed(p%Forces) + call TimeMatRed(p%UsrModeF%Forces) + if (allocated(p%PhiConn)) then + call RectMatRed(p%PhiConn) + end if ! Trigger p%nCB = size(p%ActiveCBDOF) @@ -540,6 +747,22 @@ subroutine SquareMatRed(M) deallocate(tmp) end subroutine !> Takes M and returns M(:,I) where I is a list of indexes to keep + subroutine RectMatRed(M) + real(Reki), dimension(:,:), allocatable :: M + real(Reki), dimension(:,:), allocatable :: tmp + integer(IntKi) :: J + ! Storing M to a tmp array + call allocAry( tmp, size(M,1), size(M,2), 'Mtmp', ErrStat, ErrMsg); if(Failed()) return + tmp=M + ! Reallocating M and storing only the desired DOF + deallocate(M) + call allocAry(M, size(tmp,1), nActive, 'M', ErrStat, ErrMsg); if(Failed()) return + do J=1,nActive + M(:,J) = tmp(:, FullActiveCBDOF(J)) + enddo + deallocate(tmp) + end subroutine + !> Takes M and returns M(:,I) where I is a list of indexes to keep subroutine TimeMatRed(M) real(Reki), dimension(:,:), allocatable :: M real(Reki), dimension(:,:), allocatable :: tmp @@ -565,13 +788,12 @@ END SUBROUTINE ReduceNumberOfDOF !.................................................................................................................................. -SUBROUTINE ReadReducedFile( InputFile, p, FileFormat, ErrStat, ErrMsg ) +SUBROUTINE ReadReducedFile( InputFile, p, ErrStat, ErrMsg ) !.................................................................................................................................. ! Passed variables CHARACTER(*), INTENT(IN) :: InputFile !< Name of the file containing the primary input data TYPE(ExtPtfm_ParameterType), INTENT(INOUT) :: p !< All the parameter matrices stored in this input file - INTEGER(IntKi), INTENT(IN) :: FileFormat !< File format for reduction inputs - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message ! Local variables: REAL(ReKi), dimension(:),allocatable :: TmpAry ! temporary array for reading row from file @@ -581,230 +803,247 @@ SUBROUTINE ReadReducedFile( InputFile, p, FileFormat, ErrStat, ErrMsg ) CHARACTER(4096) :: Line ! Temporary storage of a line from the input file (to compare with "default") ErrStat = ErrID_None ErrMsg = "" - if (FileFormat==FILEFORMAT_GUYANASCII) then - call ReadGuyanASCII() - elseif (FileFormat==FILEFORMAT_FLEXASCII) then - call ReadFlexASCII() - else - call SetErrStat(ErrID_Fatal, 'FileFormat not implemented: '//trim(Num2LStr(FileFormat)), ErrStat, ErrMsg, 'ExtPtfm_ReadReducedFile') - return - endif - ! --- The code below can detect between FlexASCII and GuyanASCII format by looking at the two first lines - ! Get an available unit number for the file. - !CALL GetNewUnit( UnIn, ErrStat, ErrMsg ); if(Failed()) return - !! Open the Primary input file. - !CALL OpenFInpFile ( UnIn, InputFile, ErrStat, ErrMsg ); if(Failed()) return - !iLine=1 - !!-------------------------- Read the first two lines - !CALL ReadStr( UnIn, InputFile, Line, 'Line'//Num2LStr(iLine), 'External Platform MCKF file', ErrStat, ErrMsg) - !if(Failed()) return - !iLine=iLine+1 - !CALL ReadStr( UnIn, InputFile, Line2, 'Line'//Num2LStr(iLine), 'External Platform MCKF file', ErrStat, ErrMsg) - !if(Failed()) return - !iLine=iLine+1 - !call CONV2UC(Line) - !call CONV2UC(Line2) - !call cleanup() - !!-------------------------- Detecting file format - !if (index(Line2,'#MASS')==1) then - ! write(*,*) 'File detected as Guyan ASCII file format: '//trim(InputFile) - ! call ReadGuyanASCII() - !else if (index(Line2,'FLEX 5 FORMAT')>=1) then - ! write(*,*) 'File detected as FLEX ASCII file format: '//trim(InputFile) - ! call ReadFlexASCII() - !endif + + ! Get an available unit number for the file. + CALL GetNewUnit( UnIn, ErrStat, ErrMsg ); if ( ErrStat /= 0 ) return + ! Open the Primary input file. + CALL OpenFInpFile(UnIn, InputFile, ErrStat, ErrMsg); if ( ErrStat /= 0 ) return + + ! --- Reading file line by line + ErrStat=0 + iLine=0 + do while (ErrStat==0) + iLine=iLine+1 + read(UnIn,'(A)', iostat=ErrStat) Line + if (ErrStat/=0) then + if (ErrStat < 0) then + ErrStat=0 ! End of file is fine + else + ErrMsg='Error while reading file '//trim(InputFile)// ' line '//Num2LStr(iLine) + endif + exit + endif + ! Line content is analyzed as case insensitive + call Conv2UC(Line) + if (index(Line,'!DIMENSION')==1) then + p%nTot = ReadIntFromStr(Line(12:), '`dimension`, file '//trim(InputFile)//', line '//Num2LStr(iLine), ErrStat, ErrMsg); if (ErrStat /= 0) exit + p%nCB=p%nTot-6 + + else if (index(Line,'!MASS')==1) then + if (p%nTot<0) exit + call ReadRealMatrix(UnIn, InputFile, p%Mass, 'Mass Matrix', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) + else if (index(Line,'!STIFFNESS')==1) then + if (p%nTot<0) exit + call ReadRealMatrix(UnIn, InputFile, p%Stff, 'Stiffness Matrix', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) + else if (index(Line,'!DAMPING')==1) then + if (p%nTot<0) exit + call ReadRealMatrix(UnIn, InputFile, p%Damp, 'Damping Matrix', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) + else if (index(Line,'!WEIGHT CONSTANT')==1) then + if (p%nTot<0) exit + CALL AllocAry(p%W0, p%nTot, 'W0', ErrStat, ErrMsg ); if (Failed()) return + call ReadAry(UnIn, InputFile, p%W0, p%nTot, 'W0', 'Weight constant', ErrStat, ErrMsg) + else if (index(Line,'!WEIGHT STIFFNESS')==1) then + if (p%nTot<0) exit + call ReadRealMatrix(UnIn, InputFile, p%WStff, 'Weight stiffness', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) + ! elseif (index(Line,'!')==1) then + !write(*,*) 'Ignored comment: '//trim(Line) + ! else + ! Ignore unsupported lines + !write(*,*) 'Ignored line: '//trim(Line) + endif + enddo + close( UnIn ) CONTAINS - !> logical function Failed() CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_ReadReducedFile') Failed = ErrStat >= AbortErrLev if(Failed) call cleanup() end function Failed - !> subroutine cleanup() close( UnIn ) if (allocated(TmpAry)) deallocate(TmpAry) end subroutine cleanup +END SUBROUTINE ReadReducedFile - !> Reads a FLEX ASCII file for Guyan or CraigBampton reductions - SUBROUTINE ReadFlexASCII() - REAL(ReKi) :: dt !< time step - REAL(ReKi) :: T !< total simulation time - - T=-1 - dt=-1 - ! Get an available unit number for the file. - CALL GetNewUnit( UnIn, ErrStat, ErrMsg ); if ( ErrStat /= 0 ) return - ! Open the Primary input file. - CALL OpenFInpFile(UnIn, InputFile, ErrStat, ErrMsg); if ( ErrStat /= 0 ) return - - ! --- Reading file line by line - ErrStat=0 - iLine=0 - do while (ErrStat==0) - iLine=iLine+1 - read(UnIn,'(A)', iostat=ErrStat) Line - if (ErrStat/=0) then - if (ErrStat < 0) then - ErrStat=0 ! End of file is fine - else - ErrMsg='Error while reading file '//trim(InputFile)// ' line '//Num2LStr(iLine) - endif - exit - endif - ! Line content is analyzed as case incensitive - call Conv2UC(Line) - if (index(Line,'!DIMENSION')==1) then - p%nTot = ReadIntFromStr(Line(12:), '`dimension`, file '//trim(InputFile)//', line '//Num2LStr(iLine), ErrStat, ErrMsg); if (ErrStat /= 0) exit - p%nCB=p%nTot-6 - - else if (index(Line,'!TIME INCREMENT IN SIMULATION:')==1) then - dt = ReadFloatFromStr(Line(31:), '`time increment`, file '//trim(InputFile)//', line '//Num2LStr(iLine), ErrStat, ErrMsg); if (ErrStat /= 0) exit - - else if (index(Line,'!TOTAL SIMULATION TIME IN FILE:')==1) then - T = ReadFloatFromStr(Line(32:), '`total simulation time`, file '//trim(InputFile)//', line '//Num2LStr(iLine), ErrStat, ErrMsg ); if (ErrStat /= 0) exit - - else if (index(Line,'!MASS MATRIX')==1) then - iLine=iLine+1 - CALL ReadCom( UnIn, InputFile, 'Comment - Line '//Num2LStr(iLine), ErrStat, ErrMsg); if (ErrStat /= 0) exit - if (p%nTot<0) exit - call ReadRealMatrix(UnIn, InputFile, p%Mass, 'Mass Matrix', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) - - else if (index(Line,'!STIFFNESS MATRIX')==1) then - iLine=iLine+1 - CALL ReadCom( UnIn, InputFile, 'Comment - Line '//Num2LStr(iLine), ErrStat, ErrMsg); if (ErrStat /= 0) exit - if (p%nTot<0) exit - call ReadRealMatrix(UnIn, InputFile, p%Stff, 'Stiffness Matrix', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) - - else if (index(Line,'!DAMPING MATRIX')==1) then - iLine=iLine+1 - CALL ReadCom( UnIn, InputFile, 'Comment - Line '//Num2LStr(iLine), ErrStat, ErrMsg); if (ErrStat /= 0) exit - if (p%nTot<0) exit - call ReadRealMatrix(UnIn, InputFile, p%Damp, 'Damping Matrix', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) - - else if (index(Line,'!LOADING')==1) then - iLine=iLine+1 - CALL ReadCom( UnIn, InputFile, 'Comment - Line '//Num2LStr(iLine), ErrStat, ErrMsg) - if (ErrStat /= 0) exit - p%nTimeSteps = nint(T/dt)+1 - if (p%nTot<0) exit - call allocAry( p%Forces, max(1,p%nTimeSteps), p%nTot, 'p%Forces' , ErrStat, ErrMsg); if (ErrStat /= 0) exit - call allocAry( p%times , max(1,p%nTimeSteps), 'p%times', ErrStat, ErrMsg); if (ErrStat /= 0) exit - if (p%nTimeSteps == 0) then - p%Forces= 0.0_ReKi - p%times = 0.0_ReKi - p%nTimeSteps = 1 - else - allocate(TmpAry(1:p%nTot+1)) - do i=1,p%nTimeSteps - iLine=iLine+1 - TmpAry(1:p%nTot+1)=-999.9E-09 - read(UnIn, fmt='(A)', iostat=ErrStat) Line - if (ErrStat/=0) then - ErrStat = ErrID_Fatal - ErrMSg='Failed to read line '//trim(Num2LStr(iLine))//' (out of '//trim(Num2LStr(p%nTimeSteps))//' expected lines) in file: '//trim(InputFile) - exit - end if - ! Extract fields (ReadR8AryFromStr is in NWTC_IO) - CALL ReadAry(Line, TmpAry, p%nTot+1, 'Forces', 'Forces', ErrStat, ErrMsg) - if (ErrStat/=0) then - ErrStat = ErrID_Fatal - ErrMsg='Failed to extract fields from line '//trim(Num2LStr(iLine))//'. '//trim(ErrMsg)//'. Check that the number of columns is correct in file: '//trim(InputFile) - exit - end if - if (ErrStat /= 0) exit - p%times(i) = TmpAry(1) - p%Forces(i,:) = TmpAry(2:p%nTot+1) - end do - end if +!.................................................................................................................................. +SUBROUTINE ReadConnFile( InputFile, p, ErrStat, ErrMsg ) +!.................................................................................................................................. + ! Passed variables + CHARACTER(*), INTENT(IN) :: InputFile !< Name of the file containing the primary input data + TYPE(ExtPtfm_ParameterType), INTENT(INOUT) :: p !< All the parameter matrices stored in this input file + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message + ! Local variables: + INTEGER(IntKi) :: UnIn ! Unit number for reading file + INTEGER(IntKi) :: iLine ! Current position in file + CHARACTER(4096) :: Line ! Temporary storage of a line from the input file (to compare with "default") + ErrStat = ErrID_None + ErrMsg = "" + + ! Get an available unit number for the file. + CALL GetNewUnit( UnIn, ErrStat, ErrMsg ); if (Failed()) return + ! Open the Primary input file. + CALL OpenFInpFile(UnIn, InputFile, ErrStat, ErrMsg); if (Failed()) return - elseif (index(Line,'!')==1) then - !write(*,*) 'Ignored comment: '//trim(Line) + ! --- Reading file line by line + ErrStat=0 + iLine=0 + do while (ErrStat==0) + iLine=iLine+1 + read(UnIn,'(A)', iostat=ErrStat) Line + if (ErrStat/=0) then + if (ErrStat < 0) then + ErrStat=0 ! End of file is fine else - ! Ignore unsupported lines - !write(*,*) 'Ignored line: '//trim(Line) + ErrMsg='Error while reading file '//trim(InputFile)// ' line '//Num2LStr(iLine) endif - enddo - close( UnIn ) - END SUBROUTINE ReadFlexASCII - - !> Reads a Guyan ASCII file - SUBROUTINE ReadGuyanASCII() - ! Guyan reduction has 6 DOF, 0 CB DOFs - p%nCB = 0 - p%nTot = 6 - ! Get an available unit number for the file. - CALL GetNewUnit( UnIn, ErrStat, ErrMsg ); if ( ErrStat /= 0 ) return - ! Open the Primary input file. - CALL OpenFInpFile ( UnIn, InputFile, ErrStat, ErrMsg ); if ( ErrStat /= 0 ) return + exit + endif + ! Line content is analyzed as case insensitive + call Conv2UC(Line) + if (index(Line,'!NCONN:')==1) then + p%nConn = ReadIntFromStr(Line(8:), '`Nconn`, file '//trim(InputFile)//', line '//Num2LStr(iLine), ErrStat, ErrMsg); if (Failed()) return + if (p%nConn<=0_IntKi) return + else if (index(Line,'!CONNECTIONS')==1) then + call ReadRealMatrix(UnIn, InputFile, p%PosConn, 'Connections', p%nConn, 3_IntKi, ErrStat, ErrMsg, iLine) + else if (index(Line,'!DISPLACEMENT')==1) then + call ReadRealMatrix(UnIn, InputFile, p%PhiConn, 'Displacement', 3*p%nConn, p%nTot, ErrStat, ErrMsg, iLine) + ! else if (index(Line,'!')==1) then + !write(*,*) 'Ignored comment: '//trim(Line) + ! else + ! Ignore unsupported lines + !write(*,*) 'Ignored line: '//trim(Line) + end if + end do + close( UnIn ) - !-------------------------- HEADER --------------------------------------------- - CALL ReadStr( UnIn, InputFile, Line, 'Header line', 'File Header: External Platform MCKF Matrices (line 1)', ErrStat, ErrMsg) - if ( ErrStat /= 0 ) return - !---------------------- MASS MATRIX -------------------------------------- - CALL ReadCom( UnIn, InputFile, 'Section Header: Mass Matrix', ErrStat, ErrMsg) - if ( ErrStat /= 0 ) return - CALL ReadRealMatrix(UnIn, InputFile, p%Mass, 'Mass Matrix', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) - if ( ErrStat /= 0 ) return - !---------------------- DAMPING MATRIX -------------------------------------- - CALL ReadCom( UnIn, InputFile, 'Section Header: Damping Matrix', ErrStat, ErrMsg) - if ( ErrStat /= 0 ) return - CALL ReadRealMatrix(UnIn, InputFile, p%Damp, 'Damping Matrix', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) - if ( ErrStat /= 0 ) return - !---------------------- STIFFNESS MATRIX -------------------------------------- - CALL ReadCom( UnIn, InputFile, 'Section Header: Stiffness Matrix', ErrStat, ErrMsg) - if ( ErrStat /= 0 ) return - CALL ReadRealMatrix(UnIn, InputFile, p%Stff, 'Stiffness Matrix', p%nTot, p%nTot, ErrStat, ErrMsg, iLine) - if ( ErrStat /= 0 ) return - !---------------------- LOAD time-history -------------------------------------- - p%nTimeSteps = 0 - CALL ReadCom( UnIn, InputFile, 'Section Header: Loads time-history', ErrStat, ErrMsg) - CALL ReadCom( UnIn, InputFile, 'Loads time-history table channel names', ErrStat, ErrMsg) - CALL ReadCom( UnIn, InputFile, 'Loads time-history table channel units', ErrStat, ErrMsg) - allocate(TmpAry(1:p%nTot+1)) - if (ErrStat < AbortErrLev) then - ! let's figure out how many rows of data are in the time-history table: - read( UnIn, *, IOSTAT=ErrStat ) TmpAry - do while (ErrStat==0) - p%nTimeSteps = p%nTimeSteps + 1 - read( UnIn, *, IOSTAT=ErrStat ) TmpAry - end do - end if - call allocAry( p%Forces, max(1,p%nTimeSteps), p%nTot, 'p%Forces', ErrStat, ErrMsg); if ( ErrStat /= 0 ) return - call allocAry( p%times , max(1,p%nTimeSteps), 'p%times' , ErrStat, ErrMsg); if ( ErrStat /= 0 ) return - if (p%nTimeSteps == 0) then - p%Forces = 0.0_ReKi - p%times = 0.0_ReKi - p%nTimeSteps = 1 - else - rewind(UnIn) - do i=1,25 ! skip the first 25 rows of the file until we get to the data for the time-history table - read(UnIn,*,IOSTAT=ErrStat) line - end do - do i=1,p%nTimeSteps - read(UnIn, fmt='(A)', iostat=ErrStat) Line - if (ErrStat/=0) then +CONTAINS + logical function Failed() + CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_ReadConnFile') + Failed = ErrStat >= AbortErrLev + if(Failed) call cleanup() + end function Failed + subroutine cleanup() + close( UnIn ) + end subroutine cleanup +END SUBROUTINE ReadConnFile + +!.................................................................................................................................. +SUBROUTINE ReadForceFile( InputFile, n, UserForcing, ErrStat, ErrMsg ) +!.................................................................................................................................. + ! Passed variables + CHARACTER(*), INTENT(IN) :: InputFile !< Name of the file containing the primary input data + INTEGER(IntKi), INTENT(IN) :: n !< Number of load components expected + TYPE(UserForcingType), INTENT(INOUT) :: UserForcing !< User-specified forcing time series + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message + ! Local variables: + REAL(ReKi), dimension(:),allocatable :: TmpAry ! temporary array for reading row from file + INTEGER(IntKi) :: I ! loop counter + INTEGER(IntKi) :: UnIn ! Unit number for reading file + INTEGER(IntKi) :: iLine ! Current position in file + CHARACTER(4096) :: Line ! Temporary storage of a line from the input file (to compare with "default") + LOGICAL :: foundNSteps + LOGICAL :: foundForcing + ErrStat = ErrID_None + ErrMsg = "" + + foundNSteps = .false. + foundForcing = .false. + + UserForcing%nTimeSteps = 0_IntKi + + ! Get an available unit number for the file. + CALL GetNewUnit( UnIn, ErrStat, ErrMsg ); if (Failed()) return + ! Open the Primary input file. + CALL OpenFInpFile(UnIn, InputFile, ErrStat, ErrMsg); if (Failed()) return + + ! --- Reading file line by line + ErrStat=0 + iLine=0 + do while (ErrStat==0) + iLine=iLine+1 + read(UnIn,'(A)', iostat=ErrStat) Line + if (ErrStat/=0) then + if (ErrStat < 0) then + ErrStat=0 ! End of file is fine + else + ErrMsg='Error while reading file '//trim(InputFile)// ' line '//Num2LStr(iLine) + endif + exit + endif + ! Line content is analyzed as case insensitive + call Conv2UC(Line) + if (index(Line,'!NSTEPS')==1) then + foundNSteps = .true. + UserForcing%nTimeSteps = ReadIntFromStr(Line(9:), '`Nsteps`, file '//trim(InputFile)//', line '//Num2LStr(iLine), ErrStat, ErrMsg); if (Failed()) return + else if (index(Line,'!FORCING')==1) then + foundForcing = .true. + if (n<0 .or. UserForcing%nTimeSteps==0) exit + call allocAry( UserForcing%Forces, max(1,UserForcing%nTimeSteps), n, 'UserForcing%Forces', ErrStat, ErrMsg); if (Failed()) return + call allocAry( UserForcing%times , max(1,UserForcing%nTimeSteps), 'UserForcing%times' , ErrStat, ErrMsg); if (Failed()) return + allocate(TmpAry(1:n+1)) + do i=1,UserForcing%nTimeSteps + iLine=iLine+1 + TmpAry(1:n+1)=-999.9E-09 + read(UnIn, fmt='(A)', iostat=ErrStat) Line + if (ErrStat/=0) then ErrStat = ErrID_Fatal - ErrMSg='Failed to read line '//trim(Num2LStr(iLine))//' (out of '//trim(Num2LStr(p%nTimeSteps))//' expected lines) in file: '//trim(InputFile) + ErrMSg='Failed to read line '//trim(Num2LStr(iLine))//' (out of '//trim(Num2LStr(UserForcing%nTimeSteps))//' expected lines) in file: '//trim(InputFile) exit - end if - ! Extract fields (ReadR8AryFromStr is in NWTC_IO) - CALL ReadAry(Line, TmpAry, p%nTot+1, 'Forces', 'Forces', ErrStat, ErrMsg) - if (ErrStat/=0) then + end if + ! Extract fields (ReadR8AryFromStr is in NWTC_IO) + CALL ReadAry(Line, TmpAry, n+1, 'Forces', 'Forces', ErrStat, ErrMsg) + if (ErrStat/=0) then ErrStat = ErrID_Fatal ErrMsg='Failed to extract fields from line '//trim(Num2LStr(iLine))//'. '//trim(ErrMsg)//'. Check that the number of columns is correct in file: '//trim(InputFile) exit - end if - if ( ErrStat /= 0 ) return - p%times(i) = TmpAry(1) - p%Forces(i,:) = TmpAry(2:p%nTot+1) - end do - end if - !---------------------- END OF FILE ----------------------------------------- - close( UnIn ) - END SUBROUTINE ReadGuyanASCII -END SUBROUTINE ReadReducedFile + end if + if (ErrStat /= 0) exit + UserForcing%times(i) = TmpAry(1) + UserForcing%Forces(i,:) = TmpAry(2:n+1) + end do + ! elseif (index(Line,'!')==1) then + !write(*,*) 'Ignored comment: '//trim(Line) + ! else + ! Ignore unsupported lines + !write(*,*) 'Ignored line: '//trim(Line) + end if + enddo + close( UnIn ) + + if (.not.foundNSteps) then + ErrStat = ErrID_Fatal + ErrMsg = "Did not find '!NSteps:' followed by the number of time steps in file "//trim(InputFile)//"." + if(Failed()) return + end if + + if (.not.foundForcing) then + ErrStat = ErrID_Fatal + ErrMsg = "Did not find forcing time series after '!FORCING' in file "//trim(InputFile)//". Note that the time series should be after '!NSteps:'." + if(Failed()) return + end if + + if (UserForcing%nTimeSteps <= 0_IntKi) then + UserForcing%nTimeSteps = 1_IntKi + call allocAry( UserForcing%Forces, 1_IntKi, n, 'UserForcing%Forces', ErrStat, ErrMsg); if(Failed()) return + call allocAry( UserForcing%times , 1_IntKi, 'UserForcing%times' , ErrStat, ErrMsg); if(Failed()) return + UserForcing%Forces= 0.0_ReKi + UserForcing%times = 0.0_ReKi + end if + +CONTAINS + logical function Failed() + CALL SetErrStatSimple(ErrStat, ErrMsg, 'ExtPtfm_ReadForceFile') + Failed = ErrStat >= AbortErrLev + if(Failed) call cleanup() + end function Failed + subroutine cleanup() + close( UnIn ) + if (allocated(TmpAry)) deallocate(TmpAry) + end subroutine cleanup +END SUBROUTINE ReadForceFile !> This routine generates the summary file, which contains a regurgitation of the input data and interpolated flexible body data. SUBROUTINE ExtPtfm_PrintSum(x, p, m, RootName, ErrStat, ErrMsg) @@ -843,9 +1082,9 @@ SUBROUTINE ExtPtfm_PrintSum(x, p, m, RootName, ErrStat, ErrMsg) write(UnSu,'(A,A)') 'Time integration method : ',StrIntMethod(p%IntMethod) write(UnSu,'(A,F13.8)')'Integration time step : ',p%EP_DeltaT write(UnSu,'(A)') '!Reduction input file' - write(UnSu,'(A,I0)') 'Number of time steps : ',p%nTimeSteps - write(UnSu,'(A,F13.8)')'Start time : ',p%times(1) - write(UnSu,'(A,F13.8)')'End time : ',p%times(p%nTimeSteps) + !write(UnSu,'(A,I0)') 'Number of time steps : ',p%nTimeSteps + !write(UnSu,'(A,F13.8)')'Start time : ',p%times(1) + !write(UnSu,'(A,F13.8)')'End time : ',p%times(p%nTimeSteps) write(UnSu,'(A,I0)') 'Total number of DOF (input) : ',p%nCBFull+6 write(UnSu,'(A,I0)') 'Number of CB modes (input) : ',p%nCBFull write(UnSu,'(A)') '!Degrees of freedom' @@ -861,11 +1100,11 @@ SUBROUTINE ExtPtfm_PrintSum(x, p, m, RootName, ErrStat, ErrMsg) call disp1r8(UnSu, 'qm' ,x%qm) call disp1r8(UnSu, 'qmdot',x%qmdot) - write(UnSu,'(A)')'!State matrices' - call disp2r8(UnSu, 'A',p%AMat) - call disp2r8(UnSu, 'B',p%BMat) - call disp2r8(UnSu, 'C',p%CMat) - call disp2r8(UnSu, 'D',p%DMat) + !write(UnSu,'(A)')'!State matrices' + !call disp2r8(UnSu, 'A',p%AMat) + !call disp2r8(UnSu, 'B',p%BMat) + !call disp2r8(UnSu, 'C',p%CMat) + !call disp2r8(UnSu, 'D',p%DMat) write(UnSu,'(A)')'!Input matrices' call disp2r8(UnSu, 'M',p%Mass) call disp2r8(UnSu, 'K',p%Stff) @@ -883,6 +1122,13 @@ SUBROUTINE ExtPtfm_PrintSum(x, p, m, RootName, ErrStat, ErrMsg) call disp2r8(UnSu, 'C21',p%C21) call disp2r8(UnSu, 'C22',p%C22) + write(UnSu,'(//,A,//)') '!Connections:' + write(UnSu,'(A,I0)') 'Number of connections : ',p%nConn + if (p%nConn>0) then + call disp2r8(UnSu, 'PosConn',p%PosConn) + call disp2r8(UnSu, 'PhiConn',p%PhiConn) + end if + OutPFmt = '( I4, 3X,A '//TRIM(Num2LStr(ChanLen))//',1 X, A'//TRIM(Num2LStr(ChanLen))//' )' OutPFmtS = '( A4, 3X,A '//TRIM(Num2LStr(ChanLen))//',1 X, A'//TRIM(Num2LStr(ChanLen))//' )' write(UnSu,'(//,A,//)') '!Requested Outputs:' diff --git a/modules/extptfm/src/ExtPtfm_MCKF_Registry.txt b/modules/extptfm/src/ExtPtfm_MCKF_Registry.txt index 4297d50b33..eea884b253 100644 --- a/modules/extptfm/src/ExtPtfm_MCKF_Registry.txt +++ b/modules/extptfm/src/ExtPtfm_MCKF_Registry.txt @@ -13,13 +13,19 @@ # ...... Include files (definitions from NWTC Library) ............................................................................ include Registry_NWTC_Library.txt +# ..... User-defined forcing ................................................................................................. +typedef ExtPtfm_MCKF/ExtPtfm UserForcingType IntKi nTimeSteps - - - "Number of values of Forces and times" - +typedef ^ ^ ReKi times {:} - - "the time associated with each row of Forces" "s" +typedef ^ ^ ReKi Forces {:}{:} - - "Prescribed reduced loads, the 3 platform forces (in N) and moments (Nm) acting at the platform reference, associated with everything but the added-mass effects; positive forces are in the direction of motion." "N, N-m" # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: # e.g., the name of the input file, the file root name, etc. typedef ExtPtfm_MCKF/ExtPtfm InitInputType CHARACTER(1024) InputFile - - - "Name of the input file; remove if there is no file" - typedef ^ ^ LOGICAL Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - -typedef ^ ^ ReKi PtfmRefzt - - - "Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point" meters +typedef ^ ^ ReKi PtfmRefxt - - - "Longitudinal distance from PRP to the platform reference point" "m" +typedef ^ ^ ReKi PtfmRefyt - - - "Laterl distance from PRP to the platform reference point" "m" +typedef ^ ^ ReKi PtfmRefzt - - - "Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point" "m" typedef ^ ^ CHARACTER(1024) RootName - - - "RootName for writing output files" # ..... Input file data ........................................................................................................... @@ -27,13 +33,20 @@ typedef ^ ^ CHARACTER(1024) RootName - - - # ..... Primary Input file data ........................................................................................................... typedef ExtPtfm_MCKF/ExtPtfm ExtPtfm_InputFile DbKi DT - - - "Requested integration time for ElastoDyn" seconds typedef ^ ^ IntKi IntMethod - - - "Integration Method (1=RK4, 2=AB4, 3=ABM4)" - -typedef ^ ^ IntKi FileFormat - - - "File format switch" - +typedef ^ ^ IntKi RBMod - - - "Method for handling rigid-body modes" - +typedef ^ ^ LOGICAL HasRBMode - - - "True: has rigid-body modes/floating structure; False: no rigid-body modes" - typedef ^ ^ CHARACTER(1024) RedFile - - - "File containing reduction inputs" - typedef ^ ^ CHARACTER(1024) RedFileCst - - - "File containing constant reduction inputs" - typedef ^ ^ LOGICAL EquilStart - - - "Flag to determine the equilibrium positions of the CB modes at initialization (first call)" - typedef ^ ^ IntKi ActiveCBDOF {:} - - "List of active CB DOF" - typedef ^ ^ ReKi InitPosList {:} - - "Initial positions of the CB DOFs" - typedef ^ ^ ReKi InitVelList {:} - - "Initial velocities of the CB DOFs" - +typedef ^ ^ LOGICAL HasConnections - - - "True: has connections; False: no connections" - +typedef ^ ^ CHARACTER(1024) ConnFile - - - "File containing connection inputs" - +typedef ^ ^ LOGICAL HasUserForcing - - - "True: has user forcing; False: no user forcing" - +typedef ^ ^ CHARACTER(1024) ForceFile - - - "File containing user forcing inputs" - +typedef ^ ^ LOGICAL HasConnForcing - - - "True: has user forcing; False: no user forcing" - +typedef ^ ^ CHARACTER(1024) FConnFile - - - "File containing user forcing inputs" - typedef ^ ^ LOGICAL SumPrint - - - "Print summary data to .sum" - typedef ^ ^ IntKi OutFile - - - "Switch to determine where output will be placed: (1: in module output file only; 2: in glue code output file only; 3: both)" - typedef ^ ^ LOGICAL TabDelim - - - "Flag to cause tab-delimited text output (delimited by space otherwise)" - @@ -47,15 +60,7 @@ typedef ^ ^ CHARACTER(ChanLen) OutList { typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - typedef ^ ^ CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -typedef ^ ^ LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - -typedef ^ ^ LOGICAL RotFrame_x {:} - - "Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame" - -typedef ^ ^ LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - -typedef ^ ^ LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix)" - -typedef ^ ^ IntKi DerivOrder_x {:} - - "Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization" - - +typedef ^ ^ ModVarsType Vars - - - "Module variables" # ..... States .................................................................................................................... # Define continuous (differentiable) states here: @@ -74,57 +79,96 @@ typedef ^ ^ IntKi n #typedef ^ OtherStateType IntKi DummyOtherState - - - "Remove this variable if you have other states" - -# ..... Misc/Optimization variables................................................................................................. -# Define any data that are used only for efficiency purposes (these variables are not associated with time): -# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. -typedef ^ MiscVarType ReKi xFlat {:} - - "Flattened vector of states" -typedef ^ MiscVarType ReKi uFlat {18} - - "Flattened vector of inputs" -typedef ^ MiscVarType ReKi F_at_t {:} - - "The 6 interface loads and Craig-Bampton loads at t (force and moment acting at the platform reference (no added-mass effects); positive forces are in the direction of motion)." "N, N-m" -typedef ^ MiscVarType IntKi Indx - - - "Index into times, to speed up interpolation" - -typedef ^ MiscVarType LOGICAL EquilStart - - - "Flag to determine the equilibrium position of the CB DOF at initialization (first call)" - -typedef ^ ^ ReKi AllOuts {:} - - "An array holding the value of all of the calculated (not only selected) output channels" "see OutListParameters.xlsx spreadsheet" - - # ..... Parameters ................................................................................................................ # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: -typedef ^ ParameterType ReKi Mass {:}{:} - - "Mass matrix" "kg, kg-m, kg-m^2" -typedef ^ ParameterType ReKi Damp {:}{:} - - "Damping matrix" - -typedef ^ ParameterType ReKi Stff {:}{:} - - "Stiffness matrix" - -typedef ^ ParameterType ReKi Forces {:}{:} - - "Prescribed reduced loads, the 3 platform forces (in N) and moments (Nm) acting at the platform reference, associated with everything but the added-mass effects; positive forces are in the direction of motion." "N, N-m" -typedef ^ ^ ReKi times {:} - - "the time associated with each row of Forces" "s" -typedef ^ ^ ReKi AMat {:}{:} - - "State matrix A" "" -typedef ^ ^ ReKi BMat {:}{:} - - "State matrix B" "" -typedef ^ ^ ReKi CMat {:}{:} - - "State matrix C" "" -typedef ^ ^ ReKi DMat {:}{:} - - "State matrix D" "" -typedef ^ ^ ReKi FX {:} - - "State constant Fx" "" -typedef ^ ^ ReKi FY {:} - - "Output constant Fy" "" +typedef ^ ParameterType Logical hasRBMode - - - "True: has rigid-body modes/floating structure; False: no rigid-body modes" +typedef ^ ^ IntKi RBMod - - - "Method for handling rigid-body modes" - +typedef ^ ^ ReKi Mass {:}{:} - - "Mass matrix" "kg, kg-m, kg-m^2" +typedef ^ ^ ReKi Damp {:}{:} - - "Damping matrix" - +typedef ^ ^ ReKi Stff {:}{:} - - "Stiffness matrix" - +typedef ^ ^ ReKi W0 {:} - - "Prescribed constant external loads including selfweight" - +typedef ^ ^ ReKi WStff {:}{:} - - "Self-weight stiffness matrix" - +typedef ^ ^ ReKi A1Mat {:}{:} - - "State matrix A1" "" +typedef ^ ^ ReKi A2Mat {:}{:} - - "State matrix A2" "" +typedef ^ ^ ReKi B1Mat {:}{:} - - "State matrix B1" "" +typedef ^ ^ ReKi B2Mat {:}{:} - - "State matrix B2" "" +typedef ^ ^ ReKi B3Mat {:}{:} - - "State matrix B3" "" +typedef ^ ^ ReKi B4Mat {:}{:} - - "State matrix B4" "" +typedef ^ ^ ReKi C1Mat {:}{:} - - "State matrix C1" "" +typedef ^ ^ ReKi C2Mat {:}{:} - - "State matrix C2" "" +typedef ^ ^ ReKi D1Mat {:}{:} - - "State matrix D1" "" +typedef ^ ^ ReKi D2Mat {:}{:} - - "State matrix D2" "" +typedef ^ ^ ReKi D3Mat {:}{:} - - "State matrix D3" "" +typedef ^ ^ ReKi D4Mat {:}{:} - - "State matrix D4" "" typedef ^ ^ ReKi M11 {:}{:} - - "Matrix M11" "" typedef ^ ^ ReKi M12 {:}{:} - - "Matrix M12" "" -typedef ^ ^ ReKi M22 {:}{:} - - "Matrix M22" "" typedef ^ ^ ReKi M21 {:}{:} - - "Matrix M21" "" +typedef ^ ^ ReKi M22 {:}{:} - - "Matrix M22" "" +typedef ^ ^ ReKi M22Inv {:}{:} - - "Inverse of matrix M22" "" typedef ^ ^ ReKi K11 {:}{:} - - "Matrix K11" "" +typedef ^ ^ ReKi K12 {:}{:} - - "Matrix K12" "" +typedef ^ ^ ReKi K21 {:}{:} - - "Matrix K21" "" typedef ^ ^ ReKi K22 {:}{:} - - "Matrix K22" "" typedef ^ ^ ReKi C11 {:}{:} - - "Matrix C11" "" typedef ^ ^ ReKi C12 {:}{:} - - "Matrix C12" "" typedef ^ ^ ReKi C22 {:}{:} - - "Matrix C22" "" typedef ^ ^ ReKi C21 {:}{:} - - "Matrix C21" "" +typedef ^ ^ ReKi phiConn {:}{:} - - "Mode shapes of connection points" "" +typedef ^ ^ ReKi PosConn {:}{:} - - "Positions of connection points" "m" +typedef ^ ^ ReKi RBMass - - - "Rigid-body mass" "kg" +typedef ^ ^ ReKi RBCoG {3} - - "Rigid-body center of mass" "m" +typedef ^ ^ ReKi RBInertia {3}{3} - - "Rigid-body moment of inertia matrix" "kgm^2" typedef ^ ^ DbKi EP_DeltaT - - - "Time step (for integration of continuous states)" "seconds" -typedef ^ ^ IntKi nTimeSteps - - - "Number of values of Forces and times" - typedef ^ ^ IntKi nCB - - - "Number of CraigBampton modes active" - -typedef ^ ^ IntKi nCBFull - - - "Totla number of CraigBampton modes given as input" - +typedef ^ ^ IntKi nCBFull - - - "Total number of CraigBampton modes given as input" - typedef ^ ^ IntKi nTot - - - "Total number of debrees of freedom (CB + interface)" - +typedef ^ ^ IntKi nConn - - - "Number of connection points on the structure" - typedef ^ ^ IntKi NumOuts - - - "Number of values in WriteOutput" - typedef ^ ^ IntKi IntMethod - - - "Integration Method (1=RK4, 2=AB4, 3=ABM4)" - typedef ^ ^ IntKi ActiveCBDOF {:} - - "List of active CB DOF" - +typedef ^ ^ UserForcingType UsrModeF - - - "User-defined modal forcing time series" - +typedef ^ ^ UserForcingType UsrConnF - - - "User-defined connection forcing time series" - typedef ^ ^ OutParmType OutParam {:} - - "Names and units (and other characteristics) of all requested output parameters" - typedef ^ ^ IntKi OutParamLinIndx {:}{:} - - "Index into WriteOutput for linearization analysis" - # ..... Inputs .................................................................................................................... -typedef ^ InputType MeshType PtfmMesh - - - "Displacements at the platform reference point" - +typedef ^ InputType MeshType PtfmMesh - - - "Displacements at the platform reference point" - +typedef ^ ^ MeshType ConnLdMesh - - - "Load mesh for connection points on the structure" - +typedef ^ ^ MeshType FBMesh - - - "Load mesh for rigid-body DOF" - +typedef ^ ^ ReKi Fm {:} - - "External forcing to the internal elastic modes" - # ..... Outputs ................................................................................................................... typedef ^ OutputType MeshType PtfmMesh - - - "Loads at the platform reference point" - +typedef ^ ^ MeshType ConnMesh - - - "Motion mesh for connection points on the structure" - +typedef ^ ^ MeshType FBMesh - - - "Motion mesh for rigid-body DOF" - +typedef ^ ^ ReKi qm {:} - - "Displacement of internal elastic modes" - +typedef ^ ^ ReKi qmdot {:} - - "Velocity of internal elastic modes" - +typedef ^ ^ ReKi qmdotdot {:} - - "Acceleration of internal elastic modes" - typedef ^ ^ ReKi WriteOutput {:} - - "Example of data to be written to an output file" "s,-" +# ..... Misc/Optimization variables................................................................................................. +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef ^ MiscVarType ReKi xFlat {:} - - "Flattened vector of states" +typedef ^ ^ R8Ki uFlat {18} - - "Flattened vector of inputs" +typedef ^ ^ ReKi F_at_t {:} - - "The 6 interface loads and Craig-Bampton loads at t (force and moment acting at the platform reference (no added-mass effects); positive forces are in the direction of motion)." "N, N-m" +typedef ^ ^ ReKi FConn_at_t {:} - - "The 3DOF forces at each connection point defined by the user" "N" +typedef ^ ^ ReKi F1 {:} - - "Interface/rigid-body mode forcing" - +typedef ^ ^ ReKi F2 {:} - - "Internal elastic mode forcing" - +typedef ^ ^ ReKi Weight {:} - - "Structure self-weight" - +typedef ^ ^ ReKi FConn {:} - - "Connection forces" "N" +typedef ^ ^ ReKi FConnCB {:} - - "Modal forces from connections" "" +typedef ^ ^ ReKi DConn {:} - - "Connection point displacement" "" +typedef ^ ^ ReKi VConn {:} - - "Connection point velocity" "" +typedef ^ ^ ReKi AConn {:} - - "Connection point acceleration" "" +typedef ^ ^ IntKi Indx_UsrModeF - - - "Index into times, to speed up interpolation" - +typedef ^ ^ IntKi Indx_UsrConnF - - - "Index into times, to speed up interpolation" - +typedef ^ ^ LOGICAL EquilStart - - - "Flag to determine the equilibrium position of the CB DOF at initialization (first call)" - +typedef ^ ^ ReKi AllOuts {:} - - "An array holding the value of all of the calculated (not only selected) output channels" "see OutListParameters.xlsx spreadsheet" +typedef ^ ^ ModJacType Jac - - - "Data structure for calculating module Jacobians" - +typedef ^ ^ ExtPtfm_ContinuousStateType x_perturb - - - "" - +typedef ^ ^ ExtPtfm_ContinuousStateType dxdt_lin - - - "continuous state derivatives" - +typedef ^ ^ ExtPtfm_InputType u_perturb - - - "" - +typedef ^ ^ ExtPtfm_OutputType y_lin - - - "" - diff --git a/modules/extptfm/src/ExtPtfm_MCKF_Types.f90 b/modules/extptfm/src/ExtPtfm_MCKF_Types.f90 index 40c63127cb..92e7708c21 100644 --- a/modules/extptfm/src/ExtPtfm_MCKF_Types.f90 +++ b/modules/extptfm/src/ExtPtfm_MCKF_Types.f90 @@ -33,11 +33,20 @@ MODULE ExtPtfm_MCKF_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE +! ========= UserForcingType ======= + TYPE, PUBLIC :: UserForcingType + INTEGER(IntKi) :: nTimeSteps = 0_IntKi !< Number of values of Forces and times [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: times !< the time associated with each row of Forces [s] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Forces !< Prescribed reduced loads, the 3 platform forces (in N) and moments (Nm) acting at the platform reference, associated with everything but the added-mass effects; positive forces are in the direction of motion. [N, N-m] + END TYPE UserForcingType +! ======================= ! ========= ExtPtfm_InitInputType ======= TYPE, PUBLIC :: ExtPtfm_InitInputType CHARACTER(1024) :: InputFile !< Name of the input file; remove if there is no file [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] - REAL(ReKi) :: PtfmRefzt = 0.0_ReKi !< Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point [meters] + REAL(ReKi) :: PtfmRefxt = 0.0_ReKi !< Longitudinal distance from PRP to the platform reference point [m] + REAL(ReKi) :: PtfmRefyt = 0.0_ReKi !< Laterl distance from PRP to the platform reference point [m] + REAL(ReKi) :: PtfmRefzt = 0.0_ReKi !< Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point [m] CHARACTER(1024) :: RootName !< RootName for writing output files [-] END TYPE ExtPtfm_InitInputType ! ======================= @@ -45,13 +54,20 @@ MODULE ExtPtfm_MCKF_Types TYPE, PUBLIC :: ExtPtfm_InputFile REAL(DbKi) :: DT = 0.0_R8Ki !< Requested integration time for ElastoDyn [seconds] INTEGER(IntKi) :: IntMethod = 0_IntKi !< Integration Method (1=RK4, 2=AB4, 3=ABM4) [-] - INTEGER(IntKi) :: FileFormat = 0_IntKi !< File format switch [-] + INTEGER(IntKi) :: RBMod = 0_IntKi !< Method for handling rigid-body modes [-] + LOGICAL :: HasRBMode = .false. !< True: has rigid-body modes/floating structure; False: no rigid-body modes [-] CHARACTER(1024) :: RedFile !< File containing reduction inputs [-] CHARACTER(1024) :: RedFileCst !< File containing constant reduction inputs [-] LOGICAL :: EquilStart = .false. !< Flag to determine the equilibrium positions of the CB modes at initialization (first call) [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: ActiveCBDOF !< List of active CB DOF [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: InitPosList !< Initial positions of the CB DOFs [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: InitVelList !< Initial velocities of the CB DOFs [-] + LOGICAL :: HasConnections = .false. !< True: has connections; False: no connections [-] + CHARACTER(1024) :: ConnFile !< File containing connection inputs [-] + LOGICAL :: HasUserForcing = .false. !< True: has user forcing; False: no user forcing [-] + CHARACTER(1024) :: ForceFile !< File containing user forcing inputs [-] + LOGICAL :: HasConnForcing = .false. !< True: has user forcing; False: no user forcing [-] + CHARACTER(1024) :: FConnFile !< File containing user forcing inputs [-] LOGICAL :: SumPrint = .false. !< Print summary data to .sum [-] INTEGER(IntKi) :: OutFile = 0_IntKi !< Switch to determine where output will be placed: (1: in module output file only; 2: in glue code output file only; 3: both) [-] LOGICAL :: TabDelim = .false. !< Flag to cause tab-delimited text output (delimited by space otherwise) [-] @@ -66,14 +82,7 @@ MODULE ExtPtfm_MCKF_Types TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_x !< Names of the continuous states used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_y !< Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_x !< Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_u !< Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: DerivOrder_x !< Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization [-] + TYPE(ModVarsType) :: Vars !< Module variables [-] END TYPE ExtPtfm_InitOutputType ! ======================= ! ========= ExtPtfm_ContinuousStateType ======= @@ -98,47 +107,55 @@ MODULE ExtPtfm_MCKF_Types INTEGER(IntKi) :: n = 0_IntKi !< Tracks time step for which OtherState was updated last [-] END TYPE ExtPtfm_OtherStateType ! ======================= -! ========= ExtPtfm_MiscVarType ======= - TYPE, PUBLIC :: ExtPtfm_MiscVarType - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: xFlat !< Flattened vector of states [-] - REAL(ReKi) , DIMENSION(1:18) :: uFlat = 0.0_ReKi !< Flattened vector of inputs [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_at_t !< The 6 interface loads and Craig-Bampton loads at t (force and moment acting at the platform reference (no added-mass effects); positive forces are in the direction of motion). [N, N-m] - INTEGER(IntKi) :: Indx = 0_IntKi !< Index into times, to speed up interpolation [-] - LOGICAL :: EquilStart = .false. !< Flag to determine the equilibrium position of the CB DOF at initialization (first call) [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AllOuts !< An array holding the value of all of the calculated (not only selected) output channels [see OutListParameters.xlsx spreadsheet] - END TYPE ExtPtfm_MiscVarType -! ======================= ! ========= ExtPtfm_ParameterType ======= TYPE, PUBLIC :: ExtPtfm_ParameterType + LOGICAL :: hasRBMode = .false. !< True: has rigid-body modes/floating structure; False: no rigid-body modes [-] + INTEGER(IntKi) :: RBMod = 0_IntKi !< Method for handling rigid-body modes [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Mass !< Mass matrix [kg, kg-m, kg-m^2] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Damp !< Damping matrix [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Stff !< Stiffness matrix [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Forces !< Prescribed reduced loads, the 3 platform forces (in N) and moments (Nm) acting at the platform reference, associated with everything but the added-mass effects; positive forces are in the direction of motion. [N, N-m] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: times !< the time associated with each row of Forces [s] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: AMat !< State matrix A [] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BMat !< State matrix B [] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: CMat !< State matrix C [] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DMat !< State matrix D [] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FX !< State constant Fx [] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FY !< Output constant Fy [] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: W0 !< Prescribed constant external loads including selfweight [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: WStff !< Self-weight stiffness matrix [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: A1Mat !< State matrix A1 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: A2Mat !< State matrix A2 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: B1Mat !< State matrix B1 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: B2Mat !< State matrix B2 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: B3Mat !< State matrix B3 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: B4Mat !< State matrix B4 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: C1Mat !< State matrix C1 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: C2Mat !< State matrix C2 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: D1Mat !< State matrix D1 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: D2Mat !< State matrix D2 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: D3Mat !< State matrix D3 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: D4Mat !< State matrix D4 [] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: M11 !< Matrix M11 [] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: M12 !< Matrix M12 [] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: M22 !< Matrix M22 [] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: M21 !< Matrix M21 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: M22 !< Matrix M22 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: M22Inv !< Inverse of matrix M22 [] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: K11 !< Matrix K11 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: K12 !< Matrix K12 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: K21 !< Matrix K21 [] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: K22 !< Matrix K22 [] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: C11 !< Matrix C11 [] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: C12 !< Matrix C12 [] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: C22 !< Matrix C22 [] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: C21 !< Matrix C21 [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: phiConn !< Mode shapes of connection points [] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PosConn !< Positions of connection points [m] + REAL(ReKi) :: RBMass = 0.0_ReKi !< Rigid-body mass [kg] + REAL(ReKi) , DIMENSION(1:3) :: RBCoG = 0.0_ReKi !< Rigid-body center of mass [m] + REAL(ReKi) , DIMENSION(1:3,1:3) :: RBInertia = 0.0_ReKi !< Rigid-body moment of inertia matrix [kgm^2] REAL(DbKi) :: EP_DeltaT = 0.0_R8Ki !< Time step (for integration of continuous states) [seconds] - INTEGER(IntKi) :: nTimeSteps = 0_IntKi !< Number of values of Forces and times [-] INTEGER(IntKi) :: nCB = 0_IntKi !< Number of CraigBampton modes active [-] - INTEGER(IntKi) :: nCBFull = 0_IntKi !< Totla number of CraigBampton modes given as input [-] + INTEGER(IntKi) :: nCBFull = 0_IntKi !< Total number of CraigBampton modes given as input [-] INTEGER(IntKi) :: nTot = 0_IntKi !< Total number of debrees of freedom (CB + interface) [-] + INTEGER(IntKi) :: nConn = 0_IntKi !< Number of connection points on the structure [-] INTEGER(IntKi) :: NumOuts = 0_IntKi !< Number of values in WriteOutput [-] INTEGER(IntKi) :: IntMethod = 0_IntKi !< Integration Method (1=RK4, 2=AB4, 3=ABM4) [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: ActiveCBDOF !< List of active CB DOF [-] + TYPE(UserForcingType) :: UsrModeF !< User-defined modal forcing time series [-] + TYPE(UserForcingType) :: UsrConnF !< User-defined connection forcing time series [-] TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: OutParam !< Names and units (and other characteristics) of all requested output parameters [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: OutParamLinIndx !< Index into WriteOutput for linearization analysis [-] END TYPE ExtPtfm_ParameterType @@ -146,15 +163,139 @@ MODULE ExtPtfm_MCKF_Types ! ========= ExtPtfm_InputType ======= TYPE, PUBLIC :: ExtPtfm_InputType TYPE(MeshType) :: PtfmMesh !< Displacements at the platform reference point [-] + TYPE(MeshType) :: ConnLdMesh !< Load mesh for connection points on the structure [-] + TYPE(MeshType) :: FBMesh !< Load mesh for rigid-body DOF [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Fm !< External forcing to the internal elastic modes [-] END TYPE ExtPtfm_InputType ! ======================= ! ========= ExtPtfm_OutputType ======= TYPE, PUBLIC :: ExtPtfm_OutputType TYPE(MeshType) :: PtfmMesh !< Loads at the platform reference point [-] + TYPE(MeshType) :: ConnMesh !< Motion mesh for connection points on the structure [-] + TYPE(MeshType) :: FBMesh !< Motion mesh for rigid-body DOF [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qm !< Displacement of internal elastic modes [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qmdot !< Velocity of internal elastic modes [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qmdotdot !< Acceleration of internal elastic modes [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Example of data to be written to an output file [s,-] END TYPE ExtPtfm_OutputType ! ======================= -CONTAINS +! ========= ExtPtfm_MiscVarType ======= + TYPE, PUBLIC :: ExtPtfm_MiscVarType + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: xFlat !< Flattened vector of states [-] + REAL(R8Ki) , DIMENSION(1:18) :: uFlat = 0.0_R8Ki !< Flattened vector of inputs [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_at_t !< The 6 interface loads and Craig-Bampton loads at t (force and moment acting at the platform reference (no added-mass effects); positive forces are in the direction of motion). [N, N-m] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FConn_at_t !< The 3DOF forces at each connection point defined by the user [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F1 !< Interface/rigid-body mode forcing [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F2 !< Internal elastic mode forcing [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Weight !< Structure self-weight [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FConn !< Connection forces [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FConnCB !< Modal forces from connections [] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: DConn !< Connection point displacement [] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: VConn !< Connection point velocity [] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AConn !< Connection point acceleration [] + INTEGER(IntKi) :: Indx_UsrModeF = 0_IntKi !< Index into times, to speed up interpolation [-] + INTEGER(IntKi) :: Indx_UsrConnF = 0_IntKi !< Index into times, to speed up interpolation [-] + LOGICAL :: EquilStart = .false. !< Flag to determine the equilibrium position of the CB DOF at initialization (first call) [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AllOuts !< An array holding the value of all of the calculated (not only selected) output channels [see OutListParameters.xlsx spreadsheet] + TYPE(ModJacType) :: Jac !< Data structure for calculating module Jacobians [-] + TYPE(ExtPtfm_ContinuousStateType) :: x_perturb !< [-] + TYPE(ExtPtfm_ContinuousStateType) :: dxdt_lin !< continuous state derivatives [-] + TYPE(ExtPtfm_InputType) :: u_perturb !< [-] + TYPE(ExtPtfm_OutputType) :: y_lin !< [-] + END TYPE ExtPtfm_MiscVarType +! ======================= + integer(IntKi), public, parameter :: ExtPtfm_x_qm = 1 ! ExtPtfm%qm + integer(IntKi), public, parameter :: ExtPtfm_x_qmdot = 2 ! ExtPtfm%qmdot + integer(IntKi), public, parameter :: ExtPtfm_u_PtfmMesh = 3 ! ExtPtfm%PtfmMesh + integer(IntKi), public, parameter :: ExtPtfm_u_ConnLdMesh = 4 ! ExtPtfm%ConnLdMesh + integer(IntKi), public, parameter :: ExtPtfm_u_FBMesh = 5 ! ExtPtfm%FBMesh + integer(IntKi), public, parameter :: ExtPtfm_u_Fm = 6 ! ExtPtfm%Fm + integer(IntKi), public, parameter :: ExtPtfm_y_PtfmMesh = 7 ! ExtPtfm%PtfmMesh + integer(IntKi), public, parameter :: ExtPtfm_y_ConnMesh = 8 ! ExtPtfm%ConnMesh + integer(IntKi), public, parameter :: ExtPtfm_y_FBMesh = 9 ! ExtPtfm%FBMesh + integer(IntKi), public, parameter :: ExtPtfm_y_qm = 10 ! ExtPtfm%qm + integer(IntKi), public, parameter :: ExtPtfm_y_qmdot = 11 ! ExtPtfm%qmdot + integer(IntKi), public, parameter :: ExtPtfm_y_qmdotdot = 12 ! ExtPtfm%qmdotdot + integer(IntKi), public, parameter :: ExtPtfm_y_WriteOutput = 13 ! ExtPtfm%WriteOutput + +contains + +subroutine ExtPtfm_CopyUserForcingType(SrcUserForcingTypeData, DstUserForcingTypeData, CtrlCode, ErrStat, ErrMsg) + type(UserForcingType), intent(in) :: SrcUserForcingTypeData + type(UserForcingType), intent(inout) :: DstUserForcingTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'ExtPtfm_CopyUserForcingType' + ErrStat = ErrID_None + ErrMsg = '' + DstUserForcingTypeData%nTimeSteps = SrcUserForcingTypeData%nTimeSteps + if (allocated(SrcUserForcingTypeData%times)) then + LB(1:1) = lbound(SrcUserForcingTypeData%times) + UB(1:1) = ubound(SrcUserForcingTypeData%times) + if (.not. allocated(DstUserForcingTypeData%times)) then + allocate(DstUserForcingTypeData%times(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstUserForcingTypeData%times.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstUserForcingTypeData%times = SrcUserForcingTypeData%times + end if + if (allocated(SrcUserForcingTypeData%Forces)) then + LB(1:2) = lbound(SrcUserForcingTypeData%Forces) + UB(1:2) = ubound(SrcUserForcingTypeData%Forces) + if (.not. allocated(DstUserForcingTypeData%Forces)) then + allocate(DstUserForcingTypeData%Forces(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstUserForcingTypeData%Forces.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstUserForcingTypeData%Forces = SrcUserForcingTypeData%Forces + end if +end subroutine + +subroutine ExtPtfm_DestroyUserForcingType(UserForcingTypeData, ErrStat, ErrMsg) + type(UserForcingType), intent(inout) :: UserForcingTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'ExtPtfm_DestroyUserForcingType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(UserForcingTypeData%times)) then + deallocate(UserForcingTypeData%times) + end if + if (allocated(UserForcingTypeData%Forces)) then + deallocate(UserForcingTypeData%Forces) + end if +end subroutine + +subroutine ExtPtfm_PackUserForcingType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(UserForcingType), intent(in) :: InData + character(*), parameter :: RoutineName = 'ExtPtfm_PackUserForcingType' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%nTimeSteps) + call RegPackAlloc(RF, InData%times) + call RegPackAlloc(RF, InData%Forces) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine ExtPtfm_UnPackUserForcingType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(UserForcingType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'ExtPtfm_UnPackUserForcingType' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%nTimeSteps); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%times); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Forces); if (RegCheckErr(RF, RoutineName)) return +end subroutine subroutine ExtPtfm_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(ExtPtfm_InitInputType), intent(in) :: SrcInitInputData @@ -167,6 +308,8 @@ subroutine ExtPtfm_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, E ErrMsg = '' DstInitInputData%InputFile = SrcInitInputData%InputFile DstInitInputData%Linearize = SrcInitInputData%Linearize + DstInitInputData%PtfmRefxt = SrcInitInputData%PtfmRefxt + DstInitInputData%PtfmRefyt = SrcInitInputData%PtfmRefyt DstInitInputData%PtfmRefzt = SrcInitInputData%PtfmRefzt DstInitInputData%RootName = SrcInitInputData%RootName end subroutine @@ -187,6 +330,8 @@ subroutine ExtPtfm_PackInitInput(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%InputFile) call RegPack(RF, InData%Linearize) + call RegPack(RF, InData%PtfmRefxt) + call RegPack(RF, InData%PtfmRefyt) call RegPack(RF, InData%PtfmRefzt) call RegPack(RF, InData%RootName) if (RegCheckErr(RF, RoutineName)) return @@ -199,6 +344,8 @@ subroutine ExtPtfm_UnPackInitInput(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%InputFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmRefxt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmRefyt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmRefzt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -216,7 +363,8 @@ subroutine ExtPtfm_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, E ErrMsg = '' DstInputFileData%DT = SrcInputFileData%DT DstInputFileData%IntMethod = SrcInputFileData%IntMethod - DstInputFileData%FileFormat = SrcInputFileData%FileFormat + DstInputFileData%RBMod = SrcInputFileData%RBMod + DstInputFileData%HasRBMode = SrcInputFileData%HasRBMode DstInputFileData%RedFile = SrcInputFileData%RedFile DstInputFileData%RedFileCst = SrcInputFileData%RedFileCst DstInputFileData%EquilStart = SrcInputFileData%EquilStart @@ -256,6 +404,12 @@ subroutine ExtPtfm_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, E end if DstInputFileData%InitVelList = SrcInputFileData%InitVelList end if + DstInputFileData%HasConnections = SrcInputFileData%HasConnections + DstInputFileData%ConnFile = SrcInputFileData%ConnFile + DstInputFileData%HasUserForcing = SrcInputFileData%HasUserForcing + DstInputFileData%ForceFile = SrcInputFileData%ForceFile + DstInputFileData%HasConnForcing = SrcInputFileData%HasConnForcing + DstInputFileData%FConnFile = SrcInputFileData%FConnFile DstInputFileData%SumPrint = SrcInputFileData%SumPrint DstInputFileData%OutFile = SrcInputFileData%OutFile DstInputFileData%TabDelim = SrcInputFileData%TabDelim @@ -304,13 +458,20 @@ subroutine ExtPtfm_PackInputFile(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%DT) call RegPack(RF, InData%IntMethod) - call RegPack(RF, InData%FileFormat) + call RegPack(RF, InData%RBMod) + call RegPack(RF, InData%HasRBMode) call RegPack(RF, InData%RedFile) call RegPack(RF, InData%RedFileCst) call RegPack(RF, InData%EquilStart) call RegPackAlloc(RF, InData%ActiveCBDOF) call RegPackAlloc(RF, InData%InitPosList) call RegPackAlloc(RF, InData%InitVelList) + call RegPack(RF, InData%HasConnections) + call RegPack(RF, InData%ConnFile) + call RegPack(RF, InData%HasUserForcing) + call RegPack(RF, InData%ForceFile) + call RegPack(RF, InData%HasConnForcing) + call RegPack(RF, InData%FConnFile) call RegPack(RF, InData%SumPrint) call RegPack(RF, InData%OutFile) call RegPack(RF, InData%TabDelim) @@ -331,13 +492,20 @@ subroutine ExtPtfm_UnPackInputFile(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%IntMethod); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%FileFormat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RBMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HasRBMode); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RedFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RedFileCst); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%EquilStart); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%ActiveCBDOF); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%InitPosList); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%InitVelList); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HasConnections); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ConnFile); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HasUserForcing); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ForceFile); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HasConnForcing); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%FConnFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SumPrint); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%OutFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TabDelim); if (RegCheckErr(RF, RoutineName)) return @@ -386,102 +554,9 @@ subroutine ExtPtfm_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode end if DstInitOutputData%WriteOutputUnt = SrcInitOutputData%WriteOutputUnt end if - if (allocated(SrcInitOutputData%LinNames_y)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_y) - UB(1:1) = ubound(SrcInitOutputData%LinNames_y) - if (.not. allocated(DstInitOutputData%LinNames_y)) then - allocate(DstInitOutputData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_y = SrcInitOutputData%LinNames_y - end if - if (allocated(SrcInitOutputData%LinNames_x)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_x) - UB(1:1) = ubound(SrcInitOutputData%LinNames_x) - if (.not. allocated(DstInitOutputData%LinNames_x)) then - allocate(DstInitOutputData%LinNames_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_x = SrcInitOutputData%LinNames_x - end if - if (allocated(SrcInitOutputData%LinNames_u)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_u) - UB(1:1) = ubound(SrcInitOutputData%LinNames_u) - if (.not. allocated(DstInitOutputData%LinNames_u)) then - allocate(DstInitOutputData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_u = SrcInitOutputData%LinNames_u - end if - if (allocated(SrcInitOutputData%RotFrame_y)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_y) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_y) - if (.not. allocated(DstInitOutputData%RotFrame_y)) then - allocate(DstInitOutputData%RotFrame_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_y = SrcInitOutputData%RotFrame_y - end if - if (allocated(SrcInitOutputData%RotFrame_x)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_x) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_x) - if (.not. allocated(DstInitOutputData%RotFrame_x)) then - allocate(DstInitOutputData%RotFrame_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_x = SrcInitOutputData%RotFrame_x - end if - if (allocated(SrcInitOutputData%RotFrame_u)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_u) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_u) - if (.not. allocated(DstInitOutputData%RotFrame_u)) then - allocate(DstInitOutputData%RotFrame_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_u = SrcInitOutputData%RotFrame_u - end if - if (allocated(SrcInitOutputData%IsLoad_u)) then - LB(1:1) = lbound(SrcInitOutputData%IsLoad_u) - UB(1:1) = ubound(SrcInitOutputData%IsLoad_u) - if (.not. allocated(DstInitOutputData%IsLoad_u)) then - allocate(DstInitOutputData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%IsLoad_u = SrcInitOutputData%IsLoad_u - end if - if (allocated(SrcInitOutputData%DerivOrder_x)) then - LB(1:1) = lbound(SrcInitOutputData%DerivOrder_x) - UB(1:1) = ubound(SrcInitOutputData%DerivOrder_x) - if (.not. allocated(DstInitOutputData%DerivOrder_x)) then - allocate(DstInitOutputData%DerivOrder_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%DerivOrder_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%DerivOrder_x = SrcInitOutputData%DerivOrder_x - end if + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine ExtPtfm_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -501,30 +576,8 @@ subroutine ExtPtfm_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) if (allocated(InitOutputData%WriteOutputUnt)) then deallocate(InitOutputData%WriteOutputUnt) end if - if (allocated(InitOutputData%LinNames_y)) then - deallocate(InitOutputData%LinNames_y) - end if - if (allocated(InitOutputData%LinNames_x)) then - deallocate(InitOutputData%LinNames_x) - end if - if (allocated(InitOutputData%LinNames_u)) then - deallocate(InitOutputData%LinNames_u) - end if - if (allocated(InitOutputData%RotFrame_y)) then - deallocate(InitOutputData%RotFrame_y) - end if - if (allocated(InitOutputData%RotFrame_x)) then - deallocate(InitOutputData%RotFrame_x) - end if - if (allocated(InitOutputData%RotFrame_u)) then - deallocate(InitOutputData%RotFrame_u) - end if - if (allocated(InitOutputData%IsLoad_u)) then - deallocate(InitOutputData%IsLoad_u) - end if - if (allocated(InitOutputData%DerivOrder_x)) then - deallocate(InitOutputData%DerivOrder_x) - end if + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine ExtPtfm_PackInitOutput(RF, Indata) @@ -535,14 +588,7 @@ subroutine ExtPtfm_PackInitOutput(RF, Indata) call NWTC_Library_PackProgDesc(RF, InData%Ver) call RegPackAlloc(RF, InData%WriteOutputHdr) call RegPackAlloc(RF, InData%WriteOutputUnt) - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_x) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%RotFrame_y) - call RegPackAlloc(RF, InData%RotFrame_x) - call RegPackAlloc(RF, InData%RotFrame_u) - call RegPackAlloc(RF, InData%IsLoad_u) - call RegPackAlloc(RF, InData%DerivOrder_x) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -557,14 +603,7 @@ subroutine ExtPtfm_UnPackInitOutput(RF, OutData) call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DerivOrder_x); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine ExtPtfm_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg) @@ -816,106 +855,6 @@ subroutine ExtPtfm_UnPackOtherState(RF, OutData) call RegUnpack(RF, OutData%n); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine ExtPtfm_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(ExtPtfm_MiscVarType), intent(in) :: SrcMiscData - type(ExtPtfm_MiscVarType), intent(inout) :: DstMiscData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(*), parameter :: RoutineName = 'ExtPtfm_CopyMisc' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcMiscData%xFlat)) then - LB(1:1) = lbound(SrcMiscData%xFlat) - UB(1:1) = ubound(SrcMiscData%xFlat) - if (.not. allocated(DstMiscData%xFlat)) then - allocate(DstMiscData%xFlat(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%xFlat.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%xFlat = SrcMiscData%xFlat - end if - DstMiscData%uFlat = SrcMiscData%uFlat - if (allocated(SrcMiscData%F_at_t)) then - LB(1:1) = lbound(SrcMiscData%F_at_t) - UB(1:1) = ubound(SrcMiscData%F_at_t) - if (.not. allocated(DstMiscData%F_at_t)) then - allocate(DstMiscData%F_at_t(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_at_t.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%F_at_t = SrcMiscData%F_at_t - end if - DstMiscData%Indx = SrcMiscData%Indx - DstMiscData%EquilStart = SrcMiscData%EquilStart - if (allocated(SrcMiscData%AllOuts)) then - LB(1:1) = lbound(SrcMiscData%AllOuts) - UB(1:1) = ubound(SrcMiscData%AllOuts) - if (.not. allocated(DstMiscData%AllOuts)) then - allocate(DstMiscData%AllOuts(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AllOuts.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%AllOuts = SrcMiscData%AllOuts - end if -end subroutine - -subroutine ExtPtfm_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(ExtPtfm_MiscVarType), intent(inout) :: MiscData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'ExtPtfm_DestroyMisc' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(MiscData%xFlat)) then - deallocate(MiscData%xFlat) - end if - if (allocated(MiscData%F_at_t)) then - deallocate(MiscData%F_at_t) - end if - if (allocated(MiscData%AllOuts)) then - deallocate(MiscData%AllOuts) - end if -end subroutine - -subroutine ExtPtfm_PackMisc(RF, Indata) - type(RegFile), intent(inout) :: RF - type(ExtPtfm_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'ExtPtfm_PackMisc' - if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%xFlat) - call RegPack(RF, InData%uFlat) - call RegPackAlloc(RF, InData%F_at_t) - call RegPack(RF, InData%Indx) - call RegPack(RF, InData%EquilStart) - call RegPackAlloc(RF, InData%AllOuts) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine ExtPtfm_UnPackMisc(RF, OutData) - type(RegFile), intent(inout) :: RF - type(ExtPtfm_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'ExtPtfm_UnPackMisc' - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%xFlat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%uFlat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%F_at_t); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Indx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%EquilStart); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AllOuts); if (RegCheckErr(RF, RoutineName)) return -end subroutine - subroutine ExtPtfm_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) type(ExtPtfm_ParameterType), intent(in) :: SrcParamData type(ExtPtfm_ParameterType), intent(inout) :: DstParamData @@ -929,6 +868,8 @@ subroutine ExtPtfm_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM character(*), parameter :: RoutineName = 'ExtPtfm_CopyParam' ErrStat = ErrID_None ErrMsg = '' + DstParamData%hasRBMode = SrcParamData%hasRBMode + DstParamData%RBMod = SrcParamData%RBMod if (allocated(SrcParamData%Mass)) then LB(1:2) = lbound(SrcParamData%Mass) UB(1:2) = ubound(SrcParamData%Mass) @@ -965,165 +906,273 @@ subroutine ExtPtfm_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM end if DstParamData%Stff = SrcParamData%Stff end if - if (allocated(SrcParamData%Forces)) then - LB(1:2) = lbound(SrcParamData%Forces) - UB(1:2) = ubound(SrcParamData%Forces) - if (.not. allocated(DstParamData%Forces)) then - allocate(DstParamData%Forces(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%W0)) then + LB(1:1) = lbound(SrcParamData%W0) + UB(1:1) = ubound(SrcParamData%W0) + if (.not. allocated(DstParamData%W0)) then + allocate(DstParamData%W0(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Forces.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%W0.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%Forces = SrcParamData%Forces + DstParamData%W0 = SrcParamData%W0 end if - if (allocated(SrcParamData%times)) then - LB(1:1) = lbound(SrcParamData%times) - UB(1:1) = ubound(SrcParamData%times) - if (.not. allocated(DstParamData%times)) then - allocate(DstParamData%times(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%WStff)) then + LB(1:2) = lbound(SrcParamData%WStff) + UB(1:2) = ubound(SrcParamData%WStff) + if (.not. allocated(DstParamData%WStff)) then + allocate(DstParamData%WStff(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%times.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WStff.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%times = SrcParamData%times + DstParamData%WStff = SrcParamData%WStff end if - if (allocated(SrcParamData%AMat)) then - LB(1:2) = lbound(SrcParamData%AMat) - UB(1:2) = ubound(SrcParamData%AMat) - if (.not. allocated(DstParamData%AMat)) then - allocate(DstParamData%AMat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%A1Mat)) then + LB(1:2) = lbound(SrcParamData%A1Mat) + UB(1:2) = ubound(SrcParamData%A1Mat) + if (.not. allocated(DstParamData%A1Mat)) then + allocate(DstParamData%A1Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AMat.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%A1Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%AMat = SrcParamData%AMat + DstParamData%A1Mat = SrcParamData%A1Mat end if - if (allocated(SrcParamData%BMat)) then - LB(1:2) = lbound(SrcParamData%BMat) - UB(1:2) = ubound(SrcParamData%BMat) - if (.not. allocated(DstParamData%BMat)) then - allocate(DstParamData%BMat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%A2Mat)) then + LB(1:2) = lbound(SrcParamData%A2Mat) + UB(1:2) = ubound(SrcParamData%A2Mat) + if (.not. allocated(DstParamData%A2Mat)) then + allocate(DstParamData%A2Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BMat.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%A2Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%BMat = SrcParamData%BMat + DstParamData%A2Mat = SrcParamData%A2Mat end if - if (allocated(SrcParamData%CMat)) then - LB(1:2) = lbound(SrcParamData%CMat) - UB(1:2) = ubound(SrcParamData%CMat) - if (.not. allocated(DstParamData%CMat)) then - allocate(DstParamData%CMat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%B1Mat)) then + LB(1:2) = lbound(SrcParamData%B1Mat) + UB(1:2) = ubound(SrcParamData%B1Mat) + if (.not. allocated(DstParamData%B1Mat)) then + allocate(DstParamData%B1Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMat.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%B1Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%CMat = SrcParamData%CMat + DstParamData%B1Mat = SrcParamData%B1Mat end if - if (allocated(SrcParamData%DMat)) then - LB(1:2) = lbound(SrcParamData%DMat) - UB(1:2) = ubound(SrcParamData%DMat) - if (.not. allocated(DstParamData%DMat)) then - allocate(DstParamData%DMat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%B2Mat)) then + LB(1:2) = lbound(SrcParamData%B2Mat) + UB(1:2) = ubound(SrcParamData%B2Mat) + if (.not. allocated(DstParamData%B2Mat)) then + allocate(DstParamData%B2Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DMat.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%B2Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%DMat = SrcParamData%DMat + DstParamData%B2Mat = SrcParamData%B2Mat end if - if (allocated(SrcParamData%FX)) then - LB(1:1) = lbound(SrcParamData%FX) - UB(1:1) = ubound(SrcParamData%FX) - if (.not. allocated(DstParamData%FX)) then - allocate(DstParamData%FX(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%B3Mat)) then + LB(1:2) = lbound(SrcParamData%B3Mat) + UB(1:2) = ubound(SrcParamData%B3Mat) + if (.not. allocated(DstParamData%B3Mat)) then + allocate(DstParamData%B3Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%FX.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%B3Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%FX = SrcParamData%FX + DstParamData%B3Mat = SrcParamData%B3Mat end if - if (allocated(SrcParamData%FY)) then - LB(1:1) = lbound(SrcParamData%FY) - UB(1:1) = ubound(SrcParamData%FY) - if (.not. allocated(DstParamData%FY)) then - allocate(DstParamData%FY(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%B4Mat)) then + LB(1:2) = lbound(SrcParamData%B4Mat) + UB(1:2) = ubound(SrcParamData%B4Mat) + if (.not. allocated(DstParamData%B4Mat)) then + allocate(DstParamData%B4Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%FY.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%B4Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%FY = SrcParamData%FY + DstParamData%B4Mat = SrcParamData%B4Mat end if - if (allocated(SrcParamData%M11)) then - LB(1:2) = lbound(SrcParamData%M11) - UB(1:2) = ubound(SrcParamData%M11) - if (.not. allocated(DstParamData%M11)) then - allocate(DstParamData%M11(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%C1Mat)) then + LB(1:2) = lbound(SrcParamData%C1Mat) + UB(1:2) = ubound(SrcParamData%C1Mat) + if (.not. allocated(DstParamData%C1Mat)) then + allocate(DstParamData%C1Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%M11.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C1Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%M11 = SrcParamData%M11 + DstParamData%C1Mat = SrcParamData%C1Mat end if - if (allocated(SrcParamData%M12)) then - LB(1:2) = lbound(SrcParamData%M12) - UB(1:2) = ubound(SrcParamData%M12) - if (.not. allocated(DstParamData%M12)) then - allocate(DstParamData%M12(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%C2Mat)) then + LB(1:2) = lbound(SrcParamData%C2Mat) + UB(1:2) = ubound(SrcParamData%C2Mat) + if (.not. allocated(DstParamData%C2Mat)) then + allocate(DstParamData%C2Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%M12.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C2Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%M12 = SrcParamData%M12 + DstParamData%C2Mat = SrcParamData%C2Mat end if - if (allocated(SrcParamData%M22)) then - LB(1:2) = lbound(SrcParamData%M22) - UB(1:2) = ubound(SrcParamData%M22) - if (.not. allocated(DstParamData%M22)) then - allocate(DstParamData%M22(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%D1Mat)) then + LB(1:2) = lbound(SrcParamData%D1Mat) + UB(1:2) = ubound(SrcParamData%D1Mat) + if (.not. allocated(DstParamData%D1Mat)) then + allocate(DstParamData%D1Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%M22.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D1Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%M22 = SrcParamData%M22 + DstParamData%D1Mat = SrcParamData%D1Mat end if - if (allocated(SrcParamData%M21)) then - LB(1:2) = lbound(SrcParamData%M21) - UB(1:2) = ubound(SrcParamData%M21) - if (.not. allocated(DstParamData%M21)) then - allocate(DstParamData%M21(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%D2Mat)) then + LB(1:2) = lbound(SrcParamData%D2Mat) + UB(1:2) = ubound(SrcParamData%D2Mat) + if (.not. allocated(DstParamData%D2Mat)) then + allocate(DstParamData%D2Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%M21.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D2Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%M21 = SrcParamData%M21 + DstParamData%D2Mat = SrcParamData%D2Mat end if - if (allocated(SrcParamData%K11)) then - LB(1:2) = lbound(SrcParamData%K11) - UB(1:2) = ubound(SrcParamData%K11) - if (.not. allocated(DstParamData%K11)) then - allocate(DstParamData%K11(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%D3Mat)) then + LB(1:2) = lbound(SrcParamData%D3Mat) + UB(1:2) = ubound(SrcParamData%D3Mat) + if (.not. allocated(DstParamData%D3Mat)) then + allocate(DstParamData%D3Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%K11.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D3Mat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%K11 = SrcParamData%K11 + DstParamData%D3Mat = SrcParamData%D3Mat end if - if (allocated(SrcParamData%K22)) then - LB(1:2) = lbound(SrcParamData%K22) - UB(1:2) = ubound(SrcParamData%K22) + if (allocated(SrcParamData%D4Mat)) then + LB(1:2) = lbound(SrcParamData%D4Mat) + UB(1:2) = ubound(SrcParamData%D4Mat) + if (.not. allocated(DstParamData%D4Mat)) then + allocate(DstParamData%D4Mat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D4Mat.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%D4Mat = SrcParamData%D4Mat + end if + if (allocated(SrcParamData%M11)) then + LB(1:2) = lbound(SrcParamData%M11) + UB(1:2) = ubound(SrcParamData%M11) + if (.not. allocated(DstParamData%M11)) then + allocate(DstParamData%M11(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%M11.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%M11 = SrcParamData%M11 + end if + if (allocated(SrcParamData%M12)) then + LB(1:2) = lbound(SrcParamData%M12) + UB(1:2) = ubound(SrcParamData%M12) + if (.not. allocated(DstParamData%M12)) then + allocate(DstParamData%M12(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%M12.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%M12 = SrcParamData%M12 + end if + if (allocated(SrcParamData%M21)) then + LB(1:2) = lbound(SrcParamData%M21) + UB(1:2) = ubound(SrcParamData%M21) + if (.not. allocated(DstParamData%M21)) then + allocate(DstParamData%M21(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%M21.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%M21 = SrcParamData%M21 + end if + if (allocated(SrcParamData%M22)) then + LB(1:2) = lbound(SrcParamData%M22) + UB(1:2) = ubound(SrcParamData%M22) + if (.not. allocated(DstParamData%M22)) then + allocate(DstParamData%M22(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%M22.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%M22 = SrcParamData%M22 + end if + if (allocated(SrcParamData%M22Inv)) then + LB(1:2) = lbound(SrcParamData%M22Inv) + UB(1:2) = ubound(SrcParamData%M22Inv) + if (.not. allocated(DstParamData%M22Inv)) then + allocate(DstParamData%M22Inv(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%M22Inv.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%M22Inv = SrcParamData%M22Inv + end if + if (allocated(SrcParamData%K11)) then + LB(1:2) = lbound(SrcParamData%K11) + UB(1:2) = ubound(SrcParamData%K11) + if (.not. allocated(DstParamData%K11)) then + allocate(DstParamData%K11(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%K11.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%K11 = SrcParamData%K11 + end if + if (allocated(SrcParamData%K12)) then + LB(1:2) = lbound(SrcParamData%K12) + UB(1:2) = ubound(SrcParamData%K12) + if (.not. allocated(DstParamData%K12)) then + allocate(DstParamData%K12(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%K12.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%K12 = SrcParamData%K12 + end if + if (allocated(SrcParamData%K21)) then + LB(1:2) = lbound(SrcParamData%K21) + UB(1:2) = ubound(SrcParamData%K21) + if (.not. allocated(DstParamData%K21)) then + allocate(DstParamData%K21(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%K21.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%K21 = SrcParamData%K21 + end if + if (allocated(SrcParamData%K22)) then + LB(1:2) = lbound(SrcParamData%K22) + UB(1:2) = ubound(SrcParamData%K22) if (.not. allocated(DstParamData%K22)) then allocate(DstParamData%K22(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then @@ -1181,11 +1230,38 @@ subroutine ExtPtfm_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM end if DstParamData%C21 = SrcParamData%C21 end if + if (allocated(SrcParamData%phiConn)) then + LB(1:2) = lbound(SrcParamData%phiConn) + UB(1:2) = ubound(SrcParamData%phiConn) + if (.not. allocated(DstParamData%phiConn)) then + allocate(DstParamData%phiConn(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%phiConn.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%phiConn = SrcParamData%phiConn + end if + if (allocated(SrcParamData%PosConn)) then + LB(1:2) = lbound(SrcParamData%PosConn) + UB(1:2) = ubound(SrcParamData%PosConn) + if (.not. allocated(DstParamData%PosConn)) then + allocate(DstParamData%PosConn(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PosConn.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%PosConn = SrcParamData%PosConn + end if + DstParamData%RBMass = SrcParamData%RBMass + DstParamData%RBCoG = SrcParamData%RBCoG + DstParamData%RBInertia = SrcParamData%RBInertia DstParamData%EP_DeltaT = SrcParamData%EP_DeltaT - DstParamData%nTimeSteps = SrcParamData%nTimeSteps DstParamData%nCB = SrcParamData%nCB DstParamData%nCBFull = SrcParamData%nCBFull DstParamData%nTot = SrcParamData%nTot + DstParamData%nConn = SrcParamData%nConn DstParamData%NumOuts = SrcParamData%NumOuts DstParamData%IntMethod = SrcParamData%IntMethod if (allocated(SrcParamData%ActiveCBDOF)) then @@ -1200,6 +1276,12 @@ subroutine ExtPtfm_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM end if DstParamData%ActiveCBDOF = SrcParamData%ActiveCBDOF end if + call ExtPtfm_CopyUserForcingType(SrcParamData%UsrModeF, DstParamData%UsrModeF, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ExtPtfm_CopyUserForcingType(SrcParamData%UsrConnF, DstParamData%UsrConnF, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return if (allocated(SrcParamData%OutParam)) then LB(1:1) = lbound(SrcParamData%OutParam) UB(1:1) = ubound(SrcParamData%OutParam) @@ -1250,29 +1332,47 @@ subroutine ExtPtfm_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%Stff)) then deallocate(ParamData%Stff) end if - if (allocated(ParamData%Forces)) then - deallocate(ParamData%Forces) + if (allocated(ParamData%W0)) then + deallocate(ParamData%W0) + end if + if (allocated(ParamData%WStff)) then + deallocate(ParamData%WStff) + end if + if (allocated(ParamData%A1Mat)) then + deallocate(ParamData%A1Mat) + end if + if (allocated(ParamData%A2Mat)) then + deallocate(ParamData%A2Mat) end if - if (allocated(ParamData%times)) then - deallocate(ParamData%times) + if (allocated(ParamData%B1Mat)) then + deallocate(ParamData%B1Mat) end if - if (allocated(ParamData%AMat)) then - deallocate(ParamData%AMat) + if (allocated(ParamData%B2Mat)) then + deallocate(ParamData%B2Mat) end if - if (allocated(ParamData%BMat)) then - deallocate(ParamData%BMat) + if (allocated(ParamData%B3Mat)) then + deallocate(ParamData%B3Mat) end if - if (allocated(ParamData%CMat)) then - deallocate(ParamData%CMat) + if (allocated(ParamData%B4Mat)) then + deallocate(ParamData%B4Mat) end if - if (allocated(ParamData%DMat)) then - deallocate(ParamData%DMat) + if (allocated(ParamData%C1Mat)) then + deallocate(ParamData%C1Mat) end if - if (allocated(ParamData%FX)) then - deallocate(ParamData%FX) + if (allocated(ParamData%C2Mat)) then + deallocate(ParamData%C2Mat) end if - if (allocated(ParamData%FY)) then - deallocate(ParamData%FY) + if (allocated(ParamData%D1Mat)) then + deallocate(ParamData%D1Mat) + end if + if (allocated(ParamData%D2Mat)) then + deallocate(ParamData%D2Mat) + end if + if (allocated(ParamData%D3Mat)) then + deallocate(ParamData%D3Mat) + end if + if (allocated(ParamData%D4Mat)) then + deallocate(ParamData%D4Mat) end if if (allocated(ParamData%M11)) then deallocate(ParamData%M11) @@ -1280,15 +1380,24 @@ subroutine ExtPtfm_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%M12)) then deallocate(ParamData%M12) end if + if (allocated(ParamData%M21)) then + deallocate(ParamData%M21) + end if if (allocated(ParamData%M22)) then deallocate(ParamData%M22) end if - if (allocated(ParamData%M21)) then - deallocate(ParamData%M21) + if (allocated(ParamData%M22Inv)) then + deallocate(ParamData%M22Inv) end if if (allocated(ParamData%K11)) then deallocate(ParamData%K11) end if + if (allocated(ParamData%K12)) then + deallocate(ParamData%K12) + end if + if (allocated(ParamData%K21)) then + deallocate(ParamData%K21) + end if if (allocated(ParamData%K22)) then deallocate(ParamData%K22) end if @@ -1304,9 +1413,19 @@ subroutine ExtPtfm_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%C21)) then deallocate(ParamData%C21) end if + if (allocated(ParamData%phiConn)) then + deallocate(ParamData%phiConn) + end if + if (allocated(ParamData%PosConn)) then + deallocate(ParamData%PosConn) + end if if (allocated(ParamData%ActiveCBDOF)) then deallocate(ParamData%ActiveCBDOF) end if + call ExtPtfm_DestroyUserForcingType(ParamData%UsrModeF, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtPtfm_DestroyUserForcingType(ParamData%UsrConnF, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(ParamData%OutParam)) then LB(1:1) = lbound(ParamData%OutParam) UB(1:1) = ubound(ParamData%OutParam) @@ -1328,35 +1447,53 @@ subroutine ExtPtfm_PackParam(RF, Indata) integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%hasRBMode) + call RegPack(RF, InData%RBMod) call RegPackAlloc(RF, InData%Mass) call RegPackAlloc(RF, InData%Damp) call RegPackAlloc(RF, InData%Stff) - call RegPackAlloc(RF, InData%Forces) - call RegPackAlloc(RF, InData%times) - call RegPackAlloc(RF, InData%AMat) - call RegPackAlloc(RF, InData%BMat) - call RegPackAlloc(RF, InData%CMat) - call RegPackAlloc(RF, InData%DMat) - call RegPackAlloc(RF, InData%FX) - call RegPackAlloc(RF, InData%FY) + call RegPackAlloc(RF, InData%W0) + call RegPackAlloc(RF, InData%WStff) + call RegPackAlloc(RF, InData%A1Mat) + call RegPackAlloc(RF, InData%A2Mat) + call RegPackAlloc(RF, InData%B1Mat) + call RegPackAlloc(RF, InData%B2Mat) + call RegPackAlloc(RF, InData%B3Mat) + call RegPackAlloc(RF, InData%B4Mat) + call RegPackAlloc(RF, InData%C1Mat) + call RegPackAlloc(RF, InData%C2Mat) + call RegPackAlloc(RF, InData%D1Mat) + call RegPackAlloc(RF, InData%D2Mat) + call RegPackAlloc(RF, InData%D3Mat) + call RegPackAlloc(RF, InData%D4Mat) call RegPackAlloc(RF, InData%M11) call RegPackAlloc(RF, InData%M12) - call RegPackAlloc(RF, InData%M22) call RegPackAlloc(RF, InData%M21) + call RegPackAlloc(RF, InData%M22) + call RegPackAlloc(RF, InData%M22Inv) call RegPackAlloc(RF, InData%K11) + call RegPackAlloc(RF, InData%K12) + call RegPackAlloc(RF, InData%K21) call RegPackAlloc(RF, InData%K22) call RegPackAlloc(RF, InData%C11) call RegPackAlloc(RF, InData%C12) call RegPackAlloc(RF, InData%C22) call RegPackAlloc(RF, InData%C21) + call RegPackAlloc(RF, InData%phiConn) + call RegPackAlloc(RF, InData%PosConn) + call RegPack(RF, InData%RBMass) + call RegPack(RF, InData%RBCoG) + call RegPack(RF, InData%RBInertia) call RegPack(RF, InData%EP_DeltaT) - call RegPack(RF, InData%nTimeSteps) call RegPack(RF, InData%nCB) call RegPack(RF, InData%nCBFull) call RegPack(RF, InData%nTot) + call RegPack(RF, InData%nConn) call RegPack(RF, InData%NumOuts) call RegPack(RF, InData%IntMethod) call RegPackAlloc(RF, InData%ActiveCBDOF) + call ExtPtfm_PackUserForcingType(RF, InData%UsrModeF) + call ExtPtfm_PackUserForcingType(RF, InData%UsrConnF) call RegPack(RF, allocated(InData%OutParam)) if (allocated(InData%OutParam)) then call RegPackBounds(RF, 1, lbound(InData%OutParam), ubound(InData%OutParam)) @@ -1379,35 +1516,53 @@ subroutine ExtPtfm_UnPackParam(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%hasRBMode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RBMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Mass); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Damp); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Stff); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Forces); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%times); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AMat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BMat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%CMat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DMat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%FX); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%FY); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%W0); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%WStff); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%A1Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%A2Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%B1Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%B2Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%B3Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%B4Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%C1Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%C2Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%D1Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%D2Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%D3Mat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%D4Mat); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%M11); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%M12); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%M22); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%M21); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%M22); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%M22Inv); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%K11); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%K12); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%K21); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%K22); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%C11); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%C12); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%C22); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%C21); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%phiConn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PosConn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RBMass); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RBCoG); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RBInertia); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%EP_DeltaT); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nTimeSteps); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nCB); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nCBFull); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nTot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nConn); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumOuts); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%IntMethod); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%ActiveCBDOF); if (RegCheckErr(RF, RoutineName)) return + call ExtPtfm_UnpackUserForcingType(RF, OutData%UsrModeF) ! UsrModeF + call ExtPtfm_UnpackUserForcingType(RF, OutData%UsrConnF) ! UsrConnF if (allocated(OutData%OutParam)) deallocate(OutData%OutParam) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -1430,6 +1585,7 @@ subroutine ExtPtfm_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrM integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'ExtPtfm_CopyInput' @@ -1438,6 +1594,24 @@ subroutine ExtPtfm_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrM call MeshCopy(SrcInputData%PtfmMesh, DstInputData%PtfmMesh, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcInputData%ConnLdMesh, DstInputData%ConnLdMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcInputData%FBMesh, DstInputData%FBMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcInputData%Fm)) then + LB(1:1) = lbound(SrcInputData%Fm) + UB(1:1) = ubound(SrcInputData%Fm) + if (.not. allocated(DstInputData%Fm)) then + allocate(DstInputData%Fm(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%Fm.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputData%Fm = SrcInputData%Fm + end if end subroutine subroutine ExtPtfm_DestroyInput(InputData, ErrStat, ErrMsg) @@ -1451,6 +1625,13 @@ subroutine ExtPtfm_DestroyInput(InputData, ErrStat, ErrMsg) ErrMsg = '' call MeshDestroy( InputData%PtfmMesh, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( InputData%ConnLdMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( InputData%FBMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InputData%Fm)) then + deallocate(InputData%Fm) + end if end subroutine subroutine ExtPtfm_PackInput(RF, Indata) @@ -1459,6 +1640,9 @@ subroutine ExtPtfm_PackInput(RF, Indata) character(*), parameter :: RoutineName = 'ExtPtfm_PackInput' if (RF%ErrStat >= AbortErrLev) return call MeshPack(RF, InData%PtfmMesh) + call MeshPack(RF, InData%ConnLdMesh) + call MeshPack(RF, InData%FBMesh) + call RegPackAlloc(RF, InData%Fm) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1466,8 +1650,14 @@ subroutine ExtPtfm_UnPackInput(RF, OutData) type(RegFile), intent(inout) :: RF type(ExtPtfm_InputType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'ExtPtfm_UnPackInput' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call MeshUnpack(RF, OutData%PtfmMesh) ! PtfmMesh + call MeshUnpack(RF, OutData%ConnLdMesh) ! ConnLdMesh + call MeshUnpack(RF, OutData%FBMesh) ! FBMesh + call RegUnpackAlloc(RF, OutData%Fm); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine ExtPtfm_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) @@ -1485,6 +1675,48 @@ subroutine ExtPtfm_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, E call MeshCopy(SrcOutputData%PtfmMesh, DstOutputData%PtfmMesh, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcOutputData%ConnMesh, DstOutputData%ConnMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcOutputData%FBMesh, DstOutputData%FBMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcOutputData%qm)) then + LB(1:1) = lbound(SrcOutputData%qm) + UB(1:1) = ubound(SrcOutputData%qm) + if (.not. allocated(DstOutputData%qm)) then + allocate(DstOutputData%qm(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%qm.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%qm = SrcOutputData%qm + end if + if (allocated(SrcOutputData%qmdot)) then + LB(1:1) = lbound(SrcOutputData%qmdot) + UB(1:1) = ubound(SrcOutputData%qmdot) + if (.not. allocated(DstOutputData%qmdot)) then + allocate(DstOutputData%qmdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%qmdot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%qmdot = SrcOutputData%qmdot + end if + if (allocated(SrcOutputData%qmdotdot)) then + LB(1:1) = lbound(SrcOutputData%qmdotdot) + UB(1:1) = ubound(SrcOutputData%qmdotdot) + if (.not. allocated(DstOutputData%qmdotdot)) then + allocate(DstOutputData%qmdotdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%qmdotdot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%qmdotdot = SrcOutputData%qmdotdot + end if if (allocated(SrcOutputData%WriteOutput)) then LB(1:1) = lbound(SrcOutputData%WriteOutput) UB(1:1) = ubound(SrcOutputData%WriteOutput) @@ -1510,6 +1742,19 @@ subroutine ExtPtfm_DestroyOutput(OutputData, ErrStat, ErrMsg) ErrMsg = '' call MeshDestroy( OutputData%PtfmMesh, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( OutputData%ConnMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( OutputData%FBMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(OutputData%qm)) then + deallocate(OutputData%qm) + end if + if (allocated(OutputData%qmdot)) then + deallocate(OutputData%qmdot) + end if + if (allocated(OutputData%qmdotdot)) then + deallocate(OutputData%qmdotdot) + end if if (allocated(OutputData%WriteOutput)) then deallocate(OutputData%WriteOutput) end if @@ -1521,6 +1766,11 @@ subroutine ExtPtfm_PackOutput(RF, Indata) character(*), parameter :: RoutineName = 'ExtPtfm_PackOutput' if (RF%ErrStat >= AbortErrLev) return call MeshPack(RF, InData%PtfmMesh) + call MeshPack(RF, InData%ConnMesh) + call MeshPack(RF, InData%FBMesh) + call RegPackAlloc(RF, InData%qm) + call RegPackAlloc(RF, InData%qmdot) + call RegPackAlloc(RF, InData%qmdotdot) call RegPackAlloc(RF, InData%WriteOutput) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1534,9 +1784,308 @@ subroutine ExtPtfm_UnPackOutput(RF, OutData) logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call MeshUnpack(RF, OutData%PtfmMesh) ! PtfmMesh + call MeshUnpack(RF, OutData%ConnMesh) ! ConnMesh + call MeshUnpack(RF, OutData%FBMesh) ! FBMesh + call RegUnpackAlloc(RF, OutData%qm); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qmdot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qmdotdot); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return end subroutine +subroutine ExtPtfm_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(ExtPtfm_MiscVarType), intent(inout) :: SrcMiscData + type(ExtPtfm_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'ExtPtfm_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcMiscData%xFlat)) then + LB(1:1) = lbound(SrcMiscData%xFlat) + UB(1:1) = ubound(SrcMiscData%xFlat) + if (.not. allocated(DstMiscData%xFlat)) then + allocate(DstMiscData%xFlat(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%xFlat.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%xFlat = SrcMiscData%xFlat + end if + DstMiscData%uFlat = SrcMiscData%uFlat + if (allocated(SrcMiscData%F_at_t)) then + LB(1:1) = lbound(SrcMiscData%F_at_t) + UB(1:1) = ubound(SrcMiscData%F_at_t) + if (.not. allocated(DstMiscData%F_at_t)) then + allocate(DstMiscData%F_at_t(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_at_t.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%F_at_t = SrcMiscData%F_at_t + end if + if (allocated(SrcMiscData%FConn_at_t)) then + LB(1:1) = lbound(SrcMiscData%FConn_at_t) + UB(1:1) = ubound(SrcMiscData%FConn_at_t) + if (.not. allocated(DstMiscData%FConn_at_t)) then + allocate(DstMiscData%FConn_at_t(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FConn_at_t.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%FConn_at_t = SrcMiscData%FConn_at_t + end if + if (allocated(SrcMiscData%F1)) then + LB(1:1) = lbound(SrcMiscData%F1) + UB(1:1) = ubound(SrcMiscData%F1) + if (.not. allocated(DstMiscData%F1)) then + allocate(DstMiscData%F1(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F1.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%F1 = SrcMiscData%F1 + end if + if (allocated(SrcMiscData%F2)) then + LB(1:1) = lbound(SrcMiscData%F2) + UB(1:1) = ubound(SrcMiscData%F2) + if (.not. allocated(DstMiscData%F2)) then + allocate(DstMiscData%F2(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F2.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%F2 = SrcMiscData%F2 + end if + if (allocated(SrcMiscData%Weight)) then + LB(1:1) = lbound(SrcMiscData%Weight) + UB(1:1) = ubound(SrcMiscData%Weight) + if (.not. allocated(DstMiscData%Weight)) then + allocate(DstMiscData%Weight(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Weight.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%Weight = SrcMiscData%Weight + end if + if (allocated(SrcMiscData%FConn)) then + LB(1:1) = lbound(SrcMiscData%FConn) + UB(1:1) = ubound(SrcMiscData%FConn) + if (.not. allocated(DstMiscData%FConn)) then + allocate(DstMiscData%FConn(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FConn.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%FConn = SrcMiscData%FConn + end if + if (allocated(SrcMiscData%FConnCB)) then + LB(1:1) = lbound(SrcMiscData%FConnCB) + UB(1:1) = ubound(SrcMiscData%FConnCB) + if (.not. allocated(DstMiscData%FConnCB)) then + allocate(DstMiscData%FConnCB(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FConnCB.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%FConnCB = SrcMiscData%FConnCB + end if + if (allocated(SrcMiscData%DConn)) then + LB(1:1) = lbound(SrcMiscData%DConn) + UB(1:1) = ubound(SrcMiscData%DConn) + if (.not. allocated(DstMiscData%DConn)) then + allocate(DstMiscData%DConn(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%DConn.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%DConn = SrcMiscData%DConn + end if + if (allocated(SrcMiscData%VConn)) then + LB(1:1) = lbound(SrcMiscData%VConn) + UB(1:1) = ubound(SrcMiscData%VConn) + if (.not. allocated(DstMiscData%VConn)) then + allocate(DstMiscData%VConn(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%VConn.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%VConn = SrcMiscData%VConn + end if + if (allocated(SrcMiscData%AConn)) then + LB(1:1) = lbound(SrcMiscData%AConn) + UB(1:1) = ubound(SrcMiscData%AConn) + if (.not. allocated(DstMiscData%AConn)) then + allocate(DstMiscData%AConn(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AConn.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AConn = SrcMiscData%AConn + end if + DstMiscData%Indx_UsrModeF = SrcMiscData%Indx_UsrModeF + DstMiscData%Indx_UsrConnF = SrcMiscData%Indx_UsrConnF + DstMiscData%EquilStart = SrcMiscData%EquilStart + if (allocated(SrcMiscData%AllOuts)) then + LB(1:1) = lbound(SrcMiscData%AllOuts) + UB(1:1) = ubound(SrcMiscData%AllOuts) + if (.not. allocated(DstMiscData%AllOuts)) then + allocate(DstMiscData%AllOuts(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AllOuts.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AllOuts = SrcMiscData%AllOuts + end if + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ExtPtfm_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ExtPtfm_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ExtPtfm_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ExtPtfm_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine ExtPtfm_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(ExtPtfm_MiscVarType), intent(inout) :: MiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'ExtPtfm_DestroyMisc' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(MiscData%xFlat)) then + deallocate(MiscData%xFlat) + end if + if (allocated(MiscData%F_at_t)) then + deallocate(MiscData%F_at_t) + end if + if (allocated(MiscData%FConn_at_t)) then + deallocate(MiscData%FConn_at_t) + end if + if (allocated(MiscData%F1)) then + deallocate(MiscData%F1) + end if + if (allocated(MiscData%F2)) then + deallocate(MiscData%F2) + end if + if (allocated(MiscData%Weight)) then + deallocate(MiscData%Weight) + end if + if (allocated(MiscData%FConn)) then + deallocate(MiscData%FConn) + end if + if (allocated(MiscData%FConnCB)) then + deallocate(MiscData%FConnCB) + end if + if (allocated(MiscData%DConn)) then + deallocate(MiscData%DConn) + end if + if (allocated(MiscData%VConn)) then + deallocate(MiscData%VConn) + end if + if (allocated(MiscData%AConn)) then + deallocate(MiscData%AConn) + end if + if (allocated(MiscData%AllOuts)) then + deallocate(MiscData%AllOuts) + end if + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtPtfm_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtPtfm_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtPtfm_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtPtfm_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine ExtPtfm_PackMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(ExtPtfm_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'ExtPtfm_PackMisc' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%xFlat) + call RegPack(RF, InData%uFlat) + call RegPackAlloc(RF, InData%F_at_t) + call RegPackAlloc(RF, InData%FConn_at_t) + call RegPackAlloc(RF, InData%F1) + call RegPackAlloc(RF, InData%F2) + call RegPackAlloc(RF, InData%Weight) + call RegPackAlloc(RF, InData%FConn) + call RegPackAlloc(RF, InData%FConnCB) + call RegPackAlloc(RF, InData%DConn) + call RegPackAlloc(RF, InData%VConn) + call RegPackAlloc(RF, InData%AConn) + call RegPack(RF, InData%Indx_UsrModeF) + call RegPack(RF, InData%Indx_UsrConnF) + call RegPack(RF, InData%EquilStart) + call RegPackAlloc(RF, InData%AllOuts) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call ExtPtfm_PackContState(RF, InData%x_perturb) + call ExtPtfm_PackContState(RF, InData%dxdt_lin) + call ExtPtfm_PackInput(RF, InData%u_perturb) + call ExtPtfm_PackOutput(RF, InData%y_lin) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine ExtPtfm_UnPackMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(ExtPtfm_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'ExtPtfm_UnPackMisc' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%xFlat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%uFlat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%F_at_t); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%FConn_at_t); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%F1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%F2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Weight); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%FConn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%FConnCB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%DConn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%VConn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AConn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Indx_UsrModeF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Indx_UsrConnF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%EquilStart); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AllOuts); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call ExtPtfm_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call ExtPtfm_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call ExtPtfm_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call ExtPtfm_UnpackOutput(RF, OutData%y_lin) ! y_lin +end subroutine + subroutine ExtPtfm_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time @@ -1615,6 +2164,8 @@ SUBROUTINE ExtPtfm_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, Err REAL(DbKi) :: a1, a2 ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' @@ -1634,6 +2185,13 @@ SUBROUTINE ExtPtfm_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, Err CALL MeshExtrapInterp1(u1%PtfmMesh, u2%PtfmMesh, tin, u_out%PtfmMesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + CALL MeshExtrapInterp1(u1%ConnLdMesh, u2%ConnLdMesh, tin, u_out%ConnLdMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + CALL MeshExtrapInterp1(u1%FBMesh, u2%FBMesh, tin, u_out%FBMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%Fm) .AND. ALLOCATED(u1%Fm)) THEN + u_out%Fm = a1*u1%Fm + a2*u2%Fm + END IF ! check if allocated END SUBROUTINE SUBROUTINE ExtPtfm_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) @@ -1666,6 +2224,8 @@ SUBROUTINE ExtPtfm_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors CHARACTER(*), PARAMETER :: RoutineName = 'ExtPtfm_Input_ExtrapInterp2' + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' @@ -1691,6 +2251,13 @@ SUBROUTINE ExtPtfm_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, a3 = (t_out - t(1))*(t_out - t(2))/((t(3) - t(1))*(t(3) - t(2))) CALL MeshExtrapInterp2(u1%PtfmMesh, u2%PtfmMesh, u3%PtfmMesh, tin, u_out%PtfmMesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + CALL MeshExtrapInterp2(u1%ConnLdMesh, u2%ConnLdMesh, u3%ConnLdMesh, tin, u_out%ConnLdMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + CALL MeshExtrapInterp2(u1%FBMesh, u2%FBMesh, u3%FBMesh, tin, u_out%FBMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%Fm) .AND. ALLOCATED(u1%Fm)) THEN + u_out%Fm = a1*u1%Fm + a2*u2%Fm + a3*u3%Fm + END IF ! check if allocated END SUBROUTINE subroutine ExtPtfm_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg) @@ -1792,6 +2359,19 @@ SUBROUTINE ExtPtfm_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, Er CALL MeshExtrapInterp1(y1%PtfmMesh, y2%PtfmMesh, tin, y_out%PtfmMesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + CALL MeshExtrapInterp1(y1%ConnMesh, y2%ConnMesh, tin, y_out%ConnMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + CALL MeshExtrapInterp1(y1%FBMesh, y2%FBMesh, tin, y_out%FBMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(y_out%qm) .AND. ALLOCATED(y1%qm)) THEN + y_out%qm = a1*y1%qm + a2*y2%qm + END IF ! check if allocated + IF (ALLOCATED(y_out%qmdot) .AND. ALLOCATED(y1%qmdot)) THEN + y_out%qmdot = a1*y1%qmdot + a2*y2%qmdot + END IF ! check if allocated + IF (ALLOCATED(y_out%qmdotdot) .AND. ALLOCATED(y1%qmdotdot)) THEN + y_out%qmdotdot = a1*y1%qmdotdot + a2*y2%qmdotdot + END IF ! check if allocated IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput END IF ! check if allocated @@ -1854,9 +2434,311 @@ SUBROUTINE ExtPtfm_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat a3 = (t_out - t(1))*(t_out - t(2))/((t(3) - t(1))*(t(3) - t(2))) CALL MeshExtrapInterp2(y1%PtfmMesh, y2%PtfmMesh, y3%PtfmMesh, tin, y_out%PtfmMesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + CALL MeshExtrapInterp2(y1%ConnMesh, y2%ConnMesh, y3%ConnMesh, tin, y_out%ConnMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + CALL MeshExtrapInterp2(y1%FBMesh, y2%FBMesh, y3%FBMesh, tin, y_out%FBMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(y_out%qm) .AND. ALLOCATED(y1%qm)) THEN + y_out%qm = a1*y1%qm + a2*y2%qm + a3*y3%qm + END IF ! check if allocated + IF (ALLOCATED(y_out%qmdot) .AND. ALLOCATED(y1%qmdot)) THEN + y_out%qmdot = a1*y1%qmdot + a2*y2%qmdot + a3*y3%qmdot + END IF ! check if allocated + IF (ALLOCATED(y_out%qmdotdot) .AND. ALLOCATED(y1%qmdotdot)) THEN + y_out%qmdotdot = a1*y1%qmdotdot + a2*y2%qmdotdot + a3*y3%qmdotdot + END IF ! check if allocated IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function ExtPtfm_InputMeshPointer(u, DL) result(Mesh) + type(ExtPtfm_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ExtPtfm_u_PtfmMesh) + Mesh => u%PtfmMesh + case (ExtPtfm_u_ConnLdMesh) + Mesh => u%ConnLdMesh + case (ExtPtfm_u_FBMesh) + Mesh => u%FBMesh + end select +end function + +function ExtPtfm_OutputMeshPointer(y, DL) result(Mesh) + type(ExtPtfm_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (ExtPtfm_y_PtfmMesh) + Mesh => y%PtfmMesh + case (ExtPtfm_y_ConnMesh) + Mesh => y%ConnMesh + case (ExtPtfm_y_FBMesh) + Mesh => y%FBMesh + end select +end function + +subroutine ExtPtfm_VarsPackContState(Vars, x, ValAry) + type(ExtPtfm_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ExtPtfm_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ExtPtfm_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ExtPtfm_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtPtfm_x_qm) + VarVals = x%qm(V%iLB:V%iUB) ! Rank 1 Array + case (ExtPtfm_x_qmdot) + VarVals = x%qmdot(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtPtfm_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtPtfm_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ExtPtfm_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine ExtPtfm_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtPtfm_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtPtfm_x_qm) + x%qm(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtPtfm_x_qmdot) + x%qmdot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ExtPtfm_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtPtfm_x_qm) + Name = "x%qm" + case (ExtPtfm_x_qmdot) + Name = "x%qmdot" + case default + Name = "Unknown Field" + end select +end function + +subroutine ExtPtfm_VarsPackContStateDeriv(Vars, x, ValAry) + type(ExtPtfm_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call ExtPtfm_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine ExtPtfm_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(ExtPtfm_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtPtfm_x_qm) + VarVals = x%qm(V%iLB:V%iUB) ! Rank 1 Array + case (ExtPtfm_x_qmdot) + VarVals = x%qmdot(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtPtfm_VarsPackInput(Vars, u, ValAry) + type(ExtPtfm_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ExtPtfm_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine ExtPtfm_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(ExtPtfm_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtPtfm_u_PtfmMesh) + call MV_PackMesh(V, u%PtfmMesh, ValAry) ! Mesh + case (ExtPtfm_u_ConnLdMesh) + call MV_PackMesh(V, u%ConnLdMesh, ValAry) ! Mesh + case (ExtPtfm_u_FBMesh) + call MV_PackMesh(V, u%FBMesh, ValAry) ! Mesh + case (ExtPtfm_u_Fm) + VarVals = u%Fm(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtPtfm_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtPtfm_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call ExtPtfm_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine ExtPtfm_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtPtfm_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtPtfm_u_PtfmMesh) + call MV_UnpackMesh(V, ValAry, u%PtfmMesh) ! Mesh + case (ExtPtfm_u_ConnLdMesh) + call MV_UnpackMesh(V, ValAry, u%ConnLdMesh) ! Mesh + case (ExtPtfm_u_FBMesh) + call MV_UnpackMesh(V, ValAry, u%FBMesh) ! Mesh + case (ExtPtfm_u_Fm) + u%Fm(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ExtPtfm_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtPtfm_u_PtfmMesh) + Name = "u%PtfmMesh" + case (ExtPtfm_u_ConnLdMesh) + Name = "u%ConnLdMesh" + case (ExtPtfm_u_FBMesh) + Name = "u%FBMesh" + case (ExtPtfm_u_Fm) + Name = "u%Fm" + case default + Name = "Unknown Field" + end select +end function + +subroutine ExtPtfm_VarsPackOutput(Vars, y, ValAry) + type(ExtPtfm_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ExtPtfm_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine ExtPtfm_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(ExtPtfm_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtPtfm_y_PtfmMesh) + call MV_PackMesh(V, y%PtfmMesh, ValAry) ! Mesh + case (ExtPtfm_y_ConnMesh) + call MV_PackMesh(V, y%ConnMesh, ValAry) ! Mesh + case (ExtPtfm_y_FBMesh) + call MV_PackMesh(V, y%FBMesh, ValAry) ! Mesh + case (ExtPtfm_y_qm) + VarVals = y%qm(V%iLB:V%iUB) ! Rank 1 Array + case (ExtPtfm_y_qmdot) + VarVals = y%qmdot(V%iLB:V%iUB) ! Rank 1 Array + case (ExtPtfm_y_qmdotdot) + VarVals = y%qmdotdot(V%iLB:V%iUB) ! Rank 1 Array + case (ExtPtfm_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine ExtPtfm_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(ExtPtfm_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call ExtPtfm_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine ExtPtfm_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(ExtPtfm_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (ExtPtfm_y_PtfmMesh) + call MV_UnpackMesh(V, ValAry, y%PtfmMesh) ! Mesh + case (ExtPtfm_y_ConnMesh) + call MV_UnpackMesh(V, ValAry, y%ConnMesh) ! Mesh + case (ExtPtfm_y_FBMesh) + call MV_UnpackMesh(V, ValAry, y%FBMesh) ! Mesh + case (ExtPtfm_y_qm) + y%qm(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtPtfm_y_qmdot) + y%qmdot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtPtfm_y_qmdotdot) + y%qmdotdot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (ExtPtfm_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function ExtPtfm_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (ExtPtfm_y_PtfmMesh) + Name = "y%PtfmMesh" + case (ExtPtfm_y_ConnMesh) + Name = "y%ConnMesh" + case (ExtPtfm_y_FBMesh) + Name = "y%FBMesh" + case (ExtPtfm_y_qm) + Name = "y%qm" + case (ExtPtfm_y_qmdot) + Name = "y%qmdot" + case (ExtPtfm_y_qmdotdot) + Name = "y%qmdotdot" + case (ExtPtfm_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE ExtPtfm_MCKF_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/feamooring/src/FEAM.f90 b/modules/feamooring/src/FEAM.f90 index 76ac6fccbd..7816cc9948 100644 --- a/modules/feamooring/src/FEAM.f90 +++ b/modules/feamooring/src/FEAM.f90 @@ -284,6 +284,14 @@ SUBROUTINE FEAM_Init( InitInp, u, p, x, xd, z, OtherState, y, misc, Interval, I IF (ErrStat >= AbortErrLev) RETURN y%WriteOutput = 0 + !............................................................................................ + ! Module Variables + !............................................................................................ + + call FEAM_InitVars(u, p, x, y, misc, InitOut, .false., ErrStat2, ErrMsg2) + call CheckError( ErrStat2, ErrMsg2 ) + if (ErrStat >= AbortErrLev) return + !............................................................................................ ! If you want to choose your own rate instead of using what the glue code suggests, tell the glue code the rate at which ! this module must be called here: @@ -332,6 +340,60 @@ END SUBROUTINE CheckError !---------------------------------------------------------------------------------------------------------------------------------- END SUBROUTINE FEAM_Init !---------------------------------------------------------------------------------------------------------------------------------- + +subroutine FEAM_InitVars(u, p, x, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(FEAM_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(FEAM_ParameterType), intent(inout) :: p !< Parameters + type(FEAM_ContinuousStateType), intent(inout) :: x !< Continuous state + type(FEAM_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(FEAM_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(FEAM_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in ) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'FEAM_InitVars' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i, j, Flags, idx + + ErrStat = ErrID_None + ErrMsg = "" + + !--------------------------------------------------------------------------- + ! Continuous State Variables + !--------------------------------------------------------------------------- + + !--------------------------------------------------------------------------- + ! Input variables + !--------------------------------------------------------------------------- + + call MV_AddMeshVar(InitOut%Vars%u, "PtFairleadDisplacement", [FieldTransDisp], & + DatLoc(FEAM_u_PtFairleadDisplacement), & + Mesh=u%PtFairleadDisplacement) + + !--------------------------------------------------------------------------- + ! Output variables + !--------------------------------------------------------------------------- + + call MV_AddMeshVar(InitOut%Vars%y, 'PtFairleadLoad', [FieldForce], & + DatLoc(FEAM_y_PtFairleadLoad), & + Mesh=y%PtFairleadLoad) + + !--------------------------------------------------------------------------- + ! Initialize Variables and Values + !--------------------------------------------------------------------------- + + CALL MV_InitVarsJac(InitOut%Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed + end subroutine +!---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE Init_States(p, x, xd, z, OtherState, ErrStat, ErrMsg) TYPE(FEAM_ParameterType), INTENT(IN ) :: p ! Parameters diff --git a/modules/feamooring/src/FEAM_Registry.txt b/modules/feamooring/src/FEAM_Registry.txt index c0482b23bd..13eb35a76f 100644 --- a/modules/feamooring/src/FEAM_Registry.txt +++ b/modules/feamooring/src/FEAM_Registry.txt @@ -69,6 +69,7 @@ typedef ^ ^ ReKi WtrDens - typedef FEAMooring/FEAM InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ ^ ProgDesc Ver - - - "This module's name, version, and date" - +typedef ^ ^ ModVarsType Vars - - - "Pointer to module variables" - typedef ^ ^ ReKi LAnchxi {:} - - "Anchor coordinate" - typedef ^ ^ ReKi LAnchyi {:} - - "Anchor coordinate" - typedef ^ ^ ReKi LAnchzi {:} - - "Anchor coordinate" - @@ -114,7 +115,8 @@ typedef ^ ^ ReKi EMAS0 {15}{1 # Define any data that are used only for efficiency purposes (these variables are not associated with time): # e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. # these could be local variables: -typedef ^ MiscVarType ReKi GLF {:}{:} - - "Global forcing matrix" - +typedef ^ MiscVarType ModJacType Jac - - - "Jacobian matrices and arrays corresponding to module variables" +typedef ^ ^ ReKi GLF {:}{:} - - "Global forcing matrix" - typedef ^ ^ ReKi GLK {:}{:}{:} - - "Global stiffness matrix" - typedef ^ ^ ReKi EMASS {15}{15} - - "Line element mass" typedef ^ ^ ReKi ESTIF {15}{15} - - "Line element stiffness" diff --git a/modules/feamooring/src/FEAMooring_Types.f90 b/modules/feamooring/src/FEAMooring_Types.f90 index 986f9ea0ab..dfcde61ce5 100644 --- a/modules/feamooring/src/FEAMooring_Types.f90 +++ b/modules/feamooring/src/FEAMooring_Types.f90 @@ -86,6 +86,7 @@ MODULE FEAMooring_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] + TYPE(ModVarsType) :: Vars !< Pointer to module variables [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: LAnchxi !< Anchor coordinate [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: LAnchyi !< Anchor coordinate [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: LAnchzi !< Anchor coordinate [-] @@ -128,6 +129,7 @@ MODULE FEAMooring_Types ! ======================= ! ========= FEAM_MiscVarType ======= TYPE, PUBLIC :: FEAM_MiscVarType + TYPE(ModJacType) :: Jac !< Jacobian matrices and arrays corresponding to module variables [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: GLF !< Global forcing matrix [-] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: GLK !< Global stiffness matrix [-] REAL(ReKi) , DIMENSION(1:15,1:15) :: EMASS = 0.0_ReKi !< Line element mass [-] @@ -223,7 +225,15 @@ MODULE FEAMooring_Types TYPE(MeshType) :: LineMeshPosition !< Meshed output data [-] END TYPE FEAM_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: FEAM_x_GLU = 1 ! FEAM%GLU + integer(IntKi), public, parameter :: FEAM_x_GLDU = 2 ! FEAM%GLDU + integer(IntKi), public, parameter :: FEAM_u_HydroForceLineMesh = 3 ! FEAM%HydroForceLineMesh + integer(IntKi), public, parameter :: FEAM_u_PtFairleadDisplacement = 4 ! FEAM%PtFairleadDisplacement + integer(IntKi), public, parameter :: FEAM_y_WriteOutput = 5 ! FEAM%WriteOutput + integer(IntKi), public, parameter :: FEAM_y_PtFairleadLoad = 6 ! FEAM%PtFairleadLoad + integer(IntKi), public, parameter :: FEAM_y_LineMeshPosition = 7 ! FEAM%LineMeshPosition + +contains subroutine FEAM_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg) type(FEAM_InputFile), intent(in) :: SrcInputFileData @@ -758,6 +768,9 @@ subroutine FEAM_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, E call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return if (allocated(SrcInitOutputData%LAnchxi)) then LB(1:1) = lbound(SrcInitOutputData%LAnchxi) UB(1:1) = ubound(SrcInitOutputData%LAnchxi) @@ -849,6 +862,8 @@ subroutine FEAM_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(InitOutputData%LAnchxi)) then deallocate(InitOutputData%LAnchxi) end if @@ -877,6 +892,7 @@ subroutine FEAM_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%WriteOutputHdr) call RegPackAlloc(RF, InData%WriteOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) + call NWTC_Library_PackModVarsType(RF, InData%Vars) call RegPackAlloc(RF, InData%LAnchxi) call RegPackAlloc(RF, InData%LAnchyi) call RegPackAlloc(RF, InData%LAnchzi) @@ -897,6 +913,7 @@ subroutine FEAM_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars call RegUnpackAlloc(RF, OutData%LAnchxi); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%LAnchyi); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%LAnchzi); if (RegCheckErr(RF, RoutineName)) return @@ -1223,9 +1240,13 @@ subroutine FEAM_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) character(*), intent( out) :: ErrMsg integer(B4Ki) :: LB(3), UB(3) integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'FEAM_CopyMisc' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return if (allocated(SrcMiscData%GLF)) then LB(1:2) = lbound(SrcMiscData%GLF) UB(1:2) = ubound(SrcMiscData%GLF) @@ -1366,9 +1387,13 @@ subroutine FEAM_DestroyMisc(MiscData, ErrStat, ErrMsg) type(FEAM_MiscVarType), intent(inout) :: MiscData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'FEAM_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(MiscData%GLF)) then deallocate(MiscData%GLF) end if @@ -1406,6 +1431,7 @@ subroutine FEAM_PackMisc(RF, Indata) type(FEAM_MiscVarType), intent(in) :: InData character(*), parameter :: RoutineName = 'FEAM_PackMisc' if (RF%ErrStat >= AbortErrLev) return + call NWTC_Library_PackModJacType(RF, InData%Jac) call RegPackAlloc(RF, InData%GLF) call RegPackAlloc(RF, InData%GLK) call RegPack(RF, InData%EMASS) @@ -1441,6 +1467,7 @@ subroutine FEAM_UnPackMisc(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac call RegUnpackAlloc(RF, OutData%GLF); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%GLK); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%EMASS); if (RegCheckErr(RF, RoutineName)) return @@ -2410,5 +2437,254 @@ SUBROUTINE FEAM_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, E CALL MeshExtrapInterp2(y1%LineMeshPosition, y2%LineMeshPosition, y3%LineMeshPosition, tin, y_out%LineMeshPosition, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE + +function FEAM_InputMeshPointer(u, DL) result(Mesh) + type(FEAM_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (FEAM_u_HydroForceLineMesh) + Mesh => u%HydroForceLineMesh + case (FEAM_u_PtFairleadDisplacement) + Mesh => u%PtFairleadDisplacement + end select +end function + +function FEAM_OutputMeshPointer(y, DL) result(Mesh) + type(FEAM_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (FEAM_y_PtFairleadLoad) + Mesh => y%PtFairleadLoad + case (FEAM_y_LineMeshPosition) + Mesh => y%LineMeshPosition + end select +end function + +subroutine FEAM_VarsPackContState(Vars, x, ValAry) + type(FEAM_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call FEAM_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine FEAM_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(FEAM_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FEAM_x_GLU) + VarVals = x%GLU(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (FEAM_x_GLDU) + VarVals = x%GLDU(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FEAM_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(FEAM_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call FEAM_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine FEAM_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(FEAM_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FEAM_x_GLU) + x%GLU(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (FEAM_x_GLDU) + x%GLDU(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function FEAM_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (FEAM_x_GLU) + Name = "x%GLU" + case (FEAM_x_GLDU) + Name = "x%GLDU" + case default + Name = "Unknown Field" + end select +end function + +subroutine FEAM_VarsPackContStateDeriv(Vars, x, ValAry) + type(FEAM_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call FEAM_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine FEAM_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(FEAM_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FEAM_x_GLU) + VarVals = x%GLU(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (FEAM_x_GLDU) + VarVals = x%GLDU(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FEAM_VarsPackInput(Vars, u, ValAry) + type(FEAM_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call FEAM_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine FEAM_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(FEAM_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FEAM_u_HydroForceLineMesh) + call MV_PackMesh(V, u%HydroForceLineMesh, ValAry) ! Mesh + case (FEAM_u_PtFairleadDisplacement) + call MV_PackMesh(V, u%PtFairleadDisplacement, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FEAM_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(FEAM_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call FEAM_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine FEAM_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(FEAM_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FEAM_u_HydroForceLineMesh) + call MV_UnpackMesh(V, ValAry, u%HydroForceLineMesh) ! Mesh + case (FEAM_u_PtFairleadDisplacement) + call MV_UnpackMesh(V, ValAry, u%PtFairleadDisplacement) ! Mesh + end select + end associate +end subroutine + +function FEAM_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (FEAM_u_HydroForceLineMesh) + Name = "u%HydroForceLineMesh" + case (FEAM_u_PtFairleadDisplacement) + Name = "u%PtFairleadDisplacement" + case default + Name = "Unknown Field" + end select +end function + +subroutine FEAM_VarsPackOutput(Vars, y, ValAry) + type(FEAM_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call FEAM_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine FEAM_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(FEAM_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FEAM_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (FEAM_y_PtFairleadLoad) + call MV_PackMesh(V, y%PtFairleadLoad, ValAry) ! Mesh + case (FEAM_y_LineMeshPosition) + call MV_PackMesh(V, y%LineMeshPosition, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine FEAM_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(FEAM_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call FEAM_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine FEAM_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(FEAM_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (FEAM_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (FEAM_y_PtFairleadLoad) + call MV_UnpackMesh(V, ValAry, y%PtFairleadLoad) ! Mesh + case (FEAM_y_LineMeshPosition) + call MV_UnpackMesh(V, ValAry, y%LineMeshPosition) ! Mesh + end select + end associate +end subroutine + +function FEAM_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (FEAM_y_WriteOutput) + Name = "y%WriteOutput" + case (FEAM_y_PtFairleadLoad) + Name = "y%PtFairleadLoad" + case (FEAM_y_LineMeshPosition) + Name = "y%LineMeshPosition" + case default + Name = "Unknown Field" + end select +end function + END MODULE FEAMooring_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/hydrodyn/src/Conv_Radiation.f90 b/modules/hydrodyn/src/Conv_Radiation.f90 index 0584f2a8ef..f8aa84010e 100644 --- a/modules/hydrodyn/src/Conv_Radiation.f90 +++ b/modules/hydrodyn/src/Conv_Radiation.f90 @@ -113,7 +113,8 @@ SUBROUTINE Conv_Rdtn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, InitOut, E ! RdtnOmegaMax, Abort because RdtnDT must be reduced in order to have ! sufficient accuracy in the computation of the radiation impulse response ! functions: - p%NBody = InitInp%NBody + p%NBody = InitInp%NBody ! Can be removed in the future. Role replaced by NDOF. + p%NDOF = InitInp%NDOF p%RdtnDT = InitInp%RdtnDT ! this is also Interval RdtnOmegaMax = Pi / InitInp%RdtnDT @@ -125,8 +126,8 @@ SUBROUTINE Conv_Rdtn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, InitOut, E RETURN END IF - call AllocAry( u%Velocity, 6*p%NBody, "u%Velocity" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'Conv_Rdtn_Init' ) - call AllocAry( y%F_Rdtn , 6*p%NBody, "y%F_Rdtn" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'Conv_Rdtn_Init' ) + call AllocAry( u%Velocity, p%NDOF, "u%Velocity" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'Conv_Rdtn_Init' ) + call AllocAry( y%F_Rdtn , p%NDOF, "y%F_Rdtn" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'Conv_Rdtn_Init' ) u%Velocity = 0.0 !this is an initial guess; @@ -164,14 +165,14 @@ SUBROUTINE Conv_Rdtn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, InitOut, E RETURN END IF - ALLOCATE ( p%RdtnKrnl (0:p%NStepRdtn-1,6*p%NBody,6*p%NBody) , STAT=ErrStat ) + ALLOCATE ( p%RdtnKrnl (p%NDOF,p%NDOF,0:p%NStepRdtn-1) , STAT=ErrStat ) IF ( ErrStat /= ErrID_None ) THEN ErrMsg = ' Error allocating memory for the RdtnKrnl array.' ErrStat = ErrID_Fatal RETURN END IF - ALLOCATE ( xd%XDHistory(0:p%NStepRdtn ,6*p%NBody ) , STAT=ErrStat ) ! In the numerical convolution we must have NStepRdtn1 elements within the XDHistory array, which is one more than the NStepRdtn elements that are in the RdtnKrnl array + ALLOCATE ( xd%XDHistory(p%NDOF,0:p%NStepRdtn) , STAT=ErrStat ) ! In the numerical convolution we must have NStepRdtn1 elements within the XDHistory array, which is one more than the NStepRdtn elements that are in the RdtnKrnl array IF ( ErrStat /= ErrID_None ) THEN ErrMsg = ' Error allocating memory for the XDHistory array.' ErrStat = ErrID_Fatal @@ -180,8 +181,8 @@ SUBROUTINE Conv_Rdtn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, InitOut, E ! Initialize all elements of the xd%XDHistory array with the initial values of u%Velocity DO K = 0,p%NStepRdtn-1 - DO J = 1,6*p%NBody ! Loop through all DOFs - xd%XDHistory(K,J) = u%Velocity(J) + DO J = 1,p%NDOF ! Loop through all DOFs + xd%XDHistory(J,K) = u%Velocity(J) END DO END DO @@ -218,10 +219,10 @@ SUBROUTINE Conv_Rdtn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, InitOut, E ! transform of the wave radiation kernel: ! Indx = 0 - DO J = 1,6*p%NBody ! Loop through all rows of RdtnKrnl - DO K = 1,6*p%NBody ! Loop through all columns of RdtnKrnl above and including the diagonal + DO J = 1,p%NDOF ! Loop through all rows of RdtnKrnl + DO K = 1,p%NDOF ! Loop through all columns of RdtnKrnl above and including the diagonal !Indx = Indx + 1 - p%RdtnKrnl(I,J,K) = Krnl_Fact*Omega*( InterpStp( Omega, InitInp%HdroFreq(:), & + p%RdtnKrnl(J,K,I) = Krnl_Fact*Omega*( InterpStp( Omega, InitInp%HdroFreq(:), & InitInp%HdroAddMs(: ,J,K), LastInd, InitInp%NInpFreq ) & - InitInp%HdroAddMs(InitInp%NInpFreq,J,K) ) END DO ! K - All columns of RdtnKrnl above and including the diagonal @@ -243,9 +244,9 @@ SUBROUTINE Conv_Rdtn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, InitOut, E RETURN END IF - DO J = 1,6*p%NBody ! Loop through all rows of RdtnKrnl - DO K = 1,6*p%NBody ! Loop through all columns of RdtnKrnl above and including the diagonal - CALL ApplySINT( p%RdtnKrnl(:,J,K), FFT_Data, ErrStat ) + DO J = 1,p%NDOF ! Loop through all rows of RdtnKrnl + DO K = 1,p%NDOF ! Loop through all columns of RdtnKrnl above and including the diagonal + CALL ApplySINT( p%RdtnKrnl(J,K,:), FFT_Data, ErrStat ) IF ( ErrStat /= ErrID_None ) RETURN END DO ! K - All columns of RdtnKrnl above and including the diagonal END DO ! J - All rows of RdtnKrnl @@ -290,10 +291,10 @@ SUBROUTINE Conv_Rdtn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, InitOut, E ! transform of the wave radiation kernel: !Indx = 0 - DO J = 1,6*p%NBody ! Loop through all rows of RdtnKrnl - DO K = 1,6*p%NBody ! Loop through all columns of RdtnKrnl above and including the diagonal + DO J = 1,p%NDOF ! Loop through all rows of RdtnKrnl + DO K = 1,p%NDOF ! Loop through all columns of RdtnKrnl above and including the diagonal !Indx = Indx + 1 - p%RdtnKrnl(I,J,K) = Krnl_Fact*InterpStp ( Omega, InitInp%HdroFreq(:), InitInp%HdroDmpng(:,J,K), LastInd, InitInp%NInpFreq ) + p%RdtnKrnl(J,K,I) = Krnl_Fact*InterpStp ( Omega, InitInp%HdroFreq(:), InitInp%HdroDmpng(:,J,K), LastInd, InitInp%NInpFreq ) END DO ! K - All columns of RdtnKrnl above and including the diagonal END DO ! J - All rows of RdtnKrnl @@ -312,9 +313,9 @@ SUBROUTINE Conv_Rdtn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, InitOut, E RETURN END IF - DO J = 1,6*p%NBody ! Loop through all rows of RdtnKrnl - DO K = 1,6*p%NBody ! Loop through all columns of RdtnKrnl above and including the diagonal - CALL ApplyCOST( p%RdtnKrnl(:,J,K), FFT_Data, ErrStat ) + DO J = 1,p%NDOF ! Loop through all rows of RdtnKrnl + DO K = 1,p%NDOF ! Loop through all columns of RdtnKrnl above and including the diagonal + CALL ApplyCOST( p%RdtnKrnl(J,K,:), FFT_Data, ErrStat ) IF ( ErrStat /= ErrID_None ) THEN ErrMsg = 'Error applying Cosine Transform' ErrStat = ErrID_Fatal @@ -481,6 +482,7 @@ END SUBROUTINE Conv_Rdtn_UpdateStates !> Routine for computing outputs, used in both loose and tight coupling. SUBROUTINE Conv_Rdtn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) !.................................................................................................................................. + use NWTC_LAPACK, only: LAPACK_gemm REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds TYPE(Conv_Rdtn_InputType), INTENT(IN ) :: u !< Inputs at Time @@ -495,52 +497,60 @@ SUBROUTINE Conv_Rdtn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None -! REAL(ReKi) :: F_Rdtn (6) - REAL(ReKi) :: F_RdtnDT (6*p%NBody) ! The portion of the total load contribution from wave radiation damping associated with the convolution integral proportional to ( RdtnDT - RdtnRmndr ) (N, N-m) + character(*), parameter :: RoutineName = 'Conv_Rdtn_CalcOutput' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + REAL(SiKi), allocatable :: F_RdtnDT(:,:) ! The portion of the total load contribution from wave radiation damping associated with the convolution integral proportional to ( RdtnDT - RdtnRmndr ) (N, N-m) INTEGER :: I ! Generic index INTEGER :: J ! Generic index INTEGER :: K ! Generic index INTEGER(IntKi) :: MaxInd - ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" - - ! Perform numerical convolution to determine the load contribution from wave - ! radiation damping: - MaxInd = MIN(p%NStepRdtn-1,OtherState%IndRdtn) ! Note: xd%IndRdtn index is from the previous time-step since this state was for the previous time-step - DO I = 1,6*p%NBody ! Loop through all wave radiation damping forces and moments - - F_RdtnDT (I) = 0.0 - ! F_RdtnRmndr(I) = 0.0 - - DO J = 1,6*p%NBody ! Loop through all platform DOFs - ! Contribution from the first and last time steps are halved to make the integration 2nd-order accurate - F_RdtnDT(I) = F_RdtnDT(I) - 0.5_SiKi * p%RdtnKrnl(MaxInd,I,J)*xd%XDHistory(0,J) & - - 0.5_SiKi * p%RdtnKrnl(0,I,J)*xd%XDHistory(MaxInd,J) - DO K = 1, MaxInd-1 ! Loop through all remaining NStepRdtn-2 time steps in the radiation Kernel (less than NStepRdtn time steps are used when ZTime < RdtnTmax) - F_RdtnDT(I) = F_RdtnDT(I) - p%RdtnKrnl(MaxInd-K,I,J)*xd%XDHistory(K,J) - END DO - !DO K = MAX(0,xd%IndRdtn-p%NStepRdtn ),xd%IndRdtn-1 ! Loop through all NStepRdtn time steps in the radiation Kernel (less than NStepRdtn time steps are used when ZTime < RdtnTmax) - ! F_RdtnDT (I) = F_RdtnDT (I) - p%RdtnKrnl(xd%IndRdtn-1-K,I,J)*xd%XDHistory(MOD(K,p%NStepRdtn1),J) - !END DO ! K - All NStepRdtn time steps in the radiation Kernel (less than NStepRdtn time steps are used when ZTime < RdtnTmax) - - !DO K = MAX(0,xd%IndRdtn-p%NStepRdtn+1),xd%IndRdtn ! Loop through all NStepRdtn time steps in the radiation Kernel (less than NStepRdtn time steps are used when ZTime < RdtnTmax) - ! F_RdtnRmndr(I) = F_RdtnRmndr(I) - p%RdtnKrnl(xd%IndRdtn -K,I,J)*xd%XDHistory(MOD(K,p%NStepRdtn1),J) - !END DO ! K - All NStepRdtn time steps in the radiation Kernel (less than NStepRdtn time steps are used when ZTime < RdtnTmax) - - END DO ! J - All platform DOFs - - !F_Rdtn (I) = ( p%RdtnDT - xd%RdtnRmndr )*F_RdtnDT(I) + xd%RdtnRmndr*F_RdtnRmndr(I) - - END DO ! I - All wave radiation damping forces and moments - - y%F_Rdtn = p%RdtnDT*F_RdtnDT !F_Rdtn + call AllocAry(F_RdtnDT, p%NDOF, 1, 'F_RdtnDT', ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + ! Perform numerical convolution to determine the load contribution from wave radiation damping: + ! Contribution from the first and last time steps are halved to make the integration 2nd-order accurate + + ! First time step + call LAPACK_gemm('N', 'N', -0.5_SiKi, p%RdtnKrnl(:,:,MaxInd), xd%XDHistory(:,0:0), 0.0_SiKi, F_RdtnDT, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + ! Last time step + call LAPACK_gemm('N', 'N', -0.5_SiKi, p%RdtnKrnl(:,:,0), xd%XDHistory(:,MaxInd:MaxInd), 1.0_SiKi, F_RdtnDT, ErrStat2, ErrMsg2) + + ! Intermediate time steps + do K = 1, MaxInd-1 + call LAPACK_gemm('N', 'N', -1.0_SiKi, p%RdtnKrnl(:,:,MaxInd-K), xd%XDHistory(:,K:K), 1.0_SiKi, F_RdtnDT, ErrStat2, ErrMsg2) + end do + + y%F_Rdtn = p%RdtnDT*real(F_RdtnDT(:,1), ReKi) !F_Rdtn + + ! Loop through all wave radiation damping forces and moments + ! F_RdtnDT = 0.0 + ! DO I = 1,p%NDOF + ! DO J = 1,p%NDOF ! Loop through all platform DOFs + ! ! Contribution from the first and last time steps are halved to make the integration 2nd-order accurate + ! F_RdtnDT(I) = F_RdtnDT(I) - 0.5_SiKi * p%RdtnKrnl(MaxInd,I,J)*xd%XDHistory(0,J) & + ! - 0.5_SiKi * p%RdtnKrnl(0,I,J)*xd%XDHistory(MaxInd,J) + + ! ! Loop through all remaining NStepRdtn-2 time steps in the radiation Kernel (less than NStepRdtn time steps are used when ZTime < RdtnTmax) + ! DO K = 1, MaxInd-1 + ! F_RdtnDT(I) = F_RdtnDT(I) - p%RdtnKrnl(MaxInd-K,I,J)*xd%XDHistory(K,J) + ! END DO + ! END DO ! J - All platform DOFs + ! END DO ! I - All wave radiation damping forces and moments + + ! y%F_Rdtn = p%RdtnDT*F_RdtnDT !F_Rdtn END SUBROUTINE Conv_Rdtn_CalcOutput !---------------------------------------------------------------------------------------------------------------------------------- @@ -634,19 +644,19 @@ SUBROUTINE Conv_Rdtn_UpdateDiscState( Time, n, u, p, x, xd, z, OtherState, m, Er ! When IndRdtn > LastIndRdtn, IndRdtn will be greater than LastIndRdtn + 1 if DT > RdtnDT. IF ( OtherState%IndRdtn < (p%NStepRdtn) ) THEN - DO J = 1,6*p%NBody ! Loop through all platform DOFs - xd%XDHistory(OtherState%IndRdtn,J) = u%Velocity(J) ! XDHistory was allocated as a zero-based array! + DO J = 1,p%NDOF ! Loop through all platform DOFs + xd%XDHistory(J,OtherState%IndRdtn) = u%Velocity(J) ! XDHistory was allocated as a zero-based array! END DO ! J - All platform DOFs ELSE ! Shift the stored history by one index DO K = 0,p%NStepRdtn-2 - DO J = 1,6*p%NBody ! Loop through all DOFs - xd%XDHistory(K,J) = xd%XDHistory(K+1,J) + DO J = 1,p%NDOF ! Loop through all DOFs + xd%XDHistory(J,K) = xd%XDHistory(J,K+1) END DO END DO - DO J = 1,6*p%NBody ! Loop through all platform DOFs - xd%XDHistory(p%NStepRdtn-1,J) = u%Velocity(J) ! Set the last array element to the current velocity + DO J = 1,p%NDOF ! Loop through all platform DOFs + xd%XDHistory(J,p%NStepRdtn-1) = u%Velocity(J) ! Set the last array element to the current velocity END DO ! J - All platform DOFs END IF diff --git a/modules/hydrodyn/src/Conv_Radiation.txt b/modules/hydrodyn/src/Conv_Radiation.txt index 711c028559..3ec357e44b 100644 --- a/modules/hydrodyn/src/Conv_Radiation.txt +++ b/modules/hydrodyn/src/Conv_Radiation.txt @@ -21,6 +21,7 @@ include Registry_NWTC_Library.txt typedef Conv_Radiation/Conv_Rdtn InitInputType DbKi RdtnDT - - - "" - typedef ^ ^ CHARACTER(80) RdtnDTChr typedef ^ ^ INTEGER NBody - - - "[>=1; only used when PotMod=1. If NBodyMod=1, the WAMIT data contains a vector of size 6*NBody x 1 and matrices of size 6*NBody x 6*NBody; if NBodyMod>1, there are NBody sets of WAMIT data each with a vector of size 6 x 1 and matrices of size 6 x 6]" - +typedef ^ ^ INTEGER NDOF - - - "Total number of degrees of freedom for all bodies including AddDOF" - typedef ^ ^ ReKi HighFreq - - - "" - typedef ^ ^ CHARACTER(1024) WAMITFile - - - "" - typedef ^ ^ SiKi HdroAddMs {:}{:}{:} - - "" - @@ -43,7 +44,7 @@ typedef ^ ContinuousStateType SiKi # # Define discrete (nondifferentiable) states here: # -typedef ^ DiscreteStateType ReKi XDHistory {:}{:} - - "" - +typedef ^ DiscreteStateType SiKi XDHistory {:}{:} - - "" - typedef ^ ^ DbKi LastTime - - - "" - # # @@ -68,6 +69,7 @@ typedef ^ MiscVarType INTEGER typedef ^ ParameterType DbKi DT - - - "Time step for continuous state integration & discrete state update" seconds typedef ^ ^ DbKi RdtnDT - - - "" - typedef ^ ^ INTEGER NBody - - - "[>=1; only used when PotMod=1. If NBodyMod=1, the WAMIT data contains a vector of size 6*NBody x 1 and matrices of size 6*NBody x 6*NBody; if NBodyMod>1, there are NBody sets of WAMIT data each with a vector of size 6 x 1 and matrices of size 6 x 6]" - +typedef ^ ^ INTEGER NDOF - - - "Total number of degrees of freedom for all bodies including AddDOF" - typedef ^ ^ SiKi RdtnKrnl {:}{:}{:} - - "" - typedef ^ ^ INTEGER NStepRdtn - - - "" - typedef ^ ^ INTEGER NStepRdtn1 - - - "" - diff --git a/modules/hydrodyn/src/Conv_Radiation_Types.f90 b/modules/hydrodyn/src/Conv_Radiation_Types.f90 index 4104c950b5..dd2c0902a2 100644 --- a/modules/hydrodyn/src/Conv_Radiation_Types.f90 +++ b/modules/hydrodyn/src/Conv_Radiation_Types.f90 @@ -38,6 +38,7 @@ MODULE Conv_Radiation_Types REAL(DbKi) :: RdtnDT = 0.0_R8Ki !< [-] CHARACTER(80) :: RdtnDTChr INTEGER(IntKi) :: NBody = 0_IntKi !< [>=1; only used when PotMod=1. If NBodyMod=1, the WAMIT data contains a vector of size 6*NBody x 1 and matrices of size 6*NBody x 6*NBody; if NBodyMod>1, there are NBody sets of WAMIT data each with a vector of size 6 x 1 and matrices of size 6 x 6] [-] + INTEGER(IntKi) :: NDOF = 0_IntKi !< Total number of degrees of freedom for all bodies including AddDOF [-] REAL(ReKi) :: HighFreq = 0.0_ReKi !< [-] CHARACTER(1024) :: WAMITFile !< [-] REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: HdroAddMs !< [-] @@ -59,7 +60,7 @@ MODULE Conv_Radiation_Types ! ======================= ! ========= Conv_Rdtn_DiscreteStateType ======= TYPE, PUBLIC :: Conv_Rdtn_DiscreteStateType - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: XDHistory !< [-] + REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: XDHistory !< [-] REAL(DbKi) :: LastTime = 0.0_R8Ki !< [-] END TYPE Conv_Rdtn_DiscreteStateType ! ======================= @@ -83,6 +84,7 @@ MODULE Conv_Radiation_Types REAL(DbKi) :: DT = 0.0_R8Ki !< Time step for continuous state integration & discrete state update [seconds] REAL(DbKi) :: RdtnDT = 0.0_R8Ki !< [-] INTEGER(IntKi) :: NBody = 0_IntKi !< [>=1; only used when PotMod=1. If NBodyMod=1, the WAMIT data contains a vector of size 6*NBody x 1 and matrices of size 6*NBody x 6*NBody; if NBodyMod>1, there are NBody sets of WAMIT data each with a vector of size 6 x 1 and matrices of size 6 x 6] [-] + INTEGER(IntKi) :: NDOF = 0_IntKi !< Total number of degrees of freedom for all bodies including AddDOF [-] REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: RdtnKrnl !< [-] INTEGER(IntKi) :: NStepRdtn = 0_IntKi !< [-] INTEGER(IntKi) :: NStepRdtn1 = 0_IntKi !< [-] @@ -98,7 +100,11 @@ MODULE Conv_Radiation_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_Rdtn !< [-] END TYPE Conv_Rdtn_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: Conv_Rdtn_x_DummyContState = 1 ! Conv_Rdtn%DummyContState + integer(IntKi), public, parameter :: Conv_Rdtn_u_Velocity = 2 ! Conv_Rdtn%Velocity + integer(IntKi), public, parameter :: Conv_Rdtn_y_F_Rdtn = 3 ! Conv_Rdtn%F_Rdtn + +contains subroutine Conv_Rdtn_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(Conv_Rdtn_InitInputType), intent(in) :: SrcInitInputData @@ -114,6 +120,7 @@ subroutine Conv_Rdtn_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, DstInitInputData%RdtnDT = SrcInitInputData%RdtnDT DstInitInputData%RdtnDTChr = SrcInitInputData%RdtnDTChr DstInitInputData%NBody = SrcInitInputData%NBody + DstInitInputData%NDOF = SrcInitInputData%NDOF DstInitInputData%HighFreq = SrcInitInputData%HighFreq DstInitInputData%WAMITFile = SrcInitInputData%WAMITFile if (allocated(SrcInitInputData%HdroAddMs)) then @@ -182,6 +189,7 @@ subroutine Conv_Rdtn_PackInitInput(RF, Indata) call RegPack(RF, InData%RdtnDT) call RegPack(RF, InData%RdtnDTChr) call RegPack(RF, InData%NBody) + call RegPack(RF, InData%NDOF) call RegPack(RF, InData%HighFreq) call RegPack(RF, InData%WAMITFile) call RegPackAlloc(RF, InData%HdroAddMs) @@ -203,6 +211,7 @@ subroutine Conv_Rdtn_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%RdtnDT); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RdtnDTChr); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NBody); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NDOF); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HighFreq); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WAMITFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%HdroAddMs); if (RegCheckErr(RF, RoutineName)) return @@ -476,6 +485,7 @@ subroutine Conv_Rdtn_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, Er DstParamData%DT = SrcParamData%DT DstParamData%RdtnDT = SrcParamData%RdtnDT DstParamData%NBody = SrcParamData%NBody + DstParamData%NDOF = SrcParamData%NDOF if (allocated(SrcParamData%RdtnKrnl)) then LB(1:3) = lbound(SrcParamData%RdtnKrnl) UB(1:3) = ubound(SrcParamData%RdtnKrnl) @@ -512,6 +522,7 @@ subroutine Conv_Rdtn_PackParam(RF, Indata) call RegPack(RF, InData%DT) call RegPack(RF, InData%RdtnDT) call RegPack(RF, InData%NBody) + call RegPack(RF, InData%NDOF) call RegPackAlloc(RF, InData%RdtnKrnl) call RegPack(RF, InData%NStepRdtn) call RegPack(RF, InData%NStepRdtn1) @@ -529,6 +540,7 @@ subroutine Conv_Rdtn_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RdtnDT); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NBody); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NDOF); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%RdtnKrnl); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NStepRdtn); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NStepRdtn1); if (RegCheckErr(RF, RoutineName)) return @@ -971,5 +983,220 @@ SUBROUTINE Conv_Rdtn_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrSt y_out%F_Rdtn = a1*y1%F_Rdtn + a2*y2%F_Rdtn + a3*y3%F_Rdtn END IF ! check if allocated END SUBROUTINE + +function Conv_Rdtn_InputMeshPointer(u, DL) result(Mesh) + type(Conv_Rdtn_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function Conv_Rdtn_OutputMeshPointer(y, DL) result(Mesh) + type(Conv_Rdtn_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine Conv_Rdtn_VarsPackContState(Vars, x, ValAry) + type(Conv_Rdtn_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call Conv_Rdtn_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine Conv_Rdtn_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(Conv_Rdtn_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Conv_Rdtn_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Conv_Rdtn_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Conv_Rdtn_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call Conv_Rdtn_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine Conv_Rdtn_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Conv_Rdtn_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Conv_Rdtn_x_DummyContState) + x%DummyContState = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function Conv_Rdtn_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Conv_Rdtn_x_DummyContState) + Name = "x%DummyContState" + case default + Name = "Unknown Field" + end select +end function + +subroutine Conv_Rdtn_VarsPackContStateDeriv(Vars, x, ValAry) + type(Conv_Rdtn_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call Conv_Rdtn_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine Conv_Rdtn_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(Conv_Rdtn_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Conv_Rdtn_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Conv_Rdtn_VarsPackInput(Vars, u, ValAry) + type(Conv_Rdtn_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call Conv_Rdtn_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine Conv_Rdtn_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(Conv_Rdtn_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Conv_Rdtn_u_Velocity) + VarVals = u%Velocity(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Conv_Rdtn_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Conv_Rdtn_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call Conv_Rdtn_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine Conv_Rdtn_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Conv_Rdtn_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Conv_Rdtn_u_Velocity) + u%Velocity(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function Conv_Rdtn_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Conv_Rdtn_u_Velocity) + Name = "u%Velocity" + case default + Name = "Unknown Field" + end select +end function + +subroutine Conv_Rdtn_VarsPackOutput(Vars, y, ValAry) + type(Conv_Rdtn_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call Conv_Rdtn_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine Conv_Rdtn_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(Conv_Rdtn_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Conv_Rdtn_y_F_Rdtn) + VarVals = y%F_Rdtn(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Conv_Rdtn_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Conv_Rdtn_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call Conv_Rdtn_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine Conv_Rdtn_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Conv_Rdtn_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Conv_Rdtn_y_F_Rdtn) + y%F_Rdtn(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function Conv_Rdtn_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Conv_Rdtn_y_F_Rdtn) + Name = "y%F_Rdtn" + case default + Name = "Unknown Field" + end select +end function + END MODULE Conv_Radiation_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/hydrodyn/src/HydroDyn.f90 b/modules/hydrodyn/src/HydroDyn.f90 index 2412cacfa5..2fe891c0d2 100644 --- a/modules/hydrodyn/src/HydroDyn.f90 +++ b/modules/hydrodyn/src/HydroDyn.f90 @@ -73,8 +73,8 @@ MODULE HydroDyn PUBLIC :: HD_JacobianPConstrState ! Routine to compute the Jacobians of the output(Y), continuous - (X), discrete - ! (Xd), and constraint - state(Z) functions all with respect to the constraint ! states(z) - PUBLIC :: HD_GetOP !< Routine to pack the operating point values (for linearization) into arrays - + PUBLIC :: HD_PackExtInputAry ! Pack extended inputs + CONTAINS !---------------------------------------------------------------------------------------------------------------------------------- @@ -110,10 +110,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I CHARACTER(1024) :: SummaryName ! name of the HydroDyn summary file TYPE(HydroDyn_InputFile) :: InputFileData !< Data from input file TYPE(FileInfoType) :: InFileInfo !< The derived type for holding the full input file for parsing -- we may pass this in the future -! LOGICAL :: hasWAMITOuts ! Are there any WAMIT-related outputs -! LOGICAL :: hasMorisonOuts ! Are there any Morison-related outputs -! INTEGER :: numHydroOuts ! total number of WAMIT and Morison outputs - INTEGER :: I, J, k, iBody ! Generic counters + INTEGER :: I, J, k, iBody, jBody, iWAMIT ! Generic counters ! These are dummy variables to satisfy the framework, but are not used @@ -295,8 +292,6 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I InputFileData%WAMIT%PlatformPos = InitInp%PlatformPos ! Initial platform/HD origin position p%NBody = InputFileData%NBody p%NBodyMod = InputFileData%NBodyMod - call AllocAry( m%F_PtfmAdd, 6*InputFileData%NBody, "m%F_PtfmAdd", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call AllocAry( m%F_Waves , 6*InputFileData%NBody, "m%F_Waves" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! Determine how many WAMIT modules we need based on NBody and NBodyMod if (p%NBodyMod == 1) then @@ -310,6 +305,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I call AllocAry( InputFileData%WAMIT%PtfmRefztRot, InputFileData%NBody, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) call AllocAry( InputFileData%WAMIT%PtfmCOBxt , InputFileData%NBody, "PtfmCOBxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) call AllocAry( InputFileData%WAMIT%PtfmCOByt , InputFileData%NBody, "PtfmCOByt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%NAddDOF , InputFileData%NBody, "NAddDOF" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) allocate( p%WAMIT( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array p%WAMIT.', ErrStat, ErrMsg, RoutineName ) allocate( x%WAMIT( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array x%WAMIT.', ErrStat, ErrMsg, RoutineName ) allocate( xd%WAMIT( 1), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array xd%WAMIT.', ErrStat, ErrMsg, RoutineName ) @@ -326,6 +322,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I InputFileData%WAMIT%PtfmRefztRot = InputFileData%PtfmRefztRot InputFileData%WAMIT%PtfmCOBxt = InputFileData%PtfmCOBxt InputFileData%WAMIT%PtfmCOByt = InputFileData%PtfmCOByt + InputFileData%WAMIT%NAddDOF = InputFileData%NAddDOF else InputFileData%WAMIT%NBody = 1 ! Each WAMIT object will only contain one of the NBody WAMIT bodies @@ -337,6 +334,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I call AllocAry( InputFileData%WAMIT%PtfmRefztRot, 1, "PtfmRefztRot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) call AllocAry( InputFileData%WAMIT%PtfmCOBxt , 1, "PtfmCOBxt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) call AllocAry( InputFileData%WAMIT%PtfmCOByt , 1, "PtfmCOByt" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( InputFileData%WAMIT%NAddDOF , 1, "NAddDOF" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) allocate( p%WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array p%WAMIT.', ErrStat, ErrMsg, RoutineName ) allocate( x%WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array x%WAMIT.', ErrStat, ErrMsg, RoutineName ) allocate( xd%WAMIT( InputFileData%NBody), stat = ErrStat2 ); if (ErrStat2 /=0) call SetErrStat( ErrID_Fatal, 'Failed to allocate array xd%WAMIT.', ErrStat, ErrMsg, RoutineName ) @@ -352,6 +350,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I InputFileData%WAMIT%PtfmRefztRot(1) = InputFileData%PtfmRefztRot(1) InputFileData%WAMIT%PtfmCOBxt (1) = InputFileData%PtfmCOBxt (1) InputFileData%WAMIT%PtfmCOByt (1) = InputFileData%PtfmCOByt (1) + InputFileData%WAMIT%NAddDOF (1) = InputFileData%NAddDOF (1) end if @@ -360,7 +359,6 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I return end if - CALL WAMIT_Init(InputFileData%WAMIT, m%u_WAMIT(1), p%WAMIT(1), x%WAMIT(1), xd%WAMIT(1), z%WAMIT, OtherState%WAMIT(1), & y%WAMIT(1), m%WAMIT(1), Interval, ErrStat2, ErrMsg2 ) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) @@ -370,7 +368,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I END IF - ! For NBodyMod > 1 and NBody > 1, set the body info and init the WAMIT body + ! For NBodyMod > 1 and NBody > 1, set the body info and init the WAMIT body do i = 2, p%nWAMITObj !----------------------------------------- ! Initialize the WAMIT Calculations @@ -384,6 +382,7 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I InputFileData%WAMIT%PtfmRefztRot(1) = InputFileData%PtfmRefztRot(i) InputFileData%WAMIT%PtfmCOBxt (1) = InputFileData%PtfmCOBxt (i) InputFileData%WAMIT%PtfmCOByt (1) = InputFileData%PtfmCOByt (i) + InputFileData%WAMIT%NAddDOF (1) = InputFileData%NAddDOF (i) CALL WAMIT_Init(InputFileData%WAMIT, m%u_WAMIT(i), p%WAMIT(i), x%WAMIT(i), xd%WAMIT(i), z%WAMIT, OtherState%WAMIT(i), & y%WAMIT(i), m%WAMIT(i), Interval, ErrStat2, ErrMsg2 ) @@ -393,6 +392,28 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I RETURN END IF end do + + ! Initialize parameters and input/output arrays associated with generalized DOF + call AllocAry( p%NAddDOF , p%NBody, 'p%NAddDOF' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( p%BDOFStrt, p%NBody, 'p%BDOFStrt', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + p%NAddDOF = InputFileData%WAMIT%NAddDOF + p%NDOF = 0_IntKi + do iBody = 1, p%NBody + p%BDOFStrt(iBody) = p%NDOF + 1_IntKi + p%NDOF = p%NDOF + 6_IntKi + p%NAddDOF(iBody) + end do + p%HasAddDOF = ( p%NDOF > 6*p%NBody ) + + if (p%HasAddDOF) then + call AllocAry( u%qAddDOF , p%NDOF-6*p%NBody, "u%qAddDOF" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( u%qAddDOFDot , p%NDOF-6*p%NBody, "u%qAddDOFDot" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( u%qAddDOFDotDot, p%NDOF-6*p%NBody, "u%qAddDOFDotDot", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( y%FAddDOF , p%NDOF-6*p%NBody, "y%FAddDOF" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + end if + + ! Initialize misc arrays for output files + call AllocAry( m%F_PtfmAdd, p%NDOF, "m%F_PtfmAdd", ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call AllocAry( m%F_Waves , p%NDOF, "m%F_Waves" , ErrStat2, ErrMsg2 ); call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! Generate Summary file information for WAMIT module ! Compute the load contribution from hydrostatics: @@ -578,77 +599,71 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I !=============================================== p%PotMod = InputFileData%Potmod IF ( InputFileData%UnSum > 0 ) THEN - - + IF ( InputFileData%PotMod == 1 .AND. InputFileData%WAMIT%RdtnMod == 1) THEN ! Write the header for this section: Note: When NBodyMod = 1 the kernel is now 6*NBody by 6*Nbody in size, ! and we have NBody 6 by 6 kernels for NBodyMod=2 or 3 - if (p%NBodyMod == 1) then + ! if (p%NBodyMod == 1) then ! NBodyMod=1 kernel printout which is 6*NBody x 6*NBody long - WRITE( InputFileData%UnSum, '(//)' ) - WRITE( InputFileData%UnSum, '(A)' ) 'Radiation memory effect kernel' - WRITE( InputFileData%UnSum, '(//)' ) - + WRITE( InputFileData%UnSum, '(//)' ) + WRITE( InputFileData%UnSum, '(A)' ) 'Radiation memory effect kernel' + WRITE( InputFileData%UnSum, '(//)' ) + + do iWAMIT = 1,p%nWAMITObj WRITE( InputFileData%UnSum, '(1X,A10,2X,A10)',ADVANCE='no' ) ' n ' , ' t ' - do i = 1,6*p%NBody - do j = 1,6*p%NBody - WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) 'K'//trim(num2lstr(i))//trim(num2lstr(j)) + do i = 1,p%WAMIT(iWAMIT)%NDOF + do j = 1,p%WAMIT(iWAMIT)%NDOF + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) 'K('//trim(num2lstr(i))//','//trim(num2lstr(j))//')' end do end do write(InputFileData%UnSum,'()') ! end of line character - - - WRITE( InputFileData%UnSum, '(1X,A10,2X,A10)',ADVANCE='no' ) ' (-) ' , ' (s) ' - do i = 1,6*p%NBody - do j = 1,6*p%NBody - if ( mod(i-1,6)+1 < 4 ) then - if ( mod(j-1,6)+1 < 4 ) then - WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kg/s^2) ' - else + + WRITE( InputFileData%UnSum, '(1X,A10,2X,A10)',ADVANCE='no' ) ' (-) ' , ' (s) ' + do i = 1,p%WAMIT(iWAMIT)%NDOF + do iBody = 1,p%WAMIT(iWAMIT)%NBody-1_IntKi + if ( p%WAMIT(iWAMIT)%BDOFStrt(iBody+1_IntKi)>i ) exit + end do + if ( p%WAMIT(iWAMIT)%BDOFStrt(p%WAMIT(iWAMIT)%NBody)<=i ) iBody = p%WAMIT(iWAMIT)%NBody + do j = 1,p%WAMIT(iWAMIT)%NDOF + do jBody = 1,p%WAMIT(iWAMIT)%NBody-1_IntKi + if ( p%WAMIT(iWAMIT)%BDOFStrt(jBody+1_IntKi)>j ) exit + end do + if ( p%WAMIT(iWAMIT)%BDOFStrt(p%WAMIT(iWAMIT)%NBody)<=j ) jBody = p%WAMIT(iWAMIT)%NBody + if ( i-p%WAMIT(iWAMIT)%BDOFStrt(iBody) < 3_IntKi ) then + if ( j-p%WAMIT(iWAMIT)%BDOFStrt(jBody) < 3_IntKi ) then + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kg/s^2) ' + else if ( j-p%WAMIT(iWAMIT)%BDOFStrt(jBody) < 6_IntKi ) then WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kgm/s^2) ' + else + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (-) ' end if - else - if ( mod(j-1,6)+1 < 4 ) then + else if ( i-p%WAMIT(iWAMIT)%BDOFStrt(iBody) < 6_IntKi ) then + if ( j-p%WAMIT(iWAMIT)%BDOFStrt(jBody) < 3_IntKi ) then WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (kgm/s^2) ' - else + else if ( j-p%WAMIT(iWAMIT)%BDOFStrt(jBody) < 6_IntKi ) then WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) '(kgm^2/s^2)' - end if + else + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (-) ' + end if + else + WRITE( InputFileData%UnSum, '(2X,A16)',ADVANCE='no' ) ' (-) ' end if end do end do write(InputFileData%UnSum,'()') ! end of line character - - do k= 0,p%WAMIT(1)%Conv_Rdtn%NStepRdtn-1 - WRITE( InputFileData%UnSum, '(1X,I10,2X,E12.5)',ADVANCE='no' ) K, K*p%WAMIT(1)%Conv_Rdtn%RdtnDT - do i = 1,6*p%NBody - do j = 1,6*p%NBody - WRITE( InputFileData%UnSum, '(2X,ES16.5)',ADVANCE='no' ) p%WAMIT(1)%Conv_Rdtn%RdtnKrnl(k,i,j) + + do k= 0,p%WAMIT(iWAMIT)%Conv_Rdtn%NStepRdtn-1 + WRITE( InputFileData%UnSum, '(1X,I10,2X,E12.5)',ADVANCE='no' ) K, K*p%WAMIT(iWAMIT)%Conv_Rdtn%RdtnDT + do i = 1,p%WAMIT(iWAMIT)%NDOF + do j = 1,p%WAMIT(iWAMIT)%NDOF + WRITE( InputFileData%UnSum, '(2X,ES16.5)',ADVANCE='no' ) p%WAMIT(iWAMIT)%Conv_Rdtn%RdtnKrnl(i,j,k) end do end do write(InputFileData%UnSum,'()') ! end of line character end do - - else - do j = 1,p%nWAMITObj - WRITE( InputFileData%UnSum, '(//)' ) - WRITE( InputFileData%UnSum, '(A)' ) 'Radiation memory effect kernel' - WRITE( InputFileData%UnSum, '(//)' ) - WRITE( InputFileData%UnSum, '(1X,A10,2X,A10,21(2X,A16))' ) ' n ' , ' t ', ' K11 ', ' K12 ', ' K13 ', ' K14 ', ' K15 ', ' K16 ', ' K22 ', ' K23 ', ' K24 ', ' K25 ', ' K26 ', ' K33 ', ' K34 ', ' K35 ', 'K36 ', ' K44 ', ' K45 ', ' K46 ', ' K55 ', ' K56 ', ' K66 ' - WRITE( InputFileData%UnSum, '(1X,A10,2X,A10,21(2X,A16))' ) ' (-) ' , ' (s) ', ' (kg/s^2) ', ' (kg/s^2) ', ' (kg/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kg/s^2) ', ' (kg/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kg/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', ' (kgm/s^2) ', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)', '(kgm^2/s^2)' - - ! Write the data - DO I = 0,p%WAMIT(j)%Conv_Rdtn%NStepRdtn-1 - WRITE( InputFileData%UnSum, '(1X,I10,2X,E12.5,21(2X,ES16.5))' ) I, I*p%WAMIT(j)%Conv_Rdtn%RdtnDT, & - p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,1), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,2), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,3), & - p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,4), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,5), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,1,6), & - p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,2,2), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,2,3), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,2,4), & - p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,2,5), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,2,6), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,3,3), & - p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,3,4), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,3,5), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,3,6), & - p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,4,4), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,4,5), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,4,6), & - p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,5,5), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,5,6), p%WAMIT(j)%Conv_Rdtn%RdtnKrnl(I,6,6) - END DO - end do - end if + + end do + END IF END IF @@ -838,12 +853,11 @@ SUBROUTINE HydroDyn_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, I !............................................................................................ - ! Initialize Jacobian: + ! Module Variables: !............................................................................................ - if (InitInp%Linearize) then - call HD_Init_Jacobian( p, u, y, InitOut, ErrStat2, ErrMsg2) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end if + + call HydroDyn_InitVars(InitOut%Vars, u, p, x, y, m, InitOut, InputFileData, InitInp%Linearize, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF ( p%OutSwtch == 1 ) THEN ! Only HD-level output writing ! HACK WE can tell FAST not to write any HD outputs by simply deallocating the WriteOutputHdr array! @@ -932,6 +946,178 @@ SUBROUTINE HydroDyn_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) END SUBROUTINE HydroDyn_End +subroutine HydroDyn_InitVars(Vars, u, p, x, y, m, InitOut, InputFileData, Linearize, ErrStat, ErrMsg) + type(ModVarsType), intent(out) :: Vars !< Module variables + type(HydroDyn_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(HydroDyn_ParameterType), intent(inout) :: p !< Parameters + type(HydroDyn_ContinuousStateType), intent(inout) :: x !< Continuous state + type(HydroDyn_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(HydroDyn_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(HydroDyn_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + type(HydroDyn_InputFile), intent(in) :: InputFileData !< Input file data + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'HydroDyn_InitVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i, j, k + real(R8Ki) :: PerturbTrans, PerturbRot, Perturbs(6) + character(10) :: BodyDesc + character(10), parameter :: dofLabels(6) = & + ['PtfmSg', 'PtfmSw', 'PtfmHv', 'PtfmR ', 'PtfmP ', 'PtfmY '] + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + ! Need to determine how many wamit body objects there are + p%totalExctnStates = 0 + p%totalRdtnStates = 0 + do j = 1, p%nWAMITObj + p%totalExctnStates = p%totalExctnStates + p%WAMIT(j)%SS_Exctn%numStates ! numStates defaults to zero in the case where ExctnMod = 0 instead of 2 + p%totalRdtnStates = p%totalRdtnStates + p%WAMIT(j)%SS_Rdtn%numStates ! numStates defaults to zero in the case where RdtnMod = 0 instead of 2 + end do + p%totalStates = p%totalExctnStates + p%totalRdtnStates + + ! Initialize body description to empty + BodyDesc = "" + + ! Get excitation + do k = 1, p%nWAMITObj + if (p%WAMIT(k)%SS_Exctn%numStates == 0) cycle + if (p%NBody > 1) BodyDesc = 'B'//trim(Num2LStr(k)) + call MV_AddVar(Vars%x, "WAMIT("//trim(Num2LStr(k))//")%SS_Exctn", FieldScalar, & + DatLoc(HydroDyn_x_WAMIT_SS_Exctn_x, k), & + Flags=VF_DerivOrder1, & + Num=p%WAMIT(k)%SS_Exctn%numStates, & + Perturb=20000.0_R8Ki * D2R_D, & + LinNames=[((trim(BodyDesc)//'Exctn'//trim(dofLabels(j))//Num2LStr(i), i = 1, p%WAMIT(k)%SS_Exctn%spDOF(j)), j = 1, 6)]) + end do + + do k = 1, p%nWAMITObj + if (p%WAMIT(k)%SS_Rdtn%numStates == 0) cycle + if (p%NBody > 1) BodyDesc = 'B'//trim(Num2LStr(k)) + call MV_AddVar(Vars%x, "WAMIT("//trim(Num2LStr(k))//")%SS_Rdtn", FieldScalar, & + DatLoc(HydroDyn_x_WAMIT_SS_Rdtn_x, k), & + Flags=VF_DerivOrder1, & + Num=p%WAMIT(k)%SS_Rdtn%numStates, & + Perturb=2.0_R8Ki * D2R_D , & + LinNames=[((trim(BodyDesc)//'Rdtn'//trim(dofLabels(j))//Num2LStr(i), i = 1, p%WAMIT(k)%SS_Rdtn%spDOF(j)), j = 1, 6)]) + end do + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + ! Translation and rotation perturbations + PerturbTrans = 0.02_R8Ki*D2R * max(real(p%WaveField%EffWtrDpth, R8Ki), 1.0_R8Ki) + PerturbRot = 2*D2R + + ! Create perturbation array (order based on MotionFields) + Perturbs = [PerturbTrans, & ! FieldTransDisp + PerturbRot, & ! FieldOrientation + PerturbTrans, & ! FieldTransVel + PerturbRot, & ! FieldAngularVel + PerturbTrans, & ! FieldTransAcc + PerturbRot] ! FieldAngularAcc + + call MV_AddMeshVar(Vars%u, "Morison", MotionFields, DatLoc(HydroDyn_u_Morison_Mesh), u%Morison%Mesh, & + Perturbs=Perturbs) + + call MV_AddMeshVar(Vars%u, "WAMIT", MotionFields, DatLoc(HydroDyn_u_WAMITMesh), u%WAMITMesh, & + Perturbs=Perturbs) + + call MV_AddMeshVar(Vars%u, "Platform-RefPt", MotionFields, DatLoc(HydroDyn_u_PRPMesh), u%PRPMesh, & + Perturbs=Perturbs) + + if (p%HasAddDOF) then + call MV_AddVar(Vars%u, "qAddDOF", FieldScalar, & + DL=DatLoc(HydroDyn_u_qAddDOF), & + Num=size(u%qAddDOF), & + Flags = ior(VF_Linearize,VF_Solve), & + Perturb = PerturbRot, & + LinNames=[('Generalized DOF '//trim(num2lstr(i))//' displacement, -', i=1,size(u%qAddDOF))]) + + call MV_AddVar(Vars%u, "qAddDOFDot", FieldScalar, & + DL=DatLoc(HydroDyn_u_qAddDOFDot), & + Num=size(u%qAddDOFDot), & + Flags = ior(VF_Linearize,VF_Solve), & + Perturb = PerturbRot, & + LinNames=[('Generalized DOF '//trim(num2lstr(i))//' velocity, -/s', i=1,size(u%qAddDOFDot))]) + + call MV_AddVar(Vars%u, "qAddDOFDotDot", FieldScalar, & + DL=DatLoc(HydroDyn_u_qAddDOFDotDot), & + Num=size(u%qAddDOFDotDot), & + Flags = ior(VF_Linearize,VF_Solve), & + Perturb = PerturbRot, & + LinNames=[('Generalized DOF '//trim(num2lstr(i))//' acceleration, -/s^2', i=1,size(u%qAddDOFDotDot))]) + end if + + call MV_AddVar(Vars%u, "WaveElev0", FieldScalar, DatLoc(HydroDyn_u_WaveElev0), & + Flags=VF_ExtLin + VF_Linearize, & + LinNames=['Extended input: wave elevation at platform ref point, m']) + + call MV_AddVar(Vars%u, "HWindSpeed", FieldScalar, DatLoc(HydroDyn_u_HWindSpeed), & + Flags=VF_ExtLin + VF_Linearize, & + LinNames=['Extended input: horizontal current speed (steady/uniform wind), m/s']) + + call MV_AddVar(Vars%u, "PLexp", FieldScalar, DatLoc(HydroDyn_u_PLexp), & + Flags=VF_ExtLin + VF_Linearize, & + LinNames=['Extended input: vertical power-law shear exponent, -']) + + call MV_AddVar(Vars%u, "PropagationDir", FieldScalar, DatLoc(HydroDyn_u_PropagationDir), & + Flags=VF_ExtLin + VF_Linearize, & + LinNames=['Extended input: propagation direction, rad']) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%y, "MorisonLoads", LoadFields, DatLoc(HydroDyn_y_Morison_Mesh), y%Morison%Mesh) + + call MV_AddMeshVar(Vars%y, "WAMITLoads", LoadFields, DatLoc(HydroDyn_y_WAMITMesh), y%WAMITMesh) + + if ( p%HasAddDOF ) then + call MV_AddVar(Vars%y, "FAddDOF", FieldScalar, & + DL=DatLoc(HydroDyn_y_FAddDOF), & + Num=size(y%FAddDOF), & + Flags=VF_Solve, & + LinNames=[('Generalized DOF '//trim(num2lstr(i))//' force, -', i=1,size(y%FAddDOF))]) + end if + + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, DatLoc(HydroDyn_y_WriteOutput), & + Flags=VF_WriteOut, & + Num=p%NumTotalOuts, & + LinNames=[(WriteOutputLinName(i), i = 1, p%NumTotalOuts)]) + + !---------------------------------------------------------------------------- + ! Initialize Variables and Jacobian data + !---------------------------------------------------------------------------- + + call MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call HydroDyn_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call HydroDyn_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call HydroDyn_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call HydroDyn_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + +contains + character(LinChanLen) function WriteOutputLinName(idx) + integer(IntKi), intent(in) :: idx + WriteOutputLinName = trim(InitOut%WriteOutputHdr(idx))//', '//trim(InitOut%WriteOutputUnt(idx)) + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- !> Loose coupling routine for solving constraint states, integrating continuous states, and updating discrete states. @@ -957,6 +1143,7 @@ SUBROUTINE HydroDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherSt ! Local variables INTEGER :: I, iWAMIT ! Generic loop counters + INTEGER :: AddDOFCntr INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (secondary error) CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None INTEGER :: nTime ! number of inputs @@ -1050,73 +1237,103 @@ SUBROUTINE HydroDyn_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherSt IF ( p%PotMod == 0 ) THEN RETURN ELSEIF ( p%PotMod == 1 ) THEN - - ALLOCATE( Inputs_WAMIT(nTime), STAT = ErrStat2 ) - IF (ErrStat2 /=0) THEN - CALL SetErrStat( ErrID_Fatal, 'Failed to allocate array Inputs_WAMIT.', ErrStat, ErrMsg, RoutineName ) - RETURN - END IF if ( p%NBodyMod == 1 .or. p%NBody == 1 ) then + + ALLOCATE( Inputs_WAMIT(nTime), STAT = ErrStat2 ) + IF (ErrStat2 /=0) THEN + CALL SetErrStat( ErrID_Fatal, 'Failed to allocate array Inputs_WAMIT.', ErrStat, ErrMsg, RoutineName ) + RETURN + END IF + ! For this NBodyMod or NBody=1, there is only one WAMIT object, so copy the necessary inputs and then call WAMIT_UpdateStates do I=1,nTime - ! Copy the inputs from the HD mesh into the WAMIT mesh + ! Copy the inputs from the HD mesh into the WAMIT mesh call MeshCopy( Inputs(I)%WAMITMesh, Inputs_WAMIT(I)%Mesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! Inputs_WAMIT(I)%PtfmRefY = Inputs(I)%PtfmRefY Inputs_WAMIT(I)%PtfmRefY = xd%PtfmRefY(I) + if (p%HasAddDOF) then + call AllocAry( Inputs_WAMIT(I)%qAddDOF, p%NDOF-6*p%NBody, 'u%qAddDOF' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( Inputs_WAMIT(I)%qAddDOFDot, p%NDOF-6*p%NBody, 'u%qAddDOFDot' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( Inputs_WAMIT(I)%qAddDOFDotDot, p%NDOF-6*p%NBody, 'u%qAddDOFDotDot' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Inputs_WAMIT(I)%qAddDOF = Inputs(I)%qAddDOF + Inputs_WAMIT(I)%qAddDOFDot = Inputs(I)%qAddDOFDot + Inputs_WAMIT(I)%qAddDOFDotDot = Inputs(I)%qAddDOFDotDot + end if end do - - if (ErrStat < AbortErrLev) then ! if there was an error copying the input meshes, we'll skip this step and then cleanup the temporary input meshes - ! Update the WAMIT module states - - call WAMIT_UpdateStates( t, n, Inputs_WAMIT, InputTimes, p%WAMIT(1), x%WAMIT(1), xd%WAMIT(1), z%WAMIT, OtherState%WAMIT(1), m%WAMIT(1), ErrStat2, ErrMsg2 ) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (ErrStat > AbortErrLev) return + + ! Update the WAMIT module states + call WAMIT_UpdateStates( t, n, Inputs_WAMIT, InputTimes, p%WAMIT(1), x%WAMIT(1), xd%WAMIT(1), z%WAMIT, OtherState%WAMIT(1), m%WAMIT(1), ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (ErrStat > AbortErrLev) return + + ! deallocate temporary inputs + do I=1,nTime + call WAMIT_DestroyInput( Inputs_WAMIT(I), ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + end do + deallocate(Inputs_WAMIT) - end if - else ! We have multiple WAMIT objects - ! Loop over number of inputs and copy them into an array of WAMIT inputs + ! Loop over number of inputs and copy them into an array of WAMIT inputs + AddDOFCntr = 0_IntKi do iWAMIT = 1, p%nWAMITObj - + + ! We can't reuse Inputs_WAMIT for different WAMIT objects now because the size of qAddDOF, qAddDOFDot, and qAddDOFDotDot can be different + ALLOCATE( Inputs_WAMIT(nTime), STAT = ErrStat2 ) + IF (ErrStat2 /=0) THEN + CALL SetErrStat( ErrID_Fatal, 'Failed to allocate array Inputs_WAMIT.', ErrStat, ErrMsg, RoutineName ) + RETURN + END IF + do I=1,nTime - ! We need to create to valid mesh data structures in our Inputs_WAMIT(I)%Mesh using the miscvar version as a template, but the actually data will be generated below + ! We need to create to valid mesh data structures in our Inputs_WAMIT(I)%Mesh using the miscvar version as a template, but the actually data will be generated below call MeshCopy( m%u_WAMIT(iWAMIT)%Mesh, Inputs_WAMIT(I)%Mesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! Inputs_WAMIT(I)%PtfmRefY = Inputs(I)%PtfmRefY - Inputs_WAMIT(I)%PtfmRefY = xd%PtfmRefY(I) + if ( p%NAddDOF(iWAMIT)>0_IntKi ) then + call AllocAry( Inputs_WAMIT(I)%qAddDOF, p%NAddDOF(iWAMIT), 'u%qAddDOF' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( Inputs_WAMIT(I)%qAddDOFDot, p%NAddDOF(iWAMIT), 'u%qAddDOFDot' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( Inputs_WAMIT(I)%qAddDOFDotDot, p%NAddDOF(iWAMIT), 'u%qAddDOFDotDot' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end if end do if (ErrStat > AbortErrLev) exit do I=1,nTime - ! We need to copy the iWAMIT-th node data from the Inputs(I)%WAMITMesh onto the 1st node of the Inputs_WAMIT(I)%Mesh + ! We need to copy the iWAMIT-th node data from the Inputs(I)%WAMITMesh onto the 1st node of the Inputs_WAMIT(I)%Mesh + Inputs_WAMIT(I)%PtfmRefY = xd%PtfmRefY(I) Inputs_WAMIT(I)%Mesh%TranslationDisp(:,1) = Inputs(I)%WAMITMesh%TranslationDisp(:,iWAMIT) Inputs_WAMIT(I)%Mesh%Orientation (:,:,1)= Inputs(I)%WAMITMesh%Orientation (:,:,iWAMIT) Inputs_WAMIT(I)%Mesh%TranslationVel (:,1) = Inputs(I)%WAMITMesh%TranslationVel (:,iWAMIT) Inputs_WAMIT(I)%Mesh%RotationVel (:,1) = Inputs(I)%WAMITMesh%RotationVel (:,iWAMIT) Inputs_WAMIT(I)%Mesh%TranslationAcc (:,1) = Inputs(I)%WAMITMesh%TranslationAcc (:,iWAMIT) - Inputs_WAMIT(I)%Mesh%RotationAcc (:,1) = Inputs(I)%WAMITMesh%RotationAcc (:,iWAMIT) + Inputs_WAMIT(I)%Mesh%RotationAcc (:,1) = Inputs(I)%WAMITMesh%RotationAcc (:,iWAMIT) + if (p%NAddDOF(iWAMIT)>0_IntKi) then + Inputs_WAMIT(I)%qAddDOF = Inputs(I)%qAddDOF (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iWAMIT)) + Inputs_WAMIT(I)%qAddDOFDot = Inputs(I)%qAddDOFDot (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iWAMIT)) + Inputs_WAMIT(I)%qAddDOFDotDot = Inputs(I)%qAddDOFDotDot(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iWAMIT)) + AddDOFCntr = AddDOFCntr + p%NAddDOF(iWAMIT) + end if end do ! UpdateStates for the iWAMIT-th body call WAMIT_UpdateStates( t, n, Inputs_WAMIT, InputTimes, p%WAMIT(iWAMIT), x%WAMIT(iWAMIT), xd%WAMIT(iWAMIT), z%WAMIT, OtherState%WAMIT(iWAMIT), m%WAMIT(iWAMIT), ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) if (ErrStat > AbortErrLev) exit + + ! deallocate temporary inputs + do I=1,nTime + call WAMIT_DestroyInput( Inputs_WAMIT(I), ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + end do + deallocate(Inputs_WAMIT) end do end if - - ! deallocate temporary inputs - do I=1,nTime - call WAMIT_DestroyInput( Inputs_WAMIT(I), ErrStat2, ErrMsg2 ) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end do - - deallocate(Inputs_WAMIT) #ifdef USE_FIT ELSE IF ( p%PotMod == 2 ) THEN ! FIT @@ -1191,7 +1408,7 @@ END SUBROUTINE HydroDyn_UpdateStates !---------------------------------------------------------------------------------------------------------------------------------- !> Routine for computing outputs, used in both loose and tight coupling. -SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) +SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, calcMorisonHstLds ) REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at Time (note that this is intent out because we're copying the u%WAMITMesh into m%u_wamit%mesh) @@ -1205,6 +1422,8 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Initial misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !! Error message if ErrStat /= ErrID_None + LOGICAL, OPTIONAL, INTENT(IN ) :: calcMorisonHstLds !< Flag to calculate the Morison hydrostatic loads (default: .true.) + !! Used to speed up Jacobian calculations when perturbing velocity/acceleration inputs INTEGER :: I, J ! Generic counters @@ -1217,9 +1436,9 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, TYPE(FIT_InputType) :: Inputs_FIT #endif - REAL(ReKi) :: q(6*p%NBody), qdot(6*p%NBody), qdotsq(6*p%NBody), qdotdot(6*p%NBody) + REAL(ReKi) :: q(p%NDOF), qdot(p%NDOF), qdotsq(p%NDOF), qdotdot(p%NDOF) REAL(ReKi) :: rotdisp(3) ! small angle rotational displacements - integer(IntKi) :: iBody, indxStart, indxEnd ! Counters + integer(IntKi) :: iBody, indxStart, indxEnd, AddDOFCntr ! Counters REAL(ReKi), ALLOCATABLE :: RRg2b(:,:), RRb2g(:,:) REAL(ReKi) :: PtfmRefY REAL(R8Ki) :: PRPRotation(3) @@ -1227,10 +1446,17 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_CalcOutput' REAL(ReKi), PARAMETER :: LrgAngle = 0.261799387799149 ! Threshold for platform roll and pitch rotation (15 deg). This is consistent with the ElastoDyn check. LOGICAL, SAVE :: FrstWarn_LrgY = .TRUE. + logical :: calcMorisonHstLdsLocal ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" + + if (present(calcMorisonHstLds)) then + calcMorisonHstLdsLocal = calcMorisonHstLds + else + calcMorisonHstLdsLocal = .true. + end if ! Write the Hydrodyn-level output file data FROM THE LAST COMPLETED TIME STEP if the user requested module-level output @@ -1270,84 +1496,180 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, if ( p%PotMod == 1 ) then - ! Transformation matrices between global and PRP frame - ALLOCATE(RRb2g(6*p%NBody,6*p%NBody),STAT=ErrStat2); if (Failed0("RRb2g")) return; - ALLOCATE(RRg2b(6*p%NBody,6*p%NBody),STAT=ErrStat2); if (Failed0("RRg2b")) return; - RRg2b(:,:) = 0.0_ReKi - do iBody = 1, p%NBody - ! Determine the rotational angles from the direction-cosine matrix - ! rotdisp = GetRotAngs ( u%PtfmRefY, u%WAMITMesh%Orientation(:,:,iBody), ErrStat2, ErrMsg2 ) - ! if (Failed()) return - rotdisp = EulerExtractZYX(u%WAMITMesh%Orientation(:,:,iBody)) - indxStart = (iBody-1)*6+1 - indxEnd = indxStart+5 - q (indxStart:indxEnd) = reshape((/real(u%WAMITMesh%TranslationDisp(:,iBody),ReKi),rotdisp(:)/),(/6/)) - qdot (indxStart:indxEnd) = reshape((/u%WAMITMesh%TranslationVel(:,iBody),u%WAMITMesh%RotationVel(:,iBody)/),(/6/)) - qdotdot(indxStart:indxEnd) = reshape((/u%WAMITMesh%TranslationAcc(:,iBody),u%WAMITMesh%RotationAcc(:,iBody)/),(/6/)) - RRg2b(indxStart:(indxStart+2),indxStart:(indxStart+2)) = u%WAMITMesh%Orientation(:,:,iBody) - RRg2b((indxEnd-2):indxEnd,(indxEnd-2):indxEnd) = u%WAMITMesh%Orientation(:,:,iBody) - ! qdotsq is only used to compute the quadratic damping load, so convert to body frame here - qdotsq (indxStart:indxEnd) = matmul(RRg2b(indxStart:indxEnd,indxStart:indxEnd),qdot(indxStart:indxEnd)) - qdotsq (indxStart:indxEnd) = abs( qdotsq (indxStart:indxEnd) ) * qdotsq (indxStart:indxEnd) - end do - RRb2g = transpose(RRg2b) + ! Compute the load contirbution from user-supplied added stiffness and damping + ! Convention: AddF0 and AddCLin are in the earth-fixed frame + ! AddBLin and AddBQuad are in the body-fixed frame + ! Generalized DOF do not have a frame of reference if ( p%NBodyMod == 1 ) then - ! Compute the load contirbution from user-supplied added stiffness and damping - m%F_PtfmAdd = p%AddF0(:,1) - matmul(p%AddCLin(:,:,1), q) & - - matmul( matmul(RRb2g,p%AddBLin(:,:,1) ), matmul(RRg2b,qdot) ) & - - matmul( matmul(RRb2g,p%AddBQuad(:,:,1)), qdotsq) ! Note: qdotsq is already in body frame, see above + + ! Transformation matrices between global and PRP frame + allocate(RRb2g(p%NDOF,p%NDOF),STAT=ErrStat2); if (Failed0("RRb2g")) return + allocate(RRg2b(p%NDOF,p%NDOF),STAT=ErrStat2); if (Failed0("RRg2b")) return + call Eye(RRg2b,ErrStat2,ErrMsg2); if (Failed()) return + + AddDOFCntr = 0_IntKi + do iBody = 1, p%NBody + + indxStart = p%BDOFStrt(iBody) + indxEnd = p%BDOFStrt(iBody)+5 + RRg2b(indxStart:(indxStart+2),indxStart:(indxStart+2)) = u%WAMITMesh%Orientation(:,:,iBody) + RRg2b((indxEnd-2):indxEnd,(indxEnd-2):indxEnd) = u%WAMITMesh%Orientation(:,:,iBody) + + ! Determine the rotational angles from the direction-cosine matrix + rotdisp = EulerExtractZYX(u%WAMITMesh%Orientation(:,:,iBody)) + q (indxStart:indxEnd) = reshape((/real(u%WAMITMesh%TranslationDisp(:,iBody),ReKi),rotdisp(:)/),(/6/)) + qdot (indxStart:indxEnd) = reshape((/u%WAMITMesh%TranslationVel(:,iBody),u%WAMITMesh%RotationVel(:,iBody)/),(/6/)) + qdotdot(indxStart:indxEnd) = reshape((/u%WAMITMesh%TranslationAcc(:,iBody),u%WAMITMesh%RotationAcc(:,iBody)/),(/6/)) + + ! Populate generalized modes + if ( p%NAddDOF(iBody) > 0_IntKi ) then + indxStart = p%BDOFStrt(iBody)+6 + indxEnd = p%BDOFStrt(iBody)+5+p%NAddDOF(iBody) + q (indxStart:indxEnd) = u%qAddDOF (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + qdot (indxStart:indxEnd) = u%qAddDOFDot (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + qdotdot(indxStart:indxEnd) = u%qAddDOFDotDot(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + AddDOFCntr = AddDOFCntr + p%NAddDOF(iBody) + end if + + ! qdotsq is only used to compute the quadratic damping load, so convert to body frame here + indxStart = p%BDOFStrt(iBody) + indxEnd = p%BDOFStrt(iBody)+5+p%NAddDOF(iBody) + qdotsq (indxStart:indxEnd) = matmul(RRg2b(indxStart:indxEnd,indxStart:indxEnd),qdot(indxStart:indxEnd)) + qdotsq (indxStart:indxEnd) = abs( qdotsq (indxStart:indxEnd) ) * qdotsq (indxStart:indxEnd) + + end do + RRb2g = transpose(RRg2b) + + ! Compute forces due to AddF0, AddCLin, AddBLin, and AddBQuad + m%F_PtfmAdd = p%AddF0(:,1) - matmul(p%AddCLin(:,:,1), q) & + - matmul( matmul(RRb2g,p%AddBLin (:,:,1)), matmul(RRg2b,qdot) ) & + - matmul( matmul(RRb2g,p%AddBQuad(:,:,1)), qdotsq) ! Note: qdotsq is already in body frame, see above + + ! Map to output + AddDOFCntr = 0_IntKi do iBody = 1, p%NBody - indxStart = (iBody-1)*6+1 - indxEnd = indxStart+5 - ! Attach to the output point mesh - y%WAMITMesh%Force (:,iBody) = m%F_PtfmAdd(indxStart:indxStart+2) - y%WAMITMesh%Moment(:,iBody) = m%F_PtfmAdd(indxStart+3:indxEnd) + indxStart = p%BDOFStrt(iBody) + indxEnd = p%BDOFStrt(iBody)+5+p%NAddDOF(iBody) + + ! Attach rigid-body forcing to the output point mesh + y%WAMITMesh%Force (:,iBody) = m%F_PtfmAdd(indxStart :indxStart+2) + y%WAMITMesh%Moment(:,iBody) = m%F_PtfmAdd(indxStart+3:indxStart+5) + + ! Save generalized DOF forcing to output array + if ( p%NAddDOF(iBody) > 0_IntKi ) then + y%FAddDOF(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) = m%F_PtfmAdd(indxStart+6:indxEnd) + AddDOFCntr = AddDOFCntr + p%NAddDOF(iBody) + end if end do + + IF (ALLOCATED(RRb2g)) DEALLOCATE(RRb2g) + IF (ALLOCATED(RRg2b)) DEALLOCATE(RRg2b) - else + else ! NBodyMod>1 + + AddDOFCntr = 0_IntKi do iBody = 1, p%NBody - indxStart = (iBody-1)*6+1 - indxEnd = indxStart+5 - - m%F_PtfmAdd(indxStart:indxEnd) = p%AddF0(:,iBody) - matmul(p%AddCLin(:,:,iBody), q(indxStart:indxEnd)) & - - matmul( matmul(RRb2g(indxStart:indxEnd,indxStart:indxEnd),p%AddBLin(:,:,iBody)), & - matmul(RRg2b(indxStart:indxEnd,indxStart:indxEnd),qdot(indxStart:indxEnd)) ) & - - matmul( matmul(RRb2g(indxStart:indxEnd,indxStart:indxEnd),p%AddBQuad(:,:,iBody)), qdotsq(indxStart:indxEnd)) - - ! Attach to the output point mesh - y%WAMITMesh%Force (:,iBody) = m%F_PtfmAdd(indxStart:indxStart+2) - y%WAMITMesh%Moment(:,iBody) = m%F_PtfmAdd(indxStart+3:indxEnd) + + ! Transformation matrices between global and PRP frame + allocate(RRb2g(6+p%NAddDOF(iBody),6+p%NAddDOF(iBody)),STAT=ErrStat2) + if (ErrStat2/=0) then + call SetErrStat( ErrID_Fatal, 'Failed to allocate matrix RRb2g.', ErrStat, ErrMsg, RoutineName ) + return + end if + allocate(RRg2b(6+p%NAddDOF(iBody),6+p%NAddDOF(iBody)),STAT=ErrStat2) + if (ErrStat2/=0) then + call SetErrStat( ErrID_Fatal, 'Failed to allocate matrix RRg2b.', ErrStat, ErrMsg, RoutineName ) + return + end if + call Eye(RRg2b,ErrStat2,ErrMsg2); if (Failed()) return + RRg2b(1:3,1:3) = u%WAMITMesh%Orientation(:,:,iBody) + RRg2b(4:6,4:6) = u%WAMITMesh%Orientation(:,:,iBody) + RRb2g = transpose(RRg2b) + + ! Populate rigid-body modes + rotdisp = EulerExtractZYX(u%WAMITMesh%Orientation(:,:,iBody)) + indxStart = p%BDOFStrt(iBody) + indxEnd = p%BDOFStrt(iBody)+5 + q (indxStart:indxEnd) = reshape((/real(u%WAMITMesh%TranslationDisp(:,iBody),ReKi),rotdisp(:)/),(/6/)) + qdot (indxStart:indxEnd) = reshape((/u%WAMITMesh%TranslationVel(:,iBody),u%WAMITMesh%RotationVel(:,iBody)/),(/6/)) + qdotdot(indxStart:indxEnd) = reshape((/u%WAMITMesh%TranslationAcc(:,iBody),u%WAMITMesh%RotationAcc(:,iBody)/),(/6/)) + + ! Populate generalized modes + if ( p%NAddDOF(iBody) > 0_IntKi ) then + indxStart = p%BDOFStrt(iBody)+6 + indxEnd = p%BDOFStrt(iBody)+5+p%NAddDOF(iBody) + q (indxStart:indxEnd) = u%qAddDOF (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + qdot (indxStart:indxEnd) = u%qAddDOFDot (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + qdotdot(indxStart:indxEnd) = u%qAddDOFDotDot(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + ! AddDOFCntr is incremented below. + end if + + ! Compute forces due to AddF0, AddCLin, AddBLin, and AddBQuad + indxStart = p%BDOFStrt(iBody) + indxEnd = p%BDOFStrt(iBody)+5+p%NAddDOF(iBody) + + ! qdotsq is only used to compute the quadratic damping load, so convert to body frame here + qdotsq (indxStart:indxEnd) = matmul(RRg2b, qdot(indxStart:indxEnd)) + qdotsq (indxStart:indxEnd) = abs( qdotsq(indxStart:indxEnd) ) * qdotsq (indxStart:indxEnd) + + m%F_PtfmAdd(indxStart:indxEnd) = p%AddF0(:,iBody) & + - matmul(p%AddCLin(:,:,iBody), q(indxStart:indxEnd)) & + - matmul( matmul(RRb2g,p%AddBLin(:,:,iBody)), & + matmul(RRg2b,qdot(indxStart:indxEnd)) ) & + - matmul( matmul(RRb2g,p%AddBQuad(:,:,iBody)), & + qdotsq(indxStart:indxEnd) ) + + ! Attach rigid-body forcing to the output point mesh + y%WAMITMesh%Force (:,iBody) = m%F_PtfmAdd(indxStart :indxStart+2) + y%WAMITMesh%Moment(:,iBody) = m%F_PtfmAdd(indxStart+3:indxStart+5) + + ! Save generalized DOF forcing to output array + if ( p%NAddDOF(iBody) > 0_IntKi ) then + y%FAddDOF(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) = m%F_PtfmAdd(indxStart+6:indxEnd) + AddDOFCntr = AddDOFCntr + p%NAddDOF(iBody) + end if + + IF (ALLOCATED(RRb2g)) DEALLOCATE(RRb2g) + IF (ALLOCATED(RRg2b)) DEALLOCATE(RRg2b) + end do end if m%F_Waves = 0.0_ReKi - if (allocated(m%u_WAMIT)) then ! Check that we allocated u_WAMIT, otherwise there is an error checking the mesh + if (allocated(m%u_WAMIT)) then ! Check that we allocated u_WAMIT, otherwise there is an error checking the mesh if ( m%u_WAMIT(1)%Mesh%Committed ) then ! Make sure we are using WAMIT / there is a valid mesh if ( p%NBodyMod == 1 .or. p%NBody == 1 ) then - ! Copy the inputs from the HD mesh into the WAMIT mesh + ! Copy the inputs from the HD mesh into the WAMIT mesh call MeshCopy( u%WAMITMesh, m%u_WAMIT(1)%Mesh, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) if (Failed()) return - ! m%u_WAMIT(1)%PtfmRefY = u%PtfmRefY - m%u_WAMIT(1)%PtfmRefY = PtfmRefY + m%u_WAMIT(1)%PtfmRefY = PtfmRefY + if ( p%HasAddDOF ) then + m%u_WAMIT(1)%qAddDOF = u%qAddDOF + m%u_WAMIT(1)%qAddDOFDot = u%qAddDOFDot + m%u_WAMIT(1)%qAddDOFDotDot = u%qAddDOFDotDot + end if call WAMIT_CalcOutput( Time, m%u_WAMIT(1), p%WAMIT(1), x%WAMIT(1), xd%WAMIT(1), & z%WAMIT, OtherState%WAMIT(1), y%WAMIT(1), m%WAMIT(1), ErrStat2, ErrMsg2 ) if (Failed()) return do iBody=1,p%NBody y%WAMITMesh%Force (:,iBody) = y%WAMITMesh%Force (:,iBody) + y%WAMIT(1)%Mesh%Force (:,iBody) y%WAMITMesh%Moment(:,iBody) = y%WAMITMesh%Moment(:,iBody) + y%WAMIT(1)%Mesh%Moment(:,iBody) - end do - ! Copy the F_Waves1 information to the HydroDyn level so we can combine it with the 2nd order - m%F_Waves = m%F_Waves + m%WAMIT(1)%F_Waves1 + if ( p%HasAddDOF ) then + y%FAddDOF = y%FAddDOF + y%WAMIT(1)%FAddDOF + end if + ! Copy the F_Waves1 information to the HydroDyn level so we can combine it with the 2nd order + m%F_Waves = m%F_Waves + m%WAMIT(1)%F_Waves1 else + AddDOFCntr = 0_IntKi do iBody=1,p%NBody - ! We need to copy the iWAMIT-th node data from the Inputs(I)%WAMITMesh onto the 1st node of the Inputs_WAMIT(I)%Mesh + ! We need to copy the iWAMIT-th node data from the Inputs(I)%WAMITMesh onto the 1st node of the Inputs_WAMIT(I)%Mesh m%u_WAMIT(iBody)%Mesh%TranslationDisp(:,1) = u%WAMITMesh%TranslationDisp(:,iBody) m%u_WAMIT(iBody)%Mesh%Orientation (:,:,1)= u%WAMITMesh%Orientation (:,:,iBody) m%u_WAMIT(iBody)%Mesh%TranslationVel (:,1) = u%WAMITMesh%TranslationVel (:,iBody) @@ -1356,24 +1678,37 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, m%u_WAMIT(iBody)%Mesh%RotationAcc (:,1) = u%WAMITMesh%RotationAcc (:,iBody) m%u_WAMIT(iBody)%PtfmRefY = PtfmRefY + + if ( p%NAddDOF(iBody) > 0_IntKi ) then + m%u_WAMIT(iBody)%qAddDOF = u%qAddDOF (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + m%u_WAMIT(iBody)%qAddDOFDot = u%qAddDOFDot (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + m%u_WAMIT(iBody)%qAddDOFDotDot = u%qAddDOFDotDot(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + ! AddDOFCntr is incremented below. + end if + call WAMIT_CalcOutput( Time, m%u_WAMIT(iBody), p%WAMIT(iBody), x%WAMIT(iBody), xd%WAMIT(iBody), & z%WAMIT, OtherState%WAMIT(iBody), y%WAMIT(iBody), m%WAMIT(iBody), ErrStat2, ErrMsg2 ) if (Failed()) return y%WAMITMesh%Force (:,iBody) = y%WAMITMesh%Force (:,iBody) + y%WAMIT(iBody)%Mesh%Force (:,1) y%WAMITMesh%Moment(:,iBody) = y%WAMITMesh%Moment(:,iBody) + y%WAMIT(iBody)%Mesh%Moment(:,1) - ! Copy the F_Waves1 information to the HydroDyn level so we can combine it with the 2nd order - indxStart = (iBody-1)*6+1 - indxEnd = indxStart+5 + if ( p%NAddDOF(iBody) > 0_IntKi ) then + y%FAddDOF(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) = y%FAddDOF(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + y%WAMIT(iBody)%FAddDOF + AddDOFCntr = AddDOFCntr + p%NAddDOF(iBody) + end if + + ! Copy the F_Waves1 information to the HydroDyn level so we can combine it with the 2nd order + indxStart = p%BDOFStrt(iBody) + indxEnd = p%BDOFStrt(iBody)+5+p%NAddDOF(iBody) m%F_Waves(indxStart:indxEnd) = m%F_Waves(indxStart:indxEnd) + m%WAMIT(iBody)%F_Waves1 + end do end if end if ! m%u_WAMIT(1)%Mesh%Committed end if ! m%u_WAMIT is allocated - - ! Second order + ! Second order <- No generalized DOF if (p%WAMIT2used) then if ( p%NBodyMod == 1 .or. p%NBody == 1 ) then @@ -1383,8 +1718,13 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, y%WAMITMesh%Force (:,iBody) = y%WAMITMesh%Force (:,iBody) + y%WAMIT2(1)%Mesh%Force (:,iBody) y%WAMITMesh%Moment(:,iBody) = y%WAMITMesh%Moment(:,iBody) + y%WAMIT2(1)%Mesh%Moment(:,iBody) end do - ! Add F_Waves2 to m%F_Waves - m%F_Waves = m%F_Waves + m%WAMIT2(1)%F_Waves2 + + ! Add F_Waves2 to m%F_Waves + do iBody=1,p%NBody + indxStart = p%BDOFStrt(iBody) + indxEnd = indxStart+5 + m%F_Waves(indxStart:indxEnd) = m%F_Waves(indxStart:indxEnd) + m%WAMIT2(1)%F_Waves2(6*(iBody-1)+1:6*(iBody-1)+6) + end do else do iBody=1,p%NBody @@ -1393,8 +1733,8 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, y%WAMITMesh%Force (:,iBody) = y%WAMITMesh%Force (:,iBody) + y%WAMIT2(iBody)%Mesh%Force (:,1) y%WAMITMesh%Moment(:,iBody) = y%WAMITMesh%Moment(:,iBody) + y%WAMIT2(iBody)%Mesh%Moment(:,1) - ! Copy the F_Waves1 information to the HydroDyn level so we can combine it with the 2nd order - indxStart = (iBody-1)*6+1 + ! Add F_Waves2 to m%F_Waves + indxStart = p%BDOFStrt(iBody) indxEnd = indxStart+5 m%F_Waves(indxStart:indxEnd) = m%F_Waves(indxStart:indxEnd) + m%WAMIT2(iBody)%F_Waves2 end do @@ -1423,8 +1763,9 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, IF ( u%Morison%Mesh%Committed ) THEN ! Make sure we are using Morison / there is a valid mesh u%Morison%PtfmRefY = PtfmRefY CALL Morison_CalcOutput( Time, u%Morison, p%Morison, x%Morison, xd%Morison, & - z%Morison, OtherState%Morison, y%Morison, m%Morison, ErrStat2, ErrMsg2 ) - if (Failed()) return + z%Morison, OtherState%Morison, y%Morison, m%Morison, & + ErrStat2, ErrMsg2, calcMorisonHstLdsLocal ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF ! Integrate all the mesh loads onto the platfrom reference Point (PRP) at (0,0,0) @@ -1445,14 +1786,11 @@ SUBROUTINE HydroDyn_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, END IF m%LastOutTime = Time - - IF (ALLOCATED(RRb2g)) DEALLOCATE(RRb2g) - IF (ALLOCATED(RRg2b)) DEALLOCATE(RRg2b) contains logical function Failed() - call SetErrStat(errStat2, errMsg2, errStat, errMsg, RoutineName) - Failed = errStat >= AbortErrLev + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev end function Failed ! check for failed where /= 0 is fatal logical function Failed0(txt) @@ -1551,8 +1889,8 @@ SUBROUTINE HydroDyn_CalcConstrStateResidual( Time, u, p, x, xd, z, OtherState, m ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = "" + ErrStat = ErrID_None + ErrMsg = "" ! Nothing to do here since none of the sub-modules have contraint states z_residual = z @@ -1615,21 +1953,22 @@ end function CalcLoadsAtWRP !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and dZ/du are returned. -SUBROUTINE HD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu ) +SUBROUTINE HD_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) !.................................................................................................................................. + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(HydroDyn_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(HydroDyn_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(HydroDyn_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(HydroDyn_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); + TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) + TYPE(HydroDyn_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point + TYPE(HydroDyn_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point + TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point + TYPE(HydroDyn_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point + TYPE(HydroDyn_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); !! Output fields are not used by this routine, but type is !! available here so that mesh parameter information (i.e., !! connectivity) does not have to be recalculated for dYdu. - TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect @@ -1641,127 +1980,104 @@ SUBROUTINE HD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with !! respect to the inputs (u) [intent in to avoid deallocation] + CHARACTER(*), PARAMETER :: RoutineName = 'HD_JacobianPInput' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: i, j, k, col + INTEGER(IntKi) :: startingI, startingJ, bOffset, offsetI + integer(IntKi) :: iVarWaveElev0, iVarHWindSpeed, iVarPLexp, iVarPropagationDir + logical :: calcMorisonHstLds - ! local variables - TYPE(HydroDyn_OutputType) :: y_p - TYPE(HydroDyn_OutputType) :: y_m - TYPE(HydroDyn_ContinuousStateType) :: x_p - TYPE(HydroDyn_ContinuousStateType) :: x_m - TYPE(HydroDyn_InputType) :: u_perturb - REAL(R8Ki) :: delta ! delta change in input or state - INTEGER(IntKi) :: i, j, k, startingI, startingJ, bOffset, offsetI, n_du_extend, n_du_norm - integer(IntKi), parameter :: nu_extended = 4 ! 4 total extended inputs: WaveElev0 from SeaSt, HWindSpeed / PLexp / PropagationDir from IfW (turbulent sea current) - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'HD_JacobianPInput' - - - ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = '' + + ! Get extended input variable indices + iVarWaveElev0 = 0 + iVarHWindSpeed = 0 + iVarPLexp = 0 + iVarPropagationDir = 0 + do i = 1, size(Vars%u) + select case (Vars%u(i)%DL%Num) + case (HydroDyn_u_WaveElev0) + iVarWaveElev0 = i + case (HydroDyn_u_HWindSpeed) + iVarHWindSpeed = i + case (HydroDyn_u_PLexp) + iVarPLexp = i + case (HydroDyn_u_PropagationDir) + iVarPropagationDir = i + end select + end do - n_du_norm = size(p%Jac_u_indx,1) - n_du_extend = n_du_norm + nu_extended - - ! make a copy of the inputs to perturb - call HydroDyn_CopyInput( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - + ! make a copy of the inputs to perturb + call HydroDyn_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + ! Pack inputs into array + call HydroDyn_VarsPackInput(Vars, u, m%Jac%u); if (Failed()) return - IF ( PRESENT( dYdu ) ) THEN - - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdu)) then ! allocate dYdu if necessary if (.not. allocated(dYdu)) then - call AllocAry(dYdu, p%Jac_ny, n_du_extend, 'dYdu', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dYdu, m%Jac%Ny, m%Jac%Nu, 'dYdu', ErrStat2, ErrMsg2); if (Failed()) return end if - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call HydroDyn_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call HydroDyn_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - do i=1,size(p%Jac_u_indx,1) ! NOTE: extended inputs are not included in p%Jac_u_indx - - ! get u_op + delta u - call HydroDyn_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call HD_Perturb_u( p, i, 1, u_perturb, delta ) - - ! compute y at u_op + delta u - call HydroDyn_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get u_op - delta u - call HydroDyn_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call HD_Perturb_u( p, i, -1, u_perturb, delta ) - - ! compute y at u_op - delta u - call HydroDyn_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get central difference: - call Compute_dY( p, y_p, y_m, delta, dYdu(:,i) ) - - end do - + ! Loop through input variables + do i = 1, size(Vars%u) - !------------------- - ! extended inputs - ! WaveElev0 column -- from SeaState - dYdu(:,n_du_norm+1) = 0.0_ReKi + ! If variable is extended input, skip + if (MV_HasFlagsAll(Vars%u(i), VF_ExtLin)) cycle - ! HWindSpeed / PLexp / PropagationDir -- from Ifw/FlowField for turbulent sea current - dYdu(:,n_du_norm+2:n_du_norm+4) = 0.0_ReKi - + ! Calculate Morison hydrostatic loads when perturbing displacement/orientation inputs + select case (Vars%u(i)%Field) + case (FieldTransDisp, FieldOrientation) + calcMorisonHstLds = .true. + case default + calcMorisonHstLds = .false. + end select - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - call HydroDyn_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call HydroDyn_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call HydroDyn_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call HydroDyn_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2, calcMorisonHstLds); if (Failed()) return + call HydroDyn_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call HydroDyn_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call HydroDyn_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2, calcMorisonHstLds); if (Failed()) return + call HydroDyn_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,col)) + end do + end do + + ! Set extended inputs + if (iVarWaveElev0 > 0) dYdu(:, Vars%u(iVarWaveElev0)%iLoc(1)) = 0.0_R8Ki + if (iVarHWindSpeed > 0) dYdu(:, Vars%u(iVarHWindSpeed)%iLoc(1)) = 0.0_R8Ki + if (iVarPLexp > 0) dYdu(:, Vars%u(iVarPLexp)%iLoc(1)) = 0.0_R8Ki + if (iVarPropagationDir > 0) dYdu(:, Vars%u(iVarPropagationDir)%iLoc(1)) = 0.0_R8Ki + END IF - + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: IF ( PRESENT( dXdu ) ) THEN ! For the case where either RdtnMod=0 and ExtcnMod=0 and hence %SS_Rdtn data or %SS_Exctn data is not valid then we do not have states, so simply return ! The key here is to never allocate the dXdu and related state Jacobian arrays because then the glue-code will behave properly - ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: - ! allocate dXdu if necessary if (.not. allocated(dXdu)) then - call AllocAry(dXdu, p%totalStates, n_du_extend, 'dXdu', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dXdu, m%Jac%Nx, m%Jac%Nu, 'dXdu', ErrStat2, ErrMsg2) + if (Failed()) return end if offsetI = 0 @@ -1769,13 +2085,13 @@ SUBROUTINE HD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM do j = 1,p%nWAMITObj do i = 1,p%WAMIT(j)%SS_Exctn%numStates - dXdu(offsetI+i,n_du_extend) = p%WAMIT(j)%SS_Exctn%B(i) ! B is numStates by 1 + dXdu(offsetI+i,m%Jac%Nu) = p%WAMIT(j)%SS_Exctn%B(i) ! B is numStates by 1 end do offsetI = offsetI + p%WAMIT(j)%SS_Exctn%numStates end do startingI = p%totalStates - p%totalRdtnStates - startingJ = n_du_norm - 18 - 4*3*p%NBody ! subtract 6*3 for PRPMesh and then 4*3*NBody to place us at the beginning of the velocity inputs + startingJ = m%Jac%Nu - 4 - 18 - 4*3*p%NBody ! subtract 4 for extended inputs and 4*3*NBody to place us at the beginning of the velocity inputs ! B is numStates by 6*NBody where NBody =1 if NBodyMod=2 or 3, but could be >1 for NBodyMod=1 if ( p%NBodyMod == 1 ) then ! Example for NBodyMod=1 and NBody = 2, @@ -1826,7 +2142,6 @@ SUBROUTINE HD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM ! dXdu(:,startingIndx +11) = p%WAMIT(2)%SS_Rdtn%B(:,5) ! dXdu(:,startingIndx +12) = p%WAMIT(2)%SS_Rdtn%B(:,6) - k=0 offsetI=0 ! First set all translationalVel components @@ -1854,8 +2169,6 @@ SUBROUTINE HD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM END IF - - IF ( PRESENT( dXddu ) ) THEN if (allocated(dXddu)) deallocate(dXddu) END IF @@ -1864,36 +2177,29 @@ SUBROUTINE HD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM if (allocated(dZdu)) deallocate(dZdu) END IF - call cleanup() - contains - subroutine cleanup() - call HydroDyn_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call HydroDyn_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call HydroDyn_DestroyContState( x_p, ErrStat2, ErrMsg2 ) - call HydroDyn_DestroyContState( x_m, ErrStat2, ErrMsg2 ) - call HydroDyn_DestroyInput( u_perturb, ErrStat2, ErrMsg2 ) - end subroutine cleanup - + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed END SUBROUTINE HD_JacobianPInput !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. -SUBROUTINE HD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) -!.................................................................................................................................. - +SUBROUTINE HD_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(HydroDyn_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(HydroDyn_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(HydroDyn_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(HydroDyn_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); + TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) + TYPE(HydroDyn_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point + TYPE(HydroDyn_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point + TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point + TYPE(HydroDyn_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point + TYPE(HydroDyn_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); !! Output fields are not used by this routine, but type is !! available here so that mesh parameter information (i.e., !! connectivity) does not have to be recalculated for dYdu. - TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions (Y) with respect @@ -1905,109 +2211,62 @@ SUBROUTINE HD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state functions (Z) with respect !! to the continuous states (x) [intent in to avoid deallocation] - ! local variables - TYPE(HydroDyn_OutputType) :: y_p - TYPE(HydroDyn_OutputType) :: y_m - TYPE(HydroDyn_ContinuousStateType) :: x_p - TYPE(HydroDyn_ContinuousStateType) :: x_m - TYPE(HydroDyn_ContinuousStateType) :: x_perturb - REAL(R8Ki) :: delta ! delta change in input or state - INTEGER(IntKi) :: i, j, k, sOffset - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'HD_JacobianPContState' + CHARACTER(*), PARAMETER :: RoutineName = 'HD_JacobianPContState' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: i, j, k, col, sOffset - - ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = '' - - ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + + ! Copy State values to perturb + call HydroDyn_CopyContState(x, m%x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call HydroDyn_VarsPackContState(Vars, x, m%Jac%x) - - ! make a copy of the continuous states to perturb - call HydroDyn_CopyContState( x, x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - IF ( PRESENT( dYdx ) ) THEN + ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + if (present(dYdx)) then - ! allocate dYdx if necessary if (.not. allocated(dYdx)) then - call AllocAry(dYdx, p%Jac_ny, p%totalStates, 'dYdx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dYdx, m%Jac%Ny, m%Jac%Nx, 'dYdx', ErrStat2, ErrMsg2); if (Failed()) return end if - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call HydroDyn_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call HydroDyn_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - - - do i=1,p%totalStates + ! Loop through state variables + do i = 1, size(Vars%x) - ! get x_op + delta x - call HydroDyn_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call HD_Perturb_x( p, i, 1, x_perturb, delta ) + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num - ! compute y at x_op + delta x - call HydroDyn_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get x_op - delta x - call HydroDyn_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call HD_Perturb_x( p, i, -1, x_perturb, delta ) - - ! compute y at x_op - delta x - call HydroDyn_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - ! get central difference: - call Compute_dY( p, y_p, y_m, delta, dYdx(:,i) ) - - end do - - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if - call HydroDyn_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call HydroDyn_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - - END IF + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call HydroDyn_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call HydroDyn_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call HydroDyn_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) - IF ( PRESENT( dXdx ) ) THEN + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call HydroDyn_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call HydroDyn_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call HydroDyn_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) - ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + ! Calculate column index + col = Vars%x(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%x(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdx(:,col)) + end do + end do + + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + IF (present(dXdx)) then ! allocate dXdu if necessary if (.not. allocated(dXdx)) then - call AllocAry(dXdx, p%totalStates, p%totalStates, 'dXdx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dXdx, m%Jac%Nx, m%Jac%Nx, 'dXdx', ErrStat2, ErrMsg2); if (Failed()) return end if + dXdx = 0.0_R8Ki ! Analytical Jacobians from State-space models @@ -2043,37 +2302,30 @@ SUBROUTINE HD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, IF ( PRESENT( dZdx ) ) THEN if (allocated(dZdx)) deallocate(dZdx) END IF - - call cleanup() contains - subroutine cleanup() - call HydroDyn_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call HydroDyn_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call HydroDyn_DestroyContState( x_p, ErrStat2, ErrMsg2 ) - call HydroDyn_DestroyContState( x_m, ErrStat2, ErrMsg2 ) - call HydroDyn_DestroyContState(x_perturb, ErrStat2, ErrMsg2 ) - end subroutine cleanup - + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed END SUBROUTINE HD_JacobianPContState !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the discrete states (xd). The partial derivatives dY/dxd, dX/dxd, dXd/dxd, and dZ/dxd are returned. -SUBROUTINE HD_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) -!.................................................................................................................................. - +SUBROUTINE HD_JacobianPDiscState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(HydroDyn_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(HydroDyn_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(HydroDyn_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(HydroDyn_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); + TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) + TYPE(HydroDyn_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point + TYPE(HydroDyn_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point + TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point + TYPE(HydroDyn_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point + TYPE(HydroDyn_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); !! Output fields are not used by this routine, but type is !! available here so that mesh parameter information (i.e., !! connectivity) does not have to be recalculated for dYdu. - TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdxd(:,:) !< Partial derivatives of output functions @@ -2088,66 +2340,48 @@ SUBROUTINE HD_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdxd(:,:) !< Partial derivatives of constraint state !! functions (Z) with respect to the !! discrete states (xd) [intent in to avoid deallocation] - - - ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = '' - + ! Calculate the partial derivative of the output functions (Y) with respect to the discrete states (xd) here: IF ( PRESENT( dYdxd ) ) THEN - - ! Calculate the partial derivative of the output functions (Y) with respect to the discrete states (xd) here: - ! allocate and set dYdxd - END IF + ! Calculate the partial derivative of the continuous state functions (X) with respect to the discrete states (xd) here: IF ( PRESENT( dXdxd ) ) THEN - - ! Calculate the partial derivative of the continuous state functions (X) with respect to the discrete states (xd) here: - ! allocate and set dXdxd - END IF + ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the discrete states (xd) here: IF ( PRESENT( dXddxd ) ) THEN - - ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the discrete states (xd) here: - ! allocate and set dXddxd - END IF + ! Calculate the partial derivative of the constraint state functions (Z) with respect to the discrete states (xd) here: IF ( PRESENT( dZdxd ) ) THEN - - ! Calculate the partial derivative of the constraint state functions (Z) with respect to the discrete states (xd) here: - ! allocate and set dZdxd - END IF - END SUBROUTINE HD_JacobianPDiscState !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the constraint states (z). The partial derivatives dY/dz, dX/dz, dXd/dz, and dZ/dz are returned. -SUBROUTINE HD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) -!.................................................................................................................................. +SUBROUTINE HD_JacobianPConstrState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(HydroDyn_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(HydroDyn_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(HydroDyn_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(HydroDyn_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); + TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) + TYPE(HydroDyn_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point + TYPE(HydroDyn_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point + TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point + TYPE(HydroDyn_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point + TYPE(HydroDyn_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); !! Output fields are not used by this routine, but type is !! available here so that mesh parameter information (i.e., !! connectivity) does not have to be recalculated for dYdu. - TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdz(:,:) !< Partial derivatives of output functions (Y) with respect @@ -2158,879 +2392,60 @@ SUBROUTINE HD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat !! to the constraint states (z) [intent in to avoid deallocation] REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdz(:,:) !< Partial derivatives of constraint state functions (Z) with respect !! to the constraint states (z) [intent in to avoid deallocation] - - - ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = '' + ! Calculate the partial derivative of the output functions (Y) with respect to the constraint states (z) here: IF ( PRESENT( dYdz ) ) THEN - - ! Calculate the partial derivative of the output functions (Y) with respect to the constraint states (z) here: - ! allocate and set dYdz - END IF + ! Calculate the partial derivative of the continuous state functions (X) with respect to the constraint states (z) here: IF ( PRESENT( dXdz ) ) THEN - - ! Calculate the partial derivative of the continuous state functions (X) with respect to the constraint states (z) here: - ! allocate and set dXdz - END IF + ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the constraint states (z) here: IF ( PRESENT( dXddz ) ) THEN - - ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the constraint states (z) here: - ! allocate and set dXddz - END IF + ! Calculate the partial derivative of the constraint state functions (Z) with respect to the constraint states (z) here: IF ( PRESENT( dZdz ) ) THEN - - ! Calculate the partial derivative of the constraint state functions (Z) with respect to the constraint states (z) here: - ! allocate and set dZdz - END IF END SUBROUTINE HD_JacobianPConstrState !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the Jacobian parameters and initialization outputs for the linearized outputs. -SUBROUTINE HD_Init_Jacobian_y( p, y, InitOut, ErrStat, ErrMsg) - - TYPE(HydroDyn_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(HydroDyn_OutputType) , INTENT(IN ) :: y !< outputs - TYPE(HydroDyn_InitOutputType) , INTENT(INOUT) :: InitOut !< Output for initialization routine - - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables: - INTEGER(IntKi) :: i,index_last, index_next - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'HD_Init_Jacobian_y' - - - - ErrStat = ErrID_None - ErrMsg = "" - - - ! determine how many outputs there are in the Jacobians - p%Jac_ny = 0 - if ( y%Morison%Mesh%Committed ) then - p%Jac_ny = p%Jac_ny + y%Morison%Mesh%NNodes * 6 ! 3 Force, Moment, at each node on the morison mesh - end if - if ( y%WAMITMesh%Committed ) then - p%Jac_ny = p%Jac_ny + y%WAMITMesh%NNodes * 6 ! 3 Force, Moment, at the WAMIT reference Point(s) - end if - - p%Jac_ny = p%Jac_ny + p%NumTotalOuts ! WriteOutput values - - - !................. - ! set linearization output names: - !................. - CALL AllocAry(InitOut%LinNames_y, p%Jac_ny, 'LinNames_y', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ! We do not need RotFrame_y for this module and the glue code with handle the fact that we did not allocate the array and hence set all values to false at the glue-code level - ! Same with RotFrame_x - !CALL AllocAry(InitOut%RotFrame_y, p%Jac_ny, 'RotFrame_y', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - - - - index_next = 1 - if ( y%Morison%Mesh%Committed ) then - index_last = index_next - call PackLoadMesh_Names(y%Morison%Mesh, 'MorisonLoads', InitOut%LinNames_y, index_next) - end if - - if ( y%WAMITMesh%Committed ) then - index_last = index_next - call PackLoadMesh_Names(y%WAMITMesh, 'WAMITLoads', InitOut%LinNames_y, index_next) - end if - - index_last = index_next - - do i=1,p%NumTotalOuts - InitOut%LinNames_y(i+index_next-1) = trim(InitOut%WriteOutputHdr(i))//', '//trim(InitOut%WriteOutputUnt(i)) !trim(p%OutParam(i)%Name)//', '//p%OutParam(i)%Units - end do - - - -END SUBROUTINE HD_Init_Jacobian_y - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the Jacobian parameters and initialization outputs for the linearized continuous states. -SUBROUTINE HD_Init_Jacobian_x( p, InitOut, ErrStat, ErrMsg) - - TYPE(HydroDyn_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(HydroDyn_InitOutputType) , INTENT(INOUT) :: InitOut !< Output for initialization routine - - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'HD_Init_Jacobian_x' - - ! local variables: - INTEGER(IntKi) :: i, j, k, l, spdof, indx - CHARACTER(10) :: dofLabels(6) - ErrStat = ErrID_None - ErrMsg = "" - indx = 1 - - ! Need to determine how many wamit body objects there are - p%totalExctnStates = 0 - p%totalRdtnStates = 0 - do j = 1, p%nWAMITObj - p%totalExctnStates = p%totalExctnStates + p%WAMIT(j)%SS_Exctn%numStates !numStates defaults to zero in the case where ExctnMod = 0 instead of 2 - p%totalRdtnStates = p%totalRdtnStates + p%WAMIT(j)%SS_Rdtn%numStates !numStates defaults to zero in the case where RdtnMod = 0 instead of 2 - end do - p%totalStates = p%totalExctnStates + p%totalRdtnStates - - if ( p%totalStates == 0 ) return ! No states, so return and do not allocate the following arrays. This lets the glue-code know that the module does not have states - - ! allocate space for the row/column names and for perturbation sizes - call allocAry(p%dx, p%totalStates, 'p%dx', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry(InitOut%LinNames_x, p%totalStates, 'LinNames_x' , ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry(InitOut%DerivOrder_x, p%totalStates, 'DerivOrder_x', ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - ! All Hydrodyn continuous states are max order = 1 - if ( allocated(InitOut%DerivOrder_x) ) InitOut%DerivOrder_x = 1 - - ! set perturbation sizes: p%dx - k = 1 - do j = 1, p%nWAMITObj - do i = 1, p%WAMIT(j)%SS_Exctn%numStates - p%dx(k) = 20000.0_R8Ki * D2R_D - k=k+1 - end do +subroutine HD_PackExtInputAry(Vars, u, ValAry) + type(ModVarsType), intent(in) :: Vars !< Module variables + type(HydroDyn_InputType), intent(in) :: u !< Inputs + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + + ! Loop through Input variables + do i = 1, size(Vars%u) + associate (Var => Vars%u(i)) + ! Select based on data location number + select case (Var%DL%Num) + case (HydroDyn_u_WaveElev0) + ! Wave elevation from SeaState + ValAry(Vars%u(i)%iLoc(1):Vars%u(i)%iLoc(2)) = 0.0_R8Ki + case (HydroDyn_u_HWindSpeed) + ! Current velocity from SeaState + ValAry(Vars%u(i)%iLoc(1):Vars%u(i)%iLoc(2)) = 0.0_R8Ki + case (HydroDyn_u_PLexp) + ! Current shear coefficient from SeaState + ValAry(Vars%u(i)%iLoc(1):Vars%u(i)%iLoc(2)) = 0.0_R8Ki + case (HydroDyn_u_PropagationDir) + ! Current propagation direction from SeaState + ValAry(Vars%u(i)%iLoc(1):Vars%u(i)%iLoc(2)) = 0.0_R8Ki + end select + end associate end do - do j = 1, p%nWAMITObj - do i = 1, p%WAMIT(j)%SS_Rdtn%numStates - p%dx(k) = 2.0_R8Ki * D2R_D - k=k+1 - end do - end do - - !---------------- - ! SS_Exctn states - - dofLabels = (/'PtfmSg ','PtfmSw ','PtfmHv ','PtfmR ','PtfmP ','PtfmY '/) - if (p%totalExctnStates>0) then - do l=1,p%nWAMITObj - ! set linearization state names: - do j = 1, 6 - spdof = p%WAMIT(l)%SS_Exctn%spdof(j) - if ( p%NBodyMod == 1 ) then - do i = 1,spdof - InitOut%LinNames_x(indx) = 'Exctn'//trim(dofLabels(j))//trim(num2lstr(i)) - indx = indx + 1 - end do - else - do i = 1,spdof - InitOut%LinNames_x(indx) = 'B'//trim(num2lstr(l))//'Exctn'//trim(dofLabels(j))//trim(num2lstr(i)) - indx = indx + 1 - end do - end if - end do - end do - endif - - !---------------- - ! SS_Rdtn states - - if (p%totalRdtnStates>0) then - do l=1,p%nWAMITObj - ! set linearization state names: - do j = 1, 6 - spdof = p%WAMIT(l)%SS_Rdtn%spdof(j) - if ( p%NBodyMod == 1 ) then - do i = 1,spdof - InitOut%LinNames_x(indx) = 'Rdtn'//trim(dofLabels(j))//trim(num2lstr(i)) - indx = indx + 1 - end do - else - do i = 1,spdof - InitOut%LinNames_x(indx) = 'B'//trim(num2lstr(l))//'Rdtn'//trim(dofLabels(j))//trim(num2lstr(i)) - indx = indx + 1 - end do - end if - end do - end do - endif -END SUBROUTINE HD_Init_Jacobian_x -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. -!! Do not change the order of this packing without changing corresponding linearization routines ! -SUBROUTINE HD_Init_Jacobian( p, u, y, InitOut, ErrStat, ErrMsg) - - TYPE(HydroDyn_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(HydroDyn_InputType) , INTENT(IN ) :: u !< inputs - TYPE(HydroDyn_OutputType) , INTENT(IN ) :: y !< outputs - TYPE(HydroDyn_InitOutputType) , INTENT(INOUT) :: InitOut !< Output for initialization routine - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'HD_Init_Jacobian' - - ! local variables: - INTEGER(IntKi) :: i, j, index, nu, i_meshField, m, meshFieldCount - integer(IntKi), parameter :: nu_extended = 4 ! 4 total extended inputs: WaveElev0 from SeaSt, HWindSpeed / PLexp / PropagationDir from IfW (turbulent sea current) - REAL(R8Ki) :: perturb_t, perturb - LOGICAL :: FieldMask(FIELDMASK_SIZE) ! flags to determine if this field is part of the packing +end subroutine - - - ErrStat = ErrID_None - ErrMsg = "" - - - call HD_Init_Jacobian_y( p, y, InitOut, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - call HD_Init_Jacobian_x( p, InitOut, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - - - ! determine how many inputs there are in the Jacobians - nu = 0; - if ( u%Morison%Mesh%Committed ) then - nu = u%Morison%Mesh%NNodes * 18 ! 3 TranslationDisp, Orientation, TranslationVel, RotationVel, TranslationAcc, and RotationAcc at each node - end if - if ( u%WAMITMesh%Committed ) then - nu = nu + u%WAMITMesh%NNodes * 18 ! 3 TranslationDisp, Orientation, TranslationVel, RotationVel, TranslationAcc, and RotationAcc at each node - end if - - nu = nu + u%PRPMesh%NNodes * 18 ! 3 TranslationDisp, Orientation, TranslationVel, RotationVel, TranslationAcc, and RotationAcc at each node - - ! DO NOT Add the extended inputs WaveElev0, HWindSpeed / PLexp / PropagationDir when computing the size of p%Jac_u_indx -!FIXME: extended inputs will need to be added later to get HWindSpeed / PLexp / PropagationDir from sea currents from IfW/FlowField in - - - ! note: all other inputs are ignored - - !.................... - ! fill matrix to store index to help us figure out what the ith value of the u vector really means - ! (see hydrodyn::HD_perturb_u ... these MUST match ) - ! column 1 indicates module's mesh and field - ! column 2 indicates the first index of the acceleration/load field - ! column 3 is the node - !.................... - - !............... - ! HD input mappings stored in p%Jac_u_indx: - !............... - call AllocAry(p%Jac_u_indx, nu, 3, 'p%Jac_u_indx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - index = 1 - meshFieldCount = 0 - - if ( u%Morison%Mesh%Committed ) then - !Module/Mesh/Field: u%Morison%Mesh%TranslationDisp = 1; - !Module/Mesh/Field: u%Morison%Mesh%Orientation = 2; - !Module/Mesh/Field: u%Morison%Mesh%TranslationVel = 3; - !Module/Mesh/Field: u%Morison%Mesh%RotationVel = 4; - !Module/Mesh/Field: u%Morison%Mesh%TranslationAcc = 5; - !Module/Mesh/Field: u%Morison%Mesh%RotationAcc = 6; - - do i_meshField = 1,6 - do i=1,u%Morison%Mesh%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = i_meshField !Module/Mesh/Field: u%Morison%Mesh%{TranslationDisp/Orientation/TranslationVel/RotationVel/TranslationAcc/RotationAcc} = m - p%Jac_u_indx(index,2) = j !index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - end do !i_meshField - meshFieldCount = 6 - - end if - - if ( u%WAMITMesh%Committed ) then - !Module/Mesh/Field: u%WAMITMesh%TranslationDisp = 7 or 1; - !Module/Mesh/Field: u%WAMITMesh%Orientation = 8 or 2; - !Module/Mesh/Field: u%WAMITMesh%TranslationVel = 9 or 3; - !Module/Mesh/Field: u%WAMITMesh%RotationVel = 10 or 4; - !Module/Mesh/Field: u%WAMITMesh%TranslationAcc = 11 or 5; - !Module/Mesh/Field: u%WAMITMesh%RotationAcc = 12 or 6; - do i_meshField = 1,6 - do i=1,u%WAMITMesh%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = meshFieldCount + i_meshField - p%Jac_u_indx(index,2) = j !index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - end do !i_meshField - meshFieldCount = meshFieldCount + 6 - end if - - !Module/Mesh/Field: u%PRPMesh%TranslationDisp = 13 or 7 or 1; - !Module/Mesh/Field: u%PRPMesh%Orientation = 14 or 8 or 2; - !Module/Mesh/Field: u%PRPMesh%TranslationVel = 15 or 9 or 3; - !Module/Mesh/Field: u%PRPMesh%RotationVel = 16 or 10 or 4; - !Module/Mesh/Field: u%PRPMesh%TranslationAcc = 17 or 11 or 5; - !Module/Mesh/Field: u%PRPMesh%RotationAcc = 18 or 12 or 6; - do i_meshField = 1,6 - do i=1,u%PRPMesh%NNodes - do j=1,3 - p%Jac_u_indx(index,1) = meshFieldCount + i_meshField - p%Jac_u_indx(index,2) = j !index: j - p%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - end do !i_meshField - meshFieldCount = meshFieldCount + 6 - - !................ - ! input perturbations, du: - !................ - - call AllocAry(p%du, meshFieldCount, 'p%du', ErrStat2, ErrMsg2) ! number of unique values in p%Jac_u_indx(:,1) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - - perturb_t = 0.02_ReKi*D2R * max(p%WaveField%EffWtrDpth,1.0_ReKi) ! translation input scaling - perturb = 2*D2R ! rotational input scaling - - index = 0 - if ( u%Morison%Mesh%Committed ) then - p%du(1) = perturb_t ! u%Morison%Mesh%TranslationDisp - p%du(2) = perturb ! u%Morison%Mesh%Orientation - p%du(3) = perturb_t ! u%Morison%Mesh%TranslationVel - p%du(4) = perturb ! u%Morison%Mesh%RotationVel - p%du(5) = perturb_t ! u%Morison%Mesh%TranslationAcc - p%du(6) = perturb ! u%Morison%Mesh%RotationAcc - index = 6 - end if - - if ( u%WAMITMesh%Committed ) then - p%du(index + 1) = perturb_t ! u%WAMITMesh%TranslationDisp - p%du(index + 2) = perturb ! u%WAMITMesh%Orientation - p%du(index + 3) = perturb_t ! u%WAMITMesh%TranslationVel - p%du(index + 4) = perturb ! u%WAMITMesh%RotationVel - p%du(index + 5) = perturb_t ! u%WAMITMesh%TranslationAcc - p%du(index + 6) = perturb ! u%WAMITMesh%RotationAcc - index = index + 6 - end if - - p%du(index + 1) = perturb_t ! u%PRPMesh%TranslationDisp - p%du(index + 2) = perturb ! u%PRPMesh%Orientation - p%du(index + 3) = perturb_t ! u%PRPMesh%TranslationVel - p%du(index + 4) = perturb ! u%PRPMesh%RotationVel - p%du(index + 5) = perturb_t ! u%PRPMesh%TranslationAcc - p%du(index + 6) = perturb ! u%PRPMesh%RotationAcc - - !................ - ! names of the columns, InitOut%LinNames_u: - !................ - call AllocAry(InitOut%LinNames_u, nu+nu_extended, 'LinNames_u', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ! We do not need RotFrame_u for this module and the glue code with handle the fact that we did not allocate the array and hence set all values to false at the glue-code level - !call AllocAry(InitOut%RotFrame_u, nu+nu_extended, 'RotFrame_u', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - call AllocAry(InitOut%IsLoad_u, nu+nu_extended, 'IsLoad_u', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - InitOut%IsLoad_u = .false. ! HD's inputs are NOT loads - - index = 1 - if ( u%Morison%Mesh%Committed ) then - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_Orientation) = .true. - FieldMask(MASKID_TRANSLATIONVEL) = .true. - FieldMask(MASKID_ROTATIONVEL) = .true. - FieldMask(MASKID_TRANSLATIONACC) = .true. - FieldMask(MASKID_ROTATIONACC) = .true. - call PackMotionMesh_Names(u%Morison%Mesh, 'Morison', InitOut%LinNames_u, index, FieldMask=FieldMask) - - end if - - if ( u%WAMITMesh%Committed ) then - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_Orientation) = .true. - FieldMask(MASKID_TRANSLATIONVel) = .true. - FieldMask(MASKID_ROTATIONVel) = .true. - FieldMask(MASKID_TRANSLATIONACC) = .true. - FieldMask(MASKID_ROTATIONACC) = .true. - call PackMotionMesh_Names(u%WAMITMesh, 'WAMIT', InitOut%LinNames_u, index, FieldMask=FieldMask) - end if - - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_Orientation) = .true. - FieldMask(MASKID_TRANSLATIONVel) = .true. - FieldMask(MASKID_ROTATIONVel) = .true. - FieldMask(MASKID_TRANSLATIONACC) = .true. - FieldMask(MASKID_ROTATIONACC) = .true. - call PackMotionMesh_Names(u%PRPMesh, 'Platform-RefPt', InitOut%LinNames_u, index, FieldMask=FieldMask) - - ! Extended inputs - InitOut%LinNames_u(index) = 'Extended input: wave elevation at platform ref point, m'; index=index+1 - InitOut%LinNames_u(index) = 'Extended input: horizontal current speed (steady/uniform wind), m/s'; index=index+1 - InitOut%LinNames_u(index) = 'Extended input: vertical power-law shear exponent, -'; index=index+1 - InitOut%LinNames_u(index) = 'Extended input: propagation direction, rad'; index=index+1 - -END SUBROUTINE HD_Init_Jacobian -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine hydrodyn::HD_init_jacobian is consistant with this routine! -SUBROUTINE HD_Perturb_u( p, n, perturb_sign, u, du ) - - TYPE(HydroDyn_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(HydroDyn_InputType) , INTENT(INOUT) :: u !< perturbed HD inputs - REAL( R8Ki ) , INTENT( OUT) :: du !< amount that specific input was perturbed - - - ! local variables - integer :: fieldIndx - integer :: node, index - - index = 0 - fieldIndx = p%Jac_u_indx(n,2) - node = p%Jac_u_indx(n,3) - - du = p%du( p%Jac_u_indx(n,1) ) - - ! determine which mesh we're trying to perturb and perturb the input: - - ! If we do not have Morison meshes, then the following select cases will vary - if ( u%Morison%Mesh%Committed ) then - SELECT CASE( p%Jac_u_indx(n,1) ) - CASE ( 1) !Module/Mesh/Field: u%Morison%Mesh%TranslationDisp = 1 - u%Morison%Mesh%TranslationDisp (fieldIndx,node) = u%Morison%Mesh%TranslationDisp (fieldIndx,node) + du * perturb_sign - CASE ( 2) !Module/Mesh/Field: u%Morison%Mesh%Orientation = 2 - CALL PerturbOrientationMatrix( u%Morison%Mesh%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - CASE ( 3) !Module/Mesh/Field: u%Morison%Mesh%TranslationVel = 3 - u%Morison%Mesh%TranslationVel( fieldIndx,node) = u%Morison%Mesh%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE ( 4) !Module/Mesh/Field: u%Morison%Mesh%RotationVel = 4 - u%Morison%Mesh%RotationVel (fieldIndx,node) = u%Morison%Mesh%RotationVel (fieldIndx,node) + du * perturb_sign - CASE ( 5) !Module/Mesh/Field: u%Morison%Mesh%TranslationAcc = 5 - u%Morison%Mesh%TranslationAcc( fieldIndx,node) = u%Morison%Mesh%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE ( 6) !Module/Mesh/Field: u%Morison%Mesh%RotationAcc = 6 - u%Morison%Mesh%RotationAcc(fieldIndx,node) = u%Morison%Mesh%RotationAcc(fieldIndx,node) + du * perturb_sign - end select - if ( u%WAMITMesh%Committed ) then - SELECT CASE( p%Jac_u_indx(n,1) ) - CASE ( 7) !Module/Mesh/Field: u%WAMITMesh%TranslationDisp = 7 - u%WAMITMesh%TranslationDisp (fieldIndx,node) = u%WAMITMesh%TranslationDisp (fieldIndx,node) + du * perturb_sign - CASE ( 8) !Module/Mesh/Field: u%WAMITMesh%Orientation = 8 - CALL PerturbOrientationMatrix( u%WAMITMesh%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - CASE ( 9) !Module/Mesh/Field: u%WAMITMesh%TranslationVel = 9 - u%WAMITMesh%TranslationVel( fieldIndx,node) = u%WAMITMesh%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE (10) !Module/Mesh/Field: u%WAMITMesh%RotationVel = 10 - u%WAMITMesh%RotationVel (fieldIndx,node) = u%WAMITMesh%RotationVel (fieldIndx,node) + du * perturb_sign - CASE (11) !Module/Mesh/Field: u%WAMITMesh%TranslationAcc = 11 - u%WAMITMesh%TranslationAcc( fieldIndx,node) = u%WAMITMesh%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE (12) !Module/Mesh/Field: u%WAMITMesh%RotationAcc = 12 - u%WAMITMesh%RotationAcc(fieldIndx,node) = u%WAMITMesh%RotationAcc(fieldIndx,node) + du * perturb_sign - END SELECT - SELECT CASE( p%Jac_u_indx(n,1) ) - CASE (13) !Module/Mesh/Field: u%PRPMesh%TranslationDisp = 13 - u%PRPMesh%TranslationDisp (fieldIndx,node) = u%PRPMesh%TranslationDisp (fieldIndx,node) + du * perturb_sign - CASE (14) !Module/Mesh/Field: u%PRPMesh%Orientation = 14 - CALL PerturbOrientationMatrix( u%PRPMesh%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - CASE (15) !Module/Mesh/Field: u%PRPMesh%TranslationVel = 15 - u%PRPMesh%TranslationVel( fieldIndx,node) = u%PRPMesh%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE (16) !Module/Mesh/Field: u%PRPMesh%RotationVel = 16 - u%PRPMesh%RotationVel (fieldIndx,node) = u%PRPMesh%RotationVel (fieldIndx,node) + du * perturb_sign - CASE (17) !Module/Mesh/Field: u%PRPMesh%TranslationAcc = 17 - u%PRPMesh%TranslationAcc( fieldIndx,node) = u%PRPMesh%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE (18) !Module/Mesh/Field: u%PRPMesh%RotationAcc = 18 - u%PRPMesh%RotationAcc(fieldIndx,node) = u%PRPMesh%RotationAcc(fieldIndx,node) + du * perturb_sign - END SELECT - else - SELECT CASE( p%Jac_u_indx(n,1) ) - CASE ( 7) !Module/Mesh/Field: u%PRPMesh%TranslationDisp = 7 - u%PRPMesh%TranslationDisp (fieldIndx,node) = u%PRPMesh%TranslationDisp (fieldIndx,node) + du * perturb_sign - CASE ( 8) !Module/Mesh/Field: u%PRPMesh%Orientation = 8 - CALL PerturbOrientationMatrix( u%PRPMesh%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - CASE ( 9) !Module/Mesh/Field: u%PRPMesh%TranslationVel = 9 - u%PRPMesh%TranslationVel( fieldIndx,node) = u%PRPMesh%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE (10) !Module/Mesh/Field: u%PRPMesh%RotationVel = 10 - u%PRPMesh%RotationVel (fieldIndx,node) = u%PRPMesh%RotationVel (fieldIndx,node) + du * perturb_sign - CASE (11) !Module/Mesh/Field: u%PRPMesh%TranslationAcc = 11 - u%PRPMesh%TranslationAcc( fieldIndx,node) = u%PRPMesh%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE (12) !Module/Mesh/Field: u%PRPMesh%RotationAcc = 12 - u%PRPMesh%RotationAcc(fieldIndx,node) = u%PRPMesh%RotationAcc(fieldIndx,node) + du * perturb_sign - END SELECT - end if - else if ( u%WAMITMesh%Committed ) then - SELECT CASE( p%Jac_u_indx(n,1) ) - CASE (1) !Module/Mesh/Field: u%WAMITMesh%TranslationDisp = 1 - u%WAMITMesh%TranslationDisp (fieldIndx,node) = u%WAMITMesh%TranslationDisp (fieldIndx,node) + du * perturb_sign - CASE (2) !Module/Mesh/Field: u%WAMITMesh%Orientation = 2 - CALL PerturbOrientationMatrix( u%WAMITMesh%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - CASE (3) !Module/Mesh/Field: u%WAMITMesh%TranslationVel = 3 - u%WAMITMesh%TranslationVel( fieldIndx,node) = u%WAMITMesh%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE (4) !Module/Mesh/Field: u%WAMITMesh%RotationVel = 4 - u%WAMITMesh%RotationVel (fieldIndx,node) = u%WAMITMesh%RotationVel (fieldIndx,node) + du * perturb_sign - CASE (5) !Module/Mesh/Field: u%WAMITMesh%TranslationAcc = 5 - u%WAMITMesh%TranslationAcc( fieldIndx,node) = u%WAMITMesh%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE (6) !Module/Mesh/Field: u%WAMITMesh%RotationAcc = 6 - u%WAMITMesh%RotationAcc(fieldIndx,node) = u%WAMITMesh%RotationAcc(fieldIndx,node) + du * perturb_sign - END SELECT - SELECT CASE( p%Jac_u_indx(n,1) ) - CASE ( 7) !Module/Mesh/Field: u%PRPMesh%TranslationDisp = 7 - u%PRPMesh%TranslationDisp (fieldIndx,node) = u%PRPMesh%TranslationDisp (fieldIndx,node) + du * perturb_sign - CASE ( 8) !Module/Mesh/Field: u%PRPMesh%Orientation = 8 - CALL PerturbOrientationMatrix( u%PRPMesh%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - CASE ( 9) !Module/Mesh/Field: u%PRPMesh%TranslationVel = 9 - u%PRPMesh%TranslationVel( fieldIndx,node) = u%PRPMesh%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE (10) !Module/Mesh/Field: u%PRPMesh%RotationVel = 10 - u%PRPMesh%RotationVel (fieldIndx,node) = u%PRPMesh%RotationVel (fieldIndx,node) + du * perturb_sign - CASE (11) !Module/Mesh/Field: u%PRPMesh%TranslationAcc = 11 - u%PRPMesh%TranslationAcc( fieldIndx,node) = u%PRPMesh%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE (12) !Module/Mesh/Field: u%PRPMesh%RotationAcc = 12 - u%PRPMesh%RotationAcc(fieldIndx,node) = u%PRPMesh%RotationAcc(fieldIndx,node) + du * perturb_sign - END SELECT - else - SELECT CASE( p%Jac_u_indx(n,1) ) - CASE ( 1) !Module/Mesh/Field: u%PRPMesh%TranslationDisp = 1 - u%PRPMesh%TranslationDisp (fieldIndx,node) = u%PRPMesh%TranslationDisp (fieldIndx,node) + du * perturb_sign - CASE ( 2) !Module/Mesh/Field: u%PRPMesh%Orientation = 2 - CALL PerturbOrientationMatrix( u%PRPMesh%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - CASE ( 3) !Module/Mesh/Field: u%PRPMesh%TranslationVel = 3 - u%PRPMesh%TranslationVel( fieldIndx,node) = u%PRPMesh%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE ( 4) !Module/Mesh/Field: u%PRPMesh%RotationVel = 4 - u%PRPMesh%RotationVel (fieldIndx,node) = u%PRPMesh%RotationVel (fieldIndx,node) + du * perturb_sign - CASE ( 5) !Module/Mesh/Field: u%PRPMesh%TranslationAcc = 5 - u%PRPMesh%TranslationAcc( fieldIndx,node) = u%PRPMesh%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE ( 6) !Module/Mesh/Field: u%PRPMesh%RotationAcc = 6 - u%PRPMesh%RotationAcc(fieldIndx,node) = u%PRPMesh%RotationAcc(fieldIndx,node) + du * perturb_sign - END SELECT - end if - -!FIXME: when SeaState superposition with IfW/FlowField for current is enabled, we must also add in the perturbations of those extended inputs (HWindSpeed/PLexp/PropagationDir) -! Some revisions needed at that time: -! - expand p%Jac_u_indx to include the extended inputs (currently ignores them) -! - copy what was done in AD15 for perturbing these extended inputs (may require extensive modifications to data management) -! Until then, we should add a warning that linearization with IfW/FlowField currents in HD is not allowed for MHK turbines (no warning at present). -! -! Example code chunk from AD15. May be superceded by new linearization system later -! ! Extended inputs -! ! Module/Mesh/Field: HWindSpeed = 37 -! ! Module/Mesh/Field: PLexp = 38 -! ! Module/Mesh/Field: PropagationDir = 39 -! case(37,38,39) -! FlowField_du = 0.0_R8Ki -! select case( p%Jac_u_indx(n,1) ) -! case (37); FlowField_du(1) = du *perturb_sign -! case (38); FlowField_du(2) = du *perturb_sign -! case (39); FlowField_du(3) = du *perturb_sign -! end select -! call IfW_UniformWind_Perturb(FlowField_perturb, FlowField_du) -! call AD_CalcWind_Rotor(t, u_perturb, FlowField_perturb, p, RotInflow_perturb, StartNode, ErrStat, ErrMsg) -END SUBROUTINE HD_Perturb_u -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the continuous state array. -!! Do not change this without making sure subroutine HD_init_jacobian is consistant with this routine! -SUBROUTINE HD_Perturb_x( p, n, perturb_sign, x, dx ) - - TYPE(HydroDyn_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(HydroDyn_ContinuousStateType) , INTENT(INOUT) :: x !< perturbed ED states - REAL( R8Ki ) , INTENT( OUT) :: dx !< amount that specific state was perturbed - - - ! local variables - integer(intKi) :: i, j, k - - if ( p%totalStates == 0 ) return - - !Note: All excitation states for all bodies are stored 1st, then all radiation states - dx = p%dx(n) - k = 1 - - ! Find body index for exctn states - do i = 1, p%nWAMITObj - do j = 1, p%WAMIT(i)%SS_Exctn%numStates - if (n == k) then - x%WAMIT(i)%SS_Exctn%x(j) = x%WAMIT(i)%SS_Exctn%x(j) + dx * perturb_sign - return - end if - k = k + 1 - end do - end do - - ! Find body index for rdtn states - do i = 1, p%nWAMITObj - do j = 1, p%WAMIT(i)%SS_Rdtn%numStates - if (n == k) then - x%WAMIT(i)%SS_Rdtn%x(j) = x%WAMIT(i)%SS_Rdtn%x(j) + dx * perturb_sign - return - end if - k = k + 1 - end do - end do - -END SUBROUTINE HD_Perturb_x - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine hydrodyn::HD_init_jacobian is consistant with this routine! -SUBROUTINE Compute_dY(p, y_p, y_m, delta, dY) - - TYPE(HydroDyn_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(HydroDyn_OutputType) , INTENT(IN ) :: y_p !< HD outputs at \f$ u + \Delta u \f$ or \f$ x + \Delta x \f$ (p=plus) - TYPE(HydroDyn_OutputType) , INTENT(IN ) :: y_m !< HD outputs at \f$ u - \Delta u \f$ or \f$ x - \Delta x \f$ (m=minus) - REAL(R8Ki) , INTENT(IN ) :: delta !< difference in inputs or states \f$ delta = \Delta u \f$ or \f$ delta = \Delta x \f$ - REAL(R8Ki) , INTENT(INOUT) :: dY(:) !< column of dYdu or dYdx: \f$ \frac{\partial Y}{\partial u_i} = \frac{y_p - y_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial Y}{\partial x_i} = \frac{y_p - y_m}{2 \, \Delta x}\f$ - - ! local variables: - - integer(IntKi) :: indx_first ! index indicating next value of dY to be filled - integer(IntKi) :: k - - - - - indx_first = 1 - if ( y_p%Morison%Mesh%Committed ) then - call PackLoadMesh_dY(y_p%Morison%Mesh, y_m%Morison%Mesh, dY, indx_first) - end if - if ( y_p%WAMITMesh%Committed ) then - call PackLoadMesh_dY(y_p%WAMITMesh, y_m%WAMITMesh, dY, indx_first) - end if - - do k=1,p%NumTotalOuts - dY(k+indx_first-1) = y_p%WriteOutput(k) - y_m%WriteOutput(k) - end do - - - - dY = dY / (2.0_R8Ki*delta) - -END SUBROUTINE Compute_dY - -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE HD_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) - - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(HydroDyn_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(HydroDyn_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(HydroDyn_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(HydroDyn_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(HydroDyn_OutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(HydroDyn_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - - - - INTEGER(IntKi) :: i, j, index, nu - integer(IntKi), parameter :: nu_extended = 4 ! 4 total extended inputs: WaveElev0 from SeaSt, HWindSpeed / PLexp / PropagationDir from IfW (turbulent sea current) - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'HD_GetOP' - TYPE(HydroDyn_ContinuousStateType) :: dx !< derivative of continuous states at operating point - LOGICAL :: Mask(FIELDMASK_SIZE) !< flags to determine if this field is part of the packing - - - ! Initialize ErrStat - - ErrStat = ErrID_None - ErrMsg = '' - - !.................................. - IF ( PRESENT( u_op ) ) THEN - - if (.not. allocated(u_op)) then - - nu = size(p%Jac_u_indx,1) - - ! our operating point includes DCM (orientation) matrices, not just small angles like the perturbation matrices do - if ( u%Morison%Mesh%Committed ) then - nu = nu + u%Morison%Mesh%NNodes * 6 ! p%Jac_u_indx has 3 for Orientation, but we need 9 at each node - end if - if ( u%WAMITMesh%Committed ) then - nu = nu + u%WAMITMesh%NNodes * 6 ! p%Jac_u_indx has 3 for Orientation, but we need 9 at each node - end if - - nu = nu + u%PRPMesh%NNodes * 6 ! p%Jac_u_indx has 3 for Orientation, but we need 9 at each node - nu = nu + nu_extended ! Extended input - - call AllocAry(u_op, nu,'u_op',ErrStat2,ErrMsg2) ! - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - - end if - - Mask = .false. - Mask(MASKID_TRANSLATIONDISP) = .true. - Mask(MASKID_ORIENTATION) = .true. - Mask(MASKID_TRANSLATIONVEL) = .true. - Mask(MASKID_ROTATIONVEL) = .true. - Mask(MASKID_TRANSLATIONACC) = .true. - Mask(MASKID_ROTATIONACC) = .true. - - index = 1 - if ( u%Morison%Mesh%Committed ) then - call PackMotionMesh(u%Morison%Mesh, u_op, index, FieldMask=Mask) - end if - - if ( u%WAMITMesh%Committed ) then - call PackMotionMesh(u%WAMITMesh, u_op, index, FieldMask=Mask) - end if - - call PackMotionMesh(u%PRPMesh, u_op, index, FieldMask=Mask) - - ! extended inputs: - u_op(index) = 0.0_R8Ki; index=index+1 ! WaveElev0 -- linearization not allowed for non-zero - u_op(index) = 0.0_R8Ki; index=index+1 ! HWindSpeed - u_op(index) = 0.0_R8Ki; index=index+1 ! PLexp - u_op(index) = 0.0_R8Ki; index=index+1 ! PropagationDir - -!FIXME: when sea current from IfW/FlowField is enabled, this code must be updated and enabled -! !------------------------------ -! ! Extended inputs -- Linearization is only possible with Steady or Uniform Wind, so take advantage of that here -! ! Module/Mesh/Field: HWindSpeed = 37 -! ! Module/Mesh/Field: PLexp = 38 -! ! Module/Mesh/Field: PropagationDir = 39 -! call IfW_UniformWind_GetOP(p_AD%FlowField%Uniform, t, .false. , OP_out) -! ! HWindSpeed -! u_op(index) = OP_out(1); index = index + 1 -! ! PLexp -! u_op(index) = OP_out(2); index = index + 1 -! ! PropagationDir (include AngleH in calculation if any) -! u_op(index) = OP_out(3) + p_AD%FlowField%PropagationDir; index = index + 1 - - - END IF - - !.................................. - if ( PRESENT( y_op ) ) then - - if (.not. allocated(y_op)) then - call AllocAry(y_op, p%Jac_ny, 'y_op', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end if - - index = 1 - if ( y%Morison%Mesh%Committed ) then - call PackLoadMesh(y%Morison%Mesh, y_op, index) - end if - if ( y%WAMITMesh%Committed ) then - call PackLoadMesh(y%WAMITMesh, y_op, index) - end if - - index = index - 1 - do i=1,p%NumTotalOuts - y_op(i+index) = y%WriteOutput(i) - end do - - end if - - !.................................. - IF ( PRESENT( x_op ) ) THEN - - if ( p%totalStates == 0 ) return - - if ( y%WAMITMesh%Committed ) then - if (.not. allocated(x_op)) then - call AllocAry(x_op, p%totalStates,'x_op',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - index = 1 - do j=1, p%nWAMITObj - do i=1,p%WAMIT(j)%SS_Exctn%numStates ! Loop through all DOFs - x_op(index) = x%WAMIT(j)%SS_Exctn%x(i) - index = index + 1 - end do - end do - do j=1, p%nWAMITObj - do i=1,p%WAMIT(j)%SS_Rdtn%numStates ! Loop through all DOFs - x_op(index) = x%WAMIT(j)%SS_Rdtn%x(i) - index = index + 1 - end do - end do - end if - END IF - - !.................................. - IF ( PRESENT( dx_op ) ) THEN - - if ( p%totalStates == 0 ) return - - if ( y%WAMITMesh%Committed ) then - if (.not. allocated(dx_op)) then - call AllocAry(dx_op, p%totalStates,'dx_op',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - call HydroDyn_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dx, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call HydroDyn_DestroyContState( dx, ErrStat2, ErrMsg2) - return - end if - index = 1 - do j=1, p%nWAMITObj - do i=1,p%WAMIT(j)%SS_Exctn%numStates ! Loop through all DOFs - dx_op(index) = dx%WAMIT(j)%SS_Exctn%x(i) - index = index + 1 - end do - end do - do j=1, p%nWAMITObj - do i=1,p%WAMIT(j)%SS_Rdtn%numStates ! Loop through all DOFs - dx_op(index) = dx%WAMIT(j)%SS_Rdtn%x(i) - index = index + 1 - end do - end do - call HydroDyn_DestroyContState( dx, ErrStat2, ErrMsg2) - end if - END IF - - !.................................. - IF ( PRESENT( xd_op ) ) THEN - END IF - - !.................................. - IF ( PRESENT( z_op ) ) THEN - END IF - -END SUBROUTINE HD_GetOP - - -!---------------------------------------------------------------------------------------------------------------------------------- END MODULE HydroDyn !********************************************************************************************************************************** diff --git a/modules/hydrodyn/src/HydroDyn.txt b/modules/hydrodyn/src/HydroDyn.txt index 4e8d8ae192..647e5fa2f9 100644 --- a/modules/hydrodyn/src/HydroDyn.txt +++ b/modules/hydrodyn/src/HydroDyn.txt @@ -25,6 +25,11 @@ usefrom SeaSt_WaveField.txt param HydroDyn/HydroDyn unused INTEGER MaxHDOutputs - 510 - "The maximum number of output channels supported by this module" - param HydroDyn/HydroDyn unused INTEGER MaxUserOutputs - 5150 - " Total possible number of output channels: SS_Excitation = 7 + SS_Radiation = 7 + Morison= 4626 + HydroDyn=510 = 5150" - +param ^ ^ IntKi HydroDyn_u_WaveElev0 - -1 - "WaveElev0 Extended input DatLoc number" - +param ^ ^ IntKi HydroDyn_u_HWindSpeed - -2 - "HWindSpeed extended input DatLoc number" - +param ^ ^ IntKi HydroDyn_u_PLexp - -3 - "PLexp extended input DatLoc number" - +param ^ ^ IntKi HydroDyn_u_PropagationDir - -4 - "PropagationDir extended input DatLoc number" - + ######################### # ..... Input file data ........................................................................................................... # This is data defined in the Input File for this module (or could otherwise be passed in) @@ -41,6 +46,7 @@ typedef ^ ^ INTEGER typedef ^ ^ INTEGER NBodyMod - - - "Body coupling model {1: include coupling terms between each body and NBody in HydroDyn equals NBODY in WAMIT, 2: neglect coupling terms between each body and NBODY=1 with XBODY=0 in WAMIT, 3: Neglect coupling terms between each body and NBODY=1 with XBODY=/0 in WAMIT} (switch) [only used when PotMod=1]" - typedef ^ ^ ReKi PtfmVol0 {:} - - "" - typedef ^ ^ LOGICAL HasWAMIT - - - ".TRUE. if using WAMIT model, .FALSE. otherwise" - +typedef ^ ^ LOGICAL HasAddDOF - - - ".TRUE. if additional generalized DOF are present, .FALSE. otherwise" - typedef ^ ^ ReKi WAMITULEN {:} - - "" - typedef ^ ^ ReKi PtfmRefxt {:} - - "The xt offset of the body reference point(s) from (0,0,0) [1 to NBody; only used when PotMod=1; must be 0.0 if NBodyMod=2 ]" (m) typedef ^ ^ ReKi PtfmRefyt {:} - - "The yt offset of the body reference point(s) from (0,0,0) [1 to NBody; only used when PotMod=1; must be 0.0 if NBodyMod=2 ]" (m) @@ -48,6 +54,7 @@ typedef ^ ^ ReKi typedef ^ ^ R8Ki PtfmRefztRot {:} - - "The rotation about zt of the body reference frame(s) from xt/yt" radians typedef ^ ^ ReKi PtfmCOBxt {:} - - "" - typedef ^ ^ ReKi PtfmCOByt {:} - - "" - +typedef ^ ^ INTEGER NAddDOF {:} - - "Number of additional generalized degrees of freedom" - typedef ^ ^ WAMIT_InitInputType WAMIT - - - "Initialization data for WAMIT module" - typedef ^ ^ WAMIT2_InitInputType WAMIT2 - - - "Initialization data for WAMIT2 module" - typedef ^ ^ Morison_InitInputType Morison - - - "Initialization data for Morison module" - @@ -82,15 +89,11 @@ typedef ^ ^ ReKi # # Define outputs from the initialization routine here: # +typedef ^ InitOutputType ModVarsType Vars - - - "Module Variables" - typedef ^ InitOutputType Morison_InitOutputType Morison - - - "Initialization output from the Morison module" - typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "The is the list of all HD-related output channel header strings (includes all sub-module channels)" - typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt {:} - - "The is the list of all HD-related output channel unit strings (includes all sub-module channels)" - typedef ^ ^ ProgDesc Ver - - - "Version of HydroDyn" -typedef ^ ^ CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -typedef ^ InitOutputType INTEGER DerivOrder_x {:} - - "Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization" - -typedef ^ ^ LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix)" - # ..... HD_ModuleMapType .................................................................................................................... typedef ^ HD_ModuleMapType MeshMapType uW_P_2_PRP_P - - - "Mesh mapping data: WAMIT body kinematics to PRP node at (0,0,0)" - typedef ^ HD_ModuleMapType MeshMapType W_P_2_PRP_P - - - "Mesh mapping data: WAMIT loads to PRP node at (0,0,0)" - @@ -121,20 +124,7 @@ typedef ^ ConstraintStateType Morison_Con # typedef ^ OtherStateType WAMIT_OtherStateType WAMIT {:} - - "OtherState information from the WAMIT module" - typedef ^ ^ Morison_OtherStateType Morison - - - "OtherState information from the Morison module" - -# ..... Misc/Optimization variables................................................................................................. -# Define any data that are used only for efficiency purposes (these variables are not associated with time): -# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. -typedef ^ MiscVarType MeshType AllHdroOrigin - - - "An intermediate mesh used to transfer hydrodynamic loads from the various HD-related meshes to the AllHdroOrigin mesh" - -typedef ^ ^ HD_ModuleMapType HD_MeshMap - - - -typedef ^ ^ INTEGER Decimate - - - "The output decimation counter" - -typedef ^ ^ DbKi LastOutTime - - - "Last time step which was written to the output file (sec)" - -typedef ^ ^ ReKi F_PtfmAdd {:} - - "The total forces and moments due to additional pre-load, stiffness, and damping" - -typedef ^ ^ ReKi F_Hydro {6} - - "The total hydrodynamic forces and moments integrated about the (0,0,0) platform reference point" - -typedef ^ ^ ReKi F_Waves {:} - - "The total waves forces on a WAMIT body calculated by first and second order methods (WAMIT and WAMIT2 modules)" - -typedef ^ ^ WAMIT_MiscVarType WAMIT {:} - - "misc var information from the WAMIT module" - -typedef ^ ^ WAMIT2_MiscVarType WAMIT2 {:} - - "misc var information from the WAMIT2 module" - -typedef ^ ^ Morison_MiscVarType Morison - - - "misc var information from the Morison module" - -typedef ^ ^ WAMIT_InputType u_WAMIT {:} - - "WAMIT module inputs" - +# # ..... Parameters ................................................................................................................ # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: @@ -147,7 +137,11 @@ typedef ^ ^ LOGICAL typedef ^ ^ Morison_ParameterType Morison - - - "Parameter data for the Morison module" - typedef ^ ^ INTEGER PotMod - - - "1 if using WAMIT model, 0 if no potential flow model, or 2 if FIT model" - typedef ^ ^ INTEGER NBody - - - "[>=1; only used when PotMod=1. If NBodyMod=1, the WAMIT data contains a vector of size 6*NBody x 1 and matrices of size 6*NBody x 6*NBody; if NBodyMod>1, there are NBody sets of WAMIT data each with a vector of size 6 x 1 and matrices of size 6 x 6]" - -typedef ^ ^ INTEGER NBodyMod - - - "Body coupling model {1: include coupling terms between each body and NBody in HydroDyn equals NBODY in WAMIT, 2: neglect coupling terms between each body and NBODY=1 with XBODY=0 in WAMIT, 3: Neglect coupling terms between each body and NBODY=1 with XBODY=/0 in WAMIT} (switch) [only used when PotMod=1]" - +typedef ^ ^ INTEGER NBodyMod - - - "Body coupling model {1: include coupling terms between each body and NBody in HydroDyn equals NBODY in WAMIT, 2: neglect coupling terms between each body and NBODY=1 with XBODY=0 in WAMIT, 3: Neglect coupling terms between each body and NBODY=1 with XBODY=/0 in WAMIT} (switch) [only used when PotMod=1]" - +typedef ^ ^ LOGICAL HasAddDOF - - - ".TRUE. if additional generalized DOF are present, .FALSE. otherwise" - +typedef ^ ^ INTEGER NAddDOF {:} - - "Number of additional generalized degrees of freedom" - +typedef ^ ^ INTEGER NDOF - - - "Total number of degrees of freedom" - +typedef ^ ^ INTEGER BDOFStrt {:} - - "Starting DOF index for each body" - typedef ^ ^ INTEGER totalStates - - - "Number of excitation and radiation states for all WAMIT bodies" - typedef ^ ^ INTEGER totalExctnStates - - - "Number of excitation states for all WAMIT bodies" - typedef ^ ^ INTEGER totalRdtnStates - - - "Number of radiation states for all WAMIT bodies" - @@ -165,10 +159,6 @@ typedef ^ ^ CHARACTER(2 typedef ^ ^ CHARACTER(ChanLen) Delim - - - "Delimiter string for outputs, defaults to tab-delimiters" - typedef ^ ^ INTEGER UnOutFile - - - "File unit for the HydroDyn outputs" - typedef ^ ^ INTEGER OutDec - - - "Write every OutDec time steps" - -typedef ^ ^ Integer Jac_u_indx {:}{:} - - "matrix to help fill/pack the u vector in computing the jacobian" - -typedef ^ ^ R8Ki du {:} - - "vector that determines size of perturbation for u (inputs)" - -typedef ^ ^ R8Ki dx {:} - - "vector that determines size of perturbation for x (continuous states)" - -typedef ^ ^ Integer Jac_ny - - - "number of outputs in jacobian matrix" - typedef ^ ^ logical VisMeshes - .false. - "Output visualization meshes" - typedef ^ ^ SeaSt_WaveFieldType *WaveField - - - "Pointer to SeaState wave field" - typedef ^ ^ INTEGER PtfmYMod - - - "Large yaw model" - @@ -179,14 +169,38 @@ typedef ^ ^ ReKi # Define inputs that are contained on the mesh here: # typedef ^ InputType Morison_InputType Morison - - - "Morison module inputs" - -typedef ^ InputType MeshType WAMITMesh - - - "Motions at the WAMIT reference point(s) in the inertial frame" - -typedef ^ InputType MeshType PRPMesh - - - "Motions at the Platform reference point in the inertial frame" - -# +typedef ^ ^ MeshType WAMITMesh - - - "Motions at the WAMIT reference point(s) in the inertial frame" - +typedef ^ ^ MeshType PRPMesh - - - "Motions at the Platform reference point in the inertial frame" - +typedef ^ ^ ReKi qAddDOF {:} - - "Displacement of potential-flow generalized DOF" - +typedef ^ ^ ReKi qAddDOFDot {:} - - "Velocity of potential-flow generalized DOF" - +typedef ^ ^ ReKi qAddDOFDotDot {:} - - "Acceleration of potential-flow generalized DOF" - # # ..... Outputs ................................................................................................................... # Define outputs that are contained on the mesh here: -typedef ^ OutputType WAMIT_OutputType WAMIT {:} - - "WAMIT module outputs" - -typedef ^ OutputType WAMIT2_OutputType WAMIT2 {:} - - "WAMIT2 module outputs" - -typedef ^ ^ Morison_OutputType Morison - - - "Morison module outputs" - -typedef ^ OutputType MeshType WAMITMesh - - - "Point Loads at the WAMIT reference point(s) in the inertial frame" - -typedef ^ ^ ReKi WriteOutput {:} - - "Outputs to be written to the output file(s)" - +typedef ^ OutputType WAMIT_OutputType WAMIT {:} - - "WAMIT module outputs" - +typedef ^ ^ WAMIT2_OutputType WAMIT2 {:} - - "WAMIT2 module outputs" - +typedef ^ ^ Morison_OutputType Morison - - - "Morison module outputs" - +typedef ^ ^ MeshType WAMITMesh - - - "Point Loads at the WAMIT reference point(s) in the inertial frame" - +typedef ^ ^ ReKi WriteOutput {:} - - "Outputs to be written to the output file(s)" - +typedef ^ ^ ReKi FAddDOF {:} - - "Additional generalized DOF forcing " - +# +# +# ..... Misc/Optimization variables................................................................................................. +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef ^ MiscVarType ModJacType Jac - - - "Values corresponding to module variables" - +typedef ^ ^ HydroDyn_ContinuousStateType x_perturb - - - "Temporary variables for Jacobian calculations" - +typedef ^ ^ HydroDyn_InputType u_perturb - - - "Temporary variables for Jacobian calculations" - +typedef ^ ^ HydroDyn_ContinuousStateType dxdt_lin - - - "Temporary variables for Jacobian calculations" - +typedef ^ ^ HydroDyn_OutputType y_lin - - - "Temporary variables for Jacobian calculations" - +typedef ^ ^ MeshType AllHdroOrigin - - - "An intermediate mesh used to transfer hydrodynamic loads from the various HD-related meshes to the AllHdroOrigin mesh" - +typedef ^ ^ HD_ModuleMapType HD_MeshMap - - - +typedef ^ ^ INTEGER Decimate - - - "The output decimation counter" - +typedef ^ ^ DbKi LastOutTime - - - "Last time step which was written to the output file (sec)" - +typedef ^ ^ ReKi F_PtfmAdd {:} - - "The total forces and moments due to additional pre-load, stiffness, and damping" - +typedef ^ ^ ReKi F_Hydro {6} - - "The total hydrodynamic forces and moments integrated about the (0,0,0) platform reference point" - +typedef ^ ^ ReKi F_Waves {:} - - "The total waves forces on a WAMIT body calculated by first and second order methods (WAMIT and WAMIT2 modules)" - +typedef ^ ^ WAMIT_MiscVarType WAMIT {:} - - "misc var information from the WAMIT module" - +typedef ^ ^ WAMIT2_MiscVarType WAMIT2 {:} - - "misc var information from the WAMIT2 module" - +typedef ^ ^ Morison_MiscVarType Morison - - - "misc var information from the Morison module" - +typedef ^ ^ WAMIT_InputType u_WAMIT {:} - - "WAMIT module inputs" - diff --git a/modules/hydrodyn/src/HydroDyn_DriverCode.f90 b/modules/hydrodyn/src/HydroDyn_DriverCode.f90 index a0cc08d04e..ffee717a36 100644 --- a/modules/hydrodyn/src/HydroDyn_DriverCode.f90 +++ b/modules/hydrodyn/src/HydroDyn_DriverCode.f90 @@ -179,6 +179,7 @@ PROGRAM HydroDynDriver call SeaSt_Init( InitInData_SeaSt, u_SeaSt(1), p_SeaSt, x_SeaSt, xd_SeaSt, z_SeaSt, OtherState_SeaSt, y_SeaSt, m_SeaSt, Interval, InitOutData_SeaSt, ErrStat, ErrMsg ) SeaState_Initialized = .true. CALL CheckError() + p_SeaSt%WaveField%hasCurrField = .FALSE. if ( Interval /= drvrData%TimeInterval) then ErrMsg = 'The SeaState Module attempted to change timestep interval, but this is not allowed. The SeaState Module must use the Driver Interval.' @@ -232,6 +233,20 @@ PROGRAM HydroDynDriver end if END IF + IF ( drvrData%PRPInputsMod<-1_IntKi .and. drvrData%NAddDOF>0 ) THEN + ErrStat = ErrID_Fatal + ErrMsg = 'When multiple WAMIT bodies are present, additional generalized DOF are not supported. Need to set NAddDOF=0.' + CALL CheckError() + END IF + + IF ( p%PotMod == 1_IntKi ) THEN + IF ( drvrData%NAddDOF > p%NAddDOF(1) ) THEN + ErrStat = ErrID_Fatal + ErrMsg = 'NAddDOF in the HydroDyn driver input file is greater than that in the HydroDyn primary input file. This is not allowed.' + CALL CheckError() + END IF + END IF + ! Set initial inputs at t = 0 IF (( drvrData%PRPInputsMod /= 2 ) .AND. ( drvrData%PRPInputsMod >= 0 )) THEN ! Set any steady-state inputs, once before the time-stepping loop (these don't change, so we don't need to update them in the time-marching simulation) diff --git a/modules/hydrodyn/src/HydroDyn_DriverSubs.f90 b/modules/hydrodyn/src/HydroDyn_DriverSubs.f90 index 0a2a5bb773..4723bb37ce 100644 --- a/modules/hydrodyn/src/HydroDyn_DriverSubs.f90 +++ b/modules/hydrodyn/src/HydroDyn_DriverSubs.f90 @@ -89,6 +89,7 @@ MODULE HydroDynDriverSubs REAL(R8Ki), ALLOCATABLE :: PRPin(:,:) ! Variable for storing time, forces, and body velocities, in m/s or rad/s for PRP REAL(R8Ki), ALLOCATABLE :: PRPinTime(:) ! Variable for storing time, forces, and body velocities, in m/s or rad/s for PRP INTEGER(IntKi) :: NBody ! Number of WAMIT bodies to work with if prescribing kinematics on each body (PRPInputsMod<0) + INTEGER(IntKi) :: NAddDOF ! Number of additional generalized DOF of each WAMIT body (currently only supports NBody=1, i.e., PRPInputsMod=-1) TYPE(HD_Drvr_OutputFile) :: OutData character(500) :: FTitle ! description from 2nd line of driver file @@ -254,6 +255,10 @@ SUBROUTINE ReadDriverInputFile( FileName, drvrData, ErrStat, ErrMsg ) CALL ReadVar ( UnIn, FileName, drvrData%PRPInputsMod, 'PRPInputsMod', 'Model for the PRP (principal reference point) inputs', ErrStat2, ErrMsg2, UnEchoLocal ) if (Failed()) return + ! NAddDOF + CALL ReadVar ( UnIn, FileName, drvrData%NAddDOF, 'NAddDOF', 'Number of additional generalized DOF of each WAMIT body (currently only supports NBODY=1, i.e., PRPInputsMod=-1)', ErrStat2, ErrMsg2, UnEchoLocal ) + if (Failed()) return + ! PtfmRefzt CALL ReadVar ( UnIn, FileName, drvrData%PtfmRefzt, 'PtfmRefzt', 'Vertical distance from the ground level to the platform reference point', ErrStat, ErrMsg, UnEchoLocal ) if (Failed()) return @@ -323,7 +328,7 @@ SUBROUTINE ReadPRPInputsFile( drvrData, ErrStat, ErrMsg ) INTEGER :: UnEchoLocal ! The local unit number for this module's echo file ! CHARACTER(1024) :: EchoFile ! Name of HydroDyn echo file - integer(IntKi) :: n, sizeAry + integer(IntKi) :: n, sizeAry, sizeAryActual integer(IntKi) :: errStat2 ! temporary error status of the operation character(ErrMsgLen) :: errMsg2 ! temporary error message character(*), parameter :: RoutineName = 'ReadDriverInputFile' @@ -345,7 +350,11 @@ SUBROUTINE ReadPRPInputsFile( drvrData, ErrStat, ErrMsg ) ! multi-body kinematics driver option (time, PRP DOFs 1-6, body1 DOFs 1-6, body2 DOFs 1-6...) drvrData%NBody = -drvrData%PRPInputsMod - sizeAry = 7 + 6*drvrData%NBody + IF ( drvrData%NBody == 1_IntKi ) THEN + sizeAry = 7 + 6*drvrData%NBody + drvrData%NAddDOF + ELSE + sizeAry = 7 + 6*drvrData%NBody + END IF call WrScr( 'NBody is '//trim(Num2LStr(drvrData%NBody))//' and planning to read in '//trim(Num2LStr(sizeAry))//' columns from the input file' ) @@ -354,15 +363,22 @@ SUBROUTINE ReadPRPInputsFile( drvrData, ErrStat, ErrMsg ) RETURN END IF - + ! Open the (PRP or WAMIT) inputs data file CALL GetNewUnit( UnIn ) CALL OpenFInpFile ( UnIn, trim(drvrData%PRPInputsFile), ErrStat2, ErrMsg2 ) if (Failed()) return ! Determine how many lines of data (how many time steps) are in the PRP input file - CALL GetFileLength(UnIn, trim(drvrData%PRPInputsFile), sizeAry, NumDataLines, NumHeaderLines, ErrStat2, ErrMsg2) + CALL GetFileLength(UnIn, trim(drvrData%PRPInputsFile), sizeAryActual, NumDataLines, NumHeaderLines, ErrStat2, ErrMsg2) if (Failed()) return + + if (sizeAry /= sizeAryActual) then + ErrStat = ErrID_Fatal + ErrMsg = 'Expected '//trim(num2lstr(sizeAry))//' columns in the PRPInputsFile but found '//trim(num2lstr(sizeAryActual))//' columns instead.' + return + end if + CALL AllocAry(TmpAry, sizeAry, 'TmpAry', ErrStat2, ErrMsg2) if (Failed()) return CALL AllocAry(drvrData%PRPin, NumDataLines, sizeAry-1, 'PRPin', ErrStat2, ErrMsg2) @@ -792,6 +808,12 @@ SUBROUTINE SetHDInputs_Constant(u_HD, mappingData, drvrData, ErrStat, ErrMsg) CALL PRP_TransferToMotionInputs(u_HD, mappingData, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (ALLOCATED( u_HD%qAddDOF )) THEN + u_HD%qAddDOF = 0.0_ReKi + u_HD%qAddDOFDot = 0.0_ReKi + u_HD%qAddDOFDotDot = 0.0_ReKi + END IF + END IF END SUBROUTINE SetHDInputs_Constant @@ -811,15 +833,25 @@ SUBROUTINE SetHDInputs(time, n, u_HD, mappingData, drvrData, ErrStat, ErrMsg) integer(IntKi) :: errStat2 ! temporary error status of the operation character(ErrMsgLen) :: errMsg2 ! temporary error message character(*), parameter :: RoutineName = 'SetHDInputs' - real(R8Ki) :: yInterp(size(drvrData%PRPin,2)) + real(R8Ki), allocatable :: yInterp(:) integer(intKi) :: indxHigh, indxMid, indxLow integer(intKi) :: i ErrStat = ErrID_None ErrMsg = "" + IF (ALLOCATED( u_HD%qAddDOF )) THEN + u_HD%qAddDOF = 0.0_ReKi + u_HD%qAddDOFDot = 0.0_ReKi + u_HD%qAddDOFDotDot = 0.0_ReKi + END IF + ! PRPInputsMod 2: Reads time series of positions, velocities, and accelerations for the platform reference point IF ( drvrData%PRPInputsMod == 2 ) THEN + + call AllocAry(yInterp, size(drvrData%PRPin,2), "yInterp", ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call InterpStpMat( time, drvrData%PRPinTime, drvrData%PRPin, mappingData%Ind, size(drvrData%PRPinTime), yInterp ) u_HD%PRPMesh%TranslationDisp(:,1) = yInterp(1:3) @@ -855,7 +887,7 @@ SUBROUTINE SetHDInputs(time, n, u_HD, mappingData, drvrData, ErrStat, ErrMsg) call SetErrStat(ErrID_Fatal, 'time does not match PRP input file data', ErrStat, ErrMsg, RoutineName) return end if - + ! platform reference point (PRP), and body 1-NBody displacements u_HD%PRPMesh%TranslationDisp(:,1) = drvrData%PRPin(n,1:3) DO I=1,drvrData%NBody @@ -864,11 +896,15 @@ SUBROUTINE SetHDInputs(time, n, u_HD, mappingData, drvrData, ErrStat, ErrMsg) ! PRP and body 1-NBody orientations (skipping the maxAngle stuff) u_HD%PRPMesh%Orientation(:,:,1) = EulerConstructZYX(drvrData%PRPin(n,4:6)) - DO I=1, drvrData%NBody u_HD%WAMITMesh%Orientation(:,:,I) = EulerConstructZYX(drvrData%PRPin(n,(6*I+4):(6*I+6))) END DO + ! Generalized DOF displacement of WAMIT body + IF ( drvrData%NAddDOF > 0_IntKi ) THEN ! Currently only allowed if NBody = 1 + u_HD%qAddDOF(1:drvrData%NAddDOF) = drvrData%PRPin(n, 13:(12+drvrData%NAddDOF)) + END IF + ! use finite differences for velocities and accelerations IF (n == 1) THEN ! use forward differences for first time step indxHigh = n+2 @@ -883,6 +919,10 @@ SUBROUTINE SetHDInputs(time, n, u_HD, mappingData, drvrData, ErrStat, ErrMsg) u_HD%WAMITMesh%RotationVel( :,I) = (drvrData%PRPin(indxMid, 6*I+4:6*I+6) - drvrData%PRPin(indxLow, 6*I+4:6*I+6))/drvrData%TimeInterval END DO + IF ( drvrData%NAddDOF > 0_IntKi ) THEN ! Currently only allowed if NBody = 1 + u_HD%qAddDOFdot(1:drvrData%NAddDOF) = ( drvrData%PRPin(indxMid, 13:(12+drvrData%NAddDOF)) - drvrData%PRPin(indxLow, 13:(12+drvrData%NAddDOF)) )/drvrData%TimeInterval + END IF + ELSE IF (n >= drvrData%NSteps) THEN ! use backward differences for last time step indxHigh = n indxMid = n-1 @@ -895,7 +935,11 @@ SUBROUTINE SetHDInputs(time, n, u_HD, mappingData, drvrData, ErrStat, ErrMsg) u_HD%WAMITMesh%TranslationVel(:,I) = (drvrData%PRPin(indxHigh, 6*I+1:6*I+3) - drvrData%PRPin(indxMid, 6*I+1:6*I+3))/drvrData%TimeInterval u_HD%WAMITMesh%RotationVel( :,I) = (drvrData%PRPin(indxHigh, 6*I+4:6*I+6) - drvrData%PRPin(indxMid, 6*I+4:6*I+6))/drvrData%TimeInterval END DO - + + IF ( drvrData%NAddDOF > 0_IntKi ) THEN ! Currently only allowed if NBody = 1 + u_HD%qAddDOFdot(1:drvrData%NAddDOF) = ( drvrData%PRPin(indxHigh, 13:(12+drvrData%NAddDOF)) - drvrData%PRPin(indxMid, 13:(12+drvrData%NAddDOF)) )/drvrData%TimeInterval + END IF + ELSE ! otherwise use central differences for intermediate time steps indxHigh = n+1 indxMid = n @@ -908,19 +952,28 @@ SUBROUTINE SetHDInputs(time, n, u_HD, mappingData, drvrData, ErrStat, ErrMsg) u_HD%WAMITMesh%TranslationVel(:,I) = (drvrData%PRPin(indxHigh, 6*I+1:6*I+3) - drvrData%PRPin(indxLow, 6*I+1:6*I+3))*0.5/drvrData%TimeInterval u_HD%WAMITMesh%RotationVel( :,I) = (drvrData%PRPin(indxHigh, 6*I+4:6*I+6) - drvrData%PRPin(indxLow, 6*I+4:6*I+6))*0.5/drvrData%TimeInterval END DO - + + IF ( drvrData%NAddDOF > 0_IntKi ) THEN ! Currently only allowed if NBody = 1 + u_HD%qAddDOFdot(1:drvrData%NAddDOF) = ( drvrData%PRPin(indxHigh, 13:(12+drvrData%NAddDOF)) - drvrData%PRPin(indxLow, 13:(12+drvrData%NAddDOF)) )/drvrData%TimeInterval + END IF + END IF ! TO DO: Missing the first and last step below! ! calculate accelerations based on displacements: - u_HD%PRPMesh%TranslationAcc(:,1) = (drvrData%PRPin(indxHigh, 1:3) - 2*drvrData%PRPin(indxMid, 1:3) + drvrData%PRPin(indxLow, 1:3)) /(drvrData%TimeInterval**2) - u_HD%PRPMesh%RotationAcc( :,1) = (drvrData%PRPin(indxHigh, 4:6) - 2*drvrData%PRPin(indxMid, 4:6) + drvrData%PRPin(indxLow, 4:6)) /(drvrData%TimeInterval**2) + u_HD%PRPMesh%TranslationAcc(:,1) = (drvrData%PRPin(indxHigh, 1:3) - 2.0_ReKi*drvrData%PRPin(indxMid, 1:3) + drvrData%PRPin(indxLow, 1:3)) /(drvrData%TimeInterval**2) + u_HD%PRPMesh%RotationAcc( :,1) = (drvrData%PRPin(indxHigh, 4:6) - 2.0_ReKi*drvrData%PRPin(indxMid, 4:6) + drvrData%PRPin(indxLow, 4:6)) /(drvrData%TimeInterval**2) DO I=1,drvrData%NBody - u_HD%WAMITMesh%TranslationAcc(:,I) = (drvrData%PRPin(indxHigh, 6*I+1:6*I+3) - 2*drvrData%PRPin(indxMid, 6*I+1:6*I+3) + drvrData%PRPin(indxLow, 6*I+1:6*I+3))/(drvrData%TimeInterval**2) - u_HD%WAMITMesh%RotationAcc( :,I) = (drvrData%PRPin(indxHigh, 6*I+4:6*I+6) - 2*drvrData%PRPin(indxMid, 6*I+4:6*I+6) + drvrData%PRPin(indxLow, 6*I+4:6*I+6))/(drvrData%TimeInterval**2) + u_HD%WAMITMesh%TranslationAcc(:,I) = (drvrData%PRPin(indxHigh, 6*I+1:6*I+3) - 2.0_ReKi*drvrData%PRPin(indxMid, 6*I+1:6*I+3) + drvrData%PRPin(indxLow, 6*I+1:6*I+3))/(drvrData%TimeInterval**2) + u_HD%WAMITMesh%RotationAcc( :,I) = (drvrData%PRPin(indxHigh, 6*I+4:6*I+6) - 2.0_ReKi*drvrData%PRPin(indxMid, 6*I+4:6*I+6) + drvrData%PRPin(indxLow, 6*I+4:6*I+6))/(drvrData%TimeInterval**2) END DO - + + IF ( drvrData%NAddDOF > 0_IntKi ) THEN ! Currently only allowed if NBody = 1 + u_HD%qAddDOFdotdot(1:drvrData%NAddDOF) = ( drvrData%PRPin(indxHigh, 13:(12+drvrData%NAddDOF)) - 2.0_ReKi*drvrData%PRPin(indxMid, 13:(12+drvrData%NAddDOF)) + drvrData%PRPin(indxLow, 13:(12+drvrData%NAddDOF)) ) & + /(drvrData%TimeInterval**2) + END IF + ! Rotation - Compute angular velocity and acceleration from the rotation angles and time derivatives call EulerDerivativeToAngVelAcc(drvrData%PRPin(n,4:6),& u_HD%PRPMesh%RotationVel(:,1),& @@ -941,7 +994,7 @@ SUBROUTINE SetHDInputs(time, n, u_HD, mappingData, drvrData, ErrStat, ErrMsg) ! half of the PRP_TransferToMotionInputs routine: IF ( u_HD%Morison%Mesh%Initialized ) THEN - ! Map kinematics to the WAMIT mesh with 1 to NBody nodes + ! Map kinematics to the Morison mesh only CALL Transfer_Point_to_Point( u_HD%PRPMesh, u_HD%Morison%Mesh, mappingData%HD_Ref_2_M_P, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) END IF diff --git a/modules/hydrodyn/src/HydroDyn_Input.f90 b/modules/hydrodyn/src/HydroDyn_Input.f90 index 8cf72660e5..d46b2d3ef8 100644 --- a/modules/hydrodyn/src/HydroDyn_Input.f90 +++ b/modules/hydrodyn/src/HydroDyn_Input.f90 @@ -81,6 +81,7 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, FileInfo_In, InputFi INTEGER :: UnEc ! The local unit number for this module's echo file CHARACTER(1024) :: EchoFile ! Name of HydroDyn echo file CHARACTER(MaxFileInfoLineLen) :: Line ! String to temporarially hold value of read line + INTEGER :: NDOF ! Number of DOF in each WAMIT module real(ReKi), ALLOCATABLE :: tmpVec1(:), tmpVec2(:) ! Temporary arrays for WAMIT data integer(IntKi) :: startIndx, endIndx ! indices into working arrays INTEGER, ALLOCATABLE :: tmpArray(:) ! Temporary array storage of the joint output list @@ -206,7 +207,7 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, FileInfo_In, InputFi CALL AllocAry( InputFileData%PtfmVol0 , InputFileData%NBody, 'PtfmVol0' , ErrStat2, ErrMsg2); if (Failed()) return; CALL AllocAry( InputFileData%PtfmCOBxt , InputFileData%NBody, 'PtfmCOBxt' , ErrStat2, ErrMsg2); if (Failed()) return; CALL AllocAry( InputFileData%PtfmCOByt , InputFileData%NBody, 'PtfmCOByt' , ErrStat2, ErrMsg2); if (Failed()) return; - + CALL AllocAry( InputFileData%NAddDOF , InputFileData%NBody, 'NAddDOF' , ErrStat2, ErrMsg2); if (Failed()) return; ! PotFile - Root name of Potential flow data files (Could be WAMIT files or the FIT input file) call ParseAry( FileInfo_In, CurLine, 'PotFile', InputFileData%PotFile, InputFileData%nWAMITObj, ErrStat2, ErrMsg2, UnEc ) @@ -245,6 +246,8 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, FileInfo_In, InputFi call ParseAry( FileInfo_In, CurLine, 'PtfmCOByt', InputFileData%PtfmCOByt, InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; + call ParseAry( FileInfo_In, CurLine, 'NAddDOF', InputFileData%NAddDOF, InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; !------------------------------------------------------------------------------------------------- ! Data section for 2nd order WAMIT forces @@ -277,67 +280,66 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, FileInfo_In, InputFi ! If NBodyMod = 1 then vecMultiplier = NBody and nWAMITObj = 1 ! Else vecMultiplier = 1 and nWAMITObj = NBody - CALL AllocAry( InputFileData%AddF0, InputFileData%vecMultiplier*6, InputFileData%nWAMITObj, 'InputFileData%AddF0' , ErrStat2, ErrMsg2); if (Failed()) return; - CALL AllocAry( InputFileData%AddCLin, InputFileData%vecMultiplier*6, InputFileData%vecMultiplier*6, InputFileData%nWAMITObj, 'InputFileData%AddCLin' , ErrStat2, ErrMsg2); if (Failed()) return; - CALL AllocAry( InputFileData%AddBLin, InputFileData%vecMultiplier*6, InputFileData%vecMultiplier*6, InputFileData%nWAMITObj, 'InputFileData%AddBLin' , ErrStat2, ErrMsg2); if (Failed()) return; - CALL AllocAry( InputFileData%AddBQuad, InputFileData%vecMultiplier*6, InputFileData%vecMultiplier*6, InputFileData%nWAMITObj, 'InputFileData%AddBQuad' , ErrStat2, ErrMsg2); if (Failed()) return; - CALL AllocAry( tmpVec1, InputFileData%nWAMITObj, 'tmpVec1', ErrStat2, ErrMsg2); if (Failed()) return; - CALL AllocAry( tmpVec2, 6*InputFileData%NBody, 'tmpVec2', ErrStat2, ErrMsg2); if (Failed()) return; - - ! AddF0 - Additional preload - do i = 1,6*InputFileData%vecMultiplier + if ( InputFileData%NBody == 1_IntKi ) then + ! To avoid each WAMITObj having different NDOF, generalized DOF is currently only allowed with NBody = 1 + NDOF = 6+InputFileData%NAddDOF(1) + else + NDOF = 6*InputFileData%vecMultiplier + end if + call AllocAry( InputFileData%AddF0, NDOF, InputFileData%nWAMITObj, 'InputFileData%AddF0' , ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry( InputFileData%AddCLin, NDOF, NDOF, InputFileData%nWAMITObj, 'InputFileData%AddCLin' , ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry( InputFileData%AddBLin, NDOF, NDOF, InputFileData%nWAMITObj, 'InputFileData%AddBLin' , ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry( InputFileData%AddBQuad, NDOF, NDOF, InputFileData%nWAMITObj, 'InputFileData%AddBQuad' , ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry( tmpVec1, InputFileData%nWAMITObj , 'tmpVec1', ErrStat2, ErrMsg2); if (Failed()) return; + call AllocAry( tmpVec2, InputFileData%nWAMITObj*NDOF, 'tmpVec2', ErrStat2, ErrMsg2); if (Failed()) return; + + ! AddF0 - Additional preload + do i = 1,NDOF call ParseAry( FileInfo_In, CurLine, 'AddF0', tmpVec1, InputFileData%nWAMITObj, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; - do j = 1, InputFileData%nWAMITObj InputFileData%AddF0(i,j) = tmpVec1(j) end do end do - - ! AddCLin - do i=1,6*InputFileData%vecMultiplier - write(strI,'(I1)') i + ! AddCLin + do i = 1, NDOF + write(strI,'(I2)') i call ParseAry( FileInfo_In, CurLine, ' Row '//strI//' of the additional linear stiffness matrix', & - tmpVec2, 6*InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + tmpVec2, InputFileData%nWAMITObj*NDOF, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; - do j = 1, InputFileData%nWAMITObj - startIndx = 6*InputFileData%vecMultiplier*(j-1) + 1 - endIndx = startIndx + 6*InputFileData%vecMultiplier - 1 + startIndx = NDOF*(j-1) + 1 + endIndx = startIndx + NDOF - 1 InputFileData%AddCLin(i,:,j) = tmpVec2(startIndx:endIndx) end do end do - - ! AddBLin - DO I=1,6*InputFileData%vecMultiplier - + ! AddBLin + do i = 1, NDOF + write(strI,'(I2)') i call ParseAry( FileInfo_In, CurLine, ' Row '//strI//' of the additional linear damping matrix', & - tmpVec2, 6*InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + tmpVec2, InputFileData%nWAMITObj*NDOF, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; - do j = 1, InputFileData%nWAMITObj - startIndx = 6*InputFileData%vecMultiplier*(j-1) + 1 - endIndx = startIndx + 6*InputFileData%vecMultiplier - 1 - InputFileData%AddBLin(I,:,j) = tmpVec2(startIndx:endIndx) + startIndx = NDOF*(j-1) + 1 + endIndx = startIndx + NDOF - 1 + InputFileData%AddBLin(i,:,j) = tmpVec2(startIndx:endIndx) end do - END DO - - - ! AddBQuad - DO I=1,6*InputFileData%vecMultiplier + end do + ! AddBQuad + do i = 1, NDOF + write(strI,'(I2)') i call ParseAry( FileInfo_In, CurLine, ' Row '//strI//' of the additional quadratic damping matrix', & - tmpVec2, 6*InputFileData%NBody, ErrStat2, ErrMsg2, UnEc ) + tmpVec2, InputFileData%nWAMITObj*NDOF, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; - do j = 1, InputFileData%nWAMITObj - startIndx = 6*InputFileData%vecMultiplier*(j-1) + 1 - endIndx = startIndx + 6*InputFileData%vecMultiplier - 1 - InputFileData%AddBQuad(I,:,j) = tmpVec2(startIndx:endIndx) + startIndx = NDOF*(j-1) + 1 + endIndx = startIndx + NDOF - 1 + InputFileData%AddBQuad(i,:,j) = tmpVec2(startIndx:endIndx) end do - END DO + end do !------------------------------------------------------------------------------------------------- ! Strip Theory Section @@ -353,6 +355,10 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, FileInfo_In, InputFi call ParseVar( FileInfo_In, CurLine, 'AMMod', InputFileData%Morison%AMMod, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; + ! HstMod - Method of computing strip-theory hydrostatic loads. {0: Up to the still water level. 1: Up to the instantaneous free surface} (switch) + call ParseVar( FileInfo_In, CurLine, 'HstMod', InputFileData%Morison%HstMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + !------------------------------------------------------------------------------------------------- ! Axial Coefficients Section !------------------------------------------------------------------------------------------------- @@ -1524,6 +1530,29 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS end do END IF + IF ( InputFileData%PotMod == 1 ) THEN + do i = 1,InputFileData%NBody + IF ( InputFileData%NAddDOF(i) < 0 )THEN + CALL SetErrStat( ErrID_Fatal,'NAddDOF must be non-negative for all WAMIT bodies.',ErrStat,ErrMsg,RoutineName) + RETURN + END IF + end do + END IF + + InputFileData%hasAddDOF = any( InputFileData%NAddDOF > 0_IntKi ) + IF ( InputFileData%PotMod == 1 .and. InputFileData%hasAddDOF .and. InputFileData%NBody > 1 ) THEN + CALL SetErrStat( ErrID_Fatal,'Nonzero NAddDOF is currently only allowed with NBody=1.',ErrStat,ErrMsg,RoutineName) + RETURN + END IF + IF ( InputFileData%PotMod == 1 .and. InputFileData%hasAddDOF .and. InputFileData%Wamit%ExctnMod == 2 ) THEN + CALL SetErrStat( ErrID_Fatal,'Nonzero NAddDOF currently cannot be used with state-space wave exctiation model (ExctnMod=2). Need ExctnMod = 0 or 1.',ErrStat,ErrMsg,RoutineName) + RETURN + END IF + IF ( InputFileData%PotMod == 1 .and. InputFileData%hasAddDOF .and. InputFileData%Wamit%RdtnMod == 2 ) THEN + CALL SetErrStat( ErrID_Fatal,'Nonzero NAddDOF currently cannot be used with state-space wave radiation model (RdtnMod=2). Need RdtnMod = 0 or 1.',ErrStat,ErrMsg,RoutineName) + RETURN + END IF + ! RdtnTMax - Analysis time for wave radiation kernel calculations ! NOTE: Use RdtnTMax = 0.0 to eliminate wave radiation damping @@ -1809,7 +1838,10 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS CALL SetErrStat( ErrID_Fatal,'AMMod must be 0 or 1',ErrStat,ErrMsg,RoutineName) RETURN END IF - + IF ( InputFileData%Morison%HstMod /= 0 .AND. InputFileData%Morison%HstMod /= 1) THEN + CALL SetErrStat( ErrID_Fatal,'HstMod must be 0 or 1',ErrStat,ErrMsg,RoutineName) + RETURN + END IF !------------------------------------------------------------------------------------------------- ! Member Joints Section diff --git a/modules/hydrodyn/src/HydroDyn_Output.f90 b/modules/hydrodyn/src/HydroDyn_Output.f90 index 3d823bcdd9..aab5dab29c 100644 --- a/modules/hydrodyn/src/HydroDyn_Output.f90 +++ b/modules/hydrodyn/src/HydroDyn_Output.f90 @@ -44,537 +44,6774 @@ MODULE HydroDyn_Output ! Time: - INTEGER(IntKi), PARAMETER :: Time = 0 + INTEGER(IntKi), PARAMETER :: Time = 0 ! Integrated Hydrodynamic Loads at (0,0,0): - INTEGER(IntKi), PARAMETER :: HydroFxi = 1 - INTEGER(IntKi), PARAMETER :: HydroFyi = 2 - INTEGER(IntKi), PARAMETER :: HydroFzi = 3 - INTEGER(IntKi), PARAMETER :: HydroMxi = 4 - INTEGER(IntKi), PARAMETER :: HydroMyi = 5 - INTEGER(IntKi), PARAMETER :: HydroMzi = 6 + INTEGER(IntKi), PARAMETER :: HydroFxi = 1 + INTEGER(IntKi), PARAMETER :: HydroFyi = 2 + INTEGER(IntKi), PARAMETER :: HydroFzi = 3 + INTEGER(IntKi), PARAMETER :: HydroMxi = 4 + INTEGER(IntKi), PARAMETER :: HydroMyi = 5 + INTEGER(IntKi), PARAMETER :: HydroMzi = 6 ! PRP Body Kinematics: - INTEGER(IntKi), PARAMETER :: PRPSurge = 7 - INTEGER(IntKi), PARAMETER :: PRPSway = 8 - INTEGER(IntKi), PARAMETER :: PRPHeave = 9 - INTEGER(IntKi), PARAMETER :: PRPRoll = 10 - INTEGER(IntKi), PARAMETER :: PRPPitch = 11 - INTEGER(IntKi), PARAMETER :: PRPYaw = 12 - INTEGER(IntKi), PARAMETER :: PRPTVxi = 13 - INTEGER(IntKi), PARAMETER :: PRPTVyi = 14 - INTEGER(IntKi), PARAMETER :: PRPTVzi = 15 - INTEGER(IntKi), PARAMETER :: PRPRVxi = 16 - INTEGER(IntKi), PARAMETER :: PRPRVyi = 17 - INTEGER(IntKi), PARAMETER :: PRPRVzi = 18 - INTEGER(IntKi), PARAMETER :: PRPTAxi = 19 - INTEGER(IntKi), PARAMETER :: PRPTAyi = 20 - INTEGER(IntKi), PARAMETER :: PRPTAzi = 21 - INTEGER(IntKi), PARAMETER :: PRPRAxi = 22 - INTEGER(IntKi), PARAMETER :: PRPRAyi = 23 - INTEGER(IntKi), PARAMETER :: PRPRAzi = 24 + INTEGER(IntKi), PARAMETER :: PRPSurge = 7 + INTEGER(IntKi), PARAMETER :: PRPSway = 8 + INTEGER(IntKi), PARAMETER :: PRPHeave = 9 + INTEGER(IntKi), PARAMETER :: PRPRoll = 10 + INTEGER(IntKi), PARAMETER :: PRPPitch = 11 + INTEGER(IntKi), PARAMETER :: PRPYaw = 12 + INTEGER(IntKi), PARAMETER :: PRPTVxi = 13 + INTEGER(IntKi), PARAMETER :: PRPTVyi = 14 + INTEGER(IntKi), PARAMETER :: PRPTVzi = 15 + INTEGER(IntKi), PARAMETER :: PRPRVxi = 16 + INTEGER(IntKi), PARAMETER :: PRPRVyi = 17 + INTEGER(IntKi), PARAMETER :: PRPRVzi = 18 + INTEGER(IntKi), PARAMETER :: PRPTAxi = 19 + INTEGER(IntKi), PARAMETER :: PRPTAyi = 20 + INTEGER(IntKi), PARAMETER :: PRPTAzi = 21 + INTEGER(IntKi), PARAMETER :: PRPRAxi = 22 + INTEGER(IntKi), PARAMETER :: PRPRAyi = 23 + INTEGER(IntKi), PARAMETER :: PRPRAzi = 24 ! WAMIT Body Kinematics: - INTEGER(IntKi), PARAMETER :: B1Surge = 25 - INTEGER(IntKi), PARAMETER :: B1Sway = 26 - INTEGER(IntKi), PARAMETER :: B1Heave = 27 - INTEGER(IntKi), PARAMETER :: B1Roll = 28 - INTEGER(IntKi), PARAMETER :: B1Pitch = 29 - INTEGER(IntKi), PARAMETER :: B1Yaw = 30 - INTEGER(IntKi), PARAMETER :: B1TVxi = 31 - INTEGER(IntKi), PARAMETER :: B1TVyi = 32 - INTEGER(IntKi), PARAMETER :: B1TVzi = 33 - INTEGER(IntKi), PARAMETER :: B1RVxi = 34 - INTEGER(IntKi), PARAMETER :: B1RVyi = 35 - INTEGER(IntKi), PARAMETER :: B1RVzi = 36 - INTEGER(IntKi), PARAMETER :: B1TAxi = 37 - INTEGER(IntKi), PARAMETER :: B1TAyi = 38 - INTEGER(IntKi), PARAMETER :: B1TAzi = 39 - INTEGER(IntKi), PARAMETER :: B1RAxi = 40 - INTEGER(IntKi), PARAMETER :: B1RAyi = 41 - INTEGER(IntKi), PARAMETER :: B1RAzi = 42 - INTEGER(IntKi), PARAMETER :: B2Surge = 43 - INTEGER(IntKi), PARAMETER :: B2Sway = 44 - INTEGER(IntKi), PARAMETER :: B2Heave = 45 - INTEGER(IntKi), PARAMETER :: B2Roll = 46 - INTEGER(IntKi), PARAMETER :: B2Pitch = 47 - INTEGER(IntKi), PARAMETER :: B2Yaw = 48 - INTEGER(IntKi), PARAMETER :: B2TVxi = 49 - INTEGER(IntKi), PARAMETER :: B2TVyi = 50 - INTEGER(IntKi), PARAMETER :: B2TVzi = 51 - INTEGER(IntKi), PARAMETER :: B2RVxi = 52 - INTEGER(IntKi), PARAMETER :: B2RVyi = 53 - INTEGER(IntKi), PARAMETER :: B2RVzi = 54 - INTEGER(IntKi), PARAMETER :: B2TAxi = 55 - INTEGER(IntKi), PARAMETER :: B2TAyi = 56 - INTEGER(IntKi), PARAMETER :: B2TAzi = 57 - INTEGER(IntKi), PARAMETER :: B2RAxi = 58 - INTEGER(IntKi), PARAMETER :: B2RAyi = 59 - INTEGER(IntKi), PARAMETER :: B2RAzi = 60 - INTEGER(IntKi), PARAMETER :: B3Surge = 61 - INTEGER(IntKi), PARAMETER :: B3Sway = 62 - INTEGER(IntKi), PARAMETER :: B3Heave = 63 - INTEGER(IntKi), PARAMETER :: B3Roll = 64 - INTEGER(IntKi), PARAMETER :: B3Pitch = 65 - INTEGER(IntKi), PARAMETER :: B3Yaw = 66 - INTEGER(IntKi), PARAMETER :: B3TVxi = 67 - INTEGER(IntKi), PARAMETER :: B3TVyi = 68 - INTEGER(IntKi), PARAMETER :: B3TVzi = 69 - INTEGER(IntKi), PARAMETER :: B3RVxi = 70 - INTEGER(IntKi), PARAMETER :: B3RVyi = 71 - INTEGER(IntKi), PARAMETER :: B3RVzi = 72 - INTEGER(IntKi), PARAMETER :: B3TAxi = 73 - INTEGER(IntKi), PARAMETER :: B3TAyi = 74 - INTEGER(IntKi), PARAMETER :: B3TAzi = 75 - INTEGER(IntKi), PARAMETER :: B3RAxi = 76 - INTEGER(IntKi), PARAMETER :: B3RAyi = 77 - INTEGER(IntKi), PARAMETER :: B3RAzi = 78 - INTEGER(IntKi), PARAMETER :: B4Surge = 79 - INTEGER(IntKi), PARAMETER :: B4Sway = 80 - INTEGER(IntKi), PARAMETER :: B4Heave = 81 - INTEGER(IntKi), PARAMETER :: B4Roll = 82 - INTEGER(IntKi), PARAMETER :: B4Pitch = 83 - INTEGER(IntKi), PARAMETER :: B4Yaw = 84 - INTEGER(IntKi), PARAMETER :: B4TVxi = 85 - INTEGER(IntKi), PARAMETER :: B4TVyi = 86 - INTEGER(IntKi), PARAMETER :: B4TVzi = 87 - INTEGER(IntKi), PARAMETER :: B4RVxi = 88 - INTEGER(IntKi), PARAMETER :: B4RVyi = 89 - INTEGER(IntKi), PARAMETER :: B4RVzi = 90 - INTEGER(IntKi), PARAMETER :: B4TAxi = 91 - INTEGER(IntKi), PARAMETER :: B4TAyi = 92 - INTEGER(IntKi), PARAMETER :: B4TAzi = 93 - INTEGER(IntKi), PARAMETER :: B4RAxi = 94 - INTEGER(IntKi), PARAMETER :: B4RAyi = 95 - INTEGER(IntKi), PARAMETER :: B4RAzi = 96 - INTEGER(IntKi), PARAMETER :: B5Surge = 97 - INTEGER(IntKi), PARAMETER :: B5Sway = 98 - INTEGER(IntKi), PARAMETER :: B5Heave = 99 - INTEGER(IntKi), PARAMETER :: B5Roll = 100 - INTEGER(IntKi), PARAMETER :: B5Pitch = 101 - INTEGER(IntKi), PARAMETER :: B5Yaw = 102 - INTEGER(IntKi), PARAMETER :: B5TVxi = 103 - INTEGER(IntKi), PARAMETER :: B5TVyi = 104 - INTEGER(IntKi), PARAMETER :: B5TVzi = 105 - INTEGER(IntKi), PARAMETER :: B5RVxi = 106 - INTEGER(IntKi), PARAMETER :: B5RVyi = 107 - INTEGER(IntKi), PARAMETER :: B5RVzi = 108 - INTEGER(IntKi), PARAMETER :: B5TAxi = 109 - INTEGER(IntKi), PARAMETER :: B5TAyi = 110 - INTEGER(IntKi), PARAMETER :: B5TAzi = 111 - INTEGER(IntKi), PARAMETER :: B5RAxi = 112 - INTEGER(IntKi), PARAMETER :: B5RAyi = 113 - INTEGER(IntKi), PARAMETER :: B5RAzi = 114 - INTEGER(IntKi), PARAMETER :: B6Surge = 115 - INTEGER(IntKi), PARAMETER :: B6Sway = 116 - INTEGER(IntKi), PARAMETER :: B6Heave = 117 - INTEGER(IntKi), PARAMETER :: B6Roll = 118 - INTEGER(IntKi), PARAMETER :: B6Pitch = 119 - INTEGER(IntKi), PARAMETER :: B6Yaw = 120 - INTEGER(IntKi), PARAMETER :: B6TVxi = 121 - INTEGER(IntKi), PARAMETER :: B6TVyi = 122 - INTEGER(IntKi), PARAMETER :: B6TVzi = 123 - INTEGER(IntKi), PARAMETER :: B6RVxi = 124 - INTEGER(IntKi), PARAMETER :: B6RVyi = 125 - INTEGER(IntKi), PARAMETER :: B6RVzi = 126 - INTEGER(IntKi), PARAMETER :: B6TAxi = 127 - INTEGER(IntKi), PARAMETER :: B6TAyi = 128 - INTEGER(IntKi), PARAMETER :: B6TAzi = 129 - INTEGER(IntKi), PARAMETER :: B6RAxi = 130 - INTEGER(IntKi), PARAMETER :: B6RAyi = 131 - INTEGER(IntKi), PARAMETER :: B6RAzi = 132 - INTEGER(IntKi), PARAMETER :: B7Surge = 133 - INTEGER(IntKi), PARAMETER :: B7Sway = 134 - INTEGER(IntKi), PARAMETER :: B7Heave = 135 - INTEGER(IntKi), PARAMETER :: B7Roll = 136 - INTEGER(IntKi), PARAMETER :: B7Pitch = 137 - INTEGER(IntKi), PARAMETER :: B7Yaw = 138 - INTEGER(IntKi), PARAMETER :: B7TVxi = 139 - INTEGER(IntKi), PARAMETER :: B7TVyi = 140 - INTEGER(IntKi), PARAMETER :: B7TVzi = 141 - INTEGER(IntKi), PARAMETER :: B7RVxi = 142 - INTEGER(IntKi), PARAMETER :: B7RVyi = 143 - INTEGER(IntKi), PARAMETER :: B7RVzi = 144 - INTEGER(IntKi), PARAMETER :: B7TAxi = 145 - INTEGER(IntKi), PARAMETER :: B7TAyi = 146 - INTEGER(IntKi), PARAMETER :: B7TAzi = 147 - INTEGER(IntKi), PARAMETER :: B7RAxi = 148 - INTEGER(IntKi), PARAMETER :: B7RAyi = 149 - INTEGER(IntKi), PARAMETER :: B7RAzi = 150 - INTEGER(IntKi), PARAMETER :: B8Surge = 151 - INTEGER(IntKi), PARAMETER :: B8Sway = 152 - INTEGER(IntKi), PARAMETER :: B8Heave = 153 - INTEGER(IntKi), PARAMETER :: B8Roll = 154 - INTEGER(IntKi), PARAMETER :: B8Pitch = 155 - INTEGER(IntKi), PARAMETER :: B8Yaw = 156 - INTEGER(IntKi), PARAMETER :: B8TVxi = 157 - INTEGER(IntKi), PARAMETER :: B8TVyi = 158 - INTEGER(IntKi), PARAMETER :: B8TVzi = 159 - INTEGER(IntKi), PARAMETER :: B8RVxi = 160 - INTEGER(IntKi), PARAMETER :: B8RVyi = 161 - INTEGER(IntKi), PARAMETER :: B8RVzi = 162 - INTEGER(IntKi), PARAMETER :: B8TAxi = 163 - INTEGER(IntKi), PARAMETER :: B8TAyi = 164 - INTEGER(IntKi), PARAMETER :: B8TAzi = 165 - INTEGER(IntKi), PARAMETER :: B8RAxi = 166 - INTEGER(IntKi), PARAMETER :: B8RAyi = 167 - INTEGER(IntKi), PARAMETER :: B8RAzi = 168 - INTEGER(IntKi), PARAMETER :: B9Surge = 169 - INTEGER(IntKi), PARAMETER :: B9Sway = 170 - INTEGER(IntKi), PARAMETER :: B9Heave = 171 - INTEGER(IntKi), PARAMETER :: B9Roll = 172 - INTEGER(IntKi), PARAMETER :: B9Pitch = 173 - INTEGER(IntKi), PARAMETER :: B9Yaw = 174 - INTEGER(IntKi), PARAMETER :: B9TVxi = 175 - INTEGER(IntKi), PARAMETER :: B9TVyi = 176 - INTEGER(IntKi), PARAMETER :: B9TVzi = 177 - INTEGER(IntKi), PARAMETER :: B9RVxi = 178 - INTEGER(IntKi), PARAMETER :: B9RVyi = 179 - INTEGER(IntKi), PARAMETER :: B9RVzi = 180 - INTEGER(IntKi), PARAMETER :: B9TAxi = 181 - INTEGER(IntKi), PARAMETER :: B9TAyi = 182 - INTEGER(IntKi), PARAMETER :: B9TAzi = 183 - INTEGER(IntKi), PARAMETER :: B9RAxi = 184 - INTEGER(IntKi), PARAMETER :: B9RAyi = 185 - INTEGER(IntKi), PARAMETER :: B9RAzi = 186 + INTEGER(IntKi), PARAMETER :: B1Surge = 25 + INTEGER(IntKi), PARAMETER :: B1Sway = 26 + INTEGER(IntKi), PARAMETER :: B1Heave = 27 + INTEGER(IntKi), PARAMETER :: B1Roll = 28 + INTEGER(IntKi), PARAMETER :: B1Pitch = 29 + INTEGER(IntKi), PARAMETER :: B1Yaw = 30 + INTEGER(IntKi), PARAMETER :: B1TVxi = 31 + INTEGER(IntKi), PARAMETER :: B1TVyi = 32 + INTEGER(IntKi), PARAMETER :: B1TVzi = 33 + INTEGER(IntKi), PARAMETER :: B1RVxi = 34 + INTEGER(IntKi), PARAMETER :: B1RVyi = 35 + INTEGER(IntKi), PARAMETER :: B1RVzi = 36 + INTEGER(IntKi), PARAMETER :: B1TAxi = 37 + INTEGER(IntKi), PARAMETER :: B1TAyi = 38 + INTEGER(IntKi), PARAMETER :: B1TAzi = 39 + INTEGER(IntKi), PARAMETER :: B1RAxi = 40 + INTEGER(IntKi), PARAMETER :: B1RAyi = 41 + INTEGER(IntKi), PARAMETER :: B1RAzi = 42 + INTEGER(IntKi), PARAMETER :: B2Surge = 43 + INTEGER(IntKi), PARAMETER :: B2Sway = 44 + INTEGER(IntKi), PARAMETER :: B2Heave = 45 + INTEGER(IntKi), PARAMETER :: B2Roll = 46 + INTEGER(IntKi), PARAMETER :: B2Pitch = 47 + INTEGER(IntKi), PARAMETER :: B2Yaw = 48 + INTEGER(IntKi), PARAMETER :: B2TVxi = 49 + INTEGER(IntKi), PARAMETER :: B2TVyi = 50 + INTEGER(IntKi), PARAMETER :: B2TVzi = 51 + INTEGER(IntKi), PARAMETER :: B2RVxi = 52 + INTEGER(IntKi), PARAMETER :: B2RVyi = 53 + INTEGER(IntKi), PARAMETER :: B2RVzi = 54 + INTEGER(IntKi), PARAMETER :: B2TAxi = 55 + INTEGER(IntKi), PARAMETER :: B2TAyi = 56 + INTEGER(IntKi), PARAMETER :: B2TAzi = 57 + INTEGER(IntKi), PARAMETER :: B2RAxi = 58 + INTEGER(IntKi), PARAMETER :: B2RAyi = 59 + INTEGER(IntKi), PARAMETER :: B2RAzi = 60 + INTEGER(IntKi), PARAMETER :: B3Surge = 61 + INTEGER(IntKi), PARAMETER :: B3Sway = 62 + INTEGER(IntKi), PARAMETER :: B3Heave = 63 + INTEGER(IntKi), PARAMETER :: B3Roll = 64 + INTEGER(IntKi), PARAMETER :: B3Pitch = 65 + INTEGER(IntKi), PARAMETER :: B3Yaw = 66 + INTEGER(IntKi), PARAMETER :: B3TVxi = 67 + INTEGER(IntKi), PARAMETER :: B3TVyi = 68 + INTEGER(IntKi), PARAMETER :: B3TVzi = 69 + INTEGER(IntKi), PARAMETER :: B3RVxi = 70 + INTEGER(IntKi), PARAMETER :: B3RVyi = 71 + INTEGER(IntKi), PARAMETER :: B3RVzi = 72 + INTEGER(IntKi), PARAMETER :: B3TAxi = 73 + INTEGER(IntKi), PARAMETER :: B3TAyi = 74 + INTEGER(IntKi), PARAMETER :: B3TAzi = 75 + INTEGER(IntKi), PARAMETER :: B3RAxi = 76 + INTEGER(IntKi), PARAMETER :: B3RAyi = 77 + INTEGER(IntKi), PARAMETER :: B3RAzi = 78 + INTEGER(IntKi), PARAMETER :: B4Surge = 79 + INTEGER(IntKi), PARAMETER :: B4Sway = 80 + INTEGER(IntKi), PARAMETER :: B4Heave = 81 + INTEGER(IntKi), PARAMETER :: B4Roll = 82 + INTEGER(IntKi), PARAMETER :: B4Pitch = 83 + INTEGER(IntKi), PARAMETER :: B4Yaw = 84 + INTEGER(IntKi), PARAMETER :: B4TVxi = 85 + INTEGER(IntKi), PARAMETER :: B4TVyi = 86 + INTEGER(IntKi), PARAMETER :: B4TVzi = 87 + INTEGER(IntKi), PARAMETER :: B4RVxi = 88 + INTEGER(IntKi), PARAMETER :: B4RVyi = 89 + INTEGER(IntKi), PARAMETER :: B4RVzi = 90 + INTEGER(IntKi), PARAMETER :: B4TAxi = 91 + INTEGER(IntKi), PARAMETER :: B4TAyi = 92 + INTEGER(IntKi), PARAMETER :: B4TAzi = 93 + INTEGER(IntKi), PARAMETER :: B4RAxi = 94 + INTEGER(IntKi), PARAMETER :: B4RAyi = 95 + INTEGER(IntKi), PARAMETER :: B4RAzi = 96 + INTEGER(IntKi), PARAMETER :: B5Surge = 97 + INTEGER(IntKi), PARAMETER :: B5Sway = 98 + INTEGER(IntKi), PARAMETER :: B5Heave = 99 + INTEGER(IntKi), PARAMETER :: B5Roll = 100 + INTEGER(IntKi), PARAMETER :: B5Pitch = 101 + INTEGER(IntKi), PARAMETER :: B5Yaw = 102 + INTEGER(IntKi), PARAMETER :: B5TVxi = 103 + INTEGER(IntKi), PARAMETER :: B5TVyi = 104 + INTEGER(IntKi), PARAMETER :: B5TVzi = 105 + INTEGER(IntKi), PARAMETER :: B5RVxi = 106 + INTEGER(IntKi), PARAMETER :: B5RVyi = 107 + INTEGER(IntKi), PARAMETER :: B5RVzi = 108 + INTEGER(IntKi), PARAMETER :: B5TAxi = 109 + INTEGER(IntKi), PARAMETER :: B5TAyi = 110 + INTEGER(IntKi), PARAMETER :: B5TAzi = 111 + INTEGER(IntKi), PARAMETER :: B5RAxi = 112 + INTEGER(IntKi), PARAMETER :: B5RAyi = 113 + INTEGER(IntKi), PARAMETER :: B5RAzi = 114 + INTEGER(IntKi), PARAMETER :: B6Surge = 115 + INTEGER(IntKi), PARAMETER :: B6Sway = 116 + INTEGER(IntKi), PARAMETER :: B6Heave = 117 + INTEGER(IntKi), PARAMETER :: B6Roll = 118 + INTEGER(IntKi), PARAMETER :: B6Pitch = 119 + INTEGER(IntKi), PARAMETER :: B6Yaw = 120 + INTEGER(IntKi), PARAMETER :: B6TVxi = 121 + INTEGER(IntKi), PARAMETER :: B6TVyi = 122 + INTEGER(IntKi), PARAMETER :: B6TVzi = 123 + INTEGER(IntKi), PARAMETER :: B6RVxi = 124 + INTEGER(IntKi), PARAMETER :: B6RVyi = 125 + INTEGER(IntKi), PARAMETER :: B6RVzi = 126 + INTEGER(IntKi), PARAMETER :: B6TAxi = 127 + INTEGER(IntKi), PARAMETER :: B6TAyi = 128 + INTEGER(IntKi), PARAMETER :: B6TAzi = 129 + INTEGER(IntKi), PARAMETER :: B6RAxi = 130 + INTEGER(IntKi), PARAMETER :: B6RAyi = 131 + INTEGER(IntKi), PARAMETER :: B6RAzi = 132 + INTEGER(IntKi), PARAMETER :: B7Surge = 133 + INTEGER(IntKi), PARAMETER :: B7Sway = 134 + INTEGER(IntKi), PARAMETER :: B7Heave = 135 + INTEGER(IntKi), PARAMETER :: B7Roll = 136 + INTEGER(IntKi), PARAMETER :: B7Pitch = 137 + INTEGER(IntKi), PARAMETER :: B7Yaw = 138 + INTEGER(IntKi), PARAMETER :: B7TVxi = 139 + INTEGER(IntKi), PARAMETER :: B7TVyi = 140 + INTEGER(IntKi), PARAMETER :: B7TVzi = 141 + INTEGER(IntKi), PARAMETER :: B7RVxi = 142 + INTEGER(IntKi), PARAMETER :: B7RVyi = 143 + INTEGER(IntKi), PARAMETER :: B7RVzi = 144 + INTEGER(IntKi), PARAMETER :: B7TAxi = 145 + INTEGER(IntKi), PARAMETER :: B7TAyi = 146 + INTEGER(IntKi), PARAMETER :: B7TAzi = 147 + INTEGER(IntKi), PARAMETER :: B7RAxi = 148 + INTEGER(IntKi), PARAMETER :: B7RAyi = 149 + INTEGER(IntKi), PARAMETER :: B7RAzi = 150 + INTEGER(IntKi), PARAMETER :: B8Surge = 151 + INTEGER(IntKi), PARAMETER :: B8Sway = 152 + INTEGER(IntKi), PARAMETER :: B8Heave = 153 + INTEGER(IntKi), PARAMETER :: B8Roll = 154 + INTEGER(IntKi), PARAMETER :: B8Pitch = 155 + INTEGER(IntKi), PARAMETER :: B8Yaw = 156 + INTEGER(IntKi), PARAMETER :: B8TVxi = 157 + INTEGER(IntKi), PARAMETER :: B8TVyi = 158 + INTEGER(IntKi), PARAMETER :: B8TVzi = 159 + INTEGER(IntKi), PARAMETER :: B8RVxi = 160 + INTEGER(IntKi), PARAMETER :: B8RVyi = 161 + INTEGER(IntKi), PARAMETER :: B8RVzi = 162 + INTEGER(IntKi), PARAMETER :: B8TAxi = 163 + INTEGER(IntKi), PARAMETER :: B8TAyi = 164 + INTEGER(IntKi), PARAMETER :: B8TAzi = 165 + INTEGER(IntKi), PARAMETER :: B8RAxi = 166 + INTEGER(IntKi), PARAMETER :: B8RAyi = 167 + INTEGER(IntKi), PARAMETER :: B8RAzi = 168 + INTEGER(IntKi), PARAMETER :: B9Surge = 169 + INTEGER(IntKi), PARAMETER :: B9Sway = 170 + INTEGER(IntKi), PARAMETER :: B9Heave = 171 + INTEGER(IntKi), PARAMETER :: B9Roll = 172 + INTEGER(IntKi), PARAMETER :: B9Pitch = 173 + INTEGER(IntKi), PARAMETER :: B9Yaw = 174 + INTEGER(IntKi), PARAMETER :: B9TVxi = 175 + INTEGER(IntKi), PARAMETER :: B9TVyi = 176 + INTEGER(IntKi), PARAMETER :: B9TVzi = 177 + INTEGER(IntKi), PARAMETER :: B9RVxi = 178 + INTEGER(IntKi), PARAMETER :: B9RVyi = 179 + INTEGER(IntKi), PARAMETER :: B9RVzi = 180 + INTEGER(IntKi), PARAMETER :: B9TAxi = 181 + INTEGER(IntKi), PARAMETER :: B9TAyi = 182 + INTEGER(IntKi), PARAMETER :: B9TAzi = 183 + INTEGER(IntKi), PARAMETER :: B9RAxi = 184 + INTEGER(IntKi), PARAMETER :: B9RAyi = 185 + INTEGER(IntKi), PARAMETER :: B9RAzi = 186 + INTEGER(IntKi), PARAMETER :: B1ADOF1D = 187 + INTEGER(IntKi), PARAMETER :: B1ADOF2D = 188 + INTEGER(IntKi), PARAMETER :: B1ADOF3D = 189 + INTEGER(IntKi), PARAMETER :: B1ADOF4D = 190 + INTEGER(IntKi), PARAMETER :: B1ADOF5D = 191 + INTEGER(IntKi), PARAMETER :: B1ADOF6D = 192 + INTEGER(IntKi), PARAMETER :: B1ADOF7D = 193 + INTEGER(IntKi), PARAMETER :: B1ADOF8D = 194 + INTEGER(IntKi), PARAMETER :: B1ADOF9D = 195 + INTEGER(IntKi), PARAMETER :: B1ADOF10D = 196 + INTEGER(IntKi), PARAMETER :: B1ADOF11D = 197 + INTEGER(IntKi), PARAMETER :: B1ADOF12D = 198 + INTEGER(IntKi), PARAMETER :: B1ADOF13D = 199 + INTEGER(IntKi), PARAMETER :: B1ADOF14D = 200 + INTEGER(IntKi), PARAMETER :: B1ADOF15D = 201 + INTEGER(IntKi), PARAMETER :: B1ADOF16D = 202 + INTEGER(IntKi), PARAMETER :: B1ADOF17D = 203 + INTEGER(IntKi), PARAMETER :: B1ADOF18D = 204 + INTEGER(IntKi), PARAMETER :: B1ADOF19D = 205 + INTEGER(IntKi), PARAMETER :: B1ADOF20D = 206 + INTEGER(IntKi), PARAMETER :: B1ADOF21D = 207 + INTEGER(IntKi), PARAMETER :: B1ADOF22D = 208 + INTEGER(IntKi), PARAMETER :: B1ADOF23D = 209 + INTEGER(IntKi), PARAMETER :: B1ADOF24D = 210 + INTEGER(IntKi), PARAMETER :: B1ADOF25D = 211 + INTEGER(IntKi), PARAMETER :: B1ADOF26D = 212 + INTEGER(IntKi), PARAMETER :: B1ADOF27D = 213 + INTEGER(IntKi), PARAMETER :: B1ADOF28D = 214 + INTEGER(IntKi), PARAMETER :: B1ADOF29D = 215 + INTEGER(IntKi), PARAMETER :: B1ADOF30D = 216 + INTEGER(IntKi), PARAMETER :: B1ADOF31D = 217 + INTEGER(IntKi), PARAMETER :: B1ADOF32D = 218 + INTEGER(IntKi), PARAMETER :: B1ADOF33D = 219 + INTEGER(IntKi), PARAMETER :: B1ADOF34D = 220 + INTEGER(IntKi), PARAMETER :: B1ADOF35D = 221 + INTEGER(IntKi), PARAMETER :: B1ADOF36D = 222 + INTEGER(IntKi), PARAMETER :: B1ADOF37D = 223 + INTEGER(IntKi), PARAMETER :: B1ADOF38D = 224 + INTEGER(IntKi), PARAMETER :: B1ADOF39D = 225 + INTEGER(IntKi), PARAMETER :: B1ADOF40D = 226 + INTEGER(IntKi), PARAMETER :: B1ADOF41D = 227 + INTEGER(IntKi), PARAMETER :: B1ADOF42D = 228 + INTEGER(IntKi), PARAMETER :: B1ADOF43D = 229 + INTEGER(IntKi), PARAMETER :: B1ADOF44D = 230 + INTEGER(IntKi), PARAMETER :: B1ADOF45D = 231 + INTEGER(IntKi), PARAMETER :: B1ADOF46D = 232 + INTEGER(IntKi), PARAMETER :: B1ADOF47D = 233 + INTEGER(IntKi), PARAMETER :: B1ADOF48D = 234 + INTEGER(IntKi), PARAMETER :: B1ADOF49D = 235 + INTEGER(IntKi), PARAMETER :: B1ADOF50D = 236 + INTEGER(IntKi), PARAMETER :: B1ADOF51D = 237 + INTEGER(IntKi), PARAMETER :: B1ADOF52D = 238 + INTEGER(IntKi), PARAMETER :: B1ADOF53D = 239 + INTEGER(IntKi), PARAMETER :: B1ADOF54D = 240 + INTEGER(IntKi), PARAMETER :: B1ADOF55D = 241 + INTEGER(IntKi), PARAMETER :: B1ADOF56D = 242 + INTEGER(IntKi), PARAMETER :: B1ADOF57D = 243 + INTEGER(IntKi), PARAMETER :: B1ADOF58D = 244 + INTEGER(IntKi), PARAMETER :: B1ADOF59D = 245 + INTEGER(IntKi), PARAMETER :: B1ADOF60D = 246 + INTEGER(IntKi), PARAMETER :: B1ADOF61D = 247 + INTEGER(IntKi), PARAMETER :: B1ADOF62D = 248 + INTEGER(IntKi), PARAMETER :: B1ADOF63D = 249 + INTEGER(IntKi), PARAMETER :: B1ADOF64D = 250 + INTEGER(IntKi), PARAMETER :: B1ADOF65D = 251 + INTEGER(IntKi), PARAMETER :: B1ADOF66D = 252 + INTEGER(IntKi), PARAMETER :: B1ADOF67D = 253 + INTEGER(IntKi), PARAMETER :: B1ADOF68D = 254 + INTEGER(IntKi), PARAMETER :: B1ADOF69D = 255 + INTEGER(IntKi), PARAMETER :: B1ADOF70D = 256 + INTEGER(IntKi), PARAMETER :: B1ADOF71D = 257 + INTEGER(IntKi), PARAMETER :: B1ADOF72D = 258 + INTEGER(IntKi), PARAMETER :: B1ADOF73D = 259 + INTEGER(IntKi), PARAMETER :: B1ADOF74D = 260 + INTEGER(IntKi), PARAMETER :: B1ADOF75D = 261 + INTEGER(IntKi), PARAMETER :: B1ADOF76D = 262 + INTEGER(IntKi), PARAMETER :: B1ADOF77D = 263 + INTEGER(IntKi), PARAMETER :: B1ADOF78D = 264 + INTEGER(IntKi), PARAMETER :: B1ADOF79D = 265 + INTEGER(IntKi), PARAMETER :: B1ADOF80D = 266 + INTEGER(IntKi), PARAMETER :: B1ADOF81D = 267 + INTEGER(IntKi), PARAMETER :: B1ADOF82D = 268 + INTEGER(IntKi), PARAMETER :: B1ADOF83D = 269 + INTEGER(IntKi), PARAMETER :: B1ADOF84D = 270 + INTEGER(IntKi), PARAMETER :: B1ADOF85D = 271 + INTEGER(IntKi), PARAMETER :: B1ADOF86D = 272 + INTEGER(IntKi), PARAMETER :: B1ADOF87D = 273 + INTEGER(IntKi), PARAMETER :: B1ADOF88D = 274 + INTEGER(IntKi), PARAMETER :: B1ADOF89D = 275 + INTEGER(IntKi), PARAMETER :: B1ADOF90D = 276 + INTEGER(IntKi), PARAMETER :: B1ADOF91D = 277 + INTEGER(IntKi), PARAMETER :: B1ADOF92D = 278 + INTEGER(IntKi), PARAMETER :: B1ADOF93D = 279 + INTEGER(IntKi), PARAMETER :: B1ADOF94D = 280 + INTEGER(IntKi), PARAMETER :: B1ADOF95D = 281 + INTEGER(IntKi), PARAMETER :: B1ADOF96D = 282 + INTEGER(IntKi), PARAMETER :: B1ADOF97D = 283 + INTEGER(IntKi), PARAMETER :: B1ADOF98D = 284 + INTEGER(IntKi), PARAMETER :: B1ADOF99D = 285 + INTEGER(IntKi), PARAMETER :: B2ADOF1D = 286 + INTEGER(IntKi), PARAMETER :: B2ADOF2D = 287 + INTEGER(IntKi), PARAMETER :: B2ADOF3D = 288 + INTEGER(IntKi), PARAMETER :: B2ADOF4D = 289 + INTEGER(IntKi), PARAMETER :: B2ADOF5D = 290 + INTEGER(IntKi), PARAMETER :: B2ADOF6D = 291 + INTEGER(IntKi), PARAMETER :: B2ADOF7D = 292 + INTEGER(IntKi), PARAMETER :: B2ADOF8D = 293 + INTEGER(IntKi), PARAMETER :: B2ADOF9D = 294 + INTEGER(IntKi), PARAMETER :: B2ADOF10D = 295 + INTEGER(IntKi), PARAMETER :: B2ADOF11D = 296 + INTEGER(IntKi), PARAMETER :: B2ADOF12D = 297 + INTEGER(IntKi), PARAMETER :: B2ADOF13D = 298 + INTEGER(IntKi), PARAMETER :: B2ADOF14D = 299 + INTEGER(IntKi), PARAMETER :: B2ADOF15D = 300 + INTEGER(IntKi), PARAMETER :: B2ADOF16D = 301 + INTEGER(IntKi), PARAMETER :: B2ADOF17D = 302 + INTEGER(IntKi), PARAMETER :: B2ADOF18D = 303 + INTEGER(IntKi), PARAMETER :: B2ADOF19D = 304 + INTEGER(IntKi), PARAMETER :: B2ADOF20D = 305 + INTEGER(IntKi), PARAMETER :: B2ADOF21D = 306 + INTEGER(IntKi), PARAMETER :: B2ADOF22D = 307 + INTEGER(IntKi), PARAMETER :: B2ADOF23D = 308 + INTEGER(IntKi), PARAMETER :: B2ADOF24D = 309 + INTEGER(IntKi), PARAMETER :: B2ADOF25D = 310 + INTEGER(IntKi), PARAMETER :: B2ADOF26D = 311 + INTEGER(IntKi), PARAMETER :: B2ADOF27D = 312 + INTEGER(IntKi), PARAMETER :: B2ADOF28D = 313 + INTEGER(IntKi), PARAMETER :: B2ADOF29D = 314 + INTEGER(IntKi), PARAMETER :: B2ADOF30D = 315 + INTEGER(IntKi), PARAMETER :: B2ADOF31D = 316 + INTEGER(IntKi), PARAMETER :: B2ADOF32D = 317 + INTEGER(IntKi), PARAMETER :: B2ADOF33D = 318 + INTEGER(IntKi), PARAMETER :: B2ADOF34D = 319 + INTEGER(IntKi), PARAMETER :: B2ADOF35D = 320 + INTEGER(IntKi), PARAMETER :: B2ADOF36D = 321 + INTEGER(IntKi), PARAMETER :: B2ADOF37D = 322 + INTEGER(IntKi), PARAMETER :: B2ADOF38D = 323 + INTEGER(IntKi), PARAMETER :: B2ADOF39D = 324 + INTEGER(IntKi), PARAMETER :: B2ADOF40D = 325 + INTEGER(IntKi), PARAMETER :: B2ADOF41D = 326 + INTEGER(IntKi), PARAMETER :: B2ADOF42D = 327 + INTEGER(IntKi), PARAMETER :: B2ADOF43D = 328 + INTEGER(IntKi), PARAMETER :: B2ADOF44D = 329 + INTEGER(IntKi), PARAMETER :: B2ADOF45D = 330 + INTEGER(IntKi), PARAMETER :: B2ADOF46D = 331 + INTEGER(IntKi), PARAMETER :: B2ADOF47D = 332 + INTEGER(IntKi), PARAMETER :: B2ADOF48D = 333 + INTEGER(IntKi), PARAMETER :: B2ADOF49D = 334 + INTEGER(IntKi), PARAMETER :: B2ADOF50D = 335 + INTEGER(IntKi), PARAMETER :: B2ADOF51D = 336 + INTEGER(IntKi), PARAMETER :: B2ADOF52D = 337 + INTEGER(IntKi), PARAMETER :: B2ADOF53D = 338 + INTEGER(IntKi), PARAMETER :: B2ADOF54D = 339 + INTEGER(IntKi), PARAMETER :: B2ADOF55D = 340 + INTEGER(IntKi), PARAMETER :: B2ADOF56D = 341 + INTEGER(IntKi), PARAMETER :: B2ADOF57D = 342 + INTEGER(IntKi), PARAMETER :: B2ADOF58D = 343 + INTEGER(IntKi), PARAMETER :: B2ADOF59D = 344 + INTEGER(IntKi), PARAMETER :: B2ADOF60D = 345 + INTEGER(IntKi), PARAMETER :: B2ADOF61D = 346 + INTEGER(IntKi), PARAMETER :: B2ADOF62D = 347 + INTEGER(IntKi), PARAMETER :: B2ADOF63D = 348 + INTEGER(IntKi), PARAMETER :: B2ADOF64D = 349 + INTEGER(IntKi), PARAMETER :: B2ADOF65D = 350 + INTEGER(IntKi), PARAMETER :: B2ADOF66D = 351 + INTEGER(IntKi), PARAMETER :: B2ADOF67D = 352 + INTEGER(IntKi), PARAMETER :: B2ADOF68D = 353 + INTEGER(IntKi), PARAMETER :: B2ADOF69D = 354 + INTEGER(IntKi), PARAMETER :: B2ADOF70D = 355 + INTEGER(IntKi), PARAMETER :: B2ADOF71D = 356 + INTEGER(IntKi), PARAMETER :: B2ADOF72D = 357 + INTEGER(IntKi), PARAMETER :: B2ADOF73D = 358 + INTEGER(IntKi), PARAMETER :: B2ADOF74D = 359 + INTEGER(IntKi), PARAMETER :: B2ADOF75D = 360 + INTEGER(IntKi), PARAMETER :: B2ADOF76D = 361 + INTEGER(IntKi), PARAMETER :: B2ADOF77D = 362 + INTEGER(IntKi), PARAMETER :: B2ADOF78D = 363 + INTEGER(IntKi), PARAMETER :: B2ADOF79D = 364 + INTEGER(IntKi), PARAMETER :: B2ADOF80D = 365 + INTEGER(IntKi), PARAMETER :: B2ADOF81D = 366 + INTEGER(IntKi), PARAMETER :: B2ADOF82D = 367 + INTEGER(IntKi), PARAMETER :: B2ADOF83D = 368 + INTEGER(IntKi), PARAMETER :: B2ADOF84D = 369 + INTEGER(IntKi), PARAMETER :: B2ADOF85D = 370 + INTEGER(IntKi), PARAMETER :: B2ADOF86D = 371 + INTEGER(IntKi), PARAMETER :: B2ADOF87D = 372 + INTEGER(IntKi), PARAMETER :: B2ADOF88D = 373 + INTEGER(IntKi), PARAMETER :: B2ADOF89D = 374 + INTEGER(IntKi), PARAMETER :: B2ADOF90D = 375 + INTEGER(IntKi), PARAMETER :: B2ADOF91D = 376 + INTEGER(IntKi), PARAMETER :: B2ADOF92D = 377 + INTEGER(IntKi), PARAMETER :: B2ADOF93D = 378 + INTEGER(IntKi), PARAMETER :: B2ADOF94D = 379 + INTEGER(IntKi), PARAMETER :: B2ADOF95D = 380 + INTEGER(IntKi), PARAMETER :: B2ADOF96D = 381 + INTEGER(IntKi), PARAMETER :: B2ADOF97D = 382 + INTEGER(IntKi), PARAMETER :: B2ADOF98D = 383 + INTEGER(IntKi), PARAMETER :: B2ADOF99D = 384 + INTEGER(IntKi), PARAMETER :: B3ADOF1D = 385 + INTEGER(IntKi), PARAMETER :: B3ADOF2D = 386 + INTEGER(IntKi), PARAMETER :: B3ADOF3D = 387 + INTEGER(IntKi), PARAMETER :: B3ADOF4D = 388 + INTEGER(IntKi), PARAMETER :: B3ADOF5D = 389 + INTEGER(IntKi), PARAMETER :: B3ADOF6D = 390 + INTEGER(IntKi), PARAMETER :: B3ADOF7D = 391 + INTEGER(IntKi), PARAMETER :: B3ADOF8D = 392 + INTEGER(IntKi), PARAMETER :: B3ADOF9D = 393 + INTEGER(IntKi), PARAMETER :: B3ADOF10D = 394 + INTEGER(IntKi), PARAMETER :: B3ADOF11D = 395 + INTEGER(IntKi), PARAMETER :: B3ADOF12D = 396 + INTEGER(IntKi), PARAMETER :: B3ADOF13D = 397 + INTEGER(IntKi), PARAMETER :: B3ADOF14D = 398 + INTEGER(IntKi), PARAMETER :: B3ADOF15D = 399 + INTEGER(IntKi), PARAMETER :: B3ADOF16D = 400 + INTEGER(IntKi), PARAMETER :: B3ADOF17D = 401 + INTEGER(IntKi), PARAMETER :: B3ADOF18D = 402 + INTEGER(IntKi), PARAMETER :: B3ADOF19D = 403 + INTEGER(IntKi), PARAMETER :: B3ADOF20D = 404 + INTEGER(IntKi), PARAMETER :: B3ADOF21D = 405 + INTEGER(IntKi), PARAMETER :: B3ADOF22D = 406 + INTEGER(IntKi), PARAMETER :: B3ADOF23D = 407 + INTEGER(IntKi), PARAMETER :: B3ADOF24D = 408 + INTEGER(IntKi), PARAMETER :: B3ADOF25D = 409 + INTEGER(IntKi), PARAMETER :: B3ADOF26D = 410 + INTEGER(IntKi), PARAMETER :: B3ADOF27D = 411 + INTEGER(IntKi), PARAMETER :: B3ADOF28D = 412 + INTEGER(IntKi), PARAMETER :: B3ADOF29D = 413 + INTEGER(IntKi), PARAMETER :: B3ADOF30D = 414 + INTEGER(IntKi), PARAMETER :: B3ADOF31D = 415 + INTEGER(IntKi), PARAMETER :: B3ADOF32D = 416 + INTEGER(IntKi), PARAMETER :: B3ADOF33D = 417 + INTEGER(IntKi), PARAMETER :: B3ADOF34D = 418 + INTEGER(IntKi), PARAMETER :: B3ADOF35D = 419 + INTEGER(IntKi), PARAMETER :: B3ADOF36D = 420 + INTEGER(IntKi), PARAMETER :: B3ADOF37D = 421 + INTEGER(IntKi), PARAMETER :: B3ADOF38D = 422 + INTEGER(IntKi), PARAMETER :: B3ADOF39D = 423 + INTEGER(IntKi), PARAMETER :: B3ADOF40D = 424 + INTEGER(IntKi), PARAMETER :: B3ADOF41D = 425 + INTEGER(IntKi), PARAMETER :: B3ADOF42D = 426 + INTEGER(IntKi), PARAMETER :: B3ADOF43D = 427 + INTEGER(IntKi), PARAMETER :: B3ADOF44D = 428 + INTEGER(IntKi), PARAMETER :: B3ADOF45D = 429 + INTEGER(IntKi), PARAMETER :: B3ADOF46D = 430 + INTEGER(IntKi), PARAMETER :: B3ADOF47D = 431 + INTEGER(IntKi), PARAMETER :: B3ADOF48D = 432 + INTEGER(IntKi), PARAMETER :: B3ADOF49D = 433 + INTEGER(IntKi), PARAMETER :: B3ADOF50D = 434 + INTEGER(IntKi), PARAMETER :: B3ADOF51D = 435 + INTEGER(IntKi), PARAMETER :: B3ADOF52D = 436 + INTEGER(IntKi), PARAMETER :: B3ADOF53D = 437 + INTEGER(IntKi), PARAMETER :: B3ADOF54D = 438 + INTEGER(IntKi), PARAMETER :: B3ADOF55D = 439 + INTEGER(IntKi), PARAMETER :: B3ADOF56D = 440 + INTEGER(IntKi), PARAMETER :: B3ADOF57D = 441 + INTEGER(IntKi), PARAMETER :: B3ADOF58D = 442 + INTEGER(IntKi), PARAMETER :: B3ADOF59D = 443 + INTEGER(IntKi), PARAMETER :: B3ADOF60D = 444 + INTEGER(IntKi), PARAMETER :: B3ADOF61D = 445 + INTEGER(IntKi), PARAMETER :: B3ADOF62D = 446 + INTEGER(IntKi), PARAMETER :: B3ADOF63D = 447 + INTEGER(IntKi), PARAMETER :: B3ADOF64D = 448 + INTEGER(IntKi), PARAMETER :: B3ADOF65D = 449 + INTEGER(IntKi), PARAMETER :: B3ADOF66D = 450 + INTEGER(IntKi), PARAMETER :: B3ADOF67D = 451 + INTEGER(IntKi), PARAMETER :: B3ADOF68D = 452 + INTEGER(IntKi), PARAMETER :: B3ADOF69D = 453 + INTEGER(IntKi), PARAMETER :: B3ADOF70D = 454 + INTEGER(IntKi), PARAMETER :: B3ADOF71D = 455 + INTEGER(IntKi), PARAMETER :: B3ADOF72D = 456 + INTEGER(IntKi), PARAMETER :: B3ADOF73D = 457 + INTEGER(IntKi), PARAMETER :: B3ADOF74D = 458 + INTEGER(IntKi), PARAMETER :: B3ADOF75D = 459 + INTEGER(IntKi), PARAMETER :: B3ADOF76D = 460 + INTEGER(IntKi), PARAMETER :: B3ADOF77D = 461 + INTEGER(IntKi), PARAMETER :: B3ADOF78D = 462 + INTEGER(IntKi), PARAMETER :: B3ADOF79D = 463 + INTEGER(IntKi), PARAMETER :: B3ADOF80D = 464 + INTEGER(IntKi), PARAMETER :: B3ADOF81D = 465 + INTEGER(IntKi), PARAMETER :: B3ADOF82D = 466 + INTEGER(IntKi), PARAMETER :: B3ADOF83D = 467 + INTEGER(IntKi), PARAMETER :: B3ADOF84D = 468 + INTEGER(IntKi), PARAMETER :: B3ADOF85D = 469 + INTEGER(IntKi), PARAMETER :: B3ADOF86D = 470 + INTEGER(IntKi), PARAMETER :: B3ADOF87D = 471 + INTEGER(IntKi), PARAMETER :: B3ADOF88D = 472 + INTEGER(IntKi), PARAMETER :: B3ADOF89D = 473 + INTEGER(IntKi), PARAMETER :: B3ADOF90D = 474 + INTEGER(IntKi), PARAMETER :: B3ADOF91D = 475 + INTEGER(IntKi), PARAMETER :: B3ADOF92D = 476 + INTEGER(IntKi), PARAMETER :: B3ADOF93D = 477 + INTEGER(IntKi), PARAMETER :: B3ADOF94D = 478 + INTEGER(IntKi), PARAMETER :: B3ADOF95D = 479 + INTEGER(IntKi), PARAMETER :: B3ADOF96D = 480 + INTEGER(IntKi), PARAMETER :: B3ADOF97D = 481 + INTEGER(IntKi), PARAMETER :: B3ADOF98D = 482 + INTEGER(IntKi), PARAMETER :: B3ADOF99D = 483 + INTEGER(IntKi), PARAMETER :: B4ADOF1D = 484 + INTEGER(IntKi), PARAMETER :: B4ADOF2D = 485 + INTEGER(IntKi), PARAMETER :: B4ADOF3D = 486 + INTEGER(IntKi), PARAMETER :: B4ADOF4D = 487 + INTEGER(IntKi), PARAMETER :: B4ADOF5D = 488 + INTEGER(IntKi), PARAMETER :: B4ADOF6D = 489 + INTEGER(IntKi), PARAMETER :: B4ADOF7D = 490 + INTEGER(IntKi), PARAMETER :: B4ADOF8D = 491 + INTEGER(IntKi), PARAMETER :: B4ADOF9D = 492 + INTEGER(IntKi), PARAMETER :: B4ADOF10D = 493 + INTEGER(IntKi), PARAMETER :: B4ADOF11D = 494 + INTEGER(IntKi), PARAMETER :: B4ADOF12D = 495 + INTEGER(IntKi), PARAMETER :: B4ADOF13D = 496 + INTEGER(IntKi), PARAMETER :: B4ADOF14D = 497 + INTEGER(IntKi), PARAMETER :: B4ADOF15D = 498 + INTEGER(IntKi), PARAMETER :: B4ADOF16D = 499 + INTEGER(IntKi), PARAMETER :: B4ADOF17D = 500 + INTEGER(IntKi), PARAMETER :: B4ADOF18D = 501 + INTEGER(IntKi), PARAMETER :: B4ADOF19D = 502 + INTEGER(IntKi), PARAMETER :: B4ADOF20D = 503 + INTEGER(IntKi), PARAMETER :: B4ADOF21D = 504 + INTEGER(IntKi), PARAMETER :: B4ADOF22D = 505 + INTEGER(IntKi), PARAMETER :: B4ADOF23D = 506 + INTEGER(IntKi), PARAMETER :: B4ADOF24D = 507 + INTEGER(IntKi), PARAMETER :: B4ADOF25D = 508 + INTEGER(IntKi), PARAMETER :: B4ADOF26D = 509 + INTEGER(IntKi), PARAMETER :: B4ADOF27D = 510 + INTEGER(IntKi), PARAMETER :: B4ADOF28D = 511 + INTEGER(IntKi), PARAMETER :: B4ADOF29D = 512 + INTEGER(IntKi), PARAMETER :: B4ADOF30D = 513 + INTEGER(IntKi), PARAMETER :: B4ADOF31D = 514 + INTEGER(IntKi), PARAMETER :: B4ADOF32D = 515 + INTEGER(IntKi), PARAMETER :: B4ADOF33D = 516 + INTEGER(IntKi), PARAMETER :: B4ADOF34D = 517 + INTEGER(IntKi), PARAMETER :: B4ADOF35D = 518 + INTEGER(IntKi), PARAMETER :: B4ADOF36D = 519 + INTEGER(IntKi), PARAMETER :: B4ADOF37D = 520 + INTEGER(IntKi), PARAMETER :: B4ADOF38D = 521 + INTEGER(IntKi), PARAMETER :: B4ADOF39D = 522 + INTEGER(IntKi), PARAMETER :: B4ADOF40D = 523 + INTEGER(IntKi), PARAMETER :: B4ADOF41D = 524 + INTEGER(IntKi), PARAMETER :: B4ADOF42D = 525 + INTEGER(IntKi), PARAMETER :: B4ADOF43D = 526 + INTEGER(IntKi), PARAMETER :: B4ADOF44D = 527 + INTEGER(IntKi), PARAMETER :: B4ADOF45D = 528 + INTEGER(IntKi), PARAMETER :: B4ADOF46D = 529 + INTEGER(IntKi), PARAMETER :: B4ADOF47D = 530 + INTEGER(IntKi), PARAMETER :: B4ADOF48D = 531 + INTEGER(IntKi), PARAMETER :: B4ADOF49D = 532 + INTEGER(IntKi), PARAMETER :: B4ADOF50D = 533 + INTEGER(IntKi), PARAMETER :: B4ADOF51D = 534 + INTEGER(IntKi), PARAMETER :: B4ADOF52D = 535 + INTEGER(IntKi), PARAMETER :: B4ADOF53D = 536 + INTEGER(IntKi), PARAMETER :: B4ADOF54D = 537 + INTEGER(IntKi), PARAMETER :: B4ADOF55D = 538 + INTEGER(IntKi), PARAMETER :: B4ADOF56D = 539 + INTEGER(IntKi), PARAMETER :: B4ADOF57D = 540 + INTEGER(IntKi), PARAMETER :: B4ADOF58D = 541 + INTEGER(IntKi), PARAMETER :: B4ADOF59D = 542 + INTEGER(IntKi), PARAMETER :: B4ADOF60D = 543 + INTEGER(IntKi), PARAMETER :: B4ADOF61D = 544 + INTEGER(IntKi), PARAMETER :: B4ADOF62D = 545 + INTEGER(IntKi), PARAMETER :: B4ADOF63D = 546 + INTEGER(IntKi), PARAMETER :: B4ADOF64D = 547 + INTEGER(IntKi), PARAMETER :: B4ADOF65D = 548 + INTEGER(IntKi), PARAMETER :: B4ADOF66D = 549 + INTEGER(IntKi), PARAMETER :: B4ADOF67D = 550 + INTEGER(IntKi), PARAMETER :: B4ADOF68D = 551 + INTEGER(IntKi), PARAMETER :: B4ADOF69D = 552 + INTEGER(IntKi), PARAMETER :: B4ADOF70D = 553 + INTEGER(IntKi), PARAMETER :: B4ADOF71D = 554 + INTEGER(IntKi), PARAMETER :: B4ADOF72D = 555 + INTEGER(IntKi), PARAMETER :: B4ADOF73D = 556 + INTEGER(IntKi), PARAMETER :: B4ADOF74D = 557 + INTEGER(IntKi), PARAMETER :: B4ADOF75D = 558 + INTEGER(IntKi), PARAMETER :: B4ADOF76D = 559 + INTEGER(IntKi), PARAMETER :: B4ADOF77D = 560 + INTEGER(IntKi), PARAMETER :: B4ADOF78D = 561 + INTEGER(IntKi), PARAMETER :: B4ADOF79D = 562 + INTEGER(IntKi), PARAMETER :: B4ADOF80D = 563 + INTEGER(IntKi), PARAMETER :: B4ADOF81D = 564 + INTEGER(IntKi), PARAMETER :: B4ADOF82D = 565 + INTEGER(IntKi), PARAMETER :: B4ADOF83D = 566 + INTEGER(IntKi), PARAMETER :: B4ADOF84D = 567 + INTEGER(IntKi), PARAMETER :: B4ADOF85D = 568 + INTEGER(IntKi), PARAMETER :: B4ADOF86D = 569 + INTEGER(IntKi), PARAMETER :: B4ADOF87D = 570 + INTEGER(IntKi), PARAMETER :: B4ADOF88D = 571 + INTEGER(IntKi), PARAMETER :: B4ADOF89D = 572 + INTEGER(IntKi), PARAMETER :: B4ADOF90D = 573 + INTEGER(IntKi), PARAMETER :: B4ADOF91D = 574 + INTEGER(IntKi), PARAMETER :: B4ADOF92D = 575 + INTEGER(IntKi), PARAMETER :: B4ADOF93D = 576 + INTEGER(IntKi), PARAMETER :: B4ADOF94D = 577 + INTEGER(IntKi), PARAMETER :: B4ADOF95D = 578 + INTEGER(IntKi), PARAMETER :: B4ADOF96D = 579 + INTEGER(IntKi), PARAMETER :: B4ADOF97D = 580 + INTEGER(IntKi), PARAMETER :: B4ADOF98D = 581 + INTEGER(IntKi), PARAMETER :: B4ADOF99D = 582 + INTEGER(IntKi), PARAMETER :: B5ADOF1D = 583 + INTEGER(IntKi), PARAMETER :: B5ADOF2D = 584 + INTEGER(IntKi), PARAMETER :: B5ADOF3D = 585 + INTEGER(IntKi), PARAMETER :: B5ADOF4D = 586 + INTEGER(IntKi), PARAMETER :: B5ADOF5D = 587 + INTEGER(IntKi), PARAMETER :: B5ADOF6D = 588 + INTEGER(IntKi), PARAMETER :: B5ADOF7D = 589 + INTEGER(IntKi), PARAMETER :: B5ADOF8D = 590 + INTEGER(IntKi), PARAMETER :: B5ADOF9D = 591 + INTEGER(IntKi), PARAMETER :: B5ADOF10D = 592 + INTEGER(IntKi), PARAMETER :: B5ADOF11D = 593 + INTEGER(IntKi), PARAMETER :: B5ADOF12D = 594 + INTEGER(IntKi), PARAMETER :: B5ADOF13D = 595 + INTEGER(IntKi), PARAMETER :: B5ADOF14D = 596 + INTEGER(IntKi), PARAMETER :: B5ADOF15D = 597 + INTEGER(IntKi), PARAMETER :: B5ADOF16D = 598 + INTEGER(IntKi), PARAMETER :: B5ADOF17D = 599 + INTEGER(IntKi), PARAMETER :: B5ADOF18D = 600 + INTEGER(IntKi), PARAMETER :: B5ADOF19D = 601 + INTEGER(IntKi), PARAMETER :: B5ADOF20D = 602 + INTEGER(IntKi), PARAMETER :: B5ADOF21D = 603 + INTEGER(IntKi), PARAMETER :: B5ADOF22D = 604 + INTEGER(IntKi), PARAMETER :: B5ADOF23D = 605 + INTEGER(IntKi), PARAMETER :: B5ADOF24D = 606 + INTEGER(IntKi), PARAMETER :: B5ADOF25D = 607 + INTEGER(IntKi), PARAMETER :: B5ADOF26D = 608 + INTEGER(IntKi), PARAMETER :: B5ADOF27D = 609 + INTEGER(IntKi), PARAMETER :: B5ADOF28D = 610 + INTEGER(IntKi), PARAMETER :: B5ADOF29D = 611 + INTEGER(IntKi), PARAMETER :: B5ADOF30D = 612 + INTEGER(IntKi), PARAMETER :: B5ADOF31D = 613 + INTEGER(IntKi), PARAMETER :: B5ADOF32D = 614 + INTEGER(IntKi), PARAMETER :: B5ADOF33D = 615 + INTEGER(IntKi), PARAMETER :: B5ADOF34D = 616 + INTEGER(IntKi), PARAMETER :: B5ADOF35D = 617 + INTEGER(IntKi), PARAMETER :: B5ADOF36D = 618 + INTEGER(IntKi), PARAMETER :: B5ADOF37D = 619 + INTEGER(IntKi), PARAMETER :: B5ADOF38D = 620 + INTEGER(IntKi), PARAMETER :: B5ADOF39D = 621 + INTEGER(IntKi), PARAMETER :: B5ADOF40D = 622 + INTEGER(IntKi), PARAMETER :: B5ADOF41D = 623 + INTEGER(IntKi), PARAMETER :: B5ADOF42D = 624 + INTEGER(IntKi), PARAMETER :: B5ADOF43D = 625 + INTEGER(IntKi), PARAMETER :: B5ADOF44D = 626 + INTEGER(IntKi), PARAMETER :: B5ADOF45D = 627 + INTEGER(IntKi), PARAMETER :: B5ADOF46D = 628 + INTEGER(IntKi), PARAMETER :: B5ADOF47D = 629 + INTEGER(IntKi), PARAMETER :: B5ADOF48D = 630 + INTEGER(IntKi), PARAMETER :: B5ADOF49D = 631 + INTEGER(IntKi), PARAMETER :: B5ADOF50D = 632 + INTEGER(IntKi), PARAMETER :: B5ADOF51D = 633 + INTEGER(IntKi), PARAMETER :: B5ADOF52D = 634 + INTEGER(IntKi), PARAMETER :: B5ADOF53D = 635 + INTEGER(IntKi), PARAMETER :: B5ADOF54D = 636 + INTEGER(IntKi), PARAMETER :: B5ADOF55D = 637 + INTEGER(IntKi), PARAMETER :: B5ADOF56D = 638 + INTEGER(IntKi), PARAMETER :: B5ADOF57D = 639 + INTEGER(IntKi), PARAMETER :: B5ADOF58D = 640 + INTEGER(IntKi), PARAMETER :: B5ADOF59D = 641 + INTEGER(IntKi), PARAMETER :: B5ADOF60D = 642 + INTEGER(IntKi), PARAMETER :: B5ADOF61D = 643 + INTEGER(IntKi), PARAMETER :: B5ADOF62D = 644 + INTEGER(IntKi), PARAMETER :: B5ADOF63D = 645 + INTEGER(IntKi), PARAMETER :: B5ADOF64D = 646 + INTEGER(IntKi), PARAMETER :: B5ADOF65D = 647 + INTEGER(IntKi), PARAMETER :: B5ADOF66D = 648 + INTEGER(IntKi), PARAMETER :: B5ADOF67D = 649 + INTEGER(IntKi), PARAMETER :: B5ADOF68D = 650 + INTEGER(IntKi), PARAMETER :: B5ADOF69D = 651 + INTEGER(IntKi), PARAMETER :: B5ADOF70D = 652 + INTEGER(IntKi), PARAMETER :: B5ADOF71D = 653 + INTEGER(IntKi), PARAMETER :: B5ADOF72D = 654 + INTEGER(IntKi), PARAMETER :: B5ADOF73D = 655 + INTEGER(IntKi), PARAMETER :: B5ADOF74D = 656 + INTEGER(IntKi), PARAMETER :: B5ADOF75D = 657 + INTEGER(IntKi), PARAMETER :: B5ADOF76D = 658 + INTEGER(IntKi), PARAMETER :: B5ADOF77D = 659 + INTEGER(IntKi), PARAMETER :: B5ADOF78D = 660 + INTEGER(IntKi), PARAMETER :: B5ADOF79D = 661 + INTEGER(IntKi), PARAMETER :: B5ADOF80D = 662 + INTEGER(IntKi), PARAMETER :: B5ADOF81D = 663 + INTEGER(IntKi), PARAMETER :: B5ADOF82D = 664 + INTEGER(IntKi), PARAMETER :: B5ADOF83D = 665 + INTEGER(IntKi), PARAMETER :: B5ADOF84D = 666 + INTEGER(IntKi), PARAMETER :: B5ADOF85D = 667 + INTEGER(IntKi), PARAMETER :: B5ADOF86D = 668 + INTEGER(IntKi), PARAMETER :: B5ADOF87D = 669 + INTEGER(IntKi), PARAMETER :: B5ADOF88D = 670 + INTEGER(IntKi), PARAMETER :: B5ADOF89D = 671 + INTEGER(IntKi), PARAMETER :: B5ADOF90D = 672 + INTEGER(IntKi), PARAMETER :: B5ADOF91D = 673 + INTEGER(IntKi), PARAMETER :: B5ADOF92D = 674 + INTEGER(IntKi), PARAMETER :: B5ADOF93D = 675 + INTEGER(IntKi), PARAMETER :: B5ADOF94D = 676 + INTEGER(IntKi), PARAMETER :: B5ADOF95D = 677 + INTEGER(IntKi), PARAMETER :: B5ADOF96D = 678 + INTEGER(IntKi), PARAMETER :: B5ADOF97D = 679 + INTEGER(IntKi), PARAMETER :: B5ADOF98D = 680 + INTEGER(IntKi), PARAMETER :: B5ADOF99D = 681 + INTEGER(IntKi), PARAMETER :: B6ADOF1D = 682 + INTEGER(IntKi), PARAMETER :: B6ADOF2D = 683 + INTEGER(IntKi), PARAMETER :: B6ADOF3D = 684 + INTEGER(IntKi), PARAMETER :: B6ADOF4D = 685 + INTEGER(IntKi), PARAMETER :: B6ADOF5D = 686 + INTEGER(IntKi), PARAMETER :: B6ADOF6D = 687 + INTEGER(IntKi), PARAMETER :: B6ADOF7D = 688 + INTEGER(IntKi), PARAMETER :: B6ADOF8D = 689 + INTEGER(IntKi), PARAMETER :: B6ADOF9D = 690 + INTEGER(IntKi), PARAMETER :: B6ADOF10D = 691 + INTEGER(IntKi), PARAMETER :: B6ADOF11D = 692 + INTEGER(IntKi), PARAMETER :: B6ADOF12D = 693 + INTEGER(IntKi), PARAMETER :: B6ADOF13D = 694 + INTEGER(IntKi), PARAMETER :: B6ADOF14D = 695 + INTEGER(IntKi), PARAMETER :: B6ADOF15D = 696 + INTEGER(IntKi), PARAMETER :: B6ADOF16D = 697 + INTEGER(IntKi), PARAMETER :: B6ADOF17D = 698 + INTEGER(IntKi), PARAMETER :: B6ADOF18D = 699 + INTEGER(IntKi), PARAMETER :: B6ADOF19D = 700 + INTEGER(IntKi), PARAMETER :: B6ADOF20D = 701 + INTEGER(IntKi), PARAMETER :: B6ADOF21D = 702 + INTEGER(IntKi), PARAMETER :: B6ADOF22D = 703 + INTEGER(IntKi), PARAMETER :: B6ADOF23D = 704 + INTEGER(IntKi), PARAMETER :: B6ADOF24D = 705 + INTEGER(IntKi), PARAMETER :: B6ADOF25D = 706 + INTEGER(IntKi), PARAMETER :: B6ADOF26D = 707 + INTEGER(IntKi), PARAMETER :: B6ADOF27D = 708 + INTEGER(IntKi), PARAMETER :: B6ADOF28D = 709 + INTEGER(IntKi), PARAMETER :: B6ADOF29D = 710 + INTEGER(IntKi), PARAMETER :: B6ADOF30D = 711 + INTEGER(IntKi), PARAMETER :: B6ADOF31D = 712 + INTEGER(IntKi), PARAMETER :: B6ADOF32D = 713 + INTEGER(IntKi), PARAMETER :: B6ADOF33D = 714 + INTEGER(IntKi), PARAMETER :: B6ADOF34D = 715 + INTEGER(IntKi), PARAMETER :: B6ADOF35D = 716 + INTEGER(IntKi), PARAMETER :: B6ADOF36D = 717 + INTEGER(IntKi), PARAMETER :: B6ADOF37D = 718 + INTEGER(IntKi), PARAMETER :: B6ADOF38D = 719 + INTEGER(IntKi), PARAMETER :: B6ADOF39D = 720 + INTEGER(IntKi), PARAMETER :: B6ADOF40D = 721 + INTEGER(IntKi), PARAMETER :: B6ADOF41D = 722 + INTEGER(IntKi), PARAMETER :: B6ADOF42D = 723 + INTEGER(IntKi), PARAMETER :: B6ADOF43D = 724 + INTEGER(IntKi), PARAMETER :: B6ADOF44D = 725 + INTEGER(IntKi), PARAMETER :: B6ADOF45D = 726 + INTEGER(IntKi), PARAMETER :: B6ADOF46D = 727 + INTEGER(IntKi), PARAMETER :: B6ADOF47D = 728 + INTEGER(IntKi), PARAMETER :: B6ADOF48D = 729 + INTEGER(IntKi), PARAMETER :: B6ADOF49D = 730 + INTEGER(IntKi), PARAMETER :: B6ADOF50D = 731 + INTEGER(IntKi), PARAMETER :: B6ADOF51D = 732 + INTEGER(IntKi), PARAMETER :: B6ADOF52D = 733 + INTEGER(IntKi), PARAMETER :: B6ADOF53D = 734 + INTEGER(IntKi), PARAMETER :: B6ADOF54D = 735 + INTEGER(IntKi), PARAMETER :: B6ADOF55D = 736 + INTEGER(IntKi), PARAMETER :: B6ADOF56D = 737 + INTEGER(IntKi), PARAMETER :: B6ADOF57D = 738 + INTEGER(IntKi), PARAMETER :: B6ADOF58D = 739 + INTEGER(IntKi), PARAMETER :: B6ADOF59D = 740 + INTEGER(IntKi), PARAMETER :: B6ADOF60D = 741 + INTEGER(IntKi), PARAMETER :: B6ADOF61D = 742 + INTEGER(IntKi), PARAMETER :: B6ADOF62D = 743 + INTEGER(IntKi), PARAMETER :: B6ADOF63D = 744 + INTEGER(IntKi), PARAMETER :: B6ADOF64D = 745 + INTEGER(IntKi), PARAMETER :: B6ADOF65D = 746 + INTEGER(IntKi), PARAMETER :: B6ADOF66D = 747 + INTEGER(IntKi), PARAMETER :: B6ADOF67D = 748 + INTEGER(IntKi), PARAMETER :: B6ADOF68D = 749 + INTEGER(IntKi), PARAMETER :: B6ADOF69D = 750 + INTEGER(IntKi), PARAMETER :: B6ADOF70D = 751 + INTEGER(IntKi), PARAMETER :: B6ADOF71D = 752 + INTEGER(IntKi), PARAMETER :: B6ADOF72D = 753 + INTEGER(IntKi), PARAMETER :: B6ADOF73D = 754 + INTEGER(IntKi), PARAMETER :: B6ADOF74D = 755 + INTEGER(IntKi), PARAMETER :: B6ADOF75D = 756 + INTEGER(IntKi), PARAMETER :: B6ADOF76D = 757 + INTEGER(IntKi), PARAMETER :: B6ADOF77D = 758 + INTEGER(IntKi), PARAMETER :: B6ADOF78D = 759 + INTEGER(IntKi), PARAMETER :: B6ADOF79D = 760 + INTEGER(IntKi), PARAMETER :: B6ADOF80D = 761 + INTEGER(IntKi), PARAMETER :: B6ADOF81D = 762 + INTEGER(IntKi), PARAMETER :: B6ADOF82D = 763 + INTEGER(IntKi), PARAMETER :: B6ADOF83D = 764 + INTEGER(IntKi), PARAMETER :: B6ADOF84D = 765 + INTEGER(IntKi), PARAMETER :: B6ADOF85D = 766 + INTEGER(IntKi), PARAMETER :: B6ADOF86D = 767 + INTEGER(IntKi), PARAMETER :: B6ADOF87D = 768 + INTEGER(IntKi), PARAMETER :: B6ADOF88D = 769 + INTEGER(IntKi), PARAMETER :: B6ADOF89D = 770 + INTEGER(IntKi), PARAMETER :: B6ADOF90D = 771 + INTEGER(IntKi), PARAMETER :: B6ADOF91D = 772 + INTEGER(IntKi), PARAMETER :: B6ADOF92D = 773 + INTEGER(IntKi), PARAMETER :: B6ADOF93D = 774 + INTEGER(IntKi), PARAMETER :: B6ADOF94D = 775 + INTEGER(IntKi), PARAMETER :: B6ADOF95D = 776 + INTEGER(IntKi), PARAMETER :: B6ADOF96D = 777 + INTEGER(IntKi), PARAMETER :: B6ADOF97D = 778 + INTEGER(IntKi), PARAMETER :: B6ADOF98D = 779 + INTEGER(IntKi), PARAMETER :: B6ADOF99D = 780 + INTEGER(IntKi), PARAMETER :: B7ADOF1D = 781 + INTEGER(IntKi), PARAMETER :: B7ADOF2D = 782 + INTEGER(IntKi), PARAMETER :: B7ADOF3D = 783 + INTEGER(IntKi), PARAMETER :: B7ADOF4D = 784 + INTEGER(IntKi), PARAMETER :: B7ADOF5D = 785 + INTEGER(IntKi), PARAMETER :: B7ADOF6D = 786 + INTEGER(IntKi), PARAMETER :: B7ADOF7D = 787 + INTEGER(IntKi), PARAMETER :: B7ADOF8D = 788 + INTEGER(IntKi), PARAMETER :: B7ADOF9D = 789 + INTEGER(IntKi), PARAMETER :: B7ADOF10D = 790 + INTEGER(IntKi), PARAMETER :: B7ADOF11D = 791 + INTEGER(IntKi), PARAMETER :: B7ADOF12D = 792 + INTEGER(IntKi), PARAMETER :: B7ADOF13D = 793 + INTEGER(IntKi), PARAMETER :: B7ADOF14D = 794 + INTEGER(IntKi), PARAMETER :: B7ADOF15D = 795 + INTEGER(IntKi), PARAMETER :: B7ADOF16D = 796 + INTEGER(IntKi), PARAMETER :: B7ADOF17D = 797 + INTEGER(IntKi), PARAMETER :: B7ADOF18D = 798 + INTEGER(IntKi), PARAMETER :: B7ADOF19D = 799 + INTEGER(IntKi), PARAMETER :: B7ADOF20D = 800 + INTEGER(IntKi), PARAMETER :: B7ADOF21D = 801 + INTEGER(IntKi), PARAMETER :: B7ADOF22D = 802 + INTEGER(IntKi), PARAMETER :: B7ADOF23D = 803 + INTEGER(IntKi), PARAMETER :: B7ADOF24D = 804 + INTEGER(IntKi), PARAMETER :: B7ADOF25D = 805 + INTEGER(IntKi), PARAMETER :: B7ADOF26D = 806 + INTEGER(IntKi), PARAMETER :: B7ADOF27D = 807 + INTEGER(IntKi), PARAMETER :: B7ADOF28D = 808 + INTEGER(IntKi), PARAMETER :: B7ADOF29D = 809 + INTEGER(IntKi), PARAMETER :: B7ADOF30D = 810 + INTEGER(IntKi), PARAMETER :: B7ADOF31D = 811 + INTEGER(IntKi), PARAMETER :: B7ADOF32D = 812 + INTEGER(IntKi), PARAMETER :: B7ADOF33D = 813 + INTEGER(IntKi), PARAMETER :: B7ADOF34D = 814 + INTEGER(IntKi), PARAMETER :: B7ADOF35D = 815 + INTEGER(IntKi), PARAMETER :: B7ADOF36D = 816 + INTEGER(IntKi), PARAMETER :: B7ADOF37D = 817 + INTEGER(IntKi), PARAMETER :: B7ADOF38D = 818 + INTEGER(IntKi), PARAMETER :: B7ADOF39D = 819 + INTEGER(IntKi), PARAMETER :: B7ADOF40D = 820 + INTEGER(IntKi), PARAMETER :: B7ADOF41D = 821 + INTEGER(IntKi), PARAMETER :: B7ADOF42D = 822 + INTEGER(IntKi), PARAMETER :: B7ADOF43D = 823 + INTEGER(IntKi), PARAMETER :: B7ADOF44D = 824 + INTEGER(IntKi), PARAMETER :: B7ADOF45D = 825 + INTEGER(IntKi), PARAMETER :: B7ADOF46D = 826 + INTEGER(IntKi), PARAMETER :: B7ADOF47D = 827 + INTEGER(IntKi), PARAMETER :: B7ADOF48D = 828 + INTEGER(IntKi), PARAMETER :: B7ADOF49D = 829 + INTEGER(IntKi), PARAMETER :: B7ADOF50D = 830 + INTEGER(IntKi), PARAMETER :: B7ADOF51D = 831 + INTEGER(IntKi), PARAMETER :: B7ADOF52D = 832 + INTEGER(IntKi), PARAMETER :: B7ADOF53D = 833 + INTEGER(IntKi), PARAMETER :: B7ADOF54D = 834 + INTEGER(IntKi), PARAMETER :: B7ADOF55D = 835 + INTEGER(IntKi), PARAMETER :: B7ADOF56D = 836 + INTEGER(IntKi), PARAMETER :: B7ADOF57D = 837 + INTEGER(IntKi), PARAMETER :: B7ADOF58D = 838 + INTEGER(IntKi), PARAMETER :: B7ADOF59D = 839 + INTEGER(IntKi), PARAMETER :: B7ADOF60D = 840 + INTEGER(IntKi), PARAMETER :: B7ADOF61D = 841 + INTEGER(IntKi), PARAMETER :: B7ADOF62D = 842 + INTEGER(IntKi), PARAMETER :: B7ADOF63D = 843 + INTEGER(IntKi), PARAMETER :: B7ADOF64D = 844 + INTEGER(IntKi), PARAMETER :: B7ADOF65D = 845 + INTEGER(IntKi), PARAMETER :: B7ADOF66D = 846 + INTEGER(IntKi), PARAMETER :: B7ADOF67D = 847 + INTEGER(IntKi), PARAMETER :: B7ADOF68D = 848 + INTEGER(IntKi), PARAMETER :: B7ADOF69D = 849 + INTEGER(IntKi), PARAMETER :: B7ADOF70D = 850 + INTEGER(IntKi), PARAMETER :: B7ADOF71D = 851 + INTEGER(IntKi), PARAMETER :: B7ADOF72D = 852 + INTEGER(IntKi), PARAMETER :: B7ADOF73D = 853 + INTEGER(IntKi), PARAMETER :: B7ADOF74D = 854 + INTEGER(IntKi), PARAMETER :: B7ADOF75D = 855 + INTEGER(IntKi), PARAMETER :: B7ADOF76D = 856 + INTEGER(IntKi), PARAMETER :: B7ADOF77D = 857 + INTEGER(IntKi), PARAMETER :: B7ADOF78D = 858 + INTEGER(IntKi), PARAMETER :: B7ADOF79D = 859 + INTEGER(IntKi), PARAMETER :: B7ADOF80D = 860 + INTEGER(IntKi), PARAMETER :: B7ADOF81D = 861 + INTEGER(IntKi), PARAMETER :: B7ADOF82D = 862 + INTEGER(IntKi), PARAMETER :: B7ADOF83D = 863 + INTEGER(IntKi), PARAMETER :: B7ADOF84D = 864 + INTEGER(IntKi), PARAMETER :: B7ADOF85D = 865 + INTEGER(IntKi), PARAMETER :: B7ADOF86D = 866 + INTEGER(IntKi), PARAMETER :: B7ADOF87D = 867 + INTEGER(IntKi), PARAMETER :: B7ADOF88D = 868 + INTEGER(IntKi), PARAMETER :: B7ADOF89D = 869 + INTEGER(IntKi), PARAMETER :: B7ADOF90D = 870 + INTEGER(IntKi), PARAMETER :: B7ADOF91D = 871 + INTEGER(IntKi), PARAMETER :: B7ADOF92D = 872 + INTEGER(IntKi), PARAMETER :: B7ADOF93D = 873 + INTEGER(IntKi), PARAMETER :: B7ADOF94D = 874 + INTEGER(IntKi), PARAMETER :: B7ADOF95D = 875 + INTEGER(IntKi), PARAMETER :: B7ADOF96D = 876 + INTEGER(IntKi), PARAMETER :: B7ADOF97D = 877 + INTEGER(IntKi), PARAMETER :: B7ADOF98D = 878 + INTEGER(IntKi), PARAMETER :: B7ADOF99D = 879 + INTEGER(IntKi), PARAMETER :: B8ADOF1D = 880 + INTEGER(IntKi), PARAMETER :: B8ADOF2D = 881 + INTEGER(IntKi), PARAMETER :: B8ADOF3D = 882 + INTEGER(IntKi), PARAMETER :: B8ADOF4D = 883 + INTEGER(IntKi), PARAMETER :: B8ADOF5D = 884 + INTEGER(IntKi), PARAMETER :: B8ADOF6D = 885 + INTEGER(IntKi), PARAMETER :: B8ADOF7D = 886 + INTEGER(IntKi), PARAMETER :: B8ADOF8D = 887 + INTEGER(IntKi), PARAMETER :: B8ADOF9D = 888 + INTEGER(IntKi), PARAMETER :: B8ADOF10D = 889 + INTEGER(IntKi), PARAMETER :: B8ADOF11D = 890 + INTEGER(IntKi), PARAMETER :: B8ADOF12D = 891 + INTEGER(IntKi), PARAMETER :: B8ADOF13D = 892 + INTEGER(IntKi), PARAMETER :: B8ADOF14D = 893 + INTEGER(IntKi), PARAMETER :: B8ADOF15D = 894 + INTEGER(IntKi), PARAMETER :: B8ADOF16D = 895 + INTEGER(IntKi), PARAMETER :: B8ADOF17D = 896 + INTEGER(IntKi), PARAMETER :: B8ADOF18D = 897 + INTEGER(IntKi), PARAMETER :: B8ADOF19D = 898 + INTEGER(IntKi), PARAMETER :: B8ADOF20D = 899 + INTEGER(IntKi), PARAMETER :: B8ADOF21D = 900 + INTEGER(IntKi), PARAMETER :: B8ADOF22D = 901 + INTEGER(IntKi), PARAMETER :: B8ADOF23D = 902 + INTEGER(IntKi), PARAMETER :: B8ADOF24D = 903 + INTEGER(IntKi), PARAMETER :: B8ADOF25D = 904 + INTEGER(IntKi), PARAMETER :: B8ADOF26D = 905 + INTEGER(IntKi), PARAMETER :: B8ADOF27D = 906 + INTEGER(IntKi), PARAMETER :: B8ADOF28D = 907 + INTEGER(IntKi), PARAMETER :: B8ADOF29D = 908 + INTEGER(IntKi), PARAMETER :: B8ADOF30D = 909 + INTEGER(IntKi), PARAMETER :: B8ADOF31D = 910 + INTEGER(IntKi), PARAMETER :: B8ADOF32D = 911 + INTEGER(IntKi), PARAMETER :: B8ADOF33D = 912 + INTEGER(IntKi), PARAMETER :: B8ADOF34D = 913 + INTEGER(IntKi), PARAMETER :: B8ADOF35D = 914 + INTEGER(IntKi), PARAMETER :: B8ADOF36D = 915 + INTEGER(IntKi), PARAMETER :: B8ADOF37D = 916 + INTEGER(IntKi), PARAMETER :: B8ADOF38D = 917 + INTEGER(IntKi), PARAMETER :: B8ADOF39D = 918 + INTEGER(IntKi), PARAMETER :: B8ADOF40D = 919 + INTEGER(IntKi), PARAMETER :: B8ADOF41D = 920 + INTEGER(IntKi), PARAMETER :: B8ADOF42D = 921 + INTEGER(IntKi), PARAMETER :: B8ADOF43D = 922 + INTEGER(IntKi), PARAMETER :: B8ADOF44D = 923 + INTEGER(IntKi), PARAMETER :: B8ADOF45D = 924 + INTEGER(IntKi), PARAMETER :: B8ADOF46D = 925 + INTEGER(IntKi), PARAMETER :: B8ADOF47D = 926 + INTEGER(IntKi), PARAMETER :: B8ADOF48D = 927 + INTEGER(IntKi), PARAMETER :: B8ADOF49D = 928 + INTEGER(IntKi), PARAMETER :: B8ADOF50D = 929 + INTEGER(IntKi), PARAMETER :: B8ADOF51D = 930 + INTEGER(IntKi), PARAMETER :: B8ADOF52D = 931 + INTEGER(IntKi), PARAMETER :: B8ADOF53D = 932 + INTEGER(IntKi), PARAMETER :: B8ADOF54D = 933 + INTEGER(IntKi), PARAMETER :: B8ADOF55D = 934 + INTEGER(IntKi), PARAMETER :: B8ADOF56D = 935 + INTEGER(IntKi), PARAMETER :: B8ADOF57D = 936 + INTEGER(IntKi), PARAMETER :: B8ADOF58D = 937 + INTEGER(IntKi), PARAMETER :: B8ADOF59D = 938 + INTEGER(IntKi), PARAMETER :: B8ADOF60D = 939 + INTEGER(IntKi), PARAMETER :: B8ADOF61D = 940 + INTEGER(IntKi), PARAMETER :: B8ADOF62D = 941 + INTEGER(IntKi), PARAMETER :: B8ADOF63D = 942 + INTEGER(IntKi), PARAMETER :: B8ADOF64D = 943 + INTEGER(IntKi), PARAMETER :: B8ADOF65D = 944 + INTEGER(IntKi), PARAMETER :: B8ADOF66D = 945 + INTEGER(IntKi), PARAMETER :: B8ADOF67D = 946 + INTEGER(IntKi), PARAMETER :: B8ADOF68D = 947 + INTEGER(IntKi), PARAMETER :: B8ADOF69D = 948 + INTEGER(IntKi), PARAMETER :: B8ADOF70D = 949 + INTEGER(IntKi), PARAMETER :: B8ADOF71D = 950 + INTEGER(IntKi), PARAMETER :: B8ADOF72D = 951 + INTEGER(IntKi), PARAMETER :: B8ADOF73D = 952 + INTEGER(IntKi), PARAMETER :: B8ADOF74D = 953 + INTEGER(IntKi), PARAMETER :: B8ADOF75D = 954 + INTEGER(IntKi), PARAMETER :: B8ADOF76D = 955 + INTEGER(IntKi), PARAMETER :: B8ADOF77D = 956 + INTEGER(IntKi), PARAMETER :: B8ADOF78D = 957 + INTEGER(IntKi), PARAMETER :: B8ADOF79D = 958 + INTEGER(IntKi), PARAMETER :: B8ADOF80D = 959 + INTEGER(IntKi), PARAMETER :: B8ADOF81D = 960 + INTEGER(IntKi), PARAMETER :: B8ADOF82D = 961 + INTEGER(IntKi), PARAMETER :: B8ADOF83D = 962 + INTEGER(IntKi), PARAMETER :: B8ADOF84D = 963 + INTEGER(IntKi), PARAMETER :: B8ADOF85D = 964 + INTEGER(IntKi), PARAMETER :: B8ADOF86D = 965 + INTEGER(IntKi), PARAMETER :: B8ADOF87D = 966 + INTEGER(IntKi), PARAMETER :: B8ADOF88D = 967 + INTEGER(IntKi), PARAMETER :: B8ADOF89D = 968 + INTEGER(IntKi), PARAMETER :: B8ADOF90D = 969 + INTEGER(IntKi), PARAMETER :: B8ADOF91D = 970 + INTEGER(IntKi), PARAMETER :: B8ADOF92D = 971 + INTEGER(IntKi), PARAMETER :: B8ADOF93D = 972 + INTEGER(IntKi), PARAMETER :: B8ADOF94D = 973 + INTEGER(IntKi), PARAMETER :: B8ADOF95D = 974 + INTEGER(IntKi), PARAMETER :: B8ADOF96D = 975 + INTEGER(IntKi), PARAMETER :: B8ADOF97D = 976 + INTEGER(IntKi), PARAMETER :: B8ADOF98D = 977 + INTEGER(IntKi), PARAMETER :: B8ADOF99D = 978 + INTEGER(IntKi), PARAMETER :: B9ADOF1D = 979 + INTEGER(IntKi), PARAMETER :: B9ADOF2D = 980 + INTEGER(IntKi), PARAMETER :: B9ADOF3D = 981 + INTEGER(IntKi), PARAMETER :: B9ADOF4D = 982 + INTEGER(IntKi), PARAMETER :: B9ADOF5D = 983 + INTEGER(IntKi), PARAMETER :: B9ADOF6D = 984 + INTEGER(IntKi), PARAMETER :: B9ADOF7D = 985 + INTEGER(IntKi), PARAMETER :: B9ADOF8D = 986 + INTEGER(IntKi), PARAMETER :: B9ADOF9D = 987 + INTEGER(IntKi), PARAMETER :: B9ADOF10D = 988 + INTEGER(IntKi), PARAMETER :: B9ADOF11D = 989 + INTEGER(IntKi), PARAMETER :: B9ADOF12D = 990 + INTEGER(IntKi), PARAMETER :: B9ADOF13D = 991 + INTEGER(IntKi), PARAMETER :: B9ADOF14D = 992 + INTEGER(IntKi), PARAMETER :: B9ADOF15D = 993 + INTEGER(IntKi), PARAMETER :: B9ADOF16D = 994 + INTEGER(IntKi), PARAMETER :: B9ADOF17D = 995 + INTEGER(IntKi), PARAMETER :: B9ADOF18D = 996 + INTEGER(IntKi), PARAMETER :: B9ADOF19D = 997 + INTEGER(IntKi), PARAMETER :: B9ADOF20D = 998 + INTEGER(IntKi), PARAMETER :: B9ADOF21D = 999 + INTEGER(IntKi), PARAMETER :: B9ADOF22D = 1000 + INTEGER(IntKi), PARAMETER :: B9ADOF23D = 1001 + INTEGER(IntKi), PARAMETER :: B9ADOF24D = 1002 + INTEGER(IntKi), PARAMETER :: B9ADOF25D = 1003 + INTEGER(IntKi), PARAMETER :: B9ADOF26D = 1004 + INTEGER(IntKi), PARAMETER :: B9ADOF27D = 1005 + INTEGER(IntKi), PARAMETER :: B9ADOF28D = 1006 + INTEGER(IntKi), PARAMETER :: B9ADOF29D = 1007 + INTEGER(IntKi), PARAMETER :: B9ADOF30D = 1008 + INTEGER(IntKi), PARAMETER :: B9ADOF31D = 1009 + INTEGER(IntKi), PARAMETER :: B9ADOF32D = 1010 + INTEGER(IntKi), PARAMETER :: B9ADOF33D = 1011 + INTEGER(IntKi), PARAMETER :: B9ADOF34D = 1012 + INTEGER(IntKi), PARAMETER :: B9ADOF35D = 1013 + INTEGER(IntKi), PARAMETER :: B9ADOF36D = 1014 + INTEGER(IntKi), PARAMETER :: B9ADOF37D = 1015 + INTEGER(IntKi), PARAMETER :: B9ADOF38D = 1016 + INTEGER(IntKi), PARAMETER :: B9ADOF39D = 1017 + INTEGER(IntKi), PARAMETER :: B9ADOF40D = 1018 + INTEGER(IntKi), PARAMETER :: B9ADOF41D = 1019 + INTEGER(IntKi), PARAMETER :: B9ADOF42D = 1020 + INTEGER(IntKi), PARAMETER :: B9ADOF43D = 1021 + INTEGER(IntKi), PARAMETER :: B9ADOF44D = 1022 + INTEGER(IntKi), PARAMETER :: B9ADOF45D = 1023 + INTEGER(IntKi), PARAMETER :: B9ADOF46D = 1024 + INTEGER(IntKi), PARAMETER :: B9ADOF47D = 1025 + INTEGER(IntKi), PARAMETER :: B9ADOF48D = 1026 + INTEGER(IntKi), PARAMETER :: B9ADOF49D = 1027 + INTEGER(IntKi), PARAMETER :: B9ADOF50D = 1028 + INTEGER(IntKi), PARAMETER :: B9ADOF51D = 1029 + INTEGER(IntKi), PARAMETER :: B9ADOF52D = 1030 + INTEGER(IntKi), PARAMETER :: B9ADOF53D = 1031 + INTEGER(IntKi), PARAMETER :: B9ADOF54D = 1032 + INTEGER(IntKi), PARAMETER :: B9ADOF55D = 1033 + INTEGER(IntKi), PARAMETER :: B9ADOF56D = 1034 + INTEGER(IntKi), PARAMETER :: B9ADOF57D = 1035 + INTEGER(IntKi), PARAMETER :: B9ADOF58D = 1036 + INTEGER(IntKi), PARAMETER :: B9ADOF59D = 1037 + INTEGER(IntKi), PARAMETER :: B9ADOF60D = 1038 + INTEGER(IntKi), PARAMETER :: B9ADOF61D = 1039 + INTEGER(IntKi), PARAMETER :: B9ADOF62D = 1040 + INTEGER(IntKi), PARAMETER :: B9ADOF63D = 1041 + INTEGER(IntKi), PARAMETER :: B9ADOF64D = 1042 + INTEGER(IntKi), PARAMETER :: B9ADOF65D = 1043 + INTEGER(IntKi), PARAMETER :: B9ADOF66D = 1044 + INTEGER(IntKi), PARAMETER :: B9ADOF67D = 1045 + INTEGER(IntKi), PARAMETER :: B9ADOF68D = 1046 + INTEGER(IntKi), PARAMETER :: B9ADOF69D = 1047 + INTEGER(IntKi), PARAMETER :: B9ADOF70D = 1048 + INTEGER(IntKi), PARAMETER :: B9ADOF71D = 1049 + INTEGER(IntKi), PARAMETER :: B9ADOF72D = 1050 + INTEGER(IntKi), PARAMETER :: B9ADOF73D = 1051 + INTEGER(IntKi), PARAMETER :: B9ADOF74D = 1052 + INTEGER(IntKi), PARAMETER :: B9ADOF75D = 1053 + INTEGER(IntKi), PARAMETER :: B9ADOF76D = 1054 + INTEGER(IntKi), PARAMETER :: B9ADOF77D = 1055 + INTEGER(IntKi), PARAMETER :: B9ADOF78D = 1056 + INTEGER(IntKi), PARAMETER :: B9ADOF79D = 1057 + INTEGER(IntKi), PARAMETER :: B9ADOF80D = 1058 + INTEGER(IntKi), PARAMETER :: B9ADOF81D = 1059 + INTEGER(IntKi), PARAMETER :: B9ADOF82D = 1060 + INTEGER(IntKi), PARAMETER :: B9ADOF83D = 1061 + INTEGER(IntKi), PARAMETER :: B9ADOF84D = 1062 + INTEGER(IntKi), PARAMETER :: B9ADOF85D = 1063 + INTEGER(IntKi), PARAMETER :: B9ADOF86D = 1064 + INTEGER(IntKi), PARAMETER :: B9ADOF87D = 1065 + INTEGER(IntKi), PARAMETER :: B9ADOF88D = 1066 + INTEGER(IntKi), PARAMETER :: B9ADOF89D = 1067 + INTEGER(IntKi), PARAMETER :: B9ADOF90D = 1068 + INTEGER(IntKi), PARAMETER :: B9ADOF91D = 1069 + INTEGER(IntKi), PARAMETER :: B9ADOF92D = 1070 + INTEGER(IntKi), PARAMETER :: B9ADOF93D = 1071 + INTEGER(IntKi), PARAMETER :: B9ADOF94D = 1072 + INTEGER(IntKi), PARAMETER :: B9ADOF95D = 1073 + INTEGER(IntKi), PARAMETER :: B9ADOF96D = 1074 + INTEGER(IntKi), PARAMETER :: B9ADOF97D = 1075 + INTEGER(IntKi), PARAMETER :: B9ADOF98D = 1076 + INTEGER(IntKi), PARAMETER :: B9ADOF99D = 1077 + INTEGER(IntKi), PARAMETER :: B1ADOF1V = 1078 + INTEGER(IntKi), PARAMETER :: B1ADOF2V = 1079 + INTEGER(IntKi), PARAMETER :: B1ADOF3V = 1080 + INTEGER(IntKi), PARAMETER :: B1ADOF4V = 1081 + INTEGER(IntKi), PARAMETER :: B1ADOF5V = 1082 + INTEGER(IntKi), PARAMETER :: B1ADOF6V = 1083 + INTEGER(IntKi), PARAMETER :: B1ADOF7V = 1084 + INTEGER(IntKi), PARAMETER :: B1ADOF8V = 1085 + INTEGER(IntKi), PARAMETER :: B1ADOF9V = 1086 + INTEGER(IntKi), PARAMETER :: B1ADOF10V = 1087 + INTEGER(IntKi), PARAMETER :: B1ADOF11V = 1088 + INTEGER(IntKi), PARAMETER :: B1ADOF12V = 1089 + INTEGER(IntKi), PARAMETER :: B1ADOF13V = 1090 + INTEGER(IntKi), PARAMETER :: B1ADOF14V = 1091 + INTEGER(IntKi), PARAMETER :: B1ADOF15V = 1092 + INTEGER(IntKi), PARAMETER :: B1ADOF16V = 1093 + INTEGER(IntKi), PARAMETER :: B1ADOF17V = 1094 + INTEGER(IntKi), PARAMETER :: B1ADOF18V = 1095 + INTEGER(IntKi), PARAMETER :: B1ADOF19V = 1096 + INTEGER(IntKi), PARAMETER :: B1ADOF20V = 1097 + INTEGER(IntKi), PARAMETER :: B1ADOF21V = 1098 + INTEGER(IntKi), PARAMETER :: B1ADOF22V = 1099 + INTEGER(IntKi), PARAMETER :: B1ADOF23V = 1100 + INTEGER(IntKi), PARAMETER :: B1ADOF24V = 1101 + INTEGER(IntKi), PARAMETER :: B1ADOF25V = 1102 + INTEGER(IntKi), PARAMETER :: B1ADOF26V = 1103 + INTEGER(IntKi), PARAMETER :: B1ADOF27V = 1104 + INTEGER(IntKi), PARAMETER :: B1ADOF28V = 1105 + INTEGER(IntKi), PARAMETER :: B1ADOF29V = 1106 + INTEGER(IntKi), PARAMETER :: B1ADOF30V = 1107 + INTEGER(IntKi), PARAMETER :: B1ADOF31V = 1108 + INTEGER(IntKi), PARAMETER :: B1ADOF32V = 1109 + INTEGER(IntKi), PARAMETER :: B1ADOF33V = 1110 + INTEGER(IntKi), PARAMETER :: B1ADOF34V = 1111 + INTEGER(IntKi), PARAMETER :: B1ADOF35V = 1112 + INTEGER(IntKi), PARAMETER :: B1ADOF36V = 1113 + INTEGER(IntKi), PARAMETER :: B1ADOF37V = 1114 + INTEGER(IntKi), PARAMETER :: B1ADOF38V = 1115 + INTEGER(IntKi), PARAMETER :: B1ADOF39V = 1116 + INTEGER(IntKi), PARAMETER :: B1ADOF40V = 1117 + INTEGER(IntKi), PARAMETER :: B1ADOF41V = 1118 + INTEGER(IntKi), PARAMETER :: B1ADOF42V = 1119 + INTEGER(IntKi), PARAMETER :: B1ADOF43V = 1120 + INTEGER(IntKi), PARAMETER :: B1ADOF44V = 1121 + INTEGER(IntKi), PARAMETER :: B1ADOF45V = 1122 + INTEGER(IntKi), PARAMETER :: B1ADOF46V = 1123 + INTEGER(IntKi), PARAMETER :: B1ADOF47V = 1124 + INTEGER(IntKi), PARAMETER :: B1ADOF48V = 1125 + INTEGER(IntKi), PARAMETER :: B1ADOF49V = 1126 + INTEGER(IntKi), PARAMETER :: B1ADOF50V = 1127 + INTEGER(IntKi), PARAMETER :: B1ADOF51V = 1128 + INTEGER(IntKi), PARAMETER :: B1ADOF52V = 1129 + INTEGER(IntKi), PARAMETER :: B1ADOF53V = 1130 + INTEGER(IntKi), PARAMETER :: B1ADOF54V = 1131 + INTEGER(IntKi), PARAMETER :: B1ADOF55V = 1132 + INTEGER(IntKi), PARAMETER :: B1ADOF56V = 1133 + INTEGER(IntKi), PARAMETER :: B1ADOF57V = 1134 + INTEGER(IntKi), PARAMETER :: B1ADOF58V = 1135 + INTEGER(IntKi), PARAMETER :: B1ADOF59V = 1136 + INTEGER(IntKi), PARAMETER :: B1ADOF60V = 1137 + INTEGER(IntKi), PARAMETER :: B1ADOF61V = 1138 + INTEGER(IntKi), PARAMETER :: B1ADOF62V = 1139 + INTEGER(IntKi), PARAMETER :: B1ADOF63V = 1140 + INTEGER(IntKi), PARAMETER :: B1ADOF64V = 1141 + INTEGER(IntKi), PARAMETER :: B1ADOF65V = 1142 + INTEGER(IntKi), PARAMETER :: B1ADOF66V = 1143 + INTEGER(IntKi), PARAMETER :: B1ADOF67V = 1144 + INTEGER(IntKi), PARAMETER :: B1ADOF68V = 1145 + INTEGER(IntKi), PARAMETER :: B1ADOF69V = 1146 + INTEGER(IntKi), PARAMETER :: B1ADOF70V = 1147 + INTEGER(IntKi), PARAMETER :: B1ADOF71V = 1148 + INTEGER(IntKi), PARAMETER :: B1ADOF72V = 1149 + INTEGER(IntKi), PARAMETER :: B1ADOF73V = 1150 + INTEGER(IntKi), PARAMETER :: B1ADOF74V = 1151 + INTEGER(IntKi), PARAMETER :: B1ADOF75V = 1152 + INTEGER(IntKi), PARAMETER :: B1ADOF76V = 1153 + INTEGER(IntKi), PARAMETER :: B1ADOF77V = 1154 + INTEGER(IntKi), PARAMETER :: B1ADOF78V = 1155 + INTEGER(IntKi), PARAMETER :: B1ADOF79V = 1156 + INTEGER(IntKi), PARAMETER :: B1ADOF80V = 1157 + INTEGER(IntKi), PARAMETER :: B1ADOF81V = 1158 + INTEGER(IntKi), PARAMETER :: B1ADOF82V = 1159 + INTEGER(IntKi), PARAMETER :: B1ADOF83V = 1160 + INTEGER(IntKi), PARAMETER :: B1ADOF84V = 1161 + INTEGER(IntKi), PARAMETER :: B1ADOF85V = 1162 + INTEGER(IntKi), PARAMETER :: B1ADOF86V = 1163 + INTEGER(IntKi), PARAMETER :: B1ADOF87V = 1164 + INTEGER(IntKi), PARAMETER :: B1ADOF88V = 1165 + INTEGER(IntKi), PARAMETER :: B1ADOF89V = 1166 + INTEGER(IntKi), PARAMETER :: B1ADOF90V = 1167 + INTEGER(IntKi), PARAMETER :: B1ADOF91V = 1168 + INTEGER(IntKi), PARAMETER :: B1ADOF92V = 1169 + INTEGER(IntKi), PARAMETER :: B1ADOF93V = 1170 + INTEGER(IntKi), PARAMETER :: B1ADOF94V = 1171 + INTEGER(IntKi), PARAMETER :: B1ADOF95V = 1172 + INTEGER(IntKi), PARAMETER :: B1ADOF96V = 1173 + INTEGER(IntKi), PARAMETER :: B1ADOF97V = 1174 + INTEGER(IntKi), PARAMETER :: B1ADOF98V = 1175 + INTEGER(IntKi), PARAMETER :: B1ADOF99V = 1176 + INTEGER(IntKi), PARAMETER :: B2ADOF1V = 1177 + INTEGER(IntKi), PARAMETER :: B2ADOF2V = 1178 + INTEGER(IntKi), PARAMETER :: B2ADOF3V = 1179 + INTEGER(IntKi), PARAMETER :: B2ADOF4V = 1180 + INTEGER(IntKi), PARAMETER :: B2ADOF5V = 1181 + INTEGER(IntKi), PARAMETER :: B2ADOF6V = 1182 + INTEGER(IntKi), PARAMETER :: B2ADOF7V = 1183 + INTEGER(IntKi), PARAMETER :: B2ADOF8V = 1184 + INTEGER(IntKi), PARAMETER :: B2ADOF9V = 1185 + INTEGER(IntKi), PARAMETER :: B2ADOF10V = 1186 + INTEGER(IntKi), PARAMETER :: B2ADOF11V = 1187 + INTEGER(IntKi), PARAMETER :: B2ADOF12V = 1188 + INTEGER(IntKi), PARAMETER :: B2ADOF13V = 1189 + INTEGER(IntKi), PARAMETER :: B2ADOF14V = 1190 + INTEGER(IntKi), PARAMETER :: B2ADOF15V = 1191 + INTEGER(IntKi), PARAMETER :: B2ADOF16V = 1192 + INTEGER(IntKi), PARAMETER :: B2ADOF17V = 1193 + INTEGER(IntKi), PARAMETER :: B2ADOF18V = 1194 + INTEGER(IntKi), PARAMETER :: B2ADOF19V = 1195 + INTEGER(IntKi), PARAMETER :: B2ADOF20V = 1196 + INTEGER(IntKi), PARAMETER :: B2ADOF21V = 1197 + INTEGER(IntKi), PARAMETER :: B2ADOF22V = 1198 + INTEGER(IntKi), PARAMETER :: B2ADOF23V = 1199 + INTEGER(IntKi), PARAMETER :: B2ADOF24V = 1200 + INTEGER(IntKi), PARAMETER :: B2ADOF25V = 1201 + INTEGER(IntKi), PARAMETER :: B2ADOF26V = 1202 + INTEGER(IntKi), PARAMETER :: B2ADOF27V = 1203 + INTEGER(IntKi), PARAMETER :: B2ADOF28V = 1204 + INTEGER(IntKi), PARAMETER :: B2ADOF29V = 1205 + INTEGER(IntKi), PARAMETER :: B2ADOF30V = 1206 + INTEGER(IntKi), PARAMETER :: B2ADOF31V = 1207 + INTEGER(IntKi), PARAMETER :: B2ADOF32V = 1208 + INTEGER(IntKi), PARAMETER :: B2ADOF33V = 1209 + INTEGER(IntKi), PARAMETER :: B2ADOF34V = 1210 + INTEGER(IntKi), PARAMETER :: B2ADOF35V = 1211 + INTEGER(IntKi), PARAMETER :: B2ADOF36V = 1212 + INTEGER(IntKi), PARAMETER :: B2ADOF37V = 1213 + INTEGER(IntKi), PARAMETER :: B2ADOF38V = 1214 + INTEGER(IntKi), PARAMETER :: B2ADOF39V = 1215 + INTEGER(IntKi), PARAMETER :: B2ADOF40V = 1216 + INTEGER(IntKi), PARAMETER :: B2ADOF41V = 1217 + INTEGER(IntKi), PARAMETER :: B2ADOF42V = 1218 + INTEGER(IntKi), PARAMETER :: B2ADOF43V = 1219 + INTEGER(IntKi), PARAMETER :: B2ADOF44V = 1220 + INTEGER(IntKi), PARAMETER :: B2ADOF45V = 1221 + INTEGER(IntKi), PARAMETER :: B2ADOF46V = 1222 + INTEGER(IntKi), PARAMETER :: B2ADOF47V = 1223 + INTEGER(IntKi), PARAMETER :: B2ADOF48V = 1224 + INTEGER(IntKi), PARAMETER :: B2ADOF49V = 1225 + INTEGER(IntKi), PARAMETER :: B2ADOF50V = 1226 + INTEGER(IntKi), PARAMETER :: B2ADOF51V = 1227 + INTEGER(IntKi), PARAMETER :: B2ADOF52V = 1228 + INTEGER(IntKi), PARAMETER :: B2ADOF53V = 1229 + INTEGER(IntKi), PARAMETER :: B2ADOF54V = 1230 + INTEGER(IntKi), PARAMETER :: B2ADOF55V = 1231 + INTEGER(IntKi), PARAMETER :: B2ADOF56V = 1232 + INTEGER(IntKi), PARAMETER :: B2ADOF57V = 1233 + INTEGER(IntKi), PARAMETER :: B2ADOF58V = 1234 + INTEGER(IntKi), PARAMETER :: B2ADOF59V = 1235 + INTEGER(IntKi), PARAMETER :: B2ADOF60V = 1236 + INTEGER(IntKi), PARAMETER :: B2ADOF61V = 1237 + INTEGER(IntKi), PARAMETER :: B2ADOF62V = 1238 + INTEGER(IntKi), PARAMETER :: B2ADOF63V = 1239 + INTEGER(IntKi), PARAMETER :: B2ADOF64V = 1240 + INTEGER(IntKi), PARAMETER :: B2ADOF65V = 1241 + INTEGER(IntKi), PARAMETER :: B2ADOF66V = 1242 + INTEGER(IntKi), PARAMETER :: B2ADOF67V = 1243 + INTEGER(IntKi), PARAMETER :: B2ADOF68V = 1244 + INTEGER(IntKi), PARAMETER :: B2ADOF69V = 1245 + INTEGER(IntKi), PARAMETER :: B2ADOF70V = 1246 + INTEGER(IntKi), PARAMETER :: B2ADOF71V = 1247 + INTEGER(IntKi), PARAMETER :: B2ADOF72V = 1248 + INTEGER(IntKi), PARAMETER :: B2ADOF73V = 1249 + INTEGER(IntKi), PARAMETER :: B2ADOF74V = 1250 + INTEGER(IntKi), PARAMETER :: B2ADOF75V = 1251 + INTEGER(IntKi), PARAMETER :: B2ADOF76V = 1252 + INTEGER(IntKi), PARAMETER :: B2ADOF77V = 1253 + INTEGER(IntKi), PARAMETER :: B2ADOF78V = 1254 + INTEGER(IntKi), PARAMETER :: B2ADOF79V = 1255 + INTEGER(IntKi), PARAMETER :: B2ADOF80V = 1256 + INTEGER(IntKi), PARAMETER :: B2ADOF81V = 1257 + INTEGER(IntKi), PARAMETER :: B2ADOF82V = 1258 + INTEGER(IntKi), PARAMETER :: B2ADOF83V = 1259 + INTEGER(IntKi), PARAMETER :: B2ADOF84V = 1260 + INTEGER(IntKi), PARAMETER :: B2ADOF85V = 1261 + INTEGER(IntKi), PARAMETER :: B2ADOF86V = 1262 + INTEGER(IntKi), PARAMETER :: B2ADOF87V = 1263 + INTEGER(IntKi), PARAMETER :: B2ADOF88V = 1264 + INTEGER(IntKi), PARAMETER :: B2ADOF89V = 1265 + INTEGER(IntKi), PARAMETER :: B2ADOF90V = 1266 + INTEGER(IntKi), PARAMETER :: B2ADOF91V = 1267 + INTEGER(IntKi), PARAMETER :: B2ADOF92V = 1268 + INTEGER(IntKi), PARAMETER :: B2ADOF93V = 1269 + INTEGER(IntKi), PARAMETER :: B2ADOF94V = 1270 + INTEGER(IntKi), PARAMETER :: B2ADOF95V = 1271 + INTEGER(IntKi), PARAMETER :: B2ADOF96V = 1272 + INTEGER(IntKi), PARAMETER :: B2ADOF97V = 1273 + INTEGER(IntKi), PARAMETER :: B2ADOF98V = 1274 + INTEGER(IntKi), PARAMETER :: B2ADOF99V = 1275 + INTEGER(IntKi), PARAMETER :: B3ADOF1V = 1276 + INTEGER(IntKi), PARAMETER :: B3ADOF2V = 1277 + INTEGER(IntKi), PARAMETER :: B3ADOF3V = 1278 + INTEGER(IntKi), PARAMETER :: B3ADOF4V = 1279 + INTEGER(IntKi), PARAMETER :: B3ADOF5V = 1280 + INTEGER(IntKi), PARAMETER :: B3ADOF6V = 1281 + INTEGER(IntKi), PARAMETER :: B3ADOF7V = 1282 + INTEGER(IntKi), PARAMETER :: B3ADOF8V = 1283 + INTEGER(IntKi), PARAMETER :: B3ADOF9V = 1284 + INTEGER(IntKi), PARAMETER :: B3ADOF10V = 1285 + INTEGER(IntKi), PARAMETER :: B3ADOF11V = 1286 + INTEGER(IntKi), PARAMETER :: B3ADOF12V = 1287 + INTEGER(IntKi), PARAMETER :: B3ADOF13V = 1288 + INTEGER(IntKi), PARAMETER :: B3ADOF14V = 1289 + INTEGER(IntKi), PARAMETER :: B3ADOF15V = 1290 + INTEGER(IntKi), PARAMETER :: B3ADOF16V = 1291 + INTEGER(IntKi), PARAMETER :: B3ADOF17V = 1292 + INTEGER(IntKi), PARAMETER :: B3ADOF18V = 1293 + INTEGER(IntKi), PARAMETER :: B3ADOF19V = 1294 + INTEGER(IntKi), PARAMETER :: B3ADOF20V = 1295 + INTEGER(IntKi), PARAMETER :: B3ADOF21V = 1296 + INTEGER(IntKi), PARAMETER :: B3ADOF22V = 1297 + INTEGER(IntKi), PARAMETER :: B3ADOF23V = 1298 + INTEGER(IntKi), PARAMETER :: B3ADOF24V = 1299 + INTEGER(IntKi), PARAMETER :: B3ADOF25V = 1300 + INTEGER(IntKi), PARAMETER :: B3ADOF26V = 1301 + INTEGER(IntKi), PARAMETER :: B3ADOF27V = 1302 + INTEGER(IntKi), PARAMETER :: B3ADOF28V = 1303 + INTEGER(IntKi), PARAMETER :: B3ADOF29V = 1304 + INTEGER(IntKi), PARAMETER :: B3ADOF30V = 1305 + INTEGER(IntKi), PARAMETER :: B3ADOF31V = 1306 + INTEGER(IntKi), PARAMETER :: B3ADOF32V = 1307 + INTEGER(IntKi), PARAMETER :: B3ADOF33V = 1308 + INTEGER(IntKi), PARAMETER :: B3ADOF34V = 1309 + INTEGER(IntKi), PARAMETER :: B3ADOF35V = 1310 + INTEGER(IntKi), PARAMETER :: B3ADOF36V = 1311 + INTEGER(IntKi), PARAMETER :: B3ADOF37V = 1312 + INTEGER(IntKi), PARAMETER :: B3ADOF38V = 1313 + INTEGER(IntKi), PARAMETER :: B3ADOF39V = 1314 + INTEGER(IntKi), PARAMETER :: B3ADOF40V = 1315 + INTEGER(IntKi), PARAMETER :: B3ADOF41V = 1316 + INTEGER(IntKi), PARAMETER :: B3ADOF42V = 1317 + INTEGER(IntKi), PARAMETER :: B3ADOF43V = 1318 + INTEGER(IntKi), PARAMETER :: B3ADOF44V = 1319 + INTEGER(IntKi), PARAMETER :: B3ADOF45V = 1320 + INTEGER(IntKi), PARAMETER :: B3ADOF46V = 1321 + INTEGER(IntKi), PARAMETER :: B3ADOF47V = 1322 + INTEGER(IntKi), PARAMETER :: B3ADOF48V = 1323 + INTEGER(IntKi), PARAMETER :: B3ADOF49V = 1324 + INTEGER(IntKi), PARAMETER :: B3ADOF50V = 1325 + INTEGER(IntKi), PARAMETER :: B3ADOF51V = 1326 + INTEGER(IntKi), PARAMETER :: B3ADOF52V = 1327 + INTEGER(IntKi), PARAMETER :: B3ADOF53V = 1328 + INTEGER(IntKi), PARAMETER :: B3ADOF54V = 1329 + INTEGER(IntKi), PARAMETER :: B3ADOF55V = 1330 + INTEGER(IntKi), PARAMETER :: B3ADOF56V = 1331 + INTEGER(IntKi), PARAMETER :: B3ADOF57V = 1332 + INTEGER(IntKi), PARAMETER :: B3ADOF58V = 1333 + INTEGER(IntKi), PARAMETER :: B3ADOF59V = 1334 + INTEGER(IntKi), PARAMETER :: B3ADOF60V = 1335 + INTEGER(IntKi), PARAMETER :: B3ADOF61V = 1336 + INTEGER(IntKi), PARAMETER :: B3ADOF62V = 1337 + INTEGER(IntKi), PARAMETER :: B3ADOF63V = 1338 + INTEGER(IntKi), PARAMETER :: B3ADOF64V = 1339 + INTEGER(IntKi), PARAMETER :: B3ADOF65V = 1340 + INTEGER(IntKi), PARAMETER :: B3ADOF66V = 1341 + INTEGER(IntKi), PARAMETER :: B3ADOF67V = 1342 + INTEGER(IntKi), PARAMETER :: B3ADOF68V = 1343 + INTEGER(IntKi), PARAMETER :: B3ADOF69V = 1344 + INTEGER(IntKi), PARAMETER :: B3ADOF70V = 1345 + INTEGER(IntKi), PARAMETER :: B3ADOF71V = 1346 + INTEGER(IntKi), PARAMETER :: B3ADOF72V = 1347 + INTEGER(IntKi), PARAMETER :: B3ADOF73V = 1348 + INTEGER(IntKi), PARAMETER :: B3ADOF74V = 1349 + INTEGER(IntKi), PARAMETER :: B3ADOF75V = 1350 + INTEGER(IntKi), PARAMETER :: B3ADOF76V = 1351 + INTEGER(IntKi), PARAMETER :: B3ADOF77V = 1352 + INTEGER(IntKi), PARAMETER :: B3ADOF78V = 1353 + INTEGER(IntKi), PARAMETER :: B3ADOF79V = 1354 + INTEGER(IntKi), PARAMETER :: B3ADOF80V = 1355 + INTEGER(IntKi), PARAMETER :: B3ADOF81V = 1356 + INTEGER(IntKi), PARAMETER :: B3ADOF82V = 1357 + INTEGER(IntKi), PARAMETER :: B3ADOF83V = 1358 + INTEGER(IntKi), PARAMETER :: B3ADOF84V = 1359 + INTEGER(IntKi), PARAMETER :: B3ADOF85V = 1360 + INTEGER(IntKi), PARAMETER :: B3ADOF86V = 1361 + INTEGER(IntKi), PARAMETER :: B3ADOF87V = 1362 + INTEGER(IntKi), PARAMETER :: B3ADOF88V = 1363 + INTEGER(IntKi), PARAMETER :: B3ADOF89V = 1364 + INTEGER(IntKi), PARAMETER :: B3ADOF90V = 1365 + INTEGER(IntKi), PARAMETER :: B3ADOF91V = 1366 + INTEGER(IntKi), PARAMETER :: B3ADOF92V = 1367 + INTEGER(IntKi), PARAMETER :: B3ADOF93V = 1368 + INTEGER(IntKi), PARAMETER :: B3ADOF94V = 1369 + INTEGER(IntKi), PARAMETER :: B3ADOF95V = 1370 + INTEGER(IntKi), PARAMETER :: B3ADOF96V = 1371 + INTEGER(IntKi), PARAMETER :: B3ADOF97V = 1372 + INTEGER(IntKi), PARAMETER :: B3ADOF98V = 1373 + INTEGER(IntKi), PARAMETER :: B3ADOF99V = 1374 + INTEGER(IntKi), PARAMETER :: B4ADOF1V = 1375 + INTEGER(IntKi), PARAMETER :: B4ADOF2V = 1376 + INTEGER(IntKi), PARAMETER :: B4ADOF3V = 1377 + INTEGER(IntKi), PARAMETER :: B4ADOF4V = 1378 + INTEGER(IntKi), PARAMETER :: B4ADOF5V = 1379 + INTEGER(IntKi), PARAMETER :: B4ADOF6V = 1380 + INTEGER(IntKi), PARAMETER :: B4ADOF7V = 1381 + INTEGER(IntKi), PARAMETER :: B4ADOF8V = 1382 + INTEGER(IntKi), PARAMETER :: B4ADOF9V = 1383 + INTEGER(IntKi), PARAMETER :: B4ADOF10V = 1384 + INTEGER(IntKi), PARAMETER :: B4ADOF11V = 1385 + INTEGER(IntKi), PARAMETER :: B4ADOF12V = 1386 + INTEGER(IntKi), PARAMETER :: B4ADOF13V = 1387 + INTEGER(IntKi), PARAMETER :: B4ADOF14V = 1388 + INTEGER(IntKi), PARAMETER :: B4ADOF15V = 1389 + INTEGER(IntKi), PARAMETER :: B4ADOF16V = 1390 + INTEGER(IntKi), PARAMETER :: B4ADOF17V = 1391 + INTEGER(IntKi), PARAMETER :: B4ADOF18V = 1392 + INTEGER(IntKi), PARAMETER :: B4ADOF19V = 1393 + INTEGER(IntKi), PARAMETER :: B4ADOF20V = 1394 + INTEGER(IntKi), PARAMETER :: B4ADOF21V = 1395 + INTEGER(IntKi), PARAMETER :: B4ADOF22V = 1396 + INTEGER(IntKi), PARAMETER :: B4ADOF23V = 1397 + INTEGER(IntKi), PARAMETER :: B4ADOF24V = 1398 + INTEGER(IntKi), PARAMETER :: B4ADOF25V = 1399 + INTEGER(IntKi), PARAMETER :: B4ADOF26V = 1400 + INTEGER(IntKi), PARAMETER :: B4ADOF27V = 1401 + INTEGER(IntKi), PARAMETER :: B4ADOF28V = 1402 + INTEGER(IntKi), PARAMETER :: B4ADOF29V = 1403 + INTEGER(IntKi), PARAMETER :: B4ADOF30V = 1404 + INTEGER(IntKi), PARAMETER :: B4ADOF31V = 1405 + INTEGER(IntKi), PARAMETER :: B4ADOF32V = 1406 + INTEGER(IntKi), PARAMETER :: B4ADOF33V = 1407 + INTEGER(IntKi), PARAMETER :: B4ADOF34V = 1408 + INTEGER(IntKi), PARAMETER :: B4ADOF35V = 1409 + INTEGER(IntKi), PARAMETER :: B4ADOF36V = 1410 + INTEGER(IntKi), PARAMETER :: B4ADOF37V = 1411 + INTEGER(IntKi), PARAMETER :: B4ADOF38V = 1412 + INTEGER(IntKi), PARAMETER :: B4ADOF39V = 1413 + INTEGER(IntKi), PARAMETER :: B4ADOF40V = 1414 + INTEGER(IntKi), PARAMETER :: B4ADOF41V = 1415 + INTEGER(IntKi), PARAMETER :: B4ADOF42V = 1416 + INTEGER(IntKi), PARAMETER :: B4ADOF43V = 1417 + INTEGER(IntKi), PARAMETER :: B4ADOF44V = 1418 + INTEGER(IntKi), PARAMETER :: B4ADOF45V = 1419 + INTEGER(IntKi), PARAMETER :: B4ADOF46V = 1420 + INTEGER(IntKi), PARAMETER :: B4ADOF47V = 1421 + INTEGER(IntKi), PARAMETER :: B4ADOF48V = 1422 + INTEGER(IntKi), PARAMETER :: B4ADOF49V = 1423 + INTEGER(IntKi), PARAMETER :: B4ADOF50V = 1424 + INTEGER(IntKi), PARAMETER :: B4ADOF51V = 1425 + INTEGER(IntKi), PARAMETER :: B4ADOF52V = 1426 + INTEGER(IntKi), PARAMETER :: B4ADOF53V = 1427 + INTEGER(IntKi), PARAMETER :: B4ADOF54V = 1428 + INTEGER(IntKi), PARAMETER :: B4ADOF55V = 1429 + INTEGER(IntKi), PARAMETER :: B4ADOF56V = 1430 + INTEGER(IntKi), PARAMETER :: B4ADOF57V = 1431 + INTEGER(IntKi), PARAMETER :: B4ADOF58V = 1432 + INTEGER(IntKi), PARAMETER :: B4ADOF59V = 1433 + INTEGER(IntKi), PARAMETER :: B4ADOF60V = 1434 + INTEGER(IntKi), PARAMETER :: B4ADOF61V = 1435 + INTEGER(IntKi), PARAMETER :: B4ADOF62V = 1436 + INTEGER(IntKi), PARAMETER :: B4ADOF63V = 1437 + INTEGER(IntKi), PARAMETER :: B4ADOF64V = 1438 + INTEGER(IntKi), PARAMETER :: B4ADOF65V = 1439 + INTEGER(IntKi), PARAMETER :: B4ADOF66V = 1440 + INTEGER(IntKi), PARAMETER :: B4ADOF67V = 1441 + INTEGER(IntKi), PARAMETER :: B4ADOF68V = 1442 + INTEGER(IntKi), PARAMETER :: B4ADOF69V = 1443 + INTEGER(IntKi), PARAMETER :: B4ADOF70V = 1444 + INTEGER(IntKi), PARAMETER :: B4ADOF71V = 1445 + INTEGER(IntKi), PARAMETER :: B4ADOF72V = 1446 + INTEGER(IntKi), PARAMETER :: B4ADOF73V = 1447 + INTEGER(IntKi), PARAMETER :: B4ADOF74V = 1448 + INTEGER(IntKi), PARAMETER :: B4ADOF75V = 1449 + INTEGER(IntKi), PARAMETER :: B4ADOF76V = 1450 + INTEGER(IntKi), PARAMETER :: B4ADOF77V = 1451 + INTEGER(IntKi), PARAMETER :: B4ADOF78V = 1452 + INTEGER(IntKi), PARAMETER :: B4ADOF79V = 1453 + INTEGER(IntKi), PARAMETER :: B4ADOF80V = 1454 + INTEGER(IntKi), PARAMETER :: B4ADOF81V = 1455 + INTEGER(IntKi), PARAMETER :: B4ADOF82V = 1456 + INTEGER(IntKi), PARAMETER :: B4ADOF83V = 1457 + INTEGER(IntKi), PARAMETER :: B4ADOF84V = 1458 + INTEGER(IntKi), PARAMETER :: B4ADOF85V = 1459 + INTEGER(IntKi), PARAMETER :: B4ADOF86V = 1460 + INTEGER(IntKi), PARAMETER :: B4ADOF87V = 1461 + INTEGER(IntKi), PARAMETER :: B4ADOF88V = 1462 + INTEGER(IntKi), PARAMETER :: B4ADOF89V = 1463 + INTEGER(IntKi), PARAMETER :: B4ADOF90V = 1464 + INTEGER(IntKi), PARAMETER :: B4ADOF91V = 1465 + INTEGER(IntKi), PARAMETER :: B4ADOF92V = 1466 + INTEGER(IntKi), PARAMETER :: B4ADOF93V = 1467 + INTEGER(IntKi), PARAMETER :: B4ADOF94V = 1468 + INTEGER(IntKi), PARAMETER :: B4ADOF95V = 1469 + INTEGER(IntKi), PARAMETER :: B4ADOF96V = 1470 + INTEGER(IntKi), PARAMETER :: B4ADOF97V = 1471 + INTEGER(IntKi), PARAMETER :: B4ADOF98V = 1472 + INTEGER(IntKi), PARAMETER :: B4ADOF99V = 1473 + INTEGER(IntKi), PARAMETER :: B5ADOF1V = 1474 + INTEGER(IntKi), PARAMETER :: B5ADOF2V = 1475 + INTEGER(IntKi), PARAMETER :: B5ADOF3V = 1476 + INTEGER(IntKi), PARAMETER :: B5ADOF4V = 1477 + INTEGER(IntKi), PARAMETER :: B5ADOF5V = 1478 + INTEGER(IntKi), PARAMETER :: B5ADOF6V = 1479 + INTEGER(IntKi), PARAMETER :: B5ADOF7V = 1480 + INTEGER(IntKi), PARAMETER :: B5ADOF8V = 1481 + INTEGER(IntKi), PARAMETER :: B5ADOF9V = 1482 + INTEGER(IntKi), PARAMETER :: B5ADOF10V = 1483 + INTEGER(IntKi), PARAMETER :: B5ADOF11V = 1484 + INTEGER(IntKi), PARAMETER :: B5ADOF12V = 1485 + INTEGER(IntKi), PARAMETER :: B5ADOF13V = 1486 + INTEGER(IntKi), PARAMETER :: B5ADOF14V = 1487 + INTEGER(IntKi), PARAMETER :: B5ADOF15V = 1488 + INTEGER(IntKi), PARAMETER :: B5ADOF16V = 1489 + INTEGER(IntKi), PARAMETER :: B5ADOF17V = 1490 + INTEGER(IntKi), PARAMETER :: B5ADOF18V = 1491 + INTEGER(IntKi), PARAMETER :: B5ADOF19V = 1492 + INTEGER(IntKi), PARAMETER :: B5ADOF20V = 1493 + INTEGER(IntKi), PARAMETER :: B5ADOF21V = 1494 + INTEGER(IntKi), PARAMETER :: B5ADOF22V = 1495 + INTEGER(IntKi), PARAMETER :: B5ADOF23V = 1496 + INTEGER(IntKi), PARAMETER :: B5ADOF24V = 1497 + INTEGER(IntKi), PARAMETER :: B5ADOF25V = 1498 + INTEGER(IntKi), PARAMETER :: B5ADOF26V = 1499 + INTEGER(IntKi), PARAMETER :: B5ADOF27V = 1500 + INTEGER(IntKi), PARAMETER :: B5ADOF28V = 1501 + INTEGER(IntKi), PARAMETER :: B5ADOF29V = 1502 + INTEGER(IntKi), PARAMETER :: B5ADOF30V = 1503 + INTEGER(IntKi), PARAMETER :: B5ADOF31V = 1504 + INTEGER(IntKi), PARAMETER :: B5ADOF32V = 1505 + INTEGER(IntKi), PARAMETER :: B5ADOF33V = 1506 + INTEGER(IntKi), PARAMETER :: B5ADOF34V = 1507 + INTEGER(IntKi), PARAMETER :: B5ADOF35V = 1508 + INTEGER(IntKi), PARAMETER :: B5ADOF36V = 1509 + INTEGER(IntKi), PARAMETER :: B5ADOF37V = 1510 + INTEGER(IntKi), PARAMETER :: B5ADOF38V = 1511 + INTEGER(IntKi), PARAMETER :: B5ADOF39V = 1512 + INTEGER(IntKi), PARAMETER :: B5ADOF40V = 1513 + INTEGER(IntKi), PARAMETER :: B5ADOF41V = 1514 + INTEGER(IntKi), PARAMETER :: B5ADOF42V = 1515 + INTEGER(IntKi), PARAMETER :: B5ADOF43V = 1516 + INTEGER(IntKi), PARAMETER :: B5ADOF44V = 1517 + INTEGER(IntKi), PARAMETER :: B5ADOF45V = 1518 + INTEGER(IntKi), PARAMETER :: B5ADOF46V = 1519 + INTEGER(IntKi), PARAMETER :: B5ADOF47V = 1520 + INTEGER(IntKi), PARAMETER :: B5ADOF48V = 1521 + INTEGER(IntKi), PARAMETER :: B5ADOF49V = 1522 + INTEGER(IntKi), PARAMETER :: B5ADOF50V = 1523 + INTEGER(IntKi), PARAMETER :: B5ADOF51V = 1524 + INTEGER(IntKi), PARAMETER :: B5ADOF52V = 1525 + INTEGER(IntKi), PARAMETER :: B5ADOF53V = 1526 + INTEGER(IntKi), PARAMETER :: B5ADOF54V = 1527 + INTEGER(IntKi), PARAMETER :: B5ADOF55V = 1528 + INTEGER(IntKi), PARAMETER :: B5ADOF56V = 1529 + INTEGER(IntKi), PARAMETER :: B5ADOF57V = 1530 + INTEGER(IntKi), PARAMETER :: B5ADOF58V = 1531 + INTEGER(IntKi), PARAMETER :: B5ADOF59V = 1532 + INTEGER(IntKi), PARAMETER :: B5ADOF60V = 1533 + INTEGER(IntKi), PARAMETER :: B5ADOF61V = 1534 + INTEGER(IntKi), PARAMETER :: B5ADOF62V = 1535 + INTEGER(IntKi), PARAMETER :: B5ADOF63V = 1536 + INTEGER(IntKi), PARAMETER :: B5ADOF64V = 1537 + INTEGER(IntKi), PARAMETER :: B5ADOF65V = 1538 + INTEGER(IntKi), PARAMETER :: B5ADOF66V = 1539 + INTEGER(IntKi), PARAMETER :: B5ADOF67V = 1540 + INTEGER(IntKi), PARAMETER :: B5ADOF68V = 1541 + INTEGER(IntKi), PARAMETER :: B5ADOF69V = 1542 + INTEGER(IntKi), PARAMETER :: B5ADOF70V = 1543 + INTEGER(IntKi), PARAMETER :: B5ADOF71V = 1544 + INTEGER(IntKi), PARAMETER :: B5ADOF72V = 1545 + INTEGER(IntKi), PARAMETER :: B5ADOF73V = 1546 + INTEGER(IntKi), PARAMETER :: B5ADOF74V = 1547 + INTEGER(IntKi), PARAMETER :: B5ADOF75V = 1548 + INTEGER(IntKi), PARAMETER :: B5ADOF76V = 1549 + INTEGER(IntKi), PARAMETER :: B5ADOF77V = 1550 + INTEGER(IntKi), PARAMETER :: B5ADOF78V = 1551 + INTEGER(IntKi), PARAMETER :: B5ADOF79V = 1552 + INTEGER(IntKi), PARAMETER :: B5ADOF80V = 1553 + INTEGER(IntKi), PARAMETER :: B5ADOF81V = 1554 + INTEGER(IntKi), PARAMETER :: B5ADOF82V = 1555 + INTEGER(IntKi), PARAMETER :: B5ADOF83V = 1556 + INTEGER(IntKi), PARAMETER :: B5ADOF84V = 1557 + INTEGER(IntKi), PARAMETER :: B5ADOF85V = 1558 + INTEGER(IntKi), PARAMETER :: B5ADOF86V = 1559 + INTEGER(IntKi), PARAMETER :: B5ADOF87V = 1560 + INTEGER(IntKi), PARAMETER :: B5ADOF88V = 1561 + INTEGER(IntKi), PARAMETER :: B5ADOF89V = 1562 + INTEGER(IntKi), PARAMETER :: B5ADOF90V = 1563 + INTEGER(IntKi), PARAMETER :: B5ADOF91V = 1564 + INTEGER(IntKi), PARAMETER :: B5ADOF92V = 1565 + INTEGER(IntKi), PARAMETER :: B5ADOF93V = 1566 + INTEGER(IntKi), PARAMETER :: B5ADOF94V = 1567 + INTEGER(IntKi), PARAMETER :: B5ADOF95V = 1568 + INTEGER(IntKi), PARAMETER :: B5ADOF96V = 1569 + INTEGER(IntKi), PARAMETER :: B5ADOF97V = 1570 + INTEGER(IntKi), PARAMETER :: B5ADOF98V = 1571 + INTEGER(IntKi), PARAMETER :: B5ADOF99V = 1572 + INTEGER(IntKi), PARAMETER :: B6ADOF1V = 1573 + INTEGER(IntKi), PARAMETER :: B6ADOF2V = 1574 + INTEGER(IntKi), PARAMETER :: B6ADOF3V = 1575 + INTEGER(IntKi), PARAMETER :: B6ADOF4V = 1576 + INTEGER(IntKi), PARAMETER :: B6ADOF5V = 1577 + INTEGER(IntKi), PARAMETER :: B6ADOF6V = 1578 + INTEGER(IntKi), PARAMETER :: B6ADOF7V = 1579 + INTEGER(IntKi), PARAMETER :: B6ADOF8V = 1580 + INTEGER(IntKi), PARAMETER :: B6ADOF9V = 1581 + INTEGER(IntKi), PARAMETER :: B6ADOF10V = 1582 + INTEGER(IntKi), PARAMETER :: B6ADOF11V = 1583 + INTEGER(IntKi), PARAMETER :: B6ADOF12V = 1584 + INTEGER(IntKi), PARAMETER :: B6ADOF13V = 1585 + INTEGER(IntKi), PARAMETER :: B6ADOF14V = 1586 + INTEGER(IntKi), PARAMETER :: B6ADOF15V = 1587 + INTEGER(IntKi), PARAMETER :: B6ADOF16V = 1588 + INTEGER(IntKi), PARAMETER :: B6ADOF17V = 1589 + INTEGER(IntKi), PARAMETER :: B6ADOF18V = 1590 + INTEGER(IntKi), PARAMETER :: B6ADOF19V = 1591 + INTEGER(IntKi), PARAMETER :: B6ADOF20V = 1592 + INTEGER(IntKi), PARAMETER :: B6ADOF21V = 1593 + INTEGER(IntKi), PARAMETER :: B6ADOF22V = 1594 + INTEGER(IntKi), PARAMETER :: B6ADOF23V = 1595 + INTEGER(IntKi), PARAMETER :: B6ADOF24V = 1596 + INTEGER(IntKi), PARAMETER :: B6ADOF25V = 1597 + INTEGER(IntKi), PARAMETER :: B6ADOF26V = 1598 + INTEGER(IntKi), PARAMETER :: B6ADOF27V = 1599 + INTEGER(IntKi), PARAMETER :: B6ADOF28V = 1600 + INTEGER(IntKi), PARAMETER :: B6ADOF29V = 1601 + INTEGER(IntKi), PARAMETER :: B6ADOF30V = 1602 + INTEGER(IntKi), PARAMETER :: B6ADOF31V = 1603 + INTEGER(IntKi), PARAMETER :: B6ADOF32V = 1604 + INTEGER(IntKi), PARAMETER :: B6ADOF33V = 1605 + INTEGER(IntKi), PARAMETER :: B6ADOF34V = 1606 + INTEGER(IntKi), PARAMETER :: B6ADOF35V = 1607 + INTEGER(IntKi), PARAMETER :: B6ADOF36V = 1608 + INTEGER(IntKi), PARAMETER :: B6ADOF37V = 1609 + INTEGER(IntKi), PARAMETER :: B6ADOF38V = 1610 + INTEGER(IntKi), PARAMETER :: B6ADOF39V = 1611 + INTEGER(IntKi), PARAMETER :: B6ADOF40V = 1612 + INTEGER(IntKi), PARAMETER :: B6ADOF41V = 1613 + INTEGER(IntKi), PARAMETER :: B6ADOF42V = 1614 + INTEGER(IntKi), PARAMETER :: B6ADOF43V = 1615 + INTEGER(IntKi), PARAMETER :: B6ADOF44V = 1616 + INTEGER(IntKi), PARAMETER :: B6ADOF45V = 1617 + INTEGER(IntKi), PARAMETER :: B6ADOF46V = 1618 + INTEGER(IntKi), PARAMETER :: B6ADOF47V = 1619 + INTEGER(IntKi), PARAMETER :: B6ADOF48V = 1620 + INTEGER(IntKi), PARAMETER :: B6ADOF49V = 1621 + INTEGER(IntKi), PARAMETER :: B6ADOF50V = 1622 + INTEGER(IntKi), PARAMETER :: B6ADOF51V = 1623 + INTEGER(IntKi), PARAMETER :: B6ADOF52V = 1624 + INTEGER(IntKi), PARAMETER :: B6ADOF53V = 1625 + INTEGER(IntKi), PARAMETER :: B6ADOF54V = 1626 + INTEGER(IntKi), PARAMETER :: B6ADOF55V = 1627 + INTEGER(IntKi), PARAMETER :: B6ADOF56V = 1628 + INTEGER(IntKi), PARAMETER :: B6ADOF57V = 1629 + INTEGER(IntKi), PARAMETER :: B6ADOF58V = 1630 + INTEGER(IntKi), PARAMETER :: B6ADOF59V = 1631 + INTEGER(IntKi), PARAMETER :: B6ADOF60V = 1632 + INTEGER(IntKi), PARAMETER :: B6ADOF61V = 1633 + INTEGER(IntKi), PARAMETER :: B6ADOF62V = 1634 + INTEGER(IntKi), PARAMETER :: B6ADOF63V = 1635 + INTEGER(IntKi), PARAMETER :: B6ADOF64V = 1636 + INTEGER(IntKi), PARAMETER :: B6ADOF65V = 1637 + INTEGER(IntKi), PARAMETER :: B6ADOF66V = 1638 + INTEGER(IntKi), PARAMETER :: B6ADOF67V = 1639 + INTEGER(IntKi), PARAMETER :: B6ADOF68V = 1640 + INTEGER(IntKi), PARAMETER :: B6ADOF69V = 1641 + INTEGER(IntKi), PARAMETER :: B6ADOF70V = 1642 + INTEGER(IntKi), PARAMETER :: B6ADOF71V = 1643 + INTEGER(IntKi), PARAMETER :: B6ADOF72V = 1644 + INTEGER(IntKi), PARAMETER :: B6ADOF73V = 1645 + INTEGER(IntKi), PARAMETER :: B6ADOF74V = 1646 + INTEGER(IntKi), PARAMETER :: B6ADOF75V = 1647 + INTEGER(IntKi), PARAMETER :: B6ADOF76V = 1648 + INTEGER(IntKi), PARAMETER :: B6ADOF77V = 1649 + INTEGER(IntKi), PARAMETER :: B6ADOF78V = 1650 + INTEGER(IntKi), PARAMETER :: B6ADOF79V = 1651 + INTEGER(IntKi), PARAMETER :: B6ADOF80V = 1652 + INTEGER(IntKi), PARAMETER :: B6ADOF81V = 1653 + INTEGER(IntKi), PARAMETER :: B6ADOF82V = 1654 + INTEGER(IntKi), PARAMETER :: B6ADOF83V = 1655 + INTEGER(IntKi), PARAMETER :: B6ADOF84V = 1656 + INTEGER(IntKi), PARAMETER :: B6ADOF85V = 1657 + INTEGER(IntKi), PARAMETER :: B6ADOF86V = 1658 + INTEGER(IntKi), PARAMETER :: B6ADOF87V = 1659 + INTEGER(IntKi), PARAMETER :: B6ADOF88V = 1660 + INTEGER(IntKi), PARAMETER :: B6ADOF89V = 1661 + INTEGER(IntKi), PARAMETER :: B6ADOF90V = 1662 + INTEGER(IntKi), PARAMETER :: B6ADOF91V = 1663 + INTEGER(IntKi), PARAMETER :: B6ADOF92V = 1664 + INTEGER(IntKi), PARAMETER :: B6ADOF93V = 1665 + INTEGER(IntKi), PARAMETER :: B6ADOF94V = 1666 + INTEGER(IntKi), PARAMETER :: B6ADOF95V = 1667 + INTEGER(IntKi), PARAMETER :: B6ADOF96V = 1668 + INTEGER(IntKi), PARAMETER :: B6ADOF97V = 1669 + INTEGER(IntKi), PARAMETER :: B6ADOF98V = 1670 + INTEGER(IntKi), PARAMETER :: B6ADOF99V = 1671 + INTEGER(IntKi), PARAMETER :: B7ADOF1V = 1672 + INTEGER(IntKi), PARAMETER :: B7ADOF2V = 1673 + INTEGER(IntKi), PARAMETER :: B7ADOF3V = 1674 + INTEGER(IntKi), PARAMETER :: B7ADOF4V = 1675 + INTEGER(IntKi), PARAMETER :: B7ADOF5V = 1676 + INTEGER(IntKi), PARAMETER :: B7ADOF6V = 1677 + INTEGER(IntKi), PARAMETER :: B7ADOF7V = 1678 + INTEGER(IntKi), PARAMETER :: B7ADOF8V = 1679 + INTEGER(IntKi), PARAMETER :: B7ADOF9V = 1680 + INTEGER(IntKi), PARAMETER :: B7ADOF10V = 1681 + INTEGER(IntKi), PARAMETER :: B7ADOF11V = 1682 + INTEGER(IntKi), PARAMETER :: B7ADOF12V = 1683 + INTEGER(IntKi), PARAMETER :: B7ADOF13V = 1684 + INTEGER(IntKi), PARAMETER :: B7ADOF14V = 1685 + INTEGER(IntKi), PARAMETER :: B7ADOF15V = 1686 + INTEGER(IntKi), PARAMETER :: B7ADOF16V = 1687 + INTEGER(IntKi), PARAMETER :: B7ADOF17V = 1688 + INTEGER(IntKi), PARAMETER :: B7ADOF18V = 1689 + INTEGER(IntKi), PARAMETER :: B7ADOF19V = 1690 + INTEGER(IntKi), PARAMETER :: B7ADOF20V = 1691 + INTEGER(IntKi), PARAMETER :: B7ADOF21V = 1692 + INTEGER(IntKi), PARAMETER :: B7ADOF22V = 1693 + INTEGER(IntKi), PARAMETER :: B7ADOF23V = 1694 + INTEGER(IntKi), PARAMETER :: B7ADOF24V = 1695 + INTEGER(IntKi), PARAMETER :: B7ADOF25V = 1696 + INTEGER(IntKi), PARAMETER :: B7ADOF26V = 1697 + INTEGER(IntKi), PARAMETER :: B7ADOF27V = 1698 + INTEGER(IntKi), PARAMETER :: B7ADOF28V = 1699 + INTEGER(IntKi), PARAMETER :: B7ADOF29V = 1700 + INTEGER(IntKi), PARAMETER :: B7ADOF30V = 1701 + INTEGER(IntKi), PARAMETER :: B7ADOF31V = 1702 + INTEGER(IntKi), PARAMETER :: B7ADOF32V = 1703 + INTEGER(IntKi), PARAMETER :: B7ADOF33V = 1704 + INTEGER(IntKi), PARAMETER :: B7ADOF34V = 1705 + INTEGER(IntKi), PARAMETER :: B7ADOF35V = 1706 + INTEGER(IntKi), PARAMETER :: B7ADOF36V = 1707 + INTEGER(IntKi), PARAMETER :: B7ADOF37V = 1708 + INTEGER(IntKi), PARAMETER :: B7ADOF38V = 1709 + INTEGER(IntKi), PARAMETER :: B7ADOF39V = 1710 + INTEGER(IntKi), PARAMETER :: B7ADOF40V = 1711 + INTEGER(IntKi), PARAMETER :: B7ADOF41V = 1712 + INTEGER(IntKi), PARAMETER :: B7ADOF42V = 1713 + INTEGER(IntKi), PARAMETER :: B7ADOF43V = 1714 + INTEGER(IntKi), PARAMETER :: B7ADOF44V = 1715 + INTEGER(IntKi), PARAMETER :: B7ADOF45V = 1716 + INTEGER(IntKi), PARAMETER :: B7ADOF46V = 1717 + INTEGER(IntKi), PARAMETER :: B7ADOF47V = 1718 + INTEGER(IntKi), PARAMETER :: B7ADOF48V = 1719 + INTEGER(IntKi), PARAMETER :: B7ADOF49V = 1720 + INTEGER(IntKi), PARAMETER :: B7ADOF50V = 1721 + INTEGER(IntKi), PARAMETER :: B7ADOF51V = 1722 + INTEGER(IntKi), PARAMETER :: B7ADOF52V = 1723 + INTEGER(IntKi), PARAMETER :: B7ADOF53V = 1724 + INTEGER(IntKi), PARAMETER :: B7ADOF54V = 1725 + INTEGER(IntKi), PARAMETER :: B7ADOF55V = 1726 + INTEGER(IntKi), PARAMETER :: B7ADOF56V = 1727 + INTEGER(IntKi), PARAMETER :: B7ADOF57V = 1728 + INTEGER(IntKi), PARAMETER :: B7ADOF58V = 1729 + INTEGER(IntKi), PARAMETER :: B7ADOF59V = 1730 + INTEGER(IntKi), PARAMETER :: B7ADOF60V = 1731 + INTEGER(IntKi), PARAMETER :: B7ADOF61V = 1732 + INTEGER(IntKi), PARAMETER :: B7ADOF62V = 1733 + INTEGER(IntKi), PARAMETER :: B7ADOF63V = 1734 + INTEGER(IntKi), PARAMETER :: B7ADOF64V = 1735 + INTEGER(IntKi), PARAMETER :: B7ADOF65V = 1736 + INTEGER(IntKi), PARAMETER :: B7ADOF66V = 1737 + INTEGER(IntKi), PARAMETER :: B7ADOF67V = 1738 + INTEGER(IntKi), PARAMETER :: B7ADOF68V = 1739 + INTEGER(IntKi), PARAMETER :: B7ADOF69V = 1740 + INTEGER(IntKi), PARAMETER :: B7ADOF70V = 1741 + INTEGER(IntKi), PARAMETER :: B7ADOF71V = 1742 + INTEGER(IntKi), PARAMETER :: B7ADOF72V = 1743 + INTEGER(IntKi), PARAMETER :: B7ADOF73V = 1744 + INTEGER(IntKi), PARAMETER :: B7ADOF74V = 1745 + INTEGER(IntKi), PARAMETER :: B7ADOF75V = 1746 + INTEGER(IntKi), PARAMETER :: B7ADOF76V = 1747 + INTEGER(IntKi), PARAMETER :: B7ADOF77V = 1748 + INTEGER(IntKi), PARAMETER :: B7ADOF78V = 1749 + INTEGER(IntKi), PARAMETER :: B7ADOF79V = 1750 + INTEGER(IntKi), PARAMETER :: B7ADOF80V = 1751 + INTEGER(IntKi), PARAMETER :: B7ADOF81V = 1752 + INTEGER(IntKi), PARAMETER :: B7ADOF82V = 1753 + INTEGER(IntKi), PARAMETER :: B7ADOF83V = 1754 + INTEGER(IntKi), PARAMETER :: B7ADOF84V = 1755 + INTEGER(IntKi), PARAMETER :: B7ADOF85V = 1756 + INTEGER(IntKi), PARAMETER :: B7ADOF86V = 1757 + INTEGER(IntKi), PARAMETER :: B7ADOF87V = 1758 + INTEGER(IntKi), PARAMETER :: B7ADOF88V = 1759 + INTEGER(IntKi), PARAMETER :: B7ADOF89V = 1760 + INTEGER(IntKi), PARAMETER :: B7ADOF90V = 1761 + INTEGER(IntKi), PARAMETER :: B7ADOF91V = 1762 + INTEGER(IntKi), PARAMETER :: B7ADOF92V = 1763 + INTEGER(IntKi), PARAMETER :: B7ADOF93V = 1764 + INTEGER(IntKi), PARAMETER :: B7ADOF94V = 1765 + INTEGER(IntKi), PARAMETER :: B7ADOF95V = 1766 + INTEGER(IntKi), PARAMETER :: B7ADOF96V = 1767 + INTEGER(IntKi), PARAMETER :: B7ADOF97V = 1768 + INTEGER(IntKi), PARAMETER :: B7ADOF98V = 1769 + INTEGER(IntKi), PARAMETER :: B7ADOF99V = 1770 + INTEGER(IntKi), PARAMETER :: B8ADOF1V = 1771 + INTEGER(IntKi), PARAMETER :: B8ADOF2V = 1772 + INTEGER(IntKi), PARAMETER :: B8ADOF3V = 1773 + INTEGER(IntKi), PARAMETER :: B8ADOF4V = 1774 + INTEGER(IntKi), PARAMETER :: B8ADOF5V = 1775 + INTEGER(IntKi), PARAMETER :: B8ADOF6V = 1776 + INTEGER(IntKi), PARAMETER :: B8ADOF7V = 1777 + INTEGER(IntKi), PARAMETER :: B8ADOF8V = 1778 + INTEGER(IntKi), PARAMETER :: B8ADOF9V = 1779 + INTEGER(IntKi), PARAMETER :: B8ADOF10V = 1780 + INTEGER(IntKi), PARAMETER :: B8ADOF11V = 1781 + INTEGER(IntKi), PARAMETER :: B8ADOF12V = 1782 + INTEGER(IntKi), PARAMETER :: B8ADOF13V = 1783 + INTEGER(IntKi), PARAMETER :: B8ADOF14V = 1784 + INTEGER(IntKi), PARAMETER :: B8ADOF15V = 1785 + INTEGER(IntKi), PARAMETER :: B8ADOF16V = 1786 + INTEGER(IntKi), PARAMETER :: B8ADOF17V = 1787 + INTEGER(IntKi), PARAMETER :: B8ADOF18V = 1788 + INTEGER(IntKi), PARAMETER :: B8ADOF19V = 1789 + INTEGER(IntKi), PARAMETER :: B8ADOF20V = 1790 + INTEGER(IntKi), PARAMETER :: B8ADOF21V = 1791 + INTEGER(IntKi), PARAMETER :: B8ADOF22V = 1792 + INTEGER(IntKi), PARAMETER :: B8ADOF23V = 1793 + INTEGER(IntKi), PARAMETER :: B8ADOF24V = 1794 + INTEGER(IntKi), PARAMETER :: B8ADOF25V = 1795 + INTEGER(IntKi), PARAMETER :: B8ADOF26V = 1796 + INTEGER(IntKi), PARAMETER :: B8ADOF27V = 1797 + INTEGER(IntKi), PARAMETER :: B8ADOF28V = 1798 + INTEGER(IntKi), PARAMETER :: B8ADOF29V = 1799 + INTEGER(IntKi), PARAMETER :: B8ADOF30V = 1800 + INTEGER(IntKi), PARAMETER :: B8ADOF31V = 1801 + INTEGER(IntKi), PARAMETER :: B8ADOF32V = 1802 + INTEGER(IntKi), PARAMETER :: B8ADOF33V = 1803 + INTEGER(IntKi), PARAMETER :: B8ADOF34V = 1804 + INTEGER(IntKi), PARAMETER :: B8ADOF35V = 1805 + INTEGER(IntKi), PARAMETER :: B8ADOF36V = 1806 + INTEGER(IntKi), PARAMETER :: B8ADOF37V = 1807 + INTEGER(IntKi), PARAMETER :: B8ADOF38V = 1808 + INTEGER(IntKi), PARAMETER :: B8ADOF39V = 1809 + INTEGER(IntKi), PARAMETER :: B8ADOF40V = 1810 + INTEGER(IntKi), PARAMETER :: B8ADOF41V = 1811 + INTEGER(IntKi), PARAMETER :: B8ADOF42V = 1812 + INTEGER(IntKi), PARAMETER :: B8ADOF43V = 1813 + INTEGER(IntKi), PARAMETER :: B8ADOF44V = 1814 + INTEGER(IntKi), PARAMETER :: B8ADOF45V = 1815 + INTEGER(IntKi), PARAMETER :: B8ADOF46V = 1816 + INTEGER(IntKi), PARAMETER :: B8ADOF47V = 1817 + INTEGER(IntKi), PARAMETER :: B8ADOF48V = 1818 + INTEGER(IntKi), PARAMETER :: B8ADOF49V = 1819 + INTEGER(IntKi), PARAMETER :: B8ADOF50V = 1820 + INTEGER(IntKi), PARAMETER :: B8ADOF51V = 1821 + INTEGER(IntKi), PARAMETER :: B8ADOF52V = 1822 + INTEGER(IntKi), PARAMETER :: B8ADOF53V = 1823 + INTEGER(IntKi), PARAMETER :: B8ADOF54V = 1824 + INTEGER(IntKi), PARAMETER :: B8ADOF55V = 1825 + INTEGER(IntKi), PARAMETER :: B8ADOF56V = 1826 + INTEGER(IntKi), PARAMETER :: B8ADOF57V = 1827 + INTEGER(IntKi), PARAMETER :: B8ADOF58V = 1828 + INTEGER(IntKi), PARAMETER :: B8ADOF59V = 1829 + INTEGER(IntKi), PARAMETER :: B8ADOF60V = 1830 + INTEGER(IntKi), PARAMETER :: B8ADOF61V = 1831 + INTEGER(IntKi), PARAMETER :: B8ADOF62V = 1832 + INTEGER(IntKi), PARAMETER :: B8ADOF63V = 1833 + INTEGER(IntKi), PARAMETER :: B8ADOF64V = 1834 + INTEGER(IntKi), PARAMETER :: B8ADOF65V = 1835 + INTEGER(IntKi), PARAMETER :: B8ADOF66V = 1836 + INTEGER(IntKi), PARAMETER :: B8ADOF67V = 1837 + INTEGER(IntKi), PARAMETER :: B8ADOF68V = 1838 + INTEGER(IntKi), PARAMETER :: B8ADOF69V = 1839 + INTEGER(IntKi), PARAMETER :: B8ADOF70V = 1840 + INTEGER(IntKi), PARAMETER :: B8ADOF71V = 1841 + INTEGER(IntKi), PARAMETER :: B8ADOF72V = 1842 + INTEGER(IntKi), PARAMETER :: B8ADOF73V = 1843 + INTEGER(IntKi), PARAMETER :: B8ADOF74V = 1844 + INTEGER(IntKi), PARAMETER :: B8ADOF75V = 1845 + INTEGER(IntKi), PARAMETER :: B8ADOF76V = 1846 + INTEGER(IntKi), PARAMETER :: B8ADOF77V = 1847 + INTEGER(IntKi), PARAMETER :: B8ADOF78V = 1848 + INTEGER(IntKi), PARAMETER :: B8ADOF79V = 1849 + INTEGER(IntKi), PARAMETER :: B8ADOF80V = 1850 + INTEGER(IntKi), PARAMETER :: B8ADOF81V = 1851 + INTEGER(IntKi), PARAMETER :: B8ADOF82V = 1852 + INTEGER(IntKi), PARAMETER :: B8ADOF83V = 1853 + INTEGER(IntKi), PARAMETER :: B8ADOF84V = 1854 + INTEGER(IntKi), PARAMETER :: B8ADOF85V = 1855 + INTEGER(IntKi), PARAMETER :: B8ADOF86V = 1856 + INTEGER(IntKi), PARAMETER :: B8ADOF87V = 1857 + INTEGER(IntKi), PARAMETER :: B8ADOF88V = 1858 + INTEGER(IntKi), PARAMETER :: B8ADOF89V = 1859 + INTEGER(IntKi), PARAMETER :: B8ADOF90V = 1860 + INTEGER(IntKi), PARAMETER :: B8ADOF91V = 1861 + INTEGER(IntKi), PARAMETER :: B8ADOF92V = 1862 + INTEGER(IntKi), PARAMETER :: B8ADOF93V = 1863 + INTEGER(IntKi), PARAMETER :: B8ADOF94V = 1864 + INTEGER(IntKi), PARAMETER :: B8ADOF95V = 1865 + INTEGER(IntKi), PARAMETER :: B8ADOF96V = 1866 + INTEGER(IntKi), PARAMETER :: B8ADOF97V = 1867 + INTEGER(IntKi), PARAMETER :: B8ADOF98V = 1868 + INTEGER(IntKi), PARAMETER :: B8ADOF99V = 1869 + INTEGER(IntKi), PARAMETER :: B9ADOF1V = 1870 + INTEGER(IntKi), PARAMETER :: B9ADOF2V = 1871 + INTEGER(IntKi), PARAMETER :: B9ADOF3V = 1872 + INTEGER(IntKi), PARAMETER :: B9ADOF4V = 1873 + INTEGER(IntKi), PARAMETER :: B9ADOF5V = 1874 + INTEGER(IntKi), PARAMETER :: B9ADOF6V = 1875 + INTEGER(IntKi), PARAMETER :: B9ADOF7V = 1876 + INTEGER(IntKi), PARAMETER :: B9ADOF8V = 1877 + INTEGER(IntKi), PARAMETER :: B9ADOF9V = 1878 + INTEGER(IntKi), PARAMETER :: B9ADOF10V = 1879 + INTEGER(IntKi), PARAMETER :: B9ADOF11V = 1880 + INTEGER(IntKi), PARAMETER :: B9ADOF12V = 1881 + INTEGER(IntKi), PARAMETER :: B9ADOF13V = 1882 + INTEGER(IntKi), PARAMETER :: B9ADOF14V = 1883 + INTEGER(IntKi), PARAMETER :: B9ADOF15V = 1884 + INTEGER(IntKi), PARAMETER :: B9ADOF16V = 1885 + INTEGER(IntKi), PARAMETER :: B9ADOF17V = 1886 + INTEGER(IntKi), PARAMETER :: B9ADOF18V = 1887 + INTEGER(IntKi), PARAMETER :: B9ADOF19V = 1888 + INTEGER(IntKi), PARAMETER :: B9ADOF20V = 1889 + INTEGER(IntKi), PARAMETER :: B9ADOF21V = 1890 + INTEGER(IntKi), PARAMETER :: B9ADOF22V = 1891 + INTEGER(IntKi), PARAMETER :: B9ADOF23V = 1892 + INTEGER(IntKi), PARAMETER :: B9ADOF24V = 1893 + INTEGER(IntKi), PARAMETER :: B9ADOF25V = 1894 + INTEGER(IntKi), PARAMETER :: B9ADOF26V = 1895 + INTEGER(IntKi), PARAMETER :: B9ADOF27V = 1896 + INTEGER(IntKi), PARAMETER :: B9ADOF28V = 1897 + INTEGER(IntKi), PARAMETER :: B9ADOF29V = 1898 + INTEGER(IntKi), PARAMETER :: B9ADOF30V = 1899 + INTEGER(IntKi), PARAMETER :: B9ADOF31V = 1900 + INTEGER(IntKi), PARAMETER :: B9ADOF32V = 1901 + INTEGER(IntKi), PARAMETER :: B9ADOF33V = 1902 + INTEGER(IntKi), PARAMETER :: B9ADOF34V = 1903 + INTEGER(IntKi), PARAMETER :: B9ADOF35V = 1904 + INTEGER(IntKi), PARAMETER :: B9ADOF36V = 1905 + INTEGER(IntKi), PARAMETER :: B9ADOF37V = 1906 + INTEGER(IntKi), PARAMETER :: B9ADOF38V = 1907 + INTEGER(IntKi), PARAMETER :: B9ADOF39V = 1908 + INTEGER(IntKi), PARAMETER :: B9ADOF40V = 1909 + INTEGER(IntKi), PARAMETER :: B9ADOF41V = 1910 + INTEGER(IntKi), PARAMETER :: B9ADOF42V = 1911 + INTEGER(IntKi), PARAMETER :: B9ADOF43V = 1912 + INTEGER(IntKi), PARAMETER :: B9ADOF44V = 1913 + INTEGER(IntKi), PARAMETER :: B9ADOF45V = 1914 + INTEGER(IntKi), PARAMETER :: B9ADOF46V = 1915 + INTEGER(IntKi), PARAMETER :: B9ADOF47V = 1916 + INTEGER(IntKi), PARAMETER :: B9ADOF48V = 1917 + INTEGER(IntKi), PARAMETER :: B9ADOF49V = 1918 + INTEGER(IntKi), PARAMETER :: B9ADOF50V = 1919 + INTEGER(IntKi), PARAMETER :: B9ADOF51V = 1920 + INTEGER(IntKi), PARAMETER :: B9ADOF52V = 1921 + INTEGER(IntKi), PARAMETER :: B9ADOF53V = 1922 + INTEGER(IntKi), PARAMETER :: B9ADOF54V = 1923 + INTEGER(IntKi), PARAMETER :: B9ADOF55V = 1924 + INTEGER(IntKi), PARAMETER :: B9ADOF56V = 1925 + INTEGER(IntKi), PARAMETER :: B9ADOF57V = 1926 + INTEGER(IntKi), PARAMETER :: B9ADOF58V = 1927 + INTEGER(IntKi), PARAMETER :: B9ADOF59V = 1928 + INTEGER(IntKi), PARAMETER :: B9ADOF60V = 1929 + INTEGER(IntKi), PARAMETER :: B9ADOF61V = 1930 + INTEGER(IntKi), PARAMETER :: B9ADOF62V = 1931 + INTEGER(IntKi), PARAMETER :: B9ADOF63V = 1932 + INTEGER(IntKi), PARAMETER :: B9ADOF64V = 1933 + INTEGER(IntKi), PARAMETER :: B9ADOF65V = 1934 + INTEGER(IntKi), PARAMETER :: B9ADOF66V = 1935 + INTEGER(IntKi), PARAMETER :: B9ADOF67V = 1936 + INTEGER(IntKi), PARAMETER :: B9ADOF68V = 1937 + INTEGER(IntKi), PARAMETER :: B9ADOF69V = 1938 + INTEGER(IntKi), PARAMETER :: B9ADOF70V = 1939 + INTEGER(IntKi), PARAMETER :: B9ADOF71V = 1940 + INTEGER(IntKi), PARAMETER :: B9ADOF72V = 1941 + INTEGER(IntKi), PARAMETER :: B9ADOF73V = 1942 + INTEGER(IntKi), PARAMETER :: B9ADOF74V = 1943 + INTEGER(IntKi), PARAMETER :: B9ADOF75V = 1944 + INTEGER(IntKi), PARAMETER :: B9ADOF76V = 1945 + INTEGER(IntKi), PARAMETER :: B9ADOF77V = 1946 + INTEGER(IntKi), PARAMETER :: B9ADOF78V = 1947 + INTEGER(IntKi), PARAMETER :: B9ADOF79V = 1948 + INTEGER(IntKi), PARAMETER :: B9ADOF80V = 1949 + INTEGER(IntKi), PARAMETER :: B9ADOF81V = 1950 + INTEGER(IntKi), PARAMETER :: B9ADOF82V = 1951 + INTEGER(IntKi), PARAMETER :: B9ADOF83V = 1952 + INTEGER(IntKi), PARAMETER :: B9ADOF84V = 1953 + INTEGER(IntKi), PARAMETER :: B9ADOF85V = 1954 + INTEGER(IntKi), PARAMETER :: B9ADOF86V = 1955 + INTEGER(IntKi), PARAMETER :: B9ADOF87V = 1956 + INTEGER(IntKi), PARAMETER :: B9ADOF88V = 1957 + INTEGER(IntKi), PARAMETER :: B9ADOF89V = 1958 + INTEGER(IntKi), PARAMETER :: B9ADOF90V = 1959 + INTEGER(IntKi), PARAMETER :: B9ADOF91V = 1960 + INTEGER(IntKi), PARAMETER :: B9ADOF92V = 1961 + INTEGER(IntKi), PARAMETER :: B9ADOF93V = 1962 + INTEGER(IntKi), PARAMETER :: B9ADOF94V = 1963 + INTEGER(IntKi), PARAMETER :: B9ADOF95V = 1964 + INTEGER(IntKi), PARAMETER :: B9ADOF96V = 1965 + INTEGER(IntKi), PARAMETER :: B9ADOF97V = 1966 + INTEGER(IntKi), PARAMETER :: B9ADOF98V = 1967 + INTEGER(IntKi), PARAMETER :: B9ADOF99V = 1968 + INTEGER(IntKi), PARAMETER :: B1ADOF1A = 1969 + INTEGER(IntKi), PARAMETER :: B1ADOF2A = 1970 + INTEGER(IntKi), PARAMETER :: B1ADOF3A = 1971 + INTEGER(IntKi), PARAMETER :: B1ADOF4A = 1972 + INTEGER(IntKi), PARAMETER :: B1ADOF5A = 1973 + INTEGER(IntKi), PARAMETER :: B1ADOF6A = 1974 + INTEGER(IntKi), PARAMETER :: B1ADOF7A = 1975 + INTEGER(IntKi), PARAMETER :: B1ADOF8A = 1976 + INTEGER(IntKi), PARAMETER :: B1ADOF9A = 1977 + INTEGER(IntKi), PARAMETER :: B1ADOF10A = 1978 + INTEGER(IntKi), PARAMETER :: B1ADOF11A = 1979 + INTEGER(IntKi), PARAMETER :: B1ADOF12A = 1980 + INTEGER(IntKi), PARAMETER :: B1ADOF13A = 1981 + INTEGER(IntKi), PARAMETER :: B1ADOF14A = 1982 + INTEGER(IntKi), PARAMETER :: B1ADOF15A = 1983 + INTEGER(IntKi), PARAMETER :: B1ADOF16A = 1984 + INTEGER(IntKi), PARAMETER :: B1ADOF17A = 1985 + INTEGER(IntKi), PARAMETER :: B1ADOF18A = 1986 + INTEGER(IntKi), PARAMETER :: B1ADOF19A = 1987 + INTEGER(IntKi), PARAMETER :: B1ADOF20A = 1988 + INTEGER(IntKi), PARAMETER :: B1ADOF21A = 1989 + INTEGER(IntKi), PARAMETER :: B1ADOF22A = 1990 + INTEGER(IntKi), PARAMETER :: B1ADOF23A = 1991 + INTEGER(IntKi), PARAMETER :: B1ADOF24A = 1992 + INTEGER(IntKi), PARAMETER :: B1ADOF25A = 1993 + INTEGER(IntKi), PARAMETER :: B1ADOF26A = 1994 + INTEGER(IntKi), PARAMETER :: B1ADOF27A = 1995 + INTEGER(IntKi), PARAMETER :: B1ADOF28A = 1996 + INTEGER(IntKi), PARAMETER :: B1ADOF29A = 1997 + INTEGER(IntKi), PARAMETER :: B1ADOF30A = 1998 + INTEGER(IntKi), PARAMETER :: B1ADOF31A = 1999 + INTEGER(IntKi), PARAMETER :: B1ADOF32A = 2000 + INTEGER(IntKi), PARAMETER :: B1ADOF33A = 2001 + INTEGER(IntKi), PARAMETER :: B1ADOF34A = 2002 + INTEGER(IntKi), PARAMETER :: B1ADOF35A = 2003 + INTEGER(IntKi), PARAMETER :: B1ADOF36A = 2004 + INTEGER(IntKi), PARAMETER :: B1ADOF37A = 2005 + INTEGER(IntKi), PARAMETER :: B1ADOF38A = 2006 + INTEGER(IntKi), PARAMETER :: B1ADOF39A = 2007 + INTEGER(IntKi), PARAMETER :: B1ADOF40A = 2008 + INTEGER(IntKi), PARAMETER :: B1ADOF41A = 2009 + INTEGER(IntKi), PARAMETER :: B1ADOF42A = 2010 + INTEGER(IntKi), PARAMETER :: B1ADOF43A = 2011 + INTEGER(IntKi), PARAMETER :: B1ADOF44A = 2012 + INTEGER(IntKi), PARAMETER :: B1ADOF45A = 2013 + INTEGER(IntKi), PARAMETER :: B1ADOF46A = 2014 + INTEGER(IntKi), PARAMETER :: B1ADOF47A = 2015 + INTEGER(IntKi), PARAMETER :: B1ADOF48A = 2016 + INTEGER(IntKi), PARAMETER :: B1ADOF49A = 2017 + INTEGER(IntKi), PARAMETER :: B1ADOF50A = 2018 + INTEGER(IntKi), PARAMETER :: B1ADOF51A = 2019 + INTEGER(IntKi), PARAMETER :: B1ADOF52A = 2020 + INTEGER(IntKi), PARAMETER :: B1ADOF53A = 2021 + INTEGER(IntKi), PARAMETER :: B1ADOF54A = 2022 + INTEGER(IntKi), PARAMETER :: B1ADOF55A = 2023 + INTEGER(IntKi), PARAMETER :: B1ADOF56A = 2024 + INTEGER(IntKi), PARAMETER :: B1ADOF57A = 2025 + INTEGER(IntKi), PARAMETER :: B1ADOF58A = 2026 + INTEGER(IntKi), PARAMETER :: B1ADOF59A = 2027 + INTEGER(IntKi), PARAMETER :: B1ADOF60A = 2028 + INTEGER(IntKi), PARAMETER :: B1ADOF61A = 2029 + INTEGER(IntKi), PARAMETER :: B1ADOF62A = 2030 + INTEGER(IntKi), PARAMETER :: B1ADOF63A = 2031 + INTEGER(IntKi), PARAMETER :: B1ADOF64A = 2032 + INTEGER(IntKi), PARAMETER :: B1ADOF65A = 2033 + INTEGER(IntKi), PARAMETER :: B1ADOF66A = 2034 + INTEGER(IntKi), PARAMETER :: B1ADOF67A = 2035 + INTEGER(IntKi), PARAMETER :: B1ADOF68A = 2036 + INTEGER(IntKi), PARAMETER :: B1ADOF69A = 2037 + INTEGER(IntKi), PARAMETER :: B1ADOF70A = 2038 + INTEGER(IntKi), PARAMETER :: B1ADOF71A = 2039 + INTEGER(IntKi), PARAMETER :: B1ADOF72A = 2040 + INTEGER(IntKi), PARAMETER :: B1ADOF73A = 2041 + INTEGER(IntKi), PARAMETER :: B1ADOF74A = 2042 + INTEGER(IntKi), PARAMETER :: B1ADOF75A = 2043 + INTEGER(IntKi), PARAMETER :: B1ADOF76A = 2044 + INTEGER(IntKi), PARAMETER :: B1ADOF77A = 2045 + INTEGER(IntKi), PARAMETER :: B1ADOF78A = 2046 + INTEGER(IntKi), PARAMETER :: B1ADOF79A = 2047 + INTEGER(IntKi), PARAMETER :: B1ADOF80A = 2048 + INTEGER(IntKi), PARAMETER :: B1ADOF81A = 2049 + INTEGER(IntKi), PARAMETER :: B1ADOF82A = 2050 + INTEGER(IntKi), PARAMETER :: B1ADOF83A = 2051 + INTEGER(IntKi), PARAMETER :: B1ADOF84A = 2052 + INTEGER(IntKi), PARAMETER :: B1ADOF85A = 2053 + INTEGER(IntKi), PARAMETER :: B1ADOF86A = 2054 + INTEGER(IntKi), PARAMETER :: B1ADOF87A = 2055 + INTEGER(IntKi), PARAMETER :: B1ADOF88A = 2056 + INTEGER(IntKi), PARAMETER :: B1ADOF89A = 2057 + INTEGER(IntKi), PARAMETER :: B1ADOF90A = 2058 + INTEGER(IntKi), PARAMETER :: B1ADOF91A = 2059 + INTEGER(IntKi), PARAMETER :: B1ADOF92A = 2060 + INTEGER(IntKi), PARAMETER :: B1ADOF93A = 2061 + INTEGER(IntKi), PARAMETER :: B1ADOF94A = 2062 + INTEGER(IntKi), PARAMETER :: B1ADOF95A = 2063 + INTEGER(IntKi), PARAMETER :: B1ADOF96A = 2064 + INTEGER(IntKi), PARAMETER :: B1ADOF97A = 2065 + INTEGER(IntKi), PARAMETER :: B1ADOF98A = 2066 + INTEGER(IntKi), PARAMETER :: B1ADOF99A = 2067 + INTEGER(IntKi), PARAMETER :: B2ADOF1A = 2068 + INTEGER(IntKi), PARAMETER :: B2ADOF2A = 2069 + INTEGER(IntKi), PARAMETER :: B2ADOF3A = 2070 + INTEGER(IntKi), PARAMETER :: B2ADOF4A = 2071 + INTEGER(IntKi), PARAMETER :: B2ADOF5A = 2072 + INTEGER(IntKi), PARAMETER :: B2ADOF6A = 2073 + INTEGER(IntKi), PARAMETER :: B2ADOF7A = 2074 + INTEGER(IntKi), PARAMETER :: B2ADOF8A = 2075 + INTEGER(IntKi), PARAMETER :: B2ADOF9A = 2076 + INTEGER(IntKi), PARAMETER :: B2ADOF10A = 2077 + INTEGER(IntKi), PARAMETER :: B2ADOF11A = 2078 + INTEGER(IntKi), PARAMETER :: B2ADOF12A = 2079 + INTEGER(IntKi), PARAMETER :: B2ADOF13A = 2080 + INTEGER(IntKi), PARAMETER :: B2ADOF14A = 2081 + INTEGER(IntKi), PARAMETER :: B2ADOF15A = 2082 + INTEGER(IntKi), PARAMETER :: B2ADOF16A = 2083 + INTEGER(IntKi), PARAMETER :: B2ADOF17A = 2084 + INTEGER(IntKi), PARAMETER :: B2ADOF18A = 2085 + INTEGER(IntKi), PARAMETER :: B2ADOF19A = 2086 + INTEGER(IntKi), PARAMETER :: B2ADOF20A = 2087 + INTEGER(IntKi), PARAMETER :: B2ADOF21A = 2088 + INTEGER(IntKi), PARAMETER :: B2ADOF22A = 2089 + INTEGER(IntKi), PARAMETER :: B2ADOF23A = 2090 + INTEGER(IntKi), PARAMETER :: B2ADOF24A = 2091 + INTEGER(IntKi), PARAMETER :: B2ADOF25A = 2092 + INTEGER(IntKi), PARAMETER :: B2ADOF26A = 2093 + INTEGER(IntKi), PARAMETER :: B2ADOF27A = 2094 + INTEGER(IntKi), PARAMETER :: B2ADOF28A = 2095 + INTEGER(IntKi), PARAMETER :: B2ADOF29A = 2096 + INTEGER(IntKi), PARAMETER :: B2ADOF30A = 2097 + INTEGER(IntKi), PARAMETER :: B2ADOF31A = 2098 + INTEGER(IntKi), PARAMETER :: B2ADOF32A = 2099 + INTEGER(IntKi), PARAMETER :: B2ADOF33A = 2100 + INTEGER(IntKi), PARAMETER :: B2ADOF34A = 2101 + INTEGER(IntKi), PARAMETER :: B2ADOF35A = 2102 + INTEGER(IntKi), PARAMETER :: B2ADOF36A = 2103 + INTEGER(IntKi), PARAMETER :: B2ADOF37A = 2104 + INTEGER(IntKi), PARAMETER :: B2ADOF38A = 2105 + INTEGER(IntKi), PARAMETER :: B2ADOF39A = 2106 + INTEGER(IntKi), PARAMETER :: B2ADOF40A = 2107 + INTEGER(IntKi), PARAMETER :: B2ADOF41A = 2108 + INTEGER(IntKi), PARAMETER :: B2ADOF42A = 2109 + INTEGER(IntKi), PARAMETER :: B2ADOF43A = 2110 + INTEGER(IntKi), PARAMETER :: B2ADOF44A = 2111 + INTEGER(IntKi), PARAMETER :: B2ADOF45A = 2112 + INTEGER(IntKi), PARAMETER :: B2ADOF46A = 2113 + INTEGER(IntKi), PARAMETER :: B2ADOF47A = 2114 + INTEGER(IntKi), PARAMETER :: B2ADOF48A = 2115 + INTEGER(IntKi), PARAMETER :: B2ADOF49A = 2116 + INTEGER(IntKi), PARAMETER :: B2ADOF50A = 2117 + INTEGER(IntKi), PARAMETER :: B2ADOF51A = 2118 + INTEGER(IntKi), PARAMETER :: B2ADOF52A = 2119 + INTEGER(IntKi), PARAMETER :: B2ADOF53A = 2120 + INTEGER(IntKi), PARAMETER :: B2ADOF54A = 2121 + INTEGER(IntKi), PARAMETER :: B2ADOF55A = 2122 + INTEGER(IntKi), PARAMETER :: B2ADOF56A = 2123 + INTEGER(IntKi), PARAMETER :: B2ADOF57A = 2124 + INTEGER(IntKi), PARAMETER :: B2ADOF58A = 2125 + INTEGER(IntKi), PARAMETER :: B2ADOF59A = 2126 + INTEGER(IntKi), PARAMETER :: B2ADOF60A = 2127 + INTEGER(IntKi), PARAMETER :: B2ADOF61A = 2128 + INTEGER(IntKi), PARAMETER :: B2ADOF62A = 2129 + INTEGER(IntKi), PARAMETER :: B2ADOF63A = 2130 + INTEGER(IntKi), PARAMETER :: B2ADOF64A = 2131 + INTEGER(IntKi), PARAMETER :: B2ADOF65A = 2132 + INTEGER(IntKi), PARAMETER :: B2ADOF66A = 2133 + INTEGER(IntKi), PARAMETER :: B2ADOF67A = 2134 + INTEGER(IntKi), PARAMETER :: B2ADOF68A = 2135 + INTEGER(IntKi), PARAMETER :: B2ADOF69A = 2136 + INTEGER(IntKi), PARAMETER :: B2ADOF70A = 2137 + INTEGER(IntKi), PARAMETER :: B2ADOF71A = 2138 + INTEGER(IntKi), PARAMETER :: B2ADOF72A = 2139 + INTEGER(IntKi), PARAMETER :: B2ADOF73A = 2140 + INTEGER(IntKi), PARAMETER :: B2ADOF74A = 2141 + INTEGER(IntKi), PARAMETER :: B2ADOF75A = 2142 + INTEGER(IntKi), PARAMETER :: B2ADOF76A = 2143 + INTEGER(IntKi), PARAMETER :: B2ADOF77A = 2144 + INTEGER(IntKi), PARAMETER :: B2ADOF78A = 2145 + INTEGER(IntKi), PARAMETER :: B2ADOF79A = 2146 + INTEGER(IntKi), PARAMETER :: B2ADOF80A = 2147 + INTEGER(IntKi), PARAMETER :: B2ADOF81A = 2148 + INTEGER(IntKi), PARAMETER :: B2ADOF82A = 2149 + INTEGER(IntKi), PARAMETER :: B2ADOF83A = 2150 + INTEGER(IntKi), PARAMETER :: B2ADOF84A = 2151 + INTEGER(IntKi), PARAMETER :: B2ADOF85A = 2152 + INTEGER(IntKi), PARAMETER :: B2ADOF86A = 2153 + INTEGER(IntKi), PARAMETER :: B2ADOF87A = 2154 + INTEGER(IntKi), PARAMETER :: B2ADOF88A = 2155 + INTEGER(IntKi), PARAMETER :: B2ADOF89A = 2156 + INTEGER(IntKi), PARAMETER :: B2ADOF90A = 2157 + INTEGER(IntKi), PARAMETER :: B2ADOF91A = 2158 + INTEGER(IntKi), PARAMETER :: B2ADOF92A = 2159 + INTEGER(IntKi), PARAMETER :: B2ADOF93A = 2160 + INTEGER(IntKi), PARAMETER :: B2ADOF94A = 2161 + INTEGER(IntKi), PARAMETER :: B2ADOF95A = 2162 + INTEGER(IntKi), PARAMETER :: B2ADOF96A = 2163 + INTEGER(IntKi), PARAMETER :: B2ADOF97A = 2164 + INTEGER(IntKi), PARAMETER :: B2ADOF98A = 2165 + INTEGER(IntKi), PARAMETER :: B2ADOF99A = 2166 + INTEGER(IntKi), PARAMETER :: B3ADOF1A = 2167 + INTEGER(IntKi), PARAMETER :: B3ADOF2A = 2168 + INTEGER(IntKi), PARAMETER :: B3ADOF3A = 2169 + INTEGER(IntKi), PARAMETER :: B3ADOF4A = 2170 + INTEGER(IntKi), PARAMETER :: B3ADOF5A = 2171 + INTEGER(IntKi), PARAMETER :: B3ADOF6A = 2172 + INTEGER(IntKi), PARAMETER :: B3ADOF7A = 2173 + INTEGER(IntKi), PARAMETER :: B3ADOF8A = 2174 + INTEGER(IntKi), PARAMETER :: B3ADOF9A = 2175 + INTEGER(IntKi), PARAMETER :: B3ADOF10A = 2176 + INTEGER(IntKi), PARAMETER :: B3ADOF11A = 2177 + INTEGER(IntKi), PARAMETER :: B3ADOF12A = 2178 + INTEGER(IntKi), PARAMETER :: B3ADOF13A = 2179 + INTEGER(IntKi), PARAMETER :: B3ADOF14A = 2180 + INTEGER(IntKi), PARAMETER :: B3ADOF15A = 2181 + INTEGER(IntKi), PARAMETER :: B3ADOF16A = 2182 + INTEGER(IntKi), PARAMETER :: B3ADOF17A = 2183 + INTEGER(IntKi), PARAMETER :: B3ADOF18A = 2184 + INTEGER(IntKi), PARAMETER :: B3ADOF19A = 2185 + INTEGER(IntKi), PARAMETER :: B3ADOF20A = 2186 + INTEGER(IntKi), PARAMETER :: B3ADOF21A = 2187 + INTEGER(IntKi), PARAMETER :: B3ADOF22A = 2188 + INTEGER(IntKi), PARAMETER :: B3ADOF23A = 2189 + INTEGER(IntKi), PARAMETER :: B3ADOF24A = 2190 + INTEGER(IntKi), PARAMETER :: B3ADOF25A = 2191 + INTEGER(IntKi), PARAMETER :: B3ADOF26A = 2192 + INTEGER(IntKi), PARAMETER :: B3ADOF27A = 2193 + INTEGER(IntKi), PARAMETER :: B3ADOF28A = 2194 + INTEGER(IntKi), PARAMETER :: B3ADOF29A = 2195 + INTEGER(IntKi), PARAMETER :: B3ADOF30A = 2196 + INTEGER(IntKi), PARAMETER :: B3ADOF31A = 2197 + INTEGER(IntKi), PARAMETER :: B3ADOF32A = 2198 + INTEGER(IntKi), PARAMETER :: B3ADOF33A = 2199 + INTEGER(IntKi), PARAMETER :: B3ADOF34A = 2200 + INTEGER(IntKi), PARAMETER :: B3ADOF35A = 2201 + INTEGER(IntKi), PARAMETER :: B3ADOF36A = 2202 + INTEGER(IntKi), PARAMETER :: B3ADOF37A = 2203 + INTEGER(IntKi), PARAMETER :: B3ADOF38A = 2204 + INTEGER(IntKi), PARAMETER :: B3ADOF39A = 2205 + INTEGER(IntKi), PARAMETER :: B3ADOF40A = 2206 + INTEGER(IntKi), PARAMETER :: B3ADOF41A = 2207 + INTEGER(IntKi), PARAMETER :: B3ADOF42A = 2208 + INTEGER(IntKi), PARAMETER :: B3ADOF43A = 2209 + INTEGER(IntKi), PARAMETER :: B3ADOF44A = 2210 + INTEGER(IntKi), PARAMETER :: B3ADOF45A = 2211 + INTEGER(IntKi), PARAMETER :: B3ADOF46A = 2212 + INTEGER(IntKi), PARAMETER :: B3ADOF47A = 2213 + INTEGER(IntKi), PARAMETER :: B3ADOF48A = 2214 + INTEGER(IntKi), PARAMETER :: B3ADOF49A = 2215 + INTEGER(IntKi), PARAMETER :: B3ADOF50A = 2216 + INTEGER(IntKi), PARAMETER :: B3ADOF51A = 2217 + INTEGER(IntKi), PARAMETER :: B3ADOF52A = 2218 + INTEGER(IntKi), PARAMETER :: B3ADOF53A = 2219 + INTEGER(IntKi), PARAMETER :: B3ADOF54A = 2220 + INTEGER(IntKi), PARAMETER :: B3ADOF55A = 2221 + INTEGER(IntKi), PARAMETER :: B3ADOF56A = 2222 + INTEGER(IntKi), PARAMETER :: B3ADOF57A = 2223 + INTEGER(IntKi), PARAMETER :: B3ADOF58A = 2224 + INTEGER(IntKi), PARAMETER :: B3ADOF59A = 2225 + INTEGER(IntKi), PARAMETER :: B3ADOF60A = 2226 + INTEGER(IntKi), PARAMETER :: B3ADOF61A = 2227 + INTEGER(IntKi), PARAMETER :: B3ADOF62A = 2228 + INTEGER(IntKi), PARAMETER :: B3ADOF63A = 2229 + INTEGER(IntKi), PARAMETER :: B3ADOF64A = 2230 + INTEGER(IntKi), PARAMETER :: B3ADOF65A = 2231 + INTEGER(IntKi), PARAMETER :: B3ADOF66A = 2232 + INTEGER(IntKi), PARAMETER :: B3ADOF67A = 2233 + INTEGER(IntKi), PARAMETER :: B3ADOF68A = 2234 + INTEGER(IntKi), PARAMETER :: B3ADOF69A = 2235 + INTEGER(IntKi), PARAMETER :: B3ADOF70A = 2236 + INTEGER(IntKi), PARAMETER :: B3ADOF71A = 2237 + INTEGER(IntKi), PARAMETER :: B3ADOF72A = 2238 + INTEGER(IntKi), PARAMETER :: B3ADOF73A = 2239 + INTEGER(IntKi), PARAMETER :: B3ADOF74A = 2240 + INTEGER(IntKi), PARAMETER :: B3ADOF75A = 2241 + INTEGER(IntKi), PARAMETER :: B3ADOF76A = 2242 + INTEGER(IntKi), PARAMETER :: B3ADOF77A = 2243 + INTEGER(IntKi), PARAMETER :: B3ADOF78A = 2244 + INTEGER(IntKi), PARAMETER :: B3ADOF79A = 2245 + INTEGER(IntKi), PARAMETER :: B3ADOF80A = 2246 + INTEGER(IntKi), PARAMETER :: B3ADOF81A = 2247 + INTEGER(IntKi), PARAMETER :: B3ADOF82A = 2248 + INTEGER(IntKi), PARAMETER :: B3ADOF83A = 2249 + INTEGER(IntKi), PARAMETER :: B3ADOF84A = 2250 + INTEGER(IntKi), PARAMETER :: B3ADOF85A = 2251 + INTEGER(IntKi), PARAMETER :: B3ADOF86A = 2252 + INTEGER(IntKi), PARAMETER :: B3ADOF87A = 2253 + INTEGER(IntKi), PARAMETER :: B3ADOF88A = 2254 + INTEGER(IntKi), PARAMETER :: B3ADOF89A = 2255 + INTEGER(IntKi), PARAMETER :: B3ADOF90A = 2256 + INTEGER(IntKi), PARAMETER :: B3ADOF91A = 2257 + INTEGER(IntKi), PARAMETER :: B3ADOF92A = 2258 + INTEGER(IntKi), PARAMETER :: B3ADOF93A = 2259 + INTEGER(IntKi), PARAMETER :: B3ADOF94A = 2260 + INTEGER(IntKi), PARAMETER :: B3ADOF95A = 2261 + INTEGER(IntKi), PARAMETER :: B3ADOF96A = 2262 + INTEGER(IntKi), PARAMETER :: B3ADOF97A = 2263 + INTEGER(IntKi), PARAMETER :: B3ADOF98A = 2264 + INTEGER(IntKi), PARAMETER :: B3ADOF99A = 2265 + INTEGER(IntKi), PARAMETER :: B4ADOF1A = 2266 + INTEGER(IntKi), PARAMETER :: B4ADOF2A = 2267 + INTEGER(IntKi), PARAMETER :: B4ADOF3A = 2268 + INTEGER(IntKi), PARAMETER :: B4ADOF4A = 2269 + INTEGER(IntKi), PARAMETER :: B4ADOF5A = 2270 + INTEGER(IntKi), PARAMETER :: B4ADOF6A = 2271 + INTEGER(IntKi), PARAMETER :: B4ADOF7A = 2272 + INTEGER(IntKi), PARAMETER :: B4ADOF8A = 2273 + INTEGER(IntKi), PARAMETER :: B4ADOF9A = 2274 + INTEGER(IntKi), PARAMETER :: B4ADOF10A = 2275 + INTEGER(IntKi), PARAMETER :: B4ADOF11A = 2276 + INTEGER(IntKi), PARAMETER :: B4ADOF12A = 2277 + INTEGER(IntKi), PARAMETER :: B4ADOF13A = 2278 + INTEGER(IntKi), PARAMETER :: B4ADOF14A = 2279 + INTEGER(IntKi), PARAMETER :: B4ADOF15A = 2280 + INTEGER(IntKi), PARAMETER :: B4ADOF16A = 2281 + INTEGER(IntKi), PARAMETER :: B4ADOF17A = 2282 + INTEGER(IntKi), PARAMETER :: B4ADOF18A = 2283 + INTEGER(IntKi), PARAMETER :: B4ADOF19A = 2284 + INTEGER(IntKi), PARAMETER :: B4ADOF20A = 2285 + INTEGER(IntKi), PARAMETER :: B4ADOF21A = 2286 + INTEGER(IntKi), PARAMETER :: B4ADOF22A = 2287 + INTEGER(IntKi), PARAMETER :: B4ADOF23A = 2288 + INTEGER(IntKi), PARAMETER :: B4ADOF24A = 2289 + INTEGER(IntKi), PARAMETER :: B4ADOF25A = 2290 + INTEGER(IntKi), PARAMETER :: B4ADOF26A = 2291 + INTEGER(IntKi), PARAMETER :: B4ADOF27A = 2292 + INTEGER(IntKi), PARAMETER :: B4ADOF28A = 2293 + INTEGER(IntKi), PARAMETER :: B4ADOF29A = 2294 + INTEGER(IntKi), PARAMETER :: B4ADOF30A = 2295 + INTEGER(IntKi), PARAMETER :: B4ADOF31A = 2296 + INTEGER(IntKi), PARAMETER :: B4ADOF32A = 2297 + INTEGER(IntKi), PARAMETER :: B4ADOF33A = 2298 + INTEGER(IntKi), PARAMETER :: B4ADOF34A = 2299 + INTEGER(IntKi), PARAMETER :: B4ADOF35A = 2300 + INTEGER(IntKi), PARAMETER :: B4ADOF36A = 2301 + INTEGER(IntKi), PARAMETER :: B4ADOF37A = 2302 + INTEGER(IntKi), PARAMETER :: B4ADOF38A = 2303 + INTEGER(IntKi), PARAMETER :: B4ADOF39A = 2304 + INTEGER(IntKi), PARAMETER :: B4ADOF40A = 2305 + INTEGER(IntKi), PARAMETER :: B4ADOF41A = 2306 + INTEGER(IntKi), PARAMETER :: B4ADOF42A = 2307 + INTEGER(IntKi), PARAMETER :: B4ADOF43A = 2308 + INTEGER(IntKi), PARAMETER :: B4ADOF44A = 2309 + INTEGER(IntKi), PARAMETER :: B4ADOF45A = 2310 + INTEGER(IntKi), PARAMETER :: B4ADOF46A = 2311 + INTEGER(IntKi), PARAMETER :: B4ADOF47A = 2312 + INTEGER(IntKi), PARAMETER :: B4ADOF48A = 2313 + INTEGER(IntKi), PARAMETER :: B4ADOF49A = 2314 + INTEGER(IntKi), PARAMETER :: B4ADOF50A = 2315 + INTEGER(IntKi), PARAMETER :: B4ADOF51A = 2316 + INTEGER(IntKi), PARAMETER :: B4ADOF52A = 2317 + INTEGER(IntKi), PARAMETER :: B4ADOF53A = 2318 + INTEGER(IntKi), PARAMETER :: B4ADOF54A = 2319 + INTEGER(IntKi), PARAMETER :: B4ADOF55A = 2320 + INTEGER(IntKi), PARAMETER :: B4ADOF56A = 2321 + INTEGER(IntKi), PARAMETER :: B4ADOF57A = 2322 + INTEGER(IntKi), PARAMETER :: B4ADOF58A = 2323 + INTEGER(IntKi), PARAMETER :: B4ADOF59A = 2324 + INTEGER(IntKi), PARAMETER :: B4ADOF60A = 2325 + INTEGER(IntKi), PARAMETER :: B4ADOF61A = 2326 + INTEGER(IntKi), PARAMETER :: B4ADOF62A = 2327 + INTEGER(IntKi), PARAMETER :: B4ADOF63A = 2328 + INTEGER(IntKi), PARAMETER :: B4ADOF64A = 2329 + INTEGER(IntKi), PARAMETER :: B4ADOF65A = 2330 + INTEGER(IntKi), PARAMETER :: B4ADOF66A = 2331 + INTEGER(IntKi), PARAMETER :: B4ADOF67A = 2332 + INTEGER(IntKi), PARAMETER :: B4ADOF68A = 2333 + INTEGER(IntKi), PARAMETER :: B4ADOF69A = 2334 + INTEGER(IntKi), PARAMETER :: B4ADOF70A = 2335 + INTEGER(IntKi), PARAMETER :: B4ADOF71A = 2336 + INTEGER(IntKi), PARAMETER :: B4ADOF72A = 2337 + INTEGER(IntKi), PARAMETER :: B4ADOF73A = 2338 + INTEGER(IntKi), PARAMETER :: B4ADOF74A = 2339 + INTEGER(IntKi), PARAMETER :: B4ADOF75A = 2340 + INTEGER(IntKi), PARAMETER :: B4ADOF76A = 2341 + INTEGER(IntKi), PARAMETER :: B4ADOF77A = 2342 + INTEGER(IntKi), PARAMETER :: B4ADOF78A = 2343 + INTEGER(IntKi), PARAMETER :: B4ADOF79A = 2344 + INTEGER(IntKi), PARAMETER :: B4ADOF80A = 2345 + INTEGER(IntKi), PARAMETER :: B4ADOF81A = 2346 + INTEGER(IntKi), PARAMETER :: B4ADOF82A = 2347 + INTEGER(IntKi), PARAMETER :: B4ADOF83A = 2348 + INTEGER(IntKi), PARAMETER :: B4ADOF84A = 2349 + INTEGER(IntKi), PARAMETER :: B4ADOF85A = 2350 + INTEGER(IntKi), PARAMETER :: B4ADOF86A = 2351 + INTEGER(IntKi), PARAMETER :: B4ADOF87A = 2352 + INTEGER(IntKi), PARAMETER :: B4ADOF88A = 2353 + INTEGER(IntKi), PARAMETER :: B4ADOF89A = 2354 + INTEGER(IntKi), PARAMETER :: B4ADOF90A = 2355 + INTEGER(IntKi), PARAMETER :: B4ADOF91A = 2356 + INTEGER(IntKi), PARAMETER :: B4ADOF92A = 2357 + INTEGER(IntKi), PARAMETER :: B4ADOF93A = 2358 + INTEGER(IntKi), PARAMETER :: B4ADOF94A = 2359 + INTEGER(IntKi), PARAMETER :: B4ADOF95A = 2360 + INTEGER(IntKi), PARAMETER :: B4ADOF96A = 2361 + INTEGER(IntKi), PARAMETER :: B4ADOF97A = 2362 + INTEGER(IntKi), PARAMETER :: B4ADOF98A = 2363 + INTEGER(IntKi), PARAMETER :: B4ADOF99A = 2364 + INTEGER(IntKi), PARAMETER :: B5ADOF1A = 2365 + INTEGER(IntKi), PARAMETER :: B5ADOF2A = 2366 + INTEGER(IntKi), PARAMETER :: B5ADOF3A = 2367 + INTEGER(IntKi), PARAMETER :: B5ADOF4A = 2368 + INTEGER(IntKi), PARAMETER :: B5ADOF5A = 2369 + INTEGER(IntKi), PARAMETER :: B5ADOF6A = 2370 + INTEGER(IntKi), PARAMETER :: B5ADOF7A = 2371 + INTEGER(IntKi), PARAMETER :: B5ADOF8A = 2372 + INTEGER(IntKi), PARAMETER :: B5ADOF9A = 2373 + INTEGER(IntKi), PARAMETER :: B5ADOF10A = 2374 + INTEGER(IntKi), PARAMETER :: B5ADOF11A = 2375 + INTEGER(IntKi), PARAMETER :: B5ADOF12A = 2376 + INTEGER(IntKi), PARAMETER :: B5ADOF13A = 2377 + INTEGER(IntKi), PARAMETER :: B5ADOF14A = 2378 + INTEGER(IntKi), PARAMETER :: B5ADOF15A = 2379 + INTEGER(IntKi), PARAMETER :: B5ADOF16A = 2380 + INTEGER(IntKi), PARAMETER :: B5ADOF17A = 2381 + INTEGER(IntKi), PARAMETER :: B5ADOF18A = 2382 + INTEGER(IntKi), PARAMETER :: B5ADOF19A = 2383 + INTEGER(IntKi), PARAMETER :: B5ADOF20A = 2384 + INTEGER(IntKi), PARAMETER :: B5ADOF21A = 2385 + INTEGER(IntKi), PARAMETER :: B5ADOF22A = 2386 + INTEGER(IntKi), PARAMETER :: B5ADOF23A = 2387 + INTEGER(IntKi), PARAMETER :: B5ADOF24A = 2388 + INTEGER(IntKi), PARAMETER :: B5ADOF25A = 2389 + INTEGER(IntKi), PARAMETER :: B5ADOF26A = 2390 + INTEGER(IntKi), PARAMETER :: B5ADOF27A = 2391 + INTEGER(IntKi), PARAMETER :: B5ADOF28A = 2392 + INTEGER(IntKi), PARAMETER :: B5ADOF29A = 2393 + INTEGER(IntKi), PARAMETER :: B5ADOF30A = 2394 + INTEGER(IntKi), PARAMETER :: B5ADOF31A = 2395 + INTEGER(IntKi), PARAMETER :: B5ADOF32A = 2396 + INTEGER(IntKi), PARAMETER :: B5ADOF33A = 2397 + INTEGER(IntKi), PARAMETER :: B5ADOF34A = 2398 + INTEGER(IntKi), PARAMETER :: B5ADOF35A = 2399 + INTEGER(IntKi), PARAMETER :: B5ADOF36A = 2400 + INTEGER(IntKi), PARAMETER :: B5ADOF37A = 2401 + INTEGER(IntKi), PARAMETER :: B5ADOF38A = 2402 + INTEGER(IntKi), PARAMETER :: B5ADOF39A = 2403 + INTEGER(IntKi), PARAMETER :: B5ADOF40A = 2404 + INTEGER(IntKi), PARAMETER :: B5ADOF41A = 2405 + INTEGER(IntKi), PARAMETER :: B5ADOF42A = 2406 + INTEGER(IntKi), PARAMETER :: B5ADOF43A = 2407 + INTEGER(IntKi), PARAMETER :: B5ADOF44A = 2408 + INTEGER(IntKi), PARAMETER :: B5ADOF45A = 2409 + INTEGER(IntKi), PARAMETER :: B5ADOF46A = 2410 + INTEGER(IntKi), PARAMETER :: B5ADOF47A = 2411 + INTEGER(IntKi), PARAMETER :: B5ADOF48A = 2412 + INTEGER(IntKi), PARAMETER :: B5ADOF49A = 2413 + INTEGER(IntKi), PARAMETER :: B5ADOF50A = 2414 + INTEGER(IntKi), PARAMETER :: B5ADOF51A = 2415 + INTEGER(IntKi), PARAMETER :: B5ADOF52A = 2416 + INTEGER(IntKi), PARAMETER :: B5ADOF53A = 2417 + INTEGER(IntKi), PARAMETER :: B5ADOF54A = 2418 + INTEGER(IntKi), PARAMETER :: B5ADOF55A = 2419 + INTEGER(IntKi), PARAMETER :: B5ADOF56A = 2420 + INTEGER(IntKi), PARAMETER :: B5ADOF57A = 2421 + INTEGER(IntKi), PARAMETER :: B5ADOF58A = 2422 + INTEGER(IntKi), PARAMETER :: B5ADOF59A = 2423 + INTEGER(IntKi), PARAMETER :: B5ADOF60A = 2424 + INTEGER(IntKi), PARAMETER :: B5ADOF61A = 2425 + INTEGER(IntKi), PARAMETER :: B5ADOF62A = 2426 + INTEGER(IntKi), PARAMETER :: B5ADOF63A = 2427 + INTEGER(IntKi), PARAMETER :: B5ADOF64A = 2428 + INTEGER(IntKi), PARAMETER :: B5ADOF65A = 2429 + INTEGER(IntKi), PARAMETER :: B5ADOF66A = 2430 + INTEGER(IntKi), PARAMETER :: B5ADOF67A = 2431 + INTEGER(IntKi), PARAMETER :: B5ADOF68A = 2432 + INTEGER(IntKi), PARAMETER :: B5ADOF69A = 2433 + INTEGER(IntKi), PARAMETER :: B5ADOF70A = 2434 + INTEGER(IntKi), PARAMETER :: B5ADOF71A = 2435 + INTEGER(IntKi), PARAMETER :: B5ADOF72A = 2436 + INTEGER(IntKi), PARAMETER :: B5ADOF73A = 2437 + INTEGER(IntKi), PARAMETER :: B5ADOF74A = 2438 + INTEGER(IntKi), PARAMETER :: B5ADOF75A = 2439 + INTEGER(IntKi), PARAMETER :: B5ADOF76A = 2440 + INTEGER(IntKi), PARAMETER :: B5ADOF77A = 2441 + INTEGER(IntKi), PARAMETER :: B5ADOF78A = 2442 + INTEGER(IntKi), PARAMETER :: B5ADOF79A = 2443 + INTEGER(IntKi), PARAMETER :: B5ADOF80A = 2444 + INTEGER(IntKi), PARAMETER :: B5ADOF81A = 2445 + INTEGER(IntKi), PARAMETER :: B5ADOF82A = 2446 + INTEGER(IntKi), PARAMETER :: B5ADOF83A = 2447 + INTEGER(IntKi), PARAMETER :: B5ADOF84A = 2448 + INTEGER(IntKi), PARAMETER :: B5ADOF85A = 2449 + INTEGER(IntKi), PARAMETER :: B5ADOF86A = 2450 + INTEGER(IntKi), PARAMETER :: B5ADOF87A = 2451 + INTEGER(IntKi), PARAMETER :: B5ADOF88A = 2452 + INTEGER(IntKi), PARAMETER :: B5ADOF89A = 2453 + INTEGER(IntKi), PARAMETER :: B5ADOF90A = 2454 + INTEGER(IntKi), PARAMETER :: B5ADOF91A = 2455 + INTEGER(IntKi), PARAMETER :: B5ADOF92A = 2456 + INTEGER(IntKi), PARAMETER :: B5ADOF93A = 2457 + INTEGER(IntKi), PARAMETER :: B5ADOF94A = 2458 + INTEGER(IntKi), PARAMETER :: B5ADOF95A = 2459 + INTEGER(IntKi), PARAMETER :: B5ADOF96A = 2460 + INTEGER(IntKi), PARAMETER :: B5ADOF97A = 2461 + INTEGER(IntKi), PARAMETER :: B5ADOF98A = 2462 + INTEGER(IntKi), PARAMETER :: B5ADOF99A = 2463 + INTEGER(IntKi), PARAMETER :: B6ADOF1A = 2464 + INTEGER(IntKi), PARAMETER :: B6ADOF2A = 2465 + INTEGER(IntKi), PARAMETER :: B6ADOF3A = 2466 + INTEGER(IntKi), PARAMETER :: B6ADOF4A = 2467 + INTEGER(IntKi), PARAMETER :: B6ADOF5A = 2468 + INTEGER(IntKi), PARAMETER :: B6ADOF6A = 2469 + INTEGER(IntKi), PARAMETER :: B6ADOF7A = 2470 + INTEGER(IntKi), PARAMETER :: B6ADOF8A = 2471 + INTEGER(IntKi), PARAMETER :: B6ADOF9A = 2472 + INTEGER(IntKi), PARAMETER :: B6ADOF10A = 2473 + INTEGER(IntKi), PARAMETER :: B6ADOF11A = 2474 + INTEGER(IntKi), PARAMETER :: B6ADOF12A = 2475 + INTEGER(IntKi), PARAMETER :: B6ADOF13A = 2476 + INTEGER(IntKi), PARAMETER :: B6ADOF14A = 2477 + INTEGER(IntKi), PARAMETER :: B6ADOF15A = 2478 + INTEGER(IntKi), PARAMETER :: B6ADOF16A = 2479 + INTEGER(IntKi), PARAMETER :: B6ADOF17A = 2480 + INTEGER(IntKi), PARAMETER :: B6ADOF18A = 2481 + INTEGER(IntKi), PARAMETER :: B6ADOF19A = 2482 + INTEGER(IntKi), PARAMETER :: B6ADOF20A = 2483 + INTEGER(IntKi), PARAMETER :: B6ADOF21A = 2484 + INTEGER(IntKi), PARAMETER :: B6ADOF22A = 2485 + INTEGER(IntKi), PARAMETER :: B6ADOF23A = 2486 + INTEGER(IntKi), PARAMETER :: B6ADOF24A = 2487 + INTEGER(IntKi), PARAMETER :: B6ADOF25A = 2488 + INTEGER(IntKi), PARAMETER :: B6ADOF26A = 2489 + INTEGER(IntKi), PARAMETER :: B6ADOF27A = 2490 + INTEGER(IntKi), PARAMETER :: B6ADOF28A = 2491 + INTEGER(IntKi), PARAMETER :: B6ADOF29A = 2492 + INTEGER(IntKi), PARAMETER :: B6ADOF30A = 2493 + INTEGER(IntKi), PARAMETER :: B6ADOF31A = 2494 + INTEGER(IntKi), PARAMETER :: B6ADOF32A = 2495 + INTEGER(IntKi), PARAMETER :: B6ADOF33A = 2496 + INTEGER(IntKi), PARAMETER :: B6ADOF34A = 2497 + INTEGER(IntKi), PARAMETER :: B6ADOF35A = 2498 + INTEGER(IntKi), PARAMETER :: B6ADOF36A = 2499 + INTEGER(IntKi), PARAMETER :: B6ADOF37A = 2500 + INTEGER(IntKi), PARAMETER :: B6ADOF38A = 2501 + INTEGER(IntKi), PARAMETER :: B6ADOF39A = 2502 + INTEGER(IntKi), PARAMETER :: B6ADOF40A = 2503 + INTEGER(IntKi), PARAMETER :: B6ADOF41A = 2504 + INTEGER(IntKi), PARAMETER :: B6ADOF42A = 2505 + INTEGER(IntKi), PARAMETER :: B6ADOF43A = 2506 + INTEGER(IntKi), PARAMETER :: B6ADOF44A = 2507 + INTEGER(IntKi), PARAMETER :: B6ADOF45A = 2508 + INTEGER(IntKi), PARAMETER :: B6ADOF46A = 2509 + INTEGER(IntKi), PARAMETER :: B6ADOF47A = 2510 + INTEGER(IntKi), PARAMETER :: B6ADOF48A = 2511 + INTEGER(IntKi), PARAMETER :: B6ADOF49A = 2512 + INTEGER(IntKi), PARAMETER :: B6ADOF50A = 2513 + INTEGER(IntKi), PARAMETER :: B6ADOF51A = 2514 + INTEGER(IntKi), PARAMETER :: B6ADOF52A = 2515 + INTEGER(IntKi), PARAMETER :: B6ADOF53A = 2516 + INTEGER(IntKi), PARAMETER :: B6ADOF54A = 2517 + INTEGER(IntKi), PARAMETER :: B6ADOF55A = 2518 + INTEGER(IntKi), PARAMETER :: B6ADOF56A = 2519 + INTEGER(IntKi), PARAMETER :: B6ADOF57A = 2520 + INTEGER(IntKi), PARAMETER :: B6ADOF58A = 2521 + INTEGER(IntKi), PARAMETER :: B6ADOF59A = 2522 + INTEGER(IntKi), PARAMETER :: B6ADOF60A = 2523 + INTEGER(IntKi), PARAMETER :: B6ADOF61A = 2524 + INTEGER(IntKi), PARAMETER :: B6ADOF62A = 2525 + INTEGER(IntKi), PARAMETER :: B6ADOF63A = 2526 + INTEGER(IntKi), PARAMETER :: B6ADOF64A = 2527 + INTEGER(IntKi), PARAMETER :: B6ADOF65A = 2528 + INTEGER(IntKi), PARAMETER :: B6ADOF66A = 2529 + INTEGER(IntKi), PARAMETER :: B6ADOF67A = 2530 + INTEGER(IntKi), PARAMETER :: B6ADOF68A = 2531 + INTEGER(IntKi), PARAMETER :: B6ADOF69A = 2532 + INTEGER(IntKi), PARAMETER :: B6ADOF70A = 2533 + INTEGER(IntKi), PARAMETER :: B6ADOF71A = 2534 + INTEGER(IntKi), PARAMETER :: B6ADOF72A = 2535 + INTEGER(IntKi), PARAMETER :: B6ADOF73A = 2536 + INTEGER(IntKi), PARAMETER :: B6ADOF74A = 2537 + INTEGER(IntKi), PARAMETER :: B6ADOF75A = 2538 + INTEGER(IntKi), PARAMETER :: B6ADOF76A = 2539 + INTEGER(IntKi), PARAMETER :: B6ADOF77A = 2540 + INTEGER(IntKi), PARAMETER :: B6ADOF78A = 2541 + INTEGER(IntKi), PARAMETER :: B6ADOF79A = 2542 + INTEGER(IntKi), PARAMETER :: B6ADOF80A = 2543 + INTEGER(IntKi), PARAMETER :: B6ADOF81A = 2544 + INTEGER(IntKi), PARAMETER :: B6ADOF82A = 2545 + INTEGER(IntKi), PARAMETER :: B6ADOF83A = 2546 + INTEGER(IntKi), PARAMETER :: B6ADOF84A = 2547 + INTEGER(IntKi), PARAMETER :: B6ADOF85A = 2548 + INTEGER(IntKi), PARAMETER :: B6ADOF86A = 2549 + INTEGER(IntKi), PARAMETER :: B6ADOF87A = 2550 + INTEGER(IntKi), PARAMETER :: B6ADOF88A = 2551 + INTEGER(IntKi), PARAMETER :: B6ADOF89A = 2552 + INTEGER(IntKi), PARAMETER :: B6ADOF90A = 2553 + INTEGER(IntKi), PARAMETER :: B6ADOF91A = 2554 + INTEGER(IntKi), PARAMETER :: B6ADOF92A = 2555 + INTEGER(IntKi), PARAMETER :: B6ADOF93A = 2556 + INTEGER(IntKi), PARAMETER :: B6ADOF94A = 2557 + INTEGER(IntKi), PARAMETER :: B6ADOF95A = 2558 + INTEGER(IntKi), PARAMETER :: B6ADOF96A = 2559 + INTEGER(IntKi), PARAMETER :: B6ADOF97A = 2560 + INTEGER(IntKi), PARAMETER :: B6ADOF98A = 2561 + INTEGER(IntKi), PARAMETER :: B6ADOF99A = 2562 + INTEGER(IntKi), PARAMETER :: B7ADOF1A = 2563 + INTEGER(IntKi), PARAMETER :: B7ADOF2A = 2564 + INTEGER(IntKi), PARAMETER :: B7ADOF3A = 2565 + INTEGER(IntKi), PARAMETER :: B7ADOF4A = 2566 + INTEGER(IntKi), PARAMETER :: B7ADOF5A = 2567 + INTEGER(IntKi), PARAMETER :: B7ADOF6A = 2568 + INTEGER(IntKi), PARAMETER :: B7ADOF7A = 2569 + INTEGER(IntKi), PARAMETER :: B7ADOF8A = 2570 + INTEGER(IntKi), PARAMETER :: B7ADOF9A = 2571 + INTEGER(IntKi), PARAMETER :: B7ADOF10A = 2572 + INTEGER(IntKi), PARAMETER :: B7ADOF11A = 2573 + INTEGER(IntKi), PARAMETER :: B7ADOF12A = 2574 + INTEGER(IntKi), PARAMETER :: B7ADOF13A = 2575 + INTEGER(IntKi), PARAMETER :: B7ADOF14A = 2576 + INTEGER(IntKi), PARAMETER :: B7ADOF15A = 2577 + INTEGER(IntKi), PARAMETER :: B7ADOF16A = 2578 + INTEGER(IntKi), PARAMETER :: B7ADOF17A = 2579 + INTEGER(IntKi), PARAMETER :: B7ADOF18A = 2580 + INTEGER(IntKi), PARAMETER :: B7ADOF19A = 2581 + INTEGER(IntKi), PARAMETER :: B7ADOF20A = 2582 + INTEGER(IntKi), PARAMETER :: B7ADOF21A = 2583 + INTEGER(IntKi), PARAMETER :: B7ADOF22A = 2584 + INTEGER(IntKi), PARAMETER :: B7ADOF23A = 2585 + INTEGER(IntKi), PARAMETER :: B7ADOF24A = 2586 + INTEGER(IntKi), PARAMETER :: B7ADOF25A = 2587 + INTEGER(IntKi), PARAMETER :: B7ADOF26A = 2588 + INTEGER(IntKi), PARAMETER :: B7ADOF27A = 2589 + INTEGER(IntKi), PARAMETER :: B7ADOF28A = 2590 + INTEGER(IntKi), PARAMETER :: B7ADOF29A = 2591 + INTEGER(IntKi), PARAMETER :: B7ADOF30A = 2592 + INTEGER(IntKi), PARAMETER :: B7ADOF31A = 2593 + INTEGER(IntKi), PARAMETER :: B7ADOF32A = 2594 + INTEGER(IntKi), PARAMETER :: B7ADOF33A = 2595 + INTEGER(IntKi), PARAMETER :: B7ADOF34A = 2596 + INTEGER(IntKi), PARAMETER :: B7ADOF35A = 2597 + INTEGER(IntKi), PARAMETER :: B7ADOF36A = 2598 + INTEGER(IntKi), PARAMETER :: B7ADOF37A = 2599 + INTEGER(IntKi), PARAMETER :: B7ADOF38A = 2600 + INTEGER(IntKi), PARAMETER :: B7ADOF39A = 2601 + INTEGER(IntKi), PARAMETER :: B7ADOF40A = 2602 + INTEGER(IntKi), PARAMETER :: B7ADOF41A = 2603 + INTEGER(IntKi), PARAMETER :: B7ADOF42A = 2604 + INTEGER(IntKi), PARAMETER :: B7ADOF43A = 2605 + INTEGER(IntKi), PARAMETER :: B7ADOF44A = 2606 + INTEGER(IntKi), PARAMETER :: B7ADOF45A = 2607 + INTEGER(IntKi), PARAMETER :: B7ADOF46A = 2608 + INTEGER(IntKi), PARAMETER :: B7ADOF47A = 2609 + INTEGER(IntKi), PARAMETER :: B7ADOF48A = 2610 + INTEGER(IntKi), PARAMETER :: B7ADOF49A = 2611 + INTEGER(IntKi), PARAMETER :: B7ADOF50A = 2612 + INTEGER(IntKi), PARAMETER :: B7ADOF51A = 2613 + INTEGER(IntKi), PARAMETER :: B7ADOF52A = 2614 + INTEGER(IntKi), PARAMETER :: B7ADOF53A = 2615 + INTEGER(IntKi), PARAMETER :: B7ADOF54A = 2616 + INTEGER(IntKi), PARAMETER :: B7ADOF55A = 2617 + INTEGER(IntKi), PARAMETER :: B7ADOF56A = 2618 + INTEGER(IntKi), PARAMETER :: B7ADOF57A = 2619 + INTEGER(IntKi), PARAMETER :: B7ADOF58A = 2620 + INTEGER(IntKi), PARAMETER :: B7ADOF59A = 2621 + INTEGER(IntKi), PARAMETER :: B7ADOF60A = 2622 + INTEGER(IntKi), PARAMETER :: B7ADOF61A = 2623 + INTEGER(IntKi), PARAMETER :: B7ADOF62A = 2624 + INTEGER(IntKi), PARAMETER :: B7ADOF63A = 2625 + INTEGER(IntKi), PARAMETER :: B7ADOF64A = 2626 + INTEGER(IntKi), PARAMETER :: B7ADOF65A = 2627 + INTEGER(IntKi), PARAMETER :: B7ADOF66A = 2628 + INTEGER(IntKi), PARAMETER :: B7ADOF67A = 2629 + INTEGER(IntKi), PARAMETER :: B7ADOF68A = 2630 + INTEGER(IntKi), PARAMETER :: B7ADOF69A = 2631 + INTEGER(IntKi), PARAMETER :: B7ADOF70A = 2632 + INTEGER(IntKi), PARAMETER :: B7ADOF71A = 2633 + INTEGER(IntKi), PARAMETER :: B7ADOF72A = 2634 + INTEGER(IntKi), PARAMETER :: B7ADOF73A = 2635 + INTEGER(IntKi), PARAMETER :: B7ADOF74A = 2636 + INTEGER(IntKi), PARAMETER :: B7ADOF75A = 2637 + INTEGER(IntKi), PARAMETER :: B7ADOF76A = 2638 + INTEGER(IntKi), PARAMETER :: B7ADOF77A = 2639 + INTEGER(IntKi), PARAMETER :: B7ADOF78A = 2640 + INTEGER(IntKi), PARAMETER :: B7ADOF79A = 2641 + INTEGER(IntKi), PARAMETER :: B7ADOF80A = 2642 + INTEGER(IntKi), PARAMETER :: B7ADOF81A = 2643 + INTEGER(IntKi), PARAMETER :: B7ADOF82A = 2644 + INTEGER(IntKi), PARAMETER :: B7ADOF83A = 2645 + INTEGER(IntKi), PARAMETER :: B7ADOF84A = 2646 + INTEGER(IntKi), PARAMETER :: B7ADOF85A = 2647 + INTEGER(IntKi), PARAMETER :: B7ADOF86A = 2648 + INTEGER(IntKi), PARAMETER :: B7ADOF87A = 2649 + INTEGER(IntKi), PARAMETER :: B7ADOF88A = 2650 + INTEGER(IntKi), PARAMETER :: B7ADOF89A = 2651 + INTEGER(IntKi), PARAMETER :: B7ADOF90A = 2652 + INTEGER(IntKi), PARAMETER :: B7ADOF91A = 2653 + INTEGER(IntKi), PARAMETER :: B7ADOF92A = 2654 + INTEGER(IntKi), PARAMETER :: B7ADOF93A = 2655 + INTEGER(IntKi), PARAMETER :: B7ADOF94A = 2656 + INTEGER(IntKi), PARAMETER :: B7ADOF95A = 2657 + INTEGER(IntKi), PARAMETER :: B7ADOF96A = 2658 + INTEGER(IntKi), PARAMETER :: B7ADOF97A = 2659 + INTEGER(IntKi), PARAMETER :: B7ADOF98A = 2660 + INTEGER(IntKi), PARAMETER :: B7ADOF99A = 2661 + INTEGER(IntKi), PARAMETER :: B8ADOF1A = 2662 + INTEGER(IntKi), PARAMETER :: B8ADOF2A = 2663 + INTEGER(IntKi), PARAMETER :: B8ADOF3A = 2664 + INTEGER(IntKi), PARAMETER :: B8ADOF4A = 2665 + INTEGER(IntKi), PARAMETER :: B8ADOF5A = 2666 + INTEGER(IntKi), PARAMETER :: B8ADOF6A = 2667 + INTEGER(IntKi), PARAMETER :: B8ADOF7A = 2668 + INTEGER(IntKi), PARAMETER :: B8ADOF8A = 2669 + INTEGER(IntKi), PARAMETER :: B8ADOF9A = 2670 + INTEGER(IntKi), PARAMETER :: B8ADOF10A = 2671 + INTEGER(IntKi), PARAMETER :: B8ADOF11A = 2672 + INTEGER(IntKi), PARAMETER :: B8ADOF12A = 2673 + INTEGER(IntKi), PARAMETER :: B8ADOF13A = 2674 + INTEGER(IntKi), PARAMETER :: B8ADOF14A = 2675 + INTEGER(IntKi), PARAMETER :: B8ADOF15A = 2676 + INTEGER(IntKi), PARAMETER :: B8ADOF16A = 2677 + INTEGER(IntKi), PARAMETER :: B8ADOF17A = 2678 + INTEGER(IntKi), PARAMETER :: B8ADOF18A = 2679 + INTEGER(IntKi), PARAMETER :: B8ADOF19A = 2680 + INTEGER(IntKi), PARAMETER :: B8ADOF20A = 2681 + INTEGER(IntKi), PARAMETER :: B8ADOF21A = 2682 + INTEGER(IntKi), PARAMETER :: B8ADOF22A = 2683 + INTEGER(IntKi), PARAMETER :: B8ADOF23A = 2684 + INTEGER(IntKi), PARAMETER :: B8ADOF24A = 2685 + INTEGER(IntKi), PARAMETER :: B8ADOF25A = 2686 + INTEGER(IntKi), PARAMETER :: B8ADOF26A = 2687 + INTEGER(IntKi), PARAMETER :: B8ADOF27A = 2688 + INTEGER(IntKi), PARAMETER :: B8ADOF28A = 2689 + INTEGER(IntKi), PARAMETER :: B8ADOF29A = 2690 + INTEGER(IntKi), PARAMETER :: B8ADOF30A = 2691 + INTEGER(IntKi), PARAMETER :: B8ADOF31A = 2692 + INTEGER(IntKi), PARAMETER :: B8ADOF32A = 2693 + INTEGER(IntKi), PARAMETER :: B8ADOF33A = 2694 + INTEGER(IntKi), PARAMETER :: B8ADOF34A = 2695 + INTEGER(IntKi), PARAMETER :: B8ADOF35A = 2696 + INTEGER(IntKi), PARAMETER :: B8ADOF36A = 2697 + INTEGER(IntKi), PARAMETER :: B8ADOF37A = 2698 + INTEGER(IntKi), PARAMETER :: B8ADOF38A = 2699 + INTEGER(IntKi), PARAMETER :: B8ADOF39A = 2700 + INTEGER(IntKi), PARAMETER :: B8ADOF40A = 2701 + INTEGER(IntKi), PARAMETER :: B8ADOF41A = 2702 + INTEGER(IntKi), PARAMETER :: B8ADOF42A = 2703 + INTEGER(IntKi), PARAMETER :: B8ADOF43A = 2704 + INTEGER(IntKi), PARAMETER :: B8ADOF44A = 2705 + INTEGER(IntKi), PARAMETER :: B8ADOF45A = 2706 + INTEGER(IntKi), PARAMETER :: B8ADOF46A = 2707 + INTEGER(IntKi), PARAMETER :: B8ADOF47A = 2708 + INTEGER(IntKi), PARAMETER :: B8ADOF48A = 2709 + INTEGER(IntKi), PARAMETER :: B8ADOF49A = 2710 + INTEGER(IntKi), PARAMETER :: B8ADOF50A = 2711 + INTEGER(IntKi), PARAMETER :: B8ADOF51A = 2712 + INTEGER(IntKi), PARAMETER :: B8ADOF52A = 2713 + INTEGER(IntKi), PARAMETER :: B8ADOF53A = 2714 + INTEGER(IntKi), PARAMETER :: B8ADOF54A = 2715 + INTEGER(IntKi), PARAMETER :: B8ADOF55A = 2716 + INTEGER(IntKi), PARAMETER :: B8ADOF56A = 2717 + INTEGER(IntKi), PARAMETER :: B8ADOF57A = 2718 + INTEGER(IntKi), PARAMETER :: B8ADOF58A = 2719 + INTEGER(IntKi), PARAMETER :: B8ADOF59A = 2720 + INTEGER(IntKi), PARAMETER :: B8ADOF60A = 2721 + INTEGER(IntKi), PARAMETER :: B8ADOF61A = 2722 + INTEGER(IntKi), PARAMETER :: B8ADOF62A = 2723 + INTEGER(IntKi), PARAMETER :: B8ADOF63A = 2724 + INTEGER(IntKi), PARAMETER :: B8ADOF64A = 2725 + INTEGER(IntKi), PARAMETER :: B8ADOF65A = 2726 + INTEGER(IntKi), PARAMETER :: B8ADOF66A = 2727 + INTEGER(IntKi), PARAMETER :: B8ADOF67A = 2728 + INTEGER(IntKi), PARAMETER :: B8ADOF68A = 2729 + INTEGER(IntKi), PARAMETER :: B8ADOF69A = 2730 + INTEGER(IntKi), PARAMETER :: B8ADOF70A = 2731 + INTEGER(IntKi), PARAMETER :: B8ADOF71A = 2732 + INTEGER(IntKi), PARAMETER :: B8ADOF72A = 2733 + INTEGER(IntKi), PARAMETER :: B8ADOF73A = 2734 + INTEGER(IntKi), PARAMETER :: B8ADOF74A = 2735 + INTEGER(IntKi), PARAMETER :: B8ADOF75A = 2736 + INTEGER(IntKi), PARAMETER :: B8ADOF76A = 2737 + INTEGER(IntKi), PARAMETER :: B8ADOF77A = 2738 + INTEGER(IntKi), PARAMETER :: B8ADOF78A = 2739 + INTEGER(IntKi), PARAMETER :: B8ADOF79A = 2740 + INTEGER(IntKi), PARAMETER :: B8ADOF80A = 2741 + INTEGER(IntKi), PARAMETER :: B8ADOF81A = 2742 + INTEGER(IntKi), PARAMETER :: B8ADOF82A = 2743 + INTEGER(IntKi), PARAMETER :: B8ADOF83A = 2744 + INTEGER(IntKi), PARAMETER :: B8ADOF84A = 2745 + INTEGER(IntKi), PARAMETER :: B8ADOF85A = 2746 + INTEGER(IntKi), PARAMETER :: B8ADOF86A = 2747 + INTEGER(IntKi), PARAMETER :: B8ADOF87A = 2748 + INTEGER(IntKi), PARAMETER :: B8ADOF88A = 2749 + INTEGER(IntKi), PARAMETER :: B8ADOF89A = 2750 + INTEGER(IntKi), PARAMETER :: B8ADOF90A = 2751 + INTEGER(IntKi), PARAMETER :: B8ADOF91A = 2752 + INTEGER(IntKi), PARAMETER :: B8ADOF92A = 2753 + INTEGER(IntKi), PARAMETER :: B8ADOF93A = 2754 + INTEGER(IntKi), PARAMETER :: B8ADOF94A = 2755 + INTEGER(IntKi), PARAMETER :: B8ADOF95A = 2756 + INTEGER(IntKi), PARAMETER :: B8ADOF96A = 2757 + INTEGER(IntKi), PARAMETER :: B8ADOF97A = 2758 + INTEGER(IntKi), PARAMETER :: B8ADOF98A = 2759 + INTEGER(IntKi), PARAMETER :: B8ADOF99A = 2760 + INTEGER(IntKi), PARAMETER :: B9ADOF1A = 2761 + INTEGER(IntKi), PARAMETER :: B9ADOF2A = 2762 + INTEGER(IntKi), PARAMETER :: B9ADOF3A = 2763 + INTEGER(IntKi), PARAMETER :: B9ADOF4A = 2764 + INTEGER(IntKi), PARAMETER :: B9ADOF5A = 2765 + INTEGER(IntKi), PARAMETER :: B9ADOF6A = 2766 + INTEGER(IntKi), PARAMETER :: B9ADOF7A = 2767 + INTEGER(IntKi), PARAMETER :: B9ADOF8A = 2768 + INTEGER(IntKi), PARAMETER :: B9ADOF9A = 2769 + INTEGER(IntKi), PARAMETER :: B9ADOF10A = 2770 + INTEGER(IntKi), PARAMETER :: B9ADOF11A = 2771 + INTEGER(IntKi), PARAMETER :: B9ADOF12A = 2772 + INTEGER(IntKi), PARAMETER :: B9ADOF13A = 2773 + INTEGER(IntKi), PARAMETER :: B9ADOF14A = 2774 + INTEGER(IntKi), PARAMETER :: B9ADOF15A = 2775 + INTEGER(IntKi), PARAMETER :: B9ADOF16A = 2776 + INTEGER(IntKi), PARAMETER :: B9ADOF17A = 2777 + INTEGER(IntKi), PARAMETER :: B9ADOF18A = 2778 + INTEGER(IntKi), PARAMETER :: B9ADOF19A = 2779 + INTEGER(IntKi), PARAMETER :: B9ADOF20A = 2780 + INTEGER(IntKi), PARAMETER :: B9ADOF21A = 2781 + INTEGER(IntKi), PARAMETER :: B9ADOF22A = 2782 + INTEGER(IntKi), PARAMETER :: B9ADOF23A = 2783 + INTEGER(IntKi), PARAMETER :: B9ADOF24A = 2784 + INTEGER(IntKi), PARAMETER :: B9ADOF25A = 2785 + INTEGER(IntKi), PARAMETER :: B9ADOF26A = 2786 + INTEGER(IntKi), PARAMETER :: B9ADOF27A = 2787 + INTEGER(IntKi), PARAMETER :: B9ADOF28A = 2788 + INTEGER(IntKi), PARAMETER :: B9ADOF29A = 2789 + INTEGER(IntKi), PARAMETER :: B9ADOF30A = 2790 + INTEGER(IntKi), PARAMETER :: B9ADOF31A = 2791 + INTEGER(IntKi), PARAMETER :: B9ADOF32A = 2792 + INTEGER(IntKi), PARAMETER :: B9ADOF33A = 2793 + INTEGER(IntKi), PARAMETER :: B9ADOF34A = 2794 + INTEGER(IntKi), PARAMETER :: B9ADOF35A = 2795 + INTEGER(IntKi), PARAMETER :: B9ADOF36A = 2796 + INTEGER(IntKi), PARAMETER :: B9ADOF37A = 2797 + INTEGER(IntKi), PARAMETER :: B9ADOF38A = 2798 + INTEGER(IntKi), PARAMETER :: B9ADOF39A = 2799 + INTEGER(IntKi), PARAMETER :: B9ADOF40A = 2800 + INTEGER(IntKi), PARAMETER :: B9ADOF41A = 2801 + INTEGER(IntKi), PARAMETER :: B9ADOF42A = 2802 + INTEGER(IntKi), PARAMETER :: B9ADOF43A = 2803 + INTEGER(IntKi), PARAMETER :: B9ADOF44A = 2804 + INTEGER(IntKi), PARAMETER :: B9ADOF45A = 2805 + INTEGER(IntKi), PARAMETER :: B9ADOF46A = 2806 + INTEGER(IntKi), PARAMETER :: B9ADOF47A = 2807 + INTEGER(IntKi), PARAMETER :: B9ADOF48A = 2808 + INTEGER(IntKi), PARAMETER :: B9ADOF49A = 2809 + INTEGER(IntKi), PARAMETER :: B9ADOF50A = 2810 + INTEGER(IntKi), PARAMETER :: B9ADOF51A = 2811 + INTEGER(IntKi), PARAMETER :: B9ADOF52A = 2812 + INTEGER(IntKi), PARAMETER :: B9ADOF53A = 2813 + INTEGER(IntKi), PARAMETER :: B9ADOF54A = 2814 + INTEGER(IntKi), PARAMETER :: B9ADOF55A = 2815 + INTEGER(IntKi), PARAMETER :: B9ADOF56A = 2816 + INTEGER(IntKi), PARAMETER :: B9ADOF57A = 2817 + INTEGER(IntKi), PARAMETER :: B9ADOF58A = 2818 + INTEGER(IntKi), PARAMETER :: B9ADOF59A = 2819 + INTEGER(IntKi), PARAMETER :: B9ADOF60A = 2820 + INTEGER(IntKi), PARAMETER :: B9ADOF61A = 2821 + INTEGER(IntKi), PARAMETER :: B9ADOF62A = 2822 + INTEGER(IntKi), PARAMETER :: B9ADOF63A = 2823 + INTEGER(IntKi), PARAMETER :: B9ADOF64A = 2824 + INTEGER(IntKi), PARAMETER :: B9ADOF65A = 2825 + INTEGER(IntKi), PARAMETER :: B9ADOF66A = 2826 + INTEGER(IntKi), PARAMETER :: B9ADOF67A = 2827 + INTEGER(IntKi), PARAMETER :: B9ADOF68A = 2828 + INTEGER(IntKi), PARAMETER :: B9ADOF69A = 2829 + INTEGER(IntKi), PARAMETER :: B9ADOF70A = 2830 + INTEGER(IntKi), PARAMETER :: B9ADOF71A = 2831 + INTEGER(IntKi), PARAMETER :: B9ADOF72A = 2832 + INTEGER(IntKi), PARAMETER :: B9ADOF73A = 2833 + INTEGER(IntKi), PARAMETER :: B9ADOF74A = 2834 + INTEGER(IntKi), PARAMETER :: B9ADOF75A = 2835 + INTEGER(IntKi), PARAMETER :: B9ADOF76A = 2836 + INTEGER(IntKi), PARAMETER :: B9ADOF77A = 2837 + INTEGER(IntKi), PARAMETER :: B9ADOF78A = 2838 + INTEGER(IntKi), PARAMETER :: B9ADOF79A = 2839 + INTEGER(IntKi), PARAMETER :: B9ADOF80A = 2840 + INTEGER(IntKi), PARAMETER :: B9ADOF81A = 2841 + INTEGER(IntKi), PARAMETER :: B9ADOF82A = 2842 + INTEGER(IntKi), PARAMETER :: B9ADOF83A = 2843 + INTEGER(IntKi), PARAMETER :: B9ADOF84A = 2844 + INTEGER(IntKi), PARAMETER :: B9ADOF85A = 2845 + INTEGER(IntKi), PARAMETER :: B9ADOF86A = 2846 + INTEGER(IntKi), PARAMETER :: B9ADOF87A = 2847 + INTEGER(IntKi), PARAMETER :: B9ADOF88A = 2848 + INTEGER(IntKi), PARAMETER :: B9ADOF89A = 2849 + INTEGER(IntKi), PARAMETER :: B9ADOF90A = 2850 + INTEGER(IntKi), PARAMETER :: B9ADOF91A = 2851 + INTEGER(IntKi), PARAMETER :: B9ADOF92A = 2852 + INTEGER(IntKi), PARAMETER :: B9ADOF93A = 2853 + INTEGER(IntKi), PARAMETER :: B9ADOF94A = 2854 + INTEGER(IntKi), PARAMETER :: B9ADOF95A = 2855 + INTEGER(IntKi), PARAMETER :: B9ADOF96A = 2856 + INTEGER(IntKi), PARAMETER :: B9ADOF97A = 2857 + INTEGER(IntKi), PARAMETER :: B9ADOF98A = 2858 + INTEGER(IntKi), PARAMETER :: B9ADOF99A = 2859 ! WAMIT Body Forces: - INTEGER(IntKi), PARAMETER :: B1AddFxi = 187 - INTEGER(IntKi), PARAMETER :: B1AddFyi = 188 - INTEGER(IntKi), PARAMETER :: B1AddFzi = 189 - INTEGER(IntKi), PARAMETER :: B1AddMxi = 190 - INTEGER(IntKi), PARAMETER :: B1AddMyi = 191 - INTEGER(IntKi), PARAMETER :: B1AddMzi = 192 - INTEGER(IntKi), PARAMETER :: B1WvsF1xi = 193 - INTEGER(IntKi), PARAMETER :: B1WvsF1yi = 194 - INTEGER(IntKi), PARAMETER :: B1WvsF1zi = 195 - INTEGER(IntKi), PARAMETER :: B1WvsM1xi = 196 - INTEGER(IntKi), PARAMETER :: B1WvsM1yi = 197 - INTEGER(IntKi), PARAMETER :: B1WvsM1zi = 198 - INTEGER(IntKi), PARAMETER :: B1WvsFxi = 199 - INTEGER(IntKi), PARAMETER :: B1WvsFyi = 200 - INTEGER(IntKi), PARAMETER :: B1WvsFzi = 201 - INTEGER(IntKi), PARAMETER :: B1WvsMxi = 202 - INTEGER(IntKi), PARAMETER :: B1WvsMyi = 203 - INTEGER(IntKi), PARAMETER :: B1WvsMzi = 204 - INTEGER(IntKi), PARAMETER :: B1HdSFxi = 205 - INTEGER(IntKi), PARAMETER :: B1HdSFyi = 206 - INTEGER(IntKi), PARAMETER :: B1HdSFzi = 207 - INTEGER(IntKi), PARAMETER :: B1HdSMxi = 208 - INTEGER(IntKi), PARAMETER :: B1HdSMyi = 209 - INTEGER(IntKi), PARAMETER :: B1HdSMzi = 210 - INTEGER(IntKi), PARAMETER :: B1RdtFxi = 211 - INTEGER(IntKi), PARAMETER :: B1RdtFyi = 212 - INTEGER(IntKi), PARAMETER :: B1RdtFzi = 213 - INTEGER(IntKi), PARAMETER :: B1RdtMxi = 214 - INTEGER(IntKi), PARAMETER :: B1RdtMyi = 215 - INTEGER(IntKi), PARAMETER :: B1RdtMzi = 216 - INTEGER(IntKi), PARAMETER :: B2AddFxi = 217 - INTEGER(IntKi), PARAMETER :: B2AddFyi = 218 - INTEGER(IntKi), PARAMETER :: B2AddFzi = 219 - INTEGER(IntKi), PARAMETER :: B2AddMxi = 220 - INTEGER(IntKi), PARAMETER :: B2AddMyi = 221 - INTEGER(IntKi), PARAMETER :: B2AddMzi = 222 - INTEGER(IntKi), PARAMETER :: B2WvsF1xi = 223 - INTEGER(IntKi), PARAMETER :: B2WvsF1yi = 224 - INTEGER(IntKi), PARAMETER :: B2WvsF1zi = 225 - INTEGER(IntKi), PARAMETER :: B2WvsM1xi = 226 - INTEGER(IntKi), PARAMETER :: B2WvsM1yi = 227 - INTEGER(IntKi), PARAMETER :: B2WvsM1zi = 228 - INTEGER(IntKi), PARAMETER :: B2WvsFxi = 229 - INTEGER(IntKi), PARAMETER :: B2WvsFyi = 230 - INTEGER(IntKi), PARAMETER :: B2WvsFzi = 231 - INTEGER(IntKi), PARAMETER :: B2WvsMxi = 232 - INTEGER(IntKi), PARAMETER :: B2WvsMyi = 233 - INTEGER(IntKi), PARAMETER :: B2WvsMzi = 234 - INTEGER(IntKi), PARAMETER :: B2HdSFxi = 235 - INTEGER(IntKi), PARAMETER :: B2HdSFyi = 236 - INTEGER(IntKi), PARAMETER :: B2HdSFzi = 237 - INTEGER(IntKi), PARAMETER :: B2HdSMxi = 238 - INTEGER(IntKi), PARAMETER :: B2HdSMyi = 239 - INTEGER(IntKi), PARAMETER :: B2HdSMzi = 240 - INTEGER(IntKi), PARAMETER :: B2RdtFxi = 241 - INTEGER(IntKi), PARAMETER :: B2RdtFyi = 242 - INTEGER(IntKi), PARAMETER :: B2RdtFzi = 243 - INTEGER(IntKi), PARAMETER :: B2RdtMxi = 244 - INTEGER(IntKi), PARAMETER :: B2RdtMyi = 245 - INTEGER(IntKi), PARAMETER :: B2RdtMzi = 246 - INTEGER(IntKi), PARAMETER :: B3AddFxi = 247 - INTEGER(IntKi), PARAMETER :: B3AddFyi = 248 - INTEGER(IntKi), PARAMETER :: B3AddFzi = 249 - INTEGER(IntKi), PARAMETER :: B3AddMxi = 250 - INTEGER(IntKi), PARAMETER :: B3AddMyi = 251 - INTEGER(IntKi), PARAMETER :: B3AddMzi = 252 - INTEGER(IntKi), PARAMETER :: B3WvsF1xi = 253 - INTEGER(IntKi), PARAMETER :: B3WvsF1yi = 254 - INTEGER(IntKi), PARAMETER :: B3WvsF1zi = 255 - INTEGER(IntKi), PARAMETER :: B3WvsM1xi = 256 - INTEGER(IntKi), PARAMETER :: B3WvsM1yi = 257 - INTEGER(IntKi), PARAMETER :: B3WvsM1zi = 258 - INTEGER(IntKi), PARAMETER :: B3WvsFxi = 259 - INTEGER(IntKi), PARAMETER :: B3WvsFyi = 260 - INTEGER(IntKi), PARAMETER :: B3WvsFzi = 261 - INTEGER(IntKi), PARAMETER :: B3WvsMxi = 262 - INTEGER(IntKi), PARAMETER :: B3WvsMyi = 263 - INTEGER(IntKi), PARAMETER :: B3WvsMzi = 264 - INTEGER(IntKi), PARAMETER :: B3HdSFxi = 265 - INTEGER(IntKi), PARAMETER :: B3HdSFyi = 266 - INTEGER(IntKi), PARAMETER :: B3HdSFzi = 267 - INTEGER(IntKi), PARAMETER :: B3HdSMxi = 268 - INTEGER(IntKi), PARAMETER :: B3HdSMyi = 269 - INTEGER(IntKi), PARAMETER :: B3HdSMzi = 270 - INTEGER(IntKi), PARAMETER :: B3RdtFxi = 271 - INTEGER(IntKi), PARAMETER :: B3RdtFyi = 272 - INTEGER(IntKi), PARAMETER :: B3RdtFzi = 273 - INTEGER(IntKi), PARAMETER :: B3RdtMxi = 274 - INTEGER(IntKi), PARAMETER :: B3RdtMyi = 275 - INTEGER(IntKi), PARAMETER :: B3RdtMzi = 276 - INTEGER(IntKi), PARAMETER :: B4AddFxi = 277 - INTEGER(IntKi), PARAMETER :: B4AddFyi = 278 - INTEGER(IntKi), PARAMETER :: B4AddFzi = 279 - INTEGER(IntKi), PARAMETER :: B4AddMxi = 280 - INTEGER(IntKi), PARAMETER :: B4AddMyi = 281 - INTEGER(IntKi), PARAMETER :: B4AddMzi = 282 - INTEGER(IntKi), PARAMETER :: B4WvsF1xi = 283 - INTEGER(IntKi), PARAMETER :: B4WvsF1yi = 284 - INTEGER(IntKi), PARAMETER :: B4WvsF1zi = 285 - INTEGER(IntKi), PARAMETER :: B4WvsM1xi = 286 - INTEGER(IntKi), PARAMETER :: B4WvsM1yi = 287 - INTEGER(IntKi), PARAMETER :: B4WvsM1zi = 288 - INTEGER(IntKi), PARAMETER :: B4WvsFxi = 289 - INTEGER(IntKi), PARAMETER :: B4WvsFyi = 290 - INTEGER(IntKi), PARAMETER :: B4WvsFzi = 291 - INTEGER(IntKi), PARAMETER :: B4WvsMxi = 292 - INTEGER(IntKi), PARAMETER :: B4WvsMyi = 293 - INTEGER(IntKi), PARAMETER :: B4WvsMzi = 294 - INTEGER(IntKi), PARAMETER :: B4HdSFxi = 295 - INTEGER(IntKi), PARAMETER :: B4HdSFyi = 296 - INTEGER(IntKi), PARAMETER :: B4HdSFzi = 297 - INTEGER(IntKi), PARAMETER :: B4HdSMxi = 298 - INTEGER(IntKi), PARAMETER :: B4HdSMyi = 299 - INTEGER(IntKi), PARAMETER :: B4HdSMzi = 300 - INTEGER(IntKi), PARAMETER :: B4RdtFxi = 301 - INTEGER(IntKi), PARAMETER :: B4RdtFyi = 302 - INTEGER(IntKi), PARAMETER :: B4RdtFzi = 303 - INTEGER(IntKi), PARAMETER :: B4RdtMxi = 304 - INTEGER(IntKi), PARAMETER :: B4RdtMyi = 305 - INTEGER(IntKi), PARAMETER :: B4RdtMzi = 306 - INTEGER(IntKi), PARAMETER :: B5AddFxi = 307 - INTEGER(IntKi), PARAMETER :: B5AddFyi = 308 - INTEGER(IntKi), PARAMETER :: B5AddFzi = 309 - INTEGER(IntKi), PARAMETER :: B5AddMxi = 310 - INTEGER(IntKi), PARAMETER :: B5AddMyi = 311 - INTEGER(IntKi), PARAMETER :: B5AddMzi = 312 - INTEGER(IntKi), PARAMETER :: B5WvsF1xi = 313 - INTEGER(IntKi), PARAMETER :: B5WvsF1yi = 314 - INTEGER(IntKi), PARAMETER :: B5WvsF1zi = 315 - INTEGER(IntKi), PARAMETER :: B5WvsM1xi = 316 - INTEGER(IntKi), PARAMETER :: B5WvsM1yi = 317 - INTEGER(IntKi), PARAMETER :: B5WvsM1zi = 318 - INTEGER(IntKi), PARAMETER :: B5WvsFxi = 319 - INTEGER(IntKi), PARAMETER :: B5WvsFyi = 320 - INTEGER(IntKi), PARAMETER :: B5WvsFzi = 321 - INTEGER(IntKi), PARAMETER :: B5WvsMxi = 322 - INTEGER(IntKi), PARAMETER :: B5WvsMyi = 323 - INTEGER(IntKi), PARAMETER :: B5WvsMzi = 324 - INTEGER(IntKi), PARAMETER :: B5HdSFxi = 325 - INTEGER(IntKi), PARAMETER :: B5HdSFyi = 326 - INTEGER(IntKi), PARAMETER :: B5HdSFzi = 327 - INTEGER(IntKi), PARAMETER :: B5HdSMxi = 328 - INTEGER(IntKi), PARAMETER :: B5HdSMyi = 329 - INTEGER(IntKi), PARAMETER :: B5HdSMzi = 330 - INTEGER(IntKi), PARAMETER :: B5RdtFxi = 331 - INTEGER(IntKi), PARAMETER :: B5RdtFyi = 332 - INTEGER(IntKi), PARAMETER :: B5RdtFzi = 333 - INTEGER(IntKi), PARAMETER :: B5RdtMxi = 334 - INTEGER(IntKi), PARAMETER :: B5RdtMyi = 335 - INTEGER(IntKi), PARAMETER :: B5RdtMzi = 336 - INTEGER(IntKi), PARAMETER :: B6AddFxi = 337 - INTEGER(IntKi), PARAMETER :: B6AddFyi = 338 - INTEGER(IntKi), PARAMETER :: B6AddFzi = 339 - INTEGER(IntKi), PARAMETER :: B6AddMxi = 340 - INTEGER(IntKi), PARAMETER :: B6AddMyi = 341 - INTEGER(IntKi), PARAMETER :: B6AddMzi = 342 - INTEGER(IntKi), PARAMETER :: B6WvsF1xi = 343 - INTEGER(IntKi), PARAMETER :: B6WvsF1yi = 344 - INTEGER(IntKi), PARAMETER :: B6WvsF1zi = 345 - INTEGER(IntKi), PARAMETER :: B6WvsM1xi = 346 - INTEGER(IntKi), PARAMETER :: B6WvsM1yi = 347 - INTEGER(IntKi), PARAMETER :: B6WvsM1zi = 348 - INTEGER(IntKi), PARAMETER :: B6WvsFxi = 349 - INTEGER(IntKi), PARAMETER :: B6WvsFyi = 350 - INTEGER(IntKi), PARAMETER :: B6WvsFzi = 351 - INTEGER(IntKi), PARAMETER :: B6WvsMxi = 352 - INTEGER(IntKi), PARAMETER :: B6WvsMyi = 353 - INTEGER(IntKi), PARAMETER :: B6WvsMzi = 354 - INTEGER(IntKi), PARAMETER :: B6HdSFxi = 355 - INTEGER(IntKi), PARAMETER :: B6HdSFyi = 356 - INTEGER(IntKi), PARAMETER :: B6HdSFzi = 357 - INTEGER(IntKi), PARAMETER :: B6HdSMxi = 358 - INTEGER(IntKi), PARAMETER :: B6HdSMyi = 359 - INTEGER(IntKi), PARAMETER :: B6HdSMzi = 360 - INTEGER(IntKi), PARAMETER :: B6RdtFxi = 361 - INTEGER(IntKi), PARAMETER :: B6RdtFyi = 362 - INTEGER(IntKi), PARAMETER :: B6RdtFzi = 363 - INTEGER(IntKi), PARAMETER :: B6RdtMxi = 364 - INTEGER(IntKi), PARAMETER :: B6RdtMyi = 365 - INTEGER(IntKi), PARAMETER :: B6RdtMzi = 366 - INTEGER(IntKi), PARAMETER :: B7AddFxi = 367 - INTEGER(IntKi), PARAMETER :: B7AddFyi = 368 - INTEGER(IntKi), PARAMETER :: B7AddFzi = 369 - INTEGER(IntKi), PARAMETER :: B7AddMxi = 370 - INTEGER(IntKi), PARAMETER :: B7AddMyi = 371 - INTEGER(IntKi), PARAMETER :: B7AddMzi = 372 - INTEGER(IntKi), PARAMETER :: B7WvsF1xi = 373 - INTEGER(IntKi), PARAMETER :: B7WvsF1yi = 374 - INTEGER(IntKi), PARAMETER :: B7WvsF1zi = 375 - INTEGER(IntKi), PARAMETER :: B7WvsM1xi = 376 - INTEGER(IntKi), PARAMETER :: B7WvsM1yi = 377 - INTEGER(IntKi), PARAMETER :: B7WvsM1zi = 378 - INTEGER(IntKi), PARAMETER :: B7WvsFxi = 379 - INTEGER(IntKi), PARAMETER :: B7WvsFyi = 380 - INTEGER(IntKi), PARAMETER :: B7WvsFzi = 381 - INTEGER(IntKi), PARAMETER :: B7WvsMxi = 382 - INTEGER(IntKi), PARAMETER :: B7WvsMyi = 383 - INTEGER(IntKi), PARAMETER :: B7WvsMzi = 384 - INTEGER(IntKi), PARAMETER :: B7HdSFxi = 385 - INTEGER(IntKi), PARAMETER :: B7HdSFyi = 386 - INTEGER(IntKi), PARAMETER :: B7HdSFzi = 387 - INTEGER(IntKi), PARAMETER :: B7HdSMxi = 388 - INTEGER(IntKi), PARAMETER :: B7HdSMyi = 389 - INTEGER(IntKi), PARAMETER :: B7HdSMzi = 390 - INTEGER(IntKi), PARAMETER :: B7RdtFxi = 391 - INTEGER(IntKi), PARAMETER :: B7RdtFyi = 392 - INTEGER(IntKi), PARAMETER :: B7RdtFzi = 393 - INTEGER(IntKi), PARAMETER :: B7RdtMxi = 394 - INTEGER(IntKi), PARAMETER :: B7RdtMyi = 395 - INTEGER(IntKi), PARAMETER :: B7RdtMzi = 396 - INTEGER(IntKi), PARAMETER :: B8AddFxi = 397 - INTEGER(IntKi), PARAMETER :: B8AddFyi = 398 - INTEGER(IntKi), PARAMETER :: B8AddFzi = 399 - INTEGER(IntKi), PARAMETER :: B8AddMxi = 400 - INTEGER(IntKi), PARAMETER :: B8AddMyi = 401 - INTEGER(IntKi), PARAMETER :: B8AddMzi = 402 - INTEGER(IntKi), PARAMETER :: B8WvsF1xi = 403 - INTEGER(IntKi), PARAMETER :: B8WvsF1yi = 404 - INTEGER(IntKi), PARAMETER :: B8WvsF1zi = 405 - INTEGER(IntKi), PARAMETER :: B8WvsM1xi = 406 - INTEGER(IntKi), PARAMETER :: B8WvsM1yi = 407 - INTEGER(IntKi), PARAMETER :: B8WvsM1zi = 408 - INTEGER(IntKi), PARAMETER :: B8WvsFxi = 409 - INTEGER(IntKi), PARAMETER :: B8WvsFyi = 410 - INTEGER(IntKi), PARAMETER :: B8WvsFzi = 411 - INTEGER(IntKi), PARAMETER :: B8WvsMxi = 412 - INTEGER(IntKi), PARAMETER :: B8WvsMyi = 413 - INTEGER(IntKi), PARAMETER :: B8WvsMzi = 414 - INTEGER(IntKi), PARAMETER :: B8HdSFxi = 415 - INTEGER(IntKi), PARAMETER :: B8HdSFyi = 416 - INTEGER(IntKi), PARAMETER :: B8HdSFzi = 417 - INTEGER(IntKi), PARAMETER :: B8HdSMxi = 418 - INTEGER(IntKi), PARAMETER :: B8HdSMyi = 419 - INTEGER(IntKi), PARAMETER :: B8HdSMzi = 420 - INTEGER(IntKi), PARAMETER :: B8RdtFxi = 421 - INTEGER(IntKi), PARAMETER :: B8RdtFyi = 422 - INTEGER(IntKi), PARAMETER :: B8RdtFzi = 423 - INTEGER(IntKi), PARAMETER :: B8RdtMxi = 424 - INTEGER(IntKi), PARAMETER :: B8RdtMyi = 425 - INTEGER(IntKi), PARAMETER :: B8RdtMzi = 426 - INTEGER(IntKi), PARAMETER :: B9AddFxi = 427 - INTEGER(IntKi), PARAMETER :: B9AddFyi = 428 - INTEGER(IntKi), PARAMETER :: B9AddFzi = 429 - INTEGER(IntKi), PARAMETER :: B9AddMxi = 430 - INTEGER(IntKi), PARAMETER :: B9AddMyi = 431 - INTEGER(IntKi), PARAMETER :: B9AddMzi = 432 - INTEGER(IntKi), PARAMETER :: B9WvsF1xi = 433 - INTEGER(IntKi), PARAMETER :: B9WvsF1yi = 434 - INTEGER(IntKi), PARAMETER :: B9WvsF1zi = 435 - INTEGER(IntKi), PARAMETER :: B9WvsM1xi = 436 - INTEGER(IntKi), PARAMETER :: B9WvsM1yi = 437 - INTEGER(IntKi), PARAMETER :: B9WvsM1zi = 438 - INTEGER(IntKi), PARAMETER :: B9WvsFxi = 439 - INTEGER(IntKi), PARAMETER :: B9WvsFyi = 440 - INTEGER(IntKi), PARAMETER :: B9WvsFzi = 441 - INTEGER(IntKi), PARAMETER :: B9WvsMxi = 442 - INTEGER(IntKi), PARAMETER :: B9WvsMyi = 443 - INTEGER(IntKi), PARAMETER :: B9WvsMzi = 444 - INTEGER(IntKi), PARAMETER :: B9HdSFxi = 445 - INTEGER(IntKi), PARAMETER :: B9HdSFyi = 446 - INTEGER(IntKi), PARAMETER :: B9HdSFzi = 447 - INTEGER(IntKi), PARAMETER :: B9HdSMxi = 448 - INTEGER(IntKi), PARAMETER :: B9HdSMyi = 449 - INTEGER(IntKi), PARAMETER :: B9HdSMzi = 450 - INTEGER(IntKi), PARAMETER :: B9RdtFxi = 451 - INTEGER(IntKi), PARAMETER :: B9RdtFyi = 452 - INTEGER(IntKi), PARAMETER :: B9RdtFzi = 453 - INTEGER(IntKi), PARAMETER :: B9RdtMxi = 454 - INTEGER(IntKi), PARAMETER :: B9RdtMyi = 455 - INTEGER(IntKi), PARAMETER :: B9RdtMzi = 456 - INTEGER(IntKi), PARAMETER :: B1WvsF2xi = 457 - INTEGER(IntKi), PARAMETER :: B1WvsF2yi = 458 - INTEGER(IntKi), PARAMETER :: B1WvsF2zi = 459 - INTEGER(IntKi), PARAMETER :: B1WvsM2xi = 460 - INTEGER(IntKi), PARAMETER :: B1WvsM2yi = 461 - INTEGER(IntKi), PARAMETER :: B1WvsM2zi = 462 - INTEGER(IntKi), PARAMETER :: B2WvsF2xi = 463 - INTEGER(IntKi), PARAMETER :: B2WvsF2yi = 464 - INTEGER(IntKi), PARAMETER :: B2WvsF2zi = 465 - INTEGER(IntKi), PARAMETER :: B2WvsM2xi = 466 - INTEGER(IntKi), PARAMETER :: B2WvsM2yi = 467 - INTEGER(IntKi), PARAMETER :: B2WvsM2zi = 468 - INTEGER(IntKi), PARAMETER :: B3WvsF2xi = 469 - INTEGER(IntKi), PARAMETER :: B3WvsF2yi = 470 - INTEGER(IntKi), PARAMETER :: B3WvsF2zi = 471 - INTEGER(IntKi), PARAMETER :: B3WvsM2xi = 472 - INTEGER(IntKi), PARAMETER :: B3WvsM2yi = 473 - INTEGER(IntKi), PARAMETER :: B3WvsM2zi = 474 - INTEGER(IntKi), PARAMETER :: B4WvsF2xi = 475 - INTEGER(IntKi), PARAMETER :: B4WvsF2yi = 476 - INTEGER(IntKi), PARAMETER :: B4WvsF2zi = 477 - INTEGER(IntKi), PARAMETER :: B4WvsM2xi = 478 - INTEGER(IntKi), PARAMETER :: B4WvsM2yi = 479 - INTEGER(IntKi), PARAMETER :: B4WvsM2zi = 480 - INTEGER(IntKi), PARAMETER :: B5WvsF2xi = 481 - INTEGER(IntKi), PARAMETER :: B5WvsF2yi = 482 - INTEGER(IntKi), PARAMETER :: B5WvsF2zi = 483 - INTEGER(IntKi), PARAMETER :: B5WvsM2xi = 484 - INTEGER(IntKi), PARAMETER :: B5WvsM2yi = 485 - INTEGER(IntKi), PARAMETER :: B5WvsM2zi = 486 - INTEGER(IntKi), PARAMETER :: B6WvsF2xi = 487 - INTEGER(IntKi), PARAMETER :: B6WvsF2yi = 488 - INTEGER(IntKi), PARAMETER :: B6WvsF2zi = 489 - INTEGER(IntKi), PARAMETER :: B6WvsM2xi = 490 - INTEGER(IntKi), PARAMETER :: B6WvsM2yi = 491 - INTEGER(IntKi), PARAMETER :: B6WvsM2zi = 492 - INTEGER(IntKi), PARAMETER :: B7WvsF2xi = 493 - INTEGER(IntKi), PARAMETER :: B7WvsF2yi = 494 - INTEGER(IntKi), PARAMETER :: B7WvsF2zi = 495 - INTEGER(IntKi), PARAMETER :: B7WvsM2xi = 496 - INTEGER(IntKi), PARAMETER :: B7WvsM2yi = 497 - INTEGER(IntKi), PARAMETER :: B7WvsM2zi = 498 - INTEGER(IntKi), PARAMETER :: B8WvsF2xi = 499 - INTEGER(IntKi), PARAMETER :: B8WvsF2yi = 500 - INTEGER(IntKi), PARAMETER :: B8WvsF2zi = 501 - INTEGER(IntKi), PARAMETER :: B8WvsM2xi = 502 - INTEGER(IntKi), PARAMETER :: B8WvsM2yi = 503 - INTEGER(IntKi), PARAMETER :: B8WvsM2zi = 504 - INTEGER(IntKi), PARAMETER :: B9WvsF2xi = 505 - INTEGER(IntKi), PARAMETER :: B9WvsF2yi = 506 - INTEGER(IntKi), PARAMETER :: B9WvsF2zi = 507 - INTEGER(IntKi), PARAMETER :: B9WvsM2xi = 508 - INTEGER(IntKi), PARAMETER :: B9WvsM2yi = 509 - INTEGER(IntKi), PARAMETER :: B9WvsM2zi = 510 + INTEGER(IntKi), PARAMETER :: B1AddFxi = 2860 + INTEGER(IntKi), PARAMETER :: B1AddFyi = 2861 + INTEGER(IntKi), PARAMETER :: B1AddFzi = 2862 + INTEGER(IntKi), PARAMETER :: B1AddMxi = 2863 + INTEGER(IntKi), PARAMETER :: B1AddMyi = 2864 + INTEGER(IntKi), PARAMETER :: B1AddMzi = 2865 + INTEGER(IntKi), PARAMETER :: B1WvsF1xi = 2866 + INTEGER(IntKi), PARAMETER :: B1WvsF1yi = 2867 + INTEGER(IntKi), PARAMETER :: B1WvsF1zi = 2868 + INTEGER(IntKi), PARAMETER :: B1WvsM1xi = 2869 + INTEGER(IntKi), PARAMETER :: B1WvsM1yi = 2870 + INTEGER(IntKi), PARAMETER :: B1WvsM1zi = 2871 + INTEGER(IntKi), PARAMETER :: B1WvsFxi = 2872 + INTEGER(IntKi), PARAMETER :: B1WvsFyi = 2873 + INTEGER(IntKi), PARAMETER :: B1WvsFzi = 2874 + INTEGER(IntKi), PARAMETER :: B1WvsMxi = 2875 + INTEGER(IntKi), PARAMETER :: B1WvsMyi = 2876 + INTEGER(IntKi), PARAMETER :: B1WvsMzi = 2877 + INTEGER(IntKi), PARAMETER :: B1HdSFxi = 2878 + INTEGER(IntKi), PARAMETER :: B1HdSFyi = 2879 + INTEGER(IntKi), PARAMETER :: B1HdSFzi = 2880 + INTEGER(IntKi), PARAMETER :: B1HdSMxi = 2881 + INTEGER(IntKi), PARAMETER :: B1HdSMyi = 2882 + INTEGER(IntKi), PARAMETER :: B1HdSMzi = 2883 + INTEGER(IntKi), PARAMETER :: B1RdtFxi = 2884 + INTEGER(IntKi), PARAMETER :: B1RdtFyi = 2885 + INTEGER(IntKi), PARAMETER :: B1RdtFzi = 2886 + INTEGER(IntKi), PARAMETER :: B1RdtMxi = 2887 + INTEGER(IntKi), PARAMETER :: B1RdtMyi = 2888 + INTEGER(IntKi), PARAMETER :: B1RdtMzi = 2889 + INTEGER(IntKi), PARAMETER :: B2AddFxi = 2890 + INTEGER(IntKi), PARAMETER :: B2AddFyi = 2891 + INTEGER(IntKi), PARAMETER :: B2AddFzi = 2892 + INTEGER(IntKi), PARAMETER :: B2AddMxi = 2893 + INTEGER(IntKi), PARAMETER :: B2AddMyi = 2894 + INTEGER(IntKi), PARAMETER :: B2AddMzi = 2895 + INTEGER(IntKi), PARAMETER :: B2WvsF1xi = 2896 + INTEGER(IntKi), PARAMETER :: B2WvsF1yi = 2897 + INTEGER(IntKi), PARAMETER :: B2WvsF1zi = 2898 + INTEGER(IntKi), PARAMETER :: B2WvsM1xi = 2899 + INTEGER(IntKi), PARAMETER :: B2WvsM1yi = 2900 + INTEGER(IntKi), PARAMETER :: B2WvsM1zi = 2901 + INTEGER(IntKi), PARAMETER :: B2WvsFxi = 2902 + INTEGER(IntKi), PARAMETER :: B2WvsFyi = 2903 + INTEGER(IntKi), PARAMETER :: B2WvsFzi = 2904 + INTEGER(IntKi), PARAMETER :: B2WvsMxi = 2905 + INTEGER(IntKi), PARAMETER :: B2WvsMyi = 2906 + INTEGER(IntKi), PARAMETER :: B2WvsMzi = 2907 + INTEGER(IntKi), PARAMETER :: B2HdSFxi = 2908 + INTEGER(IntKi), PARAMETER :: B2HdSFyi = 2909 + INTEGER(IntKi), PARAMETER :: B2HdSFzi = 2910 + INTEGER(IntKi), PARAMETER :: B2HdSMxi = 2911 + INTEGER(IntKi), PARAMETER :: B2HdSMyi = 2912 + INTEGER(IntKi), PARAMETER :: B2HdSMzi = 2913 + INTEGER(IntKi), PARAMETER :: B2RdtFxi = 2914 + INTEGER(IntKi), PARAMETER :: B2RdtFyi = 2915 + INTEGER(IntKi), PARAMETER :: B2RdtFzi = 2916 + INTEGER(IntKi), PARAMETER :: B2RdtMxi = 2917 + INTEGER(IntKi), PARAMETER :: B2RdtMyi = 2918 + INTEGER(IntKi), PARAMETER :: B2RdtMzi = 2919 + INTEGER(IntKi), PARAMETER :: B3AddFxi = 2920 + INTEGER(IntKi), PARAMETER :: B3AddFyi = 2921 + INTEGER(IntKi), PARAMETER :: B3AddFzi = 2922 + INTEGER(IntKi), PARAMETER :: B3AddMxi = 2923 + INTEGER(IntKi), PARAMETER :: B3AddMyi = 2924 + INTEGER(IntKi), PARAMETER :: B3AddMzi = 2925 + INTEGER(IntKi), PARAMETER :: B3WvsF1xi = 2926 + INTEGER(IntKi), PARAMETER :: B3WvsF1yi = 2927 + INTEGER(IntKi), PARAMETER :: B3WvsF1zi = 2928 + INTEGER(IntKi), PARAMETER :: B3WvsM1xi = 2929 + INTEGER(IntKi), PARAMETER :: B3WvsM1yi = 2930 + INTEGER(IntKi), PARAMETER :: B3WvsM1zi = 2931 + INTEGER(IntKi), PARAMETER :: B3WvsFxi = 2932 + INTEGER(IntKi), PARAMETER :: B3WvsFyi = 2933 + INTEGER(IntKi), PARAMETER :: B3WvsFzi = 2934 + INTEGER(IntKi), PARAMETER :: B3WvsMxi = 2935 + INTEGER(IntKi), PARAMETER :: B3WvsMyi = 2936 + INTEGER(IntKi), PARAMETER :: B3WvsMzi = 2937 + INTEGER(IntKi), PARAMETER :: B3HdSFxi = 2938 + INTEGER(IntKi), PARAMETER :: B3HdSFyi = 2939 + INTEGER(IntKi), PARAMETER :: B3HdSFzi = 2940 + INTEGER(IntKi), PARAMETER :: B3HdSMxi = 2941 + INTEGER(IntKi), PARAMETER :: B3HdSMyi = 2942 + INTEGER(IntKi), PARAMETER :: B3HdSMzi = 2943 + INTEGER(IntKi), PARAMETER :: B3RdtFxi = 2944 + INTEGER(IntKi), PARAMETER :: B3RdtFyi = 2945 + INTEGER(IntKi), PARAMETER :: B3RdtFzi = 2946 + INTEGER(IntKi), PARAMETER :: B3RdtMxi = 2947 + INTEGER(IntKi), PARAMETER :: B3RdtMyi = 2948 + INTEGER(IntKi), PARAMETER :: B3RdtMzi = 2949 + INTEGER(IntKi), PARAMETER :: B4AddFxi = 2950 + INTEGER(IntKi), PARAMETER :: B4AddFyi = 2951 + INTEGER(IntKi), PARAMETER :: B4AddFzi = 2952 + INTEGER(IntKi), PARAMETER :: B4AddMxi = 2953 + INTEGER(IntKi), PARAMETER :: B4AddMyi = 2954 + INTEGER(IntKi), PARAMETER :: B4AddMzi = 2955 + INTEGER(IntKi), PARAMETER :: B4WvsF1xi = 2956 + INTEGER(IntKi), PARAMETER :: B4WvsF1yi = 2957 + INTEGER(IntKi), PARAMETER :: B4WvsF1zi = 2958 + INTEGER(IntKi), PARAMETER :: B4WvsM1xi = 2959 + INTEGER(IntKi), PARAMETER :: B4WvsM1yi = 2960 + INTEGER(IntKi), PARAMETER :: B4WvsM1zi = 2961 + INTEGER(IntKi), PARAMETER :: B4WvsFxi = 2962 + INTEGER(IntKi), PARAMETER :: B4WvsFyi = 2963 + INTEGER(IntKi), PARAMETER :: B4WvsFzi = 2964 + INTEGER(IntKi), PARAMETER :: B4WvsMxi = 2965 + INTEGER(IntKi), PARAMETER :: B4WvsMyi = 2966 + INTEGER(IntKi), PARAMETER :: B4WvsMzi = 2967 + INTEGER(IntKi), PARAMETER :: B4HdSFxi = 2968 + INTEGER(IntKi), PARAMETER :: B4HdSFyi = 2969 + INTEGER(IntKi), PARAMETER :: B4HdSFzi = 2970 + INTEGER(IntKi), PARAMETER :: B4HdSMxi = 2971 + INTEGER(IntKi), PARAMETER :: B4HdSMyi = 2972 + INTEGER(IntKi), PARAMETER :: B4HdSMzi = 2973 + INTEGER(IntKi), PARAMETER :: B4RdtFxi = 2974 + INTEGER(IntKi), PARAMETER :: B4RdtFyi = 2975 + INTEGER(IntKi), PARAMETER :: B4RdtFzi = 2976 + INTEGER(IntKi), PARAMETER :: B4RdtMxi = 2977 + INTEGER(IntKi), PARAMETER :: B4RdtMyi = 2978 + INTEGER(IntKi), PARAMETER :: B4RdtMzi = 2979 + INTEGER(IntKi), PARAMETER :: B5AddFxi = 2980 + INTEGER(IntKi), PARAMETER :: B5AddFyi = 2981 + INTEGER(IntKi), PARAMETER :: B5AddFzi = 2982 + INTEGER(IntKi), PARAMETER :: B5AddMxi = 2983 + INTEGER(IntKi), PARAMETER :: B5AddMyi = 2984 + INTEGER(IntKi), PARAMETER :: B5AddMzi = 2985 + INTEGER(IntKi), PARAMETER :: B5WvsF1xi = 2986 + INTEGER(IntKi), PARAMETER :: B5WvsF1yi = 2987 + INTEGER(IntKi), PARAMETER :: B5WvsF1zi = 2988 + INTEGER(IntKi), PARAMETER :: B5WvsM1xi = 2989 + INTEGER(IntKi), PARAMETER :: B5WvsM1yi = 2990 + INTEGER(IntKi), PARAMETER :: B5WvsM1zi = 2991 + INTEGER(IntKi), PARAMETER :: B5WvsFxi = 2992 + INTEGER(IntKi), PARAMETER :: B5WvsFyi = 2993 + INTEGER(IntKi), PARAMETER :: B5WvsFzi = 2994 + INTEGER(IntKi), PARAMETER :: B5WvsMxi = 2995 + INTEGER(IntKi), PARAMETER :: B5WvsMyi = 2996 + INTEGER(IntKi), PARAMETER :: B5WvsMzi = 2997 + INTEGER(IntKi), PARAMETER :: B5HdSFxi = 2998 + INTEGER(IntKi), PARAMETER :: B5HdSFyi = 2999 + INTEGER(IntKi), PARAMETER :: B5HdSFzi = 3000 + INTEGER(IntKi), PARAMETER :: B5HdSMxi = 3001 + INTEGER(IntKi), PARAMETER :: B5HdSMyi = 3002 + INTEGER(IntKi), PARAMETER :: B5HdSMzi = 3003 + INTEGER(IntKi), PARAMETER :: B5RdtFxi = 3004 + INTEGER(IntKi), PARAMETER :: B5RdtFyi = 3005 + INTEGER(IntKi), PARAMETER :: B5RdtFzi = 3006 + INTEGER(IntKi), PARAMETER :: B5RdtMxi = 3007 + INTEGER(IntKi), PARAMETER :: B5RdtMyi = 3008 + INTEGER(IntKi), PARAMETER :: B5RdtMzi = 3009 + INTEGER(IntKi), PARAMETER :: B6AddFxi = 3010 + INTEGER(IntKi), PARAMETER :: B6AddFyi = 3011 + INTEGER(IntKi), PARAMETER :: B6AddFzi = 3012 + INTEGER(IntKi), PARAMETER :: B6AddMxi = 3013 + INTEGER(IntKi), PARAMETER :: B6AddMyi = 3014 + INTEGER(IntKi), PARAMETER :: B6AddMzi = 3015 + INTEGER(IntKi), PARAMETER :: B6WvsF1xi = 3016 + INTEGER(IntKi), PARAMETER :: B6WvsF1yi = 3017 + INTEGER(IntKi), PARAMETER :: B6WvsF1zi = 3018 + INTEGER(IntKi), PARAMETER :: B6WvsM1xi = 3019 + INTEGER(IntKi), PARAMETER :: B6WvsM1yi = 3020 + INTEGER(IntKi), PARAMETER :: B6WvsM1zi = 3021 + INTEGER(IntKi), PARAMETER :: B6WvsFxi = 3022 + INTEGER(IntKi), PARAMETER :: B6WvsFyi = 3023 + INTEGER(IntKi), PARAMETER :: B6WvsFzi = 3024 + INTEGER(IntKi), PARAMETER :: B6WvsMxi = 3025 + INTEGER(IntKi), PARAMETER :: B6WvsMyi = 3026 + INTEGER(IntKi), PARAMETER :: B6WvsMzi = 3027 + INTEGER(IntKi), PARAMETER :: B6HdSFxi = 3028 + INTEGER(IntKi), PARAMETER :: B6HdSFyi = 3029 + INTEGER(IntKi), PARAMETER :: B6HdSFzi = 3030 + INTEGER(IntKi), PARAMETER :: B6HdSMxi = 3031 + INTEGER(IntKi), PARAMETER :: B6HdSMyi = 3032 + INTEGER(IntKi), PARAMETER :: B6HdSMzi = 3033 + INTEGER(IntKi), PARAMETER :: B6RdtFxi = 3034 + INTEGER(IntKi), PARAMETER :: B6RdtFyi = 3035 + INTEGER(IntKi), PARAMETER :: B6RdtFzi = 3036 + INTEGER(IntKi), PARAMETER :: B6RdtMxi = 3037 + INTEGER(IntKi), PARAMETER :: B6RdtMyi = 3038 + INTEGER(IntKi), PARAMETER :: B6RdtMzi = 3039 + INTEGER(IntKi), PARAMETER :: B7AddFxi = 3040 + INTEGER(IntKi), PARAMETER :: B7AddFyi = 3041 + INTEGER(IntKi), PARAMETER :: B7AddFzi = 3042 + INTEGER(IntKi), PARAMETER :: B7AddMxi = 3043 + INTEGER(IntKi), PARAMETER :: B7AddMyi = 3044 + INTEGER(IntKi), PARAMETER :: B7AddMzi = 3045 + INTEGER(IntKi), PARAMETER :: B7WvsF1xi = 3046 + INTEGER(IntKi), PARAMETER :: B7WvsF1yi = 3047 + INTEGER(IntKi), PARAMETER :: B7WvsF1zi = 3048 + INTEGER(IntKi), PARAMETER :: B7WvsM1xi = 3049 + INTEGER(IntKi), PARAMETER :: B7WvsM1yi = 3050 + INTEGER(IntKi), PARAMETER :: B7WvsM1zi = 3051 + INTEGER(IntKi), PARAMETER :: B7WvsFxi = 3052 + INTEGER(IntKi), PARAMETER :: B7WvsFyi = 3053 + INTEGER(IntKi), PARAMETER :: B7WvsFzi = 3054 + INTEGER(IntKi), PARAMETER :: B7WvsMxi = 3055 + INTEGER(IntKi), PARAMETER :: B7WvsMyi = 3056 + INTEGER(IntKi), PARAMETER :: B7WvsMzi = 3057 + INTEGER(IntKi), PARAMETER :: B7HdSFxi = 3058 + INTEGER(IntKi), PARAMETER :: B7HdSFyi = 3059 + INTEGER(IntKi), PARAMETER :: B7HdSFzi = 3060 + INTEGER(IntKi), PARAMETER :: B7HdSMxi = 3061 + INTEGER(IntKi), PARAMETER :: B7HdSMyi = 3062 + INTEGER(IntKi), PARAMETER :: B7HdSMzi = 3063 + INTEGER(IntKi), PARAMETER :: B7RdtFxi = 3064 + INTEGER(IntKi), PARAMETER :: B7RdtFyi = 3065 + INTEGER(IntKi), PARAMETER :: B7RdtFzi = 3066 + INTEGER(IntKi), PARAMETER :: B7RdtMxi = 3067 + INTEGER(IntKi), PARAMETER :: B7RdtMyi = 3068 + INTEGER(IntKi), PARAMETER :: B7RdtMzi = 3069 + INTEGER(IntKi), PARAMETER :: B8AddFxi = 3070 + INTEGER(IntKi), PARAMETER :: B8AddFyi = 3071 + INTEGER(IntKi), PARAMETER :: B8AddFzi = 3072 + INTEGER(IntKi), PARAMETER :: B8AddMxi = 3073 + INTEGER(IntKi), PARAMETER :: B8AddMyi = 3074 + INTEGER(IntKi), PARAMETER :: B8AddMzi = 3075 + INTEGER(IntKi), PARAMETER :: B8WvsF1xi = 3076 + INTEGER(IntKi), PARAMETER :: B8WvsF1yi = 3077 + INTEGER(IntKi), PARAMETER :: B8WvsF1zi = 3078 + INTEGER(IntKi), PARAMETER :: B8WvsM1xi = 3079 + INTEGER(IntKi), PARAMETER :: B8WvsM1yi = 3080 + INTEGER(IntKi), PARAMETER :: B8WvsM1zi = 3081 + INTEGER(IntKi), PARAMETER :: B8WvsFxi = 3082 + INTEGER(IntKi), PARAMETER :: B8WvsFyi = 3083 + INTEGER(IntKi), PARAMETER :: B8WvsFzi = 3084 + INTEGER(IntKi), PARAMETER :: B8WvsMxi = 3085 + INTEGER(IntKi), PARAMETER :: B8WvsMyi = 3086 + INTEGER(IntKi), PARAMETER :: B8WvsMzi = 3087 + INTEGER(IntKi), PARAMETER :: B8HdSFxi = 3088 + INTEGER(IntKi), PARAMETER :: B8HdSFyi = 3089 + INTEGER(IntKi), PARAMETER :: B8HdSFzi = 3090 + INTEGER(IntKi), PARAMETER :: B8HdSMxi = 3091 + INTEGER(IntKi), PARAMETER :: B8HdSMyi = 3092 + INTEGER(IntKi), PARAMETER :: B8HdSMzi = 3093 + INTEGER(IntKi), PARAMETER :: B8RdtFxi = 3094 + INTEGER(IntKi), PARAMETER :: B8RdtFyi = 3095 + INTEGER(IntKi), PARAMETER :: B8RdtFzi = 3096 + INTEGER(IntKi), PARAMETER :: B8RdtMxi = 3097 + INTEGER(IntKi), PARAMETER :: B8RdtMyi = 3098 + INTEGER(IntKi), PARAMETER :: B8RdtMzi = 3099 + INTEGER(IntKi), PARAMETER :: B9AddFxi = 3100 + INTEGER(IntKi), PARAMETER :: B9AddFyi = 3101 + INTEGER(IntKi), PARAMETER :: B9AddFzi = 3102 + INTEGER(IntKi), PARAMETER :: B9AddMxi = 3103 + INTEGER(IntKi), PARAMETER :: B9AddMyi = 3104 + INTEGER(IntKi), PARAMETER :: B9AddMzi = 3105 + INTEGER(IntKi), PARAMETER :: B9WvsF1xi = 3106 + INTEGER(IntKi), PARAMETER :: B9WvsF1yi = 3107 + INTEGER(IntKi), PARAMETER :: B9WvsF1zi = 3108 + INTEGER(IntKi), PARAMETER :: B9WvsM1xi = 3109 + INTEGER(IntKi), PARAMETER :: B9WvsM1yi = 3110 + INTEGER(IntKi), PARAMETER :: B9WvsM1zi = 3111 + INTEGER(IntKi), PARAMETER :: B9WvsFxi = 3112 + INTEGER(IntKi), PARAMETER :: B9WvsFyi = 3113 + INTEGER(IntKi), PARAMETER :: B9WvsFzi = 3114 + INTEGER(IntKi), PARAMETER :: B9WvsMxi = 3115 + INTEGER(IntKi), PARAMETER :: B9WvsMyi = 3116 + INTEGER(IntKi), PARAMETER :: B9WvsMzi = 3117 + INTEGER(IntKi), PARAMETER :: B9HdSFxi = 3118 + INTEGER(IntKi), PARAMETER :: B9HdSFyi = 3119 + INTEGER(IntKi), PARAMETER :: B9HdSFzi = 3120 + INTEGER(IntKi), PARAMETER :: B9HdSMxi = 3121 + INTEGER(IntKi), PARAMETER :: B9HdSMyi = 3122 + INTEGER(IntKi), PARAMETER :: B9HdSMzi = 3123 + INTEGER(IntKi), PARAMETER :: B9RdtFxi = 3124 + INTEGER(IntKi), PARAMETER :: B9RdtFyi = 3125 + INTEGER(IntKi), PARAMETER :: B9RdtFzi = 3126 + INTEGER(IntKi), PARAMETER :: B9RdtMxi = 3127 + INTEGER(IntKi), PARAMETER :: B9RdtMyi = 3128 + INTEGER(IntKi), PARAMETER :: B9RdtMzi = 3129 + INTEGER(IntKi), PARAMETER :: B1WvsF2xi = 3130 + INTEGER(IntKi), PARAMETER :: B1WvsF2yi = 3131 + INTEGER(IntKi), PARAMETER :: B1WvsF2zi = 3132 + INTEGER(IntKi), PARAMETER :: B1WvsM2xi = 3133 + INTEGER(IntKi), PARAMETER :: B1WvsM2yi = 3134 + INTEGER(IntKi), PARAMETER :: B1WvsM2zi = 3135 + INTEGER(IntKi), PARAMETER :: B2WvsF2xi = 3136 + INTEGER(IntKi), PARAMETER :: B2WvsF2yi = 3137 + INTEGER(IntKi), PARAMETER :: B2WvsF2zi = 3138 + INTEGER(IntKi), PARAMETER :: B2WvsM2xi = 3139 + INTEGER(IntKi), PARAMETER :: B2WvsM2yi = 3140 + INTEGER(IntKi), PARAMETER :: B2WvsM2zi = 3141 + INTEGER(IntKi), PARAMETER :: B3WvsF2xi = 3142 + INTEGER(IntKi), PARAMETER :: B3WvsF2yi = 3143 + INTEGER(IntKi), PARAMETER :: B3WvsF2zi = 3144 + INTEGER(IntKi), PARAMETER :: B3WvsM2xi = 3145 + INTEGER(IntKi), PARAMETER :: B3WvsM2yi = 3146 + INTEGER(IntKi), PARAMETER :: B3WvsM2zi = 3147 + INTEGER(IntKi), PARAMETER :: B4WvsF2xi = 3148 + INTEGER(IntKi), PARAMETER :: B4WvsF2yi = 3149 + INTEGER(IntKi), PARAMETER :: B4WvsF2zi = 3150 + INTEGER(IntKi), PARAMETER :: B4WvsM2xi = 3151 + INTEGER(IntKi), PARAMETER :: B4WvsM2yi = 3152 + INTEGER(IntKi), PARAMETER :: B4WvsM2zi = 3153 + INTEGER(IntKi), PARAMETER :: B5WvsF2xi = 3154 + INTEGER(IntKi), PARAMETER :: B5WvsF2yi = 3155 + INTEGER(IntKi), PARAMETER :: B5WvsF2zi = 3156 + INTEGER(IntKi), PARAMETER :: B5WvsM2xi = 3157 + INTEGER(IntKi), PARAMETER :: B5WvsM2yi = 3158 + INTEGER(IntKi), PARAMETER :: B5WvsM2zi = 3159 + INTEGER(IntKi), PARAMETER :: B6WvsF2xi = 3160 + INTEGER(IntKi), PARAMETER :: B6WvsF2yi = 3161 + INTEGER(IntKi), PARAMETER :: B6WvsF2zi = 3162 + INTEGER(IntKi), PARAMETER :: B6WvsM2xi = 3163 + INTEGER(IntKi), PARAMETER :: B6WvsM2yi = 3164 + INTEGER(IntKi), PARAMETER :: B6WvsM2zi = 3165 + INTEGER(IntKi), PARAMETER :: B7WvsF2xi = 3166 + INTEGER(IntKi), PARAMETER :: B7WvsF2yi = 3167 + INTEGER(IntKi), PARAMETER :: B7WvsF2zi = 3168 + INTEGER(IntKi), PARAMETER :: B7WvsM2xi = 3169 + INTEGER(IntKi), PARAMETER :: B7WvsM2yi = 3170 + INTEGER(IntKi), PARAMETER :: B7WvsM2zi = 3171 + INTEGER(IntKi), PARAMETER :: B8WvsF2xi = 3172 + INTEGER(IntKi), PARAMETER :: B8WvsF2yi = 3173 + INTEGER(IntKi), PARAMETER :: B8WvsF2zi = 3174 + INTEGER(IntKi), PARAMETER :: B8WvsM2xi = 3175 + INTEGER(IntKi), PARAMETER :: B8WvsM2yi = 3176 + INTEGER(IntKi), PARAMETER :: B8WvsM2zi = 3177 + INTEGER(IntKi), PARAMETER :: B9WvsF2xi = 3178 + INTEGER(IntKi), PARAMETER :: B9WvsF2yi = 3179 + INTEGER(IntKi), PARAMETER :: B9WvsF2zi = 3180 + INTEGER(IntKi), PARAMETER :: B9WvsM2xi = 3181 + INTEGER(IntKi), PARAMETER :: B9WvsM2yi = 3182 + INTEGER(IntKi), PARAMETER :: B9WvsM2zi = 3183 + INTEGER(IntKi), PARAMETER :: B1ADOF1Add = 3184 + INTEGER(IntKi), PARAMETER :: B1ADOF2Add = 3185 + INTEGER(IntKi), PARAMETER :: B1ADOF3Add = 3186 + INTEGER(IntKi), PARAMETER :: B1ADOF4Add = 3187 + INTEGER(IntKi), PARAMETER :: B1ADOF5Add = 3188 + INTEGER(IntKi), PARAMETER :: B1ADOF6Add = 3189 + INTEGER(IntKi), PARAMETER :: B1ADOF7Add = 3190 + INTEGER(IntKi), PARAMETER :: B1ADOF8Add = 3191 + INTEGER(IntKi), PARAMETER :: B1ADOF9Add = 3192 + INTEGER(IntKi), PARAMETER :: B1ADOF10Add = 3193 + INTEGER(IntKi), PARAMETER :: B1ADOF11Add = 3194 + INTEGER(IntKi), PARAMETER :: B1ADOF12Add = 3195 + INTEGER(IntKi), PARAMETER :: B1ADOF13Add = 3196 + INTEGER(IntKi), PARAMETER :: B1ADOF14Add = 3197 + INTEGER(IntKi), PARAMETER :: B1ADOF15Add = 3198 + INTEGER(IntKi), PARAMETER :: B1ADOF16Add = 3199 + INTEGER(IntKi), PARAMETER :: B1ADOF17Add = 3200 + INTEGER(IntKi), PARAMETER :: B1ADOF18Add = 3201 + INTEGER(IntKi), PARAMETER :: B1ADOF19Add = 3202 + INTEGER(IntKi), PARAMETER :: B1ADOF20Add = 3203 + INTEGER(IntKi), PARAMETER :: B1ADOF21Add = 3204 + INTEGER(IntKi), PARAMETER :: B1ADOF22Add = 3205 + INTEGER(IntKi), PARAMETER :: B1ADOF23Add = 3206 + INTEGER(IntKi), PARAMETER :: B1ADOF24Add = 3207 + INTEGER(IntKi), PARAMETER :: B1ADOF25Add = 3208 + INTEGER(IntKi), PARAMETER :: B1ADOF26Add = 3209 + INTEGER(IntKi), PARAMETER :: B1ADOF27Add = 3210 + INTEGER(IntKi), PARAMETER :: B1ADOF28Add = 3211 + INTEGER(IntKi), PARAMETER :: B1ADOF29Add = 3212 + INTEGER(IntKi), PARAMETER :: B1ADOF30Add = 3213 + INTEGER(IntKi), PARAMETER :: B1ADOF31Add = 3214 + INTEGER(IntKi), PARAMETER :: B1ADOF32Add = 3215 + INTEGER(IntKi), PARAMETER :: B1ADOF33Add = 3216 + INTEGER(IntKi), PARAMETER :: B1ADOF34Add = 3217 + INTEGER(IntKi), PARAMETER :: B1ADOF35Add = 3218 + INTEGER(IntKi), PARAMETER :: B1ADOF36Add = 3219 + INTEGER(IntKi), PARAMETER :: B1ADOF37Add = 3220 + INTEGER(IntKi), PARAMETER :: B1ADOF38Add = 3221 + INTEGER(IntKi), PARAMETER :: B1ADOF39Add = 3222 + INTEGER(IntKi), PARAMETER :: B1ADOF40Add = 3223 + INTEGER(IntKi), PARAMETER :: B1ADOF41Add = 3224 + INTEGER(IntKi), PARAMETER :: B1ADOF42Add = 3225 + INTEGER(IntKi), PARAMETER :: B1ADOF43Add = 3226 + INTEGER(IntKi), PARAMETER :: B1ADOF44Add = 3227 + INTEGER(IntKi), PARAMETER :: B1ADOF45Add = 3228 + INTEGER(IntKi), PARAMETER :: B1ADOF46Add = 3229 + INTEGER(IntKi), PARAMETER :: B1ADOF47Add = 3230 + INTEGER(IntKi), PARAMETER :: B1ADOF48Add = 3231 + INTEGER(IntKi), PARAMETER :: B1ADOF49Add = 3232 + INTEGER(IntKi), PARAMETER :: B1ADOF50Add = 3233 + INTEGER(IntKi), PARAMETER :: B1ADOF51Add = 3234 + INTEGER(IntKi), PARAMETER :: B1ADOF52Add = 3235 + INTEGER(IntKi), PARAMETER :: B1ADOF53Add = 3236 + INTEGER(IntKi), PARAMETER :: B1ADOF54Add = 3237 + INTEGER(IntKi), PARAMETER :: B1ADOF55Add = 3238 + INTEGER(IntKi), PARAMETER :: B1ADOF56Add = 3239 + INTEGER(IntKi), PARAMETER :: B1ADOF57Add = 3240 + INTEGER(IntKi), PARAMETER :: B1ADOF58Add = 3241 + INTEGER(IntKi), PARAMETER :: B1ADOF59Add = 3242 + INTEGER(IntKi), PARAMETER :: B1ADOF60Add = 3243 + INTEGER(IntKi), PARAMETER :: B1ADOF61Add = 3244 + INTEGER(IntKi), PARAMETER :: B1ADOF62Add = 3245 + INTEGER(IntKi), PARAMETER :: B1ADOF63Add = 3246 + INTEGER(IntKi), PARAMETER :: B1ADOF64Add = 3247 + INTEGER(IntKi), PARAMETER :: B1ADOF65Add = 3248 + INTEGER(IntKi), PARAMETER :: B1ADOF66Add = 3249 + INTEGER(IntKi), PARAMETER :: B1ADOF67Add = 3250 + INTEGER(IntKi), PARAMETER :: B1ADOF68Add = 3251 + INTEGER(IntKi), PARAMETER :: B1ADOF69Add = 3252 + INTEGER(IntKi), PARAMETER :: B1ADOF70Add = 3253 + INTEGER(IntKi), PARAMETER :: B1ADOF71Add = 3254 + INTEGER(IntKi), PARAMETER :: B1ADOF72Add = 3255 + INTEGER(IntKi), PARAMETER :: B1ADOF73Add = 3256 + INTEGER(IntKi), PARAMETER :: B1ADOF74Add = 3257 + INTEGER(IntKi), PARAMETER :: B1ADOF75Add = 3258 + INTEGER(IntKi), PARAMETER :: B1ADOF76Add = 3259 + INTEGER(IntKi), PARAMETER :: B1ADOF77Add = 3260 + INTEGER(IntKi), PARAMETER :: B1ADOF78Add = 3261 + INTEGER(IntKi), PARAMETER :: B1ADOF79Add = 3262 + INTEGER(IntKi), PARAMETER :: B1ADOF80Add = 3263 + INTEGER(IntKi), PARAMETER :: B1ADOF81Add = 3264 + INTEGER(IntKi), PARAMETER :: B1ADOF82Add = 3265 + INTEGER(IntKi), PARAMETER :: B1ADOF83Add = 3266 + INTEGER(IntKi), PARAMETER :: B1ADOF84Add = 3267 + INTEGER(IntKi), PARAMETER :: B1ADOF85Add = 3268 + INTEGER(IntKi), PARAMETER :: B1ADOF86Add = 3269 + INTEGER(IntKi), PARAMETER :: B1ADOF87Add = 3270 + INTEGER(IntKi), PARAMETER :: B1ADOF88Add = 3271 + INTEGER(IntKi), PARAMETER :: B1ADOF89Add = 3272 + INTEGER(IntKi), PARAMETER :: B1ADOF90Add = 3273 + INTEGER(IntKi), PARAMETER :: B1ADOF91Add = 3274 + INTEGER(IntKi), PARAMETER :: B1ADOF92Add = 3275 + INTEGER(IntKi), PARAMETER :: B1ADOF93Add = 3276 + INTEGER(IntKi), PARAMETER :: B1ADOF94Add = 3277 + INTEGER(IntKi), PARAMETER :: B1ADOF95Add = 3278 + INTEGER(IntKi), PARAMETER :: B1ADOF96Add = 3279 + INTEGER(IntKi), PARAMETER :: B1ADOF97Add = 3280 + INTEGER(IntKi), PARAMETER :: B1ADOF98Add = 3281 + INTEGER(IntKi), PARAMETER :: B1ADOF99Add = 3282 + INTEGER(IntKi), PARAMETER :: B2ADOF1Add = 3283 + INTEGER(IntKi), PARAMETER :: B2ADOF2Add = 3284 + INTEGER(IntKi), PARAMETER :: B2ADOF3Add = 3285 + INTEGER(IntKi), PARAMETER :: B2ADOF4Add = 3286 + INTEGER(IntKi), PARAMETER :: B2ADOF5Add = 3287 + INTEGER(IntKi), PARAMETER :: B2ADOF6Add = 3288 + INTEGER(IntKi), PARAMETER :: B2ADOF7Add = 3289 + INTEGER(IntKi), PARAMETER :: B2ADOF8Add = 3290 + INTEGER(IntKi), PARAMETER :: B2ADOF9Add = 3291 + INTEGER(IntKi), PARAMETER :: B2ADOF10Add = 3292 + INTEGER(IntKi), PARAMETER :: B2ADOF11Add = 3293 + INTEGER(IntKi), PARAMETER :: B2ADOF12Add = 3294 + INTEGER(IntKi), PARAMETER :: B2ADOF13Add = 3295 + INTEGER(IntKi), PARAMETER :: B2ADOF14Add = 3296 + INTEGER(IntKi), PARAMETER :: B2ADOF15Add = 3297 + INTEGER(IntKi), PARAMETER :: B2ADOF16Add = 3298 + INTEGER(IntKi), PARAMETER :: B2ADOF17Add = 3299 + INTEGER(IntKi), PARAMETER :: B2ADOF18Add = 3300 + INTEGER(IntKi), PARAMETER :: B2ADOF19Add = 3301 + INTEGER(IntKi), PARAMETER :: B2ADOF20Add = 3302 + INTEGER(IntKi), PARAMETER :: B2ADOF21Add = 3303 + INTEGER(IntKi), PARAMETER :: B2ADOF22Add = 3304 + INTEGER(IntKi), PARAMETER :: B2ADOF23Add = 3305 + INTEGER(IntKi), PARAMETER :: B2ADOF24Add = 3306 + INTEGER(IntKi), PARAMETER :: B2ADOF25Add = 3307 + INTEGER(IntKi), PARAMETER :: B2ADOF26Add = 3308 + INTEGER(IntKi), PARAMETER :: B2ADOF27Add = 3309 + INTEGER(IntKi), PARAMETER :: B2ADOF28Add = 3310 + INTEGER(IntKi), PARAMETER :: B2ADOF29Add = 3311 + INTEGER(IntKi), PARAMETER :: B2ADOF30Add = 3312 + INTEGER(IntKi), PARAMETER :: B2ADOF31Add = 3313 + INTEGER(IntKi), PARAMETER :: B2ADOF32Add = 3314 + INTEGER(IntKi), PARAMETER :: B2ADOF33Add = 3315 + INTEGER(IntKi), PARAMETER :: B2ADOF34Add = 3316 + INTEGER(IntKi), PARAMETER :: B2ADOF35Add = 3317 + INTEGER(IntKi), PARAMETER :: B2ADOF36Add = 3318 + INTEGER(IntKi), PARAMETER :: B2ADOF37Add = 3319 + INTEGER(IntKi), PARAMETER :: B2ADOF38Add = 3320 + INTEGER(IntKi), PARAMETER :: B2ADOF39Add = 3321 + INTEGER(IntKi), PARAMETER :: B2ADOF40Add = 3322 + INTEGER(IntKi), PARAMETER :: B2ADOF41Add = 3323 + INTEGER(IntKi), PARAMETER :: B2ADOF42Add = 3324 + INTEGER(IntKi), PARAMETER :: B2ADOF43Add = 3325 + INTEGER(IntKi), PARAMETER :: B2ADOF44Add = 3326 + INTEGER(IntKi), PARAMETER :: B2ADOF45Add = 3327 + INTEGER(IntKi), PARAMETER :: B2ADOF46Add = 3328 + INTEGER(IntKi), PARAMETER :: B2ADOF47Add = 3329 + INTEGER(IntKi), PARAMETER :: B2ADOF48Add = 3330 + INTEGER(IntKi), PARAMETER :: B2ADOF49Add = 3331 + INTEGER(IntKi), PARAMETER :: B2ADOF50Add = 3332 + INTEGER(IntKi), PARAMETER :: B2ADOF51Add = 3333 + INTEGER(IntKi), PARAMETER :: B2ADOF52Add = 3334 + INTEGER(IntKi), PARAMETER :: B2ADOF53Add = 3335 + INTEGER(IntKi), PARAMETER :: B2ADOF54Add = 3336 + INTEGER(IntKi), PARAMETER :: B2ADOF55Add = 3337 + INTEGER(IntKi), PARAMETER :: B2ADOF56Add = 3338 + INTEGER(IntKi), PARAMETER :: B2ADOF57Add = 3339 + INTEGER(IntKi), PARAMETER :: B2ADOF58Add = 3340 + INTEGER(IntKi), PARAMETER :: B2ADOF59Add = 3341 + INTEGER(IntKi), PARAMETER :: B2ADOF60Add = 3342 + INTEGER(IntKi), PARAMETER :: B2ADOF61Add = 3343 + INTEGER(IntKi), PARAMETER :: B2ADOF62Add = 3344 + INTEGER(IntKi), PARAMETER :: B2ADOF63Add = 3345 + INTEGER(IntKi), PARAMETER :: B2ADOF64Add = 3346 + INTEGER(IntKi), PARAMETER :: B2ADOF65Add = 3347 + INTEGER(IntKi), PARAMETER :: B2ADOF66Add = 3348 + INTEGER(IntKi), PARAMETER :: B2ADOF67Add = 3349 + INTEGER(IntKi), PARAMETER :: B2ADOF68Add = 3350 + INTEGER(IntKi), PARAMETER :: B2ADOF69Add = 3351 + INTEGER(IntKi), PARAMETER :: B2ADOF70Add = 3352 + INTEGER(IntKi), PARAMETER :: B2ADOF71Add = 3353 + INTEGER(IntKi), PARAMETER :: B2ADOF72Add = 3354 + INTEGER(IntKi), PARAMETER :: B2ADOF73Add = 3355 + INTEGER(IntKi), PARAMETER :: B2ADOF74Add = 3356 + INTEGER(IntKi), PARAMETER :: B2ADOF75Add = 3357 + INTEGER(IntKi), PARAMETER :: B2ADOF76Add = 3358 + INTEGER(IntKi), PARAMETER :: B2ADOF77Add = 3359 + INTEGER(IntKi), PARAMETER :: B2ADOF78Add = 3360 + INTEGER(IntKi), PARAMETER :: B2ADOF79Add = 3361 + INTEGER(IntKi), PARAMETER :: B2ADOF80Add = 3362 + INTEGER(IntKi), PARAMETER :: B2ADOF81Add = 3363 + INTEGER(IntKi), PARAMETER :: B2ADOF82Add = 3364 + INTEGER(IntKi), PARAMETER :: B2ADOF83Add = 3365 + INTEGER(IntKi), PARAMETER :: B2ADOF84Add = 3366 + INTEGER(IntKi), PARAMETER :: B2ADOF85Add = 3367 + INTEGER(IntKi), PARAMETER :: B2ADOF86Add = 3368 + INTEGER(IntKi), PARAMETER :: B2ADOF87Add = 3369 + INTEGER(IntKi), PARAMETER :: B2ADOF88Add = 3370 + INTEGER(IntKi), PARAMETER :: B2ADOF89Add = 3371 + INTEGER(IntKi), PARAMETER :: B2ADOF90Add = 3372 + INTEGER(IntKi), PARAMETER :: B2ADOF91Add = 3373 + INTEGER(IntKi), PARAMETER :: B2ADOF92Add = 3374 + INTEGER(IntKi), PARAMETER :: B2ADOF93Add = 3375 + INTEGER(IntKi), PARAMETER :: B2ADOF94Add = 3376 + INTEGER(IntKi), PARAMETER :: B2ADOF95Add = 3377 + INTEGER(IntKi), PARAMETER :: B2ADOF96Add = 3378 + INTEGER(IntKi), PARAMETER :: B2ADOF97Add = 3379 + INTEGER(IntKi), PARAMETER :: B2ADOF98Add = 3380 + INTEGER(IntKi), PARAMETER :: B2ADOF99Add = 3381 + INTEGER(IntKi), PARAMETER :: B3ADOF1Add = 3382 + INTEGER(IntKi), PARAMETER :: B3ADOF2Add = 3383 + INTEGER(IntKi), PARAMETER :: B3ADOF3Add = 3384 + INTEGER(IntKi), PARAMETER :: B3ADOF4Add = 3385 + INTEGER(IntKi), PARAMETER :: B3ADOF5Add = 3386 + INTEGER(IntKi), PARAMETER :: B3ADOF6Add = 3387 + INTEGER(IntKi), PARAMETER :: B3ADOF7Add = 3388 + INTEGER(IntKi), PARAMETER :: B3ADOF8Add = 3389 + INTEGER(IntKi), PARAMETER :: B3ADOF9Add = 3390 + INTEGER(IntKi), PARAMETER :: B3ADOF10Add = 3391 + INTEGER(IntKi), PARAMETER :: B3ADOF11Add = 3392 + INTEGER(IntKi), PARAMETER :: B3ADOF12Add = 3393 + INTEGER(IntKi), PARAMETER :: B3ADOF13Add = 3394 + INTEGER(IntKi), PARAMETER :: B3ADOF14Add = 3395 + INTEGER(IntKi), PARAMETER :: B3ADOF15Add = 3396 + INTEGER(IntKi), PARAMETER :: B3ADOF16Add = 3397 + INTEGER(IntKi), PARAMETER :: B3ADOF17Add = 3398 + INTEGER(IntKi), PARAMETER :: B3ADOF18Add = 3399 + INTEGER(IntKi), PARAMETER :: B3ADOF19Add = 3400 + INTEGER(IntKi), PARAMETER :: B3ADOF20Add = 3401 + INTEGER(IntKi), PARAMETER :: B3ADOF21Add = 3402 + INTEGER(IntKi), PARAMETER :: B3ADOF22Add = 3403 + INTEGER(IntKi), PARAMETER :: B3ADOF23Add = 3404 + INTEGER(IntKi), PARAMETER :: B3ADOF24Add = 3405 + INTEGER(IntKi), PARAMETER :: B3ADOF25Add = 3406 + INTEGER(IntKi), PARAMETER :: B3ADOF26Add = 3407 + INTEGER(IntKi), PARAMETER :: B3ADOF27Add = 3408 + INTEGER(IntKi), PARAMETER :: B3ADOF28Add = 3409 + INTEGER(IntKi), PARAMETER :: B3ADOF29Add = 3410 + INTEGER(IntKi), PARAMETER :: B3ADOF30Add = 3411 + INTEGER(IntKi), PARAMETER :: B3ADOF31Add = 3412 + INTEGER(IntKi), PARAMETER :: B3ADOF32Add = 3413 + INTEGER(IntKi), PARAMETER :: B3ADOF33Add = 3414 + INTEGER(IntKi), PARAMETER :: B3ADOF34Add = 3415 + INTEGER(IntKi), PARAMETER :: B3ADOF35Add = 3416 + INTEGER(IntKi), PARAMETER :: B3ADOF36Add = 3417 + INTEGER(IntKi), PARAMETER :: B3ADOF37Add = 3418 + INTEGER(IntKi), PARAMETER :: B3ADOF38Add = 3419 + INTEGER(IntKi), PARAMETER :: B3ADOF39Add = 3420 + INTEGER(IntKi), PARAMETER :: B3ADOF40Add = 3421 + INTEGER(IntKi), PARAMETER :: B3ADOF41Add = 3422 + INTEGER(IntKi), PARAMETER :: B3ADOF42Add = 3423 + INTEGER(IntKi), PARAMETER :: B3ADOF43Add = 3424 + INTEGER(IntKi), PARAMETER :: B3ADOF44Add = 3425 + INTEGER(IntKi), PARAMETER :: B3ADOF45Add = 3426 + INTEGER(IntKi), PARAMETER :: B3ADOF46Add = 3427 + INTEGER(IntKi), PARAMETER :: B3ADOF47Add = 3428 + INTEGER(IntKi), PARAMETER :: B3ADOF48Add = 3429 + INTEGER(IntKi), PARAMETER :: B3ADOF49Add = 3430 + INTEGER(IntKi), PARAMETER :: B3ADOF50Add = 3431 + INTEGER(IntKi), PARAMETER :: B3ADOF51Add = 3432 + INTEGER(IntKi), PARAMETER :: B3ADOF52Add = 3433 + INTEGER(IntKi), PARAMETER :: B3ADOF53Add = 3434 + INTEGER(IntKi), PARAMETER :: B3ADOF54Add = 3435 + INTEGER(IntKi), PARAMETER :: B3ADOF55Add = 3436 + INTEGER(IntKi), PARAMETER :: B3ADOF56Add = 3437 + INTEGER(IntKi), PARAMETER :: B3ADOF57Add = 3438 + INTEGER(IntKi), PARAMETER :: B3ADOF58Add = 3439 + INTEGER(IntKi), PARAMETER :: B3ADOF59Add = 3440 + INTEGER(IntKi), PARAMETER :: B3ADOF60Add = 3441 + INTEGER(IntKi), PARAMETER :: B3ADOF61Add = 3442 + INTEGER(IntKi), PARAMETER :: B3ADOF62Add = 3443 + INTEGER(IntKi), PARAMETER :: B3ADOF63Add = 3444 + INTEGER(IntKi), PARAMETER :: B3ADOF64Add = 3445 + INTEGER(IntKi), PARAMETER :: B3ADOF65Add = 3446 + INTEGER(IntKi), PARAMETER :: B3ADOF66Add = 3447 + INTEGER(IntKi), PARAMETER :: B3ADOF67Add = 3448 + INTEGER(IntKi), PARAMETER :: B3ADOF68Add = 3449 + INTEGER(IntKi), PARAMETER :: B3ADOF69Add = 3450 + INTEGER(IntKi), PARAMETER :: B3ADOF70Add = 3451 + INTEGER(IntKi), PARAMETER :: B3ADOF71Add = 3452 + INTEGER(IntKi), PARAMETER :: B3ADOF72Add = 3453 + INTEGER(IntKi), PARAMETER :: B3ADOF73Add = 3454 + INTEGER(IntKi), PARAMETER :: B3ADOF74Add = 3455 + INTEGER(IntKi), PARAMETER :: B3ADOF75Add = 3456 + INTEGER(IntKi), PARAMETER :: B3ADOF76Add = 3457 + INTEGER(IntKi), PARAMETER :: B3ADOF77Add = 3458 + INTEGER(IntKi), PARAMETER :: B3ADOF78Add = 3459 + INTEGER(IntKi), PARAMETER :: B3ADOF79Add = 3460 + INTEGER(IntKi), PARAMETER :: B3ADOF80Add = 3461 + INTEGER(IntKi), PARAMETER :: B3ADOF81Add = 3462 + INTEGER(IntKi), PARAMETER :: B3ADOF82Add = 3463 + INTEGER(IntKi), PARAMETER :: B3ADOF83Add = 3464 + INTEGER(IntKi), PARAMETER :: B3ADOF84Add = 3465 + INTEGER(IntKi), PARAMETER :: B3ADOF85Add = 3466 + INTEGER(IntKi), PARAMETER :: B3ADOF86Add = 3467 + INTEGER(IntKi), PARAMETER :: B3ADOF87Add = 3468 + INTEGER(IntKi), PARAMETER :: B3ADOF88Add = 3469 + INTEGER(IntKi), PARAMETER :: B3ADOF89Add = 3470 + INTEGER(IntKi), PARAMETER :: B3ADOF90Add = 3471 + INTEGER(IntKi), PARAMETER :: B3ADOF91Add = 3472 + INTEGER(IntKi), PARAMETER :: B3ADOF92Add = 3473 + INTEGER(IntKi), PARAMETER :: B3ADOF93Add = 3474 + INTEGER(IntKi), PARAMETER :: B3ADOF94Add = 3475 + INTEGER(IntKi), PARAMETER :: B3ADOF95Add = 3476 + INTEGER(IntKi), PARAMETER :: B3ADOF96Add = 3477 + INTEGER(IntKi), PARAMETER :: B3ADOF97Add = 3478 + INTEGER(IntKi), PARAMETER :: B3ADOF98Add = 3479 + INTEGER(IntKi), PARAMETER :: B3ADOF99Add = 3480 + INTEGER(IntKi), PARAMETER :: B4ADOF1Add = 3481 + INTEGER(IntKi), PARAMETER :: B4ADOF2Add = 3482 + INTEGER(IntKi), PARAMETER :: B4ADOF3Add = 3483 + INTEGER(IntKi), PARAMETER :: B4ADOF4Add = 3484 + INTEGER(IntKi), PARAMETER :: B4ADOF5Add = 3485 + INTEGER(IntKi), PARAMETER :: B4ADOF6Add = 3486 + INTEGER(IntKi), PARAMETER :: B4ADOF7Add = 3487 + INTEGER(IntKi), PARAMETER :: B4ADOF8Add = 3488 + INTEGER(IntKi), PARAMETER :: B4ADOF9Add = 3489 + INTEGER(IntKi), PARAMETER :: B4ADOF10Add = 3490 + INTEGER(IntKi), PARAMETER :: B4ADOF11Add = 3491 + INTEGER(IntKi), PARAMETER :: B4ADOF12Add = 3492 + INTEGER(IntKi), PARAMETER :: B4ADOF13Add = 3493 + INTEGER(IntKi), PARAMETER :: B4ADOF14Add = 3494 + INTEGER(IntKi), PARAMETER :: B4ADOF15Add = 3495 + INTEGER(IntKi), PARAMETER :: B4ADOF16Add = 3496 + INTEGER(IntKi), PARAMETER :: B4ADOF17Add = 3497 + INTEGER(IntKi), PARAMETER :: B4ADOF18Add = 3498 + INTEGER(IntKi), PARAMETER :: B4ADOF19Add = 3499 + INTEGER(IntKi), PARAMETER :: B4ADOF20Add = 3500 + INTEGER(IntKi), PARAMETER :: B4ADOF21Add = 3501 + INTEGER(IntKi), PARAMETER :: B4ADOF22Add = 3502 + INTEGER(IntKi), PARAMETER :: B4ADOF23Add = 3503 + INTEGER(IntKi), PARAMETER :: B4ADOF24Add = 3504 + INTEGER(IntKi), PARAMETER :: B4ADOF25Add = 3505 + INTEGER(IntKi), PARAMETER :: B4ADOF26Add = 3506 + INTEGER(IntKi), PARAMETER :: B4ADOF27Add = 3507 + INTEGER(IntKi), PARAMETER :: B4ADOF28Add = 3508 + INTEGER(IntKi), PARAMETER :: B4ADOF29Add = 3509 + INTEGER(IntKi), PARAMETER :: B4ADOF30Add = 3510 + INTEGER(IntKi), PARAMETER :: B4ADOF31Add = 3511 + INTEGER(IntKi), PARAMETER :: B4ADOF32Add = 3512 + INTEGER(IntKi), PARAMETER :: B4ADOF33Add = 3513 + INTEGER(IntKi), PARAMETER :: B4ADOF34Add = 3514 + INTEGER(IntKi), PARAMETER :: B4ADOF35Add = 3515 + INTEGER(IntKi), PARAMETER :: B4ADOF36Add = 3516 + INTEGER(IntKi), PARAMETER :: B4ADOF37Add = 3517 + INTEGER(IntKi), PARAMETER :: B4ADOF38Add = 3518 + INTEGER(IntKi), PARAMETER :: B4ADOF39Add = 3519 + INTEGER(IntKi), PARAMETER :: B4ADOF40Add = 3520 + INTEGER(IntKi), PARAMETER :: B4ADOF41Add = 3521 + INTEGER(IntKi), PARAMETER :: B4ADOF42Add = 3522 + INTEGER(IntKi), PARAMETER :: B4ADOF43Add = 3523 + INTEGER(IntKi), PARAMETER :: B4ADOF44Add = 3524 + INTEGER(IntKi), PARAMETER :: B4ADOF45Add = 3525 + INTEGER(IntKi), PARAMETER :: B4ADOF46Add = 3526 + INTEGER(IntKi), PARAMETER :: B4ADOF47Add = 3527 + INTEGER(IntKi), PARAMETER :: B4ADOF48Add = 3528 + INTEGER(IntKi), PARAMETER :: B4ADOF49Add = 3529 + INTEGER(IntKi), PARAMETER :: B4ADOF50Add = 3530 + INTEGER(IntKi), PARAMETER :: B4ADOF51Add = 3531 + INTEGER(IntKi), PARAMETER :: B4ADOF52Add = 3532 + INTEGER(IntKi), PARAMETER :: B4ADOF53Add = 3533 + INTEGER(IntKi), PARAMETER :: B4ADOF54Add = 3534 + INTEGER(IntKi), PARAMETER :: B4ADOF55Add = 3535 + INTEGER(IntKi), PARAMETER :: B4ADOF56Add = 3536 + INTEGER(IntKi), PARAMETER :: B4ADOF57Add = 3537 + INTEGER(IntKi), PARAMETER :: B4ADOF58Add = 3538 + INTEGER(IntKi), PARAMETER :: B4ADOF59Add = 3539 + INTEGER(IntKi), PARAMETER :: B4ADOF60Add = 3540 + INTEGER(IntKi), PARAMETER :: B4ADOF61Add = 3541 + INTEGER(IntKi), PARAMETER :: B4ADOF62Add = 3542 + INTEGER(IntKi), PARAMETER :: B4ADOF63Add = 3543 + INTEGER(IntKi), PARAMETER :: B4ADOF64Add = 3544 + INTEGER(IntKi), PARAMETER :: B4ADOF65Add = 3545 + INTEGER(IntKi), PARAMETER :: B4ADOF66Add = 3546 + INTEGER(IntKi), PARAMETER :: B4ADOF67Add = 3547 + INTEGER(IntKi), PARAMETER :: B4ADOF68Add = 3548 + INTEGER(IntKi), PARAMETER :: B4ADOF69Add = 3549 + INTEGER(IntKi), PARAMETER :: B4ADOF70Add = 3550 + INTEGER(IntKi), PARAMETER :: B4ADOF71Add = 3551 + INTEGER(IntKi), PARAMETER :: B4ADOF72Add = 3552 + INTEGER(IntKi), PARAMETER :: B4ADOF73Add = 3553 + INTEGER(IntKi), PARAMETER :: B4ADOF74Add = 3554 + INTEGER(IntKi), PARAMETER :: B4ADOF75Add = 3555 + INTEGER(IntKi), PARAMETER :: B4ADOF76Add = 3556 + INTEGER(IntKi), PARAMETER :: B4ADOF77Add = 3557 + INTEGER(IntKi), PARAMETER :: B4ADOF78Add = 3558 + INTEGER(IntKi), PARAMETER :: B4ADOF79Add = 3559 + INTEGER(IntKi), PARAMETER :: B4ADOF80Add = 3560 + INTEGER(IntKi), PARAMETER :: B4ADOF81Add = 3561 + INTEGER(IntKi), PARAMETER :: B4ADOF82Add = 3562 + INTEGER(IntKi), PARAMETER :: B4ADOF83Add = 3563 + INTEGER(IntKi), PARAMETER :: B4ADOF84Add = 3564 + INTEGER(IntKi), PARAMETER :: B4ADOF85Add = 3565 + INTEGER(IntKi), PARAMETER :: B4ADOF86Add = 3566 + INTEGER(IntKi), PARAMETER :: B4ADOF87Add = 3567 + INTEGER(IntKi), PARAMETER :: B4ADOF88Add = 3568 + INTEGER(IntKi), PARAMETER :: B4ADOF89Add = 3569 + INTEGER(IntKi), PARAMETER :: B4ADOF90Add = 3570 + INTEGER(IntKi), PARAMETER :: B4ADOF91Add = 3571 + INTEGER(IntKi), PARAMETER :: B4ADOF92Add = 3572 + INTEGER(IntKi), PARAMETER :: B4ADOF93Add = 3573 + INTEGER(IntKi), PARAMETER :: B4ADOF94Add = 3574 + INTEGER(IntKi), PARAMETER :: B4ADOF95Add = 3575 + INTEGER(IntKi), PARAMETER :: B4ADOF96Add = 3576 + INTEGER(IntKi), PARAMETER :: B4ADOF97Add = 3577 + INTEGER(IntKi), PARAMETER :: B4ADOF98Add = 3578 + INTEGER(IntKi), PARAMETER :: B4ADOF99Add = 3579 + INTEGER(IntKi), PARAMETER :: B5ADOF1Add = 3580 + INTEGER(IntKi), PARAMETER :: B5ADOF2Add = 3581 + INTEGER(IntKi), PARAMETER :: B5ADOF3Add = 3582 + INTEGER(IntKi), PARAMETER :: B5ADOF4Add = 3583 + INTEGER(IntKi), PARAMETER :: B5ADOF5Add = 3584 + INTEGER(IntKi), PARAMETER :: B5ADOF6Add = 3585 + INTEGER(IntKi), PARAMETER :: B5ADOF7Add = 3586 + INTEGER(IntKi), PARAMETER :: B5ADOF8Add = 3587 + INTEGER(IntKi), PARAMETER :: B5ADOF9Add = 3588 + INTEGER(IntKi), PARAMETER :: B5ADOF10Add = 3589 + INTEGER(IntKi), PARAMETER :: B5ADOF11Add = 3590 + INTEGER(IntKi), PARAMETER :: B5ADOF12Add = 3591 + INTEGER(IntKi), PARAMETER :: B5ADOF13Add = 3592 + INTEGER(IntKi), PARAMETER :: B5ADOF14Add = 3593 + INTEGER(IntKi), PARAMETER :: B5ADOF15Add = 3594 + INTEGER(IntKi), PARAMETER :: B5ADOF16Add = 3595 + INTEGER(IntKi), PARAMETER :: B5ADOF17Add = 3596 + INTEGER(IntKi), PARAMETER :: B5ADOF18Add = 3597 + INTEGER(IntKi), PARAMETER :: B5ADOF19Add = 3598 + INTEGER(IntKi), PARAMETER :: B5ADOF20Add = 3599 + INTEGER(IntKi), PARAMETER :: B5ADOF21Add = 3600 + INTEGER(IntKi), PARAMETER :: B5ADOF22Add = 3601 + INTEGER(IntKi), PARAMETER :: B5ADOF23Add = 3602 + INTEGER(IntKi), PARAMETER :: B5ADOF24Add = 3603 + INTEGER(IntKi), PARAMETER :: B5ADOF25Add = 3604 + INTEGER(IntKi), PARAMETER :: B5ADOF26Add = 3605 + INTEGER(IntKi), PARAMETER :: B5ADOF27Add = 3606 + INTEGER(IntKi), PARAMETER :: B5ADOF28Add = 3607 + INTEGER(IntKi), PARAMETER :: B5ADOF29Add = 3608 + INTEGER(IntKi), PARAMETER :: B5ADOF30Add = 3609 + INTEGER(IntKi), PARAMETER :: B5ADOF31Add = 3610 + INTEGER(IntKi), PARAMETER :: B5ADOF32Add = 3611 + INTEGER(IntKi), PARAMETER :: B5ADOF33Add = 3612 + INTEGER(IntKi), PARAMETER :: B5ADOF34Add = 3613 + INTEGER(IntKi), PARAMETER :: B5ADOF35Add = 3614 + INTEGER(IntKi), PARAMETER :: B5ADOF36Add = 3615 + INTEGER(IntKi), PARAMETER :: B5ADOF37Add = 3616 + INTEGER(IntKi), PARAMETER :: B5ADOF38Add = 3617 + INTEGER(IntKi), PARAMETER :: B5ADOF39Add = 3618 + INTEGER(IntKi), PARAMETER :: B5ADOF40Add = 3619 + INTEGER(IntKi), PARAMETER :: B5ADOF41Add = 3620 + INTEGER(IntKi), PARAMETER :: B5ADOF42Add = 3621 + INTEGER(IntKi), PARAMETER :: B5ADOF43Add = 3622 + INTEGER(IntKi), PARAMETER :: B5ADOF44Add = 3623 + INTEGER(IntKi), PARAMETER :: B5ADOF45Add = 3624 + INTEGER(IntKi), PARAMETER :: B5ADOF46Add = 3625 + INTEGER(IntKi), PARAMETER :: B5ADOF47Add = 3626 + INTEGER(IntKi), PARAMETER :: B5ADOF48Add = 3627 + INTEGER(IntKi), PARAMETER :: B5ADOF49Add = 3628 + INTEGER(IntKi), PARAMETER :: B5ADOF50Add = 3629 + INTEGER(IntKi), PARAMETER :: B5ADOF51Add = 3630 + INTEGER(IntKi), PARAMETER :: B5ADOF52Add = 3631 + INTEGER(IntKi), PARAMETER :: B5ADOF53Add = 3632 + INTEGER(IntKi), PARAMETER :: B5ADOF54Add = 3633 + INTEGER(IntKi), PARAMETER :: B5ADOF55Add = 3634 + INTEGER(IntKi), PARAMETER :: B5ADOF56Add = 3635 + INTEGER(IntKi), PARAMETER :: B5ADOF57Add = 3636 + INTEGER(IntKi), PARAMETER :: B5ADOF58Add = 3637 + INTEGER(IntKi), PARAMETER :: B5ADOF59Add = 3638 + INTEGER(IntKi), PARAMETER :: B5ADOF60Add = 3639 + INTEGER(IntKi), PARAMETER :: B5ADOF61Add = 3640 + INTEGER(IntKi), PARAMETER :: B5ADOF62Add = 3641 + INTEGER(IntKi), PARAMETER :: B5ADOF63Add = 3642 + INTEGER(IntKi), PARAMETER :: B5ADOF64Add = 3643 + INTEGER(IntKi), PARAMETER :: B5ADOF65Add = 3644 + INTEGER(IntKi), PARAMETER :: B5ADOF66Add = 3645 + INTEGER(IntKi), PARAMETER :: B5ADOF67Add = 3646 + INTEGER(IntKi), PARAMETER :: B5ADOF68Add = 3647 + INTEGER(IntKi), PARAMETER :: B5ADOF69Add = 3648 + INTEGER(IntKi), PARAMETER :: B5ADOF70Add = 3649 + INTEGER(IntKi), PARAMETER :: B5ADOF71Add = 3650 + INTEGER(IntKi), PARAMETER :: B5ADOF72Add = 3651 + INTEGER(IntKi), PARAMETER :: B5ADOF73Add = 3652 + INTEGER(IntKi), PARAMETER :: B5ADOF74Add = 3653 + INTEGER(IntKi), PARAMETER :: B5ADOF75Add = 3654 + INTEGER(IntKi), PARAMETER :: B5ADOF76Add = 3655 + INTEGER(IntKi), PARAMETER :: B5ADOF77Add = 3656 + INTEGER(IntKi), PARAMETER :: B5ADOF78Add = 3657 + INTEGER(IntKi), PARAMETER :: B5ADOF79Add = 3658 + INTEGER(IntKi), PARAMETER :: B5ADOF80Add = 3659 + INTEGER(IntKi), PARAMETER :: B5ADOF81Add = 3660 + INTEGER(IntKi), PARAMETER :: B5ADOF82Add = 3661 + INTEGER(IntKi), PARAMETER :: B5ADOF83Add = 3662 + INTEGER(IntKi), PARAMETER :: B5ADOF84Add = 3663 + INTEGER(IntKi), PARAMETER :: B5ADOF85Add = 3664 + INTEGER(IntKi), PARAMETER :: B5ADOF86Add = 3665 + INTEGER(IntKi), PARAMETER :: B5ADOF87Add = 3666 + INTEGER(IntKi), PARAMETER :: B5ADOF88Add = 3667 + INTEGER(IntKi), PARAMETER :: B5ADOF89Add = 3668 + INTEGER(IntKi), PARAMETER :: B5ADOF90Add = 3669 + INTEGER(IntKi), PARAMETER :: B5ADOF91Add = 3670 + INTEGER(IntKi), PARAMETER :: B5ADOF92Add = 3671 + INTEGER(IntKi), PARAMETER :: B5ADOF93Add = 3672 + INTEGER(IntKi), PARAMETER :: B5ADOF94Add = 3673 + INTEGER(IntKi), PARAMETER :: B5ADOF95Add = 3674 + INTEGER(IntKi), PARAMETER :: B5ADOF96Add = 3675 + INTEGER(IntKi), PARAMETER :: B5ADOF97Add = 3676 + INTEGER(IntKi), PARAMETER :: B5ADOF98Add = 3677 + INTEGER(IntKi), PARAMETER :: B5ADOF99Add = 3678 + INTEGER(IntKi), PARAMETER :: B6ADOF1Add = 3679 + INTEGER(IntKi), PARAMETER :: B6ADOF2Add = 3680 + INTEGER(IntKi), PARAMETER :: B6ADOF3Add = 3681 + INTEGER(IntKi), PARAMETER :: B6ADOF4Add = 3682 + INTEGER(IntKi), PARAMETER :: B6ADOF5Add = 3683 + INTEGER(IntKi), PARAMETER :: B6ADOF6Add = 3684 + INTEGER(IntKi), PARAMETER :: B6ADOF7Add = 3685 + INTEGER(IntKi), PARAMETER :: B6ADOF8Add = 3686 + INTEGER(IntKi), PARAMETER :: B6ADOF9Add = 3687 + INTEGER(IntKi), PARAMETER :: B6ADOF10Add = 3688 + INTEGER(IntKi), PARAMETER :: B6ADOF11Add = 3689 + INTEGER(IntKi), PARAMETER :: B6ADOF12Add = 3690 + INTEGER(IntKi), PARAMETER :: B6ADOF13Add = 3691 + INTEGER(IntKi), PARAMETER :: B6ADOF14Add = 3692 + INTEGER(IntKi), PARAMETER :: B6ADOF15Add = 3693 + INTEGER(IntKi), PARAMETER :: B6ADOF16Add = 3694 + INTEGER(IntKi), PARAMETER :: B6ADOF17Add = 3695 + INTEGER(IntKi), PARAMETER :: B6ADOF18Add = 3696 + INTEGER(IntKi), PARAMETER :: B6ADOF19Add = 3697 + INTEGER(IntKi), PARAMETER :: B6ADOF20Add = 3698 + INTEGER(IntKi), PARAMETER :: B6ADOF21Add = 3699 + INTEGER(IntKi), PARAMETER :: B6ADOF22Add = 3700 + INTEGER(IntKi), PARAMETER :: B6ADOF23Add = 3701 + INTEGER(IntKi), PARAMETER :: B6ADOF24Add = 3702 + INTEGER(IntKi), PARAMETER :: B6ADOF25Add = 3703 + INTEGER(IntKi), PARAMETER :: B6ADOF26Add = 3704 + INTEGER(IntKi), PARAMETER :: B6ADOF27Add = 3705 + INTEGER(IntKi), PARAMETER :: B6ADOF28Add = 3706 + INTEGER(IntKi), PARAMETER :: B6ADOF29Add = 3707 + INTEGER(IntKi), PARAMETER :: B6ADOF30Add = 3708 + INTEGER(IntKi), PARAMETER :: B6ADOF31Add = 3709 + INTEGER(IntKi), PARAMETER :: B6ADOF32Add = 3710 + INTEGER(IntKi), PARAMETER :: B6ADOF33Add = 3711 + INTEGER(IntKi), PARAMETER :: B6ADOF34Add = 3712 + INTEGER(IntKi), PARAMETER :: B6ADOF35Add = 3713 + INTEGER(IntKi), PARAMETER :: B6ADOF36Add = 3714 + INTEGER(IntKi), PARAMETER :: B6ADOF37Add = 3715 + INTEGER(IntKi), PARAMETER :: B6ADOF38Add = 3716 + INTEGER(IntKi), PARAMETER :: B6ADOF39Add = 3717 + INTEGER(IntKi), PARAMETER :: B6ADOF40Add = 3718 + INTEGER(IntKi), PARAMETER :: B6ADOF41Add = 3719 + INTEGER(IntKi), PARAMETER :: B6ADOF42Add = 3720 + INTEGER(IntKi), PARAMETER :: B6ADOF43Add = 3721 + INTEGER(IntKi), PARAMETER :: B6ADOF44Add = 3722 + INTEGER(IntKi), PARAMETER :: B6ADOF45Add = 3723 + INTEGER(IntKi), PARAMETER :: B6ADOF46Add = 3724 + INTEGER(IntKi), PARAMETER :: B6ADOF47Add = 3725 + INTEGER(IntKi), PARAMETER :: B6ADOF48Add = 3726 + INTEGER(IntKi), PARAMETER :: B6ADOF49Add = 3727 + INTEGER(IntKi), PARAMETER :: B6ADOF50Add = 3728 + INTEGER(IntKi), PARAMETER :: B6ADOF51Add = 3729 + INTEGER(IntKi), PARAMETER :: B6ADOF52Add = 3730 + INTEGER(IntKi), PARAMETER :: B6ADOF53Add = 3731 + INTEGER(IntKi), PARAMETER :: B6ADOF54Add = 3732 + INTEGER(IntKi), PARAMETER :: B6ADOF55Add = 3733 + INTEGER(IntKi), PARAMETER :: B6ADOF56Add = 3734 + INTEGER(IntKi), PARAMETER :: B6ADOF57Add = 3735 + INTEGER(IntKi), PARAMETER :: B6ADOF58Add = 3736 + INTEGER(IntKi), PARAMETER :: B6ADOF59Add = 3737 + INTEGER(IntKi), PARAMETER :: B6ADOF60Add = 3738 + INTEGER(IntKi), PARAMETER :: B6ADOF61Add = 3739 + INTEGER(IntKi), PARAMETER :: B6ADOF62Add = 3740 + INTEGER(IntKi), PARAMETER :: B6ADOF63Add = 3741 + INTEGER(IntKi), PARAMETER :: B6ADOF64Add = 3742 + INTEGER(IntKi), PARAMETER :: B6ADOF65Add = 3743 + INTEGER(IntKi), PARAMETER :: B6ADOF66Add = 3744 + INTEGER(IntKi), PARAMETER :: B6ADOF67Add = 3745 + INTEGER(IntKi), PARAMETER :: B6ADOF68Add = 3746 + INTEGER(IntKi), PARAMETER :: B6ADOF69Add = 3747 + INTEGER(IntKi), PARAMETER :: B6ADOF70Add = 3748 + INTEGER(IntKi), PARAMETER :: B6ADOF71Add = 3749 + INTEGER(IntKi), PARAMETER :: B6ADOF72Add = 3750 + INTEGER(IntKi), PARAMETER :: B6ADOF73Add = 3751 + INTEGER(IntKi), PARAMETER :: B6ADOF74Add = 3752 + INTEGER(IntKi), PARAMETER :: B6ADOF75Add = 3753 + INTEGER(IntKi), PARAMETER :: B6ADOF76Add = 3754 + INTEGER(IntKi), PARAMETER :: B6ADOF77Add = 3755 + INTEGER(IntKi), PARAMETER :: B6ADOF78Add = 3756 + INTEGER(IntKi), PARAMETER :: B6ADOF79Add = 3757 + INTEGER(IntKi), PARAMETER :: B6ADOF80Add = 3758 + INTEGER(IntKi), PARAMETER :: B6ADOF81Add = 3759 + INTEGER(IntKi), PARAMETER :: B6ADOF82Add = 3760 + INTEGER(IntKi), PARAMETER :: B6ADOF83Add = 3761 + INTEGER(IntKi), PARAMETER :: B6ADOF84Add = 3762 + INTEGER(IntKi), PARAMETER :: B6ADOF85Add = 3763 + INTEGER(IntKi), PARAMETER :: B6ADOF86Add = 3764 + INTEGER(IntKi), PARAMETER :: B6ADOF87Add = 3765 + INTEGER(IntKi), PARAMETER :: B6ADOF88Add = 3766 + INTEGER(IntKi), PARAMETER :: B6ADOF89Add = 3767 + INTEGER(IntKi), PARAMETER :: B6ADOF90Add = 3768 + INTEGER(IntKi), PARAMETER :: B6ADOF91Add = 3769 + INTEGER(IntKi), PARAMETER :: B6ADOF92Add = 3770 + INTEGER(IntKi), PARAMETER :: B6ADOF93Add = 3771 + INTEGER(IntKi), PARAMETER :: B6ADOF94Add = 3772 + INTEGER(IntKi), PARAMETER :: B6ADOF95Add = 3773 + INTEGER(IntKi), PARAMETER :: B6ADOF96Add = 3774 + INTEGER(IntKi), PARAMETER :: B6ADOF97Add = 3775 + INTEGER(IntKi), PARAMETER :: B6ADOF98Add = 3776 + INTEGER(IntKi), PARAMETER :: B6ADOF99Add = 3777 + INTEGER(IntKi), PARAMETER :: B7ADOF1Add = 3778 + INTEGER(IntKi), PARAMETER :: B7ADOF2Add = 3779 + INTEGER(IntKi), PARAMETER :: B7ADOF3Add = 3780 + INTEGER(IntKi), PARAMETER :: B7ADOF4Add = 3781 + INTEGER(IntKi), PARAMETER :: B7ADOF5Add = 3782 + INTEGER(IntKi), PARAMETER :: B7ADOF6Add = 3783 + INTEGER(IntKi), PARAMETER :: B7ADOF7Add = 3784 + INTEGER(IntKi), PARAMETER :: B7ADOF8Add = 3785 + INTEGER(IntKi), PARAMETER :: B7ADOF9Add = 3786 + INTEGER(IntKi), PARAMETER :: B7ADOF10Add = 3787 + INTEGER(IntKi), PARAMETER :: B7ADOF11Add = 3788 + INTEGER(IntKi), PARAMETER :: B7ADOF12Add = 3789 + INTEGER(IntKi), PARAMETER :: B7ADOF13Add = 3790 + INTEGER(IntKi), PARAMETER :: B7ADOF14Add = 3791 + INTEGER(IntKi), PARAMETER :: B7ADOF15Add = 3792 + INTEGER(IntKi), PARAMETER :: B7ADOF16Add = 3793 + INTEGER(IntKi), PARAMETER :: B7ADOF17Add = 3794 + INTEGER(IntKi), PARAMETER :: B7ADOF18Add = 3795 + INTEGER(IntKi), PARAMETER :: B7ADOF19Add = 3796 + INTEGER(IntKi), PARAMETER :: B7ADOF20Add = 3797 + INTEGER(IntKi), PARAMETER :: B7ADOF21Add = 3798 + INTEGER(IntKi), PARAMETER :: B7ADOF22Add = 3799 + INTEGER(IntKi), PARAMETER :: B7ADOF23Add = 3800 + INTEGER(IntKi), PARAMETER :: B7ADOF24Add = 3801 + INTEGER(IntKi), PARAMETER :: B7ADOF25Add = 3802 + INTEGER(IntKi), PARAMETER :: B7ADOF26Add = 3803 + INTEGER(IntKi), PARAMETER :: B7ADOF27Add = 3804 + INTEGER(IntKi), PARAMETER :: B7ADOF28Add = 3805 + INTEGER(IntKi), PARAMETER :: B7ADOF29Add = 3806 + INTEGER(IntKi), PARAMETER :: B7ADOF30Add = 3807 + INTEGER(IntKi), PARAMETER :: B7ADOF31Add = 3808 + INTEGER(IntKi), PARAMETER :: B7ADOF32Add = 3809 + INTEGER(IntKi), PARAMETER :: B7ADOF33Add = 3810 + INTEGER(IntKi), PARAMETER :: B7ADOF34Add = 3811 + INTEGER(IntKi), PARAMETER :: B7ADOF35Add = 3812 + INTEGER(IntKi), PARAMETER :: B7ADOF36Add = 3813 + INTEGER(IntKi), PARAMETER :: B7ADOF37Add = 3814 + INTEGER(IntKi), PARAMETER :: B7ADOF38Add = 3815 + INTEGER(IntKi), PARAMETER :: B7ADOF39Add = 3816 + INTEGER(IntKi), PARAMETER :: B7ADOF40Add = 3817 + INTEGER(IntKi), PARAMETER :: B7ADOF41Add = 3818 + INTEGER(IntKi), PARAMETER :: B7ADOF42Add = 3819 + INTEGER(IntKi), PARAMETER :: B7ADOF43Add = 3820 + INTEGER(IntKi), PARAMETER :: B7ADOF44Add = 3821 + INTEGER(IntKi), PARAMETER :: B7ADOF45Add = 3822 + INTEGER(IntKi), PARAMETER :: B7ADOF46Add = 3823 + INTEGER(IntKi), PARAMETER :: B7ADOF47Add = 3824 + INTEGER(IntKi), PARAMETER :: B7ADOF48Add = 3825 + INTEGER(IntKi), PARAMETER :: B7ADOF49Add = 3826 + INTEGER(IntKi), PARAMETER :: B7ADOF50Add = 3827 + INTEGER(IntKi), PARAMETER :: B7ADOF51Add = 3828 + INTEGER(IntKi), PARAMETER :: B7ADOF52Add = 3829 + INTEGER(IntKi), PARAMETER :: B7ADOF53Add = 3830 + INTEGER(IntKi), PARAMETER :: B7ADOF54Add = 3831 + INTEGER(IntKi), PARAMETER :: B7ADOF55Add = 3832 + INTEGER(IntKi), PARAMETER :: B7ADOF56Add = 3833 + INTEGER(IntKi), PARAMETER :: B7ADOF57Add = 3834 + INTEGER(IntKi), PARAMETER :: B7ADOF58Add = 3835 + INTEGER(IntKi), PARAMETER :: B7ADOF59Add = 3836 + INTEGER(IntKi), PARAMETER :: B7ADOF60Add = 3837 + INTEGER(IntKi), PARAMETER :: B7ADOF61Add = 3838 + INTEGER(IntKi), PARAMETER :: B7ADOF62Add = 3839 + INTEGER(IntKi), PARAMETER :: B7ADOF63Add = 3840 + INTEGER(IntKi), PARAMETER :: B7ADOF64Add = 3841 + INTEGER(IntKi), PARAMETER :: B7ADOF65Add = 3842 + INTEGER(IntKi), PARAMETER :: B7ADOF66Add = 3843 + INTEGER(IntKi), PARAMETER :: B7ADOF67Add = 3844 + INTEGER(IntKi), PARAMETER :: B7ADOF68Add = 3845 + INTEGER(IntKi), PARAMETER :: B7ADOF69Add = 3846 + INTEGER(IntKi), PARAMETER :: B7ADOF70Add = 3847 + INTEGER(IntKi), PARAMETER :: B7ADOF71Add = 3848 + INTEGER(IntKi), PARAMETER :: B7ADOF72Add = 3849 + INTEGER(IntKi), PARAMETER :: B7ADOF73Add = 3850 + INTEGER(IntKi), PARAMETER :: B7ADOF74Add = 3851 + INTEGER(IntKi), PARAMETER :: B7ADOF75Add = 3852 + INTEGER(IntKi), PARAMETER :: B7ADOF76Add = 3853 + INTEGER(IntKi), PARAMETER :: B7ADOF77Add = 3854 + INTEGER(IntKi), PARAMETER :: B7ADOF78Add = 3855 + INTEGER(IntKi), PARAMETER :: B7ADOF79Add = 3856 + INTEGER(IntKi), PARAMETER :: B7ADOF80Add = 3857 + INTEGER(IntKi), PARAMETER :: B7ADOF81Add = 3858 + INTEGER(IntKi), PARAMETER :: B7ADOF82Add = 3859 + INTEGER(IntKi), PARAMETER :: B7ADOF83Add = 3860 + INTEGER(IntKi), PARAMETER :: B7ADOF84Add = 3861 + INTEGER(IntKi), PARAMETER :: B7ADOF85Add = 3862 + INTEGER(IntKi), PARAMETER :: B7ADOF86Add = 3863 + INTEGER(IntKi), PARAMETER :: B7ADOF87Add = 3864 + INTEGER(IntKi), PARAMETER :: B7ADOF88Add = 3865 + INTEGER(IntKi), PARAMETER :: B7ADOF89Add = 3866 + INTEGER(IntKi), PARAMETER :: B7ADOF90Add = 3867 + INTEGER(IntKi), PARAMETER :: B7ADOF91Add = 3868 + INTEGER(IntKi), PARAMETER :: B7ADOF92Add = 3869 + INTEGER(IntKi), PARAMETER :: B7ADOF93Add = 3870 + INTEGER(IntKi), PARAMETER :: B7ADOF94Add = 3871 + INTEGER(IntKi), PARAMETER :: B7ADOF95Add = 3872 + INTEGER(IntKi), PARAMETER :: B7ADOF96Add = 3873 + INTEGER(IntKi), PARAMETER :: B7ADOF97Add = 3874 + INTEGER(IntKi), PARAMETER :: B7ADOF98Add = 3875 + INTEGER(IntKi), PARAMETER :: B7ADOF99Add = 3876 + INTEGER(IntKi), PARAMETER :: B8ADOF1Add = 3877 + INTEGER(IntKi), PARAMETER :: B8ADOF2Add = 3878 + INTEGER(IntKi), PARAMETER :: B8ADOF3Add = 3879 + INTEGER(IntKi), PARAMETER :: B8ADOF4Add = 3880 + INTEGER(IntKi), PARAMETER :: B8ADOF5Add = 3881 + INTEGER(IntKi), PARAMETER :: B8ADOF6Add = 3882 + INTEGER(IntKi), PARAMETER :: B8ADOF7Add = 3883 + INTEGER(IntKi), PARAMETER :: B8ADOF8Add = 3884 + INTEGER(IntKi), PARAMETER :: B8ADOF9Add = 3885 + INTEGER(IntKi), PARAMETER :: B8ADOF10Add = 3886 + INTEGER(IntKi), PARAMETER :: B8ADOF11Add = 3887 + INTEGER(IntKi), PARAMETER :: B8ADOF12Add = 3888 + INTEGER(IntKi), PARAMETER :: B8ADOF13Add = 3889 + INTEGER(IntKi), PARAMETER :: B8ADOF14Add = 3890 + INTEGER(IntKi), PARAMETER :: B8ADOF15Add = 3891 + INTEGER(IntKi), PARAMETER :: B8ADOF16Add = 3892 + INTEGER(IntKi), PARAMETER :: B8ADOF17Add = 3893 + INTEGER(IntKi), PARAMETER :: B8ADOF18Add = 3894 + INTEGER(IntKi), PARAMETER :: B8ADOF19Add = 3895 + INTEGER(IntKi), PARAMETER :: B8ADOF20Add = 3896 + INTEGER(IntKi), PARAMETER :: B8ADOF21Add = 3897 + INTEGER(IntKi), PARAMETER :: B8ADOF22Add = 3898 + INTEGER(IntKi), PARAMETER :: B8ADOF23Add = 3899 + INTEGER(IntKi), PARAMETER :: B8ADOF24Add = 3900 + INTEGER(IntKi), PARAMETER :: B8ADOF25Add = 3901 + INTEGER(IntKi), PARAMETER :: B8ADOF26Add = 3902 + INTEGER(IntKi), PARAMETER :: B8ADOF27Add = 3903 + INTEGER(IntKi), PARAMETER :: B8ADOF28Add = 3904 + INTEGER(IntKi), PARAMETER :: B8ADOF29Add = 3905 + INTEGER(IntKi), PARAMETER :: B8ADOF30Add = 3906 + INTEGER(IntKi), PARAMETER :: B8ADOF31Add = 3907 + INTEGER(IntKi), PARAMETER :: B8ADOF32Add = 3908 + INTEGER(IntKi), PARAMETER :: B8ADOF33Add = 3909 + INTEGER(IntKi), PARAMETER :: B8ADOF34Add = 3910 + INTEGER(IntKi), PARAMETER :: B8ADOF35Add = 3911 + INTEGER(IntKi), PARAMETER :: B8ADOF36Add = 3912 + INTEGER(IntKi), PARAMETER :: B8ADOF37Add = 3913 + INTEGER(IntKi), PARAMETER :: B8ADOF38Add = 3914 + INTEGER(IntKi), PARAMETER :: B8ADOF39Add = 3915 + INTEGER(IntKi), PARAMETER :: B8ADOF40Add = 3916 + INTEGER(IntKi), PARAMETER :: B8ADOF41Add = 3917 + INTEGER(IntKi), PARAMETER :: B8ADOF42Add = 3918 + INTEGER(IntKi), PARAMETER :: B8ADOF43Add = 3919 + INTEGER(IntKi), PARAMETER :: B8ADOF44Add = 3920 + INTEGER(IntKi), PARAMETER :: B8ADOF45Add = 3921 + INTEGER(IntKi), PARAMETER :: B8ADOF46Add = 3922 + INTEGER(IntKi), PARAMETER :: B8ADOF47Add = 3923 + INTEGER(IntKi), PARAMETER :: B8ADOF48Add = 3924 + INTEGER(IntKi), PARAMETER :: B8ADOF49Add = 3925 + INTEGER(IntKi), PARAMETER :: B8ADOF50Add = 3926 + INTEGER(IntKi), PARAMETER :: B8ADOF51Add = 3927 + INTEGER(IntKi), PARAMETER :: B8ADOF52Add = 3928 + INTEGER(IntKi), PARAMETER :: B8ADOF53Add = 3929 + INTEGER(IntKi), PARAMETER :: B8ADOF54Add = 3930 + INTEGER(IntKi), PARAMETER :: B8ADOF55Add = 3931 + INTEGER(IntKi), PARAMETER :: B8ADOF56Add = 3932 + INTEGER(IntKi), PARAMETER :: B8ADOF57Add = 3933 + INTEGER(IntKi), PARAMETER :: B8ADOF58Add = 3934 + INTEGER(IntKi), PARAMETER :: B8ADOF59Add = 3935 + INTEGER(IntKi), PARAMETER :: B8ADOF60Add = 3936 + INTEGER(IntKi), PARAMETER :: B8ADOF61Add = 3937 + INTEGER(IntKi), PARAMETER :: B8ADOF62Add = 3938 + INTEGER(IntKi), PARAMETER :: B8ADOF63Add = 3939 + INTEGER(IntKi), PARAMETER :: B8ADOF64Add = 3940 + INTEGER(IntKi), PARAMETER :: B8ADOF65Add = 3941 + INTEGER(IntKi), PARAMETER :: B8ADOF66Add = 3942 + INTEGER(IntKi), PARAMETER :: B8ADOF67Add = 3943 + INTEGER(IntKi), PARAMETER :: B8ADOF68Add = 3944 + INTEGER(IntKi), PARAMETER :: B8ADOF69Add = 3945 + INTEGER(IntKi), PARAMETER :: B8ADOF70Add = 3946 + INTEGER(IntKi), PARAMETER :: B8ADOF71Add = 3947 + INTEGER(IntKi), PARAMETER :: B8ADOF72Add = 3948 + INTEGER(IntKi), PARAMETER :: B8ADOF73Add = 3949 + INTEGER(IntKi), PARAMETER :: B8ADOF74Add = 3950 + INTEGER(IntKi), PARAMETER :: B8ADOF75Add = 3951 + INTEGER(IntKi), PARAMETER :: B8ADOF76Add = 3952 + INTEGER(IntKi), PARAMETER :: B8ADOF77Add = 3953 + INTEGER(IntKi), PARAMETER :: B8ADOF78Add = 3954 + INTEGER(IntKi), PARAMETER :: B8ADOF79Add = 3955 + INTEGER(IntKi), PARAMETER :: B8ADOF80Add = 3956 + INTEGER(IntKi), PARAMETER :: B8ADOF81Add = 3957 + INTEGER(IntKi), PARAMETER :: B8ADOF82Add = 3958 + INTEGER(IntKi), PARAMETER :: B8ADOF83Add = 3959 + INTEGER(IntKi), PARAMETER :: B8ADOF84Add = 3960 + INTEGER(IntKi), PARAMETER :: B8ADOF85Add = 3961 + INTEGER(IntKi), PARAMETER :: B8ADOF86Add = 3962 + INTEGER(IntKi), PARAMETER :: B8ADOF87Add = 3963 + INTEGER(IntKi), PARAMETER :: B8ADOF88Add = 3964 + INTEGER(IntKi), PARAMETER :: B8ADOF89Add = 3965 + INTEGER(IntKi), PARAMETER :: B8ADOF90Add = 3966 + INTEGER(IntKi), PARAMETER :: B8ADOF91Add = 3967 + INTEGER(IntKi), PARAMETER :: B8ADOF92Add = 3968 + INTEGER(IntKi), PARAMETER :: B8ADOF93Add = 3969 + INTEGER(IntKi), PARAMETER :: B8ADOF94Add = 3970 + INTEGER(IntKi), PARAMETER :: B8ADOF95Add = 3971 + INTEGER(IntKi), PARAMETER :: B8ADOF96Add = 3972 + INTEGER(IntKi), PARAMETER :: B8ADOF97Add = 3973 + INTEGER(IntKi), PARAMETER :: B8ADOF98Add = 3974 + INTEGER(IntKi), PARAMETER :: B8ADOF99Add = 3975 + INTEGER(IntKi), PARAMETER :: B9ADOF1Add = 3976 + INTEGER(IntKi), PARAMETER :: B9ADOF2Add = 3977 + INTEGER(IntKi), PARAMETER :: B9ADOF3Add = 3978 + INTEGER(IntKi), PARAMETER :: B9ADOF4Add = 3979 + INTEGER(IntKi), PARAMETER :: B9ADOF5Add = 3980 + INTEGER(IntKi), PARAMETER :: B9ADOF6Add = 3981 + INTEGER(IntKi), PARAMETER :: B9ADOF7Add = 3982 + INTEGER(IntKi), PARAMETER :: B9ADOF8Add = 3983 + INTEGER(IntKi), PARAMETER :: B9ADOF9Add = 3984 + INTEGER(IntKi), PARAMETER :: B9ADOF10Add = 3985 + INTEGER(IntKi), PARAMETER :: B9ADOF11Add = 3986 + INTEGER(IntKi), PARAMETER :: B9ADOF12Add = 3987 + INTEGER(IntKi), PARAMETER :: B9ADOF13Add = 3988 + INTEGER(IntKi), PARAMETER :: B9ADOF14Add = 3989 + INTEGER(IntKi), PARAMETER :: B9ADOF15Add = 3990 + INTEGER(IntKi), PARAMETER :: B9ADOF16Add = 3991 + INTEGER(IntKi), PARAMETER :: B9ADOF17Add = 3992 + INTEGER(IntKi), PARAMETER :: B9ADOF18Add = 3993 + INTEGER(IntKi), PARAMETER :: B9ADOF19Add = 3994 + INTEGER(IntKi), PARAMETER :: B9ADOF20Add = 3995 + INTEGER(IntKi), PARAMETER :: B9ADOF21Add = 3996 + INTEGER(IntKi), PARAMETER :: B9ADOF22Add = 3997 + INTEGER(IntKi), PARAMETER :: B9ADOF23Add = 3998 + INTEGER(IntKi), PARAMETER :: B9ADOF24Add = 3999 + INTEGER(IntKi), PARAMETER :: B9ADOF25Add = 4000 + INTEGER(IntKi), PARAMETER :: B9ADOF26Add = 4001 + INTEGER(IntKi), PARAMETER :: B9ADOF27Add = 4002 + INTEGER(IntKi), PARAMETER :: B9ADOF28Add = 4003 + INTEGER(IntKi), PARAMETER :: B9ADOF29Add = 4004 + INTEGER(IntKi), PARAMETER :: B9ADOF30Add = 4005 + INTEGER(IntKi), PARAMETER :: B9ADOF31Add = 4006 + INTEGER(IntKi), PARAMETER :: B9ADOF32Add = 4007 + INTEGER(IntKi), PARAMETER :: B9ADOF33Add = 4008 + INTEGER(IntKi), PARAMETER :: B9ADOF34Add = 4009 + INTEGER(IntKi), PARAMETER :: B9ADOF35Add = 4010 + INTEGER(IntKi), PARAMETER :: B9ADOF36Add = 4011 + INTEGER(IntKi), PARAMETER :: B9ADOF37Add = 4012 + INTEGER(IntKi), PARAMETER :: B9ADOF38Add = 4013 + INTEGER(IntKi), PARAMETER :: B9ADOF39Add = 4014 + INTEGER(IntKi), PARAMETER :: B9ADOF40Add = 4015 + INTEGER(IntKi), PARAMETER :: B9ADOF41Add = 4016 + INTEGER(IntKi), PARAMETER :: B9ADOF42Add = 4017 + INTEGER(IntKi), PARAMETER :: B9ADOF43Add = 4018 + INTEGER(IntKi), PARAMETER :: B9ADOF44Add = 4019 + INTEGER(IntKi), PARAMETER :: B9ADOF45Add = 4020 + INTEGER(IntKi), PARAMETER :: B9ADOF46Add = 4021 + INTEGER(IntKi), PARAMETER :: B9ADOF47Add = 4022 + INTEGER(IntKi), PARAMETER :: B9ADOF48Add = 4023 + INTEGER(IntKi), PARAMETER :: B9ADOF49Add = 4024 + INTEGER(IntKi), PARAMETER :: B9ADOF50Add = 4025 + INTEGER(IntKi), PARAMETER :: B9ADOF51Add = 4026 + INTEGER(IntKi), PARAMETER :: B9ADOF52Add = 4027 + INTEGER(IntKi), PARAMETER :: B9ADOF53Add = 4028 + INTEGER(IntKi), PARAMETER :: B9ADOF54Add = 4029 + INTEGER(IntKi), PARAMETER :: B9ADOF55Add = 4030 + INTEGER(IntKi), PARAMETER :: B9ADOF56Add = 4031 + INTEGER(IntKi), PARAMETER :: B9ADOF57Add = 4032 + INTEGER(IntKi), PARAMETER :: B9ADOF58Add = 4033 + INTEGER(IntKi), PARAMETER :: B9ADOF59Add = 4034 + INTEGER(IntKi), PARAMETER :: B9ADOF60Add = 4035 + INTEGER(IntKi), PARAMETER :: B9ADOF61Add = 4036 + INTEGER(IntKi), PARAMETER :: B9ADOF62Add = 4037 + INTEGER(IntKi), PARAMETER :: B9ADOF63Add = 4038 + INTEGER(IntKi), PARAMETER :: B9ADOF64Add = 4039 + INTEGER(IntKi), PARAMETER :: B9ADOF65Add = 4040 + INTEGER(IntKi), PARAMETER :: B9ADOF66Add = 4041 + INTEGER(IntKi), PARAMETER :: B9ADOF67Add = 4042 + INTEGER(IntKi), PARAMETER :: B9ADOF68Add = 4043 + INTEGER(IntKi), PARAMETER :: B9ADOF69Add = 4044 + INTEGER(IntKi), PARAMETER :: B9ADOF70Add = 4045 + INTEGER(IntKi), PARAMETER :: B9ADOF71Add = 4046 + INTEGER(IntKi), PARAMETER :: B9ADOF72Add = 4047 + INTEGER(IntKi), PARAMETER :: B9ADOF73Add = 4048 + INTEGER(IntKi), PARAMETER :: B9ADOF74Add = 4049 + INTEGER(IntKi), PARAMETER :: B9ADOF75Add = 4050 + INTEGER(IntKi), PARAMETER :: B9ADOF76Add = 4051 + INTEGER(IntKi), PARAMETER :: B9ADOF77Add = 4052 + INTEGER(IntKi), PARAMETER :: B9ADOF78Add = 4053 + INTEGER(IntKi), PARAMETER :: B9ADOF79Add = 4054 + INTEGER(IntKi), PARAMETER :: B9ADOF80Add = 4055 + INTEGER(IntKi), PARAMETER :: B9ADOF81Add = 4056 + INTEGER(IntKi), PARAMETER :: B9ADOF82Add = 4057 + INTEGER(IntKi), PARAMETER :: B9ADOF83Add = 4058 + INTEGER(IntKi), PARAMETER :: B9ADOF84Add = 4059 + INTEGER(IntKi), PARAMETER :: B9ADOF85Add = 4060 + INTEGER(IntKi), PARAMETER :: B9ADOF86Add = 4061 + INTEGER(IntKi), PARAMETER :: B9ADOF87Add = 4062 + INTEGER(IntKi), PARAMETER :: B9ADOF88Add = 4063 + INTEGER(IntKi), PARAMETER :: B9ADOF89Add = 4064 + INTEGER(IntKi), PARAMETER :: B9ADOF90Add = 4065 + INTEGER(IntKi), PARAMETER :: B9ADOF91Add = 4066 + INTEGER(IntKi), PARAMETER :: B9ADOF92Add = 4067 + INTEGER(IntKi), PARAMETER :: B9ADOF93Add = 4068 + INTEGER(IntKi), PARAMETER :: B9ADOF94Add = 4069 + INTEGER(IntKi), PARAMETER :: B9ADOF95Add = 4070 + INTEGER(IntKi), PARAMETER :: B9ADOF96Add = 4071 + INTEGER(IntKi), PARAMETER :: B9ADOF97Add = 4072 + INTEGER(IntKi), PARAMETER :: B9ADOF98Add = 4073 + INTEGER(IntKi), PARAMETER :: B9ADOF99Add = 4074 + INTEGER(IntKi), PARAMETER :: B1ADOF1Rdt = 4075 + INTEGER(IntKi), PARAMETER :: B1ADOF2Rdt = 4076 + INTEGER(IntKi), PARAMETER :: B1ADOF3Rdt = 4077 + INTEGER(IntKi), PARAMETER :: B1ADOF4Rdt = 4078 + INTEGER(IntKi), PARAMETER :: B1ADOF5Rdt = 4079 + INTEGER(IntKi), PARAMETER :: B1ADOF6Rdt = 4080 + INTEGER(IntKi), PARAMETER :: B1ADOF7Rdt = 4081 + INTEGER(IntKi), PARAMETER :: B1ADOF8Rdt = 4082 + INTEGER(IntKi), PARAMETER :: B1ADOF9Rdt = 4083 + INTEGER(IntKi), PARAMETER :: B1ADOF10Rdt = 4084 + INTEGER(IntKi), PARAMETER :: B1ADOF11Rdt = 4085 + INTEGER(IntKi), PARAMETER :: B1ADOF12Rdt = 4086 + INTEGER(IntKi), PARAMETER :: B1ADOF13Rdt = 4087 + INTEGER(IntKi), PARAMETER :: B1ADOF14Rdt = 4088 + INTEGER(IntKi), PARAMETER :: B1ADOF15Rdt = 4089 + INTEGER(IntKi), PARAMETER :: B1ADOF16Rdt = 4090 + INTEGER(IntKi), PARAMETER :: B1ADOF17Rdt = 4091 + INTEGER(IntKi), PARAMETER :: B1ADOF18Rdt = 4092 + INTEGER(IntKi), PARAMETER :: B1ADOF19Rdt = 4093 + INTEGER(IntKi), PARAMETER :: B1ADOF20Rdt = 4094 + INTEGER(IntKi), PARAMETER :: B1ADOF21Rdt = 4095 + INTEGER(IntKi), PARAMETER :: B1ADOF22Rdt = 4096 + INTEGER(IntKi), PARAMETER :: B1ADOF23Rdt = 4097 + INTEGER(IntKi), PARAMETER :: B1ADOF24Rdt = 4098 + INTEGER(IntKi), PARAMETER :: B1ADOF25Rdt = 4099 + INTEGER(IntKi), PARAMETER :: B1ADOF26Rdt = 4100 + INTEGER(IntKi), PARAMETER :: B1ADOF27Rdt = 4101 + INTEGER(IntKi), PARAMETER :: B1ADOF28Rdt = 4102 + INTEGER(IntKi), PARAMETER :: B1ADOF29Rdt = 4103 + INTEGER(IntKi), PARAMETER :: B1ADOF30Rdt = 4104 + INTEGER(IntKi), PARAMETER :: B1ADOF31Rdt = 4105 + INTEGER(IntKi), PARAMETER :: B1ADOF32Rdt = 4106 + INTEGER(IntKi), PARAMETER :: B1ADOF33Rdt = 4107 + INTEGER(IntKi), PARAMETER :: B1ADOF34Rdt = 4108 + INTEGER(IntKi), PARAMETER :: B1ADOF35Rdt = 4109 + INTEGER(IntKi), PARAMETER :: B1ADOF36Rdt = 4110 + INTEGER(IntKi), PARAMETER :: B1ADOF37Rdt = 4111 + INTEGER(IntKi), PARAMETER :: B1ADOF38Rdt = 4112 + INTEGER(IntKi), PARAMETER :: B1ADOF39Rdt = 4113 + INTEGER(IntKi), PARAMETER :: B1ADOF40Rdt = 4114 + INTEGER(IntKi), PARAMETER :: B1ADOF41Rdt = 4115 + INTEGER(IntKi), PARAMETER :: B1ADOF42Rdt = 4116 + INTEGER(IntKi), PARAMETER :: B1ADOF43Rdt = 4117 + INTEGER(IntKi), PARAMETER :: B1ADOF44Rdt = 4118 + INTEGER(IntKi), PARAMETER :: B1ADOF45Rdt = 4119 + INTEGER(IntKi), PARAMETER :: B1ADOF46Rdt = 4120 + INTEGER(IntKi), PARAMETER :: B1ADOF47Rdt = 4121 + INTEGER(IntKi), PARAMETER :: B1ADOF48Rdt = 4122 + INTEGER(IntKi), PARAMETER :: B1ADOF49Rdt = 4123 + INTEGER(IntKi), PARAMETER :: B1ADOF50Rdt = 4124 + INTEGER(IntKi), PARAMETER :: B1ADOF51Rdt = 4125 + INTEGER(IntKi), PARAMETER :: B1ADOF52Rdt = 4126 + INTEGER(IntKi), PARAMETER :: B1ADOF53Rdt = 4127 + INTEGER(IntKi), PARAMETER :: B1ADOF54Rdt = 4128 + INTEGER(IntKi), PARAMETER :: B1ADOF55Rdt = 4129 + INTEGER(IntKi), PARAMETER :: B1ADOF56Rdt = 4130 + INTEGER(IntKi), PARAMETER :: B1ADOF57Rdt = 4131 + INTEGER(IntKi), PARAMETER :: B1ADOF58Rdt = 4132 + INTEGER(IntKi), PARAMETER :: B1ADOF59Rdt = 4133 + INTEGER(IntKi), PARAMETER :: B1ADOF60Rdt = 4134 + INTEGER(IntKi), PARAMETER :: B1ADOF61Rdt = 4135 + INTEGER(IntKi), PARAMETER :: B1ADOF62Rdt = 4136 + INTEGER(IntKi), PARAMETER :: B1ADOF63Rdt = 4137 + INTEGER(IntKi), PARAMETER :: B1ADOF64Rdt = 4138 + INTEGER(IntKi), PARAMETER :: B1ADOF65Rdt = 4139 + INTEGER(IntKi), PARAMETER :: B1ADOF66Rdt = 4140 + INTEGER(IntKi), PARAMETER :: B1ADOF67Rdt = 4141 + INTEGER(IntKi), PARAMETER :: B1ADOF68Rdt = 4142 + INTEGER(IntKi), PARAMETER :: B1ADOF69Rdt = 4143 + INTEGER(IntKi), PARAMETER :: B1ADOF70Rdt = 4144 + INTEGER(IntKi), PARAMETER :: B1ADOF71Rdt = 4145 + INTEGER(IntKi), PARAMETER :: B1ADOF72Rdt = 4146 + INTEGER(IntKi), PARAMETER :: B1ADOF73Rdt = 4147 + INTEGER(IntKi), PARAMETER :: B1ADOF74Rdt = 4148 + INTEGER(IntKi), PARAMETER :: B1ADOF75Rdt = 4149 + INTEGER(IntKi), PARAMETER :: B1ADOF76Rdt = 4150 + INTEGER(IntKi), PARAMETER :: B1ADOF77Rdt = 4151 + INTEGER(IntKi), PARAMETER :: B1ADOF78Rdt = 4152 + INTEGER(IntKi), PARAMETER :: B1ADOF79Rdt = 4153 + INTEGER(IntKi), PARAMETER :: B1ADOF80Rdt = 4154 + INTEGER(IntKi), PARAMETER :: B1ADOF81Rdt = 4155 + INTEGER(IntKi), PARAMETER :: B1ADOF82Rdt = 4156 + INTEGER(IntKi), PARAMETER :: B1ADOF83Rdt = 4157 + INTEGER(IntKi), PARAMETER :: B1ADOF84Rdt = 4158 + INTEGER(IntKi), PARAMETER :: B1ADOF85Rdt = 4159 + INTEGER(IntKi), PARAMETER :: B1ADOF86Rdt = 4160 + INTEGER(IntKi), PARAMETER :: B1ADOF87Rdt = 4161 + INTEGER(IntKi), PARAMETER :: B1ADOF88Rdt = 4162 + INTEGER(IntKi), PARAMETER :: B1ADOF89Rdt = 4163 + INTEGER(IntKi), PARAMETER :: B1ADOF90Rdt = 4164 + INTEGER(IntKi), PARAMETER :: B1ADOF91Rdt = 4165 + INTEGER(IntKi), PARAMETER :: B1ADOF92Rdt = 4166 + INTEGER(IntKi), PARAMETER :: B1ADOF93Rdt = 4167 + INTEGER(IntKi), PARAMETER :: B1ADOF94Rdt = 4168 + INTEGER(IntKi), PARAMETER :: B1ADOF95Rdt = 4169 + INTEGER(IntKi), PARAMETER :: B1ADOF96Rdt = 4170 + INTEGER(IntKi), PARAMETER :: B1ADOF97Rdt = 4171 + INTEGER(IntKi), PARAMETER :: B1ADOF98Rdt = 4172 + INTEGER(IntKi), PARAMETER :: B1ADOF99Rdt = 4173 + INTEGER(IntKi), PARAMETER :: B2ADOF1Rdt = 4174 + INTEGER(IntKi), PARAMETER :: B2ADOF2Rdt = 4175 + INTEGER(IntKi), PARAMETER :: B2ADOF3Rdt = 4176 + INTEGER(IntKi), PARAMETER :: B2ADOF4Rdt = 4177 + INTEGER(IntKi), PARAMETER :: B2ADOF5Rdt = 4178 + INTEGER(IntKi), PARAMETER :: B2ADOF6Rdt = 4179 + INTEGER(IntKi), PARAMETER :: B2ADOF7Rdt = 4180 + INTEGER(IntKi), PARAMETER :: B2ADOF8Rdt = 4181 + INTEGER(IntKi), PARAMETER :: B2ADOF9Rdt = 4182 + INTEGER(IntKi), PARAMETER :: B2ADOF10Rdt = 4183 + INTEGER(IntKi), PARAMETER :: B2ADOF11Rdt = 4184 + INTEGER(IntKi), PARAMETER :: B2ADOF12Rdt = 4185 + INTEGER(IntKi), PARAMETER :: B2ADOF13Rdt = 4186 + INTEGER(IntKi), PARAMETER :: B2ADOF14Rdt = 4187 + INTEGER(IntKi), PARAMETER :: B2ADOF15Rdt = 4188 + INTEGER(IntKi), PARAMETER :: B2ADOF16Rdt = 4189 + INTEGER(IntKi), PARAMETER :: B2ADOF17Rdt = 4190 + INTEGER(IntKi), PARAMETER :: B2ADOF18Rdt = 4191 + INTEGER(IntKi), PARAMETER :: B2ADOF19Rdt = 4192 + INTEGER(IntKi), PARAMETER :: B2ADOF20Rdt = 4193 + INTEGER(IntKi), PARAMETER :: B2ADOF21Rdt = 4194 + INTEGER(IntKi), PARAMETER :: B2ADOF22Rdt = 4195 + INTEGER(IntKi), PARAMETER :: B2ADOF23Rdt = 4196 + INTEGER(IntKi), PARAMETER :: B2ADOF24Rdt = 4197 + INTEGER(IntKi), PARAMETER :: B2ADOF25Rdt = 4198 + INTEGER(IntKi), PARAMETER :: B2ADOF26Rdt = 4199 + INTEGER(IntKi), PARAMETER :: B2ADOF27Rdt = 4200 + INTEGER(IntKi), PARAMETER :: B2ADOF28Rdt = 4201 + INTEGER(IntKi), PARAMETER :: B2ADOF29Rdt = 4202 + INTEGER(IntKi), PARAMETER :: B2ADOF30Rdt = 4203 + INTEGER(IntKi), PARAMETER :: B2ADOF31Rdt = 4204 + INTEGER(IntKi), PARAMETER :: B2ADOF32Rdt = 4205 + INTEGER(IntKi), PARAMETER :: B2ADOF33Rdt = 4206 + INTEGER(IntKi), PARAMETER :: B2ADOF34Rdt = 4207 + INTEGER(IntKi), PARAMETER :: B2ADOF35Rdt = 4208 + INTEGER(IntKi), PARAMETER :: B2ADOF36Rdt = 4209 + INTEGER(IntKi), PARAMETER :: B2ADOF37Rdt = 4210 + INTEGER(IntKi), PARAMETER :: B2ADOF38Rdt = 4211 + INTEGER(IntKi), PARAMETER :: B2ADOF39Rdt = 4212 + INTEGER(IntKi), PARAMETER :: B2ADOF40Rdt = 4213 + INTEGER(IntKi), PARAMETER :: B2ADOF41Rdt = 4214 + INTEGER(IntKi), PARAMETER :: B2ADOF42Rdt = 4215 + INTEGER(IntKi), PARAMETER :: B2ADOF43Rdt = 4216 + INTEGER(IntKi), PARAMETER :: B2ADOF44Rdt = 4217 + INTEGER(IntKi), PARAMETER :: B2ADOF45Rdt = 4218 + INTEGER(IntKi), PARAMETER :: B2ADOF46Rdt = 4219 + INTEGER(IntKi), PARAMETER :: B2ADOF47Rdt = 4220 + INTEGER(IntKi), PARAMETER :: B2ADOF48Rdt = 4221 + INTEGER(IntKi), PARAMETER :: B2ADOF49Rdt = 4222 + INTEGER(IntKi), PARAMETER :: B2ADOF50Rdt = 4223 + INTEGER(IntKi), PARAMETER :: B2ADOF51Rdt = 4224 + INTEGER(IntKi), PARAMETER :: B2ADOF52Rdt = 4225 + INTEGER(IntKi), PARAMETER :: B2ADOF53Rdt = 4226 + INTEGER(IntKi), PARAMETER :: B2ADOF54Rdt = 4227 + INTEGER(IntKi), PARAMETER :: B2ADOF55Rdt = 4228 + INTEGER(IntKi), PARAMETER :: B2ADOF56Rdt = 4229 + INTEGER(IntKi), PARAMETER :: B2ADOF57Rdt = 4230 + INTEGER(IntKi), PARAMETER :: B2ADOF58Rdt = 4231 + INTEGER(IntKi), PARAMETER :: B2ADOF59Rdt = 4232 + INTEGER(IntKi), PARAMETER :: B2ADOF60Rdt = 4233 + INTEGER(IntKi), PARAMETER :: B2ADOF61Rdt = 4234 + INTEGER(IntKi), PARAMETER :: B2ADOF62Rdt = 4235 + INTEGER(IntKi), PARAMETER :: B2ADOF63Rdt = 4236 + INTEGER(IntKi), PARAMETER :: B2ADOF64Rdt = 4237 + INTEGER(IntKi), PARAMETER :: B2ADOF65Rdt = 4238 + INTEGER(IntKi), PARAMETER :: B2ADOF66Rdt = 4239 + INTEGER(IntKi), PARAMETER :: B2ADOF67Rdt = 4240 + INTEGER(IntKi), PARAMETER :: B2ADOF68Rdt = 4241 + INTEGER(IntKi), PARAMETER :: B2ADOF69Rdt = 4242 + INTEGER(IntKi), PARAMETER :: B2ADOF70Rdt = 4243 + INTEGER(IntKi), PARAMETER :: B2ADOF71Rdt = 4244 + INTEGER(IntKi), PARAMETER :: B2ADOF72Rdt = 4245 + INTEGER(IntKi), PARAMETER :: B2ADOF73Rdt = 4246 + INTEGER(IntKi), PARAMETER :: B2ADOF74Rdt = 4247 + INTEGER(IntKi), PARAMETER :: B2ADOF75Rdt = 4248 + INTEGER(IntKi), PARAMETER :: B2ADOF76Rdt = 4249 + INTEGER(IntKi), PARAMETER :: B2ADOF77Rdt = 4250 + INTEGER(IntKi), PARAMETER :: B2ADOF78Rdt = 4251 + INTEGER(IntKi), PARAMETER :: B2ADOF79Rdt = 4252 + INTEGER(IntKi), PARAMETER :: B2ADOF80Rdt = 4253 + INTEGER(IntKi), PARAMETER :: B2ADOF81Rdt = 4254 + INTEGER(IntKi), PARAMETER :: B2ADOF82Rdt = 4255 + INTEGER(IntKi), PARAMETER :: B2ADOF83Rdt = 4256 + INTEGER(IntKi), PARAMETER :: B2ADOF84Rdt = 4257 + INTEGER(IntKi), PARAMETER :: B2ADOF85Rdt = 4258 + INTEGER(IntKi), PARAMETER :: B2ADOF86Rdt = 4259 + INTEGER(IntKi), PARAMETER :: B2ADOF87Rdt = 4260 + INTEGER(IntKi), PARAMETER :: B2ADOF88Rdt = 4261 + INTEGER(IntKi), PARAMETER :: B2ADOF89Rdt = 4262 + INTEGER(IntKi), PARAMETER :: B2ADOF90Rdt = 4263 + INTEGER(IntKi), PARAMETER :: B2ADOF91Rdt = 4264 + INTEGER(IntKi), PARAMETER :: B2ADOF92Rdt = 4265 + INTEGER(IntKi), PARAMETER :: B2ADOF93Rdt = 4266 + INTEGER(IntKi), PARAMETER :: B2ADOF94Rdt = 4267 + INTEGER(IntKi), PARAMETER :: B2ADOF95Rdt = 4268 + INTEGER(IntKi), PARAMETER :: B2ADOF96Rdt = 4269 + INTEGER(IntKi), PARAMETER :: B2ADOF97Rdt = 4270 + INTEGER(IntKi), PARAMETER :: B2ADOF98Rdt = 4271 + INTEGER(IntKi), PARAMETER :: B2ADOF99Rdt = 4272 + INTEGER(IntKi), PARAMETER :: B3ADOF1Rdt = 4273 + INTEGER(IntKi), PARAMETER :: B3ADOF2Rdt = 4274 + INTEGER(IntKi), PARAMETER :: B3ADOF3Rdt = 4275 + INTEGER(IntKi), PARAMETER :: B3ADOF4Rdt = 4276 + INTEGER(IntKi), PARAMETER :: B3ADOF5Rdt = 4277 + INTEGER(IntKi), PARAMETER :: B3ADOF6Rdt = 4278 + INTEGER(IntKi), PARAMETER :: B3ADOF7Rdt = 4279 + INTEGER(IntKi), PARAMETER :: B3ADOF8Rdt = 4280 + INTEGER(IntKi), PARAMETER :: B3ADOF9Rdt = 4281 + INTEGER(IntKi), PARAMETER :: B3ADOF10Rdt = 4282 + INTEGER(IntKi), PARAMETER :: B3ADOF11Rdt = 4283 + INTEGER(IntKi), PARAMETER :: B3ADOF12Rdt = 4284 + INTEGER(IntKi), PARAMETER :: B3ADOF13Rdt = 4285 + INTEGER(IntKi), PARAMETER :: B3ADOF14Rdt = 4286 + INTEGER(IntKi), PARAMETER :: B3ADOF15Rdt = 4287 + INTEGER(IntKi), PARAMETER :: B3ADOF16Rdt = 4288 + INTEGER(IntKi), PARAMETER :: B3ADOF17Rdt = 4289 + INTEGER(IntKi), PARAMETER :: B3ADOF18Rdt = 4290 + INTEGER(IntKi), PARAMETER :: B3ADOF19Rdt = 4291 + INTEGER(IntKi), PARAMETER :: B3ADOF20Rdt = 4292 + INTEGER(IntKi), PARAMETER :: B3ADOF21Rdt = 4293 + INTEGER(IntKi), PARAMETER :: B3ADOF22Rdt = 4294 + INTEGER(IntKi), PARAMETER :: B3ADOF23Rdt = 4295 + INTEGER(IntKi), PARAMETER :: B3ADOF24Rdt = 4296 + INTEGER(IntKi), PARAMETER :: B3ADOF25Rdt = 4297 + INTEGER(IntKi), PARAMETER :: B3ADOF26Rdt = 4298 + INTEGER(IntKi), PARAMETER :: B3ADOF27Rdt = 4299 + INTEGER(IntKi), PARAMETER :: B3ADOF28Rdt = 4300 + INTEGER(IntKi), PARAMETER :: B3ADOF29Rdt = 4301 + INTEGER(IntKi), PARAMETER :: B3ADOF30Rdt = 4302 + INTEGER(IntKi), PARAMETER :: B3ADOF31Rdt = 4303 + INTEGER(IntKi), PARAMETER :: B3ADOF32Rdt = 4304 + INTEGER(IntKi), PARAMETER :: B3ADOF33Rdt = 4305 + INTEGER(IntKi), PARAMETER :: B3ADOF34Rdt = 4306 + INTEGER(IntKi), PARAMETER :: B3ADOF35Rdt = 4307 + INTEGER(IntKi), PARAMETER :: B3ADOF36Rdt = 4308 + INTEGER(IntKi), PARAMETER :: B3ADOF37Rdt = 4309 + INTEGER(IntKi), PARAMETER :: B3ADOF38Rdt = 4310 + INTEGER(IntKi), PARAMETER :: B3ADOF39Rdt = 4311 + INTEGER(IntKi), PARAMETER :: B3ADOF40Rdt = 4312 + INTEGER(IntKi), PARAMETER :: B3ADOF41Rdt = 4313 + INTEGER(IntKi), PARAMETER :: B3ADOF42Rdt = 4314 + INTEGER(IntKi), PARAMETER :: B3ADOF43Rdt = 4315 + INTEGER(IntKi), PARAMETER :: B3ADOF44Rdt = 4316 + INTEGER(IntKi), PARAMETER :: B3ADOF45Rdt = 4317 + INTEGER(IntKi), PARAMETER :: B3ADOF46Rdt = 4318 + INTEGER(IntKi), PARAMETER :: B3ADOF47Rdt = 4319 + INTEGER(IntKi), PARAMETER :: B3ADOF48Rdt = 4320 + INTEGER(IntKi), PARAMETER :: B3ADOF49Rdt = 4321 + INTEGER(IntKi), PARAMETER :: B3ADOF50Rdt = 4322 + INTEGER(IntKi), PARAMETER :: B3ADOF51Rdt = 4323 + INTEGER(IntKi), PARAMETER :: B3ADOF52Rdt = 4324 + INTEGER(IntKi), PARAMETER :: B3ADOF53Rdt = 4325 + INTEGER(IntKi), PARAMETER :: B3ADOF54Rdt = 4326 + INTEGER(IntKi), PARAMETER :: B3ADOF55Rdt = 4327 + INTEGER(IntKi), PARAMETER :: B3ADOF56Rdt = 4328 + INTEGER(IntKi), PARAMETER :: B3ADOF57Rdt = 4329 + INTEGER(IntKi), PARAMETER :: B3ADOF58Rdt = 4330 + INTEGER(IntKi), PARAMETER :: B3ADOF59Rdt = 4331 + INTEGER(IntKi), PARAMETER :: B3ADOF60Rdt = 4332 + INTEGER(IntKi), PARAMETER :: B3ADOF61Rdt = 4333 + INTEGER(IntKi), PARAMETER :: B3ADOF62Rdt = 4334 + INTEGER(IntKi), PARAMETER :: B3ADOF63Rdt = 4335 + INTEGER(IntKi), PARAMETER :: B3ADOF64Rdt = 4336 + INTEGER(IntKi), PARAMETER :: B3ADOF65Rdt = 4337 + INTEGER(IntKi), PARAMETER :: B3ADOF66Rdt = 4338 + INTEGER(IntKi), PARAMETER :: B3ADOF67Rdt = 4339 + INTEGER(IntKi), PARAMETER :: B3ADOF68Rdt = 4340 + INTEGER(IntKi), PARAMETER :: B3ADOF69Rdt = 4341 + INTEGER(IntKi), PARAMETER :: B3ADOF70Rdt = 4342 + INTEGER(IntKi), PARAMETER :: B3ADOF71Rdt = 4343 + INTEGER(IntKi), PARAMETER :: B3ADOF72Rdt = 4344 + INTEGER(IntKi), PARAMETER :: B3ADOF73Rdt = 4345 + INTEGER(IntKi), PARAMETER :: B3ADOF74Rdt = 4346 + INTEGER(IntKi), PARAMETER :: B3ADOF75Rdt = 4347 + INTEGER(IntKi), PARAMETER :: B3ADOF76Rdt = 4348 + INTEGER(IntKi), PARAMETER :: B3ADOF77Rdt = 4349 + INTEGER(IntKi), PARAMETER :: B3ADOF78Rdt = 4350 + INTEGER(IntKi), PARAMETER :: B3ADOF79Rdt = 4351 + INTEGER(IntKi), PARAMETER :: B3ADOF80Rdt = 4352 + INTEGER(IntKi), PARAMETER :: B3ADOF81Rdt = 4353 + INTEGER(IntKi), PARAMETER :: B3ADOF82Rdt = 4354 + INTEGER(IntKi), PARAMETER :: B3ADOF83Rdt = 4355 + INTEGER(IntKi), PARAMETER :: B3ADOF84Rdt = 4356 + INTEGER(IntKi), PARAMETER :: B3ADOF85Rdt = 4357 + INTEGER(IntKi), PARAMETER :: B3ADOF86Rdt = 4358 + INTEGER(IntKi), PARAMETER :: B3ADOF87Rdt = 4359 + INTEGER(IntKi), PARAMETER :: B3ADOF88Rdt = 4360 + INTEGER(IntKi), PARAMETER :: B3ADOF89Rdt = 4361 + INTEGER(IntKi), PARAMETER :: B3ADOF90Rdt = 4362 + INTEGER(IntKi), PARAMETER :: B3ADOF91Rdt = 4363 + INTEGER(IntKi), PARAMETER :: B3ADOF92Rdt = 4364 + INTEGER(IntKi), PARAMETER :: B3ADOF93Rdt = 4365 + INTEGER(IntKi), PARAMETER :: B3ADOF94Rdt = 4366 + INTEGER(IntKi), PARAMETER :: B3ADOF95Rdt = 4367 + INTEGER(IntKi), PARAMETER :: B3ADOF96Rdt = 4368 + INTEGER(IntKi), PARAMETER :: B3ADOF97Rdt = 4369 + INTEGER(IntKi), PARAMETER :: B3ADOF98Rdt = 4370 + INTEGER(IntKi), PARAMETER :: B3ADOF99Rdt = 4371 + INTEGER(IntKi), PARAMETER :: B4ADOF1Rdt = 4372 + INTEGER(IntKi), PARAMETER :: B4ADOF2Rdt = 4373 + INTEGER(IntKi), PARAMETER :: B4ADOF3Rdt = 4374 + INTEGER(IntKi), PARAMETER :: B4ADOF4Rdt = 4375 + INTEGER(IntKi), PARAMETER :: B4ADOF5Rdt = 4376 + INTEGER(IntKi), PARAMETER :: B4ADOF6Rdt = 4377 + INTEGER(IntKi), PARAMETER :: B4ADOF7Rdt = 4378 + INTEGER(IntKi), PARAMETER :: B4ADOF8Rdt = 4379 + INTEGER(IntKi), PARAMETER :: B4ADOF9Rdt = 4380 + INTEGER(IntKi), PARAMETER :: B4ADOF10Rdt = 4381 + INTEGER(IntKi), PARAMETER :: B4ADOF11Rdt = 4382 + INTEGER(IntKi), PARAMETER :: B4ADOF12Rdt = 4383 + INTEGER(IntKi), PARAMETER :: B4ADOF13Rdt = 4384 + INTEGER(IntKi), PARAMETER :: B4ADOF14Rdt = 4385 + INTEGER(IntKi), PARAMETER :: B4ADOF15Rdt = 4386 + INTEGER(IntKi), PARAMETER :: B4ADOF16Rdt = 4387 + INTEGER(IntKi), PARAMETER :: B4ADOF17Rdt = 4388 + INTEGER(IntKi), PARAMETER :: B4ADOF18Rdt = 4389 + INTEGER(IntKi), PARAMETER :: B4ADOF19Rdt = 4390 + INTEGER(IntKi), PARAMETER :: B4ADOF20Rdt = 4391 + INTEGER(IntKi), PARAMETER :: B4ADOF21Rdt = 4392 + INTEGER(IntKi), PARAMETER :: B4ADOF22Rdt = 4393 + INTEGER(IntKi), PARAMETER :: B4ADOF23Rdt = 4394 + INTEGER(IntKi), PARAMETER :: B4ADOF24Rdt = 4395 + INTEGER(IntKi), PARAMETER :: B4ADOF25Rdt = 4396 + INTEGER(IntKi), PARAMETER :: B4ADOF26Rdt = 4397 + INTEGER(IntKi), PARAMETER :: B4ADOF27Rdt = 4398 + INTEGER(IntKi), PARAMETER :: B4ADOF28Rdt = 4399 + INTEGER(IntKi), PARAMETER :: B4ADOF29Rdt = 4400 + INTEGER(IntKi), PARAMETER :: B4ADOF30Rdt = 4401 + INTEGER(IntKi), PARAMETER :: B4ADOF31Rdt = 4402 + INTEGER(IntKi), PARAMETER :: B4ADOF32Rdt = 4403 + INTEGER(IntKi), PARAMETER :: B4ADOF33Rdt = 4404 + INTEGER(IntKi), PARAMETER :: B4ADOF34Rdt = 4405 + INTEGER(IntKi), PARAMETER :: B4ADOF35Rdt = 4406 + INTEGER(IntKi), PARAMETER :: B4ADOF36Rdt = 4407 + INTEGER(IntKi), PARAMETER :: B4ADOF37Rdt = 4408 + INTEGER(IntKi), PARAMETER :: B4ADOF38Rdt = 4409 + INTEGER(IntKi), PARAMETER :: B4ADOF39Rdt = 4410 + INTEGER(IntKi), PARAMETER :: B4ADOF40Rdt = 4411 + INTEGER(IntKi), PARAMETER :: B4ADOF41Rdt = 4412 + INTEGER(IntKi), PARAMETER :: B4ADOF42Rdt = 4413 + INTEGER(IntKi), PARAMETER :: B4ADOF43Rdt = 4414 + INTEGER(IntKi), PARAMETER :: B4ADOF44Rdt = 4415 + INTEGER(IntKi), PARAMETER :: B4ADOF45Rdt = 4416 + INTEGER(IntKi), PARAMETER :: B4ADOF46Rdt = 4417 + INTEGER(IntKi), PARAMETER :: B4ADOF47Rdt = 4418 + INTEGER(IntKi), PARAMETER :: B4ADOF48Rdt = 4419 + INTEGER(IntKi), PARAMETER :: B4ADOF49Rdt = 4420 + INTEGER(IntKi), PARAMETER :: B4ADOF50Rdt = 4421 + INTEGER(IntKi), PARAMETER :: B4ADOF51Rdt = 4422 + INTEGER(IntKi), PARAMETER :: B4ADOF52Rdt = 4423 + INTEGER(IntKi), PARAMETER :: B4ADOF53Rdt = 4424 + INTEGER(IntKi), PARAMETER :: B4ADOF54Rdt = 4425 + INTEGER(IntKi), PARAMETER :: B4ADOF55Rdt = 4426 + INTEGER(IntKi), PARAMETER :: B4ADOF56Rdt = 4427 + INTEGER(IntKi), PARAMETER :: B4ADOF57Rdt = 4428 + INTEGER(IntKi), PARAMETER :: B4ADOF58Rdt = 4429 + INTEGER(IntKi), PARAMETER :: B4ADOF59Rdt = 4430 + INTEGER(IntKi), PARAMETER :: B4ADOF60Rdt = 4431 + INTEGER(IntKi), PARAMETER :: B4ADOF61Rdt = 4432 + INTEGER(IntKi), PARAMETER :: B4ADOF62Rdt = 4433 + INTEGER(IntKi), PARAMETER :: B4ADOF63Rdt = 4434 + INTEGER(IntKi), PARAMETER :: B4ADOF64Rdt = 4435 + INTEGER(IntKi), PARAMETER :: B4ADOF65Rdt = 4436 + INTEGER(IntKi), PARAMETER :: B4ADOF66Rdt = 4437 + INTEGER(IntKi), PARAMETER :: B4ADOF67Rdt = 4438 + INTEGER(IntKi), PARAMETER :: B4ADOF68Rdt = 4439 + INTEGER(IntKi), PARAMETER :: B4ADOF69Rdt = 4440 + INTEGER(IntKi), PARAMETER :: B4ADOF70Rdt = 4441 + INTEGER(IntKi), PARAMETER :: B4ADOF71Rdt = 4442 + INTEGER(IntKi), PARAMETER :: B4ADOF72Rdt = 4443 + INTEGER(IntKi), PARAMETER :: B4ADOF73Rdt = 4444 + INTEGER(IntKi), PARAMETER :: B4ADOF74Rdt = 4445 + INTEGER(IntKi), PARAMETER :: B4ADOF75Rdt = 4446 + INTEGER(IntKi), PARAMETER :: B4ADOF76Rdt = 4447 + INTEGER(IntKi), PARAMETER :: B4ADOF77Rdt = 4448 + INTEGER(IntKi), PARAMETER :: B4ADOF78Rdt = 4449 + INTEGER(IntKi), PARAMETER :: B4ADOF79Rdt = 4450 + INTEGER(IntKi), PARAMETER :: B4ADOF80Rdt = 4451 + INTEGER(IntKi), PARAMETER :: B4ADOF81Rdt = 4452 + INTEGER(IntKi), PARAMETER :: B4ADOF82Rdt = 4453 + INTEGER(IntKi), PARAMETER :: B4ADOF83Rdt = 4454 + INTEGER(IntKi), PARAMETER :: B4ADOF84Rdt = 4455 + INTEGER(IntKi), PARAMETER :: B4ADOF85Rdt = 4456 + INTEGER(IntKi), PARAMETER :: B4ADOF86Rdt = 4457 + INTEGER(IntKi), PARAMETER :: B4ADOF87Rdt = 4458 + INTEGER(IntKi), PARAMETER :: B4ADOF88Rdt = 4459 + INTEGER(IntKi), PARAMETER :: B4ADOF89Rdt = 4460 + INTEGER(IntKi), PARAMETER :: B4ADOF90Rdt = 4461 + INTEGER(IntKi), PARAMETER :: B4ADOF91Rdt = 4462 + INTEGER(IntKi), PARAMETER :: B4ADOF92Rdt = 4463 + INTEGER(IntKi), PARAMETER :: B4ADOF93Rdt = 4464 + INTEGER(IntKi), PARAMETER :: B4ADOF94Rdt = 4465 + INTEGER(IntKi), PARAMETER :: B4ADOF95Rdt = 4466 + INTEGER(IntKi), PARAMETER :: B4ADOF96Rdt = 4467 + INTEGER(IntKi), PARAMETER :: B4ADOF97Rdt = 4468 + INTEGER(IntKi), PARAMETER :: B4ADOF98Rdt = 4469 + INTEGER(IntKi), PARAMETER :: B4ADOF99Rdt = 4470 + INTEGER(IntKi), PARAMETER :: B5ADOF1Rdt = 4471 + INTEGER(IntKi), PARAMETER :: B5ADOF2Rdt = 4472 + INTEGER(IntKi), PARAMETER :: B5ADOF3Rdt = 4473 + INTEGER(IntKi), PARAMETER :: B5ADOF4Rdt = 4474 + INTEGER(IntKi), PARAMETER :: B5ADOF5Rdt = 4475 + INTEGER(IntKi), PARAMETER :: B5ADOF6Rdt = 4476 + INTEGER(IntKi), PARAMETER :: B5ADOF7Rdt = 4477 + INTEGER(IntKi), PARAMETER :: B5ADOF8Rdt = 4478 + INTEGER(IntKi), PARAMETER :: B5ADOF9Rdt = 4479 + INTEGER(IntKi), PARAMETER :: B5ADOF10Rdt = 4480 + INTEGER(IntKi), PARAMETER :: B5ADOF11Rdt = 4481 + INTEGER(IntKi), PARAMETER :: B5ADOF12Rdt = 4482 + INTEGER(IntKi), PARAMETER :: B5ADOF13Rdt = 4483 + INTEGER(IntKi), PARAMETER :: B5ADOF14Rdt = 4484 + INTEGER(IntKi), PARAMETER :: B5ADOF15Rdt = 4485 + INTEGER(IntKi), PARAMETER :: B5ADOF16Rdt = 4486 + INTEGER(IntKi), PARAMETER :: B5ADOF17Rdt = 4487 + INTEGER(IntKi), PARAMETER :: B5ADOF18Rdt = 4488 + INTEGER(IntKi), PARAMETER :: B5ADOF19Rdt = 4489 + INTEGER(IntKi), PARAMETER :: B5ADOF20Rdt = 4490 + INTEGER(IntKi), PARAMETER :: B5ADOF21Rdt = 4491 + INTEGER(IntKi), PARAMETER :: B5ADOF22Rdt = 4492 + INTEGER(IntKi), PARAMETER :: B5ADOF23Rdt = 4493 + INTEGER(IntKi), PARAMETER :: B5ADOF24Rdt = 4494 + INTEGER(IntKi), PARAMETER :: B5ADOF25Rdt = 4495 + INTEGER(IntKi), PARAMETER :: B5ADOF26Rdt = 4496 + INTEGER(IntKi), PARAMETER :: B5ADOF27Rdt = 4497 + INTEGER(IntKi), PARAMETER :: B5ADOF28Rdt = 4498 + INTEGER(IntKi), PARAMETER :: B5ADOF29Rdt = 4499 + INTEGER(IntKi), PARAMETER :: B5ADOF30Rdt = 4500 + INTEGER(IntKi), PARAMETER :: B5ADOF31Rdt = 4501 + INTEGER(IntKi), PARAMETER :: B5ADOF32Rdt = 4502 + INTEGER(IntKi), PARAMETER :: B5ADOF33Rdt = 4503 + INTEGER(IntKi), PARAMETER :: B5ADOF34Rdt = 4504 + INTEGER(IntKi), PARAMETER :: B5ADOF35Rdt = 4505 + INTEGER(IntKi), PARAMETER :: B5ADOF36Rdt = 4506 + INTEGER(IntKi), PARAMETER :: B5ADOF37Rdt = 4507 + INTEGER(IntKi), PARAMETER :: B5ADOF38Rdt = 4508 + INTEGER(IntKi), PARAMETER :: B5ADOF39Rdt = 4509 + INTEGER(IntKi), PARAMETER :: B5ADOF40Rdt = 4510 + INTEGER(IntKi), PARAMETER :: B5ADOF41Rdt = 4511 + INTEGER(IntKi), PARAMETER :: B5ADOF42Rdt = 4512 + INTEGER(IntKi), PARAMETER :: B5ADOF43Rdt = 4513 + INTEGER(IntKi), PARAMETER :: B5ADOF44Rdt = 4514 + INTEGER(IntKi), PARAMETER :: B5ADOF45Rdt = 4515 + INTEGER(IntKi), PARAMETER :: B5ADOF46Rdt = 4516 + INTEGER(IntKi), PARAMETER :: B5ADOF47Rdt = 4517 + INTEGER(IntKi), PARAMETER :: B5ADOF48Rdt = 4518 + INTEGER(IntKi), PARAMETER :: B5ADOF49Rdt = 4519 + INTEGER(IntKi), PARAMETER :: B5ADOF50Rdt = 4520 + INTEGER(IntKi), PARAMETER :: B5ADOF51Rdt = 4521 + INTEGER(IntKi), PARAMETER :: B5ADOF52Rdt = 4522 + INTEGER(IntKi), PARAMETER :: B5ADOF53Rdt = 4523 + INTEGER(IntKi), PARAMETER :: B5ADOF54Rdt = 4524 + INTEGER(IntKi), PARAMETER :: B5ADOF55Rdt = 4525 + INTEGER(IntKi), PARAMETER :: B5ADOF56Rdt = 4526 + INTEGER(IntKi), PARAMETER :: B5ADOF57Rdt = 4527 + INTEGER(IntKi), PARAMETER :: B5ADOF58Rdt = 4528 + INTEGER(IntKi), PARAMETER :: B5ADOF59Rdt = 4529 + INTEGER(IntKi), PARAMETER :: B5ADOF60Rdt = 4530 + INTEGER(IntKi), PARAMETER :: B5ADOF61Rdt = 4531 + INTEGER(IntKi), PARAMETER :: B5ADOF62Rdt = 4532 + INTEGER(IntKi), PARAMETER :: B5ADOF63Rdt = 4533 + INTEGER(IntKi), PARAMETER :: B5ADOF64Rdt = 4534 + INTEGER(IntKi), PARAMETER :: B5ADOF65Rdt = 4535 + INTEGER(IntKi), PARAMETER :: B5ADOF66Rdt = 4536 + INTEGER(IntKi), PARAMETER :: B5ADOF67Rdt = 4537 + INTEGER(IntKi), PARAMETER :: B5ADOF68Rdt = 4538 + INTEGER(IntKi), PARAMETER :: B5ADOF69Rdt = 4539 + INTEGER(IntKi), PARAMETER :: B5ADOF70Rdt = 4540 + INTEGER(IntKi), PARAMETER :: B5ADOF71Rdt = 4541 + INTEGER(IntKi), PARAMETER :: B5ADOF72Rdt = 4542 + INTEGER(IntKi), PARAMETER :: B5ADOF73Rdt = 4543 + INTEGER(IntKi), PARAMETER :: B5ADOF74Rdt = 4544 + INTEGER(IntKi), PARAMETER :: B5ADOF75Rdt = 4545 + INTEGER(IntKi), PARAMETER :: B5ADOF76Rdt = 4546 + INTEGER(IntKi), PARAMETER :: B5ADOF77Rdt = 4547 + INTEGER(IntKi), PARAMETER :: B5ADOF78Rdt = 4548 + INTEGER(IntKi), PARAMETER :: B5ADOF79Rdt = 4549 + INTEGER(IntKi), PARAMETER :: B5ADOF80Rdt = 4550 + INTEGER(IntKi), PARAMETER :: B5ADOF81Rdt = 4551 + INTEGER(IntKi), PARAMETER :: B5ADOF82Rdt = 4552 + INTEGER(IntKi), PARAMETER :: B5ADOF83Rdt = 4553 + INTEGER(IntKi), PARAMETER :: B5ADOF84Rdt = 4554 + INTEGER(IntKi), PARAMETER :: B5ADOF85Rdt = 4555 + INTEGER(IntKi), PARAMETER :: B5ADOF86Rdt = 4556 + INTEGER(IntKi), PARAMETER :: B5ADOF87Rdt = 4557 + INTEGER(IntKi), PARAMETER :: B5ADOF88Rdt = 4558 + INTEGER(IntKi), PARAMETER :: B5ADOF89Rdt = 4559 + INTEGER(IntKi), PARAMETER :: B5ADOF90Rdt = 4560 + INTEGER(IntKi), PARAMETER :: B5ADOF91Rdt = 4561 + INTEGER(IntKi), PARAMETER :: B5ADOF92Rdt = 4562 + INTEGER(IntKi), PARAMETER :: B5ADOF93Rdt = 4563 + INTEGER(IntKi), PARAMETER :: B5ADOF94Rdt = 4564 + INTEGER(IntKi), PARAMETER :: B5ADOF95Rdt = 4565 + INTEGER(IntKi), PARAMETER :: B5ADOF96Rdt = 4566 + INTEGER(IntKi), PARAMETER :: B5ADOF97Rdt = 4567 + INTEGER(IntKi), PARAMETER :: B5ADOF98Rdt = 4568 + INTEGER(IntKi), PARAMETER :: B5ADOF99Rdt = 4569 + INTEGER(IntKi), PARAMETER :: B6ADOF1Rdt = 4570 + INTEGER(IntKi), PARAMETER :: B6ADOF2Rdt = 4571 + INTEGER(IntKi), PARAMETER :: B6ADOF3Rdt = 4572 + INTEGER(IntKi), PARAMETER :: B6ADOF4Rdt = 4573 + INTEGER(IntKi), PARAMETER :: B6ADOF5Rdt = 4574 + INTEGER(IntKi), PARAMETER :: B6ADOF6Rdt = 4575 + INTEGER(IntKi), PARAMETER :: B6ADOF7Rdt = 4576 + INTEGER(IntKi), PARAMETER :: B6ADOF8Rdt = 4577 + INTEGER(IntKi), PARAMETER :: B6ADOF9Rdt = 4578 + INTEGER(IntKi), PARAMETER :: B6ADOF10Rdt = 4579 + INTEGER(IntKi), PARAMETER :: B6ADOF11Rdt = 4580 + INTEGER(IntKi), PARAMETER :: B6ADOF12Rdt = 4581 + INTEGER(IntKi), PARAMETER :: B6ADOF13Rdt = 4582 + INTEGER(IntKi), PARAMETER :: B6ADOF14Rdt = 4583 + INTEGER(IntKi), PARAMETER :: B6ADOF15Rdt = 4584 + INTEGER(IntKi), PARAMETER :: B6ADOF16Rdt = 4585 + INTEGER(IntKi), PARAMETER :: B6ADOF17Rdt = 4586 + INTEGER(IntKi), PARAMETER :: B6ADOF18Rdt = 4587 + INTEGER(IntKi), PARAMETER :: B6ADOF19Rdt = 4588 + INTEGER(IntKi), PARAMETER :: B6ADOF20Rdt = 4589 + INTEGER(IntKi), PARAMETER :: B6ADOF21Rdt = 4590 + INTEGER(IntKi), PARAMETER :: B6ADOF22Rdt = 4591 + INTEGER(IntKi), PARAMETER :: B6ADOF23Rdt = 4592 + INTEGER(IntKi), PARAMETER :: B6ADOF24Rdt = 4593 + INTEGER(IntKi), PARAMETER :: B6ADOF25Rdt = 4594 + INTEGER(IntKi), PARAMETER :: B6ADOF26Rdt = 4595 + INTEGER(IntKi), PARAMETER :: B6ADOF27Rdt = 4596 + INTEGER(IntKi), PARAMETER :: B6ADOF28Rdt = 4597 + INTEGER(IntKi), PARAMETER :: B6ADOF29Rdt = 4598 + INTEGER(IntKi), PARAMETER :: B6ADOF30Rdt = 4599 + INTEGER(IntKi), PARAMETER :: B6ADOF31Rdt = 4600 + INTEGER(IntKi), PARAMETER :: B6ADOF32Rdt = 4601 + INTEGER(IntKi), PARAMETER :: B6ADOF33Rdt = 4602 + INTEGER(IntKi), PARAMETER :: B6ADOF34Rdt = 4603 + INTEGER(IntKi), PARAMETER :: B6ADOF35Rdt = 4604 + INTEGER(IntKi), PARAMETER :: B6ADOF36Rdt = 4605 + INTEGER(IntKi), PARAMETER :: B6ADOF37Rdt = 4606 + INTEGER(IntKi), PARAMETER :: B6ADOF38Rdt = 4607 + INTEGER(IntKi), PARAMETER :: B6ADOF39Rdt = 4608 + INTEGER(IntKi), PARAMETER :: B6ADOF40Rdt = 4609 + INTEGER(IntKi), PARAMETER :: B6ADOF41Rdt = 4610 + INTEGER(IntKi), PARAMETER :: B6ADOF42Rdt = 4611 + INTEGER(IntKi), PARAMETER :: B6ADOF43Rdt = 4612 + INTEGER(IntKi), PARAMETER :: B6ADOF44Rdt = 4613 + INTEGER(IntKi), PARAMETER :: B6ADOF45Rdt = 4614 + INTEGER(IntKi), PARAMETER :: B6ADOF46Rdt = 4615 + INTEGER(IntKi), PARAMETER :: B6ADOF47Rdt = 4616 + INTEGER(IntKi), PARAMETER :: B6ADOF48Rdt = 4617 + INTEGER(IntKi), PARAMETER :: B6ADOF49Rdt = 4618 + INTEGER(IntKi), PARAMETER :: B6ADOF50Rdt = 4619 + INTEGER(IntKi), PARAMETER :: B6ADOF51Rdt = 4620 + INTEGER(IntKi), PARAMETER :: B6ADOF52Rdt = 4621 + INTEGER(IntKi), PARAMETER :: B6ADOF53Rdt = 4622 + INTEGER(IntKi), PARAMETER :: B6ADOF54Rdt = 4623 + INTEGER(IntKi), PARAMETER :: B6ADOF55Rdt = 4624 + INTEGER(IntKi), PARAMETER :: B6ADOF56Rdt = 4625 + INTEGER(IntKi), PARAMETER :: B6ADOF57Rdt = 4626 + INTEGER(IntKi), PARAMETER :: B6ADOF58Rdt = 4627 + INTEGER(IntKi), PARAMETER :: B6ADOF59Rdt = 4628 + INTEGER(IntKi), PARAMETER :: B6ADOF60Rdt = 4629 + INTEGER(IntKi), PARAMETER :: B6ADOF61Rdt = 4630 + INTEGER(IntKi), PARAMETER :: B6ADOF62Rdt = 4631 + INTEGER(IntKi), PARAMETER :: B6ADOF63Rdt = 4632 + INTEGER(IntKi), PARAMETER :: B6ADOF64Rdt = 4633 + INTEGER(IntKi), PARAMETER :: B6ADOF65Rdt = 4634 + INTEGER(IntKi), PARAMETER :: B6ADOF66Rdt = 4635 + INTEGER(IntKi), PARAMETER :: B6ADOF67Rdt = 4636 + INTEGER(IntKi), PARAMETER :: B6ADOF68Rdt = 4637 + INTEGER(IntKi), PARAMETER :: B6ADOF69Rdt = 4638 + INTEGER(IntKi), PARAMETER :: B6ADOF70Rdt = 4639 + INTEGER(IntKi), PARAMETER :: B6ADOF71Rdt = 4640 + INTEGER(IntKi), PARAMETER :: B6ADOF72Rdt = 4641 + INTEGER(IntKi), PARAMETER :: B6ADOF73Rdt = 4642 + INTEGER(IntKi), PARAMETER :: B6ADOF74Rdt = 4643 + INTEGER(IntKi), PARAMETER :: B6ADOF75Rdt = 4644 + INTEGER(IntKi), PARAMETER :: B6ADOF76Rdt = 4645 + INTEGER(IntKi), PARAMETER :: B6ADOF77Rdt = 4646 + INTEGER(IntKi), PARAMETER :: B6ADOF78Rdt = 4647 + INTEGER(IntKi), PARAMETER :: B6ADOF79Rdt = 4648 + INTEGER(IntKi), PARAMETER :: B6ADOF80Rdt = 4649 + INTEGER(IntKi), PARAMETER :: B6ADOF81Rdt = 4650 + INTEGER(IntKi), PARAMETER :: B6ADOF82Rdt = 4651 + INTEGER(IntKi), PARAMETER :: B6ADOF83Rdt = 4652 + INTEGER(IntKi), PARAMETER :: B6ADOF84Rdt = 4653 + INTEGER(IntKi), PARAMETER :: B6ADOF85Rdt = 4654 + INTEGER(IntKi), PARAMETER :: B6ADOF86Rdt = 4655 + INTEGER(IntKi), PARAMETER :: B6ADOF87Rdt = 4656 + INTEGER(IntKi), PARAMETER :: B6ADOF88Rdt = 4657 + INTEGER(IntKi), PARAMETER :: B6ADOF89Rdt = 4658 + INTEGER(IntKi), PARAMETER :: B6ADOF90Rdt = 4659 + INTEGER(IntKi), PARAMETER :: B6ADOF91Rdt = 4660 + INTEGER(IntKi), PARAMETER :: B6ADOF92Rdt = 4661 + INTEGER(IntKi), PARAMETER :: B6ADOF93Rdt = 4662 + INTEGER(IntKi), PARAMETER :: B6ADOF94Rdt = 4663 + INTEGER(IntKi), PARAMETER :: B6ADOF95Rdt = 4664 + INTEGER(IntKi), PARAMETER :: B6ADOF96Rdt = 4665 + INTEGER(IntKi), PARAMETER :: B6ADOF97Rdt = 4666 + INTEGER(IntKi), PARAMETER :: B6ADOF98Rdt = 4667 + INTEGER(IntKi), PARAMETER :: B6ADOF99Rdt = 4668 + INTEGER(IntKi), PARAMETER :: B7ADOF1Rdt = 4669 + INTEGER(IntKi), PARAMETER :: B7ADOF2Rdt = 4670 + INTEGER(IntKi), PARAMETER :: B7ADOF3Rdt = 4671 + INTEGER(IntKi), PARAMETER :: B7ADOF4Rdt = 4672 + INTEGER(IntKi), PARAMETER :: B7ADOF5Rdt = 4673 + INTEGER(IntKi), PARAMETER :: B7ADOF6Rdt = 4674 + INTEGER(IntKi), PARAMETER :: B7ADOF7Rdt = 4675 + INTEGER(IntKi), PARAMETER :: B7ADOF8Rdt = 4676 + INTEGER(IntKi), PARAMETER :: B7ADOF9Rdt = 4677 + INTEGER(IntKi), PARAMETER :: B7ADOF10Rdt = 4678 + INTEGER(IntKi), PARAMETER :: B7ADOF11Rdt = 4679 + INTEGER(IntKi), PARAMETER :: B7ADOF12Rdt = 4680 + INTEGER(IntKi), PARAMETER :: B7ADOF13Rdt = 4681 + INTEGER(IntKi), PARAMETER :: B7ADOF14Rdt = 4682 + INTEGER(IntKi), PARAMETER :: B7ADOF15Rdt = 4683 + INTEGER(IntKi), PARAMETER :: B7ADOF16Rdt = 4684 + INTEGER(IntKi), PARAMETER :: B7ADOF17Rdt = 4685 + INTEGER(IntKi), PARAMETER :: B7ADOF18Rdt = 4686 + INTEGER(IntKi), PARAMETER :: B7ADOF19Rdt = 4687 + INTEGER(IntKi), PARAMETER :: B7ADOF20Rdt = 4688 + INTEGER(IntKi), PARAMETER :: B7ADOF21Rdt = 4689 + INTEGER(IntKi), PARAMETER :: B7ADOF22Rdt = 4690 + INTEGER(IntKi), PARAMETER :: B7ADOF23Rdt = 4691 + INTEGER(IntKi), PARAMETER :: B7ADOF24Rdt = 4692 + INTEGER(IntKi), PARAMETER :: B7ADOF25Rdt = 4693 + INTEGER(IntKi), PARAMETER :: B7ADOF26Rdt = 4694 + INTEGER(IntKi), PARAMETER :: B7ADOF27Rdt = 4695 + INTEGER(IntKi), PARAMETER :: B7ADOF28Rdt = 4696 + INTEGER(IntKi), PARAMETER :: B7ADOF29Rdt = 4697 + INTEGER(IntKi), PARAMETER :: B7ADOF30Rdt = 4698 + INTEGER(IntKi), PARAMETER :: B7ADOF31Rdt = 4699 + INTEGER(IntKi), PARAMETER :: B7ADOF32Rdt = 4700 + INTEGER(IntKi), PARAMETER :: B7ADOF33Rdt = 4701 + INTEGER(IntKi), PARAMETER :: B7ADOF34Rdt = 4702 + INTEGER(IntKi), PARAMETER :: B7ADOF35Rdt = 4703 + INTEGER(IntKi), PARAMETER :: B7ADOF36Rdt = 4704 + INTEGER(IntKi), PARAMETER :: B7ADOF37Rdt = 4705 + INTEGER(IntKi), PARAMETER :: B7ADOF38Rdt = 4706 + INTEGER(IntKi), PARAMETER :: B7ADOF39Rdt = 4707 + INTEGER(IntKi), PARAMETER :: B7ADOF40Rdt = 4708 + INTEGER(IntKi), PARAMETER :: B7ADOF41Rdt = 4709 + INTEGER(IntKi), PARAMETER :: B7ADOF42Rdt = 4710 + INTEGER(IntKi), PARAMETER :: B7ADOF43Rdt = 4711 + INTEGER(IntKi), PARAMETER :: B7ADOF44Rdt = 4712 + INTEGER(IntKi), PARAMETER :: B7ADOF45Rdt = 4713 + INTEGER(IntKi), PARAMETER :: B7ADOF46Rdt = 4714 + INTEGER(IntKi), PARAMETER :: B7ADOF47Rdt = 4715 + INTEGER(IntKi), PARAMETER :: B7ADOF48Rdt = 4716 + INTEGER(IntKi), PARAMETER :: B7ADOF49Rdt = 4717 + INTEGER(IntKi), PARAMETER :: B7ADOF50Rdt = 4718 + INTEGER(IntKi), PARAMETER :: B7ADOF51Rdt = 4719 + INTEGER(IntKi), PARAMETER :: B7ADOF52Rdt = 4720 + INTEGER(IntKi), PARAMETER :: B7ADOF53Rdt = 4721 + INTEGER(IntKi), PARAMETER :: B7ADOF54Rdt = 4722 + INTEGER(IntKi), PARAMETER :: B7ADOF55Rdt = 4723 + INTEGER(IntKi), PARAMETER :: B7ADOF56Rdt = 4724 + INTEGER(IntKi), PARAMETER :: B7ADOF57Rdt = 4725 + INTEGER(IntKi), PARAMETER :: B7ADOF58Rdt = 4726 + INTEGER(IntKi), PARAMETER :: B7ADOF59Rdt = 4727 + INTEGER(IntKi), PARAMETER :: B7ADOF60Rdt = 4728 + INTEGER(IntKi), PARAMETER :: B7ADOF61Rdt = 4729 + INTEGER(IntKi), PARAMETER :: B7ADOF62Rdt = 4730 + INTEGER(IntKi), PARAMETER :: B7ADOF63Rdt = 4731 + INTEGER(IntKi), PARAMETER :: B7ADOF64Rdt = 4732 + INTEGER(IntKi), PARAMETER :: B7ADOF65Rdt = 4733 + INTEGER(IntKi), PARAMETER :: B7ADOF66Rdt = 4734 + INTEGER(IntKi), PARAMETER :: B7ADOF67Rdt = 4735 + INTEGER(IntKi), PARAMETER :: B7ADOF68Rdt = 4736 + INTEGER(IntKi), PARAMETER :: B7ADOF69Rdt = 4737 + INTEGER(IntKi), PARAMETER :: B7ADOF70Rdt = 4738 + INTEGER(IntKi), PARAMETER :: B7ADOF71Rdt = 4739 + INTEGER(IntKi), PARAMETER :: B7ADOF72Rdt = 4740 + INTEGER(IntKi), PARAMETER :: B7ADOF73Rdt = 4741 + INTEGER(IntKi), PARAMETER :: B7ADOF74Rdt = 4742 + INTEGER(IntKi), PARAMETER :: B7ADOF75Rdt = 4743 + INTEGER(IntKi), PARAMETER :: B7ADOF76Rdt = 4744 + INTEGER(IntKi), PARAMETER :: B7ADOF77Rdt = 4745 + INTEGER(IntKi), PARAMETER :: B7ADOF78Rdt = 4746 + INTEGER(IntKi), PARAMETER :: B7ADOF79Rdt = 4747 + INTEGER(IntKi), PARAMETER :: B7ADOF80Rdt = 4748 + INTEGER(IntKi), PARAMETER :: B7ADOF81Rdt = 4749 + INTEGER(IntKi), PARAMETER :: B7ADOF82Rdt = 4750 + INTEGER(IntKi), PARAMETER :: B7ADOF83Rdt = 4751 + INTEGER(IntKi), PARAMETER :: B7ADOF84Rdt = 4752 + INTEGER(IntKi), PARAMETER :: B7ADOF85Rdt = 4753 + INTEGER(IntKi), PARAMETER :: B7ADOF86Rdt = 4754 + INTEGER(IntKi), PARAMETER :: B7ADOF87Rdt = 4755 + INTEGER(IntKi), PARAMETER :: B7ADOF88Rdt = 4756 + INTEGER(IntKi), PARAMETER :: B7ADOF89Rdt = 4757 + INTEGER(IntKi), PARAMETER :: B7ADOF90Rdt = 4758 + INTEGER(IntKi), PARAMETER :: B7ADOF91Rdt = 4759 + INTEGER(IntKi), PARAMETER :: B7ADOF92Rdt = 4760 + INTEGER(IntKi), PARAMETER :: B7ADOF93Rdt = 4761 + INTEGER(IntKi), PARAMETER :: B7ADOF94Rdt = 4762 + INTEGER(IntKi), PARAMETER :: B7ADOF95Rdt = 4763 + INTEGER(IntKi), PARAMETER :: B7ADOF96Rdt = 4764 + INTEGER(IntKi), PARAMETER :: B7ADOF97Rdt = 4765 + INTEGER(IntKi), PARAMETER :: B7ADOF98Rdt = 4766 + INTEGER(IntKi), PARAMETER :: B7ADOF99Rdt = 4767 + INTEGER(IntKi), PARAMETER :: B8ADOF1Rdt = 4768 + INTEGER(IntKi), PARAMETER :: B8ADOF2Rdt = 4769 + INTEGER(IntKi), PARAMETER :: B8ADOF3Rdt = 4770 + INTEGER(IntKi), PARAMETER :: B8ADOF4Rdt = 4771 + INTEGER(IntKi), PARAMETER :: B8ADOF5Rdt = 4772 + INTEGER(IntKi), PARAMETER :: B8ADOF6Rdt = 4773 + INTEGER(IntKi), PARAMETER :: B8ADOF7Rdt = 4774 + INTEGER(IntKi), PARAMETER :: B8ADOF8Rdt = 4775 + INTEGER(IntKi), PARAMETER :: B8ADOF9Rdt = 4776 + INTEGER(IntKi), PARAMETER :: B8ADOF10Rdt = 4777 + INTEGER(IntKi), PARAMETER :: B8ADOF11Rdt = 4778 + INTEGER(IntKi), PARAMETER :: B8ADOF12Rdt = 4779 + INTEGER(IntKi), PARAMETER :: B8ADOF13Rdt = 4780 + INTEGER(IntKi), PARAMETER :: B8ADOF14Rdt = 4781 + INTEGER(IntKi), PARAMETER :: B8ADOF15Rdt = 4782 + INTEGER(IntKi), PARAMETER :: B8ADOF16Rdt = 4783 + INTEGER(IntKi), PARAMETER :: B8ADOF17Rdt = 4784 + INTEGER(IntKi), PARAMETER :: B8ADOF18Rdt = 4785 + INTEGER(IntKi), PARAMETER :: B8ADOF19Rdt = 4786 + INTEGER(IntKi), PARAMETER :: B8ADOF20Rdt = 4787 + INTEGER(IntKi), PARAMETER :: B8ADOF21Rdt = 4788 + INTEGER(IntKi), PARAMETER :: B8ADOF22Rdt = 4789 + INTEGER(IntKi), PARAMETER :: B8ADOF23Rdt = 4790 + INTEGER(IntKi), PARAMETER :: B8ADOF24Rdt = 4791 + INTEGER(IntKi), PARAMETER :: B8ADOF25Rdt = 4792 + INTEGER(IntKi), PARAMETER :: B8ADOF26Rdt = 4793 + INTEGER(IntKi), PARAMETER :: B8ADOF27Rdt = 4794 + INTEGER(IntKi), PARAMETER :: B8ADOF28Rdt = 4795 + INTEGER(IntKi), PARAMETER :: B8ADOF29Rdt = 4796 + INTEGER(IntKi), PARAMETER :: B8ADOF30Rdt = 4797 + INTEGER(IntKi), PARAMETER :: B8ADOF31Rdt = 4798 + INTEGER(IntKi), PARAMETER :: B8ADOF32Rdt = 4799 + INTEGER(IntKi), PARAMETER :: B8ADOF33Rdt = 4800 + INTEGER(IntKi), PARAMETER :: B8ADOF34Rdt = 4801 + INTEGER(IntKi), PARAMETER :: B8ADOF35Rdt = 4802 + INTEGER(IntKi), PARAMETER :: B8ADOF36Rdt = 4803 + INTEGER(IntKi), PARAMETER :: B8ADOF37Rdt = 4804 + INTEGER(IntKi), PARAMETER :: B8ADOF38Rdt = 4805 + INTEGER(IntKi), PARAMETER :: B8ADOF39Rdt = 4806 + INTEGER(IntKi), PARAMETER :: B8ADOF40Rdt = 4807 + INTEGER(IntKi), PARAMETER :: B8ADOF41Rdt = 4808 + INTEGER(IntKi), PARAMETER :: B8ADOF42Rdt = 4809 + INTEGER(IntKi), PARAMETER :: B8ADOF43Rdt = 4810 + INTEGER(IntKi), PARAMETER :: B8ADOF44Rdt = 4811 + INTEGER(IntKi), PARAMETER :: B8ADOF45Rdt = 4812 + INTEGER(IntKi), PARAMETER :: B8ADOF46Rdt = 4813 + INTEGER(IntKi), PARAMETER :: B8ADOF47Rdt = 4814 + INTEGER(IntKi), PARAMETER :: B8ADOF48Rdt = 4815 + INTEGER(IntKi), PARAMETER :: B8ADOF49Rdt = 4816 + INTEGER(IntKi), PARAMETER :: B8ADOF50Rdt = 4817 + INTEGER(IntKi), PARAMETER :: B8ADOF51Rdt = 4818 + INTEGER(IntKi), PARAMETER :: B8ADOF52Rdt = 4819 + INTEGER(IntKi), PARAMETER :: B8ADOF53Rdt = 4820 + INTEGER(IntKi), PARAMETER :: B8ADOF54Rdt = 4821 + INTEGER(IntKi), PARAMETER :: B8ADOF55Rdt = 4822 + INTEGER(IntKi), PARAMETER :: B8ADOF56Rdt = 4823 + INTEGER(IntKi), PARAMETER :: B8ADOF57Rdt = 4824 + INTEGER(IntKi), PARAMETER :: B8ADOF58Rdt = 4825 + INTEGER(IntKi), PARAMETER :: B8ADOF59Rdt = 4826 + INTEGER(IntKi), PARAMETER :: B8ADOF60Rdt = 4827 + INTEGER(IntKi), PARAMETER :: B8ADOF61Rdt = 4828 + INTEGER(IntKi), PARAMETER :: B8ADOF62Rdt = 4829 + INTEGER(IntKi), PARAMETER :: B8ADOF63Rdt = 4830 + INTEGER(IntKi), PARAMETER :: B8ADOF64Rdt = 4831 + INTEGER(IntKi), PARAMETER :: B8ADOF65Rdt = 4832 + INTEGER(IntKi), PARAMETER :: B8ADOF66Rdt = 4833 + INTEGER(IntKi), PARAMETER :: B8ADOF67Rdt = 4834 + INTEGER(IntKi), PARAMETER :: B8ADOF68Rdt = 4835 + INTEGER(IntKi), PARAMETER :: B8ADOF69Rdt = 4836 + INTEGER(IntKi), PARAMETER :: B8ADOF70Rdt = 4837 + INTEGER(IntKi), PARAMETER :: B8ADOF71Rdt = 4838 + INTEGER(IntKi), PARAMETER :: B8ADOF72Rdt = 4839 + INTEGER(IntKi), PARAMETER :: B8ADOF73Rdt = 4840 + INTEGER(IntKi), PARAMETER :: B8ADOF74Rdt = 4841 + INTEGER(IntKi), PARAMETER :: B8ADOF75Rdt = 4842 + INTEGER(IntKi), PARAMETER :: B8ADOF76Rdt = 4843 + INTEGER(IntKi), PARAMETER :: B8ADOF77Rdt = 4844 + INTEGER(IntKi), PARAMETER :: B8ADOF78Rdt = 4845 + INTEGER(IntKi), PARAMETER :: B8ADOF79Rdt = 4846 + INTEGER(IntKi), PARAMETER :: B8ADOF80Rdt = 4847 + INTEGER(IntKi), PARAMETER :: B8ADOF81Rdt = 4848 + INTEGER(IntKi), PARAMETER :: B8ADOF82Rdt = 4849 + INTEGER(IntKi), PARAMETER :: B8ADOF83Rdt = 4850 + INTEGER(IntKi), PARAMETER :: B8ADOF84Rdt = 4851 + INTEGER(IntKi), PARAMETER :: B8ADOF85Rdt = 4852 + INTEGER(IntKi), PARAMETER :: B8ADOF86Rdt = 4853 + INTEGER(IntKi), PARAMETER :: B8ADOF87Rdt = 4854 + INTEGER(IntKi), PARAMETER :: B8ADOF88Rdt = 4855 + INTEGER(IntKi), PARAMETER :: B8ADOF89Rdt = 4856 + INTEGER(IntKi), PARAMETER :: B8ADOF90Rdt = 4857 + INTEGER(IntKi), PARAMETER :: B8ADOF91Rdt = 4858 + INTEGER(IntKi), PARAMETER :: B8ADOF92Rdt = 4859 + INTEGER(IntKi), PARAMETER :: B8ADOF93Rdt = 4860 + INTEGER(IntKi), PARAMETER :: B8ADOF94Rdt = 4861 + INTEGER(IntKi), PARAMETER :: B8ADOF95Rdt = 4862 + INTEGER(IntKi), PARAMETER :: B8ADOF96Rdt = 4863 + INTEGER(IntKi), PARAMETER :: B8ADOF97Rdt = 4864 + INTEGER(IntKi), PARAMETER :: B8ADOF98Rdt = 4865 + INTEGER(IntKi), PARAMETER :: B8ADOF99Rdt = 4866 + INTEGER(IntKi), PARAMETER :: B9ADOF1Rdt = 4867 + INTEGER(IntKi), PARAMETER :: B9ADOF2Rdt = 4868 + INTEGER(IntKi), PARAMETER :: B9ADOF3Rdt = 4869 + INTEGER(IntKi), PARAMETER :: B9ADOF4Rdt = 4870 + INTEGER(IntKi), PARAMETER :: B9ADOF5Rdt = 4871 + INTEGER(IntKi), PARAMETER :: B9ADOF6Rdt = 4872 + INTEGER(IntKi), PARAMETER :: B9ADOF7Rdt = 4873 + INTEGER(IntKi), PARAMETER :: B9ADOF8Rdt = 4874 + INTEGER(IntKi), PARAMETER :: B9ADOF9Rdt = 4875 + INTEGER(IntKi), PARAMETER :: B9ADOF10Rdt = 4876 + INTEGER(IntKi), PARAMETER :: B9ADOF11Rdt = 4877 + INTEGER(IntKi), PARAMETER :: B9ADOF12Rdt = 4878 + INTEGER(IntKi), PARAMETER :: B9ADOF13Rdt = 4879 + INTEGER(IntKi), PARAMETER :: B9ADOF14Rdt = 4880 + INTEGER(IntKi), PARAMETER :: B9ADOF15Rdt = 4881 + INTEGER(IntKi), PARAMETER :: B9ADOF16Rdt = 4882 + INTEGER(IntKi), PARAMETER :: B9ADOF17Rdt = 4883 + INTEGER(IntKi), PARAMETER :: B9ADOF18Rdt = 4884 + INTEGER(IntKi), PARAMETER :: B9ADOF19Rdt = 4885 + INTEGER(IntKi), PARAMETER :: B9ADOF20Rdt = 4886 + INTEGER(IntKi), PARAMETER :: B9ADOF21Rdt = 4887 + INTEGER(IntKi), PARAMETER :: B9ADOF22Rdt = 4888 + INTEGER(IntKi), PARAMETER :: B9ADOF23Rdt = 4889 + INTEGER(IntKi), PARAMETER :: B9ADOF24Rdt = 4890 + INTEGER(IntKi), PARAMETER :: B9ADOF25Rdt = 4891 + INTEGER(IntKi), PARAMETER :: B9ADOF26Rdt = 4892 + INTEGER(IntKi), PARAMETER :: B9ADOF27Rdt = 4893 + INTEGER(IntKi), PARAMETER :: B9ADOF28Rdt = 4894 + INTEGER(IntKi), PARAMETER :: B9ADOF29Rdt = 4895 + INTEGER(IntKi), PARAMETER :: B9ADOF30Rdt = 4896 + INTEGER(IntKi), PARAMETER :: B9ADOF31Rdt = 4897 + INTEGER(IntKi), PARAMETER :: B9ADOF32Rdt = 4898 + INTEGER(IntKi), PARAMETER :: B9ADOF33Rdt = 4899 + INTEGER(IntKi), PARAMETER :: B9ADOF34Rdt = 4900 + INTEGER(IntKi), PARAMETER :: B9ADOF35Rdt = 4901 + INTEGER(IntKi), PARAMETER :: B9ADOF36Rdt = 4902 + INTEGER(IntKi), PARAMETER :: B9ADOF37Rdt = 4903 + INTEGER(IntKi), PARAMETER :: B9ADOF38Rdt = 4904 + INTEGER(IntKi), PARAMETER :: B9ADOF39Rdt = 4905 + INTEGER(IntKi), PARAMETER :: B9ADOF40Rdt = 4906 + INTEGER(IntKi), PARAMETER :: B9ADOF41Rdt = 4907 + INTEGER(IntKi), PARAMETER :: B9ADOF42Rdt = 4908 + INTEGER(IntKi), PARAMETER :: B9ADOF43Rdt = 4909 + INTEGER(IntKi), PARAMETER :: B9ADOF44Rdt = 4910 + INTEGER(IntKi), PARAMETER :: B9ADOF45Rdt = 4911 + INTEGER(IntKi), PARAMETER :: B9ADOF46Rdt = 4912 + INTEGER(IntKi), PARAMETER :: B9ADOF47Rdt = 4913 + INTEGER(IntKi), PARAMETER :: B9ADOF48Rdt = 4914 + INTEGER(IntKi), PARAMETER :: B9ADOF49Rdt = 4915 + INTEGER(IntKi), PARAMETER :: B9ADOF50Rdt = 4916 + INTEGER(IntKi), PARAMETER :: B9ADOF51Rdt = 4917 + INTEGER(IntKi), PARAMETER :: B9ADOF52Rdt = 4918 + INTEGER(IntKi), PARAMETER :: B9ADOF53Rdt = 4919 + INTEGER(IntKi), PARAMETER :: B9ADOF54Rdt = 4920 + INTEGER(IntKi), PARAMETER :: B9ADOF55Rdt = 4921 + INTEGER(IntKi), PARAMETER :: B9ADOF56Rdt = 4922 + INTEGER(IntKi), PARAMETER :: B9ADOF57Rdt = 4923 + INTEGER(IntKi), PARAMETER :: B9ADOF58Rdt = 4924 + INTEGER(IntKi), PARAMETER :: B9ADOF59Rdt = 4925 + INTEGER(IntKi), PARAMETER :: B9ADOF60Rdt = 4926 + INTEGER(IntKi), PARAMETER :: B9ADOF61Rdt = 4927 + INTEGER(IntKi), PARAMETER :: B9ADOF62Rdt = 4928 + INTEGER(IntKi), PARAMETER :: B9ADOF63Rdt = 4929 + INTEGER(IntKi), PARAMETER :: B9ADOF64Rdt = 4930 + INTEGER(IntKi), PARAMETER :: B9ADOF65Rdt = 4931 + INTEGER(IntKi), PARAMETER :: B9ADOF66Rdt = 4932 + INTEGER(IntKi), PARAMETER :: B9ADOF67Rdt = 4933 + INTEGER(IntKi), PARAMETER :: B9ADOF68Rdt = 4934 + INTEGER(IntKi), PARAMETER :: B9ADOF69Rdt = 4935 + INTEGER(IntKi), PARAMETER :: B9ADOF70Rdt = 4936 + INTEGER(IntKi), PARAMETER :: B9ADOF71Rdt = 4937 + INTEGER(IntKi), PARAMETER :: B9ADOF72Rdt = 4938 + INTEGER(IntKi), PARAMETER :: B9ADOF73Rdt = 4939 + INTEGER(IntKi), PARAMETER :: B9ADOF74Rdt = 4940 + INTEGER(IntKi), PARAMETER :: B9ADOF75Rdt = 4941 + INTEGER(IntKi), PARAMETER :: B9ADOF76Rdt = 4942 + INTEGER(IntKi), PARAMETER :: B9ADOF77Rdt = 4943 + INTEGER(IntKi), PARAMETER :: B9ADOF78Rdt = 4944 + INTEGER(IntKi), PARAMETER :: B9ADOF79Rdt = 4945 + INTEGER(IntKi), PARAMETER :: B9ADOF80Rdt = 4946 + INTEGER(IntKi), PARAMETER :: B9ADOF81Rdt = 4947 + INTEGER(IntKi), PARAMETER :: B9ADOF82Rdt = 4948 + INTEGER(IntKi), PARAMETER :: B9ADOF83Rdt = 4949 + INTEGER(IntKi), PARAMETER :: B9ADOF84Rdt = 4950 + INTEGER(IntKi), PARAMETER :: B9ADOF85Rdt = 4951 + INTEGER(IntKi), PARAMETER :: B9ADOF86Rdt = 4952 + INTEGER(IntKi), PARAMETER :: B9ADOF87Rdt = 4953 + INTEGER(IntKi), PARAMETER :: B9ADOF88Rdt = 4954 + INTEGER(IntKi), PARAMETER :: B9ADOF89Rdt = 4955 + INTEGER(IntKi), PARAMETER :: B9ADOF90Rdt = 4956 + INTEGER(IntKi), PARAMETER :: B9ADOF91Rdt = 4957 + INTEGER(IntKi), PARAMETER :: B9ADOF92Rdt = 4958 + INTEGER(IntKi), PARAMETER :: B9ADOF93Rdt = 4959 + INTEGER(IntKi), PARAMETER :: B9ADOF94Rdt = 4960 + INTEGER(IntKi), PARAMETER :: B9ADOF95Rdt = 4961 + INTEGER(IntKi), PARAMETER :: B9ADOF96Rdt = 4962 + INTEGER(IntKi), PARAMETER :: B9ADOF97Rdt = 4963 + INTEGER(IntKi), PARAMETER :: B9ADOF98Rdt = 4964 + INTEGER(IntKi), PARAMETER :: B9ADOF99Rdt = 4965 + INTEGER(IntKi), PARAMETER :: B1ADOF1Hds = 4966 + INTEGER(IntKi), PARAMETER :: B1ADOF2Hds = 4967 + INTEGER(IntKi), PARAMETER :: B1ADOF3Hds = 4968 + INTEGER(IntKi), PARAMETER :: B1ADOF4Hds = 4969 + INTEGER(IntKi), PARAMETER :: B1ADOF5Hds = 4970 + INTEGER(IntKi), PARAMETER :: B1ADOF6Hds = 4971 + INTEGER(IntKi), PARAMETER :: B1ADOF7Hds = 4972 + INTEGER(IntKi), PARAMETER :: B1ADOF8Hds = 4973 + INTEGER(IntKi), PARAMETER :: B1ADOF9Hds = 4974 + INTEGER(IntKi), PARAMETER :: B1ADOF10Hds = 4975 + INTEGER(IntKi), PARAMETER :: B1ADOF11Hds = 4976 + INTEGER(IntKi), PARAMETER :: B1ADOF12Hds = 4977 + INTEGER(IntKi), PARAMETER :: B1ADOF13Hds = 4978 + INTEGER(IntKi), PARAMETER :: B1ADOF14Hds = 4979 + INTEGER(IntKi), PARAMETER :: B1ADOF15Hds = 4980 + INTEGER(IntKi), PARAMETER :: B1ADOF16Hds = 4981 + INTEGER(IntKi), PARAMETER :: B1ADOF17Hds = 4982 + INTEGER(IntKi), PARAMETER :: B1ADOF18Hds = 4983 + INTEGER(IntKi), PARAMETER :: B1ADOF19Hds = 4984 + INTEGER(IntKi), PARAMETER :: B1ADOF20Hds = 4985 + INTEGER(IntKi), PARAMETER :: B1ADOF21Hds = 4986 + INTEGER(IntKi), PARAMETER :: B1ADOF22Hds = 4987 + INTEGER(IntKi), PARAMETER :: B1ADOF23Hds = 4988 + INTEGER(IntKi), PARAMETER :: B1ADOF24Hds = 4989 + INTEGER(IntKi), PARAMETER :: B1ADOF25Hds = 4990 + INTEGER(IntKi), PARAMETER :: B1ADOF26Hds = 4991 + INTEGER(IntKi), PARAMETER :: B1ADOF27Hds = 4992 + INTEGER(IntKi), PARAMETER :: B1ADOF28Hds = 4993 + INTEGER(IntKi), PARAMETER :: B1ADOF29Hds = 4994 + INTEGER(IntKi), PARAMETER :: B1ADOF30Hds = 4995 + INTEGER(IntKi), PARAMETER :: B1ADOF31Hds = 4996 + INTEGER(IntKi), PARAMETER :: B1ADOF32Hds = 4997 + INTEGER(IntKi), PARAMETER :: B1ADOF33Hds = 4998 + INTEGER(IntKi), PARAMETER :: B1ADOF34Hds = 4999 + INTEGER(IntKi), PARAMETER :: B1ADOF35Hds = 5000 + INTEGER(IntKi), PARAMETER :: B1ADOF36Hds = 5001 + INTEGER(IntKi), PARAMETER :: B1ADOF37Hds = 5002 + INTEGER(IntKi), PARAMETER :: B1ADOF38Hds = 5003 + INTEGER(IntKi), PARAMETER :: B1ADOF39Hds = 5004 + INTEGER(IntKi), PARAMETER :: B1ADOF40Hds = 5005 + INTEGER(IntKi), PARAMETER :: B1ADOF41Hds = 5006 + INTEGER(IntKi), PARAMETER :: B1ADOF42Hds = 5007 + INTEGER(IntKi), PARAMETER :: B1ADOF43Hds = 5008 + INTEGER(IntKi), PARAMETER :: B1ADOF44Hds = 5009 + INTEGER(IntKi), PARAMETER :: B1ADOF45Hds = 5010 + INTEGER(IntKi), PARAMETER :: B1ADOF46Hds = 5011 + INTEGER(IntKi), PARAMETER :: B1ADOF47Hds = 5012 + INTEGER(IntKi), PARAMETER :: B1ADOF48Hds = 5013 + INTEGER(IntKi), PARAMETER :: B1ADOF49Hds = 5014 + INTEGER(IntKi), PARAMETER :: B1ADOF50Hds = 5015 + INTEGER(IntKi), PARAMETER :: B1ADOF51Hds = 5016 + INTEGER(IntKi), PARAMETER :: B1ADOF52Hds = 5017 + INTEGER(IntKi), PARAMETER :: B1ADOF53Hds = 5018 + INTEGER(IntKi), PARAMETER :: B1ADOF54Hds = 5019 + INTEGER(IntKi), PARAMETER :: B1ADOF55Hds = 5020 + INTEGER(IntKi), PARAMETER :: B1ADOF56Hds = 5021 + INTEGER(IntKi), PARAMETER :: B1ADOF57Hds = 5022 + INTEGER(IntKi), PARAMETER :: B1ADOF58Hds = 5023 + INTEGER(IntKi), PARAMETER :: B1ADOF59Hds = 5024 + INTEGER(IntKi), PARAMETER :: B1ADOF60Hds = 5025 + INTEGER(IntKi), PARAMETER :: B1ADOF61Hds = 5026 + INTEGER(IntKi), PARAMETER :: B1ADOF62Hds = 5027 + INTEGER(IntKi), PARAMETER :: B1ADOF63Hds = 5028 + INTEGER(IntKi), PARAMETER :: B1ADOF64Hds = 5029 + INTEGER(IntKi), PARAMETER :: B1ADOF65Hds = 5030 + INTEGER(IntKi), PARAMETER :: B1ADOF66Hds = 5031 + INTEGER(IntKi), PARAMETER :: B1ADOF67Hds = 5032 + INTEGER(IntKi), PARAMETER :: B1ADOF68Hds = 5033 + INTEGER(IntKi), PARAMETER :: B1ADOF69Hds = 5034 + INTEGER(IntKi), PARAMETER :: B1ADOF70Hds = 5035 + INTEGER(IntKi), PARAMETER :: B1ADOF71Hds = 5036 + INTEGER(IntKi), PARAMETER :: B1ADOF72Hds = 5037 + INTEGER(IntKi), PARAMETER :: B1ADOF73Hds = 5038 + INTEGER(IntKi), PARAMETER :: B1ADOF74Hds = 5039 + INTEGER(IntKi), PARAMETER :: B1ADOF75Hds = 5040 + INTEGER(IntKi), PARAMETER :: B1ADOF76Hds = 5041 + INTEGER(IntKi), PARAMETER :: B1ADOF77Hds = 5042 + INTEGER(IntKi), PARAMETER :: B1ADOF78Hds = 5043 + INTEGER(IntKi), PARAMETER :: B1ADOF79Hds = 5044 + INTEGER(IntKi), PARAMETER :: B1ADOF80Hds = 5045 + INTEGER(IntKi), PARAMETER :: B1ADOF81Hds = 5046 + INTEGER(IntKi), PARAMETER :: B1ADOF82Hds = 5047 + INTEGER(IntKi), PARAMETER :: B1ADOF83Hds = 5048 + INTEGER(IntKi), PARAMETER :: B1ADOF84Hds = 5049 + INTEGER(IntKi), PARAMETER :: B1ADOF85Hds = 5050 + INTEGER(IntKi), PARAMETER :: B1ADOF86Hds = 5051 + INTEGER(IntKi), PARAMETER :: B1ADOF87Hds = 5052 + INTEGER(IntKi), PARAMETER :: B1ADOF88Hds = 5053 + INTEGER(IntKi), PARAMETER :: B1ADOF89Hds = 5054 + INTEGER(IntKi), PARAMETER :: B1ADOF90Hds = 5055 + INTEGER(IntKi), PARAMETER :: B1ADOF91Hds = 5056 + INTEGER(IntKi), PARAMETER :: B1ADOF92Hds = 5057 + INTEGER(IntKi), PARAMETER :: B1ADOF93Hds = 5058 + INTEGER(IntKi), PARAMETER :: B1ADOF94Hds = 5059 + INTEGER(IntKi), PARAMETER :: B1ADOF95Hds = 5060 + INTEGER(IntKi), PARAMETER :: B1ADOF96Hds = 5061 + INTEGER(IntKi), PARAMETER :: B1ADOF97Hds = 5062 + INTEGER(IntKi), PARAMETER :: B1ADOF98Hds = 5063 + INTEGER(IntKi), PARAMETER :: B1ADOF99Hds = 5064 + INTEGER(IntKi), PARAMETER :: B2ADOF1Hds = 5065 + INTEGER(IntKi), PARAMETER :: B2ADOF2Hds = 5066 + INTEGER(IntKi), PARAMETER :: B2ADOF3Hds = 5067 + INTEGER(IntKi), PARAMETER :: B2ADOF4Hds = 5068 + INTEGER(IntKi), PARAMETER :: B2ADOF5Hds = 5069 + INTEGER(IntKi), PARAMETER :: B2ADOF6Hds = 5070 + INTEGER(IntKi), PARAMETER :: B2ADOF7Hds = 5071 + INTEGER(IntKi), PARAMETER :: B2ADOF8Hds = 5072 + INTEGER(IntKi), PARAMETER :: B2ADOF9Hds = 5073 + INTEGER(IntKi), PARAMETER :: B2ADOF10Hds = 5074 + INTEGER(IntKi), PARAMETER :: B2ADOF11Hds = 5075 + INTEGER(IntKi), PARAMETER :: B2ADOF12Hds = 5076 + INTEGER(IntKi), PARAMETER :: B2ADOF13Hds = 5077 + INTEGER(IntKi), PARAMETER :: B2ADOF14Hds = 5078 + INTEGER(IntKi), PARAMETER :: B2ADOF15Hds = 5079 + INTEGER(IntKi), PARAMETER :: B2ADOF16Hds = 5080 + INTEGER(IntKi), PARAMETER :: B2ADOF17Hds = 5081 + INTEGER(IntKi), PARAMETER :: B2ADOF18Hds = 5082 + INTEGER(IntKi), PARAMETER :: B2ADOF19Hds = 5083 + INTEGER(IntKi), PARAMETER :: B2ADOF20Hds = 5084 + INTEGER(IntKi), PARAMETER :: B2ADOF21Hds = 5085 + INTEGER(IntKi), PARAMETER :: B2ADOF22Hds = 5086 + INTEGER(IntKi), PARAMETER :: B2ADOF23Hds = 5087 + INTEGER(IntKi), PARAMETER :: B2ADOF24Hds = 5088 + INTEGER(IntKi), PARAMETER :: B2ADOF25Hds = 5089 + INTEGER(IntKi), PARAMETER :: B2ADOF26Hds = 5090 + INTEGER(IntKi), PARAMETER :: B2ADOF27Hds = 5091 + INTEGER(IntKi), PARAMETER :: B2ADOF28Hds = 5092 + INTEGER(IntKi), PARAMETER :: B2ADOF29Hds = 5093 + INTEGER(IntKi), PARAMETER :: B2ADOF30Hds = 5094 + INTEGER(IntKi), PARAMETER :: B2ADOF31Hds = 5095 + INTEGER(IntKi), PARAMETER :: B2ADOF32Hds = 5096 + INTEGER(IntKi), PARAMETER :: B2ADOF33Hds = 5097 + INTEGER(IntKi), PARAMETER :: B2ADOF34Hds = 5098 + INTEGER(IntKi), PARAMETER :: B2ADOF35Hds = 5099 + INTEGER(IntKi), PARAMETER :: B2ADOF36Hds = 5100 + INTEGER(IntKi), PARAMETER :: B2ADOF37Hds = 5101 + INTEGER(IntKi), PARAMETER :: B2ADOF38Hds = 5102 + INTEGER(IntKi), PARAMETER :: B2ADOF39Hds = 5103 + INTEGER(IntKi), PARAMETER :: B2ADOF40Hds = 5104 + INTEGER(IntKi), PARAMETER :: B2ADOF41Hds = 5105 + INTEGER(IntKi), PARAMETER :: B2ADOF42Hds = 5106 + INTEGER(IntKi), PARAMETER :: B2ADOF43Hds = 5107 + INTEGER(IntKi), PARAMETER :: B2ADOF44Hds = 5108 + INTEGER(IntKi), PARAMETER :: B2ADOF45Hds = 5109 + INTEGER(IntKi), PARAMETER :: B2ADOF46Hds = 5110 + INTEGER(IntKi), PARAMETER :: B2ADOF47Hds = 5111 + INTEGER(IntKi), PARAMETER :: B2ADOF48Hds = 5112 + INTEGER(IntKi), PARAMETER :: B2ADOF49Hds = 5113 + INTEGER(IntKi), PARAMETER :: B2ADOF50Hds = 5114 + INTEGER(IntKi), PARAMETER :: B2ADOF51Hds = 5115 + INTEGER(IntKi), PARAMETER :: B2ADOF52Hds = 5116 + INTEGER(IntKi), PARAMETER :: B2ADOF53Hds = 5117 + INTEGER(IntKi), PARAMETER :: B2ADOF54Hds = 5118 + INTEGER(IntKi), PARAMETER :: B2ADOF55Hds = 5119 + INTEGER(IntKi), PARAMETER :: B2ADOF56Hds = 5120 + INTEGER(IntKi), PARAMETER :: B2ADOF57Hds = 5121 + INTEGER(IntKi), PARAMETER :: B2ADOF58Hds = 5122 + INTEGER(IntKi), PARAMETER :: B2ADOF59Hds = 5123 + INTEGER(IntKi), PARAMETER :: B2ADOF60Hds = 5124 + INTEGER(IntKi), PARAMETER :: B2ADOF61Hds = 5125 + INTEGER(IntKi), PARAMETER :: B2ADOF62Hds = 5126 + INTEGER(IntKi), PARAMETER :: B2ADOF63Hds = 5127 + INTEGER(IntKi), PARAMETER :: B2ADOF64Hds = 5128 + INTEGER(IntKi), PARAMETER :: B2ADOF65Hds = 5129 + INTEGER(IntKi), PARAMETER :: B2ADOF66Hds = 5130 + INTEGER(IntKi), PARAMETER :: B2ADOF67Hds = 5131 + INTEGER(IntKi), PARAMETER :: B2ADOF68Hds = 5132 + INTEGER(IntKi), PARAMETER :: B2ADOF69Hds = 5133 + INTEGER(IntKi), PARAMETER :: B2ADOF70Hds = 5134 + INTEGER(IntKi), PARAMETER :: B2ADOF71Hds = 5135 + INTEGER(IntKi), PARAMETER :: B2ADOF72Hds = 5136 + INTEGER(IntKi), PARAMETER :: B2ADOF73Hds = 5137 + INTEGER(IntKi), PARAMETER :: B2ADOF74Hds = 5138 + INTEGER(IntKi), PARAMETER :: B2ADOF75Hds = 5139 + INTEGER(IntKi), PARAMETER :: B2ADOF76Hds = 5140 + INTEGER(IntKi), PARAMETER :: B2ADOF77Hds = 5141 + INTEGER(IntKi), PARAMETER :: B2ADOF78Hds = 5142 + INTEGER(IntKi), PARAMETER :: B2ADOF79Hds = 5143 + INTEGER(IntKi), PARAMETER :: B2ADOF80Hds = 5144 + INTEGER(IntKi), PARAMETER :: B2ADOF81Hds = 5145 + INTEGER(IntKi), PARAMETER :: B2ADOF82Hds = 5146 + INTEGER(IntKi), PARAMETER :: B2ADOF83Hds = 5147 + INTEGER(IntKi), PARAMETER :: B2ADOF84Hds = 5148 + INTEGER(IntKi), PARAMETER :: B2ADOF85Hds = 5149 + INTEGER(IntKi), PARAMETER :: B2ADOF86Hds = 5150 + INTEGER(IntKi), PARAMETER :: B2ADOF87Hds = 5151 + INTEGER(IntKi), PARAMETER :: B2ADOF88Hds = 5152 + INTEGER(IntKi), PARAMETER :: B2ADOF89Hds = 5153 + INTEGER(IntKi), PARAMETER :: B2ADOF90Hds = 5154 + INTEGER(IntKi), PARAMETER :: B2ADOF91Hds = 5155 + INTEGER(IntKi), PARAMETER :: B2ADOF92Hds = 5156 + INTEGER(IntKi), PARAMETER :: B2ADOF93Hds = 5157 + INTEGER(IntKi), PARAMETER :: B2ADOF94Hds = 5158 + INTEGER(IntKi), PARAMETER :: B2ADOF95Hds = 5159 + INTEGER(IntKi), PARAMETER :: B2ADOF96Hds = 5160 + INTEGER(IntKi), PARAMETER :: B2ADOF97Hds = 5161 + INTEGER(IntKi), PARAMETER :: B2ADOF98Hds = 5162 + INTEGER(IntKi), PARAMETER :: B2ADOF99Hds = 5163 + INTEGER(IntKi), PARAMETER :: B3ADOF1Hds = 5164 + INTEGER(IntKi), PARAMETER :: B3ADOF2Hds = 5165 + INTEGER(IntKi), PARAMETER :: B3ADOF3Hds = 5166 + INTEGER(IntKi), PARAMETER :: B3ADOF4Hds = 5167 + INTEGER(IntKi), PARAMETER :: B3ADOF5Hds = 5168 + INTEGER(IntKi), PARAMETER :: B3ADOF6Hds = 5169 + INTEGER(IntKi), PARAMETER :: B3ADOF7Hds = 5170 + INTEGER(IntKi), PARAMETER :: B3ADOF8Hds = 5171 + INTEGER(IntKi), PARAMETER :: B3ADOF9Hds = 5172 + INTEGER(IntKi), PARAMETER :: B3ADOF10Hds = 5173 + INTEGER(IntKi), PARAMETER :: B3ADOF11Hds = 5174 + INTEGER(IntKi), PARAMETER :: B3ADOF12Hds = 5175 + INTEGER(IntKi), PARAMETER :: B3ADOF13Hds = 5176 + INTEGER(IntKi), PARAMETER :: B3ADOF14Hds = 5177 + INTEGER(IntKi), PARAMETER :: B3ADOF15Hds = 5178 + INTEGER(IntKi), PARAMETER :: B3ADOF16Hds = 5179 + INTEGER(IntKi), PARAMETER :: B3ADOF17Hds = 5180 + INTEGER(IntKi), PARAMETER :: B3ADOF18Hds = 5181 + INTEGER(IntKi), PARAMETER :: B3ADOF19Hds = 5182 + INTEGER(IntKi), PARAMETER :: B3ADOF20Hds = 5183 + INTEGER(IntKi), PARAMETER :: B3ADOF21Hds = 5184 + INTEGER(IntKi), PARAMETER :: B3ADOF22Hds = 5185 + INTEGER(IntKi), PARAMETER :: B3ADOF23Hds = 5186 + INTEGER(IntKi), PARAMETER :: B3ADOF24Hds = 5187 + INTEGER(IntKi), PARAMETER :: B3ADOF25Hds = 5188 + INTEGER(IntKi), PARAMETER :: B3ADOF26Hds = 5189 + INTEGER(IntKi), PARAMETER :: B3ADOF27Hds = 5190 + INTEGER(IntKi), PARAMETER :: B3ADOF28Hds = 5191 + INTEGER(IntKi), PARAMETER :: B3ADOF29Hds = 5192 + INTEGER(IntKi), PARAMETER :: B3ADOF30Hds = 5193 + INTEGER(IntKi), PARAMETER :: B3ADOF31Hds = 5194 + INTEGER(IntKi), PARAMETER :: B3ADOF32Hds = 5195 + INTEGER(IntKi), PARAMETER :: B3ADOF33Hds = 5196 + INTEGER(IntKi), PARAMETER :: B3ADOF34Hds = 5197 + INTEGER(IntKi), PARAMETER :: B3ADOF35Hds = 5198 + INTEGER(IntKi), PARAMETER :: B3ADOF36Hds = 5199 + INTEGER(IntKi), PARAMETER :: B3ADOF37Hds = 5200 + INTEGER(IntKi), PARAMETER :: B3ADOF38Hds = 5201 + INTEGER(IntKi), PARAMETER :: B3ADOF39Hds = 5202 + INTEGER(IntKi), PARAMETER :: B3ADOF40Hds = 5203 + INTEGER(IntKi), PARAMETER :: B3ADOF41Hds = 5204 + INTEGER(IntKi), PARAMETER :: B3ADOF42Hds = 5205 + INTEGER(IntKi), PARAMETER :: B3ADOF43Hds = 5206 + INTEGER(IntKi), PARAMETER :: B3ADOF44Hds = 5207 + INTEGER(IntKi), PARAMETER :: B3ADOF45Hds = 5208 + INTEGER(IntKi), PARAMETER :: B3ADOF46Hds = 5209 + INTEGER(IntKi), PARAMETER :: B3ADOF47Hds = 5210 + INTEGER(IntKi), PARAMETER :: B3ADOF48Hds = 5211 + INTEGER(IntKi), PARAMETER :: B3ADOF49Hds = 5212 + INTEGER(IntKi), PARAMETER :: B3ADOF50Hds = 5213 + INTEGER(IntKi), PARAMETER :: B3ADOF51Hds = 5214 + INTEGER(IntKi), PARAMETER :: B3ADOF52Hds = 5215 + INTEGER(IntKi), PARAMETER :: B3ADOF53Hds = 5216 + INTEGER(IntKi), PARAMETER :: B3ADOF54Hds = 5217 + INTEGER(IntKi), PARAMETER :: B3ADOF55Hds = 5218 + INTEGER(IntKi), PARAMETER :: B3ADOF56Hds = 5219 + INTEGER(IntKi), PARAMETER :: B3ADOF57Hds = 5220 + INTEGER(IntKi), PARAMETER :: B3ADOF58Hds = 5221 + INTEGER(IntKi), PARAMETER :: B3ADOF59Hds = 5222 + INTEGER(IntKi), PARAMETER :: B3ADOF60Hds = 5223 + INTEGER(IntKi), PARAMETER :: B3ADOF61Hds = 5224 + INTEGER(IntKi), PARAMETER :: B3ADOF62Hds = 5225 + INTEGER(IntKi), PARAMETER :: B3ADOF63Hds = 5226 + INTEGER(IntKi), PARAMETER :: B3ADOF64Hds = 5227 + INTEGER(IntKi), PARAMETER :: B3ADOF65Hds = 5228 + INTEGER(IntKi), PARAMETER :: B3ADOF66Hds = 5229 + INTEGER(IntKi), PARAMETER :: B3ADOF67Hds = 5230 + INTEGER(IntKi), PARAMETER :: B3ADOF68Hds = 5231 + INTEGER(IntKi), PARAMETER :: B3ADOF69Hds = 5232 + INTEGER(IntKi), PARAMETER :: B3ADOF70Hds = 5233 + INTEGER(IntKi), PARAMETER :: B3ADOF71Hds = 5234 + INTEGER(IntKi), PARAMETER :: B3ADOF72Hds = 5235 + INTEGER(IntKi), PARAMETER :: B3ADOF73Hds = 5236 + INTEGER(IntKi), PARAMETER :: B3ADOF74Hds = 5237 + INTEGER(IntKi), PARAMETER :: B3ADOF75Hds = 5238 + INTEGER(IntKi), PARAMETER :: B3ADOF76Hds = 5239 + INTEGER(IntKi), PARAMETER :: B3ADOF77Hds = 5240 + INTEGER(IntKi), PARAMETER :: B3ADOF78Hds = 5241 + INTEGER(IntKi), PARAMETER :: B3ADOF79Hds = 5242 + INTEGER(IntKi), PARAMETER :: B3ADOF80Hds = 5243 + INTEGER(IntKi), PARAMETER :: B3ADOF81Hds = 5244 + INTEGER(IntKi), PARAMETER :: B3ADOF82Hds = 5245 + INTEGER(IntKi), PARAMETER :: B3ADOF83Hds = 5246 + INTEGER(IntKi), PARAMETER :: B3ADOF84Hds = 5247 + INTEGER(IntKi), PARAMETER :: B3ADOF85Hds = 5248 + INTEGER(IntKi), PARAMETER :: B3ADOF86Hds = 5249 + INTEGER(IntKi), PARAMETER :: B3ADOF87Hds = 5250 + INTEGER(IntKi), PARAMETER :: B3ADOF88Hds = 5251 + INTEGER(IntKi), PARAMETER :: B3ADOF89Hds = 5252 + INTEGER(IntKi), PARAMETER :: B3ADOF90Hds = 5253 + INTEGER(IntKi), PARAMETER :: B3ADOF91Hds = 5254 + INTEGER(IntKi), PARAMETER :: B3ADOF92Hds = 5255 + INTEGER(IntKi), PARAMETER :: B3ADOF93Hds = 5256 + INTEGER(IntKi), PARAMETER :: B3ADOF94Hds = 5257 + INTEGER(IntKi), PARAMETER :: B3ADOF95Hds = 5258 + INTEGER(IntKi), PARAMETER :: B3ADOF96Hds = 5259 + INTEGER(IntKi), PARAMETER :: B3ADOF97Hds = 5260 + INTEGER(IntKi), PARAMETER :: B3ADOF98Hds = 5261 + INTEGER(IntKi), PARAMETER :: B3ADOF99Hds = 5262 + INTEGER(IntKi), PARAMETER :: B4ADOF1Hds = 5263 + INTEGER(IntKi), PARAMETER :: B4ADOF2Hds = 5264 + INTEGER(IntKi), PARAMETER :: B4ADOF3Hds = 5265 + INTEGER(IntKi), PARAMETER :: B4ADOF4Hds = 5266 + INTEGER(IntKi), PARAMETER :: B4ADOF5Hds = 5267 + INTEGER(IntKi), PARAMETER :: B4ADOF6Hds = 5268 + INTEGER(IntKi), PARAMETER :: B4ADOF7Hds = 5269 + INTEGER(IntKi), PARAMETER :: B4ADOF8Hds = 5270 + INTEGER(IntKi), PARAMETER :: B4ADOF9Hds = 5271 + INTEGER(IntKi), PARAMETER :: B4ADOF10Hds = 5272 + INTEGER(IntKi), PARAMETER :: B4ADOF11Hds = 5273 + INTEGER(IntKi), PARAMETER :: B4ADOF12Hds = 5274 + INTEGER(IntKi), PARAMETER :: B4ADOF13Hds = 5275 + INTEGER(IntKi), PARAMETER :: B4ADOF14Hds = 5276 + INTEGER(IntKi), PARAMETER :: B4ADOF15Hds = 5277 + INTEGER(IntKi), PARAMETER :: B4ADOF16Hds = 5278 + INTEGER(IntKi), PARAMETER :: B4ADOF17Hds = 5279 + INTEGER(IntKi), PARAMETER :: B4ADOF18Hds = 5280 + INTEGER(IntKi), PARAMETER :: B4ADOF19Hds = 5281 + INTEGER(IntKi), PARAMETER :: B4ADOF20Hds = 5282 + INTEGER(IntKi), PARAMETER :: B4ADOF21Hds = 5283 + INTEGER(IntKi), PARAMETER :: B4ADOF22Hds = 5284 + INTEGER(IntKi), PARAMETER :: B4ADOF23Hds = 5285 + INTEGER(IntKi), PARAMETER :: B4ADOF24Hds = 5286 + INTEGER(IntKi), PARAMETER :: B4ADOF25Hds = 5287 + INTEGER(IntKi), PARAMETER :: B4ADOF26Hds = 5288 + INTEGER(IntKi), PARAMETER :: B4ADOF27Hds = 5289 + INTEGER(IntKi), PARAMETER :: B4ADOF28Hds = 5290 + INTEGER(IntKi), PARAMETER :: B4ADOF29Hds = 5291 + INTEGER(IntKi), PARAMETER :: B4ADOF30Hds = 5292 + INTEGER(IntKi), PARAMETER :: B4ADOF31Hds = 5293 + INTEGER(IntKi), PARAMETER :: B4ADOF32Hds = 5294 + INTEGER(IntKi), PARAMETER :: B4ADOF33Hds = 5295 + INTEGER(IntKi), PARAMETER :: B4ADOF34Hds = 5296 + INTEGER(IntKi), PARAMETER :: B4ADOF35Hds = 5297 + INTEGER(IntKi), PARAMETER :: B4ADOF36Hds = 5298 + INTEGER(IntKi), PARAMETER :: B4ADOF37Hds = 5299 + INTEGER(IntKi), PARAMETER :: B4ADOF38Hds = 5300 + INTEGER(IntKi), PARAMETER :: B4ADOF39Hds = 5301 + INTEGER(IntKi), PARAMETER :: B4ADOF40Hds = 5302 + INTEGER(IntKi), PARAMETER :: B4ADOF41Hds = 5303 + INTEGER(IntKi), PARAMETER :: B4ADOF42Hds = 5304 + INTEGER(IntKi), PARAMETER :: B4ADOF43Hds = 5305 + INTEGER(IntKi), PARAMETER :: B4ADOF44Hds = 5306 + INTEGER(IntKi), PARAMETER :: B4ADOF45Hds = 5307 + INTEGER(IntKi), PARAMETER :: B4ADOF46Hds = 5308 + INTEGER(IntKi), PARAMETER :: B4ADOF47Hds = 5309 + INTEGER(IntKi), PARAMETER :: B4ADOF48Hds = 5310 + INTEGER(IntKi), PARAMETER :: B4ADOF49Hds = 5311 + INTEGER(IntKi), PARAMETER :: B4ADOF50Hds = 5312 + INTEGER(IntKi), PARAMETER :: B4ADOF51Hds = 5313 + INTEGER(IntKi), PARAMETER :: B4ADOF52Hds = 5314 + INTEGER(IntKi), PARAMETER :: B4ADOF53Hds = 5315 + INTEGER(IntKi), PARAMETER :: B4ADOF54Hds = 5316 + INTEGER(IntKi), PARAMETER :: B4ADOF55Hds = 5317 + INTEGER(IntKi), PARAMETER :: B4ADOF56Hds = 5318 + INTEGER(IntKi), PARAMETER :: B4ADOF57Hds = 5319 + INTEGER(IntKi), PARAMETER :: B4ADOF58Hds = 5320 + INTEGER(IntKi), PARAMETER :: B4ADOF59Hds = 5321 + INTEGER(IntKi), PARAMETER :: B4ADOF60Hds = 5322 + INTEGER(IntKi), PARAMETER :: B4ADOF61Hds = 5323 + INTEGER(IntKi), PARAMETER :: B4ADOF62Hds = 5324 + INTEGER(IntKi), PARAMETER :: B4ADOF63Hds = 5325 + INTEGER(IntKi), PARAMETER :: B4ADOF64Hds = 5326 + INTEGER(IntKi), PARAMETER :: B4ADOF65Hds = 5327 + INTEGER(IntKi), PARAMETER :: B4ADOF66Hds = 5328 + INTEGER(IntKi), PARAMETER :: B4ADOF67Hds = 5329 + INTEGER(IntKi), PARAMETER :: B4ADOF68Hds = 5330 + INTEGER(IntKi), PARAMETER :: B4ADOF69Hds = 5331 + INTEGER(IntKi), PARAMETER :: B4ADOF70Hds = 5332 + INTEGER(IntKi), PARAMETER :: B4ADOF71Hds = 5333 + INTEGER(IntKi), PARAMETER :: B4ADOF72Hds = 5334 + INTEGER(IntKi), PARAMETER :: B4ADOF73Hds = 5335 + INTEGER(IntKi), PARAMETER :: B4ADOF74Hds = 5336 + INTEGER(IntKi), PARAMETER :: B4ADOF75Hds = 5337 + INTEGER(IntKi), PARAMETER :: B4ADOF76Hds = 5338 + INTEGER(IntKi), PARAMETER :: B4ADOF77Hds = 5339 + INTEGER(IntKi), PARAMETER :: B4ADOF78Hds = 5340 + INTEGER(IntKi), PARAMETER :: B4ADOF79Hds = 5341 + INTEGER(IntKi), PARAMETER :: B4ADOF80Hds = 5342 + INTEGER(IntKi), PARAMETER :: B4ADOF81Hds = 5343 + INTEGER(IntKi), PARAMETER :: B4ADOF82Hds = 5344 + INTEGER(IntKi), PARAMETER :: B4ADOF83Hds = 5345 + INTEGER(IntKi), PARAMETER :: B4ADOF84Hds = 5346 + INTEGER(IntKi), PARAMETER :: B4ADOF85Hds = 5347 + INTEGER(IntKi), PARAMETER :: B4ADOF86Hds = 5348 + INTEGER(IntKi), PARAMETER :: B4ADOF87Hds = 5349 + INTEGER(IntKi), PARAMETER :: B4ADOF88Hds = 5350 + INTEGER(IntKi), PARAMETER :: B4ADOF89Hds = 5351 + INTEGER(IntKi), PARAMETER :: B4ADOF90Hds = 5352 + INTEGER(IntKi), PARAMETER :: B4ADOF91Hds = 5353 + INTEGER(IntKi), PARAMETER :: B4ADOF92Hds = 5354 + INTEGER(IntKi), PARAMETER :: B4ADOF93Hds = 5355 + INTEGER(IntKi), PARAMETER :: B4ADOF94Hds = 5356 + INTEGER(IntKi), PARAMETER :: B4ADOF95Hds = 5357 + INTEGER(IntKi), PARAMETER :: B4ADOF96Hds = 5358 + INTEGER(IntKi), PARAMETER :: B4ADOF97Hds = 5359 + INTEGER(IntKi), PARAMETER :: B4ADOF98Hds = 5360 + INTEGER(IntKi), PARAMETER :: B4ADOF99Hds = 5361 + INTEGER(IntKi), PARAMETER :: B5ADOF1Hds = 5362 + INTEGER(IntKi), PARAMETER :: B5ADOF2Hds = 5363 + INTEGER(IntKi), PARAMETER :: B5ADOF3Hds = 5364 + INTEGER(IntKi), PARAMETER :: B5ADOF4Hds = 5365 + INTEGER(IntKi), PARAMETER :: B5ADOF5Hds = 5366 + INTEGER(IntKi), PARAMETER :: B5ADOF6Hds = 5367 + INTEGER(IntKi), PARAMETER :: B5ADOF7Hds = 5368 + INTEGER(IntKi), PARAMETER :: B5ADOF8Hds = 5369 + INTEGER(IntKi), PARAMETER :: B5ADOF9Hds = 5370 + INTEGER(IntKi), PARAMETER :: B5ADOF10Hds = 5371 + INTEGER(IntKi), PARAMETER :: B5ADOF11Hds = 5372 + INTEGER(IntKi), PARAMETER :: B5ADOF12Hds = 5373 + INTEGER(IntKi), PARAMETER :: B5ADOF13Hds = 5374 + INTEGER(IntKi), PARAMETER :: B5ADOF14Hds = 5375 + INTEGER(IntKi), PARAMETER :: B5ADOF15Hds = 5376 + INTEGER(IntKi), PARAMETER :: B5ADOF16Hds = 5377 + INTEGER(IntKi), PARAMETER :: B5ADOF17Hds = 5378 + INTEGER(IntKi), PARAMETER :: B5ADOF18Hds = 5379 + INTEGER(IntKi), PARAMETER :: B5ADOF19Hds = 5380 + INTEGER(IntKi), PARAMETER :: B5ADOF20Hds = 5381 + INTEGER(IntKi), PARAMETER :: B5ADOF21Hds = 5382 + INTEGER(IntKi), PARAMETER :: B5ADOF22Hds = 5383 + INTEGER(IntKi), PARAMETER :: B5ADOF23Hds = 5384 + INTEGER(IntKi), PARAMETER :: B5ADOF24Hds = 5385 + INTEGER(IntKi), PARAMETER :: B5ADOF25Hds = 5386 + INTEGER(IntKi), PARAMETER :: B5ADOF26Hds = 5387 + INTEGER(IntKi), PARAMETER :: B5ADOF27Hds = 5388 + INTEGER(IntKi), PARAMETER :: B5ADOF28Hds = 5389 + INTEGER(IntKi), PARAMETER :: B5ADOF29Hds = 5390 + INTEGER(IntKi), PARAMETER :: B5ADOF30Hds = 5391 + INTEGER(IntKi), PARAMETER :: B5ADOF31Hds = 5392 + INTEGER(IntKi), PARAMETER :: B5ADOF32Hds = 5393 + INTEGER(IntKi), PARAMETER :: B5ADOF33Hds = 5394 + INTEGER(IntKi), PARAMETER :: B5ADOF34Hds = 5395 + INTEGER(IntKi), PARAMETER :: B5ADOF35Hds = 5396 + INTEGER(IntKi), PARAMETER :: B5ADOF36Hds = 5397 + INTEGER(IntKi), PARAMETER :: B5ADOF37Hds = 5398 + INTEGER(IntKi), PARAMETER :: B5ADOF38Hds = 5399 + INTEGER(IntKi), PARAMETER :: B5ADOF39Hds = 5400 + INTEGER(IntKi), PARAMETER :: B5ADOF40Hds = 5401 + INTEGER(IntKi), PARAMETER :: B5ADOF41Hds = 5402 + INTEGER(IntKi), PARAMETER :: B5ADOF42Hds = 5403 + INTEGER(IntKi), PARAMETER :: B5ADOF43Hds = 5404 + INTEGER(IntKi), PARAMETER :: B5ADOF44Hds = 5405 + INTEGER(IntKi), PARAMETER :: B5ADOF45Hds = 5406 + INTEGER(IntKi), PARAMETER :: B5ADOF46Hds = 5407 + INTEGER(IntKi), PARAMETER :: B5ADOF47Hds = 5408 + INTEGER(IntKi), PARAMETER :: B5ADOF48Hds = 5409 + INTEGER(IntKi), PARAMETER :: B5ADOF49Hds = 5410 + INTEGER(IntKi), PARAMETER :: B5ADOF50Hds = 5411 + INTEGER(IntKi), PARAMETER :: B5ADOF51Hds = 5412 + INTEGER(IntKi), PARAMETER :: B5ADOF52Hds = 5413 + INTEGER(IntKi), PARAMETER :: B5ADOF53Hds = 5414 + INTEGER(IntKi), PARAMETER :: B5ADOF54Hds = 5415 + INTEGER(IntKi), PARAMETER :: B5ADOF55Hds = 5416 + INTEGER(IntKi), PARAMETER :: B5ADOF56Hds = 5417 + INTEGER(IntKi), PARAMETER :: B5ADOF57Hds = 5418 + INTEGER(IntKi), PARAMETER :: B5ADOF58Hds = 5419 + INTEGER(IntKi), PARAMETER :: B5ADOF59Hds = 5420 + INTEGER(IntKi), PARAMETER :: B5ADOF60Hds = 5421 + INTEGER(IntKi), PARAMETER :: B5ADOF61Hds = 5422 + INTEGER(IntKi), PARAMETER :: B5ADOF62Hds = 5423 + INTEGER(IntKi), PARAMETER :: B5ADOF63Hds = 5424 + INTEGER(IntKi), PARAMETER :: B5ADOF64Hds = 5425 + INTEGER(IntKi), PARAMETER :: B5ADOF65Hds = 5426 + INTEGER(IntKi), PARAMETER :: B5ADOF66Hds = 5427 + INTEGER(IntKi), PARAMETER :: B5ADOF67Hds = 5428 + INTEGER(IntKi), PARAMETER :: B5ADOF68Hds = 5429 + INTEGER(IntKi), PARAMETER :: B5ADOF69Hds = 5430 + INTEGER(IntKi), PARAMETER :: B5ADOF70Hds = 5431 + INTEGER(IntKi), PARAMETER :: B5ADOF71Hds = 5432 + INTEGER(IntKi), PARAMETER :: B5ADOF72Hds = 5433 + INTEGER(IntKi), PARAMETER :: B5ADOF73Hds = 5434 + INTEGER(IntKi), PARAMETER :: B5ADOF74Hds = 5435 + INTEGER(IntKi), PARAMETER :: B5ADOF75Hds = 5436 + INTEGER(IntKi), PARAMETER :: B5ADOF76Hds = 5437 + INTEGER(IntKi), PARAMETER :: B5ADOF77Hds = 5438 + INTEGER(IntKi), PARAMETER :: B5ADOF78Hds = 5439 + INTEGER(IntKi), PARAMETER :: B5ADOF79Hds = 5440 + INTEGER(IntKi), PARAMETER :: B5ADOF80Hds = 5441 + INTEGER(IntKi), PARAMETER :: B5ADOF81Hds = 5442 + INTEGER(IntKi), PARAMETER :: B5ADOF82Hds = 5443 + INTEGER(IntKi), PARAMETER :: B5ADOF83Hds = 5444 + INTEGER(IntKi), PARAMETER :: B5ADOF84Hds = 5445 + INTEGER(IntKi), PARAMETER :: B5ADOF85Hds = 5446 + INTEGER(IntKi), PARAMETER :: B5ADOF86Hds = 5447 + INTEGER(IntKi), PARAMETER :: B5ADOF87Hds = 5448 + INTEGER(IntKi), PARAMETER :: B5ADOF88Hds = 5449 + INTEGER(IntKi), PARAMETER :: B5ADOF89Hds = 5450 + INTEGER(IntKi), PARAMETER :: B5ADOF90Hds = 5451 + INTEGER(IntKi), PARAMETER :: B5ADOF91Hds = 5452 + INTEGER(IntKi), PARAMETER :: B5ADOF92Hds = 5453 + INTEGER(IntKi), PARAMETER :: B5ADOF93Hds = 5454 + INTEGER(IntKi), PARAMETER :: B5ADOF94Hds = 5455 + INTEGER(IntKi), PARAMETER :: B5ADOF95Hds = 5456 + INTEGER(IntKi), PARAMETER :: B5ADOF96Hds = 5457 + INTEGER(IntKi), PARAMETER :: B5ADOF97Hds = 5458 + INTEGER(IntKi), PARAMETER :: B5ADOF98Hds = 5459 + INTEGER(IntKi), PARAMETER :: B5ADOF99Hds = 5460 + INTEGER(IntKi), PARAMETER :: B6ADOF1Hds = 5461 + INTEGER(IntKi), PARAMETER :: B6ADOF2Hds = 5462 + INTEGER(IntKi), PARAMETER :: B6ADOF3Hds = 5463 + INTEGER(IntKi), PARAMETER :: B6ADOF4Hds = 5464 + INTEGER(IntKi), PARAMETER :: B6ADOF5Hds = 5465 + INTEGER(IntKi), PARAMETER :: B6ADOF6Hds = 5466 + INTEGER(IntKi), PARAMETER :: B6ADOF7Hds = 5467 + INTEGER(IntKi), PARAMETER :: B6ADOF8Hds = 5468 + INTEGER(IntKi), PARAMETER :: B6ADOF9Hds = 5469 + INTEGER(IntKi), PARAMETER :: B6ADOF10Hds = 5470 + INTEGER(IntKi), PARAMETER :: B6ADOF11Hds = 5471 + INTEGER(IntKi), PARAMETER :: B6ADOF12Hds = 5472 + INTEGER(IntKi), PARAMETER :: B6ADOF13Hds = 5473 + INTEGER(IntKi), PARAMETER :: B6ADOF14Hds = 5474 + INTEGER(IntKi), PARAMETER :: B6ADOF15Hds = 5475 + INTEGER(IntKi), PARAMETER :: B6ADOF16Hds = 5476 + INTEGER(IntKi), PARAMETER :: B6ADOF17Hds = 5477 + INTEGER(IntKi), PARAMETER :: B6ADOF18Hds = 5478 + INTEGER(IntKi), PARAMETER :: B6ADOF19Hds = 5479 + INTEGER(IntKi), PARAMETER :: B6ADOF20Hds = 5480 + INTEGER(IntKi), PARAMETER :: B6ADOF21Hds = 5481 + INTEGER(IntKi), PARAMETER :: B6ADOF22Hds = 5482 + INTEGER(IntKi), PARAMETER :: B6ADOF23Hds = 5483 + INTEGER(IntKi), PARAMETER :: B6ADOF24Hds = 5484 + INTEGER(IntKi), PARAMETER :: B6ADOF25Hds = 5485 + INTEGER(IntKi), PARAMETER :: B6ADOF26Hds = 5486 + INTEGER(IntKi), PARAMETER :: B6ADOF27Hds = 5487 + INTEGER(IntKi), PARAMETER :: B6ADOF28Hds = 5488 + INTEGER(IntKi), PARAMETER :: B6ADOF29Hds = 5489 + INTEGER(IntKi), PARAMETER :: B6ADOF30Hds = 5490 + INTEGER(IntKi), PARAMETER :: B6ADOF31Hds = 5491 + INTEGER(IntKi), PARAMETER :: B6ADOF32Hds = 5492 + INTEGER(IntKi), PARAMETER :: B6ADOF33Hds = 5493 + INTEGER(IntKi), PARAMETER :: B6ADOF34Hds = 5494 + INTEGER(IntKi), PARAMETER :: B6ADOF35Hds = 5495 + INTEGER(IntKi), PARAMETER :: B6ADOF36Hds = 5496 + INTEGER(IntKi), PARAMETER :: B6ADOF37Hds = 5497 + INTEGER(IntKi), PARAMETER :: B6ADOF38Hds = 5498 + INTEGER(IntKi), PARAMETER :: B6ADOF39Hds = 5499 + INTEGER(IntKi), PARAMETER :: B6ADOF40Hds = 5500 + INTEGER(IntKi), PARAMETER :: B6ADOF41Hds = 5501 + INTEGER(IntKi), PARAMETER :: B6ADOF42Hds = 5502 + INTEGER(IntKi), PARAMETER :: B6ADOF43Hds = 5503 + INTEGER(IntKi), PARAMETER :: B6ADOF44Hds = 5504 + INTEGER(IntKi), PARAMETER :: B6ADOF45Hds = 5505 + INTEGER(IntKi), PARAMETER :: B6ADOF46Hds = 5506 + INTEGER(IntKi), PARAMETER :: B6ADOF47Hds = 5507 + INTEGER(IntKi), PARAMETER :: B6ADOF48Hds = 5508 + INTEGER(IntKi), PARAMETER :: B6ADOF49Hds = 5509 + INTEGER(IntKi), PARAMETER :: B6ADOF50Hds = 5510 + INTEGER(IntKi), PARAMETER :: B6ADOF51Hds = 5511 + INTEGER(IntKi), PARAMETER :: B6ADOF52Hds = 5512 + INTEGER(IntKi), PARAMETER :: B6ADOF53Hds = 5513 + INTEGER(IntKi), PARAMETER :: B6ADOF54Hds = 5514 + INTEGER(IntKi), PARAMETER :: B6ADOF55Hds = 5515 + INTEGER(IntKi), PARAMETER :: B6ADOF56Hds = 5516 + INTEGER(IntKi), PARAMETER :: B6ADOF57Hds = 5517 + INTEGER(IntKi), PARAMETER :: B6ADOF58Hds = 5518 + INTEGER(IntKi), PARAMETER :: B6ADOF59Hds = 5519 + INTEGER(IntKi), PARAMETER :: B6ADOF60Hds = 5520 + INTEGER(IntKi), PARAMETER :: B6ADOF61Hds = 5521 + INTEGER(IntKi), PARAMETER :: B6ADOF62Hds = 5522 + INTEGER(IntKi), PARAMETER :: B6ADOF63Hds = 5523 + INTEGER(IntKi), PARAMETER :: B6ADOF64Hds = 5524 + INTEGER(IntKi), PARAMETER :: B6ADOF65Hds = 5525 + INTEGER(IntKi), PARAMETER :: B6ADOF66Hds = 5526 + INTEGER(IntKi), PARAMETER :: B6ADOF67Hds = 5527 + INTEGER(IntKi), PARAMETER :: B6ADOF68Hds = 5528 + INTEGER(IntKi), PARAMETER :: B6ADOF69Hds = 5529 + INTEGER(IntKi), PARAMETER :: B6ADOF70Hds = 5530 + INTEGER(IntKi), PARAMETER :: B6ADOF71Hds = 5531 + INTEGER(IntKi), PARAMETER :: B6ADOF72Hds = 5532 + INTEGER(IntKi), PARAMETER :: B6ADOF73Hds = 5533 + INTEGER(IntKi), PARAMETER :: B6ADOF74Hds = 5534 + INTEGER(IntKi), PARAMETER :: B6ADOF75Hds = 5535 + INTEGER(IntKi), PARAMETER :: B6ADOF76Hds = 5536 + INTEGER(IntKi), PARAMETER :: B6ADOF77Hds = 5537 + INTEGER(IntKi), PARAMETER :: B6ADOF78Hds = 5538 + INTEGER(IntKi), PARAMETER :: B6ADOF79Hds = 5539 + INTEGER(IntKi), PARAMETER :: B6ADOF80Hds = 5540 + INTEGER(IntKi), PARAMETER :: B6ADOF81Hds = 5541 + INTEGER(IntKi), PARAMETER :: B6ADOF82Hds = 5542 + INTEGER(IntKi), PARAMETER :: B6ADOF83Hds = 5543 + INTEGER(IntKi), PARAMETER :: B6ADOF84Hds = 5544 + INTEGER(IntKi), PARAMETER :: B6ADOF85Hds = 5545 + INTEGER(IntKi), PARAMETER :: B6ADOF86Hds = 5546 + INTEGER(IntKi), PARAMETER :: B6ADOF87Hds = 5547 + INTEGER(IntKi), PARAMETER :: B6ADOF88Hds = 5548 + INTEGER(IntKi), PARAMETER :: B6ADOF89Hds = 5549 + INTEGER(IntKi), PARAMETER :: B6ADOF90Hds = 5550 + INTEGER(IntKi), PARAMETER :: B6ADOF91Hds = 5551 + INTEGER(IntKi), PARAMETER :: B6ADOF92Hds = 5552 + INTEGER(IntKi), PARAMETER :: B6ADOF93Hds = 5553 + INTEGER(IntKi), PARAMETER :: B6ADOF94Hds = 5554 + INTEGER(IntKi), PARAMETER :: B6ADOF95Hds = 5555 + INTEGER(IntKi), PARAMETER :: B6ADOF96Hds = 5556 + INTEGER(IntKi), PARAMETER :: B6ADOF97Hds = 5557 + INTEGER(IntKi), PARAMETER :: B6ADOF98Hds = 5558 + INTEGER(IntKi), PARAMETER :: B6ADOF99Hds = 5559 + INTEGER(IntKi), PARAMETER :: B7ADOF1Hds = 5560 + INTEGER(IntKi), PARAMETER :: B7ADOF2Hds = 5561 + INTEGER(IntKi), PARAMETER :: B7ADOF3Hds = 5562 + INTEGER(IntKi), PARAMETER :: B7ADOF4Hds = 5563 + INTEGER(IntKi), PARAMETER :: B7ADOF5Hds = 5564 + INTEGER(IntKi), PARAMETER :: B7ADOF6Hds = 5565 + INTEGER(IntKi), PARAMETER :: B7ADOF7Hds = 5566 + INTEGER(IntKi), PARAMETER :: B7ADOF8Hds = 5567 + INTEGER(IntKi), PARAMETER :: B7ADOF9Hds = 5568 + INTEGER(IntKi), PARAMETER :: B7ADOF10Hds = 5569 + INTEGER(IntKi), PARAMETER :: B7ADOF11Hds = 5570 + INTEGER(IntKi), PARAMETER :: B7ADOF12Hds = 5571 + INTEGER(IntKi), PARAMETER :: B7ADOF13Hds = 5572 + INTEGER(IntKi), PARAMETER :: B7ADOF14Hds = 5573 + INTEGER(IntKi), PARAMETER :: B7ADOF15Hds = 5574 + INTEGER(IntKi), PARAMETER :: B7ADOF16Hds = 5575 + INTEGER(IntKi), PARAMETER :: B7ADOF17Hds = 5576 + INTEGER(IntKi), PARAMETER :: B7ADOF18Hds = 5577 + INTEGER(IntKi), PARAMETER :: B7ADOF19Hds = 5578 + INTEGER(IntKi), PARAMETER :: B7ADOF20Hds = 5579 + INTEGER(IntKi), PARAMETER :: B7ADOF21Hds = 5580 + INTEGER(IntKi), PARAMETER :: B7ADOF22Hds = 5581 + INTEGER(IntKi), PARAMETER :: B7ADOF23Hds = 5582 + INTEGER(IntKi), PARAMETER :: B7ADOF24Hds = 5583 + INTEGER(IntKi), PARAMETER :: B7ADOF25Hds = 5584 + INTEGER(IntKi), PARAMETER :: B7ADOF26Hds = 5585 + INTEGER(IntKi), PARAMETER :: B7ADOF27Hds = 5586 + INTEGER(IntKi), PARAMETER :: B7ADOF28Hds = 5587 + INTEGER(IntKi), PARAMETER :: B7ADOF29Hds = 5588 + INTEGER(IntKi), PARAMETER :: B7ADOF30Hds = 5589 + INTEGER(IntKi), PARAMETER :: B7ADOF31Hds = 5590 + INTEGER(IntKi), PARAMETER :: B7ADOF32Hds = 5591 + INTEGER(IntKi), PARAMETER :: B7ADOF33Hds = 5592 + INTEGER(IntKi), PARAMETER :: B7ADOF34Hds = 5593 + INTEGER(IntKi), PARAMETER :: B7ADOF35Hds = 5594 + INTEGER(IntKi), PARAMETER :: B7ADOF36Hds = 5595 + INTEGER(IntKi), PARAMETER :: B7ADOF37Hds = 5596 + INTEGER(IntKi), PARAMETER :: B7ADOF38Hds = 5597 + INTEGER(IntKi), PARAMETER :: B7ADOF39Hds = 5598 + INTEGER(IntKi), PARAMETER :: B7ADOF40Hds = 5599 + INTEGER(IntKi), PARAMETER :: B7ADOF41Hds = 5600 + INTEGER(IntKi), PARAMETER :: B7ADOF42Hds = 5601 + INTEGER(IntKi), PARAMETER :: B7ADOF43Hds = 5602 + INTEGER(IntKi), PARAMETER :: B7ADOF44Hds = 5603 + INTEGER(IntKi), PARAMETER :: B7ADOF45Hds = 5604 + INTEGER(IntKi), PARAMETER :: B7ADOF46Hds = 5605 + INTEGER(IntKi), PARAMETER :: B7ADOF47Hds = 5606 + INTEGER(IntKi), PARAMETER :: B7ADOF48Hds = 5607 + INTEGER(IntKi), PARAMETER :: B7ADOF49Hds = 5608 + INTEGER(IntKi), PARAMETER :: B7ADOF50Hds = 5609 + INTEGER(IntKi), PARAMETER :: B7ADOF51Hds = 5610 + INTEGER(IntKi), PARAMETER :: B7ADOF52Hds = 5611 + INTEGER(IntKi), PARAMETER :: B7ADOF53Hds = 5612 + INTEGER(IntKi), PARAMETER :: B7ADOF54Hds = 5613 + INTEGER(IntKi), PARAMETER :: B7ADOF55Hds = 5614 + INTEGER(IntKi), PARAMETER :: B7ADOF56Hds = 5615 + INTEGER(IntKi), PARAMETER :: B7ADOF57Hds = 5616 + INTEGER(IntKi), PARAMETER :: B7ADOF58Hds = 5617 + INTEGER(IntKi), PARAMETER :: B7ADOF59Hds = 5618 + INTEGER(IntKi), PARAMETER :: B7ADOF60Hds = 5619 + INTEGER(IntKi), PARAMETER :: B7ADOF61Hds = 5620 + INTEGER(IntKi), PARAMETER :: B7ADOF62Hds = 5621 + INTEGER(IntKi), PARAMETER :: B7ADOF63Hds = 5622 + INTEGER(IntKi), PARAMETER :: B7ADOF64Hds = 5623 + INTEGER(IntKi), PARAMETER :: B7ADOF65Hds = 5624 + INTEGER(IntKi), PARAMETER :: B7ADOF66Hds = 5625 + INTEGER(IntKi), PARAMETER :: B7ADOF67Hds = 5626 + INTEGER(IntKi), PARAMETER :: B7ADOF68Hds = 5627 + INTEGER(IntKi), PARAMETER :: B7ADOF69Hds = 5628 + INTEGER(IntKi), PARAMETER :: B7ADOF70Hds = 5629 + INTEGER(IntKi), PARAMETER :: B7ADOF71Hds = 5630 + INTEGER(IntKi), PARAMETER :: B7ADOF72Hds = 5631 + INTEGER(IntKi), PARAMETER :: B7ADOF73Hds = 5632 + INTEGER(IntKi), PARAMETER :: B7ADOF74Hds = 5633 + INTEGER(IntKi), PARAMETER :: B7ADOF75Hds = 5634 + INTEGER(IntKi), PARAMETER :: B7ADOF76Hds = 5635 + INTEGER(IntKi), PARAMETER :: B7ADOF77Hds = 5636 + INTEGER(IntKi), PARAMETER :: B7ADOF78Hds = 5637 + INTEGER(IntKi), PARAMETER :: B7ADOF79Hds = 5638 + INTEGER(IntKi), PARAMETER :: B7ADOF80Hds = 5639 + INTEGER(IntKi), PARAMETER :: B7ADOF81Hds = 5640 + INTEGER(IntKi), PARAMETER :: B7ADOF82Hds = 5641 + INTEGER(IntKi), PARAMETER :: B7ADOF83Hds = 5642 + INTEGER(IntKi), PARAMETER :: B7ADOF84Hds = 5643 + INTEGER(IntKi), PARAMETER :: B7ADOF85Hds = 5644 + INTEGER(IntKi), PARAMETER :: B7ADOF86Hds = 5645 + INTEGER(IntKi), PARAMETER :: B7ADOF87Hds = 5646 + INTEGER(IntKi), PARAMETER :: B7ADOF88Hds = 5647 + INTEGER(IntKi), PARAMETER :: B7ADOF89Hds = 5648 + INTEGER(IntKi), PARAMETER :: B7ADOF90Hds = 5649 + INTEGER(IntKi), PARAMETER :: B7ADOF91Hds = 5650 + INTEGER(IntKi), PARAMETER :: B7ADOF92Hds = 5651 + INTEGER(IntKi), PARAMETER :: B7ADOF93Hds = 5652 + INTEGER(IntKi), PARAMETER :: B7ADOF94Hds = 5653 + INTEGER(IntKi), PARAMETER :: B7ADOF95Hds = 5654 + INTEGER(IntKi), PARAMETER :: B7ADOF96Hds = 5655 + INTEGER(IntKi), PARAMETER :: B7ADOF97Hds = 5656 + INTEGER(IntKi), PARAMETER :: B7ADOF98Hds = 5657 + INTEGER(IntKi), PARAMETER :: B7ADOF99Hds = 5658 + INTEGER(IntKi), PARAMETER :: B8ADOF1Hds = 5659 + INTEGER(IntKi), PARAMETER :: B8ADOF2Hds = 5660 + INTEGER(IntKi), PARAMETER :: B8ADOF3Hds = 5661 + INTEGER(IntKi), PARAMETER :: B8ADOF4Hds = 5662 + INTEGER(IntKi), PARAMETER :: B8ADOF5Hds = 5663 + INTEGER(IntKi), PARAMETER :: B8ADOF6Hds = 5664 + INTEGER(IntKi), PARAMETER :: B8ADOF7Hds = 5665 + INTEGER(IntKi), PARAMETER :: B8ADOF8Hds = 5666 + INTEGER(IntKi), PARAMETER :: B8ADOF9Hds = 5667 + INTEGER(IntKi), PARAMETER :: B8ADOF10Hds = 5668 + INTEGER(IntKi), PARAMETER :: B8ADOF11Hds = 5669 + INTEGER(IntKi), PARAMETER :: B8ADOF12Hds = 5670 + INTEGER(IntKi), PARAMETER :: B8ADOF13Hds = 5671 + INTEGER(IntKi), PARAMETER :: B8ADOF14Hds = 5672 + INTEGER(IntKi), PARAMETER :: B8ADOF15Hds = 5673 + INTEGER(IntKi), PARAMETER :: B8ADOF16Hds = 5674 + INTEGER(IntKi), PARAMETER :: B8ADOF17Hds = 5675 + INTEGER(IntKi), PARAMETER :: B8ADOF18Hds = 5676 + INTEGER(IntKi), PARAMETER :: B8ADOF19Hds = 5677 + INTEGER(IntKi), PARAMETER :: B8ADOF20Hds = 5678 + INTEGER(IntKi), PARAMETER :: B8ADOF21Hds = 5679 + INTEGER(IntKi), PARAMETER :: B8ADOF22Hds = 5680 + INTEGER(IntKi), PARAMETER :: B8ADOF23Hds = 5681 + INTEGER(IntKi), PARAMETER :: B8ADOF24Hds = 5682 + INTEGER(IntKi), PARAMETER :: B8ADOF25Hds = 5683 + INTEGER(IntKi), PARAMETER :: B8ADOF26Hds = 5684 + INTEGER(IntKi), PARAMETER :: B8ADOF27Hds = 5685 + INTEGER(IntKi), PARAMETER :: B8ADOF28Hds = 5686 + INTEGER(IntKi), PARAMETER :: B8ADOF29Hds = 5687 + INTEGER(IntKi), PARAMETER :: B8ADOF30Hds = 5688 + INTEGER(IntKi), PARAMETER :: B8ADOF31Hds = 5689 + INTEGER(IntKi), PARAMETER :: B8ADOF32Hds = 5690 + INTEGER(IntKi), PARAMETER :: B8ADOF33Hds = 5691 + INTEGER(IntKi), PARAMETER :: B8ADOF34Hds = 5692 + INTEGER(IntKi), PARAMETER :: B8ADOF35Hds = 5693 + INTEGER(IntKi), PARAMETER :: B8ADOF36Hds = 5694 + INTEGER(IntKi), PARAMETER :: B8ADOF37Hds = 5695 + INTEGER(IntKi), PARAMETER :: B8ADOF38Hds = 5696 + INTEGER(IntKi), PARAMETER :: B8ADOF39Hds = 5697 + INTEGER(IntKi), PARAMETER :: B8ADOF40Hds = 5698 + INTEGER(IntKi), PARAMETER :: B8ADOF41Hds = 5699 + INTEGER(IntKi), PARAMETER :: B8ADOF42Hds = 5700 + INTEGER(IntKi), PARAMETER :: B8ADOF43Hds = 5701 + INTEGER(IntKi), PARAMETER :: B8ADOF44Hds = 5702 + INTEGER(IntKi), PARAMETER :: B8ADOF45Hds = 5703 + INTEGER(IntKi), PARAMETER :: B8ADOF46Hds = 5704 + INTEGER(IntKi), PARAMETER :: B8ADOF47Hds = 5705 + INTEGER(IntKi), PARAMETER :: B8ADOF48Hds = 5706 + INTEGER(IntKi), PARAMETER :: B8ADOF49Hds = 5707 + INTEGER(IntKi), PARAMETER :: B8ADOF50Hds = 5708 + INTEGER(IntKi), PARAMETER :: B8ADOF51Hds = 5709 + INTEGER(IntKi), PARAMETER :: B8ADOF52Hds = 5710 + INTEGER(IntKi), PARAMETER :: B8ADOF53Hds = 5711 + INTEGER(IntKi), PARAMETER :: B8ADOF54Hds = 5712 + INTEGER(IntKi), PARAMETER :: B8ADOF55Hds = 5713 + INTEGER(IntKi), PARAMETER :: B8ADOF56Hds = 5714 + INTEGER(IntKi), PARAMETER :: B8ADOF57Hds = 5715 + INTEGER(IntKi), PARAMETER :: B8ADOF58Hds = 5716 + INTEGER(IntKi), PARAMETER :: B8ADOF59Hds = 5717 + INTEGER(IntKi), PARAMETER :: B8ADOF60Hds = 5718 + INTEGER(IntKi), PARAMETER :: B8ADOF61Hds = 5719 + INTEGER(IntKi), PARAMETER :: B8ADOF62Hds = 5720 + INTEGER(IntKi), PARAMETER :: B8ADOF63Hds = 5721 + INTEGER(IntKi), PARAMETER :: B8ADOF64Hds = 5722 + INTEGER(IntKi), PARAMETER :: B8ADOF65Hds = 5723 + INTEGER(IntKi), PARAMETER :: B8ADOF66Hds = 5724 + INTEGER(IntKi), PARAMETER :: B8ADOF67Hds = 5725 + INTEGER(IntKi), PARAMETER :: B8ADOF68Hds = 5726 + INTEGER(IntKi), PARAMETER :: B8ADOF69Hds = 5727 + INTEGER(IntKi), PARAMETER :: B8ADOF70Hds = 5728 + INTEGER(IntKi), PARAMETER :: B8ADOF71Hds = 5729 + INTEGER(IntKi), PARAMETER :: B8ADOF72Hds = 5730 + INTEGER(IntKi), PARAMETER :: B8ADOF73Hds = 5731 + INTEGER(IntKi), PARAMETER :: B8ADOF74Hds = 5732 + INTEGER(IntKi), PARAMETER :: B8ADOF75Hds = 5733 + INTEGER(IntKi), PARAMETER :: B8ADOF76Hds = 5734 + INTEGER(IntKi), PARAMETER :: B8ADOF77Hds = 5735 + INTEGER(IntKi), PARAMETER :: B8ADOF78Hds = 5736 + INTEGER(IntKi), PARAMETER :: B8ADOF79Hds = 5737 + INTEGER(IntKi), PARAMETER :: B8ADOF80Hds = 5738 + INTEGER(IntKi), PARAMETER :: B8ADOF81Hds = 5739 + INTEGER(IntKi), PARAMETER :: B8ADOF82Hds = 5740 + INTEGER(IntKi), PARAMETER :: B8ADOF83Hds = 5741 + INTEGER(IntKi), PARAMETER :: B8ADOF84Hds = 5742 + INTEGER(IntKi), PARAMETER :: B8ADOF85Hds = 5743 + INTEGER(IntKi), PARAMETER :: B8ADOF86Hds = 5744 + INTEGER(IntKi), PARAMETER :: B8ADOF87Hds = 5745 + INTEGER(IntKi), PARAMETER :: B8ADOF88Hds = 5746 + INTEGER(IntKi), PARAMETER :: B8ADOF89Hds = 5747 + INTEGER(IntKi), PARAMETER :: B8ADOF90Hds = 5748 + INTEGER(IntKi), PARAMETER :: B8ADOF91Hds = 5749 + INTEGER(IntKi), PARAMETER :: B8ADOF92Hds = 5750 + INTEGER(IntKi), PARAMETER :: B8ADOF93Hds = 5751 + INTEGER(IntKi), PARAMETER :: B8ADOF94Hds = 5752 + INTEGER(IntKi), PARAMETER :: B8ADOF95Hds = 5753 + INTEGER(IntKi), PARAMETER :: B8ADOF96Hds = 5754 + INTEGER(IntKi), PARAMETER :: B8ADOF97Hds = 5755 + INTEGER(IntKi), PARAMETER :: B8ADOF98Hds = 5756 + INTEGER(IntKi), PARAMETER :: B8ADOF99Hds = 5757 + INTEGER(IntKi), PARAMETER :: B9ADOF1Hds = 5758 + INTEGER(IntKi), PARAMETER :: B9ADOF2Hds = 5759 + INTEGER(IntKi), PARAMETER :: B9ADOF3Hds = 5760 + INTEGER(IntKi), PARAMETER :: B9ADOF4Hds = 5761 + INTEGER(IntKi), PARAMETER :: B9ADOF5Hds = 5762 + INTEGER(IntKi), PARAMETER :: B9ADOF6Hds = 5763 + INTEGER(IntKi), PARAMETER :: B9ADOF7Hds = 5764 + INTEGER(IntKi), PARAMETER :: B9ADOF8Hds = 5765 + INTEGER(IntKi), PARAMETER :: B9ADOF9Hds = 5766 + INTEGER(IntKi), PARAMETER :: B9ADOF10Hds = 5767 + INTEGER(IntKi), PARAMETER :: B9ADOF11Hds = 5768 + INTEGER(IntKi), PARAMETER :: B9ADOF12Hds = 5769 + INTEGER(IntKi), PARAMETER :: B9ADOF13Hds = 5770 + INTEGER(IntKi), PARAMETER :: B9ADOF14Hds = 5771 + INTEGER(IntKi), PARAMETER :: B9ADOF15Hds = 5772 + INTEGER(IntKi), PARAMETER :: B9ADOF16Hds = 5773 + INTEGER(IntKi), PARAMETER :: B9ADOF17Hds = 5774 + INTEGER(IntKi), PARAMETER :: B9ADOF18Hds = 5775 + INTEGER(IntKi), PARAMETER :: B9ADOF19Hds = 5776 + INTEGER(IntKi), PARAMETER :: B9ADOF20Hds = 5777 + INTEGER(IntKi), PARAMETER :: B9ADOF21Hds = 5778 + INTEGER(IntKi), PARAMETER :: B9ADOF22Hds = 5779 + INTEGER(IntKi), PARAMETER :: B9ADOF23Hds = 5780 + INTEGER(IntKi), PARAMETER :: B9ADOF24Hds = 5781 + INTEGER(IntKi), PARAMETER :: B9ADOF25Hds = 5782 + INTEGER(IntKi), PARAMETER :: B9ADOF26Hds = 5783 + INTEGER(IntKi), PARAMETER :: B9ADOF27Hds = 5784 + INTEGER(IntKi), PARAMETER :: B9ADOF28Hds = 5785 + INTEGER(IntKi), PARAMETER :: B9ADOF29Hds = 5786 + INTEGER(IntKi), PARAMETER :: B9ADOF30Hds = 5787 + INTEGER(IntKi), PARAMETER :: B9ADOF31Hds = 5788 + INTEGER(IntKi), PARAMETER :: B9ADOF32Hds = 5789 + INTEGER(IntKi), PARAMETER :: B9ADOF33Hds = 5790 + INTEGER(IntKi), PARAMETER :: B9ADOF34Hds = 5791 + INTEGER(IntKi), PARAMETER :: B9ADOF35Hds = 5792 + INTEGER(IntKi), PARAMETER :: B9ADOF36Hds = 5793 + INTEGER(IntKi), PARAMETER :: B9ADOF37Hds = 5794 + INTEGER(IntKi), PARAMETER :: B9ADOF38Hds = 5795 + INTEGER(IntKi), PARAMETER :: B9ADOF39Hds = 5796 + INTEGER(IntKi), PARAMETER :: B9ADOF40Hds = 5797 + INTEGER(IntKi), PARAMETER :: B9ADOF41Hds = 5798 + INTEGER(IntKi), PARAMETER :: B9ADOF42Hds = 5799 + INTEGER(IntKi), PARAMETER :: B9ADOF43Hds = 5800 + INTEGER(IntKi), PARAMETER :: B9ADOF44Hds = 5801 + INTEGER(IntKi), PARAMETER :: B9ADOF45Hds = 5802 + INTEGER(IntKi), PARAMETER :: B9ADOF46Hds = 5803 + INTEGER(IntKi), PARAMETER :: B9ADOF47Hds = 5804 + INTEGER(IntKi), PARAMETER :: B9ADOF48Hds = 5805 + INTEGER(IntKi), PARAMETER :: B9ADOF49Hds = 5806 + INTEGER(IntKi), PARAMETER :: B9ADOF50Hds = 5807 + INTEGER(IntKi), PARAMETER :: B9ADOF51Hds = 5808 + INTEGER(IntKi), PARAMETER :: B9ADOF52Hds = 5809 + INTEGER(IntKi), PARAMETER :: B9ADOF53Hds = 5810 + INTEGER(IntKi), PARAMETER :: B9ADOF54Hds = 5811 + INTEGER(IntKi), PARAMETER :: B9ADOF55Hds = 5812 + INTEGER(IntKi), PARAMETER :: B9ADOF56Hds = 5813 + INTEGER(IntKi), PARAMETER :: B9ADOF57Hds = 5814 + INTEGER(IntKi), PARAMETER :: B9ADOF58Hds = 5815 + INTEGER(IntKi), PARAMETER :: B9ADOF59Hds = 5816 + INTEGER(IntKi), PARAMETER :: B9ADOF60Hds = 5817 + INTEGER(IntKi), PARAMETER :: B9ADOF61Hds = 5818 + INTEGER(IntKi), PARAMETER :: B9ADOF62Hds = 5819 + INTEGER(IntKi), PARAMETER :: B9ADOF63Hds = 5820 + INTEGER(IntKi), PARAMETER :: B9ADOF64Hds = 5821 + INTEGER(IntKi), PARAMETER :: B9ADOF65Hds = 5822 + INTEGER(IntKi), PARAMETER :: B9ADOF66Hds = 5823 + INTEGER(IntKi), PARAMETER :: B9ADOF67Hds = 5824 + INTEGER(IntKi), PARAMETER :: B9ADOF68Hds = 5825 + INTEGER(IntKi), PARAMETER :: B9ADOF69Hds = 5826 + INTEGER(IntKi), PARAMETER :: B9ADOF70Hds = 5827 + INTEGER(IntKi), PARAMETER :: B9ADOF71Hds = 5828 + INTEGER(IntKi), PARAMETER :: B9ADOF72Hds = 5829 + INTEGER(IntKi), PARAMETER :: B9ADOF73Hds = 5830 + INTEGER(IntKi), PARAMETER :: B9ADOF74Hds = 5831 + INTEGER(IntKi), PARAMETER :: B9ADOF75Hds = 5832 + INTEGER(IntKi), PARAMETER :: B9ADOF76Hds = 5833 + INTEGER(IntKi), PARAMETER :: B9ADOF77Hds = 5834 + INTEGER(IntKi), PARAMETER :: B9ADOF78Hds = 5835 + INTEGER(IntKi), PARAMETER :: B9ADOF79Hds = 5836 + INTEGER(IntKi), PARAMETER :: B9ADOF80Hds = 5837 + INTEGER(IntKi), PARAMETER :: B9ADOF81Hds = 5838 + INTEGER(IntKi), PARAMETER :: B9ADOF82Hds = 5839 + INTEGER(IntKi), PARAMETER :: B9ADOF83Hds = 5840 + INTEGER(IntKi), PARAMETER :: B9ADOF84Hds = 5841 + INTEGER(IntKi), PARAMETER :: B9ADOF85Hds = 5842 + INTEGER(IntKi), PARAMETER :: B9ADOF86Hds = 5843 + INTEGER(IntKi), PARAMETER :: B9ADOF87Hds = 5844 + INTEGER(IntKi), PARAMETER :: B9ADOF88Hds = 5845 + INTEGER(IntKi), PARAMETER :: B9ADOF89Hds = 5846 + INTEGER(IntKi), PARAMETER :: B9ADOF90Hds = 5847 + INTEGER(IntKi), PARAMETER :: B9ADOF91Hds = 5848 + INTEGER(IntKi), PARAMETER :: B9ADOF92Hds = 5849 + INTEGER(IntKi), PARAMETER :: B9ADOF93Hds = 5850 + INTEGER(IntKi), PARAMETER :: B9ADOF94Hds = 5851 + INTEGER(IntKi), PARAMETER :: B9ADOF95Hds = 5852 + INTEGER(IntKi), PARAMETER :: B9ADOF96Hds = 5853 + INTEGER(IntKi), PARAMETER :: B9ADOF97Hds = 5854 + INTEGER(IntKi), PARAMETER :: B9ADOF98Hds = 5855 + INTEGER(IntKi), PARAMETER :: B9ADOF99Hds = 5856 + INTEGER(IntKi), PARAMETER :: B1ADOF1Wvs = 5857 + INTEGER(IntKi), PARAMETER :: B1ADOF2Wvs = 5858 + INTEGER(IntKi), PARAMETER :: B1ADOF3Wvs = 5859 + INTEGER(IntKi), PARAMETER :: B1ADOF4Wvs = 5860 + INTEGER(IntKi), PARAMETER :: B1ADOF5Wvs = 5861 + INTEGER(IntKi), PARAMETER :: B1ADOF6Wvs = 5862 + INTEGER(IntKi), PARAMETER :: B1ADOF7Wvs = 5863 + INTEGER(IntKi), PARAMETER :: B1ADOF8Wvs = 5864 + INTEGER(IntKi), PARAMETER :: B1ADOF9Wvs = 5865 + INTEGER(IntKi), PARAMETER :: B1ADOF10Wvs = 5866 + INTEGER(IntKi), PARAMETER :: B1ADOF11Wvs = 5867 + INTEGER(IntKi), PARAMETER :: B1ADOF12Wvs = 5868 + INTEGER(IntKi), PARAMETER :: B1ADOF13Wvs = 5869 + INTEGER(IntKi), PARAMETER :: B1ADOF14Wvs = 5870 + INTEGER(IntKi), PARAMETER :: B1ADOF15Wvs = 5871 + INTEGER(IntKi), PARAMETER :: B1ADOF16Wvs = 5872 + INTEGER(IntKi), PARAMETER :: B1ADOF17Wvs = 5873 + INTEGER(IntKi), PARAMETER :: B1ADOF18Wvs = 5874 + INTEGER(IntKi), PARAMETER :: B1ADOF19Wvs = 5875 + INTEGER(IntKi), PARAMETER :: B1ADOF20Wvs = 5876 + INTEGER(IntKi), PARAMETER :: B1ADOF21Wvs = 5877 + INTEGER(IntKi), PARAMETER :: B1ADOF22Wvs = 5878 + INTEGER(IntKi), PARAMETER :: B1ADOF23Wvs = 5879 + INTEGER(IntKi), PARAMETER :: B1ADOF24Wvs = 5880 + INTEGER(IntKi), PARAMETER :: B1ADOF25Wvs = 5881 + INTEGER(IntKi), PARAMETER :: B1ADOF26Wvs = 5882 + INTEGER(IntKi), PARAMETER :: B1ADOF27Wvs = 5883 + INTEGER(IntKi), PARAMETER :: B1ADOF28Wvs = 5884 + INTEGER(IntKi), PARAMETER :: B1ADOF29Wvs = 5885 + INTEGER(IntKi), PARAMETER :: B1ADOF30Wvs = 5886 + INTEGER(IntKi), PARAMETER :: B1ADOF31Wvs = 5887 + INTEGER(IntKi), PARAMETER :: B1ADOF32Wvs = 5888 + INTEGER(IntKi), PARAMETER :: B1ADOF33Wvs = 5889 + INTEGER(IntKi), PARAMETER :: B1ADOF34Wvs = 5890 + INTEGER(IntKi), PARAMETER :: B1ADOF35Wvs = 5891 + INTEGER(IntKi), PARAMETER :: B1ADOF36Wvs = 5892 + INTEGER(IntKi), PARAMETER :: B1ADOF37Wvs = 5893 + INTEGER(IntKi), PARAMETER :: B1ADOF38Wvs = 5894 + INTEGER(IntKi), PARAMETER :: B1ADOF39Wvs = 5895 + INTEGER(IntKi), PARAMETER :: B1ADOF40Wvs = 5896 + INTEGER(IntKi), PARAMETER :: B1ADOF41Wvs = 5897 + INTEGER(IntKi), PARAMETER :: B1ADOF42Wvs = 5898 + INTEGER(IntKi), PARAMETER :: B1ADOF43Wvs = 5899 + INTEGER(IntKi), PARAMETER :: B1ADOF44Wvs = 5900 + INTEGER(IntKi), PARAMETER :: B1ADOF45Wvs = 5901 + INTEGER(IntKi), PARAMETER :: B1ADOF46Wvs = 5902 + INTEGER(IntKi), PARAMETER :: B1ADOF47Wvs = 5903 + INTEGER(IntKi), PARAMETER :: B1ADOF48Wvs = 5904 + INTEGER(IntKi), PARAMETER :: B1ADOF49Wvs = 5905 + INTEGER(IntKi), PARAMETER :: B1ADOF50Wvs = 5906 + INTEGER(IntKi), PARAMETER :: B1ADOF51Wvs = 5907 + INTEGER(IntKi), PARAMETER :: B1ADOF52Wvs = 5908 + INTEGER(IntKi), PARAMETER :: B1ADOF53Wvs = 5909 + INTEGER(IntKi), PARAMETER :: B1ADOF54Wvs = 5910 + INTEGER(IntKi), PARAMETER :: B1ADOF55Wvs = 5911 + INTEGER(IntKi), PARAMETER :: B1ADOF56Wvs = 5912 + INTEGER(IntKi), PARAMETER :: B1ADOF57Wvs = 5913 + INTEGER(IntKi), PARAMETER :: B1ADOF58Wvs = 5914 + INTEGER(IntKi), PARAMETER :: B1ADOF59Wvs = 5915 + INTEGER(IntKi), PARAMETER :: B1ADOF60Wvs = 5916 + INTEGER(IntKi), PARAMETER :: B1ADOF61Wvs = 5917 + INTEGER(IntKi), PARAMETER :: B1ADOF62Wvs = 5918 + INTEGER(IntKi), PARAMETER :: B1ADOF63Wvs = 5919 + INTEGER(IntKi), PARAMETER :: B1ADOF64Wvs = 5920 + INTEGER(IntKi), PARAMETER :: B1ADOF65Wvs = 5921 + INTEGER(IntKi), PARAMETER :: B1ADOF66Wvs = 5922 + INTEGER(IntKi), PARAMETER :: B1ADOF67Wvs = 5923 + INTEGER(IntKi), PARAMETER :: B1ADOF68Wvs = 5924 + INTEGER(IntKi), PARAMETER :: B1ADOF69Wvs = 5925 + INTEGER(IntKi), PARAMETER :: B1ADOF70Wvs = 5926 + INTEGER(IntKi), PARAMETER :: B1ADOF71Wvs = 5927 + INTEGER(IntKi), PARAMETER :: B1ADOF72Wvs = 5928 + INTEGER(IntKi), PARAMETER :: B1ADOF73Wvs = 5929 + INTEGER(IntKi), PARAMETER :: B1ADOF74Wvs = 5930 + INTEGER(IntKi), PARAMETER :: B1ADOF75Wvs = 5931 + INTEGER(IntKi), PARAMETER :: B1ADOF76Wvs = 5932 + INTEGER(IntKi), PARAMETER :: B1ADOF77Wvs = 5933 + INTEGER(IntKi), PARAMETER :: B1ADOF78Wvs = 5934 + INTEGER(IntKi), PARAMETER :: B1ADOF79Wvs = 5935 + INTEGER(IntKi), PARAMETER :: B1ADOF80Wvs = 5936 + INTEGER(IntKi), PARAMETER :: B1ADOF81Wvs = 5937 + INTEGER(IntKi), PARAMETER :: B1ADOF82Wvs = 5938 + INTEGER(IntKi), PARAMETER :: B1ADOF83Wvs = 5939 + INTEGER(IntKi), PARAMETER :: B1ADOF84Wvs = 5940 + INTEGER(IntKi), PARAMETER :: B1ADOF85Wvs = 5941 + INTEGER(IntKi), PARAMETER :: B1ADOF86Wvs = 5942 + INTEGER(IntKi), PARAMETER :: B1ADOF87Wvs = 5943 + INTEGER(IntKi), PARAMETER :: B1ADOF88Wvs = 5944 + INTEGER(IntKi), PARAMETER :: B1ADOF89Wvs = 5945 + INTEGER(IntKi), PARAMETER :: B1ADOF90Wvs = 5946 + INTEGER(IntKi), PARAMETER :: B1ADOF91Wvs = 5947 + INTEGER(IntKi), PARAMETER :: B1ADOF92Wvs = 5948 + INTEGER(IntKi), PARAMETER :: B1ADOF93Wvs = 5949 + INTEGER(IntKi), PARAMETER :: B1ADOF94Wvs = 5950 + INTEGER(IntKi), PARAMETER :: B1ADOF95Wvs = 5951 + INTEGER(IntKi), PARAMETER :: B1ADOF96Wvs = 5952 + INTEGER(IntKi), PARAMETER :: B1ADOF97Wvs = 5953 + INTEGER(IntKi), PARAMETER :: B1ADOF98Wvs = 5954 + INTEGER(IntKi), PARAMETER :: B1ADOF99Wvs = 5955 + INTEGER(IntKi), PARAMETER :: B2ADOF1Wvs = 5956 + INTEGER(IntKi), PARAMETER :: B2ADOF2Wvs = 5957 + INTEGER(IntKi), PARAMETER :: B2ADOF3Wvs = 5958 + INTEGER(IntKi), PARAMETER :: B2ADOF4Wvs = 5959 + INTEGER(IntKi), PARAMETER :: B2ADOF5Wvs = 5960 + INTEGER(IntKi), PARAMETER :: B2ADOF6Wvs = 5961 + INTEGER(IntKi), PARAMETER :: B2ADOF7Wvs = 5962 + INTEGER(IntKi), PARAMETER :: B2ADOF8Wvs = 5963 + INTEGER(IntKi), PARAMETER :: B2ADOF9Wvs = 5964 + INTEGER(IntKi), PARAMETER :: B2ADOF10Wvs = 5965 + INTEGER(IntKi), PARAMETER :: B2ADOF11Wvs = 5966 + INTEGER(IntKi), PARAMETER :: B2ADOF12Wvs = 5967 + INTEGER(IntKi), PARAMETER :: B2ADOF13Wvs = 5968 + INTEGER(IntKi), PARAMETER :: B2ADOF14Wvs = 5969 + INTEGER(IntKi), PARAMETER :: B2ADOF15Wvs = 5970 + INTEGER(IntKi), PARAMETER :: B2ADOF16Wvs = 5971 + INTEGER(IntKi), PARAMETER :: B2ADOF17Wvs = 5972 + INTEGER(IntKi), PARAMETER :: B2ADOF18Wvs = 5973 + INTEGER(IntKi), PARAMETER :: B2ADOF19Wvs = 5974 + INTEGER(IntKi), PARAMETER :: B2ADOF20Wvs = 5975 + INTEGER(IntKi), PARAMETER :: B2ADOF21Wvs = 5976 + INTEGER(IntKi), PARAMETER :: B2ADOF22Wvs = 5977 + INTEGER(IntKi), PARAMETER :: B2ADOF23Wvs = 5978 + INTEGER(IntKi), PARAMETER :: B2ADOF24Wvs = 5979 + INTEGER(IntKi), PARAMETER :: B2ADOF25Wvs = 5980 + INTEGER(IntKi), PARAMETER :: B2ADOF26Wvs = 5981 + INTEGER(IntKi), PARAMETER :: B2ADOF27Wvs = 5982 + INTEGER(IntKi), PARAMETER :: B2ADOF28Wvs = 5983 + INTEGER(IntKi), PARAMETER :: B2ADOF29Wvs = 5984 + INTEGER(IntKi), PARAMETER :: B2ADOF30Wvs = 5985 + INTEGER(IntKi), PARAMETER :: B2ADOF31Wvs = 5986 + INTEGER(IntKi), PARAMETER :: B2ADOF32Wvs = 5987 + INTEGER(IntKi), PARAMETER :: B2ADOF33Wvs = 5988 + INTEGER(IntKi), PARAMETER :: B2ADOF34Wvs = 5989 + INTEGER(IntKi), PARAMETER :: B2ADOF35Wvs = 5990 + INTEGER(IntKi), PARAMETER :: B2ADOF36Wvs = 5991 + INTEGER(IntKi), PARAMETER :: B2ADOF37Wvs = 5992 + INTEGER(IntKi), PARAMETER :: B2ADOF38Wvs = 5993 + INTEGER(IntKi), PARAMETER :: B2ADOF39Wvs = 5994 + INTEGER(IntKi), PARAMETER :: B2ADOF40Wvs = 5995 + INTEGER(IntKi), PARAMETER :: B2ADOF41Wvs = 5996 + INTEGER(IntKi), PARAMETER :: B2ADOF42Wvs = 5997 + INTEGER(IntKi), PARAMETER :: B2ADOF43Wvs = 5998 + INTEGER(IntKi), PARAMETER :: B2ADOF44Wvs = 5999 + INTEGER(IntKi), PARAMETER :: B2ADOF45Wvs = 6000 + INTEGER(IntKi), PARAMETER :: B2ADOF46Wvs = 6001 + INTEGER(IntKi), PARAMETER :: B2ADOF47Wvs = 6002 + INTEGER(IntKi), PARAMETER :: B2ADOF48Wvs = 6003 + INTEGER(IntKi), PARAMETER :: B2ADOF49Wvs = 6004 + INTEGER(IntKi), PARAMETER :: B2ADOF50Wvs = 6005 + INTEGER(IntKi), PARAMETER :: B2ADOF51Wvs = 6006 + INTEGER(IntKi), PARAMETER :: B2ADOF52Wvs = 6007 + INTEGER(IntKi), PARAMETER :: B2ADOF53Wvs = 6008 + INTEGER(IntKi), PARAMETER :: B2ADOF54Wvs = 6009 + INTEGER(IntKi), PARAMETER :: B2ADOF55Wvs = 6010 + INTEGER(IntKi), PARAMETER :: B2ADOF56Wvs = 6011 + INTEGER(IntKi), PARAMETER :: B2ADOF57Wvs = 6012 + INTEGER(IntKi), PARAMETER :: B2ADOF58Wvs = 6013 + INTEGER(IntKi), PARAMETER :: B2ADOF59Wvs = 6014 + INTEGER(IntKi), PARAMETER :: B2ADOF60Wvs = 6015 + INTEGER(IntKi), PARAMETER :: B2ADOF61Wvs = 6016 + INTEGER(IntKi), PARAMETER :: B2ADOF62Wvs = 6017 + INTEGER(IntKi), PARAMETER :: B2ADOF63Wvs = 6018 + INTEGER(IntKi), PARAMETER :: B2ADOF64Wvs = 6019 + INTEGER(IntKi), PARAMETER :: B2ADOF65Wvs = 6020 + INTEGER(IntKi), PARAMETER :: B2ADOF66Wvs = 6021 + INTEGER(IntKi), PARAMETER :: B2ADOF67Wvs = 6022 + INTEGER(IntKi), PARAMETER :: B2ADOF68Wvs = 6023 + INTEGER(IntKi), PARAMETER :: B2ADOF69Wvs = 6024 + INTEGER(IntKi), PARAMETER :: B2ADOF70Wvs = 6025 + INTEGER(IntKi), PARAMETER :: B2ADOF71Wvs = 6026 + INTEGER(IntKi), PARAMETER :: B2ADOF72Wvs = 6027 + INTEGER(IntKi), PARAMETER :: B2ADOF73Wvs = 6028 + INTEGER(IntKi), PARAMETER :: B2ADOF74Wvs = 6029 + INTEGER(IntKi), PARAMETER :: B2ADOF75Wvs = 6030 + INTEGER(IntKi), PARAMETER :: B2ADOF76Wvs = 6031 + INTEGER(IntKi), PARAMETER :: B2ADOF77Wvs = 6032 + INTEGER(IntKi), PARAMETER :: B2ADOF78Wvs = 6033 + INTEGER(IntKi), PARAMETER :: B2ADOF79Wvs = 6034 + INTEGER(IntKi), PARAMETER :: B2ADOF80Wvs = 6035 + INTEGER(IntKi), PARAMETER :: B2ADOF81Wvs = 6036 + INTEGER(IntKi), PARAMETER :: B2ADOF82Wvs = 6037 + INTEGER(IntKi), PARAMETER :: B2ADOF83Wvs = 6038 + INTEGER(IntKi), PARAMETER :: B2ADOF84Wvs = 6039 + INTEGER(IntKi), PARAMETER :: B2ADOF85Wvs = 6040 + INTEGER(IntKi), PARAMETER :: B2ADOF86Wvs = 6041 + INTEGER(IntKi), PARAMETER :: B2ADOF87Wvs = 6042 + INTEGER(IntKi), PARAMETER :: B2ADOF88Wvs = 6043 + INTEGER(IntKi), PARAMETER :: B2ADOF89Wvs = 6044 + INTEGER(IntKi), PARAMETER :: B2ADOF90Wvs = 6045 + INTEGER(IntKi), PARAMETER :: B2ADOF91Wvs = 6046 + INTEGER(IntKi), PARAMETER :: B2ADOF92Wvs = 6047 + INTEGER(IntKi), PARAMETER :: B2ADOF93Wvs = 6048 + INTEGER(IntKi), PARAMETER :: B2ADOF94Wvs = 6049 + INTEGER(IntKi), PARAMETER :: B2ADOF95Wvs = 6050 + INTEGER(IntKi), PARAMETER :: B2ADOF96Wvs = 6051 + INTEGER(IntKi), PARAMETER :: B2ADOF97Wvs = 6052 + INTEGER(IntKi), PARAMETER :: B2ADOF98Wvs = 6053 + INTEGER(IntKi), PARAMETER :: B2ADOF99Wvs = 6054 + INTEGER(IntKi), PARAMETER :: B3ADOF1Wvs = 6055 + INTEGER(IntKi), PARAMETER :: B3ADOF2Wvs = 6056 + INTEGER(IntKi), PARAMETER :: B3ADOF3Wvs = 6057 + INTEGER(IntKi), PARAMETER :: B3ADOF4Wvs = 6058 + INTEGER(IntKi), PARAMETER :: B3ADOF5Wvs = 6059 + INTEGER(IntKi), PARAMETER :: B3ADOF6Wvs = 6060 + INTEGER(IntKi), PARAMETER :: B3ADOF7Wvs = 6061 + INTEGER(IntKi), PARAMETER :: B3ADOF8Wvs = 6062 + INTEGER(IntKi), PARAMETER :: B3ADOF9Wvs = 6063 + INTEGER(IntKi), PARAMETER :: B3ADOF10Wvs = 6064 + INTEGER(IntKi), PARAMETER :: B3ADOF11Wvs = 6065 + INTEGER(IntKi), PARAMETER :: B3ADOF12Wvs = 6066 + INTEGER(IntKi), PARAMETER :: B3ADOF13Wvs = 6067 + INTEGER(IntKi), PARAMETER :: B3ADOF14Wvs = 6068 + INTEGER(IntKi), PARAMETER :: B3ADOF15Wvs = 6069 + INTEGER(IntKi), PARAMETER :: B3ADOF16Wvs = 6070 + INTEGER(IntKi), PARAMETER :: B3ADOF17Wvs = 6071 + INTEGER(IntKi), PARAMETER :: B3ADOF18Wvs = 6072 + INTEGER(IntKi), PARAMETER :: B3ADOF19Wvs = 6073 + INTEGER(IntKi), PARAMETER :: B3ADOF20Wvs = 6074 + INTEGER(IntKi), PARAMETER :: B3ADOF21Wvs = 6075 + INTEGER(IntKi), PARAMETER :: B3ADOF22Wvs = 6076 + INTEGER(IntKi), PARAMETER :: B3ADOF23Wvs = 6077 + INTEGER(IntKi), PARAMETER :: B3ADOF24Wvs = 6078 + INTEGER(IntKi), PARAMETER :: B3ADOF25Wvs = 6079 + INTEGER(IntKi), PARAMETER :: B3ADOF26Wvs = 6080 + INTEGER(IntKi), PARAMETER :: B3ADOF27Wvs = 6081 + INTEGER(IntKi), PARAMETER :: B3ADOF28Wvs = 6082 + INTEGER(IntKi), PARAMETER :: B3ADOF29Wvs = 6083 + INTEGER(IntKi), PARAMETER :: B3ADOF30Wvs = 6084 + INTEGER(IntKi), PARAMETER :: B3ADOF31Wvs = 6085 + INTEGER(IntKi), PARAMETER :: B3ADOF32Wvs = 6086 + INTEGER(IntKi), PARAMETER :: B3ADOF33Wvs = 6087 + INTEGER(IntKi), PARAMETER :: B3ADOF34Wvs = 6088 + INTEGER(IntKi), PARAMETER :: B3ADOF35Wvs = 6089 + INTEGER(IntKi), PARAMETER :: B3ADOF36Wvs = 6090 + INTEGER(IntKi), PARAMETER :: B3ADOF37Wvs = 6091 + INTEGER(IntKi), PARAMETER :: B3ADOF38Wvs = 6092 + INTEGER(IntKi), PARAMETER :: B3ADOF39Wvs = 6093 + INTEGER(IntKi), PARAMETER :: B3ADOF40Wvs = 6094 + INTEGER(IntKi), PARAMETER :: B3ADOF41Wvs = 6095 + INTEGER(IntKi), PARAMETER :: B3ADOF42Wvs = 6096 + INTEGER(IntKi), PARAMETER :: B3ADOF43Wvs = 6097 + INTEGER(IntKi), PARAMETER :: B3ADOF44Wvs = 6098 + INTEGER(IntKi), PARAMETER :: B3ADOF45Wvs = 6099 + INTEGER(IntKi), PARAMETER :: B3ADOF46Wvs = 6100 + INTEGER(IntKi), PARAMETER :: B3ADOF47Wvs = 6101 + INTEGER(IntKi), PARAMETER :: B3ADOF48Wvs = 6102 + INTEGER(IntKi), PARAMETER :: B3ADOF49Wvs = 6103 + INTEGER(IntKi), PARAMETER :: B3ADOF50Wvs = 6104 + INTEGER(IntKi), PARAMETER :: B3ADOF51Wvs = 6105 + INTEGER(IntKi), PARAMETER :: B3ADOF52Wvs = 6106 + INTEGER(IntKi), PARAMETER :: B3ADOF53Wvs = 6107 + INTEGER(IntKi), PARAMETER :: B3ADOF54Wvs = 6108 + INTEGER(IntKi), PARAMETER :: B3ADOF55Wvs = 6109 + INTEGER(IntKi), PARAMETER :: B3ADOF56Wvs = 6110 + INTEGER(IntKi), PARAMETER :: B3ADOF57Wvs = 6111 + INTEGER(IntKi), PARAMETER :: B3ADOF58Wvs = 6112 + INTEGER(IntKi), PARAMETER :: B3ADOF59Wvs = 6113 + INTEGER(IntKi), PARAMETER :: B3ADOF60Wvs = 6114 + INTEGER(IntKi), PARAMETER :: B3ADOF61Wvs = 6115 + INTEGER(IntKi), PARAMETER :: B3ADOF62Wvs = 6116 + INTEGER(IntKi), PARAMETER :: B3ADOF63Wvs = 6117 + INTEGER(IntKi), PARAMETER :: B3ADOF64Wvs = 6118 + INTEGER(IntKi), PARAMETER :: B3ADOF65Wvs = 6119 + INTEGER(IntKi), PARAMETER :: B3ADOF66Wvs = 6120 + INTEGER(IntKi), PARAMETER :: B3ADOF67Wvs = 6121 + INTEGER(IntKi), PARAMETER :: B3ADOF68Wvs = 6122 + INTEGER(IntKi), PARAMETER :: B3ADOF69Wvs = 6123 + INTEGER(IntKi), PARAMETER :: B3ADOF70Wvs = 6124 + INTEGER(IntKi), PARAMETER :: B3ADOF71Wvs = 6125 + INTEGER(IntKi), PARAMETER :: B3ADOF72Wvs = 6126 + INTEGER(IntKi), PARAMETER :: B3ADOF73Wvs = 6127 + INTEGER(IntKi), PARAMETER :: B3ADOF74Wvs = 6128 + INTEGER(IntKi), PARAMETER :: B3ADOF75Wvs = 6129 + INTEGER(IntKi), PARAMETER :: B3ADOF76Wvs = 6130 + INTEGER(IntKi), PARAMETER :: B3ADOF77Wvs = 6131 + INTEGER(IntKi), PARAMETER :: B3ADOF78Wvs = 6132 + INTEGER(IntKi), PARAMETER :: B3ADOF79Wvs = 6133 + INTEGER(IntKi), PARAMETER :: B3ADOF80Wvs = 6134 + INTEGER(IntKi), PARAMETER :: B3ADOF81Wvs = 6135 + INTEGER(IntKi), PARAMETER :: B3ADOF82Wvs = 6136 + INTEGER(IntKi), PARAMETER :: B3ADOF83Wvs = 6137 + INTEGER(IntKi), PARAMETER :: B3ADOF84Wvs = 6138 + INTEGER(IntKi), PARAMETER :: B3ADOF85Wvs = 6139 + INTEGER(IntKi), PARAMETER :: B3ADOF86Wvs = 6140 + INTEGER(IntKi), PARAMETER :: B3ADOF87Wvs = 6141 + INTEGER(IntKi), PARAMETER :: B3ADOF88Wvs = 6142 + INTEGER(IntKi), PARAMETER :: B3ADOF89Wvs = 6143 + INTEGER(IntKi), PARAMETER :: B3ADOF90Wvs = 6144 + INTEGER(IntKi), PARAMETER :: B3ADOF91Wvs = 6145 + INTEGER(IntKi), PARAMETER :: B3ADOF92Wvs = 6146 + INTEGER(IntKi), PARAMETER :: B3ADOF93Wvs = 6147 + INTEGER(IntKi), PARAMETER :: B3ADOF94Wvs = 6148 + INTEGER(IntKi), PARAMETER :: B3ADOF95Wvs = 6149 + INTEGER(IntKi), PARAMETER :: B3ADOF96Wvs = 6150 + INTEGER(IntKi), PARAMETER :: B3ADOF97Wvs = 6151 + INTEGER(IntKi), PARAMETER :: B3ADOF98Wvs = 6152 + INTEGER(IntKi), PARAMETER :: B3ADOF99Wvs = 6153 + INTEGER(IntKi), PARAMETER :: B4ADOF1Wvs = 6154 + INTEGER(IntKi), PARAMETER :: B4ADOF2Wvs = 6155 + INTEGER(IntKi), PARAMETER :: B4ADOF3Wvs = 6156 + INTEGER(IntKi), PARAMETER :: B4ADOF4Wvs = 6157 + INTEGER(IntKi), PARAMETER :: B4ADOF5Wvs = 6158 + INTEGER(IntKi), PARAMETER :: B4ADOF6Wvs = 6159 + INTEGER(IntKi), PARAMETER :: B4ADOF7Wvs = 6160 + INTEGER(IntKi), PARAMETER :: B4ADOF8Wvs = 6161 + INTEGER(IntKi), PARAMETER :: B4ADOF9Wvs = 6162 + INTEGER(IntKi), PARAMETER :: B4ADOF10Wvs = 6163 + INTEGER(IntKi), PARAMETER :: B4ADOF11Wvs = 6164 + INTEGER(IntKi), PARAMETER :: B4ADOF12Wvs = 6165 + INTEGER(IntKi), PARAMETER :: B4ADOF13Wvs = 6166 + INTEGER(IntKi), PARAMETER :: B4ADOF14Wvs = 6167 + INTEGER(IntKi), PARAMETER :: B4ADOF15Wvs = 6168 + INTEGER(IntKi), PARAMETER :: B4ADOF16Wvs = 6169 + INTEGER(IntKi), PARAMETER :: B4ADOF17Wvs = 6170 + INTEGER(IntKi), PARAMETER :: B4ADOF18Wvs = 6171 + INTEGER(IntKi), PARAMETER :: B4ADOF19Wvs = 6172 + INTEGER(IntKi), PARAMETER :: B4ADOF20Wvs = 6173 + INTEGER(IntKi), PARAMETER :: B4ADOF21Wvs = 6174 + INTEGER(IntKi), PARAMETER :: B4ADOF22Wvs = 6175 + INTEGER(IntKi), PARAMETER :: B4ADOF23Wvs = 6176 + INTEGER(IntKi), PARAMETER :: B4ADOF24Wvs = 6177 + INTEGER(IntKi), PARAMETER :: B4ADOF25Wvs = 6178 + INTEGER(IntKi), PARAMETER :: B4ADOF26Wvs = 6179 + INTEGER(IntKi), PARAMETER :: B4ADOF27Wvs = 6180 + INTEGER(IntKi), PARAMETER :: B4ADOF28Wvs = 6181 + INTEGER(IntKi), PARAMETER :: B4ADOF29Wvs = 6182 + INTEGER(IntKi), PARAMETER :: B4ADOF30Wvs = 6183 + INTEGER(IntKi), PARAMETER :: B4ADOF31Wvs = 6184 + INTEGER(IntKi), PARAMETER :: B4ADOF32Wvs = 6185 + INTEGER(IntKi), PARAMETER :: B4ADOF33Wvs = 6186 + INTEGER(IntKi), PARAMETER :: B4ADOF34Wvs = 6187 + INTEGER(IntKi), PARAMETER :: B4ADOF35Wvs = 6188 + INTEGER(IntKi), PARAMETER :: B4ADOF36Wvs = 6189 + INTEGER(IntKi), PARAMETER :: B4ADOF37Wvs = 6190 + INTEGER(IntKi), PARAMETER :: B4ADOF38Wvs = 6191 + INTEGER(IntKi), PARAMETER :: B4ADOF39Wvs = 6192 + INTEGER(IntKi), PARAMETER :: B4ADOF40Wvs = 6193 + INTEGER(IntKi), PARAMETER :: B4ADOF41Wvs = 6194 + INTEGER(IntKi), PARAMETER :: B4ADOF42Wvs = 6195 + INTEGER(IntKi), PARAMETER :: B4ADOF43Wvs = 6196 + INTEGER(IntKi), PARAMETER :: B4ADOF44Wvs = 6197 + INTEGER(IntKi), PARAMETER :: B4ADOF45Wvs = 6198 + INTEGER(IntKi), PARAMETER :: B4ADOF46Wvs = 6199 + INTEGER(IntKi), PARAMETER :: B4ADOF47Wvs = 6200 + INTEGER(IntKi), PARAMETER :: B4ADOF48Wvs = 6201 + INTEGER(IntKi), PARAMETER :: B4ADOF49Wvs = 6202 + INTEGER(IntKi), PARAMETER :: B4ADOF50Wvs = 6203 + INTEGER(IntKi), PARAMETER :: B4ADOF51Wvs = 6204 + INTEGER(IntKi), PARAMETER :: B4ADOF52Wvs = 6205 + INTEGER(IntKi), PARAMETER :: B4ADOF53Wvs = 6206 + INTEGER(IntKi), PARAMETER :: B4ADOF54Wvs = 6207 + INTEGER(IntKi), PARAMETER :: B4ADOF55Wvs = 6208 + INTEGER(IntKi), PARAMETER :: B4ADOF56Wvs = 6209 + INTEGER(IntKi), PARAMETER :: B4ADOF57Wvs = 6210 + INTEGER(IntKi), PARAMETER :: B4ADOF58Wvs = 6211 + INTEGER(IntKi), PARAMETER :: B4ADOF59Wvs = 6212 + INTEGER(IntKi), PARAMETER :: B4ADOF60Wvs = 6213 + INTEGER(IntKi), PARAMETER :: B4ADOF61Wvs = 6214 + INTEGER(IntKi), PARAMETER :: B4ADOF62Wvs = 6215 + INTEGER(IntKi), PARAMETER :: B4ADOF63Wvs = 6216 + INTEGER(IntKi), PARAMETER :: B4ADOF64Wvs = 6217 + INTEGER(IntKi), PARAMETER :: B4ADOF65Wvs = 6218 + INTEGER(IntKi), PARAMETER :: B4ADOF66Wvs = 6219 + INTEGER(IntKi), PARAMETER :: B4ADOF67Wvs = 6220 + INTEGER(IntKi), PARAMETER :: B4ADOF68Wvs = 6221 + INTEGER(IntKi), PARAMETER :: B4ADOF69Wvs = 6222 + INTEGER(IntKi), PARAMETER :: B4ADOF70Wvs = 6223 + INTEGER(IntKi), PARAMETER :: B4ADOF71Wvs = 6224 + INTEGER(IntKi), PARAMETER :: B4ADOF72Wvs = 6225 + INTEGER(IntKi), PARAMETER :: B4ADOF73Wvs = 6226 + INTEGER(IntKi), PARAMETER :: B4ADOF74Wvs = 6227 + INTEGER(IntKi), PARAMETER :: B4ADOF75Wvs = 6228 + INTEGER(IntKi), PARAMETER :: B4ADOF76Wvs = 6229 + INTEGER(IntKi), PARAMETER :: B4ADOF77Wvs = 6230 + INTEGER(IntKi), PARAMETER :: B4ADOF78Wvs = 6231 + INTEGER(IntKi), PARAMETER :: B4ADOF79Wvs = 6232 + INTEGER(IntKi), PARAMETER :: B4ADOF80Wvs = 6233 + INTEGER(IntKi), PARAMETER :: B4ADOF81Wvs = 6234 + INTEGER(IntKi), PARAMETER :: B4ADOF82Wvs = 6235 + INTEGER(IntKi), PARAMETER :: B4ADOF83Wvs = 6236 + INTEGER(IntKi), PARAMETER :: B4ADOF84Wvs = 6237 + INTEGER(IntKi), PARAMETER :: B4ADOF85Wvs = 6238 + INTEGER(IntKi), PARAMETER :: B4ADOF86Wvs = 6239 + INTEGER(IntKi), PARAMETER :: B4ADOF87Wvs = 6240 + INTEGER(IntKi), PARAMETER :: B4ADOF88Wvs = 6241 + INTEGER(IntKi), PARAMETER :: B4ADOF89Wvs = 6242 + INTEGER(IntKi), PARAMETER :: B4ADOF90Wvs = 6243 + INTEGER(IntKi), PARAMETER :: B4ADOF91Wvs = 6244 + INTEGER(IntKi), PARAMETER :: B4ADOF92Wvs = 6245 + INTEGER(IntKi), PARAMETER :: B4ADOF93Wvs = 6246 + INTEGER(IntKi), PARAMETER :: B4ADOF94Wvs = 6247 + INTEGER(IntKi), PARAMETER :: B4ADOF95Wvs = 6248 + INTEGER(IntKi), PARAMETER :: B4ADOF96Wvs = 6249 + INTEGER(IntKi), PARAMETER :: B4ADOF97Wvs = 6250 + INTEGER(IntKi), PARAMETER :: B4ADOF98Wvs = 6251 + INTEGER(IntKi), PARAMETER :: B4ADOF99Wvs = 6252 + INTEGER(IntKi), PARAMETER :: B5ADOF1Wvs = 6253 + INTEGER(IntKi), PARAMETER :: B5ADOF2Wvs = 6254 + INTEGER(IntKi), PARAMETER :: B5ADOF3Wvs = 6255 + INTEGER(IntKi), PARAMETER :: B5ADOF4Wvs = 6256 + INTEGER(IntKi), PARAMETER :: B5ADOF5Wvs = 6257 + INTEGER(IntKi), PARAMETER :: B5ADOF6Wvs = 6258 + INTEGER(IntKi), PARAMETER :: B5ADOF7Wvs = 6259 + INTEGER(IntKi), PARAMETER :: B5ADOF8Wvs = 6260 + INTEGER(IntKi), PARAMETER :: B5ADOF9Wvs = 6261 + INTEGER(IntKi), PARAMETER :: B5ADOF10Wvs = 6262 + INTEGER(IntKi), PARAMETER :: B5ADOF11Wvs = 6263 + INTEGER(IntKi), PARAMETER :: B5ADOF12Wvs = 6264 + INTEGER(IntKi), PARAMETER :: B5ADOF13Wvs = 6265 + INTEGER(IntKi), PARAMETER :: B5ADOF14Wvs = 6266 + INTEGER(IntKi), PARAMETER :: B5ADOF15Wvs = 6267 + INTEGER(IntKi), PARAMETER :: B5ADOF16Wvs = 6268 + INTEGER(IntKi), PARAMETER :: B5ADOF17Wvs = 6269 + INTEGER(IntKi), PARAMETER :: B5ADOF18Wvs = 6270 + INTEGER(IntKi), PARAMETER :: B5ADOF19Wvs = 6271 + INTEGER(IntKi), PARAMETER :: B5ADOF20Wvs = 6272 + INTEGER(IntKi), PARAMETER :: B5ADOF21Wvs = 6273 + INTEGER(IntKi), PARAMETER :: B5ADOF22Wvs = 6274 + INTEGER(IntKi), PARAMETER :: B5ADOF23Wvs = 6275 + INTEGER(IntKi), PARAMETER :: B5ADOF24Wvs = 6276 + INTEGER(IntKi), PARAMETER :: B5ADOF25Wvs = 6277 + INTEGER(IntKi), PARAMETER :: B5ADOF26Wvs = 6278 + INTEGER(IntKi), PARAMETER :: B5ADOF27Wvs = 6279 + INTEGER(IntKi), PARAMETER :: B5ADOF28Wvs = 6280 + INTEGER(IntKi), PARAMETER :: B5ADOF29Wvs = 6281 + INTEGER(IntKi), PARAMETER :: B5ADOF30Wvs = 6282 + INTEGER(IntKi), PARAMETER :: B5ADOF31Wvs = 6283 + INTEGER(IntKi), PARAMETER :: B5ADOF32Wvs = 6284 + INTEGER(IntKi), PARAMETER :: B5ADOF33Wvs = 6285 + INTEGER(IntKi), PARAMETER :: B5ADOF34Wvs = 6286 + INTEGER(IntKi), PARAMETER :: B5ADOF35Wvs = 6287 + INTEGER(IntKi), PARAMETER :: B5ADOF36Wvs = 6288 + INTEGER(IntKi), PARAMETER :: B5ADOF37Wvs = 6289 + INTEGER(IntKi), PARAMETER :: B5ADOF38Wvs = 6290 + INTEGER(IntKi), PARAMETER :: B5ADOF39Wvs = 6291 + INTEGER(IntKi), PARAMETER :: B5ADOF40Wvs = 6292 + INTEGER(IntKi), PARAMETER :: B5ADOF41Wvs = 6293 + INTEGER(IntKi), PARAMETER :: B5ADOF42Wvs = 6294 + INTEGER(IntKi), PARAMETER :: B5ADOF43Wvs = 6295 + INTEGER(IntKi), PARAMETER :: B5ADOF44Wvs = 6296 + INTEGER(IntKi), PARAMETER :: B5ADOF45Wvs = 6297 + INTEGER(IntKi), PARAMETER :: B5ADOF46Wvs = 6298 + INTEGER(IntKi), PARAMETER :: B5ADOF47Wvs = 6299 + INTEGER(IntKi), PARAMETER :: B5ADOF48Wvs = 6300 + INTEGER(IntKi), PARAMETER :: B5ADOF49Wvs = 6301 + INTEGER(IntKi), PARAMETER :: B5ADOF50Wvs = 6302 + INTEGER(IntKi), PARAMETER :: B5ADOF51Wvs = 6303 + INTEGER(IntKi), PARAMETER :: B5ADOF52Wvs = 6304 + INTEGER(IntKi), PARAMETER :: B5ADOF53Wvs = 6305 + INTEGER(IntKi), PARAMETER :: B5ADOF54Wvs = 6306 + INTEGER(IntKi), PARAMETER :: B5ADOF55Wvs = 6307 + INTEGER(IntKi), PARAMETER :: B5ADOF56Wvs = 6308 + INTEGER(IntKi), PARAMETER :: B5ADOF57Wvs = 6309 + INTEGER(IntKi), PARAMETER :: B5ADOF58Wvs = 6310 + INTEGER(IntKi), PARAMETER :: B5ADOF59Wvs = 6311 + INTEGER(IntKi), PARAMETER :: B5ADOF60Wvs = 6312 + INTEGER(IntKi), PARAMETER :: B5ADOF61Wvs = 6313 + INTEGER(IntKi), PARAMETER :: B5ADOF62Wvs = 6314 + INTEGER(IntKi), PARAMETER :: B5ADOF63Wvs = 6315 + INTEGER(IntKi), PARAMETER :: B5ADOF64Wvs = 6316 + INTEGER(IntKi), PARAMETER :: B5ADOF65Wvs = 6317 + INTEGER(IntKi), PARAMETER :: B5ADOF66Wvs = 6318 + INTEGER(IntKi), PARAMETER :: B5ADOF67Wvs = 6319 + INTEGER(IntKi), PARAMETER :: B5ADOF68Wvs = 6320 + INTEGER(IntKi), PARAMETER :: B5ADOF69Wvs = 6321 + INTEGER(IntKi), PARAMETER :: B5ADOF70Wvs = 6322 + INTEGER(IntKi), PARAMETER :: B5ADOF71Wvs = 6323 + INTEGER(IntKi), PARAMETER :: B5ADOF72Wvs = 6324 + INTEGER(IntKi), PARAMETER :: B5ADOF73Wvs = 6325 + INTEGER(IntKi), PARAMETER :: B5ADOF74Wvs = 6326 + INTEGER(IntKi), PARAMETER :: B5ADOF75Wvs = 6327 + INTEGER(IntKi), PARAMETER :: B5ADOF76Wvs = 6328 + INTEGER(IntKi), PARAMETER :: B5ADOF77Wvs = 6329 + INTEGER(IntKi), PARAMETER :: B5ADOF78Wvs = 6330 + INTEGER(IntKi), PARAMETER :: B5ADOF79Wvs = 6331 + INTEGER(IntKi), PARAMETER :: B5ADOF80Wvs = 6332 + INTEGER(IntKi), PARAMETER :: B5ADOF81Wvs = 6333 + INTEGER(IntKi), PARAMETER :: B5ADOF82Wvs = 6334 + INTEGER(IntKi), PARAMETER :: B5ADOF83Wvs = 6335 + INTEGER(IntKi), PARAMETER :: B5ADOF84Wvs = 6336 + INTEGER(IntKi), PARAMETER :: B5ADOF85Wvs = 6337 + INTEGER(IntKi), PARAMETER :: B5ADOF86Wvs = 6338 + INTEGER(IntKi), PARAMETER :: B5ADOF87Wvs = 6339 + INTEGER(IntKi), PARAMETER :: B5ADOF88Wvs = 6340 + INTEGER(IntKi), PARAMETER :: B5ADOF89Wvs = 6341 + INTEGER(IntKi), PARAMETER :: B5ADOF90Wvs = 6342 + INTEGER(IntKi), PARAMETER :: B5ADOF91Wvs = 6343 + INTEGER(IntKi), PARAMETER :: B5ADOF92Wvs = 6344 + INTEGER(IntKi), PARAMETER :: B5ADOF93Wvs = 6345 + INTEGER(IntKi), PARAMETER :: B5ADOF94Wvs = 6346 + INTEGER(IntKi), PARAMETER :: B5ADOF95Wvs = 6347 + INTEGER(IntKi), PARAMETER :: B5ADOF96Wvs = 6348 + INTEGER(IntKi), PARAMETER :: B5ADOF97Wvs = 6349 + INTEGER(IntKi), PARAMETER :: B5ADOF98Wvs = 6350 + INTEGER(IntKi), PARAMETER :: B5ADOF99Wvs = 6351 + INTEGER(IntKi), PARAMETER :: B6ADOF1Wvs = 6352 + INTEGER(IntKi), PARAMETER :: B6ADOF2Wvs = 6353 + INTEGER(IntKi), PARAMETER :: B6ADOF3Wvs = 6354 + INTEGER(IntKi), PARAMETER :: B6ADOF4Wvs = 6355 + INTEGER(IntKi), PARAMETER :: B6ADOF5Wvs = 6356 + INTEGER(IntKi), PARAMETER :: B6ADOF6Wvs = 6357 + INTEGER(IntKi), PARAMETER :: B6ADOF7Wvs = 6358 + INTEGER(IntKi), PARAMETER :: B6ADOF8Wvs = 6359 + INTEGER(IntKi), PARAMETER :: B6ADOF9Wvs = 6360 + INTEGER(IntKi), PARAMETER :: B6ADOF10Wvs = 6361 + INTEGER(IntKi), PARAMETER :: B6ADOF11Wvs = 6362 + INTEGER(IntKi), PARAMETER :: B6ADOF12Wvs = 6363 + INTEGER(IntKi), PARAMETER :: B6ADOF13Wvs = 6364 + INTEGER(IntKi), PARAMETER :: B6ADOF14Wvs = 6365 + INTEGER(IntKi), PARAMETER :: B6ADOF15Wvs = 6366 + INTEGER(IntKi), PARAMETER :: B6ADOF16Wvs = 6367 + INTEGER(IntKi), PARAMETER :: B6ADOF17Wvs = 6368 + INTEGER(IntKi), PARAMETER :: B6ADOF18Wvs = 6369 + INTEGER(IntKi), PARAMETER :: B6ADOF19Wvs = 6370 + INTEGER(IntKi), PARAMETER :: B6ADOF20Wvs = 6371 + INTEGER(IntKi), PARAMETER :: B6ADOF21Wvs = 6372 + INTEGER(IntKi), PARAMETER :: B6ADOF22Wvs = 6373 + INTEGER(IntKi), PARAMETER :: B6ADOF23Wvs = 6374 + INTEGER(IntKi), PARAMETER :: B6ADOF24Wvs = 6375 + INTEGER(IntKi), PARAMETER :: B6ADOF25Wvs = 6376 + INTEGER(IntKi), PARAMETER :: B6ADOF26Wvs = 6377 + INTEGER(IntKi), PARAMETER :: B6ADOF27Wvs = 6378 + INTEGER(IntKi), PARAMETER :: B6ADOF28Wvs = 6379 + INTEGER(IntKi), PARAMETER :: B6ADOF29Wvs = 6380 + INTEGER(IntKi), PARAMETER :: B6ADOF30Wvs = 6381 + INTEGER(IntKi), PARAMETER :: B6ADOF31Wvs = 6382 + INTEGER(IntKi), PARAMETER :: B6ADOF32Wvs = 6383 + INTEGER(IntKi), PARAMETER :: B6ADOF33Wvs = 6384 + INTEGER(IntKi), PARAMETER :: B6ADOF34Wvs = 6385 + INTEGER(IntKi), PARAMETER :: B6ADOF35Wvs = 6386 + INTEGER(IntKi), PARAMETER :: B6ADOF36Wvs = 6387 + INTEGER(IntKi), PARAMETER :: B6ADOF37Wvs = 6388 + INTEGER(IntKi), PARAMETER :: B6ADOF38Wvs = 6389 + INTEGER(IntKi), PARAMETER :: B6ADOF39Wvs = 6390 + INTEGER(IntKi), PARAMETER :: B6ADOF40Wvs = 6391 + INTEGER(IntKi), PARAMETER :: B6ADOF41Wvs = 6392 + INTEGER(IntKi), PARAMETER :: B6ADOF42Wvs = 6393 + INTEGER(IntKi), PARAMETER :: B6ADOF43Wvs = 6394 + INTEGER(IntKi), PARAMETER :: B6ADOF44Wvs = 6395 + INTEGER(IntKi), PARAMETER :: B6ADOF45Wvs = 6396 + INTEGER(IntKi), PARAMETER :: B6ADOF46Wvs = 6397 + INTEGER(IntKi), PARAMETER :: B6ADOF47Wvs = 6398 + INTEGER(IntKi), PARAMETER :: B6ADOF48Wvs = 6399 + INTEGER(IntKi), PARAMETER :: B6ADOF49Wvs = 6400 + INTEGER(IntKi), PARAMETER :: B6ADOF50Wvs = 6401 + INTEGER(IntKi), PARAMETER :: B6ADOF51Wvs = 6402 + INTEGER(IntKi), PARAMETER :: B6ADOF52Wvs = 6403 + INTEGER(IntKi), PARAMETER :: B6ADOF53Wvs = 6404 + INTEGER(IntKi), PARAMETER :: B6ADOF54Wvs = 6405 + INTEGER(IntKi), PARAMETER :: B6ADOF55Wvs = 6406 + INTEGER(IntKi), PARAMETER :: B6ADOF56Wvs = 6407 + INTEGER(IntKi), PARAMETER :: B6ADOF57Wvs = 6408 + INTEGER(IntKi), PARAMETER :: B6ADOF58Wvs = 6409 + INTEGER(IntKi), PARAMETER :: B6ADOF59Wvs = 6410 + INTEGER(IntKi), PARAMETER :: B6ADOF60Wvs = 6411 + INTEGER(IntKi), PARAMETER :: B6ADOF61Wvs = 6412 + INTEGER(IntKi), PARAMETER :: B6ADOF62Wvs = 6413 + INTEGER(IntKi), PARAMETER :: B6ADOF63Wvs = 6414 + INTEGER(IntKi), PARAMETER :: B6ADOF64Wvs = 6415 + INTEGER(IntKi), PARAMETER :: B6ADOF65Wvs = 6416 + INTEGER(IntKi), PARAMETER :: B6ADOF66Wvs = 6417 + INTEGER(IntKi), PARAMETER :: B6ADOF67Wvs = 6418 + INTEGER(IntKi), PARAMETER :: B6ADOF68Wvs = 6419 + INTEGER(IntKi), PARAMETER :: B6ADOF69Wvs = 6420 + INTEGER(IntKi), PARAMETER :: B6ADOF70Wvs = 6421 + INTEGER(IntKi), PARAMETER :: B6ADOF71Wvs = 6422 + INTEGER(IntKi), PARAMETER :: B6ADOF72Wvs = 6423 + INTEGER(IntKi), PARAMETER :: B6ADOF73Wvs = 6424 + INTEGER(IntKi), PARAMETER :: B6ADOF74Wvs = 6425 + INTEGER(IntKi), PARAMETER :: B6ADOF75Wvs = 6426 + INTEGER(IntKi), PARAMETER :: B6ADOF76Wvs = 6427 + INTEGER(IntKi), PARAMETER :: B6ADOF77Wvs = 6428 + INTEGER(IntKi), PARAMETER :: B6ADOF78Wvs = 6429 + INTEGER(IntKi), PARAMETER :: B6ADOF79Wvs = 6430 + INTEGER(IntKi), PARAMETER :: B6ADOF80Wvs = 6431 + INTEGER(IntKi), PARAMETER :: B6ADOF81Wvs = 6432 + INTEGER(IntKi), PARAMETER :: B6ADOF82Wvs = 6433 + INTEGER(IntKi), PARAMETER :: B6ADOF83Wvs = 6434 + INTEGER(IntKi), PARAMETER :: B6ADOF84Wvs = 6435 + INTEGER(IntKi), PARAMETER :: B6ADOF85Wvs = 6436 + INTEGER(IntKi), PARAMETER :: B6ADOF86Wvs = 6437 + INTEGER(IntKi), PARAMETER :: B6ADOF87Wvs = 6438 + INTEGER(IntKi), PARAMETER :: B6ADOF88Wvs = 6439 + INTEGER(IntKi), PARAMETER :: B6ADOF89Wvs = 6440 + INTEGER(IntKi), PARAMETER :: B6ADOF90Wvs = 6441 + INTEGER(IntKi), PARAMETER :: B6ADOF91Wvs = 6442 + INTEGER(IntKi), PARAMETER :: B6ADOF92Wvs = 6443 + INTEGER(IntKi), PARAMETER :: B6ADOF93Wvs = 6444 + INTEGER(IntKi), PARAMETER :: B6ADOF94Wvs = 6445 + INTEGER(IntKi), PARAMETER :: B6ADOF95Wvs = 6446 + INTEGER(IntKi), PARAMETER :: B6ADOF96Wvs = 6447 + INTEGER(IntKi), PARAMETER :: B6ADOF97Wvs = 6448 + INTEGER(IntKi), PARAMETER :: B6ADOF98Wvs = 6449 + INTEGER(IntKi), PARAMETER :: B6ADOF99Wvs = 6450 + INTEGER(IntKi), PARAMETER :: B7ADOF1Wvs = 6451 + INTEGER(IntKi), PARAMETER :: B7ADOF2Wvs = 6452 + INTEGER(IntKi), PARAMETER :: B7ADOF3Wvs = 6453 + INTEGER(IntKi), PARAMETER :: B7ADOF4Wvs = 6454 + INTEGER(IntKi), PARAMETER :: B7ADOF5Wvs = 6455 + INTEGER(IntKi), PARAMETER :: B7ADOF6Wvs = 6456 + INTEGER(IntKi), PARAMETER :: B7ADOF7Wvs = 6457 + INTEGER(IntKi), PARAMETER :: B7ADOF8Wvs = 6458 + INTEGER(IntKi), PARAMETER :: B7ADOF9Wvs = 6459 + INTEGER(IntKi), PARAMETER :: B7ADOF10Wvs = 6460 + INTEGER(IntKi), PARAMETER :: B7ADOF11Wvs = 6461 + INTEGER(IntKi), PARAMETER :: B7ADOF12Wvs = 6462 + INTEGER(IntKi), PARAMETER :: B7ADOF13Wvs = 6463 + INTEGER(IntKi), PARAMETER :: B7ADOF14Wvs = 6464 + INTEGER(IntKi), PARAMETER :: B7ADOF15Wvs = 6465 + INTEGER(IntKi), PARAMETER :: B7ADOF16Wvs = 6466 + INTEGER(IntKi), PARAMETER :: B7ADOF17Wvs = 6467 + INTEGER(IntKi), PARAMETER :: B7ADOF18Wvs = 6468 + INTEGER(IntKi), PARAMETER :: B7ADOF19Wvs = 6469 + INTEGER(IntKi), PARAMETER :: B7ADOF20Wvs = 6470 + INTEGER(IntKi), PARAMETER :: B7ADOF21Wvs = 6471 + INTEGER(IntKi), PARAMETER :: B7ADOF22Wvs = 6472 + INTEGER(IntKi), PARAMETER :: B7ADOF23Wvs = 6473 + INTEGER(IntKi), PARAMETER :: B7ADOF24Wvs = 6474 + INTEGER(IntKi), PARAMETER :: B7ADOF25Wvs = 6475 + INTEGER(IntKi), PARAMETER :: B7ADOF26Wvs = 6476 + INTEGER(IntKi), PARAMETER :: B7ADOF27Wvs = 6477 + INTEGER(IntKi), PARAMETER :: B7ADOF28Wvs = 6478 + INTEGER(IntKi), PARAMETER :: B7ADOF29Wvs = 6479 + INTEGER(IntKi), PARAMETER :: B7ADOF30Wvs = 6480 + INTEGER(IntKi), PARAMETER :: B7ADOF31Wvs = 6481 + INTEGER(IntKi), PARAMETER :: B7ADOF32Wvs = 6482 + INTEGER(IntKi), PARAMETER :: B7ADOF33Wvs = 6483 + INTEGER(IntKi), PARAMETER :: B7ADOF34Wvs = 6484 + INTEGER(IntKi), PARAMETER :: B7ADOF35Wvs = 6485 + INTEGER(IntKi), PARAMETER :: B7ADOF36Wvs = 6486 + INTEGER(IntKi), PARAMETER :: B7ADOF37Wvs = 6487 + INTEGER(IntKi), PARAMETER :: B7ADOF38Wvs = 6488 + INTEGER(IntKi), PARAMETER :: B7ADOF39Wvs = 6489 + INTEGER(IntKi), PARAMETER :: B7ADOF40Wvs = 6490 + INTEGER(IntKi), PARAMETER :: B7ADOF41Wvs = 6491 + INTEGER(IntKi), PARAMETER :: B7ADOF42Wvs = 6492 + INTEGER(IntKi), PARAMETER :: B7ADOF43Wvs = 6493 + INTEGER(IntKi), PARAMETER :: B7ADOF44Wvs = 6494 + INTEGER(IntKi), PARAMETER :: B7ADOF45Wvs = 6495 + INTEGER(IntKi), PARAMETER :: B7ADOF46Wvs = 6496 + INTEGER(IntKi), PARAMETER :: B7ADOF47Wvs = 6497 + INTEGER(IntKi), PARAMETER :: B7ADOF48Wvs = 6498 + INTEGER(IntKi), PARAMETER :: B7ADOF49Wvs = 6499 + INTEGER(IntKi), PARAMETER :: B7ADOF50Wvs = 6500 + INTEGER(IntKi), PARAMETER :: B7ADOF51Wvs = 6501 + INTEGER(IntKi), PARAMETER :: B7ADOF52Wvs = 6502 + INTEGER(IntKi), PARAMETER :: B7ADOF53Wvs = 6503 + INTEGER(IntKi), PARAMETER :: B7ADOF54Wvs = 6504 + INTEGER(IntKi), PARAMETER :: B7ADOF55Wvs = 6505 + INTEGER(IntKi), PARAMETER :: B7ADOF56Wvs = 6506 + INTEGER(IntKi), PARAMETER :: B7ADOF57Wvs = 6507 + INTEGER(IntKi), PARAMETER :: B7ADOF58Wvs = 6508 + INTEGER(IntKi), PARAMETER :: B7ADOF59Wvs = 6509 + INTEGER(IntKi), PARAMETER :: B7ADOF60Wvs = 6510 + INTEGER(IntKi), PARAMETER :: B7ADOF61Wvs = 6511 + INTEGER(IntKi), PARAMETER :: B7ADOF62Wvs = 6512 + INTEGER(IntKi), PARAMETER :: B7ADOF63Wvs = 6513 + INTEGER(IntKi), PARAMETER :: B7ADOF64Wvs = 6514 + INTEGER(IntKi), PARAMETER :: B7ADOF65Wvs = 6515 + INTEGER(IntKi), PARAMETER :: B7ADOF66Wvs = 6516 + INTEGER(IntKi), PARAMETER :: B7ADOF67Wvs = 6517 + INTEGER(IntKi), PARAMETER :: B7ADOF68Wvs = 6518 + INTEGER(IntKi), PARAMETER :: B7ADOF69Wvs = 6519 + INTEGER(IntKi), PARAMETER :: B7ADOF70Wvs = 6520 + INTEGER(IntKi), PARAMETER :: B7ADOF71Wvs = 6521 + INTEGER(IntKi), PARAMETER :: B7ADOF72Wvs = 6522 + INTEGER(IntKi), PARAMETER :: B7ADOF73Wvs = 6523 + INTEGER(IntKi), PARAMETER :: B7ADOF74Wvs = 6524 + INTEGER(IntKi), PARAMETER :: B7ADOF75Wvs = 6525 + INTEGER(IntKi), PARAMETER :: B7ADOF76Wvs = 6526 + INTEGER(IntKi), PARAMETER :: B7ADOF77Wvs = 6527 + INTEGER(IntKi), PARAMETER :: B7ADOF78Wvs = 6528 + INTEGER(IntKi), PARAMETER :: B7ADOF79Wvs = 6529 + INTEGER(IntKi), PARAMETER :: B7ADOF80Wvs = 6530 + INTEGER(IntKi), PARAMETER :: B7ADOF81Wvs = 6531 + INTEGER(IntKi), PARAMETER :: B7ADOF82Wvs = 6532 + INTEGER(IntKi), PARAMETER :: B7ADOF83Wvs = 6533 + INTEGER(IntKi), PARAMETER :: B7ADOF84Wvs = 6534 + INTEGER(IntKi), PARAMETER :: B7ADOF85Wvs = 6535 + INTEGER(IntKi), PARAMETER :: B7ADOF86Wvs = 6536 + INTEGER(IntKi), PARAMETER :: B7ADOF87Wvs = 6537 + INTEGER(IntKi), PARAMETER :: B7ADOF88Wvs = 6538 + INTEGER(IntKi), PARAMETER :: B7ADOF89Wvs = 6539 + INTEGER(IntKi), PARAMETER :: B7ADOF90Wvs = 6540 + INTEGER(IntKi), PARAMETER :: B7ADOF91Wvs = 6541 + INTEGER(IntKi), PARAMETER :: B7ADOF92Wvs = 6542 + INTEGER(IntKi), PARAMETER :: B7ADOF93Wvs = 6543 + INTEGER(IntKi), PARAMETER :: B7ADOF94Wvs = 6544 + INTEGER(IntKi), PARAMETER :: B7ADOF95Wvs = 6545 + INTEGER(IntKi), PARAMETER :: B7ADOF96Wvs = 6546 + INTEGER(IntKi), PARAMETER :: B7ADOF97Wvs = 6547 + INTEGER(IntKi), PARAMETER :: B7ADOF98Wvs = 6548 + INTEGER(IntKi), PARAMETER :: B7ADOF99Wvs = 6549 + INTEGER(IntKi), PARAMETER :: B8ADOF1Wvs = 6550 + INTEGER(IntKi), PARAMETER :: B8ADOF2Wvs = 6551 + INTEGER(IntKi), PARAMETER :: B8ADOF3Wvs = 6552 + INTEGER(IntKi), PARAMETER :: B8ADOF4Wvs = 6553 + INTEGER(IntKi), PARAMETER :: B8ADOF5Wvs = 6554 + INTEGER(IntKi), PARAMETER :: B8ADOF6Wvs = 6555 + INTEGER(IntKi), PARAMETER :: B8ADOF7Wvs = 6556 + INTEGER(IntKi), PARAMETER :: B8ADOF8Wvs = 6557 + INTEGER(IntKi), PARAMETER :: B8ADOF9Wvs = 6558 + INTEGER(IntKi), PARAMETER :: B8ADOF10Wvs = 6559 + INTEGER(IntKi), PARAMETER :: B8ADOF11Wvs = 6560 + INTEGER(IntKi), PARAMETER :: B8ADOF12Wvs = 6561 + INTEGER(IntKi), PARAMETER :: B8ADOF13Wvs = 6562 + INTEGER(IntKi), PARAMETER :: B8ADOF14Wvs = 6563 + INTEGER(IntKi), PARAMETER :: B8ADOF15Wvs = 6564 + INTEGER(IntKi), PARAMETER :: B8ADOF16Wvs = 6565 + INTEGER(IntKi), PARAMETER :: B8ADOF17Wvs = 6566 + INTEGER(IntKi), PARAMETER :: B8ADOF18Wvs = 6567 + INTEGER(IntKi), PARAMETER :: B8ADOF19Wvs = 6568 + INTEGER(IntKi), PARAMETER :: B8ADOF20Wvs = 6569 + INTEGER(IntKi), PARAMETER :: B8ADOF21Wvs = 6570 + INTEGER(IntKi), PARAMETER :: B8ADOF22Wvs = 6571 + INTEGER(IntKi), PARAMETER :: B8ADOF23Wvs = 6572 + INTEGER(IntKi), PARAMETER :: B8ADOF24Wvs = 6573 + INTEGER(IntKi), PARAMETER :: B8ADOF25Wvs = 6574 + INTEGER(IntKi), PARAMETER :: B8ADOF26Wvs = 6575 + INTEGER(IntKi), PARAMETER :: B8ADOF27Wvs = 6576 + INTEGER(IntKi), PARAMETER :: B8ADOF28Wvs = 6577 + INTEGER(IntKi), PARAMETER :: B8ADOF29Wvs = 6578 + INTEGER(IntKi), PARAMETER :: B8ADOF30Wvs = 6579 + INTEGER(IntKi), PARAMETER :: B8ADOF31Wvs = 6580 + INTEGER(IntKi), PARAMETER :: B8ADOF32Wvs = 6581 + INTEGER(IntKi), PARAMETER :: B8ADOF33Wvs = 6582 + INTEGER(IntKi), PARAMETER :: B8ADOF34Wvs = 6583 + INTEGER(IntKi), PARAMETER :: B8ADOF35Wvs = 6584 + INTEGER(IntKi), PARAMETER :: B8ADOF36Wvs = 6585 + INTEGER(IntKi), PARAMETER :: B8ADOF37Wvs = 6586 + INTEGER(IntKi), PARAMETER :: B8ADOF38Wvs = 6587 + INTEGER(IntKi), PARAMETER :: B8ADOF39Wvs = 6588 + INTEGER(IntKi), PARAMETER :: B8ADOF40Wvs = 6589 + INTEGER(IntKi), PARAMETER :: B8ADOF41Wvs = 6590 + INTEGER(IntKi), PARAMETER :: B8ADOF42Wvs = 6591 + INTEGER(IntKi), PARAMETER :: B8ADOF43Wvs = 6592 + INTEGER(IntKi), PARAMETER :: B8ADOF44Wvs = 6593 + INTEGER(IntKi), PARAMETER :: B8ADOF45Wvs = 6594 + INTEGER(IntKi), PARAMETER :: B8ADOF46Wvs = 6595 + INTEGER(IntKi), PARAMETER :: B8ADOF47Wvs = 6596 + INTEGER(IntKi), PARAMETER :: B8ADOF48Wvs = 6597 + INTEGER(IntKi), PARAMETER :: B8ADOF49Wvs = 6598 + INTEGER(IntKi), PARAMETER :: B8ADOF50Wvs = 6599 + INTEGER(IntKi), PARAMETER :: B8ADOF51Wvs = 6600 + INTEGER(IntKi), PARAMETER :: B8ADOF52Wvs = 6601 + INTEGER(IntKi), PARAMETER :: B8ADOF53Wvs = 6602 + INTEGER(IntKi), PARAMETER :: B8ADOF54Wvs = 6603 + INTEGER(IntKi), PARAMETER :: B8ADOF55Wvs = 6604 + INTEGER(IntKi), PARAMETER :: B8ADOF56Wvs = 6605 + INTEGER(IntKi), PARAMETER :: B8ADOF57Wvs = 6606 + INTEGER(IntKi), PARAMETER :: B8ADOF58Wvs = 6607 + INTEGER(IntKi), PARAMETER :: B8ADOF59Wvs = 6608 + INTEGER(IntKi), PARAMETER :: B8ADOF60Wvs = 6609 + INTEGER(IntKi), PARAMETER :: B8ADOF61Wvs = 6610 + INTEGER(IntKi), PARAMETER :: B8ADOF62Wvs = 6611 + INTEGER(IntKi), PARAMETER :: B8ADOF63Wvs = 6612 + INTEGER(IntKi), PARAMETER :: B8ADOF64Wvs = 6613 + INTEGER(IntKi), PARAMETER :: B8ADOF65Wvs = 6614 + INTEGER(IntKi), PARAMETER :: B8ADOF66Wvs = 6615 + INTEGER(IntKi), PARAMETER :: B8ADOF67Wvs = 6616 + INTEGER(IntKi), PARAMETER :: B8ADOF68Wvs = 6617 + INTEGER(IntKi), PARAMETER :: B8ADOF69Wvs = 6618 + INTEGER(IntKi), PARAMETER :: B8ADOF70Wvs = 6619 + INTEGER(IntKi), PARAMETER :: B8ADOF71Wvs = 6620 + INTEGER(IntKi), PARAMETER :: B8ADOF72Wvs = 6621 + INTEGER(IntKi), PARAMETER :: B8ADOF73Wvs = 6622 + INTEGER(IntKi), PARAMETER :: B8ADOF74Wvs = 6623 + INTEGER(IntKi), PARAMETER :: B8ADOF75Wvs = 6624 + INTEGER(IntKi), PARAMETER :: B8ADOF76Wvs = 6625 + INTEGER(IntKi), PARAMETER :: B8ADOF77Wvs = 6626 + INTEGER(IntKi), PARAMETER :: B8ADOF78Wvs = 6627 + INTEGER(IntKi), PARAMETER :: B8ADOF79Wvs = 6628 + INTEGER(IntKi), PARAMETER :: B8ADOF80Wvs = 6629 + INTEGER(IntKi), PARAMETER :: B8ADOF81Wvs = 6630 + INTEGER(IntKi), PARAMETER :: B8ADOF82Wvs = 6631 + INTEGER(IntKi), PARAMETER :: B8ADOF83Wvs = 6632 + INTEGER(IntKi), PARAMETER :: B8ADOF84Wvs = 6633 + INTEGER(IntKi), PARAMETER :: B8ADOF85Wvs = 6634 + INTEGER(IntKi), PARAMETER :: B8ADOF86Wvs = 6635 + INTEGER(IntKi), PARAMETER :: B8ADOF87Wvs = 6636 + INTEGER(IntKi), PARAMETER :: B8ADOF88Wvs = 6637 + INTEGER(IntKi), PARAMETER :: B8ADOF89Wvs = 6638 + INTEGER(IntKi), PARAMETER :: B8ADOF90Wvs = 6639 + INTEGER(IntKi), PARAMETER :: B8ADOF91Wvs = 6640 + INTEGER(IntKi), PARAMETER :: B8ADOF92Wvs = 6641 + INTEGER(IntKi), PARAMETER :: B8ADOF93Wvs = 6642 + INTEGER(IntKi), PARAMETER :: B8ADOF94Wvs = 6643 + INTEGER(IntKi), PARAMETER :: B8ADOF95Wvs = 6644 + INTEGER(IntKi), PARAMETER :: B8ADOF96Wvs = 6645 + INTEGER(IntKi), PARAMETER :: B8ADOF97Wvs = 6646 + INTEGER(IntKi), PARAMETER :: B8ADOF98Wvs = 6647 + INTEGER(IntKi), PARAMETER :: B8ADOF99Wvs = 6648 + INTEGER(IntKi), PARAMETER :: B9ADOF1Wvs = 6649 + INTEGER(IntKi), PARAMETER :: B9ADOF2Wvs = 6650 + INTEGER(IntKi), PARAMETER :: B9ADOF3Wvs = 6651 + INTEGER(IntKi), PARAMETER :: B9ADOF4Wvs = 6652 + INTEGER(IntKi), PARAMETER :: B9ADOF5Wvs = 6653 + INTEGER(IntKi), PARAMETER :: B9ADOF6Wvs = 6654 + INTEGER(IntKi), PARAMETER :: B9ADOF7Wvs = 6655 + INTEGER(IntKi), PARAMETER :: B9ADOF8Wvs = 6656 + INTEGER(IntKi), PARAMETER :: B9ADOF9Wvs = 6657 + INTEGER(IntKi), PARAMETER :: B9ADOF10Wvs = 6658 + INTEGER(IntKi), PARAMETER :: B9ADOF11Wvs = 6659 + INTEGER(IntKi), PARAMETER :: B9ADOF12Wvs = 6660 + INTEGER(IntKi), PARAMETER :: B9ADOF13Wvs = 6661 + INTEGER(IntKi), PARAMETER :: B9ADOF14Wvs = 6662 + INTEGER(IntKi), PARAMETER :: B9ADOF15Wvs = 6663 + INTEGER(IntKi), PARAMETER :: B9ADOF16Wvs = 6664 + INTEGER(IntKi), PARAMETER :: B9ADOF17Wvs = 6665 + INTEGER(IntKi), PARAMETER :: B9ADOF18Wvs = 6666 + INTEGER(IntKi), PARAMETER :: B9ADOF19Wvs = 6667 + INTEGER(IntKi), PARAMETER :: B9ADOF20Wvs = 6668 + INTEGER(IntKi), PARAMETER :: B9ADOF21Wvs = 6669 + INTEGER(IntKi), PARAMETER :: B9ADOF22Wvs = 6670 + INTEGER(IntKi), PARAMETER :: B9ADOF23Wvs = 6671 + INTEGER(IntKi), PARAMETER :: B9ADOF24Wvs = 6672 + INTEGER(IntKi), PARAMETER :: B9ADOF25Wvs = 6673 + INTEGER(IntKi), PARAMETER :: B9ADOF26Wvs = 6674 + INTEGER(IntKi), PARAMETER :: B9ADOF27Wvs = 6675 + INTEGER(IntKi), PARAMETER :: B9ADOF28Wvs = 6676 + INTEGER(IntKi), PARAMETER :: B9ADOF29Wvs = 6677 + INTEGER(IntKi), PARAMETER :: B9ADOF30Wvs = 6678 + INTEGER(IntKi), PARAMETER :: B9ADOF31Wvs = 6679 + INTEGER(IntKi), PARAMETER :: B9ADOF32Wvs = 6680 + INTEGER(IntKi), PARAMETER :: B9ADOF33Wvs = 6681 + INTEGER(IntKi), PARAMETER :: B9ADOF34Wvs = 6682 + INTEGER(IntKi), PARAMETER :: B9ADOF35Wvs = 6683 + INTEGER(IntKi), PARAMETER :: B9ADOF36Wvs = 6684 + INTEGER(IntKi), PARAMETER :: B9ADOF37Wvs = 6685 + INTEGER(IntKi), PARAMETER :: B9ADOF38Wvs = 6686 + INTEGER(IntKi), PARAMETER :: B9ADOF39Wvs = 6687 + INTEGER(IntKi), PARAMETER :: B9ADOF40Wvs = 6688 + INTEGER(IntKi), PARAMETER :: B9ADOF41Wvs = 6689 + INTEGER(IntKi), PARAMETER :: B9ADOF42Wvs = 6690 + INTEGER(IntKi), PARAMETER :: B9ADOF43Wvs = 6691 + INTEGER(IntKi), PARAMETER :: B9ADOF44Wvs = 6692 + INTEGER(IntKi), PARAMETER :: B9ADOF45Wvs = 6693 + INTEGER(IntKi), PARAMETER :: B9ADOF46Wvs = 6694 + INTEGER(IntKi), PARAMETER :: B9ADOF47Wvs = 6695 + INTEGER(IntKi), PARAMETER :: B9ADOF48Wvs = 6696 + INTEGER(IntKi), PARAMETER :: B9ADOF49Wvs = 6697 + INTEGER(IntKi), PARAMETER :: B9ADOF50Wvs = 6698 + INTEGER(IntKi), PARAMETER :: B9ADOF51Wvs = 6699 + INTEGER(IntKi), PARAMETER :: B9ADOF52Wvs = 6700 + INTEGER(IntKi), PARAMETER :: B9ADOF53Wvs = 6701 + INTEGER(IntKi), PARAMETER :: B9ADOF54Wvs = 6702 + INTEGER(IntKi), PARAMETER :: B9ADOF55Wvs = 6703 + INTEGER(IntKi), PARAMETER :: B9ADOF56Wvs = 6704 + INTEGER(IntKi), PARAMETER :: B9ADOF57Wvs = 6705 + INTEGER(IntKi), PARAMETER :: B9ADOF58Wvs = 6706 + INTEGER(IntKi), PARAMETER :: B9ADOF59Wvs = 6707 + INTEGER(IntKi), PARAMETER :: B9ADOF60Wvs = 6708 + INTEGER(IntKi), PARAMETER :: B9ADOF61Wvs = 6709 + INTEGER(IntKi), PARAMETER :: B9ADOF62Wvs = 6710 + INTEGER(IntKi), PARAMETER :: B9ADOF63Wvs = 6711 + INTEGER(IntKi), PARAMETER :: B9ADOF64Wvs = 6712 + INTEGER(IntKi), PARAMETER :: B9ADOF65Wvs = 6713 + INTEGER(IntKi), PARAMETER :: B9ADOF66Wvs = 6714 + INTEGER(IntKi), PARAMETER :: B9ADOF67Wvs = 6715 + INTEGER(IntKi), PARAMETER :: B9ADOF68Wvs = 6716 + INTEGER(IntKi), PARAMETER :: B9ADOF69Wvs = 6717 + INTEGER(IntKi), PARAMETER :: B9ADOF70Wvs = 6718 + INTEGER(IntKi), PARAMETER :: B9ADOF71Wvs = 6719 + INTEGER(IntKi), PARAMETER :: B9ADOF72Wvs = 6720 + INTEGER(IntKi), PARAMETER :: B9ADOF73Wvs = 6721 + INTEGER(IntKi), PARAMETER :: B9ADOF74Wvs = 6722 + INTEGER(IntKi), PARAMETER :: B9ADOF75Wvs = 6723 + INTEGER(IntKi), PARAMETER :: B9ADOF76Wvs = 6724 + INTEGER(IntKi), PARAMETER :: B9ADOF77Wvs = 6725 + INTEGER(IntKi), PARAMETER :: B9ADOF78Wvs = 6726 + INTEGER(IntKi), PARAMETER :: B9ADOF79Wvs = 6727 + INTEGER(IntKi), PARAMETER :: B9ADOF80Wvs = 6728 + INTEGER(IntKi), PARAMETER :: B9ADOF81Wvs = 6729 + INTEGER(IntKi), PARAMETER :: B9ADOF82Wvs = 6730 + INTEGER(IntKi), PARAMETER :: B9ADOF83Wvs = 6731 + INTEGER(IntKi), PARAMETER :: B9ADOF84Wvs = 6732 + INTEGER(IntKi), PARAMETER :: B9ADOF85Wvs = 6733 + INTEGER(IntKi), PARAMETER :: B9ADOF86Wvs = 6734 + INTEGER(IntKi), PARAMETER :: B9ADOF87Wvs = 6735 + INTEGER(IntKi), PARAMETER :: B9ADOF88Wvs = 6736 + INTEGER(IntKi), PARAMETER :: B9ADOF89Wvs = 6737 + INTEGER(IntKi), PARAMETER :: B9ADOF90Wvs = 6738 + INTEGER(IntKi), PARAMETER :: B9ADOF91Wvs = 6739 + INTEGER(IntKi), PARAMETER :: B9ADOF92Wvs = 6740 + INTEGER(IntKi), PARAMETER :: B9ADOF93Wvs = 6741 + INTEGER(IntKi), PARAMETER :: B9ADOF94Wvs = 6742 + INTEGER(IntKi), PARAMETER :: B9ADOF95Wvs = 6743 + INTEGER(IntKi), PARAMETER :: B9ADOF96Wvs = 6744 + INTEGER(IntKi), PARAMETER :: B9ADOF97Wvs = 6745 + INTEGER(IntKi), PARAMETER :: B9ADOF98Wvs = 6746 + INTEGER(IntKi), PARAMETER :: B9ADOF99Wvs = 6747 ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER, PUBLIC :: MaxOutPts = 510 + INTEGER(IntKi), PARAMETER, PUBLIC :: MaxOutPts = 6747 !End of code generated by Matlab script Write_ChckOutLst ! =================================================================================================== @@ -624,7 +6861,407 @@ MODULE HydroDyn_Output B1RdtMyi,B2RdtMyi,B3RdtMyi,B4RdtMyi,B5RdtMyi,B6RdtMyi,B7RdtMyi,B8RdtMyi,B9RdtMyi, & B1RdtMzi,B2RdtMzi,B3RdtMzi,B4RdtMzi,B5RdtMzi,B6RdtMzi,B7RdtMzi,B8RdtMzi,B9RdtMzi/), & (/9,6/))) - + INTEGER, PARAMETER :: FADOFAdd(99,9) = transpose(reshape((/B1ADOF1Add,B1ADOF1Add,B1ADOF1Add,B1ADOF1Add,B1ADOF1Add,B1ADOF1Add,B1ADOF1Add,B1ADOF1Add,B1ADOF1Add, & + B1ADOF2Add,B1ADOF2Add,B1ADOF2Add,B1ADOF2Add,B1ADOF2Add,B1ADOF2Add,B1ADOF2Add,B1ADOF2Add,B1ADOF2Add, & + B1ADOF3Add,B1ADOF3Add,B1ADOF3Add,B1ADOF3Add,B1ADOF3Add,B1ADOF3Add,B1ADOF3Add,B1ADOF3Add,B1ADOF3Add, & + B1ADOF4Add,B1ADOF4Add,B1ADOF4Add,B1ADOF4Add,B1ADOF4Add,B1ADOF4Add,B1ADOF4Add,B1ADOF4Add,B1ADOF4Add, & + B1ADOF5Add,B1ADOF5Add,B1ADOF5Add,B1ADOF5Add,B1ADOF5Add,B1ADOF5Add,B1ADOF5Add,B1ADOF5Add,B1ADOF5Add, & + B1ADOF6Add,B1ADOF6Add,B1ADOF6Add,B1ADOF6Add,B1ADOF6Add,B1ADOF6Add,B1ADOF6Add,B1ADOF6Add,B1ADOF6Add, & + B1ADOF7Add,B1ADOF7Add,B1ADOF7Add,B1ADOF7Add,B1ADOF7Add,B1ADOF7Add,B1ADOF7Add,B1ADOF7Add,B1ADOF7Add, & + B1ADOF8Add,B1ADOF8Add,B1ADOF8Add,B1ADOF8Add,B1ADOF8Add,B1ADOF8Add,B1ADOF8Add,B1ADOF8Add,B1ADOF8Add, & + B1ADOF9Add,B1ADOF9Add,B1ADOF9Add,B1ADOF9Add,B1ADOF9Add,B1ADOF9Add,B1ADOF9Add,B1ADOF9Add,B1ADOF9Add, & + B1ADOF10Add,B1ADOF10Add,B1ADOF10Add,B1ADOF10Add,B1ADOF10Add,B1ADOF10Add,B1ADOF10Add,B1ADOF10Add,B1ADOF10Add, & + B1ADOF11Add,B1ADOF11Add,B1ADOF11Add,B1ADOF11Add,B1ADOF11Add,B1ADOF11Add,B1ADOF11Add,B1ADOF11Add,B1ADOF11Add, & + B1ADOF12Add,B1ADOF12Add,B1ADOF12Add,B1ADOF12Add,B1ADOF12Add,B1ADOF12Add,B1ADOF12Add,B1ADOF12Add,B1ADOF12Add, & + B1ADOF13Add,B1ADOF13Add,B1ADOF13Add,B1ADOF13Add,B1ADOF13Add,B1ADOF13Add,B1ADOF13Add,B1ADOF13Add,B1ADOF13Add, & + B1ADOF14Add,B1ADOF14Add,B1ADOF14Add,B1ADOF14Add,B1ADOF14Add,B1ADOF14Add,B1ADOF14Add,B1ADOF14Add,B1ADOF14Add, & + B1ADOF15Add,B1ADOF15Add,B1ADOF15Add,B1ADOF15Add,B1ADOF15Add,B1ADOF15Add,B1ADOF15Add,B1ADOF15Add,B1ADOF15Add, & + B1ADOF16Add,B1ADOF16Add,B1ADOF16Add,B1ADOF16Add,B1ADOF16Add,B1ADOF16Add,B1ADOF16Add,B1ADOF16Add,B1ADOF16Add, & + B1ADOF17Add,B1ADOF17Add,B1ADOF17Add,B1ADOF17Add,B1ADOF17Add,B1ADOF17Add,B1ADOF17Add,B1ADOF17Add,B1ADOF17Add, & + B1ADOF18Add,B1ADOF18Add,B1ADOF18Add,B1ADOF18Add,B1ADOF18Add,B1ADOF18Add,B1ADOF18Add,B1ADOF18Add,B1ADOF18Add, & + B1ADOF19Add,B1ADOF19Add,B1ADOF19Add,B1ADOF19Add,B1ADOF19Add,B1ADOF19Add,B1ADOF19Add,B1ADOF19Add,B1ADOF19Add, & + B1ADOF20Add,B1ADOF20Add,B1ADOF20Add,B1ADOF20Add,B1ADOF20Add,B1ADOF20Add,B1ADOF20Add,B1ADOF20Add,B1ADOF20Add, & + B1ADOF21Add,B1ADOF21Add,B1ADOF21Add,B1ADOF21Add,B1ADOF21Add,B1ADOF21Add,B1ADOF21Add,B1ADOF21Add,B1ADOF21Add, & + B1ADOF22Add,B1ADOF22Add,B1ADOF22Add,B1ADOF22Add,B1ADOF22Add,B1ADOF22Add,B1ADOF22Add,B1ADOF22Add,B1ADOF22Add, & + B1ADOF23Add,B1ADOF23Add,B1ADOF23Add,B1ADOF23Add,B1ADOF23Add,B1ADOF23Add,B1ADOF23Add,B1ADOF23Add,B1ADOF23Add, & + B1ADOF24Add,B1ADOF24Add,B1ADOF24Add,B1ADOF24Add,B1ADOF24Add,B1ADOF24Add,B1ADOF24Add,B1ADOF24Add,B1ADOF24Add, & + B1ADOF25Add,B1ADOF25Add,B1ADOF25Add,B1ADOF25Add,B1ADOF25Add,B1ADOF25Add,B1ADOF25Add,B1ADOF25Add,B1ADOF25Add, & + B1ADOF26Add,B1ADOF26Add,B1ADOF26Add,B1ADOF26Add,B1ADOF26Add,B1ADOF26Add,B1ADOF26Add,B1ADOF26Add,B1ADOF26Add, & + B1ADOF27Add,B1ADOF27Add,B1ADOF27Add,B1ADOF27Add,B1ADOF27Add,B1ADOF27Add,B1ADOF27Add,B1ADOF27Add,B1ADOF27Add, & + B1ADOF28Add,B1ADOF28Add,B1ADOF28Add,B1ADOF28Add,B1ADOF28Add,B1ADOF28Add,B1ADOF28Add,B1ADOF28Add,B1ADOF28Add, & + B1ADOF29Add,B1ADOF29Add,B1ADOF29Add,B1ADOF29Add,B1ADOF29Add,B1ADOF29Add,B1ADOF29Add,B1ADOF29Add,B1ADOF29Add, & + B1ADOF30Add,B1ADOF30Add,B1ADOF30Add,B1ADOF30Add,B1ADOF30Add,B1ADOF30Add,B1ADOF30Add,B1ADOF30Add,B1ADOF30Add, & + B1ADOF31Add,B1ADOF31Add,B1ADOF31Add,B1ADOF31Add,B1ADOF31Add,B1ADOF31Add,B1ADOF31Add,B1ADOF31Add,B1ADOF31Add, & + B1ADOF32Add,B1ADOF32Add,B1ADOF32Add,B1ADOF32Add,B1ADOF32Add,B1ADOF32Add,B1ADOF32Add,B1ADOF32Add,B1ADOF32Add, & + B1ADOF33Add,B1ADOF33Add,B1ADOF33Add,B1ADOF33Add,B1ADOF33Add,B1ADOF33Add,B1ADOF33Add,B1ADOF33Add,B1ADOF33Add, & + B1ADOF34Add,B1ADOF34Add,B1ADOF34Add,B1ADOF34Add,B1ADOF34Add,B1ADOF34Add,B1ADOF34Add,B1ADOF34Add,B1ADOF34Add, & + B1ADOF35Add,B1ADOF35Add,B1ADOF35Add,B1ADOF35Add,B1ADOF35Add,B1ADOF35Add,B1ADOF35Add,B1ADOF35Add,B1ADOF35Add, & + B1ADOF36Add,B1ADOF36Add,B1ADOF36Add,B1ADOF36Add,B1ADOF36Add,B1ADOF36Add,B1ADOF36Add,B1ADOF36Add,B1ADOF36Add, & + B1ADOF37Add,B1ADOF37Add,B1ADOF37Add,B1ADOF37Add,B1ADOF37Add,B1ADOF37Add,B1ADOF37Add,B1ADOF37Add,B1ADOF37Add, & + B1ADOF38Add,B1ADOF38Add,B1ADOF38Add,B1ADOF38Add,B1ADOF38Add,B1ADOF38Add,B1ADOF38Add,B1ADOF38Add,B1ADOF38Add, & + B1ADOF39Add,B1ADOF39Add,B1ADOF39Add,B1ADOF39Add,B1ADOF39Add,B1ADOF39Add,B1ADOF39Add,B1ADOF39Add,B1ADOF39Add, & + B1ADOF40Add,B1ADOF40Add,B1ADOF40Add,B1ADOF40Add,B1ADOF40Add,B1ADOF40Add,B1ADOF40Add,B1ADOF40Add,B1ADOF40Add, & + B1ADOF41Add,B1ADOF41Add,B1ADOF41Add,B1ADOF41Add,B1ADOF41Add,B1ADOF41Add,B1ADOF41Add,B1ADOF41Add,B1ADOF41Add, & + B1ADOF42Add,B1ADOF42Add,B1ADOF42Add,B1ADOF42Add,B1ADOF42Add,B1ADOF42Add,B1ADOF42Add,B1ADOF42Add,B1ADOF42Add, & + B1ADOF43Add,B1ADOF43Add,B1ADOF43Add,B1ADOF43Add,B1ADOF43Add,B1ADOF43Add,B1ADOF43Add,B1ADOF43Add,B1ADOF43Add, & + B1ADOF44Add,B1ADOF44Add,B1ADOF44Add,B1ADOF44Add,B1ADOF44Add,B1ADOF44Add,B1ADOF44Add,B1ADOF44Add,B1ADOF44Add, & + B1ADOF45Add,B1ADOF45Add,B1ADOF45Add,B1ADOF45Add,B1ADOF45Add,B1ADOF45Add,B1ADOF45Add,B1ADOF45Add,B1ADOF45Add, & + B1ADOF46Add,B1ADOF46Add,B1ADOF46Add,B1ADOF46Add,B1ADOF46Add,B1ADOF46Add,B1ADOF46Add,B1ADOF46Add,B1ADOF46Add, & + B1ADOF47Add,B1ADOF47Add,B1ADOF47Add,B1ADOF47Add,B1ADOF47Add,B1ADOF47Add,B1ADOF47Add,B1ADOF47Add,B1ADOF47Add, & + B1ADOF48Add,B1ADOF48Add,B1ADOF48Add,B1ADOF48Add,B1ADOF48Add,B1ADOF48Add,B1ADOF48Add,B1ADOF48Add,B1ADOF48Add, & + B1ADOF49Add,B1ADOF49Add,B1ADOF49Add,B1ADOF49Add,B1ADOF49Add,B1ADOF49Add,B1ADOF49Add,B1ADOF49Add,B1ADOF49Add, & + B1ADOF50Add,B1ADOF50Add,B1ADOF50Add,B1ADOF50Add,B1ADOF50Add,B1ADOF50Add,B1ADOF50Add,B1ADOF50Add,B1ADOF50Add, & + B1ADOF51Add,B1ADOF51Add,B1ADOF51Add,B1ADOF51Add,B1ADOF51Add,B1ADOF51Add,B1ADOF51Add,B1ADOF51Add,B1ADOF51Add, & + B1ADOF52Add,B1ADOF52Add,B1ADOF52Add,B1ADOF52Add,B1ADOF52Add,B1ADOF52Add,B1ADOF52Add,B1ADOF52Add,B1ADOF52Add, & + B1ADOF53Add,B1ADOF53Add,B1ADOF53Add,B1ADOF53Add,B1ADOF53Add,B1ADOF53Add,B1ADOF53Add,B1ADOF53Add,B1ADOF53Add, & + B1ADOF54Add,B1ADOF54Add,B1ADOF54Add,B1ADOF54Add,B1ADOF54Add,B1ADOF54Add,B1ADOF54Add,B1ADOF54Add,B1ADOF54Add, & + B1ADOF55Add,B1ADOF55Add,B1ADOF55Add,B1ADOF55Add,B1ADOF55Add,B1ADOF55Add,B1ADOF55Add,B1ADOF55Add,B1ADOF55Add, & + B1ADOF56Add,B1ADOF56Add,B1ADOF56Add,B1ADOF56Add,B1ADOF56Add,B1ADOF56Add,B1ADOF56Add,B1ADOF56Add,B1ADOF56Add, & + B1ADOF57Add,B1ADOF57Add,B1ADOF57Add,B1ADOF57Add,B1ADOF57Add,B1ADOF57Add,B1ADOF57Add,B1ADOF57Add,B1ADOF57Add, & + B1ADOF58Add,B1ADOF58Add,B1ADOF58Add,B1ADOF58Add,B1ADOF58Add,B1ADOF58Add,B1ADOF58Add,B1ADOF58Add,B1ADOF58Add, & + B1ADOF59Add,B1ADOF59Add,B1ADOF59Add,B1ADOF59Add,B1ADOF59Add,B1ADOF59Add,B1ADOF59Add,B1ADOF59Add,B1ADOF59Add, & + B1ADOF60Add,B1ADOF60Add,B1ADOF60Add,B1ADOF60Add,B1ADOF60Add,B1ADOF60Add,B1ADOF60Add,B1ADOF60Add,B1ADOF60Add, & + B1ADOF61Add,B1ADOF61Add,B1ADOF61Add,B1ADOF61Add,B1ADOF61Add,B1ADOF61Add,B1ADOF61Add,B1ADOF61Add,B1ADOF61Add, & + B1ADOF62Add,B1ADOF62Add,B1ADOF62Add,B1ADOF62Add,B1ADOF62Add,B1ADOF62Add,B1ADOF62Add,B1ADOF62Add,B1ADOF62Add, & + B1ADOF63Add,B1ADOF63Add,B1ADOF63Add,B1ADOF63Add,B1ADOF63Add,B1ADOF63Add,B1ADOF63Add,B1ADOF63Add,B1ADOF63Add, & + B1ADOF64Add,B1ADOF64Add,B1ADOF64Add,B1ADOF64Add,B1ADOF64Add,B1ADOF64Add,B1ADOF64Add,B1ADOF64Add,B1ADOF64Add, & + B1ADOF65Add,B1ADOF65Add,B1ADOF65Add,B1ADOF65Add,B1ADOF65Add,B1ADOF65Add,B1ADOF65Add,B1ADOF65Add,B1ADOF65Add, & + B1ADOF66Add,B1ADOF66Add,B1ADOF66Add,B1ADOF66Add,B1ADOF66Add,B1ADOF66Add,B1ADOF66Add,B1ADOF66Add,B1ADOF66Add, & + B1ADOF67Add,B1ADOF67Add,B1ADOF67Add,B1ADOF67Add,B1ADOF67Add,B1ADOF67Add,B1ADOF67Add,B1ADOF67Add,B1ADOF67Add, & + B1ADOF68Add,B1ADOF68Add,B1ADOF68Add,B1ADOF68Add,B1ADOF68Add,B1ADOF68Add,B1ADOF68Add,B1ADOF68Add,B1ADOF68Add, & + B1ADOF69Add,B1ADOF69Add,B1ADOF69Add,B1ADOF69Add,B1ADOF69Add,B1ADOF69Add,B1ADOF69Add,B1ADOF69Add,B1ADOF69Add, & + B1ADOF70Add,B1ADOF70Add,B1ADOF70Add,B1ADOF70Add,B1ADOF70Add,B1ADOF70Add,B1ADOF70Add,B1ADOF70Add,B1ADOF70Add, & + B1ADOF71Add,B1ADOF71Add,B1ADOF71Add,B1ADOF71Add,B1ADOF71Add,B1ADOF71Add,B1ADOF71Add,B1ADOF71Add,B1ADOF71Add, & + B1ADOF72Add,B1ADOF72Add,B1ADOF72Add,B1ADOF72Add,B1ADOF72Add,B1ADOF72Add,B1ADOF72Add,B1ADOF72Add,B1ADOF72Add, & + B1ADOF73Add,B1ADOF73Add,B1ADOF73Add,B1ADOF73Add,B1ADOF73Add,B1ADOF73Add,B1ADOF73Add,B1ADOF73Add,B1ADOF73Add, & + B1ADOF74Add,B1ADOF74Add,B1ADOF74Add,B1ADOF74Add,B1ADOF74Add,B1ADOF74Add,B1ADOF74Add,B1ADOF74Add,B1ADOF74Add, & + B1ADOF75Add,B1ADOF75Add,B1ADOF75Add,B1ADOF75Add,B1ADOF75Add,B1ADOF75Add,B1ADOF75Add,B1ADOF75Add,B1ADOF75Add, & + B1ADOF76Add,B1ADOF76Add,B1ADOF76Add,B1ADOF76Add,B1ADOF76Add,B1ADOF76Add,B1ADOF76Add,B1ADOF76Add,B1ADOF76Add, & + B1ADOF77Add,B1ADOF77Add,B1ADOF77Add,B1ADOF77Add,B1ADOF77Add,B1ADOF77Add,B1ADOF77Add,B1ADOF77Add,B1ADOF77Add, & + B1ADOF78Add,B1ADOF78Add,B1ADOF78Add,B1ADOF78Add,B1ADOF78Add,B1ADOF78Add,B1ADOF78Add,B1ADOF78Add,B1ADOF78Add, & + B1ADOF79Add,B1ADOF79Add,B1ADOF79Add,B1ADOF79Add,B1ADOF79Add,B1ADOF79Add,B1ADOF79Add,B1ADOF79Add,B1ADOF79Add, & + B1ADOF80Add,B1ADOF80Add,B1ADOF80Add,B1ADOF80Add,B1ADOF80Add,B1ADOF80Add,B1ADOF80Add,B1ADOF80Add,B1ADOF80Add, & + B1ADOF81Add,B1ADOF81Add,B1ADOF81Add,B1ADOF81Add,B1ADOF81Add,B1ADOF81Add,B1ADOF81Add,B1ADOF81Add,B1ADOF81Add, & + B1ADOF82Add,B1ADOF82Add,B1ADOF82Add,B1ADOF82Add,B1ADOF82Add,B1ADOF82Add,B1ADOF82Add,B1ADOF82Add,B1ADOF82Add, & + B1ADOF83Add,B1ADOF83Add,B1ADOF83Add,B1ADOF83Add,B1ADOF83Add,B1ADOF83Add,B1ADOF83Add,B1ADOF83Add,B1ADOF83Add, & + B1ADOF84Add,B1ADOF84Add,B1ADOF84Add,B1ADOF84Add,B1ADOF84Add,B1ADOF84Add,B1ADOF84Add,B1ADOF84Add,B1ADOF84Add, & + B1ADOF85Add,B1ADOF85Add,B1ADOF85Add,B1ADOF85Add,B1ADOF85Add,B1ADOF85Add,B1ADOF85Add,B1ADOF85Add,B1ADOF85Add, & + B1ADOF86Add,B1ADOF86Add,B1ADOF86Add,B1ADOF86Add,B1ADOF86Add,B1ADOF86Add,B1ADOF86Add,B1ADOF86Add,B1ADOF86Add, & + B1ADOF87Add,B1ADOF87Add,B1ADOF87Add,B1ADOF87Add,B1ADOF87Add,B1ADOF87Add,B1ADOF87Add,B1ADOF87Add,B1ADOF87Add, & + B1ADOF88Add,B1ADOF88Add,B1ADOF88Add,B1ADOF88Add,B1ADOF88Add,B1ADOF88Add,B1ADOF88Add,B1ADOF88Add,B1ADOF88Add, & + B1ADOF89Add,B1ADOF89Add,B1ADOF89Add,B1ADOF89Add,B1ADOF89Add,B1ADOF89Add,B1ADOF89Add,B1ADOF89Add,B1ADOF89Add, & + B1ADOF90Add,B1ADOF90Add,B1ADOF90Add,B1ADOF90Add,B1ADOF90Add,B1ADOF90Add,B1ADOF90Add,B1ADOF90Add,B1ADOF90Add, & + B1ADOF91Add,B1ADOF91Add,B1ADOF91Add,B1ADOF91Add,B1ADOF91Add,B1ADOF91Add,B1ADOF91Add,B1ADOF91Add,B1ADOF91Add, & + B1ADOF92Add,B1ADOF92Add,B1ADOF92Add,B1ADOF92Add,B1ADOF92Add,B1ADOF92Add,B1ADOF92Add,B1ADOF92Add,B1ADOF92Add, & + B1ADOF93Add,B1ADOF93Add,B1ADOF93Add,B1ADOF93Add,B1ADOF93Add,B1ADOF93Add,B1ADOF93Add,B1ADOF93Add,B1ADOF93Add, & + B1ADOF94Add,B1ADOF94Add,B1ADOF94Add,B1ADOF94Add,B1ADOF94Add,B1ADOF94Add,B1ADOF94Add,B1ADOF94Add,B1ADOF94Add, & + B1ADOF95Add,B1ADOF95Add,B1ADOF95Add,B1ADOF95Add,B1ADOF95Add,B1ADOF95Add,B1ADOF95Add,B1ADOF95Add,B1ADOF95Add, & + B1ADOF96Add,B1ADOF96Add,B1ADOF96Add,B1ADOF96Add,B1ADOF96Add,B1ADOF96Add,B1ADOF96Add,B1ADOF96Add,B1ADOF96Add, & + B1ADOF97Add,B1ADOF97Add,B1ADOF97Add,B1ADOF97Add,B1ADOF97Add,B1ADOF97Add,B1ADOF97Add,B1ADOF97Add,B1ADOF97Add, & + B1ADOF98Add,B1ADOF98Add,B1ADOF98Add,B1ADOF98Add,B1ADOF98Add,B1ADOF98Add,B1ADOF98Add,B1ADOF98Add,B1ADOF98Add, & + B1ADOF99Add,B1ADOF99Add,B1ADOF99Add,B1ADOF99Add,B1ADOF99Add,B1ADOF99Add,B1ADOF99Add,B1ADOF99Add,B1ADOF99Add/), & + (/9,99/))) + INTEGER, PARAMETER :: FADOFRdt(99,9) = transpose(reshape((/B1ADOF1Rdt,B1ADOF1Rdt,B1ADOF1Rdt,B1ADOF1Rdt,B1ADOF1Rdt,B1ADOF1Rdt,B1ADOF1Rdt,B1ADOF1Rdt,B1ADOF1Rdt, & + B1ADOF2Rdt,B1ADOF2Rdt,B1ADOF2Rdt,B1ADOF2Rdt,B1ADOF2Rdt,B1ADOF2Rdt,B1ADOF2Rdt,B1ADOF2Rdt,B1ADOF2Rdt, & + B1ADOF3Rdt,B1ADOF3Rdt,B1ADOF3Rdt,B1ADOF3Rdt,B1ADOF3Rdt,B1ADOF3Rdt,B1ADOF3Rdt,B1ADOF3Rdt,B1ADOF3Rdt, & + B1ADOF4Rdt,B1ADOF4Rdt,B1ADOF4Rdt,B1ADOF4Rdt,B1ADOF4Rdt,B1ADOF4Rdt,B1ADOF4Rdt,B1ADOF4Rdt,B1ADOF4Rdt, & + B1ADOF5Rdt,B1ADOF5Rdt,B1ADOF5Rdt,B1ADOF5Rdt,B1ADOF5Rdt,B1ADOF5Rdt,B1ADOF5Rdt,B1ADOF5Rdt,B1ADOF5Rdt, & + B1ADOF6Rdt,B1ADOF6Rdt,B1ADOF6Rdt,B1ADOF6Rdt,B1ADOF6Rdt,B1ADOF6Rdt,B1ADOF6Rdt,B1ADOF6Rdt,B1ADOF6Rdt, & + B1ADOF7Rdt,B1ADOF7Rdt,B1ADOF7Rdt,B1ADOF7Rdt,B1ADOF7Rdt,B1ADOF7Rdt,B1ADOF7Rdt,B1ADOF7Rdt,B1ADOF7Rdt, & + B1ADOF8Rdt,B1ADOF8Rdt,B1ADOF8Rdt,B1ADOF8Rdt,B1ADOF8Rdt,B1ADOF8Rdt,B1ADOF8Rdt,B1ADOF8Rdt,B1ADOF8Rdt, & + B1ADOF9Rdt,B1ADOF9Rdt,B1ADOF9Rdt,B1ADOF9Rdt,B1ADOF9Rdt,B1ADOF9Rdt,B1ADOF9Rdt,B1ADOF9Rdt,B1ADOF9Rdt, & + B1ADOF10Rdt,B1ADOF10Rdt,B1ADOF10Rdt,B1ADOF10Rdt,B1ADOF10Rdt,B1ADOF10Rdt,B1ADOF10Rdt,B1ADOF10Rdt,B1ADOF10Rdt, & + B1ADOF11Rdt,B1ADOF11Rdt,B1ADOF11Rdt,B1ADOF11Rdt,B1ADOF11Rdt,B1ADOF11Rdt,B1ADOF11Rdt,B1ADOF11Rdt,B1ADOF11Rdt, & + B1ADOF12Rdt,B1ADOF12Rdt,B1ADOF12Rdt,B1ADOF12Rdt,B1ADOF12Rdt,B1ADOF12Rdt,B1ADOF12Rdt,B1ADOF12Rdt,B1ADOF12Rdt, & + B1ADOF13Rdt,B1ADOF13Rdt,B1ADOF13Rdt,B1ADOF13Rdt,B1ADOF13Rdt,B1ADOF13Rdt,B1ADOF13Rdt,B1ADOF13Rdt,B1ADOF13Rdt, & + B1ADOF14Rdt,B1ADOF14Rdt,B1ADOF14Rdt,B1ADOF14Rdt,B1ADOF14Rdt,B1ADOF14Rdt,B1ADOF14Rdt,B1ADOF14Rdt,B1ADOF14Rdt, & + B1ADOF15Rdt,B1ADOF15Rdt,B1ADOF15Rdt,B1ADOF15Rdt,B1ADOF15Rdt,B1ADOF15Rdt,B1ADOF15Rdt,B1ADOF15Rdt,B1ADOF15Rdt, & + B1ADOF16Rdt,B1ADOF16Rdt,B1ADOF16Rdt,B1ADOF16Rdt,B1ADOF16Rdt,B1ADOF16Rdt,B1ADOF16Rdt,B1ADOF16Rdt,B1ADOF16Rdt, & + B1ADOF17Rdt,B1ADOF17Rdt,B1ADOF17Rdt,B1ADOF17Rdt,B1ADOF17Rdt,B1ADOF17Rdt,B1ADOF17Rdt,B1ADOF17Rdt,B1ADOF17Rdt, & + B1ADOF18Rdt,B1ADOF18Rdt,B1ADOF18Rdt,B1ADOF18Rdt,B1ADOF18Rdt,B1ADOF18Rdt,B1ADOF18Rdt,B1ADOF18Rdt,B1ADOF18Rdt, & + B1ADOF19Rdt,B1ADOF19Rdt,B1ADOF19Rdt,B1ADOF19Rdt,B1ADOF19Rdt,B1ADOF19Rdt,B1ADOF19Rdt,B1ADOF19Rdt,B1ADOF19Rdt, & + B1ADOF20Rdt,B1ADOF20Rdt,B1ADOF20Rdt,B1ADOF20Rdt,B1ADOF20Rdt,B1ADOF20Rdt,B1ADOF20Rdt,B1ADOF20Rdt,B1ADOF20Rdt, & + B1ADOF21Rdt,B1ADOF21Rdt,B1ADOF21Rdt,B1ADOF21Rdt,B1ADOF21Rdt,B1ADOF21Rdt,B1ADOF21Rdt,B1ADOF21Rdt,B1ADOF21Rdt, & + B1ADOF22Rdt,B1ADOF22Rdt,B1ADOF22Rdt,B1ADOF22Rdt,B1ADOF22Rdt,B1ADOF22Rdt,B1ADOF22Rdt,B1ADOF22Rdt,B1ADOF22Rdt, & + B1ADOF23Rdt,B1ADOF23Rdt,B1ADOF23Rdt,B1ADOF23Rdt,B1ADOF23Rdt,B1ADOF23Rdt,B1ADOF23Rdt,B1ADOF23Rdt,B1ADOF23Rdt, & + B1ADOF24Rdt,B1ADOF24Rdt,B1ADOF24Rdt,B1ADOF24Rdt,B1ADOF24Rdt,B1ADOF24Rdt,B1ADOF24Rdt,B1ADOF24Rdt,B1ADOF24Rdt, & + B1ADOF25Rdt,B1ADOF25Rdt,B1ADOF25Rdt,B1ADOF25Rdt,B1ADOF25Rdt,B1ADOF25Rdt,B1ADOF25Rdt,B1ADOF25Rdt,B1ADOF25Rdt, & + B1ADOF26Rdt,B1ADOF26Rdt,B1ADOF26Rdt,B1ADOF26Rdt,B1ADOF26Rdt,B1ADOF26Rdt,B1ADOF26Rdt,B1ADOF26Rdt,B1ADOF26Rdt, & + B1ADOF27Rdt,B1ADOF27Rdt,B1ADOF27Rdt,B1ADOF27Rdt,B1ADOF27Rdt,B1ADOF27Rdt,B1ADOF27Rdt,B1ADOF27Rdt,B1ADOF27Rdt, & + B1ADOF28Rdt,B1ADOF28Rdt,B1ADOF28Rdt,B1ADOF28Rdt,B1ADOF28Rdt,B1ADOF28Rdt,B1ADOF28Rdt,B1ADOF28Rdt,B1ADOF28Rdt, & + B1ADOF29Rdt,B1ADOF29Rdt,B1ADOF29Rdt,B1ADOF29Rdt,B1ADOF29Rdt,B1ADOF29Rdt,B1ADOF29Rdt,B1ADOF29Rdt,B1ADOF29Rdt, & + B1ADOF30Rdt,B1ADOF30Rdt,B1ADOF30Rdt,B1ADOF30Rdt,B1ADOF30Rdt,B1ADOF30Rdt,B1ADOF30Rdt,B1ADOF30Rdt,B1ADOF30Rdt, & + B1ADOF31Rdt,B1ADOF31Rdt,B1ADOF31Rdt,B1ADOF31Rdt,B1ADOF31Rdt,B1ADOF31Rdt,B1ADOF31Rdt,B1ADOF31Rdt,B1ADOF31Rdt, & + B1ADOF32Rdt,B1ADOF32Rdt,B1ADOF32Rdt,B1ADOF32Rdt,B1ADOF32Rdt,B1ADOF32Rdt,B1ADOF32Rdt,B1ADOF32Rdt,B1ADOF32Rdt, & + B1ADOF33Rdt,B1ADOF33Rdt,B1ADOF33Rdt,B1ADOF33Rdt,B1ADOF33Rdt,B1ADOF33Rdt,B1ADOF33Rdt,B1ADOF33Rdt,B1ADOF33Rdt, & + B1ADOF34Rdt,B1ADOF34Rdt,B1ADOF34Rdt,B1ADOF34Rdt,B1ADOF34Rdt,B1ADOF34Rdt,B1ADOF34Rdt,B1ADOF34Rdt,B1ADOF34Rdt, & + B1ADOF35Rdt,B1ADOF35Rdt,B1ADOF35Rdt,B1ADOF35Rdt,B1ADOF35Rdt,B1ADOF35Rdt,B1ADOF35Rdt,B1ADOF35Rdt,B1ADOF35Rdt, & + B1ADOF36Rdt,B1ADOF36Rdt,B1ADOF36Rdt,B1ADOF36Rdt,B1ADOF36Rdt,B1ADOF36Rdt,B1ADOF36Rdt,B1ADOF36Rdt,B1ADOF36Rdt, & + B1ADOF37Rdt,B1ADOF37Rdt,B1ADOF37Rdt,B1ADOF37Rdt,B1ADOF37Rdt,B1ADOF37Rdt,B1ADOF37Rdt,B1ADOF37Rdt,B1ADOF37Rdt, & + B1ADOF38Rdt,B1ADOF38Rdt,B1ADOF38Rdt,B1ADOF38Rdt,B1ADOF38Rdt,B1ADOF38Rdt,B1ADOF38Rdt,B1ADOF38Rdt,B1ADOF38Rdt, & + B1ADOF39Rdt,B1ADOF39Rdt,B1ADOF39Rdt,B1ADOF39Rdt,B1ADOF39Rdt,B1ADOF39Rdt,B1ADOF39Rdt,B1ADOF39Rdt,B1ADOF39Rdt, & + B1ADOF40Rdt,B1ADOF40Rdt,B1ADOF40Rdt,B1ADOF40Rdt,B1ADOF40Rdt,B1ADOF40Rdt,B1ADOF40Rdt,B1ADOF40Rdt,B1ADOF40Rdt, & + B1ADOF41Rdt,B1ADOF41Rdt,B1ADOF41Rdt,B1ADOF41Rdt,B1ADOF41Rdt,B1ADOF41Rdt,B1ADOF41Rdt,B1ADOF41Rdt,B1ADOF41Rdt, & + B1ADOF42Rdt,B1ADOF42Rdt,B1ADOF42Rdt,B1ADOF42Rdt,B1ADOF42Rdt,B1ADOF42Rdt,B1ADOF42Rdt,B1ADOF42Rdt,B1ADOF42Rdt, & + B1ADOF43Rdt,B1ADOF43Rdt,B1ADOF43Rdt,B1ADOF43Rdt,B1ADOF43Rdt,B1ADOF43Rdt,B1ADOF43Rdt,B1ADOF43Rdt,B1ADOF43Rdt, & + B1ADOF44Rdt,B1ADOF44Rdt,B1ADOF44Rdt,B1ADOF44Rdt,B1ADOF44Rdt,B1ADOF44Rdt,B1ADOF44Rdt,B1ADOF44Rdt,B1ADOF44Rdt, & + B1ADOF45Rdt,B1ADOF45Rdt,B1ADOF45Rdt,B1ADOF45Rdt,B1ADOF45Rdt,B1ADOF45Rdt,B1ADOF45Rdt,B1ADOF45Rdt,B1ADOF45Rdt, & + B1ADOF46Rdt,B1ADOF46Rdt,B1ADOF46Rdt,B1ADOF46Rdt,B1ADOF46Rdt,B1ADOF46Rdt,B1ADOF46Rdt,B1ADOF46Rdt,B1ADOF46Rdt, & + B1ADOF47Rdt,B1ADOF47Rdt,B1ADOF47Rdt,B1ADOF47Rdt,B1ADOF47Rdt,B1ADOF47Rdt,B1ADOF47Rdt,B1ADOF47Rdt,B1ADOF47Rdt, & + B1ADOF48Rdt,B1ADOF48Rdt,B1ADOF48Rdt,B1ADOF48Rdt,B1ADOF48Rdt,B1ADOF48Rdt,B1ADOF48Rdt,B1ADOF48Rdt,B1ADOF48Rdt, & + B1ADOF49Rdt,B1ADOF49Rdt,B1ADOF49Rdt,B1ADOF49Rdt,B1ADOF49Rdt,B1ADOF49Rdt,B1ADOF49Rdt,B1ADOF49Rdt,B1ADOF49Rdt, & + B1ADOF50Rdt,B1ADOF50Rdt,B1ADOF50Rdt,B1ADOF50Rdt,B1ADOF50Rdt,B1ADOF50Rdt,B1ADOF50Rdt,B1ADOF50Rdt,B1ADOF50Rdt, & + B1ADOF51Rdt,B1ADOF51Rdt,B1ADOF51Rdt,B1ADOF51Rdt,B1ADOF51Rdt,B1ADOF51Rdt,B1ADOF51Rdt,B1ADOF51Rdt,B1ADOF51Rdt, & + B1ADOF52Rdt,B1ADOF52Rdt,B1ADOF52Rdt,B1ADOF52Rdt,B1ADOF52Rdt,B1ADOF52Rdt,B1ADOF52Rdt,B1ADOF52Rdt,B1ADOF52Rdt, & + B1ADOF53Rdt,B1ADOF53Rdt,B1ADOF53Rdt,B1ADOF53Rdt,B1ADOF53Rdt,B1ADOF53Rdt,B1ADOF53Rdt,B1ADOF53Rdt,B1ADOF53Rdt, & + B1ADOF54Rdt,B1ADOF54Rdt,B1ADOF54Rdt,B1ADOF54Rdt,B1ADOF54Rdt,B1ADOF54Rdt,B1ADOF54Rdt,B1ADOF54Rdt,B1ADOF54Rdt, & + B1ADOF55Rdt,B1ADOF55Rdt,B1ADOF55Rdt,B1ADOF55Rdt,B1ADOF55Rdt,B1ADOF55Rdt,B1ADOF55Rdt,B1ADOF55Rdt,B1ADOF55Rdt, & + B1ADOF56Rdt,B1ADOF56Rdt,B1ADOF56Rdt,B1ADOF56Rdt,B1ADOF56Rdt,B1ADOF56Rdt,B1ADOF56Rdt,B1ADOF56Rdt,B1ADOF56Rdt, & + B1ADOF57Rdt,B1ADOF57Rdt,B1ADOF57Rdt,B1ADOF57Rdt,B1ADOF57Rdt,B1ADOF57Rdt,B1ADOF57Rdt,B1ADOF57Rdt,B1ADOF57Rdt, & + B1ADOF58Rdt,B1ADOF58Rdt,B1ADOF58Rdt,B1ADOF58Rdt,B1ADOF58Rdt,B1ADOF58Rdt,B1ADOF58Rdt,B1ADOF58Rdt,B1ADOF58Rdt, & + B1ADOF59Rdt,B1ADOF59Rdt,B1ADOF59Rdt,B1ADOF59Rdt,B1ADOF59Rdt,B1ADOF59Rdt,B1ADOF59Rdt,B1ADOF59Rdt,B1ADOF59Rdt, & + B1ADOF60Rdt,B1ADOF60Rdt,B1ADOF60Rdt,B1ADOF60Rdt,B1ADOF60Rdt,B1ADOF60Rdt,B1ADOF60Rdt,B1ADOF60Rdt,B1ADOF60Rdt, & + B1ADOF61Rdt,B1ADOF61Rdt,B1ADOF61Rdt,B1ADOF61Rdt,B1ADOF61Rdt,B1ADOF61Rdt,B1ADOF61Rdt,B1ADOF61Rdt,B1ADOF61Rdt, & + B1ADOF62Rdt,B1ADOF62Rdt,B1ADOF62Rdt,B1ADOF62Rdt,B1ADOF62Rdt,B1ADOF62Rdt,B1ADOF62Rdt,B1ADOF62Rdt,B1ADOF62Rdt, & + B1ADOF63Rdt,B1ADOF63Rdt,B1ADOF63Rdt,B1ADOF63Rdt,B1ADOF63Rdt,B1ADOF63Rdt,B1ADOF63Rdt,B1ADOF63Rdt,B1ADOF63Rdt, & + B1ADOF64Rdt,B1ADOF64Rdt,B1ADOF64Rdt,B1ADOF64Rdt,B1ADOF64Rdt,B1ADOF64Rdt,B1ADOF64Rdt,B1ADOF64Rdt,B1ADOF64Rdt, & + B1ADOF65Rdt,B1ADOF65Rdt,B1ADOF65Rdt,B1ADOF65Rdt,B1ADOF65Rdt,B1ADOF65Rdt,B1ADOF65Rdt,B1ADOF65Rdt,B1ADOF65Rdt, & + B1ADOF66Rdt,B1ADOF66Rdt,B1ADOF66Rdt,B1ADOF66Rdt,B1ADOF66Rdt,B1ADOF66Rdt,B1ADOF66Rdt,B1ADOF66Rdt,B1ADOF66Rdt, & + B1ADOF67Rdt,B1ADOF67Rdt,B1ADOF67Rdt,B1ADOF67Rdt,B1ADOF67Rdt,B1ADOF67Rdt,B1ADOF67Rdt,B1ADOF67Rdt,B1ADOF67Rdt, & + B1ADOF68Rdt,B1ADOF68Rdt,B1ADOF68Rdt,B1ADOF68Rdt,B1ADOF68Rdt,B1ADOF68Rdt,B1ADOF68Rdt,B1ADOF68Rdt,B1ADOF68Rdt, & + B1ADOF69Rdt,B1ADOF69Rdt,B1ADOF69Rdt,B1ADOF69Rdt,B1ADOF69Rdt,B1ADOF69Rdt,B1ADOF69Rdt,B1ADOF69Rdt,B1ADOF69Rdt, & + B1ADOF70Rdt,B1ADOF70Rdt,B1ADOF70Rdt,B1ADOF70Rdt,B1ADOF70Rdt,B1ADOF70Rdt,B1ADOF70Rdt,B1ADOF70Rdt,B1ADOF70Rdt, & + B1ADOF71Rdt,B1ADOF71Rdt,B1ADOF71Rdt,B1ADOF71Rdt,B1ADOF71Rdt,B1ADOF71Rdt,B1ADOF71Rdt,B1ADOF71Rdt,B1ADOF71Rdt, & + B1ADOF72Rdt,B1ADOF72Rdt,B1ADOF72Rdt,B1ADOF72Rdt,B1ADOF72Rdt,B1ADOF72Rdt,B1ADOF72Rdt,B1ADOF72Rdt,B1ADOF72Rdt, & + B1ADOF73Rdt,B1ADOF73Rdt,B1ADOF73Rdt,B1ADOF73Rdt,B1ADOF73Rdt,B1ADOF73Rdt,B1ADOF73Rdt,B1ADOF73Rdt,B1ADOF73Rdt, & + B1ADOF74Rdt,B1ADOF74Rdt,B1ADOF74Rdt,B1ADOF74Rdt,B1ADOF74Rdt,B1ADOF74Rdt,B1ADOF74Rdt,B1ADOF74Rdt,B1ADOF74Rdt, & + B1ADOF75Rdt,B1ADOF75Rdt,B1ADOF75Rdt,B1ADOF75Rdt,B1ADOF75Rdt,B1ADOF75Rdt,B1ADOF75Rdt,B1ADOF75Rdt,B1ADOF75Rdt, & + B1ADOF76Rdt,B1ADOF76Rdt,B1ADOF76Rdt,B1ADOF76Rdt,B1ADOF76Rdt,B1ADOF76Rdt,B1ADOF76Rdt,B1ADOF76Rdt,B1ADOF76Rdt, & + B1ADOF77Rdt,B1ADOF77Rdt,B1ADOF77Rdt,B1ADOF77Rdt,B1ADOF77Rdt,B1ADOF77Rdt,B1ADOF77Rdt,B1ADOF77Rdt,B1ADOF77Rdt, & + B1ADOF78Rdt,B1ADOF78Rdt,B1ADOF78Rdt,B1ADOF78Rdt,B1ADOF78Rdt,B1ADOF78Rdt,B1ADOF78Rdt,B1ADOF78Rdt,B1ADOF78Rdt, & + B1ADOF79Rdt,B1ADOF79Rdt,B1ADOF79Rdt,B1ADOF79Rdt,B1ADOF79Rdt,B1ADOF79Rdt,B1ADOF79Rdt,B1ADOF79Rdt,B1ADOF79Rdt, & + B1ADOF80Rdt,B1ADOF80Rdt,B1ADOF80Rdt,B1ADOF80Rdt,B1ADOF80Rdt,B1ADOF80Rdt,B1ADOF80Rdt,B1ADOF80Rdt,B1ADOF80Rdt, & + B1ADOF81Rdt,B1ADOF81Rdt,B1ADOF81Rdt,B1ADOF81Rdt,B1ADOF81Rdt,B1ADOF81Rdt,B1ADOF81Rdt,B1ADOF81Rdt,B1ADOF81Rdt, & + B1ADOF82Rdt,B1ADOF82Rdt,B1ADOF82Rdt,B1ADOF82Rdt,B1ADOF82Rdt,B1ADOF82Rdt,B1ADOF82Rdt,B1ADOF82Rdt,B1ADOF82Rdt, & + B1ADOF83Rdt,B1ADOF83Rdt,B1ADOF83Rdt,B1ADOF83Rdt,B1ADOF83Rdt,B1ADOF83Rdt,B1ADOF83Rdt,B1ADOF83Rdt,B1ADOF83Rdt, & + B1ADOF84Rdt,B1ADOF84Rdt,B1ADOF84Rdt,B1ADOF84Rdt,B1ADOF84Rdt,B1ADOF84Rdt,B1ADOF84Rdt,B1ADOF84Rdt,B1ADOF84Rdt, & + B1ADOF85Rdt,B1ADOF85Rdt,B1ADOF85Rdt,B1ADOF85Rdt,B1ADOF85Rdt,B1ADOF85Rdt,B1ADOF85Rdt,B1ADOF85Rdt,B1ADOF85Rdt, & + B1ADOF86Rdt,B1ADOF86Rdt,B1ADOF86Rdt,B1ADOF86Rdt,B1ADOF86Rdt,B1ADOF86Rdt,B1ADOF86Rdt,B1ADOF86Rdt,B1ADOF86Rdt, & + B1ADOF87Rdt,B1ADOF87Rdt,B1ADOF87Rdt,B1ADOF87Rdt,B1ADOF87Rdt,B1ADOF87Rdt,B1ADOF87Rdt,B1ADOF87Rdt,B1ADOF87Rdt, & + B1ADOF88Rdt,B1ADOF88Rdt,B1ADOF88Rdt,B1ADOF88Rdt,B1ADOF88Rdt,B1ADOF88Rdt,B1ADOF88Rdt,B1ADOF88Rdt,B1ADOF88Rdt, & + B1ADOF89Rdt,B1ADOF89Rdt,B1ADOF89Rdt,B1ADOF89Rdt,B1ADOF89Rdt,B1ADOF89Rdt,B1ADOF89Rdt,B1ADOF89Rdt,B1ADOF89Rdt, & + B1ADOF90Rdt,B1ADOF90Rdt,B1ADOF90Rdt,B1ADOF90Rdt,B1ADOF90Rdt,B1ADOF90Rdt,B1ADOF90Rdt,B1ADOF90Rdt,B1ADOF90Rdt, & + B1ADOF91Rdt,B1ADOF91Rdt,B1ADOF91Rdt,B1ADOF91Rdt,B1ADOF91Rdt,B1ADOF91Rdt,B1ADOF91Rdt,B1ADOF91Rdt,B1ADOF91Rdt, & + B1ADOF92Rdt,B1ADOF92Rdt,B1ADOF92Rdt,B1ADOF92Rdt,B1ADOF92Rdt,B1ADOF92Rdt,B1ADOF92Rdt,B1ADOF92Rdt,B1ADOF92Rdt, & + B1ADOF93Rdt,B1ADOF93Rdt,B1ADOF93Rdt,B1ADOF93Rdt,B1ADOF93Rdt,B1ADOF93Rdt,B1ADOF93Rdt,B1ADOF93Rdt,B1ADOF93Rdt, & + B1ADOF94Rdt,B1ADOF94Rdt,B1ADOF94Rdt,B1ADOF94Rdt,B1ADOF94Rdt,B1ADOF94Rdt,B1ADOF94Rdt,B1ADOF94Rdt,B1ADOF94Rdt, & + B1ADOF95Rdt,B1ADOF95Rdt,B1ADOF95Rdt,B1ADOF95Rdt,B1ADOF95Rdt,B1ADOF95Rdt,B1ADOF95Rdt,B1ADOF95Rdt,B1ADOF95Rdt, & + B1ADOF96Rdt,B1ADOF96Rdt,B1ADOF96Rdt,B1ADOF96Rdt,B1ADOF96Rdt,B1ADOF96Rdt,B1ADOF96Rdt,B1ADOF96Rdt,B1ADOF96Rdt, & + B1ADOF97Rdt,B1ADOF97Rdt,B1ADOF97Rdt,B1ADOF97Rdt,B1ADOF97Rdt,B1ADOF97Rdt,B1ADOF97Rdt,B1ADOF97Rdt,B1ADOF97Rdt, & + B1ADOF98Rdt,B1ADOF98Rdt,B1ADOF98Rdt,B1ADOF98Rdt,B1ADOF98Rdt,B1ADOF98Rdt,B1ADOF98Rdt,B1ADOF98Rdt,B1ADOF98Rdt, & + B1ADOF99Rdt,B1ADOF99Rdt,B1ADOF99Rdt,B1ADOF99Rdt,B1ADOF99Rdt,B1ADOF99Rdt,B1ADOF99Rdt,B1ADOF99Rdt,B1ADOF99Rdt/), & + (/9,99/))) + INTEGER, PARAMETER :: FADOFHds(99,9) = transpose(reshape((/B1ADOF1Hds,B1ADOF1Hds,B1ADOF1Hds,B1ADOF1Hds,B1ADOF1Hds,B1ADOF1Hds,B1ADOF1Hds,B1ADOF1Hds,B1ADOF1Hds, & + B1ADOF2Hds,B1ADOF2Hds,B1ADOF2Hds,B1ADOF2Hds,B1ADOF2Hds,B1ADOF2Hds,B1ADOF2Hds,B1ADOF2Hds,B1ADOF2Hds, & + B1ADOF3Hds,B1ADOF3Hds,B1ADOF3Hds,B1ADOF3Hds,B1ADOF3Hds,B1ADOF3Hds,B1ADOF3Hds,B1ADOF3Hds,B1ADOF3Hds, & + B1ADOF4Hds,B1ADOF4Hds,B1ADOF4Hds,B1ADOF4Hds,B1ADOF4Hds,B1ADOF4Hds,B1ADOF4Hds,B1ADOF4Hds,B1ADOF4Hds, & + B1ADOF5Hds,B1ADOF5Hds,B1ADOF5Hds,B1ADOF5Hds,B1ADOF5Hds,B1ADOF5Hds,B1ADOF5Hds,B1ADOF5Hds,B1ADOF5Hds, & + B1ADOF6Hds,B1ADOF6Hds,B1ADOF6Hds,B1ADOF6Hds,B1ADOF6Hds,B1ADOF6Hds,B1ADOF6Hds,B1ADOF6Hds,B1ADOF6Hds, & + B1ADOF7Hds,B1ADOF7Hds,B1ADOF7Hds,B1ADOF7Hds,B1ADOF7Hds,B1ADOF7Hds,B1ADOF7Hds,B1ADOF7Hds,B1ADOF7Hds, & + B1ADOF8Hds,B1ADOF8Hds,B1ADOF8Hds,B1ADOF8Hds,B1ADOF8Hds,B1ADOF8Hds,B1ADOF8Hds,B1ADOF8Hds,B1ADOF8Hds, & + B1ADOF9Hds,B1ADOF9Hds,B1ADOF9Hds,B1ADOF9Hds,B1ADOF9Hds,B1ADOF9Hds,B1ADOF9Hds,B1ADOF9Hds,B1ADOF9Hds, & + B1ADOF10Hds,B1ADOF10Hds,B1ADOF10Hds,B1ADOF10Hds,B1ADOF10Hds,B1ADOF10Hds,B1ADOF10Hds,B1ADOF10Hds,B1ADOF10Hds, & + B1ADOF11Hds,B1ADOF11Hds,B1ADOF11Hds,B1ADOF11Hds,B1ADOF11Hds,B1ADOF11Hds,B1ADOF11Hds,B1ADOF11Hds,B1ADOF11Hds, & + B1ADOF12Hds,B1ADOF12Hds,B1ADOF12Hds,B1ADOF12Hds,B1ADOF12Hds,B1ADOF12Hds,B1ADOF12Hds,B1ADOF12Hds,B1ADOF12Hds, & + B1ADOF13Hds,B1ADOF13Hds,B1ADOF13Hds,B1ADOF13Hds,B1ADOF13Hds,B1ADOF13Hds,B1ADOF13Hds,B1ADOF13Hds,B1ADOF13Hds, & + B1ADOF14Hds,B1ADOF14Hds,B1ADOF14Hds,B1ADOF14Hds,B1ADOF14Hds,B1ADOF14Hds,B1ADOF14Hds,B1ADOF14Hds,B1ADOF14Hds, & + B1ADOF15Hds,B1ADOF15Hds,B1ADOF15Hds,B1ADOF15Hds,B1ADOF15Hds,B1ADOF15Hds,B1ADOF15Hds,B1ADOF15Hds,B1ADOF15Hds, & + B1ADOF16Hds,B1ADOF16Hds,B1ADOF16Hds,B1ADOF16Hds,B1ADOF16Hds,B1ADOF16Hds,B1ADOF16Hds,B1ADOF16Hds,B1ADOF16Hds, & + B1ADOF17Hds,B1ADOF17Hds,B1ADOF17Hds,B1ADOF17Hds,B1ADOF17Hds,B1ADOF17Hds,B1ADOF17Hds,B1ADOF17Hds,B1ADOF17Hds, & + B1ADOF18Hds,B1ADOF18Hds,B1ADOF18Hds,B1ADOF18Hds,B1ADOF18Hds,B1ADOF18Hds,B1ADOF18Hds,B1ADOF18Hds,B1ADOF18Hds, & + B1ADOF19Hds,B1ADOF19Hds,B1ADOF19Hds,B1ADOF19Hds,B1ADOF19Hds,B1ADOF19Hds,B1ADOF19Hds,B1ADOF19Hds,B1ADOF19Hds, & + B1ADOF20Hds,B1ADOF20Hds,B1ADOF20Hds,B1ADOF20Hds,B1ADOF20Hds,B1ADOF20Hds,B1ADOF20Hds,B1ADOF20Hds,B1ADOF20Hds, & + B1ADOF21Hds,B1ADOF21Hds,B1ADOF21Hds,B1ADOF21Hds,B1ADOF21Hds,B1ADOF21Hds,B1ADOF21Hds,B1ADOF21Hds,B1ADOF21Hds, & + B1ADOF22Hds,B1ADOF22Hds,B1ADOF22Hds,B1ADOF22Hds,B1ADOF22Hds,B1ADOF22Hds,B1ADOF22Hds,B1ADOF22Hds,B1ADOF22Hds, & + B1ADOF23Hds,B1ADOF23Hds,B1ADOF23Hds,B1ADOF23Hds,B1ADOF23Hds,B1ADOF23Hds,B1ADOF23Hds,B1ADOF23Hds,B1ADOF23Hds, & + B1ADOF24Hds,B1ADOF24Hds,B1ADOF24Hds,B1ADOF24Hds,B1ADOF24Hds,B1ADOF24Hds,B1ADOF24Hds,B1ADOF24Hds,B1ADOF24Hds, & + B1ADOF25Hds,B1ADOF25Hds,B1ADOF25Hds,B1ADOF25Hds,B1ADOF25Hds,B1ADOF25Hds,B1ADOF25Hds,B1ADOF25Hds,B1ADOF25Hds, & + B1ADOF26Hds,B1ADOF26Hds,B1ADOF26Hds,B1ADOF26Hds,B1ADOF26Hds,B1ADOF26Hds,B1ADOF26Hds,B1ADOF26Hds,B1ADOF26Hds, & + B1ADOF27Hds,B1ADOF27Hds,B1ADOF27Hds,B1ADOF27Hds,B1ADOF27Hds,B1ADOF27Hds,B1ADOF27Hds,B1ADOF27Hds,B1ADOF27Hds, & + B1ADOF28Hds,B1ADOF28Hds,B1ADOF28Hds,B1ADOF28Hds,B1ADOF28Hds,B1ADOF28Hds,B1ADOF28Hds,B1ADOF28Hds,B1ADOF28Hds, & + B1ADOF29Hds,B1ADOF29Hds,B1ADOF29Hds,B1ADOF29Hds,B1ADOF29Hds,B1ADOF29Hds,B1ADOF29Hds,B1ADOF29Hds,B1ADOF29Hds, & + B1ADOF30Hds,B1ADOF30Hds,B1ADOF30Hds,B1ADOF30Hds,B1ADOF30Hds,B1ADOF30Hds,B1ADOF30Hds,B1ADOF30Hds,B1ADOF30Hds, & + B1ADOF31Hds,B1ADOF31Hds,B1ADOF31Hds,B1ADOF31Hds,B1ADOF31Hds,B1ADOF31Hds,B1ADOF31Hds,B1ADOF31Hds,B1ADOF31Hds, & + B1ADOF32Hds,B1ADOF32Hds,B1ADOF32Hds,B1ADOF32Hds,B1ADOF32Hds,B1ADOF32Hds,B1ADOF32Hds,B1ADOF32Hds,B1ADOF32Hds, & + B1ADOF33Hds,B1ADOF33Hds,B1ADOF33Hds,B1ADOF33Hds,B1ADOF33Hds,B1ADOF33Hds,B1ADOF33Hds,B1ADOF33Hds,B1ADOF33Hds, & + B1ADOF34Hds,B1ADOF34Hds,B1ADOF34Hds,B1ADOF34Hds,B1ADOF34Hds,B1ADOF34Hds,B1ADOF34Hds,B1ADOF34Hds,B1ADOF34Hds, & + B1ADOF35Hds,B1ADOF35Hds,B1ADOF35Hds,B1ADOF35Hds,B1ADOF35Hds,B1ADOF35Hds,B1ADOF35Hds,B1ADOF35Hds,B1ADOF35Hds, & + B1ADOF36Hds,B1ADOF36Hds,B1ADOF36Hds,B1ADOF36Hds,B1ADOF36Hds,B1ADOF36Hds,B1ADOF36Hds,B1ADOF36Hds,B1ADOF36Hds, & + B1ADOF37Hds,B1ADOF37Hds,B1ADOF37Hds,B1ADOF37Hds,B1ADOF37Hds,B1ADOF37Hds,B1ADOF37Hds,B1ADOF37Hds,B1ADOF37Hds, & + B1ADOF38Hds,B1ADOF38Hds,B1ADOF38Hds,B1ADOF38Hds,B1ADOF38Hds,B1ADOF38Hds,B1ADOF38Hds,B1ADOF38Hds,B1ADOF38Hds, & + B1ADOF39Hds,B1ADOF39Hds,B1ADOF39Hds,B1ADOF39Hds,B1ADOF39Hds,B1ADOF39Hds,B1ADOF39Hds,B1ADOF39Hds,B1ADOF39Hds, & + B1ADOF40Hds,B1ADOF40Hds,B1ADOF40Hds,B1ADOF40Hds,B1ADOF40Hds,B1ADOF40Hds,B1ADOF40Hds,B1ADOF40Hds,B1ADOF40Hds, & + B1ADOF41Hds,B1ADOF41Hds,B1ADOF41Hds,B1ADOF41Hds,B1ADOF41Hds,B1ADOF41Hds,B1ADOF41Hds,B1ADOF41Hds,B1ADOF41Hds, & + B1ADOF42Hds,B1ADOF42Hds,B1ADOF42Hds,B1ADOF42Hds,B1ADOF42Hds,B1ADOF42Hds,B1ADOF42Hds,B1ADOF42Hds,B1ADOF42Hds, & + B1ADOF43Hds,B1ADOF43Hds,B1ADOF43Hds,B1ADOF43Hds,B1ADOF43Hds,B1ADOF43Hds,B1ADOF43Hds,B1ADOF43Hds,B1ADOF43Hds, & + B1ADOF44Hds,B1ADOF44Hds,B1ADOF44Hds,B1ADOF44Hds,B1ADOF44Hds,B1ADOF44Hds,B1ADOF44Hds,B1ADOF44Hds,B1ADOF44Hds, & + B1ADOF45Hds,B1ADOF45Hds,B1ADOF45Hds,B1ADOF45Hds,B1ADOF45Hds,B1ADOF45Hds,B1ADOF45Hds,B1ADOF45Hds,B1ADOF45Hds, & + B1ADOF46Hds,B1ADOF46Hds,B1ADOF46Hds,B1ADOF46Hds,B1ADOF46Hds,B1ADOF46Hds,B1ADOF46Hds,B1ADOF46Hds,B1ADOF46Hds, & + B1ADOF47Hds,B1ADOF47Hds,B1ADOF47Hds,B1ADOF47Hds,B1ADOF47Hds,B1ADOF47Hds,B1ADOF47Hds,B1ADOF47Hds,B1ADOF47Hds, & + B1ADOF48Hds,B1ADOF48Hds,B1ADOF48Hds,B1ADOF48Hds,B1ADOF48Hds,B1ADOF48Hds,B1ADOF48Hds,B1ADOF48Hds,B1ADOF48Hds, & + B1ADOF49Hds,B1ADOF49Hds,B1ADOF49Hds,B1ADOF49Hds,B1ADOF49Hds,B1ADOF49Hds,B1ADOF49Hds,B1ADOF49Hds,B1ADOF49Hds, & + B1ADOF50Hds,B1ADOF50Hds,B1ADOF50Hds,B1ADOF50Hds,B1ADOF50Hds,B1ADOF50Hds,B1ADOF50Hds,B1ADOF50Hds,B1ADOF50Hds, & + B1ADOF51Hds,B1ADOF51Hds,B1ADOF51Hds,B1ADOF51Hds,B1ADOF51Hds,B1ADOF51Hds,B1ADOF51Hds,B1ADOF51Hds,B1ADOF51Hds, & + B1ADOF52Hds,B1ADOF52Hds,B1ADOF52Hds,B1ADOF52Hds,B1ADOF52Hds,B1ADOF52Hds,B1ADOF52Hds,B1ADOF52Hds,B1ADOF52Hds, & + B1ADOF53Hds,B1ADOF53Hds,B1ADOF53Hds,B1ADOF53Hds,B1ADOF53Hds,B1ADOF53Hds,B1ADOF53Hds,B1ADOF53Hds,B1ADOF53Hds, & + B1ADOF54Hds,B1ADOF54Hds,B1ADOF54Hds,B1ADOF54Hds,B1ADOF54Hds,B1ADOF54Hds,B1ADOF54Hds,B1ADOF54Hds,B1ADOF54Hds, & + B1ADOF55Hds,B1ADOF55Hds,B1ADOF55Hds,B1ADOF55Hds,B1ADOF55Hds,B1ADOF55Hds,B1ADOF55Hds,B1ADOF55Hds,B1ADOF55Hds, & + B1ADOF56Hds,B1ADOF56Hds,B1ADOF56Hds,B1ADOF56Hds,B1ADOF56Hds,B1ADOF56Hds,B1ADOF56Hds,B1ADOF56Hds,B1ADOF56Hds, & + B1ADOF57Hds,B1ADOF57Hds,B1ADOF57Hds,B1ADOF57Hds,B1ADOF57Hds,B1ADOF57Hds,B1ADOF57Hds,B1ADOF57Hds,B1ADOF57Hds, & + B1ADOF58Hds,B1ADOF58Hds,B1ADOF58Hds,B1ADOF58Hds,B1ADOF58Hds,B1ADOF58Hds,B1ADOF58Hds,B1ADOF58Hds,B1ADOF58Hds, & + B1ADOF59Hds,B1ADOF59Hds,B1ADOF59Hds,B1ADOF59Hds,B1ADOF59Hds,B1ADOF59Hds,B1ADOF59Hds,B1ADOF59Hds,B1ADOF59Hds, & + B1ADOF60Hds,B1ADOF60Hds,B1ADOF60Hds,B1ADOF60Hds,B1ADOF60Hds,B1ADOF60Hds,B1ADOF60Hds,B1ADOF60Hds,B1ADOF60Hds, & + B1ADOF61Hds,B1ADOF61Hds,B1ADOF61Hds,B1ADOF61Hds,B1ADOF61Hds,B1ADOF61Hds,B1ADOF61Hds,B1ADOF61Hds,B1ADOF61Hds, & + B1ADOF62Hds,B1ADOF62Hds,B1ADOF62Hds,B1ADOF62Hds,B1ADOF62Hds,B1ADOF62Hds,B1ADOF62Hds,B1ADOF62Hds,B1ADOF62Hds, & + B1ADOF63Hds,B1ADOF63Hds,B1ADOF63Hds,B1ADOF63Hds,B1ADOF63Hds,B1ADOF63Hds,B1ADOF63Hds,B1ADOF63Hds,B1ADOF63Hds, & + B1ADOF64Hds,B1ADOF64Hds,B1ADOF64Hds,B1ADOF64Hds,B1ADOF64Hds,B1ADOF64Hds,B1ADOF64Hds,B1ADOF64Hds,B1ADOF64Hds, & + B1ADOF65Hds,B1ADOF65Hds,B1ADOF65Hds,B1ADOF65Hds,B1ADOF65Hds,B1ADOF65Hds,B1ADOF65Hds,B1ADOF65Hds,B1ADOF65Hds, & + B1ADOF66Hds,B1ADOF66Hds,B1ADOF66Hds,B1ADOF66Hds,B1ADOF66Hds,B1ADOF66Hds,B1ADOF66Hds,B1ADOF66Hds,B1ADOF66Hds, & + B1ADOF67Hds,B1ADOF67Hds,B1ADOF67Hds,B1ADOF67Hds,B1ADOF67Hds,B1ADOF67Hds,B1ADOF67Hds,B1ADOF67Hds,B1ADOF67Hds, & + B1ADOF68Hds,B1ADOF68Hds,B1ADOF68Hds,B1ADOF68Hds,B1ADOF68Hds,B1ADOF68Hds,B1ADOF68Hds,B1ADOF68Hds,B1ADOF68Hds, & + B1ADOF69Hds,B1ADOF69Hds,B1ADOF69Hds,B1ADOF69Hds,B1ADOF69Hds,B1ADOF69Hds,B1ADOF69Hds,B1ADOF69Hds,B1ADOF69Hds, & + B1ADOF70Hds,B1ADOF70Hds,B1ADOF70Hds,B1ADOF70Hds,B1ADOF70Hds,B1ADOF70Hds,B1ADOF70Hds,B1ADOF70Hds,B1ADOF70Hds, & + B1ADOF71Hds,B1ADOF71Hds,B1ADOF71Hds,B1ADOF71Hds,B1ADOF71Hds,B1ADOF71Hds,B1ADOF71Hds,B1ADOF71Hds,B1ADOF71Hds, & + B1ADOF72Hds,B1ADOF72Hds,B1ADOF72Hds,B1ADOF72Hds,B1ADOF72Hds,B1ADOF72Hds,B1ADOF72Hds,B1ADOF72Hds,B1ADOF72Hds, & + B1ADOF73Hds,B1ADOF73Hds,B1ADOF73Hds,B1ADOF73Hds,B1ADOF73Hds,B1ADOF73Hds,B1ADOF73Hds,B1ADOF73Hds,B1ADOF73Hds, & + B1ADOF74Hds,B1ADOF74Hds,B1ADOF74Hds,B1ADOF74Hds,B1ADOF74Hds,B1ADOF74Hds,B1ADOF74Hds,B1ADOF74Hds,B1ADOF74Hds, & + B1ADOF75Hds,B1ADOF75Hds,B1ADOF75Hds,B1ADOF75Hds,B1ADOF75Hds,B1ADOF75Hds,B1ADOF75Hds,B1ADOF75Hds,B1ADOF75Hds, & + B1ADOF76Hds,B1ADOF76Hds,B1ADOF76Hds,B1ADOF76Hds,B1ADOF76Hds,B1ADOF76Hds,B1ADOF76Hds,B1ADOF76Hds,B1ADOF76Hds, & + B1ADOF77Hds,B1ADOF77Hds,B1ADOF77Hds,B1ADOF77Hds,B1ADOF77Hds,B1ADOF77Hds,B1ADOF77Hds,B1ADOF77Hds,B1ADOF77Hds, & + B1ADOF78Hds,B1ADOF78Hds,B1ADOF78Hds,B1ADOF78Hds,B1ADOF78Hds,B1ADOF78Hds,B1ADOF78Hds,B1ADOF78Hds,B1ADOF78Hds, & + B1ADOF79Hds,B1ADOF79Hds,B1ADOF79Hds,B1ADOF79Hds,B1ADOF79Hds,B1ADOF79Hds,B1ADOF79Hds,B1ADOF79Hds,B1ADOF79Hds, & + B1ADOF80Hds,B1ADOF80Hds,B1ADOF80Hds,B1ADOF80Hds,B1ADOF80Hds,B1ADOF80Hds,B1ADOF80Hds,B1ADOF80Hds,B1ADOF80Hds, & + B1ADOF81Hds,B1ADOF81Hds,B1ADOF81Hds,B1ADOF81Hds,B1ADOF81Hds,B1ADOF81Hds,B1ADOF81Hds,B1ADOF81Hds,B1ADOF81Hds, & + B1ADOF82Hds,B1ADOF82Hds,B1ADOF82Hds,B1ADOF82Hds,B1ADOF82Hds,B1ADOF82Hds,B1ADOF82Hds,B1ADOF82Hds,B1ADOF82Hds, & + B1ADOF83Hds,B1ADOF83Hds,B1ADOF83Hds,B1ADOF83Hds,B1ADOF83Hds,B1ADOF83Hds,B1ADOF83Hds,B1ADOF83Hds,B1ADOF83Hds, & + B1ADOF84Hds,B1ADOF84Hds,B1ADOF84Hds,B1ADOF84Hds,B1ADOF84Hds,B1ADOF84Hds,B1ADOF84Hds,B1ADOF84Hds,B1ADOF84Hds, & + B1ADOF85Hds,B1ADOF85Hds,B1ADOF85Hds,B1ADOF85Hds,B1ADOF85Hds,B1ADOF85Hds,B1ADOF85Hds,B1ADOF85Hds,B1ADOF85Hds, & + B1ADOF86Hds,B1ADOF86Hds,B1ADOF86Hds,B1ADOF86Hds,B1ADOF86Hds,B1ADOF86Hds,B1ADOF86Hds,B1ADOF86Hds,B1ADOF86Hds, & + B1ADOF87Hds,B1ADOF87Hds,B1ADOF87Hds,B1ADOF87Hds,B1ADOF87Hds,B1ADOF87Hds,B1ADOF87Hds,B1ADOF87Hds,B1ADOF87Hds, & + B1ADOF88Hds,B1ADOF88Hds,B1ADOF88Hds,B1ADOF88Hds,B1ADOF88Hds,B1ADOF88Hds,B1ADOF88Hds,B1ADOF88Hds,B1ADOF88Hds, & + B1ADOF89Hds,B1ADOF89Hds,B1ADOF89Hds,B1ADOF89Hds,B1ADOF89Hds,B1ADOF89Hds,B1ADOF89Hds,B1ADOF89Hds,B1ADOF89Hds, & + B1ADOF90Hds,B1ADOF90Hds,B1ADOF90Hds,B1ADOF90Hds,B1ADOF90Hds,B1ADOF90Hds,B1ADOF90Hds,B1ADOF90Hds,B1ADOF90Hds, & + B1ADOF91Hds,B1ADOF91Hds,B1ADOF91Hds,B1ADOF91Hds,B1ADOF91Hds,B1ADOF91Hds,B1ADOF91Hds,B1ADOF91Hds,B1ADOF91Hds, & + B1ADOF92Hds,B1ADOF92Hds,B1ADOF92Hds,B1ADOF92Hds,B1ADOF92Hds,B1ADOF92Hds,B1ADOF92Hds,B1ADOF92Hds,B1ADOF92Hds, & + B1ADOF93Hds,B1ADOF93Hds,B1ADOF93Hds,B1ADOF93Hds,B1ADOF93Hds,B1ADOF93Hds,B1ADOF93Hds,B1ADOF93Hds,B1ADOF93Hds, & + B1ADOF94Hds,B1ADOF94Hds,B1ADOF94Hds,B1ADOF94Hds,B1ADOF94Hds,B1ADOF94Hds,B1ADOF94Hds,B1ADOF94Hds,B1ADOF94Hds, & + B1ADOF95Hds,B1ADOF95Hds,B1ADOF95Hds,B1ADOF95Hds,B1ADOF95Hds,B1ADOF95Hds,B1ADOF95Hds,B1ADOF95Hds,B1ADOF95Hds, & + B1ADOF96Hds,B1ADOF96Hds,B1ADOF96Hds,B1ADOF96Hds,B1ADOF96Hds,B1ADOF96Hds,B1ADOF96Hds,B1ADOF96Hds,B1ADOF96Hds, & + B1ADOF97Hds,B1ADOF97Hds,B1ADOF97Hds,B1ADOF97Hds,B1ADOF97Hds,B1ADOF97Hds,B1ADOF97Hds,B1ADOF97Hds,B1ADOF97Hds, & + B1ADOF98Hds,B1ADOF98Hds,B1ADOF98Hds,B1ADOF98Hds,B1ADOF98Hds,B1ADOF98Hds,B1ADOF98Hds,B1ADOF98Hds,B1ADOF98Hds, & + B1ADOF99Hds,B1ADOF99Hds,B1ADOF99Hds,B1ADOF99Hds,B1ADOF99Hds,B1ADOF99Hds,B1ADOF99Hds,B1ADOF99Hds,B1ADOF99Hds/), & + (/9,99/))) + INTEGER, PARAMETER :: FADOFWvs(99,9) = transpose(reshape((/B1ADOF1Wvs,B1ADOF1Wvs,B1ADOF1Wvs,B1ADOF1Wvs,B1ADOF1Wvs,B1ADOF1Wvs,B1ADOF1Wvs,B1ADOF1Wvs,B1ADOF1Wvs, & + B1ADOF2Wvs,B1ADOF2Wvs,B1ADOF2Wvs,B1ADOF2Wvs,B1ADOF2Wvs,B1ADOF2Wvs,B1ADOF2Wvs,B1ADOF2Wvs,B1ADOF2Wvs, & + B1ADOF3Wvs,B1ADOF3Wvs,B1ADOF3Wvs,B1ADOF3Wvs,B1ADOF3Wvs,B1ADOF3Wvs,B1ADOF3Wvs,B1ADOF3Wvs,B1ADOF3Wvs, & + B1ADOF4Wvs,B1ADOF4Wvs,B1ADOF4Wvs,B1ADOF4Wvs,B1ADOF4Wvs,B1ADOF4Wvs,B1ADOF4Wvs,B1ADOF4Wvs,B1ADOF4Wvs, & + B1ADOF5Wvs,B1ADOF5Wvs,B1ADOF5Wvs,B1ADOF5Wvs,B1ADOF5Wvs,B1ADOF5Wvs,B1ADOF5Wvs,B1ADOF5Wvs,B1ADOF5Wvs, & + B1ADOF6Wvs,B1ADOF6Wvs,B1ADOF6Wvs,B1ADOF6Wvs,B1ADOF6Wvs,B1ADOF6Wvs,B1ADOF6Wvs,B1ADOF6Wvs,B1ADOF6Wvs, & + B1ADOF7Wvs,B1ADOF7Wvs,B1ADOF7Wvs,B1ADOF7Wvs,B1ADOF7Wvs,B1ADOF7Wvs,B1ADOF7Wvs,B1ADOF7Wvs,B1ADOF7Wvs, & + B1ADOF8Wvs,B1ADOF8Wvs,B1ADOF8Wvs,B1ADOF8Wvs,B1ADOF8Wvs,B1ADOF8Wvs,B1ADOF8Wvs,B1ADOF8Wvs,B1ADOF8Wvs, & + B1ADOF9Wvs,B1ADOF9Wvs,B1ADOF9Wvs,B1ADOF9Wvs,B1ADOF9Wvs,B1ADOF9Wvs,B1ADOF9Wvs,B1ADOF9Wvs,B1ADOF9Wvs, & + B1ADOF10Wvs,B1ADOF10Wvs,B1ADOF10Wvs,B1ADOF10Wvs,B1ADOF10Wvs,B1ADOF10Wvs,B1ADOF10Wvs,B1ADOF10Wvs,B1ADOF10Wvs, & + B1ADOF11Wvs,B1ADOF11Wvs,B1ADOF11Wvs,B1ADOF11Wvs,B1ADOF11Wvs,B1ADOF11Wvs,B1ADOF11Wvs,B1ADOF11Wvs,B1ADOF11Wvs, & + B1ADOF12Wvs,B1ADOF12Wvs,B1ADOF12Wvs,B1ADOF12Wvs,B1ADOF12Wvs,B1ADOF12Wvs,B1ADOF12Wvs,B1ADOF12Wvs,B1ADOF12Wvs, & + B1ADOF13Wvs,B1ADOF13Wvs,B1ADOF13Wvs,B1ADOF13Wvs,B1ADOF13Wvs,B1ADOF13Wvs,B1ADOF13Wvs,B1ADOF13Wvs,B1ADOF13Wvs, & + B1ADOF14Wvs,B1ADOF14Wvs,B1ADOF14Wvs,B1ADOF14Wvs,B1ADOF14Wvs,B1ADOF14Wvs,B1ADOF14Wvs,B1ADOF14Wvs,B1ADOF14Wvs, & + B1ADOF15Wvs,B1ADOF15Wvs,B1ADOF15Wvs,B1ADOF15Wvs,B1ADOF15Wvs,B1ADOF15Wvs,B1ADOF15Wvs,B1ADOF15Wvs,B1ADOF15Wvs, & + B1ADOF16Wvs,B1ADOF16Wvs,B1ADOF16Wvs,B1ADOF16Wvs,B1ADOF16Wvs,B1ADOF16Wvs,B1ADOF16Wvs,B1ADOF16Wvs,B1ADOF16Wvs, & + B1ADOF17Wvs,B1ADOF17Wvs,B1ADOF17Wvs,B1ADOF17Wvs,B1ADOF17Wvs,B1ADOF17Wvs,B1ADOF17Wvs,B1ADOF17Wvs,B1ADOF17Wvs, & + B1ADOF18Wvs,B1ADOF18Wvs,B1ADOF18Wvs,B1ADOF18Wvs,B1ADOF18Wvs,B1ADOF18Wvs,B1ADOF18Wvs,B1ADOF18Wvs,B1ADOF18Wvs, & + B1ADOF19Wvs,B1ADOF19Wvs,B1ADOF19Wvs,B1ADOF19Wvs,B1ADOF19Wvs,B1ADOF19Wvs,B1ADOF19Wvs,B1ADOF19Wvs,B1ADOF19Wvs, & + B1ADOF20Wvs,B1ADOF20Wvs,B1ADOF20Wvs,B1ADOF20Wvs,B1ADOF20Wvs,B1ADOF20Wvs,B1ADOF20Wvs,B1ADOF20Wvs,B1ADOF20Wvs, & + B1ADOF21Wvs,B1ADOF21Wvs,B1ADOF21Wvs,B1ADOF21Wvs,B1ADOF21Wvs,B1ADOF21Wvs,B1ADOF21Wvs,B1ADOF21Wvs,B1ADOF21Wvs, & + B1ADOF22Wvs,B1ADOF22Wvs,B1ADOF22Wvs,B1ADOF22Wvs,B1ADOF22Wvs,B1ADOF22Wvs,B1ADOF22Wvs,B1ADOF22Wvs,B1ADOF22Wvs, & + B1ADOF23Wvs,B1ADOF23Wvs,B1ADOF23Wvs,B1ADOF23Wvs,B1ADOF23Wvs,B1ADOF23Wvs,B1ADOF23Wvs,B1ADOF23Wvs,B1ADOF23Wvs, & + B1ADOF24Wvs,B1ADOF24Wvs,B1ADOF24Wvs,B1ADOF24Wvs,B1ADOF24Wvs,B1ADOF24Wvs,B1ADOF24Wvs,B1ADOF24Wvs,B1ADOF24Wvs, & + B1ADOF25Wvs,B1ADOF25Wvs,B1ADOF25Wvs,B1ADOF25Wvs,B1ADOF25Wvs,B1ADOF25Wvs,B1ADOF25Wvs,B1ADOF25Wvs,B1ADOF25Wvs, & + B1ADOF26Wvs,B1ADOF26Wvs,B1ADOF26Wvs,B1ADOF26Wvs,B1ADOF26Wvs,B1ADOF26Wvs,B1ADOF26Wvs,B1ADOF26Wvs,B1ADOF26Wvs, & + B1ADOF27Wvs,B1ADOF27Wvs,B1ADOF27Wvs,B1ADOF27Wvs,B1ADOF27Wvs,B1ADOF27Wvs,B1ADOF27Wvs,B1ADOF27Wvs,B1ADOF27Wvs, & + B1ADOF28Wvs,B1ADOF28Wvs,B1ADOF28Wvs,B1ADOF28Wvs,B1ADOF28Wvs,B1ADOF28Wvs,B1ADOF28Wvs,B1ADOF28Wvs,B1ADOF28Wvs, & + B1ADOF29Wvs,B1ADOF29Wvs,B1ADOF29Wvs,B1ADOF29Wvs,B1ADOF29Wvs,B1ADOF29Wvs,B1ADOF29Wvs,B1ADOF29Wvs,B1ADOF29Wvs, & + B1ADOF30Wvs,B1ADOF30Wvs,B1ADOF30Wvs,B1ADOF30Wvs,B1ADOF30Wvs,B1ADOF30Wvs,B1ADOF30Wvs,B1ADOF30Wvs,B1ADOF30Wvs, & + B1ADOF31Wvs,B1ADOF31Wvs,B1ADOF31Wvs,B1ADOF31Wvs,B1ADOF31Wvs,B1ADOF31Wvs,B1ADOF31Wvs,B1ADOF31Wvs,B1ADOF31Wvs, & + B1ADOF32Wvs,B1ADOF32Wvs,B1ADOF32Wvs,B1ADOF32Wvs,B1ADOF32Wvs,B1ADOF32Wvs,B1ADOF32Wvs,B1ADOF32Wvs,B1ADOF32Wvs, & + B1ADOF33Wvs,B1ADOF33Wvs,B1ADOF33Wvs,B1ADOF33Wvs,B1ADOF33Wvs,B1ADOF33Wvs,B1ADOF33Wvs,B1ADOF33Wvs,B1ADOF33Wvs, & + B1ADOF34Wvs,B1ADOF34Wvs,B1ADOF34Wvs,B1ADOF34Wvs,B1ADOF34Wvs,B1ADOF34Wvs,B1ADOF34Wvs,B1ADOF34Wvs,B1ADOF34Wvs, & + B1ADOF35Wvs,B1ADOF35Wvs,B1ADOF35Wvs,B1ADOF35Wvs,B1ADOF35Wvs,B1ADOF35Wvs,B1ADOF35Wvs,B1ADOF35Wvs,B1ADOF35Wvs, & + B1ADOF36Wvs,B1ADOF36Wvs,B1ADOF36Wvs,B1ADOF36Wvs,B1ADOF36Wvs,B1ADOF36Wvs,B1ADOF36Wvs,B1ADOF36Wvs,B1ADOF36Wvs, & + B1ADOF37Wvs,B1ADOF37Wvs,B1ADOF37Wvs,B1ADOF37Wvs,B1ADOF37Wvs,B1ADOF37Wvs,B1ADOF37Wvs,B1ADOF37Wvs,B1ADOF37Wvs, & + B1ADOF38Wvs,B1ADOF38Wvs,B1ADOF38Wvs,B1ADOF38Wvs,B1ADOF38Wvs,B1ADOF38Wvs,B1ADOF38Wvs,B1ADOF38Wvs,B1ADOF38Wvs, & + B1ADOF39Wvs,B1ADOF39Wvs,B1ADOF39Wvs,B1ADOF39Wvs,B1ADOF39Wvs,B1ADOF39Wvs,B1ADOF39Wvs,B1ADOF39Wvs,B1ADOF39Wvs, & + B1ADOF40Wvs,B1ADOF40Wvs,B1ADOF40Wvs,B1ADOF40Wvs,B1ADOF40Wvs,B1ADOF40Wvs,B1ADOF40Wvs,B1ADOF40Wvs,B1ADOF40Wvs, & + B1ADOF41Wvs,B1ADOF41Wvs,B1ADOF41Wvs,B1ADOF41Wvs,B1ADOF41Wvs,B1ADOF41Wvs,B1ADOF41Wvs,B1ADOF41Wvs,B1ADOF41Wvs, & + B1ADOF42Wvs,B1ADOF42Wvs,B1ADOF42Wvs,B1ADOF42Wvs,B1ADOF42Wvs,B1ADOF42Wvs,B1ADOF42Wvs,B1ADOF42Wvs,B1ADOF42Wvs, & + B1ADOF43Wvs,B1ADOF43Wvs,B1ADOF43Wvs,B1ADOF43Wvs,B1ADOF43Wvs,B1ADOF43Wvs,B1ADOF43Wvs,B1ADOF43Wvs,B1ADOF43Wvs, & + B1ADOF44Wvs,B1ADOF44Wvs,B1ADOF44Wvs,B1ADOF44Wvs,B1ADOF44Wvs,B1ADOF44Wvs,B1ADOF44Wvs,B1ADOF44Wvs,B1ADOF44Wvs, & + B1ADOF45Wvs,B1ADOF45Wvs,B1ADOF45Wvs,B1ADOF45Wvs,B1ADOF45Wvs,B1ADOF45Wvs,B1ADOF45Wvs,B1ADOF45Wvs,B1ADOF45Wvs, & + B1ADOF46Wvs,B1ADOF46Wvs,B1ADOF46Wvs,B1ADOF46Wvs,B1ADOF46Wvs,B1ADOF46Wvs,B1ADOF46Wvs,B1ADOF46Wvs,B1ADOF46Wvs, & + B1ADOF47Wvs,B1ADOF47Wvs,B1ADOF47Wvs,B1ADOF47Wvs,B1ADOF47Wvs,B1ADOF47Wvs,B1ADOF47Wvs,B1ADOF47Wvs,B1ADOF47Wvs, & + B1ADOF48Wvs,B1ADOF48Wvs,B1ADOF48Wvs,B1ADOF48Wvs,B1ADOF48Wvs,B1ADOF48Wvs,B1ADOF48Wvs,B1ADOF48Wvs,B1ADOF48Wvs, & + B1ADOF49Wvs,B1ADOF49Wvs,B1ADOF49Wvs,B1ADOF49Wvs,B1ADOF49Wvs,B1ADOF49Wvs,B1ADOF49Wvs,B1ADOF49Wvs,B1ADOF49Wvs, & + B1ADOF50Wvs,B1ADOF50Wvs,B1ADOF50Wvs,B1ADOF50Wvs,B1ADOF50Wvs,B1ADOF50Wvs,B1ADOF50Wvs,B1ADOF50Wvs,B1ADOF50Wvs, & + B1ADOF51Wvs,B1ADOF51Wvs,B1ADOF51Wvs,B1ADOF51Wvs,B1ADOF51Wvs,B1ADOF51Wvs,B1ADOF51Wvs,B1ADOF51Wvs,B1ADOF51Wvs, & + B1ADOF52Wvs,B1ADOF52Wvs,B1ADOF52Wvs,B1ADOF52Wvs,B1ADOF52Wvs,B1ADOF52Wvs,B1ADOF52Wvs,B1ADOF52Wvs,B1ADOF52Wvs, & + B1ADOF53Wvs,B1ADOF53Wvs,B1ADOF53Wvs,B1ADOF53Wvs,B1ADOF53Wvs,B1ADOF53Wvs,B1ADOF53Wvs,B1ADOF53Wvs,B1ADOF53Wvs, & + B1ADOF54Wvs,B1ADOF54Wvs,B1ADOF54Wvs,B1ADOF54Wvs,B1ADOF54Wvs,B1ADOF54Wvs,B1ADOF54Wvs,B1ADOF54Wvs,B1ADOF54Wvs, & + B1ADOF55Wvs,B1ADOF55Wvs,B1ADOF55Wvs,B1ADOF55Wvs,B1ADOF55Wvs,B1ADOF55Wvs,B1ADOF55Wvs,B1ADOF55Wvs,B1ADOF55Wvs, & + B1ADOF56Wvs,B1ADOF56Wvs,B1ADOF56Wvs,B1ADOF56Wvs,B1ADOF56Wvs,B1ADOF56Wvs,B1ADOF56Wvs,B1ADOF56Wvs,B1ADOF56Wvs, & + B1ADOF57Wvs,B1ADOF57Wvs,B1ADOF57Wvs,B1ADOF57Wvs,B1ADOF57Wvs,B1ADOF57Wvs,B1ADOF57Wvs,B1ADOF57Wvs,B1ADOF57Wvs, & + B1ADOF58Wvs,B1ADOF58Wvs,B1ADOF58Wvs,B1ADOF58Wvs,B1ADOF58Wvs,B1ADOF58Wvs,B1ADOF58Wvs,B1ADOF58Wvs,B1ADOF58Wvs, & + B1ADOF59Wvs,B1ADOF59Wvs,B1ADOF59Wvs,B1ADOF59Wvs,B1ADOF59Wvs,B1ADOF59Wvs,B1ADOF59Wvs,B1ADOF59Wvs,B1ADOF59Wvs, & + B1ADOF60Wvs,B1ADOF60Wvs,B1ADOF60Wvs,B1ADOF60Wvs,B1ADOF60Wvs,B1ADOF60Wvs,B1ADOF60Wvs,B1ADOF60Wvs,B1ADOF60Wvs, & + B1ADOF61Wvs,B1ADOF61Wvs,B1ADOF61Wvs,B1ADOF61Wvs,B1ADOF61Wvs,B1ADOF61Wvs,B1ADOF61Wvs,B1ADOF61Wvs,B1ADOF61Wvs, & + B1ADOF62Wvs,B1ADOF62Wvs,B1ADOF62Wvs,B1ADOF62Wvs,B1ADOF62Wvs,B1ADOF62Wvs,B1ADOF62Wvs,B1ADOF62Wvs,B1ADOF62Wvs, & + B1ADOF63Wvs,B1ADOF63Wvs,B1ADOF63Wvs,B1ADOF63Wvs,B1ADOF63Wvs,B1ADOF63Wvs,B1ADOF63Wvs,B1ADOF63Wvs,B1ADOF63Wvs, & + B1ADOF64Wvs,B1ADOF64Wvs,B1ADOF64Wvs,B1ADOF64Wvs,B1ADOF64Wvs,B1ADOF64Wvs,B1ADOF64Wvs,B1ADOF64Wvs,B1ADOF64Wvs, & + B1ADOF65Wvs,B1ADOF65Wvs,B1ADOF65Wvs,B1ADOF65Wvs,B1ADOF65Wvs,B1ADOF65Wvs,B1ADOF65Wvs,B1ADOF65Wvs,B1ADOF65Wvs, & + B1ADOF66Wvs,B1ADOF66Wvs,B1ADOF66Wvs,B1ADOF66Wvs,B1ADOF66Wvs,B1ADOF66Wvs,B1ADOF66Wvs,B1ADOF66Wvs,B1ADOF66Wvs, & + B1ADOF67Wvs,B1ADOF67Wvs,B1ADOF67Wvs,B1ADOF67Wvs,B1ADOF67Wvs,B1ADOF67Wvs,B1ADOF67Wvs,B1ADOF67Wvs,B1ADOF67Wvs, & + B1ADOF68Wvs,B1ADOF68Wvs,B1ADOF68Wvs,B1ADOF68Wvs,B1ADOF68Wvs,B1ADOF68Wvs,B1ADOF68Wvs,B1ADOF68Wvs,B1ADOF68Wvs, & + B1ADOF69Wvs,B1ADOF69Wvs,B1ADOF69Wvs,B1ADOF69Wvs,B1ADOF69Wvs,B1ADOF69Wvs,B1ADOF69Wvs,B1ADOF69Wvs,B1ADOF69Wvs, & + B1ADOF70Wvs,B1ADOF70Wvs,B1ADOF70Wvs,B1ADOF70Wvs,B1ADOF70Wvs,B1ADOF70Wvs,B1ADOF70Wvs,B1ADOF70Wvs,B1ADOF70Wvs, & + B1ADOF71Wvs,B1ADOF71Wvs,B1ADOF71Wvs,B1ADOF71Wvs,B1ADOF71Wvs,B1ADOF71Wvs,B1ADOF71Wvs,B1ADOF71Wvs,B1ADOF71Wvs, & + B1ADOF72Wvs,B1ADOF72Wvs,B1ADOF72Wvs,B1ADOF72Wvs,B1ADOF72Wvs,B1ADOF72Wvs,B1ADOF72Wvs,B1ADOF72Wvs,B1ADOF72Wvs, & + B1ADOF73Wvs,B1ADOF73Wvs,B1ADOF73Wvs,B1ADOF73Wvs,B1ADOF73Wvs,B1ADOF73Wvs,B1ADOF73Wvs,B1ADOF73Wvs,B1ADOF73Wvs, & + B1ADOF74Wvs,B1ADOF74Wvs,B1ADOF74Wvs,B1ADOF74Wvs,B1ADOF74Wvs,B1ADOF74Wvs,B1ADOF74Wvs,B1ADOF74Wvs,B1ADOF74Wvs, & + B1ADOF75Wvs,B1ADOF75Wvs,B1ADOF75Wvs,B1ADOF75Wvs,B1ADOF75Wvs,B1ADOF75Wvs,B1ADOF75Wvs,B1ADOF75Wvs,B1ADOF75Wvs, & + B1ADOF76Wvs,B1ADOF76Wvs,B1ADOF76Wvs,B1ADOF76Wvs,B1ADOF76Wvs,B1ADOF76Wvs,B1ADOF76Wvs,B1ADOF76Wvs,B1ADOF76Wvs, & + B1ADOF77Wvs,B1ADOF77Wvs,B1ADOF77Wvs,B1ADOF77Wvs,B1ADOF77Wvs,B1ADOF77Wvs,B1ADOF77Wvs,B1ADOF77Wvs,B1ADOF77Wvs, & + B1ADOF78Wvs,B1ADOF78Wvs,B1ADOF78Wvs,B1ADOF78Wvs,B1ADOF78Wvs,B1ADOF78Wvs,B1ADOF78Wvs,B1ADOF78Wvs,B1ADOF78Wvs, & + B1ADOF79Wvs,B1ADOF79Wvs,B1ADOF79Wvs,B1ADOF79Wvs,B1ADOF79Wvs,B1ADOF79Wvs,B1ADOF79Wvs,B1ADOF79Wvs,B1ADOF79Wvs, & + B1ADOF80Wvs,B1ADOF80Wvs,B1ADOF80Wvs,B1ADOF80Wvs,B1ADOF80Wvs,B1ADOF80Wvs,B1ADOF80Wvs,B1ADOF80Wvs,B1ADOF80Wvs, & + B1ADOF81Wvs,B1ADOF81Wvs,B1ADOF81Wvs,B1ADOF81Wvs,B1ADOF81Wvs,B1ADOF81Wvs,B1ADOF81Wvs,B1ADOF81Wvs,B1ADOF81Wvs, & + B1ADOF82Wvs,B1ADOF82Wvs,B1ADOF82Wvs,B1ADOF82Wvs,B1ADOF82Wvs,B1ADOF82Wvs,B1ADOF82Wvs,B1ADOF82Wvs,B1ADOF82Wvs, & + B1ADOF83Wvs,B1ADOF83Wvs,B1ADOF83Wvs,B1ADOF83Wvs,B1ADOF83Wvs,B1ADOF83Wvs,B1ADOF83Wvs,B1ADOF83Wvs,B1ADOF83Wvs, & + B1ADOF84Wvs,B1ADOF84Wvs,B1ADOF84Wvs,B1ADOF84Wvs,B1ADOF84Wvs,B1ADOF84Wvs,B1ADOF84Wvs,B1ADOF84Wvs,B1ADOF84Wvs, & + B1ADOF85Wvs,B1ADOF85Wvs,B1ADOF85Wvs,B1ADOF85Wvs,B1ADOF85Wvs,B1ADOF85Wvs,B1ADOF85Wvs,B1ADOF85Wvs,B1ADOF85Wvs, & + B1ADOF86Wvs,B1ADOF86Wvs,B1ADOF86Wvs,B1ADOF86Wvs,B1ADOF86Wvs,B1ADOF86Wvs,B1ADOF86Wvs,B1ADOF86Wvs,B1ADOF86Wvs, & + B1ADOF87Wvs,B1ADOF87Wvs,B1ADOF87Wvs,B1ADOF87Wvs,B1ADOF87Wvs,B1ADOF87Wvs,B1ADOF87Wvs,B1ADOF87Wvs,B1ADOF87Wvs, & + B1ADOF88Wvs,B1ADOF88Wvs,B1ADOF88Wvs,B1ADOF88Wvs,B1ADOF88Wvs,B1ADOF88Wvs,B1ADOF88Wvs,B1ADOF88Wvs,B1ADOF88Wvs, & + B1ADOF89Wvs,B1ADOF89Wvs,B1ADOF89Wvs,B1ADOF89Wvs,B1ADOF89Wvs,B1ADOF89Wvs,B1ADOF89Wvs,B1ADOF89Wvs,B1ADOF89Wvs, & + B1ADOF90Wvs,B1ADOF90Wvs,B1ADOF90Wvs,B1ADOF90Wvs,B1ADOF90Wvs,B1ADOF90Wvs,B1ADOF90Wvs,B1ADOF90Wvs,B1ADOF90Wvs, & + B1ADOF91Wvs,B1ADOF91Wvs,B1ADOF91Wvs,B1ADOF91Wvs,B1ADOF91Wvs,B1ADOF91Wvs,B1ADOF91Wvs,B1ADOF91Wvs,B1ADOF91Wvs, & + B1ADOF92Wvs,B1ADOF92Wvs,B1ADOF92Wvs,B1ADOF92Wvs,B1ADOF92Wvs,B1ADOF92Wvs,B1ADOF92Wvs,B1ADOF92Wvs,B1ADOF92Wvs, & + B1ADOF93Wvs,B1ADOF93Wvs,B1ADOF93Wvs,B1ADOF93Wvs,B1ADOF93Wvs,B1ADOF93Wvs,B1ADOF93Wvs,B1ADOF93Wvs,B1ADOF93Wvs, & + B1ADOF94Wvs,B1ADOF94Wvs,B1ADOF94Wvs,B1ADOF94Wvs,B1ADOF94Wvs,B1ADOF94Wvs,B1ADOF94Wvs,B1ADOF94Wvs,B1ADOF94Wvs, & + B1ADOF95Wvs,B1ADOF95Wvs,B1ADOF95Wvs,B1ADOF95Wvs,B1ADOF95Wvs,B1ADOF95Wvs,B1ADOF95Wvs,B1ADOF95Wvs,B1ADOF95Wvs, & + B1ADOF96Wvs,B1ADOF96Wvs,B1ADOF96Wvs,B1ADOF96Wvs,B1ADOF96Wvs,B1ADOF96Wvs,B1ADOF96Wvs,B1ADOF96Wvs,B1ADOF96Wvs, & + B1ADOF97Wvs,B1ADOF97Wvs,B1ADOF97Wvs,B1ADOF97Wvs,B1ADOF97Wvs,B1ADOF97Wvs,B1ADOF97Wvs,B1ADOF97Wvs,B1ADOF97Wvs, & + B1ADOF98Wvs,B1ADOF98Wvs,B1ADOF98Wvs,B1ADOF98Wvs,B1ADOF98Wvs,B1ADOF98Wvs,B1ADOF98Wvs,B1ADOF98Wvs,B1ADOF98Wvs, & + B1ADOF99Wvs,B1ADOF99Wvs,B1ADOF99Wvs,B1ADOF99Wvs,B1ADOF99Wvs,B1ADOF99Wvs,B1ADOF99Wvs,B1ADOF99Wvs,B1ADOF99Wvs/), & + (/9,99/))) + INTEGER, PARAMETER :: WBMotions(6,9) = transpose(reshape((/B1Surge,B2Surge,B3Surge,B4Surge,B5Surge,B6Surge,B7Surge,B8Surge,B9Surge, & B1Sway ,B2Sway ,B3Sway ,B4Sway ,B5Sway ,B6Sway ,B7Sway ,B8Sway ,B9Sway , & B1Heave,B2Heave,B3Heave,B4Heave,B5Heave,B6Heave,B7Heave,B8Heave,B9Heave, & @@ -652,74 +7289,1280 @@ MODULE HydroDyn_Output INTEGER, PARAMETER :: PRPMotions(6) = (/PRPSurge,PRPSway,PRPHeave,PRPRoll,PRPPitch,PRPYaw/) INTEGER, PARAMETER :: PRPVel(6) = (/PRPTVxi, PRPTVyi,PRPTVzi, PRPRVxi,PRPRVyi, PRPRVzi/) INTEGER, PARAMETER :: PRPAcc(6) = (/PRPTAxi, PRPTAyi,PRPTAzi, PRPRAxi,PRPRAyi, PRPRAzi/) - - - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(510) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "B1ADDFXI ","B1ADDFYI ","B1ADDFZI ","B1ADDMXI ","B1ADDMYI ","B1ADDMZI ","B1HDSFXI ","B1HDSFYI ", & - "B1HDSFZI ","B1HDSMXI ","B1HDSMYI ","B1HDSMZI ","B1HEAVE ","B1PITCH ","B1RAXI ","B1RAYI ", & - "B1RAZI ","B1RDTFXI ","B1RDTFYI ","B1RDTFZI ","B1RDTMXI ","B1RDTMYI ","B1RDTMZI ","B1ROLL ", & - "B1RVXI ","B1RVYI ","B1RVZI ","B1SURGE ","B1SWAY ","B1TAXI ","B1TAYI ","B1TAZI ", & - "B1TVXI ","B1TVYI ","B1TVZI ","B1WVSF1XI","B1WVSF1YI","B1WVSF1ZI","B1WVSF2XI","B1WVSF2YI", & - "B1WVSF2ZI","B1WVSFXI ","B1WVSFYI ","B1WVSFZI ","B1WVSM1XI","B1WVSM1YI","B1WVSM1ZI","B1WVSM2XI", & - "B1WVSM2YI","B1WVSM2ZI","B1WVSMXI ","B1WVSMYI ","B1WVSMZI ","B1YAW ","B2ADDFXI ","B2ADDFYI ", & - "B2ADDFZI ","B2ADDMXI ","B2ADDMYI ","B2ADDMZI ","B2HDSFXI ","B2HDSFYI ","B2HDSFZI ","B2HDSMXI ", & - "B2HDSMYI ","B2HDSMZI ","B2HEAVE ","B2PITCH ","B2RAXI ","B2RAYI ","B2RAZI ","B2RDTFXI ", & - "B2RDTFYI ","B2RDTFZI ","B2RDTMXI ","B2RDTMYI ","B2RDTMZI ","B2ROLL ","B2RVXI ","B2RVYI ", & - "B2RVZI ","B2SURGE ","B2SWAY ","B2TAXI ","B2TAYI ","B2TAZI ","B2TVXI ","B2TVYI ", & - "B2TVZI ","B2WVSF1XI","B2WVSF1YI","B2WVSF1ZI","B2WVSF2XI","B2WVSF2YI","B2WVSF2ZI","B2WVSFXI ", & - "B2WVSFYI ","B2WVSFZI ","B2WVSM1XI","B2WVSM1YI","B2WVSM1ZI","B2WVSM2XI","B2WVSM2YI","B2WVSM2ZI", & - "B2WVSMXI ","B2WVSMYI ","B2WVSMZI ","B2YAW ","B3ADDFXI ","B3ADDFYI ","B3ADDFZI ","B3ADDMXI ", & - "B3ADDMYI ","B3ADDMZI ","B3HDSFXI ","B3HDSFYI ","B3HDSFZI ","B3HDSMXI ","B3HDSMYI ","B3HDSMZI ", & - "B3HEAVE ","B3PITCH ","B3RAXI ","B3RAYI ","B3RAZI ","B3RDTFXI ","B3RDTFYI ","B3RDTFZI ", & - "B3RDTMXI ","B3RDTMYI ","B3RDTMZI ","B3ROLL ","B3RVXI ","B3RVYI ","B3RVZI ","B3SURGE ", & - "B3SWAY ","B3TAXI ","B3TAYI ","B3TAZI ","B3TVXI ","B3TVYI ","B3TVZI ","B3WVSF1XI", & - "B3WVSF1YI","B3WVSF1ZI","B3WVSF2XI","B3WVSF2YI","B3WVSF2ZI","B3WVSFXI ","B3WVSFYI ","B3WVSFZI ", & - "B3WVSM1XI","B3WVSM1YI","B3WVSM1ZI","B3WVSM2XI","B3WVSM2YI","B3WVSM2ZI","B3WVSMXI ","B3WVSMYI ", & - "B3WVSMZI ","B3YAW ","B4ADDFXI ","B4ADDFYI ","B4ADDFZI ","B4ADDMXI ","B4ADDMYI ","B4ADDMZI ", & - "B4HDSFXI ","B4HDSFYI ","B4HDSFZI ","B4HDSMXI ","B4HDSMYI ","B4HDSMZI ","B4HEAVE ","B4PITCH ", & - "B4RAXI ","B4RAYI ","B4RAZI ","B4RDTFXI ","B4RDTFYI ","B4RDTFZI ","B4RDTMXI ","B4RDTMYI ", & - "B4RDTMZI ","B4ROLL ","B4RVXI ","B4RVYI ","B4RVZI ","B4SURGE ","B4SWAY ","B4TAXI ", & - "B4TAYI ","B4TAZI ","B4TVXI ","B4TVYI ","B4TVZI ","B4WVSF1XI","B4WVSF1YI","B4WVSF1ZI", & - "B4WVSF2XI","B4WVSF2YI","B4WVSF2ZI","B4WVSFXI ","B4WVSFYI ","B4WVSFZI ","B4WVSM1XI","B4WVSM1YI", & - "B4WVSM1ZI","B4WVSM2XI","B4WVSM2YI","B4WVSM2ZI","B4WVSMXI ","B4WVSMYI ","B4WVSMZI ","B4YAW ", & - "B5ADDFXI ","B5ADDFYI ","B5ADDFZI ","B5ADDMXI ","B5ADDMYI ","B5ADDMZI ","B5HDSFXI ","B5HDSFYI ", & - "B5HDSFZI ","B5HDSMXI ","B5HDSMYI ","B5HDSMZI ","B5HEAVE ","B5PITCH ","B5RAXI ","B5RAYI ", & - "B5RAZI ","B5RDTFXI ","B5RDTFYI ","B5RDTFZI ","B5RDTMXI ","B5RDTMYI ","B5RDTMZI ","B5ROLL ", & - "B5RVXI ","B5RVYI ","B5RVZI ","B5SURGE ","B5SWAY ","B5TAXI ","B5TAYI ","B5TAZI ", & - "B5TVXI ","B5TVYI ","B5TVZI ","B5WVSF1XI","B5WVSF1YI","B5WVSF1ZI","B5WVSF2XI","B5WVSF2YI", & - "B5WVSF2ZI","B5WVSFXI ","B5WVSFYI ","B5WVSFZI ","B5WVSM1XI","B5WVSM1YI","B5WVSM1ZI","B5WVSM2XI", & - "B5WVSM2YI","B5WVSM2ZI","B5WVSMXI ","B5WVSMYI ","B5WVSMZI ","B5YAW ","B6ADDFXI ","B6ADDFYI ", & - "B6ADDFZI ","B6ADDMXI ","B6ADDMYI ","B6ADDMZI ","B6HDSFXI ","B6HDSFYI ","B6HDSFZI ","B6HDSMXI ", & - "B6HDSMYI ","B6HDSMZI ","B6HEAVE ","B6PITCH ","B6RAXI ","B6RAYI ","B6RAZI ","B6RDTFXI ", & - "B6RDTFYI ","B6RDTFZI ","B6RDTMXI ","B6RDTMYI ","B6RDTMZI ","B6ROLL ","B6RVXI ","B6RVYI ", & - "B6RVZI ","B6SURGE ","B6SWAY ","B6TAXI ","B6TAYI ","B6TAZI ","B6TVXI ","B6TVYI ", & - "B6TVZI ","B6WVSF1XI","B6WVSF1YI","B6WVSF1ZI","B6WVSF2XI","B6WVSF2YI","B6WVSF2ZI","B6WVSFXI ", & - "B6WVSFYI ","B6WVSFZI ","B6WVSM1XI","B6WVSM1YI","B6WVSM1ZI","B6WVSM2XI","B6WVSM2YI","B6WVSM2ZI", & - "B6WVSMXI ","B6WVSMYI ","B6WVSMZI ","B6YAW ","B7ADDFXI ","B7ADDFYI ","B7ADDFZI ","B7ADDMXI ", & - "B7ADDMYI ","B7ADDMZI ","B7HDSFXI ","B7HDSFYI ","B7HDSFZI ","B7HDSMXI ","B7HDSMYI ","B7HDSMZI ", & - "B7HEAVE ","B7PITCH ","B7RAXI ","B7RAYI ","B7RAZI ","B7RDTFXI ","B7RDTFYI ","B7RDTFZI ", & - "B7RDTMXI ","B7RDTMYI ","B7RDTMZI ","B7ROLL ","B7RVXI ","B7RVYI ","B7RVZI ","B7SURGE ", & - "B7SWAY ","B7TAXI ","B7TAYI ","B7TAZI ","B7TVXI ","B7TVYI ","B7TVZI ","B7WVSF1XI", & - "B7WVSF1YI","B7WVSF1ZI","B7WVSF2XI","B7WVSF2YI","B7WVSF2ZI","B7WVSFXI ","B7WVSFYI ","B7WVSFZI ", & - "B7WVSM1XI","B7WVSM1YI","B7WVSM1ZI","B7WVSM2XI","B7WVSM2YI","B7WVSM2ZI","B7WVSMXI ","B7WVSMYI ", & - "B7WVSMZI ","B7YAW ","B8ADDFXI ","B8ADDFYI ","B8ADDFZI ","B8ADDMXI ","B8ADDMYI ","B8ADDMZI ", & - "B8HDSFXI ","B8HDSFYI ","B8HDSFZI ","B8HDSMXI ","B8HDSMYI ","B8HDSMZI ","B8HEAVE ","B8PITCH ", & - "B8RAXI ","B8RAYI ","B8RAZI ","B8RDTFXI ","B8RDTFYI ","B8RDTFZI ","B8RDTMXI ","B8RDTMYI ", & - "B8RDTMZI ","B8ROLL ","B8RVXI ","B8RVYI ","B8RVZI ","B8SURGE ","B8SWAY ","B8TAXI ", & - "B8TAYI ","B8TAZI ","B8TVXI ","B8TVYI ","B8TVZI ","B8WVSF1XI","B8WVSF1YI","B8WVSF1ZI", & - "B8WVSF2XI","B8WVSF2YI","B8WVSF2ZI","B8WVSFXI ","B8WVSFYI ","B8WVSFZI ","B8WVSM1XI","B8WVSM1YI", & - "B8WVSM1ZI","B8WVSM2XI","B8WVSM2YI","B8WVSM2ZI","B8WVSMXI ","B8WVSMYI ","B8WVSMZI ","B8YAW ", & - "B9ADDFXI ","B9ADDFYI ","B9ADDFZI ","B9ADDMXI ","B9ADDMYI ","B9ADDMZI ","B9HDSFXI ","B9HDSFYI ", & - "B9HDSFZI ","B9HDSMXI ","B9HDSMYI ","B9HDSMZI ","B9HEAVE ","B9PITCH ","B9RAXI ","B9RAYI ", & - "B9RAZI ","B9RDTFXI ","B9RDTFYI ","B9RDTFZI ","B9RDTMXI ","B9RDTMYI ","B9RDTMZI ","B9ROLL ", & - "B9RVXI ","B9RVYI ","B9RVZI ","B9SURGE ","B9SWAY ","B9TAXI ","B9TAYI ","B9TAZI ", & - "B9TVXI ","B9TVYI ","B9TVZI ","B9WVSF1XI","B9WVSF1YI","B9WVSF1ZI","B9WVSF2XI","B9WVSF2YI", & - "B9WVSF2ZI","B9WVSFXI ","B9WVSFYI ","B9WVSFZI ","B9WVSM1XI","B9WVSM1YI","B9WVSM1ZI","B9WVSM2XI", & - "B9WVSM2YI","B9WVSM2ZI","B9WVSMXI ","B9WVSMYI ","B9WVSMZI ","B9YAW ","HYDROFXI ","HYDROFYI ", & - "HYDROFZI ","HYDROMXI ","HYDROMYI ","HYDROMZI ","PRPHEAVE ","PRPPITCH ","PRPRAXI ","PRPRAYI ", & - "PRPRAZI ","PRPROLL ","PRPRVXI ","PRPRVYI ","PRPRVZI ","PRPSURGE ","PRPSWAY ","PRPTAXI ", & - "PRPTAYI ","PRPTAZI ","PRPTVXI ","PRPTVYI ","PRPTVZI ","PRPYAW "/) + INTEGER, PARAMETER :: ADOFDsp(99,9) = transpose(reshape((/B1ADOF1D,B1ADOF1D,B1ADOF1D,B1ADOF1D,B1ADOF1D,B1ADOF1D,B1ADOF1D,B1ADOF1D,B1ADOF1D, & + B1ADOF2D,B1ADOF2D,B1ADOF2D,B1ADOF2D,B1ADOF2D,B1ADOF2D,B1ADOF2D,B1ADOF2D,B1ADOF2D, & + B1ADOF3D,B1ADOF3D,B1ADOF3D,B1ADOF3D,B1ADOF3D,B1ADOF3D,B1ADOF3D,B1ADOF3D,B1ADOF3D, & + B1ADOF4D,B1ADOF4D,B1ADOF4D,B1ADOF4D,B1ADOF4D,B1ADOF4D,B1ADOF4D,B1ADOF4D,B1ADOF4D, & + B1ADOF5D,B1ADOF5D,B1ADOF5D,B1ADOF5D,B1ADOF5D,B1ADOF5D,B1ADOF5D,B1ADOF5D,B1ADOF5D, & + B1ADOF6D,B1ADOF6D,B1ADOF6D,B1ADOF6D,B1ADOF6D,B1ADOF6D,B1ADOF6D,B1ADOF6D,B1ADOF6D, & + B1ADOF7D,B1ADOF7D,B1ADOF7D,B1ADOF7D,B1ADOF7D,B1ADOF7D,B1ADOF7D,B1ADOF7D,B1ADOF7D, & + B1ADOF8D,B1ADOF8D,B1ADOF8D,B1ADOF8D,B1ADOF8D,B1ADOF8D,B1ADOF8D,B1ADOF8D,B1ADOF8D, & + B1ADOF9D,B1ADOF9D,B1ADOF9D,B1ADOF9D,B1ADOF9D,B1ADOF9D,B1ADOF9D,B1ADOF9D,B1ADOF9D, & + B1ADOF10D,B1ADOF10D,B1ADOF10D,B1ADOF10D,B1ADOF10D,B1ADOF10D,B1ADOF10D,B1ADOF10D,B1ADOF10D, & + B1ADOF11D,B1ADOF11D,B1ADOF11D,B1ADOF11D,B1ADOF11D,B1ADOF11D,B1ADOF11D,B1ADOF11D,B1ADOF11D, & + B1ADOF12D,B1ADOF12D,B1ADOF12D,B1ADOF12D,B1ADOF12D,B1ADOF12D,B1ADOF12D,B1ADOF12D,B1ADOF12D, & + B1ADOF13D,B1ADOF13D,B1ADOF13D,B1ADOF13D,B1ADOF13D,B1ADOF13D,B1ADOF13D,B1ADOF13D,B1ADOF13D, & + B1ADOF14D,B1ADOF14D,B1ADOF14D,B1ADOF14D,B1ADOF14D,B1ADOF14D,B1ADOF14D,B1ADOF14D,B1ADOF14D, & + B1ADOF15D,B1ADOF15D,B1ADOF15D,B1ADOF15D,B1ADOF15D,B1ADOF15D,B1ADOF15D,B1ADOF15D,B1ADOF15D, & + B1ADOF16D,B1ADOF16D,B1ADOF16D,B1ADOF16D,B1ADOF16D,B1ADOF16D,B1ADOF16D,B1ADOF16D,B1ADOF16D, & + B1ADOF17D,B1ADOF17D,B1ADOF17D,B1ADOF17D,B1ADOF17D,B1ADOF17D,B1ADOF17D,B1ADOF17D,B1ADOF17D, & + B1ADOF18D,B1ADOF18D,B1ADOF18D,B1ADOF18D,B1ADOF18D,B1ADOF18D,B1ADOF18D,B1ADOF18D,B1ADOF18D, & + B1ADOF19D,B1ADOF19D,B1ADOF19D,B1ADOF19D,B1ADOF19D,B1ADOF19D,B1ADOF19D,B1ADOF19D,B1ADOF19D, & + B1ADOF20D,B1ADOF20D,B1ADOF20D,B1ADOF20D,B1ADOF20D,B1ADOF20D,B1ADOF20D,B1ADOF20D,B1ADOF20D, & + B1ADOF21D,B1ADOF21D,B1ADOF21D,B1ADOF21D,B1ADOF21D,B1ADOF21D,B1ADOF21D,B1ADOF21D,B1ADOF21D, & + B1ADOF22D,B1ADOF22D,B1ADOF22D,B1ADOF22D,B1ADOF22D,B1ADOF22D,B1ADOF22D,B1ADOF22D,B1ADOF22D, & + B1ADOF23D,B1ADOF23D,B1ADOF23D,B1ADOF23D,B1ADOF23D,B1ADOF23D,B1ADOF23D,B1ADOF23D,B1ADOF23D, & + B1ADOF24D,B1ADOF24D,B1ADOF24D,B1ADOF24D,B1ADOF24D,B1ADOF24D,B1ADOF24D,B1ADOF24D,B1ADOF24D, & + B1ADOF25D,B1ADOF25D,B1ADOF25D,B1ADOF25D,B1ADOF25D,B1ADOF25D,B1ADOF25D,B1ADOF25D,B1ADOF25D, & + B1ADOF26D,B1ADOF26D,B1ADOF26D,B1ADOF26D,B1ADOF26D,B1ADOF26D,B1ADOF26D,B1ADOF26D,B1ADOF26D, & + B1ADOF27D,B1ADOF27D,B1ADOF27D,B1ADOF27D,B1ADOF27D,B1ADOF27D,B1ADOF27D,B1ADOF27D,B1ADOF27D, & + B1ADOF28D,B1ADOF28D,B1ADOF28D,B1ADOF28D,B1ADOF28D,B1ADOF28D,B1ADOF28D,B1ADOF28D,B1ADOF28D, & + B1ADOF29D,B1ADOF29D,B1ADOF29D,B1ADOF29D,B1ADOF29D,B1ADOF29D,B1ADOF29D,B1ADOF29D,B1ADOF29D, & + B1ADOF30D,B1ADOF30D,B1ADOF30D,B1ADOF30D,B1ADOF30D,B1ADOF30D,B1ADOF30D,B1ADOF30D,B1ADOF30D, & + B1ADOF31D,B1ADOF31D,B1ADOF31D,B1ADOF31D,B1ADOF31D,B1ADOF31D,B1ADOF31D,B1ADOF31D,B1ADOF31D, & + B1ADOF32D,B1ADOF32D,B1ADOF32D,B1ADOF32D,B1ADOF32D,B1ADOF32D,B1ADOF32D,B1ADOF32D,B1ADOF32D, & + B1ADOF33D,B1ADOF33D,B1ADOF33D,B1ADOF33D,B1ADOF33D,B1ADOF33D,B1ADOF33D,B1ADOF33D,B1ADOF33D, & + B1ADOF34D,B1ADOF34D,B1ADOF34D,B1ADOF34D,B1ADOF34D,B1ADOF34D,B1ADOF34D,B1ADOF34D,B1ADOF34D, & + B1ADOF35D,B1ADOF35D,B1ADOF35D,B1ADOF35D,B1ADOF35D,B1ADOF35D,B1ADOF35D,B1ADOF35D,B1ADOF35D, & + B1ADOF36D,B1ADOF36D,B1ADOF36D,B1ADOF36D,B1ADOF36D,B1ADOF36D,B1ADOF36D,B1ADOF36D,B1ADOF36D, & + B1ADOF37D,B1ADOF37D,B1ADOF37D,B1ADOF37D,B1ADOF37D,B1ADOF37D,B1ADOF37D,B1ADOF37D,B1ADOF37D, & + B1ADOF38D,B1ADOF38D,B1ADOF38D,B1ADOF38D,B1ADOF38D,B1ADOF38D,B1ADOF38D,B1ADOF38D,B1ADOF38D, & + B1ADOF39D,B1ADOF39D,B1ADOF39D,B1ADOF39D,B1ADOF39D,B1ADOF39D,B1ADOF39D,B1ADOF39D,B1ADOF39D, & + B1ADOF40D,B1ADOF40D,B1ADOF40D,B1ADOF40D,B1ADOF40D,B1ADOF40D,B1ADOF40D,B1ADOF40D,B1ADOF40D, & + B1ADOF41D,B1ADOF41D,B1ADOF41D,B1ADOF41D,B1ADOF41D,B1ADOF41D,B1ADOF41D,B1ADOF41D,B1ADOF41D, & + B1ADOF42D,B1ADOF42D,B1ADOF42D,B1ADOF42D,B1ADOF42D,B1ADOF42D,B1ADOF42D,B1ADOF42D,B1ADOF42D, & + B1ADOF43D,B1ADOF43D,B1ADOF43D,B1ADOF43D,B1ADOF43D,B1ADOF43D,B1ADOF43D,B1ADOF43D,B1ADOF43D, & + B1ADOF44D,B1ADOF44D,B1ADOF44D,B1ADOF44D,B1ADOF44D,B1ADOF44D,B1ADOF44D,B1ADOF44D,B1ADOF44D, & + B1ADOF45D,B1ADOF45D,B1ADOF45D,B1ADOF45D,B1ADOF45D,B1ADOF45D,B1ADOF45D,B1ADOF45D,B1ADOF45D, & + B1ADOF46D,B1ADOF46D,B1ADOF46D,B1ADOF46D,B1ADOF46D,B1ADOF46D,B1ADOF46D,B1ADOF46D,B1ADOF46D, & + B1ADOF47D,B1ADOF47D,B1ADOF47D,B1ADOF47D,B1ADOF47D,B1ADOF47D,B1ADOF47D,B1ADOF47D,B1ADOF47D, & + B1ADOF48D,B1ADOF48D,B1ADOF48D,B1ADOF48D,B1ADOF48D,B1ADOF48D,B1ADOF48D,B1ADOF48D,B1ADOF48D, & + B1ADOF49D,B1ADOF49D,B1ADOF49D,B1ADOF49D,B1ADOF49D,B1ADOF49D,B1ADOF49D,B1ADOF49D,B1ADOF49D, & + B1ADOF50D,B1ADOF50D,B1ADOF50D,B1ADOF50D,B1ADOF50D,B1ADOF50D,B1ADOF50D,B1ADOF50D,B1ADOF50D, & + B1ADOF51D,B1ADOF51D,B1ADOF51D,B1ADOF51D,B1ADOF51D,B1ADOF51D,B1ADOF51D,B1ADOF51D,B1ADOF51D, & + B1ADOF52D,B1ADOF52D,B1ADOF52D,B1ADOF52D,B1ADOF52D,B1ADOF52D,B1ADOF52D,B1ADOF52D,B1ADOF52D, & + B1ADOF53D,B1ADOF53D,B1ADOF53D,B1ADOF53D,B1ADOF53D,B1ADOF53D,B1ADOF53D,B1ADOF53D,B1ADOF53D, & + B1ADOF54D,B1ADOF54D,B1ADOF54D,B1ADOF54D,B1ADOF54D,B1ADOF54D,B1ADOF54D,B1ADOF54D,B1ADOF54D, & + B1ADOF55D,B1ADOF55D,B1ADOF55D,B1ADOF55D,B1ADOF55D,B1ADOF55D,B1ADOF55D,B1ADOF55D,B1ADOF55D, & + B1ADOF56D,B1ADOF56D,B1ADOF56D,B1ADOF56D,B1ADOF56D,B1ADOF56D,B1ADOF56D,B1ADOF56D,B1ADOF56D, & + B1ADOF57D,B1ADOF57D,B1ADOF57D,B1ADOF57D,B1ADOF57D,B1ADOF57D,B1ADOF57D,B1ADOF57D,B1ADOF57D, & + B1ADOF58D,B1ADOF58D,B1ADOF58D,B1ADOF58D,B1ADOF58D,B1ADOF58D,B1ADOF58D,B1ADOF58D,B1ADOF58D, & + B1ADOF59D,B1ADOF59D,B1ADOF59D,B1ADOF59D,B1ADOF59D,B1ADOF59D,B1ADOF59D,B1ADOF59D,B1ADOF59D, & + B1ADOF60D,B1ADOF60D,B1ADOF60D,B1ADOF60D,B1ADOF60D,B1ADOF60D,B1ADOF60D,B1ADOF60D,B1ADOF60D, & + B1ADOF61D,B1ADOF61D,B1ADOF61D,B1ADOF61D,B1ADOF61D,B1ADOF61D,B1ADOF61D,B1ADOF61D,B1ADOF61D, & + B1ADOF62D,B1ADOF62D,B1ADOF62D,B1ADOF62D,B1ADOF62D,B1ADOF62D,B1ADOF62D,B1ADOF62D,B1ADOF62D, & + B1ADOF63D,B1ADOF63D,B1ADOF63D,B1ADOF63D,B1ADOF63D,B1ADOF63D,B1ADOF63D,B1ADOF63D,B1ADOF63D, & + B1ADOF64D,B1ADOF64D,B1ADOF64D,B1ADOF64D,B1ADOF64D,B1ADOF64D,B1ADOF64D,B1ADOF64D,B1ADOF64D, & + B1ADOF65D,B1ADOF65D,B1ADOF65D,B1ADOF65D,B1ADOF65D,B1ADOF65D,B1ADOF65D,B1ADOF65D,B1ADOF65D, & + B1ADOF66D,B1ADOF66D,B1ADOF66D,B1ADOF66D,B1ADOF66D,B1ADOF66D,B1ADOF66D,B1ADOF66D,B1ADOF66D, & + B1ADOF67D,B1ADOF67D,B1ADOF67D,B1ADOF67D,B1ADOF67D,B1ADOF67D,B1ADOF67D,B1ADOF67D,B1ADOF67D, & + B1ADOF68D,B1ADOF68D,B1ADOF68D,B1ADOF68D,B1ADOF68D,B1ADOF68D,B1ADOF68D,B1ADOF68D,B1ADOF68D, & + B1ADOF69D,B1ADOF69D,B1ADOF69D,B1ADOF69D,B1ADOF69D,B1ADOF69D,B1ADOF69D,B1ADOF69D,B1ADOF69D, & + B1ADOF70D,B1ADOF70D,B1ADOF70D,B1ADOF70D,B1ADOF70D,B1ADOF70D,B1ADOF70D,B1ADOF70D,B1ADOF70D, & + B1ADOF71D,B1ADOF71D,B1ADOF71D,B1ADOF71D,B1ADOF71D,B1ADOF71D,B1ADOF71D,B1ADOF71D,B1ADOF71D, & + B1ADOF72D,B1ADOF72D,B1ADOF72D,B1ADOF72D,B1ADOF72D,B1ADOF72D,B1ADOF72D,B1ADOF72D,B1ADOF72D, & + B1ADOF73D,B1ADOF73D,B1ADOF73D,B1ADOF73D,B1ADOF73D,B1ADOF73D,B1ADOF73D,B1ADOF73D,B1ADOF73D, & + B1ADOF74D,B1ADOF74D,B1ADOF74D,B1ADOF74D,B1ADOF74D,B1ADOF74D,B1ADOF74D,B1ADOF74D,B1ADOF74D, & + B1ADOF75D,B1ADOF75D,B1ADOF75D,B1ADOF75D,B1ADOF75D,B1ADOF75D,B1ADOF75D,B1ADOF75D,B1ADOF75D, & + B1ADOF76D,B1ADOF76D,B1ADOF76D,B1ADOF76D,B1ADOF76D,B1ADOF76D,B1ADOF76D,B1ADOF76D,B1ADOF76D, & + B1ADOF77D,B1ADOF77D,B1ADOF77D,B1ADOF77D,B1ADOF77D,B1ADOF77D,B1ADOF77D,B1ADOF77D,B1ADOF77D, & + B1ADOF78D,B1ADOF78D,B1ADOF78D,B1ADOF78D,B1ADOF78D,B1ADOF78D,B1ADOF78D,B1ADOF78D,B1ADOF78D, & + B1ADOF79D,B1ADOF79D,B1ADOF79D,B1ADOF79D,B1ADOF79D,B1ADOF79D,B1ADOF79D,B1ADOF79D,B1ADOF79D, & + B1ADOF80D,B1ADOF80D,B1ADOF80D,B1ADOF80D,B1ADOF80D,B1ADOF80D,B1ADOF80D,B1ADOF80D,B1ADOF80D, & + B1ADOF81D,B1ADOF81D,B1ADOF81D,B1ADOF81D,B1ADOF81D,B1ADOF81D,B1ADOF81D,B1ADOF81D,B1ADOF81D, & + B1ADOF82D,B1ADOF82D,B1ADOF82D,B1ADOF82D,B1ADOF82D,B1ADOF82D,B1ADOF82D,B1ADOF82D,B1ADOF82D, & + B1ADOF83D,B1ADOF83D,B1ADOF83D,B1ADOF83D,B1ADOF83D,B1ADOF83D,B1ADOF83D,B1ADOF83D,B1ADOF83D, & + B1ADOF84D,B1ADOF84D,B1ADOF84D,B1ADOF84D,B1ADOF84D,B1ADOF84D,B1ADOF84D,B1ADOF84D,B1ADOF84D, & + B1ADOF85D,B1ADOF85D,B1ADOF85D,B1ADOF85D,B1ADOF85D,B1ADOF85D,B1ADOF85D,B1ADOF85D,B1ADOF85D, & + B1ADOF86D,B1ADOF86D,B1ADOF86D,B1ADOF86D,B1ADOF86D,B1ADOF86D,B1ADOF86D,B1ADOF86D,B1ADOF86D, & + B1ADOF87D,B1ADOF87D,B1ADOF87D,B1ADOF87D,B1ADOF87D,B1ADOF87D,B1ADOF87D,B1ADOF87D,B1ADOF87D, & + B1ADOF88D,B1ADOF88D,B1ADOF88D,B1ADOF88D,B1ADOF88D,B1ADOF88D,B1ADOF88D,B1ADOF88D,B1ADOF88D, & + B1ADOF89D,B1ADOF89D,B1ADOF89D,B1ADOF89D,B1ADOF89D,B1ADOF89D,B1ADOF89D,B1ADOF89D,B1ADOF89D, & + B1ADOF90D,B1ADOF90D,B1ADOF90D,B1ADOF90D,B1ADOF90D,B1ADOF90D,B1ADOF90D,B1ADOF90D,B1ADOF90D, & + B1ADOF91D,B1ADOF91D,B1ADOF91D,B1ADOF91D,B1ADOF91D,B1ADOF91D,B1ADOF91D,B1ADOF91D,B1ADOF91D, & + B1ADOF92D,B1ADOF92D,B1ADOF92D,B1ADOF92D,B1ADOF92D,B1ADOF92D,B1ADOF92D,B1ADOF92D,B1ADOF92D, & + B1ADOF93D,B1ADOF93D,B1ADOF93D,B1ADOF93D,B1ADOF93D,B1ADOF93D,B1ADOF93D,B1ADOF93D,B1ADOF93D, & + B1ADOF94D,B1ADOF94D,B1ADOF94D,B1ADOF94D,B1ADOF94D,B1ADOF94D,B1ADOF94D,B1ADOF94D,B1ADOF94D, & + B1ADOF95D,B1ADOF95D,B1ADOF95D,B1ADOF95D,B1ADOF95D,B1ADOF95D,B1ADOF95D,B1ADOF95D,B1ADOF95D, & + B1ADOF96D,B1ADOF96D,B1ADOF96D,B1ADOF96D,B1ADOF96D,B1ADOF96D,B1ADOF96D,B1ADOF96D,B1ADOF96D, & + B1ADOF97D,B1ADOF97D,B1ADOF97D,B1ADOF97D,B1ADOF97D,B1ADOF97D,B1ADOF97D,B1ADOF97D,B1ADOF97D, & + B1ADOF98D,B1ADOF98D,B1ADOF98D,B1ADOF98D,B1ADOF98D,B1ADOF98D,B1ADOF98D,B1ADOF98D,B1ADOF98D, & + B1ADOF99D,B1ADOF99D,B1ADOF99D,B1ADOF99D,B1ADOF99D,B1ADOF99D,B1ADOF99D,B1ADOF99D,B1ADOF99D/), & + (/9,99/))) + + INTEGER, PARAMETER :: ADOFVel(99,9) = transpose(reshape((/B1ADOF1V,B1ADOF1V,B1ADOF1V,B1ADOF1V,B1ADOF1V,B1ADOF1V,B1ADOF1V,B1ADOF1V,B1ADOF1V, & + B1ADOF2V,B1ADOF2V,B1ADOF2V,B1ADOF2V,B1ADOF2V,B1ADOF2V,B1ADOF2V,B1ADOF2V,B1ADOF2V, & + B1ADOF3V,B1ADOF3V,B1ADOF3V,B1ADOF3V,B1ADOF3V,B1ADOF3V,B1ADOF3V,B1ADOF3V,B1ADOF3V, & + B1ADOF4V,B1ADOF4V,B1ADOF4V,B1ADOF4V,B1ADOF4V,B1ADOF4V,B1ADOF4V,B1ADOF4V,B1ADOF4V, & + B1ADOF5V,B1ADOF5V,B1ADOF5V,B1ADOF5V,B1ADOF5V,B1ADOF5V,B1ADOF5V,B1ADOF5V,B1ADOF5V, & + B1ADOF6V,B1ADOF6V,B1ADOF6V,B1ADOF6V,B1ADOF6V,B1ADOF6V,B1ADOF6V,B1ADOF6V,B1ADOF6V, & + B1ADOF7V,B1ADOF7V,B1ADOF7V,B1ADOF7V,B1ADOF7V,B1ADOF7V,B1ADOF7V,B1ADOF7V,B1ADOF7V, & + B1ADOF8V,B1ADOF8V,B1ADOF8V,B1ADOF8V,B1ADOF8V,B1ADOF8V,B1ADOF8V,B1ADOF8V,B1ADOF8V, & + B1ADOF9V,B1ADOF9V,B1ADOF9V,B1ADOF9V,B1ADOF9V,B1ADOF9V,B1ADOF9V,B1ADOF9V,B1ADOF9V, & + B1ADOF10V,B1ADOF10V,B1ADOF10V,B1ADOF10V,B1ADOF10V,B1ADOF10V,B1ADOF10V,B1ADOF10V,B1ADOF10V, & + B1ADOF11V,B1ADOF11V,B1ADOF11V,B1ADOF11V,B1ADOF11V,B1ADOF11V,B1ADOF11V,B1ADOF11V,B1ADOF11V, & + B1ADOF12V,B1ADOF12V,B1ADOF12V,B1ADOF12V,B1ADOF12V,B1ADOF12V,B1ADOF12V,B1ADOF12V,B1ADOF12V, & + B1ADOF13V,B1ADOF13V,B1ADOF13V,B1ADOF13V,B1ADOF13V,B1ADOF13V,B1ADOF13V,B1ADOF13V,B1ADOF13V, & + B1ADOF14V,B1ADOF14V,B1ADOF14V,B1ADOF14V,B1ADOF14V,B1ADOF14V,B1ADOF14V,B1ADOF14V,B1ADOF14V, & + B1ADOF15V,B1ADOF15V,B1ADOF15V,B1ADOF15V,B1ADOF15V,B1ADOF15V,B1ADOF15V,B1ADOF15V,B1ADOF15V, & + B1ADOF16V,B1ADOF16V,B1ADOF16V,B1ADOF16V,B1ADOF16V,B1ADOF16V,B1ADOF16V,B1ADOF16V,B1ADOF16V, & + B1ADOF17V,B1ADOF17V,B1ADOF17V,B1ADOF17V,B1ADOF17V,B1ADOF17V,B1ADOF17V,B1ADOF17V,B1ADOF17V, & + B1ADOF18V,B1ADOF18V,B1ADOF18V,B1ADOF18V,B1ADOF18V,B1ADOF18V,B1ADOF18V,B1ADOF18V,B1ADOF18V, & + B1ADOF19V,B1ADOF19V,B1ADOF19V,B1ADOF19V,B1ADOF19V,B1ADOF19V,B1ADOF19V,B1ADOF19V,B1ADOF19V, & + B1ADOF20V,B1ADOF20V,B1ADOF20V,B1ADOF20V,B1ADOF20V,B1ADOF20V,B1ADOF20V,B1ADOF20V,B1ADOF20V, & + B1ADOF21V,B1ADOF21V,B1ADOF21V,B1ADOF21V,B1ADOF21V,B1ADOF21V,B1ADOF21V,B1ADOF21V,B1ADOF21V, & + B1ADOF22V,B1ADOF22V,B1ADOF22V,B1ADOF22V,B1ADOF22V,B1ADOF22V,B1ADOF22V,B1ADOF22V,B1ADOF22V, & + B1ADOF23V,B1ADOF23V,B1ADOF23V,B1ADOF23V,B1ADOF23V,B1ADOF23V,B1ADOF23V,B1ADOF23V,B1ADOF23V, & + B1ADOF24V,B1ADOF24V,B1ADOF24V,B1ADOF24V,B1ADOF24V,B1ADOF24V,B1ADOF24V,B1ADOF24V,B1ADOF24V, & + B1ADOF25V,B1ADOF25V,B1ADOF25V,B1ADOF25V,B1ADOF25V,B1ADOF25V,B1ADOF25V,B1ADOF25V,B1ADOF25V, & + B1ADOF26V,B1ADOF26V,B1ADOF26V,B1ADOF26V,B1ADOF26V,B1ADOF26V,B1ADOF26V,B1ADOF26V,B1ADOF26V, & + B1ADOF27V,B1ADOF27V,B1ADOF27V,B1ADOF27V,B1ADOF27V,B1ADOF27V,B1ADOF27V,B1ADOF27V,B1ADOF27V, & + B1ADOF28V,B1ADOF28V,B1ADOF28V,B1ADOF28V,B1ADOF28V,B1ADOF28V,B1ADOF28V,B1ADOF28V,B1ADOF28V, & + B1ADOF29V,B1ADOF29V,B1ADOF29V,B1ADOF29V,B1ADOF29V,B1ADOF29V,B1ADOF29V,B1ADOF29V,B1ADOF29V, & + B1ADOF30V,B1ADOF30V,B1ADOF30V,B1ADOF30V,B1ADOF30V,B1ADOF30V,B1ADOF30V,B1ADOF30V,B1ADOF30V, & + B1ADOF31V,B1ADOF31V,B1ADOF31V,B1ADOF31V,B1ADOF31V,B1ADOF31V,B1ADOF31V,B1ADOF31V,B1ADOF31V, & + B1ADOF32V,B1ADOF32V,B1ADOF32V,B1ADOF32V,B1ADOF32V,B1ADOF32V,B1ADOF32V,B1ADOF32V,B1ADOF32V, & + B1ADOF33V,B1ADOF33V,B1ADOF33V,B1ADOF33V,B1ADOF33V,B1ADOF33V,B1ADOF33V,B1ADOF33V,B1ADOF33V, & + B1ADOF34V,B1ADOF34V,B1ADOF34V,B1ADOF34V,B1ADOF34V,B1ADOF34V,B1ADOF34V,B1ADOF34V,B1ADOF34V, & + B1ADOF35V,B1ADOF35V,B1ADOF35V,B1ADOF35V,B1ADOF35V,B1ADOF35V,B1ADOF35V,B1ADOF35V,B1ADOF35V, & + B1ADOF36V,B1ADOF36V,B1ADOF36V,B1ADOF36V,B1ADOF36V,B1ADOF36V,B1ADOF36V,B1ADOF36V,B1ADOF36V, & + B1ADOF37V,B1ADOF37V,B1ADOF37V,B1ADOF37V,B1ADOF37V,B1ADOF37V,B1ADOF37V,B1ADOF37V,B1ADOF37V, & + B1ADOF38V,B1ADOF38V,B1ADOF38V,B1ADOF38V,B1ADOF38V,B1ADOF38V,B1ADOF38V,B1ADOF38V,B1ADOF38V, & + B1ADOF39V,B1ADOF39V,B1ADOF39V,B1ADOF39V,B1ADOF39V,B1ADOF39V,B1ADOF39V,B1ADOF39V,B1ADOF39V, & + B1ADOF40V,B1ADOF40V,B1ADOF40V,B1ADOF40V,B1ADOF40V,B1ADOF40V,B1ADOF40V,B1ADOF40V,B1ADOF40V, & + B1ADOF41V,B1ADOF41V,B1ADOF41V,B1ADOF41V,B1ADOF41V,B1ADOF41V,B1ADOF41V,B1ADOF41V,B1ADOF41V, & + B1ADOF42V,B1ADOF42V,B1ADOF42V,B1ADOF42V,B1ADOF42V,B1ADOF42V,B1ADOF42V,B1ADOF42V,B1ADOF42V, & + B1ADOF43V,B1ADOF43V,B1ADOF43V,B1ADOF43V,B1ADOF43V,B1ADOF43V,B1ADOF43V,B1ADOF43V,B1ADOF43V, & + B1ADOF44V,B1ADOF44V,B1ADOF44V,B1ADOF44V,B1ADOF44V,B1ADOF44V,B1ADOF44V,B1ADOF44V,B1ADOF44V, & + B1ADOF45V,B1ADOF45V,B1ADOF45V,B1ADOF45V,B1ADOF45V,B1ADOF45V,B1ADOF45V,B1ADOF45V,B1ADOF45V, & + B1ADOF46V,B1ADOF46V,B1ADOF46V,B1ADOF46V,B1ADOF46V,B1ADOF46V,B1ADOF46V,B1ADOF46V,B1ADOF46V, & + B1ADOF47V,B1ADOF47V,B1ADOF47V,B1ADOF47V,B1ADOF47V,B1ADOF47V,B1ADOF47V,B1ADOF47V,B1ADOF47V, & + B1ADOF48V,B1ADOF48V,B1ADOF48V,B1ADOF48V,B1ADOF48V,B1ADOF48V,B1ADOF48V,B1ADOF48V,B1ADOF48V, & + B1ADOF49V,B1ADOF49V,B1ADOF49V,B1ADOF49V,B1ADOF49V,B1ADOF49V,B1ADOF49V,B1ADOF49V,B1ADOF49V, & + B1ADOF50V,B1ADOF50V,B1ADOF50V,B1ADOF50V,B1ADOF50V,B1ADOF50V,B1ADOF50V,B1ADOF50V,B1ADOF50V, & + B1ADOF51V,B1ADOF51V,B1ADOF51V,B1ADOF51V,B1ADOF51V,B1ADOF51V,B1ADOF51V,B1ADOF51V,B1ADOF51V, & + B1ADOF52V,B1ADOF52V,B1ADOF52V,B1ADOF52V,B1ADOF52V,B1ADOF52V,B1ADOF52V,B1ADOF52V,B1ADOF52V, & + B1ADOF53V,B1ADOF53V,B1ADOF53V,B1ADOF53V,B1ADOF53V,B1ADOF53V,B1ADOF53V,B1ADOF53V,B1ADOF53V, & + B1ADOF54V,B1ADOF54V,B1ADOF54V,B1ADOF54V,B1ADOF54V,B1ADOF54V,B1ADOF54V,B1ADOF54V,B1ADOF54V, & + B1ADOF55V,B1ADOF55V,B1ADOF55V,B1ADOF55V,B1ADOF55V,B1ADOF55V,B1ADOF55V,B1ADOF55V,B1ADOF55V, & + B1ADOF56V,B1ADOF56V,B1ADOF56V,B1ADOF56V,B1ADOF56V,B1ADOF56V,B1ADOF56V,B1ADOF56V,B1ADOF56V, & + B1ADOF57V,B1ADOF57V,B1ADOF57V,B1ADOF57V,B1ADOF57V,B1ADOF57V,B1ADOF57V,B1ADOF57V,B1ADOF57V, & + B1ADOF58V,B1ADOF58V,B1ADOF58V,B1ADOF58V,B1ADOF58V,B1ADOF58V,B1ADOF58V,B1ADOF58V,B1ADOF58V, & + B1ADOF59V,B1ADOF59V,B1ADOF59V,B1ADOF59V,B1ADOF59V,B1ADOF59V,B1ADOF59V,B1ADOF59V,B1ADOF59V, & + B1ADOF60V,B1ADOF60V,B1ADOF60V,B1ADOF60V,B1ADOF60V,B1ADOF60V,B1ADOF60V,B1ADOF60V,B1ADOF60V, & + B1ADOF61V,B1ADOF61V,B1ADOF61V,B1ADOF61V,B1ADOF61V,B1ADOF61V,B1ADOF61V,B1ADOF61V,B1ADOF61V, & + B1ADOF62V,B1ADOF62V,B1ADOF62V,B1ADOF62V,B1ADOF62V,B1ADOF62V,B1ADOF62V,B1ADOF62V,B1ADOF62V, & + B1ADOF63V,B1ADOF63V,B1ADOF63V,B1ADOF63V,B1ADOF63V,B1ADOF63V,B1ADOF63V,B1ADOF63V,B1ADOF63V, & + B1ADOF64V,B1ADOF64V,B1ADOF64V,B1ADOF64V,B1ADOF64V,B1ADOF64V,B1ADOF64V,B1ADOF64V,B1ADOF64V, & + B1ADOF65V,B1ADOF65V,B1ADOF65V,B1ADOF65V,B1ADOF65V,B1ADOF65V,B1ADOF65V,B1ADOF65V,B1ADOF65V, & + B1ADOF66V,B1ADOF66V,B1ADOF66V,B1ADOF66V,B1ADOF66V,B1ADOF66V,B1ADOF66V,B1ADOF66V,B1ADOF66V, & + B1ADOF67V,B1ADOF67V,B1ADOF67V,B1ADOF67V,B1ADOF67V,B1ADOF67V,B1ADOF67V,B1ADOF67V,B1ADOF67V, & + B1ADOF68V,B1ADOF68V,B1ADOF68V,B1ADOF68V,B1ADOF68V,B1ADOF68V,B1ADOF68V,B1ADOF68V,B1ADOF68V, & + B1ADOF69V,B1ADOF69V,B1ADOF69V,B1ADOF69V,B1ADOF69V,B1ADOF69V,B1ADOF69V,B1ADOF69V,B1ADOF69V, & + B1ADOF70V,B1ADOF70V,B1ADOF70V,B1ADOF70V,B1ADOF70V,B1ADOF70V,B1ADOF70V,B1ADOF70V,B1ADOF70V, & + B1ADOF71V,B1ADOF71V,B1ADOF71V,B1ADOF71V,B1ADOF71V,B1ADOF71V,B1ADOF71V,B1ADOF71V,B1ADOF71V, & + B1ADOF72V,B1ADOF72V,B1ADOF72V,B1ADOF72V,B1ADOF72V,B1ADOF72V,B1ADOF72V,B1ADOF72V,B1ADOF72V, & + B1ADOF73V,B1ADOF73V,B1ADOF73V,B1ADOF73V,B1ADOF73V,B1ADOF73V,B1ADOF73V,B1ADOF73V,B1ADOF73V, & + B1ADOF74V,B1ADOF74V,B1ADOF74V,B1ADOF74V,B1ADOF74V,B1ADOF74V,B1ADOF74V,B1ADOF74V,B1ADOF74V, & + B1ADOF75V,B1ADOF75V,B1ADOF75V,B1ADOF75V,B1ADOF75V,B1ADOF75V,B1ADOF75V,B1ADOF75V,B1ADOF75V, & + B1ADOF76V,B1ADOF76V,B1ADOF76V,B1ADOF76V,B1ADOF76V,B1ADOF76V,B1ADOF76V,B1ADOF76V,B1ADOF76V, & + B1ADOF77V,B1ADOF77V,B1ADOF77V,B1ADOF77V,B1ADOF77V,B1ADOF77V,B1ADOF77V,B1ADOF77V,B1ADOF77V, & + B1ADOF78V,B1ADOF78V,B1ADOF78V,B1ADOF78V,B1ADOF78V,B1ADOF78V,B1ADOF78V,B1ADOF78V,B1ADOF78V, & + B1ADOF79V,B1ADOF79V,B1ADOF79V,B1ADOF79V,B1ADOF79V,B1ADOF79V,B1ADOF79V,B1ADOF79V,B1ADOF79V, & + B1ADOF80V,B1ADOF80V,B1ADOF80V,B1ADOF80V,B1ADOF80V,B1ADOF80V,B1ADOF80V,B1ADOF80V,B1ADOF80V, & + B1ADOF81V,B1ADOF81V,B1ADOF81V,B1ADOF81V,B1ADOF81V,B1ADOF81V,B1ADOF81V,B1ADOF81V,B1ADOF81V, & + B1ADOF82V,B1ADOF82V,B1ADOF82V,B1ADOF82V,B1ADOF82V,B1ADOF82V,B1ADOF82V,B1ADOF82V,B1ADOF82V, & + B1ADOF83V,B1ADOF83V,B1ADOF83V,B1ADOF83V,B1ADOF83V,B1ADOF83V,B1ADOF83V,B1ADOF83V,B1ADOF83V, & + B1ADOF84V,B1ADOF84V,B1ADOF84V,B1ADOF84V,B1ADOF84V,B1ADOF84V,B1ADOF84V,B1ADOF84V,B1ADOF84V, & + B1ADOF85V,B1ADOF85V,B1ADOF85V,B1ADOF85V,B1ADOF85V,B1ADOF85V,B1ADOF85V,B1ADOF85V,B1ADOF85V, & + B1ADOF86V,B1ADOF86V,B1ADOF86V,B1ADOF86V,B1ADOF86V,B1ADOF86V,B1ADOF86V,B1ADOF86V,B1ADOF86V, & + B1ADOF87V,B1ADOF87V,B1ADOF87V,B1ADOF87V,B1ADOF87V,B1ADOF87V,B1ADOF87V,B1ADOF87V,B1ADOF87V, & + B1ADOF88V,B1ADOF88V,B1ADOF88V,B1ADOF88V,B1ADOF88V,B1ADOF88V,B1ADOF88V,B1ADOF88V,B1ADOF88V, & + B1ADOF89V,B1ADOF89V,B1ADOF89V,B1ADOF89V,B1ADOF89V,B1ADOF89V,B1ADOF89V,B1ADOF89V,B1ADOF89V, & + B1ADOF90V,B1ADOF90V,B1ADOF90V,B1ADOF90V,B1ADOF90V,B1ADOF90V,B1ADOF90V,B1ADOF90V,B1ADOF90V, & + B1ADOF91V,B1ADOF91V,B1ADOF91V,B1ADOF91V,B1ADOF91V,B1ADOF91V,B1ADOF91V,B1ADOF91V,B1ADOF91V, & + B1ADOF92V,B1ADOF92V,B1ADOF92V,B1ADOF92V,B1ADOF92V,B1ADOF92V,B1ADOF92V,B1ADOF92V,B1ADOF92V, & + B1ADOF93V,B1ADOF93V,B1ADOF93V,B1ADOF93V,B1ADOF93V,B1ADOF93V,B1ADOF93V,B1ADOF93V,B1ADOF93V, & + B1ADOF94V,B1ADOF94V,B1ADOF94V,B1ADOF94V,B1ADOF94V,B1ADOF94V,B1ADOF94V,B1ADOF94V,B1ADOF94V, & + B1ADOF95V,B1ADOF95V,B1ADOF95V,B1ADOF95V,B1ADOF95V,B1ADOF95V,B1ADOF95V,B1ADOF95V,B1ADOF95V, & + B1ADOF96V,B1ADOF96V,B1ADOF96V,B1ADOF96V,B1ADOF96V,B1ADOF96V,B1ADOF96V,B1ADOF96V,B1ADOF96V, & + B1ADOF97V,B1ADOF97V,B1ADOF97V,B1ADOF97V,B1ADOF97V,B1ADOF97V,B1ADOF97V,B1ADOF97V,B1ADOF97V, & + B1ADOF98V,B1ADOF98V,B1ADOF98V,B1ADOF98V,B1ADOF98V,B1ADOF98V,B1ADOF98V,B1ADOF98V,B1ADOF98V, & + B1ADOF99V,B1ADOF99V,B1ADOF99V,B1ADOF99V,B1ADOF99V,B1ADOF99V,B1ADOF99V,B1ADOF99V,B1ADOF99V/), & + (/9,99/))) + + INTEGER, PARAMETER :: ADOFAcc(99,9) = transpose(reshape((/B1ADOF1A,B1ADOF1A,B1ADOF1A,B1ADOF1A,B1ADOF1A,B1ADOF1A,B1ADOF1A,B1ADOF1A,B1ADOF1A, & + B1ADOF2A,B1ADOF2A,B1ADOF2A,B1ADOF2A,B1ADOF2A,B1ADOF2A,B1ADOF2A,B1ADOF2A,B1ADOF2A, & + B1ADOF3A,B1ADOF3A,B1ADOF3A,B1ADOF3A,B1ADOF3A,B1ADOF3A,B1ADOF3A,B1ADOF3A,B1ADOF3A, & + B1ADOF4A,B1ADOF4A,B1ADOF4A,B1ADOF4A,B1ADOF4A,B1ADOF4A,B1ADOF4A,B1ADOF4A,B1ADOF4A, & + B1ADOF5A,B1ADOF5A,B1ADOF5A,B1ADOF5A,B1ADOF5A,B1ADOF5A,B1ADOF5A,B1ADOF5A,B1ADOF5A, & + B1ADOF6A,B1ADOF6A,B1ADOF6A,B1ADOF6A,B1ADOF6A,B1ADOF6A,B1ADOF6A,B1ADOF6A,B1ADOF6A, & + B1ADOF7A,B1ADOF7A,B1ADOF7A,B1ADOF7A,B1ADOF7A,B1ADOF7A,B1ADOF7A,B1ADOF7A,B1ADOF7A, & + B1ADOF8A,B1ADOF8A,B1ADOF8A,B1ADOF8A,B1ADOF8A,B1ADOF8A,B1ADOF8A,B1ADOF8A,B1ADOF8A, & + B1ADOF9A,B1ADOF9A,B1ADOF9A,B1ADOF9A,B1ADOF9A,B1ADOF9A,B1ADOF9A,B1ADOF9A,B1ADOF9A, & + B1ADOF10A,B1ADOF10A,B1ADOF10A,B1ADOF10A,B1ADOF10A,B1ADOF10A,B1ADOF10A,B1ADOF10A,B1ADOF10A, & + B1ADOF11A,B1ADOF11A,B1ADOF11A,B1ADOF11A,B1ADOF11A,B1ADOF11A,B1ADOF11A,B1ADOF11A,B1ADOF11A, & + B1ADOF12A,B1ADOF12A,B1ADOF12A,B1ADOF12A,B1ADOF12A,B1ADOF12A,B1ADOF12A,B1ADOF12A,B1ADOF12A, & + B1ADOF13A,B1ADOF13A,B1ADOF13A,B1ADOF13A,B1ADOF13A,B1ADOF13A,B1ADOF13A,B1ADOF13A,B1ADOF13A, & + B1ADOF14A,B1ADOF14A,B1ADOF14A,B1ADOF14A,B1ADOF14A,B1ADOF14A,B1ADOF14A,B1ADOF14A,B1ADOF14A, & + B1ADOF15A,B1ADOF15A,B1ADOF15A,B1ADOF15A,B1ADOF15A,B1ADOF15A,B1ADOF15A,B1ADOF15A,B1ADOF15A, & + B1ADOF16A,B1ADOF16A,B1ADOF16A,B1ADOF16A,B1ADOF16A,B1ADOF16A,B1ADOF16A,B1ADOF16A,B1ADOF16A, & + B1ADOF17A,B1ADOF17A,B1ADOF17A,B1ADOF17A,B1ADOF17A,B1ADOF17A,B1ADOF17A,B1ADOF17A,B1ADOF17A, & + B1ADOF18A,B1ADOF18A,B1ADOF18A,B1ADOF18A,B1ADOF18A,B1ADOF18A,B1ADOF18A,B1ADOF18A,B1ADOF18A, & + B1ADOF19A,B1ADOF19A,B1ADOF19A,B1ADOF19A,B1ADOF19A,B1ADOF19A,B1ADOF19A,B1ADOF19A,B1ADOF19A, & + B1ADOF20A,B1ADOF20A,B1ADOF20A,B1ADOF20A,B1ADOF20A,B1ADOF20A,B1ADOF20A,B1ADOF20A,B1ADOF20A, & + B1ADOF21A,B1ADOF21A,B1ADOF21A,B1ADOF21A,B1ADOF21A,B1ADOF21A,B1ADOF21A,B1ADOF21A,B1ADOF21A, & + B1ADOF22A,B1ADOF22A,B1ADOF22A,B1ADOF22A,B1ADOF22A,B1ADOF22A,B1ADOF22A,B1ADOF22A,B1ADOF22A, & + B1ADOF23A,B1ADOF23A,B1ADOF23A,B1ADOF23A,B1ADOF23A,B1ADOF23A,B1ADOF23A,B1ADOF23A,B1ADOF23A, & + B1ADOF24A,B1ADOF24A,B1ADOF24A,B1ADOF24A,B1ADOF24A,B1ADOF24A,B1ADOF24A,B1ADOF24A,B1ADOF24A, & + B1ADOF25A,B1ADOF25A,B1ADOF25A,B1ADOF25A,B1ADOF25A,B1ADOF25A,B1ADOF25A,B1ADOF25A,B1ADOF25A, & + B1ADOF26A,B1ADOF26A,B1ADOF26A,B1ADOF26A,B1ADOF26A,B1ADOF26A,B1ADOF26A,B1ADOF26A,B1ADOF26A, & + B1ADOF27A,B1ADOF27A,B1ADOF27A,B1ADOF27A,B1ADOF27A,B1ADOF27A,B1ADOF27A,B1ADOF27A,B1ADOF27A, & + B1ADOF28A,B1ADOF28A,B1ADOF28A,B1ADOF28A,B1ADOF28A,B1ADOF28A,B1ADOF28A,B1ADOF28A,B1ADOF28A, & + B1ADOF29A,B1ADOF29A,B1ADOF29A,B1ADOF29A,B1ADOF29A,B1ADOF29A,B1ADOF29A,B1ADOF29A,B1ADOF29A, & + B1ADOF30A,B1ADOF30A,B1ADOF30A,B1ADOF30A,B1ADOF30A,B1ADOF30A,B1ADOF30A,B1ADOF30A,B1ADOF30A, & + B1ADOF31A,B1ADOF31A,B1ADOF31A,B1ADOF31A,B1ADOF31A,B1ADOF31A,B1ADOF31A,B1ADOF31A,B1ADOF31A, & + B1ADOF32A,B1ADOF32A,B1ADOF32A,B1ADOF32A,B1ADOF32A,B1ADOF32A,B1ADOF32A,B1ADOF32A,B1ADOF32A, & + B1ADOF33A,B1ADOF33A,B1ADOF33A,B1ADOF33A,B1ADOF33A,B1ADOF33A,B1ADOF33A,B1ADOF33A,B1ADOF33A, & + B1ADOF34A,B1ADOF34A,B1ADOF34A,B1ADOF34A,B1ADOF34A,B1ADOF34A,B1ADOF34A,B1ADOF34A,B1ADOF34A, & + B1ADOF35A,B1ADOF35A,B1ADOF35A,B1ADOF35A,B1ADOF35A,B1ADOF35A,B1ADOF35A,B1ADOF35A,B1ADOF35A, & + B1ADOF36A,B1ADOF36A,B1ADOF36A,B1ADOF36A,B1ADOF36A,B1ADOF36A,B1ADOF36A,B1ADOF36A,B1ADOF36A, & + B1ADOF37A,B1ADOF37A,B1ADOF37A,B1ADOF37A,B1ADOF37A,B1ADOF37A,B1ADOF37A,B1ADOF37A,B1ADOF37A, & + B1ADOF38A,B1ADOF38A,B1ADOF38A,B1ADOF38A,B1ADOF38A,B1ADOF38A,B1ADOF38A,B1ADOF38A,B1ADOF38A, & + B1ADOF39A,B1ADOF39A,B1ADOF39A,B1ADOF39A,B1ADOF39A,B1ADOF39A,B1ADOF39A,B1ADOF39A,B1ADOF39A, & + B1ADOF40A,B1ADOF40A,B1ADOF40A,B1ADOF40A,B1ADOF40A,B1ADOF40A,B1ADOF40A,B1ADOF40A,B1ADOF40A, & + B1ADOF41A,B1ADOF41A,B1ADOF41A,B1ADOF41A,B1ADOF41A,B1ADOF41A,B1ADOF41A,B1ADOF41A,B1ADOF41A, & + B1ADOF42A,B1ADOF42A,B1ADOF42A,B1ADOF42A,B1ADOF42A,B1ADOF42A,B1ADOF42A,B1ADOF42A,B1ADOF42A, & + B1ADOF43A,B1ADOF43A,B1ADOF43A,B1ADOF43A,B1ADOF43A,B1ADOF43A,B1ADOF43A,B1ADOF43A,B1ADOF43A, & + B1ADOF44A,B1ADOF44A,B1ADOF44A,B1ADOF44A,B1ADOF44A,B1ADOF44A,B1ADOF44A,B1ADOF44A,B1ADOF44A, & + B1ADOF45A,B1ADOF45A,B1ADOF45A,B1ADOF45A,B1ADOF45A,B1ADOF45A,B1ADOF45A,B1ADOF45A,B1ADOF45A, & + B1ADOF46A,B1ADOF46A,B1ADOF46A,B1ADOF46A,B1ADOF46A,B1ADOF46A,B1ADOF46A,B1ADOF46A,B1ADOF46A, & + B1ADOF47A,B1ADOF47A,B1ADOF47A,B1ADOF47A,B1ADOF47A,B1ADOF47A,B1ADOF47A,B1ADOF47A,B1ADOF47A, & + B1ADOF48A,B1ADOF48A,B1ADOF48A,B1ADOF48A,B1ADOF48A,B1ADOF48A,B1ADOF48A,B1ADOF48A,B1ADOF48A, & + B1ADOF49A,B1ADOF49A,B1ADOF49A,B1ADOF49A,B1ADOF49A,B1ADOF49A,B1ADOF49A,B1ADOF49A,B1ADOF49A, & + B1ADOF50A,B1ADOF50A,B1ADOF50A,B1ADOF50A,B1ADOF50A,B1ADOF50A,B1ADOF50A,B1ADOF50A,B1ADOF50A, & + B1ADOF51A,B1ADOF51A,B1ADOF51A,B1ADOF51A,B1ADOF51A,B1ADOF51A,B1ADOF51A,B1ADOF51A,B1ADOF51A, & + B1ADOF52A,B1ADOF52A,B1ADOF52A,B1ADOF52A,B1ADOF52A,B1ADOF52A,B1ADOF52A,B1ADOF52A,B1ADOF52A, & + B1ADOF53A,B1ADOF53A,B1ADOF53A,B1ADOF53A,B1ADOF53A,B1ADOF53A,B1ADOF53A,B1ADOF53A,B1ADOF53A, & + B1ADOF54A,B1ADOF54A,B1ADOF54A,B1ADOF54A,B1ADOF54A,B1ADOF54A,B1ADOF54A,B1ADOF54A,B1ADOF54A, & + B1ADOF55A,B1ADOF55A,B1ADOF55A,B1ADOF55A,B1ADOF55A,B1ADOF55A,B1ADOF55A,B1ADOF55A,B1ADOF55A, & + B1ADOF56A,B1ADOF56A,B1ADOF56A,B1ADOF56A,B1ADOF56A,B1ADOF56A,B1ADOF56A,B1ADOF56A,B1ADOF56A, & + B1ADOF57A,B1ADOF57A,B1ADOF57A,B1ADOF57A,B1ADOF57A,B1ADOF57A,B1ADOF57A,B1ADOF57A,B1ADOF57A, & + B1ADOF58A,B1ADOF58A,B1ADOF58A,B1ADOF58A,B1ADOF58A,B1ADOF58A,B1ADOF58A,B1ADOF58A,B1ADOF58A, & + B1ADOF59A,B1ADOF59A,B1ADOF59A,B1ADOF59A,B1ADOF59A,B1ADOF59A,B1ADOF59A,B1ADOF59A,B1ADOF59A, & + B1ADOF60A,B1ADOF60A,B1ADOF60A,B1ADOF60A,B1ADOF60A,B1ADOF60A,B1ADOF60A,B1ADOF60A,B1ADOF60A, & + B1ADOF61A,B1ADOF61A,B1ADOF61A,B1ADOF61A,B1ADOF61A,B1ADOF61A,B1ADOF61A,B1ADOF61A,B1ADOF61A, & + B1ADOF62A,B1ADOF62A,B1ADOF62A,B1ADOF62A,B1ADOF62A,B1ADOF62A,B1ADOF62A,B1ADOF62A,B1ADOF62A, & + B1ADOF63A,B1ADOF63A,B1ADOF63A,B1ADOF63A,B1ADOF63A,B1ADOF63A,B1ADOF63A,B1ADOF63A,B1ADOF63A, & + B1ADOF64A,B1ADOF64A,B1ADOF64A,B1ADOF64A,B1ADOF64A,B1ADOF64A,B1ADOF64A,B1ADOF64A,B1ADOF64A, & + B1ADOF65A,B1ADOF65A,B1ADOF65A,B1ADOF65A,B1ADOF65A,B1ADOF65A,B1ADOF65A,B1ADOF65A,B1ADOF65A, & + B1ADOF66A,B1ADOF66A,B1ADOF66A,B1ADOF66A,B1ADOF66A,B1ADOF66A,B1ADOF66A,B1ADOF66A,B1ADOF66A, & + B1ADOF67A,B1ADOF67A,B1ADOF67A,B1ADOF67A,B1ADOF67A,B1ADOF67A,B1ADOF67A,B1ADOF67A,B1ADOF67A, & + B1ADOF68A,B1ADOF68A,B1ADOF68A,B1ADOF68A,B1ADOF68A,B1ADOF68A,B1ADOF68A,B1ADOF68A,B1ADOF68A, & + B1ADOF69A,B1ADOF69A,B1ADOF69A,B1ADOF69A,B1ADOF69A,B1ADOF69A,B1ADOF69A,B1ADOF69A,B1ADOF69A, & + B1ADOF70A,B1ADOF70A,B1ADOF70A,B1ADOF70A,B1ADOF70A,B1ADOF70A,B1ADOF70A,B1ADOF70A,B1ADOF70A, & + B1ADOF71A,B1ADOF71A,B1ADOF71A,B1ADOF71A,B1ADOF71A,B1ADOF71A,B1ADOF71A,B1ADOF71A,B1ADOF71A, & + B1ADOF72A,B1ADOF72A,B1ADOF72A,B1ADOF72A,B1ADOF72A,B1ADOF72A,B1ADOF72A,B1ADOF72A,B1ADOF72A, & + B1ADOF73A,B1ADOF73A,B1ADOF73A,B1ADOF73A,B1ADOF73A,B1ADOF73A,B1ADOF73A,B1ADOF73A,B1ADOF73A, & + B1ADOF74A,B1ADOF74A,B1ADOF74A,B1ADOF74A,B1ADOF74A,B1ADOF74A,B1ADOF74A,B1ADOF74A,B1ADOF74A, & + B1ADOF75A,B1ADOF75A,B1ADOF75A,B1ADOF75A,B1ADOF75A,B1ADOF75A,B1ADOF75A,B1ADOF75A,B1ADOF75A, & + B1ADOF76A,B1ADOF76A,B1ADOF76A,B1ADOF76A,B1ADOF76A,B1ADOF76A,B1ADOF76A,B1ADOF76A,B1ADOF76A, & + B1ADOF77A,B1ADOF77A,B1ADOF77A,B1ADOF77A,B1ADOF77A,B1ADOF77A,B1ADOF77A,B1ADOF77A,B1ADOF77A, & + B1ADOF78A,B1ADOF78A,B1ADOF78A,B1ADOF78A,B1ADOF78A,B1ADOF78A,B1ADOF78A,B1ADOF78A,B1ADOF78A, & + B1ADOF79A,B1ADOF79A,B1ADOF79A,B1ADOF79A,B1ADOF79A,B1ADOF79A,B1ADOF79A,B1ADOF79A,B1ADOF79A, & + B1ADOF80A,B1ADOF80A,B1ADOF80A,B1ADOF80A,B1ADOF80A,B1ADOF80A,B1ADOF80A,B1ADOF80A,B1ADOF80A, & + B1ADOF81A,B1ADOF81A,B1ADOF81A,B1ADOF81A,B1ADOF81A,B1ADOF81A,B1ADOF81A,B1ADOF81A,B1ADOF81A, & + B1ADOF82A,B1ADOF82A,B1ADOF82A,B1ADOF82A,B1ADOF82A,B1ADOF82A,B1ADOF82A,B1ADOF82A,B1ADOF82A, & + B1ADOF83A,B1ADOF83A,B1ADOF83A,B1ADOF83A,B1ADOF83A,B1ADOF83A,B1ADOF83A,B1ADOF83A,B1ADOF83A, & + B1ADOF84A,B1ADOF84A,B1ADOF84A,B1ADOF84A,B1ADOF84A,B1ADOF84A,B1ADOF84A,B1ADOF84A,B1ADOF84A, & + B1ADOF85A,B1ADOF85A,B1ADOF85A,B1ADOF85A,B1ADOF85A,B1ADOF85A,B1ADOF85A,B1ADOF85A,B1ADOF85A, & + B1ADOF86A,B1ADOF86A,B1ADOF86A,B1ADOF86A,B1ADOF86A,B1ADOF86A,B1ADOF86A,B1ADOF86A,B1ADOF86A, & + B1ADOF87A,B1ADOF87A,B1ADOF87A,B1ADOF87A,B1ADOF87A,B1ADOF87A,B1ADOF87A,B1ADOF87A,B1ADOF87A, & + B1ADOF88A,B1ADOF88A,B1ADOF88A,B1ADOF88A,B1ADOF88A,B1ADOF88A,B1ADOF88A,B1ADOF88A,B1ADOF88A, & + B1ADOF89A,B1ADOF89A,B1ADOF89A,B1ADOF89A,B1ADOF89A,B1ADOF89A,B1ADOF89A,B1ADOF89A,B1ADOF89A, & + B1ADOF90A,B1ADOF90A,B1ADOF90A,B1ADOF90A,B1ADOF90A,B1ADOF90A,B1ADOF90A,B1ADOF90A,B1ADOF90A, & + B1ADOF91A,B1ADOF91A,B1ADOF91A,B1ADOF91A,B1ADOF91A,B1ADOF91A,B1ADOF91A,B1ADOF91A,B1ADOF91A, & + B1ADOF92A,B1ADOF92A,B1ADOF92A,B1ADOF92A,B1ADOF92A,B1ADOF92A,B1ADOF92A,B1ADOF92A,B1ADOF92A, & + B1ADOF93A,B1ADOF93A,B1ADOF93A,B1ADOF93A,B1ADOF93A,B1ADOF93A,B1ADOF93A,B1ADOF93A,B1ADOF93A, & + B1ADOF94A,B1ADOF94A,B1ADOF94A,B1ADOF94A,B1ADOF94A,B1ADOF94A,B1ADOF94A,B1ADOF94A,B1ADOF94A, & + B1ADOF95A,B1ADOF95A,B1ADOF95A,B1ADOF95A,B1ADOF95A,B1ADOF95A,B1ADOF95A,B1ADOF95A,B1ADOF95A, & + B1ADOF96A,B1ADOF96A,B1ADOF96A,B1ADOF96A,B1ADOF96A,B1ADOF96A,B1ADOF96A,B1ADOF96A,B1ADOF96A, & + B1ADOF97A,B1ADOF97A,B1ADOF97A,B1ADOF97A,B1ADOF97A,B1ADOF97A,B1ADOF97A,B1ADOF97A,B1ADOF97A, & + B1ADOF98A,B1ADOF98A,B1ADOF98A,B1ADOF98A,B1ADOF98A,B1ADOF98A,B1ADOF98A,B1ADOF98A,B1ADOF98A, & + B1ADOF99A,B1ADOF99A,B1ADOF99A,B1ADOF99A,B1ADOF99A,B1ADOF99A,B1ADOF99A,B1ADOF99A,B1ADOF99A/), & + (/9,99/))) + + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry1(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "B1ADDFXI ","B1ADDFYI ","B1ADDFZI ","B1ADDMXI ","B1ADDMYI ","B1ADDMZI ","B1ADOF10A ", & + "B1ADOF10ADD","B1ADOF10D ","B1ADOF10HDS","B1ADOF10RDT","B1ADOF10V ","B1ADOF10WVS","B1ADOF11A ", & + "B1ADOF11ADD","B1ADOF11D ","B1ADOF11HDS","B1ADOF11RDT","B1ADOF11V ","B1ADOF11WVS","B1ADOF12A ", & + "B1ADOF12ADD","B1ADOF12D ","B1ADOF12HDS","B1ADOF12RDT","B1ADOF12V ","B1ADOF12WVS","B1ADOF13A ", & + "B1ADOF13ADD","B1ADOF13D ","B1ADOF13HDS","B1ADOF13RDT","B1ADOF13V ","B1ADOF13WVS","B1ADOF14A ", & + "B1ADOF14ADD","B1ADOF14D ","B1ADOF14HDS","B1ADOF14RDT","B1ADOF14V ","B1ADOF14WVS","B1ADOF15A ", & + "B1ADOF15ADD","B1ADOF15D ","B1ADOF15HDS","B1ADOF15RDT","B1ADOF15V ","B1ADOF15WVS","B1ADOF16A ", & + "B1ADOF16ADD","B1ADOF16D ","B1ADOF16HDS","B1ADOF16RDT","B1ADOF16V ","B1ADOF16WVS","B1ADOF17A ", & + "B1ADOF17ADD","B1ADOF17D ","B1ADOF17HDS","B1ADOF17RDT","B1ADOF17V ","B1ADOF17WVS","B1ADOF18A ", & + "B1ADOF18ADD","B1ADOF18D ","B1ADOF18HDS","B1ADOF18RDT","B1ADOF18V ","B1ADOF18WVS","B1ADOF19A ", & + "B1ADOF19ADD","B1ADOF19D ","B1ADOF19HDS","B1ADOF19RDT","B1ADOF19V ","B1ADOF19WVS","B1ADOF1A ", & + "B1ADOF1ADD ","B1ADOF1D ","B1ADOF1HDS ","B1ADOF1RDT ","B1ADOF1V ","B1ADOF1WVS ","B1ADOF20A ", & + "B1ADOF20ADD","B1ADOF20D ","B1ADOF20HDS","B1ADOF20RDT","B1ADOF20V ","B1ADOF20WVS","B1ADOF21A ", & + "B1ADOF21ADD","B1ADOF21D ","B1ADOF21HDS","B1ADOF21RDT","B1ADOF21V ","B1ADOF21WVS","B1ADOF22A ", & + "B1ADOF22ADD","B1ADOF22D ","B1ADOF22HDS","B1ADOF22RDT","B1ADOF22V ","B1ADOF22WVS","B1ADOF23A ", & + "B1ADOF23ADD","B1ADOF23D ","B1ADOF23HDS","B1ADOF23RDT","B1ADOF23V ","B1ADOF23WVS","B1ADOF24A ", & + "B1ADOF24ADD","B1ADOF24D ","B1ADOF24HDS","B1ADOF24RDT","B1ADOF24V ","B1ADOF24WVS","B1ADOF25A ", & + "B1ADOF25ADD","B1ADOF25D ","B1ADOF25HDS","B1ADOF25RDT","B1ADOF25V ","B1ADOF25WVS","B1ADOF26A ", & + "B1ADOF26ADD","B1ADOF26D ","B1ADOF26HDS","B1ADOF26RDT","B1ADOF26V ","B1ADOF26WVS","B1ADOF27A ", & + "B1ADOF27ADD","B1ADOF27D ","B1ADOF27HDS","B1ADOF27RDT","B1ADOF27V ","B1ADOF27WVS","B1ADOF28A ", & + "B1ADOF28ADD","B1ADOF28D ","B1ADOF28HDS","B1ADOF28RDT","B1ADOF28V ","B1ADOF28WVS","B1ADOF29A ", & + "B1ADOF29ADD","B1ADOF29D ","B1ADOF29HDS","B1ADOF29RDT","B1ADOF29V ","B1ADOF29WVS","B1ADOF2A ", & + "B1ADOF2ADD ","B1ADOF2D ","B1ADOF2HDS ","B1ADOF2RDT ","B1ADOF2V ","B1ADOF2WVS ","B1ADOF30A ", & + "B1ADOF30ADD","B1ADOF30D ","B1ADOF30HDS","B1ADOF30RDT","B1ADOF30V ","B1ADOF30WVS","B1ADOF31A ", & + "B1ADOF31ADD","B1ADOF31D ","B1ADOF31HDS","B1ADOF31RDT","B1ADOF31V ","B1ADOF31WVS","B1ADOF32A ", & + "B1ADOF32ADD","B1ADOF32D ","B1ADOF32HDS","B1ADOF32RDT","B1ADOF32V ","B1ADOF32WVS","B1ADOF33A ", & + "B1ADOF33ADD","B1ADOF33D ","B1ADOF33HDS","B1ADOF33RDT","B1ADOF33V ","B1ADOF33WVS","B1ADOF34A ", & + "B1ADOF34ADD","B1ADOF34D ","B1ADOF34HDS","B1ADOF34RDT","B1ADOF34V ","B1ADOF34WVS","B1ADOF35A ", & + "B1ADOF35ADD","B1ADOF35D ","B1ADOF35HDS","B1ADOF35RDT","B1ADOF35V ","B1ADOF35WVS","B1ADOF36A ", & + "B1ADOF36ADD","B1ADOF36D ","B1ADOF36HDS","B1ADOF36RDT","B1ADOF36V ","B1ADOF36WVS","B1ADOF37A ", & + "B1ADOF37ADD","B1ADOF37D ","B1ADOF37HDS","B1ADOF37RDT","B1ADOF37V ","B1ADOF37WVS","B1ADOF38A ", & + "B1ADOF38ADD","B1ADOF38D ","B1ADOF38HDS","B1ADOF38RDT","B1ADOF38V ","B1ADOF38WVS","B1ADOF39A ", & + "B1ADOF39ADD","B1ADOF39D ","B1ADOF39HDS","B1ADOF39RDT","B1ADOF39V ","B1ADOF39WVS","B1ADOF3A ", & + "B1ADOF3ADD ","B1ADOF3D ","B1ADOF3HDS ","B1ADOF3RDT ","B1ADOF3V ","B1ADOF3WVS ","B1ADOF40A ", & + "B1ADOF40ADD","B1ADOF40D ","B1ADOF40HDS","B1ADOF40RDT","B1ADOF40V ","B1ADOF40WVS","B1ADOF41A ", & + "B1ADOF41ADD","B1ADOF41D ","B1ADOF41HDS","B1ADOF41RDT","B1ADOF41V ","B1ADOF41WVS","B1ADOF42A ", & + "B1ADOF42ADD","B1ADOF42D ","B1ADOF42HDS","B1ADOF42RDT","B1ADOF42V ","B1ADOF42WVS","B1ADOF43A ", & + "B1ADOF43ADD","B1ADOF43D ","B1ADOF43HDS","B1ADOF43RDT","B1ADOF43V ","B1ADOF43WVS","B1ADOF44A ", & + "B1ADOF44ADD","B1ADOF44D ","B1ADOF44HDS","B1ADOF44RDT","B1ADOF44V ","B1ADOF44WVS","B1ADOF45A ", & + "B1ADOF45ADD","B1ADOF45D ","B1ADOF45HDS","B1ADOF45RDT","B1ADOF45V ","B1ADOF45WVS","B1ADOF46A ", & + "B1ADOF46ADD","B1ADOF46D ","B1ADOF46HDS","B1ADOF46RDT","B1ADOF46V ","B1ADOF46WVS","B1ADOF47A ", & + "B1ADOF47ADD","B1ADOF47D ","B1ADOF47HDS","B1ADOF47RDT","B1ADOF47V ","B1ADOF47WVS","B1ADOF48A ", & + "B1ADOF48ADD","B1ADOF48D ","B1ADOF48HDS","B1ADOF48RDT","B1ADOF48V ","B1ADOF48WVS","B1ADOF49A ", & + "B1ADOF49ADD","B1ADOF49D ","B1ADOF49HDS","B1ADOF49RDT","B1ADOF49V ","B1ADOF49WVS","B1ADOF4A ", & + "B1ADOF4ADD ","B1ADOF4D ","B1ADOF4HDS ","B1ADOF4RDT ","B1ADOF4V ","B1ADOF4WVS ","B1ADOF50A ", & + "B1ADOF50ADD","B1ADOF50D ","B1ADOF50HDS","B1ADOF50RDT","B1ADOF50V ","B1ADOF50WVS","B1ADOF51A ", & + "B1ADOF51ADD","B1ADOF51D ","B1ADOF51HDS","B1ADOF51RDT","B1ADOF51V ","B1ADOF51WVS","B1ADOF52A ", & + "B1ADOF52ADD","B1ADOF52D ","B1ADOF52HDS","B1ADOF52RDT","B1ADOF52V ","B1ADOF52WVS","B1ADOF53A ", & + "B1ADOF53ADD","B1ADOF53D ","B1ADOF53HDS","B1ADOF53RDT","B1ADOF53V ","B1ADOF53WVS","B1ADOF54A ", & + "B1ADOF54ADD","B1ADOF54D ","B1ADOF54HDS","B1ADOF54RDT","B1ADOF54V ","B1ADOF54WVS","B1ADOF55A ", & + "B1ADOF55ADD","B1ADOF55D ","B1ADOF55HDS","B1ADOF55RDT","B1ADOF55V ","B1ADOF55WVS","B1ADOF56A ", & + "B1ADOF56ADD","B1ADOF56D ","B1ADOF56HDS","B1ADOF56RDT","B1ADOF56V ","B1ADOF56WVS","B1ADOF57A ", & + "B1ADOF57ADD","B1ADOF57D ","B1ADOF57HDS","B1ADOF57RDT","B1ADOF57V ","B1ADOF57WVS","B1ADOF58A ", & + "B1ADOF58ADD","B1ADOF58D ","B1ADOF58HDS","B1ADOF58RDT","B1ADOF58V ","B1ADOF58WVS","B1ADOF59A ", & + "B1ADOF59ADD","B1ADOF59D ","B1ADOF59HDS","B1ADOF59RDT","B1ADOF59V ","B1ADOF59WVS","B1ADOF5A ", & + "B1ADOF5ADD ","B1ADOF5D ","B1ADOF5HDS ","B1ADOF5RDT ","B1ADOF5V ","B1ADOF5WVS ","B1ADOF60A ", & + "B1ADOF60ADD","B1ADOF60D ","B1ADOF60HDS","B1ADOF60RDT","B1ADOF60V ","B1ADOF60WVS","B1ADOF61A ", & + "B1ADOF61ADD","B1ADOF61D ","B1ADOF61HDS","B1ADOF61RDT","B1ADOF61V ","B1ADOF61WVS","B1ADOF62A ", & + "B1ADOF62ADD","B1ADOF62D ","B1ADOF62HDS","B1ADOF62RDT","B1ADOF62V ","B1ADOF62WVS","B1ADOF63A ", & + "B1ADOF63ADD","B1ADOF63D ","B1ADOF63HDS","B1ADOF63RDT","B1ADOF63V ","B1ADOF63WVS","B1ADOF64A ", & + "B1ADOF64ADD","B1ADOF64D ","B1ADOF64HDS","B1ADOF64RDT","B1ADOF64V ","B1ADOF64WVS","B1ADOF65A ", & + "B1ADOF65ADD","B1ADOF65D ","B1ADOF65HDS","B1ADOF65RDT","B1ADOF65V ","B1ADOF65WVS","B1ADOF66A ", & + "B1ADOF66ADD","B1ADOF66D ","B1ADOF66HDS","B1ADOF66RDT","B1ADOF66V ","B1ADOF66WVS","B1ADOF67A ", & + "B1ADOF67ADD","B1ADOF67D ","B1ADOF67HDS","B1ADOF67RDT","B1ADOF67V ","B1ADOF67WVS","B1ADOF68A ", & + "B1ADOF68ADD","B1ADOF68D ","B1ADOF68HDS","B1ADOF68RDT","B1ADOF68V ","B1ADOF68WVS","B1ADOF69A ", & + "B1ADOF69ADD","B1ADOF69D ","B1ADOF69HDS","B1ADOF69RDT","B1ADOF69V ","B1ADOF69WVS","B1ADOF6A ", & + "B1ADOF6ADD ","B1ADOF6D ","B1ADOF6HDS ","B1ADOF6RDT ","B1ADOF6V ","B1ADOF6WVS ","B1ADOF70A ", & + "B1ADOF70ADD","B1ADOF70D ","B1ADOF70HDS","B1ADOF70RDT","B1ADOF70V ","B1ADOF70WVS","B1ADOF71A ", & + "B1ADOF71ADD","B1ADOF71D ","B1ADOF71HDS","B1ADOF71RDT","B1ADOF71V ","B1ADOF71WVS","B1ADOF72A ", & + "B1ADOF72ADD","B1ADOF72D ","B1ADOF72HDS","B1ADOF72RDT","B1ADOF72V ","B1ADOF72WVS","B1ADOF73A ", & + "B1ADOF73ADD","B1ADOF73D ","B1ADOF73HDS","B1ADOF73RDT","B1ADOF73V ","B1ADOF73WVS","B1ADOF74A ", & + "B1ADOF74ADD","B1ADOF74D ","B1ADOF74HDS","B1ADOF74RDT","B1ADOF74V ","B1ADOF74WVS","B1ADOF75A ", & + "B1ADOF75ADD","B1ADOF75D ","B1ADOF75HDS","B1ADOF75RDT","B1ADOF75V ","B1ADOF75WVS","B1ADOF76A ", & + "B1ADOF76ADD","B1ADOF76D ","B1ADOF76HDS","B1ADOF76RDT","B1ADOF76V ","B1ADOF76WVS","B1ADOF77A ", & + "B1ADOF77ADD","B1ADOF77D ","B1ADOF77HDS","B1ADOF77RDT","B1ADOF77V ","B1ADOF77WVS","B1ADOF78A ", & + "B1ADOF78ADD","B1ADOF78D ","B1ADOF78HDS","B1ADOF78RDT","B1ADOF78V ","B1ADOF78WVS","B1ADOF79A ", & + "B1ADOF79ADD","B1ADOF79D ","B1ADOF79HDS","B1ADOF79RDT","B1ADOF79V ","B1ADOF79WVS","B1ADOF7A ", & + "B1ADOF7ADD ","B1ADOF7D ","B1ADOF7HDS ","B1ADOF7RDT ","B1ADOF7V ","B1ADOF7WVS ","B1ADOF80A ", & + "B1ADOF80ADD","B1ADOF80D ","B1ADOF80HDS","B1ADOF80RDT","B1ADOF80V ","B1ADOF80WVS","B1ADOF81A ", & + "B1ADOF81ADD","B1ADOF81D ","B1ADOF81HDS","B1ADOF81RDT","B1ADOF81V ","B1ADOF81WVS","B1ADOF82A ", & + "B1ADOF82ADD","B1ADOF82D ","B1ADOF82HDS","B1ADOF82RDT","B1ADOF82V ","B1ADOF82WVS","B1ADOF83A ", & + "B1ADOF83ADD","B1ADOF83D ","B1ADOF83HDS","B1ADOF83RDT","B1ADOF83V ","B1ADOF83WVS","B1ADOF84A ", & + "B1ADOF84ADD","B1ADOF84D ","B1ADOF84HDS","B1ADOF84RDT","B1ADOF84V ","B1ADOF84WVS","B1ADOF85A ", & + "B1ADOF85ADD","B1ADOF85D ","B1ADOF85HDS","B1ADOF85RDT","B1ADOF85V ","B1ADOF85WVS","B1ADOF86A ", & + "B1ADOF86ADD","B1ADOF86D ","B1ADOF86HDS","B1ADOF86RDT","B1ADOF86V ","B1ADOF86WVS","B1ADOF87A ", & + "B1ADOF87ADD","B1ADOF87D ","B1ADOF87HDS","B1ADOF87RDT","B1ADOF87V ","B1ADOF87WVS","B1ADOF88A ", & + "B1ADOF88ADD","B1ADOF88D ","B1ADOF88HDS","B1ADOF88RDT","B1ADOF88V ","B1ADOF88WVS","B1ADOF89A ", & + "B1ADOF89ADD","B1ADOF89D ","B1ADOF89HDS","B1ADOF89RDT","B1ADOF89V ","B1ADOF89WVS","B1ADOF8A ", & + "B1ADOF8ADD ","B1ADOF8D ","B1ADOF8HDS ","B1ADOF8RDT ","B1ADOF8V ","B1ADOF8WVS ","B1ADOF90A ", & + "B1ADOF90ADD","B1ADOF90D ","B1ADOF90HDS","B1ADOF90RDT","B1ADOF90V ","B1ADOF90WVS","B1ADOF91A ", & + "B1ADOF91ADD","B1ADOF91D ","B1ADOF91HDS","B1ADOF91RDT","B1ADOF91V ","B1ADOF91WVS","B1ADOF92A ", & + "B1ADOF92ADD","B1ADOF92D ","B1ADOF92HDS","B1ADOF92RDT","B1ADOF92V ","B1ADOF92WVS","B1ADOF93A ", & + "B1ADOF93ADD","B1ADOF93D ","B1ADOF93HDS","B1ADOF93RDT","B1ADOF93V ","B1ADOF93WVS","B1ADOF94A ", & + "B1ADOF94ADD","B1ADOF94D ","B1ADOF94HDS","B1ADOF94RDT","B1ADOF94V ","B1ADOF94WVS","B1ADOF95A ", & + "B1ADOF95ADD","B1ADOF95D ","B1ADOF95HDS","B1ADOF95RDT","B1ADOF95V ","B1ADOF95WVS","B1ADOF96A ", & + "B1ADOF96ADD","B1ADOF96D ","B1ADOF96HDS","B1ADOF96RDT","B1ADOF96V ","B1ADOF96WVS","B1ADOF97A ", & + "B1ADOF97ADD","B1ADOF97D ","B1ADOF97HDS","B1ADOF97RDT","B1ADOF97V ","B1ADOF97WVS","B1ADOF98A ", & + "B1ADOF98ADD","B1ADOF98D ","B1ADOF98HDS","B1ADOF98RDT","B1ADOF98V ","B1ADOF98WVS","B1ADOF99A ", & + "B1ADOF99ADD","B1ADOF99D ","B1ADOF99HDS","B1ADOF99RDT","B1ADOF99V ","B1ADOF99WVS","B1ADOF9A ", & + "B1ADOF9ADD ","B1ADOF9D ","B1ADOF9HDS ","B1ADOF9RDT ","B1ADOF9V ","B1ADOF9WVS ","B1HDSFXI ", & + "B1HDSFYI ","B1HDSFZI ","B1HDSMXI ","B1HDSMYI ","B1HDSMZI ","B1HEAVE ","B1PITCH ", & + "B1RAXI ","B1RAYI ","B1RAZI ","B1RDTFXI ","B1RDTFYI ","B1RDTFZI ","B1RDTMXI ", & + "B1RDTMYI ","B1RDTMZI ","B1ROLL ","B1RVXI ","B1RVYI ","B1RVZI ","B1SURGE ", & + "B1SWAY ","B1TAXI ","B1TAYI ","B1TAZI ","B1TVXI ","B1TVYI ","B1TVZI ", & + "B1WVSF1XI ","B1WVSF1YI ","B1WVSF1ZI ","B1WVSF2XI ","B1WVSF2YI ","B1WVSF2ZI ","B1WVSFXI ", & + "B1WVSFYI ","B1WVSFZI ","B1WVSM1XI ","B1WVSM1YI ","B1WVSM1ZI ","B1WVSM2XI ","B1WVSM2YI ", & + "B1WVSM2ZI ","B1WVSMXI ","B1WVSMYI ","B1WVSMZI ","B1YAW ","B2ADDFXI ","B2ADDFYI ", & + "B2ADDFZI ","B2ADDMXI ","B2ADDMYI ","B2ADDMZI ","B2ADOF10A ","B2ADOF10ADD","B2ADOF10D ", & + "B2ADOF10HDS","B2ADOF10RDT","B2ADOF10V ","B2ADOF10WVS","B2ADOF11A ","B2ADOF11ADD","B2ADOF11D ", & + "B2ADOF11HDS","B2ADOF11RDT","B2ADOF11V ","B2ADOF11WVS","B2ADOF12A ","B2ADOF12ADD","B2ADOF12D ", & + "B2ADOF12HDS","B2ADOF12RDT","B2ADOF12V ","B2ADOF12WVS","B2ADOF13A ","B2ADOF13ADD","B2ADOF13D ", & + "B2ADOF13HDS","B2ADOF13RDT","B2ADOF13V ","B2ADOF13WVS","B2ADOF14A ","B2ADOF14ADD","B2ADOF14D ", & + "B2ADOF14HDS","B2ADOF14RDT","B2ADOF14V ","B2ADOF14WVS","B2ADOF15A ","B2ADOF15ADD","B2ADOF15D ", & + "B2ADOF15HDS","B2ADOF15RDT","B2ADOF15V ","B2ADOF15WVS","B2ADOF16A ","B2ADOF16ADD","B2ADOF16D ", & + "B2ADOF16HDS","B2ADOF16RDT","B2ADOF16V ","B2ADOF16WVS","B2ADOF17A ","B2ADOF17ADD","B2ADOF17D ", & + "B2ADOF17HDS","B2ADOF17RDT","B2ADOF17V ","B2ADOF17WVS","B2ADOF18A ","B2ADOF18ADD","B2ADOF18D ", & + "B2ADOF18HDS","B2ADOF18RDT","B2ADOF18V ","B2ADOF18WVS","B2ADOF19A ","B2ADOF19ADD","B2ADOF19D ", & + "B2ADOF19HDS","B2ADOF19RDT","B2ADOF19V ","B2ADOF19WVS","B2ADOF1A ","B2ADOF1ADD ","B2ADOF1D ", & + "B2ADOF1HDS ","B2ADOF1RDT ","B2ADOF1V ","B2ADOF1WVS ","B2ADOF20A ","B2ADOF20ADD","B2ADOF20D ", & + "B2ADOF20HDS","B2ADOF20RDT","B2ADOF20V ","B2ADOF20WVS","B2ADOF21A ","B2ADOF21ADD","B2ADOF21D ", & + "B2ADOF21HDS","B2ADOF21RDT","B2ADOF21V ","B2ADOF21WVS","B2ADOF22A ","B2ADOF22ADD","B2ADOF22D ", & + "B2ADOF22HDS","B2ADOF22RDT","B2ADOF22V ","B2ADOF22WVS","B2ADOF23A ","B2ADOF23ADD","B2ADOF23D ", & + "B2ADOF23HDS","B2ADOF23RDT","B2ADOF23V ","B2ADOF23WVS","B2ADOF24A ","B2ADOF24ADD","B2ADOF24D ", & + "B2ADOF24HDS","B2ADOF24RDT","B2ADOF24V ","B2ADOF24WVS","B2ADOF25A ","B2ADOF25ADD","B2ADOF25D ", & + "B2ADOF25HDS","B2ADOF25RDT","B2ADOF25V ","B2ADOF25WVS","B2ADOF26A ","B2ADOF26ADD","B2ADOF26D ", & + "B2ADOF26HDS","B2ADOF26RDT","B2ADOF26V ","B2ADOF26WVS","B2ADOF27A ","B2ADOF27ADD","B2ADOF27D ", & + "B2ADOF27HDS","B2ADOF27RDT","B2ADOF27V ","B2ADOF27WVS","B2ADOF28A ","B2ADOF28ADD","B2ADOF28D ", & + "B2ADOF28HDS","B2ADOF28RDT","B2ADOF28V ","B2ADOF28WVS","B2ADOF29A ","B2ADOF29ADD","B2ADOF29D ", & + "B2ADOF29HDS","B2ADOF29RDT","B2ADOF29V ","B2ADOF29WVS","B2ADOF2A ","B2ADOF2ADD ","B2ADOF2D ", & + "B2ADOF2HDS ","B2ADOF2RDT ","B2ADOF2V ","B2ADOF2WVS ","B2ADOF30A ","B2ADOF30ADD","B2ADOF30D ", & + "B2ADOF30HDS","B2ADOF30RDT","B2ADOF30V ","B2ADOF30WVS","B2ADOF31A ","B2ADOF31ADD","B2ADOF31D ", & + "B2ADOF31HDS","B2ADOF31RDT","B2ADOF31V ","B2ADOF31WVS","B2ADOF32A ","B2ADOF32ADD","B2ADOF32D ", & + "B2ADOF32HDS","B2ADOF32RDT","B2ADOF32V ","B2ADOF32WVS","B2ADOF33A ","B2ADOF33ADD","B2ADOF33D ", & + "B2ADOF33HDS","B2ADOF33RDT","B2ADOF33V ","B2ADOF33WVS","B2ADOF34A ","B2ADOF34ADD","B2ADOF34D ", & + "B2ADOF34HDS","B2ADOF34RDT","B2ADOF34V ","B2ADOF34WVS","B2ADOF35A ","B2ADOF35ADD","B2ADOF35D ", & + "B2ADOF35HDS","B2ADOF35RDT","B2ADOF35V ","B2ADOF35WVS","B2ADOF36A ","B2ADOF36ADD","B2ADOF36D ", & + "B2ADOF36HDS","B2ADOF36RDT","B2ADOF36V ","B2ADOF36WVS","B2ADOF37A ","B2ADOF37ADD","B2ADOF37D ", & + "B2ADOF37HDS","B2ADOF37RDT","B2ADOF37V ","B2ADOF37WVS","B2ADOF38A ","B2ADOF38ADD","B2ADOF38D ", & + "B2ADOF38HDS","B2ADOF38RDT","B2ADOF38V ","B2ADOF38WVS","B2ADOF39A ","B2ADOF39ADD","B2ADOF39D ", & + "B2ADOF39HDS","B2ADOF39RDT","B2ADOF39V ","B2ADOF39WVS","B2ADOF3A ","B2ADOF3ADD ","B2ADOF3D ", & + "B2ADOF3HDS ","B2ADOF3RDT ","B2ADOF3V ","B2ADOF3WVS ","B2ADOF40A ","B2ADOF40ADD","B2ADOF40D ", & + "B2ADOF40HDS","B2ADOF40RDT","B2ADOF40V ","B2ADOF40WVS","B2ADOF41A ","B2ADOF41ADD","B2ADOF41D ", & + "B2ADOF41HDS","B2ADOF41RDT","B2ADOF41V ","B2ADOF41WVS","B2ADOF42A ","B2ADOF42ADD","B2ADOF42D ", & + "B2ADOF42HDS","B2ADOF42RDT","B2ADOF42V ","B2ADOF42WVS","B2ADOF43A ","B2ADOF43ADD","B2ADOF43D ", & + "B2ADOF43HDS","B2ADOF43RDT","B2ADOF43V ","B2ADOF43WVS","B2ADOF44A ","B2ADOF44ADD","B2ADOF44D ", & + "B2ADOF44HDS","B2ADOF44RDT","B2ADOF44V ","B2ADOF44WVS","B2ADOF45A ","B2ADOF45ADD","B2ADOF45D ", & + "B2ADOF45HDS","B2ADOF45RDT","B2ADOF45V ","B2ADOF45WVS","B2ADOF46A ","B2ADOF46ADD","B2ADOF46D ", & + "B2ADOF46HDS","B2ADOF46RDT","B2ADOF46V ","B2ADOF46WVS","B2ADOF47A ","B2ADOF47ADD","B2ADOF47D ", & + "B2ADOF47HDS","B2ADOF47RDT","B2ADOF47V ","B2ADOF47WVS","B2ADOF48A ","B2ADOF48ADD","B2ADOF48D ", & + "B2ADOF48HDS","B2ADOF48RDT","B2ADOF48V ","B2ADOF48WVS","B2ADOF49A ","B2ADOF49ADD","B2ADOF49D ", & + "B2ADOF49HDS","B2ADOF49RDT","B2ADOF49V ","B2ADOF49WVS","B2ADOF4A ","B2ADOF4ADD ","B2ADOF4D ", & + "B2ADOF4HDS ","B2ADOF4RDT ","B2ADOF4V ","B2ADOF4WVS ","B2ADOF50A ","B2ADOF50ADD","B2ADOF50D ", & + "B2ADOF50HDS","B2ADOF50RDT","B2ADOF50V ","B2ADOF50WVS","B2ADOF51A ","B2ADOF51ADD","B2ADOF51D ", & + "B2ADOF51HDS","B2ADOF51RDT","B2ADOF51V ","B2ADOF51WVS","B2ADOF52A ","B2ADOF52ADD","B2ADOF52D ", & + "B2ADOF52HDS","B2ADOF52RDT","B2ADOF52V ","B2ADOF52WVS","B2ADOF53A ","B2ADOF53ADD","B2ADOF53D ", & + "B2ADOF53HDS","B2ADOF53RDT","B2ADOF53V ","B2ADOF53WVS","B2ADOF54A ","B2ADOF54ADD","B2ADOF54D ", & + "B2ADOF54HDS","B2ADOF54RDT","B2ADOF54V ","B2ADOF54WVS","B2ADOF55A ","B2ADOF55ADD","B2ADOF55D ", & + "B2ADOF55HDS","B2ADOF55RDT","B2ADOF55V ","B2ADOF55WVS","B2ADOF56A ","B2ADOF56ADD","B2ADOF56D ", & + "B2ADOF56HDS","B2ADOF56RDT","B2ADOF56V ","B2ADOF56WVS","B2ADOF57A ","B2ADOF57ADD","B2ADOF57D ", & + "B2ADOF57HDS","B2ADOF57RDT","B2ADOF57V ","B2ADOF57WVS","B2ADOF58A ","B2ADOF58ADD","B2ADOF58D ", & + "B2ADOF58HDS","B2ADOF58RDT","B2ADOF58V ","B2ADOF58WVS","B2ADOF59A ","B2ADOF59ADD","B2ADOF59D ", & + "B2ADOF59HDS","B2ADOF59RDT","B2ADOF59V ","B2ADOF59WVS","B2ADOF5A ","B2ADOF5ADD ","B2ADOF5D ", & + "B2ADOF5HDS ","B2ADOF5RDT ","B2ADOF5V ","B2ADOF5WVS ","B2ADOF60A ","B2ADOF60ADD","B2ADOF60D ", & + "B2ADOF60HDS","B2ADOF60RDT","B2ADOF60V ","B2ADOF60WVS","B2ADOF61A ","B2ADOF61ADD","B2ADOF61D ", & + "B2ADOF61HDS","B2ADOF61RDT","B2ADOF61V ","B2ADOF61WVS","B2ADOF62A ","B2ADOF62ADD","B2ADOF62D ", & + "B2ADOF62HDS","B2ADOF62RDT","B2ADOF62V ","B2ADOF62WVS","B2ADOF63A ","B2ADOF63ADD","B2ADOF63D ", & + "B2ADOF63HDS","B2ADOF63RDT","B2ADOF63V ","B2ADOF63WVS","B2ADOF64A ","B2ADOF64ADD","B2ADOF64D ", & + "B2ADOF64HDS","B2ADOF64RDT","B2ADOF64V ","B2ADOF64WVS","B2ADOF65A ","B2ADOF65ADD","B2ADOF65D ", & + "B2ADOF65HDS","B2ADOF65RDT","B2ADOF65V ","B2ADOF65WVS","B2ADOF66A ","B2ADOF66ADD","B2ADOF66D ", & + "B2ADOF66HDS","B2ADOF66RDT","B2ADOF66V ","B2ADOF66WVS","B2ADOF67A ","B2ADOF67ADD","B2ADOF67D ", & + "B2ADOF67HDS","B2ADOF67RDT","B2ADOF67V ","B2ADOF67WVS","B2ADOF68A ","B2ADOF68ADD","B2ADOF68D ", & + "B2ADOF68HDS","B2ADOF68RDT","B2ADOF68V ","B2ADOF68WVS","B2ADOF69A ","B2ADOF69ADD","B2ADOF69D ", & + "B2ADOF69HDS","B2ADOF69RDT","B2ADOF69V ","B2ADOF69WVS","B2ADOF6A ","B2ADOF6ADD ","B2ADOF6D ", & + "B2ADOF6HDS ","B2ADOF6RDT ","B2ADOF6V ","B2ADOF6WVS ","B2ADOF70A ","B2ADOF70ADD","B2ADOF70D ", & + "B2ADOF70HDS","B2ADOF70RDT","B2ADOF70V ","B2ADOF70WVS","B2ADOF71A ","B2ADOF71ADD","B2ADOF71D ", & + "B2ADOF71HDS","B2ADOF71RDT","B2ADOF71V ","B2ADOF71WVS","B2ADOF72A ","B2ADOF72ADD","B2ADOF72D ", & + "B2ADOF72HDS","B2ADOF72RDT","B2ADOF72V ","B2ADOF72WVS","B2ADOF73A ","B2ADOF73ADD","B2ADOF73D ", & + "B2ADOF73HDS","B2ADOF73RDT","B2ADOF73V ","B2ADOF73WVS","B2ADOF74A ","B2ADOF74ADD","B2ADOF74D ", & + "B2ADOF74HDS","B2ADOF74RDT","B2ADOF74V ","B2ADOF74WVS","B2ADOF75A ","B2ADOF75ADD","B2ADOF75D ", & + "B2ADOF75HDS","B2ADOF75RDT","B2ADOF75V ","B2ADOF75WVS","B2ADOF76A ","B2ADOF76ADD","B2ADOF76D ", & + "B2ADOF76HDS","B2ADOF76RDT","B2ADOF76V ","B2ADOF76WVS","B2ADOF77A ","B2ADOF77ADD","B2ADOF77D ", & + "B2ADOF77HDS","B2ADOF77RDT","B2ADOF77V ","B2ADOF77WVS","B2ADOF78A ","B2ADOF78ADD","B2ADOF78D ", & + "B2ADOF78HDS","B2ADOF78RDT","B2ADOF78V ","B2ADOF78WVS","B2ADOF79A ","B2ADOF79ADD","B2ADOF79D ", & + "B2ADOF79HDS","B2ADOF79RDT","B2ADOF79V ","B2ADOF79WVS","B2ADOF7A ","B2ADOF7ADD ","B2ADOF7D ", & + "B2ADOF7HDS ","B2ADOF7RDT ","B2ADOF7V ","B2ADOF7WVS ","B2ADOF80A ","B2ADOF80ADD","B2ADOF80D ", & + "B2ADOF80HDS","B2ADOF80RDT","B2ADOF80V ","B2ADOF80WVS","B2ADOF81A ","B2ADOF81ADD","B2ADOF81D ", & + "B2ADOF81HDS","B2ADOF81RDT","B2ADOF81V ","B2ADOF81WVS","B2ADOF82A ","B2ADOF82ADD","B2ADOF82D ", & + "B2ADOF82HDS","B2ADOF82RDT","B2ADOF82V ","B2ADOF82WVS","B2ADOF83A ","B2ADOF83ADD","B2ADOF83D ", & + "B2ADOF83HDS","B2ADOF83RDT","B2ADOF83V ","B2ADOF83WVS","B2ADOF84A ","B2ADOF84ADD","B2ADOF84D ", & + "B2ADOF84HDS","B2ADOF84RDT","B2ADOF84V ","B2ADOF84WVS","B2ADOF85A ","B2ADOF85ADD","B2ADOF85D ", & + "B2ADOF85HDS","B2ADOF85RDT","B2ADOF85V ","B2ADOF85WVS","B2ADOF86A ","B2ADOF86ADD","B2ADOF86D ", & + "B2ADOF86HDS","B2ADOF86RDT","B2ADOF86V ","B2ADOF86WVS","B2ADOF87A ","B2ADOF87ADD","B2ADOF87D ", & + "B2ADOF87HDS","B2ADOF87RDT","B2ADOF87V ","B2ADOF87WVS","B2ADOF88A ","B2ADOF88ADD","B2ADOF88D ", & + "B2ADOF88HDS","B2ADOF88RDT","B2ADOF88V ","B2ADOF88WVS","B2ADOF89A ","B2ADOF89ADD","B2ADOF89D ", & + "B2ADOF89HDS","B2ADOF89RDT","B2ADOF89V ","B2ADOF89WVS","B2ADOF8A ","B2ADOF8ADD ","B2ADOF8D ", & + "B2ADOF8HDS ","B2ADOF8RDT ","B2ADOF8V ","B2ADOF8WVS ","B2ADOF90A ","B2ADOF90ADD","B2ADOF90D ", & + "B2ADOF90HDS","B2ADOF90RDT","B2ADOF90V ","B2ADOF90WVS","B2ADOF91A ","B2ADOF91ADD","B2ADOF91D ", & + "B2ADOF91HDS","B2ADOF91RDT","B2ADOF91V ","B2ADOF91WVS","B2ADOF92A ","B2ADOF92ADD","B2ADOF92D ", & + "B2ADOF92HDS","B2ADOF92RDT","B2ADOF92V ","B2ADOF92WVS","B2ADOF93A ","B2ADOF93ADD","B2ADOF93D ", & + "B2ADOF93HDS","B2ADOF93RDT","B2ADOF93V ","B2ADOF93WVS","B2ADOF94A ","B2ADOF94ADD","B2ADOF94D ", & + "B2ADOF94HDS","B2ADOF94RDT","B2ADOF94V ","B2ADOF94WVS","B2ADOF95A ","B2ADOF95ADD","B2ADOF95D ", & + "B2ADOF95HDS","B2ADOF95RDT","B2ADOF95V ","B2ADOF95WVS","B2ADOF96A ","B2ADOF96ADD","B2ADOF96D ", & + "B2ADOF96HDS","B2ADOF96RDT","B2ADOF96V ","B2ADOF96WVS","B2ADOF97A ","B2ADOF97ADD","B2ADOF97D ", & + "B2ADOF97HDS","B2ADOF97RDT","B2ADOF97V ","B2ADOF97WVS","B2ADOF98A ","B2ADOF98ADD","B2ADOF98D ", & + "B2ADOF98HDS","B2ADOF98RDT","B2ADOF98V ","B2ADOF98WVS","B2ADOF99A ","B2ADOF99ADD","B2ADOF99D ", & + "B2ADOF99HDS","B2ADOF99RDT","B2ADOF99V ","B2ADOF99WVS","B2ADOF9A ","B2ADOF9ADD ","B2ADOF9D ", & + "B2ADOF9HDS ","B2ADOF9RDT ","B2ADOF9V ","B2ADOF9WVS ","B2HDSFXI ","B2HDSFYI ","B2HDSFZI ", & + "B2HDSMXI ","B2HDSMYI ","B2HDSMZI ","B2HEAVE ","B2PITCH ","B2RAXI ","B2RAYI ", & + "B2RAZI ","B2RDTFXI ","B2RDTFYI ","B2RDTFZI ","B2RDTMXI ","B2RDTMYI ","B2RDTMZI ", & + "B2ROLL ","B2RVXI ","B2RVYI ","B2RVZI ","B2SURGE ","B2SWAY ","B2TAXI ", & + "B2TAYI ","B2TAZI ","B2TVXI ","B2TVYI ","B2TVZI ","B2WVSF1XI ","B2WVSF1YI ", & + "B2WVSF1ZI ","B2WVSF2XI ","B2WVSF2YI ","B2WVSF2ZI ","B2WVSFXI ","B2WVSFYI ","B2WVSFZI ", & + "B2WVSM1XI ","B2WVSM1YI ","B2WVSM1ZI ","B2WVSM2XI ","B2WVSM2YI ","B2WVSM2ZI ","B2WVSMXI ", & + "B2WVSMYI ","B2WVSMZI ","B2YAW ","B3ADDFXI ","B3ADDFYI ","B3ADDFZI ","B3ADDMXI ", & + "B3ADDMYI ","B3ADDMZI ","B3ADOF10A ","B3ADOF10ADD","B3ADOF10D ","B3ADOF10HDS","B3ADOF10RDT", & + "B3ADOF10V ","B3ADOF10WVS","B3ADOF11A ","B3ADOF11ADD","B3ADOF11D ","B3ADOF11HDS","B3ADOF11RDT", & + "B3ADOF11V ","B3ADOF11WVS","B3ADOF12A ","B3ADOF12ADD","B3ADOF12D ","B3ADOF12HDS","B3ADOF12RDT", & + "B3ADOF12V ","B3ADOF12WVS","B3ADOF13A ","B3ADOF13ADD","B3ADOF13D ","B3ADOF13HDS","B3ADOF13RDT", & + "B3ADOF13V ","B3ADOF13WVS","B3ADOF14A ","B3ADOF14ADD","B3ADOF14D ","B3ADOF14HDS","B3ADOF14RDT", & + "B3ADOF14V ","B3ADOF14WVS","B3ADOF15A ","B3ADOF15ADD","B3ADOF15D ","B3ADOF15HDS","B3ADOF15RDT", & + "B3ADOF15V ","B3ADOF15WVS","B3ADOF16A ","B3ADOF16ADD","B3ADOF16D ","B3ADOF16HDS","B3ADOF16RDT", & + "B3ADOF16V ","B3ADOF16WVS","B3ADOF17A ","B3ADOF17ADD","B3ADOF17D ","B3ADOF17HDS","B3ADOF17RDT", & + "B3ADOF17V ","B3ADOF17WVS","B3ADOF18A ","B3ADOF18ADD","B3ADOF18D ","B3ADOF18HDS","B3ADOF18RDT", & + "B3ADOF18V ","B3ADOF18WVS","B3ADOF19A ","B3ADOF19ADD","B3ADOF19D ","B3ADOF19HDS","B3ADOF19RDT", & + "B3ADOF19V ","B3ADOF19WVS","B3ADOF1A ","B3ADOF1ADD ","B3ADOF1D ","B3ADOF1HDS ","B3ADOF1RDT ", & + "B3ADOF1V ","B3ADOF1WVS ","B3ADOF20A ","B3ADOF20ADD","B3ADOF20D ","B3ADOF20HDS","B3ADOF20RDT", & + "B3ADOF20V ","B3ADOF20WVS","B3ADOF21A ","B3ADOF21ADD","B3ADOF21D ","B3ADOF21HDS","B3ADOF21RDT", & + "B3ADOF21V ","B3ADOF21WVS","B3ADOF22A ","B3ADOF22ADD","B3ADOF22D ","B3ADOF22HDS","B3ADOF22RDT", & + "B3ADOF22V ","B3ADOF22WVS","B3ADOF23A ","B3ADOF23ADD","B3ADOF23D ","B3ADOF23HDS","B3ADOF23RDT", & + "B3ADOF23V ","B3ADOF23WVS","B3ADOF24A ","B3ADOF24ADD","B3ADOF24D ","B3ADOF24HDS","B3ADOF24RDT", & + "B3ADOF24V ","B3ADOF24WVS","B3ADOF25A ","B3ADOF25ADD","B3ADOF25D ","B3ADOF25HDS","B3ADOF25RDT", & + "B3ADOF25V ","B3ADOF25WVS","B3ADOF26A ","B3ADOF26ADD","B3ADOF26D ","B3ADOF26HDS","B3ADOF26RDT", & + "B3ADOF26V ","B3ADOF26WVS","B3ADOF27A ","B3ADOF27ADD","B3ADOF27D ","B3ADOF27HDS","B3ADOF27RDT", & + "B3ADOF27V ","B3ADOF27WVS","B3ADOF28A ","B3ADOF28ADD","B3ADOF28D ","B3ADOF28HDS","B3ADOF28RDT", & + "B3ADOF28V ","B3ADOF28WVS","B3ADOF29A ","B3ADOF29ADD","B3ADOF29D ","B3ADOF29HDS","B3ADOF29RDT", & + "B3ADOF29V ","B3ADOF29WVS","B3ADOF2A ","B3ADOF2ADD ","B3ADOF2D ","B3ADOF2HDS ","B3ADOF2RDT ", & + "B3ADOF2V ","B3ADOF2WVS ","B3ADOF30A ","B3ADOF30ADD","B3ADOF30D ","B3ADOF30HDS","B3ADOF30RDT", & + "B3ADOF30V ","B3ADOF30WVS","B3ADOF31A ","B3ADOF31ADD","B3ADOF31D ","B3ADOF31HDS","B3ADOF31RDT", & + "B3ADOF31V ","B3ADOF31WVS","B3ADOF32A ","B3ADOF32ADD","B3ADOF32D ","B3ADOF32HDS","B3ADOF32RDT", & + "B3ADOF32V ","B3ADOF32WVS","B3ADOF33A ","B3ADOF33ADD","B3ADOF33D ","B3ADOF33HDS","B3ADOF33RDT", & + "B3ADOF33V ","B3ADOF33WVS","B3ADOF34A ","B3ADOF34ADD","B3ADOF34D ","B3ADOF34HDS","B3ADOF34RDT"/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry2(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "B3ADOF34V ","B3ADOF34WVS","B3ADOF35A ","B3ADOF35ADD","B3ADOF35D ","B3ADOF35HDS","B3ADOF35RDT", & + "B3ADOF35V ","B3ADOF35WVS","B3ADOF36A ","B3ADOF36ADD","B3ADOF36D ","B3ADOF36HDS","B3ADOF36RDT", & + "B3ADOF36V ","B3ADOF36WVS","B3ADOF37A ","B3ADOF37ADD","B3ADOF37D ","B3ADOF37HDS","B3ADOF37RDT", & + "B3ADOF37V ","B3ADOF37WVS","B3ADOF38A ","B3ADOF38ADD","B3ADOF38D ","B3ADOF38HDS","B3ADOF38RDT", & + "B3ADOF38V ","B3ADOF38WVS","B3ADOF39A ","B3ADOF39ADD","B3ADOF39D ","B3ADOF39HDS","B3ADOF39RDT", & + "B3ADOF39V ","B3ADOF39WVS","B3ADOF3A ","B3ADOF3ADD ","B3ADOF3D ","B3ADOF3HDS ","B3ADOF3RDT ", & + "B3ADOF3V ","B3ADOF3WVS ","B3ADOF40A ","B3ADOF40ADD","B3ADOF40D ","B3ADOF40HDS","B3ADOF40RDT", & + "B3ADOF40V ","B3ADOF40WVS","B3ADOF41A ","B3ADOF41ADD","B3ADOF41D ","B3ADOF41HDS","B3ADOF41RDT", & + "B3ADOF41V ","B3ADOF41WVS","B3ADOF42A ","B3ADOF42ADD","B3ADOF42D ","B3ADOF42HDS","B3ADOF42RDT", & + "B3ADOF42V ","B3ADOF42WVS","B3ADOF43A ","B3ADOF43ADD","B3ADOF43D ","B3ADOF43HDS","B3ADOF43RDT", & + "B3ADOF43V ","B3ADOF43WVS","B3ADOF44A ","B3ADOF44ADD","B3ADOF44D ","B3ADOF44HDS","B3ADOF44RDT", & + "B3ADOF44V ","B3ADOF44WVS","B3ADOF45A ","B3ADOF45ADD","B3ADOF45D ","B3ADOF45HDS","B3ADOF45RDT", & + "B3ADOF45V ","B3ADOF45WVS","B3ADOF46A ","B3ADOF46ADD","B3ADOF46D ","B3ADOF46HDS","B3ADOF46RDT", & + "B3ADOF46V ","B3ADOF46WVS","B3ADOF47A ","B3ADOF47ADD","B3ADOF47D ","B3ADOF47HDS","B3ADOF47RDT", & + "B3ADOF47V ","B3ADOF47WVS","B3ADOF48A ","B3ADOF48ADD","B3ADOF48D ","B3ADOF48HDS","B3ADOF48RDT", & + "B3ADOF48V ","B3ADOF48WVS","B3ADOF49A ","B3ADOF49ADD","B3ADOF49D ","B3ADOF49HDS","B3ADOF49RDT", & + "B3ADOF49V ","B3ADOF49WVS","B3ADOF4A ","B3ADOF4ADD ","B3ADOF4D ","B3ADOF4HDS ","B3ADOF4RDT ", & + "B3ADOF4V ","B3ADOF4WVS ","B3ADOF50A ","B3ADOF50ADD","B3ADOF50D ","B3ADOF50HDS","B3ADOF50RDT", & + "B3ADOF50V ","B3ADOF50WVS","B3ADOF51A ","B3ADOF51ADD","B3ADOF51D ","B3ADOF51HDS","B3ADOF51RDT", & + "B3ADOF51V ","B3ADOF51WVS","B3ADOF52A ","B3ADOF52ADD","B3ADOF52D ","B3ADOF52HDS","B3ADOF52RDT", & + "B3ADOF52V ","B3ADOF52WVS","B3ADOF53A ","B3ADOF53ADD","B3ADOF53D ","B3ADOF53HDS","B3ADOF53RDT", & + "B3ADOF53V ","B3ADOF53WVS","B3ADOF54A ","B3ADOF54ADD","B3ADOF54D ","B3ADOF54HDS","B3ADOF54RDT", & + "B3ADOF54V ","B3ADOF54WVS","B3ADOF55A ","B3ADOF55ADD","B3ADOF55D ","B3ADOF55HDS","B3ADOF55RDT", & + "B3ADOF55V ","B3ADOF55WVS","B3ADOF56A ","B3ADOF56ADD","B3ADOF56D ","B3ADOF56HDS","B3ADOF56RDT", & + "B3ADOF56V ","B3ADOF56WVS","B3ADOF57A ","B3ADOF57ADD","B3ADOF57D ","B3ADOF57HDS","B3ADOF57RDT", & + "B3ADOF57V ","B3ADOF57WVS","B3ADOF58A ","B3ADOF58ADD","B3ADOF58D ","B3ADOF58HDS","B3ADOF58RDT", & + "B3ADOF58V ","B3ADOF58WVS","B3ADOF59A ","B3ADOF59ADD","B3ADOF59D ","B3ADOF59HDS","B3ADOF59RDT", & + "B3ADOF59V ","B3ADOF59WVS","B3ADOF5A ","B3ADOF5ADD ","B3ADOF5D ","B3ADOF5HDS ","B3ADOF5RDT ", & + "B3ADOF5V ","B3ADOF5WVS ","B3ADOF60A ","B3ADOF60ADD","B3ADOF60D ","B3ADOF60HDS","B3ADOF60RDT", & + "B3ADOF60V ","B3ADOF60WVS","B3ADOF61A ","B3ADOF61ADD","B3ADOF61D ","B3ADOF61HDS","B3ADOF61RDT", & + "B3ADOF61V ","B3ADOF61WVS","B3ADOF62A ","B3ADOF62ADD","B3ADOF62D ","B3ADOF62HDS","B3ADOF62RDT", & + "B3ADOF62V ","B3ADOF62WVS","B3ADOF63A ","B3ADOF63ADD","B3ADOF63D ","B3ADOF63HDS","B3ADOF63RDT", & + "B3ADOF63V ","B3ADOF63WVS","B3ADOF64A ","B3ADOF64ADD","B3ADOF64D ","B3ADOF64HDS","B3ADOF64RDT", & + "B3ADOF64V ","B3ADOF64WVS","B3ADOF65A ","B3ADOF65ADD","B3ADOF65D ","B3ADOF65HDS","B3ADOF65RDT", & + "B3ADOF65V ","B3ADOF65WVS","B3ADOF66A ","B3ADOF66ADD","B3ADOF66D ","B3ADOF66HDS","B3ADOF66RDT", & + "B3ADOF66V ","B3ADOF66WVS","B3ADOF67A ","B3ADOF67ADD","B3ADOF67D ","B3ADOF67HDS","B3ADOF67RDT", & + "B3ADOF67V ","B3ADOF67WVS","B3ADOF68A ","B3ADOF68ADD","B3ADOF68D ","B3ADOF68HDS","B3ADOF68RDT", & + "B3ADOF68V ","B3ADOF68WVS","B3ADOF69A ","B3ADOF69ADD","B3ADOF69D ","B3ADOF69HDS","B3ADOF69RDT", & + "B3ADOF69V ","B3ADOF69WVS","B3ADOF6A ","B3ADOF6ADD ","B3ADOF6D ","B3ADOF6HDS ","B3ADOF6RDT ", & + "B3ADOF6V ","B3ADOF6WVS ","B3ADOF70A ","B3ADOF70ADD","B3ADOF70D ","B3ADOF70HDS","B3ADOF70RDT", & + "B3ADOF70V ","B3ADOF70WVS","B3ADOF71A ","B3ADOF71ADD","B3ADOF71D ","B3ADOF71HDS","B3ADOF71RDT", & + "B3ADOF71V ","B3ADOF71WVS","B3ADOF72A ","B3ADOF72ADD","B3ADOF72D ","B3ADOF72HDS","B3ADOF72RDT", & + "B3ADOF72V ","B3ADOF72WVS","B3ADOF73A ","B3ADOF73ADD","B3ADOF73D ","B3ADOF73HDS","B3ADOF73RDT", & + "B3ADOF73V ","B3ADOF73WVS","B3ADOF74A ","B3ADOF74ADD","B3ADOF74D ","B3ADOF74HDS","B3ADOF74RDT", & + "B3ADOF74V ","B3ADOF74WVS","B3ADOF75A ","B3ADOF75ADD","B3ADOF75D ","B3ADOF75HDS","B3ADOF75RDT", & + "B3ADOF75V ","B3ADOF75WVS","B3ADOF76A ","B3ADOF76ADD","B3ADOF76D ","B3ADOF76HDS","B3ADOF76RDT", & + "B3ADOF76V ","B3ADOF76WVS","B3ADOF77A ","B3ADOF77ADD","B3ADOF77D ","B3ADOF77HDS","B3ADOF77RDT", & + "B3ADOF77V ","B3ADOF77WVS","B3ADOF78A ","B3ADOF78ADD","B3ADOF78D ","B3ADOF78HDS","B3ADOF78RDT", & + "B3ADOF78V ","B3ADOF78WVS","B3ADOF79A ","B3ADOF79ADD","B3ADOF79D ","B3ADOF79HDS","B3ADOF79RDT", & + "B3ADOF79V ","B3ADOF79WVS","B3ADOF7A ","B3ADOF7ADD ","B3ADOF7D ","B3ADOF7HDS ","B3ADOF7RDT ", & + "B3ADOF7V ","B3ADOF7WVS ","B3ADOF80A ","B3ADOF80ADD","B3ADOF80D ","B3ADOF80HDS","B3ADOF80RDT", & + "B3ADOF80V ","B3ADOF80WVS","B3ADOF81A ","B3ADOF81ADD","B3ADOF81D ","B3ADOF81HDS","B3ADOF81RDT", & + "B3ADOF81V ","B3ADOF81WVS","B3ADOF82A ","B3ADOF82ADD","B3ADOF82D ","B3ADOF82HDS","B3ADOF82RDT", & + "B3ADOF82V ","B3ADOF82WVS","B3ADOF83A ","B3ADOF83ADD","B3ADOF83D ","B3ADOF83HDS","B3ADOF83RDT", & + "B3ADOF83V ","B3ADOF83WVS","B3ADOF84A ","B3ADOF84ADD","B3ADOF84D ","B3ADOF84HDS","B3ADOF84RDT", & + "B3ADOF84V ","B3ADOF84WVS","B3ADOF85A ","B3ADOF85ADD","B3ADOF85D ","B3ADOF85HDS","B3ADOF85RDT", & + "B3ADOF85V ","B3ADOF85WVS","B3ADOF86A ","B3ADOF86ADD","B3ADOF86D ","B3ADOF86HDS","B3ADOF86RDT", & + "B3ADOF86V ","B3ADOF86WVS","B3ADOF87A ","B3ADOF87ADD","B3ADOF87D ","B3ADOF87HDS","B3ADOF87RDT", & + "B3ADOF87V ","B3ADOF87WVS","B3ADOF88A ","B3ADOF88ADD","B3ADOF88D ","B3ADOF88HDS","B3ADOF88RDT", & + "B3ADOF88V ","B3ADOF88WVS","B3ADOF89A ","B3ADOF89ADD","B3ADOF89D ","B3ADOF89HDS","B3ADOF89RDT", & + "B3ADOF89V ","B3ADOF89WVS","B3ADOF8A ","B3ADOF8ADD ","B3ADOF8D ","B3ADOF8HDS ","B3ADOF8RDT ", & + "B3ADOF8V ","B3ADOF8WVS ","B3ADOF90A ","B3ADOF90ADD","B3ADOF90D ","B3ADOF90HDS","B3ADOF90RDT", & + "B3ADOF90V ","B3ADOF90WVS","B3ADOF91A ","B3ADOF91ADD","B3ADOF91D ","B3ADOF91HDS","B3ADOF91RDT", & + "B3ADOF91V ","B3ADOF91WVS","B3ADOF92A ","B3ADOF92ADD","B3ADOF92D ","B3ADOF92HDS","B3ADOF92RDT", & + "B3ADOF92V ","B3ADOF92WVS","B3ADOF93A ","B3ADOF93ADD","B3ADOF93D ","B3ADOF93HDS","B3ADOF93RDT", & + "B3ADOF93V ","B3ADOF93WVS","B3ADOF94A ","B3ADOF94ADD","B3ADOF94D ","B3ADOF94HDS","B3ADOF94RDT", & + "B3ADOF94V ","B3ADOF94WVS","B3ADOF95A ","B3ADOF95ADD","B3ADOF95D ","B3ADOF95HDS","B3ADOF95RDT", & + "B3ADOF95V ","B3ADOF95WVS","B3ADOF96A ","B3ADOF96ADD","B3ADOF96D ","B3ADOF96HDS","B3ADOF96RDT", & + "B3ADOF96V ","B3ADOF96WVS","B3ADOF97A ","B3ADOF97ADD","B3ADOF97D ","B3ADOF97HDS","B3ADOF97RDT", & + "B3ADOF97V ","B3ADOF97WVS","B3ADOF98A ","B3ADOF98ADD","B3ADOF98D ","B3ADOF98HDS","B3ADOF98RDT", & + "B3ADOF98V ","B3ADOF98WVS","B3ADOF99A ","B3ADOF99ADD","B3ADOF99D ","B3ADOF99HDS","B3ADOF99RDT", & + "B3ADOF99V ","B3ADOF99WVS","B3ADOF9A ","B3ADOF9ADD ","B3ADOF9D ","B3ADOF9HDS ","B3ADOF9RDT ", & + "B3ADOF9V ","B3ADOF9WVS ","B3HDSFXI ","B3HDSFYI ","B3HDSFZI ","B3HDSMXI ","B3HDSMYI ", & + "B3HDSMZI ","B3HEAVE ","B3PITCH ","B3RAXI ","B3RAYI ","B3RAZI ","B3RDTFXI ", & + "B3RDTFYI ","B3RDTFZI ","B3RDTMXI ","B3RDTMYI ","B3RDTMZI ","B3ROLL ","B3RVXI ", & + "B3RVYI ","B3RVZI ","B3SURGE ","B3SWAY ","B3TAXI ","B3TAYI ","B3TAZI ", & + "B3TVXI ","B3TVYI ","B3TVZI ","B3WVSF1XI ","B3WVSF1YI ","B3WVSF1ZI ","B3WVSF2XI ", & + "B3WVSF2YI ","B3WVSF2ZI ","B3WVSFXI ","B3WVSFYI ","B3WVSFZI ","B3WVSM1XI ","B3WVSM1YI ", & + "B3WVSM1ZI ","B3WVSM2XI ","B3WVSM2YI ","B3WVSM2ZI ","B3WVSMXI ","B3WVSMYI ","B3WVSMZI ", & + "B3YAW ","B4ADDFXI ","B4ADDFYI ","B4ADDFZI ","B4ADDMXI ","B4ADDMYI ","B4ADDMZI ", & + "B4ADOF10A ","B4ADOF10ADD","B4ADOF10D ","B4ADOF10HDS","B4ADOF10RDT","B4ADOF10V ","B4ADOF10WVS", & + "B4ADOF11A ","B4ADOF11ADD","B4ADOF11D ","B4ADOF11HDS","B4ADOF11RDT","B4ADOF11V ","B4ADOF11WVS", & + "B4ADOF12A ","B4ADOF12ADD","B4ADOF12D ","B4ADOF12HDS","B4ADOF12RDT","B4ADOF12V ","B4ADOF12WVS", & + "B4ADOF13A ","B4ADOF13ADD","B4ADOF13D ","B4ADOF13HDS","B4ADOF13RDT","B4ADOF13V ","B4ADOF13WVS", & + "B4ADOF14A ","B4ADOF14ADD","B4ADOF14D ","B4ADOF14HDS","B4ADOF14RDT","B4ADOF14V ","B4ADOF14WVS", & + "B4ADOF15A ","B4ADOF15ADD","B4ADOF15D ","B4ADOF15HDS","B4ADOF15RDT","B4ADOF15V ","B4ADOF15WVS", & + "B4ADOF16A ","B4ADOF16ADD","B4ADOF16D ","B4ADOF16HDS","B4ADOF16RDT","B4ADOF16V ","B4ADOF16WVS", & + "B4ADOF17A ","B4ADOF17ADD","B4ADOF17D ","B4ADOF17HDS","B4ADOF17RDT","B4ADOF17V ","B4ADOF17WVS", & + "B4ADOF18A ","B4ADOF18ADD","B4ADOF18D ","B4ADOF18HDS","B4ADOF18RDT","B4ADOF18V ","B4ADOF18WVS", & + "B4ADOF19A ","B4ADOF19ADD","B4ADOF19D ","B4ADOF19HDS","B4ADOF19RDT","B4ADOF19V ","B4ADOF19WVS", & + "B4ADOF1A ","B4ADOF1ADD ","B4ADOF1D ","B4ADOF1HDS ","B4ADOF1RDT ","B4ADOF1V ","B4ADOF1WVS ", & + "B4ADOF20A ","B4ADOF20ADD","B4ADOF20D ","B4ADOF20HDS","B4ADOF20RDT","B4ADOF20V ","B4ADOF20WVS", & + "B4ADOF21A ","B4ADOF21ADD","B4ADOF21D ","B4ADOF21HDS","B4ADOF21RDT","B4ADOF21V ","B4ADOF21WVS", & + "B4ADOF22A ","B4ADOF22ADD","B4ADOF22D ","B4ADOF22HDS","B4ADOF22RDT","B4ADOF22V ","B4ADOF22WVS", & + "B4ADOF23A ","B4ADOF23ADD","B4ADOF23D ","B4ADOF23HDS","B4ADOF23RDT","B4ADOF23V ","B4ADOF23WVS", & + "B4ADOF24A ","B4ADOF24ADD","B4ADOF24D ","B4ADOF24HDS","B4ADOF24RDT","B4ADOF24V ","B4ADOF24WVS", & + "B4ADOF25A ","B4ADOF25ADD","B4ADOF25D ","B4ADOF25HDS","B4ADOF25RDT","B4ADOF25V ","B4ADOF25WVS", & + "B4ADOF26A ","B4ADOF26ADD","B4ADOF26D ","B4ADOF26HDS","B4ADOF26RDT","B4ADOF26V ","B4ADOF26WVS", & + "B4ADOF27A ","B4ADOF27ADD","B4ADOF27D ","B4ADOF27HDS","B4ADOF27RDT","B4ADOF27V ","B4ADOF27WVS", & + "B4ADOF28A ","B4ADOF28ADD","B4ADOF28D ","B4ADOF28HDS","B4ADOF28RDT","B4ADOF28V ","B4ADOF28WVS", & + "B4ADOF29A ","B4ADOF29ADD","B4ADOF29D ","B4ADOF29HDS","B4ADOF29RDT","B4ADOF29V ","B4ADOF29WVS", & + "B4ADOF2A ","B4ADOF2ADD ","B4ADOF2D ","B4ADOF2HDS ","B4ADOF2RDT ","B4ADOF2V ","B4ADOF2WVS ", & + "B4ADOF30A ","B4ADOF30ADD","B4ADOF30D ","B4ADOF30HDS","B4ADOF30RDT","B4ADOF30V ","B4ADOF30WVS", & + "B4ADOF31A ","B4ADOF31ADD","B4ADOF31D ","B4ADOF31HDS","B4ADOF31RDT","B4ADOF31V ","B4ADOF31WVS", & + "B4ADOF32A ","B4ADOF32ADD","B4ADOF32D ","B4ADOF32HDS","B4ADOF32RDT","B4ADOF32V ","B4ADOF32WVS", & + "B4ADOF33A ","B4ADOF33ADD","B4ADOF33D ","B4ADOF33HDS","B4ADOF33RDT","B4ADOF33V ","B4ADOF33WVS", & + "B4ADOF34A ","B4ADOF34ADD","B4ADOF34D ","B4ADOF34HDS","B4ADOF34RDT","B4ADOF34V ","B4ADOF34WVS", & + "B4ADOF35A ","B4ADOF35ADD","B4ADOF35D ","B4ADOF35HDS","B4ADOF35RDT","B4ADOF35V ","B4ADOF35WVS", & + "B4ADOF36A ","B4ADOF36ADD","B4ADOF36D ","B4ADOF36HDS","B4ADOF36RDT","B4ADOF36V ","B4ADOF36WVS", & + "B4ADOF37A ","B4ADOF37ADD","B4ADOF37D ","B4ADOF37HDS","B4ADOF37RDT","B4ADOF37V ","B4ADOF37WVS", & + "B4ADOF38A ","B4ADOF38ADD","B4ADOF38D ","B4ADOF38HDS","B4ADOF38RDT","B4ADOF38V ","B4ADOF38WVS", & + "B4ADOF39A ","B4ADOF39ADD","B4ADOF39D ","B4ADOF39HDS","B4ADOF39RDT","B4ADOF39V ","B4ADOF39WVS", & + "B4ADOF3A ","B4ADOF3ADD ","B4ADOF3D ","B4ADOF3HDS ","B4ADOF3RDT ","B4ADOF3V ","B4ADOF3WVS ", & + "B4ADOF40A ","B4ADOF40ADD","B4ADOF40D ","B4ADOF40HDS","B4ADOF40RDT","B4ADOF40V ","B4ADOF40WVS", & + "B4ADOF41A ","B4ADOF41ADD","B4ADOF41D ","B4ADOF41HDS","B4ADOF41RDT","B4ADOF41V ","B4ADOF41WVS", & + "B4ADOF42A ","B4ADOF42ADD","B4ADOF42D ","B4ADOF42HDS","B4ADOF42RDT","B4ADOF42V ","B4ADOF42WVS", & + "B4ADOF43A ","B4ADOF43ADD","B4ADOF43D ","B4ADOF43HDS","B4ADOF43RDT","B4ADOF43V ","B4ADOF43WVS", & + "B4ADOF44A ","B4ADOF44ADD","B4ADOF44D ","B4ADOF44HDS","B4ADOF44RDT","B4ADOF44V ","B4ADOF44WVS", & + "B4ADOF45A ","B4ADOF45ADD","B4ADOF45D ","B4ADOF45HDS","B4ADOF45RDT","B4ADOF45V ","B4ADOF45WVS", & + "B4ADOF46A ","B4ADOF46ADD","B4ADOF46D ","B4ADOF46HDS","B4ADOF46RDT","B4ADOF46V ","B4ADOF46WVS", & + "B4ADOF47A ","B4ADOF47ADD","B4ADOF47D ","B4ADOF47HDS","B4ADOF47RDT","B4ADOF47V ","B4ADOF47WVS", & + "B4ADOF48A ","B4ADOF48ADD","B4ADOF48D ","B4ADOF48HDS","B4ADOF48RDT","B4ADOF48V ","B4ADOF48WVS", & + "B4ADOF49A ","B4ADOF49ADD","B4ADOF49D ","B4ADOF49HDS","B4ADOF49RDT","B4ADOF49V ","B4ADOF49WVS", & + "B4ADOF4A ","B4ADOF4ADD ","B4ADOF4D ","B4ADOF4HDS ","B4ADOF4RDT ","B4ADOF4V ","B4ADOF4WVS ", & + "B4ADOF50A ","B4ADOF50ADD","B4ADOF50D ","B4ADOF50HDS","B4ADOF50RDT","B4ADOF50V ","B4ADOF50WVS", & + "B4ADOF51A ","B4ADOF51ADD","B4ADOF51D ","B4ADOF51HDS","B4ADOF51RDT","B4ADOF51V ","B4ADOF51WVS", & + "B4ADOF52A ","B4ADOF52ADD","B4ADOF52D ","B4ADOF52HDS","B4ADOF52RDT","B4ADOF52V ","B4ADOF52WVS", & + "B4ADOF53A ","B4ADOF53ADD","B4ADOF53D ","B4ADOF53HDS","B4ADOF53RDT","B4ADOF53V ","B4ADOF53WVS", & + "B4ADOF54A ","B4ADOF54ADD","B4ADOF54D ","B4ADOF54HDS","B4ADOF54RDT","B4ADOF54V ","B4ADOF54WVS", & + "B4ADOF55A ","B4ADOF55ADD","B4ADOF55D ","B4ADOF55HDS","B4ADOF55RDT","B4ADOF55V ","B4ADOF55WVS", & + "B4ADOF56A ","B4ADOF56ADD","B4ADOF56D ","B4ADOF56HDS","B4ADOF56RDT","B4ADOF56V ","B4ADOF56WVS", & + "B4ADOF57A ","B4ADOF57ADD","B4ADOF57D ","B4ADOF57HDS","B4ADOF57RDT","B4ADOF57V ","B4ADOF57WVS", & + "B4ADOF58A ","B4ADOF58ADD","B4ADOF58D ","B4ADOF58HDS","B4ADOF58RDT","B4ADOF58V ","B4ADOF58WVS", & + "B4ADOF59A ","B4ADOF59ADD","B4ADOF59D ","B4ADOF59HDS","B4ADOF59RDT","B4ADOF59V ","B4ADOF59WVS", & + "B4ADOF5A ","B4ADOF5ADD ","B4ADOF5D ","B4ADOF5HDS ","B4ADOF5RDT ","B4ADOF5V ","B4ADOF5WVS ", & + "B4ADOF60A ","B4ADOF60ADD","B4ADOF60D ","B4ADOF60HDS","B4ADOF60RDT","B4ADOF60V ","B4ADOF60WVS", & + "B4ADOF61A ","B4ADOF61ADD","B4ADOF61D ","B4ADOF61HDS","B4ADOF61RDT","B4ADOF61V ","B4ADOF61WVS", & + "B4ADOF62A ","B4ADOF62ADD","B4ADOF62D ","B4ADOF62HDS","B4ADOF62RDT","B4ADOF62V ","B4ADOF62WVS", & + "B4ADOF63A ","B4ADOF63ADD","B4ADOF63D ","B4ADOF63HDS","B4ADOF63RDT","B4ADOF63V ","B4ADOF63WVS", & + "B4ADOF64A ","B4ADOF64ADD","B4ADOF64D ","B4ADOF64HDS","B4ADOF64RDT","B4ADOF64V ","B4ADOF64WVS", & + "B4ADOF65A ","B4ADOF65ADD","B4ADOF65D ","B4ADOF65HDS","B4ADOF65RDT","B4ADOF65V ","B4ADOF65WVS", & + "B4ADOF66A ","B4ADOF66ADD","B4ADOF66D ","B4ADOF66HDS","B4ADOF66RDT","B4ADOF66V ","B4ADOF66WVS", & + "B4ADOF67A ","B4ADOF67ADD","B4ADOF67D ","B4ADOF67HDS","B4ADOF67RDT","B4ADOF67V ","B4ADOF67WVS", & + "B4ADOF68A ","B4ADOF68ADD","B4ADOF68D ","B4ADOF68HDS","B4ADOF68RDT","B4ADOF68V ","B4ADOF68WVS", & + "B4ADOF69A ","B4ADOF69ADD","B4ADOF69D ","B4ADOF69HDS","B4ADOF69RDT","B4ADOF69V ","B4ADOF69WVS", & + "B4ADOF6A ","B4ADOF6ADD ","B4ADOF6D ","B4ADOF6HDS ","B4ADOF6RDT ","B4ADOF6V ","B4ADOF6WVS ", & + "B4ADOF70A ","B4ADOF70ADD","B4ADOF70D ","B4ADOF70HDS","B4ADOF70RDT","B4ADOF70V ","B4ADOF70WVS", & + "B4ADOF71A ","B4ADOF71ADD","B4ADOF71D ","B4ADOF71HDS","B4ADOF71RDT","B4ADOF71V ","B4ADOF71WVS", & + "B4ADOF72A ","B4ADOF72ADD","B4ADOF72D ","B4ADOF72HDS","B4ADOF72RDT","B4ADOF72V ","B4ADOF72WVS", & + "B4ADOF73A ","B4ADOF73ADD","B4ADOF73D ","B4ADOF73HDS","B4ADOF73RDT","B4ADOF73V ","B4ADOF73WVS", & + "B4ADOF74A ","B4ADOF74ADD","B4ADOF74D ","B4ADOF74HDS","B4ADOF74RDT","B4ADOF74V ","B4ADOF74WVS", & + "B4ADOF75A ","B4ADOF75ADD","B4ADOF75D ","B4ADOF75HDS","B4ADOF75RDT","B4ADOF75V ","B4ADOF75WVS", & + "B4ADOF76A ","B4ADOF76ADD","B4ADOF76D ","B4ADOF76HDS","B4ADOF76RDT","B4ADOF76V ","B4ADOF76WVS", & + "B4ADOF77A ","B4ADOF77ADD","B4ADOF77D ","B4ADOF77HDS","B4ADOF77RDT","B4ADOF77V ","B4ADOF77WVS", & + "B4ADOF78A ","B4ADOF78ADD","B4ADOF78D ","B4ADOF78HDS","B4ADOF78RDT","B4ADOF78V ","B4ADOF78WVS", & + "B4ADOF79A ","B4ADOF79ADD","B4ADOF79D ","B4ADOF79HDS","B4ADOF79RDT","B4ADOF79V ","B4ADOF79WVS", & + "B4ADOF7A ","B4ADOF7ADD ","B4ADOF7D ","B4ADOF7HDS ","B4ADOF7RDT ","B4ADOF7V ","B4ADOF7WVS ", & + "B4ADOF80A ","B4ADOF80ADD","B4ADOF80D ","B4ADOF80HDS","B4ADOF80RDT","B4ADOF80V ","B4ADOF80WVS", & + "B4ADOF81A ","B4ADOF81ADD","B4ADOF81D ","B4ADOF81HDS","B4ADOF81RDT","B4ADOF81V ","B4ADOF81WVS", & + "B4ADOF82A ","B4ADOF82ADD","B4ADOF82D ","B4ADOF82HDS","B4ADOF82RDT","B4ADOF82V ","B4ADOF82WVS", & + "B4ADOF83A ","B4ADOF83ADD","B4ADOF83D ","B4ADOF83HDS","B4ADOF83RDT","B4ADOF83V ","B4ADOF83WVS", & + "B4ADOF84A ","B4ADOF84ADD","B4ADOF84D ","B4ADOF84HDS","B4ADOF84RDT","B4ADOF84V ","B4ADOF84WVS", & + "B4ADOF85A ","B4ADOF85ADD","B4ADOF85D ","B4ADOF85HDS","B4ADOF85RDT","B4ADOF85V ","B4ADOF85WVS", & + "B4ADOF86A ","B4ADOF86ADD","B4ADOF86D ","B4ADOF86HDS","B4ADOF86RDT","B4ADOF86V ","B4ADOF86WVS", & + "B4ADOF87A ","B4ADOF87ADD","B4ADOF87D ","B4ADOF87HDS","B4ADOF87RDT","B4ADOF87V ","B4ADOF87WVS", & + "B4ADOF88A ","B4ADOF88ADD","B4ADOF88D ","B4ADOF88HDS","B4ADOF88RDT","B4ADOF88V ","B4ADOF88WVS", & + "B4ADOF89A ","B4ADOF89ADD","B4ADOF89D ","B4ADOF89HDS","B4ADOF89RDT","B4ADOF89V ","B4ADOF89WVS", & + "B4ADOF8A ","B4ADOF8ADD ","B4ADOF8D ","B4ADOF8HDS ","B4ADOF8RDT ","B4ADOF8V ","B4ADOF8WVS ", & + "B4ADOF90A ","B4ADOF90ADD","B4ADOF90D ","B4ADOF90HDS","B4ADOF90RDT","B4ADOF90V ","B4ADOF90WVS", & + "B4ADOF91A ","B4ADOF91ADD","B4ADOF91D ","B4ADOF91HDS","B4ADOF91RDT","B4ADOF91V ","B4ADOF91WVS", & + "B4ADOF92A ","B4ADOF92ADD","B4ADOF92D ","B4ADOF92HDS","B4ADOF92RDT","B4ADOF92V ","B4ADOF92WVS", & + "B4ADOF93A ","B4ADOF93ADD","B4ADOF93D ","B4ADOF93HDS","B4ADOF93RDT","B4ADOF93V ","B4ADOF93WVS", & + "B4ADOF94A ","B4ADOF94ADD","B4ADOF94D ","B4ADOF94HDS","B4ADOF94RDT","B4ADOF94V ","B4ADOF94WVS", & + "B4ADOF95A ","B4ADOF95ADD","B4ADOF95D ","B4ADOF95HDS","B4ADOF95RDT","B4ADOF95V ","B4ADOF95WVS", & + "B4ADOF96A ","B4ADOF96ADD","B4ADOF96D ","B4ADOF96HDS","B4ADOF96RDT","B4ADOF96V ","B4ADOF96WVS", & + "B4ADOF97A ","B4ADOF97ADD","B4ADOF97D ","B4ADOF97HDS","B4ADOF97RDT","B4ADOF97V ","B4ADOF97WVS", & + "B4ADOF98A ","B4ADOF98ADD","B4ADOF98D ","B4ADOF98HDS","B4ADOF98RDT","B4ADOF98V ","B4ADOF98WVS", & + "B4ADOF99A ","B4ADOF99ADD","B4ADOF99D ","B4ADOF99HDS","B4ADOF99RDT","B4ADOF99V ","B4ADOF99WVS", & + "B4ADOF9A ","B4ADOF9ADD ","B4ADOF9D ","B4ADOF9HDS ","B4ADOF9RDT ","B4ADOF9V ","B4ADOF9WVS ", & + "B4HDSFXI ","B4HDSFYI ","B4HDSFZI ","B4HDSMXI ","B4HDSMYI ","B4HDSMZI ","B4HEAVE ", & + "B4PITCH ","B4RAXI ","B4RAYI ","B4RAZI ","B4RDTFXI ","B4RDTFYI ","B4RDTFZI ", & + "B4RDTMXI ","B4RDTMYI ","B4RDTMZI ","B4ROLL ","B4RVXI ","B4RVYI ","B4RVZI ", & + "B4SURGE ","B4SWAY ","B4TAXI ","B4TAYI ","B4TAZI ","B4TVXI ","B4TVYI ", & + "B4TVZI ","B4WVSF1XI ","B4WVSF1YI ","B4WVSF1ZI ","B4WVSF2XI ","B4WVSF2YI ","B4WVSF2ZI ", & + "B4WVSFXI ","B4WVSFYI ","B4WVSFZI ","B4WVSM1XI ","B4WVSM1YI ","B4WVSM1ZI ","B4WVSM2XI ", & + "B4WVSM2YI ","B4WVSM2ZI ","B4WVSMXI ","B4WVSMYI ","B4WVSMZI ","B4YAW ","B5ADDFXI ", & + "B5ADDFYI ","B5ADDFZI ","B5ADDMXI ","B5ADDMYI ","B5ADDMZI ","B5ADOF10A ","B5ADOF10ADD", & + "B5ADOF10D ","B5ADOF10HDS","B5ADOF10RDT","B5ADOF10V ","B5ADOF10WVS","B5ADOF11A ","B5ADOF11ADD", & + "B5ADOF11D ","B5ADOF11HDS","B5ADOF11RDT","B5ADOF11V ","B5ADOF11WVS","B5ADOF12A ","B5ADOF12ADD", & + "B5ADOF12D ","B5ADOF12HDS","B5ADOF12RDT","B5ADOF12V ","B5ADOF12WVS","B5ADOF13A ","B5ADOF13ADD", & + "B5ADOF13D ","B5ADOF13HDS","B5ADOF13RDT","B5ADOF13V ","B5ADOF13WVS","B5ADOF14A ","B5ADOF14ADD", & + "B5ADOF14D ","B5ADOF14HDS","B5ADOF14RDT","B5ADOF14V ","B5ADOF14WVS","B5ADOF15A ","B5ADOF15ADD", & + "B5ADOF15D ","B5ADOF15HDS","B5ADOF15RDT","B5ADOF15V ","B5ADOF15WVS","B5ADOF16A ","B5ADOF16ADD", & + "B5ADOF16D ","B5ADOF16HDS","B5ADOF16RDT","B5ADOF16V ","B5ADOF16WVS","B5ADOF17A ","B5ADOF17ADD", & + "B5ADOF17D ","B5ADOF17HDS","B5ADOF17RDT","B5ADOF17V ","B5ADOF17WVS","B5ADOF18A ","B5ADOF18ADD", & + "B5ADOF18D ","B5ADOF18HDS","B5ADOF18RDT","B5ADOF18V ","B5ADOF18WVS","B5ADOF19A ","B5ADOF19ADD", & + "B5ADOF19D ","B5ADOF19HDS","B5ADOF19RDT","B5ADOF19V ","B5ADOF19WVS","B5ADOF1A ","B5ADOF1ADD ", & + "B5ADOF1D ","B5ADOF1HDS ","B5ADOF1RDT ","B5ADOF1V ","B5ADOF1WVS ","B5ADOF20A ","B5ADOF20ADD", & + "B5ADOF20D ","B5ADOF20HDS","B5ADOF20RDT","B5ADOF20V ","B5ADOF20WVS","B5ADOF21A ","B5ADOF21ADD", & + "B5ADOF21D ","B5ADOF21HDS","B5ADOF21RDT","B5ADOF21V ","B5ADOF21WVS","B5ADOF22A ","B5ADOF22ADD", & + "B5ADOF22D ","B5ADOF22HDS","B5ADOF22RDT","B5ADOF22V ","B5ADOF22WVS","B5ADOF23A ","B5ADOF23ADD", & + "B5ADOF23D ","B5ADOF23HDS","B5ADOF23RDT","B5ADOF23V ","B5ADOF23WVS","B5ADOF24A ","B5ADOF24ADD", & + "B5ADOF24D ","B5ADOF24HDS","B5ADOF24RDT","B5ADOF24V ","B5ADOF24WVS","B5ADOF25A ","B5ADOF25ADD", & + "B5ADOF25D ","B5ADOF25HDS","B5ADOF25RDT","B5ADOF25V ","B5ADOF25WVS","B5ADOF26A ","B5ADOF26ADD", & + "B5ADOF26D ","B5ADOF26HDS","B5ADOF26RDT","B5ADOF26V ","B5ADOF26WVS","B5ADOF27A ","B5ADOF27ADD", & + "B5ADOF27D ","B5ADOF27HDS","B5ADOF27RDT","B5ADOF27V ","B5ADOF27WVS","B5ADOF28A ","B5ADOF28ADD", & + "B5ADOF28D ","B5ADOF28HDS","B5ADOF28RDT","B5ADOF28V ","B5ADOF28WVS","B5ADOF29A ","B5ADOF29ADD", & + "B5ADOF29D ","B5ADOF29HDS","B5ADOF29RDT","B5ADOF29V ","B5ADOF29WVS","B5ADOF2A ","B5ADOF2ADD ", & + "B5ADOF2D ","B5ADOF2HDS ","B5ADOF2RDT ","B5ADOF2V ","B5ADOF2WVS ","B5ADOF30A ","B5ADOF30ADD", & + "B5ADOF30D ","B5ADOF30HDS","B5ADOF30RDT","B5ADOF30V ","B5ADOF30WVS","B5ADOF31A ","B5ADOF31ADD", & + "B5ADOF31D ","B5ADOF31HDS","B5ADOF31RDT","B5ADOF31V ","B5ADOF31WVS","B5ADOF32A ","B5ADOF32ADD", & + "B5ADOF32D ","B5ADOF32HDS","B5ADOF32RDT","B5ADOF32V ","B5ADOF32WVS","B5ADOF33A ","B5ADOF33ADD", & + "B5ADOF33D ","B5ADOF33HDS","B5ADOF33RDT","B5ADOF33V ","B5ADOF33WVS","B5ADOF34A ","B5ADOF34ADD", & + "B5ADOF34D ","B5ADOF34HDS","B5ADOF34RDT","B5ADOF34V ","B5ADOF34WVS","B5ADOF35A ","B5ADOF35ADD", & + "B5ADOF35D ","B5ADOF35HDS","B5ADOF35RDT","B5ADOF35V ","B5ADOF35WVS","B5ADOF36A ","B5ADOF36ADD", & + "B5ADOF36D ","B5ADOF36HDS","B5ADOF36RDT","B5ADOF36V ","B5ADOF36WVS","B5ADOF37A ","B5ADOF37ADD", & + "B5ADOF37D ","B5ADOF37HDS","B5ADOF37RDT","B5ADOF37V ","B5ADOF37WVS","B5ADOF38A ","B5ADOF38ADD", & + "B5ADOF38D ","B5ADOF38HDS","B5ADOF38RDT","B5ADOF38V ","B5ADOF38WVS","B5ADOF39A ","B5ADOF39ADD", & + "B5ADOF39D ","B5ADOF39HDS","B5ADOF39RDT","B5ADOF39V ","B5ADOF39WVS","B5ADOF3A ","B5ADOF3ADD ", & + "B5ADOF3D ","B5ADOF3HDS ","B5ADOF3RDT ","B5ADOF3V ","B5ADOF3WVS ","B5ADOF40A ","B5ADOF40ADD", & + "B5ADOF40D ","B5ADOF40HDS","B5ADOF40RDT","B5ADOF40V ","B5ADOF40WVS","B5ADOF41A ","B5ADOF41ADD", & + "B5ADOF41D ","B5ADOF41HDS","B5ADOF41RDT","B5ADOF41V ","B5ADOF41WVS","B5ADOF42A ","B5ADOF42ADD", & + "B5ADOF42D ","B5ADOF42HDS","B5ADOF42RDT","B5ADOF42V ","B5ADOF42WVS","B5ADOF43A ","B5ADOF43ADD", & + "B5ADOF43D ","B5ADOF43HDS","B5ADOF43RDT","B5ADOF43V ","B5ADOF43WVS","B5ADOF44A ","B5ADOF44ADD", & + "B5ADOF44D ","B5ADOF44HDS","B5ADOF44RDT","B5ADOF44V ","B5ADOF44WVS","B5ADOF45A ","B5ADOF45ADD", & + "B5ADOF45D ","B5ADOF45HDS","B5ADOF45RDT","B5ADOF45V ","B5ADOF45WVS","B5ADOF46A ","B5ADOF46ADD", & + "B5ADOF46D ","B5ADOF46HDS","B5ADOF46RDT","B5ADOF46V ","B5ADOF46WVS","B5ADOF47A ","B5ADOF47ADD", & + "B5ADOF47D ","B5ADOF47HDS","B5ADOF47RDT","B5ADOF47V ","B5ADOF47WVS","B5ADOF48A ","B5ADOF48ADD", & + "B5ADOF48D ","B5ADOF48HDS","B5ADOF48RDT","B5ADOF48V ","B5ADOF48WVS","B5ADOF49A ","B5ADOF49ADD", & + "B5ADOF49D ","B5ADOF49HDS","B5ADOF49RDT","B5ADOF49V ","B5ADOF49WVS","B5ADOF4A ","B5ADOF4ADD ", & + "B5ADOF4D ","B5ADOF4HDS ","B5ADOF4RDT ","B5ADOF4V ","B5ADOF4WVS ","B5ADOF50A ","B5ADOF50ADD", & + "B5ADOF50D ","B5ADOF50HDS","B5ADOF50RDT","B5ADOF50V ","B5ADOF50WVS","B5ADOF51A ","B5ADOF51ADD", & + "B5ADOF51D ","B5ADOF51HDS","B5ADOF51RDT","B5ADOF51V ","B5ADOF51WVS","B5ADOF52A ","B5ADOF52ADD", & + "B5ADOF52D ","B5ADOF52HDS","B5ADOF52RDT","B5ADOF52V ","B5ADOF52WVS","B5ADOF53A ","B5ADOF53ADD", & + "B5ADOF53D ","B5ADOF53HDS","B5ADOF53RDT","B5ADOF53V ","B5ADOF53WVS","B5ADOF54A ","B5ADOF54ADD", & + "B5ADOF54D ","B5ADOF54HDS","B5ADOF54RDT","B5ADOF54V ","B5ADOF54WVS","B5ADOF55A ","B5ADOF55ADD", & + "B5ADOF55D ","B5ADOF55HDS","B5ADOF55RDT","B5ADOF55V ","B5ADOF55WVS","B5ADOF56A ","B5ADOF56ADD", & + "B5ADOF56D ","B5ADOF56HDS","B5ADOF56RDT","B5ADOF56V ","B5ADOF56WVS","B5ADOF57A ","B5ADOF57ADD", & + "B5ADOF57D ","B5ADOF57HDS","B5ADOF57RDT","B5ADOF57V ","B5ADOF57WVS","B5ADOF58A ","B5ADOF58ADD", & + "B5ADOF58D ","B5ADOF58HDS","B5ADOF58RDT","B5ADOF58V ","B5ADOF58WVS","B5ADOF59A ","B5ADOF59ADD", & + "B5ADOF59D ","B5ADOF59HDS","B5ADOF59RDT","B5ADOF59V ","B5ADOF59WVS","B5ADOF5A ","B5ADOF5ADD "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry3(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "B5ADOF5D ","B5ADOF5HDS ","B5ADOF5RDT ","B5ADOF5V ","B5ADOF5WVS ","B5ADOF60A ","B5ADOF60ADD", & + "B5ADOF60D ","B5ADOF60HDS","B5ADOF60RDT","B5ADOF60V ","B5ADOF60WVS","B5ADOF61A ","B5ADOF61ADD", & + "B5ADOF61D ","B5ADOF61HDS","B5ADOF61RDT","B5ADOF61V ","B5ADOF61WVS","B5ADOF62A ","B5ADOF62ADD", & + "B5ADOF62D ","B5ADOF62HDS","B5ADOF62RDT","B5ADOF62V ","B5ADOF62WVS","B5ADOF63A ","B5ADOF63ADD", & + "B5ADOF63D ","B5ADOF63HDS","B5ADOF63RDT","B5ADOF63V ","B5ADOF63WVS","B5ADOF64A ","B5ADOF64ADD", & + "B5ADOF64D ","B5ADOF64HDS","B5ADOF64RDT","B5ADOF64V ","B5ADOF64WVS","B5ADOF65A ","B5ADOF65ADD", & + "B5ADOF65D ","B5ADOF65HDS","B5ADOF65RDT","B5ADOF65V ","B5ADOF65WVS","B5ADOF66A ","B5ADOF66ADD", & + "B5ADOF66D ","B5ADOF66HDS","B5ADOF66RDT","B5ADOF66V ","B5ADOF66WVS","B5ADOF67A ","B5ADOF67ADD", & + "B5ADOF67D ","B5ADOF67HDS","B5ADOF67RDT","B5ADOF67V ","B5ADOF67WVS","B5ADOF68A ","B5ADOF68ADD", & + "B5ADOF68D ","B5ADOF68HDS","B5ADOF68RDT","B5ADOF68V ","B5ADOF68WVS","B5ADOF69A ","B5ADOF69ADD", & + "B5ADOF69D ","B5ADOF69HDS","B5ADOF69RDT","B5ADOF69V ","B5ADOF69WVS","B5ADOF6A ","B5ADOF6ADD ", & + "B5ADOF6D ","B5ADOF6HDS ","B5ADOF6RDT ","B5ADOF6V ","B5ADOF6WVS ","B5ADOF70A ","B5ADOF70ADD", & + "B5ADOF70D ","B5ADOF70HDS","B5ADOF70RDT","B5ADOF70V ","B5ADOF70WVS","B5ADOF71A ","B5ADOF71ADD", & + "B5ADOF71D ","B5ADOF71HDS","B5ADOF71RDT","B5ADOF71V ","B5ADOF71WVS","B5ADOF72A ","B5ADOF72ADD", & + "B5ADOF72D ","B5ADOF72HDS","B5ADOF72RDT","B5ADOF72V ","B5ADOF72WVS","B5ADOF73A ","B5ADOF73ADD", & + "B5ADOF73D ","B5ADOF73HDS","B5ADOF73RDT","B5ADOF73V ","B5ADOF73WVS","B5ADOF74A ","B5ADOF74ADD", & + "B5ADOF74D ","B5ADOF74HDS","B5ADOF74RDT","B5ADOF74V ","B5ADOF74WVS","B5ADOF75A ","B5ADOF75ADD", & + "B5ADOF75D ","B5ADOF75HDS","B5ADOF75RDT","B5ADOF75V ","B5ADOF75WVS","B5ADOF76A ","B5ADOF76ADD", & + "B5ADOF76D ","B5ADOF76HDS","B5ADOF76RDT","B5ADOF76V ","B5ADOF76WVS","B5ADOF77A ","B5ADOF77ADD", & + "B5ADOF77D ","B5ADOF77HDS","B5ADOF77RDT","B5ADOF77V ","B5ADOF77WVS","B5ADOF78A ","B5ADOF78ADD", & + "B5ADOF78D ","B5ADOF78HDS","B5ADOF78RDT","B5ADOF78V ","B5ADOF78WVS","B5ADOF79A ","B5ADOF79ADD", & + "B5ADOF79D ","B5ADOF79HDS","B5ADOF79RDT","B5ADOF79V ","B5ADOF79WVS","B5ADOF7A ","B5ADOF7ADD ", & + "B5ADOF7D ","B5ADOF7HDS ","B5ADOF7RDT ","B5ADOF7V ","B5ADOF7WVS ","B5ADOF80A ","B5ADOF80ADD", & + "B5ADOF80D ","B5ADOF80HDS","B5ADOF80RDT","B5ADOF80V ","B5ADOF80WVS","B5ADOF81A ","B5ADOF81ADD", & + "B5ADOF81D ","B5ADOF81HDS","B5ADOF81RDT","B5ADOF81V ","B5ADOF81WVS","B5ADOF82A ","B5ADOF82ADD", & + "B5ADOF82D ","B5ADOF82HDS","B5ADOF82RDT","B5ADOF82V ","B5ADOF82WVS","B5ADOF83A ","B5ADOF83ADD", & + "B5ADOF83D ","B5ADOF83HDS","B5ADOF83RDT","B5ADOF83V ","B5ADOF83WVS","B5ADOF84A ","B5ADOF84ADD", & + "B5ADOF84D ","B5ADOF84HDS","B5ADOF84RDT","B5ADOF84V ","B5ADOF84WVS","B5ADOF85A ","B5ADOF85ADD", & + "B5ADOF85D ","B5ADOF85HDS","B5ADOF85RDT","B5ADOF85V ","B5ADOF85WVS","B5ADOF86A ","B5ADOF86ADD", & + "B5ADOF86D ","B5ADOF86HDS","B5ADOF86RDT","B5ADOF86V ","B5ADOF86WVS","B5ADOF87A ","B5ADOF87ADD", & + "B5ADOF87D ","B5ADOF87HDS","B5ADOF87RDT","B5ADOF87V ","B5ADOF87WVS","B5ADOF88A ","B5ADOF88ADD", & + "B5ADOF88D ","B5ADOF88HDS","B5ADOF88RDT","B5ADOF88V ","B5ADOF88WVS","B5ADOF89A ","B5ADOF89ADD", & + "B5ADOF89D ","B5ADOF89HDS","B5ADOF89RDT","B5ADOF89V ","B5ADOF89WVS","B5ADOF8A ","B5ADOF8ADD ", & + "B5ADOF8D ","B5ADOF8HDS ","B5ADOF8RDT ","B5ADOF8V ","B5ADOF8WVS ","B5ADOF90A ","B5ADOF90ADD", & + "B5ADOF90D ","B5ADOF90HDS","B5ADOF90RDT","B5ADOF90V ","B5ADOF90WVS","B5ADOF91A ","B5ADOF91ADD", & + "B5ADOF91D ","B5ADOF91HDS","B5ADOF91RDT","B5ADOF91V ","B5ADOF91WVS","B5ADOF92A ","B5ADOF92ADD", & + "B5ADOF92D ","B5ADOF92HDS","B5ADOF92RDT","B5ADOF92V ","B5ADOF92WVS","B5ADOF93A ","B5ADOF93ADD", & + "B5ADOF93D ","B5ADOF93HDS","B5ADOF93RDT","B5ADOF93V ","B5ADOF93WVS","B5ADOF94A ","B5ADOF94ADD", & + "B5ADOF94D ","B5ADOF94HDS","B5ADOF94RDT","B5ADOF94V ","B5ADOF94WVS","B5ADOF95A ","B5ADOF95ADD", & + "B5ADOF95D ","B5ADOF95HDS","B5ADOF95RDT","B5ADOF95V ","B5ADOF95WVS","B5ADOF96A ","B5ADOF96ADD", & + "B5ADOF96D ","B5ADOF96HDS","B5ADOF96RDT","B5ADOF96V ","B5ADOF96WVS","B5ADOF97A ","B5ADOF97ADD", & + "B5ADOF97D ","B5ADOF97HDS","B5ADOF97RDT","B5ADOF97V ","B5ADOF97WVS","B5ADOF98A ","B5ADOF98ADD", & + "B5ADOF98D ","B5ADOF98HDS","B5ADOF98RDT","B5ADOF98V ","B5ADOF98WVS","B5ADOF99A ","B5ADOF99ADD", & + "B5ADOF99D ","B5ADOF99HDS","B5ADOF99RDT","B5ADOF99V ","B5ADOF99WVS","B5ADOF9A ","B5ADOF9ADD ", & + "B5ADOF9D ","B5ADOF9HDS ","B5ADOF9RDT ","B5ADOF9V ","B5ADOF9WVS ","B5HDSFXI ","B5HDSFYI ", & + "B5HDSFZI ","B5HDSMXI ","B5HDSMYI ","B5HDSMZI ","B5HEAVE ","B5PITCH ","B5RAXI ", & + "B5RAYI ","B5RAZI ","B5RDTFXI ","B5RDTFYI ","B5RDTFZI ","B5RDTMXI ","B5RDTMYI ", & + "B5RDTMZI ","B5ROLL ","B5RVXI ","B5RVYI ","B5RVZI ","B5SURGE ","B5SWAY ", & + "B5TAXI ","B5TAYI ","B5TAZI ","B5TVXI ","B5TVYI ","B5TVZI ","B5WVSF1XI ", & + "B5WVSF1YI ","B5WVSF1ZI ","B5WVSF2XI ","B5WVSF2YI ","B5WVSF2ZI ","B5WVSFXI ","B5WVSFYI ", & + "B5WVSFZI ","B5WVSM1XI ","B5WVSM1YI ","B5WVSM1ZI ","B5WVSM2XI ","B5WVSM2YI ","B5WVSM2ZI ", & + "B5WVSMXI ","B5WVSMYI ","B5WVSMZI ","B5YAW ","B6ADDFXI ","B6ADDFYI ","B6ADDFZI ", & + "B6ADDMXI ","B6ADDMYI ","B6ADDMZI ","B6ADOF10A ","B6ADOF10ADD","B6ADOF10D ","B6ADOF10HDS", & + "B6ADOF10RDT","B6ADOF10V ","B6ADOF10WVS","B6ADOF11A ","B6ADOF11ADD","B6ADOF11D ","B6ADOF11HDS", & + "B6ADOF11RDT","B6ADOF11V ","B6ADOF11WVS","B6ADOF12A ","B6ADOF12ADD","B6ADOF12D ","B6ADOF12HDS", & + "B6ADOF12RDT","B6ADOF12V ","B6ADOF12WVS","B6ADOF13A ","B6ADOF13ADD","B6ADOF13D ","B6ADOF13HDS", & + "B6ADOF13RDT","B6ADOF13V ","B6ADOF13WVS","B6ADOF14A ","B6ADOF14ADD","B6ADOF14D ","B6ADOF14HDS", & + "B6ADOF14RDT","B6ADOF14V ","B6ADOF14WVS","B6ADOF15A ","B6ADOF15ADD","B6ADOF15D ","B6ADOF15HDS", & + "B6ADOF15RDT","B6ADOF15V ","B6ADOF15WVS","B6ADOF16A ","B6ADOF16ADD","B6ADOF16D ","B6ADOF16HDS", & + "B6ADOF16RDT","B6ADOF16V ","B6ADOF16WVS","B6ADOF17A ","B6ADOF17ADD","B6ADOF17D ","B6ADOF17HDS", & + "B6ADOF17RDT","B6ADOF17V ","B6ADOF17WVS","B6ADOF18A ","B6ADOF18ADD","B6ADOF18D ","B6ADOF18HDS", & + "B6ADOF18RDT","B6ADOF18V ","B6ADOF18WVS","B6ADOF19A ","B6ADOF19ADD","B6ADOF19D ","B6ADOF19HDS", & + "B6ADOF19RDT","B6ADOF19V ","B6ADOF19WVS","B6ADOF1A ","B6ADOF1ADD ","B6ADOF1D ","B6ADOF1HDS ", & + "B6ADOF1RDT ","B6ADOF1V ","B6ADOF1WVS ","B6ADOF20A ","B6ADOF20ADD","B6ADOF20D ","B6ADOF20HDS", & + "B6ADOF20RDT","B6ADOF20V ","B6ADOF20WVS","B6ADOF21A ","B6ADOF21ADD","B6ADOF21D ","B6ADOF21HDS", & + "B6ADOF21RDT","B6ADOF21V ","B6ADOF21WVS","B6ADOF22A ","B6ADOF22ADD","B6ADOF22D ","B6ADOF22HDS", & + "B6ADOF22RDT","B6ADOF22V ","B6ADOF22WVS","B6ADOF23A ","B6ADOF23ADD","B6ADOF23D ","B6ADOF23HDS", & + "B6ADOF23RDT","B6ADOF23V ","B6ADOF23WVS","B6ADOF24A ","B6ADOF24ADD","B6ADOF24D ","B6ADOF24HDS", & + "B6ADOF24RDT","B6ADOF24V ","B6ADOF24WVS","B6ADOF25A ","B6ADOF25ADD","B6ADOF25D ","B6ADOF25HDS", & + "B6ADOF25RDT","B6ADOF25V ","B6ADOF25WVS","B6ADOF26A ","B6ADOF26ADD","B6ADOF26D ","B6ADOF26HDS", & + "B6ADOF26RDT","B6ADOF26V ","B6ADOF26WVS","B6ADOF27A ","B6ADOF27ADD","B6ADOF27D ","B6ADOF27HDS", & + "B6ADOF27RDT","B6ADOF27V ","B6ADOF27WVS","B6ADOF28A ","B6ADOF28ADD","B6ADOF28D ","B6ADOF28HDS", & + "B6ADOF28RDT","B6ADOF28V ","B6ADOF28WVS","B6ADOF29A ","B6ADOF29ADD","B6ADOF29D ","B6ADOF29HDS", & + "B6ADOF29RDT","B6ADOF29V ","B6ADOF29WVS","B6ADOF2A ","B6ADOF2ADD ","B6ADOF2D ","B6ADOF2HDS ", & + "B6ADOF2RDT ","B6ADOF2V ","B6ADOF2WVS ","B6ADOF30A ","B6ADOF30ADD","B6ADOF30D ","B6ADOF30HDS", & + "B6ADOF30RDT","B6ADOF30V ","B6ADOF30WVS","B6ADOF31A ","B6ADOF31ADD","B6ADOF31D ","B6ADOF31HDS", & + "B6ADOF31RDT","B6ADOF31V ","B6ADOF31WVS","B6ADOF32A ","B6ADOF32ADD","B6ADOF32D ","B6ADOF32HDS", & + "B6ADOF32RDT","B6ADOF32V ","B6ADOF32WVS","B6ADOF33A ","B6ADOF33ADD","B6ADOF33D ","B6ADOF33HDS", & + "B6ADOF33RDT","B6ADOF33V ","B6ADOF33WVS","B6ADOF34A ","B6ADOF34ADD","B6ADOF34D ","B6ADOF34HDS", & + "B6ADOF34RDT","B6ADOF34V ","B6ADOF34WVS","B6ADOF35A ","B6ADOF35ADD","B6ADOF35D ","B6ADOF35HDS", & + "B6ADOF35RDT","B6ADOF35V ","B6ADOF35WVS","B6ADOF36A ","B6ADOF36ADD","B6ADOF36D ","B6ADOF36HDS", & + "B6ADOF36RDT","B6ADOF36V ","B6ADOF36WVS","B6ADOF37A ","B6ADOF37ADD","B6ADOF37D ","B6ADOF37HDS", & + "B6ADOF37RDT","B6ADOF37V ","B6ADOF37WVS","B6ADOF38A ","B6ADOF38ADD","B6ADOF38D ","B6ADOF38HDS", & + "B6ADOF38RDT","B6ADOF38V ","B6ADOF38WVS","B6ADOF39A ","B6ADOF39ADD","B6ADOF39D ","B6ADOF39HDS", & + "B6ADOF39RDT","B6ADOF39V ","B6ADOF39WVS","B6ADOF3A ","B6ADOF3ADD ","B6ADOF3D ","B6ADOF3HDS ", & + "B6ADOF3RDT ","B6ADOF3V ","B6ADOF3WVS ","B6ADOF40A ","B6ADOF40ADD","B6ADOF40D ","B6ADOF40HDS", & + "B6ADOF40RDT","B6ADOF40V ","B6ADOF40WVS","B6ADOF41A ","B6ADOF41ADD","B6ADOF41D ","B6ADOF41HDS", & + "B6ADOF41RDT","B6ADOF41V ","B6ADOF41WVS","B6ADOF42A ","B6ADOF42ADD","B6ADOF42D ","B6ADOF42HDS", & + "B6ADOF42RDT","B6ADOF42V ","B6ADOF42WVS","B6ADOF43A ","B6ADOF43ADD","B6ADOF43D ","B6ADOF43HDS", & + "B6ADOF43RDT","B6ADOF43V ","B6ADOF43WVS","B6ADOF44A ","B6ADOF44ADD","B6ADOF44D ","B6ADOF44HDS", & + "B6ADOF44RDT","B6ADOF44V ","B6ADOF44WVS","B6ADOF45A ","B6ADOF45ADD","B6ADOF45D ","B6ADOF45HDS", & + "B6ADOF45RDT","B6ADOF45V ","B6ADOF45WVS","B6ADOF46A ","B6ADOF46ADD","B6ADOF46D ","B6ADOF46HDS", & + "B6ADOF46RDT","B6ADOF46V ","B6ADOF46WVS","B6ADOF47A ","B6ADOF47ADD","B6ADOF47D ","B6ADOF47HDS", & + "B6ADOF47RDT","B6ADOF47V ","B6ADOF47WVS","B6ADOF48A ","B6ADOF48ADD","B6ADOF48D ","B6ADOF48HDS", & + "B6ADOF48RDT","B6ADOF48V ","B6ADOF48WVS","B6ADOF49A ","B6ADOF49ADD","B6ADOF49D ","B6ADOF49HDS", & + "B6ADOF49RDT","B6ADOF49V ","B6ADOF49WVS","B6ADOF4A ","B6ADOF4ADD ","B6ADOF4D ","B6ADOF4HDS ", & + "B6ADOF4RDT ","B6ADOF4V ","B6ADOF4WVS ","B6ADOF50A ","B6ADOF50ADD","B6ADOF50D ","B6ADOF50HDS", & + "B6ADOF50RDT","B6ADOF50V ","B6ADOF50WVS","B6ADOF51A ","B6ADOF51ADD","B6ADOF51D ","B6ADOF51HDS", & + "B6ADOF51RDT","B6ADOF51V ","B6ADOF51WVS","B6ADOF52A ","B6ADOF52ADD","B6ADOF52D ","B6ADOF52HDS", & + "B6ADOF52RDT","B6ADOF52V ","B6ADOF52WVS","B6ADOF53A ","B6ADOF53ADD","B6ADOF53D ","B6ADOF53HDS", & + "B6ADOF53RDT","B6ADOF53V ","B6ADOF53WVS","B6ADOF54A ","B6ADOF54ADD","B6ADOF54D ","B6ADOF54HDS", & + "B6ADOF54RDT","B6ADOF54V ","B6ADOF54WVS","B6ADOF55A ","B6ADOF55ADD","B6ADOF55D ","B6ADOF55HDS", & + "B6ADOF55RDT","B6ADOF55V ","B6ADOF55WVS","B6ADOF56A ","B6ADOF56ADD","B6ADOF56D ","B6ADOF56HDS", & + "B6ADOF56RDT","B6ADOF56V ","B6ADOF56WVS","B6ADOF57A ","B6ADOF57ADD","B6ADOF57D ","B6ADOF57HDS", & + "B6ADOF57RDT","B6ADOF57V ","B6ADOF57WVS","B6ADOF58A ","B6ADOF58ADD","B6ADOF58D ","B6ADOF58HDS", & + "B6ADOF58RDT","B6ADOF58V ","B6ADOF58WVS","B6ADOF59A ","B6ADOF59ADD","B6ADOF59D ","B6ADOF59HDS", & + "B6ADOF59RDT","B6ADOF59V ","B6ADOF59WVS","B6ADOF5A ","B6ADOF5ADD ","B6ADOF5D ","B6ADOF5HDS ", & + "B6ADOF5RDT ","B6ADOF5V ","B6ADOF5WVS ","B6ADOF60A ","B6ADOF60ADD","B6ADOF60D ","B6ADOF60HDS", & + "B6ADOF60RDT","B6ADOF60V ","B6ADOF60WVS","B6ADOF61A ","B6ADOF61ADD","B6ADOF61D ","B6ADOF61HDS", & + "B6ADOF61RDT","B6ADOF61V ","B6ADOF61WVS","B6ADOF62A ","B6ADOF62ADD","B6ADOF62D ","B6ADOF62HDS", & + "B6ADOF62RDT","B6ADOF62V ","B6ADOF62WVS","B6ADOF63A ","B6ADOF63ADD","B6ADOF63D ","B6ADOF63HDS", & + "B6ADOF63RDT","B6ADOF63V ","B6ADOF63WVS","B6ADOF64A ","B6ADOF64ADD","B6ADOF64D ","B6ADOF64HDS", & + "B6ADOF64RDT","B6ADOF64V ","B6ADOF64WVS","B6ADOF65A ","B6ADOF65ADD","B6ADOF65D ","B6ADOF65HDS", & + "B6ADOF65RDT","B6ADOF65V ","B6ADOF65WVS","B6ADOF66A ","B6ADOF66ADD","B6ADOF66D ","B6ADOF66HDS", & + "B6ADOF66RDT","B6ADOF66V ","B6ADOF66WVS","B6ADOF67A ","B6ADOF67ADD","B6ADOF67D ","B6ADOF67HDS", & + "B6ADOF67RDT","B6ADOF67V ","B6ADOF67WVS","B6ADOF68A ","B6ADOF68ADD","B6ADOF68D ","B6ADOF68HDS", & + "B6ADOF68RDT","B6ADOF68V ","B6ADOF68WVS","B6ADOF69A ","B6ADOF69ADD","B6ADOF69D ","B6ADOF69HDS", & + "B6ADOF69RDT","B6ADOF69V ","B6ADOF69WVS","B6ADOF6A ","B6ADOF6ADD ","B6ADOF6D ","B6ADOF6HDS ", & + "B6ADOF6RDT ","B6ADOF6V ","B6ADOF6WVS ","B6ADOF70A ","B6ADOF70ADD","B6ADOF70D ","B6ADOF70HDS", & + "B6ADOF70RDT","B6ADOF70V ","B6ADOF70WVS","B6ADOF71A ","B6ADOF71ADD","B6ADOF71D ","B6ADOF71HDS", & + "B6ADOF71RDT","B6ADOF71V ","B6ADOF71WVS","B6ADOF72A ","B6ADOF72ADD","B6ADOF72D ","B6ADOF72HDS", & + "B6ADOF72RDT","B6ADOF72V ","B6ADOF72WVS","B6ADOF73A ","B6ADOF73ADD","B6ADOF73D ","B6ADOF73HDS", & + "B6ADOF73RDT","B6ADOF73V ","B6ADOF73WVS","B6ADOF74A ","B6ADOF74ADD","B6ADOF74D ","B6ADOF74HDS", & + "B6ADOF74RDT","B6ADOF74V ","B6ADOF74WVS","B6ADOF75A ","B6ADOF75ADD","B6ADOF75D ","B6ADOF75HDS", & + "B6ADOF75RDT","B6ADOF75V ","B6ADOF75WVS","B6ADOF76A ","B6ADOF76ADD","B6ADOF76D ","B6ADOF76HDS", & + "B6ADOF76RDT","B6ADOF76V ","B6ADOF76WVS","B6ADOF77A ","B6ADOF77ADD","B6ADOF77D ","B6ADOF77HDS", & + "B6ADOF77RDT","B6ADOF77V ","B6ADOF77WVS","B6ADOF78A ","B6ADOF78ADD","B6ADOF78D ","B6ADOF78HDS", & + "B6ADOF78RDT","B6ADOF78V ","B6ADOF78WVS","B6ADOF79A ","B6ADOF79ADD","B6ADOF79D ","B6ADOF79HDS", & + "B6ADOF79RDT","B6ADOF79V ","B6ADOF79WVS","B6ADOF7A ","B6ADOF7ADD ","B6ADOF7D ","B6ADOF7HDS ", & + "B6ADOF7RDT ","B6ADOF7V ","B6ADOF7WVS ","B6ADOF80A ","B6ADOF80ADD","B6ADOF80D ","B6ADOF80HDS", & + "B6ADOF80RDT","B6ADOF80V ","B6ADOF80WVS","B6ADOF81A ","B6ADOF81ADD","B6ADOF81D ","B6ADOF81HDS", & + "B6ADOF81RDT","B6ADOF81V ","B6ADOF81WVS","B6ADOF82A ","B6ADOF82ADD","B6ADOF82D ","B6ADOF82HDS", & + "B6ADOF82RDT","B6ADOF82V ","B6ADOF82WVS","B6ADOF83A ","B6ADOF83ADD","B6ADOF83D ","B6ADOF83HDS", & + "B6ADOF83RDT","B6ADOF83V ","B6ADOF83WVS","B6ADOF84A ","B6ADOF84ADD","B6ADOF84D ","B6ADOF84HDS", & + "B6ADOF84RDT","B6ADOF84V ","B6ADOF84WVS","B6ADOF85A ","B6ADOF85ADD","B6ADOF85D ","B6ADOF85HDS", & + "B6ADOF85RDT","B6ADOF85V ","B6ADOF85WVS","B6ADOF86A ","B6ADOF86ADD","B6ADOF86D ","B6ADOF86HDS", & + "B6ADOF86RDT","B6ADOF86V ","B6ADOF86WVS","B6ADOF87A ","B6ADOF87ADD","B6ADOF87D ","B6ADOF87HDS", & + "B6ADOF87RDT","B6ADOF87V ","B6ADOF87WVS","B6ADOF88A ","B6ADOF88ADD","B6ADOF88D ","B6ADOF88HDS", & + "B6ADOF88RDT","B6ADOF88V ","B6ADOF88WVS","B6ADOF89A ","B6ADOF89ADD","B6ADOF89D ","B6ADOF89HDS", & + "B6ADOF89RDT","B6ADOF89V ","B6ADOF89WVS","B6ADOF8A ","B6ADOF8ADD ","B6ADOF8D ","B6ADOF8HDS ", & + "B6ADOF8RDT ","B6ADOF8V ","B6ADOF8WVS ","B6ADOF90A ","B6ADOF90ADD","B6ADOF90D ","B6ADOF90HDS", & + "B6ADOF90RDT","B6ADOF90V ","B6ADOF90WVS","B6ADOF91A ","B6ADOF91ADD","B6ADOF91D ","B6ADOF91HDS", & + "B6ADOF91RDT","B6ADOF91V ","B6ADOF91WVS","B6ADOF92A ","B6ADOF92ADD","B6ADOF92D ","B6ADOF92HDS", & + "B6ADOF92RDT","B6ADOF92V ","B6ADOF92WVS","B6ADOF93A ","B6ADOF93ADD","B6ADOF93D ","B6ADOF93HDS", & + "B6ADOF93RDT","B6ADOF93V ","B6ADOF93WVS","B6ADOF94A ","B6ADOF94ADD","B6ADOF94D ","B6ADOF94HDS", & + "B6ADOF94RDT","B6ADOF94V ","B6ADOF94WVS","B6ADOF95A ","B6ADOF95ADD","B6ADOF95D ","B6ADOF95HDS", & + "B6ADOF95RDT","B6ADOF95V ","B6ADOF95WVS","B6ADOF96A ","B6ADOF96ADD","B6ADOF96D ","B6ADOF96HDS", & + "B6ADOF96RDT","B6ADOF96V ","B6ADOF96WVS","B6ADOF97A ","B6ADOF97ADD","B6ADOF97D ","B6ADOF97HDS", & + "B6ADOF97RDT","B6ADOF97V ","B6ADOF97WVS","B6ADOF98A ","B6ADOF98ADD","B6ADOF98D ","B6ADOF98HDS", & + "B6ADOF98RDT","B6ADOF98V ","B6ADOF98WVS","B6ADOF99A ","B6ADOF99ADD","B6ADOF99D ","B6ADOF99HDS", & + "B6ADOF99RDT","B6ADOF99V ","B6ADOF99WVS","B6ADOF9A ","B6ADOF9ADD ","B6ADOF9D ","B6ADOF9HDS ", & + "B6ADOF9RDT ","B6ADOF9V ","B6ADOF9WVS ","B6HDSFXI ","B6HDSFYI ","B6HDSFZI ","B6HDSMXI ", & + "B6HDSMYI ","B6HDSMZI ","B6HEAVE ","B6PITCH ","B6RAXI ","B6RAYI ","B6RAZI ", & + "B6RDTFXI ","B6RDTFYI ","B6RDTFZI ","B6RDTMXI ","B6RDTMYI ","B6RDTMZI ","B6ROLL ", & + "B6RVXI ","B6RVYI ","B6RVZI ","B6SURGE ","B6SWAY ","B6TAXI ","B6TAYI ", & + "B6TAZI ","B6TVXI ","B6TVYI ","B6TVZI ","B6WVSF1XI ","B6WVSF1YI ","B6WVSF1ZI ", & + "B6WVSF2XI ","B6WVSF2YI ","B6WVSF2ZI ","B6WVSFXI ","B6WVSFYI ","B6WVSFZI ","B6WVSM1XI ", & + "B6WVSM1YI ","B6WVSM1ZI ","B6WVSM2XI ","B6WVSM2YI ","B6WVSM2ZI ","B6WVSMXI ","B6WVSMYI ", & + "B6WVSMZI ","B6YAW ","B7ADDFXI ","B7ADDFYI ","B7ADDFZI ","B7ADDMXI ","B7ADDMYI ", & + "B7ADDMZI ","B7ADOF10A ","B7ADOF10ADD","B7ADOF10D ","B7ADOF10HDS","B7ADOF10RDT","B7ADOF10V ", & + "B7ADOF10WVS","B7ADOF11A ","B7ADOF11ADD","B7ADOF11D ","B7ADOF11HDS","B7ADOF11RDT","B7ADOF11V ", & + "B7ADOF11WVS","B7ADOF12A ","B7ADOF12ADD","B7ADOF12D ","B7ADOF12HDS","B7ADOF12RDT","B7ADOF12V ", & + "B7ADOF12WVS","B7ADOF13A ","B7ADOF13ADD","B7ADOF13D ","B7ADOF13HDS","B7ADOF13RDT","B7ADOF13V ", & + "B7ADOF13WVS","B7ADOF14A ","B7ADOF14ADD","B7ADOF14D ","B7ADOF14HDS","B7ADOF14RDT","B7ADOF14V ", & + "B7ADOF14WVS","B7ADOF15A ","B7ADOF15ADD","B7ADOF15D ","B7ADOF15HDS","B7ADOF15RDT","B7ADOF15V ", & + "B7ADOF15WVS","B7ADOF16A ","B7ADOF16ADD","B7ADOF16D ","B7ADOF16HDS","B7ADOF16RDT","B7ADOF16V ", & + "B7ADOF16WVS","B7ADOF17A ","B7ADOF17ADD","B7ADOF17D ","B7ADOF17HDS","B7ADOF17RDT","B7ADOF17V ", & + "B7ADOF17WVS","B7ADOF18A ","B7ADOF18ADD","B7ADOF18D ","B7ADOF18HDS","B7ADOF18RDT","B7ADOF18V ", & + "B7ADOF18WVS","B7ADOF19A ","B7ADOF19ADD","B7ADOF19D ","B7ADOF19HDS","B7ADOF19RDT","B7ADOF19V ", & + "B7ADOF19WVS","B7ADOF1A ","B7ADOF1ADD ","B7ADOF1D ","B7ADOF1HDS ","B7ADOF1RDT ","B7ADOF1V ", & + "B7ADOF1WVS ","B7ADOF20A ","B7ADOF20ADD","B7ADOF20D ","B7ADOF20HDS","B7ADOF20RDT","B7ADOF20V ", & + "B7ADOF20WVS","B7ADOF21A ","B7ADOF21ADD","B7ADOF21D ","B7ADOF21HDS","B7ADOF21RDT","B7ADOF21V ", & + "B7ADOF21WVS","B7ADOF22A ","B7ADOF22ADD","B7ADOF22D ","B7ADOF22HDS","B7ADOF22RDT","B7ADOF22V ", & + "B7ADOF22WVS","B7ADOF23A ","B7ADOF23ADD","B7ADOF23D ","B7ADOF23HDS","B7ADOF23RDT","B7ADOF23V ", & + "B7ADOF23WVS","B7ADOF24A ","B7ADOF24ADD","B7ADOF24D ","B7ADOF24HDS","B7ADOF24RDT","B7ADOF24V ", & + "B7ADOF24WVS","B7ADOF25A ","B7ADOF25ADD","B7ADOF25D ","B7ADOF25HDS","B7ADOF25RDT","B7ADOF25V ", & + "B7ADOF25WVS","B7ADOF26A ","B7ADOF26ADD","B7ADOF26D ","B7ADOF26HDS","B7ADOF26RDT","B7ADOF26V ", & + "B7ADOF26WVS","B7ADOF27A ","B7ADOF27ADD","B7ADOF27D ","B7ADOF27HDS","B7ADOF27RDT","B7ADOF27V ", & + "B7ADOF27WVS","B7ADOF28A ","B7ADOF28ADD","B7ADOF28D ","B7ADOF28HDS","B7ADOF28RDT","B7ADOF28V ", & + "B7ADOF28WVS","B7ADOF29A ","B7ADOF29ADD","B7ADOF29D ","B7ADOF29HDS","B7ADOF29RDT","B7ADOF29V ", & + "B7ADOF29WVS","B7ADOF2A ","B7ADOF2ADD ","B7ADOF2D ","B7ADOF2HDS ","B7ADOF2RDT ","B7ADOF2V ", & + "B7ADOF2WVS ","B7ADOF30A ","B7ADOF30ADD","B7ADOF30D ","B7ADOF30HDS","B7ADOF30RDT","B7ADOF30V ", & + "B7ADOF30WVS","B7ADOF31A ","B7ADOF31ADD","B7ADOF31D ","B7ADOF31HDS","B7ADOF31RDT","B7ADOF31V ", & + "B7ADOF31WVS","B7ADOF32A ","B7ADOF32ADD","B7ADOF32D ","B7ADOF32HDS","B7ADOF32RDT","B7ADOF32V ", & + "B7ADOF32WVS","B7ADOF33A ","B7ADOF33ADD","B7ADOF33D ","B7ADOF33HDS","B7ADOF33RDT","B7ADOF33V ", & + "B7ADOF33WVS","B7ADOF34A ","B7ADOF34ADD","B7ADOF34D ","B7ADOF34HDS","B7ADOF34RDT","B7ADOF34V ", & + "B7ADOF34WVS","B7ADOF35A ","B7ADOF35ADD","B7ADOF35D ","B7ADOF35HDS","B7ADOF35RDT","B7ADOF35V ", & + "B7ADOF35WVS","B7ADOF36A ","B7ADOF36ADD","B7ADOF36D ","B7ADOF36HDS","B7ADOF36RDT","B7ADOF36V ", & + "B7ADOF36WVS","B7ADOF37A ","B7ADOF37ADD","B7ADOF37D ","B7ADOF37HDS","B7ADOF37RDT","B7ADOF37V ", & + "B7ADOF37WVS","B7ADOF38A ","B7ADOF38ADD","B7ADOF38D ","B7ADOF38HDS","B7ADOF38RDT","B7ADOF38V ", & + "B7ADOF38WVS","B7ADOF39A ","B7ADOF39ADD","B7ADOF39D ","B7ADOF39HDS","B7ADOF39RDT","B7ADOF39V ", & + "B7ADOF39WVS","B7ADOF3A ","B7ADOF3ADD ","B7ADOF3D ","B7ADOF3HDS ","B7ADOF3RDT ","B7ADOF3V ", & + "B7ADOF3WVS ","B7ADOF40A ","B7ADOF40ADD","B7ADOF40D ","B7ADOF40HDS","B7ADOF40RDT","B7ADOF40V ", & + "B7ADOF40WVS","B7ADOF41A ","B7ADOF41ADD","B7ADOF41D ","B7ADOF41HDS","B7ADOF41RDT","B7ADOF41V ", & + "B7ADOF41WVS","B7ADOF42A ","B7ADOF42ADD","B7ADOF42D ","B7ADOF42HDS","B7ADOF42RDT","B7ADOF42V ", & + "B7ADOF42WVS","B7ADOF43A ","B7ADOF43ADD","B7ADOF43D ","B7ADOF43HDS","B7ADOF43RDT","B7ADOF43V ", & + "B7ADOF43WVS","B7ADOF44A ","B7ADOF44ADD","B7ADOF44D ","B7ADOF44HDS","B7ADOF44RDT","B7ADOF44V ", & + "B7ADOF44WVS","B7ADOF45A ","B7ADOF45ADD","B7ADOF45D ","B7ADOF45HDS","B7ADOF45RDT","B7ADOF45V ", & + "B7ADOF45WVS","B7ADOF46A ","B7ADOF46ADD","B7ADOF46D ","B7ADOF46HDS","B7ADOF46RDT","B7ADOF46V ", & + "B7ADOF46WVS","B7ADOF47A ","B7ADOF47ADD","B7ADOF47D ","B7ADOF47HDS","B7ADOF47RDT","B7ADOF47V ", & + "B7ADOF47WVS","B7ADOF48A ","B7ADOF48ADD","B7ADOF48D ","B7ADOF48HDS","B7ADOF48RDT","B7ADOF48V ", & + "B7ADOF48WVS","B7ADOF49A ","B7ADOF49ADD","B7ADOF49D ","B7ADOF49HDS","B7ADOF49RDT","B7ADOF49V ", & + "B7ADOF49WVS","B7ADOF4A ","B7ADOF4ADD ","B7ADOF4D ","B7ADOF4HDS ","B7ADOF4RDT ","B7ADOF4V ", & + "B7ADOF4WVS ","B7ADOF50A ","B7ADOF50ADD","B7ADOF50D ","B7ADOF50HDS","B7ADOF50RDT","B7ADOF50V ", & + "B7ADOF50WVS","B7ADOF51A ","B7ADOF51ADD","B7ADOF51D ","B7ADOF51HDS","B7ADOF51RDT","B7ADOF51V ", & + "B7ADOF51WVS","B7ADOF52A ","B7ADOF52ADD","B7ADOF52D ","B7ADOF52HDS","B7ADOF52RDT","B7ADOF52V ", & + "B7ADOF52WVS","B7ADOF53A ","B7ADOF53ADD","B7ADOF53D ","B7ADOF53HDS","B7ADOF53RDT","B7ADOF53V ", & + "B7ADOF53WVS","B7ADOF54A ","B7ADOF54ADD","B7ADOF54D ","B7ADOF54HDS","B7ADOF54RDT","B7ADOF54V ", & + "B7ADOF54WVS","B7ADOF55A ","B7ADOF55ADD","B7ADOF55D ","B7ADOF55HDS","B7ADOF55RDT","B7ADOF55V ", & + "B7ADOF55WVS","B7ADOF56A ","B7ADOF56ADD","B7ADOF56D ","B7ADOF56HDS","B7ADOF56RDT","B7ADOF56V ", & + "B7ADOF56WVS","B7ADOF57A ","B7ADOF57ADD","B7ADOF57D ","B7ADOF57HDS","B7ADOF57RDT","B7ADOF57V ", & + "B7ADOF57WVS","B7ADOF58A ","B7ADOF58ADD","B7ADOF58D ","B7ADOF58HDS","B7ADOF58RDT","B7ADOF58V ", & + "B7ADOF58WVS","B7ADOF59A ","B7ADOF59ADD","B7ADOF59D ","B7ADOF59HDS","B7ADOF59RDT","B7ADOF59V ", & + "B7ADOF59WVS","B7ADOF5A ","B7ADOF5ADD ","B7ADOF5D ","B7ADOF5HDS ","B7ADOF5RDT ","B7ADOF5V ", & + "B7ADOF5WVS ","B7ADOF60A ","B7ADOF60ADD","B7ADOF60D ","B7ADOF60HDS","B7ADOF60RDT","B7ADOF60V ", & + "B7ADOF60WVS","B7ADOF61A ","B7ADOF61ADD","B7ADOF61D ","B7ADOF61HDS","B7ADOF61RDT","B7ADOF61V ", & + "B7ADOF61WVS","B7ADOF62A ","B7ADOF62ADD","B7ADOF62D ","B7ADOF62HDS","B7ADOF62RDT","B7ADOF62V ", & + "B7ADOF62WVS","B7ADOF63A ","B7ADOF63ADD","B7ADOF63D ","B7ADOF63HDS","B7ADOF63RDT","B7ADOF63V ", & + "B7ADOF63WVS","B7ADOF64A ","B7ADOF64ADD","B7ADOF64D ","B7ADOF64HDS","B7ADOF64RDT","B7ADOF64V ", & + "B7ADOF64WVS","B7ADOF65A ","B7ADOF65ADD","B7ADOF65D ","B7ADOF65HDS","B7ADOF65RDT","B7ADOF65V ", & + "B7ADOF65WVS","B7ADOF66A ","B7ADOF66ADD","B7ADOF66D ","B7ADOF66HDS","B7ADOF66RDT","B7ADOF66V ", & + "B7ADOF66WVS","B7ADOF67A ","B7ADOF67ADD","B7ADOF67D ","B7ADOF67HDS","B7ADOF67RDT","B7ADOF67V ", & + "B7ADOF67WVS","B7ADOF68A ","B7ADOF68ADD","B7ADOF68D ","B7ADOF68HDS","B7ADOF68RDT","B7ADOF68V ", & + "B7ADOF68WVS","B7ADOF69A ","B7ADOF69ADD","B7ADOF69D ","B7ADOF69HDS","B7ADOF69RDT","B7ADOF69V ", & + "B7ADOF69WVS","B7ADOF6A ","B7ADOF6ADD ","B7ADOF6D ","B7ADOF6HDS ","B7ADOF6RDT ","B7ADOF6V ", & + "B7ADOF6WVS ","B7ADOF70A ","B7ADOF70ADD","B7ADOF70D ","B7ADOF70HDS","B7ADOF70RDT","B7ADOF70V ", & + "B7ADOF70WVS","B7ADOF71A ","B7ADOF71ADD","B7ADOF71D ","B7ADOF71HDS","B7ADOF71RDT","B7ADOF71V ", & + "B7ADOF71WVS","B7ADOF72A ","B7ADOF72ADD","B7ADOF72D ","B7ADOF72HDS","B7ADOF72RDT","B7ADOF72V ", & + "B7ADOF72WVS","B7ADOF73A ","B7ADOF73ADD","B7ADOF73D ","B7ADOF73HDS","B7ADOF73RDT","B7ADOF73V ", & + "B7ADOF73WVS","B7ADOF74A ","B7ADOF74ADD","B7ADOF74D ","B7ADOF74HDS","B7ADOF74RDT","B7ADOF74V ", & + "B7ADOF74WVS","B7ADOF75A ","B7ADOF75ADD","B7ADOF75D ","B7ADOF75HDS","B7ADOF75RDT","B7ADOF75V ", & + "B7ADOF75WVS","B7ADOF76A ","B7ADOF76ADD","B7ADOF76D ","B7ADOF76HDS","B7ADOF76RDT","B7ADOF76V ", & + "B7ADOF76WVS","B7ADOF77A ","B7ADOF77ADD","B7ADOF77D ","B7ADOF77HDS","B7ADOF77RDT","B7ADOF77V ", & + "B7ADOF77WVS","B7ADOF78A ","B7ADOF78ADD","B7ADOF78D ","B7ADOF78HDS","B7ADOF78RDT","B7ADOF78V ", & + "B7ADOF78WVS","B7ADOF79A ","B7ADOF79ADD","B7ADOF79D ","B7ADOF79HDS","B7ADOF79RDT","B7ADOF79V ", & + "B7ADOF79WVS","B7ADOF7A ","B7ADOF7ADD ","B7ADOF7D ","B7ADOF7HDS ","B7ADOF7RDT ","B7ADOF7V ", & + "B7ADOF7WVS ","B7ADOF80A ","B7ADOF80ADD","B7ADOF80D ","B7ADOF80HDS","B7ADOF80RDT","B7ADOF80V ", & + "B7ADOF80WVS","B7ADOF81A ","B7ADOF81ADD","B7ADOF81D ","B7ADOF81HDS","B7ADOF81RDT","B7ADOF81V ", & + "B7ADOF81WVS","B7ADOF82A ","B7ADOF82ADD","B7ADOF82D ","B7ADOF82HDS","B7ADOF82RDT","B7ADOF82V ", & + "B7ADOF82WVS","B7ADOF83A ","B7ADOF83ADD","B7ADOF83D ","B7ADOF83HDS","B7ADOF83RDT","B7ADOF83V ", & + "B7ADOF83WVS","B7ADOF84A ","B7ADOF84ADD","B7ADOF84D ","B7ADOF84HDS","B7ADOF84RDT","B7ADOF84V "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry4(1686) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "B7ADOF84WVS","B7ADOF85A ","B7ADOF85ADD","B7ADOF85D ","B7ADOF85HDS","B7ADOF85RDT","B7ADOF85V ", & + "B7ADOF85WVS","B7ADOF86A ","B7ADOF86ADD","B7ADOF86D ","B7ADOF86HDS","B7ADOF86RDT","B7ADOF86V ", & + "B7ADOF86WVS","B7ADOF87A ","B7ADOF87ADD","B7ADOF87D ","B7ADOF87HDS","B7ADOF87RDT","B7ADOF87V ", & + "B7ADOF87WVS","B7ADOF88A ","B7ADOF88ADD","B7ADOF88D ","B7ADOF88HDS","B7ADOF88RDT","B7ADOF88V ", & + "B7ADOF88WVS","B7ADOF89A ","B7ADOF89ADD","B7ADOF89D ","B7ADOF89HDS","B7ADOF89RDT","B7ADOF89V ", & + "B7ADOF89WVS","B7ADOF8A ","B7ADOF8ADD ","B7ADOF8D ","B7ADOF8HDS ","B7ADOF8RDT ","B7ADOF8V ", & + "B7ADOF8WVS ","B7ADOF90A ","B7ADOF90ADD","B7ADOF90D ","B7ADOF90HDS","B7ADOF90RDT","B7ADOF90V ", & + "B7ADOF90WVS","B7ADOF91A ","B7ADOF91ADD","B7ADOF91D ","B7ADOF91HDS","B7ADOF91RDT","B7ADOF91V ", & + "B7ADOF91WVS","B7ADOF92A ","B7ADOF92ADD","B7ADOF92D ","B7ADOF92HDS","B7ADOF92RDT","B7ADOF92V ", & + "B7ADOF92WVS","B7ADOF93A ","B7ADOF93ADD","B7ADOF93D ","B7ADOF93HDS","B7ADOF93RDT","B7ADOF93V ", & + "B7ADOF93WVS","B7ADOF94A ","B7ADOF94ADD","B7ADOF94D ","B7ADOF94HDS","B7ADOF94RDT","B7ADOF94V ", & + "B7ADOF94WVS","B7ADOF95A ","B7ADOF95ADD","B7ADOF95D ","B7ADOF95HDS","B7ADOF95RDT","B7ADOF95V ", & + "B7ADOF95WVS","B7ADOF96A ","B7ADOF96ADD","B7ADOF96D ","B7ADOF96HDS","B7ADOF96RDT","B7ADOF96V ", & + "B7ADOF96WVS","B7ADOF97A ","B7ADOF97ADD","B7ADOF97D ","B7ADOF97HDS","B7ADOF97RDT","B7ADOF97V ", & + "B7ADOF97WVS","B7ADOF98A ","B7ADOF98ADD","B7ADOF98D ","B7ADOF98HDS","B7ADOF98RDT","B7ADOF98V ", & + "B7ADOF98WVS","B7ADOF99A ","B7ADOF99ADD","B7ADOF99D ","B7ADOF99HDS","B7ADOF99RDT","B7ADOF99V ", & + "B7ADOF99WVS","B7ADOF9A ","B7ADOF9ADD ","B7ADOF9D ","B7ADOF9HDS ","B7ADOF9RDT ","B7ADOF9V ", & + "B7ADOF9WVS ","B7HDSFXI ","B7HDSFYI ","B7HDSFZI ","B7HDSMXI ","B7HDSMYI ","B7HDSMZI ", & + "B7HEAVE ","B7PITCH ","B7RAXI ","B7RAYI ","B7RAZI ","B7RDTFXI ","B7RDTFYI ", & + "B7RDTFZI ","B7RDTMXI ","B7RDTMYI ","B7RDTMZI ","B7ROLL ","B7RVXI ","B7RVYI ", & + "B7RVZI ","B7SURGE ","B7SWAY ","B7TAXI ","B7TAYI ","B7TAZI ","B7TVXI ", & + "B7TVYI ","B7TVZI ","B7WVSF1XI ","B7WVSF1YI ","B7WVSF1ZI ","B7WVSF2XI ","B7WVSF2YI ", & + "B7WVSF2ZI ","B7WVSFXI ","B7WVSFYI ","B7WVSFZI ","B7WVSM1XI ","B7WVSM1YI ","B7WVSM1ZI ", & + "B7WVSM2XI ","B7WVSM2YI ","B7WVSM2ZI ","B7WVSMXI ","B7WVSMYI ","B7WVSMZI ","B7YAW ", & + "B8ADDFXI ","B8ADDFYI ","B8ADDFZI ","B8ADDMXI ","B8ADDMYI ","B8ADDMZI ","B8ADOF10A ", & + "B8ADOF10ADD","B8ADOF10D ","B8ADOF10HDS","B8ADOF10RDT","B8ADOF10V ","B8ADOF10WVS","B8ADOF11A ", & + "B8ADOF11ADD","B8ADOF11D ","B8ADOF11HDS","B8ADOF11RDT","B8ADOF11V ","B8ADOF11WVS","B8ADOF12A ", & + "B8ADOF12ADD","B8ADOF12D ","B8ADOF12HDS","B8ADOF12RDT","B8ADOF12V ","B8ADOF12WVS","B8ADOF13A ", & + "B8ADOF13ADD","B8ADOF13D ","B8ADOF13HDS","B8ADOF13RDT","B8ADOF13V ","B8ADOF13WVS","B8ADOF14A ", & + "B8ADOF14ADD","B8ADOF14D ","B8ADOF14HDS","B8ADOF14RDT","B8ADOF14V ","B8ADOF14WVS","B8ADOF15A ", & + "B8ADOF15ADD","B8ADOF15D ","B8ADOF15HDS","B8ADOF15RDT","B8ADOF15V ","B8ADOF15WVS","B8ADOF16A ", & + "B8ADOF16ADD","B8ADOF16D ","B8ADOF16HDS","B8ADOF16RDT","B8ADOF16V ","B8ADOF16WVS","B8ADOF17A ", & + "B8ADOF17ADD","B8ADOF17D ","B8ADOF17HDS","B8ADOF17RDT","B8ADOF17V ","B8ADOF17WVS","B8ADOF18A ", & + "B8ADOF18ADD","B8ADOF18D ","B8ADOF18HDS","B8ADOF18RDT","B8ADOF18V ","B8ADOF18WVS","B8ADOF19A ", & + "B8ADOF19ADD","B8ADOF19D ","B8ADOF19HDS","B8ADOF19RDT","B8ADOF19V ","B8ADOF19WVS","B8ADOF1A ", & + "B8ADOF1ADD ","B8ADOF1D ","B8ADOF1HDS ","B8ADOF1RDT ","B8ADOF1V ","B8ADOF1WVS ","B8ADOF20A ", & + "B8ADOF20ADD","B8ADOF20D ","B8ADOF20HDS","B8ADOF20RDT","B8ADOF20V ","B8ADOF20WVS","B8ADOF21A ", & + "B8ADOF21ADD","B8ADOF21D ","B8ADOF21HDS","B8ADOF21RDT","B8ADOF21V ","B8ADOF21WVS","B8ADOF22A ", & + "B8ADOF22ADD","B8ADOF22D ","B8ADOF22HDS","B8ADOF22RDT","B8ADOF22V ","B8ADOF22WVS","B8ADOF23A ", & + "B8ADOF23ADD","B8ADOF23D ","B8ADOF23HDS","B8ADOF23RDT","B8ADOF23V ","B8ADOF23WVS","B8ADOF24A ", & + "B8ADOF24ADD","B8ADOF24D ","B8ADOF24HDS","B8ADOF24RDT","B8ADOF24V ","B8ADOF24WVS","B8ADOF25A ", & + "B8ADOF25ADD","B8ADOF25D ","B8ADOF25HDS","B8ADOF25RDT","B8ADOF25V ","B8ADOF25WVS","B8ADOF26A ", & + "B8ADOF26ADD","B8ADOF26D ","B8ADOF26HDS","B8ADOF26RDT","B8ADOF26V ","B8ADOF26WVS","B8ADOF27A ", & + "B8ADOF27ADD","B8ADOF27D ","B8ADOF27HDS","B8ADOF27RDT","B8ADOF27V ","B8ADOF27WVS","B8ADOF28A ", & + "B8ADOF28ADD","B8ADOF28D ","B8ADOF28HDS","B8ADOF28RDT","B8ADOF28V ","B8ADOF28WVS","B8ADOF29A ", & + "B8ADOF29ADD","B8ADOF29D ","B8ADOF29HDS","B8ADOF29RDT","B8ADOF29V ","B8ADOF29WVS","B8ADOF2A ", & + "B8ADOF2ADD ","B8ADOF2D ","B8ADOF2HDS ","B8ADOF2RDT ","B8ADOF2V ","B8ADOF2WVS ","B8ADOF30A ", & + "B8ADOF30ADD","B8ADOF30D ","B8ADOF30HDS","B8ADOF30RDT","B8ADOF30V ","B8ADOF30WVS","B8ADOF31A ", & + "B8ADOF31ADD","B8ADOF31D ","B8ADOF31HDS","B8ADOF31RDT","B8ADOF31V ","B8ADOF31WVS","B8ADOF32A ", & + "B8ADOF32ADD","B8ADOF32D ","B8ADOF32HDS","B8ADOF32RDT","B8ADOF32V ","B8ADOF32WVS","B8ADOF33A ", & + "B8ADOF33ADD","B8ADOF33D ","B8ADOF33HDS","B8ADOF33RDT","B8ADOF33V ","B8ADOF33WVS","B8ADOF34A ", & + "B8ADOF34ADD","B8ADOF34D ","B8ADOF34HDS","B8ADOF34RDT","B8ADOF34V ","B8ADOF34WVS","B8ADOF35A ", & + "B8ADOF35ADD","B8ADOF35D ","B8ADOF35HDS","B8ADOF35RDT","B8ADOF35V ","B8ADOF35WVS","B8ADOF36A ", & + "B8ADOF36ADD","B8ADOF36D ","B8ADOF36HDS","B8ADOF36RDT","B8ADOF36V ","B8ADOF36WVS","B8ADOF37A ", & + "B8ADOF37ADD","B8ADOF37D ","B8ADOF37HDS","B8ADOF37RDT","B8ADOF37V ","B8ADOF37WVS","B8ADOF38A ", & + "B8ADOF38ADD","B8ADOF38D ","B8ADOF38HDS","B8ADOF38RDT","B8ADOF38V ","B8ADOF38WVS","B8ADOF39A ", & + "B8ADOF39ADD","B8ADOF39D ","B8ADOF39HDS","B8ADOF39RDT","B8ADOF39V ","B8ADOF39WVS","B8ADOF3A ", & + "B8ADOF3ADD ","B8ADOF3D ","B8ADOF3HDS ","B8ADOF3RDT ","B8ADOF3V ","B8ADOF3WVS ","B8ADOF40A ", & + "B8ADOF40ADD","B8ADOF40D ","B8ADOF40HDS","B8ADOF40RDT","B8ADOF40V ","B8ADOF40WVS","B8ADOF41A ", & + "B8ADOF41ADD","B8ADOF41D ","B8ADOF41HDS","B8ADOF41RDT","B8ADOF41V ","B8ADOF41WVS","B8ADOF42A ", & + "B8ADOF42ADD","B8ADOF42D ","B8ADOF42HDS","B8ADOF42RDT","B8ADOF42V ","B8ADOF42WVS","B8ADOF43A ", & + "B8ADOF43ADD","B8ADOF43D ","B8ADOF43HDS","B8ADOF43RDT","B8ADOF43V ","B8ADOF43WVS","B8ADOF44A ", & + "B8ADOF44ADD","B8ADOF44D ","B8ADOF44HDS","B8ADOF44RDT","B8ADOF44V ","B8ADOF44WVS","B8ADOF45A ", & + "B8ADOF45ADD","B8ADOF45D ","B8ADOF45HDS","B8ADOF45RDT","B8ADOF45V ","B8ADOF45WVS","B8ADOF46A ", & + "B8ADOF46ADD","B8ADOF46D ","B8ADOF46HDS","B8ADOF46RDT","B8ADOF46V ","B8ADOF46WVS","B8ADOF47A ", & + "B8ADOF47ADD","B8ADOF47D ","B8ADOF47HDS","B8ADOF47RDT","B8ADOF47V ","B8ADOF47WVS","B8ADOF48A ", & + "B8ADOF48ADD","B8ADOF48D ","B8ADOF48HDS","B8ADOF48RDT","B8ADOF48V ","B8ADOF48WVS","B8ADOF49A ", & + "B8ADOF49ADD","B8ADOF49D ","B8ADOF49HDS","B8ADOF49RDT","B8ADOF49V ","B8ADOF49WVS","B8ADOF4A ", & + "B8ADOF4ADD ","B8ADOF4D ","B8ADOF4HDS ","B8ADOF4RDT ","B8ADOF4V ","B8ADOF4WVS ","B8ADOF50A ", & + "B8ADOF50ADD","B8ADOF50D ","B8ADOF50HDS","B8ADOF50RDT","B8ADOF50V ","B8ADOF50WVS","B8ADOF51A ", & + "B8ADOF51ADD","B8ADOF51D ","B8ADOF51HDS","B8ADOF51RDT","B8ADOF51V ","B8ADOF51WVS","B8ADOF52A ", & + "B8ADOF52ADD","B8ADOF52D ","B8ADOF52HDS","B8ADOF52RDT","B8ADOF52V ","B8ADOF52WVS","B8ADOF53A ", & + "B8ADOF53ADD","B8ADOF53D ","B8ADOF53HDS","B8ADOF53RDT","B8ADOF53V ","B8ADOF53WVS","B8ADOF54A ", & + "B8ADOF54ADD","B8ADOF54D ","B8ADOF54HDS","B8ADOF54RDT","B8ADOF54V ","B8ADOF54WVS","B8ADOF55A ", & + "B8ADOF55ADD","B8ADOF55D ","B8ADOF55HDS","B8ADOF55RDT","B8ADOF55V ","B8ADOF55WVS","B8ADOF56A ", & + "B8ADOF56ADD","B8ADOF56D ","B8ADOF56HDS","B8ADOF56RDT","B8ADOF56V ","B8ADOF56WVS","B8ADOF57A ", & + "B8ADOF57ADD","B8ADOF57D ","B8ADOF57HDS","B8ADOF57RDT","B8ADOF57V ","B8ADOF57WVS","B8ADOF58A ", & + "B8ADOF58ADD","B8ADOF58D ","B8ADOF58HDS","B8ADOF58RDT","B8ADOF58V ","B8ADOF58WVS","B8ADOF59A ", & + "B8ADOF59ADD","B8ADOF59D ","B8ADOF59HDS","B8ADOF59RDT","B8ADOF59V ","B8ADOF59WVS","B8ADOF5A ", & + "B8ADOF5ADD ","B8ADOF5D ","B8ADOF5HDS ","B8ADOF5RDT ","B8ADOF5V ","B8ADOF5WVS ","B8ADOF60A ", & + "B8ADOF60ADD","B8ADOF60D ","B8ADOF60HDS","B8ADOF60RDT","B8ADOF60V ","B8ADOF60WVS","B8ADOF61A ", & + "B8ADOF61ADD","B8ADOF61D ","B8ADOF61HDS","B8ADOF61RDT","B8ADOF61V ","B8ADOF61WVS","B8ADOF62A ", & + "B8ADOF62ADD","B8ADOF62D ","B8ADOF62HDS","B8ADOF62RDT","B8ADOF62V ","B8ADOF62WVS","B8ADOF63A ", & + "B8ADOF63ADD","B8ADOF63D ","B8ADOF63HDS","B8ADOF63RDT","B8ADOF63V ","B8ADOF63WVS","B8ADOF64A ", & + "B8ADOF64ADD","B8ADOF64D ","B8ADOF64HDS","B8ADOF64RDT","B8ADOF64V ","B8ADOF64WVS","B8ADOF65A ", & + "B8ADOF65ADD","B8ADOF65D ","B8ADOF65HDS","B8ADOF65RDT","B8ADOF65V ","B8ADOF65WVS","B8ADOF66A ", & + "B8ADOF66ADD","B8ADOF66D ","B8ADOF66HDS","B8ADOF66RDT","B8ADOF66V ","B8ADOF66WVS","B8ADOF67A ", & + "B8ADOF67ADD","B8ADOF67D ","B8ADOF67HDS","B8ADOF67RDT","B8ADOF67V ","B8ADOF67WVS","B8ADOF68A ", & + "B8ADOF68ADD","B8ADOF68D ","B8ADOF68HDS","B8ADOF68RDT","B8ADOF68V ","B8ADOF68WVS","B8ADOF69A ", & + "B8ADOF69ADD","B8ADOF69D ","B8ADOF69HDS","B8ADOF69RDT","B8ADOF69V ","B8ADOF69WVS","B8ADOF6A ", & + "B8ADOF6ADD ","B8ADOF6D ","B8ADOF6HDS ","B8ADOF6RDT ","B8ADOF6V ","B8ADOF6WVS ","B8ADOF70A ", & + "B8ADOF70ADD","B8ADOF70D ","B8ADOF70HDS","B8ADOF70RDT","B8ADOF70V ","B8ADOF70WVS","B8ADOF71A ", & + "B8ADOF71ADD","B8ADOF71D ","B8ADOF71HDS","B8ADOF71RDT","B8ADOF71V ","B8ADOF71WVS","B8ADOF72A ", & + "B8ADOF72ADD","B8ADOF72D ","B8ADOF72HDS","B8ADOF72RDT","B8ADOF72V ","B8ADOF72WVS","B8ADOF73A ", & + "B8ADOF73ADD","B8ADOF73D ","B8ADOF73HDS","B8ADOF73RDT","B8ADOF73V ","B8ADOF73WVS","B8ADOF74A ", & + "B8ADOF74ADD","B8ADOF74D ","B8ADOF74HDS","B8ADOF74RDT","B8ADOF74V ","B8ADOF74WVS","B8ADOF75A ", & + "B8ADOF75ADD","B8ADOF75D ","B8ADOF75HDS","B8ADOF75RDT","B8ADOF75V ","B8ADOF75WVS","B8ADOF76A ", & + "B8ADOF76ADD","B8ADOF76D ","B8ADOF76HDS","B8ADOF76RDT","B8ADOF76V ","B8ADOF76WVS","B8ADOF77A ", & + "B8ADOF77ADD","B8ADOF77D ","B8ADOF77HDS","B8ADOF77RDT","B8ADOF77V ","B8ADOF77WVS","B8ADOF78A ", & + "B8ADOF78ADD","B8ADOF78D ","B8ADOF78HDS","B8ADOF78RDT","B8ADOF78V ","B8ADOF78WVS","B8ADOF79A ", & + "B8ADOF79ADD","B8ADOF79D ","B8ADOF79HDS","B8ADOF79RDT","B8ADOF79V ","B8ADOF79WVS","B8ADOF7A ", & + "B8ADOF7ADD ","B8ADOF7D ","B8ADOF7HDS ","B8ADOF7RDT ","B8ADOF7V ","B8ADOF7WVS ","B8ADOF80A ", & + "B8ADOF80ADD","B8ADOF80D ","B8ADOF80HDS","B8ADOF80RDT","B8ADOF80V ","B8ADOF80WVS","B8ADOF81A ", & + "B8ADOF81ADD","B8ADOF81D ","B8ADOF81HDS","B8ADOF81RDT","B8ADOF81V ","B8ADOF81WVS","B8ADOF82A ", & + "B8ADOF82ADD","B8ADOF82D ","B8ADOF82HDS","B8ADOF82RDT","B8ADOF82V ","B8ADOF82WVS","B8ADOF83A ", & + "B8ADOF83ADD","B8ADOF83D ","B8ADOF83HDS","B8ADOF83RDT","B8ADOF83V ","B8ADOF83WVS","B8ADOF84A ", & + "B8ADOF84ADD","B8ADOF84D ","B8ADOF84HDS","B8ADOF84RDT","B8ADOF84V ","B8ADOF84WVS","B8ADOF85A ", & + "B8ADOF85ADD","B8ADOF85D ","B8ADOF85HDS","B8ADOF85RDT","B8ADOF85V ","B8ADOF85WVS","B8ADOF86A ", & + "B8ADOF86ADD","B8ADOF86D ","B8ADOF86HDS","B8ADOF86RDT","B8ADOF86V ","B8ADOF86WVS","B8ADOF87A ", & + "B8ADOF87ADD","B8ADOF87D ","B8ADOF87HDS","B8ADOF87RDT","B8ADOF87V ","B8ADOF87WVS","B8ADOF88A ", & + "B8ADOF88ADD","B8ADOF88D ","B8ADOF88HDS","B8ADOF88RDT","B8ADOF88V ","B8ADOF88WVS","B8ADOF89A ", & + "B8ADOF89ADD","B8ADOF89D ","B8ADOF89HDS","B8ADOF89RDT","B8ADOF89V ","B8ADOF89WVS","B8ADOF8A ", & + "B8ADOF8ADD ","B8ADOF8D ","B8ADOF8HDS ","B8ADOF8RDT ","B8ADOF8V ","B8ADOF8WVS ","B8ADOF90A ", & + "B8ADOF90ADD","B8ADOF90D ","B8ADOF90HDS","B8ADOF90RDT","B8ADOF90V ","B8ADOF90WVS","B8ADOF91A ", & + "B8ADOF91ADD","B8ADOF91D ","B8ADOF91HDS","B8ADOF91RDT","B8ADOF91V ","B8ADOF91WVS","B8ADOF92A ", & + "B8ADOF92ADD","B8ADOF92D ","B8ADOF92HDS","B8ADOF92RDT","B8ADOF92V ","B8ADOF92WVS","B8ADOF93A ", & + "B8ADOF93ADD","B8ADOF93D ","B8ADOF93HDS","B8ADOF93RDT","B8ADOF93V ","B8ADOF93WVS","B8ADOF94A ", & + "B8ADOF94ADD","B8ADOF94D ","B8ADOF94HDS","B8ADOF94RDT","B8ADOF94V ","B8ADOF94WVS","B8ADOF95A ", & + "B8ADOF95ADD","B8ADOF95D ","B8ADOF95HDS","B8ADOF95RDT","B8ADOF95V ","B8ADOF95WVS","B8ADOF96A ", & + "B8ADOF96ADD","B8ADOF96D ","B8ADOF96HDS","B8ADOF96RDT","B8ADOF96V ","B8ADOF96WVS","B8ADOF97A ", & + "B8ADOF97ADD","B8ADOF97D ","B8ADOF97HDS","B8ADOF97RDT","B8ADOF97V ","B8ADOF97WVS","B8ADOF98A ", & + "B8ADOF98ADD","B8ADOF98D ","B8ADOF98HDS","B8ADOF98RDT","B8ADOF98V ","B8ADOF98WVS","B8ADOF99A ", & + "B8ADOF99ADD","B8ADOF99D ","B8ADOF99HDS","B8ADOF99RDT","B8ADOF99V ","B8ADOF99WVS","B8ADOF9A ", & + "B8ADOF9ADD ","B8ADOF9D ","B8ADOF9HDS ","B8ADOF9RDT ","B8ADOF9V ","B8ADOF9WVS ","B8HDSFXI ", & + "B8HDSFYI ","B8HDSFZI ","B8HDSMXI ","B8HDSMYI ","B8HDSMZI ","B8HEAVE ","B8PITCH ", & + "B8RAXI ","B8RAYI ","B8RAZI ","B8RDTFXI ","B8RDTFYI ","B8RDTFZI ","B8RDTMXI ", & + "B8RDTMYI ","B8RDTMZI ","B8ROLL ","B8RVXI ","B8RVYI ","B8RVZI ","B8SURGE ", & + "B8SWAY ","B8TAXI ","B8TAYI ","B8TAZI ","B8TVXI ","B8TVYI ","B8TVZI ", & + "B8WVSF1XI ","B8WVSF1YI ","B8WVSF1ZI ","B8WVSF2XI ","B8WVSF2YI ","B8WVSF2ZI ","B8WVSFXI ", & + "B8WVSFYI ","B8WVSFZI ","B8WVSM1XI ","B8WVSM1YI ","B8WVSM1ZI ","B8WVSM2XI ","B8WVSM2YI ", & + "B8WVSM2ZI ","B8WVSMXI ","B8WVSMYI ","B8WVSMZI ","B8YAW ","B9ADDFXI ","B9ADDFYI ", & + "B9ADDFZI ","B9ADDMXI ","B9ADDMYI ","B9ADDMZI ","B9ADOF10A ","B9ADOF10ADD","B9ADOF10D ", & + "B9ADOF10HDS","B9ADOF10RDT","B9ADOF10V ","B9ADOF10WVS","B9ADOF11A ","B9ADOF11ADD","B9ADOF11D ", & + "B9ADOF11HDS","B9ADOF11RDT","B9ADOF11V ","B9ADOF11WVS","B9ADOF12A ","B9ADOF12ADD","B9ADOF12D ", & + "B9ADOF12HDS","B9ADOF12RDT","B9ADOF12V ","B9ADOF12WVS","B9ADOF13A ","B9ADOF13ADD","B9ADOF13D ", & + "B9ADOF13HDS","B9ADOF13RDT","B9ADOF13V ","B9ADOF13WVS","B9ADOF14A ","B9ADOF14ADD","B9ADOF14D ", & + "B9ADOF14HDS","B9ADOF14RDT","B9ADOF14V ","B9ADOF14WVS","B9ADOF15A ","B9ADOF15ADD","B9ADOF15D ", & + "B9ADOF15HDS","B9ADOF15RDT","B9ADOF15V ","B9ADOF15WVS","B9ADOF16A ","B9ADOF16ADD","B9ADOF16D ", & + "B9ADOF16HDS","B9ADOF16RDT","B9ADOF16V ","B9ADOF16WVS","B9ADOF17A ","B9ADOF17ADD","B9ADOF17D ", & + "B9ADOF17HDS","B9ADOF17RDT","B9ADOF17V ","B9ADOF17WVS","B9ADOF18A ","B9ADOF18ADD","B9ADOF18D ", & + "B9ADOF18HDS","B9ADOF18RDT","B9ADOF18V ","B9ADOF18WVS","B9ADOF19A ","B9ADOF19ADD","B9ADOF19D ", & + "B9ADOF19HDS","B9ADOF19RDT","B9ADOF19V ","B9ADOF19WVS","B9ADOF1A ","B9ADOF1ADD ","B9ADOF1D ", & + "B9ADOF1HDS ","B9ADOF1RDT ","B9ADOF1V ","B9ADOF1WVS ","B9ADOF20A ","B9ADOF20ADD","B9ADOF20D ", & + "B9ADOF20HDS","B9ADOF20RDT","B9ADOF20V ","B9ADOF20WVS","B9ADOF21A ","B9ADOF21ADD","B9ADOF21D ", & + "B9ADOF21HDS","B9ADOF21RDT","B9ADOF21V ","B9ADOF21WVS","B9ADOF22A ","B9ADOF22ADD","B9ADOF22D ", & + "B9ADOF22HDS","B9ADOF22RDT","B9ADOF22V ","B9ADOF22WVS","B9ADOF23A ","B9ADOF23ADD","B9ADOF23D ", & + "B9ADOF23HDS","B9ADOF23RDT","B9ADOF23V ","B9ADOF23WVS","B9ADOF24A ","B9ADOF24ADD","B9ADOF24D ", & + "B9ADOF24HDS","B9ADOF24RDT","B9ADOF24V ","B9ADOF24WVS","B9ADOF25A ","B9ADOF25ADD","B9ADOF25D ", & + "B9ADOF25HDS","B9ADOF25RDT","B9ADOF25V ","B9ADOF25WVS","B9ADOF26A ","B9ADOF26ADD","B9ADOF26D ", & + "B9ADOF26HDS","B9ADOF26RDT","B9ADOF26V ","B9ADOF26WVS","B9ADOF27A ","B9ADOF27ADD","B9ADOF27D ", & + "B9ADOF27HDS","B9ADOF27RDT","B9ADOF27V ","B9ADOF27WVS","B9ADOF28A ","B9ADOF28ADD","B9ADOF28D ", & + "B9ADOF28HDS","B9ADOF28RDT","B9ADOF28V ","B9ADOF28WVS","B9ADOF29A ","B9ADOF29ADD","B9ADOF29D ", & + "B9ADOF29HDS","B9ADOF29RDT","B9ADOF29V ","B9ADOF29WVS","B9ADOF2A ","B9ADOF2ADD ","B9ADOF2D ", & + "B9ADOF2HDS ","B9ADOF2RDT ","B9ADOF2V ","B9ADOF2WVS ","B9ADOF30A ","B9ADOF30ADD","B9ADOF30D ", & + "B9ADOF30HDS","B9ADOF30RDT","B9ADOF30V ","B9ADOF30WVS","B9ADOF31A ","B9ADOF31ADD","B9ADOF31D ", & + "B9ADOF31HDS","B9ADOF31RDT","B9ADOF31V ","B9ADOF31WVS","B9ADOF32A ","B9ADOF32ADD","B9ADOF32D ", & + "B9ADOF32HDS","B9ADOF32RDT","B9ADOF32V ","B9ADOF32WVS","B9ADOF33A ","B9ADOF33ADD","B9ADOF33D ", & + "B9ADOF33HDS","B9ADOF33RDT","B9ADOF33V ","B9ADOF33WVS","B9ADOF34A ","B9ADOF34ADD","B9ADOF34D ", & + "B9ADOF34HDS","B9ADOF34RDT","B9ADOF34V ","B9ADOF34WVS","B9ADOF35A ","B9ADOF35ADD","B9ADOF35D ", & + "B9ADOF35HDS","B9ADOF35RDT","B9ADOF35V ","B9ADOF35WVS","B9ADOF36A ","B9ADOF36ADD","B9ADOF36D ", & + "B9ADOF36HDS","B9ADOF36RDT","B9ADOF36V ","B9ADOF36WVS","B9ADOF37A ","B9ADOF37ADD","B9ADOF37D ", & + "B9ADOF37HDS","B9ADOF37RDT","B9ADOF37V ","B9ADOF37WVS","B9ADOF38A ","B9ADOF38ADD","B9ADOF38D ", & + "B9ADOF38HDS","B9ADOF38RDT","B9ADOF38V ","B9ADOF38WVS","B9ADOF39A ","B9ADOF39ADD","B9ADOF39D ", & + "B9ADOF39HDS","B9ADOF39RDT","B9ADOF39V ","B9ADOF39WVS","B9ADOF3A ","B9ADOF3ADD ","B9ADOF3D ", & + "B9ADOF3HDS ","B9ADOF3RDT ","B9ADOF3V ","B9ADOF3WVS ","B9ADOF40A ","B9ADOF40ADD","B9ADOF40D ", & + "B9ADOF40HDS","B9ADOF40RDT","B9ADOF40V ","B9ADOF40WVS","B9ADOF41A ","B9ADOF41ADD","B9ADOF41D ", & + "B9ADOF41HDS","B9ADOF41RDT","B9ADOF41V ","B9ADOF41WVS","B9ADOF42A ","B9ADOF42ADD","B9ADOF42D ", & + "B9ADOF42HDS","B9ADOF42RDT","B9ADOF42V ","B9ADOF42WVS","B9ADOF43A ","B9ADOF43ADD","B9ADOF43D ", & + "B9ADOF43HDS","B9ADOF43RDT","B9ADOF43V ","B9ADOF43WVS","B9ADOF44A ","B9ADOF44ADD","B9ADOF44D ", & + "B9ADOF44HDS","B9ADOF44RDT","B9ADOF44V ","B9ADOF44WVS","B9ADOF45A ","B9ADOF45ADD","B9ADOF45D ", & + "B9ADOF45HDS","B9ADOF45RDT","B9ADOF45V ","B9ADOF45WVS","B9ADOF46A ","B9ADOF46ADD","B9ADOF46D ", & + "B9ADOF46HDS","B9ADOF46RDT","B9ADOF46V ","B9ADOF46WVS","B9ADOF47A ","B9ADOF47ADD","B9ADOF47D ", & + "B9ADOF47HDS","B9ADOF47RDT","B9ADOF47V ","B9ADOF47WVS","B9ADOF48A ","B9ADOF48ADD","B9ADOF48D ", & + "B9ADOF48HDS","B9ADOF48RDT","B9ADOF48V ","B9ADOF48WVS","B9ADOF49A ","B9ADOF49ADD","B9ADOF49D ", & + "B9ADOF49HDS","B9ADOF49RDT","B9ADOF49V ","B9ADOF49WVS","B9ADOF4A ","B9ADOF4ADD ","B9ADOF4D ", & + "B9ADOF4HDS ","B9ADOF4RDT ","B9ADOF4V ","B9ADOF4WVS ","B9ADOF50A ","B9ADOF50ADD","B9ADOF50D ", & + "B9ADOF50HDS","B9ADOF50RDT","B9ADOF50V ","B9ADOF50WVS","B9ADOF51A ","B9ADOF51ADD","B9ADOF51D ", & + "B9ADOF51HDS","B9ADOF51RDT","B9ADOF51V ","B9ADOF51WVS","B9ADOF52A ","B9ADOF52ADD","B9ADOF52D ", & + "B9ADOF52HDS","B9ADOF52RDT","B9ADOF52V ","B9ADOF52WVS","B9ADOF53A ","B9ADOF53ADD","B9ADOF53D ", & + "B9ADOF53HDS","B9ADOF53RDT","B9ADOF53V ","B9ADOF53WVS","B9ADOF54A ","B9ADOF54ADD","B9ADOF54D ", & + "B9ADOF54HDS","B9ADOF54RDT","B9ADOF54V ","B9ADOF54WVS","B9ADOF55A ","B9ADOF55ADD","B9ADOF55D ", & + "B9ADOF55HDS","B9ADOF55RDT","B9ADOF55V ","B9ADOF55WVS","B9ADOF56A ","B9ADOF56ADD","B9ADOF56D ", & + "B9ADOF56HDS","B9ADOF56RDT","B9ADOF56V ","B9ADOF56WVS","B9ADOF57A ","B9ADOF57ADD","B9ADOF57D ", & + "B9ADOF57HDS","B9ADOF57RDT","B9ADOF57V ","B9ADOF57WVS","B9ADOF58A ","B9ADOF58ADD","B9ADOF58D ", & + "B9ADOF58HDS","B9ADOF58RDT","B9ADOF58V ","B9ADOF58WVS","B9ADOF59A ","B9ADOF59ADD","B9ADOF59D ", & + "B9ADOF59HDS","B9ADOF59RDT","B9ADOF59V ","B9ADOF59WVS","B9ADOF5A ","B9ADOF5ADD ","B9ADOF5D ", & + "B9ADOF5HDS ","B9ADOF5RDT ","B9ADOF5V ","B9ADOF5WVS ","B9ADOF60A ","B9ADOF60ADD","B9ADOF60D ", & + "B9ADOF60HDS","B9ADOF60RDT","B9ADOF60V ","B9ADOF60WVS","B9ADOF61A ","B9ADOF61ADD","B9ADOF61D ", & + "B9ADOF61HDS","B9ADOF61RDT","B9ADOF61V ","B9ADOF61WVS","B9ADOF62A ","B9ADOF62ADD","B9ADOF62D ", & + "B9ADOF62HDS","B9ADOF62RDT","B9ADOF62V ","B9ADOF62WVS","B9ADOF63A ","B9ADOF63ADD","B9ADOF63D ", & + "B9ADOF63HDS","B9ADOF63RDT","B9ADOF63V ","B9ADOF63WVS","B9ADOF64A ","B9ADOF64ADD","B9ADOF64D ", & + "B9ADOF64HDS","B9ADOF64RDT","B9ADOF64V ","B9ADOF64WVS","B9ADOF65A ","B9ADOF65ADD","B9ADOF65D ", & + "B9ADOF65HDS","B9ADOF65RDT","B9ADOF65V ","B9ADOF65WVS","B9ADOF66A ","B9ADOF66ADD","B9ADOF66D ", & + "B9ADOF66HDS","B9ADOF66RDT","B9ADOF66V ","B9ADOF66WVS","B9ADOF67A ","B9ADOF67ADD","B9ADOF67D ", & + "B9ADOF67HDS","B9ADOF67RDT","B9ADOF67V ","B9ADOF67WVS","B9ADOF68A ","B9ADOF68ADD","B9ADOF68D ", & + "B9ADOF68HDS","B9ADOF68RDT","B9ADOF68V ","B9ADOF68WVS","B9ADOF69A ","B9ADOF69ADD","B9ADOF69D ", & + "B9ADOF69HDS","B9ADOF69RDT","B9ADOF69V ","B9ADOF69WVS","B9ADOF6A ","B9ADOF6ADD ","B9ADOF6D ", & + "B9ADOF6HDS ","B9ADOF6RDT ","B9ADOF6V ","B9ADOF6WVS ","B9ADOF70A ","B9ADOF70ADD","B9ADOF70D ", & + "B9ADOF70HDS","B9ADOF70RDT","B9ADOF70V ","B9ADOF70WVS","B9ADOF71A ","B9ADOF71ADD","B9ADOF71D ", & + "B9ADOF71HDS","B9ADOF71RDT","B9ADOF71V ","B9ADOF71WVS","B9ADOF72A ","B9ADOF72ADD","B9ADOF72D ", & + "B9ADOF72HDS","B9ADOF72RDT","B9ADOF72V ","B9ADOF72WVS","B9ADOF73A ","B9ADOF73ADD","B9ADOF73D ", & + "B9ADOF73HDS","B9ADOF73RDT","B9ADOF73V ","B9ADOF73WVS","B9ADOF74A ","B9ADOF74ADD","B9ADOF74D ", & + "B9ADOF74HDS","B9ADOF74RDT","B9ADOF74V ","B9ADOF74WVS","B9ADOF75A ","B9ADOF75ADD","B9ADOF75D ", & + "B9ADOF75HDS","B9ADOF75RDT","B9ADOF75V ","B9ADOF75WVS","B9ADOF76A ","B9ADOF76ADD","B9ADOF76D ", & + "B9ADOF76HDS","B9ADOF76RDT","B9ADOF76V ","B9ADOF76WVS","B9ADOF77A ","B9ADOF77ADD","B9ADOF77D ", & + "B9ADOF77HDS","B9ADOF77RDT","B9ADOF77V ","B9ADOF77WVS","B9ADOF78A ","B9ADOF78ADD","B9ADOF78D ", & + "B9ADOF78HDS","B9ADOF78RDT","B9ADOF78V ","B9ADOF78WVS","B9ADOF79A ","B9ADOF79ADD","B9ADOF79D ", & + "B9ADOF79HDS","B9ADOF79RDT","B9ADOF79V ","B9ADOF79WVS","B9ADOF7A ","B9ADOF7ADD ","B9ADOF7D ", & + "B9ADOF7HDS ","B9ADOF7RDT ","B9ADOF7V ","B9ADOF7WVS ","B9ADOF80A ","B9ADOF80ADD","B9ADOF80D ", & + "B9ADOF80HDS","B9ADOF80RDT","B9ADOF80V ","B9ADOF80WVS","B9ADOF81A ","B9ADOF81ADD","B9ADOF81D ", & + "B9ADOF81HDS","B9ADOF81RDT","B9ADOF81V ","B9ADOF81WVS","B9ADOF82A ","B9ADOF82ADD","B9ADOF82D ", & + "B9ADOF82HDS","B9ADOF82RDT","B9ADOF82V ","B9ADOF82WVS","B9ADOF83A ","B9ADOF83ADD","B9ADOF83D ", & + "B9ADOF83HDS","B9ADOF83RDT","B9ADOF83V ","B9ADOF83WVS","B9ADOF84A ","B9ADOF84ADD","B9ADOF84D ", & + "B9ADOF84HDS","B9ADOF84RDT","B9ADOF84V ","B9ADOF84WVS","B9ADOF85A ","B9ADOF85ADD","B9ADOF85D ", & + "B9ADOF85HDS","B9ADOF85RDT","B9ADOF85V ","B9ADOF85WVS","B9ADOF86A ","B9ADOF86ADD","B9ADOF86D ", & + "B9ADOF86HDS","B9ADOF86RDT","B9ADOF86V ","B9ADOF86WVS","B9ADOF87A ","B9ADOF87ADD","B9ADOF87D ", & + "B9ADOF87HDS","B9ADOF87RDT","B9ADOF87V ","B9ADOF87WVS","B9ADOF88A ","B9ADOF88ADD","B9ADOF88D ", & + "B9ADOF88HDS","B9ADOF88RDT","B9ADOF88V ","B9ADOF88WVS","B9ADOF89A ","B9ADOF89ADD","B9ADOF89D ", & + "B9ADOF89HDS","B9ADOF89RDT","B9ADOF89V ","B9ADOF89WVS","B9ADOF8A ","B9ADOF8ADD ","B9ADOF8D ", & + "B9ADOF8HDS ","B9ADOF8RDT ","B9ADOF8V ","B9ADOF8WVS ","B9ADOF90A ","B9ADOF90ADD","B9ADOF90D ", & + "B9ADOF90HDS","B9ADOF90RDT","B9ADOF90V ","B9ADOF90WVS","B9ADOF91A ","B9ADOF91ADD","B9ADOF91D ", & + "B9ADOF91HDS","B9ADOF91RDT","B9ADOF91V ","B9ADOF91WVS","B9ADOF92A ","B9ADOF92ADD","B9ADOF92D ", & + "B9ADOF92HDS","B9ADOF92RDT","B9ADOF92V ","B9ADOF92WVS","B9ADOF93A ","B9ADOF93ADD","B9ADOF93D ", & + "B9ADOF93HDS","B9ADOF93RDT","B9ADOF93V ","B9ADOF93WVS","B9ADOF94A ","B9ADOF94ADD","B9ADOF94D ", & + "B9ADOF94HDS","B9ADOF94RDT","B9ADOF94V ","B9ADOF94WVS","B9ADOF95A ","B9ADOF95ADD","B9ADOF95D ", & + "B9ADOF95HDS","B9ADOF95RDT","B9ADOF95V ","B9ADOF95WVS","B9ADOF96A ","B9ADOF96ADD","B9ADOF96D ", & + "B9ADOF96HDS","B9ADOF96RDT","B9ADOF96V ","B9ADOF96WVS","B9ADOF97A ","B9ADOF97ADD","B9ADOF97D ", & + "B9ADOF97HDS","B9ADOF97RDT","B9ADOF97V ","B9ADOF97WVS","B9ADOF98A ","B9ADOF98ADD","B9ADOF98D ", & + "B9ADOF98HDS","B9ADOF98RDT","B9ADOF98V ","B9ADOF98WVS","B9ADOF99A ","B9ADOF99ADD","B9ADOF99D ", & + "B9ADOF99HDS","B9ADOF99RDT","B9ADOF99V ","B9ADOF99WVS","B9ADOF9A ","B9ADOF9ADD ","B9ADOF9D ", & + "B9ADOF9HDS ","B9ADOF9RDT ","B9ADOF9V ","B9ADOF9WVS ","B9HDSFXI ","B9HDSFYI ","B9HDSFZI ", & + "B9HDSMXI ","B9HDSMYI ","B9HDSMZI ","B9HEAVE ","B9PITCH ","B9RAXI ","B9RAYI ", & + "B9RAZI ","B9RDTFXI ","B9RDTFYI ","B9RDTFZI ","B9RDTMXI ","B9RDTMYI ","B9RDTMZI ", & + "B9ROLL ","B9RVXI ","B9RVYI ","B9RVZI ","B9SURGE ","B9SWAY ","B9TAXI ", & + "B9TAYI ","B9TAZI ","B9TVXI ","B9TVYI ","B9TVZI ","B9WVSF1XI ","B9WVSF1YI ", & + "B9WVSF1ZI ","B9WVSF2XI ","B9WVSF2YI ","B9WVSF2ZI ","B9WVSFXI ","B9WVSFYI ","B9WVSFZI ", & + "B9WVSM1XI ","B9WVSM1YI ","B9WVSM1ZI ","B9WVSM2XI ","B9WVSM2YI ","B9WVSM2ZI ","B9WVSMXI ", & + "B9WVSMYI ","B9WVSMZI ","B9YAW ","HYDROFXI ","HYDROFYI ","HYDROFZI ","HYDROMXI ", & + "HYDROMYI ","HYDROMZI ","PRPHEAVE ","PRPPITCH ","PRPRAXI ","PRPRAYI ","PRPRAZI ", & + "PRPROLL ","PRPRVXI ","PRPRVYI ","PRPRVZI ","PRPSURGE ","PRPSWAY ","PRPTAXI ", & + "PRPTAYI ","PRPTAZI ","PRPTVXI ","PRPTVYI ","PRPTVZI ","PRPYAW "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(6747) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + ValidParamAry1, ValidParamAry2, ValidParamAry3, ValidParamAry4/) ! ..... Public Subroutines ................................................................................................... PUBLIC :: HDOut_CloseSum @@ -833,7 +8676,7 @@ SUBROUTINE HDOut_MapOutputs( p, y, m_WAMIT, m_WAMIT2, F_Add, F_Waves, F_Hydro, P INTEGER(IntKi), INTENT( OUT ) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None - INTEGER :: i, iBody, startIndx, endIndx + INTEGER :: i, iBody, startIndx, endIndx, NAddDOFOut integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 real(ReKi) :: rotdisp(3) @@ -845,8 +8688,6 @@ SUBROUTINE HDOut_MapOutputs( p, y, m_WAMIT, m_WAMIT2, F_Add, F_Waves, F_Hydro, P ! Initialize all unused channels to zero (in case they don't get set, but are still requested) AllOuts = 0.0_ReKi - ! rotdisp = GetRotAngs ( PtfmRefY, PRPMesh%Orientation(:,:,1), ErrStat2, ErrMsg2 ) - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'HDOut_MapOutputs' ) rotdisp = EulerExtractZYX(PRPMesh%Orientation(:,:,1)) AllOuts(PRPMotions) = reshape((/real(PRPMesh%TranslationDisp(:,1),ReKi),rotdisp(:)/),(/6/)) AllOuts(PRPVel) = reshape((/PRPMesh%TranslationVel(:,1),PRPMesh%RotationVel(:,1)/),(/6/)) @@ -855,36 +8696,58 @@ SUBROUTINE HDOut_MapOutputs( p, y, m_WAMIT, m_WAMIT2, F_Add, F_Waves, F_Hydro, P ! Need to use individual components of force for output reporting, the y%mesh data has total forces from all contributions if ( p%potMod == 1 ) then if ( p%NBodyMod == 1 .or. p%NBody == 1 ) then - do iBody = 1,min(p%NBody,9) ! Can only output the first 9 bodies for now - startIndx = 6*(iBody-1) + 1 - endIndx = startIndx + 5 + do iBody = 1,min(p%NBody,9) ! Can only output the first 9 bodies for now; rigid-body modes only for now + startIndx = p%BDOFStrt(iBody) + endIndx = p%BDOFStrt(iBody) + 5 AllOuts(FWaves1 (:,iBody)) = m_WAMIT(1)%F_Waves1(startIndx:endIndx) AllOuts(FHdrSttc (:,iBody)) = m_WAMIT(1)%F_HS(startIndx:endIndx) AllOuts(FRdtn (:,iBody)) = m_WAMIT(1)%F_Rdtn(startIndx:endIndx) + m_WAMIT(1)%F_PtfmAM(startIndx:endIndx) - if (p%WAMIT2used) AllOuts(FWaves2 (:,iBody)) = m_WAMIT2(1)%F_Waves2(startIndx:endIndx) ! These are reported by the WAMIT2 module + if (p%WAMIT2used) AllOuts(FWaves2 (:,iBody)) = m_WAMIT2(1)%F_Waves2(6*(iBody-1)+1:6*(iBody-1)+6) ! These are reported by the WAMIT2 module AllOuts(FAdd (:,iBody)) = F_Add(startIndx:endIndx) AllOuts(FWavesTot(:,iBody)) = F_Waves(startIndx:endIndx) AllOuts(WBMotions(:,iBody)) = q(startIndx:endIndx) AllOuts(WBVel (:,iBody)) = qdot(startIndx:endIndx) - AllOuts(WBAcc (:,iBody)) = qdotdot(startIndx:endIndx) + AllOuts(WBAcc (:,iBody)) = qdotdot(startIndx:endIndx) + if ( p%NAddDOF(iBody) > 0_IntKi ) then + NAddDOFOut = min( p%NAddDOF(iBody) , 99_IntKi ) + startIndx = p%BDOFStrt(iBody) + 6 + endIndx = p%BDOFStrt(iBody) + 5 + NAddDOFOut + AllOuts(FADOFWvs(1:NAddDOFOut,iBody)) = m_WAMIT(1)%F_Waves1(startIndx:endIndx) + AllOuts(FADOFHds(1:NAddDOFOut,iBody)) = m_WAMIT(1)%F_HS(startIndx:endIndx) + AllOuts(FADOFRdt(1:NAddDOFOut,iBody)) = m_WAMIT(1)%F_Rdtn(startIndx:endIndx) + m_WAMIT(1)%F_PtfmAM(startIndx:endIndx) + AllOuts(FADOFAdd(1:NAddDOFOut,iBody)) = F_Add(startIndx:endIndx) + AllOuts( ADOFDsp(1:NAddDOFOut,iBody)) = q (startIndx:endIndx) + AllOuts( ADOFVel(1:NAddDOFOut,iBody)) = qdot (startIndx:endIndx) + AllOuts( ADOFAcc(1:NAddDOFOut,iBody)) = qdotdot(startIndx:endIndx) + end if end do else - ! This happens when NBodyMod > 1, in which case, each WAMIT object is for a single body, but there may be multiple bodies in the HydroDyn model, ! so we need to use BodyID to determine the index into the complete HydroDyn list of WAMIT bodies - - do iBody = 1,min(p%NBody,9) ! Can only output the first 9 bodies for now - startIndx = 6*(iBody-1) + 1 - endIndx = startIndx + 5 - AllOuts(FWaves1 (:,iBody)) = m_WAMIT(iBody)%F_Waves1 - AllOuts(FHdrSttc (:,iBody)) = m_WAMIT(iBody)%F_HS - AllOuts(FRdtn (:,iBody)) = m_WAMIT(iBody)%F_Rdtn + m_WAMIT(iBody)%F_PtfmAM + do iBody = 1,min(p%NBody,9) ! Can only output the first 9 bodies for now; rigid-body modes only for now + startIndx = p%BDOFStrt(iBody) + endIndx = p%BDOFStrt(iBody) + 5 + AllOuts(FWaves1 (:,iBody)) = m_WAMIT(iBody)%F_Waves1(1:6) + AllOuts(FHdrSttc (:,iBody)) = m_WAMIT(iBody)%F_HS(1:6) + AllOuts(FRdtn (:,iBody)) = m_WAMIT(iBody)%F_Rdtn(1:6) + m_WAMIT(iBody)%F_PtfmAM(1:6) if (p%WAMIT2used) AllOuts(FWaves2 (:,iBody)) = m_WAMIT2(iBody)%F_Waves2 AllOuts(FAdd (:,iBody)) = F_Add(startIndx:endIndx) AllOuts(FWavesTot(:,iBody)) = F_Waves(startIndx:endIndx) AllOuts(WBMotions(:,iBody)) = q(startIndx:endIndx) AllOuts(WBVel (:,iBody)) = qdot(startIndx:endIndx) - AllOuts(WBAcc (:,iBody)) = qdotdot(startIndx:endIndx) + AllOuts(WBAcc (:,iBody)) = qdotdot(startIndx:endIndx) + if ( p%WAMIT(iBody)%NAddDOF(1) > 0_IntKi ) then + NAddDOFOut = min( p%WAMIT(iBody)%NAddDOF(1) , 99_IntKi ) + AllOuts(FADOFWvs(1:NAddDOFOut,iBody)) = m_WAMIT(iBody)%F_Waves1(7:6+NAddDOFOut) + AllOuts(FADOFHds(1:NAddDOFOut,iBody)) = m_WAMIT(iBody)%F_HS(7:6+NAddDOFOut) + AllOuts(FADOFRdt(1:NAddDOFOut,iBody)) = m_WAMIT(iBody)%F_Rdtn(7:6+NAddDOFOut) + m_WAMIT(iBody)%F_PtfmAM(7:6+NAddDOFOut) + AllOuts(FADOFAdd(1:NAddDOFOut,iBody)) = F_Add(endIndx+1:endIndx+NAddDOFOut) + startIndx = p%BDOFStrt(iBody) + 6 + endIndx = p%BDOFStrt(iBody) + 5 + NAddDOFOut + AllOuts( ADOFDsp(1:NAddDOFOut,iBody)) = q (startIndx:endIndx) + AllOuts( ADOFVel(1:NAddDOFOut,iBody)) = qdot (startIndx:endIndx) + AllOuts( ADOFAcc(1:NAddDOFOut,iBody)) = qdotdot(startIndx:endIndx) + end if end do end if end if @@ -1281,136 +9144,1947 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) LOGICAL :: InvalidOutput(0:MaxOutPts) ! This array determines if the output channel is valid for this configuration CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" - INTEGER(IntKi), PARAMETER :: ParamIndxAry(510) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - B1AddFxi , B1AddFyi , B1AddFzi , B1AddMxi , B1AddMyi , B1AddMzi , B1HdSFxi , B1HdSFyi , & - B1HdSFzi , B1HdSMxi , B1HdSMyi , B1HdSMzi , B1Heave , B1Pitch , B1RAxi , B1RAyi , & - B1RAzi , B1RdtFxi , B1RdtFyi , B1RdtFzi , B1RdtMxi , B1RdtMyi , B1RdtMzi , B1Roll , & - B1RVxi , B1RVyi , B1RVzi , B1Surge , B1Sway , B1TAxi , B1TAyi , B1TAzi , & - B1TVxi , B1TVyi , B1TVzi , B1WvsF1xi , B1WvsF1yi , B1WvsF1zi , B1WvsF2xi , B1WvsF2yi , & - B1WvsF2zi , B1WvsFxi , B1WvsFyi , B1WvsFzi , B1WvsM1xi , B1WvsM1yi , B1WvsM1zi , B1WvsM2xi , & - B1WvsM2yi , B1WvsM2zi , B1WvsMxi , B1WvsMyi , B1WvsMzi , B1Yaw , B2AddFxi , B2AddFyi , & - B2AddFzi , B2AddMxi , B2AddMyi , B2AddMzi , B2HdSFxi , B2HdSFyi , B2HdSFzi , B2HdSMxi , & - B2HdSMyi , B2HdSMzi , B2Heave , B2Pitch , B2RAxi , B2RAyi , B2RAzi , B2RdtFxi , & - B2RdtFyi , B2RdtFzi , B2RdtMxi , B2RdtMyi , B2RdtMzi , B2Roll , B2RVxi , B2RVyi , & - B2RVzi , B2Surge , B2Sway , B2TAxi , B2TAyi , B2TAzi , B2TVxi , B2TVyi , & - B2TVzi , B2WvsF1xi , B2WvsF1yi , B2WvsF1zi , B2WvsF2xi , B2WvsF2yi , B2WvsF2zi , B2WvsFxi , & - B2WvsFyi , B2WvsFzi , B2WvsM1xi , B2WvsM1yi , B2WvsM1zi , B2WvsM2xi , B2WvsM2yi , B2WvsM2zi , & - B2WvsMxi , B2WvsMyi , B2WvsMzi , B2Yaw , B3AddFxi , B3AddFyi , B3AddFzi , B3AddMxi , & - B3AddMyi , B3AddMzi , B3HdSFxi , B3HdSFyi , B3HdSFzi , B3HdSMxi , B3HdSMyi , B3HdSMzi , & - B3Heave , B3Pitch , B3RAxi , B3RAyi , B3RAzi , B3RdtFxi , B3RdtFyi , B3RdtFzi , & - B3RdtMxi , B3RdtMyi , B3RdtMzi , B3Roll , B3RVxi , B3RVyi , B3RVzi , B3Surge , & - B3Sway , B3TAxi , B3TAyi , B3TAzi , B3TVxi , B3TVyi , B3TVzi , B3WvsF1xi , & - B3WvsF1yi , B3WvsF1zi , B3WvsF2xi , B3WvsF2yi , B3WvsF2zi , B3WvsFxi , B3WvsFyi , B3WvsFzi , & - B3WvsM1xi , B3WvsM1yi , B3WvsM1zi , B3WvsM2xi , B3WvsM2yi , B3WvsM2zi , B3WvsMxi , B3WvsMyi , & - B3WvsMzi , B3Yaw , B4AddFxi , B4AddFyi , B4AddFzi , B4AddMxi , B4AddMyi , B4AddMzi , & - B4HdSFxi , B4HdSFyi , B4HdSFzi , B4HdSMxi , B4HdSMyi , B4HdSMzi , B4Heave , B4Pitch , & - B4RAxi , B4RAyi , B4RAzi , B4RdtFxi , B4RdtFyi , B4RdtFzi , B4RdtMxi , B4RdtMyi , & - B4RdtMzi , B4Roll , B4RVxi , B4RVyi , B4RVzi , B4Surge , B4Sway , B4TAxi , & - B4TAyi , B4TAzi , B4TVxi , B4TVyi , B4TVzi , B4WvsF1xi , B4WvsF1yi , B4WvsF1zi , & - B4WvsF2xi , B4WvsF2yi , B4WvsF2zi , B4WvsFxi , B4WvsFyi , B4WvsFzi , B4WvsM1xi , B4WvsM1yi , & - B4WvsM1zi , B4WvsM2xi , B4WvsM2yi , B4WvsM2zi , B4WvsMxi , B4WvsMyi , B4WvsMzi , B4Yaw , & - B5AddFxi , B5AddFyi , B5AddFzi , B5AddMxi , B5AddMyi , B5AddMzi , B5HdSFxi , B5HdSFyi , & - B5HdSFzi , B5HdSMxi , B5HdSMyi , B5HdSMzi , B5Heave , B5Pitch , B5RAxi , B5RAyi , & - B5RAzi , B5RdtFxi , B5RdtFyi , B5RdtFzi , B5RdtMxi , B5RdtMyi , B5RdtMzi , B5Roll , & - B5RVxi , B5RVyi , B5RVzi , B5Surge , B5Sway , B5TAxi , B5TAyi , B5TAzi , & - B5TVxi , B5TVyi , B5TVzi , B5WvsF1xi , B5WvsF1yi , B5WvsF1zi , B5WvsF2xi , B5WvsF2yi , & - B5WvsF2zi , B5WvsFxi , B5WvsFyi , B5WvsFzi , B5WvsM1xi , B5WvsM1yi , B5WvsM1zi , B5WvsM2xi , & - B5WvsM2yi , B5WvsM2zi , B5WvsMxi , B5WvsMyi , B5WvsMzi , B5Yaw , B6AddFxi , B6AddFyi , & - B6AddFzi , B6AddMxi , B6AddMyi , B6AddMzi , B6HdSFxi , B6HdSFyi , B6HdSFzi , B6HdSMxi , & - B6HdSMyi , B6HdSMzi , B6Heave , B6Pitch , B6RAxi , B6RAyi , B6RAzi , B6RdtFxi , & - B6RdtFyi , B6RdtFzi , B6RdtMxi , B6RdtMyi , B6RdtMzi , B6Roll , B6RVxi , B6RVyi , & - B6RVzi , B6Surge , B6Sway , B6TAxi , B6TAyi , B6TAzi , B6TVxi , B6TVyi , & - B6TVzi , B6WvsF1xi , B6WvsF1yi , B6WvsF1zi , B6WvsF2xi , B6WvsF2yi , B6WvsF2zi , B6WvsFxi , & - B6WvsFyi , B6WvsFzi , B6WvsM1xi , B6WvsM1yi , B6WvsM1zi , B6WvsM2xi , B6WvsM2yi , B6WvsM2zi , & - B6WvsMxi , B6WvsMyi , B6WvsMzi , B6Yaw , B7AddFxi , B7AddFyi , B7AddFzi , B7AddMxi , & - B7AddMyi , B7AddMzi , B7HdSFxi , B7HdSFyi , B7HdSFzi , B7HdSMxi , B7HdSMyi , B7HdSMzi , & - B7Heave , B7Pitch , B7RAxi , B7RAyi , B7RAzi , B7RdtFxi , B7RdtFyi , B7RdtFzi , & - B7RdtMxi , B7RdtMyi , B7RdtMzi , B7Roll , B7RVxi , B7RVyi , B7RVzi , B7Surge , & - B7Sway , B7TAxi , B7TAyi , B7TAzi , B7TVxi , B7TVyi , B7TVzi , B7WvsF1xi , & - B7WvsF1yi , B7WvsF1zi , B7WvsF2xi , B7WvsF2yi , B7WvsF2zi , B7WvsFxi , B7WvsFyi , B7WvsFzi , & - B7WvsM1xi , B7WvsM1yi , B7WvsM1zi , B7WvsM2xi , B7WvsM2yi , B7WvsM2zi , B7WvsMxi , B7WvsMyi , & - B7WvsMzi , B7Yaw , B8AddFxi , B8AddFyi , B8AddFzi , B8AddMxi , B8AddMyi , B8AddMzi , & - B8HdSFxi , B8HdSFyi , B8HdSFzi , B8HdSMxi , B8HdSMyi , B8HdSMzi , B8Heave , B8Pitch , & - B8RAxi , B8RAyi , B8RAzi , B8RdtFxi , B8RdtFyi , B8RdtFzi , B8RdtMxi , B8RdtMyi , & - B8RdtMzi , B8Roll , B8RVxi , B8RVyi , B8RVzi , B8Surge , B8Sway , B8TAxi , & - B8TAyi , B8TAzi , B8TVxi , B8TVyi , B8TVzi , B8WvsF1xi , B8WvsF1yi , B8WvsF1zi , & - B8WvsF2xi , B8WvsF2yi , B8WvsF2zi , B8WvsFxi , B8WvsFyi , B8WvsFzi , B8WvsM1xi , B8WvsM1yi , & - B8WvsM1zi , B8WvsM2xi , B8WvsM2yi , B8WvsM2zi , B8WvsMxi , B8WvsMyi , B8WvsMzi , B8Yaw , & - B9AddFxi , B9AddFyi , B9AddFzi , B9AddMxi , B9AddMyi , B9AddMzi , B9HdSFxi , B9HdSFyi , & - B9HdSFzi , B9HdSMxi , B9HdSMyi , B9HdSMzi , B9Heave , B9Pitch , B9RAxi , B9RAyi , & - B9RAzi , B9RdtFxi , B9RdtFyi , B9RdtFzi , B9RdtMxi , B9RdtMyi , B9RdtMzi , B9Roll , & - B9RVxi , B9RVyi , B9RVzi , B9Surge , B9Sway , B9TAxi , B9TAyi , B9TAzi , & - B9TVxi , B9TVyi , B9TVzi , B9WvsF1xi , B9WvsF1yi , B9WvsF1zi , B9WvsF2xi , B9WvsF2yi , & - B9WvsF2zi , B9WvsFxi , B9WvsFyi , B9WvsFzi , B9WvsM1xi , B9WvsM1yi , B9WvsM1zi , B9WvsM2xi , & - B9WvsM2yi , B9WvsM2zi , B9WvsMxi , B9WvsMyi , B9WvsMzi , B9Yaw , HydroFxi , HydroFyi , & - HydroFzi , HydroMxi , HydroMyi , HydroMzi , PRPHeave , PRPPitch , PRPRAxi , PRPRAyi , & - PRPRAzi , PRPRoll , PRPRVxi , PRPRVyi , PRPRVzi , PRPSurge , PRPSway , PRPTAxi , & - PRPTAyi , PRPTAzi , PRPTVxi , PRPTVyi , PRPTVzi , PRPYaw /) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(510) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(rad) ", & - "(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ","(N) ","(N-m) ", & - "(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(rad/s) ","(rad/s) ", & - "(rad/s) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ","(N) ","(N) ","(N-m) ", & - "(N-m) ","(N-m) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & - "(m) ","(rad) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ","(N) ","(N) ", & - "(N-m) ","(N-m) ","(N-m) ","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ", & - "(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(rad) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & - "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & - "(N-m) ","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ", & - "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(rad) ", & - "(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ","(N) ","(N-m) ", & - "(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(rad/s) ","(rad/s) ", & - "(rad/s) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & - "(m/s) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ","(N) ","(N) ","(N-m) ", & - "(N-m) ","(N-m) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & - "(m) ","(rad) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ","(N) ","(N) ", & - "(N-m) ","(N-m) ","(N-m) ","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ", & - "(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(rad) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & - "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & - "(N-m) ","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ", & - "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(rad) ", & - "(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m/s) ","(m/s) ","(m/s) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ","(N) ", & - "(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ", & + INTEGER(IntKi), PARAMETER :: ParamIndxAry1(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + B1AddFxi , B1AddFyi , B1AddFzi , B1AddMxi , B1AddMyi , B1AddMzi , B1ADOF10A , & + B1ADOF10Add , B1ADOF10D , B1ADOF10Hds , B1ADOF10Rdt , B1ADOF10V , B1ADOF10Wvs , B1ADOF11A , & + B1ADOF11Add , B1ADOF11D , B1ADOF11Hds , B1ADOF11Rdt , B1ADOF11V , B1ADOF11Wvs , B1ADOF12A , & + B1ADOF12Add , B1ADOF12D , B1ADOF12Hds , B1ADOF12Rdt , B1ADOF12V , B1ADOF12Wvs , B1ADOF13A , & + B1ADOF13Add , B1ADOF13D , B1ADOF13Hds , B1ADOF13Rdt , B1ADOF13V , B1ADOF13Wvs , B1ADOF14A , & + B1ADOF14Add , B1ADOF14D , B1ADOF14Hds , B1ADOF14Rdt , B1ADOF14V , B1ADOF14Wvs , B1ADOF15A , & + B1ADOF15Add , B1ADOF15D , B1ADOF15Hds , B1ADOF15Rdt , B1ADOF15V , B1ADOF15Wvs , B1ADOF16A , & + B1ADOF16Add , B1ADOF16D , B1ADOF16Hds , B1ADOF16Rdt , B1ADOF16V , B1ADOF16Wvs , B1ADOF17A , & + B1ADOF17Add , B1ADOF17D , B1ADOF17Hds , B1ADOF17Rdt , B1ADOF17V , B1ADOF17Wvs , B1ADOF18A , & + B1ADOF18Add , B1ADOF18D , B1ADOF18Hds , B1ADOF18Rdt , B1ADOF18V , B1ADOF18Wvs , B1ADOF19A , & + B1ADOF19Add , B1ADOF19D , B1ADOF19Hds , B1ADOF19Rdt , B1ADOF19V , B1ADOF19Wvs , B1ADOF1A , & + B1ADOF1Add , B1ADOF1D , B1ADOF1Hds , B1ADOF1Rdt , B1ADOF1V , B1ADOF1Wvs , B1ADOF20A , & + B1ADOF20Add , B1ADOF20D , B1ADOF20Hds , B1ADOF20Rdt , B1ADOF20V , B1ADOF20Wvs , B1ADOF21A , & + B1ADOF21Add , B1ADOF21D , B1ADOF21Hds , B1ADOF21Rdt , B1ADOF21V , B1ADOF21Wvs , B1ADOF22A , & + B1ADOF22Add , B1ADOF22D , B1ADOF22Hds , B1ADOF22Rdt , B1ADOF22V , B1ADOF22Wvs , B1ADOF23A , & + B1ADOF23Add , B1ADOF23D , B1ADOF23Hds , B1ADOF23Rdt , B1ADOF23V , B1ADOF23Wvs , B1ADOF24A , & + B1ADOF24Add , B1ADOF24D , B1ADOF24Hds , B1ADOF24Rdt , B1ADOF24V , B1ADOF24Wvs , B1ADOF25A , & + B1ADOF25Add , B1ADOF25D , B1ADOF25Hds , B1ADOF25Rdt , B1ADOF25V , B1ADOF25Wvs , B1ADOF26A , & + B1ADOF26Add , B1ADOF26D , B1ADOF26Hds , B1ADOF26Rdt , B1ADOF26V , B1ADOF26Wvs , B1ADOF27A , & + B1ADOF27Add , B1ADOF27D , B1ADOF27Hds , B1ADOF27Rdt , B1ADOF27V , B1ADOF27Wvs , B1ADOF28A , & + B1ADOF28Add , B1ADOF28D , B1ADOF28Hds , B1ADOF28Rdt , B1ADOF28V , B1ADOF28Wvs , B1ADOF29A , & + B1ADOF29Add , B1ADOF29D , B1ADOF29Hds , B1ADOF29Rdt , B1ADOF29V , B1ADOF29Wvs , B1ADOF2A , & + B1ADOF2Add , B1ADOF2D , B1ADOF2Hds , B1ADOF2Rdt , B1ADOF2V , B1ADOF2Wvs , B1ADOF30A , & + B1ADOF30Add , B1ADOF30D , B1ADOF30Hds , B1ADOF30Rdt , B1ADOF30V , B1ADOF30Wvs , B1ADOF31A , & + B1ADOF31Add , B1ADOF31D , B1ADOF31Hds , B1ADOF31Rdt , B1ADOF31V , B1ADOF31Wvs , B1ADOF32A , & + B1ADOF32Add , B1ADOF32D , B1ADOF32Hds , B1ADOF32Rdt , B1ADOF32V , B1ADOF32Wvs , B1ADOF33A , & + B1ADOF33Add , B1ADOF33D , B1ADOF33Hds , B1ADOF33Rdt , B1ADOF33V , B1ADOF33Wvs , B1ADOF34A , & + B1ADOF34Add , B1ADOF34D , B1ADOF34Hds , B1ADOF34Rdt , B1ADOF34V , B1ADOF34Wvs , B1ADOF35A , & + B1ADOF35Add , B1ADOF35D , B1ADOF35Hds , B1ADOF35Rdt , B1ADOF35V , B1ADOF35Wvs , B1ADOF36A , & + B1ADOF36Add , B1ADOF36D , B1ADOF36Hds , B1ADOF36Rdt , B1ADOF36V , B1ADOF36Wvs , B1ADOF37A , & + B1ADOF37Add , B1ADOF37D , B1ADOF37Hds , B1ADOF37Rdt , B1ADOF37V , B1ADOF37Wvs , B1ADOF38A , & + B1ADOF38Add , B1ADOF38D , B1ADOF38Hds , B1ADOF38Rdt , B1ADOF38V , B1ADOF38Wvs , B1ADOF39A , & + B1ADOF39Add , B1ADOF39D , B1ADOF39Hds , B1ADOF39Rdt , B1ADOF39V , B1ADOF39Wvs , B1ADOF3A , & + B1ADOF3Add , B1ADOF3D , B1ADOF3Hds , B1ADOF3Rdt , B1ADOF3V , B1ADOF3Wvs , B1ADOF40A , & + B1ADOF40Add , B1ADOF40D , B1ADOF40Hds , B1ADOF40Rdt , B1ADOF40V , B1ADOF40Wvs , B1ADOF41A , & + B1ADOF41Add , B1ADOF41D , B1ADOF41Hds , B1ADOF41Rdt , B1ADOF41V , B1ADOF41Wvs , B1ADOF42A , & + B1ADOF42Add , B1ADOF42D , B1ADOF42Hds , B1ADOF42Rdt , B1ADOF42V , B1ADOF42Wvs , B1ADOF43A , & + B1ADOF43Add , B1ADOF43D , B1ADOF43Hds , B1ADOF43Rdt , B1ADOF43V , B1ADOF43Wvs , B1ADOF44A , & + B1ADOF44Add , B1ADOF44D , B1ADOF44Hds , B1ADOF44Rdt , B1ADOF44V , B1ADOF44Wvs , B1ADOF45A , & + B1ADOF45Add , B1ADOF45D , B1ADOF45Hds , B1ADOF45Rdt , B1ADOF45V , B1ADOF45Wvs , B1ADOF46A , & + B1ADOF46Add , B1ADOF46D , B1ADOF46Hds , B1ADOF46Rdt , B1ADOF46V , B1ADOF46Wvs , B1ADOF47A , & + B1ADOF47Add , B1ADOF47D , B1ADOF47Hds , B1ADOF47Rdt , B1ADOF47V , B1ADOF47Wvs , B1ADOF48A , & + B1ADOF48Add , B1ADOF48D , B1ADOF48Hds , B1ADOF48Rdt , B1ADOF48V , B1ADOF48Wvs , B1ADOF49A , & + B1ADOF49Add , B1ADOF49D , B1ADOF49Hds , B1ADOF49Rdt , B1ADOF49V , B1ADOF49Wvs , B1ADOF4A , & + B1ADOF4Add , B1ADOF4D , B1ADOF4Hds , B1ADOF4Rdt , B1ADOF4V , B1ADOF4Wvs , B1ADOF50A , & + B1ADOF50Add , B1ADOF50D , B1ADOF50Hds , B1ADOF50Rdt , B1ADOF50V , B1ADOF50Wvs , B1ADOF51A , & + B1ADOF51Add , B1ADOF51D , B1ADOF51Hds , B1ADOF51Rdt , B1ADOF51V , B1ADOF51Wvs , B1ADOF52A , & + B1ADOF52Add , B1ADOF52D , B1ADOF52Hds , B1ADOF52Rdt , B1ADOF52V , B1ADOF52Wvs , B1ADOF53A , & + B1ADOF53Add , B1ADOF53D , B1ADOF53Hds , B1ADOF53Rdt , B1ADOF53V , B1ADOF53Wvs , B1ADOF54A , & + B1ADOF54Add , B1ADOF54D , B1ADOF54Hds , B1ADOF54Rdt , B1ADOF54V , B1ADOF54Wvs , B1ADOF55A , & + B1ADOF55Add , B1ADOF55D , B1ADOF55Hds , B1ADOF55Rdt , B1ADOF55V , B1ADOF55Wvs , B1ADOF56A , & + B1ADOF56Add , B1ADOF56D , B1ADOF56Hds , B1ADOF56Rdt , B1ADOF56V , B1ADOF56Wvs , B1ADOF57A , & + B1ADOF57Add , B1ADOF57D , B1ADOF57Hds , B1ADOF57Rdt , B1ADOF57V , B1ADOF57Wvs , B1ADOF58A , & + B1ADOF58Add , B1ADOF58D , B1ADOF58Hds , B1ADOF58Rdt , B1ADOF58V , B1ADOF58Wvs , B1ADOF59A , & + B1ADOF59Add , B1ADOF59D , B1ADOF59Hds , B1ADOF59Rdt , B1ADOF59V , B1ADOF59Wvs , B1ADOF5A , & + B1ADOF5Add , B1ADOF5D , B1ADOF5Hds , B1ADOF5Rdt , B1ADOF5V , B1ADOF5Wvs , B1ADOF60A , & + B1ADOF60Add , B1ADOF60D , B1ADOF60Hds , B1ADOF60Rdt , B1ADOF60V , B1ADOF60Wvs , B1ADOF61A , & + B1ADOF61Add , B1ADOF61D , B1ADOF61Hds , B1ADOF61Rdt , B1ADOF61V , B1ADOF61Wvs , B1ADOF62A , & + B1ADOF62Add , B1ADOF62D , B1ADOF62Hds , B1ADOF62Rdt , B1ADOF62V , B1ADOF62Wvs , B1ADOF63A , & + B1ADOF63Add , B1ADOF63D , B1ADOF63Hds , B1ADOF63Rdt , B1ADOF63V , B1ADOF63Wvs , B1ADOF64A , & + B1ADOF64Add , B1ADOF64D , B1ADOF64Hds , B1ADOF64Rdt , B1ADOF64V , B1ADOF64Wvs , B1ADOF65A , & + B1ADOF65Add , B1ADOF65D , B1ADOF65Hds , B1ADOF65Rdt , B1ADOF65V , B1ADOF65Wvs , B1ADOF66A , & + B1ADOF66Add , B1ADOF66D , B1ADOF66Hds , B1ADOF66Rdt , B1ADOF66V , B1ADOF66Wvs , B1ADOF67A , & + B1ADOF67Add , B1ADOF67D , B1ADOF67Hds , B1ADOF67Rdt , B1ADOF67V , B1ADOF67Wvs , B1ADOF68A , & + B1ADOF68Add , B1ADOF68D , B1ADOF68Hds , B1ADOF68Rdt , B1ADOF68V , B1ADOF68Wvs , B1ADOF69A , & + B1ADOF69Add , B1ADOF69D , B1ADOF69Hds , B1ADOF69Rdt , B1ADOF69V , B1ADOF69Wvs , B1ADOF6A , & + B1ADOF6Add , B1ADOF6D , B1ADOF6Hds , B1ADOF6Rdt , B1ADOF6V , B1ADOF6Wvs , B1ADOF70A , & + B1ADOF70Add , B1ADOF70D , B1ADOF70Hds , B1ADOF70Rdt , B1ADOF70V , B1ADOF70Wvs , B1ADOF71A , & + B1ADOF71Add , B1ADOF71D , B1ADOF71Hds , B1ADOF71Rdt , B1ADOF71V , B1ADOF71Wvs , B1ADOF72A , & + B1ADOF72Add , B1ADOF72D , B1ADOF72Hds , B1ADOF72Rdt , B1ADOF72V , B1ADOF72Wvs , B1ADOF73A , & + B1ADOF73Add , B1ADOF73D , B1ADOF73Hds , B1ADOF73Rdt , B1ADOF73V , B1ADOF73Wvs , B1ADOF74A , & + B1ADOF74Add , B1ADOF74D , B1ADOF74Hds , B1ADOF74Rdt , B1ADOF74V , B1ADOF74Wvs , B1ADOF75A , & + B1ADOF75Add , B1ADOF75D , B1ADOF75Hds , B1ADOF75Rdt , B1ADOF75V , B1ADOF75Wvs , B1ADOF76A , & + B1ADOF76Add , B1ADOF76D , B1ADOF76Hds , B1ADOF76Rdt , B1ADOF76V , B1ADOF76Wvs , B1ADOF77A , & + B1ADOF77Add , B1ADOF77D , B1ADOF77Hds , B1ADOF77Rdt , B1ADOF77V , B1ADOF77Wvs , B1ADOF78A , & + B1ADOF78Add , B1ADOF78D , B1ADOF78Hds , B1ADOF78Rdt , B1ADOF78V , B1ADOF78Wvs , B1ADOF79A , & + B1ADOF79Add , B1ADOF79D , B1ADOF79Hds , B1ADOF79Rdt , B1ADOF79V , B1ADOF79Wvs , B1ADOF7A , & + B1ADOF7Add , B1ADOF7D , B1ADOF7Hds , B1ADOF7Rdt , B1ADOF7V , B1ADOF7Wvs , B1ADOF80A , & + B1ADOF80Add , B1ADOF80D , B1ADOF80Hds , B1ADOF80Rdt , B1ADOF80V , B1ADOF80Wvs , B1ADOF81A , & + B1ADOF81Add , B1ADOF81D , B1ADOF81Hds , B1ADOF81Rdt , B1ADOF81V , B1ADOF81Wvs , B1ADOF82A , & + B1ADOF82Add , B1ADOF82D , B1ADOF82Hds , B1ADOF82Rdt , B1ADOF82V , B1ADOF82Wvs , B1ADOF83A , & + B1ADOF83Add , B1ADOF83D , B1ADOF83Hds , B1ADOF83Rdt , B1ADOF83V , B1ADOF83Wvs , B1ADOF84A , & + B1ADOF84Add , B1ADOF84D , B1ADOF84Hds , B1ADOF84Rdt , B1ADOF84V , B1ADOF84Wvs , B1ADOF85A , & + B1ADOF85Add , B1ADOF85D , B1ADOF85Hds , B1ADOF85Rdt , B1ADOF85V , B1ADOF85Wvs , B1ADOF86A , & + B1ADOF86Add , B1ADOF86D , B1ADOF86Hds , B1ADOF86Rdt , B1ADOF86V , B1ADOF86Wvs , B1ADOF87A , & + B1ADOF87Add , B1ADOF87D , B1ADOF87Hds , B1ADOF87Rdt , B1ADOF87V , B1ADOF87Wvs , B1ADOF88A , & + B1ADOF88Add , B1ADOF88D , B1ADOF88Hds , B1ADOF88Rdt , B1ADOF88V , B1ADOF88Wvs , B1ADOF89A , & + B1ADOF89Add , B1ADOF89D , B1ADOF89Hds , B1ADOF89Rdt , B1ADOF89V , B1ADOF89Wvs , B1ADOF8A , & + B1ADOF8Add , B1ADOF8D , B1ADOF8Hds , B1ADOF8Rdt , B1ADOF8V , B1ADOF8Wvs , B1ADOF90A , & + B1ADOF90Add , B1ADOF90D , B1ADOF90Hds , B1ADOF90Rdt , B1ADOF90V , B1ADOF90Wvs , B1ADOF91A , & + B1ADOF91Add , B1ADOF91D , B1ADOF91Hds , B1ADOF91Rdt , B1ADOF91V , B1ADOF91Wvs , B1ADOF92A , & + B1ADOF92Add , B1ADOF92D , B1ADOF92Hds , B1ADOF92Rdt , B1ADOF92V , B1ADOF92Wvs , B1ADOF93A , & + B1ADOF93Add , B1ADOF93D , B1ADOF93Hds , B1ADOF93Rdt , B1ADOF93V , B1ADOF93Wvs , B1ADOF94A , & + B1ADOF94Add , B1ADOF94D , B1ADOF94Hds , B1ADOF94Rdt , B1ADOF94V , B1ADOF94Wvs , B1ADOF95A , & + B1ADOF95Add , B1ADOF95D , B1ADOF95Hds , B1ADOF95Rdt , B1ADOF95V , B1ADOF95Wvs , B1ADOF96A , & + B1ADOF96Add , B1ADOF96D , B1ADOF96Hds , B1ADOF96Rdt , B1ADOF96V , B1ADOF96Wvs , B1ADOF97A , & + B1ADOF97Add , B1ADOF97D , B1ADOF97Hds , B1ADOF97Rdt , B1ADOF97V , B1ADOF97Wvs , B1ADOF98A , & + B1ADOF98Add , B1ADOF98D , B1ADOF98Hds , B1ADOF98Rdt , B1ADOF98V , B1ADOF98Wvs , B1ADOF99A , & + B1ADOF99Add , B1ADOF99D , B1ADOF99Hds , B1ADOF99Rdt , B1ADOF99V , B1ADOF99Wvs , B1ADOF9A , & + B1ADOF9Add , B1ADOF9D , B1ADOF9Hds , B1ADOF9Rdt , B1ADOF9V , B1ADOF9Wvs , B1HdSFxi , & + B1HdSFyi , B1HdSFzi , B1HdSMxi , B1HdSMyi , B1HdSMzi , B1Heave , B1Pitch , & + B1RAxi , B1RAyi , B1RAzi , B1RdtFxi , B1RdtFyi , B1RdtFzi , B1RdtMxi , & + B1RdtMyi , B1RdtMzi , B1Roll , B1RVxi , B1RVyi , B1RVzi , B1Surge , & + B1Sway , B1TAxi , B1TAyi , B1TAzi , B1TVxi , B1TVyi , B1TVzi , & + B1WvsF1xi , B1WvsF1yi , B1WvsF1zi , B1WvsF2xi , B1WvsF2yi , B1WvsF2zi , B1WvsFxi , & + B1WvsFyi , B1WvsFzi , B1WvsM1xi , B1WvsM1yi , B1WvsM1zi , B1WvsM2xi , B1WvsM2yi , & + B1WvsM2zi , B1WvsMxi , B1WvsMyi , B1WvsMzi , B1Yaw , B2AddFxi , B2AddFyi , & + B2AddFzi , B2AddMxi , B2AddMyi , B2AddMzi , B2ADOF10A , B2ADOF10Add , B2ADOF10D , & + B2ADOF10Hds , B2ADOF10Rdt , B2ADOF10V , B2ADOF10Wvs , B2ADOF11A , B2ADOF11Add , B2ADOF11D , & + B2ADOF11Hds , B2ADOF11Rdt , B2ADOF11V , B2ADOF11Wvs , B2ADOF12A , B2ADOF12Add , B2ADOF12D , & + B2ADOF12Hds , B2ADOF12Rdt , B2ADOF12V , B2ADOF12Wvs , B2ADOF13A , B2ADOF13Add , B2ADOF13D , & + B2ADOF13Hds , B2ADOF13Rdt , B2ADOF13V , B2ADOF13Wvs , B2ADOF14A , B2ADOF14Add , B2ADOF14D , & + B2ADOF14Hds , B2ADOF14Rdt , B2ADOF14V , B2ADOF14Wvs , B2ADOF15A , B2ADOF15Add , B2ADOF15D , & + B2ADOF15Hds , B2ADOF15Rdt , B2ADOF15V , B2ADOF15Wvs , B2ADOF16A , B2ADOF16Add , B2ADOF16D , & + B2ADOF16Hds , B2ADOF16Rdt , B2ADOF16V , B2ADOF16Wvs , B2ADOF17A , B2ADOF17Add , B2ADOF17D , & + B2ADOF17Hds , B2ADOF17Rdt , B2ADOF17V , B2ADOF17Wvs , B2ADOF18A , B2ADOF18Add , B2ADOF18D , & + B2ADOF18Hds , B2ADOF18Rdt , B2ADOF18V , B2ADOF18Wvs , B2ADOF19A , B2ADOF19Add , B2ADOF19D , & + B2ADOF19Hds , B2ADOF19Rdt , B2ADOF19V , B2ADOF19Wvs , B2ADOF1A , B2ADOF1Add , B2ADOF1D , & + B2ADOF1Hds , B2ADOF1Rdt , B2ADOF1V , B2ADOF1Wvs , B2ADOF20A , B2ADOF20Add , B2ADOF20D , & + B2ADOF20Hds , B2ADOF20Rdt , B2ADOF20V , B2ADOF20Wvs , B2ADOF21A , B2ADOF21Add , B2ADOF21D , & + B2ADOF21Hds , B2ADOF21Rdt , B2ADOF21V , B2ADOF21Wvs , B2ADOF22A , B2ADOF22Add , B2ADOF22D , & + B2ADOF22Hds , B2ADOF22Rdt , B2ADOF22V , B2ADOF22Wvs , B2ADOF23A , B2ADOF23Add , B2ADOF23D , & + B2ADOF23Hds , B2ADOF23Rdt , B2ADOF23V , B2ADOF23Wvs , B2ADOF24A , B2ADOF24Add , B2ADOF24D , & + B2ADOF24Hds , B2ADOF24Rdt , B2ADOF24V , B2ADOF24Wvs , B2ADOF25A , B2ADOF25Add , B2ADOF25D , & + B2ADOF25Hds , B2ADOF25Rdt , B2ADOF25V , B2ADOF25Wvs , B2ADOF26A , B2ADOF26Add , B2ADOF26D , & + B2ADOF26Hds , B2ADOF26Rdt , B2ADOF26V , B2ADOF26Wvs , B2ADOF27A , B2ADOF27Add , B2ADOF27D , & + B2ADOF27Hds , B2ADOF27Rdt , B2ADOF27V , B2ADOF27Wvs , B2ADOF28A , B2ADOF28Add , B2ADOF28D , & + B2ADOF28Hds , B2ADOF28Rdt , B2ADOF28V , B2ADOF28Wvs , B2ADOF29A , B2ADOF29Add , B2ADOF29D , & + B2ADOF29Hds , B2ADOF29Rdt , B2ADOF29V , B2ADOF29Wvs , B2ADOF2A , B2ADOF2Add , B2ADOF2D , & + B2ADOF2Hds , B2ADOF2Rdt , B2ADOF2V , B2ADOF2Wvs , B2ADOF30A , B2ADOF30Add , B2ADOF30D , & + B2ADOF30Hds , B2ADOF30Rdt , B2ADOF30V , B2ADOF30Wvs , B2ADOF31A , B2ADOF31Add , B2ADOF31D , & + B2ADOF31Hds , B2ADOF31Rdt , B2ADOF31V , B2ADOF31Wvs , B2ADOF32A , B2ADOF32Add , B2ADOF32D , & + B2ADOF32Hds , B2ADOF32Rdt , B2ADOF32V , B2ADOF32Wvs , B2ADOF33A , B2ADOF33Add , B2ADOF33D , & + B2ADOF33Hds , B2ADOF33Rdt , B2ADOF33V , B2ADOF33Wvs , B2ADOF34A , B2ADOF34Add , B2ADOF34D , & + B2ADOF34Hds , B2ADOF34Rdt , B2ADOF34V , B2ADOF34Wvs , B2ADOF35A , B2ADOF35Add , B2ADOF35D , & + B2ADOF35Hds , B2ADOF35Rdt , B2ADOF35V , B2ADOF35Wvs , B2ADOF36A , B2ADOF36Add , B2ADOF36D , & + B2ADOF36Hds , B2ADOF36Rdt , B2ADOF36V , B2ADOF36Wvs , B2ADOF37A , B2ADOF37Add , B2ADOF37D , & + B2ADOF37Hds , B2ADOF37Rdt , B2ADOF37V , B2ADOF37Wvs , B2ADOF38A , B2ADOF38Add , B2ADOF38D , & + B2ADOF38Hds , B2ADOF38Rdt , B2ADOF38V , B2ADOF38Wvs , B2ADOF39A , B2ADOF39Add , B2ADOF39D , & + B2ADOF39Hds , B2ADOF39Rdt , B2ADOF39V , B2ADOF39Wvs , B2ADOF3A , B2ADOF3Add , B2ADOF3D , & + B2ADOF3Hds , B2ADOF3Rdt , B2ADOF3V , B2ADOF3Wvs , B2ADOF40A , B2ADOF40Add , B2ADOF40D , & + B2ADOF40Hds , B2ADOF40Rdt , B2ADOF40V , B2ADOF40Wvs , B2ADOF41A , B2ADOF41Add , B2ADOF41D , & + B2ADOF41Hds , B2ADOF41Rdt , B2ADOF41V , B2ADOF41Wvs , B2ADOF42A , B2ADOF42Add , B2ADOF42D , & + B2ADOF42Hds , B2ADOF42Rdt , B2ADOF42V , B2ADOF42Wvs , B2ADOF43A , B2ADOF43Add , B2ADOF43D , & + B2ADOF43Hds , B2ADOF43Rdt , B2ADOF43V , B2ADOF43Wvs , B2ADOF44A , B2ADOF44Add , B2ADOF44D , & + B2ADOF44Hds , B2ADOF44Rdt , B2ADOF44V , B2ADOF44Wvs , B2ADOF45A , B2ADOF45Add , B2ADOF45D , & + B2ADOF45Hds , B2ADOF45Rdt , B2ADOF45V , B2ADOF45Wvs , B2ADOF46A , B2ADOF46Add , B2ADOF46D , & + B2ADOF46Hds , B2ADOF46Rdt , B2ADOF46V , B2ADOF46Wvs , B2ADOF47A , B2ADOF47Add , B2ADOF47D , & + B2ADOF47Hds , B2ADOF47Rdt , B2ADOF47V , B2ADOF47Wvs , B2ADOF48A , B2ADOF48Add , B2ADOF48D , & + B2ADOF48Hds , B2ADOF48Rdt , B2ADOF48V , B2ADOF48Wvs , B2ADOF49A , B2ADOF49Add , B2ADOF49D , & + B2ADOF49Hds , B2ADOF49Rdt , B2ADOF49V , B2ADOF49Wvs , B2ADOF4A , B2ADOF4Add , B2ADOF4D , & + B2ADOF4Hds , B2ADOF4Rdt , B2ADOF4V , B2ADOF4Wvs , B2ADOF50A , B2ADOF50Add , B2ADOF50D , & + B2ADOF50Hds , B2ADOF50Rdt , B2ADOF50V , B2ADOF50Wvs , B2ADOF51A , B2ADOF51Add , B2ADOF51D , & + B2ADOF51Hds , B2ADOF51Rdt , B2ADOF51V , B2ADOF51Wvs , B2ADOF52A , B2ADOF52Add , B2ADOF52D , & + B2ADOF52Hds , B2ADOF52Rdt , B2ADOF52V , B2ADOF52Wvs , B2ADOF53A , B2ADOF53Add , B2ADOF53D , & + B2ADOF53Hds , B2ADOF53Rdt , B2ADOF53V , B2ADOF53Wvs , B2ADOF54A , B2ADOF54Add , B2ADOF54D , & + B2ADOF54Hds , B2ADOF54Rdt , B2ADOF54V , B2ADOF54Wvs , B2ADOF55A , B2ADOF55Add , B2ADOF55D , & + B2ADOF55Hds , B2ADOF55Rdt , B2ADOF55V , B2ADOF55Wvs , B2ADOF56A , B2ADOF56Add , B2ADOF56D , & + B2ADOF56Hds , B2ADOF56Rdt , B2ADOF56V , B2ADOF56Wvs , B2ADOF57A , B2ADOF57Add , B2ADOF57D , & + B2ADOF57Hds , B2ADOF57Rdt , B2ADOF57V , B2ADOF57Wvs , B2ADOF58A , B2ADOF58Add , B2ADOF58D , & + B2ADOF58Hds , B2ADOF58Rdt , B2ADOF58V , B2ADOF58Wvs , B2ADOF59A , B2ADOF59Add , B2ADOF59D , & + B2ADOF59Hds , B2ADOF59Rdt , B2ADOF59V , B2ADOF59Wvs , B2ADOF5A , B2ADOF5Add , B2ADOF5D , & + B2ADOF5Hds , B2ADOF5Rdt , B2ADOF5V , B2ADOF5Wvs , B2ADOF60A , B2ADOF60Add , B2ADOF60D , & + B2ADOF60Hds , B2ADOF60Rdt , B2ADOF60V , B2ADOF60Wvs , B2ADOF61A , B2ADOF61Add , B2ADOF61D , & + B2ADOF61Hds , B2ADOF61Rdt , B2ADOF61V , B2ADOF61Wvs , B2ADOF62A , B2ADOF62Add , B2ADOF62D , & + B2ADOF62Hds , B2ADOF62Rdt , B2ADOF62V , B2ADOF62Wvs , B2ADOF63A , B2ADOF63Add , B2ADOF63D , & + B2ADOF63Hds , B2ADOF63Rdt , B2ADOF63V , B2ADOF63Wvs , B2ADOF64A , B2ADOF64Add , B2ADOF64D , & + B2ADOF64Hds , B2ADOF64Rdt , B2ADOF64V , B2ADOF64Wvs , B2ADOF65A , B2ADOF65Add , B2ADOF65D , & + B2ADOF65Hds , B2ADOF65Rdt , B2ADOF65V , B2ADOF65Wvs , B2ADOF66A , B2ADOF66Add , B2ADOF66D , & + B2ADOF66Hds , B2ADOF66Rdt , B2ADOF66V , B2ADOF66Wvs , B2ADOF67A , B2ADOF67Add , B2ADOF67D , & + B2ADOF67Hds , B2ADOF67Rdt , B2ADOF67V , B2ADOF67Wvs , B2ADOF68A , B2ADOF68Add , B2ADOF68D , & + B2ADOF68Hds , B2ADOF68Rdt , B2ADOF68V , B2ADOF68Wvs , B2ADOF69A , B2ADOF69Add , B2ADOF69D , & + B2ADOF69Hds , B2ADOF69Rdt , B2ADOF69V , B2ADOF69Wvs , B2ADOF6A , B2ADOF6Add , B2ADOF6D , & + B2ADOF6Hds , B2ADOF6Rdt , B2ADOF6V , B2ADOF6Wvs , B2ADOF70A , B2ADOF70Add , B2ADOF70D , & + B2ADOF70Hds , B2ADOF70Rdt , B2ADOF70V , B2ADOF70Wvs , B2ADOF71A , B2ADOF71Add , B2ADOF71D , & + B2ADOF71Hds , B2ADOF71Rdt , B2ADOF71V , B2ADOF71Wvs , B2ADOF72A , B2ADOF72Add , B2ADOF72D , & + B2ADOF72Hds , B2ADOF72Rdt , B2ADOF72V , B2ADOF72Wvs , B2ADOF73A , B2ADOF73Add , B2ADOF73D , & + B2ADOF73Hds , B2ADOF73Rdt , B2ADOF73V , B2ADOF73Wvs , B2ADOF74A , B2ADOF74Add , B2ADOF74D , & + B2ADOF74Hds , B2ADOF74Rdt , B2ADOF74V , B2ADOF74Wvs , B2ADOF75A , B2ADOF75Add , B2ADOF75D , & + B2ADOF75Hds , B2ADOF75Rdt , B2ADOF75V , B2ADOF75Wvs , B2ADOF76A , B2ADOF76Add , B2ADOF76D , & + B2ADOF76Hds , B2ADOF76Rdt , B2ADOF76V , B2ADOF76Wvs , B2ADOF77A , B2ADOF77Add , B2ADOF77D , & + B2ADOF77Hds , B2ADOF77Rdt , B2ADOF77V , B2ADOF77Wvs , B2ADOF78A , B2ADOF78Add , B2ADOF78D , & + B2ADOF78Hds , B2ADOF78Rdt , B2ADOF78V , B2ADOF78Wvs , B2ADOF79A , B2ADOF79Add , B2ADOF79D , & + B2ADOF79Hds , B2ADOF79Rdt , B2ADOF79V , B2ADOF79Wvs , B2ADOF7A , B2ADOF7Add , B2ADOF7D , & + B2ADOF7Hds , B2ADOF7Rdt , B2ADOF7V , B2ADOF7Wvs , B2ADOF80A , B2ADOF80Add , B2ADOF80D , & + B2ADOF80Hds , B2ADOF80Rdt , B2ADOF80V , B2ADOF80Wvs , B2ADOF81A , B2ADOF81Add , B2ADOF81D , & + B2ADOF81Hds , B2ADOF81Rdt , B2ADOF81V , B2ADOF81Wvs , B2ADOF82A , B2ADOF82Add , B2ADOF82D , & + B2ADOF82Hds , B2ADOF82Rdt , B2ADOF82V , B2ADOF82Wvs , B2ADOF83A , B2ADOF83Add , B2ADOF83D , & + B2ADOF83Hds , B2ADOF83Rdt , B2ADOF83V , B2ADOF83Wvs , B2ADOF84A , B2ADOF84Add , B2ADOF84D , & + B2ADOF84Hds , B2ADOF84Rdt , B2ADOF84V , B2ADOF84Wvs , B2ADOF85A , B2ADOF85Add , B2ADOF85D , & + B2ADOF85Hds , B2ADOF85Rdt , B2ADOF85V , B2ADOF85Wvs , B2ADOF86A , B2ADOF86Add , B2ADOF86D , & + B2ADOF86Hds , B2ADOF86Rdt , B2ADOF86V , B2ADOF86Wvs , B2ADOF87A , B2ADOF87Add , B2ADOF87D , & + B2ADOF87Hds , B2ADOF87Rdt , B2ADOF87V , B2ADOF87Wvs , B2ADOF88A , B2ADOF88Add , B2ADOF88D , & + B2ADOF88Hds , B2ADOF88Rdt , B2ADOF88V , B2ADOF88Wvs , B2ADOF89A , B2ADOF89Add , B2ADOF89D , & + B2ADOF89Hds , B2ADOF89Rdt , B2ADOF89V , B2ADOF89Wvs , B2ADOF8A , B2ADOF8Add , B2ADOF8D , & + B2ADOF8Hds , B2ADOF8Rdt , B2ADOF8V , B2ADOF8Wvs , B2ADOF90A , B2ADOF90Add , B2ADOF90D , & + B2ADOF90Hds , B2ADOF90Rdt , B2ADOF90V , B2ADOF90Wvs , B2ADOF91A , B2ADOF91Add , B2ADOF91D , & + B2ADOF91Hds , B2ADOF91Rdt , B2ADOF91V , B2ADOF91Wvs , B2ADOF92A , B2ADOF92Add , B2ADOF92D , & + B2ADOF92Hds , B2ADOF92Rdt , B2ADOF92V , B2ADOF92Wvs , B2ADOF93A , B2ADOF93Add , B2ADOF93D , & + B2ADOF93Hds , B2ADOF93Rdt , B2ADOF93V , B2ADOF93Wvs , B2ADOF94A , B2ADOF94Add , B2ADOF94D , & + B2ADOF94Hds , B2ADOF94Rdt , B2ADOF94V , B2ADOF94Wvs , B2ADOF95A , B2ADOF95Add , B2ADOF95D , & + B2ADOF95Hds , B2ADOF95Rdt , B2ADOF95V , B2ADOF95Wvs , B2ADOF96A , B2ADOF96Add , B2ADOF96D , & + B2ADOF96Hds , B2ADOF96Rdt , B2ADOF96V , B2ADOF96Wvs , B2ADOF97A , B2ADOF97Add , B2ADOF97D , & + B2ADOF97Hds , B2ADOF97Rdt , B2ADOF97V , B2ADOF97Wvs , B2ADOF98A , B2ADOF98Add , B2ADOF98D , & + B2ADOF98Hds , B2ADOF98Rdt , B2ADOF98V , B2ADOF98Wvs , B2ADOF99A , B2ADOF99Add , B2ADOF99D , & + B2ADOF99Hds , B2ADOF99Rdt , B2ADOF99V , B2ADOF99Wvs , B2ADOF9A , B2ADOF9Add , B2ADOF9D , & + B2ADOF9Hds , B2ADOF9Rdt , B2ADOF9V , B2ADOF9Wvs , B2HdSFxi , B2HdSFyi , B2HdSFzi , & + B2HdSMxi , B2HdSMyi , B2HdSMzi , B2Heave , B2Pitch , B2RAxi , B2RAyi , & + B2RAzi , B2RdtFxi , B2RdtFyi , B2RdtFzi , B2RdtMxi , B2RdtMyi , B2RdtMzi , & + B2Roll , B2RVxi , B2RVyi , B2RVzi , B2Surge , B2Sway , B2TAxi , & + B2TAyi , B2TAzi , B2TVxi , B2TVyi , B2TVzi , B2WvsF1xi , B2WvsF1yi , & + B2WvsF1zi , B2WvsF2xi , B2WvsF2yi , B2WvsF2zi , B2WvsFxi , B2WvsFyi , B2WvsFzi , & + B2WvsM1xi , B2WvsM1yi , B2WvsM1zi , B2WvsM2xi , B2WvsM2yi , B2WvsM2zi , B2WvsMxi , & + B2WvsMyi , B2WvsMzi , B2Yaw , B3AddFxi , B3AddFyi , B3AddFzi , B3AddMxi , & + B3AddMyi , B3AddMzi , B3ADOF10A , B3ADOF10Add , B3ADOF10D , B3ADOF10Hds , B3ADOF10Rdt , & + B3ADOF10V , B3ADOF10Wvs , B3ADOF11A , B3ADOF11Add , B3ADOF11D , B3ADOF11Hds , B3ADOF11Rdt , & + B3ADOF11V , B3ADOF11Wvs , B3ADOF12A , B3ADOF12Add , B3ADOF12D , B3ADOF12Hds , B3ADOF12Rdt , & + B3ADOF12V , B3ADOF12Wvs , B3ADOF13A , B3ADOF13Add , B3ADOF13D , B3ADOF13Hds , B3ADOF13Rdt , & + B3ADOF13V , B3ADOF13Wvs , B3ADOF14A , B3ADOF14Add , B3ADOF14D , B3ADOF14Hds , B3ADOF14Rdt , & + B3ADOF14V , B3ADOF14Wvs , B3ADOF15A , B3ADOF15Add , B3ADOF15D , B3ADOF15Hds , B3ADOF15Rdt , & + B3ADOF15V , B3ADOF15Wvs , B3ADOF16A , B3ADOF16Add , B3ADOF16D , B3ADOF16Hds , B3ADOF16Rdt , & + B3ADOF16V , B3ADOF16Wvs , B3ADOF17A , B3ADOF17Add , B3ADOF17D , B3ADOF17Hds , B3ADOF17Rdt , & + B3ADOF17V , B3ADOF17Wvs , B3ADOF18A , B3ADOF18Add , B3ADOF18D , B3ADOF18Hds , B3ADOF18Rdt , & + B3ADOF18V , B3ADOF18Wvs , B3ADOF19A , B3ADOF19Add , B3ADOF19D , B3ADOF19Hds , B3ADOF19Rdt , & + B3ADOF19V , B3ADOF19Wvs , B3ADOF1A , B3ADOF1Add , B3ADOF1D , B3ADOF1Hds , B3ADOF1Rdt , & + B3ADOF1V , B3ADOF1Wvs , B3ADOF20A , B3ADOF20Add , B3ADOF20D , B3ADOF20Hds , B3ADOF20Rdt , & + B3ADOF20V , B3ADOF20Wvs , B3ADOF21A , B3ADOF21Add , B3ADOF21D , B3ADOF21Hds , B3ADOF21Rdt , & + B3ADOF21V , B3ADOF21Wvs , B3ADOF22A , B3ADOF22Add , B3ADOF22D , B3ADOF22Hds , B3ADOF22Rdt , & + B3ADOF22V , B3ADOF22Wvs , B3ADOF23A , B3ADOF23Add , B3ADOF23D , B3ADOF23Hds , B3ADOF23Rdt , & + B3ADOF23V , B3ADOF23Wvs , B3ADOF24A , B3ADOF24Add , B3ADOF24D , B3ADOF24Hds , B3ADOF24Rdt , & + B3ADOF24V , B3ADOF24Wvs , B3ADOF25A , B3ADOF25Add , B3ADOF25D , B3ADOF25Hds , B3ADOF25Rdt , & + B3ADOF25V , B3ADOF25Wvs , B3ADOF26A , B3ADOF26Add , B3ADOF26D , B3ADOF26Hds , B3ADOF26Rdt , & + B3ADOF26V , B3ADOF26Wvs , B3ADOF27A , B3ADOF27Add , B3ADOF27D , B3ADOF27Hds , B3ADOF27Rdt , & + B3ADOF27V , B3ADOF27Wvs , B3ADOF28A , B3ADOF28Add , B3ADOF28D , B3ADOF28Hds , B3ADOF28Rdt , & + B3ADOF28V , B3ADOF28Wvs , B3ADOF29A , B3ADOF29Add , B3ADOF29D , B3ADOF29Hds , B3ADOF29Rdt , & + B3ADOF29V , B3ADOF29Wvs , B3ADOF2A , B3ADOF2Add , B3ADOF2D , B3ADOF2Hds , B3ADOF2Rdt , & + B3ADOF2V , B3ADOF2Wvs , B3ADOF30A , B3ADOF30Add , B3ADOF30D , B3ADOF30Hds , B3ADOF30Rdt , & + B3ADOF30V , B3ADOF30Wvs , B3ADOF31A , B3ADOF31Add , B3ADOF31D , B3ADOF31Hds , B3ADOF31Rdt , & + B3ADOF31V , B3ADOF31Wvs , B3ADOF32A , B3ADOF32Add , B3ADOF32D , B3ADOF32Hds , B3ADOF32Rdt , & + B3ADOF32V , B3ADOF32Wvs , B3ADOF33A , B3ADOF33Add , B3ADOF33D , B3ADOF33Hds , B3ADOF33Rdt , & + B3ADOF33V , B3ADOF33Wvs , B3ADOF34A , B3ADOF34Add , B3ADOF34D , B3ADOF34Hds , B3ADOF34Rdt /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry2(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + B3ADOF34V , B3ADOF34Wvs , B3ADOF35A , B3ADOF35Add , B3ADOF35D , B3ADOF35Hds , B3ADOF35Rdt , & + B3ADOF35V , B3ADOF35Wvs , B3ADOF36A , B3ADOF36Add , B3ADOF36D , B3ADOF36Hds , B3ADOF36Rdt , & + B3ADOF36V , B3ADOF36Wvs , B3ADOF37A , B3ADOF37Add , B3ADOF37D , B3ADOF37Hds , B3ADOF37Rdt , & + B3ADOF37V , B3ADOF37Wvs , B3ADOF38A , B3ADOF38Add , B3ADOF38D , B3ADOF38Hds , B3ADOF38Rdt , & + B3ADOF38V , B3ADOF38Wvs , B3ADOF39A , B3ADOF39Add , B3ADOF39D , B3ADOF39Hds , B3ADOF39Rdt , & + B3ADOF39V , B3ADOF39Wvs , B3ADOF3A , B3ADOF3Add , B3ADOF3D , B3ADOF3Hds , B3ADOF3Rdt , & + B3ADOF3V , B3ADOF3Wvs , B3ADOF40A , B3ADOF40Add , B3ADOF40D , B3ADOF40Hds , B3ADOF40Rdt , & + B3ADOF40V , B3ADOF40Wvs , B3ADOF41A , B3ADOF41Add , B3ADOF41D , B3ADOF41Hds , B3ADOF41Rdt , & + B3ADOF41V , B3ADOF41Wvs , B3ADOF42A , B3ADOF42Add , B3ADOF42D , B3ADOF42Hds , B3ADOF42Rdt , & + B3ADOF42V , B3ADOF42Wvs , B3ADOF43A , B3ADOF43Add , B3ADOF43D , B3ADOF43Hds , B3ADOF43Rdt , & + B3ADOF43V , B3ADOF43Wvs , B3ADOF44A , B3ADOF44Add , B3ADOF44D , B3ADOF44Hds , B3ADOF44Rdt , & + B3ADOF44V , B3ADOF44Wvs , B3ADOF45A , B3ADOF45Add , B3ADOF45D , B3ADOF45Hds , B3ADOF45Rdt , & + B3ADOF45V , B3ADOF45Wvs , B3ADOF46A , B3ADOF46Add , B3ADOF46D , B3ADOF46Hds , B3ADOF46Rdt , & + B3ADOF46V , B3ADOF46Wvs , B3ADOF47A , B3ADOF47Add , B3ADOF47D , B3ADOF47Hds , B3ADOF47Rdt , & + B3ADOF47V , B3ADOF47Wvs , B3ADOF48A , B3ADOF48Add , B3ADOF48D , B3ADOF48Hds , B3ADOF48Rdt , & + B3ADOF48V , B3ADOF48Wvs , B3ADOF49A , B3ADOF49Add , B3ADOF49D , B3ADOF49Hds , B3ADOF49Rdt , & + B3ADOF49V , B3ADOF49Wvs , B3ADOF4A , B3ADOF4Add , B3ADOF4D , B3ADOF4Hds , B3ADOF4Rdt , & + B3ADOF4V , B3ADOF4Wvs , B3ADOF50A , B3ADOF50Add , B3ADOF50D , B3ADOF50Hds , B3ADOF50Rdt , & + B3ADOF50V , B3ADOF50Wvs , B3ADOF51A , B3ADOF51Add , B3ADOF51D , B3ADOF51Hds , B3ADOF51Rdt , & + B3ADOF51V , B3ADOF51Wvs , B3ADOF52A , B3ADOF52Add , B3ADOF52D , B3ADOF52Hds , B3ADOF52Rdt , & + B3ADOF52V , B3ADOF52Wvs , B3ADOF53A , B3ADOF53Add , B3ADOF53D , B3ADOF53Hds , B3ADOF53Rdt , & + B3ADOF53V , B3ADOF53Wvs , B3ADOF54A , B3ADOF54Add , B3ADOF54D , B3ADOF54Hds , B3ADOF54Rdt , & + B3ADOF54V , B3ADOF54Wvs , B3ADOF55A , B3ADOF55Add , B3ADOF55D , B3ADOF55Hds , B3ADOF55Rdt , & + B3ADOF55V , B3ADOF55Wvs , B3ADOF56A , B3ADOF56Add , B3ADOF56D , B3ADOF56Hds , B3ADOF56Rdt , & + B3ADOF56V , B3ADOF56Wvs , B3ADOF57A , B3ADOF57Add , B3ADOF57D , B3ADOF57Hds , B3ADOF57Rdt , & + B3ADOF57V , B3ADOF57Wvs , B3ADOF58A , B3ADOF58Add , B3ADOF58D , B3ADOF58Hds , B3ADOF58Rdt , & + B3ADOF58V , B3ADOF58Wvs , B3ADOF59A , B3ADOF59Add , B3ADOF59D , B3ADOF59Hds , B3ADOF59Rdt , & + B3ADOF59V , B3ADOF59Wvs , B3ADOF5A , B3ADOF5Add , B3ADOF5D , B3ADOF5Hds , B3ADOF5Rdt , & + B3ADOF5V , B3ADOF5Wvs , B3ADOF60A , B3ADOF60Add , B3ADOF60D , B3ADOF60Hds , B3ADOF60Rdt , & + B3ADOF60V , B3ADOF60Wvs , B3ADOF61A , B3ADOF61Add , B3ADOF61D , B3ADOF61Hds , B3ADOF61Rdt , & + B3ADOF61V , B3ADOF61Wvs , B3ADOF62A , B3ADOF62Add , B3ADOF62D , B3ADOF62Hds , B3ADOF62Rdt , & + B3ADOF62V , B3ADOF62Wvs , B3ADOF63A , B3ADOF63Add , B3ADOF63D , B3ADOF63Hds , B3ADOF63Rdt , & + B3ADOF63V , B3ADOF63Wvs , B3ADOF64A , B3ADOF64Add , B3ADOF64D , B3ADOF64Hds , B3ADOF64Rdt , & + B3ADOF64V , B3ADOF64Wvs , B3ADOF65A , B3ADOF65Add , B3ADOF65D , B3ADOF65Hds , B3ADOF65Rdt , & + B3ADOF65V , B3ADOF65Wvs , B3ADOF66A , B3ADOF66Add , B3ADOF66D , B3ADOF66Hds , B3ADOF66Rdt , & + B3ADOF66V , B3ADOF66Wvs , B3ADOF67A , B3ADOF67Add , B3ADOF67D , B3ADOF67Hds , B3ADOF67Rdt , & + B3ADOF67V , B3ADOF67Wvs , B3ADOF68A , B3ADOF68Add , B3ADOF68D , B3ADOF68Hds , B3ADOF68Rdt , & + B3ADOF68V , B3ADOF68Wvs , B3ADOF69A , B3ADOF69Add , B3ADOF69D , B3ADOF69Hds , B3ADOF69Rdt , & + B3ADOF69V , B3ADOF69Wvs , B3ADOF6A , B3ADOF6Add , B3ADOF6D , B3ADOF6Hds , B3ADOF6Rdt , & + B3ADOF6V , B3ADOF6Wvs , B3ADOF70A , B3ADOF70Add , B3ADOF70D , B3ADOF70Hds , B3ADOF70Rdt , & + B3ADOF70V , B3ADOF70Wvs , B3ADOF71A , B3ADOF71Add , B3ADOF71D , B3ADOF71Hds , B3ADOF71Rdt , & + B3ADOF71V , B3ADOF71Wvs , B3ADOF72A , B3ADOF72Add , B3ADOF72D , B3ADOF72Hds , B3ADOF72Rdt , & + B3ADOF72V , B3ADOF72Wvs , B3ADOF73A , B3ADOF73Add , B3ADOF73D , B3ADOF73Hds , B3ADOF73Rdt , & + B3ADOF73V , B3ADOF73Wvs , B3ADOF74A , B3ADOF74Add , B3ADOF74D , B3ADOF74Hds , B3ADOF74Rdt , & + B3ADOF74V , B3ADOF74Wvs , B3ADOF75A , B3ADOF75Add , B3ADOF75D , B3ADOF75Hds , B3ADOF75Rdt , & + B3ADOF75V , B3ADOF75Wvs , B3ADOF76A , B3ADOF76Add , B3ADOF76D , B3ADOF76Hds , B3ADOF76Rdt , & + B3ADOF76V , B3ADOF76Wvs , B3ADOF77A , B3ADOF77Add , B3ADOF77D , B3ADOF77Hds , B3ADOF77Rdt , & + B3ADOF77V , B3ADOF77Wvs , B3ADOF78A , B3ADOF78Add , B3ADOF78D , B3ADOF78Hds , B3ADOF78Rdt , & + B3ADOF78V , B3ADOF78Wvs , B3ADOF79A , B3ADOF79Add , B3ADOF79D , B3ADOF79Hds , B3ADOF79Rdt , & + B3ADOF79V , B3ADOF79Wvs , B3ADOF7A , B3ADOF7Add , B3ADOF7D , B3ADOF7Hds , B3ADOF7Rdt , & + B3ADOF7V , B3ADOF7Wvs , B3ADOF80A , B3ADOF80Add , B3ADOF80D , B3ADOF80Hds , B3ADOF80Rdt , & + B3ADOF80V , B3ADOF80Wvs , B3ADOF81A , B3ADOF81Add , B3ADOF81D , B3ADOF81Hds , B3ADOF81Rdt , & + B3ADOF81V , B3ADOF81Wvs , B3ADOF82A , B3ADOF82Add , B3ADOF82D , B3ADOF82Hds , B3ADOF82Rdt , & + B3ADOF82V , B3ADOF82Wvs , B3ADOF83A , B3ADOF83Add , B3ADOF83D , B3ADOF83Hds , B3ADOF83Rdt , & + B3ADOF83V , B3ADOF83Wvs , B3ADOF84A , B3ADOF84Add , B3ADOF84D , B3ADOF84Hds , B3ADOF84Rdt , & + B3ADOF84V , B3ADOF84Wvs , B3ADOF85A , B3ADOF85Add , B3ADOF85D , B3ADOF85Hds , B3ADOF85Rdt , & + B3ADOF85V , B3ADOF85Wvs , B3ADOF86A , B3ADOF86Add , B3ADOF86D , B3ADOF86Hds , B3ADOF86Rdt , & + B3ADOF86V , B3ADOF86Wvs , B3ADOF87A , B3ADOF87Add , B3ADOF87D , B3ADOF87Hds , B3ADOF87Rdt , & + B3ADOF87V , B3ADOF87Wvs , B3ADOF88A , B3ADOF88Add , B3ADOF88D , B3ADOF88Hds , B3ADOF88Rdt , & + B3ADOF88V , B3ADOF88Wvs , B3ADOF89A , B3ADOF89Add , B3ADOF89D , B3ADOF89Hds , B3ADOF89Rdt , & + B3ADOF89V , B3ADOF89Wvs , B3ADOF8A , B3ADOF8Add , B3ADOF8D , B3ADOF8Hds , B3ADOF8Rdt , & + B3ADOF8V , B3ADOF8Wvs , B3ADOF90A , B3ADOF90Add , B3ADOF90D , B3ADOF90Hds , B3ADOF90Rdt , & + B3ADOF90V , B3ADOF90Wvs , B3ADOF91A , B3ADOF91Add , B3ADOF91D , B3ADOF91Hds , B3ADOF91Rdt , & + B3ADOF91V , B3ADOF91Wvs , B3ADOF92A , B3ADOF92Add , B3ADOF92D , B3ADOF92Hds , B3ADOF92Rdt , & + B3ADOF92V , B3ADOF92Wvs , B3ADOF93A , B3ADOF93Add , B3ADOF93D , B3ADOF93Hds , B3ADOF93Rdt , & + B3ADOF93V , B3ADOF93Wvs , B3ADOF94A , B3ADOF94Add , B3ADOF94D , B3ADOF94Hds , B3ADOF94Rdt , & + B3ADOF94V , B3ADOF94Wvs , B3ADOF95A , B3ADOF95Add , B3ADOF95D , B3ADOF95Hds , B3ADOF95Rdt , & + B3ADOF95V , B3ADOF95Wvs , B3ADOF96A , B3ADOF96Add , B3ADOF96D , B3ADOF96Hds , B3ADOF96Rdt , & + B3ADOF96V , B3ADOF96Wvs , B3ADOF97A , B3ADOF97Add , B3ADOF97D , B3ADOF97Hds , B3ADOF97Rdt , & + B3ADOF97V , B3ADOF97Wvs , B3ADOF98A , B3ADOF98Add , B3ADOF98D , B3ADOF98Hds , B3ADOF98Rdt , & + B3ADOF98V , B3ADOF98Wvs , B3ADOF99A , B3ADOF99Add , B3ADOF99D , B3ADOF99Hds , B3ADOF99Rdt , & + B3ADOF99V , B3ADOF99Wvs , B3ADOF9A , B3ADOF9Add , B3ADOF9D , B3ADOF9Hds , B3ADOF9Rdt , & + B3ADOF9V , B3ADOF9Wvs , B3HdSFxi , B3HdSFyi , B3HdSFzi , B3HdSMxi , B3HdSMyi , & + B3HdSMzi , B3Heave , B3Pitch , B3RAxi , B3RAyi , B3RAzi , B3RdtFxi , & + B3RdtFyi , B3RdtFzi , B3RdtMxi , B3RdtMyi , B3RdtMzi , B3Roll , B3RVxi , & + B3RVyi , B3RVzi , B3Surge , B3Sway , B3TAxi , B3TAyi , B3TAzi , & + B3TVxi , B3TVyi , B3TVzi , B3WvsF1xi , B3WvsF1yi , B3WvsF1zi , B3WvsF2xi , & + B3WvsF2yi , B3WvsF2zi , B3WvsFxi , B3WvsFyi , B3WvsFzi , B3WvsM1xi , B3WvsM1yi , & + B3WvsM1zi , B3WvsM2xi , B3WvsM2yi , B3WvsM2zi , B3WvsMxi , B3WvsMyi , B3WvsMzi , & + B3Yaw , B4AddFxi , B4AddFyi , B4AddFzi , B4AddMxi , B4AddMyi , B4AddMzi , & + B4ADOF10A , B4ADOF10Add , B4ADOF10D , B4ADOF10Hds , B4ADOF10Rdt , B4ADOF10V , B4ADOF10Wvs , & + B4ADOF11A , B4ADOF11Add , B4ADOF11D , B4ADOF11Hds , B4ADOF11Rdt , B4ADOF11V , B4ADOF11Wvs , & + B4ADOF12A , B4ADOF12Add , B4ADOF12D , B4ADOF12Hds , B4ADOF12Rdt , B4ADOF12V , B4ADOF12Wvs , & + B4ADOF13A , B4ADOF13Add , B4ADOF13D , B4ADOF13Hds , B4ADOF13Rdt , B4ADOF13V , B4ADOF13Wvs , & + B4ADOF14A , B4ADOF14Add , B4ADOF14D , B4ADOF14Hds , B4ADOF14Rdt , B4ADOF14V , B4ADOF14Wvs , & + B4ADOF15A , B4ADOF15Add , B4ADOF15D , B4ADOF15Hds , B4ADOF15Rdt , B4ADOF15V , B4ADOF15Wvs , & + B4ADOF16A , B4ADOF16Add , B4ADOF16D , B4ADOF16Hds , B4ADOF16Rdt , B4ADOF16V , B4ADOF16Wvs , & + B4ADOF17A , B4ADOF17Add , B4ADOF17D , B4ADOF17Hds , B4ADOF17Rdt , B4ADOF17V , B4ADOF17Wvs , & + B4ADOF18A , B4ADOF18Add , B4ADOF18D , B4ADOF18Hds , B4ADOF18Rdt , B4ADOF18V , B4ADOF18Wvs , & + B4ADOF19A , B4ADOF19Add , B4ADOF19D , B4ADOF19Hds , B4ADOF19Rdt , B4ADOF19V , B4ADOF19Wvs , & + B4ADOF1A , B4ADOF1Add , B4ADOF1D , B4ADOF1Hds , B4ADOF1Rdt , B4ADOF1V , B4ADOF1Wvs , & + B4ADOF20A , B4ADOF20Add , B4ADOF20D , B4ADOF20Hds , B4ADOF20Rdt , B4ADOF20V , B4ADOF20Wvs , & + B4ADOF21A , B4ADOF21Add , B4ADOF21D , B4ADOF21Hds , B4ADOF21Rdt , B4ADOF21V , B4ADOF21Wvs , & + B4ADOF22A , B4ADOF22Add , B4ADOF22D , B4ADOF22Hds , B4ADOF22Rdt , B4ADOF22V , B4ADOF22Wvs , & + B4ADOF23A , B4ADOF23Add , B4ADOF23D , B4ADOF23Hds , B4ADOF23Rdt , B4ADOF23V , B4ADOF23Wvs , & + B4ADOF24A , B4ADOF24Add , B4ADOF24D , B4ADOF24Hds , B4ADOF24Rdt , B4ADOF24V , B4ADOF24Wvs , & + B4ADOF25A , B4ADOF25Add , B4ADOF25D , B4ADOF25Hds , B4ADOF25Rdt , B4ADOF25V , B4ADOF25Wvs , & + B4ADOF26A , B4ADOF26Add , B4ADOF26D , B4ADOF26Hds , B4ADOF26Rdt , B4ADOF26V , B4ADOF26Wvs , & + B4ADOF27A , B4ADOF27Add , B4ADOF27D , B4ADOF27Hds , B4ADOF27Rdt , B4ADOF27V , B4ADOF27Wvs , & + B4ADOF28A , B4ADOF28Add , B4ADOF28D , B4ADOF28Hds , B4ADOF28Rdt , B4ADOF28V , B4ADOF28Wvs , & + B4ADOF29A , B4ADOF29Add , B4ADOF29D , B4ADOF29Hds , B4ADOF29Rdt , B4ADOF29V , B4ADOF29Wvs , & + B4ADOF2A , B4ADOF2Add , B4ADOF2D , B4ADOF2Hds , B4ADOF2Rdt , B4ADOF2V , B4ADOF2Wvs , & + B4ADOF30A , B4ADOF30Add , B4ADOF30D , B4ADOF30Hds , B4ADOF30Rdt , B4ADOF30V , B4ADOF30Wvs , & + B4ADOF31A , B4ADOF31Add , B4ADOF31D , B4ADOF31Hds , B4ADOF31Rdt , B4ADOF31V , B4ADOF31Wvs , & + B4ADOF32A , B4ADOF32Add , B4ADOF32D , B4ADOF32Hds , B4ADOF32Rdt , B4ADOF32V , B4ADOF32Wvs , & + B4ADOF33A , B4ADOF33Add , B4ADOF33D , B4ADOF33Hds , B4ADOF33Rdt , B4ADOF33V , B4ADOF33Wvs , & + B4ADOF34A , B4ADOF34Add , B4ADOF34D , B4ADOF34Hds , B4ADOF34Rdt , B4ADOF34V , B4ADOF34Wvs , & + B4ADOF35A , B4ADOF35Add , B4ADOF35D , B4ADOF35Hds , B4ADOF35Rdt , B4ADOF35V , B4ADOF35Wvs , & + B4ADOF36A , B4ADOF36Add , B4ADOF36D , B4ADOF36Hds , B4ADOF36Rdt , B4ADOF36V , B4ADOF36Wvs , & + B4ADOF37A , B4ADOF37Add , B4ADOF37D , B4ADOF37Hds , B4ADOF37Rdt , B4ADOF37V , B4ADOF37Wvs , & + B4ADOF38A , B4ADOF38Add , B4ADOF38D , B4ADOF38Hds , B4ADOF38Rdt , B4ADOF38V , B4ADOF38Wvs , & + B4ADOF39A , B4ADOF39Add , B4ADOF39D , B4ADOF39Hds , B4ADOF39Rdt , B4ADOF39V , B4ADOF39Wvs , & + B4ADOF3A , B4ADOF3Add , B4ADOF3D , B4ADOF3Hds , B4ADOF3Rdt , B4ADOF3V , B4ADOF3Wvs , & + B4ADOF40A , B4ADOF40Add , B4ADOF40D , B4ADOF40Hds , B4ADOF40Rdt , B4ADOF40V , B4ADOF40Wvs , & + B4ADOF41A , B4ADOF41Add , B4ADOF41D , B4ADOF41Hds , B4ADOF41Rdt , B4ADOF41V , B4ADOF41Wvs , & + B4ADOF42A , B4ADOF42Add , B4ADOF42D , B4ADOF42Hds , B4ADOF42Rdt , B4ADOF42V , B4ADOF42Wvs , & + B4ADOF43A , B4ADOF43Add , B4ADOF43D , B4ADOF43Hds , B4ADOF43Rdt , B4ADOF43V , B4ADOF43Wvs , & + B4ADOF44A , B4ADOF44Add , B4ADOF44D , B4ADOF44Hds , B4ADOF44Rdt , B4ADOF44V , B4ADOF44Wvs , & + B4ADOF45A , B4ADOF45Add , B4ADOF45D , B4ADOF45Hds , B4ADOF45Rdt , B4ADOF45V , B4ADOF45Wvs , & + B4ADOF46A , B4ADOF46Add , B4ADOF46D , B4ADOF46Hds , B4ADOF46Rdt , B4ADOF46V , B4ADOF46Wvs , & + B4ADOF47A , B4ADOF47Add , B4ADOF47D , B4ADOF47Hds , B4ADOF47Rdt , B4ADOF47V , B4ADOF47Wvs , & + B4ADOF48A , B4ADOF48Add , B4ADOF48D , B4ADOF48Hds , B4ADOF48Rdt , B4ADOF48V , B4ADOF48Wvs , & + B4ADOF49A , B4ADOF49Add , B4ADOF49D , B4ADOF49Hds , B4ADOF49Rdt , B4ADOF49V , B4ADOF49Wvs , & + B4ADOF4A , B4ADOF4Add , B4ADOF4D , B4ADOF4Hds , B4ADOF4Rdt , B4ADOF4V , B4ADOF4Wvs , & + B4ADOF50A , B4ADOF50Add , B4ADOF50D , B4ADOF50Hds , B4ADOF50Rdt , B4ADOF50V , B4ADOF50Wvs , & + B4ADOF51A , B4ADOF51Add , B4ADOF51D , B4ADOF51Hds , B4ADOF51Rdt , B4ADOF51V , B4ADOF51Wvs , & + B4ADOF52A , B4ADOF52Add , B4ADOF52D , B4ADOF52Hds , B4ADOF52Rdt , B4ADOF52V , B4ADOF52Wvs , & + B4ADOF53A , B4ADOF53Add , B4ADOF53D , B4ADOF53Hds , B4ADOF53Rdt , B4ADOF53V , B4ADOF53Wvs , & + B4ADOF54A , B4ADOF54Add , B4ADOF54D , B4ADOF54Hds , B4ADOF54Rdt , B4ADOF54V , B4ADOF54Wvs , & + B4ADOF55A , B4ADOF55Add , B4ADOF55D , B4ADOF55Hds , B4ADOF55Rdt , B4ADOF55V , B4ADOF55Wvs , & + B4ADOF56A , B4ADOF56Add , B4ADOF56D , B4ADOF56Hds , B4ADOF56Rdt , B4ADOF56V , B4ADOF56Wvs , & + B4ADOF57A , B4ADOF57Add , B4ADOF57D , B4ADOF57Hds , B4ADOF57Rdt , B4ADOF57V , B4ADOF57Wvs , & + B4ADOF58A , B4ADOF58Add , B4ADOF58D , B4ADOF58Hds , B4ADOF58Rdt , B4ADOF58V , B4ADOF58Wvs , & + B4ADOF59A , B4ADOF59Add , B4ADOF59D , B4ADOF59Hds , B4ADOF59Rdt , B4ADOF59V , B4ADOF59Wvs , & + B4ADOF5A , B4ADOF5Add , B4ADOF5D , B4ADOF5Hds , B4ADOF5Rdt , B4ADOF5V , B4ADOF5Wvs , & + B4ADOF60A , B4ADOF60Add , B4ADOF60D , B4ADOF60Hds , B4ADOF60Rdt , B4ADOF60V , B4ADOF60Wvs , & + B4ADOF61A , B4ADOF61Add , B4ADOF61D , B4ADOF61Hds , B4ADOF61Rdt , B4ADOF61V , B4ADOF61Wvs , & + B4ADOF62A , B4ADOF62Add , B4ADOF62D , B4ADOF62Hds , B4ADOF62Rdt , B4ADOF62V , B4ADOF62Wvs , & + B4ADOF63A , B4ADOF63Add , B4ADOF63D , B4ADOF63Hds , B4ADOF63Rdt , B4ADOF63V , B4ADOF63Wvs , & + B4ADOF64A , B4ADOF64Add , B4ADOF64D , B4ADOF64Hds , B4ADOF64Rdt , B4ADOF64V , B4ADOF64Wvs , & + B4ADOF65A , B4ADOF65Add , B4ADOF65D , B4ADOF65Hds , B4ADOF65Rdt , B4ADOF65V , B4ADOF65Wvs , & + B4ADOF66A , B4ADOF66Add , B4ADOF66D , B4ADOF66Hds , B4ADOF66Rdt , B4ADOF66V , B4ADOF66Wvs , & + B4ADOF67A , B4ADOF67Add , B4ADOF67D , B4ADOF67Hds , B4ADOF67Rdt , B4ADOF67V , B4ADOF67Wvs , & + B4ADOF68A , B4ADOF68Add , B4ADOF68D , B4ADOF68Hds , B4ADOF68Rdt , B4ADOF68V , B4ADOF68Wvs , & + B4ADOF69A , B4ADOF69Add , B4ADOF69D , B4ADOF69Hds , B4ADOF69Rdt , B4ADOF69V , B4ADOF69Wvs , & + B4ADOF6A , B4ADOF6Add , B4ADOF6D , B4ADOF6Hds , B4ADOF6Rdt , B4ADOF6V , B4ADOF6Wvs , & + B4ADOF70A , B4ADOF70Add , B4ADOF70D , B4ADOF70Hds , B4ADOF70Rdt , B4ADOF70V , B4ADOF70Wvs , & + B4ADOF71A , B4ADOF71Add , B4ADOF71D , B4ADOF71Hds , B4ADOF71Rdt , B4ADOF71V , B4ADOF71Wvs , & + B4ADOF72A , B4ADOF72Add , B4ADOF72D , B4ADOF72Hds , B4ADOF72Rdt , B4ADOF72V , B4ADOF72Wvs , & + B4ADOF73A , B4ADOF73Add , B4ADOF73D , B4ADOF73Hds , B4ADOF73Rdt , B4ADOF73V , B4ADOF73Wvs , & + B4ADOF74A , B4ADOF74Add , B4ADOF74D , B4ADOF74Hds , B4ADOF74Rdt , B4ADOF74V , B4ADOF74Wvs , & + B4ADOF75A , B4ADOF75Add , B4ADOF75D , B4ADOF75Hds , B4ADOF75Rdt , B4ADOF75V , B4ADOF75Wvs , & + B4ADOF76A , B4ADOF76Add , B4ADOF76D , B4ADOF76Hds , B4ADOF76Rdt , B4ADOF76V , B4ADOF76Wvs , & + B4ADOF77A , B4ADOF77Add , B4ADOF77D , B4ADOF77Hds , B4ADOF77Rdt , B4ADOF77V , B4ADOF77Wvs , & + B4ADOF78A , B4ADOF78Add , B4ADOF78D , B4ADOF78Hds , B4ADOF78Rdt , B4ADOF78V , B4ADOF78Wvs , & + B4ADOF79A , B4ADOF79Add , B4ADOF79D , B4ADOF79Hds , B4ADOF79Rdt , B4ADOF79V , B4ADOF79Wvs , & + B4ADOF7A , B4ADOF7Add , B4ADOF7D , B4ADOF7Hds , B4ADOF7Rdt , B4ADOF7V , B4ADOF7Wvs , & + B4ADOF80A , B4ADOF80Add , B4ADOF80D , B4ADOF80Hds , B4ADOF80Rdt , B4ADOF80V , B4ADOF80Wvs , & + B4ADOF81A , B4ADOF81Add , B4ADOF81D , B4ADOF81Hds , B4ADOF81Rdt , B4ADOF81V , B4ADOF81Wvs , & + B4ADOF82A , B4ADOF82Add , B4ADOF82D , B4ADOF82Hds , B4ADOF82Rdt , B4ADOF82V , B4ADOF82Wvs , & + B4ADOF83A , B4ADOF83Add , B4ADOF83D , B4ADOF83Hds , B4ADOF83Rdt , B4ADOF83V , B4ADOF83Wvs , & + B4ADOF84A , B4ADOF84Add , B4ADOF84D , B4ADOF84Hds , B4ADOF84Rdt , B4ADOF84V , B4ADOF84Wvs , & + B4ADOF85A , B4ADOF85Add , B4ADOF85D , B4ADOF85Hds , B4ADOF85Rdt , B4ADOF85V , B4ADOF85Wvs , & + B4ADOF86A , B4ADOF86Add , B4ADOF86D , B4ADOF86Hds , B4ADOF86Rdt , B4ADOF86V , B4ADOF86Wvs , & + B4ADOF87A , B4ADOF87Add , B4ADOF87D , B4ADOF87Hds , B4ADOF87Rdt , B4ADOF87V , B4ADOF87Wvs , & + B4ADOF88A , B4ADOF88Add , B4ADOF88D , B4ADOF88Hds , B4ADOF88Rdt , B4ADOF88V , B4ADOF88Wvs , & + B4ADOF89A , B4ADOF89Add , B4ADOF89D , B4ADOF89Hds , B4ADOF89Rdt , B4ADOF89V , B4ADOF89Wvs , & + B4ADOF8A , B4ADOF8Add , B4ADOF8D , B4ADOF8Hds , B4ADOF8Rdt , B4ADOF8V , B4ADOF8Wvs , & + B4ADOF90A , B4ADOF90Add , B4ADOF90D , B4ADOF90Hds , B4ADOF90Rdt , B4ADOF90V , B4ADOF90Wvs , & + B4ADOF91A , B4ADOF91Add , B4ADOF91D , B4ADOF91Hds , B4ADOF91Rdt , B4ADOF91V , B4ADOF91Wvs , & + B4ADOF92A , B4ADOF92Add , B4ADOF92D , B4ADOF92Hds , B4ADOF92Rdt , B4ADOF92V , B4ADOF92Wvs , & + B4ADOF93A , B4ADOF93Add , B4ADOF93D , B4ADOF93Hds , B4ADOF93Rdt , B4ADOF93V , B4ADOF93Wvs , & + B4ADOF94A , B4ADOF94Add , B4ADOF94D , B4ADOF94Hds , B4ADOF94Rdt , B4ADOF94V , B4ADOF94Wvs , & + B4ADOF95A , B4ADOF95Add , B4ADOF95D , B4ADOF95Hds , B4ADOF95Rdt , B4ADOF95V , B4ADOF95Wvs , & + B4ADOF96A , B4ADOF96Add , B4ADOF96D , B4ADOF96Hds , B4ADOF96Rdt , B4ADOF96V , B4ADOF96Wvs , & + B4ADOF97A , B4ADOF97Add , B4ADOF97D , B4ADOF97Hds , B4ADOF97Rdt , B4ADOF97V , B4ADOF97Wvs , & + B4ADOF98A , B4ADOF98Add , B4ADOF98D , B4ADOF98Hds , B4ADOF98Rdt , B4ADOF98V , B4ADOF98Wvs , & + B4ADOF99A , B4ADOF99Add , B4ADOF99D , B4ADOF99Hds , B4ADOF99Rdt , B4ADOF99V , B4ADOF99Wvs , & + B4ADOF9A , B4ADOF9Add , B4ADOF9D , B4ADOF9Hds , B4ADOF9Rdt , B4ADOF9V , B4ADOF9Wvs , & + B4HdSFxi , B4HdSFyi , B4HdSFzi , B4HdSMxi , B4HdSMyi , B4HdSMzi , B4Heave , & + B4Pitch , B4RAxi , B4RAyi , B4RAzi , B4RdtFxi , B4RdtFyi , B4RdtFzi , & + B4RdtMxi , B4RdtMyi , B4RdtMzi , B4Roll , B4RVxi , B4RVyi , B4RVzi , & + B4Surge , B4Sway , B4TAxi , B4TAyi , B4TAzi , B4TVxi , B4TVyi , & + B4TVzi , B4WvsF1xi , B4WvsF1yi , B4WvsF1zi , B4WvsF2xi , B4WvsF2yi , B4WvsF2zi , & + B4WvsFxi , B4WvsFyi , B4WvsFzi , B4WvsM1xi , B4WvsM1yi , B4WvsM1zi , B4WvsM2xi , & + B4WvsM2yi , B4WvsM2zi , B4WvsMxi , B4WvsMyi , B4WvsMzi , B4Yaw , B5AddFxi , & + B5AddFyi , B5AddFzi , B5AddMxi , B5AddMyi , B5AddMzi , B5ADOF10A , B5ADOF10Add , & + B5ADOF10D , B5ADOF10Hds , B5ADOF10Rdt , B5ADOF10V , B5ADOF10Wvs , B5ADOF11A , B5ADOF11Add , & + B5ADOF11D , B5ADOF11Hds , B5ADOF11Rdt , B5ADOF11V , B5ADOF11Wvs , B5ADOF12A , B5ADOF12Add , & + B5ADOF12D , B5ADOF12Hds , B5ADOF12Rdt , B5ADOF12V , B5ADOF12Wvs , B5ADOF13A , B5ADOF13Add , & + B5ADOF13D , B5ADOF13Hds , B5ADOF13Rdt , B5ADOF13V , B5ADOF13Wvs , B5ADOF14A , B5ADOF14Add , & + B5ADOF14D , B5ADOF14Hds , B5ADOF14Rdt , B5ADOF14V , B5ADOF14Wvs , B5ADOF15A , B5ADOF15Add , & + B5ADOF15D , B5ADOF15Hds , B5ADOF15Rdt , B5ADOF15V , B5ADOF15Wvs , B5ADOF16A , B5ADOF16Add , & + B5ADOF16D , B5ADOF16Hds , B5ADOF16Rdt , B5ADOF16V , B5ADOF16Wvs , B5ADOF17A , B5ADOF17Add , & + B5ADOF17D , B5ADOF17Hds , B5ADOF17Rdt , B5ADOF17V , B5ADOF17Wvs , B5ADOF18A , B5ADOF18Add , & + B5ADOF18D , B5ADOF18Hds , B5ADOF18Rdt , B5ADOF18V , B5ADOF18Wvs , B5ADOF19A , B5ADOF19Add , & + B5ADOF19D , B5ADOF19Hds , B5ADOF19Rdt , B5ADOF19V , B5ADOF19Wvs , B5ADOF1A , B5ADOF1Add , & + B5ADOF1D , B5ADOF1Hds , B5ADOF1Rdt , B5ADOF1V , B5ADOF1Wvs , B5ADOF20A , B5ADOF20Add , & + B5ADOF20D , B5ADOF20Hds , B5ADOF20Rdt , B5ADOF20V , B5ADOF20Wvs , B5ADOF21A , B5ADOF21Add , & + B5ADOF21D , B5ADOF21Hds , B5ADOF21Rdt , B5ADOF21V , B5ADOF21Wvs , B5ADOF22A , B5ADOF22Add , & + B5ADOF22D , B5ADOF22Hds , B5ADOF22Rdt , B5ADOF22V , B5ADOF22Wvs , B5ADOF23A , B5ADOF23Add , & + B5ADOF23D , B5ADOF23Hds , B5ADOF23Rdt , B5ADOF23V , B5ADOF23Wvs , B5ADOF24A , B5ADOF24Add , & + B5ADOF24D , B5ADOF24Hds , B5ADOF24Rdt , B5ADOF24V , B5ADOF24Wvs , B5ADOF25A , B5ADOF25Add , & + B5ADOF25D , B5ADOF25Hds , B5ADOF25Rdt , B5ADOF25V , B5ADOF25Wvs , B5ADOF26A , B5ADOF26Add , & + B5ADOF26D , B5ADOF26Hds , B5ADOF26Rdt , B5ADOF26V , B5ADOF26Wvs , B5ADOF27A , B5ADOF27Add , & + B5ADOF27D , B5ADOF27Hds , B5ADOF27Rdt , B5ADOF27V , B5ADOF27Wvs , B5ADOF28A , B5ADOF28Add , & + B5ADOF28D , B5ADOF28Hds , B5ADOF28Rdt , B5ADOF28V , B5ADOF28Wvs , B5ADOF29A , B5ADOF29Add , & + B5ADOF29D , B5ADOF29Hds , B5ADOF29Rdt , B5ADOF29V , B5ADOF29Wvs , B5ADOF2A , B5ADOF2Add , & + B5ADOF2D , B5ADOF2Hds , B5ADOF2Rdt , B5ADOF2V , B5ADOF2Wvs , B5ADOF30A , B5ADOF30Add , & + B5ADOF30D , B5ADOF30Hds , B5ADOF30Rdt , B5ADOF30V , B5ADOF30Wvs , B5ADOF31A , B5ADOF31Add , & + B5ADOF31D , B5ADOF31Hds , B5ADOF31Rdt , B5ADOF31V , B5ADOF31Wvs , B5ADOF32A , B5ADOF32Add , & + B5ADOF32D , B5ADOF32Hds , B5ADOF32Rdt , B5ADOF32V , B5ADOF32Wvs , B5ADOF33A , B5ADOF33Add , & + B5ADOF33D , B5ADOF33Hds , B5ADOF33Rdt , B5ADOF33V , B5ADOF33Wvs , B5ADOF34A , B5ADOF34Add , & + B5ADOF34D , B5ADOF34Hds , B5ADOF34Rdt , B5ADOF34V , B5ADOF34Wvs , B5ADOF35A , B5ADOF35Add , & + B5ADOF35D , B5ADOF35Hds , B5ADOF35Rdt , B5ADOF35V , B5ADOF35Wvs , B5ADOF36A , B5ADOF36Add , & + B5ADOF36D , B5ADOF36Hds , B5ADOF36Rdt , B5ADOF36V , B5ADOF36Wvs , B5ADOF37A , B5ADOF37Add , & + B5ADOF37D , B5ADOF37Hds , B5ADOF37Rdt , B5ADOF37V , B5ADOF37Wvs , B5ADOF38A , B5ADOF38Add , & + B5ADOF38D , B5ADOF38Hds , B5ADOF38Rdt , B5ADOF38V , B5ADOF38Wvs , B5ADOF39A , B5ADOF39Add , & + B5ADOF39D , B5ADOF39Hds , B5ADOF39Rdt , B5ADOF39V , B5ADOF39Wvs , B5ADOF3A , B5ADOF3Add , & + B5ADOF3D , B5ADOF3Hds , B5ADOF3Rdt , B5ADOF3V , B5ADOF3Wvs , B5ADOF40A , B5ADOF40Add , & + B5ADOF40D , B5ADOF40Hds , B5ADOF40Rdt , B5ADOF40V , B5ADOF40Wvs , B5ADOF41A , B5ADOF41Add , & + B5ADOF41D , B5ADOF41Hds , B5ADOF41Rdt , B5ADOF41V , B5ADOF41Wvs , B5ADOF42A , B5ADOF42Add , & + B5ADOF42D , B5ADOF42Hds , B5ADOF42Rdt , B5ADOF42V , B5ADOF42Wvs , B5ADOF43A , B5ADOF43Add , & + B5ADOF43D , B5ADOF43Hds , B5ADOF43Rdt , B5ADOF43V , B5ADOF43Wvs , B5ADOF44A , B5ADOF44Add , & + B5ADOF44D , B5ADOF44Hds , B5ADOF44Rdt , B5ADOF44V , B5ADOF44Wvs , B5ADOF45A , B5ADOF45Add , & + B5ADOF45D , B5ADOF45Hds , B5ADOF45Rdt , B5ADOF45V , B5ADOF45Wvs , B5ADOF46A , B5ADOF46Add , & + B5ADOF46D , B5ADOF46Hds , B5ADOF46Rdt , B5ADOF46V , B5ADOF46Wvs , B5ADOF47A , B5ADOF47Add , & + B5ADOF47D , B5ADOF47Hds , B5ADOF47Rdt , B5ADOF47V , B5ADOF47Wvs , B5ADOF48A , B5ADOF48Add , & + B5ADOF48D , B5ADOF48Hds , B5ADOF48Rdt , B5ADOF48V , B5ADOF48Wvs , B5ADOF49A , B5ADOF49Add , & + B5ADOF49D , B5ADOF49Hds , B5ADOF49Rdt , B5ADOF49V , B5ADOF49Wvs , B5ADOF4A , B5ADOF4Add , & + B5ADOF4D , B5ADOF4Hds , B5ADOF4Rdt , B5ADOF4V , B5ADOF4Wvs , B5ADOF50A , B5ADOF50Add , & + B5ADOF50D , B5ADOF50Hds , B5ADOF50Rdt , B5ADOF50V , B5ADOF50Wvs , B5ADOF51A , B5ADOF51Add , & + B5ADOF51D , B5ADOF51Hds , B5ADOF51Rdt , B5ADOF51V , B5ADOF51Wvs , B5ADOF52A , B5ADOF52Add , & + B5ADOF52D , B5ADOF52Hds , B5ADOF52Rdt , B5ADOF52V , B5ADOF52Wvs , B5ADOF53A , B5ADOF53Add , & + B5ADOF53D , B5ADOF53Hds , B5ADOF53Rdt , B5ADOF53V , B5ADOF53Wvs , B5ADOF54A , B5ADOF54Add , & + B5ADOF54D , B5ADOF54Hds , B5ADOF54Rdt , B5ADOF54V , B5ADOF54Wvs , B5ADOF55A , B5ADOF55Add , & + B5ADOF55D , B5ADOF55Hds , B5ADOF55Rdt , B5ADOF55V , B5ADOF55Wvs , B5ADOF56A , B5ADOF56Add , & + B5ADOF56D , B5ADOF56Hds , B5ADOF56Rdt , B5ADOF56V , B5ADOF56Wvs , B5ADOF57A , B5ADOF57Add , & + B5ADOF57D , B5ADOF57Hds , B5ADOF57Rdt , B5ADOF57V , B5ADOF57Wvs , B5ADOF58A , B5ADOF58Add , & + B5ADOF58D , B5ADOF58Hds , B5ADOF58Rdt , B5ADOF58V , B5ADOF58Wvs , B5ADOF59A , B5ADOF59Add , & + B5ADOF59D , B5ADOF59Hds , B5ADOF59Rdt , B5ADOF59V , B5ADOF59Wvs , B5ADOF5A , B5ADOF5Add /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry3(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + B5ADOF5D , B5ADOF5Hds , B5ADOF5Rdt , B5ADOF5V , B5ADOF5Wvs , B5ADOF60A , B5ADOF60Add , & + B5ADOF60D , B5ADOF60Hds , B5ADOF60Rdt , B5ADOF60V , B5ADOF60Wvs , B5ADOF61A , B5ADOF61Add , & + B5ADOF61D , B5ADOF61Hds , B5ADOF61Rdt , B5ADOF61V , B5ADOF61Wvs , B5ADOF62A , B5ADOF62Add , & + B5ADOF62D , B5ADOF62Hds , B5ADOF62Rdt , B5ADOF62V , B5ADOF62Wvs , B5ADOF63A , B5ADOF63Add , & + B5ADOF63D , B5ADOF63Hds , B5ADOF63Rdt , B5ADOF63V , B5ADOF63Wvs , B5ADOF64A , B5ADOF64Add , & + B5ADOF64D , B5ADOF64Hds , B5ADOF64Rdt , B5ADOF64V , B5ADOF64Wvs , B5ADOF65A , B5ADOF65Add , & + B5ADOF65D , B5ADOF65Hds , B5ADOF65Rdt , B5ADOF65V , B5ADOF65Wvs , B5ADOF66A , B5ADOF66Add , & + B5ADOF66D , B5ADOF66Hds , B5ADOF66Rdt , B5ADOF66V , B5ADOF66Wvs , B5ADOF67A , B5ADOF67Add , & + B5ADOF67D , B5ADOF67Hds , B5ADOF67Rdt , B5ADOF67V , B5ADOF67Wvs , B5ADOF68A , B5ADOF68Add , & + B5ADOF68D , B5ADOF68Hds , B5ADOF68Rdt , B5ADOF68V , B5ADOF68Wvs , B5ADOF69A , B5ADOF69Add , & + B5ADOF69D , B5ADOF69Hds , B5ADOF69Rdt , B5ADOF69V , B5ADOF69Wvs , B5ADOF6A , B5ADOF6Add , & + B5ADOF6D , B5ADOF6Hds , B5ADOF6Rdt , B5ADOF6V , B5ADOF6Wvs , B5ADOF70A , B5ADOF70Add , & + B5ADOF70D , B5ADOF70Hds , B5ADOF70Rdt , B5ADOF70V , B5ADOF70Wvs , B5ADOF71A , B5ADOF71Add , & + B5ADOF71D , B5ADOF71Hds , B5ADOF71Rdt , B5ADOF71V , B5ADOF71Wvs , B5ADOF72A , B5ADOF72Add , & + B5ADOF72D , B5ADOF72Hds , B5ADOF72Rdt , B5ADOF72V , B5ADOF72Wvs , B5ADOF73A , B5ADOF73Add , & + B5ADOF73D , B5ADOF73Hds , B5ADOF73Rdt , B5ADOF73V , B5ADOF73Wvs , B5ADOF74A , B5ADOF74Add , & + B5ADOF74D , B5ADOF74Hds , B5ADOF74Rdt , B5ADOF74V , B5ADOF74Wvs , B5ADOF75A , B5ADOF75Add , & + B5ADOF75D , B5ADOF75Hds , B5ADOF75Rdt , B5ADOF75V , B5ADOF75Wvs , B5ADOF76A , B5ADOF76Add , & + B5ADOF76D , B5ADOF76Hds , B5ADOF76Rdt , B5ADOF76V , B5ADOF76Wvs , B5ADOF77A , B5ADOF77Add , & + B5ADOF77D , B5ADOF77Hds , B5ADOF77Rdt , B5ADOF77V , B5ADOF77Wvs , B5ADOF78A , B5ADOF78Add , & + B5ADOF78D , B5ADOF78Hds , B5ADOF78Rdt , B5ADOF78V , B5ADOF78Wvs , B5ADOF79A , B5ADOF79Add , & + B5ADOF79D , B5ADOF79Hds , B5ADOF79Rdt , B5ADOF79V , B5ADOF79Wvs , B5ADOF7A , B5ADOF7Add , & + B5ADOF7D , B5ADOF7Hds , B5ADOF7Rdt , B5ADOF7V , B5ADOF7Wvs , B5ADOF80A , B5ADOF80Add , & + B5ADOF80D , B5ADOF80Hds , B5ADOF80Rdt , B5ADOF80V , B5ADOF80Wvs , B5ADOF81A , B5ADOF81Add , & + B5ADOF81D , B5ADOF81Hds , B5ADOF81Rdt , B5ADOF81V , B5ADOF81Wvs , B5ADOF82A , B5ADOF82Add , & + B5ADOF82D , B5ADOF82Hds , B5ADOF82Rdt , B5ADOF82V , B5ADOF82Wvs , B5ADOF83A , B5ADOF83Add , & + B5ADOF83D , B5ADOF83Hds , B5ADOF83Rdt , B5ADOF83V , B5ADOF83Wvs , B5ADOF84A , B5ADOF84Add , & + B5ADOF84D , B5ADOF84Hds , B5ADOF84Rdt , B5ADOF84V , B5ADOF84Wvs , B5ADOF85A , B5ADOF85Add , & + B5ADOF85D , B5ADOF85Hds , B5ADOF85Rdt , B5ADOF85V , B5ADOF85Wvs , B5ADOF86A , B5ADOF86Add , & + B5ADOF86D , B5ADOF86Hds , B5ADOF86Rdt , B5ADOF86V , B5ADOF86Wvs , B5ADOF87A , B5ADOF87Add , & + B5ADOF87D , B5ADOF87Hds , B5ADOF87Rdt , B5ADOF87V , B5ADOF87Wvs , B5ADOF88A , B5ADOF88Add , & + B5ADOF88D , B5ADOF88Hds , B5ADOF88Rdt , B5ADOF88V , B5ADOF88Wvs , B5ADOF89A , B5ADOF89Add , & + B5ADOF89D , B5ADOF89Hds , B5ADOF89Rdt , B5ADOF89V , B5ADOF89Wvs , B5ADOF8A , B5ADOF8Add , & + B5ADOF8D , B5ADOF8Hds , B5ADOF8Rdt , B5ADOF8V , B5ADOF8Wvs , B5ADOF90A , B5ADOF90Add , & + B5ADOF90D , B5ADOF90Hds , B5ADOF90Rdt , B5ADOF90V , B5ADOF90Wvs , B5ADOF91A , B5ADOF91Add , & + B5ADOF91D , B5ADOF91Hds , B5ADOF91Rdt , B5ADOF91V , B5ADOF91Wvs , B5ADOF92A , B5ADOF92Add , & + B5ADOF92D , B5ADOF92Hds , B5ADOF92Rdt , B5ADOF92V , B5ADOF92Wvs , B5ADOF93A , B5ADOF93Add , & + B5ADOF93D , B5ADOF93Hds , B5ADOF93Rdt , B5ADOF93V , B5ADOF93Wvs , B5ADOF94A , B5ADOF94Add , & + B5ADOF94D , B5ADOF94Hds , B5ADOF94Rdt , B5ADOF94V , B5ADOF94Wvs , B5ADOF95A , B5ADOF95Add , & + B5ADOF95D , B5ADOF95Hds , B5ADOF95Rdt , B5ADOF95V , B5ADOF95Wvs , B5ADOF96A , B5ADOF96Add , & + B5ADOF96D , B5ADOF96Hds , B5ADOF96Rdt , B5ADOF96V , B5ADOF96Wvs , B5ADOF97A , B5ADOF97Add , & + B5ADOF97D , B5ADOF97Hds , B5ADOF97Rdt , B5ADOF97V , B5ADOF97Wvs , B5ADOF98A , B5ADOF98Add , & + B5ADOF98D , B5ADOF98Hds , B5ADOF98Rdt , B5ADOF98V , B5ADOF98Wvs , B5ADOF99A , B5ADOF99Add , & + B5ADOF99D , B5ADOF99Hds , B5ADOF99Rdt , B5ADOF99V , B5ADOF99Wvs , B5ADOF9A , B5ADOF9Add , & + B5ADOF9D , B5ADOF9Hds , B5ADOF9Rdt , B5ADOF9V , B5ADOF9Wvs , B5HdSFxi , B5HdSFyi , & + B5HdSFzi , B5HdSMxi , B5HdSMyi , B5HdSMzi , B5Heave , B5Pitch , B5RAxi , & + B5RAyi , B5RAzi , B5RdtFxi , B5RdtFyi , B5RdtFzi , B5RdtMxi , B5RdtMyi , & + B5RdtMzi , B5Roll , B5RVxi , B5RVyi , B5RVzi , B5Surge , B5Sway , & + B5TAxi , B5TAyi , B5TAzi , B5TVxi , B5TVyi , B5TVzi , B5WvsF1xi , & + B5WvsF1yi , B5WvsF1zi , B5WvsF2xi , B5WvsF2yi , B5WvsF2zi , B5WvsFxi , B5WvsFyi , & + B5WvsFzi , B5WvsM1xi , B5WvsM1yi , B5WvsM1zi , B5WvsM2xi , B5WvsM2yi , B5WvsM2zi , & + B5WvsMxi , B5WvsMyi , B5WvsMzi , B5Yaw , B6AddFxi , B6AddFyi , B6AddFzi , & + B6AddMxi , B6AddMyi , B6AddMzi , B6ADOF10A , B6ADOF10Add , B6ADOF10D , B6ADOF10Hds , & + B6ADOF10Rdt , B6ADOF10V , B6ADOF10Wvs , B6ADOF11A , B6ADOF11Add , B6ADOF11D , B6ADOF11Hds , & + B6ADOF11Rdt , B6ADOF11V , B6ADOF11Wvs , B6ADOF12A , B6ADOF12Add , B6ADOF12D , B6ADOF12Hds , & + B6ADOF12Rdt , B6ADOF12V , B6ADOF12Wvs , B6ADOF13A , B6ADOF13Add , B6ADOF13D , B6ADOF13Hds , & + B6ADOF13Rdt , B6ADOF13V , B6ADOF13Wvs , B6ADOF14A , B6ADOF14Add , B6ADOF14D , B6ADOF14Hds , & + B6ADOF14Rdt , B6ADOF14V , B6ADOF14Wvs , B6ADOF15A , B6ADOF15Add , B6ADOF15D , B6ADOF15Hds , & + B6ADOF15Rdt , B6ADOF15V , B6ADOF15Wvs , B6ADOF16A , B6ADOF16Add , B6ADOF16D , B6ADOF16Hds , & + B6ADOF16Rdt , B6ADOF16V , B6ADOF16Wvs , B6ADOF17A , B6ADOF17Add , B6ADOF17D , B6ADOF17Hds , & + B6ADOF17Rdt , B6ADOF17V , B6ADOF17Wvs , B6ADOF18A , B6ADOF18Add , B6ADOF18D , B6ADOF18Hds , & + B6ADOF18Rdt , B6ADOF18V , B6ADOF18Wvs , B6ADOF19A , B6ADOF19Add , B6ADOF19D , B6ADOF19Hds , & + B6ADOF19Rdt , B6ADOF19V , B6ADOF19Wvs , B6ADOF1A , B6ADOF1Add , B6ADOF1D , B6ADOF1Hds , & + B6ADOF1Rdt , B6ADOF1V , B6ADOF1Wvs , B6ADOF20A , B6ADOF20Add , B6ADOF20D , B6ADOF20Hds , & + B6ADOF20Rdt , B6ADOF20V , B6ADOF20Wvs , B6ADOF21A , B6ADOF21Add , B6ADOF21D , B6ADOF21Hds , & + B6ADOF21Rdt , B6ADOF21V , B6ADOF21Wvs , B6ADOF22A , B6ADOF22Add , B6ADOF22D , B6ADOF22Hds , & + B6ADOF22Rdt , B6ADOF22V , B6ADOF22Wvs , B6ADOF23A , B6ADOF23Add , B6ADOF23D , B6ADOF23Hds , & + B6ADOF23Rdt , B6ADOF23V , B6ADOF23Wvs , B6ADOF24A , B6ADOF24Add , B6ADOF24D , B6ADOF24Hds , & + B6ADOF24Rdt , B6ADOF24V , B6ADOF24Wvs , B6ADOF25A , B6ADOF25Add , B6ADOF25D , B6ADOF25Hds , & + B6ADOF25Rdt , B6ADOF25V , B6ADOF25Wvs , B6ADOF26A , B6ADOF26Add , B6ADOF26D , B6ADOF26Hds , & + B6ADOF26Rdt , B6ADOF26V , B6ADOF26Wvs , B6ADOF27A , B6ADOF27Add , B6ADOF27D , B6ADOF27Hds , & + B6ADOF27Rdt , B6ADOF27V , B6ADOF27Wvs , B6ADOF28A , B6ADOF28Add , B6ADOF28D , B6ADOF28Hds , & + B6ADOF28Rdt , B6ADOF28V , B6ADOF28Wvs , B6ADOF29A , B6ADOF29Add , B6ADOF29D , B6ADOF29Hds , & + B6ADOF29Rdt , B6ADOF29V , B6ADOF29Wvs , B6ADOF2A , B6ADOF2Add , B6ADOF2D , B6ADOF2Hds , & + B6ADOF2Rdt , B6ADOF2V , B6ADOF2Wvs , B6ADOF30A , B6ADOF30Add , B6ADOF30D , B6ADOF30Hds , & + B6ADOF30Rdt , B6ADOF30V , B6ADOF30Wvs , B6ADOF31A , B6ADOF31Add , B6ADOF31D , B6ADOF31Hds , & + B6ADOF31Rdt , B6ADOF31V , B6ADOF31Wvs , B6ADOF32A , B6ADOF32Add , B6ADOF32D , B6ADOF32Hds , & + B6ADOF32Rdt , B6ADOF32V , B6ADOF32Wvs , B6ADOF33A , B6ADOF33Add , B6ADOF33D , B6ADOF33Hds , & + B6ADOF33Rdt , B6ADOF33V , B6ADOF33Wvs , B6ADOF34A , B6ADOF34Add , B6ADOF34D , B6ADOF34Hds , & + B6ADOF34Rdt , B6ADOF34V , B6ADOF34Wvs , B6ADOF35A , B6ADOF35Add , B6ADOF35D , B6ADOF35Hds , & + B6ADOF35Rdt , B6ADOF35V , B6ADOF35Wvs , B6ADOF36A , B6ADOF36Add , B6ADOF36D , B6ADOF36Hds , & + B6ADOF36Rdt , B6ADOF36V , B6ADOF36Wvs , B6ADOF37A , B6ADOF37Add , B6ADOF37D , B6ADOF37Hds , & + B6ADOF37Rdt , B6ADOF37V , B6ADOF37Wvs , B6ADOF38A , B6ADOF38Add , B6ADOF38D , B6ADOF38Hds , & + B6ADOF38Rdt , B6ADOF38V , B6ADOF38Wvs , B6ADOF39A , B6ADOF39Add , B6ADOF39D , B6ADOF39Hds , & + B6ADOF39Rdt , B6ADOF39V , B6ADOF39Wvs , B6ADOF3A , B6ADOF3Add , B6ADOF3D , B6ADOF3Hds , & + B6ADOF3Rdt , B6ADOF3V , B6ADOF3Wvs , B6ADOF40A , B6ADOF40Add , B6ADOF40D , B6ADOF40Hds , & + B6ADOF40Rdt , B6ADOF40V , B6ADOF40Wvs , B6ADOF41A , B6ADOF41Add , B6ADOF41D , B6ADOF41Hds , & + B6ADOF41Rdt , B6ADOF41V , B6ADOF41Wvs , B6ADOF42A , B6ADOF42Add , B6ADOF42D , B6ADOF42Hds , & + B6ADOF42Rdt , B6ADOF42V , B6ADOF42Wvs , B6ADOF43A , B6ADOF43Add , B6ADOF43D , B6ADOF43Hds , & + B6ADOF43Rdt , B6ADOF43V , B6ADOF43Wvs , B6ADOF44A , B6ADOF44Add , B6ADOF44D , B6ADOF44Hds , & + B6ADOF44Rdt , B6ADOF44V , B6ADOF44Wvs , B6ADOF45A , B6ADOF45Add , B6ADOF45D , B6ADOF45Hds , & + B6ADOF45Rdt , B6ADOF45V , B6ADOF45Wvs , B6ADOF46A , B6ADOF46Add , B6ADOF46D , B6ADOF46Hds , & + B6ADOF46Rdt , B6ADOF46V , B6ADOF46Wvs , B6ADOF47A , B6ADOF47Add , B6ADOF47D , B6ADOF47Hds , & + B6ADOF47Rdt , B6ADOF47V , B6ADOF47Wvs , B6ADOF48A , B6ADOF48Add , B6ADOF48D , B6ADOF48Hds , & + B6ADOF48Rdt , B6ADOF48V , B6ADOF48Wvs , B6ADOF49A , B6ADOF49Add , B6ADOF49D , B6ADOF49Hds , & + B6ADOF49Rdt , B6ADOF49V , B6ADOF49Wvs , B6ADOF4A , B6ADOF4Add , B6ADOF4D , B6ADOF4Hds , & + B6ADOF4Rdt , B6ADOF4V , B6ADOF4Wvs , B6ADOF50A , B6ADOF50Add , B6ADOF50D , B6ADOF50Hds , & + B6ADOF50Rdt , B6ADOF50V , B6ADOF50Wvs , B6ADOF51A , B6ADOF51Add , B6ADOF51D , B6ADOF51Hds , & + B6ADOF51Rdt , B6ADOF51V , B6ADOF51Wvs , B6ADOF52A , B6ADOF52Add , B6ADOF52D , B6ADOF52Hds , & + B6ADOF52Rdt , B6ADOF52V , B6ADOF52Wvs , B6ADOF53A , B6ADOF53Add , B6ADOF53D , B6ADOF53Hds , & + B6ADOF53Rdt , B6ADOF53V , B6ADOF53Wvs , B6ADOF54A , B6ADOF54Add , B6ADOF54D , B6ADOF54Hds , & + B6ADOF54Rdt , B6ADOF54V , B6ADOF54Wvs , B6ADOF55A , B6ADOF55Add , B6ADOF55D , B6ADOF55Hds , & + B6ADOF55Rdt , B6ADOF55V , B6ADOF55Wvs , B6ADOF56A , B6ADOF56Add , B6ADOF56D , B6ADOF56Hds , & + B6ADOF56Rdt , B6ADOF56V , B6ADOF56Wvs , B6ADOF57A , B6ADOF57Add , B6ADOF57D , B6ADOF57Hds , & + B6ADOF57Rdt , B6ADOF57V , B6ADOF57Wvs , B6ADOF58A , B6ADOF58Add , B6ADOF58D , B6ADOF58Hds , & + B6ADOF58Rdt , B6ADOF58V , B6ADOF58Wvs , B6ADOF59A , B6ADOF59Add , B6ADOF59D , B6ADOF59Hds , & + B6ADOF59Rdt , B6ADOF59V , B6ADOF59Wvs , B6ADOF5A , B6ADOF5Add , B6ADOF5D , B6ADOF5Hds , & + B6ADOF5Rdt , B6ADOF5V , B6ADOF5Wvs , B6ADOF60A , B6ADOF60Add , B6ADOF60D , B6ADOF60Hds , & + B6ADOF60Rdt , B6ADOF60V , B6ADOF60Wvs , B6ADOF61A , B6ADOF61Add , B6ADOF61D , B6ADOF61Hds , & + B6ADOF61Rdt , B6ADOF61V , B6ADOF61Wvs , B6ADOF62A , B6ADOF62Add , B6ADOF62D , B6ADOF62Hds , & + B6ADOF62Rdt , B6ADOF62V , B6ADOF62Wvs , B6ADOF63A , B6ADOF63Add , B6ADOF63D , B6ADOF63Hds , & + B6ADOF63Rdt , B6ADOF63V , B6ADOF63Wvs , B6ADOF64A , B6ADOF64Add , B6ADOF64D , B6ADOF64Hds , & + B6ADOF64Rdt , B6ADOF64V , B6ADOF64Wvs , B6ADOF65A , B6ADOF65Add , B6ADOF65D , B6ADOF65Hds , & + B6ADOF65Rdt , B6ADOF65V , B6ADOF65Wvs , B6ADOF66A , B6ADOF66Add , B6ADOF66D , B6ADOF66Hds , & + B6ADOF66Rdt , B6ADOF66V , B6ADOF66Wvs , B6ADOF67A , B6ADOF67Add , B6ADOF67D , B6ADOF67Hds , & + B6ADOF67Rdt , B6ADOF67V , B6ADOF67Wvs , B6ADOF68A , B6ADOF68Add , B6ADOF68D , B6ADOF68Hds , & + B6ADOF68Rdt , B6ADOF68V , B6ADOF68Wvs , B6ADOF69A , B6ADOF69Add , B6ADOF69D , B6ADOF69Hds , & + B6ADOF69Rdt , B6ADOF69V , B6ADOF69Wvs , B6ADOF6A , B6ADOF6Add , B6ADOF6D , B6ADOF6Hds , & + B6ADOF6Rdt , B6ADOF6V , B6ADOF6Wvs , B6ADOF70A , B6ADOF70Add , B6ADOF70D , B6ADOF70Hds , & + B6ADOF70Rdt , B6ADOF70V , B6ADOF70Wvs , B6ADOF71A , B6ADOF71Add , B6ADOF71D , B6ADOF71Hds , & + B6ADOF71Rdt , B6ADOF71V , B6ADOF71Wvs , B6ADOF72A , B6ADOF72Add , B6ADOF72D , B6ADOF72Hds , & + B6ADOF72Rdt , B6ADOF72V , B6ADOF72Wvs , B6ADOF73A , B6ADOF73Add , B6ADOF73D , B6ADOF73Hds , & + B6ADOF73Rdt , B6ADOF73V , B6ADOF73Wvs , B6ADOF74A , B6ADOF74Add , B6ADOF74D , B6ADOF74Hds , & + B6ADOF74Rdt , B6ADOF74V , B6ADOF74Wvs , B6ADOF75A , B6ADOF75Add , B6ADOF75D , B6ADOF75Hds , & + B6ADOF75Rdt , B6ADOF75V , B6ADOF75Wvs , B6ADOF76A , B6ADOF76Add , B6ADOF76D , B6ADOF76Hds , & + B6ADOF76Rdt , B6ADOF76V , B6ADOF76Wvs , B6ADOF77A , B6ADOF77Add , B6ADOF77D , B6ADOF77Hds , & + B6ADOF77Rdt , B6ADOF77V , B6ADOF77Wvs , B6ADOF78A , B6ADOF78Add , B6ADOF78D , B6ADOF78Hds , & + B6ADOF78Rdt , B6ADOF78V , B6ADOF78Wvs , B6ADOF79A , B6ADOF79Add , B6ADOF79D , B6ADOF79Hds , & + B6ADOF79Rdt , B6ADOF79V , B6ADOF79Wvs , B6ADOF7A , B6ADOF7Add , B6ADOF7D , B6ADOF7Hds , & + B6ADOF7Rdt , B6ADOF7V , B6ADOF7Wvs , B6ADOF80A , B6ADOF80Add , B6ADOF80D , B6ADOF80Hds , & + B6ADOF80Rdt , B6ADOF80V , B6ADOF80Wvs , B6ADOF81A , B6ADOF81Add , B6ADOF81D , B6ADOF81Hds , & + B6ADOF81Rdt , B6ADOF81V , B6ADOF81Wvs , B6ADOF82A , B6ADOF82Add , B6ADOF82D , B6ADOF82Hds , & + B6ADOF82Rdt , B6ADOF82V , B6ADOF82Wvs , B6ADOF83A , B6ADOF83Add , B6ADOF83D , B6ADOF83Hds , & + B6ADOF83Rdt , B6ADOF83V , B6ADOF83Wvs , B6ADOF84A , B6ADOF84Add , B6ADOF84D , B6ADOF84Hds , & + B6ADOF84Rdt , B6ADOF84V , B6ADOF84Wvs , B6ADOF85A , B6ADOF85Add , B6ADOF85D , B6ADOF85Hds , & + B6ADOF85Rdt , B6ADOF85V , B6ADOF85Wvs , B6ADOF86A , B6ADOF86Add , B6ADOF86D , B6ADOF86Hds , & + B6ADOF86Rdt , B6ADOF86V , B6ADOF86Wvs , B6ADOF87A , B6ADOF87Add , B6ADOF87D , B6ADOF87Hds , & + B6ADOF87Rdt , B6ADOF87V , B6ADOF87Wvs , B6ADOF88A , B6ADOF88Add , B6ADOF88D , B6ADOF88Hds , & + B6ADOF88Rdt , B6ADOF88V , B6ADOF88Wvs , B6ADOF89A , B6ADOF89Add , B6ADOF89D , B6ADOF89Hds , & + B6ADOF89Rdt , B6ADOF89V , B6ADOF89Wvs , B6ADOF8A , B6ADOF8Add , B6ADOF8D , B6ADOF8Hds , & + B6ADOF8Rdt , B6ADOF8V , B6ADOF8Wvs , B6ADOF90A , B6ADOF90Add , B6ADOF90D , B6ADOF90Hds , & + B6ADOF90Rdt , B6ADOF90V , B6ADOF90Wvs , B6ADOF91A , B6ADOF91Add , B6ADOF91D , B6ADOF91Hds , & + B6ADOF91Rdt , B6ADOF91V , B6ADOF91Wvs , B6ADOF92A , B6ADOF92Add , B6ADOF92D , B6ADOF92Hds , & + B6ADOF92Rdt , B6ADOF92V , B6ADOF92Wvs , B6ADOF93A , B6ADOF93Add , B6ADOF93D , B6ADOF93Hds , & + B6ADOF93Rdt , B6ADOF93V , B6ADOF93Wvs , B6ADOF94A , B6ADOF94Add , B6ADOF94D , B6ADOF94Hds , & + B6ADOF94Rdt , B6ADOF94V , B6ADOF94Wvs , B6ADOF95A , B6ADOF95Add , B6ADOF95D , B6ADOF95Hds , & + B6ADOF95Rdt , B6ADOF95V , B6ADOF95Wvs , B6ADOF96A , B6ADOF96Add , B6ADOF96D , B6ADOF96Hds , & + B6ADOF96Rdt , B6ADOF96V , B6ADOF96Wvs , B6ADOF97A , B6ADOF97Add , B6ADOF97D , B6ADOF97Hds , & + B6ADOF97Rdt , B6ADOF97V , B6ADOF97Wvs , B6ADOF98A , B6ADOF98Add , B6ADOF98D , B6ADOF98Hds , & + B6ADOF98Rdt , B6ADOF98V , B6ADOF98Wvs , B6ADOF99A , B6ADOF99Add , B6ADOF99D , B6ADOF99Hds , & + B6ADOF99Rdt , B6ADOF99V , B6ADOF99Wvs , B6ADOF9A , B6ADOF9Add , B6ADOF9D , B6ADOF9Hds , & + B6ADOF9Rdt , B6ADOF9V , B6ADOF9Wvs , B6HdSFxi , B6HdSFyi , B6HdSFzi , B6HdSMxi , & + B6HdSMyi , B6HdSMzi , B6Heave , B6Pitch , B6RAxi , B6RAyi , B6RAzi , & + B6RdtFxi , B6RdtFyi , B6RdtFzi , B6RdtMxi , B6RdtMyi , B6RdtMzi , B6Roll , & + B6RVxi , B6RVyi , B6RVzi , B6Surge , B6Sway , B6TAxi , B6TAyi , & + B6TAzi , B6TVxi , B6TVyi , B6TVzi , B6WvsF1xi , B6WvsF1yi , B6WvsF1zi , & + B6WvsF2xi , B6WvsF2yi , B6WvsF2zi , B6WvsFxi , B6WvsFyi , B6WvsFzi , B6WvsM1xi , & + B6WvsM1yi , B6WvsM1zi , B6WvsM2xi , B6WvsM2yi , B6WvsM2zi , B6WvsMxi , B6WvsMyi , & + B6WvsMzi , B6Yaw , B7AddFxi , B7AddFyi , B7AddFzi , B7AddMxi , B7AddMyi , & + B7AddMzi , B7ADOF10A , B7ADOF10Add , B7ADOF10D , B7ADOF10Hds , B7ADOF10Rdt , B7ADOF10V , & + B7ADOF10Wvs , B7ADOF11A , B7ADOF11Add , B7ADOF11D , B7ADOF11Hds , B7ADOF11Rdt , B7ADOF11V , & + B7ADOF11Wvs , B7ADOF12A , B7ADOF12Add , B7ADOF12D , B7ADOF12Hds , B7ADOF12Rdt , B7ADOF12V , & + B7ADOF12Wvs , B7ADOF13A , B7ADOF13Add , B7ADOF13D , B7ADOF13Hds , B7ADOF13Rdt , B7ADOF13V , & + B7ADOF13Wvs , B7ADOF14A , B7ADOF14Add , B7ADOF14D , B7ADOF14Hds , B7ADOF14Rdt , B7ADOF14V , & + B7ADOF14Wvs , B7ADOF15A , B7ADOF15Add , B7ADOF15D , B7ADOF15Hds , B7ADOF15Rdt , B7ADOF15V , & + B7ADOF15Wvs , B7ADOF16A , B7ADOF16Add , B7ADOF16D , B7ADOF16Hds , B7ADOF16Rdt , B7ADOF16V , & + B7ADOF16Wvs , B7ADOF17A , B7ADOF17Add , B7ADOF17D , B7ADOF17Hds , B7ADOF17Rdt , B7ADOF17V , & + B7ADOF17Wvs , B7ADOF18A , B7ADOF18Add , B7ADOF18D , B7ADOF18Hds , B7ADOF18Rdt , B7ADOF18V , & + B7ADOF18Wvs , B7ADOF19A , B7ADOF19Add , B7ADOF19D , B7ADOF19Hds , B7ADOF19Rdt , B7ADOF19V , & + B7ADOF19Wvs , B7ADOF1A , B7ADOF1Add , B7ADOF1D , B7ADOF1Hds , B7ADOF1Rdt , B7ADOF1V , & + B7ADOF1Wvs , B7ADOF20A , B7ADOF20Add , B7ADOF20D , B7ADOF20Hds , B7ADOF20Rdt , B7ADOF20V , & + B7ADOF20Wvs , B7ADOF21A , B7ADOF21Add , B7ADOF21D , B7ADOF21Hds , B7ADOF21Rdt , B7ADOF21V , & + B7ADOF21Wvs , B7ADOF22A , B7ADOF22Add , B7ADOF22D , B7ADOF22Hds , B7ADOF22Rdt , B7ADOF22V , & + B7ADOF22Wvs , B7ADOF23A , B7ADOF23Add , B7ADOF23D , B7ADOF23Hds , B7ADOF23Rdt , B7ADOF23V , & + B7ADOF23Wvs , B7ADOF24A , B7ADOF24Add , B7ADOF24D , B7ADOF24Hds , B7ADOF24Rdt , B7ADOF24V , & + B7ADOF24Wvs , B7ADOF25A , B7ADOF25Add , B7ADOF25D , B7ADOF25Hds , B7ADOF25Rdt , B7ADOF25V , & + B7ADOF25Wvs , B7ADOF26A , B7ADOF26Add , B7ADOF26D , B7ADOF26Hds , B7ADOF26Rdt , B7ADOF26V , & + B7ADOF26Wvs , B7ADOF27A , B7ADOF27Add , B7ADOF27D , B7ADOF27Hds , B7ADOF27Rdt , B7ADOF27V , & + B7ADOF27Wvs , B7ADOF28A , B7ADOF28Add , B7ADOF28D , B7ADOF28Hds , B7ADOF28Rdt , B7ADOF28V , & + B7ADOF28Wvs , B7ADOF29A , B7ADOF29Add , B7ADOF29D , B7ADOF29Hds , B7ADOF29Rdt , B7ADOF29V , & + B7ADOF29Wvs , B7ADOF2A , B7ADOF2Add , B7ADOF2D , B7ADOF2Hds , B7ADOF2Rdt , B7ADOF2V , & + B7ADOF2Wvs , B7ADOF30A , B7ADOF30Add , B7ADOF30D , B7ADOF30Hds , B7ADOF30Rdt , B7ADOF30V , & + B7ADOF30Wvs , B7ADOF31A , B7ADOF31Add , B7ADOF31D , B7ADOF31Hds , B7ADOF31Rdt , B7ADOF31V , & + B7ADOF31Wvs , B7ADOF32A , B7ADOF32Add , B7ADOF32D , B7ADOF32Hds , B7ADOF32Rdt , B7ADOF32V , & + B7ADOF32Wvs , B7ADOF33A , B7ADOF33Add , B7ADOF33D , B7ADOF33Hds , B7ADOF33Rdt , B7ADOF33V , & + B7ADOF33Wvs , B7ADOF34A , B7ADOF34Add , B7ADOF34D , B7ADOF34Hds , B7ADOF34Rdt , B7ADOF34V , & + B7ADOF34Wvs , B7ADOF35A , B7ADOF35Add , B7ADOF35D , B7ADOF35Hds , B7ADOF35Rdt , B7ADOF35V , & + B7ADOF35Wvs , B7ADOF36A , B7ADOF36Add , B7ADOF36D , B7ADOF36Hds , B7ADOF36Rdt , B7ADOF36V , & + B7ADOF36Wvs , B7ADOF37A , B7ADOF37Add , B7ADOF37D , B7ADOF37Hds , B7ADOF37Rdt , B7ADOF37V , & + B7ADOF37Wvs , B7ADOF38A , B7ADOF38Add , B7ADOF38D , B7ADOF38Hds , B7ADOF38Rdt , B7ADOF38V , & + B7ADOF38Wvs , B7ADOF39A , B7ADOF39Add , B7ADOF39D , B7ADOF39Hds , B7ADOF39Rdt , B7ADOF39V , & + B7ADOF39Wvs , B7ADOF3A , B7ADOF3Add , B7ADOF3D , B7ADOF3Hds , B7ADOF3Rdt , B7ADOF3V , & + B7ADOF3Wvs , B7ADOF40A , B7ADOF40Add , B7ADOF40D , B7ADOF40Hds , B7ADOF40Rdt , B7ADOF40V , & + B7ADOF40Wvs , B7ADOF41A , B7ADOF41Add , B7ADOF41D , B7ADOF41Hds , B7ADOF41Rdt , B7ADOF41V , & + B7ADOF41Wvs , B7ADOF42A , B7ADOF42Add , B7ADOF42D , B7ADOF42Hds , B7ADOF42Rdt , B7ADOF42V , & + B7ADOF42Wvs , B7ADOF43A , B7ADOF43Add , B7ADOF43D , B7ADOF43Hds , B7ADOF43Rdt , B7ADOF43V , & + B7ADOF43Wvs , B7ADOF44A , B7ADOF44Add , B7ADOF44D , B7ADOF44Hds , B7ADOF44Rdt , B7ADOF44V , & + B7ADOF44Wvs , B7ADOF45A , B7ADOF45Add , B7ADOF45D , B7ADOF45Hds , B7ADOF45Rdt , B7ADOF45V , & + B7ADOF45Wvs , B7ADOF46A , B7ADOF46Add , B7ADOF46D , B7ADOF46Hds , B7ADOF46Rdt , B7ADOF46V , & + B7ADOF46Wvs , B7ADOF47A , B7ADOF47Add , B7ADOF47D , B7ADOF47Hds , B7ADOF47Rdt , B7ADOF47V , & + B7ADOF47Wvs , B7ADOF48A , B7ADOF48Add , B7ADOF48D , B7ADOF48Hds , B7ADOF48Rdt , B7ADOF48V , & + B7ADOF48Wvs , B7ADOF49A , B7ADOF49Add , B7ADOF49D , B7ADOF49Hds , B7ADOF49Rdt , B7ADOF49V , & + B7ADOF49Wvs , B7ADOF4A , B7ADOF4Add , B7ADOF4D , B7ADOF4Hds , B7ADOF4Rdt , B7ADOF4V , & + B7ADOF4Wvs , B7ADOF50A , B7ADOF50Add , B7ADOF50D , B7ADOF50Hds , B7ADOF50Rdt , B7ADOF50V , & + B7ADOF50Wvs , B7ADOF51A , B7ADOF51Add , B7ADOF51D , B7ADOF51Hds , B7ADOF51Rdt , B7ADOF51V , & + B7ADOF51Wvs , B7ADOF52A , B7ADOF52Add , B7ADOF52D , B7ADOF52Hds , B7ADOF52Rdt , B7ADOF52V , & + B7ADOF52Wvs , B7ADOF53A , B7ADOF53Add , B7ADOF53D , B7ADOF53Hds , B7ADOF53Rdt , B7ADOF53V , & + B7ADOF53Wvs , B7ADOF54A , B7ADOF54Add , B7ADOF54D , B7ADOF54Hds , B7ADOF54Rdt , B7ADOF54V , & + B7ADOF54Wvs , B7ADOF55A , B7ADOF55Add , B7ADOF55D , B7ADOF55Hds , B7ADOF55Rdt , B7ADOF55V , & + B7ADOF55Wvs , B7ADOF56A , B7ADOF56Add , B7ADOF56D , B7ADOF56Hds , B7ADOF56Rdt , B7ADOF56V , & + B7ADOF56Wvs , B7ADOF57A , B7ADOF57Add , B7ADOF57D , B7ADOF57Hds , B7ADOF57Rdt , B7ADOF57V , & + B7ADOF57Wvs , B7ADOF58A , B7ADOF58Add , B7ADOF58D , B7ADOF58Hds , B7ADOF58Rdt , B7ADOF58V , & + B7ADOF58Wvs , B7ADOF59A , B7ADOF59Add , B7ADOF59D , B7ADOF59Hds , B7ADOF59Rdt , B7ADOF59V , & + B7ADOF59Wvs , B7ADOF5A , B7ADOF5Add , B7ADOF5D , B7ADOF5Hds , B7ADOF5Rdt , B7ADOF5V , & + B7ADOF5Wvs , B7ADOF60A , B7ADOF60Add , B7ADOF60D , B7ADOF60Hds , B7ADOF60Rdt , B7ADOF60V , & + B7ADOF60Wvs , B7ADOF61A , B7ADOF61Add , B7ADOF61D , B7ADOF61Hds , B7ADOF61Rdt , B7ADOF61V , & + B7ADOF61Wvs , B7ADOF62A , B7ADOF62Add , B7ADOF62D , B7ADOF62Hds , B7ADOF62Rdt , B7ADOF62V , & + B7ADOF62Wvs , B7ADOF63A , B7ADOF63Add , B7ADOF63D , B7ADOF63Hds , B7ADOF63Rdt , B7ADOF63V , & + B7ADOF63Wvs , B7ADOF64A , B7ADOF64Add , B7ADOF64D , B7ADOF64Hds , B7ADOF64Rdt , B7ADOF64V , & + B7ADOF64Wvs , B7ADOF65A , B7ADOF65Add , B7ADOF65D , B7ADOF65Hds , B7ADOF65Rdt , B7ADOF65V , & + B7ADOF65Wvs , B7ADOF66A , B7ADOF66Add , B7ADOF66D , B7ADOF66Hds , B7ADOF66Rdt , B7ADOF66V , & + B7ADOF66Wvs , B7ADOF67A , B7ADOF67Add , B7ADOF67D , B7ADOF67Hds , B7ADOF67Rdt , B7ADOF67V , & + B7ADOF67Wvs , B7ADOF68A , B7ADOF68Add , B7ADOF68D , B7ADOF68Hds , B7ADOF68Rdt , B7ADOF68V , & + B7ADOF68Wvs , B7ADOF69A , B7ADOF69Add , B7ADOF69D , B7ADOF69Hds , B7ADOF69Rdt , B7ADOF69V , & + B7ADOF69Wvs , B7ADOF6A , B7ADOF6Add , B7ADOF6D , B7ADOF6Hds , B7ADOF6Rdt , B7ADOF6V , & + B7ADOF6Wvs , B7ADOF70A , B7ADOF70Add , B7ADOF70D , B7ADOF70Hds , B7ADOF70Rdt , B7ADOF70V , & + B7ADOF70Wvs , B7ADOF71A , B7ADOF71Add , B7ADOF71D , B7ADOF71Hds , B7ADOF71Rdt , B7ADOF71V , & + B7ADOF71Wvs , B7ADOF72A , B7ADOF72Add , B7ADOF72D , B7ADOF72Hds , B7ADOF72Rdt , B7ADOF72V , & + B7ADOF72Wvs , B7ADOF73A , B7ADOF73Add , B7ADOF73D , B7ADOF73Hds , B7ADOF73Rdt , B7ADOF73V , & + B7ADOF73Wvs , B7ADOF74A , B7ADOF74Add , B7ADOF74D , B7ADOF74Hds , B7ADOF74Rdt , B7ADOF74V , & + B7ADOF74Wvs , B7ADOF75A , B7ADOF75Add , B7ADOF75D , B7ADOF75Hds , B7ADOF75Rdt , B7ADOF75V , & + B7ADOF75Wvs , B7ADOF76A , B7ADOF76Add , B7ADOF76D , B7ADOF76Hds , B7ADOF76Rdt , B7ADOF76V , & + B7ADOF76Wvs , B7ADOF77A , B7ADOF77Add , B7ADOF77D , B7ADOF77Hds , B7ADOF77Rdt , B7ADOF77V , & + B7ADOF77Wvs , B7ADOF78A , B7ADOF78Add , B7ADOF78D , B7ADOF78Hds , B7ADOF78Rdt , B7ADOF78V , & + B7ADOF78Wvs , B7ADOF79A , B7ADOF79Add , B7ADOF79D , B7ADOF79Hds , B7ADOF79Rdt , B7ADOF79V , & + B7ADOF79Wvs , B7ADOF7A , B7ADOF7Add , B7ADOF7D , B7ADOF7Hds , B7ADOF7Rdt , B7ADOF7V , & + B7ADOF7Wvs , B7ADOF80A , B7ADOF80Add , B7ADOF80D , B7ADOF80Hds , B7ADOF80Rdt , B7ADOF80V , & + B7ADOF80Wvs , B7ADOF81A , B7ADOF81Add , B7ADOF81D , B7ADOF81Hds , B7ADOF81Rdt , B7ADOF81V , & + B7ADOF81Wvs , B7ADOF82A , B7ADOF82Add , B7ADOF82D , B7ADOF82Hds , B7ADOF82Rdt , B7ADOF82V , & + B7ADOF82Wvs , B7ADOF83A , B7ADOF83Add , B7ADOF83D , B7ADOF83Hds , B7ADOF83Rdt , B7ADOF83V , & + B7ADOF83Wvs , B7ADOF84A , B7ADOF84Add , B7ADOF84D , B7ADOF84Hds , B7ADOF84Rdt , B7ADOF84V /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry4(1686) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + B7ADOF84Wvs , B7ADOF85A , B7ADOF85Add , B7ADOF85D , B7ADOF85Hds , B7ADOF85Rdt , B7ADOF85V , & + B7ADOF85Wvs , B7ADOF86A , B7ADOF86Add , B7ADOF86D , B7ADOF86Hds , B7ADOF86Rdt , B7ADOF86V , & + B7ADOF86Wvs , B7ADOF87A , B7ADOF87Add , B7ADOF87D , B7ADOF87Hds , B7ADOF87Rdt , B7ADOF87V , & + B7ADOF87Wvs , B7ADOF88A , B7ADOF88Add , B7ADOF88D , B7ADOF88Hds , B7ADOF88Rdt , B7ADOF88V , & + B7ADOF88Wvs , B7ADOF89A , B7ADOF89Add , B7ADOF89D , B7ADOF89Hds , B7ADOF89Rdt , B7ADOF89V , & + B7ADOF89Wvs , B7ADOF8A , B7ADOF8Add , B7ADOF8D , B7ADOF8Hds , B7ADOF8Rdt , B7ADOF8V , & + B7ADOF8Wvs , B7ADOF90A , B7ADOF90Add , B7ADOF90D , B7ADOF90Hds , B7ADOF90Rdt , B7ADOF90V , & + B7ADOF90Wvs , B7ADOF91A , B7ADOF91Add , B7ADOF91D , B7ADOF91Hds , B7ADOF91Rdt , B7ADOF91V , & + B7ADOF91Wvs , B7ADOF92A , B7ADOF92Add , B7ADOF92D , B7ADOF92Hds , B7ADOF92Rdt , B7ADOF92V , & + B7ADOF92Wvs , B7ADOF93A , B7ADOF93Add , B7ADOF93D , B7ADOF93Hds , B7ADOF93Rdt , B7ADOF93V , & + B7ADOF93Wvs , B7ADOF94A , B7ADOF94Add , B7ADOF94D , B7ADOF94Hds , B7ADOF94Rdt , B7ADOF94V , & + B7ADOF94Wvs , B7ADOF95A , B7ADOF95Add , B7ADOF95D , B7ADOF95Hds , B7ADOF95Rdt , B7ADOF95V , & + B7ADOF95Wvs , B7ADOF96A , B7ADOF96Add , B7ADOF96D , B7ADOF96Hds , B7ADOF96Rdt , B7ADOF96V , & + B7ADOF96Wvs , B7ADOF97A , B7ADOF97Add , B7ADOF97D , B7ADOF97Hds , B7ADOF97Rdt , B7ADOF97V , & + B7ADOF97Wvs , B7ADOF98A , B7ADOF98Add , B7ADOF98D , B7ADOF98Hds , B7ADOF98Rdt , B7ADOF98V , & + B7ADOF98Wvs , B7ADOF99A , B7ADOF99Add , B7ADOF99D , B7ADOF99Hds , B7ADOF99Rdt , B7ADOF99V , & + B7ADOF99Wvs , B7ADOF9A , B7ADOF9Add , B7ADOF9D , B7ADOF9Hds , B7ADOF9Rdt , B7ADOF9V , & + B7ADOF9Wvs , B7HdSFxi , B7HdSFyi , B7HdSFzi , B7HdSMxi , B7HdSMyi , B7HdSMzi , & + B7Heave , B7Pitch , B7RAxi , B7RAyi , B7RAzi , B7RdtFxi , B7RdtFyi , & + B7RdtFzi , B7RdtMxi , B7RdtMyi , B7RdtMzi , B7Roll , B7RVxi , B7RVyi , & + B7RVzi , B7Surge , B7Sway , B7TAxi , B7TAyi , B7TAzi , B7TVxi , & + B7TVyi , B7TVzi , B7WvsF1xi , B7WvsF1yi , B7WvsF1zi , B7WvsF2xi , B7WvsF2yi , & + B7WvsF2zi , B7WvsFxi , B7WvsFyi , B7WvsFzi , B7WvsM1xi , B7WvsM1yi , B7WvsM1zi , & + B7WvsM2xi , B7WvsM2yi , B7WvsM2zi , B7WvsMxi , B7WvsMyi , B7WvsMzi , B7Yaw , & + B8AddFxi , B8AddFyi , B8AddFzi , B8AddMxi , B8AddMyi , B8AddMzi , B8ADOF10A , & + B8ADOF10Add , B8ADOF10D , B8ADOF10Hds , B8ADOF10Rdt , B8ADOF10V , B8ADOF10Wvs , B8ADOF11A , & + B8ADOF11Add , B8ADOF11D , B8ADOF11Hds , B8ADOF11Rdt , B8ADOF11V , B8ADOF11Wvs , B8ADOF12A , & + B8ADOF12Add , B8ADOF12D , B8ADOF12Hds , B8ADOF12Rdt , B8ADOF12V , B8ADOF12Wvs , B8ADOF13A , & + B8ADOF13Add , B8ADOF13D , B8ADOF13Hds , B8ADOF13Rdt , B8ADOF13V , B8ADOF13Wvs , B8ADOF14A , & + B8ADOF14Add , B8ADOF14D , B8ADOF14Hds , B8ADOF14Rdt , B8ADOF14V , B8ADOF14Wvs , B8ADOF15A , & + B8ADOF15Add , B8ADOF15D , B8ADOF15Hds , B8ADOF15Rdt , B8ADOF15V , B8ADOF15Wvs , B8ADOF16A , & + B8ADOF16Add , B8ADOF16D , B8ADOF16Hds , B8ADOF16Rdt , B8ADOF16V , B8ADOF16Wvs , B8ADOF17A , & + B8ADOF17Add , B8ADOF17D , B8ADOF17Hds , B8ADOF17Rdt , B8ADOF17V , B8ADOF17Wvs , B8ADOF18A , & + B8ADOF18Add , B8ADOF18D , B8ADOF18Hds , B8ADOF18Rdt , B8ADOF18V , B8ADOF18Wvs , B8ADOF19A , & + B8ADOF19Add , B8ADOF19D , B8ADOF19Hds , B8ADOF19Rdt , B8ADOF19V , B8ADOF19Wvs , B8ADOF1A , & + B8ADOF1Add , B8ADOF1D , B8ADOF1Hds , B8ADOF1Rdt , B8ADOF1V , B8ADOF1Wvs , B8ADOF20A , & + B8ADOF20Add , B8ADOF20D , B8ADOF20Hds , B8ADOF20Rdt , B8ADOF20V , B8ADOF20Wvs , B8ADOF21A , & + B8ADOF21Add , B8ADOF21D , B8ADOF21Hds , B8ADOF21Rdt , B8ADOF21V , B8ADOF21Wvs , B8ADOF22A , & + B8ADOF22Add , B8ADOF22D , B8ADOF22Hds , B8ADOF22Rdt , B8ADOF22V , B8ADOF22Wvs , B8ADOF23A , & + B8ADOF23Add , B8ADOF23D , B8ADOF23Hds , B8ADOF23Rdt , B8ADOF23V , B8ADOF23Wvs , B8ADOF24A , & + B8ADOF24Add , B8ADOF24D , B8ADOF24Hds , B8ADOF24Rdt , B8ADOF24V , B8ADOF24Wvs , B8ADOF25A , & + B8ADOF25Add , B8ADOF25D , B8ADOF25Hds , B8ADOF25Rdt , B8ADOF25V , B8ADOF25Wvs , B8ADOF26A , & + B8ADOF26Add , B8ADOF26D , B8ADOF26Hds , B8ADOF26Rdt , B8ADOF26V , B8ADOF26Wvs , B8ADOF27A , & + B8ADOF27Add , B8ADOF27D , B8ADOF27Hds , B8ADOF27Rdt , B8ADOF27V , B8ADOF27Wvs , B8ADOF28A , & + B8ADOF28Add , B8ADOF28D , B8ADOF28Hds , B8ADOF28Rdt , B8ADOF28V , B8ADOF28Wvs , B8ADOF29A , & + B8ADOF29Add , B8ADOF29D , B8ADOF29Hds , B8ADOF29Rdt , B8ADOF29V , B8ADOF29Wvs , B8ADOF2A , & + B8ADOF2Add , B8ADOF2D , B8ADOF2Hds , B8ADOF2Rdt , B8ADOF2V , B8ADOF2Wvs , B8ADOF30A , & + B8ADOF30Add , B8ADOF30D , B8ADOF30Hds , B8ADOF30Rdt , B8ADOF30V , B8ADOF30Wvs , B8ADOF31A , & + B8ADOF31Add , B8ADOF31D , B8ADOF31Hds , B8ADOF31Rdt , B8ADOF31V , B8ADOF31Wvs , B8ADOF32A , & + B8ADOF32Add , B8ADOF32D , B8ADOF32Hds , B8ADOF32Rdt , B8ADOF32V , B8ADOF32Wvs , B8ADOF33A , & + B8ADOF33Add , B8ADOF33D , B8ADOF33Hds , B8ADOF33Rdt , B8ADOF33V , B8ADOF33Wvs , B8ADOF34A , & + B8ADOF34Add , B8ADOF34D , B8ADOF34Hds , B8ADOF34Rdt , B8ADOF34V , B8ADOF34Wvs , B8ADOF35A , & + B8ADOF35Add , B8ADOF35D , B8ADOF35Hds , B8ADOF35Rdt , B8ADOF35V , B8ADOF35Wvs , B8ADOF36A , & + B8ADOF36Add , B8ADOF36D , B8ADOF36Hds , B8ADOF36Rdt , B8ADOF36V , B8ADOF36Wvs , B8ADOF37A , & + B8ADOF37Add , B8ADOF37D , B8ADOF37Hds , B8ADOF37Rdt , B8ADOF37V , B8ADOF37Wvs , B8ADOF38A , & + B8ADOF38Add , B8ADOF38D , B8ADOF38Hds , B8ADOF38Rdt , B8ADOF38V , B8ADOF38Wvs , B8ADOF39A , & + B8ADOF39Add , B8ADOF39D , B8ADOF39Hds , B8ADOF39Rdt , B8ADOF39V , B8ADOF39Wvs , B8ADOF3A , & + B8ADOF3Add , B8ADOF3D , B8ADOF3Hds , B8ADOF3Rdt , B8ADOF3V , B8ADOF3Wvs , B8ADOF40A , & + B8ADOF40Add , B8ADOF40D , B8ADOF40Hds , B8ADOF40Rdt , B8ADOF40V , B8ADOF40Wvs , B8ADOF41A , & + B8ADOF41Add , B8ADOF41D , B8ADOF41Hds , B8ADOF41Rdt , B8ADOF41V , B8ADOF41Wvs , B8ADOF42A , & + B8ADOF42Add , B8ADOF42D , B8ADOF42Hds , B8ADOF42Rdt , B8ADOF42V , B8ADOF42Wvs , B8ADOF43A , & + B8ADOF43Add , B8ADOF43D , B8ADOF43Hds , B8ADOF43Rdt , B8ADOF43V , B8ADOF43Wvs , B8ADOF44A , & + B8ADOF44Add , B8ADOF44D , B8ADOF44Hds , B8ADOF44Rdt , B8ADOF44V , B8ADOF44Wvs , B8ADOF45A , & + B8ADOF45Add , B8ADOF45D , B8ADOF45Hds , B8ADOF45Rdt , B8ADOF45V , B8ADOF45Wvs , B8ADOF46A , & + B8ADOF46Add , B8ADOF46D , B8ADOF46Hds , B8ADOF46Rdt , B8ADOF46V , B8ADOF46Wvs , B8ADOF47A , & + B8ADOF47Add , B8ADOF47D , B8ADOF47Hds , B8ADOF47Rdt , B8ADOF47V , B8ADOF47Wvs , B8ADOF48A , & + B8ADOF48Add , B8ADOF48D , B8ADOF48Hds , B8ADOF48Rdt , B8ADOF48V , B8ADOF48Wvs , B8ADOF49A , & + B8ADOF49Add , B8ADOF49D , B8ADOF49Hds , B8ADOF49Rdt , B8ADOF49V , B8ADOF49Wvs , B8ADOF4A , & + B8ADOF4Add , B8ADOF4D , B8ADOF4Hds , B8ADOF4Rdt , B8ADOF4V , B8ADOF4Wvs , B8ADOF50A , & + B8ADOF50Add , B8ADOF50D , B8ADOF50Hds , B8ADOF50Rdt , B8ADOF50V , B8ADOF50Wvs , B8ADOF51A , & + B8ADOF51Add , B8ADOF51D , B8ADOF51Hds , B8ADOF51Rdt , B8ADOF51V , B8ADOF51Wvs , B8ADOF52A , & + B8ADOF52Add , B8ADOF52D , B8ADOF52Hds , B8ADOF52Rdt , B8ADOF52V , B8ADOF52Wvs , B8ADOF53A , & + B8ADOF53Add , B8ADOF53D , B8ADOF53Hds , B8ADOF53Rdt , B8ADOF53V , B8ADOF53Wvs , B8ADOF54A , & + B8ADOF54Add , B8ADOF54D , B8ADOF54Hds , B8ADOF54Rdt , B8ADOF54V , B8ADOF54Wvs , B8ADOF55A , & + B8ADOF55Add , B8ADOF55D , B8ADOF55Hds , B8ADOF55Rdt , B8ADOF55V , B8ADOF55Wvs , B8ADOF56A , & + B8ADOF56Add , B8ADOF56D , B8ADOF56Hds , B8ADOF56Rdt , B8ADOF56V , B8ADOF56Wvs , B8ADOF57A , & + B8ADOF57Add , B8ADOF57D , B8ADOF57Hds , B8ADOF57Rdt , B8ADOF57V , B8ADOF57Wvs , B8ADOF58A , & + B8ADOF58Add , B8ADOF58D , B8ADOF58Hds , B8ADOF58Rdt , B8ADOF58V , B8ADOF58Wvs , B8ADOF59A , & + B8ADOF59Add , B8ADOF59D , B8ADOF59Hds , B8ADOF59Rdt , B8ADOF59V , B8ADOF59Wvs , B8ADOF5A , & + B8ADOF5Add , B8ADOF5D , B8ADOF5Hds , B8ADOF5Rdt , B8ADOF5V , B8ADOF5Wvs , B8ADOF60A , & + B8ADOF60Add , B8ADOF60D , B8ADOF60Hds , B8ADOF60Rdt , B8ADOF60V , B8ADOF60Wvs , B8ADOF61A , & + B8ADOF61Add , B8ADOF61D , B8ADOF61Hds , B8ADOF61Rdt , B8ADOF61V , B8ADOF61Wvs , B8ADOF62A , & + B8ADOF62Add , B8ADOF62D , B8ADOF62Hds , B8ADOF62Rdt , B8ADOF62V , B8ADOF62Wvs , B8ADOF63A , & + B8ADOF63Add , B8ADOF63D , B8ADOF63Hds , B8ADOF63Rdt , B8ADOF63V , B8ADOF63Wvs , B8ADOF64A , & + B8ADOF64Add , B8ADOF64D , B8ADOF64Hds , B8ADOF64Rdt , B8ADOF64V , B8ADOF64Wvs , B8ADOF65A , & + B8ADOF65Add , B8ADOF65D , B8ADOF65Hds , B8ADOF65Rdt , B8ADOF65V , B8ADOF65Wvs , B8ADOF66A , & + B8ADOF66Add , B8ADOF66D , B8ADOF66Hds , B8ADOF66Rdt , B8ADOF66V , B8ADOF66Wvs , B8ADOF67A , & + B8ADOF67Add , B8ADOF67D , B8ADOF67Hds , B8ADOF67Rdt , B8ADOF67V , B8ADOF67Wvs , B8ADOF68A , & + B8ADOF68Add , B8ADOF68D , B8ADOF68Hds , B8ADOF68Rdt , B8ADOF68V , B8ADOF68Wvs , B8ADOF69A , & + B8ADOF69Add , B8ADOF69D , B8ADOF69Hds , B8ADOF69Rdt , B8ADOF69V , B8ADOF69Wvs , B8ADOF6A , & + B8ADOF6Add , B8ADOF6D , B8ADOF6Hds , B8ADOF6Rdt , B8ADOF6V , B8ADOF6Wvs , B8ADOF70A , & + B8ADOF70Add , B8ADOF70D , B8ADOF70Hds , B8ADOF70Rdt , B8ADOF70V , B8ADOF70Wvs , B8ADOF71A , & + B8ADOF71Add , B8ADOF71D , B8ADOF71Hds , B8ADOF71Rdt , B8ADOF71V , B8ADOF71Wvs , B8ADOF72A , & + B8ADOF72Add , B8ADOF72D , B8ADOF72Hds , B8ADOF72Rdt , B8ADOF72V , B8ADOF72Wvs , B8ADOF73A , & + B8ADOF73Add , B8ADOF73D , B8ADOF73Hds , B8ADOF73Rdt , B8ADOF73V , B8ADOF73Wvs , B8ADOF74A , & + B8ADOF74Add , B8ADOF74D , B8ADOF74Hds , B8ADOF74Rdt , B8ADOF74V , B8ADOF74Wvs , B8ADOF75A , & + B8ADOF75Add , B8ADOF75D , B8ADOF75Hds , B8ADOF75Rdt , B8ADOF75V , B8ADOF75Wvs , B8ADOF76A , & + B8ADOF76Add , B8ADOF76D , B8ADOF76Hds , B8ADOF76Rdt , B8ADOF76V , B8ADOF76Wvs , B8ADOF77A , & + B8ADOF77Add , B8ADOF77D , B8ADOF77Hds , B8ADOF77Rdt , B8ADOF77V , B8ADOF77Wvs , B8ADOF78A , & + B8ADOF78Add , B8ADOF78D , B8ADOF78Hds , B8ADOF78Rdt , B8ADOF78V , B8ADOF78Wvs , B8ADOF79A , & + B8ADOF79Add , B8ADOF79D , B8ADOF79Hds , B8ADOF79Rdt , B8ADOF79V , B8ADOF79Wvs , B8ADOF7A , & + B8ADOF7Add , B8ADOF7D , B8ADOF7Hds , B8ADOF7Rdt , B8ADOF7V , B8ADOF7Wvs , B8ADOF80A , & + B8ADOF80Add , B8ADOF80D , B8ADOF80Hds , B8ADOF80Rdt , B8ADOF80V , B8ADOF80Wvs , B8ADOF81A , & + B8ADOF81Add , B8ADOF81D , B8ADOF81Hds , B8ADOF81Rdt , B8ADOF81V , B8ADOF81Wvs , B8ADOF82A , & + B8ADOF82Add , B8ADOF82D , B8ADOF82Hds , B8ADOF82Rdt , B8ADOF82V , B8ADOF82Wvs , B8ADOF83A , & + B8ADOF83Add , B8ADOF83D , B8ADOF83Hds , B8ADOF83Rdt , B8ADOF83V , B8ADOF83Wvs , B8ADOF84A , & + B8ADOF84Add , B8ADOF84D , B8ADOF84Hds , B8ADOF84Rdt , B8ADOF84V , B8ADOF84Wvs , B8ADOF85A , & + B8ADOF85Add , B8ADOF85D , B8ADOF85Hds , B8ADOF85Rdt , B8ADOF85V , B8ADOF85Wvs , B8ADOF86A , & + B8ADOF86Add , B8ADOF86D , B8ADOF86Hds , B8ADOF86Rdt , B8ADOF86V , B8ADOF86Wvs , B8ADOF87A , & + B8ADOF87Add , B8ADOF87D , B8ADOF87Hds , B8ADOF87Rdt , B8ADOF87V , B8ADOF87Wvs , B8ADOF88A , & + B8ADOF88Add , B8ADOF88D , B8ADOF88Hds , B8ADOF88Rdt , B8ADOF88V , B8ADOF88Wvs , B8ADOF89A , & + B8ADOF89Add , B8ADOF89D , B8ADOF89Hds , B8ADOF89Rdt , B8ADOF89V , B8ADOF89Wvs , B8ADOF8A , & + B8ADOF8Add , B8ADOF8D , B8ADOF8Hds , B8ADOF8Rdt , B8ADOF8V , B8ADOF8Wvs , B8ADOF90A , & + B8ADOF90Add , B8ADOF90D , B8ADOF90Hds , B8ADOF90Rdt , B8ADOF90V , B8ADOF90Wvs , B8ADOF91A , & + B8ADOF91Add , B8ADOF91D , B8ADOF91Hds , B8ADOF91Rdt , B8ADOF91V , B8ADOF91Wvs , B8ADOF92A , & + B8ADOF92Add , B8ADOF92D , B8ADOF92Hds , B8ADOF92Rdt , B8ADOF92V , B8ADOF92Wvs , B8ADOF93A , & + B8ADOF93Add , B8ADOF93D , B8ADOF93Hds , B8ADOF93Rdt , B8ADOF93V , B8ADOF93Wvs , B8ADOF94A , & + B8ADOF94Add , B8ADOF94D , B8ADOF94Hds , B8ADOF94Rdt , B8ADOF94V , B8ADOF94Wvs , B8ADOF95A , & + B8ADOF95Add , B8ADOF95D , B8ADOF95Hds , B8ADOF95Rdt , B8ADOF95V , B8ADOF95Wvs , B8ADOF96A , & + B8ADOF96Add , B8ADOF96D , B8ADOF96Hds , B8ADOF96Rdt , B8ADOF96V , B8ADOF96Wvs , B8ADOF97A , & + B8ADOF97Add , B8ADOF97D , B8ADOF97Hds , B8ADOF97Rdt , B8ADOF97V , B8ADOF97Wvs , B8ADOF98A , & + B8ADOF98Add , B8ADOF98D , B8ADOF98Hds , B8ADOF98Rdt , B8ADOF98V , B8ADOF98Wvs , B8ADOF99A , & + B8ADOF99Add , B8ADOF99D , B8ADOF99Hds , B8ADOF99Rdt , B8ADOF99V , B8ADOF99Wvs , B8ADOF9A , & + B8ADOF9Add , B8ADOF9D , B8ADOF9Hds , B8ADOF9Rdt , B8ADOF9V , B8ADOF9Wvs , B8HdSFxi , & + B8HdSFyi , B8HdSFzi , B8HdSMxi , B8HdSMyi , B8HdSMzi , B8Heave , B8Pitch , & + B8RAxi , B8RAyi , B8RAzi , B8RdtFxi , B8RdtFyi , B8RdtFzi , B8RdtMxi , & + B8RdtMyi , B8RdtMzi , B8Roll , B8RVxi , B8RVyi , B8RVzi , B8Surge , & + B8Sway , B8TAxi , B8TAyi , B8TAzi , B8TVxi , B8TVyi , B8TVzi , & + B8WvsF1xi , B8WvsF1yi , B8WvsF1zi , B8WvsF2xi , B8WvsF2yi , B8WvsF2zi , B8WvsFxi , & + B8WvsFyi , B8WvsFzi , B8WvsM1xi , B8WvsM1yi , B8WvsM1zi , B8WvsM2xi , B8WvsM2yi , & + B8WvsM2zi , B8WvsMxi , B8WvsMyi , B8WvsMzi , B8Yaw , B9AddFxi , B9AddFyi , & + B9AddFzi , B9AddMxi , B9AddMyi , B9AddMzi , B9ADOF10A , B9ADOF10Add , B9ADOF10D , & + B9ADOF10Hds , B9ADOF10Rdt , B9ADOF10V , B9ADOF10Wvs , B9ADOF11A , B9ADOF11Add , B9ADOF11D , & + B9ADOF11Hds , B9ADOF11Rdt , B9ADOF11V , B9ADOF11Wvs , B9ADOF12A , B9ADOF12Add , B9ADOF12D , & + B9ADOF12Hds , B9ADOF12Rdt , B9ADOF12V , B9ADOF12Wvs , B9ADOF13A , B9ADOF13Add , B9ADOF13D , & + B9ADOF13Hds , B9ADOF13Rdt , B9ADOF13V , B9ADOF13Wvs , B9ADOF14A , B9ADOF14Add , B9ADOF14D , & + B9ADOF14Hds , B9ADOF14Rdt , B9ADOF14V , B9ADOF14Wvs , B9ADOF15A , B9ADOF15Add , B9ADOF15D , & + B9ADOF15Hds , B9ADOF15Rdt , B9ADOF15V , B9ADOF15Wvs , B9ADOF16A , B9ADOF16Add , B9ADOF16D , & + B9ADOF16Hds , B9ADOF16Rdt , B9ADOF16V , B9ADOF16Wvs , B9ADOF17A , B9ADOF17Add , B9ADOF17D , & + B9ADOF17Hds , B9ADOF17Rdt , B9ADOF17V , B9ADOF17Wvs , B9ADOF18A , B9ADOF18Add , B9ADOF18D , & + B9ADOF18Hds , B9ADOF18Rdt , B9ADOF18V , B9ADOF18Wvs , B9ADOF19A , B9ADOF19Add , B9ADOF19D , & + B9ADOF19Hds , B9ADOF19Rdt , B9ADOF19V , B9ADOF19Wvs , B9ADOF1A , B9ADOF1Add , B9ADOF1D , & + B9ADOF1Hds , B9ADOF1Rdt , B9ADOF1V , B9ADOF1Wvs , B9ADOF20A , B9ADOF20Add , B9ADOF20D , & + B9ADOF20Hds , B9ADOF20Rdt , B9ADOF20V , B9ADOF20Wvs , B9ADOF21A , B9ADOF21Add , B9ADOF21D , & + B9ADOF21Hds , B9ADOF21Rdt , B9ADOF21V , B9ADOF21Wvs , B9ADOF22A , B9ADOF22Add , B9ADOF22D , & + B9ADOF22Hds , B9ADOF22Rdt , B9ADOF22V , B9ADOF22Wvs , B9ADOF23A , B9ADOF23Add , B9ADOF23D , & + B9ADOF23Hds , B9ADOF23Rdt , B9ADOF23V , B9ADOF23Wvs , B9ADOF24A , B9ADOF24Add , B9ADOF24D , & + B9ADOF24Hds , B9ADOF24Rdt , B9ADOF24V , B9ADOF24Wvs , B9ADOF25A , B9ADOF25Add , B9ADOF25D , & + B9ADOF25Hds , B9ADOF25Rdt , B9ADOF25V , B9ADOF25Wvs , B9ADOF26A , B9ADOF26Add , B9ADOF26D , & + B9ADOF26Hds , B9ADOF26Rdt , B9ADOF26V , B9ADOF26Wvs , B9ADOF27A , B9ADOF27Add , B9ADOF27D , & + B9ADOF27Hds , B9ADOF27Rdt , B9ADOF27V , B9ADOF27Wvs , B9ADOF28A , B9ADOF28Add , B9ADOF28D , & + B9ADOF28Hds , B9ADOF28Rdt , B9ADOF28V , B9ADOF28Wvs , B9ADOF29A , B9ADOF29Add , B9ADOF29D , & + B9ADOF29Hds , B9ADOF29Rdt , B9ADOF29V , B9ADOF29Wvs , B9ADOF2A , B9ADOF2Add , B9ADOF2D , & + B9ADOF2Hds , B9ADOF2Rdt , B9ADOF2V , B9ADOF2Wvs , B9ADOF30A , B9ADOF30Add , B9ADOF30D , & + B9ADOF30Hds , B9ADOF30Rdt , B9ADOF30V , B9ADOF30Wvs , B9ADOF31A , B9ADOF31Add , B9ADOF31D , & + B9ADOF31Hds , B9ADOF31Rdt , B9ADOF31V , B9ADOF31Wvs , B9ADOF32A , B9ADOF32Add , B9ADOF32D , & + B9ADOF32Hds , B9ADOF32Rdt , B9ADOF32V , B9ADOF32Wvs , B9ADOF33A , B9ADOF33Add , B9ADOF33D , & + B9ADOF33Hds , B9ADOF33Rdt , B9ADOF33V , B9ADOF33Wvs , B9ADOF34A , B9ADOF34Add , B9ADOF34D , & + B9ADOF34Hds , B9ADOF34Rdt , B9ADOF34V , B9ADOF34Wvs , B9ADOF35A , B9ADOF35Add , B9ADOF35D , & + B9ADOF35Hds , B9ADOF35Rdt , B9ADOF35V , B9ADOF35Wvs , B9ADOF36A , B9ADOF36Add , B9ADOF36D , & + B9ADOF36Hds , B9ADOF36Rdt , B9ADOF36V , B9ADOF36Wvs , B9ADOF37A , B9ADOF37Add , B9ADOF37D , & + B9ADOF37Hds , B9ADOF37Rdt , B9ADOF37V , B9ADOF37Wvs , B9ADOF38A , B9ADOF38Add , B9ADOF38D , & + B9ADOF38Hds , B9ADOF38Rdt , B9ADOF38V , B9ADOF38Wvs , B9ADOF39A , B9ADOF39Add , B9ADOF39D , & + B9ADOF39Hds , B9ADOF39Rdt , B9ADOF39V , B9ADOF39Wvs , B9ADOF3A , B9ADOF3Add , B9ADOF3D , & + B9ADOF3Hds , B9ADOF3Rdt , B9ADOF3V , B9ADOF3Wvs , B9ADOF40A , B9ADOF40Add , B9ADOF40D , & + B9ADOF40Hds , B9ADOF40Rdt , B9ADOF40V , B9ADOF40Wvs , B9ADOF41A , B9ADOF41Add , B9ADOF41D , & + B9ADOF41Hds , B9ADOF41Rdt , B9ADOF41V , B9ADOF41Wvs , B9ADOF42A , B9ADOF42Add , B9ADOF42D , & + B9ADOF42Hds , B9ADOF42Rdt , B9ADOF42V , B9ADOF42Wvs , B9ADOF43A , B9ADOF43Add , B9ADOF43D , & + B9ADOF43Hds , B9ADOF43Rdt , B9ADOF43V , B9ADOF43Wvs , B9ADOF44A , B9ADOF44Add , B9ADOF44D , & + B9ADOF44Hds , B9ADOF44Rdt , B9ADOF44V , B9ADOF44Wvs , B9ADOF45A , B9ADOF45Add , B9ADOF45D , & + B9ADOF45Hds , B9ADOF45Rdt , B9ADOF45V , B9ADOF45Wvs , B9ADOF46A , B9ADOF46Add , B9ADOF46D , & + B9ADOF46Hds , B9ADOF46Rdt , B9ADOF46V , B9ADOF46Wvs , B9ADOF47A , B9ADOF47Add , B9ADOF47D , & + B9ADOF47Hds , B9ADOF47Rdt , B9ADOF47V , B9ADOF47Wvs , B9ADOF48A , B9ADOF48Add , B9ADOF48D , & + B9ADOF48Hds , B9ADOF48Rdt , B9ADOF48V , B9ADOF48Wvs , B9ADOF49A , B9ADOF49Add , B9ADOF49D , & + B9ADOF49Hds , B9ADOF49Rdt , B9ADOF49V , B9ADOF49Wvs , B9ADOF4A , B9ADOF4Add , B9ADOF4D , & + B9ADOF4Hds , B9ADOF4Rdt , B9ADOF4V , B9ADOF4Wvs , B9ADOF50A , B9ADOF50Add , B9ADOF50D , & + B9ADOF50Hds , B9ADOF50Rdt , B9ADOF50V , B9ADOF50Wvs , B9ADOF51A , B9ADOF51Add , B9ADOF51D , & + B9ADOF51Hds , B9ADOF51Rdt , B9ADOF51V , B9ADOF51Wvs , B9ADOF52A , B9ADOF52Add , B9ADOF52D , & + B9ADOF52Hds , B9ADOF52Rdt , B9ADOF52V , B9ADOF52Wvs , B9ADOF53A , B9ADOF53Add , B9ADOF53D , & + B9ADOF53Hds , B9ADOF53Rdt , B9ADOF53V , B9ADOF53Wvs , B9ADOF54A , B9ADOF54Add , B9ADOF54D , & + B9ADOF54Hds , B9ADOF54Rdt , B9ADOF54V , B9ADOF54Wvs , B9ADOF55A , B9ADOF55Add , B9ADOF55D , & + B9ADOF55Hds , B9ADOF55Rdt , B9ADOF55V , B9ADOF55Wvs , B9ADOF56A , B9ADOF56Add , B9ADOF56D , & + B9ADOF56Hds , B9ADOF56Rdt , B9ADOF56V , B9ADOF56Wvs , B9ADOF57A , B9ADOF57Add , B9ADOF57D , & + B9ADOF57Hds , B9ADOF57Rdt , B9ADOF57V , B9ADOF57Wvs , B9ADOF58A , B9ADOF58Add , B9ADOF58D , & + B9ADOF58Hds , B9ADOF58Rdt , B9ADOF58V , B9ADOF58Wvs , B9ADOF59A , B9ADOF59Add , B9ADOF59D , & + B9ADOF59Hds , B9ADOF59Rdt , B9ADOF59V , B9ADOF59Wvs , B9ADOF5A , B9ADOF5Add , B9ADOF5D , & + B9ADOF5Hds , B9ADOF5Rdt , B9ADOF5V , B9ADOF5Wvs , B9ADOF60A , B9ADOF60Add , B9ADOF60D , & + B9ADOF60Hds , B9ADOF60Rdt , B9ADOF60V , B9ADOF60Wvs , B9ADOF61A , B9ADOF61Add , B9ADOF61D , & + B9ADOF61Hds , B9ADOF61Rdt , B9ADOF61V , B9ADOF61Wvs , B9ADOF62A , B9ADOF62Add , B9ADOF62D , & + B9ADOF62Hds , B9ADOF62Rdt , B9ADOF62V , B9ADOF62Wvs , B9ADOF63A , B9ADOF63Add , B9ADOF63D , & + B9ADOF63Hds , B9ADOF63Rdt , B9ADOF63V , B9ADOF63Wvs , B9ADOF64A , B9ADOF64Add , B9ADOF64D , & + B9ADOF64Hds , B9ADOF64Rdt , B9ADOF64V , B9ADOF64Wvs , B9ADOF65A , B9ADOF65Add , B9ADOF65D , & + B9ADOF65Hds , B9ADOF65Rdt , B9ADOF65V , B9ADOF65Wvs , B9ADOF66A , B9ADOF66Add , B9ADOF66D , & + B9ADOF66Hds , B9ADOF66Rdt , B9ADOF66V , B9ADOF66Wvs , B9ADOF67A , B9ADOF67Add , B9ADOF67D , & + B9ADOF67Hds , B9ADOF67Rdt , B9ADOF67V , B9ADOF67Wvs , B9ADOF68A , B9ADOF68Add , B9ADOF68D , & + B9ADOF68Hds , B9ADOF68Rdt , B9ADOF68V , B9ADOF68Wvs , B9ADOF69A , B9ADOF69Add , B9ADOF69D , & + B9ADOF69Hds , B9ADOF69Rdt , B9ADOF69V , B9ADOF69Wvs , B9ADOF6A , B9ADOF6Add , B9ADOF6D , & + B9ADOF6Hds , B9ADOF6Rdt , B9ADOF6V , B9ADOF6Wvs , B9ADOF70A , B9ADOF70Add , B9ADOF70D , & + B9ADOF70Hds , B9ADOF70Rdt , B9ADOF70V , B9ADOF70Wvs , B9ADOF71A , B9ADOF71Add , B9ADOF71D , & + B9ADOF71Hds , B9ADOF71Rdt , B9ADOF71V , B9ADOF71Wvs , B9ADOF72A , B9ADOF72Add , B9ADOF72D , & + B9ADOF72Hds , B9ADOF72Rdt , B9ADOF72V , B9ADOF72Wvs , B9ADOF73A , B9ADOF73Add , B9ADOF73D , & + B9ADOF73Hds , B9ADOF73Rdt , B9ADOF73V , B9ADOF73Wvs , B9ADOF74A , B9ADOF74Add , B9ADOF74D , & + B9ADOF74Hds , B9ADOF74Rdt , B9ADOF74V , B9ADOF74Wvs , B9ADOF75A , B9ADOF75Add , B9ADOF75D , & + B9ADOF75Hds , B9ADOF75Rdt , B9ADOF75V , B9ADOF75Wvs , B9ADOF76A , B9ADOF76Add , B9ADOF76D , & + B9ADOF76Hds , B9ADOF76Rdt , B9ADOF76V , B9ADOF76Wvs , B9ADOF77A , B9ADOF77Add , B9ADOF77D , & + B9ADOF77Hds , B9ADOF77Rdt , B9ADOF77V , B9ADOF77Wvs , B9ADOF78A , B9ADOF78Add , B9ADOF78D , & + B9ADOF78Hds , B9ADOF78Rdt , B9ADOF78V , B9ADOF78Wvs , B9ADOF79A , B9ADOF79Add , B9ADOF79D , & + B9ADOF79Hds , B9ADOF79Rdt , B9ADOF79V , B9ADOF79Wvs , B9ADOF7A , B9ADOF7Add , B9ADOF7D , & + B9ADOF7Hds , B9ADOF7Rdt , B9ADOF7V , B9ADOF7Wvs , B9ADOF80A , B9ADOF80Add , B9ADOF80D , & + B9ADOF80Hds , B9ADOF80Rdt , B9ADOF80V , B9ADOF80Wvs , B9ADOF81A , B9ADOF81Add , B9ADOF81D , & + B9ADOF81Hds , B9ADOF81Rdt , B9ADOF81V , B9ADOF81Wvs , B9ADOF82A , B9ADOF82Add , B9ADOF82D , & + B9ADOF82Hds , B9ADOF82Rdt , B9ADOF82V , B9ADOF82Wvs , B9ADOF83A , B9ADOF83Add , B9ADOF83D , & + B9ADOF83Hds , B9ADOF83Rdt , B9ADOF83V , B9ADOF83Wvs , B9ADOF84A , B9ADOF84Add , B9ADOF84D , & + B9ADOF84Hds , B9ADOF84Rdt , B9ADOF84V , B9ADOF84Wvs , B9ADOF85A , B9ADOF85Add , B9ADOF85D , & + B9ADOF85Hds , B9ADOF85Rdt , B9ADOF85V , B9ADOF85Wvs , B9ADOF86A , B9ADOF86Add , B9ADOF86D , & + B9ADOF86Hds , B9ADOF86Rdt , B9ADOF86V , B9ADOF86Wvs , B9ADOF87A , B9ADOF87Add , B9ADOF87D , & + B9ADOF87Hds , B9ADOF87Rdt , B9ADOF87V , B9ADOF87Wvs , B9ADOF88A , B9ADOF88Add , B9ADOF88D , & + B9ADOF88Hds , B9ADOF88Rdt , B9ADOF88V , B9ADOF88Wvs , B9ADOF89A , B9ADOF89Add , B9ADOF89D , & + B9ADOF89Hds , B9ADOF89Rdt , B9ADOF89V , B9ADOF89Wvs , B9ADOF8A , B9ADOF8Add , B9ADOF8D , & + B9ADOF8Hds , B9ADOF8Rdt , B9ADOF8V , B9ADOF8Wvs , B9ADOF90A , B9ADOF90Add , B9ADOF90D , & + B9ADOF90Hds , B9ADOF90Rdt , B9ADOF90V , B9ADOF90Wvs , B9ADOF91A , B9ADOF91Add , B9ADOF91D , & + B9ADOF91Hds , B9ADOF91Rdt , B9ADOF91V , B9ADOF91Wvs , B9ADOF92A , B9ADOF92Add , B9ADOF92D , & + B9ADOF92Hds , B9ADOF92Rdt , B9ADOF92V , B9ADOF92Wvs , B9ADOF93A , B9ADOF93Add , B9ADOF93D , & + B9ADOF93Hds , B9ADOF93Rdt , B9ADOF93V , B9ADOF93Wvs , B9ADOF94A , B9ADOF94Add , B9ADOF94D , & + B9ADOF94Hds , B9ADOF94Rdt , B9ADOF94V , B9ADOF94Wvs , B9ADOF95A , B9ADOF95Add , B9ADOF95D , & + B9ADOF95Hds , B9ADOF95Rdt , B9ADOF95V , B9ADOF95Wvs , B9ADOF96A , B9ADOF96Add , B9ADOF96D , & + B9ADOF96Hds , B9ADOF96Rdt , B9ADOF96V , B9ADOF96Wvs , B9ADOF97A , B9ADOF97Add , B9ADOF97D , & + B9ADOF97Hds , B9ADOF97Rdt , B9ADOF97V , B9ADOF97Wvs , B9ADOF98A , B9ADOF98Add , B9ADOF98D , & + B9ADOF98Hds , B9ADOF98Rdt , B9ADOF98V , B9ADOF98Wvs , B9ADOF99A , B9ADOF99Add , B9ADOF99D , & + B9ADOF99Hds , B9ADOF99Rdt , B9ADOF99V , B9ADOF99Wvs , B9ADOF9A , B9ADOF9Add , B9ADOF9D , & + B9ADOF9Hds , B9ADOF9Rdt , B9ADOF9V , B9ADOF9Wvs , B9HdSFxi , B9HdSFyi , B9HdSFzi , & + B9HdSMxi , B9HdSMyi , B9HdSMzi , B9Heave , B9Pitch , B9RAxi , B9RAyi , & + B9RAzi , B9RdtFxi , B9RdtFyi , B9RdtFzi , B9RdtMxi , B9RdtMyi , B9RdtMzi , & + B9Roll , B9RVxi , B9RVyi , B9RVzi , B9Surge , B9Sway , B9TAxi , & + B9TAyi , B9TAzi , B9TVxi , B9TVyi , B9TVzi , B9WvsF1xi , B9WvsF1yi , & + B9WvsF1zi , B9WvsF2xi , B9WvsF2yi , B9WvsF2zi , B9WvsFxi , B9WvsFyi , B9WvsFzi , & + B9WvsM1xi , B9WvsM1yi , B9WvsM1zi , B9WvsM2xi , B9WvsM2yi , B9WvsM2zi , B9WvsMxi , & + B9WvsMyi , B9WvsMzi , B9Yaw , HydroFxi , HydroFyi , HydroFzi , HydroMxi , & + HydroMyi , HydroMzi , PRPHeave , PRPPitch , PRPRAxi , PRPRAyi , PRPRAzi , & + PRPRoll , PRPRVxi , PRPRVyi , PRPRVzi , PRPSurge , PRPSway , PRPTAxi , & + PRPTAyi , PRPTAzi , PRPTVxi , PRPTVyi , PRPTVzi , PRPYaw /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(6747) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + ParamIndxAry1, ParamIndxAry2, ParamIndxAry3, ParamIndxAry4/) + + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry1(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ", & + "(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ", & + "(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)", & + "(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(rad) ","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry2(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(rad/s) ", & + "(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m/s) ","(m/s) ","(m/s) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(rad) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ", & + "(rad) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ", & + "(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ", & + "(m/s) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry3(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)", & + "(rad/s^2)","(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(rad) ", & + "(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(rad) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry4(1686) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(m) ","(rad) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(rad/s) ","(rad/s) ", & + "(rad/s) ","(m) ","(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ", & + "(m/s) ","(m/s) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ", & + "(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ", & + "(rad/s^2)","(rad/s^2)","(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ", & + "(m) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(rad) ","(N) ","(N) ", & + "(N) ","(N-m) ","(N-m) ","(N-m) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)", & + "(rad/s^2)","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ", & + "(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(rad) ","(N) ","(N) ","(N) ","(N-m) ", & + "(N-m) ","(N-m) ","(m) ","(rad) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & + "(rad) ","(rad/s) ","(rad/s) ","(rad/s) ","(m) ","(m) ","(m/s^2) ", & "(m/s^2) ","(m/s^2) ","(m/s) ","(m/s) ","(m/s) ","(rad) "/) + CHARACTER(OutStrLenM1), PARAMETER :: ParamUnitsAry(6747) = (/ & ! This lists the units corresponding to the allowed parameters + ParamUnitsAry1, ParamUnitsAry2, ParamUnitsAry3, ParamUnitsAry4/) ! Initialize values diff --git a/modules/hydrodyn/src/HydroDyn_Types.f90 b/modules/hydrodyn/src/HydroDyn_Types.f90 index 7d928a77b2..c1b96adc18 100644 --- a/modules/hydrodyn/src/HydroDyn_Types.f90 +++ b/modules/hydrodyn/src/HydroDyn_Types.f90 @@ -39,8 +39,12 @@ MODULE HydroDyn_Types USE Morison_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: MaxHDOutputs = 510 ! The maximum number of output channels supported by this module [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: MaxUserOutputs = 5150 ! Total possible number of output channels: SS_Excitation = 7 + SS_Radiation = 7 + Morison= 4626 + HydroDyn=510 = 5150 [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MaxHDOutputs = 510 ! The maximum number of output channels supported by this module [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MaxUserOutputs = 5150 ! Total possible number of output channels: SS_Excitation = 7 + SS_Radiation = 7 + Morison= 4626 + HydroDyn=510 = 5150 [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: HydroDyn_u_WaveElev0 = -1 ! WaveElev0 Extended input DatLoc number [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: HydroDyn_u_HWindSpeed = -2 ! HWindSpeed extended input DatLoc number [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: HydroDyn_u_PLexp = -3 ! PLexp extended input DatLoc number [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: HydroDyn_u_PropagationDir = -4 ! PropagationDir extended input DatLoc number [-] ! ========= HydroDyn_InputFile ======= TYPE, PUBLIC :: HydroDyn_InputFile LOGICAL :: EchoFlag = .false. !< Echo the input file [-] @@ -55,6 +59,7 @@ MODULE HydroDyn_Types INTEGER(IntKi) :: NBodyMod = 0_IntKi !< Body coupling model {1: include coupling terms between each body and NBody in HydroDyn equals NBODY in WAMIT, 2: neglect coupling terms between each body and NBODY=1 with XBODY=0 in WAMIT, 3: Neglect coupling terms between each body and NBODY=1 with XBODY=/0 in WAMIT} (switch) [only used when PotMod=1] [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PtfmVol0 !< [-] LOGICAL :: HasWAMIT = .false. !< .TRUE. if using WAMIT model, .FALSE. otherwise [-] + LOGICAL :: HasAddDOF = .false. !< .TRUE. if additional generalized DOF are present, .FALSE. otherwise [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WAMITULEN !< [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PtfmRefxt !< The xt offset of the body reference point(s) from (0,0,0) [1 to NBody; only used when PotMod=1; must be 0.0 if NBodyMod=2 ] [(m)] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PtfmRefyt !< The yt offset of the body reference point(s) from (0,0,0) [1 to NBody; only used when PotMod=1; must be 0.0 if NBodyMod=2 ] [(m)] @@ -62,6 +67,7 @@ MODULE HydroDyn_Types REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: PtfmRefztRot !< The rotation about zt of the body reference frame(s) from xt/yt [radians] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PtfmCOBxt !< [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PtfmCOByt !< [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: NAddDOF !< Number of additional generalized degrees of freedom [-] TYPE(WAMIT_InitInputType) :: WAMIT !< Initialization data for WAMIT module [-] TYPE(WAMIT2_InitInputType) :: WAMIT2 !< Initialization data for WAMIT2 module [-] TYPE(Morison_InitInputType) :: Morison !< Initialization data for Morison module [-] @@ -99,15 +105,11 @@ MODULE HydroDyn_Types ! ======================= ! ========= HydroDyn_InitOutputType ======= TYPE, PUBLIC :: HydroDyn_InitOutputType + TYPE(ModVarsType) :: Vars !< Module Variables [-] TYPE(Morison_InitOutputType) :: Morison !< Initialization output from the Morison module [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< The is the list of all HD-related output channel header strings (includes all sub-module channels) [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< The is the list of all HD-related output channel unit strings (includes all sub-module channels) [-] TYPE(ProgDesc) :: Ver !< Version of HydroDyn [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_x !< Names of the continuous states used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: DerivOrder_x !< Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) [-] END TYPE HydroDyn_InitOutputType ! ======================= ! ========= HD_ModuleMapType ======= @@ -142,21 +144,6 @@ MODULE HydroDyn_Types TYPE(Morison_OtherStateType) :: Morison !< OtherState information from the Morison module [-] END TYPE HydroDyn_OtherStateType ! ======================= -! ========= HydroDyn_MiscVarType ======= - TYPE, PUBLIC :: HydroDyn_MiscVarType - TYPE(MeshType) :: AllHdroOrigin !< An intermediate mesh used to transfer hydrodynamic loads from the various HD-related meshes to the AllHdroOrigin mesh [-] - TYPE(HD_ModuleMapType) :: HD_MeshMap - INTEGER(IntKi) :: Decimate = 0_IntKi !< The output decimation counter [-] - REAL(DbKi) :: LastOutTime = 0.0_R8Ki !< Last time step which was written to the output file (sec) [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_PtfmAdd !< The total forces and moments due to additional pre-load, stiffness, and damping [-] - REAL(ReKi) , DIMENSION(1:6) :: F_Hydro = 0.0_ReKi !< The total hydrodynamic forces and moments integrated about the (0,0,0) platform reference point [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_Waves !< The total waves forces on a WAMIT body calculated by first and second order methods (WAMIT and WAMIT2 modules) [-] - TYPE(WAMIT_MiscVarType) , DIMENSION(:), ALLOCATABLE :: WAMIT !< misc var information from the WAMIT module [-] - TYPE(WAMIT2_MiscVarType) , DIMENSION(:), ALLOCATABLE :: WAMIT2 !< misc var information from the WAMIT2 module [-] - TYPE(Morison_MiscVarType) :: Morison !< misc var information from the Morison module [-] - TYPE(WAMIT_InputType) , DIMENSION(:), ALLOCATABLE :: u_WAMIT !< WAMIT module inputs [-] - END TYPE HydroDyn_MiscVarType -! ======================= ! ========= HydroDyn_ParameterType ======= TYPE, PUBLIC :: HydroDyn_ParameterType INTEGER(IntKi) :: nWAMITObj = 0_IntKi !< number of WAMIT input files and matrices. If NBodyMod = 1 then nPotFiles will be 1 even if NBody > 1 [-] @@ -168,6 +155,10 @@ MODULE HydroDyn_Types INTEGER(IntKi) :: PotMod = 0_IntKi !< 1 if using WAMIT model, 0 if no potential flow model, or 2 if FIT model [-] INTEGER(IntKi) :: NBody = 0_IntKi !< [>=1; only used when PotMod=1. If NBodyMod=1, the WAMIT data contains a vector of size 6*NBody x 1 and matrices of size 6*NBody x 6*NBody; if NBodyMod>1, there are NBody sets of WAMIT data each with a vector of size 6 x 1 and matrices of size 6 x 6] [-] INTEGER(IntKi) :: NBodyMod = 0_IntKi !< Body coupling model {1: include coupling terms between each body and NBody in HydroDyn equals NBODY in WAMIT, 2: neglect coupling terms between each body and NBODY=1 with XBODY=0 in WAMIT, 3: Neglect coupling terms between each body and NBODY=1 with XBODY=/0 in WAMIT} (switch) [only used when PotMod=1] [-] + LOGICAL :: HasAddDOF = .false. !< .TRUE. if additional generalized DOF are present, .FALSE. otherwise [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: NAddDOF !< Number of additional generalized degrees of freedom [-] + INTEGER(IntKi) :: NDOF = 0_IntKi !< Total number of degrees of freedom [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BDOFStrt !< Starting DOF index for each body [-] INTEGER(IntKi) :: totalStates = 0_IntKi !< Number of excitation and radiation states for all WAMIT bodies [-] INTEGER(IntKi) :: totalExctnStates = 0_IntKi !< Number of excitation states for all WAMIT bodies [-] INTEGER(IntKi) :: totalRdtnStates = 0_IntKi !< Number of radiation states for all WAMIT bodies [-] @@ -185,10 +176,6 @@ MODULE HydroDyn_Types CHARACTER(ChanLen) :: Delim !< Delimiter string for outputs, defaults to tab-delimiters [-] INTEGER(IntKi) :: UnOutFile = 0_IntKi !< File unit for the HydroDyn outputs [-] INTEGER(IntKi) :: OutDec = 0_IntKi !< Write every OutDec time steps [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: du !< vector that determines size of perturbation for u (inputs) [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: dx !< vector that determines size of perturbation for x (continuous states) [-] - INTEGER(IntKi) :: Jac_ny = 0_IntKi !< number of outputs in jacobian matrix [-] LOGICAL :: VisMeshes = .false. !< Output visualization meshes [-] TYPE(SeaSt_WaveFieldType) , POINTER :: WaveField => NULL() !< Pointer to SeaState wave field [-] INTEGER(IntKi) :: PtfmYMod = 0_IntKi !< Large yaw model [-] @@ -200,6 +187,9 @@ MODULE HydroDyn_Types TYPE(Morison_InputType) :: Morison !< Morison module inputs [-] TYPE(MeshType) :: WAMITMesh !< Motions at the WAMIT reference point(s) in the inertial frame [-] TYPE(MeshType) :: PRPMesh !< Motions at the Platform reference point in the inertial frame [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qAddDOF !< Displacement of potential-flow generalized DOF [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qAddDOFDot !< Velocity of potential-flow generalized DOF [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qAddDOFDotDot !< Acceleration of potential-flow generalized DOF [-] END TYPE HydroDyn_InputType ! ======================= ! ========= HydroDyn_OutputType ======= @@ -209,9 +199,51 @@ MODULE HydroDyn_Types TYPE(Morison_OutputType) :: Morison !< Morison module outputs [-] TYPE(MeshType) :: WAMITMesh !< Point Loads at the WAMIT reference point(s) in the inertial frame [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Outputs to be written to the output file(s) [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FAddDOF !< Additional generalized DOF forcing [-] END TYPE HydroDyn_OutputType ! ======================= -CONTAINS +! ========= HydroDyn_MiscVarType ======= + TYPE, PUBLIC :: HydroDyn_MiscVarType + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] + TYPE(HydroDyn_ContinuousStateType) :: x_perturb !< Temporary variables for Jacobian calculations [-] + TYPE(HydroDyn_InputType) :: u_perturb !< Temporary variables for Jacobian calculations [-] + TYPE(HydroDyn_ContinuousStateType) :: dxdt_lin !< Temporary variables for Jacobian calculations [-] + TYPE(HydroDyn_OutputType) :: y_lin !< Temporary variables for Jacobian calculations [-] + TYPE(MeshType) :: AllHdroOrigin !< An intermediate mesh used to transfer hydrodynamic loads from the various HD-related meshes to the AllHdroOrigin mesh [-] + TYPE(HD_ModuleMapType) :: HD_MeshMap + INTEGER(IntKi) :: Decimate = 0_IntKi !< The output decimation counter [-] + REAL(DbKi) :: LastOutTime = 0.0_R8Ki !< Last time step which was written to the output file (sec) [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_PtfmAdd !< The total forces and moments due to additional pre-load, stiffness, and damping [-] + REAL(ReKi) , DIMENSION(1:6) :: F_Hydro = 0.0_ReKi !< The total hydrodynamic forces and moments integrated about the (0,0,0) platform reference point [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_Waves !< The total waves forces on a WAMIT body calculated by first and second order methods (WAMIT and WAMIT2 modules) [-] + TYPE(WAMIT_MiscVarType) , DIMENSION(:), ALLOCATABLE :: WAMIT !< misc var information from the WAMIT module [-] + TYPE(WAMIT2_MiscVarType) , DIMENSION(:), ALLOCATABLE :: WAMIT2 !< misc var information from the WAMIT2 module [-] + TYPE(Morison_MiscVarType) :: Morison !< misc var information from the Morison module [-] + TYPE(WAMIT_InputType) , DIMENSION(:), ALLOCATABLE :: u_WAMIT !< WAMIT module inputs [-] + END TYPE HydroDyn_MiscVarType +! ======================= + integer(IntKi), public, parameter :: HydroDyn_x_WAMIT_SS_Rdtn_x = 1 ! HydroDyn%WAMIT(DL%i1)%SS_Rdtn%x + integer(IntKi), public, parameter :: HydroDyn_x_WAMIT_SS_Exctn_x = 2 ! HydroDyn%WAMIT(DL%i1)%SS_Exctn%x + integer(IntKi), public, parameter :: HydroDyn_x_WAMIT_Conv_Rdtn_DummyContState = 3 ! HydroDyn%WAMIT(DL%i1)%Conv_Rdtn%DummyContState + integer(IntKi), public, parameter :: HydroDyn_x_Morison_DummyContState = 4 ! HydroDyn%Morison%DummyContState + integer(IntKi), public, parameter :: HydroDyn_u_Morison_Mesh = 5 ! HydroDyn%Morison%Mesh + integer(IntKi), public, parameter :: HydroDyn_u_Morison_PtfmRefY = 6 ! HydroDyn%Morison%PtfmRefY + integer(IntKi), public, parameter :: HydroDyn_u_WAMITMesh = 7 ! HydroDyn%WAMITMesh + integer(IntKi), public, parameter :: HydroDyn_u_PRPMesh = 8 ! HydroDyn%PRPMesh + integer(IntKi), public, parameter :: HydroDyn_u_qAddDOF = 9 ! HydroDyn%qAddDOF + integer(IntKi), public, parameter :: HydroDyn_u_qAddDOFDot = 10 ! HydroDyn%qAddDOFDot + integer(IntKi), public, parameter :: HydroDyn_u_qAddDOFDotDot = 11 ! HydroDyn%qAddDOFDotDot + integer(IntKi), public, parameter :: HydroDyn_y_WAMIT_Mesh = 12 ! HydroDyn%WAMIT(DL%i1)%Mesh + integer(IntKi), public, parameter :: HydroDyn_y_WAMIT_FAddDOF = 13 ! HydroDyn%WAMIT(DL%i1)%FAddDOF + integer(IntKi), public, parameter :: HydroDyn_y_WAMIT2_Mesh = 14 ! HydroDyn%WAMIT2(DL%i1)%Mesh + integer(IntKi), public, parameter :: HydroDyn_y_Morison_Mesh = 15 ! HydroDyn%Morison%Mesh + integer(IntKi), public, parameter :: HydroDyn_y_Morison_VisMesh = 16 ! HydroDyn%Morison%VisMesh + integer(IntKi), public, parameter :: HydroDyn_y_Morison_WriteOutput = 17 ! HydroDyn%Morison%WriteOutput + integer(IntKi), public, parameter :: HydroDyn_y_WAMITMesh = 18 ! HydroDyn%WAMITMesh + integer(IntKi), public, parameter :: HydroDyn_y_WriteOutput = 19 ! HydroDyn%WriteOutput + integer(IntKi), public, parameter :: HydroDyn_y_FAddDOF = 20 ! HydroDyn%FAddDOF + +contains subroutine HydroDyn_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg) type(HydroDyn_InputFile), intent(in) :: SrcInputFileData @@ -303,6 +335,7 @@ subroutine HydroDyn_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, DstInputFileData%PtfmVol0 = SrcInputFileData%PtfmVol0 end if DstInputFileData%HasWAMIT = SrcInputFileData%HasWAMIT + DstInputFileData%HasAddDOF = SrcInputFileData%HasAddDOF if (allocated(SrcInputFileData%WAMITULEN)) then LB(1:1) = lbound(SrcInputFileData%WAMITULEN) UB(1:1) = ubound(SrcInputFileData%WAMITULEN) @@ -387,6 +420,18 @@ subroutine HydroDyn_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, end if DstInputFileData%PtfmCOByt = SrcInputFileData%PtfmCOByt end if + if (allocated(SrcInputFileData%NAddDOF)) then + LB(1:1) = lbound(SrcInputFileData%NAddDOF) + UB(1:1) = ubound(SrcInputFileData%NAddDOF) + if (.not. allocated(DstInputFileData%NAddDOF)) then + allocate(DstInputFileData%NAddDOF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%NAddDOF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%NAddDOF = SrcInputFileData%NAddDOF + end if call WAMIT_CopyInitInput(SrcInputFileData%WAMIT, DstInputFileData%WAMIT, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -483,6 +528,9 @@ subroutine HydroDyn_DestroyInputFile(InputFileData, ErrStat, ErrMsg) if (allocated(InputFileData%PtfmCOByt)) then deallocate(InputFileData%PtfmCOByt) end if + if (allocated(InputFileData%NAddDOF)) then + deallocate(InputFileData%NAddDOF) + end if call WAMIT_DestroyInitInput(InputFileData%WAMIT, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call WAMIT2_DestroyInitInput(InputFileData%WAMIT2, ErrStat2, ErrMsg2) @@ -514,6 +562,7 @@ subroutine HydroDyn_PackInputFile(RF, Indata) call RegPack(RF, InData%NBodyMod) call RegPackAlloc(RF, InData%PtfmVol0) call RegPack(RF, InData%HasWAMIT) + call RegPack(RF, InData%HasAddDOF) call RegPackAlloc(RF, InData%WAMITULEN) call RegPackAlloc(RF, InData%PtfmRefxt) call RegPackAlloc(RF, InData%PtfmRefyt) @@ -521,6 +570,7 @@ subroutine HydroDyn_PackInputFile(RF, Indata) call RegPackAlloc(RF, InData%PtfmRefztRot) call RegPackAlloc(RF, InData%PtfmCOBxt) call RegPackAlloc(RF, InData%PtfmCOByt) + call RegPackAlloc(RF, InData%NAddDOF) call WAMIT_PackInitInput(RF, InData%WAMIT) call WAMIT2_PackInitInput(RF, InData%WAMIT2) call Morison_PackInitInput(RF, InData%Morison) @@ -562,6 +612,7 @@ subroutine HydroDyn_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%NBodyMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%PtfmVol0); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HasWAMIT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HasAddDOF); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WAMITULEN); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%PtfmRefxt); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%PtfmRefyt); if (RegCheckErr(RF, RoutineName)) return @@ -569,6 +620,7 @@ subroutine HydroDyn_UnPackInputFile(RF, OutData) call RegUnpackAlloc(RF, OutData%PtfmRefztRot); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%PtfmCOBxt); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%PtfmCOByt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NAddDOF); if (RegCheckErr(RF, RoutineName)) return call WAMIT_UnpackInitInput(RF, OutData%WAMIT) ! WAMIT call WAMIT2_UnpackInitInput(RF, OutData%WAMIT2) ! WAMIT2 call Morison_UnpackInitInput(RF, OutData%Morison) ! Morison @@ -708,6 +760,9 @@ subroutine HydroDyn_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCod character(*), parameter :: RoutineName = 'HydroDyn_CopyInitOutput' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return call Morison_CopyInitOutput(SrcInitOutputData%Morison, DstInitOutputData%Morison, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -738,66 +793,6 @@ subroutine HydroDyn_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCod call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcInitOutputData%LinNames_y)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_y) - UB(1:1) = ubound(SrcInitOutputData%LinNames_y) - if (.not. allocated(DstInitOutputData%LinNames_y)) then - allocate(DstInitOutputData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_y = SrcInitOutputData%LinNames_y - end if - if (allocated(SrcInitOutputData%LinNames_x)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_x) - UB(1:1) = ubound(SrcInitOutputData%LinNames_x) - if (.not. allocated(DstInitOutputData%LinNames_x)) then - allocate(DstInitOutputData%LinNames_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_x = SrcInitOutputData%LinNames_x - end if - if (allocated(SrcInitOutputData%LinNames_u)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_u) - UB(1:1) = ubound(SrcInitOutputData%LinNames_u) - if (.not. allocated(DstInitOutputData%LinNames_u)) then - allocate(DstInitOutputData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_u = SrcInitOutputData%LinNames_u - end if - if (allocated(SrcInitOutputData%DerivOrder_x)) then - LB(1:1) = lbound(SrcInitOutputData%DerivOrder_x) - UB(1:1) = ubound(SrcInitOutputData%DerivOrder_x) - if (.not. allocated(DstInitOutputData%DerivOrder_x)) then - allocate(DstInitOutputData%DerivOrder_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%DerivOrder_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%DerivOrder_x = SrcInitOutputData%DerivOrder_x - end if - if (allocated(SrcInitOutputData%IsLoad_u)) then - LB(1:1) = lbound(SrcInitOutputData%IsLoad_u) - UB(1:1) = ubound(SrcInitOutputData%IsLoad_u) - if (.not. allocated(DstInitOutputData%IsLoad_u)) then - allocate(DstInitOutputData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%IsLoad_u = SrcInitOutputData%IsLoad_u - end if end subroutine subroutine HydroDyn_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -809,6 +804,8 @@ subroutine HydroDyn_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'HydroDyn_DestroyInitOutput' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call Morison_DestroyInitOutput(InitOutputData%Morison, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(InitOutputData%WriteOutputHdr)) then @@ -819,21 +816,6 @@ subroutine HydroDyn_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(InitOutputData%LinNames_y)) then - deallocate(InitOutputData%LinNames_y) - end if - if (allocated(InitOutputData%LinNames_x)) then - deallocate(InitOutputData%LinNames_x) - end if - if (allocated(InitOutputData%LinNames_u)) then - deallocate(InitOutputData%LinNames_u) - end if - if (allocated(InitOutputData%DerivOrder_x)) then - deallocate(InitOutputData%DerivOrder_x) - end if - if (allocated(InitOutputData%IsLoad_u)) then - deallocate(InitOutputData%IsLoad_u) - end if end subroutine subroutine HydroDyn_PackInitOutput(RF, Indata) @@ -841,15 +823,11 @@ subroutine HydroDyn_PackInitOutput(RF, Indata) type(HydroDyn_InitOutputType), intent(in) :: InData character(*), parameter :: RoutineName = 'HydroDyn_PackInitOutput' if (RF%ErrStat >= AbortErrLev) return + call NWTC_Library_PackModVarsType(RF, InData%Vars) call Morison_PackInitOutput(RF, InData%Morison) call RegPackAlloc(RF, InData%WriteOutputHdr) call RegPackAlloc(RF, InData%WriteOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_x) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%DerivOrder_x) - call RegPackAlloc(RF, InData%IsLoad_u) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -861,15 +839,11 @@ subroutine HydroDyn_UnPackInitOutput(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars call Morison_UnpackInitOutput(RF, OutData%Morison) ! Morison call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DerivOrder_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine HydroDyn_CopyHD_ModuleMapType(SrcHD_ModuleMapTypeData, DstHD_ModuleMapTypeData, CtrlCode, ErrStat, ErrMsg) @@ -1311,442 +1285,177 @@ subroutine HydroDyn_UnPackOtherState(RF, OutData) call Morison_UnpackOtherState(RF, OutData%Morison) ! Morison end subroutine -subroutine HydroDyn_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(HydroDyn_MiscVarType), intent(inout) :: SrcMiscData - type(HydroDyn_MiscVarType), intent(inout) :: DstMiscData +subroutine HydroDyn_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) + type(HydroDyn_ParameterType), intent(in) :: SrcParamData + type(HydroDyn_ParameterType), intent(inout) :: DstParamData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'HydroDyn_CopyMisc' + character(*), parameter :: RoutineName = 'HydroDyn_CopyParam' ErrStat = ErrID_None ErrMsg = '' - call MeshCopy(SrcMiscData%AllHdroOrigin, DstMiscData%AllHdroOrigin, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call HydroDyn_CopyHD_ModuleMapType(SrcMiscData%HD_MeshMap, DstMiscData%HD_MeshMap, CtrlCode, ErrStat2, ErrMsg2) + DstParamData%nWAMITObj = SrcParamData%nWAMITObj + DstParamData%vecMultiplier = SrcParamData%vecMultiplier + if (allocated(SrcParamData%WAMIT)) then + LB(1:1) = lbound(SrcParamData%WAMIT) + UB(1:1) = ubound(SrcParamData%WAMIT) + if (.not. allocated(DstParamData%WAMIT)) then + allocate(DstParamData%WAMIT(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WAMIT.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call WAMIT_CopyParam(SrcParamData%WAMIT(i1), DstParamData%WAMIT(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcParamData%WAMIT2)) then + LB(1:1) = lbound(SrcParamData%WAMIT2) + UB(1:1) = ubound(SrcParamData%WAMIT2) + if (.not. allocated(DstParamData%WAMIT2)) then + allocate(DstParamData%WAMIT2(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WAMIT2.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call WAMIT2_CopyParam(SrcParamData%WAMIT2(i1), DstParamData%WAMIT2(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + DstParamData%WAMIT2used = SrcParamData%WAMIT2used + call Morison_CopyParam(SrcParamData%Morison, DstParamData%Morison, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - DstMiscData%Decimate = SrcMiscData%Decimate - DstMiscData%LastOutTime = SrcMiscData%LastOutTime - if (allocated(SrcMiscData%F_PtfmAdd)) then - LB(1:1) = lbound(SrcMiscData%F_PtfmAdd) - UB(1:1) = ubound(SrcMiscData%F_PtfmAdd) - if (.not. allocated(DstMiscData%F_PtfmAdd)) then - allocate(DstMiscData%F_PtfmAdd(LB(1):UB(1)), stat=ErrStat2) + DstParamData%PotMod = SrcParamData%PotMod + DstParamData%NBody = SrcParamData%NBody + DstParamData%NBodyMod = SrcParamData%NBodyMod + DstParamData%HasAddDOF = SrcParamData%HasAddDOF + if (allocated(SrcParamData%NAddDOF)) then + LB(1:1) = lbound(SrcParamData%NAddDOF) + UB(1:1) = ubound(SrcParamData%NAddDOF) + if (.not. allocated(DstParamData%NAddDOF)) then + allocate(DstParamData%NAddDOF(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_PtfmAdd.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NAddDOF.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%F_PtfmAdd = SrcMiscData%F_PtfmAdd + DstParamData%NAddDOF = SrcParamData%NAddDOF + end if + DstParamData%NDOF = SrcParamData%NDOF + if (allocated(SrcParamData%BDOFStrt)) then + LB(1:1) = lbound(SrcParamData%BDOFStrt) + UB(1:1) = ubound(SrcParamData%BDOFStrt) + if (.not. allocated(DstParamData%BDOFStrt)) then + allocate(DstParamData%BDOFStrt(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BDOFStrt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%BDOFStrt = SrcParamData%BDOFStrt end if - DstMiscData%F_Hydro = SrcMiscData%F_Hydro - if (allocated(SrcMiscData%F_Waves)) then - LB(1:1) = lbound(SrcMiscData%F_Waves) - UB(1:1) = ubound(SrcMiscData%F_Waves) - if (.not. allocated(DstMiscData%F_Waves)) then - allocate(DstMiscData%F_Waves(LB(1):UB(1)), stat=ErrStat2) + DstParamData%totalStates = SrcParamData%totalStates + DstParamData%totalExctnStates = SrcParamData%totalExctnStates + DstParamData%totalRdtnStates = SrcParamData%totalRdtnStates + if (allocated(SrcParamData%AddF0)) then + LB(1:2) = lbound(SrcParamData%AddF0) + UB(1:2) = ubound(SrcParamData%AddF0) + if (.not. allocated(DstParamData%AddF0)) then + allocate(DstParamData%AddF0(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_Waves.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AddF0.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%F_Waves = SrcMiscData%F_Waves + DstParamData%AddF0 = SrcParamData%AddF0 end if - if (allocated(SrcMiscData%WAMIT)) then - LB(1:1) = lbound(SrcMiscData%WAMIT) - UB(1:1) = ubound(SrcMiscData%WAMIT) - if (.not. allocated(DstMiscData%WAMIT)) then - allocate(DstMiscData%WAMIT(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%AddCLin)) then + LB(1:3) = lbound(SrcParamData%AddCLin) + UB(1:3) = ubound(SrcParamData%AddCLin) + if (.not. allocated(DstParamData%AddCLin)) then + allocate(DstParamData%AddCLin(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WAMIT.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AddCLin.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call WAMIT_CopyMisc(SrcMiscData%WAMIT(i1), DstMiscData%WAMIT(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%AddCLin = SrcParamData%AddCLin end if - if (allocated(SrcMiscData%WAMIT2)) then - LB(1:1) = lbound(SrcMiscData%WAMIT2) - UB(1:1) = ubound(SrcMiscData%WAMIT2) - if (.not. allocated(DstMiscData%WAMIT2)) then - allocate(DstMiscData%WAMIT2(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%AddBLin)) then + LB(1:3) = lbound(SrcParamData%AddBLin) + UB(1:3) = ubound(SrcParamData%AddBLin) + if (.not. allocated(DstParamData%AddBLin)) then + allocate(DstParamData%AddBLin(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WAMIT2.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AddBLin.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call WAMIT2_CopyMisc(SrcMiscData%WAMIT2(i1), DstMiscData%WAMIT2(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%AddBLin = SrcParamData%AddBLin end if - call Morison_CopyMisc(SrcMiscData%Morison, DstMiscData%Morison, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcMiscData%u_WAMIT)) then - LB(1:1) = lbound(SrcMiscData%u_WAMIT) - UB(1:1) = ubound(SrcMiscData%u_WAMIT) - if (.not. allocated(DstMiscData%u_WAMIT)) then - allocate(DstMiscData%u_WAMIT(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%AddBQuad)) then + LB(1:3) = lbound(SrcParamData%AddBQuad) + UB(1:3) = ubound(SrcParamData%AddBQuad) + if (.not. allocated(DstParamData%AddBQuad)) then + allocate(DstParamData%AddBQuad(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_WAMIT.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AddBQuad.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%AddBQuad = SrcParamData%AddBQuad + end if + DstParamData%DT = SrcParamData%DT + if (allocated(SrcParamData%OutParam)) then + LB(1:1) = lbound(SrcParamData%OutParam) + UB(1:1) = ubound(SrcParamData%OutParam) + if (.not. allocated(DstParamData%OutParam)) then + allocate(DstParamData%OutParam(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call WAMIT_CopyInput(SrcMiscData%u_WAMIT(i1), DstMiscData%u_WAMIT(i1), CtrlCode, ErrStat2, ErrMsg2) + call NWTC_Library_CopyOutParmType(SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if + DstParamData%NumOuts = SrcParamData%NumOuts + DstParamData%NumTotalOuts = SrcParamData%NumTotalOuts + DstParamData%OutSwtch = SrcParamData%OutSwtch + DstParamData%OutFmt = SrcParamData%OutFmt + DstParamData%OutSFmt = SrcParamData%OutSFmt + DstParamData%Delim = SrcParamData%Delim + DstParamData%UnOutFile = SrcParamData%UnOutFile + DstParamData%OutDec = SrcParamData%OutDec + DstParamData%VisMeshes = SrcParamData%VisMeshes + DstParamData%WaveField => SrcParamData%WaveField + DstParamData%PtfmYMod = SrcParamData%PtfmYMod + DstParamData%CYawFilt = SrcParamData%CYawFilt end subroutine -subroutine HydroDyn_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(HydroDyn_MiscVarType), intent(inout) :: MiscData +subroutine HydroDyn_DestroyParam(ParamData, ErrStat, ErrMsg) + type(HydroDyn_ParameterType), intent(inout) :: ParamData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'HydroDyn_DestroyMisc' - ErrStat = ErrID_None - ErrMsg = '' - call MeshDestroy( MiscData%AllHdroOrigin, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call HydroDyn_DestroyHD_ModuleMapType(MiscData%HD_MeshMap, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MiscData%F_PtfmAdd)) then - deallocate(MiscData%F_PtfmAdd) - end if - if (allocated(MiscData%F_Waves)) then - deallocate(MiscData%F_Waves) - end if - if (allocated(MiscData%WAMIT)) then - LB(1:1) = lbound(MiscData%WAMIT) - UB(1:1) = ubound(MiscData%WAMIT) - do i1 = LB(1), UB(1) - call WAMIT_DestroyMisc(MiscData%WAMIT(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%WAMIT) - end if - if (allocated(MiscData%WAMIT2)) then - LB(1:1) = lbound(MiscData%WAMIT2) - UB(1:1) = ubound(MiscData%WAMIT2) - do i1 = LB(1), UB(1) - call WAMIT2_DestroyMisc(MiscData%WAMIT2(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%WAMIT2) - end if - call Morison_DestroyMisc(MiscData%Morison, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MiscData%u_WAMIT)) then - LB(1:1) = lbound(MiscData%u_WAMIT) - UB(1:1) = ubound(MiscData%u_WAMIT) - do i1 = LB(1), UB(1) - call WAMIT_DestroyInput(MiscData%u_WAMIT(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%u_WAMIT) - end if -end subroutine - -subroutine HydroDyn_PackMisc(RF, Indata) - type(RegFile), intent(inout) :: RF - type(HydroDyn_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'HydroDyn_PackMisc' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - call MeshPack(RF, InData%AllHdroOrigin) - call HydroDyn_PackHD_ModuleMapType(RF, InData%HD_MeshMap) - call RegPack(RF, InData%Decimate) - call RegPack(RF, InData%LastOutTime) - call RegPackAlloc(RF, InData%F_PtfmAdd) - call RegPack(RF, InData%F_Hydro) - call RegPackAlloc(RF, InData%F_Waves) - call RegPack(RF, allocated(InData%WAMIT)) - if (allocated(InData%WAMIT)) then - call RegPackBounds(RF, 1, lbound(InData%WAMIT), ubound(InData%WAMIT)) - LB(1:1) = lbound(InData%WAMIT) - UB(1:1) = ubound(InData%WAMIT) - do i1 = LB(1), UB(1) - call WAMIT_PackMisc(RF, InData%WAMIT(i1)) - end do - end if - call RegPack(RF, allocated(InData%WAMIT2)) - if (allocated(InData%WAMIT2)) then - call RegPackBounds(RF, 1, lbound(InData%WAMIT2), ubound(InData%WAMIT2)) - LB(1:1) = lbound(InData%WAMIT2) - UB(1:1) = ubound(InData%WAMIT2) - do i1 = LB(1), UB(1) - call WAMIT2_PackMisc(RF, InData%WAMIT2(i1)) - end do - end if - call Morison_PackMisc(RF, InData%Morison) - call RegPack(RF, allocated(InData%u_WAMIT)) - if (allocated(InData%u_WAMIT)) then - call RegPackBounds(RF, 1, lbound(InData%u_WAMIT), ubound(InData%u_WAMIT)) - LB(1:1) = lbound(InData%u_WAMIT) - UB(1:1) = ubound(InData%u_WAMIT) - do i1 = LB(1), UB(1) - call WAMIT_PackInput(RF, InData%u_WAMIT(i1)) - end do - end if - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine HydroDyn_UnPackMisc(RF, OutData) - type(RegFile), intent(inout) :: RF - type(HydroDyn_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'HydroDyn_UnPackMisc' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call MeshUnpack(RF, OutData%AllHdroOrigin) ! AllHdroOrigin - call HydroDyn_UnpackHD_ModuleMapType(RF, OutData%HD_MeshMap) ! HD_MeshMap - call RegUnpack(RF, OutData%Decimate); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LastOutTime); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%F_PtfmAdd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%F_Hydro); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%F_Waves); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%WAMIT)) deallocate(OutData%WAMIT) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%WAMIT(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%WAMIT.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call WAMIT_UnpackMisc(RF, OutData%WAMIT(i1)) ! WAMIT - end do - end if - if (allocated(OutData%WAMIT2)) deallocate(OutData%WAMIT2) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%WAMIT2(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%WAMIT2.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call WAMIT2_UnpackMisc(RF, OutData%WAMIT2(i1)) ! WAMIT2 - end do - end if - call Morison_UnpackMisc(RF, OutData%Morison) ! Morison - if (allocated(OutData%u_WAMIT)) deallocate(OutData%u_WAMIT) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_WAMIT(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_WAMIT.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call WAMIT_UnpackInput(RF, OutData%u_WAMIT(i1)) ! u_WAMIT - end do - end if -end subroutine - -subroutine HydroDyn_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) - type(HydroDyn_ParameterType), intent(in) :: SrcParamData - type(HydroDyn_ParameterType), intent(inout) :: DstParamData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'HydroDyn_CopyParam' - ErrStat = ErrID_None - ErrMsg = '' - DstParamData%nWAMITObj = SrcParamData%nWAMITObj - DstParamData%vecMultiplier = SrcParamData%vecMultiplier - if (allocated(SrcParamData%WAMIT)) then - LB(1:1) = lbound(SrcParamData%WAMIT) - UB(1:1) = ubound(SrcParamData%WAMIT) - if (.not. allocated(DstParamData%WAMIT)) then - allocate(DstParamData%WAMIT(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WAMIT.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call WAMIT_CopyParam(SrcParamData%WAMIT(i1), DstParamData%WAMIT(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcParamData%WAMIT2)) then - LB(1:1) = lbound(SrcParamData%WAMIT2) - UB(1:1) = ubound(SrcParamData%WAMIT2) - if (.not. allocated(DstParamData%WAMIT2)) then - allocate(DstParamData%WAMIT2(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%WAMIT2.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call WAMIT2_CopyParam(SrcParamData%WAMIT2(i1), DstParamData%WAMIT2(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - DstParamData%WAMIT2used = SrcParamData%WAMIT2used - call Morison_CopyParam(SrcParamData%Morison, DstParamData%Morison, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstParamData%PotMod = SrcParamData%PotMod - DstParamData%NBody = SrcParamData%NBody - DstParamData%NBodyMod = SrcParamData%NBodyMod - DstParamData%totalStates = SrcParamData%totalStates - DstParamData%totalExctnStates = SrcParamData%totalExctnStates - DstParamData%totalRdtnStates = SrcParamData%totalRdtnStates - if (allocated(SrcParamData%AddF0)) then - LB(1:2) = lbound(SrcParamData%AddF0) - UB(1:2) = ubound(SrcParamData%AddF0) - if (.not. allocated(DstParamData%AddF0)) then - allocate(DstParamData%AddF0(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AddF0.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%AddF0 = SrcParamData%AddF0 - end if - if (allocated(SrcParamData%AddCLin)) then - LB(1:3) = lbound(SrcParamData%AddCLin) - UB(1:3) = ubound(SrcParamData%AddCLin) - if (.not. allocated(DstParamData%AddCLin)) then - allocate(DstParamData%AddCLin(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AddCLin.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%AddCLin = SrcParamData%AddCLin - end if - if (allocated(SrcParamData%AddBLin)) then - LB(1:3) = lbound(SrcParamData%AddBLin) - UB(1:3) = ubound(SrcParamData%AddBLin) - if (.not. allocated(DstParamData%AddBLin)) then - allocate(DstParamData%AddBLin(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AddBLin.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%AddBLin = SrcParamData%AddBLin - end if - if (allocated(SrcParamData%AddBQuad)) then - LB(1:3) = lbound(SrcParamData%AddBQuad) - UB(1:3) = ubound(SrcParamData%AddBQuad) - if (.not. allocated(DstParamData%AddBQuad)) then - allocate(DstParamData%AddBQuad(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AddBQuad.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%AddBQuad = SrcParamData%AddBQuad - end if - DstParamData%DT = SrcParamData%DT - if (allocated(SrcParamData%OutParam)) then - LB(1:1) = lbound(SrcParamData%OutParam) - UB(1:1) = ubound(SrcParamData%OutParam) - if (.not. allocated(DstParamData%OutParam)) then - allocate(DstParamData%OutParam(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call NWTC_Library_CopyOutParmType(SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - DstParamData%NumOuts = SrcParamData%NumOuts - DstParamData%NumTotalOuts = SrcParamData%NumTotalOuts - DstParamData%OutSwtch = SrcParamData%OutSwtch - DstParamData%OutFmt = SrcParamData%OutFmt - DstParamData%OutSFmt = SrcParamData%OutSFmt - DstParamData%Delim = SrcParamData%Delim - DstParamData%UnOutFile = SrcParamData%UnOutFile - DstParamData%OutDec = SrcParamData%OutDec - if (allocated(SrcParamData%Jac_u_indx)) then - LB(1:2) = lbound(SrcParamData%Jac_u_indx) - UB(1:2) = ubound(SrcParamData%Jac_u_indx) - if (.not. allocated(DstParamData%Jac_u_indx)) then - allocate(DstParamData%Jac_u_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_u_indx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_u_indx = SrcParamData%Jac_u_indx - end if - if (allocated(SrcParamData%du)) then - LB(1:1) = lbound(SrcParamData%du) - UB(1:1) = ubound(SrcParamData%du) - if (.not. allocated(DstParamData%du)) then - allocate(DstParamData%du(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%du.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%du = SrcParamData%du - end if - if (allocated(SrcParamData%dx)) then - LB(1:1) = lbound(SrcParamData%dx) - UB(1:1) = ubound(SrcParamData%dx) - if (.not. allocated(DstParamData%dx)) then - allocate(DstParamData%dx(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%dx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%dx = SrcParamData%dx - end if - DstParamData%Jac_ny = SrcParamData%Jac_ny - DstParamData%VisMeshes = SrcParamData%VisMeshes - DstParamData%WaveField => SrcParamData%WaveField - DstParamData%PtfmYMod = SrcParamData%PtfmYMod - DstParamData%CYawFilt = SrcParamData%CYawFilt -end subroutine - -subroutine HydroDyn_DestroyParam(ParamData, ErrStat, ErrMsg) - type(HydroDyn_ParameterType), intent(inout) :: ParamData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'HydroDyn_DestroyParam' + character(*), parameter :: RoutineName = 'HydroDyn_DestroyParam' ErrStat = ErrID_None ErrMsg = '' if (allocated(ParamData%WAMIT)) then @@ -1769,6 +1478,12 @@ subroutine HydroDyn_DestroyParam(ParamData, ErrStat, ErrMsg) end if call Morison_DestroyParam(ParamData%Morison, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(ParamData%NAddDOF)) then + deallocate(ParamData%NAddDOF) + end if + if (allocated(ParamData%BDOFStrt)) then + deallocate(ParamData%BDOFStrt) + end if if (allocated(ParamData%AddF0)) then deallocate(ParamData%AddF0) end if @@ -1790,15 +1505,6 @@ subroutine HydroDyn_DestroyParam(ParamData, ErrStat, ErrMsg) end do deallocate(ParamData%OutParam) end if - if (allocated(ParamData%Jac_u_indx)) then - deallocate(ParamData%Jac_u_indx) - end if - if (allocated(ParamData%du)) then - deallocate(ParamData%du) - end if - if (allocated(ParamData%dx)) then - deallocate(ParamData%dx) - end if nullify(ParamData%WaveField) end subroutine @@ -1835,6 +1541,10 @@ subroutine HydroDyn_PackParam(RF, Indata) call RegPack(RF, InData%PotMod) call RegPack(RF, InData%NBody) call RegPack(RF, InData%NBodyMod) + call RegPack(RF, InData%HasAddDOF) + call RegPackAlloc(RF, InData%NAddDOF) + call RegPack(RF, InData%NDOF) + call RegPackAlloc(RF, InData%BDOFStrt) call RegPack(RF, InData%totalStates) call RegPack(RF, InData%totalExctnStates) call RegPack(RF, InData%totalRdtnStates) @@ -1860,10 +1570,6 @@ subroutine HydroDyn_PackParam(RF, Indata) call RegPack(RF, InData%Delim) call RegPack(RF, InData%UnOutFile) call RegPack(RF, InData%OutDec) - call RegPackAlloc(RF, InData%Jac_u_indx) - call RegPackAlloc(RF, InData%du) - call RegPackAlloc(RF, InData%dx) - call RegPack(RF, InData%Jac_ny) call RegPack(RF, InData%VisMeshes) call RegPack(RF, associated(InData%WaveField)) if (associated(InData%WaveField)) then @@ -1921,6 +1627,10 @@ subroutine HydroDyn_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%PotMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NBody); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NBodyMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HasAddDOF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NAddDOF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NDOF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BDOFStrt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%totalStates); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%totalExctnStates); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%totalRdtnStates); if (RegCheckErr(RF, RoutineName)) return @@ -1950,10 +1660,6 @@ subroutine HydroDyn_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%Delim); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UnOutFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%OutDec); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_u_indx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VisMeshes); if (RegCheckErr(RF, RoutineName)) return if (associated(OutData%WaveField)) deallocate(OutData%WaveField) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return @@ -1983,6 +1689,7 @@ subroutine HydroDyn_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, Err integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'HydroDyn_CopyInput' @@ -1997,6 +1704,42 @@ subroutine HydroDyn_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, Err call MeshCopy(SrcInputData%PRPMesh, DstInputData%PRPMesh, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + if (allocated(SrcInputData%qAddDOF)) then + LB(1:1) = lbound(SrcInputData%qAddDOF) + UB(1:1) = ubound(SrcInputData%qAddDOF) + if (.not. allocated(DstInputData%qAddDOF)) then + allocate(DstInputData%qAddDOF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%qAddDOF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputData%qAddDOF = SrcInputData%qAddDOF + end if + if (allocated(SrcInputData%qAddDOFDot)) then + LB(1:1) = lbound(SrcInputData%qAddDOFDot) + UB(1:1) = ubound(SrcInputData%qAddDOFDot) + if (.not. allocated(DstInputData%qAddDOFDot)) then + allocate(DstInputData%qAddDOFDot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%qAddDOFDot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputData%qAddDOFDot = SrcInputData%qAddDOFDot + end if + if (allocated(SrcInputData%qAddDOFDotDot)) then + LB(1:1) = lbound(SrcInputData%qAddDOFDotDot) + UB(1:1) = ubound(SrcInputData%qAddDOFDotDot) + if (.not. allocated(DstInputData%qAddDOFDotDot)) then + allocate(DstInputData%qAddDOFDotDot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%qAddDOFDotDot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputData%qAddDOFDotDot = SrcInputData%qAddDOFDotDot + end if end subroutine subroutine HydroDyn_DestroyInput(InputData, ErrStat, ErrMsg) @@ -2014,6 +1757,15 @@ subroutine HydroDyn_DestroyInput(InputData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call MeshDestroy( InputData%PRPMesh, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InputData%qAddDOF)) then + deallocate(InputData%qAddDOF) + end if + if (allocated(InputData%qAddDOFDot)) then + deallocate(InputData%qAddDOFDot) + end if + if (allocated(InputData%qAddDOFDotDot)) then + deallocate(InputData%qAddDOFDotDot) + end if end subroutine subroutine HydroDyn_PackInput(RF, Indata) @@ -2024,6 +1776,9 @@ subroutine HydroDyn_PackInput(RF, Indata) call Morison_PackInput(RF, InData%Morison) call MeshPack(RF, InData%WAMITMesh) call MeshPack(RF, InData%PRPMesh) + call RegPackAlloc(RF, InData%qAddDOF) + call RegPackAlloc(RF, InData%qAddDOFDot) + call RegPackAlloc(RF, InData%qAddDOFDotDot) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -2031,10 +1786,16 @@ subroutine HydroDyn_UnPackInput(RF, OutData) type(RegFile), intent(inout) :: RF type(HydroDyn_InputType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'HydroDyn_UnPackInput' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call Morison_UnpackInput(RF, OutData%Morison) ! Morison call MeshUnpack(RF, OutData%WAMITMesh) ! WAMITMesh call MeshUnpack(RF, OutData%PRPMesh) ! PRPMesh + call RegUnpackAlloc(RF, OutData%qAddDOF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qAddDOFDot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qAddDOFDotDot); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine HydroDyn_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) @@ -2056,104 +1817,380 @@ subroutine HydroDyn_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, if (.not. allocated(DstOutputData%WAMIT)) then allocate(DstOutputData%WAMIT(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WAMIT.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WAMIT.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call WAMIT_CopyOutput(SrcOutputData%WAMIT(i1), DstOutputData%WAMIT(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcOutputData%WAMIT2)) then + LB(1:1) = lbound(SrcOutputData%WAMIT2) + UB(1:1) = ubound(SrcOutputData%WAMIT2) + if (.not. allocated(DstOutputData%WAMIT2)) then + allocate(DstOutputData%WAMIT2(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WAMIT2.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call WAMIT2_CopyOutput(SrcOutputData%WAMIT2(i1), DstOutputData%WAMIT2(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call Morison_CopyOutput(SrcOutputData%Morison, DstOutputData%Morison, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcOutputData%WAMITMesh, DstOutputData%WAMITMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcOutputData%WriteOutput)) then + LB(1:1) = lbound(SrcOutputData%WriteOutput) + UB(1:1) = ubound(SrcOutputData%WriteOutput) + if (.not. allocated(DstOutputData%WriteOutput)) then + allocate(DstOutputData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%WriteOutput = SrcOutputData%WriteOutput + end if + if (allocated(SrcOutputData%FAddDOF)) then + LB(1:1) = lbound(SrcOutputData%FAddDOF) + UB(1:1) = ubound(SrcOutputData%FAddDOF) + if (.not. allocated(DstOutputData%FAddDOF)) then + allocate(DstOutputData%FAddDOF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%FAddDOF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%FAddDOF = SrcOutputData%FAddDOF + end if +end subroutine + +subroutine HydroDyn_DestroyOutput(OutputData, ErrStat, ErrMsg) + type(HydroDyn_OutputType), intent(inout) :: OutputData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'HydroDyn_DestroyOutput' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(OutputData%WAMIT)) then + LB(1:1) = lbound(OutputData%WAMIT) + UB(1:1) = ubound(OutputData%WAMIT) + do i1 = LB(1), UB(1) + call WAMIT_DestroyOutput(OutputData%WAMIT(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(OutputData%WAMIT) + end if + if (allocated(OutputData%WAMIT2)) then + LB(1:1) = lbound(OutputData%WAMIT2) + UB(1:1) = ubound(OutputData%WAMIT2) + do i1 = LB(1), UB(1) + call WAMIT2_DestroyOutput(OutputData%WAMIT2(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(OutputData%WAMIT2) + end if + call Morison_DestroyOutput(OutputData%Morison, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( OutputData%WAMITMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(OutputData%WriteOutput)) then + deallocate(OutputData%WriteOutput) + end if + if (allocated(OutputData%FAddDOF)) then + deallocate(OutputData%FAddDOF) + end if +end subroutine + +subroutine HydroDyn_PackOutput(RF, Indata) + type(RegFile), intent(inout) :: RF + type(HydroDyn_OutputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'HydroDyn_PackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%WAMIT)) + if (allocated(InData%WAMIT)) then + call RegPackBounds(RF, 1, lbound(InData%WAMIT), ubound(InData%WAMIT)) + LB(1:1) = lbound(InData%WAMIT) + UB(1:1) = ubound(InData%WAMIT) + do i1 = LB(1), UB(1) + call WAMIT_PackOutput(RF, InData%WAMIT(i1)) + end do + end if + call RegPack(RF, allocated(InData%WAMIT2)) + if (allocated(InData%WAMIT2)) then + call RegPackBounds(RF, 1, lbound(InData%WAMIT2), ubound(InData%WAMIT2)) + LB(1:1) = lbound(InData%WAMIT2) + UB(1:1) = ubound(InData%WAMIT2) + do i1 = LB(1), UB(1) + call WAMIT2_PackOutput(RF, InData%WAMIT2(i1)) + end do + end if + call Morison_PackOutput(RF, InData%Morison) + call MeshPack(RF, InData%WAMITMesh) + call RegPackAlloc(RF, InData%WriteOutput) + call RegPackAlloc(RF, InData%FAddDOF) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine HydroDyn_UnPackOutput(RF, OutData) + type(RegFile), intent(inout) :: RF + type(HydroDyn_OutputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'HydroDyn_UnPackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%WAMIT)) deallocate(OutData%WAMIT) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%WAMIT(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%WAMIT.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call WAMIT_UnpackOutput(RF, OutData%WAMIT(i1)) ! WAMIT + end do + end if + if (allocated(OutData%WAMIT2)) deallocate(OutData%WAMIT2) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%WAMIT2(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%WAMIT2.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call WAMIT2_UnpackOutput(RF, OutData%WAMIT2(i1)) ! WAMIT2 + end do + end if + call Morison_UnpackOutput(RF, OutData%Morison) ! Morison + call MeshUnpack(RF, OutData%WAMITMesh) ! WAMITMesh + call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%FAddDOF); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine HydroDyn_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(HydroDyn_MiscVarType), intent(inout) :: SrcMiscData + type(HydroDyn_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'HydroDyn_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call HydroDyn_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call HydroDyn_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call HydroDyn_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call HydroDyn_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcMiscData%AllHdroOrigin, DstMiscData%AllHdroOrigin, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call HydroDyn_CopyHD_ModuleMapType(SrcMiscData%HD_MeshMap, DstMiscData%HD_MeshMap, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstMiscData%Decimate = SrcMiscData%Decimate + DstMiscData%LastOutTime = SrcMiscData%LastOutTime + if (allocated(SrcMiscData%F_PtfmAdd)) then + LB(1:1) = lbound(SrcMiscData%F_PtfmAdd) + UB(1:1) = ubound(SrcMiscData%F_PtfmAdd) + if (.not. allocated(DstMiscData%F_PtfmAdd)) then + allocate(DstMiscData%F_PtfmAdd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_PtfmAdd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%F_PtfmAdd = SrcMiscData%F_PtfmAdd + end if + DstMiscData%F_Hydro = SrcMiscData%F_Hydro + if (allocated(SrcMiscData%F_Waves)) then + LB(1:1) = lbound(SrcMiscData%F_Waves) + UB(1:1) = ubound(SrcMiscData%F_Waves) + if (.not. allocated(DstMiscData%F_Waves)) then + allocate(DstMiscData%F_Waves(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_Waves.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%F_Waves = SrcMiscData%F_Waves + end if + if (allocated(SrcMiscData%WAMIT)) then + LB(1:1) = lbound(SrcMiscData%WAMIT) + UB(1:1) = ubound(SrcMiscData%WAMIT) + if (.not. allocated(DstMiscData%WAMIT)) then + allocate(DstMiscData%WAMIT(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WAMIT.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call WAMIT_CopyOutput(SrcOutputData%WAMIT(i1), DstOutputData%WAMIT(i1), CtrlCode, ErrStat2, ErrMsg2) + call WAMIT_CopyMisc(SrcMiscData%WAMIT(i1), DstMiscData%WAMIT(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcOutputData%WAMIT2)) then - LB(1:1) = lbound(SrcOutputData%WAMIT2) - UB(1:1) = ubound(SrcOutputData%WAMIT2) - if (.not. allocated(DstOutputData%WAMIT2)) then - allocate(DstOutputData%WAMIT2(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%WAMIT2)) then + LB(1:1) = lbound(SrcMiscData%WAMIT2) + UB(1:1) = ubound(SrcMiscData%WAMIT2) + if (.not. allocated(DstMiscData%WAMIT2)) then + allocate(DstMiscData%WAMIT2(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WAMIT2.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%WAMIT2.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call WAMIT2_CopyOutput(SrcOutputData%WAMIT2(i1), DstOutputData%WAMIT2(i1), CtrlCode, ErrStat2, ErrMsg2) + call WAMIT2_CopyMisc(SrcMiscData%WAMIT2(i1), DstMiscData%WAMIT2(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call Morison_CopyOutput(SrcOutputData%Morison, DstOutputData%Morison, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcOutputData%WAMITMesh, DstOutputData%WAMITMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call Morison_CopyMisc(SrcMiscData%Morison, DstMiscData%Morison, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcOutputData%WriteOutput)) then - LB(1:1) = lbound(SrcOutputData%WriteOutput) - UB(1:1) = ubound(SrcOutputData%WriteOutput) - if (.not. allocated(DstOutputData%WriteOutput)) then - allocate(DstOutputData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%u_WAMIT)) then + LB(1:1) = lbound(SrcMiscData%u_WAMIT) + UB(1:1) = ubound(SrcMiscData%u_WAMIT) + if (.not. allocated(DstMiscData%u_WAMIT)) then + allocate(DstMiscData%u_WAMIT(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_WAMIT.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOutputData%WriteOutput = SrcOutputData%WriteOutput + do i1 = LB(1), UB(1) + call WAMIT_CopyInput(SrcMiscData%u_WAMIT(i1), DstMiscData%u_WAMIT(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if end subroutine -subroutine HydroDyn_DestroyOutput(OutputData, ErrStat, ErrMsg) - type(HydroDyn_OutputType), intent(inout) :: OutputData +subroutine HydroDyn_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(HydroDyn_MiscVarType), intent(inout) :: MiscData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'HydroDyn_DestroyOutput' + character(*), parameter :: RoutineName = 'HydroDyn_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' - if (allocated(OutputData%WAMIT)) then - LB(1:1) = lbound(OutputData%WAMIT) - UB(1:1) = ubound(OutputData%WAMIT) + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call HydroDyn_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call HydroDyn_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call HydroDyn_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call HydroDyn_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( MiscData%AllHdroOrigin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call HydroDyn_DestroyHD_ModuleMapType(MiscData%HD_MeshMap, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%F_PtfmAdd)) then + deallocate(MiscData%F_PtfmAdd) + end if + if (allocated(MiscData%F_Waves)) then + deallocate(MiscData%F_Waves) + end if + if (allocated(MiscData%WAMIT)) then + LB(1:1) = lbound(MiscData%WAMIT) + UB(1:1) = ubound(MiscData%WAMIT) do i1 = LB(1), UB(1) - call WAMIT_DestroyOutput(OutputData%WAMIT(i1), ErrStat2, ErrMsg2) + call WAMIT_DestroyMisc(MiscData%WAMIT(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%WAMIT) + deallocate(MiscData%WAMIT) end if - if (allocated(OutputData%WAMIT2)) then - LB(1:1) = lbound(OutputData%WAMIT2) - UB(1:1) = ubound(OutputData%WAMIT2) + if (allocated(MiscData%WAMIT2)) then + LB(1:1) = lbound(MiscData%WAMIT2) + UB(1:1) = ubound(MiscData%WAMIT2) do i1 = LB(1), UB(1) - call WAMIT2_DestroyOutput(OutputData%WAMIT2(i1), ErrStat2, ErrMsg2) + call WAMIT2_DestroyMisc(MiscData%WAMIT2(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%WAMIT2) + deallocate(MiscData%WAMIT2) end if - call Morison_DestroyOutput(OutputData%Morison, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( OutputData%WAMITMesh, ErrStat2, ErrMsg2) + call Morison_DestroyMisc(MiscData%Morison, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(OutputData%WriteOutput)) then - deallocate(OutputData%WriteOutput) + if (allocated(MiscData%u_WAMIT)) then + LB(1:1) = lbound(MiscData%u_WAMIT) + UB(1:1) = ubound(MiscData%u_WAMIT) + do i1 = LB(1), UB(1) + call WAMIT_DestroyInput(MiscData%u_WAMIT(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%u_WAMIT) end if end subroutine -subroutine HydroDyn_PackOutput(RF, Indata) +subroutine HydroDyn_PackMisc(RF, Indata) type(RegFile), intent(inout) :: RF - type(HydroDyn_OutputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'HydroDyn_PackOutput' + type(HydroDyn_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'HydroDyn_PackMisc' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return + call NWTC_Library_PackModJacType(RF, InData%Jac) + call HydroDyn_PackContState(RF, InData%x_perturb) + call HydroDyn_PackInput(RF, InData%u_perturb) + call HydroDyn_PackContState(RF, InData%dxdt_lin) + call HydroDyn_PackOutput(RF, InData%y_lin) + call MeshPack(RF, InData%AllHdroOrigin) + call HydroDyn_PackHD_ModuleMapType(RF, InData%HD_MeshMap) + call RegPack(RF, InData%Decimate) + call RegPack(RF, InData%LastOutTime) + call RegPackAlloc(RF, InData%F_PtfmAdd) + call RegPack(RF, InData%F_Hydro) + call RegPackAlloc(RF, InData%F_Waves) call RegPack(RF, allocated(InData%WAMIT)) if (allocated(InData%WAMIT)) then call RegPackBounds(RF, 1, lbound(InData%WAMIT), ubound(InData%WAMIT)) LB(1:1) = lbound(InData%WAMIT) UB(1:1) = ubound(InData%WAMIT) do i1 = LB(1), UB(1) - call WAMIT_PackOutput(RF, InData%WAMIT(i1)) + call WAMIT_PackMisc(RF, InData%WAMIT(i1)) end do end if call RegPack(RF, allocated(InData%WAMIT2)) @@ -2162,24 +2199,43 @@ subroutine HydroDyn_PackOutput(RF, Indata) LB(1:1) = lbound(InData%WAMIT2) UB(1:1) = ubound(InData%WAMIT2) do i1 = LB(1), UB(1) - call WAMIT2_PackOutput(RF, InData%WAMIT2(i1)) + call WAMIT2_PackMisc(RF, InData%WAMIT2(i1)) + end do + end if + call Morison_PackMisc(RF, InData%Morison) + call RegPack(RF, allocated(InData%u_WAMIT)) + if (allocated(InData%u_WAMIT)) then + call RegPackBounds(RF, 1, lbound(InData%u_WAMIT), ubound(InData%u_WAMIT)) + LB(1:1) = lbound(InData%u_WAMIT) + UB(1:1) = ubound(InData%u_WAMIT) + do i1 = LB(1), UB(1) + call WAMIT_PackInput(RF, InData%u_WAMIT(i1)) end do end if - call Morison_PackOutput(RF, InData%Morison) - call MeshPack(RF, InData%WAMITMesh) - call RegPackAlloc(RF, InData%WriteOutput) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine HydroDyn_UnPackOutput(RF, OutData) +subroutine HydroDyn_UnPackMisc(RF, OutData) type(RegFile), intent(inout) :: RF - type(HydroDyn_OutputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'HydroDyn_UnPackOutput' + type(HydroDyn_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'HydroDyn_UnPackMisc' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call HydroDyn_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call HydroDyn_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call HydroDyn_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call HydroDyn_UnpackOutput(RF, OutData%y_lin) ! y_lin + call MeshUnpack(RF, OutData%AllHdroOrigin) ! AllHdroOrigin + call HydroDyn_UnpackHD_ModuleMapType(RF, OutData%HD_MeshMap) ! HD_MeshMap + call RegUnpack(RF, OutData%Decimate); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LastOutTime); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%F_PtfmAdd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%F_Hydro); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%F_Waves); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%WAMIT)) deallocate(OutData%WAMIT) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -2190,7 +2246,7 @@ subroutine HydroDyn_UnPackOutput(RF, OutData) return end if do i1 = LB(1), UB(1) - call WAMIT_UnpackOutput(RF, OutData%WAMIT(i1)) ! WAMIT + call WAMIT_UnpackMisc(RF, OutData%WAMIT(i1)) ! WAMIT end do end if if (allocated(OutData%WAMIT2)) deallocate(OutData%WAMIT2) @@ -2203,12 +2259,23 @@ subroutine HydroDyn_UnPackOutput(RF, OutData) return end if do i1 = LB(1), UB(1) - call WAMIT2_UnpackOutput(RF, OutData%WAMIT2(i1)) ! WAMIT2 + call WAMIT2_UnpackMisc(RF, OutData%WAMIT2(i1)) ! WAMIT2 + end do + end if + call Morison_UnpackMisc(RF, OutData%Morison) ! Morison + if (allocated(OutData%u_WAMIT)) deallocate(OutData%u_WAMIT) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%u_WAMIT(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_WAMIT.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call WAMIT_UnpackInput(RF, OutData%u_WAMIT(i1)) ! u_WAMIT end do end if - call Morison_UnpackOutput(RF, OutData%Morison) ! Morison - call MeshUnpack(RF, OutData%WAMITMesh) ! WAMITMesh - call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine HydroDyn_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -2289,6 +2356,8 @@ SUBROUTINE HydroDyn_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, Er REAL(DbKi) :: a1, a2 ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' @@ -2312,6 +2381,15 @@ SUBROUTINE HydroDyn_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, Er CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp1(u1%PRPMesh, u2%PRPMesh, tin, u_out%PRPMesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%qAddDOF) .AND. ALLOCATED(u1%qAddDOF)) THEN + u_out%qAddDOF = a1*u1%qAddDOF + a2*u2%qAddDOF + END IF ! check if allocated + IF (ALLOCATED(u_out%qAddDOFDot) .AND. ALLOCATED(u1%qAddDOFDot)) THEN + u_out%qAddDOFDot = a1*u1%qAddDOFDot + a2*u2%qAddDOFDot + END IF ! check if allocated + IF (ALLOCATED(u_out%qAddDOFDotDot) .AND. ALLOCATED(u1%qAddDOFDotDot)) THEN + u_out%qAddDOFDotDot = a1*u1%qAddDOFDotDot + a2*u2%qAddDOFDotDot + END IF ! check if allocated END SUBROUTINE SUBROUTINE HydroDyn_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) @@ -2344,6 +2422,8 @@ SUBROUTINE HydroDyn_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors CHARACTER(*), PARAMETER :: RoutineName = 'HydroDyn_Input_ExtrapInterp2' + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' @@ -2373,6 +2453,15 @@ SUBROUTINE HydroDyn_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp2(u1%PRPMesh, u2%PRPMesh, u3%PRPMesh, tin, u_out%PRPMesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%qAddDOF) .AND. ALLOCATED(u1%qAddDOF)) THEN + u_out%qAddDOF = a1*u1%qAddDOF + a2*u2%qAddDOF + a3*u3%qAddDOF + END IF ! check if allocated + IF (ALLOCATED(u_out%qAddDOFDot) .AND. ALLOCATED(u1%qAddDOFDot)) THEN + u_out%qAddDOFDot = a1*u1%qAddDOFDot + a2*u2%qAddDOFDot + a3*u3%qAddDOFDot + END IF ! check if allocated + IF (ALLOCATED(u_out%qAddDOFDotDot) .AND. ALLOCATED(u1%qAddDOFDotDot)) THEN + u_out%qAddDOFDotDot = a1*u1%qAddDOFDotDot + a2*u2%qAddDOFDotDot + a3*u3%qAddDOFDotDot + END IF ! check if allocated END SUBROUTINE subroutine HydroDyn_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg) @@ -2491,6 +2580,9 @@ SUBROUTINE HydroDyn_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, E IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput END IF ! check if allocated + IF (ALLOCATED(y_out%FAddDOF) .AND. ALLOCATED(y1%FAddDOF)) THEN + y_out%FAddDOF = a1*y1%FAddDOF + a2*y2%FAddDOF + END IF ! check if allocated END SUBROUTINE SUBROUTINE HydroDyn_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) @@ -2567,6 +2659,348 @@ SUBROUTINE HydroDyn_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrSta IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated + IF (ALLOCATED(y_out%FAddDOF) .AND. ALLOCATED(y1%FAddDOF)) THEN + y_out%FAddDOF = a1*y1%FAddDOF + a2*y2%FAddDOF + a3*y3%FAddDOF + END IF ! check if allocated END SUBROUTINE + +function HydroDyn_InputMeshPointer(u, DL) result(Mesh) + type(HydroDyn_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (HydroDyn_u_Morison_Mesh) + Mesh => u%Morison%Mesh + case (HydroDyn_u_WAMITMesh) + Mesh => u%WAMITMesh + case (HydroDyn_u_PRPMesh) + Mesh => u%PRPMesh + end select +end function + +function HydroDyn_OutputMeshPointer(y, DL) result(Mesh) + type(HydroDyn_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (HydroDyn_y_WAMIT_Mesh) + Mesh => y%WAMIT(DL%i1)%Mesh + case (HydroDyn_y_WAMIT2_Mesh) + Mesh => y%WAMIT2(DL%i1)%Mesh + case (HydroDyn_y_Morison_Mesh) + Mesh => y%Morison%Mesh + case (HydroDyn_y_Morison_VisMesh) + Mesh => y%Morison%VisMesh + case (HydroDyn_y_WAMITMesh) + Mesh => y%WAMITMesh + end select +end function + +subroutine HydroDyn_VarsPackContState(Vars, x, ValAry) + type(HydroDyn_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call HydroDyn_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine HydroDyn_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(HydroDyn_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (HydroDyn_x_WAMIT_SS_Rdtn_x) + VarVals = x%WAMIT(DL%i1)%SS_Rdtn%x(V%iLB:V%iUB) ! Rank 1 Array + case (HydroDyn_x_WAMIT_SS_Exctn_x) + VarVals = x%WAMIT(DL%i1)%SS_Exctn%x(V%iLB:V%iUB) ! Rank 1 Array + case (HydroDyn_x_WAMIT_Conv_Rdtn_DummyContState) + VarVals(1) = x%WAMIT(DL%i1)%Conv_Rdtn%DummyContState ! Scalar + case (HydroDyn_x_Morison_DummyContState) + VarVals(1) = x%Morison%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine HydroDyn_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(HydroDyn_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call HydroDyn_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine HydroDyn_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(HydroDyn_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (HydroDyn_x_WAMIT_SS_Rdtn_x) + x%WAMIT(DL%i1)%SS_Rdtn%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (HydroDyn_x_WAMIT_SS_Exctn_x) + x%WAMIT(DL%i1)%SS_Exctn%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (HydroDyn_x_WAMIT_Conv_Rdtn_DummyContState) + x%WAMIT(DL%i1)%Conv_Rdtn%DummyContState = VarVals(1) ! Scalar + case (HydroDyn_x_Morison_DummyContState) + x%Morison%DummyContState = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function HydroDyn_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (HydroDyn_x_WAMIT_SS_Rdtn_x) + Name = "x%WAMIT("//trim(Num2LStr(DL%i1))//")%SS_Rdtn%x" + case (HydroDyn_x_WAMIT_SS_Exctn_x) + Name = "x%WAMIT("//trim(Num2LStr(DL%i1))//")%SS_Exctn%x" + case (HydroDyn_x_WAMIT_Conv_Rdtn_DummyContState) + Name = "x%WAMIT("//trim(Num2LStr(DL%i1))//")%Conv_Rdtn%DummyContState" + case (HydroDyn_x_Morison_DummyContState) + Name = "x%Morison%DummyContState" + case default + Name = "Unknown Field" + end select +end function + +subroutine HydroDyn_VarsPackContStateDeriv(Vars, x, ValAry) + type(HydroDyn_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call HydroDyn_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine HydroDyn_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(HydroDyn_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (HydroDyn_x_WAMIT_SS_Rdtn_x) + VarVals = x%WAMIT(DL%i1)%SS_Rdtn%x(V%iLB:V%iUB) ! Rank 1 Array + case (HydroDyn_x_WAMIT_SS_Exctn_x) + VarVals = x%WAMIT(DL%i1)%SS_Exctn%x(V%iLB:V%iUB) ! Rank 1 Array + case (HydroDyn_x_WAMIT_Conv_Rdtn_DummyContState) + VarVals(1) = x%WAMIT(DL%i1)%Conv_Rdtn%DummyContState ! Scalar + case (HydroDyn_x_Morison_DummyContState) + VarVals(1) = x%Morison%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine HydroDyn_VarsPackInput(Vars, u, ValAry) + type(HydroDyn_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call HydroDyn_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine HydroDyn_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(HydroDyn_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (HydroDyn_u_Morison_Mesh) + call MV_PackMesh(V, u%Morison%Mesh, ValAry) ! Mesh + case (HydroDyn_u_Morison_PtfmRefY) + VarVals(1) = u%Morison%PtfmRefY ! Scalar + case (HydroDyn_u_WAMITMesh) + call MV_PackMesh(V, u%WAMITMesh, ValAry) ! Mesh + case (HydroDyn_u_PRPMesh) + call MV_PackMesh(V, u%PRPMesh, ValAry) ! Mesh + case (HydroDyn_u_qAddDOF) + VarVals = u%qAddDOF(V%iLB:V%iUB) ! Rank 1 Array + case (HydroDyn_u_qAddDOFDot) + VarVals = u%qAddDOFDot(V%iLB:V%iUB) ! Rank 1 Array + case (HydroDyn_u_qAddDOFDotDot) + VarVals = u%qAddDOFDotDot(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine HydroDyn_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(HydroDyn_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call HydroDyn_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine HydroDyn_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(HydroDyn_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (HydroDyn_u_Morison_Mesh) + call MV_UnpackMesh(V, ValAry, u%Morison%Mesh) ! Mesh + case (HydroDyn_u_Morison_PtfmRefY) + u%Morison%PtfmRefY = VarVals(1) ! Scalar + case (HydroDyn_u_WAMITMesh) + call MV_UnpackMesh(V, ValAry, u%WAMITMesh) ! Mesh + case (HydroDyn_u_PRPMesh) + call MV_UnpackMesh(V, ValAry, u%PRPMesh) ! Mesh + case (HydroDyn_u_qAddDOF) + u%qAddDOF(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (HydroDyn_u_qAddDOFDot) + u%qAddDOFDot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (HydroDyn_u_qAddDOFDotDot) + u%qAddDOFDotDot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function HydroDyn_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (HydroDyn_u_Morison_Mesh) + Name = "u%Morison%Mesh" + case (HydroDyn_u_Morison_PtfmRefY) + Name = "u%Morison%PtfmRefY" + case (HydroDyn_u_WAMITMesh) + Name = "u%WAMITMesh" + case (HydroDyn_u_PRPMesh) + Name = "u%PRPMesh" + case (HydroDyn_u_qAddDOF) + Name = "u%qAddDOF" + case (HydroDyn_u_qAddDOFDot) + Name = "u%qAddDOFDot" + case (HydroDyn_u_qAddDOFDotDot) + Name = "u%qAddDOFDotDot" + case default + Name = "Unknown Field" + end select +end function + +subroutine HydroDyn_VarsPackOutput(Vars, y, ValAry) + type(HydroDyn_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call HydroDyn_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine HydroDyn_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(HydroDyn_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (HydroDyn_y_WAMIT_Mesh) + call MV_PackMesh(V, y%WAMIT(DL%i1)%Mesh, ValAry) ! Mesh + case (HydroDyn_y_WAMIT_FAddDOF) + VarVals = y%WAMIT(DL%i1)%FAddDOF(V%iLB:V%iUB) ! Rank 1 Array + case (HydroDyn_y_WAMIT2_Mesh) + call MV_PackMesh(V, y%WAMIT2(DL%i1)%Mesh, ValAry) ! Mesh + case (HydroDyn_y_Morison_Mesh) + call MV_PackMesh(V, y%Morison%Mesh, ValAry) ! Mesh + case (HydroDyn_y_Morison_VisMesh) + call MV_PackMesh(V, y%Morison%VisMesh, ValAry) ! Mesh + case (HydroDyn_y_Morison_WriteOutput) + VarVals = y%Morison%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (HydroDyn_y_WAMITMesh) + call MV_PackMesh(V, y%WAMITMesh, ValAry) ! Mesh + case (HydroDyn_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (HydroDyn_y_FAddDOF) + VarVals = y%FAddDOF(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine HydroDyn_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(HydroDyn_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call HydroDyn_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine HydroDyn_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(HydroDyn_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (HydroDyn_y_WAMIT_Mesh) + call MV_UnpackMesh(V, ValAry, y%WAMIT(DL%i1)%Mesh) ! Mesh + case (HydroDyn_y_WAMIT_FAddDOF) + y%WAMIT(DL%i1)%FAddDOF(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (HydroDyn_y_WAMIT2_Mesh) + call MV_UnpackMesh(V, ValAry, y%WAMIT2(DL%i1)%Mesh) ! Mesh + case (HydroDyn_y_Morison_Mesh) + call MV_UnpackMesh(V, ValAry, y%Morison%Mesh) ! Mesh + case (HydroDyn_y_Morison_VisMesh) + call MV_UnpackMesh(V, ValAry, y%Morison%VisMesh) ! Mesh + case (HydroDyn_y_Morison_WriteOutput) + y%Morison%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (HydroDyn_y_WAMITMesh) + call MV_UnpackMesh(V, ValAry, y%WAMITMesh) ! Mesh + case (HydroDyn_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (HydroDyn_y_FAddDOF) + y%FAddDOF(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function HydroDyn_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (HydroDyn_y_WAMIT_Mesh) + Name = "y%WAMIT("//trim(Num2LStr(DL%i1))//")%Mesh" + case (HydroDyn_y_WAMIT_FAddDOF) + Name = "y%WAMIT("//trim(Num2LStr(DL%i1))//")%FAddDOF" + case (HydroDyn_y_WAMIT2_Mesh) + Name = "y%WAMIT2("//trim(Num2LStr(DL%i1))//")%Mesh" + case (HydroDyn_y_Morison_Mesh) + Name = "y%Morison%Mesh" + case (HydroDyn_y_Morison_VisMesh) + Name = "y%Morison%VisMesh" + case (HydroDyn_y_Morison_WriteOutput) + Name = "y%Morison%WriteOutput" + case (HydroDyn_y_WAMITMesh) + Name = "y%WAMITMesh" + case (HydroDyn_y_WriteOutput) + Name = "y%WriteOutput" + case (HydroDyn_y_FAddDOF) + Name = "y%FAddDOF" + case default + Name = "Unknown Field" + end select +end function + END MODULE HydroDyn_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/hydrodyn/src/Morison.f90 b/modules/hydrodyn/src/Morison.f90 index b18a68a66d..987ddeced6 100644 --- a/modules/hydrodyn/src/Morison.f90 +++ b/modules/hydrodyn/src/Morison.f90 @@ -2806,6 +2806,7 @@ SUBROUTINE Morison_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In p%NMOutputs = InitInp%NMOutputs ! Number of members to output [ >=0 and <10] p%WaveDisp = InitInp%WaveDisp p%AMMod = InitInp%AMMod + p%HstMod = InitInp%HstMod p%VisMeshes = InitInp%VisMeshes ! visualization mesh for morison elements p%PtfmYMod = InitInp%PtfmYMod p%NFillGroups = InitInp%NFillGroups @@ -2819,6 +2820,10 @@ SUBROUTINE Morison_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In p%AMMod = 0_IntKi END IF + ! Only compute hydrostatic loads up to the wave free surface if waves stretching is enabled + IF ( p%WaveField%WaveStMod .EQ. 0_IntKi ) THEN + p%HstMod = 0_IntKi + END IF ALLOCATE ( p%MOutLst(p%NMOutputs), STAT = errStat2 ) IF ( errStat2 /= 0 ) THEN @@ -3446,7 +3451,7 @@ SUBROUTINE AllocateNodeLoadVariables(InitInp, p, m, NNodes, errStat, errMsg ) END SUBROUTINE AllocateNodeLoadVariables !---------------------------------------------------------------------------------------------------------------------------------- !> Routine for computing outputs, used in both loose and tight coupling. -SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, errMsg ) +SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, errMsg, calcHstLds ) !.................................................................................................................................. REAL(DbKi), INTENT(IN ) :: Time !< Current simulation time in seconds @@ -3461,6 +3466,8 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, TYPE(Morison_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: errStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: errMsg !< Error message if errStat /= ErrID_None + LOGICAL, OPTIONAL, INTENT(IN ) :: calcHstLds !< Flag to calculate the hydrostatic loads (default: .true.) + !! Used to speed up Jacobian calculations when perturbing velocity/acceleration inputs ! Local variables INTEGER(IntKi) :: errStat2 ! Error status of the operation (occurs after initial error) @@ -3540,12 +3547,20 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, INTEGER(IntKi) :: nodeInWater REAL(SiKi) :: WaveElev1, WaveElev2, WaveElev, FDynP, FV(3), FA(3), FAMCF(3) LOGICAL :: Is1stElement, Is1stFloodedMember + LOGICAL :: calcHstLdsLocal ! Initialize errStat errStat = ErrID_None errMsg = "" Imat = 0.0_ReKi g = p%Gravity + + ! Determine whether to calculate hydrostatic loads + if (present(calcHstLds)) then + calcHstLdsLocal = calcHstLds + else + calcHstLdsLocal = .true. + end if !=============================================================================================== ! Get displaced positions of the hydrodynamic nodes @@ -3554,7 +3569,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, !=============================================================================================== ! Calculate the fluid kinematics at all mesh nodes and store for use in the equations below - CALL WaveField_GetWaveKin( p%WaveField, m%WaveField_m, Time, m%DispNodePosHdn, .FALSE., m%nodeInWater, m%WaveElev1, m%WaveElev2, m%WaveElev, m%FDynP, m%FV, m%FA, m%FAMCF, ErrStat2, ErrMsg2 ) + CALL WaveField_GetWaveKin( p%WaveField, m%WaveField_m, Time, m%DispNodePosHdn, .FALSE., .TRUE., m%nodeInWater, m%WaveElev1, m%WaveElev2, m%WaveElev, m%FDynP, m%FV, m%FA, m%FAMCF, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! Compute fluid velocity relative to the structure DO j = 1, p%NNodes @@ -3572,7 +3587,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, DO j = 1,p%FilledGroups(i)%FillNumM im = p%FilledGroups(i)%FillMList(j) IF (p%Members(im)%memfloodstatus>0) THEN - CALL getMemBallastHiPt(p%Members(im),z_hi,ErrStat2,ErrMsg2); if (Failed()) return + CALL getMemBallastHiPt(p,m,u,p%Members(im),z_hi,ErrStat2,ErrMsg2); if (Failed()) return IF ( Is1stFloodedMember ) THEN m%zFillGroup(i) = z_hi Is1stFloodedMember = .false. @@ -3597,8 +3612,8 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, ! Loop through each member DO im = 1, p%NMembers - N = p%Members(im)%NElements mem = p%Members(im) + N = mem%NElements call YawMember(mem, u%PtfmRefY, ErrStat2, ErrMsg2) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -3660,8 +3675,6 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, ! Note: CMatrix is element local to global displaced. CTrans is the opposite. ! save some commonly used variables dl = mem%dl - z1 = pos1(3) ! get node z locations from input mesh - z2 = pos2(3) a_s1 = u%Mesh%TranslationAcc(:, mem%NodeIndx(i )) alpha_s1 = u%Mesh%RotationAcc (:, mem%NodeIndx(i )) omega_s1 = u%Mesh%RotationVel (:, mem%NodeIndx(i )) @@ -3752,17 +3765,26 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, y%Mesh%Moment(:,mem%NodeIndx(i+1)) = y%Mesh%Moment(:,mem%NodeIndx(i+1)) + F_IMG(4:6) ! ------------------- buoyancy loads: sides: Sections 3.1 and 3.2 ------------------------ - IF (mem%MHstLMod == 1) THEN - IF ( p%WaveField%WaveStMod > 0_IntKi ) THEN ! If wave stretching is enabled, compute buoyancy up to free surface - CALL GetTotalWaveElev( Time, pos1, Zeta1, ErrStat2, ErrMsg2 ) - CALL GetTotalWaveElev( Time, pos2, Zeta2, ErrStat2, ErrMsg2 ) + + ! Skip hydrostatic load calculation if flag is false + if (.not. calcHstLdsLocal) cycle + + ! Select hydrostatic load calculation method + select case (mem%MHstLMod) + + ! Standard hydrostatic load calculation + case (1) + + IF ( p%HstMod > 0_IntKi ) THEN ! If wave stretching is enabled, compute buoyancy up to free surface + CALL GetTotalWaveElev(p, m, Time, pos1, Zeta1, ErrStat2, ErrMsg2 ) + CALL GetTotalWaveElev(p, m, Time, pos2, Zeta2, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ELSE ! Without wave stretching, compute buoyancy based on SWL Zeta1 = 0.0_ReKi Zeta2 = 0.0_ReKi END IF Is1stElement = ( i .EQ. 1) - CALL getElementHstLds_Mod1( Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1b, r2b, dl, mem%alpha(i), Is1stElement, F_B0, F_B1, F_B2, ErrStat2, ErrMsg2 ) + CALL getElementHstLds_Mod1(p, m, mem, Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1b, r2b, dl, mem%alpha(i), Is1stElement, F_B0, F_B1, F_B2, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! Add nodal loads to mesh IF ( .NOT. Is1stElement ) THEN @@ -3776,13 +3798,17 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, y%Mesh%Moment(:,mem%NodeIndx(i )) = y%Mesh%Moment(:,mem%NodeIndx(i )) + F_B1(4:6) y%Mesh%Force (:,mem%NodeIndx(i+1)) = y%Mesh%Force (:,mem%NodeIndx(i+1)) + F_B2(1:3) y%Mesh%Moment(:,mem%NodeIndx(i+1)) = y%Mesh%Moment(:,mem%NodeIndx(i+1)) + F_B2(4:6) - ELSE IF (mem%MHstLMod == 2) THEN ! Alternative hydrostatic load calculation + + ! Alternative hydrostatic load calculation + case (2) + ! Get free surface elevation and normal at the element midpoint (both assumed constant over the element) posMid = 0.5 * (pos1+pos2) - IF (p%WaveField%WaveStMod > 0) THEN - CALL GetTotalWaveElev( Time, posMid, ZetaMid, ErrStat2, ErrMsg2 ) + + IF (p%HstMod > 0_IntKi) THEN + CALL GetTotalWaveElev(p, m, Time, posMid, ZetaMid, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL GetFreeSurfaceNormal( Time, posMid, n_hat, ErrStat2, ErrMsg2 ) + CALL GetFreeSurfaceNormal( p, m, Time, posMid, n_hat, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) FSPt = (/posMid(1),posMid(2),ZetaMid/) ! Reference point on the free surface ELSE @@ -3792,11 +3818,12 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, IF (mem%MSecGeom == MSecGeom_Cyl) THEN CALL GetSectionUnitVectors_Cyl( k_hat, y_hat, z_hat ) - CALL getElementHstLds_Mod2_Cyl( pos1, pos2, FSPt, k_hat, y_hat, z_hat, n_hat, r1b, r2b, dl, F_B1, F_B2, ErrStat2, ErrMsg2) + CALL getElementHstLds_Mod2_Cyl( p, pos1, pos2, FSPt, k_hat, y_hat, z_hat, n_hat, r1b, r2b, dl, F_B1, F_B2, ErrStat2, ErrMsg2) ELSE IF (mem%MSecGeom == MSecGeom_Rec) THEN CALL GetSectionUnitVectors_Rec( CMatrix, x_hat, y_hat ) - CALL getElementHstLds_Mod2_Rec( pos1, pos2, FSPt, k_hat, x_hat, y_hat, n_hat, Sa1b, Sa2b, Sb1b, Sb2b, dl, F_B1, F_B2, ErrStat2, ErrMsg2) + CALL getElementHstLds_Mod2_Rec( p, pos1, pos2, FSPt, k_hat, x_hat, y_hat, n_hat, Sa1b, Sa2b, Sb1b, Sb2b, dl, F_B1, F_B2, ErrStat2, ErrMsg2) END IF + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! Add nodal loads to mesh @@ -3806,7 +3833,8 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, y%Mesh%Moment(:,mem%NodeIndx(i )) = y%Mesh%Moment(:,mem%NodeIndx(i )) + F_B1(4:6) y%Mesh%Force (:,mem%NodeIndx(i+1)) = y%Mesh%Force (:,mem%NodeIndx(i+1)) + F_B2(1:3) y%Mesh%Moment(:,mem%NodeIndx(i+1)) = y%Mesh%Moment(:,mem%NodeIndx(i+1)) + F_B2(4:6) - END IF ! MHstLMod + + end select ! MHstLMod END DO ! i = max(mem%i_floor,1), N ! loop through member elements that are not fully buried in the seabed END IF ! NOT Modeled with Potential flow theory @@ -4035,7 +4063,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, 0.5*mem%AxCd(i)*p%WaveField%WtrDens * pi*mem%RMG(i)*dRdl_p * & ! axial part abs(dot_product( mem%k, m%vrel(:,mem%NodeIndx(i)) )) * matmul( mem%kkt, m%vrel(:,mem%NodeIndx(i)) ) ! axial part cont'd ELSE IF (mem%MSecGeom==MSecGeom_Rec) THEN - Call GetDistDrag_Rec(Time,mem,i,dSadl_p,dSbdl_p,f_hydro,ErrStat2,ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Call GetDistDrag_Rec(p, m, u, xd, Time,mem,i,dSadl_p,dSbdl_p,f_hydro,ErrStat2,ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF CALL LumpDistrHydroLoads( f_hydro, mem%k, deltal, h_c, m%memberLoads(im)%F_D(:, i) ) y%Mesh%Force (:,mem%NodeIndx(i)) = y%Mesh%Force (:,mem%NodeIndx(i)) + m%memberLoads(im)%F_D(1:3, i) @@ -4117,7 +4145,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, ! Compute the distributed loads at the point of intersection between the member and the free surface ! !----------------------------------------------------------------------------------------------------! ! Get wave kinematics at the free-surface intersection. Set forceNodeInWater=.TRUE. to guarantee the free-surface intersection is in water. - CALL WaveField_GetNodeWaveKin( p%WaveField, m%WaveField_m, Time, FSInt, .TRUE., nodeInWater, WaveElev1, WaveElev2, WaveElev, FDynP, FV, FA, FAMCF, ErrStat2, ErrMsg2 ) + CALL WaveField_GetNodeWaveKin( p%WaveField, m%WaveField_m, Time, FSInt, .TRUE., .TRUE., nodeInWater, WaveElev1, WaveElev2, WaveElev, FDynP, FV, FA, FAMCF, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) FDynPFSInt = REAL(FDynP,ReKi) FVFSInt = REAL(FV, ReKi) @@ -4190,7 +4218,8 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, CpFSInt = SubRatio * mem%Cp( FSElem+1) + (1.0-SubRatio) * mem%Cp( FSElem) AxCpFSInt = SubRatio * mem%AxCp(FSElem+1) + (1.0-SubRatio) * mem%AxCp(FSElem) - Call GetDistDrag_Rec(Time,mem,FSElem,dSadl_p,dSbdl_p,F_DS,ErrStat2,ErrMsg2,SubRatio,vrelFSInt); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Call GetDistDrag_Rec(p, m, u, xd, Time,mem,FSElem,dSadl_p,dSbdl_p,F_DS,ErrStat2,ErrMsg2,SubRatio,vrelFSInt) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! Hydrodynamic added mass and inertia loads IF ( .NOT. mem%PropPot ) THEN @@ -4401,7 +4430,8 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, 0.5*mem%AxCd(i)*p%WaveField%WtrDens*pi*mem%RMG(i)*dRdl_p * & ! axial part abs(dot_product( mem%k, m%vrel(:,mem%NodeIndx(i)) )) * matmul( mem%kkt, m%vrel(:,mem%NodeIndx(i)) ) ! axial part cont'd ELSE IF (mem%MSecGeom==MSecGeom_Rec) THEN - Call GetDistDrag_Rec(Time,mem,i,dSadl_p,dSbdl_p,f_hydro,ErrStat2,ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Call GetDistDrag_Rec(p, m, u, xd, Time,mem,i,dSadl_p,dSbdl_p,f_hydro,ErrStat2,ErrMsg2) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END IF CALL LumpDistrHydroLoads( f_hydro, mem%k, deltal, h_c, m%memberLoads(im)%F_D(:, i) ) y%Mesh%Force (:,mem%NodeIndx(i)) = y%Mesh%Force (:,mem%NodeIndx(i)) + m%memberLoads(im)%F_D(1:3, i) @@ -4565,10 +4595,10 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, end if if (mem%i_floor == 0) then ! both ends above or at seabed ! Compute loads on the end plate of node 1 - IF (p%WaveField%WaveStMod > 0) THEN - CALL GetTotalWaveElev( Time, pos1, Zeta1, ErrStat2, ErrMsg2 ) + IF (p%HstMod > 0_IntKi) THEN + CALL GetTotalWaveElev(p, m, Time, pos1, Zeta1, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL GetFreeSurfaceNormal( Time, pos1, n_hat, ErrStat2, ErrMsg2 ) + CALL GetFreeSurfaceNormal(p, m, Time, pos1, n_hat, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) FSPt = (/pos1(1),pos1(2),Zeta1/) ! Reference point on the free surface ELSE @@ -4580,7 +4610,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, CALL GetSectionUnitVectors_Cyl( k_hat1, y_hat, z_hat ) CALL GetSectionFreeSurfaceIntersects_Cyl( REAL(pos1,DbKi), REAL(FSPt,DbKi), k_hat1, y_hat, z_hat, n_hat, REAL(r1,DbKi), theta1, theta2, secStat) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL GetEndPlateHstLds_Cyl(pos1, k_hat1, y_hat, z_hat, r1, theta1, theta2, F_B_End) + CALL GetEndPlateHstLds_Cyl(p, pos1, k_hat1, y_hat, z_hat, r1, theta1, theta2, F_B_End) IF (mem%MHstLMod == 1) THEN ! Check for partially wetted end plates IF ( .NOT.( EqualRealNos((theta2-theta1),0.0_DbKi) .OR. EqualRealNos((theta2-theta1),2.0_DbKi*PI_D) ) ) THEN CALL SetErrStat(ErrID_Warn, 'End plate is partially wetted with MHstLMod = 1. The buoyancy load and distribution potentially have large error. This has happened to the first node of Member ID ' //trim(num2lstr(mem%MemberID)), errStat, errMsg, RoutineName ) @@ -4588,15 +4618,15 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, END IF else if (mem%MSecGeom==MSecGeom_Rec) then CALL GetSectionUnitVectors_Rec( CMatrix1, x_hat, y_hat ) - CALL GetEndPlateHstLds_Rec(pos1, k_hat1, x_hat, y_hat, Sa1, Sb1, FSPt, n_hat, F_B_End) + CALL GetEndPlateHstLds_Rec(p, pos1, k_hat1, x_hat, y_hat, Sa1, Sb1, FSPt, n_hat, F_B_End) end if m%F_B_End(:, mem%NodeIndx( 1)) = m%F_B_End(:, mem%NodeIndx( 1)) + F_B_End ! Compute loads on the end plate of node N+1 - IF (p%WaveField%WaveStMod > 0) THEN - CALL GetTotalWaveElev( Time, pos2, Zeta2, ErrStat2, ErrMsg2 ) + IF (p%HstMod > 0_IntKi) THEN + CALL GetTotalWaveElev(p, m, Time, pos2, Zeta2, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL GetFreeSurfaceNormal( Time, pos2, n_hat, ErrStat2, ErrMsg2 ) + CALL GetFreeSurfaceNormal(p, m, Time, pos2, n_hat, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) FSPt = (/pos2(1),pos2(2),Zeta2/) ! Reference point on the free surface ELSE @@ -4608,7 +4638,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, CALL GetSectionUnitVectors_Cyl( k_hat2, y_hat, z_hat ) CALL GetSectionFreeSurfaceIntersects_Cyl( REAL(pos2,DbKi), REAL(FSPt,DbKi), k_hat2, y_hat, z_hat, n_hat, REAL(r2,DbKi), theta1, theta2, secStat) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL GetEndPlateHstLds_Cyl(pos2, k_hat2, y_hat, z_hat, r2, theta1, theta2, F_B_End) + CALL GetEndPlateHstLds_Cyl(p, pos2, k_hat2, y_hat, z_hat, r2, theta1, theta2, F_B_End) IF (mem%MHstLMod == 1) THEN ! Check for partially wetted end plates IF ( .NOT.( EqualRealNos((theta2-theta1),0.0_DbKi) .OR. EqualRealNos((theta2-theta1),2.0_DbKi*PI_D) ) ) THEN CALL SetErrStat(ErrID_Warn, 'End plate is partially wetted with MHstLMod = 1. The buoyancy load and distribution potentially have large error. This has happened to the last node of Member ID ' //trim(num2lstr(mem%MemberID)), errStat, errMsg, RoutineName ) @@ -4616,16 +4646,16 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, END IF else if (mem%MSecGeom==MSecGeom_Rec) then CALL GetSectionUnitVectors_Rec( CMatrix2, x_hat, y_hat ) - CALL GetEndPlateHstLds_Rec(pos2, k_hat2, x_hat, y_hat, Sa2, Sb2, FSPt, n_hat, F_B_End) + CALL GetEndPlateHstLds_Rec(p, pos2, k_hat2, x_hat, y_hat, Sa2, Sb2, FSPt, n_hat, F_B_End) end if m%F_B_End(:, mem%NodeIndx(N+1)) = m%F_B_End(:, mem%NodeIndx(N+1)) - F_B_End elseif ( mem%doEndBuoyancy ) then ! The member crosses the seabed line so only the upper end potentially have hydrostatic load ! Only compute the loads on the end plate of node N+1 - IF (p%WaveField%WaveStMod > 0) THEN - CALL GetTotalWaveElev( Time, pos2, Zeta2, ErrStat2, ErrMsg2 ) + IF (p%HstMod > 0_IntKi) THEN + CALL GetTotalWaveElev(p, m, Time, pos2, Zeta2, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL GetFreeSurfaceNormal( Time, pos2, n_hat, ErrStat2, ErrMsg2 ) + CALL GetFreeSurfaceNormal(p, m, Time, pos2, n_hat, ErrStat2, ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) FSPt = (/pos2(1),pos2(2),Zeta2/) ! Reference point on the free surface ELSE @@ -4637,7 +4667,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, CALL GetSectionUnitVectors_Cyl( k_hat2, y_hat, z_hat ) CALL GetSectionFreeSurfaceIntersects_Cyl( REAL(pos2,DbKi), REAL(FSPt,DbKi), k_hat2, y_hat, z_hat, n_hat, REAL(r2,DbKi), theta1, theta2, secStat) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL GetEndPlateHstLds_Cyl(pos2, k_hat2, y_hat, z_hat, r2, theta1, theta2, F_B_End) + CALL GetEndPlateHstLds_Cyl(p, pos2, k_hat2, y_hat, z_hat, r2, theta1, theta2, F_B_End) IF (mem%MHstLMod == 1) THEN ! Check for partially wetted end plates IF ( .NOT.( EqualRealNos((theta2-theta1),0.0_DbKi) .OR. EqualRealNos((theta2-theta1),2.0_DbKi*PI_D) ) ) THEN CALL SetErrStat(ErrID_Warn, 'End plate is partially wetted with MHstLMod = 1. The buoyancy load and distribution potentially have large error. This has happened to the last node of Member ID ' //trim(num2lstr(mem%MemberID)), errStat, errMsg, RoutineName ) @@ -4645,7 +4675,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, END IF else if (mem%MSecGeom==MSecGeom_Rec) then CALL GetSectionUnitVectors_Rec( CMatrix2, x_hat, y_hat ) - CALL GetEndPlateHstLds_Rec(pos2, k_hat2, x_hat, y_hat, Sa2, Sb2, FSPt, n_hat, F_B_End) + CALL GetEndPlateHstLds_Rec(p, pos2, k_hat2, x_hat, y_hat, Sa2, Sb2, FSPt, n_hat, F_B_End) end if m%F_B_End(:, mem%NodeIndx(N+1)) = m%F_B_End(:, mem%NodeIndx(N+1)) - F_B_End @@ -4679,7 +4709,7 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, ! Effect of wave stretching already baked into m%FDynP, m%FA, and m%vrel. No additional modification needed. ! Joint yaw offset - call YawJoint(J,u%PtfmRefY,AM_End,An_End,DP_Const_End,I_MG_End,ErrStat2,ErrMsg2) + call YawJoint(p, J,u%PtfmRefY,AM_End,An_End,DP_Const_End,I_MG_End,ErrStat2,ErrMsg2) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! Lumped added mass loads @@ -4742,7 +4772,19 @@ SUBROUTINE Morison_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, errStat, CONTAINS - SUBROUTINE GetTotalWaveElev( Time, pos, Zeta, ErrStat, ErrMsg ) + logical function Failed() + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Failed = ErrStat >= AbortErrLev + !if (Failed) then + ! call FailCleanup() + !endif + end function Failed + +END SUBROUTINE Morison_CalcOutput + + SUBROUTINE GetTotalWaveElev(p, m, Time, pos, Zeta, ErrStat, ErrMsg ) + TYPE(Morison_ParameterType), INTENT( IN ) :: p + TYPE(Morison_MiscVarType), INTENT( INOUT ) :: m REAL(DbKi), INTENT( IN ) :: Time REAL(ReKi), INTENT( IN ) :: pos(*) ! Position at which free-surface elevation is to be calculated. Third entry ignored if present. REAL(ReKi), INTENT( OUT ) :: Zeta ! Total free-surface elevation with first- and second-order contribution (if present) @@ -4759,9 +4801,11 @@ SUBROUTINE GetTotalWaveElev( Time, pos, Zeta, ErrStat, ErrMsg ) END SUBROUTINE GetTotalWaveElev - SUBROUTINE GetFreeSurfaceNormal( Time, pos, n, ErrStat, ErrMsg) + SUBROUTINE GetFreeSurfaceNormal(p, m, Time, pos, n, ErrStat, ErrMsg) + TYPE(Morison_ParameterType), INTENT( IN ) :: p + TYPE(Morison_MiscVarType), INTENT( INOUT ) :: m REAL(DbKi), INTENT( In ) :: Time - REAL(ReKi), INTENT( In ) :: pos(*) ! Position at which free-surface normal is to be calculated. Third entry ignored if present. + REAL(ReKi), INTENT( In ) :: pos(:) ! Position at which free-surface normal is to be calculated. Third entry ignored if present. REAL(ReKi), INTENT( OUT ) :: n(3) ! Free-surface normal vector INTEGER(IntKi), INTENT( OUT ) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if errStat /= ErrID_None @@ -4850,8 +4894,8 @@ SUBROUTINE GetSectionFreeSurfaceIntersects_Cyl( pos0, FSPt, k_hat, y_hat, z_hat, END SUBROUTINE GetSectionFreeSurfaceIntersects_Cyl - SUBROUTINE GetSectionHstLds_Cyl( origin, pos0, k_hat, y_hat, z_hat, R, dRdl, theta1, theta2, dFdl) - + SUBROUTINE GetSectionHstLds_Cyl(p, origin, pos0, k_hat, y_hat, z_hat, R, dRdl, theta1, theta2, dFdl) + TYPE(Morison_ParameterType), INTENT( IN ) :: p REAL(DbKi), INTENT( IN ) :: origin(3) REAL(DbKi), INTENT( IN ) :: pos0(3) REAL(DbKi), INTENT( IN ) :: k_hat(3) @@ -4879,12 +4923,12 @@ SUBROUTINE GetSectionHstLds_Cyl( origin, pos0, k_hat, y_hat, z_hat, R, dRdl, the dFdl(1:3) = -R *dRdl*C0*k_hat + R*C1*y_hat + R*C2*z_hat dFdl(4:6) = -R**2*dRdl*C2*y_hat + R**2*dRdl*C1*z_hat + CROSS_PRODUCT((pos0-origin),dFdl(1:3)) - dFdl = dFdl * p%WaveField%WtrDens * g + dFdl = dFdl * p%WaveField%WtrDens * p%Gravity END SUBROUTINE GetSectionHstLds_Cyl - SUBROUTINE GetSectionHstLds_Rec( origin, pos0, k_hat, x_hat, y_hat, Sa, Sb, dSadl, dSbdl, rFS, nFS, dFdl, secStat) - + SUBROUTINE GetSectionHstLds_Rec(p, origin, pos0, k_hat, x_hat, y_hat, Sa, Sb, dSadl, dSbdl, rFS, nFS, dFdl, secStat) + TYPE(Morison_ParameterType), INTENT( IN ) :: p REAL(DbKi), INTENT( IN ) :: origin(3) REAL(DbKi), INTENT( IN ) :: pos0(3) REAL(DbKi), INTENT( IN ) :: k_hat(3) @@ -4987,12 +5031,12 @@ SUBROUTINE GetSectionHstLds_Rec( origin, pos0, k_hat, x_hat, y_hat, Sa, Sb, dSad end do - dFdl = dFdl * p%WaveField%WtrDens * g + dFdl = dFdl * p%WaveField%WtrDens * p%Gravity END SUBROUTINE GetSectionHstLds_Rec - SUBROUTINE getElementHstLds_Mod2_Cyl( pos1In, pos2In, FSPtIn, k_hatIn, y_hatIn, z_hatIn, n_hatIn, r1In, r2In, dlIn, F_B1, F_B2, ErrStat, ErrMsg ) - + SUBROUTINE getElementHstLds_Mod2_Cyl(p, pos1In, pos2In, FSPtIn, k_hatIn, y_hatIn, z_hatIn, n_hatIn, r1In, r2In, dlIn, F_B1, F_B2, ErrStat, ErrMsg ) + TYPE(Morison_ParameterType), INTENT( IN ) :: p REAL(ReKi), INTENT( IN ) :: pos1In(3) REAL(ReKi), INTENT( IN ) :: pos2In(3) REAL(ReKi), INTENT( IN ) :: FSPtIn(3) @@ -5015,7 +5059,6 @@ SUBROUTINE getElementHstLds_Mod2_Cyl( pos1In, pos2In, FSPtIn, k_hatIn, y_hatIn, INTEGER(IntKi) :: errStat2 CHARACTER(ErrMsgLen) :: errMsg2 ErrStat = ErrID_None - ErrMsg = "" pos1 = REAL(pos1In,DbKi) pos2 = REAL(pos2In,DbKi) @@ -5046,19 +5089,21 @@ SUBROUTINE getElementHstLds_Mod2_Cyl( pos1In, pos2In, FSPtIn, k_hatIn, y_hatIn, ! Section load at node 1 CALL GetSectionFreeSurfaceIntersects_Cyl( pos1, FSPt, REAL(k_hat,ReKi), REAL(y_hat,ReKi), REAL(z_hat,ReKi), REAL(n_hat,ReKi), r1, theta1, theta2, secStat1) - CALL GetSectionHstLds_Cyl( pos1, pos1, k_hat, y_hat, z_hat, r1, dRdl, theta1, theta2, dFdl1) + CALL GetSectionHstLds_Cyl(p, pos1, pos1, k_hat, y_hat, z_hat, r1, dRdl, theta1, theta2, dFdl1) ! Section load at midpoint CALL GetSectionFreeSurfaceIntersects_Cyl( posMid, FSPt, REAL(k_hat,ReKi), REAL(y_hat,ReKi), REAL(z_hat,ReKi), REAL(n_hat,ReKi), rMid, theta1, theta2, secStatMid) - CALL GetSectionHstLds_Cyl( pos1, posMid, k_hat, y_hat, z_hat, rMid, dRdl, theta1, theta2, dFdlMid) + CALL GetSectionHstLds_Cyl(p, pos1, posMid, k_hat, y_hat, z_hat, rMid, dRdl, theta1, theta2, dFdlMid) ! Section load at node 2 CALL GetSectionFreeSurfaceIntersects_Cyl( pos2, FSPt, REAL(k_hat,ReKi), REAL(y_hat,ReKi), REAL(z_hat,ReKi), REAL(n_hat,ReKi), r2, theta1, theta2, secStat2) - CALL GetSectionHstLds_Cyl( pos1, pos2, k_hat, y_hat, z_hat, r2, dRdl, theta1, theta2, dFdl2) + CALL GetSectionHstLds_Cyl(p, pos1, pos2, k_hat, y_hat, z_hat, r2, dRdl, theta1, theta2, dFdl2) ! Adaptively refine the load integration over the element - CALL RefineElementHstLds_Cyl(pos1,pos1,posMid,pos2,FSPt,r1,rMid,r2,dl,dRdl,secStat1,secStatMid,secStat2,k_hat,y_hat,z_hat,n_hat,dFdl1,dFdlMid,dFdl2,1,F_B,ErrStat2,ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL RefineElementHstLds_Cyl(p,pos1,pos1,posMid,pos2,FSPt,r1,rMid,r2,dl,dRdl,secStat1,secStatMid,secStat2,k_hat,y_hat,z_hat,n_hat,dFdl1,dFdlMid,dFdl2,1,F_B,ErrStat2) + if (ErrStat2 /= ErrID_None) then + CALL SetErrStat( ErrStat2, 'Tolerance for element hydrostatic load not met after the maximum allowed level of recursion is reached. Consider reducing MDivSize.', ErrStat, ErrMsg, RoutineName ) + end if ! Distribute the hydrostatic load to the two end nodes F_B1(1:3) = 0.5_DbKi * F_B(1:3) @@ -5069,8 +5114,8 @@ SUBROUTINE getElementHstLds_Mod2_Cyl( pos1In, pos2In, FSPtIn, k_hatIn, y_hatIn, END SUBROUTINE getElementHstLds_Mod2_Cyl - SUBROUTINE getElementHstLds_Mod2_Rec( pos1In, pos2In, FSPtIn, k_hatIn, x_hatIn, y_hatIn, n_hatIn, Sa1In, Sa2In, Sb1In, Sb2In, dlIn, F_B1, F_B2, ErrStat, ErrMsg ) - + SUBROUTINE getElementHstLds_Mod2_Rec(p, pos1In, pos2In, FSPtIn, k_hatIn, x_hatIn, y_hatIn, n_hatIn, Sa1In, Sa2In, Sb1In, Sb2In, dlIn, F_B1, F_B2, ErrStat, ErrMsg ) + TYPE(Morison_ParameterType), INTENT( IN ) :: p REAL(ReKi), INTENT( IN ) :: pos1In(3) REAL(ReKi), INTENT( IN ) :: pos2In(3) REAL(ReKi), INTENT( IN ) :: FSPtIn(3) @@ -5127,16 +5172,16 @@ SUBROUTINE getElementHstLds_Mod2_Rec( pos1In, pos2In, FSPtIn, k_hatIn, x_hatIn, END IF ! Section load at node 1 - CALL GetSectionHstLds_Rec( pos1, pos1, k_hat, x_hat, y_hat, Sa1, Sb1, dSadl, dSbdl, FSPt, n_hat, dFdl1, secStat1) + CALL GetSectionHstLds_Rec(p, pos1, pos1, k_hat, x_hat, y_hat, Sa1, Sb1, dSadl, dSbdl, FSPt, n_hat, dFdl1, secStat1) ! Section load at midpoint - CALL GetSectionHstLds_Rec( pos1, posMid, k_hat, x_hat, y_hat, SaMid, SbMid, dSadl, dSbdl, FSPt, n_hat, dFdlMid, secStatMid) + CALL GetSectionHstLds_Rec(p, pos1, posMid, k_hat, x_hat, y_hat, SaMid, SbMid, dSadl, dSbdl, FSPt, n_hat, dFdlMid, secStatMid) ! Section load at node 2 - CALL GetSectionHstLds_Rec( pos1, pos2, k_hat, x_hat, y_hat, Sa2, Sb2, dSadl, dSbdl, FSPt, n_hat, dFdl2, secStat2) + CALL GetSectionHstLds_Rec(p, pos1, pos2, k_hat, x_hat, y_hat, Sa2, Sb2, dSadl, dSbdl, FSPt, n_hat, dFdl2, secStat2) ! Adaptively refine the load integration over the element - CALL RefineElementHstLds_Rec(pos1,pos1,posMid,pos2,FSPt,Sa1,SaMid,Sa2,Sb1,SbMid,Sb2,dl,dSadl,dSbdl, & + CALL RefineElementHstLds_Rec(p,pos1,pos1,posMid,pos2,FSPt,Sa1,SaMid,Sa2,Sb1,SbMid,Sb2,dl,dSadl,dSbdl, & secStat1,secStatMid,secStat2,k_hat,x_hat,y_hat,n_hat,dFdl1,dFdlMid,dFdl2,1,F_B,ErrStat2,ErrMsg2) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -5149,8 +5194,8 @@ SUBROUTINE getElementHstLds_Mod2_Rec( pos1In, pos2In, FSPtIn, k_hatIn, x_hatIn, END SUBROUTINE getElementHstLds_Mod2_Rec - RECURSIVE SUBROUTINE RefineElementHstLds_Cyl( origin, pos1, posMid, pos2, FSPt, r1, rMid, r2, dl, dRdl,secStat1,secStatMid,secStat2, k_hat, y_hat, z_hat, n_hat, dFdl1, dFdlMid, dFdl2, recurLvl, F_B_5pt, ErrStat, ErrMsg) - + SUBROUTINE RefineElementHstLds_Cyl(p, origin, pos1, posMid, pos2, FSPt, r1, rMid, r2, dl, dRdl,secStat1,secStatMid,secStat2, k_hat, y_hat, z_hat, n_hat, dFdl1, dFdlMid, dFdl2, recurLvl, F_B_5pt, ErrStat) + TYPE(Morison_ParameterType), INTENT( IN ) :: p REAL(DbKi), INTENT( IN ) :: origin(3) REAL(DbKi), INTENT( IN ) :: pos1(3) REAL(DbKi), INTENT( IN ) :: posMid(3) @@ -5173,84 +5218,175 @@ RECURSIVE SUBROUTINE RefineElementHstLds_Cyl( origin, pos1, posMid, pos2, FSPt, REAL(DbKi), INTENT( IN ) :: dFdl2(6) INTEGER(IntKi), INTENT( IN ) :: recurLvl REAL(DbKi), INTENT( OUT ) :: F_B_5pt(6) + INTEGER(IntKi), INTENT( OUT ) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if errStat /= ErrID_None REAL(DbKi) :: theta1,theta2 REAL(DbKi) :: posMidL(3), posMidR(3) REAL(DbKi) :: rMidL, rMidR - REAL(DbKi) :: dFdlMidL(6), dFdlMidR(6), F_B_3pt(6) + REAL(DbKi) :: dFdlMidL(6), dFdlMidR(6) + REAL(DbKi) :: F_B_3pt_sub(6), F_B_5pt_sub(6) REAL(DbKi) :: error(6), tmp(6) - LOGICAL :: refine, tolMet + LOGICAL :: tolMet INTEGER(IntKi) :: i INTEGER(IntKi) :: secStatMidL, secStatMidR + REAL(ReKi) :: k_hat_Re(3) + REAL(ReKi) :: y_hat_Re(3) + REAL(ReKi) :: z_hat_Re(3) + REAL(ReKi) :: n_hat_Re(3) REAL(DbKi), PARAMETER :: RelTol = 1.0E-6 REAL(DbKi), PARAMETER :: AbsTol = 1.0E-8 INTEGER(IntKi), PARAMETER :: maxRecurLvl = 50 CHARACTER(*), PARAMETER :: RoutineName = "RefineElementHstLds_Cyl" - + + type Stack + integer(IntKi) :: level + logical :: processed = .false. + real(DbKi) :: pos1(3), posMid(3), pos2(3) + real(DbKi) :: r1, rMid, r2 + real(DbKi) :: dl + integer(IntKi) :: secStat1, secStatMid, secStat2 + real(DbKi) :: dFdl1(6), dFdlMid(6), dFdl2(6) + end type + + type (Stack) :: SA(2*maxRecurLvl) ! Stack array + type (Stack) :: SE ! Stack element + ErrStat = ErrID_None - ErrMsg = "" - posMidL = 0.5_DbKi*(pos1+posMid) - posMidR = 0.5_DbKi*(posMid+pos2) - rMidL = 0.5_DbKi*(r1+rMid) - rMidR = 0.5_DbKi*(rMid+r2) + ! Convert unit vectors to ReKi for compatibility with GetSectionFreeSurfaceIntersects_Cyl + k_hat_Re = real(k_hat, ReKi) + y_hat_Re = real(y_hat, ReKi) + z_hat_Re = real(z_hat, ReKi) + n_hat_Re = real(n_hat, ReKi) + + ! Initialize first stack element + SA(1)%level = 1 + SA(1)%processed = .false. + SA(1)%pos1 = pos1 + SA(1)%posMid = posMid + SA(1)%pos2 = pos2 + SA(1)%r1 = r1 + SA(1)%rMid = rMid + SA(1)%r2 = r2 + SA(1)%dFdl1 = dFdl1 + SA(1)%dFdlMid = dFdlMid + SA(1)%dFdl2 = dFdl2 + SA(1)%dl = dl + SA(1)%secStat1 = secStat1 + SA(1)%secStatMid = secStatMid + SA(1)%secStat2 = secStat2 + + ! Initalize stack index + i = 1 + + ! Initialize output force + F_B_5pt = 0.0_DbKi + + ! Loop until all stack elements have been processed + do while (.true.) + + ! Find the next unprocessed stack element or exit if all processed + do while (SA(i)%processed) + i = i - 1 + if (i == 0) return ! All stack elements processed + end do - ! Avoid sections coincident with the SWL - IF ( ABS(k_hat(3)) > 0.999999_ReKi ) THEN ! Vertical member - IF ( EqualRealNos( posMidL(3), 0.0_DbKi ) ) THEN - posMidL(3) = posMidL(3) - 1.0E-6 * dl - END IF - IF ( EqualRealNos( posMidR(3), 0.0_DbKi ) ) THEN - posMidR(3) = posMidR(3) - 1.0E-6 * dl + ! Copy current stack element to local variable for processing + SE = SA(i) + + ! Compute mid points of left and right sub-elements + posMidL = 0.5_DbKi*(SE%pos1 + SE%posMid) + posMidR = 0.5_DbKi*(SE%posMid + SE%pos2) + rMidL = 0.5_DbKi*(SE%r1 + SE%rMid) + rMidR = 0.5_DbKi*(SE%rMid + SE%r2) + + ! Avoid sections coincident with the SWL + IF ( ABS(k_hat(3)) > 0.999999_ReKi ) THEN ! Vertical member + IF ( EqualRealNos( posMidL(3), 0.0_DbKi ) ) THEN + posMidL(3) = posMidL(3) - 1.0E-6 * SE%dl + END IF + IF ( EqualRealNos( posMidR(3), 0.0_DbKi ) ) THEN + posMidR(3) = posMidR(3) - 1.0E-6 * SE%dl + END IF END IF - END IF - ! Total hydrostatic load on the element (Simpsons Rule) - F_B_3pt = (dFdl1 + 4.0_DbKi*dFdlMid + dFdl2) * dl/6.0_DbKi + ! Total hydrostatic load on the element (3 point Simpsons Rule) + F_B_3pt_sub = (SE%dFdl1 + 4.0_DbKi*SE%dFdlMid + SE%dFdl2) * SE%dl/6.0_DbKi - ! Mid point of left section - CALL GetSectionFreeSurfaceIntersects_Cyl( posMidL, FSPt, REAL(k_hat,ReKi), REAL(y_hat,ReKi), REAL(z_hat,ReKi), REAL(n_hat,ReKi), rMidL, theta1, theta2, secStatMidL) - CALL GetSectionHstLds_Cyl( origin, posMidL, k_hat, y_hat, z_hat, rMidL, dRdl, theta1, theta2, dFdlMidL) + ! Mid point of left section + CALL GetSectionFreeSurfaceIntersects_Cyl( posMidL, FSPt, k_hat_Re, y_hat_Re, z_hat_Re, n_hat_Re, rMidL, theta1, theta2, secStatMidL) + CALL GetSectionHstLds_Cyl(p, origin, posMidL, k_hat, y_hat, z_hat, rMidL, dRdl, theta1, theta2, dFdlMidL) - ! Mid point of right section - CALL GetSectionFreeSurfaceIntersects_Cyl( posMidR, FSPt, REAL(k_hat,ReKi), REAL(y_hat,ReKi), REAL(z_hat,ReKi), REAL(n_hat,ReKi), rMidR, theta1, theta2, secStatMidR) - CALL GetSectionHstLds_Cyl( origin, posMidR, k_hat, y_hat, z_hat, rMidR, dRdl, theta1, theta2, dFdlMidR) - - F_B_5pt = (dFdl1 + 4.0_DbKi*dFdlMidL + 2.0_DbKi*dFdlMid + 4.0_DbKi*dFdlMidR + dFdl2) * dl/12.0_DbKi + ! Mid point of right section + CALL GetSectionFreeSurfaceIntersects_Cyl( posMidR, FSPt, k_hat_Re, y_hat_Re, z_hat_Re, n_hat_Re, rMidR, theta1, theta2, secStatMidR) + CALL GetSectionHstLds_Cyl(p, origin, posMidR, k_hat, y_hat, z_hat, rMidR, dRdl, theta1, theta2, dFdlMidR) + + ! Total hydrostatic load on the element (5 point Simpsons Rule) + F_B_5pt_sub = (SE%dFdl1 + 4.0_DbKi*dFdlMidL + 2.0_DbKi*SE%dFdlMid + 4.0_DbKi*dFdlMidR + SE%dFdl2) * SE%dl/12.0_DbKi - error = ABS(F_B_3pt - F_B_5pt) - tolMet = .TRUE. - DO i = 1,6 - IF ( error(i) > MAX(RelTol*ABS(F_B_5pt(i)),AbsTol) ) THEN - tolMet = .FALSE. - END IF - END DO - refine = .NOT. tolMet - IF (ABS(secStat1-secStat2)>1) THEN ! (Sub)element bounds the waterplane - refine = .TRUE. ! Keep refining irrespective of tolMet to avoid premature termination - END IF - IF ( recurLvl > maxRecurLvl ) THEN - refine = .FALSE. - IF (.NOT. tolMet) THEN - CALL SetErrStat(ErrID_Warn, 'Tolerance for element hydrostatic load not met after the maximum allowed level of recursion is reached. Consider reducing MDivSize.', ErrStat, ErrMsg, RoutineName ) - ! ELSE - ! Free surface is likely normal to the element. - END IF - END IF - - IF (refine) THEN ! Recursively refine the load integration if tolerance not met - CALL RefineElementHstLds_Cyl(origin,pos1,posMidL,posMid,FSPt,r1,rMidL,rMid,0.5_DbKi*dl,dRdl,secStat1,secStatMidL,secStatMid,k_hat,y_hat,z_hat,n_hat,dFdl1,dFdlMidL,dFdlMid, recurLvl+1, tmp, ErrStat, ErrMsg) - CALL RefineElementHstLds_Cyl(origin,posMid,posMidR,pos2,FSPt,rMid,rMidR,r2,0.5_DbKi*dl,dRdl,secStatMid,secStatMidR,secStat2,k_hat,y_hat,z_hat,n_hat,dFdlMid,dFdlMidR,dFdl2, recurLvl+1, F_B_5pt, ErrStat, ErrMsg) - F_B_5pt = F_B_5pt + tmp - END IF + ! Calculate error and check against tolerance + error = ABS(F_B_3pt_sub - F_B_5pt_sub) + tolMet = all(error <= MAX(RelTol*ABS(F_B_5pt_sub),AbsTol)) + + ! If tolerance was met and (sub)element does not bound the waterplane, + ! Set processed flag, sum force, and continue + if (tolMet .and. (ABS(SE%secStat1 - SE%secStat2) <= 1)) then + SA(i)%processed = .true. + F_B_5pt = F_B_5pt + F_B_5pt_sub + cycle + end if + + ! If recursion limit reached or stack full, + ! Set processed flag, set error flag, and continue + if ((SE%level + 1 > maxRecurLvl) .or. (i + 1 > size(SA))) then + SA(i)%processed = .true. + ErrStat = ErrID_Warn + cycle + end if + ! Push new branches onto stack + SA(i)%level = SE%level + 1 + SA(i)%processed = .false. + SA(i)%pos1 = SE%pos1 + SA(i)%posMid = posMidL + SA(i)%pos2 = SE%posMid + SA(i)%r1 = SE%r1 + SA(i)%rMid = rMidL + SA(i)%r2 = SE%rMid + SA(i)%dl = 0.5_DbKi * SE%dl + SA(i)%secStat1 = SE%secStat1 + SA(i)%secStatMid = secStatMidL + SA(i)%secStat2 = SE%secStatMid + SA(i)%dFdl1 = SE%dFdl1 + SA(i)%dFdlMid = dFdlMidL + SA(i)%dFdl2 = SE%dFdlMid + + SA(i+1)%level = SE%level + 1 + SA(i+1)%processed = .false. + SA(i+1)%pos1 = SE%posMid + SA(i+1)%posMid = posMidR + SA(i+1)%pos2 = SE%pos2 + SA(i+1)%r1 = SE%rMid + SA(i+1)%rMid = rMidR + SA(i+1)%r2 = SE%r2 + SA(i+1)%dl = 0.5_DbKi * SE%dl + SA(i+1)%secStat1 = SE%secStatMid + SA(i+1)%secStatMid = secStatMidR + SA(i+1)%secStat2 = SE%secStat2 + SA(i+1)%dFdl1 = SE%dFdlMid + SA(i+1)%dFdlMid = dFdlMidR + SA(i+1)%dFdl2 = SE%dFdl2 + + ! Increment stack index + i = i + 1 + end do + END SUBROUTINE RefineElementHstLds_Cyl - RECURSIVE SUBROUTINE RefineElementHstLds_Rec( origin, pos1, posMid, pos2, FSPt, Sa1, SaMid, Sa2, Sb1, SbMid, Sb2, dl, dSadl, dSbdl, & + SUBROUTINE RefineElementHstLds_Rec(p, origin, pos1, posMid, pos2, FSPt, Sa1, SaMid, Sa2, Sb1, SbMid, Sb2, dl, dSadl, dSbdl, & secStat1, secStatMid, secStat2, k_hat, x_hat, y_hat, n_hat, dFdl1, dFdlMid, dFdl2, recurLvl, F_B_5pt, ErrStat, ErrMsg) - + TYPE(Morison_ParameterType), INTENT( IN ) :: p REAL(DbKi), INTENT( IN ) :: origin(3) REAL(DbKi), INTENT( IN ) :: pos1(3) REAL(DbKi), INTENT( IN ) :: posMid(3) @@ -5278,9 +5414,10 @@ RECURSIVE SUBROUTINE RefineElementHstLds_Rec( origin, pos1, posMid, pos2, FSPt, REAL(DbKi) :: posMidL(3), posMidR(3) REAL(DbKi) :: SaMidL, SbMidL, SaMidR, SbMidR - REAL(DbKi) :: dFdlMidL(6), dFdlMidR(6), F_B_3pt(6) + REAL(DbKi) :: dFdlMidL(6), dFdlMidR(6) + REAL(DbKi) :: F_B_3pt_sub(6), F_B_5pt_sub(6) REAL(DbKi) :: error(6), tmp(6) - LOGICAL :: refine, tolMet + LOGICAL :: tolMet INTEGER(IntKi) :: i INTEGER(IntKi) :: secStatMidL, secStatMidR REAL(DbKi), PARAMETER :: RelTol = 1.0E-6 @@ -5288,69 +5425,158 @@ RECURSIVE SUBROUTINE RefineElementHstLds_Rec( origin, pos1, posMid, pos2, FSPt, INTEGER(IntKi), PARAMETER :: maxRecurLvl = 50 CHARACTER(*), PARAMETER :: RoutineName = "RefineElementHstLds_Rec" - ErrStat = ErrID_None - ErrMsg = "" + type Stack + integer(IntKi) :: level + logical :: processed = .false. + real(DbKi) :: pos1(3), posMid(3), pos2(3) + real(DbKi) :: Sa1, SaMid, Sa2 + real(DbKi) :: Sb1, SbMid, Sb2 + real(DbKi) :: dl + integer(IntKi) :: secStat1, secStatMid, secStat2 + real(DbKi) :: dFdl1(6), dFdlMid(6), dFdl2(6) + end type + + type (Stack) :: SA(2*maxRecurLvl) ! Stack array + type (Stack) :: SE ! Stack element - posMidL = 0.5_DbKi*(pos1+posMid) - posMidR = 0.5_DbKi*(posMid+pos2) - SaMidL = 0.5_DbKi*(Sa1+SaMid) - SbMidL = 0.5_DbKi*(Sb1+SbMid) - SaMidR = 0.5_DbKi*(SaMid+Sa2) - SbMidR = 0.5_DbKi*(SbMid+Sb2) + ErrStat = ErrID_None + ErrMsg = "" + + ! Initialize first stack element + SA(1)%level = 1 + SA(1)%processed = .false. + SA(1)%pos1 = pos1 + SA(1)%posMid = posMid + SA(1)%pos2 = pos2 + SA(1)%Sa1 = Sa1 + SA(1)%SaMid = SaMid + SA(1)%Sa2 = Sa2 + SA(1)%Sb1 = Sb1 + SA(1)%SbMid = SbMid + SA(1)%Sb2 = Sb2 + SA(1)%dFdl1 = dFdl1 + SA(1)%dFdlMid = dFdlMid + SA(1)%dFdl2 = dFdl2 + SA(1)%dl = dl + SA(1)%secStat1 = secStat1 + SA(1)%secStatMid = secStatMid + SA(1)%secStat2 = secStat2 + + ! Initalize stack index + i = 1 + + ! Initialize output force + F_B_5pt = 0.0_DbKi + + ! Loop until all stack elements have been processed + do while (.true.) + + ! Find the next unprocessed stack element or exit if all processed + do while (SA(i)%processed) + i = i - 1 + if (i == 0) return ! All stack elements processed + end do - ! Avoid sections coincident with the SWL - IF ( ABS(k_hat(3)) > 0.999999_ReKi ) THEN ! Vertical member - IF ( EqualRealNos( posMidL(3), 0.0_DbKi ) ) THEN - posMidL(3) = posMidL(3) - 1.0E-6 * dl - END IF - IF ( EqualRealNos( posMidR(3), 0.0_DbKi ) ) THEN - posMidR(3) = posMidR(3) - 1.0E-6 * dl + ! Copy current stack element to local variable for processing + SE = SA(i) + + ! Compute mid points of left and right sub-elements + posMidL = 0.5_DbKi*(SE%pos1+SE%posMid) + posMidR = 0.5_DbKi*(SE%posMid+SE%pos2) + SaMidL = 0.5_DbKi*(SE%Sa1+SE%SaMid) + SbMidL = 0.5_DbKi*(SE%Sb1+SE%SbMid) + SaMidR = 0.5_DbKi*(SE%SaMid+SE%Sa2) + SbMidR = 0.5_DbKi*(SE%SbMid+SE%Sb2) + + ! Avoid sections coincident with the SWL + IF ( ABS(k_hat(3)) > 0.999999_ReKi ) THEN ! Vertical member + IF ( EqualRealNos( posMidL(3), 0.0_DbKi ) ) THEN + posMidL(3) = posMidL(3) - 1.0E-6 * SE%dl + END IF + IF ( EqualRealNos( posMidR(3), 0.0_DbKi ) ) THEN + posMidR(3) = posMidR(3) - 1.0E-6 * SE%dl + END IF END IF - END IF - ! Total hydrostatic load on the element (Simpsons Rule) - F_B_3pt = (dFdl1 + 4.0_DbKi*dFdlMid + dFdl2) * dl/6.0_DbKi + ! Total hydrostatic load on the element (Simpsons Rule) + F_B_3pt_sub = (SE%dFdl1 + 4.0_DbKi*SE%dFdlMid + SE%dFdl2) * SE%dl/6.0_DbKi - ! Mid point of left section - CALL GetSectionHstLds_Rec( origin, posMidL, k_hat, x_hat, y_hat, SaMidL, SbMidL, dSadl, dSbdl, FSPt, n_hat, dFdlMidL, secStatMidL) + ! Mid point of left section + CALL GetSectionHstLds_Rec(p, origin, posMidL, k_hat, x_hat, y_hat, SaMidL, SbMidL, dSadl, dSbdl, FSPt, n_hat, dFdlMidL, secStatMidL) - ! Mid point of right section - CALL GetSectionHstLds_Rec( origin, posMidR, k_hat, x_hat, y_hat, SaMidR, SbMidR, dSadl, dSbdl, FSPt, n_hat, dFdlMidR, secStatMidR) - - F_B_5pt = (dFdl1 + 4.0_DbKi*dFdlMidL + 2.0_DbKi*dFdlMid + 4.0_DbKi*dFdlMidR + dFdl2) * dl/12.0_DbKi + ! Mid point of right section + CALL GetSectionHstLds_Rec(p, origin, posMidR, k_hat, x_hat, y_hat, SaMidR, SbMidR, dSadl, dSbdl, FSPt, n_hat, dFdlMidR, secStatMidR) - error = ABS(F_B_3pt - F_B_5pt) - tolMet = .TRUE. - DO i = 1,6 - IF ( error(i) > MAX(RelTol*ABS(F_B_5pt(i)),AbsTol) ) THEN - tolMet = .FALSE. - END IF - END DO - refine = .NOT. tolMet - IF (ABS(secStat1-secStat2)>1) THEN ! (Sub)element bounds the waterplane - refine = .TRUE. ! Keep refining irrespective of tolMet to avoid premature termination - END IF - IF ( recurLvl > maxRecurLvl ) THEN - refine = .FALSE. - IF (.NOT. tolMet) THEN - CALL SetErrStat(ErrID_Warn, 'Tolerance for element hydrostatic load not met after the maximum allowed level of recursion is reached. Consider reducing MDivSize.', ErrStat, ErrMsg, RoutineName ) - ! ELSE - ! Free surface is likely normal to the element. - END IF - END IF - - IF (refine) THEN ! Recursively refine the load integration if tolerance not met - CALL RefineElementHstLds_Rec(origin,pos1,posMidL,posMid,FSPt,Sa1,SaMidL,SaMid,Sb1,SbMidL,SbMid,0.5_DbKi*dl,dSadl,dSbdl, & - secStat1,secStatMidL,secStatMid,k_hat,x_hat,y_hat,n_hat,dFdl1,dFdlMidL,dFdlMid,recurLvl+1,tmp,ErrStat,ErrMsg) - CALL RefineElementHstLds_Rec(origin,posMid,posMidR,pos2,FSPt,SaMid,SaMidR,Sa2,SbMid,SbMidR,Sb2,0.5_DbKi*dl,dSadl,dSbdl, & - secStatMid,secStatMidR,secStat2,k_hat,x_hat,y_hat,n_hat,dFdlMid,dFdlMidR,dFdl2,recurLvl+1,F_B_5pt,ErrStat,ErrMsg) - F_B_5pt = F_B_5pt + tmp - END IF + ! Total hydrostatic load on the element (5 point Simpsons Rule) + F_B_5pt_sub = (SE%dFdl1 + 4.0_DbKi*dFdlMidL + 2.0_DbKi*SE%dFdlMid + 4.0_DbKi*dFdlMidR + SE%dFdl2) * SE%dl/12.0_DbKi - END SUBROUTINE RefineElementHstLds_Rec + ! Calculate error and check against tolerance + error = ABS(F_B_3pt_sub - F_B_5pt_sub) + tolMet = all(error <= MAX(RelTol*ABS(F_B_5pt_sub),AbsTol)) + + ! If tolerance was met and (sub)element does not bound the waterplane, + ! Set processed flag, sum force, and continue + if (tolMet .and. (ABS(SE%secStat1 - SE%secStat2) <= 1)) then + SA(i)%processed = .true. + F_B_5pt = F_B_5pt + F_B_5pt_sub + cycle + end if + + ! If recursion limit reached or stack full, + ! Set processed flag, set error flag, and continue + if ((SE%level + 1 > maxRecurLvl) .or. (i + 1 > size(SA))) then + SA(i)%processed = .true. + ErrStat = ErrID_Warn + cycle + end if - SUBROUTINE GetEndPlateHstLds_Cyl(pos0, k_hat, y_hat, z_hat, R, theta1, theta2, F) + ! Push new branches onto stack + SA(i)%level = SE%level + 1 + SA(i)%processed = .false. + SA(i)%pos1 = SE%pos1 + SA(i)%posMid = posMidL + SA(i)%pos2 = SE%posMid + SA(i)%Sa1 = SE%Sa1 + SA(i)%SaMid = SaMidL + SA(i)%Sa2 = SE%SaMid + SA(i)%Sb1 = SE%Sb1 + SA(i)%SbMid = SbMidL + SA(i)%Sb2 = SE%SbMid + SA(i)%dl = 0.5_DbKi * SE%dl + SA(i)%secStat1 = SE%secStat1 + SA(i)%secStatMid = secStatMidL + SA(i)%secStat2 = SE%secStatMid + SA(i)%dFdl1 = SE%dFdl1 + SA(i)%dFdlMid = dFdlMidL + SA(i)%dFdl2 = SE%dFdlMid + + SA(i+1)%level = SE%level + 1 + SA(i+1)%processed = .false. + SA(i+1)%pos1 = SE%posMid + SA(i+1)%posMid = posMidR + SA(i+1)%pos2 = SE%pos2 + SA(i+1)%Sa1 = SE%SaMid + SA(i+1)%SaMid = SaMidR + SA(i+1)%Sa2 = SE%Sa2 + SA(i+1)%Sb1 = SE%SbMid + SA(i+1)%SbMid = SbMidR + SA(i+1)%Sb2 = SE%Sb2 + SA(i+1)%dl = 0.5_DbKi * SE%dl + SA(i+1)%secStat1 = SE%secStatMid + SA(i+1)%secStatMid = secStatMidR + SA(i+1)%secStat2 = SE%secStat2 + SA(i+1)%dFdl1 = SE%dFdlMid + SA(i+1)%dFdlMid = dFdlMidR + SA(i+1)%dFdl2 = SE%dFdl2 + + ! Increment stack index + i = i + 1 + end do + + END SUBROUTINE RefineElementHstLds_Rec + SUBROUTINE GetEndPlateHstLds_Cyl(p, pos0, k_hat, y_hat, z_hat, R, theta1, theta2, F) + TYPE(Morison_ParameterType), INTENT( IN ) :: p REAL(ReKi), INTENT( IN ) :: pos0(3) REAL(ReKi), INTENT( IN ) :: k_hat(3) REAL(ReKi), INTENT( IN ) :: y_hat(3) @@ -5394,7 +5620,7 @@ SUBROUTINE GetEndPlateHstLds_Cyl(pos0, k_hat, y_hat, z_hat, R, theta1, theta2, F ! End plate force in the k_hat direction Fk = -0.5_DbKi*Z0*(R_2*dTheta-tmp1) + cosPhi/6.0_DbKi*( 2.0_DbKi*dy_3 - z1*z2*dy - z1_2*(y2+2.0_DbKi*y1) + z2_2*(y1+2.0_DbKi*y2) ) - F(1:3) = p%WaveField%WtrDens * g * Fk * k_hat + F(1:3) = p%WaveField%WtrDens * p%Gravity * Fk * k_hat ! End plate moment in the y_hat and z_hat direction My = Z0/6.0_DbKi*( 2.0_DbKi*dy_3 + 2.0_DbKi*dy*tmp2 + 3.0_DbKi*tmp1*sz ) & ! y_hat component @@ -5416,12 +5642,13 @@ SUBROUTINE GetEndPlateHstLds_Cyl(pos0, k_hat, y_hat, z_hat, R, theta1, theta2, F Mz = -Z0/ 6.0_DbKi*( dz*( y2*y2 + y2*y1 + y1*y1 + tmp2 - 3.0_DbKi*R_2 ) ) & -cosPhi/24.0_DbKi*( dz_2*(3.0_DbKi*z2_2+3.0_DbKi*z1_2+2.0_DbKi*y1*y2-6.0_DbKi*R_2) + dz*dz*(y1*y1-y2*y2) + 4.0_DbKi*dz*(y1*y1*z1+y2*y2*z2) ) - F(4:6) = p%WaveField%WtrDens * g * (My*y_hat + Mz*z_hat) + F(4:6) = p%WaveField%WtrDens * p%Gravity * (My*y_hat + Mz*z_hat) END SUBROUTINE GetEndPlateHstLds_Cyl - SUBROUTINE GetEndPlateHstLds_Rec(pos0, k_hat, x_hat, y_hat, Sa, Sb, rFS, nFS, F) + SUBROUTINE GetEndPlateHstLds_Rec(p, pos0, k_hat, x_hat, y_hat, Sa, Sb, rFS, nFS, F) + TYPE(Morison_ParameterType), INTENT( IN ) :: p REAL(ReKi), INTENT( IN ) :: pos0(3) REAL(ReKi), INTENT( IN ) :: k_hat(3) REAL(ReKi), INTENT( IN ) :: x_hat(3) @@ -5488,7 +5715,7 @@ SUBROUTINE GetEndPlateHstLds_Rec(pos0, k_hat, x_hat, y_hat, Sa, Sb, rFS, nFS, F) s1 = -0.5*Sa s2 = Sa * (0.5 - dot_product(rFS-rv(:,3),nFS)/dot_product(rv(:,4)-rv(:,3),nFS) ) end if - call GetHstLdsOnTrapezoid(REAL(pos0,DbKi),s1,s2,h1s1,h1s2,h2s1,h2s2,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp1) + call GetHstLdsOnTrapezoid(p, REAL(pos0,DbKi),s1,s2,h1s1,h1s2,h2s1,h2s2,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp1) F = Ftmp1 else if (numVInWtr == 2) then ! Two neighboring vertices in water if (vInWtr(1) .and. vInWtr(2)) then @@ -5511,7 +5738,7 @@ SUBROUTINE GetEndPlateHstLds_Rec(pos0, k_hat, x_hat, y_hat, Sa, Sb, rFS, nFS, F) h1s2 = -0.5*Sb s1 = Sa * (-0.5 + dot_product(rFS-rv(:,1),nFS)/dot_product(rv(:,2)-rv(:,1),nFS) ) s2 = Sa * (0.5 - dot_product(rFS-rv(:,3),nFS)/dot_product(rv(:,4)-rv(:,3),nFS) ) - call GetHstLdsOnTrapezoid(REAL(pos0,DbKi),s2,0.5_DbKi*Sa,-0.5_DbKi*Sb,-0.5_DbKi*Sb,0.5_DbKi*Sb,0.5_DbKi*Sb,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp2) + call GetHstLdsOnTrapezoid(p, REAL(pos0,DbKi),s2,0.5_DbKi*Sa,-0.5_DbKi*Sb,-0.5_DbKi*Sb,0.5_DbKi*Sb,0.5_DbKi*Sb,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp2) else if (vInWtr(3) .and. vInWtr(4)) then ! Sides 2 & 4 intersects the free surface ! Side 3 submerged and side 1 dry @@ -5532,9 +5759,9 @@ SUBROUTINE GetEndPlateHstLds_Rec(pos0, k_hat, x_hat, y_hat, Sa, Sb, rFS, nFS, F) h1s2 = -0.5*Sb s1 = Sa * ( 0.5 - dot_product(rFS-rv(:,3),nFS)/dot_product(rv(:,4)-rv(:,3),nFS) ) s2 = Sa * (-0.5 + dot_product(rFS-rv(:,1),nFS)/dot_product(rv(:,2)-rv(:,1),nFS) ) - call GetHstLdsOnTrapezoid(REAL(pos0,DbKi),-0.5_DbKi*Sa,s1,-0.5_DbKi*Sb,-0.5_DbKi*Sb,0.5_DbKi*Sb,0.5_DbKi*Sb,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp2) + call GetHstLdsOnTrapezoid(p,REAL(pos0,DbKi),-0.5_DbKi*Sa,s1,-0.5_DbKi*Sb,-0.5_DbKi*Sb,0.5_DbKi*Sb,0.5_DbKi*Sb,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp2) end if - call GetHstLdsOnTrapezoid(REAL(pos0,DbKi),s1,s2,h1s1,h1s2,h2s1,h2s2,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp1) + call GetHstLdsOnTrapezoid(p,REAL(pos0,DbKi),s1,s2,h1s1,h1s2,h2s1,h2s2,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp1) F = Ftmp1 + Ftmp2 else if (numVInWtr == 3) then ! Only one vertex out of water if (.not. vInWtr(1)) then @@ -5570,17 +5797,18 @@ SUBROUTINE GetEndPlateHstLds_Rec(pos0, k_hat, x_hat, y_hat, Sa, Sb, rFS, nFS, F) s1 = -0.5*Sa s2 = Sa * ( 0.5 - dot_product(rFS-rv(:,3),nFS)/dot_product(rv(:,4)-rv(:,3),nFS) ) end if - call GetHstLdsOnTrapezoid(REAL(pos0,DbKi),s1,s2,h1s1,h1s2,h2s1,h2s2,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp1) - F(1:3) = -p%WaveField%WtrDens*g*z0*Sa*Sb*k_hat - Ftmp1(1:3) - F(4:6) = p%WaveField%WtrDens*g*(Sa**3*Sb*x_hat(3)*y_hat-Sa*Sb**3*y_hat(3)*x_hat)/12.0 - Ftmp1(4:6) + call GetHstLdsOnTrapezoid(p,REAL(pos0,DbKi),s1,s2,h1s1,h1s2,h2s1,h2s2,REAL(k_hat,DbKi),REAL(x_hat,DbKi),REAL(y_hat,DbKi),Ftmp1) + F(1:3) = -p%WaveField%WtrDens*p%Gravity*z0*Sa*Sb*k_hat - Ftmp1(1:3) + F(4:6) = p%WaveField%WtrDens*p%Gravity*(Sa**3*Sb*x_hat(3)*y_hat-Sa*Sb**3*y_hat(3)*x_hat)/12.0 - Ftmp1(4:6) else if (numVInWtr == 4) then ! Submerged endplate - F(1:3) = -p%WaveField%WtrDens*g*z0*Sa*Sb*k_hat - F(4:6) = p%WaveField%WtrDens*g*(Sa**3*Sb*x_hat(3)*y_hat-Sa*Sb**3*y_hat(3)*x_hat)/12.0 + F(1:3) = -p%WaveField%WtrDens*p%Gravity*z0*Sa*Sb*k_hat + F(4:6) = p%WaveField%WtrDens*p%Gravity*(Sa**3*Sb*x_hat(3)*y_hat-Sa*Sb**3*y_hat(3)*x_hat)/12.0 end if END SUBROUTINE GetEndPlateHstLds_Rec - SUBROUTINE GetHstLdsOnTrapezoid(pos0, s1, s2, h1s1, h1s2, h2s1, h2s2, k_hat, x_hat, y_hat, F) + SUBROUTINE GetHstLdsOnTrapezoid(p, pos0, s1, s2, h1s1, h1s2, h2s1, h2s2, k_hat, x_hat, y_hat, F) + TYPE(Morison_ParameterType), INTENT( IN ) :: p REAL(DbKi), INTENT( IN ) :: pos0(3) REAL(DbKi), INTENT( IN ) :: s1, s2, h1s1, h1s2, h2s1, h2s2 REAL(DbKi), INTENT( IN ) :: k_hat(3), x_hat(3), y_hat(3) @@ -5630,12 +5858,15 @@ SUBROUTINE GetHstLdsOnTrapezoid(pos0, s1, s2, h1s1, h1s2, h2s1, h2s2, k_hat, x_h +x_hat(3)/12.0*(3.0*dp*ds4+4.0*dq*ds3) & +y_hat(3)/24.0*tmp )*y_hat - F = p%WaveField%WtrDens * g * F + F = p%WaveField%WtrDens * p%Gravity * F END SUBROUTINE GetHstLdsOnTrapezoid - SUBROUTINE getElementHstLds_Mod1( Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1, r2, dl, alphaIn, Is1stElement, F_B0, F_B1, F_B2, ErrStat, ErrMsg ) + SUBROUTINE getElementHstLds_Mod1(p, m, mem, Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1, r2, dl, alphaIn, Is1stElement, F_B0, F_B1, F_B2, ErrStat, ErrMsg ) + TYPE(Morison_ParameterType), INTENT( IN ) :: p + TYPE(Morison_MiscVarType), INTENT( INOUT ) :: m + TYPE(Morison_MemberType), intent(in) :: mem REAL(DbKi), INTENT( IN ) :: Time REAL(ReKi), INTENT( IN ) :: pos1(3) REAL(ReKi), INTENT( IN ) :: pos2(3) @@ -5657,6 +5888,7 @@ SUBROUTINE getElementHstLds_Mod1( Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1, r2, REAL(ReKi) :: h0, rh, a0, b0, a0b0, s0, C_1, C_2, Z0 REAL(ReKi) :: sinGamma, cosGamma, tanGamma REAL(ReKi) :: FbVec(3), MbVec(3), FSInt(3), n_hat(3), t_hat(3), s_hat(3), r_hat(3) + REAL(ReKi) :: z1, z2 INTEGER(IntKi) :: errStat2 CHARACTER(ErrMsgLen) :: errMsg2 INTEGER(IntKi), PARAMETER :: pwr = 3 ! Exponent for buoyancy node distribution smoothing @@ -5668,6 +5900,9 @@ SUBROUTINE getElementHstLds_Mod1( Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1, r2, dRdl = (r2 - r1)/dl + z1 = pos1(3) + z2 = pos2(3) + IF ( (z1 < Zeta1) .AND. (z2 < Zeta2) ) THEN ! If element is fully submerged ! Compute the waterplane shape, the submerged volume, and it's geometric center ! No need to consider tapered and non-tapered elements separately @@ -5676,11 +5911,11 @@ SUBROUTINE getElementHstLds_Mod1( Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1, r2, ! Hydrostatic force on element FbVec = (/0.0_ReKi,0.0_ReKi,Vs/) - Pi*( r2*r2*z2 - r1*r1*z1) *k_hat - FbVec = p%WaveField%WtrDens * g * FbVec + FbVec = p%WaveField%WtrDens * p%Gravity * FbVec ! Hydrostatic moment on element about the lower node MbVec = (Vhc+0.25*Pi*(r2**4-r1**4)) * Cross_Product(k_hat,(/0.0_ReKi,0.0_ReKi,1.0_ReKi/)) - MbVec = p%WaveField%WtrDens * g * MbVec + MbVec = p%WaveField%WtrDens * p%Gravity * MbVec ! Distribute element load to nodes alpha = alphaIn*(z2-Zeta2)**pwr/(alphaIn*(z2-Zeta2)**pwr+(1.0_ReKi-alphaIn)*(z1-Zeta1)**pwr) @@ -5704,8 +5939,8 @@ SUBROUTINE getElementHstLds_Mod1( Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1, r2, ! Scaled radius of element at point where its centerline crosses the waterplane rh = r1 + h0*dRdl ! Estimate the free-surface normal at the free-surface intersection, n_hat - IF ( p%WaveField%WaveStMod > 0_IntKi ) THEN ! If wave stretching is enabled, compute free surface normal - CALL GetFreeSurfaceNormal( Time, FSInt, n_hat, ErrStat2, ErrMsg2 ) + IF (p%HstMod > 0_IntKi) THEN ! If wave stretching is enabled, compute free surface normal + CALL GetFreeSurfaceNormal(p, m, Time, FSInt, n_hat, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ELSE ! Without wave stretching, use the normal of the SWL n_hat = (/0.0_ReKi,0.0_ReKi,1.0_ReKi/) @@ -5766,13 +6001,13 @@ SUBROUTINE getElementHstLds_Mod1( Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1, r2, ! Hydrostatic force on element FbVec = (/0.0_ReKi,0.0_ReKi,Vs/) - Pi*a0b0*Z0*n_hat + Pi*r1**2*z1*k_hat - FbVec = p%WaveField%WtrDens * g * FbVec + FbVec = p%WaveField%WtrDens * p%Gravity * FbVec ! Hydrostatic moment on element about the lower node MbVec = Cross_Product( Vrc*r_hat+Vhc*k_hat, (/0.0_ReKi,0.0_ReKi,1.0_ReKi/) ) & + 0.25*Pi*a0b0* ( ( s_hat(3)*a0*a0 + 4.0*(s0-h0*sinGamma)*Z0 )*t_hat - t_hat(3)*b0*b0*s_hat ) & - 0.25*Pi*r1**4*( r_hat(3) *t_hat - t_hat(3) * r_hat ) - MbVec = p%WaveField%WtrDens * g * MbVec + MbVec = p%WaveField%WtrDens * p%Gravity * MbVec IF ( Is1stElement ) THEN ! This is the 1st element of the member ! Assign the element load to the lower (1st) node of the member @@ -5792,7 +6027,8 @@ SUBROUTINE getElementHstLds_Mod1( Time, pos1, pos2, Zeta1, Zeta2, k_hat, r1, r2, END IF END SUBROUTINE getElementHstLds_Mod1 - SUBROUTINE YawJoint(JointNo,PtfmRefY,AM_End,An_End,DP_Const_End,I_MG_End,ErrStat,ErrMsg) + SUBROUTINE YawJoint(p, JointNo, PtfmRefY, AM_End, An_End, DP_Const_End, I_MG_End, ErrStat, ErrMsg) + TYPE(Morison_ParameterType), INTENT( IN ) :: p Integer(IntKi), intent(in ) :: JointNo Real(ReKi), intent(in ) :: PtfmRefY Real(ReKi), intent( out) :: AM_End(3,3) @@ -5821,8 +6057,11 @@ SUBROUTINE YawJoint(JointNo,PtfmRefY,AM_End,An_End,DP_Const_End,I_MG_End,ErrStat END SUBROUTINE YawJoint - SUBROUTINE getMemBallastHiPt(member,z_hi, ErrStat, ErrMsg) + SUBROUTINE getMemBallastHiPt(p, m, u, member, z_hi, ErrStat, ErrMsg) ! This subroutine returns the highest point of a member's internal ballast + Type(Morison_ParameterType), intent(in ) :: p + Type(Morison_MiscVarType), intent(in ) :: m + Type(Morison_InputType), intent(in ) :: u Type(Morison_MemberType), intent(in ) :: member Real(ReKi), intent( out) :: z_hi Integer(IntKi), intent( out) :: ErrStat @@ -5928,8 +6167,12 @@ SUBROUTINE getMemBallastHiPt(member,z_hi, ErrStat, ErrMsg) END SUBROUTINE getMemBallastHiPt - SUBROUTINE GetDistDrag_Rec(Time,mem,i,dSadl_p,dSbdl_p,f_hydro,ErrStat,ErrMsg,SubRatio,vrelFSInt) + SUBROUTINE GetDistDrag_Rec(p, m, u, xd, Time, mem, i, dSadl_p, dSbdl_p, f_hydro, ErrStat, ErrMsg, SubRatio, vrelFSInt) ! Compute the distributed (axial and transverse) drag per unit length for rectangular sections + TYPE(Morison_ParameterType), intent(in ) :: p !< Morison parameters + Type(Morison_MiscVarType),intent(inout) :: m !< Miscellaneous variables + Type(Morison_InputType) , intent(in ) :: u !< Morison inputs + Type(Morison_DiscreteStateType), intent(in ) :: xd !< Current discrete state Real(DbKi) , intent(in ) :: Time !< Current simulation time in seconds Type(Morison_MemberType), intent(in ) :: mem !< Current member Integer(IntKi) , intent(in ) :: i !< Node number within the member (not the global node index) @@ -6073,7 +6316,7 @@ SUBROUTINE GetDistDrag_Rec(Time,mem,i,dSadl_p,dSbdl_p,f_hydro,ErrStat,ErrMsg,Sub SVFC = STV + cross_product( SRV, rToFC(1:3,fNo) ) ! Compute fluid velocity at face center - Call WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., tmpNodeInWater, FVFC, FAFC, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Call WaveField_GetNodeWaveVel( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., .TRUE., tmpNodeInWater, FVFC, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! Note: We force each face center to also be wetted if the center node is wetted. Otherwise, the load-smoothing procedure might not work ! Compute the face-normal component of the relative fluid velocity (fluid-structure) at face center @@ -6098,16 +6341,6 @@ SUBROUTINE GetDistDrag_Rec(Time,mem,i,dSadl_p,dSbdl_p,f_hydro,ErrStat,ErrMsg,Sub END SUBROUTINE GetDistDrag_Rec - - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - !if (Failed) then - ! call FailCleanup() - !endif - end function Failed - -END SUBROUTINE Morison_CalcOutput !---------------------------------------------------------------------------------------------------------------------------------- subroutine LumpDistrHydroLoads( f_hydro, k_hat, dl, h_c, lumpedLoad ) real(ReKi), intent(in ) :: f_hydro(3) @@ -6120,7 +6353,7 @@ subroutine LumpDistrHydroLoads( f_hydro, k_hat, dl, h_c, lumpedLoad ) end subroutine LumpDistrHydroLoads !---------------------------------------------------------------------------------------------------------------------------------- ! Takes loads on node i in element tilted frame and converts to 6DOF loads at node i and adjacent node -SUBROUTINE DistributeElementLoads(Fl, Fr, M, sinPhi, cosPhi, SinBeta, cosBeta, alpha, F1, F2) +PURE SUBROUTINE DistributeElementLoads(Fl, Fr, M, sinPhi, cosPhi, SinBeta, cosBeta, alpha, F1, F2) REAL(ReKi), INTENT ( IN ) :: Fl ! (N) axial load about node i REAL(ReKi), INTENT ( IN ) :: Fr ! (N) radial load about node i in direction of tilt @@ -6133,25 +6366,22 @@ SUBROUTINE DistributeElementLoads(Fl, Fr, M, sinPhi, cosPhi, SinBeta, cosBeta, a REAL(ReKi), INTENT ( OUT ) :: F1(6) ! (N, Nm) force/moment vector for node i REAL(ReKi), INTENT ( OUT ) :: F2(6) ! (N, Nm) force/moment vector for the other node (whether i+1, or i-1) + REAL(ReKi) :: F(6) - F1(1) = cosBeta*(Fl*sinPhi + Fr*cosPhi)*alpha - F1(2) = sinBeta*(Fl*sinPhi + Fr*cosPhi)*alpha - F1(3) = (Fl*cosPhi - Fr*sinPhi)*alpha - F1(4) = -sinBeta * M *alpha - F1(5) = cosBeta * M *alpha - F1(6) = 0.0 - - F2(1) = cosBeta*(Fl*sinPhi + Fr*cosPhi)*(1-alpha) - F2(2) = sinBeta*(Fl*sinPhi + Fr*cosPhi)*(1-alpha) - F2(3) = (Fl*cosPhi - Fr*sinPhi)*(1-alpha) - F2(4) = -sinBeta * M *(1-alpha) - F2(5) = cosBeta * M *(1-alpha) - F2(6) = 0.0 + F(1) = cosBeta*(Fl*sinPhi + Fr*cosPhi) + F(2) = sinBeta*(Fl*sinPhi + Fr*cosPhi) + F(3) = (Fl*cosPhi - Fr*sinPhi) + F(4) = -sinBeta * M + F(5) = cosBeta * M + F(6) = 0.0 + + F1 = F*alpha + F2 = F*(1.0_ReKi-alpha) END SUBROUTINE DistributeElementLoads !---------------------------------------------------------------------------------------------------------------------------------- ! Takes loads on end node i and converts to 6DOF loads, adding to the nodes existing loads -SUBROUTINE AddEndLoad(Fl, M, sinPhi, cosPhi, SinBeta, cosBeta, Fi) +PURE SUBROUTINE AddEndLoad(Fl, M, sinPhi, cosPhi, SinBeta, cosBeta, Fi) REAL(ReKi), INTENT ( IN ) :: Fl ! (N) axial load about node i REAL(ReKi), INTENT ( IN ) :: M ! (N-m) radial moment about node i, positive in direction of tilt angle @@ -6211,7 +6441,7 @@ SUBROUTINE Morison_UpdateDiscState( Time, u, p, x, xd, z, OtherState, m, errStat pos = m%DispNodePosHdn(:,J) ! Get fluid velocity at the joint - CALL WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, pos, .FALSE., nodeInWater, FVTmp, FATmp, ErrStat2, ErrMsg2 ) + CALL WaveField_GetNodeWaveVel( p%WaveField, m%WaveField_m, Time, pos, .FALSE., .TRUE., nodeInWater, FVTmp, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) FV = REAL(FVTmp, ReKi) vrel = ( FV - u%Mesh%TranslationVel(:,J) ) * nodeInWater @@ -6241,7 +6471,7 @@ SUBROUTINE Morison_UpdateDiscState( Time, u, p, x, xd, z, OtherState, m, errStat DO I = mem%i_floor+1, N+1 pos = m%DispNodePosHdn(:, mem%NodeIndx(I)) - CALL WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, pos, .FALSE., nodeInWater, FVTmp, FATmp, ErrStat2, ErrMsg2 ) + CALL WaveField_GetNodeWaveVel( p%WaveField, m%WaveField_m, Time, pos, .FALSE., .TRUE., nodeInWater, FVTmp, ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) IF (nodeInWater .EQ. 1_IntKi) THEN @@ -6250,7 +6480,7 @@ SUBROUTINE Morison_UpdateDiscState( Time, u, p, x, xd, z, OtherState, m, errStat ! Side B - +x_hat side posFC = pos + mem%x_hat * 0.5 * mem%SaMG(i) SVFC = u%Mesh%TranslationVel(:,mem%NodeIndx(i)) + cross_product( u%Mesh%RotationVel(:,mem%NodeIndx(i)), mem%x_hat * 0.5 * mem%SaMG(i) ) - call WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., tmpInt, FVTmp, FATmp, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call WaveField_GetNodeWaveVel( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., .TRUE., tmpInt, FVTmp, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) vrelFC = dot_product( REAL(FVTmp,ReKi) - SVFC, mem%x_hat ) vrelFCf = mem%VRelNFiltConstB * ( vrelFC + xd%MV_rel_n_FiltStat(1,mem%NodeIndx(I)) ) xd%MV_rel_n_FiltStat(1,mem%NodeIndx(I)) = vrelFCf - vrelFC @@ -6258,7 +6488,7 @@ SUBROUTINE Morison_UpdateDiscState( Time, u, p, x, xd, z, OtherState, m, errStat ! Side B - -x_hat side posFC = pos - mem%x_hat * 0.5 * mem%SaMG(i) SVFC = u%Mesh%TranslationVel(:,mem%NodeIndx(i)) + cross_product( u%Mesh%RotationVel(:,mem%NodeIndx(i)), -mem%x_hat * 0.5 * mem%SaMG(i) ) - call WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., tmpInt, FVTmp, FATmp, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call WaveField_GetNodeWaveVel( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., .TRUE., tmpInt, FVTmp, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) vrelFC = dot_product( REAL(FVTmp,ReKi) - SVFC, -mem%x_hat ) vrelFCf = mem%VRelNFiltConstB * ( vrelFC + xd%MV_rel_n_FiltStat(2,mem%NodeIndx(I)) ) xd%MV_rel_n_FiltStat(2,mem%NodeIndx(I)) = vrelFCf - vrelFC @@ -6266,7 +6496,7 @@ SUBROUTINE Morison_UpdateDiscState( Time, u, p, x, xd, z, OtherState, m, errStat ! Side A - +y_hat side posFC = pos + mem%y_hat * 0.5 * mem%SbMG(i) SVFC = u%Mesh%TranslationVel(:,mem%NodeIndx(i)) + cross_product( u%Mesh%RotationVel(:,mem%NodeIndx(i)), mem%y_hat * 0.5 * mem%SbMG(i) ) - call WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., tmpInt, FVTmp, FATmp, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call WaveField_GetNodeWaveVel( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., .TRUE., tmpInt, FVTmp, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) vrelFC = dot_product( REAL(FVTmp,ReKi) - SVFC, mem%y_hat ) vrelFCf = mem%VRelNFiltConstA * ( vrelFC + xd%MV_rel_n_FiltStat(3,mem%NodeIndx(I)) ) xd%MV_rel_n_FiltStat(3,mem%NodeIndx(I)) = vrelFCf - vrelFC @@ -6274,7 +6504,7 @@ SUBROUTINE Morison_UpdateDiscState( Time, u, p, x, xd, z, OtherState, m, errStat ! Side A - -y_hat side posFC = pos - mem%y_hat * 0.5 * mem%SbMG(i) SVFC = u%Mesh%TranslationVel(:,mem%NodeIndx(i)) + cross_product( u%Mesh%RotationVel(:,mem%NodeIndx(i)), -mem%y_hat * 0.5 * mem%SbMG(i) ) - call WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., tmpInt, FVTmp, FATmp, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call WaveField_GetNodeWaveVel( p%WaveField, m%WaveField_m, Time, posFC, .TRUE., .TRUE., tmpInt, FVTmp, ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) vrelFC = dot_product( REAL(FVTmp,ReKi) - SVFC, -mem%y_hat ) vrelFCf = mem%VRelNFiltConstA * ( vrelFC + xd%MV_rel_n_FiltStat(4,mem%NodeIndx(I)) ) xd%MV_rel_n_FiltStat(4,mem%NodeIndx(I)) = vrelFCf - vrelFC diff --git a/modules/hydrodyn/src/Morison.txt b/modules/hydrodyn/src/Morison.txt index fe912f470c..e14c5a9aff 100644 --- a/modules/hydrodyn/src/Morison.txt +++ b/modules/hydrodyn/src/Morison.txt @@ -337,7 +337,8 @@ typedef ^ ^ INTEGER # typedef ^ InitInputType ReKi Gravity - - - "Gravity (scalar, positive-valued)" m/s^2 typedef ^ ^ INTEGER WaveDisp - - - "Method of computing Wave Kinematics. (0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) " - -typedef ^ ^ INTEGER AMMod - - - "Method of computing distributed added-mass force. (0: Only and always on nodes below SWL at the undisplaced position. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveMod = 0 or 6 or when WaveStMod = 0 in SeaState]" - +typedef ^ ^ INTEGER AMMod - - - "Method of computing distributed added-mass force. (0: Only and always on nodes below SWL at the undisplaced position. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveStMod = 0 in SeaState]" - +typedef ^ ^ INTEGER HstMod - - - "Method of computing strip-theory hydrostatic loads. (0: Up to the still water level. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveStMod = 0 in SeaState]" - typedef ^ ^ INTEGER NJoints - - - "Number of user-specified joints" - typedef ^ ^ INTEGER NNodes - - - "Total number of nodes in the final software model" - typedef ^ ^ Morison_JointType InpJoints {:} - - "Array of user-specified joints" - @@ -472,6 +473,7 @@ typedef ^ ParameterType DbKi typedef ^ ^ ReKi Gravity - - - "Gravity (scalar, positive-valued)" m/s^2 typedef ^ ^ INTEGER WaveDisp - - - "Method of computing Wave Kinematics. (0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) " - typedef ^ ^ INTEGER AMMod - - - "Method of computing distributed added-mass force. (0: Only and always on nodes below SWL at the undisplaced position. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveMod = 0 or 6 or when WaveStMod = 0 in SeaState]" - +typedef ^ ^ INTEGER HstMod - - - "Method of computing strip-theory hydrostatic loads. (0: Up to the still water level. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveStMod = 0 in SeaState]" - typedef ^ ^ INTEGER NMembers - - - "number of members" - typedef ^ ^ Morison_MemberType Members {:} - - "Array of Morison members used during simulation" - typedef ^ ^ INTEGER NNodes - - - "" - diff --git a/modules/hydrodyn/src/Morison_Types.f90 b/modules/hydrodyn/src/Morison_Types.f90 index 166dc8f5dd..23f4f011c0 100644 --- a/modules/hydrodyn/src/Morison_Types.f90 +++ b/modules/hydrodyn/src/Morison_Types.f90 @@ -34,8 +34,8 @@ MODULE Morison_Types USE SeaSt_WaveField_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: MSecGeom_Cyl = 1 ! MSecGeom = 1 [circular member cross section] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: MSecGeom_Rec = 2 ! MSecGeom = 2 [rectangular member cross section] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MSecGeom_Cyl = 1 ! MSecGeom = 1 [circular member cross section] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MSecGeom_Rec = 2 ! MSecGeom = 2 [rectangular member cross section] [-] ! ========= Morison_JointType ======= TYPE, PUBLIC :: Morison_JointType INTEGER(IntKi) :: JointID = 0_IntKi !< User-specified integer ID for the given joint [-] @@ -405,7 +405,8 @@ MODULE Morison_Types TYPE, PUBLIC :: Morison_InitInputType REAL(ReKi) :: Gravity = 0.0_ReKi !< Gravity (scalar, positive-valued) [m/s^2] INTEGER(IntKi) :: WaveDisp = 0_IntKi !< Method of computing Wave Kinematics. (0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [-] - INTEGER(IntKi) :: AMMod = 0_IntKi !< Method of computing distributed added-mass force. (0: Only and always on nodes below SWL at the undisplaced position. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveMod = 0 or 6 or when WaveStMod = 0 in SeaState] [-] + INTEGER(IntKi) :: AMMod = 0_IntKi !< Method of computing distributed added-mass force. (0: Only and always on nodes below SWL at the undisplaced position. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveStMod = 0 in SeaState] [-] + INTEGER(IntKi) :: HstMod = 0_IntKi !< Method of computing strip-theory hydrostatic loads. (0: Up to the still water level. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveStMod = 0 in SeaState] [-] INTEGER(IntKi) :: NJoints = 0_IntKi !< Number of user-specified joints [-] INTEGER(IntKi) :: NNodes = 0_IntKi !< Total number of nodes in the final software model [-] TYPE(Morison_JointType) , DIMENSION(:), ALLOCATABLE :: InpJoints !< Array of user-specified joints [-] @@ -539,6 +540,7 @@ MODULE Morison_Types REAL(ReKi) :: Gravity = 0.0_ReKi !< Gravity (scalar, positive-valued) [m/s^2] INTEGER(IntKi) :: WaveDisp = 0_IntKi !< Method of computing Wave Kinematics. (0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [-] INTEGER(IntKi) :: AMMod = 0_IntKi !< Method of computing distributed added-mass force. (0: Only and always on nodes below SWL at the undisplaced position. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveMod = 0 or 6 or when WaveStMod = 0 in SeaState] [-] + INTEGER(IntKi) :: HstMod = 0_IntKi !< Method of computing strip-theory hydrostatic loads. (0: Up to the still water level. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveStMod = 0 in SeaState] [-] INTEGER(IntKi) :: NMembers = 0_IntKi !< number of members [-] TYPE(Morison_MemberType) , DIMENSION(:), ALLOCATABLE :: Members !< Array of Morison members used during simulation [-] INTEGER(IntKi) :: NNodes = 0_IntKi !< [-] @@ -579,7 +581,14 @@ MODULE Morison_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< [-] END TYPE Morison_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: Morison_x_DummyContState = 1 ! Morison%DummyContState + integer(IntKi), public, parameter :: Morison_u_Mesh = 2 ! Morison%Mesh + integer(IntKi), public, parameter :: Morison_u_PtfmRefY = 3 ! Morison%PtfmRefY + integer(IntKi), public, parameter :: Morison_y_Mesh = 4 ! Morison%Mesh + integer(IntKi), public, parameter :: Morison_y_VisMesh = 5 ! Morison%VisMesh + integer(IntKi), public, parameter :: Morison_y_WriteOutput = 6 ! Morison%WriteOutput + +contains subroutine Morison_CopyJointType(SrcJointTypeData, DstJointTypeData, CtrlCode, ErrStat, ErrMsg) type(Morison_JointType), intent(in) :: SrcJointTypeData @@ -3233,6 +3242,7 @@ subroutine Morison_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, E DstInitInputData%Gravity = SrcInitInputData%Gravity DstInitInputData%WaveDisp = SrcInitInputData%WaveDisp DstInitInputData%AMMod = SrcInitInputData%AMMod + DstInitInputData%HstMod = SrcInitInputData%HstMod DstInitInputData%NJoints = SrcInitInputData%NJoints DstInitInputData%NNodes = SrcInitInputData%NNodes if (allocated(SrcInitInputData%InpJoints)) then @@ -3680,6 +3690,7 @@ subroutine Morison_PackInitInput(RF, Indata) call RegPack(RF, InData%Gravity) call RegPack(RF, InData%WaveDisp) call RegPack(RF, InData%AMMod) + call RegPack(RF, InData%HstMod) call RegPack(RF, InData%NJoints) call RegPack(RF, InData%NNodes) call RegPack(RF, allocated(InData%InpJoints)) @@ -3885,6 +3896,7 @@ subroutine Morison_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%Gravity); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveDisp); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%AMMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HstMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NJoints); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NNodes); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%InpJoints)) deallocate(OutData%InpJoints) @@ -4888,6 +4900,7 @@ subroutine Morison_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrM DstParamData%Gravity = SrcParamData%Gravity DstParamData%WaveDisp = SrcParamData%WaveDisp DstParamData%AMMod = SrcParamData%AMMod + DstParamData%HstMod = SrcParamData%HstMod DstParamData%NMembers = SrcParamData%NMembers if (allocated(SrcParamData%Members)) then LB(1:1) = lbound(SrcParamData%Members) @@ -5201,6 +5214,7 @@ subroutine Morison_PackParam(RF, Indata) call RegPack(RF, InData%Gravity) call RegPack(RF, InData%WaveDisp) call RegPack(RF, InData%AMMod) + call RegPack(RF, InData%HstMod) call RegPack(RF, InData%NMembers) call RegPack(RF, allocated(InData%Members)) if (allocated(InData%Members)) then @@ -5290,6 +5304,7 @@ subroutine Morison_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%Gravity); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveDisp); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%AMMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HstMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NMembers); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%Members)) deallocate(OutData%Members) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return @@ -5844,5 +5859,244 @@ SUBROUTINE Morison_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function Morison_InputMeshPointer(u, DL) result(Mesh) + type(Morison_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (Morison_u_Mesh) + Mesh => u%Mesh + end select +end function + +function Morison_OutputMeshPointer(y, DL) result(Mesh) + type(Morison_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (Morison_y_Mesh) + Mesh => y%Mesh + case (Morison_y_VisMesh) + Mesh => y%VisMesh + end select +end function + +subroutine Morison_VarsPackContState(Vars, x, ValAry) + type(Morison_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call Morison_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine Morison_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(Morison_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Morison_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Morison_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Morison_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call Morison_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine Morison_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Morison_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Morison_x_DummyContState) + x%DummyContState = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function Morison_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Morison_x_DummyContState) + Name = "x%DummyContState" + case default + Name = "Unknown Field" + end select +end function + +subroutine Morison_VarsPackContStateDeriv(Vars, x, ValAry) + type(Morison_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call Morison_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine Morison_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(Morison_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Morison_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Morison_VarsPackInput(Vars, u, ValAry) + type(Morison_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call Morison_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine Morison_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(Morison_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Morison_u_Mesh) + call MV_PackMesh(V, u%Mesh, ValAry) ! Mesh + case (Morison_u_PtfmRefY) + VarVals(1) = u%PtfmRefY ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Morison_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Morison_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call Morison_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine Morison_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Morison_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Morison_u_Mesh) + call MV_UnpackMesh(V, ValAry, u%Mesh) ! Mesh + case (Morison_u_PtfmRefY) + u%PtfmRefY = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function Morison_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Morison_u_Mesh) + Name = "u%Mesh" + case (Morison_u_PtfmRefY) + Name = "u%PtfmRefY" + case default + Name = "Unknown Field" + end select +end function + +subroutine Morison_VarsPackOutput(Vars, y, ValAry) + type(Morison_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call Morison_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine Morison_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(Morison_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Morison_y_Mesh) + call MV_PackMesh(V, y%Mesh, ValAry) ! Mesh + case (Morison_y_VisMesh) + call MV_PackMesh(V, y%VisMesh, ValAry) ! Mesh + case (Morison_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Morison_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Morison_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call Morison_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine Morison_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Morison_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Morison_y_Mesh) + call MV_UnpackMesh(V, ValAry, y%Mesh) ! Mesh + case (Morison_y_VisMesh) + call MV_UnpackMesh(V, ValAry, y%VisMesh) ! Mesh + case (Morison_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function Morison_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Morison_y_Mesh) + Name = "y%Mesh" + case (Morison_y_VisMesh) + Name = "y%VisMesh" + case (Morison_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE Morison_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/hydrodyn/src/SS_Excitation_Types.f90 b/modules/hydrodyn/src/SS_Excitation_Types.f90 index aa0d25a528..d721957885 100644 --- a/modules/hydrodyn/src/SS_Excitation_Types.f90 +++ b/modules/hydrodyn/src/SS_Excitation_Types.f90 @@ -101,7 +101,12 @@ MODULE SS_Excitation_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< output Data [kN] END TYPE SS_Exc_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: SS_Exc_x_x = 1 ! SS_Exc%x + integer(IntKi), public, parameter :: SS_Exc_u_PtfmPos = 2 ! SS_Exc%PtfmPos + integer(IntKi), public, parameter :: SS_Exc_y_y = 3 ! SS_Exc%y + integer(IntKi), public, parameter :: SS_Exc_y_WriteOutput = 4 ! SS_Exc%WriteOutput + +contains subroutine SS_Exc_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(SS_Exc_InitInputType), intent(in) :: SrcInitInputData @@ -1151,5 +1156,226 @@ SUBROUTINE SS_Exc_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function SS_Exc_InputMeshPointer(u, DL) result(Mesh) + type(SS_Exc_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function SS_Exc_OutputMeshPointer(y, DL) result(Mesh) + type(SS_Exc_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine SS_Exc_VarsPackContState(Vars, x, ValAry) + type(SS_Exc_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SS_Exc_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SS_Exc_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SS_Exc_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Exc_x_x) + VarVals = x%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SS_Exc_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Exc_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SS_Exc_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine SS_Exc_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Exc_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Exc_x_x) + x%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SS_Exc_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SS_Exc_x_x) + Name = "x%x" + case default + Name = "Unknown Field" + end select +end function + +subroutine SS_Exc_VarsPackContStateDeriv(Vars, x, ValAry) + type(SS_Exc_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SS_Exc_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SS_Exc_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SS_Exc_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Exc_x_x) + VarVals = x%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SS_Exc_VarsPackInput(Vars, u, ValAry) + type(SS_Exc_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SS_Exc_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine SS_Exc_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(SS_Exc_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Exc_u_PtfmPos) + VarVals = u%PtfmPos(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SS_Exc_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Exc_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SS_Exc_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine SS_Exc_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Exc_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Exc_u_PtfmPos) + u%PtfmPos(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function SS_Exc_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SS_Exc_u_PtfmPos) + Name = "u%PtfmPos" + case default + Name = "Unknown Field" + end select +end function + +subroutine SS_Exc_VarsPackOutput(Vars, y, ValAry) + type(SS_Exc_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SS_Exc_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine SS_Exc_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(SS_Exc_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Exc_y_y) + VarVals = y%y(V%iLB:V%iUB) ! Rank 1 Array + case (SS_Exc_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SS_Exc_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Exc_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SS_Exc_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine SS_Exc_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Exc_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Exc_y_y) + y%y(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SS_Exc_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SS_Exc_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SS_Exc_y_y) + Name = "y%y" + case (SS_Exc_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE SS_Excitation_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/hydrodyn/src/SS_Radiation_Types.f90 b/modules/hydrodyn/src/SS_Radiation_Types.f90 index 59b45510aa..442c9fe957 100644 --- a/modules/hydrodyn/src/SS_Radiation_Types.f90 +++ b/modules/hydrodyn/src/SS_Radiation_Types.f90 @@ -95,7 +95,12 @@ MODULE SS_Radiation_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< output Data [(kN)] END TYPE SS_Rad_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: SS_Rad_x_x = 1 ! SS_Rad%x + integer(IntKi), public, parameter :: SS_Rad_u_dq = 2 ! SS_Rad%dq + integer(IntKi), public, parameter :: SS_Rad_y_y = 3 ! SS_Rad%y + integer(IntKi), public, parameter :: SS_Rad_y_WriteOutput = 4 ! SS_Rad%WriteOutput + +contains subroutine SS_Rad_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(SS_Rad_InitInputType), intent(in) :: SrcInitInputData @@ -1072,5 +1077,226 @@ SUBROUTINE SS_Rad_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function SS_Rad_InputMeshPointer(u, DL) result(Mesh) + type(SS_Rad_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function SS_Rad_OutputMeshPointer(y, DL) result(Mesh) + type(SS_Rad_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine SS_Rad_VarsPackContState(Vars, x, ValAry) + type(SS_Rad_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SS_Rad_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SS_Rad_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SS_Rad_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Rad_x_x) + VarVals = x%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SS_Rad_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Rad_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SS_Rad_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine SS_Rad_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Rad_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Rad_x_x) + x%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SS_Rad_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SS_Rad_x_x) + Name = "x%x" + case default + Name = "Unknown Field" + end select +end function + +subroutine SS_Rad_VarsPackContStateDeriv(Vars, x, ValAry) + type(SS_Rad_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SS_Rad_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SS_Rad_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SS_Rad_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Rad_x_x) + VarVals = x%x(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SS_Rad_VarsPackInput(Vars, u, ValAry) + type(SS_Rad_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SS_Rad_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine SS_Rad_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(SS_Rad_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Rad_u_dq) + VarVals = u%dq(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SS_Rad_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Rad_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SS_Rad_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine SS_Rad_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Rad_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Rad_u_dq) + u%dq(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SS_Rad_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SS_Rad_u_dq) + Name = "u%dq" + case default + Name = "Unknown Field" + end select +end function + +subroutine SS_Rad_VarsPackOutput(Vars, y, ValAry) + type(SS_Rad_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SS_Rad_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine SS_Rad_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(SS_Rad_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Rad_y_y) + VarVals = y%y(V%iLB:V%iUB) ! Rank 1 Array + case (SS_Rad_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SS_Rad_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Rad_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SS_Rad_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine SS_Rad_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SS_Rad_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SS_Rad_y_y) + y%y(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SS_Rad_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SS_Rad_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SS_Rad_y_y) + Name = "y%y" + case (SS_Rad_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE SS_Radiation_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/hydrodyn/src/WAMIT.f90 b/modules/hydrodyn/src/WAMIT.f90 index 5194aae156..606bef5713 100644 --- a/modules/hydrodyn/src/WAMIT.f90 +++ b/modules/hydrodyn/src/WAMIT.f90 @@ -62,39 +62,61 @@ MODULE WAMIT !---------------------------------------------------------------------------------------------------------------------------------- !> This routine transforms WAMIT input file data from a local (heading-angle, based) coordinate system to the global system. - subroutine TransformWAMITMatrices( NBody, RotZ, M ) + subroutine TransformWAMITMatrices( p, RotZ, M ) !.................................................................................................................................. - integer(IntKi), intent( in ) :: NBody ! Number of WAMIT bodies in this WAMIT object ( = 1 if NBodyMod > 1) - real(R8Ki), intent( in ) :: RotZ(:) ! NBody heading angles (radians) - real(SiKi), intent( inout ) :: M(:,:) ! Matrix data to be transformed, if NBodyMOD = 1 and NBody > 1 then we will be transforming the individual sub 6x6 matrices + + TYPE(WAMIT_ParameterType), intent(in ) :: p ! Parameters + real(R8Ki), intent(in ) :: RotZ(:) ! NBody heading angles (radians) + real(SiKi), intent(inout) :: M(:,:) ! Matrix data to be transformed, if NBodyMOD = 1 and NBody > 1 then we will be transforming the individual sub (6+NAddDOF)x(6+NAddDOF) matrices integer(IntKi) :: i,j,ii,jj,iSub,jSub - real(R8Ki) :: Rj(3,3) - real(R8Ki) :: Ri(3,3) + real(R8Ki) :: Rj(6,6) + real(R8Ki) :: Ri(6,6) - do j = 1, NBody - Rj(1,:) = (/ cos(RotZ(j)), sin(RotZ(j)), 0.0_R8Ki/) - Rj(2,:) = (/-sin(RotZ(j)), cos(RotZ(j)), 0.0_R8Ki/) - Rj(3,:) = (/ 0.0_R8Ki , 0.0_R8Ki , 1.0_R8Ki/) - do i = 1, NBody + do j = 1, p%NBody + + jSub = p%BDOFStrt(j) + + Rj(1,:) = [ cos(RotZ(j)), sin(RotZ(j)), 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki] + Rj(2,:) = [-sin(RotZ(j)), cos(RotZ(j)), 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki] + Rj(3,:) = [ 0.0_R8Ki, 0.0_R8Ki, 1.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki] + Rj(4,:) = [ 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, cos(RotZ(j)), sin(RotZ(j)), 0.0_R8Ki] + Rj(5,:) = [ 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki,-sin(RotZ(j)), cos(RotZ(j)), 0.0_R8Ki] + Rj(6,:) = [ 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 1.0_R8Ki] + + do i = 1, p%NBody + if ( (.not. EqualRealNos(RotZ(i), 0.0_R8Ki)) .or. (.not. EqualRealNos(RotZ(j), 0.0_R8Ki)) ) then - Ri(1,:) = (/ cos(RotZ(i)), sin(RotZ(i)), 0.0_R8Ki/) - Ri(2,:) = (/-sin(RotZ(i)), cos(RotZ(i)), 0.0_R8Ki/) - Ri(3,:) = (/ 0.0_R8Ki , 0.0_R8Ki , 1.0_R8Ki/) - do jj = 1,2 - jSub = (j-1)*6 + (jj-1)*3 + 1 - do ii = 1,2 - iSub = (i-1)*6 + (ii-1)*3 + 1 - M(iSub:iSub+2,jSub:jSub+2) = matmul( transpose(Ri), matmul( M(iSub:iSub+2,jSub:jSub+2), Rj ) ) - end do - end do + + iSub = p%BDOFStrt(i) + + Ri(1,:) = [ cos(RotZ(i)), sin(RotZ(i)), 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki] + Ri(2,:) = [-sin(RotZ(i)), cos(RotZ(i)), 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki] + Ri(3,:) = [ 0.0_R8Ki, 0.0_R8Ki, 1.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki] + Ri(4,:) = [ 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, cos(RotZ(i)), sin(RotZ(i)), 0.0_R8Ki] + Ri(5,:) = [ 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki,-sin(RotZ(i)), cos(RotZ(i)), 0.0_R8Ki] + Ri(6,:) = [ 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, 1.0_R8Ki] + + ! Rigid-body to rigid-body modes + M(iSub:iSub+5,jSub:jSub+5) = matmul( transpose(Ri), matmul( M(iSub:iSub+5,jSub:jSub+5), Rj ) ) + ! Rigid-body to generalized modes + if ( p%NAddDOF(i) > 0_IntKi ) then + M(iSub+6:iSub+5+p%NAddDOF(i),jSub:jSub+5) = matmul( M(iSub+6:iSub+5+p%NAddDOF(i),jSub:jSub+5), Rj ) + end if + ! Generalized to rigid-body modes + if ( p%NAddDOF(j) > 0_IntKi ) then + M(iSub:iSub+5,jSub+6:jSub+5+p%NAddDOF(j)) = matmul( transpose(Ri), M(iSub:iSub+5,jSub+6:jSub+5+p%NAddDOF(j)) ) + end if + ! No transformation needed for generalized to generalized modes + end if + end do end do + end subroutine TransformWAMITMatrices - !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the start of the simulation to perform initialization steps. !! The parameters are set here and not changed during the simulation. @@ -141,6 +163,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS COMPLEX(SiKi), ALLOCATABLE :: WaveExctnC(:,:,:) ! Discrete Fourier transform of the instantaneous value of the total excitation force on the support platfrom from incident waves (N, N-m) COMPLEX(SiKi), ALLOCATABLE :: WaveExctnCGrid(:,:,:,:) ! Discrete Fourier transform of the instantaneous value of the total excitation force on the grid points from incident waves (N, N-m) REAL(ReKi) :: DffrctDim (6) ! Matrix used to redimensionalize WAMIT hydrodynamic wave excitation force output (kg/s^2, kg-m/s^2 ) + REAL(ReKi) :: DffrctDimAdd ! Redimensionalization factor for WAMIT hydrodynamic wave excitation force output for generalized DOF REAL(SiKi), ALLOCATABLE :: HdroAddMs (:,:,:) ! The frequency-dependent hydrodynamic added mass matrix from the radiation problem (kg , kg-m , kg-m^2 ) REAL(SiKi), ALLOCATABLE :: HdroDmpng (:,:,:) ! The frequency-dependent hydrodynamic damping matrix from the radiation problem (kg/s, kg-m/s, kg-m^2/s) REAL(SiKi), ALLOCATABLE :: HdroFreq (:) ! Frequency components inherent in the hydrodynamic added mass matrix, hydrodynamic daming matrix, and complex wave excitation force per unit wave amplitude vector (rad/s) @@ -151,7 +174,9 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS REAL(ReKi) :: PrvDir ! The value of TmpDir from the previous line (degrees) REAL(ReKi) :: PrvPer ! The value of TmpPer from the previous line (sec ) REAL(ReKi) :: SttcDim (6,6) ! Matrix used to redimensionalize WAMIT hydrostatic restoring output (kg/s^2, kg-m/s^2, kg-m^2/s^2) + REAL(ReKi) :: SttcDimAdd ! Redimensionalization factor for WAMIT hydrostatic restoring output for generalized DOF REAL(ReKi) :: RdtnDim (6,6) ! Matrix used to redimensionalize WAMIT hydrodynamic added mass and damping output (kg , kg-m , kg-m^2 ) + REAL(ReKi) :: RdtnDimAdd ! Redimensionalization factor for WAMIT hydrodynamic added mass and damping output for generalized DOF REAL(ReKi) :: TmpData1 ! A temporary value read in from a WAMIT file (- ) REAL(ReKi) :: TmpData2 ! A temporary value read in from a WAMIT file (- ) REAL(ReKi) :: TmpDir ! A temporary direction read in from a WAMIT file (degrees) @@ -164,7 +189,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS REAL(ReKi), ALLOCATABLE :: WAMITPer (:) ! Period components as ordered in the WAMIT output files (sec ) REAL(ReKi), ALLOCATABLE :: WAMITWvDir(:) ! Wave direction components as ordered in the WAMIT output files (degrees) - INTEGER :: I,iGrid,iX,iY,iHdg,iBdy,iStp ! Generic index + INTEGER :: I,iGrid,iX,iY,iHdg,iBdy,iStp,iDOF ! Generic index INTEGER :: InsertInd ! The lowest sorted index whose associated frequency component is higher than the current frequency component -- this is to sort the frequency components from lowest to highest INTEGER :: J ! Generic index INTEGER :: K ! Generic index @@ -263,17 +288,34 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS CALL SetErrStat( ErrID_Fatal, "DEVELOPER ERROR: If NBodyMod = 2 or 3, then NBody for the a WAMIT object must be equal to 1", ErrStat, ErrMsg, RoutineName) return end if + + call AllocAry( p%NAddDOF , p%NBody, 'p%NAddDOF' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( p%BDOFStrt, p%NBody, 'p%BDOFStrt', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + p%NAddDOF = InitInp%NAddDOF + p%NDOF = 0_IntKi + do iBody = 1, p%NBody + p%BDOFStrt(iBody) = p%NDOF + 1_IntKi + p%NDOF = p%NDOF + 6_IntKi + p%NAddDOF(iBody) + end do + p%HasAddDOF = ( p%NDOF > 6*p%NBody ) ! Allocate misc var and parameter vectors/matrices call AllocAry( p%F_HS_Moment_Offset, 6, p%NBody, 'p%F_HS_Moment_Offset', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry( m%F_HS , 6*p%NBody, 'm%F_HS' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry( m%F_Waves1 , 6*p%NBody, 'm%F_Waves1' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry( m%F_Rdtn , 6*p%NBody, 'm%F_Rdtn' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry( m%F_PtfmAM , 6*p%NBody, 'm%F_PtfmAM' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry( p%HdroAdMsI, 6*p%NBody,6*p%NBody, 'p%HdroAdMsI' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AllocAry( p%HdroSttc , 6*p%NBody,6*p%NBody, 'p%HdroSttc' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( m%F_HS , p%NDOF, 'm%F_HS' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( m%F_Waves1 , p%NDOF, 'm%F_Waves1' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( m%F_Rdtn , p%NDOF, 'm%F_Rdtn' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( m%F_PtfmAM , p%NDOF, 'm%F_PtfmAM' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( p%HdroAdMsI, p%NDOF,p%NDOF, 'p%HdroAdMsI' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( p%HdroSttc , p%NDOF,p%NDOF, 'p%HdroSttc' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Allocate input/output arrays + if ( p%HasAddDOF ) then + call AllocAry( u%qAddDOF, p%NDOF-6*p%NBody, 'u%qAddDOF' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( u%qAddDOFDot, p%NDOF-6*p%NBody, 'u%qAddDOFDot' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( u%qAddDOFDotDot, p%NDOF-6*p%NBody, 'u%qAddDOFDotDot' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AllocAry( y%FAddDOF, p%NDOF-6*p%NBody, 'y%FAddDOF' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end if - do iBody = 1, p%NBody p%F_HS_Moment_Offset(1,iBody) = 0.0_ReKi p%F_HS_Moment_Offset(2,iBody) = 0.0_ReKi @@ -282,7 +324,6 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS p%F_HS_Moment_Offset(5,iBody) = -p%WaveField%RhoXg*InitInp%PtfmVol0(iBody)*( InitInp%PtfmCOBxt(iBody) - InitInp%PtfmRefxt(iBody) ) ! and the moment about Y due to the COB being offset from the localWAMIT reference point p%F_HS_Moment_Offset(6,iBody) = 0.0_ReKi end do - ! Tell our nice users what is about to happen that may take a while: @@ -346,8 +387,10 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS END DO ! I - All moment-rotation elements (rows) - - + ! For additional generalized DOF - requires WAMITULEN = 1.0 + SttcDimAdd = p%WaveField%RhoXg + RdtnDimAdd = p%WaveField%WtrDens + DffrctDimAdd = p%WaveField%RhoXg ! Let's read in and redimensionalize the hydrodynamic data from the WAMIT ! output files: @@ -356,16 +399,11 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ! Linear restoring from the hydrostatics problem: - CALL OpenFInpFile ( UnWh, TRIM(InitInp%WAMITFile)//'.hst', ErrStat2, ErrMsg2 ) ! Open file. - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + CALL OpenFInpFile ( UnWh, TRIM(InitInp%WAMITFile)//'.hst', ErrStat2, ErrMsg2 ); IF (Failed()) RETURN ! Open file. p%HdroSttc (:,:) = 0.0 ! Initialize to zero - DO ! Loop through all rows in the file + DO ! Loop through all rows in the file READ (UnWh,*,IOSTAT=Sttus) I, J, TmpData1 ! Read in the row index, column index, and nondimensional data from the WAMIT file @@ -373,11 +411,25 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ! In case NBodyMod = 1, we now have WAMIT matrices which are potentially larger than 6x6, so we need to determine how the SttcDim multiplier matrix (a 6x6) ! should be applied to the larger WAMIT matrix. + + IF ( I > p%NDOF .or. J > p%NDOF ) THEN + CALL SetErrStat( ErrID_Fatal, ' WAMIT file "'//TRIM(InitInp%WAMITFile)//'.hst'//'" contains more modes than expected ('//trim(num2lstr(p%NDOF))//'). ', ErrStat, ErrMsg, RoutineName) + CALL Cleanup() + RETURN + END IF - iSub = mod(I-1,6)+1 ! Finds the 6x6 sub-matrix indexing for the SttcDim multiplier matrix - jSub = mod(J-1,6)+1 + IF ( p%HasAddDOF ) THEN + + p%HdroSttc (I,J) = TmpData1*SttcDimAdd ! Redimensionalize the data and place it at the appropriate location within the array - p%HdroSttc (I,J) = TmpData1*SttcDim(iSub,jSub) ! Redimensionalize the data and place it at the appropriate location within the array + ELSE + + iSub = mod(I-1,6)+1 ! Finds the 6x6 sub-matrix indexing for the SttcDim multiplier matrix + jSub = mod(J-1,6)+1 + + p%HdroSttc (I,J) = TmpData1*SttcDim(iSub,jSub) ! Redimensionalize the data and place it at the appropriate location within the array + + END IF ELSE ! We must have reached the end of the file, so stop reading in data @@ -385,13 +437,14 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS END IF - END DO ! End loop through all rows in the file CLOSE ( UnWh ) ! Close file. ! need to transform p%HdroSttc when PtfmRefztRot is nonzero per plan - call TransformWAMITMatrices( p%NBody, InitInp%PtfmRefztRot, p%HdroSttc ) + call TransformWAMITMatrices( p, InitInp%PtfmRefztRot, p%HdroSttc ) + + ! Linear, frequency-dependent hydrodynamic added mass and damping from the ! radiation problem: @@ -446,8 +499,8 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS CALL AllocAry( WAMITPer, NInpFreq, 'WAMITPer', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) CALL AllocAry( SortFreqInd, NInpFreq, 'SortFreqInd', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) CALL AllocAry( HdroFreq, NInpFreq, 'HdroFreq', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry( HdroAddMs, NInpFreq, 6*p%NBody, 6*p%NBody, 'HdroAddMs', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry( HdroDmpng, NInpFreq, 6*p%NBody, 6*p%NBody, 'HdroDmpng', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + CALL AllocAry( HdroAddMs, NInpFreq, p%NDOF, p%NDOF, 'HdroAddMs', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + CALL AllocAry( HdroDmpng, NInpFreq, p%NDOF, p%NDOF, 'HdroDmpng', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) IF ( ErrStat >= AbortErrLev ) THEN CALL Cleanup() @@ -562,17 +615,25 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS CALL SetErrStat( ErrID_Fatal, "Error reading line from WAMIT file", ErrStat, ErrMsg, RoutineName) CALL Cleanup() RETURN - END IF -!bjj: verify that I and J are valid indices for RdtnDim - + END IF + IF ( I > p%NDOF .or. J > p%NDOF ) THEN + CALL SetErrStat( ErrID_Fatal, ' WAMIT file "'//TRIM(InitInp%WAMITFile)//'.1'//'" contains more modes than expected ('//trim(num2lstr(p%NDOF))//'). ', ErrStat, ErrMsg, RoutineName) + CALL Cleanup() + RETURN + END IF - ! IF ( J >= I ) THEN ! .TRUE. if we are on or above the diagonal - ! Indx = 6*( I - 1 ) + J - ( I*( I - 1 ) )/2 ! Convert from row/column indices to an index in the format used to save only the upper-triangular portion of the matrix. NOTE: ( I*( I - 1 ) )/2 = SUM(I,START=1,END=I-1). - iSub = mod(I-1,6)+1 ! Finds the 6x6 sub-matrix indexing for the SttcDim multiplier matrix + IF ( p%HasAddDOF ) THEN + + HdroAddMs(SortFreqInd(K),I,J) = TmpData1*RdtnDimAdd ! Redimensionalize the data and place it at the appropriate location within the array + + ELSE + + iSub = mod(I-1,6)+1 ! Finds the 6x6 sub-matrix indexing for the RdtnDim multiplier matrix jSub = mod(J-1,6)+1 HdroAddMs(SortFreqInd(K),I,J) = TmpData1*RdtnDim(iSub,jSub) ! Redimensionalize the data and place it at the appropriate location within the array - ! END IF + + END IF ELSE ! We must have a positive, non-infinite frequency. @@ -582,15 +643,25 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS CALL Cleanup() RETURN END IF - + IF ( I > p%NDOF .or. J > p%NDOF ) THEN + CALL SetErrStat( ErrID_Fatal, ' WAMIT file "'//TRIM(InitInp%WAMITFile)//'.1'//'" contains more modes than expected ('//trim(num2lstr(p%NDOF))//'). ', ErrStat, ErrMsg, RoutineName) + CALL Cleanup() + RETURN + END IF - !IF ( J >= I ) THEN ! .TRUE. if we are on or above the diagonal - ! Indx = 6*( I - 1 ) + J - ( I*( I - 1 ) )/2 ! Convert from row/column indices to an index in the format used to save only the upper-triangular portion of the matrix. NOTE: ( I*( I - 1 ) )/2 = SUM(I,START=1,END=I-1). - iSub = mod(I-1,6)+1 ! Finds the 6x6 sub-matrix indexing for the SttcDim multiplier matrix - jSub = mod(J-1,6)+1 + IF ( p%HasAddDOF ) THEN + + HdroAddMs(SortFreqInd(K),I,J) = TmpData1*RdtnDimAdd ! Redimensionalize the data and place it at the appropriate location within the array + HdroDmpng(SortFreqInd(K),I,J) = TmpData2*RdtnDimAdd*HdroFreq(SortFreqInd(K)) ! Redimensionalize the data and place it at the appropriate location within the array + + ELSE + + iSub = mod(I-1,6)+1 ! Finds the 6x6 sub-matrix indexing for the RdtnDim multiplier matrix + jSub = mod(J-1,6)+1 HdroAddMs(SortFreqInd(K),I,J) = TmpData1*RdtnDim(iSub,jSub) ! Redimensionalize the data and place it at the appropriate location within the array HdroDmpng(SortFreqInd(K),I,J) = TmpData2*RdtnDim(iSub,jSub)*HdroFreq(SortFreqInd(K)) ! Redimensionalize the data and place it at the appropriate location within the array - ! END IF + + END IF END IF @@ -611,8 +682,8 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ! need to transform HdroAddMs and HdroDmpng when PtfmRefztRot is nonzero per plan do I = 1, NInpFreq - call TransformWAMITMatrices( p%NBody, InitInp%PtfmRefztRot, HdroAddMs(I,:,:) ) - call TransformWAMITMatrices( p%NBody, InitInp%PtfmRefztRot, HdroDmpng(I,:,:) ) + call TransformWAMITMatrices( p, InitInp%PtfmRefztRot, HdroAddMs(I,:,:) ) + call TransformWAMITMatrices( p, InitInp%PtfmRefztRot, HdroDmpng(I,:,:) ) end do @@ -683,15 +754,11 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ! to store the directions and frequency- and direction-dependent complex wave ! excitation force per unit wave amplitude vector: - CALL AllocAry( WAMITWvDir, NInpWvDir, 'WAMITWvDir', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry( SortWvDirInd, NInpWvDir, 'SortWvDirInd', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL AllocAry( HdroWvDir, NInpWvDir, 'HdroWvDir', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + CALL AllocAry( WAMITWvDir, NInpWvDir, 'WAMITWvDir', ErrStat2, ErrMsg2 ); IF(Failed()) RETURN + CALL AllocAry( SortWvDirInd, NInpWvDir, 'SortWvDirInd', ErrStat2, ErrMsg2 ); IF(Failed()) RETURN + CALL AllocAry( HdroWvDir, NInpWvDir, 'HdroWvDir', ErrStat2, ErrMsg2 ); IF(Failed()) RETURN - ALLOCATE ( HdroExctn (NInpFreq,NInpWvDir,6*p%NBody) , STAT=ErrStat2 ) ! complex so we don't have a built in subroutine + ALLOCATE ( HdroExctn (NInpFreq,NInpWvDir,p%NDOF) , STAT=ErrStat2 ) ! complex so we don't have a built in subroutine IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal, 'Error allocating space for HdroExctn array', ErrStat, ErrMsg, RoutineName) CALL Cleanup() @@ -821,6 +888,11 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS CALL Cleanup() RETURN END IF + IF ( I > p%NDOF ) THEN + CALL SetErrStat( ErrID_Fatal, ' WAMIT file "'//TRIM(InitInp%WAMITFile)//'.3'//'" contains more modes than expected ('//trim(num2lstr(p%NDOF))//'). ', ErrStat, ErrMsg, RoutineName) + CALL Cleanup() + RETURN + END IF IF ( FirstPass .OR. ( TmpPer /= PrvPer ) ) THEN ! .TRUE. if we are on the first pass or if the period currently read in is different than the previous period read in; thus we found a new period in the WAMIT file! @@ -851,9 +923,16 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS END IF - iSub = mod(I-1,6)+1 ! Finds the 6x6 sub-matrix indexing for the SttcDim multiplier matrix - HdroExctn(SortFreqInd(K),SortWvDirInd(J),I) = CMPLX( TmpRe, TmpIm )*DffrctDim(iSub) ! Redimensionalize the data and place it at the appropriate location within the array + IF ( p%HasAddDOF ) THEN + HdroExctn(SortFreqInd(K),SortWvDirInd(J),I) = CMPLX( TmpRe, TmpIm )*DffrctDimAdd ! Redimensionalize the data and place it at the appropriate location within the array + + ELSE + + iSub = mod(I-1,6)+1 ! Finds the 6x6 sub-matrix indexing for the DffrctDim multiplier matrix + HdroExctn(SortFreqInd(K),SortWvDirInd(J),I) = CMPLX( TmpRe, TmpIm )*DffrctDim(iSub) ! Redimensionalize the data and place it at the appropriate location within the array + + END IF ELSE ! We must have reached the end of the file, so stop reading in data @@ -911,22 +990,9 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS RETURN END IF - - ! Set the infinite-frequency limit of the frequency-dependent hydrodynamic ! added mass matrix, HdroAdMsI, based on the highest frequency available: -!TODO: Is this index order correct for computational speed? GJH 9/5/19 - !Indx = 0 - DO J = 1,6*p%NBody ! Loop through all rows of HdroAdMsI - DO K = 1,6*p%NBody ! Loop through all columns of HdroAdMsI above and including the diagonal - ! Indx = Indx + 1 - p%HdroAdMsI(J,K) = HdroAddMs(NInpFreq,J,K) - END DO ! K - All columns of HdroAdMsI above and including the diagonal - ! DO K = J+1,6 ! Loop through all rows of HdroAdMsI below the diagonal - ! p%HdroAdMsI(K,J) = p%HdroAdMsI(J,K) - ! END DO ! K - All rows of HdroAdMsI below the diagonal - END DO ! J - All rows of HdroAdMsI - + p%HdroAdMsI = HdroAddMs(NInpFreq,:,:) if ( ( p%ExctnMod == 0 ) ) then @@ -941,7 +1007,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS if ( p%ExctnMod == 1 ) then ! Initialize everything to zero: - ALLOCATE ( p%WaveExctnGrid (0:p%WaveField%NStepWave, p%ExctnGridParams%n(2),p%ExctnGridParams%n(3),p%ExctnGridParams%n(4),6*p%NBody) , STAT=ErrStat2 ) + ALLOCATE ( p%WaveExctnGrid (0:p%WaveField%NStepWave, p%ExctnGridParams%n(2),p%ExctnGridParams%n(3),p%ExctnGridParams%n(4),p%NDOF) , STAT=ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the WaveExctnGrid array.', ErrStat, ErrMsg, RoutineName) CALL Cleanup() @@ -962,12 +1028,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS call SS_Exc_Init(SS_Exctn_InitInp, m%SS_Exctn_u, p%SS_Exctn, x%SS_Exctn, xd%SS_Exctn, z%SS_Exctn, OtherState%SS_Exctn, & m%SS_Exctn_y, m%SS_Exctn, Interval_Sub, SS_Exctn_InitOut, ErrStat2, ErrMsg2) - - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call Cleanup() - return - end if + if(Failed()) return end if CASE ( WaveMod_ExtFull ) ! User wave data. @@ -1036,7 +1097,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ! ALLOCATE the arrays: - ALLOCATE ( WaveExctnC(0:p%WaveField%NStepWave2,p%NExctnHdg+1,6*p%NBody) , STAT=ErrStat2 ) + ALLOCATE ( WaveExctnC(0:p%WaveField%NStepWave2,p%NExctnHdg+1,p%NDOF) , STAT=ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the WaveExctnC array.', ErrStat, ErrMsg, RoutineName) CALL Cleanup() @@ -1044,7 +1105,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS END IF if (p%ExctnDisp > 0 ) then - ALLOCATE ( WaveExctnCGrid (0:p%WaveField%NStepWave2,p%ExctnGridParams%n(2)*p%ExctnGridParams%n(3),p%ExctnGridParams%n(4),6*p%NBody) , STAT=ErrStat2 ) + ALLOCATE ( WaveExctnCGrid (0:p%WaveField%NStepWave2,p%ExctnGridParams%n(2)*p%ExctnGridParams%n(3),p%ExctnGridParams%n(4),p%NDOF) , STAT=ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the WaveExctnCGrid array.', ErrStat, ErrMsg, RoutineName) CALL Cleanup() @@ -1052,7 +1113,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS END IF end if - ALLOCATE ( p%WaveExctnGrid (0:p%WaveField%NStepWave, p%ExctnGridParams%n(2),p%ExctnGridParams%n(3),p%ExctnGridParams%n(4),6*p%NBody) , STAT=ErrStat2 ) + ALLOCATE ( p%WaveExctnGrid (0:p%WaveField%NStepWave, p%ExctnGridParams%n(2),p%ExctnGridParams%n(3),p%ExctnGridParams%n(4),p%NDOF) , STAT=ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat( ErrID_Fatal, 'Error allocating memory for the WaveExctnGrid array.', ErrStat, ErrMsg, RoutineName) CALL Cleanup() @@ -1091,6 +1152,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS HdroExctn(I,J,3) = Fxy*( HdroExctn(I,J,3) ) HdroExctn(I,J,6) = Fxy*( HdroExctn(I,J,6) ) + HdroExctn(I,J,7:p%NDOF) = Fxy*HdroExctn(I,J,7:p%NDOF) end do end do @@ -1101,7 +1163,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS do J = 1, NInpWvDir do I = 1, NInpFreq do iBody = 1, p%NBody - K = 6*(iBody-1) + K = p%BDOFStrt(iBody) - 1_IntKi Ctmp1 = ( HdroExctn(I,J,K+1)*cos(InitInp%PtfmRefztRot(iBody)) ) - ( HdroExctn(I,J,K+2)*sin(InitInp%PtfmRefztRot(iBody)) ) Ctmp2 = ( HdroExctn(I,J,K+1)*sin(InitInp%PtfmRefztRot(iBody)) ) + ( HdroExctn(I,J,K+2)*cos(InitInp%PtfmRefztRot(iBody)) ) Ctmp4 = ( HdroExctn(I,J,K+4)*cos(InitInp%PtfmRefztRot(iBody)) ) - ( HdroExctn(I,J,K+5)*sin(InitInp%PtfmRefztRot(iBody)) ) @@ -1136,19 +1198,14 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ! Compute the discrete Fourier transform of the instantaneous value of the ! total excitation force on the support platfrom from incident waves: - DO J = 1,6*p%NBody ! Loop through all wave excitation forces and moments + DO J = 1,p%NDOF ! Loop through all wave excitation forces and moments TmpCoord(1) = Omega TmpCoord(2) = p%WaveField%WaveDirArr(I) - PRPHdg*R2D dirInRange = GetAngleInRange(TmpCoord(2),HdroWvDir(1),HdroWvDir(NInpWvDir),tmpDir2); TmpCoord(2) = tmpDir2 IF (.NOT. dirInRange) THEN ! Somewhat redundant check. Can be removed in the future. CALL SetErrStat(ErrID_Fatal,' Wave heading out of range.', ErrStat, ErrMsg, RoutineName) END IF - CALL WAMIT_Interp2D_Cplx( TmpCoord, HdroExctn(:,:,J), HdroFreq, HdroWvDir, LastInd2, WaveExctnC(I,iHdg,J), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + CALL WAMIT_Interp2D_Cplx( TmpCoord, HdroExctn(:,:,J), HdroFreq, HdroWvDir, LastInd2, WaveExctnC(I,iHdg,J), ErrStat2, ErrMsg2 ); IF (Failed()) RETURN WaveExctnC(I,iHdg,J) = WaveExctnC(I,iHdg,J) * CMPLX(p%WaveField%WaveElevC0(1,I), p%WaveField%WaveElevC0(2,I)) END DO ! J - All wave excitation forces and moments END DO ! iHdg - All PRP heading @@ -1162,7 +1219,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS RETURN END IF DO iHdg = 1,p%NExctnHdg+1 - DO J = 1,6*p%NBody ! Loop through all wave excitation forces and moments + DO J = 1,p%NDOF ! Loop through all wave excitation forces and moments CALL ApplyFFT_cx ( p%WaveExctnGrid(0:p%WaveField%NStepWave-1,1_IntKi,1_IntKi,iHdg,J), WaveExctnC(:,iHdg,J), FFT_Data, ErrStat2 ) CALL SetErrStat( ErrStat2, ' An error occurred while applying an FFT to WaveExctnC.', ErrStat, ErrMsg, RoutineName) IF ( ErrStat >= AbortErrLev) THEN @@ -1214,19 +1271,14 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ! Compute the discrete Fourier transform of the instantaneous value of the ! total excitation force on the support platfrom from incident waves: - DO J = 1,6*p%NBody ! Loop through all wave excitation forces and moments + DO J = 1,p%NDOF ! Loop through all wave excitation forces and moments TmpCoord(1) = Omega TmpCoord(2) = p%WaveField%WaveDirArr(I) - PRPHdg*R2D dirInRange = GetAngleInRange(TmpCoord(2),HdroWvDir(1),HdroWvDir(NInpWvDir),tmpDir2); TmpCoord(2) = tmpDir2 IF (.NOT. dirInRange) THEN ! Somewhat redundant check. Can be removed in the future. CALL SetErrStat(ErrID_Fatal,' Wave heading out of range.', ErrStat, ErrMsg, RoutineName) END IF - CALL WAMIT_Interp2D_Cplx( TmpCoord, HdroExctn(:,:,J), HdroFreq, HdroWvDir, LastInd2, WaveExctnC(I,iHdg,J), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + CALL WAMIT_Interp2D_Cplx( TmpCoord, HdroExctn(:,:,J), HdroFreq, HdroWvDir, LastInd2, WaveExctnC(I,iHdg,J), ErrStat2, ErrMsg2 ); IF(FAILED()) RETURN do iGrid = 1, p%ExctnGridParams%n(2)*p%ExctnGridParams%n(3) WaveExctnCGrid(I,iGrid,iHdg,J) = WaveExctnC(I,iHdg,J) * CMPLX(p%WaveField%WaveElevC(1,I,iGrid), p%WaveField%WaveElevC(2,I,iGrid)) end do @@ -1248,7 +1300,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS DO iGrid = 1, p%ExctnGridParams%n(2)*p%ExctnGridParams%n(3) iX = mod(iGrid-1, p%ExctnGridParams%n(2)) + 1 ! 1st n index is time iY = (iGrid-1) / p%ExctnGridParams%n(2) + 1 - DO J = 1,6*p%NBody ! Loop through all wave excitation forces and moments + DO J = 1,p%NDOF ! Loop through all wave excitation forces and moments CALL ApplyFFT_cx ( p%WaveExctnGrid(0:p%WaveField%NStepWave-1,iX,iY,iHdg,J), WaveExctnCGrid(:,iGrid,iHdg,J), FFT_Data, ErrStat2 ) CALL SetErrStat( ErrStat2, ' An error occurred while applying an FFT to WaveExctnC.', ErrStat, ErrMsg, RoutineName) IF ( ErrStat >= AbortErrLev) THEN @@ -1280,10 +1332,11 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS iY = (iGrid-1) / p%ExctnGridParams%n(2) + 1 DO J = 0,p%WaveField%NStepWave DO iBdy = 1,p%NBody - call hiFrameTransform(h2i,PRPHdg,p%WaveExctnGrid(J,iX,iY,iHdg,(6*(iBdy-1)+1):(6*(iBdy-1)+3)),tmpVec3,ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - p%WaveExctnGrid(J,iX,iY,iHdg,(6*(iBdy-1)+1):(6*(iBdy-1)+3)) = tmpVec3 - call hiFrameTransform(h2i,PRPHdg,p%WaveExctnGrid(J,iX,iY,iHdg,(6*(iBdy-1)+4):(6*(iBdy-1)+6)),tmpVec3,ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - p%WaveExctnGrid(J,iX,iY,iHdg,(6*(iBdy-1)+4):(6*(iBdy-1)+6)) = tmpVec3 + iDOF = p%BDOFStrt(iBdy)-1_IntKi + call hiFrameTransform(h2i,PRPHdg,p%WaveExctnGrid(J,iX,iY,iHdg,(iDOF+1):(iDOF+3)),tmpVec3,ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + p%WaveExctnGrid(J,iX,iY,iHdg,(iDOF+1):(iDOF+3)) = tmpVec3 + call hiFrameTransform(h2i,PRPHdg,p%WaveExctnGrid(J,iX,iY,iHdg,(iDOF+4):(iDOF+6)),tmpVec3,ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + p%WaveExctnGrid(J,iX,iY,iHdg,(iDOF+4):(iDOF+6)) = tmpVec3 END DO END DO END DO @@ -1365,12 +1418,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS call SS_Exc_Init(SS_Exctn_InitInp, m%SS_Exctn_u, p%SS_Exctn, x%SS_Exctn, xd%SS_Exctn, z%SS_Exctn, OtherState%SS_Exctn, & m%SS_Exctn_y, m%SS_Exctn, Interval_Sub, SS_Exctn_InitOut, ErrStat2, ErrMsg2) - - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call Cleanup() - return - end if + if (Failed()) return end if IF ( (p%ExctnMod>0) .AND. (p%ExctnDisp==2) ) THEN ! Allocate and initialize array for filtered potential-flow body positions @@ -1418,50 +1466,28 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS CALL MOVE_ALLOC( HdroAddMs, Conv_Rdtn_InitInp%HdroAddMs ) CALL MOVE_ALLOC( HdroDmpng, Conv_Rdtn_InitInp%HdroDmpng ) Conv_Rdtn_InitInp%NBody = InitInp%NBody + conv_rdtn_InitInp%NDOF = p%NDOF Conv_Rdtn_InitInp%RdtnTMax = InitInp%RdtnTMax Conv_Rdtn_InitInp%RdtnDT = InitInp%Conv_Rdtn%RdtnDT Conv_Rdtn_InitInp%HighFreq = HighFreq Conv_Rdtn_InitInp%WAMITFile = InitInp%WAMITFile Conv_Rdtn_InitInp%NInpFreq = NInpFreq - - - CALL Conv_Rdtn_Init(Conv_Rdtn_InitInp, m%Conv_Rdtn_u, p%Conv_Rdtn, x%Conv_Rdtn, xd%Conv_Rdtn, z%Conv_Rdtn, OtherState%Conv_Rdtn, & - m%Conv_Rdtn_y, m%Conv_Rdtn, Conv_Rdtn_InitOut, ErrStat2, ErrMsg2) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF - + CALL Conv_Rdtn_Init(Conv_Rdtn_InitInp, m%Conv_Rdtn_u, p%Conv_Rdtn, x%Conv_Rdtn, xd%Conv_Rdtn, z%Conv_Rdtn, OtherState%Conv_Rdtn, & + m%Conv_Rdtn_y, m%Conv_Rdtn, Conv_Rdtn_InitOut, ErrStat2, ErrMsg2); IF (Failed()) RETURN ELSE IF ( InitInp%RdtnMod == 2 ) THEN SS_Rdtn_InitInp%InputFile = InitInp%WAMITFile - call AllocAry(SS_Rdtn_InitInp%enabledDOFs, 6*p%NBody, 'SS_Rdtn_InitInp%enabledDOFs', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + call AllocAry(SS_Rdtn_InitInp%enabledDOFs, 6*p%NBody, 'SS_Rdtn_InitInp%enabledDOFs', ErrStat2, ErrMsg2); if (Failed()) return SS_Rdtn_InitInp%enabledDOFs = 1 ! Set to 1 (True) for all DOFs, meaning each DOF is to be used in the analysis. Interval_Sub = InitInp%Conv_Rdtn%RdtnDT SS_Rdtn_InitInp%NBody = InitInp%NBody - call AllocAry(SS_Rdtn_InitInp%PtfmRefztRot, p%NBody, 'SS_Rdtn_InitInp%PtfmRefztRot', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + call AllocAry(SS_Rdtn_InitInp%PtfmRefztRot, p%NBody, 'SS_Rdtn_InitInp%PtfmRefztRot', ErrStat2, ErrMsg2); if (Failed()) return SS_Rdtn_InitInp%PtfmRefztRot = InitInp%PtfmRefztRot CALL SS_Rad_Init(SS_Rdtn_InitInp, m%SS_Rdtn_u, p%SS_Rdtn, x%SS_Rdtn, xd%SS_Rdtn, z%SS_Rdtn, OtherState%SS_Rdtn, & - m%SS_Rdtn_y, m%SS_Rdtn, Interval_Sub, SS_Rdtn_InitOut, ErrStat2, ErrMsg2) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + m%SS_Rdtn_y, m%SS_Rdtn, Interval_Sub, SS_Rdtn_InitOut, ErrStat2, ErrMsg2); IF (Failed()) RETURN END IF @@ -1503,13 +1529,7 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ,TranslationVel = .TRUE. & ,RotationVel = .TRUE. & ,TranslationAcc = .TRUE. & - ,RotationAcc = .TRUE.) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + ,RotationAcc = .TRUE.); if (Failed()) return do iBody = 1, p%NBody @@ -1518,16 +1538,12 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ! Create the node on the mesh - CALL MeshPositionNode (u%Mesh & , iBody & , (/InitInp%PtfmRefxt(iBody), InitInp%PtfmRefyt(iBody), InitInp%PtfmRefzt(iBody)/) & , ErrStat2 & , ErrMsg2 & - , orientation ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - + , orientation ); if (Failed()) return ! Create the mesh element CALL MeshConstructElement ( u%Mesh & @@ -1535,19 +1551,13 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS , ErrStat2 & , ErrMsg2 & , iBody & - ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ); if (Failed()) return end do CALL MeshCommit ( u%Mesh & - , ErrStat2 & - , ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + , ErrStat2 & + , ErrMsg2 ); if (Failed()) return call MeshCopy ( SrcMesh = u%Mesh & ,DestMesh = y%Mesh & @@ -1556,30 +1566,27 @@ SUBROUTINE WAMIT_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, ErrS ,ErrStat = ErrStat2 & ,ErrMess = ErrMsg2 & ,Force = .TRUE. & - ,Moment = .TRUE. ) - - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( ErrStat >= AbortErrLev ) THEN - CALL Cleanup() - RETURN - END IF + ,Moment = .TRUE. ); if (Failed()) return + u%Mesh%RemapFlag = .TRUE. y%Mesh%RemapFlag = .TRUE. - ! Define initialization-routine output here: - - - - ! initialize misc vars: - m%LastIndWave = 1 + m%LastIndWave = 1 CALL Cleanup() CONTAINS + LOGICAL FUNCTION Failed() + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Failed = ErrStat >= AbortErrLev + IF (Failed) THEN + CALL Cleanup() + END IF + END FUNCTION Failed SUBROUTINE Cleanup() @@ -1700,6 +1707,7 @@ SUBROUTINE WAMIT_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState INTEGER :: I ! Generic loop counter INTEGER :: nTime ! Number of inputs integer(IntKi) :: iBody ! WAMIT body index + integer(IntKi) :: AddDOFCntr ! Counter for additional DOF integer(IntKi) :: indxStart, indxEnd ! Starting and ending indices for the iBody_th sub vector in an NBody long vector @@ -1741,20 +1749,27 @@ SUBROUTINE WAMIT_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState ErrMsg = ' Failed to allocate array Conv_Rdtn_u(I)%Velocity.' RETURN END IF + AddDOFCntr = 0_IntKi do iBody=1,p%NBody - indxStart = (iBody-1)*6+1 - indxEnd = indxStart+5 + indxStart = p%BDOFStrt(iBody) + indxEnd = indxStart+5 call hiFrameTransform( i2h, Inputs(I)%PtfmRefY, Inputs(I)%Mesh%TranslationVel(:,iBody), tmpVec6(1:3), ErrStat, ErrMsg) call hiFrameTransform( i2h, Inputs(I)%PtfmRefY, Inputs(I)%Mesh%RotationVel(:,iBody), tmpVec6(4:6), ErrStat, ErrMsg) Conv_Rdtn_u(I)%Velocity(indxStart:indxEnd) = tmpVec6 + if ( p%NAddDOF(iBody) > 0_IntKi ) then + indxStart = p%BDOFStrt(iBody)+6 + indxEnd = indxStart-1+p%NAddDOF(iBody) + Conv_Rdtn_u(I)%Velocity(indxStart:indxEnd) = Inputs(I)%qAddDOFDot(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + AddDOFCntr = AddDOFCntr + p%NAddDOF(iBody) + end if end do END DO - + CALL Conv_Rdtn_UpdateStates( t, n, Conv_Rdtn_u, InputTimes, p%Conv_Rdtn, x%Conv_Rdtn, xd%Conv_Rdtn, & z%Conv_Rdtn, OtherState%Conv_Rdtn, m%Conv_Rdtn, ErrStat, ErrMsg ) - + DEALLOCATE(Conv_Rdtn_u) - + ELSE IF ( p%RdtnMod == 2 ) THEN ! Update the state-space radiation memory effect sub-module's state ! Allocate array of SS_Rdtn inputs @@ -1877,14 +1892,12 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er ! Local Variables: - !REAL(ReKi) :: F_HS (6) ! Total load contribution from hydrostatics, including the effects of waterplane area and the center of buoyancy (N, N-m) - !REAL(ReKi) :: F_Waves (6) ! Total load contribution from incident waves (i.e., the diffraction problem) (N, N-m) - !REAL(ReKi) :: F_Rdtn (6) ! Total load contribution from wave radiation damping (i.e., the diffraction problem) (N, N-m) - INTEGER(IntKi) :: I,iStart ! Generic index - REAL(ReKi) :: q(6*p%NBody), qdot(6*p%NBody), qdotdot(6*p%NBody) ! kinematics for all WAMIT bodies + INTEGER(IntKi) :: I ! Generic index + REAL(ReKi) :: q(p%NDOF), qdot(p%NDOF), qdotdot(p%NDOF)! kinematics for all WAMIT bodies REAL(ReKi) :: rotdisp(3) ! small angle rotational displacements INTEGER(IntKi) :: iBody ! Counter for WAMIT bodies. If NBodyMod > 1 then NBody = 1, and hence iBody = 1 INTEGER(IntKi) :: indxStart, indxEnd ! Starting and ending indices for the iBody_th sub vector in an NBody long vector + INTEGER(IntKi) :: AddDOFCntr ! Aggregated counter for additional DOF forcing outputs REAL(ReKi) :: bodyPosition(3) ! x-y displaced location of a WAMIT body (relative to REAL(ReKi) :: refBodyPosition(3) REAL(ReKi) :: tmpVec3(3),tmpVec6(6) @@ -1903,12 +1916,7 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er ErrStat = ErrID_None ErrMsg = "" - - - ! Compute outputs here: - - - + ! Compute the load contribution from incident waves (i.e., the diffraction problem): if ( p%ExctnMod == 0 ) then @@ -1916,31 +1924,28 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er else if ( p%ExctnMod == 1 ) then + ! Abort if the wave excitation loads have not been computed yet: + IF ( .NOT. ALLOCATED ( p%WaveExctnGrid ) ) THEN + ErrMsg = ' Routine WAMIT_Init() must be called before routine WAMIT_CalcOutput().' + ErrStat = ErrID_Fatal + RETURN + END IF + if ( p%ExctnDisp == 0 ) then - ! Abort if the wave excitation loads have not been computed yet: - IF ( .NOT. ALLOCATED ( p%WaveExctnGrid ) ) THEN - ErrMsg = ' Routine WAMIT_Init() must be called before routine WAMIT_CalcOutput().' - ErrStat = ErrID_Fatal - RETURN - END IF DO iBody = 1,p%NBody bodyPosition(1) = 0.0 bodyPosition(2) = 0.0 bodyPosition(3) = WrapToPi(u%PtfmRefY) - iStart = (iBody-1)*6+1 + + indxStart = p%BDOFStrt(iBody) + indxEnd = indxStart+5+p%NAddDOF(iBody) ! WaveExctnGrid dimensions are: 1st: wavetime, 2nd: X, 3rd: Y, 4th: PRP yaw offset, 5th: Force component for each WAMIT Body - m%F_Waves1(iStart:iStart+5) = WAMIT_ForceWaves_Interp( Time, bodyPosition, p%WaveExctnGrid(:,:,:,:,iStart:iStart+5), p%ExctnGridParams, m%WaveField_m, ErrStat2, ErrMsg2 ) + m%F_Waves1(indxStart:indxEnd) = WAMIT_ForceWaves_Interp( 6+p%NAddDOF(iBody), Time, bodyPosition, p%WaveExctnGrid(:,:,:,:,indxStart:indxEnd), p%ExctnGridParams, m%WaveField_m, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END DO - else ! p%ExctnDisp > 0 - IF ( .NOT. allocated ( p%WaveExctnGrid ) ) THEN - ErrMsg = ' Routine WAMIT_Init() must be called before routine WAMIT_CalcOutput().' - ErrStat = ErrID_Fatal - RETURN - END IF - ! We are using the displaced x,y location of the WAMIT bodies to determine the Wave Exication force + else ! p%ExctnDisp > 0; we are using the displaced x,y location of the WAMIT bodies to determine the wave exication force DO iBody = 1,p%NBody IF ( p%ExctnDisp == 1 ) THEN @@ -1959,11 +1964,13 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er bodyPosition(1) = bodyPosition(1) - (refBodyPosition(1) - u%Mesh%Position(1,iBody)) bodyPosition(2) = bodyPosition(2) - (refBodyPosition(2) - u%Mesh%Position(2,iBody)) - iStart = (iBody-1)*6+1 + indxStart = p%BDOFStrt(iBody) + indxEnd = indxStart+5+p%NAddDOF(iBody) ! WaveExctnGrid dimensions are: 1st: wavetime, 2nd: X, 3rd: Y, 4th: PRP yaw offset, 5th: Force component for each WAMIT Body - m%F_Waves1(iStart:iStart+5) = WAMIT_ForceWaves_Interp( Time, bodyPosition, p%WaveExctnGrid(:,:,:,:,iStart:iStart+5), p%ExctnGridParams, m%WaveField_m, ErrStat2, ErrMsg2 ) + m%F_Waves1(indxStart:indxEnd) = WAMIT_ForceWaves_Interp( 6+p%NAddDOF(iBody), Time, bodyPosition, p%WaveExctnGrid(:,:,:,:,indxStart:indxEnd), p%ExctnGridParams, m%WaveField_m, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END DO + end if else if ( p%ExctnMod == 2 ) then @@ -1975,7 +1982,7 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er end if - + AddDOFCntr = 0_IntKi do iBody = 1, p%NBody ! Determine the rotational angles from the direction-cosine matrix @@ -2001,10 +2008,10 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er FrstWarn_LrgY = .FALSE. END IF - indxStart = (iBody-1)*6+1 + indxStart = p%BDOFStrt(iBody) indxEnd = indxStart+5 - ! Displacement with Tait-Bryan angles following the Z-Y-X convention + ! Displacement with Tait-Bryan angles following the intrinsic Z-Y-X convention q(indxStart:indxEnd) = reshape((/real(u%Mesh%TranslationDisp(:,iBody),ReKi),rotdisp(:)/),(/6/)) ! Get velocity and acceleration in the heading frame @@ -2014,6 +2021,15 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er call hiFrameTransform( i2h, u%PtfmRefY, u%Mesh%TranslationAcc(:,iBody), tmpVec6(1:3), ErrStat2, ErrMsg2) call hiFrameTransform( i2h, u%PtfmRefY, u%Mesh%RotationAcc(:,iBody), tmpVec6(4:6), ErrStat2, ErrMsg2) qdotdot(indxStart:indxEnd) = tmpVec6 + + if ( p%NAddDOF(iBody) > 0_IntKi ) then + indxStart = p%BDOFStrt(iBody) + 6 + indxEnd = indxStart - 1 + p%NAddDOF(iBody) + q (indxStart:indxEnd) = u%qAddDOF (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + qdot (indxStart:indxEnd) = u%qAddDOFDot (AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + qdotdot(indxStart:indxEnd) = u%qAddDOFDotDot(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + AddDOFCntr = AddDOFCntr + p%NAddDOF(iBody) + end if end do @@ -2022,24 +2038,31 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er ! m%F_HS = -matmul(p%HdroSttc,q) m%F_HS = 0. do iBody = 1, p%NBody - indxStart = (iBody-1)*6+1 - indxEnd = indxStart+5 + indxStart = p%BDOFStrt(iBody) + indxEnd = p%BDOFStrt(iBody)+5 m%F_HS((indxStart+2):(indxEnd-1)) = -matmul(p%HdroSttc((indxStart+2):(indxEnd-1),(indxStart+2):(indxEnd-1)),& q((indxStart+2):(indxEnd-1))) + if ( p%NAddDOF(iBody) > 0_IntKi ) then + m%F_HS((indxEnd+1):(indxEnd+p%NAddDOF(iBody))) = -matmul(p%HdroSttc((indxEnd+1):(indxEnd+p%NAddDOF(iBody)),(indxStart+2):(indxEnd-1)), & + q((indxStart+2):(indxEnd-1))) + m%F_HS(indxStart:indxEnd+p%NAddDOF(iBody)) = m%F_HS(indxStart:indxEnd+p%NAddDOF(iBody)) & + -matmul(p%HdroSttc(indxStart:indxEnd+p%NAddDOF(iBody),(indxEnd+1):(indxEnd+p%NAddDOF(iBody))), & + q((indxEnd+1):(indxEnd+p%NAddDOF(iBody)))) + end if m%F_HS(indxStart:indxEnd) = m%F_HS(indxStart:indxEnd) + p%F_HS_Moment_Offset(:,iBody) end do ! Transform hydrostatic loads back to the inertial frame do iBody = 1, p%NBody - indxStart = (iBody-1)*6+1 + indxStart = p%BDOFStrt(iBody) indxEnd = indxStart+2 ! call hiFrameTransform( h2i, u%PtfmRefY, m%F_HS(indxStart:indxEnd), tmpVec3, ErrStat2, ErrMsg2 ) - call hiFrameTransform( h2i, q(iBody*6), m%F_HS(indxStart:indxEnd), tmpVec3, ErrStat2, ErrMsg2 ) + call hiFrameTransform( h2i, q(p%BDOFStrt(iBody)+5), m%F_HS(indxStart:indxEnd), tmpVec3, ErrStat2, ErrMsg2 ) m%F_HS(indxStart:indxEnd) = tmpVec3 indxStart = indxEnd+1 indxEnd = indxStart+2 ! call hiFrameTransform( h2i, u%PtfmRefY, m%F_HS(indxStart:indxEnd), tmpVec3, ErrStat2, ErrMsg2 ) - call hiFrameTransform( h2i, q(iBody*6), m%F_HS(indxStart:indxEnd), tmpVec3, ErrStat2, ErrMsg2 ) + call hiFrameTransform( h2i, q(p%BDOFStrt(iBody)+5), m%F_HS(indxStart:indxEnd), tmpVec3, ErrStat2, ErrMsg2 ) m%F_HS(indxStart:indxEnd) = tmpVec3 end do @@ -2052,7 +2075,7 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er CALL Conv_Rdtn_CalcOutput( Time, m%Conv_Rdtn_u, p%Conv_Rdtn, x%Conv_Rdtn, xd%Conv_Rdtn, & z%Conv_Rdtn, OtherState%Conv_Rdtn, m%Conv_Rdtn_y, m%Conv_Rdtn, ErrStat2, ErrMsg2 ) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - m%F_Rdtn (:) = m%Conv_Rdtn_y%F_Rdtn + m%F_Rdtn (:) = m%Conv_Rdtn_y%F_Rdtn ELSE IF ( p%RdtnMod == 2 ) THEN m%SS_Rdtn_u%dq = qdot @@ -2069,7 +2092,7 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er END IF do iBody = 1, p%NBody - indxStart = (iBody-1)*6+1 + indxStart = p%BDOFStrt(iBody) indxEnd = indxStart+2 call hiFrameTransform( h2i, u%PtfmRefY, m%F_Rdtn(indxStart:indxEnd), tmpVec3, ErrStat2, ErrMsg2 ) m%F_Rdtn(indxStart:indxEnd) = tmpVec3 @@ -2090,7 +2113,7 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er m%F_PtfmAM = -matmul(p%HdroAdMsI, qdotdot) ! In h-frame do iBody = 1, p%NBody - indxStart = (iBody-1)*6+1 + indxStart = p%BDOFStrt(iBody) indxEnd = indxStart+2 call hiFrameTransform( h2i, u%PtfmRefY, m%F_PtfmAM(indxStart:indxEnd), tmpVec3, ErrStat2, ErrMsg2 ) m%F_PtfmAM(indxStart:indxEnd) = tmpVec3 @@ -2102,15 +2125,21 @@ SUBROUTINE WAMIT_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er end do ! Compute outputs here: + AddDOFCntr = 0_IntKi do iBody = 1, p%NBody - indxStart = (iBody-1)*6 - + indxStart = p%BDOFStrt(iBody) - 1_IntKi DO I=1,3 y%Mesh%Force(I,iBody) = m%F_PtfmAM(indxStart+I) + m%F_Rdtn(indxStart+I) + m%F_Waves1(indxStart+I) + m%F_HS(indxStart+I) END DO DO I=1,3 y%Mesh%Moment(I,iBody) = m%F_PtfmAM(indxStart+I+3) + m%F_Rdtn(indxStart+I+3) + m%F_Waves1(indxStart+I+3) + m%F_HS(indxStart+I+3) END DO + IF (p%NAddDOF(iBody) > 0_IntKi) THEN + indxStart = p%BDOFStrt(iBody) + 6_IntKi + indxEnd = p%BDOFStrt(iBody) + 5_IntKi + p%NAddDOF(iBody) + y%FAddDOF(AddDOFCntr+1_IntKi:AddDOFCntr+p%NAddDOF(iBody)) = m%F_PtfmAM(indxStart:indxEnd) + m%F_Rdtn(indxStart:indxEnd) + m%F_Waves1(indxStart:indxEnd) + m%F_HS(indxStart:indxEnd) + AddDOFCntr = AddDOFCntr + p%NAddDOF(iBody) + END IF end do @@ -2188,7 +2217,7 @@ SUBROUTINE WAMIT_UpdateDiscState( Time, n, u, p, x, xd, z, OtherState, m, ErrSta integer(IntKi) :: iBody ! WAMIT body index integer(IntKi) :: indxStart, indxEnd ! Starting and ending indices for the iBody_th sub vector in an NBody long vector - + integer(IntKi) :: AddDOFCntr ! Counter for additional DOF REAL(ReKi) :: tmpVec6(6) ! Initialize ErrStat @@ -2198,13 +2227,20 @@ SUBROUTINE WAMIT_UpdateDiscState( Time, n, u, p, x, xd, z, OtherState, m, ErrSta ! Update discrete states here: - IF ( p%RdtnMod == 1 ) THEN ! .TRUE. when we will be modeling wave radiation damping. + IF ( p%RdtnMod == 1 ) THEN ! .TRUE. when we will be modeling wave radiation damping. + AddDOFCntr = 0_IntKi do iBody=1,p%NBody - indxStart = (iBody-1)*6+1 + indxStart = p%BDOFStrt(iBody) indxEnd = indxStart+5 call hiFrameTransform( i2h, u%PtfmRefY, u%Mesh%TranslationVel(:,iBody), tmpVec6(1:3), ErrStat, ErrMsg) call hiFrameTransform( i2h, u%PtfmRefY, u%Mesh%RotationVel(:,iBody), tmpVec6(4:6), ErrStat, ErrMsg) m%Conv_Rdtn_u%Velocity(indxStart:indxEnd) = tmpVec6 + if ( p%NAddDOF(iBody) > 0_IntKi ) then + indxStart = p%BDOFStrt(iBody)+6 + indxEnd = indxStart-1+p%NAddDOF(iBody) + m%Conv_Rdtn_u%Velocity(indxStart:indxEnd) = u%qAddDOFDot(AddDOFCntr+1:AddDOFCntr+p%NAddDOF(iBody)) + AddDOFCntr = AddDOFCntr + p%NAddDOF(iBody) + end if end do CALL Conv_Rdtn_UpdateDiscState( Time, n, m%Conv_Rdtn_u, p%Conv_Rdtn, x%Conv_Rdtn, xd%Conv_Rdtn, z%Conv_Rdtn, & OtherState%Conv_Rdtn, m%Conv_Rdtn, ErrStat, ErrMsg ) diff --git a/modules/hydrodyn/src/WAMIT.txt b/modules/hydrodyn/src/WAMIT.txt index f826ab565a..13bb2e67f1 100644 --- a/modules/hydrodyn/src/WAMIT.txt +++ b/modules/hydrodyn/src/WAMIT.txt @@ -31,6 +31,7 @@ typedef ^ ^ ReKi typedef ^ ^ R8Ki PtfmRefztRot {:} - - "The rotation about zt of the body reference frame(s) from xt/yt" radians typedef ^ ^ ReKi PtfmCOBxt {:} - - "" - typedef ^ ^ ReKi PtfmCOByt {:} - - "" - +typedef ^ ^ INTEGER NAddDOF {:} - - "Number of additional generalized degrees of freedom" - typedef ^ ^ INTEGER RdtnMod - - - "" - typedef ^ ^ INTEGER ExctnMod - - - "" - typedef ^ ^ INTEGER ExctnDisp - - - "0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0]" - @@ -104,6 +105,10 @@ typedef ^ ^ GridInterp_ # typedef ^ ParameterType INTEGER NBody - - - "[>=1; only used when PotMod=1. If NBodyMod=1, the WAMIT data contains a vector of size 6*NBody x 1 and matrices of size 6*NBody x 6*NBody; if NBodyMod>1, there are NBody sets of WAMIT data each with a vector of size 6 x 1 and matrices of size 6 x 6]" - typedef ^ ^ INTEGER NBodyMod - - - "Body coupling model {1: include coupling terms between each body and NBody in HydroDyn equals NBODY in WAMIT, 2: neglect coupling terms between each body and NBODY=1 with XBODY=0 in WAMIT, 3: Neglect coupling terms between each body and NBODY=1 with XBODY=/0 in WAMIT} (switch) [only used when PotMod=1]" - +typedef ^ ^ LOGICAL HasAddDOF - - - ".TRUE. if additional generalized DOF are present, .FALSE. otherwise" - +typedef ^ ^ INTEGER NAddDOF {:} - - "Number of additional generalized degrees of freedom" - +typedef ^ ^ INTEGER NDOF - - - "Total number of degrees of freedom" - +typedef ^ ^ INTEGER BDOFStrt {:} - - "Starting DOF index for each body" - typedef ^ ^ ReKi F_HS_Moment_Offset {:}{:} - - "The offset moment due to the COB being offset from the WAMIT body's local location {matrix 3xNBody}" N-m typedef ^ ^ SiKi HdroAdMsI {:}{:} - - "" (sec) typedef ^ ^ SiKi HdroSttc {:}{:} - - "" - @@ -127,10 +132,14 @@ typedef ^ ^ GridInterp_ # ..... Inputs .................................................................................................................... # Define inputs that are contained on the mesh here: # -typedef ^ InputType MeshType Mesh - - - "Displacements at the WAMIT reference point in the inertial frame" - -typedef ^ ^ ReKi PtfmRefY - - - "Reference yaw offset" (rad) +typedef ^ InputType MeshType Mesh - - - "Displacements at the WAMIT reference point in the inertial frame" - +typedef ^ ^ ReKi PtfmRefY - - - "Reference yaw offset" (rad) +typedef ^ ^ ReKi qAddDOF {:} - - "Displacement of generalized DOF" - +typedef ^ ^ ReKi qAddDOFDot {:} - - "Velocity of generalized DOF" - +typedef ^ ^ ReKi qAddDOFDotDot {:} - - "Acceleration of generalized DOF" - # # # ..... Outputs ................................................................................................................... # Define outputs that are contained on the mesh here: -typedef ^ OutputType MeshType Mesh - - - "Loads at the WAMIT reference point in the inertial frame" - +typedef ^ OutputType MeshType Mesh - - - "Loads at the WAMIT reference point in the inertial frame" - +typedef ^ ^ ReKi FAddDOF {:} - - "Additional generalized DOF forcing " - diff --git a/modules/hydrodyn/src/WAMIT2_Types.f90 b/modules/hydrodyn/src/WAMIT2_Types.f90 index ba8b8c4490..8cc965695e 100644 --- a/modules/hydrodyn/src/WAMIT2_Types.f90 +++ b/modules/hydrodyn/src/WAMIT2_Types.f90 @@ -34,7 +34,7 @@ MODULE WAMIT2_Types USE SeaSt_WaveField_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: MaxWAMIT2Outputs = 6 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MaxWAMIT2Outputs = 6 ! [-] ! ========= WAMIT2_InitInputType ======= TYPE, PUBLIC :: WAMIT2_InitInputType LOGICAL :: HasWAMIT = .false. !< .TRUE. if using WAMIT model, .FALSE. otherwise [-] @@ -91,7 +91,9 @@ MODULE WAMIT2_Types TYPE(MeshType) :: Mesh !< Loads at the platform reference point in the inertial frame [-] END TYPE WAMIT2_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: WAMIT2_y_Mesh = 1 ! WAMIT2%Mesh + +contains subroutine WAMIT2_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(WAMIT2_InitInputType), intent(in) :: SrcInitInputData @@ -673,5 +675,75 @@ SUBROUTINE WAMIT2_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, CALL MeshExtrapInterp2(y1%Mesh, y2%Mesh, y3%Mesh, tin, y_out%Mesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE + +function WAMIT2_OutputMeshPointer(y, DL) result(Mesh) + type(WAMIT2_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (WAMIT2_y_Mesh) + Mesh => y%Mesh + end select +end function + +subroutine WAMIT2_VarsPackOutput(Vars, y, ValAry) + type(WAMIT2_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call WAMIT2_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine WAMIT2_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(WAMIT2_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WAMIT2_y_Mesh) + call MV_PackMesh(V, y%Mesh, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine WAMIT2_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(WAMIT2_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call WAMIT2_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine WAMIT2_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(WAMIT2_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WAMIT2_y_Mesh) + call MV_UnpackMesh(V, ValAry, y%Mesh) ! Mesh + end select + end associate +end subroutine + +function WAMIT2_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (WAMIT2_y_Mesh) + Name = "y%Mesh" + case default + Name = "Unknown Field" + end select +end function + END MODULE WAMIT2_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/hydrodyn/src/WAMIT_Interp.f90 b/modules/hydrodyn/src/WAMIT_Interp.f90 index a41191bcf4..157aa9dc91 100644 --- a/modules/hydrodyn/src/WAMIT_Interp.f90 +++ b/modules/hydrodyn/src/WAMIT_Interp.f90 @@ -30,7 +30,7 @@ MODULE WAMIT_Interp USE NWTC_Library use GridInterp_Types, only: GridInterp_ParameterType, GridInterp_MiscVarType - use GridInterp, only: GridInterpSetup3D, GridInterpSetup4D, GridInterp3DVec6, GridInterp4DVec6 + use GridInterp, only: GridInterpSetup3D, GridInterpSetup4D, GridInterp3DVec6, GridInterp4DVec6, GridInterp4DVecN IMPLICIT NONE @@ -48,6 +48,7 @@ MODULE WAMIT_Interp interface WAMIT_ForceWaves_Interp module procedure WAMIT_ForceWaves_Interp_3D_vec6 module procedure WAMIT_ForceWaves_Interp_4D_vec6 + module procedure WAMIT_ForceWaves_Interp_4D_vecN end interface CONTAINS @@ -687,5 +688,26 @@ function WAMIT_ForceWaves_Interp_4D_vec6(Time, pos, pKinXX, WF_p, WF_m, ErrStat3 end function +!> retrieve indices from the WaveField info, and do interpolation for this point. This is for interpolating on 4D +!! NOTE: the WAMIT field passed in here through pKinXX is based on WaveField sizing, which is why we can do this. +function WAMIT_ForceWaves_Interp_4D_vecN(N, Time, pos, pKinXX, WF_p, WF_m, ErrStat3, ErrMsg3) + integer(IntKi), intent(in ) :: N + real(DbKi), intent(in ) :: Time + real(ReKi), intent(in ) :: pos(3) !< position + real(SiKi), intent(in ) :: pKinXX(0:,:,:,:,:) !< 4D Wave excitation data (SiKi for storage space reasons) + type(GridInterp_ParameterType), intent(in ) :: WF_p !< wavefield parameters + type(GridInterp_MiscVarType), intent(inout) :: WF_m !< wavefield misc/optimization variables + integer(IntKi), intent( out) :: ErrStat3 + character(*), intent( out) :: ErrMsg3 + + real(SiKi) :: WAMIT_ForceWaves_Interp_4D_vecN(N) + + ! get the bounding indices from the WaveField info (same indexing used in WAMIT) + call GridInterpSetup4D( (/Real(Time,ReKi),pos(1),pos(2),pos(3)/), WF_p, WF_m, ErrStat3, ErrMsg3 ) + WAMIT_ForceWaves_Interp_4D_vecN = GridInterp4DVecN( N, pKinXX, WF_m ) + +end function + + !---------------------------------------------------------------------------------------------------------------------------------- END MODULE WAMIT_Interp diff --git a/modules/hydrodyn/src/WAMIT_Types.f90 b/modules/hydrodyn/src/WAMIT_Types.f90 index f74679ba14..7d850c9599 100644 --- a/modules/hydrodyn/src/WAMIT_Types.f90 +++ b/modules/hydrodyn/src/WAMIT_Types.f90 @@ -50,6 +50,7 @@ MODULE WAMIT_Types REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: PtfmRefztRot !< The rotation about zt of the body reference frame(s) from xt/yt [radians] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PtfmCOBxt !< [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PtfmCOByt !< [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: NAddDOF !< Number of additional generalized degrees of freedom [-] INTEGER(IntKi) :: RdtnMod = 0_IntKi !< [-] INTEGER(IntKi) :: ExctnMod = 0_IntKi !< [-] INTEGER(IntKi) :: ExctnDisp = 0_IntKi !< 0: use undisplaced position, 1: use displaced position, 2: use low-pass filtered displaced position) [only used when PotMod=1 and ExctnMod>0] [-] @@ -116,6 +117,10 @@ MODULE WAMIT_Types TYPE, PUBLIC :: WAMIT_ParameterType INTEGER(IntKi) :: NBody = 0_IntKi !< [>=1; only used when PotMod=1. If NBodyMod=1, the WAMIT data contains a vector of size 6*NBody x 1 and matrices of size 6*NBody x 6*NBody; if NBodyMod>1, there are NBody sets of WAMIT data each with a vector of size 6 x 1 and matrices of size 6 x 6] [-] INTEGER(IntKi) :: NBodyMod = 0_IntKi !< Body coupling model {1: include coupling terms between each body and NBody in HydroDyn equals NBODY in WAMIT, 2: neglect coupling terms between each body and NBODY=1 with XBODY=0 in WAMIT, 3: Neglect coupling terms between each body and NBODY=1 with XBODY=/0 in WAMIT} (switch) [only used when PotMod=1] [-] + LOGICAL :: HasAddDOF = .false. !< .TRUE. if additional generalized DOF are present, .FALSE. otherwise [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: NAddDOF !< Number of additional generalized degrees of freedom [-] + INTEGER(IntKi) :: NDOF = 0_IntKi !< Total number of degrees of freedom [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BDOFStrt !< Starting DOF index for each body [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: F_HS_Moment_Offset !< The offset moment due to the COB being offset from the WAMIT body's local location {matrix 3xNBody} [N-m] REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: HdroAdMsI !< [(sec)] REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: HdroSttc !< [-] @@ -140,14 +145,29 @@ MODULE WAMIT_Types TYPE, PUBLIC :: WAMIT_InputType TYPE(MeshType) :: Mesh !< Displacements at the WAMIT reference point in the inertial frame [-] REAL(ReKi) :: PtfmRefY = 0.0_ReKi !< Reference yaw offset [(rad)] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qAddDOF !< Displacement of generalized DOF [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qAddDOFDot !< Velocity of generalized DOF [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qAddDOFDotDot !< Acceleration of generalized DOF [-] END TYPE WAMIT_InputType ! ======================= ! ========= WAMIT_OutputType ======= TYPE, PUBLIC :: WAMIT_OutputType TYPE(MeshType) :: Mesh !< Loads at the WAMIT reference point in the inertial frame [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FAddDOF !< Additional generalized DOF forcing [-] END TYPE WAMIT_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: WAMIT_x_SS_Rdtn_x = 1 ! WAMIT%SS_Rdtn%x + integer(IntKi), public, parameter :: WAMIT_x_SS_Exctn_x = 2 ! WAMIT%SS_Exctn%x + integer(IntKi), public, parameter :: WAMIT_x_Conv_Rdtn_DummyContState = 3 ! WAMIT%Conv_Rdtn%DummyContState + integer(IntKi), public, parameter :: WAMIT_u_Mesh = 4 ! WAMIT%Mesh + integer(IntKi), public, parameter :: WAMIT_u_PtfmRefY = 5 ! WAMIT%PtfmRefY + integer(IntKi), public, parameter :: WAMIT_u_qAddDOF = 6 ! WAMIT%qAddDOF + integer(IntKi), public, parameter :: WAMIT_u_qAddDOFDot = 7 ! WAMIT%qAddDOFDot + integer(IntKi), public, parameter :: WAMIT_u_qAddDOFDotDot = 8 ! WAMIT%qAddDOFDotDot + integer(IntKi), public, parameter :: WAMIT_y_Mesh = 9 ! WAMIT%Mesh + integer(IntKi), public, parameter :: WAMIT_y_FAddDOF = 10 ! WAMIT%FAddDOF + +contains subroutine WAMIT_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(WAMIT_InitInputType), intent(in) :: SrcInitInputData @@ -250,6 +270,18 @@ subroutine WAMIT_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, Err end if DstInitInputData%PtfmCOByt = SrcInitInputData%PtfmCOByt end if + if (allocated(SrcInitInputData%NAddDOF)) then + LB(1:1) = lbound(SrcInitInputData%NAddDOF) + UB(1:1) = ubound(SrcInitInputData%NAddDOF) + if (.not. allocated(DstInitInputData%NAddDOF)) then + allocate(DstInitInputData%NAddDOF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%NAddDOF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInitInputData%NAddDOF = SrcInitInputData%NAddDOF + end if DstInitInputData%RdtnMod = SrcInitInputData%RdtnMod DstInitInputData%ExctnMod = SrcInitInputData%ExctnMod DstInitInputData%ExctnDisp = SrcInitInputData%ExctnDisp @@ -296,6 +328,9 @@ subroutine WAMIT_DestroyInitInput(InitInputData, ErrStat, ErrMsg) if (allocated(InitInputData%PtfmCOByt)) then deallocate(InitInputData%PtfmCOByt) end if + if (allocated(InitInputData%NAddDOF)) then + deallocate(InitInputData%NAddDOF) + end if call Conv_Rdtn_DestroyInitInput(InitInputData%Conv_Rdtn, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) nullify(InitInputData%WaveField) @@ -319,6 +354,7 @@ subroutine WAMIT_PackInitInput(RF, Indata) call RegPackAlloc(RF, InData%PtfmRefztRot) call RegPackAlloc(RF, InData%PtfmCOBxt) call RegPackAlloc(RF, InData%PtfmCOByt) + call RegPackAlloc(RF, InData%NAddDOF) call RegPack(RF, InData%RdtnMod) call RegPack(RF, InData%ExctnMod) call RegPack(RF, InData%ExctnDisp) @@ -362,6 +398,7 @@ subroutine WAMIT_UnPackInitInput(RF, OutData) call RegUnpackAlloc(RF, OutData%PtfmRefztRot); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%PtfmCOBxt); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%PtfmCOByt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NAddDOF); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RdtnMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%ExctnMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%ExctnDisp); if (RegCheckErr(RF, RoutineName)) return @@ -852,6 +889,32 @@ subroutine WAMIT_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg ErrMsg = '' DstParamData%NBody = SrcParamData%NBody DstParamData%NBodyMod = SrcParamData%NBodyMod + DstParamData%HasAddDOF = SrcParamData%HasAddDOF + if (allocated(SrcParamData%NAddDOF)) then + LB(1:1) = lbound(SrcParamData%NAddDOF) + UB(1:1) = ubound(SrcParamData%NAddDOF) + if (.not. allocated(DstParamData%NAddDOF)) then + allocate(DstParamData%NAddDOF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NAddDOF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%NAddDOF = SrcParamData%NAddDOF + end if + DstParamData%NDOF = SrcParamData%NDOF + if (allocated(SrcParamData%BDOFStrt)) then + LB(1:1) = lbound(SrcParamData%BDOFStrt) + UB(1:1) = ubound(SrcParamData%BDOFStrt) + if (.not. allocated(DstParamData%BDOFStrt)) then + allocate(DstParamData%BDOFStrt(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BDOFStrt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%BDOFStrt = SrcParamData%BDOFStrt + end if if (allocated(SrcParamData%F_HS_Moment_Offset)) then LB(1:2) = lbound(SrcParamData%F_HS_Moment_Offset) UB(1:2) = ubound(SrcParamData%F_HS_Moment_Offset) @@ -944,6 +1007,12 @@ subroutine WAMIT_DestroyParam(ParamData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'WAMIT_DestroyParam' ErrStat = ErrID_None ErrMsg = '' + if (allocated(ParamData%NAddDOF)) then + deallocate(ParamData%NAddDOF) + end if + if (allocated(ParamData%BDOFStrt)) then + deallocate(ParamData%BDOFStrt) + end if if (allocated(ParamData%F_HS_Moment_Offset)) then deallocate(ParamData%F_HS_Moment_Offset) end if @@ -978,6 +1047,10 @@ subroutine WAMIT_PackParam(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%NBody) call RegPack(RF, InData%NBodyMod) + call RegPack(RF, InData%HasAddDOF) + call RegPackAlloc(RF, InData%NAddDOF) + call RegPack(RF, InData%NDOF) + call RegPackAlloc(RF, InData%BDOFStrt) call RegPackAlloc(RF, InData%F_HS_Moment_Offset) call RegPackAlloc(RF, InData%HdroAdMsI) call RegPackAlloc(RF, InData%HdroSttc) @@ -1017,6 +1090,10 @@ subroutine WAMIT_UnPackParam(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%NBody); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NBodyMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HasAddDOF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NAddDOF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NDOF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BDOFStrt); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%F_HS_Moment_Offset); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%HdroAdMsI); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%HdroSttc); if (RegCheckErr(RF, RoutineName)) return @@ -1060,6 +1137,7 @@ subroutine WAMIT_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'WAMIT_CopyInput' @@ -1069,6 +1147,42 @@ subroutine WAMIT_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return DstInputData%PtfmRefY = SrcInputData%PtfmRefY + if (allocated(SrcInputData%qAddDOF)) then + LB(1:1) = lbound(SrcInputData%qAddDOF) + UB(1:1) = ubound(SrcInputData%qAddDOF) + if (.not. allocated(DstInputData%qAddDOF)) then + allocate(DstInputData%qAddDOF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%qAddDOF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputData%qAddDOF = SrcInputData%qAddDOF + end if + if (allocated(SrcInputData%qAddDOFDot)) then + LB(1:1) = lbound(SrcInputData%qAddDOFDot) + UB(1:1) = ubound(SrcInputData%qAddDOFDot) + if (.not. allocated(DstInputData%qAddDOFDot)) then + allocate(DstInputData%qAddDOFDot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%qAddDOFDot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputData%qAddDOFDot = SrcInputData%qAddDOFDot + end if + if (allocated(SrcInputData%qAddDOFDotDot)) then + LB(1:1) = lbound(SrcInputData%qAddDOFDotDot) + UB(1:1) = ubound(SrcInputData%qAddDOFDotDot) + if (.not. allocated(DstInputData%qAddDOFDotDot)) then + allocate(DstInputData%qAddDOFDotDot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%qAddDOFDotDot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputData%qAddDOFDotDot = SrcInputData%qAddDOFDotDot + end if end subroutine subroutine WAMIT_DestroyInput(InputData, ErrStat, ErrMsg) @@ -1082,6 +1196,15 @@ subroutine WAMIT_DestroyInput(InputData, ErrStat, ErrMsg) ErrMsg = '' call MeshDestroy( InputData%Mesh, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InputData%qAddDOF)) then + deallocate(InputData%qAddDOF) + end if + if (allocated(InputData%qAddDOFDot)) then + deallocate(InputData%qAddDOFDot) + end if + if (allocated(InputData%qAddDOFDotDot)) then + deallocate(InputData%qAddDOFDotDot) + end if end subroutine subroutine WAMIT_PackInput(RF, Indata) @@ -1091,6 +1214,9 @@ subroutine WAMIT_PackInput(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call MeshPack(RF, InData%Mesh) call RegPack(RF, InData%PtfmRefY) + call RegPackAlloc(RF, InData%qAddDOF) + call RegPackAlloc(RF, InData%qAddDOFDot) + call RegPackAlloc(RF, InData%qAddDOFDotDot) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1098,9 +1224,15 @@ subroutine WAMIT_UnPackInput(RF, OutData) type(RegFile), intent(inout) :: RF type(WAMIT_InputType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'WAMIT_UnPackInput' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call MeshUnpack(RF, OutData%Mesh) ! Mesh call RegUnpack(RF, OutData%PtfmRefY); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qAddDOF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qAddDOFDot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qAddDOFDotDot); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine WAMIT_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) @@ -1109,6 +1241,7 @@ subroutine WAMIT_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, Err integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'WAMIT_CopyOutput' @@ -1117,6 +1250,18 @@ subroutine WAMIT_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, Err call MeshCopy(SrcOutputData%Mesh, DstOutputData%Mesh, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + if (allocated(SrcOutputData%FAddDOF)) then + LB(1:1) = lbound(SrcOutputData%FAddDOF) + UB(1:1) = ubound(SrcOutputData%FAddDOF) + if (.not. allocated(DstOutputData%FAddDOF)) then + allocate(DstOutputData%FAddDOF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%FAddDOF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%FAddDOF = SrcOutputData%FAddDOF + end if end subroutine subroutine WAMIT_DestroyOutput(OutputData, ErrStat, ErrMsg) @@ -1130,6 +1275,9 @@ subroutine WAMIT_DestroyOutput(OutputData, ErrStat, ErrMsg) ErrMsg = '' call MeshDestroy( OutputData%Mesh, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(OutputData%FAddDOF)) then + deallocate(OutputData%FAddDOF) + end if end subroutine subroutine WAMIT_PackOutput(RF, Indata) @@ -1138,6 +1286,7 @@ subroutine WAMIT_PackOutput(RF, Indata) character(*), parameter :: RoutineName = 'WAMIT_PackOutput' if (RF%ErrStat >= AbortErrLev) return call MeshPack(RF, InData%Mesh) + call RegPackAlloc(RF, InData%FAddDOF) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1145,8 +1294,12 @@ subroutine WAMIT_UnPackOutput(RF, OutData) type(RegFile), intent(inout) :: RF type(WAMIT_OutputType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'WAMIT_UnPackOutput' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call MeshUnpack(RF, OutData%Mesh) ! Mesh + call RegUnpackAlloc(RF, OutData%FAddDOF); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine WAMIT_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -1227,6 +1380,8 @@ SUBROUTINE WAMIT_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMs REAL(DbKi) :: a1, a2 ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' @@ -1247,6 +1402,15 @@ SUBROUTINE WAMIT_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMs CALL MeshExtrapInterp1(u1%Mesh, u2%Mesh, tin, u_out%Mesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) u_out%PtfmRefY = a1*u1%PtfmRefY + a2*u2%PtfmRefY + IF (ALLOCATED(u_out%qAddDOF) .AND. ALLOCATED(u1%qAddDOF)) THEN + u_out%qAddDOF = a1*u1%qAddDOF + a2*u2%qAddDOF + END IF ! check if allocated + IF (ALLOCATED(u_out%qAddDOFDot) .AND. ALLOCATED(u1%qAddDOFDot)) THEN + u_out%qAddDOFDot = a1*u1%qAddDOFDot + a2*u2%qAddDOFDot + END IF ! check if allocated + IF (ALLOCATED(u_out%qAddDOFDotDot) .AND. ALLOCATED(u1%qAddDOFDotDot)) THEN + u_out%qAddDOFDotDot = a1*u1%qAddDOFDotDot + a2*u2%qAddDOFDotDot + END IF ! check if allocated END SUBROUTINE SUBROUTINE WAMIT_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) @@ -1279,6 +1443,8 @@ SUBROUTINE WAMIT_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, E INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors CHARACTER(*), PARAMETER :: RoutineName = 'WAMIT_Input_ExtrapInterp2' + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' @@ -1305,6 +1471,15 @@ SUBROUTINE WAMIT_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, E CALL MeshExtrapInterp2(u1%Mesh, u2%Mesh, u3%Mesh, tin, u_out%Mesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) u_out%PtfmRefY = a1*u1%PtfmRefY + a2*u2%PtfmRefY + a3*u3%PtfmRefY + IF (ALLOCATED(u_out%qAddDOF) .AND. ALLOCATED(u1%qAddDOF)) THEN + u_out%qAddDOF = a1*u1%qAddDOF + a2*u2%qAddDOF + a3*u3%qAddDOF + END IF ! check if allocated + IF (ALLOCATED(u_out%qAddDOFDot) .AND. ALLOCATED(u1%qAddDOFDot)) THEN + u_out%qAddDOFDot = a1*u1%qAddDOFDot + a2*u2%qAddDOFDot + a3*u3%qAddDOFDot + END IF ! check if allocated + IF (ALLOCATED(u_out%qAddDOFDotDot) .AND. ALLOCATED(u1%qAddDOFDotDot)) THEN + u_out%qAddDOFDotDot = a1*u1%qAddDOFDotDot + a2*u2%qAddDOFDotDot + a3*u3%qAddDOFDotDot + END IF ! check if allocated END SUBROUTINE subroutine WAMIT_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg) @@ -1385,6 +1560,8 @@ SUBROUTINE WAMIT_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrM REAL(DbKi) :: a1, a2 ! temporary for extrapolation/interpolation INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' @@ -1404,6 +1581,9 @@ SUBROUTINE WAMIT_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrM CALL MeshExtrapInterp1(y1%Mesh, y2%Mesh, tin, y_out%Mesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(y_out%FAddDOF) .AND. ALLOCATED(y1%FAddDOF)) THEN + y_out%FAddDOF = a1*y1%FAddDOF + a2*y2%FAddDOF + END IF ! check if allocated END SUBROUTINE SUBROUTINE WAMIT_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) @@ -1436,6 +1616,8 @@ SUBROUTINE WAMIT_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, INTEGER(IntKi) :: ErrStat2 ! local errors CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors CHARACTER(*), PARAMETER :: RoutineName = 'WAMIT_Output_ExtrapInterp2' + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' @@ -1461,6 +1643,274 @@ SUBROUTINE WAMIT_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, a3 = (t_out - t(1))*(t_out - t(2))/((t(3) - t(1))*(t(3) - t(2))) CALL MeshExtrapInterp2(y1%Mesh, y2%Mesh, y3%Mesh, tin, y_out%Mesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(y_out%FAddDOF) .AND. ALLOCATED(y1%FAddDOF)) THEN + y_out%FAddDOF = a1*y1%FAddDOF + a2*y2%FAddDOF + a3*y3%FAddDOF + END IF ! check if allocated END SUBROUTINE + +function WAMIT_InputMeshPointer(u, DL) result(Mesh) + type(WAMIT_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (WAMIT_u_Mesh) + Mesh => u%Mesh + end select +end function + +function WAMIT_OutputMeshPointer(y, DL) result(Mesh) + type(WAMIT_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (WAMIT_y_Mesh) + Mesh => y%Mesh + end select +end function + +subroutine WAMIT_VarsPackContState(Vars, x, ValAry) + type(WAMIT_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call WAMIT_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine WAMIT_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(WAMIT_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WAMIT_x_SS_Rdtn_x) + VarVals = x%SS_Rdtn%x(V%iLB:V%iUB) ! Rank 1 Array + case (WAMIT_x_SS_Exctn_x) + VarVals = x%SS_Exctn%x(V%iLB:V%iUB) ! Rank 1 Array + case (WAMIT_x_Conv_Rdtn_DummyContState) + VarVals(1) = x%Conv_Rdtn%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine WAMIT_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(WAMIT_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call WAMIT_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine WAMIT_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(WAMIT_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WAMIT_x_SS_Rdtn_x) + x%SS_Rdtn%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (WAMIT_x_SS_Exctn_x) + x%SS_Exctn%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (WAMIT_x_Conv_Rdtn_DummyContState) + x%Conv_Rdtn%DummyContState = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function WAMIT_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (WAMIT_x_SS_Rdtn_x) + Name = "x%SS_Rdtn%x" + case (WAMIT_x_SS_Exctn_x) + Name = "x%SS_Exctn%x" + case (WAMIT_x_Conv_Rdtn_DummyContState) + Name = "x%Conv_Rdtn%DummyContState" + case default + Name = "Unknown Field" + end select +end function + +subroutine WAMIT_VarsPackContStateDeriv(Vars, x, ValAry) + type(WAMIT_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call WAMIT_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine WAMIT_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(WAMIT_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WAMIT_x_SS_Rdtn_x) + VarVals = x%SS_Rdtn%x(V%iLB:V%iUB) ! Rank 1 Array + case (WAMIT_x_SS_Exctn_x) + VarVals = x%SS_Exctn%x(V%iLB:V%iUB) ! Rank 1 Array + case (WAMIT_x_Conv_Rdtn_DummyContState) + VarVals(1) = x%Conv_Rdtn%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine WAMIT_VarsPackInput(Vars, u, ValAry) + type(WAMIT_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call WAMIT_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine WAMIT_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(WAMIT_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WAMIT_u_Mesh) + call MV_PackMesh(V, u%Mesh, ValAry) ! Mesh + case (WAMIT_u_PtfmRefY) + VarVals(1) = u%PtfmRefY ! Scalar + case (WAMIT_u_qAddDOF) + VarVals = u%qAddDOF(V%iLB:V%iUB) ! Rank 1 Array + case (WAMIT_u_qAddDOFDot) + VarVals = u%qAddDOFDot(V%iLB:V%iUB) ! Rank 1 Array + case (WAMIT_u_qAddDOFDotDot) + VarVals = u%qAddDOFDotDot(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine WAMIT_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(WAMIT_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call WAMIT_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine WAMIT_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(WAMIT_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WAMIT_u_Mesh) + call MV_UnpackMesh(V, ValAry, u%Mesh) ! Mesh + case (WAMIT_u_PtfmRefY) + u%PtfmRefY = VarVals(1) ! Scalar + case (WAMIT_u_qAddDOF) + u%qAddDOF(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (WAMIT_u_qAddDOFDot) + u%qAddDOFDot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (WAMIT_u_qAddDOFDotDot) + u%qAddDOFDotDot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function WAMIT_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (WAMIT_u_Mesh) + Name = "u%Mesh" + case (WAMIT_u_PtfmRefY) + Name = "u%PtfmRefY" + case (WAMIT_u_qAddDOF) + Name = "u%qAddDOF" + case (WAMIT_u_qAddDOFDot) + Name = "u%qAddDOFDot" + case (WAMIT_u_qAddDOFDotDot) + Name = "u%qAddDOFDotDot" + case default + Name = "Unknown Field" + end select +end function + +subroutine WAMIT_VarsPackOutput(Vars, y, ValAry) + type(WAMIT_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call WAMIT_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine WAMIT_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(WAMIT_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WAMIT_y_Mesh) + call MV_PackMesh(V, y%Mesh, ValAry) ! Mesh + case (WAMIT_y_FAddDOF) + VarVals = y%FAddDOF(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine WAMIT_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(WAMIT_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call WAMIT_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine WAMIT_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(WAMIT_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WAMIT_y_Mesh) + call MV_UnpackMesh(V, ValAry, y%Mesh) ! Mesh + case (WAMIT_y_FAddDOF) + y%FAddDOF(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function WAMIT_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (WAMIT_y_Mesh) + Name = "y%Mesh" + case (WAMIT_y_FAddDOF) + Name = "y%FAddDOF" + case default + Name = "Unknown Field" + end select +end function + END MODULE WAMIT_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/icedyn/src/IceDyn.f90 b/modules/icedyn/src/IceDyn.f90 index 87440da45c..706b08cd77 100644 --- a/modules/icedyn/src/IceDyn.f90 +++ b/modules/icedyn/src/IceDyn.f90 @@ -263,17 +263,18 @@ SUBROUTINE IceD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO ' m/s^2) differs from gravity in glue code ('//trim(num2Lstr(InitInp%gravity))//' m/s^2).') END IF - - - ! ! Print the summary file if requested: - ! IF (InputFileData%SumPrint) THEN - ! CALL IceD_PrintSum( p, OtherState, ErrStat2, ErrMsg2 ) - ! CALL CheckError( ErrStat2, ErrMsg2 ) - ! IF (ErrStat >= AbortErrLev) RETURN - ! END IF - - ! Destroy the InputFileData structure (deallocate arrays) - + ! Print the summary file if requested: + ! IF (InputFileData%SumPrint) THEN + ! CALL IceD_PrintSum( p, OtherState, ErrStat2, ErrMsg2 ) + ! CALL CheckError( ErrStat2, ErrMsg2 ) + ! IF (ErrStat >= AbortErrLev) RETURN + ! END IF + + ! Initialize module variables + CALL IceD_InitVars(u, p, x, y, m, InitOut%Vars, InputFileData, .false., ErrStat2, ErrMsg2) + CALL CheckError(ErrStat2, ErrMsg2) + + ! Destroy the InputFileData structure (deallocate arrays) CALL IceD_DestroyInputFile(InputFileData, ErrStat2, ErrMsg2 ) CALL CheckError( ErrStat2, ErrMsg2 ) IF (ErrStat >= AbortErrLev) RETURN @@ -314,6 +315,70 @@ SUBROUTINE CheckError(ErrID,Msg) END SUBROUTINE CheckError END SUBROUTINE IceD_Init + +subroutine IceD_InitVars(u, p, x, y, m, Vars, InputFileData, Linearize, ErrStat, ErrMsg) + type(IceD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(IceD_ParameterType), intent(inout) :: p !< Parameters + type(IceD_ContinuousStateType), intent(inout) :: x !< Continuous state + type(IceD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(IceD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(ModVarsType), intent(inout) :: Vars !< Module variables + type(IceD_InputFile), intent(in) :: InputFileData !< Input file data + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_No ne + + character(*), parameter :: RoutineName = 'IceD_InitVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + call MV_AddVar(Vars%x, "q", FieldTransDisp, DatLoc(IceD_x_q), & + LinNames=["ice mass displacement, m"]) + call MV_AddVar(Vars%x, "q", FieldTransVel, DatLoc(IceD_x_dqdt), & + LinNames=["first time derivative of ice mass displacement, m/s"]) + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%u, "PointMesh", MotionFields, DatLoc(IceD_u_PointMesh), u%PointMesh) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%y, "PointMesh", LoadFields, DatLoc(IceD_y_PointMesh), y%PointMesh) + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, DatLoc(IceD_y_WriteOutput), & + Flags=VF_WriteOut, & + Num=p%NumOuts, & + LinNames=["IceDisp, m ", "IceForce, N"]) + + + !---------------------------------------------------------------------------- + ! Initialization dependent on linearization + !---------------------------------------------------------------------------- + + call MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call IceD_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call IceD_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call IceD_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call IceD_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the end of the simulation. SUBROUTINE IceD_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) diff --git a/modules/icedyn/src/IceDyn_Types.f90 b/modules/icedyn/src/IceDyn_Types.f90 index 30d8c26097..2f34dd5097 100644 --- a/modules/icedyn/src/IceDyn_Types.f90 +++ b/modules/icedyn/src/IceDyn_Types.f90 @@ -114,6 +114,7 @@ MODULE IceDyn_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] INTEGER(IntKi) :: numLegs = 0_IntKi !< Number of legs on the structure [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE IceD_InitOutputType ! ======================= ! ========= IceD_ContinuousStateType ======= @@ -146,11 +147,6 @@ MODULE IceDyn_Types INTEGER(IntKi) :: n = 0_IntKi !< tracks time step for which OtherState was updated [-] END TYPE IceD_OtherStateType ! ======================= -! ========= IceD_MiscVarType ======= - TYPE, PUBLIC :: IceD_MiscVarType - INTEGER(IntKi) :: DummyMiscVar = 0_IntKi !< Remove this variable if you have misc/optimization variables [-] - END TYPE IceD_MiscVarType -! ======================= ! ========= IceD_ParameterType ======= TYPE, PUBLIC :: IceD_ParameterType REAL(ReKi) :: h = 0.0_ReKi !< Ice thickness [m] @@ -224,7 +220,23 @@ MODULE IceDyn_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Data to be written to an output file: see WriteOutputHdr for names of each variable [see WriteOutputUnt] END TYPE IceD_OutputType ! ======================= -CONTAINS +! ========= IceD_MiscVarType ======= + TYPE, PUBLIC :: IceD_MiscVarType + INTEGER(IntKi) :: DummyMiscVar = 0_IntKi !< Remove this variable if you have misc/optimization variables [-] + TYPE(ModJacType) :: Jac !< Values [corresponding] + TYPE(IceD_ContinuousStateType) :: x_perturb !< [-] + TYPE(IceD_ContinuousStateType) :: dxdt_lin !< [-] + TYPE(IceD_InputType) :: u_perturb !< [-] + TYPE(IceD_OutputType) :: y_lin !< [-] + END TYPE IceD_MiscVarType +! ======================= + integer(IntKi), public, parameter :: IceD_x_q = 1 ! IceD%q + integer(IntKi), public, parameter :: IceD_x_dqdt = 2 ! IceD%dqdt + integer(IntKi), public, parameter :: IceD_u_PointMesh = 3 ! IceD%PointMesh + integer(IntKi), public, parameter :: IceD_y_PointMesh = 4 ! IceD%PointMesh + integer(IntKi), public, parameter :: IceD_y_WriteOutput = 5 ! IceD%WriteOutput + +contains subroutine IceD_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg) type(IceD_InputFile), intent(in) :: SrcInputFileData @@ -584,6 +596,9 @@ subroutine IceD_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, E call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine IceD_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -603,6 +618,8 @@ subroutine IceD_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine IceD_PackInitOutput(RF, Indata) @@ -614,6 +631,7 @@ subroutine IceD_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%WriteOutputUnt) call RegPack(RF, InData%numLegs) call NWTC_Library_PackProgDesc(RF, InData%Ver) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -629,6 +647,7 @@ subroutine IceD_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%numLegs); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine IceD_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg) @@ -913,44 +932,6 @@ subroutine IceD_UnPackOtherState(RF, OutData) call RegUnpack(RF, OutData%n); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine IceD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(IceD_MiscVarType), intent(in) :: SrcMiscData - type(IceD_MiscVarType), intent(inout) :: DstMiscData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'IceD_CopyMisc' - ErrStat = ErrID_None - ErrMsg = '' - DstMiscData%DummyMiscVar = SrcMiscData%DummyMiscVar -end subroutine - -subroutine IceD_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(IceD_MiscVarType), intent(inout) :: MiscData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'IceD_DestroyMisc' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine IceD_PackMisc(RF, Indata) - type(RegFile), intent(inout) :: RF - type(IceD_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'IceD_PackMisc' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%DummyMiscVar) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine IceD_UnPackMisc(RF, OutData) - type(RegFile), intent(inout) :: RF - type(IceD_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'IceD_UnPackMisc' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%DummyMiscVar); if (RegCheckErr(RF, RoutineName)) return -end subroutine - subroutine IceD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) type(IceD_ParameterType), intent(in) :: SrcParamData type(IceD_ParameterType), intent(inout) :: DstParamData @@ -1418,6 +1399,83 @@ subroutine IceD_UnPackOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return end subroutine +subroutine IceD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(IceD_MiscVarType), intent(inout) :: SrcMiscData + type(IceD_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'IceD_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + DstMiscData%DummyMiscVar = SrcMiscData%DummyMiscVar + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceD_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceD_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceD_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceD_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine IceD_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(IceD_MiscVarType), intent(inout) :: MiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'IceD_DestroyMisc' + ErrStat = ErrID_None + ErrMsg = '' + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call IceD_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call IceD_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call IceD_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call IceD_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine IceD_PackMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(IceD_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'IceD_PackMisc' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%DummyMiscVar) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call IceD_PackContState(RF, InData%x_perturb) + call IceD_PackContState(RF, InData%dxdt_lin) + call IceD_PackInput(RF, InData%u_perturb) + call IceD_PackOutput(RF, InData%y_lin) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine IceD_UnPackMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(IceD_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'IceD_UnPackMisc' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%DummyMiscVar); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call IceD_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call IceD_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call IceD_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call IceD_UnpackOutput(RF, OutData%y_lin) ! y_lin +end subroutine + subroutine IceD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time @@ -1739,5 +1797,238 @@ SUBROUTINE IceD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, E y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function IceD_InputMeshPointer(u, DL) result(Mesh) + type(IceD_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (IceD_u_PointMesh) + Mesh => u%PointMesh + end select +end function + +function IceD_OutputMeshPointer(y, DL) result(Mesh) + type(IceD_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (IceD_y_PointMesh) + Mesh => y%PointMesh + end select +end function + +subroutine IceD_VarsPackContState(Vars, x, ValAry) + type(IceD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call IceD_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine IceD_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(IceD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceD_x_q) + VarVals(1) = x%q ! Scalar + case (IceD_x_dqdt) + VarVals(1) = x%dqdt ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine IceD_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(IceD_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call IceD_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine IceD_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(IceD_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceD_x_q) + x%q = VarVals(1) ! Scalar + case (IceD_x_dqdt) + x%dqdt = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function IceD_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (IceD_x_q) + Name = "x%q" + case (IceD_x_dqdt) + Name = "x%dqdt" + case default + Name = "Unknown Field" + end select +end function + +subroutine IceD_VarsPackContStateDeriv(Vars, x, ValAry) + type(IceD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call IceD_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine IceD_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(IceD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceD_x_q) + VarVals(1) = x%q ! Scalar + case (IceD_x_dqdt) + VarVals(1) = x%dqdt ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine IceD_VarsPackInput(Vars, u, ValAry) + type(IceD_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call IceD_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine IceD_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(IceD_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceD_u_PointMesh) + call MV_PackMesh(V, u%PointMesh, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine IceD_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(IceD_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call IceD_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine IceD_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(IceD_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceD_u_PointMesh) + call MV_UnpackMesh(V, ValAry, u%PointMesh) ! Mesh + end select + end associate +end subroutine + +function IceD_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (IceD_u_PointMesh) + Name = "u%PointMesh" + case default + Name = "Unknown Field" + end select +end function + +subroutine IceD_VarsPackOutput(Vars, y, ValAry) + type(IceD_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call IceD_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine IceD_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(IceD_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceD_y_PointMesh) + call MV_PackMesh(V, y%PointMesh, ValAry) ! Mesh + case (IceD_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine IceD_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(IceD_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call IceD_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine IceD_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(IceD_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceD_y_PointMesh) + call MV_UnpackMesh(V, ValAry, y%PointMesh) ! Mesh + case (IceD_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function IceD_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (IceD_y_PointMesh) + Name = "y%PointMesh" + case (IceD_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE IceDyn_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/icedyn/src/Registry_IceDyn.txt b/modules/icedyn/src/Registry_IceDyn.txt index b230ebf9d9..d0643fcb0c 100644 --- a/modules/icedyn/src/Registry_IceDyn.txt +++ b/modules/icedyn/src/Registry_IceDyn.txt @@ -111,7 +111,7 @@ typedef IceDyn/IceD InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} typedef ^ ^ ^ WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ ^ IntKi numLegs - - - "Number of legs on the structure" - typedef ^ ^ ProgDesc Ver - - - "This module's name, version, and date" - - +typedef ^ ^ ModVarsType Vars - - - "Module Variables" # ..... States .................................................................................................................... # Define continuous (differentiable) states here: @@ -142,13 +142,6 @@ typedef ^ ^ ReKi dxc typedef ^ ^ IceD_ContinuousStateType xdot {:} - - "previous state deriv for multi-step" m typedef ^ ^ IntKi n - - - "tracks time step for which OtherState was updated" - - -# ..... Misc/Optimization variables................................................................................................. -# Define any data that are used only for efficiency purposes (these variables are not associated with time): -# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. -typedef ^ MiscVarType IntKi DummyMiscVar - - - "Remove this variable if you have misc/optimization variables" - - - # ..... Parameters ................................................................................................................ # Define parameters here: # ..... General parameters ........................................................................................................ @@ -232,3 +225,12 @@ typedef IceDyn/IceD InputType MeshType PointMesh typedef IceDyn/IceD OutputType MeshType PointMesh - - - "contains Ice force" N typedef ^ ^ ReKi WriteOutput {:} - - "Data to be written to an output file: see WriteOutputHdr for names of each variable" "see WriteOutputUnt" +# ..... Misc/Optimization variables................................................................................................. +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef ^ MiscVarType IntKi DummyMiscVar - - - "Remove this variable if you have misc/optimization variables" - +typedef ^ MiscVarType ModJacType Jac - - - Values corresponding to module variables" +typedef ^ MiscVarType IceD_ContinuousStateType x_perturb - - - "" - +typedef ^ MiscVarType IceD_ContinuousStateType dxdt_lin - - - "" - +typedef ^ MiscVarType IceD_InputType u_perturb - - - "" - +typedef ^ MiscVarType IceD_OutputType y_lin - - - "" - diff --git a/modules/icefloe/src/icefloe/IceFloeBase.F90 b/modules/icefloe/src/icefloe/IceFloeBase.F90 index 432ed822cb..f63e72a3cc 100644 --- a/modules/icefloe/src/icefloe/IceFloeBase.F90 +++ b/modules/icefloe/src/icefloe/IceFloeBase.F90 @@ -35,7 +35,7 @@ module IceFloeBase public ! This is compared to gravity in FAST, warning if different - real(ReKi), parameter :: grav = 9.81 + real(ReKi), parameter :: grav = 9.80665 ! ice type parameters integer(IntKi), parameter :: randomCrush = 1 diff --git a/modules/icefloe/src/icefloe/IceFloe_Types.f90 b/modules/icefloe/src/icefloe/IceFloe_Types.f90 index 28befef3c4..62f8950cd3 100644 --- a/modules/icefloe/src/icefloe/IceFloe_Types.f90 +++ b/modules/icefloe/src/icefloe/IceFloe_Types.f90 @@ -47,6 +47,7 @@ MODULE IceFloe_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE IceFloe_InitOutputType ! ======================= ! ========= IceFloe_ContinuousStateType ======= @@ -69,11 +70,6 @@ MODULE IceFloe_Types INTEGER(IntKi) :: DummyOtherState = 0_IntKi !< Remove this variable if you have other states [-] END TYPE IceFloe_OtherStateType ! ======================= -! ========= IceFloe_MiscVarType ======= - TYPE, PUBLIC :: IceFloe_MiscVarType - INTEGER(IntKi) :: DummyMiscVar = 0_IntKi !< Remove this variable if you have misc/optimization variables [-] - END TYPE IceFloe_MiscVarType -! ======================= ! ========= IceFloe_ParameterType ======= TYPE, PUBLIC :: IceFloe_ParameterType REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: loadSeries !< - [precalculated time series of ice loads for each leg] @@ -108,7 +104,22 @@ MODULE IceFloe_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Data to be written to an output file: see WriteOutputHdr for names of each variable [see WriteOutputUnt] END TYPE IceFloe_OutputType ! ======================= -CONTAINS +! ========= IceFloe_MiscVarType ======= + TYPE, PUBLIC :: IceFloe_MiscVarType + INTEGER(IntKi) :: DummyMiscVar = 0_IntKi !< Remove this variable if you have misc/optimization variables [-] + TYPE(ModJacType) :: Jac !< Values [corresponding] + TYPE(IceFloe_ContinuousStateType) :: x_perturb !< [-] + TYPE(IceFloe_ContinuousStateType) :: dxdt_lin !< [-] + TYPE(IceFloe_InputType) :: u_perturb !< [-] + TYPE(IceFloe_OutputType) :: y_lin !< [-] + END TYPE IceFloe_MiscVarType +! ======================= + integer(IntKi), public, parameter :: IceFloe_x_DummyContStateVar = 1 ! IceFloe%DummyContStateVar + integer(IntKi), public, parameter :: IceFloe_u_iceMesh = 2 ! IceFloe%iceMesh + integer(IntKi), public, parameter :: IceFloe_y_iceMesh = 3 ! IceFloe%iceMesh + integer(IntKi), public, parameter :: IceFloe_y_WriteOutput = 4 ! IceFloe%WriteOutput + +contains subroutine IceFloe_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(IceFloe_InitInputType), intent(in) :: SrcInitInputData @@ -199,6 +210,9 @@ subroutine IceFloe_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine IceFloe_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -218,6 +232,8 @@ subroutine IceFloe_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine IceFloe_PackInitOutput(RF, Indata) @@ -228,6 +244,7 @@ subroutine IceFloe_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%WriteOutputHdr) call RegPackAlloc(RF, InData%WriteOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -242,6 +259,7 @@ subroutine IceFloe_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine IceFloe_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg) @@ -396,44 +414,6 @@ subroutine IceFloe_UnPackOtherState(RF, OutData) call RegUnpack(RF, OutData%DummyOtherState); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine IceFloe_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(IceFloe_MiscVarType), intent(in) :: SrcMiscData - type(IceFloe_MiscVarType), intent(inout) :: DstMiscData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'IceFloe_CopyMisc' - ErrStat = ErrID_None - ErrMsg = '' - DstMiscData%DummyMiscVar = SrcMiscData%DummyMiscVar -end subroutine - -subroutine IceFloe_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(IceFloe_MiscVarType), intent(inout) :: MiscData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'IceFloe_DestroyMisc' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine IceFloe_PackMisc(RF, Indata) - type(RegFile), intent(inout) :: RF - type(IceFloe_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'IceFloe_PackMisc' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%DummyMiscVar) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine IceFloe_UnPackMisc(RF, OutData) - type(RegFile), intent(inout) :: RF - type(IceFloe_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'IceFloe_UnPackMisc' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%DummyMiscVar); if (RegCheckErr(RF, RoutineName)) return -end subroutine - subroutine IceFloe_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) type(IceFloe_ParameterType), intent(in) :: SrcParamData type(IceFloe_ParameterType), intent(inout) :: DstParamData @@ -700,6 +680,83 @@ subroutine IceFloe_UnPackOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return end subroutine +subroutine IceFloe_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(IceFloe_MiscVarType), intent(inout) :: SrcMiscData + type(IceFloe_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'IceFloe_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + DstMiscData%DummyMiscVar = SrcMiscData%DummyMiscVar + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceFloe_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceFloe_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceFloe_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceFloe_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine IceFloe_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(IceFloe_MiscVarType), intent(inout) :: MiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'IceFloe_DestroyMisc' + ErrStat = ErrID_None + ErrMsg = '' + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call IceFloe_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call IceFloe_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call IceFloe_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call IceFloe_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine IceFloe_PackMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(IceFloe_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'IceFloe_PackMisc' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%DummyMiscVar) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call IceFloe_PackContState(RF, InData%x_perturb) + call IceFloe_PackContState(RF, InData%dxdt_lin) + call IceFloe_PackInput(RF, InData%u_perturb) + call IceFloe_PackOutput(RF, InData%y_lin) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine IceFloe_UnPackMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(IceFloe_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'IceFloe_UnPackMisc' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%DummyMiscVar); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call IceFloe_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call IceFloe_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call IceFloe_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call IceFloe_UnpackOutput(RF, OutData%y_lin) ! y_lin +end subroutine + subroutine IceFloe_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time @@ -1021,5 +1078,230 @@ SUBROUTINE IceFloe_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function IceFloe_InputMeshPointer(u, DL) result(Mesh) + type(IceFloe_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (IceFloe_u_iceMesh) + Mesh => u%iceMesh + end select +end function + +function IceFloe_OutputMeshPointer(y, DL) result(Mesh) + type(IceFloe_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (IceFloe_y_iceMesh) + Mesh => y%iceMesh + end select +end function + +subroutine IceFloe_VarsPackContState(Vars, x, ValAry) + type(IceFloe_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call IceFloe_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine IceFloe_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(IceFloe_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceFloe_x_DummyContStateVar) + VarVals(1) = x%DummyContStateVar ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine IceFloe_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(IceFloe_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call IceFloe_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine IceFloe_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(IceFloe_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceFloe_x_DummyContStateVar) + x%DummyContStateVar = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function IceFloe_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (IceFloe_x_DummyContStateVar) + Name = "x%DummyContStateVar" + case default + Name = "Unknown Field" + end select +end function + +subroutine IceFloe_VarsPackContStateDeriv(Vars, x, ValAry) + type(IceFloe_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call IceFloe_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine IceFloe_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(IceFloe_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceFloe_x_DummyContStateVar) + VarVals(1) = x%DummyContStateVar ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine IceFloe_VarsPackInput(Vars, u, ValAry) + type(IceFloe_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call IceFloe_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine IceFloe_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(IceFloe_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceFloe_u_iceMesh) + call MV_PackMesh(V, u%iceMesh, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine IceFloe_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(IceFloe_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call IceFloe_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine IceFloe_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(IceFloe_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceFloe_u_iceMesh) + call MV_UnpackMesh(V, ValAry, u%iceMesh) ! Mesh + end select + end associate +end subroutine + +function IceFloe_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (IceFloe_u_iceMesh) + Name = "u%iceMesh" + case default + Name = "Unknown Field" + end select +end function + +subroutine IceFloe_VarsPackOutput(Vars, y, ValAry) + type(IceFloe_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call IceFloe_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine IceFloe_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(IceFloe_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceFloe_y_iceMesh) + call MV_PackMesh(V, y%iceMesh, ValAry) ! Mesh + case (IceFloe_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine IceFloe_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(IceFloe_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call IceFloe_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine IceFloe_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(IceFloe_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (IceFloe_y_iceMesh) + call MV_UnpackMesh(V, ValAry, y%iceMesh) ! Mesh + case (IceFloe_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function IceFloe_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (IceFloe_y_iceMesh) + Name = "y%iceMesh" + case (IceFloe_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE IceFloe_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/icefloe/src/interfaces/FAST/IceFloe.f90 b/modules/icefloe/src/interfaces/FAST/IceFloe.f90 index 90b2b4490e..2c26e37afc 100644 --- a/modules/icefloe/src/interfaces/FAST/IceFloe.f90 +++ b/modules/icefloe/src/interfaces/FAST/IceFloe.f90 @@ -49,6 +49,7 @@ MODULE IceFloe use randomCrushing use IceCpldCrushing use NWTC_IO, only : DispNVD + use ModVar IMPLICIT NONE @@ -320,7 +321,7 @@ SUBROUTINE IceFloe_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In ! set up outputs to write to FAST - ! need to know how many legs and whethter loads applied to all or just one set of effective loads + ! need to know how many legs and whether loads applied to all or just one set of effective loads numOuts = 4*p%numLegs ! 2 velocities and 2 forces if (p%singleLoad .and. p%numLegs > 1) numOuts = 5 CALL AllocAry( InitOut%WriteOutputHdr, numOuts, 'WriteOutputHdr', ErrStat, ErrMsg ) @@ -347,6 +348,11 @@ SUBROUTINE IceFloe_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In InitOut%WriteOutputUnt(4*n-3:4*n) = (/"m/s", "m/s", "kN ", "kN "/) enddo endif + + ! Initialize module variables + CALL IceFloe_InitVars(u, p, x, y, m, InitOut, InitOut%Vars, .false., ErrStat, ErrMsg) + call iceErrorHndlr (iceLog, ErrStat, 'Error in allocation of output memory', 1) + if (ErrStat >= AbortErrLev) return ! Let the user know if there have been warnings if (iceLog%WarnFlag) then @@ -364,6 +370,70 @@ SUBROUTINE IceFloe_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, In END SUBROUTINE IceFloe_Init + +subroutine IceFloe_InitVars(u, p, x, y, m, InitOut, Vars, Linearize, ErrStat, ErrMsg) + type(IceFloe_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(IceFloe_ParameterType), intent(inout) :: p !< Parameters + type(IceFloe_ContinuousStateType), intent(inout) :: x !< Continuous state + type(IceFloe_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(IceFloe_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(IceFloe_InitOutputType), intent(in) :: InitOut ! Output for initialization routine + type(ModVarsType), intent(inout) :: Vars !< Module variables + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_No ne + + character(*), parameter :: RoutineName = 'IceFloe_InitVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%u, 'iceMesh', MotionFields, DatLoc(IceFloe_u_iceMesh), u%iceMesh) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%y, 'iceMesh', MotionFields, DatLoc(IceFloe_y_iceMesh), y%iceMesh) + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, DatLoc(IceFloe_y_WriteOutput), & + Flags=VF_WriteOut, & + Num=size(y%WriteOutput), & + LinNames=[(WriteOutputLinName(i), i=1,size(y%WriteOutput))]) + + !---------------------------------------------------------------------------- + ! Initialization dependent on linearization + !---------------------------------------------------------------------------- + + call MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call IceFloe_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call IceFloe_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call IceFloe_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call IceFloe_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed + function WriteOutputLinName(index) result(name) + integer(IntKi), intent(in) :: index + character(LinChanLen) :: name + name = InitOut%WriteOutputHdr(index)//', '//trim(InitOut%WriteOutputUnt(index)) + end function WriteOutputLinName +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE IceFloe_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! diff --git a/modules/icefloe/src/interfaces/FAST/IceFloe_FASTRegistry.inp b/modules/icefloe/src/interfaces/FAST/IceFloe_FASTRegistry.inp index 362c9f02b3..e3f23ca0d3 100644 --- a/modules/icefloe/src/interfaces/FAST/IceFloe_FASTRegistry.inp +++ b/modules/icefloe/src/interfaces/FAST/IceFloe_FASTRegistry.inp @@ -25,6 +25,7 @@ typedef ^ ^ character(1024) RootName - - - "Output file root typedef IceFloe InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef IceFloe InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef IceFloe InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - +typedef IceFloe InitOutputType ModVarsType Vars - - - "Module Variables" # ..... States .................................................................................................................... # Define continuous (differentiable) states here: @@ -39,11 +40,6 @@ typedef IceFloe ConstraintStateType SiKi DummyConstrStateVar - - - "None curre # Define any other states, including integer or logical states here: typedef IceFloe OtherStateType IntKi DummyOtherState - - - "Remove this variable if you have other states" - -# ..... Misc/Optimization variables................................................................................................. -# Define any data that are used only for efficiency purposes (these variables are not associated with time): -# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. -typedef IceFloe MiscVarType IntKi DummyMiscVar - - - "Remove this variable if you have misc/optimization variables" - - # ..... Parameters ................................................................................................................ # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: @@ -75,3 +71,13 @@ typedef IceFloe InputType MeshType iceMesh - - - "Horizontal velocit # Define outputs that are contained on the mesh here: typedef IceFloe OutputType MeshType iceMesh - - - "Horizontal forces and torsional moment(s) on support structure leg(s) at water line" - typedef IceFloe OutputType ReKi WriteOutput {:} - - "Data to be written to an output file: see WriteOutputHdr for names of each variable" "see WriteOutputUnt" + +# ..... Misc/Optimization variables................................................................................................. +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef IceFloe MiscVarType IntKi DummyMiscVar - - - "Remove this variable if you have misc/optimization variables" - +typedef ^ ^ ModJacType Jac - - - Values corresponding to module variables" +typedef ^ ^ IceFloe_ContinuousStateType x_perturb - - - "" - +typedef ^ ^ IceFloe_ContinuousStateType dxdt_lin - - - "" - +typedef ^ ^ IceFloe_InputType u_perturb - - - "" - +typedef ^ ^ IceFloe_OutputType y_lin - - - "" - diff --git a/modules/inflowwind/USER_DEFINED_WIND.md b/modules/inflowwind/USER_DEFINED_WIND.md new file mode 100644 index 0000000000..44b2874a77 --- /dev/null +++ b/modules/inflowwind/USER_DEFINED_WIND.md @@ -0,0 +1,215 @@ +# User-Defined Wind Field Implementation Guide + +This guide explains how to implement custom wind fields in InflowWind (WindType = 6). + +## Overview + +The user-defined wind field feature allows you to implement custom wind models by: +1. Defining a data structure to hold your wind field parameters +2. Initializing that data structure from input files or parameters +3. Implementing a function to return wind velocities at any position and time + +**Important**: After modifying the registry files (`.txt` files), you must rebuild the project to regenerate the type definition files (`*_Types.f90`). The modifications to the `.txt` files in this commit define the extended data structures, but they won't be available until after regeneration. + +## Quick Start + +### Step 1: Define Your Data Structure + +Edit `modules/inflowwind/src/IfW_FlowField.txt` and add fields to `UserFieldType`: + +``` +typedef ^ UserFieldType ReKi RefHeight - - - "reference height; used to center the wind" meters +typedef ^ ^ IntKi NumDataLines - 0 - "number of data lines (for time-varying user wind)" - +typedef ^ ^ DbKi DTime : - - "time array for user-defined wind" seconds +typedef ^ ^ ReKi Data :: - - "user-defined wind data array [NumDataLines, NumDataColumns]" - +typedef ^ ^ CHARACTER(1024) FileName - - - "name of user wind file (if applicable)" - +# Add your custom fields here +``` + +### Step 2: Define Initialization Inputs + +Edit `modules/inflowwind/src/InflowWind_IO.txt` and add fields to `User_InitInputType`: + +``` +typedef ^ User_InitInputType CHARACTER(1024) WindFileName - - - "name of file containing user-defined wind data (if applicable)" - +typedef ^ ^ ReKi RefHt - - - "reference height for user wind field" meters +typedef ^ ^ IntKi NumDataColumns - 0 - "number of data columns in user wind file (if applicable)" - +# Add your custom initialization parameters here +``` + +### Step 3: Regenerate Type Files + +After modifying the registry files, regenerate the type files: + +```bash +cd modules/inflowwind/src +# Run the registry generator (typically done during build) +# or rebuild the project which will regenerate types automatically +``` + +### Step 4: Implement Initialization + +Edit `modules/inflowwind/src/InflowWind_IO.f90` and implement `IfW_User_Init()`: + +```fortran +subroutine IfW_User_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrMsg) + ! Read input files + ! Allocate arrays in UF + ! Populate UF with your wind field data + ! Set FileDat metadata +end subroutine +``` + +### Step 5: Implement Wind Velocity Function + +Edit `modules/inflowwind/src/IfW_FlowField.f90` and implement `UserField_GetVel()`: + +```fortran +subroutine UserField_GetVel(UF, Time, Position, Velocity, ErrStat, ErrMsg) + ! Use UF data to compute velocity at Position and Time + ! Position(1) = X, Position(2) = Y, Position(3) = Z + ! Return Velocity(1) = U, Velocity(2) = V, Velocity(3) = W +end subroutine +``` + +## Example Implementation: Power-Law Wind Profile + +Here's a simple example implementing a power-law wind profile: + +### In UserField_GetVel(): + +```fortran +subroutine UserField_GetVel(UF, Time, Position, Velocity, ErrStat, ErrMsg) + type(UserFieldType), intent(in) :: UF + real(DbKi), intent(in) :: Time + real(ReKi), intent(in) :: Position(3) + real(ReKi), intent(out) :: Velocity(3) + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + real(ReKi) :: RefSpeed, Exponent, Height + + ErrStat = ErrID_None + ErrMsg = "" + + ! Get reference speed and exponent from UF%Data + RefSpeed = UF%Data(1, 1) ! Reference wind speed (m/s) + Exponent = UF%Data(1, 2) ! Power law exponent + Height = Position(3) ! Height above ground + + ! Apply power law: U(z) = Uref * (z/zref)^alpha + if (Height > 0.0_ReKi) then + Velocity(1) = RefSpeed * (Height / UF%RefHeight)**Exponent + Velocity(2) = 0.0_ReKi ! No lateral wind + Velocity(3) = 0.0_ReKi ! No vertical wind + else + Velocity = 0.0_ReKi ! Below ground + end if + +end subroutine +``` + +### In IfW_User_Init(): + +```fortran +subroutine IfW_User_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrMsg) + ! ... (declarations) + + ErrStat = ErrID_None + ErrMsg = "" + + ! Set reference height + UF%RefHeight = InitInp%RefHt + + ! Allocate data array for [RefSpeed, Exponent] + UF%NumDataLines = 1 + call AllocAry(UF%Data, 1, 2, 'User wind data', TmpErrStat, TmpErrMsg) + call SetErrStat(TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + ! Set values (could read from file instead) + UF%Data(1, 1) = 10.0_ReKi ! 10 m/s reference speed + UF%Data(1, 2) = 0.2_ReKi ! Power law exponent + + ! Set metadata + FileDat%WindType = 6 + FileDat%RefHt = UF%RefHeight + FileDat%MWS = UF%Data(1, 1) + ! ... (set other FileDat fields) + +end subroutine +``` + +## Coordinate Systems + +### Input Coordinates (Position) +- **X**: Downstream direction (after rotation applied by InflowWind) +- **Y**: Lateral/crosswind direction +- **Z**: Vertical direction (measured from ground, Z=0 is ground level) +- Units: meters + +### Output Velocities (Velocity) +- **U**: Velocity component along X (positive = downwind) +- **V**: Velocity component along Y (positive = to the left when looking downwind) +- **W**: Velocity component along Z (positive = upward) +- Units: m/s + +Note: InflowWind handles the rotation between global coordinates and wind coordinates. Your implementation should work in the wind coordinate system where X is aligned with the mean wind direction. + +## Common Use Cases + +### 1. Steady Analytical Wind Field +Define wind as a function of position only (ignore Time parameter). + +### 2. Time-Varying Wind Field +Store wind data in time series arrays and interpolate based on Time parameter. + +### 3. Wind from External Solver +Call external functions or read shared memory to get instantaneous wind fields. + +### 4. Measured Wind Data +Load measured wind data from sensors and interpolate spatially/temporally. + +## Limitations + +1. **No Acceleration Support**: User-defined wind fields do not currently support acceleration calculations needed by some modules. + +2. **Performance**: The UserField_GetVel() function is called for every point at every time step, so it should be efficient. + +3. **No Built-in Interpolation**: You must implement any necessary spatial or temporal interpolation. + +## Tips and Best Practices + +1. **Error Handling**: Always check array bounds and validity of Position and Time values. + +2. **Efficiency**: Pre-compute values in IfW_User_Init() rather than in UserField_GetVel(). + +3. **Testing**: Start with simple analytical models before implementing complex wind fields. + +4. **Documentation**: Document your implementation and any file formats in comments. + +5. **Units**: Always use SI units (meters, seconds, m/s). + +## File Locations + +- **Type Definitions**: `modules/inflowwind/src/IfW_FlowField.txt`, `InflowWind_IO.txt` +- **Initialization**: `modules/inflowwind/src/InflowWind_IO.f90` (IfW_User_Init) +- **Velocity Function**: `modules/inflowwind/src/IfW_FlowField.f90` (UserField_GetVel) + +## Building + +After modifying any `.txt` registry files, rebuild the project: + +```bash +cd build +cmake .. -DGENERATE_TYPES=ON +make +``` + +The build process will automatically regenerate the type files from the `.txt` registry files. + +## Further Information + +- See existing wind field implementations (Uniform, Grid3D) for reference +- Check InflowWind documentation for information about wind coordinate systems +- Refer to NWTC Library documentation for array allocation and error handling utilities diff --git a/modules/inflowwind/src/IfW_FlowField.f90 b/modules/inflowwind/src/IfW_FlowField.f90 index 2778000246..922b831843 100644 --- a/modules/inflowwind/src/IfW_FlowField.f90 +++ b/modules/inflowwind/src/IfW_FlowField.f90 @@ -26,7 +26,6 @@ module IfW_FlowField public IfW_FlowField_GetVelAcc public IfW_UniformField_CalcAccel, IfW_Grid3DField_CalcAccel -public IfW_UniformWind_GetOP, IfW_UniformWind_Perturb ! for linearization public Grid3D_to_Uniform, Uniform_to_Grid3D integer(IntKi), parameter :: WindProfileType_None = -1 !< don't add wind profile; already included in input @@ -73,7 +72,6 @@ subroutine IfW_FlowField_GetVelAcc(FF, IStart, Time, PositionXYZ, VelocityUVW, A logical :: GridExceedAllow ! is this point allowed to exceed bounds of wind grid ErrStat = ErrID_None - ErrMsg = "" ! Get number of points to evaluate NumPoints = size(PositionXYZ, dim=2) @@ -310,11 +308,35 @@ subroutine IfW_FlowField_GetVelAcc(FF, IStart, Time, PositionXYZ, VelocityUVW, A case (User_FieldType) !------------------------------------------------------------------------- - ! User Flow Field + ! User-Defined Flow Field + !------------------------------------------------------------------------- + ! This case handles custom wind fields implemented by the user. + ! The UserField_GetVel function must be implemented to return velocities + ! at any requested position and time. + ! + ! Note: User-defined wind fields currently do not support acceleration + ! calculations. If accelerations are requested, an error will be returned. + ! + ! To implement a user-defined wind field: + ! 1. Define data structure in UserFieldType (IfW_FlowField.txt) + ! 2. Initialize data in IfW_User_Init() (InflowWind_IO.f90) + ! 3. Implement UserField_GetVel() (below in this file) !------------------------------------------------------------------------- - call SetErrStat(ErrID_Fatal, "User Field not implemented", ErrStat, ErrMsg, RoutineName) - return + ! Check if accelerations are requested + if (OutputAccel) then + call SetErrStat(ErrID_Fatal, & + "Acceleration calculation not supported for user-defined wind fields", & + ErrStat, ErrMsg, RoutineName) + return + end if + + ! Get velocities for each position by calling user-defined function + do i = 1, NumPoints + call UserField_GetVel(FF%User, Time, Position(:, i), VelocityUVW(:, i), TmpErrStat, TmpErrMsg) + call SetErrStat(TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do case default call SetErrStat(ErrID_Fatal, "Invalid FieldType "//trim(num2lstr(FF%FieldType)), ErrStat, ErrMsg, RoutineName) @@ -710,41 +732,6 @@ subroutine CalcCubicSplineDeriv(x, y, dy) end subroutine -!> Routine to compute the Jacobians of the output (Y) function with respect to the inputs (u). The partial -!! derivative dY/du is returned. This submodule does not follow the modularization framework. -subroutine IfW_UniformWind_GetOP(UF, t, InterpCubic, OP_out) - type(UniformFieldType), intent(IN) :: UF !< Parameters - real(DbKi), intent(IN) :: t !< Current simulation time in seconds - logical, intent(in) :: InterpCubic !< flag for using cubic interpolation - real(ReKi), intent(OUT) :: OP_out(3) !< operating point (HWindSpeed, PLexp, and AngleH) - - type(UniformField_Interp) :: op ! interpolated values of InterpParams - - ! Linearly interpolate parameters in time at operating point (or use nearest-neighbor to extrapolate) - if (InterpCubic) then - op = UniformField_InterpCubic(UF, t) - else - op = UniformField_InterpLinear(UF, t) - end if - - OP_out(1) = op%VelH - OP_out(2) = op%ShrV - OP_out(3) = op%AngleH -end subroutine - - -!> Routine to perturb the wind extended outputs (needed by AeroDyn) -!! NOTE: we are not passing the pointer here, but doing pass by reference to the FlowField since -!! this can only be used with linearization, and linearization requires using Uniform winds. -subroutine IfW_UniformWind_Perturb(FF_perturb, du) - type(FlowFieldType), intent(INOUT) :: FF_perturb !< Parameters to be modified - real(R8Ki), intent(IN ) :: du(3) !< perturbations to apply - FF_perturb%Uniform%VelH(:) = FF_perturb%Uniform%VelH(:) + du(1) - FF_perturb%Uniform%ShrV(:) = FF_perturb%Uniform%ShrV(:) + du(2) - FF_perturb%PropagationDir = FF_perturb%PropagationDir + du(3) -end subroutine - - subroutine Grid3DField_GetCell(G3D, Time, Position, CalcAccel, AllowExtrap, & VelCell, AccCell, Xi, Is3D, ErrStat, ErrMsg) @@ -773,7 +760,6 @@ subroutine Grid3DField_GetCell(G3D, Time, Position, CalcAccel, AllowExtrap, & logical :: InGrid ErrStat = ErrID_None - ErrMsg = "" ! Initialize to no extrapolation (modified in bounds routines) AllExtrap = ExtrapNone @@ -1739,6 +1725,50 @@ subroutine Grid4DField_GetVel(G4D, Time, Position, Velocity, ErrStat, ErrMsg) end subroutine +!> UserField_GetVel computes wind velocities for a user-defined wind field. +!! +!! This subroutine must be implemented by users who want to create custom wind fields. +!! It is called for each position where wind velocities are needed during the simulation. +!! +!! The implementation should: +!! 1. Use the data in UF (populated by IfW_User_Init) to compute velocities +!! 2. Return velocity components in the global coordinate system (not rotated) +!! 3. Handle any spatial or temporal interpolation as needed +!! 4. Set appropriate error status if position/time is out of bounds +!! +!! Coordinate system: +!! - Position(1) = X position (aligned with mean wind direction after rotation) +!! - Position(2) = Y position (lateral/crosswind) +!! - Position(3) = Z position (vertical, measured from ground) +!! - Velocity(1) = U velocity (along X, positive downwind) +!! - Velocity(2) = V velocity (along Y, positive to left when looking downwind) +!! - Velocity(3) = W velocity (along Z, positive upward) +!! +!! Example implementations: +!! +!! ! Example 1: Constant uniform wind +!! Velocity(1) = 10.0_ReKi ! m/s +!! Velocity(2) = 0.0_ReKi +!! Velocity(3) = 0.0_ReKi +!! +!! ! Example 2: Power-law wind profile +!! if (Position(3) > 0.0_ReKi) then +!! Velocity(1) = UF%Data(1,1) * (Position(3)/UF%RefHeight)**0.2_ReKi +!! Velocity(2) = 0.0_ReKi +!! Velocity(3) = 0.0_ReKi +!! else +!! call SetErrStat(ErrID_Fatal, \"Position below ground\", ErrStat, ErrMsg, RoutineName) +!! end if +!! +!! ! Example 3: Time-varying wind from data array +!! call InterpolateInTime(UF%DTime, UF%Data, Time, Velocity, ErrStat, ErrMsg) +!! +!! @param UF User field data structure (populated in IfW_User_Init) +!! @param Time Current simulation time (seconds) +!! @param Position Position vector [X, Y, Z] where velocity is needed (meters) +!! @param Velocity Output velocity vector [U, V, W] (m/s) +!! @param ErrStat Error status +!! @param ErrMsg Error message if ErrStat /= ErrID_None subroutine UserField_GetVel(UF, Time, Position, Velocity, ErrStat, ErrMsg) type(UserFieldType), intent(in) :: UF !< user-field data @@ -1753,8 +1783,26 @@ subroutine UserField_GetVel(UF, Time, Position, Velocity, ErrStat, ErrMsg) ErrStat = ErrID_None ErrMsg = "" + !--------------------------------------------------------------------------- + ! TODO: Implement your user-defined wind velocity calculation here + !--------------------------------------------------------------------------- + + ! Default: return zero velocity and error message Velocity = 0.0_ReKi - call SetErrStat(ErrID_Fatal, "UserField_GetVel not implemented", ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, "UserField_GetVel not implemented. "// & + "To use user-defined wind (WindType=6), you must implement "// & + "this function in IfW_FlowField.f90.", ErrStat, ErrMsg, RoutineName) + + ! Remove the error statement above and add your implementation, for example: + ! + ! ! Simple power-law profile + ! if (Position(3) > 0.0_ReKi) then + ! Velocity(1) = 10.0_ReKi * (Position(3) / UF%RefHeight)**0.2_ReKi + ! Velocity(2) = 0.0_ReKi + ! Velocity(3) = 0.0_ReKi + ! else + ! Velocity = 0.0_ReKi + ! end if end subroutine diff --git a/modules/inflowwind/src/IfW_FlowField.txt b/modules/inflowwind/src/IfW_FlowField.txt index 28d1fc208d..24f32e485b 100644 --- a/modules/inflowwind/src/IfW_FlowField.txt +++ b/modules/inflowwind/src/IfW_FlowField.txt @@ -102,8 +102,26 @@ typedef ^ ^ ReKi RefHeight #---------------------------------------------------------------------------------------------------------------------------------- typedef ^ PointsFieldType ReKi Vel :: - - "Point velocities populated by external driver [uvw,point]" - +#---------------------------------------------------------------------------------------------------------------------------------- +# UserFieldType: Data structure for user-defined wind field +# +# This type allows users to implement custom wind field models by populating this structure +# and implementing the UserField_GetVel() function in IfW_FlowField.f90. +# +# To implement a custom wind field: +# 1. Add necessary data fields to this type definition +# 2. Initialize these fields in IfW_User_Init() in InflowWind_IO.f90 +# 3. Implement UserField_GetVel() to return velocities at any (x,y,z,t) position +# +# Example use cases: +# - Analytical wind models (e.g., vortex, wake models) +# - Custom wind profiles +# - Coupling to external wind solvers +# - Real-time wind measurements #---------------------------------------------------------------------------------------------------------------------------------- typedef ^ UserFieldType ReKi RefHeight - - - "reference height; used to center the wind" meters +typedef ^ ^ DbKi DTime : - - "time array for user-defined wind" seconds +typedef ^ ^ ReKi Data :: - - "user-defined wind data array [NumDataLines, NumDataColumns]" - #---------------------------------------------------------------------------------------------------------------------------------- typedef ^ FlowFieldType IntKi FieldType - 0 - "Switch for flow field type {1=Uniform, 2=Grid, 3=User, 4=External}" - diff --git a/modules/inflowwind/src/IfW_FlowField_Types.f90 b/modules/inflowwind/src/IfW_FlowField_Types.f90 index 5ffe11616d..8bbb8dbdc2 100644 --- a/modules/inflowwind/src/IfW_FlowField_Types.f90 +++ b/modules/inflowwind/src/IfW_FlowField_Types.f90 @@ -33,12 +33,12 @@ MODULE IfW_FlowField_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: Undef_FieldType = 0 ! This is the code for an undefined FieldType [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Uniform_FieldType = 1 ! Uniform FieldType from SteadyWind or Uniform Wind [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Grid3D_FieldType = 2 ! 3D Grid FieldType from TurbSim, Bladed, HAWC [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Grid4D_FieldType = 3 ! 4D Grid FieldType from FAST.Farm [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Point_FieldType = 4 ! Points FieldType from ExtInflow [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: User_FieldType = 5 ! User FieldType configured by the user [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Undef_FieldType = 0 ! This is the code for an undefined FieldType [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Uniform_FieldType = 1 ! Uniform FieldType from SteadyWind or Uniform Wind [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Grid3D_FieldType = 2 ! 3D Grid FieldType from TurbSim, Bladed, HAWC [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Grid4D_FieldType = 3 ! 4D Grid FieldType from FAST.Farm [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Point_FieldType = 4 ! Points FieldType from ExtInflow [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: User_FieldType = 5 ! User FieldType configured by the user [-] ! ========= UniformFieldType ======= TYPE, PUBLIC :: UniformFieldType REAL(ReKi) :: RefHeight = 0.0_ReKi !< reference height; used to center the wind [meters] @@ -144,6 +144,8 @@ MODULE IfW_FlowField_Types ! ========= UserFieldType ======= TYPE, PUBLIC :: UserFieldType REAL(ReKi) :: RefHeight = 0.0_ReKi !< reference height; used to center the wind [meters] + REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: DTime !< time array for user-defined wind [seconds] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Data !< user-defined wind data array [NumDataLines, NumDataColumns] [-] END TYPE UserFieldType ! ======================= ! ========= FlowFieldType ======= @@ -164,7 +166,8 @@ MODULE IfW_FlowField_Types TYPE(UserFieldType) :: User !< User Field Wind Data [-] END TYPE FlowFieldType ! ======================= -CONTAINS + +contains subroutine IfW_FlowField_CopyUniformFieldType(SrcUniformFieldTypeData, DstUniformFieldTypeData, CtrlCode, ErrStat, ErrMsg) type(UniformFieldType), intent(in) :: SrcUniformFieldTypeData @@ -953,10 +956,36 @@ subroutine IfW_FlowField_CopyUserFieldType(SrcUserFieldTypeData, DstUserFieldTyp integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 character(*), parameter :: RoutineName = 'IfW_FlowField_CopyUserFieldType' ErrStat = ErrID_None ErrMsg = '' DstUserFieldTypeData%RefHeight = SrcUserFieldTypeData%RefHeight + if (allocated(SrcUserFieldTypeData%DTime)) then + LB(1:1) = lbound(SrcUserFieldTypeData%DTime) + UB(1:1) = ubound(SrcUserFieldTypeData%DTime) + if (.not. allocated(DstUserFieldTypeData%DTime)) then + allocate(DstUserFieldTypeData%DTime(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstUserFieldTypeData%DTime.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstUserFieldTypeData%DTime = SrcUserFieldTypeData%DTime + end if + if (allocated(SrcUserFieldTypeData%Data)) then + LB(1:2) = lbound(SrcUserFieldTypeData%Data) + UB(1:2) = ubound(SrcUserFieldTypeData%Data) + if (.not. allocated(DstUserFieldTypeData%Data)) then + allocate(DstUserFieldTypeData%Data(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstUserFieldTypeData%Data.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstUserFieldTypeData%Data = SrcUserFieldTypeData%Data + end if end subroutine subroutine IfW_FlowField_DestroyUserFieldType(UserFieldTypeData, ErrStat, ErrMsg) @@ -966,6 +995,12 @@ subroutine IfW_FlowField_DestroyUserFieldType(UserFieldTypeData, ErrStat, ErrMsg character(*), parameter :: RoutineName = 'IfW_FlowField_DestroyUserFieldType' ErrStat = ErrID_None ErrMsg = '' + if (allocated(UserFieldTypeData%DTime)) then + deallocate(UserFieldTypeData%DTime) + end if + if (allocated(UserFieldTypeData%Data)) then + deallocate(UserFieldTypeData%Data) + end if end subroutine subroutine IfW_FlowField_PackUserFieldType(RF, Indata) @@ -974,6 +1009,8 @@ subroutine IfW_FlowField_PackUserFieldType(RF, Indata) character(*), parameter :: RoutineName = 'IfW_FlowField_PackUserFieldType' if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%RefHeight) + call RegPackAlloc(RF, InData%DTime) + call RegPackAlloc(RF, InData%Data) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -981,8 +1018,13 @@ subroutine IfW_FlowField_UnPackUserFieldType(RF, OutData) type(RegFile), intent(inout) :: RF type(UserFieldType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'IfW_FlowField_UnPackUserFieldType' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%RefHeight); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%DTime); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Data); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine IfW_FlowField_CopyFlowFieldType(SrcFlowFieldTypeData, DstFlowFieldTypeData, CtrlCode, ErrStat, ErrMsg) @@ -1085,5 +1127,7 @@ subroutine IfW_FlowField_UnPackFlowFieldType(RF, OutData) call IfW_FlowField_UnpackPointsFieldType(RF, OutData%Points) ! Points call IfW_FlowField_UnpackUserFieldType(RF, OutData%User) ! User end subroutine + END MODULE IfW_FlowField_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/inflowwind/src/InflowWind.f90 b/modules/inflowwind/src/InflowWind.f90 index 22796ed0dc..b2eb702eee 100644 --- a/modules/inflowwind/src/InflowWind.f90 +++ b/modules/inflowwind/src/InflowWind.f90 @@ -57,7 +57,8 @@ MODULE InflowWind PUBLIC :: InflowWind_JacobianPContState PUBLIC :: InflowWind_JacobianPDiscState PUBLIC :: InflowWind_JacobianPConstrState - PUBLIC :: InflowWind_GetOP + PUBLIC :: InflowWind_PackExtInputAry + PUBLIC :: InflowWind_PackExtOutputAry CONTAINS !==================================================================================================== @@ -335,6 +336,8 @@ SUBROUTINE InflowWind_Init( InitInp, InputGuess, p, ContStates, DiscStates, Cons case (User_WindNumber) p%FlowField%FieldType = User_FieldType + User_InitInput%WindFileName = '' + User_InitInput%RefHt = 0.0_ReKi call IfW_User_Init(User_InitInput, SumFileUnit, p%FlowField%User, InitOutData%WindFileInfo, TmpErrStat, TmpErrMsg); if (Failed()) return ! Set reference position for wind rotation @@ -441,6 +444,13 @@ SUBROUTINE InflowWind_Init( InitInp, InputGuess, p, ContStates, DiscStates, Cons InitOutData%WriteOutputHdr = p%OutParam(1:p%NumOuts)%Name InitOutData%WriteOutputUnt = p%OutParam(1:p%NumOuts)%Units + !---------------------------------------------------------------------------- + ! Module Variables + !---------------------------------------------------------------------------- + + call IfW_InitVars(InitOutData%Vars, InitInp, p, y, m, InitOutData, InitInp%Linearize, TmpErrStat, TmpErrMsg) + call SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + !---------------------------------------------------------------------------- ! Linearization !---------------------------------------------------------------------------- @@ -457,36 +467,6 @@ SUBROUTINE InflowWind_Init( InitInp, InputGuess, p, ContStates, DiscStates, Cons return end if end if - - ! also need to add InputGuess%HubOrientation to the u%Linear items - CALL AllocAry(InitOutData%LinNames_u, NumExtendedIO, 'LinNames_u', TmpErrStat, TmpErrMsg); if (Failed()) return - CALL AllocAry(InitOutData%RotFrame_u, NumExtendedIO, 'RotFrame_u', TmpErrStat, TmpErrMsg); if (Failed()) return - CALL AllocAry(InitOutData%IsLoad_u, NumExtendedIO, 'IsLoad_u', TmpErrStat, TmpErrMsg); if (Failed()) return - CALL AllocAry(InitOutData%LinNames_y, NumExtendedIO + p%NumOuts, 'LinNames_y', TmpErrStat, TmpErrMsg); if (Failed()) return - CALL AllocAry(InitOutData%RotFrame_y, NumExtendedIO + p%NumOuts, 'RotFrame_y', TmpErrStat, TmpErrMsg); if (Failed()) return - - ! Extended Inputs - Lin_Indx = 0 - InitOutData%LinNames_u(Lin_Indx + 1) = 'Extended input: horizontal wind speed (steady/uniform wind), m/s' - InitOutData%LinNames_u(Lin_Indx + 2) = 'Extended input: vertical power-law shear exponent, -' - InitOutData%LinNames_u(Lin_Indx + 3) = 'Extended input: propagation direction, rad' - - ! Extended Outputs - Lin_Indx = 0 - InitOutData%LinNames_y(Lin_Indx + 1) = 'Extended output: horizontal wind speed (steady/uniform wind), m/s' - InitOutData%LinNames_y(Lin_Indx + 2) = 'Extended output: vertical power-law shear exponent, -' - InitOutData%LinNames_y(Lin_Indx + 3) = 'Extended output: propagation direction, rad' - - ! Outputs - do i=1,p%NumOuts - InitOutData%LinNames_y(i+NumExtendedIO) = trim(p%OutParam(i)%Name)//', '//p%OutParam(i)%Units - end do - - ! IfW inputs and outputs are in the global, not rotating frame - InitOutData%RotFrame_u = .false. - InitOutData%RotFrame_y = .false. - InitOutData%IsLoad_u = .false. ! IfW inputs for linearization are not loads - end if ! Set the version information in InitOutData @@ -522,6 +502,84 @@ logical function Failed() end function Failed END SUBROUTINE InflowWind_Init +subroutine IfW_InitVars(Vars, InitInp, p, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(ModVarsType), intent(out) :: Vars !< Module variables + type(InflowWind_InitInputType), intent(in) :: InitInp !< Initialization input + type(InflowWind_ParameterType), intent(inout) :: p !< Parameters + type(InflowWind_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(InflowWind_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(InflowWind_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'MAP_InitVars' + integer(IntKi) :: ErrStat2 ! Temporary Error status + character(ErrMsgLen) :: ErrMsg2 ! Temporary Error message + integer(IntKi) :: i + real(R8Ki) :: Perturb + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + call MV_AddVar(Vars%u, "HWindSpeed", FieldScalar, DatLoc(InflowWind_u_HWindSpeed), & + Flags=ior(VF_ExtLin, VF_Linearize), & + LinNames=['Extended input: horizontal wind speed (steady/uniform wind) (hub), m/s']) + + call MV_AddVar(Vars%u, "PLExp", FieldScalar, DatLoc(InflowWind_u_PLExp), & + Flags=ior(VF_ExtLin, VF_Linearize), & + LinNames=['Extended input: vertical power-law shear exponent (hub), -']) + + call MV_AddVar(Vars%u, "PropagationDir", FieldScalar, DatLoc(InflowWind_u_PropagationDir), & + Flags=ior(VF_ExtLin, VF_Linearize), & + LinNames=['Extended input: propagation direction (hub), rad']) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddVar(Vars%y, "HWindSpeed", FieldScalar, DatLoc(InflowWind_y_HWindSpeed), & + Flags=VF_ExtLin, & + LinNames=['Extended output: horizontal wind speed (steady/uniform wind) (hub), m/s']) + + call MV_AddVar(Vars%y, "PLExp", FieldScalar, DatLoc(InflowWind_y_PLExp), & + Flags=VF_ExtLin, & + LinNames=['Extended output: vertical power-law shear exponent (hub), -']) + + call MV_AddVar(Vars%y, "PropagationDir", FieldScalar, DatLoc(InflowWind_y_PropagationDir), & + Flags=VF_ExtLin, & + LinNames=['Extended output: propagation direction (hub), rad']) + + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, DatLoc(InflowWind_y_WriteOutput), & + Flags=VF_WriteOut, & + Num=p%NumOuts, & + LinNames=[(WriteOutputLinName(i), i = 1, p%NumOuts)]) + + !---------------------------------------------------------------------------- + ! Initialize Variables and Jacobian data + !---------------------------------------------------------------------------- + + CALL MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + +contains + character(LinChanLen) function WriteOutputLinName(idx) + integer(IntKi), intent(in) :: idx + WriteOutputLinName = trim(InitOut%WriteOutputHdr(idx))//', '//trim(InitOut%WriteOutputUnt(idx)) + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + !==================================================================================================== !> This routine takes an input dataset of type InputType which contains a position array of dimensions 3*n. It then calculates @@ -669,7 +727,8 @@ END SUBROUTINE InflowWind_End !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and dZ/du are returned. -SUBROUTINE InflowWind_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu ) +SUBROUTINE InflowWind_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu ) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module information REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(InflowWind_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(InflowWind_ParameterType), INTENT(IN ) :: p !< Parameters @@ -686,20 +745,21 @@ SUBROUTINE InflowWind_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrSt REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) - ! local variables: - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary error message - CHARACTER(*), PARAMETER :: RoutineName = 'InflowWind_JacobianPInput' - REAL(R8Ki) :: local_dYdu(3,NumExtendedIO) - integer :: i,j, n - integer :: i_start, i_end ! indices for input/output start and end - integer :: node, comp + CHARACTER(*), PARAMETER :: RoutineName = 'InflowWind_JacobianPInput' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary error message + REAL(R8Ki) :: local_dYdu(3, NumExtendedIO) + integer :: i, j, n + integer :: i_start, i_end ! indices for input/output start and end + integer :: node, comp - ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' - IF ( PRESENT( dYdu ) ) THEN + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + ! - inputs are extended inputs only + ! - outputs are the extended outputs and the WriteOutput values + if (present(dYdu)) then ! If dYdu is allocated, make sure it is the correct size if (allocated(dYdu)) then @@ -707,54 +767,59 @@ SUBROUTINE InflowWind_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrSt if (size(dYdu,2) /= NumExtendedIO) deallocate (dYdu) endif - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: - ! - inputs are extended inputs only - ! - outputs are the extended outputs and the WriteOutput values - if (.not. ALLOCATED(dYdu)) then - CALL AllocAry( dYdu, NumExtendedIO + p%NumOuts, NumExtendedIO, 'dYdu', ErrStat2, ErrMsg2 ) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (.not. allocated(dYdu)) then + call AllocAry(dYdu, NumExtendedIO + p%NumOuts, NumExtendedIO, 'dYdu', ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end if - - SELECT CASE ( p%FlowField%FieldType ) - CASE (Uniform_FieldType) - dYdu = 0.0_R8Ki ! initialize all non-diagonal entries to zero (position of node effects the output of only that node) + ! Switch based on type of flowfield + select case (p%FlowField%FieldType) + case (Uniform_FieldType) + + ! Initialize all non-diagonal entries to zero (position of node effects the output of only that node) + dYdu = 0.0_R8Ki ! Extended inputs to extended outputs (direct pass-through) - do i=1,NumExtendedIO + do i = 1, NumExtendedIO dYdu(i,i) = 1.0_R8Ki enddo ! WriteOutput velocities (note: may not have all of the components of each point) - do i=1, p%NumOuts + do i = 1, p%NumOuts + node = p%OutParamLinIndx(1,i) ! output node comp = p%OutParamLinIndx(2,i) ! component of output node if (node > 0) then - call IfW_UniformWind_JacobianPInput( p%FlowField%Uniform, t, p%WindViXYZ(:,node), p%FlowField%RotToWind(1,1), p%FlowField%RotToWind(2,1), local_dYdu ) + call IfW_UniformWind_JacobianPInput(p%FlowField%Uniform, t, p%WindViXYZ(:,node), & + p%FlowField%RotToWind(1,1), & + p%FlowField%RotToWind(2,1), & + local_dYdu) else local_dYdu = 0.0_R8Ki comp = 1 end if - dYdu(NumExtendedIO+i, 1:NumExtendedIO) = p%OutParam(i)%SignM * local_dYdu( comp , 1:NumExtendedIO) + + dYdu(NumExtendedIO+i, 1:NumExtendedIO) = p%OutParam(i)%SignM * local_dYdu(comp, 1:NumExtendedIO) + end do - CASE DEFAULT - END SELECT - END IF + end select + end if - IF ( PRESENT( dXdu ) ) THEN + if (present(dXdu)) then if (allocated(dXdu)) deallocate(dXdu) - END IF + end if - IF ( PRESENT( dXddu ) ) THEN + if (present(dXddu)) then if (allocated(dXddu)) deallocate(dXddu) - END IF + end if - IF ( PRESENT( dZdu ) ) THEN + if (present(dZdu)) then if (allocated(dZdu)) deallocate(dZdu) - END IF + end if + END SUBROUTINE InflowWind_JacobianPInput @@ -843,7 +908,8 @@ END SUBROUTINE IfW_UniformWind_JacobianPInput !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. !! Note: there are no states, so this routine is simply a placeholder to satisfy the framework and automate some glue code -SUBROUTINE InflowWind_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +SUBROUTINE InflowWind_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(InflowWind_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(InflowWind_ParameterType), INTENT(IN ) :: p !< Parameters @@ -864,7 +930,6 @@ SUBROUTINE InflowWind_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, E ErrStat = ErrID_None ErrMsg = '' - return ! IF ( PRESENT( dYdx ) ) THEN ! END IF ! IF ( PRESENT( dXdx ) ) THEN @@ -878,7 +943,8 @@ END SUBROUTINE InflowWind_JacobianPContState !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the discrete states (xd). The partial derivatives dY/dxd, dX/dxd, dXd/dxd, and dZ/dxd are returned. !! Note: there are no states, so this routine is simply a placeholder to satisfy the framework and automate some glue code -SUBROUTINE InflowWind_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) +SUBROUTINE InflowWind_JacobianPDiscState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(InflowWind_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(InflowWind_ParameterType), INTENT(IN ) :: p !< Parameters @@ -899,8 +965,6 @@ SUBROUTINE InflowWind_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, E ErrStat = ErrID_None ErrMsg = '' - return - ! IF ( PRESENT( dYdxd ) ) THEN ! END IF ! IF ( PRESENT( dXdxd ) ) THEN @@ -914,7 +978,8 @@ END SUBROUTINE InflowWind_JacobianPDiscState !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the constraint states (z). The partial derivatives dY/dz, dX/dz, dXd/dz, and dZ/dz are returned. !! Note: there are no states, so this routine is simply a placeholder to satisfy the framework and automate some glue code -SUBROUTINE InflowWind_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) +SUBROUTINE InflowWind_JacobianPConstrState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(InflowWind_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(InflowWind_ParameterType), INTENT(IN ) :: p !< Parameters @@ -935,8 +1000,6 @@ SUBROUTINE InflowWind_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat = ErrID_None ErrMsg = '' - return - ! IF ( PRESENT( dYdz ) ) THEN ! END IF ! IF ( PRESENT( dXdz ) ) THEN @@ -946,78 +1009,89 @@ SUBROUTINE InflowWind_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ! IF ( PRESENT( dZdz ) ) THEN ! END IF END SUBROUTINE InflowWind_JacobianPConstrState -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE InflowWind_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(InflowWind_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(InflowWind_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(InflowWind_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(InflowWind_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(InflowWind_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(InflowWind_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(InflowWind_OutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(InflowWind_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - - INTEGER(IntKi) :: i - real(ReKi) :: tmp_op(NumExtendedIO) - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'InflowWind_GetOP' - - - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = '' - ! Since both u_op and y_op need this, calculate it up front - if (present(u_op) .or. present(y_op)) then - call IfW_UniformWind_GetOP( p%FlowField%Uniform, t, p%FlowField%VelInterpCubic, tmp_op ) - tmp_op(3) = p%FlowField%PropagationDir + tmp_op(3) ! include the AngleH from Uniform Wind input files - endif - - if ( PRESENT( u_op ) ) then - if (.not. allocated(u_op)) then - call AllocAry(u_op, NumExtendedIO, 'u_op', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) return +subroutine InflowWind_PackExtInputAry(Vars, t, p, ValAry) + type(ModVarsType), intent(in) :: Vars + real(DbKi), intent(in) :: t !< Time in seconds at operating point + type(InflowWind_ParameterType), intent(in) :: p !< Parameters + real(R8Ki), intent(inout) :: ValAry(:) + type(UniformField_Interp) :: op !< Interpolated values of UniformField + integer(IntKi) :: i + logical :: first + first = .true. + do i = 1, size(Vars%u) + associate(Var => Vars%u(i)) + select case(Var%DL%Num) + case (InflowWind_u_HWindSpeed) + call CalcExtOP() + ValAry(Var%iLoc(1)) = op%VelH + case (InflowWind_u_PLExp) + call CalcExtOP() + ValAry(Var%iLoc(1)) = op%ShrV + case (InflowWind_u_PropagationDir) + call CalcExtOP() + ValAry(Var%iLoc(1)) = op%AngleH + p%FlowField%PropagationDir + end select + end associate + end do +contains + subroutine CalcExtOP() + if (.not. first) return + first = .false. + if (p%FlowField%FieldType == Uniform_FieldType) then + if (P%FlowField%VelInterpCubic) then + op = UniformField_InterpCubic(p%FlowField%Uniform, t) + else + op = UniformField_InterpLinear(p%FlowField%Uniform, t) + end if + else + op%VelH = 0.0_ReKi + op%ShrV = 0.0_ReKi + op%AngleH = 0.0_ReKi end if - - u_op(1:NumExtendedIO) = tmp_op(1:NumExtendedIO) - - end if - - if ( PRESENT( y_op ) ) then - if (.not. allocated(y_op)) then - call AllocAry(y_op, NumExtendedIO + p%NumOuts, 'y_op', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) return + end subroutine +end subroutine + +subroutine InflowWind_PackExtOutputAry(Vars, t, p, ValAry) + type(ModVarsType), intent(in) :: Vars + real(DbKi), intent(in) :: t !< Time in seconds at operating point + type(InflowWind_ParameterType), intent(in) :: p !< Parameters + real(R8Ki), intent(inout) :: ValAry(:) + type(UniformField_Interp) :: op !< Interpolated values of UniformField + integer(IntKi) :: i + logical :: first + first = .true. + do i = 1, size(Vars%y) + associate(Var => Vars%y(i)) + select case(Var%DL%Num) + case (InflowWind_y_HWindSpeed) + call CalcExtOP() + ValAry(Var%iLoc(1)) = op%VelH + case (InflowWind_y_PLExp) + call CalcExtOP() + ValAry(Var%iLoc(1)) = op%ShrV + case (InflowWind_y_PropagationDir) + call CalcExtOP() + ValAry(Var%iLoc(1)) = op%AngleH + p%FlowField%PropagationDir + end select + end associate + end do +contains + subroutine CalcExtOP() + if (.not. first) return + first = .false. + if (p%FlowField%FieldType == Uniform_FieldType) then + if (P%FlowField%VelInterpCubic) then + op = UniformField_InterpCubic(p%FlowField%Uniform, t) + else + op = UniformField_InterpLinear(p%FlowField%Uniform, t) + end if + else + op%VelH = 0.0_ReKi + op%ShrV = 0.0_ReKi + op%AngleH = 0.0_ReKi end if - - y_op(1:NumExtendedIO) = tmp_op(1:NumExtendedIO) - do i=1,p%NumOuts - y_op(NumExtendedIO + i) = y%WriteOutput( i ) - end do - end if - - return - -! IF ( PRESENT( x_op ) ) THEN -! END IF -! IF ( PRESENT( dx_op ) ) THEN -! END IF -! IF ( PRESENT( xd_op ) ) THEN -! END IF -! IF ( PRESENT( z_op ) ) THEN -! END IF -END SUBROUTINE InflowWind_GetOP + end subroutine +end subroutine END MODULE InflowWind diff --git a/modules/inflowwind/src/InflowWind.txt b/modules/inflowwind/src/InflowWind.txt index 0d8e864446..e7ce18ebc2 100644 --- a/modules/inflowwind/src/InflowWind.txt +++ b/modules/inflowwind/src/InflowWind.txt @@ -28,6 +28,13 @@ param ^ - IntKi Highest_Win param ^ - IntKi IfW_NumPtsAvg - 144 - "Number of points averaged for rotor-average wind speed" - +param ^ - IntKi InflowWind_u_HWindSpeed - -1 - "DatLoc number for HWindSpeed extended input" - +param ^ - IntKi InflowWind_u_PLExp - -2 - "DatLoc number for PLExp extended input" - +param ^ - IntKi InflowWind_u_PropagationDir - -3 - "DatLoc number for PropagationDir extended input" - +param ^ - IntKi InflowWind_y_HWindSpeed - -4 - "DatLoc number for HWindSpeed extended output" - +param ^ - IntKi InflowWind_y_PLExp - -5 - "DatLoc number for PLExp extended output" - +param ^ - IntKi InflowWind_y_PropagationDir - -6 - "DatLoc number for PropagationDir extended output" - + ######################### # ..... Input file data ........................................................................................................... # This is data defined in the Input File for this module (or could otherwise be passed in) @@ -107,12 +114,8 @@ typedef ^ InitOutputType CHARACTER(ChanLen) WriteO typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt : - - "Units of output-to-file channels" - typedef ^ ^ ProgDesc Ver - - - "Version information of InflowWind module" - typedef ^ ^ WindFileDat WindFileInfo - - - "Meta data from the wind file" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -typedef ^ ^ LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - -typedef ^ ^ LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - -typedef ^ ^ LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix)" - -typedef ^ ^ FlowFieldType *FlowField - - - "Flow field data to represent all wind types" - +typedef ^ ^ FlowFieldType *FlowField - - - "Flow field data to represent all wind types" - +typedef ^ ^ ModVarsType Vars - - - "Module Variables" # ..... Parameters ................................................................................................................ @@ -168,3 +171,4 @@ typedef ^ ^ InflowWind_InputType u_Avg typedef ^ ^ InflowWind_OutputType y_Avg - - - "outputs for computing rotor-averaged values" - typedef ^ ^ InflowWind_InputType u_Hub - - - "inputs for computing hub values" - typedef ^ ^ InflowWind_OutputType y_Hub - - - "outputs for computing hub values" - +typedef ^ ^ ModJacType Jac - - - "Values corresponding to module variables" - diff --git a/modules/inflowwind/src/InflowWind_Driver_Types.f90 b/modules/inflowwind/src/InflowWind_Driver_Types.f90 index 6768f63819..70d5f39cb3 100644 --- a/modules/inflowwind/src/InflowWind_Driver_Types.f90 +++ b/modules/inflowwind/src/InflowWind_Driver_Types.f90 @@ -98,7 +98,8 @@ MODULE InflowWind_Driver_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: OutWindX !< X coordinates of YZ planes for output [1 to NOutWindYZ] [unused for NOutWindYZ=0] [(m)] END TYPE IfWDriver_Settings ! ======================= -CONTAINS + +contains subroutine InflowWind_Driver_CopyOutputFile(SrcOutputFileData, DstOutputFileData, CtrlCode, ErrStat, ErrMsg) type(OutputFile), intent(in) :: SrcOutputFileData @@ -429,5 +430,7 @@ subroutine InflowWind_Driver_UnPackIfWDriver_Settings(RF, OutData) call RegUnpack(RF, OutData%NOutWindYZ); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%OutWindX); if (RegCheckErr(RF, RoutineName)) return end subroutine + END MODULE InflowWind_Driver_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/inflowwind/src/InflowWind_IO.f90 b/modules/inflowwind/src/InflowWind_IO.f90 index 83e68fa1c9..40279b6a38 100644 --- a/modules/inflowwind/src/InflowWind_IO.f90 +++ b/modules/inflowwind/src/InflowWind_IO.f90 @@ -34,7 +34,8 @@ module InflowWind_IO IfW_HAWC_Init, & IfW_User_Init, & IfW_Grid4D_Init, & - IfW_Points_Init + IfW_Points_Init, & + IfW_SteadyFlowField_Init public :: Uniform_WriteHH, & Grid3D_WriteBladed, & @@ -87,7 +88,7 @@ subroutine IfW_SteadyWind_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrMs ErrStat = ErrID_None ErrMsg = "" - ! Set parameters from inititialization input + ! Set parameters from initialization input UF%DataSize = 1 UF%RefHeight = InitInp%RefHt UF%RefLength = 1.0_ReKi @@ -152,6 +153,73 @@ subroutine IfW_SteadyWind_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrMs end subroutine +subroutine IfW_SteadyFlowField_Init(FF, RefHt, HWindSpeed, PLExp, ErrStat, ErrMsg, AngleH) + use InflowWind_IO_Types, only: Steady_InitInputType, WindFileDat + type(FlowFieldType), pointer, intent(inout) :: FF !< FlowField + real(ReKi), intent(in) :: RefHt !< Hub reference height + real(ReKi), intent(in) :: HWindSpeed !< Horizontal wind speed at reference height + real(ReKi), intent(in) :: PLExp !< Power law shear coefficient + integer(IntKi), intent(out) :: ErrStat !< Error status + character(*), intent(out) :: ErrMsg !< Error message + real(ReKi), optional, intent(in) :: AngleH !< Horizontal angle + + character(*), parameter :: RoutineName = 'IfW_SteadyFlowField_Init' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + type(Steady_InitInputType) :: InitInp + type(WindFileDat) :: WFileDat + + ErrStat = ErrID_None + ErrMsg = "" + + ! If FlowField pointer is already associated, destroy existing flow field; + ! otherwise, allocate a new flow field for pointer + if (associated(FF)) then + call IfW_FlowField_DestroyFlowFieldType(FF, ErrStat2, ErrMsg2); if (Failed()) return + else + allocate(FF, stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating flow field', ErrStat, ErrMsg, RoutineName) + return + end if + end if + + ! Set flow-field type to uniform + FF%FieldType = Uniform_FieldType + + ! Set parameters from initialization input + FF%Uniform%DataSize = 1 + FF%Uniform%RefHeight = RefHt + FF%Uniform%RefLength = 1.0_ReKi + + ! Allocate uniform wind data arrays + call UniformWind_AllocArrays(FF%Uniform, ErrStat2, ErrMsg2); if (Failed()) return + + ! Set data values + FF%Uniform%Time = 0.0_ReKi + FF%Uniform%VelH = HWindSpeed + FF%Uniform%VelV = 0.0_ReKi + FF%Uniform%VelGust = 0.0_ReKi + if (present(AngleH)) then + FF%Uniform%AngleH = AngleH + else + FF%Uniform%AngleH = 0.0_ReKi + end if + FF%Uniform%AngleV = 0.0_ReKi + FF%Uniform%ShrH = 0.0_ReKi + FF%Uniform%ShrV = PLExp + FF%Uniform%LinShrV = 0.0_ReKi + + + + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + !> IfW_UniformWind_Init initializes a Uniform field from file. subroutine IfW_UniformWind_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrMsg) type(Uniform_InitInputType), intent(in) :: InitInp @@ -178,7 +246,7 @@ subroutine IfW_UniformWind_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrM ErrStat = ErrID_None ErrMsg = "" - ! Set parameters from inititialization input + ! Set parameters from initialization input UF%RefHeight = InitInp%RefHt UF%RefLength = InitInp%RefLength @@ -1009,7 +1077,29 @@ subroutine IfW_HAWC_Init(InitInp, SumFileUnit, G3D, FileDat, ErrStat, ErrMsg) end subroutine -!> User_Init initializes a user defined wind field. +!> IfW_User_Init initializes a user-defined wind field. +!! +!! This subroutine serves as a template for implementing custom wind fields in InflowWind. +!! Users should modify this routine to: +!! 1. Read any necessary input files or parameters from InitInp +!! 2. Allocate and populate the UserFieldType (UF) data structure +!! 3. Set appropriate metadata in the WindFileDat structure +!! +!! The wind velocities at any position and time will be calculated by UserField_GetVel() +!! in IfW_FlowField.f90, which should be implemented consistently with the data loaded here. +!! +!! Example implementations might include: +!! - Reading time-varying wind data from a custom file format +!! - Setting up parameters for an analytical wind model +!! - Initializing connection to an external wind solver +!! - Loading measured wind data from sensors +!! +!! @param InitInp Initialization inputs (extend User_InitInputType to include necessary parameters) +!! @param SumFileUnit Summary file unit for writing initialization information +!! @param UF User field data structure to be populated +!! @param FileDat Wind file metadata structure +!! @param ErrStat Error status of the operation +!! @param ErrMsg Error message if ErrStat /= ErrID_None subroutine IfW_User_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrMsg) type(User_InitInputType), intent(in) :: InitInp @@ -1020,14 +1110,66 @@ subroutine IfW_User_Init(InitInp, SumFileUnit, UF, FileDat, ErrStat, ErrMsg) character(*), intent(out) :: ErrMsg character(*), parameter :: RoutineName = "IfW_User_Init" + integer(IntKi) :: TmpErrStat + character(ErrMsgLen) :: TmpErrMsg + ! Add local variables as needed for your implementation ErrStat = ErrID_None ErrMsg = "" - UF%RefHeight = 0.0_Reki + !--------------------------------------------------------------------------- + ! TODO: Add your user-defined wind field initialization here + !--------------------------------------------------------------------------- + + ! Example: Set reference height (after regenerating types from registry) + ! UF%RefHeight = InitInp%RefHt + UF%RefHeight = InitInp%RefHt ! Temporary: set to sensible default + + ! Example: Store filename if reading from file (after regenerating types) + ! UF%FileName = InitInp%WindFileName + + ! Example: Allocate and read data arrays if needed + ! if (len_trim(InitInp%WindFileName) > 0) then + ! call ReadUserWindFile(InitInp%WindFileName, UF, TmpErrStat, TmpErrMsg) + ! call SetErrStat(TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName) + ! if (ErrStat >= AbortErrLev) return + ! end if + + !--------------------------------------------------------------------------- + ! Set wind file metadata + !--------------------------------------------------------------------------- + + FileDat%FileName = "" ! Set to InitInp%WindFileName after regenerating types + FileDat%WindType = 6 ! User-defined wind + FileDat%RefHt = UF%RefHeight + FileDat%RefHt_Set = .true. + FileDat%DT = 0.0_ReKi ! Set appropriately if time-varying + FileDat%NumTSteps = 0 ! Set appropriately if time-varying + FileDat%ConstantDT = .false. + FileDat%TRange = [0.0_ReKi, 0.0_ReKi] ! Set time range if applicable + FileDat%TRange_Limited = .false. + FileDat%YRange = [0.0_ReKi, 0.0_ReKi] ! Set spatial range if applicable + FileDat%YRange_Limited = .false. + FileDat%ZRange = [0.0_ReKi, 0.0_ReKi] ! Set spatial range if applicable + FileDat%ZRange_Limited = .false. + FileDat%BinaryFormat = 0_IntKi + FileDat%IsBinary = .false. + FileDat%TI = [0.0_ReKi, 0.0_ReKi, 0.0_ReKi] ! Set turbulence intensity if known + FileDat%TI_listed = .false. + FileDat%MWS = 0.0_ReKi ! Set mean wind speed if known + !--------------------------------------------------------------------------- + ! Write to summary file + !--------------------------------------------------------------------------- + if (SumFileUnit > 0) then - write (SumFileUnit, '(A)') UF%RefHeight + write(SumFileUnit, '(A)') 'User-defined wind type selected' + write(SumFileUnit, '(A34,G12.4)') ' Reference height (m): ', UF%RefHeight + ! After regenerating types, can add: + ! if (len_trim(UF%FileName) > 0) then + ! write(SumFileUnit, '(A34,A)') ' Wind file: ', trim(UF%FileName) + ! end if + ! Add additional summary information as needed end if end subroutine diff --git a/modules/inflowwind/src/InflowWind_IO.txt b/modules/inflowwind/src/InflowWind_IO.txt index ca305a2212..390d1438d9 100644 --- a/modules/inflowwind/src/InflowWind_IO.txt +++ b/modules/inflowwind/src/InflowWind_IO.txt @@ -80,7 +80,20 @@ typedef ^ ^ ReKi dz typedef ^ ^ Grid3D_InitInputType G3D - - - "Grid3D initialization input" - #---------------------------------------------------------------------------------------------------------------------------------- -typedef ^ User_InitInputType SiKi Dummy - - - "User field initialization input dummy value" - +# User_InitInputType: Initialization inputs for user-defined wind field +# +# These inputs are passed to IfW_User_Init() to set up the user-defined wind field. +# Extend this structure to include any parameters needed for your custom wind model. +# +# Examples of parameters you might add: +# - File names for input data +# - Model-specific coefficients +# - Spatial domain boundaries +# - Time range for simulation +#---------------------------------------------------------------------------------------------------------------------------------- +typedef ^ User_InitInputType CHARACTER(1024) WindFileName - - - "name of file containing user-defined wind data (if applicable)" - +typedef ^ ^ ReKi RefHt - - - "reference height for user wind field" meters +typedef ^ ^ IntKi NumDataColumns - 0 - "number of data columns in user wind file (if applicable)" - #---------------------------------------------------------------------------------------------------------------------------------- typedef ^ Grid4D_InitInputType IntKi n 4 - - "number of grid points in the x, y, z, and t directions" - diff --git a/modules/inflowwind/src/InflowWind_IO_Types.f90 b/modules/inflowwind/src/InflowWind_IO_Types.f90 index 7d88b26c34..0a148e9825 100644 --- a/modules/inflowwind/src/InflowWind_IO_Types.f90 +++ b/modules/inflowwind/src/InflowWind_IO_Types.f90 @@ -123,7 +123,9 @@ MODULE InflowWind_IO_Types ! ======================= ! ========= User_InitInputType ======= TYPE, PUBLIC :: User_InitInputType - REAL(SiKi) :: Dummy = 0.0_R4Ki !< User field initialization input dummy value [-] + CHARACTER(1024) :: WindFileName !< name of file containing user-defined wind data (if applicable) [-] + REAL(ReKi) :: RefHt = 0.0_ReKi !< reference height for user wind field [meters] + INTEGER(IntKi) :: NumDataColumns = 0 !< number of data columns in user wind file (if applicable) [-] END TYPE User_InitInputType ! ======================= ! ========= Grid4D_InitInputType ======= @@ -139,7 +141,8 @@ MODULE InflowWind_IO_Types INTEGER(IntKi) :: NumWindPoints = 0_IntKi !< Number of points where wind components will be provided [-] END TYPE Points_InitInputType ! ======================= -CONTAINS + +contains subroutine InflowWind_IO_CopyWindFileDat(SrcWindFileDatData, DstWindFileDatData, CtrlCode, ErrStat, ErrMsg) type(WindFileDat), intent(in) :: SrcWindFileDatData @@ -603,7 +606,9 @@ subroutine InflowWind_IO_CopyUser_InitInputType(SrcUser_InitInputTypeData, DstUs character(*), parameter :: RoutineName = 'InflowWind_IO_CopyUser_InitInputType' ErrStat = ErrID_None ErrMsg = '' - DstUser_InitInputTypeData%Dummy = SrcUser_InitInputTypeData%Dummy + DstUser_InitInputTypeData%WindFileName = SrcUser_InitInputTypeData%WindFileName + DstUser_InitInputTypeData%RefHt = SrcUser_InitInputTypeData%RefHt + DstUser_InitInputTypeData%NumDataColumns = SrcUser_InitInputTypeData%NumDataColumns end subroutine subroutine InflowWind_IO_DestroyUser_InitInputType(User_InitInputTypeData, ErrStat, ErrMsg) @@ -620,7 +625,9 @@ subroutine InflowWind_IO_PackUser_InitInputType(RF, Indata) type(User_InitInputType), intent(in) :: InData character(*), parameter :: RoutineName = 'InflowWind_IO_PackUser_InitInputType' if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%Dummy) + call RegPack(RF, InData%WindFileName) + call RegPack(RF, InData%RefHt) + call RegPack(RF, InData%NumDataColumns) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -629,7 +636,9 @@ subroutine InflowWind_IO_UnPackUser_InitInputType(RF, OutData) type(User_InitInputType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'InflowWind_IO_UnPackUser_InitInputType' if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%Dummy); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WindFileName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RefHt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumDataColumns); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine InflowWind_IO_CopyGrid4D_InitInputType(SrcGrid4D_InitInputTypeData, DstGrid4D_InitInputTypeData, CtrlCode, ErrStat, ErrMsg) @@ -725,5 +734,7 @@ subroutine InflowWind_IO_UnPackPoints_InitInputType(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%NumWindPoints); if (RegCheckErr(RF, RoutineName)) return end subroutine + END MODULE InflowWind_IO_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/inflowwind/src/InflowWind_Types.f90 b/modules/inflowwind/src/InflowWind_Types.f90 index f820e6e9bf..5e85deaf1e 100644 --- a/modules/inflowwind/src/InflowWind_Types.f90 +++ b/modules/inflowwind/src/InflowWind_Types.f90 @@ -36,18 +36,24 @@ MODULE InflowWind_Types USE Lidar_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: Undef_WindNumber = 0 ! This is the code for an undefined WindFileType [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Steady_WindNumber = 1 ! Steady wind. Calculated internally. [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Uniform_WindNumber = 2 ! Uniform wind. Formally known as a Hub-Height wind file. [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: TSFF_WindNumber = 3 ! TurbSim full-field binary file. [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: BladedFF_WindNumber = 4 ! Bladed style binary full-field file. Includes native bladed format [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: HAWC_WindNumber = 5 ! HAWC wind file. [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: User_WindNumber = 6 ! User defined wind. [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: BladedFF_Shr_WindNumber = 7 ! Native Bladed binary full-field file. [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: FDext_WindNumber = 8 ! 4D wind from external souce (i.e., FAST.Farm). [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Point_WindNumber = 9 ! 1D wind components from ExtInflow [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Highest_WindNumber = 9 ! Highest wind number supported. [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: IfW_NumPtsAvg = 144 ! Number of points averaged for rotor-average wind speed [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Undef_WindNumber = 0 ! This is the code for an undefined WindFileType [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Steady_WindNumber = 1 ! Steady wind. Calculated internally. [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Uniform_WindNumber = 2 ! Uniform wind. Formally known as a Hub-Height wind file. [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TSFF_WindNumber = 3 ! TurbSim full-field binary file. [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BladedFF_WindNumber = 4 ! Bladed style binary full-field file. Includes native bladed format [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: HAWC_WindNumber = 5 ! HAWC wind file. [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: User_WindNumber = 6 ! User defined wind. [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: BladedFF_Shr_WindNumber = 7 ! Native Bladed binary full-field file. [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FDext_WindNumber = 8 ! 4D wind from external souce (i.e., FAST.Farm). [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Point_WindNumber = 9 ! 1D wind components from ExtInflow [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Highest_WindNumber = 9 ! Highest wind number supported. [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: IfW_NumPtsAvg = 144 ! Number of points averaged for rotor-average wind speed [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: InflowWind_u_HWindSpeed = -1 ! DatLoc number for HWindSpeed extended input [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: InflowWind_u_PLExp = -2 ! DatLoc number for PLExp extended input [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: InflowWind_u_PropagationDir = -3 ! DatLoc number for PropagationDir extended input [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: InflowWind_y_HWindSpeed = -4 ! DatLoc number for HWindSpeed extended output [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: InflowWind_y_PLExp = -5 ! DatLoc number for PLExp extended output [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: InflowWind_y_PropagationDir = -6 ! DatLoc number for PropagationDir extended output [-] ! ========= InflowWind_InputFile ======= TYPE, PUBLIC :: InflowWind_InputFile LOGICAL :: EchoFlag = .false. !< Echo the input file [-] @@ -127,12 +133,8 @@ MODULE InflowWind_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of output-to-file channels [-] TYPE(ProgDesc) :: Ver !< Version information of InflowWind module [-] TYPE(WindFileDat) :: WindFileInfo !< Meta data from the wind file [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_y !< Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_u !< Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) [-] TYPE(FlowFieldType) , POINTER :: FlowField => NULL() !< Flow field data to represent all wind types [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE InflowWind_InitOutputType ! ======================= ! ========= InflowWind_ParameterType ======= @@ -198,9 +200,30 @@ MODULE InflowWind_Types TYPE(InflowWind_OutputType) :: y_Avg !< outputs for computing rotor-averaged values [-] TYPE(InflowWind_InputType) :: u_Hub !< inputs for computing hub values [-] TYPE(InflowWind_OutputType) :: y_Hub !< outputs for computing hub values [-] + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] END TYPE InflowWind_MiscVarType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: InflowWind_x_DummyContState = 1 ! InflowWind%DummyContState + integer(IntKi), public, parameter :: InflowWind_u_PositionXYZ = 2 ! InflowWind%PositionXYZ + integer(IntKi), public, parameter :: InflowWind_u_lidar_PulseLidEl = 3 ! InflowWind%lidar%PulseLidEl + integer(IntKi), public, parameter :: InflowWind_u_lidar_PulseLidAz = 4 ! InflowWind%lidar%PulseLidAz + integer(IntKi), public, parameter :: InflowWind_u_lidar_HubDisplacementX = 5 ! InflowWind%lidar%HubDisplacementX + integer(IntKi), public, parameter :: InflowWind_u_lidar_HubDisplacementY = 6 ! InflowWind%lidar%HubDisplacementY + integer(IntKi), public, parameter :: InflowWind_u_lidar_HubDisplacementZ = 7 ! InflowWind%lidar%HubDisplacementZ + integer(IntKi), public, parameter :: InflowWind_u_HubPosition = 8 ! InflowWind%HubPosition + integer(IntKi), public, parameter :: InflowWind_u_HubOrientation = 9 ! InflowWind%HubOrientation + integer(IntKi), public, parameter :: InflowWind_y_VelocityUVW = 10 ! InflowWind%VelocityUVW + integer(IntKi), public, parameter :: InflowWind_y_AccelUVW = 11 ! InflowWind%AccelUVW + integer(IntKi), public, parameter :: InflowWind_y_WriteOutput = 12 ! InflowWind%WriteOutput + integer(IntKi), public, parameter :: InflowWind_y_DiskVel = 13 ! InflowWind%DiskVel + integer(IntKi), public, parameter :: InflowWind_y_HubVel = 14 ! InflowWind%HubVel + integer(IntKi), public, parameter :: InflowWind_y_lidar_LidSpeed = 15 ! InflowWind%lidar%LidSpeed + integer(IntKi), public, parameter :: InflowWind_y_lidar_WtTrunc = 16 ! InflowWind%lidar%WtTrunc + integer(IntKi), public, parameter :: InflowWind_y_lidar_MsrPositionsX = 17 ! InflowWind%lidar%MsrPositionsX + integer(IntKi), public, parameter :: InflowWind_y_lidar_MsrPositionsY = 18 ! InflowWind%lidar%MsrPositionsY + integer(IntKi), public, parameter :: InflowWind_y_lidar_MsrPositionsZ = 19 ! InflowWind%lidar%MsrPositionsZ + +contains subroutine InflowWind_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg) type(InflowWind_InputFile), intent(in) :: SrcInputFileData @@ -635,67 +658,10 @@ subroutine InflowWind_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlC call InflowWind_IO_CopyWindFileDat(SrcInitOutputData%WindFileInfo, DstInitOutputData%WindFileInfo, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcInitOutputData%LinNames_y)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_y) - UB(1:1) = ubound(SrcInitOutputData%LinNames_y) - if (.not. allocated(DstInitOutputData%LinNames_y)) then - allocate(DstInitOutputData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_y = SrcInitOutputData%LinNames_y - end if - if (allocated(SrcInitOutputData%LinNames_u)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_u) - UB(1:1) = ubound(SrcInitOutputData%LinNames_u) - if (.not. allocated(DstInitOutputData%LinNames_u)) then - allocate(DstInitOutputData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_u = SrcInitOutputData%LinNames_u - end if - if (allocated(SrcInitOutputData%RotFrame_y)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_y) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_y) - if (.not. allocated(DstInitOutputData%RotFrame_y)) then - allocate(DstInitOutputData%RotFrame_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_y = SrcInitOutputData%RotFrame_y - end if - if (allocated(SrcInitOutputData%RotFrame_u)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_u) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_u) - if (.not. allocated(DstInitOutputData%RotFrame_u)) then - allocate(DstInitOutputData%RotFrame_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_u = SrcInitOutputData%RotFrame_u - end if - if (allocated(SrcInitOutputData%IsLoad_u)) then - LB(1:1) = lbound(SrcInitOutputData%IsLoad_u) - UB(1:1) = ubound(SrcInitOutputData%IsLoad_u) - if (.not. allocated(DstInitOutputData%IsLoad_u)) then - allocate(DstInitOutputData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%IsLoad_u = SrcInitOutputData%IsLoad_u - end if DstInitOutputData%FlowField => SrcInitOutputData%FlowField + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine InflowWind_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -717,22 +683,9 @@ subroutine InflowWind_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call InflowWind_IO_DestroyWindFileDat(InitOutputData%WindFileInfo, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(InitOutputData%LinNames_y)) then - deallocate(InitOutputData%LinNames_y) - end if - if (allocated(InitOutputData%LinNames_u)) then - deallocate(InitOutputData%LinNames_u) - end if - if (allocated(InitOutputData%RotFrame_y)) then - deallocate(InitOutputData%RotFrame_y) - end if - if (allocated(InitOutputData%RotFrame_u)) then - deallocate(InitOutputData%RotFrame_u) - end if - if (allocated(InitOutputData%IsLoad_u)) then - deallocate(InitOutputData%IsLoad_u) - end if nullify(InitOutputData%FlowField) + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine InflowWind_PackInitOutput(RF, Indata) @@ -745,11 +698,6 @@ subroutine InflowWind_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%WriteOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) call InflowWind_IO_PackWindFileDat(RF, InData%WindFileInfo) - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%RotFrame_y) - call RegPackAlloc(RF, InData%RotFrame_u) - call RegPackAlloc(RF, InData%IsLoad_u) call RegPack(RF, associated(InData%FlowField)) if (associated(InData%FlowField)) then call RegPackPointer(RF, c_loc(InData%FlowField), PtrInIndex) @@ -757,6 +705,7 @@ subroutine InflowWind_PackInitOutput(RF, Indata) call IfW_FlowField_PackFlowFieldType(RF, InData%FlowField) end if end if + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -774,11 +723,6 @@ subroutine InflowWind_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver call InflowWind_IO_UnpackWindFileDat(RF, OutData%WindFileInfo) ! WindFileInfo - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return if (associated(OutData%FlowField)) deallocate(OutData%FlowField) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -797,6 +741,7 @@ subroutine InflowWind_UnPackInitOutput(RF, OutData) else OutData%FlowField => null() end if + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine InflowWind_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) @@ -1423,6 +1368,9 @@ subroutine InflowWind_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrM call InflowWind_CopyOutput(SrcMiscData%y_Hub, DstMiscData%y_Hub, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine InflowWind_DestroyMisc(MiscData, ErrStat, ErrMsg) @@ -1451,6 +1399,8 @@ subroutine InflowWind_DestroyMisc(MiscData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call InflowWind_DestroyOutput(MiscData%y_Hub, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine InflowWind_PackMisc(RF, Indata) @@ -1465,6 +1415,7 @@ subroutine InflowWind_PackMisc(RF, Indata) call InflowWind_PackOutput(RF, InData%y_Avg) call InflowWind_PackInput(RF, InData%u_Hub) call InflowWind_PackOutput(RF, InData%y_Hub) + call NWTC_Library_PackModJacType(RF, InData%Jac) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1483,6 +1434,7 @@ subroutine InflowWind_UnPackMisc(RF, OutData) call InflowWind_UnpackOutput(RF, OutData%y_Avg) ! y_Avg call InflowWind_UnpackInput(RF, OutData%u_Hub) ! u_Hub call InflowWind_UnpackOutput(RF, OutData%y_Hub) ! y_Hub + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac end subroutine subroutine InflowWind_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -1844,5 +1796,316 @@ SUBROUTINE InflowWind_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrS CALL Lidar_Output_ExtrapInterp2( y1%lidar, y2%lidar, y3%lidar, tin, y_out%lidar, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE + +function InflowWind_InputMeshPointer(u, DL) result(Mesh) + type(InflowWind_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function InflowWind_OutputMeshPointer(y, DL) result(Mesh) + type(InflowWind_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine InflowWind_VarsPackContState(Vars, x, ValAry) + type(InflowWind_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call InflowWind_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine InflowWind_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(InflowWind_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (InflowWind_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine InflowWind_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(InflowWind_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call InflowWind_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine InflowWind_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(InflowWind_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (InflowWind_x_DummyContState) + x%DummyContState = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function InflowWind_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (InflowWind_x_DummyContState) + Name = "x%DummyContState" + case default + Name = "Unknown Field" + end select +end function + +subroutine InflowWind_VarsPackContStateDeriv(Vars, x, ValAry) + type(InflowWind_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call InflowWind_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine InflowWind_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(InflowWind_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (InflowWind_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine InflowWind_VarsPackInput(Vars, u, ValAry) + type(InflowWind_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call InflowWind_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine InflowWind_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(InflowWind_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (InflowWind_u_PositionXYZ) + VarVals = u%PositionXYZ(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (InflowWind_u_lidar_PulseLidEl) + VarVals(1) = u%lidar%PulseLidEl ! Scalar + case (InflowWind_u_lidar_PulseLidAz) + VarVals(1) = u%lidar%PulseLidAz ! Scalar + case (InflowWind_u_lidar_HubDisplacementX) + VarVals(1) = u%lidar%HubDisplacementX ! Scalar + case (InflowWind_u_lidar_HubDisplacementY) + VarVals(1) = u%lidar%HubDisplacementY ! Scalar + case (InflowWind_u_lidar_HubDisplacementZ) + VarVals(1) = u%lidar%HubDisplacementZ ! Scalar + case (InflowWind_u_HubPosition) + VarVals = u%HubPosition(V%iLB:V%iUB) ! Rank 1 Array + case (InflowWind_u_HubOrientation) + VarVals = u%HubOrientation(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine InflowWind_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(InflowWind_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call InflowWind_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine InflowWind_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(InflowWind_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (InflowWind_u_PositionXYZ) + u%PositionXYZ(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (InflowWind_u_lidar_PulseLidEl) + u%lidar%PulseLidEl = VarVals(1) ! Scalar + case (InflowWind_u_lidar_PulseLidAz) + u%lidar%PulseLidAz = VarVals(1) ! Scalar + case (InflowWind_u_lidar_HubDisplacementX) + u%lidar%HubDisplacementX = VarVals(1) ! Scalar + case (InflowWind_u_lidar_HubDisplacementY) + u%lidar%HubDisplacementY = VarVals(1) ! Scalar + case (InflowWind_u_lidar_HubDisplacementZ) + u%lidar%HubDisplacementZ = VarVals(1) ! Scalar + case (InflowWind_u_HubPosition) + u%HubPosition(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (InflowWind_u_HubOrientation) + u%HubOrientation(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function InflowWind_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (InflowWind_u_PositionXYZ) + Name = "u%PositionXYZ" + case (InflowWind_u_lidar_PulseLidEl) + Name = "u%lidar%PulseLidEl" + case (InflowWind_u_lidar_PulseLidAz) + Name = "u%lidar%PulseLidAz" + case (InflowWind_u_lidar_HubDisplacementX) + Name = "u%lidar%HubDisplacementX" + case (InflowWind_u_lidar_HubDisplacementY) + Name = "u%lidar%HubDisplacementY" + case (InflowWind_u_lidar_HubDisplacementZ) + Name = "u%lidar%HubDisplacementZ" + case (InflowWind_u_HubPosition) + Name = "u%HubPosition" + case (InflowWind_u_HubOrientation) + Name = "u%HubOrientation" + case default + Name = "Unknown Field" + end select +end function + +subroutine InflowWind_VarsPackOutput(Vars, y, ValAry) + type(InflowWind_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call InflowWind_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine InflowWind_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(InflowWind_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (InflowWind_y_VelocityUVW) + VarVals = y%VelocityUVW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (InflowWind_y_AccelUVW) + VarVals = y%AccelUVW(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (InflowWind_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (InflowWind_y_DiskVel) + VarVals = y%DiskVel(V%iLB:V%iUB) ! Rank 1 Array + case (InflowWind_y_HubVel) + VarVals = y%HubVel(V%iLB:V%iUB) ! Rank 1 Array + case (InflowWind_y_lidar_LidSpeed) + VarVals = y%lidar%LidSpeed(V%iLB:V%iUB) ! Rank 1 Array + case (InflowWind_y_lidar_WtTrunc) + VarVals = y%lidar%WtTrunc(V%iLB:V%iUB) ! Rank 1 Array + case (InflowWind_y_lidar_MsrPositionsX) + VarVals = y%lidar%MsrPositionsX(V%iLB:V%iUB) ! Rank 1 Array + case (InflowWind_y_lidar_MsrPositionsY) + VarVals = y%lidar%MsrPositionsY(V%iLB:V%iUB) ! Rank 1 Array + case (InflowWind_y_lidar_MsrPositionsZ) + VarVals = y%lidar%MsrPositionsZ(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine InflowWind_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(InflowWind_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call InflowWind_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine InflowWind_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(InflowWind_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (InflowWind_y_VelocityUVW) + y%VelocityUVW(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (InflowWind_y_AccelUVW) + y%AccelUVW(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (InflowWind_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (InflowWind_y_DiskVel) + y%DiskVel(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (InflowWind_y_HubVel) + y%HubVel(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (InflowWind_y_lidar_LidSpeed) + y%lidar%LidSpeed(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (InflowWind_y_lidar_WtTrunc) + y%lidar%WtTrunc(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (InflowWind_y_lidar_MsrPositionsX) + y%lidar%MsrPositionsX(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (InflowWind_y_lidar_MsrPositionsY) + y%lidar%MsrPositionsY(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (InflowWind_y_lidar_MsrPositionsZ) + y%lidar%MsrPositionsZ(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function InflowWind_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (InflowWind_y_VelocityUVW) + Name = "y%VelocityUVW" + case (InflowWind_y_AccelUVW) + Name = "y%AccelUVW" + case (InflowWind_y_WriteOutput) + Name = "y%WriteOutput" + case (InflowWind_y_DiskVel) + Name = "y%DiskVel" + case (InflowWind_y_HubVel) + Name = "y%HubVel" + case (InflowWind_y_lidar_LidSpeed) + Name = "y%lidar%LidSpeed" + case (InflowWind_y_lidar_WtTrunc) + Name = "y%lidar%WtTrunc" + case (InflowWind_y_lidar_MsrPositionsX) + Name = "y%lidar%MsrPositionsX" + case (InflowWind_y_lidar_MsrPositionsY) + Name = "y%lidar%MsrPositionsY" + case (InflowWind_y_lidar_MsrPositionsZ) + Name = "y%lidar%MsrPositionsZ" + case default + Name = "Unknown Field" + end select +end function + END MODULE InflowWind_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/inflowwind/src/Lidar_Types.f90 b/modules/inflowwind/src/Lidar_Types.f90 index 490316f137..826a08265f 100644 --- a/modules/inflowwind/src/Lidar_Types.f90 +++ b/modules/inflowwind/src/Lidar_Types.f90 @@ -33,10 +33,10 @@ MODULE Lidar_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: SensorType_None = 0 - INTEGER(IntKi), PUBLIC, PARAMETER :: SensorType_SinglePoint = 1 - INTEGER(IntKi), PUBLIC, PARAMETER :: SensorType_ContinuousLidar = 2 - INTEGER(IntKi), PUBLIC, PARAMETER :: SensorType_PulsedLidar = 3 + INTEGER(IntKi), PUBLIC, PARAMETER :: SensorType_None = 0 + INTEGER(IntKi), PUBLIC, PARAMETER :: SensorType_SinglePoint = 1 + INTEGER(IntKi), PUBLIC, PARAMETER :: SensorType_ContinuousLidar = 2 + INTEGER(IntKi), PUBLIC, PARAMETER :: SensorType_PulsedLidar = 3 ! ========= Lidar_ParameterType ======= TYPE, PUBLIC :: Lidar_ParameterType INTEGER(IntKi) :: NumPulseGate = 0_IntKi !< the number of range gates to return wind speeds at; pulsed lidar only [-] @@ -83,7 +83,18 @@ MODULE Lidar_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: MsrPositionsZ !< Lidar Z direction measurement points [m] END TYPE Lidar_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: Lidar_u_PulseLidEl = 1 ! Lidar%PulseLidEl + integer(IntKi), public, parameter :: Lidar_u_PulseLidAz = 2 ! Lidar%PulseLidAz + integer(IntKi), public, parameter :: Lidar_u_HubDisplacementX = 3 ! Lidar%HubDisplacementX + integer(IntKi), public, parameter :: Lidar_u_HubDisplacementY = 4 ! Lidar%HubDisplacementY + integer(IntKi), public, parameter :: Lidar_u_HubDisplacementZ = 5 ! Lidar%HubDisplacementZ + integer(IntKi), public, parameter :: Lidar_y_LidSpeed = 6 ! Lidar%LidSpeed + integer(IntKi), public, parameter :: Lidar_y_WtTrunc = 7 ! Lidar%WtTrunc + integer(IntKi), public, parameter :: Lidar_y_MsrPositionsX = 8 ! Lidar%MsrPositionsX + integer(IntKi), public, parameter :: Lidar_y_MsrPositionsY = 9 ! Lidar%MsrPositionsY + integer(IntKi), public, parameter :: Lidar_y_MsrPositionsZ = 10 ! Lidar%MsrPositionsZ + +contains subroutine Lidar_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) type(Lidar_ParameterType), intent(in) :: SrcParamData @@ -775,5 +786,187 @@ SUBROUTINE Lidar_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, y_out%MsrPositionsZ = a1*y1%MsrPositionsZ + a2*y2%MsrPositionsZ + a3*y3%MsrPositionsZ END IF ! check if allocated END SUBROUTINE + +function Lidar_InputMeshPointer(u, DL) result(Mesh) + type(Lidar_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function Lidar_OutputMeshPointer(y, DL) result(Mesh) + type(Lidar_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine Lidar_VarsPackInput(Vars, u, ValAry) + type(Lidar_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call Lidar_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine Lidar_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(Lidar_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Lidar_u_PulseLidEl) + VarVals(1) = u%PulseLidEl ! Scalar + case (Lidar_u_PulseLidAz) + VarVals(1) = u%PulseLidAz ! Scalar + case (Lidar_u_HubDisplacementX) + VarVals(1) = u%HubDisplacementX ! Scalar + case (Lidar_u_HubDisplacementY) + VarVals(1) = u%HubDisplacementY ! Scalar + case (Lidar_u_HubDisplacementZ) + VarVals(1) = u%HubDisplacementZ ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Lidar_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Lidar_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call Lidar_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine Lidar_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Lidar_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Lidar_u_PulseLidEl) + u%PulseLidEl = VarVals(1) ! Scalar + case (Lidar_u_PulseLidAz) + u%PulseLidAz = VarVals(1) ! Scalar + case (Lidar_u_HubDisplacementX) + u%HubDisplacementX = VarVals(1) ! Scalar + case (Lidar_u_HubDisplacementY) + u%HubDisplacementY = VarVals(1) ! Scalar + case (Lidar_u_HubDisplacementZ) + u%HubDisplacementZ = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function Lidar_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Lidar_u_PulseLidEl) + Name = "u%PulseLidEl" + case (Lidar_u_PulseLidAz) + Name = "u%PulseLidAz" + case (Lidar_u_HubDisplacementX) + Name = "u%HubDisplacementX" + case (Lidar_u_HubDisplacementY) + Name = "u%HubDisplacementY" + case (Lidar_u_HubDisplacementZ) + Name = "u%HubDisplacementZ" + case default + Name = "Unknown Field" + end select +end function + +subroutine Lidar_VarsPackOutput(Vars, y, ValAry) + type(Lidar_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call Lidar_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine Lidar_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(Lidar_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Lidar_y_LidSpeed) + VarVals = y%LidSpeed(V%iLB:V%iUB) ! Rank 1 Array + case (Lidar_y_WtTrunc) + VarVals = y%WtTrunc(V%iLB:V%iUB) ! Rank 1 Array + case (Lidar_y_MsrPositionsX) + VarVals = y%MsrPositionsX(V%iLB:V%iUB) ! Rank 1 Array + case (Lidar_y_MsrPositionsY) + VarVals = y%MsrPositionsY(V%iLB:V%iUB) ! Rank 1 Array + case (Lidar_y_MsrPositionsZ) + VarVals = y%MsrPositionsZ(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Lidar_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Lidar_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call Lidar_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine Lidar_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Lidar_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Lidar_y_LidSpeed) + y%LidSpeed(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (Lidar_y_WtTrunc) + y%WtTrunc(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (Lidar_y_MsrPositionsX) + y%MsrPositionsX(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (Lidar_y_MsrPositionsY) + y%MsrPositionsY(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (Lidar_y_MsrPositionsZ) + y%MsrPositionsZ(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function Lidar_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Lidar_y_LidSpeed) + Name = "y%LidSpeed" + case (Lidar_y_WtTrunc) + Name = "y%WtTrunc" + case (Lidar_y_MsrPositionsX) + Name = "y%MsrPositionsX" + case (Lidar_y_MsrPositionsY) + Name = "y%MsrPositionsY" + case (Lidar_y_MsrPositionsZ) + Name = "y%MsrPositionsZ" + case default + Name = "Unknown Field" + end select +end function + END MODULE Lidar_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/inflowwind/tests/inflowwind_utest.F90 b/modules/inflowwind/tests/inflowwind_utest.F90 index 83bf35405b..758c25de13 100644 --- a/modules/inflowwind/tests/inflowwind_utest.F90 +++ b/modules/inflowwind/tests/inflowwind_utest.F90 @@ -30,7 +30,7 @@ program inflowwind_utest do is = 1, size(testsuites) write (error_unit, fmt) "Testing:", testsuites(is)%name - call run_testsuite(testsuites(is)%collect, error_unit, stat) + call run_testsuite(testsuites(is)%collect, error_unit, stat, parallel=.false.) end do if (stat > 0) then diff --git a/modules/lindyn/src/LinDyn_Types.f90 b/modules/lindyn/src/LinDyn_Types.f90 index b5d08e8d49..4a51392fab 100644 --- a/modules/lindyn/src/LinDyn_Types.f90 +++ b/modules/lindyn/src/LinDyn_Types.f90 @@ -123,7 +123,12 @@ MODULE LinDyn_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< outputs to be written to a file [-] END TYPE LD_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: LD_x_q = 1 ! LD%q + integer(IntKi), public, parameter :: LD_u_Fext = 2 ! LD%Fext + integer(IntKi), public, parameter :: LD_y_xdd = 3 ! LD%xdd + integer(IntKi), public, parameter :: LD_y_WriteOutput = 4 ! LD%WriteOutput + +contains subroutine LD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(LD_InitInputType), intent(in) :: SrcInitInputData @@ -1555,5 +1560,226 @@ SUBROUTINE LD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Err y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function LD_InputMeshPointer(u, DL) result(Mesh) + type(LD_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function LD_OutputMeshPointer(y, DL) result(Mesh) + type(LD_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine LD_VarsPackContState(Vars, x, ValAry) + type(LD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call LD_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine LD_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(LD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (LD_x_q) + VarVals = x%q(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine LD_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(LD_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call LD_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine LD_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(LD_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (LD_x_q) + x%q(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function LD_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (LD_x_q) + Name = "x%q" + case default + Name = "Unknown Field" + end select +end function + +subroutine LD_VarsPackContStateDeriv(Vars, x, ValAry) + type(LD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call LD_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine LD_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(LD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (LD_x_q) + VarVals = x%q(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine LD_VarsPackInput(Vars, u, ValAry) + type(LD_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call LD_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine LD_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(LD_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (LD_u_Fext) + VarVals = u%Fext(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine LD_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(LD_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call LD_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine LD_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(LD_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (LD_u_Fext) + u%Fext(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function LD_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (LD_u_Fext) + Name = "u%Fext" + case default + Name = "Unknown Field" + end select +end function + +subroutine LD_VarsPackOutput(Vars, y, ValAry) + type(LD_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call LD_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine LD_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(LD_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (LD_y_xdd) + VarVals = y%xdd(V%iLB:V%iUB) ! Rank 1 Array + case (LD_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine LD_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(LD_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call LD_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine LD_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(LD_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (LD_y_xdd) + y%xdd(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (LD_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function LD_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (LD_y_xdd) + Name = "y%xdd" + case (LD_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE LinDyn_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/map/CMakeLists.txt b/modules/map/CMakeLists.txt index 5f82519a62..8c34521b58 100644 --- a/modules/map/CMakeLists.txt +++ b/modules/map/CMakeLists.txt @@ -25,9 +25,7 @@ if (NOT WIN32) endif() if (GENERATE_TYPES) - generate_f90_types(src/MAP_Fortran_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/MAP_Fortran_Types.f90 -noextrap) generate_f90_types(src/MAP_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/MAP_Types.f90 -ccode) - generate_f90_types(src/MAP_Fortran_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/MAP_Fortran_Types.f90 -noextrap) endif() file(GLOB MAP_CLIB_SOURCES src/*.c src/*.cc src/*/*.c src/*/*.cc) @@ -36,7 +34,6 @@ file(GLOB MAP_C_HEADERS src/*.h src/*/*.h) add_library(mappplib STATIC src/map.f90 src/MAP_Types.f90 - src/MAP_Fortran_Types.f90 ${MAP_CLIB_SOURCES} ) target_sources( diff --git a/modules/map/src/MAP_Fortran_Registry.txt b/modules/map/src/MAP_Fortran_Registry.txt deleted file mode 100644 index b1ad941a80..0000000000 --- a/modules/map/src/MAP_Fortran_Registry.txt +++ /dev/null @@ -1,22 +0,0 @@ -################## Registry for MAP++ ############### -# column 1 -# column 2 ModuleName/ModName or ^ to use the value from the previous line (SD is nickname for ModuleName) -# column 3 Derived data type (without "ModName_" prefix) -# column 4 Derived data types's Field type -# column 5 Variable name -# column 6 Dimension of variable {:} for allocatable -# column 7 Variable's initial value (if set in the data type) -# column 8 I think this is a switch for mixed-language programming; it's mostly unused -# column 9 Description -# column 10 Units -# Keyword ModuleName/ModName Derived data type Field type Variable name variable dimension Initial value for mix language, not used Description Units - -include Registry_NWTC_Library.txt - -typedef MAP_Fortran/MAP_Fortran Lin_InitInputType LOGICAL linearize - .false. - "Flag that tells this module if the glue code wants to linearize. (fortran-only)" - -typedef ^ Lin_InitOutputType CHARACTER(200) LinNames_y {:} "" - "second line of output file contents: units (fortran-only)" - -typedef ^ ^ CHARACTER(200) LinNames_u {:} "" - "Names of the inputs used in linearization (fortran-only)" - -typedef ^ ^ LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) (fortran-only)" - -typedef ^ Lin_ParamType Integer Jac_u_indx {:}{:} - - "matrix to help fill/pack the u vector in computing the jacobian (fortran-only)" - -typedef ^ ^ R8Ki du - - - "determines size of the translational displacement perturbation for u (inputs) (fortran-only)" - -typedef ^ ^ Integer Jac_ny - - - "number of outputs in jacobian matrix (fortran-only)" - diff --git a/modules/map/src/MAP_Fortran_Types.f90 b/modules/map/src/MAP_Fortran_Types.f90 deleted file mode 100644 index ced2d55d68..0000000000 --- a/modules/map/src/MAP_Fortran_Types.f90 +++ /dev/null @@ -1,249 +0,0 @@ -!STARTOFREGISTRYGENERATEDFILE 'MAP_Fortran_Types.f90' -! -! WARNING This file is generated automatically by the FAST registry. -! Do not edit. Your changes to this file will be lost. -! -! FAST Registry -!********************************************************************************************************************************* -! MAP_Fortran_Types -!................................................................................................................................. -! This file is part of MAP_Fortran. -! -! Copyright (C) 2012-2016 National Renewable Energy Laboratory -! -! Licensed under the Apache License, Version 2.0 (the "License"); -! you may not use this file except in compliance with the License. -! You may obtain a copy of the License at -! -! http://www.apache.org/licenses/LICENSE-2.0 -! -! Unless required by applicable law or agreed to in writing, software -! distributed under the License is distributed on an "AS IS" BASIS, -! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -! See the License for the specific language governing permissions and -! limitations under the License. -! -! -! W A R N I N G : This file was automatically generated from the FAST registry. Changes made to this file may be lost. -! -!********************************************************************************************************************************* -!> This module contains the user-defined types needed in MAP_Fortran. It also contains copy, destroy, pack, and -!! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. -MODULE MAP_Fortran_Types -!--------------------------------------------------------------------------------------------------------------------------------- -USE NWTC_Library -IMPLICIT NONE -! ========= Lin_InitInputType ======= - TYPE, PUBLIC :: Lin_InitInputType - LOGICAL :: linearize = .false. !< Flag that tells this module if the glue code wants to linearize. (fortran-only) [-] - END TYPE Lin_InitInputType -! ======================= -! ========= Lin_InitOutputType ======= - TYPE, PUBLIC :: Lin_InitOutputType - CHARACTER(200) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< second line of output file contents: units (fortran-only) [-] - CHARACTER(200) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization (fortran-only) [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) (fortran-only) [-] - END TYPE Lin_InitOutputType -! ======================= -! ========= Lin_ParamType ======= - TYPE, PUBLIC :: Lin_ParamType - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian (fortran-only) [-] - REAL(R8Ki) :: du = 0.0_R8Ki !< determines size of the translational displacement perturbation for u (inputs) (fortran-only) [-] - INTEGER(IntKi) :: Jac_ny = 0_IntKi !< number of outputs in jacobian matrix (fortran-only) [-] - END TYPE Lin_ParamType -! ======================= -CONTAINS - -subroutine MAP_Fortran_CopyLin_InitInputType(SrcLin_InitInputTypeData, DstLin_InitInputTypeData, CtrlCode, ErrStat, ErrMsg) - type(Lin_InitInputType), intent(in) :: SrcLin_InitInputTypeData - type(Lin_InitInputType), intent(inout) :: DstLin_InitInputTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'MAP_Fortran_CopyLin_InitInputType' - ErrStat = ErrID_None - ErrMsg = '' - DstLin_InitInputTypeData%linearize = SrcLin_InitInputTypeData%linearize -end subroutine - -subroutine MAP_Fortran_DestroyLin_InitInputType(Lin_InitInputTypeData, ErrStat, ErrMsg) - type(Lin_InitInputType), intent(inout) :: Lin_InitInputTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'MAP_Fortran_DestroyLin_InitInputType' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine MAP_Fortran_PackLin_InitInputType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(Lin_InitInputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'MAP_Fortran_PackLin_InitInputType' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%linearize) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine MAP_Fortran_UnPackLin_InitInputType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(Lin_InitInputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'MAP_Fortran_UnPackLin_InitInputType' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%linearize); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine MAP_Fortran_CopyLin_InitOutputType(SrcLin_InitOutputTypeData, DstLin_InitOutputTypeData, CtrlCode, ErrStat, ErrMsg) - type(Lin_InitOutputType), intent(in) :: SrcLin_InitOutputTypeData - type(Lin_InitOutputType), intent(inout) :: DstLin_InitOutputTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(*), parameter :: RoutineName = 'MAP_Fortran_CopyLin_InitOutputType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcLin_InitOutputTypeData%LinNames_y)) then - LB(1:1) = lbound(SrcLin_InitOutputTypeData%LinNames_y) - UB(1:1) = ubound(SrcLin_InitOutputTypeData%LinNames_y) - if (.not. allocated(DstLin_InitOutputTypeData%LinNames_y)) then - allocate(DstLin_InitOutputTypeData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLin_InitOutputTypeData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLin_InitOutputTypeData%LinNames_y = SrcLin_InitOutputTypeData%LinNames_y - end if - if (allocated(SrcLin_InitOutputTypeData%LinNames_u)) then - LB(1:1) = lbound(SrcLin_InitOutputTypeData%LinNames_u) - UB(1:1) = ubound(SrcLin_InitOutputTypeData%LinNames_u) - if (.not. allocated(DstLin_InitOutputTypeData%LinNames_u)) then - allocate(DstLin_InitOutputTypeData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLin_InitOutputTypeData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLin_InitOutputTypeData%LinNames_u = SrcLin_InitOutputTypeData%LinNames_u - end if - if (allocated(SrcLin_InitOutputTypeData%IsLoad_u)) then - LB(1:1) = lbound(SrcLin_InitOutputTypeData%IsLoad_u) - UB(1:1) = ubound(SrcLin_InitOutputTypeData%IsLoad_u) - if (.not. allocated(DstLin_InitOutputTypeData%IsLoad_u)) then - allocate(DstLin_InitOutputTypeData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLin_InitOutputTypeData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLin_InitOutputTypeData%IsLoad_u = SrcLin_InitOutputTypeData%IsLoad_u - end if -end subroutine - -subroutine MAP_Fortran_DestroyLin_InitOutputType(Lin_InitOutputTypeData, ErrStat, ErrMsg) - type(Lin_InitOutputType), intent(inout) :: Lin_InitOutputTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'MAP_Fortran_DestroyLin_InitOutputType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(Lin_InitOutputTypeData%LinNames_y)) then - deallocate(Lin_InitOutputTypeData%LinNames_y) - end if - if (allocated(Lin_InitOutputTypeData%LinNames_u)) then - deallocate(Lin_InitOutputTypeData%LinNames_u) - end if - if (allocated(Lin_InitOutputTypeData%IsLoad_u)) then - deallocate(Lin_InitOutputTypeData%IsLoad_u) - end if -end subroutine - -subroutine MAP_Fortran_PackLin_InitOutputType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(Lin_InitOutputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'MAP_Fortran_PackLin_InitOutputType' - if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%IsLoad_u) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine MAP_Fortran_UnPackLin_InitOutputType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(Lin_InitOutputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'MAP_Fortran_UnPackLin_InitOutputType' - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine MAP_Fortran_CopyLin_ParamType(SrcLin_ParamTypeData, DstLin_ParamTypeData, CtrlCode, ErrStat, ErrMsg) - type(Lin_ParamType), intent(in) :: SrcLin_ParamTypeData - type(Lin_ParamType), intent(inout) :: DstLin_ParamTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(*), parameter :: RoutineName = 'MAP_Fortran_CopyLin_ParamType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcLin_ParamTypeData%Jac_u_indx)) then - LB(1:2) = lbound(SrcLin_ParamTypeData%Jac_u_indx) - UB(1:2) = ubound(SrcLin_ParamTypeData%Jac_u_indx) - if (.not. allocated(DstLin_ParamTypeData%Jac_u_indx)) then - allocate(DstLin_ParamTypeData%Jac_u_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLin_ParamTypeData%Jac_u_indx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLin_ParamTypeData%Jac_u_indx = SrcLin_ParamTypeData%Jac_u_indx - end if - DstLin_ParamTypeData%du = SrcLin_ParamTypeData%du - DstLin_ParamTypeData%Jac_ny = SrcLin_ParamTypeData%Jac_ny -end subroutine - -subroutine MAP_Fortran_DestroyLin_ParamType(Lin_ParamTypeData, ErrStat, ErrMsg) - type(Lin_ParamType), intent(inout) :: Lin_ParamTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'MAP_Fortran_DestroyLin_ParamType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(Lin_ParamTypeData%Jac_u_indx)) then - deallocate(Lin_ParamTypeData%Jac_u_indx) - end if -end subroutine - -subroutine MAP_Fortran_PackLin_ParamType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(Lin_ParamType), intent(in) :: InData - character(*), parameter :: RoutineName = 'MAP_Fortran_PackLin_ParamType' - if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%Jac_u_indx) - call RegPack(RF, InData%du) - call RegPack(RF, InData%Jac_ny) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine MAP_Fortran_UnPackLin_ParamType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(Lin_ParamType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'MAP_Fortran_UnPackLin_ParamType' - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%Jac_u_indx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return -end subroutine -END MODULE MAP_Fortran_Types -!ENDOFREGISTRYGENERATEDFILE diff --git a/modules/map/src/MAP_Registry.txt b/modules/map/src/MAP_Registry.txt index 316376a55b..3efd562074 100644 --- a/modules/map/src/MAP_Registry.txt +++ b/modules/map/src/MAP_Registry.txt @@ -13,7 +13,6 @@ include Registry_NWTC_Library.txt -usefrom MAP_Fortran_Registry.txt ## ============================== Define input types here: ============================================================================================================================================ typedef MAP InitInputType R8Ki gravity - -999.9 - "gravity constant" "[m/s^2]" @@ -25,7 +24,7 @@ typedef ^ ^ CHARACTER(255) library_input_str typedef ^ ^ CHARACTER(255) node_input_str - "" - "node string information (from input file)" typedef ^ ^ CHARACTER(255) line_input_str - "" - "element library string information (from input file)" typedef ^ ^ CHARACTER(255) option_input_str - "" - "solver options library string information (from input file)" -typedef ^ ^ Lin_InitInputType LinInitInp - - - " " - +typedef ^ ^ logical Linearize - "" - "Flag to perform linearization" ## ============================== Define Initialization outputs here: ================================================================================================================================ typedef ^ InitOutputType CHARACTER(99) progName - "" - "program name" typedef ^ ^ CHARACTER(99) version - "" - "version numnber" @@ -33,7 +32,7 @@ typedef ^ ^ CHARACTER(24) compilingData typedef ^ ^ CHARACTER(15) writeOutputHdr {:} "" - "first line output file contents: output variable names" typedef ^ ^ CHARACTER(15) writeOutputUnt {:} "" - "second line of output file contents: units" typedef ^ ^ ProgDesc Ver - "" - "this module's name, version, and date" -typedef ^ ^ Lin_InitOutputType LinInitOut - - - "Init Output linearization data (fortran-only)" - +typedef ^ ^ ModVarsType Vars - - - "Module Variables" - ## ============================== Define Continuous states here: ===================================================================================================================================== typedef ^ ContinuousStateType R8Ki dummy - - - "Remove this variable if you have continuous states" - @@ -83,7 +82,6 @@ typedef ^ ^ R8Ki dt typedef ^ ^ CHARACTER(255) InputLines {500} - - "input file line for restart" typedef ^ ^ CHARACTER(1) InputLineType {500} - - "input file line type for restart" typedef ^ ^ INTEGER numOuts - 0 - "Number of write outputs" - -typedef ^ ^ Lin_ParamType LinParams - - - "Parameter linearization data (fortran-only)" - # ============================== Inputs ============================================================================================================================================ typedef ^ InputType R8Ki x {:} - - "fairlead x displacement" "[m]" @@ -100,4 +98,7 @@ typedef ^ ^ ReKi WriteOutput typedef ^ ^ R8Ki wrtOutput {:} - - "outpur vector" "" typedef ^ ^ MeshType ptFairleadLoad - - - "point mesh for forces in X,Y,Z" "[N]" - +## ============================== MiscVar ============================================================================================================================================ +typedef ^ MiscVarType ModJacType Jac - - - "Values corresponding to module variables" +typedef ^ ^ MAP_InputType u_perturb - - - "Temporary variables for Jacobian calculations" +typedef ^ ^ MAP_ConstraintStateType z_lin - - - "Temporary variables for Jacobian calculations" diff --git a/modules/map/src/MAP_Types.f90 b/modules/map/src/MAP_Types.f90 index 9965ee5b42..01791f82a9 100644 --- a/modules/map/src/MAP_Types.f90 +++ b/modules/map/src/MAP_Types.f90 @@ -31,7 +31,6 @@ !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. MODULE MAP_Types !--------------------------------------------------------------------------------------------------------------------------------- -USE MAP_Fortran_Types USE NWTC_Library IMPLICIT NONE ! ========= MAP_InitInputType_C ======= @@ -46,6 +45,7 @@ MODULE MAP_Types CHARACTER(KIND=C_CHAR), DIMENSION(255) :: node_input_str CHARACTER(KIND=C_CHAR), DIMENSION(255) :: line_input_str CHARACTER(KIND=C_CHAR), DIMENSION(255) :: option_input_str + LOGICAL(KIND=C_BOOL) :: Linearize END TYPE MAP_InitInputType_C TYPE, PUBLIC :: MAP_InitInputType TYPE( MAP_InitInputType_C ) :: C_obj @@ -58,7 +58,7 @@ MODULE MAP_Types CHARACTER(255) :: node_input_str !< node string information (from input file) [-] CHARACTER(255) :: line_input_str !< element library string information (from input file) [-] CHARACTER(255) :: option_input_str !< solver options library string information (from input file) [-] - TYPE(Lin_InitInputType) :: LinInitInp !< [-] + LOGICAL :: Linearize = .false. !< Flag to perform linearization [-] END TYPE MAP_InitInputType ! ======================= ! ========= MAP_InitOutputType_C ======= @@ -80,7 +80,7 @@ MODULE MAP_Types CHARACTER(15) , DIMENSION(:), ALLOCATABLE :: writeOutputHdr !< first line output file contents: output variable names [-] CHARACTER(15) , DIMENSION(:), ALLOCATABLE :: writeOutputUnt !< second line of output file contents: units [-] TYPE(ProgDesc) :: Ver !< this module's name, version, and date [-] - TYPE(Lin_InitOutputType) :: LinInitOut !< Init Output linearization data (fortran-only) [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE MAP_InitOutputType ! ======================= ! ========= MAP_ContinuousStateType_C ======= @@ -200,7 +200,6 @@ MODULE MAP_Types CHARACTER(255) , DIMENSION(1:500) :: InputLines !< input file line for restart [-] CHARACTER(1) , DIMENSION(1:500) :: InputLineType !< input file line type for restart [-] INTEGER(IntKi) :: numOuts = 0 !< Number of write outputs [-] - TYPE(Lin_ParamType) :: LinParams !< Parameter linearization data (fortran-only) [-] END TYPE MAP_ParameterType ! ======================= ! ========= MAP_InputType_C ======= @@ -245,7 +244,30 @@ MODULE MAP_Types TYPE(MeshType) :: ptFairleadLoad !< point mesh for forces in X,Y,Z [[N]] END TYPE MAP_OutputType ! ======================= -CONTAINS +! ========= MAP_MiscVarType_C ======= + TYPE, BIND(C) :: MAP_MiscVarType_C + TYPE(C_PTR) :: object = C_NULL_PTR + END TYPE MAP_MiscVarType_C + TYPE, PUBLIC :: MAP_MiscVarType + TYPE( MAP_MiscVarType_C ) :: C_obj + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] + TYPE(MAP_InputType) :: u_perturb !< Temporary variables for Jacobian calculations [-] + TYPE(MAP_ConstraintStateType) :: z_lin !< Temporary variables for Jacobian calculations [-] + END TYPE MAP_MiscVarType +! ======================= + integer(IntKi), public, parameter :: MAP_x_dummy = 1 ! MAP%dummy + integer(IntKi), public, parameter :: MAP_u_x = 2 ! MAP%x + integer(IntKi), public, parameter :: MAP_u_y = 3 ! MAP%y + integer(IntKi), public, parameter :: MAP_u_z = 4 ! MAP%z + integer(IntKi), public, parameter :: MAP_u_PtFairDisplacement = 5 ! MAP%PtFairDisplacement + integer(IntKi), public, parameter :: MAP_y_Fx = 6 ! MAP%Fx + integer(IntKi), public, parameter :: MAP_y_Fy = 7 ! MAP%Fy + integer(IntKi), public, parameter :: MAP_y_Fz = 8 ! MAP%Fz + integer(IntKi), public, parameter :: MAP_y_WriteOutput = 9 ! MAP%WriteOutput + integer(IntKi), public, parameter :: MAP_y_wrtOutput = 10 ! MAP%wrtOutput + integer(IntKi), public, parameter :: MAP_y_ptFairleadLoad = 11 ! MAP%ptFairleadLoad + +contains subroutine MAP_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(MAP_InitInputType), intent(in) :: SrcInitInputData @@ -253,8 +275,6 @@ subroutine MAP_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSt integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'MAP_CopyInitInput' ErrStat = ErrID_None ErrMsg = '' @@ -276,22 +296,17 @@ subroutine MAP_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSt DstInitInputData%C_obj%line_input_str = SrcInitInputData%C_obj%line_input_str DstInitInputData%option_input_str = SrcInitInputData%option_input_str DstInitInputData%C_obj%option_input_str = SrcInitInputData%C_obj%option_input_str - call MAP_Fortran_CopyLin_InitInputType(SrcInitInputData%LinInitInp, DstInitInputData%LinInitInp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + DstInitInputData%Linearize = SrcInitInputData%Linearize + DstInitInputData%C_obj%Linearize = SrcInitInputData%C_obj%Linearize end subroutine subroutine MAP_DestroyInitInput(InitInputData, ErrStat, ErrMsg) type(MAP_InitInputType), intent(inout) :: InitInputData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'MAP_DestroyInitInput' ErrStat = ErrID_None ErrMsg = '' - call MAP_Fortran_DestroyLin_InitInputType(InitInputData%LinInitInp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine MAP_PackInitInput(RF, Indata) @@ -308,7 +323,7 @@ subroutine MAP_PackInitInput(RF, Indata) call RegPack(RF, InData%node_input_str) call RegPack(RF, InData%line_input_str) call RegPack(RF, InData%option_input_str) - call MAP_Fortran_PackLin_InitInputType(RF, InData%LinInitInp) + call RegPack(RF, InData%Linearize) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -335,7 +350,8 @@ subroutine MAP_UnPackInitInput(RF, OutData) OutData%C_obj%line_input_str = transfer(OutData%line_input_str, OutData%C_obj%line_input_str ) call RegUnpack(RF, OutData%option_input_str); if (RegCheckErr(RF, RoutineName)) return OutData%C_obj%option_input_str = transfer(OutData%option_input_str, OutData%C_obj%option_input_str ) - call MAP_Fortran_UnpackLin_InitInputType(RF, OutData%LinInitInp) ! LinInitInp + call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return + OutData%C_obj%Linearize = OutData%Linearize end subroutine SUBROUTINE MAP_C2Fary_CopyInitInput(InitInputData, ErrStat, ErrMsg, SkipPointers) @@ -362,6 +378,7 @@ SUBROUTINE MAP_C2Fary_CopyInitInput(InitInputData, ErrStat, ErrMsg, SkipPointers InitInputData%node_input_str = TRANSFER(InitInputData%C_obj%node_input_str, InitInputData%node_input_str ) InitInputData%line_input_str = TRANSFER(InitInputData%C_obj%line_input_str, InitInputData%line_input_str ) InitInputData%option_input_str = TRANSFER(InitInputData%C_obj%option_input_str, InitInputData%option_input_str ) + InitInputData%Linearize = InitInputData%C_obj%Linearize END SUBROUTINE SUBROUTINE MAP_F2C_CopyInitInput( InitInputData, ErrStat, ErrMsg, SkipPointers ) @@ -388,6 +405,7 @@ SUBROUTINE MAP_F2C_CopyInitInput( InitInputData, ErrStat, ErrMsg, SkipPointers InitInputData%C_obj%node_input_str = TRANSFER(InitInputData%node_input_str, InitInputData%C_obj%node_input_str) InitInputData%C_obj%line_input_str = TRANSFER(InitInputData%line_input_str, InitInputData%C_obj%line_input_str) InitInputData%C_obj%option_input_str = TRANSFER(InitInputData%option_input_str, InitInputData%C_obj%option_input_str) + InitInputData%C_obj%Linearize = InitInputData%Linearize END SUBROUTINE subroutine MAP_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg) @@ -435,7 +453,7 @@ subroutine MAP_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, Er call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call MAP_Fortran_CopyLin_InitOutputType(SrcInitOutputData%LinInitOut, DstInitOutputData%LinInitOut, CtrlCode, ErrStat2, ErrMsg2) + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end subroutine @@ -457,7 +475,7 @@ subroutine MAP_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MAP_Fortran_DestroyLin_InitOutputType(InitOutputData%LinInitOut, ErrStat2, ErrMsg2) + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine @@ -472,7 +490,7 @@ subroutine MAP_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%writeOutputHdr) call RegPackAlloc(RF, InData%writeOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) - call MAP_Fortran_PackLin_InitOutputType(RF, InData%LinInitOut) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -493,7 +511,7 @@ subroutine MAP_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%writeOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%writeOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver - call MAP_Fortran_UnpackLin_InitOutputType(RF, OutData%LinInitOut) ! LinInitOut + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine SUBROUTINE MAP_C2Fary_CopyInitOutput(InitOutputData, ErrStat, ErrMsg, SkipPointers) @@ -1856,8 +1874,6 @@ subroutine MAP_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'MAP_CopyParam' ErrStat = ErrID_None ErrMsg = '' @@ -1873,22 +1889,15 @@ subroutine MAP_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%InputLineType = SrcParamData%InputLineType DstParamData%numOuts = SrcParamData%numOuts DstParamData%C_obj%numOuts = SrcParamData%C_obj%numOuts - call MAP_Fortran_CopyLin_ParamType(SrcParamData%LinParams, DstParamData%LinParams, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return end subroutine subroutine MAP_DestroyParam(ParamData, ErrStat, ErrMsg) type(MAP_ParameterType), intent(inout) :: ParamData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'MAP_DestroyParam' ErrStat = ErrID_None ErrMsg = '' - call MAP_Fortran_DestroyLin_ParamType(ParamData%LinParams, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine MAP_PackParam(RF, Indata) @@ -1903,7 +1912,6 @@ subroutine MAP_PackParam(RF, Indata) call RegPack(RF, InData%InputLines) call RegPack(RF, InData%InputLineType) call RegPack(RF, InData%numOuts) - call MAP_Fortran_PackLin_ParamType(RF, InData%LinParams) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1924,7 +1932,6 @@ subroutine MAP_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%InputLineType); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%numOuts); if (RegCheckErr(RF, RoutineName)) return OutData%C_obj%numOuts = OutData%numOuts - call MAP_Fortran_UnpackLin_ParamType(RF, OutData%LinParams) ! LinParams end subroutine SUBROUTINE MAP_C2Fary_CopyParam(ParamData, ErrStat, ErrMsg, SkipPointers) @@ -2498,6 +2505,100 @@ SUBROUTINE MAP_F2C_CopyOutput( OutputData, ErrStat, ErrMsg, SkipPointers ) END IF END SUBROUTINE +subroutine MAP_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(MAP_MiscVarType), intent(inout) :: SrcMiscData + type(MAP_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'MAP_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MAP_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MAP_CopyConstrState(SrcMiscData%z_lin, DstMiscData%z_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine MAP_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(MAP_MiscVarType), intent(inout) :: MiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'MAP_DestroyMisc' + ErrStat = ErrID_None + ErrMsg = '' + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MAP_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MAP_DestroyConstrState(MiscData%z_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine MAP_PackMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(MAP_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'MAP_PackMisc' + if (RF%ErrStat >= AbortErrLev) return + call NWTC_Library_PackModJacType(RF, InData%Jac) + call MAP_PackInput(RF, InData%u_perturb) + call MAP_PackConstrState(RF, InData%z_lin) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine MAP_UnPackMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(MAP_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'MAP_UnPackMisc' + if (RF%ErrStat /= ErrID_None) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call MAP_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call MAP_UnpackConstrState(RF, OutData%z_lin) ! z_lin +end subroutine + +SUBROUTINE MAP_C2Fary_CopyMisc(MiscData, ErrStat, ErrMsg, SkipPointers) + TYPE(MAP_MiscVarType), INTENT(INOUT) :: MiscData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + LOGICAL,OPTIONAL,INTENT(IN ) :: SkipPointers + ! + LOGICAL :: SkipPointers_local + ErrStat = ErrID_None + ErrMsg = "" + + IF (PRESENT(SkipPointers)) THEN + SkipPointers_local = SkipPointers + ELSE + SkipPointers_local = .false. + END IF +END SUBROUTINE + +SUBROUTINE MAP_F2C_CopyMisc( MiscData, ErrStat, ErrMsg, SkipPointers ) + TYPE(MAP_MiscVarType), INTENT(INOUT) :: MiscData + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + LOGICAL,OPTIONAL,INTENT(IN ) :: SkipPointers + ! + LOGICAL :: SkipPointers_local + ErrStat = ErrID_None + ErrMsg = '' + + IF (PRESENT(SkipPointers)) THEN + SkipPointers_local = SkipPointers + ELSE + SkipPointers_local = .false. + END IF +END SUBROUTINE + subroutine MAP_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) ! ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time @@ -2865,5 +2966,272 @@ SUBROUTINE MAP_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Er CALL MeshExtrapInterp2(y1%ptFairleadLoad, y2%ptFairleadLoad, y3%ptFairleadLoad, tin, y_out%ptFairleadLoad, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) END SUBROUTINE + +function MAP_InputMeshPointer(u, DL) result(Mesh) + type(MAP_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (MAP_u_PtFairDisplacement) + Mesh => u%PtFairDisplacement + end select +end function + +function MAP_OutputMeshPointer(y, DL) result(Mesh) + type(MAP_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (MAP_y_ptFairleadLoad) + Mesh => y%ptFairleadLoad + end select +end function + +subroutine MAP_VarsPackContState(Vars, x, ValAry) + type(MAP_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call MAP_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine MAP_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(MAP_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MAP_x_dummy) + VarVals(1) = x%dummy ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine MAP_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(MAP_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call MAP_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine MAP_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(MAP_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MAP_x_dummy) + x%dummy = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function MAP_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (MAP_x_dummy) + Name = "x%dummy" + case default + Name = "Unknown Field" + end select +end function + +subroutine MAP_VarsPackContStateDeriv(Vars, x, ValAry) + type(MAP_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call MAP_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine MAP_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(MAP_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MAP_x_dummy) + VarVals(1) = x%dummy ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine MAP_VarsPackInput(Vars, u, ValAry) + type(MAP_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call MAP_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine MAP_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(MAP_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MAP_u_x) + VarVals = u%x(V%iLB:V%iUB) ! Rank 1 Array + case (MAP_u_y) + VarVals = u%y(V%iLB:V%iUB) ! Rank 1 Array + case (MAP_u_z) + VarVals = u%z(V%iLB:V%iUB) ! Rank 1 Array + case (MAP_u_PtFairDisplacement) + call MV_PackMesh(V, u%PtFairDisplacement, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine MAP_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(MAP_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call MAP_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine MAP_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(MAP_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MAP_u_x) + u%x(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MAP_u_y) + u%y(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MAP_u_z) + u%z(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MAP_u_PtFairDisplacement) + call MV_UnpackMesh(V, ValAry, u%PtFairDisplacement) ! Mesh + end select + end associate +end subroutine + +function MAP_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (MAP_u_x) + Name = "u%x" + case (MAP_u_y) + Name = "u%y" + case (MAP_u_z) + Name = "u%z" + case (MAP_u_PtFairDisplacement) + Name = "u%PtFairDisplacement" + case default + Name = "Unknown Field" + end select +end function + +subroutine MAP_VarsPackOutput(Vars, y, ValAry) + type(MAP_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call MAP_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine MAP_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(MAP_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MAP_y_Fx) + VarVals = y%Fx(V%iLB:V%iUB) ! Rank 1 Array + case (MAP_y_Fy) + VarVals = y%Fy(V%iLB:V%iUB) ! Rank 1 Array + case (MAP_y_Fz) + VarVals = y%Fz(V%iLB:V%iUB) ! Rank 1 Array + case (MAP_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (MAP_y_wrtOutput) + VarVals = y%wrtOutput(V%iLB:V%iUB) ! Rank 1 Array + case (MAP_y_ptFairleadLoad) + call MV_PackMesh(V, y%ptFairleadLoad, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine MAP_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(MAP_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call MAP_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine MAP_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(MAP_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MAP_y_Fx) + y%Fx(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MAP_y_Fy) + y%Fy(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MAP_y_Fz) + y%Fz(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MAP_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MAP_y_wrtOutput) + y%wrtOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MAP_y_ptFairleadLoad) + call MV_UnpackMesh(V, ValAry, y%ptFairleadLoad) ! Mesh + end select + end associate +end subroutine + +function MAP_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (MAP_y_Fx) + Name = "y%Fx" + case (MAP_y_Fy) + Name = "y%Fy" + case (MAP_y_Fz) + Name = "y%Fz" + case (MAP_y_WriteOutput) + Name = "y%WriteOutput" + case (MAP_y_wrtOutput) + Name = "y%wrtOutput" + case (MAP_y_ptFairleadLoad) + Name = "y%ptFairleadLoad" + case default + Name = "Unknown Field" + end select +end function + END MODULE MAP_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/map/src/MAP_Types.h b/modules/map/src/MAP_Types.h index 9040c07793..1297250660 100644 --- a/modules/map/src/MAP_Types.h +++ b/modules/map/src/MAP_Types.h @@ -29,6 +29,7 @@ typedef struct MAP_InitInputType { char node_input_str[255]; char line_input_str[255]; char option_input_str[255]; + bool Linearize; } MAP_InitInputType_t; typedef struct MAP_InitOutputType { @@ -104,6 +105,10 @@ typedef struct MAP_OutputType { double *wrtOutput; int wrtOutput_Len; } MAP_OutputType_t; +typedef struct MAP_MiscVarType { + void *object; +} MAP_MiscVarType_t; + typedef struct MAP_UserData { MAP_InitInputType_t MAP_InitInput; MAP_InitOutputType_t MAP_InitOutput; @@ -114,6 +119,7 @@ typedef struct MAP_UserData { MAP_ParameterType_t MAP_Param; MAP_InputType_t MAP_Input; MAP_OutputType_t MAP_Output; + MAP_MiscVarType_t MAP_Misc; } MAP_t; #endif // _MAP_TYPES_H diff --git a/modules/map/src/map.f90 b/modules/map/src/map.f90 index d116bdd5cd..372005d155 100644 --- a/modules/map/src/map.f90 +++ b/modules/map/src/map.f90 @@ -33,7 +33,6 @@ MODULE MAP PUBLIC :: MAP_UpdateStates PUBLIC :: MAP_CalcOutput PUBLIC :: MAP_JacobianPInput - PUBLIC :: MAP_GetOP PUBLIC :: MAP_End PUBLIC :: MAP_Restart @@ -497,7 +496,7 @@ SUBROUTINE MAP_Restart( u, p, x, xd, z, other, y, ErrStat, ErrMsg ) END SUBROUTINE MAP_Restart !========== MAP_Init ====== <----------------------------------------------------------------------+ - SUBROUTINE MAP_Init( InitInp, u, p, x, xd, z, other, y, Interval, InitOut, ErrStat, ErrMsg ) + SUBROUTINE MAP_Init( InitInp, u, p, x, xd, z, other, y, m, Interval, InitOut, ErrStat, ErrMsg ) IMPLICIT NONE TYPE( MAP_InitInputType ), INTENT(INOUT) :: InitInp ! INTENT(IN ) : Input data for initialization routine TYPE( MAP_InputType ), INTENT( OUT) :: u ! INTENT( OUT) : An initial guess for the input; input mesh must be defined @@ -507,6 +506,7 @@ SUBROUTINE MAP_Init( InitInp, u, p, x, xd, z, other, y, Interval, InitOut, ErrSt TYPE( MAP_ConstraintStateType ), INTENT( OUT) :: z ! INTENT( OUT) : Initial guess of the constraint states TYPE( MAP_OtherStateType ), INTENT( OUT) :: other ! INTENT( OUT) : Initial other/optimization states TYPE( MAP_OutputType ), INTENT( OUT) :: y ! INTENT( OUT) : Initial system outputs (outputs are not calculated; only the output mesh is initialized) + TYPE( MAP_MiscVarType ), INTENT( OUT) :: m ! INTENT( OUT) : Initial system mischellaneous vars REAL(DbKi), INTENT(INOUT) :: Interval ! Coupling interval in seconds: the rate that Output is the actual coupling interval TYPE( MAP_InitOutputType ), INTENT(INOUT) :: InitOut ! Output for initialization routine INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation @@ -686,19 +686,91 @@ SUBROUTINE MAP_Init( InitInp, u, p, x, xd, z, other, y, Interval, InitOut, ErrSt allocate( y%WriteOutput(p%numOuts), STAT=N) if (N/=0) call SetErrStat(ErrID_Fatal, 'Failed to allocate y%WriteOutput',ErrStat, ErrMsg, RoutineName) end if - + !............................................................................................ - ! Initialize Jacobian information: + ! Module Variables !............................................................................................ - if (InitInp%LinInitInp%Linearize) then - call map_Init_Jacobian( p, u, y, InitOut, ErrStat2, ErrMsg2) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end if + call MAP_InitVars(InitOut%Vars, InitInp, u, p, x, z, y, m, InitOut, InitInp%Linearize, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + END SUBROUTINE MAP_Init ! -------+ !========================================================================================================== + !---------------------------------------------------------------------------------------------------------------------------------- + !> This routine initializes module variables for use by the solver and linearization. + subroutine MAP_InitVars(Vars, InitInp, u, p, x, z, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(ModVarsType), intent(out) :: Vars !< Module variables + type(MAP_InitInputType), intent(in) :: InitInp !< Initialization input + type(MAP_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(MAP_ParameterType), intent(inout) :: p !< Parameters + type(MAP_ContinuousStateType), intent(inout) :: x !< Continuous state + type(MAP_ConstraintStateType), intent(inout) :: z !< Constraint state + type(MAP_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(MAP_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(MAP_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'MAP_InitVars' + integer(IntKi) :: ErrStat2 ! Temporary Error status + character(ErrMsgLen) :: ErrMsg2 ! Temporary Error message + integer(IntKi) :: i + real(R8Ki) :: Perturb + + ErrStat = ErrID_None + ErrMsg = "" + + !------------------------------------------------------------------------- + ! Continuous State Variables + !------------------------------------------------------------------------- + + !------------------------------------------------------------------------- + ! Input variables + !------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%u, "PtFairDisplacement", [FieldTransDisp], & + DatLoc(MAP_u_PtFairDisplacement), & + Mesh=u%PtFairDisplacement, & + Perturbs=[0.2_R8Ki*D2R * max(p%depth,1.0_R8Ki)]) + + !------------------------------------------------------------------------- + ! Output variables + !------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%y, "FairleadLoads", [FieldForce], & + DatLoc(MAP_y_PtFairleadLoad), & + Mesh=y%ptFairleadLoad) + + ! Write outputs + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, & + DatLoc(MAP_y_WriteOutput), & + Flags=VF_WriteOut, & + Num=p%numOuts,& + LinNames=[(WriteOutputLinName(i), i = 1, p%numOuts)]) + + !------------------------------------------------------------------------- + ! Initialize Variables and Jacobian data + !------------------------------------------------------------------------- + + CALL MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call MAP_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call MAP_CopyConstrState(z, m%z_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + + contains + character(LinChanLen) function WriteOutputLinName(idx) + integer(IntKi), intent(in) :: idx + WriteOutputLinName = trim(InitOut%WriteOutputHdr(idx))//', '//trim(InitOut%WriteOutputUnt(idx)) + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed + end subroutine + !========== MAP_UpdateStates ====== <-------------------------------------------------------------+ SUBROUTINE MAP_UpdateStates( t, n, u, utimes, p, x, xd, z, O, ErrStat, ErrMsg) REAL(DbKi) , INTENT(IN ) :: t @@ -1078,186 +1150,10 @@ SUBROUTINE map_set_input_file_contents(InitInp, p) END DO END SUBROUTINE map_set_input_file_contents -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine map::map_init_jacobian is consistant with this routine! -SUBROUTINE map_Perturb_u( p, n, perturb_sign, u, du ) - - TYPE(map_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(map_InputType) , INTENT(INOUT) :: u !< perturbed map inputs - REAL( R8Ki ) , INTENT( OUT) :: du !< amount that specific input was perturbed - - - ! local variables - integer :: fieldIndx - integer :: node - integer(intKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - - fieldIndx = p%LinParams%Jac_u_indx(n,2) - node = p%LinParams%Jac_u_indx(n,3) - du = p%LinParams%du - u%PtFairDisplacement%TranslationDisp (fieldIndx,node) = u%PtFairDisplacement%TranslationDisp (fieldIndx,node) + du * perturb_sign - -END SUBROUTINE map_Perturb_u -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine map::map_init_jacobian is consistant with this routine! -SUBROUTINE Compute_dY(p, y_p, y_m, delta, dY) - - TYPE(map_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(map_OutputType) , INTENT(IN ) :: y_p !< map outputs at \f$ u + \Delta u \f$ or \f$ x + \Delta x \f$ (p=plus) - TYPE(map_OutputType) , INTENT(IN ) :: y_m !< map outputs at \f$ u - \Delta u \f$ or \f$ x - \Delta x \f$ (m=minus) - REAL(R8Ki) , INTENT(IN ) :: delta !< difference in inputs or states \f$ delta = \Delta u \f$ or \f$ delta = \Delta x \f$ - REAL(R8Ki) , INTENT(INOUT) :: dY(:) !< column of dYdu or dYdx: \f$ \frac{\partial Y}{\partial u_i} = \frac{y_p - y_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial Y}{\partial x_i} = \frac{y_p - y_m}{2 \, \Delta x}\f$ - - ! local variables: - - integer(IntKi) :: indx_first ! index indicating next value of dY to be filled - logical :: Mask(FIELDMASK_SIZE) ! flags to determine if this field is part of the packing - integer(IntKi) :: k - - indx_first = 1 - if ( y_p%ptFairleadLoad%Committed ) then - call PackLoadMesh_dY(y_p%ptFairleadLoad, y_m%ptFairleadLoad, dY, indx_first) - end if - - do k=1,p%numOuts - dY(k+indx_first-1) = y_p%WriteOutput(k) - y_m%WriteOutput(k) - end do - - - - dY = dY / (2.0_R8Ki*delta) - -END SUBROUTINE Compute_dY -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. -!! Do not change the order of this packing without changing corresponding linearization routines ! -SUBROUTINE MAP_Init_Jacobian( p, u, y, InitOut, ErrStat, ErrMsg) - - TYPE(map_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(map_InputType) , INTENT(IN ) :: u !< inputs - TYPE(map_OutputType) , INTENT(IN ) :: y !< outputs - TYPE(map_InitOutputType) , INTENT(INOUT) :: InitOut !< Output for initialization routine - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'MAP_Init_Jacobian' - - ! local variables: - INTEGER(IntKi) :: i, j, k, index, index_next, index_last, nu, i_meshField, m, meshFieldCount - REAL(R8Ki) :: perturb_t, perturb - REAL(R8Ki) :: ScaleLength - LOGICAL :: FieldMask(FIELDMASK_SIZE) ! flags to determine if this field is part of the packing - - ErrStat = ErrID_None - ErrMsg = "" - - !...................................... - ! init linearization outputs: - !...................................... - - ! determine how many outputs there are in the Jacobians - p%LinParams%Jac_ny = 0 - if ( y%ptFairleadLoad%Committed ) then - p%LinParams%Jac_ny = y%ptFairleadLoad%NNodes * 3 ! 3 Forces, no Moments, at each node on the fairlead loads mesh - end if - - p%LinParams%Jac_ny = p%LinParams%Jac_ny + p%numOuts ! WriteOutput values - - !................. - ! set linearization output names: - !................. - call AllocAry(InitOut%LinInitOut%LinNames_y, p%LinParams%Jac_ny, 'LinNames_y', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - index_next = 1 - if ( y%ptFairleadLoad%Committed ) then - index_last = index_next - call PackLoadMesh_Names(y%ptFairleadLoad, 'FairleadLoads', InitOut%LinInitOut%LinNames_y, index_next) - end if - - index_last = index_next - do i=1,p%numOuts - InitOut%LinInitOut%LinNames_y(i+index_next-1) = trim(InitOut%WriteOutputHdr(i))//', '//trim(InitOut%WriteOutputUnt(i)) - end do - - - !...................................... - ! init linearization inputs: - !...................................... - - - ! determine how many inputs there are in the Jacobians - nu = 0; - if ( u%PtFairDisplacement%Committed ) then - nu = nu + u%PtFairDisplacement%NNodes * 3 ! 3 TranslationDisp at each node - end if - ! note: all other inputs are ignored - - !.................... - ! fill matrix to store index to help us figure out what the ith value of the u vector really means - ! (see hydrodyn::map_perturb_u ... these MUST match ) - ! column 1 indicates module's mesh and field - ! column 2 indicates the first index of the acceleration/load field - ! column 3 is the node - !.................... - - !............... - ! MAP input mappings stored in p%Jac_u_indx: - !............... - call AllocAry(p%LinParams%Jac_u_indx, nu, 3, 'p%LinParams%Jac_u_indx', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - index = 1 - meshFieldCount = 0 - if ( u%PtFairDisplacement%Committed ) then - !Module/Mesh/Field: u%PtFairDisplacement%TranslationDisp = 1; - i_meshField = 1 - do i=1,u%PtFairDisplacement%NNodes - do j=1,3 - p%LinParams%Jac_u_indx(index,1) = i_meshField !Module/Mesh/Field: u%PtFairDisplacement%{TranslationDisp} = m - p%LinParams%Jac_u_indx(index,2) = j !index: j - p%LinParams%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - meshFieldCount = meshFieldCount + 1 - end if - !................ - ! input perturbations, du: - !................ - - p%LinParams%du = 0.2_R8Ki*D2R * max(p%depth,1.0_R8Ki) ! translation input scaling ! u%PtFairDisplacement%TranslationDisp - - !................ - ! names of the columns, InitOut%LinNames_u: - !................ - call AllocAry(InitOut%LinInitOut%LinNames_u, nu, 'LinNames_u', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - call AllocAry(InitOut%LinInitOut%IsLoad_u, nu, 'IsLoad_u', ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - - InitOut%LinInitOut%IsLoad_u(:) = .false. ! MAP's inputs are NOT loads - - index = 1 - if ( u%PtFairDisplacement%Committed ) then - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - call PackMotionMesh_Names(u%PtFairDisplacement, 'PtFairDisplacement', InitOut%LinInitOut%LinNames_u, index, FieldMask=FieldMask) - end if - -END SUBROUTINE MAP_Init_Jacobian - -SUBROUTINE MAP_JacobianPInput( t, u, p, x, xd, z, OtherState, y, ErrStat, ErrMsg, dYdu ) +SUBROUTINE MAP_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(map_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(map_ParameterType), INTENT(INOUT) :: p !< Parameters @@ -1269,236 +1165,144 @@ SUBROUTINE MAP_JacobianPInput( t, u, p, x, xd, z, OtherState, y, ErrStat, ErrMsg !! Output fields are not used by this routine, but type is !! available here so that mesh parameter information (i.e., !! connectivity) does not have to be recalculated for dYdu. + TYPE(map_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect - !! to the inputs (u) [intent in to avoid deallocation] - - - ! local variables - INTEGER(KIND=C_INT) :: status_from_MAP - CHARACTER(KIND=C_CHAR), DIMENSION(1024) :: message_from_MAP - REAL(KIND=C_FLOAT) :: time - INTEGER(KIND=C_INT) :: interval - - TYPE(map_OutputType) :: y_p - TYPE(map_OutputType) :: y_m - TYPE(map_ConstraintStateType) :: z_perturb - TYPE(map_InputType) :: u_perturb - REAL(R8Ki) :: delta ! delta change in input or state - INTEGER(IntKi) :: i, j, NN, offsetI, offsetJ + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with respect to the inputs (u) [intent in to avoid deallocation] + CHARACTER(*), PARAMETER :: RoutineName = 'map_JacobianPInput' INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'map_JacobianPInput' - + INTEGER(KIND=C_INT) :: status_from_MAP + CHARACTER(KIND=C_CHAR), DIMENSION(1024) :: message_from_MAP + REAL(KIND=C_FLOAT) :: time + INTEGER(KIND=C_INT) :: interval + INTEGER(IntKi) :: i, j, NN, offsetI, offsetJ, col - ! Initialize ErrStat - ErrStat = ErrID_None ErrMsg = '' + time = t interval = t / p%dt - if ( present( dYdu ) ) then + ! Make a copy of the inputs to perturb + call MAP_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call MAP_VarsPackInput(Vars, u, m%Jac%u) - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdu)) then ! allocate dYdu if necessary if (.not. allocated(dYdu)) then - call AllocAry(dYdu, p%LinParams%Jac_ny, size(p%LinParams%Jac_u_indx,1), 'dYdu', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) then - call cleanup() - return - end if + call AllocAry(dYdu, Vars%Ny, Vars%Nu, 'dYdu', ErrStat2, ErrMsg2); if (Failed()) return end if - - - do i=1,size(p%LinParams%Jac_u_indx,1) - - ! get u_op + delta u - call map_CopyInput( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - call map_Perturb_u( p, i, 1, u_perturb, delta ) - call MAP_CopyConstrState( z, z_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - DO j = 1,u_perturb%PtFairDisplacement%NNodes - u_perturb%X(j) = u_perturb%PtFairDisplacement%Position(1,j) + u_perturb%PtFairDisplacement%TranslationDisp(1,j) - u_perturb%Y(j) = u_perturb%PtFairDisplacement%Position(2,j) + u_perturb%PtFairDisplacement%TranslationDisp(2,j) - u_perturb%Z(j) = u_perturb%PtFairDisplacement%Position(3,j) + u_perturb%PtFairDisplacement%TranslationDisp(3,j) - END DO - - ! compute constraint state for u_op + delta u - call MSQS_UpdateStates( time , & - interval , & - u_perturb%C_obj , & - p%C_obj , & - x%C_obj , & - xd%C_obj , & - z_perturb%C_obj , & - OtherState%C_obj , & - status_from_MAP , & - message_from_MAP ) + ! Loop through input variables + do i = 1, size(Vars%u) - call MAP_ERROR_CHECKER(message_from_MAP,status_from_MAP,ErrMsg2,ErrStat2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg, RoutineName) + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num - + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call MAP_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call MAP_CopyConstrState(z, m%z_lin, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + + ! Calculate absolute position of each node + m%u_perturb%X = m%u_perturb%PtFairDisplacement%Position(1,:) + m%u_perturb%PtFairDisplacement%TranslationDisp(1,:) + m%u_perturb%Y = m%u_perturb%PtFairDisplacement%Position(2,:) + m%u_perturb%PtFairDisplacement%TranslationDisp(2,:) + m%u_perturb%Z = m%u_perturb%PtFairDisplacement%Position(3,:) + m%u_perturb%PtFairDisplacement%TranslationDisp(3,:) + ! Compute constraint state for u_op + delta u + call MSQS_UpdateStates(time, & + interval, & + m%u_perturb%C_obj, & + p%C_obj, & + x%C_obj, & + xd%C_obj, & + m%z_lin%C_obj, & + OtherState%C_obj, & + status_from_MAP, & + message_from_MAP ) + + call MAP_ERROR_CHECKER(message_from_MAP, status_from_MAP, ErrMsg2, ErrStat2); if (Failed()) return + ! compute y at u_op + delta u - call map_CalcOutput( t, u_perturb, p, x, xd, z_perturb, OtherState, y, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later + ! MAP++ (in the c-code) requires that the output data structure be y, which was used when MAP++ was initialized. + call map_CalcOutput(t, m%u_perturb, p, x, xd, m%z_lin, OtherState, y, ErrStat2, ErrMsg2); if (Failed()) return + call MAP_VarsPackOutput(Vars, y, m%Jac%y_pos) - ! We need to do this copy inside the loop because MAP++ (in the c-code) requires that the output data structure be y, which was used when MAP++ was initialized. - call map_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call MAP_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call MAP_CopyConstrState(z, m%z_lin, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return - ! get u_op - delta u - call map_CopyInput( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - ! Minus perturbation - call map_Perturb_u( p, i, -1, u_perturb, delta ) - - call MAP_CopyConstrState( z, z_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later - - - DO j = 1,u_perturb%PtFairDisplacement%NNodes - u_perturb%X(j) = u_perturb%PtFairDisplacement%Position(1,j) + u_perturb%PtFairDisplacement%TranslationDisp(1,j) - u_perturb%Y(j) = u_perturb%PtFairDisplacement%Position(2,j) + u_perturb%PtFairDisplacement%TranslationDisp(2,j) - u_perturb%Z(j) = u_perturb%PtFairDisplacement%Position(3,j) + u_perturb%PtFairDisplacement%TranslationDisp(3,j) - END DO + ! Calculate absolute position of each node + m%u_perturb%X = m%u_perturb%PtFairDisplacement%Position(1,:) + m%u_perturb%PtFairDisplacement%TranslationDisp(1,:) + m%u_perturb%Y = m%u_perturb%PtFairDisplacement%Position(2,:) + m%u_perturb%PtFairDisplacement%TranslationDisp(2,:) + m%u_perturb%Z = m%u_perturb%PtFairDisplacement%Position(3,:) + m%u_perturb%PtFairDisplacement%TranslationDisp(3,:) - ! compute constraint state for u_op + delta u - call MSQS_UpdateStates( time , & - interval , & - u_perturb%C_obj , & - p%C_obj , & - x%C_obj , & - xd%C_obj , & - z_perturb%C_obj , & - OtherState%C_obj , & - status_from_MAP , & - message_from_MAP ) - - call MAP_ERROR_CHECKER(message_from_MAP,status_from_MAP,ErrMsg2,ErrStat2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat,ErrMsg, RoutineName) - - ! compute y at u_op - delta u - call map_CalcOutput( t, u_perturb, p, x, xd, z_perturb, OtherState, y, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later + ! compute constraint state for u_op - delta u + call MSQS_UpdateStates( time, & + interval, & + m%u_perturb%C_obj, & + p%C_obj, & + x%C_obj, & + xd%C_obj, & + m%z_lin%C_obj, & + OtherState%C_obj, & + status_from_MAP, & + message_from_MAP) + + call MAP_ERROR_CHECKER(message_from_MAP,status_from_MAP,ErrMsg2,ErrStat2); if (Failed()) return - ! We need to do this copy inside the loop because MAP++ (in the c-code) requires that the output data structure be y, which was used when MAP++ was initialized. - call map_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! compute y at u_op - delta u + ! MAP++ (in the c-code) requires that the output data structure be y, which was used when MAP++ was initialized. + call map_CalcOutput(t, m%u_perturb, p, x, xd, m%z_lin, OtherState, y, ErrStat2, ErrMsg2 ); if (Failed()) return + call MAP_VarsPackOutput(Vars, y, m%Jac%y_neg) - ! get central difference: note: assumes delta is equivalent for both perturb_u calls. - call Compute_dY( p, y_p, y_m, delta, dYdu(:,i) ) - + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,col)) + end do end do end if - call cleanup() - - ! Calling CalcOutput at operating point to ensure that "y" does not have the values of y_m (MAP specific issue) - call map_CalcOutput( t, u, p, x, xd, z, OtherState, y, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! we shouldn't have any errors about allocating memory here so I'm not going to return-on-error until later -contains - subroutine cleanup() - call map_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call map_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call map_DestroyConstrState( z_perturb, ErrStat2, ErrMsg2 ) - call map_DestroyInput( u_perturb, ErrStat2, ErrMsg2 ) - - end subroutine cleanup -END SUBROUTINE MAP_JacobianPInput -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE MAP_GetOP( t, u, p, x, xd, z, OtherState, y, ErrStat, ErrMsg, u_op, y_op) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(map_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(map_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(map_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(map_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(map_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(map_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(map_OutputType), INTENT(IN ) :: y !< Output at operating point - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + if (present(dXdu)) then + if (allocated(dXdu)) deallocate(dXdu) + end if + ! Calculate the partial derivative of the discrete state functions (Xd) with respect to the inputs (u) here: + if (present(dXddu)) then + if (allocated(dXddu)) deallocate(dXddu) + end if - INTEGER(IntKi) :: i, k, index, nu - INTEGER(IntKi) :: ny - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'map_GetOP' - TYPE(map_ContinuousStateType) :: dx !< derivative of continuous states at operating point - LOGICAL :: Mask(FIELDMASK_SIZE) !< flags to determine if this field is part of the packing + ! Calculate the partial derivative of the constraint state functions (Z) with respect to the inputs (u) here: + if (present(dZdu)) then + if (allocated(dZdu)) deallocate(dZdu) + end if - !LIN-TODO: Need to review and implement this routine per plan. Do not understand how to implement at the moment, GJH. - ! Initialize ErrStat - - ErrStat = ErrID_None - ErrMsg = '' - - !.................................. - IF ( PRESENT( u_op ) ) THEN - - if (.not. allocated(u_op)) then - - nu = size(p%LinParams%Jac_u_indx,1) - - call AllocAry(u_op, nu,'u_op',ErrStat2,ErrMsg2) ! - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - - end if - - Mask = .false. - Mask(MASKID_TRANSLATIONDISP) = .true. - - index = 1 - if ( u%PtFairDisplacement%Committed ) then - call PackMotionMesh(u%PtFairDisplacement, u_op, index, FieldMask=Mask) - end if - - END IF - - !.................................. - if ( PRESENT( y_op ) ) then - - if (.not. allocated(y_op)) then - call AllocAry(y_op, p%LinParams%Jac_ny, 'y_op', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end if - - index = 1 - if ( y%ptFairleadLoad%Committed ) then - call PackLoadMesh(y%ptFairleadLoad, y_op, index) - end if - - index = index - 1 - do i=1,p%numOuts - y_op(i+index) = y%WriteOutput(i) - end do - - end if + ! Calling CalcOutput at operating point to ensure that "y" does not have the values of y_m (MAP specific issue) + call map_CalcOutput(t, u, p, x, xd, z, OtherState, y, ErrStat2, ErrMsg2); if (Failed()) return -END SUBROUTINE MAP_GetOP +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +END SUBROUTINE MAP_JacobianPInput !========================================================================================================== ! ========== MAP_ERROR_CHECKER ====== <-----------------------------------------------------------+ ! ! | - ! A convenient way to convert C-character arrays into a fortran string. The return argustment + ! A convenient way to convert C-character arrays into a fortran string. The return argument ! is a logical: False if program is safe; True if program fails in the MAP DLL SUBROUTINE MAP_ERROR_CHECKER(msg, stat, ErrMsg, ErrStat) CHARACTER(KIND=C_CHAR), DIMENSION(1024), INTENT(INOUT) :: msg diff --git a/modules/moordyn/CMakeLists.txt b/modules/moordyn/CMakeLists.txt index b749b229a2..ef15882385 100644 --- a/modules/moordyn/CMakeLists.txt +++ b/modules/moordyn/CMakeLists.txt @@ -47,22 +47,15 @@ set_property(TARGET moordyn_c_binding_object PROPERTY POSITION_INDEPENDENT_CODE if(APPLE OR UNIX) target_compile_definitions(moordyn_c_binding_object PRIVATE IMPLICIT_DLLEXPORT) endif() -# shared + +# Shared add_library(moordyn_c_binding SHARED $) target_link_libraries(moordyn_c_binding moordynlib seastlib nwtclibs versioninfolib) -if(APPLE OR UNIX) - target_compile_definitions(moordyn_c_binding PRIVATE IMPLICIT_DLLEXPORT) -endif() # C-bindings non-shared interface # This is a workaround for building wavetank into a single DLL (also allows setting CU globaly for sending screen to file for labview integration) add_library(moordyn_c_bind_static SHARED $) target_link_libraries(moordyn_c_bind_static moordynlib seastlib nwtclibs versioninfolib) -if(APPLE OR UNIX) - target_compile_definitions(moordyn_c_bind_static PRIVATE IMPLICIT_DLLEXPORT) -endif() - - install(TARGETS moordynlib moordyn_driver moordyn_c_binding moordyn_c_bind_static EXPORT "${CMAKE_PROJECT_NAME}Libraries" diff --git a/modules/moordyn/src/MoorDyn.f90 b/modules/moordyn/src/MoorDyn.f90 index 1ba16c8ccd..67191d4609 100644 --- a/modules/moordyn/src/MoorDyn.f90 +++ b/modules/moordyn/src/MoorDyn.f90 @@ -47,7 +47,6 @@ MODULE MoorDyn PUBLIC :: MD_JacobianPInput PUBLIC :: MD_JacobianPDiscState PUBLIC :: MD_JacobianPConstrState - PUBLIC :: MD_GetOP CONTAINS @@ -2939,16 +2938,25 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er xd%dummy = 0 z%dummy = 0 - if (InitInp%Linearize) then - IF ((compVIV) .OR. (compVisco)) THEN - ErrStat2 = ErrID_Fatal - ErrMsg2 = "Linearization cannot be used with the VIV or Viscoelastic model in MoorDyn" - CALL CheckError( ErrStat2, ErrMsg2 ) - RETURN - ELSE - call MD_Init_Jacobian(InitInp, p, u, y, m, InitOut, ErrStat2, ErrMsg2); if(Failed()) return - ENDIF + if (InitInp%Linearize .and. ((compVIV) .OR. (compVisco))) then + ErrStat2 = ErrID_Fatal + ErrMsg2 = "Linearization cannot be used with the VIV or Viscoelastic model in MoorDyn" + CALL CheckError( ErrStat2, ErrMsg2 ) + endif + + !-------------------------------------------------- + ! initialize line visualization meshes if needed + if (p%VisMeshes) then + if (p%NLines > 0) then + call VisLinesMesh_Init(p,m,y,ErrStat2,ErrMsg2); if(Failed()) return + endif + if (p%NRods > 0) then + call VisRodsMesh_Init(p,m,y,ErrStat2,ErrMsg2); if(Failed()) return + endif endif + + ! Initialize module variables + call MD_InitVars(InitOut%Vars, InitInp, u, p, x, z, y, m, InitOut, InitInp%Linearize, ErrStat2, ErrMsg2); if(Failed()) return CALL WrScr(' MoorDyn initialization completed.') if (p%writeLog > 0) then @@ -2964,19 +2972,6 @@ SUBROUTINE MD_Init(InitInp, u, p, x, xd, z, other, y, m, DTcoupling, InitOut, Er ! TODO: add feature for automatic water depth increase based on max anchor depth! - - !-------------------------------------------------- - ! initialize line visualization meshes if needed - if (p%VisMeshes) then - if (p%NLines > 0) then - call VisLinesMesh_Init(p,m,y,ErrStat2,ErrMsg2); if(Failed()) return - endif - if (p%NRods > 0) then - call VisRodsMesh_Init(p,m,y,ErrStat2,ErrMsg2); if(Failed()) return - endif - endif - - CONTAINS @@ -3059,8 +3054,334 @@ end function NextLine END SUBROUTINE MD_Init !----------------------------------------------------------------------------------------====== + !----------------------------------------------------------------------------------------------------------------------- + !> This routine initializes module variables for use by the solver and linearization. + subroutine MD_InitVars(Vars, InitInp, u, p, x, z, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(ModVarsType), intent(out) :: Vars !< Module variables + type(MD_InitInputType), intent(in) :: InitInp !< Initialization input + type(MD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(MD_ParameterType), intent(inout) :: p !< Parameters + type(MD_ContinuousStateType), intent(inout) :: x !< Continuous state + type(MD_ConstraintStateType), intent(inout) :: z !< Constraint state + type(MD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(MD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(MD_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'MD_InitVars' + integer(IntKi) :: ErrStat2 ! Temporary Error status + character(ErrMsgLen) :: ErrMsg2 ! Temporary Error message + integer(IntKi) :: i, j, l, N + real(R8Ki) :: Perturb + real(R8Ki) :: dl_slack ! how much a given line segment is stretched [m] + real(R8Ki) :: dl_slack_min ! minimum change in a node position for the least-strained segment in the simulation to go slack [m] + character(32) :: LinStr ! Used for constructing linearization variable names + logical :: LinCtrl ! Is the current DeltaL channel associated with a line? + type(ModVarType) :: VarTmp ! Temporary variable for velocity states + character(20), parameter :: TransDispSuffix(*) = [' Px, m', ' Py, m', ' Pz, m'] + character(20), parameter :: TransVelSuffix(*) = [' Vx, m/s', ' Vy, m/s', ' Vz, m/s'] + character(20), parameter :: AngularDispSuffix(*) = [' rot_x, rad', ' rot_y, rad', ' rot_z, rad'] + character(20), parameter :: AngularVelSuffix(*) = [' omega_x, rad/s', ' omega_y, rad/s', ' omega_z, rad/s'] + + ErrStat = ErrID_None + ErrMsg = "" + + !------------------------------------------------------------------------- + ! Perturbation sizes + !------------------------------------------------------------------------- + + ! Figure out appropriate transverse perturbation size to avoid slack segments + dl_slack_min = 0.1_ReKi ! start at 0.1 m + + do l = 1,p%nLines + do I = 1, m%LineList(l)%N + dl_slack = m%LineList(l)%lstr(I) - m%LineList(l)%l(I) + + ! store the smallest positive length margin to a segment going slack + if (( dl_slack > 0.0_ReKi) .and. (dl_slack < dl_slack_min)) then + dl_slack_min = dl_slack + end if + end do + end do + + dl_slack_min = 0.5*dl_slack_min ! apply 0.5 safety factor + + !------------------------------------------------------------------------- + ! Continuous State Variables + !------------------------------------------------------------------------- + + ! NOTE: the order is different than the order of the internal states. This is to + ! match what the OpenFAST framework is expecting: all positions first, then all + ! derviatives of positions (velocity terms) second. This adds slight complexity + ! here, but considerably simplifies post processing of the full OpenFAST results + ! for linearization. + ! The p%dxIdx_map2_xStateIdx array holds the index for the x%states array + ! corresponding to the current jacobian index. + + !----------------- + ! position states + !----------------- + + ! Free bodies + DO l = 1, p%nFreeBodies ! Body m%BodyList(m%FreeBodyIs(l)) + LinStr = 'Body '//Num2LStr(m%FreeBodyIs(l)) + + ! If coupled pinned body + if (m%BodyList(m%FreeBodyIs(l))%typeNum == 2) then + ! Add angular displacement + call MV_AddVar(Vars%x, LinStr, FieldAngularDisp, & + DL=DatLoc(MD_x_states), & + iAry=m%BodyStateIs1(l)+3, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.02_R8Ki, & + LinNames=[(trim(LinStr)//AngularDispSuffix(j), j=1,3)]) + else + ! Add translation displacement + call MV_AddVar(Vars%x, LinStr, FieldTransDisp, & + DL=DatLoc(MD_x_states), & + iAry=m%BodyStateIs1(l)+6, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=dl_slack_min, & + LinNames=[(trim(LinStr)//TransDispSuffix(j), j=1,3)]) + ! Add angular displacement + call MV_AddVar(Vars%x, LinStr, FieldAngularDisp, & + DL=DatLoc(MD_x_states), & + iAry=m%BodyStateIs1(l)+9, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.02_R8Ki, & + LinNames=[(trim(LinStr)//AngularDispSuffix(j), j=1,3)]) + end if + end do + + ! Rods + DO l = 1,p%nFreeRods ! Rod m%RodList(m%FreeRodIs(l)) + LinStr = 'Rod '//Num2LStr(m%FreeRodIs(l)) + + ! If pinned rod + if (abs(m%RodList(m%FreeRodIs(l))%typeNum) == 1) then + ! Add angular displacement + call MV_AddVar(Vars%x, LinStr, FieldAngularDisp, DatLoc(MD_x_states), & + iAry=m%RodStateIs1(l)+3, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.02_R8Ki, & + LinNames=[(trim(LinStr)//AngularDispSuffix(j), j=1,3)]) + else + ! Add translation displacement + call MV_AddVar(Vars%x, LinStr, FieldTransDisp, DatLoc(MD_x_states), & + iAry=m%RodStateIs1(l)+6, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=dl_slack_min, & + LinNames=[(trim(LinStr)//TransDispSuffix(j), j=1,3)]) + ! Add angular displacement + call MV_AddVar(Vars%x, LinStr, FieldAngularDisp, DatLoc(MD_x_states), & + iAry=m%RodStateIs1(l)+9, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.02_R8Ki, & + LinNames=[(trim(LinStr)//AngularDispSuffix(j), j=1,3)]) + end if + end do + + ! Free Points + do l = 1, p%nFreePoints ! Point m%PointList(m%FreePointIs(l)) + ! corresponds to state indices: (m%PointStateIs1(l)+3:m%PointStateIs1(l)+5) + LinStr = 'Point '//Num2LStr(m%FreePointIs(l)) + call MV_AddVar(Vars%x, LinStr, FieldTransDisp, DatLoc(MD_x_states), & + iAry=m%PointStateIs1(l)+3, & ! x%state index + Num=3, Flags=VF_DerivOrder2, & + Perturb=dl_slack_min, & + LinNames=[(trim(LinStr)//TransDispSuffix(j), j=1,3)]) + end do + + ! Lines + do l = 1, p%nLines ! Line m%LineList(l) + ! corresponds to state indices: (m%LineStateIs1(l)+3*N-3:m%LineStateIs1(l)+6*N-7) -- NOTE: end nodes not included + N = m%LineList(l)%N ! number of segments in the line + do i = 0, N-2 + LinStr = 'Line '//trim(num2lstr(l))//' node '//trim(num2lstr(i+1)) + call MV_AddVar(Vars%x, LinStr, FieldTransDisp, DatLoc(MD_x_states), & + iAry=m%LineStateIs1(l) + 3*N + 3*i - 3, & ! x%state index + Num=3, Flags=VF_DerivOrder2, & + Perturb=dl_slack_min, & + LinNames=[(trim(LinStr)//TransDispSuffix(j), j=1,3)]) + end do + end do + + !----------------- + ! velocity states + !----------------- + + ! Free bodies + DO l = 1, p%nFreeBodies ! Body m%BodyList(m%FreeBodyIs(l)) + LinStr = 'Body '//Num2LStr(m%FreeBodyIs(l)) + + ! If coupled pinned body + if (m%BodyList(m%FreeBodyIs(l))%typeNum == 2) then + ! Add angular displacement + call MV_AddVar(Vars%x, LinStr, FieldAngularVel, DatLoc(MD_x_states), & + iAry=m%BodyStateIs1(l)+0, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.1_R8Ki, & + LinNames=[(trim(LinStr)//AngularVelSuffix(j), j=1,3)]) + else + ! Add translation displacement + call MV_AddVar(Vars%x, LinStr, FieldTransVel, DatLoc(MD_x_states), & + iAry=m%BodyStateIs1(l)+0, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.1_R8Ki, & + LinNames=[(trim(LinStr)//TransVelSuffix(j), j=1,3)]) + ! Add angular displacement + call MV_AddVar(Vars%x, LinStr, FieldAngularVel, DatLoc(MD_x_states), & + iAry=m%BodyStateIs1(l)+3, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.1_R8Ki, & + LinNames=[(trim(LinStr)//AngularVelSuffix(j), j=1,3)]) + end if + end do + + ! Rods + DO l = 1,p%nFreeRods ! Rod m%RodList(m%FreeRodIs(l)) + LinStr = 'Rod '//Num2LStr(m%FreeRodIs(l)) + + ! If pinned rod + if (abs(m%RodList(m%FreeRodIs(l))%typeNum) == 1) then + ! Add angular displacement + call MV_AddVar(Vars%x, LinStr, FieldAngularVel, DatLoc(MD_x_states), & + iAry=m%RodStateIs1(l)+0, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.1_R8Ki, & + LinNames=[(trim(LinStr)//AngularVelSuffix(j), j=1,3)]) + else + ! Add translation displacement + call MV_AddVar(Vars%x, LinStr, FieldTransVel, DatLoc(MD_x_states), & + iAry=m%RodStateIs1(l)+0, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.1_R8Ki, & + LinNames=[(trim(LinStr)//TransVelSuffix(j), j=1,3)]) + ! Add angular displacement + call MV_AddVar(Vars%x, LinStr, FieldAngularVel, DatLoc(MD_x_states), & + iAry=m%RodStateIs1(l)+3, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.02_R8Ki, & + LinNames=[(trim(LinStr)//AngularVelSuffix(j), j=1,3)]) + end if + end do + + ! Free Points + do l = 1, p%nFreePoints ! Point m%PointList(m%FreePointIs(l)) + ! corresponds to state indices: (m%PointStateIs1(l)+3:m%PointStateIs1(l)+5) + LinStr = 'Point '//Num2LStr(m%FreePointIs(l)) + call MV_AddVar(Vars%x, LinStr, FieldTransVel, DatLoc(MD_x_states), & + iAry=m%PointStateIs1(l)+0, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.1_R8Ki, & + LinNames=[(trim(LinStr)//TransVelSuffix(j), j=1,3)]) + end do + + ! Lines + do l = 1, p%nLines ! Line m%LineList(l) + ! corresponds to state indices: (m%LineStateIs1(l)+3*N-3:m%LineStateIs1(l)+6*N-7) -- NOTE: end nodes not included + N = m%LineList(l)%N ! number of segments in the line + do i = 0, N-2 + LinStr = 'Line '//trim(num2lstr(l))//' node '//trim(num2lstr(i+1)) + call MV_AddVar(Vars%x, LinStr, FieldTransVel, DatLoc(MD_x_states), & + iAry=m%LineStateIs1(l) + 3*i + 0, & + Num=3, Flags=VF_DerivOrder2, & + Perturb=0.1_R8Ki, & + LinNames=[(trim(LinStr)//TransVelSuffix(j), j=1,3)]) + end do + end do + + !------------------------------------------------------------------------- + ! Input variables + !------------------------------------------------------------------------- + + allocate(Vars%u(0)) + + do i = 1, p%nTurbines + call MV_AddMeshVar(Vars%u, "CoupledKinematics", MotionFields, & + DatLoc(MD_u_CoupledKinematics, i), & + Mesh=u%CoupledKinematics(i), & + Perturbs=[dl_slack_min, & ! FieldTransDisp + 0.1_R8Ki, & ! FieldOrientation + 0.1_R8Ki, & ! FieldTransVel + 0.1_R8Ki, & ! FieldAngularVel + 0.1_R8Ki, & ! FieldTransAcc + 0.1_R8Ki]) ! FieldAngularAcc + end do + ! This could be stored more efficiently, but maintains order compatible with previous implementation. + if (allocated(u%DeltaL)) then + ! Signals may be passed in without being requested for control + do i = 1,size(u%DeltaL) + + ! Figure out if this DeltaL control channel is associated with a line or multiple or none and label + LinCtrl = .FALSE. + LinStr = '(lines: ' + do j = 1, p%NLines + if (m%LineList(j)%CtrlChan == i) then + LinCtrl = .TRUE. + LinStr = LinStr//trim(num2lstr(i))//' ' + endif + enddo + + if (LinCtrl) then + LinStr = LinStr//' )' + else + LinStr = '(lines: none)' + end if + + call MV_AddVar(Vars%u, "DeltaL "//trim(num2lstr(i)), FieldTransDisp, & + DatLoc(MD_u_DeltaL), iAry=i, & + Perturb=dl_slack_min, & + LinNames=['CtrlChan DeltaL '//trim(num2lstr(i))//', m '//trim(LinStr)]) + + call MV_AddVar(Vars%u, "DeltaLdot "//trim(num2lstr(i)), FieldTransVel, & + DatLoc(MD_u_DeltaLdot), iAry=i, & + Perturb=0.2_R8Ki, & + LinNames=['CtrlChan DeltaLdot '//trim(num2lstr(i))//', m/s'//trim(LinStr)]) + end do + endif + + !------------------------------------------------------------------------- + ! Output variables + !------------------------------------------------------------------------- + + do i = 1, p%nTurbines + call MV_AddMeshVar(Vars%y, "LinNames_y", LoadFields, & + DatLoc(MD_y_CoupledLoads, i), & + Mesh=y%CoupledLoads(i)) + end do + + ! Write outputs + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, DatLoc(MD_y_WriteOutput), & + Flags=VF_WriteOut, & + Num=p%numOuts,& + LinNames=[(WriteOutputLinName(i), i = 1, p%numOuts)]) + + !------------------------------------------------------------------------- + ! Initialize Variables and Jacobian data + !------------------------------------------------------------------------- + + CALL MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call MD_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call MD_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call MD_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call MD_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + + contains + character(LinChanLen) function WriteOutputLinName(idx) + integer(IntKi), intent(in) :: idx + WriteOutputLinName = trim(InitOut%WriteOutputHdr(idx))//', '//trim(InitOut%WriteOutputUnt(idx)) + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed + end subroutine !----------------------------------------------------------------------------------------====== SUBROUTINE MD_UpdateStates( t, n, u, t_array, p, x, xd, z, other, m, ErrStat, ErrMsg) @@ -3602,7 +3923,7 @@ SUBROUTINE MD_CalcContStateDeriv( t, u, p, x, xd, z, other, m, dxdt, ErrStat, Er INTEGER(IntKi) :: J ! index INTEGER(IntKi) :: K ! index INTEGER(IntKi) :: iTurb ! index -! INTEGER(IntKi) :: Istart ! start index of line/point in state vector +! INTEGER(IntKi) :: iAry ! start index of line/point in state vector ! INTEGER(IntKi) :: Iend ! end index of line/point in state vector ! REAL(DbKi) :: temp(3) ! temporary for passing kinematics @@ -4288,7 +4609,8 @@ END SUBROUTINE MD_RK4 !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and DZ/du are returned. -SUBROUTINE MD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +SUBROUTINE MD_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) + type(ModVarsType), INTENT(IN ) :: Vars !< Module variables for packing arrays REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(MD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(MD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -4306,99 +4628,111 @@ SUBROUTINE MD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) wrt the inputs (u) [intent in to avoid deallocation] ! local variables - TYPE(MD_OutputType) :: y_m, y_p - TYPE(MD_ContinuousStateType) :: x_m, x_p - TYPE(MD_InputType) :: u_perturb - REAL(R8Ki) :: delta_p, delta_m ! delta change in input (plus, minus) - INTEGER(IntKi) :: i - integer(intKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'MD_JacobianPInput' - - ! Initialize ErrStat + character(*), parameter :: RoutineName = 'MD_JacobianPInput' + integer(intKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: i, j, iCol + ErrStat = ErrID_None ErrMsg = '' + + ! Get OP values here + call MD_CalcOutput(t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2); if(Failed()) return - ! get OP values here: - call MD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2 ); if(Failed()) return - - ! make a copy of the inputs to perturb - call MD_CopyInput( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return + ! Copy inputs to perturb + call MD_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackInput(Vars, u, m%Jac%u) - IF ( PRESENT( dYdu ) ) THEN - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: - if (.not. allocated(dYdu) ) then - call AllocAry(dYdu, p%Jac_ny, size(p%Jac_u_indx,1),'dYdu', ErrStat2, ErrMsg2); if(Failed()) return + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdu)) then + + ! Allocate dYdu if not allocated + if (.not. allocated(dYdu)) then + call AllocAry(dYdu, m%Jac%Ny, m%Jac%Nu, 'dYdu', ErrStat2, ErrMsg2); if (Failed()) return end if - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call MD_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return - call MD_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return - do i=1,size(p%Jac_u_indx,1) - ! get u_op + delta_p u - call MD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call MD_Perturb_u( p, i, 1, u_perturb, delta_p ) - ! compute y at u_op + delta_p u - call MD_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get u_op - delta_m u - call MD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call MD_Perturb_u( p, i, -1, u_perturb, delta_m ) - ! compute y at u_op - delta_m u - call MD_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get central difference: - call MD_Compute_dY( p, y_p, y_m, delta_p, dYdu(:,i) ) + + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num + + ! Calculate column index + iCol = Vars%u(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call MD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call MD_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call MD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call MD_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,iCol)) + end do end do - if(Failed()) return END IF - IF ( PRESENT( dXdu ) ) THEN + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + if (present(dXdu)) then + + ! Allocate dXdu if not allocated if (.not. allocated(dXdu)) then - call AllocAry(dXdu, p%Jac_nx, size(p%Jac_u_indx,1), 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return - endif - do i=1,size(p%Jac_u_indx,1) - ! get u_op + delta u - call MD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call MD_Perturb_u( p, i, 1, u_perturb, delta_p ) - ! compute x at u_op + delta u - call MD_CalcContStateDeriv( t, u_perturb, p, x, xd, z, OtherState, m, x_p, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get u_op - delta u - call MD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call MD_Perturb_u( p, i, -1, u_perturb, delta_m ) - ! compute x at u_op - delta u - call MD_CalcContStateDeriv( t, u_perturb, p, x, xd, z, OtherState, m, x_m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get central difference: - ! we may have had an error allocating memory, so we'll check - if(Failed()) return - ! get central difference (state entries are mapped to the dXdu column in routine): - call MD_Compute_dX( p, x_p, x_m, delta_p, dXdu(:,i) ) + call AllocAry(dXdu, m%Jac%Nx, m%Jac%Nu, 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return + end if + + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num + + ! Calculate column index + iCol = Vars%u(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call MD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call MD_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call MD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call MD_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdu(:,iCol) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%u(i)%Perturb) + end do end do - END IF ! dXdu - IF ( PRESENT( dXddu ) ) THEN - if (allocated(dXddu)) deallocate(dXddu) - END IF - IF ( PRESENT( dZdu ) ) THEN - if (allocated(dZdu)) deallocate(dZdu) - END IF - call CleanUp() -contains + end if ! dXdu + + if (present(dxddu)) then + if (allocated(dxddu)) deallocate(dxddu) + end if + + if (present(dzdu)) then + if (allocated(dzdu)) deallocate(dzdu) + end if + +contains logical function Failed() call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) Failed = ErrStat >= AbortErrLev - if (Failed) call CleanUp() end function Failed - - subroutine CleanUp() - call MD_DestroyContState( x_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call MD_DestroyContState( x_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - call MD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call MD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call MD_DestroyInput(u_perturb, ErrStat2, ErrMsg2 ) - end subroutine cleanup - END SUBROUTINE MD_JacobianPInput !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. -SUBROUTINE MD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) +SUBROUTINE MD_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) + type(ModVarsType), INTENT(IN ) :: Vars !< Module variables for packing arrays REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(MD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(MD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -4414,98 +4748,103 @@ SUBROUTINE MD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state functions (X) wrt the continuous states (x) [intent in to avoid deallocation] REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state functions (Xd) wrt the continuous states (x) [intent in to avoid deallocation] REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state functions (Z) wrt the continuous states (x) [intent in to avoid deallocation] + ! local variables - TYPE(MD_OutputType) :: y_p, y_m - TYPE(MD_ContinuousStateType) :: x_p, x_m - TYPE(MD_ContinuousStateType) :: x_perturb - REAL(R8Ki) :: delta ! delta change in input or state - INTEGER(IntKi) :: i, k - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'MD_JacobianPContState' - - ! Initialize ErrStat + character(*), parameter :: RoutineName = 'MD_JacobianPContState' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, iCol + ErrStat = ErrID_None ErrMsg = '' - ! make a copy of the continuous states to perturb NOTE: MESH_NEWCOPY - call MD_CopyContState( x, x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return + ! Copy state values + call MD_CopyContState(x, m%x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackContState(Vars, x, m%Jac%x) - IF ( PRESENT( dYdx ) ) THEN - ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + if (present(dYdx)) then + + ! Allocate dYdx if not allocated if (.not. allocated(dYdx)) then - call AllocAry(dYdx, p%Jac_ny, p%Jac_nx, 'dYdx', ErrStat2, ErrMsg2); if(Failed()) return + call AllocAry(dYdx, m%Jac%Ny, m%Jac%Nx, 'dYdx', ErrStat2, ErrMsg2); if (Failed()) return end if - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call MD_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call MD_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return - ! Loop over the dx dimension of the dYdx array. Perturb the corresponding state (note difference in ordering of dYdx and x%states). - ! The p%dxIdx_map2_xStateIdx(i) is the index to the state array for the given dx index - do i=1,p%Jac_nx ! index into dx dimension - ! get x_op + delta x - call MD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call MD_perturb_x(p, i, 1, x_perturb, delta ) - ! compute y at x_op + delta x - call MD_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get x_op - delta x - call MD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call MD_perturb_x(p, i, -1, x_perturb, delta ) - ! compute y at x_op - delta x - call MD_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get central difference: - call MD_Compute_dY( p, y_p, y_m, delta, dYdx(:,i) ) + + ! Loop through state variables + do i = 1, size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate column index + iCol = Vars%x(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call MD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call MD_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call MD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call MD_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%x(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdx(:,iCol)) + end do end do - if(Failed()) return - END IF - - IF ( PRESENT( dXdx ) ) THEN - ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + if (present(dXdx)) then + + ! Allocate dXdx if not allocated if (.not. allocated(dXdx)) then - call AllocAry(dXdx, p%Jac_nx, p%Jac_nx, 'dXdx', ErrStat2, ErrMsg2); if(Failed()) return + call AllocAry(dXdx, m%Jac%Nx, m%Jac%Nx, 'dXdx', ErrStat2, ErrMsg2); if (Failed()) return end if - ! Loop over the dx dimension of the array. Perturb the corresponding state (note difference in ordering of dXdx and x%states). - ! The resulting x_p and x_m are used to calculate the column for dXdx (mapping of state entry to dXdx row entry occurs in MD_Compute_dX) - ! The p%dxIdx_map2_xStateIdx(i) is the index to the state array for the given dx index - do i=1,p%Jac_nx ! index into dx dimension - ! get x_op + delta x - call MD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call MD_perturb_x(p, i, 1, x_perturb, delta ) - ! compute x at x_op + delta x - call MD_CalcContStateDeriv( t, u, p, x_perturb, xd, z, OtherState, m, x_p, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get x_op - delta x - call MD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call MD_perturb_x(p, i, -1, x_perturb, delta ) - ! compute x at x_op - delta x - call MD_CalcContStateDeriv( t, u, p, x_perturb, xd, z, OtherState, m, x_m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if(Failed()) return - ! get central difference: - call MD_Compute_dX( p, x_p, x_m, delta, dXdx(:,i) ) + + ! Loop through state variables + do i = 1, size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate column index + iCol = Vars%x(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call MD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call MD_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackContStateDeriv(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call MD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call MD_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call MD_VarsPackContStateDeriv(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdx(:,iCol) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%x(i)%Perturb) + end do end do - END IF - IF ( PRESENT( dXddx ) ) THEN + end if + + if (present(dXddx)) then if (allocated(dXddx)) deallocate(dXddx) - END IF - IF ( PRESENT( dZdx ) ) THEN + end if + + if (present(dZdx)) then if (allocated(dZdx)) deallocate(dZdx) - END IF - call CleanUp() + end if contains - logical function Failed() - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'MD_JacobianPContState') + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) Failed = ErrStat >= AbortErrLev - if (Failed) call CleanUp() end function Failed - - subroutine CleanUp() - call MD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call MD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call MD_DestroyContState( x_p, ErrStat2, ErrMsg2 ) - call MD_DestroyContState( x_m, ErrStat2, ErrMsg2 ) - call MD_DestroyContState(x_perturb, ErrStat2, ErrMsg2 ) - end subroutine cleanup - END SUBROUTINE MD_JacobianPContState !---------------------------------------------------------------------------------------------------------------------------------- @@ -4574,609 +4913,5 @@ SUBROUTINE MD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat IF ( PRESENT(dZdz) ) THEN END IF END SUBROUTINE MD_JacobianPConstrState -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE MD_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(MD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(MD_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(MD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(MD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(MD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(MD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(MD_OutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(MD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - ! Local - INTEGER(IntKi) :: idx, i - INTEGER(IntKi) :: nu - INTEGER(IntKi) :: ny - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'MD_GetOP' - LOGICAL :: FieldMask(FIELDMASK_SIZE) - TYPE(MD_ContinuousStateType) :: dx ! derivative of continuous states at operating point - ErrStat = ErrID_None - ErrMsg = '' - ! inputs - IF ( PRESENT( u_op ) ) THEN - nu = size(p%Jac_u_indx,1) + u%CoupledKinematics(1)%NNodes * 6 ! Jac_u_indx has 3 orientation angles, but the OP needs the full 9 elements of the DCM (thus 6 more per node) - if (.not. allocated(u_op)) then - call AllocAry(u_op, nu, 'u_op', ErrStat2, ErrMsg2); if(Failed()) return - end if - idx = 1 - FieldMask = .false. - FieldMask(MASKID_TranslationDisp) = .true. - FieldMask(MASKID_Orientation) = .true. - FieldMask(MASKID_TranslationVel) = .true. - FieldMask(MASKID_RotationVel) = .true. - FieldMask(MASKID_TranslationAcc) = .true. - FieldMask(MASKID_RotationAcc) = .true. - ! fill in the u_op values from the input mesh - call PackMotionMesh(u%CoupledKinematics(1), u_op, idx, FieldMask=FieldMask) - - ! now do the active tensioning commands if there are any - if (allocated(u%DeltaL)) then - do i=1,size(u%DeltaL) - u_op(idx) = u%DeltaL(i) - idx = idx + 1 - u_op(idx) = u%DeltaLdot(i) - idx = idx + 1 - end do - endif - END IF - ! outputs - IF ( PRESENT( y_op ) ) THEN - ny = p%Jac_ny + y%CoupledLoads(1)%NNodes * 6 ! Jac_ny has 3 orientation angles, but the OP needs the full 9 elements of the DCM (thus 6 more per node) - if (.not. allocated(y_op)) then - call AllocAry(y_op, ny, 'y_op', ErrStat2, ErrMsg2); if(Failed()) return - end if - idx = 1 - call PackLoadMesh(y%CoupledLoads(1), y_op, idx) - do i=1,p%NumOuts - y_op(idx) = y%WriteOutput(i) - idx = idx + 1 - end do - END IF - ! states - IF ( PRESENT( x_op ) ) THEN - if (.not. allocated(x_op)) then - call AllocAry(x_op, p%Jac_nx,'x_op',ErrStat2,ErrMsg2); if (Failed()) return - end if - do i=1, p%Jac_nx - x_op(i) = x%states(p%dxIdx_map2_xStateIdx(i)) ! x for lin is different order, so use mapping - end do - END IF - ! state derivatives? - IF ( PRESENT( dx_op ) ) THEN - if (.not. allocated(dx_op)) then - call AllocAry(dx_op, p%Jac_nx,'dx_op',ErrStat2,ErrMsg2); if(failed()) return - end if - call MD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dx, ErrStat2, ErrMsg2 ) ; if(Failed()) return - do i=1, p%Jac_nx - dx_op(i) = dx%states(p%dxIdx_map2_xStateIdx(i)) ! x for lin is different order, so use mapping - end do - END IF - IF ( PRESENT( xd_op ) ) THEN - ! pass - END IF - IF ( PRESENT( z_op ) ) THEN - ! pass - END IF - call CleanUp() -contains - logical function Failed() - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'MD_GetOP') - Failed = ErrStat >= AbortErrLev - if (Failed) call CleanUp() - end function Failed - - subroutine CleanUp() - call MD_DestroyContState(dx, ErrStat2, ErrMsg2); - end subroutine -END SUBROUTINE MD_GetOP - - - -!==================================================================================================== -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. -!! Do not change the order of this packing without changing subroutines calculating dXdx etc (MD_Compute_dX) -SUBROUTINE MD_Init_Jacobian(Init, p, u, y, m, InitOut, ErrStat, ErrMsg) - TYPE(MD_InitInputType) , INTENT(IN ) :: Init !< Init - TYPE(MD_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(MD_InputType) , INTENT(IN ) :: u !< inputs - TYPE(MD_OutputType) , INTENT(IN ) :: y !< outputs - TYPE(MD_MiscVarType) , INTENT(INOUT) :: m !< misc variables <<<<<<<< - TYPE(MD_InitOutputType) , INTENT(INOUT) :: InitOut !< Initialization output data (for Jacobian row/column names) - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SD_Init_Jacobian' -! real(ReKi) :: dx, dy, dz, maxDim - - INTEGER(IntKi) :: l, I - real(ReKi) :: dl_slack ! how much a given line segment is stretched [m] - real(ReKi) :: dl_slack_min ! minimum change in a node position for the least-strained segment in the simulation to go slack [m] - - - ! local variables: - ErrStat = ErrID_None - ErrMsg = "" - - !! --- System dimension - !dx = maxval(Init%Nodes(:,2))- minval(Init%Nodes(:,2)) - !dy = maxval(Init%Nodes(:,3))- minval(Init%Nodes(:,3)) - !dz = maxval(Init%Nodes(:,4))- minval(Init%Nodes(:,4)) - !maxDim = max(dx, dy, dz) - - - ! Figure out appropriate transverse perturbation size to avoid slack segments - dl_slack_min = 0.1_ReKi ! start at 0.1 m - - do l = 1,p%nLines - do I = 1, m%LineList(l)%N - dl_slack = m%LineList(l)%lstr(I) - m%LineList(l)%l(I) - - ! store the smallest positive length margin to a segment going slack - if (( dl_slack > 0.0_ReKi) .and. (dl_slack < dl_slack_min)) then - dl_slack_min = dl_slack - end if - end do - end do - - dl_slack_min = 0.5*dl_slack_min ! apply 0.5 safety factor - - !TODO: consider attachment radii to also produce a rotational perturbation size from the above - - - ! --- System dimension - call Init_Jacobian_y(); if (Failed()) return - call Init_Jacobian_x(); if (Failed()) return - call Init_Jacobian_u(); if (Failed()) return - -contains - LOGICAL FUNCTION Failed() - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SD_Init_Jacobian') - Failed = ErrStat >= AbortErrLev - END FUNCTION Failed - - !> This routine initializes the Jacobian parameters and initialization outputs for the linearized outputs. - SUBROUTINE Init_Jacobian_y() - INTEGER(IntKi) :: index_next, i - - ! Number of outputs - p%Jac_ny = y%CoupledLoads(1)%nNodes * 6 & ! 3 forces + 3 moments at each node (moments may be zero) - + p%NumOuts ! WriteOutput values - ! Storage info for each output (names, rotframe) - call AllocAry(InitOut%LinNames_y, p%Jac_ny, 'LinNames_y',ErrStat2,ErrMsg2); if(ErrStat2/=ErrID_None) return - call AllocAry(InitOut%RotFrame_y, p%Jac_ny, 'RotFrame_y',ErrStat2,ErrMsg2); if(ErrStat2/=ErrID_None) return - ! Names - index_next = 1 - call PackLoadMesh_Names( y%CoupledLoads(1), 'LinNames_y', InitOut%LinNames_y, index_next) ! <<< should a specific name be provided here? - do i=1,p%NumOuts - InitOut%LinNames_y(i+index_next-1) = trim(InitOut%WriteOutputHdr(i))//', '//trim(InitOut%WriteOutputUnt(i)) - end do - - InitOut%RotFrame_y(:) = .false. - END SUBROUTINE Init_Jacobian_y - - !> This routine initializes the Jacobian parameters and initialization outputs for the linearized continuous states. - SUBROUTINE Init_Jacobian_x() - INTEGER(IntKi) :: idx ! index into the LinNames_x array - INTEGER(IntKi) :: i - INTEGER(IntKi) :: l - INTEGER(IntKi) :: N - - - p%Jac_nx = m%Nx ! size of (continuous) state vector (includes the first derivatives) - - ! allocate space for the row/column names and for perturbation sizes - CALL AllocAry(InitOut%LinNames_x , p%Jac_nx, 'LinNames_x' , ErrStat2, ErrMsg2); if(ErrStat/=ErrID_None) return - CALL AllocAry(InitOut%RotFrame_x , p%Jac_nx, 'RotFrame_x' , ErrStat2, ErrMsg2); if(ErrStat/=ErrID_None) return - CALL AllocAry(InitOut%DerivOrder_x , p%Jac_nx, 'DerivOrder_x' , ErrStat2, ErrMsg2); if(ErrStat/=ErrID_None) return - CALL AllocAry(p%dx , p%Jac_nx, 'p%dx' , ErrStat2, ErrMsg2); if(ErrStat/=ErrID_None) return - CALL AllocAry(p%dxIdx_map2_xStateIdx, p%Jac_nx, 'p%dxIdx_map2_xStateIdx', ErrStat2, ErrMsg2); if(ErrStat/=ErrID_None) return - - p%dxIdx_map2_xStateIdx = 0_IntKi ! all values should be overwritten by logic below - - ! set linearization output names and default perturbations, p%dx: - ! NOTE: the order is different than the order of the internal states. This is to - ! match what the OpenFAST framework is expecting: all positions first, then all - ! derviatives of positions (velocity terms) second. This adds slight complexity - ! here, but considerably simplifies post processing of the full OpenFAST results - ! for linearization. - ! The p%dxIdx_map2_xStateIdx array holds the index for the x%states array - ! corresponding to the current jacobian index. - - !----------------- - ! position states - !----------------- - idx = 0 - ! Free bodies - DO l = 1,p%nFreeBodies ! Body m%BodyList(m%FreeBodyIs(l)) - if (m%BodyList(m%FreeBodyIs(l))%typeNum == 2) then ! Coupled pinned body - p%dx(idx+4:idx+6) = 0.02 ! body rotation [rad] - ! corresponds to state indices: (m%BodyStateIs1(l)+6:m%BodyStateIs1(l)+8) - InitOut%LinNames_x(idx+1) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' rot_x, rad' - InitOut%LinNames_x(idx+2) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' rot_y, rad' - InitOut%LinNames_x(idx+3) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' rot_z, rad' - p%dxIdx_map2_xStateIdx(idx+4) = m%BodyStateIs1(l)+3 ! x%state index for rot_x - p%dxIdx_map2_xStateIdx(idx+5) = m%BodyStateIs1(l)+4 ! x%state index for rot_y - p%dxIdx_map2_xStateIdx(idx+6) = m%BodyStateIs1(l)+5 ! x%state index for rot_z - idx = idx + 3 - else ! free body - p%dx(idx+1:idx+3) = dl_slack_min ! body displacement [m] - p%dx(idx+4:idx+6) = 0.02 ! body rotation [rad] - ! corresponds to state indices: (m%BodyStateIs1(l)+6:m%BodyStateIs1(l)+11) - InitOut%LinNames_x(idx+1) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' Px, m' - InitOut%LinNames_x(idx+2) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' Py, m' - InitOut%LinNames_x(idx+3) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' Pz, m' - InitOut%LinNames_x(idx+4) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' rot_x, rad' - InitOut%LinNames_x(idx+5) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' rot_y, rad' - InitOut%LinNames_x(idx+6) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' rot_z, rad' - p%dxIdx_map2_xStateIdx(idx+1) = m%BodyStateIs1(l)+6 ! x%state index for Px - p%dxIdx_map2_xStateIdx(idx+2) = m%BodyStateIs1(l)+7 ! x%state index for Py - p%dxIdx_map2_xStateIdx(idx+3) = m%BodyStateIs1(l)+8 ! x%state index for Pz - p%dxIdx_map2_xStateIdx(idx+4) = m%BodyStateIs1(l)+9 ! x%state index for rot_x - p%dxIdx_map2_xStateIdx(idx+5) = m%BodyStateIs1(l)+10 ! x%state index for rot_y - p%dxIdx_map2_xStateIdx(idx+6) = m%BodyStateIs1(l)+11 ! x%state index for rot_z - idx = idx + 6 - endif - END DO - - ! Rods - DO l = 1,p%nFreeRods ! Rod m%RodList(m%FreeRodIs(l)) - if (abs(m%RodList(m%FreeRodIs(l))%typeNum) == 1) then ! pinned rod - p%dx(idx+1:idx+3) = 0.02 ! rod rotation [rad] - ! corresponds to state indices: (m%RodStateIs1(l)+3:m%RodStateIs1(l)+5) - InitOut%LinNames_x(idx+1) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' rot_x, rad' - InitOut%LinNames_x(idx+2) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' rot_y, rad' - InitOut%LinNames_x(idx+3) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' rot_z, rad' - p%dxIdx_map2_xStateIdx(idx+4) = m%RodStateIs1(l)+3 ! x%state index for rot_x - p%dxIdx_map2_xStateIdx(idx+5) = m%RodStateIs1(l)+4 ! x%state index for rot_y - p%dxIdx_map2_xStateIdx(idx+6) = m%RodStateIs1(l)+5 ! x%state index for rot_z - idx = idx + 3 - else ! free rod - p%dx(idx+1:idx+3) = dl_slack_min ! rod displacement [m] - p%dx(idx+4:idx+6) = 0.02 ! rod rotation [rad] - ! corresponds to state indices: (m%RodStateIs1(l)+6:m%RodStateIs1(l)+11) - InitOut%LinNames_x(idx+1) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' Px, m' - InitOut%LinNames_x(idx+2) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' Py, m' - InitOut%LinNames_x(idx+3) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' Pz, m' - InitOut%LinNames_x(idx+4) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' rot_x, rad' - InitOut%LinNames_x(idx+5) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' rot_y, rad' - InitOut%LinNames_x(idx+6) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' rot_z, rad' - p%dxIdx_map2_xStateIdx(idx+1) = m%RodStateIs1(l)+6 ! x%state index for Px - p%dxIdx_map2_xStateIdx(idx+2) = m%RodStateIs1(l)+7 ! x%state index for Py - p%dxIdx_map2_xStateIdx(idx+3) = m%RodStateIs1(l)+8 ! x%state index for Pz - p%dxIdx_map2_xStateIdx(idx+4) = m%RodStateIs1(l)+9 ! x%state index for rot_x - p%dxIdx_map2_xStateIdx(idx+5) = m%RodStateIs1(l)+10 ! x%state index for rot_y - p%dxIdx_map2_xStateIdx(idx+6) = m%RodStateIs1(l)+11 ! x%state index for rot_z - idx = idx + 6 - end if - END DO - - ! Free Points - DO l = 1,p%nFreePoints ! Point m%PointList(m%FreePointIs(l)) - ! corresponds to state indices: (m%PointStateIs1(l)+3:m%PointStateIs1(l)+5) - p%dx(idx+1:idx+3) = dl_slack_min ! point displacement [m] - InitOut%LinNames_x(idx+1) = 'Point '//trim(num2lstr(m%FreePointIs(l)))//' Px, m' - InitOut%LinNames_x(idx+2) = 'Point '//trim(num2lstr(m%FreePointIs(l)))//' Py, m' - InitOut%LinNames_x(idx+3) = 'Point '//trim(num2lstr(m%FreePointIs(l)))//' Pz, m' - p%dxIdx_map2_xStateIdx(idx+1) = m%PointStateIs1(l)+3 ! x%state index for Px - p%dxIdx_map2_xStateIdx(idx+2) = m%PointStateIs1(l)+4 ! x%state index for Py - p%dxIdx_map2_xStateIdx(idx+3) = m%PointStateIs1(l)+5 ! x%state index for Pz - idx = idx + 3 - END DO - - ! Lines - DO l = 1,p%nLines ! Line m%LineList(l) - ! corresponds to state indices: (m%LineStateIs1(l)+3*N-3:m%LineStateIs1(l)+6*N-7) -- NOTE: end nodes not included - N = m%LineList(l)%N ! number of segments in the line - DO i = 0,N-2 - p%dx(idx+1:idx+3) = dl_slack_min ! line internal node displacement [m] - InitOut%LinNames_x(idx+1) = 'Line '//trim(num2lstr(l))//' node '//trim(num2lstr(i+1))//' Px, m' - InitOut%LinNames_x(idx+2) = 'Line '//trim(num2lstr(l))//' node '//trim(num2lstr(i+1))//' Py, m' - InitOut%LinNames_x(idx+3) = 'Line '//trim(num2lstr(l))//' node '//trim(num2lstr(i+1))//' Pz, m' - p%dxIdx_map2_xStateIdx(idx+1) = m%LineStateIs1(l)+3*N+3*i-3 ! x%state index for Px - p%dxIdx_map2_xStateIdx(idx+2) = m%LineStateIs1(l)+3*N+3*i-2 ! x%state index for Py - p%dxIdx_map2_xStateIdx(idx+3) = m%LineStateIs1(l)+3*N+3*i-1 ! x%state index for Pz - idx = idx + 3 - END DO - END DO - - !----------------- - ! velocity states - !----------------- - ! Free bodies - DO l = 1,p%nFreeBodies ! Body m%BodyList(m%FreeBodyIs(l)) - if (m%BodyList(m%FreeBodyIs(l))%typeNum == 2) then ! Coupled pinned body - ! corresponds to state indices: (m%BodyStateIs1(l):m%BodyStateIs1(l)+5) - p%dx(idx+1:idx+3) = 0.1 ! body rotational velocity [rad/s] - InitOut%LinNames_x(idx+1) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' omega_x, rad/s' - InitOut%LinNames_x(idx+2) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' omega_y, rad/s' - InitOut%LinNames_x(idx+3) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' omega_z, rad/s' - p%dxIdx_map2_xStateIdx(idx+1) = m%BodyStateIs1(l)+0 ! x%state index for omega_x - p%dxIdx_map2_xStateIdx(idx+2) = m%BodyStateIs1(l)+1 ! x%state index for omega_y - p%dxIdx_map2_xStateIdx(idx+3) = m%BodyStateIs1(l)+2 ! x%state index for omega_z - idx = idx + 3 - else !Free body - ! corresponds to state indices: (m%BodyStateIs1(l):m%BodyStateIs1(l)+5) - p%dx(idx+1:idx+3) = 0.1 ! body translational velocity [m/s] - p%dx(idx+4:idx+6) = 0.1 ! body rotational velocity [rad/s] - InitOut%LinNames_x(idx+1) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' Vx, m/s' - InitOut%LinNames_x(idx+2) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' Vy, m/s' - InitOut%LinNames_x(idx+3) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' Vz, m/s' - InitOut%LinNames_x(idx+4) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' omega_x, rad/s' - InitOut%LinNames_x(idx+5) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' omega_y, rad/s' - InitOut%LinNames_x(idx+6) = 'Body '//trim(num2lstr(m%FreeBodyIs(l)))//' omega_z, rad/s' - p%dxIdx_map2_xStateIdx(idx+1) = m%BodyStateIs1(l)+0 ! x%state index for Rx - p%dxIdx_map2_xStateIdx(idx+2) = m%BodyStateIs1(l)+1 ! x%state index for Ry - p%dxIdx_map2_xStateIdx(idx+3) = m%BodyStateIs1(l)+2 ! x%state index for Rz - p%dxIdx_map2_xStateIdx(idx+4) = m%BodyStateIs1(l)+3 ! x%state index for omega_x - p%dxIdx_map2_xStateIdx(idx+5) = m%BodyStateIs1(l)+4 ! x%state index for omega_y - p%dxIdx_map2_xStateIdx(idx+6) = m%BodyStateIs1(l)+5 ! x%state index for omega_z - idx = idx + 6 - endif - END DO - - ! Rods - DO l = 1,p%nFreeRods ! Rod m%RodList(m%FreeRodIs(l)) - if (abs(m%RodList(m%FreeRodIs(l))%typeNum) == 1) then ! pinned rod - ! corresponds to state indices: (m%RodStateIs1(l):m%RodStateIs1(l)+2) - p%dx(idx+1:idx+3) = 0.1 ! body rotational velocity [rad/s] - InitOut%LinNames_x(idx+1) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' omega_x, rad/s' - InitOut%LinNames_x(idx+2) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' omega_y, rad/s' - InitOut%LinNames_x(idx+3) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' omega_z, rad/s' - p%dxIdx_map2_xStateIdx(idx+1) = m%RodStateIs1(l)+0 ! x%state index for Vx - p%dxIdx_map2_xStateIdx(idx+2) = m%RodStateIs1(l)+1 ! x%state index for Vy - p%dxIdx_map2_xStateIdx(idx+3) = m%RodStateIs1(l)+2 ! x%state index for Vz - idx = idx + 3 - else ! free rod - ! corresponds to state indices: (m%RodStateIs1(l):m%RodStateIs1(l)+5) - p%dx(idx+1:idx+3) = 0.1 ! body translational velocity [m/s] - p%dx(idx+4:idx+6) = 0.02 ! body rotational velocity [rad/s] - InitOut%LinNames_x(idx+1) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' Vx, m/s' - InitOut%LinNames_x(idx+2) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' Vy, m/s' - InitOut%LinNames_x(idx+3) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' Vz, m/s' - InitOut%LinNames_x(idx+4) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' omega_x, rad/s' - InitOut%LinNames_x(idx+5) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' omega_y, rad/s' - InitOut%LinNames_x(idx+6) = 'Rod '//trim(num2lstr(m%FreeRodIs(l)))//' omega_z, rad/s' - p%dxIdx_map2_xStateIdx(idx+1) = m%RodStateIs1(l)+0 ! x%state index for Vx - p%dxIdx_map2_xStateIdx(idx+2) = m%RodStateIs1(l)+1 ! x%state index for Vy - p%dxIdx_map2_xStateIdx(idx+3) = m%RodStateIs1(l)+2 ! x%state index for Vz - p%dxIdx_map2_xStateIdx(idx+4) = m%RodStateIs1(l)+3 ! x%state index for omega_x - p%dxIdx_map2_xStateIdx(idx+5) = m%RodStateIs1(l)+4 ! x%state index for omega_y - p%dxIdx_map2_xStateIdx(idx+6) = m%RodStateIs1(l)+5 ! x%state index for omega_z - idx = idx + 6 - end if - END DO - - ! Free Points - DO l = 1,p%nFreePoints ! Point m%PointList(m%FreePointIs(l)) - ! corresponds to state indices: (m%PointStateIs1(l):m%PointStateIs1(l)+2) - p%dx(idx+1:idx+3) = 0.1 ! point translational velocity [m/s] - InitOut%LinNames_x(idx+1) = 'Point '//trim(num2lstr(m%FreePointIs(l)))//' Vx, m/s' - InitOut%LinNames_x(idx+2) = 'Point '//trim(num2lstr(m%FreePointIs(l)))//' Vy, m/s' - InitOut%LinNames_x(idx+3) = 'Point '//trim(num2lstr(m%FreePointIs(l)))//' Vz, m/s' - p%dxIdx_map2_xStateIdx(idx+1) = m%PointStateIs1(l)+0 ! x%state index for Vx - p%dxIdx_map2_xStateIdx(idx+2) = m%PointStateIs1(l)+1 ! x%state index for Vy - p%dxIdx_map2_xStateIdx(idx+3) = m%PointStateIs1(l)+2 ! x%state index for Vz - idx = idx + 3 - END DO - - ! Lines - DO l = 1,p%nLines ! Line m%LineList(l) - ! corresponds to state indices: (m%LineStateIs1(l):m%LineStateIs1(l)+3*N-4) -- NOTE: end nodes not included - N = m%LineList(l)%N ! number of segments in the line - DO i = 0,N-2 - p%dx(idx+1:idx+3) = 0.1 ! line internal node translational velocity [m/s] - InitOut%LinNames_x(idx+1) = 'Line '//trim(num2lstr(l))//' node '//trim(num2lstr(i+1))//' Vx, m/s' - InitOut%LinNames_x(idx+2) = 'Line '//trim(num2lstr(l))//' node '//trim(num2lstr(i+1))//' Vy, m/s' - InitOut%LinNames_x(idx+3) = 'Line '//trim(num2lstr(l))//' node '//trim(num2lstr(i+1))//' Vz, m/s' - p%dxIdx_map2_xStateIdx(idx+1) = m%LineStateIs1(l)+3*i+0 ! x%state index for Vx - p%dxIdx_map2_xStateIdx(idx+2) = m%LineStateIs1(l)+3*i+1 ! x%state index for Vy - p%dxIdx_map2_xStateIdx(idx+3) = m%LineStateIs1(l)+3*i+2 ! x%state index for Vz - idx = idx + 3 - END DO - END DO - - ! If a summary file is ever made... - ! !Formatting may be needed to make it pretty - ! if(UnSum > 0) then - ! write(UnSum,*) ' Lin_Jac_x idx x%state idx' - ! do i=1,p%Jac_nx - ! write(UnSum,*) InitOut%LinNames_x(i),' ',i,' ',p%dxIdx_map2_xStateIdx(i) - ! enddo - ! endif - - InitOut%RotFrame_x = .false. - InitOut%DerivOrder_x = 2 - END SUBROUTINE Init_Jacobian_x - - SUBROUTINE Init_Jacobian_u() - INTEGER(IntKi) :: i, j, idx, nu, i_meshField - character(10) :: LinStr ! for noting which line a DeltaL control is attached to - logical :: LinCtrl ! Is the current DeltaL channel associated with a line? - ! Number of inputs - i = 0 - if (allocated(u%DeltaL)) i=size(u%DeltaL) - nu = u%CoupledKinematics(1)%nNodes * 18 & ! 3 Translation Displacements + 3 orientations + 6 velocities + 6 accelerations at each node <<<<<<< - + i*2 ! a deltaL and rate of change for each active tension control channel - - ! --- Info of linearized inputs (Names, RotFrame, IsLoad) - call AllocAry(InitOut%LinNames_u, nu, 'LinNames_u', ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return - call AllocAry(InitOut%RotFrame_u, nu, 'RotFrame_u', ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return - call AllocAry(InitOut%IsLoad_u , nu, 'IsLoad_u' , ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return - - InitOut%IsLoad_u = .false. ! None of MoorDyn's inputs are loads - InitOut%RotFrame_u = .false. ! every input is on a mesh, which stores values in the global (not rotating) frame - - idx = 1 - call PackMotionMesh_Names(u%CoupledKinematics(1), 'CoupledKinematics', InitOut%LinNames_u, idx) ! all 6 motion fields - - ! --- Jac_u_indx: matrix to store index to help us figure out what the ith value of the u vector really means - ! (see perturb_u ... these MUST match ) - ! column 1 indicates module's mesh and field - ! column 2 indicates the first index (x-y-z component) of the field - ! column 3 is the node - call allocAry( p%Jac_u_indx, nu, 3, 'p%Jac_u_indx', ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return - p%Jac_u_indx = 0 ! initialize to zero - idx = 1 - !Module/Mesh/Field: u%CoupledKinematics(1)%TranslationDisp = 1; - !Module/Mesh/Field: u%CoupledKinematics(1)%Orientation = 2; - !Module/Mesh/Field: u%CoupledKinematics(1)%TranslationVel = 3; - !Module/Mesh/Field: u%CoupledKinematics(1)%RotationVel = 4; - !Module/Mesh/Field: u%CoupledKinematics(1)%TranslationAcc = 5; - !Module/Mesh/Field: u%CoupledKinematics(1)%RotationAcc = 6; - do i_meshField = 1,6 - do i=1,u%CoupledKinematics(1)%nNodes - do j=1,3 - p%Jac_u_indx(idx,1) = i_meshField ! mesh field type (indicated by 1-6) - p%Jac_u_indx(idx,2) = j ! x, y, or z - p%Jac_u_indx(idx,3) = i ! node - idx = idx + 1 - end do !j - end do !i - end do - ! now do the active tensioning commands if there are any - if (allocated(u%DeltaL)) then - do i=1,size(u%DeltaL) ! Signals may be passed in without being requested for control - ! Figure out if this DeltaL control channel is associated with a line or multiple or none and label - LinCtrl = .FALSE. - LinStr = '(lines: ' - do J=1,p%NLines - if (m%LineList(J)%CtrlChan == i) then - LinCtrl = .TRUE. - LinStr = LinStr//trim(num2lstr(i))//' ' - endif - enddo - if ( LinCtrl) LinStr = LinStr//' )' - if (.not. LinCtrl) LinStr = '(lines: none)' - - p%Jac_u_indx(idx,1) = 10 ! 10-11 mean active tension changes (10: deltaL; 11: deltaLdot) - p%Jac_u_indx(idx,2) = 0 ! not used - p%Jac_u_indx(idx,3) = i ! indicates DeltaL entry number - InitOut%LinNames_u(idx) = 'CtrlChan DeltaL '//trim(num2lstr(i))//', m '//trim(LinStr) - idx = idx + 1 - - p%Jac_u_indx(idx,1) = 11 - p%Jac_u_indx(idx,2) = 0 - p%Jac_u_indx(idx,3) = i - InitOut%LinNames_u(idx) = 'CtrlChan DeltaLdot '//trim(num2lstr(i))//', m/s'//trim(LinStr) - idx = idx + 1 - end do - endif - - ! --- Default perturbations, p%du: - call allocAry( p%du, 11, 'p%du', ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return - p%du( 1) = dl_slack_min ! u%CoupledKinematics(1)%TranslationDisp = 1; - p%du( 2) = 0.1_ReKi ! u%CoupledKinematics(1)%Orientation = 2; - p%du( 3) = 0.1_ReKi ! u%CoupledKinematics(1)%TranslationVel = 3; - p%du( 4) = 0.1_ReKi ! u%CoupledKinematics(1)%RotationVel = 4; - p%du( 5) = 0.1_ReKi ! u%CoupledKinematics(1)%TranslationAcc = 5; - p%du( 6) = 0.1_ReKi ! u%CoupledKinematics(1)%RotationAcc = 6; - p%du(10) = dl_slack_min ! deltaL [m] - p%du(11) = 0.2_ReKi ! deltaLdot [m/s] - END SUBROUTINE Init_Jacobian_u - -END SUBROUTINE MD_Init_Jacobian -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine MD_init_jacobian is consistant with this routine! -SUBROUTINE MD_Perturb_u( p, n, perturb_sign, u, du ) - TYPE(MD_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(MD_InputType) , INTENT(INOUT) :: u !< perturbed MD inputs - REAL( R8Ki ) , INTENT( OUT) :: du !< amount that specific input was perturbed - ! local variables - INTEGER :: fieldIndx - INTEGER :: node - fieldIndx = p%Jac_u_indx(n,2) - node = p%Jac_u_indx(n,3) - du = p%du( p%Jac_u_indx(n,1) ) - ! determine which mesh we're trying to perturb and perturb the input: - SELECT CASE( p%Jac_u_indx(n,1) ) - CASE ( 1) - u%CoupledKinematics(1)%TranslationDisp( fieldIndx,node) = u%CoupledKinematics(1)%TranslationDisp( fieldIndx,node) + du * perturb_sign - CASE ( 2) - CALL PerturbOrientationMatrix( u%CoupledKinematics(1)%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - CASE ( 3) - u%CoupledKinematics(1)%TranslationVel( fieldIndx,node) = u%CoupledKinematics(1)%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE ( 4) - u%CoupledKinematics(1)%RotationVel(fieldIndx,node) = u%CoupledKinematics(1)%RotationVel(fieldIndx,node) + du * perturb_sign - CASE ( 5) - u%CoupledKinematics(1)%TranslationAcc( fieldIndx,node) = u%CoupledKinematics(1)%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE ( 6) - u%CoupledKinematics(1)%RotationAcc(fieldIndx,node) = u%CoupledKinematics(1)%RotationAcc(fieldIndx,node) + du * perturb_sign - CASE (10) - u%deltaL(node) = u%deltaL(node) + du * perturb_sign - CASE (11) - u%deltaLdot(node) = u%deltaLdot(node) + du * perturb_sign - END SELECT -END SUBROUTINE MD_Perturb_u -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine MD_init_jacobian is consistant with this routine! -SUBROUTINE MD_Compute_dY(p, y_p, y_m, delta, dY) - TYPE(MD_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(MD_OutputType) , INTENT(IN ) :: y_p !< MD outputs at \f$ u + \Delta_p u \f$ or \f$ z + \Delta_p z \f$ (p=plus) - TYPE(MD_OutputType) , INTENT(IN ) :: y_m !< MD outputs at \f$ u - \Delta_m u \f$ or \f$ z - \Delta_m z \f$ (m=minus) - REAL(R8Ki) , INTENT(IN ) :: delta !< difference in inputs or states \f$ delta_p = \Delta_p u \f$ or \f$ delta_p = \Delta_p x \f$ - REAL(R8Ki) , INTENT(INOUT) :: dY(:) !< column of dYdu or dYdx: \f$ \frac{\partial Y}{\partial u_i} = \frac{y_p - y_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial Y}{\partial z_i} = \frac{y_p - y_m}{2 \, \Delta x}\f$ - ! local variables: - INTEGER(IntKi) :: i ! loop over outputs - INTEGER(IntKi) :: indx_first ! index indicating next value of dY to be filled - indx_first = 1 - call PackLoadMesh_dY( y_p%CoupledLoads(1), y_m%CoupledLoads(1), dY, indx_first) - !call PackMotionMesh_dY(y_p%Y2Mesh, y_m%Y2Mesh, dY, indx_first) ! all 6 motion fields - do i=1,p%NumOuts - dY(i+indx_first-1) = y_p%WriteOutput(i) - y_m%WriteOutput(i) - end do - dY = dY / (2.0_R8Ki*delta) -END SUBROUTINE MD_Compute_dY -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the x array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine MD_init_jacobian is consistant with this routine! -SUBROUTINE MD_Perturb_x( p, i, perturb_sign, x, dx ) - TYPE(MD_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: i !< state array index number - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(MD_ContinuousStateType), INTENT(INOUT) :: x !< perturbed MD states - REAL( R8Ki ) , INTENT( OUT) :: dx !< amount that specific state was perturbed - integer(IntKi) :: j - dx = p%dx(i) - j = p%dxIdx_map2_xStateIdx(i) - x%states(j) = x%states(j) + dx * perturb_sign -END SUBROUTINE MD_Perturb_x -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine MD_init_jacobian is consistant with this routine! -SUBROUTINE MD_Compute_dX(p, x_p, x_m, delta, dX) - TYPE(MD_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(MD_ContinuousStateType), INTENT(IN ) :: x_p !< 0) THEN + if (p%WaveKin > 0) then ! find time interpolation indices and coefficients it = floor(t/ p%dtWave) + 1 ! add 1 because Fortran indexing starts at 1 @@ -977,59 +970,68 @@ SUBROUTINE getWaterKin(p, m, x, y, z, t, U, Ud, zeta, PDyn, ErrStat, ErrMsg) m%WaveTi = it ! find x-y interpolation indices and coefficients - CALL getInterpNumsSiKi(p%pxWave , REAL(x,SiKi), 1, ix, fx) ! wave grid - CALL getInterpNumsSiKi(p%pyWave , REAL(y,SiKi), 1, iy, fy) ! wave grid + CALL getInterpNumsSiKi(p%pxWave, REAL(x, SiKi), 1, ix, fx) ! wave grid + CALL getInterpNumsSiKi(p%pyWave, REAL(y, SiKi), 1, iy, fy) ! wave grid ! interpolate wave elevation CALL calculate3Dinterpolation(p%zeta, ix, iy, it, fx, fy, ft, zeta) ! compute modified z coordinate to be used for interpolating velocities and accelerations with Wheeler stretching - zp = ( z - zeta ) * p%WtrDpth/( p%WtrDpth + zeta ) + zp = (z - zeta) * p%WtrDpth/(p%WtrDpth + zeta) - CALL getInterpNumsSiKi(p%pzWave , REAL(zp,SiKi), 1, iz, fz) ! wave grid + CALL getInterpNumsSiKi(p%pzWave, REAL(zp, SiKi), 1, iz, fz) ! wave grid ! interpolate everything else CALL calculate4Dinterpolation(p%PDyn , ix, iy, iz, it, fx, fy, fz, ft, PDyn) - CALL calculate4Dinterpolation(p%uxWave, ix, iy, iz, it, fx, fy, fz, ft, U(1) ) - CALL calculate4Dinterpolation(p%uyWave, ix, iy, iz, it, fx, fy, fz, ft, U(2) ) - CALL calculate4Dinterpolation(p%uzWave, ix, iy, iz, it, fx, fy, fz, ft, U(3) ) - CALL calculate4Dinterpolation(p%axWave, ix, iy, iz, it, fx, fy, fz, ft, Ud(1) ) - CALL calculate4Dinterpolation(p%ayWave, ix, iy, iz, it, fx, fy, fz, ft, Ud(2) ) - CALL calculate4Dinterpolation(p%azWave, ix, iy, iz, it, fx, fy, fz, ft, Ud(3) ) - - ELSE ! set things to zero if wave kinematics not enabled - U = 0.0_DbKi - Ud = 0.0_DbKi - zeta = 0.0_DbKi - PDyn = 0.0_DbKi - - ENDIF + CALL calculate4Dinterpolation(p%uxWave, ix, iy, iz, it, fx, fy, fz, ft, U(1)) + CALL calculate4Dinterpolation(p%uyWave, ix, iy, iz, it, fx, fy, fz, ft, U(2)) + CALL calculate4Dinterpolation(p%uzWave, ix, iy, iz, it, fx, fy, fz, ft, U(3)) + CALL calculate4Dinterpolation(p%axWave, ix, iy, iz, it, fx, fy, fz, ft, Ud(1)) + CALL calculate4Dinterpolation(p%ayWave, ix, iy, iz, it, fx, fy, fz, ft, Ud(2)) + CALL calculate4Dinterpolation(p%azWave, ix, iy, iz, it, fx, fy, fz, ft, Ud(3)) + end if ! If current kinematics enabled, add interpolated current values from profile - IF (p%Current > 0) THEN + if (p%Current > 0) then - CALL getInterpNumsSiKi(p%pzCurrent, REAL(z,SiKi), 1, iz0, fz) + CALL getInterpNumsSiKi(p%pzCurrent, REAL(z, SiKi), 1, iz0, fz) - IF (fz == 0) THEN ! handle end case conditions + if (fz == 0) then ! handle end case conditions iz1 = iz0 - ELSE - iz1 = min(iz0+1,size(p%pzCurrent)) ! don't overstep bounds - END IF + else + iz1 = min(iz0+1, size(p%pzCurrent)) ! don't overstep bounds + end if ! Add the current velocities to the wave velocities (if any) U(1) = U(1) + (1.0-fz)*p%uxCurrent(iz0) + fz*p%uxCurrent(iz1) U(2) = U(2) + (1.0-fz)*p%uyCurrent(iz0) + fz*p%uyCurrent(iz1) - END IF + end if - ELSEIF (p%WaterKin > 3) THEN - CALL SetErrStat(ErrID_Fatal, "Invalid p%WaterKin value found in getWaterKin", ErrStat, ErrMsg, RoutineName) - - ELSE ! set things to zero if Water Kinematics not enabled - U = 0.0_DbKi - Ud = 0.0_DbKi - zeta = 0.0_DbKi - PDyn = 0.0_DbKi - ENDIF + ! SeaState wave kinematics + case (3) + + ! disable wavekin 3 during IC_gen, otherwise will never find steady state (because of waves) + if (m%IC_gen) return + + ! SeaState throws warning when queried location is out of bounds from the SeaState grid, so no need to handle here + + ! Pack all MD inputs to WaveGrid input data types (double to single) + ! (only pos needed because time is double in wave field, all other are outputs that will be set by WaveField_GetNodeWaveKin) + xyz_sp = REAL([x, y, z], SiKi) + + ! for now we will force the node to be in the water (forceNodeInWater = True). Rods handle partial submergence separately so they need to get information from SeaState + CALL WaveField_GetNodeWaveKin(p%WaveField, m%WaveField_m, t, xyz_sp, .true., .true., nodeInWater, WaveElev1, WaveElev2, zeta_sp, PDyn_sp, U_sp, Ud_sp, FAMCF, ErrStat2, ErrMsg2 ) ! outputs: nodeInWater, WaveElev1, WaveElev2, FAMCF all unused + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Unpack all WaveGrid outputs to MD output data types (single to double) + U = REAL(U_sp,DbKi) + Ud = REAL(Ud_sp,DbKi) + zeta = REAL(zeta_sp,DbKi) + PDyn = REAL(PDyn_sp,DbKi) + + case default + call SetErrStat(ErrID_Fatal, "Invalid value of p%WaterKin", ErrStat, ErrMsg, RoutineName) + end select END SUBROUTINE getWaterKin diff --git a/modules/moordyn/src/MoorDyn_Registry.txt b/modules/moordyn/src/MoorDyn_Registry.txt index 1d2d3a9670..210b98cf0b 100644 --- a/modules/moordyn/src/MoorDyn_Registry.txt +++ b/modules/moordyn/src/MoorDyn_Registry.txt @@ -343,14 +343,7 @@ typedef ^ ^ CHARACTER(ChanLen) writeOutputUnt {:} " typedef ^ ^ ProgDesc Ver - "" - "this module's name, version, and date" typedef ^ ^ LOGICAL CableCChanRqst {:} .FALSE. - "flag indicating control channel for drive line active tensioning is requested" - # --- InitOutputs for linearization --- -typedef ^ ^ CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -typedef ^ ^ LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - -typedef ^ ^ LOGICAL RotFrame_x {:} - - "Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame (not used for glue)" - -typedef ^ ^ LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - -typedef ^ ^ LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix)" - -typedef ^ ^ IntKi DerivOrder_x {:} - - "Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization" - +typedef ^ ^ ModVarsType Vars - - - "Module Variables" - ## ============================== Define Continuous states here: ===================================================================================================================================== @@ -365,49 +358,6 @@ typedef ^ ConstraintStateType SiKi dummy - ## ============================== Define Other states here: ===================================================================================================================================== typedef ^ OtherStateType SiKi dummy - - - "Remove this variable if you have other states" - - -## ============================== Define Misc variables here: ===================================================================================================================================== -typedef ^ MiscVarType MD_LineProp LineTypeList {:} - - "array of properties for each line type" - -typedef ^ ^ MD_RodProp RodTypeList {:} - - "array of properties for each rod type" - -typedef ^ ^ MD_Body GroundBody - - - "the single ground body which is the parent of all stationary points" - -typedef ^ ^ MD_Body BodyList {:} - - "array of body objects" - -typedef ^ ^ MD_Rod RodList {:} - - "array of rod objects" - -typedef ^ ^ MD_Point PointList {:} - - "array of point objects" - -typedef ^ ^ MD_Line LineList {:} - - "array of line objects" - -typedef ^ ^ MD_ExtLd ExtLdList {:} - - "array of external load objects" - -typedef ^ ^ MD_Fail FailList {:} - - "array of line objects" - -typedef ^ ^ IntKi FreePointIs {:} - - "array of free point indices in PointList vector" "" -typedef ^ ^ IntKi CpldPointIs {:}{:} - - "array of coupled/fairlead point indices in PointList vector" "" -typedef ^ ^ IntKi FreeRodIs {:} - - "array of free rod indices in RodList vector" "" -typedef ^ ^ IntKi CpldRodIs {:}{:} - - "array of coupled/fairlead rod indices in RodList vector" "" -typedef ^ ^ IntKi FreeBodyIs {:} - - "array of free body indices in BodyList vector" "" -typedef ^ ^ IntKi CpldBodyIs {:}{:} - - "array of coupled body indices in BodyList vector" "" -typedef ^ ^ IntKi LineStateIs1 {:} - - "starting index of each line's states in state vector" "" -typedef ^ ^ IntKi LineStateIsN {:} - - "ending index of each line's states in state vector" "" -typedef ^ ^ IntKi PointStateIs1 {:} - - "starting index of each point's states in state vector" "" -typedef ^ ^ IntKi PointStateIsN {:} - - "ending index of each point's states in state vector" "" -typedef ^ ^ IntKi RodStateIs1 {:} - - "starting index of each rod's states in state vector" "" -typedef ^ ^ IntKi RodStateIsN {:} - - "ending index of each rod's states in state vector" "" -typedef ^ ^ IntKi BodyStateIs1 {:} - - "starting index of each body's states in state vector" "" -typedef ^ ^ IntKi BodyStateIsN {:} - - "ending index of each body's states in state vector" "" -typedef ^ ^ IntKi Nx - - - "number of states and size of state vector" "" -typedef ^ ^ IntKi Nxtra - - - "number of states and size of state vector including points for potential line failures" "" -typedef ^ ^ IntKi WaveTi - - - "current interpolation index for wave time series data" "" -typedef ^ ^ MD_ContinuousStateType xTemp - - - "contains temporary state vector used in integration (put here so it's only allocated once)" -typedef ^ ^ MD_ContinuousStateType xdTemp - - - "contains temporary state derivative vector used in integration (put here so it's only allocated once)" -typedef ^ ^ MD_ContinuousStateType kSum - - - "Sum of RK4 slope estimates: k0 + 2*k1 + 2*k2 + k3" -typedef ^ ^ DbKi zeros6 {6} - - "array of zeros for convenience" -typedef ^ ^ DbKi MDWrOutput {:} - - "Data from time step to be written to a MoorDyn output file" -typedef ^ ^ DbKi LastOutTime - - - "Time of last writing to MD output files" -typedef ^ ^ ReKi PtfmInit {6} - - "initial position of platform for an individual (non-farm) MD instance" - -typedef ^ ^ DbKi BathymetryGrid {:}{:} - - "matrix describing the bathymetry in a grid of x's and y's" -typedef ^ ^ DbKi BathGrid_Xs {:} - - "array of x-coordinates in the bathymetry grid" -typedef ^ ^ DbKi BathGrid_Ys {:} - - "array of y-coordinates in the bathymetry grid" -typedef ^ ^ IntKi BathGrid_npoints {:} - - "number of grid points to describe the bathymetry grid" -typedef ^ ^ GridInterp_MiscVarType WaveField_m - - - "misc var information from the Grid Interpolation module" - -typedef ^ ^ LOGICAL IC_gen - .FALSE. - "boolean to indicate dynamic relaxation occuring" "-" - - ## ============================== Parameters ============================================================================================================================================ typedef ^ ParameterType IntKi nLineTypes - 0 - "number of line types" "" typedef ^ ^ IntKi nRodTypes - 0 - "number of rod types" "" @@ -482,13 +432,6 @@ typedef ^ ^ SiKi pzCurrent {:} typedef ^ ^ SiKi uxCurrent {:} - - "current velocities time series at each grid point" - typedef ^ ^ SiKi uyCurrent {:} - - "current velocities time series at each grid point" - # --- Parameters for linearization --- -typedef ^ ^ Integer Nx0 - - - "copy of initial size of system state vector, for linearization routines" - -typedef ^ ^ Integer Jac_u_indx {:}{:} - - "matrix to help fill/pack the u vector in computing the jacobian" - -typedef ^ ^ R8Ki du {:} - - "vector that determines size of perturbation for u (inputs)" -typedef ^ ^ R8Ki dx {:} - - "vector that determines size of perturbation for x (continuous states)" -typedef ^ ^ Integer Jac_ny - - - "number of outputs in jacobian matrix" - -typedef ^ ^ Integer Jac_nx - - - "number of continuous states in jacobian matrix" - -typedef ^ ^ Integer dxIdx_map2_xStateIdx {:} - - "Mapping array from index of dX array to corresponding state index" - typedef ^ ^ Logical VisMeshes - - - "Using visualization meshes as requested by glue code" - typedef ^ ^ VisDiam VisRodsDiam {:} - - "Diameters for visualization of rods" - @@ -512,3 +455,50 @@ typedef ^ ^ MeshType VisLinesMesh {:} typedef ^ ^ MeshType VisRodsMesh {:} - - "Line2 mesh for visualizing mooring rods" - typedef ^ ^ MeshType VisBodiesMesh {:} - - "Point mesh for visualizing mooring bodies" - typedef ^ ^ MeshType VisAnchsMesh {:} - - "Point mesh for visualizing mooring anchors" - + + +## ============================== Define Misc variables here: ===================================================================================================================================== +typedef ^ MiscVarType ModJacType Jac - - - "Jacobian values corresponding to module variables" - +typedef ^ ^ MD_ContinuousStateType x_perturb - - - "States for calculating Jacobians" - +typedef ^ ^ MD_ContinuousStateType dxdt_lin - - - "States for calculating Jacobians" - +typedef ^ ^ MD_InputType u_perturb - - - "Inputs for calculating Jacobians" - +typedef ^ ^ MD_OutputType y_lin - - - "Outputs for calculating Jacobians" - +typedef ^ ^ MD_LineProp LineTypeList {:} - - "array of properties for each line type" - +typedef ^ ^ MD_RodProp RodTypeList {:} - - "array of properties for each rod type" - +typedef ^ ^ MD_Body GroundBody - - - "the single ground body which is the parent of all stationary points" - +typedef ^ ^ MD_Body BodyList {:} - - "array of body objects" - +typedef ^ ^ MD_Rod RodList {:} - - "array of rod objects" - +typedef ^ ^ MD_Point PointList {:} - - "array of point objects" - +typedef ^ ^ MD_Line LineList {:} - - "array of line objects" - +typedef ^ ^ MD_ExtLd ExtLdList {:} - - "array of external load objects" - +typedef ^ ^ MD_Fail FailList {:} - - "array of line objects" - +typedef ^ ^ IntKi FreePointIs {:} - - "array of free point indices in PointList vector" "" +typedef ^ ^ IntKi CpldPointIs {:}{:} - - "array of coupled/fairlead point indices in PointList vector" "" +typedef ^ ^ IntKi FreeRodIs {:} - - "array of free rod indices in RodList vector" "" +typedef ^ ^ IntKi CpldRodIs {:}{:} - - "array of coupled/fairlead rod indices in RodList vector" "" +typedef ^ ^ IntKi FreeBodyIs {:} - - "array of free body indices in BodyList vector" "" +typedef ^ ^ IntKi CpldBodyIs {:}{:} - - "array of coupled body indices in BodyList vector" "" +typedef ^ ^ IntKi LineStateIs1 {:} - - "starting index of each line's states in state vector" "" +typedef ^ ^ IntKi LineStateIsN {:} - - "ending index of each line's states in state vector" "" +typedef ^ ^ IntKi PointStateIs1 {:} - - "starting index of each point's states in state vector" "" +typedef ^ ^ IntKi PointStateIsN {:} - - "ending index of each point's states in state vector" "" +typedef ^ ^ IntKi RodStateIs1 {:} - - "starting index of each rod's states in state vector" "" +typedef ^ ^ IntKi RodStateIsN {:} - - "ending index of each rod's states in state vector" "" +typedef ^ ^ IntKi BodyStateIs1 {:} - - "starting index of each body's states in state vector" "" +typedef ^ ^ IntKi BodyStateIsN {:} - - "ending index of each body's states in state vector" "" +typedef ^ ^ IntKi Nx - - - "number of states and size of state vector" "" +typedef ^ ^ IntKi Nxtra - - - "number of states and size of state vector including points for potential line failures" "" +typedef ^ ^ IntKi WaveTi - - - "current interpolation index for wave time series data" "" +typedef ^ ^ MD_ContinuousStateType xTemp - - - "contains temporary state vector used in integration (put here so it's only allocated once)" +typedef ^ ^ MD_ContinuousStateType xdTemp - - - "contains temporary state derivative vector used in integration (put here so it's only allocated once)" +typedef ^ ^ MD_ContinuousStateType kSum - - - "Sum of RK4 slope estimates: k0 + 2*k1 + 2*k2 + k3" +typedef ^ ^ DbKi zeros6 {6} - - "array of zeros for convenience" +typedef ^ ^ DbKi MDWrOutput {:} - - "Data from time step to be written to a MoorDyn output file" +typedef ^ ^ DbKi LastOutTime - - - "Time of last writing to MD output files" +typedef ^ ^ ReKi PtfmInit {6} - - "initial position of platform for an individual (non-farm) MD instance" - +typedef ^ ^ DbKi BathymetryGrid {:}{:} - - "matrix describing the bathymetry in a grid of x's and y's" +typedef ^ ^ DbKi BathGrid_Xs {:} - - "array of x-coordinates in the bathymetry grid" +typedef ^ ^ DbKi BathGrid_Ys {:} - - "array of y-coordinates in the bathymetry grid" +typedef ^ ^ IntKi BathGrid_npoints {:} - - "number of grid points to describe the bathymetry grid" +typedef ^ ^ GridInterp_MiscVarType WaveField_m - - - "misc var information from the SeaState Interpolation module" - +typedef ^ ^ LOGICAL IC_gen - .FALSE. - "boolean to indicate dynamic relaxation occuring" "-" diff --git a/modules/moordyn/src/MoorDyn_Types.f90 b/modules/moordyn/src/MoorDyn_Types.f90 index dfd52a4962..86703d7aa7 100644 --- a/modules/moordyn/src/MoorDyn_Types.f90 +++ b/modules/moordyn/src/MoorDyn_Types.f90 @@ -34,10 +34,10 @@ MODULE MoorDyn_Types USE SeaSt_WaveField_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: MD_MaxNCoef = 30 ! maximum number of entries to allow in nonlinear coefficient lookup tables [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: MD_MaxBdAtch = 100 ! maximum number of attachments to a body [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: MD_MaxPtAtch = 100 ! maximum number of attachments to a point [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: MD_MaxFailLines = 30 ! maximum number of line failures that can be simulated [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MD_MaxNCoef = 30 ! maximum number of entries to allow in nonlinear coefficient lookup tables [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MD_MaxBdAtch = 100 ! maximum number of attachments to a body [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MD_MaxPtAtch = 100 ! maximum number of attachments to a point [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MD_MaxFailLines = 30 ! maximum number of line failures that can be simulated [-] ! ========= MD_InputFileType ======= TYPE, PUBLIC :: MD_InputFileType REAL(DbKi) :: DTIC = 0.5 !< convergence check time step for IC generation [[s]] @@ -371,14 +371,7 @@ MODULE MoorDyn_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: writeOutputUnt !< second line of output file contents: units [-] TYPE(ProgDesc) :: Ver !< this module's name, version, and date [-] LOGICAL , DIMENSION(:), ALLOCATABLE :: CableCChanRqst !< flag indicating control channel for drive line active tensioning is requested [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_x !< Names of the continuous states used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_y !< Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_x !< Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame (not used for glue) [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_u !< Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: DerivOrder_x !< Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE MD_InitOutputType ! ======================= ! ========= MD_ContinuousStateType ======= @@ -401,49 +394,6 @@ MODULE MoorDyn_Types REAL(SiKi) :: dummy = 0.0_R4Ki !< Remove this variable if you have other states [-] END TYPE MD_OtherStateType ! ======================= -! ========= MD_MiscVarType ======= - TYPE, PUBLIC :: MD_MiscVarType - TYPE(MD_LineProp) , DIMENSION(:), ALLOCATABLE :: LineTypeList !< array of properties for each line type [-] - TYPE(MD_RodProp) , DIMENSION(:), ALLOCATABLE :: RodTypeList !< array of properties for each rod type [-] - TYPE(MD_Body) :: GroundBody !< the single ground body which is the parent of all stationary points [-] - TYPE(MD_Body) , DIMENSION(:), ALLOCATABLE :: BodyList !< array of body objects [-] - TYPE(MD_Rod) , DIMENSION(:), ALLOCATABLE :: RodList !< array of rod objects [-] - TYPE(MD_Point) , DIMENSION(:), ALLOCATABLE :: PointList !< array of point objects [-] - TYPE(MD_Line) , DIMENSION(:), ALLOCATABLE :: LineList !< array of line objects [-] - TYPE(MD_ExtLd) , DIMENSION(:), ALLOCATABLE :: ExtLdList !< array of external load objects [-] - TYPE(MD_Fail) , DIMENSION(:), ALLOCATABLE :: FailList !< array of line objects [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: FreePointIs !< array of free point indices in PointList vector [] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: CpldPointIs !< array of coupled/fairlead point indices in PointList vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: FreeRodIs !< array of free rod indices in RodList vector [] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: CpldRodIs !< array of coupled/fairlead rod indices in RodList vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: FreeBodyIs !< array of free body indices in BodyList vector [] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: CpldBodyIs !< array of coupled body indices in BodyList vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: LineStateIs1 !< starting index of each line's states in state vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: LineStateIsN !< ending index of each line's states in state vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: PointStateIs1 !< starting index of each point's states in state vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: PointStateIsN !< ending index of each point's states in state vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: RodStateIs1 !< starting index of each rod's states in state vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: RodStateIsN !< ending index of each rod's states in state vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BodyStateIs1 !< starting index of each body's states in state vector [] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BodyStateIsN !< ending index of each body's states in state vector [] - INTEGER(IntKi) :: Nx = 0_IntKi !< number of states and size of state vector [] - INTEGER(IntKi) :: Nxtra = 0_IntKi !< number of states and size of state vector including points for potential line failures [] - INTEGER(IntKi) :: WaveTi = 0_IntKi !< current interpolation index for wave time series data [] - TYPE(MD_ContinuousStateType) :: xTemp !< contains temporary state vector used in integration (put here so it's only allocated once) [-] - TYPE(MD_ContinuousStateType) :: xdTemp !< contains temporary state derivative vector used in integration (put here so it's only allocated once) [-] - TYPE(MD_ContinuousStateType) :: kSum !< Sum of RK4 slope estimates: k0 + 2*k1 + 2*k2 + k3 [-] - REAL(DbKi) , DIMENSION(1:6) :: zeros6 = 0.0_R8Ki !< array of zeros for convenience [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: MDWrOutput !< Data from time step to be written to a MoorDyn output file [-] - REAL(DbKi) :: LastOutTime = 0.0_R8Ki !< Time of last writing to MD output files [-] - REAL(ReKi) , DIMENSION(1:6) :: PtfmInit = 0.0_ReKi !< initial position of platform for an individual (non-farm) MD instance [-] - REAL(DbKi) , DIMENSION(:,:), ALLOCATABLE :: BathymetryGrid !< matrix describing the bathymetry in a grid of x's and y's [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: BathGrid_Xs !< array of x-coordinates in the bathymetry grid [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: BathGrid_Ys !< array of y-coordinates in the bathymetry grid [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BathGrid_npoints !< number of grid points to describe the bathymetry grid [-] - TYPE(GridInterp_MiscVarType) :: WaveField_m !< misc var information from the Grid Interpolation module [-] - LOGICAL :: IC_gen = .FALSE. !< boolean to indicate dynamic relaxation occuring [-] - END TYPE MD_MiscVarType -! ======================= ! ========= MD_ParameterType ======= TYPE, PUBLIC :: MD_ParameterType INTEGER(IntKi) :: nLineTypes = 0 !< number of line types [] @@ -516,13 +466,6 @@ MODULE MoorDyn_Types REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: pzCurrent !< z location of current grid points [-] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: uxCurrent !< current velocities time series at each grid point [-] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: uyCurrent !< current velocities time series at each grid point [-] - INTEGER(IntKi) :: Nx0 = 0_IntKi !< copy of initial size of system state vector, for linearization routines [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: du !< vector that determines size of perturbation for u (inputs) [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: dx !< vector that determines size of perturbation for x (continuous states) [-] - INTEGER(IntKi) :: Jac_ny = 0_IntKi !< number of outputs in jacobian matrix [-] - INTEGER(IntKi) :: Jac_nx = 0_IntKi !< number of continuous states in jacobian matrix [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: dxIdx_map2_xStateIdx !< Mapping array from index of dX array to corresponding state index [-] LOGICAL :: VisMeshes = .false. !< Using visualization meshes as requested by glue code [-] TYPE(VisDiam) , DIMENSION(:), ALLOCATABLE :: VisRodsDiam !< Diameters for visualization of rods [-] END TYPE MD_ParameterType @@ -544,7 +487,66 @@ MODULE MoorDyn_Types TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: VisAnchsMesh !< Point mesh for visualizing mooring anchors [-] END TYPE MD_OutputType ! ======================= -CONTAINS +! ========= MD_MiscVarType ======= + TYPE, PUBLIC :: MD_MiscVarType + TYPE(ModJacType) :: Jac !< Jacobian values corresponding to module variables [-] + TYPE(MD_ContinuousStateType) :: x_perturb !< States for calculating Jacobians [-] + TYPE(MD_ContinuousStateType) :: dxdt_lin !< States for calculating Jacobians [-] + TYPE(MD_InputType) :: u_perturb !< Inputs for calculating Jacobians [-] + TYPE(MD_OutputType) :: y_lin !< Outputs for calculating Jacobians [-] + TYPE(MD_LineProp) , DIMENSION(:), ALLOCATABLE :: LineTypeList !< array of properties for each line type [-] + TYPE(MD_RodProp) , DIMENSION(:), ALLOCATABLE :: RodTypeList !< array of properties for each rod type [-] + TYPE(MD_Body) :: GroundBody !< the single ground body which is the parent of all stationary points [-] + TYPE(MD_Body) , DIMENSION(:), ALLOCATABLE :: BodyList !< array of body objects [-] + TYPE(MD_Rod) , DIMENSION(:), ALLOCATABLE :: RodList !< array of rod objects [-] + TYPE(MD_Point) , DIMENSION(:), ALLOCATABLE :: PointList !< array of point objects [-] + TYPE(MD_Line) , DIMENSION(:), ALLOCATABLE :: LineList !< array of line objects [-] + TYPE(MD_ExtLd) , DIMENSION(:), ALLOCATABLE :: ExtLdList !< array of external load objects [-] + TYPE(MD_Fail) , DIMENSION(:), ALLOCATABLE :: FailList !< array of line objects [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: FreePointIs !< array of free point indices in PointList vector [] + INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: CpldPointIs !< array of coupled/fairlead point indices in PointList vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: FreeRodIs !< array of free rod indices in RodList vector [] + INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: CpldRodIs !< array of coupled/fairlead rod indices in RodList vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: FreeBodyIs !< array of free body indices in BodyList vector [] + INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: CpldBodyIs !< array of coupled body indices in BodyList vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: LineStateIs1 !< starting index of each line's states in state vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: LineStateIsN !< ending index of each line's states in state vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: PointStateIs1 !< starting index of each point's states in state vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: PointStateIsN !< ending index of each point's states in state vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: RodStateIs1 !< starting index of each rod's states in state vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: RodStateIsN !< ending index of each rod's states in state vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BodyStateIs1 !< starting index of each body's states in state vector [] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BodyStateIsN !< ending index of each body's states in state vector [] + INTEGER(IntKi) :: Nx = 0_IntKi !< number of states and size of state vector [] + INTEGER(IntKi) :: Nxtra = 0_IntKi !< number of states and size of state vector including points for potential line failures [] + INTEGER(IntKi) :: WaveTi = 0_IntKi !< current interpolation index for wave time series data [] + TYPE(MD_ContinuousStateType) :: xTemp !< contains temporary state vector used in integration (put here so it's only allocated once) [-] + TYPE(MD_ContinuousStateType) :: xdTemp !< contains temporary state derivative vector used in integration (put here so it's only allocated once) [-] + TYPE(MD_ContinuousStateType) :: kSum !< Sum of RK4 slope estimates: k0 + 2*k1 + 2*k2 + k3 [-] + REAL(DbKi) , DIMENSION(1:6) :: zeros6 = 0.0_R8Ki !< array of zeros for convenience [-] + REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: MDWrOutput !< Data from time step to be written to a MoorDyn output file [-] + REAL(DbKi) :: LastOutTime = 0.0_R8Ki !< Time of last writing to MD output files [-] + REAL(ReKi) , DIMENSION(1:6) :: PtfmInit = 0.0_ReKi !< initial position of platform for an individual (non-farm) MD instance [-] + REAL(DbKi) , DIMENSION(:,:), ALLOCATABLE :: BathymetryGrid !< matrix describing the bathymetry in a grid of x's and y's [-] + REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: BathGrid_Xs !< array of x-coordinates in the bathymetry grid [-] + REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: BathGrid_Ys !< array of y-coordinates in the bathymetry grid [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BathGrid_npoints !< number of grid points to describe the bathymetry grid [-] + TYPE(GridInterp_MiscVarType) :: WaveField_m !< misc var information from the SeaState Interpolation module [-] + LOGICAL :: IC_gen = .FALSE. !< boolean to indicate dynamic relaxation occuring [-] + END TYPE MD_MiscVarType +! ======================= + integer(IntKi), public, parameter :: MD_x_states = 1 ! MD%states + integer(IntKi), public, parameter :: MD_u_CoupledKinematics = 2 ! MD%CoupledKinematics(DL%i1) + integer(IntKi), public, parameter :: MD_u_DeltaL = 3 ! MD%DeltaL + integer(IntKi), public, parameter :: MD_u_DeltaLdot = 4 ! MD%DeltaLdot + integer(IntKi), public, parameter :: MD_y_CoupledLoads = 5 ! MD%CoupledLoads(DL%i1) + integer(IntKi), public, parameter :: MD_y_WriteOutput = 6 ! MD%WriteOutput + integer(IntKi), public, parameter :: MD_y_VisLinesMesh = 7 ! MD%VisLinesMesh(DL%i1) + integer(IntKi), public, parameter :: MD_y_VisRodsMesh = 8 ! MD%VisRodsMesh(DL%i1) + integer(IntKi), public, parameter :: MD_y_VisBodiesMesh = 9 ! MD%VisBodiesMesh(DL%i1) + integer(IntKi), public, parameter :: MD_y_VisAnchsMesh = 10 ! MD%VisAnchsMesh(DL%i1) + +contains subroutine MD_CopyInputFileType(SrcInputFileTypeData, DstInputFileTypeData, CtrlCode, ErrStat, ErrMsg) type(MD_InputFileType), intent(in) :: SrcInputFileTypeData @@ -2767,102 +2769,9 @@ subroutine MD_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, Err end if DstInitOutputData%CableCChanRqst = SrcInitOutputData%CableCChanRqst end if - if (allocated(SrcInitOutputData%LinNames_y)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_y) - UB(1:1) = ubound(SrcInitOutputData%LinNames_y) - if (.not. allocated(DstInitOutputData%LinNames_y)) then - allocate(DstInitOutputData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_y = SrcInitOutputData%LinNames_y - end if - if (allocated(SrcInitOutputData%LinNames_x)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_x) - UB(1:1) = ubound(SrcInitOutputData%LinNames_x) - if (.not. allocated(DstInitOutputData%LinNames_x)) then - allocate(DstInitOutputData%LinNames_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_x = SrcInitOutputData%LinNames_x - end if - if (allocated(SrcInitOutputData%LinNames_u)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_u) - UB(1:1) = ubound(SrcInitOutputData%LinNames_u) - if (.not. allocated(DstInitOutputData%LinNames_u)) then - allocate(DstInitOutputData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_u = SrcInitOutputData%LinNames_u - end if - if (allocated(SrcInitOutputData%RotFrame_y)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_y) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_y) - if (.not. allocated(DstInitOutputData%RotFrame_y)) then - allocate(DstInitOutputData%RotFrame_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_y = SrcInitOutputData%RotFrame_y - end if - if (allocated(SrcInitOutputData%RotFrame_x)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_x) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_x) - if (.not. allocated(DstInitOutputData%RotFrame_x)) then - allocate(DstInitOutputData%RotFrame_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_x = SrcInitOutputData%RotFrame_x - end if - if (allocated(SrcInitOutputData%RotFrame_u)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_u) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_u) - if (.not. allocated(DstInitOutputData%RotFrame_u)) then - allocate(DstInitOutputData%RotFrame_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_u = SrcInitOutputData%RotFrame_u - end if - if (allocated(SrcInitOutputData%IsLoad_u)) then - LB(1:1) = lbound(SrcInitOutputData%IsLoad_u) - UB(1:1) = ubound(SrcInitOutputData%IsLoad_u) - if (.not. allocated(DstInitOutputData%IsLoad_u)) then - allocate(DstInitOutputData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%IsLoad_u = SrcInitOutputData%IsLoad_u - end if - if (allocated(SrcInitOutputData%DerivOrder_x)) then - LB(1:1) = lbound(SrcInitOutputData%DerivOrder_x) - UB(1:1) = ubound(SrcInitOutputData%DerivOrder_x) - if (.not. allocated(DstInitOutputData%DerivOrder_x)) then - allocate(DstInitOutputData%DerivOrder_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%DerivOrder_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%DerivOrder_x = SrcInitOutputData%DerivOrder_x - end if + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine MD_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -2885,30 +2794,8 @@ subroutine MD_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) if (allocated(InitOutputData%CableCChanRqst)) then deallocate(InitOutputData%CableCChanRqst) end if - if (allocated(InitOutputData%LinNames_y)) then - deallocate(InitOutputData%LinNames_y) - end if - if (allocated(InitOutputData%LinNames_x)) then - deallocate(InitOutputData%LinNames_x) - end if - if (allocated(InitOutputData%LinNames_u)) then - deallocate(InitOutputData%LinNames_u) - end if - if (allocated(InitOutputData%RotFrame_y)) then - deallocate(InitOutputData%RotFrame_y) - end if - if (allocated(InitOutputData%RotFrame_x)) then - deallocate(InitOutputData%RotFrame_x) - end if - if (allocated(InitOutputData%RotFrame_u)) then - deallocate(InitOutputData%RotFrame_u) - end if - if (allocated(InitOutputData%IsLoad_u)) then - deallocate(InitOutputData%IsLoad_u) - end if - if (allocated(InitOutputData%DerivOrder_x)) then - deallocate(InitOutputData%DerivOrder_x) - end if + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine MD_PackInitOutput(RF, Indata) @@ -2920,14 +2807,7 @@ subroutine MD_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%writeOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) call RegPackAlloc(RF, InData%CableCChanRqst) - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_x) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%RotFrame_y) - call RegPackAlloc(RF, InData%RotFrame_x) - call RegPackAlloc(RF, InData%RotFrame_u) - call RegPackAlloc(RF, InData%IsLoad_u) - call RegPackAlloc(RF, InData%DerivOrder_x) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -2943,14 +2823,7 @@ subroutine MD_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%writeOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver call RegUnpackAlloc(RF, OutData%CableCChanRqst); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DerivOrder_x); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine MD_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg) @@ -3124,1948 +2997,1906 @@ subroutine MD_UnPackOtherState(RF, OutData) call RegUnpack(RF, OutData%dummy); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine MD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(MD_MiscVarType), intent(in) :: SrcMiscData - type(MD_MiscVarType), intent(inout) :: DstMiscData +subroutine MD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) + type(MD_ParameterType), intent(in) :: SrcParamData + type(MD_ParameterType), intent(inout) :: DstParamData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1, i2, i3, i4 + integer(B4Ki) :: LB(4), UB(4) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'MD_CopyMisc' + character(*), parameter :: RoutineName = 'MD_CopyParam' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcMiscData%LineTypeList)) then - LB(1:1) = lbound(SrcMiscData%LineTypeList) - UB(1:1) = ubound(SrcMiscData%LineTypeList) - if (.not. allocated(DstMiscData%LineTypeList)) then - allocate(DstMiscData%LineTypeList(LB(1):UB(1)), stat=ErrStat2) + DstParamData%nLineTypes = SrcParamData%nLineTypes + DstParamData%nRodTypes = SrcParamData%nRodTypes + DstParamData%nPoints = SrcParamData%nPoints + DstParamData%nPointsExtra = SrcParamData%nPointsExtra + DstParamData%nBodies = SrcParamData%nBodies + DstParamData%nRods = SrcParamData%nRods + DstParamData%nLines = SrcParamData%nLines + DstParamData%nExtLds = SrcParamData%nExtLds + DstParamData%nCtrlChans = SrcParamData%nCtrlChans + DstParamData%nFails = SrcParamData%nFails + DstParamData%nFreeBodies = SrcParamData%nFreeBodies + DstParamData%nFreeRods = SrcParamData%nFreeRods + DstParamData%nFreePoints = SrcParamData%nFreePoints + if (allocated(SrcParamData%nCpldBodies)) then + LB(1:1) = lbound(SrcParamData%nCpldBodies) + UB(1:1) = ubound(SrcParamData%nCpldBodies) + if (.not. allocated(DstParamData%nCpldBodies)) then + allocate(DstParamData%nCpldBodies(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%LineTypeList.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nCpldBodies.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MD_CopyLineProp(SrcMiscData%LineTypeList(i1), DstMiscData%LineTypeList(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%nCpldBodies = SrcParamData%nCpldBodies end if - if (allocated(SrcMiscData%RodTypeList)) then - LB(1:1) = lbound(SrcMiscData%RodTypeList) - UB(1:1) = ubound(SrcMiscData%RodTypeList) - if (.not. allocated(DstMiscData%RodTypeList)) then - allocate(DstMiscData%RodTypeList(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%nCpldRods)) then + LB(1:1) = lbound(SrcParamData%nCpldRods) + UB(1:1) = ubound(SrcParamData%nCpldRods) + if (.not. allocated(DstParamData%nCpldRods)) then + allocate(DstParamData%nCpldRods(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%RodTypeList.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nCpldRods.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MD_CopyRodProp(SrcMiscData%RodTypeList(i1), DstMiscData%RodTypeList(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%nCpldRods = SrcParamData%nCpldRods end if - call MD_CopyBody(SrcMiscData%GroundBody, DstMiscData%GroundBody, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcMiscData%BodyList)) then - LB(1:1) = lbound(SrcMiscData%BodyList) - UB(1:1) = ubound(SrcMiscData%BodyList) - if (.not. allocated(DstMiscData%BodyList)) then - allocate(DstMiscData%BodyList(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%nCpldPoints)) then + LB(1:1) = lbound(SrcParamData%nCpldPoints) + UB(1:1) = ubound(SrcParamData%nCpldPoints) + if (.not. allocated(DstParamData%nCpldPoints)) then + allocate(DstParamData%nCpldPoints(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BodyList.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nCpldPoints.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MD_CopyBody(SrcMiscData%BodyList(i1), DstMiscData%BodyList(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%nCpldPoints = SrcParamData%nCpldPoints end if - if (allocated(SrcMiscData%RodList)) then - LB(1:1) = lbound(SrcMiscData%RodList) - UB(1:1) = ubound(SrcMiscData%RodList) - if (.not. allocated(DstMiscData%RodList)) then - allocate(DstMiscData%RodList(LB(1):UB(1)), stat=ErrStat2) + DstParamData%NConns = SrcParamData%NConns + DstParamData%NAnchs = SrcParamData%NAnchs + DstParamData%Tmax = SrcParamData%Tmax + DstParamData%tScheme = SrcParamData%tScheme + DstParamData%g = SrcParamData%g + DstParamData%rhoW = SrcParamData%rhoW + DstParamData%WtrDpth = SrcParamData%WtrDpth + DstParamData%kBot = SrcParamData%kBot + DstParamData%cBot = SrcParamData%cBot + DstParamData%dtM0 = SrcParamData%dtM0 + DstParamData%dtCoupling = SrcParamData%dtCoupling + DstParamData%NumOuts = SrcParamData%NumOuts + DstParamData%dtOut = SrcParamData%dtOut + DstParamData%RootName = SrcParamData%RootName + if (allocated(SrcParamData%OutParam)) then + LB(1:1) = lbound(SrcParamData%OutParam) + UB(1:1) = ubound(SrcParamData%OutParam) + if (.not. allocated(DstParamData%OutParam)) then + allocate(DstParamData%OutParam(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%RodList.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MD_CopyRod(SrcMiscData%RodList(i1), DstMiscData%RodList(i1), CtrlCode, ErrStat2, ErrMsg2) + call MD_CopyOutParmType(SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMiscData%PointList)) then - LB(1:1) = lbound(SrcMiscData%PointList) - UB(1:1) = ubound(SrcMiscData%PointList) - if (.not. allocated(DstMiscData%PointList)) then - allocate(DstMiscData%PointList(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%PointList.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MD_CopyPoint(SrcMiscData%PointList(i1), DstMiscData%PointList(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcMiscData%LineList)) then - LB(1:1) = lbound(SrcMiscData%LineList) - UB(1:1) = ubound(SrcMiscData%LineList) - if (.not. allocated(DstMiscData%LineList)) then - allocate(DstMiscData%LineList(LB(1):UB(1)), stat=ErrStat2) + DstParamData%Delim = SrcParamData%Delim + DstParamData%MDUnOut = SrcParamData%MDUnOut + DstParamData%PriPath = SrcParamData%PriPath + DstParamData%writeLog = SrcParamData%writeLog + DstParamData%UnLog = SrcParamData%UnLog + DstParamData%WaveKin = SrcParamData%WaveKin + DstParamData%Current = SrcParamData%Current + DstParamData%WaterKin = SrcParamData%WaterKin + DstParamData%WaveField => SrcParamData%WaveField + DstParamData%nTurbines = SrcParamData%nTurbines + if (allocated(SrcParamData%TurbineRefPos)) then + LB(1:2) = lbound(SrcParamData%TurbineRefPos) + UB(1:2) = ubound(SrcParamData%TurbineRefPos) + if (.not. allocated(DstParamData%TurbineRefPos)) then + allocate(DstParamData%TurbineRefPos(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%LineList.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TurbineRefPos.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MD_CopyLine(SrcMiscData%LineList(i1), DstMiscData%LineList(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%TurbineRefPos = SrcParamData%TurbineRefPos end if - if (allocated(SrcMiscData%ExtLdList)) then - LB(1:1) = lbound(SrcMiscData%ExtLdList) - UB(1:1) = ubound(SrcMiscData%ExtLdList) - if (.not. allocated(DstMiscData%ExtLdList)) then - allocate(DstMiscData%ExtLdList(LB(1):UB(1)), stat=ErrStat2) + DstParamData%mu_kT = SrcParamData%mu_kT + DstParamData%mu_kA = SrcParamData%mu_kA + DstParamData%mc = SrcParamData%mc + DstParamData%cv = SrcParamData%cv + DstParamData%inertialF = SrcParamData%inertialF + DstParamData%inertialF_rampT = SrcParamData%inertialF_rampT + DstParamData%OutSwitch = SrcParamData%OutSwitch + DstParamData%disableOutTime = SrcParamData%disableOutTime + DstParamData%nxWave = SrcParamData%nxWave + DstParamData%nyWave = SrcParamData%nyWave + DstParamData%nzWave = SrcParamData%nzWave + DstParamData%ntWave = SrcParamData%ntWave + if (allocated(SrcParamData%pxWave)) then + LB(1:1) = lbound(SrcParamData%pxWave) + UB(1:1) = ubound(SrcParamData%pxWave) + if (.not. allocated(DstParamData%pxWave)) then + allocate(DstParamData%pxWave(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%ExtLdList.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%pxWave.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MD_CopyExtLd(SrcMiscData%ExtLdList(i1), DstMiscData%ExtLdList(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%pxWave = SrcParamData%pxWave end if - if (allocated(SrcMiscData%FailList)) then - LB(1:1) = lbound(SrcMiscData%FailList) - UB(1:1) = ubound(SrcMiscData%FailList) - if (.not. allocated(DstMiscData%FailList)) then - allocate(DstMiscData%FailList(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%pyWave)) then + LB(1:1) = lbound(SrcParamData%pyWave) + UB(1:1) = ubound(SrcParamData%pyWave) + if (.not. allocated(DstParamData%pyWave)) then + allocate(DstParamData%pyWave(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FailList.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%pyWave.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MD_CopyFail(SrcMiscData%FailList(i1), DstMiscData%FailList(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%pyWave = SrcParamData%pyWave end if - if (allocated(SrcMiscData%FreePointIs)) then - LB(1:1) = lbound(SrcMiscData%FreePointIs) - UB(1:1) = ubound(SrcMiscData%FreePointIs) - if (.not. allocated(DstMiscData%FreePointIs)) then - allocate(DstMiscData%FreePointIs(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%pzWave)) then + LB(1:1) = lbound(SrcParamData%pzWave) + UB(1:1) = ubound(SrcParamData%pzWave) + if (.not. allocated(DstParamData%pzWave)) then + allocate(DstParamData%pzWave(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FreePointIs.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%pzWave.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%FreePointIs = SrcMiscData%FreePointIs + DstParamData%pzWave = SrcParamData%pzWave end if - if (allocated(SrcMiscData%CpldPointIs)) then - LB(1:2) = lbound(SrcMiscData%CpldPointIs) - UB(1:2) = ubound(SrcMiscData%CpldPointIs) - if (.not. allocated(DstMiscData%CpldPointIs)) then - allocate(DstMiscData%CpldPointIs(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + DstParamData%dtWave = SrcParamData%dtWave + if (allocated(SrcParamData%uxWave)) then + LB(1:4) = lbound(SrcParamData%uxWave) + UB(1:4) = ubound(SrcParamData%uxWave) + if (.not. allocated(DstParamData%uxWave)) then + allocate(DstParamData%uxWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%CpldPointIs.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uxWave.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%CpldPointIs = SrcMiscData%CpldPointIs + DstParamData%uxWave = SrcParamData%uxWave end if - if (allocated(SrcMiscData%FreeRodIs)) then - LB(1:1) = lbound(SrcMiscData%FreeRodIs) - UB(1:1) = ubound(SrcMiscData%FreeRodIs) - if (.not. allocated(DstMiscData%FreeRodIs)) then - allocate(DstMiscData%FreeRodIs(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%uyWave)) then + LB(1:4) = lbound(SrcParamData%uyWave) + UB(1:4) = ubound(SrcParamData%uyWave) + if (.not. allocated(DstParamData%uyWave)) then + allocate(DstParamData%uyWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FreeRodIs.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uyWave.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%FreeRodIs = SrcMiscData%FreeRodIs + DstParamData%uyWave = SrcParamData%uyWave end if - if (allocated(SrcMiscData%CpldRodIs)) then - LB(1:2) = lbound(SrcMiscData%CpldRodIs) - UB(1:2) = ubound(SrcMiscData%CpldRodIs) - if (.not. allocated(DstMiscData%CpldRodIs)) then - allocate(DstMiscData%CpldRodIs(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%uzWave)) then + LB(1:4) = lbound(SrcParamData%uzWave) + UB(1:4) = ubound(SrcParamData%uzWave) + if (.not. allocated(DstParamData%uzWave)) then + allocate(DstParamData%uzWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%CpldRodIs.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uzWave.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%CpldRodIs = SrcMiscData%CpldRodIs + DstParamData%uzWave = SrcParamData%uzWave end if - if (allocated(SrcMiscData%FreeBodyIs)) then - LB(1:1) = lbound(SrcMiscData%FreeBodyIs) - UB(1:1) = ubound(SrcMiscData%FreeBodyIs) - if (.not. allocated(DstMiscData%FreeBodyIs)) then - allocate(DstMiscData%FreeBodyIs(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%axWave)) then + LB(1:4) = lbound(SrcParamData%axWave) + UB(1:4) = ubound(SrcParamData%axWave) + if (.not. allocated(DstParamData%axWave)) then + allocate(DstParamData%axWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FreeBodyIs.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%axWave.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%FreeBodyIs = SrcMiscData%FreeBodyIs + DstParamData%axWave = SrcParamData%axWave end if - if (allocated(SrcMiscData%CpldBodyIs)) then - LB(1:2) = lbound(SrcMiscData%CpldBodyIs) - UB(1:2) = ubound(SrcMiscData%CpldBodyIs) - if (.not. allocated(DstMiscData%CpldBodyIs)) then - allocate(DstMiscData%CpldBodyIs(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%ayWave)) then + LB(1:4) = lbound(SrcParamData%ayWave) + UB(1:4) = ubound(SrcParamData%ayWave) + if (.not. allocated(DstParamData%ayWave)) then + allocate(DstParamData%ayWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%CpldBodyIs.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ayWave.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%CpldBodyIs = SrcMiscData%CpldBodyIs + DstParamData%ayWave = SrcParamData%ayWave end if - if (allocated(SrcMiscData%LineStateIs1)) then - LB(1:1) = lbound(SrcMiscData%LineStateIs1) - UB(1:1) = ubound(SrcMiscData%LineStateIs1) - if (.not. allocated(DstMiscData%LineStateIs1)) then - allocate(DstMiscData%LineStateIs1(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%azWave)) then + LB(1:4) = lbound(SrcParamData%azWave) + UB(1:4) = ubound(SrcParamData%azWave) + if (.not. allocated(DstParamData%azWave)) then + allocate(DstParamData%azWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%LineStateIs1.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%azWave.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%LineStateIs1 = SrcMiscData%LineStateIs1 + DstParamData%azWave = SrcParamData%azWave end if - if (allocated(SrcMiscData%LineStateIsN)) then - LB(1:1) = lbound(SrcMiscData%LineStateIsN) - UB(1:1) = ubound(SrcMiscData%LineStateIsN) - if (.not. allocated(DstMiscData%LineStateIsN)) then - allocate(DstMiscData%LineStateIsN(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%PDyn)) then + LB(1:4) = lbound(SrcParamData%PDyn) + UB(1:4) = ubound(SrcParamData%PDyn) + if (.not. allocated(DstParamData%PDyn)) then + allocate(DstParamData%PDyn(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%LineStateIsN.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PDyn.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%LineStateIsN = SrcMiscData%LineStateIsN + DstParamData%PDyn = SrcParamData%PDyn end if - if (allocated(SrcMiscData%PointStateIs1)) then - LB(1:1) = lbound(SrcMiscData%PointStateIs1) - UB(1:1) = ubound(SrcMiscData%PointStateIs1) - if (.not. allocated(DstMiscData%PointStateIs1)) then - allocate(DstMiscData%PointStateIs1(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%zeta)) then + LB(1:3) = lbound(SrcParamData%zeta) + UB(1:3) = ubound(SrcParamData%zeta) + if (.not. allocated(DstParamData%zeta)) then + allocate(DstParamData%zeta(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%PointStateIs1.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%zeta.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%PointStateIs1 = SrcMiscData%PointStateIs1 + DstParamData%zeta = SrcParamData%zeta end if - if (allocated(SrcMiscData%PointStateIsN)) then - LB(1:1) = lbound(SrcMiscData%PointStateIsN) - UB(1:1) = ubound(SrcMiscData%PointStateIsN) - if (.not. allocated(DstMiscData%PointStateIsN)) then - allocate(DstMiscData%PointStateIsN(LB(1):UB(1)), stat=ErrStat2) + DstParamData%nzCurrent = SrcParamData%nzCurrent + if (allocated(SrcParamData%pzCurrent)) then + LB(1:1) = lbound(SrcParamData%pzCurrent) + UB(1:1) = ubound(SrcParamData%pzCurrent) + if (.not. allocated(DstParamData%pzCurrent)) then + allocate(DstParamData%pzCurrent(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%PointStateIsN.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%pzCurrent.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%PointStateIsN = SrcMiscData%PointStateIsN + DstParamData%pzCurrent = SrcParamData%pzCurrent end if - if (allocated(SrcMiscData%RodStateIs1)) then - LB(1:1) = lbound(SrcMiscData%RodStateIs1) - UB(1:1) = ubound(SrcMiscData%RodStateIs1) - if (.not. allocated(DstMiscData%RodStateIs1)) then - allocate(DstMiscData%RodStateIs1(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%uxCurrent)) then + LB(1:1) = lbound(SrcParamData%uxCurrent) + UB(1:1) = ubound(SrcParamData%uxCurrent) + if (.not. allocated(DstParamData%uxCurrent)) then + allocate(DstParamData%uxCurrent(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%RodStateIs1.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uxCurrent.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%RodStateIs1 = SrcMiscData%RodStateIs1 + DstParamData%uxCurrent = SrcParamData%uxCurrent end if - if (allocated(SrcMiscData%RodStateIsN)) then - LB(1:1) = lbound(SrcMiscData%RodStateIsN) - UB(1:1) = ubound(SrcMiscData%RodStateIsN) - if (.not. allocated(DstMiscData%RodStateIsN)) then - allocate(DstMiscData%RodStateIsN(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%uyCurrent)) then + LB(1:1) = lbound(SrcParamData%uyCurrent) + UB(1:1) = ubound(SrcParamData%uyCurrent) + if (.not. allocated(DstParamData%uyCurrent)) then + allocate(DstParamData%uyCurrent(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%RodStateIsN.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uyCurrent.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%RodStateIsN = SrcMiscData%RodStateIsN + DstParamData%uyCurrent = SrcParamData%uyCurrent end if - if (allocated(SrcMiscData%BodyStateIs1)) then - LB(1:1) = lbound(SrcMiscData%BodyStateIs1) - UB(1:1) = ubound(SrcMiscData%BodyStateIs1) - if (.not. allocated(DstMiscData%BodyStateIs1)) then - allocate(DstMiscData%BodyStateIs1(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BodyStateIs1.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%BodyStateIs1 = SrcMiscData%BodyStateIs1 - end if - if (allocated(SrcMiscData%BodyStateIsN)) then - LB(1:1) = lbound(SrcMiscData%BodyStateIsN) - UB(1:1) = ubound(SrcMiscData%BodyStateIsN) - if (.not. allocated(DstMiscData%BodyStateIsN)) then - allocate(DstMiscData%BodyStateIsN(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BodyStateIsN.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%BodyStateIsN = SrcMiscData%BodyStateIsN - end if - DstMiscData%Nx = SrcMiscData%Nx - DstMiscData%Nxtra = SrcMiscData%Nxtra - DstMiscData%WaveTi = SrcMiscData%WaveTi - call MD_CopyContState(SrcMiscData%xTemp, DstMiscData%xTemp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MD_CopyContState(SrcMiscData%xdTemp, DstMiscData%xdTemp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MD_CopyContState(SrcMiscData%kSum, DstMiscData%kSum, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstMiscData%zeros6 = SrcMiscData%zeros6 - if (allocated(SrcMiscData%MDWrOutput)) then - LB(1:1) = lbound(SrcMiscData%MDWrOutput) - UB(1:1) = ubound(SrcMiscData%MDWrOutput) - if (.not. allocated(DstMiscData%MDWrOutput)) then - allocate(DstMiscData%MDWrOutput(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%MDWrOutput.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%MDWrOutput = SrcMiscData%MDWrOutput - end if - DstMiscData%LastOutTime = SrcMiscData%LastOutTime - DstMiscData%PtfmInit = SrcMiscData%PtfmInit - if (allocated(SrcMiscData%BathymetryGrid)) then - LB(1:2) = lbound(SrcMiscData%BathymetryGrid) - UB(1:2) = ubound(SrcMiscData%BathymetryGrid) - if (.not. allocated(DstMiscData%BathymetryGrid)) then - allocate(DstMiscData%BathymetryGrid(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BathymetryGrid.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%BathymetryGrid = SrcMiscData%BathymetryGrid - end if - if (allocated(SrcMiscData%BathGrid_Xs)) then - LB(1:1) = lbound(SrcMiscData%BathGrid_Xs) - UB(1:1) = ubound(SrcMiscData%BathGrid_Xs) - if (.not. allocated(DstMiscData%BathGrid_Xs)) then - allocate(DstMiscData%BathGrid_Xs(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BathGrid_Xs.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%BathGrid_Xs = SrcMiscData%BathGrid_Xs - end if - if (allocated(SrcMiscData%BathGrid_Ys)) then - LB(1:1) = lbound(SrcMiscData%BathGrid_Ys) - UB(1:1) = ubound(SrcMiscData%BathGrid_Ys) - if (.not. allocated(DstMiscData%BathGrid_Ys)) then - allocate(DstMiscData%BathGrid_Ys(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BathGrid_Ys.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscData%BathGrid_Ys = SrcMiscData%BathGrid_Ys - end if - if (allocated(SrcMiscData%BathGrid_npoints)) then - LB(1:1) = lbound(SrcMiscData%BathGrid_npoints) - UB(1:1) = ubound(SrcMiscData%BathGrid_npoints) - if (.not. allocated(DstMiscData%BathGrid_npoints)) then - allocate(DstMiscData%BathGrid_npoints(LB(1):UB(1)), stat=ErrStat2) + DstParamData%VisMeshes = SrcParamData%VisMeshes + if (allocated(SrcParamData%VisRodsDiam)) then + LB(1:1) = lbound(SrcParamData%VisRodsDiam) + UB(1:1) = ubound(SrcParamData%VisRodsDiam) + if (.not. allocated(DstParamData%VisRodsDiam)) then + allocate(DstParamData%VisRodsDiam(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BathGrid_npoints.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%VisRodsDiam.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%BathGrid_npoints = SrcMiscData%BathGrid_npoints + do i1 = LB(1), UB(1) + call MD_CopyVisDiam(SrcParamData%VisRodsDiam(i1), DstParamData%VisRodsDiam(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - call GridInterp_CopyMisc(SrcMiscData%WaveField_m, DstMiscData%WaveField_m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstMiscData%IC_gen = SrcMiscData%IC_gen end subroutine -subroutine MD_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(MD_MiscVarType), intent(inout) :: MiscData +subroutine MD_DestroyParam(ParamData, ErrStat, ErrMsg) + type(MD_ParameterType), intent(inout) :: ParamData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1, i2, i3, i4 + integer(B4Ki) :: LB(4), UB(4) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'MD_DestroyMisc' + character(*), parameter :: RoutineName = 'MD_DestroyParam' ErrStat = ErrID_None ErrMsg = '' - if (allocated(MiscData%LineTypeList)) then - LB(1:1) = lbound(MiscData%LineTypeList) - UB(1:1) = ubound(MiscData%LineTypeList) - do i1 = LB(1), UB(1) - call MD_DestroyLineProp(MiscData%LineTypeList(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%LineTypeList) - end if - if (allocated(MiscData%RodTypeList)) then - LB(1:1) = lbound(MiscData%RodTypeList) - UB(1:1) = ubound(MiscData%RodTypeList) - do i1 = LB(1), UB(1) - call MD_DestroyRodProp(MiscData%RodTypeList(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%RodTypeList) + if (allocated(ParamData%nCpldBodies)) then + deallocate(ParamData%nCpldBodies) end if - call MD_DestroyBody(MiscData%GroundBody, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MiscData%BodyList)) then - LB(1:1) = lbound(MiscData%BodyList) - UB(1:1) = ubound(MiscData%BodyList) - do i1 = LB(1), UB(1) - call MD_DestroyBody(MiscData%BodyList(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%BodyList) + if (allocated(ParamData%nCpldRods)) then + deallocate(ParamData%nCpldRods) end if - if (allocated(MiscData%RodList)) then - LB(1:1) = lbound(MiscData%RodList) - UB(1:1) = ubound(MiscData%RodList) - do i1 = LB(1), UB(1) - call MD_DestroyRod(MiscData%RodList(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%RodList) + if (allocated(ParamData%nCpldPoints)) then + deallocate(ParamData%nCpldPoints) end if - if (allocated(MiscData%PointList)) then - LB(1:1) = lbound(MiscData%PointList) - UB(1:1) = ubound(MiscData%PointList) + if (allocated(ParamData%OutParam)) then + LB(1:1) = lbound(ParamData%OutParam) + UB(1:1) = ubound(ParamData%OutParam) do i1 = LB(1), UB(1) - call MD_DestroyPoint(MiscData%PointList(i1), ErrStat2, ErrMsg2) + call MD_DestroyOutParmType(ParamData%OutParam(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MiscData%PointList) + deallocate(ParamData%OutParam) end if - if (allocated(MiscData%LineList)) then - LB(1:1) = lbound(MiscData%LineList) - UB(1:1) = ubound(MiscData%LineList) - do i1 = LB(1), UB(1) - call MD_DestroyLine(MiscData%LineList(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%LineList) + nullify(ParamData%WaveField) + if (allocated(ParamData%TurbineRefPos)) then + deallocate(ParamData%TurbineRefPos) end if - if (allocated(MiscData%ExtLdList)) then - LB(1:1) = lbound(MiscData%ExtLdList) - UB(1:1) = ubound(MiscData%ExtLdList) - do i1 = LB(1), UB(1) - call MD_DestroyExtLd(MiscData%ExtLdList(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%ExtLdList) + if (allocated(ParamData%pxWave)) then + deallocate(ParamData%pxWave) end if - if (allocated(MiscData%FailList)) then - LB(1:1) = lbound(MiscData%FailList) - UB(1:1) = ubound(MiscData%FailList) - do i1 = LB(1), UB(1) - call MD_DestroyFail(MiscData%FailList(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%FailList) + if (allocated(ParamData%pyWave)) then + deallocate(ParamData%pyWave) end if - if (allocated(MiscData%FreePointIs)) then - deallocate(MiscData%FreePointIs) + if (allocated(ParamData%pzWave)) then + deallocate(ParamData%pzWave) end if - if (allocated(MiscData%CpldPointIs)) then - deallocate(MiscData%CpldPointIs) + if (allocated(ParamData%uxWave)) then + deallocate(ParamData%uxWave) end if - if (allocated(MiscData%FreeRodIs)) then - deallocate(MiscData%FreeRodIs) + if (allocated(ParamData%uyWave)) then + deallocate(ParamData%uyWave) end if - if (allocated(MiscData%CpldRodIs)) then - deallocate(MiscData%CpldRodIs) + if (allocated(ParamData%uzWave)) then + deallocate(ParamData%uzWave) end if - if (allocated(MiscData%FreeBodyIs)) then - deallocate(MiscData%FreeBodyIs) + if (allocated(ParamData%axWave)) then + deallocate(ParamData%axWave) end if - if (allocated(MiscData%CpldBodyIs)) then - deallocate(MiscData%CpldBodyIs) + if (allocated(ParamData%ayWave)) then + deallocate(ParamData%ayWave) end if - if (allocated(MiscData%LineStateIs1)) then - deallocate(MiscData%LineStateIs1) + if (allocated(ParamData%azWave)) then + deallocate(ParamData%azWave) end if - if (allocated(MiscData%LineStateIsN)) then - deallocate(MiscData%LineStateIsN) + if (allocated(ParamData%PDyn)) then + deallocate(ParamData%PDyn) end if - if (allocated(MiscData%PointStateIs1)) then - deallocate(MiscData%PointStateIs1) + if (allocated(ParamData%zeta)) then + deallocate(ParamData%zeta) end if - if (allocated(MiscData%PointStateIsN)) then - deallocate(MiscData%PointStateIsN) + if (allocated(ParamData%pzCurrent)) then + deallocate(ParamData%pzCurrent) end if - if (allocated(MiscData%RodStateIs1)) then - deallocate(MiscData%RodStateIs1) + if (allocated(ParamData%uxCurrent)) then + deallocate(ParamData%uxCurrent) end if - if (allocated(MiscData%RodStateIsN)) then - deallocate(MiscData%RodStateIsN) + if (allocated(ParamData%uyCurrent)) then + deallocate(ParamData%uyCurrent) end if - if (allocated(MiscData%BodyStateIs1)) then - deallocate(MiscData%BodyStateIs1) + if (allocated(ParamData%VisRodsDiam)) then + LB(1:1) = lbound(ParamData%VisRodsDiam) + UB(1:1) = ubound(ParamData%VisRodsDiam) + do i1 = LB(1), UB(1) + call MD_DestroyVisDiam(ParamData%VisRodsDiam(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ParamData%VisRodsDiam) end if - if (allocated(MiscData%BodyStateIsN)) then - deallocate(MiscData%BodyStateIsN) - end if - call MD_DestroyContState(MiscData%xTemp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MD_DestroyContState(MiscData%xdTemp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MD_DestroyContState(MiscData%kSum, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MiscData%MDWrOutput)) then - deallocate(MiscData%MDWrOutput) - end if - if (allocated(MiscData%BathymetryGrid)) then - deallocate(MiscData%BathymetryGrid) - end if - if (allocated(MiscData%BathGrid_Xs)) then - deallocate(MiscData%BathGrid_Xs) - end if - if (allocated(MiscData%BathGrid_Ys)) then - deallocate(MiscData%BathGrid_Ys) - end if - if (allocated(MiscData%BathGrid_npoints)) then - deallocate(MiscData%BathGrid_npoints) - end if - call GridInterp_DestroyMisc(MiscData%WaveField_m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine -subroutine MD_PackMisc(RF, Indata) +subroutine MD_PackParam(RF, Indata) type(RegFile), intent(inout) :: RF - type(MD_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'MD_PackMisc' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + type(MD_ParameterType), intent(in) :: InData + character(*), parameter :: RoutineName = 'MD_PackParam' + integer(B4Ki) :: i1, i2, i3, i4 + integer(B4Ki) :: LB(4), UB(4) + logical :: PtrInIndex if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%LineTypeList)) - if (allocated(InData%LineTypeList)) then - call RegPackBounds(RF, 1, lbound(InData%LineTypeList), ubound(InData%LineTypeList)) - LB(1:1) = lbound(InData%LineTypeList) - UB(1:1) = ubound(InData%LineTypeList) - do i1 = LB(1), UB(1) - call MD_PackLineProp(RF, InData%LineTypeList(i1)) - end do - end if - call RegPack(RF, allocated(InData%RodTypeList)) - if (allocated(InData%RodTypeList)) then - call RegPackBounds(RF, 1, lbound(InData%RodTypeList), ubound(InData%RodTypeList)) - LB(1:1) = lbound(InData%RodTypeList) - UB(1:1) = ubound(InData%RodTypeList) - do i1 = LB(1), UB(1) - call MD_PackRodProp(RF, InData%RodTypeList(i1)) - end do - end if - call MD_PackBody(RF, InData%GroundBody) - call RegPack(RF, allocated(InData%BodyList)) - if (allocated(InData%BodyList)) then - call RegPackBounds(RF, 1, lbound(InData%BodyList), ubound(InData%BodyList)) - LB(1:1) = lbound(InData%BodyList) - UB(1:1) = ubound(InData%BodyList) - do i1 = LB(1), UB(1) - call MD_PackBody(RF, InData%BodyList(i1)) - end do - end if - call RegPack(RF, allocated(InData%RodList)) - if (allocated(InData%RodList)) then - call RegPackBounds(RF, 1, lbound(InData%RodList), ubound(InData%RodList)) - LB(1:1) = lbound(InData%RodList) - UB(1:1) = ubound(InData%RodList) - do i1 = LB(1), UB(1) - call MD_PackRod(RF, InData%RodList(i1)) - end do - end if - call RegPack(RF, allocated(InData%PointList)) - if (allocated(InData%PointList)) then - call RegPackBounds(RF, 1, lbound(InData%PointList), ubound(InData%PointList)) - LB(1:1) = lbound(InData%PointList) - UB(1:1) = ubound(InData%PointList) - do i1 = LB(1), UB(1) - call MD_PackPoint(RF, InData%PointList(i1)) - end do - end if - call RegPack(RF, allocated(InData%LineList)) - if (allocated(InData%LineList)) then - call RegPackBounds(RF, 1, lbound(InData%LineList), ubound(InData%LineList)) - LB(1:1) = lbound(InData%LineList) - UB(1:1) = ubound(InData%LineList) - do i1 = LB(1), UB(1) - call MD_PackLine(RF, InData%LineList(i1)) - end do - end if - call RegPack(RF, allocated(InData%ExtLdList)) - if (allocated(InData%ExtLdList)) then - call RegPackBounds(RF, 1, lbound(InData%ExtLdList), ubound(InData%ExtLdList)) - LB(1:1) = lbound(InData%ExtLdList) - UB(1:1) = ubound(InData%ExtLdList) - do i1 = LB(1), UB(1) - call MD_PackExtLd(RF, InData%ExtLdList(i1)) - end do - end if - call RegPack(RF, allocated(InData%FailList)) - if (allocated(InData%FailList)) then - call RegPackBounds(RF, 1, lbound(InData%FailList), ubound(InData%FailList)) - LB(1:1) = lbound(InData%FailList) - UB(1:1) = ubound(InData%FailList) - do i1 = LB(1), UB(1) - call MD_PackFail(RF, InData%FailList(i1)) - end do - end if - call RegPackAlloc(RF, InData%FreePointIs) - call RegPackAlloc(RF, InData%CpldPointIs) - call RegPackAlloc(RF, InData%FreeRodIs) - call RegPackAlloc(RF, InData%CpldRodIs) - call RegPackAlloc(RF, InData%FreeBodyIs) - call RegPackAlloc(RF, InData%CpldBodyIs) - call RegPackAlloc(RF, InData%LineStateIs1) - call RegPackAlloc(RF, InData%LineStateIsN) - call RegPackAlloc(RF, InData%PointStateIs1) - call RegPackAlloc(RF, InData%PointStateIsN) - call RegPackAlloc(RF, InData%RodStateIs1) - call RegPackAlloc(RF, InData%RodStateIsN) - call RegPackAlloc(RF, InData%BodyStateIs1) - call RegPackAlloc(RF, InData%BodyStateIsN) - call RegPack(RF, InData%Nx) - call RegPack(RF, InData%Nxtra) - call RegPack(RF, InData%WaveTi) - call MD_PackContState(RF, InData%xTemp) - call MD_PackContState(RF, InData%xdTemp) - call MD_PackContState(RF, InData%kSum) - call RegPack(RF, InData%zeros6) - call RegPackAlloc(RF, InData%MDWrOutput) - call RegPack(RF, InData%LastOutTime) - call RegPack(RF, InData%PtfmInit) - call RegPackAlloc(RF, InData%BathymetryGrid) - call RegPackAlloc(RF, InData%BathGrid_Xs) - call RegPackAlloc(RF, InData%BathGrid_Ys) - call RegPackAlloc(RF, InData%BathGrid_npoints) - call GridInterp_PackMisc(RF, InData%WaveField_m) - call RegPack(RF, InData%IC_gen) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine MD_UnPackMisc(RF, OutData) - type(RegFile), intent(inout) :: RF - type(MD_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'MD_UnPackMisc' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%LineTypeList)) deallocate(OutData%LineTypeList) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%LineTypeList(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%LineTypeList.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackLineProp(RF, OutData%LineTypeList(i1)) ! LineTypeList - end do - end if - if (allocated(OutData%RodTypeList)) deallocate(OutData%RodTypeList) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%RodTypeList(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%RodTypeList.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackRodProp(RF, OutData%RodTypeList(i1)) ! RodTypeList - end do - end if - call MD_UnpackBody(RF, OutData%GroundBody) ! GroundBody - if (allocated(OutData%BodyList)) deallocate(OutData%BodyList) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BodyList(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BodyList.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackBody(RF, OutData%BodyList(i1)) ! BodyList - end do - end if - if (allocated(OutData%RodList)) deallocate(OutData%RodList) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%RodList(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%RodList.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackRod(RF, OutData%RodList(i1)) ! RodList - end do - end if - if (allocated(OutData%PointList)) deallocate(OutData%PointList) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%PointList(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%PointList.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + call RegPack(RF, InData%nLineTypes) + call RegPack(RF, InData%nRodTypes) + call RegPack(RF, InData%nPoints) + call RegPack(RF, InData%nPointsExtra) + call RegPack(RF, InData%nBodies) + call RegPack(RF, InData%nRods) + call RegPack(RF, InData%nLines) + call RegPack(RF, InData%nExtLds) + call RegPack(RF, InData%nCtrlChans) + call RegPack(RF, InData%nFails) + call RegPack(RF, InData%nFreeBodies) + call RegPack(RF, InData%nFreeRods) + call RegPack(RF, InData%nFreePoints) + call RegPackAlloc(RF, InData%nCpldBodies) + call RegPackAlloc(RF, InData%nCpldRods) + call RegPackAlloc(RF, InData%nCpldPoints) + call RegPack(RF, InData%NConns) + call RegPack(RF, InData%NAnchs) + call RegPack(RF, InData%Tmax) + call RegPack(RF, InData%tScheme) + call RegPack(RF, InData%g) + call RegPack(RF, InData%rhoW) + call RegPack(RF, InData%WtrDpth) + call RegPack(RF, InData%kBot) + call RegPack(RF, InData%cBot) + call RegPack(RF, InData%dtM0) + call RegPack(RF, InData%dtCoupling) + call RegPack(RF, InData%NumOuts) + call RegPack(RF, InData%dtOut) + call RegPack(RF, InData%RootName) + call RegPack(RF, allocated(InData%OutParam)) + if (allocated(InData%OutParam)) then + call RegPackBounds(RF, 1, lbound(InData%OutParam), ubound(InData%OutParam)) + LB(1:1) = lbound(InData%OutParam) + UB(1:1) = ubound(InData%OutParam) do i1 = LB(1), UB(1) - call MD_UnpackPoint(RF, OutData%PointList(i1)) ! PointList + call MD_PackOutParmType(RF, InData%OutParam(i1)) end do end if - if (allocated(OutData%LineList)) deallocate(OutData%LineList) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%LineList(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%LineList.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackLine(RF, OutData%LineList(i1)) ! LineList - end do - end if - if (allocated(OutData%ExtLdList)) deallocate(OutData%ExtLdList) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%ExtLdList(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ExtLdList.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackExtLd(RF, OutData%ExtLdList(i1)) ! ExtLdList - end do - end if - if (allocated(OutData%FailList)) deallocate(OutData%FailList) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%FailList(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%FailList.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackFail(RF, OutData%FailList(i1)) ! FailList - end do - end if - call RegUnpackAlloc(RF, OutData%FreePointIs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%CpldPointIs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%FreeRodIs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%CpldRodIs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%FreeBodyIs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%CpldBodyIs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LineStateIs1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LineStateIsN); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%PointStateIs1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%PointStateIsN); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RodStateIs1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RodStateIsN); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BodyStateIs1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BodyStateIsN); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Nx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Nxtra); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WaveTi); if (RegCheckErr(RF, RoutineName)) return - call MD_UnpackContState(RF, OutData%xTemp) ! xTemp - call MD_UnpackContState(RF, OutData%xdTemp) ! xdTemp - call MD_UnpackContState(RF, OutData%kSum) ! kSum - call RegUnpack(RF, OutData%zeros6); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%MDWrOutput); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LastOutTime); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%PtfmInit); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BathymetryGrid); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BathGrid_Xs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BathGrid_Ys); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BathGrid_npoints); if (RegCheckErr(RF, RoutineName)) return - call GridInterp_UnpackMisc(RF, OutData%WaveField_m) ! WaveField_m - call RegUnpack(RF, OutData%IC_gen); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine MD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) - type(MD_ParameterType), intent(in) :: SrcParamData - type(MD_ParameterType), intent(inout) :: DstParamData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3, i4 - integer(B4Ki) :: LB(4), UB(4) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'MD_CopyParam' - ErrStat = ErrID_None - ErrMsg = '' - DstParamData%nLineTypes = SrcParamData%nLineTypes - DstParamData%nRodTypes = SrcParamData%nRodTypes - DstParamData%nPoints = SrcParamData%nPoints - DstParamData%nPointsExtra = SrcParamData%nPointsExtra - DstParamData%nBodies = SrcParamData%nBodies - DstParamData%nRods = SrcParamData%nRods - DstParamData%nLines = SrcParamData%nLines - DstParamData%nExtLds = SrcParamData%nExtLds - DstParamData%nCtrlChans = SrcParamData%nCtrlChans - DstParamData%nFails = SrcParamData%nFails - DstParamData%nFreeBodies = SrcParamData%nFreeBodies - DstParamData%nFreeRods = SrcParamData%nFreeRods - DstParamData%nFreePoints = SrcParamData%nFreePoints - if (allocated(SrcParamData%nCpldBodies)) then - LB(1:1) = lbound(SrcParamData%nCpldBodies) - UB(1:1) = ubound(SrcParamData%nCpldBodies) - if (.not. allocated(DstParamData%nCpldBodies)) then - allocate(DstParamData%nCpldBodies(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nCpldBodies.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%nCpldBodies = SrcParamData%nCpldBodies - end if - if (allocated(SrcParamData%nCpldRods)) then - LB(1:1) = lbound(SrcParamData%nCpldRods) - UB(1:1) = ubound(SrcParamData%nCpldRods) - if (.not. allocated(DstParamData%nCpldRods)) then - allocate(DstParamData%nCpldRods(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nCpldRods.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%nCpldRods = SrcParamData%nCpldRods - end if - if (allocated(SrcParamData%nCpldPoints)) then - LB(1:1) = lbound(SrcParamData%nCpldPoints) - UB(1:1) = ubound(SrcParamData%nCpldPoints) - if (.not. allocated(DstParamData%nCpldPoints)) then - allocate(DstParamData%nCpldPoints(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%nCpldPoints.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%nCpldPoints = SrcParamData%nCpldPoints - end if - DstParamData%NConns = SrcParamData%NConns - DstParamData%NAnchs = SrcParamData%NAnchs - DstParamData%Tmax = SrcParamData%Tmax - DstParamData%tScheme = SrcParamData%tScheme - DstParamData%g = SrcParamData%g - DstParamData%rhoW = SrcParamData%rhoW - DstParamData%WtrDpth = SrcParamData%WtrDpth - DstParamData%kBot = SrcParamData%kBot - DstParamData%cBot = SrcParamData%cBot - DstParamData%dtM0 = SrcParamData%dtM0 - DstParamData%dtCoupling = SrcParamData%dtCoupling - DstParamData%NumOuts = SrcParamData%NumOuts - DstParamData%dtOut = SrcParamData%dtOut - DstParamData%RootName = SrcParamData%RootName - if (allocated(SrcParamData%OutParam)) then - LB(1:1) = lbound(SrcParamData%OutParam) - UB(1:1) = ubound(SrcParamData%OutParam) - if (.not. allocated(DstParamData%OutParam)) then - allocate(DstParamData%OutParam(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MD_CopyOutParmType(SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - DstParamData%Delim = SrcParamData%Delim - DstParamData%MDUnOut = SrcParamData%MDUnOut - DstParamData%PriPath = SrcParamData%PriPath - DstParamData%writeLog = SrcParamData%writeLog - DstParamData%UnLog = SrcParamData%UnLog - DstParamData%WaveKin = SrcParamData%WaveKin - DstParamData%Current = SrcParamData%Current - DstParamData%WaterKin = SrcParamData%WaterKin - DstParamData%WaveField => SrcParamData%WaveField - DstParamData%nTurbines = SrcParamData%nTurbines - if (allocated(SrcParamData%TurbineRefPos)) then - LB(1:2) = lbound(SrcParamData%TurbineRefPos) - UB(1:2) = ubound(SrcParamData%TurbineRefPos) - if (.not. allocated(DstParamData%TurbineRefPos)) then - allocate(DstParamData%TurbineRefPos(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TurbineRefPos.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%TurbineRefPos = SrcParamData%TurbineRefPos - end if - DstParamData%mu_kT = SrcParamData%mu_kT - DstParamData%mu_kA = SrcParamData%mu_kA - DstParamData%mc = SrcParamData%mc - DstParamData%cv = SrcParamData%cv - DstParamData%inertialF = SrcParamData%inertialF - DstParamData%inertialF_rampT = SrcParamData%inertialF_rampT - DstParamData%OutSwitch = SrcParamData%OutSwitch - DstParamData%disableOutTime = SrcParamData%disableOutTime - DstParamData%nxWave = SrcParamData%nxWave - DstParamData%nyWave = SrcParamData%nyWave - DstParamData%nzWave = SrcParamData%nzWave - DstParamData%ntWave = SrcParamData%ntWave - if (allocated(SrcParamData%pxWave)) then - LB(1:1) = lbound(SrcParamData%pxWave) - UB(1:1) = ubound(SrcParamData%pxWave) - if (.not. allocated(DstParamData%pxWave)) then - allocate(DstParamData%pxWave(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%pxWave.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%pxWave = SrcParamData%pxWave - end if - if (allocated(SrcParamData%pyWave)) then - LB(1:1) = lbound(SrcParamData%pyWave) - UB(1:1) = ubound(SrcParamData%pyWave) - if (.not. allocated(DstParamData%pyWave)) then - allocate(DstParamData%pyWave(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%pyWave.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%pyWave = SrcParamData%pyWave - end if - if (allocated(SrcParamData%pzWave)) then - LB(1:1) = lbound(SrcParamData%pzWave) - UB(1:1) = ubound(SrcParamData%pzWave) - if (.not. allocated(DstParamData%pzWave)) then - allocate(DstParamData%pzWave(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%pzWave.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%pzWave = SrcParamData%pzWave - end if - DstParamData%dtWave = SrcParamData%dtWave - if (allocated(SrcParamData%uxWave)) then - LB(1:4) = lbound(SrcParamData%uxWave) - UB(1:4) = ubound(SrcParamData%uxWave) - if (.not. allocated(DstParamData%uxWave)) then - allocate(DstParamData%uxWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uxWave.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%uxWave = SrcParamData%uxWave - end if - if (allocated(SrcParamData%uyWave)) then - LB(1:4) = lbound(SrcParamData%uyWave) - UB(1:4) = ubound(SrcParamData%uyWave) - if (.not. allocated(DstParamData%uyWave)) then - allocate(DstParamData%uyWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uyWave.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%uyWave = SrcParamData%uyWave - end if - if (allocated(SrcParamData%uzWave)) then - LB(1:4) = lbound(SrcParamData%uzWave) - UB(1:4) = ubound(SrcParamData%uzWave) - if (.not. allocated(DstParamData%uzWave)) then - allocate(DstParamData%uzWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uzWave.', ErrStat, ErrMsg, RoutineName) - return - end if + call RegPack(RF, InData%Delim) + call RegPack(RF, InData%MDUnOut) + call RegPack(RF, InData%PriPath) + call RegPack(RF, InData%writeLog) + call RegPack(RF, InData%UnLog) + call RegPack(RF, InData%WaveKin) + call RegPack(RF, InData%Current) + call RegPack(RF, InData%WaterKin) + call RegPack(RF, associated(InData%WaveField)) + if (associated(InData%WaveField)) then + call RegPackPointer(RF, c_loc(InData%WaveField), PtrInIndex) + if (.not. PtrInIndex) then + call SeaSt_WaveField_PackSeaSt_WaveFieldType(RF, InData%WaveField) end if - DstParamData%uzWave = SrcParamData%uzWave end if - if (allocated(SrcParamData%axWave)) then - LB(1:4) = lbound(SrcParamData%axWave) - UB(1:4) = ubound(SrcParamData%axWave) - if (.not. allocated(DstParamData%axWave)) then - allocate(DstParamData%axWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%axWave.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%axWave = SrcParamData%axWave + call RegPack(RF, InData%nTurbines) + call RegPackAlloc(RF, InData%TurbineRefPos) + call RegPack(RF, InData%mu_kT) + call RegPack(RF, InData%mu_kA) + call RegPack(RF, InData%mc) + call RegPack(RF, InData%cv) + call RegPack(RF, InData%inertialF) + call RegPack(RF, InData%inertialF_rampT) + call RegPack(RF, InData%OutSwitch) + call RegPack(RF, InData%disableOutTime) + call RegPack(RF, InData%nxWave) + call RegPack(RF, InData%nyWave) + call RegPack(RF, InData%nzWave) + call RegPack(RF, InData%ntWave) + call RegPackAlloc(RF, InData%pxWave) + call RegPackAlloc(RF, InData%pyWave) + call RegPackAlloc(RF, InData%pzWave) + call RegPack(RF, InData%dtWave) + call RegPackAlloc(RF, InData%uxWave) + call RegPackAlloc(RF, InData%uyWave) + call RegPackAlloc(RF, InData%uzWave) + call RegPackAlloc(RF, InData%axWave) + call RegPackAlloc(RF, InData%ayWave) + call RegPackAlloc(RF, InData%azWave) + call RegPackAlloc(RF, InData%PDyn) + call RegPackAlloc(RF, InData%zeta) + call RegPack(RF, InData%nzCurrent) + call RegPackAlloc(RF, InData%pzCurrent) + call RegPackAlloc(RF, InData%uxCurrent) + call RegPackAlloc(RF, InData%uyCurrent) + call RegPack(RF, InData%VisMeshes) + call RegPack(RF, allocated(InData%VisRodsDiam)) + if (allocated(InData%VisRodsDiam)) then + call RegPackBounds(RF, 1, lbound(InData%VisRodsDiam), ubound(InData%VisRodsDiam)) + LB(1:1) = lbound(InData%VisRodsDiam) + UB(1:1) = ubound(InData%VisRodsDiam) + do i1 = LB(1), UB(1) + call MD_PackVisDiam(RF, InData%VisRodsDiam(i1)) + end do end if - if (allocated(SrcParamData%ayWave)) then - LB(1:4) = lbound(SrcParamData%ayWave) - UB(1:4) = ubound(SrcParamData%ayWave) - if (.not. allocated(DstParamData%ayWave)) then - allocate(DstParamData%ayWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ayWave.', ErrStat, ErrMsg, RoutineName) - return - end if + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine MD_UnPackParam(RF, OutData) + type(RegFile), intent(inout) :: RF + type(MD_ParameterType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'MD_UnPackParam' + integer(B4Ki) :: i1, i2, i3, i4 + integer(B4Ki) :: LB(4), UB(4) + integer(IntKi) :: stat + logical :: IsAllocAssoc + integer(B8Ki) :: PtrIdx + type(c_ptr) :: Ptr + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%nLineTypes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nRodTypes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nPoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nPointsExtra); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nBodies); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nRods); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nLines); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nExtLds); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nCtrlChans); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nFails); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nFreeBodies); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nFreeRods); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nFreePoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%nCpldBodies); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%nCpldRods); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%nCpldPoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NConns); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NAnchs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Tmax); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%tScheme); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%g); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%rhoW); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%kBot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%cBot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%dtM0); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%dtCoupling); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%dtOut); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%OutParam)) deallocate(OutData%OutParam) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OutParam(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if - DstParamData%ayWave = SrcParamData%ayWave + do i1 = LB(1), UB(1) + call MD_UnpackOutParmType(RF, OutData%OutParam(i1)) ! OutParam + end do end if - if (allocated(SrcParamData%azWave)) then - LB(1:4) = lbound(SrcParamData%azWave) - UB(1:4) = ubound(SrcParamData%azWave) - if (.not. allocated(DstParamData%azWave)) then - allocate(DstParamData%azWave(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%azWave.', ErrStat, ErrMsg, RoutineName) + call RegUnpack(RF, OutData%Delim); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MDUnOut); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PriPath); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%writeLog); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UnLog); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WaveKin); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Current); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WaterKin); if (RegCheckErr(RF, RoutineName)) return + if (associated(OutData%WaveField)) deallocate(OutData%WaveField) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackPointer(RF, Ptr, PtrIdx); if (RegCheckErr(RF, RoutineName)) return + if (c_associated(Ptr)) then + call c_f_pointer(Ptr, OutData%WaveField) + else + allocate(OutData%WaveField,stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveField.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if + RF%Pointers(PtrIdx) = c_loc(OutData%WaveField) + call SeaSt_WaveField_UnpackSeaSt_WaveFieldType(RF, OutData%WaveField) ! WaveField end if - DstParamData%azWave = SrcParamData%azWave + else + OutData%WaveField => null() end if - if (allocated(SrcParamData%PDyn)) then - LB(1:4) = lbound(SrcParamData%PDyn) - UB(1:4) = ubound(SrcParamData%PDyn) - if (.not. allocated(DstParamData%PDyn)) then - allocate(DstParamData%PDyn(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3),LB(4):UB(4)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PDyn.', ErrStat, ErrMsg, RoutineName) - return - end if + call RegUnpack(RF, OutData%nTurbines); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TurbineRefPos); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%mu_kT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%mu_kA); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%mc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%cv); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%inertialF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%inertialF_rampT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%OutSwitch); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%disableOutTime); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nxWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nyWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nzWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ntWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%pxWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%pyWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%pzWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%dtWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%uxWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%uyWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%uzWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%axWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%ayWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%azWave); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PDyn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%zeta); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nzCurrent); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%pzCurrent); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%uxCurrent); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%uyCurrent); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VisMeshes); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%VisRodsDiam)) deallocate(OutData%VisRodsDiam) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%VisRodsDiam(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisRodsDiam.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if - DstParamData%PDyn = SrcParamData%PDyn + do i1 = LB(1), UB(1) + call MD_UnpackVisDiam(RF, OutData%VisRodsDiam(i1)) ! VisRodsDiam + end do end if - if (allocated(SrcParamData%zeta)) then - LB(1:3) = lbound(SrcParamData%zeta) - UB(1:3) = ubound(SrcParamData%zeta) - if (.not. allocated(DstParamData%zeta)) then - allocate(DstParamData%zeta(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) +end subroutine + +subroutine MD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) + type(MD_InputType), intent(inout) :: SrcInputData + type(MD_InputType), intent(inout) :: DstInputData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'MD_CopyInput' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcInputData%CoupledKinematics)) then + LB(1:1) = lbound(SrcInputData%CoupledKinematics) + UB(1:1) = ubound(SrcInputData%CoupledKinematics) + if (.not. allocated(DstInputData%CoupledKinematics)) then + allocate(DstInputData%CoupledKinematics(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%zeta.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%CoupledKinematics.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%zeta = SrcParamData%zeta + do i1 = LB(1), UB(1) + call MeshCopy(SrcInputData%CoupledKinematics(i1), DstInputData%CoupledKinematics(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - DstParamData%nzCurrent = SrcParamData%nzCurrent - if (allocated(SrcParamData%pzCurrent)) then - LB(1:1) = lbound(SrcParamData%pzCurrent) - UB(1:1) = ubound(SrcParamData%pzCurrent) - if (.not. allocated(DstParamData%pzCurrent)) then - allocate(DstParamData%pzCurrent(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInputData%DeltaL)) then + LB(1:1) = lbound(SrcInputData%DeltaL) + UB(1:1) = ubound(SrcInputData%DeltaL) + if (.not. allocated(DstInputData%DeltaL)) then + allocate(DstInputData%DeltaL(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%pzCurrent.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%DeltaL.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%pzCurrent = SrcParamData%pzCurrent + DstInputData%DeltaL = SrcInputData%DeltaL end if - if (allocated(SrcParamData%uxCurrent)) then - LB(1:1) = lbound(SrcParamData%uxCurrent) - UB(1:1) = ubound(SrcParamData%uxCurrent) - if (.not. allocated(DstParamData%uxCurrent)) then - allocate(DstParamData%uxCurrent(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInputData%DeltaLdot)) then + LB(1:1) = lbound(SrcInputData%DeltaLdot) + UB(1:1) = ubound(SrcInputData%DeltaLdot) + if (.not. allocated(DstInputData%DeltaLdot)) then + allocate(DstInputData%DeltaLdot(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uxCurrent.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%DeltaLdot.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%uxCurrent = SrcParamData%uxCurrent + DstInputData%DeltaLdot = SrcInputData%DeltaLdot end if - if (allocated(SrcParamData%uyCurrent)) then - LB(1:1) = lbound(SrcParamData%uyCurrent) - UB(1:1) = ubound(SrcParamData%uyCurrent) - if (.not. allocated(DstParamData%uyCurrent)) then - allocate(DstParamData%uyCurrent(LB(1):UB(1)), stat=ErrStat2) +end subroutine + +subroutine MD_DestroyInput(InputData, ErrStat, ErrMsg) + type(MD_InputType), intent(inout) :: InputData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'MD_DestroyInput' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(InputData%CoupledKinematics)) then + LB(1:1) = lbound(InputData%CoupledKinematics) + UB(1:1) = ubound(InputData%CoupledKinematics) + do i1 = LB(1), UB(1) + call MeshDestroy( InputData%CoupledKinematics(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(InputData%CoupledKinematics) + end if + if (allocated(InputData%DeltaL)) then + deallocate(InputData%DeltaL) + end if + if (allocated(InputData%DeltaLdot)) then + deallocate(InputData%DeltaLdot) + end if +end subroutine + +subroutine MD_PackInput(RF, Indata) + type(RegFile), intent(inout) :: RF + type(MD_InputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'MD_PackInput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%CoupledKinematics)) + if (allocated(InData%CoupledKinematics)) then + call RegPackBounds(RF, 1, lbound(InData%CoupledKinematics), ubound(InData%CoupledKinematics)) + LB(1:1) = lbound(InData%CoupledKinematics) + UB(1:1) = ubound(InData%CoupledKinematics) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%CoupledKinematics(i1)) + end do + end if + call RegPackAlloc(RF, InData%DeltaL) + call RegPackAlloc(RF, InData%DeltaLdot) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine MD_UnPackInput(RF, OutData) + type(RegFile), intent(inout) :: RF + type(MD_InputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'MD_UnPackInput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%CoupledKinematics)) deallocate(OutData%CoupledKinematics) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%CoupledKinematics(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%CoupledKinematics.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%CoupledKinematics(i1)) ! CoupledKinematics + end do + end if + call RegUnpackAlloc(RF, OutData%DeltaL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%DeltaLdot); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine MD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) + type(MD_OutputType), intent(inout) :: SrcOutputData + type(MD_OutputType), intent(inout) :: DstOutputData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'MD_CopyOutput' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcOutputData%CoupledLoads)) then + LB(1:1) = lbound(SrcOutputData%CoupledLoads) + UB(1:1) = ubound(SrcOutputData%CoupledLoads) + if (.not. allocated(DstOutputData%CoupledLoads)) then + allocate(DstOutputData%CoupledLoads(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%uyCurrent.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%CoupledLoads.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%uyCurrent = SrcParamData%uyCurrent + do i1 = LB(1), UB(1) + call MeshCopy(SrcOutputData%CoupledLoads(i1), DstOutputData%CoupledLoads(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - DstParamData%Nx0 = SrcParamData%Nx0 - if (allocated(SrcParamData%Jac_u_indx)) then - LB(1:2) = lbound(SrcParamData%Jac_u_indx) - UB(1:2) = ubound(SrcParamData%Jac_u_indx) - if (.not. allocated(DstParamData%Jac_u_indx)) then - allocate(DstParamData%Jac_u_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcOutputData%WriteOutput)) then + LB(1:1) = lbound(SrcOutputData%WriteOutput) + UB(1:1) = ubound(SrcOutputData%WriteOutput) + if (.not. allocated(DstOutputData%WriteOutput)) then + allocate(DstOutputData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_u_indx.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%Jac_u_indx = SrcParamData%Jac_u_indx + DstOutputData%WriteOutput = SrcOutputData%WriteOutput end if - if (allocated(SrcParamData%du)) then - LB(1:1) = lbound(SrcParamData%du) - UB(1:1) = ubound(SrcParamData%du) - if (.not. allocated(DstParamData%du)) then - allocate(DstParamData%du(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%VisLinesMesh)) then + LB(1:1) = lbound(SrcOutputData%VisLinesMesh) + UB(1:1) = ubound(SrcOutputData%VisLinesMesh) + if (.not. allocated(DstOutputData%VisLinesMesh)) then + allocate(DstOutputData%VisLinesMesh(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%du.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%VisLinesMesh.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%du = SrcParamData%du + do i1 = LB(1), UB(1) + call MeshCopy(SrcOutputData%VisLinesMesh(i1), DstOutputData%VisLinesMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcParamData%dx)) then - LB(1:1) = lbound(SrcParamData%dx) - UB(1:1) = ubound(SrcParamData%dx) - if (.not. allocated(DstParamData%dx)) then - allocate(DstParamData%dx(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%VisRodsMesh)) then + LB(1:1) = lbound(SrcOutputData%VisRodsMesh) + UB(1:1) = ubound(SrcOutputData%VisRodsMesh) + if (.not. allocated(DstOutputData%VisRodsMesh)) then + allocate(DstOutputData%VisRodsMesh(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%dx.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%VisRodsMesh.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%dx = SrcParamData%dx + do i1 = LB(1), UB(1) + call MeshCopy(SrcOutputData%VisRodsMesh(i1), DstOutputData%VisRodsMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - DstParamData%Jac_ny = SrcParamData%Jac_ny - DstParamData%Jac_nx = SrcParamData%Jac_nx - if (allocated(SrcParamData%dxIdx_map2_xStateIdx)) then - LB(1:1) = lbound(SrcParamData%dxIdx_map2_xStateIdx) - UB(1:1) = ubound(SrcParamData%dxIdx_map2_xStateIdx) - if (.not. allocated(DstParamData%dxIdx_map2_xStateIdx)) then - allocate(DstParamData%dxIdx_map2_xStateIdx(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%VisBodiesMesh)) then + LB(1:1) = lbound(SrcOutputData%VisBodiesMesh) + UB(1:1) = ubound(SrcOutputData%VisBodiesMesh) + if (.not. allocated(DstOutputData%VisBodiesMesh)) then + allocate(DstOutputData%VisBodiesMesh(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%dxIdx_map2_xStateIdx.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%VisBodiesMesh.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%dxIdx_map2_xStateIdx = SrcParamData%dxIdx_map2_xStateIdx + do i1 = LB(1), UB(1) + call MeshCopy(SrcOutputData%VisBodiesMesh(i1), DstOutputData%VisBodiesMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - DstParamData%VisMeshes = SrcParamData%VisMeshes - if (allocated(SrcParamData%VisRodsDiam)) then - LB(1:1) = lbound(SrcParamData%VisRodsDiam) - UB(1:1) = ubound(SrcParamData%VisRodsDiam) - if (.not. allocated(DstParamData%VisRodsDiam)) then - allocate(DstParamData%VisRodsDiam(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%VisAnchsMesh)) then + LB(1:1) = lbound(SrcOutputData%VisAnchsMesh) + UB(1:1) = ubound(SrcOutputData%VisAnchsMesh) + if (.not. allocated(DstOutputData%VisAnchsMesh)) then + allocate(DstOutputData%VisAnchsMesh(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%VisRodsDiam.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%VisAnchsMesh.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MD_CopyVisDiam(SrcParamData%VisRodsDiam(i1), DstParamData%VisRodsDiam(i1), CtrlCode, ErrStat2, ErrMsg2) + call MeshCopy(SrcOutputData%VisAnchsMesh(i1), DstOutputData%VisAnchsMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if end subroutine -subroutine MD_DestroyParam(ParamData, ErrStat, ErrMsg) - type(MD_ParameterType), intent(inout) :: ParamData +subroutine MD_DestroyOutput(OutputData, ErrStat, ErrMsg) + type(MD_OutputType), intent(inout) :: OutputData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3, i4 - integer(B4Ki) :: LB(4), UB(4) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'MD_DestroyParam' + character(*), parameter :: RoutineName = 'MD_DestroyOutput' ErrStat = ErrID_None ErrMsg = '' - if (allocated(ParamData%nCpldBodies)) then - deallocate(ParamData%nCpldBodies) - end if - if (allocated(ParamData%nCpldRods)) then - deallocate(ParamData%nCpldRods) - end if - if (allocated(ParamData%nCpldPoints)) then - deallocate(ParamData%nCpldPoints) - end if - if (allocated(ParamData%OutParam)) then - LB(1:1) = lbound(ParamData%OutParam) - UB(1:1) = ubound(ParamData%OutParam) + if (allocated(OutputData%CoupledLoads)) then + LB(1:1) = lbound(OutputData%CoupledLoads) + UB(1:1) = ubound(OutputData%CoupledLoads) do i1 = LB(1), UB(1) - call MD_DestroyOutParmType(ParamData%OutParam(i1), ErrStat2, ErrMsg2) + call MeshDestroy( OutputData%CoupledLoads(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ParamData%OutParam) - end if - nullify(ParamData%WaveField) - if (allocated(ParamData%TurbineRefPos)) then - deallocate(ParamData%TurbineRefPos) - end if - if (allocated(ParamData%pxWave)) then - deallocate(ParamData%pxWave) - end if - if (allocated(ParamData%pyWave)) then - deallocate(ParamData%pyWave) - end if - if (allocated(ParamData%pzWave)) then - deallocate(ParamData%pzWave) - end if - if (allocated(ParamData%uxWave)) then - deallocate(ParamData%uxWave) - end if - if (allocated(ParamData%uyWave)) then - deallocate(ParamData%uyWave) - end if - if (allocated(ParamData%uzWave)) then - deallocate(ParamData%uzWave) - end if - if (allocated(ParamData%axWave)) then - deallocate(ParamData%axWave) - end if - if (allocated(ParamData%ayWave)) then - deallocate(ParamData%ayWave) - end if - if (allocated(ParamData%azWave)) then - deallocate(ParamData%azWave) - end if - if (allocated(ParamData%PDyn)) then - deallocate(ParamData%PDyn) - end if - if (allocated(ParamData%zeta)) then - deallocate(ParamData%zeta) - end if - if (allocated(ParamData%pzCurrent)) then - deallocate(ParamData%pzCurrent) - end if - if (allocated(ParamData%uxCurrent)) then - deallocate(ParamData%uxCurrent) - end if - if (allocated(ParamData%uyCurrent)) then - deallocate(ParamData%uyCurrent) + deallocate(OutputData%CoupledLoads) end if - if (allocated(ParamData%Jac_u_indx)) then - deallocate(ParamData%Jac_u_indx) + if (allocated(OutputData%WriteOutput)) then + deallocate(OutputData%WriteOutput) end if - if (allocated(ParamData%du)) then - deallocate(ParamData%du) + if (allocated(OutputData%VisLinesMesh)) then + LB(1:1) = lbound(OutputData%VisLinesMesh) + UB(1:1) = ubound(OutputData%VisLinesMesh) + do i1 = LB(1), UB(1) + call MeshDestroy( OutputData%VisLinesMesh(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(OutputData%VisLinesMesh) end if - if (allocated(ParamData%dx)) then - deallocate(ParamData%dx) + if (allocated(OutputData%VisRodsMesh)) then + LB(1:1) = lbound(OutputData%VisRodsMesh) + UB(1:1) = ubound(OutputData%VisRodsMesh) + do i1 = LB(1), UB(1) + call MeshDestroy( OutputData%VisRodsMesh(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(OutputData%VisRodsMesh) end if - if (allocated(ParamData%dxIdx_map2_xStateIdx)) then - deallocate(ParamData%dxIdx_map2_xStateIdx) + if (allocated(OutputData%VisBodiesMesh)) then + LB(1:1) = lbound(OutputData%VisBodiesMesh) + UB(1:1) = ubound(OutputData%VisBodiesMesh) + do i1 = LB(1), UB(1) + call MeshDestroy( OutputData%VisBodiesMesh(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(OutputData%VisBodiesMesh) end if - if (allocated(ParamData%VisRodsDiam)) then - LB(1:1) = lbound(ParamData%VisRodsDiam) - UB(1:1) = ubound(ParamData%VisRodsDiam) + if (allocated(OutputData%VisAnchsMesh)) then + LB(1:1) = lbound(OutputData%VisAnchsMesh) + UB(1:1) = ubound(OutputData%VisAnchsMesh) do i1 = LB(1), UB(1) - call MD_DestroyVisDiam(ParamData%VisRodsDiam(i1), ErrStat2, ErrMsg2) + call MeshDestroy( OutputData%VisAnchsMesh(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ParamData%VisRodsDiam) + deallocate(OutputData%VisAnchsMesh) end if end subroutine -subroutine MD_PackParam(RF, Indata) +subroutine MD_PackOutput(RF, Indata) type(RegFile), intent(inout) :: RF - type(MD_ParameterType), intent(in) :: InData - character(*), parameter :: RoutineName = 'MD_PackParam' - integer(B4Ki) :: i1, i2, i3, i4 - integer(B4Ki) :: LB(4), UB(4) - logical :: PtrInIndex + type(MD_OutputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'MD_PackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%nLineTypes) - call RegPack(RF, InData%nRodTypes) - call RegPack(RF, InData%nPoints) - call RegPack(RF, InData%nPointsExtra) - call RegPack(RF, InData%nBodies) - call RegPack(RF, InData%nRods) - call RegPack(RF, InData%nLines) - call RegPack(RF, InData%nExtLds) - call RegPack(RF, InData%nCtrlChans) - call RegPack(RF, InData%nFails) - call RegPack(RF, InData%nFreeBodies) - call RegPack(RF, InData%nFreeRods) - call RegPack(RF, InData%nFreePoints) - call RegPackAlloc(RF, InData%nCpldBodies) - call RegPackAlloc(RF, InData%nCpldRods) - call RegPackAlloc(RF, InData%nCpldPoints) - call RegPack(RF, InData%NConns) - call RegPack(RF, InData%NAnchs) - call RegPack(RF, InData%Tmax) - call RegPack(RF, InData%tScheme) - call RegPack(RF, InData%g) - call RegPack(RF, InData%rhoW) - call RegPack(RF, InData%WtrDpth) - call RegPack(RF, InData%kBot) - call RegPack(RF, InData%cBot) - call RegPack(RF, InData%dtM0) - call RegPack(RF, InData%dtCoupling) - call RegPack(RF, InData%NumOuts) - call RegPack(RF, InData%dtOut) - call RegPack(RF, InData%RootName) - call RegPack(RF, allocated(InData%OutParam)) - if (allocated(InData%OutParam)) then - call RegPackBounds(RF, 1, lbound(InData%OutParam), ubound(InData%OutParam)) - LB(1:1) = lbound(InData%OutParam) - UB(1:1) = ubound(InData%OutParam) + call RegPack(RF, allocated(InData%CoupledLoads)) + if (allocated(InData%CoupledLoads)) then + call RegPackBounds(RF, 1, lbound(InData%CoupledLoads), ubound(InData%CoupledLoads)) + LB(1:1) = lbound(InData%CoupledLoads) + UB(1:1) = ubound(InData%CoupledLoads) do i1 = LB(1), UB(1) - call MD_PackOutParmType(RF, InData%OutParam(i1)) + call MeshPack(RF, InData%CoupledLoads(i1)) end do end if - call RegPack(RF, InData%Delim) - call RegPack(RF, InData%MDUnOut) - call RegPack(RF, InData%PriPath) - call RegPack(RF, InData%writeLog) - call RegPack(RF, InData%UnLog) - call RegPack(RF, InData%WaveKin) - call RegPack(RF, InData%Current) - call RegPack(RF, InData%WaterKin) - call RegPack(RF, associated(InData%WaveField)) - if (associated(InData%WaveField)) then - call RegPackPointer(RF, c_loc(InData%WaveField), PtrInIndex) - if (.not. PtrInIndex) then - call SeaSt_WaveField_PackSeaSt_WaveFieldType(RF, InData%WaveField) - end if + call RegPackAlloc(RF, InData%WriteOutput) + call RegPack(RF, allocated(InData%VisLinesMesh)) + if (allocated(InData%VisLinesMesh)) then + call RegPackBounds(RF, 1, lbound(InData%VisLinesMesh), ubound(InData%VisLinesMesh)) + LB(1:1) = lbound(InData%VisLinesMesh) + UB(1:1) = ubound(InData%VisLinesMesh) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%VisLinesMesh(i1)) + end do end if - call RegPack(RF, InData%nTurbines) - call RegPackAlloc(RF, InData%TurbineRefPos) - call RegPack(RF, InData%mu_kT) - call RegPack(RF, InData%mu_kA) - call RegPack(RF, InData%mc) - call RegPack(RF, InData%cv) - call RegPack(RF, InData%inertialF) - call RegPack(RF, InData%inertialF_rampT) - call RegPack(RF, InData%OutSwitch) - call RegPack(RF, InData%disableOutTime) - call RegPack(RF, InData%nxWave) - call RegPack(RF, InData%nyWave) - call RegPack(RF, InData%nzWave) - call RegPack(RF, InData%ntWave) - call RegPackAlloc(RF, InData%pxWave) - call RegPackAlloc(RF, InData%pyWave) - call RegPackAlloc(RF, InData%pzWave) - call RegPack(RF, InData%dtWave) - call RegPackAlloc(RF, InData%uxWave) - call RegPackAlloc(RF, InData%uyWave) - call RegPackAlloc(RF, InData%uzWave) - call RegPackAlloc(RF, InData%axWave) - call RegPackAlloc(RF, InData%ayWave) - call RegPackAlloc(RF, InData%azWave) - call RegPackAlloc(RF, InData%PDyn) - call RegPackAlloc(RF, InData%zeta) - call RegPack(RF, InData%nzCurrent) - call RegPackAlloc(RF, InData%pzCurrent) - call RegPackAlloc(RF, InData%uxCurrent) - call RegPackAlloc(RF, InData%uyCurrent) - call RegPack(RF, InData%Nx0) - call RegPackAlloc(RF, InData%Jac_u_indx) - call RegPackAlloc(RF, InData%du) - call RegPackAlloc(RF, InData%dx) - call RegPack(RF, InData%Jac_ny) - call RegPack(RF, InData%Jac_nx) - call RegPackAlloc(RF, InData%dxIdx_map2_xStateIdx) - call RegPack(RF, InData%VisMeshes) - call RegPack(RF, allocated(InData%VisRodsDiam)) - if (allocated(InData%VisRodsDiam)) then - call RegPackBounds(RF, 1, lbound(InData%VisRodsDiam), ubound(InData%VisRodsDiam)) - LB(1:1) = lbound(InData%VisRodsDiam) - UB(1:1) = ubound(InData%VisRodsDiam) + call RegPack(RF, allocated(InData%VisRodsMesh)) + if (allocated(InData%VisRodsMesh)) then + call RegPackBounds(RF, 1, lbound(InData%VisRodsMesh), ubound(InData%VisRodsMesh)) + LB(1:1) = lbound(InData%VisRodsMesh) + UB(1:1) = ubound(InData%VisRodsMesh) do i1 = LB(1), UB(1) - call MD_PackVisDiam(RF, InData%VisRodsDiam(i1)) + call MeshPack(RF, InData%VisRodsMesh(i1)) + end do + end if + call RegPack(RF, allocated(InData%VisBodiesMesh)) + if (allocated(InData%VisBodiesMesh)) then + call RegPackBounds(RF, 1, lbound(InData%VisBodiesMesh), ubound(InData%VisBodiesMesh)) + LB(1:1) = lbound(InData%VisBodiesMesh) + UB(1:1) = ubound(InData%VisBodiesMesh) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%VisBodiesMesh(i1)) + end do + end if + call RegPack(RF, allocated(InData%VisAnchsMesh)) + if (allocated(InData%VisAnchsMesh)) then + call RegPackBounds(RF, 1, lbound(InData%VisAnchsMesh), ubound(InData%VisAnchsMesh)) + LB(1:1) = lbound(InData%VisAnchsMesh) + UB(1:1) = ubound(InData%VisAnchsMesh) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%VisAnchsMesh(i1)) end do end if if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine MD_UnPackParam(RF, OutData) +subroutine MD_UnPackOutput(RF, OutData) type(RegFile), intent(inout) :: RF - type(MD_ParameterType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'MD_UnPackParam' - integer(B4Ki) :: i1, i2, i3, i4 - integer(B4Ki) :: LB(4), UB(4) + type(MD_OutputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'MD_UnPackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc - integer(B8Ki) :: PtrIdx - type(c_ptr) :: Ptr if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%nLineTypes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nRodTypes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nPoints); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nPointsExtra); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nBodies); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nRods); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nLines); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nExtLds); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nCtrlChans); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nFails); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nFreeBodies); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nFreeRods); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nFreePoints); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%nCpldBodies); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%nCpldRods); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%nCpldPoints); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NConns); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NAnchs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Tmax); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%tScheme); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%g); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%rhoW); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%kBot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%cBot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dtM0); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dtCoupling); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dtOut); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%OutParam)) deallocate(OutData%OutParam) + if (allocated(OutData%CoupledLoads)) deallocate(OutData%CoupledLoads) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OutParam(LB(1):UB(1)),stat=stat) + allocate(OutData%CoupledLoads(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%CoupledLoads.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MD_UnpackOutParmType(RF, OutData%OutParam(i1)) ! OutParam + call MeshUnpack(RF, OutData%CoupledLoads(i1)) ! CoupledLoads end do end if - call RegUnpack(RF, OutData%Delim); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%MDUnOut); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%PriPath); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%writeLog); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UnLog); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WaveKin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Current); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WaterKin); if (RegCheckErr(RF, RoutineName)) return - if (associated(OutData%WaveField)) deallocate(OutData%WaveField) + call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%VisLinesMesh)) deallocate(OutData%VisLinesMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then - call RegUnpackPointer(RF, Ptr, PtrIdx); if (RegCheckErr(RF, RoutineName)) return - if (c_associated(Ptr)) then - call c_f_pointer(Ptr, OutData%WaveField) - else - allocate(OutData%WaveField,stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%WaveField.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - RF%Pointers(PtrIdx) = c_loc(OutData%WaveField) - call SeaSt_WaveField_UnpackSeaSt_WaveFieldType(RF, OutData%WaveField) ! WaveField + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%VisLinesMesh(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisLinesMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%VisLinesMesh(i1)) ! VisLinesMesh + end do + end if + if (allocated(OutData%VisRodsMesh)) deallocate(OutData%VisRodsMesh) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%VisRodsMesh(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisRodsMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%VisRodsMesh(i1)) ! VisRodsMesh + end do + end if + if (allocated(OutData%VisBodiesMesh)) deallocate(OutData%VisBodiesMesh) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%VisBodiesMesh(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisBodiesMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if - else - OutData%WaveField => null() + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%VisBodiesMesh(i1)) ! VisBodiesMesh + end do end if - call RegUnpack(RF, OutData%nTurbines); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TurbineRefPos); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%mu_kT); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%mu_kA); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%mc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%cv); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%inertialF); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%inertialF_rampT); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%OutSwitch); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%disableOutTime); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nxWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nyWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nzWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ntWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%pxWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%pyWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%pzWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dtWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%uxWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%uyWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%uzWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%axWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%ayWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%azWave); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%PDyn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%zeta); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nzCurrent); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%pzCurrent); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%uxCurrent); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%uyCurrent); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Nx0); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_u_indx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_nx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dxIdx_map2_xStateIdx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VisMeshes); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%VisRodsDiam)) deallocate(OutData%VisRodsDiam) + if (allocated(OutData%VisAnchsMesh)) deallocate(OutData%VisAnchsMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%VisRodsDiam(LB(1):UB(1)),stat=stat) + allocate(OutData%VisAnchsMesh(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisRodsDiam.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisAnchsMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MD_UnpackVisDiam(RF, OutData%VisRodsDiam(i1)) ! VisRodsDiam + call MeshUnpack(RF, OutData%VisAnchsMesh(i1)) ! VisAnchsMesh end do end if end subroutine -subroutine MD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) - type(MD_InputType), intent(inout) :: SrcInputData - type(MD_InputType), intent(inout) :: DstInputData +subroutine MD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(MD_MiscVarType), intent(inout) :: SrcMiscData + type(MD_MiscVarType), intent(inout) :: DstMiscData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'MD_CopyInput' + character(*), parameter :: RoutineName = 'MD_CopyMisc' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcInputData%CoupledKinematics)) then - LB(1:1) = lbound(SrcInputData%CoupledKinematics) - UB(1:1) = ubound(SrcInputData%CoupledKinematics) - if (.not. allocated(DstInputData%CoupledKinematics)) then - allocate(DstInputData%CoupledKinematics(LB(1):UB(1)), stat=ErrStat2) + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MD_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MD_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MD_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MD_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcMiscData%LineTypeList)) then + LB(1:1) = lbound(SrcMiscData%LineTypeList) + UB(1:1) = ubound(SrcMiscData%LineTypeList) + if (.not. allocated(DstMiscData%LineTypeList)) then + allocate(DstMiscData%LineTypeList(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%LineTypeList.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MD_CopyLineProp(SrcMiscData%LineTypeList(i1), DstMiscData%LineTypeList(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%RodTypeList)) then + LB(1:1) = lbound(SrcMiscData%RodTypeList) + UB(1:1) = ubound(SrcMiscData%RodTypeList) + if (.not. allocated(DstMiscData%RodTypeList)) then + allocate(DstMiscData%RodTypeList(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%RodTypeList.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MD_CopyRodProp(SrcMiscData%RodTypeList(i1), DstMiscData%RodTypeList(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call MD_CopyBody(SrcMiscData%GroundBody, DstMiscData%GroundBody, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcMiscData%BodyList)) then + LB(1:1) = lbound(SrcMiscData%BodyList) + UB(1:1) = ubound(SrcMiscData%BodyList) + if (.not. allocated(DstMiscData%BodyList)) then + allocate(DstMiscData%BodyList(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BodyList.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MD_CopyBody(SrcMiscData%BodyList(i1), DstMiscData%BodyList(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%RodList)) then + LB(1:1) = lbound(SrcMiscData%RodList) + UB(1:1) = ubound(SrcMiscData%RodList) + if (.not. allocated(DstMiscData%RodList)) then + allocate(DstMiscData%RodList(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%RodList.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MD_CopyRod(SrcMiscData%RodList(i1), DstMiscData%RodList(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%PointList)) then + LB(1:1) = lbound(SrcMiscData%PointList) + UB(1:1) = ubound(SrcMiscData%PointList) + if (.not. allocated(DstMiscData%PointList)) then + allocate(DstMiscData%PointList(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%PointList.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MD_CopyPoint(SrcMiscData%PointList(i1), DstMiscData%PointList(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%LineList)) then + LB(1:1) = lbound(SrcMiscData%LineList) + UB(1:1) = ubound(SrcMiscData%LineList) + if (.not. allocated(DstMiscData%LineList)) then + allocate(DstMiscData%LineList(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%LineList.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MD_CopyLine(SrcMiscData%LineList(i1), DstMiscData%LineList(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%ExtLdList)) then + LB(1:1) = lbound(SrcMiscData%ExtLdList) + UB(1:1) = ubound(SrcMiscData%ExtLdList) + if (.not. allocated(DstMiscData%ExtLdList)) then + allocate(DstMiscData%ExtLdList(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%ExtLdList.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MD_CopyExtLd(SrcMiscData%ExtLdList(i1), DstMiscData%ExtLdList(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%FailList)) then + LB(1:1) = lbound(SrcMiscData%FailList) + UB(1:1) = ubound(SrcMiscData%FailList) + if (.not. allocated(DstMiscData%FailList)) then + allocate(DstMiscData%FailList(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FailList.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MD_CopyFail(SrcMiscData%FailList(i1), DstMiscData%FailList(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%FreePointIs)) then + LB(1:1) = lbound(SrcMiscData%FreePointIs) + UB(1:1) = ubound(SrcMiscData%FreePointIs) + if (.not. allocated(DstMiscData%FreePointIs)) then + allocate(DstMiscData%FreePointIs(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FreePointIs.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%FreePointIs = SrcMiscData%FreePointIs + end if + if (allocated(SrcMiscData%CpldPointIs)) then + LB(1:2) = lbound(SrcMiscData%CpldPointIs) + UB(1:2) = ubound(SrcMiscData%CpldPointIs) + if (.not. allocated(DstMiscData%CpldPointIs)) then + allocate(DstMiscData%CpldPointIs(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%CpldPointIs.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%CpldPointIs = SrcMiscData%CpldPointIs + end if + if (allocated(SrcMiscData%FreeRodIs)) then + LB(1:1) = lbound(SrcMiscData%FreeRodIs) + UB(1:1) = ubound(SrcMiscData%FreeRodIs) + if (.not. allocated(DstMiscData%FreeRodIs)) then + allocate(DstMiscData%FreeRodIs(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FreeRodIs.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%FreeRodIs = SrcMiscData%FreeRodIs + end if + if (allocated(SrcMiscData%CpldRodIs)) then + LB(1:2) = lbound(SrcMiscData%CpldRodIs) + UB(1:2) = ubound(SrcMiscData%CpldRodIs) + if (.not. allocated(DstMiscData%CpldRodIs)) then + allocate(DstMiscData%CpldRodIs(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%CpldRodIs.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%CpldRodIs = SrcMiscData%CpldRodIs + end if + if (allocated(SrcMiscData%FreeBodyIs)) then + LB(1:1) = lbound(SrcMiscData%FreeBodyIs) + UB(1:1) = ubound(SrcMiscData%FreeBodyIs) + if (.not. allocated(DstMiscData%FreeBodyIs)) then + allocate(DstMiscData%FreeBodyIs(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%CoupledKinematics.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FreeBodyIs.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcInputData%CoupledKinematics(i1), DstInputData%CoupledKinematics(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstMiscData%FreeBodyIs = SrcMiscData%FreeBodyIs end if - if (allocated(SrcInputData%DeltaL)) then - LB(1:1) = lbound(SrcInputData%DeltaL) - UB(1:1) = ubound(SrcInputData%DeltaL) - if (.not. allocated(DstInputData%DeltaL)) then - allocate(DstInputData%DeltaL(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%CpldBodyIs)) then + LB(1:2) = lbound(SrcMiscData%CpldBodyIs) + UB(1:2) = ubound(SrcMiscData%CpldBodyIs) + if (.not. allocated(DstMiscData%CpldBodyIs)) then + allocate(DstMiscData%CpldBodyIs(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%DeltaL.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%CpldBodyIs.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInputData%DeltaL = SrcInputData%DeltaL + DstMiscData%CpldBodyIs = SrcMiscData%CpldBodyIs end if - if (allocated(SrcInputData%DeltaLdot)) then - LB(1:1) = lbound(SrcInputData%DeltaLdot) - UB(1:1) = ubound(SrcInputData%DeltaLdot) - if (.not. allocated(DstInputData%DeltaLdot)) then - allocate(DstInputData%DeltaLdot(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%LineStateIs1)) then + LB(1:1) = lbound(SrcMiscData%LineStateIs1) + UB(1:1) = ubound(SrcMiscData%LineStateIs1) + if (.not. allocated(DstMiscData%LineStateIs1)) then + allocate(DstMiscData%LineStateIs1(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%DeltaLdot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%LineStateIs1.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInputData%DeltaLdot = SrcInputData%DeltaLdot + DstMiscData%LineStateIs1 = SrcMiscData%LineStateIs1 end if -end subroutine - -subroutine MD_DestroyInput(InputData, ErrStat, ErrMsg) - type(MD_InputType), intent(inout) :: InputData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'MD_DestroyInput' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(InputData%CoupledKinematics)) then - LB(1:1) = lbound(InputData%CoupledKinematics) - UB(1:1) = ubound(InputData%CoupledKinematics) - do i1 = LB(1), UB(1) - call MeshDestroy( InputData%CoupledKinematics(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(InputData%CoupledKinematics) + if (allocated(SrcMiscData%LineStateIsN)) then + LB(1:1) = lbound(SrcMiscData%LineStateIsN) + UB(1:1) = ubound(SrcMiscData%LineStateIsN) + if (.not. allocated(DstMiscData%LineStateIsN)) then + allocate(DstMiscData%LineStateIsN(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%LineStateIsN.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%LineStateIsN = SrcMiscData%LineStateIsN end if - if (allocated(InputData%DeltaL)) then - deallocate(InputData%DeltaL) + if (allocated(SrcMiscData%PointStateIs1)) then + LB(1:1) = lbound(SrcMiscData%PointStateIs1) + UB(1:1) = ubound(SrcMiscData%PointStateIs1) + if (.not. allocated(DstMiscData%PointStateIs1)) then + allocate(DstMiscData%PointStateIs1(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%PointStateIs1.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%PointStateIs1 = SrcMiscData%PointStateIs1 end if - if (allocated(InputData%DeltaLdot)) then - deallocate(InputData%DeltaLdot) + if (allocated(SrcMiscData%PointStateIsN)) then + LB(1:1) = lbound(SrcMiscData%PointStateIsN) + UB(1:1) = ubound(SrcMiscData%PointStateIsN) + if (.not. allocated(DstMiscData%PointStateIsN)) then + allocate(DstMiscData%PointStateIsN(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%PointStateIsN.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%PointStateIsN = SrcMiscData%PointStateIsN end if -end subroutine - -subroutine MD_PackInput(RF, Indata) - type(RegFile), intent(inout) :: RF - type(MD_InputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'MD_PackInput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%CoupledKinematics)) - if (allocated(InData%CoupledKinematics)) then - call RegPackBounds(RF, 1, lbound(InData%CoupledKinematics), ubound(InData%CoupledKinematics)) - LB(1:1) = lbound(InData%CoupledKinematics) - UB(1:1) = ubound(InData%CoupledKinematics) - do i1 = LB(1), UB(1) - call MeshPack(RF, InData%CoupledKinematics(i1)) - end do + if (allocated(SrcMiscData%RodStateIs1)) then + LB(1:1) = lbound(SrcMiscData%RodStateIs1) + UB(1:1) = ubound(SrcMiscData%RodStateIs1) + if (.not. allocated(DstMiscData%RodStateIs1)) then + allocate(DstMiscData%RodStateIs1(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%RodStateIs1.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%RodStateIs1 = SrcMiscData%RodStateIs1 end if - call RegPackAlloc(RF, InData%DeltaL) - call RegPackAlloc(RF, InData%DeltaLdot) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine MD_UnPackInput(RF, OutData) - type(RegFile), intent(inout) :: RF - type(MD_InputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'MD_UnPackInput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%CoupledKinematics)) deallocate(OutData%CoupledKinematics) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%CoupledKinematics(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%CoupledKinematics.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcMiscData%RodStateIsN)) then + LB(1:1) = lbound(SrcMiscData%RodStateIsN) + UB(1:1) = ubound(SrcMiscData%RodStateIsN) + if (.not. allocated(DstMiscData%RodStateIsN)) then + allocate(DstMiscData%RodStateIsN(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%RodStateIsN.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%CoupledKinematics(i1)) ! CoupledKinematics - end do + DstMiscData%RodStateIsN = SrcMiscData%RodStateIsN end if - call RegUnpackAlloc(RF, OutData%DeltaL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DeltaLdot); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine MD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) - type(MD_OutputType), intent(inout) :: SrcOutputData - type(MD_OutputType), intent(inout) :: DstOutputData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'MD_CopyOutput' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcOutputData%CoupledLoads)) then - LB(1:1) = lbound(SrcOutputData%CoupledLoads) - UB(1:1) = ubound(SrcOutputData%CoupledLoads) - if (.not. allocated(DstOutputData%CoupledLoads)) then - allocate(DstOutputData%CoupledLoads(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%BodyStateIs1)) then + LB(1:1) = lbound(SrcMiscData%BodyStateIs1) + UB(1:1) = ubound(SrcMiscData%BodyStateIs1) + if (.not. allocated(DstMiscData%BodyStateIs1)) then + allocate(DstMiscData%BodyStateIs1(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%CoupledLoads.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BodyStateIs1.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%CoupledLoads(i1), DstOutputData%CoupledLoads(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstMiscData%BodyStateIs1 = SrcMiscData%BodyStateIs1 end if - if (allocated(SrcOutputData%WriteOutput)) then - LB(1:1) = lbound(SrcOutputData%WriteOutput) - UB(1:1) = ubound(SrcOutputData%WriteOutput) - if (.not. allocated(DstOutputData%WriteOutput)) then - allocate(DstOutputData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%BodyStateIsN)) then + LB(1:1) = lbound(SrcMiscData%BodyStateIsN) + UB(1:1) = ubound(SrcMiscData%BodyStateIsN) + if (.not. allocated(DstMiscData%BodyStateIsN)) then + allocate(DstMiscData%BodyStateIsN(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BodyStateIsN.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOutputData%WriteOutput = SrcOutputData%WriteOutput + DstMiscData%BodyStateIsN = SrcMiscData%BodyStateIsN end if - if (allocated(SrcOutputData%VisLinesMesh)) then - LB(1:1) = lbound(SrcOutputData%VisLinesMesh) - UB(1:1) = ubound(SrcOutputData%VisLinesMesh) - if (.not. allocated(DstOutputData%VisLinesMesh)) then - allocate(DstOutputData%VisLinesMesh(LB(1):UB(1)), stat=ErrStat2) + DstMiscData%Nx = SrcMiscData%Nx + DstMiscData%Nxtra = SrcMiscData%Nxtra + DstMiscData%WaveTi = SrcMiscData%WaveTi + call MD_CopyContState(SrcMiscData%xTemp, DstMiscData%xTemp, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MD_CopyContState(SrcMiscData%xdTemp, DstMiscData%xdTemp, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MD_CopyContState(SrcMiscData%kSum, DstMiscData%kSum, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstMiscData%zeros6 = SrcMiscData%zeros6 + if (allocated(SrcMiscData%MDWrOutput)) then + LB(1:1) = lbound(SrcMiscData%MDWrOutput) + UB(1:1) = ubound(SrcMiscData%MDWrOutput) + if (.not. allocated(DstMiscData%MDWrOutput)) then + allocate(DstMiscData%MDWrOutput(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%VisLinesMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%MDWrOutput.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%VisLinesMesh(i1), DstOutputData%VisLinesMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstMiscData%MDWrOutput = SrcMiscData%MDWrOutput + end if + DstMiscData%LastOutTime = SrcMiscData%LastOutTime + DstMiscData%PtfmInit = SrcMiscData%PtfmInit + if (allocated(SrcMiscData%BathymetryGrid)) then + LB(1:2) = lbound(SrcMiscData%BathymetryGrid) + UB(1:2) = ubound(SrcMiscData%BathymetryGrid) + if (.not. allocated(DstMiscData%BathymetryGrid)) then + allocate(DstMiscData%BathymetryGrid(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BathymetryGrid.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%BathymetryGrid = SrcMiscData%BathymetryGrid end if - if (allocated(SrcOutputData%VisRodsMesh)) then - LB(1:1) = lbound(SrcOutputData%VisRodsMesh) - UB(1:1) = ubound(SrcOutputData%VisRodsMesh) - if (.not. allocated(DstOutputData%VisRodsMesh)) then - allocate(DstOutputData%VisRodsMesh(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%BathGrid_Xs)) then + LB(1:1) = lbound(SrcMiscData%BathGrid_Xs) + UB(1:1) = ubound(SrcMiscData%BathGrid_Xs) + if (.not. allocated(DstMiscData%BathGrid_Xs)) then + allocate(DstMiscData%BathGrid_Xs(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%VisRodsMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BathGrid_Xs.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%VisRodsMesh(i1), DstOutputData%VisRodsMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstMiscData%BathGrid_Xs = SrcMiscData%BathGrid_Xs end if - if (allocated(SrcOutputData%VisBodiesMesh)) then - LB(1:1) = lbound(SrcOutputData%VisBodiesMesh) - UB(1:1) = ubound(SrcOutputData%VisBodiesMesh) - if (.not. allocated(DstOutputData%VisBodiesMesh)) then - allocate(DstOutputData%VisBodiesMesh(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%BathGrid_Ys)) then + LB(1:1) = lbound(SrcMiscData%BathGrid_Ys) + UB(1:1) = ubound(SrcMiscData%BathGrid_Ys) + if (.not. allocated(DstMiscData%BathGrid_Ys)) then + allocate(DstMiscData%BathGrid_Ys(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%VisBodiesMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BathGrid_Ys.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%VisBodiesMesh(i1), DstOutputData%VisBodiesMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstMiscData%BathGrid_Ys = SrcMiscData%BathGrid_Ys end if - if (allocated(SrcOutputData%VisAnchsMesh)) then - LB(1:1) = lbound(SrcOutputData%VisAnchsMesh) - UB(1:1) = ubound(SrcOutputData%VisAnchsMesh) - if (.not. allocated(DstOutputData%VisAnchsMesh)) then - allocate(DstOutputData%VisAnchsMesh(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%BathGrid_npoints)) then + LB(1:1) = lbound(SrcMiscData%BathGrid_npoints) + UB(1:1) = ubound(SrcMiscData%BathGrid_npoints) + if (.not. allocated(DstMiscData%BathGrid_npoints)) then + allocate(DstMiscData%BathGrid_npoints(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%VisAnchsMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BathGrid_npoints.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%VisAnchsMesh(i1), DstOutputData%VisAnchsMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstMiscData%BathGrid_npoints = SrcMiscData%BathGrid_npoints end if + call GridInterp_CopyMisc(SrcMiscData%WaveField_m, DstMiscData%WaveField_m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstMiscData%IC_gen = SrcMiscData%IC_gen end subroutine -subroutine MD_DestroyOutput(OutputData, ErrStat, ErrMsg) - type(MD_OutputType), intent(inout) :: OutputData +subroutine MD_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(MD_MiscVarType), intent(inout) :: MiscData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'MD_DestroyOutput' + character(*), parameter :: RoutineName = 'MD_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' - if (allocated(OutputData%CoupledLoads)) then - LB(1:1) = lbound(OutputData%CoupledLoads) - UB(1:1) = ubound(OutputData%CoupledLoads) + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MD_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MD_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MD_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MD_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%LineTypeList)) then + LB(1:1) = lbound(MiscData%LineTypeList) + UB(1:1) = ubound(MiscData%LineTypeList) do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%CoupledLoads(i1), ErrStat2, ErrMsg2) + call MD_DestroyLineProp(MiscData%LineTypeList(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%CoupledLoads) + deallocate(MiscData%LineTypeList) end if - if (allocated(OutputData%WriteOutput)) then - deallocate(OutputData%WriteOutput) + if (allocated(MiscData%RodTypeList)) then + LB(1:1) = lbound(MiscData%RodTypeList) + UB(1:1) = ubound(MiscData%RodTypeList) + do i1 = LB(1), UB(1) + call MD_DestroyRodProp(MiscData%RodTypeList(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%RodTypeList) end if - if (allocated(OutputData%VisLinesMesh)) then - LB(1:1) = lbound(OutputData%VisLinesMesh) - UB(1:1) = ubound(OutputData%VisLinesMesh) + call MD_DestroyBody(MiscData%GroundBody, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%BodyList)) then + LB(1:1) = lbound(MiscData%BodyList) + UB(1:1) = ubound(MiscData%BodyList) do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%VisLinesMesh(i1), ErrStat2, ErrMsg2) + call MD_DestroyBody(MiscData%BodyList(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%VisLinesMesh) + deallocate(MiscData%BodyList) end if - if (allocated(OutputData%VisRodsMesh)) then - LB(1:1) = lbound(OutputData%VisRodsMesh) - UB(1:1) = ubound(OutputData%VisRodsMesh) + if (allocated(MiscData%RodList)) then + LB(1:1) = lbound(MiscData%RodList) + UB(1:1) = ubound(MiscData%RodList) do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%VisRodsMesh(i1), ErrStat2, ErrMsg2) + call MD_DestroyRod(MiscData%RodList(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%VisRodsMesh) + deallocate(MiscData%RodList) end if - if (allocated(OutputData%VisBodiesMesh)) then - LB(1:1) = lbound(OutputData%VisBodiesMesh) - UB(1:1) = ubound(OutputData%VisBodiesMesh) + if (allocated(MiscData%PointList)) then + LB(1:1) = lbound(MiscData%PointList) + UB(1:1) = ubound(MiscData%PointList) do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%VisBodiesMesh(i1), ErrStat2, ErrMsg2) + call MD_DestroyPoint(MiscData%PointList(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%VisBodiesMesh) + deallocate(MiscData%PointList) end if - if (allocated(OutputData%VisAnchsMesh)) then - LB(1:1) = lbound(OutputData%VisAnchsMesh) - UB(1:1) = ubound(OutputData%VisAnchsMesh) + if (allocated(MiscData%LineList)) then + LB(1:1) = lbound(MiscData%LineList) + UB(1:1) = ubound(MiscData%LineList) do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%VisAnchsMesh(i1), ErrStat2, ErrMsg2) + call MD_DestroyLine(MiscData%LineList(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%VisAnchsMesh) + deallocate(MiscData%LineList) + end if + if (allocated(MiscData%ExtLdList)) then + LB(1:1) = lbound(MiscData%ExtLdList) + UB(1:1) = ubound(MiscData%ExtLdList) + do i1 = LB(1), UB(1) + call MD_DestroyExtLd(MiscData%ExtLdList(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%ExtLdList) + end if + if (allocated(MiscData%FailList)) then + LB(1:1) = lbound(MiscData%FailList) + UB(1:1) = ubound(MiscData%FailList) + do i1 = LB(1), UB(1) + call MD_DestroyFail(MiscData%FailList(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%FailList) + end if + if (allocated(MiscData%FreePointIs)) then + deallocate(MiscData%FreePointIs) + end if + if (allocated(MiscData%CpldPointIs)) then + deallocate(MiscData%CpldPointIs) + end if + if (allocated(MiscData%FreeRodIs)) then + deallocate(MiscData%FreeRodIs) + end if + if (allocated(MiscData%CpldRodIs)) then + deallocate(MiscData%CpldRodIs) + end if + if (allocated(MiscData%FreeBodyIs)) then + deallocate(MiscData%FreeBodyIs) + end if + if (allocated(MiscData%CpldBodyIs)) then + deallocate(MiscData%CpldBodyIs) + end if + if (allocated(MiscData%LineStateIs1)) then + deallocate(MiscData%LineStateIs1) + end if + if (allocated(MiscData%LineStateIsN)) then + deallocate(MiscData%LineStateIsN) + end if + if (allocated(MiscData%PointStateIs1)) then + deallocate(MiscData%PointStateIs1) + end if + if (allocated(MiscData%PointStateIsN)) then + deallocate(MiscData%PointStateIsN) + end if + if (allocated(MiscData%RodStateIs1)) then + deallocate(MiscData%RodStateIs1) + end if + if (allocated(MiscData%RodStateIsN)) then + deallocate(MiscData%RodStateIsN) + end if + if (allocated(MiscData%BodyStateIs1)) then + deallocate(MiscData%BodyStateIs1) + end if + if (allocated(MiscData%BodyStateIsN)) then + deallocate(MiscData%BodyStateIsN) + end if + call MD_DestroyContState(MiscData%xTemp, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MD_DestroyContState(MiscData%xdTemp, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MD_DestroyContState(MiscData%kSum, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%MDWrOutput)) then + deallocate(MiscData%MDWrOutput) + end if + if (allocated(MiscData%BathymetryGrid)) then + deallocate(MiscData%BathymetryGrid) end if + if (allocated(MiscData%BathGrid_Xs)) then + deallocate(MiscData%BathGrid_Xs) + end if + if (allocated(MiscData%BathGrid_Ys)) then + deallocate(MiscData%BathGrid_Ys) + end if + if (allocated(MiscData%BathGrid_npoints)) then + deallocate(MiscData%BathGrid_npoints) + end if + call GridInterp_DestroyMisc(MiscData%WaveField_m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine -subroutine MD_PackOutput(RF, Indata) +subroutine MD_PackMisc(RF, Indata) type(RegFile), intent(inout) :: RF - type(MD_OutputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'MD_PackOutput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(MD_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'MD_PackMisc' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%CoupledLoads)) - if (allocated(InData%CoupledLoads)) then - call RegPackBounds(RF, 1, lbound(InData%CoupledLoads), ubound(InData%CoupledLoads)) - LB(1:1) = lbound(InData%CoupledLoads) - UB(1:1) = ubound(InData%CoupledLoads) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call MD_PackContState(RF, InData%x_perturb) + call MD_PackContState(RF, InData%dxdt_lin) + call MD_PackInput(RF, InData%u_perturb) + call MD_PackOutput(RF, InData%y_lin) + call RegPack(RF, allocated(InData%LineTypeList)) + if (allocated(InData%LineTypeList)) then + call RegPackBounds(RF, 1, lbound(InData%LineTypeList), ubound(InData%LineTypeList)) + LB(1:1) = lbound(InData%LineTypeList) + UB(1:1) = ubound(InData%LineTypeList) + do i1 = LB(1), UB(1) + call MD_PackLineProp(RF, InData%LineTypeList(i1)) + end do + end if + call RegPack(RF, allocated(InData%RodTypeList)) + if (allocated(InData%RodTypeList)) then + call RegPackBounds(RF, 1, lbound(InData%RodTypeList), ubound(InData%RodTypeList)) + LB(1:1) = lbound(InData%RodTypeList) + UB(1:1) = ubound(InData%RodTypeList) + do i1 = LB(1), UB(1) + call MD_PackRodProp(RF, InData%RodTypeList(i1)) + end do + end if + call MD_PackBody(RF, InData%GroundBody) + call RegPack(RF, allocated(InData%BodyList)) + if (allocated(InData%BodyList)) then + call RegPackBounds(RF, 1, lbound(InData%BodyList), ubound(InData%BodyList)) + LB(1:1) = lbound(InData%BodyList) + UB(1:1) = ubound(InData%BodyList) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%CoupledLoads(i1)) + call MD_PackBody(RF, InData%BodyList(i1)) end do end if - call RegPackAlloc(RF, InData%WriteOutput) - call RegPack(RF, allocated(InData%VisLinesMesh)) - if (allocated(InData%VisLinesMesh)) then - call RegPackBounds(RF, 1, lbound(InData%VisLinesMesh), ubound(InData%VisLinesMesh)) - LB(1:1) = lbound(InData%VisLinesMesh) - UB(1:1) = ubound(InData%VisLinesMesh) + call RegPack(RF, allocated(InData%RodList)) + if (allocated(InData%RodList)) then + call RegPackBounds(RF, 1, lbound(InData%RodList), ubound(InData%RodList)) + LB(1:1) = lbound(InData%RodList) + UB(1:1) = ubound(InData%RodList) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%VisLinesMesh(i1)) + call MD_PackRod(RF, InData%RodList(i1)) end do end if - call RegPack(RF, allocated(InData%VisRodsMesh)) - if (allocated(InData%VisRodsMesh)) then - call RegPackBounds(RF, 1, lbound(InData%VisRodsMesh), ubound(InData%VisRodsMesh)) - LB(1:1) = lbound(InData%VisRodsMesh) - UB(1:1) = ubound(InData%VisRodsMesh) + call RegPack(RF, allocated(InData%PointList)) + if (allocated(InData%PointList)) then + call RegPackBounds(RF, 1, lbound(InData%PointList), ubound(InData%PointList)) + LB(1:1) = lbound(InData%PointList) + UB(1:1) = ubound(InData%PointList) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%VisRodsMesh(i1)) + call MD_PackPoint(RF, InData%PointList(i1)) end do end if - call RegPack(RF, allocated(InData%VisBodiesMesh)) - if (allocated(InData%VisBodiesMesh)) then - call RegPackBounds(RF, 1, lbound(InData%VisBodiesMesh), ubound(InData%VisBodiesMesh)) - LB(1:1) = lbound(InData%VisBodiesMesh) - UB(1:1) = ubound(InData%VisBodiesMesh) + call RegPack(RF, allocated(InData%LineList)) + if (allocated(InData%LineList)) then + call RegPackBounds(RF, 1, lbound(InData%LineList), ubound(InData%LineList)) + LB(1:1) = lbound(InData%LineList) + UB(1:1) = ubound(InData%LineList) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%VisBodiesMesh(i1)) + call MD_PackLine(RF, InData%LineList(i1)) end do end if - call RegPack(RF, allocated(InData%VisAnchsMesh)) - if (allocated(InData%VisAnchsMesh)) then - call RegPackBounds(RF, 1, lbound(InData%VisAnchsMesh), ubound(InData%VisAnchsMesh)) - LB(1:1) = lbound(InData%VisAnchsMesh) - UB(1:1) = ubound(InData%VisAnchsMesh) + call RegPack(RF, allocated(InData%ExtLdList)) + if (allocated(InData%ExtLdList)) then + call RegPackBounds(RF, 1, lbound(InData%ExtLdList), ubound(InData%ExtLdList)) + LB(1:1) = lbound(InData%ExtLdList) + UB(1:1) = ubound(InData%ExtLdList) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%VisAnchsMesh(i1)) + call MD_PackExtLd(RF, InData%ExtLdList(i1)) + end do + end if + call RegPack(RF, allocated(InData%FailList)) + if (allocated(InData%FailList)) then + call RegPackBounds(RF, 1, lbound(InData%FailList), ubound(InData%FailList)) + LB(1:1) = lbound(InData%FailList) + UB(1:1) = ubound(InData%FailList) + do i1 = LB(1), UB(1) + call MD_PackFail(RF, InData%FailList(i1)) end do end if + call RegPackAlloc(RF, InData%FreePointIs) + call RegPackAlloc(RF, InData%CpldPointIs) + call RegPackAlloc(RF, InData%FreeRodIs) + call RegPackAlloc(RF, InData%CpldRodIs) + call RegPackAlloc(RF, InData%FreeBodyIs) + call RegPackAlloc(RF, InData%CpldBodyIs) + call RegPackAlloc(RF, InData%LineStateIs1) + call RegPackAlloc(RF, InData%LineStateIsN) + call RegPackAlloc(RF, InData%PointStateIs1) + call RegPackAlloc(RF, InData%PointStateIsN) + call RegPackAlloc(RF, InData%RodStateIs1) + call RegPackAlloc(RF, InData%RodStateIsN) + call RegPackAlloc(RF, InData%BodyStateIs1) + call RegPackAlloc(RF, InData%BodyStateIsN) + call RegPack(RF, InData%Nx) + call RegPack(RF, InData%Nxtra) + call RegPack(RF, InData%WaveTi) + call MD_PackContState(RF, InData%xTemp) + call MD_PackContState(RF, InData%xdTemp) + call MD_PackContState(RF, InData%kSum) + call RegPack(RF, InData%zeros6) + call RegPackAlloc(RF, InData%MDWrOutput) + call RegPack(RF, InData%LastOutTime) + call RegPack(RF, InData%PtfmInit) + call RegPackAlloc(RF, InData%BathymetryGrid) + call RegPackAlloc(RF, InData%BathGrid_Xs) + call RegPackAlloc(RF, InData%BathGrid_Ys) + call RegPackAlloc(RF, InData%BathGrid_npoints) + call GridInterp_PackMisc(RF, InData%WaveField_m) + call RegPack(RF, InData%IC_gen) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine MD_UnPackOutput(RF, OutData) +subroutine MD_UnPackMisc(RF, OutData) type(RegFile), intent(inout) :: RF - type(MD_OutputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'MD_UnPackOutput' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(MD_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'MD_UnPackMisc' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%CoupledLoads)) deallocate(OutData%CoupledLoads) + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call MD_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call MD_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call MD_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call MD_UnpackOutput(RF, OutData%y_lin) ! y_lin + if (allocated(OutData%LineTypeList)) deallocate(OutData%LineTypeList) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%CoupledLoads(LB(1):UB(1)),stat=stat) + allocate(OutData%LineTypeList(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%CoupledLoads.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%LineTypeList.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%CoupledLoads(i1)) ! CoupledLoads + call MD_UnpackLineProp(RF, OutData%LineTypeList(i1)) ! LineTypeList end do end if - call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%VisLinesMesh)) deallocate(OutData%VisLinesMesh) + if (allocated(OutData%RodTypeList)) deallocate(OutData%RodTypeList) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%VisLinesMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%RodTypeList(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisLinesMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%RodTypeList.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%VisLinesMesh(i1)) ! VisLinesMesh + call MD_UnpackRodProp(RF, OutData%RodTypeList(i1)) ! RodTypeList end do end if - if (allocated(OutData%VisRodsMesh)) deallocate(OutData%VisRodsMesh) + call MD_UnpackBody(RF, OutData%GroundBody) ! GroundBody + if (allocated(OutData%BodyList)) deallocate(OutData%BodyList) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%VisRodsMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%BodyList(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisRodsMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BodyList.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%VisRodsMesh(i1)) ! VisRodsMesh + call MD_UnpackBody(RF, OutData%BodyList(i1)) ! BodyList end do end if - if (allocated(OutData%VisBodiesMesh)) deallocate(OutData%VisBodiesMesh) + if (allocated(OutData%RodList)) deallocate(OutData%RodList) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%VisBodiesMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%RodList(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisBodiesMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%RodList.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%VisBodiesMesh(i1)) ! VisBodiesMesh + call MD_UnpackRod(RF, OutData%RodList(i1)) ! RodList end do end if - if (allocated(OutData%VisAnchsMesh)) deallocate(OutData%VisAnchsMesh) + if (allocated(OutData%PointList)) deallocate(OutData%PointList) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%VisAnchsMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%PointList(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VisAnchsMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%PointList.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%VisAnchsMesh(i1)) ! VisAnchsMesh + call MD_UnpackPoint(RF, OutData%PointList(i1)) ! PointList + end do + end if + if (allocated(OutData%LineList)) deallocate(OutData%LineList) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%LineList(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%LineList.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MD_UnpackLine(RF, OutData%LineList(i1)) ! LineList + end do + end if + if (allocated(OutData%ExtLdList)) deallocate(OutData%ExtLdList) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%ExtLdList(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ExtLdList.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MD_UnpackExtLd(RF, OutData%ExtLdList(i1)) ! ExtLdList + end do + end if + if (allocated(OutData%FailList)) deallocate(OutData%FailList) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%FailList(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%FailList.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MD_UnpackFail(RF, OutData%FailList(i1)) ! FailList end do end if + call RegUnpackAlloc(RF, OutData%FreePointIs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%CpldPointIs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%FreeRodIs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%CpldRodIs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%FreeBodyIs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%CpldBodyIs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%LineStateIs1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%LineStateIsN); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PointStateIs1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PointStateIsN); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%RodStateIs1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%RodStateIsN); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BodyStateIs1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BodyStateIsN); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Nx); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Nxtra); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WaveTi); if (RegCheckErr(RF, RoutineName)) return + call MD_UnpackContState(RF, OutData%xTemp) ! xTemp + call MD_UnpackContState(RF, OutData%xdTemp) ! xdTemp + call MD_UnpackContState(RF, OutData%kSum) ! kSum + call RegUnpack(RF, OutData%zeros6); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%MDWrOutput); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LastOutTime); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmInit); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BathymetryGrid); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BathGrid_Xs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BathGrid_Ys); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BathGrid_npoints); if (RegCheckErr(RF, RoutineName)) return + call GridInterp_UnpackMisc(RF, OutData%WaveField_m) ! WaveField_m + call RegUnpack(RF, OutData%IC_gen); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine MD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -5469,5 +5300,274 @@ SUBROUTINE MD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Err END DO END IF ! check if allocated END SUBROUTINE + +function MD_InputMeshPointer(u, DL) result(Mesh) + type(MD_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (MD_u_CoupledKinematics) + Mesh => u%CoupledKinematics(DL%i1) + end select +end function + +function MD_OutputMeshPointer(y, DL) result(Mesh) + type(MD_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (MD_y_CoupledLoads) + Mesh => y%CoupledLoads(DL%i1) + case (MD_y_VisLinesMesh) + Mesh => y%VisLinesMesh(DL%i1) + case (MD_y_VisRodsMesh) + Mesh => y%VisRodsMesh(DL%i1) + case (MD_y_VisBodiesMesh) + Mesh => y%VisBodiesMesh(DL%i1) + case (MD_y_VisAnchsMesh) + Mesh => y%VisAnchsMesh(DL%i1) + end select +end function + +subroutine MD_VarsPackContState(Vars, x, ValAry) + type(MD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call MD_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine MD_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(MD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MD_x_states) + VarVals = x%states(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine MD_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(MD_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call MD_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine MD_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(MD_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MD_x_states) + x%states(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function MD_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (MD_x_states) + Name = "x%states" + case default + Name = "Unknown Field" + end select +end function + +subroutine MD_VarsPackContStateDeriv(Vars, x, ValAry) + type(MD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call MD_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine MD_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(MD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MD_x_states) + VarVals = x%states(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine MD_VarsPackInput(Vars, u, ValAry) + type(MD_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call MD_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine MD_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(MD_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MD_u_CoupledKinematics) + call MV_PackMesh(V, u%CoupledKinematics(DL%i1), ValAry) ! Mesh + case (MD_u_DeltaL) + VarVals = u%DeltaL(V%iLB:V%iUB) ! Rank 1 Array + case (MD_u_DeltaLdot) + VarVals = u%DeltaLdot(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine MD_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(MD_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call MD_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine MD_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(MD_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MD_u_CoupledKinematics) + call MV_UnpackMesh(V, ValAry, u%CoupledKinematics(DL%i1)) ! Mesh + case (MD_u_DeltaL) + u%DeltaL(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MD_u_DeltaLdot) + u%DeltaLdot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function MD_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (MD_u_CoupledKinematics) + Name = "u%CoupledKinematics("//trim(Num2LStr(DL%i1))//")" + case (MD_u_DeltaL) + Name = "u%DeltaL" + case (MD_u_DeltaLdot) + Name = "u%DeltaLdot" + case default + Name = "Unknown Field" + end select +end function + +subroutine MD_VarsPackOutput(Vars, y, ValAry) + type(MD_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call MD_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine MD_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(MD_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MD_y_CoupledLoads) + call MV_PackMesh(V, y%CoupledLoads(DL%i1), ValAry) ! Mesh + case (MD_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (MD_y_VisLinesMesh) + call MV_PackMesh(V, y%VisLinesMesh(DL%i1), ValAry) ! Mesh + case (MD_y_VisRodsMesh) + call MV_PackMesh(V, y%VisRodsMesh(DL%i1), ValAry) ! Mesh + case (MD_y_VisBodiesMesh) + call MV_PackMesh(V, y%VisBodiesMesh(DL%i1), ValAry) ! Mesh + case (MD_y_VisAnchsMesh) + call MV_PackMesh(V, y%VisAnchsMesh(DL%i1), ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine MD_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(MD_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call MD_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine MD_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(MD_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (MD_y_CoupledLoads) + call MV_UnpackMesh(V, ValAry, y%CoupledLoads(DL%i1)) ! Mesh + case (MD_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (MD_y_VisLinesMesh) + call MV_UnpackMesh(V, ValAry, y%VisLinesMesh(DL%i1)) ! Mesh + case (MD_y_VisRodsMesh) + call MV_UnpackMesh(V, ValAry, y%VisRodsMesh(DL%i1)) ! Mesh + case (MD_y_VisBodiesMesh) + call MV_UnpackMesh(V, ValAry, y%VisBodiesMesh(DL%i1)) ! Mesh + case (MD_y_VisAnchsMesh) + call MV_UnpackMesh(V, ValAry, y%VisAnchsMesh(DL%i1)) ! Mesh + end select + end associate +end subroutine + +function MD_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (MD_y_CoupledLoads) + Name = "y%CoupledLoads("//trim(Num2LStr(DL%i1))//")" + case (MD_y_WriteOutput) + Name = "y%WriteOutput" + case (MD_y_VisLinesMesh) + Name = "y%VisLinesMesh("//trim(Num2LStr(DL%i1))//")" + case (MD_y_VisRodsMesh) + Name = "y%VisRodsMesh("//trim(Num2LStr(DL%i1))//")" + case (MD_y_VisBodiesMesh) + Name = "y%VisBodiesMesh("//trim(Num2LStr(DL%i1))//")" + case (MD_y_VisAnchsMesh) + Name = "y%VisAnchsMesh("//trim(Num2LStr(DL%i1))//")" + case default + Name = "Unknown Field" + end select +end function + END MODULE MoorDyn_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/nwtc-library/CMakeLists.txt b/modules/nwtc-library/CMakeLists.txt index 71b5a0fd9a..1e5395447c 100644 --- a/modules/nwtc-library/CMakeLists.txt +++ b/modules/nwtc-library/CMakeLists.txt @@ -69,6 +69,7 @@ set(NWTCLIBS_SOURCES src/NWTC_Base.f90 src/SingPrec.f90 src/ModReg.f90 + src/ModVar.f90 src/ModMesh.f90 src/ModMesh_Mapping.f90 @@ -85,6 +86,7 @@ set(NWTCLIBS_SOURCES src/VTK.f90 src/YAML.f90 src/JSON.f90 + src/KdTree.f90 src/GridInterp.f90 src/GridInterp_Types.f90 @@ -166,6 +168,9 @@ target_link_libraries(nwtclibs PUBLIC ${LAPACK_LIBRARIES} ${CMAKE_DL_LIBS} ) +target_include_directories(nwtclibs PUBLIC + $ +) if (USE_DLL_INTERFACE) target_compile_definitions(nwtclibs PRIVATE USE_DLL_INTERFACE) endif (USE_DLL_INTERFACE) diff --git a/modules/nwtc-library/include/fast_float.h b/modules/nwtc-library/include/fast_float.h new file mode 100644 index 0000000000..cceeea4a32 --- /dev/null +++ b/modules/nwtc-library/include/fast_float.h @@ -0,0 +1,4523 @@ +// fast_float by Daniel Lemire +// fast_float by João Paulo Magalhaes +// +// +// with contributions from Eugene Golushkov +// with contributions from Maksim Kita +// with contributions from Marcin Wojdyr +// with contributions from Neal Richardson +// with contributions from Tim Paine +// with contributions from Fabio Pellacini +// with contributions from Lénárd Szolnoki +// with contributions from Jan Pharago +// with contributions from Maya Warrier +// with contributions from Taha Khokhar +// with contributions from Anders Dalvander +// +// +// Licensed under the Apache License, Version 2.0, or the +// MIT License or the Boost License. This file may not be copied, +// modified, or distributed except according to those terms. +// +// MIT License Notice +// +// MIT License +// +// Copyright (c) 2021 The fast_float authors +// +// Permission is hereby granted, free of charge, to any +// person obtaining a copy of this software and associated +// documentation files (the "Software"), to deal in the +// Software without restriction, including without +// limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software +// is furnished to do so, subject to the following +// conditions: +// +// The above copyright notice and this permission notice +// shall be included in all copies or substantial portions +// of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +// ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +// SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +// IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// +// Apache License (Version 2.0) Notice +// +// Copyright 2021 The fast_float authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// +// BOOST License Notice +// +// Boost Software License - Version 1.0 - August 17th, 2003 +// +// Permission is hereby granted, free of charge, to any person or organization +// obtaining a copy of the software and accompanying documentation covered by +// this license (the "Software") to use, reproduce, display, distribute, +// execute, and transmit the Software, and to prepare derivative works of the +// Software, and to permit third-parties to whom the Software is furnished to +// do so, all subject to the following: +// +// The copyright notices in the Software and this entire statement, including +// the above license grant, this restriction and the following disclaimer, +// must be included in all copies of the Software, in whole or in part, and +// all derivative works of the Software, unless such copies or derivative +// works are solely in the form of machine-executable object code generated by +// a source language processor. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. +// + +#ifndef FASTFLOAT_CONSTEXPR_FEATURE_DETECT_H +#define FASTFLOAT_CONSTEXPR_FEATURE_DETECT_H + +#ifdef __has_include +#if __has_include() +#include +#endif +#endif + +// Testing for https://wg21.link/N3652, adopted in C++14 +#if defined(__cpp_constexpr) && __cpp_constexpr >= 201304 +#define FASTFLOAT_CONSTEXPR14 constexpr +#else +#define FASTFLOAT_CONSTEXPR14 +#endif + +#if defined(__cpp_lib_bit_cast) && __cpp_lib_bit_cast >= 201806L +#define FASTFLOAT_HAS_BIT_CAST 1 +#else +#define FASTFLOAT_HAS_BIT_CAST 0 +#endif + +#if defined(__cpp_lib_is_constant_evaluated) && \ + __cpp_lib_is_constant_evaluated >= 201811L +#define FASTFLOAT_HAS_IS_CONSTANT_EVALUATED 1 +#else +#define FASTFLOAT_HAS_IS_CONSTANT_EVALUATED 0 +#endif + +#if defined(__cpp_if_constexpr) && __cpp_if_constexpr >= 201606L +#define FASTFLOAT_IF_CONSTEXPR17(x) if constexpr (x) +#else +#define FASTFLOAT_IF_CONSTEXPR17(x) if (x) +#endif + +// Testing for relevant C++20 constexpr library features +#if FASTFLOAT_HAS_IS_CONSTANT_EVALUATED && FASTFLOAT_HAS_BIT_CAST && \ + defined(__cpp_lib_constexpr_algorithms) && \ + __cpp_lib_constexpr_algorithms >= 201806L /*For std::copy and std::fill*/ +#define FASTFLOAT_CONSTEXPR20 constexpr +#define FASTFLOAT_IS_CONSTEXPR 1 +#else +#define FASTFLOAT_CONSTEXPR20 +#define FASTFLOAT_IS_CONSTEXPR 0 +#endif + +#if __cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +#define FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE 0 +#else +#define FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE 1 +#endif + +#endif // FASTFLOAT_CONSTEXPR_FEATURE_DETECT_H + +#ifndef FASTFLOAT_FLOAT_COMMON_H +#define FASTFLOAT_FLOAT_COMMON_H + +#include +#include +#include +#include +#include +#include +#include +#ifdef __has_include +#if __has_include() && (__cplusplus > 202002L || (defined(_MSVC_LANG) && (_MSVC_LANG > 202002L))) +#include +#endif +#endif + +#define FASTFLOAT_VERSION_MAJOR 8 +#define FASTFLOAT_VERSION_MINOR 1 +#define FASTFLOAT_VERSION_PATCH 0 + +#define FASTFLOAT_STRINGIZE_IMPL(x) #x +#define FASTFLOAT_STRINGIZE(x) FASTFLOAT_STRINGIZE_IMPL(x) + +#define FASTFLOAT_VERSION_STR \ + FASTFLOAT_STRINGIZE(FASTFLOAT_VERSION_MAJOR) \ + "." FASTFLOAT_STRINGIZE(FASTFLOAT_VERSION_MINOR) "." FASTFLOAT_STRINGIZE( \ + FASTFLOAT_VERSION_PATCH) + +#define FASTFLOAT_VERSION \ + (FASTFLOAT_VERSION_MAJOR * 10000 + FASTFLOAT_VERSION_MINOR * 100 + \ + FASTFLOAT_VERSION_PATCH) + +namespace fast_float { + +enum class chars_format : uint64_t; + +namespace detail { +constexpr chars_format basic_json_fmt = chars_format(1 << 5); +constexpr chars_format basic_fortran_fmt = chars_format(1 << 6); +} // namespace detail + +enum class chars_format : uint64_t { + scientific = 1 << 0, + fixed = 1 << 2, + hex = 1 << 3, + no_infnan = 1 << 4, + // RFC 8259: https://datatracker.ietf.org/doc/html/rfc8259#section-6 + json = uint64_t(detail::basic_json_fmt) | fixed | scientific | no_infnan, + // Extension of RFC 8259 where, e.g., "inf" and "nan" are allowed. + json_or_infnan = uint64_t(detail::basic_json_fmt) | fixed | scientific, + fortran = uint64_t(detail::basic_fortran_fmt) | fixed | scientific, + general = fixed | scientific, + allow_leading_plus = 1 << 7, + skip_white_space = 1 << 8, +}; + +template struct from_chars_result_t { + UC const *ptr; + std::errc ec; + + // https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2023/p2497r0.html + constexpr explicit operator bool() const noexcept { + return ec == std::errc(); + } +}; + +using from_chars_result = from_chars_result_t; + +template struct parse_options_t { + constexpr explicit parse_options_t(chars_format fmt = chars_format::general, + UC dot = UC('.'), int b = 10) + : format(fmt), decimal_point(dot), base(b) {} + + /** Which number formats are accepted */ + chars_format format; + /** The character used as decimal point */ + UC decimal_point; + /** The base used for integers */ + int base; +}; + +using parse_options = parse_options_t; + +} // namespace fast_float + +#if FASTFLOAT_HAS_BIT_CAST +#include +#endif + +#if (defined(__x86_64) || defined(__x86_64__) || defined(_M_X64) || \ + defined(__amd64) || defined(__aarch64__) || defined(_M_ARM64) || \ + defined(__MINGW64__) || defined(__s390x__) || \ + (defined(__ppc64__) || defined(__PPC64__) || defined(__ppc64le__) || \ + defined(__PPC64LE__)) || \ + defined(__loongarch64) || (defined(__riscv) && __riscv_xlen == 64)) +#define FASTFLOAT_64BIT 1 +#elif (defined(__i386) || defined(__i386__) || defined(_M_IX86) || \ + defined(__arm__) || defined(_M_ARM) || defined(__ppc__) || \ + defined(__MINGW32__) || defined(__EMSCRIPTEN__) || \ + (defined(__riscv) && __riscv_xlen == 32)) +#define FASTFLOAT_32BIT 1 +#else + // Need to check incrementally, since SIZE_MAX is a size_t, avoid overflow. +// We can never tell the register width, but the SIZE_MAX is a good +// approximation. UINTPTR_MAX and INTPTR_MAX are optional, so avoid them for max +// portability. +#if SIZE_MAX == 0xffff +#error Unknown platform (16-bit, unsupported) +#elif SIZE_MAX == 0xffffffff +#define FASTFLOAT_32BIT 1 +#elif SIZE_MAX == 0xffffffffffffffff +#define FASTFLOAT_64BIT 1 +#else +#error Unknown platform (not 32-bit, not 64-bit?) +#endif +#endif + +#if ((defined(_WIN32) || defined(_WIN64)) && !defined(__clang__)) || \ + (defined(_M_ARM64) && !defined(__MINGW32__)) +#include +#endif + +#if defined(_MSC_VER) && !defined(__clang__) +#define FASTFLOAT_VISUAL_STUDIO 1 +#endif + +#if defined __BYTE_ORDER__ && defined __ORDER_BIG_ENDIAN__ +#define FASTFLOAT_IS_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#elif defined _WIN32 +#define FASTFLOAT_IS_BIG_ENDIAN 0 +#else +#if defined(__APPLE__) || defined(__FreeBSD__) +#include +#elif defined(sun) || defined(__sun) +#include +#elif defined(__MVS__) +#include +#else +#ifdef __has_include +#if __has_include() +#include +#endif //__has_include() +#endif //__has_include +#endif +# +#ifndef __BYTE_ORDER__ +// safe choice +#define FASTFLOAT_IS_BIG_ENDIAN 0 +#endif +# +#ifndef __ORDER_LITTLE_ENDIAN__ +// safe choice +#define FASTFLOAT_IS_BIG_ENDIAN 0 +#endif +# +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +#define FASTFLOAT_IS_BIG_ENDIAN 0 +#else +#define FASTFLOAT_IS_BIG_ENDIAN 1 +#endif +#endif + +#if defined(__SSE2__) || (defined(FASTFLOAT_VISUAL_STUDIO) && \ + (defined(_M_AMD64) || defined(_M_X64) || \ + (defined(_M_IX86_FP) && _M_IX86_FP == 2))) +#define FASTFLOAT_SSE2 1 +#endif + +#if defined(__aarch64__) || defined(_M_ARM64) +#define FASTFLOAT_NEON 1 +#endif + +#if defined(FASTFLOAT_SSE2) || defined(FASTFLOAT_NEON) +#define FASTFLOAT_HAS_SIMD 1 +#endif + +#if defined(__GNUC__) +// disable -Wcast-align=strict (GCC only) +#define FASTFLOAT_SIMD_DISABLE_WARNINGS \ + _Pragma("GCC diagnostic push") \ + _Pragma("GCC diagnostic ignored \"-Wcast-align\"") +#else +#define FASTFLOAT_SIMD_DISABLE_WARNINGS +#endif + +#if defined(__GNUC__) +#define FASTFLOAT_SIMD_RESTORE_WARNINGS _Pragma("GCC diagnostic pop") +#else +#define FASTFLOAT_SIMD_RESTORE_WARNINGS +#endif + +#ifdef FASTFLOAT_VISUAL_STUDIO +#define fastfloat_really_inline __forceinline +#else +#define fastfloat_really_inline inline __attribute__((always_inline)) +#endif + +#ifndef FASTFLOAT_ASSERT +#define FASTFLOAT_ASSERT(x) \ + { ((void)(x)); } +#endif + +#ifndef FASTFLOAT_DEBUG_ASSERT +#define FASTFLOAT_DEBUG_ASSERT(x) \ + { ((void)(x)); } +#endif + +// rust style `try!()` macro, or `?` operator +#define FASTFLOAT_TRY(x) \ + { \ + if (!(x)) \ + return false; \ + } + +#define FASTFLOAT_ENABLE_IF(...) \ + typename std::enable_if<(__VA_ARGS__), int>::type + +namespace fast_float { + +fastfloat_really_inline constexpr bool cpp20_and_in_constexpr() { +#if FASTFLOAT_HAS_IS_CONSTANT_EVALUATED + return std::is_constant_evaluated(); +#else + return false; +#endif +} + +template +struct is_supported_float_type + : std::integral_constant< + bool, std::is_same::value || std::is_same::value +#ifdef __STDCPP_FLOAT64_T__ + || std::is_same::value +#endif +#ifdef __STDCPP_FLOAT32_T__ + || std::is_same::value +#endif +#ifdef __STDCPP_FLOAT16_T__ + || std::is_same::value +#endif +#ifdef __STDCPP_BFLOAT16_T__ + || std::is_same::value +#endif + > { +}; + +template +using equiv_uint_t = typename std::conditional< + sizeof(T) == 1, uint8_t, + typename std::conditional< + sizeof(T) == 2, uint16_t, + typename std::conditional::type>::type>::type; + +template struct is_supported_integer_type : std::is_integral {}; + +template +struct is_supported_char_type + : std::integral_constant::value || + std::is_same::value || + std::is_same::value || + std::is_same::value +#ifdef __cpp_char8_t + || std::is_same::value +#endif + > { +}; + +// Compares two ASCII strings in a case insensitive manner. +template +inline FASTFLOAT_CONSTEXPR14 bool +fastfloat_strncasecmp(UC const *actual_mixedcase, UC const *expected_lowercase, + size_t length) { + for (size_t i = 0; i < length; ++i) { + UC const actual = actual_mixedcase[i]; + if ((actual < 256 ? actual | 32 : actual) != expected_lowercase[i]) { + return false; + } + } + return true; +} + +#ifndef FLT_EVAL_METHOD +#error "FLT_EVAL_METHOD should be defined, please include cfloat." +#endif + +// a pointer and a length to a contiguous block of memory +template struct span { + T const *ptr; + size_t length; + + constexpr span(T const *_ptr, size_t _length) : ptr(_ptr), length(_length) {} + + constexpr span() : ptr(nullptr), length(0) {} + + constexpr size_t len() const noexcept { return length; } + + FASTFLOAT_CONSTEXPR14 const T &operator[](size_t index) const noexcept { + FASTFLOAT_DEBUG_ASSERT(index < length); + return ptr[index]; + } +}; + +struct value128 { + uint64_t low; + uint64_t high; + + constexpr value128(uint64_t _low, uint64_t _high) : low(_low), high(_high) {} + + constexpr value128() : low(0), high(0) {} +}; + +/* Helper C++14 constexpr generic implementation of leading_zeroes */ +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 int +leading_zeroes_generic(uint64_t input_num, int last_bit = 0) { + if (input_num & uint64_t(0xffffffff00000000)) { + input_num >>= 32; + last_bit |= 32; + } + if (input_num & uint64_t(0xffff0000)) { + input_num >>= 16; + last_bit |= 16; + } + if (input_num & uint64_t(0xff00)) { + input_num >>= 8; + last_bit |= 8; + } + if (input_num & uint64_t(0xf0)) { + input_num >>= 4; + last_bit |= 4; + } + if (input_num & uint64_t(0xc)) { + input_num >>= 2; + last_bit |= 2; + } + if (input_num & uint64_t(0x2)) { /* input_num >>= 1; */ + last_bit |= 1; + } + return 63 - last_bit; +} + +/* result might be undefined when input_num is zero */ +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 int +leading_zeroes(uint64_t input_num) { + assert(input_num > 0); + if (cpp20_and_in_constexpr()) { + return leading_zeroes_generic(input_num); + } +#ifdef FASTFLOAT_VISUAL_STUDIO +#if defined(_M_X64) || defined(_M_ARM64) + unsigned long leading_zero = 0; + // Search the mask data from most significant bit (MSB) + // to least significant bit (LSB) for a set bit (1). + _BitScanReverse64(&leading_zero, input_num); + return (int)(63 - leading_zero); +#else + return leading_zeroes_generic(input_num); +#endif +#else + return __builtin_clzll(input_num); +#endif +} + +// slow emulation routine for 32-bit +fastfloat_really_inline constexpr uint64_t emulu(uint32_t x, uint32_t y) { + return x * (uint64_t)y; +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 uint64_t +umul128_generic(uint64_t ab, uint64_t cd, uint64_t *hi) { + uint64_t ad = emulu((uint32_t)(ab >> 32), (uint32_t)cd); + uint64_t bd = emulu((uint32_t)ab, (uint32_t)cd); + uint64_t adbc = ad + emulu((uint32_t)ab, (uint32_t)(cd >> 32)); + uint64_t adbc_carry = (uint64_t)(adbc < ad); + uint64_t lo = bd + (adbc << 32); + *hi = emulu((uint32_t)(ab >> 32), (uint32_t)(cd >> 32)) + (adbc >> 32) + + (adbc_carry << 32) + (uint64_t)(lo < bd); + return lo; +} + +#ifdef FASTFLOAT_32BIT + +// slow emulation routine for 32-bit +#if !defined(__MINGW64__) +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 uint64_t _umul128(uint64_t ab, + uint64_t cd, + uint64_t *hi) { + return umul128_generic(ab, cd, hi); +} +#endif // !__MINGW64__ + +#endif // FASTFLOAT_32BIT + +// compute 64-bit a*b +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 value128 +full_multiplication(uint64_t a, uint64_t b) { + if (cpp20_and_in_constexpr()) { + value128 answer; + answer.low = umul128_generic(a, b, &answer.high); + return answer; + } + value128 answer; +#if defined(_M_ARM64) && !defined(__MINGW32__) + // ARM64 has native support for 64-bit multiplications, no need to emulate + // But MinGW on ARM64 doesn't have native support for 64-bit multiplications + answer.high = __umulh(a, b); + answer.low = a * b; +#elif defined(FASTFLOAT_32BIT) || \ + (defined(_WIN64) && !defined(__clang__) && !defined(_M_ARM64)) + answer.low = _umul128(a, b, &answer.high); // _umul128 not available on ARM64 +#elif defined(FASTFLOAT_64BIT) && defined(__SIZEOF_INT128__) + __uint128_t r = ((__uint128_t)a) * b; + answer.low = uint64_t(r); + answer.high = uint64_t(r >> 64); +#else + answer.low = umul128_generic(a, b, &answer.high); +#endif + return answer; +} + +struct adjusted_mantissa { + uint64_t mantissa{0}; + int32_t power2{0}; // a negative value indicates an invalid result + adjusted_mantissa() = default; + + constexpr bool operator==(adjusted_mantissa const &o) const { + return mantissa == o.mantissa && power2 == o.power2; + } + + constexpr bool operator!=(adjusted_mantissa const &o) const { + return mantissa != o.mantissa || power2 != o.power2; + } +}; + +// Bias so we can get the real exponent with an invalid adjusted_mantissa. +constexpr static int32_t invalid_am_bias = -0x8000; + +// used for binary_format_lookup_tables::max_mantissa +constexpr uint64_t constant_55555 = 5 * 5 * 5 * 5 * 5; + +template struct binary_format_lookup_tables; + +template struct binary_format : binary_format_lookup_tables { + using equiv_uint = equiv_uint_t; + + static constexpr int mantissa_explicit_bits(); + static constexpr int minimum_exponent(); + static constexpr int infinite_power(); + static constexpr int sign_index(); + static constexpr int + min_exponent_fast_path(); // used when fegetround() == FE_TONEAREST + static constexpr int max_exponent_fast_path(); + static constexpr int max_exponent_round_to_even(); + static constexpr int min_exponent_round_to_even(); + static constexpr uint64_t max_mantissa_fast_path(int64_t power); + static constexpr uint64_t + max_mantissa_fast_path(); // used when fegetround() == FE_TONEAREST + static constexpr int largest_power_of_ten(); + static constexpr int smallest_power_of_ten(); + static constexpr T exact_power_of_ten(int64_t power); + static constexpr size_t max_digits(); + static constexpr equiv_uint exponent_mask(); + static constexpr equiv_uint mantissa_mask(); + static constexpr equiv_uint hidden_bit_mask(); +}; + +template struct binary_format_lookup_tables { + static constexpr double powers_of_ten[] = { + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, + 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22}; + + // Largest integer value v so that (5**index * v) <= 1<<53. + // 0x20000000000000 == 1 << 53 + static constexpr uint64_t max_mantissa[] = { + 0x20000000000000, + 0x20000000000000 / 5, + 0x20000000000000 / (5 * 5), + 0x20000000000000 / (5 * 5 * 5), + 0x20000000000000 / (5 * 5 * 5 * 5), + 0x20000000000000 / (constant_55555), + 0x20000000000000 / (constant_55555 * 5), + 0x20000000000000 / (constant_55555 * 5 * 5), + 0x20000000000000 / (constant_55555 * 5 * 5 * 5), + 0x20000000000000 / (constant_55555 * 5 * 5 * 5 * 5), + 0x20000000000000 / (constant_55555 * constant_55555), + 0x20000000000000 / (constant_55555 * constant_55555 * 5), + 0x20000000000000 / (constant_55555 * constant_55555 * 5 * 5), + 0x20000000000000 / (constant_55555 * constant_55555 * 5 * 5 * 5), + 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555), + 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * 5), + 0x20000000000000 / + (constant_55555 * constant_55555 * constant_55555 * 5 * 5), + 0x20000000000000 / + (constant_55555 * constant_55555 * constant_55555 * 5 * 5 * 5), + 0x20000000000000 / + (constant_55555 * constant_55555 * constant_55555 * 5 * 5 * 5 * 5), + 0x20000000000000 / + (constant_55555 * constant_55555 * constant_55555 * constant_55555), + 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * + constant_55555 * 5), + 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * + constant_55555 * 5 * 5), + 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * + constant_55555 * 5 * 5 * 5), + 0x20000000000000 / (constant_55555 * constant_55555 * constant_55555 * + constant_55555 * 5 * 5 * 5 * 5)}; +}; + +#if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE + +template +constexpr double binary_format_lookup_tables::powers_of_ten[]; + +template +constexpr uint64_t binary_format_lookup_tables::max_mantissa[]; + +#endif + +template struct binary_format_lookup_tables { + static constexpr float powers_of_ten[] = {1e0f, 1e1f, 1e2f, 1e3f, 1e4f, 1e5f, + 1e6f, 1e7f, 1e8f, 1e9f, 1e10f}; + + // Largest integer value v so that (5**index * v) <= 1<<24. + // 0x1000000 == 1<<24 + static constexpr uint64_t max_mantissa[] = { + 0x1000000, + 0x1000000 / 5, + 0x1000000 / (5 * 5), + 0x1000000 / (5 * 5 * 5), + 0x1000000 / (5 * 5 * 5 * 5), + 0x1000000 / (constant_55555), + 0x1000000 / (constant_55555 * 5), + 0x1000000 / (constant_55555 * 5 * 5), + 0x1000000 / (constant_55555 * 5 * 5 * 5), + 0x1000000 / (constant_55555 * 5 * 5 * 5 * 5), + 0x1000000 / (constant_55555 * constant_55555), + 0x1000000 / (constant_55555 * constant_55555 * 5)}; +}; + +#if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE + +template +constexpr float binary_format_lookup_tables::powers_of_ten[]; + +template +constexpr uint64_t binary_format_lookup_tables::max_mantissa[]; + +#endif + +template <> +inline constexpr int binary_format::min_exponent_fast_path() { +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0) + return 0; +#else + return -22; +#endif +} + +template <> +inline constexpr int binary_format::min_exponent_fast_path() { +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0) + return 0; +#else + return -10; +#endif +} + +template <> +inline constexpr int binary_format::mantissa_explicit_bits() { + return 52; +} + +template <> +inline constexpr int binary_format::mantissa_explicit_bits() { + return 23; +} + +template <> +inline constexpr int binary_format::max_exponent_round_to_even() { + return 23; +} + +template <> +inline constexpr int binary_format::max_exponent_round_to_even() { + return 10; +} + +template <> +inline constexpr int binary_format::min_exponent_round_to_even() { + return -4; +} + +template <> +inline constexpr int binary_format::min_exponent_round_to_even() { + return -17; +} + +template <> inline constexpr int binary_format::minimum_exponent() { + return -1023; +} + +template <> inline constexpr int binary_format::minimum_exponent() { + return -127; +} + +template <> inline constexpr int binary_format::infinite_power() { + return 0x7FF; +} + +template <> inline constexpr int binary_format::infinite_power() { + return 0xFF; +} + +template <> inline constexpr int binary_format::sign_index() { + return 63; +} + +template <> inline constexpr int binary_format::sign_index() { + return 31; +} + +template <> +inline constexpr int binary_format::max_exponent_fast_path() { + return 22; +} + +template <> +inline constexpr int binary_format::max_exponent_fast_path() { + return 10; +} + +template <> +inline constexpr uint64_t binary_format::max_mantissa_fast_path() { + return uint64_t(2) << mantissa_explicit_bits(); +} + +template <> +inline constexpr uint64_t binary_format::max_mantissa_fast_path() { + return uint64_t(2) << mantissa_explicit_bits(); +} + +// credit: Jakub Jelínek +#ifdef __STDCPP_FLOAT16_T__ +template struct binary_format_lookup_tables { + static constexpr std::float16_t powers_of_ten[] = {1e0f16, 1e1f16, 1e2f16, + 1e3f16, 1e4f16}; + + // Largest integer value v so that (5**index * v) <= 1<<11. + // 0x800 == 1<<11 + static constexpr uint64_t max_mantissa[] = {0x800, + 0x800 / 5, + 0x800 / (5 * 5), + 0x800 / (5 * 5 * 5), + 0x800 / (5 * 5 * 5 * 5), + 0x800 / (constant_55555)}; +}; + +#if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE + +template +constexpr std::float16_t + binary_format_lookup_tables::powers_of_ten[]; + +template +constexpr uint64_t + binary_format_lookup_tables::max_mantissa[]; + +#endif + +template <> +inline constexpr std::float16_t +binary_format::exact_power_of_ten(int64_t power) { + // Work around clang bug https://godbolt.org/z/zedh7rrhc + return (void)powers_of_ten[0], powers_of_ten[power]; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::exponent_mask() { + return 0x7C00; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::mantissa_mask() { + return 0x03FF; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::hidden_bit_mask() { + return 0x0400; +} + +template <> +inline constexpr int binary_format::max_exponent_fast_path() { + return 4; +} + +template <> +inline constexpr int binary_format::mantissa_explicit_bits() { + return 10; +} + +template <> +inline constexpr uint64_t +binary_format::max_mantissa_fast_path() { + return uint64_t(2) << mantissa_explicit_bits(); +} + +template <> +inline constexpr uint64_t +binary_format::max_mantissa_fast_path(int64_t power) { + // caller is responsible to ensure that + // power >= 0 && power <= 4 + // + // Work around clang bug https://godbolt.org/z/zedh7rrhc + return (void)max_mantissa[0], max_mantissa[power]; +} + +template <> +inline constexpr int binary_format::min_exponent_fast_path() { + return 0; +} + +template <> +inline constexpr int +binary_format::max_exponent_round_to_even() { + return 5; +} + +template <> +inline constexpr int +binary_format::min_exponent_round_to_even() { + return -22; +} + +template <> +inline constexpr int binary_format::minimum_exponent() { + return -15; +} + +template <> +inline constexpr int binary_format::infinite_power() { + return 0x1F; +} + +template <> inline constexpr int binary_format::sign_index() { + return 15; +} + +template <> +inline constexpr int binary_format::largest_power_of_ten() { + return 4; +} + +template <> +inline constexpr int binary_format::smallest_power_of_ten() { + return -27; +} + +template <> +inline constexpr size_t binary_format::max_digits() { + return 22; +} +#endif // __STDCPP_FLOAT16_T__ + +// credit: Jakub Jelínek +#ifdef __STDCPP_BFLOAT16_T__ +template struct binary_format_lookup_tables { + static constexpr std::bfloat16_t powers_of_ten[] = {1e0bf16, 1e1bf16, 1e2bf16, + 1e3bf16}; + + // Largest integer value v so that (5**index * v) <= 1<<8. + // 0x100 == 1<<8 + static constexpr uint64_t max_mantissa[] = {0x100, 0x100 / 5, 0x100 / (5 * 5), + 0x100 / (5 * 5 * 5), + 0x100 / (5 * 5 * 5 * 5)}; +}; + +#if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE + +template +constexpr std::bfloat16_t + binary_format_lookup_tables::powers_of_ten[]; + +template +constexpr uint64_t + binary_format_lookup_tables::max_mantissa[]; + +#endif + +template <> +inline constexpr std::bfloat16_t +binary_format::exact_power_of_ten(int64_t power) { + // Work around clang bug https://godbolt.org/z/zedh7rrhc + return (void)powers_of_ten[0], powers_of_ten[power]; +} + +template <> +inline constexpr int binary_format::max_exponent_fast_path() { + return 3; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::exponent_mask() { + return 0x7F80; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::mantissa_mask() { + return 0x007F; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::hidden_bit_mask() { + return 0x0080; +} + +template <> +inline constexpr int binary_format::mantissa_explicit_bits() { + return 7; +} + +template <> +inline constexpr uint64_t +binary_format::max_mantissa_fast_path() { + return uint64_t(2) << mantissa_explicit_bits(); +} + +template <> +inline constexpr uint64_t +binary_format::max_mantissa_fast_path(int64_t power) { + // caller is responsible to ensure that + // power >= 0 && power <= 3 + // + // Work around clang bug https://godbolt.org/z/zedh7rrhc + return (void)max_mantissa[0], max_mantissa[power]; +} + +template <> +inline constexpr int binary_format::min_exponent_fast_path() { + return 0; +} + +template <> +inline constexpr int +binary_format::max_exponent_round_to_even() { + return 3; +} + +template <> +inline constexpr int +binary_format::min_exponent_round_to_even() { + return -24; +} + +template <> +inline constexpr int binary_format::minimum_exponent() { + return -127; +} + +template <> +inline constexpr int binary_format::infinite_power() { + return 0xFF; +} + +template <> inline constexpr int binary_format::sign_index() { + return 15; +} + +template <> +inline constexpr int binary_format::largest_power_of_ten() { + return 38; +} + +template <> +inline constexpr int binary_format::smallest_power_of_ten() { + return -60; +} + +template <> +inline constexpr size_t binary_format::max_digits() { + return 98; +} +#endif // __STDCPP_BFLOAT16_T__ + +template <> +inline constexpr uint64_t +binary_format::max_mantissa_fast_path(int64_t power) { + // caller is responsible to ensure that + // power >= 0 && power <= 22 + // + // Work around clang bug https://godbolt.org/z/zedh7rrhc + return (void)max_mantissa[0], max_mantissa[power]; +} + +template <> +inline constexpr uint64_t +binary_format::max_mantissa_fast_path(int64_t power) { + // caller is responsible to ensure that + // power >= 0 && power <= 10 + // + // Work around clang bug https://godbolt.org/z/zedh7rrhc + return (void)max_mantissa[0], max_mantissa[power]; +} + +template <> +inline constexpr double +binary_format::exact_power_of_ten(int64_t power) { + // Work around clang bug https://godbolt.org/z/zedh7rrhc + return (void)powers_of_ten[0], powers_of_ten[power]; +} + +template <> +inline constexpr float binary_format::exact_power_of_ten(int64_t power) { + // Work around clang bug https://godbolt.org/z/zedh7rrhc + return (void)powers_of_ten[0], powers_of_ten[power]; +} + +template <> inline constexpr int binary_format::largest_power_of_ten() { + return 308; +} + +template <> inline constexpr int binary_format::largest_power_of_ten() { + return 38; +} + +template <> +inline constexpr int binary_format::smallest_power_of_ten() { + return -342; +} + +template <> inline constexpr int binary_format::smallest_power_of_ten() { + return -64; +} + +template <> inline constexpr size_t binary_format::max_digits() { + return 769; +} + +template <> inline constexpr size_t binary_format::max_digits() { + return 114; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::exponent_mask() { + return 0x7F800000; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::exponent_mask() { + return 0x7FF0000000000000; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::mantissa_mask() { + return 0x007FFFFF; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::mantissa_mask() { + return 0x000FFFFFFFFFFFFF; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::hidden_bit_mask() { + return 0x00800000; +} + +template <> +inline constexpr binary_format::equiv_uint +binary_format::hidden_bit_mask() { + return 0x0010000000000000; +} + +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void +to_float(bool negative, adjusted_mantissa am, T &value) { + using equiv_uint = equiv_uint_t; + equiv_uint word = equiv_uint(am.mantissa); + word = equiv_uint(word | equiv_uint(am.power2) + << binary_format::mantissa_explicit_bits()); + word = + equiv_uint(word | equiv_uint(negative) << binary_format::sign_index()); +#if FASTFLOAT_HAS_BIT_CAST + value = std::bit_cast(word); +#else + ::memcpy(&value, &word, sizeof(T)); +#endif +} + +template struct space_lut { + static constexpr bool value[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +}; + +#if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE + +template constexpr bool space_lut::value[]; + +#endif + +template constexpr bool is_space(UC c) { + return c < 256 && space_lut<>::value[uint8_t(c)]; +} + +template static constexpr uint64_t int_cmp_zeros() { + static_assert((sizeof(UC) == 1) || (sizeof(UC) == 2) || (sizeof(UC) == 4), + "Unsupported character size"); + return (sizeof(UC) == 1) ? 0x3030303030303030 + : (sizeof(UC) == 2) + ? (uint64_t(UC('0')) << 48 | uint64_t(UC('0')) << 32 | + uint64_t(UC('0')) << 16 | UC('0')) + : (uint64_t(UC('0')) << 32 | UC('0')); +} + +template static constexpr int int_cmp_len() { + return sizeof(uint64_t) / sizeof(UC); +} + +template constexpr UC const *str_const_nan(); + +template <> constexpr char const *str_const_nan() { return "nan"; } + +template <> constexpr wchar_t const *str_const_nan() { return L"nan"; } + +template <> constexpr char16_t const *str_const_nan() { + return u"nan"; +} + +template <> constexpr char32_t const *str_const_nan() { + return U"nan"; +} + +#ifdef __cpp_char8_t +template <> constexpr char8_t const *str_const_nan() { + return u8"nan"; +} +#endif + +template constexpr UC const *str_const_inf(); + +template <> constexpr char const *str_const_inf() { return "infinity"; } + +template <> constexpr wchar_t const *str_const_inf() { + return L"infinity"; +} + +template <> constexpr char16_t const *str_const_inf() { + return u"infinity"; +} + +template <> constexpr char32_t const *str_const_inf() { + return U"infinity"; +} + +#ifdef __cpp_char8_t +template <> constexpr char8_t const *str_const_inf() { + return u8"infinity"; +} +#endif + +template struct int_luts { + static constexpr uint8_t chdigit[] = { + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, + 255, 255, 255, 255, 255, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 255, 255, 255, 255, 255, 255, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, + 255}; + + static constexpr size_t maxdigits_u64[] = { + 64, 41, 32, 28, 25, 23, 22, 21, 20, 19, 18, 18, 17, 17, 16, 16, 16, 16, + 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13}; + + static constexpr uint64_t min_safe_u64[] = { + 9223372036854775808ull, 12157665459056928801ull, 4611686018427387904, + 7450580596923828125, 4738381338321616896, 3909821048582988049, + 9223372036854775808ull, 12157665459056928801ull, 10000000000000000000ull, + 5559917313492231481, 2218611106740436992, 8650415919381337933, + 2177953337809371136, 6568408355712890625, 1152921504606846976, + 2862423051509815793, 6746640616477458432, 15181127029874798299ull, + 1638400000000000000, 3243919932521508681, 6221821273427820544, + 11592836324538749809ull, 876488338465357824, 1490116119384765625, + 2481152873203736576, 4052555153018976267, 6502111422497947648, + 10260628712958602189ull, 15943230000000000000ull, 787662783788549761, + 1152921504606846976, 1667889514952984961, 2386420683693101056, + 3379220508056640625, 4738381338321616896}; +}; + +#if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE + +template constexpr uint8_t int_luts::chdigit[]; + +template constexpr size_t int_luts::maxdigits_u64[]; + +template constexpr uint64_t int_luts::min_safe_u64[]; + +#endif + +template +fastfloat_really_inline constexpr uint8_t ch_to_digit(UC c) { + // wchar_t and char can be signed, so we need to be careful. + using UnsignedUC = typename std::make_unsigned::type; + return int_luts<>::chdigit[static_cast( + static_cast(c) & + static_cast( + -((static_cast(c) & ~0xFFull) == 0)))]; +} + +fastfloat_really_inline constexpr size_t max_digits_u64(int base) { + return int_luts<>::maxdigits_u64[base - 2]; +} + +// If a u64 is exactly max_digits_u64() in length, this is +// the value below which it has definitely overflowed. +fastfloat_really_inline constexpr uint64_t min_safe_u64(int base) { + return int_luts<>::min_safe_u64[base - 2]; +} + +static_assert(std::is_same, uint64_t>::value, + "equiv_uint should be uint64_t for double"); +static_assert(std::numeric_limits::is_iec559, + "double must fulfill the requirements of IEC 559 (IEEE 754)"); + +static_assert(std::is_same, uint32_t>::value, + "equiv_uint should be uint32_t for float"); +static_assert(std::numeric_limits::is_iec559, + "float must fulfill the requirements of IEC 559 (IEEE 754)"); + +#ifdef __STDCPP_FLOAT64_T__ +static_assert(std::is_same, uint64_t>::value, + "equiv_uint should be uint64_t for std::float64_t"); +static_assert( + std::numeric_limits::is_iec559, + "std::float64_t must fulfill the requirements of IEC 559 (IEEE 754)"); +#endif // __STDCPP_FLOAT64_T__ + +#ifdef __STDCPP_FLOAT32_T__ +static_assert(std::is_same, uint32_t>::value, + "equiv_uint should be uint32_t for std::float32_t"); +static_assert( + std::numeric_limits::is_iec559, + "std::float32_t must fulfill the requirements of IEC 559 (IEEE 754)"); +#endif // __STDCPP_FLOAT32_T__ + +#ifdef __STDCPP_FLOAT16_T__ +static_assert( + std::is_same::equiv_uint, uint16_t>::value, + "equiv_uint should be uint16_t for std::float16_t"); +static_assert( + std::numeric_limits::is_iec559, + "std::float16_t must fulfill the requirements of IEC 559 (IEEE 754)"); +#endif // __STDCPP_FLOAT16_T__ + +#ifdef __STDCPP_BFLOAT16_T__ +static_assert( + std::is_same::equiv_uint, uint16_t>::value, + "equiv_uint should be uint16_t for std::bfloat16_t"); +static_assert( + std::numeric_limits::is_iec559, + "std::bfloat16_t must fulfill the requirements of IEC 559 (IEEE 754)"); +#endif // __STDCPP_BFLOAT16_T__ + +constexpr chars_format operator~(chars_format rhs) noexcept { + using int_type = std::underlying_type::type; + return static_cast(~static_cast(rhs)); +} + +constexpr chars_format operator&(chars_format lhs, chars_format rhs) noexcept { + using int_type = std::underlying_type::type; + return static_cast(static_cast(lhs) & + static_cast(rhs)); +} + +constexpr chars_format operator|(chars_format lhs, chars_format rhs) noexcept { + using int_type = std::underlying_type::type; + return static_cast(static_cast(lhs) | + static_cast(rhs)); +} + +constexpr chars_format operator^(chars_format lhs, chars_format rhs) noexcept { + using int_type = std::underlying_type::type; + return static_cast(static_cast(lhs) ^ + static_cast(rhs)); +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 chars_format & +operator&=(chars_format &lhs, chars_format rhs) noexcept { + return lhs = (lhs & rhs); +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 chars_format & +operator|=(chars_format &lhs, chars_format rhs) noexcept { + return lhs = (lhs | rhs); +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 chars_format & +operator^=(chars_format &lhs, chars_format rhs) noexcept { + return lhs = (lhs ^ rhs); +} + +namespace detail { +// adjust for deprecated feature macros +constexpr chars_format adjust_for_feature_macros(chars_format fmt) { + return fmt +#ifdef FASTFLOAT_ALLOWS_LEADING_PLUS + | chars_format::allow_leading_plus +#endif +#ifdef FASTFLOAT_SKIP_WHITE_SPACE + | chars_format::skip_white_space +#endif + ; +} +} // namespace detail + +} // namespace fast_float + +#endif + + +#ifndef FASTFLOAT_FAST_FLOAT_H +#define FASTFLOAT_FAST_FLOAT_H + + +namespace fast_float { +/** + * This function parses the character sequence [first,last) for a number. It + * parses floating-point numbers expecting a locale-indepent format equivalent + * to what is used by std::strtod in the default ("C") locale. The resulting + * floating-point value is the closest floating-point values (using either float + * or double), using the "round to even" convention for values that would + * otherwise fall right in-between two values. That is, we provide exact parsing + * according to the IEEE standard. + * + * Given a successful parse, the pointer (`ptr`) in the returned value is set to + * point right after the parsed number, and the `value` referenced is set to the + * parsed value. In case of error, the returned `ec` contains a representative + * error, otherwise the default (`std::errc()`) value is stored. + * + * The implementation does not throw and does not allocate memory (e.g., with + * `new` or `malloc`). + * + * Like the C++17 standard, the `fast_float::from_chars` functions take an + * optional last argument of the type `fast_float::chars_format`. It is a bitset + * value: we check whether `fmt & fast_float::chars_format::fixed` and `fmt & + * fast_float::chars_format::scientific` are set to determine whether we allow + * the fixed point and scientific notation respectively. The default is + * `fast_float::chars_format::general` which allows both `fixed` and + * `scientific`. + */ +template ::value)> +FASTFLOAT_CONSTEXPR20 from_chars_result_t +from_chars(UC const *first, UC const *last, T &value, + chars_format fmt = chars_format::general) noexcept; + +/** + * Like from_chars, but accepts an `options` argument to govern number parsing. + * Both for floating-point types and integer types. + */ +template +FASTFLOAT_CONSTEXPR20 from_chars_result_t +from_chars_advanced(UC const *first, UC const *last, T &value, + parse_options_t options) noexcept; + +/** + * This function multiplies an integer number by a power of 10 and returns + * the result as a double precision floating-point value that is correctly + * rounded. The resulting floating-point value is the closest floating-point + * value, using the "round to nearest, tie to even" convention for values that + * would otherwise fall right in-between two values. That is, we provide exact + * conversion according to the IEEE standard. + * + * On overflow infinity is returned, on underflow 0 is returned. + * + * The implementation does not throw and does not allocate memory (e.g., with + * `new` or `malloc`). + */ +FASTFLOAT_CONSTEXPR20 inline double +integer_times_pow10(uint64_t mantissa, int decimal_exponent) noexcept; +FASTFLOAT_CONSTEXPR20 inline double +integer_times_pow10(int64_t mantissa, int decimal_exponent) noexcept; + +/** + * from_chars for integer types. + */ +template ::value)> +FASTFLOAT_CONSTEXPR20 from_chars_result_t +from_chars(UC const *first, UC const *last, T &value, int base = 10) noexcept; + +} // namespace fast_float + +#endif // FASTFLOAT_FAST_FLOAT_H + +#ifndef FASTFLOAT_ASCII_NUMBER_H +#define FASTFLOAT_ASCII_NUMBER_H + +#include +#include +#include +#include +#include +#include + + +#ifdef FASTFLOAT_SSE2 +#include +#endif + +#ifdef FASTFLOAT_NEON +#include +#endif + +namespace fast_float { + +template fastfloat_really_inline constexpr bool has_simd_opt() { +#ifdef FASTFLOAT_HAS_SIMD + return std::is_same::value; +#else + return false; +#endif +} + +// Next function can be micro-optimized, but compilers are entirely +// able to optimize it well. +template +fastfloat_really_inline constexpr bool is_integer(UC c) noexcept { + return !(c > UC('9') || c < UC('0')); +} + +fastfloat_really_inline constexpr uint64_t byteswap(uint64_t val) { + return (val & 0xFF00000000000000) >> 56 | (val & 0x00FF000000000000) >> 40 | + (val & 0x0000FF0000000000) >> 24 | (val & 0x000000FF00000000) >> 8 | + (val & 0x00000000FF000000) << 8 | (val & 0x0000000000FF0000) << 24 | + (val & 0x000000000000FF00) << 40 | (val & 0x00000000000000FF) << 56; +} + +// Read 8 UC into a u64. Truncates UC if not char. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t +read8_to_u64(UC const *chars) { + if (cpp20_and_in_constexpr() || !std::is_same::value) { + uint64_t val = 0; + for (int i = 0; i < 8; ++i) { + val |= uint64_t(uint8_t(*chars)) << (i * 8); + ++chars; + } + return val; + } + uint64_t val; + ::memcpy(&val, chars, sizeof(uint64_t)); +#if FASTFLOAT_IS_BIG_ENDIAN == 1 + // Need to read as-if the number was in little-endian order. + val = byteswap(val); +#endif + return val; +} + +#ifdef FASTFLOAT_SSE2 + +fastfloat_really_inline uint64_t simd_read8_to_u64(__m128i const data) { + FASTFLOAT_SIMD_DISABLE_WARNINGS + __m128i const packed = _mm_packus_epi16(data, data); +#ifdef FASTFLOAT_64BIT + return uint64_t(_mm_cvtsi128_si64(packed)); +#else + uint64_t value; + // Visual Studio + older versions of GCC don't support _mm_storeu_si64 + _mm_storel_epi64(reinterpret_cast<__m128i *>(&value), packed); + return value; +#endif + FASTFLOAT_SIMD_RESTORE_WARNINGS +} + +fastfloat_really_inline uint64_t simd_read8_to_u64(char16_t const *chars) { + FASTFLOAT_SIMD_DISABLE_WARNINGS + return simd_read8_to_u64( + _mm_loadu_si128(reinterpret_cast<__m128i const *>(chars))); + FASTFLOAT_SIMD_RESTORE_WARNINGS +} + +#elif defined(FASTFLOAT_NEON) + +fastfloat_really_inline uint64_t simd_read8_to_u64(uint16x8_t const data) { + FASTFLOAT_SIMD_DISABLE_WARNINGS + uint8x8_t utf8_packed = vmovn_u16(data); + return vget_lane_u64(vreinterpret_u64_u8(utf8_packed), 0); + FASTFLOAT_SIMD_RESTORE_WARNINGS +} + +fastfloat_really_inline uint64_t simd_read8_to_u64(char16_t const *chars) { + FASTFLOAT_SIMD_DISABLE_WARNINGS + return simd_read8_to_u64( + vld1q_u16(reinterpret_cast(chars))); + FASTFLOAT_SIMD_RESTORE_WARNINGS +} + +#endif // FASTFLOAT_SSE2 + +// MSVC SFINAE is broken pre-VS2017 +#if defined(_MSC_VER) && _MSC_VER <= 1900 +template +#else +template ()) = 0> +#endif +// dummy for compile +uint64_t simd_read8_to_u64(UC const *) { + return 0; +} + +// credit @aqrit +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 uint32_t +parse_eight_digits_unrolled(uint64_t val) { + uint64_t const mask = 0x000000FF000000FF; + uint64_t const mul1 = 0x000F424000000064; // 100 + (1000000ULL << 32) + uint64_t const mul2 = 0x0000271000000001; // 1 + (10000ULL << 32) + val -= 0x3030303030303030; + val = (val * 10) + (val >> 8); // val = (val * 2561) >> 8; + val = (((val & mask) * mul1) + (((val >> 16) & mask) * mul2)) >> 32; + return uint32_t(val); +} + +// Call this if chars are definitely 8 digits. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint32_t +parse_eight_digits_unrolled(UC const *chars) noexcept { + if (cpp20_and_in_constexpr() || !has_simd_opt()) { + return parse_eight_digits_unrolled(read8_to_u64(chars)); // truncation okay + } + return parse_eight_digits_unrolled(simd_read8_to_u64(chars)); +} + +// credit @aqrit +fastfloat_really_inline constexpr bool +is_made_of_eight_digits_fast(uint64_t val) noexcept { + return !((((val + 0x4646464646464646) | (val - 0x3030303030303030)) & + 0x8080808080808080)); +} + +#ifdef FASTFLOAT_HAS_SIMD + +// Call this if chars might not be 8 digits. +// Using this style (instead of is_made_of_eight_digits_fast() then +// parse_eight_digits_unrolled()) ensures we don't load SIMD registers twice. +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool +simd_parse_if_eight_digits_unrolled(char16_t const *chars, + uint64_t &i) noexcept { + if (cpp20_and_in_constexpr()) { + return false; + } +#ifdef FASTFLOAT_SSE2 + FASTFLOAT_SIMD_DISABLE_WARNINGS + __m128i const data = + _mm_loadu_si128(reinterpret_cast<__m128i const *>(chars)); + + // (x - '0') <= 9 + // http://0x80.pl/articles/simd-parsing-int-sequences.html + __m128i const t0 = _mm_add_epi16(data, _mm_set1_epi16(32720)); + __m128i const t1 = _mm_cmpgt_epi16(t0, _mm_set1_epi16(-32759)); + + if (_mm_movemask_epi8(t1) == 0) { + i = i * 100000000 + parse_eight_digits_unrolled(simd_read8_to_u64(data)); + return true; + } else + return false; + FASTFLOAT_SIMD_RESTORE_WARNINGS +#elif defined(FASTFLOAT_NEON) + FASTFLOAT_SIMD_DISABLE_WARNINGS + uint16x8_t const data = vld1q_u16(reinterpret_cast(chars)); + + // (x - '0') <= 9 + // http://0x80.pl/articles/simd-parsing-int-sequences.html + uint16x8_t const t0 = vsubq_u16(data, vmovq_n_u16('0')); + uint16x8_t const mask = vcltq_u16(t0, vmovq_n_u16('9' - '0' + 1)); + + if (vminvq_u16(mask) == 0xFFFF) { + i = i * 100000000 + parse_eight_digits_unrolled(simd_read8_to_u64(data)); + return true; + } else + return false; + FASTFLOAT_SIMD_RESTORE_WARNINGS +#else + (void)chars; + (void)i; + return false; +#endif // FASTFLOAT_SSE2 +} + +#endif // FASTFLOAT_HAS_SIMD + +// MSVC SFINAE is broken pre-VS2017 +#if defined(_MSC_VER) && _MSC_VER <= 1900 +template +#else +template ()) = 0> +#endif +// dummy for compile +bool simd_parse_if_eight_digits_unrolled(UC const *, uint64_t &) { + return 0; +} + +template ::value) = 0> +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void +loop_parse_if_eight_digits(UC const *&p, UC const *const pend, uint64_t &i) { + if (!has_simd_opt()) { + return; + } + while ((std::distance(p, pend) >= 8) && + simd_parse_if_eight_digits_unrolled( + p, i)) { // in rare cases, this will overflow, but that's ok + p += 8; + } +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void +loop_parse_if_eight_digits(char const *&p, char const *const pend, + uint64_t &i) { + // optimizes better than parse_if_eight_digits_unrolled() for UC = char. + while ((std::distance(p, pend) >= 8) && + is_made_of_eight_digits_fast(read8_to_u64(p))) { + i = i * 100000000 + + parse_eight_digits_unrolled(read8_to_u64( + p)); // in rare cases, this will overflow, but that's ok + p += 8; + } +} + +enum class parse_error { + no_error, + // [JSON-only] The minus sign must be followed by an integer. + missing_integer_after_sign, + // A sign must be followed by an integer or dot. + missing_integer_or_dot_after_sign, + // [JSON-only] The integer part must not have leading zeros. + leading_zeros_in_integer_part, + // [JSON-only] The integer part must have at least one digit. + no_digits_in_integer_part, + // [JSON-only] If there is a decimal point, there must be digits in the + // fractional part. + no_digits_in_fractional_part, + // The mantissa must have at least one digit. + no_digits_in_mantissa, + // Scientific notation requires an exponential part. + missing_exponential_part, +}; + +template struct parsed_number_string_t { + int64_t exponent{0}; + uint64_t mantissa{0}; + UC const *lastmatch{nullptr}; + bool negative{false}; + bool valid{false}; + bool too_many_digits{false}; + // contains the range of the significant digits + span integer{}; // non-nullable + span fraction{}; // nullable + parse_error error{parse_error::no_error}; +}; + +using byte_span = span; +using parsed_number_string = parsed_number_string_t; + +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 parsed_number_string_t +report_parse_error(UC const *p, parse_error error) { + parsed_number_string_t answer; + answer.valid = false; + answer.lastmatch = p; + answer.error = error; + return answer; +} + +// Assuming that you use no more than 19 digits, this will +// parse an ASCII string. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 parsed_number_string_t +parse_number_string(UC const *p, UC const *pend, + parse_options_t options) noexcept { + chars_format const fmt = detail::adjust_for_feature_macros(options.format); + UC const decimal_point = options.decimal_point; + + parsed_number_string_t answer; + answer.valid = false; + answer.too_many_digits = false; + // assume p < pend, so dereference without checks; + answer.negative = (*p == UC('-')); + // C++17 20.19.3.(7.1) explicitly forbids '+' sign here + if ((*p == UC('-')) || (uint64_t(fmt & chars_format::allow_leading_plus) && + !basic_json_fmt && *p == UC('+'))) { + ++p; + if (p == pend) { + return report_parse_error( + p, parse_error::missing_integer_or_dot_after_sign); + } + FASTFLOAT_IF_CONSTEXPR17(basic_json_fmt) { + if (!is_integer(*p)) { // a sign must be followed by an integer + return report_parse_error(p, + parse_error::missing_integer_after_sign); + } + } + else { + if (!is_integer(*p) && + (*p != + decimal_point)) { // a sign must be followed by an integer or the dot + return report_parse_error( + p, parse_error::missing_integer_or_dot_after_sign); + } + } + } + UC const *const start_digits = p; + + uint64_t i = 0; // an unsigned int avoids signed overflows (which are bad) + + while ((p != pend) && is_integer(*p)) { + // a multiplication by 10 is cheaper than an arbitrary integer + // multiplication + i = 10 * i + + uint64_t(*p - + UC('0')); // might overflow, we will handle the overflow later + ++p; + } + UC const *const end_of_integer_part = p; + int64_t digit_count = int64_t(end_of_integer_part - start_digits); + answer.integer = span(start_digits, size_t(digit_count)); + FASTFLOAT_IF_CONSTEXPR17(basic_json_fmt) { + // at least 1 digit in integer part, without leading zeros + if (digit_count == 0) { + return report_parse_error(p, parse_error::no_digits_in_integer_part); + } + if ((start_digits[0] == UC('0') && digit_count > 1)) { + return report_parse_error(start_digits, + parse_error::leading_zeros_in_integer_part); + } + } + + int64_t exponent = 0; + bool const has_decimal_point = (p != pend) && (*p == decimal_point); + if (has_decimal_point) { + ++p; + UC const *before = p; + // can occur at most twice without overflowing, but let it occur more, since + // for integers with many digits, digit parsing is the primary bottleneck. + loop_parse_if_eight_digits(p, pend, i); + + while ((p != pend) && is_integer(*p)) { + uint8_t digit = uint8_t(*p - UC('0')); + ++p; + i = i * 10 + digit; // in rare cases, this will overflow, but that's ok + } + exponent = before - p; + answer.fraction = span(before, size_t(p - before)); + digit_count -= exponent; + } + FASTFLOAT_IF_CONSTEXPR17(basic_json_fmt) { + // at least 1 digit in fractional part + if (has_decimal_point && exponent == 0) { + return report_parse_error(p, + parse_error::no_digits_in_fractional_part); + } + } + else if (digit_count == 0) { // we must have encountered at least one integer! + return report_parse_error(p, parse_error::no_digits_in_mantissa); + } + int64_t exp_number = 0; // explicit exponential part + if ((uint64_t(fmt & chars_format::scientific) && (p != pend) && + ((UC('e') == *p) || (UC('E') == *p))) || + (uint64_t(fmt & detail::basic_fortran_fmt) && (p != pend) && + ((UC('+') == *p) || (UC('-') == *p) || (UC('d') == *p) || + (UC('D') == *p)))) { + UC const *location_of_e = p; + if ((UC('e') == *p) || (UC('E') == *p) || (UC('d') == *p) || + (UC('D') == *p)) { + ++p; + } + bool neg_exp = false; + if ((p != pend) && (UC('-') == *p)) { + neg_exp = true; + ++p; + } else if ((p != pend) && + (UC('+') == + *p)) { // '+' on exponent is allowed by C++17 20.19.3.(7.1) + ++p; + } + if ((p == pend) || !is_integer(*p)) { + if (!uint64_t(fmt & chars_format::fixed)) { + // The exponential part is invalid for scientific notation, so it must + // be a trailing token for fixed notation. However, fixed notation is + // disabled, so report a scientific notation error. + return report_parse_error(p, parse_error::missing_exponential_part); + } + // Otherwise, we will be ignoring the 'e'. + p = location_of_e; + } else { + while ((p != pend) && is_integer(*p)) { + uint8_t digit = uint8_t(*p - UC('0')); + if (exp_number < 0x10000000) { + exp_number = 10 * exp_number + digit; + } + ++p; + } + if (neg_exp) { + exp_number = -exp_number; + } + exponent += exp_number; + } + } else { + // If it scientific and not fixed, we have to bail out. + if (uint64_t(fmt & chars_format::scientific) && + !uint64_t(fmt & chars_format::fixed)) { + return report_parse_error(p, parse_error::missing_exponential_part); + } + } + answer.lastmatch = p; + answer.valid = true; + + // If we frequently had to deal with long strings of digits, + // we could extend our code by using a 128-bit integer instead + // of a 64-bit integer. However, this is uncommon. + // + // We can deal with up to 19 digits. + if (digit_count > 19) { // this is uncommon + // It is possible that the integer had an overflow. + // We have to handle the case where we have 0.0000somenumber. + // We need to be mindful of the case where we only have zeroes... + // E.g., 0.000000000...000. + UC const *start = start_digits; + while ((start != pend) && (*start == UC('0') || *start == decimal_point)) { + if (*start == UC('0')) { + digit_count--; + } + start++; + } + + if (digit_count > 19) { + answer.too_many_digits = true; + // Let us start again, this time, avoiding overflows. + // We don't need to call if is_integer, since we use the + // pre-tokenized spans from above. + i = 0; + p = answer.integer.ptr; + UC const *int_end = p + answer.integer.len(); + uint64_t const minimal_nineteen_digit_integer{1000000000000000000}; + while ((i < minimal_nineteen_digit_integer) && (p != int_end)) { + i = i * 10 + uint64_t(*p - UC('0')); + ++p; + } + if (i >= minimal_nineteen_digit_integer) { // We have a big integer + exponent = end_of_integer_part - p + exp_number; + } else { // We have a value with a fractional component. + p = answer.fraction.ptr; + UC const *frac_end = p + answer.fraction.len(); + while ((i < minimal_nineteen_digit_integer) && (p != frac_end)) { + i = i * 10 + uint64_t(*p - UC('0')); + ++p; + } + exponent = answer.fraction.ptr - p + exp_number; + } + // We have now corrected both exponent and i, to a truncated value + } + } + answer.exponent = exponent; + answer.mantissa = i; + return answer; +} + +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 from_chars_result_t +parse_int_string(UC const *p, UC const *pend, T &value, + parse_options_t options) { + chars_format const fmt = detail::adjust_for_feature_macros(options.format); + int const base = options.base; + + from_chars_result_t answer; + + UC const *const first = p; + + bool const negative = (*p == UC('-')); +#ifdef FASTFLOAT_VISUAL_STUDIO +#pragma warning(push) +#pragma warning(disable : 4127) +#endif + if (!std::is_signed::value && negative) { +#ifdef FASTFLOAT_VISUAL_STUDIO +#pragma warning(pop) +#endif + answer.ec = std::errc::invalid_argument; + answer.ptr = first; + return answer; + } + if ((*p == UC('-')) || + (uint64_t(fmt & chars_format::allow_leading_plus) && (*p == UC('+')))) { + ++p; + } + + UC const *const start_num = p; + + while (p != pend && *p == UC('0')) { + ++p; + } + + bool const has_leading_zeros = p > start_num; + + UC const *const start_digits = p; + + uint64_t i = 0; + if (base == 10) { + loop_parse_if_eight_digits(p, pend, i); // use SIMD if possible + } + while (p != pend) { + uint8_t digit = ch_to_digit(*p); + if (digit >= base) { + break; + } + i = uint64_t(base) * i + digit; // might overflow, check this later + p++; + } + + size_t digit_count = size_t(p - start_digits); + + if (digit_count == 0) { + if (has_leading_zeros) { + value = 0; + answer.ec = std::errc(); + answer.ptr = p; + } else { + answer.ec = std::errc::invalid_argument; + answer.ptr = first; + } + return answer; + } + + answer.ptr = p; + + // check u64 overflow + size_t max_digits = max_digits_u64(base); + if (digit_count > max_digits) { + answer.ec = std::errc::result_out_of_range; + return answer; + } + // this check can be eliminated for all other types, but they will all require + // a max_digits(base) equivalent + if (digit_count == max_digits && i < min_safe_u64(base)) { + answer.ec = std::errc::result_out_of_range; + return answer; + } + + // check other types overflow + if (!std::is_same::value) { + if (i > uint64_t(std::numeric_limits::max()) + uint64_t(negative)) { + answer.ec = std::errc::result_out_of_range; + return answer; + } + } + + if (negative) { +#ifdef FASTFLOAT_VISUAL_STUDIO +#pragma warning(push) +#pragma warning(disable : 4146) +#endif + // this weird workaround is required because: + // - converting unsigned to signed when its value is greater than signed max + // is UB pre-C++23. + // - reinterpret_casting (~i + 1) would work, but it is not constexpr + // this is always optimized into a neg instruction (note: T is an integer + // type) + value = T(-std::numeric_limits::max() - + T(i - uint64_t(std::numeric_limits::max()))); +#ifdef FASTFLOAT_VISUAL_STUDIO +#pragma warning(pop) +#endif + } else { + value = T(i); + } + + answer.ec = std::errc(); + return answer; +} + +} // namespace fast_float + +#endif + +#ifndef FASTFLOAT_FAST_TABLE_H +#define FASTFLOAT_FAST_TABLE_H + +#include + +namespace fast_float { + +/** + * When mapping numbers from decimal to binary, + * we go from w * 10^q to m * 2^p but we have + * 10^q = 5^q * 2^q, so effectively + * we are trying to match + * w * 2^q * 5^q to m * 2^p. Thus the powers of two + * are not a concern since they can be represented + * exactly using the binary notation, only the powers of five + * affect the binary significand. + */ + +/** + * The smallest non-zero float (binary64) is 2^-1074. + * We take as input numbers of the form w x 10^q where w < 2^64. + * We have that w * 10^-343 < 2^(64-344) 5^-343 < 2^-1076. + * However, we have that + * (2^64-1) * 10^-342 = (2^64-1) * 2^-342 * 5^-342 > 2^-1074. + * Thus it is possible for a number of the form w * 10^-342 where + * w is a 64-bit value to be a non-zero floating-point number. + ********* + * Any number of form w * 10^309 where w>= 1 is going to be + * infinite in binary64 so we never need to worry about powers + * of 5 greater than 308. + */ +template struct powers_template { + + constexpr static int smallest_power_of_five = + binary_format::smallest_power_of_ten(); + constexpr static int largest_power_of_five = + binary_format::largest_power_of_ten(); + constexpr static int number_of_entries = + 2 * (largest_power_of_five - smallest_power_of_five + 1); + // Powers of five from 5^-342 all the way to 5^308 rounded toward one. + constexpr static uint64_t power_of_five_128[number_of_entries] = { + 0xeef453d6923bd65a, 0x113faa2906a13b3f, + 0x9558b4661b6565f8, 0x4ac7ca59a424c507, + 0xbaaee17fa23ebf76, 0x5d79bcf00d2df649, + 0xe95a99df8ace6f53, 0xf4d82c2c107973dc, + 0x91d8a02bb6c10594, 0x79071b9b8a4be869, + 0xb64ec836a47146f9, 0x9748e2826cdee284, + 0xe3e27a444d8d98b7, 0xfd1b1b2308169b25, + 0x8e6d8c6ab0787f72, 0xfe30f0f5e50e20f7, + 0xb208ef855c969f4f, 0xbdbd2d335e51a935, + 0xde8b2b66b3bc4723, 0xad2c788035e61382, + 0x8b16fb203055ac76, 0x4c3bcb5021afcc31, + 0xaddcb9e83c6b1793, 0xdf4abe242a1bbf3d, + 0xd953e8624b85dd78, 0xd71d6dad34a2af0d, + 0x87d4713d6f33aa6b, 0x8672648c40e5ad68, + 0xa9c98d8ccb009506, 0x680efdaf511f18c2, + 0xd43bf0effdc0ba48, 0x212bd1b2566def2, + 0x84a57695fe98746d, 0x14bb630f7604b57, + 0xa5ced43b7e3e9188, 0x419ea3bd35385e2d, + 0xcf42894a5dce35ea, 0x52064cac828675b9, + 0x818995ce7aa0e1b2, 0x7343efebd1940993, + 0xa1ebfb4219491a1f, 0x1014ebe6c5f90bf8, + 0xca66fa129f9b60a6, 0xd41a26e077774ef6, + 0xfd00b897478238d0, 0x8920b098955522b4, + 0x9e20735e8cb16382, 0x55b46e5f5d5535b0, + 0xc5a890362fddbc62, 0xeb2189f734aa831d, + 0xf712b443bbd52b7b, 0xa5e9ec7501d523e4, + 0x9a6bb0aa55653b2d, 0x47b233c92125366e, + 0xc1069cd4eabe89f8, 0x999ec0bb696e840a, + 0xf148440a256e2c76, 0xc00670ea43ca250d, + 0x96cd2a865764dbca, 0x380406926a5e5728, + 0xbc807527ed3e12bc, 0xc605083704f5ecf2, + 0xeba09271e88d976b, 0xf7864a44c633682e, + 0x93445b8731587ea3, 0x7ab3ee6afbe0211d, + 0xb8157268fdae9e4c, 0x5960ea05bad82964, + 0xe61acf033d1a45df, 0x6fb92487298e33bd, + 0x8fd0c16206306bab, 0xa5d3b6d479f8e056, + 0xb3c4f1ba87bc8696, 0x8f48a4899877186c, + 0xe0b62e2929aba83c, 0x331acdabfe94de87, + 0x8c71dcd9ba0b4925, 0x9ff0c08b7f1d0b14, + 0xaf8e5410288e1b6f, 0x7ecf0ae5ee44dd9, + 0xdb71e91432b1a24a, 0xc9e82cd9f69d6150, + 0x892731ac9faf056e, 0xbe311c083a225cd2, + 0xab70fe17c79ac6ca, 0x6dbd630a48aaf406, + 0xd64d3d9db981787d, 0x92cbbccdad5b108, + 0x85f0468293f0eb4e, 0x25bbf56008c58ea5, + 0xa76c582338ed2621, 0xaf2af2b80af6f24e, + 0xd1476e2c07286faa, 0x1af5af660db4aee1, + 0x82cca4db847945ca, 0x50d98d9fc890ed4d, + 0xa37fce126597973c, 0xe50ff107bab528a0, + 0xcc5fc196fefd7d0c, 0x1e53ed49a96272c8, + 0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7a, + 0x9faacf3df73609b1, 0x77b191618c54e9ac, + 0xc795830d75038c1d, 0xd59df5b9ef6a2417, + 0xf97ae3d0d2446f25, 0x4b0573286b44ad1d, + 0x9becce62836ac577, 0x4ee367f9430aec32, + 0xc2e801fb244576d5, 0x229c41f793cda73f, + 0xf3a20279ed56d48a, 0x6b43527578c1110f, + 0x9845418c345644d6, 0x830a13896b78aaa9, + 0xbe5691ef416bd60c, 0x23cc986bc656d553, + 0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa8, + 0x94b3a202eb1c3f39, 0x7bf7d71432f3d6a9, + 0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc53, + 0xe858ad248f5c22c9, 0xd1b3400f8f9cff68, + 0x91376c36d99995be, 0x23100809b9c21fa1, + 0xb58547448ffffb2d, 0xabd40a0c2832a78a, + 0xe2e69915b3fff9f9, 0x16c90c8f323f516c, + 0x8dd01fad907ffc3b, 0xae3da7d97f6792e3, + 0xb1442798f49ffb4a, 0x99cd11cfdf41779c, + 0xdd95317f31c7fa1d, 0x40405643d711d583, + 0x8a7d3eef7f1cfc52, 0x482835ea666b2572, + 0xad1c8eab5ee43b66, 0xda3243650005eecf, + 0xd863b256369d4a40, 0x90bed43e40076a82, + 0x873e4f75e2224e68, 0x5a7744a6e804a291, + 0xa90de3535aaae202, 0x711515d0a205cb36, + 0xd3515c2831559a83, 0xd5a5b44ca873e03, + 0x8412d9991ed58091, 0xe858790afe9486c2, + 0xa5178fff668ae0b6, 0x626e974dbe39a872, + 0xce5d73ff402d98e3, 0xfb0a3d212dc8128f, + 0x80fa687f881c7f8e, 0x7ce66634bc9d0b99, + 0xa139029f6a239f72, 0x1c1fffc1ebc44e80, + 0xc987434744ac874e, 0xa327ffb266b56220, + 0xfbe9141915d7a922, 0x4bf1ff9f0062baa8, + 0x9d71ac8fada6c9b5, 0x6f773fc3603db4a9, + 0xc4ce17b399107c22, 0xcb550fb4384d21d3, + 0xf6019da07f549b2b, 0x7e2a53a146606a48, + 0x99c102844f94e0fb, 0x2eda7444cbfc426d, + 0xc0314325637a1939, 0xfa911155fefb5308, + 0xf03d93eebc589f88, 0x793555ab7eba27ca, + 0x96267c7535b763b5, 0x4bc1558b2f3458de, + 0xbbb01b9283253ca2, 0x9eb1aaedfb016f16, + 0xea9c227723ee8bcb, 0x465e15a979c1cadc, + 0x92a1958a7675175f, 0xbfacd89ec191ec9, + 0xb749faed14125d36, 0xcef980ec671f667b, + 0xe51c79a85916f484, 0x82b7e12780e7401a, + 0x8f31cc0937ae58d2, 0xd1b2ecb8b0908810, + 0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa15, + 0xdfbdcece67006ac9, 0x67a791e093e1d49a, + 0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e0, + 0xaecc49914078536d, 0x58fae9f773886e18, + 0xda7f5bf590966848, 0xaf39a475506a899e, + 0x888f99797a5e012d, 0x6d8406c952429603, + 0xaab37fd7d8f58178, 0xc8e5087ba6d33b83, + 0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a64, + 0x855c3be0a17fcd26, 0x5cf2eea09a55067f, + 0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481e, + 0xd0601d8efc57b08b, 0xf13b94daf124da26, + 0x823c12795db6ce57, 0x76c53d08d6b70858, + 0xa2cb1717b52481ed, 0x54768c4b0c64ca6e, + 0xcb7ddcdda26da268, 0xa9942f5dcf7dfd09, + 0xfe5d54150b090b02, 0xd3f93b35435d7c4c, + 0x9efa548d26e5a6e1, 0xc47bc5014a1a6daf, + 0xc6b8e9b0709f109a, 0x359ab6419ca1091b, + 0xf867241c8cc6d4c0, 0xc30163d203c94b62, + 0x9b407691d7fc44f8, 0x79e0de63425dcf1d, + 0xc21094364dfb5636, 0x985915fc12f542e4, + 0xf294b943e17a2bc4, 0x3e6f5b7b17b2939d, + 0x979cf3ca6cec5b5a, 0xa705992ceecf9c42, + 0xbd8430bd08277231, 0x50c6ff782a838353, + 0xece53cec4a314ebd, 0xa4f8bf5635246428, + 0x940f4613ae5ed136, 0x871b7795e136be99, + 0xb913179899f68584, 0x28e2557b59846e3f, + 0xe757dd7ec07426e5, 0x331aeada2fe589cf, + 0x9096ea6f3848984f, 0x3ff0d2c85def7621, + 0xb4bca50b065abe63, 0xfed077a756b53a9, + 0xe1ebce4dc7f16dfb, 0xd3e8495912c62894, + 0x8d3360f09cf6e4bd, 0x64712dd7abbbd95c, + 0xb080392cc4349dec, 0xbd8d794d96aacfb3, + 0xdca04777f541c567, 0xecf0d7a0fc5583a0, + 0x89e42caaf9491b60, 0xf41686c49db57244, + 0xac5d37d5b79b6239, 0x311c2875c522ced5, + 0xd77485cb25823ac7, 0x7d633293366b828b, + 0x86a8d39ef77164bc, 0xae5dff9c02033197, + 0xa8530886b54dbdeb, 0xd9f57f830283fdfc, + 0xd267caa862a12d66, 0xd072df63c324fd7b, + 0x8380dea93da4bc60, 0x4247cb9e59f71e6d, + 0xa46116538d0deb78, 0x52d9be85f074e608, + 0xcd795be870516656, 0x67902e276c921f8b, + 0x806bd9714632dff6, 0xba1cd8a3db53b6, + 0xa086cfcd97bf97f3, 0x80e8a40eccd228a4, + 0xc8a883c0fdaf7df0, 0x6122cd128006b2cd, + 0xfad2a4b13d1b5d6c, 0x796b805720085f81, + 0x9cc3a6eec6311a63, 0xcbe3303674053bb0, + 0xc3f490aa77bd60fc, 0xbedbfc4411068a9c, + 0xf4f1b4d515acb93b, 0xee92fb5515482d44, + 0x991711052d8bf3c5, 0x751bdd152d4d1c4a, + 0xbf5cd54678eef0b6, 0xd262d45a78a0635d, + 0xef340a98172aace4, 0x86fb897116c87c34, + 0x9580869f0e7aac0e, 0xd45d35e6ae3d4da0, + 0xbae0a846d2195712, 0x8974836059cca109, + 0xe998d258869facd7, 0x2bd1a438703fc94b, + 0x91ff83775423cc06, 0x7b6306a34627ddcf, + 0xb67f6455292cbf08, 0x1a3bc84c17b1d542, + 0xe41f3d6a7377eeca, 0x20caba5f1d9e4a93, + 0x8e938662882af53e, 0x547eb47b7282ee9c, + 0xb23867fb2a35b28d, 0xe99e619a4f23aa43, + 0xdec681f9f4c31f31, 0x6405fa00e2ec94d4, + 0x8b3c113c38f9f37e, 0xde83bc408dd3dd04, + 0xae0b158b4738705e, 0x9624ab50b148d445, + 0xd98ddaee19068c76, 0x3badd624dd9b0957, + 0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d6, + 0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4c, + 0xd47487cc8470652b, 0x7647c3200069671f, + 0x84c8d4dfd2c63f3b, 0x29ecd9f40041e073, + 0xa5fb0a17c777cf09, 0xf468107100525890, + 0xcf79cc9db955c2cc, 0x7182148d4066eeb4, + 0x81ac1fe293d599bf, 0xc6f14cd848405530, + 0xa21727db38cb002f, 0xb8ada00e5a506a7c, + 0xca9cf1d206fdc03b, 0xa6d90811f0e4851c, + 0xfd442e4688bd304a, 0x908f4a166d1da663, + 0x9e4a9cec15763e2e, 0x9a598e4e043287fe, + 0xc5dd44271ad3cdba, 0x40eff1e1853f29fd, + 0xf7549530e188c128, 0xd12bee59e68ef47c, + 0x9a94dd3e8cf578b9, 0x82bb74f8301958ce, + 0xc13a148e3032d6e7, 0xe36a52363c1faf01, + 0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac1, + 0x96f5600f15a7b7e5, 0x29ab103a5ef8c0b9, + 0xbcb2b812db11a5de, 0x7415d448f6b6f0e7, + 0xebdf661791d60f56, 0x111b495b3464ad21, + 0x936b9fcebb25c995, 0xcab10dd900beec34, + 0xb84687c269ef3bfb, 0x3d5d514f40eea742, + 0xe65829b3046b0afa, 0xcb4a5a3112a5112, + 0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ab, + 0xb3f4e093db73a093, 0x59ed216765690f56, + 0xe0f218b8d25088b8, 0x306869c13ec3532c, + 0x8c974f7383725573, 0x1e414218c73a13fb, + 0xafbd2350644eeacf, 0xe5d1929ef90898fa, + 0xdbac6c247d62a583, 0xdf45f746b74abf39, + 0x894bc396ce5da772, 0x6b8bba8c328eb783, + 0xab9eb47c81f5114f, 0x66ea92f3f326564, + 0xd686619ba27255a2, 0xc80a537b0efefebd, + 0x8613fd0145877585, 0xbd06742ce95f5f36, + 0xa798fc4196e952e7, 0x2c48113823b73704, + 0xd17f3b51fca3a7a0, 0xf75a15862ca504c5, + 0x82ef85133de648c4, 0x9a984d73dbe722fb, + 0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebba, + 0xcc963fee10b7d1b3, 0x318df905079926a8, + 0xffbbcfe994e5c61f, 0xfdf17746497f7052, + 0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa633, + 0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc0, + 0xf9bd690a1b68637b, 0x3dfdce7aa3c673b0, + 0x9c1661a651213e2d, 0x6bea10ca65c084e, + 0xc31bfa0fe5698db8, 0x486e494fcff30a62, + 0xf3e2f893dec3f126, 0x5a89dba3c3efccfa, + 0x986ddb5c6b3a76b7, 0xf89629465a75e01c, + 0xbe89523386091465, 0xf6bbb397f1135823, + 0xee2ba6c0678b597f, 0x746aa07ded582e2c, + 0x94db483840b717ef, 0xa8c2a44eb4571cdc, + 0xba121a4650e4ddeb, 0x92f34d62616ce413, + 0xe896a0d7e51e1566, 0x77b020baf9c81d17, + 0x915e2486ef32cd60, 0xace1474dc1d122e, + 0xb5b5ada8aaff80b8, 0xd819992132456ba, + 0xe3231912d5bf60e6, 0x10e1fff697ed6c69, + 0x8df5efabc5979c8f, 0xca8d3ffa1ef463c1, + 0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb2, + 0xddd0467c64bce4a0, 0xac7cb3f6d05ddbde, + 0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96b, + 0xad4ab7112eb3929d, 0x86c16c98d2c953c6, + 0xd89d64d57a607744, 0xe871c7bf077ba8b7, + 0x87625f056c7c4a8b, 0x11471cd764ad4972, + 0xa93af6c6c79b5d2d, 0xd598e40d3dd89bcf, + 0xd389b47879823479, 0x4aff1d108d4ec2c3, + 0x843610cb4bf160cb, 0xcedf722a585139ba, + 0xa54394fe1eedb8fe, 0xc2974eb4ee658828, + 0xce947a3da6a9273e, 0x733d226229feea32, + 0x811ccc668829b887, 0x806357d5a3f525f, + 0xa163ff802a3426a8, 0xca07c2dcb0cf26f7, + 0xc9bcff6034c13052, 0xfc89b393dd02f0b5, + 0xfc2c3f3841f17c67, 0xbbac2078d443ace2, + 0x9d9ba7832936edc0, 0xd54b944b84aa4c0d, + 0xc5029163f384a931, 0xa9e795e65d4df11, + 0xf64335bcf065d37d, 0x4d4617b5ff4a16d5, + 0x99ea0196163fa42e, 0x504bced1bf8e4e45, + 0xc06481fb9bcf8d39, 0xe45ec2862f71e1d6, + 0xf07da27a82c37088, 0x5d767327bb4e5a4c, + 0x964e858c91ba2655, 0x3a6a07f8d510f86f, + 0xbbe226efb628afea, 0x890489f70a55368b, + 0xeadab0aba3b2dbe5, 0x2b45ac74ccea842e, + 0x92c8ae6b464fc96f, 0x3b0b8bc90012929d, + 0xb77ada0617e3bbcb, 0x9ce6ebb40173744, + 0xe55990879ddcaabd, 0xcc420a6a101d0515, + 0x8f57fa54c2a9eab6, 0x9fa946824a12232d, + 0xb32df8e9f3546564, 0x47939822dc96abf9, + 0xdff9772470297ebd, 0x59787e2b93bc56f7, + 0x8bfbea76c619ef36, 0x57eb4edb3c55b65a, + 0xaefae51477a06b03, 0xede622920b6b23f1, + 0xdab99e59958885c4, 0xe95fab368e45eced, + 0x88b402f7fd75539b, 0x11dbcb0218ebb414, + 0xaae103b5fcd2a881, 0xd652bdc29f26a119, + 0xd59944a37c0752a2, 0x4be76d3346f0495f, + 0x857fcae62d8493a5, 0x6f70a4400c562ddb, + 0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb952, + 0xd097ad07a71f26b2, 0x7e2000a41346a7a7, + 0x825ecc24c873782f, 0x8ed400668c0c28c8, + 0xa2f67f2dfa90563b, 0x728900802f0f32fa, + 0xcbb41ef979346bca, 0x4f2b40a03ad2ffb9, + 0xfea126b7d78186bc, 0xe2f610c84987bfa8, + 0x9f24b832e6b0f436, 0xdd9ca7d2df4d7c9, + 0xc6ede63fa05d3143, 0x91503d1c79720dbb, + 0xf8a95fcf88747d94, 0x75a44c6397ce912a, + 0x9b69dbe1b548ce7c, 0xc986afbe3ee11aba, + 0xc24452da229b021b, 0xfbe85badce996168, + 0xf2d56790ab41c2a2, 0xfae27299423fb9c3, + 0x97c560ba6b0919a5, 0xdccd879fc967d41a, + 0xbdb6b8e905cb600f, 0x5400e987bbc1c920, + 0xed246723473e3813, 0x290123e9aab23b68, + 0x9436c0760c86e30b, 0xf9a0b6720aaf6521, + 0xb94470938fa89bce, 0xf808e40e8d5b3e69, + 0xe7958cb87392c2c2, 0xb60b1d1230b20e04, + 0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c2, + 0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af3, + 0xe2280b6c20dd5232, 0x25c6da63c38de1b0, + 0x8d590723948a535f, 0x579c487e5a38ad0e, + 0xb0af48ec79ace837, 0x2d835a9df0c6d851, + 0xdcdb1b2798182244, 0xf8e431456cf88e65, + 0x8a08f0f8bf0f156b, 0x1b8e9ecb641b58ff, + 0xac8b2d36eed2dac5, 0xe272467e3d222f3f, + 0xd7adf884aa879177, 0x5b0ed81dcc6abb0f, + 0x86ccbb52ea94baea, 0x98e947129fc2b4e9, + 0xa87fea27a539e9a5, 0x3f2398d747b36224, + 0xd29fe4b18e88640e, 0x8eec7f0d19a03aad, + 0x83a3eeeef9153e89, 0x1953cf68300424ac, + 0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd7, + 0xcdb02555653131b6, 0x3792f412cb06794d, + 0x808e17555f3ebf11, 0xe2bbd88bbee40bd0, + 0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec4, + 0xc8de047564d20a8b, 0xf245825a5a445275, + 0xfb158592be068d2e, 0xeed6e2f0f0d56712, + 0x9ced737bb6c4183d, 0x55464dd69685606b, + 0xc428d05aa4751e4c, 0xaa97e14c3c26b886, + 0xf53304714d9265df, 0xd53dd99f4b3066a8, + 0x993fe2c6d07b7fab, 0xe546a8038efe4029, + 0xbf8fdb78849a5f96, 0xde98520472bdd033, + 0xef73d256a5c0f77c, 0x963e66858f6d4440, + 0x95a8637627989aad, 0xdde7001379a44aa8, + 0xbb127c53b17ec159, 0x5560c018580d5d52, + 0xe9d71b689dde71af, 0xaab8f01e6e10b4a6, + 0x9226712162ab070d, 0xcab3961304ca70e8, + 0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d22, + 0xe45c10c42a2b3b05, 0x8cb89a7db77c506a, + 0x8eb98a7a9a5b04e3, 0x77f3608e92adb242, + 0xb267ed1940f1c61c, 0x55f038b237591ed3, + 0xdf01e85f912e37a3, 0x6b6c46dec52f6688, + 0x8b61313bbabce2c6, 0x2323ac4b3b3da015, + 0xae397d8aa96c1b77, 0xabec975e0a0d081a, + 0xd9c7dced53c72255, 0x96e7bd358c904a21, + 0x881cea14545c7575, 0x7e50d64177da2e54, + 0xaa242499697392d2, 0xdde50bd1d5d0b9e9, + 0xd4ad2dbfc3d07787, 0x955e4ec64b44e864, + 0x84ec3c97da624ab4, 0xbd5af13bef0b113e, + 0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58e, + 0xcfb11ead453994ba, 0x67de18eda5814af2, + 0x81ceb32c4b43fcf4, 0x80eacf948770ced7, + 0xa2425ff75e14fc31, 0xa1258379a94d028d, + 0xcad2f7f5359a3b3e, 0x96ee45813a04330, + 0xfd87b5f28300ca0d, 0x8bca9d6e188853fc, + 0x9e74d1b791e07e48, 0x775ea264cf55347e, + 0xc612062576589dda, 0x95364afe032a819e, + 0xf79687aed3eec551, 0x3a83ddbd83f52205, + 0x9abe14cd44753b52, 0xc4926a9672793543, + 0xc16d9a0095928a27, 0x75b7053c0f178294, + 0xf1c90080baf72cb1, 0x5324c68b12dd6339, + 0x971da05074da7bee, 0xd3f6fc16ebca5e04, + 0xbce5086492111aea, 0x88f4bb1ca6bcf585, + 0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6, + 0x9392ee8e921d5d07, 0x3aff322e62439fd0, + 0xb877aa3236a4b449, 0x9befeb9fad487c3, + 0xe69594bec44de15b, 0x4c2ebe687989a9b4, + 0x901d7cf73ab0acd9, 0xf9d37014bf60a11, + 0xb424dc35095cd80f, 0x538484c19ef38c95, + 0xe12e13424bb40e13, 0x2865a5f206b06fba, + 0x8cbccc096f5088cb, 0xf93f87b7442e45d4, + 0xafebff0bcb24aafe, 0xf78f69a51539d749, + 0xdbe6fecebdedd5be, 0xb573440e5a884d1c, + 0x89705f4136b4a597, 0x31680a88f8953031, + 0xabcc77118461cefc, 0xfdc20d2b36ba7c3e, + 0xd6bf94d5e57a42bc, 0x3d32907604691b4d, + 0x8637bd05af6c69b5, 0xa63f9a49c2c1b110, + 0xa7c5ac471b478423, 0xfcf80dc33721d54, + 0xd1b71758e219652b, 0xd3c36113404ea4a9, + 0x83126e978d4fdf3b, 0x645a1cac083126ea, + 0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4, + 0xcccccccccccccccc, 0xcccccccccccccccd, + 0x8000000000000000, 0x0, + 0xa000000000000000, 0x0, + 0xc800000000000000, 0x0, + 0xfa00000000000000, 0x0, + 0x9c40000000000000, 0x0, + 0xc350000000000000, 0x0, + 0xf424000000000000, 0x0, + 0x9896800000000000, 0x0, + 0xbebc200000000000, 0x0, + 0xee6b280000000000, 0x0, + 0x9502f90000000000, 0x0, + 0xba43b74000000000, 0x0, + 0xe8d4a51000000000, 0x0, + 0x9184e72a00000000, 0x0, + 0xb5e620f480000000, 0x0, + 0xe35fa931a0000000, 0x0, + 0x8e1bc9bf04000000, 0x0, + 0xb1a2bc2ec5000000, 0x0, + 0xde0b6b3a76400000, 0x0, + 0x8ac7230489e80000, 0x0, + 0xad78ebc5ac620000, 0x0, + 0xd8d726b7177a8000, 0x0, + 0x878678326eac9000, 0x0, + 0xa968163f0a57b400, 0x0, + 0xd3c21bcecceda100, 0x0, + 0x84595161401484a0, 0x0, + 0xa56fa5b99019a5c8, 0x0, + 0xcecb8f27f4200f3a, 0x0, + 0x813f3978f8940984, 0x4000000000000000, + 0xa18f07d736b90be5, 0x5000000000000000, + 0xc9f2c9cd04674ede, 0xa400000000000000, + 0xfc6f7c4045812296, 0x4d00000000000000, + 0x9dc5ada82b70b59d, 0xf020000000000000, + 0xc5371912364ce305, 0x6c28000000000000, + 0xf684df56c3e01bc6, 0xc732000000000000, + 0x9a130b963a6c115c, 0x3c7f400000000000, + 0xc097ce7bc90715b3, 0x4b9f100000000000, + 0xf0bdc21abb48db20, 0x1e86d40000000000, + 0x96769950b50d88f4, 0x1314448000000000, + 0xbc143fa4e250eb31, 0x17d955a000000000, + 0xeb194f8e1ae525fd, 0x5dcfab0800000000, + 0x92efd1b8d0cf37be, 0x5aa1cae500000000, + 0xb7abc627050305ad, 0xf14a3d9e40000000, + 0xe596b7b0c643c719, 0x6d9ccd05d0000000, + 0x8f7e32ce7bea5c6f, 0xe4820023a2000000, + 0xb35dbf821ae4f38b, 0xdda2802c8a800000, + 0xe0352f62a19e306e, 0xd50b2037ad200000, + 0x8c213d9da502de45, 0x4526f422cc340000, + 0xaf298d050e4395d6, 0x9670b12b7f410000, + 0xdaf3f04651d47b4c, 0x3c0cdd765f114000, + 0x88d8762bf324cd0f, 0xa5880a69fb6ac800, + 0xab0e93b6efee0053, 0x8eea0d047a457a00, + 0xd5d238a4abe98068, 0x72a4904598d6d880, + 0x85a36366eb71f041, 0x47a6da2b7f864750, + 0xa70c3c40a64e6c51, 0x999090b65f67d924, + 0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d, + 0x82818f1281ed449f, 0xbff8f10e7a8921a4, + 0xa321f2d7226895c7, 0xaff72d52192b6a0d, + 0xcbea6f8ceb02bb39, 0x9bf4f8a69f764490, + 0xfee50b7025c36a08, 0x2f236d04753d5b4, + 0x9f4f2726179a2245, 0x1d762422c946590, + 0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef5, + 0xf8ebad2b84e0d58b, 0xd2e0898765a7deb2, + 0x9b934c3b330c8577, 0x63cc55f49f88eb2f, + 0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fb, + 0xf316271c7fc3908a, 0x8bef464e3945ef7a, + 0x97edd871cfda3a56, 0x97758bf0e3cbb5ac, + 0xbde94e8e43d0c8ec, 0x3d52eeed1cbea317, + 0xed63a231d4c4fb27, 0x4ca7aaa863ee4bdd, + 0x945e455f24fb1cf8, 0x8fe8caa93e74ef6a, + 0xb975d6b6ee39e436, 0xb3e2fd538e122b44, + 0xe7d34c64a9c85d44, 0x60dbbca87196b616, + 0x90e40fbeea1d3a4a, 0xbc8955e946fe31cd, + 0xb51d13aea4a488dd, 0x6babab6398bdbe41, + 0xe264589a4dcdab14, 0xc696963c7eed2dd1, + 0x8d7eb76070a08aec, 0xfc1e1de5cf543ca2, + 0xb0de65388cc8ada8, 0x3b25a55f43294bcb, + 0xdd15fe86affad912, 0x49ef0eb713f39ebe, + 0x8a2dbf142dfcc7ab, 0x6e3569326c784337, + 0xacb92ed9397bf996, 0x49c2c37f07965404, + 0xd7e77a8f87daf7fb, 0xdc33745ec97be906, + 0x86f0ac99b4e8dafd, 0x69a028bb3ded71a3, + 0xa8acd7c0222311bc, 0xc40832ea0d68ce0c, + 0xd2d80db02aabd62b, 0xf50a3fa490c30190, + 0x83c7088e1aab65db, 0x792667c6da79e0fa, + 0xa4b8cab1a1563f52, 0x577001b891185938, + 0xcde6fd5e09abcf26, 0xed4c0226b55e6f86, + 0x80b05e5ac60b6178, 0x544f8158315b05b4, + 0xa0dc75f1778e39d6, 0x696361ae3db1c721, + 0xc913936dd571c84c, 0x3bc3a19cd1e38e9, + 0xfb5878494ace3a5f, 0x4ab48a04065c723, + 0x9d174b2dcec0e47b, 0x62eb0d64283f9c76, + 0xc45d1df942711d9a, 0x3ba5d0bd324f8394, + 0xf5746577930d6500, 0xca8f44ec7ee36479, + 0x9968bf6abbe85f20, 0x7e998b13cf4e1ecb, + 0xbfc2ef456ae276e8, 0x9e3fedd8c321a67e, + 0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101e, + 0x95d04aee3b80ece5, 0xbba1f1d158724a12, + 0xbb445da9ca61281f, 0x2a8a6e45ae8edc97, + 0xea1575143cf97226, 0xf52d09d71a3293bd, + 0x924d692ca61be758, 0x593c2626705f9c56, + 0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836c, + 0xe498f455c38b997a, 0xb6dfb9c0f956447, + 0x8edf98b59a373fec, 0x4724bd4189bd5eac, + 0xb2977ee300c50fe7, 0x58edec91ec2cb657, + 0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ed, + 0x8b865b215899f46c, 0xbd79e0d20082ee74, + 0xae67f1e9aec07187, 0xecd8590680a3aa11, + 0xda01ee641a708de9, 0xe80e6f4820cc9495, + 0x884134fe908658b2, 0x3109058d147fdcdd, + 0xaa51823e34a7eede, 0xbd4b46f0599fd415, + 0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91a, + 0x850fadc09923329e, 0x3e2cf6bc604ddb0, + 0xa6539930bf6bff45, 0x84db8346b786151c, + 0xcfe87f7cef46ff16, 0xe612641865679a63, + 0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07e, + 0xa26da3999aef7749, 0xe3be5e330f38f09d, + 0xcb090c8001ab551c, 0x5cadf5bfd3072cc5, + 0xfdcb4fa002162a63, 0x73d9732fc7c8f7f6, + 0x9e9f11c4014dda7e, 0x2867e7fddcdd9afa, + 0xc646d63501a1511d, 0xb281e1fd541501b8, + 0xf7d88bc24209a565, 0x1f225a7ca91a4226, + 0x9ae757596946075f, 0x3375788de9b06958, + 0xc1a12d2fc3978937, 0x52d6b1641c83ae, + 0xf209787bb47d6b84, 0xc0678c5dbd23a49a, + 0x9745eb4d50ce6332, 0xf840b7ba963646e0, + 0xbd176620a501fbff, 0xb650e5a93bc3d898, + 0xec5d3fa8ce427aff, 0xa3e51f138ab4cebe, + 0x93ba47c980e98cdf, 0xc66f336c36b10137, + 0xb8a8d9bbe123f017, 0xb80b0047445d4184, + 0xe6d3102ad96cec1d, 0xa60dc059157491e5, + 0x9043ea1ac7e41392, 0x87c89837ad68db2f, + 0xb454e4a179dd1877, 0x29babe4598c311fb, + 0xe16a1dc9d8545e94, 0xf4296dd6fef3d67a, + 0x8ce2529e2734bb1d, 0x1899e4a65f58660c, + 0xb01ae745b101e9e4, 0x5ec05dcff72e7f8f, + 0xdc21a1171d42645d, 0x76707543f4fa1f73, + 0x899504ae72497eba, 0x6a06494a791c53a8, + 0xabfa45da0edbde69, 0x487db9d17636892, + 0xd6f8d7509292d603, 0x45a9d2845d3c42b6, + 0x865b86925b9bc5c2, 0xb8a2392ba45a9b2, + 0xa7f26836f282b732, 0x8e6cac7768d7141e, + 0xd1ef0244af2364ff, 0x3207d795430cd926, + 0x8335616aed761f1f, 0x7f44e6bd49e807b8, + 0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a6, + 0xcd036837130890a1, 0x36dba887c37a8c0f, + 0x802221226be55a64, 0xc2494954da2c9789, + 0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6c, + 0xc83553c5c8965d3d, 0x6f92829494e5acc7, + 0xfa42a8b73abbf48c, 0xcb772339ba1f17f9, + 0x9c69a97284b578d7, 0xff2a760414536efb, + 0xc38413cf25e2d70d, 0xfef5138519684aba, + 0xf46518c2ef5b8cd1, 0x7eb258665fc25d69, + 0x98bf2f79d5993802, 0xef2f773ffbd97a61, + 0xbeeefb584aff8603, 0xaafb550ffacfd8fa, + 0xeeaaba2e5dbf6784, 0x95ba2a53f983cf38, + 0x952ab45cfa97a0b2, 0xdd945a747bf26183, + 0xba756174393d88df, 0x94f971119aeef9e4, + 0xe912b9d1478ceb17, 0x7a37cd5601aab85d, + 0x91abb422ccb812ee, 0xac62e055c10ab33a, + 0xb616a12b7fe617aa, 0x577b986b314d6009, + 0xe39c49765fdf9d94, 0xed5a7e85fda0b80b, + 0x8e41ade9fbebc27d, 0x14588f13be847307, + 0xb1d219647ae6b31c, 0x596eb2d8ae258fc8, + 0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bb, + 0x8aec23d680043bee, 0x25de7bb9480d5854, + 0xada72ccc20054ae9, 0xaf561aa79a10ae6a, + 0xd910f7ff28069da4, 0x1b2ba1518094da04, + 0x87aa9aff79042286, 0x90fb44d2f05d0842, + 0xa99541bf57452b28, 0x353a1607ac744a53, + 0xd3fa922f2d1675f2, 0x42889b8997915ce8, + 0x847c9b5d7c2e09b7, 0x69956135febada11, + 0xa59bc234db398c25, 0x43fab9837e699095, + 0xcf02b2c21207ef2e, 0x94f967e45e03f4bb, + 0x8161afb94b44f57d, 0x1d1be0eebac278f5, + 0xa1ba1ba79e1632dc, 0x6462d92a69731732, + 0xca28a291859bbf93, 0x7d7b8f7503cfdcfe, + 0xfcb2cb35e702af78, 0x5cda735244c3d43e, + 0x9defbf01b061adab, 0x3a0888136afa64a7, + 0xc56baec21c7a1916, 0x88aaa1845b8fdd0, + 0xf6c69a72a3989f5b, 0x8aad549e57273d45, + 0x9a3c2087a63f6399, 0x36ac54e2f678864b, + 0xc0cb28a98fcf3c7f, 0x84576a1bb416a7dd, + 0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d5, + 0x969eb7c47859e743, 0x9f644ae5a4b1b325, + 0xbc4665b596706114, 0x873d5d9f0dde1fee, + 0xeb57ff22fc0c7959, 0xa90cb506d155a7ea, + 0x9316ff75dd87cbd8, 0x9a7f12442d588f2, + 0xb7dcbf5354e9bece, 0xc11ed6d538aeb2f, + 0xe5d3ef282a242e81, 0x8f1668c8a86da5fa, + 0x8fa475791a569d10, 0xf96e017d694487bc, + 0xb38d92d760ec4455, 0x37c981dcc395a9ac, + 0xe070f78d3927556a, 0x85bbe253f47b1417, + 0x8c469ab843b89562, 0x93956d7478ccec8e, + 0xaf58416654a6babb, 0x387ac8d1970027b2, + 0xdb2e51bfe9d0696a, 0x6997b05fcc0319e, + 0x88fcf317f22241e2, 0x441fece3bdf81f03, + 0xab3c2fddeeaad25a, 0xd527e81cad7626c3, + 0xd60b3bd56a5586f1, 0x8a71e223d8d3b074, + 0x85c7056562757456, 0xf6872d5667844e49, + 0xa738c6bebb12d16c, 0xb428f8ac016561db, + 0xd106f86e69d785c7, 0xe13336d701beba52, + 0x82a45b450226b39c, 0xecc0024661173473, + 0xa34d721642b06084, 0x27f002d7f95d0190, + 0xcc20ce9bd35c78a5, 0x31ec038df7b441f4, + 0xff290242c83396ce, 0x7e67047175a15271, + 0x9f79a169bd203e41, 0xf0062c6e984d386, + 0xc75809c42c684dd1, 0x52c07b78a3e60868, + 0xf92e0c3537826145, 0xa7709a56ccdf8a82, + 0x9bbcc7a142b17ccb, 0x88a66076400bb691, + 0xc2abf989935ddbfe, 0x6acff893d00ea435, + 0xf356f7ebf83552fe, 0x583f6b8c4124d43, + 0x98165af37b2153de, 0xc3727a337a8b704a, + 0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5c, + 0xeda2ee1c7064130c, 0x1162def06f79df73, + 0x9485d4d1c63e8be7, 0x8addcb5645ac2ba8, + 0xb9a74a0637ce2ee1, 0x6d953e2bd7173692, + 0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0437, + 0x910ab1d4db9914a0, 0x1d9c9892400a22a2, + 0xb54d5e4a127f59c8, 0x2503beb6d00cab4b, + 0xe2a0b5dc971f303a, 0x2e44ae64840fd61d, + 0x8da471a9de737e24, 0x5ceaecfed289e5d2, + 0xb10d8e1456105dad, 0x7425a83e872c5f47, + 0xdd50f1996b947518, 0xd12f124e28f77719, + 0x8a5296ffe33cc92f, 0x82bd6b70d99aaa6f, + 0xace73cbfdc0bfb7b, 0x636cc64d1001550b, + 0xd8210befd30efa5a, 0x3c47f7e05401aa4e, + 0x8714a775e3e95c78, 0x65acfaec34810a71, + 0xa8d9d1535ce3b396, 0x7f1839a741a14d0d, + 0xd31045a8341ca07c, 0x1ede48111209a050, + 0x83ea2b892091e44d, 0x934aed0aab460432, + 0xa4e4b66b68b65d60, 0xf81da84d5617853f, + 0xce1de40642e3f4b9, 0x36251260ab9d668e, + 0x80d2ae83e9ce78f3, 0xc1d72b7c6b426019, + 0xa1075a24e4421730, 0xb24cf65b8612f81f, + 0xc94930ae1d529cfc, 0xdee033f26797b627, + 0xfb9b7cd9a4a7443c, 0x169840ef017da3b1, + 0x9d412e0806e88aa5, 0x8e1f289560ee864e, + 0xc491798a08a2ad4e, 0xf1a6f2bab92a27e2, + 0xf5b5d7ec8acb58a2, 0xae10af696774b1db, + 0x9991a6f3d6bf1765, 0xacca6da1e0a8ef29, + 0xbff610b0cc6edd3f, 0x17fd090a58d32af3, + 0xeff394dcff8a948e, 0xddfc4b4cef07f5b0, + 0x95f83d0a1fb69cd9, 0x4abdaf101564f98e, + 0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f1, + 0xea53df5fd18d5513, 0x84c86189216dc5ed, + 0x92746b9be2f8552c, 0x32fd3cf5b4e49bb4, + 0xb7118682dbb66a77, 0x3fbc8c33221dc2a1, + 0xe4d5e82392a40515, 0xfabaf3feaa5334a, + 0x8f05b1163ba6832d, 0x29cb4d87f2a7400e, + 0xb2c71d5bca9023f8, 0x743e20e9ef511012, + 0xdf78e4b2bd342cf6, 0x914da9246b255416, + 0x8bab8eefb6409c1a, 0x1ad089b6c2f7548e, + 0xae9672aba3d0c320, 0xa184ac2473b529b1, + 0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741e, + 0x8865899617fb1871, 0x7e2fa67c7a658892, + 0xaa7eebfb9df9de8d, 0xddbb901b98feeab7, + 0xd51ea6fa85785631, 0x552a74227f3ea565, + 0x8533285c936b35de, 0xd53a88958f87275f, + 0xa67ff273b8460356, 0x8a892abaf368f137, + 0xd01fef10a657842c, 0x2d2b7569b0432d85, + 0x8213f56a67f6b29b, 0x9c3b29620e29fc73, + 0xa298f2c501f45f42, 0x8349f3ba91b47b8f, + 0xcb3f2f7642717713, 0x241c70a936219a73, + 0xfe0efb53d30dd4d7, 0xed238cd383aa0110, + 0x9ec95d1463e8a506, 0xf4363804324a40aa, + 0xc67bb4597ce2ce48, 0xb143c6053edcd0d5, + 0xf81aa16fdc1b81da, 0xdd94b7868e94050a, + 0x9b10a4e5e9913128, 0xca7cf2b4191c8326, + 0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f0, + 0xf24a01a73cf2dccf, 0xbc633b39673c8cec, + 0x976e41088617ca01, 0xd5be0503e085d813, + 0xbd49d14aa79dbc82, 0x4b2d8644d8a74e18, + 0xec9c459d51852ba2, 0xddf8e7d60ed1219e, + 0x93e1ab8252f33b45, 0xcabb90e5c942b503, + 0xb8da1662e7b00a17, 0x3d6a751f3b936243, + 0xe7109bfba19c0c9d, 0xcc512670a783ad4, + 0x906a617d450187e2, 0x27fb2b80668b24c5, + 0xb484f9dc9641e9da, 0xb1f9f660802dedf6, + 0xe1a63853bbd26451, 0x5e7873f8a0396973, + 0x8d07e33455637eb2, 0xdb0b487b6423e1e8, + 0xb049dc016abc5e5f, 0x91ce1a9a3d2cda62, + 0xdc5c5301c56b75f7, 0x7641a140cc7810fb, + 0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9d, + 0xac2820d9623bf429, 0x546345fa9fbdcd44, + 0xd732290fbacaf133, 0xa97c177947ad4095, + 0x867f59a9d4bed6c0, 0x49ed8eabcccc485d, + 0xa81f301449ee8c70, 0x5c68f256bfff5a74, + 0xd226fc195c6a2f8c, 0x73832eec6fff3111, + 0x83585d8fd9c25db7, 0xc831fd53c5ff7eab, + 0xa42e74f3d032f525, 0xba3e7ca8b77f5e55, + 0xcd3a1230c43fb26f, 0x28ce1bd2e55f35eb, + 0x80444b5e7aa7cf85, 0x7980d163cf5b81b3, + 0xa0555e361951c366, 0xd7e105bcc332621f, + 0xc86ab5c39fa63440, 0x8dd9472bf3fefaa7, + 0xfa856334878fc150, 0xb14f98f6f0feb951, + 0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d3, + 0xc3b8358109e84f07, 0xa862f80ec4700c8, + 0xf4a642e14c6262c8, 0xcd27bb612758c0fa, + 0x98e7e9cccfbd7dbd, 0x8038d51cb897789c, + 0xbf21e44003acdd2c, 0xe0470a63e6bd56c3, + 0xeeea5d5004981478, 0x1858ccfce06cac74, + 0x95527a5202df0ccb, 0xf37801e0c43ebc8, + 0xbaa718e68396cffd, 0xd30560258f54e6ba, + 0xe950df20247c83fd, 0x47c6b82ef32a2069, + 0x91d28b7416cdd27e, 0x4cdc331d57fa5441, + 0xb6472e511c81471d, 0xe0133fe4adf8e952, + 0xe3d8f9e563a198e5, 0x58180fddd97723a6, + 0x8e679c2f5e44ff8f, 0x570f09eaa7ea7648, + }; +}; + +#if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE + +template +constexpr uint64_t + powers_template::power_of_five_128[number_of_entries]; + +#endif + +using powers = powers_template<>; + +} // namespace fast_float + +#endif + +#ifndef FASTFLOAT_DECIMAL_TO_BINARY_H +#define FASTFLOAT_DECIMAL_TO_BINARY_H + +#include +#include +#include +#include +#include +#include + +namespace fast_float { + +// This will compute or rather approximate w * 5**q and return a pair of 64-bit +// words approximating the result, with the "high" part corresponding to the +// most significant bits and the low part corresponding to the least significant +// bits. +// +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 value128 +compute_product_approximation(int64_t q, uint64_t w) { + int const index = 2 * int(q - powers::smallest_power_of_five); + // For small values of q, e.g., q in [0,27], the answer is always exact + // because The line value128 firstproduct = full_multiplication(w, + // power_of_five_128[index]); gives the exact answer. + value128 firstproduct = + full_multiplication(w, powers::power_of_five_128[index]); + static_assert((bit_precision >= 0) && (bit_precision <= 64), + " precision should be in (0,64]"); + constexpr uint64_t precision_mask = + (bit_precision < 64) ? (uint64_t(0xFFFFFFFFFFFFFFFF) >> bit_precision) + : uint64_t(0xFFFFFFFFFFFFFFFF); + if ((firstproduct.high & precision_mask) == + precision_mask) { // could further guard with (lower + w < lower) + // regarding the second product, we only need secondproduct.high, but our + // expectation is that the compiler will optimize this extra work away if + // needed. + value128 secondproduct = + full_multiplication(w, powers::power_of_five_128[index + 1]); + firstproduct.low += secondproduct.high; + if (secondproduct.high > firstproduct.low) { + firstproduct.high++; + } + } + return firstproduct; +} + +namespace detail { +/** + * For q in (0,350), we have that + * f = (((152170 + 65536) * q ) >> 16); + * is equal to + * floor(p) + q + * where + * p = log(5**q)/log(2) = q * log(5)/log(2) + * + * For negative values of q in (-400,0), we have that + * f = (((152170 + 65536) * q ) >> 16); + * is equal to + * -ceil(p) + q + * where + * p = log(5**-q)/log(2) = -q * log(5)/log(2) + */ +constexpr fastfloat_really_inline int32_t power(int32_t q) noexcept { + return (((152170 + 65536) * q) >> 16) + 63; +} +} // namespace detail + +// create an adjusted mantissa, biased by the invalid power2 +// for significant digits already multiplied by 10 ** q. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 adjusted_mantissa +compute_error_scaled(int64_t q, uint64_t w, int lz) noexcept { + int hilz = int(w >> 63) ^ 1; + adjusted_mantissa answer; + answer.mantissa = w << hilz; + int bias = binary::mantissa_explicit_bits() - binary::minimum_exponent(); + answer.power2 = int32_t(detail::power(int32_t(q)) + bias - hilz - lz - 62 + + invalid_am_bias); + return answer; +} + +// w * 10 ** q, without rounding the representation up. +// the power2 in the exponent will be adjusted by invalid_am_bias. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa +compute_error(int64_t q, uint64_t w) noexcept { + int lz = leading_zeroes(w); + w <<= lz; + value128 product = + compute_product_approximation(q, w); + return compute_error_scaled(q, product.high, lz); +} + +// Computers w * 10 ** q. +// The returned value should be a valid number that simply needs to be +// packed. However, in some very rare cases, the computation will fail. In such +// cases, we return an adjusted_mantissa with a negative power of 2: the caller +// should recompute in such cases. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa +compute_float(int64_t q, uint64_t w) noexcept { + adjusted_mantissa answer; + if ((w == 0) || (q < binary::smallest_power_of_ten())) { + answer.power2 = 0; + answer.mantissa = 0; + // result should be zero + return answer; + } + if (q > binary::largest_power_of_ten()) { + // we want to get infinity: + answer.power2 = binary::infinite_power(); + answer.mantissa = 0; + return answer; + } + // At this point in time q is in [powers::smallest_power_of_five, + // powers::largest_power_of_five]. + + // We want the most significant bit of i to be 1. Shift if needed. + int lz = leading_zeroes(w); + w <<= lz; + + // The required precision is binary::mantissa_explicit_bits() + 3 because + // 1. We need the implicit bit + // 2. We need an extra bit for rounding purposes + // 3. We might lose a bit due to the "upperbit" routine (result too small, + // requiring a shift) + + value128 product = + compute_product_approximation(q, w); + // The computed 'product' is always sufficient. + // Mathematical proof: + // Noble Mushtak and Daniel Lemire, Fast Number Parsing Without Fallback (to + // appear) See script/mushtak_lemire.py + + // The "compute_product_approximation" function can be slightly slower than a + // branchless approach: value128 product = compute_product(q, w); but in + // practice, we can win big with the compute_product_approximation if its + // additional branch is easily predicted. Which is best is data specific. + int upperbit = int(product.high >> 63); + int shift = upperbit + 64 - binary::mantissa_explicit_bits() - 3; + + answer.mantissa = product.high >> shift; + + answer.power2 = int32_t(detail::power(int32_t(q)) + upperbit - lz - + binary::minimum_exponent()); + if (answer.power2 <= 0) { // we have a subnormal? + // Here have that answer.power2 <= 0 so -answer.power2 >= 0 + if (-answer.power2 + 1 >= + 64) { // if we have more than 64 bits below the minimum exponent, you + // have a zero for sure. + answer.power2 = 0; + answer.mantissa = 0; + // result should be zero + return answer; + } + // next line is safe because -answer.power2 + 1 < 64 + answer.mantissa >>= -answer.power2 + 1; + // Thankfully, we can't have both "round-to-even" and subnormals because + // "round-to-even" only occurs for powers close to 0 in the 32-bit and + // and 64-bit case (with no more than 19 digits). + answer.mantissa += (answer.mantissa & 1); // round up + answer.mantissa >>= 1; + // There is a weird scenario where we don't have a subnormal but just. + // Suppose we start with 2.2250738585072013e-308, we end up + // with 0x3fffffffffffff x 2^-1023-53 which is technically subnormal + // whereas 0x40000000000000 x 2^-1023-53 is normal. Now, we need to round + // up 0x3fffffffffffff x 2^-1023-53 and once we do, we are no longer + // subnormal, but we can only know this after rounding. + // So we only declare a subnormal if we are smaller than the threshold. + answer.power2 = + (answer.mantissa < (uint64_t(1) << binary::mantissa_explicit_bits())) + ? 0 + : 1; + return answer; + } + + // usually, we round *up*, but if we fall right in between and and we have an + // even basis, we need to round down + // We are only concerned with the cases where 5**q fits in single 64-bit word. + if ((product.low <= 1) && (q >= binary::min_exponent_round_to_even()) && + (q <= binary::max_exponent_round_to_even()) && + ((answer.mantissa & 3) == 1)) { // we may fall between two floats! + // To be in-between two floats we need that in doing + // answer.mantissa = product.high >> (upperbit + 64 - + // binary::mantissa_explicit_bits() - 3); + // ... we dropped out only zeroes. But if this happened, then we can go + // back!!! + if ((answer.mantissa << shift) == product.high) { + answer.mantissa &= ~uint64_t(1); // flip it so that we do not round up + } + } + + answer.mantissa += (answer.mantissa & 1); // round up + answer.mantissa >>= 1; + if (answer.mantissa >= (uint64_t(2) << binary::mantissa_explicit_bits())) { + answer.mantissa = (uint64_t(1) << binary::mantissa_explicit_bits()); + answer.power2++; // undo previous addition + } + + answer.mantissa &= ~(uint64_t(1) << binary::mantissa_explicit_bits()); + if (answer.power2 >= binary::infinite_power()) { // infinity + answer.power2 = binary::infinite_power(); + answer.mantissa = 0; + } + return answer; +} + +} // namespace fast_float + +#endif + +#ifndef FASTFLOAT_BIGINT_H +#define FASTFLOAT_BIGINT_H + +#include +#include +#include +#include + + +namespace fast_float { + +// the limb width: we want efficient multiplication of double the bits in +// limb, or for 64-bit limbs, at least 64-bit multiplication where we can +// extract the high and low parts efficiently. this is every 64-bit +// architecture except for sparc, which emulates 128-bit multiplication. +// we might have platforms where `CHAR_BIT` is not 8, so let's avoid +// doing `8 * sizeof(limb)`. +#if defined(FASTFLOAT_64BIT) && !defined(__sparc) +#define FASTFLOAT_64BIT_LIMB 1 +typedef uint64_t limb; +constexpr size_t limb_bits = 64; +#else +#define FASTFLOAT_32BIT_LIMB +typedef uint32_t limb; +constexpr size_t limb_bits = 32; +#endif + +typedef span limb_span; + +// number of bits in a bigint. this needs to be at least the number +// of bits required to store the largest bigint, which is +// `log2(10**(digits + max_exp))`, or `log2(10**(767 + 342))`, or +// ~3600 bits, so we round to 4000. +constexpr size_t bigint_bits = 4000; +constexpr size_t bigint_limbs = bigint_bits / limb_bits; + +// vector-like type that is allocated on the stack. the entire +// buffer is pre-allocated, and only the length changes. +template struct stackvec { + limb data[size]; + // we never need more than 150 limbs + uint16_t length{0}; + + stackvec() = default; + stackvec(stackvec const &) = delete; + stackvec &operator=(stackvec const &) = delete; + stackvec(stackvec &&) = delete; + stackvec &operator=(stackvec &&other) = delete; + + // create stack vector from existing limb span. + FASTFLOAT_CONSTEXPR20 stackvec(limb_span s) { + FASTFLOAT_ASSERT(try_extend(s)); + } + + FASTFLOAT_CONSTEXPR14 limb &operator[](size_t index) noexcept { + FASTFLOAT_DEBUG_ASSERT(index < length); + return data[index]; + } + + FASTFLOAT_CONSTEXPR14 const limb &operator[](size_t index) const noexcept { + FASTFLOAT_DEBUG_ASSERT(index < length); + return data[index]; + } + + // index from the end of the container + FASTFLOAT_CONSTEXPR14 const limb &rindex(size_t index) const noexcept { + FASTFLOAT_DEBUG_ASSERT(index < length); + size_t rindex = length - index - 1; + return data[rindex]; + } + + // set the length, without bounds checking. + FASTFLOAT_CONSTEXPR14 void set_len(size_t len) noexcept { + length = uint16_t(len); + } + + constexpr size_t len() const noexcept { return length; } + + constexpr bool is_empty() const noexcept { return length == 0; } + + constexpr size_t capacity() const noexcept { return size; } + + // append item to vector, without bounds checking + FASTFLOAT_CONSTEXPR14 void push_unchecked(limb value) noexcept { + data[length] = value; + length++; + } + + // append item to vector, returning if item was added + FASTFLOAT_CONSTEXPR14 bool try_push(limb value) noexcept { + if (len() < capacity()) { + push_unchecked(value); + return true; + } else { + return false; + } + } + + // add items to the vector, from a span, without bounds checking + FASTFLOAT_CONSTEXPR20 void extend_unchecked(limb_span s) noexcept { + limb *ptr = data + length; + std::copy_n(s.ptr, s.len(), ptr); + set_len(len() + s.len()); + } + + // try to add items to the vector, returning if items were added + FASTFLOAT_CONSTEXPR20 bool try_extend(limb_span s) noexcept { + if (len() + s.len() <= capacity()) { + extend_unchecked(s); + return true; + } else { + return false; + } + } + + // resize the vector, without bounds checking + // if the new size is longer than the vector, assign value to each + // appended item. + FASTFLOAT_CONSTEXPR20 + void resize_unchecked(size_t new_len, limb value) noexcept { + if (new_len > len()) { + size_t count = new_len - len(); + limb *first = data + len(); + limb *last = first + count; + ::std::fill(first, last, value); + set_len(new_len); + } else { + set_len(new_len); + } + } + + // try to resize the vector, returning if the vector was resized. + FASTFLOAT_CONSTEXPR20 bool try_resize(size_t new_len, limb value) noexcept { + if (new_len > capacity()) { + return false; + } else { + resize_unchecked(new_len, value); + return true; + } + } + + // check if any limbs are non-zero after the given index. + // this needs to be done in reverse order, since the index + // is relative to the most significant limbs. + FASTFLOAT_CONSTEXPR14 bool nonzero(size_t index) const noexcept { + while (index < len()) { + if (rindex(index) != 0) { + return true; + } + index++; + } + return false; + } + + // normalize the big integer, so most-significant zero limbs are removed. + FASTFLOAT_CONSTEXPR14 void normalize() noexcept { + while (len() > 0 && rindex(0) == 0) { + length--; + } + } +}; + +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 uint64_t +empty_hi64(bool &truncated) noexcept { + truncated = false; + return 0; +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t +uint64_hi64(uint64_t r0, bool &truncated) noexcept { + truncated = false; + int shl = leading_zeroes(r0); + return r0 << shl; +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t +uint64_hi64(uint64_t r0, uint64_t r1, bool &truncated) noexcept { + int shl = leading_zeroes(r0); + if (shl == 0) { + truncated = r1 != 0; + return r0; + } else { + int shr = 64 - shl; + truncated = (r1 << shl) != 0; + return (r0 << shl) | (r1 >> shr); + } +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t +uint32_hi64(uint32_t r0, bool &truncated) noexcept { + return uint64_hi64(r0, truncated); +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t +uint32_hi64(uint32_t r0, uint32_t r1, bool &truncated) noexcept { + uint64_t x0 = r0; + uint64_t x1 = r1; + return uint64_hi64((x0 << 32) | x1, truncated); +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 uint64_t +uint32_hi64(uint32_t r0, uint32_t r1, uint32_t r2, bool &truncated) noexcept { + uint64_t x0 = r0; + uint64_t x1 = r1; + uint64_t x2 = r2; + return uint64_hi64(x0, (x1 << 32) | x2, truncated); +} + +// add two small integers, checking for overflow. +// we want an efficient operation. for msvc, where +// we don't have built-in intrinsics, this is still +// pretty fast. +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 limb +scalar_add(limb x, limb y, bool &overflow) noexcept { + limb z; +// gcc and clang +#if defined(__has_builtin) +#if __has_builtin(__builtin_add_overflow) + if (!cpp20_and_in_constexpr()) { + overflow = __builtin_add_overflow(x, y, &z); + return z; + } +#endif +#endif + + // generic, this still optimizes correctly on MSVC. + z = x + y; + overflow = z < x; + return z; +} + +// multiply two small integers, getting both the high and low bits. +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 limb +scalar_mul(limb x, limb y, limb &carry) noexcept { +#ifdef FASTFLOAT_64BIT_LIMB +#if defined(__SIZEOF_INT128__) + // GCC and clang both define it as an extension. + __uint128_t z = __uint128_t(x) * __uint128_t(y) + __uint128_t(carry); + carry = limb(z >> limb_bits); + return limb(z); +#else + // fallback, no native 128-bit integer multiplication with carry. + // on msvc, this optimizes identically, somehow. + value128 z = full_multiplication(x, y); + bool overflow; + z.low = scalar_add(z.low, carry, overflow); + z.high += uint64_t(overflow); // cannot overflow + carry = z.high; + return z.low; +#endif +#else + uint64_t z = uint64_t(x) * uint64_t(y) + uint64_t(carry); + carry = limb(z >> limb_bits); + return limb(z); +#endif +} + +// add scalar value to bigint starting from offset. +// used in grade school multiplication +template +inline FASTFLOAT_CONSTEXPR20 bool small_add_from(stackvec &vec, limb y, + size_t start) noexcept { + size_t index = start; + limb carry = y; + bool overflow; + while (carry != 0 && index < vec.len()) { + vec[index] = scalar_add(vec[index], carry, overflow); + carry = limb(overflow); + index += 1; + } + if (carry != 0) { + FASTFLOAT_TRY(vec.try_push(carry)); + } + return true; +} + +// add scalar value to bigint. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool +small_add(stackvec &vec, limb y) noexcept { + return small_add_from(vec, y, 0); +} + +// multiply bigint by scalar value. +template +inline FASTFLOAT_CONSTEXPR20 bool small_mul(stackvec &vec, + limb y) noexcept { + limb carry = 0; + for (size_t index = 0; index < vec.len(); index++) { + vec[index] = scalar_mul(vec[index], y, carry); + } + if (carry != 0) { + FASTFLOAT_TRY(vec.try_push(carry)); + } + return true; +} + +// add bigint to bigint starting from index. +// used in grade school multiplication +template +FASTFLOAT_CONSTEXPR20 bool large_add_from(stackvec &x, limb_span y, + size_t start) noexcept { + // the effective x buffer is from `xstart..x.len()`, so exit early + // if we can't get that current range. + if (x.len() < start || y.len() > x.len() - start) { + FASTFLOAT_TRY(x.try_resize(y.len() + start, 0)); + } + + bool carry = false; + for (size_t index = 0; index < y.len(); index++) { + limb xi = x[index + start]; + limb yi = y[index]; + bool c1 = false; + bool c2 = false; + xi = scalar_add(xi, yi, c1); + if (carry) { + xi = scalar_add(xi, 1, c2); + } + x[index + start] = xi; + carry = c1 | c2; + } + + // handle overflow + if (carry) { + FASTFLOAT_TRY(small_add_from(x, 1, y.len() + start)); + } + return true; +} + +// add bigint to bigint. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool +large_add_from(stackvec &x, limb_span y) noexcept { + return large_add_from(x, y, 0); +} + +// grade-school multiplication algorithm +template +FASTFLOAT_CONSTEXPR20 bool long_mul(stackvec &x, limb_span y) noexcept { + limb_span xs = limb_span(x.data, x.len()); + stackvec z(xs); + limb_span zs = limb_span(z.data, z.len()); + + if (y.len() != 0) { + limb y0 = y[0]; + FASTFLOAT_TRY(small_mul(x, y0)); + for (size_t index = 1; index < y.len(); index++) { + limb yi = y[index]; + stackvec zi; + if (yi != 0) { + // re-use the same buffer throughout + zi.set_len(0); + FASTFLOAT_TRY(zi.try_extend(zs)); + FASTFLOAT_TRY(small_mul(zi, yi)); + limb_span zis = limb_span(zi.data, zi.len()); + FASTFLOAT_TRY(large_add_from(x, zis, index)); + } + } + } + + x.normalize(); + return true; +} + +// grade-school multiplication algorithm +template +FASTFLOAT_CONSTEXPR20 bool large_mul(stackvec &x, limb_span y) noexcept { + if (y.len() == 1) { + FASTFLOAT_TRY(small_mul(x, y[0])); + } else { + FASTFLOAT_TRY(long_mul(x, y)); + } + return true; +} + +template struct pow5_tables { + static constexpr uint32_t large_step = 135; + static constexpr uint64_t small_power_of_5[] = { + 1UL, + 5UL, + 25UL, + 125UL, + 625UL, + 3125UL, + 15625UL, + 78125UL, + 390625UL, + 1953125UL, + 9765625UL, + 48828125UL, + 244140625UL, + 1220703125UL, + 6103515625UL, + 30517578125UL, + 152587890625UL, + 762939453125UL, + 3814697265625UL, + 19073486328125UL, + 95367431640625UL, + 476837158203125UL, + 2384185791015625UL, + 11920928955078125UL, + 59604644775390625UL, + 298023223876953125UL, + 1490116119384765625UL, + 7450580596923828125UL, + }; +#ifdef FASTFLOAT_64BIT_LIMB + constexpr static limb large_power_of_5[] = { + 1414648277510068013UL, 9180637584431281687UL, 4539964771860779200UL, + 10482974169319127550UL, 198276706040285095UL}; +#else + constexpr static limb large_power_of_5[] = { + 4279965485U, 329373468U, 4020270615U, 2137533757U, 4287402176U, + 1057042919U, 1071430142U, 2440757623U, 381945767U, 46164893U}; +#endif +}; + +#if FASTFLOAT_DETAIL_MUST_DEFINE_CONSTEXPR_VARIABLE + +template constexpr uint32_t pow5_tables::large_step; + +template constexpr uint64_t pow5_tables::small_power_of_5[]; + +template constexpr limb pow5_tables::large_power_of_5[]; + +#endif + +// big integer type. implements a small subset of big integer +// arithmetic, using simple algorithms since asymptotically +// faster algorithms are slower for a small number of limbs. +// all operations assume the big-integer is normalized. +struct bigint : pow5_tables<> { + // storage of the limbs, in little-endian order. + stackvec vec; + + FASTFLOAT_CONSTEXPR20 bigint() : vec() {} + + bigint(bigint const &) = delete; + bigint &operator=(bigint const &) = delete; + bigint(bigint &&) = delete; + bigint &operator=(bigint &&other) = delete; + + FASTFLOAT_CONSTEXPR20 bigint(uint64_t value) : vec() { +#ifdef FASTFLOAT_64BIT_LIMB + vec.push_unchecked(value); +#else + vec.push_unchecked(uint32_t(value)); + vec.push_unchecked(uint32_t(value >> 32)); +#endif + vec.normalize(); + } + + // get the high 64 bits from the vector, and if bits were truncated. + // this is to get the significant digits for the float. + FASTFLOAT_CONSTEXPR20 uint64_t hi64(bool &truncated) const noexcept { +#ifdef FASTFLOAT_64BIT_LIMB + if (vec.len() == 0) { + return empty_hi64(truncated); + } else if (vec.len() == 1) { + return uint64_hi64(vec.rindex(0), truncated); + } else { + uint64_t result = uint64_hi64(vec.rindex(0), vec.rindex(1), truncated); + truncated |= vec.nonzero(2); + return result; + } +#else + if (vec.len() == 0) { + return empty_hi64(truncated); + } else if (vec.len() == 1) { + return uint32_hi64(vec.rindex(0), truncated); + } else if (vec.len() == 2) { + return uint32_hi64(vec.rindex(0), vec.rindex(1), truncated); + } else { + uint64_t result = + uint32_hi64(vec.rindex(0), vec.rindex(1), vec.rindex(2), truncated); + truncated |= vec.nonzero(3); + return result; + } +#endif + } + + // compare two big integers, returning the large value. + // assumes both are normalized. if the return value is + // negative, other is larger, if the return value is + // positive, this is larger, otherwise they are equal. + // the limbs are stored in little-endian order, so we + // must compare the limbs in ever order. + FASTFLOAT_CONSTEXPR20 int compare(bigint const &other) const noexcept { + if (vec.len() > other.vec.len()) { + return 1; + } else if (vec.len() < other.vec.len()) { + return -1; + } else { + for (size_t index = vec.len(); index > 0; index--) { + limb xi = vec[index - 1]; + limb yi = other.vec[index - 1]; + if (xi > yi) { + return 1; + } else if (xi < yi) { + return -1; + } + } + return 0; + } + } + + // shift left each limb n bits, carrying over to the new limb + // returns true if we were able to shift all the digits. + FASTFLOAT_CONSTEXPR20 bool shl_bits(size_t n) noexcept { + // Internally, for each item, we shift left by n, and add the previous + // right shifted limb-bits. + // For example, we transform (for u8) shifted left 2, to: + // b10100100 b01000010 + // b10 b10010001 b00001000 + FASTFLOAT_DEBUG_ASSERT(n != 0); + FASTFLOAT_DEBUG_ASSERT(n < sizeof(limb) * 8); + + size_t shl = n; + size_t shr = limb_bits - shl; + limb prev = 0; + for (size_t index = 0; index < vec.len(); index++) { + limb xi = vec[index]; + vec[index] = (xi << shl) | (prev >> shr); + prev = xi; + } + + limb carry = prev >> shr; + if (carry != 0) { + return vec.try_push(carry); + } + return true; + } + + // move the limbs left by `n` limbs. + FASTFLOAT_CONSTEXPR20 bool shl_limbs(size_t n) noexcept { + FASTFLOAT_DEBUG_ASSERT(n != 0); + if (n + vec.len() > vec.capacity()) { + return false; + } else if (!vec.is_empty()) { + // move limbs + limb *dst = vec.data + n; + limb const *src = vec.data; + std::copy_backward(src, src + vec.len(), dst + vec.len()); + // fill in empty limbs + limb *first = vec.data; + limb *last = first + n; + ::std::fill(first, last, 0); + vec.set_len(n + vec.len()); + return true; + } else { + return true; + } + } + + // move the limbs left by `n` bits. + FASTFLOAT_CONSTEXPR20 bool shl(size_t n) noexcept { + size_t rem = n % limb_bits; + size_t div = n / limb_bits; + if (rem != 0) { + FASTFLOAT_TRY(shl_bits(rem)); + } + if (div != 0) { + FASTFLOAT_TRY(shl_limbs(div)); + } + return true; + } + + // get the number of leading zeros in the bigint. + FASTFLOAT_CONSTEXPR20 int ctlz() const noexcept { + if (vec.is_empty()) { + return 0; + } else { +#ifdef FASTFLOAT_64BIT_LIMB + return leading_zeroes(vec.rindex(0)); +#else + // no use defining a specialized leading_zeroes for a 32-bit type. + uint64_t r0 = vec.rindex(0); + return leading_zeroes(r0 << 32); +#endif + } + } + + // get the number of bits in the bigint. + FASTFLOAT_CONSTEXPR20 int bit_length() const noexcept { + int lz = ctlz(); + return int(limb_bits * vec.len()) - lz; + } + + FASTFLOAT_CONSTEXPR20 bool mul(limb y) noexcept { return small_mul(vec, y); } + + FASTFLOAT_CONSTEXPR20 bool add(limb y) noexcept { return small_add(vec, y); } + + // multiply as if by 2 raised to a power. + FASTFLOAT_CONSTEXPR20 bool pow2(uint32_t exp) noexcept { return shl(exp); } + + // multiply as if by 5 raised to a power. + FASTFLOAT_CONSTEXPR20 bool pow5(uint32_t exp) noexcept { + // multiply by a power of 5 + size_t large_length = sizeof(large_power_of_5) / sizeof(limb); + limb_span large = limb_span(large_power_of_5, large_length); + while (exp >= large_step) { + FASTFLOAT_TRY(large_mul(vec, large)); + exp -= large_step; + } +#ifdef FASTFLOAT_64BIT_LIMB + uint32_t small_step = 27; + limb max_native = 7450580596923828125UL; +#else + uint32_t small_step = 13; + limb max_native = 1220703125U; +#endif + while (exp >= small_step) { + FASTFLOAT_TRY(small_mul(vec, max_native)); + exp -= small_step; + } + if (exp != 0) { + // Work around clang bug https://godbolt.org/z/zedh7rrhc + // This is similar to https://github.com/llvm/llvm-project/issues/47746, + // except the workaround described there don't work here + FASTFLOAT_TRY(small_mul( + vec, limb(((void)small_power_of_5[0], small_power_of_5[exp])))); + } + + return true; + } + + // multiply as if by 10 raised to a power. + FASTFLOAT_CONSTEXPR20 bool pow10(uint32_t exp) noexcept { + FASTFLOAT_TRY(pow5(exp)); + return pow2(exp); + } +}; + +} // namespace fast_float + +#endif + +#ifndef FASTFLOAT_DIGIT_COMPARISON_H +#define FASTFLOAT_DIGIT_COMPARISON_H + +#include +#include +#include +#include + + +namespace fast_float { + +// 1e0 to 1e19 +constexpr static uint64_t powers_of_ten_uint64[] = {1UL, + 10UL, + 100UL, + 1000UL, + 10000UL, + 100000UL, + 1000000UL, + 10000000UL, + 100000000UL, + 1000000000UL, + 10000000000UL, + 100000000000UL, + 1000000000000UL, + 10000000000000UL, + 100000000000000UL, + 1000000000000000UL, + 10000000000000000UL, + 100000000000000000UL, + 1000000000000000000UL, + 10000000000000000000UL}; + +// calculate the exponent, in scientific notation, of the number. +// this algorithm is not even close to optimized, but it has no practical +// effect on performance: in order to have a faster algorithm, we'd need +// to slow down performance for faster algorithms, and this is still fast. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 int32_t +scientific_exponent(parsed_number_string_t &num) noexcept { + uint64_t mantissa = num.mantissa; + int32_t exponent = int32_t(num.exponent); + while (mantissa >= 10000) { + mantissa /= 10000; + exponent += 4; + } + while (mantissa >= 100) { + mantissa /= 100; + exponent += 2; + } + while (mantissa >= 10) { + mantissa /= 10; + exponent += 1; + } + return exponent; +} + +// this converts a native floating-point number to an extended-precision float. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa +to_extended(T value) noexcept { + using equiv_uint = equiv_uint_t; + constexpr equiv_uint exponent_mask = binary_format::exponent_mask(); + constexpr equiv_uint mantissa_mask = binary_format::mantissa_mask(); + constexpr equiv_uint hidden_bit_mask = binary_format::hidden_bit_mask(); + + adjusted_mantissa am; + int32_t bias = binary_format::mantissa_explicit_bits() - + binary_format::minimum_exponent(); + equiv_uint bits; +#if FASTFLOAT_HAS_BIT_CAST + bits = std::bit_cast(value); +#else + ::memcpy(&bits, &value, sizeof(T)); +#endif + if ((bits & exponent_mask) == 0) { + // denormal + am.power2 = 1 - bias; + am.mantissa = bits & mantissa_mask; + } else { + // normal + am.power2 = int32_t((bits & exponent_mask) >> + binary_format::mantissa_explicit_bits()); + am.power2 -= bias; + am.mantissa = (bits & mantissa_mask) | hidden_bit_mask; + } + + return am; +} + +// get the extended precision value of the halfway point between b and b+u. +// we are given a native float that represents b, so we need to adjust it +// halfway between b and b+u. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa +to_extended_halfway(T value) noexcept { + adjusted_mantissa am = to_extended(value); + am.mantissa <<= 1; + am.mantissa += 1; + am.power2 -= 1; + return am; +} + +// round an extended-precision float to the nearest machine float. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 void round(adjusted_mantissa &am, + callback cb) noexcept { + int32_t mantissa_shift = 64 - binary_format::mantissa_explicit_bits() - 1; + if (-am.power2 >= mantissa_shift) { + // have a denormal float + int32_t shift = -am.power2 + 1; + cb(am, std::min(shift, 64)); + // check for round-up: if rounding-nearest carried us to the hidden bit. + am.power2 = (am.mantissa < + (uint64_t(1) << binary_format::mantissa_explicit_bits())) + ? 0 + : 1; + return; + } + + // have a normal float, use the default shift. + cb(am, mantissa_shift); + + // check for carry + if (am.mantissa >= + (uint64_t(2) << binary_format::mantissa_explicit_bits())) { + am.mantissa = (uint64_t(1) << binary_format::mantissa_explicit_bits()); + am.power2++; + } + + // check for infinite: we could have carried to an infinite power + am.mantissa &= ~(uint64_t(1) << binary_format::mantissa_explicit_bits()); + if (am.power2 >= binary_format::infinite_power()) { + am.power2 = binary_format::infinite_power(); + am.mantissa = 0; + } +} + +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 void +round_nearest_tie_even(adjusted_mantissa &am, int32_t shift, + callback cb) noexcept { + uint64_t const mask = (shift == 64) ? UINT64_MAX : (uint64_t(1) << shift) - 1; + uint64_t const halfway = (shift == 0) ? 0 : uint64_t(1) << (shift - 1); + uint64_t truncated_bits = am.mantissa & mask; + bool is_above = truncated_bits > halfway; + bool is_halfway = truncated_bits == halfway; + + // shift digits into position + if (shift == 64) { + am.mantissa = 0; + } else { + am.mantissa >>= shift; + } + am.power2 += shift; + + bool is_odd = (am.mantissa & 1) == 1; + am.mantissa += uint64_t(cb(is_odd, is_halfway, is_above)); +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 void +round_down(adjusted_mantissa &am, int32_t shift) noexcept { + if (shift == 64) { + am.mantissa = 0; + } else { + am.mantissa >>= shift; + } + am.power2 += shift; +} + +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void +skip_zeros(UC const *&first, UC const *last) noexcept { + uint64_t val; + while (!cpp20_and_in_constexpr() && + std::distance(first, last) >= int_cmp_len()) { + ::memcpy(&val, first, sizeof(uint64_t)); + if (val != int_cmp_zeros()) { + break; + } + first += int_cmp_len(); + } + while (first != last) { + if (*first != UC('0')) { + break; + } + first++; + } +} + +// determine if any non-zero digits were truncated. +// all characters must be valid digits. +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool +is_truncated(UC const *first, UC const *last) noexcept { + // do 8-bit optimizations, can just compare to 8 literal 0s. + uint64_t val; + while (!cpp20_and_in_constexpr() && + std::distance(first, last) >= int_cmp_len()) { + ::memcpy(&val, first, sizeof(uint64_t)); + if (val != int_cmp_zeros()) { + return true; + } + first += int_cmp_len(); + } + while (first != last) { + if (*first != UC('0')) { + return true; + } + ++first; + } + return false; +} + +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool +is_truncated(span s) noexcept { + return is_truncated(s.ptr, s.ptr + s.len()); +} + +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void +parse_eight_digits(UC const *&p, limb &value, size_t &counter, + size_t &count) noexcept { + value = value * 100000000 + parse_eight_digits_unrolled(p); + p += 8; + counter += 8; + count += 8; +} + +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR14 void +parse_one_digit(UC const *&p, limb &value, size_t &counter, + size_t &count) noexcept { + value = value * 10 + limb(*p - UC('0')); + p++; + counter++; + count++; +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void +add_native(bigint &big, limb power, limb value) noexcept { + big.mul(power); + big.add(value); +} + +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 void +round_up_bigint(bigint &big, size_t &count) noexcept { + // need to round-up the digits, but need to avoid rounding + // ....9999 to ...10000, which could cause a false halfway point. + add_native(big, 10, 1); + count++; +} + +// parse the significant digits into a big integer +template +inline FASTFLOAT_CONSTEXPR20 void +parse_mantissa(bigint &result, parsed_number_string_t &num, + size_t max_digits, size_t &digits) noexcept { + // try to minimize the number of big integer and scalar multiplication. + // therefore, try to parse 8 digits at a time, and multiply by the largest + // scalar value (9 or 19 digits) for each step. + size_t counter = 0; + digits = 0; + limb value = 0; +#ifdef FASTFLOAT_64BIT_LIMB + size_t step = 19; +#else + size_t step = 9; +#endif + + // process all integer digits. + UC const *p = num.integer.ptr; + UC const *pend = p + num.integer.len(); + skip_zeros(p, pend); + // process all digits, in increments of step per loop + while (p != pend) { + while ((std::distance(p, pend) >= 8) && (step - counter >= 8) && + (max_digits - digits >= 8)) { + parse_eight_digits(p, value, counter, digits); + } + while (counter < step && p != pend && digits < max_digits) { + parse_one_digit(p, value, counter, digits); + } + if (digits == max_digits) { + // add the temporary value, then check if we've truncated any digits + add_native(result, limb(powers_of_ten_uint64[counter]), value); + bool truncated = is_truncated(p, pend); + if (num.fraction.ptr != nullptr) { + truncated |= is_truncated(num.fraction); + } + if (truncated) { + round_up_bigint(result, digits); + } + return; + } else { + add_native(result, limb(powers_of_ten_uint64[counter]), value); + counter = 0; + value = 0; + } + } + + // add our fraction digits, if they're available. + if (num.fraction.ptr != nullptr) { + p = num.fraction.ptr; + pend = p + num.fraction.len(); + if (digits == 0) { + skip_zeros(p, pend); + } + // process all digits, in increments of step per loop + while (p != pend) { + while ((std::distance(p, pend) >= 8) && (step - counter >= 8) && + (max_digits - digits >= 8)) { + parse_eight_digits(p, value, counter, digits); + } + while (counter < step && p != pend && digits < max_digits) { + parse_one_digit(p, value, counter, digits); + } + if (digits == max_digits) { + // add the temporary value, then check if we've truncated any digits + add_native(result, limb(powers_of_ten_uint64[counter]), value); + bool truncated = is_truncated(p, pend); + if (truncated) { + round_up_bigint(result, digits); + } + return; + } else { + add_native(result, limb(powers_of_ten_uint64[counter]), value); + counter = 0; + value = 0; + } + } + } + + if (counter != 0) { + add_native(result, limb(powers_of_ten_uint64[counter]), value); + } +} + +template +inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa +positive_digit_comp(bigint &bigmant, int32_t exponent) noexcept { + FASTFLOAT_ASSERT(bigmant.pow10(uint32_t(exponent))); + adjusted_mantissa answer; + bool truncated; + answer.mantissa = bigmant.hi64(truncated); + int bias = binary_format::mantissa_explicit_bits() - + binary_format::minimum_exponent(); + answer.power2 = bigmant.bit_length() - 64 + bias; + + round(answer, [truncated](adjusted_mantissa &a, int32_t shift) { + round_nearest_tie_even( + a, shift, + [truncated](bool is_odd, bool is_halfway, bool is_above) -> bool { + return is_above || (is_halfway && truncated) || + (is_odd && is_halfway); + }); + }); + + return answer; +} + +// the scaling here is quite simple: we have, for the real digits `m * 10^e`, +// and for the theoretical digits `n * 2^f`. Since `e` is always negative, +// to scale them identically, we do `n * 2^f * 5^-f`, so we now have `m * 2^e`. +// we then need to scale by `2^(f- e)`, and then the two significant digits +// are of the same magnitude. +template +inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa negative_digit_comp( + bigint &bigmant, adjusted_mantissa am, int32_t exponent) noexcept { + bigint &real_digits = bigmant; + int32_t real_exp = exponent; + + // get the value of `b`, rounded down, and get a bigint representation of b+h + adjusted_mantissa am_b = am; + // gcc7 buf: use a lambda to remove the noexcept qualifier bug with + // -Wnoexcept-type. + round(am_b, + [](adjusted_mantissa &a, int32_t shift) { round_down(a, shift); }); + T b; + to_float(false, am_b, b); + adjusted_mantissa theor = to_extended_halfway(b); + bigint theor_digits(theor.mantissa); + int32_t theor_exp = theor.power2; + + // scale real digits and theor digits to be same power. + int32_t pow2_exp = theor_exp - real_exp; + uint32_t pow5_exp = uint32_t(-real_exp); + if (pow5_exp != 0) { + FASTFLOAT_ASSERT(theor_digits.pow5(pow5_exp)); + } + if (pow2_exp > 0) { + FASTFLOAT_ASSERT(theor_digits.pow2(uint32_t(pow2_exp))); + } else if (pow2_exp < 0) { + FASTFLOAT_ASSERT(real_digits.pow2(uint32_t(-pow2_exp))); + } + + // compare digits, and use it to director rounding + int ord = real_digits.compare(theor_digits); + adjusted_mantissa answer = am; + round(answer, [ord](adjusted_mantissa &a, int32_t shift) { + round_nearest_tie_even( + a, shift, [ord](bool is_odd, bool _, bool __) -> bool { + (void)_; // not needed, since we've done our comparison + (void)__; // not needed, since we've done our comparison + if (ord > 0) { + return true; + } else if (ord < 0) { + return false; + } else { + return is_odd; + } + }); + }); + + return answer; +} + +// parse the significant digits as a big integer to unambiguously round the +// the significant digits. here, we are trying to determine how to round +// an extended float representation close to `b+h`, halfway between `b` +// (the float rounded-down) and `b+u`, the next positive float. this +// algorithm is always correct, and uses one of two approaches. when +// the exponent is positive relative to the significant digits (such as +// 1234), we create a big-integer representation, get the high 64-bits, +// determine if any lower bits are truncated, and use that to direct +// rounding. in case of a negative exponent relative to the significant +// digits (such as 1.2345), we create a theoretical representation of +// `b` as a big-integer type, scaled to the same binary exponent as +// the actual digits. we then compare the big integer representations +// of both, and use that to direct rounding. +template +inline FASTFLOAT_CONSTEXPR20 adjusted_mantissa +digit_comp(parsed_number_string_t &num, adjusted_mantissa am) noexcept { + // remove the invalid exponent bias + am.power2 -= invalid_am_bias; + + int32_t sci_exp = scientific_exponent(num); + size_t max_digits = binary_format::max_digits(); + size_t digits = 0; + bigint bigmant; + parse_mantissa(bigmant, num, max_digits, digits); + // can't underflow, since digits is at most max_digits. + int32_t exponent = sci_exp + 1 - int32_t(digits); + if (exponent >= 0) { + return positive_digit_comp(bigmant, exponent); + } else { + return negative_digit_comp(bigmant, am, exponent); + } +} + +} // namespace fast_float + +#endif + +#ifndef FASTFLOAT_PARSE_NUMBER_H +#define FASTFLOAT_PARSE_NUMBER_H + + +#include +#include +#include +#include + +namespace fast_float { + +namespace detail { +/** + * Special case +inf, -inf, nan, infinity, -infinity. + * The case comparisons could be made much faster given that we know that the + * strings a null-free and fixed. + **/ +template +from_chars_result_t + FASTFLOAT_CONSTEXPR14 parse_infnan(UC const *first, UC const *last, + T &value, chars_format fmt) noexcept { + from_chars_result_t answer{}; + answer.ptr = first; + answer.ec = std::errc(); // be optimistic + // assume first < last, so dereference without checks; + bool const minusSign = (*first == UC('-')); + // C++17 20.19.3.(7.1) explicitly forbids '+' sign here + if ((*first == UC('-')) || + (uint64_t(fmt & chars_format::allow_leading_plus) && + (*first == UC('+')))) { + ++first; + } + if (last - first >= 3) { + if (fastfloat_strncasecmp(first, str_const_nan(), 3)) { + answer.ptr = (first += 3); + value = minusSign ? -std::numeric_limits::quiet_NaN() + : std::numeric_limits::quiet_NaN(); + // Check for possible nan(n-char-seq-opt), C++17 20.19.3.7, + // C11 7.20.1.3.3. At least MSVC produces nan(ind) and nan(snan). + if (first != last && *first == UC('(')) { + for (UC const *ptr = first + 1; ptr != last; ++ptr) { + if (*ptr == UC(')')) { + answer.ptr = ptr + 1; // valid nan(n-char-seq-opt) + break; + } else if (!((UC('a') <= *ptr && *ptr <= UC('z')) || + (UC('A') <= *ptr && *ptr <= UC('Z')) || + (UC('0') <= *ptr && *ptr <= UC('9')) || *ptr == UC('_'))) + break; // forbidden char, not nan(n-char-seq-opt) + } + } + return answer; + } + if (fastfloat_strncasecmp(first, str_const_inf(), 3)) { + if ((last - first >= 8) && + fastfloat_strncasecmp(first + 3, str_const_inf() + 3, 5)) { + answer.ptr = first + 8; + } else { + answer.ptr = first + 3; + } + value = minusSign ? -std::numeric_limits::infinity() + : std::numeric_limits::infinity(); + return answer; + } + } + answer.ec = std::errc::invalid_argument; + return answer; +} + +/** + * Returns true if the floating-pointing rounding mode is to 'nearest'. + * It is the default on most system. This function is meant to be inexpensive. + * Credit : @mwalcott3 + */ +fastfloat_really_inline bool rounds_to_nearest() noexcept { + // https://lemire.me/blog/2020/06/26/gcc-not-nearest/ +#if (FLT_EVAL_METHOD != 1) && (FLT_EVAL_METHOD != 0) + return false; +#endif + // See + // A fast function to check your floating-point rounding mode + // https://lemire.me/blog/2022/11/16/a-fast-function-to-check-your-floating-point-rounding-mode/ + // + // This function is meant to be equivalent to : + // prior: #include + // return fegetround() == FE_TONEAREST; + // However, it is expected to be much faster than the fegetround() + // function call. + // + // The volatile keyword prevents the compiler from computing the function + // at compile-time. + // There might be other ways to prevent compile-time optimizations (e.g., + // asm). The value does not need to be std::numeric_limits::min(), any + // small value so that 1 + x should round to 1 would do (after accounting for + // excess precision, as in 387 instructions). + static float volatile fmin = std::numeric_limits::min(); + float fmini = fmin; // we copy it so that it gets loaded at most once. +// +// Explanation: +// Only when fegetround() == FE_TONEAREST do we have that +// fmin + 1.0f == 1.0f - fmin. +// +// FE_UPWARD: +// fmin + 1.0f > 1 +// 1.0f - fmin == 1 +// +// FE_DOWNWARD or FE_TOWARDZERO: +// fmin + 1.0f == 1 +// 1.0f - fmin < 1 +// +// Note: This may fail to be accurate if fast-math has been +// enabled, as rounding conventions may not apply. +#ifdef FASTFLOAT_VISUAL_STUDIO +#pragma warning(push) +// todo: is there a VS warning? +// see +// https://stackoverflow.com/questions/46079446/is-there-a-warning-for-floating-point-equality-checking-in-visual-studio-2013 +#elif defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wfloat-equal" +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + return (fmini + 1.0f == 1.0f - fmini); +#ifdef FASTFLOAT_VISUAL_STUDIO +#pragma warning(pop) +#elif defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#endif +} + +} // namespace detail + +template struct from_chars_caller { + template + FASTFLOAT_CONSTEXPR20 static from_chars_result_t + call(UC const *first, UC const *last, T &value, + parse_options_t options) noexcept { + return from_chars_advanced(first, last, value, options); + } +}; + +#ifdef __STDCPP_FLOAT32_T__ +template <> struct from_chars_caller { + template + FASTFLOAT_CONSTEXPR20 static from_chars_result_t + call(UC const *first, UC const *last, std::float32_t &value, + parse_options_t options) noexcept { + // if std::float32_t is defined, and we are in C++23 mode; macro set for + // float32; set value to float due to equivalence between float and + // float32_t + float val; + auto ret = from_chars_advanced(first, last, val, options); + value = val; + return ret; + } +}; +#endif + +#ifdef __STDCPP_FLOAT64_T__ +template <> struct from_chars_caller { + template + FASTFLOAT_CONSTEXPR20 static from_chars_result_t + call(UC const *first, UC const *last, std::float64_t &value, + parse_options_t options) noexcept { + // if std::float64_t is defined, and we are in C++23 mode; macro set for + // float64; set value as double due to equivalence between double and + // float64_t + double val; + auto ret = from_chars_advanced(first, last, val, options); + value = val; + return ret; + } +}; +#endif + +template +FASTFLOAT_CONSTEXPR20 from_chars_result_t +from_chars(UC const *first, UC const *last, T &value, + chars_format fmt /*= chars_format::general*/) noexcept { + return from_chars_caller::call(first, last, value, + parse_options_t(fmt)); +} + +template +fastfloat_really_inline FASTFLOAT_CONSTEXPR20 bool +clinger_fast_path_impl(uint64_t mantissa, int64_t exponent, bool is_negative, + T &value) noexcept { + // The implementation of the Clinger's fast path is convoluted because + // we want round-to-nearest in all cases, irrespective of the rounding mode + // selected on the thread. + // We proceed optimistically, assuming that detail::rounds_to_nearest() + // returns true. + if (binary_format::min_exponent_fast_path() <= exponent && + exponent <= binary_format::max_exponent_fast_path()) { + // Unfortunately, the conventional Clinger's fast path is only possible + // when the system rounds to the nearest float. + // + // We expect the next branch to almost always be selected. + // We could check it first (before the previous branch), but + // there might be performance advantages at having the check + // be last. + if (!cpp20_and_in_constexpr() && detail::rounds_to_nearest()) { + // We have that fegetround() == FE_TONEAREST. + // Next is Clinger's fast path. + if (mantissa <= binary_format::max_mantissa_fast_path()) { + value = T(mantissa); + if (exponent < 0) { + value = value / binary_format::exact_power_of_ten(-exponent); + } else { + value = value * binary_format::exact_power_of_ten(exponent); + } + if (is_negative) { + value = -value; + } + return true; + } + } else { + // We do not have that fegetround() == FE_TONEAREST. + // Next is a modified Clinger's fast path, inspired by Jakub Jelínek's + // proposal + if (exponent >= 0 && + mantissa <= binary_format::max_mantissa_fast_path(exponent)) { +#if defined(__clang__) || defined(FASTFLOAT_32BIT) + // Clang may map 0 to -0.0 when fegetround() == FE_DOWNWARD + if (mantissa == 0) { + value = is_negative ? T(-0.) : T(0.); + return true; + } +#endif + value = T(mantissa) * binary_format::exact_power_of_ten(exponent); + if (is_negative) { + value = -value; + } + return true; + } + } + } + return false; +} + +/** + * This function overload takes parsed_number_string_t structure that is created + * and populated either by from_chars_advanced function taking chars range and + * parsing options or other parsing custom function implemented by user. + */ +template +FASTFLOAT_CONSTEXPR20 from_chars_result_t +from_chars_advanced(parsed_number_string_t &pns, T &value) noexcept { + static_assert(is_supported_float_type::value, + "only some floating-point types are supported"); + static_assert(is_supported_char_type::value, + "only char, wchar_t, char16_t and char32_t are supported"); + + from_chars_result_t answer; + + answer.ec = std::errc(); // be optimistic + answer.ptr = pns.lastmatch; + + if (!pns.too_many_digits && + clinger_fast_path_impl(pns.mantissa, pns.exponent, pns.negative, value)) + return answer; + + adjusted_mantissa am = + compute_float>(pns.exponent, pns.mantissa); + if (pns.too_many_digits && am.power2 >= 0) { + if (am != compute_float>(pns.exponent, pns.mantissa + 1)) { + am = compute_error>(pns.exponent, pns.mantissa); + } + } + // If we called compute_float>(pns.exponent, pns.mantissa) + // and we have an invalid power (am.power2 < 0), then we need to go the long + // way around again. This is very uncommon. + if (am.power2 < 0) { + am = digit_comp(pns, am); + } + to_float(pns.negative, am, value); + // Test for over/underflow. + if ((pns.mantissa != 0 && am.mantissa == 0 && am.power2 == 0) || + am.power2 == binary_format::infinite_power()) { + answer.ec = std::errc::result_out_of_range; + } + return answer; +} + +template +FASTFLOAT_CONSTEXPR20 from_chars_result_t +from_chars_float_advanced(UC const *first, UC const *last, T &value, + parse_options_t options) noexcept { + + static_assert(is_supported_float_type::value, + "only some floating-point types are supported"); + static_assert(is_supported_char_type::value, + "only char, wchar_t, char16_t and char32_t are supported"); + + chars_format const fmt = detail::adjust_for_feature_macros(options.format); + + from_chars_result_t answer; + if (uint64_t(fmt & chars_format::skip_white_space)) { + while ((first != last) && fast_float::is_space(*first)) { + first++; + } + } + if (first == last) { + answer.ec = std::errc::invalid_argument; + answer.ptr = first; + return answer; + } + parsed_number_string_t pns = + uint64_t(fmt & detail::basic_json_fmt) + ? parse_number_string(first, last, options) + : parse_number_string(first, last, options); + if (!pns.valid) { + if (uint64_t(fmt & chars_format::no_infnan)) { + answer.ec = std::errc::invalid_argument; + answer.ptr = first; + return answer; + } else { + return detail::parse_infnan(first, last, value, fmt); + } + } + + // call overload that takes parsed_number_string_t directly. + return from_chars_advanced(pns, value); +} + +template +FASTFLOAT_CONSTEXPR20 from_chars_result_t +from_chars(UC const *first, UC const *last, T &value, int base) noexcept { + + static_assert(is_supported_integer_type::value, + "only integer types are supported"); + static_assert(is_supported_char_type::value, + "only char, wchar_t, char16_t and char32_t are supported"); + + parse_options_t options; + options.base = base; + return from_chars_advanced(first, last, value, options); +} + +FASTFLOAT_CONSTEXPR20 inline double +integer_times_pow10(uint64_t mantissa, int decimal_exponent) noexcept { + double value; + if (clinger_fast_path_impl(mantissa, decimal_exponent, false, value)) + return value; + + adjusted_mantissa am = + compute_float>(decimal_exponent, mantissa); + to_float(false, am, value); + return value; +} + +FASTFLOAT_CONSTEXPR20 inline double +integer_times_pow10(int64_t mantissa, int decimal_exponent) noexcept { + const bool is_negative = mantissa < 0; + const uint64_t m = static_cast(is_negative ? -mantissa : mantissa); + + double value; + if (clinger_fast_path_impl(m, decimal_exponent, is_negative, value)) + return value; + + adjusted_mantissa am = + compute_float>(decimal_exponent, m); + to_float(is_negative, am, value); + return value; +} + +// the following overloads are here to avoid surprising ambiguity for int, +// unsigned, etc. +template +FASTFLOAT_CONSTEXPR20 inline typename std::enable_if< + std::is_integral::value && !std::is_signed::value, double>::type +integer_times_pow10(Int mantissa, int decimal_exponent) noexcept { + return integer_times_pow10(static_cast(mantissa), decimal_exponent); +} + +template +FASTFLOAT_CONSTEXPR20 inline typename std::enable_if< + std::is_integral::value && std::is_signed::value, double>::type +integer_times_pow10(Int mantissa, int decimal_exponent) noexcept { + return integer_times_pow10(static_cast(mantissa), decimal_exponent); +} + +template +FASTFLOAT_CONSTEXPR20 from_chars_result_t +from_chars_int_advanced(UC const *first, UC const *last, T &value, + parse_options_t options) noexcept { + + static_assert(is_supported_integer_type::value, + "only integer types are supported"); + static_assert(is_supported_char_type::value, + "only char, wchar_t, char16_t and char32_t are supported"); + + chars_format const fmt = detail::adjust_for_feature_macros(options.format); + int const base = options.base; + + from_chars_result_t answer; + if (uint64_t(fmt & chars_format::skip_white_space)) { + while ((first != last) && fast_float::is_space(*first)) { + first++; + } + } + if (first == last || base < 2 || base > 36) { + answer.ec = std::errc::invalid_argument; + answer.ptr = first; + return answer; + } + + return parse_int_string(first, last, value, options); +} + +template struct from_chars_advanced_caller { + static_assert(TypeIx > 0, "unsupported type"); +}; + +template <> struct from_chars_advanced_caller<1> { + template + FASTFLOAT_CONSTEXPR20 static from_chars_result_t + call(UC const *first, UC const *last, T &value, + parse_options_t options) noexcept { + return from_chars_float_advanced(first, last, value, options); + } +}; + +template <> struct from_chars_advanced_caller<2> { + template + FASTFLOAT_CONSTEXPR20 static from_chars_result_t + call(UC const *first, UC const *last, T &value, + parse_options_t options) noexcept { + return from_chars_int_advanced(first, last, value, options); + } +}; + +template +FASTFLOAT_CONSTEXPR20 from_chars_result_t +from_chars_advanced(UC const *first, UC const *last, T &value, + parse_options_t options) noexcept { + return from_chars_advanced_caller< + size_t(is_supported_float_type::value) + + 2 * size_t(is_supported_integer_type::value)>::call(first, last, value, + options); +} + +} // namespace fast_float + +#endif + diff --git a/modules/nwtc-library/include/fast_float.md b/modules/nwtc-library/include/fast_float.md new file mode 100644 index 0000000000..7a6eb88aec --- /dev/null +++ b/modules/nwtc-library/include/fast_float.md @@ -0,0 +1,7 @@ +The `fast_float.h` C++ header provides functions for quickly parsing floating point numbers from strings. + +This library is licensed under the Apache 2.0 license (in addition to MIT and others, see header file). + +The copy included here is version 8.1.0 and was downloaded from https://github.com/fastfloat/fast_float/releases/download/v8.1.0/fast_float.h. + +This library was originally added for use in processing VTK based inflow files in the AWAE module. \ No newline at end of file diff --git a/modules/nwtc-library/src/GridInterp.f90 b/modules/nwtc-library/src/GridInterp.f90 index 3398ca5269..769b905fca 100644 --- a/modules/nwtc-library/src/GridInterp.f90 +++ b/modules/nwtc-library/src/GridInterp.f90 @@ -43,6 +43,11 @@ MODULE GridInterp MODULE PROCEDURE GridInterp4DVec6R8 END INTERFACE +INTERFACE GridInterp4DVecN + MODULE PROCEDURE GridInterp4DVecNR4 + MODULE PROCEDURE GridInterp4DVecNR8 +END INTERFACE + INTERFACE GridInterpN MODULE PROCEDURE GridInterpNR4 MODULE PROCEDURE GridInterpNR8 @@ -726,6 +731,61 @@ function GridInterp4DVec6R8( data, m ) end function GridInterp4DVec6R8 +!============================================================================================================= +! INTERFACE GridInterp4DVec6 +! - GridInterp4DVec6R4 +! - GridInterp4DVec6R8 +!============================================================================================================= +function GridInterp4DVecNR4( vDim, data, m ) + integer(IntKi), intent(in ) :: vDim + real(SiKi), intent(in ) :: data(0:,0:,0:,0:,:) !< 4D grid of vector data + type(GridInterp_MiscVarType), intent(in ) :: m !< MiscVars + + character(*), parameter :: RoutineName = 'GridInterp4DVecNR4' + integer(IntKi) :: i,j,k,l,vi + real(SiKi) :: GridInterp4DVecNR4(vDim) + + ! interpolate + GridInterp4DVecNR4 = 0.0_SiKi + do l = 1,4 + do k = 1,4 + do j = 1,4 + do i = 1,4 + do vi = 1,vDim + GridInterp4DVecNR4(vi) = GridInterp4DVecNR4(vi) + m%N4D(i,j,k,l) * data( m%Indx(i,1), m%Indx(j,2), m%Indx(k,3), m%Indx(l,4), vi ) + end do + end do + end do + end do + end do + +end function GridInterp4DVecNR4 + +function GridInterp4DVecNR8( vDim, data, m ) + integer(IntKi), intent(in ) :: vDim + real(DbKi), intent(in ) :: data(0:,0:,0:,0:,:) !< 4D grid of vector data + type(GridInterp_MiscVarType), intent(in ) :: m !< MiscVars + + character(*), parameter :: RoutineName = 'GridInterp4DVecNR8' + integer(IntKi) :: i,j,k,l,vi + real(DbKi) :: GridInterp4DVecNR8(vDim) + + ! interpolate + GridInterp4DVecNR8 = 0.0_DbKi + do l = 1,4 + do k = 1,4 + do j = 1,4 + do i = 1,4 + do vi = 1,vDim + GridInterp4DVecNR8(vi) = GridInterp4DVecNR8(vi) + m%N4D(i,j,k,l) * data( m%Indx(i,1), m%Indx(j,2), m%Indx(k,3), m%Indx(l,4), vi ) + end do + end do + end do + end do + end do + +end function GridInterp4DVecNR8 + !============================================================================================================= ! INTERFACE GridInterpN ! - GridInterpNR4 diff --git a/modules/nwtc-library/src/GridInterp_Types.f90 b/modules/nwtc-library/src/GridInterp_Types.f90 index f8a89950f6..798452b308 100644 --- a/modules/nwtc-library/src/GridInterp_Types.f90 +++ b/modules/nwtc-library/src/GridInterp_Types.f90 @@ -49,7 +49,8 @@ MODULE GridInterp_Types LOGICAL :: FirstWarn_Clamp = .true. !< used to avoid too many 'Position has been clamped to the grid boundary' warning messages [-] END TYPE GridInterp_MiscVarType ! ======================= -CONTAINS + +contains subroutine GridInterp_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) type(GridInterp_ParameterType), intent(in) :: SrcParamData @@ -144,5 +145,7 @@ subroutine GridInterp_UnPackMisc(RF, OutData) call RegUnpack(RF, OutData%Indx); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%FirstWarn_Clamp); if (RegCheckErr(RF, RoutineName)) return end subroutine + END MODULE GridInterp_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/nwtc-library/src/KdTree.f90 b/modules/nwtc-library/src/KdTree.f90 new file mode 100644 index 0000000000..beae0e99a9 --- /dev/null +++ b/modules/nwtc-library/src/KdTree.f90 @@ -0,0 +1,488 @@ +!> @module kdtree_module +!> @brief Provides a k-d tree implementation for efficient nearest neighbor searches. +!> +!> This module implements a static k-d tree with variable dimensionality. +!> The tree is built in-place from a given set of points, which is a highly +!> efficient method in terms of memory and speed. It is ideal for scenarios +!> where the set of points does not change after the initial construction. +module KdTree + +use NWTC_Base +use NWTC_Library_Types + +implicit none +private + +public :: kdtree_build +public :: kdtree_destroy +public :: kdtree_nearest_neighbor +public :: kdtree_points_in_radius +public :: kdtree_update +public :: kdtree_sort_indices + +contains + +!> @brief Builds a k-d tree from a set of points. +!> @param[out] tree The k-d tree object to be constructed. +!> @param[in] points_in A (NDims, N) array of N points with NDims dimensions. +!> @param[in] n_active Optional: Number of active points to use (default: all points). +!> @param[in] n_max Optional: Maximum capacity for future updates (default: n_active). +subroutine kdtree_build(tree, points_in, n_max) + type(KdTreeType), intent(OUT) :: tree + real(ReKi), dimension(:, :), intent(IN) :: points_in + integer(IntKi), intent(IN), optional :: n_max + integer(IntKi) :: i, n_pts, n_capacity, n_dims + + ! Get dimensionality from input array + n_dims = size(points_in, 1) + n_pts = size(points_in, 2) + + ! Determine number of points in tree + tree%NNodes = n_pts + + ! Determine maximum capacity + if (present(n_max)) then + n_capacity = max(n_max, tree%NNodes) + else + n_capacity = tree%NNodes + end if + + allocate (tree%Nodes(n_dims, 0:n_capacity)) + tree%Nodes = 0.0_ReKi + allocate (tree%OriginalIndices(n_capacity)) + tree%OriginalIndices(tree%NNodes:) = 0 + allocate (tree%Dimensions(n_capacity)) + tree%Dimensions(tree%NNodes:) = 0 + + tree%Nodes(:, 1:tree%NNodes) = points_in(:, 1:tree%NNodes) + tree%OriginalIndices(1:tree%NNodes) = [(i, i=1, tree%NNodes)] + + ! Start the recursive build process on the active nodes. + call build_recursive(tree, 1, tree%NNodes, 0) +end subroutine kdtree_build + +!> @brief Deallocates the memory used by a k-d tree object. +subroutine kdtree_destroy(tree) + type(KdTreeType), intent(INOUT) :: tree + if (ALLOCATED(tree%Nodes)) deallocate (tree%Nodes) + if (ALLOCATED(tree%OriginalIndices)) deallocate (tree%OriginalIndices) + if (ALLOCATED(tree%Dimensions)) deallocate (tree%Dimensions) + tree%NNodes = 0 +end subroutine kdtree_destroy + +!> @brief Finds the index of the nearest neighbor to a query point. +!> @param[in] tree The constructed k-d tree. +!> @param[in] query_point The point to search for (must match tree dimensionality). +!> @return The original index of the nearest neighbor point. +function kdtree_nearest_neighbor(tree, query_point) result(nn_idx) + type(KdTreeType), intent(IN) :: tree + real(ReKi), dimension(:), intent(IN) :: query_point + integer(IntKi) :: nn_idx + real(ReKi) :: best_dist_sq + + if (tree%NNodes <= 0) then + nn_idx = 0 ! Or some other indicator of error/empty tree + return + end if + + best_dist_sq = HUGE(1.0_ReKi) + nn_idx = -1 + + ! Start the recursive search. The root of the full tree is at the median index. + call search_recursive(tree, 1, tree%NNodes, query_point, best_dist_sq, nn_idx) +end function kdtree_nearest_neighbor + +!> @brief Finds all points within a given radius of a query point. +!> @param[in] tree The constructed k-d tree. +!> @param[in] query_point The point to search around (must match tree dimensionality). +!> @param[in] radius The search radius. +!> @param[out] indices Array of original indices of points within radius. +!> @param[out] n_found The number of points found within radius. +subroutine kdtree_points_in_radius(tree, query_point, radius, indices, n_found) + type(KdTreeType), intent(IN) :: tree + real(ReKi), dimension(:), intent(IN) :: query_point + real(ReKi), intent(IN) :: radius + integer, dimension(:), intent(OUT) :: indices + integer, intent(OUT) :: n_found + real(ReKi) :: radius_sq + + ! Indices must be capable of storing indices for all nodes + if (size(indices) < tree%NNodes) then + n_found = -1 + return + end if + + ! If the tree is empty, return no nodes found + if (tree%NNodes <= 0) then + n_found = 0 + return + end if + + n_found = 0 + radius_sq = radius**2 + + ! Start the recursive search + call radius_search_recursive(tree, 1, tree%NNodes, query_point, radius_sq, indices, n_found) +end subroutine kdtree_points_in_radius + +!> @brief Sorts an array of indices in ascending order. +!> @param[inout] indices Array of indices to be sorted. +!> @details Uses insertion sort for small arrays (< 20 elements) and quicksort for larger arrays. +subroutine kdtree_sort_indices(indices) + integer, dimension(:), intent(INOUT) :: indices + integer :: n + + n = size(indices) + + if (n <= 1) return + + ! Use insertion sort for small arrays, quicksort for larger ones + if (n < 20) then + call insertion_sort(indices, 1, n) + else + call quicksort_indices(indices, 1, n) + end if +end subroutine kdtree_sort_indices + +!> @brief Updates the tree with new point locations without reallocating memory. +!> @param[inout] tree The k-d tree object to be updated. +!> @param[in] points_in A (NDims, N) array of N points with updated locations. +!> @param[in] n_active Optional: Number of active points to use (default: all points in array). +!> @details This function updates the node coordinates and rebuilds the tree structure +!> in-place without deallocating and reallocating memory. If n_active is less +!> than or equal to the allocated capacity, no reallocation occurs. +!> The dimensionality must match the original tree. +subroutine kdtree_update(tree, points_in) + type(KdTreeType), intent(INOUT) :: tree + real(ReKi), dimension(:, :), intent(IN) :: points_in + integer(IntKi) :: i, n_pts, n_capacity, n_dims + + n_dims = size(points_in, 1) + n_pts = size(points_in, 2) + + ! Verify that the tree has been initialized + if (.not. allocated(tree%Nodes)) then + ! Tree is not initialized, call build instead + call kdtree_build(tree, points_in) + return + end if + + ! Check allocated capacity and dimensions + n_capacity = size(tree%Nodes, 2) - 1 + + ! Check that dimensionality matches + if (n_dims /= size(tree%Nodes, 1)) then + ! Dimensionality changed, need to rebuild with reallocation + call kdtree_destroy(tree) + call kdtree_build(tree, points_in, n_max=n_capacity) + return + end if + + if (n_pts > n_capacity) then + ! Number of points exceeds capacity, need to rebuild with reallocation + call kdtree_destroy(tree) + call kdtree_build(tree, points_in, n_max=n_pts) + return + end if + + ! Update number of active nodes + tree%NNodes = n_pts + + ! Update node coordinates for active nodes + tree%Nodes(:, 1:n_pts) = points_in(:, 1:n_pts) + + ! Reset original indices to sequential order for active nodes + tree%OriginalIndices(1:n_pts) = [(i, i=1, n_pts)] + + ! Reset dimensions for active nodes + tree%Dimensions(1:n_pts) = 0 + + ! Rebuild the tree structure in-place using only active nodes + call build_recursive(tree, 1, n_pts, 0) +end subroutine kdtree_update + +!> @brief Recursively builds the tree by partitioning array segments. +recursive subroutine build_recursive(tree, start_idx, end_idx, depth) + type(KdTreeType), intent(INOUT) :: tree + integer, intent(IN) :: start_idx, end_idx, depth + integer(IntKi) :: dim, mid_idx, n_dims + + if (start_idx > end_idx) return + + n_dims = size(tree%Nodes, 1) + dim = MOD(depth, n_dims) + 1 ! Cycle through all dimensions + mid_idx = start_idx + (end_idx - start_idx)/2 + + ! Find the median of the current slice and partition around it. + call find_median_and_partition(tree, start_idx, end_idx, mid_idx, dim) + + tree%Dimensions(mid_idx) = dim + + ! Recursively build the left and right subtrees. + call build_recursive(tree, start_idx, mid_idx - 1, depth + 1) + call build_recursive(tree, mid_idx + 1, end_idx, depth + 1) +end subroutine build_recursive + +!> @brief Uses quickselect to find the k-th element (median) and partition the array. +subroutine find_median_and_partition(tree, left_in, right_in, k, dim) + type(KdTreeType), intent(INOUT) :: tree + integer, intent(IN) :: left_in, right_in, k, dim + integer(IntKi) :: left, right + integer(IntKi) :: p_idx + + left = left_in + right = right_in + + do + if (left == right) exit + p_idx = partition(tree, left, right, dim) + if (k == p_idx) then + exit + else if (k < p_idx) then + right = p_idx - 1 + else + left = p_idx + 1 + end if + end do +end subroutine find_median_and_partition + +!> @brief Partitions a sub-array around a pivot (last element). Lomuto partition scheme. +function partition(tree, left, right, dim) result(p_idx) + type(KdTreeType), intent(INOUT) :: tree + integer, intent(IN) :: left, right, dim + integer(IntKi) :: p_idx + real(ReKi) :: pivot_value + integer(IntKi) :: i, store_idx + + ! For simplicity, we use the rightmost element as the pivot. + ! A more robust implementation might use median-of-three to choose the pivot. + pivot_value = tree%Nodes(dim, right) + store_idx = left + + do i = left, right - 1 + if (tree%Nodes(dim, i) < pivot_value) then + call swap_nodes(tree, i, store_idx) + store_idx = store_idx + 1 + end if + end do + + call swap_nodes(tree, store_idx, right) + p_idx = store_idx +end function partition + +!> @brief Swaps two nodes (and their original indices) in the tree arrays. +subroutine swap_nodes(tree, i, j) + type(KdTreeType), intent(INOUT) :: tree + integer, intent(IN) :: i, j + integer(IntKi) :: temp_idx + + tree%Nodes(:, 0) = tree%Nodes(:, i) + tree%Nodes(:, i) = tree%Nodes(:, j) + tree%Nodes(:, j) = tree%Nodes(:, 0) + + temp_idx = tree%OriginalIndices(i) + tree%OriginalIndices(i) = tree%OriginalIndices(j) + tree%OriginalIndices(j) = temp_idx +end subroutine swap_nodes + +!> @brief Recursively searches for the nearest neighbor. +recursive subroutine search_recursive(tree, start_idx, end_idx, query_point, best_dist_sq, best_idx) + type(KdTreeType), intent(IN) :: tree + integer, intent(IN) :: start_idx, end_idx + real(ReKi), dimension(:), intent(IN) :: query_point + real(ReKi), intent(INOUT) :: best_dist_sq + integer, intent(INOUT) :: best_idx + integer(IntKi) :: mid_idx, dim, i + real(ReKi) :: d_sq, dx + integer(IntKi) :: good_side_start, good_side_end + integer(IntKi) :: bad_side_start, bad_side_end + + if (start_idx > end_idx) return + + ! The root of the current subtree is at its median index. + mid_idx = start_idx + (end_idx - start_idx)/2 + + ! 1. Check current node against the best so far. + d_sq = 0.0_ReKi + do i = 1, size(tree%Nodes, 1) + d_sq = d_sq + (tree%Nodes(i, mid_idx) - query_point(i))**2 + end do + + if (d_sq < best_dist_sq) then + best_dist_sq = d_sq + best_idx = tree%OriginalIndices(mid_idx) + end if + + dim = tree%Dimensions(mid_idx) + + ! 2. Decide which subtree to search first. + if (query_point(dim) < tree%Nodes(dim, mid_idx)) then + good_side_start = start_idx + good_side_end = mid_idx - 1 + bad_side_start = mid_idx + 1 + bad_side_end = end_idx + else + good_side_start = mid_idx + 1 + good_side_end = end_idx + bad_side_start = start_idx + bad_side_end = mid_idx - 1 + end if + + ! 3. Recurse down the "good" side. + call search_recursive(tree, good_side_start, good_side_end, query_point, best_dist_sq, best_idx) + + ! 4. Check if the "bad" side needs to be searched. + ! This is the core of the k-d search optimization. + dx = query_point(dim) - tree%Nodes(dim, mid_idx) + if (dx**2 < best_dist_sq) then + call search_recursive(tree, bad_side_start, bad_side_end, query_point, best_dist_sq, best_idx) + end if +end subroutine search_recursive + +!> @brief Recursively searches for all points within a given radius. +recursive subroutine radius_search_recursive(tree, start_idx, end_idx, query_point, radius_sq, indices, n_found) + type(KdTreeType), intent(IN) :: tree + integer, intent(IN) :: start_idx, end_idx + real(ReKi), dimension(:), intent(IN) :: query_point + real(ReKi), intent(IN) :: radius_sq + integer, dimension(:), intent(INOUT) :: indices + integer, intent(INOUT) :: n_found + integer(IntKi) :: mid_idx, dim, i + real(ReKi) :: d_sq, dx + integer(IntKi) :: good_side_start, good_side_end + integer(IntKi) :: bad_side_start, bad_side_end + + if (start_idx > end_idx) return + + ! The root of the current subtree is at its median index. + mid_idx = start_idx + (end_idx - start_idx)/2 + + ! 1. Check if current node is within radius. + d_sq = 0.0_ReKi + do i = 1, size(tree%Nodes, 1) + d_sq = d_sq + (tree%Nodes(i, mid_idx) - query_point(i))**2 + end do + + if (d_sq <= radius_sq) then + n_found = n_found + 1 + indices(n_found) = tree%OriginalIndices(mid_idx) + end if + + dim = tree%Dimensions(mid_idx) + + ! 2. Decide which subtree to search first. + if (query_point(dim) < tree%Nodes(dim, mid_idx)) then + good_side_start = start_idx + good_side_end = mid_idx - 1 + bad_side_start = mid_idx + 1 + bad_side_end = end_idx + else + good_side_start = mid_idx + 1 + good_side_end = end_idx + bad_side_start = start_idx + bad_side_end = mid_idx - 1 + end if + + ! 3. Recurse down the "good" side. + call radius_search_recursive(tree, good_side_start, good_side_end, query_point, radius_sq, indices, n_found) + + ! 4. Check if the "bad" side needs to be searched. + dx = query_point(dim) - tree%Nodes(dim, mid_idx) + if (dx**2 <= radius_sq) then + call radius_search_recursive(tree, bad_side_start, bad_side_end, query_point, radius_sq, indices, n_found) + end if +end subroutine radius_search_recursive + +!> @brief Sorts indices using insertion sort algorithm. +!> @details Efficient for small arrays (typically < 20 elements). +subroutine insertion_sort(indices, left, right) + integer, dimension(:), intent(INOUT) :: indices + integer, intent(IN) :: left, right + integer :: i, j, key + + do i = left + 1, right + key = indices(i) + j = i - 1 + do while (j >= left) + if (indices(j) <= key) exit + indices(j + 1) = indices(j) + j = j - 1 + end do + indices(j + 1) = key + end do +end subroutine insertion_sort + +!> @brief Sorts indices using quicksort algorithm. +!> @details Recursive quicksort with insertion sort for small partitions. +recursive subroutine quicksort_indices(indices, left, right) + integer, dimension(:), intent(INOUT) :: indices + integer, intent(IN) :: left, right + integer :: pivot_idx + + if (right - left < 20) then + ! Use insertion sort for small partitions + call insertion_sort(indices, left, right) + return + end if + + if (left < right) then + pivot_idx = partition_indices(indices, left, right) + call quicksort_indices(indices, left, pivot_idx - 1) + call quicksort_indices(indices, pivot_idx + 1, right) + end if +end subroutine quicksort_indices + +!> @brief Partitions array for quicksort using median-of-three pivot selection. +function partition_indices(indices, left, right) result(p_idx) + integer, dimension(:), intent(INOUT) :: indices + integer, intent(IN) :: left, right + integer :: p_idx + integer :: pivot_value, i, store_idx, mid, temp + + ! Median-of-three pivot selection for better performance + mid = left + (right - left) / 2 + + ! Sort left, mid, right + if (indices(mid) < indices(left)) then + temp = indices(left) + indices(left) = indices(mid) + indices(mid) = temp + end if + if (indices(right) < indices(left)) then + temp = indices(left) + indices(left) = indices(right) + indices(right) = temp + end if + if (indices(right) < indices(mid)) then + temp = indices(mid) + indices(mid) = indices(right) + indices(right) = temp + end if + + ! Use middle element as pivot + pivot_value = indices(mid) + + ! Move pivot to end + temp = indices(mid) + indices(mid) = indices(right - 1) + indices(right - 1) = temp + + store_idx = left + do i = left, right - 2 + if (indices(i) < pivot_value) then + temp = indices(i) + indices(i) = indices(store_idx) + indices(store_idx) = temp + store_idx = store_idx + 1 + end if + end do + + ! Move pivot to its final position + temp = indices(store_idx) + indices(store_idx) = indices(right - 1) + indices(right - 1) = temp + + p_idx = store_idx +end function partition_indices + +end module diff --git a/modules/nwtc-library/src/ModMesh.f90 b/modules/nwtc-library/src/ModMesh.f90 index f925485228..5a9c834c0d 100644 --- a/modules/nwtc-library/src/ModMesh.f90 +++ b/modules/nwtc-library/src/ModMesh.f90 @@ -1170,10 +1170,12 @@ SUBROUTINE MeshCreate ( BlankMesh RETURN END IF - + ! Initialize element table DO i = 1, NELEMKINDS - BlankMesh%ElemTable(i)%nelem = 0 ; BlankMesh%ElemTable(i)%maxelem = 0 - NULLIFY(BlankMesh%ElemTable(i)%Elements ) + BlankMesh%ElemTable(i)%nelem = 0 + BlankMesh%ElemTable(i)%maxelem = 0 + BlankMesh%ElemTable(i)%Xelement = 0 + NULLIFY(BlankMesh%ElemTable(i)%Elements) ENDDO ALLOCATE(BlankMesh%RemapFlag, Stat=ErrStat2 ) ! assign some space for this pointer to point to @@ -2743,7 +2745,7 @@ END SUBROUTINE PackLoadMesh_Names SUBROUTINE PackLoadMesh(M, Ary, indx_first) TYPE(MeshType) , INTENT(IN ) :: M !< Load mesh - REAL(ReKi) , INTENT(INOUT) :: Ary(:) !< array to pack this mesh into + REAL(R8Ki) , INTENT(INOUT) :: Ary(:) !< array to pack this mesh into INTEGER(IntKi) , INTENT(INOUT) :: indx_first !< index into Ary; gives location of next array position to fill ! local variables: @@ -2887,7 +2889,7 @@ END SUBROUTINE PackMotionMesh_Names SUBROUTINE PackMotionMesh(M, Ary, indx_first, FieldMask, TrimOP) TYPE(MeshType) , INTENT(IN ) :: M !< Motion mesh - REAL(ReKi) , INTENT(INOUT) :: Ary(:) !< array to pack this mesh into + REAL(R8Ki) , INTENT(INOUT) :: Ary(:) !< array to pack this mesh into INTEGER(IntKi) , INTENT(INOUT) :: indx_first !< index into Ary; gives location of next array position to fill LOGICAL, OPTIONAL , INTENT(IN ) :: FieldMask(FIELDMASK_SIZE) !< flags to determine if this field is part of the packing LOGICAL, OPTIONAL , INTENT(IN ) :: TrimOP !< flag to determine if the orientation should be packed as a DCM or a log map @@ -3203,18 +3205,10 @@ SUBROUTINE MeshExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) DO node=1,u_out%Nnodes Orient = u1%Orientation(:,:,node) - CALL DCM_logmap ( Orient, tensor(:,1), ErrStat, ErrMsg ) - IF (ErrStat >= AbortErrLev ) THEN - ErrMsg = 'MeshExtrapInterp1:'//TRIM(ErrMsg) - RETURN - END IF + CALL DCM_logmap(Orient, tensor(:,1)) Orient = u2%Orientation(:,:,node) - CALL DCM_logmap ( Orient, tensor(:,2), ErrStat, ErrMsg ) - IF (ErrStat >= AbortErrLev ) THEN - ErrMsg = 'MeshExtrapInterp1:'//TRIM(ErrMsg) - RETURN - END IF + CALL DCM_logmap(Orient, tensor(:,2)) CALL DCM_SetLogMapForInterp( tensor ) @@ -3345,25 +3339,13 @@ SUBROUTINE MeshExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) DO node=1,u_out%Nnodes Orient = u1%Orientation(:,:,node) - CALL DCM_logmap ( Orient, tensor(:,1), ErrStat, ErrMsg ) - IF (ErrStat >= AbortErrLev ) THEN - ErrMsg = 'MeshExtrapInterp2:'//TRIM(ErrMsg) - RETURN - END IF + CALL DCM_logmap(Orient, tensor(:,1)) Orient = u2%Orientation(:,:,node) - CALL DCM_logmap ( Orient, tensor(:,2), ErrStat, ErrMsg ) - IF (ErrStat >= AbortErrLev ) THEN - ErrMsg = 'MeshExtrapInterp2:'//TRIM(ErrMsg) - RETURN - END IF + CALL DCM_logmap(Orient, tensor(:,2)) Orient = u3%Orientation(:,:,node) - CALL DCM_logmap ( Orient, tensor(:,3), ErrStat, ErrMsg ) - IF (ErrStat >= AbortErrLev ) THEN - ErrMsg = 'MeshExtrapInterp2:'//TRIM(ErrMsg) - RETURN - END IF + CALL DCM_logmap(Orient, tensor(:,3)) CALL DCM_SetLogMapForInterp( tensor ) diff --git a/modules/nwtc-library/src/ModMesh_Mapping.f90 b/modules/nwtc-library/src/ModMesh_Mapping.f90 index fd63f374f3..79f3fed31d 100644 --- a/modules/nwtc-library/src/ModMesh_Mapping.f90 +++ b/modules/nwtc-library/src/ModMesh_Mapping.f90 @@ -1333,15 +1333,13 @@ SUBROUTINE Transfer_Motions_Line2_to_Point( Src, Dest, MeshMap, ErrStat, ErrMsg RotationMatrixD = MATMUL( TRANSPOSE( Src%RefOrientation(:,:,n1) ), Src%Orientation(:,:,n1) ) RotationMatrixD = MATMUL( Dest%RefOrientation(:,:,i), RotationMatrixD ) - CALL DCM_logmap( RotationMatrixD, FieldValue(:,1), ErrStat, ErrMsg ) - IF (ErrStat >= AbortErrLev) RETURN + CALL DCM_logmap(RotationMatrixD, FieldValue(:,1)) ! calculate Rotation matrix for FieldValueN2 and convert to tensor: RotationMatrixD = MATMUL( TRANSPOSE( Src%RefOrientation(:,:,n2) ), Src%Orientation(:,:,n2) ) RotationMatrixD = MATMUL( Dest%RefOrientation(:,:,i), RotationMatrixD ) - CALL DCM_logmap( RotationMatrixD, FieldValue(:,2), ErrStat, ErrMsg ) - IF (ErrStat >= AbortErrLev) RETURN + CALL DCM_logmap(RotationMatrixD, FieldValue(:,2)) CALL DCM_SetLogMapForInterp( FieldValue ) ! make sure we don't cross a 2pi boundary @@ -4415,12 +4413,10 @@ SUBROUTINE Create_Augmented_Ln2_Src_Mesh(Src, Dest, MeshMap, Dest_TYPE, ErrStat, ! convert DCMs to tensors: RefOrientationD = Src%RefOrientation(:, :, n1) - CALL DCM_logmap( RefOrientationD, FieldValue(:,1), ErrStat, ErrMsg ) - IF (ErrStat >= AbortErrLev) RETURN + CALL DCM_logmap(RefOrientationD, FieldValue(:,1)) RefOrientationD = Src%RefOrientation(:, :, n2) - CALL DCM_logmap( RefOrientationD, FieldValue(:,2), ErrStat, ErrMsg ) - IF (ErrStat >= AbortErrLev) RETURN + CALL DCM_logmap(RefOrientationD, FieldValue(:,2)) CALL DCM_SetLogMapForInterp( FieldValue ) ! make sure we don't cross a 2pi boundary diff --git a/modules/nwtc-library/src/ModVar.f90 b/modules/nwtc-library/src/ModVar.f90 new file mode 100644 index 0000000000..b8cadfecdf --- /dev/null +++ b/modules/nwtc-library/src/ModVar.f90 @@ -0,0 +1,1465 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2025 National Renewable Energy Laboratory +! +! This file is part of the NWTC Subroutine Library. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +!********************************************************************************************************************************** +!> The modules ModVar and ModVar_Types provide data structures and subroutines for representing and manipulating meshes +!! and meshed data in the FAST modular framework. +!! +!! Module variables provide a structured way for documenting, locating, and orchestrating the interdependencies between modules. +!! + +module ModVar +use NWTC_Library_Types +use NWTC_IO +use NWTC_Num +use ModMesh + +implicit none + +private +public :: MV_InitVarsJac +public :: MV_AddVar, MV_AddMeshVar +public :: MV_Perturb, MV_ComputeCentralDiff, MV_ComputeDiff, MV_ExtrapInterp, MV_AddDelta +public :: MV_HasFlagsAll, MV_HasFlagsAny, MV_SetFlags, MV_ClearFlags +public :: MV_NumVars, MV_NumVals, MV_FindVarDatLoc +public :: LoadFields, MotionFields, TransFields, AngularFields +public :: quat_to_dcm, dcm_to_quat, quat_inv, quat_to_rvec, wm_to_quat, quat_to_wm, wm_inv, quat_compose +public :: rvec_to_quat, rvec_to_tan_inv, rvec_to_tan +public :: MV_FieldString, MV_IsLoad, MV_IsMotion, IdxStr +public :: DumpMatrix, MV_AddModule +public :: MV_EqualDL +public :: MV_PackMesh, MV_UnpackMesh + +integer(IntKi), parameter :: LoadFields(*) = [FieldForce, FieldMoment] +integer(IntKi), parameter :: TransFields(*) = [FieldTransDisp, FieldTransVel, FieldTransAcc] +integer(IntKi), parameter :: AngularFields(*) = [FieldOrientation, FieldAngularVel, FieldAngularAcc, FieldAngularDisp] +integer(IntKi), parameter :: MotionFields(*) = [FieldTransDisp, FieldOrientation, FieldTransVel, & + FieldAngularVel, FieldTransAcc, FieldAngularAcc] + +real(R8Ki), parameter :: I33(3,3) = reshape([1.0_R8Ki, 0.0_R8Ki, 0.0_R8Ki, & + 0.0_R8Ki, 1.0_R8Ki, 0.0_R8Ki, & + 0.0_R8Ki, 0.0_R8Ki, 1.0_R8Ki], & + [3,3]) + +logical, parameter :: UseSmallRotAngles = .false. + +contains + +subroutine MV_PackMesh(Var, Mesh, DstAry) + type(ModVarType), intent(in) :: Var + type(MeshType), intent(in) :: Mesh + real(R8Ki), intent(inout) :: DstAry(:) + integer(IntKi) :: i, j, k + select case (Var%Field) + case (FieldForce) + DstAry(Var%iLoc(1):Var%iLoc(2)) = pack(real(Mesh%Force, R8Ki), .true.) + case (FieldMoment) + DstAry(Var%iLoc(1):Var%iLoc(2)) = pack(real(Mesh%Moment, R8Ki), .true.) + case (FieldTransDisp) + DstAry(Var%iLoc(1):Var%iLoc(2)) = pack(real(Mesh%TranslationDisp, R8Ki), .true.) + case (FieldOrientation) + k = Var%iLoc(1) + do j = 1, Var%Nodes + DstAry(k:k + 2) = dcm_to_quat(Mesh%Orientation(:, :, j)) + k = k + 3 + end do + case (FieldTransVel) + DstAry(Var%iLoc(1):Var%iLoc(2)) = pack(real(Mesh%TranslationVel, R8Ki), .true.) + case (FieldAngularVel) + DstAry(Var%iLoc(1):Var%iLoc(2)) = pack(real(Mesh%RotationVel, R8Ki), .true.) + case (FieldTransAcc) + DstAry(Var%iLoc(1):Var%iLoc(2)) = pack(real(Mesh%TranslationAcc, R8Ki), .true.) + case (FieldAngularAcc) + DstAry(Var%iLoc(1):Var%iLoc(2)) = pack(real(Mesh%RotationAcc, R8Ki), .true.) + case (FieldScalar) + DstAry(Var%iLoc(1):Var%iLoc(2)) = pack(real(Mesh%Scalars, R8Ki), .true.) + end select +end subroutine + +subroutine MV_UnpackMesh(Var, SrcAry, Mesh) + type(ModVarType), intent(in) :: Var + real(R8Ki), intent(in) :: SrcAry(:) + type(MeshType), intent(inout) :: Mesh + integer(IntKi) :: i, j, k + select case (Var%Field) + case (FieldForce) + Mesh%Force = reshape(SrcAry(Var%iLoc(1):Var%iLoc(2)), shape(Mesh%Force)) + case (FieldMoment) + Mesh%Moment = reshape(SrcAry(Var%iLoc(1):Var%iLoc(2)), shape(Mesh%Moment)) + case (FieldTransDisp) + Mesh%TranslationDisp = reshape(SrcAry(Var%iLoc(1):Var%iLoc(2)), shape(Mesh%TranslationDisp)) + case (FieldOrientation) + k = Var%iLoc(1) + do j = 1, Var%Nodes + Mesh%Orientation(:, :, j) = quat_to_dcm(SrcAry(k:k + 2)) + k = k + 3 + end do + case (FieldTransVel) + Mesh%TranslationVel = reshape(SrcAry(Var%iLoc(1):Var%iLoc(2)), shape(Mesh%TranslationVel)) + case (FieldAngularVel) + Mesh%RotationVel = reshape(SrcAry(Var%iLoc(1):Var%iLoc(2)), shape(Mesh%RotationVel)) + case (FieldTransAcc) + Mesh%TranslationAcc = reshape(SrcAry(Var%iLoc(1):Var%iLoc(2)), shape(Mesh%TranslationAcc)) + case (FieldAngularAcc) + Mesh%RotationAcc = reshape(SrcAry(Var%iLoc(1):Var%iLoc(2)), shape(Mesh%RotationAcc)) + case (FieldScalar) + Mesh%Scalars = reshape(SrcAry(Var%iLoc(1):Var%iLoc(2)), shape(Mesh%Scalars)) + end select +end subroutine + +!------------------------------------------------------------------------------- +! Field Names +!------------------------------------------------------------------------------- + +function MV_FieldString(Field) result(str) + integer(IntKi), intent(in) :: Field + character(16) :: str + select case (Field) + case (FieldAngularAcc) + str = "AngularAcc" + case (FieldAngularDisp) + str = "AngularDisp" + case (FieldAngularVel) + str = "AngularVel" + case (FieldForce) + str = "Force" + case (FieldMoment) + str = "Moment" + case (FieldOrientation) + str = "Orientation" + case (FieldTransAcc) + str = "TransAcc" + case (FieldTransDisp) + str = "TransDisp" + case (FieldTransVel) + str = "TransVel" + case (FieldScalar) + str = "Scalar" + case default + str = "Unknown" + end select +end function + +subroutine MV_InitVarsJac(Vars, Jac, Linearize, ErrStat, ErrMsg) + type(ModVarsType), intent(inout) :: Vars + type(ModJacType), intent(inout) :: Jac + logical, intent(in) :: Linearize + integer(IntKi), intent(out) :: ErrStat + character(ErrMsgLen), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'MV_InitVarsJac' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, StartIndex + + ! Initialize error outputs + ErrStat = ErrID_None + ErrMsg = '' + + ! Initialize number of variables in each group + Vars%Nx = 0 + Vars%Nu = 0 + Vars%Ny = 0 + + ! Initialize continuous state variables + if (.not. allocated(Vars%x)) allocate (Vars%x(0)) + StartIndex = 1 + do i = 1, size(Vars%x) + call ModVarType_Init(Vars%x(i), StartIndex, Linearize, ErrStat2, ErrMsg2) + if (Failed()) return + end do + Vars%Nx = sum(Vars%x%Num) + Jac%Nx = Vars%Nx + + ! Initialize input variables + if (.not. allocated(Vars%u)) allocate (Vars%u(0)) + StartIndex = 1 + do i = 1, size(Vars%u) + call ModVarType_Init(Vars%u(i), StartIndex, Linearize, ErrStat2, ErrMsg2) + if (Failed()) return + end do + Vars%Nu = sum(Vars%u%Num) + Jac%Nu = Vars%Nu + + ! Initialize output variables + if (.not. allocated(Vars%y)) allocate (Vars%y(0)) + StartIndex = 1 + do i = 1, size(Vars%y) + call ModVarType_Init(Vars%y(i), StartIndex, Linearize, ErrStat2, ErrMsg2) + if (Failed()) return + end do + Vars%Ny = sum(Vars%y%Num) + Jac%Ny = Vars%Ny + + ! Allocate Jacobian data arrays + ! if (Linearize) then + if (Jac%Nx > 0) then + call AllocAry(Jac%x, Jac%Nx, "Lin%x", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Jac%x_perturb, Jac%Nx, "Lin%x_perturb", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Jac%x_pos, Jac%Nx, "Lin%x_pos", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Jac%x_neg, Jac%Nx, "Lin%x_neg", ErrStat2, ErrMsg2); if (Failed()) return + end if + if (Jac%Nu > 0) then + call AllocAry(Jac%u, Jac%Nu, "Lin%u", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Jac%u_perturb, Jac%Nu, "Lin%u_perturb", ErrStat2, ErrMsg2); if (Failed()) return + end if + if (Jac%Ny > 0) then + call AllocAry(Jac%y, Jac%Ny, "Lin%y", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Jac%y_pos, Jac%Ny, "Lin%y_pos", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Jac%y_neg, Jac%Ny, "Lin%y_neg", ErrStat2, ErrMsg2); if (Failed()) return + end if + ! end if + +contains + + function Failed() + logical Failed + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function + + function FailedAlloc() + logical FailedAlloc + FailedAlloc = ErrStat2 /= 0 + if (FailedAlloc) call SetErrStat(ErrID_Fatal, 'error allocating Vals', ErrStat, ErrMsg, RoutineName) + end function + +end subroutine + +elemental function IsMesh(Var) result(r) + type(ModVarType), intent(in) :: Var + logical :: r + r = iand(Var%Flags, VF_Mesh) > 0 +end function + +subroutine ModVarType_Init(Var, Index, Linearize, ErrStat, ErrMsg) + type(ModVarType), intent(inout) :: Var + integer(IntKi), intent(inout) :: Index + logical, intent(in) :: Linearize + integer(IntKi), intent(out) :: ErrStat + character(ErrMsgLen), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'ModVarsType_Init' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j + character(1), parameter :: Comp(3) = ['X', 'Y', 'Z'] + character(*), parameter :: Fmt = '(A," ",A,", node",I0,", ",A)' + character(2) :: UnitDesc + + ! Initialize error outputs + ErrStat = ErrID_None + ErrMsg = '' + + !---------------------------------------------------------------------------- + ! Mesh + !---------------------------------------------------------------------------- + + ! If this variable belongs to a mesh + if (MV_HasFlagsAll(Var, VF_Mesh)) then + + ! Size is the number of nodes in a mesh + Var%Nodes = Var%Num + + ! Number of values + Var%Num = Var%Nodes*3 + + ! If linearization enabled + if (.true.) then + + ! Set unit description for line mesh + UnitDesc = '' + if (MV_HasFlagsAll(Var, VF_Line)) UnitDesc = "/m" + + ! Allocate linearization names array + allocate(Var%LinNames(3*Var%Nodes), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, "error allocating LinNames for "//Var%Name, ErrStat, ErrMsg, RoutineName) + return + end if + + ! Switch based on field number + select case (Var%Field) + case (FieldForce) + do i = 1, Var%Nodes + do j = 1, 3 + Var%LinNames(3*(i - 1) + j) = trim(Var%Name)//" "//Comp(j)//" force, node "//trim(num2lstr(i))//', N'//UnitDesc + end do + end do + case (FieldMoment) + do i = 1, Var%Nodes + do j = 1, 3 + Var%LinNames(3*(i - 1) + j) = trim(Var%Name)//" "//Comp(j)//" moment, node "//trim(num2lstr(i))//', Nm'//UnitDesc + end do + end do + case (FieldTransDisp) + do i = 1, Var%Nodes + do j = 1, 3 + Var%LinNames(3*(i - 1) + j) = trim(Var%Name)//" "//Comp(j)//" translation displacement, node "//trim(num2lstr(i))//', m' + end do + end do + case (FieldOrientation) + do i = 1, Var%Nodes + do j = 1, 3 + Var%LinNames(3*(i - 1) + j) = trim(Var%Name)//" "//Comp(j)//" orientation angle, node "//trim(num2lstr(i))//', rad' + end do + end do + case (FieldTransVel) + do i = 1, Var%Nodes + do j = 1, 3 + Var%LinNames(3*(i - 1) + j) = trim(Var%Name)//" "//Comp(j)//" translation velocity, node "//trim(num2lstr(i))//', m/s' + end do + end do + case (FieldAngularVel) + do i = 1, Var%Nodes + do j = 1, 3 + Var%LinNames(3*(i - 1) + j) = trim(Var%Name)//" "//Comp(j)//" rotation velocity, node "//trim(num2lstr(i))//', rad/s' + end do + end do + case (FieldTransAcc) + do i = 1, Var%Nodes + do j = 1, 3 + Var%LinNames(3*(i - 1) + j) = trim(Var%Name)//" "//Comp(j)//" translation acceleration, node "//trim(num2lstr(i))//', m/s^2' + end do + end do + case (FieldAngularAcc) + do i = 1, Var%Nodes + do j = 1, 3 + Var%LinNames(3*(i - 1) + j) = trim(Var%Name)//" "//Comp(j)//" rotation acceleration, node "//trim(num2lstr(i))//', rad/s^2' + end do + end do + case default + call SetErrStat(ErrID_Fatal, "Invalid mesh field type", ErrStat, ErrMsg, RoutineName) + return + end select + + end if + end if + + !---------------------------------------------------------------------------- + ! Linearization + !---------------------------------------------------------------------------- + + if (.true.) then + if (.not. allocated(Var%LinNames)) then + call SetErrStat(ErrID_Fatal, "LinNames not allocated for "//Var%Name, ErrStat, ErrMsg, RoutineName) + return + else if (size(Var%LinNames) < Var%Num) then + call SetErrStat(ErrID_Fatal, "insufficient LinNames given for "//Var%Name, ErrStat, ErrMsg, RoutineName) + return + else if (size(Var%LinNames) > Var%Num) then + call SetErrStat(ErrID_Fatal, "excessive LinNames given for "//Var%Name, ErrStat, ErrMsg, RoutineName) + return + end if + else + ! Deallocate linearization names if linearization is not enabled + if (allocated(Var%LinNames)) deallocate (Var%LinNames) + end if + + !---------------------------------------------------------------------------- + ! Indices + !---------------------------------------------------------------------------- + + ! Set start and end indices for local matrices + Var%iLoc = [index, index + Var%Num - 1] + + ! Update index based on variable size + index = index + Var%Num + +contains + function Failed() + logical :: Failed + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine MV_AddModule(ModDataAry, ModID, ModAbbr, Instance, ModDT, SolverDT, Vars, Linearize, ErrStat, ErrMsg, iRotor) + type(ModDataType), allocatable, intent(inout) :: ModDataAry(:) !< Array of module data to append new module + integer(IntKi), intent(in) :: ModID !< Module identifier + character(*), intent(in) :: ModAbbr !< Module name abbreviation + integer(IntKi), intent(in) :: Instance !< Instance number + real(R8Ki), intent(in) :: ModDT !< Module time step + real(R8Ki), intent(in) :: SolverDT !< Solver time step + type(ModVarsType), intent(in) :: Vars !< Module variables + logical, intent(in) :: Linearize !< Flag indicating linearization + integer(IntKi), intent(out) :: ErrStat !< Error status + character(ErrMsgLen), intent(out) :: ErrMsg !< Error message + integer(IntKi), optional, intent(in) :: iRotor !< Rotor number (0 or not present indicates all rotors) + + character(*), parameter :: RoutineName = 'MV_AddModule' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + type(ModDataType), allocatable :: ModDataAryTmp(:) + type(ModDataType) :: ModData + integer(IntKi) :: i, StartIndex + + ErrStat = ErrID_None + ErrMsg = '' + + ! Populate module information + if (allocated(ModDataAry)) then + ModData%iMod = size(ModDataAry) + 1 + else + ModData%iMod = 1 + end if + ModData%ID = ModID + ModData%Abbr = ModAbbr + ModData%Ins = Instance + ModData%DT = ModDT + call NWTC_Library_CopyModVarsType(Vars, ModData%Vars, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + if (present(iRotor)) then + ModData%iRotor = iRotor + else + ModData%iRotor = 0 + end if + + !---------------------------------------------------------------------------- + ! Calculate Module Sub-stepping + !---------------------------------------------------------------------------- + + ! If module time step is same as global time step, set substeps to 1 + if (EqualRealNos(ModData%DT, SolverDT)) then + ModData%SubSteps = 1 + else + ! If the module time step is greater than the global time step, set error + if (ModData%DT > SolverDT) then + call SetErrStat(ErrID_Fatal, "The "//trim(ModData%Abbr)// & + " module time step ("//trim(Num2LStr(ModData%DT))//" s) "// & + "cannot be larger than FAST time step ("//trim(Num2LStr(SolverDT))//" s).", & + ErrStat, ErrMsg, RoutineName) + return + end if + + ! Calculate the number of substeps + ModData%SubSteps = nint(SolverDT/ModData%DT) + + ! If the module DT is not an exact integer divisor of the global time step, set error + if (.not. EqualRealNos(SolverDT, ModData%DT*ModData%SubSteps)) then + call SetErrStat(ErrID_Fatal, "The "//trim(ModData%Abbr)// & + " module time step ("//trim(Num2LStr(ModData%DT))//" s) "// & + "must be an integer divisor of the FAST time step ("//trim(Num2LStr(SolverDT))//" s).", & + ErrStat, ErrMsg, RoutineName) + return + end if + end if + + !---------------------------------------------------------------------------- + ! Add module info to array + !---------------------------------------------------------------------------- + + if (.not. allocated(ModDataAry)) then + allocate(ModDataAry(1), source=ModData) + else + call move_alloc(ModDataAry, ModDataAryTmp) + allocate(ModDataAry(size(ModDataAryTmp) + 1)) + ModDataAry(:size(ModDataAryTmp)) = ModDataAryTmp + ModDataAry(size(ModDataAry)) = ModData + end if + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine GetModuleOrder(ModDataAry, ModIDs, ModOrder) + type(ModDataType), intent(in) :: ModDataAry(:) !< Array of module data structures + integer(IntKi), intent(in) :: ModIDs(:) !< List of module IDs to keep in order + integer(IntKi), allocatable, intent(out) :: ModOrder(:) !< Module data indices in order of ModIDs + integer(IntKi), allocatable :: ModIDAry(:), indices(:) + integer(IntKi) :: i + + ! Create array 1 to size(Mod) representing the index of each module data + indices = [(i, i=1, size(ModDataAry))] + + ! Get array of module IDs from array of module data + ModIDAry = [(ModDataAry(i)%ID, i=1, size(ModDataAry))] + + ! Initialize module order array with no size + allocate (ModOrder(0)) + + ! Loop through module IDs to keep, add module data indices that match module ID to order array + do i = 1, size(ModIDs) + ModOrder = [ModOrder, pack(indices, ModIDAry == ModIDs(i))] + end do + +end subroutine + +!------------------------------------------------------------------------------- +! Functions for packing and unpacking data by variable +!------------------------------------------------------------------------------- + +subroutine MV_Perturb(Var, iLin, PerturbSign, BaseAry, PerturbAry) + type(ModVarType), intent(in) :: Var + integer(IntKi), intent(in) :: iLin + integer(IntKi), intent(in) :: PerturbSign + real(R8Ki), intent(in) :: BaseAry(:) + real(R8Ki), intent(inout) :: PerturbAry(:) + + real(R8Ki) :: Perturb + real(R8Ki) :: quat(3), quat_p(3) + real(R8Ki) :: rv(3), dcm(3, 3) + integer(IntKi) :: i, j + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg + + ! Copy base array to perturbed array + PerturbAry = BaseAry + + ! Get variable perturbation and combine with sign + Perturb = Var%Perturb*real(PerturbSign, R8Ki) + + ! Index of perturbation value in array + i = Var%iLoc(1) + iLin - 1 + + ! If variable field is orientation, perturbation is in radians + if (Var%Field == FieldOrientation) then + j = mod(iLin - 1, 3) ! component being modified (0, 1, 2) + i = i - j ! index of start of quaternion parameters (3) + quat = BaseAry(i:i + 2) ! Current quat parameters value + quat_p = perturb_quat(Perturb, j + 1) ! Quaternion of perturbed angle + quat = quat_compose(quat, quat_p) ! Compose perturbation and current rotation + PerturbAry(i:i + 2) = quat ! Save perturbed quaternion in array + else + PerturbAry(i) = PerturbAry(i) + Perturb ! Add perturbation directly + end if + +end subroutine + +subroutine MV_ComputeDiff(VarAry, PosAry, NegAry, DiffAry) + type(ModVarType), intent(in) :: VarAry(:) ! Array of variables + real(R8Ki), intent(in) :: PosAry(:) ! Positive result array + real(R8Ki), intent(in) :: NegAry(:) ! Negative result array + real(R8Ki), intent(inout) :: DiffAry(:) ! Array containing difference + integer(IntKi) :: i, j, k + real(R8Ki) :: delta(3), R(3, 3), quat_pos(3), quat_neg(3) + real(R8Ki) :: ang_pos(3), ang_neg(3) + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg + + ! Loop through variables + do i = 1, size(VarAry) + + ! If variable field is orientation + if (VarAry(i)%Field == FieldOrientation) then + + ! Starting index into arrays + k = VarAry(i)%iLoc(1) + + ! Loop through nodes + do j = 1, VarAry(i)%Nodes + + ! Quaternions from negative and positive perturbations + quat_neg = NegAry(k:k + 2) + quat_pos = PosAry(k:k + 2) + + ! If flag set to use small angle rotations + if (UseSmallRotAngles) then + + ! Calculate relative rotation from negative to positive perturbation + delta = quat_compose(-quat_neg, quat_pos) + + ! Convert relative rotation from quaternion to rotation vector + DiffAry(k:k + 2) = GetSmllRotAngs(quat_to_dcm(delta), ErrStat, ErrMsg) + + else + + ! Calculate relative rotation from negative to positive perturbation + delta = quat_compose(-quat_neg, quat_pos) + + ! Convert delta quaternion to rotation vector and store in diff array + DiffAry(k:k + 2) = quat_to_rvec(delta) + + end if + + ! Increment starting index + k = k + 3 + + end do + + else + + ! Subtract negative array from positive array + associate (iLoc => VarAry(i)%iLoc) + DiffAry(iLoc(1):iLoc(2)) = PosAry(iLoc(1):iLoc(2)) - NegAry(iLoc(1):iLoc(2)) + end associate + end if + end do +end subroutine + +subroutine MV_ComputeCentralDiff(VarAry, Delta, PosAry, NegAry, DerivAry) + type(ModVarType), intent(in) :: VarAry(:) ! Array of variables + real(R8Ki), intent(in) :: Delta ! Positive perturbation value + real(R8Ki), intent(in) :: PosAry(:) ! Positive perturbation result array + real(R8Ki), intent(in) :: NegAry(:) ! Negative perturbation result array + real(R8Ki), intent(inout) :: DerivAry(:) ! Array containing derivative + + ! Compute difference between all values + call MV_ComputeDiff(VarAry, PosAry, NegAry, DerivAry) + + ! Divide derivative array by twice delta + DerivAry = DerivAry/(2.0_R8Ki*Delta) + +end subroutine + +!> MV_ExtrapInterp interpolates arrays of variable data to the target x value from +!! the array of x values. Supports constant, linear, and quadratic interpolation +!! similar to the ExtrapInterp routines created by the registry. +subroutine MV_ExtrapInterp(VarAry, y, tin, y_out, tin_out, ErrStat, ErrMsg) + type(ModVarType), intent(in) :: VarAry(:) ! Array of variables + real(R8Ki), intent(in) :: y(:, :) + real(R8Ki), intent(in) :: tin(:) + real(R8Ki), intent(inout) :: y_out(:) + real(R8Ki), intent(in) :: tin_out + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'MV_ExtrapInterp' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: InterpOrder + real(R8Ki) :: t(3), t_out, a1, a2, a3 + real(R8Ki) :: q1(4), q2(4), q3(4), q(4) + integer(IntKi) :: i, j, k + + ErrStat = ErrID_None + ErrMsg = '' + + ! Check that array sizes match + if (size(tin) /= size(y, 2)) then + call SetErrStat(ErrID_Fatal, 'size(tin) must equal size(y)', ErrStat, ErrMsg, RoutineName) + return + end if + + ! Calculate interpolation order + InterpOrder = size(tin) - 1 + + ! Switch based on interpolation order + select case (InterpOrder) + + case (0) ! Constant interpolation (copy) + + y_out = y(:, 1) + + case (1) ! Linear Interpolation + + t(1:2) = tin - tin(1) + t_out = tin_out - tin(1) + a1 = -(t_out - t(2))/t(2) + a2 = t_out/t(2) + y_out = a1*y(:, 1) + a2*y(:, 2) + + ! Loop through glue output variables + do i = 1, size(VarAry) + + ! Switch based on variable field type + select case (VarAry(i)%Field) + + case (FieldOrientation) ! SLERP for orientation quaternions + + k = VarAry(i)%iLoc(1) + do j = 1, VarAry(i)%Nodes + + ! Get quaternion 1 from array, calculate scalar + q1(2:4) = y(k:k + 2, 1) + q1(1) = quat_scalar(q1(2:4)) + + ! Get quaternion 2 from array, calculate scalar + q2(2:4) = y(k:k + 2, 2) + q2(1) = quat_scalar(q2(2:4)) + + ! Calculate dot product of two quaternions + ! Make quaternion 2 consistent with quaternion 1 for interp + if (dot_product(q1, q2) < 0.0_R8Ki) q2 = -q2 + + ! Interpolate quaternion components + q = a1*q1 + a2*q2 + + ! Store canonical quaternion in output array + y_out(k:k + 2) = quat_canonical(q(1), q(2:4)) + + ! Increment quaternion index + k = k + 3 + end do + + case (FieldScalar) ! Scalar field + + ! If field is on the range [0,2PI], perform angular interp + if (MV_HasFlagsAll(VarAry(i), VF_2PI)) then + + k = VarAry(i)%iLoc(1) + do j = 1, VarAry(i)%Num + call Angles_ExtrapInterp(y(k, 1), y(k, 2), t(1:2), y_out(k), t_out) + k = k + 1 + end do + + end if + + end select + + end do + + case (2) ! Quadratic Interpolation + + t = tin - tin(1) + t_out = tin_out - tin(1) + a1 = (t_out - t(2))*(t_out - t(3))/((t(1) - t(2))*(t(1) - t(3))) + a2 = (t_out - t(1))*(t_out - t(3))/((t(2) - t(1))*(t(2) - t(3))) + a3 = (t_out - t(1))*(t_out - t(2))/((t(3) - t(1))*(t(3) - t(2))) + y_out = a1*y(:, 1) + a2*y(:, 2) + a3*y(:, 3) + + ! Loop through glue output variables + do i = 1, size(VarAry) + + ! Switch based on variable field type + select case (VarAry(i)%Field) + + case (FieldOrientation) ! SLERP for orientation quaternions + + k = VarAry(i)%iLoc(1) + do j = 1, VarAry(i)%Nodes + + ! Get quaternion 1 from array, calculate scalar + q1(2:4) = y(k:k + 2, 1) + q1(1) = quat_scalar(q1(2:4)) + + ! Get quaternion 2 from array, calculate scalar + q2(2:4) = y(k:k + 2, 2) + q2(1) = quat_scalar(q2(2:4)) + + ! Get quaternion 3 from array, calculate scalar + q3(2:4) = y(k:k + 2, 3) + q3(1) = quat_scalar(q2(2:4)) + + ! Make quaternions 2 and 3 consistent with quaternion 1 + if (dot_product(q1, q2) < 0.0_R8Ki) q2 = -q2 + if (dot_product(q1, q3) < 0.0_R8Ki) q3 = -q3 + + ! Interpolate quaternion components + q = a1*q1 + a2*q2 + a3*q3 + + ! Store canonical quaternion in output array + y_out(k:k + 2) = quat_canonical(q(1), q(2:4)) + + ! Increment quaternion index + k = k + 3 + end do + + case (FieldScalar) ! Scalar field + + ! If field is on the range [0,2PI], perform angular interp + if (MV_HasFlagsAll(VarAry(i), VF_2PI)) then + + k = VarAry(i)%iLoc(1) + do j = 1, VarAry(i)%Num + call Angles_ExtrapInterp(y(k, 1), y(k, 2), y(k, 3), t, y_out(k), t_out) + k = k + 1 + end do + + end if + + end select + + end do + + case default + + ! Unsupported Interpolation + call SetErrStat(ErrID_Fatal, 'size(t) must be less than 4 (order must be less than 3).', ErrStat, ErrMsg, RoutineName) + return + end select + +end subroutine + +subroutine MV_AddDelta(VarAry, DeltaAry, DataAry) + type(ModVarType), intent(in) :: VarAry(:) ! Array of variables + real(R8Ki), intent(in) :: DeltaAry(:) ! Array of delta values + real(R8Ki), intent(inout) :: DataAry(:) ! Array to be modified + integer(IntKi) :: i, j, k + real(R8Ki) :: quat_base(3), quat_delta(3), rvec(3), dcm(3, 3) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ! Loop through variables + do i = 1, size(VarAry) + associate (iLoc => VarAry(i)%iLoc) + select case (VarAry(i)%Field) + case (FieldOrientation) + + ! Starting index into arrays + k = iLoc(1) + + ! Loop through nodes + do j = 1, VarAry(i)%Nodes + + ! Quaternion from data array + quat_base = DataAry(k:k + 2) + + ! Get rotation vector delta + rvec = DeltaAry(k:k + 2) + + if (UseSmallRotAngles) then + call SmllRotTrans('linearization perturbation', rvec(1), rvec(2), rvec(3), dcm, ErrStat=ErrStat2, ErrMsg=ErrMsg2) + quat_delta = dcm_to_quat(dcm) + else + quat_delta = rvec_to_quat(rvec) + end if + + ! Calculate composition of base quaternion and delta quaternion + DataAry(k:k + 2) = quat_compose(quat_base, quat_delta) + + ! Increment starting index + k = k + 3 + end do + + case default + DataAry(iLoc(1):iLoc(2)) = DataAry(iLoc(1):iLoc(2)) + DeltaAry(iLoc(1):iLoc(2)) + end select + end associate + end do +end subroutine + +!------------------------------------------------------------------------------- +! Functions for adding Variables +!------------------------------------------------------------------------------- + +subroutine MV_AddMeshVar(VarAry, Name, Fields, DL, Mesh, Flags, Perturbs, Active, iVar) + type(ModVarType), allocatable, intent(inout) :: VarAry(:) + character(*), intent(in) :: Name + integer(IntKi), intent(in) :: Fields(:) + type(DatLoc), intent(in) :: DL + type(MeshType), intent(inout) :: Mesh + integer(IntKi), optional, intent(in) :: Flags + real(R8Ki), optional, intent(in) :: Perturbs(:) + logical, optional, intent(in) :: Active + integer(IntKi) :: FlagsLocal + logical :: ActiveLocal + real(R8Ki), allocatable :: PerturbsLocal(:) + integer(IntKi), optional, intent(out) :: iVar + integer(IntKi) :: i + + ! If variable index is present, initialize to zero in case variable is inactive + if (present(iVar)) iVar = 0 + + ! If active argument specified and not active, return + if (present(Active)) then + if (.not. Active) return + end if + + ! If mesh has not been committed, return + if (.not. Mesh%committed) return + + ! Set mesh ID + if (allocated(VarAry)) then + Mesh%ID = size(VarAry) + 1 + else + Mesh%ID = 1 + end if + + ! Save variable index + if (present(iVar)) iVar = Mesh%ID + + ! Apply flags if specified + FlagsLocal = VF_Mesh + if (present(Flags)) FlagsLocal = ior(FlagsLocal, Flags) + + ! Set perturbations if specified + PerturbsLocal = [(0.0_R8Ki, i=1, size(Fields))] + if (present(Perturbs)) PerturbsLocal = Perturbs + + ! Loop through fields in mesh + do i = 1, size(Fields) + + ! Skip fields that mesh doesn't contain + if (.not. Mesh%fieldmask(Fields(i))) cycle + + ! Add variable + call MV_AddVar(VarAry, Name, Fields(i), & + DL=DL, & + Num=Mesh%Nnodes, & + Flags=FlagsLocal, & + Perturb=PerturbsLocal(i)) + end do +end subroutine + +subroutine MV_AddVar(VarAry, Name, Field, DL, Num, iAry, jAry, kAry, Flags, DerivOrder, Perturb, LinNames, Active) + type(ModVarType), allocatable, intent(inout) :: VarAry(:) + character(*), intent(in) :: Name + integer(IntKi), intent(in) :: Field + type(DatLoc), intent(in) :: DL + integer(IntKi), optional, intent(in) :: iAry, jAry, kAry + integer(IntKi), optional, intent(in) :: Num, Flags + real(R8Ki), optional, intent(in) :: Perturb + integer(IntKi), optional, intent(in) :: DerivOrder + character(*), optional, intent(in) :: LinNames(:) + logical, optional, intent(in) :: Active + integer(IntKi) :: i + type(ModVarType) :: Var + type(ModVarType), allocatable :: VarAryTmp(:) + + ! If active argument specified and not active, return + if (present(Active)) then + if (.not. Active) return + end if + + ! Initialize var with default values + Var = ModVarType(Name=Name, Field=Field, DL=DL, Num=1) + + ! If number of values is zero, return + if (present(Num)) then + if (Num == 0) return + Var%Num = Num + end if + + ! Set optional values + if (present(Flags)) Var%Flags = Flags + if (present(iAry)) then + Var%iLB = iAry + Var%iUB = iAry + Var%Num - 1 + else + Var%iLB = 1 + Var%iUB = Var%Num + end if + if (present(jAry)) Var%j = jAry + if (present(kAry)) Var%k = kAry + if (present(Perturb)) Var%Perturb = Perturb + if (present(LinNames)) then + allocate (Var%LinNames(size(LinNames))) + do i = 1, size(LinNames) + Var%LinNames(i) = LinNames(i) + end do + end if + + ! Set Derivative Order + if (present(DerivOrder)) then + Var%DerivOrder = DerivOrder + else + select case (Var%Field) + case (FieldOrientation, FieldTransDisp, FieldAngularDisp) ! Position/displacement + Var%DerivOrder = 0 + case (FieldTransVel, FieldAngularVel) ! Velocity + Var%DerivOrder = 1 + case (FieldTransAcc, FieldAngularAcc) ! Acceleration + Var%DerivOrder = 2 + case default + Var%DerivOrder = -1 + end select + end if + + ! Append Var to VarArray + if (allocated(VarAry)) then + call move_alloc(VarAry, VarAryTmp) + allocate(VarAry(size(VarAryTmp) + 1)) + VarAry(:size(VarAryTmp)) = VarAryTmp + VarAry(size(VarAry)) = Var + else + allocate(VarAry(1), source=Var) + end if + +end subroutine + +pure function MV_NumVals(VarAry, FlagFilter) result(Num) + type(ModVarType), intent(in) :: VarAry(:) + integer(IntKi), optional, intent(in) :: FlagFilter + integer(IntKi) :: Num, i + if (present(FlagFilter)) then + Num = 0 + do i = 1, size(VarAry) + if (MV_HasFlagsAll(VarAry(i), FlagFilter)) Num = Num + VarAry(i)%Num + end do + else + Num = sum(VarAry%Num) + end if +end function + +pure function MV_NumVars(VarAry, FlagFilter) result(Num) + type(ModVarType), intent(in) :: VarAry(:) + integer(IntKi), optional, intent(in) :: FlagFilter + integer(IntKi) :: Num, i + if (present(FlagFilter)) then + Num = 0 + do i = 1, size(VarAry) + if (MV_HasFlagsAll(VarAry(i), FlagFilter)) Num = Num + 1 + end do + else + Num = size(VarAry) + end if +end function + +! MV_IsLoad returns true if the variable field is FieldForce or FieldMoment +pure logical function MV_IsLoad(Var) + type(ModVarType), intent(in) :: Var + select case (Var%Field) + case (FieldForce, FieldMoment) + MV_IsLoad = .true. + case default + MV_IsLoad = .false. + end select +end function + +! MV_IsMotion returns true if the variable field is a motion +pure logical function MV_IsMotion(Var) + type(ModVarType), intent(in) :: Var + select case (Var%Field) + case (FieldTransDisp, FieldOrientation, FieldTransVel, FieldAngularVel, FieldTransAcc, FieldAngularAcc) + MV_IsMotion = .true. + case default + MV_IsMotion = .false. + end select +end function + +! MV_EqualDL returns true if data location numbers are greater than zero and +! all components of the data location are the same. +pure logical function MV_EqualDL(DL1, DL2) + type(DatLoc), intent(in) :: DL1, DL2 + MV_EqualDL = DL1%Num /= 0 .and. DL2%Num /= 0 .and. & + DL1%Num == DL2%Num .and. & + DL1%i1 == DL2%i1 .and. & + DL1%i2 == DL2%i2 .and. & + DL1%i3 == DL2%i3 +end function + +! Find variable index in array based on DatLoc number +pure function MV_FindVarDatLoc(VarAry, DL) result(iVar) + type(ModVarType), intent(in) :: VarAry(:) + type(DatLoc), intent(in) :: DL + integer(IntKi) :: iVar + do iVar = 1, size(VarAry) + if (VarAry(iVar)%DL%Num /= DL%Num) cycle + if (VarAry(iVar)%DL%i1 /= DL%i1) cycle + if (VarAry(iVar)%DL%i2 /= DL%i2) cycle + if (VarAry(iVar)%DL%i3 /= DL%i3) cycle + return + end do + iVar = 0 +end function + +!------------------------------------------------------------------------------- +! Flag Utilities +!------------------------------------------------------------------------------- + +!> MV_HasFlagsAll returns true if Flags is VF_None or variable contains all flags in Flags. +pure logical function MV_HasFlagsAll(Var, Flags) + type(ModVarType), intent(in) :: Var + integer(IntKi), intent(in) :: Flags + MV_HasFlagsAll = iand(Var%Flags, Flags) == Flags +end function + +!> MV_HasFlagsAny returns true if Flags is VF_None or variable contains any flags in Flags. +pure logical function MV_HasFlagsAny(Var, Flags) + type(ModVarType), intent(in) :: Var + integer(IntKi), intent(in) :: Flags + MV_HasFlagsAny = (Flags == VF_None) .or. (iand(Var%Flags, Flags) > 0) +end function + +!> MV_SetFlags adds the given flags to the variable. +subroutine MV_SetFlags(Var, Flags) + type(ModVarType), intent(inout) :: Var + integer(IntKi), intent(in) :: Flags + integer(IntKi) :: i + Var%Flags = ior(Var%Flags, Flags) +end subroutine + +!> MV_ClearFlags removes the given flags from the variable. +subroutine MV_ClearFlags(Var, Flags) + type(ModVarType), intent(inout) :: Var + integer(IntKi), intent(in) :: Flags + integer(IntKi) :: i + Var%Flags = iand(Var%Flags, not(Flags)) +end subroutine + +!------------------------------------------------------------------------------- +! String Utilities +!------------------------------------------------------------------------------- + +function IdxStr(i1, i2, i3, i4, i5) result(s) + integer(IntKi), intent(in) :: i1 + integer(IntKi), optional, intent(in) :: i2, i3, i4, i5 + character(100) :: s + if (present(i5)) then + s = '('//trim(Num2LStr(i1))//','//trim(Num2LStr(i2))//','//trim(Num2LStr(i3))//','//trim(Num2LStr(i4))//','//trim(Num2LStr(i5))//')' + else if (present(i4)) then + s = '('//trim(Num2LStr(i1))//','//trim(Num2LStr(i2))//','//trim(Num2LStr(i3))//','//trim(Num2LStr(i4))//')' + else if (present(i3)) then + s = '('//trim(Num2LStr(i1))//','//trim(Num2LStr(i2))//','//trim(Num2LStr(i3))//')' + else if (present(i2)) then + s = '('//trim(Num2LStr(i1))//','//trim(Num2LStr(i2))//')' + else + s = '('//trim(Num2LStr(i1))//')' + end if +end function + +!------------------------------------------------------------------------------- +! Rotation Utilities +!------------------------------------------------------------------------------- + +function perturb_quat(theta, idir) result(q) + real(R8Ki), intent(in) :: theta + integer(IntKi), intent(in) :: idir + real(R8Ki) :: rvec(3), q(3), dcm(3, 3) + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg + + select case (idir) + case (1) + rvec = [theta, 0.0_R8Ki, 0.0_R8Ki] + case (2) + rvec = [0.0_R8Ki, theta, 0.0_R8Ki] + case (3) + rvec = [0.0_R8Ki, 0.0_R8Ki, theta] + end select + + if (UseSmallRotAngles) then + call SmllRotTrans('linearization perturbation', rvec(1), rvec(2), rvec(3), dcm, ErrStat=ErrStat, ErrMsg=ErrMsg) + q = dcm_to_quat(dcm) + else + q = rvec_to_quat(rvec) + end if +end function + +! quat_scalar returns the scalar part of the quaternion +pure function quat_scalar(q) result(w) + real(R8Ki), intent(in) :: q(3) + real(R8Ki) :: im, w + ! Calculate magnitude of imaginary part of quaternion + im = dot_product(q, q) + if (im < 1.0_R8Ki) then + w = sqrt(1.0_R8Ki - im) + else + w = 0.0_R8Ki + end if +end function + +! quat_canonical returns the imaginary part of the quaternion after ensuring +! that it's a unit quaternion with a positive real part. +pure function quat_canonical(q0, q) result(qc) + real(R8Ki), intent(in) :: q0, q(3) + real(R8Ki) :: qc(3), m + integer(IntKi) :: i + m = q0*q0 + q(1)*q(1) + q(2)*q(2) + q(3)*q(3) + if (q0 < 0.0_R8Ki) then + qc = -q/m + else + qc = q/m + end if +end function + +function dcm_to_quat(dcm) result(q) + real(R8Ki), intent(in) :: dcm(3, 3) + real(R8Ki) :: q(3) + real(R8Ki) :: t, s, qw + + ! Trace of matrix + t = dcm(1, 1) + dcm(2, 2) + dcm(3, 3) + + if (t > 0.0_R8Ki) then + S = sqrt(t + 1.0_R8Ki)*2.0_R8Ki ! S=4*qw + qw = 0.25_R8Ki*S + q(1) = (dcm(3, 2) - dcm(2, 3))/S + q(2) = (dcm(1, 3) - dcm(3, 1))/S + q(3) = (dcm(2, 1) - dcm(1, 2))/S + elseif ((dcm(1, 1) > dcm(2, 2)) .and. (dcm(1, 1) > dcm(3, 3))) then + S = sqrt(1.0_R8Ki + dcm(1, 1) - dcm(2, 2) - dcm(3, 3))*2.0_R8Ki ! S=4*qx + qw = (dcm(3, 2) - dcm(2, 3))/S + q(1) = 0.25_R8Ki*S + q(2) = (dcm(1, 2) + dcm(2, 1))/S + q(3) = (dcm(1, 3) + dcm(3, 1))/S + elseif (dcm(2, 2) > dcm(3, 3)) then + S = sqrt(1.0_R8Ki + dcm(2, 2) - dcm(1, 1) - dcm(3, 3))*2.0_R8Ki ! S=4*qy + qw = (dcm(1, 3) - dcm(3, 1))/S + q(1) = (dcm(1, 2) + dcm(2, 1))/S + q(2) = 0.25_R8Ki*S + q(3) = (dcm(2, 3) + dcm(3, 2))/S + else + S = sqrt(1.0_R8Ki + dcm(3, 3) - dcm(1, 1) - dcm(2, 2))*2.0_R8Ki ! S=4*qz + qw = (dcm(2, 1) - dcm(1, 2))/S + q(1) = (dcm(1, 3) + dcm(3, 1))/S + q(2) = (dcm(2, 3) + dcm(3, 2))/S + q(3) = 0.25_R8Ki*S + end if + + q = quat_canonical(qw, q) +end function + +! dcm_to_quat2 returns a quaternion from a DCM based on eigenanalysis +! https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion +function dcm_to_quat2(dcm) result(q) + real(R8Ki), intent(in) :: dcm(3, 3) + real(R8Ki) :: q(3) + integer(IntKi), parameter :: n = 4 + real(R8Ki) :: Qxx, Qxy, Qxz, Qyx, Qyy, Qyz, Qzx, Qzy, Qzz + real(R8Ki) :: A(n, n), wr(n), wi(n), vl(n, n), vr(n, n), work(4*n) + integer(IntKi) :: info, lwork, i + + Qxx = dcm(1, 1) + Qyx = dcm(2, 1) + Qzx = dcm(3, 1) + Qxy = dcm(1, 2) + Qyy = dcm(2, 2) + Qzy = dcm(3, 2) + Qxz = dcm(1, 3) + Qyz = dcm(2, 3) + Qzz = dcm(3, 3) + + A(:, 1) = [Qxx - Qyy - Qzz, Qyx + Qxy, Qzx + Qxz, Qzy - Qyz]/3.0_R8Ki + A(:, 2) = [Qyx + Qxy, Qyy - Qxx - Qzz, Qzy + Qyz, Qxz - Qzx]/3.0_R8Ki + A(:, 3) = [Qzx + Qxz, Qzy + Qyz, Qzz - Qxx - Qyy, Qyx - Qxy]/3.0_R8Ki + A(:, 4) = [Qzy - Qyz, Qxz - Qzx, Qyx - Qxy, Qxx + Qyy + Qzz]/3.0_R8Ki + + lwork = 4*n + + call dgeev('N', 'V', n, A, n, wr, wi, vl, n, vr, n, work, lwork, info) + + ! If error calculating eigenvector/eigenvalues + if (info /= 0) then + q = 0.0_R8Ki + return + end if + + ! Get index of maximum real eigenvalue + i = maxloc(wr, dim=1) + + ! Canonical form of quaternion + q = quat_canonical(vr(4, i), vr(1:3, i)) +end function + +! quat_to_dcm returns a dcm based on the quaternion where q is a unit quaternion with a positive scalar component +! https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Quaternion-derived_rotation_matrix +pure function quat_to_dcm(q) result(dcm) + real(R8Ki), intent(in) :: q(3) + real(R8Ki) :: dcm(3, 3) + real(R8Ki) :: w, ww, xx, yy, zz, n, s + real(R8Ki) :: xy, yz, xz, wx, wy, wz + + ! Calculate scalar component + w = quat_scalar(q) + + ww = w*w + xx = q(1)*q(1) + yy = q(2)*q(2) + zz = q(3)*q(3) + + xy = q(1)*q(2) + yz = q(2)*q(3) + xz = q(1)*q(3) + + wx = q(1)*w + wy = q(2)*w + wz = q(3)*w + + n = ww + xx + yy + zz + if (n < epsilon(n)) then + s = 0.0_R8Ki + else + s = 2.0_R8Ki/n + end if + + dcm(:, 1) = [1.0_R8Ki - s*(yy + zz), s*(xy + wz), s*(xz - wy)] + dcm(:, 2) = [s*(xy - wz), 1.0_R8Ki - s*(xx + zz), s*(yz + wx)] + dcm(:, 3) = [s*(xz + wy), s*(yz - wx), 1.0_R8Ki - s*(xx + yy)] + +end function + +pure function quat_compose(q1, q2) result(q) + real(R8Ki), intent(in) :: q1(3), q2(3) + real(R8Ki) :: q(3), q0 + real(R8Ki) :: w1, x1, y1, z1 + real(R8Ki) :: w2, x2, y2, z2 + w1 = quat_scalar(q1) + x1 = q1(1); y1 = q1(2); z1 = q1(3) + w2 = quat_scalar(q2) + x2 = q2(1); y2 = q2(2); z2 = q2(3) + q0 = w1*w2 - x1*x2 - y1*y2 - z1*z2 + q(1) = w1*x2 + x1*w2 + y1*z2 - z1*y2 + q(2) = w1*y2 - x1*z2 + y1*w2 + z1*x2 + q(3) = w1*z2 + x1*y2 - y1*x2 + z1*w2 + q = quat_canonical(q0, q) +end function + +pure function quat_inv(q) result(qi) + real(R8Ki), intent(in) :: q(3) + real(R8Ki) :: qi(3) + qi = -q +end function + +! https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Recovering_the_axis-angle_representation +pure function quat_to_rvec(q) result(rvec) + real(R8Ki), intent(in) :: q(3) + real(R8Ki) :: qr, theta, tmp, rvec(3), m + + ! Magnitude of imaginary part + m = sqrt(dot_product(q, q)) + + ! If this is an identity quaternion, qr == 1, rotation vector is zero + if (m < epsilon(m)) then + rvec = 0.0_R8Ki + else + qr = sqrt(1.0_R8Ki - m*m) ! Scalar part + theta = 2.0_R8Ki*atan2(m, qr) ! Angle + rvec = -theta*q/m ! Negative sign doesn't make sense, but needed for quaternions + end if +end function + +pure function rvec_to_quat(rvec) result(q) + real(R8Ki), intent(in) :: rvec(3) + real(R8Ki) :: theta, half_theta, q0, q(3) + theta = sqrt(dot_product(rvec, rvec)) + if (theta < epsilon(theta)) then + ! Angle is zero, quaternion is identity + q = 0.0_R8Ki + else + half_theta = theta/2.0_R8Ki + q0 = cos(half_theta) + q = rvec/theta*sin(half_theta) + q = -quat_canonical(q0, q) ! Negative sign doesn't make sense, but needed for quaternions + end if +end function + +! Returns the tangent (T) matrix +! https://doi.org/10.1007/s11044-024-09970-8 (Appendix A) +pure function rvec_to_tan(rvec) result(T) + real(R8Ki), intent(in) :: rvec(3) + real(R8Ki) :: theta, a, b, rv_tilde(3,3), T(3,3) + theta = sqrt(dot_product(rvec, rvec)) + rv_tilde = SkewSymMat(rvec) + if (theta < 0.01_R8Ki) then + a = -0.5_R8Ki + theta**2/24.0_R8Ki - theta**4/720.0_R8Ki + b = 1.0_R8Ki / 6.0_R8Ki - theta**2/120.0_R8Ki + theta**4/5040.0_R8Ki + else + a = (cos(theta) - 1.0_R8Ki) / theta**2 + b = (theta - sin(theta)) / theta**3 + end if + T = I33 + a * rv_tilde + b * matmul(rv_tilde, rv_tilde) +end function + +! Returns the tangent inverse (T^-1) matrix +! https://doi.org/10.1007/s11044-024-09970-8 (Appendix A) +pure function rvec_to_tan_inv(rvec) result(T) + real(R8Ki), intent(in) :: rvec(3) + real(R8Ki) :: theta, a, rv_tilde(3,3), T(3,3) + theta = sqrt(dot_product(rvec, rvec)) + rv_tilde = SkewSymMat(rvec) + if (theta < 0.01_R8Ki) then + a = 1.0_R8Ki / 12.0_R8Ki + theta**2/720.0_R8Ki + theta**4/30240.0_R8Ki + else + a = (1.0_R8Ki - 0.5_R8Ki * theta * cotan(0.5_R8Ki * theta)) / theta**2 + end if + T = I33 + 0.5_R8Ki * rv_tilde + a * matmul(rv_tilde, rv_tilde) +end function + +pure function wm_to_quat(c) result(q) + real(R8Ki), intent(in) :: c(3) + real(R8Ki) :: c0, q0, q(3) + c0 = 2.0_R8Ki - dot_product(c, c)/8.0_R8Ki + q0 = c0/(4.0_R8Ki - c0) + q = c/(4.0_R8Ki - c0) + q = quat_canonical(q0, q) +end function + +pure function quat_to_wm(q) result(c) + real(R8Ki), intent(in) :: q(3) + real(R8Ki) :: c(3) + real(R8Ki) :: q0 + q0 = quat_scalar(q) + c = 4.0_R8Ki*q/(1.0_R8Ki + q0) +end function + +pure function wm_inv(c) result(cinv) + real(R8Ki), intent(in) :: c(3) + real(R8Ki) :: cinv(3) + cinv = -c +end function + +pure function cross(a, b) result(c) + real(R8Ki), intent(in) :: a(3), b(3) + real(R8Ki) :: c(3) + c = [a(2)*b(3) - a(3)*b(2), a(3)*b(1) - a(1)*b(3), a(1)*b(2) - b(1)*a(2)] +end function + +pure function quat_rotate_vec(q, v) result(v_out) + real(R8Ki), intent(in) :: q(3), v(3) + real(R8Ki) :: v_out(3), q0, q0q0, q1q1, q2q2, q3q3, q1q2, q1q3, q2q3, q0q1, q0q2, q0q3 + q0 = quat_scalar(q) + q0q0 = q0**2 + q1q1 = q(1)**2 + q2q2 = q(2)**2 + q3q3 = q(3)**2 + q0q1 = q0*q(1) + q0q2 = q0*q(2) + q0q3 = q0*q(3) + q1q2 = q(1)*q(2) + q1q3 = q(1)*q(3) + q2q3 = q(2)*q(3) + v_out(1) = (q0q0 + q1q1 - q2q2 - q3q3)*v(1) + 2*(q1q2 - q0q3)*v(2) + 2*(q1q3 + q0q2)*v(3); + v_out(2) = 2*(q1q2 + q0q3)*v(1) + (q0q0 - q1q1 + q2q2 - q3q3)*v(2) + 2*(q2q3 - q0q1)*v(3); + v_out(3) = 2*(q1q3 - q0q2)*v(1) + 2*(q2q3 + q0q1)*v(2) + (q0q0 - q1q1 - q2q2 + q3q3)*v(3); +end function + +pure function project_vec(a, b) result(c) + real(R8Ki), intent(in) :: a(3), b(3) + real(R8Ki) :: c(3) + c = dot_product(a, b) / dot_product(b, b) * b +end function + +! Remove twist about axis from given quaternion +! http://www.euclideanspace.com/maths/geometry/rotations/for/decomposition +subroutine quat_to_swing_twist(q, twist_axis, q_swing, q_twist) + real(R8Ki), intent(in) :: q(3), twist_axis(3) + real(R8Ki), intent(out) :: q_swing(3), q_twist(3) + real(R8Ki) :: w, q_axis(3), p(3) + + ! Get scalar part of quaternion + w = quat_scalar(q) + + ! If scalar component is nearly 1, quaternion is identity + if (w + 1e-12_R8Ki > 1.0_R8Ki) then + q_swing = 0.0_R8Ki + q_twist = 0.0_R8Ki + else + q_twist = project_vec(q, twist_axis) + q_swing = quat_compose(q, -q_twist) + end if + +end subroutine + +!------------------------------------------------------------------------------- +! Debugging +!------------------------------------------------------------------------------- + +subroutine DumpMatrix(unit, filename, A, ErrStat, ErrMsg) + integer(IntKi), intent(in) :: unit + character(*), intent(in) :: filename + real(R8Ki), intent(in) :: A(:, :) + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'DumpMatrix' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + call OpenBOutFile(unit, filename, ErrStat2, ErrMsg2) + write (unit) int(shape(A), B4Ki) + write (unit) pack(A, .true.) + close (unit) +end subroutine + +end module diff --git a/modules/nwtc-library/src/NWTC_Base.f90 b/modules/nwtc-library/src/NWTC_Base.f90 index 4e25d16c9e..33235ec261 100644 --- a/modules/nwtc-library/src/NWTC_Base.f90 +++ b/modules/nwtc-library/src/NWTC_Base.f90 @@ -89,7 +89,7 @@ MODULE NWTC_Base !! and has the ability to provide a sort of traceback message of called !! routines (if this is called consistently). !! Modules in the FAST framework are recommended to use it. - subroutine SetErrStat (ErrStatLcl, ErrMessLcl, ErrStat, ErrMess, RoutineName) + pure subroutine SetErrStat (ErrStatLcl, ErrMessLcl, ErrStat, ErrMess, RoutineName) INTEGER(IntKi), INTENT(IN ) :: ErrStatLcl ! Error status of the operation CHARACTER(*), INTENT(IN ) :: ErrMessLcl ! Error message if ErrStat /= ErrID_None @@ -100,9 +100,12 @@ subroutine SetErrStat (ErrStatLcl, ErrMessLcl, ErrStat, ErrMess, RoutineName) CHARACTER(*), INTENT(IN ) :: RoutineName ! Name of the routine error occurred in IF ( ErrStatLcl /= ErrID_None ) THEN - IF (ErrStat /= ErrID_None) ErrMess = TRIM(ErrMess)//new_line('a') - ErrMess = TRIM(ErrMess)//TRIM(RoutineName)//':'//TRIM(ErrMessLcl) - ErrStat = MAX(ErrStat,ErrStatLcl) + IF (ErrStat /= ErrID_None) then + ErrMess = TRIM(ErrMess)//new_line('a')//TRIM(RoutineName)//':'//TRIM(ErrMessLcl) + else + ErrMess = TRIM(RoutineName)//':'//TRIM(ErrMessLcl) + END IF + ErrStat = MAX(ErrStat, ErrStatLcl) END IF end subroutine diff --git a/modules/nwtc-library/src/NWTC_Library.f90 b/modules/nwtc-library/src/NWTC_Library.f90 index e9c944c128..bd37a1ac85 100644 --- a/modules/nwtc-library/src/NWTC_Library.f90 +++ b/modules/nwtc-library/src/NWTC_Library.f90 @@ -78,6 +78,7 @@ MODULE NWTC_Library USE NWTC_Str ! String utils USE ModMesh USE ModReg + USE ModVar #ifndef NO_MESHMAPPING ! Note that ModMesh_Mapping also includes LAPACK routines diff --git a/modules/nwtc-library/src/NWTC_Library_IncSubs.f90 b/modules/nwtc-library/src/NWTC_Library_IncSubs.f90 index b289850916..6bddd1120e 100644 --- a/modules/nwtc-library/src/NWTC_Library_IncSubs.f90 +++ b/modules/nwtc-library/src/NWTC_Library_IncSubs.f90 @@ -574,4 +574,5 @@ subroutine NWTC_Library_UnPackMeshMapType(RF, OutData) call RegUnpackAlloc(RF, OutData%LoadLn2_M); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackMeshMapLinearizationType(RF, OutData%dM) ! dM end subroutine + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/nwtc-library/src/NWTC_Library_Types.f90 b/modules/nwtc-library/src/NWTC_Library_Types.f90 index 4ae45e08b4..45bff23fc0 100644 --- a/modules/nwtc-library/src/NWTC_Library_Types.f90 +++ b/modules/nwtc-library/src/NWTC_Library_Types.f90 @@ -31,30 +31,42 @@ !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. MODULE NWTC_Library_Types !--------------------------------------------------------------------------------------------------------------------------------- +USE Precision USE SysSubs USE ModReg IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: VarNameLen = 64 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Force = 1 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Moment = 2 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Orientation = 3 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_TransDisp = 4 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_AngularDisp = 5 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_TransVel = 6 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_AngularVel = 7 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_TransAcc = 8 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_AngularAcc = 9 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Scalar = 10 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_None = 0 ! Variable with no flags [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Mesh = 1 ! Variable contained in mesh [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Line = 2 ! Variable is for a line mesh [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_RotFrame = 4 ! Variable in rotating frame [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Ext = 8 ! Variable for extended linearization [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Any = 4095 ! Enable all flags (used for filtering) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VC_None = 0 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VC_Tight = 1 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VC_Option1 = 2 ! [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: VC_Option2 = 3 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VarNameLen = 64 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldForce = 1 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldMoment = 2 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldOrientation = 3 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldTransDisp = 4 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldTransVel = 5 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldAngularVel = 6 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldTransAcc = 7 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldAngularAcc = 8 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldScalar = 9 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldAngularDisp = 10 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: FieldCount = 10 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_None = 0 ! Variable with no flags [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Mesh = 1 ! Variable contained in mesh [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Line = 2 ! Variable is for a line mesh [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_RotFrame = 4 ! Variable in rotating frame [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Linearize = 8 ! Variable for linearization [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_ExtLin = 16 ! Variable for extended linearization [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_2PI = 32 ! Variable is an angle with range [0,2pi] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_WM_Rot = 64 ! Variable is a Wiener-Milenkovic rotation [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_WriteOut = 128 ! Variable for write output [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Solve = 256 ! Variable for tight coupling solver [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_AeroMap = 512 ! Variable for aeromap [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_DerivOrder1 = 1024 ! Variable is derivative order 1 in linearization file [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_DerivOrder2 = 2048 ! Variable is derivative order 2 in linearization file [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_Mapping = 4096 ! Variable is used in a module-to-module transfer mapping [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: VF_NoLin = 8192 ! Flag to exclude variable from linearization or solver [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MC_None = 0 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MC_Tight = 1 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MC_Option1 = 2 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MC_Option2 = 4 ! [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MC_Post = 8 ! [-] ! ========= ProgDesc ======= TYPE, PUBLIC :: ProgDesc CHARACTER(99) :: Name !< Name of the program or module [-] @@ -106,74 +118,105 @@ MODULE NWTC_Library_Types CHARACTER(6) :: RNG_type END TYPE NWTC_RandomNumber_ParameterType ! ======================= +! ========= DatLoc ======= + TYPE, PUBLIC :: DatLoc + INTEGER(IntKi) :: Num = 0 !< Field number in module input, output, or continuous state derived data types [-] + INTEGER(IntKi) :: i1 = 0 !< Index 1 [-] + INTEGER(IntKi) :: i2 = 0 !< Index 2 [-] + INTEGER(IntKi) :: i3 = 0 !< Index 3 [-] + INTEGER(IntKi) :: i4 = 0 !< Index 4 [-] + INTEGER(IntKi) :: i5 = 0 !< Index 5 [-] + END TYPE DatLoc +! ======================= ! ========= ModVarType ======= TYPE, PUBLIC :: ModVarType - character(VarNameLen) :: Name !< [-] INTEGER(IntKi) :: Field = 0 !< [-] INTEGER(IntKi) :: Nodes = 1 !< [-] INTEGER(IntKi) :: Num = 1 !< [-] INTEGER(IntKi) :: Flags = 0 !< [-] INTEGER(IntKi) :: DerivOrder = 0 !< [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iLoc !< indices in local arrays [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iSol !< indices in solver arrays [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iLin !< indices in linearization arrays [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iq !< row index in solver q matrix [-] - INTEGER(IntKi) , DIMENSION(1:2) :: iUsr = 0_IntKi !< first user defined index for variable, can be used a lower/upper bounds [-] - INTEGER(IntKi) :: jUsr = 0 !< second user defined index for variable [-] - INTEGER(IntKi) :: MeshID = 0 !< Mesh identification number [-] - LOGICAL :: Solve = .false. !< flag indicating that variable is used by solver [-] - REAL(R8Ki) :: Perturb = 0 !< perturbation [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iLoc = 0 !< indices in module arrays [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iGlu = 0 !< indices in module arrays [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iq = 0 !< solver state row indices [-] + INTEGER(IntKi) :: iLB = 0 !< first user defined index lower bound for variable [-] + INTEGER(IntKi) :: iUB = 0 !< first user defined index upper bound for variable [-] + INTEGER(IntKi) :: j = 0 !< second user defined index for variable [-] + INTEGER(IntKi) :: k = 0 !< third user defined index for variable [-] + INTEGER(IntKi) :: m = 0 !< fourth user defined index for variable [-] + INTEGER(IntKi) :: n = 0 !< fifth user defined index for variable [-] + REAL(R8Ki) :: Perturb = 0 !< perturbation amount for linearization [-] + TYPE(DatLoc) :: DL !< data location [-] + character(VarNameLen) :: Name !< [-] character(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames !< [-] END TYPE ModVarType ! ======================= ! ========= ModVarsType ======= TYPE, PUBLIC :: ModVarsType - INTEGER(IntKi) :: ModNum = 0 !< [-] - character(6) :: ModAbbr !< [-] + INTEGER(IntKi) :: Nx = 0 !< Number of x values [-] + INTEGER(IntKi) :: Nu = 0 !< Number of u values [-] + INTEGER(IntKi) :: Ny = 0 !< Number of y values [-] TYPE(ModVarType) , DIMENSION(:), ALLOCATABLE :: x !< Module state variable array [-] TYPE(ModVarType) , DIMENSION(:), ALLOCATABLE :: u !< Module input variable array [-] TYPE(ModVarType) , DIMENSION(:), ALLOCATABLE :: y !< Module output variable array [-] - INTEGER(IntKi) :: Nx = 0_IntKi !< [-] - INTEGER(IntKi) :: Nu = 0_IntKi !< [-] - INTEGER(IntKi) :: Ny = 0_IntKi !< [-] END TYPE ModVarsType ! ======================= -! ========= ModValsType ======= - TYPE, PUBLIC :: ModValsType +! ========= ModJacType ======= + TYPE, PUBLIC :: ModJacType + INTEGER(IntKi) :: Nx = 0 !< Number of x values [-] + INTEGER(IntKi) :: Nu = 0 !< Number of u values [-] + INTEGER(IntKi) :: Ny = 0 !< Number of y values [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: x !< [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: dxdt !< [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: u !< [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: y !< [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: u_perturb !< input perturbation array [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: x_perturb !< [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: xp !< [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: xn !< [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: yp !< [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: yn !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: u_perturb !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: x_pos !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: x_neg !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: y_pos !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: y_neg !< [-] + END TYPE ModJacType +! ======================= +! ========= ModLinType ======= + TYPE, PUBLIC :: ModLinType + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: x !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: dx !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: u !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: y !< [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: J !< [-] REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: dYdx !< [-] REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: dXdx !< [-] REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: dYdu !< [-] REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: dXdu !< [-] - END TYPE ModValsType + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: dXdy !< [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: dUdu !< [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: dUdy !< [-] + END TYPE ModLinType ! ======================= ! ========= ModDataType ======= TYPE, PUBLIC :: ModDataType - INTEGER(IntKi) :: Idx = 0 !< Module index in array of modules [-] - INTEGER(IntKi) :: ID = 0 !< Module identification number [-] character(ChanLen) :: Abbr !< Module name abbreviation [-] + INTEGER(IntKi) :: iMod = 0 !< Module index in array of modules [-] + INTEGER(IntKi) :: ID = 0 !< Module identification number [-] INTEGER(IntKi) :: Ins = 0 !< Module instance number [-] - LOGICAL :: IsTC = .false. !< Flag indicating module is part of tight coupling [-] - REAL(R8Ki) :: DT = 0 !< Module time step [-] + INTEGER(IntKi) :: iRotor = 0 !< Module rotor number [-] INTEGER(IntKi) :: SubSteps = 0 !< Module number of substeps per solver time step [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: ixs !< index array mapping local x vector to global x vector [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: ius !< index array mapping local u vector to global u vector [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: iys !< index array mapping local y vector to global y vector [-] - TYPE(ModVarsType) , POINTER :: Vars => NULL() !< Pointer to module variables type [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: SrcMaps !< Indices of mappings where module is the source [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: DstMaps !< Indices of mappings where module is the destination [-] + INTEGER(IntKi) :: Category = 0 !< Module category tight, option 1, option 2 [-] + REAL(R8Ki) :: DT = 0 !< Module time step [-] + TYPE(ModVarsType) :: Vars !< Module variables type [-] + TYPE(ModLinType) :: Lin !< Module linearization arrays and matrices [-] END TYPE ModDataType ! ======================= -CONTAINS +! ========= KdTreeType ======= + TYPE, PUBLIC :: KdTreeType + INTEGER(IntKi) :: NNodes = 0 !< Number of nodes in tree [-] + INTEGER(IntKi) :: NDims = 0 !< Number of dimensions in tree [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Nodes !< Array of node positions [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: OriginalIndices !< Array of original node indices [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: Dimensions !< The splitting dimension (1 for x, 2 for y) for each node. [-] + END TYPE KdTreeType +! ======================= + +contains subroutine NWTC_Library_CopyProgDesc(SrcProgDescData, DstProgDescData, CtrlCode, ErrStat, ErrMsg) type(ProgDesc), intent(in) :: SrcProgDescData @@ -593,6 +636,59 @@ subroutine NWTC_Library_UnPackNWTC_RandomNumber_ParameterType(RF, OutData) call RegUnpack(RF, OutData%RNG_type); if (RegCheckErr(RF, RoutineName)) return end subroutine +subroutine NWTC_Library_CopyDatLoc(SrcDatLocData, DstDatLocData, CtrlCode, ErrStat, ErrMsg) + type(DatLoc), intent(in) :: SrcDatLocData + type(DatLoc), intent(inout) :: DstDatLocData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'NWTC_Library_CopyDatLoc' + ErrStat = ErrID_None + ErrMsg = '' + DstDatLocData%Num = SrcDatLocData%Num + DstDatLocData%i1 = SrcDatLocData%i1 + DstDatLocData%i2 = SrcDatLocData%i2 + DstDatLocData%i3 = SrcDatLocData%i3 + DstDatLocData%i4 = SrcDatLocData%i4 + DstDatLocData%i5 = SrcDatLocData%i5 +end subroutine + +subroutine NWTC_Library_DestroyDatLoc(DatLocData, ErrStat, ErrMsg) + type(DatLoc), intent(inout) :: DatLocData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'NWTC_Library_DestroyDatLoc' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine NWTC_Library_PackDatLoc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(DatLoc), intent(in) :: InData + character(*), parameter :: RoutineName = 'NWTC_Library_PackDatLoc' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%Num) + call RegPack(RF, InData%i1) + call RegPack(RF, InData%i2) + call RegPack(RF, InData%i3) + call RegPack(RF, InData%i4) + call RegPack(RF, InData%i5) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine NWTC_Library_UnPackDatLoc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(DatLoc), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'NWTC_Library_UnPackDatLoc' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%Num); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%i1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%i2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%i3); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%i4); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%i5); if (RegCheckErr(RF, RoutineName)) return +end subroutine + subroutine NWTC_Library_CopyModVarType(SrcModVarTypeData, DstModVarTypeData, CtrlCode, ErrStat, ErrMsg) type(ModVarType), intent(in) :: SrcModVarTypeData type(ModVarType), intent(inout) :: DstModVarTypeData @@ -601,68 +697,29 @@ subroutine NWTC_Library_CopyModVarType(SrcModVarTypeData, DstModVarTypeData, Ctr character(*), intent( out) :: ErrMsg integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'NWTC_Library_CopyModVarType' ErrStat = ErrID_None ErrMsg = '' - DstModVarTypeData%Name = SrcModVarTypeData%Name DstModVarTypeData%Field = SrcModVarTypeData%Field DstModVarTypeData%Nodes = SrcModVarTypeData%Nodes DstModVarTypeData%Num = SrcModVarTypeData%Num DstModVarTypeData%Flags = SrcModVarTypeData%Flags DstModVarTypeData%DerivOrder = SrcModVarTypeData%DerivOrder - if (allocated(SrcModVarTypeData%iLoc)) then - LB(1:1) = lbound(SrcModVarTypeData%iLoc) - UB(1:1) = ubound(SrcModVarTypeData%iLoc) - if (.not. allocated(DstModVarTypeData%iLoc)) then - allocate(DstModVarTypeData%iLoc(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModVarTypeData%iLoc.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModVarTypeData%iLoc = SrcModVarTypeData%iLoc - end if - if (allocated(SrcModVarTypeData%iSol)) then - LB(1:1) = lbound(SrcModVarTypeData%iSol) - UB(1:1) = ubound(SrcModVarTypeData%iSol) - if (.not. allocated(DstModVarTypeData%iSol)) then - allocate(DstModVarTypeData%iSol(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModVarTypeData%iSol.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModVarTypeData%iSol = SrcModVarTypeData%iSol - end if - if (allocated(SrcModVarTypeData%iLin)) then - LB(1:1) = lbound(SrcModVarTypeData%iLin) - UB(1:1) = ubound(SrcModVarTypeData%iLin) - if (.not. allocated(DstModVarTypeData%iLin)) then - allocate(DstModVarTypeData%iLin(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModVarTypeData%iLin.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModVarTypeData%iLin = SrcModVarTypeData%iLin - end if - if (allocated(SrcModVarTypeData%iq)) then - LB(1:1) = lbound(SrcModVarTypeData%iq) - UB(1:1) = ubound(SrcModVarTypeData%iq) - if (.not. allocated(DstModVarTypeData%iq)) then - allocate(DstModVarTypeData%iq(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModVarTypeData%iq.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModVarTypeData%iq = SrcModVarTypeData%iq - end if - DstModVarTypeData%iUsr = SrcModVarTypeData%iUsr - DstModVarTypeData%jUsr = SrcModVarTypeData%jUsr - DstModVarTypeData%MeshID = SrcModVarTypeData%MeshID - DstModVarTypeData%Solve = SrcModVarTypeData%Solve + DstModVarTypeData%iLoc = SrcModVarTypeData%iLoc + DstModVarTypeData%iGlu = SrcModVarTypeData%iGlu + DstModVarTypeData%iq = SrcModVarTypeData%iq + DstModVarTypeData%iLB = SrcModVarTypeData%iLB + DstModVarTypeData%iUB = SrcModVarTypeData%iUB + DstModVarTypeData%j = SrcModVarTypeData%j + DstModVarTypeData%k = SrcModVarTypeData%k + DstModVarTypeData%m = SrcModVarTypeData%m + DstModVarTypeData%n = SrcModVarTypeData%n DstModVarTypeData%Perturb = SrcModVarTypeData%Perturb + call NWTC_Library_CopyDatLoc(SrcModVarTypeData%DL, DstModVarTypeData%DL, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstModVarTypeData%Name = SrcModVarTypeData%Name if (allocated(SrcModVarTypeData%LinNames)) then LB(1:1) = lbound(SrcModVarTypeData%LinNames) UB(1:1) = ubound(SrcModVarTypeData%LinNames) @@ -681,21 +738,13 @@ subroutine NWTC_Library_DestroyModVarType(ModVarTypeData, ErrStat, ErrMsg) type(ModVarType), intent(inout) :: ModVarTypeData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'NWTC_Library_DestroyModVarType' ErrStat = ErrID_None ErrMsg = '' - if (allocated(ModVarTypeData%iLoc)) then - deallocate(ModVarTypeData%iLoc) - end if - if (allocated(ModVarTypeData%iSol)) then - deallocate(ModVarTypeData%iSol) - end if - if (allocated(ModVarTypeData%iLin)) then - deallocate(ModVarTypeData%iLin) - end if - if (allocated(ModVarTypeData%iq)) then - deallocate(ModVarTypeData%iq) - end if + call NWTC_Library_DestroyDatLoc(ModVarTypeData%DL, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(ModVarTypeData%LinNames)) then deallocate(ModVarTypeData%LinNames) end if @@ -706,21 +755,23 @@ subroutine NWTC_Library_PackModVarType(RF, Indata) type(ModVarType), intent(in) :: InData character(*), parameter :: RoutineName = 'NWTC_Library_PackModVarType' if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%Name) call RegPack(RF, InData%Field) call RegPack(RF, InData%Nodes) call RegPack(RF, InData%Num) call RegPack(RF, InData%Flags) call RegPack(RF, InData%DerivOrder) - call RegPackAlloc(RF, InData%iLoc) - call RegPackAlloc(RF, InData%iSol) - call RegPackAlloc(RF, InData%iLin) - call RegPackAlloc(RF, InData%iq) - call RegPack(RF, InData%iUsr) - call RegPack(RF, InData%jUsr) - call RegPack(RF, InData%MeshID) - call RegPack(RF, InData%Solve) + call RegPack(RF, InData%iLoc) + call RegPack(RF, InData%iGlu) + call RegPack(RF, InData%iq) + call RegPack(RF, InData%iLB) + call RegPack(RF, InData%iUB) + call RegPack(RF, InData%j) + call RegPack(RF, InData%k) + call RegPack(RF, InData%m) + call RegPack(RF, InData%n) call RegPack(RF, InData%Perturb) + call NWTC_Library_PackDatLoc(RF, InData%DL) + call RegPack(RF, InData%Name) call RegPackAlloc(RF, InData%LinNames) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -733,21 +784,23 @@ subroutine NWTC_Library_UnPackModVarType(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%Name); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Field); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Nodes); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Num); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Flags); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DerivOrder); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%iLoc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%iSol); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%iLin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%iq); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%iUsr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%jUsr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%MeshID); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Solve); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iLoc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iGlu); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iq); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iLB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iUB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%j); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%k); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%m); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%n); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Perturb); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackDatLoc(RF, OutData%DL) ! DL + call RegUnpack(RF, OutData%Name); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%LinNames); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -764,8 +817,9 @@ subroutine NWTC_Library_CopyModVarsType(SrcModVarsTypeData, DstModVarsTypeData, character(*), parameter :: RoutineName = 'NWTC_Library_CopyModVarsType' ErrStat = ErrID_None ErrMsg = '' - DstModVarsTypeData%ModNum = SrcModVarsTypeData%ModNum - DstModVarsTypeData%ModAbbr = SrcModVarsTypeData%ModAbbr + DstModVarsTypeData%Nx = SrcModVarsTypeData%Nx + DstModVarsTypeData%Nu = SrcModVarsTypeData%Nu + DstModVarsTypeData%Ny = SrcModVarsTypeData%Ny if (allocated(SrcModVarsTypeData%x)) then LB(1:1) = lbound(SrcModVarsTypeData%x) UB(1:1) = ubound(SrcModVarsTypeData%x) @@ -814,9 +868,6 @@ subroutine NWTC_Library_CopyModVarsType(SrcModVarsTypeData, DstModVarsTypeData, if (ErrStat >= AbortErrLev) return end do end if - DstModVarsTypeData%Nx = SrcModVarsTypeData%Nx - DstModVarsTypeData%Nu = SrcModVarsTypeData%Nu - DstModVarsTypeData%Ny = SrcModVarsTypeData%Ny end subroutine subroutine NWTC_Library_DestroyModVarsType(ModVarsTypeData, ErrStat, ErrMsg) @@ -866,8 +917,9 @@ subroutine NWTC_Library_PackModVarsType(RF, Indata) integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%ModNum) - call RegPack(RF, InData%ModAbbr) + call RegPack(RF, InData%Nx) + call RegPack(RF, InData%Nu) + call RegPack(RF, InData%Ny) call RegPack(RF, allocated(InData%x)) if (allocated(InData%x)) then call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) @@ -895,9 +947,6 @@ subroutine NWTC_Library_PackModVarsType(RF, Indata) call NWTC_Library_PackModVarType(RF, InData%y(i1)) end do end if - call RegPack(RF, InData%Nx) - call RegPack(RF, InData%Nu) - call RegPack(RF, InData%Ny) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -910,8 +959,9 @@ subroutine NWTC_Library_UnPackModVarsType(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%ModNum); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ModAbbr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Nx); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Nu); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Ny); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -951,287 +1001,452 @@ subroutine NWTC_Library_UnPackModVarsType(RF, OutData) call NWTC_Library_UnpackModVarType(RF, OutData%y(i1)) ! y end do end if - call RegUnpack(RF, OutData%Nx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Nu); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Ny); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine NWTC_Library_CopyModValsType(SrcModValsTypeData, DstModValsTypeData, CtrlCode, ErrStat, ErrMsg) - type(ModValsType), intent(in) :: SrcModValsTypeData - type(ModValsType), intent(inout) :: DstModValsTypeData +subroutine NWTC_Library_CopyModJacType(SrcModJacTypeData, DstModJacTypeData, CtrlCode, ErrStat, ErrMsg) + type(ModJacType), intent(in) :: SrcModJacTypeData + type(ModJacType), intent(inout) :: DstModJacTypeData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 - character(*), parameter :: RoutineName = 'NWTC_Library_CopyModValsType' + character(*), parameter :: RoutineName = 'NWTC_Library_CopyModJacType' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcModValsTypeData%x)) then - LB(1:1) = lbound(SrcModValsTypeData%x) - UB(1:1) = ubound(SrcModValsTypeData%x) - if (.not. allocated(DstModValsTypeData%x)) then - allocate(DstModValsTypeData%x(LB(1):UB(1)), stat=ErrStat2) + DstModJacTypeData%Nx = SrcModJacTypeData%Nx + DstModJacTypeData%Nu = SrcModJacTypeData%Nu + DstModJacTypeData%Ny = SrcModJacTypeData%Ny + if (allocated(SrcModJacTypeData%x)) then + LB(1:1) = lbound(SrcModJacTypeData%x) + UB(1:1) = ubound(SrcModJacTypeData%x) + if (.not. allocated(DstModJacTypeData%x)) then + allocate(DstModJacTypeData%x(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%x.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModJacTypeData%x.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%x = SrcModValsTypeData%x + DstModJacTypeData%x = SrcModJacTypeData%x end if - if (allocated(SrcModValsTypeData%dxdt)) then - LB(1:1) = lbound(SrcModValsTypeData%dxdt) - UB(1:1) = ubound(SrcModValsTypeData%dxdt) - if (.not. allocated(DstModValsTypeData%dxdt)) then - allocate(DstModValsTypeData%dxdt(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcModJacTypeData%u)) then + LB(1:1) = lbound(SrcModJacTypeData%u) + UB(1:1) = ubound(SrcModJacTypeData%u) + if (.not. allocated(DstModJacTypeData%u)) then + allocate(DstModJacTypeData%u(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%dxdt.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModJacTypeData%u.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%dxdt = SrcModValsTypeData%dxdt + DstModJacTypeData%u = SrcModJacTypeData%u end if - if (allocated(SrcModValsTypeData%u)) then - LB(1:1) = lbound(SrcModValsTypeData%u) - UB(1:1) = ubound(SrcModValsTypeData%u) - if (.not. allocated(DstModValsTypeData%u)) then - allocate(DstModValsTypeData%u(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcModJacTypeData%y)) then + LB(1:1) = lbound(SrcModJacTypeData%y) + UB(1:1) = ubound(SrcModJacTypeData%y) + if (.not. allocated(DstModJacTypeData%y)) then + allocate(DstModJacTypeData%y(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%u.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModJacTypeData%y.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%u = SrcModValsTypeData%u + DstModJacTypeData%y = SrcModJacTypeData%y end if - if (allocated(SrcModValsTypeData%y)) then - LB(1:1) = lbound(SrcModValsTypeData%y) - UB(1:1) = ubound(SrcModValsTypeData%y) - if (.not. allocated(DstModValsTypeData%y)) then - allocate(DstModValsTypeData%y(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcModJacTypeData%x_perturb)) then + LB(1:1) = lbound(SrcModJacTypeData%x_perturb) + UB(1:1) = ubound(SrcModJacTypeData%x_perturb) + if (.not. allocated(DstModJacTypeData%x_perturb)) then + allocate(DstModJacTypeData%x_perturb(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%y.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModJacTypeData%x_perturb.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%y = SrcModValsTypeData%y + DstModJacTypeData%x_perturb = SrcModJacTypeData%x_perturb end if - if (allocated(SrcModValsTypeData%u_perturb)) then - LB(1:1) = lbound(SrcModValsTypeData%u_perturb) - UB(1:1) = ubound(SrcModValsTypeData%u_perturb) - if (.not. allocated(DstModValsTypeData%u_perturb)) then - allocate(DstModValsTypeData%u_perturb(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcModJacTypeData%u_perturb)) then + LB(1:1) = lbound(SrcModJacTypeData%u_perturb) + UB(1:1) = ubound(SrcModJacTypeData%u_perturb) + if (.not. allocated(DstModJacTypeData%u_perturb)) then + allocate(DstModJacTypeData%u_perturb(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%u_perturb.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModJacTypeData%u_perturb.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%u_perturb = SrcModValsTypeData%u_perturb + DstModJacTypeData%u_perturb = SrcModJacTypeData%u_perturb end if - if (allocated(SrcModValsTypeData%x_perturb)) then - LB(1:1) = lbound(SrcModValsTypeData%x_perturb) - UB(1:1) = ubound(SrcModValsTypeData%x_perturb) - if (.not. allocated(DstModValsTypeData%x_perturb)) then - allocate(DstModValsTypeData%x_perturb(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcModJacTypeData%x_pos)) then + LB(1:1) = lbound(SrcModJacTypeData%x_pos) + UB(1:1) = ubound(SrcModJacTypeData%x_pos) + if (.not. allocated(DstModJacTypeData%x_pos)) then + allocate(DstModJacTypeData%x_pos(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%x_perturb.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModJacTypeData%x_pos.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%x_perturb = SrcModValsTypeData%x_perturb + DstModJacTypeData%x_pos = SrcModJacTypeData%x_pos end if - if (allocated(SrcModValsTypeData%xp)) then - LB(1:1) = lbound(SrcModValsTypeData%xp) - UB(1:1) = ubound(SrcModValsTypeData%xp) - if (.not. allocated(DstModValsTypeData%xp)) then - allocate(DstModValsTypeData%xp(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcModJacTypeData%x_neg)) then + LB(1:1) = lbound(SrcModJacTypeData%x_neg) + UB(1:1) = ubound(SrcModJacTypeData%x_neg) + if (.not. allocated(DstModJacTypeData%x_neg)) then + allocate(DstModJacTypeData%x_neg(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%xp.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModJacTypeData%x_neg.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%xp = SrcModValsTypeData%xp + DstModJacTypeData%x_neg = SrcModJacTypeData%x_neg end if - if (allocated(SrcModValsTypeData%xn)) then - LB(1:1) = lbound(SrcModValsTypeData%xn) - UB(1:1) = ubound(SrcModValsTypeData%xn) - if (.not. allocated(DstModValsTypeData%xn)) then - allocate(DstModValsTypeData%xn(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcModJacTypeData%y_pos)) then + LB(1:1) = lbound(SrcModJacTypeData%y_pos) + UB(1:1) = ubound(SrcModJacTypeData%y_pos) + if (.not. allocated(DstModJacTypeData%y_pos)) then + allocate(DstModJacTypeData%y_pos(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%xn.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModJacTypeData%y_pos.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%xn = SrcModValsTypeData%xn + DstModJacTypeData%y_pos = SrcModJacTypeData%y_pos end if - if (allocated(SrcModValsTypeData%yp)) then - LB(1:1) = lbound(SrcModValsTypeData%yp) - UB(1:1) = ubound(SrcModValsTypeData%yp) - if (.not. allocated(DstModValsTypeData%yp)) then - allocate(DstModValsTypeData%yp(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcModJacTypeData%y_neg)) then + LB(1:1) = lbound(SrcModJacTypeData%y_neg) + UB(1:1) = ubound(SrcModJacTypeData%y_neg) + if (.not. allocated(DstModJacTypeData%y_neg)) then + allocate(DstModJacTypeData%y_neg(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%yp.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModJacTypeData%y_neg.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%yp = SrcModValsTypeData%yp + DstModJacTypeData%y_neg = SrcModJacTypeData%y_neg + end if +end subroutine + +subroutine NWTC_Library_DestroyModJacType(ModJacTypeData, ErrStat, ErrMsg) + type(ModJacType), intent(inout) :: ModJacTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'NWTC_Library_DestroyModJacType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(ModJacTypeData%x)) then + deallocate(ModJacTypeData%x) + end if + if (allocated(ModJacTypeData%u)) then + deallocate(ModJacTypeData%u) + end if + if (allocated(ModJacTypeData%y)) then + deallocate(ModJacTypeData%y) + end if + if (allocated(ModJacTypeData%x_perturb)) then + deallocate(ModJacTypeData%x_perturb) + end if + if (allocated(ModJacTypeData%u_perturb)) then + deallocate(ModJacTypeData%u_perturb) + end if + if (allocated(ModJacTypeData%x_pos)) then + deallocate(ModJacTypeData%x_pos) + end if + if (allocated(ModJacTypeData%x_neg)) then + deallocate(ModJacTypeData%x_neg) + end if + if (allocated(ModJacTypeData%y_pos)) then + deallocate(ModJacTypeData%y_pos) end if - if (allocated(SrcModValsTypeData%yn)) then - LB(1:1) = lbound(SrcModValsTypeData%yn) - UB(1:1) = ubound(SrcModValsTypeData%yn) - if (.not. allocated(DstModValsTypeData%yn)) then - allocate(DstModValsTypeData%yn(LB(1):UB(1)), stat=ErrStat2) + if (allocated(ModJacTypeData%y_neg)) then + deallocate(ModJacTypeData%y_neg) + end if +end subroutine + +subroutine NWTC_Library_PackModJacType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(ModJacType), intent(in) :: InData + character(*), parameter :: RoutineName = 'NWTC_Library_PackModJacType' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%Nx) + call RegPack(RF, InData%Nu) + call RegPack(RF, InData%Ny) + call RegPackAlloc(RF, InData%x) + call RegPackAlloc(RF, InData%u) + call RegPackAlloc(RF, InData%y) + call RegPackAlloc(RF, InData%x_perturb) + call RegPackAlloc(RF, InData%u_perturb) + call RegPackAlloc(RF, InData%x_pos) + call RegPackAlloc(RF, InData%x_neg) + call RegPackAlloc(RF, InData%y_pos) + call RegPackAlloc(RF, InData%y_neg) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine NWTC_Library_UnPackModJacType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(ModJacType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'NWTC_Library_UnPackModJacType' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%Nx); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Nu); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Ny); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%x); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%u); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%x_perturb); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%u_perturb); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%x_pos); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%x_neg); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y_pos); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y_neg); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine NWTC_Library_CopyModLinType(SrcModLinTypeData, DstModLinTypeData, CtrlCode, ErrStat, ErrMsg) + type(ModLinType), intent(in) :: SrcModLinTypeData + type(ModLinType), intent(inout) :: DstModLinTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'NWTC_Library_CopyModLinType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcModLinTypeData%x)) then + LB(1:1) = lbound(SrcModLinTypeData%x) + UB(1:1) = ubound(SrcModLinTypeData%x) + if (.not. allocated(DstModLinTypeData%x)) then + allocate(DstModLinTypeData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstModLinTypeData%x = SrcModLinTypeData%x + end if + if (allocated(SrcModLinTypeData%dx)) then + LB(1:1) = lbound(SrcModLinTypeData%dx) + UB(1:1) = ubound(SrcModLinTypeData%dx) + if (.not. allocated(DstModLinTypeData%dx)) then + allocate(DstModLinTypeData%dx(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%yn.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%dx.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%yn = SrcModValsTypeData%yn + DstModLinTypeData%dx = SrcModLinTypeData%dx end if - if (allocated(SrcModValsTypeData%dYdx)) then - LB(1:2) = lbound(SrcModValsTypeData%dYdx) - UB(1:2) = ubound(SrcModValsTypeData%dYdx) - if (.not. allocated(DstModValsTypeData%dYdx)) then - allocate(DstModValsTypeData%dYdx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcModLinTypeData%u)) then + LB(1:1) = lbound(SrcModLinTypeData%u) + UB(1:1) = ubound(SrcModLinTypeData%u) + if (.not. allocated(DstModLinTypeData%u)) then + allocate(DstModLinTypeData%u(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%dYdx.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%u.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%dYdx = SrcModValsTypeData%dYdx + DstModLinTypeData%u = SrcModLinTypeData%u end if - if (allocated(SrcModValsTypeData%dXdx)) then - LB(1:2) = lbound(SrcModValsTypeData%dXdx) - UB(1:2) = ubound(SrcModValsTypeData%dXdx) - if (.not. allocated(DstModValsTypeData%dXdx)) then - allocate(DstModValsTypeData%dXdx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcModLinTypeData%y)) then + LB(1:1) = lbound(SrcModLinTypeData%y) + UB(1:1) = ubound(SrcModLinTypeData%y) + if (.not. allocated(DstModLinTypeData%y)) then + allocate(DstModLinTypeData%y(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%dXdx.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%y.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%dXdx = SrcModValsTypeData%dXdx + DstModLinTypeData%y = SrcModLinTypeData%y end if - if (allocated(SrcModValsTypeData%dYdu)) then - LB(1:2) = lbound(SrcModValsTypeData%dYdu) - UB(1:2) = ubound(SrcModValsTypeData%dYdu) - if (.not. allocated(DstModValsTypeData%dYdu)) then - allocate(DstModValsTypeData%dYdu(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcModLinTypeData%J)) then + LB(1:2) = lbound(SrcModLinTypeData%J) + UB(1:2) = ubound(SrcModLinTypeData%J) + if (.not. allocated(DstModLinTypeData%J)) then + allocate(DstModLinTypeData%J(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%dYdu.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%J.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%dYdu = SrcModValsTypeData%dYdu + DstModLinTypeData%J = SrcModLinTypeData%J end if - if (allocated(SrcModValsTypeData%dXdu)) then - LB(1:2) = lbound(SrcModValsTypeData%dXdu) - UB(1:2) = ubound(SrcModValsTypeData%dXdu) - if (.not. allocated(DstModValsTypeData%dXdu)) then - allocate(DstModValsTypeData%dXdu(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcModLinTypeData%dYdx)) then + LB(1:2) = lbound(SrcModLinTypeData%dYdx) + UB(1:2) = ubound(SrcModLinTypeData%dYdx) + if (.not. allocated(DstModLinTypeData%dYdx)) then + allocate(DstModLinTypeData%dYdx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModValsTypeData%dXdu.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%dYdx.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModValsTypeData%dXdu = SrcModValsTypeData%dXdu + DstModLinTypeData%dYdx = SrcModLinTypeData%dYdx + end if + if (allocated(SrcModLinTypeData%dXdx)) then + LB(1:2) = lbound(SrcModLinTypeData%dXdx) + UB(1:2) = ubound(SrcModLinTypeData%dXdx) + if (.not. allocated(DstModLinTypeData%dXdx)) then + allocate(DstModLinTypeData%dXdx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%dXdx.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstModLinTypeData%dXdx = SrcModLinTypeData%dXdx + end if + if (allocated(SrcModLinTypeData%dYdu)) then + LB(1:2) = lbound(SrcModLinTypeData%dYdu) + UB(1:2) = ubound(SrcModLinTypeData%dYdu) + if (.not. allocated(DstModLinTypeData%dYdu)) then + allocate(DstModLinTypeData%dYdu(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%dYdu.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstModLinTypeData%dYdu = SrcModLinTypeData%dYdu + end if + if (allocated(SrcModLinTypeData%dXdu)) then + LB(1:2) = lbound(SrcModLinTypeData%dXdu) + UB(1:2) = ubound(SrcModLinTypeData%dXdu) + if (.not. allocated(DstModLinTypeData%dXdu)) then + allocate(DstModLinTypeData%dXdu(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%dXdu.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstModLinTypeData%dXdu = SrcModLinTypeData%dXdu + end if + if (allocated(SrcModLinTypeData%dXdy)) then + LB(1:2) = lbound(SrcModLinTypeData%dXdy) + UB(1:2) = ubound(SrcModLinTypeData%dXdy) + if (.not. allocated(DstModLinTypeData%dXdy)) then + allocate(DstModLinTypeData%dXdy(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%dXdy.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstModLinTypeData%dXdy = SrcModLinTypeData%dXdy + end if + if (allocated(SrcModLinTypeData%dUdu)) then + LB(1:2) = lbound(SrcModLinTypeData%dUdu) + UB(1:2) = ubound(SrcModLinTypeData%dUdu) + if (.not. allocated(DstModLinTypeData%dUdu)) then + allocate(DstModLinTypeData%dUdu(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%dUdu.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstModLinTypeData%dUdu = SrcModLinTypeData%dUdu + end if + if (allocated(SrcModLinTypeData%dUdy)) then + LB(1:2) = lbound(SrcModLinTypeData%dUdy) + UB(1:2) = ubound(SrcModLinTypeData%dUdy) + if (.not. allocated(DstModLinTypeData%dUdy)) then + allocate(DstModLinTypeData%dUdy(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%dUdy.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstModLinTypeData%dUdy = SrcModLinTypeData%dUdy end if end subroutine -subroutine NWTC_Library_DestroyModValsType(ModValsTypeData, ErrStat, ErrMsg) - type(ModValsType), intent(inout) :: ModValsTypeData +subroutine NWTC_Library_DestroyModLinType(ModLinTypeData, ErrStat, ErrMsg) + type(ModLinType), intent(inout) :: ModLinTypeData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'NWTC_Library_DestroyModValsType' + character(*), parameter :: RoutineName = 'NWTC_Library_DestroyModLinType' ErrStat = ErrID_None ErrMsg = '' - if (allocated(ModValsTypeData%x)) then - deallocate(ModValsTypeData%x) - end if - if (allocated(ModValsTypeData%dxdt)) then - deallocate(ModValsTypeData%dxdt) + if (allocated(ModLinTypeData%x)) then + deallocate(ModLinTypeData%x) end if - if (allocated(ModValsTypeData%u)) then - deallocate(ModValsTypeData%u) + if (allocated(ModLinTypeData%dx)) then + deallocate(ModLinTypeData%dx) end if - if (allocated(ModValsTypeData%y)) then - deallocate(ModValsTypeData%y) + if (allocated(ModLinTypeData%u)) then + deallocate(ModLinTypeData%u) end if - if (allocated(ModValsTypeData%u_perturb)) then - deallocate(ModValsTypeData%u_perturb) + if (allocated(ModLinTypeData%y)) then + deallocate(ModLinTypeData%y) end if - if (allocated(ModValsTypeData%x_perturb)) then - deallocate(ModValsTypeData%x_perturb) + if (allocated(ModLinTypeData%J)) then + deallocate(ModLinTypeData%J) end if - if (allocated(ModValsTypeData%xp)) then - deallocate(ModValsTypeData%xp) + if (allocated(ModLinTypeData%dYdx)) then + deallocate(ModLinTypeData%dYdx) end if - if (allocated(ModValsTypeData%xn)) then - deallocate(ModValsTypeData%xn) + if (allocated(ModLinTypeData%dXdx)) then + deallocate(ModLinTypeData%dXdx) end if - if (allocated(ModValsTypeData%yp)) then - deallocate(ModValsTypeData%yp) + if (allocated(ModLinTypeData%dYdu)) then + deallocate(ModLinTypeData%dYdu) end if - if (allocated(ModValsTypeData%yn)) then - deallocate(ModValsTypeData%yn) + if (allocated(ModLinTypeData%dXdu)) then + deallocate(ModLinTypeData%dXdu) end if - if (allocated(ModValsTypeData%dYdx)) then - deallocate(ModValsTypeData%dYdx) + if (allocated(ModLinTypeData%dXdy)) then + deallocate(ModLinTypeData%dXdy) end if - if (allocated(ModValsTypeData%dXdx)) then - deallocate(ModValsTypeData%dXdx) + if (allocated(ModLinTypeData%dUdu)) then + deallocate(ModLinTypeData%dUdu) end if - if (allocated(ModValsTypeData%dYdu)) then - deallocate(ModValsTypeData%dYdu) - end if - if (allocated(ModValsTypeData%dXdu)) then - deallocate(ModValsTypeData%dXdu) + if (allocated(ModLinTypeData%dUdy)) then + deallocate(ModLinTypeData%dUdy) end if end subroutine -subroutine NWTC_Library_PackModValsType(RF, Indata) +subroutine NWTC_Library_PackModLinType(RF, Indata) type(RegFile), intent(inout) :: RF - type(ModValsType), intent(in) :: InData - character(*), parameter :: RoutineName = 'NWTC_Library_PackModValsType' + type(ModLinType), intent(in) :: InData + character(*), parameter :: RoutineName = 'NWTC_Library_PackModLinType' if (RF%ErrStat >= AbortErrLev) return call RegPackAlloc(RF, InData%x) - call RegPackAlloc(RF, InData%dxdt) + call RegPackAlloc(RF, InData%dx) call RegPackAlloc(RF, InData%u) call RegPackAlloc(RF, InData%y) - call RegPackAlloc(RF, InData%u_perturb) - call RegPackAlloc(RF, InData%x_perturb) - call RegPackAlloc(RF, InData%xp) - call RegPackAlloc(RF, InData%xn) - call RegPackAlloc(RF, InData%yp) - call RegPackAlloc(RF, InData%yn) + call RegPackAlloc(RF, InData%J) call RegPackAlloc(RF, InData%dYdx) call RegPackAlloc(RF, InData%dXdx) call RegPackAlloc(RF, InData%dYdu) call RegPackAlloc(RF, InData%dXdu) + call RegPackAlloc(RF, InData%dXdy) + call RegPackAlloc(RF, InData%dUdu) + call RegPackAlloc(RF, InData%dUdy) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine NWTC_Library_UnPackModValsType(RF, OutData) +subroutine NWTC_Library_UnPackModLinType(RF, OutData) type(RegFile), intent(inout) :: RF - type(ModValsType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'NWTC_Library_UnPackModValsType' + type(ModLinType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'NWTC_Library_UnPackModLinType' integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call RegUnpackAlloc(RF, OutData%x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dxdt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%dx); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%u); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%u_perturb); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%x_perturb); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%xp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%xn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%yp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%yn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%J); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%dYdx); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%dXdx); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%dYdu); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%dXdu); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%dXdy); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%dUdu); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%dUdy); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine NWTC_Library_CopyModDataType(SrcModDataTypeData, DstModDataTypeData, CtrlCode, ErrStat, ErrMsg) @@ -1240,80 +1455,25 @@ subroutine NWTC_Library_CopyModDataType(SrcModDataTypeData, DstModDataTypeData, integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'NWTC_Library_CopyModDataType' ErrStat = ErrID_None ErrMsg = '' - DstModDataTypeData%Idx = SrcModDataTypeData%Idx - DstModDataTypeData%ID = SrcModDataTypeData%ID DstModDataTypeData%Abbr = SrcModDataTypeData%Abbr + DstModDataTypeData%iMod = SrcModDataTypeData%iMod + DstModDataTypeData%ID = SrcModDataTypeData%ID DstModDataTypeData%Ins = SrcModDataTypeData%Ins - DstModDataTypeData%IsTC = SrcModDataTypeData%IsTC - DstModDataTypeData%DT = SrcModDataTypeData%DT + DstModDataTypeData%iRotor = SrcModDataTypeData%iRotor DstModDataTypeData%SubSteps = SrcModDataTypeData%SubSteps - if (allocated(SrcModDataTypeData%ixs)) then - LB(1:2) = lbound(SrcModDataTypeData%ixs) - UB(1:2) = ubound(SrcModDataTypeData%ixs) - if (.not. allocated(DstModDataTypeData%ixs)) then - allocate(DstModDataTypeData%ixs(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModDataTypeData%ixs.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModDataTypeData%ixs = SrcModDataTypeData%ixs - end if - if (allocated(SrcModDataTypeData%ius)) then - LB(1:2) = lbound(SrcModDataTypeData%ius) - UB(1:2) = ubound(SrcModDataTypeData%ius) - if (.not. allocated(DstModDataTypeData%ius)) then - allocate(DstModDataTypeData%ius(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModDataTypeData%ius.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModDataTypeData%ius = SrcModDataTypeData%ius - end if - if (allocated(SrcModDataTypeData%iys)) then - LB(1:2) = lbound(SrcModDataTypeData%iys) - UB(1:2) = ubound(SrcModDataTypeData%iys) - if (.not. allocated(DstModDataTypeData%iys)) then - allocate(DstModDataTypeData%iys(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModDataTypeData%iys.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModDataTypeData%iys = SrcModDataTypeData%iys - end if - DstModDataTypeData%Vars => SrcModDataTypeData%Vars - if (allocated(SrcModDataTypeData%SrcMaps)) then - LB(1:1) = lbound(SrcModDataTypeData%SrcMaps) - UB(1:1) = ubound(SrcModDataTypeData%SrcMaps) - if (.not. allocated(DstModDataTypeData%SrcMaps)) then - allocate(DstModDataTypeData%SrcMaps(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModDataTypeData%SrcMaps.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModDataTypeData%SrcMaps = SrcModDataTypeData%SrcMaps - end if - if (allocated(SrcModDataTypeData%DstMaps)) then - LB(1:1) = lbound(SrcModDataTypeData%DstMaps) - UB(1:1) = ubound(SrcModDataTypeData%DstMaps) - if (.not. allocated(DstModDataTypeData%DstMaps)) then - allocate(DstModDataTypeData%DstMaps(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModDataTypeData%DstMaps.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModDataTypeData%DstMaps = SrcModDataTypeData%DstMaps - end if + DstModDataTypeData%Category = SrcModDataTypeData%Category + DstModDataTypeData%DT = SrcModDataTypeData%DT + call NWTC_Library_CopyModVarsType(SrcModDataTypeData%Vars, DstModDataTypeData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyModLinType(SrcModDataTypeData%Lin, DstModDataTypeData%Lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine NWTC_Library_DestroyModDataType(ModDataTypeData, ErrStat, ErrMsg) @@ -1325,49 +1485,27 @@ subroutine NWTC_Library_DestroyModDataType(ModDataTypeData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'NWTC_Library_DestroyModDataType' ErrStat = ErrID_None ErrMsg = '' - if (allocated(ModDataTypeData%ixs)) then - deallocate(ModDataTypeData%ixs) - end if - if (allocated(ModDataTypeData%ius)) then - deallocate(ModDataTypeData%ius) - end if - if (allocated(ModDataTypeData%iys)) then - deallocate(ModDataTypeData%iys) - end if - nullify(ModDataTypeData%Vars) - if (allocated(ModDataTypeData%SrcMaps)) then - deallocate(ModDataTypeData%SrcMaps) - end if - if (allocated(ModDataTypeData%DstMaps)) then - deallocate(ModDataTypeData%DstMaps) - end if + call NWTC_Library_DestroyModVarsType(ModDataTypeData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModLinType(ModDataTypeData%Lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine NWTC_Library_PackModDataType(RF, Indata) type(RegFile), intent(inout) :: RF type(ModDataType), intent(in) :: InData character(*), parameter :: RoutineName = 'NWTC_Library_PackModDataType' - logical :: PtrInIndex if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%Idx) - call RegPack(RF, InData%ID) call RegPack(RF, InData%Abbr) + call RegPack(RF, InData%iMod) + call RegPack(RF, InData%ID) call RegPack(RF, InData%Ins) - call RegPack(RF, InData%IsTC) - call RegPack(RF, InData%DT) + call RegPack(RF, InData%iRotor) call RegPack(RF, InData%SubSteps) - call RegPackAlloc(RF, InData%ixs) - call RegPackAlloc(RF, InData%ius) - call RegPackAlloc(RF, InData%iys) - call RegPack(RF, associated(InData%Vars)) - if (associated(InData%Vars)) then - call RegPackPointer(RF, c_loc(InData%Vars), PtrInIndex) - if (.not. PtrInIndex) then - call NWTC_Library_PackModVarsType(RF, InData%Vars) - end if - end if - call RegPackAlloc(RF, InData%SrcMaps) - call RegPackAlloc(RF, InData%DstMaps) + call RegPack(RF, InData%Category) + call RegPack(RF, InData%DT) + call NWTC_Library_PackModVarsType(RF, InData%Vars) + call NWTC_Library_PackModLinType(RF, InData%Lin) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1375,42 +1513,116 @@ subroutine NWTC_Library_UnPackModDataType(RF, OutData) type(RegFile), intent(inout) :: RF type(ModDataType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'NWTC_Library_UnPackModDataType' - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - integer(B8Ki) :: PtrIdx - type(c_ptr) :: Ptr if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%Idx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ID); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Abbr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ID); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Ins); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%IsTC); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iRotor); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SubSteps); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%ixs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%ius); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%iys); if (RegCheckErr(RF, RoutineName)) return - if (associated(OutData%Vars)) deallocate(OutData%Vars) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackPointer(RF, Ptr, PtrIdx); if (RegCheckErr(RF, RoutineName)) return - if (c_associated(Ptr)) then - call c_f_pointer(Ptr, OutData%Vars) - else - allocate(OutData%Vars,stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Vars.', RF%ErrStat, RF%ErrMsg, RoutineName) + call RegUnpack(RF, OutData%Category); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars + call NWTC_Library_UnpackModLinType(RF, OutData%Lin) ! Lin +end subroutine + +subroutine NWTC_Library_CopyKdTreeType(SrcKdTreeTypeData, DstKdTreeTypeData, CtrlCode, ErrStat, ErrMsg) + type(KdTreeType), intent(in) :: SrcKdTreeTypeData + type(KdTreeType), intent(inout) :: DstKdTreeTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'NWTC_Library_CopyKdTreeType' + ErrStat = ErrID_None + ErrMsg = '' + DstKdTreeTypeData%NNodes = SrcKdTreeTypeData%NNodes + DstKdTreeTypeData%NDims = SrcKdTreeTypeData%NDims + if (allocated(SrcKdTreeTypeData%Nodes)) then + LB(1:2) = lbound(SrcKdTreeTypeData%Nodes) + UB(1:2) = ubound(SrcKdTreeTypeData%Nodes) + if (.not. allocated(DstKdTreeTypeData%Nodes)) then + allocate(DstKdTreeTypeData%Nodes(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstKdTreeTypeData%Nodes.', ErrStat, ErrMsg, RoutineName) return end if - RF%Pointers(PtrIdx) = c_loc(OutData%Vars) - call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end if - else - OutData%Vars => null() + DstKdTreeTypeData%Nodes = SrcKdTreeTypeData%Nodes + end if + if (allocated(SrcKdTreeTypeData%OriginalIndices)) then + LB(1:1) = lbound(SrcKdTreeTypeData%OriginalIndices) + UB(1:1) = ubound(SrcKdTreeTypeData%OriginalIndices) + if (.not. allocated(DstKdTreeTypeData%OriginalIndices)) then + allocate(DstKdTreeTypeData%OriginalIndices(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstKdTreeTypeData%OriginalIndices.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstKdTreeTypeData%OriginalIndices = SrcKdTreeTypeData%OriginalIndices + end if + if (allocated(SrcKdTreeTypeData%Dimensions)) then + LB(1:1) = lbound(SrcKdTreeTypeData%Dimensions) + UB(1:1) = ubound(SrcKdTreeTypeData%Dimensions) + if (.not. allocated(DstKdTreeTypeData%Dimensions)) then + allocate(DstKdTreeTypeData%Dimensions(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstKdTreeTypeData%Dimensions.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstKdTreeTypeData%Dimensions = SrcKdTreeTypeData%Dimensions + end if +end subroutine + +subroutine NWTC_Library_DestroyKdTreeType(KdTreeTypeData, ErrStat, ErrMsg) + type(KdTreeType), intent(inout) :: KdTreeTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'NWTC_Library_DestroyKdTreeType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(KdTreeTypeData%Nodes)) then + deallocate(KdTreeTypeData%Nodes) + end if + if (allocated(KdTreeTypeData%OriginalIndices)) then + deallocate(KdTreeTypeData%OriginalIndices) + end if + if (allocated(KdTreeTypeData%Dimensions)) then + deallocate(KdTreeTypeData%Dimensions) end if - call RegUnpackAlloc(RF, OutData%SrcMaps); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DstMaps); if (RegCheckErr(RF, RoutineName)) return end subroutine + +subroutine NWTC_Library_PackKdTreeType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(KdTreeType), intent(in) :: InData + character(*), parameter :: RoutineName = 'NWTC_Library_PackKdTreeType' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%NNodes) + call RegPack(RF, InData%NDims) + call RegPackAlloc(RF, InData%Nodes) + call RegPackAlloc(RF, InData%OriginalIndices) + call RegPackAlloc(RF, InData%Dimensions) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine NWTC_Library_UnPackKdTreeType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(KdTreeType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'NWTC_Library_UnPackKdTreeType' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%NNodes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NDims); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Nodes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%OriginalIndices); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Dimensions); if (RegCheckErr(RF, RoutineName)) return +end subroutine + END MODULE NWTC_Library_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/nwtc-library/src/NWTC_Num.f90 b/modules/nwtc-library/src/NWTC_Num.f90 index 5cafdc9498..a0f26777b0 100644 --- a/modules/nwtc-library/src/NWTC_Num.f90 +++ b/modules/nwtc-library/src/NWTC_Num.f90 @@ -80,7 +80,6 @@ MODULE NWTC_Num INTEGER, PARAMETER :: kernelType_TRIWEIGHT = 4 INTEGER, PARAMETER :: kernelType_TRICUBE = 5 INTEGER, PARAMETER :: kernelType_GAUSSIAN = 6 - ! constants for output formats INTEGER, PARAMETER :: Output_in_Native_Units = 0 @@ -1258,26 +1257,18 @@ END FUNCTION DCM_expR !! !! This routine is the inverse of DCM_exp (nwtc_num::dcm_exp). \n !! Use DCM_logMap (nwtc_num::dcm_logmap) instead of directly calling a specific routine in the generic interface. - SUBROUTINE DCM_logMapD(DCM, logMap, ErrStat, ErrMsg, thetaOut) + SUBROUTINE DCM_logMapD(DCM, logMap, thetaOut) REAL(R8Ki), INTENT(IN) :: DCM(3,3) !< the direction cosine matrix, \f$\Lambda\f$ REAL(R8Ki), INTENT( OUT) :: logMap(3) !< vector containing \f$\lambda_1\f$, \f$\lambda_2\f$, and \f$\lambda_3\f$, the unique components of skew-symmetric matrix \f$\lambda\f$ REAL(R8Ki),OPTIONAL,INTENT( OUT) :: thetaOut !< the angle of rotation, \f$\theta\f$; output only for debugging - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ! local variables REAL(R8Ki) :: theta REAL(R8Ki) :: cosTheta REAL(R8Ki) :: TwoSinTheta REAL(R8Ki) :: v(3) REAL(R8Ki) :: divisor - INTEGER(IntKi) :: indx_max - - ! initialization - ErrStat = ErrID_None - ErrMsg = "" - + INTEGER(IntKi) :: indx_max cosTheta = 0.5_DbKi*( trace(DCM) - 1.0_R8Ki ) cosTheta = min( max(cosTheta,-1.0_R8Ki), 1.0_R8Ki ) !make sure it's in a valid range (to avoid cases where this is slightly outside the +/-1 range) @@ -1372,28 +1363,20 @@ SUBROUTINE DCM_logMapD(DCM, logMap, ErrStat, ErrMsg, thetaOut) END SUBROUTINE DCM_logMapD !======================================================================= !> \copydoc nwtc_num::dcm_logmapd - SUBROUTINE DCM_logMapR(DCM, logMap, ErrStat, ErrMsg, thetaOut) + SUBROUTINE DCM_logMapR(DCM, logMap, thetaOut) ! This function computes the logarithmic map for a direction cosine matrix. REAL(SiKi), INTENT(IN) :: DCM(3,3) REAL(SiKi), INTENT( OUT) :: logMap(3) REAL(SiKi),OPTIONAL,INTENT( OUT) :: thetaOut - INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - ! local variables REAL(SiKi) :: cosTheta REAL(SiKi) :: theta REAL(SiKi) :: TwoSinTheta REAL(SiKi) :: v(3) REAL(SiKi) :: divisor INTEGER(IntKi) :: indx_max - - ! initialization - ErrStat = ErrID_None - ErrMsg = "" - cosTheta = 0.5_SiKi*( trace(DCM) - 1.0_SiKi ) cosTheta = min( max(cosTheta,-1.0_SiKi), 1.0_SiKi ) !make sure it's in a valid range (to avoid cases where this is slightly outside the +/-1 range) @@ -1627,7 +1610,7 @@ END SUBROUTINE DCM_SetLogMapForInterpR !! !! Note that the numbers are added together in this routine, so overflow can result if comparing two "huge" numbers. \n !! Use EqualRealNos (nwtc_num::equalrealnos) instead of directly calling a specific routine in the generic interface. - FUNCTION EqualRealNos4 ( ReNum1, ReNum2 ) + PURE FUNCTION EqualRealNos4 ( ReNum1, ReNum2 ) ! passed variables @@ -1661,7 +1644,7 @@ FUNCTION EqualRealNos4 ( ReNum1, ReNum2 ) END FUNCTION EqualRealNos4 !======================================================================= !> \copydoc nwtc_num::equalrealnos4 - FUNCTION EqualRealNos8 ( ReNum1, ReNum2 ) + PURE FUNCTION EqualRealNos8 ( ReNum1, ReNum2 ) ! passed variables @@ -2705,45 +2688,58 @@ FUNCTION GetSmllRotAngsD ( DCMat, ErrStat, ErrMsg ) REAL(DbKi), PARAMETER :: LrgAngle = 0.4_DbKi ! Threshold for when a small angle becomes large (about 23deg). This comes from: COS(SmllAngle) ~ 1/SQRT( 1 + SmllAngle^2 ) and SIN(SmllAngle) ~ SmllAngle/SQRT( 1 + SmllAngle^2 ) results in ~5% error when SmllAngle = 0.4rad. - ! initialize output angles (just in case there is an error that prevents them from getting set) GetSmllRotAngsD = 0.0_DbKi ErrStat = ErrID_None - ErrMsg = "" + IF (PRESENT(ErrMsg)) ErrMsg = "" ! calculate the small angles GetSmllRotAngsD(1) = DCMat(2,3) - DCMat(3,2) GetSmllRotAngsD(2) = DCMat(3,1) - DCMat(1,3) GetSmllRotAngsD(3) = DCMat(1,2) - DCMat(2,1) - denom = DCMat(1,1) + DCMat(2,2) + DCMat(3,3) - 1.0_DbKi - - IF ( .NOT. EqualRealNos( denom, 0.0_DbKi ) ) THEN - GetSmllRotAngsD = GetSmllRotAngsD / denom + denom = DCMat(1,1) + DCMat(2,2) + DCMat(3,3) + 1.0_DbKi - ! check that the angles are, in fact, small - IF ( ANY( ABS(GetSmllRotAngsD) > LrgAngle ) ) THEN - ErrStat = ErrID_Severe + IF (denom < 0.0_DbKi) THEN + + ErrStat = ErrID_Fatal + + IF (PRESENT(ErrMsg)) THEN + ErrMsg = ' Denominator is imaginary in GetSmllRotAngs(). Matrix may not be a valid DCM.' + ELSE + CALL ProgAbort( ' Denominator is imaginary in GetSmllRotAngs(). Matrix may not be a valid DCM.', TrapErrors = .TRUE. ) + END IF + + ELSE + denom = sqrt(denom) + + IF ( EqualRealNos( denom, 0.0_DbKi ) ) THEN + + ErrStat = ErrID_Fatal IF (PRESENT(ErrMsg)) THEN - ErrMsg = ' Angles in GetSmllRotAngs() are larger than '//TRIM(Num2LStr(LrgAngle))//' radians.' + ErrMsg = ' Denominator is zero in GetSmllRotAngs().' ELSE - CALL ProgWarn( ' Angles in GetSmllRotAngs() are larger than '//TRIM(Num2LStr(LrgAngle))//' radians.' ) + CALL ProgAbort( ' Denominator is zero in GetSmllRotAngs().', TrapErrors = .TRUE. ) END IF + + ELSE + GetSmllRotAngsD = GetSmllRotAngsD / denom - END IF + ! check that the angles are, in fact, small + IF ( ANY( ABS(GetSmllRotAngsD) > LrgAngle ) ) THEN + ErrStat = ErrID_Severe - ELSE - ! check that the angles are, in fact, small (denom should be close to 2 if angles are small) - ErrStat = ErrID_Fatal + IF (PRESENT(ErrMsg)) THEN + ErrMsg = ' Angles in GetSmllRotAngs() are larger than '//TRIM(Num2LStr(LrgAngle))//' radians.' + ELSE + CALL ProgWarn( ' Angles in GetSmllRotAngs() are larger than '//TRIM(Num2LStr(LrgAngle))//' radians.' ) + END IF - IF (PRESENT(ErrMsg)) THEN - ErrMsg = ' Denominator is zero in GetSmllRotAngs().' - ELSE - CALL ProgAbort( ' Denominator is zero in GetSmllRotAngs().', TrapErrors = .TRUE. ) + END IF + END IF - END IF @@ -2770,41 +2766,56 @@ FUNCTION GetSmllRotAngsR ( DCMat, ErrStat, ErrMsg ) GetSmllRotAngsR = 0.0_SiKi ErrStat = ErrID_None - ErrMsg = "" + IF (PRESENT(ErrMsg)) ErrMsg = "" ! calculate the small angles GetSmllRotAngsR(1) = DCMat(2,3) - DCMat(3,2) GetSmllRotAngsR(2) = DCMat(3,1) - DCMat(1,3) GetSmllRotAngsR(3) = DCMat(1,2) - DCMat(2,1) - denom = DCMat(1,1) + DCMat(2,2) + DCMat(3,3) - 1.0_SiKi + denom = DCMat(1,1) + DCMat(2,2) + DCMat(3,3) + 1.0_SiKi - IF ( .NOT. EqualRealNos( denom, 0.0_SiKi ) ) THEN - GetSmllRotAngsR = GetSmllRotAngsR / denom - ! check that the angles are, in fact, small - IF ( ANY( ABS(GetSmllRotAngsR) > LrgAngle ) ) THEN - ErrStat = ErrID_Severe + IF (denom < 0.0_SiKi) THEN + + ErrStat = ErrID_Fatal + + IF (PRESENT(ErrMsg)) THEN + ErrMsg = ' Denominator is imaginary in GetSmllRotAngs(). Matrix may not be a valid DCM.' + ELSE + CALL ProgAbort( ' Denominator is imaginary in GetSmllRotAngs(). Matrix may not be a valid DCM.', TrapErrors = .TRUE. ) + END IF + + ELSE + denom = sqrt(denom) + + IF ( EqualRealNos( denom, 0.0_SiKi ) ) THEN + + ErrStat = ErrID_Fatal IF (PRESENT(ErrMsg)) THEN - ErrMsg = ' Angles in GetSmllRotAngs() are larger than '//TRIM(Num2LStr(LrgAngle))//' radians.' + ErrMsg = ' Denominator is zero in GetSmllRotAngs().' ELSE - CALL ProgWarn( ' Angles in GetSmllRotAngs() are larger than '//TRIM(Num2LStr(LrgAngle))//' radians.' ) + CALL ProgAbort( ' Denominator is zero in GetSmllRotAngs().', TrapErrors = .TRUE. ) END IF + + ELSE + GetSmllRotAngsR = GetSmllRotAngsR / denom - END IF + ! check that the angles are, in fact, small + IF ( ANY( ABS(GetSmllRotAngsR) > LrgAngle ) ) THEN + ErrStat = ErrID_Severe - ELSE - ! check that the angles are, in fact, small (denom should be close to 2 if angles are small) - ErrStat = ErrID_Fatal + IF (PRESENT(ErrMsg)) THEN + ErrMsg = ' Angles in GetSmllRotAngs() are larger than '//TRIM(Num2LStr(LrgAngle))//' radians.' + ELSE + CALL ProgWarn( ' Angles in GetSmllRotAngs() are larger than '//TRIM(Num2LStr(LrgAngle))//' radians.' ) + END IF - IF (PRESENT(ErrMsg)) THEN - ErrMsg = ' Denominator is zero in GetSmllRotAngs().' - ELSE - CALL ProgAbort( ' Denominator is zero in GetSmllRotAngs().', TrapErrors = .TRUE. ) + END IF + END IF - - END IF + END IF END FUNCTION GetSmllRotAngsR @@ -5824,6 +5835,8 @@ END SUBROUTINE SimStatus !! below, was derived symbolically by J. Jonkman by computing \f$UV^T\f$ !! by hand with verification in Mathematica. !! +!! Note: this formulation has been updated with new equations from J. Jonkman, derived from +!! using quaternions. It is accurrate longer. !! This routine is the inverse of GetSmllRotAngs (nwtc_num::getsmllrotangs). \n !! Use SmllRotTrans (nwtc_num::smllrottrans) instead of directly calling a specific routine in the generic interface. SUBROUTINE SmllRotTransD( RotationType, Theta1, Theta2, Theta3, TransMat, ErrTxt, ErrStat, ErrMsg ) @@ -5842,18 +5855,15 @@ SUBROUTINE SmllRotTransD( RotationType, Theta1, Theta2, Theta3, TransMat, ErrTxt CHARACTER(*), INTENT(IN ), OPTIONAL :: ErrTxt !< an additional message to be displayed as a warning (typically the simulation time) ! Local Variables: + REAL(DbKi) :: Half_1 ! = Theta1/2 + REAL(DbKi) :: Half_2 ! = Theta2/2 + REAL(DbKi) :: Half_3 ! = Theta3/2 + REAL(DbKi) :: Theta1Sq ! = Theta1^2 + REAL(DbKi) :: Theta2Sq ! = Theta2^2 + REAL(DbKi) :: Theta3Sq ! = Theta3^2 + REAL(DbKi) :: w ! = sqrt( 1 - Theta1^2/4 - Theta2^2/4 - Theta3^2/4) - REAL(DbKi) :: ComDenom ! = ( Theta1^2 + Theta2^2 + Theta3^2 )*SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) REAL(DbKi), PARAMETER :: LrgAngle = 0.4 ! Threshold for when a small angle becomes large (about 23deg). This comes from: COS(SmllAngle) ~ 1/SQRT( 1 + SmllAngle^2 ) and SIN(SmllAngle) ~ SmllAngle/SQRT( 1 + SmllAngle^2 ) results in ~5% error when SmllAngle = 0.4rad. - REAL(DbKi) :: Theta11 ! = Theta1^2 - REAL(DbKi) :: Theta12S ! = Theta1*Theta2*[ SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) - 1.0 ] - REAL(DbKi) :: Theta13S ! = Theta1*Theta3*[ SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) - 1.0 ] - REAL(DbKi) :: Theta22 ! = Theta2^2 - REAL(DbKi) :: Theta23S ! = Theta2*Theta3*[ SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) - 1.0 ] - REAL(DbKi) :: Theta33 ! = Theta3^2 - REAL(DbKi) :: SqrdSum ! = Theta1^2 + Theta2^2 + Theta3^2 - REAL(DbKi) :: SQRT1SqrdSum ! = SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) - LOGICAL, SAVE :: FrstWarn = .TRUE. ! When .TRUE., indicates that we're on the first warning. @@ -5881,41 +5891,28 @@ SUBROUTINE SmllRotTransD( RotationType, Theta1, Theta2, Theta3, TransMat, ErrTxt ! Compute some intermediate results: - Theta11 = Theta1*Theta1 - Theta22 = Theta2*Theta2 - Theta33 = Theta3*Theta3 + Theta1Sq = Theta1*Theta1 + Theta2Sq = Theta2*Theta2 + Theta3Sq = Theta3*Theta3 - SqrdSum = Theta11 + Theta22 + Theta33 - SQRT1SqrdSum = SQRT( 1.0_DbKi + SqrdSum ) - ComDenom = SqrdSum*SQRT1SqrdSum - - Theta12S = Theta1*Theta2*( SQRT1SqrdSum - 1.0_DbKi ) - Theta13S = Theta1*Theta3*( SQRT1SqrdSum - 1.0_DbKi ) - Theta23S = Theta2*Theta3*( SQRT1SqrdSum - 1.0_DbKi ) + Half_1 = Theta1 * 0.5_DbKi + Half_2 = Theta2 * 0.5_DbKi + Half_3 = Theta3 * 0.5_DbKi + w = SQRT( 1.0_DbKi - Half_1**2 - Half_2**2 - Half_3**2 ) ! Define the transformation matrix: + TransMat(1,1) = 1.0_DbKi - (Theta2Sq + Theta3Sq) * 0.5_DbKi + TransMat(2,1) = Theta1*Half_2 - Theta3*w + TransMat(3,1) = Theta1*Half_3 + Theta2*w - IF ( ComDenom == 0.0_DbKi ) THEN ! All angles are zero and matrix is ill-conditioned (the matrix is derived assuming that the angles are not zero); return identity - - TransMat(1,:) = (/ 1.0_DbKi, 0.0_DbKi, 0.0_DbKi /) - TransMat(2,:) = (/ 0.0_DbKi, 1.0_DbKi, 0.0_DbKi /) - TransMat(3,:) = (/ 0.0_DbKi, 0.0_DbKi, 1.0_DbKi /) - - ELSE ! At least one angle is nonzero - - TransMat(1,1) = ( Theta11*SQRT1SqrdSum + Theta22 + Theta33 )/ComDenom - TransMat(2,2) = ( Theta11 + Theta22*SQRT1SqrdSum + Theta33 )/ComDenom - TransMat(3,3) = ( Theta11 + Theta22 + Theta33*SQRT1SqrdSum )/ComDenom - TransMat(1,2) = ( Theta3*SqrdSum + Theta12S )/ComDenom - TransMat(2,1) = ( -Theta3*SqrdSum + Theta12S )/ComDenom - TransMat(1,3) = ( -Theta2*SqrdSum + Theta13S )/ComDenom - TransMat(3,1) = ( Theta2*SqrdSum + Theta13S )/ComDenom - TransMat(2,3) = ( Theta1*SqrdSum + Theta23S )/ComDenom - TransMat(3,2) = ( -Theta1*SqrdSum + Theta23S )/ComDenom - - ENDIF + TransMat(1,2) = Theta1*Half_2 + Theta3*w + TransMat(2,2) = 1.0_DbKi - (Theta1Sq + Theta3Sq) * 0.5_DbKi + TransMat(3,2) = Theta2*Half_3 - Theta1*w + TransMat(1,3) = Theta1*Half_3 - Theta2*w + TransMat(2,3) = Theta2*Half_3 + Theta1*w + TransMat(3,3) = 1.0_DbKi - (Theta1Sq + Theta2Sq) * 0.5_DbKi RETURN END SUBROUTINE SmllRotTransD @@ -5923,43 +5920,6 @@ END SUBROUTINE SmllRotTransD !> \copydoc nwtc_num::smllrottransd SUBROUTINE SmllRotTransR( RotationType, Theta1, Theta2, Theta3, TransMat, ErrTxt, ErrStat, ErrMsg ) - - ! This routine computes the 3x3 transformation matrix, TransMat, - ! to a coordinate system x (with orthogonal axes x1, x2, x3) - ! resulting from three rotations (Theta1, Theta2, Theta3) about the - ! orthogonal axes (X1, X2, X3) of coordinate system X. All angles - ! are assummed to be small, as such, the order of rotations does - ! not matter and Euler angles do not need to be used. This routine - ! is used to compute the transformation matrix (TransMat) between - ! undeflected (X) and deflected (x) coordinate systems. In matrix - ! form: - ! {x1} [TransMat(Theta1, ] {X1} - ! {x2} = [ Theta2, ]*{X2} - ! {x3} [ Theta3 )] {X3} - ! - ! The transformation matrix, TransMat, is the closest orthonormal - ! matrix to the nonorthonormal, but skew-symmetric, Bernoulli-Euler - ! matrix: - ! [ 1.0 Theta3 -Theta2 ] - ! A = [ -Theta3 1.0 Theta1 ] - ! [ Theta2 -Theta1 1.0 ] - ! - ! In the Frobenius Norm sense, the closest orthornormal matrix is: - ! TransMat = U*V^T, - ! - ! where the columns of U contain the eigenvectors of A*A^T and the - ! columns of V contain the eigenvectors of A^T*A (^T = transpose). - ! This result comes directly from the Singular Value Decomposition - ! (SVD) of A = U*S*V^T where S is a diagonal matrix containing the - ! singular values of A, which are SQRT( eigenvalues of A*A^T ) = - ! SQRT( eigenvalues of A^T*A ). - ! - ! The algebraic form of the transformation matrix, as implemented - ! below, was derived symbolically by J. Jonkman by computing U*V^T - ! by hand with verification in Mathematica. - ! - ! This routine is the inverse of GetSmllRotAngs() - ! Passed Variables: REAL(SiKi), INTENT(IN ) :: Theta1 ! The small rotation about X1, (rad). @@ -5974,18 +5934,15 @@ SUBROUTINE SmllRotTransR( RotationType, Theta1, Theta2, Theta3, TransMat, ErrTxt CHARACTER(*), INTENT(IN ), OPTIONAL :: ErrTxt ! an additional message to be displayed as a warning (typically the simulation time) ! Local Variables: + REAL(SiKi) :: Half_1 ! = Theta1/2 + REAL(SiKi) :: Half_2 ! = Theta2/2 + REAL(SiKi) :: Half_3 ! = Theta3/2 + REAL(SiKi) :: Theta1Sq ! = Theta1^2 + REAL(SiKi) :: Theta2Sq ! = Theta2^2 + REAL(SiKi) :: Theta3Sq ! = Theta3^2 + REAL(SiKi) :: w ! = sqrt( 1 - Theta1^2/4 - Theta2^2/4 - Theta3^2/4) - REAL(SiKi) :: ComDenom ! = ( Theta1^2 + Theta2^2 + Theta3^2 )*SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) REAL(SiKi), PARAMETER :: LrgAngle = 0.4 ! Threshold for when a small angle becomes large (about 23deg). This comes from: COS(SmllAngle) ~ 1/SQRT( 1 + SmllAngle^2 ) and SIN(SmllAngle) ~ SmllAngle/SQRT( 1 + SmllAngle^2 ) results in ~5% error when SmllAngle = 0.4rad. - REAL(SiKi) :: Theta11 ! = Theta1^2 - REAL(SiKi) :: Theta12S ! = Theta1*Theta2*[ SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) - 1.0 ] - REAL(SiKi) :: Theta13S ! = Theta1*Theta3*[ SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) - 1.0 ] - REAL(SiKi) :: Theta22 ! = Theta2^2 - REAL(SiKi) :: Theta23S ! = Theta2*Theta3*[ SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) - 1.0 ] - REAL(SiKi) :: Theta33 ! = Theta3^2 - REAL(SiKi) :: SqrdSum ! = Theta1^2 + Theta2^2 + Theta3^2 - REAL(SiKi) :: SQRT1SqrdSum ! = SQRT( 1.0 + Theta1^2 + Theta2^2 + Theta3^2 ) - LOGICAL, SAVE :: FrstWarn = .TRUE. ! When .TRUE., indicates that we're on the first warning. @@ -6013,41 +5970,28 @@ SUBROUTINE SmllRotTransR( RotationType, Theta1, Theta2, Theta3, TransMat, ErrTxt ! Compute some intermediate results: - Theta11 = Theta1*Theta1 - Theta22 = Theta2*Theta2 - Theta33 = Theta3*Theta3 - - SqrdSum = Theta11 + Theta22 + Theta33 - SQRT1SqrdSum = SQRT( 1.0_ReKi + SqrdSum ) - ComDenom = SqrdSum*SQRT1SqrdSum + Theta1Sq = Theta1*Theta1 + Theta2Sq = Theta2*Theta2 + Theta3Sq = Theta3*Theta3 - Theta12S = Theta1*Theta2*( SQRT1SqrdSum - 1.0_Siki ) - Theta13S = Theta1*Theta3*( SQRT1SqrdSum - 1.0_Siki ) - Theta23S = Theta2*Theta3*( SQRT1SqrdSum - 1.0_Siki ) + Half_1 = Theta1 * 0.5_SiKi + Half_2 = Theta2 * 0.5_SiKi + Half_3 = Theta3 * 0.5_SiKi + w = SQRT( 1.0_SiKi - Half_1**2 - Half_2**2 - Half_3**2 ) ! Define the transformation matrix: + TransMat(1,1) = 1.0_SiKi - (Theta2Sq + Theta3Sq) * 0.5_SiKi + TransMat(2,1) = Theta1*Half_2 - Theta3*w + TransMat(3,1) = Theta1*Half_3 + Theta2*w - IF ( ComDenom == 0.0_ReKi ) THEN ! All angles are zero and matrix is ill-conditioned (the matrix is derived assuming that the angles are not zero); return identity - - TransMat(1,:) = (/ 1.0_SiKi, 0.0_SiKi, 0.0_SiKi /) - TransMat(2,:) = (/ 0.0_SiKi, 1.0_SiKi, 0.0_SiKi /) - TransMat(3,:) = (/ 0.0_SiKi, 0.0_SiKi, 1.0_SiKi /) - - ELSE ! At least one angle is nonzero - - TransMat(1,1) = ( Theta11*SQRT1SqrdSum + Theta22 + Theta33 )/ComDenom - TransMat(2,2) = ( Theta11 + Theta22*SQRT1SqrdSum + Theta33 )/ComDenom - TransMat(3,3) = ( Theta11 + Theta22 + Theta33*SQRT1SqrdSum )/ComDenom - TransMat(1,2) = ( Theta3*SqrdSum + Theta12S )/ComDenom - TransMat(2,1) = ( -Theta3*SqrdSum + Theta12S )/ComDenom - TransMat(1,3) = ( -Theta2*SqrdSum + Theta13S )/ComDenom - TransMat(3,1) = ( Theta2*SqrdSum + Theta13S )/ComDenom - TransMat(2,3) = ( Theta1*SqrdSum + Theta23S )/ComDenom - TransMat(3,2) = ( -Theta1*SqrdSum + Theta23S )/ComDenom - - ENDIF + TransMat(1,2) = Theta1*Half_2 + Theta3*w + TransMat(2,2) = 1.0_SiKi - (Theta1Sq + Theta3Sq) * 0.5_SiKi + TransMat(3,2) = Theta2*Half_3 - Theta1*w + TransMat(1,3) = Theta1*Half_3 - Theta2*w + TransMat(2,3) = Theta2*Half_3 + Theta1*w + TransMat(3,3) = 1.0_SiKi - (Theta1Sq + Theta2Sq) * 0.5_SiKi RETURN END SUBROUTINE SmllRotTransR @@ -6179,7 +6123,7 @@ END FUNCTION StdDevFn !! \end{bmatrix} !! \f} !> Use SkewSymMat (nwtc_num::skewsymmat) instead of directly calling a specific routine in the generic interface. - FUNCTION SkewSymMatR4 ( x ) RESULT(M) + pure FUNCTION SkewSymMatR4 ( x ) RESULT(M) ! Function arguments @@ -6202,7 +6146,7 @@ FUNCTION SkewSymMatR4 ( x ) RESULT(M) END FUNCTION SkewSymMatR4 !======================================================================= !> \copydoc nwtc_num::skewsymmatr4 - FUNCTION SkewSymMatR8 ( x ) RESULT(M) + pure FUNCTION SkewSymMatR8 ( x ) RESULT(M) ! Function arguments @@ -7294,5 +7238,184 @@ SUBROUTINE fZero_R8(x, f, roots, nZeros, Period) end if END SUBROUTINE fZero_R8 +!======================================================================= + ! Copy of EigenSolve from SubDyn, migrated here to use for beamdyn modal damping. + !> Return eigenvalues, Omega, and eigenvectors + SUBROUTINE EigenSolve(K, M, N, bCheckSingularity, EigVect, Omega, ErrStat, ErrMsg ) + USE NWTC_LAPACK, only: LAPACK_ggev + + INTEGER , INTENT(IN ) :: N !< Number of degrees of freedom, size of M and K + REAL(R8Ki), INTENT(INOUT) :: K(N, N) !< Stiffness matrix + REAL(R8Ki), INTENT(INOUT) :: M(N, N) !< Mass matrix + LOGICAL, INTENT(IN ) :: bCheckSingularity ! If True, the solver will fail if rigid modes are present + REAL(R8Ki), INTENT(INOUT) :: EigVect(N, N) !< Returned Eigenvectors + REAL(R8Ki), INTENT(INOUT) :: Omega(N) !< Returned Eigenvalues + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + ! LOCALS + REAL(R8Ki), ALLOCATABLE :: WORK (:), VL(:,:), AlphaR(:), AlphaI(:), BETA(:) ! eigensolver variables + INTEGER :: i + INTEGER :: LWORK !variables for the eigensolver + INTEGER, ALLOCATABLE :: KEY(:) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + REAL(R8Ki) :: normA + REAL(R8Ki) :: Omega2(N) !< Squared eigenvalues + REAL(R8Ki), parameter :: MAX_EIGENVALUE = HUGE(1.0_ReKi) ! To avoid overflow when switching to ReKi + + ErrStat = ErrID_None + ErrMsg = '' + + ! allocate working arrays and return arrays for the eigensolver + LWORK=8*N + 16 !this is what the eigensolver wants >> bjj: +16 because of MKL ?ggev documenation ( "lwork >= max(1, 8n+16) for real flavors"), though LAPACK documenation says 8n is fine + !bjj: there seems to be a memory problem in *GGEV, so I'm making the WORK array larger to see if I can figure it out + CALL AllocAry( Work, LWORK, 'Work', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') + CALL AllocAry( AlphaR, N, 'AlphaR', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') + CALL AllocAry( AlphaI, N, 'AlphaI', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') + CALL AllocAry( Beta, N, 'Beta', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') + CALL AllocAry( VL, N, N, 'VL', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') + CALL AllocAry( KEY, N, 'KEY', ErrStat2, ErrMsg2 ); if(Failed()) return + + ! --- Eigenvalue analysis + ! note: SGGEV seems to have memory issues in certain cases. The eigenvalues seem to be okay, but the eigenvectors vary wildly with different compiling options. + ! DGGEV seems to work better, so I'm making these variables R8Ki (which is set to R8Ki for now) - bjj 4/25/2014 + ! bjj: This comes from the LAPACK documentation: + ! Note: the quotients AlphaR(j)/BETA(j) and AlphaI(j)/BETA(j) may easily over- or underflow, and BETA(j) may even be zero. + ! Thus, the user should avoid naively computing the ratio Alpha/beta. However, AlphaR and AlphaI will be always less + ! than and usually comparable with norm(A) in magnitude, and BETA always less than and usually comparable with norm(B). + ! Omega2=AlphaR/BETA !Note this may not be correct if AlphaI<>0 and/or BETA=0 TO INCLUDE ERROR CHECK, also they need to be sorted + CALL LAPACK_ggev('N','V',N ,K, M, AlphaR, AlphaI, Beta, VL, EigVect, WORK, LWORK, ErrStat2, ErrMsg2) + if(Failed()) return + + ! --- Determining and sorting eigen frequencies + Omega2(:) =0.0_R8Ki + DO I=1,N !Initialize the key and calculate Omega + KEY(I)=I + !Omega2(I) = AlphaR(I)/Beta(I) + if ( EqualRealNos(real(Beta(I),ReKi),0.0_ReKi) ) then + ! --- Beta =0 + if (bCheckSingularity) call WrScr('[WARN] Large eigenvalue found, system may be ill-conditioned') + Omega2(I) = MAX_EIGENVALUE + elseif ( EqualRealNos(real(AlphaI(I),ReKi),0.0_ReKi) ) THEN + ! --- Real Eigenvalues + IF ( AlphaR(I)<0.0_R8Ki ) THEN + if ( (AlphaR(I)/Beta(I))<1e-6_R8Ki ) then + ! Tolerating very small negative eigenvalues + if (bCheckSingularity) call WrScr('[INFO] Negative eigenvalue found with small norm (system may contain rigid body mode)') + Omega2(I)=0.0_R8Ki + else + if (bCheckSingularity) call WrScr('[WARN] Negative eigenvalue found, system may be ill-conditioned.') + Omega2(I)=AlphaR(I)/Beta(I) + endif + else + Omega2(I) = AlphaR(I)/Beta(I) + endif + else + ! --- Complex Eigenvalues + normA = sqrt(AlphaR(I)**2 + AlphaI(I)**2) + if ( (normA/Beta(I))<1e-6_R8Ki ) then + ! Tolerating very small eigenvalues with imaginary part + if (bCheckSingularity) call WrScr('[WARN] Complex eigenvalue found with small norm, approximating as 0') + Omega2(I) = 0.0_R8Ki + elseif ( abs(AlphaR(I))>1e3_R8Ki*abs(AlphaI(I)) ) then + ! Tolerating very small imaginary part compared to real part... (not pretty) + if (bCheckSingularity) call WrScr('[WARN] Complex eigenvalue found with small Im compare to Re') + Omega2(I) = AlphaR(I)/Beta(I) + else + if (bCheckSingularity) call WrScr('[WARN] Complex eigenvalue found with large imaginary value)') + Omega2(I) = MAX_EIGENVALUE + endif + !call Fatal('Complex eigenvalue found, system may be ill-conditioned'); return + endif + ! Capping to avoid overflow + if (Omega2(I)> MAX_EIGENVALUE) then + Omega2(I) = MAX_EIGENVALUE + endif + enddo + + ! Sorting. LASRT has issues for double precision 64 bit on windows + !CALL ScaLAPACK_LASRT('I',N,Omega2,KEY,ErrStat2,ErrMsg2); if(Failed()) return + CALL sort_in_place(Omega2,KEY) + + ! --- Sorting eigen vectors + ! KEEP ME: scaling of the eigenvectors using generalized mass =identity criterion + ! ALLOCATE(normcoeff(N,N), STAT = ErrStat ) + ! result1 = matmul(M,EigVect) + ! result2 = matmul(transpose(EigVect),result1) + ! normcoeff=sqrt(result2) !This should be a diagonal matrix which contains the normalization factors + ! normcoeff=sqrt(matmul(transpose(EigVect),matmul(M,EigVect))) !This should be a diagonal matrix which contains the normalization factors + VL=EigVect !temporary storage for sorting EigVect + DO I=1,N + !EigVect(:,I)=VL(:,KEY(I))/normcoeff(KEY(I),KEY(I)) !reordered and normalized + EigVect(:,I)=VL(:,KEY(I)) !just reordered as Huimin had a normalization outside of this one + ENDDO + !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! + + ! --- Return Omega (capped by huge(ReKi)) and check for singularity + Omega(:) = 0.0_R8Ki + do I=1,N + if (EqualRealNos(real(Omega2(I),ReKi), 0.0_ReKi)) then ! NOTE: may be necessary for some corner numerics + Omega(i)=0.0_R8Ki + if (bCheckSingularity) then + call Fatal('Zero eigenvalue found, system may contain rigid body mode'); return + endif + elseif (Omega2(I)>0) then + Omega(i)=sqrt(Omega2(I)) + else + ! Negative eigenfrequency + print*,'>>> Wrong eigenfrequency, Omega^2=',Omega2(I) ! <<< This should never happen + Omega(i)= 0.0_R8Ki + call Fatal('Negative eigenvalue found, system may be ill-conditioned'); return + endif + enddo + + CALL CleanupEigen() + RETURN + + CONTAINS + LOGICAL FUNCTION Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'EigenSolve') + Failed = ErrStat >= AbortErrLev + if (Failed) call CleanUpEigen() + END FUNCTION Failed + + SUBROUTINE Fatal(ErrMsg_in) + character(len=*), intent(in) :: ErrMsg_in + CALL SetErrStat(ErrID_Fatal, ErrMsg_in, ErrStat, ErrMsg, 'EigenSolve'); + CALL CleanUpEigen() + END SUBROUTINE Fatal + + SUBROUTINE CleanupEigen() + IF (ALLOCATED(Work) ) DEALLOCATE(Work) + IF (ALLOCATED(AlphaR)) DEALLOCATE(AlphaR) + IF (ALLOCATED(AlphaI)) DEALLOCATE(AlphaI) + IF (ALLOCATED(Beta) ) DEALLOCATE(Beta) + IF (ALLOCATED(VL) ) DEALLOCATE(VL) + IF (ALLOCATED(KEY) ) DEALLOCATE(KEY) + END SUBROUTINE CleanupEigen + + pure subroutine sort_in_place(a,key) + real(R8Ki), intent(inout), dimension(:) :: a + integer(IntKi), intent(inout), dimension(:) :: key + integer(IntKi) :: tempI + real(R8Ki) :: temp + integer(IntKi) :: i, j + do i = 2, size(a) + j = i - 1 + temp = a(i) + tempI = key(i) + do while (j>=1 .and. a(j)>temp) + a(j+1) = a(j) + key(j+1) = key(j) + j = j - 1 + if (j<1) then + exit + endif + end do + a(j+1) = temp + key(j+1) = tempI + end do + end subroutine sort_in_place + END SUBROUTINE EigenSolve !======================================================================= END MODULE NWTC_Num diff --git a/modules/nwtc-library/src/NetLib/lapack/NWTC_LAPACK.f90 b/modules/nwtc-library/src/NetLib/lapack/NWTC_LAPACK.f90 index 3561c98162..eafe4f583c 100644 --- a/modules/nwtc-library/src/NetLib/lapack/NWTC_LAPACK.f90 +++ b/modules/nwtc-library/src/NetLib/lapack/NWTC_LAPACK.f90 @@ -580,7 +580,6 @@ SUBROUTINE LAPACK_SGEMM( TRANSA, TRANSB, ALPHA, A, B, BETA, C, ErrStat, ErrMsg ) END IF ErrStat = ErrID_None - ErrMsg = "" IF ( K /= Kb ) THEN diff --git a/modules/nwtc-library/src/NetLib/slatec/xermsg.f b/modules/nwtc-library/src/NetLib/slatec/xermsg.f index 46c83ec07a..304d225af0 100644 --- a/modules/nwtc-library/src/NetLib/slatec/xermsg.f +++ b/modules/nwtc-library/src/NetLib/slatec/xermsg.f @@ -185,9 +185,9 @@ SUBROUTINE XERMSG (LIBRAR, SUBROU, MESSG, NERR, LEVEL) C 920501 Reformatted the REFERENCES section. (WRB) C***END PROLOGUE XERMSG CHARACTER*(*) LIBRAR, SUBROU, MESSG - CHARACTER*8 XLIBR, XSUBR - CHARACTER*72 TEMP - CHARACTER*20 LFIRST + CHARACTER(len=8) XLIBR, XSUBR + CHARACTER(len=72) TEMP + CHARACTER(len=20) LFIRST C***FIRST EXECUTABLE STATEMENT XERMSG LKNTRL = J4SAVE (2, 0, .FALSE.) MAXMES = J4SAVE (4, 0, .FALSE.) diff --git a/modules/nwtc-library/src/NetLib/slatec/xerprn.f b/modules/nwtc-library/src/NetLib/slatec/xerprn.f index 97eedf480f..f321f7d35c 100644 --- a/modules/nwtc-library/src/NetLib/slatec/xerprn.f +++ b/modules/nwtc-library/src/NetLib/slatec/xerprn.f @@ -76,9 +76,9 @@ SUBROUTINE XERPRN (PREFIX, NPREF, MESSG, NWRAP) C***END PROLOGUE XERPRN CHARACTER*(*) PREFIX, MESSG INTEGER NPREF, NWRAP - CHARACTER*148 CBUFF + CHARACTER(len=148) CBUFF INTEGER IU(5), NUNIT - CHARACTER*2 NEWLIN + CHARACTER(len=2) NEWLIN PARAMETER (NEWLIN = '$$') C***FIRST EXECUTABLE STATEMENT XERPRN CALL XGETUA(IU,NUNIT) diff --git a/modules/nwtc-library/src/NetLib/slatec/xersve.f b/modules/nwtc-library/src/NetLib/slatec/xersve.f index 6bd2a4f7ad..e67032a7e3 100644 --- a/modules/nwtc-library/src/NetLib/slatec/xersve.f +++ b/modules/nwtc-library/src/NetLib/slatec/xersve.f @@ -60,8 +60,8 @@ SUBROUTINE XERSVE (LIBRAR, SUBROU, MESSG, KFLAG, NERR, LEVEL, PARAMETER (LENTAB=10) INTEGER LUN(5) CHARACTER*(*) LIBRAR, SUBROU, MESSG - CHARACTER*8 LIBTAB(LENTAB), SUBTAB(LENTAB), LIB, SUB - CHARACTER*20 MESTAB(LENTAB), MES + CHARACTER(len=8) LIBTAB(LENTAB), SUBTAB(LENTAB), LIB, SUB + CHARACTER(len=20) MESTAB(LENTAB), MES DIMENSION NERTAB(LENTAB), LEVTAB(LENTAB), KOUNT(LENTAB) SAVE LIBTAB, SUBTAB, MESTAB, NERTAB, LEVTAB, KOUNT, KOUNTX, NMSG DATA KOUNTX/0/, NMSG/0/ diff --git a/modules/nwtc-library/src/Registry_NWTC_Library.txt b/modules/nwtc-library/src/Registry_NWTC_Library.txt index a4cd50c404..4dd2cb1960 100644 --- a/modules/nwtc-library/src/Registry_NWTC_Library.txt +++ b/modules/nwtc-library/src/Registry_NWTC_Library.txt @@ -45,83 +45,115 @@ typedef ^ ^ CHARACTER(6) RNG_type param ^ - IntKi VarNameLen - 64 - "" - -param ^ - IntKi VF_Force - 1 - "" - -param ^ - IntKi VF_Moment - 2 - "" - -param ^ - IntKi VF_Orientation - 3 - "" - -param ^ - IntKi VF_TransDisp - 4 - "" - -param ^ - IntKi VF_AngularDisp - 5 - "" - -param ^ - IntKi VF_TransVel - 6 - "" - -param ^ - IntKi VF_AngularVel - 7 - "" - -param ^ - IntKi VF_TransAcc - 8 - "" - -param ^ - IntKi VF_AngularAcc - 9 - "" - -param ^ - IntKi VF_Scalar - 10 - "" - - -param ^ - IntKi VF_None - 0 - "Variable with no flags" - -param ^ - IntKi VF_Mesh - 1 - "Variable contained in mesh" - -param ^ - IntKi VF_Line - 2 - "Variable is for a line mesh" - -param ^ - IntKi VF_RotFrame - 4 - "Variable in rotating frame" - -param ^ - IntKi VF_Ext - 8 - "Variable for extended linearization" - -param ^ - IntKi VF_Any - 4095 - "Enable all flags (used for filtering)" - - -param ^ - IntKi VC_None - 0 - "" - -param ^ - IntKi VC_Tight - 1 - "" - -param ^ - IntKi VC_Option1 - 2 - "" - -param ^ - IntKi VC_Option2 - 3 - "" - - -typedef ^ ModVarType character(VarNameLen) Name - - - "" - -typedef ^ ^ IntKi Field - 0 - "" - +param ^ - IntKi FieldForce - 1 - "" - +param ^ - IntKi FieldMoment - 2 - "" - +param ^ - IntKi FieldOrientation - 3 - "" - +param ^ - IntKi FieldTransDisp - 4 - "" - +param ^ - IntKi FieldTransVel - 5 - "" - +param ^ - IntKi FieldAngularVel - 6 - "" - +param ^ - IntKi FieldTransAcc - 7 - "" - +param ^ - IntKi FieldAngularAcc - 8 - "" - +param ^ - IntKi FieldScalar - 9 - "" - +param ^ - IntKi FieldAngularDisp - 10 - "" - +param ^ - IntKi FieldCount - 10 - "" - + +param ^ - IntKi VF_None - 0 - "Variable with no flags" - +param ^ - IntKi VF_Mesh - 1 - "Variable contained in mesh" - +param ^ - IntKi VF_Line - 2 - "Variable is for a line mesh" - +param ^ - IntKi VF_RotFrame - 4 - "Variable in rotating frame" - +param ^ - IntKi VF_Linearize - 8 - "Variable for linearization" - +param ^ - IntKi VF_ExtLin - 16 - "Variable for extended linearization" - +param ^ - IntKi VF_2PI - 32 - "Variable is an angle with range [0,2pi]" - +param ^ - IntKi VF_WM_Rot - 64 - "Variable is a Wiener-Milenkovic rotation" - +param ^ - IntKi VF_WriteOut - 128 - "Variable for write output" - +param ^ - IntKi VF_Solve - 256 - "Variable for tight coupling solver" - +param ^ - IntKi VF_AeroMap - 512 - "Variable for aeromap" - +param ^ - IntKi VF_DerivOrder1 - 1024 - "Variable is derivative order 1 in linearization file" - +param ^ - IntKi VF_DerivOrder2 - 2048 - "Variable is derivative order 2 in linearization file" - +param ^ - IntKi VF_Mapping - 4096 - "Variable is used in a module-to-module transfer mapping" - +param ^ - IntKi VF_NoLin - 8192 - "Flag to exclude variable from linearization or solver" - + +param ^ - IntKi MC_None - 0 - "" - +param ^ - IntKi MC_Tight - 1 - "" - +param ^ - IntKi MC_Option1 - 2 - "" - +param ^ - IntKi MC_Option2 - 4 - "" - +param ^ - IntKi MC_Post - 8 - "" - + +typedef ^ DatLoc IntKi Num - 0 - "Field number in module input, output, or continuous state derived data types" +typedef ^ ^ IntKi i1 - 0 - "Index 1" +typedef ^ ^ IntKi i2 - 0 - "Index 2" +typedef ^ ^ IntKi i3 - 0 - "Index 3" +typedef ^ ^ IntKi i4 - 0 - "Index 4" +typedef ^ ^ IntKi i5 - 0 - "Index 5" + +typedef ^ ModVarType IntKi Field - 0 - "" - typedef ^ ^ IntKi Nodes - 1 - "" - typedef ^ ^ IntKi Num - 1 - "" - typedef ^ ^ IntKi Flags - 0 - "" - typedef ^ ^ IntKi DerivOrder - 0 - "" - -typedef ^ ^ IntKi iLoc : - - "indices in local arrays" - -typedef ^ ^ IntKi iSol : - - "indices in solver arrays" - -typedef ^ ^ IntKi iLin : - - "indices in linearization arrays" - -typedef ^ ^ IntKi iq : - - "row index in solver q matrix" - -typedef ^ ^ IntKi iUsr 2 - - "first user defined index for variable, can be used a lower/upper bounds" - -typedef ^ ^ IntKi jUsr - 0 - "second user defined index for variable" - -typedef ^ ^ IntKi MeshID - 0 - "Mesh identification number" - -typedef ^ ^ logical Solve - F - "flag indicating that variable is used by solver" - -typedef ^ ^ R8Ki Perturb - 0 - "perturbation" - +typedef ^ ^ IntKi iLoc 2 0 - "indices in module arrays" - +typedef ^ ^ IntKi iGlu 2 0 - "indices in module arrays" - +typedef ^ ^ IntKi iq 2 0 - "solver state row indices" - +typedef ^ ^ IntKi iLB - 0 - "first user defined index lower bound for variable" - +typedef ^ ^ IntKi iUB - 0 - "first user defined index upper bound for variable" - +typedef ^ ^ IntKi j - 0 - "second user defined index for variable" - +typedef ^ ^ IntKi k - 0 - "third user defined index for variable" - +typedef ^ ^ IntKi m - 0 - "fourth user defined index for variable" - +typedef ^ ^ IntKi n - 0 - "fifth user defined index for variable" - +typedef ^ ^ R8Ki Perturb - 0 - "perturbation amount for linearization" - +typedef ^ ^ DatLoc DL - - - "data location" - +typedef ^ ^ character(VarNameLen) Name - - - "" - typedef ^ ^ character(LinChanLen) LinNames : - - "" - -typedef ^ ModVarsType IntKi ModNum - 0 - "" - -typedef ^ ^ character(6) ModAbbr - - - "" - -typedef ^ ^ ModVarType x : - - "Module state variable array" - -typedef ^ ^ ModVarType u : - - "Module input variable array" - -typedef ^ ^ ModVarType y : - - "Module output variable array" - -typedef ^ ^ IntKi Nx - - - "" - -typedef ^ ^ IntKi Nu - - - "" - -typedef ^ ^ IntKi Ny - - - "" - - -typedef ^ ModValsType R8Ki x : - - "" - -typedef ^ ^ R8Ki dxdt : - - "" - +typedef ^ ModVarsType IntKi Nx - 0 - "Number of x values" +typedef ^ ^ IntKi Nu - 0 - "Number of u values" +typedef ^ ^ IntKi Ny - 0 - "Number of y values" +typedef ^ ^ ModVarType x : - - "Module state variable array" +typedef ^ ^ ModVarType u : - - "Module input variable array" +typedef ^ ^ ModVarType y : - - "Module output variable array" + +typedef ^ ModJacType IntKi Nx - 0 - "Number of x values" +typedef ^ ^ IntKi Nu - 0 - "Number of u values" +typedef ^ ^ IntKi Ny - 0 - "Number of y values" +typedef ^ ^ R8Ki x : - - "" - typedef ^ ^ R8Ki u : - - "" - typedef ^ ^ R8Ki y : - - "" - -typedef ^ ^ R8Ki u_perturb : - - "input perturbation array" - typedef ^ ^ R8Ki x_perturb : - - "" - -typedef ^ ^ R8Ki xp : - - "" - -typedef ^ ^ R8Ki xn : - - "" - -typedef ^ ^ R8Ki yp : - - "" - -typedef ^ ^ R8Ki yn : - - "" - +typedef ^ ^ R8Ki u_perturb : - - "" - +typedef ^ ^ R8Ki x_pos : - - "" - +typedef ^ ^ R8Ki x_neg : - - "" - +typedef ^ ^ R8Ki y_pos : - - "" - +typedef ^ ^ R8Ki y_neg : - - "" - + +typedef ^ ModLinType R8Ki x : - - "" - +typedef ^ ^ R8Ki dx : - - "" - +typedef ^ ^ R8Ki u : - - "" - +typedef ^ ^ R8Ki y : - - "" - +typedef ^ ^ R8Ki J :: - - "" - typedef ^ ^ R8Ki dYdx :: - - "" - typedef ^ ^ R8Ki dXdx :: - - "" - typedef ^ ^ R8Ki dYdu :: - - "" - typedef ^ ^ R8Ki dXdu :: - - "" - +typedef ^ ^ R8Ki dXdy :: - - "" - +typedef ^ ^ R8Ki dUdu :: - - "" - +typedef ^ ^ R8Ki dUdy :: - - "" - -typedef ^ ModDataType IntKi Idx - 0 - "Module index in array of modules" - +typedef ^ ModDataType character(ChanLen) Abbr - - - "Module name abbreviation" - +typedef ^ ^ IntKi iMod - 0 - "Module index in array of modules" - typedef ^ ^ IntKi ID - 0 - "Module identification number" - -typedef ^ ^ character(ChanLen) Abbr - - - "Module name abbreviation" - typedef ^ ^ IntKi Ins - 0 - "Module instance number" - -typedef ^ ^ logical IsTC - F - "Flag indicating module is part of tight coupling" - -typedef ^ ^ R8Ki DT - 0 - "Module time step" - +typedef ^ ^ IntKi iRotor - 0 - "Module rotor number" - typedef ^ ^ IntKi SubSteps - 0 - "Module number of substeps per solver time step" - -typedef ^ ^ IntKi ixs :: - - "index array mapping local x vector to global x vector" - -typedef ^ ^ IntKi ius :: - - "index array mapping local u vector to global u vector" - -typedef ^ ^ IntKi iys :: - - "index array mapping local y vector to global y vector" - -typedef ^ ^ ModVarsType *Vars - - - "Pointer to module variables type" - -typedef ^ ^ IntKi SrcMaps : - - "Indices of mappings where module is the source" -typedef ^ ^ IntKi DstMaps : - - "Indices of mappings where module is the destination" +typedef ^ ^ IntKi Category - 0 - "Module category tight, option 1, option 2" - +typedef ^ ^ R8Ki DT - 0 - "Module time step" - +typedef ^ ^ ModVarsType Vars - - - "Module variables type" - +typedef ^ ^ ModLinType Lin - - - "Module linearization arrays and matrices" + +typedef ^ KdTreeType IntKi NNodes - 0 - "Number of nodes in tree" - +typedef ^ ^ IntKi NDims - 0 - "Number of dimensions in tree" - +typedef ^ ^ ReKi Nodes :: 0 - "Array of node positions" - +typedef ^ ^ IntKi OriginalIndices : 0 - "Array of original node indices" - +typedef ^ ^ IntKi Dimensions : 0 - "The splitting dimension (1 for x, 2 for y) for each node." - # This file defines types that may be used from the NWTC_Library # include this into a component registry file if you wish to use these types @@ -162,4 +194,3 @@ typedef ^ ^ R8Ki LoadLn2_F typedef ^ ^ R8Ki LoadLn2_M {:}{:} - - "The 3-components of the moments for each node of an element in the point-to-line load mapping (for each element)" typedef ^ ^ MeshMapLinearizationType dM #typedef ^ ^ MeshType Lumped_Points_Dest - - - "temporary mesh for debugging the lumped values in the line2-to-line2" - diff --git a/modules/nwtc-library/src/Registry_NWTC_Library_base.txt b/modules/nwtc-library/src/Registry_NWTC_Library_base.txt index b5f52bb478..6c3613d6ad 100644 --- a/modules/nwtc-library/src/Registry_NWTC_Library_base.txt +++ b/modules/nwtc-library/src/Registry_NWTC_Library_base.txt @@ -45,80 +45,112 @@ typedef ^ ^ CHARACTER(6) RNG_type param ^ - IntKi VarNameLen - 64 - "" - -param ^ - IntKi VF_Force - 1 - "" - -param ^ - IntKi VF_Moment - 2 - "" - -param ^ - IntKi VF_Orientation - 3 - "" - -param ^ - IntKi VF_TransDisp - 4 - "" - -param ^ - IntKi VF_AngularDisp - 5 - "" - -param ^ - IntKi VF_TransVel - 6 - "" - -param ^ - IntKi VF_AngularVel - 7 - "" - -param ^ - IntKi VF_TransAcc - 8 - "" - -param ^ - IntKi VF_AngularAcc - 9 - "" - -param ^ - IntKi VF_Scalar - 10 - "" - - -param ^ - IntKi VF_None - 0 - "Variable with no flags" - -param ^ - IntKi VF_Mesh - 1 - "Variable contained in mesh" - -param ^ - IntKi VF_Line - 2 - "Variable is for a line mesh" - -param ^ - IntKi VF_RotFrame - 4 - "Variable in rotating frame" - -param ^ - IntKi VF_Ext - 8 - "Variable for extended linearization" - -param ^ - IntKi VF_Any - 4095 - "Enable all flags (used for filtering)" - - -param ^ - IntKi VC_None - 0 - "" - -param ^ - IntKi VC_Tight - 1 - "" - -param ^ - IntKi VC_Option1 - 2 - "" - -param ^ - IntKi VC_Option2 - 3 - "" - - -typedef ^ ModVarType character(VarNameLen) Name - - - "" - -typedef ^ ^ IntKi Field - 0 - "" - +param ^ - IntKi FieldForce - 1 - "" - +param ^ - IntKi FieldMoment - 2 - "" - +param ^ - IntKi FieldOrientation - 3 - "" - +param ^ - IntKi FieldTransDisp - 4 - "" - +param ^ - IntKi FieldTransVel - 5 - "" - +param ^ - IntKi FieldAngularVel - 6 - "" - +param ^ - IntKi FieldTransAcc - 7 - "" - +param ^ - IntKi FieldAngularAcc - 8 - "" - +param ^ - IntKi FieldScalar - 9 - "" - +param ^ - IntKi FieldAngularDisp - 10 - "" - +param ^ - IntKi FieldCount - 10 - "" - + +param ^ - IntKi VF_None - 0 - "Variable with no flags" - +param ^ - IntKi VF_Mesh - 1 - "Variable contained in mesh" - +param ^ - IntKi VF_Line - 2 - "Variable is for a line mesh" - +param ^ - IntKi VF_RotFrame - 4 - "Variable in rotating frame" - +param ^ - IntKi VF_Linearize - 8 - "Variable for linearization" - +param ^ - IntKi VF_ExtLin - 16 - "Variable for extended linearization" - +param ^ - IntKi VF_2PI - 32 - "Variable is an angle with range [0,2pi]" - +param ^ - IntKi VF_WM_Rot - 64 - "Variable is a Wiener-Milenkovic rotation" - +param ^ - IntKi VF_WriteOut - 128 - "Variable for write output" - +param ^ - IntKi VF_Solve - 256 - "Variable for tight coupling solver" - +param ^ - IntKi VF_AeroMap - 512 - "Variable for aeromap" - +param ^ - IntKi VF_DerivOrder1 - 1024 - "Variable is derivative order 1 in linearization file" - +param ^ - IntKi VF_DerivOrder2 - 2048 - "Variable is derivative order 2 in linearization file" - +param ^ - IntKi VF_Mapping - 4096 - "Variable is used in a module-to-module transfer mapping" - +param ^ - IntKi VF_NoLin - 8192 - "Flag to exclude variable from linearization or solver" - + +param ^ - IntKi MC_None - 0 - "" - +param ^ - IntKi MC_Tight - 1 - "" - +param ^ - IntKi MC_Option1 - 2 - "" - +param ^ - IntKi MC_Option2 - 4 - "" - +param ^ - IntKi MC_Post - 8 - "" - + +typedef ^ DatLoc IntKi Num - 0 - "Field number in module input, output, or continuous state derived data types" +typedef ^ ^ IntKi i1 - 0 - "Index 1" +typedef ^ ^ IntKi i2 - 0 - "Index 2" +typedef ^ ^ IntKi i3 - 0 - "Index 3" +typedef ^ ^ IntKi i4 - 0 - "Index 4" +typedef ^ ^ IntKi i5 - 0 - "Index 5" + +typedef ^ ModVarType IntKi Field - 0 - "" - typedef ^ ^ IntKi Nodes - 1 - "" - typedef ^ ^ IntKi Num - 1 - "" - typedef ^ ^ IntKi Flags - 0 - "" - typedef ^ ^ IntKi DerivOrder - 0 - "" - -typedef ^ ^ IntKi iLoc : - - "indices in local arrays" - -typedef ^ ^ IntKi iSol : - - "indices in solver arrays" - -typedef ^ ^ IntKi iLin : - - "indices in linearization arrays" - -typedef ^ ^ IntKi iq : - - "row index in solver q matrix" - -typedef ^ ^ IntKi iUsr 2 - - "first user defined index for variable, can be used a lower/upper bounds" - -typedef ^ ^ IntKi jUsr - 0 - "second user defined index for variable" - -typedef ^ ^ IntKi MeshID - 0 - "Mesh identification number" - -typedef ^ ^ logical Solve - F - "flag indicating that variable is used by solver" - -typedef ^ ^ R8Ki Perturb - 0 - "perturbation" - +typedef ^ ^ IntKi iLoc 2 0 - "indices in module arrays" - +typedef ^ ^ IntKi iGlu 2 0 - "indices in module arrays" - +typedef ^ ^ IntKi iq 2 0 - "solver state row indices" - +typedef ^ ^ IntKi iLB - 0 - "first user defined index lower bound for variable" - +typedef ^ ^ IntKi iUB - 0 - "first user defined index upper bound for variable" - +typedef ^ ^ IntKi j - 0 - "second user defined index for variable" - +typedef ^ ^ IntKi k - 0 - "third user defined index for variable" - +typedef ^ ^ IntKi m - 0 - "fourth user defined index for variable" - +typedef ^ ^ IntKi n - 0 - "fifth user defined index for variable" - +typedef ^ ^ R8Ki Perturb - 0 - "perturbation amount for linearization" - +typedef ^ ^ DatLoc DL - - - "data location" - +typedef ^ ^ character(VarNameLen) Name - - - "" - typedef ^ ^ character(LinChanLen) LinNames : - - "" - -typedef ^ ModVarsType IntKi ModNum - 0 - "" - -typedef ^ ^ character(6) ModAbbr - - - "" - -typedef ^ ^ ModVarType x : - - "Module state variable array" - -typedef ^ ^ ModVarType u : - - "Module input variable array" - -typedef ^ ^ ModVarType y : - - "Module output variable array" - -typedef ^ ^ IntKi Nx - - - "" - -typedef ^ ^ IntKi Nu - - - "" - -typedef ^ ^ IntKi Ny - - - "" - - -typedef ^ ModValsType R8Ki x : - - "" - -typedef ^ ^ R8Ki dxdt : - - "" - +typedef ^ ModVarsType IntKi Nx - 0 - "Number of x values" +typedef ^ ^ IntKi Nu - 0 - "Number of u values" +typedef ^ ^ IntKi Ny - 0 - "Number of y values" +typedef ^ ^ ModVarType x : - - "Module state variable array" +typedef ^ ^ ModVarType u : - - "Module input variable array" +typedef ^ ^ ModVarType y : - - "Module output variable array" + +typedef ^ ModJacType IntKi Nx - 0 - "Number of x values" +typedef ^ ^ IntKi Nu - 0 - "Number of u values" +typedef ^ ^ IntKi Ny - 0 - "Number of y values" +typedef ^ ^ R8Ki x : - - "" - typedef ^ ^ R8Ki u : - - "" - typedef ^ ^ R8Ki y : - - "" - -typedef ^ ^ R8Ki u_perturb : - - "input perturbation array" - typedef ^ ^ R8Ki x_perturb : - - "" - -typedef ^ ^ R8Ki xp : - - "" - -typedef ^ ^ R8Ki xn : - - "" - -typedef ^ ^ R8Ki yp : - - "" - -typedef ^ ^ R8Ki yn : - - "" - +typedef ^ ^ R8Ki u_perturb : - - "" - +typedef ^ ^ R8Ki x_pos : - - "" - +typedef ^ ^ R8Ki x_neg : - - "" - +typedef ^ ^ R8Ki y_pos : - - "" - +typedef ^ ^ R8Ki y_neg : - - "" - + +typedef ^ ModLinType R8Ki x : - - "" - +typedef ^ ^ R8Ki dx : - - "" - +typedef ^ ^ R8Ki u : - - "" - +typedef ^ ^ R8Ki y : - - "" - +typedef ^ ^ R8Ki J :: - - "" - typedef ^ ^ R8Ki dYdx :: - - "" - typedef ^ ^ R8Ki dXdx :: - - "" - typedef ^ ^ R8Ki dYdu :: - - "" - typedef ^ ^ R8Ki dXdu :: - - "" - +typedef ^ ^ R8Ki dXdy :: - - "" - +typedef ^ ^ R8Ki dUdu :: - - "" - +typedef ^ ^ R8Ki dUdy :: - - "" - -typedef ^ ModDataType IntKi Idx - 0 - "Module index in array of modules" - +typedef ^ ModDataType character(ChanLen) Abbr - - - "Module name abbreviation" - +typedef ^ ^ IntKi iMod - 0 - "Module index in array of modules" - typedef ^ ^ IntKi ID - 0 - "Module identification number" - -typedef ^ ^ character(ChanLen) Abbr - - - "Module name abbreviation" - typedef ^ ^ IntKi Ins - 0 - "Module instance number" - -typedef ^ ^ logical IsTC - F - "Flag indicating module is part of tight coupling" - -typedef ^ ^ R8Ki DT - 0 - "Module time step" - +typedef ^ ^ IntKi iRotor - 0 - "Module rotor number" - typedef ^ ^ IntKi SubSteps - 0 - "Module number of substeps per solver time step" - -typedef ^ ^ IntKi ixs :: - - "index array mapping local x vector to global x vector" - -typedef ^ ^ IntKi ius :: - - "index array mapping local u vector to global u vector" - -typedef ^ ^ IntKi iys :: - - "index array mapping local y vector to global y vector" - -typedef ^ ^ ModVarsType *Vars - - - "Pointer to module variables type" - -typedef ^ ^ IntKi SrcMaps : - - "Indices of mappings where module is the source" -typedef ^ ^ IntKi DstMaps : - - "Indices of mappings where module is the destination" +typedef ^ ^ IntKi Category - 0 - "Module category tight, option 1, option 2" - +typedef ^ ^ R8Ki DT - 0 - "Module time step" - +typedef ^ ^ ModVarsType Vars - - - "Module variables type" - +typedef ^ ^ ModLinType Lin - - - "Module linearization arrays and matrices" + +typedef ^ KdTreeType IntKi NNodes - 0 - "Number of nodes in tree" - +typedef ^ ^ IntKi NDims - 0 - "Number of dimensions in tree" - +typedef ^ ^ ReKi Nodes :: 0 - "Array of node positions" - +typedef ^ ^ IntKi OriginalIndices : 0 - "Array of original node indices" - +typedef ^ ^ IntKi Dimensions : 0 - "The splitting dimension (1 for x, 2 for y) for each node." - diff --git a/modules/nwtc-library/src/Registry_NWTC_Library_mesh.txt b/modules/nwtc-library/src/Registry_NWTC_Library_mesh.txt index 0cb2a1ecf3..d960ac8230 100644 --- a/modules/nwtc-library/src/Registry_NWTC_Library_mesh.txt +++ b/modules/nwtc-library/src/Registry_NWTC_Library_mesh.txt @@ -37,4 +37,3 @@ typedef ^ ^ R8Ki LoadLn2_F typedef ^ ^ R8Ki LoadLn2_M {:}{:} - - "The 3-components of the moments for each node of an element in the point-to-line load mapping (for each element)" typedef ^ ^ MeshMapLinearizationType dM #typedef ^ ^ MeshType Lumped_Points_Dest - - - "temporary mesh for debugging the lumped values in the line2-to-line2" - diff --git a/modules/nwtc-library/src/VTK.f90 b/modules/nwtc-library/src/VTK.f90 index fc48a1ef7d..625216e216 100644 --- a/modules/nwtc-library/src/VTK.f90 +++ b/modules/nwtc-library/src/VTK.f90 @@ -5,9 +5,10 @@ module VTK use Precision, only: IntKi, SiKi, ReKi - use NWTC_Base, only: ErrID_None, ErrID_Fatal, AbortErrLev, ErrMsgLen, SetErrStat + use NWTC_Base, only: ErrID_None, ErrID_Fatal, ErrID_Warn, AbortErrLev, ErrMsgLen use NWTC_IO, only: GetNewUnit, NewLine, WrScr, ReadStr, OpenFOutFile - use NWTC_IO, only: OpenFinpFile, ReadCom, Conv2UC + use NWTC_IO, only: OpenFinpFile, ReadCom, Conv2UC, num2lstr, AllocAry + use NWTC_IO, only: SetErrStat implicit none @@ -30,6 +31,14 @@ module VTK real(ReKi),dimension(3) :: PO_g END TYPE VTK_Misc + type, public :: vtk_field + character(len=255) :: fieldname ='' !< fieldname + real(ReKi), dimension(:,:), allocatable :: values ! < + type(vtk_field), pointer :: next => null() + end type vtk_field + + + interface vtk_dataset_structured_grid; module procedure & vtk_dataset_structured_grid_flat, & vtk_dataset_structured_grid_grid @@ -48,6 +57,7 @@ module VTK end interface interface vtk_cell_data_scalar; module procedure & vtk_cell_data_scalar_1d,& + vtk_cell_data_scalar_1di,& vtk_cell_data_scalar_2d end interface @@ -73,8 +83,14 @@ module VTK public :: vtk_cell_data_vector public :: WrVTK_SP_header public :: WrVTK_SP_vectors3D - public :: ReadVTK_SP_info + public :: ReadVTK_SP_info !< Structured points public :: ReadVTK_SP_vectors + public :: ReadVTK_PD_info !< Polydata + public :: ReadVTK_CD_fields !< read fields + ! --- VTK fields + public :: VTK_printFields + public :: VTK_getField + public :: VTK_destroyFields ! --- VTK XML routines public :: WrVTK_header public :: WrVTK_footer @@ -356,7 +372,285 @@ SUBROUTINE ReadVTK_SP_vectors( FileName, Un, dims, gridVals, ErrStat, ErrMsg ) end if END SUBROUTINE ReadVTK_SP_vectors - + +!======================================================================= +!> Read the header/points/polygons for a vtk, ascii, polydata (PD) file. +!! NOTE: the file is not closed upon exiting the routine, unless an error occurs. +!! Example: +!! # vtk DataFile Version 2.0 +!! SourcePanels - Ellipsoid - n1=67 - n2=65 +!! ASCII +!! +!! DATASET POLYDATA +!! POINTS 3 double +!! 0.0 0.0 -1.0 +!! 0.0 0.0 0.0 +!! 0.0 0.0 1.0 +!! +!! POLYGONS 1 5 +!! 4 0 1 2 0 +!! +!! CELL_DATA 1 +!! SCALARS Pressure double +!! LOOKUP_TABLE default +!! 1.0 +!! VECTORS Velocity double +!! 0.0 0.0 1.0 +!! + subroutine ReadVTK_PD_info(filename, descr, points, polygons, fid, errStat, errMsg) + character(*) , intent(in ) :: filename !< name of output file + character(1024), intent( out) :: descr !< line describing the contents of the file + real(ReKi) , intent( out), dimension(:,:), allocatable :: points !< Points 3 x nPoints + integer(IntKi) , intent( out), dimension(:,:), allocatable :: polygons !< Polygons connectivity, typically 4 x nPolygons + integer(IntKi) , intent( out) :: fid !< unit number of opened file + integer(IntKi) , intent( out) :: errStat !< error level/status of openfoutfile operation + character(*) , intent( out) :: errMsg !< message when error occurs + integer(IntKi) :: errStat2 ! local error level/status of openfoutfile operation + character(ErrMsgLen) :: errMsg2 ! local message when error occurs + character(1024) :: sdummy1, sdummy2, line + integer(IntKi) :: iline, i + integer(IntKi) :: nPoints, nPoly, nTot, nPerLine + integer(IntKi) :: iSection !< keep track of section we are currently reading 0=header, 2=points, 3=polygons + errStat = ErrID_None + errMsg = '' + call GetNewUnit(fid, errStat2, errMsg2) + call OpenFInpFile(fid, trim(filename), errStat2, errMsg2); if(Failed()) return + ! + descr='' + iline = 0 + iSection = 0 + do + iline = iline+1 + call ReadStr(fid, Filename, line, 'line', 'line', errStat2, errMsg2); if(Failed()) return + call Conv2UC(line) + if (index(adjustl(line), 'DATASET POLYDATA') == 1) then + iSection = 1 + + else if (index(adjustl(line), 'POINTS') == 1) then + if (iSection/=1) then + errStat2 = ErrID_Fatal + errMsg2 = 'Cannot read section `Points` if section `Dataset polydata` not read' + endif + ! --- Reading points + iSection = 2 + read(line, *, iostat=errStat2) sdummy1, nPoints, sdummy2 + errMsg2='Problem reading number of points'; if(Failed()) return + call AllocAry(points, 3, nPoints, 'points', errStat2, errMsg2); if(Failed()) return + do i =1,nPoints + iline = iline + i + read(fid, *, iostat=errStat2) points(:,i) + errMsg2='Problem reading point '//trim(num2lstr(i)); if(Failed()) return + enddo + + else if (index(adjustl(line), 'POLYGONS') == 1) then + if (iSection/=2) then + errStat2 = ErrID_Fatal + errMsg2 = 'Cannot read section `Polygons` if section `Points` not read' + endif + ! --- Reading polygons + iSection = 3 + read(line, *, iostat=errStat2) sdummy1, nPoly, nTot + errMsg2='Problem reading number of polygons'; if(Failed()) return + call AllocAry(polygons, 4, nPoly, 'points', errStat2, errMsg2); if(Failed()) return + do i =1,nPoly + iline = iline + i + read(fid, *, iostat=errStat2) nPerLine, polygons(:,i) + errMsg2='Problem reading polygon '//trim(num2lstr(i)); if(Failed()) return + enddo + exit + else + if (iSection==0) then + descr = trim(descr)//'|'//trim(line) + endif + end if + end do + if (iSection/=3) then + errStat2 = ErrID_Fatal + errMsg2 = 'Not all sections were read properly for VTK polydata file.' + endif + contains + logical function Failed() + if (errStat2/=ErrID_None) then + errStat2 = ErrID_Fatal ! All errors are fatal + errMsg2 = trim(errMsg2)//', on line '//trim(num2lstr(iline))//char(10)//' File: '//trim(filename) + close(fid) + endif + call SeterrStat(errStat2, errMsg2, errStat, errMsg, 'ReadVTK_PD_info') + Failed = errStat >= AbortErrLev + end function + end subroutine ReadVTK_PD_info + + !> Read Cell Data in file, return fields, a list of scalar or vector fields + subroutine ReadVTK_CD_fields(filename, fid, nCells, fields, errStat, errMsg) + use, intrinsic :: iso_fortran_env, only : iostat_end + character(*) , intent(in ) :: filename !< name of output file + integer(IntKi) , intent(in ) :: fid !< unit number of opened file + integer(IntKi) , intent(in ) :: nCells !< Number of cells + type(vtk_field), pointer :: fields !< Fields to be read + integer(IntKi) , intent(out) :: errStat !< error level/status of openfoutfile operation + character(*) , intent(out) :: errMsg !< message when error occurs + integer(IntKi) :: errStat2 ! local error level/status of openfoutfile operation + character(ErrMsgLen) :: errMsg2 ! local message when error occurs + character(1024) :: line + character(128) :: sType, fieldname, datatype + type(vtk_field), pointer :: head + type(vtk_field), pointer :: new_field + errStat = ErrID_None + errMsg = '' + ! Read untill cell_data + call ReadVTK_until(filename, fid, 'CELL_DATA', errStat2, errMsg2); if(Failed()) return + if (errStat2==ErrID_Warn) return ! We return if not found + ! + do + read(fid, '(A)', iostat = errStat2) line + if (errStat2 == iostat_end) then + close(fid) + return + endif + + if (index(adjustl(line), 'SCALARS') > 0) then + call prepare_new_field(1); if(Failed()) return + call read_field(); if(Failed()) return + call prepend_field() + + else if (index(adjustl(line), 'VECTORS') > 0) then + call prepare_new_field(3); if(Failed()) return + call read_field(); if(Failed()) return + call prepend_field() + else + ! pass + endif + end do + ! Should never be reached + contains + logical function Failed() + call SeterrStat(errStat2, errMsg2, errStat, errMsg, 'ReadVTK_CD_fields') + Failed = errStat >= AbortErrLev + if (Failed .and. fid>0) close(fid) + end function + + subroutine prepare_new_field(nDim) + integer, intent(in) :: nDim + read(line, *) sType, fieldname, datatype + call Conv2UC(fieldname) + !print*,'VTK: Cell Data: Type: ',trim(sType),', Name: ',trim(fieldname), ', Type:',trim(datatype) + errMsg2 = 'Error allocating new field' + allocate(new_field, stat = errStat2) + allocate(new_field%values(nDim, nCells), stat = errStat2) + if (errStat2/=0) then + errStat2 = ErrID_Fatal + return + endif + new_field%fieldname = fieldname + ! If the line starts with LOOKUP_TABLE DEFAULT, we ignore the line + errMsg2 = 'Error reading lookup table' + read(fid, '(A)', iostat = errStat2) line + if (errStat2/=0) then + errStat2 = ErrID_Fatal + return + endif + call Conv2UC(line) + if (index(adjustl(line), 'LOOKUP_TABLE DEFAULT') <= 0) then + backspace(fid) + endif + end subroutine + subroutine read_field() + integer :: i + do i = 1, nCells + read(fid, *, iostat=errStat2) new_field%values(:,i) + if (errStat2/=0) then + errStat2= ErrID_Fatal + errMsg2 ='Error reading line '//trim(num2lstr(i))//' of table '//trim(new_field%fieldname)//' in VTK file: '//trim(filename) + return + endif + end do + end subroutine + + subroutine prepend_field() + if (associated(fields)) new_field%next => fields + fields => new_field + nullify(new_field) + end subroutine + + end subroutine ReadVTK_CD_fields + + !> Loop and print the list + subroutine VTK_printFields(list) + type(vtk_field), pointer, intent(in) :: list + type(vtk_field), pointer :: field + type(vtk_field), pointer :: head + integer :: n,m + head => list + if (.not.associated(head)) then + call WrScr('VTK list of fields empty.') + endif + do while (associated(head)) + if (allocated(head%values)) then + n = size(head%values,1) + m = size(head%values,2) + else + n=-1 + m=-1 + endif + print *, 'VTK: Fieldname: ', head%fieldname(1:10), ' alloc: ', allocated(head%values), ' shape:',n, m + head => head%next + end do + end subroutine VTK_printFields + + ! Loop through list of fields and find the field with the requested fieldname + subroutine VTK_getField(list, fieldname, field) + type(vtk_field), pointer, intent(in) :: list + character(*), intent(in) :: fieldname + type(vtk_field), pointer, intent(out) :: field + character(len(fieldname)) :: fieldname_UP + type(vtk_field), pointer :: head + fieldname_UP = adjustl(fieldname) + call Conv2UC(fieldname_UP) + nullify(field) + head => list + do while (associated(head)) + if (trim(adjustl(head%fieldname)) == trim(fieldname_UP)) then + field => head + exit + else + head => head%next + endif + end do + end subroutine + + !> Deallocate the list of fields + subroutine VTK_destroyFields(list) + type(vtk_field), pointer :: list, next + do while (associated(list)) + next => list%next + if (allocated(list%values)) deallocate(list%values) + deallocate(list) + list => next + end do + end subroutine VTK_destroyFields + + + !> Read until an UpperCase Keyword is found + subroutine ReadVTK_until(filename, fid, KeyUpper, errStat, errMsg) + character(*) , intent(in ) :: filename !< name of output file + integer(IntKi) , intent(in ) :: fid !< unit number of opened file + character(*) , intent(in ) :: KeyUpper !< Key in upperCase + integer(IntKi) , intent(out) :: errStat !< error level/status of openfoutfile operation + character(*) , intent(out) :: errMsg !< message when error occurs + integer(IntKi) :: errStat2 ! local error level/status of openfoutfile operation + character(1024) :: line + errStat = ErrID_None + errMsg = '' + line='' + do + read(fid, *, iostat=errStat2) line ! Read each line until "CELL_DATA" is encountered + if (errStat2/=0) exit ! We return from this for loop and fail + if (index(adjustl(line), KeyUpper) > 0) return ! Key was found + end do + errStat = ErrID_Warn + errMsg = 'Key '//trim(KeyUpper)//' not found in VTK file:'//trim(filename) + end subroutine ReadVTK_until + !======================================================================= !> This routine writes out the heading for an vtk, ascii, structured_points dataset file . !! It tries to open a text file for writing and returns the Unit number of the opened file. @@ -901,6 +1195,25 @@ subroutine vtk_cell_data_scalar_1d(D,sname,mvtk) endif end subroutine + subroutine vtk_cell_data_scalar_1di(D,sname,mvtk) + integer(IntKi), dimension(:),intent(in)::D + character(len=*),intent(in) ::sname + type(VTK_Misc),intent(inout) :: mvtk + + if ( mvtk%bFileOpen ) then + if (mvtk%bBinary) then + write(mvtk%vtk_unit)'SCALARS '//trim(sname)//' int 1'//NewLine + write(mvtk%vtk_unit)'LOOKUP_TABLE default'//NewLine + write(mvtk%vtk_unit)D + write(mvtk%vtk_unit)NewLine + else + write(mvtk%vtk_unit,fmt='(A,A,A)') 'SCALARS ', sname, ' int' + write(mvtk%vtk_unit,'(A)') 'LOOKUP_TABLE default' + write(mvtk%vtk_unit,'(1I0)')D + endif + endif + end subroutine + subroutine vtk_cell_data_scalar_2d(D,sname,mvtk) real(ReKi), dimension(:,:),intent(in)::D character(len=*),intent(in) ::sname diff --git a/modules/nwtc-library/tests/nwtc_library_utest.F90 b/modules/nwtc-library/tests/nwtc_library_utest.F90 index 520cca5984..4d18a5f213 100644 --- a/modules/nwtc-library/tests/nwtc_library_utest.F90 +++ b/modules/nwtc-library/tests/nwtc_library_utest.F90 @@ -24,7 +24,7 @@ program nwtc_library_utest do is = 1, size(testsuites) write (error_unit, fmt) "Testing:", testsuites(is)%name - call run_testsuite(testsuites(is)%collect, error_unit, stat) + call run_testsuite(testsuites(is)%collect, error_unit, stat, parallel=.false.) end do if (stat > 0) then diff --git a/modules/openfast-library/CMakeLists.txt b/modules/openfast-library/CMakeLists.txt index c19dc49db7..f5b000a3b2 100644 --- a/modules/openfast-library/CMakeLists.txt +++ b/modules/openfast-library/CMakeLists.txt @@ -15,6 +15,7 @@ # if (GENERATE_TYPES) + generate_f90_types(src/Glue_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/Glue_Types.f90 -noextrap) generate_f90_types(src/FAST_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/FAST_Types.f90 -noextrap) endif() @@ -39,6 +40,7 @@ if (${_build_type} STREQUAL "RELEASE" AND NOT WIN32) endif() add_library(openfast_prelib STATIC + src/Glue_Types.f90 src/FAST_Types.f90 ) target_link_libraries(openfast_prelib @@ -62,16 +64,18 @@ target_link_libraries(openfast_prelib seastlib sedlib servodynlib + soildynlib subdynlib ) add_library(openfast_postlib STATIC - src/FAST_Lin.f90 src/FAST_Mods.f90 src/FAST_Subs.f90 + src/FAST_Funcs.f90 + src/FAST_ModGlue.f90 + src/FAST_Mapping.f90 + src/FAST_AeroMap.f90 src/FAST_Solver.f90 - src/FAST_SS_Subs.f90 - src/FAST_SS_Solver.f90 ) target_link_libraries(openfast_postlib openfast_prelib extinflowlib) target_include_directories(openfast_postlib PUBLIC diff --git a/modules/openfast-library/src/FAST_AeroMap.f90 b/modules/openfast-library/src/FAST_AeroMap.f90 new file mode 100644 index 0000000000..67b5393549 --- /dev/null +++ b/modules/openfast-library/src/FAST_AeroMap.f90 @@ -0,0 +1,1255 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2024 Envision Energy USA, National Renewable Energy Laboratory +! +! This file is part of FAST. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +!********************************************************************************************************************************** +!> This module contains the routines used by FAST to solve input-output equations and to advance states. + +module FAST_AeroMap + +use FAST_ModTypes +use FAST_Types +use FAST_Funcs +use FAST_Mapping +use FAST_ModGlue +use FAST_Subs +use NWTC_LAPACK + +implicit none + +real(DbKi), parameter :: SS_t_global = 0.0_DbKi +real(DbKi), parameter :: UJacSclFact_x = 1.0d3 + +logical, parameter :: output_debugging = .false. +integer(IntKi), parameter :: iModStruct = 1 +integer(IntKi), parameter :: iModAero = 2 +integer(IntKi), private, parameter :: iED = 1 + +contains + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +! DRIVER ROUTINE (runs + ends simulation) +! Put here so that we can call from either stand-alone code or from the ENFAST executable. +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +subroutine FAST_RunSteadyStateDriver(Turbine) + type(FAST_TurbineType), intent(inout) :: Turbine !< all data for one instance of a turbine + + integer(IntKi) :: ErrStat !< Error status of the operation + character(ErrMsgLen) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ProgName = TRIM(FAST_Ver%Name)//' Aero Map' + FAST_Ver%Name = ProgName + + call FAST_AeroMapDriver(Turbine%m_Glue%AM, Turbine%m_Glue, Turbine%p_FAST, Turbine%m_FAST, Turbine%y_FAST, Turbine, ErrStat, ErrMsg) + call CheckError(ErrStat, ErrMsg, 'FAST_AeroMapDriver') + + call ExitThisProgram_T(Turbine, ErrID_None, .true.) + +contains + subroutine CheckError(ErrID, Msg, SimMsg) + integer(IntKi), intent(in) :: ErrID ! The error identifier (ErrStat) + character(*), intent(in) :: Msg ! The error message (ErrMsg) + character(*), intent(in) :: SimMsg ! a message describing the location of the error + if (ErrID /= ErrID_None) then + call WrScr(NewLine//TRIM(Msg)//NewLine) + if (ErrID >= AbortErrLev) then + call ExitThisProgram_T(Turbine, ErrID, .true., SimMsg) + end if + end if + end subroutine CheckError +end subroutine + +subroutine FAST_AeroMapDriver(AM, m, p_FAST, m_FAST, y_FAST, T, ErrStat, ErrMsg) + use InflowWind_IO, only: IfW_SteadyFlowField_Init + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap data + type(Glue_MiscVarType), intent(inout) :: m !< MiscVars for the glue code + type(FAST_ParameterType), intent(in) :: p_FAST !< Parameters for the glue code + type(FAST_OutputFileType), intent(inout) :: y_FAST !< Output variables for the glue code + type(FAST_MiscVarType), intent(inout) :: m_FAST + type(FAST_TurbineType), intent(inout) :: T !< all data for one instance of a turbine + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + + character(*), parameter :: RoutineName = 'FAST_AeroMapDriver' + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: ErrStat2 + logical, parameter :: CompAeroMaps = .true. + real(DbKi), parameter :: t_initial = 0.0_DbKi + integer(IntKi) :: iModED, iModBD, iModAD, iModOrder(2) + integer(IntKi) :: i + integer(IntKi) :: JacSize + integer(IntKi) :: n_case !< loop counter + real(DbKi) :: n_global + real(ReKi), allocatable :: UnusedAry(:) + type(AeroMapCase) :: CaseDataTmp ! tsr, windSpeed, pitch, and rotor speed for this case (to try a different operating point first) + integer(IntKi) :: NStatus + character(MaxWrScrLen), parameter :: BlankLine = " " + + ErrStat = ErrID_None + ErrMsg = '' + + !---------------------------------------------------------------------------- + ! Initialization + !---------------------------------------------------------------------------- + + ! Set Turbine ID + T%TurbID = 1 + + ! Initialize linearization file number (will be incremented before use) + AM%LinFileNum = 0 + + ! Standard Turbine initialization + call FAST_InitializeAll(t_initial, T%m_Glue, T%p_FAST, T%y_FAST, T%m_FAST, & + T%ED, T%SED, T%BD, T%SrvD, T%AD, T%ADsk, & + T%ExtLd, T%IfW, T%ExtInfw, & + T%SeaSt, T%HD, T%SD, T%ExtPtfm, T%MAP, & + T%FEAM, T%MD, T%Orca, T%IceF, T%IceD, T%SlD, & + CompAeroMaps, ErrStat2, ErrMsg2) + if (Failed()) return + + ! If BeamDyn blades are being used, return error + if (T%p_FAST%CompElast == Module_BD) then + call SetErrStat(ErrID_Fatal, "AeroMap does not currently work with BeamDyn blades, support will be added in a future version of OpenFAST", ErrStat, ErrMsg, RoutineName) + return + end if + + ! Initialize module data transfer mappings + call FAST_InitMappings(m%Mappings, m%ModData, T, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Initialize steady flow field in AeroDyn + call IfW_SteadyFlowField_Init(T%AD%p%FlowField, & + RefHt=100.0_ReKi, & + HWindSpeed=8.0_ReKi, & + PLExp=0.0_ReKi, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + !---------------------------------------------------------------------------- + ! Module Order + !---------------------------------------------------------------------------- + + ! Get indices of modules that are used by Aero Mapping (first instance only) + iModED = 0; iModBD = 0; iModAD = 0 + do i = 1, size(m%ModData) + associate (ModData => m%ModData(i)) + if (ModData%Ins == 1) then + select case (ModData%ID) + case (Module_ED) + iModED = i + case (Module_BD) + iModBD = i + case (Module_AD) + iModAD = i + end select + end if + end associate + end do + + ! If BeamDyn is active + if (iModBD > 0) then + iModOrder = [iModBD, iModAD] + else if (iModED > 0) then + iModOrder = [iModED, iModAD] + end if + + !---------------------------------------------------------------------------- + ! Build AeroMap module + !---------------------------------------------------------------------------- + + ! Generate index for variables with AeroMap flag + call ModGlue_CombineModules(AM%Mod, m%ModData, m%Mappings, iModOrder, VF_AeroMap, & + .true., ErrStat2, ErrMsg2, Name="AeroMap") + if (Failed()) return + + ! Loop through modules in AM module + do i = 1, size(AM%Mod%ModData) + associate (ModData => AM%Mod%ModData(i)) + + ! Copy current state to predicted state + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_NEWCOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Copy current inputs to previous inputs + call FAST_CopyInput(ModData, T, INPUT_CURR, INPUT_PREV, MESH_NEWCOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + end associate + end do + + !---------------------------------------------------------------------------- + ! Allocation + !---------------------------------------------------------------------------- + + ! Allocate components of the Jacobian matrix + call AllocAry(AM%Jac11, AM%Mod%Vars%Nx, AM%Mod%Vars%Nx, 'Jac11', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(AM%Jac12, AM%Mod%Vars%Nx, AM%Mod%Vars%Nu, 'Jac12', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(AM%Jac21, AM%Mod%Vars%Nu, AM%Mod%Vars%Nx, 'Jac21', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(AM%Jac22, AM%Mod%Vars%Nu, AM%Mod%Vars%Nu, 'Jac22', ErrStat2, ErrMsg2); if (Failed()) return + + ! Jacobian size is number of states plus number of inputs + JacSize = AM%Mod%Vars%Nx + AM%Mod%Vars%Nu + + ! Allocate Jacobian pivot vector + call AllocAry(AM%JacPivot, JacSize, 'Pivot array for Jacobian LU decomposition', ErrStat2, ErrMsg2); if (Failed()) return + + ! Storage for residual and solution delta + call AllocAry(AM%Residual, JacSize, 'Residual', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(AM%SolveDelta, JacSize, 'SolveDelta', ErrStat2, ErrMsg2); if (Failed()) return + + ! Allocate Jacobian matrix + call AllocAry(AM%Mod%Lin%J, JacSize, JacSize, 'J', ErrStat2, ErrMsg2); if (Failed()) return + + ! Allocate Idx Jacobian storage + call AllocAry(AM%Mod%Lin%dXdy, AM%Mod%Vars%Nx, AM%Mod%Vars%Ny, 'dXdy', ErrStat2, ErrMsg2); if (Failed()) return + + ! Allocate arrays to store inputs + call AllocAry(AM%u1, AM%Mod%Vars%Nu, 'u1', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(AM%u2, AM%Mod%Vars%Nu, 'u2', ErrStat2, ErrMsg2); if (Failed()) return + + !---------------------------------------------------------------------------- + ! AeroMap structure initialization + !---------------------------------------------------------------------------- + + ! Jacobian scaling factor + AM%JacScale = real(p_FAST%UJacSclFact, R8Ki) + + ! Set tolerance so the error doesn't need to be divided by size of array later + AM%SolveTolerance = p_FAST%tolerSquared*JacSize**2 + + ! Allocate cases + allocate (AM%Cases(p_FAST%NumSSCases), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, "Error allocating AeroMap cases", ErrStat, ErrMsg, RoutineName) + return + end if + + ! Populate case data + do n_case = 1, p_FAST%NumSSCases + if (p_FAST%WindSpeedOrTSR == 1) then + AM%Cases(n_case)%WindSpeed = p_FAST%WS_TSR(n_case) + AM%Cases(n_case)%TSR = p_FAST%RotSpeed(n_case)*T%AD%p%rotors(1)%BEMT%rTipFixMax/AM%Cases(n_case)%WindSpeed + else + AM%Cases(n_case)%TSR = p_FAST%WS_TSR(n_case) + AM%Cases(n_case)%WindSpeed = p_FAST%RotSpeed(n_case)*T%AD%p%rotors(1)%BEMT%rTipFixMax/AM%Cases(n_case)%TSR + end if + AM%Cases(n_case)%Pitch = p_FAST%Pitch(n_case) + AM%Cases(n_case)%RotSpeed = p_FAST%RotSpeed(n_case) + end do + + !---------------------------------------------------------------------------- + ! Calculate steady-state solution for each case + !---------------------------------------------------------------------------- + + ! how often do we inform the user which case we are on? + NStatus = min(100, p_FAST%NumSSCases/100 + 1) ! at least 100 every 100 cases or 100 times per simulation + call WrScr(NewLine) + + ! Loop through Aero Map cases + do n_case = 1, p_FAST%NumSSCases + + ! If status should be written to screen + if (n_case == 1 .or. n_case == p_FAST%NumSSCases .or. mod(n_case, NStatus) == 0) then + call WrOver(' Case '//trim(Num2LStr(n_case))//' of '//trim(Num2LStr(p_FAST%NumSSCases))) + end if + + ! Call steady-state solve for this pitch and rotor speed + call SS_Solve(AM, m, m%Mappings, AM%Cases(n_case), p_FAST, y_FAST, m_FAST, T, ErrStat2, ErrMsg2) + + ! we didn't converge; let's try a different operating point and see if that helps: + if (ErrStat2 >= ErrID_Severe) then + + ! Create copy of case data for second attempt + CaseDataTmp = AM%Cases(n_case) + + ! Modify pitch, TSR, and WindSpeed + CaseDataTmp%Pitch = CaseDataTmp%Pitch*0.5_ReKi + CaseDataTmp%TSR = CaseDataTmp%TSR*0.5_ReKi + CaseDataTmp%WindSpeed = CaseDataTmp%WindSpeed*0.5_ReKi + + ! Write message about retrying case + call WrScr('Retrying case '//trim(Num2LStr(n_case))//', first trying to get a better initial guess. Average error is '// & + trim(Num2LStr(y_FAST%DriverWriteOutput(SS_Indx_Err)))//'.') + + call SS_Solve(AM, m, m%Mappings, CaseDataTmp, p_FAST, y_FAST, m_FAST, T, ErrStat2, ErrMsg2) + + ! if that worked, try the real case again: + if (ErrStat2 < AbortErrLev) then + ! call SS_Solve(m, AM%Cases(n_case), p_FAST, y_FAST, m_FAST, T%ED, T%BD, T%AD, T%MeshMapData, T, ErrStat2, ErrMsg2) + call WrOver(BlankLine) + end if + + end if + + if (ErrStat2 > ErrID_None) then + ErrMsg2 = trim(ErrMsg2)//" case "//trim(Num2LStr(n_case))// & + ' (tsr='//trim(Num2LStr(AM%Cases(n_case)%tsr))// & + ', wind speed='//trim(Num2LStr(AM%Cases(n_case)%windSpeed))//' m/s'// & + ', pitch='//trim(num2lstr(AM%Cases(n_case)%pitch*R2D))//' deg'// & + ', rotor speed='//trim(num2lstr(AM%Cases(n_case)%RotSpeed*RPS2RPM))//' rpm)' + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end if + + !------------------------------------------------------------------------- + ! Write results to file + !------------------------------------------------------------------------- + + n_global = real(n_case, DbKi) ! n_global is double-precision so that we can reuse existing code. + + call WrOutputLine(n_global, p_FAST, y_FAST, UnusedAry, UnusedAry, T%ED%y, UnusedAry, & + T%AD%y, UnusedAry, T%SrvD%y, UnusedAry, UnusedAry, UnusedAry, UnusedAry, UnusedAry, & + UnusedAry, UnusedAry, UnusedAry, UnusedAry, T%IceD%y, T%SlD%y%WriteOutput, T%BD%y, ErrStat2, ErrMsg2) + if (Failed()) return + + !------------------------------------------------------------------------- + ! Write errors to screen + !------------------------------------------------------------------------- + + if (ErrStat > ErrID_None) then + call WrScr(trim(ErrMsg)) + call WrScr("") + ErrStat = ErrID_None + ErrMsg = "" + end if + + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine performs the Input-Output solve for the steady-state solver. +!! Note that this has been customized for the physics in the problems and is not a general solution. +subroutine SS_Solve(AM, m, Mappings, caseData, p_FAST, y_FAST, m_FAST, T, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap data + type(Glue_MiscVarType), intent(inout) :: m !< Miscellaneous variables + type(MappingType), intent(inout) :: Mappings(:) !< Transfer mappings + type(AeroMapCase), intent(in) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case + type(FAST_ParameterType), intent(in) :: p_FAST !< Glue-code simulation parameters + type(FAST_OutputFileType), intent(inout) :: y_FAST !< Glue-code output file values + type(FAST_MiscVarType), intent(inout) :: m_FAST !< Miscellaneous variables + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SS_Solve' + integer(IntKi) :: ErrStat2 ! temporary Error status of the operation + character(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None + + !bjj: store these so that we don't reallocate every time? + real(R8Ki) :: err + real(R8Ki) :: err_prev + real(R8Ki), allocatable :: u(:) + real(R8Ki), parameter :: reduction_factor = 0.1_R8Ki + + integer(IntKi) :: nb ! loop counter (blade number) + integer(IntKi) :: MaxIter ! maximum number of iterations + integer(IntKi) :: iter ! Input-output-solve iteration counter + integer(IntKi) :: i, j + integer(IntKi) :: nx ! Number of state variables in Jacobian + + logical :: GetWriteOutput ! flag to determine if we need WriteOutputs from this call to CalcOutput + + !bjj: note, that this routine may have a problem if there is remapping done + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Some record keeping stuff: + !---------------------------------------------------------------------------- + + nx = AM%Mod%Vars%Nx + + ! Set the rotor speed in ElastoDyn + T%ED%x(iED,STATE_CURR)%QDT(p_FAST%GearBox_Index) = caseData%RotSpeed + + ! Set prescribed inputs from case data + call SS_SetPrescribedInputs(caseData, p_FAST, y_FAST, m_FAST, T%ED, T%BD, T%AD) + + ! Copy inputs from current to previous index + do i = 1, size(AM%Mod%ModData) + call FAST_CopyInput(AM%Mod%ModData(i), T, INPUT_CURR, INPUT_PREV, MESH_NEWCOPY, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + + iter = 0 + err = 1.0E3 + err_prev = err + + y_FAST%DriverWriteOutput(SS_Indx_Err) = -1 + y_FAST%DriverWriteOutput(SS_Indx_Iter) = 0 + y_FAST%DriverWriteOutput(SS_Indx_TSR) = caseData%tsr + y_FAST%DriverWriteOutput(SS_Indx_WS) = caseData%windSpeed + y_FAST%DriverWriteOutput(SS_Indx_Pitch) = caseData%Pitch*R2D + y_FAST%DriverWriteOutput(SS_Indx_RotSpeed) = caseData%RotSpeed*RPS2RPM + + MaxIter = p_FAST%KMax + 1 ! adding 1 here so that we get the error calculated correctly when we hit the max iteration + do + + !------------------------------------------------------------------------- + ! Calculate outputs, based on inputs at this time + !------------------------------------------------------------------------- + + ! Set GetWriteOutput flag true if not the first iteration + GetWriteOutput = iter > 0 + + !----------------------------------------- + ! Calculate ElastoDyn / BeamDyn output + !----------------------------------------- + + call FAST_CalcOutput(AM%Mod%ModData(1), Mappings, SS_t_global, INPUT_CURR, STATE_CURR, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + !----------------------------------------- + ! AeroDyn InputSolve + !----------------------------------------- + + ! If first iteration + if (iter == 0) then + + ! Perform AeroDyn input solve to get initial guess from structural module + ! (this ensures that the pitch is accounted for in the fixed aero-map solve:): + call SS_AD_InputSolve(AM, Mappings, INPUT_CURR, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SS_AD_InputSolve_OtherBlades(AM, INPUT_CURR, T) + + ! Get initial states + call SS_GetStates(AM, AM%Mod%Lin%x, INPUT_CURR, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Get initial inputs + call SS_GetInputs(AM, AM%u1, INPUT_CURR, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + end if + + !----------------------------------------- + ! Calculate AeroDyn Output + !----------------------------------------- + + call FAST_CalcOutput(AM%Mod%ModData(2), Mappings, SS_t_global, INPUT_CURR, STATE_CURR, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) then + call ResetInputsAndStates() + return + end if + + ! If iteration is at or above maximum iteration, exit loop + if (iter >= MaxIter) exit + + !------------------------------------------------------------------------------------------------- + ! Calculate residual and the Jacobian + ! (note that we don't want to change module%Input(1), here) + ! Also, the residual uses values from y_FAST, so do this before calculating the jacobian + !------------------------------------------------------------------------------------------------- + + call SS_BuildResidual(AM, caseData, Mappings, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) then + call ResetInputsAndStates() + return + end if + + ! If Jacobian needs to be recalculated + if (mod(iter, p_FAST%N_UJac) == 0) then + call SS_BuildJacobian(AM, caseData, Mappings, p_FAST, y_FAST, m_FAST, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) then + call ResetInputsAndStates() + return + end if + end if + + !------------------------------------------------------------------------- + ! Solve for delta u: J*SolveDelta = -Residual + ! using the LAPACK routine + !------------------------------------------------------------------------- + + ! Copy negative of residual into solve + AM%SolveDelta = -AM%Residual + + ! Solve for changes in states and inputs + call LAPACK_getrs(TRANS="N", N=size(AM%Mod%Lin%J, 1), A=AM%Mod%Lin%J, & + IPIV=AM%JacPivot, B=AM%SolveDelta, ErrStat=ErrStat2, ErrMsg=ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + !------------------------------------------------------------------------- + ! Check for error, update inputs if necessary, and iterate again + !------------------------------------------------------------------------- + + ! Save previous error + err_prev = err + + ! Calculate new error + err = dot_product(AM%SolveDelta, AM%SolveDelta) + + ! Store normalized error in output + y_FAST%DriverWriteOutput(SS_Indx_Err) = sqrt(err)/size(AM%Mod%Lin%J, 1) + + ! Remove conditioning from solution vector + call PostconditionInputDelta(AM%Mod%Vars, AM%SolveDelta(nx + 1:), AM%JacScale) + + ! If error is below tolerance + if (err <= AM%SolveTolerance) then + if (iter == 0) then ! the error will be incorrect in this instance, but the outputs will be better + MaxIter = iter + else + exit + end if + end if + + if (iter >= p_FAST%KMax) exit + if (iter > 5 .and. err > 1.0E35) exit ! this is obviously not converging. Let's try something else. + + !------------------------------------------------------------------------- + ! Modify inputs and states for next iteration + !------------------------------------------------------------------------- + + ! If current error is greater than previous error (solution diverging), + ! reduce delta (take a smaller step) + if (err > err_prev) then + AM%SolveDelta = AM%SolveDelta*reduction_factor + err_prev = err_prev*reduction_factor + end if + + ! Update states and inputs based on solution + call SS_UpdateInputsStates(AM, AM%SolveDelta, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Increment iteration counter and set it in write output + iter = iter + 1 + y_FAST%DriverWriteOutput(SS_Indx_Iter) = iter + + end do ! K + + !TODO + if (p_FAST%CompElast == Module_BD) then + ! this doesn't actually get the correct hub point load from BD, but we'll get some outputs: + ! call ED_CalcOutput(SS_t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), ED%y, ED%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end if + + call ResetInputsAndStates() + +contains + subroutine ResetInputsAndStates() + + if (err > AM%SolveTolerance) then + + call SetErrStat(ErrID_Severe, 'Steady-state solver did not converge.', ErrStat, ErrMsg, RoutineName) + + ! if we didn't get close on the solution, we should reset the states and inputs because they very well could + ! lead to numerical issues on the next iteration. Here, set the initial values to 0: + if (err > 100.0) then + + ! because loads occasionally get very large when it fails, manually set these to zero (otherwise + ! roundoff can lead to non-zero values with the method below, which is most useful for states) + if (p_FAST%CompElast == Module_BD) then + do iter = 1, p_FAST%NumBD + T%BD%Input(1, iter)%DistrLoad%Force = 0.0_ReKi + T%BD%Input(1, iter)%DistrLoad%Moment = 0.0_ReKi + end do + end if + + ! Find the values we have been modifying (in u... continuous states and inputs) + call SS_GetStates(AM, AM%SolveDelta(:nx), STATE_CURR, T, ErrStat2, ErrMsg2) + call SS_GetInputs(AM, AM%SolveDelta(nx + 1:), INPUT_CURR, T, ErrStat2, ErrMsg2) + + ! Reset them to 0 (by adding -u) + AM%SolveDelta = -AM%SolveDelta + call SS_UpdateInputsStates(AM, AM%SolveDelta, T, ErrStat2, ErrMsg2) + end if + end if + + end subroutine ResetInputsAndStates + +end subroutine SS_Solve + +subroutine PreconditionInputResidual(Vars, u_residual, JacScale) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: u_residual(:) + real(R8Ki), intent(in) :: JacScale + integer(IntKi) :: i + do i = 1, size(Vars%u) + associate (Var => Vars%u(i)) + if (MV_IsLoad(Var)) then + u_residual(Var%iLoc(1):Var%iLoc(2)) = u_residual(Var%iLoc(1):Var%iLoc(2))/JacScale + end if + end associate + end do +end subroutine + +subroutine PostconditionInputDelta(Vars, u_delta, JacScale) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: u_delta(:) + real(R8Ki), intent(in) :: JacScale + integer(IntKi) :: i + do i = 1, size(Vars%u) + associate (Var => Vars%u(i)) + if (MV_IsLoad(Var)) then + u_delta(Var%iLoc(1):Var%iLoc(2)) = u_delta(Var%iLoc(1):Var%iLoc(2))*JacScale + end if + end associate + end do +end subroutine + +subroutine SS_UpdateInputsStates(AM, delta, T, ErrStat, ErrMsg) + use ElastoDyn_IO, only: DOF_BF, DOF_BE + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap data + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + real(R8Ki), intent(in) :: delta(:) !< Change in state and input arrays + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SS_UpdateInputsStates' + integer(IntKi) :: ErrStat2 ! temporary Error status of the operation + character(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None + integer(IntKi) :: i, j + + ! Add change in inputs to current inputs + call MV_AddDelta(AM%Mod%Vars%u, delta(AM%Mod%Vars%Nx + 1:), AM%u1) + + ! Add change in continuous states to current states + call MV_AddDelta(AM%Mod%Vars%x, delta(:AM%Mod%Vars%Nx), AM%Mod%Lin%x) + + ! Update states and inputs in module + do i = 1, size(AM%Mod%ModData) + associate (ModData => AM%Mod%ModData(i)) + + ! Populate input and state values in module + call FAST_SetOP(ModData, INPUT_CURR, STATE_CURR, T, ErrStat2, ErrMsg2, & + u_op=ModData%Lin%u, u_glue=AM%u1, & + x_op=ModData%Lin%x, x_glue=AM%Mod%Lin%x) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Select based on module + select case (ModData%ID) + case (Module_ED) + + ! Copy blade1 flap and edge states to other blades + do j = 2, T%ED%p(iED)%NumBl + T%ED%x(iED,STATE_CURR)%QT(DOF_BF(j, 1)) = T%ED%x(iED,STATE_CURR)%QT(DOF_BF(1, 1)) + T%ED%x(iED,STATE_CURR)%QT(DOF_BF(j, 2)) = T%ED%x(iED,STATE_CURR)%QT(DOF_BF(1, 2)) + T%ED%x(iED,STATE_CURR)%QT(DOF_BE(j, 1)) = T%ED%x(iED,STATE_CURR)%QT(DOF_BE(1, 1)) + end do + + ! Set velocities to zero + do j = 1, T%ED%p(iED)%NumBl + T%ED%x(iED,STATE_CURR)%QDT(DOF_BF(j, 1)) = 0.0_R8Ki + T%ED%x(iED,STATE_CURR)%QDT(DOF_BF(j, 2)) = 0.0_R8Ki + T%ED%x(iED,STATE_CURR)%QDT(DOF_BE(j, 1)) = 0.0_R8Ki + end do + + ! Transfer loads from ED blade 1 to other blades + call SS_ED_InputSolve_OtherBlades(AM, INPUT_CURR, T) + + case (Module_BD) + ! TODO: Copy B1 states to other blades + + ! Transfer loads from BD blade 1 to other blades + call SS_BD_InputSolve_OtherBlades(AM, INPUT_CURR, T) + + case (Module_AD) + + ! Transfer AD blade 1 motion to other blades + call SS_AD_InputSolve_OtherBlades(AM, INPUT_CURR, T) + + end select + end associate + end do + +end subroutine + +subroutine SS_BuildJacobian(AM, caseData, Mappings, p_FAST, y_FAST, m_FAST, T, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap module + type(MappingType), intent(inout) :: Mappings(:) !< Module mapping + type(AeroMapCase), intent(in) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case + type(FAST_ParameterType), intent(IN) :: p_FAST !< Parameters for the glue code + type(FAST_OutputFileType), intent(INOUT) :: y_FAST !< Output variables for the glue code + type(FAST_MiscVarType), intent(INOUT) :: m_FAST !< Miscellaneous variables + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(OUT) :: ErrStat !< Error status of the operation + character(*), intent(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SS_BuildJacobian' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMSg2 + character(1024) :: LinRootName + integer(IntKi) :: i, j, k, c, r, iRow(2), iCol(2), iLoc(2) + integer(IntKi) :: nx ! Number of states + integer(IntKi) :: Un + logical :: RowIsLoad, ColIsLoad + + ErrStat = ErrID_None + ErrMsg = "" + + ! Set number of states + nx = AM%Mod%Vars%Nx + + ! If output debugging is requested + if (output_debugging) then + + ! Get unit number for output files + call GetNewUnit(Un, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Build linearization root name + AM%LinFileNum = AM%LinFileNum + 1 + LinRootName = trim(p_FAST%OutFileRoot)//'.'//trim(Num2LStr(AM%LinFileNum)) + + ! These values get printed in the linearization output files, so we'll set them here: + y_FAST%Lin%WindSpeed = caseData%WindSpeed + y_FAST%Lin%RotSpeed = caseData%RotSpeed + y_FAST%Lin%Azimuth = 0.0_ReKi + end if + + ! Initialize Jacobian + AM%Mod%Lin%J = 0.0_R8Ki + + !---------------------------------------------------------------------------- + ! dXdy + !---------------------------------------------------------------------------- + + AM%Mod%Lin%dXdy = 0.0_R8Ki + + !---------------------------------------------------------------------------- + ! Module Jacobians + !---------------------------------------------------------------------------- + + ! Loop through modules + do i = 1, size(AM%Mod%ModData) + associate (ModData => AM%Mod%ModData(i)) + + ! Calculate dYdu and dXdu + call FAST_JacobianPInput(ModData, SS_t_global, INPUT_CURR, STATE_CURR, T, ErrStat2, ErrMsg2, & + dYdu=ModData%Lin%dYdu, dYdu_glue=AM%Mod%Lin%dYdu, & + dXdu=ModData%Lin%dXdu, dXdu_glue=AM%Mod%Lin%dXdu) + if (Failed()) return + + ! Calculate dYdx and dXdx + call FAST_JacobianPContState(ModData, SS_t_global, INPUT_CURR, STATE_CURR, T, ErrStat2, ErrMsg2, & + dYdx=ModData%Lin%dYdx, dYdx_glue=AM%Mod%Lin%dYdx, & + dXdx=ModData%Lin%dXdx, dXdx_glue=AM%Mod%Lin%dXdx) + if (Failed()) return + + ! If output debugging requested + if (output_debugging) then + + ! Calculate operating point values + call FAST_GetOP(ModData, SS_t_global, INPUT_CURR, STATE_CURR, T, ErrStat2, ErrMsg2, & + u_op=ModData%Lin%u, u_glue=AM%Mod%Lin%u, & + y_op=ModData%Lin%y, y_glue=AM%Mod%Lin%y, & + x_op=ModData%Lin%x, x_glue=AM%Mod%Lin%x, & + dx_op=ModData%Lin%dx, dx_glue=AM%Mod%Lin%dx) + if (Failed()) return + + ! Write linearization matrices + call ModGlue_CalcWriteLinearMatrices(ModData%Vars, ModData%Lin, p_FAST, y_FAST, SS_t_global, Un, & + LinRootName, VF_AeroMap, ErrStat2, ErrMsg2, ModData%Abbr, CalcGlue=.false.) + if (Failed()) return + + end if + + ! If this module is BeamDyn, calculate dxdotdy + if (ModData%ID == Module_BD) then + + ! TODO: implement BeamDyn + ! NOTE that this implies that the FEA nodes (states) are the same as the output nodes!!!! (note that we have overlapping nodes at the element end points) + ! r = 1 + ! do i = 2, BD%p(k)%node_total ! the first node isn't technically a state + ! c = (BD%p(k)%NdIndx(i) - 1)*3 + 1 ! BldMeshNode = BD%p(k)%NdIndx(i) + + ! !dxdotdy(r:r+2,c:c+2) = SkewSymMat( [p_FAST%RotSpeed, 0.0_ReKi, 0.0_ReKi] ) + ! dxdotdy(r + 2, c + 1) = caseData%RotSpeed + ! dxdotdy(r + 1, c + 2) = -caseData%RotSpeed + + ! ! derivative + ! dxdotdy(r + nx + 1, c + 1) = -OmegaSquared + ! dxdotdy(r + nx + 2, c + 2) = -OmegaSquared + + ! r = r + BD%p(k)%dof_node + ! end do + end if + + end associate + end do + + !---------------------------------------------------------------------------- + ! Glue Jacobians + !---------------------------------------------------------------------------- + + AM%Mod%Lin%dUdy = 0.0_R8Ki + call Eye2D(AM%Mod%Lin%dUdu, ErrStat2, ErrMsg2); if (Failed()) return + call FAST_LinearizeMappings(AM%Mod, Mappings, T, ErrStat2, ErrMsg2) + if (Failed()) return + + !---------------------------------------------------------------------------- + ! Form Jacobian matrix + !---------------------------------------------------------------------------- + + ! Calculate Jacobian block 11 = dX/dx - dX/dy * dY/dx + AM%Jac11 = AM%Mod%Lin%dXdx + call LAPACK_GEMM('N', 'N', -1.0_R8Ki, AM%Mod%Lin%dXdy, AM%Mod%Lin%dYdx, 1.0_R8Ki, AM%Jac11, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Calculate Jacobian block 12 = dX/du - dX/dy * dY/du + AM%Jac12 = AM%Mod%Lin%dXdu + call LAPACK_GEMM('N', 'N', -1.0_R8Ki, AM%Mod%Lin%dXdy, AM%Mod%Lin%dYdu, 1.0_R8Ki, AM%Jac12, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Calculate Jacobian block 21 = dU/dy * dY/dx + call LAPACK_GEMM('N', 'N', 1.0_R8Ki, AM%Mod%Lin%dUdy, AM%Mod%Lin%dYdx, 0.0_R8Ki, AM%Jac21, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Calculate Jacobian block 22 = dU/du + dU/dy * dY/du + AM%Jac22 = AM%Mod%Lin%dUdu + call LAPACK_GEMM('N', 'N', 1.0_R8Ki, AM%Mod%Lin%dUdy, AM%Mod%Lin%dYdu, 1.0_R8Ki, AM%Jac22, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Assemble blocks to form full Jacobian + AM%Mod%Lin%J(:nx, :nx) = AM%Jac11 + AM%Mod%Lin%J(:nx, nx + 1:) = AM%Jac12 + AM%Mod%Lin%J(nx + 1:, :nx) = AM%Jac21 + AM%Mod%Lin%J(nx + 1:, nx + 1:) = AM%Jac22 + + ! If output debugging is enabled, write combined matrices and Jacobian + if (output_debugging) then + call ModGlue_CalcWriteLinearMatrices(AM%Mod%Vars, AM%Mod%Lin, p_FAST, y_FAST, SS_t_global, Un, & + LinRootName, VF_AeroMap, ErrStat2, ErrMsg2, CalcGlue=.false.) + if (Failed()) return + end if + + !---------------------------------------------------------------------------- + ! Condition Jacobian matrix + !---------------------------------------------------------------------------- + + ! Note: AM%JacScale is a scaling factor that gets similar magnitudes between loads and accelerations... + + associate (J => AM%Mod%Lin%J) + + ! Loop through inputs + do r = 1, size(AM%Mod%Vars%u) + iLoc = AM%Mod%Vars%u(r)%iLoc + nx + if (MV_IsLoad(AM%Mod%Vars%u(r))) then + ! Column is motion (state), row is load + J(iLoc(1):iLoc(2), 1:nx) = J(iLoc(1):iLoc(2), 1:nx)/AM%JacScale + ! Row is motion (state), column is load + J(1:nx, iLoc(1):iLoc(2)) = J(1:nx, iLoc(1):iLoc(2))*AM%JacScale + end if + end do + + ! Loop through input vars as columns + do c = 1, size(AM%Mod%Vars%u) + iCol = AM%Mod%Vars%u(c)%iLoc + nx + ColIsLoad = MV_IsLoad(AM%Mod%Vars%u(c)) + + ! Loop through input vars as rows + do r = 1, size(AM%Mod%Vars%u) + iRow = AM%Mod%Vars%u(r)%iLoc + nx + RowIsLoad = MV_IsLoad(AM%Mod%Vars%u(r)) + + if ((.not. RowIsLoad) .and. ColIsLoad) then ! Row is a motion, Col is a load + J(iRow(1):iRow(2), iCol(1):iCol(2)) = J(iRow(1):iRow(2), iCol(1):iCol(2))*AM%JacScale + else if (RowIsLoad .and. (.not. ColIsLoad)) then ! Row is a load, Col is a motion + J(iRow(1):iRow(2), iCol(1):iCol(2)) = J(iRow(1):iRow(2), iCol(1):iCol(2))/AM%JacScale + end if + end do + end do + + end associate + + !---------------------------------------------------------------------------- + ! Factor Jacobian matrix + ! Get the LU decomposition of this matrix using a LAPACK routine: + ! The result is of the form Jmat = P * L * U + !---------------------------------------------------------------------------- + + call LAPACK_getrf(M=size(AM%Mod%Lin%J, 1), N=size(AM%Mod%Lin%J, 2), & + A=AM%Mod%Lin%J, IPIV=AM%JacPivot, ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + +contains + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + if (Failed) call Cleanup() + end function + + subroutine Cleanup() + if (Un > 0) close (Un) + end subroutine Cleanup + +end subroutine SS_BuildJacobian + +subroutine SS_BuildResidual(AM, caseData, Mappings, T, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap data + type(AeroMapCase), intent(IN) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case + type(MappingType), intent(inout) :: Mappings(:) !< Module mapping + type(FAST_TurbineType), intent(INOUT) :: T !< Turbine type + integer(IntKi), intent(OUT) :: ErrStat !< Error status of the operation + character(*), intent(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SS_BuildResidual' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, iVarMod(2), iVarGbl(2) + + integer, parameter :: StateIndex = STATE_PRED + + ErrStat = ErrID_None + ErrMsg = "" + + ! Pointers to parts of residual array + associate (xResidual => AM%Residual(:AM%Mod%Vars%Nx), & ! States residual + uResidual => AM%Residual(AM%Mod%Vars%Nx + 1:)) ! Inputs residual + + ! Note: prescribed inputs are already set in both INPUT_CURR and INPUT_PREV so we can ignore them here + call SS_CalcContStateDeriv(AM, caseData, INPUT_CURR, xResidual, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Note that we don't need to calculate the inputs on more than p_FAST%NumBl_Lin blades because we are only using them to compute the SS_GetInputs + call SS_GetCalculatedInputs(AM, AM%u2, Mappings, T, ErrStat2, ErrMsg2) ! calculate new inputs and store in InputIndex=2 + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Calculate difference between prescribed and calculated inputs + call MV_ComputeDiff(AM%Mod%Vars%u, AM%u1, AM%u2, uResidual) + + ! Condition residual for solve + call PreconditionInputResidual(AM%Mod%Vars, uResidual, AM%JacScale) + end associate + +end subroutine + +!------------------------------------------------------------------------------- + +!> SS_BD_InputSolve_OtherBlades sets the blade-load ElastoDyn inputs from blade 1 to the other blades. +subroutine SS_BD_InputSolve_OtherBlades(AM, InputIndex, T) + type(Glue_AeroMap), intent(in) :: AM !< AeroMap data + integer(IntKi), intent(in) :: InputIndex !< Input index to transfer + type(FAST_TurbineType), intent(INOUT) :: T !< Turbine type + integer(IntKi) :: j, k + do k = 2, T%p_FAST%NumBD + do j = 1, T%BD%Input(InputIndex, k)%DistrLoad%NNodes + T%BD%Input(InputIndex, k)%DistrLoad%Force(:, j) = matmul(T%BD%Input(InputIndex, 1)%DistrLoad%Force(:, j), AM%HubOrientation(:, :, k)) + T%BD%Input(InputIndex, k)%DistrLoad%Moment(:, j) = matmul(T%BD%Input(InputIndex, 1)%DistrLoad%Moment(:, j), AM%HubOrientation(:, :, k)) + end do + end do +end subroutine + +!> SS_ED_InputSolve_OtherBlades sets the blade-load ElastoDyn inputs from blade 1 to the other blades. +subroutine SS_ED_InputSolve_OtherBlades(AM, InputIndex, T) + type(Glue_AeroMap), intent(in) :: AM !< AeroMap data + integer(IntKi), intent(in) :: InputIndex !< Input index to transfer + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi) :: j, k + associate (BladePtLoads => T%ED%Input(InputIndex,iED)%BladePtLoads) + do k = 2, size(BladePtLoads, 1) + do j = 1, BladePtLoads(k)%NNodes + BladePtLoads(k)%Force(:, j) = matmul(BladePtLoads(1)%Force(:, j), AM%HubOrientation(:, :, k)) + BladePtLoads(k)%Moment(:, j) = matmul(BladePtLoads(1)%Moment(:, j), AM%HubOrientation(:, :, k)) + end do + end do + end associate +end subroutine + +!> SS_AD_InputSolve sets the blade-motion AeroDyn inputs for Blade 1. +subroutine SS_AD_InputSolve(AM, Mappings, InputIndex, T, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap data + type(MappingType), intent(inout) :: Mappings(:) !< Module mapping + integer(IntKi), intent(in) :: InputIndex !< Input index to transfer + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(OUT) :: ErrStat !< Error status of the operation + character(*), intent(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SS_AD_InputSolve' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = "" + + ! Get blade motion inputs + call FAST_InputSolve(iModAero, AM%Mod%ModData, Mappings, InputIndex, T, ErrStat2, ErrMsg2, AM%Mod%VarMaps) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Set prescribed values for first blade + T%AD%Input(InputIndex)%rotors(1)%BladeMotion(1)%RotationVel = 0.0_ReKi + T%AD%Input(InputIndex)%rotors(1)%BladeMotion(1)%TranslationAcc = 0.0_ReKi + +end subroutine + +!> SS_AD_InputSolve_OtherBlades sets the blade-motion AeroDyn inputs. +subroutine SS_AD_InputSolve_OtherBlades(AM, InputIndex, T) + type(Glue_AeroMap), intent(in) :: AM !< AeroMap data + integer(IntKi), intent(in) :: InputIndex !< Input index to transfer + type(FAST_TurbineType), intent(INOUT) :: T !< Turbine type + integer(IntKi) :: j, k + associate (BladeMotion => T%AD%Input(InputIndex)%rotors(1)%BladeMotion) + do k = 2, size(BladeMotion, 1) + do j = 1, BladeMotion(k)%NNodes + BladeMotion(k)%TranslationDisp(:, j) = matmul(BladeMotion(1)%TranslationDisp(:, j), AM%HubOrientation(:, :, k)) + BladeMotion(k)%Orientation(:, :, j) = matmul(BladeMotion(1)%Orientation(:, :, j), AM%HubOrientation(:, :, k)) + BladeMotion(k)%TranslationVel(:, j) = matmul(BladeMotion(1)%TranslationVel(:, j), AM%HubOrientation(:, :, k)) + end do + end do + end associate +end subroutine + +subroutine SS_CalcContStateDeriv(AM, caseData, InputIndex, dxAry, T, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap data + type(AeroMapCase), intent(in) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case + integer(IntKi), intent(in) :: InputIndex !< Index into input array + real(R8Ki), intent(inout) :: dxAry(:) !< continuous state derivative vector + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat !< Error status + character(*), intent(out) :: ErrMsg !< Error message + + character(*), parameter :: RoutineName = 'SS_CalcContStateDeriv' + integer(IntKi) :: ErrStat2 ! temporary Error status of the operation + character(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None + integer(IntKi) :: i, k + integer(IntKi) :: BldMeshNode + real(R8Ki) :: Omega_Hub(3) + real(R8Ki) :: position(3) + real(R8Ki) :: omega_cross_position(3) + + ErrStat = ErrID_None + ErrMsg = "" + + ! Get the structural continuous state derivative + call FAST_GetOP(AM%Mod%ModData(iModStruct), SS_t_global, InputIndex, STATE_CURR, T, ErrStat2, ErrMsg2, & + dx_op=AM%Mod%ModData(iModStruct)%Lin%dx, dx_glue=dxAry) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Select based on which module is simulating the blades + select case (AM%Mod%ModData(iModStruct)%ID) + + case (Module_ED) ! ElastoDyn + + case (Module_BD) ! BeamDyn + + ! Set hub rotation speed + Omega_Hub = [real(caseData%RotSpeed, R8Ki), 0.0_R8Ki, 0.0_R8Ki] + + ! TODO: Make this work for BeamDyn + ! do K = 1, T%p_FAST%NumBD + + ! call BD_CalcContStateDeriv(SS_t_global, BD%Input(InputIndex, k), BD%p(k), BD%x(k, STATE_CURR), BD%xd(k, STATE_CURR), BD%z(k, STATE_CURR), & + ! BD%OtherSt(k, STATE_CURR), BD%m(k), BD%x(k, STATE_PRED), ErrStat2, ErrMsg2) + ! call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! ! subtract xdot(y) here: + ! ! note that this only works when the BldMotion mesh is on the FE nodes + ! do i = 2, BD%p(k)%node_total ! the first node isn't technically a state + ! BldMeshNode = BD%p(k)%NdIndx(i) + ! position = BD%y(k)%BldMotion%Position(:, BldMeshNode) + BD%y(k)%BldMotion%TranslationDisp(:, BldMeshNode) + ! omega_cross_position = cross_product(Omega_Hub, position) + + ! BD%x(k, STATE_PRED)%q(1:3, i) = BD%x(k, STATE_PRED)%q(1:3, i) - omega_cross_position + ! BD%x(k, STATE_PRED)%q(4:6, i) = BD%x(k, STATE_PRED)%q(4:6, i) - Omega_Hub + ! BD%x(k, STATE_PRED)%dqdt(1:3, i) = BD%x(k, STATE_PRED)%dqdt(1:3, i) - cross_product(Omega_Hub, omega_cross_position) + ! end do + + ! end do + + end select + +end subroutine + +subroutine SS_GetStates(AM, xAry, StateIndex, T, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap data + real(R8Ki), intent(inout) :: xAry(:) !< Array of input packed values + integer(IntKi), intent(in) :: StateIndex !< State array index + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SS_GetStates' + integer(IntKi) :: ErrStat2 ! temporary Error status of the operation + character(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = '' + + ! Loop through modules and get AeroMap states + do i = 1, size(AM%Mod%ModData) + associate (ModData => AM%Mod%ModData(i)) + call FAST_GetOP(ModData, SS_t_global, INPUT_CURR, StateIndex, T, ErrStat2, ErrMsg2, x_op=ModData%Lin%x, x_glue=xAry) + if (Failed()) return + end associate + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +!> SS_GetInputs packs the relevant parts of the modules' inputs for use in the steady-state solver. +subroutine SS_GetInputs(AM, uAry, InputIndex, T, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap module + real(R8Ki), intent(inout) :: uAry(:) !< Array of input packed values + integer(IntKi), intent(in) :: InputIndex !< Input array index + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SS_GetInputs' + integer(IntKi) :: ErrStat2 ! temporary Error status of the operation + character(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None + integer(IntKi) :: i + + ! Loop through modules and get inputs + do i = 1, size(AM%Mod%ModData) + associate (ModData => AM%Mod%ModData(i)) + call FAST_GetOP(ModData, SS_t_global, InputIndex, STATE_CURR, T, ErrStat2, ErrMsg2, u_op=ModData%Lin%u, u_glue=uAry) + if (Failed()) return + end associate + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine SS_GetCalculatedInputs(AM, uAry, Mappings, T, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(inout) :: AM !< AeroMap module + real(R8Ki), intent(inout) :: uAry(:) !< Inputs + type(MappingType), intent(inout) :: Mappings(:) !< Transfer mapping data + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat !< Error status + character(*), intent(out) :: ErrMsg !< Error message + + character(*), parameter :: RoutineName = 'SS_GetCalculatedInputs' + integer(IntKi) :: ErrStat2 ! temporary Error status of the operation + character(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None + + ErrStat = ErrID_None + ErrMsg = "" + + ! Transfer motions to AeroDyn first + call SS_AD_InputSolve(AM, Mappings, INPUT_PREV, T, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Transfer loads to structural solver next + call FAST_InputSolve(iModStruct, AM%Mod%ModData, Mappings, INPUT_PREV, T, ErrStat2, ErrMsg2, AM%Mod%VarMaps) + if (Failed()) return + + ! Pack the transferred inputs into the vector + call SS_GetInputs(AM, uAry, INPUT_PREV, T, ErrStat2, ErrMsg2) + if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine SS_SetPrescribedInputs(caseData, p_FAST, y_FAST, m_FAST, ED, BD, AD) + type(AeroMapCase), intent(in) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case + type(FAST_ParameterType), intent(in) :: p_FAST !< Parameters for the glue code + type(FAST_OutputFileType), intent(inout) :: y_FAST !< Output variables for the glue code + type(FAST_MiscVarType), intent(inout) :: m_FAST !< Miscellaneous variables + + type(ElastoDyn_Data), intent(inout) :: ED !< ElastoDyn data + type(BeamDyn_Data), intent(inout) :: BD !< BeamDyn data + type(AeroDyn_Data), intent(inout) :: AD !< AeroDyn data + + integer(IntKi) :: k + real(R8Ki) :: theta(3) + + ! Set prescribed inputs for all of the modules in the steady-state solve + + ED%Input(1,iED)%TwrAddedMass = 0.0_ReKi + ED%Input(1,iED)%PtfmAddedMass = 0.0_ReKi + + ED%Input(1,iED)%TowerPtLoads%Force = 0.0 + ED%Input(1,iED)%TowerPtLoads%Moment = 0.0 + ED%Input(1,iED)%NacelleLoads%Force = 0.0 + ED%Input(1,iED)%NacelleLoads%Moment = 0.0 + ED%Input(1,iED)%HubPtLoad%Force = 0.0 ! these are from BD, but they don't affect the ED calculations for aeromaps, so set them to 0 + ED%Input(1,iED)%HubPtLoad%Moment = 0.0 ! these are from BD, but they don't affect the ED calculations for aeromaps, so set them to 0 + + ED%Input(1,iED)%BlPitchCom = caseData%Pitch + ED%Input(1,iED)%YawMom = 0.0 + ED%Input(1,iED)%HSSBrTrqC = 0.0 + ED%Input(1,iED)%GenTrq = 0.0 + + ! BeamDyn + if (p_FAST%CompElast == Module_BD) then + + !CALL ED_CalcOutput( 0.0_DbKi, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), ED%y, ED%m, ErrStat2, ErrMsg2 ) + ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + do k = 1, p_FAST%NumBD + BD%Input(1, k)%RootMotion%TranslationDisp = 0.0_ReKi + + theta = EulerExtract(BD%Input(1, k)%RootMotion%RefOrientation(:, :, 1)) + theta(3) = -caseData%Pitch + BD%Input(1, k)%RootMotion%Orientation(:, :, 1) = EulerConstruct(theta) + + BD%Input(1, k)%RootMotion%RotationVel(1, 1) = caseData%RotSpeed !BD%Input(1,k)%RootMotion%RotationVel = ED%y_interp%BladeRootMotion(k)%RotationVel + BD%Input(1, k)%RootMotion%RotationVel(2:3, 1) = 0.0_ReKi + + BD%Input(1, k)%RootMotion%TranslationVel(:, 1) = cross_product(BD%Input(1, k)%RootMotion%RotationVel(:, 1), BD%Input(1, k)%RootMotion%Position(:, 1) - AD%Input(1)%rotors(1)%HubMotion%Position(:, 1)) ! ED%y_interp%BladeRootMotion(k)%TranslationVel + BD%Input(1, k)%RootMotion%TranslationAcc(:, 1) = cross_product(BD%Input(1, k)%RootMotion%RotationVel(:, 1), BD%Input(1, k)%RootMotion%TranslationVel(:, 1)) ! ED%y_interp%BladeRootMotion(k)%TranslationAcc + + BD%Input(1, k)%RootMotion%RotationAcc = 0.0_ReKi + end do ! k=p_FAST%NumBD + + end if ! BeamDyn + !BeamDyn's first "state" is not actually the state. So, do we need to do something with that????? + + !AeroDyn + !note: i'm skipping the (unused) TowerMotion mesh + AD%Input(1)%rotors(1)%HubMotion%TranslationDisp = 0.0 + AD%Input(1)%rotors(1)%HubMotion%Orientation = AD%Input(1)%rotors(1)%HubMotion%RefOrientation + AD%Input(1)%rotors(1)%HubMotion%RotationVel(1, :) = caseData%RotSpeed + AD%Input(1)%rotors(1)%HubMotion%RotationVel(2:3, :) = 0.0_ReKi + + do k = 1, size(AD%Input(1)%rotors(1)%BladeRootMotion, 1) + theta = EulerExtract(AD%Input(1)%rotors(1)%BladeRootMotion(k)%RefOrientation(:, :, 1)) + theta(3) = -caseData%Pitch + AD%Input(1)%rotors(1)%BladeRootMotion(k)%Orientation(:, :, 1) = EulerConstruct(theta) !AD%Input(1)%BladeRootMotion(k)%RefOrientation + + AD%Input(1)%rotors(1)%BladeMotion(k)%RotationVel = 0.0_ReKi + !AD%Input(1)%rotors(1)%BladeMotion(k)%RotationAcc = 0.0_ReKi + AD%Input(1)%rotors(1)%BladeMotion(k)%TranslationAcc = 0.0_ReKi + end do + + ! Set FlowField information -- AD calculates everything from the data stored in the FlowField pointer + AD%p%FlowField%Uniform%VelH(:) = caseData%WindSpeed + AD%p%FlowField%Uniform%LinShrV(:) = 0.0_ReKi + AD%p%FlowField%Uniform%AngleH(:) = 0.0_ReKi + AD%p%FlowField%PropagationDir = 0.0_ReKi + + AD%Input(1)%rotors(1)%UserProp = 0.0_ReKi + +end subroutine + +end module diff --git a/modules/openfast-library/src/FAST_Funcs.f90 b/modules/openfast-library/src/FAST_Funcs.f90 new file mode 100644 index 0000000000..ff46ce942b --- /dev/null +++ b/modules/openfast-library/src/FAST_Funcs.f90 @@ -0,0 +1,2049 @@ +!******************************************************************************* +! FAST_Funcs provides the glue code a uniform interface to module functions. +!............................................................................... +! LICENSING +! Copyright (C) 2024 National Renewable Energy Laboratory +! +! This file is part of FAST. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +!******************************************************************************* +!> This module contains functions for calling module subroutines +module FAST_Funcs + +use FAST_Types +use FAST_ModTypes + +use AeroDisk, only: ADsk_CalcOutput, & + ADsk_UpdateStates, & + ADsk_CalcContStateDeriv, & + ADsk_End + +use AeroDyn, only: AD_JacobianPInput, & + AD_JacobianPContState, & + AD_UpdateStates, & + AD_CalcOutput, & + RotCalcContStateDeriv, & + AD_End, & + AD_VarsPackExtInput + +use BeamDyn, only: BD_JacobianPInput, & + BD_JacobianPContState, & + BD_CalcContStateDeriv, & + BD_UpdateStates, & + BD_CalcOutput, & + BD_End + +use ElastoDyn, only: ED_JacobianPInput, & + ED_JacobianPContState, & + ED_CalcContStateDeriv, & + ED_UpdateStates, & + ED_CalcOutput, & + ED_End, & + ED_PackExtInputAry + +! use ExternalInflow_Types, only: ExtInfw_Input_ExtrapInterp +! use ExternalInflow, only: Extifw_up + +use ExtLoads, only: ExtLd_CalcOutput, & + ExtLd_End + +use ExtPtfm_MCKF, only: ExtPtfm_JacobianPInput, & + ExtPtfm_JacobianPContState, & + ExtPtfm_CalcContStateDeriv, & + ExtPtfm_CalcOutput, & + ExtPtfm_UpdateStates, & + ExtPtfm_End + +use FEAMooring, only: FEAM_CalcOutput, & + FEAM_UpdateStates, & + FEAM_End + +use HydroDyn, only: HD_JacobianPInput, & + HD_JacobianPContState, & + HD_PackExtInputAry, & + HydroDyn_CalcContStateDeriv, & + HydroDyn_CalcOutput, & + HydroDyn_UpdateStates, & + HydroDyn_End + +use IceDyn, only: IceD_CalcOutput, & + IceD_UpdateStates, & + IceD_End + +use IceFloe, only: IceFloe_CalcOutput, & + IceFloe_UpdateStates, & + IceFloe_End + +use InflowWind, only: InflowWind_JacobianPInput, & + InflowWind_JacobianPContState, & + InflowWind_PackExtInputAry, & + InflowWind_PackExtOutputAry, & + InflowWind_CalcOutput, & + InflowWind_End + +use MAP, only: MAP_JacobianPInput, & + MAP_CalcOutput, & + MAP_UpdateStates, & + MAP_End + +use MoorDyn, only: MD_JacobianPInput, & + MD_JacobianPContState, & + MD_CalcContStateDeriv, & + MD_UpdateStates, & + MD_CalcOutput, & + MD_End + +use OrcaFlexInterface, only: Orca_CalcOutput, & + Orca_UpdateStates, & + Orca_End + +use SeaState, only: SeaSt_JacobianPInput, & + SeaSt_JacobianPContState, & + SeaSt_PackExtInputAry, & + SeaSt_PackExtOutputAry, & + SeaSt_CalcOutput, & + SeaSt_UpdateStates, & + SeaSt_End + +use SED, only: SED_JacobianPInput, & + SED_JacobianPContState, & + SED_CalcContStateDeriv, & + SED_UpdateStates, & + SED_CalcOutput, & + SED_End + +use ServoDyn, only: SrvD_JacobianPInput, & + SrvD_JacobianPContState, & + SrvD_CalcContStateDeriv, & + SrvD_CalcOutput, & + SrvD_UpdateStates, & + SrvD_End + +use SubDyn, only: SD_JacobianPInput, & + SD_JacobianPContState, & + SD_CalcContStateDeriv, & + SD_UpdateStates, & + SD_CalcOutput, & + SD_End + +use SoilDyn, only: SlD_UpdateStates, & + SlD_CalcOutput, & + SlD_End + +implicit none + +private + +public :: FAST_InitInputStateArrays, & + FAST_GetOP, & + FAST_SetOP, & + FAST_CopyInput, & + FAST_CopyStates, & + FAST_UpdateStates, & + FAST_CalcOutput, & + FAST_ModEnd, & + FAST_ExtrapInterp, & + FAST_JacobianPContState, & + FAST_JacobianPInput + +contains + +subroutine FAST_ExtrapInterp(ModData, t_global_next, T, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: ModData !< Module data + real(DbKi), intent(in) :: t_global_next !< next global time step (t + dt), at which we're extrapolating inputs (and ED outputs) + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_ExtrapInterp' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j + + ErrStat = ErrID_None + ErrMsg = '' + + ! Select based on module ID + select case (ModData%ID) + + case (Module_AD) + if (ModData%Ins == 1) then + call AD_Input_ExtrapInterp(T%AD%Input(1:), T%AD%InputTimes, T%AD%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call AD_CopyInput(T%AD%Input(j), T%AD%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%AD%InputTimes) + else + ErrStat2 = ErrID_None + ErrMsg2 = '' + end if + + case (Module_ADsk) + call ADsk_Input_ExtrapInterp(T%ADsk%Input(1:), T%ADsk%InputTimes, T%ADsk%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call ADsk_CopyInput(T%ADsk%Input(j), T%ADsk%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%ADsk%InputTimes) + + case (Module_BD) + call BD_Input_ExtrapInterp(T%BD%Input(1:, ModData%Ins), T%BD%InputTimes(:, ModData%Ins), T%BD%Input(INPUT_TEMP, ModData%Ins), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call BD_CopyInput(T%BD%Input(j, ModData%Ins), T%BD%Input(j + 1, ModData%Ins), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%BD%InputTimes(:, ModData%Ins)) + + case (Module_ED) + call ED_Input_ExtrapInterp(T%ED%Input(1:, ModData%Ins), T%ED%InputTimes(:, ModData%Ins), T%ED%Input(INPUT_TEMP, ModData%Ins), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call ED_CopyInput(T%ED%Input(j, ModData%Ins), T%ED%Input(j + 1, ModData%Ins), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%ED%InputTimes(:, ModData%Ins)) + + case (Module_SED) + call SED_Input_ExtrapInterp(T%SED%Input(1:), T%SED%InputTimes, T%SED%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call SED_CopyInput(T%SED%Input(j), T%SED%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%SED%InputTimes) + + case (Module_ExtInfw) + ! Not used + + case (Module_ExtLd) + ! Not used + + case (Module_ExtPtfm) + call ExtPtfm_Input_ExtrapInterp(T%ExtPtfm%Input(1:), T%ExtPtfm%InputTimes, T%ExtPtfm%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call ExtPtfm_CopyInput(T%ExtPtfm%Input(j), T%ExtPtfm%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%ExtPtfm%InputTimes) + + case (Module_FEAM) + call FEAM_Input_ExtrapInterp(T%FEAM%Input(1:), T%FEAM%InputTimes, T%FEAM%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call FEAM_CopyInput(T%FEAM%Input(j), T%FEAM%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%FEAM%InputTimes) + + case (Module_HD) + call HydroDyn_Input_ExtrapInterp(T%HD%Input(1:), T%HD%InputTimes, T%HD%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call HydroDyn_CopyInput(T%HD%Input(j), T%HD%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%HD%InputTimes) + + case (Module_IceD) + call IceD_Input_ExtrapInterp(T%IceD%Input(1:, ModData%Ins), T%IceD%InputTimes(:, ModData%Ins), T%IceD%Input(INPUT_TEMP, ModData%Ins), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call IceD_CopyInput(T%IceD%Input(j, ModData%Ins), T%IceD%Input(j + 1, ModData%Ins), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%IceD%InputTimes(:, ModData%Ins)) + + case (Module_IceF) + call IceFloe_Input_ExtrapInterp(T%IceF%Input(1:), T%IceF%InputTimes, T%IceF%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call IceFloe_CopyInput(T%IceF%Input(j), T%IceF%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%IceF%InputTimes) + + case (Module_IfW) + call InflowWind_Input_ExtrapInterp(T%IfW%Input(1:), T%IfW%InputTimes, T%IfW%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call InflowWind_CopyInput(T%IfW%Input(j), T%IfW%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%IfW%InputTimes) + + case (Module_MAP) + call MAP_Input_ExtrapInterp(T%MAP%Input(1:), T%MAP%InputTimes, T%MAP%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call MAP_CopyInput(T%MAP%Input(j), T%MAP%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%MAP%InputTimes) + + case (Module_MD) + call MD_Input_ExtrapInterp(T%MD%Input(1:), T%MD%InputTimes, T%MD%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call MD_CopyInput(T%MD%Input(j), T%MD%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%MD%InputTimes) + + case (Module_Orca) + call Orca_Input_ExtrapInterp(T%Orca%Input(1:), T%Orca%InputTimes, T%Orca%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call Orca_CopyInput(T%Orca%Input(j), T%Orca%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%Orca%InputTimes) + + case (Module_SD) + call SD_Input_ExtrapInterp(T%SD%Input(1:), T%SD%InputTimes, T%SD%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call SD_CopyInput(T%SD%Input(j), T%SD%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%SD%InputTimes) + + case (Module_SlD) + call SlD_Input_ExtrapInterp(T%SlD%Input(1:), T%SlD%InputTimes, T%SlD%Input(INPUT_TEMP), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call SlD_CopyInput(T%SlD%Input(j), T%SlD%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%SlD%InputTimes) + + case (Module_SeaSt) + ! call SeaSt_Input_ExtrapInterp(T%SeaSt%Input(1:), T%SeaSt%InputTimes, T%SeaSt%u, t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + ! do j = T%p_FAST%InterpOrder, 1, -1 + ! call SeaSt_CopyInput(T%SeaSt%Input(j), T%SeaSt%Input(j + 1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + ! T%SeaSt%InputTimes(j + 1) = T%SeaSt%InputTimes(j) + ! end do + ! call SeaSt_CopyInput(T%SeaSt%u, T%SeaSt%Input(1), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + ! T%SeaSt%InputTimes(1) = t_global_next + + case (Module_SrvD) + call SrvD_Input_ExtrapInterp(T%SrvD%Input(1:, ModData%Ins), T%SrvD%InputTimes(:, ModData%Ins), T%SrvD%Input(INPUT_TEMP, ModData%Ins), t_global_next, ErrStat2, ErrMsg2); if (Failed()) return + do j = T%p_FAST%InterpOrder, 0, -1 + call SrvD_CopyInput(T%SrvD%Input(j, ModData%Ins), T%SrvD%Input(j + 1, ModData%Ins), MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + end do + call ShiftInputTimes(T%SrvD%InputTimes(:, ModData%Ins)) + + case default + call SetErrStat(ErrID_Fatal, "Unknown module: "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + +contains + subroutine ShiftInputTimes(InputTimes) + real(R8Ki) :: InputTimes(:) + integer(IntKi) :: k + do j = T%p_FAST%InterpOrder, 1, -1 + InputTimes(j + 1) = InputTimes(j) + end do + InputTimes(1) = t_global_next + end subroutine + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine FAST_InitInputStateArrays(ModAry, ThisTime, DT, T, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: ModAry(:) !< Module data + real(DbKi), intent(in) :: ThisTime !< Initial simulation time (almost always 0) + real(DbKi), intent(in) :: DT !< Glue code time step size + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_InitInputStateArrays' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + real(DbKi) :: t_global_next ! Simulation time for computing outputs + real(DbKi), allocatable :: InputTimes(:) ! Input times array + integer(IntKi) :: i, j, k + + ErrStat = ErrID_None + ErrMsg = '' + + ! Calculate input times array + InputTimes = ThisTime - DT*[(k, k=0, T%p_FAST%InterpOrder)] + + ! Loop through modules + do i = 1, size(ModAry) + associate (ModData => ModAry(i)) + + ! Copy state from current (1) to predicted (2), saved current (3), and saved predicted (4) + do k = 2, 4 + call FAST_CopyStates(ModData, T, STATE_CURR, k, MESH_NEWCOPY, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + ! Copy input from current to interpolation locations + do k = 2, T%p_FAST%InterpOrder + 1 + call FAST_CopyInput(ModData, T, INPUT_CURR, k, MESH_NEWCOPY, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + ! Copy input from current to temporary location + call FAST_CopyInput(ModData, T, INPUT_CURR, INPUT_TEMP, MESH_NEWCOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Select based on module ID + select case (ModData%ID) + case (Module_AD) + T%AD%InputTimes = InputTimes + case (Module_ADsk) + T%ADsk%InputTimes = InputTimes + case (Module_BD) + T%BD%InputTimes(:, ModData%Ins) = InputTimes + case (Module_ED) + T%ED%InputTimes(:, ModData%Ins) = InputTimes + case (Module_SED) + T%SED%InputTimes = InputTimes + case (Module_ExtPtfm) + T%ExtPtfm%InputTimes = InputTimes + case (Module_FEAM) + case (Module_HD) + T%HD%InputTimes = InputTimes + case (Module_IceD) + T%IceD%InputTimes(:, ModData%Ins) = InputTimes + case (Module_IceF) + T%IceF%InputTimes = InputTimes + case (Module_IfW) + T%IfW%InputTimes = InputTimes + case (Module_MAP) + T%MAP%InputTimes = InputTimes + case (Module_MD) + T%MD%InputTimes = InputTimes + case (Module_ExtInfw) + ! T%ExtInfw%InputTimes = InputTimes + case (Module_ExtLd) + ! T%ExtLd%InputTimes = InputTimes + case (Module_Orca) + T%Orca%InputTimes = InputTimes + case (Module_SD) + T%SD%InputTimes = InputTimes + case (Module_SeaSt) + T%SeaSt%InputTimes = InputTimes + case (Module_SlD) + T%SlD%InputTimes = InputTimes + case (Module_SrvD) + T%SrvD%InputTimes(:, ModData%Ins) = InputTimes + case default + call SetErrStat(ErrID_Fatal, "Unknown module "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + end associate + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine FAST_UpdateStates(ModData, t_initial, n_t_global, T, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: ModData !< Module data + real(DbKi), intent(in) :: t_initial !< Initial simulation time (almost always 0) + integer(IntKi), intent(in) :: n_t_global !< Integer time step + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_UpdateStates' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j + integer(IntKi) :: j_ss ! substep loop counter + integer(IntKi) :: n_t_module ! simulation time step, loop counter for individual modules + real(DbKi) :: t_module ! Current simulation time for module + + ErrStat = ErrID_None + ErrMsg = '' + + ! Select based on module ID + select case (ModData%ID) + + case (Module_AD) + if (ModData%Ins == 1) then + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call AD_UpdateStates(t_module, n_t_module, T%AD%Input(1:), T%AD%InputTimes, & + T%AD%p, T%AD%x(STATE_PRED), T%AD%xd(STATE_PRED), & + T%AD%z(STATE_PRED), T%AD%OtherSt(STATE_PRED), & + T%AD%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + else + ErrStat2 = ErrID_None + ErrMsg2 = '' + end if + + case (Module_ADsk) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call ADsk_UpdateStates(t_module, n_t_module, T%ADsk%Input(1:), T%ADsk%InputTimes, & + T%ADsk%p, T%ADsk%x(STATE_PRED), T%ADsk%xd(STATE_PRED), & + T%ADsk%z(STATE_PRED), T%ADsk%OtherSt(STATE_PRED), & + T%ADsk%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_BD) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call BD_UpdateStates(t_module, n_t_module, T%BD%Input(1:,ModData%Ins), T%BD%InputTimes(:,ModData%Ins), T%BD%p(ModData%Ins), & + T%BD%x(ModData%Ins, STATE_PRED), T%BD%xd(ModData%Ins, STATE_PRED), & + T%BD%z(ModData%Ins, STATE_PRED), T%BD%OtherSt(ModData%Ins, STATE_PRED), & + T%BD%m(ModData%Ins), ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_ED) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call ED_UpdateStates(t_module, n_t_module, T%ED%Input(1:,ModData%Ins), T%ED%InputTimes(:,ModData%Ins), T%ED%p(ModData%Ins), & + T%ED%x(ModData%Ins, STATE_PRED), T%ED%xd(ModData%Ins, STATE_PRED), & + T%ED%z(ModData%Ins, STATE_PRED), T%ED%OtherSt(ModData%Ins, STATE_PRED), & + T%ED%m(ModData%Ins), ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_SED) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call SED_UpdateStates(t_module, n_t_module, T%SED%Input(1:), T%SED%InputTimes, & + T%SED%p, T%SED%x(STATE_PRED), T%SED%xd(STATE_PRED), & + T%SED%z(STATE_PRED), T%SED%OtherSt(STATE_PRED), & + T%SED%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_ExtLd) + ! Not used + + case (Module_ExtInfw) + ! Not used + + case (Module_ExtPtfm) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call ExtPtfm_UpdateStates(t_module, n_t_module, T%ExtPtfm%Input(1:), T%ExtPtfm%InputTimes, & + T%ExtPtfm%p, T%ExtPtfm%x(STATE_PRED), T%ExtPtfm%xd(STATE_PRED), & + T%ExtPtfm%z(STATE_PRED), T%ExtPtfm%OtherSt(STATE_PRED), & + T%ExtPtfm%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_FEAM) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call FEAM_UpdateStates(t_module, n_t_module, T%FEAM%Input(1:), T%FEAM%InputTimes, T%FEAM%p, & + T%FEAM%x(STATE_PRED), T%FEAM%xd(STATE_PRED), & + T%FEAM%z(STATE_PRED), T%FEAM%OtherSt(STATE_PRED), & + T%FEAM%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_HD) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call HydroDyn_UpdateStates(t_module, n_t_module, T%HD%Input(1:), T%HD%InputTimes, T%HD%p, & + T%HD%x(STATE_PRED), T%HD%xd(STATE_PRED), & + T%HD%z(STATE_PRED), T%HD%OtherSt(STATE_PRED), & + T%HD%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_IceD) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call IceD_UpdateStates(t_module, n_t_module, T%IceD%Input(1:, ModData%Ins), & + T%IceD%InputTimes(1:, ModData%Ins), T%IceD%p(ModData%Ins), & + T%IceD%x(ModData%Ins, STATE_PRED), T%IceD%xd(ModData%Ins, STATE_PRED), & + T%IceD%z(ModData%Ins, STATE_PRED), T%IceD%OtherSt(ModData%Ins, STATE_PRED), & + T%IceD%m(ModData%Ins), ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_IceF) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call IceFloe_UpdateStates(t_module, n_t_module, T%IceF%Input(1:), T%IceF%InputTimes, T%IceF%p, & + T%IceF%x(STATE_PRED), T%IceF%xd(STATE_PRED), & + T%IceF%z(STATE_PRED), T%IceF%OtherSt(STATE_PRED), & + T%IceF%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_IfW) + ! InflowWind does not have states + + case (Module_MAP) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call MAP_UpdateStates(t_module, n_t_module, T%MAP%Input(1:), T%MAP%InputTimes, T%MAP%p, & + T%MAP%x(STATE_PRED), T%MAP%xd(STATE_PRED), & + T%MAP%z(STATE_PRED), T%MAP%OtherSt, & + ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_MD) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call MD_UpdateStates(t_module, n_t_module, T%MD%Input(1:), T%MD%InputTimes, T%MD%p, & + T%MD%x(STATE_PRED), T%MD%xd(STATE_PRED), & + T%MD%z(STATE_PRED), T%MD%OtherSt(STATE_PRED), & + T%MD%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_Orca) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call Orca_UpdateStates(t_module, n_t_module, T%Orca%Input(1:), T%Orca%InputTimes, T%Orca%p, & + T%Orca%x(STATE_PRED), T%Orca%xd(STATE_PRED), & + T%Orca%z(STATE_PRED), T%Orca%OtherSt(STATE_PRED), & + T%Orca%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_SD) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call SD_UpdateStates(t_module, n_t_module, T%SD%Input(1:), T%SD%InputTimes, T%SD%p, & + T%SD%x(STATE_PRED), T%SD%xd(STATE_PRED), & + T%SD%z(STATE_PRED), T%SD%OtherSt(STATE_PRED), & + T%SD%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_SeaSt) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call SeaSt_UpdateStates(t_module, n_t_module, T%SeaSt%Input(1:), T%SeaSt%InputTimes, T%SeaSt%p, & + T%SeaSt%x(STATE_PRED), T%SeaSt%xd(STATE_PRED), & + T%SeaSt%z(STATE_PRED), T%SeaSt%OtherSt(STATE_PRED), & + T%SeaSt%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_SlD) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call SlD_UpdateStates(t_module, n_t_module, T%SlD%Input(1:), T%SlD%InputTimes, T%SlD%p, & + T%SlD%x(STATE_PRED), T%SlD%xd(STATE_PRED), & + T%SlD%z(STATE_PRED), T%SlD%OtherSt(STATE_PRED), & + T%SlD%m, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case (Module_SrvD) + call FAST_CopyStates(ModData, T, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + do j_ss = 1, ModData%SubSteps + n_t_module = n_t_global*ModData%SubSteps + j_ss - 1 + t_module = n_t_module*ModData%DT + t_initial + call SrvD_UpdateStates(t_module, n_t_module, T%SrvD%Input(1:,ModData%Ins), T%SrvD%InputTimes(:,ModData%Ins), T%SrvD%p(ModData%Ins), & + T%SrvD%x(ModData%Ins, STATE_PRED), T%SrvD%xd(ModData%Ins, STATE_PRED), & + T%SrvD%z(ModData%Ins, STATE_PRED), T%SrvD%OtherSt(ModData%Ins, STATE_PRED), & + T%SrvD%m(ModData%Ins), ErrStat2, ErrMsg2) + if (Failed()) return + end do + + case default + call SetErrStat(ErrID_Fatal, "Unknown module: "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine FAST_CalcOutput(ModData, Mappings, ThisTime, iInput, iState, T, ErrStat, ErrMsg, CalcWriteOutput) + type(ModDataType), intent(in) :: ModData !< Module data + type(MappingType), intent(inout) :: Mappings(:) !< Output->Input mappings + real(DbKi), intent(in) :: ThisTime !< Time + integer(IntKi), intent(in) :: iInput !< Input index + integer(IntKi), intent(in) :: iState !< State index + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + logical, optional, intent(in) :: CalcWriteOutput !< Flag to calculate data for write output + + character(*), parameter :: RoutineName = 'FAST_CalcOutput' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + logical :: CalcWriteOutputLoc + + ErrStat = ErrID_None + ErrMsg = '' + + if (present(CalcWriteOutput)) then + CalcWriteOutputLoc = CalcWriteOutput + else + CalcWriteOutputLoc = .true. + end if + + ! Select based on module ID + select case (ModData%ID) + + case (Module_AD) + ! Call CalcOutput on first instance, calculation is for all rotors + if (ModData%Ins == 1) then + call AD_CalcOutput(ThisTime, T%AD%Input(iInput), T%AD%p, & + T%AD%x(iState), T%AD%xd(iState), T%AD%z(iState), T%AD%OtherSt(iState), & + T%AD%y, T%AD%m, ErrStat2, ErrMsg2, CalcWriteOutput) + else + ErrStat2 = ErrID_None + ErrMsg2 = '' + end if + + case (Module_ADsK) + call ADsK_CalcOutput(ThisTime, T%ADsK%Input(iInput), T%ADsK%p, & + T%ADsK%x(iState), T%ADsK%xd(iState), T%ADsK%z(iState), T%ADsK%OtherSt(iState), & + T%ADsK%y, T%ADsK%m, ErrStat2, ErrMsg2, CalcWriteOutput) + + case (Module_BD) + call BD_CalcOutput(ThisTime, T%BD%Input(iInput, ModData%Ins), T%BD%p(ModData%Ins), & + T%BD%x(ModData%Ins, iState), T%BD%xd(ModData%Ins, iState), & + T%BD%z(ModData%Ins, iState), T%BD%OtherSt(ModData%Ins, iState), & + T%BD%y(ModData%Ins), T%BD%m(ModData%Ins), ErrStat2, ErrMsg2, CalcWriteOutput) + + case (Module_ED) + call ED_CalcOutput(ThisTime, T%ED%Input(iInput, ModData%Ins), T%ED%p(ModData%Ins), & + T%ED%x(ModData%Ins, iState), T%ED%xd(ModData%Ins, iState), & + T%ED%z(ModData%Ins, iState), T%ED%OtherSt(ModData%Ins, iState), & + T%ED%y(ModData%Ins), T%ED%m(ModData%Ins), ErrStat2, ErrMsg2) + + case (Module_SED) + call SED_CalcOutput(ThisTime, T%SED%Input(iInput), T%SED%p, & + T%SED%x(iState), T%SED%xd(iState), T%SED%z(iState), T%SED%OtherSt(iState), & + T%SED%y, T%SED%m, ErrStat2, ErrMsg2) + + case (Module_ExtLd) + call ExtLd_CalcOutput(ThisTime, T%ExtLd%u, T%ExtLd%p, & + T%ExtLd%x(iState), T%ExtLd%xd(iState), T%ExtLd%z(iState), T%ExtLd%OtherSt(iState), & + T%ExtLd%y, T%ExtLd%m, ErrStat2, ErrMsg2) + + case (Module_ExtPtfm) + call ExtPtfm_CalcOutput(ThisTime, T%ExtPtfm%Input(iInput), T%ExtPtfm%p, & + T%ExtPtfm%x(iState), T%ExtPtfm%xd(iState), T%ExtPtfm%z(iState), T%ExtPtfm%OtherSt(iState), & + T%ExtPtfm%y, T%ExtPtfm%m, ErrStat2, ErrMsg2) + + case (Module_FEAM) + call FEAM_CalcOutput(ThisTime, T%FEAM%Input(iInput), T%FEAM%p, & + T%FEAM%x(iState), T%FEAM%xd(iState), T%FEAM%z(iState), T%FEAM%OtherSt(iState), & + T%FEAM%y, T%FEAM%m, ErrStat2, ErrMsg2) + + case (Module_HD) + call HydroDyn_CalcOutput(ThisTime, T%HD%Input(iInput), T%HD%p, & + T%HD%x(iState), T%HD%xd(iState), T%HD%z(iState), T%HD%OtherSt(iState), & + T%HD%y, T%HD%m, ErrStat2, ErrMsg2) + + case (Module_IceD) + call IceD_CalcOutput(ThisTime, T%IceD%Input(iInput, ModData%Ins), T%IceD%p(ModData%Ins), & + T%IceD%x(ModData%Ins, iState), T%IceD%xd(ModData%Ins, iState), & + T%IceD%z(ModData%Ins, iState), T%IceD%OtherSt(ModData%Ins, iState), & + T%IceD%y(ModData%Ins), T%IceD%m(ModData%Ins), ErrStat2, ErrMsg2) + + case (Module_IceF) + call IceFloe_CalcOutput(ThisTime, T%IceF%Input(iInput), T%IceF%p, & + T%IceF%x(iState), T%IceF%xd(iState), T%IceF%z(iState), T%IceF%OtherSt(iState), & + T%IceF%y, T%IceF%m, ErrStat2, ErrMsg2) + + case (Module_IfW) + call InflowWind_CalcOutput(ThisTime, T%IfW%Input(iInput), T%IfW%p, & + T%IfW%x(iState), T%IfW%xd(iState), T%IfW%z(iState), T%IfW%OtherSt(iState), & + T%IfW%y, T%IfW%m, ErrStat2, ErrMsg2) + + case (Module_MAP) + call MAP_CalcOutput(ThisTime, T%MAP%Input(iInput), T%MAP%p, & + T%MAP%x(iState), T%MAP%xd(iState), T%MAP%z(iState), T%MAP%OtherSt, & + T%MAP%y, ErrStat2, ErrMsg2) + + case (Module_MD) + call MD_CalcOutput(ThisTime, T%MD%Input(iInput), T%MD%p, & + T%MD%x(iState), T%MD%xd(iState), T%MD%z(iState), T%MD%OtherSt(iState), & + T%MD%y, T%MD%m, ErrStat2, ErrMsg2) + + case (Module_Orca) + call Orca_CalcOutput(ThisTime, T%Orca%Input(iInput), T%Orca%p, & + T%Orca%x(iState), T%Orca%xd(iState), T%Orca%z(iState), T%Orca%OtherSt(iState), & + T%Orca%y, T%Orca%m, ErrStat2, ErrMsg2) + + case (Module_SD) + call SD_CalcOutput(ThisTime, T%SD%Input(iInput), T%SD%p, & + T%SD%x(iState), T%SD%xd(iState), T%SD%z(iState), T%SD%OtherSt(iState), & + T%SD%y, T%SD%m, ErrStat2, ErrMsg2) + + case (Module_SeaSt) + call SeaSt_CalcOutput(ThisTime, T%SeaSt%Input(iInput), T%SeaSt%p, & + T%SeaSt%x(iState), T%SeaSt%xd(iState), T%SeaSt%z(iState), T%SeaSt%OtherSt(iState), & + T%SeaSt%y, T%SeaSt%m, ErrStat2, ErrMsg2) + + case (Module_SlD) + call SlD_CalcOutput(ThisTime, T%SlD%Input(iInput), T%SlD%p, & + T%SlD%x(iState), T%SlD%xd(iState), T%SlD%z(iState), T%SlD%OtherSt(iState), & + T%SlD%y, T%SlD%m, ErrStat2, ErrMsg2) + + case (Module_SrvD) + call SrvD_CalcOutput(ThisTime, T%SrvD%Input(iInput,ModData%Ins), T%SrvD%p(ModData%Ins), & + T%SrvD%x(ModData%Ins,iState), T%SrvD%xd(ModData%Ins,iState), T%SrvD%z(ModData%Ins,iState), T%SrvD%OtherSt(ModData%Ins,iState), & + T%SrvD%y(ModData%Ins), T%SrvD%m(ModData%Ins), ErrStat2, ErrMsg2) + + case default + call SetErrStat(ErrID_Fatal, "Unknown module: "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + + ! Check for errors during calc output call + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + ! Set ready flag in mappings where this module is the source + do i = 1, size(Mappings) + if (Mappings(i)%iModSrc == ModData%iMod) Mappings(i)%Ready = .true. + end do + +end subroutine + +subroutine FAST_GetOP(ModData, ThisTime, iInput, iState, T, ErrStat, ErrMsg, & + u_op, y_op, x_op, dx_op, z_op, u_glue, y_glue, x_glue, dx_glue, z_glue) + use AeroDyn, only: AD_CalcWind_Rotor + type(ModDataType), intent(in) :: ModData !< Module information + real(DbKi), intent(in) :: ThisTime !< Time + integer(IntKi), intent(in) :: iInput !< Input index + integer(IntKi), intent(in) :: iState !< State index + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + real(R8Ki), allocatable, optional, intent(inout) :: u_op(:) !< values of linearized inputs + real(R8Ki), allocatable, optional, intent(inout) :: y_op(:) !< values of linearized outputs + real(R8Ki), allocatable, optional, intent(inout) :: x_op(:) !< values of linearized continuous states + real(R8Ki), allocatable, optional, intent(inout) :: dx_op(:) !< values of first time derivatives of linearized continuous states + real(R8Ki), allocatable, optional, intent(inout) :: z_op(:) !< values of linearized constraint states + real(R8Ki), optional, intent(inout) :: u_glue(:) + real(R8Ki), optional, intent(inout) :: y_glue(:) + real(R8Ki), optional, intent(inout) :: x_glue(:) + real(R8Ki), optional, intent(inout) :: dx_glue(:) + real(R8Ki), optional, intent(inout) :: z_glue(:) + + character(*), parameter :: RoutineName = 'FAST_GetOP' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = '' + + ! If inputs are requested + if (present(u_op) .and. (ModData%Vars%Nu > 0)) then + + if (.not. allocated(u_op)) then + call AllocAry(u_op, ModData%Vars%Nu, "u_op", ErrStat2, ErrMsg2) + if (Failed()) return + end if + + ! Select based on module ID + select case (ModData%ID) + case (Module_AD) + call AD_VarsPackInput(ModData%Vars, T%AD%Input(iInput)%rotors(ModData%Ins), u_op) + call AD_VarsPackExtInput(ModData%Vars, ThisTime, T%AD%p, u_op) + case (Module_ADsk) + call ADsk_VarsPackInput(ModData%Vars, T%ADsk%Input(iInput), u_op) + case (Module_BD) + call BD_VarsPackInput(ModData%Vars, T%BD%Input(iInput, ModData%Ins), u_op) + case (Module_ED) + call ED_VarsPackInput(ModData%Vars, T%ED%Input(iInput, ModData%Ins), u_op) + call ED_PackExtInputAry(ModData%Vars, T%ED%Input(iInput, ModData%Ins), u_op, ErrStat2, ErrMsg2); if (Failed()) return + case (Module_SED) + call SED_VarsPackInput(ModData%Vars, T%SED%Input(iInput), u_op) + case (Module_ExtPtfm) + call ExtPtfm_VarsPackInput(ModData%Vars, T%ExtPtfm%Input(iInput), u_op) + case (Module_FEAM) + call FEAM_VarsPackInput(ModData%Vars, T%FEAM%Input(iInput), u_op) + case (Module_HD) + call HydroDyn_VarsPackInput(ModData%Vars, T%HD%Input(iInput), u_op) + call HD_PackExtInputAry(ModData%Vars, T%HD%Input(iInput), u_op) + case (Module_IceD) + call IceD_VarsPackInput(ModData%Vars, T%IceD%Input(iInput, ModData%Ins), u_op) + case (Module_IceF) + call IceFloe_VarsPackInput(ModData%Vars, T%IceF%Input(iInput), u_op) + case (Module_IfW) + call InflowWind_VarsPackInput(ModData%Vars, T%IfW%Input(iInput), u_op) + call InflowWind_PackExtInputAry(ModData%Vars, ThisTime, T%IfW%p, u_op) + case (Module_MAP) + call MAP_VarsPackInput(ModData%Vars, T%MAP%Input(iInput), u_op) + case (Module_MD) + call MD_VarsPackInput(ModData%Vars, T%MD%Input(iInput), u_op) + case (Module_ExtInfw) + ! call ExtInfw_VarsPackInput(ModData%Vars, T%ExtInfw%Input(iIndex), u_op) + case (Module_Orca) + call Orca_VarsPackInput(ModData%Vars, T%Orca%Input(iInput), u_op) + case (Module_SD) + call SD_VarsPackInput(ModData%Vars, T%SD%Input(iInput), u_op) + case (Module_SeaSt) + call SeaSt_VarsPackInput(ModData%Vars, T%SeaSt%Input(iInput), u_op) + call SeaSt_PackExtInputAry(ModData%Vars, T%SeaSt%Input(iInput), u_op) + case (Module_SrvD) + call SrvD_VarsPackInput(ModData%Vars, T%SrvD%Input(iInput,ModData%Ins), u_op) + case default + call SetErrStat(ErrID_Fatal, "Input unsupported module: "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + + ! If glue array is present, transfer from module to glue + if (present(u_glue)) call XfrLocToGluAry(ModData%Vars%u, u_op, u_glue) + end if + + ! If outputs are requested + if (present(y_op) .and. (ModData%Vars%Ny > 0)) then + + if (.not. allocated(y_op)) then + call AllocAry(y_op, ModData%Vars%Ny, "y_op", ErrStat2, ErrMsg2) + if (Failed()) return + end if + + ! Select based on module ID + select case (ModData%ID) + case (Module_AD) + call AD_VarsPackOutput(ModData%Vars, T%AD%y%rotors(ModData%Ins), y_op) + case (Module_ADsk) + call ADsk_VarsPackOutput(ModData%Vars, T%ADsk%y, y_op) + case (Module_BD) + call BD_VarsPackOutput(ModData%Vars, T%BD%y(ModData%Ins), y_op) + case (Module_ED) + call ED_VarsPackOutput(ModData%Vars, T%ED%y(ModData%Ins), y_op) + case (Module_SED) + call SED_VarsPackOutput(ModData%Vars, T%SED%y, y_op) + case (Module_ExtPtfm) + call ExtPtfm_VarsPackOutput(ModData%Vars, T%ExtPtfm%y, y_op) + case (Module_FEAM) + call FEAM_VarsPackOutput(ModData%Vars, T%FEAM%y, y_op) + case (Module_HD) + call HydroDyn_VarsPackOutput(ModData%Vars, T%HD%y, y_op) + case (Module_IceD) + call IceD_VarsPackOutput(ModData%Vars, T%IceD%y(ModData%Ins), y_op) + case (Module_IceF) + call IceFloe_VarsPackOutput(ModData%Vars, T%IceF%y, y_op) + case (Module_IfW) + call InflowWind_VarsPackOutput(ModData%Vars, T%IfW%y, y_op) + call InflowWind_PackExtOutputAry(ModData%Vars, ThisTime, T%IfW%p, y_op) + case (Module_MAP) + call MAP_VarsPackOutput(ModData%Vars, T%MAP%y, y_op) + case (Module_MD) + call MD_VarsPackOutput(ModData%Vars, T%MD%y, y_op) + case (Module_ExtInfw) + call ExtInfw_VarsPackOutput(ModData%Vars, T%ExtInfw%y, y_op) + case (Module_Orca) + call Orca_VarsPackOutput(ModData%Vars, T%Orca%y, y_op) + case (Module_SD) + call SD_VarsPackOutput(ModData%Vars, T%SD%y, y_op) + case (Module_SeaSt) + call SeaSt_PackExtOutputAry(ModData%Vars, T%SeaSt%y, y_op) + call SeaSt_VarsPackOutput(ModData%Vars, T%SeaSt%y, y_op) + case (Module_SrvD) + call SrvD_VarsPackOutput(ModData%Vars, T%SrvD%y(ModData%Ins), y_op) + case default + call SetErrStat(ErrID_Fatal, "Output unsupported module: "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + + ! If glue array is present, transfer from module to glue + if (present(y_glue)) call XfrLocToGluAry(ModData%Vars%y, y_op, y_glue) + end if + + ! If continuous states are requested + if (present(x_op) .and. (ModData%Vars%Nx > 0)) then + + if (.not. allocated(x_op)) then + call AllocAry(x_op, ModData%Vars%Nx, "x_op", ErrStat2, ErrMsg2) + if (Failed()) return + end if + + ! Select based on module ID + select case (ModData%ID) + case (Module_AD) + call AD_VarsPackContState(ModData%Vars, T%AD%x(iState)%rotors(ModData%Ins), x_op) + case (Module_ADsk) + call ADsk_VarsPackContState(ModData%Vars, T%ADsk%x(iState), x_op) + case (Module_BD) + call BD_VarsPackContState(ModData%Vars, T%BD%x(ModData%Ins, iState), x_op) + case (Module_ED) + call ED_VarsPackContState(ModData%Vars, T%ED%x(ModData%Ins, iState), x_op) + case (Module_SED) + call SED_VarsPackContState(ModData%Vars, T%SED%x(iState), x_op) + case (Module_ExtPtfm) + call ExtPtfm_VarsPackContState(ModData%Vars, T%ExtPtfm%x(iState), x_op) + case (Module_FEAM) + call FEAM_VarsPackContState(ModData%Vars, T%FEAM%x(iState), x_op) + case (Module_HD) + call HydroDyn_VarsPackContState(ModData%Vars, T%HD%x(iState), x_op) + case (Module_IceD) + call IceD_VarsPackContState(ModData%Vars, T%IceD%x(ModData%Ins, iState), x_op) + case (Module_IceF) + call IceFloe_VarsPackContState(ModData%Vars, T%IceF%x(iState), x_op) + case (Module_IfW) + call InflowWind_VarsPackContState(ModData%Vars, T%IfW%x(iState), x_op) + case (Module_MAP) + call MAP_VarsPackContState(ModData%Vars, T%MAP%x(iState), x_op) + case (Module_MD) + call MD_VarsPackContState(ModData%Vars, T%MD%x(iState), x_op) + case (Module_ExtInfw) + ! call ExtInfw_VarsPackContState(ModData%Vars, T%ExtInfw%x(StateIndex), x_op) + case (Module_Orca) + call Orca_VarsPackContState(ModData%Vars, T%Orca%x(iState), x_op) + case (Module_SD) + call SD_VarsPackContState(ModData%Vars, T%SD%x(iState), x_op) + case (Module_SeaSt) + call SeaSt_VarsPackContState(ModData%Vars, T%SeaSt%x(iState), x_op) + case (Module_SrvD) + call SrvD_VarsPackContState(ModData%Vars, T%SrvD%x(ModData%Ins, iState), x_op) + case default + call SetErrStat(ErrID_Fatal, "Continuous State unsupported module: "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + + ! If glue array is present, transfer from module to glue + if (present(x_glue)) call XfrLocToGluAry(ModData%Vars%x, x_op, x_glue) + end if + + ! If continuous state derivatives are requested + if (present(dx_op) .and. (ModData%Vars%Nx > 0)) then + + if (.not. allocated(dx_op)) then + call AllocAry(dx_op, ModData%Vars%Nx, "dx_op", ErrStat2, ErrMsg2) + if (Failed()) return + end if + + ! Select based on module ID + select case (ModData%ID) + case (Module_AD) + i = 1 + call AD_CalcWind_Rotor(ThisTime, T%AD%Input(iInput)%rotors(ModData%Ins), & + T%AD%p%FlowField, T%AD%p%rotors(ModData%Ins), T%AD%p, & + T%AD%m, T%AD%m%Inflow(iInput)%RotInflow(ModData%Ins), & + i, ErrStat2, ErrMsg2) + if (Failed()) return + call RotCalcContStateDeriv(ThisTime, T%AD%Input(iInput)%rotors(ModData%Ins), & + T%AD%m%Inflow(iInput)%RotInflow(ModData%Ins), & + T%AD%p%rotors(ModData%Ins), T%AD%p, & + T%AD%x(iState)%rotors(ModData%Ins), & + T%AD%xd(iState)%rotors(ModData%Ins), & + T%AD%z(iState)%rotors(ModData%Ins), & + T%AD%OtherSt(iState)%rotors(ModData%Ins), & + T%AD%m%rotors(ModData%Ins), & + T%AD%m%rotors(ModData%Ins)%dxdt_lin, & + ErrStat2, ErrMsg2) + if (Failed()) return + call AD_VarsPackContStateDeriv(ModData%Vars, T%AD%m%rotors(ModData%Ins)%dxdt_lin, dx_op) + + case (Module_ADsk) + call ADsk_CalcContStateDeriv(ThisTime, T%ADsk%Input(iInput), T%ADsk%p, T%ADsk%x(iState), & + T%ADsk%xd(iState), T%ADsk%z(iState), T%ADsk%OtherSt(iState), & + T%ADsk%m, T%ADsk%m%dxdt_lin, ErrStat2, ErrMsg2) + if (Failed()) return + call ADsk_VarsPackContStateDeriv(ModData%Vars, T%ADsk%m%dxdt_lin, dx_op) + + case (Module_BD) + call BD_CalcContStateDeriv(ThisTime, T%BD%Input(iInput, ModData%Ins), & + T%BD%p(ModData%Ins), & + T%BD%x(ModData%Ins, iState), & + T%BD%xd(ModData%Ins, iState), & + T%BD%z(ModData%Ins, iState), & + T%BD%OtherSt(ModData%Ins, iState), & + T%BD%m(ModData%Ins), & + T%BD%m(ModData%Ins)%dxdt_lin, & + ErrStat2, ErrMsg2) + if (Failed()) return + call BD_VarsPackContStateDeriv(ModData%Vars, T%BD%m(ModData%Ins)%dxdt_lin, dx_op) + + case (Module_ED) + call ED_CalcContStateDeriv(ThisTime, T%ED%Input(iInput, ModData%Ins), & + T%ED%p(ModData%Ins), & + T%ED%x(ModData%Ins, iState), & + T%ED%xd(ModData%Ins, iState), & + T%ED%z(ModData%Ins, iState), & + T%ED%OtherSt(ModData%Ins, iState), & + T%ED%m(ModData%Ins), & + T%ED%m(ModData%Ins)%dxdt_lin, & + ErrStat2, ErrMsg2) + if (Failed()) return + call ED_VarsPackContStateDeriv(ModData%Vars, T%ED%m(ModData%Ins)%dxdt_lin, dx_op) + + case (Module_SED) + call SED_CalcContStateDeriv(ThisTime, T%SED%Input(iInput), T%SED%p, T%SED%x(iState), & + T%SED%xd(iState), T%SED%z(iState), T%SED%OtherSt(iState), & + T%SED%m, T%SED%m%dxdt_lin, ErrStat2, ErrMsg2) + if (Failed()) return + call SED_VarsPackContStateDeriv(ModData%Vars, T%SED%m%dxdt_lin, dx_op) + + case (Module_ExtPtfm) + call ExtPtfm_CalcContStateDeriv(ThisTime, T%ExtPtfm%Input(iInput), & + T%ExtPtfm%p, T%ExtPtfm%x(iState), & + T%ExtPtfm%xd(iState), T%ExtPtfm%z(iState), & + T%ExtPtfm%OtherSt(iState), & + T%ExtPtfm%m, T%ExtPtfm%m%dxdt_lin, & + ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_VarsPackContStateDeriv(ModData%Vars, T%ExtPtfm%m%dxdt_lin, dx_op) + +! case (Module_FEAM) +! call FEAM_VarsPackContStateDeriv(ModData%Vars, T%FEAM%x(StateIndex), dx_op) + + case (Module_HD) + call HydroDyn_CalcContStateDeriv(ThisTime, T%HD%Input(iInput), T%HD%p, T%HD%x(iState), & + T%HD%xd(iState), T%HD%z(iState), T%HD%OtherSt(iState), & + T%HD%m, T%HD%m%dxdt_lin, ErrStat2, ErrMsg2) + if (Failed()) return + call HydroDyn_VarsPackContStateDeriv(ModData%Vars, T%HD%m%dxdt_lin, dx_op) + +! case (Module_IceD) +! call IceD_CalcContStateDeriv(ThisTime, T%IceD%Input(InputIndex), T%IceD%p, T%IceD%x(StateIndex), & +! T%IceD%xd(StateIndex), T%IceD%z(StateIndex), T%IceD%OtherSt(StateIndex), & +! T%IceD%m, T%IceD%m%dxdt_lin, ErrStat2, ErrMsg2) +! if (Failed()) return +! call IceD_VarsPackContStateDeriv(ModData%Vars, T%IceD%m%dxdt_lin, dx_op) + +! case (Module_IceF) +! call IceFloe_VarsPackContStateDeriv(ModData%Vars, T%IceF%x(StateIndex), dx_op) + +! case (Module_IfW) +! call InflowWind_VarsPackContStateDeriv(ModData%Vars, T%IfW%x(StateIndex), dx_op) + +! case (Module_MAP) +! call MAP_VarsPackContStateDeriv(ModData%Vars, T%MAP%x(StateIndex), dx_op) + + case (Module_MD) + call MD_CalcContStateDeriv(ThisTime, T%MD%Input(iInput), T%MD%p, T%MD%x(iState), & + T%MD%xd(iState), T%MD%z(iState), T%MD%OtherSt(iState), & + T%MD%m, T%MD%m%dxdt_lin, ErrStat2, ErrMsg2) + if (Failed()) return + call MD_VarsPackContStateDeriv(ModData%Vars, T%MD%m%dxdt_lin, dx_op) + +! case (Module_ExtInfw) +! call ExtInfw_VarsPackContStateDeriv(ModData%Vars, T%ExtInfw%x(StateIndex), dx_op) + +! case (Module_Orca) +! call Orca_VarsPackContStateDeriv(ModData%Vars, T%Orca%x(StateIndex), dx_op) + + case (Module_SD) + call SD_CalcContStateDeriv(ThisTime, T%SD%Input(iInput), T%SD%p, T%SD%x(iState), & + T%SD%xd(iState), T%SD%z(iState), T%SD%OtherSt(iState), & + T%SD%m, T%SD%m%dxdt_lin, ErrStat2, ErrMsg2) + if (Failed()) return + call SD_VarsPackContStateDeriv(ModData%Vars, T%SD%m%dxdt_lin, dx_op) + +! case (Module_SeaSt) +! call SeaSt_VarsPackContStateDeriv(ModData%Vars, T%SeaSt%x(StateIndex), dx_op) + + case (Module_SrvD) + call SrvD_CalcContStateDeriv(ThisTime, T%SrvD%Input(iInput, ModData%Ins), T%SrvD%p(ModData%Ins), & + T%SrvD%x(ModData%Ins, iState), T%SrvD%xd(ModData%Ins, iState), & + T%SrvD%z(ModData%Ins, iState), T%SrvD%OtherSt(ModData%Ins, iState), & + T%SrvD%m(ModData%Ins), T%SrvD%m(ModData%Ins)%dxdt_lin, ErrStat2, ErrMsg2) + call SrvD_VarsPackContStateDeriv(ModData%Vars, T%SrvD%m(ModData%Ins)%dxdt_lin, dx_op) + + case default + call SetErrStat(ErrID_Fatal, "Continuous State Derivatives unsupported module: "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + + ! If glue array is present, transfer from module to glue + if (present(dx_glue)) call XfrLocToGluAry(ModData%Vars%x, dx_op, dx_glue) + end if + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine FAST_SetOP(ModData, iInput, iState, T, ErrStat, ErrMsg, & + u_op, x_op, z_op, u_glue, x_glue, z_glue) + type(ModDataType), intent(in) :: ModData !< Module information + integer(IntKi), intent(in) :: iInput !< Input index + integer(IntKi), intent(in) :: iState !< State index + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + real(R8Ki), allocatable, optional, intent(inout) :: u_op(:), u_glue(:) !< values of linearized inputs + real(R8Ki), allocatable, optional, intent(inout) :: x_op(:), x_glue(:) !< values of linearized continuous states + real(R8Ki), allocatable, optional, intent(inout) :: z_op(:), z_glue(:) !< values of linearized constraint states + + character(*), parameter :: RoutineName = 'FAST_SetOP' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = '' + + ! If inputs are requested + if (present(u_op)) then + + ! If glue array is present, transfer from module to glue + if (present(u_glue)) call XfrGluToModAry(ModData%Vars%u, u_glue, u_op) + + ! Select based on module ID + select case (ModData%ID) + case (Module_AD) + call AD_VarsUnpackInput(ModData%Vars, u_op, T%AD%Input(iInput)%rotors(ModData%Ins)) + case (Module_ADsk) + call ADsk_VarsUnpackInput(ModData%Vars, u_op, T%ADsk%Input(iInput)) + case (Module_BD) + call BD_VarsUnpackInput(ModData%Vars, u_op, T%BD%Input(iInput, ModData%Ins)) + case (Module_ED) + call ED_VarsUnpackInput(ModData%Vars, u_op, T%ED%Input(iInput, ModData%Ins)) + case (Module_SED) + call SED_VarsUnpackInput(ModData%Vars, u_op, T%SED%Input(iInput)) + case (Module_ExtPtfm) + call ExtPtfm_VarsUnpackInput(ModData%Vars, u_op, T%ExtPtfm%Input(iInput)) + case (Module_FEAM) + call FEAM_VarsUnpackInput(ModData%Vars, u_op, T%FEAM%Input(iInput)) + case (Module_HD) + call HydroDyn_VarsUnpackInput(ModData%Vars, u_op, T%HD%Input(iInput)) + case (Module_IceD) + call IceD_VarsUnpackInput(ModData%Vars, u_op, T%IceD%Input(iInput, ModData%Ins)) + case (Module_IceF) + call IceFloe_VarsUnpackInput(ModData%Vars, u_op, T%IceF%Input(iInput)) + case (Module_IfW) + call InflowWind_VarsUnpackInput(ModData%Vars, u_op, T%IfW%Input(iInput)) + case (Module_MAP) + call MAP_VarsUnpackInput(ModData%Vars, u_op, T%MAP%Input(iInput)) + case (Module_MD) + call MD_VarsUnpackInput(ModData%Vars, u_op, T%MD%Input(iInput)) + case (Module_ExtInfw) + ! call ExtInfw_VarsUnpackInput(ModData%Vu_op, ars, T%ExtInfw%Input(InputIndex)) + case (Module_Orca) + call Orca_VarsUnpackInput(ModData%Vars, u_op, T%Orca%Input(iInput)) + case (Module_SD) + call SD_VarsUnpackInput(ModData%Vars, u_op, T%SD%Input(iInput)) + case (Module_SeaSt) + call SeaSt_VarsUnpackInput(ModData%Vars, u_op, T%SeaSt%Input(iInput)) + case (Module_SrvD) + call SrvD_VarsUnpackInput(ModData%Vars, u_op, T%SrvD%Input(iInput, ModData%Ins)) + case default + call SetErrStat(ErrID_Fatal, "Input unsupported module: "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + + end if + + ! If continuous states are requested + if (present(x_op)) then + + ! If glue array is present, transfer from module to glue + if (present(x_glue)) call XfrGluToModAry(ModData%Vars%x, x_glue, x_op) + + ! Select based on module ID + select case (ModData%ID) + case (Module_AD) + call AD_VarsUnpackContState(ModData%Vars, x_op, T%AD%x(iState)%rotors(ModData%Ins)) + case (Module_ADsk) + call ADsk_VarsUnpackContState(ModData%Vars, x_op, T%ADsk%x(iState)) + case (Module_BD) + call BD_VarsUnpackContState(ModData%Vars, x_op, T%BD%x(ModData%Ins, iState)) + case (Module_ED) + call ED_VarsUnpackContState(ModData%Vars, x_op, T%ED%x(ModData%Ins, iState)) + case (Module_SED) + call SED_VarsUnpackContState(ModData%Vars, x_op, T%SED%x(iState)) + case (Module_ExtPtfm) + call ExtPtfm_VarsUnpackContState(ModData%Vars, x_op, T%ExtPtfm%x(iState)) + case (Module_FEAM) + call FEAM_VarsUnpackContState(ModData%Vars, x_op, T%FEAM%x(iState)) + case (Module_HD) + call HydroDyn_VarsUnpackContState(ModData%Vars, x_op, T%HD%x(iState)) + case (Module_IceD) + call IceD_VarsUnpackContState(ModData%Vars, x_op, T%IceD%x(ModData%Ins, iState)) + case (Module_IceF) + call IceFloe_VarsUnpackContState(ModData%Vars, x_op, T%IceF%x(iState)) + case (Module_IfW) + call InflowWind_VarsUnpackContState(ModData%Vars, x_op, T%IfW%x(iState)) + case (Module_MAP) + call MAP_VarsUnpackContState(ModData%Vars, x_op, T%MAP%x(iState)) + case (Module_MD) + call MD_VarsUnpackContState(ModData%Vars, x_op, T%MD%x(iState)) + case (Module_ExtInfw) + ! call ExtInfw_VarsUnpackContState(ModData%Vars, x_op, T%ExtInfw%x(StateIndex)) + case (Module_Orca) + call Orca_VarsUnpackContState(ModData%Vars, x_op, T%Orca%x(iState)) + case (Module_SD) + call SD_VarsUnpackContState(ModData%Vars, x_op, T%SD%x(iState)) + case (Module_SeaSt) + call SeaSt_VarsUnpackContState(ModData%Vars, x_op, T%SeaSt%x(iState)) + case (Module_SrvD) + call SrvD_VarsUnpackContState(ModData%Vars, x_op, T%SrvD%x(ModData%Ins, iState)) + case default + call SetErrStat(ErrID_Fatal, "Continuous State unsupported module: "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select + + end if + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine FAST_JacobianPInput(ModData, ThisTime, iInput, iState, T, ErrStat, ErrMsg, dYdu, dXdu, dYdu_glue, dXdu_glue) + type(ModDataType), intent(in) :: ModData !< Module data + real(DbKi), intent(in) :: ThisTime !< Time + integer(IntKi), intent(in) :: iInput !< Input index + integer(IntKi), intent(in) :: iState !< State index + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + real(R8Ki), allocatable, optional, intent(inout) :: dYdu(:, :) + real(R8Ki), allocatable, optional, intent(inout) :: dXdu(:, :) + real(R8Ki), optional, intent(inout) :: dYdu_glue(:, :) + real(R8Ki), optional, intent(inout) :: dXdu_glue(:, :) + + character(*), parameter :: RoutineName = 'FAST_JacobianPInput' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + ! Select based on module ID + select case (ModData%ID) + + case (Module_AD) + call AD_JacobianPInput(ModData%Vars, ModData%iRotor, ThisTime, T%AD%Input(iInput), T%AD%p, T%AD%x(iState), T%AD%xd(iState), & + T%AD%z(iState), T%AD%OtherSt(iState), T%AD%y, T%AD%m, ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + +! case (Module_ADsk) +! call ADsk_JacobianPInput(ModData%Vars, ThisTime, T%ADsk%Input(iInput), T%ADsk%p, T%ADsk%x(iState), T%ADsk%xd(iState), & +! T%ADsk%z(iState), T%ADsk%OtherSt(iState), T%ADsk%y, T%ADsk%m, ErrStat2, ErrMsg2, & +! dYdu=dYdu, dXdu=dXdu) + + case (Module_BD) + call BD_JacobianPInput(ModData%Vars, ThisTime, T%BD%Input(iInput, ModData%Ins), T%BD%p(ModData%Ins), & + T%BD%x(ModData%Ins, iState), T%BD%xd(ModData%Ins, iState), & + T%BD%z(ModData%Ins, iState), T%BD%OtherSt(ModData%Ins, iState), & + T%BD%y(ModData%Ins), T%BD%m(ModData%Ins), ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_ED) + call ED_JacobianPInput(ModData%Vars, ThisTime, T%ED%Input(iInput, ModData%Ins), T%ED%p(ModData%Ins), & + T%ED%x(ModData%Ins, iState), T%ED%xd(ModData%Ins, iState), & + T%ED%z(ModData%Ins, iState), T%ED%OtherSt(ModData%Ins, iState), & + T%ED%y(ModData%Ins), T%ED%m(ModData%Ins), ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_SED) + call SED_JacobianPInput(ModData%Vars, ThisTime, T%SED%Input(iInput), T%SED%p, T%SED%x(iState), T%SED%xd(iState), & + T%SED%z(iState), T%SED%OtherSt(iState), T%SED%y, T%SED%m, ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_ExtPtfm) + call ExtPtfm_JacobianPInput(ModData%Vars, ThisTime, T%ExtPtfm%Input(iInput), T%ExtPtfm%p, T%ExtPtfm%x(iState), T%ExtPtfm%xd(iState), & + T%ExtPtfm%z(iState), T%ExtPtfm%OtherSt(iState), T%ExtPtfm%y, T%ExtPtfm%m, ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_HD) + call HD_JacobianPInput(ModData%Vars, ThisTime, T%HD%Input(iInput), T%HD%p, T%HD%x(iState), T%HD%xd(iState), & + T%HD%z(iState), T%HD%OtherSt(iState), T%HD%y, T%HD%m, ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_IfW) + call InflowWind_JacobianPInput(ModData%Vars, ThisTime, T%IfW%Input(iInput), T%IfW%p, T%IfW%x(iState), T%IfW%xd(iState), & + T%IfW%z(iState), T%IfW%OtherSt(iState), T%IfW%y, T%IfW%m, ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_MAP) + call MAP_JacobianPInput(ModData%Vars, ThisTime, T%MAP%Input(iInput), T%MAP%p, T%MAP%x(iState), T%MAP%xd(iState), & + T%MAP%z(iState), T%MAP%OtherSt, T%MAP%y, T%MAP%m, ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_MD) + call MD_JacobianPInput(ModData%Vars, ThisTime, T%MD%Input(iInput), T%MD%p, T%MD%x(iState), T%MD%xd(iState), & + T%MD%z(iState), T%MD%OtherSt(iState), T%MD%y, T%MD%m, ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_SD) + call SD_JacobianPInput(ModData%Vars, ThisTime, T%SD%Input(iInput), T%SD%p, T%SD%x(iState), T%SD%xd(iState), & + T%SD%z(iState), T%SD%OtherSt(iState), T%SD%y, T%SD%m, ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_SeaSt) + call SeaSt_JacobianPInput(ModData%Vars, ThisTime, T%SeaSt%Input(iInput), T%SeaSt%p, T%SeaSt%x(iState), T%SeaSt%xd(iState), & + T%SeaSt%z(iState), T%SeaSt%OtherSt(iState), T%SeaSt%y, T%SeaSt%m, ErrStat2, ErrMsg2, & + dYdu=dYdu, dXdu=dXdu) + + case (Module_SrvD) + call SrvD_JacobianPInput(ModData%Vars, ThisTime, T%SrvD%Input(iInput, ModData%Ins), T%SrvD%p(ModData%Ins), & + T%SrvD%x(ModData%Ins, iState), T%SrvD%xd(ModData%Ins, iState), & + T%SrvD%z(ModData%Ins, iState), T%SrvD%OtherSt(ModData%Ins, iState), & + T%SrvD%y(ModData%Ins), T%SrvD%m(ModData%Ins), & + ErrStat2, ErrMsg2, dYdu=dYdu, dXdu=dXdu) + + case default + ErrStat2 = ErrID_Fatal + ErrMsg2 = "Unsupported module ID: "//ModData%Abbr + end select + + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + ! If dYdu and dYdu_glue are present, transfer from module matrix to glue matrix + if (present(dYdu) .and. present(dYdu_glue)) call XfrModToGlueMatrix(ModData%Vars%y, ModData%Vars%u, dYdu, dYdu_glue) + + ! If dXdu and dXdu_glue are present, transfer from module matrix to glue matrix + if (present(dXdu) .and. present(dXdu_glue)) call XfrModToGlueMatrix(ModData%Vars%x, ModData%Vars%u, dXdu, dXdu_glue) + +end subroutine + +subroutine FAST_JacobianPContState(ModData, ThisTime, iInput, iState, T, ErrStat, ErrMsg, dYdx, dXdx, dYdx_glue, dXdx_glue) + type(ModDataType), intent(inout) :: ModData !< Module data + real(DbKi), intent(in) :: ThisTime !< Time + integer(IntKi), intent(in) :: iInput !< Input index + integer(IntKi), intent(in) :: iState !< State index + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + real(R8Ki), allocatable, optional, intent(inout) :: dYdx(:, :) + real(R8Ki), allocatable, optional, intent(inout) :: dXdx(:, :) + real(R8Ki), optional, intent(inout) :: dYdx_glue(:, :) + real(R8Ki), optional, intent(inout) :: dXdx_glue(:, :) + + character(*), parameter :: RoutineName = 'FAST_JacobianPContState' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + ! Select based on module ID + select case (ModData%ID) + + case (Module_AD) + call AD_JacobianPContState(ModData%Vars, ModData%iRotor, ThisTime, T%AD%Input(iInput), T%AD%p, & + T%AD%x(iState), T%AD%xd(iState), & + T%AD%z(iState), T%AD%OtherSt(iState), & + T%AD%y, T%AD%m, ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + +! case (Module_ADsk) + + case (Module_BD) + call BD_JacobianPContState(ModData%Vars, ThisTime, T%BD%Input(iInput, ModData%Ins), T%BD%p(ModData%Ins), & + T%BD%x(ModData%Ins, iState), T%BD%xd(ModData%Ins, iState), & + T%BD%z(ModData%Ins, iState), T%BD%OtherSt(ModData%Ins, iState), & + T%BD%y(ModData%Ins), T%BD%m(ModData%Ins), ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case (Module_ED) + call ED_JacobianPContState(ModData%Vars, ThisTime, T%ED%Input(iInput, ModData%Ins), T%ED%p(ModData%Ins), & + T%ED%x(ModData%Ins, iState), T%ED%xd(ModData%Ins, iState), & + T%ED%z(ModData%Ins, iState), T%ED%OtherSt(ModData%Ins, iState), & + T%ED%y(ModData%Ins), T%ED%m(ModData%Ins), ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case (Module_SED) + call SED_JacobianPContState(ModData%Vars, ThisTime, T%SED%Input(iInput), T%SED%p, & + T%SED%x(iState), T%SED%xd(iState), & + T%SED%z(iState), T%SED%OtherSt(iState), & + T%SED%y, T%SED%m, ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case (Module_ExtPtfm) + call ExtPtfm_JacobianPContState(ModData%Vars, ThisTime, T%ExtPtfm%Input(iInput), T%ExtPtfm%p, & + T%ExtPtfm%x(iState), T%ExtPtfm%xd(iState), & + T%ExtPtfm%z(iState), T%ExtPtfm%OtherSt(iState), & + T%ExtPtfm%y, T%ExtPtfm%m, ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case (Module_HD) + call HD_JacobianPContState(ModData%Vars, ThisTime, T%HD%Input(iInput), T%HD%p, & + T%HD%x(iState), T%HD%xd(iState), & + T%HD%z(iState), T%HD%OtherSt(iState), & + T%HD%y, T%HD%m, ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case (Module_IfW) + call InflowWind_JacobianPContState(ModData%Vars, ThisTime, T%IfW%Input(iInput), T%IfW%p, & + T%IfW%x(iState), T%IfW%xd(iState), & + T%IfW%z(iState), T%IfW%OtherSt(iState), & + T%IfW%y, T%IfW%m, ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case (Module_MAP) + ! MAP doesn't have a JacobianPContState subroutine + ErrStat2 = ErrID_None + ErrMsg2 = '' + + case (Module_MD) + call MD_JacobianPContState(ModData%Vars, ThisTime, T%MD%Input(iInput), T%MD%p, & + T%MD%x(iState), T%MD%xd(iState), & + T%MD%z(iState), T%MD%OtherSt(iState), & + T%MD%y, T%MD%m, ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case (Module_SD) + call SD_JacobianPContState(ModData%Vars, ThisTime, T%SD%Input(iInput), T%SD%p, & + T%SD%x(iState), T%SD%xd(iState), & + T%SD%z(iState), T%SD%OtherSt(iState), & + T%SD%y, T%SD%m, ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case (Module_SeaSt) + call SeaSt_JacobianPContState(ModData%Vars, ThisTime, T%SeaSt%Input(iInput), T%SeaSt%p, & + T%SeaSt%x(iState), T%SeaSt%xd(iState), & + T%SeaSt%z(iState), T%SeaSt%OtherSt(iState), & + T%SeaSt%y, T%SeaSt%m, ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case (Module_SrvD) + call SrvD_JacobianPContState(ModData%Vars, ThisTime, T%SrvD%Input(iInput, ModData%Ins), T%SrvD%p(ModData%Ins), & + T%SrvD%x(ModData%Ins, iState), T%SrvD%xd(ModData%Ins, iState), & + T%SrvD%z(ModData%Ins, iState), T%SrvD%OtherSt(ModData%Ins, iState), & + T%SrvD%y(ModData%Ins), T%SrvD%m(ModData%Ins), ErrStat2, ErrMsg2, & + dYdx=dYdx, dXdx=dXdx) + + case default + ErrStat2 = ErrID_Fatal + ErrMsg2 = "Unsupported module ID: "//ModData%Abbr + end select + + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + ! If dYdx and dYdx_glue are present, transfer from module matrix to glue matrix + if (present(dYdx) .and. present(dYdx_glue)) call XfrModToGlueMatrix(ModData%Vars%y, ModData%Vars%x, dYdx, dYdx_glue) + + ! If dXdx and dXdx_glue are present, transfer from module matrix to glue matrix + if (present(dXdx) .and. present(dXdx_glue)) call XfrModToGlueMatrix(ModData%Vars%x, ModData%Vars%x, dXdx, dXdx_glue) + +end subroutine + +subroutine FAST_CopyStates(ModData, T, iSrc, iDst, CtrlCode, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: ModData !< Module data + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(in) :: iSrc, iDst !< State indices + integer(IntKi), intent(in) :: CtrlCode !< Mesh copy code + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_CopyStates' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i, j + integer(IntKi) :: j_ss ! substep loop counter + integer(IntKi) :: n_t_module ! simulation time step, loop counter for individual modules + real(DbKi) :: t_module ! Current simulation time for module + + ErrStat = ErrID_None + ErrMsg = '' + + ! Select based on module ID + select case (ModData%ID) + + case (Module_AD) + + if (ModData%Ins == 1) then + call AD_CopyContState(T%AD%x(iSrc), T%AD%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyDiscState(T%AD%xd(iSrc), T%AD%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyConstrState(T%AD%z(iSrc), T%AD%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call AD_CopyOtherState(T%AD%OtherSt(iSrc), T%AD%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + else + ErrStat2 = ErrID_None + ErrMsg2 = '' + end if + + case (Module_ADsk) + + call ADsk_CopyContState(T%ADsk%x(iSrc), T%ADsk%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ADsk_CopyDiscState(T%ADsk%xd(iSrc), T%ADsk%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ADsk_CopyConstrState(T%ADsk%z(iSrc), T%ADsk%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ADsk_CopyOtherState(T%ADsk%OtherSt(iSrc), T%ADsk%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_BD) + + call BD_CopyContState(T%BD%x(ModData%Ins, iSrc), T%BD%x(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call BD_CopyDiscState(T%BD%xd(ModData%Ins, iSrc), T%BD%xd(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call BD_CopyConstrState(T%BD%z(ModData%Ins, iSrc), T%BD%z(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call BD_CopyOtherState(T%BD%OtherSt(ModData%Ins, iSrc), T%BD%OtherSt(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_ED) + + call ED_CopyContState(T%ED%x(ModData%Ins, iSrc), T%ED%x(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ED_CopyDiscState(T%ED%xd(ModData%Ins, iSrc), T%ED%xd(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ED_CopyConstrState(T%ED%z(ModData%Ins, iSrc), T%ED%z(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ED_CopyOtherState(T%ED%OtherSt(ModData%Ins, iSrc), T%ED%OtherSt(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_SED) + + call SED_CopyContState(T%SED%x(iSrc), T%SED%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SED_CopyDiscState(T%SED%xd(iSrc), T%SED%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SED_CopyConstrState(T%SED%z(iSrc), T%SED%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SED_CopyOtherState(T%SED%OtherSt(iSrc), T%SED%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_ExtInfw) + + ! call ExtInfw_CopyContState(T%ExtInfw%x(Src), T%ExtInfw%x(Dst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + ! call ExtInfw_CopyDiscState(T%ExtInfw%xd(Src), T%ExtInfw%xd(Dst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + ! call ExtInfw_CopyConstrState(T%ExtInfw%z(Src), T%ExtInfw%z(Dst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + ! call ExtInfw_CopyOtherState(T%ExtInfw%OtherSt(Src), T%ExtInfw%OtherSt(Dst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_ExtLd) + + call ExtLd_CopyContState(T%ExtLd%x(iSrc), T%ExtLd%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ExtLd_CopyDiscState(T%ExtLd%xd(iSrc), T%ExtLd%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ExtLd_CopyConstrState(T%ExtLd%z(iSrc), T%ExtLd%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ExtLd_CopyOtherState(T%ExtLd%OtherSt(iSrc), T%ExtLd%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_ExtPtfm) + + call ExtPtfm_CopyContState(T%ExtPtfm%x(iSrc), T%ExtPtfm%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_CopyDiscState(T%ExtPtfm%xd(iSrc), T%ExtPtfm%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_CopyConstrState(T%ExtPtfm%z(iSrc), T%ExtPtfm%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call ExtPtfm_CopyOtherState(T%ExtPtfm%OtherSt(iSrc), T%ExtPtfm%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_FEAM) + + call FEAM_CopyContState(T%FEAM%x(iSrc), T%FEAM%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call FEAM_CopyDiscState(T%FEAM%xd(iSrc), T%FEAM%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call FEAM_CopyConstrState(T%FEAM%z(iSrc), T%FEAM%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call FEAM_CopyOtherState(T%FEAM%OtherSt(iSrc), T%FEAM%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_HD) + + call HydroDyn_CopyContState(T%HD%x(iSrc), T%HD%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call HydroDyn_CopyDiscState(T%HD%xd(iSrc), T%HD%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call HydroDyn_CopyConstrState(T%HD%z(iSrc), T%HD%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call HydroDyn_CopyOtherState(T%HD%OtherSt(iSrc), T%HD%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_IceD) + + call IceD_CopyContState(T%IceD%x(iSrc, ModData%Ins), T%IceD%x(iDst, ModData%Ins), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call IceD_CopyDiscState(T%IceD%xd(iSrc, ModData%Ins), T%IceD%xd(iDst, ModData%Ins), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call IceD_CopyConstrState(T%IceD%z(iSrc, ModData%Ins), T%IceD%z(iDst, ModData%Ins), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call IceD_CopyOtherState(T%IceD%OtherSt(iSrc, ModData%Ins), T%IceD%OtherSt(iDst, ModData%Ins), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_IceF) + + call IceFloe_CopyContState(T%IceF%x(iSrc), T%IceF%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call IceFloe_CopyDiscState(T%IceF%xd(iSrc), T%IceF%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call IceFloe_CopyConstrState(T%IceF%z(iSrc), T%IceF%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call IceFloe_CopyOtherState(T%IceF%OtherSt(iSrc), T%IceF%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_IfW) + + ! call IfW_CopyContState(T%IfW%x(Src), T%IfW%x(Dst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + ! call IfW_CopyDiscState(T%IfW%xd(Src), T%IfW%xd(Dst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + ! call IfW_CopyConstrState(T%IfW%z(Src), T%IfW%z(Dst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + ! call IfW_CopyOtherState(T%IfW%OtherSt(Src), T%IfW%OtherSt(Dst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_MAP) + + call MAP_CopyContState(T%MAP%x(iSrc), T%MAP%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call MAP_CopyDiscState(T%MAP%xd(iSrc), T%MAP%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call MAP_CopyConstrState(T%MAP%z(iSrc), T%MAP%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + ! call MAP_CopyOtherState(T%MAP%OtherSt(Src), T%MAP%OtherSt(Dst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_MD) + + call MD_CopyContState(T%MD%x(iSrc), T%MD%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call MD_CopyDiscState(T%MD%xd(iSrc), T%MD%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call MD_CopyConstrState(T%MD%z(iSrc), T%MD%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call MD_CopyOtherState(T%MD%OtherSt(iSrc), T%MD%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_Orca) + + call Orca_CopyContState(T%Orca%x(iSrc), T%Orca%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call Orca_CopyDiscState(T%Orca%xd(iSrc), T%Orca%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call Orca_CopyConstrState(T%Orca%z(iSrc), T%Orca%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call Orca_CopyOtherState(T%Orca%OtherSt(iSrc), T%Orca%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_SD) + + call SD_CopyContState(T%SD%x(iSrc), T%SD%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SD_CopyDiscState(T%SD%xd(iSrc), T%SD%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SD_CopyConstrState(T%SD%z(iSrc), T%SD%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SD_CopyOtherState(T%SD%OtherSt(iSrc), T%SD%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_SeaSt) + + call SeaSt_CopyContState(T%SeaSt%x(iSrc), T%SeaSt%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SeaSt_CopyDiscState(T%SeaSt%xd(iSrc), T%SeaSt%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SeaSt_CopyConstrState(T%SeaSt%z(iSrc), T%SeaSt%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SeaSt_CopyOtherState(T%SeaSt%OtherSt(iSrc), T%SeaSt%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_SlD) + + call SlD_CopyContState(T%SlD%x(iSrc), T%SlD%x(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SlD_CopyDiscState(T%SlD%xd(iSrc), T%SlD%xd(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SlD_CopyConstrState(T%SlD%z(iSrc), T%SlD%z(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SlD_CopyOtherState(T%SlD%OtherSt(iSrc), T%SlD%OtherSt(iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case (Module_SrvD) + + call SrvD_CopyContState(T%SrvD%x(ModData%Ins, iSrc), T%SrvD%x(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_CopyDiscState(T%SrvD%xd(ModData%Ins, iSrc), T%SrvD%xd(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_CopyConstrState(T%SrvD%z(ModData%Ins, iSrc), T%SrvD%z(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_CopyOtherState(T%SrvD%OtherSt(ModData%Ins, iSrc), T%SrvD%OtherSt(ModData%Ins, iDst), CtrlCode, ErrStat2, ErrMsg2); if (Failed()) return + + case default + call SetErrStat(ErrID_Fatal, "Unknown module "//trim(ModData%Abbr), ErrStat, ErrMsg, RoutineName) + return + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine FAST_CopyInput(ModData, T, iSrc, iDst, CtrlCode, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: ModData !< Module data + type(FAST_TurbineType), target, intent(inout) :: T !< Turbine type + integer(IntKi), intent(in) :: iSrc, iDst !< Input indices + integer(IntKi), intent(in) :: CtrlCode !< Mesh copy code + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_CopyInput' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i, j, k + + ErrStat = ErrID_None + ErrMsg = '' + + ! If source and destination indices are the same, return error + if (iSrc == iDst) then + call SetErrStat(ErrID_Fatal, "invalid indices: iSrc == iDst", ErrStat, ErrMsg, RoutineName) + return + end if + + ! Select based on module ID + select case (ModData%ID) + + case (Module_AD) + if (ModData%Ins == 1) then + call AD_CopyInput(T%AD%Input(iSrc), T%AD%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + else + ErrStat2 = ErrID_None + ErrMsg2 = '' + end if + + case (Module_ADsk) + call ADsk_CopyInput(T%ADsk%Input(iSrc), T%ADsk%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_BD) + call BD_CopyInput(T%BD%Input(iSrc, ModData%Ins), T%BD%Input(iDst, ModData%Ins), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_ED) + call ED_CopyInput(T%ED%Input(iSrc, ModData%Ins), T%ED%Input(iDst, ModData%Ins), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_SED) + call SED_CopyInput(T%SED%Input(iSrc), T%SED%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_ExtInfw) + ! ExtInfw only has u + ErrStat2 = ErrID_None + ErrMsg2 = '' + + case (Module_ExtLd) + ! ExtLd only has u + ErrStat2 = ErrID_None + ErrMsg2 = '' + + case (Module_ExtPtfm) + call ExtPtfm_CopyInput(T%ExtPtfm%Input(iSrc), T%ExtPtfm%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_FEAM) + call FEAM_CopyInput(T%FEAM%Input(iSrc), T%FEAM%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_HD) + call HydroDyn_CopyInput(T%HD%Input(iSrc), T%HD%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_IceD) + call IceD_CopyInput(T%IceD%Input(iSrc, ModData%Ins), T%IceD%Input(iDst, ModData%Ins), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_IceF) + call IceFloe_CopyInput(T%IceF%Input(iSrc), T%IceF%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_IfW) + call InflowWind_CopyInput(T%IfW%Input(iSrc), T%IfW%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_MAP) + call MAP_CopyInput(T%MAP%Input(iSrc), T%MAP%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_MD) + call MD_CopyInput(T%MD%Input(iSrc), T%MD%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + +! case (Module_ExtInfw) + + case (Module_Orca) + call Orca_CopyInput(T%Orca%Input(iSrc), T%Orca%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_SD) + call SD_CopyInput(T%SD%Input(iSrc), T%SD%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_SeaSt) + call SeaSt_CopyInput(T%SeaSt%Input(iSrc), T%SeaSt%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_SlD) + call SlD_CopyInput(T%SlD%Input(iSrc), T%SlD%Input(iDst), CtrlCode, ErrStat2, ErrMsg2) + + case (Module_SrvD) + call SrvD_CopyInput(T%SrvD%Input(iSrc, ModData%Ins), T%SrvD%Input(iDst, ModData%Ins), CtrlCode, ErrStat2, ErrMsg2) + + case default + ErrStat2 = ErrID_Fatal + ErrMsg2 = "Unknown module "//trim(ModData%Abbr) + end select + + ! Set error + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + +end subroutine + +subroutine XfrLocToGluAry(VarAry, ModAry, GluAry) + type(ModVarType), intent(in) :: VarAry(:) + real(R8Ki), allocatable, intent(in) :: ModAry(:) + real(R8Ki), intent(inout) :: GluAry(:) + integer(IntKi) :: i + if (.not. allocated(ModAry) .or. size(VarAry) == 0) return + do i = 1, size(VarAry) + GluAry(VarAry(i)%iGlu(1):VarAry(i)%iGlu(2)) = ModAry(VarAry(i)%iLoc(1):VarAry(i)%iLoc(2)) + end do +end subroutine + +subroutine XfrGluToModAry(VarAry, GluAry, ModAry) + type(ModVarType), intent(in) :: VarAry(:) + real(R8Ki), allocatable, intent(in) :: GluAry(:) + real(R8Ki), intent(inout) :: ModAry(:) + integer(IntKi) :: i + if (.not. allocated(GluAry) .or. size(VarAry) == 0) return + do i = 1, size(VarAry) + ModAry(VarAry(i)%iLoc(1):VarAry(i)%iLoc(2)) = GluAry(VarAry(i)%iGlu(1):VarAry(i)%iGlu(2)) + end do +end subroutine + +subroutine XfrModToGlueMatrix(RowVarAry, ColVarAry, ModMat, GluMat) + type(ModVarType), intent(in) :: RowVarAry(:), ColVarAry(:) + real(R8Ki), allocatable, intent(in) :: ModMat(:, :) + real(R8Ki), intent(inout) :: GluMat(:, :) + integer(IntKi) :: i, j + if (.not. allocated(ModMat) .or. size(RowVarAry) == 0 .or. size(ColVarAry) == 0) return + do i = 1, size(ColVarAry) + do j = 1, size(RowVarAry) + GluMat(RowVarAry(j)%iGlu(1):RowVarAry(j)%iGlu(2), ColVarAry(i)%iGlu(1):ColVarAry(i)%iGlu(2)) = & + ModMat(RowVarAry(j)%iLoc(1):RowVarAry(j)%iLoc(2), ColVarAry(i)%iLoc(1):ColVarAry(i)%iLoc(2)) + end do + end do +end subroutine + +subroutine FAST_ModEnd(Mods, T, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: Mods(:) !< Module data + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_CopyInput' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = '' + + ! Loop through modules and call end function + do i = 1, size(Mods) + associate (ModData => Mods(i)) + + ! Select based on module ID + select case (ModData%ID) + + case (Module_AD) + ! Call end on first instance since each rotor has an instance + if (ModData%Ins == 1) then + call AD_End(T%AD%Input(1), T%AD%p, T%AD%x(STATE_CURR), & + T%AD%xd(STATE_CURR), T%AD%z(STATE_CURR), & + T%AD%OtherSt(STATE_CURR), T%AD%y, T%AD%m, ErrStat2, ErrMsg2) + else + ErrStat2 = ErrID_None + ErrMsg2 = '' + end if + + case (Module_ADsk) + call ADsk_End(T%ADsk%Input(1), T%ADsk%p, T%ADsk%x(STATE_CURR), & + T%ADsk%xd(STATE_CURR), T%ADsk%z(STATE_CURR), & + T%ADsk%OtherSt(STATE_CURR), T%ADsk%y, T%ADsk%m, ErrStat2, ErrMsg2) + + case (Module_BD) + call BD_End(T%BD%Input(1, ModData%Ins), T%BD%p(ModData%Ins), & + T%BD%x(ModData%Ins, STATE_CURR), T%BD%xd(ModData%Ins, STATE_CURR), & + T%BD%z(ModData%Ins, STATE_CURR), T%BD%OtherSt(ModData%Ins, STATE_CURR), & + T%BD%y(ModData%Ins), T%BD%m(ModData%Ins), ErrStat2, ErrMsg2) + + case (Module_ED) + call ED_End(T%ED%Input(1, ModData%Ins), T%ED%p(ModData%Ins), & + T%ED%x(ModData%Ins, STATE_CURR), T%ED%xd(ModData%Ins, STATE_CURR), & + T%ED%z(ModData%Ins, STATE_CURR), T%ED%OtherSt(ModData%Ins, STATE_CURR), & + T%ED%y(ModData%Ins), T%ED%m(ModData%Ins), ErrStat2, ErrMsg2) + + case (Module_SED) + call SED_End(T%SED%Input(1), T%SED%p, T%SED%x(STATE_CURR), & + T%SED%xd(STATE_CURR), T%SED%z(STATE_CURR), T%SED%OtherSt(STATE_CURR), & + T%SED%y, T%SED%m, ErrStat2, ErrMsg2) + + case (Module_ExtInfw) + ! Missing ExtInfw_End + ErrStat2 = ErrID_None + ErrMsg2 = '' + + case (Module_ExtLd) + call ExtLd_End(T%ExtLd%u, T%ExtLd%p, T%ExtLd%x(STATE_CURR), T%ExtLd%xd(STATE_CURR), & + T%ExtLd%z(STATE_CURR), T%ExtLd%OtherSt(STATE_CURR), & + T%ExtLd%y, T%ExtLd%m, ErrStat2, ErrMsg2) + + case (Module_ExtPtfm) + call ExtPtfm_End(T%ExtPtfm%Input(1), T%ExtPtfm%p, T%ExtPtfm%x(STATE_CURR), T%ExtPtfm%xd(STATE_CURR), & + T%ExtPtfm%z(STATE_CURR), T%ExtPtfm%OtherSt(STATE_CURR), T%ExtPtfm%y, T%ExtPtfm%m, ErrStat2, ErrMsg2) + + case (Module_FEAM) + call FEAM_End(T%FEAM%Input(1), T%FEAM%p, T%FEAM%x(STATE_CURR), T%FEAM%xd(STATE_CURR), T%FEAM%z(STATE_CURR), & + T%FEAM%OtherSt(STATE_CURR), T%FEAM%y, T%FEAM%m, ErrStat2, ErrMsg2) + + case (Module_HD) + call HydroDyn_End(T%HD%Input(1), T%HD%p, T%HD%x(STATE_CURR), T%HD%xd(STATE_CURR), T%HD%z(STATE_CURR), T%HD%OtherSt(STATE_CURR), & + T%HD%y, T%HD%m, ErrStat2, ErrMsg2) + + case (Module_IceD) + call IceD_End(T%IceD%Input(1, ModData%Ins), T%IceD%p(ModData%Ins), & + T%IceD%x(ModData%Ins, STATE_CURR), T%IceD%xd(ModData%Ins, STATE_CURR), & + T%IceD%z(ModData%Ins, STATE_CURR), T%IceD%OtherSt(ModData%Ins, STATE_CURR), & + T%IceD%y(ModData%Ins), T%IceD%m(ModData%Ins), ErrStat2, ErrMsg2) + + case (Module_IceF) + call IceFloe_End(T%IceF%Input(1), T%IceF%p, T%IceF%x(STATE_CURR), T%IceF%xd(STATE_CURR), & + T%IceF%z(STATE_CURR), T%IceF%OtherSt(STATE_CURR), T%IceF%y, T%IceF%m, ErrStat2, ErrMsg2) + + case (Module_IfW) + call InflowWind_End(T%IfW%Input(1), T%IfW%p, T%IfW%x(STATE_CURR), T%IfW%xd(STATE_CURR), & + T%IfW%z(STATE_CURR), T%IfW%OtherSt(STATE_CURR), T%IfW%y, T%IfW%m, ErrStat2, ErrMsg2) + + case (Module_MAP) + call MAP_End(T%MAP%Input(1), T%MAP%p, T%MAP%x(STATE_CURR), T%MAP%xd(STATE_CURR), & + T%MAP%z(STATE_CURR), T%MAP%OtherSt, T%MAP%y, ErrStat2, ErrMsg2) + + case (Module_MD) + call MD_End(T%MD%Input(1), T%MD%p, T%MD%x(STATE_CURR), T%MD%xd(STATE_CURR), T%MD%z(STATE_CURR), & + T%MD%OtherSt(STATE_CURR), T%MD%y, T%MD%m, ErrStat2, ErrMsg2) + + case (Module_Orca) + call Orca_End(T%Orca%Input(1), T%Orca%p, T%Orca%x(STATE_CURR), T%Orca%xd(STATE_CURR), & + T%Orca%z(STATE_CURR), T%Orca%OtherSt(STATE_CURR), T%Orca%y, T%Orca%m, ErrStat2, ErrMsg2) + + case (Module_SD) + call SD_End(T%SD%Input(1), T%SD%p, T%SD%x(STATE_CURR), T%SD%xd(STATE_CURR), & + T%SD%z(STATE_CURR), T%SD%OtherSt(STATE_CURR), & + T%SD%y, T%SD%m, ErrStat2, ErrMsg2) + + case (Module_SeaSt) + call SeaSt_End(T%SeaSt%Input(1), T%SeaSt%p, T%SeaSt%x(STATE_CURR), T%SeaSt%xd(STATE_CURR), & + T%SeaSt%z(STATE_CURR), T%SeaSt%OtherSt(STATE_CURR), & + T%SeaSt%y, T%SeaSt%m, ErrStat2, ErrMsg2) + + case (Module_SlD) + call SlD_End(T%SlD%Input(1), T%SlD%p, T%SlD%x(STATE_CURR), T%SlD%xd(STATE_CURR), & + T%SlD%z(STATE_CURR), T%SlD%OtherSt(STATE_CURR), & + T%SlD%y, T%SlD%m, ErrStat2, ErrMsg2) + + case (Module_SrvD) + call SrvD_End(T%SrvD%Input(1, ModData%Ins), T%SrvD%p(ModData%Ins), T%SrvD%x(ModData%Ins, STATE_CURR), T%SrvD%xd(ModData%Ins, STATE_CURR), & + T%SrvD%z(ModData%Ins, STATE_CURR), T%SrvD%OtherSt(ModData%Ins, STATE_CURR), & + T%SrvD%y(ModData%Ins), T%SrvD%m(ModData%Ins), ErrStat2, ErrMsg2) + + case default + call SetErrStat(ErrID_Fatal, "Unknown module "//trim(ModData%Abbr), ErrStat, ErrMsg, RoutineName) + return + end select + + end associate + + ! Collect errors + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +end module diff --git a/modules/openfast-library/src/FAST_Library.f90 b/modules/openfast-library/src/FAST_Library.f90 index 2c672e0be9..7d542ef744 100644 --- a/modules/openfast-library/src/FAST_Library.f90 +++ b/modules/openfast-library/src/FAST_Library.f90 @@ -12,25 +12,41 @@ MODULE FAST_Data USE, INTRINSIC :: ISO_C_Binding - USE FAST_Subs ! all of the ModuleName and ModuleName_types modules are inherited from FAST_Subs + USE NWTC_Library_Types + USE FAST_Types + USE FAST_Subs, only: ExitThisProgram_T, & + FAST_AdvanceToNextTimeStep_T, & + FAST_CreateCheckpoint_T, & + FAST_InitIOarrays_SubStep_T, & + FAST_InitializeAll_T, & + FAST_Linearize_T, & + FAST_Prework_T, & + FAST_Reset_SubStep_T, & + FAST_RestoreFromCheckpoint_T, & + FAST_Solution0_T, & + FAST_Solution_T, & + FAST_Store_SubStep_T, & + FAST_UpdateStates_T, & + FAST_WriteOutput_T, & + FillOutputAry_T IMPLICIT NONE SAVE ! Local parameters: REAL(DbKi), PARAMETER :: t_initial = 0.0_DbKi ! Initial time - INTEGER(IntKi) :: NumTurbines INTEGER, PARAMETER :: IntfStrLen = 1025 ! length of strings through the C interface INTEGER(IntKi), PARAMETER :: MAXOUTPUTS = 4000 ! Maximum number of outputs INTEGER(IntKi), PARAMETER :: MAXInitINPUTS = 53 ! Maximum number of initialization values from Simulink INTEGER(IntKi), PARAMETER :: NumFixedInputs = 51 - - + integer(IntKi), parameter, private :: iED = 1 + ! Global (static) data: - TYPE(FAST_TurbineType), ALLOCATABLE :: Turbine(:) ! Data for each turbine - INTEGER(IntKi) :: n_t_global ! simulation time step, loop counter for global (FAST) simulation - INTEGER(IntKi) :: ErrStat ! Error status - CHARACTER(IntfStrLen-1) :: ErrMsg ! Error message (this needs to be static so that it will print in Matlab's mex library) + TYPE(FAST_TurbineType), ALLOCATABLE, private :: Turbine(:) ! Data for each turbine + INTEGER(IntKi), private :: NumTurbines + INTEGER(IntKi), private :: n_t_global ! simulation time step, loop counter for global (FAST) simulation + INTEGER(IntKi), private :: ErrStat ! Error status + CHARACTER(IntfStrLen-1), private :: ErrMsg ! Error message (this needs to be static so that it will print in Matlab's mex library) contains !================================================================================================================================== @@ -309,7 +325,7 @@ subroutine FAST_Update(iTurb_c, NumInputs_c, NumOutputs_c, InputAry, OutputAry, ErrMsg = TRIM(ErrMsg)//NewLine//TRIM(ErrMsg2) end if - IF ( Turbine(iTurb)%m_FAST%Lin%FoundSteady) THEN + IF ( Turbine(iTurb)%m_Glue%CS%FoundSteady) THEN EndSimulationEarly = .TRUE. END IF @@ -356,16 +372,16 @@ subroutine FAST_HubPosition(iTurb_c, AbsPosition_c, RotationalVel_c, Orientation return end if - if (.NOT. Turbine(iTurb)%ED%y%HubPtMotion%Committed) then + if (.NOT. Turbine(iTurb)%ED%y(iED)%HubPtMotion%Committed) then ErrStat_c = ErrID_Fatal ErrMsg = "HubPtMotion mesh has not been committed."//C_NULL_CHAR ErrMsg_c = TRANSFER( ErrMsg//C_NULL_CHAR, ErrMsg_c ) return end if - AbsPosition_c = REAL(Turbine(iTurb)%ED%y%HubPtMotion%Position(:,1), C_FLOAT) + REAL(Turbine(iTurb)%ED%y%HubPtMotion%TranslationDisp(:,1), C_FLOAT) - Orientation_c = reshape( Turbine(iTurb)%ED%y%HubPtMotion%Orientation(1:3,1:3,1), (/9/) ) - RotationalVel_c = Turbine(iTurb)%ED%y%HubPtMotion%RotationVel(:,1) + AbsPosition_c = REAL(Turbine(iTurb)%ED%y(iED)%HubPtMotion%Position(:,1), C_FLOAT) + REAL(Turbine(iTurb)%ED%y(iED)%HubPtMotion%TranslationDisp(:,1), C_FLOAT) + Orientation_c = reshape( Turbine(iTurb)%ED%y(iED)%HubPtMotion%Orientation(1:3,1:3,1), (/9/) ) + RotationalVel_c = Turbine(iTurb)%ED%y(iED)%HubPtMotion%RotationVel(:,1) end subroutine FAST_HubPosition !================================================================================================================================== @@ -589,7 +605,7 @@ subroutine FAST_ExtLoads_Init(iTurb_c, TMax, InputFileName_c, TurbIDforName, Out dt_c = DBLE(Turbine(iTurb)%p_FAST%DT) - NumBl_c = Turbine(iTurb)%ED%p%NumBl + NumBl_c = Turbine(iTurb)%ED%p(iED)%NumBl CompLoadsType = Turbine(iTurb)%p_FAST%CompAero @@ -956,7 +972,7 @@ subroutine FAST_ExtLoads_Restart(iTurb_c, CheckpointRootName_c, AbortErrLev_c, d n_t_global_c = n_t_global AbortErrLev_c = AbortErrLev NumOuts_c = min(MAXOUTPUTS, 1 + SUM( Turbine(iTurb)%y_FAST%numOuts )) ! includes time - numblades_c = Turbine(iTurb)%ED%p%NumBl + numblades_c = Turbine(iTurb)%ED%p(iED)%NumBl dt_c = Turbine(iTurb)%p_FAST%dt #ifdef CONSOLE_FILE diff --git a/modules/openfast-library/src/FAST_Library.h b/modules/openfast-library/src/FAST_Library.h index 5296d3e229..35e63288d5 100644 --- a/modules/openfast-library/src/FAST_Library.h +++ b/modules/openfast-library/src/FAST_Library.h @@ -69,7 +69,7 @@ EXTERNAL_ROUTINE void FAST_CreateCheckpoint(int * iTurb, const char *CheckpointR #define CHANNEL_LENGTH 20 #define MAXInitINPUTS 53 -#define NumFixedInputs 2 + 2 + MAXIMUM_BLADES + 1 + MAXIMUM_AFCTRL + MAXIMUM_CABLE_DELTAL + MAXIMUM_CABLE_DELTALDOT +#define NumFixedInputs (2 + 2 + MAXIMUM_BLADES + 1 + MAXIMUM_AFCTRL + MAXIMUM_CABLE_DELTAL + MAXIMUM_CABLE_DELTALDOT) /* Fixed inputs list: 1 Generator Torque (N-m) 2 Electrical Power (W) diff --git a/modules/openfast-library/src/FAST_Lin.f90 b/modules/openfast-library/src/FAST_Lin.f90 deleted file mode 100644 index db4a637fff..0000000000 --- a/modules/openfast-library/src/FAST_Lin.f90 +++ /dev/null @@ -1,6958 +0,0 @@ -!********************************************************************************************************************************** -! FAST_Solver.f90, FAST_Subs.f90, FAST_Lin.f90, and FAST_Mods.f90 make up the FAST glue code in the FAST Modularization Framework. -! FAST_Prog.f90, FAST_Library.f90, FAST_Prog.c are different drivers for this code. -!.................................................................................................................................. -! LICENSING -! Copyright (C) 2013-2016 National Renewable Energy Laboratory -! Copyright (C) 2018 Envision Energy USA, LTD -! -! This file is part of FAST. -! -! Licensed under the Apache License, Version 2.0 (the "License"); -! you may not use this file except in compliance with the License. -! You may obtain a copy of the License at -! -! http://www.apache.org/licenses/LICENSE-2.0 -! -! Unless required by applicable law or agreed to in writing, software -! distributed under the License is distributed on an "AS IS" BASIS, -! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -! See the License for the specific language governing permissions and -! limitations under the License. -!********************************************************************************************************************************** -MODULE FAST_Linear - - USE FAST_Solver ! I mostly just want the modules that are inherited from this module, not the routines in it - - IMPLICIT NONE - - CONTAINS -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that initializes some variables for linearization. -SUBROUTINE Init_Lin(p_FAST, y_FAST, m_FAST, AD, ED, NumBl, NumBlNodes, ErrStat, ErrMsg) - - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data - TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data - INTEGER(IntKi), INTENT(IN ) :: NumBl !< Number of blades (for index into ED,AD input array) - INTEGER(IntKi), INTENT(IN ) :: NumBlNodes !< Number of blade nodes (for index into AD input array) - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: i, j, k ! loop/temp variables - INTEGER(IntKi) :: ThisModule ! Module ID # - INTEGER(IntKi) :: NumInstances ! Number of instances of each module - INTEGER(IntKi) :: NumStates ! Number of states required for the x_eig arrays - - INTEGER(IntKi) :: i_u ! loop/temp variables - INTEGER(IntKi) :: i_y, i_x ! loop/temp variables - - INTEGER(IntKi) :: NextStart(3) ! allocated to be size(LinStartIndx)=size(SizeLin); helps compute the next starting index for the module components - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'Init_Lin' - CHARACTER(200) :: ModAbrev - - - ErrStat = ErrID_None - ErrMsg = "" - - !..................... - ! determine the number of modules that will be linearized: - !..................... - p_FAST%Lin_NumMods = 0 - - ! InflowWind is first, if activated: - if ( p_FAST%CompInflow == Module_IfW ) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_IfW - call Init_Lin_IfW( p_FAST, y_FAST, AD%Input(1) ) ! overwrite some variables based on knowledge from glue code - end if - - ! SeaState next, if activated: - if ( p_FAST%CompSeaSt == Module_SeaSt ) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_SeaSt - end if - - ! ServoDyn is next, if activated: - if ( p_FAST%CompServo == Module_SrvD ) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_SrvD - end if - - - ! ElastoDyn is next; it is always activated: - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_ED - - ! BeamDyn is next, if activated: - if (p_FAST%CompElast == Module_BD) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_BD - end if - - ! AeroDyn is next, if activated: - if ( p_FAST%CompAero == Module_AD ) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_AD - end if - - ! HydroDyn is next, if activated: - if ( p_FAST%CompHydro == Module_HD ) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_HD - end if - - - ! SD or ExtPtfm is next, if activated: - if ( p_FAST%CompSub == Module_SD ) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_SD - else if ( p_FAST%CompSub == Module_ExtPtfm ) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_ExtPtfm - end if - - ! MAP is next, if activated: - if ( p_FAST%CompMooring == Module_MAP ) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_MAP - else if ( p_FAST%CompMooring == Module_MD ) then - p_FAST%Lin_NumMods = p_FAST%Lin_NumMods + 1 - p_FAST%Lin_ModOrder( p_FAST%Lin_NumMods ) = Module_MD - end if - - - !..................... - ! determine total number of inputs/outputs/contStates: - !..................... - y_FAST%Lin%Glue%SizeLin = 0 - y_FAST%Lin%Glue%NumOutputs = 0 - - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin = 0 - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_u)) y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_INPUT_COL) = size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_u) - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_y)) y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_OUTPUT_COL) = size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_y) - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_x)) y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_ContSTATE_COL) = size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_x) - - y_FAST%Lin%Glue%SizeLin = y_FAST%Lin%Glue%SizeLin + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin ! total number of inputs, outputs, and continuous states - - y_FAST%Lin%Glue%NumOutputs = y_FAST%Lin%Glue%NumOutputs + y_FAST%Lin%Modules(ThisModule)%Instance(k)%NumOutputs ! total number of WriteOutputs - end do - end do - - !..................... - ! compute the starting index in the combined (full) matrices: - !..................... - NextStart = 1 ! whole array - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - y_FAST%Lin%Modules(ThisModule)%Instance(k)%LinStartIndx = NextStart - NextStart = NextStart + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin - end do - end do - - - ! ................................... - ! determine which of the module inputs/outputs are written to file - ! ................................... - call Init_Lin_InputOutput(p_FAST, y_FAST, NumBl, NumBlNodes, ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! ................................... - ! get names of inputs, outputs, and continuous states - ! ................................... - call AllocAry( y_FAST%Lin%Glue%names_u, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), 'names_u', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%names_y, y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), 'names_y', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%names_x, y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'names_x', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%Use_u, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), 'use_u', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%Use_y, y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), 'use_y', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%RotFrame_u, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), 'RotFrame_u', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%RotFrame_y, y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), 'RotFrame_y', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%RotFrame_x, y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'RotFrame_x', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%DerivOrder_x, y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'DerivOrder_x', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%IsLoad_u, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), 'IsLoad_u', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - if (ErrStat >= AbortErrLev) return - - - i_u = 1 - i_y = 1 - i_x = 1 - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - ModAbrev = y_FAST%Module_Abrev(ThisModule) - NumInstances = size(y_FAST%Lin%Modules(ThisModule)%Instance) - - ! inputs - do k=1,NumInstances - if (NumInstances > 1 .or. trim(y_FAST%Module_Abrev(ThisModule)) == "BD") then - ModAbrev = TRIM(y_FAST%Module_Abrev(ThisModule))//'_'//trim(num2lstr(k)) - end if - - do j=1,y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_INPUT_COL) - y_FAST%Lin%Glue%names_u(i_u) = TRIM(ModAbrev)//' '//y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_u(j) - y_FAST%Lin%Glue%use_u( i_u) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%use_u(j) - y_FAST%Lin%Glue%IsLoad_u(i_u) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%IsLoad_u(j) - - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%RotFrame_u)) then - y_FAST%Lin%Glue%RotFrame_u(i_u) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%RotFrame_u(j) - else - y_FAST%Lin%Glue%RotFrame_u(i_u) = .false. - end if - i_u = i_u + 1; - end do - - end do - - ! outputs - do k=1,NumInstances - if (NumInstances > 1 .or. trim(y_FAST%Module_Abrev(ThisModule)) == "BD") then - ModAbrev = TRIM(y_FAST%Module_Abrev(ThisModule))//'_'//trim(num2lstr(k)) - end if - - do j=1,y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_OUTPUT_COL) - y_FAST%Lin%Glue%names_y(i_y) = TRIM(ModAbrev)//' '//y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_y(j) - y_FAST%Lin%Glue%use_y( i_y) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%use_y(j) - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%RotFrame_y)) then - y_FAST%Lin%Glue%RotFrame_y(i_y) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%RotFrame_y(j) - else - y_FAST%Lin%Glue%RotFrame_y(i_y) = .false. - end if - i_y = i_y + 1; - end do - end do - - ! continuous states - do k=1,NumInstances - if (NumInstances > 1 .or. trim(y_FAST%Module_Abrev(ThisModule)) == "BD") then - ModAbrev = TRIM(y_FAST%Module_Abrev(ThisModule))//'_'//trim(num2lstr(k)) - end if - - if (y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_ContSTATE_COL) > 0) then - if (p_FAST%WrVTK == VTK_ModeShapes) then ! allocate these for restart later - if (ThisModule == Module_ED) then - ! ED has only the active DOFs as the continuous states, but to perturb the OP [Perterb_OP()], we need all of the DOFs - NumStates = ED%p%NDOF*2 - else - NumStates = y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_ContSTATE_COL) - end if - - call AllocAry( y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_mag, NumStates, 'op_x_eig_mag', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_phase, NumStates, 'op_x_eig_phase', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - if (ErrStat >= AbortErrLev) return - - y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_mag = 0.0_R8Ki - y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_phase = 0.0_R8Ki - end if - end if - - - do j=1,y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_ContSTATE_COL) - y_FAST%Lin%Glue%names_x( i_x) = TRIM(ModAbrev)//' '//y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_x( j) - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%RotFrame_x)) then - y_FAST%Lin%Glue%RotFrame_x(i_x) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%RotFrame_x(j) - else - y_FAST%Lin%Glue%RotFrame_x(i_x) = .false. - end if - - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%DerivOrder_x)) then - y_FAST%Lin%Glue%DerivOrder_x(i_x) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%DerivOrder_x(j) - else - y_FAST%Lin%Glue%DerivOrder_x(i_x) = 0 - end if - i_x = i_x + 1; - end do - end do - - end do ! each module - - - !..................... - ! initialize variables for periodic steady state solution - !..................... - - m_FAST%Lin%NextLinTimeIndx = 1 - m_FAST%Lin%CopyOP_CtrlCode = MESH_NEWCOPY - m_FAST%Lin%n_rot = 0 - m_FAST%Lin%IsConverged = .false. - m_FAST%Lin%FoundSteady = .false. - m_FAST%Lin%ForceLin = .false. - m_FAST%Lin%AzimIndx = 1 - - p_FAST%AzimDelta = TwoPi / p_FAST%NLinTimes - - ! allocate space to save operating points - if (p_FAST%CalcSteady .or. p_FAST%WrVTK==VTK_ModeShapes) then - - call AllocateOP(p_FAST, y_FAST, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! allocate spaces for variables needed to determine - if (p_FAST%CalcSteady) then - - !call AllocAry(m_FAST%Lin%AzimTarget, p_FAST%NLinTimes,'AzimTarget', ErrStat2, ErrMsg2) - allocate( m_FAST%Lin%AzimTarget(0 : p_FAST%NLinTimes+1), stat=ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal,"Unable to allocate space for AzimTarget.",ErrStat,ErrMsg,RoutineName) - end if - - call AllocAry( m_FAST%Lin%LinTimes, p_FAST%NLinTimes, 'LinTimes', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - call AllocAry( m_FAST%Lin%Psi, p_FAST%LinInterpOrder+1, 'Psi', ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! these flattened output arrays will contain spaces for %WriteOutputs, which are being ignored for purposes of CalcSteady computations - call AllocAry( m_FAST%Lin%y_interp, y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), 'y_interp', ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - call AllocAry( m_FAST%Lin%Y_prevRot, y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), p_FAST%NLinTimes, 'Y_prevRot', ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - call AllocAry( m_FAST%Lin%y_ref, y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), 'y_ref', ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - !call AllocAry( m_FAST%Lin%eps_squared, y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), 'eps_squared', ErrStat2, ErrMsg2) ! for debugging - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - if (ErrStat < AbortErrLev) then - m_FAST%Lin%y_interp = 0.0_R8Ki - m_FAST%Lin%Y_prevRot = 0.0_R8Ki - m_FAST%Lin%y_ref = 1.0_R8Ki - !m_FAST%Lin%eps_squared = 0.0_ReKi - end if - - end if - - end if - - -END SUBROUTINE Init_Lin -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that initializes the names and rotating frame portion of IfW. -SUBROUTINE Init_Lin_IfW( p_FAST, y_FAST, u_AD ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(AD_InputType), INTENT(IN) :: u_AD !< The input meshes (already calculated) from AeroDyn - - INTEGER(IntKi) :: i, j, k ! loop counters - INTEGER(IntKi) :: i2 ! loop counters - INTEGER(IntKi) :: Node ! InflowWind node number - CHARACTER(25) :: NodeDesc ! Node description - INTEGER(IntKi) :: position ! position in string - - - ! compare with IfW_InputSolve(): - - Node = 0 !InflowWind node - - ! I'm going to overwrite some of the input/output descriptions - if (p_FAST%CompServo == MODULE_SrvD) then - Node = Node + 1 - NodeDesc = ' (hub)' - - do i=1,3 - position = index(y_FAST%Lin%Modules(Module_IfW)%Instance(1)%Names_u(i), ',') - 1 - y_FAST%Lin%Modules(Module_IfW)%Instance(1)%Names_u(i) = y_FAST%Lin%Modules(Module_IfW)%Instance(1)%Names_u(i)(1:position)//trim(NodeDesc)//& - y_FAST%Lin%Modules(Module_IfW)%Instance(1)%Names_u(i)(position+1:) - end do - do i=1,3 - position = index(y_FAST%Lin%Modules(Module_IfW)%Instance(1)%Names_y(i), ',') - 1 - y_FAST%Lin%Modules(Module_IfW)%Instance(1)%Names_y(i) = y_FAST%Lin%Modules(Module_IfW)%Instance(1)%Names_y(i)(1:position)//trim(NodeDesc)//& - y_FAST%Lin%Modules(Module_IfW)%Instance(1)%Names_y(i)(position+1:) - end do - end if - -END SUBROUTINE Init_Lin_IfW -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that initializes some use_u and use_y, which determine which, if any, inputs and outputs are output in the linearization file. -SUBROUTINE Init_Lin_InputOutput(p_FAST, y_FAST, NumBl, NumBlNodes, ErrStat, ErrMsg) - - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - INTEGER(IntKi), INTENT(IN ) :: NumBl !< Number of blades (for index into ED,AD input array) - INTEGER(IntKi), INTENT(IN ) :: NumBlNodes !< Number of blades nodes (for index into AD input array) - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: i, j, col ! loop/temp variables - INTEGER(IntKi) :: k ! loop/temp variables - INTEGER(IntKi) :: ThisModule ! Module ID # - - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'Init_Lin_InputOutput' - - - ErrStat = ErrID_None - ErrMsg = "" - - ! ................................... - ! allocate module arrays - ! ................................... - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - call AllocAry ( y_FAST%Lin%Modules(ThisModule)%Instance(k)%Use_u, size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_u), TRIM(y_FAST%Module_Abrev(ThisModule))//'_Use_u', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry ( y_FAST%Lin%Modules(ThisModule)%Instance(k)%Use_y, size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%Names_y), TRIM(y_FAST%Module_Abrev(ThisModule))//'_Use_y', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end do - - end do - if (ErrStat >= AbortErrLev) return - - - ! ................................... - ! set true/false flags for inputs: - ! ................................... - - if (p_FAST%LinInputs == LIN_NONE) then - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - y_FAST%Lin%Modules(ThisModule)%Instance(k)%use_u = .false. - end do - end do - elseif(p_FAST%LinInputs == LIN_STANDARD) then - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - y_FAST%Lin%Modules(ThisModule)%Instance(k)%use_u = .false. - end do - end do - -!NOTE: we assume that the standard inputs are the last inputs. These would ideally be checked against a stored set of indices so the order could be arbitrary - ! AD standard inputs: UserProp(NumBlNodes,NumBl), and 3 Extended inputs - if (p_FAST%CompAero == MODULE_AD) then - do j=1,NumBl*NumBlNodes+3 - y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%use_u(y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%SizeLin(LIN_INPUT_COL)+1-j) = .true. - end do - end if - - ! ED standard inputs: BlPitchCom, YawMom, GenTrq, extended input (collective pitch) - do j=1,NumBl+3 - y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%use_u(y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%SizeLin(LIN_INPUT_COL)+1-j) = .true. - end do - - ! IfW standard inputs (extended): HWindSpeed, PLexp, PropagationDir - if (p_FAST%CompInflow == MODULE_IfW) then - do j = 1,3 - y_FAST%Lin%Modules(MODULE_IfW)%Instance(1)%use_u(y_FAST%Lin%Modules(MODULE_IfW)%Instance(1)%SizeLin(LIN_INPUT_COL)+1-j) = .true. - end do - end if - - ! HD standard inputs (extended): WaveElev0, HWindSpeed, PLexp, PropagationDir - if (p_FAST%CompHydro == MODULE_HD) then - do j = 1,4 - y_FAST%Lin%Modules(MODULE_HD)%Instance(1)%use_u(y_FAST%Lin%Modules(MODULE_HD)%Instance(1)%SizeLin(LIN_INPUT_COL)+1-j) = .true. - end do - end if - - ! SD has no standard inputs - - elseif(p_FAST%LinInputs == LIN_ALL) then - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - y_FAST%Lin%Modules(ThisModule)%Instance(k)%use_u = .true. - end do - end do - end if - - - ! ................................... - ! set true/false flags for outputs: - ! ................................... - - if (p_FAST%LinOutputs == LIN_NONE) then - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - y_FAST%Lin%Modules(ThisModule)%Instance(k)%use_y = .false. - end do - end do - elseif(p_FAST%LinOutputs == LIN_STANDARD) then - - ! WriteOutput values are the last entries of the modules - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - col = y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_OUTPUT_COL) - y_FAST%Lin%Modules(ThisModule)%Instance(k)%NumOutputs !last column before WriteOutput occurs - do j=1,col - y_FAST%Lin%Modules(ThisModule)%Instance(k)%use_y(j) = .false. - end do - do j=col+1,y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_OUTPUT_COL) - y_FAST%Lin%Modules(ThisModule)%Instance(k)%use_y(j) = .true. - end do - end do - end do - - elseif(p_FAST%LinOutputs == LIN_ALL) then - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - y_FAST%Lin%Modules(ThisModule)%Instance(k)%use_y = .true. - end do - end do - end if - - -END SUBROUTINE Init_Lin_InputOutput -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that performs lineaization at current operating point for a turbine. -SUBROUTINE FAST_Linearize_OP(t_global, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - REAL(DbKi), INTENT(IN ) :: t_global !< current (global) simulation time - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: Un ! unit number for linearization output file (written in two parts) - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Linearize_OP' - - REAL(R8Ki), ALLOCATABLE :: dUdu(:,:), dUdy(:,:) ! variables for glue-code linearization - integer(intki) :: NumBl - integer(intki) :: k - CHARACTER(1024) :: LinRootName - CHARACTER(1024) :: OutFileName - CHARACTER(200) :: SimStr - CHARACTER(MaxWrScrLen) :: BlankLine - CHARACTER(*), PARAMETER :: Fmt = 'F10.2' - - - - ErrStat = ErrID_None - ErrMsg = "" - Un = -1 - - !..................... - SimStr = '(RotSpeed='//trim(num2lstr(ED%y%RotSpeed*RPS2RPM,Fmt))//' rpm, BldPitch1='//trim(num2lstr(ED%y%BlPitch(1)*R2D,Fmt))//' deg)' - - BlankLine = "" - CALL WrOver( BlankLine ) ! BlankLine contains MaxWrScrLen spaces - CALL WrOver ( ' Performing linearization '//trim(num2lstr(m_FAST%Lin%NextLinTimeIndx))//' at simulation time '//TRIM( Num2LStr(t_global) )//' s. '//trim(SimStr) ) - CALL WrScr('') - - !..................... - - LinRootName = TRIM(p_FAST%OutFileRoot)//'.'//trim(num2lstr(m_FAST%Lin%NextLinTimeIndx)) - - if (p_FAST%WrVTK == VTK_ModeShapes .and. .not. p_FAST%CalcSteady) then ! we already saved these for the CalcSteady case - call SaveOP(m_FAST%Lin%NextLinTimeIndx, p_FAST, y_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg, m_FAST%Lin%CopyOP_CtrlCode ) - !m_FAST%Lin%CopyOP_CtrlCode = MESH_UPDATECOPY ! we need a new copy for each LinTime - end if - - - NumBl = size(ED%Input(1)%BlPitchCom) - y_FAST%Lin%RotSpeed = ED%y%RotSpeed - y_FAST%Lin%Azimuth = ED%y%LSSTipPxa - - !..................... - ! ElastoDyn - !..................... - ! get the jacobians - call ED_JacobianPInput( t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), & - ED%y, ED%m, ErrStat2, ErrMsg2, dYdu=y_FAST%Lin%Modules(Module_ED)%Instance(1)%D, dXdu=y_FAST%Lin%Modules(Module_ED)%Instance(1)%B ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - call ED_JacobianPContState( t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), & - ED%y, ED%m, ErrStat2, ErrMsg2, dYdx=y_FAST%Lin%Modules(Module_ED)%Instance(1)%C, dXdx=y_FAST%Lin%Modules(Module_ED)%Instance(1)%A ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! get the operating point - call ED_GetOP( t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), & - ED%y, ED%m, ErrStat2, ErrMsg2, u_op=y_FAST%Lin%Modules(Module_ED)%Instance(1)%op_u, & - y_op=y_FAST%Lin%Modules(Module_ED)%Instance(1)%op_y, & - x_op=y_FAST%Lin%Modules(Module_ED)%Instance(1)%op_x, & - dx_op=y_FAST%Lin%Modules(Module_ED)%Instance(1)%op_dx ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_ED, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - - !..................... - ! BeamDyn - !..................... - if ( p_FAST%CompElast == Module_BD ) then - do k=1,p_FAST%nBeams - - ! get the jacobians - call BD_JacobianPInput( t_global, BD%Input(1,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), BD%OtherSt(k,STATE_CURR), & - BD%y(k), BD%m(k), ErrStat2, ErrMsg2, dYdu=y_FAST%Lin%Modules(Module_BD)%Instance(k)%D, & - dXdu=y_FAST%Lin%Modules(Module_BD)%Instance(k)%B, & - StateRel_x =y_FAST%Lin%Modules(Module_BD)%Instance(k)%StateRel_x, & - StateRel_xdot=y_FAST%Lin%Modules(Module_BD)%Instance(k)%StateRel_xdot ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - call BD_JacobianPContState( t_global, BD%Input(1,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), BD%OtherSt(k,STATE_CURR), & - BD%y(k), BD%m(k), ErrStat2, ErrMsg2, dYdx=y_FAST%Lin%Modules(Module_BD)%Instance(k)%C, dXdx=y_FAST%Lin%Modules(Module_BD)%Instance(k)%A, & - StateRotation=y_FAST%Lin%Modules(Module_BD)%Instance(k)%StateRotation) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! get the operating point - call BD_GetOP( t_global, BD%Input(1,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), BD%OtherSt(k,STATE_CURR), & - BD%y(k), BD%m(k), ErrStat2, ErrMsg2, u_op=y_FAST%Lin%Modules(Module_BD)%Instance(k)%op_u, y_op=y_FAST%Lin%Modules(Module_BD)%Instance(k)%op_y, & - x_op=y_FAST%Lin%Modules(Module_BD)%Instance(k)%op_x, dx_op=y_FAST%Lin%Modules(Module_BD)%Instance(k)%op_dx ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_BD, k, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - - end do - end if !BeamDyn - - - !..................... - ! InflowWind - !..................... - if ( p_FAST%CompInflow == Module_IfW ) then - ! get the jacobians - call InflowWind_JacobianPInput( t_global, IfW%Input(1), IfW%p, IfW%x(STATE_CURR), IfW%xd(STATE_CURR), IfW%z(STATE_CURR), & - IfW%OtherSt(STATE_CURR), IfW%y, IfW%m, ErrStat2, ErrMsg2, dYdu=y_FAST%Lin%Modules(Module_IfW)%Instance(1)%D ) - if(Failed()) return; - - ! get the operating point - call InflowWind_GetOP( t_global, IfW%Input(1), IfW%p, IfW%x(STATE_CURR), IfW%xd(STATE_CURR), IfW%z(STATE_CURR), & - IfW%OtherSt(STATE_CURR), IfW%y, IfW%m, ErrStat2, ErrMsg2, u_op=y_FAST%Lin%Modules(Module_IfW)%Instance(1)%op_u, & - y_op=y_FAST%Lin%Modules(Module_IfW)%Instance(1)%op_y ) - if(Failed()) return; - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_IfW, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - end if - - !..................... - ! SeaState - !..................... - if ( p_FAST%CompSeaSt == Module_SeaSt ) then - ! get the jacobians - call SeaSt_JacobianPInput( t_global, SeaSt%Input(1), SeaSt%p, SeaSt%x(STATE_CURR), SeaSt%xd(STATE_CURR), SeaSt%z(STATE_CURR), & - SeaSt%OtherSt(STATE_CURR), SeaSt%y, SeaSt%m, ErrStat2, ErrMsg2, dYdu=y_FAST%Lin%Modules(Module_SeaSt)%Instance(1)%D ) - if(Failed()) return; - - ! get the operating point - call SeaSt_GetOP( t_global, SeaSt%Input(1), SeaSt%p, SeaSt%x(STATE_CURR), SeaSt%xd(STATE_CURR), SeaSt%z(STATE_CURR), & - SeaSt%OtherSt(STATE_CURR), SeaSt%y, SeaSt%m, ErrStat2, ErrMsg2, u_op=y_FAST%Lin%Modules(Module_SeaSt)%Instance(1)%op_u, & - y_op=y_FAST%Lin%Modules(Module_SeaSt)%Instance(1)%op_y ) - if(Failed()) return; - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_SeaSt, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - end if - - !..................... - ! ServoDyn - !..................... - if ( p_FAST%CompServo == Module_SrvD ) then - ! get the jacobians - call SrvD_JacobianPInput( t_global, SrvD%Input(1), SrvD%p, SrvD%x(STATE_CURR), SrvD%xd(STATE_CURR), SrvD%z(STATE_CURR), & - SrvD%OtherSt(STATE_CURR), SrvD%y, SrvD%m, ErrStat2, ErrMsg2, & - dXdu=y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%B, & - dYdu=y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%D ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - call SrvD_JacobianPContState( t_global, SrvD%Input(1), SrvD%p, SrvD%x(STATE_CURR), SrvD%xd(STATE_CURR), SrvD%z(STATE_CURR), & - SrvD%OtherSt(STATE_CURR), SrvD%y, SrvD%m, ErrStat2, ErrMsg2, & - dYdx=y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%C, & - dXdx=y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%A ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! get the operating point - call SrvD_GetOP( t_global, SrvD%Input(1), SrvD%p, SrvD%x(STATE_CURR), SrvD%xd(STATE_CURR), SrvD%z(STATE_CURR), & - SrvD%OtherSt(STATE_CURR), SrvD%y, SrvD%m, ErrStat2, ErrMsg2, & - u_op=y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%op_u, & - dx_op=y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%op_dx, & - x_op=y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%op_x, & - y_op=y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%op_y ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - call WriteModuleLinearMatrices(Module_SrvD, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - end if - - !..................... - ! AeroDyn - !..................... - if ( p_FAST%CompAero == Module_AD ) then - ! get the jacobians - call AD_JacobianPInput( t_global, AD%Input(1), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), & - AD%OtherSt(STATE_CURR), AD%y, AD%m, ErrStat2, ErrMsg2, & - dXdu=y_FAST%Lin%Modules(Module_AD)%Instance(1)%B, & - dYdu=y_FAST%Lin%Modules(Module_AD)%Instance(1)%D ) - if(Failed()) return; - - call AD_JacobianPContState( t_global, AD%Input(1), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), & - AD%OtherSt(STATE_CURR), AD%y, AD%m, ErrStat2, ErrMsg2, & - dXdx=y_FAST%Lin%Modules(Module_AD)%Instance(1)%A, & - dYdx=y_FAST%Lin%Modules(Module_AD)%Instance(1)%C ) - if(Failed()) return; - - ! get the operating point - call AD_GetOP( t_global, AD%Input(1), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), & - AD%OtherSt(STATE_CURR), AD%y, AD%m, ErrStat2, ErrMsg2, & - u_op=y_FAST%Lin%Modules(Module_AD)%Instance(1)%op_u, & - y_op=y_FAST%Lin%Modules(Module_AD)%Instance(1)%op_y, & - x_op=y_FAST%Lin%Modules(Module_AD)%Instance(1)%op_x, & - dx_op=y_FAST%Lin%Modules(Module_AD)%Instance(1)%op_dx ) - if(Failed()) return; - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_AD, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - end if - - !..................... - ! HydroDyn - !..................... - if ( p_FAST%CompHydro == Module_HD ) then - ! get the jacobians - call HD_JacobianPInput( t_global, HD%Input(1), HD%p, HD%x(STATE_CURR), HD%xd(STATE_CURR), HD%z(STATE_CURR), HD%OtherSt(STATE_CURR), & - HD%y, HD%m, ErrStat2, ErrMsg2, dYdu=y_FAST%Lin%Modules(Module_HD)%Instance(1)%D, dXdu=y_FAST%Lin%Modules(Module_HD)%Instance(1)%B ) - if(Failed()) return; - - call HD_JacobianPContState( t_global, HD%Input(1), HD%p, HD%x(STATE_CURR), HD%xd(STATE_CURR), HD%z(STATE_CURR), HD%OtherSt(STATE_CURR), & - HD%y, HD%m, ErrStat2, ErrMsg2, dYdx=y_FAST%Lin%Modules(Module_HD)%Instance(1)%C, dXdx=y_FAST%Lin%Modules(Module_HD)%Instance(1)%A ) - if(Failed()) return; - - ! get the operating point - call HD_GetOP( t_global, HD%Input(1), HD%p, HD%x(STATE_CURR), HD%xd(STATE_CURR), HD%z(STATE_CURR), HD%OtherSt(STATE_CURR), & - HD%y, HD%m, ErrStat2, ErrMsg2, u_op=y_FAST%Lin%Modules(Module_HD)%Instance(1)%op_u, y_op=y_FAST%Lin%Modules(Module_HD)%Instance(1)%op_y, & - x_op=y_FAST%Lin%Modules(Module_HD)%Instance(1)%op_x, dx_op=y_FAST%Lin%Modules(Module_HD)%Instance(1)%op_dx ) - if(Failed()) return; - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_HD, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - end if - - !..................... - ! SubDyn / ExtPtfm - !..................... - if ( p_FAST%CompSub == Module_SD ) then - ! get the jacobians - call SD_JacobianPInput( t_global, SD%Input(1), SD%p, SD%x(STATE_CURR), SD%xd(STATE_CURR), & - SD%z(STATE_CURR), SD%OtherSt(STATE_CURR), SD%y, SD%m, ErrStat2, ErrMsg2, & - dYdu=y_FAST%Lin%Modules(Module_SD)%Instance(1)%D, dXdu=y_FAST%Lin%Modules(Module_SD)%Instance(1)%B ) - if(Failed()) return; - - call SD_JacobianPContState( t_global, SD%Input(1), SD%p, SD%x(STATE_CURR), SD%xd(STATE_CURR), & - SD%z(STATE_CURR), SD%OtherSt(STATE_CURR), SD%y, SD%m, ErrStat2, ErrMsg2,& - dYdx=y_FAST%Lin%Modules(Module_SD)%Instance(1)%C, dXdx=y_FAST%Lin%Modules(Module_SD)%Instance(1)%A ) - if(Failed()) return; - - ! get the operating point - call SD_GetOP(t_global, SD%Input(1), SD%p, SD%x(STATE_CURR), SD%xd(STATE_CURR), SD%z(STATE_CURR),& - SD%OtherSt(STATE_CURR), SD%y, SD%m, ErrStat2, ErrMsg2, u_op=y_FAST%Lin%Modules(Module_SD)%Instance(1)%op_u,& - y_op=y_FAST%Lin%Modules(Module_SD)%Instance(1)%op_y, & - x_op=y_FAST%Lin%Modules(Module_SD)%Instance(1)%op_x, dx_op=y_FAST%Lin%Modules(Module_SD)%Instance(1)%op_dx) - if(Failed()) return; - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_SD, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - - elseif ( p_FAST%CompSub == Module_ExtPtfm ) then - ! get the jacobians - call ExtPtfm_JacobianPInput( t_global, ExtPtfm%Input(1), ExtPtfm%p, ExtPtfm%x(STATE_CURR), ExtPtfm%xd(STATE_CURR), & - ExtPtfm%z(STATE_CURR), ExtPtfm%OtherSt(STATE_CURR), ExtPtfm%y, ExtPtfm%m, ErrStat2, ErrMsg2, & - dYdu=y_FAST%Lin%Modules(Module_ExtPtfm)%Instance(1)%D, dXdu=y_FAST%Lin%Modules(Module_ExtPtfm)%Instance(1)%B ) - if(Failed()) return; - - call ExtPtfm_JacobianPContState( t_global, ExtPtfm%Input(1), ExtPtfm%p, ExtPtfm%x(STATE_CURR), ExtPtfm%xd(STATE_CURR), & - ExtPtfm%z(STATE_CURR), ExtPtfm%OtherSt(STATE_CURR), ExtPtfm%y, ExtPtfm%m, ErrStat2, ErrMsg2,& - dYdx=y_FAST%Lin%Modules(Module_ExtPtfm)%Instance(1)%C, dXdx=y_FAST%Lin%Modules(Module_ExtPtfm)%Instance(1)%A ) - if(Failed()) return; - - ! get the operating point - call ExtPtfm_GetOP(t_global, ExtPtfm%Input(1), ExtPtfm%p, ExtPtfm%x(STATE_CURR), ExtPtfm%xd(STATE_CURR), ExtPtfm%z(STATE_CURR),& - ExtPtfm%OtherSt(STATE_CURR), ExtPtfm%y, ExtPtfm%m, ErrStat2, ErrMsg2, u_op=y_FAST%Lin%Modules(Module_ExtPtfm)%Instance(1)%op_u,& - y_op=y_FAST%Lin%Modules(Module_ExtPtfm)%Instance(1)%op_y, & - x_op=y_FAST%Lin%Modules(Module_ExtPtfm)%Instance(1)%op_x, dx_op=y_FAST%Lin%Modules(Module_ExtPtfm)%Instance(1)%op_dx) - if(Failed()) return; - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_ExtPtfm, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - - end if ! SubDyn/ExtPtfm - - - !..................... - ! MAP - !..................... - if ( p_FAST%CompMooring == Module_MAP ) then - ! LIN-TODO: We need this to compute the dYdu total derivative which is D for MAP, and the template uses OtherSt(STATE_CURR), but the FAST MAP DATA has OtherSt as a scalar - call MAP_JacobianPInput( t_global, MAPp%Input(1), MAPp%p, MAPp%x(STATE_CURR), MAPp%xd(STATE_CURR), MAPp%z(STATE_CURR), & - MAPp%OtherSt, MAPp%y, ErrStat2, ErrMsg2, y_FAST%Lin%Modules(Module_MAP)%Instance(1)%D ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! get the operating point - !LIN-TODO: template uses OtherSt(STATE_CURR), but the FAST MAP DATA has OtherSt as a scalar - ! email bonnie for a discussion on this. - call MAP_GetOP( t_global, MAPp%Input(1), MAPp%p, MAPp%x(STATE_CURR), MAPp%xd(STATE_CURR), MAPp%z(STATE_CURR), & - MAPp%OtherSt, MAPp%y, ErrStat2, ErrMsg2, & - y_FAST%Lin%Modules(Module_MAP)%Instance(1)%op_u, y_FAST%Lin%Modules(Module_MAP)%Instance(1)%op_y ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_MAP, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; - end if ! if ( p_FAST%CompMooring == Module_MAP ) - - - !..................... - ! MoorDyn - !..................... - if ( p_FAST%CompMooring == Module_MD ) then - - call MD_JacobianPInput( t_global, MD%Input(1), MD%p, MD%x(STATE_CURR), MD%xd(STATE_CURR), MD%z(STATE_CURR), & - MD%OtherSt(STATE_CURR), MD%y, MD%m, ErrStat2, ErrMsg2, & - dXdu=y_FAST%Lin%Modules(Module_MD)%Instance(1)%B, & - dYdu=y_FAST%Lin%Modules(Module_MD)%Instance(1)%D ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - call MD_JacobianPContState( t_global, MD%Input(1), MD%p, MD%x(STATE_CURR), MD%xd(STATE_CURR), MD%z(STATE_CURR), MD%OtherSt(STATE_CURR), & - MD%y, MD%m, ErrStat2, ErrMsg2, dYdx=y_FAST%Lin%Modules(Module_MD)%Instance(1)%C, & - dXdx=y_FAST%Lin%Modules(Module_MD)%Instance(1)%A ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! get the operating point - call MD_GetOP( t_global, MD%Input(1), MD%p, MD%x(STATE_CURR), MD%xd(STATE_CURR), MD%z(STATE_CURR), & - MD%OtherSt(STATE_CURR), MD%y, MD%m, ErrStat2, ErrMsg2, & - u_op=y_FAST%Lin%Modules(Module_MD)%Instance(1)%op_u, & - y_op=y_FAST%Lin%Modules(Module_MD)%Instance(1)%op_y, & - x_op=y_FAST%Lin%Modules(Module_MD)%Instance(1)%op_x, & - dx_op=y_FAST%Lin%Modules(Module_MD)%Instance(1)%op_dx ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_MD, 1, t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - if(Failed()) return; end if ! if ( p_FAST%CompMooring == Module_MD ) - - !..................... - ! Linearization of glue code Input/Output solve: - !..................... - - !..................... - ! Glue code (currently a linearization of SolveOption2): - ! Make sure we avoid any case where the operating point values change earlier in this routine (e.g., by calling the module Jacobian routines). - !..................... - - call Glue_GetOP(p_FAST, y_FAST, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - ! get the dUdu and dUdy matrices, which linearize SolveOption2 for the modules we've included in linearization - call Glue_Jacobians( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, MAPp, FEAM, MD, Orca, & - IceF, IceD, MeshMapData, dUdu, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - - - call WrLinFile_txt_Head(t_global, p_FAST, y_FAST, y_FAST%Lin%Glue, LinRootName, Un, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - - if (p_FAST%LinOutJac) then - ! Jacobians - call WrPartialMatrix( dUdu, Un, p_FAST%OutFmt, 'dUdu', UseRow=y_FAST%Lin%Glue%use_u, UseCol=y_FAST%Lin%Glue%use_u ) - call WrPartialMatrix( dUdy, Un, p_FAST%OutFmt, 'dUdy', UseRow=y_FAST%Lin%Glue%use_u, UseCol=y_FAST%Lin%Glue%use_y ) - end if - - - ! calculate the glue-code state matrices - call Glue_StateMatrices( p_FAST, y_FAST, dUdu, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - ! Write the results to the file: - call WrLinFile_txt_End(Un, p_FAST, y_FAST%Lin%Glue ) - - m_FAST%Lin%NextLinTimeIndx = m_FAST%Lin%NextLinTimeIndx + 1 - -contains - logical function Failed() - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - Failed = ErrStat >= AbortErrLev - if(Failed) call cleanup() - end function Failed - subroutine cleanup() - - if (allocated(dUdu)) deallocate(dUdu) - if (allocated(dUdy)) deallocate(dUdy) - - if (Un > 0) close(Un) - - end subroutine cleanup -END SUBROUTINE FAST_Linearize_OP -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that writes the A,B,C,D matrices from linearization to a text file. -SUBROUTINE WrLinFile_txt_Head(t_global, p_FAST, y_FAST, LinData, FileName, Un, ErrStat, ErrMsg) - - INTEGER(IntKi), INTENT( OUT) :: Un !< unit number - REAL(DbKi), INTENT(IN ) :: t_global !< current (global) simulation time - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< parameters - TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - TYPE(FAST_LinType), INTENT(IN ) :: LinData !< Linearization data for individual module or glue (coupled system) - CHARACTER(*), INTENT(IN ) :: FileName !< root name of the linearization file to open for writing - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: i ! loop counter - - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'WrLinFile_txt_Head' - INTEGER(IntKi) :: n(5) ! sizes of arrays to print - CHARACTER(*), PARAMETER :: TypeNames(5) = (/ 'continuous states', & - 'discrete states ', & - 'constraint states', & - 'inputs ', & - 'outputs ' /) - CHARACTER(50) :: Fmt - CHARACTER(32) :: Desc - - integer, parameter :: Indx_x = 1 - integer, parameter :: Indx_xd = 2 - integer, parameter :: Indx_z = 3 - integer, parameter :: Indx_u = 4 - integer, parameter :: Indx_y = 5 - - - ErrStat = ErrID_None - ErrMsg = "" - - n = 0; - if (allocated(LinData%names_x )) n(Indx_x) = size(LinData%names_x ) - if (allocated(LinData%names_xd)) n(Indx_xd) = size(LinData%names_xd) - if (allocated(LinData%names_z )) n(Indx_z) = size(LinData%names_z ) - !if (allocated(LinData%names_u )) n(Indx_u) = size(LinData%names_u ) - !if (allocated(LinData%names_y )) n(Indx_y) = size(LinData%names_y ) - - if (allocated(LinData%names_u )) then - do i=1,size(LinData%use_u) - if (LinData%use_u(i)) n(Indx_u) = n(Indx_u)+1 - end do - end if - - if (allocated(LinData%names_y )) then - do i=1,size(LinData%use_y) - if (LinData%use_y(i)) n(Indx_y) = n(Indx_y)+1 - end do - end if - - - CALL GetNewUnit( Un, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) then - Un = -1 - return - end if - - CALL OpenFOutFile ( Un, TRIM(FileName)//'.lin', ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) then - close( Un ) - Un = -1 - return - end if - - ! heading - - ! Add some file information: - - WRITE (Un,'(/,A)') 'Linearized model: '//TRIM( y_FAST%FileDescLines(1) ) - WRITE (Un,'(1X,A)') TRIM( y_FAST%FileDescLines(2) ) - WRITE (Un,'()' ) !print a blank line - WRITE (Un,'(A)' ) TRIM( y_FAST%FileDescLines(3) ) - WRITE (Un,'()' ) !print a blank line - - WRITE(Un, '(A)') 'Simulation information:' - fmt = '(3x,A,1x,'//trim(p_FAST%OutFmt_t)//',1x,A)' - !fmt = '(3x,A,1x,F10.4,1x,A)' - - Desc = 'Simulation time:'; WRITE (Un, fmt) Desc, t_global, 's' - Desc = 'Rotor Speed:'; WRITE (Un, fmt) Desc, y_FAST%Lin%RotSpeed, 'rad/s' - Desc = 'Azimuth:'; WRITE (Un, fmt) Desc, y_FAST%Lin%Azimuth, 'rad' - Desc = 'Wind Speed:'; WRITE (Un, fmt) Desc, y_FAST%Lin%WindSpeed, 'm/s' - - fmt = '(3x,A,1x,I5)' - do i=1,size(n) - Desc = 'Number of '//trim(TypeNames(i))//':' - WRITE(Un, fmt) Desc, n(i) - end do - - Desc = 'Jacobians included in this file?' - fmt = '(3x,A,1x,A5)' - if (p_FAST%LinOutJac) then - write (Un, fmt) Desc, 'Yes' - else - write (Un, fmt) Desc, 'No' - end if - - WRITE (Un,'()' ) !print a blank line - - - !...................................................... - ! Write the names of the output parameters on one line: - !...................................................... - if (n(Indx_x) > 0) then - WRITE(Un, '(A)') 'Order of continuous states:' - call WrLinFile_txt_Table(p_FAST, Un, "Row/Column", LinData%op_x, LinData%names_x, rotFrame=LinData%RotFrame_x, derivOrder=LinData%DerivOrder_x ) - - WRITE(Un, '(A)') 'Order of continuous state derivatives:' - call WrLinFile_txt_Table(p_FAST, Un, "Row/Column", LinData%op_dx, LinData%names_x, rotFrame=LinData%RotFrame_x, deriv=.true., derivOrder=LinData%DerivOrder_x ) - end if - - if (n(Indx_xd) > 0) then - WRITE(Un, '(A)') 'Order of discrete states:' - call WrLinFile_txt_Table(p_FAST, Un, "Row/Column", LinData%op_xd, LinData%names_xd ) - end if - - if (n(Indx_z) > 0) then - WRITE(Un, '(A)') 'Order of constraint states:' - call WrLinFile_txt_Table(p_FAST, Un, "Row/Column", LinData%op_z, LinData%names_z, rotFrame=LinData%RotFrame_z ) - end if - - if (n(Indx_u) > 0) then - WRITE(Un, '(A)') 'Order of inputs:' - call WrLinFile_txt_Table(p_FAST, Un, "Column ", LinData%op_u, LinData%names_u, rotFrame=LinData%RotFrame_u, UseCol=LinData%use_u ) - end if - - if (n(Indx_y) > 0) then - WRITE(Un, '(A)') 'Order of outputs:' - call WrLinFile_txt_Table(p_FAST, Un, "Row ", LinData%op_y, LinData%names_y, rotFrame=LinData%RotFrame_y, UseCol=LinData%use_y ) - end if - - !............. - if (p_FAST%LinOutJac) then - WRITE (Un,'(/,A,/)' ) 'Jacobian matrices:' !print a blank line - ! we'll have the modules write their own Jacobians outside this routine - end if - - -END SUBROUTINE WrLinFile_txt_Head -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that writes the A,B,C,D matrices from linearization to a text file. -SUBROUTINE WrLinFile_txt_End(Un, p_FAST, LinData) - - INTEGER(IntKi), INTENT(INOUT) :: Un !< unit number - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< parameters - TYPE(FAST_LinType), INTENT(IN ) :: LinData !< Linearization data for individual module or glue (coupled system) - - ! local variables - - WRITE (Un,'(/,A,/)' ) 'Linearized state matrices:' !print a blank line - - ! A matrix - if (allocated(LinData%A)) call WrPartialMatrix( LinData%A, Un, p_FAST%OutFmt, 'A' ) - ! B matrix - if (allocated(LinData%B)) call WrPartialMatrix( LinData%B, Un, p_FAST%OutFmt, 'B', UseCol=LinData%use_u ) - - ! C matrix - if (allocated(LinData%C)) call WrPartialMatrix( LinData%C, Un, p_FAST%OutFmt, 'C', UseRow=LinData%use_y ) - ! D matrix - if (allocated(LinData%D)) call WrPartialMatrix( LinData%D, Un, p_FAST%OutFmt, 'D', UseRow=LinData%use_y, UseCol=LinData%use_u ) - - ! StateRotation matrix - if (allocated(LinData%StateRotation)) call WrPartialMatrix( LinData%StateRotation, Un, p_FAST%OutFmt, 'StateRotation' ) - - ! RelState matrices - if (allocated(LinData%StateRel_x)) call WrPartialMatrix( LinData%StateRel_x, Un, p_FAST%OutFmt, 'State_Rel_x' ) - if (allocated(LinData%StateRel_xdot)) call WrPartialMatrix( LinData%StateRel_xdot, Un, p_FAST%OutFmt, 'State_Rel_xdot' ) - - close(Un) - Un = -1 - -END SUBROUTINE WrLinFile_txt_End -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE WrLinFile_txt_Table(p_FAST, Un, RowCol, op, names, rotFrame, deriv, derivOrder, UseCol,start_indx) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< parameters - INTEGER(IntKi), INTENT(IN ) :: Un !< unit number - CHARACTER(*), INTENT(IN ) :: RowCol !< Row/Column description - REAL(ReKi), INTENT(IN ) :: op(:) !< operating point values (possibly different size that Desc because of orientations) - CHARACTER(LinChanLen), INTENT(IN ) :: names(:) !< Descriptions of the channels (names and units) - logical, optional, INTENT(IN ) :: rotFrame(:) !< determines if this parameter is in the rotating frame - logical, optional, intent(in ) :: deriv !< flag that tells us if we need to modify the channel names for derivatives (xdot) - integer(IntKi), optional, intent(in ) :: derivOrder(:) !< Order of the time derivatives associated with the channel - logical, optional, intent(in ) :: UseCol(:) !< flags that tell us if we should use each column or skip it - INTEGER(IntKi),optional, INTENT(IN ) :: start_indx !< starting index (so extended inputs can be numbered starting after the # of inputs) - - ! local variables - INTEGER(IntKi) :: TS ! tab stop column - INTEGER(IntKi) :: i, i_print ! loop counter - INTEGER(IntKi) :: i_op ! loop counter - - logical :: UseDerivNames !< flag that tells us if we need to modify the channel names for derivatives (xdot) - logical :: UseThisCol !< flag that tells us if we should use this particular column or skip it - logical :: RotatingCol !< flag that tells us if this column is in the rotating frame - integer(IntKi) :: DerivOrdCol !< integer indicating the maximum time-derivative order of a channel (this will be 0 for anything that is not a continuous state) - CHARACTER(*), PARAMETER :: RoutineName = 'WrLinFile_txt_Table' - CHARACTER(100) :: Fmt - CHARACTER(100) :: Fmt_Str - CHARACTER(100) :: FmtOrient - CHARACTER(25) :: DerivStr - CHARACTER(25) :: DerivUnitStr - - - - if (present(deriv) ) then - UseDerivNames = deriv - else - UseDerivNames = .false. - end if - - - TS = 14 + 3*p_FAST%FmtWidth+7 ! tab stop after operating point - - Fmt = '(3x,I8,3x,'//trim(p_FAST%OutFmt)//',T'//trim(num2lstr(TS))//',L8,8x,I8,9x,A)' - FmtOrient = '(3x,I8,3x,'//trim(p_FAST%OutFmt)//',2(", ",'//trim(p_FAST%OutFmt)//'),T'//trim(num2lstr(TS))//',L8,8x,I8,9x,A)' - Fmt_Str = '(3x,A10,1x,A,T'//trim(num2lstr(TS))//',A15,1x,A16,1x,A)' - - WRITE(Un, Fmt_Str) RowCol, 'Operating Point', 'Rotating Frame?', 'Derivative Order', 'Description' - WRITE(Un, Fmt_Str) '----------','---------------', '---------------', '----------------', '-----------' - - i_op = 1 - if (present(start_indx)) then - i_print = start_indx + 1 - else - i_print = 1 - end if - - if (UseDerivNames) then - if (p_FAST%CompAeroMaps .and. p_FAST%CompElast /= MODULE_BD) then ! this might not work if we are using some other (not BD, ED) module with states - DerivStr = 'Second time derivative of' - DerivUnitStr = '/s^2' - else - DerivStr = 'First time derivative of' - DerivUnitStr = '/s' - end if - else - DerivStr = '' - DerivUnitStr = '' - end if - - do i=1,size(names) - - UseThisCol = .true. - if (present(UseCol)) then - UseThisCol = useCol(i) - end if - - DerivOrdCol = 0 - if (present(derivOrder)) DerivOrdCol = derivOrder(i) - - RotatingCol = .false. - if (present(rotFrame)) RotatingCol = rotFrame(i) - - if (index(names(i), ' orientation angle, node ') > 0 ) then ! make sure this matches what is written in PackMotionMesh_Names() - if (UseThisCol) then - WRITE(Un, FmtOrient) i_print, op(i_op), op(i_op+1), op(i_op+2), RotatingCol, DerivOrdCol, trim(names(i)) !//' [OP is a row of the DCM] - i_print = i_print + 1 - end if - - i_op = i_op + 3 - else - if (UseThisCol) then - if (UseDerivNames) then - WRITE(Un, Fmt) i_print, op(i_op), RotatingCol, DerivOrdCol, trim(DerivStr)//' '//trim(names(i))//trim(DerivUnitStr) - else - WRITE(Un, Fmt) i_print, op(i_op), RotatingCol, DerivOrdCol, trim(names(i)) - end if - i_print = i_print + 1 - end if - - i_op = i_op + 1 - end if - end do - - WRITE (Un,'()' ) !print a blank line - - - -END SUBROUTINE WrLinFile_txt_Table -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE WriteModuleLinearMatrices(ThisModule, ThisInstance, t_global, p_FAST, y_FAST, LinRootName, ErrStat, ErrMsg) - INTEGER(IntKi), INTENT(IN ) :: ThisModule !< Module index - INTEGER(IntKi), INTENT(IN ) :: ThisInstance !< Module instance index - - REAL(DbKi), INTENT(IN ) :: t_global !< current time step (written in file) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code -! TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - CHARACTER(*), INTENT(IN ) :: LinRootName !< root name for linearization output files - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CHARACTER(1024) :: OutFileName - INTEGER(IntKi) :: Un ! unit number for linearization file - - ErrStat = ErrID_None - ErrMsg = "" - - ! write the module matrices: - if (p_FAST%LinOutMod) then - - OutFileName = trim(LinRootName)//'.'//TRIM(y_FAST%Module_Abrev(ThisModule)) - if (size(y_FAST%Lin%Modules(ThisModule)%Instance) > 1 .or. ThisModule==Module_BD) OutFileName = trim(OutFileName)//TRIM(num2lstr(ThisInstance)) - - call WrLinFile_txt_Head(t_global, p_FAST, y_FAST, y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance), OutFileName, Un, ErrStat, ErrMsg ) - if (ErrStat >=AbortErrLev) then - if (Un > 0) close(Un) - return - end if - - if (p_FAST%LinOutJac) then - ! Jacobians - !dXdx: - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%A)) & - call WrPartialMatrix( y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%A, Un, p_FAST%OutFmt, 'dXdx' ) - - !dXdu: - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%B)) & - call WrPartialMatrix( y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%B, Un, p_FAST%OutFmt, 'dXdu', & - UseCol=y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%use_u ) - - ! dYdx: - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%C)) & - call WrPartialMatrix( y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%C, Un, p_FAST%OutFmt, 'dYdx', & - UseRow=y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%use_y ) - - !dYdu: - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%D)) & - call WrPartialMatrix( y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%D, Un, p_FAST%OutFmt, 'dYdu', & - UseRow=y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%use_y, & - UseCol=y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%use_u ) - - end if - - ! finish writing the file - call WrLinFile_txt_End(Un, p_FAST, y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance) ) - - end if -END SUBROUTINE WriteModuleLinearMatrices -!---------------------------------------------------------------------------------------------------------------------------------- - -!> This routine returns the operating points for the entire glue code. -SUBROUTINE Glue_GetOP(p_FAST, y_FAST, ErrStat, ErrMsg) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< parameters - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - INTEGER(IntKi) :: i, j, k ! loop/temp variables - INTEGER(IntKi) :: ThisModule ! Module ID # - INTEGER(IntKi) :: i_u ! loop/temp variables - INTEGER(IntKi) :: i_y, i_x ! loop/temp variables - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'Glue_GetOP' - - - ErrStat = ErrID_None - ErrMsg = "" - - if (.not. allocated(y_FAST%Lin%Glue%op_u)) then ! assume none of them are allocated - - ! calculate the size of the input and output operating points - ! this size isn't very straightforward since it may contain orientations - i_u = 0 - i_y = 0 - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_u)) then - i_u = i_u + size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_u) - end if - - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_y)) then - i_y = i_y + size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_y) - end if - end do - end do - - call AllocAry( y_FAST%Lin%Glue%op_u, i_u, 'op_u', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%op_y, i_y, 'op_y', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%op_x, y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'op_x', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call AllocAry( y_FAST%Lin%Glue%op_dx, y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'op_dx', ErrStat2, ErrMsg2) - call SetErrStat(errStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - if (ErrStat >=AbortErrLev) return - end if - - - i_u = 1 - i_y = 1 - i_x = 1 - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_u)) then - do j=1,size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_u) - y_FAST%Lin%Glue%op_u(i_u) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_u(j) - i_u = i_u + 1; - end do - end if - - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_y)) then - do j=1,size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_y) - y_FAST%Lin%Glue%op_y(i_y) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_y(j) - i_y = i_y + 1; - end do - end if - - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x)) then - do j=1,size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x) - y_FAST%Lin%Glue%op_x(i_x) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x(j) - - y_FAST%Lin%Glue%op_dx(i_x) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_dx(j) - i_x = i_x + 1; - end do - end if - - end do - end do - -END SUBROUTINE Glue_GetOP -!---------------------------------------------------------------------------------------------------------------------------------- - -!> This routine forms the Jacobian for the glue-code input-output solves. -SUBROUTINE Glue_Jacobians( p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, MAPp, FEAM, MD, Orca, & - IceF, IceD, MeshMapData, dUdu, dUdy, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), ALLOCATABLE, INTENT(INOUT) :: dUdu(:,:) !< Partial derivatives of input-output equations (U(y,u)=0) with respect - !! to the inputs (u) - REAL(R8Ki), ALLOCATABLE, INTENT(INOUT) :: dUdy(:,:) !< Partial derivatives of input-output equations (U(y,u)=0) with respect - !! to the outputs (y) - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - - ! local variables - INTEGER(IntKi) :: ThisModule ! Module ID - INTEGER(IntKi) :: i, j, k ! loop counter - INTEGER(IntKi) :: r_start, r_end ! row start/end of glue matrix - - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'Glue_Jacobians' - - ErrStat = ErrID_None - ErrMsg = "" - - - ! Note: Where the same Linearize_*_to_*() routines for mesh mapping are used in both dUdu and dUdy, the dUdy routines assume dUdu - ! has already called the routine (and so avoids calling the routines a second time). This means the dUdu routines must be called first. - - !..................................... - ! dUdu - !> \f$ \frac{\partial U_\Lambda}{\partial u} = - !! \begin{bmatrix} \frac{\partial U_\Lambda^{IfW}}{\partial u^{IfW}} & \frac{\partial U_\Lambda^{IfW}}{\partial u^{SrvD}} & - !! \frac{\partial U_\Lambda^{IfW}}{\partial u^{ED}} & \frac{\partial U_\Lambda^{IfW}}{\partial u^{BD}} & \frac{\partial U_\Lambda^{IfW}}{\partial u^{AD}} \\ - !! \frac{\partial U_\Lambda^{SrvD}}{\partial u^{IfW}} & \frac{\partial U_\Lambda^{SrvD}}{\partial u^{SrvD}} & - !! \frac{\partial U_\Lambda^{SrvD}}{\partial u^{ED}} & \frac{\partial U_\Lambda^{SrvD}}{\partial u^{BD}} & \frac{\partial U_\Lambda^{SrvD}}{\partial u^{AD}} \\ - !! \frac{\partial U_\Lambda^{ED}}{\partial u^{IfW}} & \frac{\partial U_\Lambda^{ED}}{\partial u^{SrvD}} & - !! \frac{\partial U_\Lambda^{ED}}{\partial u^{ED}} & \frac{\partial U_\Lambda^{ED}}{\partial u^{BD}} & \frac{\partial U_\Lambda^{ED}}{\partial u^{AD}} \\ - !! \frac{\partial U_\Lambda^{BD}}{\partial u^{IfW}} & \frac{\partial U_\Lambda^{BD}}{\partial u^{SrvD}} & - !! \frac{\partial U_\Lambda^{BD}}{\partial u^{ED}} & \frac{\partial U_\Lambda^{BD}}{\partial u^{BD}} & \frac{\partial U_\Lambda^{BD}}{\partial u^{AD}} \\ - !! \frac{\partial U_\Lambda^{AD}}{\partial u^{IfW}} & \frac{\partial U_\Lambda^{AD}}{\partial u^{SrvD}} & - !! \frac{\partial U_\Lambda^{AD}}{\partial u^{ED}} & \frac{\partial U_\Lambda^{AD}}{\partial u^{BD}} & \frac{\partial U_\Lambda^{AD}}{\partial u^{AD}} \\ - !! \end{bmatrix} = - !! \begin{bmatrix} I & 0 & 0 & 0 & \frac{\partial U_\Lambda^{IfW}}{\partial u^{AD}} \\ - !! 0 & I & 0 & 0 & 0 \\ - !! 0 & 0 & I & \frac{\partial U_\Lambda^{ED}}{\partial u^{BD}} & \frac{\partial U_\Lambda^{ED}}{\partial u^{AD}} \\ - !! 0 & 0 & 0 & \frac{\partial U_\Lambda^{BD}}{\partial u^{BD}} & \frac{\partial U_\Lambda^{BD}}{\partial u^{AD}} \\ - !! 0 & 0 & 0 & 0 & \frac{\partial U_\Lambda^{AD}}{\partial u^{AD}} \\ - !! \end{bmatrix} \f$ - !..................................... -! LIN-TODO: Add doc strings for new modules: SrvD & HD & MAP & SD - - if (.not. allocated(dUdu)) then - call AllocAry(dUdu, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), 'dUdu', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - dUdu = 0.0_R8Ki ! most of this matrix is zero, so we'll just initialize everything and set only the non-zero parts below - - - !............ - ! \f$ \frac{\partial U_\Lambda^{IfW}}{\partial u^{IfW}} = I \f$ \n - ! \f$ \frac{\partial U_\Lambda^{SrvD}}{\partial u^{SrvD}} = I \f$ \n - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial u^{ED}} = I \f$ \n - ! Note that we're also doing \f$ \frac{\partial U_\Lambda^{BD}}{\partial u^{BD}} = I \f$ and - ! \f$ \frac{\partial U_\Lambda^{AD}}{\partial u^{AD}} = I \f$ here; We will add values to the off=diagonal terms of those block matrices later. - !............ - do j = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder(j) - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - r_start = y_FAST%Lin%Modules(ThisModule)%Instance(k)%LinStartIndx(LIN_INPUT_COL) - r_end = r_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin( LIN_INPUT_COL) - 1 - do i = r_start,r_end - dUdu(i,i) = 1.0_R8Ki - end do - end do - end do - - - - !............ - ! \f$ \frac{\partial U_\Lambda^{SrvD}}{\partial u^{SrvD}} \end{bmatrix} = \f$ (dUdu block row 2=SrvD) - !............ - if (p_FAST%CompServo == MODULE_SrvD) then - call Linear_SrvD_InputSolve_du( p_FAST, y_FAST, SrvD%p, SrvD%Input(1), ED%y, BD, SD, MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - - !............ - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial u^{SrvD}} \end{bmatrix} = \f$ and - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial u^{BD}} \end{bmatrix} = \f$ and - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial u^{AD}} \end{bmatrix} = \f$ and - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial u^{HD}} \end{bmatrix} = \f$ and - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial u^{SD}} \end{bmatrix} = \f$ and - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial u^{MAP}} \end{bmatrix} = \f$ (dUdu block row 3=ED) - !............ - ! we need to do this for CompElast=ED and CompElast=BD - - call Linear_ED_InputSolve_du( p_FAST, y_FAST, SrvD, ED%p, ED%Input(1), ED%y, AD%p, AD%Input(1), AD%y, BD, HD, SD, MAPp, MD, MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - !............ - ! \f$ \frac{\partial U_\Lambda^{BD}}{\partial u^{BD}} \end{bmatrix} = \f$ and - ! \f$ \frac{\partial U_\Lambda^{BD}}{\partial u^{AD}} \end{bmatrix} = \f$ (dUdu block row 4=BD) - !............ - IF (p_FAST%CompElast == Module_BD) THEN - call Linear_BD_InputSolve_du( p_FAST, y_FAST, SrvD, ED%y, AD%p, AD%Input(1), AD%y, BD, MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF - - !............ - ! \f$ \frac{\partial U_\Lambda^{AD}}{\partial u^{AD}} \end{bmatrix} = \f$ (dUdu block row 5=AD) - !............ - IF (p_FAST%CompAero == MODULE_AD) THEN - call Linear_AD_InputSolve_du( p_FAST, y_FAST, AD%p, AD%Input(1), ED%y, BD, MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF - - - - !............ - ! \f$ \frac{\partial U_\Lambda^{HD}}{\partial u^{HD}} \end{bmatrix} = \f$ (dUdu block row 6=HD) - !............ - IF (p_FAST%CompHydro == MODULE_HD) THEN - call Linear_HD_InputSolve_du( p_FAST, y_FAST, HD%Input(1), ED%y, SD%y, MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF - - !............ - ! \f$ \frac{\partial U_\Lambda^{SD}}{\partial u^{HD}} \end{bmatrix} = \f$ and - ! \f$ \frac{\partial U_\Lambda^{SD}}{\partial u^{SD}} \end{bmatrix} = \f$ and - ! \f$ \frac{\partial U_\Lambda^{SD}}{\partial u^{MAP}} \end{bmatrix} = \f$ (dUdu block row 7=SD) - !............ - IF (p_FAST%CompSub == MODULE_SD) THEN - call Linear_SD_InputSolve_du( p_FAST, y_FAST, SrvD, SD%Input(1), SD%y, ED%y, HD, MAPp, MD, MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ELSE IF (p_FAST%CompSub == Module_ExtPtfm) THEN - CALL WrScr('>>> FAST_LIN: Linear_ExtPtfm_InputSolve_du, TODO') - ENDIF - - !............ - ! \f$ \frac{\partial U_\Lambda^{MD}}{\partial u^{MD}} \end{bmatrix} = \f$ (dUdu block row 9=MD) <<<< - !............ - if (p_FAST%CompMooring == MODULE_MD) then - call Linear_MD_InputSolve_du( p_FAST, y_FAST, MD%Input(1), ED%y, SD%y, MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - - ! LIN-TODO: Update the doc lines below to include SrvD, HD, SD, and MAP - !..................................... - ! dUdy - !> \f$ \frac{\partial U_\Lambda}{\partial y} = - !! \begin{bmatrix} \frac{\partial U_\Lambda^{IfW} }{\partial y^{IfW}} & \frac{\partial U_\Lambda^{IfW} }{\partial y^{SrvD}} & - !! \frac{\partial U_\Lambda^{IfW} }{\partial y^{ED} } & \frac{\partial U_\Lambda^{IfW} }{\partial y^{BD} } & \frac{\partial U_\Lambda^{IfW} }{\partial y^{AD}} \\ - !! \frac{\partial U_\Lambda^{SrvD}}{\partial y^{IfW}} & \frac{\partial U_\Lambda^{SrvD}}{\partial y^{SrvD}} & - !! \frac{\partial U_\Lambda^{SrvD}}{\partial y^{ED} } & \frac{\partial U_\Lambda^{SrvD}}{\partial y^{BD} } & \frac{\partial U_\Lambda^{SrvD}}{\partial y^{AD}} \\ - !! \frac{\partial U_\Lambda^{ED} }{\partial y^{IfW}} & \frac{\partial U_\Lambda^{ED} }{\partial y^{SrvD}} & - !! \frac{\partial U_\Lambda^{ED} }{\partial y^{ED} } & \frac{\partial U_\Lambda^{ED} }{\partial y^{BD} } & \frac{\partial U_\Lambda^{ED} }{\partial y^{AD}} \\ - !! \frac{\partial U_\Lambda^{BD} }{\partial y^{IfW}} & \frac{\partial U_\Lambda^{BD} }{\partial y^{SrvD}} & - !! \frac{\partial U_\Lambda^{BD} }{\partial y^{ED} } & \frac{\partial U_\Lambda^{BD} }{\partial y^{BD} } & \frac{\partial U_\Lambda^{BD} }{\partial y^{AD}} \\ - !! \frac{\partial U_\Lambda^{AD} }{\partial y^{IfW}} & \frac{\partial U_\Lambda^{AD} }{\partial y^{SrvD}} & - !! \frac{\partial U_\Lambda^{AD} }{\partial y^{ED} } & \frac{\partial U_\Lambda^{AD} }{\partial y^{BD} } & \frac{\partial U_\Lambda^{AD} }{\partial y^{AD}} \\ - !! \end{bmatrix} = - !! \begin{bmatrix} 0 & 0 & 0 & 0 & 0 \\ - !! 0 & 0 & \frac{\partial U_\Lambda^{SrvD}}{\partial y^{ED}} & 0 & 0 \\ - !! 0 & \frac{\partial U_\Lambda^{ED}}{\partial y^{SrvD}} & \frac{\partial U_\Lambda^{ED}}{\partial y^{ED}} & \frac{\partial U_\Lambda^{ED}}{\partial y^{BD}} & \frac{\partial U_\Lambda^{ED}}{\partial y^{AD}} \\ - !! 0 & 0 & \frac{\partial U_\Lambda^{BD}}{\partial y^{ED}} & \frac{\partial U_\Lambda^{BD}}{\partial y^{BD}} & \frac{\partial U_\Lambda^{BD}}{\partial y^{AD}} \\ - !! \frac{\partial U_\Lambda^{AD}}{\partial y^{IfW}} & 0 & \frac{\partial U_\Lambda^{AD}}{\partial y^{ED}} & \frac{\partial U_\Lambda^{AD}}{\partial y^{BD}} & 0 \\ - !! \end{bmatrix} \f$ - !..................................... - if (.not. allocated(dUdy)) then - call AllocAry(dUdy, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), 'dUdy', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - dUdy = 0.0_R8Ki ! most of this matrix is zero, so we'll just initialize everything and set only the non-zero parts below - - !............ - ! \f$ \frac{\partial U_\Lambda^{SrvD}}{\partial y^{ED}} \end{bmatrix} = \f$ (dUdy block row 2=SrvD) - !............ - if (p_FAST%CompServo == MODULE_SrvD) then ! need to do this regardless of CompElast - call Linear_SrvD_InputSolve_dy( p_FAST, y_FAST, SrvD%p, SrvD%Input(1), ED%p, ED%y, BD, SD%y, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - - - !............ - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial y^{SrvD}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial y^{ED}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial y^{BD}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial y^{AD}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial y^{HD}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial y^{SD}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{ED}}{\partial y^{MAP}} \end{bmatrix} = \f$ (dUdy block row 3=ED) - !............ - - call Linear_ED_InputSolve_dy( p_FAST, y_FAST, SrvD, ED%p, ED%Input(1), ED%y, AD%p, AD%Input(1), AD%y, BD, HD, SD, MAPp, MD, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - !............ - ! \f$ \frac{\partial U_\Lambda^{BD}}{\partial y^{ED}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{BD}}{\partial y^{BD}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{BD}}{\partial y^{AD}} \end{bmatrix} = \f$ (dUdy block row 4=BD) - !............ - if (p_FAST%CompElast == MODULE_BD) then - call Linear_BD_InputSolve_dy( p_FAST, y_FAST, SrvD, ED%p, ED%Input(1), ED%y, AD%p, AD%Input(1), AD%y, BD, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - - !............ - ! \f$ \frac{\partial U_\Lambda^{AD}}{\partial y^{IfW}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{AD}}{\partial y^{ED}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{AD}}{\partial y^{BD}} \end{bmatrix} = \f$ (dUdy block row 5=AD) - !............ - if (p_FAST%CompAero == MODULE_AD) then ! need to do this regardless of CompElast - - if (p_FAST%CompInflow == MODULE_IfW) then - call Linear_AD_InputSolve_IfW_dy( p_FAST, y_FAST, AD%p, AD%Input(1), dUdy ) - end if - - call Linear_AD_InputSolve_NoIfW_dy( p_FAST, y_FAST, AD%p, AD%Input(1), ED%p, ED%y, BD, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - end if - - - !............ - ! \f$ \frac{\partial U_\Lambda^{SD}}{\partial y^{ED}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{SD}}{\partial y^{HD}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{SD}}{\partial y^{SD}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{SD}}{\partial y^{MAP}} \end{bmatrix} = \f$ (dUdy block row 7=SD) - !............ - if (p_FAST%CompHydro == MODULE_HD) then - call Linear_HD_InputSolve_dy( p_FAST, y_FAST, HD%Input(1), ED%p, ED%y, SD%y, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - if (p_FAST%CompSeaSt == MODULE_SeaSt) then - call Linear_HD_InputSolve_SeaSt_dy( p_FAST, y_FAST, SeaSt%p, HD%p, HD%Input(1), dUdy ) - end if - - if (p_FAST%CompInflow == MODULE_IfW .and. p_FAST%MHK /= MHK_None) then - call Linear_HD_InputSolve_IfW_dy( p_FAST, y_FAST, HD%p, HD%Input(1), dUdy ) - end if - end if - - !LIN-TODO: Add doc strings and look at above doc string - IF (p_FAST%CompSub == Module_SD) THEN - call Linear_SD_InputSolve_dy( p_FAST, y_FAST, SrvD, SD%Input(1), SD%y, ED%p, ED%y, HD, MAPp, MD, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ELSE IF (p_FAST%CompSub == Module_ExtPtfm) THEN - CALL WrScr('>>> FAST_LIN: Linear_ExtPtfm_InputSolve_dy, TODO') - ENDIF - - !............ - ! \f$ \frac{\partial U_\Lambda^{MAP}}{\partial y^{ED}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{MAP}}{\partial y^{SD}} \end{bmatrix} = \f$ (dUdy block row 8=MAP) - !............ - if (p_FAST%CompMooring == MODULE_MAP) then - call Linear_MAP_InputSolve_dy( p_FAST, y_FAST, MAPp%Input(1), ED%p, ED%y, SD%y, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - !............ - ! \f$ \frac{\partial U_\Lambda^{MD}}{\partial y^{ED}} \end{bmatrix} = \f$ - ! \f$ \frac{\partial U_\Lambda^{MD}}{\partial y^{SD}} \end{bmatrix} = \f$ (dUdy block row 9=MD) <<<< - !............ - if (p_FAST%CompMooring == MODULE_MD) then - call Linear_MD_InputSolve_dy( p_FAST, y_FAST, MD%Input(1), ED%p, ED%y, SD%y, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - -END SUBROUTINE Glue_Jacobians - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{ED}/du^{BD} and dU^{ED}/du^{AD} blocks (ED row) of dUdu. (i.e., how do changes in the AD and BD inputs affect the ED inputs?) -SUBROUTINE Linear_ED_InputSolve_du( p_FAST, y_FAST, SrvD, p_ED, u_ED, y_ED, p_AD, u_AD, y_AD, BD, HD, SD, MAPp, MD, MeshMapData, dUdu, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - type(ServoDyn_Data), intent(in ) :: SrvD !< SrvD parameters - TYPE(ED_ParameterType), intent(in ) :: p_ED !< ED Inputs at t - TYPE(ED_InputType), INTENT(INOUT) :: u_ED !< ED Inputs at t - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AD parameters (for AD-ED load linerization) - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< AD inputs (for AD-ED load linerization) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BD data at t - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HD data at t - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SD data at t - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data at t - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< MD data at t - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: j ! Loops through StC instances - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: SrvD_Start ! starting index of dUdu (column) where SrvD StC load is - INTEGER(IntKi) :: BD_Start ! starting index of dUdu (column) where BD root motion inputs are located - INTEGER(IntKi) :: AD_Start ! starting index of dUdu (column) where AD motion inputs are located - INTEGER(IntKi) :: ED_Start_mt ! starting index of dUdu (row) where ED blade/tower or hub moment inputs are located - INTEGER(IntKi) :: HD_Start ! starting index of dUdu (column) where HD motion inputs are located - INTEGER(IntKi) :: SD_Start ! starting index of dUdu (column) where SD TP motion inputs are located - INTEGER(IntKi) :: MAP_Start ! starting index of dUdu (column) where MAP fairlead motion inputs are located - INTEGER(IntKi) :: MD_Start ! starting index of dUdu (column) where MD fairlead motion inputs are located - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_ED_InputSolve_du' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - !.......... - ! dU^{ED}/du^{SrvD} - !.......... - if (p_FAST%CompServo == MODULE_SrvD) then - ED_Start_mt = y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - !-------------------- - ! Blade (BD or ED) - if ( p_FAST%CompElast == Module_ED ) then - if ( allocated(SrvD%y%BStCLoadMesh) ) then - do j=1,size(SrvD%y%BStCLoadMesh,2) - do K = 1,SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - if (SrvD%y%BStCLoadMesh(K,j)%Committed) then - CALL Linearize_Point_to_Point( SrvD%y%BStCLoadMesh(k,j), u_ED%BladePtLoads(k), MeshMapData%BStC_P_2_ED_P_B(k,j), ErrStat2, ErrMsg2, SrvD%Input(1)%BStCMotionMesh(k,j), y_ED%BladeLn2Mesh(k) ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ED_Start_mt = ED_Start_mt + u_ED%BladePtLoads(k)%NNodes*3 ! 3 forces at each node (we're going to start at the moments since the M_us matrix is for moments...) - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_BStC_u(1,k,j) - ! SrvD is source in the mapping, so we want M_{uSm} (moments) - if (allocated(MeshMapData%BStC_P_2_ED_P_B(k,j)%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%BStC_P_2_ED_P_B(k,j)%dM%m_us, ED_Start_mt, SrvD_Start ) - end if - ! get starting index of next blade - ED_Start_mt = ED_Start_mt + u_ED%BladePtLoads(k)%NNodes* 3 - endif - enddo - enddo - endif - endif - !-------------------- - ! Nacelle (ED only) - if ( allocated(SrvD%y%NStCLoadMesh) ) then - do j = 1,size(SrvD%y%NStCLoadMesh) - if (SrvD%y%NStCLoadMesh(j)%Committed) then - call Linearize_Point_to_Point( SrvD%y%NStCLoadMesh(j), u_ED%NacelleLoads, MeshMapData%NStC_P_2_ED_P_N(j), ErrStat2, ErrMsg2, SrvD%Input(1)%NStCMotionMesh(j), y_ED%NacelleMotion ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ED_Start_mt = Indx_u_ED_Nacelle_Start(p_ED, u_ED, y_FAST) & - + u_ED%NacelleLoads%NNodes * 3 ! 3 forces at the nacelle (so we start at the moments) - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_NStC_u(1,j) - ! SrvD is source in the mapping, so we want M_{uSm} (moments) - if (allocated(MeshMapData%NStC_P_2_ED_P_N(j)%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%NStC_P_2_ED_P_N(j)%dM%m_us, ED_Start_mt, SrvD_Start ) - end if - endif - enddo - endif - !-------------------- - ! Tower (ED only) - if ( allocated(SrvD%y%TStCLoadMesh) ) then - do j = 1,size(SrvD%y%TStCLoadMesh) - if (SrvD%y%TStCLoadMesh(j)%Committed) then - call Linearize_Point_to_Point( SrvD%y%TStCLoadMesh(j), u_ED%TowerPtLoads, MeshMapData%TStC_P_2_ED_P_T(j), ErrStat2, ErrMsg2, SrvD%Input(1)%TStCMotionMesh(j), y_ED%TowerLn2Mesh ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ED_Start_mt = Indx_u_ED_Tower_Start(p_ED, u_ED, y_FAST) & - + u_ED%TowerPtLoads%NNodes * 3 ! 3 forces at the nacelle (so we start at the moments) - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_TStC_u(1,j) - ! SrvD is source in the mapping, so we want M_{uSm} (moments) - if (allocated(MeshMapData%TStC_P_2_ED_P_T(j)%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%TStC_P_2_ED_P_T(j)%dM%m_us, ED_Start_mt, SrvD_Start ) - endif - endif - enddo - endif - !-------------------- - ! Substructure (SD or ED) - if (p_FAST%CompSub /= MODULE_SD) then - if ( allocated(SrvD%y%SStCLoadMesh) ) then - do j=1,size(SrvD%y%SStCLoadMesh) - if (SrvD%y%SStCLoadMesh(j)%Committed) then - call Linearize_Point_to_Point( SrvD%y%SStCLoadMesh(j), u_ED%PlatformPtMesh, MeshMapData%SStC_P_P_2_SubStructure(j), ErrStat2, ErrMsg2, SrvD%Input(1)%SStCMotionMesh(j), y_ED%PlatformPtMesh ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ED_Start_mt = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) & - + u_ED%PlatformPtMesh%NNodes * 3 ! 3 forces at the nacelle (so we start at the moments) - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_SStC_u(1,j) - ! SrvD is source in the mapping, so we want M_{uSm} (moments) - if (allocated(MeshMapData%SStC_P_P_2_SubStructure(j)%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%SStC_P_P_2_SubStructure(j)%dM%m_us, ED_Start_mt, SrvD_Start ) - endif - endif - enddo - endif - endif - endif - - - !.......... - ! dU^{ED}/du^{AD} - !.......... - IF ( p_FAST%CompAero == Module_AD ) THEN - - ! ED inputs on blade from AeroDyn - IF (p_FAST%CompElast == Module_ED) THEN - - ED_Start_mt = y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - - DO K = 1,SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - ED_Start_mt = ED_Start_mt + u_ED%BladePtLoads(k)%NNodes*3 ! skip the forces on this blade - AD_Start = Indx_u_AD_Blade_Start(p_AD, u_AD, y_FAST, k) - - CALL Linearize_Line2_to_Point( y_AD%rotors(1)%BladeLoad(k), u_ED%BladePtLoads(k), MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), y_ED%BladeLn2Mesh(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! AD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%AD_L_2_BDED_B(k)%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%AD_L_2_BDED_B(k)%dM%m_us, ED_Start_mt, AD_Start ) - end if - - ! get starting index of next blade - ED_Start_mt = ED_Start_mt + u_ED%BladePtLoads(k)%NNodes* 3 ! skip the moments on this blade - - END DO - - END IF - - ! ED inputs on tower from AD: - IF ( y_AD%rotors(1)%TowerLoad%Committed ) THEN - ED_Start_mt = Indx_u_ED_Tower_Start(p_ED, u_ED, y_FAST) + u_ED%TowerPtLoads%NNodes * 3 ! skip 3 forces at each node - AD_Start = Indx_u_AD_Tower_Start(p_AD, u_AD, y_FAST) - - CALL Linearize_Line2_to_Point( y_AD%rotors(1)%TowerLoad, u_ED%TowerPtLoads, MeshMapData%AD_L_2_ED_P_T, ErrStat2, ErrMsg2, u_AD%rotors(1)%TowerMotion, y_ED%TowerLn2Mesh ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! AD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%AD_L_2_ED_P_T%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%AD_L_2_ED_P_T%dM%m_us, ED_Start_mt, AD_Start ) - end if - END IF - - ! ED inputs on Hub from AD: - IF ( y_AD%rotors(1)%HubLoad%Committed ) THEN - ED_Start_mt = Indx_u_ED_Hub_Start(p_ED, u_ED, y_FAST) + u_ED%HubPtLoad%NNodes * 3 ! skip 3 forces at each node - AD_Start = Indx_u_AD_Hub_Start(p_AD, u_AD, y_FAST) - - CALL Linearize_Point_to_Point( y_AD%rotors(1)%HubLoad, u_ED%HubPtLoad, MeshMapData%AD_P_2_ED_P_H, ErrStat2, ErrMsg2, u_AD%rotors(1)%HubMotion, y_ED%HubPtMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! AD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%AD_P_2_ED_P_H%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%AD_P_2_ED_P_H%dM%m_us, ED_Start_mt, AD_Start ) - end if - END IF - - ! ED inputs on Nacelle from AD: - IF ( y_AD%rotors(1)%NacelleLoad%Committed ) THEN - ED_Start_mt = Indx_u_ED_Nacelle_Start(p_ED, u_ED, y_FAST) + u_ED%NacelleLoads%NNodes * 3 ! skip 3 forces at each node - AD_Start = Indx_u_AD_Nacelle_Start(p_AD, u_AD, y_FAST) - - CALL Linearize_Point_to_Point( y_AD%rotors(1)%NacelleLoad, u_ED%NacelleLoads, MeshMapData%AD_P_2_ED_P_N, ErrStat2, ErrMsg2, u_AD%rotors(1)%NacelleMotion, y_ED%NacelleMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! AD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%AD_P_2_ED_P_N%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%AD_P_2_ED_P_N%dM%m_us, ED_Start_mt, AD_Start ) - end if - END IF - - ! ED inputs on Tailfin from AD: - IF ( y_AD%rotors(1)%TFinLoad%Committed ) THEN - ED_Start_mt = Indx_u_ED_TFin_Start(p_ED, u_ED, y_FAST) + u_ED%TFinCMLoads%NNodes * 3 ! skip 3 forces at each node - AD_Start = Indx_u_AD_TFin_Start(p_AD, u_AD, y_FAST) - - CALL Linearize_Point_to_Point( y_AD%rotors(1)%TFinLoad, u_ED%TFinCMLoads, MeshMapData%AD_P_2_ED_P_TF, ErrStat2, ErrMsg2, u_AD%rotors(1)%TFinMotion, y_ED%TFinCMMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! AD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%AD_L_2_ED_P_T%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%AD_P_2_ED_P_TF%dM%m_us, ED_Start_mt, AD_Start ) - end if - END IF - - END IF - - - !.......... - ! dU^{ED}/du^{BD} - !.......... - - IF ( p_FAST%CompElast == Module_BD ) THEN ! see routine U_ED_SD_HD_BD_Orca_Residual() in SolveOption1 - ED_Start_mt = Indx_u_ED_Hub_Start(p_ED, u_ED, y_FAST) & - + u_ED%HubPtLoad%NNodes * 3 ! 3 forces at the hub (so we start at the moments) - - ! Transfer BD loads to ED hub input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - do k=1,p_FAST%nBeams - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) - - CALL Linearize_Point_to_Point( BD%y(k)%ReactionForce, u_ED%HubPtLoad, MeshMapData%BD_P_2_ED_P(k), ErrStat2, ErrMsg2, BD%Input(1,k)%RootMotion, y_ED%HubPtMotion) !u_BD%RootMotion and y_ED%HubPtMotion contain the displaced positions for load calculations - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! BD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%BD_P_2_ED_P(k)%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%BD_P_2_ED_P(k)%dM%m_us, ED_Start_mt, BD_Start ) - end if - - end do ! k - - END IF - - ED_Start_mt = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) & - + u_ED%PlatformPtMesh%NNodes * 3 ! 3 forces at each node (we're going to start at the moments) - - if ( p_FAST%CompSub == Module_SD ) then - !.......... - ! dU^{ED}/du^{SD} - !.......... - ! Transfer SD load outputs to ED PlatformPtMesh input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - SD_Start = Indx_u_SD_TPMesh_Start(SD%Input(1), y_FAST) - - call Linearize_Point_to_Point( SD%y%Y1Mesh, u_ED%PlatformPtMesh, MeshMapData%SD_TP_2_ED_P, ErrStat2, ErrMsg2, SD%Input(1)%TPMesh, y_ED%PlatformPtMesh) !SD%Input(1)%TPMesh and y_ED%PlatformPtMesh contain the displaced positions for load calculations - call SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! SD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%SD_TP_2_ED_P%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%SD_TP_2_ED_P%dM%m_us, ED_Start_mt, SD_Start ) - end if - - else if ( p_FAST%CompSub == Module_None ) then - !.......... - ! dU^{ED}/du^{HD} - !.......... - - if ( p_FAST%CompHydro == Module_HD ) then ! HydroDyn-{ElastoDyn} - - ! we're just going to assume u_ED%PlatformPtMesh is committed - if ( HD%y%Morison%Mesh%Committed ) then ! meshes for floating - - - ! Transfer HD load outputs to ED PlatformPtMesh input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - HD_Start = Indx_u_HD_Morison_Start(HD%Input(1), y_FAST) - - call Linearize_Point_to_Point( HD%y%Morison%Mesh, u_ED%PlatformPtMesh, MeshMapData%HD_M_P_2_SubStructure, ErrStat2, ErrMsg2, HD%Input(1)%Morison%Mesh, y_ED%PlatformPtMesh) !HD%Input(1)%Morison and y_ED%PlatformPtMesh contain the displaced positions for load calculations - call SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! HD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%HD_M_P_2_SubStructure%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%HD_M_P_2_SubStructure%dM%m_us, ED_Start_mt, HD_Start ) - end if - - end if - if ( HD%y%WAMITMesh%Committed ) then ! meshes for floating - - ! Transfer HD load outputs to ED PlatformPtMesh input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - HD_Start = Indx_u_HD_WAMIT_Start(HD%Input(1), y_FAST) - - call Linearize_Point_to_Point( HD%y%WAMITMesh, u_ED%PlatformPtMesh, MeshMapData%HD_W_P_2_SubStructure, ErrStat2, ErrMsg2, HD%Input(1)%WAMITMesh, y_ED%PlatformPtMesh) !HD%Input(1)%WAMITMesh and y_ED%PlatformPtMesh contain the displaced positions for load calculations - call SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! HD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%HD_W_P_2_SubStructure%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%HD_W_P_2_SubStructure%dM%m_us, ED_Start_mt, HD_Start ) - end if - - end if - end if - - !.......... - ! dU^{ED}/du^{MAP} - !.......... - - if ( p_FAST%CompMooring == Module_MAP ) then - - ED_Start_mt = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) & - + u_ED%PlatformPtMesh%NNodes * 3 ! 3 forces at each node (we're going to start at the moments) - - ! Transfer MAP loads to ED PlatformPtmesh input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - - MAP_Start = y_FAST%Lin%Modules(MODULE_MAP)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - - ! NOTE: Assumes at least one MAP Fairlead point - - CALL Linearize_Point_to_Point( MAPp%y%ptFairleadLoad, u_ED%PlatformPtMesh, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, MAPp%Input(1)%PtFairDisplacement, y_ED%PlatformPtMesh) !MAPp%Input(1)%ptFairleadLoad and y_ED%PlatformPtMesh contain the displaced positions for load calculations - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! MAP is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%Mooring_2_Structure%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%Mooring_2_Structure%dM%m_us, ED_Start_mt, MAP_Start ) - end if - - !.......... - ! dU^{ED}/du^{MD} - !.......... - else if ( p_FAST%CompMooring == Module_MD ) then - - ED_Start_mt = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) & - + u_ED%PlatformPtMesh%NNodes * 3 ! 3 forces at each node (we're going to start at the moments) - - ! Transfer MD loads to ED PlatformPtmesh input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - - MD_Start = y_FAST%Lin%Modules(Module_MD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - - ! NOTE: Assumes at least one coupled MD object - - CALL Linearize_Point_to_Point( MD%y%CoupledLoads(1), u_ED%PlatformPtMesh, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, MD%Input(1)%CoupledKinematics(1), y_ED%PlatformPtMesh) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! HD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%Mooring_2_Structure%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%Mooring_2_Structure%dM%m_us, ED_Start_mt, MD_Start ) - end if - - end if - - end if -END SUBROUTINE Linear_ED_InputSolve_du - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{SD}/du^{SrvD}, dU^{SD}/du^{HD}, dU^{SD}/du^{SD}, and dU^{SD}/du^{MAP} blocks (SD row) of dUdu. (i.e., how do changes in SrvD, HD, SD, and MAP inputs affect the SD inputs?) -SUBROUTINE Linear_SD_InputSolve_du( p_FAST, y_FAST, SrvD, u_SD, y_SD, y_ED, HD, MAPp, MD, MeshMapData, dUdu, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - type(ServoDyn_Data), intent(in ) :: SrvD !< SrvD parameters - TYPE(SD_InputType), INTENT(INOUT) :: u_SD !< SD Inputs at t - TYPE(SD_OutputType), INTENT(IN ) :: y_SD !< SubDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HD data at t - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data at t - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< MD data at t - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^(SD)/du^(AD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: j, SrvD_Start - INTEGER(IntKi) :: HD_Start - INTEGER(IntKi) :: MAP_Start, MD_Start - INTEGER(IntKi) :: SD_Start, SD_Start_td, SD_Start_tr - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_SD_InputSolve_du' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - IF ( p_FAST%CompSub == Module_SD ) THEN ! see routine U_ED_SD_HD_BD_Orca_Residual() in SolveOption1 - - - !.......... - ! dU^{SD}/du^{SrvD} - !.......... - if (p_FAST%CompServo == MODULE_SrvD) then - !-------------------- - ! Substructure (SD or ED) - if ( allocated(SrvD%y%SStCLoadMesh) ) then - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) & - + u_SD%LMesh%NNodes * 3 ! 3 forces at each node (we're going to start at the moments) - do j=1,size(SrvD%y%SStCLoadMesh) - if (SrvD%y%SStCLoadMesh(j)%Committed) then - call Linearize_Point_to_Point( SrvD%y%SStCLoadMesh(j), u_SD%LMesh, MeshMapData%SStC_P_P_2_SubStructure(j), ErrStat2, ErrMsg2, SrvD%Input(1)%SStCMotionMesh(j), y_SD%Y3Mesh ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_SStC_u(1,j) - ! SrvD is source in the mapping, so we want M_{uSm} (moments) - if (allocated(MeshMapData%SStC_P_P_2_SubStructure(j)%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%SStC_P_P_2_SubStructure(j)%dM%m_us, SD_Start, SrvD_Start ) - endif - endif - enddo - endif - endif - - - !.......... - ! dU^{SD}/du^{SD} - !.......... - - call Linearize_Point_to_Point( y_ED%PlatformPtMesh, u_SD%TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! SD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - - SD_Start_td = y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - SD_Start_tr = SD_Start_td + u_SD%TPMesh%NNodes * 6 ! skip 2 fields (TranslationDisp and Orientation) with 3 components before translational velocity field - - ! translational velocity: - if (allocated(MeshMapData%ED_P_2_SD_TP%dM%tv_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%ED_P_2_SD_TP%dM%tv_ud, SD_Start_tr, SD_Start_td ) - end if - - ! translational acceleration: - SD_Start_tr = SD_Start_tr + u_SD%TPMesh%NNodes * 6 ! skip 2 fields ( TranslationVel and RotationVel) - if (allocated(MeshMapData%ED_P_2_SD_TP%dM%ta_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%ED_P_2_SD_TP%dM%ta_ud, SD_Start_tr, SD_Start_td ) - end if - - - - !.......... - ! dU^{SD}/du^{HD} - !.......... - - ! we're just going to assume u_SD%LMesh is committed - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) & - + u_SD%LMesh%NNodes * 3 ! 3 forces at each node (we're going to start at the moments) - - if ( p_FAST%CompHydro == Module_HD ) then ! HydroDyn-{ElastoDyn or SubDyn} - - - ! Transfer HD load outputs to SD LMesh input: - if ( HD%y%Morison%Mesh%Committed ) then ! meshes for floating - - ! dU^{SD}/du^{HD} - - ! we're mapping loads, so we also need the sibling meshes' displacements: - HD_Start = Indx_u_HD_Morison_Start(HD%Input(1), y_FAST) - - call Linearize_Point_to_Point( HD%y%Morison%Mesh, u_SD%LMesh, MeshMapData%HD_M_P_2_SubStructure, ErrStat2, ErrMsg2, HD%Input(1)%Morison%Mesh, y_SD%Y2Mesh) !HD%Input(1)%Mesh and y_ED%PlatformPtMesh contain the displaced positions for load calculations - call SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! HD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%HD_M_P_2_SubStructure%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%HD_M_P_2_SubStructure%dM%m_us, SD_Start, HD_Start ) - end if - - - - - end if - if ( HD%y%WAMITMesh%Committed ) then ! meshes for floating - - ! Transfer HD load outputs to ED PlatformPtMesh input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - HD_Start = Indx_u_HD_WAMIT_Start(HD%Input(1), y_FAST) - - call Linearize_Point_to_Point( HD%y%WAMITMesh, u_SD%LMesh, MeshMapData%HD_W_P_2_SubStructure, ErrStat2, ErrMsg2, HD%Input(1)%WAMITMesh, y_SD%Y2Mesh) !HD%Input(1)%Mesh and y_ED%PlatformPtMesh contain the displaced positions for load calculations - call SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! HD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%HD_W_P_2_SubStructure%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%HD_W_P_2_SubStructure%dM%m_us, SD_Start, HD_Start ) - end if - - - end if - end if - - !.......... - ! dU^{SD}/du^{MAP} - !.......... - - if ( p_FAST%CompMooring == Module_MAP ) then - - ! Transfer MAP loads to ED PlatformPtmesh input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - - MAP_Start = y_FAST%Lin%Modules(MODULE_MAP)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - - ! NOTE: Assumes at least one MAP Fairlead point - - CALL Linearize_Point_to_Point( MAPp%y%ptFairleadLoad, u_SD%LMesh, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, MAPp%Input(1)%PtFairDisplacement, y_SD%Y3Mesh) !MAPp%Input(1)%ptFairleadLoad and y_SD%Y3Mesh contain the displaced positions for load calculations - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! SD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%Mooring_2_Structure%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%Mooring_2_Structure%dM%m_us, SD_Start, MAP_Start ) - end if - - !.......... - ! dU^{SD}/du^{MD} - !.......... - else if ( p_FAST%CompMooring == Module_MD ) then - - ! Transfer MD loads to ED PlatformPtmesh input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - - MD_Start = y_FAST%Lin%Modules(Module_MD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - - ! NOTE: Assumes at least one coupled MD object - - CALL Linearize_Point_to_Point( MD%y%CoupledLoads(1), u_SD%LMesh, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, MD%Input(1)%CoupledKinematics(1), y_SD%Y3Mesh) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! SD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%Mooring_2_Structure%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%Mooring_2_Structure%dM%m_us, SD_Start, MD_Start ) - end if - - end if - - END IF -END SUBROUTINE Linear_SD_InputSolve_du - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{SD}/dy^{SrvD}, dU^{SD}/dy^{HD} and dU^{SD}/dy^{SD} blocks (SD row) of dUdu. (i.e., how do changes in SrvD, HD, and SD inputs affect the SD inputs?) -SUBROUTINE Linear_SD_InputSolve_dy( p_FAST, y_FAST, SrvD, u_SD, y_SD, p_ED, y_ED, HD, MAPp, MD, MeshMapData, dUdy, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - type(ServoDyn_Data), intent(in ) :: SrvD !< SrvD parameters - TYPE(SD_InputType), INTENT(INOUT) :: u_SD !< SD Inputs at t - TYPE(SD_OutputType), INTENT(IN ) :: y_SD !< SubDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(ED_ParameterType), intent(in ) :: p_ED !< ED Inputs at t - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HD data at t - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data at t - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< MD data at t - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^(SD)/dy^(SD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: j, SrvD_Out_Start, SD_Start, SD_Out_Start, HD_Start, HD_Out_Start, ED_Out_Start, MAP_Out_Start, MD_Out_Start - INTEGER(IntKi) :: MAP_Start, MD_Start -! INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation -! CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_SD_InputSolve_du' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - if ( p_FAST%CompSub /= Module_SD ) return - - !.......... - ! dU^{SD}/dy^{SrvD} - !.......... - if (p_FAST%CompServo == MODULE_SrvD) then - !-------------------- - ! Substructure (SD or ED) - if ( allocated(SrvD%y%SStCLoadMesh) ) then - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) ! start of u_SD%LMesh%Force field - do j=1,size(SrvD%y%SStCLoadMesh) - if (SrvD%y%SStCLoadMesh(j)%Committed) then - SrvD_Out_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_SStC_y(1,j) - call Assemble_dUdy_Loads(SrvD%y%SStCLoadMesh(j), u_SD%LMesh, MeshMapData%SStC_P_P_2_SubStructure(j), SD_Start, SrvD_Out_Start, dUdy) - endif - enddo - endif - endif - - !.......... - ! dU^{SD}/dy^{ED} - !.......... - - !!! ! This linearization was done in forming dUdu (see Linear_SD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!call Linearize_Point_to_Line2( y_ED%PlatformPtMesh, u_SD%TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - - SD_Start = Indx_u_SD_TPMesh_Start(u_SD, y_FAST) ! start of u_SD%MTPMesh%TranslationDisp field - ED_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of y_ED%PlatformPtMesh%TranslationDisp field - call Assemble_dUdy_Motions(y_ED%PlatformPtMesh, u_SD%TPMesh, MeshMapData%ED_P_2_SD_TP, SD_Start, ED_Out_Start, dUdy) - - !.......... - ! dU^{SD}/dy^{HD} - !.......... - ! HD - ! parts of dU^{SD}/dy^{HD} and dU^{SD}/dy^{SD}: - if ( p_FAST%CompHydro == Module_HD ) then ! HydroDyn-SubDyn - SD_Out_Start = Indx_y_SD_Y2Mesh_Start(y_SD, y_FAST) ! start of y_SD%Y2Mesh%TranslationDisp field - ! we're just going to assume u_SD%LMesh is committed - if ( HD%y%Morison%Mesh%Committed ) then ! meshes for floating - !!! ! This linearization was done in forming dUdu (see Linear_SD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - ! call Linearize_Point_to_Point( HD%y%Morison%Mesh, u_SD%LMesh, MeshMapData%HD_M_P_2_SubStructure, ErrStat2, ErrMsg2, HD%Input(1)%Morison%Mesh, y_SD%Y2Mesh) - HD_Out_Start = Indx_y_HD_Morison_Start(HD%y, y_FAST) - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) ! start of u_SD%LMesh%Force field - call Assemble_dUdy_Loads(HD%y%Morison%Mesh, u_SD%LMesh, MeshMapData%HD_M_P_2_SubStructure, SD_Start, HD_Out_Start, dUdy) - - ! SD translation displacement-to-SD moment transfer (dU^{SD}/dy^{SD}): - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) + u_SD%LMesh%NNodes*3 ! start of u_SD%LMesh%Moment field (skip the SD forces) - call SetBlockMatrix( dUdy, MeshMapData%HD_M_P_2_SubStructure%dM%m_uD, SD_Start, SD_Out_Start ) -! maybe this should be SumBlockMatrix with future changes to linearized modules??? - end if - if ( HD%y%WAMITMesh%Committed ) then ! meshes for floating - !!! ! This linearization was done in forming dUdu (see Linear_SD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - ! call Linearize_Point_to_Point( HD%y%WAMITMesh, u_SD%LMesh, MeshMapData%HD_W_P_2_SubStructure, ErrStat2, ErrMsg2, HD%Input(1)%WAMITMesh, y_SD%Y2Mesh) - HD_Out_Start = Indx_y_HD_WAMIT_Start(HD%y, y_FAST) - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) ! start of u_SD%LMesh%Force field - call Assemble_dUdy_Loads(HD%y%WAMITMesh, u_SD%LMesh, MeshMapData%HD_W_P_2_SubStructure, SD_Start, HD_Out_Start, dUdy) - - ! SD translation displacement-to-SD moment transfer (dU^{SD}/dy^{SD}): - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) + u_SD%LMesh%NNodes*3 ! start of u_SD%LMesh%Moment field (skip the SD forces) - call SumBlockMatrix( dUdy, MeshMapData%HD_W_P_2_SubStructure%dM%m_uD, SD_Start, SD_Out_Start ) -! maybe this should be SumBlockMatrix with future changes to linearized modules??? - end if - end if - - !.......... - ! dU^{SD}/dy^{MAP} - !.......... - if ( p_FAST%CompMooring == Module_MAP ) then - if ( MAPp%y%ptFairleadLoad%Committed ) then ! meshes for floating - !!! ! This linearization was done in forming dUdu (see Linear_SD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - ! CALL Linearize_Point_to_Point( MAPp%y%ptFairleadLoad, u_SD%LMesh, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, MAPp%Input(1)%PtFairDisplacement, y_SD%Y3Mesh) !MAPp%Input(1)%ptFairleadLoad and y_ED%Y3Mesh contain the displaced positions for load calculations - MAP_Out_Start = y_FAST%Lin%Modules(MODULE_MAP)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) ! start of u_SD%LMesh%TranslationDisp field - call Assemble_dUdy_Loads(MAPp%y%ptFairLeadLoad, u_SD%LMesh, MeshMapData%Mooring_2_Structure, SD_Start, MAP_Out_Start, dUdy) - - ! SD translation displacement-to-SD moment transfer (dU^{SD}/dy^{SD}): - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) + u_SD%LMesh%NNodes*3 ! start of u_ED%LMesh%Moment field (skip the SD forces) - SD_Out_Start = Indx_y_SD_Y3Mesh_Start(y_SD, y_FAST) ! start of y_SD%Y3Mesh%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%Mooring_2_Structure%dM%m_uD, SD_Start, SD_Out_Start ) - end if - - !.......... - ! dU^{SD}/dy^{MD} - !.......... - else if ( p_FAST%CompMooring == Module_MD ) then - if ( MD%y%CoupledLoads(1)%Committed ) then ! meshes for floating - !!! ! This linearization was done in forming dUdu (see Linear_SD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - MD_Out_Start = y_FAST%Lin%Modules(Module_MD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) ! start of u_SD%LMesh%TranslationDisp field - call Assemble_dUdy_Loads(MD%y%CoupledLoads(1), u_SD%LMesh, MeshMapData%Mooring_2_Structure, SD_Start, MD_Out_Start, dUdy) - - ! SD translation displacement-to-SD moment transfer (dU^{SD}/dy^{SD}): - SD_Start = Indx_u_SD_LMesh_Start(u_SD, y_FAST) + u_SD%LMesh%NNodes*3 ! start of u_ED%LMesh%Moment field (skip the SD forces) - SD_Out_Start = Indx_y_SD_Y3Mesh_Start(y_SD, y_FAST) ! start of y_SD%Y3Mesh%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%Mooring_2_Structure%dM%m_uD, SD_Start, SD_Out_Start ) - end if - end if -END SUBROUTINE Linear_SD_InputSolve_dy - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{BD}/du^{BD} and dU^{BD}/du^{AD} blocks (BD row) of dUdu. (i.e., how do changes in the AD and BD inputs -!! affect the BD inputs?) This should be called only when p_FAST%CompElast == Module_BD. -SUBROUTINE Linear_BD_InputSolve_du( p_FAST, y_FAST, SrvD, y_ED, p_AD, u_AD, y_AD, BD, MeshMapData, dUdu, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - type(ServoDyn_Data), intent(in ) :: SrvD !< SrvD parameters - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AD paraemters (for AD-ED load linerization) - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< AD inputs (for AD-ED load linerization) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BD data at t - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: j ! Loops through StC instances - INTEGER(IntKi) :: k ! Loops through blades - INTEGER(IntKi) :: SrvD_Start ! starting index of dUdu (row) where BD inputs are located - INTEGER(IntKi) :: BD_Start ! starting index of dUdu (row) where BD inputs are located - INTEGER(IntKi) :: AD_Start ! starting index of dUdu (column) where AD inputs are located - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_BD_InputSolve_du' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - !.......... - ! dU^{BD}/du^{SrvD} - !.......... - if (p_FAST%CompServo == MODULE_SrvD) then - !-------------------- - ! Blade (BD or ED) - if ( allocated(SrvD%y%BStCLoadMesh) ) then - do j=1,size(SrvD%y%BStCLoadMesh,2) - do K = 1,p_FAST%nBeams ! Loop through all blades - if (SrvD%y%BStCLoadMesh(K,j)%Committed) then - CALL Linearize_Point_to_Line2( SrvD%y%BStCLoadMesh(k,j), BD%Input(1,k)%DistrLoad, MeshMapData%BStC_P_2_BD_P_B(k,j), ErrStat2, ErrMsg2, SrvD%Input(1)%BStCMotionMesh(k,j), BD%y(k)%BldMotion ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) & - + BD%Input(1,k)%RootMotion%NNodes *18 & ! displacement, rotation, & acceleration fields for each node - + BD%Input(1,k)%PointLoad%NNodes * 6 & ! force + moment fields for each node - + BD%Input(1,k)%DistrLoad%NNodes * 3 ! force field for each node (start with moment field) - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_BStC_u(1,k,j) - ! SrvD is source in the mapping, so we want M_{uSm} (moments) - if (allocated(MeshMapData%BStC_P_2_BD_P_B(k,j)%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%BStC_P_2_BD_P_B(k,j)%dM%m_us, BD_Start, SrvD_Start ) - end if - endif - enddo - enddo - endif - endif - - !.......... - ! dU^{BD}/du^{AD} - !.......... - IF ( p_FAST%CompAero == Module_AD ) THEN - - ! BD inputs on blade from AeroDyn - - - if (p_FAST%BD_OutputSibling) then - - DO K = 1,p_FAST%nBeams ! Loop through all blades - CALL Linearize_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), BD%y(k)%BldMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO - - else - - DO K = 1,p_FAST%nBeams ! Loop through all blades - !linearization for dUdy will need some matrix multiplies because of the transfer (chain rule!), but we will perform individual linearization calculations here - !!! need to transfer the BD output blade motions to nodes on a sibling of the BD blade motion mesh: - CALL Linearize_Line2_to_Line2( BD%y(k)%BldMotion, MeshMapData%y_BD_BldMotion_4Loads(k), MeshMapData%BD_L_2_BD_L(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - CALL Linearize_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), MeshMapData%y_BD_BldMotion_4Loads(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO - - end if - - - DO K = 1,p_FAST%nBeams ! Loop through all blades - - ! AD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%AD_L_2_BDED_B(k)%dM%m_us )) then - AD_Start = Indx_u_AD_Blade_Start(p_AD, u_AD, y_FAST, k) ! index for the start of u_AD%rotors(1)%BladeMotion(k)%translationDisp field - - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) & - + BD%Input(1,k)%RootMotion%NNodes *18 & ! displacement, rotation, & acceleration fields for each node - + BD%Input(1,k)%PointLoad%NNodes * 6 & ! force + moment fields for each node - + BD%Input(1,k)%DistrLoad%NNodes * 3 ! force field for each node (start with moment field) - - call SetBlockMatrix( dUdu, MeshMapData%AD_L_2_BDED_B(k)%dM%m_us, BD_Start, AD_Start ) - end if - - END DO - - END IF - - !.......... - ! dU^{BD}/du^{BD} - ! note that the 1s on the diagonal have already been set, so we will fill in the off diagonal terms. - !.......... - - !IF ( p_FAST%CompElast == Module_BD ) THEN ! see routine U_ED_SD_HD_BD_Orca_Residual() in SolveOption1 - - ! Transfer ED motions to BD motion input (BD inputs depend on previously calculated BD inputs from ED): - do k=1,p_FAST%nBeams - - call Linearize_Point_to_Point( y_ED%BladeRootMotion(k), BD%Input(1,k)%RootMotion, MeshMapData%ED_P_2_BD_P(k), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! BD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - ! translational velocity: - if (allocated(MeshMapData%ED_P_2_BD_P(k)%dM%tv_uD )) then - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) + BD%Input(1,k)%RootMotion%NNodes * 6 ! skip root translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%ED_P_2_BD_P(k)%dM%tv_uD, BD_Start, y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) ) - end if - - ! translational acceleration: - if (allocated(MeshMapData%ED_P_2_BD_P(k)%dM%ta_uD )) then - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) + BD%Input(1,k)%RootMotion%NNodes * 12 ! skip root translational displacement, orientation, and velocity (translation and rotation) fields - - call SetBlockMatrix( dUdu, MeshMapData%ED_P_2_BD_P(k)%dM%ta_uD, BD_Start, y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) ) - end if - - end do ! k - - !END IF - -END SUBROUTINE Linear_BD_InputSolve_du -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{AD}/du^{AD} block of dUdu. (i.e., how do changes in the AD inputs affect the AD inputs?) -SUBROUTINE Linear_AD_InputSolve_du( p_FAST, y_FAST, p_AD, u_AD, y_ED, BD, MeshMapData, dUdu, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< The inputs to AeroDyn15 - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< The parameters of AD15 - TYPE(ED_OutputType), INTENT(IN) :: y_ED !< The outputs from the structural dynamics module - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BD data at t - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - - INTEGER(IntKi) :: ErrStat !< Error status of the operation - CHARACTER(*) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: AD_Start_td ! starting index of dUdu (column) where AD translation displacements are located - INTEGER(IntKi) :: AD_Start_tv ! starting index of dUdu (column) where AD translation velocities are located - INTEGER(IntKi) :: AD_Start_ta ! starting index of dUdu (column) where AD translation accelerations are located - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_AD_InputSolve_du' - - - ErrStat = ErrID_None - ErrMsg = "" - - ! note that we assume this block matrix has been initialized to the identity matrix before calling this routine - - ! look at how the translational displacement gets transfered to the translational velocity: - !------------------------------------------------------------------------------------------------- - ! Set the inputs from ElastoDyn and/or BeamDyn: - !------------------------------------------------------------------------------------------------- - - !----------------------------------- - ! Nacelle - Disp, Orient - ! NOTE: no velocity or acceleration terms, so nothing to do here. - if (u_AD%rotors(1)%NacelleMotion%Committed) then - call Linearize_Point_to_Point( y_ED%NacelleMotion, u_AD%rotors(1)%NacelleMotion, MeshMapData%ED_P_2_AD_P_N, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%NacelleMotion' ) - end if - - - !----------------------------------- - ! Hub - Disp, Orient, RotVel - if (u_AD%rotors(1)%HubMotion%Committed) then - call Linearize_Point_to_Point( y_ED%HubPtMotion, u_AD%rotors(1)%HubMotion, MeshMapData%ED_P_2_AD_P_H, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%HubMotion' ) - end if - - - !----------------------------------- - ! TailFin - Disp, Orient, TransVel, TransAcc - if (u_AD%rotors(1)%TFinMotion%Committed) then - call Linearize_Point_to_Point( y_ED%TFinCMMotion, u_AD%rotors(1)%TFinMotion, MeshMapData%ED_P_2_AD_P_TF, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%TFinMotion' ) - - !AD is the destination here, so we need tv_ud - if (allocated( MeshMapData%ED_P_2_AD_P_TF%dM%tv_ud)) then - AD_Start_td = Indx_u_AD_TFin_Start(p_AD, u_AD, y_FAST) ! index for u_AD%rotors(1)%TFinMotion(k)%translationDisp field - AD_Start_tv = AD_Start_td + u_AD%rotors(1)%TFinMotion%NNodes * 6 ! 2 fields (TranslationDisp and Orientation) with 3 components before translational velocity field - call SetBlockMatrix( dUdu, MeshMapData%ED_P_2_AD_P_TF%dM%tv_ud, AD_Start_tv, AD_Start_td ) - end if - end if - - !----------------------------------- - ! tower - Disp, Orient, TransVel, TransAcc - IF (u_AD%rotors(1)%TowerMotion%Committed) THEN - CALL Linearize_Line2_to_Line2( y_ED%TowerLn2Mesh, u_AD%rotors(1)%TowerMotion, MeshMapData%ED_L_2_AD_L_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%TowerMotion' ) - - AD_Start_td = Indx_u_AD_Tower_Start(p_AD, u_AD, y_FAST) ! index for u_AD%rotors(1)%TowerMotion(k)%translationDisp field - !AD is the destination here, so we need tv_ud - if (allocated( MeshMapData%ED_L_2_AD_L_T%dM%tv_ud)) then - AD_Start_tv = AD_Start_td + u_AD%rotors(1)%TowerMotion%NNodes * 6 ! 2 fields (TranslationDisp and Orientation) with 3 components before translational velocity field - call SetBlockMatrix( dUdu, MeshMapData%ED_L_2_AD_L_T%dM%tv_ud, AD_Start_tv, AD_Start_td ) - end if - if (allocated( MeshMapData%ED_L_2_AD_L_T%dM%ta_ud)) then - AD_Start_ta = AD_Start_td + u_AD%rotors(1)%TowerMotion%NNodes * 9 ! 3 fields (TranslationDisp and Orientation, transVel) with 3 components before translational accel - call SetBlockMatrix( dUdu, MeshMapData%ED_L_2_AD_L_T%dM%ta_ud, AD_Start_ta, AD_Start_td ) - end if - END IF - - - ! blades - IF (p_FAST%CompElast == Module_ED ) THEN - DO k=1,size(u_AD%rotors(1)%BladeMotion) - CALL Linearize_Line2_to_Line2( y_ED%BladeLn2Mesh(k), u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - ELSEIF (p_FAST%CompElast == Module_BD ) THEN - DO k=1,size(u_AD%rotors(1)%BladeMotion) - CALL Linearize_Line2_to_Line2( BD%y(k)%BldMotion, u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - END IF - - - - DO k=1,size(u_AD%rotors(1)%BladeMotion) - AD_Start_td = Indx_u_AD_Blade_Start(p_AD, u_AD, y_FAST, k) ! index for u_AD%rotors(1)%BladeMotion(k)%translationDisp field - !AD is the destination here, so we need tv_ud - if (allocated( MeshMapData%BDED_L_2_AD_L_B(k)%dM%tv_ud)) then - ! index for u_AD%rotors(1)%BladeMotion(k+1)%translationVel field - AD_Start_tv = AD_Start_td + u_AD%rotors(1)%BladeMotion(k)%NNodes * 6 ! 2 fields (TranslationDisp and Orientation) with 3 components before translational velocity field - call SetBlockMatrix( dUdu, MeshMapData%BDED_L_2_AD_L_B(k)%dM%tv_ud, AD_Start_tv, AD_Start_td ) - end if - - if (allocated( MeshMapData%BDED_L_2_AD_L_B(k)%dM%ta_ud)) then - AD_Start_ta = AD_Start_td + u_AD%rotors(1)%BladeMotion(k)%NNodes * 12 ! 4 fields (TranslationDisp, Orientation, TranslationVel, and RotationVel) with 3 components before translational acceleration field - call SetBlockMatrix( dUdu, MeshMapData%BDED_L_2_AD_L_B(k)%dM%ta_ud, AD_Start_ta, AD_Start_td ) - end if - END DO - -END SUBROUTINE Linear_AD_InputSolve_du -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{SrvD}/du^{SrvD} block (SrvD row) of dUdu. -!! (i.e., how do changes in the SrvD inputs affect the SrvD inputs?) -SUBROUTINE Linear_SrvD_InputSolve_du( p_FAST, y_FAST, p_SrvD, u_SrvD, y_ED, BD, SD, MeshMapData, dUdu, ErrStat, ErrMsg ) - type(FAST_ParameterType), intent(in ) :: p_FAST !< Glue-code simulation parameters - type(FAST_OutputFileType), intent(in ) :: y_FAST !< Glue-code output parameters (for linearization) - type(SrvD_ParameterType), intent(in ) :: p_SrvD !< SrvD parameters - type(SrvD_InputType), intent(inout) :: u_SrvD !< SrvD Inputs at t - type(ED_OutputType), intent(in ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - type(BeamDyn_Data), intent(in ) :: BD !< BD data at t - type(SubDyn_Data), intent(in ) :: SD !< SD data at t - type(FAST_ModuleMapType), intent(inout) :: MeshMapData !< Data for mapping between modules - real(R8Ki), intent(inout) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - integer(IntKi), intent( out) :: ErrStat !< Error status - character(*), intent( out) :: ErrMsg !< Error message - - ! local variables - integer(IntKi) :: i,j,k ! Generic counters - INTEGER(IntKi) :: SrvD_Start ! starting index of dUdu (column) where the StC motion inputs are located - integer(IntKi) :: ErrStat2 ! temporary Error status of the operation - character(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - character(*), parameter :: RoutineName = 'Linear_SrvD_InputSolve_du' - - ! Initialize error status - ErrStat = ErrID_None - ErrMsg = "" - - !-------------------- - ! dU^{SrvD}/du^{SrvD} - !-------------------- - ! Blade StrucCtrl - if ( p_FAST%CompElast == Module_ED ) then - if ( ALLOCATED(u_SrvD%BStCMotionMesh) ) then - do j=1,size(u_SrvD%BStCMotionMesh,2) - do K = 1,size(y_ED%BladeLn2Mesh) - if (u_SrvD%BStCMotionMesh(K,j)%Committed) then - CALL Linearize_Line2_to_Point( y_ED%BladeLn2Mesh(K), u_SrvD%BStCMotionMesh(K,j), MeshMapData%ED_L_2_BStC_P_B(K,j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! SrvD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - ! translational velocity: - if (allocated(MeshMapData%ED_L_2_BStC_P_B(K,j)%dM%tv_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_BStC_u(1,k,j) + 6) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%ED_L_2_BStC_P_B(K,j)%dM%tv_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - - ! translational acceleration: - if (allocated(MeshMapData%ED_L_2_BStC_P_B(K,j)%dM%ta_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_BStC_u(1,k,j) + 12) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%ED_L_2_BStC_P_B(K,j)%dM%ta_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - endif - enddo - enddo - endif - elseif ( p_FAST%CompElast == Module_BD ) then - if ( ALLOCATED(u_SrvD%BStCMotionMesh) ) then - do j=1,size(u_SrvD%BStCMotionMesh,2) - do K = 1,p_FAST%nBeams - if (u_SrvD%BStCMotionMesh(K,j)%Committed) then - CALL Linearize_Line2_to_Point( BD%y(k)%BldMotion, u_SrvD%BStCMotionMesh(K,j), MeshMapData%BD_L_2_BStC_P_B(K,j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! SrvD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - ! translational velocity: - if (allocated(MeshMapData%BD_L_2_BStC_P_B(K,j)%dM%tv_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_BStC_u(1,k,j) + 6) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%BD_L_2_BStC_P_B(K,j)%dM%tv_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - - ! translational acceleration: - if (allocated(MeshMapData%BD_L_2_BStC_P_B(K,j)%dM%ta_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_BStC_u(1,k,j) + 12) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%BD_L_2_BStC_P_B(K,j)%dM%ta_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - endif - enddo - enddo - endif - endif - !-------------------- - ! Nacelle (ED only) - if ( ALLOCATED(u_SrvD%NStCMotionMesh) ) then - do j = 1,size(u_SrvD%NStCMotionMesh) - if (u_SrvD%NStCMotionMesh(j)%Committed) then - call Linearize_Point_to_Point( y_ED%NacelleMotion, u_SrvD%NStCMotionMesh(j), MeshMapData%ED_P_2_NStC_P_N(j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! SrvD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - ! translational velocity: - if (allocated(MeshMapData%ED_P_2_NStC_P_N(j)%dM%tv_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_NStC_u(1,j) + 6) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%ED_P_2_NStC_P_N(j)%dM%tv_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - - ! translational acceleration: - if (allocated(MeshMapData%ED_P_2_NStC_P_N(j)%dM%ta_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_NStC_u(1,j) + 12) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%ED_P_2_NStC_P_N(j)%dM%ta_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - endif - enddo - endif - !-------------------- - ! Tower - if ( ALLOCATED(u_SrvD%TStCMotionMesh) ) then - do j = 1,size(u_SrvD%TStCMotionMesh) - if (u_SrvD%TStCMotionMesh(j)%Committed) then - call Linearize_Line2_to_Point( y_ED%TowerLn2Mesh, u_SrvD%TStCMotionMesh(j), MeshMapData%ED_L_2_TStC_P_T(j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! SrvD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - ! translational velocity: - if (allocated(MeshMapData%ED_L_2_TStC_P_T(j)%dM%tv_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_TStC_u(1,j) + 6) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%ED_L_2_TStC_P_T(j)%dM%tv_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - - ! translational acceleration: - if (allocated(MeshMapData%ED_L_2_TStC_P_T(j)%dM%ta_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_TStC_u(1,j) + 12) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%ED_L_2_TStC_P_T(j)%dM%ta_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - endif - enddo - endif - !-------------------- - ! Substructure (SD or ED) - if (p_FAST%CompSub /= MODULE_SD) then - if ( ALLOCATED(u_SrvD%SStCMotionMesh) ) then - do j=1,size(u_SrvD%SStCMotionMesh) - if (u_SrvD%SStCMotionMesh(j)%Committed) then - CALL Linearize_Point_to_Point( y_ED%PlatformPtMesh, u_SrvD%SStCMotionMesh(j), MeshMapData%Substructure_2_SStC_P_P(j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! SrvD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - ! translational velocity: - if (allocated(MeshMapData%Substructure_2_SStC_P_P(j)%dM%tv_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_SStC_u(1,j) + 6) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%Substructure_2_SStC_P_P(j)%dM%tv_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - - ! translational acceleration: - if (allocated(MeshMapData%Substructure_2_SStC_P_P(j)%dM%ta_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_SStC_u(1,j) + 12) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%Substructure_2_SStC_P_P(j)%dM%ta_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - endif - enddo - endif - else - if ( ALLOCATED(u_SrvD%SStCMotionMesh) ) then - do j=1,size(u_SrvD%SStCMotionMesh) - IF (u_SrvD%SStCMotionMesh(j)%Committed) then - CALL Linearize_Point_to_Point( SD%y%y3Mesh, u_SrvD%SStCMotionMesh(j), MeshMapData%SubStructure_2_SStC_P_P(j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! SrvD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - ! translational velocity: - if (allocated(MeshMapData%SubStructure_2_SStC_P_P(j)%dM%tv_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_SStC_u(1,j) + 6) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%SubStructure_2_SStC_P_P(j)%dM%tv_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - - ! translational acceleration: - if (allocated(MeshMapData%SubStructure_2_SStC_P_P(j)%dM%ta_uD )) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_SStC_u(1,j) + 12) ! skip translational displacement and orientation fields - call SetBlockMatrix( dUdu, MeshMapData%SubStructure_2_SStC_P_P(j)%dM%ta_uD, SrvD_Start, y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) ) - end if - endif - enddo - endif - endif -END SUBROUTINE Linear_SrvD_InputSolve_du - - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{SrvD}/dy^{ED}, dU^{SrvD}/dy^{BD}, dU^{SrvD}/dy^{SD} block of dUdy. -!! (i.e., how do changes in the ED, SD, BD outputs affect the SrvD inputs?) -!! NOTE: Linearze_Point_to_Point routines done in Linear_SrvD_InputSolve_du -SUBROUTINE Linear_SrvD_InputSolve_dy( p_FAST, y_FAST, p_SrvD, u_SrvD, p_ED, y_ED, BD, y_SD, MeshMapData, dUdy, ErrStat, ErrMsg ) - type(FAST_ParameterType), intent(in ) :: p_FAST !< Glue-code simulation parameters - type(FAST_OutputFileType), intent(in ) :: y_FAST !< Output variables for the glue code - type(SrvD_ParameterType), intent(in ) :: p_SrvD !< SrvD parameters (holds indices for jacobian entries for each StC) - type(SrvD_InputType), intent(inout) :: u_SrvD !< SrvD Inputs at t - TYPE(ED_ParameterType), intent(in ) :: p_ED !< ED Inputs at t - type(ED_OutputType), intent(in ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - type(BeamDyn_Data), intent(in ) :: BD !< BeamDyn data - type(SD_OutputType), intent(in ) :: y_SD !< SubDyn outputs (need translation displacement on meshes for loads mapping) - - type(FAST_ModuleMapType), intent(inout) :: MeshMapData !< Data for mapping between modules - real(R8Ki), intent(inout) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - integer(IntKi), intent( out) :: ErrStat !< Error status - character(*), intent( out) :: ErrMsg !< Error message - - integer(IntKi) :: i,j,k ! loop counters - integer(intKi) :: ED_Start_Yaw !< starting index of dUdy (column) where ED Yaw/YawRate/HSS_Spd outputs are located (just before WriteOutput) - integer(IntKi) :: SrvD_Start, ED_Out_Start, BD_Out_Start, SD_Out_Start - character(*), parameter :: RoutineName = 'Linear_SrvD_InputSolve_dy' - - ! Initialize error status - ErrStat = ErrID_None - ErrMsg = "" - - !-------------------- - ! dU^{SrvD}/dy^{ED} - !-------------------- - ED_Start_Yaw = Indx_y_Yaw_Start(y_FAST, Module_ED) ! start of ED where Yaw, YawRate, HSS_Spd occur (right before WriteOutputs) - do i=1,size(SrvD_Indx_Y_BlPitchCom) ! first 3 columns - dUdy(y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + SrvD_Indx_Y_BlPitchCom(i) - 1, ED_Start_Yaw + i - 1) = -1.0_ReKi - end do - - !---------------------------------------- - ! Structural controls - !---------------------------------------- - ! Blade - if ( p_FAST%CompElast == Module_ED ) then - !-------------------- - ! dU^{SrvD}/dy^{ED} - !-------------------- - if ( ALLOCATED(u_SrvD%BStCMotionMesh) ) then - do j=1,size(u_SrvD%BStCMotionMesh,2) - do K = 1,size(y_ED%BladeLn2Mesh) - if (u_SrvD%BStCMotionMesh(K,j)%Committed) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_BStC_u(1,k,j)) - ED_Out_Start = Indx_y_ED_Blade_Start(p_ED, y_ED, y_FAST, k) ! start of %TranslationDisp field - call Assemble_dUdy_Motions( y_ED%BladeLn2Mesh(K), u_SrvD%BStCMotionMesh(K,j), MeshMapData%ED_L_2_BStC_P_B(K,j), SrvD_Start, ED_Out_Start, dUdy) - endif - enddo - enddo - endif - elseif ( p_FAST%CompElast == Module_BD ) then - !-------------------- - ! dU^{SrvD}/dy^{BD} - !-------------------- - if ( ALLOCATED(u_SrvD%BStCMotionMesh) ) then - do j=1,size(u_SrvD%BStCMotionMesh,2) - do K = 1,p_FAST%nBeams - if (u_SrvD%BStCMotionMesh(K,j)%Committed) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_BStC_u(1,k,j)) - BD_Out_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_OUTPUT_COL) ! start of %TranslationDisp field - call Assemble_dUdy_Motions( BD%y(k)%BldMotion, u_SrvD%BStCMotionMesh(K,j), MeshMapData%BD_L_2_BStC_P_B(K,j), SrvD_Start, BD_Out_Start, dUdy) - endif - enddo - enddo - endif - endif - - !-------------------- - ! Nacelle -- dU^{SrvD}/dy^{ED} - !-------------------- - if ( ALLOCATED(u_SrvD%NStCMotionMesh) ) then - do j = 1,size(u_SrvD%NStCMotionMesh) - if (u_SrvD%NStCMotionMesh(j)%Committed) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_NStC_u(1,j)) - ED_Out_Start = Indx_y_ED_Nacelle_Start(p_ED, y_ED, y_FAST) ! start of %TranslationDisp field - call Assemble_dUdy_Motions( y_ED%NacelleMotion, u_SrvD%NStCMotionMesh(j), MeshMapData%ED_P_2_NStC_P_N(j), SrvD_Start, ED_Out_Start, dUdy) - endif - enddo - endif - - !-------------------- - ! Tower -- dU^{SrvD}/dy^{ED} - !-------------------- - if ( ALLOCATED(u_SrvD%TStCMotionMesh) ) then - do j = 1,size(u_SrvD%TStCMotionMesh) - if (u_SrvD%TStCMotionMesh(j)%Committed) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_TStC_u(1,j)) - ED_Out_Start = Indx_y_ED_Tower_Start(p_ED, y_ED, y_FAST) ! start of %TranslationDisp field - call Assemble_dUdy_Motions( y_ED%TowerLn2Mesh, u_SrvD%TStCMotionMesh(j), MeshMapData%ED_L_2_TStC_P_T(j), SrvD_Start, ED_Out_Start, dUdy) - endif - enddo - endif - - !-------------------- - ! Substructure (SD or ED) - !-------------------- - if (p_FAST%CompSub /= MODULE_SD) then - !-------------------- - ! dU^{SrvD}/dy^{ED} - !-------------------- - if ( ALLOCATED(u_SrvD%SStCMotionMesh) ) then - do j=1,size(u_SrvD%SStCMotionMesh) - if (u_SrvD%SStCMotionMesh(j)%Committed) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_SStC_u(1,j)) - ED_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of %TranslationDisp field - call Assemble_dUdy_Motions( y_ED%PlatformPtMesh, u_SrvD%SStCMotionMesh(j), MeshMapData%Substructure_2_SStC_P_P(j), SrvD_Start, ED_Out_Start, dUdy) - endif - enddo - endif - else - !-------------------- - ! dU^{SrvD}/dy^{SD} - !-------------------- - if ( ALLOCATED(u_SrvD%SStCMotionMesh) ) then - do j=1,size(u_SrvD%SStCMotionMesh) - if (u_SrvD%SStCMotionMesh(j)%Committed) then - SrvD_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + (p_SrvD%Jac_Idx_SStC_u(1,j)) - SD_Out_Start = Indx_y_SD_Y3Mesh_Start(y_SD, y_FAST) ! start of %TranslationDisp field - call Assemble_dUdy_Motions( y_SD%y3Mesh, u_SrvD%SStCMotionMesh(j), MeshMapData%SubStructure_2_SStC_P_P(j), SrvD_Start, SD_Out_Start, dUdy) - endif - enddo - endif - endif -END SUBROUTINE Linear_SrvD_InputSolve_dy - - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{ED}/dy^{SrvD}, dU^{ED}/dy^{ED}, dU^{ED}/dy^{BD}, dU^{ED}/dy^{AD}, dU^{ED}/dy^{HD}, and dU^{ED}/dy^{MAP} -!! blocks of dUdy. (i.e., how do changes in the SrvD, ED, BD, AD, HD, and MAP outputs effect the ED inputs?) -SUBROUTINE Linear_ED_InputSolve_dy( p_FAST, y_FAST, SrvD, p_ED, u_ED, y_ED, p_AD, u_AD, y_AD, BD, HD, SD, MAPp, MD, MeshMapData, dUdy, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - type(ServoDyn_Data), intent(in ) :: SrvD !< SrvD parameters - TYPE(ED_InputType), INTENT(INOUT) :: u_ED !< ED Inputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ElastoDyn parameters - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AeroDyn outputs - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< AD inputs (for AD-ED load linerization) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BD data at t - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HD data at t - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SD data at t - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data at t - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< MD data at t - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: i ! rows/columns - INTEGER(IntKi) :: j ! Loops through StC instance - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: SrvD_Out_Start ! starting index of dUdy (column) where the StC motion inputs are located - INTEGER(IntKi) :: AD_Out_Start ! starting index of dUdy (column) where particular AD fields are located - INTEGER(IntKi) :: AD_Block_Start ! starting index of dUdy (column) for all AD outputs - INTEGER(IntKi) :: BD_Out_Start ! starting index of dUdy (column) where particular BD fields are located - INTEGER(IntKi) :: ED_Start ! starting index of dUdy (row) where ED input fields are located - INTEGER(IntKi) :: ED_Out_Start ! starting index of dUdy (column) where ED output fields are located - INTEGER(IntKi) :: HD_Out_Start ! starting index of dUdy (column) where HD output fields are located - INTEGER(IntKi) :: SD_Out_Start ! starting index of dUdy (column) where SD output fields are located - INTEGER(IntKi) :: MAP_Out_Start ! starting index of dUdy (column) where MAP output fields are located - INTEGER(IntKi) :: MD_Out_Start ! starting index of dUdy (column) where MoorDyn output fields are located - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_ED_InputSolve_dy' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - !.......... - ! dU^{ED}/dy^{SrvD} - ! ED inputs from ServoDyn outputs - !.......... - IF ( p_FAST%CompServo == Module_SrvD ) THEN - - ! BlPitchCom, YawMom, GenTrq - ED_Start = Indx_u_ED_BlPitchCom_Start(p_ED, u_ED, y_FAST) - do i=1,size(u_ED%BlPitchCom)+2 ! BlPitchCom, YawMom, GenTrq (NOT collective pitch) - dUdy(ED_Start + i - 1, y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + i - 1) = -1.0_ReKi !SrvD_Indx_Y_BlPitchCom - end do - !-------------------- - ! Blade (BD or ED) - if ( p_FAST%CompElast == Module_ED ) then - if ( allocated(SrvD%y%BStCLoadMesh) ) then - do j=1,size(SrvD%y%BStCLoadMesh,2) - do K = 1,SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - if (SrvD%y%BStCLoadMesh(K,j)%Committed) then - ED_Start = Indx_u_ED_Blade_Start(p_ED, u_ED, y_FAST, k) ! start of u_ED%BladePtLoads(k)%Force field - SrvD_Out_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_BStC_y(1,k,j) - call Assemble_dUdy_Loads(SrvD%y%BStCLoadMesh(k,j), u_ED%BladePtLoads(k), MeshMapData%BStC_P_2_ED_P_B(k,j), ED_Start, SrvD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Blade_Start(p_ED, u_ED, y_FAST, k) + u_ED%BladePtLoads(k)%NNodes*3 ! start of u_ED%BladePtLoads(k)%Moment field (skip the ED forces) - ED_Out_Start = Indx_y_ED_Blade_Start(p_ED, y_ED, y_FAST, k) ! start of y_ED%BladeLn2Mesh(1)%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%BStC_P_2_ED_P_B(k,j)%dM%m_uD, ED_Start, ED_Out_Start ) - endif - enddo - enddo - endif - endif - !-------------------- - ! Nacelle (ED only) - if ( allocated(SrvD%y%NStCLoadMesh) ) then - do j = 1,size(SrvD%y%NStCLoadMesh) - if (SrvD%y%NStCLoadMesh(j)%Committed) then - ED_Start = Indx_u_ED_Nacelle_Start(p_ED, u_ED, y_FAST) - SrvD_Out_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_NStC_y(1,j) - call Assemble_dUdy_Loads(SrvD%y%NStCLoadMesh(j), u_ED%NacelleLoads, MeshMapData%NStC_P_2_ED_P_N(j), ED_Start, SrvD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Nacelle_Start(p_ED, u_ED, y_FAST) + u_ED%NacelleLoads%NNodes*3 ! start of u_ED%NacelleLoads%Moment field (skip the ED forces) - ED_Out_Start = Indx_y_ED_Nacelle_Start(p_ED, y_ED, y_FAST) ! start of y_ED%NacelleMotion%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%NStC_P_2_ED_P_N(j)%dM%m_uD, ED_Start, ED_Out_Start ) - endif - enddo - endif - !-------------------- - ! Tower (ED only) - if ( allocated(SrvD%y%TStCLoadMesh) ) then - do j = 1,size(SrvD%y%TStCLoadMesh) - if (SrvD%y%TStCLoadMesh(j)%Committed) then - ED_Start = Indx_u_ED_Tower_Start(p_ED, u_ED, y_FAST) - SrvD_Out_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_TStC_y(1,j) - call Assemble_dUdy_Loads(SrvD%y%TStCLoadMesh(j), u_ED%TowerPtLoads, MeshMapData%TStC_P_2_ED_P_T(j), ED_Start, SrvD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Tower_Start(p_ED, u_ED, y_FAST) + u_ED%TowerPtLoads%NNodes*3 ! start of u_ED%TowerPtLoads%Moment field [skip the ED forces to get to the moments] - ED_Out_Start = Indx_y_ED_Tower_Start(p_ED, y_ED, y_FAST) ! start of y_ED%TowerLn2Mesh%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%TStC_P_2_ED_P_T(j)%dM%m_uD, ED_Start, ED_Out_Start ) - endif - enddo - endif - !-------------------- - ! Substructure (SD or ED) - if (p_FAST%CompSub /= MODULE_SD) then - if ( allocated(SrvD%y%SStCLoadMesh) ) then - do j=1,size(SrvD%y%SStCLoadMesh) - if (SrvD%y%SStCLoadMesh(j)%Committed) then - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) - SrvD_Out_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_SStC_y(1,j) - call Assemble_dUdy_Loads(SrvD%y%SStCLoadMesh(j), u_ED%PlatformPtMesh, MeshMapData%SStC_P_P_2_SubStructure(j), ED_Start, SrvD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) + u_ED%PlatformPtMesh%NNodes*3 ! start of u_ED%PlatformPtMesh%Moment field (skip the ED forces) - ED_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of y_ED%PlatformPtMesh%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%HD_M_P_2_SubStructure%dM%m_uD, ED_Start, ED_Out_Start ) - endif - enddo - endif - endif - END IF - - ! parts of dU^{ED}/dy^{AD} and dU^{ED}/dy^{ED}: - - ! ElastoDyn inputs on blade from AeroDyn and ElastoDyn - IF ( p_FAST%CompAero == Module_AD ) THEN - - AD_Block_Start = y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) - - IF (p_FAST%CompElast == Module_ED) THEN - AD_Out_Start = AD_Block_Start + p_AD%rotors(1)%Jac_y_idxStartList%BladeLoad - 1 - - DO K = 1,SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !CALL Linearize_Line2_to_Point( y_AD%rotors(1)%BladeLoad(k), u_ED%BladePtLoads(k), MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), y_ED%BladeLn2Mesh(k) ) - - ! AD loads-to-ED loads transfer (dU^{ED}/dy^{AD}): - ED_Start = Indx_u_ED_Blade_Start(p_ED, u_ED, y_FAST, k) - call Assemble_dUdy_Loads(y_AD%rotors(1)%BladeLoad(k), u_ED%BladePtLoads(k), MeshMapData%AD_L_2_BDED_B(k), ED_Start, AD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Blade_Start(p_ED, u_ED, y_FAST, k) + u_ED%BladePtLoads(k)%NNodes*3 ! start of u_ED%BladePtLoads(k)%Moment field (skip the ED forces) - ED_Out_Start = Indx_y_ED_Blade_Start(p_ED, y_ED, y_FAST, k) ! start of y_ED%BladeLn2Mesh(1)%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD, ED_Start, ED_Out_Start ) - - AD_Out_Start = AD_Out_Start + y_AD%rotors(1)%BladeLoad(k)%NNodes*6 ! start of y_AD%rotors(1)%BladeLoad(k+1)%Force field [skip 2 fields to forces on next blade] - END DO - END IF ! ED - - - IF ( y_AD%rotors(1)%TowerLoad%Committed ) THEN - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !CALL Linearize_Line2_to_Point( y_AD%rotors(1)%TowerLoad, u_ED%TowerPtLoads, MeshMapData%AD_L_2_ED_P_T, ErrStat2, ErrMsg2, u_AD%rotors(1)%TowerMotion, y_ED%TowerLn2Mesh ) - - ! AD loads-to-ED loads transfer (dU^{ED}/dy^{AD}): - ED_Start = Indx_u_ED_Tower_Start(p_ED, u_ED, y_FAST) ! u_ED%TowerPtLoads%Force field - AD_Out_Start = AD_Block_Start + p_AD%rotors(1)%Jac_y_idxStartList%TowerLoad - 1 - call Assemble_dUdy_Loads(y_AD%rotors(1)%TowerLoad, u_ED%TowerPtLoads, MeshMapData%AD_L_2_ED_P_T, ED_Start, AD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = ED_Start + u_ED%TowerPtLoads%NNodes*3 ! start of u_ED%TowerPtLoads%Moment field [skip the ED forces to get to the moments] - ED_Out_Start = Indx_y_ED_Tower_Start(p_ED, y_ED, y_FAST) ! start of y_ED%TowerLn2Mesh%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%AD_L_2_ED_P_T%dM%m_uD, ED_Start, ED_Out_Start ) - - END IF ! tower - - IF ( y_AD%rotors(1)%TFinLoad%Committed ) THEN - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !CALL Linearize_Line2_to_Point( y_AD%rotors(1)%TFinLoad, u_ED%TFinCMLoads, MeshMapData%AD_L_2_ED_P_TF, ErrStat2, ErrMsg2, u_AD%rotors(1)%TFinMotion, y_ED%TFinCMMotion ) - - ! AD loads-to-ED loads transfer (dU^{ED}/dy^{AD}): - ED_Start = Indx_u_ED_TFin_Start(p_ED, u_ED, y_FAST) ! u_ED%TFinCMLoads%Force field - AD_Out_Start = AD_Block_Start + p_AD%rotors(1)%Jac_y_idxStartList%TFinLoad - 1 - call Assemble_dUdy_Loads(y_AD%rotors(1)%TFinLoad, u_ED%TFinCMLoads, MeshMapData%AD_P_2_ED_P_TF, ED_Start, AD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = ED_Start + u_ED%TFinCMLoads%NNodes*3 ! start of u_ED%TFinCMLoads%Moment field [skip the ED forces to get to the moments] - ED_Out_Start = Indx_y_ED_TFin_Start(p_ED, y_ED, y_FAST) ! start of y_ED%TFinCMMotion%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%AD_P_2_ED_P_TF%dM%m_uD, ED_Start, ED_Out_Start ) - END IF ! tailfin - - IF ( y_AD%rotors(1)%NacelleLoad%Committed ) THEN - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !CALL Linearize_Point_to_Point( y_AD%rotors(1)%NacelleLoad, u_ED%NacelleLoads, MeshMapData%AD_L_2_ED_P_N, ErrStat2, ErrMsg2, u_AD%rotors(1)%NacelleMotion, y_ED%NacelleMotion ) - - ! AD loads-to-ED loads transfer (dU^{ED}/dy^{AD}): - ED_Start = Indx_u_ED_Nacelle_Start(p_ED, u_ED, y_FAST) ! u_ED%NacelleLoads%Force field - AD_Out_Start = AD_Block_Start + p_AD%rotors(1)%Jac_y_idxStartList%NacelleLoad - 1 - call Assemble_dUdy_Loads(y_AD%rotors(1)%NacelleLoad, u_ED%NacelleLoads, MeshMapData%AD_P_2_ED_P_N, ED_Start, AD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = ED_Start + u_ED%NacelleLoads%NNodes*3 ! start of u_ED%NacelleLoads%Moment field [skip the ED forces to get to the moments] - ED_Out_Start = Indx_y_ED_Nacelle_Start(p_ED, y_ED, y_FAST) ! start of y_ED%NacelleMotion%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%AD_P_2_ED_P_N%dM%m_uD, ED_Start, ED_Out_Start ) - END IF ! nacelle - - IF ( y_AD%rotors(1)%HubLoad%Committed ) THEN - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !CALL Linearize_Point_to_Point( y_AD%rotors(1)%HubLoad, u_ED%HubLoads, MeshMapData%AD_L_2_ED_P_H, ErrStat2, ErrMsg2, u_AD%rotors(1)%HubMotion, y_ED%HubMotion ) - - ! AD loads-to-ED loads transfer (dU^{ED}/dy^{AD}): - ED_Start = Indx_u_ED_Hub_Start(p_ED, u_ED, y_FAST) ! u_ED%HubLoads%Force field - AD_Out_Start = AD_Block_Start + p_AD%rotors(1)%Jac_y_idxStartList%HubLoad - 1 - call Assemble_dUdy_Loads(y_AD%rotors(1)%HubLoad, u_ED%HubPtLoad, MeshMapData%AD_P_2_ED_P_H, ED_Start, AD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = ED_Start + u_ED%HubPtLoad%NNodes*3 ! start of u_ED%HubLoads%Moment field [skip the ED forces to get to the moments] - ED_Out_Start = Indx_y_ED_Hub_Start(p_ED, y_ED, y_FAST) ! start of y_ED%HubMotion%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%AD_P_2_ED_P_H%dM%m_uD, ED_Start, ED_Out_Start ) - END IF ! hub - - END IF ! aero loads - - ! U_ED_SD_HD_BD_Orca_Residual() in InputSolve Option 1 - IF (p_FAST%CompElast == Module_BD) THEN - - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!DO k=1,p_FAST%nBeams - !!! CALL Linearize_Point_to_Point( BD%y(k)%ReactionForce, u_ED%HubPtLoad, MeshMapData%BD_P_2_ED_P(k), ErrStat2, ErrMsg2, BD%Input(1,k)%RootMotion, y_ED%HubPtMotion) - !!!END DO - - ! BD Reaction force-to-ED force transfer (dU^{ED}/dy^{BD}) from BD root-to-ED hub load transfer: - ED_Start = Indx_u_ED_Hub_Start(p_ED, u_ED, y_FAST) ! start of u_ED%HubPtLoad%Force field - DO k=1,p_FAST%nBeams - BD_Out_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_OUTPUT_COL) ! BD%y(k)%ReactionForce%Force field - call Assemble_dUdy_Loads(BD%y(k)%ReactionForce, u_ED%HubPtLoad, MeshMapData%BD_P_2_ED_P(k), ED_Start, BD_Out_Start, dUdy) - END DO - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}) from BD root-to-ED hub load transfer: - ED_Start = Indx_u_ED_Hub_Start(p_ED, u_ED, y_FAST) + u_ED%HubPtLoad%NNodes*3 ! start of u_ED%HubPtLoad%Moment field (skip forces) - ED_Out_Start = Indx_y_ED_Hub_Start(p_ED, y_ED, y_FAST) ! start of y_ED%HubMotion%TranslationDisp field - DO k=1,p_FAST%nBeams - call SumBlockMatrix( dUdy, MeshMapData%BD_P_2_ED_P(k)%dM%m_ud, ED_Start, ED_Out_Start) - END DO - - END IF - - if ( p_FAST%CompSub == Module_None ) then !This also occurs with ExtPtfm (though that's not linearized, yet) - ! HD - ! parts of dU^{ED}/dy^{HD} and dU^{ED}/dy^{ED}: - if ( p_FAST%CompHydro == Module_HD ) then ! HydroDyn-{ElastoDyn or SubDyn} - ED_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of y_ED%PlatformPtMesh%TranslationDisp field - ! we're just going to assume u_ED%PlatformPtMesh is committed - if ( HD%y%Morison%Mesh%Committed ) then ! meshes for floating - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - ! call Linearize_Point_to_Point( HD%y%Morison, u_ED%PlatformPtMesh, MeshMapData%HD_M_P_2_SubStructure, ErrStat2, ErrMsg2, HD%Input(1)%Morison, y_ED%PlatformPtMesh) !HD%Input(1)%Morison and y_ED%PlatformPtMesh contain the displaced positions for load calculations - HD_Out_Start = Indx_y_HD_Morison_Start(HD%y, y_FAST) - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) ! start of u_ED%PlatformPtMesh%Force field - call Assemble_dUdy_Loads(HD%y%Morison%Mesh, u_ED%PlatformPtMesh, MeshMapData%HD_M_P_2_SubStructure, ED_Start, HD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) + u_ED%PlatformPtMesh%NNodes*3 ! start of u_ED%PlatformPtMesh%Moment field (skip the ED forces) - call SumBlockMatrix( dUdy, MeshMapData%HD_M_P_2_SubStructure%dM%m_uD, ED_Start, ED_Out_Start ) - - end if - if ( HD%y%WAMITMesh%Committed ) then ! meshes for floating - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - ! call Linearize_Point_to_Point( HD%y%WAMITMesh, u_ED%PlatformPtMesh, MeshMapData%HD_W_P_2_SubStructure, ErrStat2, ErrMsg2, HD%Input(1)%WAMITMesh, y_ED%PlatformPtMesh) !HD%Input(1)%WAMITMesh and y_ED%PlatformPtMesh contain the displaced positions for load calculations - HD_Out_Start = Indx_y_HD_WAMIT_Start(HD%y, y_FAST) - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) ! start of u_ED%PlatformPtMesh%Force field - call Assemble_dUdy_Loads(HD%y%WAMITMesh, u_ED%PlatformPtMesh, MeshMapData%HD_W_P_2_SubStructure, ED_Start, HD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) + u_ED%PlatformPtMesh%NNodes*3 ! start of u_ED%PlatformPtMesh%Moment field (skip the ED forces) - call SumBlockMatrix( dUdy, MeshMapData%HD_W_P_2_SubStructure%dM%m_uD, ED_Start, ED_Out_Start ) - - end if - - - end if - - ! MAP - ! parts of dU^{ED}/dy^{MAP} and dU^{ED}/dy^{ED}: - if ( p_FAST%CompMooring == Module_MAP ) then - if ( MAPp%y%ptFairleadLoad%Committed ) then ! meshes for floating - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - ! CALL Linearize_Point_to_Point( MAPp%y%ptFairleadLoad, u_ED%PlatformPtMesh, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, MAPp%Input(1)%PtFairDisplacement, y_ED%PlatformPtMesh) !MAPp%Input(1)%ptFairleadLoad and y_ED%PlatformPtMesh contain the displaced positions for load calculations - MAP_Out_Start = y_FAST%Lin%Modules(MODULE_MAP)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) ! start of u_ED%PlatformPtMesh%Force field - call Assemble_dUdy_Loads(MAPp%y%ptFairLeadLoad, u_ED%PlatformPtMesh, MeshMapData%Mooring_2_Structure, ED_Start, MAP_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) + u_ED%PlatformPtMesh%NNodes*3 ! start of u_ED%PlatformPtMesh%Moment field (skip the ED forces) - ED_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of y_ED%PlatformPtMesh%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%Mooring_2_Structure%dM%m_uD, ED_Start, ED_Out_Start ) - end if - ! MoorDyn - ! parts of dU^{ED}/dy^{MD} and dU^{ED}/dy^{ED}: - else if ( p_FAST%CompMooring == Module_MD ) then - if ( MD%y%CoupledLoads(1)%Committed ) then ! meshes for floating - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - MD_Out_Start = y_FAST%Lin%Modules(Module_MD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) ! start of u_ED%PlatformPtMesh%Force field - call Assemble_dUdy_Loads(MD%y%CoupledLoads(1), u_ED%PlatformPtMesh, MeshMapData%Mooring_2_Structure, ED_Start, MD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) + u_ED%PlatformPtMesh%NNodes*3 ! start of u_ED%PlatformPtMesh%Moment field (skip the ED forces) - ED_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of y_ED%PlatformPtMesh%TranslationDisp field - call SumBlockMatrix( dUdy, MeshMapData%Mooring_2_Structure%dM%m_uD, ED_Start, ED_Out_Start ) - end if - end if - else if ( p_FAST%CompSub == Module_SD ) then - ! SubDyn - ! parts of dU^{ED}/dy^{SD} and dU^{ED}/dy^{ED}: - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - ! CALL Linearize_Point_to_Point( SD%y%Y1Mesh, u_ED%PlatformPtMesh, MeshMapData%SD_TP_2_ED_P, ErrStat2, ErrMsg2, SD%Input(1)%TPMesh, y_ED%PlatformPtMesh) !SD%Input(1)%TPMesh and y_ED%PlatformPtMesh contain the displaced positions for load calculations - SD_Out_Start = y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) ! start of u_ED%PlatformPtMesh%Force field - call Assemble_dUdy_Loads(SD%y%Y1Mesh, u_ED%PlatformPtMesh, MeshMapData%SD_TP_2_ED_P, ED_Start, SD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) + u_ED%PlatformPtMesh%NNodes*3 ! start of u_ED%PlatformPtMesh%Moment field (skip the ED forces) - ED_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of y_ED%PlatformPtMesh%TranslationDisp field - call SetBlockMatrix( dUdy, MeshMapData%SD_TP_2_ED_P%dM%m_uD, ED_Start, ED_Out_Start ) - - !Mooring gets set in the Linear_SD_InputSolve_ routines - end if -END SUBROUTINE Linear_ED_InputSolve_dy -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{BD}/dy^{ED}, dU^{BD}/dy^{BD}, and dU^{BD}/dy^{AD} blocks of dUdy. (i.e., how do -!! changes in the ED, BD, and AD outputs effect the BD inputs?) -SUBROUTINE Linear_BD_InputSolve_dy( p_FAST, y_FAST, SrvD, p_ED, u_ED, y_ED, p_AD, u_AD, y_AD, BD, MeshMapData, dUdy, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - type(ServoDyn_Data), intent(in ) :: SrvD !< SrvD parameters - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ElastoDyn parameters - TYPE(ED_InputType), INTENT(INOUT) :: u_ED !< ED Inputs at t - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AeroDyn parameters - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< AD inputs (for AD-ED load linearization) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BD data at t - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: j ! Loops through StC instance - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: SrvD_Out_Start ! starting index of dUdy (column) where particular SrvD fields are located - INTEGER(IntKi) :: AD_Out_Start ! starting index of dUdy (column) where particular AD fields are located - INTEGER(IntKi) :: BD_Start ! starting index of dUdy (column) where particular BD fields are located - INTEGER(IntKi) :: BD_Out_Start ! starting index of dUdy (column) where BD output fields are located - INTEGER(IntKi) :: ED_Out_Start ! starting index of dUdy (column) where particular AD fields are located - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - REAL(R8Ki), ALLOCATABLE :: TempMat(:,:) ! temporary matrix for getting linearization matrices when BD input and output meshes are not siblings - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_BD_InputSolve_dy' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - !.......... - ! dU^{ED}/du^{SrvD} - !.......... - if (p_FAST%CompServo == MODULE_SrvD) then - !-------------------- - ! Blade (BD or ED) - if ( allocated(SrvD%y%BStCLoadMesh) ) then - do j=1,size(SrvD%y%BStCLoadMesh,2) - do K = 1,p_FAST%nBeams ! Loop through all blades - if (SrvD%y%BStCLoadMesh(K,j)%Committed) then - ! Start of DistrLoad nodes - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) & - + BD%Input(1,k)%RootMotion%NNodes *18 & ! displacement, rotation, & acceleration fields for each node - + BD%Input(1,k)%PointLoad%NNodes * 6 ! force + moment fields for each node - SrvD_Out_Start = y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - 1 + SrvD%p%Jac_Idx_BStC_y(1,k,j) - call Assemble_dUdy_Loads(SrvD%y%BStCLoadMesh(k,j), BD%Input(1,k)%DistrLoad, MeshMapData%BStC_P_2_BD_P_B(k,j), BD_Start, SrvD_Out_Start, dUdy) - endif - enddo - enddo - endif - endif - - - ! parts of dU^{BD}/dy^{AD} and dU^{BD}/dy^{BD}: - - ! BeamDyn inputs on blade from AeroDyn and BeamDyn - IF ( p_FAST%CompAero == Module_AD ) THEN - - !!! ! This linearization was done in forming dUdu (see Linear_BD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!if (p_FAST%BD_OutputSibling) then - !!! CALL Linearize_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), BD%y(k)%BldMotion ) - !!!else - !!! CALL Linearize_Line2_to_Line2( BD%y(k)%BldMotion, MeshMapData%y_BD_BldMotion_4Loads(k), MeshMapData%BD_L_2_BD_L(k), ErrStat2, ErrMsg2 ) - !!! CALL Linearize_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), MeshMapData%y_BD_BldMotion_4Loads(k) ) - !!!end if - AD_Out_Start = y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + p_AD%rotors(1)%Jac_y_idxStartList%BladeLoad - 1 - DO K = 1,p_FAST%nBeams ! Loop through all blades - - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) & ! start of BD%Input(1,k)%DistrLoad%Force field - + BD%Input(1,k)%RootMotion%NNodes *18 & ! displacement, rotation, & acceleration fields for each node - + BD%Input(1,k)%PointLoad%NNodes * 6 ! force + moment fields for each node - - ! AD loads-to-BD loads transfer (dU^{BD}/dy^{AD}): - call Assemble_dUdy_Loads(y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), BD_Start, AD_Out_Start, dUdy) - AD_Out_Start = AD_Out_Start + y_AD%rotors(1)%BladeLoad(k)%NNodes*6 ! start of y_AD%rotors(1)%BladeLoad(k+1)%Force field [skip the moments to get to forces on next blade] - - - ! BD translation displacement-to-BD moment transfer (dU^{BD}/dy^{BD}): - BD_Start = BD_Start + BD%Input(1,k)%DistrLoad%NNodes * 3 ! start of BD%Input(1,k)%DistrLoad%Moment field (start with moment field) - BD_Out_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_OUTPUT_COL) & ! start of BD%y(k)%BldMotion%TranslationDisp field - + BD%y(k)%ReactionForce%NNodes * 6 ! 2 fields with 3 components - - if (p_FAST%BD_OutputSibling) then - call SetBlockMatrix( dUdy, MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD, BD_Start, BD_Out_Start ) - else - call AllocAry(TempMat, size(MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD,1), size(MeshMapData%BD_L_2_BD_L(k)%dM%mi,2), 'TempMat', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat>=AbortErrLev) return - - ! these blocks should be small enough that we can use matmul instead of calling a LAPACK routine to do it. - TempMat = matmul(MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD,MeshMapData%BD_L_2_BD_L(k)%dM%mi) - call SetBlockMatrix( dUdy, TempMat, BD_Start, BD_Out_Start ) - - BD_Out_Start = BD_Out_Start + BD%y(k)%BldMotion%NNodes*3 ! start of BD%y(k)%BldMotion%Orientation field - TempMat = matmul(MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD,MeshMapData%BD_L_2_BD_L(k)%dM%fx_p) - call SetBlockMatrix( dUdy, TempMat, BD_Start, BD_Out_Start ) - - deallocate(TempMat) ! the next blade may have a different number of nodes - end if - - END DO - - END IF ! aero loads - - ! U_ED_SD_HD_BD_Orca_Residual() in InputSolve Option 1; call to Transfer_ED_to_BD_tmp() - !IF ( p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN - - ! Transfer ED motions to BD inputs (dU^{BD}/dy^{ED}): - do k = 1,size(y_ED%BladeRootMotion) - !!! ! This linearization was done in forming dUdu (see Linear_BD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!CALL Linearize_Point_to_Point( y_ED%BladeRootMotion(k), BD%Input(1,k)%RootMotion, MeshMapData%ED_P_2_BD_P(k), ErrStat2, ErrMsg2 ) - - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) ! ! start of BD%Input(1,k)%RootMotion%TranslationDisp field - ED_Out_Start = Indx_y_ED_BladeRoot_Start(p_ED, y_ED, y_FAST, k) ! start of y_ED%BladeRootMotion(k)%TranslationDisp field - - call Assemble_dUdy_Motions(y_ED%BladeRootMotion(k), BD%Input(1,k)%RootMotion, MeshMapData%ED_P_2_BD_P(k), BD_Start, ED_Out_Start, dUdy) - end do -END SUBROUTINE Linear_BD_InputSolve_dy - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{AD}/dy^{IfW} block of dUdy. (i.e., how do changes in the IfW outputs affect the AD inputs?) -SUBROUTINE Linear_AD_InputSolve_IfW_dy( p_FAST, y_FAST, p_AD, u_AD, dUdy ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< The parameters of AeroDyn - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< The inputs to AeroDyn - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^{AD}/dy^{IfW} block - INTEGER(IntKi) :: I ! Loops through components - INTEGER(IntKi) :: node - INTEGER(IntKi) :: AD_Start ! starting index of dUdy (row) where AD input equations (for specific fields) are located - INTEGER(IntKi) :: Ifw_Start ! starting index of dUdy (col) where IfW output equations (for specific fields) are located - !------------------------------------------------------------------------------------------------- - ! Set the inputs from inflow wind (IfW only has 3 extended outputs): - !------------------------------------------------------------------------------------------------- - AD_Start = y_FAST%Lin%Modules(Module_AD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + p_AD%rotors(1)%Jac_u_idxStartList%Extended - 1 ! index starts at 1 - IfW_Start = y_FAST%Lin%Modules(Module_IfW)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) - - do i=1,p_AD%rotors(1)%NumExtendedInputs ! extended inputs -- direct mapping. Extended outputs of IfW are exactly the same number as AD15 extended inputs - dUdy( AD_Start + i - 1, IfW_Start + i - 1 ) = -1.0_R8Ki - end do -END SUBROUTINE Linear_AD_InputSolve_IfW_dy - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{AD}/dy^{ED} and dU^{AD}/dy^{BD} blocks of dUdy. (i.e., how do changes in the ED and BD outputs affect -!! the AD inputs?) -SUBROUTINE Linear_AD_InputSolve_NoIfW_dy( p_FAST, y_FAST, p_AD, u_AD, p_ED, y_ED, BD, MeshMapData, dUdy, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< The parameters of AeroDyn - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< The inputs to AeroDyn15 - TYPE(ED_ParameterType), INTENT(IN) :: p_ED !< ElastoDyn parameters - TYPE(ED_OutputType), INTENT(IN) :: y_ED !< The outputs from the structural dynamics module - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BD data at t - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^{AD}/dy^{ED} block - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: AD_Start ! starting index of dUdy (column) where particular AD fields are located - INTEGER(IntKi) :: ED_Out_Start! starting index of dUdy (row) where particular ED fields are located - INTEGER(IntKi) :: BD_Out_Start! starting index of dUdy (row) where particular BD fields are located - LOGICAL :: uFieldMask(FIELDMASK_SIZE) !< which destinationfields from u to assemble - LOGICAL :: yFieldMask(FIELDMASK_SIZE) !< which fields from y to assemble - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_AD_InputSolve_NoIfW_dy' - - - ErrStat = ErrID_None - ErrMsg = "" - - !------------------------------------------------------------------------------------------------- - ! Set the inputs from ElastoDyn and/or BeamDyn: - !------------------------------------------------------------------------------------------------- - - !----------------------------------- - ! Nacelle -- disp, orient - if (u_AD%rotors(1)%NacelleMotion%Committed) then - ! Linearize done in dUdu (see Linear_AD_InputSolve_du()) - !CALL Linearize_Point_to_Point( y_ED%NacelleMotion, u_AD%rotors(1)%NacelleMotion, MeshMapData%ED_P_2_AD_P_N, ErrStat2, ErrMsg2 ) - ! CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%NacelleMotion' ) - ! if (errStat>=AbortErrLev) return - - ! *** AD translational displacement: from ED translational displacement (MeshMapData%ED_P_2_AD_P_N%dM%mi) and orientation (MeshMapData%ED_P_2_AD_P_N%dM%fx_p) - AD_Start = Indx_u_AD_Nacelle_Start(p_AD, u_AD, y_FAST) ! start of u_AD%rotors(1)%NacelleMotion%TranslationDisp field - ED_Out_Start = Indx_y_ED_Nacelle_Start(p_ED, y_ED, y_FAST) ! start of y_ED%NacelleMotion%TranslationDisp field - - uFieldMask = .false. - uFieldMask(MASKID_TRANSLATIONDISP) = .true. - uFieldMask(MASKID_ORIENTATION) = .true. - call Assemble_dUdy_Motions(y_ED%NacelleMotion, u_AD%rotors(1)%NacelleMotion, MeshMapData%ED_P_2_AD_P_N, AD_Start, ED_Out_Start, dUdy, uFieldMask) - endif - - - !----------------------------------- - ! Hub -- disp, orient, RV - if (u_AD%rotors(1)%HubMotion%Committed) then - ! Linearize done in dUdu (see Linear_AD_InputSolve_du()) - !CALL Linearize_Point_to_Point( y_ED%HubPtMotion, u_AD%rotors(1)%HubMotion, MeshMapData%ED_P_2_AD_P_H, ErrStat2, ErrMsg2 ) - ! CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%HubMotion' ) - ! if (errStat>=AbortErrLev) return - - ! *** AD translational displacement: from ED translational displacement (MeshMapData%ED_P_2_AD_P_H%dM%mi) and orientation (MeshMapData%ED_P_2_AD_P_H%dM%fx_p) - AD_Start = Indx_u_AD_Hub_Start(p_AD, u_AD, y_FAST) ! start of u_AD%rotors(1)%HubMotion%TranslationDisp field - ED_Out_Start = Indx_y_ED_Hub_Start(p_ED, y_ED, y_FAST) ! start of y_ED%HubPtMotion%TranslationDisp field - - uFieldMask = .false. - uFieldMask(MASKID_TRANSLATIONDISP) = .true. - uFieldMask(MASKID_ORIENTATION) = .true. - uFieldMask(MASKID_ROTATIONVEL) = .true. - yFieldMask = .false. - yFieldMask(MASKID_TRANSLATIONDISP) = .true. - yFieldMask(MASKID_ORIENTATION) = .true. - yFieldMask(MASKID_ROTATIONVEL) = .true. - call Assemble_dUdy_Motions(y_ED%HubPtMotion, u_AD%rotors(1)%HubMotion, MeshMapData%ED_P_2_AD_P_H, AD_Start, ED_Out_Start, dUdy, uFieldMask, yFieldMask) - endif - - - !----------------------------------- - ! TailFin -- disp, orient, TV - if (u_AD%rotors(1)%TFinMotion%Committed) then - ! Linearize done in dUdu (see Linear_AD_InputSolve_du()) - !CALL Linearize_Point_to_Point( y_ED%TFinCMMotion, u_AD%rotors(1)%TFinMotion, MeshMapData%ED_P_2_AD_P_TF, ErrStat2, ErrMsg2 ) - ! CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%TFinMotion' ) - ! if (errStat>=AbortErrLev) return - - ! *** AD translational displacement: from ED translational displacement (MeshMapData%ED_P_2_AD_P_TF%dM%mi) and orientation (MeshMapData%ED_P_2_AD_P_TF%dM%fx_p) - AD_Start = Indx_u_AD_TFin_Start(p_AD, u_AD, y_FAST) ! start of u_AD%rotors(1)%TFinMotion%TranslationDisp field - ED_Out_Start = Indx_y_ED_TFin_Start(p_ED, y_ED, y_FAST) ! start of y_ED%TFinCMMotion%TranslationDisp field - - uFieldMask = .false. - uFieldMask(MASKID_TRANSLATIONDISP) = .true. - uFieldMask(MASKID_ORIENTATION) = .true. - uFieldMask(MASKID_TRANSLATIONVEL) = .true. - call Assemble_dUdy_Motions(y_ED%TFinCMMotion, u_AD%rotors(1)%TFinMotion, MeshMapData%ED_P_2_AD_P_TF, AD_Start, ED_Out_Start, dUdy, uFieldMask) - endif - - - !................................... - ! tower -- Disp, Orient, TransVel, TransAcc - IF (u_AD%rotors(1)%TowerMotion%Committed) THEN - !!! ! This linearization was done in forming dUdu (see Linear_AD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!CALL Linearize_Line2_to_Line2( y_ED%TowerLn2Mesh, u_AD%rotors(1)%TowerMotion, MeshMapData%ED_L_2_AD_L_T, ErrStat2, ErrMsg2 ) - - AD_Start = Indx_u_AD_Tower_Start(p_AD, u_AD, y_FAST) ! start of u_AD%rotors(1)%TowerMotion%TranslationDisp field - ED_Out_Start = Indx_y_ED_Tower_Start(p_ED, y_ED, y_FAST) ! start of y_ED%TowerLn2Mesh%TranslationDisp field - - uFieldMask = .false. - uFieldMask(MASKID_TRANSLATIONDISP) = .true. - uFieldMask(MASKID_ORIENTATION) = .true. - uFieldMask(MASKID_TRANSLATIONVEL) = .true. - uFieldMask(MASKID_TRANSLATIONACC) = .true. - call Assemble_dUdy_Motions(y_ED%TowerLn2Mesh, u_AD%rotors(1)%TowerMotion, MeshMapData%ED_L_2_AD_L_T, AD_Start, ED_Out_Start, dUdy, uFieldMask) - END IF - - - !................................... - ! blade root - !................................... - DO k=1,size(y_ED%BladeRootMotion) - CALL Linearize_Point_to_Point( y_ED%BladeRootMotion(k), u_AD%rotors(1)%BladeRootMotion(k), MeshMapData%ED_P_2_AD_P_R(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeRootMotion('//trim(num2lstr(k))//')' ) - if (errStat>=AbortErrLev) return - - ! *** AD orientation: from ED orientation - AD_Start = Indx_u_AD_BladeRoot_Start(p_AD, u_AD, y_FAST, k) ! start of u_AD%rotors(1)%BladeRootMotion(k)%Orientation field - ED_Out_Start = Indx_y_ED_BladeRoot_Start(p_ED, y_ED, y_FAST, k) ! start of y_ED%BladeRootMotion(k)%TranslationDisp field - - uFieldMask = .false. - uFieldMask(MASKID_ORIENTATION) = .true. - yFieldMask = .false. - yFieldMask(MASKID_TRANSLATIONDISP) = .true. - yFieldMask(MASKID_ORIENTATION) = .true. - yFieldMask(MASKID_ROTATIONVEL) = .true. - call Assemble_dUdy_Motions(y_ED%BladeRootMotion(k), u_AD%rotors(1)%BladeRootMotion(k), MeshMapData%ED_P_2_AD_P_R(k), AD_Start, ED_Out_Start, dUdy, uFieldMask, yFieldMask) - END DO - - - !................................... - ! blades - !................................... - IF (p_FAST%CompElast == Module_ED ) THEN - - DO k=1,size(y_ED%BladeLn2Mesh) - !!! ! This linearization was done in forming dUdu (see Linear_AD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!CALL Linearize_Line2_to_Line2( y_ED%BladeLn2Mesh(k), u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - - AD_Start = Indx_u_AD_Blade_Start(p_AD, u_AD, y_FAST, k) ! start of u_AD%rotors(1)%BladeMotion(k)%TranslationDisp field - ED_Out_Start = Indx_y_ED_Blade_Start(p_ED, y_ED, y_FAST, k) ! start of y_ED%BladeLn2Mesh(k)%TranslationDisp field - - uFieldMask = .true. ! all fields - CALL Assemble_dUdy_Motions(y_ED%BladeLn2Mesh(k), u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), AD_Start, ED_Out_Start, dUdy, uFieldMask) - END DO - - ELSEIF (p_FAST%CompElast == Module_BD ) THEN - !!! ! This linearization was done in forming dUdu (see Linear_AD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!CALL Linearize_Line2_to_Line2( BD%y(k)%BldMotion, u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - - DO k=1,p_FAST%nBeams - AD_Start = Indx_u_AD_Blade_Start(p_AD, u_AD, y_FAST, k) ! start of u_AD%rotors(1)%BladeMotion(k)%TranslationDisp field - BD_Out_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_OUTPUT_COL) & ! start of BD%y(k)%BldMotion%TranslationDisp field - + BD%y(k)%ReactionForce%NNodes * 6 ! 2 fields with 3 components - - uFieldMask = .true. ! all fields - CALL Assemble_dUdy_Motions(BD%y(k)%BldMotion, u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), AD_Start, BD_Out_Start, dUdy, uFieldMask) - END DO - - END IF - - -END SUBROUTINE Linear_AD_InputSolve_NoIfW_dy -!---------------------------------------------------------------------------------------------------------------------------------- - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{HD}/du^{HD} blocks of dUdu. -SUBROUTINE Linear_HD_InputSolve_du( p_FAST, y_FAST, u_HD, y_ED, y_SD, MeshMapData, dUdu, ErrStat, ErrMsg ) - - ! Passed variables - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(HydroDyn_InputType), INTENT(INOUT) :: u_HD !< The inputs to HydroDyn - TYPE(ED_OutputType), TARGET, INTENT(IN) :: y_ED !< The outputs from the ElastoDyn structural dynamics module - TYPE(SD_OutputType), TARGET, INTENT(IN) :: y_SD !< The outputs from the SubDyn structural dynamics module - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^{HD}/du^{HD} block - - INTEGER(IntKi) :: ErrStat !< Error status of the operation - CHARACTER(*) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - - INTEGER(IntKi) :: HD_Start_td ! starting index of dUdu (column) where particular HD fields are located - INTEGER(IntKi) :: HD_Start_tr ! starting index of dUdu (row) where particular HD fields are located - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_HD_InputSolve_du' - TYPE(MeshType), POINTER :: PlatformMotion - TYPE(MeshType), POINTER :: SubstructureMotion2HD - - - ErrStat = ErrID_None - ErrMsg = "" - - ! note that we assume this block matrix has been initialized to the identity matrix before calling this routine - - PlatformMotion => y_ED%PlatformPtMesh - - IF (p_FAST%CompSub == Module_SD) THEN - SubstructureMotion2HD => y_SD%Y2Mesh - ELSE - SubstructureMotion2HD => PlatformMotion - END IF - ! look at how the translational displacement gets transfered to the translational velocity and translational acceleration: - !------------------------------------------------------------------------------------------------- - ! Set the inputs from ElastoDyn: - !------------------------------------------------------------------------------------------------- - - !.......... - ! dU^{HD}/du^{HD} - ! note that the 1s on the diagonal have already been set, so we will fill in the off diagonal terms. - !.......... - - if ( p_FAST%CompHydro == Module_HD ) then ! HydroDyn-{ElastoDyn or SubDyn} - - !=================================================== - ! y_ED%PlatformPtMesh and u_HD%PRPMesh ! this is always done with ED, even if using SD - !=================================================== - - ! Transfer ED motions to HD motion input (HD inputs depend on previously calculated HD inputs from ED): - if ( u_HD%PRPMesh%Committed ) then - call Linearize_Point_to_Point( PlatformMotion, u_HD%PRPMesh, MeshMapData%ED_P_2_HD_PRP_P, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! HD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - - HD_Start_td = Indx_u_HD_PRP_Start(u_HD, y_FAST) - HD_Start_tr = HD_Start_td + u_HD%PRPMesh%NNodes * 6 ! skip 2 fields (TranslationDisp and Orientation) with 3 components before translational velocity field - - ! translational velocity: - if (allocated(MeshMapData%ED_P_2_HD_PRP_P%dM%tv_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%ED_P_2_HD_PRP_P%dM%tv_ud, HD_Start_tr, HD_Start_td ) - end if - - ! translational acceleration: - HD_Start_tr = HD_Start_tr + u_HD%PRPMesh%NNodes * 6 ! skip 2 fields ( TranslationVel and RotationVel) - if (allocated(MeshMapData%ED_P_2_HD_PRP_P%dM%ta_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%ED_P_2_HD_PRP_P%dM%ta_ud, HD_Start_tr, HD_Start_td ) - end if - end if - - - !=================================================== - ! y_ED%PlatformPtMesh or SD%y2Mesh and u_HD%Morison%Mesh - !=================================================== - ! Transfer ED motions to HD motion input (HD inputs depend on previously calculated HD inputs from ED): - if ( u_HD%Morison%Mesh%Committed ) then - call Linearize_Point_to_Point( SubstructureMotion2HD, u_HD%Morison%Mesh, MeshMapData%SubStructure_2_HD_M_P, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! HD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - - HD_Start_td = Indx_u_HD_Morison_Start(u_HD, y_FAST) - HD_Start_tr = HD_Start_td + u_HD%Morison%Mesh%NNodes * 6 ! skip 2 fields (TranslationDisp and Orientation) with 3 components before translational velocity field - - ! translational velocity: - if (allocated(MeshMapData%SubStructure_2_HD_M_P%dM%tv_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%SubStructure_2_HD_M_P%dM%tv_ud, HD_Start_tr, HD_Start_td ) - end if - - ! translational acceleration: - HD_Start_tr = HD_Start_tr + u_HD%Morison%Mesh%NNodes * 6 ! skip 2 fields ( TranslationVel and RotationVel) - if (allocated(MeshMapData%SubStructure_2_HD_M_P%dM%ta_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%SubStructure_2_HD_M_P%dM%ta_ud, HD_Start_tr, HD_Start_td ) - end if - end if - - !=================================================== - ! y_ED%PlatformPtMesh or SD%y2Mesh and u_HD%WAMITMesh - !=================================================== - if ( u_HD%WAMITMesh%Committed ) then - - call Linearize_Point_to_Point( SubstructureMotion2HD, u_HD%WAMITMesh, MeshMapData%SubStructure_2_HD_W_P, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - HD_Start_td = Indx_u_HD_WAMIT_Start(u_HD, y_FAST) - HD_Start_tr = HD_Start_td + u_HD%WAMITMesh%NNodes * 6 ! skip 2 fields (TranslationDisp and Orientation) with 3 components before translational velocity field - - ! translational velocity: - if (allocated(MeshMapData%SubStructure_2_HD_W_P%dM%tv_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%SubStructure_2_HD_W_P%dM%tv_ud, HD_Start_tr, HD_Start_td ) - end if - - ! translational acceleration: - HD_Start_tr = HD_Start_tr + u_HD%WAMITMesh%NNodes * 6 ! skip 2 fields ( TranslationVel and RotationVel) - if (allocated(MeshMapData%SubStructure_2_HD_W_P%dM%ta_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%SubStructure_2_HD_W_P%dM%ta_ud, HD_Start_tr, HD_Start_td ) - end if - end if - - end if -END SUBROUTINE Linear_HD_InputSolve_du - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{HD}/dy^{ED} block of dUdy. (i.e., how do changes in the ED outputs affect -!! the HD inputs?) -SUBROUTINE Linear_HD_InputSolve_dy( p_FAST, y_FAST, u_HD, p_ED, y_ED, y_SD, MeshMapData, dUdy, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(HydroDyn_InputType), INTENT(INOUT) :: u_HD !< The inputs to HydroDyn - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ElastoDyn parameters - TYPE(ED_OutputType), TARGET, INTENT(IN ) :: y_ED !< The outputs from the ElastoDyn structural dynamics module - TYPE(SD_OutputType), TARGET, INTENT(IN ) :: y_SD !< The outputs from the SubDyn structural dynamics module - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^{HD}/dy^{ED} block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - INTEGER(IntKi) :: HD_Start ! starting index of dUdy (column) where particular HD fields are located - INTEGER(IntKi) :: Platform_Out_Start! starting index of dUdy (row) where particular ED fields are located - INTEGER(IntKi) :: SubStructure_Out_Start! starting index of dUdy (row) where particular SD/ED fields are located - TYPE(MeshType), POINTER :: PlatformMotion - TYPE(MeshType), POINTER :: SubstructureMotion2HD - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_HD_InputSolve_dy' - - ErrStat = ErrID_None - ErrMsg = "" - - PlatformMotion => y_ED%PlatformPtMesh - Platform_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of y_ED%PlatformPtMesh%TranslationDisp field - - IF (p_FAST%CompSub == Module_SD) THEN - SubstructureMotion2HD => y_SD%y2Mesh - SubStructure_Out_Start = Indx_y_SD_Y2Mesh_Start(y_SD, y_FAST) ! start of y_SD%Y2Mesh%TranslationDisp field - ELSE - SubstructureMotion2HD => PlatformMotion - SubStructure_Out_Start = Platform_Out_Start - END IF - - - !................................... - ! HD PRP Mesh - !................................... - ! use Indx_u_HD_PRP_Start - HD_Start = Indx_u_HD_PRP_Start(u_HD, y_FAST) ! start of u_HD%Morison%Mesh%TranslationDisp field - call Assemble_dUdy_Motions(PlatformMotion, u_HD%PRPMesh, MeshMapData%ED_P_2_HD_PRP_P, HD_Start, Platform_Out_Start, dUdy) - - - ! dU^{HD}/dy^{ED} or ! dU^{HD}/dy^{SD} - !................................... - ! Morison Mesh - !................................... - IF (u_HD%Morison%Mesh%Committed) THEN - - !!! ! This linearization was done in forming dUdu (see Linear_HD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!call Linearize_Point_to_Line2( SubstructureMotion2HD, u_HD%Morison%Mesh, MeshMapData%SubStructure_2_HD_M_P, ErrStat2, ErrMsg2 ) - - HD_Start = Indx_u_HD_Morison_Start(u_HD, y_FAST) ! start of u_HD%Morison%Mesh%TranslationDisp field - call Assemble_dUdy_Motions(SubstructureMotion2HD, u_HD%Morison%Mesh, MeshMapData%SubStructure_2_HD_M_P, HD_Start, SubStructure_Out_Start, dUdy) - END IF - - !................................... - ! Lumped Platform Reference Pt Mesh - !................................... - IF (u_HD%WAMITMesh%Committed) THEN - - !!! ! This linearization was done in forming dUdu (see Linear_HD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!call Linearize_Point_to_Point( SubstructureMotion2HD, u_HD%Mesh, MeshMapData%SubStructure_2_HD_W_P, ErrStat2, ErrMsg2 ) - - HD_Start = Indx_u_HD_WAMIT_Start(u_HD, y_FAST) ! start of u_HD%Mesh%TranslationDisp field - call Assemble_dUdy_Motions(SubstructureMotion2HD, u_HD%WAMITMesh, MeshMapData%SubStructure_2_HD_W_P, HD_Start, SubStructure_Out_Start, dUdy) - END IF -END SUBROUTINE Linear_HD_InputSolve_dy - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{HD}/dy^{SeaSt} block of dUdy. (i.e., how do changes in the SeaSt outputs affect the HD inputs?) -subroutine Linear_HD_InputSolve_SeaSt_dy( p_FAST, y_FAST, p_SeaSt, p_HD, u_HD, dUdy ) - type(FAST_ParameterType), intent(in ) :: p_FAST !< FAST parameter data - type(FAST_OutputFileType), intent(in ) :: y_FAST !< FAST output file data (for linearization) - type(SeaSt_ParameterType), intent(in ) :: p_SeaSt !< The parameters of SeaState - type(HydroDyn_ParameterType), intent(in ) :: p_HD !< The parameters of HydroDyn - type(HydroDyn_InputType), intent(inout) :: u_HD !< The inputs to HydroDyn - real(R8Ki), intent(inout) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^{HD}/dy^{IfW} block - integer(IntKi) :: I ! Loops through components - integer(IntKi) :: node - integer(IntKi) :: HD_Start ! starting index of dUdy (row) where HD input equations (for specific fields) are located - integer(IntKi) :: SeaSt_Start ! starting index of dUdy (column) where SeaSt output equations (for specific fields) are located - !------------------------------------------------------------------------------------------------- - ! Set the inputs from SeaState (SeaSt only has 1 extended output): - !------------------------------------------------------------------------------------------------- - HD_Start = Indx_u_HD_Ext_Start(u_HD, y_FAST) - SeaSt_Start = y_FAST%Lin%Modules(Module_SeaSt)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + p_SeaSt%LinParams%Jac_y_idxStartList%Extended - 1 ! index starts at 1 - - ! SeaState has one extended output, but HD has multiple extended inputs. WaveElev0 is transferred. - dUdy( HD_Start, SeaSt_Start ) = -1.0_R8Ki -end subroutine Linear_HD_InputSolve_SeaSt_dy - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{HD}/dy^{IfW} block of dUdy. (i.e., how do changes in the IfW outputs affect the HD inputs?) -subroutine Linear_HD_InputSolve_IfW_dy( p_FAST, y_FAST, p_HD, u_HD, dUdy ) - type(FAST_ParameterType), intent(in ) :: p_FAST !< FAST parameter data - type(FAST_OutputFileType), intent(in ) :: y_FAST !< FAST output file data (for linearization) - type(HydroDyn_ParameterType), intent(in ) :: p_HD !< The parameters of AeroDyn - type(HydroDyn_InputType), intent(inout) :: u_HD !< The inputs to AeroDyn - real(R8Ki), intent(inout) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^{HD}/dy^{IfW} block - integer(IntKi) :: I ! Loops through components - integer(IntKi) :: node - integer(IntKi) :: HD_Start ! starting index of dUdy (row) where HD input equations (for specific fields) are located - integer(IntKi) :: IfW_Start ! starting index of dUdy (column) where IfW output equations (for specific fields) are located - !------------------------------------------------------------------------------------------------- - ! Set the inputs from IfW (IfW only has 3 extended output): - !------------------------------------------------------------------------------------------------- - HD_Start = Indx_u_HD_Ext_Start(u_HD, y_FAST) ! skip first Ext input (WaveElev0 from SeaSt) - IfW_Start = y_FAST%Lin%Modules(Module_IfW)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) ! use all IfW extended outputs - - ! IfW has 3 extended outputs, but HD has multiple extended inputs. Transfer HWindSpeed, PLexp, PropagationDir - do i = 0,2 - dUdy( HD_Start + i, IfW_Start + i ) = -1.0_R8Ki - enddo -end subroutine Linear_HD_InputSolve_IfW_dy - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{MAP}/dy^{ED} block of dUdy. (i.e., how do changes in the ED outputs affect -!! the MAP inputs?) -SUBROUTINE Linear_MAP_InputSolve_dy( p_FAST, y_FAST, u_MAP, p_ED, y_ED, y_SD, MeshMapData, dUdy, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(MAP_InputType), INTENT(INOUT) :: u_MAP !< The inputs to MAP - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ElastoDyn parameters - TYPE(ED_OutputType), TARGET, INTENT(IN ) :: y_ED !< The outputs from the ElastoDyn structural dynamics module - TYPE(SD_OutputType), TARGET, INTENT(IN ) :: y_SD !< The outputs from the SubDyn structural dynamics module - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^{MAP}/dy^{ED} block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: MAP_Start ! starting index of dUdy (column) where particular MAP fields are located - INTEGER(IntKi) :: SubStructure_Out_Start! starting index of dUdy (row) where particular SD/ED fields are located - TYPE(MeshType), POINTER :: SubstructureMotion - LOGICAL :: FieldMask(FIELDMASK_SIZE) !< which source fields to assemble - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_MAP_InputSolve_dy' - - ErrStat = ErrID_None - ErrMsg = "" - - IF (p_FAST%CompSub == Module_SD) THEN - SubstructureMotion => y_SD%y3Mesh - SubStructure_Out_Start = Indx_y_SD_Y3Mesh_Start(y_SD, y_FAST) ! start of y_SD%Y3Mesh%TranslationDisp field - ELSE - SubstructureMotion => y_ED%PlatformPtMesh - SubStructure_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of y_ED%PlatformPtMesh%TranslationDisp field - END IF - - IF (u_MAP%PtFairDisplacement%Committed) THEN - !................................... - ! FairLead Mesh - !................................... - - MAP_Start = y_FAST%Lin%Modules(MODULE_MAP)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - - ! dU^{MAP}/dy^{SD} or ! dU^{MAP}/dy^{ED} - call Linearize_Point_to_Point( SubstructureMotion, u_MAP%PtFairDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - FieldMask = .false. - FieldMask(MASKID_TRANSLATIONDISP) = .true. - call Assemble_dUdy_Motions(SubstructureMotion, u_MAP%PtFairDisplacement, MeshMapData%Structure_2_Mooring, MAP_Start, SubStructure_Out_Start, dUdy, FieldMask) - - END IF -END SUBROUTINE Linear_MAP_InputSolve_dy - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{MD}/du^{MD} block of dUdu. (i.e., how do changes in the MD outputs affect -!! the MD inputs?) -SUBROUTINE Linear_MD_InputSolve_du( p_FAST, y_FAST, u_MD, y_ED, y_SD, MeshMapData, dUdu, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(MD_InputType), INTENT(INOUT) :: u_MD !< The inputs to MoorDyn - TYPE(ED_OutputType), TARGET, INTENT(IN ) :: y_ED !< The outputs from the ElastoDyn structural dynamics module - TYPE(SD_OutputType), TARGET, INTENT(IN ) :: y_SD !< The outputs from the SubDyn structural dynamics module - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^{MD}/dy^{ED} block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: MD_Start_td ! starting index of dUdu (column) where particular MD fields are located - INTEGER(IntKi) :: MD_Start_tr ! starting index of dUdu (row) where particular MD fields are located - TYPE(MeshType), POINTER :: SubstructureMotion - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_MD_InputSolve_du' - - ErrStat = ErrID_None - ErrMsg = "" - - IF (p_FAST%CompSub == Module_SD) THEN - SubstructureMotion => y_SD%y3Mesh - ELSE - SubstructureMotion => y_ED%PlatformPtMesh - END IF - - IF (u_MD%CoupledKinematics(1)%Committed) THEN - !................................... - ! FairLead Mesh - !................................... - - ! dU^{MD}/du^{MD} - call Linearize_Point_to_Point( SubstructureMotion, u_MD%CoupledKinematics(1), MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - - ! MD is destination in the mapping, so we want M_{tv_uD} and M_{ta_uD} - MD_Start_td = y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - MD_Start_tr = MD_Start_td + u_MD%CoupledKinematics(1)%NNodes * 6 ! skip 2 fields (TranslationDisp and Orientation) with 3 components before translational velocity field - - ! translational velocity: - if (allocated(MeshMapData%Structure_2_Mooring%dM%tv_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%Structure_2_Mooring%dM%tv_ud, MD_Start_tr, MD_Start_td ) - end if - - ! translational acceleration: - MD_Start_tr = MD_Start_tr + u_MD%CoupledKinematics(1)%NNodes * 6 ! skip 2 fields ( TranslationVel and RotationVel) - if (allocated(MeshMapData%Structure_2_Mooring%dM%ta_uD )) then - call SetBlockMatrix( dUdu, MeshMapData%Structure_2_Mooring%dM%ta_ud, MD_Start_tr, MD_Start_td ) - end if - - END IF -END SUBROUTINE Linear_MD_InputSolve_du - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{MD}/dy^{ED} block of dUdy. (i.e., how do changes in the ED outputs affect -!! the MD inputs?) -SUBROUTINE Linear_MD_InputSolve_dy( p_FAST, y_FAST, u_MD, p_ED, y_ED, y_SD, MeshMapData, dUdy, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(MD_InputType), INTENT(INOUT) :: u_MD !< The inputs to MoorDyn - TYPE(ED_ParameterType), INTENT(IN) :: p_ED !< ElastoDyn parameters - TYPE(ED_OutputType), TARGET, INTENT(IN) :: y_ED !< The outputs from the ElastoDyn structural dynamics module - TYPE(SD_OutputType), TARGET, INTENT(IN) :: y_SD !< The outputs from the SubDyn structural dynamics module - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^{MD}/dy^{ED} block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: MD_Start ! starting index of dUdy (column) where particular MD fields are located - INTEGER(IntKi) :: SubStructure_Out_Start! starting index of dUdy (row) where particular SD/ED fields are located - TYPE(MeshType), POINTER :: SubstructureMotion - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_MD_InputSolve_dy' - - ErrStat = ErrID_None - ErrMsg = "" - - IF (u_MD%CoupledKinematics(1)%Committed) THEN - - IF (p_FAST%CompSub == Module_SD) THEN - SubstructureMotion => y_SD%y3Mesh - SubStructure_Out_Start = Indx_y_SD_Y3Mesh_Start(y_SD, y_FAST) ! start of y_SD%Y3Mesh%TranslationDisp field - ELSE - SubstructureMotion => y_ED%PlatformPtMesh - SubStructure_Out_Start = Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) ! start of y_ED%PlatformPtMesh%TranslationDisp field - END IF - - !................................... - ! FairLead Mesh - !................................... - - MD_Start = y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - - ! dU^{MD}/dy^{SD} or dU^{MD}/dy^{ED} - - !!! ! This linearization was done in forming dUdu (see Linear_MD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!call Linearize_Point_to_Point( SubstructureMotion, u_MD%CoupledKinematics(1), MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - - call Assemble_dUdy_Motions( SubstructureMotion, u_MD%CoupledKinematics(1), MeshMapData%Structure_2_Mooring, MD_Start, SubStructure_Out_Start, dUdy) - - END IF -END SUBROUTINE Linear_MD_InputSolve_dy - -!---------------------------------------------------------------------------------------------------------------------------------- - -!> This routine allocates the state matrices for the glue code and concatenates the module-level state matrices into -!! the first step of computing the full system state matrices. This routine returns -!! \f$ A = A^{ED} \f$, \f$ B = \begin{bmatrix} 0 & 0 & B^{ED} & 0 \end{bmatrix} \f$, -!! \f$ C = \begin{bmatrix} 0 \\ 0 \\ C^{ED} \\ 0 \end{bmatrix} \f$, and -!! \f$ D = \begin{bmatrix} D^{IfW} & 0 & 0 & 0 \\ 0 & D^{SrvD} & 0 & 0 \\ 0 & 0 & D^{ED} & 0 \\ 0 & 0 & 0 & D^{AD}\end{bmatrix}\f$. -SUBROUTINE Glue_FormDiag( p_FAST, y_FAST, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - - ! local variables - INTEGER(IntKi) :: ThisModule ! Module ID # - - INTEGER(IntKi) :: i ! module loop counter - INTEGER(IntKi) :: k ! module instance loop counter - INTEGER(IntKi) :: r ! row loop counter - INTEGER(IntKi) :: c ! column loop counter - INTEGER(IntKi) :: r_start ! row in glue matrix where module block matrix starts - INTEGER(IntKi) :: c_start ! column in glue matrix where module block matrix starts - - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'Glue_FormDiag' - - ErrStat = ErrID_None - ErrMsg = "" - - - - !..................................... - ! Allocate the state matrices if necessary: - !..................................... - - if (.not. allocated(y_FAST%Lin%Glue%A)) then ! assume none of them are allocated - ! A: rows = x; columns = x - call AllocAry(y_FAST%Lin%Glue%A, y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), & - y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'A', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - !B: rows = x; columns = u - call AllocAry(y_FAST%Lin%Glue%B, y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), & - y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), 'B', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - !C: rows = y; columns = x - call AllocAry(y_FAST%Lin%Glue%C, y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), & - y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'C', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - !D: rows = y; columns = u - call AllocAry(y_FAST%Lin%Glue%D, y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), & - y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), 'D', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - if (ErrStat>=AbortErrLev) return - end if - - - ! The equations of the matrices returned from this routine are really just a general form with the null matrices removed: - - ! A - y_FAST%Lin%Glue%A = 0.0_R8Ki - r_start = 1 - c_start = 1 - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - if (allocated( y_FAST%Lin%Modules(ThisModule)%Instance(k)%A) ) then - do c=1,size( y_FAST%Lin%Modules(ThisModule)%Instance(k)%A, 2) - do r=1,size( y_FAST%Lin%Modules(ThisModule)%Instance(k)%A, 1) - y_FAST%Lin%Glue%A(r_start + r - 1, c_start + c - 1) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%A(r,c) - end do - end do - end if - - r_start = r_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_ContSTATE_COL) - c_start = c_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_ContSTATE_COL) - end do - end do - - - ! B - y_FAST%Lin%Glue%B = 0.0_R8Ki - r_start = 1 - c_start = 1 - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - if (allocated( y_FAST%Lin%Modules(ThisModule)%Instance(k)%B) ) then - do c=1,size( y_FAST%Lin%Modules(ThisModule)%Instance(k)%B, 2) - do r=1,size( y_FAST%Lin%Modules(ThisModule)%Instance(k)%B, 1) - y_FAST%Lin%Glue%B(r_start + r - 1, c_start + c - 1) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%B(r,c) - end do - end do - end if - - r_start = r_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_ContSTATE_COL) - c_start = c_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_INPUT_COL) - end do - end do - - ! C - y_FAST%Lin%Glue%C = 0.0_R8Ki - r_start = 1 - c_start = 1 - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - if (allocated( y_FAST%Lin%Modules(ThisModule)%Instance(k)%C) ) then - do c=1,size( y_FAST%Lin%Modules(ThisModule)%Instance(k)%C, 2) - do r=1,size( y_FAST%Lin%Modules(ThisModule)%Instance(k)%C, 1) - y_FAST%Lin%Glue%C(r_start + r - 1, c_start + c - 1) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%C(r,c) - end do - end do - end if - - r_start = r_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_OUTPUT_COL) - c_start = c_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_ContSTATE_COL) - end do - end do - - ! D - y_FAST%Lin%Glue%D = 0.0_R8Ki - r_start = 1 - c_start = 1 - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - if (allocated( y_FAST%Lin%Modules(ThisModule)%Instance(k)%D) ) then - do c=1,size( y_FAST%Lin%Modules(ThisModule)%Instance(k)%D, 2) - do r=1,size( y_FAST%Lin%Modules(ThisModule)%Instance(k)%D, 1) - y_FAST%Lin%Glue%D(r_start + r - 1, c_start + c - 1) = y_FAST%Lin%Modules(ThisModule)%Instance(k)%D(r,c) - end do - end do - end if - - r_start = r_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_OUTPUT_COL) - c_start = c_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin(LIN_INPUT_COL) - end do - end do - - -END SUBROUTINE Glue_FormDiag -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the full-system state matrices for linearization: A, B, C, and D. -!! Note that it uses LAPACK_GEMM instead of MATMUL for matrix multiplications because of stack-space issues (these -!! matrices get large quickly). -SUBROUTINE Glue_StateMatrices( p_FAST, y_FAST, dUdu, dUdy, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< glue-code Jacobian: \f$ \frac{\partial U}{\partial u} \f$; on exit will hold G^{-1}*dUdu - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< glue-code Jacobian: \f$ \frac{\partial U}{\partial y} \f$; on exit will hold G^{-1}*dUdy - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - - ! local variables - REAL(R8Ki), ALLOCATABLE :: G(:,:), tmp(:,:) ! variables for glue-code linearization - INTEGER(IntKi), ALLOCATABLE :: ipiv(:) - - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'Glue_StateMatrices' - - ErrStat = ErrID_None - ErrMsg = "" - - !LIN-TODO: Update doc string comments below for SrvD, HD, MAP, SD - - !..................................... - ! allocate the glue-code state matrices; after this call they will contain the state matrices from the - ! modules (without glue-code influence) on their diagonals - !..................................... - call Glue_FormDiag( p_FAST, y_FAST, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - - !if (p_FAST%LinInputs == LIN_NONE .or. p_FAST%LinOutputs == LIN_NONE) then - ! the glue-code input-output solve doesn't affect the rest of the equations, so we'll just return early - ! call cleanup() - ! return - !end if - - - !..................................... - ! solve for state matrices: - !..................................... - - ! *** get G matrix **** - !---------------------- - if (.not. allocated(G)) then - call AllocAry(G, size(dUdu,1), size(dUdu,2), 'G', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - call AllocAry( ipiv, size(dUdu,1), 'ipiv', ErrStat2, ErrMsg2 ) ! size(G,1) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - end if - - !G = dUdu + matmul( dUdy, y_FAST%Lin%Glue%D ) - G = dUdu - call LAPACK_GEMM( 'N', 'N', 1.0_R8Ki, dUdy, y_FAST%Lin%Glue%D, 1.0_R8Ki, G, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! because G can be ill-conditioned, we are going to precondition with G_hat = S^(-1) * G * S - ! we will also multiply the right-hand-side of the equations that need G inverse so that - ! dUdy_hat = S^(-1)*dUdy and dUdu_hat = S^(-1)*dUdu - call Precondition(p_FAST, y_FAST, G, dUdu, dUdy) - - - ! now we need to form G_hat^(-1) * (S^-1*dUdy) and G^(-1) * (S^-1*dUdu) - ! factor G for the two solves: - CALL LAPACK_getrf( M=size(G,1), N=size(G,2), A=G, IPIV=ipiv, ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) then - call cleanup() - return - end if - - ! after the this solve, dUdy holds G_hat^(-1) * dUdy_hat: - CALL LAPACK_getrs( trans='N', N=size(G,2), A=G, IPIV=ipiv, B=dUdy, ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! after the this solve, dUdu holds G_hat^(-1) * dUdu_hat: - CALL LAPACK_getrs( trans='N', N=size(G,2), A=G, IPIV=ipiv, B=dUdu, ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - deallocate(G) ! we're finished with the solves, so let's get rid of them - deallocate(ipiv) ! we're finished with the solves, so let's get rid of them - - ! after this call, dUdu holds G^(-1)*dUdu and dUdy holds G^(-1)*dUdy: - call Postcondition(p_FAST, y_FAST, dUdu, dUdy) - - - ! *** get tmp matrix for A and C calculations **** - !---------------------- - call AllocAry(tmp, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'G^-1*dUdy*C', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (errStat>=AbortErrLev) then - call cleanup() - return - end if - - !tmp = G^(-1) * dUdy * diag(C) - call LAPACK_GEMM( 'N', 'N', 1.0_R8Ki, dUdy, y_FAST%Lin%Glue%C, 0.0_R8Ki, tmp, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - ! A - !---------------------- - !> \f{equation}{ A = - !! \begin{bmatrix} A^{ED} & 0 & 0 \\ 0 & A^{BD} & 0 \\ 0 & 0 & A^{HD}\end{bmatrix} - - !! \begin{bmatrix} 0 & 0 & B^{ED} & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & B^{BD} & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & B^{HD}\end{bmatrix} \, - !! \begin{bmatrix} G \end{bmatrix}^{-1} \, \frac{\partial U}{\partial y} \, \begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & 0 \\ C^{ED} & 0 & 0 \\ 0 & C^{BD} & 0 \\ 0 & 0 & 0 \\ 0 & 0 & C^{HD} \\ 0 & 0 & 0\end{bmatrix} - !! \f} - !y_FAST%Lin%Glue%A = y_FAST%Lin%Glue%A - matmul( y_FAST%Lin%Glue%B, tmp ) - call LAPACK_GEMM( 'N', 'N', -1.0_R8Ki, y_FAST%Lin%Glue%B, tmp, 1.0_R8Ki, y_FAST%Lin%Glue%A, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! C - !---------------------- - !> \f{equation}{ C = \begin{bmatrix} 0 & 0 \\ 0 & 0 \\ C^{ED} & 0 \\ 0 & C^{BD} \\ 0 & 0 \end{bmatrix} - - !! \begin{bmatrix} D^{IfW} & 0 & 0 & 0 & 0 \\ 0 & D^{SrvD} & 0 & 0 & 0 \\ 0 & 0 & D^{ED} & 0 & 0 \\ 0 & 0 & 0 & D^{BD} & 0\\ 0 & 0 & 0 & 0 & D^{AD}\end{bmatrix} \, - !! \begin{bmatrix} G \end{bmatrix}^{-1} \, \frac{\partial U}{\partial y} \, \begin{bmatrix} 0 & 0 \\ 0 & 0 \\ C^{ED} & 0 \\ 0 & C^{BD} \\ 0 & 0 \end{bmatrix} - !! \f} - !y_FAST%Lin%Glue%C = y_FAST%Lin%Glue%C - matmul( y_FAST%Lin%Glue%D, tmp ) - call LAPACK_GEMM( 'N', 'N', -1.0_R8Ki, y_FAST%Lin%Glue%D, tmp, 1.0_R8Ki, y_FAST%Lin%Glue%C, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - deallocate(tmp) - - - ! B - !---------------------- - !> \f{equation}{ B = \begin{bmatrix} 0 & 0 \\ 0 & 0 \\ B^{ED} & 0 \\ 0 & B^{BD} \\ 0 & 0 \end{bmatrix} \, - !! \begin{bmatrix} G \end{bmatrix}^{-1} \, \frac{\partial U}{\partial u} - !! \f} - call AllocAry(tmp,size(y_FAST%Lin%Glue%B,1),size(y_FAST%Lin%Glue%B,2),'tmp',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (errStat>=AbortErrLev) then - call cleanup() - return - end if - tmp = y_FAST%Lin%Glue%B - - !y_FAST%Lin%Glue%B = matmul( y_FAST%Lin%Glue%B, dUdu ) - call LAPACK_GEMM( 'N', 'N', 1.0_R8Ki, tmp, dUdu, 0.0_R8Ki, y_FAST%Lin%Glue%B, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - deallocate(tmp) - - ! D - !---------------------- - !> \f{equation}{ D = \begin{bmatrix} D^{IfW} & 0 & 0 & 0 & 0 \\ 0 & D^{SrvD} & 0 & 0 & 0 \\ 0 & 0 & D^{ED} & 0 & 0 \\ 0 & 0 & 0 & D^{BD} & 0\\ 0 & 0 & 0 & 0 & D^{AD}\end{bmatrix} \, - !! \begin{bmatrix} G \end{bmatrix}^{-1} \, \frac{\partial U}{\partial u} - !! \f} - call AllocAry(tmp,size(y_FAST%Lin%Glue%D,1),size(y_FAST%Lin%Glue%D,2),'tmp',ErrStat2,ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (errStat>=AbortErrLev) then - call cleanup() - return - end if - tmp = y_FAST%Lin%Glue%D - - !y_FAST%Lin%Glue%D = matmul( y_FAST%Lin%Glue%D, dUdu ) - call LAPACK_GEMM( 'N', 'N', 1.0_R8Ki, tmp, dUdu, 0.0_R8Ki, y_FAST%Lin%Glue%D, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - deallocate(tmp) - - call cleanup() - -contains - subroutine cleanup() - if (allocated(ipiv)) deallocate(ipiv) - if (allocated(G)) deallocate(G) - if (allocated(tmp)) deallocate(tmp) - end subroutine cleanup -END SUBROUTINE Glue_StateMatrices -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the preconditioned matrix, \f$ \hat{G} \f$, such that \f$ \hat{G} = S^(-1) G S \f$ with \f$S^(-1)\f$ defined -!! such that loads are scaled by p_FAST\%UJacSclFact. It also returns the preconditioned matrices \f$ \hat{dUdu} \f$ and -!! \f$ \hat{dUdy} \f$ such that \f$ \hat{dUdu} = S^(-1) dUdu \f$ and -!! \f$ \hat{dUdy} = S^(-1) dUdy \f$ for the right-hand sides of the equations to be solved. -SUBROUTINE Precondition(p_FAST, y_FAST, G, dUdu, dUdy) - - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - REAL(R8Ki), INTENT(INOUT) :: G(:,:) !< variable for glue-code linearization (in is G; out is G_hat) - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< jacobian in FAST linearization from right-hand-side of equation - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< jacobian in FAST linearization from right-hand-side of equation - - integer :: r, c - - !! Change G to G_hat: - do c = 1,size(y_FAST%Lin%Glue%IsLoad_u) - - if ( y_FAST%Lin%Glue%IsLoad_u(c) ) then - - do r = 1,size(y_FAST%Lin%Glue%IsLoad_u) - if ( .not. y_FAST%Lin%Glue%IsLoad_u(r) ) then - ! column is load, but row is a motion: - G(r,c) = G(r,c) * p_FAST%UJacSclFact - end if - end do - - else - - do r = 1,size(y_FAST%Lin%Glue%IsLoad_u) - if ( y_FAST%Lin%Glue%IsLoad_u(r) ) then - ! column is motion, but row is a load: - G(r,c) = G(r,c) / p_FAST%UJacSclFact - end if - end do - - end if - - end do - - - !! Change dUdu to dUdu_hat (note that multiplying on the left multiplies the entire row): - do r = 1,size(y_FAST%Lin%Glue%IsLoad_u) - - if ( y_FAST%Lin%Glue%IsLoad_u(r) ) then - dUdu(r,:) = dUdu(r,:) / p_FAST%UJacSclFact - end if - - end do - - !! Change dUdy to dUdy_hat: - do r = 1,size(y_FAST%Lin%Glue%IsLoad_u) - - if ( y_FAST%Lin%Glue%IsLoad_u(r) ) then - dUdy(r,:) = dUdy(r,:) / p_FAST%UJacSclFact - end if - - end do - - -END SUBROUTINE Precondition -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the matrices \f$ \tilde{dUdu} \f$ and \f$ \tilde{dUdy} \f$ such that -!! \f$ \tilde{dUdu} = G^(-1) dUdu \f$ and -!! \f$ \tilde{dUdy} = G^(-1) dUdy \f$, which have been solved using the preconditioned system defined in fast_lin::precondition. -SUBROUTINE Postcondition(p_FAST, y_FAST, dUdu, dUdy) - - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< jacobian in FAST linearization from right-hand-side of equation - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< jacobian in FAST linearization from right-hand-side of equation - - integer :: r - - !! Change S^(-1) * G_hat^(-1) * dUdu_hat to G^(-1) * dUdu (note that multiplying on the left multiplies the entire row): - do r = 1,size(y_FAST%Lin%Glue%IsLoad_u) - - if ( y_FAST%Lin%Glue%IsLoad_u(r) ) then - dUdu(r,:) = dUdu(r,:) * p_FAST%UJacSclFact - end if - - end do - - !! Change S^(-1) * G_hat^(-1) * dUdy_hat to G^(-1) * dUdy (note that multiplying on the left multiplies the entire row): - do r = 1,size(y_FAST%Lin%Glue%IsLoad_u) - - if ( y_FAST%Lin%Glue%IsLoad_u(r) ) then - dUdy(r,:) = dUdy(r,:) * p_FAST%UJacSclFact - end if - - end do - - -END SUBROUTINE Postcondition -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE SetBlockMatrix( matrix, submatrix, RowStart, ColStart ) - REAL(R8Ki), INTENT(INOUT) :: matrix(:,:) !< matrix that will have the negative of the submatrix block added to it - REAL(R8Ki), INTENT(IN ) :: submatrix(:,:) !< block matrix that needs to be added to matrix - INTEGER(IntKi), INTENT(IN ) :: RowStart !< first row in matrix where submatrix should start - INTEGER(IntKi), INTENT(IN ) :: ColStart !< first column in matrix where submatrix should start - - INTEGER(IntKi) :: col - INTEGER(IntKi) :: row - - - do col=1,size( submatrix, 2) - do row=1,size( submatrix, 1) - matrix(RowStart + row - 1, ColStart + col - 1) = - submatrix(row,col) ! note the negative sign here!!!! - end do - end do - - -END SUBROUTINE SetBlockMatrix -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE SumBlockMatrix( matrix, submatrix, RowStart, ColStart ) - REAL(R8Ki), INTENT(INOUT) :: matrix(:,:) !< matrix that will have the negative of the submatrix block added to it - REAL(R8Ki), INTENT(IN ) :: submatrix(:,:) !< block matrix that needs to be added to matrix - INTEGER(IntKi), INTENT(IN ) :: RowStart !< first row in matrix where submatrix should start - INTEGER(IntKi), INTENT(IN ) :: ColStart !< first column in matrix where submatrix should start - - INTEGER(IntKi) :: col - INTEGER(IntKi) :: row - - - do col=1,size( submatrix, 2) - do row=1,size( submatrix, 1) - matrix(RowStart + row - 1, ColStart + col - 1) = matrix(RowStart + row - 1, ColStart + col - 1) & - - submatrix(row,col) ! note the negative sign here!!!! - end do - end do - - -END SUBROUTINE SumBlockMatrix -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine assembles the linearization matrices for transfer of motion fields between two meshes. -!> It set the following block matrix, which is the dUdy block for transfering output (source) mesh \f$y\f$ to the -!! input (destination) mesh \f$u\f$:\n -!! \f$ M = - \begin{bmatrix} M_{mi} & M_{f_{\times p}} & 0 & 0 & 0 & 0 \\ -!! 0 & M_{mi} & 0 & 0 & 0 & 0 \\ -!! M_{tv\_uS} & 0 & M_{mi} & M_{f_{\times p}} & 0 & 0 \\ -!! 0 & 0 & 0 & M_{mi} & 0 & 0 \\ -!! M_{ta\_uS} & 0 & 0 & M_{ta\_rv} & M_{mi} & M_{f_{\times p}} \\ -!! 0 & 0 & 0 & 0 & 0 & M_{mi} \\ -!! \end{bmatrix} \f$ -!! where the matrices correspond to -!! \f$ \left\{ \begin{matrix} -!! \vec{u}^S \\ -!! \vec{\theta}^S \\ -!! \vec{v}^S \\ -!! \vec{\omega}^S \\ -!! \vec{a}^S \\ -!! \vec{\alpha}^S \\ -!! \end{matrix} \right\} \f$ -SUBROUTINE Assemble_dUdy_Motions(y, u, MeshMap, BlockRowStart, BlockColStart, dUdy, uFieldMaskIn, yFieldMaskIn) - TYPE(MeshType), INTENT(IN) :: y !< the output (source) mesh that is transfering motions - TYPE(MeshType), INTENT(IN) :: u !< the input (destination) mesh that is receiving motions - TYPE(MeshMapType), INTENT(IN) :: MeshMap !< the mesh mapping from y to u - INTEGER(IntKi), INTENT(IN) :: BlockRowStart !< the index of the row defining the block of dUdy to be set (u) - INTEGER(IntKi), INTENT(IN) :: BlockColStart !< the index of the column defining the block of dUdy to be set (y) - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< full Jacobian matrix - LOGICAL, OPTIONAL, INTENT(IN ) :: uFieldMaskIn(FIELDMASK_SIZE) !< which row fields to do - LOGICAL, OPTIONAL, INTENT(IN ) :: yFieldMaskIn(FIELDMASK_SIZE) !< which col fields to do - - INTEGER(IntKi) :: row - INTEGER(IntKi) :: col - LOGICAL :: uFieldMask(FIELDMASK_SIZE) !< which row fields to do - LOGICAL :: yFieldMask(FIELDMASK_SIZE) !< which row fields to do - - ! Fields: destination u mesh (row) may not have all fields. For some modules, a field may be skipped in - ! the sequence. A separate counting of fields before the current field must be tracked. - ! It is assumed that the source mesh is complete and contains all fields - integer(IntKi) :: uFieldIdx(FIELDMASK_SIZE) ! index 0 based - integer(IntKi) :: yFieldIdx(FIELDMASK_SIZE) ! index 0 based - - if (present(uFieldMaskIn)) then - uFieldMask = uFieldMaskIn - else - uFieldMask(MASKID_TRANSLATIONDISP) = .true. - uFieldMask(MASKID_ORIENTATION) = .true. - uFieldMask(MASKID_TRANSLATIONVEL) = .true. - uFieldMask(MASKID_ROTATIONVEL) = .true. - uFieldMask(MASKID_TRANSLATIONACC) = .true. - uFieldMask(MASKID_ROTATIONACC) = .true. - endif - call SetFieldIdx(uFieldMask,u%NNodes,uFieldIdx) - - if (present(yFieldMaskIn)) then - yFieldMask = yFieldMaskIn - else - yFieldMask(MASKID_TRANSLATIONDISP) = .true. - yFieldMask(MASKID_ORIENTATION) = .true. - yFieldMask(MASKID_TRANSLATIONVEL) = .true. - yFieldMask(MASKID_ROTATIONVEL) = .true. - yFieldMask(MASKID_TRANSLATIONACC) = .true. - yFieldMask(MASKID_ROTATIONACC) = .true. - endif - call SetFieldIdx(yFieldMask,y%NNodes,yFieldIdx) - -!! \f$M_{mi}\f$ is modmesh_mapping::meshmaplinearizationtype::mi (motion identity)\n -!! \f$M_{f_{\times p}}\f$ is modmesh_mapping::meshmaplinearizationtype::fx_p \n -!! \f$M_{tv\_uD}\f$ is modmesh_mapping::meshmaplinearizationtype::tv_uD \n -!! \f$M_{tv\_uS}\f$ is modmesh_mapping::meshmaplinearizationtype::tv_uS \n -!! \f$M_{ta\_uD}\f$ is modmesh_mapping::meshmaplinearizationtype::ta_uD \n -!! \f$M_{ta\_uS}\f$ is modmesh_mapping::meshmaplinearizationtype::ta_uS \n -!! \f$M_{ta\_rv}\f$ is modmesh_mapping::meshmaplinearizationtype::ta_rv \n - - - !*** row for translational displacement *** - if (uFieldMask(MASKID_TRANSLATIONDISP)) then - row = BlockRowStart + uFieldIdx(MASKID_TRANSLATIONDISP) ! start of u%TranslationDisp field - - ! source translational displacement to destination translational displacement: - if (yFieldMask(MASKID_TRANSLATIONDISP)) then - col = BlockColStart + yFieldIdx(MASKID_TRANSLATIONDISP) ! start of y%TranslationDisp field - call SetBlockMatrix( dUdy, MeshMap%dM%mi, row, col ) - endif - - ! source orientation to destination translational displacement: - if (yFieldMask(MASKID_ORIENTATION)) then - col = BlockColStart + yFieldIdx(MASKID_ORIENTATION) ! start of y%Orientation field - call SetBlockMatrix( dUdy, MeshMap%dM%fx_p, row, col ) - endif - endif - - - - !*** row for orientation *** - if (uFieldMask(MASKID_ORIENTATION) .and. yFieldMask(MASKID_ORIENTATION)) then - ! source orientation to destination orientation: - row = BlockRowStart + uFieldIdx(MASKID_ORIENTATION) ! start of u%Orientation field - col = BlockColStart + yFieldIdx(MASKID_ORIENTATION) ! start of y%Orientation field - call SetBlockMatrix( dUdy, MeshMap%dM%mi, row, col ) - endif - - - !*** row for translational velocity *** - if (uFieldMask(MASKID_TRANSLATIONVEL)) then - row = BlockRowStart + uFieldIdx(MASKID_TRANSLATIONVEL) ! start of u%TranslationVel field - - ! source translational displacement to destination translational velocity: - if (yFieldMask(MASKID_TRANSLATIONDISP)) then - col = BlockColStart + yFieldIdx(MASKID_TRANSLATIONDISP) ! start of y%TranslationDisp field - call SetBlockMatrix( dUdy, MeshMap%dM%tv_us, row, col ) - endif - - ! source translational velocity to destination translational velocity: - if (yFieldMask(MASKID_TRANSLATIONVEL)) then - col = BlockColStart + yFieldIdx(MASKID_TRANSLATIONVEL) ! start of y%TranslationVel field - call SetBlockMatrix( dUdy, MeshMap%dM%mi, row, col ) - endif - - ! source rotational velocity to destination translational velocity: - if (yFieldMask(MASKID_ROTATIONVEL)) then - col = BlockColStart + yFieldIdx(MASKID_ROTATIONVEL) ! start of y%RotationVel field - call SetBlockMatrix( dUdy, MeshMap%dM%fx_p, row, col ) - endif - endif - - - - !*** row for rotational velocity *** - if (uFieldMask(MASKID_ROTATIONVEL) .and. yFieldMask(MASKID_ROTATIONVEL)) then - ! source rotational velocity to destination rotational velocity: - row = BlockRowStart + uFieldIdx(MASKID_ROTATIONVEL) ! start of u%RotationVel field - col = BlockColStart + yFieldIdx(MASKID_ROTATIONVEL) ! start of y%RotationVel field - call SetBlockMatrix( dUdy, MeshMap%dM%mi, row, col ) - endif - - - !*** row for translational acceleration *** - if (uFieldMask(MASKID_TRANSLATIONACC)) then - row = BlockRowStart + uFieldIdx(MASKID_TRANSLATIONACC) ! start of u%TranslationAcc field - - ! source translational displacement to destination translational acceleration: - if (yFieldMask(MASKID_TRANSLATIONDISP)) then - col = BlockColStart + yFieldIdx(MASKID_TRANSLATIONDISP) ! start of y%TranslationDisp field - call SetBlockMatrix( dUdy, MeshMap%dM%ta_us, row, col ) - endif - - ! source rotational velocity to destination translational acceleration: - if (yFieldMask(MASKID_ROTATIONVEL)) then - col = BlockColStart + yFieldIdx(MASKID_ROTATIONVEL) ! start of y%RotationVel field - call SetBlockMatrix( dUdy, MeshMap%dM%ta_rv, row, col ) - endif - - ! source translational acceleration to destination translational acceleration: - if (yFieldMask(MASKID_TRANSLATIONACC)) then - col = BlockColStart + yFieldIdx(MASKID_TRANSLATIONACC) ! start of y%TranslationAcc field - call SetBlockMatrix( dUdy, MeshMap%dM%mi, row, col ) - endif - - ! source rotational acceleration to destination translational acceleration: - if (yFieldMask(MASKID_ROTATIONACC)) then - col = BlockColStart + yFieldIdx(MASKID_ROTATIONACC) ! start of y%RotationAcc field - call SetBlockMatrix( dUdy, MeshMap%dM%fx_p, row, col ) - endif - endif - - - !*** row for rotational acceleration *** - if (uFieldMask(MASKID_ROTATIONACC) .and. yFieldMask(MASKID_ROTATIONACC)) then - ! source rotational acceleration to destination rotational acceleration - row = BlockRowStart + uFieldIdx(MASKID_ROTATIONACC ) ! start of u%RotationAcc field - col = BlockColStart + yFieldIdx(MASKID_ROTATIONACC ) ! start of y%RotationAcc field - call SetBlockMatrix( dUdy, MeshMap%dM%mi, row, col ) - endif - - -contains - subroutine SetFieldIdx(FMask,NNodes,FIdx) - logical, intent(in ) :: FMask(FIELDMASK_SIZE) - integer, intent(in ) :: NNodes - integer, intent( out) :: FIdx(FIELDMASK_SIZE) - integer :: idxNext - FIdx = 0 - idxNext = 0 ! index 0 based - if (FMask(MASKID_TRANSLATIONDISP)) then; FIdx(MASKID_TRANSLATIONDISP) = idxNext; idxNext = FIdx(MASKID_TRANSLATIONDISP) + 3*NNodes; endif ! 3 fields for TRANSLATIONDISP - if (FMask(MASKID_ORIENTATION )) then; FIdx(MASKID_ORIENTATION ) = idxNext; idxNext = FIdx(MASKID_ORIENTATION ) + 3*NNodes; endif ! 3 fields for ORIENTATION - if (FMask(MASKID_TRANSLATIONVEL )) then; FIdx(MASKID_TRANSLATIONVEL ) = idxNext; idxNext = FIdx(MASKID_TRANSLATIONVEL ) + 3*NNodes; endif ! 3 fields for TRANSLATIONVEL - if (FMask(MASKID_ROTATIONVEL )) then; FIdx(MASKID_ROTATIONVEL ) = idxNext; idxNext = FIdx(MASKID_ROTATIONVEL ) + 3*NNodes; endif ! 3 fields for ROTATIONVEL - if (FMask(MASKID_TRANSLATIONACC )) then; FIdx(MASKID_TRANSLATIONACC ) = idxNext; idxNext = FIdx(MASKID_TRANSLATIONACC ) + 3*NNodes; endif ! 3 fields for TRANSLATIONACC - if (FMask(MASKID_ROTATIONACC )) then; FIdx(MASKID_ROTATIONACC ) = idxNext; idxNext = FIdx(MASKID_ROTATIONACC ) + 3*NNodes; endif ! 3 fields for ROTATIONACC - end subroutine SetFieldIdx -END SUBROUTINE Assemble_dUdy_Motions - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine assembles the linearization matrices for transfer of load fields between two meshes. -!> It set the following block matrix, which is the dUdy block for transfering output (source) mesh \f$y\f$ to the -!! input (destination) mesh \f$u\f$:\n -!! \f$ M = - \begin{bmatrix} M_{li} & 0 \\ -!! M_{fm} & M_{li} \\ -!! \end{bmatrix} \f$ -!! & M_{mi} & } -!! \f$ \left\{ \begin{matrix} -!! \vec{F}^S \\ -!! \vec{M}^S -!! \end{matrix} \right\} \f$ -SUBROUTINE Assemble_dUdy_Loads(y, u, MeshMap, BlockRowStart, BlockColStart, dUdy) - TYPE(MeshType), INTENT(IN) :: y !< the output (source) mesh that is transfering loads - TYPE(MeshType), INTENT(IN) :: u !< the input (destination) mesh that is receiving loads - TYPE(MeshMapType), INTENT(IN) :: MeshMap !< the mesh mapping from y to u - INTEGER(IntKi), INTENT(IN) :: BlockRowStart !< the index of the row defining the block of dUdy to be set - INTEGER(IntKi), INTENT(IN) :: BlockColStart !< the index of the column defining the block of dUdy to be set - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< full Jacobian matrix - - INTEGER(IntKi) :: row - INTEGER(IntKi) :: col - - !*** row for force *** - ! source force to destination force: - row = BlockRowStart ! start of u%Force field - col = BlockColStart ! start of y%Force field - call SetBlockMatrix( dUdy, MeshMap%dM%li, row, col ) - - !*** row for moment *** - ! source force to destination moment: - row = BlockRowStart + u%NNodes*3 ! start of u%Moment field [skip 1 field with 3 components] - col = BlockColStart ! start of y%Force field - call SetBlockMatrix( dUdy, MeshMap%dM%m_f, row, col ) - - if (allocated(y%Moment)) then - ! source moment to destination moment: - row = BlockRowStart + u%NNodes*3 ! start of u%Moment field [skip 1 field with 3 components] - col = BlockColStart + y%NNodes*3 ! start of y%Moment field [skip 1 field with 3 components] - call SetBlockMatrix( dUdy, MeshMap%dM%li, row, col ) - end if - -END SUBROUTINE Assemble_dUdy_Loads - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_ED%BladePtLoads(BladeNum) mesh in the FAST linearization inputs. -FUNCTION Indx_u_ED_Blade_Start(p_ED, u_ED, y_FAST, BladeNum) RESULT(ED_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_InputType), INTENT(IN ) :: u_ED !< ED Inputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER, INTENT(IN ) :: BladeNum !< blade number to find index for - INTEGER :: k !< blade number loop - INTEGER :: ED_Start !< starting index of this blade mesh in ElastoDyn inputs - ED_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_ED%Jac_u_idxStartList%BladeLoad - 1) ! index starts at 1 - if (allocated(u_ED%BladePtLoads)) then - do k = 1,min(BladeNum-1, size(u_ED%BladePtLoads)) - ED_Start = ED_Start + u_ED%BladePtLoads(k)%NNodes * 6 ! 3 forces + 3 moments at each node on each blade - end do - end if -END FUNCTION Indx_u_ED_Blade_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_ED%PlatformPtMesh mesh in the FAST linearization inputs. -FUNCTION Indx_u_ED_Platform_Start(p_ED, u_ED, y_FAST) RESULT(ED_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_InputType), INTENT(IN ) :: u_ED !< ED Inputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: ED_Start !< starting index of this mesh - ED_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_ED%Jac_u_idxStartList%PlatformLoad - 1) ! index starts at 1 -END FUNCTION Indx_u_ED_Platform_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_ED%TowerPtLoads mesh in the FAST linearization inputs. -FUNCTION Indx_u_ED_Tower_Start(p_ED, u_ED, y_FAST) RESULT(ED_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_InputType), INTENT(IN ) :: u_ED !< ED Inputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: ED_Start !< starting index of this mesh - ED_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_ED%Jac_u_idxStartList%TowerLoad - 1) ! index starts at 1 -END FUNCTION Indx_u_ED_Tower_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_ED%HubPtLoad mesh in the FAST linearization inputs. -FUNCTION Indx_u_ED_Hub_Start(p_ED, u_ED, y_FAST) RESULT(ED_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_InputType), INTENT(IN ) :: u_ED !< ED Inputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: ED_Start !< starting index of this mesh - ED_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_ED%Jac_u_idxStartList%HubLoad - 1) ! index starts at 1 -END FUNCTION Indx_u_ED_Hub_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_ED%NacelleLoads mesh in the FAST linearization inputs. -FUNCTION Indx_u_ED_Nacelle_Start(p_ED, u_ED, y_FAST) RESULT(ED_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_InputType), INTENT(IN ) :: u_ED !< ED Inputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: ED_Start !< starting index of this mesh - ED_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_ED%Jac_u_idxStartList%NacelleLoad - 1) ! index starts at 1 -END FUNCTION Indx_u_ED_Nacelle_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_ED%NacelleLoads mesh in the FAST linearization inputs. -FUNCTION Indx_u_ED_TFin_Start(p_ED, u_ED, y_FAST) RESULT(ED_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_InputType), INTENT(IN ) :: u_ED !< ED Inputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: ED_Start !< starting index of this mesh - ED_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_ED%Jac_u_idxStartList%TFinLoad - 1) ! index starts at 1 -END FUNCTION Indx_u_ED_TFin_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_ED%BladePitchCom array in the FAST linearization inputs. -FUNCTION Indx_u_ED_BlPitchCom_Start(p_ED, u_ED, y_FAST) RESULT(ED_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_InputType), INTENT(IN ) :: u_ED !< ED Inputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: ED_Start !< starting index of this mesh - ED_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_ED%Jac_u_idxStartList%BlPitchCom - 1) ! index starts at 1 -END FUNCTION Indx_u_ED_BlPitchCom_Start -!---------------------------------------------------------------------------------------------------------------------------------- - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_ED%BladeLn2Mesh(BladeNum) mesh in the FAST linearization outputs. -FUNCTION Indx_y_ED_Blade_Start(p_ED, y_ED, y_FAST, BladeNum) RESULT(ED_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ED outputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER, INTENT(IN ) :: BladeNum !< blade number to find index for - INTEGER :: k !< blade number loop - INTEGER :: ED_Out_Start !< starting index of this blade mesh in ElastoDyn outputs - ED_Out_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + (p_ED%Jac_y_idxStartList%Blade - 1) ! index starts at 1 - if (allocated(y_ED%BladeLn2Mesh)) then - do k = 1,min(BladeNum-1,SIZE(y_ED%BladeLn2Mesh,1)) ! Loop through all blades (p_ED%NumBl) - ED_Out_Start = ED_Out_Start + y_ED%BladeLn2Mesh(k)%NNodes*18 ! 6 fields with 3 components on each blade - end do - end if -END FUNCTION Indx_y_ED_Blade_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_ED%PlatformPtMesh mesh in the FAST linearization outputs. -FUNCTION Indx_y_ED_Platform_Start(p_ED, y_ED, y_FAST) RESULT(ED_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ED outputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: ED_Out_Start !< starting index of this mesh in ElastoDyn outputs - ED_Out_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + (p_ED%Jac_y_idxStartList%Platform - 1) ! index starts at 1 -END FUNCTION Indx_y_ED_Platform_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_ED%TowerLn2Mesh mesh in the FAST linearization outputs. -FUNCTION Indx_y_ED_Tower_Start(p_ED, y_ED, y_FAST) RESULT(ED_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ED outputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: ED_Out_Start !< starting index of this mesh in ElastoDyn outputs - ED_Out_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + (p_ED%Jac_y_idxStartList%Tower - 1) ! index starts at 1 -END FUNCTION Indx_y_ED_Tower_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_ED%HubPtMesh mesh in the FAST linearization outputs. -FUNCTION Indx_y_ED_Hub_Start(p_ED, y_ED, y_FAST) RESULT(ED_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ED outputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: ED_Out_Start !< starting index of this mesh in ElastoDyn outputs - ED_Out_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + (p_ED%Jac_y_idxStartList%Hub - 1) ! index starts at 1 -END FUNCTION Indx_y_ED_Hub_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_ED%BladeRootMotion(BladeNum) mesh in the FAST linearization outputs. -FUNCTION Indx_y_ED_BladeRoot_Start(p_ED, y_ED, y_FAST, BladeNum) RESULT(ED_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ED outputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER, INTENT(IN ) :: BladeNum !< blade number to find index for - INTEGER :: k !< blade number loop - INTEGER :: ED_Out_Start !< starting index of this blade mesh in ElastoDyn outputs - ED_Out_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + (p_ED%Jac_y_idxStartList%BladeRoot - 1) ! index starts at 1 - do k = 1,min(BladeNum-1,size(y_ED%BladeRootMotion)) - ED_Out_Start = ED_Out_Start + y_ED%BladeRootMotion(k)%NNodes*18 ! all fields - end do -END FUNCTION Indx_y_ED_BladeRoot_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_ED%NacelleMotion mesh in the FAST linearization outputs. -FUNCTION Indx_y_ED_Nacelle_Start(p_ED, y_ED, y_FAST) RESULT(ED_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ED outputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: k !< blade number loop - INTEGER :: ED_Out_Start !< starting index of this blade mesh in ElastoDyn outputs - ED_Out_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + (p_ED%Jac_y_idxStartList%Nacelle - 1) ! index starts at 1 -END FUNCTION Indx_y_ED_Nacelle_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_ED%TFinCMMotion mesh in the FAST linearization outputs. -FUNCTION Indx_y_ED_TFin_Start(p_ED, y_ED, y_FAST) RESULT(ED_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ED outputs at t - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ED parameters - INTEGER :: k !< blade number loop - INTEGER :: ED_Out_Start !< starting index of tailfin mesh in ElastoDyn outputs - ED_Out_Start = y_FAST%Lin%Modules(Module_ED)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + (p_ED%Jac_y_idxStartList%TFin - 1) ! index starts at 1 -END FUNCTION Indx_y_ED_TFin_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for y_ED%Yaw in the FAST linearization outputs. -FUNCTION Indx_y_Yaw_Start(y_FAST, ThisModule) RESULT(ED_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - INTEGER, INTENT(IN ) :: ThisModule !< which structural module this is for - INTEGER :: ED_Out_Start !< starting index of this blade mesh in ElastoDyn outputs - ED_Out_Start = y_FAST%Lin%Modules(thisModule)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + y_FAST%Lin%Modules(thisModule)%Instance(1)%SizeLin(LIN_OUTPUT_COL) & !end of ED outputs (+1) - - y_FAST%Lin%Modules(thisModule)%Instance(1)%NumOutputs - 3 ! start of ED where Yaw, YawRate, HSS_Spd occur (right before WriteOutputs) -END FUNCTION Indx_y_Yaw_Start -!---------------------------------------------------------------------------------------------------------------------------------- - - -! Indexing to AD15 Jac_u. Order is: -! Nacelle -! Hub -! Tower -! BladeRoot -! Blades -! TailFin -! UserProp -! Extended inputs -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_AD%rotors(1)%NacelleMotion mesh in the FAST linearization inputs. -FUNCTION Indx_u_AD_Nacelle_Start(p_AD, u_AD, y_FAST) RESULT(AD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD Inputs at t - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AD parameters - INTEGER :: AD_Start !< starting index of this mesh in AeroDyn inputs - AD_Start = y_FAST%Lin%Modules(Module_AD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_AD%rotors(1)%Jac_u_idxStartList%Nacelle - 1) ! index starts at 1 -END FUNCTION Indx_u_AD_Nacelle_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_AD%rotors(1)%NacelleMotion mesh in the FAST linearization inputs. -FUNCTION Indx_u_AD_Hub_Start(p_AD, u_AD, y_FAST) RESULT(AD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD Inputs at t - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AD parameters - INTEGER :: AD_Start !< starting index of this mesh in AeroDyn inputs - AD_Start = y_FAST%Lin%Modules(Module_AD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_AD%rotors(1)%Jac_u_idxStartList%Hub - 1) ! index starts at 1 -END FUNCTION Indx_u_AD_Hub_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_AD%rotors(1)%TowerMotion mesh in the FAST linearization inputs. -FUNCTION Indx_u_AD_Tower_Start(p_AD, u_AD, y_FAST) RESULT(AD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD Inputs at t - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AD parameters - INTEGER :: AD_Start !< starting index of this mesh in AeroDyn inputs - AD_Start = y_FAST%Lin%Modules(Module_AD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_AD%rotors(1)%Jac_u_idxStartList%Tower - 1) ! index starts at 1 -END FUNCTION Indx_u_AD_Tower_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_AD%rotors(1)%TFinMotion mesh in the FAST linearization inputs. -FUNCTION Indx_u_AD_TFin_Start(p_AD, u_AD, y_FAST) RESULT(AD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD Inputs at t - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AD parameters - INTEGER :: AD_Start !< starting index of this mesh in AeroDyn inputs - AD_Start = y_FAST%Lin%Modules(Module_AD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_AD%rotors(1)%Jac_u_idxStartList%TFin - 1) ! index starts at 1 -END FUNCTION Indx_u_AD_TFin_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_AD%rotors(1)%BladeRootMotion(k) mesh in the FAST linearization inputs. -FUNCTION Indx_u_AD_BladeRoot_Start(p_AD, u_AD, y_FAST, BladeNum) RESULT(AD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD Inputs at t - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AD parameters - INTEGER, INTENT(IN ) :: BladeNum !< blade number to find index for - INTEGER :: k !< blade number loop - INTEGER :: AD_Start !< starting index of this mesh in AeroDyn inputs - - AD_Start = y_FAST%Lin%Modules(Module_AD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_AD%rotors(1)%Jac_u_idxStartList%BladeRoot - 1) ! index starts at 1 - - do k = 1,min(BladeNum-1,size(u_AD%rotors(1)%BladeRootMotion)) - AD_Start = AD_Start + u_AD%rotors(1)%BladeRootMotion(k)%NNodes * 3 ! 1 field (MASKID_Orientation) with 3 components - end do -END FUNCTION Indx_u_AD_BladeRoot_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_AD%rotors(1)%BladeMotion(k) mesh in the FAST linearization inputs. -FUNCTION Indx_u_AD_Blade_Start(p_AD, u_AD, y_FAST, BladeNum) RESULT(AD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD Inputs at t - TYPE(AD_ParameterType), INTENT(IN ) :: p_AD !< AD parameters - INTEGER, INTENT(IN ) :: BladeNum !< blade number to find index for - INTEGER :: k !< blade number loop - INTEGER :: AD_Start !< starting index of this mesh in AeroDyn inputs - - AD_Start = y_FAST%Lin%Modules(Module_AD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) + (p_AD%rotors(1)%Jac_u_idxStartList%Blade - 1) ! index starts at 1 - - do k = 1,min(BladeNum-1,size(u_AD%rotors(1)%BladeMotion)) - AD_Start = AD_Start + u_AD%rotors(1)%BladeMotion(k)%NNodes * 18 ! 6 fields (TranslationDisp, MASKID_Orientation, TranslationVel, RotationVel, TranslationAcc, RotationAcc) with 3 components - end do -END FUNCTION Indx_u_AD_Blade_Start - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_SD%TPMesh mesh in the FAST linearization inputs. -FUNCTION Indx_u_SD_TPMesh_Start(u_SD, y_FAST) RESULT(SD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(SD_InputType), INTENT(IN ) :: u_SD !< SD Inputs at t - - INTEGER :: SD_Start !< starting index of this mesh in SubDyn inputs - - SD_Start = y_FAST%Lin%Modules(Module_SD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - -END FUNCTION Indx_u_SD_TPMesh_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_SD%Y1Mesh mesh in the FAST linearization outputs. -FUNCTION Indx_y_SD_Y1Mesh_Start(y_SD, y_FAST) RESULT(SD_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(SD_OutputType), INTENT(IN ) :: y_SD !< SD outputs at t - - INTEGER :: SD_Out_Start !< starting index of this mesh in ElastoDyn outputs - - SD_Out_Start = y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) -END FUNCTION Indx_y_SD_Y1Mesh_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_SD%Y2Mesh mesh in the FAST linearization outputs. -FUNCTION Indx_y_SD_Y2Mesh_Start(y_SD, y_FAST) RESULT(SD_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(SD_OutputType), INTENT(IN ) :: y_SD !< SD outputs at t - - INTEGER :: SD_Out_Start !< starting index of this mesh in ElastoDyn outputs - - SD_Out_Start = Indx_y_SD_Y1Mesh_Start(y_SD, y_FAST) + y_SD%Y1Mesh%NNodes * 6 ! 3 forces + 3 moments at each node! skip all of the Y1Mesh data and get to the beginning of -END FUNCTION Indx_y_SD_Y2Mesh_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_SD%Y3Mesh mesh in the FAST linearization outputs. -FUNCTION Indx_y_SD_Y3Mesh_Start(y_SD, y_FAST) RESULT(SD_Out_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(SD_OutputType), INTENT(IN ) :: y_SD !< SD outputs at t - - INTEGER :: SD_Out_Start !< starting index of this mesh in ElastoDyn outputs - - SD_Out_Start = Indx_y_SD_Y2Mesh_Start(y_SD, y_FAST) + y_SD%Y2Mesh%NNodes * 6 ! 3 forces + 3 moments at each node! skip all of the Y1Mesh data and get to the beginning of -END FUNCTION Indx_y_SD_Y3Mesh_Start -!---------------------------------------------------------------------------------------------------------------------------------- - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_SD%TPMesh mesh in the FAST linearization inputs. -FUNCTION Indx_u_SD_LMesh_Start(u_SD, y_FAST) RESULT(SD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(SD_InputType), INTENT(IN ) :: u_SD !< SD Inputs at t - - INTEGER :: SD_Start !< starting index of this mesh in SubDyn inputs - - SD_Start = Indx_u_SD_TPMesh_Start(u_SD, y_FAST) + u_SD%TPMesh%NNodes*18 ! 6 fields with 3 components - -END FUNCTION Indx_u_SD_LMesh_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_HD%Morison%Mesh mesh in the FAST linearization inputs. -FUNCTION Indx_u_HD_Morison_Start(u_HD, y_FAST) RESULT(HD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(HydroDyn_InputType), INTENT(IN ) :: u_HD !< HD Inputs at t - - INTEGER :: HD_Start !< starting index of this mesh in HydroDyn inputs - - HD_Start = y_FAST%Lin%Modules(Module_HD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - -END FUNCTION Indx_u_HD_Morison_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_HD%WAMITMesh mesh in the FAST linearization inputs. -FUNCTION Indx_u_HD_WAMIT_Start(u_HD, y_FAST) RESULT(HD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(HydroDyn_InputType), INTENT(IN ) :: u_HD !< HD Inputs at t - - INTEGER :: HD_Start !< starting index of this mesh in HydroDyn inputs - - HD_Start = Indx_u_HD_Morison_Start(u_HD, y_FAST) - if (u_HD%Morison%Mesh%committed) HD_Start = HD_Start + u_HD%Morison%Mesh%NNodes * 18 ! 6 fields (MASKID_TRANSLATIONDISP,MASKID_Orientation,MASKID_TRANSLATIONVel,MASKID_ROTATIONVel,MASKID_TRANSLATIONAcc,MASKID_ROTATIONAcc) with 3 components - -END FUNCTION Indx_u_HD_WAMIT_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_HD%PRPMesh mesh in the FAST linearization inputs. -FUNCTION Indx_u_HD_PRP_Start(u_HD, y_FAST) RESULT(HD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(HydroDyn_InputType), INTENT(IN ) :: u_HD !< HD Inputs at t - - INTEGER :: HD_Start !< starting index of this mesh in HydroDyn inputs - - HD_Start = Indx_u_HD_WAMIT_Start(u_HD, y_FAST) - if (u_HD%WAMITMesh%committed) HD_Start = HD_Start + u_HD%WAMITMesh%NNodes * 18 ! 6 fields (MASKID_TRANSLATIONDISP,MASKID_Orientation,MASKID_TRANSLATIONVel,MASKID_ROTATIONVel,MASKID_TRANSLATIONAcc,MASKID_ROTATIONAcc) with 3 components - -END FUNCTION Indx_u_HD_PRP_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_HD%PRPMesh mesh in the FAST linearization inputs. -function Indx_u_HD_Ext_Start(u_HD, y_FAST) RESULT(HD_Start) - type(FAST_OutputFileType), intent(in ) :: y_FAST !< FAST output file data (for linearization) - type(HydroDyn_InputType), intent(in ) :: u_HD !< HD Inputs at t - - integer :: HD_Start !< starting index of this mesh in HydroDyn inputs - - HD_Start = Indx_u_HD_PRP_Start(u_HD, y_FAST) - if (u_HD%WAMITMesh%committed) HD_Start = HD_Start + u_HD%PRPMesh%NNodes * 18 ! 6 fields (MASKID_TRANSLATIONDISP,MASKID_Orientation,MASKID_TRANSLATIONVel,MASKID_ROTATIONVel,MASKID_TRANSLATIONAcc,MASKID_ROTATIONAcc) with 3 components - -end function Indx_u_HD_Ext_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_HD%Morison%DistribMesh mesh in the FAST linearization outputs. -FUNCTION Indx_y_HD_Morison_Start(y_HD, y_FAST) RESULT(HD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(HydroDyn_OutputType), INTENT(IN ) :: y_HD !< HD Outputs at t - - INTEGER :: HD_Start !< starting index of this mesh in HydroDyn Outputs - - HD_Start = y_FAST%Lin%Modules(Module_HD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) - -END FUNCTION Indx_y_HD_Morison_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_HD%Mesh mesh in the FAST linearization outputs. -FUNCTION Indx_y_HD_WAMIT_Start(y_HD, y_FAST) RESULT(HD_Start) - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(HydroDyn_OutputType), INTENT(IN ) :: y_HD !< HD Outputs at t - - INTEGER :: HD_Start - - !< starting index of this mesh in HydroDyn Outputs - - HD_Start = Indx_y_HD_Morison_Start(y_HD, y_FAST) - if (y_HD%Morison%Mesh%committed) HD_Start = HD_Start + y_HD%Morison%Mesh%NNodes * 6 ! 2 fields (MASKID_FORCE,MASKID_MOMENT) with 3 components - - END FUNCTION Indx_y_HD_WAMIT_Start -!---------------------------------------------------------------------------------------------------------------------------------- - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This subroutine allocates the arrays that store the operating point at each linearization time for later producing VTK -!! files of the mode shapes. -SUBROUTINE AllocateOP(p_FAST, y_FAST, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'AllocateOP' - - - ErrStat = ErrID_None - ErrMsg = "" - - !---------------------------------------------------------------------------------------- - !! copy the operating point of the states and inputs at LinTimes(i) - !---------------------------------------------------------------------------------------- - - - ALLOCATE( y_FAST%op%x_ED(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ElastoDyn operating point data")) return; - ALLOCATE( y_FAST%op%xd_ED(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ElastoDyn operating point data")) return; - ALLOCATE( y_FAST%op%z_ED(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ElastoDyn operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_ED(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ElastoDyn operating point data")) return; - ALLOCATE( y_FAST%op%u_ED(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ElastoDyn operating point data")) return; - - IF ( p_FAST%CompElast == Module_BD ) THEN - ALLOCATE( y_FAST%op%x_BD(p_FAST%nBeams, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("BeamDyn operating point data")) return; - ALLOCATE( y_FAST%op%xd_BD(p_FAST%nBeams, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("BeamDyn operating point data")) return; - ALLOCATE( y_FAST%op%z_BD(p_FAST%nBeams, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("BeamDyn operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_BD(p_FAST%nBeams, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("BeamDyn operating point data")) return; - ALLOCATE( y_FAST%op%u_BD(p_FAST%nBeams, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("BeamDyn operating point data")) return; - END IF - - - - !IF ( p_FAST%CompAero == Module_AD14 ) THEN - !ELSE - IF ( p_FAST%CompAero == Module_AD ) THEN - ALLOCATE( y_FAST%op%x_AD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("AeroDyn operating point data")) return; - ALLOCATE( y_FAST%op%xd_AD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("AeroDyn operating point data")) return; - ALLOCATE( y_FAST%op%z_AD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("AeroDyn operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_AD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("AeroDyn operating point data")) return; - ALLOCATE( y_FAST%op%u_AD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("AeroDyn operating point data")) return; - END IF - - IF ( p_FAST%CompInflow == Module_IfW ) THEN - ALLOCATE( y_FAST%op%x_IfW(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("InflowWind operating point data")) return; - ALLOCATE( y_FAST%op%xd_IfW(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("InflowWind operating point data")) return; - ALLOCATE( y_FAST%op%z_IfW(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("InflowWind operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_IfW(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("InflowWind operating point data")) return; - ALLOCATE( y_FAST%op%u_IfW(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("InflowWind operating point data")) return; - END IF - - if ( p_FAST%CompSeaSt == Module_SeaSt ) then - allocate( y_FAST%op%x_SeaSt(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SeaState operating point data")) return; - allocate( y_FAST%op%xd_SeaSt(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SeaState operating point data")) return; - allocate( y_FAST%op%z_SeaSt(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SeaState operating point data")) return; - allocate( y_FAST%op%OtherSt_SeaSt(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SeaState operating point data")) return; - allocate( y_FAST%op%u_SeaSt(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SeaState operating point data")) return; - endif - - IF ( p_FAST%CompServo == Module_SrvD ) THEN - ALLOCATE( y_FAST%op%x_SrvD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ServoDyn operating point data")) return; - ALLOCATE( y_FAST%op%xd_SrvD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ServoDyn operating point data")) return; - ALLOCATE( y_FAST%op%z_SrvD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ServoDyn operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_SrvD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ServoDyn operating point data")) return; - ALLOCATE( y_FAST%op%u_SrvD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ServoDyn operating point data")) return; - END IF - - - IF ( p_FAST%CompHydro == Module_HD ) THEN - ALLOCATE( y_FAST%op%x_HD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("HydroDyn operating point data")) return; - ALLOCATE( y_FAST%op%xd_HD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("HydroDyn operating point data")) return; - ALLOCATE( y_FAST%op%z_HD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("HydroDyn operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_HD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("HydroDyn operating point data")) return; - ALLOCATE( y_FAST%op%u_HD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("HydroDyn operating point data")) return; - END IF - - - ! SubDyn: copy final predictions to actual states - IF ( p_FAST%CompSub == Module_SD ) THEN - ALLOCATE( y_FAST%op%x_SD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SubDyn operating point data")) return; - ALLOCATE( y_FAST%op%xd_SD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SubDyn operating point data")) return; - ALLOCATE( y_FAST%op%z_SD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SubDyn operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_SD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SubDyn operating point data")) return; - ALLOCATE( y_FAST%op%u_SD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("SubDyn operating point data")) return; - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - ALLOCATE( y_FAST%op%x_ExtPtfm(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ExtPtfm operating point data")) return; - ALLOCATE( y_FAST%op%xd_ExtPtfm(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ExtPtfm operating point data")) return; - ALLOCATE( y_FAST%op%z_ExtPtfm(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ExtPtfm operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_ExtPtfm(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ExtPtfm operating point data")) return; - ALLOCATE( y_FAST%op%u_ExtPtfm(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("ExtPtfm operating point data")) return; - END IF - - - ! MAP/MoorDyn/FEAM: copy states and inputs to OP array - IF (p_FAST%CompMooring == Module_MAP) THEN - ALLOCATE( y_FAST%op%x_MAP(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MAP operating point data")) return; - ALLOCATE( y_FAST%op%xd_MAP(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MAP operating point data")) return; - ALLOCATE( y_FAST%op%z_MAP(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MAP operating point data")) return; - !ALLOCATE( y_FAST%op%OtherSt_MAP(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MAP operating point data")) return; - ALLOCATE( y_FAST%op%u_MAP(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MAP operating point data")) return; - ELSEIF (p_FAST%CompMooring == Module_MD) THEN - ALLOCATE( y_FAST%op%x_MD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MoorDyn operating point data")) return; - ALLOCATE( y_FAST%op%xd_MD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MoorDyn operating point data")) return; - ALLOCATE( y_FAST%op%z_MD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MoorDyn operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_MD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MoorDyn operating point data")) return; - ALLOCATE( y_FAST%op%u_MD(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("MoorDyn operating point data")) return; - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN - ALLOCATE( y_FAST%op%x_FEAM(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("FEAM operating point data")) return; - ALLOCATE( y_FAST%op%xd_FEAM(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("FEAM operating point data")) return; - ALLOCATE( y_FAST%op%z_FEAM(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("FEAM operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_FEAM(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("FEAM operating point data")) return; - ALLOCATE( y_FAST%op%u_FEAM(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("FEAM operating point data")) return; - !ELSEIF (p_FAST%CompMooring == Module_Orca) THEN - END IF - - ! IceFloe/IceDyn: copy states and inputs to OP array - IF ( p_FAST%CompIce == Module_IceF ) THEN - ALLOCATE( y_FAST%op%x_IceF(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceFloe operating point data")) return; - ALLOCATE( y_FAST%op%xd_IceF(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceFloe operating point data")) return; - ALLOCATE( y_FAST%op%z_IceF(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceFloe operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_IceF(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceFloe operating point data")) return; - ALLOCATE( y_FAST%op%u_IceF(p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceFloe operating point data")) return; - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - ALLOCATE( y_FAST%op%x_IceD(p_FAST%numIceLegs, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceDyn operating point data")) return; - ALLOCATE( y_FAST%op%xd_IceD(p_FAST%numIceLegs, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceDyn operating point data")) return; - ALLOCATE( y_FAST%op%z_IceD(p_FAST%numIceLegs, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceDyn operating point data")) return; - ALLOCATE( y_FAST%op%OtherSt_IceD(p_FAST%numIceLegs, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceDyn operating point data")) return; - ALLOCATE( y_FAST%op%u_IceD(p_FAST%numIceLegs, p_FAST%NLinTimes), STAT=ErrStat2 ); if (Failed0("IceDyn operating point data")) return; - END IF - -contains - ! check for failed where /= 0 is fatal - logical function Failed0(txt) - character(*), intent(in) :: txt - if (ErrStat2 /= 0) then - ErrStat2 = ErrID_Fatal - ErrMsg2 = "Could not allocate "//trim(txt) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - endif - Failed0 = ErrStat >= AbortErrLev - end function Failed0 -END SUBROUTINE AllocateOP -!---------------------------------------------------------------------------------------------------------------------------------- -!> This subroutine is the inverse of SetOperatingPoint(). It saves the current operating points so they can be retrieved -!> when visualizing mode shapes. -SUBROUTINE SaveOP(i, p_FAST, y_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg, CtrlCode ) - INTEGER(IntKi) , INTENT(IN ) :: i !< current index into LinTimes - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - INTEGER(IntKi), INTENT(IN ) :: CtrlCode !< mesh copy control code (new, vs update) - - ! local variables - INTEGER(IntKi) :: k ! generic loop counters - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SaveOP' - - - ErrStat = ErrID_None - ErrMsg = "" - - - !---------------------------------------------------------------------------------------- - !! copy the operating point of the states and inputs at LinTimes(i) - !---------------------------------------------------------------------------------------- - - ! ElastoDyn: copy states and inputs to OP array - CALL ED_CopyContState (ED%x( STATE_CURR), y_FAST%op%x_ED( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_CURR), y_FAST%op%xd_ED( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_CURR), y_FAST%op%z_ED( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_CURR), y_FAST%op%OtherSt_ED( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ED_CopyInput (ED%Input(1), y_FAST%op%u_ED( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! BeamDyn: copy states and inputs to OP array - IF ( p_FAST%CompElast == Module_BD ) THEN - DO k=1,p_FAST%nBeams - CALL BD_CopyContState (BD%x( k,STATE_CURR), y_FAST%op%x_BD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_CURR), y_FAST%op%xd_BD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_CURR), y_FAST%op%z_BD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_CURR), y_FAST%op%OtherSt_BD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL BD_CopyInput (BD%Input(1,k), y_FAST%op%u_BD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END DO - END IF - - - - ! AeroDyn: copy states and inputs to OP array - !IF ( p_FAST%CompAero == Module_AD14 ) THEN - !ELSE - IF ( p_FAST%CompAero == Module_AD ) THEN - CALL AD_CopyContState (AD%x( STATE_CURR), y_FAST%op%x_AD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState (AD%xd(STATE_CURR), y_FAST%op%xd_AD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState (AD%z( STATE_CURR), y_FAST%op%z_AD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState (AD%OtherSt(STATE_CURR), y_FAST%op%OtherSt_AD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL AD_CopyInput (AD%Input(1), y_FAST%op%u_AD(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ! InflowWind: copy states and inputs to OP array - IF ( p_FAST%CompInflow == Module_IfW ) THEN - CALL InflowWind_CopyContState (IfW%x( STATE_CURR), y_FAST%op%x_IfW( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (IfW%xd(STATE_CURR), y_FAST%op%xd_IfW( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (IfW%z( STATE_CURR), y_FAST%op%z_IfW( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState( IfW%OtherSt( STATE_CURR), y_FAST%op%OtherSt_IfW( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL InflowWind_CopyInput (IfW%Input(1), y_FAST%op%u_IfW(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ! SeaState: copy states and inputs to OP array - if ( p_FAST%CompSeaSt == Module_SeaSt ) then - call SeaSt_CopyContState (SeaSt%x( STATE_CURR), y_FAST%op%x_SeaSt( i), CtrlCode, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call SeaSt_CopyDiscState (SeaSt%xd(STATE_CURR), y_FAST%op%xd_SeaSt( i), CtrlCode, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call SeaSt_CopyConstrState (SeaSt%z( STATE_CURR), y_FAST%op%z_SeaSt( i), CtrlCode, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call SeaSt_CopyOtherState( SeaSt%OtherSt( STATE_CURR), y_FAST%op%OtherSt_SeaSt( i), CtrlCode, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - call SeaSt_CopyInput (SeaSt%Input(1), y_FAST%op%u_SeaSt(i), CtrlCode, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - endif - - ! ServoDyn: copy states and inputs to OP array - IF ( p_FAST%CompServo == Module_SrvD ) THEN - CALL SrvD_CopyContState (SrvD%x( STATE_CURR), y_FAST%op%x_SrvD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_CURR), y_FAST%op%xd_SrvD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_CURR), y_FAST%op%z_SrvD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState (SrvD%OtherSt( STATE_CURR), y_FAST%op%OtherSt_SrvD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL SrvD_CopyInput (SrvD%Input(1), y_FAST%op%u_SrvD(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! HydroDyn: copy states and inputs to OP array - IF ( p_FAST%CompHydro == Module_HD ) THEN - CALL HydroDyn_CopyContState (HD%x( STATE_CURR), y_FAST%op%x_HD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_CURR), y_FAST%op%xd_HD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_CURR), y_FAST%op%z_HD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState (HD%OtherSt(STATE_CURR), y_FAST%op%OtherSt_HD( i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL HydroDyn_CopyInput (HD%Input(1), y_FAST%op%u_HD(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! SubDyn: copy final predictions to actual states - IF ( p_FAST%CompSub == Module_SD ) THEN - CALL SD_CopyContState (y_FAST%op%x_SD(i), SD%x( STATE_CURR), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (y_FAST%op%xd_SD(i), SD%xd(STATE_CURR), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState( y_FAST%op%z_SD(i), SD%z( STATE_CURR), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState (y_FAST%op%OtherSt_SD(i), SD%OtherSt(STATE_CURR), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL SD_CopyInput (y_FAST%op%u_SD(i), SD%Input(1), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_CURR), y_FAST%op%x_ExtPtfm(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_CURR), y_FAST%op%xd_ExtPtfm(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_CURR), y_FAST%op%z_ExtPtfm(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState (ExtPtfm%OtherSt(STATE_CURR), y_FAST%op%OtherSt_ExtPtfm(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ExtPtfm_CopyInput (ExtPtfm%Input(1), y_FAST%op%u_ExtPtfm(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! MAP/MoorDyn/FEAM: copy states and inputs to OP array - IF (p_FAST%CompMooring == Module_MAP) THEN - CALL MAP_CopyContState (MAPp%x( STATE_CURR), y_FAST%op%x_MAP(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_CURR), y_FAST%op%xd_MAP(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_CURR), y_FAST%op%z_MAP(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !CALL MAP_CopyOtherState (MAPp%OtherSt(STATE_CURR), y_FAST%op%OtherSt_MAP(i), CtrlCode, Errstat2, ErrMsg2) - ! CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL MAP_CopyInput (MAPp%Input(1), y_FAST%op%u_MAP(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompMooring == Module_MD) THEN - CALL MD_CopyContState (MD%x( STATE_CURR), y_FAST%op%x_MD(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_CURR), y_FAST%op%xd_MD(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_CURR), y_FAST%op%z_MD(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState (MD%OtherSt(STATE_CURR), y_FAST%op%OtherSt_MD(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL MD_CopyInput (MD%Input(1), y_FAST%op%u_MD(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN - CALL FEAM_CopyContState (FEAM%x( STATE_CURR), y_FAST%op%x_FEAM(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_CURR), y_FAST%op%xd_FEAM(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_CURR), y_FAST%op%z_FEAM(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState (FEAM%OtherSt( STATE_CURR), y_FAST%op%OtherSt_FEAM(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL FEAM_CopyInput (FEAM%Input(1), y_FAST%op%u_FEAM(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !ELSEIF (p_FAST%CompMooring == Module_Orca) THEN - END IF - - ! IceFloe/IceDyn: copy states and inputs to OP array - IF ( p_FAST%CompIce == Module_IceF ) THEN - CALL IceFloe_CopyContState (IceF%x( STATE_CURR), y_FAST%op%x_IceF(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_CURR), y_FAST%op%xd_IceF(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_CURR), y_FAST%op%z_IceF(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState (IceF%OtherSt(STATE_CURR), y_FAST%op%OtherSt_IceF(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL IceFloe_CopyInput (IceF%Input(1), y_FAST%op%u_IceF(i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - DO k=1,p_FAST%numIceLegs - CALL IceD_CopyContState (IceD%x( k,STATE_CURR), y_FAST%op%x_IceD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(k,STATE_CURR), y_FAST%op%xd_IceD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( k,STATE_CURR), y_FAST%op%z_IceD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState (IceD%OtherSt( k,STATE_CURR), y_FAST%op%OtherSt_IceD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL IceD_CopyInput (IceD%Input(1,k), y_FAST%op%u_IceD(k, i), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - END IF - - -END SUBROUTINE SaveOP -!---------------------------------------------------------------------------------------------------------------------------------- -!> This subroutine takes arrays representing the eigenvector of the states and uses it to modify the operating points for -!! continuous states. It is highly tied to the module organizaton. -SUBROUTINE PerturbOP(t, iLinTime, iMode, p_FAST, y_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt,SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t - INTEGER(IntKi), INTENT(IN ) :: iLinTime !< index into LinTimes dimension of arrays (azimuth) - INTEGER(IntKi), INTENT(IN ) :: iMode !< index into Mode dimension of arrays - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: k ! generic loop counters - INTEGER(IntKi) :: i, iStart ! generic loop counters - INTEGER(IntKi) :: iBody ! WAMIT body loop counter - INTEGER(IntKi) :: j ! generic loop counters - INTEGER(IntKi) :: n ! generic loop counters - INTEGER(IntKi) :: indx ! generic loop counters - INTEGER(IntKi) :: indx_last ! generic loop counters - INTEGER(IntKi) :: i_x ! index into packed array - INTEGER(IntKi) :: nStates ! number of second-order states - INTEGER(IntKi) :: ThisModule ! identifier of current module - - CHARACTER(*), PARAMETER :: RoutineName = 'PerturbOP' - - - ErrStat = ErrID_None - ErrMsg = "" - - - i_x = 1 - - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_mag)) then - do j=1,size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x) ! use this for the loop because ED may have a larger op_x_eig_mag array than op_x - - ! this is a hack because not all modules pack the continuous states in the same way: - if (ThisModule == Module_ED) then - if (j<= ED%p%DOFs%NActvDOF) then - indx = ED%p%DOFs%PS(j) - else - indx = ED%p%DOFs%PS(j-ED%p%DOFs%NActvDOF) + ED%p%NDOF - end if - else - indx = j - end if - y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_mag( indx) = p_FAST%VTK_modes%x_eig_magnitude(i_x, iLinTime, iMode) ! this is going to hold the magnitude of the eigenvector - y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_phase(indx) = p_FAST%VTK_modes%x_eig_phase( i_x, iLinTime, iMode) ! this is going to hold the phase of the eigenvector - i_x = i_x + 1; - end do - end if - - end do - end do - - - - ! ElastoDyn: - ThisModule = Module_ED - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag)) then - nStates = size(y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag)/2 - - call GetStateAry(p_FAST, iMode, t, ED%x( STATE_CURR)%QT, y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag( :nStates), y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase( :nStates)) - call GetStateAry(p_FAST, iMode, t, ED%x( STATE_CURR)%QDT, y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag(1+nStates: ), y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase(1+nStates: )) - end if - - ! BeamDyn: - IF ( p_FAST%CompElast == Module_BD ) THEN - ThisModule = Module_BD - DO k=1,p_FAST%nBeams - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_mag)) then - nStates = size(y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_mag)/2 - - indx = 1 - do i=2,BD%p(k)%node_total - indx_last = indx + BD%p(k)%dof_node - 1 - call GetStateAry(p_FAST, iMode, t, BD%x(k, STATE_CURR)%q( :,i), y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_mag( indx:indx_last ), y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_phase( indx:indx_last )) - call GetStateAry(p_FAST, iMode, t, BD%x(k, STATE_CURR)%dqdt(:,i), y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_mag(nStates+indx:indx_last+nStates), y_FAST%Lin%Modules(ThisModule)%Instance(k)%op_x_eig_phase(nStates+indx:indx_last+nStates)) - indx = indx_last+1 - end do - - end if - - END DO - END IF - - - !!! ! AeroDyn: copy final predictions to actual states; copy current outputs to next - IF ( p_FAST%CompAero == Module_AD ) THEN - ThisModule = Module_AD - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag)) then - - indx = 1 - ! set linearization operating points: - if (AD%p%rotors(1)%BEMT%DBEMT%lin_nx>0) then - do j=1,size(AD%x(STATE_CURR)%rotors(1)%BEMT%DBEMT%element,2) - do i=1,size(AD%x(STATE_CURR)%rotors(1)%BEMT%DBEMT%element,1) - indx_last = indx + size(AD%x(STATE_CURR)%rotors(1)%BEMT%DBEMT%element(i,j)%vind) - 1 - call GetStateAry(p_FAST, iMode, t, AD%x(STATE_CURR)%rotors(1)%BEMT%DBEMT%element(i,j)%vind, y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag( indx : indx_last), & - y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase(indx : indx_last) ) - indx = indx_last + 1 - end do - end do - - do j=1,size(AD%x(STATE_CURR)%rotors(1)%BEMT%DBEMT%element,2) - do i=1,size(AD%x(STATE_CURR)%rotors(1)%BEMT%DBEMT%element,1) - indx_last = indx + size(AD%x(STATE_CURR)%rotors(1)%BEMT%DBEMT%element(i,j)%vind_1) - 1 - call GetStateAry(p_FAST, iMode, t, AD%x(STATE_CURR)%rotors(1)%BEMT%DBEMT%element(i,j)%vind_1, y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag( indx : indx_last), & - y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase(indx : indx_last) ) - indx = indx_last + 1 - end do - end do - - end if - - if (AD%p%rotors(1)%BEMT%UA%lin_nx>0) then - do n=1,AD%p%rotors(1)%BEMT%UA%lin_nx - i = AD%p%rotors(1)%BEMT%UA%lin_xIndx(n,1) - j = AD%p%rotors(1)%BEMT%UA%lin_xIndx(n,2) - k = AD%p%rotors(1)%BEMT%UA%lin_xIndx(n,3) - - indx_last = indx - call GetStateAry(p_FAST, iMode, t, AD%x(STATE_CURR)%rotors(1)%BEMT%UA%element(i,j)%x(k:k), y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag( indx : indx_last), & - y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase(indx : indx_last) ) - indx = indx_last + 1 - end do - - end if - -! if (AD%p%rotors(1)%BEMT%lin_nx>0) then -! indx_last = indx + size(AD%x(STATE_CURR)%rotors(1)%BEMT%v_w) - 1 -! call GetStateAry(p_FAST, iMode, t, AD%x(STATE_CURR)%rotors(1)%BEMT%v_w, y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag( indx : indx_last), & -! y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase(indx : indx_last) ) -! indx = indx_last + 1 -! end if -! - end if - END IF - !!! - !!!! InflowWind: copy op to actual states and inputs - !!!IF ( p_FAST%CompInflow == Module_IfW ) THEN - !!!END IF - !!! - !!! - !!!! SeaState: copy op to actual states and inputs - !!!IF ( p_FAST%CompSeaSt == Module_SeaSt ) THEN - !!!END IF - !!! - !!! - !!!! ServoDyn: copy op to actual states and inputs - !!!IF ( p_FAST%CompServo == Module_SrvD ) THEN - !!!END IF - - ! HydroDyn: copy op to actual states and inputs - IF ( p_FAST%CompHydro == Module_HD ) THEN - ThisModule = Module_HD - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag)) then - ! WAMIT parameter and continuous states are now an arrays of length NBody - ! All Excitation states are stored first and then Radiation states. - ! We will try to loop over each of the NBody(s) and add each body's states to the overall state array - iStart = 1 - do iBody = 1, HD%p%NBody - nStates = HD%p%WAMIT(iBody)%SS_Exctn%numStates - if (nStates > 0) then - call GetStateAry(p_FAST, iMode, t, HD%x( STATE_CURR)%WAMIT(iBody)%SS_Exctn%x, y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag(iStart:iStart+nStates-1), y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase(iStart:iStart+nStates-1)) - iStart = iStart + nStates - end if - end do - do iBody = 1, HD%p%NBody - nStates = HD%p%WAMIT(iBody)%SS_Rdtn%numStates - if (nStates > 0) then - call GetStateAry(p_FAST, iMode, t, HD%x( STATE_CURR)%WAMIT(iBody)%SS_Rdtn%x, y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag(iStart:iStart+nStates-1), y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase(iStart:iStart+nStates-1)) - iStart = iStart + nStates - end if - end do - end if - END IF - - - ! SubDyn: copy final predictions to actual states - IF ( p_FAST%CompSub == Module_SD ) THEN - ThisModule = Module_SD - if (allocated(y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag)) then - nStates = size(y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag)/2 - call GetStateAry(p_FAST, iMode, t, SD%x( STATE_CURR)%qm, y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag( :nStates), y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase( :nStates)) - call GetStateAry(p_FAST, iMode, t, SD%x( STATE_CURR)%qmdot, y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_mag(1+nStates: ), y_FAST%Lin%Modules(ThisModule)%Instance(1)%op_x_eig_phase(1+nStates: )) - end if - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - END IF - -END SUBROUTINE PerturbOP -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE SetOperatingPoint(i, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat, ErrMsg ) - - INTEGER(IntKi), INTENT(IN ) :: i !< Index into LinTimes (to determine which operating point to copy) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: k ! generic loop counters - - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SetOperatingPoint' - - - ErrStat = ErrID_None - ErrMsg = "" - - - !---------------------------------------------------------------------------------------- - !! copy the operating point of the states and inputs at LinTimes(i) - !---------------------------------------------------------------------------------------- - ! ElastoDyn: copy op to actual states and inputs - CALL ED_CopyContState (y_FAST%op%x_ED( i), ED%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (y_FAST%op%xd_ED( i), ED%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (y_FAST%op%z_ED( i), ED%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (y_FAST%op%OtherSt_ED( i), ED%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ED_CopyInput (y_FAST%op%u_ED( i), ED%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! BeamDyn: copy op to actual states and inputs - IF ( p_FAST%CompElast == Module_BD ) THEN - DO k=1,p_FAST%nBeams - CALL BD_CopyContState (y_FAST%op%x_BD(k, i), BD%x( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (y_FAST%op%xd_BD(k, i), BD%xd(k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (y_FAST%op%z_BD(k, i), BD%z( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (y_FAST%op%OtherSt_BD(k, i), BD%OtherSt( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL BD_CopyInput (y_FAST%op%u_BD(k, i), BD%Input(1,k), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END DO - END IF - - ! AeroDyn: copy final predictions to actual states; copy current outputs to next - !IF ( p_FAST%CompAero == Module_AD14 ) THEN - !ELSE - IF ( p_FAST%CompAero == Module_AD ) THEN - CALL AD_CopyContState (y_FAST%op%x_AD( i), AD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState (y_FAST%op%xd_AD( i), AD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState (y_FAST%op%z_AD( i), AD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState (y_FAST%op%OtherSt_AD( i), AD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL AD_CopyInput (y_FAST%op%u_AD(i), AD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ! InflowWind: copy op to actual states and inputs - IF ( p_FAST%CompInflow == Module_IfW ) THEN - CALL InflowWind_CopyContState (y_FAST%op%x_IfW( i), IfW%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (y_FAST%op%xd_IfW( i), IfW%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (y_FAST%op%z_IfW( i), IfW%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState (y_FAST%op%OtherSt_IfW( i), IfW%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL InflowWind_CopyInput (y_FAST%op%u_IfW(i), IfW%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ! SeaSt: copy op to actual states and inputs - if ( p_FAST%CompSeaSt == Module_SeaSt ) then - call SeaSt_CopyContState (y_FAST%op%x_SeaSt( i), SeaSt%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call SeaSt_CopyDiscState (y_FAST%op%xd_SeaSt( i), SeaSt%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call SeaSt_CopyConstrState (y_FAST%op%z_SeaSt( i), SeaSt%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - call SeaSt_CopyOtherState (y_FAST%op%OtherSt_SeaSt( i), SeaSt%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - call SeaSt_CopyInput (y_FAST%op%u_SeaSt(i), SeaSt%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - endif - - ! ServoDyn: copy op to actual states and inputs - IF ( p_FAST%CompServo == Module_SrvD ) THEN - CALL SrvD_CopyContState (y_FAST%op%x_SrvD( i), SrvD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (y_FAST%op%xd_SrvD( i), SrvD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (y_FAST%op%z_SrvD( i), SrvD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState (y_FAST%op%OtherSt_SrvD( i), SrvD%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL SrvD_CopyInput (y_FAST%op%u_SrvD(i), SrvD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! HydroDyn: copy op to actual states and inputs - IF ( p_FAST%CompHydro == Module_HD ) THEN - CALL HydroDyn_CopyContState (y_FAST%op%x_HD( i), HD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (y_FAST%op%xd_HD( i), HD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (y_FAST%op%z_HD( i), HD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState (y_FAST%op%OtherSt_HD( i), HD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL HydroDyn_CopyInput (y_FAST%op%u_HD(i), HD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! SubDyn: copy final predictions to actual states - IF ( p_FAST%CompSub == Module_SD ) THEN - CALL SD_CopyContState (y_FAST%op%x_SD(i), SD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (y_FAST%op%xd_SD(i), SD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState( y_FAST%op%z_SD(i), SD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState (y_FAST%op%OtherSt_SD(i), SD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL SD_CopyInput (y_FAST%op%u_SD(i), SD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - CALL ExtPtfm_CopyContState (y_FAST%op%x_ExtPtfm(i), ExtPtfm%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (y_FAST%op%xd_ExtPtfm(i), ExtPtfm%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (y_FAST%op%z_ExtPtfm(i), ExtPtfm%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState (y_FAST%op%OtherSt_ExtPtfm(i), ExtPtfm%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ExtPtfm_CopyInput (y_FAST%op%u_ExtPtfm(i), ExtPtfm%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! MAP/MoorDyn/FEAM: copy op to actual states and inputs - IF (p_FAST%CompMooring == Module_MAP) THEN - CALL MAP_CopyContState (y_FAST%op%x_MAP(i), MAPp%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (y_FAST%op%xd_MAP(i), MAPp%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (y_FAST%op%z_MAP(i), MAPp%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !CALL MAP_CopyOtherState (y_FAST%op%OtherSt_MAP(i), MAPp%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - ! CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL MAP_CopyInput (y_FAST%op%u_MAP(i), MAPp%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF (p_FAST%CompMooring == Module_MD) THEN - CALL MD_CopyContState (y_FAST%op%x_MD(i), MD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (y_FAST%op%xd_MD(i), MD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (y_FAST%op%z_MD(i), MD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState (y_FAST%op%OtherSt_MD(i), MD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL MD_CopyInput (y_FAST%op%u_MD(i), MD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN - CALL FEAM_CopyContState (y_FAST%op%x_FEAM(i), FEAM%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (y_FAST%op%xd_FEAM(i), FEAM%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (y_FAST%op%z_FEAM(i), FEAM%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState (y_FAST%op%OtherSt_FEAM(i), FEAM%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL FEAM_CopyInput (y_FAST%op%u_FEAM(i), FEAM%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !ELSEIF (p_FAST%CompMooring == Module_Orca) THEN - END IF - - ! IceFloe/IceDyn: copy op to actual states and inputs - IF ( p_FAST%CompIce == Module_IceF ) THEN - CALL IceFloe_CopyContState (y_FAST%op%x_IceF(i), IceF%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (y_FAST%op%xd_IceF(i), IceF%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (y_FAST%op%z_IceF(i), IceF%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState (y_FAST%op%OtherSt_IceF(i), IceF%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL IceFloe_CopyInput (y_FAST%op%u_IceF(i), IceF%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - DO k=1,p_FAST%numIceLegs - CALL IceD_CopyContState (y_FAST%op%x_IceD(k, i), IceD%x( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (y_FAST%op%xd_IceD(k, i), IceD%xd(k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (y_FAST%op%z_IceD(k, i), IceD%z( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState (y_FAST%op%OtherSt_IceD(k, i), IceD%OtherSt( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL IceD_CopyInput (y_FAST%op%u_IceD(k, i), IceD%Input(1,k), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - END IF - -END SUBROUTINE SetOperatingPoint -!---------------------------------------------------------------------------------------------------------------------------------- -subroutine GetStateAry(p_FAST, iMode, t, x, x_eig_magnitude, x_eig_phase) - INTEGER(IntKi), INTENT(IN ) :: iMode !< index into Mode dimension of arrays - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - REAL(DbKi) , INTENT(IN ) :: t !< time - REAL(R8Ki), INTENT(INOUT) :: x(:) !< in: state at its operating point; out: added perturbation - REAL(R8Ki), INTENT(IN) :: x_eig_magnitude(:) !< magnitude of the eigenvector - REAL(R8Ki), INTENT(IN) :: x_eig_phase(:) !< phase of the eigenvector - - ! note that this assumes p_FAST%VTK_modes%VTKLinPhase is zero for VTKLinTim=2 - x = x + x_eig_magnitude * p_FAST%VTK_modes%VTKLinScale * cos( TwoPi_D * p_FAST%VTK_modes%DampedFreq_Hz(iMode)*t + x_eig_phase + p_FAST%VTK_modes%VTKLinPhase ) -end subroutine GetStateAry - - - -!---------------------------------------------------------------------------------------------------------------------------------- -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine performs the algorithm for computing a periodic steady-state solution. -SUBROUTINE FAST_CalcSteady( n_t_global, t_global, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg ) - - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< integer time step - REAL(DbKi), INTENT(IN ) :: t_global ! current simulation time - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - REAL(DbKi) :: DeltaAzim - REAL(DbKi) :: psi !< psi (rotor azimuth) at which the outputs are defined - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - LOGICAL :: NextAzimuth - - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_CalcSteady' - - - ErrStat = ErrID_None - ErrMsg = "" - - - ! get azimuth angle - - psi = ED%y%LSSTipPxa - call Zero2TwoPi( psi ) - - if (n_t_global == 0) then - ! initialize a few things on the first call: - call FAST_InitSteadyOutputs( psi, p_FAST, m_FAST, ED, BD, SrvD, AD, IfW, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - else - DeltaAzim = psi - m_FAST%Lin%Psi(1) - call Zero2TwoPi(DeltaAzim) - - if (DeltaAzim > p_FAST%AzimDelta) then - call SetErrStat(ErrID_Fatal, "The rotor is spinning too fast. The time step or NLinTimes is too large when CalcSteady=true.", ErrStat, ErrMsg, RoutineName) - return - end if - - ! save the outputs and azimuth angle for possible interpolation later - call FAST_SaveOutputs( psi, p_FAST, m_FAST, ED, BD, SrvD, AD, IfW, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end if - if (ErrStat >= AbortErrLev) return - - - - if ( m_FAST%Lin%AzimTarget(m_FAST%Lin%AzimIndx-1) <= m_FAST%Lin%AzimTarget(m_FAST%Lin%AzimIndx) ) then ! the equal sign takes care of the zero-rpm case - NextAzimuth = psi >= m_FAST%Lin%AzimTarget(m_FAST%Lin%AzimIndx) - else - ! this is the 2pi boundary, so we are either larger than the last target azimuth or less than the next one - NextAzimuth = psi >= m_FAST%Lin%AzimTarget(m_FAST%Lin%AzimIndx) .and. psi < m_FAST%Lin%AzimTarget(m_FAST%Lin%AzimIndx-1) - end if - - ! Forcing linearization if it's the last step - if (t_global >= p_FAST%TMax - 0.5_DbKi*p_FAST%DT) then - call WrScr('') - call WrScr('[WARNING] Steady state not found before end of simulation. Forcing linearization.') - m_FAST%Lin%ForceLin = .True. - m_FAST%Lin%AzimIndx = 1 - NextAzimuth = .True. - endif - - if (NextAzimuth) then - - ! interpolate to find y at the target azimuth - call FAST_DiffInterpOutputs( m_FAST%Lin%AzimTarget(m_FAST%Lin%AzimIndx), p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg ) - ! If linearization is forced - if (m_FAST%Lin%ForceLin) then - m_FAST%Lin%IsConverged = .True. - endif - - if (m_FAST%Lin%IsConverged .or. m_FAST%Lin%n_rot == 0) then ! save this operating point for linearization later - m_FAST%Lin%LinTimes(m_FAST%Lin%AzimIndx) = t_global - call SaveOP(m_FAST%Lin%AzimIndx, p_FAST, y_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg, m_FAST%Lin%CopyOP_CtrlCode ) - end if - - ! increment the counter to check the next azimuth: - m_FAST%Lin%AzimIndx = m_FAST%Lin%AzimIndx + 1 - - ! check if we've completed one rotor revolution - if (m_FAST%Lin%AzimIndx > p_FAST%NLinTimes) then - m_FAST%Lin%n_rot = m_FAST%Lin%n_rot + 1 - - m_FAST%Lin%FoundSteady = m_FAST%Lin%IsConverged - - if (.not. m_FAST%Lin%FoundSteady) then - ! compute the reference values for this rotor revolution - call ComputeOutputRanges(p_FAST, y_FAST, m_FAST, SrvD%y) - m_FAST%Lin%IsConverged = .true. ! check errors next rotor revolution - m_FAST%Lin%AzimIndx = 1 - m_FAST%Lin%CopyOP_CtrlCode = MESH_UPDATECOPY - end if - ! Forcing linearization if time is close to tmax (with sufficient margin) - if (.not.m_FAST%Lin%FoundSteady) then - if (ED%p%RotSpeed>0) then - ! If simulation is at least 10 revolutions, and error in rotor speed less than 0.1% - if ((p_FAST%TMax>10*(TwoPi_D)/ED%p%RotSpeed) .and. ( t_global >= p_FAST%TMax - 2._DbKi*(TwoPi_D)/ED%p%RotSpeed)) then - if (abs(ED%y%RotSpeed-ED%p%RotSpeed)/ED%p%RotSpeed<0.001) then - call WrScr('') - call WrScr('[WARNING] Steady state not found before end of simulation. Forcing linearization.') - m_FAST%Lin%ForceLin = .True. - endif - endif - else - if (t_global >= p_FAST%TMax - 1.5_DbKi*p_FAST%DT) then - call WrScr('') - call WrScr('[WARNING] Steady state not found before end of simulation. Forcing linearization.') - m_FAST%Lin%ForceLin = .True. - endif - endif - endif - end if - - end if - if (m_FAST%Lin%ForceLin) then - m_FAST%Lin%IsConverged=.true. - m_FAST%Lin%FoundSteady=.true. - endif - - -END SUBROUTINE FAST_CalcSteady -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes variables for calculating periodic steady-state solution. -SUBROUTINE FAST_InitSteadyOutputs( psi, p_FAST, m_FAST, ED, BD, SrvD, AD, IfW, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: psi !< psi (rotor azimuth) at which the outputs are defined - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: j, k ! loop counters - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_InitSteadyOutputs' - - - ErrStat = ErrID_None - ErrMsg = "" - - do j=1,p_FAST%NLinTimes - m_FAST%Lin%AzimTarget(j) = (j-1) * p_FAST%AzimDelta + psi - call Zero2TwoPi( m_FAST%Lin%AzimTarget(j) ) - end do - ! this is circular, so I am going to add points at the beginning and end to avoid - ! more IF statements later - m_FAST%Lin%AzimTarget(0) = m_FAST%Lin%AzimTarget(p_FAST%NLinTimes) - m_FAST%Lin%AzimTarget(p_FAST%NLinTimes+1) = m_FAST%Lin%AzimTarget(1) - - - ! Azimuth angles that correspond to Output arrays for interpolation: - !m_FAST%Lin%Psi = psi ! initialize entire array (note that we won't be able to interpolate with a constant array - DO j = 1, p_FAST%LinInterpOrder + 1 - m_FAST%Lin%Psi(j) = psi - (j - 1) * D2R_D ! arbitrarily say azimuth is one degree different - END DO - - - ! ElastoDyn - allocate( ED%Output( p_FAST%LinInterpOrder+1 ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating ED%Output.", ErrStat, ErrMsg, RoutineName ) - else - do j = 1, p_FAST%LinInterpOrder + 1 - call ED_CopyOutput(ED%y, ED%Output(j), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - - call ED_CopyOutput(ED%y, ED%y_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end if - - ! BeamDyn - IF (p_FAST%CompElast == Module_BD) THEN - - allocate( BD%Output( p_FAST%LinInterpOrder+1, p_FAST%nBeams ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating BD%Output.", ErrStat, ErrMsg, RoutineName ) - else - do k=1,p_FAST%nBeams - do j = 1, p_FAST%LinInterpOrder + 1 - call BD_CopyOutput(BD%y(k), BD%Output(j,k), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - end do - - allocate( BD%y_interp( p_FAST%nBeams ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating BD%Output.", ErrStat, ErrMsg, RoutineName ) - else - do k=1,p_FAST%nBeams - call BD_CopyOutput(BD%y(k), BD%y_interp(k), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - end if - - end if - - END IF ! BeamDyn - - ! AeroDyn - IF ( p_FAST%CompAero == Module_AD ) THEN - - allocate( AD%Output( p_FAST%LinInterpOrder+1 ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating AD%Output.", ErrStat, ErrMsg, RoutineName ) - else - do j = 1, p_FAST%LinInterpOrder + 1 - call AD_CopyOutput(AD%y, AD%Output(j), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - - call AD_CopyOutput(AD%y, AD%y_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end if - - END IF ! CompAero - - - ! InflowWind - IF ( p_FAST%CompInflow == Module_IfW ) THEN - - allocate( IfW%Output( p_FAST%LinInterpOrder+1 ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating IfW%Output.", ErrStat, ErrMsg, RoutineName ) - else - do j = 1, p_FAST%LinInterpOrder + 1 - call InflowWind_CopyOutput(IfW%y, IfW%Output(j), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - - call InflowWind_CopyOutput(IfW%y, IfW%y_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end if - - END IF ! CompInflow - - - ! SeaSt - if ( p_FAST%CompSeaSt == Module_SeaSt ) then - allocate( SeaSt%Output( p_FAST%LinInterpOrder+1 ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating SeaSt%Output.", ErrStat, ErrMsg, RoutineName ) - else - do j = 1, p_FAST%LinInterpOrder + 1 - call SeaSt_CopyOutput(SeaSt%y, SeaSt%Output(j), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - - call SeaSt_CopyOutput(SeaSt%y, SeaSt%y_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end if - endif ! CompSeaSt - - - ! ServoDyn - IF ( p_FAST%CompServo == Module_SrvD ) THEN - - allocate( SrvD%Output( p_FAST%LinInterpOrder+1 ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating SrvD%Output.", ErrStat, ErrMsg, RoutineName ) - else - do j = 1, p_FAST%LinInterpOrder + 1 - call SrvD_CopyOutput(SrvD%y, SrvD%Output(j), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - - call SrvD_CopyOutput(SrvD%y, SrvD%y_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end if - - END IF ! ServoDyn - - ! HydroDyn - IF ( p_FAST%CompHydro == Module_HD ) THEN - - allocate( HD%Output( p_FAST%LinInterpOrder+1 ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating HD%Output.", ErrStat, ErrMsg, RoutineName ) - else - do j = 1, p_FAST%LinInterpOrder + 1 - call HydroDyn_CopyOutput(HD%y, HD%Output(j), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - - call HydroDyn_CopyOutput(HD%y, HD%y_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end if - - END IF ! HydroDyn - - !! SubDyn/ExtPtfm_MCKF - IF ( p_FAST%CompSub == Module_SD ) THEN - allocate( SD%Output( p_FAST%LinInterpOrder+1 ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating SD%Output.", ErrStat, ErrMsg, RoutineName ) - else - do j = 1, p_FAST%LinInterpOrder + 1 - call SD_CopyOutput(SD%y, SD%Output(j), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - - call SD_CopyOutput(SD%y, SD%y_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end if - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - END IF ! SubDyn/ExtPtfm_MCKF - - - ! Mooring (MAP , FEAM , MoorDyn) - ! MAP - IF ( p_FAST%CompMooring == Module_MAP ) THEN - - allocate( MAPp%Output( p_FAST%LinInterpOrder+1 ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating MAPp%Output.", ErrStat, ErrMsg, RoutineName ) - else - do j = 1, p_FAST%LinInterpOrder + 1 - call MAP_CopyOutput(MAPp%y, MAPp%Output(j), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - - call MAP_CopyOutput(MAPp%y, MAPp%y_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end if - - ! MoorDyn - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - - allocate( MD%Output( p_FAST%LinInterpOrder+1 ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, "Error allocating MD%Output.", ErrStat, ErrMsg, RoutineName ) - else - do j = 1, p_FAST%LinInterpOrder + 1 - call MD_CopyOutput(MD%y, MD%Output(j), MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end do - - call MD_CopyOutput(MD%y, MD%y_interp, MESH_NEWCOPY, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - end if - - !! FEAM - !ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - !! OrcaFlex - !ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - - END IF ! MAP/FEAM/MoorDyn/OrcaFlex - - !! Ice (IceFloe or IceDyn) - !! IceFloe - !IF ( p_FAST%CompIce == Module_IceF ) THEN - ! - !! IceDyn - !ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - ! - !END IF ! IceFloe/IceDyn -END SUBROUTINE FAST_InitSteadyOutputs - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine saves outputs for future interpolation at a desired azimuth. -SUBROUTINE FAST_SaveOutputs( psi, p_FAST, m_FAST, ED, BD, SrvD, AD, IfW, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: psi !< psi (rotor azimuth) at which the outputs are defined - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: j, k ! loop counters - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_SaveOutputs' - - - ErrStat = ErrID_None - ErrMsg = "" - - DO j = p_FAST%LinInterpOrder, 1, -1 - m_FAST%Lin%Psi(j+1) = m_FAST%Lin%Psi(j) - END DO - - if (psi < m_FAST%Lin%Psi(1)) then - ! if we go around a 2pi boundary, we will subtract 2pi from the saved values so that interpolation works as expected - m_FAST%Lin%Psi = m_FAST%Lin%Psi - TwoPi_D - end if - m_FAST%Lin%Psi(1) = psi - - ! ElastoDyn - DO j = p_FAST%LinInterpOrder, 1, -1 - CALL ED_CopyOutput(ED%Output(j), ED%Output(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - END DO - - CALL ED_CopyOutput (ED%y, ED%Output(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! BeamDyn - IF (p_FAST%CompElast == Module_BD) THEN - - DO k = 1,p_FAST%nBeams - - DO j = p_FAST%LinInterpOrder, 1, -1 - CALL BD_CopyOutput (BD%Output(j,k), BD%Output(j+1,k), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - END DO - - CALL BD_CopyOutput (BD%y(k), BD%Output(1,k), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - END DO ! k=p_FAST%nBeams - - END IF ! BeamDyn - - - ! AeroDyn - IF ( p_FAST%CompAero == Module_AD ) THEN - - DO j = p_FAST%LinInterpOrder, 1, -1 - CALL AD_CopyOutput (AD%Output(j), AD%Output(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - END DO - - CALL AD_CopyOutput (AD%y, AD%Output(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - END IF ! CompAero - - - ! InflowWind - IF ( p_FAST%CompInflow == Module_IfW ) THEN - - DO j = p_FAST%LinInterpOrder, 1, -1 - CALL InflowWind_CopyOutput (IfW%Output(j), IfW%Output(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - END DO - - CALL InflowWind_CopyOutput (IfW%y, IfW%Output(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - END IF ! CompInflow - - - ! SeaState - if ( p_FAST%CompSeaSt == Module_SeaSt ) then - do j = p_FAST%LinInterpOrder, 1, -1 - call SeaSt_CopyOutput (SeaSt%Output(j), SeaSt%Output(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - enddo - - call SeaSt_CopyOutput (SeaSt%y, SeaSt%Output(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - endif ! CompSeaSt - - - ! ServoDyn - IF ( p_FAST%CompServo == Module_SrvD ) THEN - - DO j = p_FAST%LinInterpOrder, 1, -1 - CALL SrvD_CopyOutput (SrvD%Output(j), SrvD%Output(j+1), MESH_UPDATECOPY, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - END DO - - CALL SrvD_CopyOutput (SrvD%y, SrvD%Output(1), MESH_UPDATECOPY, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - END IF ! ServoDyn - - ! HydroDyn - IF ( p_FAST%CompHydro == Module_HD ) THEN - - DO j = p_FAST%LinInterpOrder, 1, -1 - - CALL HydroDyn_CopyOutput (HD%Output(j), HD%Output(j+1), MESH_UPDATECOPY, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - END DO - - CALL HydroDyn_CopyOutput (HD%y, HD%Output(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - END IF ! HydroDyn - - !! SubDyn/ExtPtfm_MCKF - IF ( p_FAST%CompSub == Module_SD ) THEN - DO j = p_FAST%LinInterpOrder, 1, -1 - CALL SD_CopyOutput (SD%Output(j), SD%Output(j+1), MESH_UPDATECOPY, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - END DO - - CALL SD_CopyOutput (SD%y, SD%Output(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - END IF ! SubDyn/ExtPtfm_MCKF - - - ! Mooring (MAP , FEAM , MoorDyn) - ! MAP - IF ( p_FAST%CompMooring == Module_MAP ) THEN - - DO j = p_FAST%LinInterpOrder, 1, -1 - CALL MAP_CopyOutput (MAPp%Output(j), MAPp%Output(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - END DO - - CALL MAP_CopyOutput (MAPp%y, MAPp%Output(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! MoorDyn - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - - DO j = p_FAST%LinInterpOrder, 1, -1 - CALL MD_CopyOutput (MD%Output(j), MD%Output(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - END DO - - CALL MD_CopyOutput (MD%y, MD%Output(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - !! FEAM - !ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - !! OrcaFlex - !ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - - END IF ! MAP/FEAM/MoorDyn/OrcaFlex - - - - !! Ice (IceFloe or IceDyn) - !! IceFloe - !IF ( p_FAST%CompIce == Module_IceF ) THEN - ! - !! IceDyn - !ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - ! - !END IF ! IceFloe/IceDyn - - -END SUBROUTINE FAST_SaveOutputs -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine interpolates the outputs at the target azimuths, computes the compared to the previous rotation, and stores -!! them for future rotation . -SUBROUTINE FAST_DiffInterpOutputs( psi_target, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: psi_target !< psi (rotor azimuth) at which the outputs are requested - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: k ! loop counters - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - REAL(DbKi) :: t_global - REAL(ReKi) :: eps_squared - - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DiffInterpOutputs' - - ErrStat = ErrID_None - ErrMsg = "" - t_global = 0.0_DbKi ! we don't really need this to get the output OPs - - !................................................................................................ - ! Extrapolate outputs to the target azimuth and pack into OP arrays - !................................................................................................ - - ! ElastoDyn - CALL ED_Output_ExtrapInterp (ED%Output, m_FAST%Lin%Psi, ED%y_interp, psi_target, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call ED_GetOP( t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), & - ED%y_interp, ED%m, ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_ED)%Instance(1)%op_y, NeedTrimOP=.true.) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! BeamDyn - IF (p_FAST%CompElast == Module_BD) THEN - - DO k = 1,p_FAST%nBeams - - CALL BD_Output_ExtrapInterp (BD%Output(:,k), m_FAST%Lin%Psi, BD%y_interp(k), psi_target, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call BD_GetOP( t_global, BD%Input(1,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), BD%OtherSt(k,STATE_CURR), & - BD%y_interp(k), BD%m(k), ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_BD)%Instance(k)%op_y, NeedTrimOP=.true.) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END DO ! k=p_FAST%nBeams - - END IF ! BeamDyn - - - ! AeroDyn - IF ( p_FAST%CompAero == Module_AD ) THEN - - CALL AD_Output_ExtrapInterp (AD%Output, m_FAST%Lin%Psi, AD%y_interp, psi_target, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call AD_GetOP( t_global, AD%Input(1), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), AD%OtherSt(STATE_CURR), & - AD%y_interp, AD%m, ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_AD)%Instance(1)%op_y) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF ! CompAero - - - ! InflowWind - IF ( p_FAST%CompInflow == Module_IfW ) THEN - - CALL InflowWind_Output_ExtrapInterp (IfW%Output, m_FAST%Lin%Psi, IfW%y_interp, psi_target, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call InflowWind_GetOP( t_global, IfW%Input(1), IfW%p, IfW%x(STATE_CURR), IfW%xd(STATE_CURR), IfW%z(STATE_CURR), IfW%OtherSt(STATE_CURR), & - IfW%y_interp, IfW%m, ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_IfW)%Instance(1)%op_y) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF ! CompInflow - - - ! SeaState - if ( p_FAST%CompSeaSt == Module_SeaSt ) then - ! No normal outputs to extrapolate - !call SeaSt_Output_ExtrapInterp (SeaSt%Output, m_FAST%Lin%Psi, SeaSt%y_interp, psi_target, ErrStat2, ErrMsg2) - ! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call SeaSt_GetOP( t_global, SeaSt%Input(1), SeaSt%p, SeaSt%x(STATE_CURR), SeaSt%xd(STATE_CURR), SeaSt%z(STATE_CURR), SeaSt%OtherSt(STATE_CURR), & - SeaSt%y_interp, SeaSt%m, ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_SeaSt)%Instance(1)%op_y) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - endif ! CompSeaSt - - - ! ServoDyn - IF ( p_FAST%CompServo == Module_SrvD ) THEN - - CALL SrvD_Output_ExtrapInterp (SrvD%Output, m_FAST%Lin%Psi, SrvD%y_interp, psi_target, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call SrvD_GetOP( t_global, SrvD%Input(1), SrvD%p, SrvD%x(STATE_CURR), SrvD%xd(STATE_CURR), SrvD%z(STATE_CURR), SrvD%OtherSt(STATE_CURR), & - SrvD%y_interp, SrvD%m, ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%op_y) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF ! ServoDyn - - ! HydroDyn - IF ( p_FAST%CompHydro == Module_HD ) THEN - - CALL HydroDyn_Output_ExtrapInterp (HD%Output, m_FAST%Lin%Psi, HD%y_interp, psi_target, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call HD_GetOP( t_global, HD%Input(1), HD%p, HD%x(STATE_CURR), HD%xd(STATE_CURR), HD%z(STATE_CURR), HD%OtherSt(STATE_CURR), & - HD%y_interp, HD%m, ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_HD)%Instance(1)%op_y) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF ! HydroDyn - - - !! SubDyn/ExtPtfm_MCKF - IF ( p_FAST%CompSub == Module_SD ) THEN - - CALL SD_Output_ExtrapInterp (SD%Output, m_FAST%Lin%Psi, SD%y_interp, psi_target, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call SD_GetOP( t_global, SD%Input(1), SD%p, SD%x(STATE_CURR), SD%xd(STATE_CURR), SD%z(STATE_CURR), SD%OtherSt(STATE_CURR), & - SD%y_interp, SD%m, ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_SD)%Instance(1)%op_y, NeedTrimOP=.true.) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - END IF ! SubDyn/ExtPtfm_MCKF - - - ! Mooring (MAP , FEAM , MoorDyn) - ! MAP - IF ( p_FAST%CompMooring == Module_MAP ) THEN - - CALL MAP_Output_ExtrapInterp (MAPp%Output, m_FAST%Lin%Psi, MAPp%y_interp, psi_target, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call MAP_GetOP( t_global, MAPp%Input(1), MAPp%p, MAPp%x(STATE_CURR), MAPp%xd(STATE_CURR), MAPp%z(STATE_CURR), MAPp%OtherSt, & - MAPp%y_interp, ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_MAP)%Instance(1)%op_y) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! MoorDyn - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - - CALL MD_Output_ExtrapInterp (MD%Output, m_FAST%Lin%Psi, MD%y_interp, psi_target, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - call MD_GetOP( t_global, MD%Input(1), MD%p, MD%x(STATE_CURR), MD%xd(STATE_CURR), MD%z(STATE_CURR), MD%OtherSt(STATE_CURR), & - MD%y_interp, MD%m, ErrStat2, ErrMsg2, y_op=y_FAST%Lin%Modules(Module_MD)%Instance(1)%op_y) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - !! FEAM - !ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - !! OrcaFlex - !ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - - END IF ! MAP/FEAM/MoorDyn/OrcaFlex - - - - !! Ice (IceFloe or IceDyn) - !! IceFloe - !IF ( p_FAST%CompIce == Module_IceF ) THEN - ! - !! IceDyn - !ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - ! - !END IF ! IceFloe/IceDyn - - - call pack_in_array(p_FAST, y_FAST, m_FAST) - - if (m_FAST%Lin%IsConverged) then ! if Forced Linearization, the error may be large due to a different azimuth, so printing it here isn't very helpful - ! check that error equation is less than TrimTol - call calc_error(p_FAST, y_FAST, m_FAST, SrvD%y, eps_squared) - m_FAST%Lin%IsConverged = eps_squared < p_FAST%TrimTol - end if - - - m_FAST%Lin%Y_prevRot(:,m_FAST%Lin%AzimIndx) = m_FAST%Lin%y_interp - -END SUBROUTINE FAST_DiffInterpOutputs -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE pack_in_array(p_FAST, y_FAST, m_FAST) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - - INTEGER(IntKi) :: ThisModule !< module identifier - INTEGER(IntKi) :: ThisInstance !< index of the module instance - - integer :: i, j - integer :: ny - integer :: indx - - ! note that op_y may be larger than SizeLin if there are orientations; also, we are NOT including the WriteOutputs - - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do ThisInstance=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - - ny = y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%SizeLin(LIN_OUTPUT_COL) - y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%NumOutputs !last column before WriteOutput occurs - do j=1,ny - indx = y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%LinStartIndx(LIN_OUTPUT_COL) + j - 1 - - m_FAST%Lin%y_interp( indx ) = y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%op_y(j) - end do - - end do - end do - -END SUBROUTINE pack_in_array -!---------------------------------------------------------------------------------------------------------------------------------- -!> This function computes the error function between this rotor revolution and the previous one. -!! Angles represented in m_FAST%Lin%y_interp may have 2pi added or subtracted to allow the angles to be closer to the previous -!! rotor revolution. -SUBROUTINE calc_error(p_FAST, y_FAST, m_FAST, y_SrvD, eps_squared) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - TYPE(SrvD_OutputType), INTENT(IN ) :: y_SrvD !< Output variables for the glue code - REAL(ReKi) ,INTENT( OUT) :: eps_squared !< epsilon squared - - INTEGER(IntKi) :: ThisModule !< module identifier - INTEGER(IntKi) :: ThisInstance !< index of the module instance - - integer :: i, j - integer :: ny - integer :: indx - real(ReKi) :: diff - - - ! special cases for angles: - indx = Indx_y_Yaw_Start(y_FAST, Module_ED) ! start of ED where Yaw, YawRate, HSS_Spd occur (right before WriteOutputs) - call AddOrSub2Pi(m_FAST%Lin%Y_prevRot( indx, m_FAST%Lin%AzimIndx ), m_FAST%Lin%y_interp( indx )) - - if (p_FAST%CompServo == Module_SrvD) then - do i = 1, size( y_SrvD%BlPitchCom ) - indx = y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + i - 1 - call AddOrSub2Pi(m_FAST%Lin%Y_prevRot( indx, m_FAST%Lin%AzimIndx ), m_FAST%Lin%y_interp( indx )) - end do - end if - - - ! compute the error: - eps_squared = 0.0_ReKi - !m_FAST%Lin%eps_squared = 0.0_ReKi - - do i = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder( i ) - - do ThisInstance=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - - ny = y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%SizeLin(LIN_OUTPUT_COL) - y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%NumOutputs !last column before WriteOutput occurs - - do j=1,ny - indx = y_FAST%Lin%Modules(ThisModule)%Instance(ThisInstance)%LinStartIndx(LIN_OUTPUT_COL) + j - 1 - - if (EqualRealNos(m_FAST%Lin%y_interp( indx ), m_FAST%Lin%Y_prevRot( indx, m_FAST%Lin%AzimIndx ))) then - diff = 0.0_ReKi ! take care of some potential numerical issues - else - diff = m_FAST%Lin%y_interp( indx ) - m_FAST%Lin%Y_prevRot( indx, m_FAST%Lin%AzimIndx ) - end if - !m_FAST%Lin%eps_squared(indx) = ( diff / m_FAST%Lin%y_ref( indx ) ) ** 2 - - eps_squared = eps_squared + ( diff / m_FAST%Lin%y_ref( indx ) ) ** 2 - end do - - end do - end do - - - !................................. - ! Normalize: - !................................. - eps_squared = eps_squared / ( y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL) - y_FAST%Lin%Glue%NumOutputs ) - -! write(50+m_FAST%Lin%AzimIndx,'(3000(F15.7,1x))') m_FAST%Lin%y_interp, eps_squared -END SUBROUTINE calc_error -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE ComputeOutputRanges(p_FAST, y_FAST, m_FAST, y_SrvD) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - TYPE(SrvD_OutputType), INTENT(IN ) :: y_SrvD !< Output variables for the glue code - - integer :: indx - integer :: i - - ! note that op_y may be larger than SizeLin if there are orientations; also, we are NOT including the WriteOutputs - - if (p_FAST%NLinTimes == 1) then ! NOTE: maxval( m_FAST%Lin%Y_prevRot( indx, : ) ) - minval( m_FAST%Lin%Y_prevRot( indx, : ) ) = 0 in this case - do indx = 1,y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL) - m_FAST%Lin%y_ref(indx) = max( abs(m_FAST%Lin%Y_prevRot( indx, p_FAST%NLinTimes )), 0.01_ReKi ) - end do - else - do indx = 1,y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL) - m_FAST%Lin%y_ref(indx) = maxval( m_FAST%Lin%Y_prevRot( indx, : ) ) - minval( m_FAST%Lin%Y_prevRot( indx, : ) ) - m_FAST%Lin%y_ref(indx) = max( m_FAST%Lin%y_ref(indx), 0.01_ReKi ) - end do - end if - - ! special case for angles: - indx = Indx_y_Yaw_Start(y_FAST, Module_ED) ! start of ED where Yaw, YawRate, HSS_Spd occur (right before WriteOutputs) - m_FAST%Lin%y_ref(indx) = min( m_FAST%Lin%y_ref(indx), Pi ) - - if (p_FAST%CompServo == Module_SrvD) then - do i = 1, size( y_SrvD%BlPitchCom ) - indx = y_FAST%Lin%Modules(Module_SrvD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) + i - 1 - m_FAST%Lin%y_ref(indx) = min( m_FAST%Lin%y_ref(indx), Pi ) - end do - end if - - ! Note: I'm ignoring the periodicity of the log maps that represent orientations - -END SUBROUTINE ComputeOutputRanges -!---------------------------------------------------------------------------------------------------------------------------------- - -END MODULE FAST_Linear diff --git a/modules/openfast-library/src/FAST_Mapping.f90 b/modules/openfast-library/src/FAST_Mapping.f90 new file mode 100644 index 0000000000..a150e6f066 --- /dev/null +++ b/modules/openfast-library/src/FAST_Mapping.f90 @@ -0,0 +1,3706 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2024 National Renewable Energy Laboratory +! +! This file is part of FAST. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +!********************************************************************************************************************************** +!> This module contains routines used by FAST to map meshes and values between modules for transfering data and doing linearization. + +module FAST_Mapping + +use FAST_Types +use FAST_ModTypes +use ExtLoads +use ExternalInflow + +implicit none + +private +public :: FAST_InitMappings +public :: FAST_LinearizeMappings +public :: FAST_ResetRemapFlags +public :: FAST_InputSolve +public :: FAST_ResetMappingReady +public :: FAST_InputFieldName, FAST_OutputFieldName + +integer(IntKi), parameter :: Xfr_Invalid = 0, & + Xfr_Point_to_Point = 1, & + Xfr_Line2_to_Point = 2, & + Xfr_Point_to_Line2 = 3, & + Xfr_Line2_to_Line2 = 4 + +character(24), parameter :: Custom_ED_to_ExtLd = 'ED -> ExtLd', & + Custom_SrvD_to_AD = 'SrvD -> AD', & + Custom_ED_to_ADsk = 'ED -> ADsk', & + Custom_SED_to_ADsk = 'SED -> ADsk', & + Custom_SED_to_IfW = 'SED -> IfW', & + Custom_ED_to_IfW = 'ED -> IfW', & + Custom_SrvD_to_IfW = 'SrvD -> IfW', & + Custom_BD_to_SrvD = 'BD -> SrvD', & + Custom_ED_to_SrvD = 'ED -> SrvD', & + Custom_SED_to_SrvD = 'SED -> SrvD', & + Custom_ExtInfw_to_AD = 'ExtInfw -> AD', & + Custom_ExtInfw_to_SrvD = 'ExtInfw -> SrvD', & + Custom_IfW_to_SrvD = 'IfW -> SrvD', & + Custom_SrvD_to_ED = 'SrvD -> ED', & + Custom_SrvD_to_SED = 'SrvD -> SED', & + Custom_SrvD_to_SD = 'SrvD -> SD', & + Custom_SrvD_to_MD = 'SrvD -> MD', & + Custom_AD_to_ExtInfw = 'AD -> ExtInfw', & + Custom_ED_Tower_Damping = 'ED Tower Damping', & + Custom_ED_Blade_Damping = 'ED Blade Damping', & + Custom_BD_Blade_Damping = 'BD Blade Damping', & + Custom_FF_to_ED = 'FF -> ED', & + Custom_FF_to_SD = 'FF -> SD' + +contains + +subroutine FAST_InputMeshPointer(ModData, Turbine, MeshLoc, Mesh, iInput, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: ModData + type(DatLoc), intent(in) :: MeshLoc + type(FAST_TurbineType), target, intent(in) :: Turbine + type(MeshType), pointer, intent(out) :: Mesh + integer(IntKi), intent(in) :: iInput + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + ErrStat = ErrID_None + ErrMsg = "" + + nullify (Mesh) + + select case (ModData%ID) + case (Module_AD) + Mesh => AD_InputMeshPointer(Turbine%AD%Input(iInput)%rotors(ModData%Ins), MeshLoc) + case (Module_ADsk) + Mesh => ADsk_InputMeshPointer(Turbine%ADsk%Input(iInput), MeshLoc) + case (Module_BD) + Mesh => BD_InputMeshPointer(Turbine%BD%Input(iInput, ModData%Ins), MeshLoc) + case (Module_ED) + Mesh => ED_InputMeshPointer(Turbine%ED%Input(iInput, ModData%Ins), MeshLoc) + case (Module_SED) + Mesh => SED_InputMeshPointer(Turbine%SED%Input(iInput), MeshLoc) + case (Module_ExtInfw) + ! ExtInfw doesn't have the typical input structure, using u + Mesh => ExtInfw_InputMeshPointer(Turbine%ExtInfw%u, MeshLoc) + case (Module_ExtLd) + ! ExtLd doesn't have the typical input structure, using u + Mesh => ExtLd_InputMeshPointer(Turbine%ExtLd%u, MeshLoc) + case (Module_ExtPtfm) + Mesh => ExtPtfm_InputMeshPointer(Turbine%ExtPtfm%Input(iInput), MeshLoc) + case (Module_FEAM) + Mesh => FEAM_InputMeshPointer(Turbine%FEAM%Input(iInput), MeshLoc) + case (Module_HD) + Mesh => HydroDyn_InputMeshPointer(Turbine%HD%Input(iInput), MeshLoc) + case (Module_IceD) + Mesh => IceD_InputMeshPointer(Turbine%IceD%Input(iInput, ModData%Ins), MeshLoc) + case (Module_IceF) + Mesh => IceFloe_InputMeshPointer(Turbine%IceF%Input(iInput), MeshLoc) + case (Module_IfW) + Mesh => InflowWind_InputMeshPointer(Turbine%IfW%Input(iInput), MeshLoc) + case (Module_MAP) + Mesh => MAP_InputMeshPointer(Turbine%MAP%Input(iInput), MeshLoc) + case (Module_MD) + Mesh => MD_InputMeshPointer(Turbine%MD%Input(iInput), MeshLoc) + case (Module_Orca) + Mesh => Orca_InputMeshPointer(Turbine%Orca%Input(iInput), MeshLoc) + case (Module_SD) + Mesh => SD_InputMeshPointer(Turbine%SD%Input(iInput), MeshLoc) + case (Module_SeaSt) + Mesh => SeaSt_InputMeshPointer(Turbine%SeaSt%Input(iInput), MeshLoc) + case (Module_SlD) + Mesh => SlD_InputMeshPointer(Turbine%SlD%Input(iInput), MeshLoc) + case (Module_SrvD) + Mesh => SrvD_InputMeshPointer(Turbine%SrvD%Input(iInput, ModData%Ins), MeshLoc) + case default + ErrStat = ErrID_Fatal + ErrMsg = "Unsupported module: "//ModData%Abbr + return + end select + + if (.not. associated(Mesh)) then + ErrStat = ErrID_Fatal + ErrMsg = "Mesh not found in module "//ModData%Abbr// & + ", Num="//trim(Num2LStr(MeshLoc%Num))// & + ", i1="//trim(Num2LStr(MeshLoc%i1))// & + ", i2="//trim(Num2LStr(MeshLoc%i2))// & + ", i3="//trim(Num2LStr(MeshLoc%i3)) + return + end if +end subroutine + +subroutine FAST_OutputMeshPointer(ModData, Turbine, MeshLoc, Mesh, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: ModData + type(DatLoc), intent(in) :: MeshLoc + type(FAST_TurbineType), target, intent(inout) :: Turbine + type(MeshType), pointer, intent(out) :: Mesh + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + ErrStat = ErrID_None + ErrMsg = "" + + nullify (Mesh) + + select case (ModData%ID) + case (Module_AD) + Mesh => AD_OutputMeshPointer(Turbine%AD%y%rotors(ModData%Ins), MeshLoc) + case (Module_ADsk) + Mesh => ADsk_OutputMeshPointer(Turbine%ADsk%y, MeshLoc) + case (Module_BD) + Mesh => BD_OutputMeshPointer(Turbine%BD%y(ModData%Ins), MeshLoc) + case (Module_ED) + Mesh => ED_OutputMeshPointer(Turbine%ED%y(ModData%Ins), MeshLoc) + case (Module_SED) + Mesh => SED_OutputMeshPointer(Turbine%SED%y, MeshLoc) + case (Module_ExtInfw) + Mesh => ExtInfw_OutputMeshPointer(Turbine%ExtInfw%y, MeshLoc) + case (Module_ExtLd) + Mesh => ExtLd_OutputMeshPointer(Turbine%ExtLd%y, MeshLoc) + case (Module_ExtPtfm) + Mesh => ExtPtfm_OutputMeshPointer(Turbine%ExtPtfm%y, MeshLoc) + case (Module_FEAM) + Mesh => FEAM_OutputMeshPointer(Turbine%FEAM%y, MeshLoc) + case (Module_HD) + Mesh => HydroDyn_OutputMeshPointer(Turbine%HD%y, MeshLoc) + case (Module_IceD) + Mesh => IceD_OutputMeshPointer(Turbine%IceD%y(ModData%Ins), MeshLoc) + case (Module_IceF) + Mesh => IceFloe_OutputMeshPointer(Turbine%IceF%y, MeshLoc) + case (Module_IfW) + Mesh => InflowWind_OutputMeshPointer(Turbine%IfW%y, MeshLoc) + case (Module_MAP) + Mesh => MAP_OutputMeshPointer(Turbine%MAP%y, MeshLoc) + case (Module_MD) + Mesh => MD_OutputMeshPointer(Turbine%MD%y, MeshLoc) + case (Module_Orca) + Mesh => Orca_OutputMeshPointer(Turbine%Orca%y, MeshLoc) + case (Module_SD) + Mesh => SD_OutputMeshPointer(Turbine%SD%y, MeshLoc) + case (Module_SeaSt) + Mesh => SeaSt_OutputMeshPointer(Turbine%SeaSt%y, MeshLoc) + case (Module_SlD) + Mesh => SlD_OutputMeshPointer(Turbine%SlD%y, MeshLoc) + case (Module_SrvD) + Mesh => SrvD_OutputMeshPointer(Turbine%SrvD%y(ModData%Ins), MeshLoc) + case default + ErrStat = ErrID_Fatal + ErrMsg = "Unsupported module: "//ModData%Abbr + return + end select + + if (.not. associated(Mesh)) then + ErrStat = ErrID_Fatal + ErrMsg = "Mesh not found in module "//ModData%Abbr// & + ", Num="//trim(Num2LStr(MeshLoc%Num))// & + ", i1="//trim(Num2LStr(MeshLoc%i1))// & + ", i2="//trim(Num2LStr(MeshLoc%i2))// & + ", i3="//trim(Num2LStr(MeshLoc%i3)) + return + end if +end subroutine + +function FAST_InputFieldName(ModData, DL) result(Name) + type(ModDataType), intent(in) :: ModData + type(DatLoc), intent(in) :: DL + character(42) :: Name, tmp + select case (ModData%ID) + case (Module_AD) + Name = trim(ModData%Abbr)//"%u%rotors("//trim(Num2LStr(ModData%Ins))//")" + select case (DL%Num) + case (1:) + tmp = AD_InputFieldName(DL) + Name = trim(Name)//tmp(2:) + case (AD_u_HWindSpeed) + Name = 'AD%u%HWindSpeed (Ext)' + case (AD_u_PLExp) + Name = 'AD%u%PLExp (Ext)' + case (AD_u_PropagationDir) + Name = 'AD%u%PropagationDir (Ext)' + end select + case (Module_ADsk) + Name = trim(ModData%Abbr)//"%"//ADsk_InputFieldName(DL) + case (Module_BD) + Name = trim(ModData%Abbr)//"("//trim(Num2LStr(ModData%Ins))//")%"//BD_InputFieldName(DL) + case (Module_ED) + select case (DL%Num) + case (1:) + Name = trim(ModData%Abbr)//"("//trim(Num2LStr(ModData%Ins))//")%"//ED_InputFieldName(DL) + case (ED_u_BlPitchComC) + Name = 'ED('//trim(Num2LStr(ModData%Ins))//')%u%BlPitchComC (Ext)' + end select + case (Module_SED) + Name = trim(ModData%Abbr)//"%"//SED_InputFieldName(DL) + case (Module_ExtInfw) + Name = trim(ModData%Abbr)//"%"//ExtInfw_InputFieldName(DL) + case (Module_ExtLd) + Name = trim(ModData%Abbr)//"%"//ExtLd_InputFieldName(DL) + case (Module_ExtPtfm) + Name = trim(ModData%Abbr)//"%"//ExtPtfm_InputFieldName(DL) + case (Module_FEAM) + Name = trim(ModData%Abbr)//"%"//FEAM_InputFieldName(DL) + case (Module_HD) + select case (DL%Num) + case (1:) + Name = trim(ModData%Abbr)//"%"//HydroDyn_InputFieldName(DL) + case (HydroDyn_u_WaveElev0) + Name = 'HD%u%WaveElev0 (Ext)' + case (HydroDyn_u_HWindSpeed) + Name = 'HD%u%HWindSpeed (Ext)' + case (HydroDyn_u_PLexp) + Name = 'HD%u%PLexp (Ext)' + case (HydroDyn_u_PropagationDir) + Name = 'HD%u%PropagationDir (Ext)' + end select + case (Module_IceD) + Name = trim(ModData%Abbr)//"("//trim(Num2LStr(ModData%Ins))//")%"//IceD_InputFieldName(DL) + case (Module_IceF) + Name = trim(ModData%Abbr)//"%"//IceFloe_InputFieldName(DL) + case (Module_IfW) + select case (DL%Num) + case (1:) + Name = trim(ModData%Abbr)//"%"//InflowWind_InputFieldName(DL) + case (InflowWind_u_HWindSpeed) + Name = 'IfW%u%HWindSpeed (Ext)' + case (InflowWind_u_PLexp) + Name = 'IfW%u%PLexp (Ext)' + case (InflowWind_u_PropagationDir) + Name = 'IfW%u%PropagationDir (Ext)' + end select + case (Module_MAP) + Name = trim(ModData%Abbr)//"%"//MAP_InputFieldName(DL) + case (Module_MD) + Name = trim(ModData%Abbr)//"%"//MD_InputFieldName(DL) + case (Module_Orca) + Name = trim(ModData%Abbr)//"%"//Orca_InputFieldName(DL) + case (Module_SD) + Name = trim(ModData%Abbr)//"%"//SD_InputFieldName(DL) + case (Module_SeaSt) + select case (DL%Num) + case (1:) + Name = trim(ModData%Abbr)//"%"//SeaSt_InputFieldName(DL) + case (SeaSt_u_WaveElev0) + Name = 'SeaSt%u%WaveElev0 (Ext)' + end select + case (Module_SrvD) + Name = trim(ModData%Abbr)//"("//trim(Num2LStr(ModData%Ins))//")%"//SrvD_InputFieldName(DL) + case default + Name = "Unknown field "//Num2LStr(DL%Num)//" in "//ModData%Abbr + end select +end function + +function FAST_OutputFieldName(ModData, DL) result(Name) + type(ModDataType), intent(in) :: ModData + type(DatLoc), intent(in) :: DL + character(42) :: Name, tmp + select case (ModData%ID) + case (Module_AD) + tmp = AD_OutputFieldName(DL) + Name = trim(ModData%Abbr)//"%y%rotors("//trim(Num2LStr(ModData%Ins))//")"//tmp(2:) + case (Module_ADsk) + Name = trim(ModData%Abbr)//"%"//ADsk_OutputFieldName(DL) + case (Module_BD) + Name = trim(ModData%Abbr)//"("//trim(Num2LStr(ModData%Ins))//")%"//BD_OutputFieldName(DL) + case (Module_ED) + Name = trim(ModData%Abbr)//"("//trim(Num2LStr(ModData%Ins))//")%"//ED_OutputFieldName(DL) + case (Module_SED) + Name = trim(ModData%Abbr)//"%"//SED_OutputFieldName(DL) + case (Module_ExtInfw) + Name = trim(ModData%Abbr)//"%"//ExtInfw_OutputFieldName(DL) + case (Module_ExtLd) + Name = trim(ModData%Abbr)//"%"//ExtLd_OutputFieldName(DL) + case (Module_ExtPtfm) + Name = trim(ModData%Abbr)//"%"//ExtPtfm_OutputFieldName(DL) + case (Module_FEAM) + Name = trim(ModData%Abbr)//"%"//FEAM_OutputFieldName(DL) + case (Module_HD) + Name = trim(ModData%Abbr)//"%"//HydroDyn_OutputFieldName(DL) + case (Module_IceD) + Name = trim(ModData%Abbr)//"("//trim(Num2LStr(ModData%Ins))//")%"//IceD_OutputFieldName(DL) + case (Module_IceF) + Name = trim(ModData%Abbr)//"%"//IceFloe_OutputFieldName(DL) + case (Module_IfW) + select case (DL%Num) + case (1:) + Name = trim(ModData%Abbr)//"%"//InflowWind_OutputFieldName(DL) + case (InflowWind_y_HWindSpeed) + Name = 'IfW%y%HWindSpeed (Ext)' + case (InflowWind_y_PLexp) + Name = 'IfW%y%PLexp (Ext)' + case (InflowWind_y_PropagationDir) + Name = 'IfW%y%PropagationDir (Ext)' + end select + case (Module_MAP) + Name = trim(ModData%Abbr)//"%"//MAP_OutputFieldName(DL) + case (Module_MD) + Name = trim(ModData%Abbr)//"%"//MD_OutputFieldName(DL) + case (Module_Orca) + Name = trim(ModData%Abbr)//"%"//Orca_OutputFieldName(DL) + case (Module_SD) + Name = trim(ModData%Abbr)//"%"//SD_OutputFieldName(DL) + case (Module_SeaSt) + select case (DL%Num) + case (1:) + Name = trim(ModData%Abbr)//"%"//SeaSt_OutputFieldName(DL) + case (SeaSt_y_WaveElev0) + Name = 'SeaSt%y%WaveElev0 (Ext)' + end select + case (Module_SrvD) + Name = trim(ModData%Abbr)//"("//trim(Num2LStr(ModData%Ins))//")%"//SrvD_OutputFieldName(DL) + case default + Name = "Unknown field "//Num2LStr(DL%Num)//" in "//ModData%Abbr + end select +end function + +subroutine FAST_InitMappings(Mappings, Mods, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable, intent(out) :: Mappings(:) + type(ModDataType), intent(inout) :: Mods(:) !< Module data + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_InitMappings' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, k + integer(IntKi) :: iMap, ModIns, iModIn, iModSrc, iModDst + type(MappingType), allocatable :: MappingsTmp(:) + integer(IntKi), parameter :: MappingTypeOrder(*) = [Map_MotionMesh, Map_LoadMesh, Map_Variable, Map_Custom] + + ErrStat = ErrID_None + ErrMsg = '' + + !---------------------------------------------------------------------------- + ! Define mesh mappings between modules + !---------------------------------------------------------------------------- + + ! Define a list of all possible module mesh mappings between modules + allocate (MappingsTmp(0), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, "Error allocating temporary mappings", ErrStat, ErrMsg, RoutineName) + return + end if + + ! Loop through destination modules + do iModDst = 1, size(Mods) + + ! Add mappings within module + select case (Mods(iModDst)%ID) + case (Module_ED) + + call MapCustom(MappingsTmp, Custom_ED_Tower_Damping, Mods(iModDst), Mods(iModDst), & + DstDL=DatLoc(ED_u_TowerPtLoads), & + Active=Turbine%p_FAST%CalcSteady) + + do i = 1, Turbine%ED%p(Mods(iModDst)%Ins)%NumBl + call MapCustom(MappingsTmp, Custom_ED_Blade_Damping, Mods(iModDst), Mods(iModDst), & + i=i, DstDL=DatLoc(ED_u_BladePtLoads, i) ,& + Active=Turbine%p_FAST%CalcSteady .and. (Turbine%p_FAST%CompElast == Module_ED)) + end do + + ! If FAST.Farm integration enabled and substructure is not modeled with SubDyn + if (Turbine%p_FAST%FarmIntegration .and. (Turbine%p_FAST%CompSub /= Module_SD)) then + + ! Copy ED platform load mesh to substructure loads mesh + call MeshCopy(Turbine%ED%Input(INPUT_CURR, Mods(iModDst)%Ins)%PlatformPtMesh, & + Turbine%m_Glue%Ext%SubstructureLoadsFF, & + MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return + Turbine%m_Glue%Ext%SubstructureLoadsFF%Force = 0.0_ReKi + Turbine%m_Glue%Ext%SubstructureLoadsFF%Moment = 0.0_ReKi + + call MapCustom(MappingsTmp, Custom_FF_to_ED, Mods(iModDst), Mods(iModDst)) + + end if + + case (Module_BD) + + call MapCustom(MappingsTmp, Custom_BD_Blade_Damping, Mods(iModDst), Mods(iModDst), & + DstDL=DatLoc(BD_u_PointLoad), & + Active=Turbine%p_FAST%CalcSteady) + + case (Module_SD) + + ! If FAST.Farm integration enabled + if (Turbine%p_FAST%FarmIntegration) then + + ! Copy SD platform load mesh to substructure loads mesh + call MeshCopy(Turbine%SD%Input(INPUT_CURR)%LMesh, & + Turbine%m_Glue%Ext%SubstructureLoadsFF, & + MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return + Turbine%m_Glue%Ext%SubstructureLoadsFF%Force = 0.0_ReKi + Turbine%m_Glue%Ext%SubstructureLoadsFF%Moment = 0.0_ReKi + + call MapCustom(MappingsTmp, Custom_FF_to_SD, Mods(iModDst), Mods(iModDst)) + + end if + + end select + + ! Loop through source modules + do iModSrc = 1, size(Mods) + + ! Skip module combinations that aren't shared across rotors or + ! aren't in the same rotor + if ((Mods(iModSrc)%iRotor /= 0) .and. (Mods(iModDst)%iRotor /= 0) .and. & + (Mods(iModSrc)%iRotor /= Mods(iModDst)%iRotor)) cycle + + ! Switch by destination module (inputs) + select case (Mods(iModDst)%ID) + case (Module_AD) + call InitMappings_AD(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_ADsk) + call InitMappings_ADsk(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_BD) + call InitMappings_BD(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_ED) + call InitMappings_ED(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_SED) + call InitMappings_SED(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_ExtInfw) + call InitMappings_ExtInfw(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_ExtLd) + call InitMappings_ExtLd(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_ExtPtfm) + call InitMappings_ExtPtfm(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_FEAM) + call InitMappings_FEAM(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_HD) + call InitMappings_HD(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_IceD) + call InitMappings_IceD(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_IceF) + call InitMappings_IceF(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_IfW) + call InitMappings_IfW(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_MAP) + call InitMappings_MAP(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_MD) + call InitMappings_MD(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_Orca) + call InitMappings_Orca(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_SD) + call InitMappings_SD(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_SeaSt) + call InitMappings_SeaSt(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_SlD) + call InitMappings_SlD(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + case (Module_SrvD) + call InitMappings_SrvD(MappingsTmp, Mods(iModSrc), Mods(iModDst), Turbine, ErrStat2, ErrMsg2) + end select + if (Failed()) return + end do + end do + + !---------------------------------------------------------------------------- + ! Reorder mappings to be Motion, Load, Variable, Custom + !---------------------------------------------------------------------------- + + allocate(Mappings(size(MappingsTmp)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, "Error allocating mappings", ErrStat, ErrMsg, RoutineName) + return + end if + + ! Loop through MappingTypeOrder and copy mesh to Mappings array if it matches the type + k = 0 + do i = 1, size(MappingTypeOrder) + do j = 1, size(MappingsTmp) + if (MappingsTmp(j)%MapType == MappingTypeOrder(i)) then + k = k + 1 + call Glue_CopyMappingType(MappingsTmp(j), Mappings(k), MESH_NEWCOPY, ErrStat2, ErrMsg2) + if (Failed()) return + end if + end do + end do + + ! Destroy temporary mappings + do i = 1, size(MappingsTmp) + call Glue_DestroyMappingType(MappingsTmp(i), ErrStat2, ErrMsg2) + if (Failed()) return + end do + + !---------------------------------------------------------------------------- + ! Initialize mappings used to apply damping + !---------------------------------------------------------------------------- + + ! Loop through mappings + do i = 1, size(Mappings) + associate(Mapping => Mappings(i)) + + ! Select based on mapping description + select case (Mapping%Desc) + case (Custom_ED_Tower_Damping) + + ! Create temporary motion mesh as cousin of load mesh, to compute get + ! velocities at load locations for computing damping forces + call MeshCopy(SrcMesh=Turbine%ED%Input(INPUT_CURR, Mapping%DstIns)%TowerPtLoads, & + DestMesh=Mapping%TmpMotionMesh, & + CtrlCode=MESH_COUSIN, & + IOS=COMPONENT_OUTPUT, & + TranslationDisp=.true., & + TranslationVel=.true., & + ErrStat=ErrStat2, & + ErrMess=ErrMsg2) + if (Failed()) return + + ! Create motion mapping from original motion mesh to temporary motion mesh + call MeshMapCreate(Turbine%ED%y(Mapping%DstIns)%TowerLn2Mesh, Mapping%TmpMotionMesh, Mapping%MeshMap, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Determine mesh transfer type and save to mapping + Mapping%XfrType = MeshTransferType(Turbine%ED%y(Mapping%DstIns)%TowerLn2Mesh, Mapping%TmpMotionMesh) + + case (Custom_ED_Blade_Damping) + + ! Create temporary motion mesh as cousin of load mesh, to compute get + ! velocities at load locations for computing damping forces + call MeshCopy(SrcMesh=Turbine%ED%Input(INPUT_CURR, Mapping%DstIns)%BladePtLoads(Mapping%i), & + DestMesh=Mapping%TmpMotionMesh, & + CtrlCode=MESH_COUSIN, & + IOS=COMPONENT_OUTPUT, & + TranslationDisp=.true., & + TranslationVel=.true., & + ErrStat=ErrStat2, & + ErrMess=ErrMsg2) + if (Failed()) return + + ! Create motion mapping from original motion mesh to temporary motion mesh + call MeshMapCreate(Turbine%ED%y(Mapping%DstIns)%BladeLn2Mesh(Mapping%i), Mapping%TmpMotionMesh, Mapping%MeshMap, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Determine mesh transfer type and save to mapping + Mapping%XfrType = MeshTransferType(Turbine%ED%y(Mapping%DstIns)%BladeLn2Mesh(Mapping%i), Mapping%TmpMotionMesh) + + case (Custom_BD_Blade_Damping) + + ! Create temporary motion mesh as cousin of load mesh, to compute get + ! velocities at load locations for computing damping forces + call MeshCopy(SrcMesh=Turbine%BD%Input(INPUT_CURR, Mapping%DstIns)%PointLoad, & + DestMesh=Mapping%TmpMotionMesh, & + CtrlCode=MESH_COUSIN, & + IOS=COMPONENT_OUTPUT, & + TranslationDisp=.true., & + TranslationVel=.true., & + ErrStat=ErrStat2, & + ErrMess=ErrMsg2) + if (Failed()) return + + ! Create motion mapping from original motion mesh to temporary motion mesh + call MeshMapCreate(Turbine%BD%y(Mapping%DstIns)%BldMotion, Mapping%TmpMotionMesh, Mapping%MeshMap, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Determine mesh transfer type and save to mapping + Mapping%XfrType = MeshTransferType(Turbine%BD%y(Mapping%DstIns)%BldMotion, Mapping%TmpMotionMesh) + + end select + end associate + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_AD(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_AD' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, iBld + logical :: NotCompAeroMaps, CompElastED + + ErrStat = ErrID_None + ErrMsg = '' + + ! Flag is true if not computing AeroMaps + NotCompAeroMaps = .not. Turbine%p_FAST%CompAeroMaps + + ! Flag is true if CompElast == Module_ED + CompElastED = Turbine%p_FAST%CompElast == Module_ED + + ! Select based on source module identifier + select case (SrcMod%ID) + + case (Module_BD) + + iBld = Turbine%p_FAST%BDBldMap(SrcMod%Ins) + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(BD_y_BldMotion), & ! BD%y(SrcMod%Ins)%BldMotion + DstMod=DstMod, DstDL=DatLoc(AD_u_BladeMotion, iBld), & ! AD%u%rotors(DstMod%Ins)%BladeMotion(iBld) + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + case (Module_ED) + + ! Blade motion + if (Turbine%p_FAST%CompElast == Module_ED) then + do i = 1, size(Turbine%ED%y(SrcMod%Ins)%BladeLn2Mesh) + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_BladeLn2Mesh, i), & ! ED%y%BladeLn2Mesh(i) + DstMod=DstMod, DstDL=DatLoc(AD_u_BladeMotion, i), & ! AD%u%rotors(DstMod%Ins)%BladeMotion(i) + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=CompElastED .and. (NotCompAeroMaps .or. (i == 1))) + if (Failed()) return + end do + end if + + ! Blade root motion + do i = 1, size(Turbine%ED%y(SrcMod%Ins)%BladeRootMotion) + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_BladeRootMotion, i), & ! ED%y%BladeRootMotion(i) + DstMod=DstMod, DstDL=DatLoc(AD_u_BladeRootMotion, i), & ! AD%u%rotors(DstMod%Ins)%BladeRootMotion(i) + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + end do + + ! Tower motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_TowerLn2Mesh), & ! ED%y%TowerLn2Mesh + DstMod=DstMod, DstDL=DatLoc(AD_u_TowerMotion), & ! AD%u%rotors(DstMod%Ins)%TowerMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + ! Hub motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_HubPtMotion), & ! ED%y%HubPtMotion + DstMod=DstMod, DstDL=DatLoc(AD_u_HubMotion), & ! AD%u%rotors(DstMod%Ins)%HubMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + ! Nacelle motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_NacelleMotion), & ! ED%y%NacelleMotion + DstMod=DstMod, DstDL=DatLoc(AD_u_NacelleMotion), & ! AD%u%rotors(DstMod%Ins)%NacelleMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + ! TailFin motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_TFinCMMotion), & ! ED%y%TFinCMMotion + DstMod=DstMod, DstDL=DatLoc(AD_u_TFinMotion), & ! AD%u%rotors(DstMod%Ins)%TFinMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + + case (Module_SED) + + ! Loop through blade root motions + do i = 1, size(Turbine%SED%y%BladeRootMotion) + + ! Blade root motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SED_y_BladeRootMotion, i), & ! SED%y%BladeRootMotion(i) + DstMod=DstMod, DstDL=DatLoc(AD_u_BladeRootMotion, i), & ! AD%u%rotors(DstMod%Ins)%BladeRootMotion(i) + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + ! Blade motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SED_y_BladeRootMotion, i), & ! SED%y%BladeRootMotion(i) + DstMod=DstMod, DstDL=DatLoc(AD_u_BladeMotion, i), & ! AD%u%rotors(DstMod%Ins)%BladeMotion(i) + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + end do + + ! Hub motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SED_y_HubPtMotion), & ! SED%y%HubPtMotion + DstMod=DstMod, DstDL=DatLoc(AD_u_HubMotion), & ! AD%u%rotors(DstMod%Ins)%HubMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + ! Tower motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SED_y_TowerLn2Mesh), & ! SED%y%TowerLn2Mesh + DstMod=DstMod, DstDL=DatLoc(AD_u_TowerMotion), & ! AD%u%rotors(DstMod%Ins)%TowerMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + ! Nacelle motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SED_y_NacelleMotion), & ! SED%y%NacelleMotion + DstMod=DstMod, DstDL=DatLoc(AD_u_NacelleMotion), & ! AD%u%rotors(DstMod%Ins)%NacelleMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_ExtInfw) + + call MapCustom(Mappings, Custom_ExtInfw_to_AD, SrcMod, DstMod, & + Active=DstMod%iRotor == 1) + + case (Module_IfW) + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(InflowWind_y_HWindSpeed), & + DstMod=DstMod, DstDL=DatLoc(AD_u_HWindSpeed), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=Turbine%p_FAST%Linearize) + if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(InflowWind_y_PLExp), & + DstMod=DstMod, DstDL=DatLoc(AD_u_PLExp), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=Turbine%p_FAST%Linearize) + if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(InflowWind_y_PropagationDir), & + DstMod=DstMod, DstDL=DatLoc(AD_u_PropagationDir), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=Turbine%p_FAST%Linearize) + if (Failed()) return + + case (Module_SrvD) + + call MapCustom(Mappings, Custom_SrvD_to_AD, SrcMod, DstMod) + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_ADsk(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_ADsk' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + ! Select based on source module identifier + select case (SrcMod%ID) + + case (Module_ED) + + ! Hub motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_HubPtMotion), & ! ED%y%HubPtMotion + DstMod=DstMod, DstDL=DatLoc(ADsk_u_HubMotion), & ! ADsk%u%HubMotion + Active=SrcMod%Ins == DstMod%Ins, & ! Same rotor + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + call MapCustom(Mappings, Custom_ED_to_ADsk, SrcMod, DstMod) + + case (Module_SED) + + ! Hub motion + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SED_y_HubPtMotion), & ! ED%y%HubPtMotion + DstMod=DstMod, DstDL=DatLoc(ADsk_u_HubMotion), & ! ADsk%u%HubMotion + Active=SrcMod%Ins == DstMod%Ins, & ! Same rotor + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + call MapCustom(Mappings, Custom_SED_to_ADsk, SrcMod, DstMod) + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_BD(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_BD' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, iBld + logical :: NotCompAeroMaps, CompAeroAD + + ErrStat = ErrID_None + ErrMsg = '' + + ! Flag is true if not computing AeroMaps + NotCompAeroMaps = .not. Turbine%p_FAST%CompAeroMaps + + ! Flag is true of CompAero == Module_AD + CompAeroAD = Turbine%p_FAST%CompAero == Module_AD + + ! Get the blade number for this BeamDyn instance + iBld = Turbine%p_FAST%BDBldMap(DstMod%Ins) + + ! Select based on source module identifier + select case (SrcMod%ID) + + case (Module_AD) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(AD_y_BladeLoad, iBld), & ! AD%y%rotors(SrcMod%Ins)%BladeLoad(iBld) + SrcDispDL=DatLoc(AD_u_BladeMotion, iBld), & ! AD%u%rotors(SrcMod%Ins)%BladeMotion(iBld) + DstDL=DatLoc(BD_u_DistrLoad), & ! BD%u(DstMod%Ins)%DistrLoad + DstDispDL=DatLoc(BD_y_BldMotion), & ! BD%y(DstMod%Ins)%BldMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=CompAeroAD .and. (NotCompAeroMaps .or. (DstMod%Ins == 1))) + if (Failed()) return + + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_BladeRootMotion, iBld), & ! ED%y%BladeRootMotion(iBld) + DstDL=DatLoc(BD_u_RootMotion), & ! BD%u(DstMod%Ins)%RootMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + ! call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + ! SrcDL=DatLoc(ED_y_HubPtMotion), & ! ED%y%HubED_y_HubPtMotion + ! DstDL=DatLoc(BD_u_HubMotion), & ! BD%Input(1, DstMod%Ins)%HubMotion + ! ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + ! Active=NotCompAeroMaps) + ! if (Failed()) return + + case (Module_ExtLd) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtLd_y_BladeLoad, iBld), & ! ExtLd%y%BladeLoad(iBld), & + SrcDispDL=DatLoc(ExtLd_u_BladeMotion, iBld), & ! ExtLd%u%BladeMotion(iBld) + DstDL=DatLoc(BD_u_DistrLoad), & ! BD%Input(1, DstMod%Ins)%DistrLoad + DstDispDL=DatLoc(BD_y_BldMotion), & ! BD%y(DstMod%Ins)%BldMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_SrvD) + + do i = 1, Turbine%SrvD%p(SrcMod%Ins)%NumBStC + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SrvD_y_BStCLoadMesh, iBld, i), & ! SrvD%y%BStCLoadMesh(iBld, i), & + SrcDispDL=DatLoc(SrvD_u_BStCMotionMesh, iBld, i), & ! SrvD%u%BStCMotionMesh(iBld, i) + DstDL=DatLoc(BD_u_DistrLoad), & ! BD%Input(1, DstMod%Ins)%DistrLoad + DstDispDL=DatLoc(BD_y_BldMotion), & ! BD%y(DstMod%Ins)%BldMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + end do + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_ED(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_ED' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, iBld + logical :: NotCompAeroMaps, CompAeroAD, CompElastED, CompSubSD + + ErrStat = ErrID_None + ErrMsg = '' + + ! Flag is true if not computing AeroMaps + NotCompAeroMaps = .not. Turbine%p_FAST%CompAeroMaps + + ! Flag is true of CompAero == Module_AD + CompAeroAD = Turbine%p_FAST%CompAero == Module_AD + + ! Flag is true of CompElast == Module_ED + CompElastED = Turbine%p_FAST%CompElast == Module_ED + + ! Flag is true of CompSub == Module_SD + CompSubSD = Turbine%p_FAST%CompSub == Module_SD + + ! Select based on source module identifier + select case (SrcMod%ID) + + case (Module_AD) + + ! Blade Loads + do i = 1, Turbine%ED%p(DstMod%Ins)%NumBl + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(AD_y_BladeLoad, i), & ! AD%y%rotors(SrcMod%Ins)%BladeLoad(i) + SrcDispDL=DatLoc(AD_u_BladeMotion, i), & ! AD%u%rotors(SrcMod%Ins)%BladeMotion(i) + DstDL=DatLoc(ED_u_BladePtLoads, i), & ! ED%u%BladePtLoads(i) + DstDispDL=DatLoc(ED_y_BladeLn2Mesh, i), & ! ED%y%BladeLn2Mesh(i) + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=CompAeroAD .and. CompElastED .and. & + (NotCompAeroMaps .or. (i == 1))) + if (Failed()) return + end do + + ! Hub Loads + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(AD_y_HubLoad), & ! AD%y%rotors(SrcMod%Ins)%HubLoad + SrcDispDL=DatLoc(AD_u_HubMotion), & ! AD%u%rotors(SrcMod%Ins)%HubMotion + DstDL=DatLoc(ED_u_HubPtLoad), & ! ED%u%HubPtLoad + DstDispDL=DatLoc(ED_y_HubPtMotion), & ! ED%y%HubPtMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + ! Nacelle Loads + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(AD_y_NacelleLoad), & ! AD%y%rotors(SrcMod%Ins)%NacelleLoad + SrcDispDL=DatLoc(AD_u_NacelleMotion), & ! AD%u%rotors(SrcMod%Ins)%NacelleMotion + DstDL=DatLoc(ED_u_NacelleLoads), & ! ED%u%NacelleLoads + DstDispDL=DatLoc(ED_y_NacelleMotion), & ! ED%y%NacelleMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + ! Tail Fin Loads + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(AD_y_TFinLoad), & ! AD%y%rotors(SrcMod%Ins)%TFinLoad + SrcDispDL=DatLoc(AD_u_TFinMotion), & ! AD%u%rotors(SrcMod%Ins)%TFinMotion + DstDL=DatLoc(ED_u_TFinCMLoads), & ! ED%u%TFinCMLoads + DstDispDL=DatLoc(ED_y_TFinCMMotion), & ! ED%y%TFinCMMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + ! Tower Loads + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(AD_y_TowerLoad), & ! AD%y%rotors(SrcMod%Ins)%TowerLoad + SrcDispDL=DatLoc(AD_u_TowerMotion), & ! AD%u%rotors(SrcMod%Ins)%TowerMotion + DstDL=DatLoc(ED_u_TowerPtLoads), & ! ED%u%TowerPtLoads + DstDispDL=DatLoc(ED_y_TowerLn2Mesh), & ! ED%y%TowerLn2Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=CompAeroAD .and. NotCompAeroMaps) + if (Failed()) return + + case (Module_ADsk) + + ! Hub Loads + call MapLoadMesh(Turbine, Mappings, & + SrcMod=SrcMod, & + SrcDL=DatLoc(ADsk_y_AeroLoads), & ! ADsk%y%AeroLoads + SrcDispDL=DatLoc(ADsk_u_HubMotion), & ! ADsk%u%HubMotion + DstMod=DstMod, & + DstDL=DatLoc(ED_u_HubPtLoad), & ! ED%u%HubPtLoad + DstDispDL=DatLoc(ED_y_HubPtMotion), & ! ED%y%HubPtMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_BD) + + ! ! Hub Loads + ! call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + ! SrcDL=DatLoc(BD_y_ReactionForce), & ! BD%y(SrcMod%Ins)%ReactionForce + ! SrcDispDL=DatLoc(BD_u_RootMotion), & ! BD%u(SrcMod%Ins)%RootMotion + ! DstDL=DatLoc(ED_u_HubPtLoad), & ! ED%u%HubPtLoad + ! DstDispDL=DatLoc(ED_y_HubPtMotion), & ! ED%y%HubPtMotion + ! ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + ! Active=NotCompAeroMaps) + ! if (Failed()) return + + ! Get the blade number for this BeamDyn instance + iBld = Turbine%p_FAST%BDBldMap(SrcMod%Ins) + + ! Blade Root Loads + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(BD_y_ReactionForce), & ! BD%y(SrcMod%Ins)%ReactionForce + SrcDispDL=DatLoc(BD_u_RootMotion), & ! BD%u(SrcMod%Ins)%RootMotion + DstDL=DatLoc(ED_u_BladeRootLoads, iBld), & ! ED%u%BladeRootLoads + DstDispDL=DatLoc(ED_y_BladeRootMotion, iBld), & ! ED%y%BladeRootMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=NotCompAeroMaps) + if (Failed()) return + + case (Module_ExtLd) + + ! Blade loads + do i = 1, Turbine%ED%p(DstMod%Ins)%NumBl + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtLd_y_BladeLoad, i), & ! ExtLd%y%BladeLoad(i) + SrcDispDL=DatLoc(ExtLd_u_BladeMotion, i), & ! ExtLd%u%BladeMotion(i) + DstDL=DatLoc(ED_u_BladePtLoads, i), & ! ED%u%BladePtLoads(i) + DstDispDL=DatLoc(ED_y_BladeLn2Mesh, i), & ! ED%y%BladeLn2Mesh(i) + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + end do + + ! Tower load + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtLd_y_TowerLoad), & ! ExtLd%y%TowerLoad + SrcDispDL=DatLoc(ExtLd_u_TowerMotion), & ! ExtLd%u%TowerMotion + DstDL=DatLoc(ED_u_TowerPtLoads), & ! ED%u%TowerPtLoads + DstDispDL=DatLoc(ED_y_TowerLn2Mesh), & ! ED%y%TowerLn2Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_ExtPtfm) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtPtfm_y_PtfmMesh), & ! ExtPtfm%y%PtfmMesh + SrcDispDL=DatLoc(ExtPtfm_u_PtfmMesh), & ! ExtPtfm%u%PtfmMesh + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub == Module_ExtPtfm, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_FEAM) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(FEAM_y_PtFairleadLoad), & ! FEAM%y%PtFairleadLoad, & + SrcDispDL=DatLoc(FEAM_u_PtFairleadDisplacement), & ! FEAM%u%PtFairleadDisplacement + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub == Module_None, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_HD) + + ! Platform loads (SubDyn not active) + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(HydroDyn_y_Morison_Mesh), & ! HD%y%Morison%Mesh + SrcDispDL=DatLoc(HydroDyn_u_Morison_Mesh), & ! HD%u%Morison%Mesh + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub == Module_None, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + ! Platform loads (SubDyn not active) + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(HydroDyn_y_WAMITMesh), & ! HD%y%WAMITMesh + SrcDispDL=DatLoc(HydroDyn_u_WAMITMesh), & ! HD%u%WAMITMesh + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub == Module_None, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_IceD) + + ! Platform loads (SubDyn not active) + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(IceD_y_PointMesh), & ! IceD%y%PointMesh + SrcDispDL=DatLoc(IceD_u_PointMesh), & ! IceD%u%PointMesh + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub /= Module_SD, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_IceF) + + ! Platform loads (SubDyn not active) + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(IceFloe_y_iceMesh), & ! IceFloe%y%iceMesh + SrcDispDL=DatLoc(IceFloe_u_iceMesh), & ! IceFloe%u%iceMesh + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub /= Module_SD, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_MAP) + + ! Platform loads (SubDyn not active) + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(MAP_y_ptFairleadLoad), & ! MAP%y%PtFairleadLoad + SrcDispDL=DatLoc(MAP_u_PtFairDisplacement), & ! MAP%u%PtFairDisplacement + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub == Module_None, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_MD) + + ! Platform loads (SubDyn not active) + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(MD_y_CoupledLoads, 1), & ! MD%y%CoupledLoads(1) + SrcDispDL=DatLoc(MD_u_CoupledKinematics, 1), & ! MD%u%CoupledKinematics(1) + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub == Module_None, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_Orca) + + ! Platform loads (SubDyn not active) + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(Orca_y_PtfmMesh), & ! Orca%y%PtfmMesh + SrcDispDL=DatLoc(Orca_u_PtfmMesh), & ! Orca%u%PtfmMesh + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub /= Module_SD, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_SD) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y1Mesh,DstMod%Ins), & ! SD%y%Y1mesh, & + SrcDispDL=DatLoc(SD_u_TPMesh,DstMod%Ins), & ! SD%u%TPMesh + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_SrvD) + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SrvD_y_BlPitchCom), & + DstMod=DstMod, DstDL=DatLoc(ED_u_BlPitchCom), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SrvD_y_BlPitchMom), & + DstMod=DstMod, DstDL=DatLoc(ED_u_BlPitchMom), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SrvD_y_YawMom), & + DstMod=DstMod, DstDL=DatLoc(ED_u_YawMom), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SrvD_y_GenTrq), & + DstMod=DstMod, DstDL=DatLoc(ED_u_GenTrq), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapCustom(Mappings, Custom_SrvD_to_ED, SrcMod, DstMod) + + ! Blade Structural Controller (if ElastoDyn is used for blades) + do j = 1, Turbine%SrvD%p(SrcMod%Ins)%NumBStC + do i = 1, Turbine%ED%p(DstMod%Ins)%NumBl + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SrvD_y_BStCLoadMesh, i, j), & ! SrvD%y%BStCLoadMesh(i, j), & + SrcDispDL=DatLoc(SrvD_u_BStCMotionMesh, i, j), & ! SrvD%u%BStCMotionMesh(i, j) + DstDL=DatLoc(ED_u_BladePtLoads, i), & ! ED%u%BladePtLoads(i) + DstDispDL=DatLoc(ED_y_BladeLn2Mesh, i), & ! ED%y%BladeLn2Mesh(i) + Active=CompElastED, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + end do + end do + + ! Nacelle Structural Controller + do j = 1, Turbine%SrvD%p(SrcMod%Ins)%NumNStC + call MapLoadMesh(Turbine, Mappings, & + SrcMod=SrcMod, & + SrcDL=DatLoc(SrvD_y_NStCLoadMesh, j), & ! SrvD%y%NStCLoadMesh(j), & + SrcDispDL=DatLoc(SrvD_u_NStCMotionMesh, j), & ! SrvD%u%NStCMotionMesh(j) + DstMod=DstMod, & + DstDL=DatLoc(ED_u_NacelleLoads), & ! ED%u%NacelleLoads + DstDispDL=DatLoc(ED_y_NacelleMotion), & ! ED%y%NacelleMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + end do + + ! Tower Structural Controller + do j = 1, Turbine%SrvD%p(SrcMod%Ins)%NumTStC + call MapLoadMesh(Turbine, Mappings, & + SrcMod=SrcMod, & + SrcDL=DatLoc(SrvD_y_TStCLoadMesh, j), & ! SrvD%y%TStCLoadMesh(j), & + SrcDispDL=DatLoc(SrvD_u_TStCMotionMesh, j), & ! SrvD%u%TStCMotionMesh(j) + DstMod=DstMod, & + DstDL=DatLoc(ED_u_TowerPtLoads), & ! ED%u%TowerLoads + DstDispDL=DatLoc(ED_y_TowerLn2Mesh), & ! ED%y%TowerLn2Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + end do + + ! Substructure Structural Controller + do j = 1, Turbine%SrvD%p(SrcMod%Ins)%NumSStC + call MapLoadMesh(Turbine, Mappings, & + SrcMod=SrcMod, & + SrcDL=DatLoc(SrvD_y_SStCLoadMesh, j), & ! SrvD%y%SStCLoadMesh(j), & + SrcDispDL=DatLoc(SrvD_u_SStCMotionMesh, j), & ! SrvD%u%SStCMotionMesh(j) + DstMod=DstMod, & + DstDL=DatLoc(ED_u_PlatformPtMesh), & ! ED%u%PlatformPtMesh + DstDispDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + Active=Turbine%p_FAST%CompSub /= Module_SD, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + end do + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_SED(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_SED' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j + + ErrStat = ErrID_None + ErrMsg = '' + + ! Select based on source module identifier + select case (SrcMod%ID) + + case (Module_AD) + + ! Blade Loads + do i = 1, size(Turbine%AD%y%rotors(SrcMod%Ins)%BladeLoad) + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(AD_y_BladeLoad, i), & ! AD%y%rotors(SrcMod%Ins)%BladeLoad(i) + SrcDispDL=DatLoc(AD_u_BladeMotion, i), & ! AD%u%rotors(SrcMod%Ins)%BladeMotion(i) + DstDL=DatLoc(SED_u_HubPtLoad), & ! SED%u%HubPtLoad + DstDispDL=DatLoc(SED_y_HubPtMotion), & ! SED%y%HubPtMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + end do + + case (Module_ADsk) + + ! Hub Loads + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ADsk_y_AeroLoads), & ! ADsk%y%AeroLoads + SrcDispDL=DatLoc(ADsk_u_HubMotion), & ! ADsk%u%HubMotion + DstDL=DatLoc(SED_u_HubPtLoad), & ! SED%u%HubPtLoad + DstDispDL=DatLoc(SED_y_HubPtMotion), & ! SED%y%HubPtMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Module_SrvD) + + call MapCustom(Mappings, Custom_SrvD_to_SED, SrcMod, DstMod) + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_ExtInfw(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_ExtInfw' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + + case (Module_AD) + call MapCustom(Mappings, Custom_AD_to_ExtInfw, SrcMod, DstMod) + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_ExtLd(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_ExtLd' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, k, iBld + logical :: CompElastED + + ErrStat = ErrID_None + ErrMsg = '' + + ! Flag is true if CompElast == Module_ED + CompElastED = Turbine%p_FAST%CompElast == Module_ED + + select case (SrcMod%ID) + case (Module_AD) + + ! Blade Loads + do i = 1, size(Turbine%AD%y%rotors(SrcMod%Ins)%BladeLoad) + call MapLoadMesh(Turbine, Mappings, & + SrcMod=SrcMod, & + SrcDL=DatLoc(AD_y_BladeLoad, i), & ! AD%y%rotors(SrcMod%Ins)%BladeLoad(i) + SrcDispDL=DatLoc(AD_u_BladeMotion, i), & ! AD%u%rotors(SrcMod%Ins)%BladeMotion(i) + DstMod=DstMod, & + DstDL=DatLoc(ExtLd_u_BladeLoadAD, i), & ! ExtLd%u%BladeLoadAD(i) + DstDispDL=DatLoc(ExtLd_u_BladeMotion, i), & ! ExtLd%u%BladeMotion(i) + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + end do + + ! Tower Loads + call MapLoadMesh(Turbine, Mappings, & + SrcMod=SrcMod, & + SrcDL=DatLoc(AD_y_TowerLoad), & ! AD%y%rotors(SrcMod%Ins)%TowerLoad + SrcDispDL=DatLoc(AD_u_TowerMotion), & ! AD%u%rotors(SrcMod%Ins)%TowerMotion + DstMod=DstMod, & + DstDL=DatLoc(ExtLd_u_TowerLoadAD), & ! ExtLd%u%TowerLoadAD + DstDispDL=DatLoc(ExtLd_u_TowerMotion), & ! ExtLd%u%TowerMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + + case (Module_BD) + + ! Blade motion + iBld = Turbine%p_FAST%BDBldMap(SrcMod%Ins) + call MapMotionMesh(Turbine, Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(BD_y_BldMotion), & ! BD%y(SrcMod%Ins)%BldMotion + DstMod=DstMod, DstDL=DatLoc(ExtLd_u_BladeMotion, iBld), & ! ExtLd%u%BladeMotion(iBld) + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if(Failed()) return + + case (Module_ED) + + call MapCustom(Mappings, Custom_ED_to_ExtLd, SrcMod, DstMod) + + ! Blade motion + do i = 1, Turbine%ED%p(SrcMod%Ins)%NumBl + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_BladeLn2Mesh, i), & ! ED%y%BladeLn2Mesh(i) + DstDL=DatLoc(ExtLd_u_BladeMotion, i), & ! ExtLd%u%BladeMotion(i) + Active=CompElastED, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if(Failed()) return + end do + + ! Blade root motion + do i = 1, Turbine%ED%p(SrcMod%Ins)%NumBl + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_BladeRootMotion, i), & ! ED%y%BladeRootMotion(i) + DstDL=DatLoc(ExtLd_u_BladeRootMotion, i), & ! ExtLd%u%BladeRootMotion(i) + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if(Failed()) return + end do + + ! Tower motion + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_TowerLn2Mesh), & ! ED%y%TowerLn2Mesh + DstDL=DatLoc(ExtLd_u_TowerMotion), & ! ExtLd%u%TowerMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if(Failed()) return + + ! Hub motion + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_HubPtMotion), & ! ED%y%HubPtMotion + DstDL=DatLoc(ExtLd_u_HubMotion), & ! ExtLd%u%HubMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if(Failed()) return + + ! Nacelle motion + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_NacelleMotion), & ! ED%y%NacelleMotion + DstDL=DatLoc(ExtLd_u_NacelleMotion), & ! ExtLd%u%NacelleMotion + ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if(Failed()) return + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_ExtPtfm(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_ExtPtfm' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(ExtPtfm_u_PtfmMesh), & ! ExtPtfm%u%PtfmMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_HD) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(HydroDyn_y_Morison_Mesh), & + SrcDispDL=DatLoc(HydroDyn_u_Morison_Mesh), & + DstDL=DatLoc(ExtPtfm_u_FBMesh), & + DstDispDL=DatLoc(ExtPtfm_y_FBMesh), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(HydroDyn_y_WAMITMesh), & + SrcDispDL=DatLoc(HydroDyn_u_WAMITMesh), & + DstDL=DatLoc(ExtPtfm_u_FBMesh), & + DstDispDL=DatLoc(ExtPtfm_y_FBMesh), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + if ( Turbine%ExtPtfm%p%nCB>0_IntKi) then + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(HydroDyn_y_FAddDOF), & + DstMod=DstMod, DstDL=DatLoc(ExtPtfm_u_Fm), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + end if + + case (Module_MD) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(MD_y_CoupledLoads, 1), & ! MD%y%CoupledLoads(1) + SrcDispDL=DatLoc(MD_u_CoupledKinematics, 1), & ! MD%u%CoupledKinematics(1) + DstDL=DatLoc(ExtPtfm_u_ConnLDMesh), & ! ExtPtfm%u%ConnLDMesh + DstDispDL=DatLoc(ExtPtfm_y_ConnMesh), & ! ExtPtfm%y%ConnMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_MAP) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(MAP_y_ptFairleadLoad), & ! MAP%y%PtFairleadLoad + SrcDispDL=DatLoc(MAP_u_PtFairDisplacement), & ! MAP%u%PtFairDisplacement + DstDL=DatLoc(ExtPtfm_u_ConnLDMesh), & ! ExtPtfm%u%ConnLDMesh + DstDispDL=DatLoc(ExtPtfm_y_ConnMesh), & ! ExtPtfm%y%ConnMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_FEAM) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(FEAM_y_PtFairleadLoad), & ! FEAM%y%PtFairleadLoad, & + SrcDispDL=DatLoc(FEAM_u_PtFairleadDisplacement), & ! FEAM%u%PtFairleadDisplacement + DstDL=DatLoc(ExtPtfm_u_ConnLDMesh), & ! ExtPtfm%u%ConnLDMesh + DstDispDL=DatLoc(ExtPtfm_y_ConnMesh), & ! ExtPtfm%y%ConnMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_FEAM(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_FEAM' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(FEAM_u_PtFairleadDisplacement), & ! FEAM%u%PtFairleadDisplacement + Active=Turbine%p_FAST%CompSub == Module_None, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_SD) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y3Mesh), & ! SD%y%y3Mesh + DstDL=DatLoc(FEAM_u_PtFairleadDisplacement), & ! FEAM%u%PtFairleadDisplacement + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_ExtPtfm) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtPtfm_y_ConnMesh), & ! ExtPtfm_y_ConnMesh + DstDL=DatLoc(FEAM_u_PtFairleadDisplacement), & ! MD%u%CoupledKinematics(1) + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_HD(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_HD' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(HydroDyn_u_PRPMesh), & ! HD%u%PRPMesh + Active=Turbine%p_FAST%CompSub == Module_None, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(HydroDyn_u_Morison_Mesh), & ! HD%u%Morison%Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=Turbine%p_FAST%CompSub == Module_None); if(Failed()) return + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(HydroDyn_u_WAMITMesh), & ! HD%u%WAMITMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=Turbine%p_FAST%CompSub == Module_None); if(Failed()) return + + case (Module_SeaSt) + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(SeaSt_y_WaveElev0), & + DstMod=DstMod, DstDL=DatLoc(HydroDyn_u_WaveElev0), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2, & + Active=Turbine%p_FAST%Linearize); if (Failed()) return + + case (Module_SD) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y0Mesh), & ! SD%y%Y0Mesh + DstDL=DatLoc(HydroDyn_u_PRPMesh), & ! HD%u%PRPMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y2Mesh), & ! SD%y%Y2Mesh + DstDL=DatLoc(HydroDyn_u_Morison_Mesh), & ! HD%u%Morison%Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y2Mesh), & ! SD%y%Y2Mesh + DstDL=DatLoc(HydroDyn_u_WAMITMesh), & ! HD%u%WAMITMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_ExtPtfm) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtPtfm_y_FBMesh), & ! ExtPtfm%y%FBMesh + DstDL=DatLoc(HydroDyn_u_PRPMesh), & ! HD%u%PRPMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtPtfm_y_FBMesh), & ! ExtPtfm%y%FBMesh + DstDL=DatLoc(HydroDyn_u_Morison_Mesh), & ! HD%u%Morison%Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtPtfm_y_FBMesh), & ! ExtPtfm%y%FBMesh + DstDL=DatLoc(HydroDyn_u_WAMITMesh), & ! HD%u%WAMITMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + if ( Turbine%HD%p%HasAddDOF ) then + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ExtPtfm_y_qm), & + DstMod=DstMod, DstDL=DatLoc(HydroDyn_u_qAddDOF), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ExtPtfm_y_qmdot), & + DstMod=DstMod, DstDL=DatLoc(HydroDyn_u_qAddDOFDot), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ExtPtfm_y_qmdotdot), & + DstMod=DstMod, DstDL=DatLoc(HydroDyn_u_qAddDOFDotDot), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + end if + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_IceD(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_IceD' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(IceD_u_PointMesh), & ! IceD%u%PointMesh + Active=Turbine%p_FAST%CompSub /= Module_SD, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_SD) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y3Mesh), & ! SD%y%y3Mesh + DstDL=DatLoc(IceD_u_PointMesh), & ! IceD%u%PointMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_IceF(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_IceF' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(IceFloe_u_iceMesh), & ! IceFloe%u%iceMesh + Active=Turbine%p_FAST%CompSub /= Module_SD, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_SD) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y3Mesh), & ! SD%y%y3Mesh + DstDL=DatLoc(IceFloe_u_iceMesh), & ! IceFloe%u%iceMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_IfW(Mappings, SrcMod, DstMod, T, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_IfW' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + case (Module_SED) + call MapCustom(Mappings, Custom_SED_to_IfW, SrcMod, DstMod) + case (Module_ED) + call MapCustom(Mappings, Custom_ED_to_IfW, SrcMod, DstMod) + case (Module_SrvD) + call MapCustom(Mappings, Custom_SrvD_to_IfW, SrcMod, DstMod) + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_MAP(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_MAP' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(MAP_u_PtFairDisplacement), & ! MAPp%u%PtFairDisplacement + Active=Turbine%p_FAST%CompSub == Module_None, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_SD) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y3Mesh), & ! SD%y%y3Mesh + DstDL=DatLoc(MAP_u_PtFairDisplacement), & ! MAPp%u%PtFairDisplacement + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_ExtPtfm) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtPtfm_y_ConnMesh), & ! ExtPtfm_y_ConnMesh + DstDL=DatLoc(MAP_u_PtFairDisplacement), & ! MD%u%CoupledKinematics(1) + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_MD(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_MD' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(MD_u_CoupledKinematics, 1), & ! MD%u%CoupledKinematics(1) + Active=Turbine%p_FAST%CompSub == Module_None, & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_SD) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y3Mesh), & ! SD%y%y3Mesh + DstDL=DatLoc(MD_u_CoupledKinematics, 1), & ! MD%u%CoupledKinematics(1) + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_ExtPtfm) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ExtPtfm_y_ConnMesh), & ! ExtPtfm%y%ConnMesh + DstDL=DatLoc(MD_u_CoupledKinematics, 1), & ! MD%u%CoupledKinematics(1) + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_SrvD) + + call MapCustom(Mappings, Custom_SrvD_to_MD, SrcMod, DstMod) + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_Orca(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_Orca' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(Orca_u_PtfmMesh), & ! Orca%u%PtfmMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_SD(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_SD' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + + case (Module_ED) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(SD_u_TPMesh, SrcMod%Ins), & ! SD%u%TPMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_FEAM) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(FEAM_y_PtFairleadLoad), & ! FEAM%y%PtFairleadLoad, & + SrcDispDL=DatLoc(FEAM_u_PtFairleadDisplacement), & ! FEAM%u%PtFairleadDisplacement + DstDL=DatLoc(SD_u_LMesh), & ! SD%u%LMesh + DstDispDL=DatLoc(SD_y_y3Mesh), & ! SD%y%y3Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_HD) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(HydroDyn_y_Morison_Mesh), & ! HD%y%Morison%Mesh + SrcDispDL=DatLoc(HydroDyn_u_Morison_Mesh), & ! HD%u%Morison%Mesh + DstDL=DatLoc(SD_u_LMesh), & ! SD%u%LMesh + DstDispDL=DatLoc(SD_y_y2Mesh), & ! SD%y%y2Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(HydroDyn_y_WAMITMesh), & ! HD%y%WAMITMesh + SrcDispDL=DatLoc(HydroDyn_u_WAMITMesh), & ! HD%u%WAMITMesh + DstDL=DatLoc(SD_u_LMesh), & ! SD%u%LMesh + DstDispDL=DatLoc(SD_y_y2Mesh), & ! SD%y%y2Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_IceD) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(IceD_y_PointMesh), & ! IceD%y%PointMesh + SrcDispDL=DatLoc(IceD_u_PointMesh), & ! IceD%u%PointMesh + DstDL=DatLoc(SD_u_LMesh), & ! SD%u%LMesh + DstDispDL=DatLoc(SD_y_y3Mesh), & ! SD%y%y3Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_IceF) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(IceFloe_y_iceMesh), & ! IceFloe%y%iceMesh + SrcDispDL=DatLoc(IceFloe_u_iceMesh), & ! IceFloe%u%iceMesh + DstDL=DatLoc(SD_u_LMesh), & ! SD%u%LMesh + DstDispDL=DatLoc(SD_y_y3Mesh), & ! SD%y%y3Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_MAP) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(MAP_y_ptFairleadLoad), & ! MAP%y%PtFairleadLoad + SrcDispDL=DatLoc(MAP_u_PtFairDisplacement), & ! MAP%u%PtFairDisplacement + DstDL=DatLoc(SD_u_LMesh), & ! SD%u%LMesh + DstDispDL=DatLoc(SD_y_y3Mesh), & ! SD%y%y3Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_MD) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(MD_y_CoupledLoads, 1), & ! MD%y%CoupledLoads(1) + SrcDispDL=DatLoc(MD_u_CoupledKinematics, 1), & ! MD%u%CoupledKinematics(1) + DstDL=DatLoc(SD_u_LMesh), & ! SD%u%LMesh + DstDispDL=DatLoc(SD_y_y3Mesh), & ! SD%y%y3Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_SlD) + + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SlD_y_SoilMesh), & ! SlD%y%SoilMesh + SrcDispDL=DatLoc(SlD_u_SoilMesh), & ! SlD%u%SoilMesh + DstDL=DatLoc(SD_u_LMesh), & ! SD%u%LMesh + DstDispDL=DatLoc(SD_y_y3Mesh), & ! SD%y%y3Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_SrvD) + + call MapCustom(Mappings, Custom_SrvD_to_SD, SrcMod, DstMod) + + ! Substructure Structural Controller + do j = 1, Turbine%SrvD%p(SrcMod%Ins)%NumSStC + call MapLoadMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SrvD_y_SStCLoadMesh, j), & ! SrvD%y%SStCLoadMesh(j), & + SrcDispDL=DatLoc(SrvD_u_SStCMotionMesh, j), & ! SrvD%u%SStCMotionMesh(j) + DstDL=DatLoc(SD_u_LMesh), & ! SD%u%LMesh + DstDispDL=DatLoc(SD_y_y3Mesh), & ! SD%y%y3Mesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + end do + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_SeaSt(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_SeaSt' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + + ! No inputs to SeaState currently + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_SlD(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_SlD' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + + case (Module_SD) + + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_Y3Mesh), & ! SD%y%y3Mesh + DstDL=DatLoc(SlD_u_SoilMesh), & ! SlD%u%SoilMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine InitMappings_SrvD(Mappings, SrcMod, DstMod, Turbine, ErrStat, ErrMsg) + type(MappingType), allocatable :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'InitMappings_SrvD' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, iBld + + ErrStat = ErrID_None + ErrMsg = '' + + select case (SrcMod%ID) + + case (Module_BD) + + call MapCustom(Mappings, Custom_BD_to_SrvD, SrcMod, DstMod) + + ! Blade Structural Controller + iBld = Turbine%p_FAST%BDBldMap(SrcMod%Ins) + do i = 1, Turbine%SrvD%p(DstMod%Ins)%NumBStC + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(BD_y_BldMotion), & ! BD%y(SrcMod%Ins)%BldMotion + DstDL=DatLoc(SrvD_u_BStCMotionMesh, iBld, i), & ! SrvD%u%BStCMotionMesh(iBld,i) + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + end do + + case (Module_ED) + + call MapCustom(Mappings, Custom_ED_to_SrvD, SrcMod, DstMod) + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_BlPitch), & + DstMod=DstMod, DstDL=DatLoc(SrvD_u_BlPitch), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_BlPRate), & + DstMod=DstMod, DstDL=DatLoc(SrvD_u_BlPRate), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_Yaw), & + DstMod=DstMod, DstDL=DatLoc(SrvD_u_Yaw), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_YawRate), & + DstMod=DstMod, DstDL=DatLoc(SrvD_u_YawRate), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + call MapVariable(Mappings, & + SrcMod=SrcMod, SrcDL=DatLoc(ED_y_HSS_Spd), & + DstMod=DstMod, DstDL=DatLoc(SrvD_u_HSS_Spd), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + ! Nacelle Structural Controller + do j = 1, Turbine%SrvD%p(DstMod%Ins)%NumNStC + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_NacelleMotion), & ! ED%y%NacelleMotion + DstDL=DatLoc(SrvD_u_NStCMotionMesh, j), & ! SrvD%u%NStCMotionMesh(j) + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + end do + + ! Tower Structural Controller + do j = 1, Turbine%SrvD%p(DstMod%Ins)%NumTStC + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_TowerLn2Mesh), & ! ED%y%TowerMotion + DstDL=DatLoc(SrvD_u_TStCMotionMesh, j), & ! SrvD%u%TStCMotionMesh(j) + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + end do + + ! Blade Structural Controller (if ElastoDyn blades) + do j = 1, Turbine%SrvD%p(DstMod%Ins)%NumBStC + do i = 1, Turbine%ED%p(SrcMod%Ins)%NumBl + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_BladeLn2Mesh, i), & ! ED%y%BladeLn2Mesh(i) + DstDL=DatLoc(SrvD_u_BStCMotionMesh, i, j), & ! SrvD%u%BStCMotionMesh(i, j) + Active=(Turbine%p_FAST%CompElast == Module_ED), & + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + end do + end do + + ! Substructure Structural Controller (if not using SubDyn) + do j = 1, Turbine%SrvD%p(DstMod%Ins)%NumSStC + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(SrvD_u_SStCMotionMesh, j), & ! SrvD%u%SStCMotionMesh(j) + Active=(Turbine%p_FAST%CompSub /= Module_SD), & ! ED Substructure + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + end do + + ! Map ED platform motion to SrvD + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(ED_y_PlatformPtMesh), & ! ED%y%PlatformPtMesh + DstDL=DatLoc(SrvD_u_PtfmMotionMesh), & ! SrvD%u%PtfmMotionMesh + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + + case (Module_SED) + + call MapCustom(Mappings, Custom_SED_to_SrvD, SrcMod=SrcMod, DstMod=DstMod) + + case (Module_IfW) + + call MapCustom(Mappings, Custom_IfW_to_SrvD, SrcMod=SrcMod, DstMod=DstMod) + + case (Module_SD) + + ! Substructure Structural Controller + do j = 1, Turbine%SrvD%p(DstMod%Ins)%NumSStC + call MapMotionMesh(Turbine, Mappings, SrcMod=SrcMod, DstMod=DstMod, & + SrcDL=DatLoc(SD_y_y3Mesh), & ! SD%y%y3Mesh + DstDL=DatLoc(SrvD_u_SStCMotionMesh, j), & ! SrvD%u%SStCMotionMesh(j) + ErrStat=ErrStat2, ErrMsg=ErrMsg2); if(Failed()) return + end do + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine MapLoadMesh(Turbine, Mappings, SrcMod, SrcDL, SrcDispDL, & + DstMod, DstDL, DstDispDL, ErrStat, ErrMsg, Active) + type(FAST_TurbineType), target :: Turbine + type(MappingType), allocatable, intent(inout) :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(DatLoc), intent(in) :: SrcDL, DstDL + type(DatLoc), intent(in) :: SrcDispDL, DstDispDL + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + logical, optional, intent(in) :: Active + + character(*), parameter :: RoutineName = 'MapLoadMesh' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + type(MappingType) :: Mapping + type(MeshType), pointer :: SrcMesh, SrcDispMesh + type(MeshType), pointer :: DstMesh, DstDispMesh + type(MeshType) :: DstMotionMesh + + ErrStat = ErrID_None + ErrMsg = '' + + ! If active argument is set to false, return + if (present(Active)) then + if (.not. Active) return + end if + + ! Get mesh pointers (DstDispMesh may be found in Input for some modules: ExtLd) + call FAST_OutputMeshPointer(SrcMod, Turbine, SrcDL, SrcMesh, ErrStat2, ErrMsg2); if (Failed()) return + call FAST_InputMeshPointer(SrcMod, Turbine, SrcDispDL, SrcDispMesh, INPUT_CURR, ErrStat2, ErrMsg2); if (Failed()) return + call FAST_InputMeshPointer(DstMod, Turbine, DstDL, DstMesh, INPUT_CURR, ErrStat2, ErrMsg2); if (Failed()) return + call FAST_OutputMeshPointer(DstMod, Turbine, DstDispDL, DstDispMesh, ErrStat2, ErrMsg2) + if (ErrStat2 == ErrID_Fatal) call FAST_InputMeshPointer(DstMod, Turbine, DstDispDL, DstDispMesh, INPUT_CURR, ErrStat2, ErrMsg2) + if (Failed()) return + + ! If any meshes aren't committed, return + if (.not. (SrcMesh%committed .and. DstMesh%committed .and. SrcDispMesh%committed .and. DstDispMesh%committed)) return + + ! Check that all meshes in mapping have nonzero identifiers + if (SrcMesh%ID == 0) then + call SetErrStat(ErrID_Fatal, 'SrcMesh "'//trim(FAST_OutputFieldName(SrcMod, SrcDL))//'" not in module variables', & + ErrStat, ErrMsg, RoutineName) + return + else if (SrcDispMesh%ID == 0) then + call SetErrStat(ErrID_Fatal, 'SrcDispMesh "'//trim(FAST_InputFieldName(SrcMod, SrcDispDL))//'" not in module variables', & + ErrStat, ErrMsg, RoutineName) + return + else if (DstMesh%ID == 0) then + call SetErrStat(ErrID_Fatal, 'DstMesh "'//trim(FAST_InputFieldName(DstMod, DstDL))//'" not in module variables', & + ErrStat, ErrMsg, RoutineName) + return + else if (DstDispMesh%ID == 0) then + call SetErrStat(ErrID_Fatal, 'DstDispMesh "'//trim(FAST_OutputFieldName(DstMod, DstDispDL))//'" not in module variables', & + ErrStat, ErrMsg, RoutineName) + return + end if + + ! Create mapping description + Mapping%Desc = trim(FAST_OutputFieldName(SrcMod, SrcDL))//" -> "// & + trim(FAST_InputFieldName(DstMod, DstDL))// & + " ["//trim(FAST_InputFieldName(SrcMod, SrcDispDL))// & + " @ "//trim(FAST_OutputFieldName(DstMod, DstDispDL))//"]" + + ! Initialize mapping structure + Mapping%MapType = Map_LoadMesh + Mapping%iModSrc = SrcMod%iMod + Mapping%SrcModID = SrcMod%ID + Mapping%SrcIns = SrcMod%Ins + Mapping%iModDst = DstMod%iMod + Mapping%DstModID = DstMod%ID + Mapping%DstIns = DstMod%Ins + Mapping%SrcDL = SrcDL + Mapping%SrcDispDL = SrcDispDL + Mapping%DstDL = DstDL + Mapping%DstDispDL = DstDispDL + Mapping%XfrType = MeshTransferType(SrcMesh, DstMesh) + + ! Create mesh mapping + call MeshMapCreate(SrcMesh, DstMesh, Mapping%MeshMap, ErrStat2, ErrMsg2); if (Failed()) return + + ! Create a copy of destination mesh in mapping for load summation + call MeshCopy(DstMesh, Mapping%TmpLoadMesh, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + + ! Set VF_Mapping on variables in this mapping + call SetMapVarFlags(Mapping, SrcMod, DstMod) + + ! If the destination displacement mesh is not a sibling of the load mesh + Mapping%DstUsesSibling = IsSiblingMesh(DstMesh, DstDispMesh) + if (.not. Mapping%DstUsesSibling) then + + ! Indicate non-sibling destination displacement mesh in description + Mapping%Desc = trim(Mapping%Desc)//'*' + + ! Create temporary motion mesh as cousin of load mesh, this will be used for an intermediate transfer + ! of the destination motion to the destination load locations + call MeshCopy(SrcMesh=DstMesh, & + DestMesh=Mapping%TmpMotionMesh, & + CtrlCode=MESH_COUSIN, & + IOS=COMPONENT_OUTPUT, & + TranslationDisp=.true., & + Orientation=.true., & + RotationVel=.true., & + TranslationVel=.true., & + RotationAcc=.true., & + TranslationAcc=.true., & + ErrStat=ErrStat2, & + ErrMess=ErrMsg2) + if (Failed()) return + + ! Determine transfer/linearization type for this auxiliary transfer + Mapping%XfrTypeAux = MeshTransferType(DstDispMesh, Mapping%TmpMotionMesh) + + ! Create motion mapping from destination displacement to temporary motion mesh + call MeshMapCreate(DstDispMesh, Mapping%TmpMotionMesh, Mapping%MeshMapAux, ErrStat2, ErrMsg2); if (Failed()) return + + end if + + ! Add mapping to array of mappings + call AppendMapping(Mappings, Mapping) + +contains + logical function Failed() + Failed = ErrStat2 >= AbortErrLev + if (Failed) call SetErrStat(ErrStat2, trim(ErrMsg2)//" ("//trim(Mapping%Desc)//")", ErrStat, ErrMsg, RoutineName) + end function + + ! IsSiblingMesh returns true if MeshB is a sibling of MeshA + ! (can't just check pointers as they won't match after restart, + ! also there can only be one sibling mesh so doesn't work for cousins) + pure logical function IsSiblingMesh(MeshA, MeshB) + type(MeshType), intent(in) :: MeshA, MeshB + integer(IntKi) :: i, j + IsSiblingMesh = .false. + if (MeshA%Nnodes /= MeshB%Nnodes) return + if (any(MeshA%Position /= MeshB%Position)) return + if (any(MeshA%RefOrientation /= MeshB%RefOrientation)) return + do i = 1, NELEMKINDS + if (MeshA%ElemTable(i)%nelem /= MeshB%ElemTable(i)%nelem) return + if (MeshA%ElemTable(i)%XElement /= MeshB%ElemTable(i)%XElement) return + do j = 1, MeshA%ElemTable(i)%nelem + if (any(MeshA%ElemTable(i)%Elements(j)%ElemNodes /= MeshB%ElemTable(i)%Elements(j)%ElemNodes)) return + end do + end do + IsSiblingMesh = .true. + end function +end subroutine + +subroutine MapMotionMesh(Turbine, Mappings, SrcMod, SrcDL, DstMod, DstDL, ErrStat, ErrMsg, Active) + type(FAST_TurbineType), target :: Turbine + type(MappingType), allocatable, intent(inout) :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(DatLoc), intent(in) :: SrcDL, DstDL + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + logical, optional, intent(in) :: Active + + character(*), parameter :: RoutineName = 'MapMotionMesh' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + type(MappingType) :: Mapping + type(MeshType), pointer :: SrcMesh, DstMesh + + ErrStat = ErrID_None + ErrMsg = '' + + ! If active argument is set to false, return + if (present(Active)) then + if (.not. Active) return + end if + + ! Get mesh pointers + call FAST_OutputMeshPointer(SrcMod, Turbine, SrcDL, SrcMesh, ErrStat2, ErrMsg2); if (Failed()) return + call FAST_InputMeshPointer(DstMod, Turbine, DstDL, DstMesh, INPUT_CURR, ErrStat2, ErrMsg2); if (Failed()) return + + ! If source or destination meshes aren't commited, return + if (.not. (SrcMesh%committed .and. DstMesh%committed)) return + + ! Check that all meshes in mapping have nonzero identifiers + if (SrcMesh%ID == 0) then + call SetErrStat(ErrID_Fatal, 'SrcMesh "'//trim(FAST_OutputFieldName(SrcMod, SrcDL))//'" not in module variables', & + ErrStat, ErrMsg, RoutineName) + return + else if (DstMesh%ID == 0) then + call SetErrStat(ErrID_Fatal, 'DstMesh "'//trim(FAST_InputFieldName(DstMod, DstDL))//'" not in module variables', & + ErrStat, ErrMsg, RoutineName) + return + end if + + ! Create mapping description + Mapping%Desc = trim(FAST_OutputFieldName(SrcMod, SrcDL))//" -> "// & + trim(FAST_InputFieldName(DstMod, DstDL)) + + ! Initialize mapping structure + Mapping%MapType = Map_MotionMesh + Mapping%iModSrc = SrcMod%iMod + Mapping%SrcModID = SrcMod%ID + Mapping%SrcIns = SrcMod%Ins + Mapping%iModDst = DstMod%iMod + Mapping%DstModID = DstMod%ID + Mapping%DstIns = DstMod%Ins + Mapping%SrcDL = SrcDL + Mapping%DstDL = DstDL + Mapping%XfrType = MeshTransferType(SrcMesh, DstMesh) + + ! Set VF_Mapping on variables in this mapping + call SetMapVarFlags(Mapping, SrcMod, DstMod) + + ! Create mesh mapping + call MeshMapCreate(SrcMesh, DstMesh, Mapping%MeshMap, ErrStat2, ErrMsg2); if (Failed()) return + + ! Add mapping to array of mappings + call AppendMapping(Mappings, Mapping) + +contains + logical function Failed() + Failed = ErrStat2 >= AbortErrLev + if (Failed) call SetErrStat(ErrStat2, trim(ErrMsg2)//" ("//trim(Mapping%Desc)//")", ErrStat, ErrMsg, RoutineName) + end function +end subroutine + +subroutine MapVariable(Mappings, SrcMod, SrcDL, DstMod, DstDL, ErrStat, ErrMsg, Active) + type(MappingType), allocatable, intent(inout) :: Mappings(:) + type(ModDataType), intent(inout) :: SrcMod, DstMod + type(DatLoc), intent(in) :: SrcDL, DstDL + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + logical, optional, intent(in) :: Active + type(MappingType) :: Mapping + integer(IntKi) :: iVarSrc, iVarDst + + ErrStat = ErrID_None + ErrMsg = '' + + if (present(Active)) then + if (.not. Active) return + end if + + ! Get source and destination variable indices + iVarSrc = MV_FindVarDatLoc(SrcMod%Vars%y, SrcDL) + iVarDst = MV_FindVarDatLoc(DstMod%Vars%u, DstDL) + + ! If either variable index is zero, return error + if (iVarSrc == 0) then + ErrStat = ErrID_Fatal + ErrMsg = "Source variable "//trim(Num2LStr(SrcDL%Num))//" in module '"//trim(SrcMod%Abbr)//"' is not active" + return + else if (iVarDst == 0) then + ErrStat = ErrID_Fatal + ErrMsg = "Destination variable "//trim(Num2LStr(DstDL%Num))//" in module '"//trim(DstMod%Abbr)//"' is not active" + return + end if + + ! Create mapping description + Mapping%Desc = trim(FAST_OutputFieldName(SrcMod, SrcDL))//" -> "// & + trim(FAST_InputFieldName(DstMod, DstDL)) + + ! Verify that variables have compatible sizes + ! If source variable has size 1, it can be mapped to multiple destination variables + if ((SrcMod%Vars%y(iVarSrc)%Num > 1) .and. & + (SrcMod%Vars%y(iVarSrc)%Num /= DstMod%Vars%u(iVarDst)%Num)) then + ErrStat = ErrID_Fatal + ErrMsg = "Variables in mapping '"//trim(Mapping%Desc)//"' have incompatible sizes" + return + end if + + ! Initialize mapping structure + Mapping%MapType = Map_Variable + Mapping%iModSrc = SrcMod%iMod + Mapping%iModDst = DstMod%iMod + Mapping%SrcModID = SrcMod%ID + Mapping%DstModID = DstMod%ID + Mapping%SrcIns = SrcMod%Ins + Mapping%DstIns = DstMod%Ins + Mapping%SrcDL = SrcDL + Mapping%DstDL = DstDL + + ! Set VF_Mapping on variables in this mapping + call SetMapVarFlags(Mapping, SrcMod, DstMod) + + ! Copy source and destination variables and modify for packing/unpacking + Mapping%SrcVar = SrcMod%Vars%y(iVarSrc) + Mapping%DstVar = DstMod%Vars%u(iVarDst) + Mapping%SrcVar%iLoc = [1, Mapping%SrcVar%Num] + Mapping%DstVar%iLoc = [1, Mapping%DstVar%Num] + + ! Allocate variable data storage + call AllocAry(Mapping%VarData, max(Mapping%SrcVar%Num, Mapping%DstVar%Num), "VarData", ErrStat, ErrMsg) + + ! Add mapping to array of mappings + call AppendMapping(Mappings, Mapping) +end subroutine + +!> MapCustom creates a custom mapping that is not included in linearization. +!! Each custom mapping needs an entry in FAST_InputSolve to actually perform the transfer. +subroutine MapCustom(Mappings, Desc, SrcMod, DstMod, i, DstDL, Active) + type(MappingType), allocatable, intent(inout) :: Mappings(:) + character(*), intent(in) :: Desc + type(ModDataType), intent(inout) :: SrcMod, DstMod + integer(IntKi), optional, intent(in) :: i + type(DatLoc), optional, intent(in) :: DstDL + logical, optional, intent(in) :: Active + type(MappingType) :: Mapping + + if (present(Active)) then + if (.not. Active) return + end if + + ! Initialize mapping structure + Mapping%Desc = Desc + Mapping%MapType = Map_Custom + Mapping%iModSrc = SrcMod%iMod + Mapping%iModDst = DstMod%iMod + Mapping%SrcModID = SrcMod%ID + Mapping%DstModID = DstMod%ID + Mapping%SrcIns = SrcMod%Ins + Mapping%DstIns = DstMod%Ins + if (present(i)) Mapping%i = i + if (present(DstDL)) Mapping%DstDL = DstDL + + ! Add mapping to array of mappings + call AppendMapping(Mappings, Mapping) +end subroutine + +! Append mapping to array of mappings +subroutine AppendMapping(Mappings, Mapping) + type(MappingType), allocatable, intent(inout) :: Mappings(:) + type(MappingType), intent(in) :: Mapping + type(MappingType), allocatable :: MappingsTmp(:) + + if (allocated(Mappings)) then + call move_alloc(Mappings, MappingsTmp) + allocate(Mappings(size(MappingsTmp) + 1)) + Mappings(:size(MappingsTmp)) = MappingsTmp + Mappings(size(Mappings)) = Mapping + else + allocate(Mappings(1), source=Mapping) + end if +end subroutine + +subroutine SetMapVarFlags(Mapping, SrcMod, DstMod) + type(MappingType), intent(in) :: Mapping + type(ModDataType), intent(inout) :: SrcMod, DstMod + integer(IntKi) :: i + + ! Set mapping flag on source variables + do i = 1, size(SrcMod%Vars%y) + associate (Var => SrcMod%Vars%y(i)) + if (MV_EqualDL(Mapping%SrcDL, Var%DL)) call MV_SetFlags(Var, VF_Mapping) + end associate + end do + + ! Set mapping flag on destination variables + do i = 1, size(DstMod%Vars%u) + associate (Var => DstMod%Vars%u(i)) + if (MV_EqualDL(Mapping%DstDL, Var%DL)) call MV_SetFlags(Var, VF_Mapping) + end associate + end do + + ! If this a load mesh mapping + if (Mapping%MapType == Map_LoadMesh) then + + ! Set mapping flag on source displacement mesh variables + do i = 1, size(SrcMod%Vars%u) + associate (Var => SrcMod%Vars%u(i)) + if (MV_EqualDL(Mapping%SrcDispDL, Var%DL)) then + select case (Var%Field) + case (FieldTransDisp) + call MV_SetFlags(Var, VF_Mapping) + end select + end if + end associate + end do + + ! Set mapping flag on destination displacement mesh variables + do i = 1, size(DstMod%Vars%y) + associate (Var => DstMod%Vars%y(i)) + if (MV_EqualDL(Mapping%DstDispDL, Var%DL)) then + select case (Var%Field) + case (FieldTransDisp, FieldOrientation) + call MV_SetFlags(Var, VF_Mapping) + end select + end if + end associate + end do + end if + +end subroutine + +function MeshTransferType(SrcMesh, DstMesh) result(XfrType) + type(MeshType), intent(in) :: SrcMesh, DstMesh + integer(IntKi) :: XfrType + if ((SrcMesh%ElemTable(ELEMENT_POINT)%nelem > 0) .and. (DstMesh%ElemTable(ELEMENT_POINT)%nelem > 0)) then + XfrType = Xfr_Point_to_Point + else if ((SrcMesh%ElemTable(ELEMENT_POINT)%nelem > 0) .and. (DstMesh%ElemTable(ELEMENT_LINE2)%nelem > 0)) then + XfrType = Xfr_Point_to_Line2 + else if ((SrcMesh%ElemTable(ELEMENT_LINE2)%nelem > 0) .and. (DstMesh%ElemTable(ELEMENT_POINT)%nelem > 0)) then + XfrType = Xfr_Line2_to_Point + else if ((SrcMesh%ElemTable(ELEMENT_LINE2)%nelem > 0) .and. (DstMesh%ElemTable(ELEMENT_LINE2)%nelem > 0)) then + XfrType = Xfr_Line2_to_Line2 + else + XfrType = Xfr_Invalid + end if +end function + +subroutine FAST_LinearizeMappings(ModGlue, Mappings, Turbine, ErrStat, ErrMsg) + type(ModGlueType), intent(inout) :: ModGlue !< Glue module data + type(MappingType), intent(inout) :: Mappings(:) !< Variable mappings + type(FAST_TurbineType), target, intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_LinearizeMappings' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: iGluSrc(2), iGluDst(2), nLocSrc, nLocDst + integer(IntKi) :: i, j, k + type(MeshType), pointer :: SrcMesh, DstMesh + type(MeshType), pointer :: SrcDispMesh, DstDispMesh + + ErrStat = ErrID_None + ErrMsg = '' + + ! Exit function if dUdy and dUdu aren't allocated + if (.not. (allocated(ModGlue%Lin%dUdy) .and. allocated(ModGlue%Lin%dUdu))) return + + ! Initialize dUdy to zero + ModGlue%Lin%dUdy = 0.0_R8Ki + + ! Initialize dUdu to identity matrix + call Eye2D(ModGlue%Lin%dUdu, ErrStat2, ErrMsg2); if (Failed()) return + + ! Loop through variable maps + do i = 1, size(ModGlue%VarMaps) + + associate (ModMap => ModGlue%VarMaps(i), & + Mapping => Mappings(ModGlue%VarMaps(i)%iMapping), & + ModSrc => ModGlue%ModData(ModGlue%VarMaps(i)%iModSrc), & + ModDst => ModGlue%ModData(ModGlue%VarMaps(i)%iModDst)) + + ! Select based on type of mapping + select case (Mapping%MapType) + + case (Map_Variable) + + ! Get source and destination indices, skip if no variable index for either + if (ModMap%iVarSrc(1) == 0 .or. ModMap%iVarDst(1) == 0) cycle + iGluSrc = ModSrc%Vars%y(ModMap%iVarSrc(1))%iGlu + iGluDst = ModDst%Vars%u(ModMap%iVarDst(1))%iGlu + + ! Get number of source and destination locations + nLocSrc = iGluSrc(2) - iGluSrc(1) + 1 + nLocDst = iGluDst(2) - iGluDst(1) + 1 + + ! If source has multiple locations, destination must have same number, connect 1-to-1 + ! MapVariable checks that variables have same number if nLocSrc > 1 + if (nLocSrc > 1) then + do k = 0, nLocDst - 1 + ModGlue%Lin%dUdy(iGluDst(1) + k, iGluSrc(1) + k) = -1.0_R8Ki + end do + else if (nLocDst == 1) then + ! Source and destination have one location + ModGlue%Lin%dUdy(iGluDst(1), iGluSrc(1)) = -1.0_R8Ki + else + ! One source location to many destination locations + ModGlue%Lin%dUdy(iGluDst(1):iGluDst(2), iGluSrc(1)) = -1.0_R8Ki + end if + + case (Map_MotionMesh) + + ! Get source and destination meshes + call FAST_OutputMeshPointer(ModSrc, Turbine, Mapping%SrcDL, SrcMesh, ErrStat2, ErrMsg2); if (Failed()) return + call FAST_InputMeshPointer(ModDst, Turbine, Mapping%DstDL, DstMesh, INPUT_CURR, ErrStat2, ErrMsg2); if (Failed()) return + + ! Perform linearization based on transfer type + call LinearizeMeshTransfer(Mapping%XfrType, SrcMesh, DstMesh, Mapping%MeshMap); if (Failed()) return + + ! Copy linearization matrices to global dUdy matrix + call Assemble_dUdy_Motions(Mapping, ModMap, ModSrc%Vars, ModDst%Vars, ModGlue%Lin%dUdy) + + ! Copy linearization matrices to global dUdu matrix + call Assemble_dUdu_Motions(Mapping, ModMap, ModSrc%Vars, ModDst%Vars, ModGlue%Lin%dUdu) + + case (Map_LoadMesh) + + ! Get source and destination load meshes + call FAST_OutputMeshPointer(ModSrc, Turbine, Mapping%SrcDL, SrcMesh, ErrStat2, ErrMsg2); if (Failed()) return + call FAST_InputMeshPointer(ModDst, Turbine, Mapping%DstDL, DstMesh, INPUT_CURR, ErrStat2, ErrMsg2); if (Failed()) return + + ! Get source and destination displacement meshes (DstDispMesh must be in output) + call FAST_InputMeshPointer(ModSrc, Turbine, Mapping%SrcDispDL, SrcDispMesh, INPUT_CURR, ErrStat2, ErrMsg2); if (Failed()) return + call FAST_OutputMeshPointer(ModDst, Turbine, Mapping%DstDispDL, DstDispMesh, ErrStat2, ErrMsg2); if (Failed()) return + + ! If DstDispMesh is a sibling of DstMesh + if (Mapping%DstUsesSibling) then + + ! Linearize the load mesh transfer + call LinearizeMeshTransfer(Mapping%XfrType, SrcMesh, DstMesh, Mapping%MeshMap, SrcDispMesh, DstDispMesh); if (Failed()) return + + else + + ! Transfer destination displacement mesh to temporary motion mesh (cousin of destination load mesh) + call TransferMesh(Mapping%XfrTypeAux, DstDispMesh, Mapping%TmpMotionMesh, Mapping%MeshMapAux, ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + ! Linearize the motion mesh transfer + call LinearizeMeshTransfer(Mapping%XfrTypeAux, DstDispMesh, Mapping%TmpMotionMesh, Mapping%MeshMapAux); if (Failed()) return + + ! Linearize the load mesh transfer + call LinearizeMeshTransfer(Mapping%XfrType, SrcMesh, DstMesh, Mapping%MeshMap, SrcDispMesh, Mapping%TmpMotionMesh); if (Failed()) return + + end if + + ! Copy linearization matrices to global dUdy matrix + call Assemble_dUdy_Loads(Mapping, ModMap, ModSrc%Vars, ModDst%Vars, ModGlue%Lin%dUdy) + + ! Copy linearization matrices to global dUdu matrix + call Assemble_dUdu_Loads(Mapping, ModMap, ModSrc%Vars, ModDst%Vars, ModGlue%Lin%dUdu) + + end select + + end associate + + end do + +contains + + ! LinearizeMeshTransfer calls the specific linearization function based on + ! transfer type (Point_to_Point, Point_to_Line2, etc.) + subroutine LinearizeMeshTransfer(Typ, Src, Dst, MeshMap, SrcDisp, DstDisp) + integer(IntKi), intent(in) :: Typ + type(MeshType), intent(in) :: Src, Dst + type(MeshMapType), intent(inout) :: MeshMap + type(MeshType), optional, intent(in) :: SrcDisp, DstDisp + select case (Typ) + case (Xfr_Point_to_Point) + call Linearize_Point_to_Point(Src, Dst, MeshMap, ErrStat2, ErrMsg2, SrcDisp, DstDisp) + case (Xfr_Point_to_Line2) + call Linearize_Point_to_Line2(Src, Dst, MeshMap, ErrStat2, ErrMsg2, SrcDisp, DstDisp) + case (Xfr_Line2_to_Point) + call Linearize_Line2_to_Point(Src, Dst, MeshMap, ErrStat2, ErrMsg2, SrcDisp, DstDisp) + case (Xfr_Line2_to_Line2) + call Linearize_Line2_to_Line2(Src, Dst, MeshMap, ErrStat2, ErrMsg2, SrcDisp, DstDisp) + case default + ErrStat2 = ErrID_Fatal + ErrMsg2 = "LinearizeMeshTransfer: unknown transfer type: "//Num2LStr(Typ) + end select + end subroutine + + subroutine Assemble_dUdu_Motions(Mapping, ModMap, VarsSrc, VarsDst, dUdu) + type(MappingType), intent(in) :: Mapping + type(VarMapType), intent(in) :: ModMap + type(ModVarsType), intent(in) :: VarsSrc, VarsDst + real(R8Ki), intent(inout) :: dUdu(:, :) + + ! Effect of input Translation Displacement on input Translation Velocity + if (allocated(Mapping%MeshMap%dM%tv_uD)) then + call SumBlock(VarsDst%u, ModMap%iVarDst(FieldTransDisp), VarsDst%u, ModMap%iVarDst(FieldTransVel), Mapping%MeshMap%dM%tv_uD, dUdu) + end if + + ! Effect of input Translation Displacement on input Translation Acceleration + if (allocated(Mapping%MeshMap%dM%ta_uD)) then + call SumBlock(VarsDst%u, ModMap%iVarDst(FieldTransDisp), VarsDst%u, ModMap%iVarDst(FieldTransAcc), Mapping%MeshMap%dM%ta_uD, dUdu) + end if + + end subroutine + + subroutine Assemble_dUdu_Loads(Mapping, ModMap, VarsSrc, VarsDst, dUdu) + type(MappingType), intent(in) :: Mapping + type(VarMapType), intent(in) :: ModMap + type(ModVarsType), intent(in) :: VarsSrc, VarsDst + real(R8Ki), intent(inout) :: dUdu(:, :) + + ! Effect of input Translation Displacement on input Moments + if (allocated(Mapping%MeshMap%dM%M_uS)) then + call SumBlock(VarsSrc%u, ModMap%iVarSrcDisp(FieldTransDisp), VarsDst%u, ModMap%iVarDst(FieldMoment), Mapping%MeshMap%dM%M_uS, dUdu) + end if + end subroutine + + !> Assemble_dUdy_Loads assembles the linearization matrices for transfer of + !! load fields between two meshes. It sets the following block matrix, which + !! is the dUdy block for transfering output (source) mesh to the input + !! (destination) mesh : + !! M = -| M_li 0 | * M_mi | F^S | + !! | M_fm M_li | | M^S | + subroutine Assemble_dUdy_Loads(Mapping, ModMap, VarsSrc, VarsDst, dUdy) + type(MappingType), intent(inout) :: Mapping + type(VarMapType), intent(in) :: ModMap + type(ModVarsType), intent(in) :: VarsSrc, VarsDst + real(R8Ki), intent(inout) :: dUdy(:, :) + + ! Load identity + if (allocated(Mapping%MeshMap%dM%li)) then + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldForce), VarsDst%u, ModMap%iVarDst(FieldForce), Mapping%MeshMap%dM%li, dUdy) + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldMoment), VarsDst%u, ModMap%iVarDst(FieldMoment), Mapping%MeshMap%dM%li, dUdy) + end if + + ! Force to Moment + if (allocated(Mapping%MeshMap%dM%m_f)) then + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldForce), VarsDst%u, ModMap%iVarDst(FieldMoment), Mapping%MeshMap%dM%m_f, dUdy) + end if + + ! Destination Translation Displacement to Moment + if (allocated(Mapping%MeshMap%dM%m_uD)) then + if (Mapping%DstUsesSibling) then + ! Direct transfer + call SumBlock(VarsDst%y, ModMap%iVarDstDisp(FieldTransDisp), VarsDst%u, ModMap%iVarDst(FieldMoment), Mapping%MeshMap%dM%m_uD, dUdy) + else + ! Compose linearization of motion and loads + Mapping%TmpMatrix = matmul(Mapping%MeshMap%dM%m_uD, Mapping%MeshMapAux%dM%mi) + call SumBlock(VarsDst%y, ModMap%iVarDstDisp(FieldTransDisp), VarsDst%u, ModMap%iVarDst(FieldMoment), Mapping%TmpMatrix, dUdy) + Mapping%TmpMatrix = matmul(Mapping%MeshMap%dM%m_uD, Mapping%MeshMapAux%dM%fx_p) + call SumBlock(VarsDst%y, ModMap%iVarDstDisp(FieldOrientation), VarsDst%u, ModMap%iVarDst(FieldMoment), Mapping%TmpMatrix, dUdy) + end if + end if + end subroutine + + !> Assemble_dUdy_Motions assembles the linearization matrices for transfer of + !! motion fields between two meshes. It set the following block matrix, which + !! is the dUdy block for transfering output (source) mesh to the input + !! (destination) mesh : + !! M = -| M_mi M_f_p 0 0 0 0 | + !! | 0 M_mi 0 0 0 0 | + !! | M_tv_uS 0 M_mi M_f_p 0 0 | + !! | 0 0 0 M_mi 0 0 | + !! | M_ta_uS 0 0 M_ta_rv M_mi M_f_p | + !! | 0 0 0 0 0 M_mi | + !! where the matrices correspond to + !! u^S, theta^S, v^S, omega^S, a^S, alpha^S + subroutine Assemble_dUdy_Motions(Mapping, ModMap, VarsSrc, VarsDst, dUdy) + type(MappingType), intent(in) :: Mapping + type(VarMapType), intent(in) :: ModMap + type(ModVarsType), intent(in) :: VarsSrc, VarsDst + real(R8Ki), intent(inout) :: dUdy(:, :) + + ! Motion identity + if (allocated(Mapping%MeshMap%dM%mi)) then + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldTransDisp), VarsDst%u, ModMap%iVarDst(FieldTransDisp), Mapping%MeshMap%dM%mi, dUdy) + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldOrientation), VarsDst%u, ModMap%iVarDst(FieldOrientation), Mapping%MeshMap%dM%mi, dUdy) + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldTransVel), VarsDst%u, ModMap%iVarDst(FieldTransVel), Mapping%MeshMap%dM%mi, dUdy) + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldAngularVel), VarsDst%u, ModMap%iVarDst(FieldAngularVel), Mapping%MeshMap%dM%mi, dUdy) + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldTransAcc), VarsDst%u, ModMap%iVarDst(FieldTransAcc), Mapping%MeshMap%dM%mi, dUdy) + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldAngularAcc), VarsDst%u, ModMap%iVarDst(FieldAngularAcc), Mapping%MeshMap%dM%mi, dUdy) + end if + + ! Rotation to Translation + if (allocated(Mapping%MeshMap%dM%fx_p)) then + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldOrientation), VarsDst%u, ModMap%iVarDst(FieldTransDisp), Mapping%MeshMap%dM%fx_p, dUdy) + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldAngularVel), VarsDst%u, ModMap%iVarDst(FieldTransVel), Mapping%MeshMap%dM%fx_p, dUdy) + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldAngularAcc), VarsDst%u, ModMap%iVarDst(FieldTransAcc), Mapping%MeshMap%dM%fx_p, dUdy) + end if + + ! Translation displacement to Translation velocity + if (allocated(Mapping%MeshMap%dM%tv_us)) then + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldTransDisp), VarsDst%u, ModMap%iVarDst(FieldTransVel), Mapping%MeshMap%dM%tv_us, dUdy) + end if + + ! Translation displacement to Translation acceleration + if (allocated(Mapping%MeshMap%dM%ta_us)) then + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldTransDisp), VarsDst%u, ModMap%iVarDst(FieldTransAcc), Mapping%MeshMap%dM%ta_us, dUdy) + end if + + ! Angular velocity to Translation acceleration + if (allocated(Mapping%MeshMap%dM%ta_rv)) then + call SumBlock(VarsSrc%y, ModMap%iVarSrc(FieldAngularVel), VarsDst%u, ModMap%iVarDst(FieldTransAcc), Mapping%MeshMap%dM%ta_rv, dUdy) + end if + end subroutine + + subroutine SumBlock(VarArySrc, iVarSrc, VarAryDst, iVarDst, SrcM, DstM) + type(ModVarType), intent(in) :: VarArySrc(:), VarAryDst(:) + integer(IntKi), intent(in) :: iVarSrc, iVarDst + real(R8Ki), intent(in) :: SrcM(:, :) + real(R8Ki), intent(inout) :: DstM(:, :) + + ! If no variable index for source or destination, return + if (iVarDst == 0 .or. iVarSrc == 0) return + + ! Get pointers to source and destination locations + associate (iGluSrc => VarArySrc(iVarSrc)%iGlu, iGluDst => VarAryDst(iVarDst)%iGlu) + + ! Subtracts the source matrix from the destination sub-matrix + associate (DstSubM => DstM(iGluDst(1):iGluDst(2), iGluSrc(1):iGluSrc(2))) + DstSubM = DstSubM - SrcM + end associate + + end associate + end subroutine + + logical function Failed() + Failed = ErrStat2 >= AbortErrLev + if (Failed) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end function +end subroutine + +subroutine VarUnpackInput(ModData, Var, ValAry, T, iInput, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: ModData + type(ModVarType), intent(in) :: Var + real(R8Ki), intent(in) :: ValAry(:) + type(FAST_TurbineType), intent(inout) :: T !< Turbine data + integer(IntKi), intent(in) :: iInput + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + ErrStat = ErrID_None + ErrMsg = '' + select case (ModData%ID) + case (Module_AD) + call AD_VarUnpackInput(Var, ValAry, T%AD%Input(iInput)%rotors(ModData%Ins)) + case (Module_ADsk) + call ADsk_VarUnpackInput(Var, ValAry, T%ADsk%Input(iInput)) + case (Module_BD) + call BD_VarUnpackInput(Var, ValAry, T%BD%Input(iInput, ModData%Ins)) + case (Module_ED) + call ED_VarUnpackInput(Var, ValAry, T%ED%Input(iInput, ModData%Ins)) + case (Module_SED) + call SED_VarUnpackInput(Var, ValAry, T%SED%Input(iInput)) + case (Module_ExtLd) + call ExtLd_VarUnpackInput(Var, ValAry, T%ExtLd%u) + case (Module_ExtInfw) + call ExtInfw_VarUnpackInput(Var, ValAry, T%ExtInfw%u) + case (Module_ExtPtfm) + call ExtPtfm_VarUnpackInput(Var, ValAry, T%ExtPtfm%Input(iInput)) + case (Module_FEAM) + call FEAM_VarUnpackInput(Var, ValAry, T%FEAM%Input(iInput)) + case (Module_HD) + call HydroDyn_VarUnpackInput(Var, ValAry, T%HD%Input(iInput)) + case (Module_IceD) + call IceD_VarUnpackInput(Var, ValAry, T%IceD%Input(iInput, ModData%Ins)) + case (Module_IceF) + call IceFloe_VarUnpackInput(Var, ValAry, T%IceF%Input(iInput)) + case (Module_IfW) + call InflowWind_VarUnpackInput(Var, ValAry, T%IfW%Input(iInput)) + case (Module_MAP) + call MAP_VarUnpackInput(Var, ValAry, T%MAP%Input(iInput)) + case (Module_MD) + call MD_VarUnpackInput(Var, ValAry, T%MD%Input(iInput)) + case (Module_Orca) + call Orca_VarUnpackInput(Var, ValAry, T%Orca%Input(iInput)) + case (Module_SD) + call SD_VarUnpackInput(Var, ValAry, T%SD%Input(iInput)) + case (Module_SeaSt) + call SeaSt_VarUnpackInput(Var, ValAry, T%SeaSt%Input(iInput)) + case (Module_SrvD) + call SrvD_VarUnpackInput(Var, ValAry, T%SrvD%Input(iInput,ModData%Ins)) + case default + call SetErrStat(ErrID_Fatal, "Unsupported module: "//ModData%Abbr, ErrStat, ErrMsg, "VarPackInput") + end select +end subroutine + +subroutine VarPackOutput(ModData, Var, ValAry, T, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: ModData + type(ModVarType), intent(in) :: Var + real(R8Ki), intent(inout) :: ValAry(:) + type(FAST_TurbineType), intent(in) :: T !< Turbine data + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + ErrStat = ErrID_None + ErrMsg = '' + select case (ModData%ID) + case (Module_AD) + call AD_VarPackOutput(Var, T%AD%y%rotors(ModData%Ins), ValAry) + case (Module_ADsk) + call ADsk_VarPackOutput(Var, T%ADsk%y, ValAry) + case (Module_BD) + call BD_VarPackOutput(Var, T%BD%y(ModData%Ins), ValAry) + case (Module_ED) + call ED_VarPackOutput(Var, T%ED%y(ModData%Ins), ValAry) + case (Module_SED) + call SED_VarPackOutput(Var, T%SED%y, ValAry) + case (Module_ExtLd) + call ExtLd_VarPackOutput(Var, T%ExtLd%y, ValAry) + case (Module_ExtInfw) + call ExtInfw_VarPackOutput(Var, T%ExtInfw%y, ValAry) + case (Module_ExtPtfm) + call ExtPtfm_VarPackOutput(Var, T%ExtPtfm%y, ValAry) + case (Module_FEAM) + call FEAM_VarPackOutput(Var, T%FEAM%y, ValAry) + case (Module_HD) + call HydroDyn_VarPackOutput(Var, T%HD%y, ValAry) + case (Module_IceD) + call IceD_VarPackOutput(Var, T%IceD%y(ModData%Ins), ValAry) + case (Module_IceF) + call IceFloe_VarPackOutput(Var, T%IceF%y, ValAry) + case (Module_IfW) + call InflowWind_VarPackOutput(Var, T%IfW%y, ValAry) + case (Module_MAP) + call MAP_VarPackOutput(Var, T%MAP%y, ValAry) + case (Module_MD) + call MD_VarPackOutput(Var, T%MD%y, ValAry) + case (Module_Orca) + call Orca_VarPackOutput(Var, T%Orca%y, ValAry) + case (Module_SD) + call SD_VarPackOutput(Var, T%SD%y, ValAry) + case (Module_SeaSt) + call SeaSt_VarPackOutput(Var, T%SeaSt%y, ValAry) + case (Module_SrvD) + call SrvD_VarPackOutput(Var, T%SrvD%y(ModData%Ins), ValAry) + case default + call SetErrStat(ErrID_Fatal, "Unsupported module: "//ModData%Abbr, ErrStat, ErrMsg, "VarPackOutput") + end select +end subroutine + +subroutine FAST_InputSolve(iModDst, ModAry, MapAry, iInput, Turbine, ErrStat, ErrMsg, VarMapAry) + integer(IntKi), intent(in) :: iModDst !< Destination module index in module data array + type(ModDataType), intent(in) :: ModAry(:) !< Module data + type(MappingType), intent(inout) :: MapAry(:) !< Mesh and variable mappings + integer(IntKi), intent(in) :: iInput !< Input index to store data + type(FAST_TurbineType), target, intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + type(VarMapType), optional, intent(in) :: VarMapAry(:) + + character(*), parameter :: RoutineName = 'FAST_InputSolve' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = '' + + if (present(VarMapAry)) then + + ! Loop through mappings and zero load meshes before transfer + do i = 1, size(VarMapAry) + associate (Mapping => MapAry(VarMapAry(i)%iMapping)) + + ! Skip mappings where this isn't the destination module + if (iModDst /= Mapping%iModDst) cycle + + ! Skip mappings that are not ready + if (.not. Mapping%Ready) cycle + + ! Switch based on mapping type + select case (Mapping%MapType) + + ! If this is a load mesh mapping, clear the loads + case (Map_LoadMesh) + call ZeroDstLoadMesh(Mapping, ModAry(Mapping%iModDst)) + + ! If this is a custom mesh mapping and a destination mesh is specified, clear the loads + case (Map_Custom) + if (Mapping%DstDL%Num /= 0) call ZeroDstLoadMesh(Mapping, ModAry(Mapping%iModDst)) + + end select + + end associate + end do + + ! Loop through mappings and perform input solve + do i = 1, size(VarMapAry) + associate (Mapping => MapAry(VarMapAry(i)%iMapping)) + + ! Skip mappings where this isn't the destination module + if (iModDst /= VarMapAry(i)%iModDst) cycle + + ! Skip mappings that are not ready + if (.not. Mapping%Ready) cycle + + ! Perform input solve + call InputSolveMapping(MapAry(VarMapAry(i)%iMapping), ModAry(VarMapAry(i)%iModSrc), ModAry(VarMapAry(i)%iModDst)) + if (ErrStat >= AbortErrLev) return + end associate + end do + + else + + ! Loop through mappings and zero load meshes before transfer + do i = 1, size(MapAry) + + ! Skip mappings that are not ready + if (.not. MapAry(i)%Ready) cycle + + ! Skip mappings where this isn't the destination module + if (iModDst /= MapAry(i)%iModDst) cycle + + ! Switch based on mapping type + select case (MapAry(i)%MapType) + + ! If this is a load mesh mapping, clear the loads + case (Map_LoadMesh) + call ZeroDstLoadMesh(MapAry(i), ModAry(MapAry(i)%iModDst)) + + ! If this is a custom mesh mapping and a destination mesh is specified, clear the loads + case (Map_Custom) + if (MapAry(i)%DstDL%Num /= 0) call ZeroDstLoadMesh(MapAry(i), ModAry(MapAry(i)%iModDst)) + + end select + end do + + ! Loop through mappings and perform input solve + do i = 1, size(MapAry) + + ! Skip mappings where this isn't the destination module + if (iModDst /= MapAry(i)%iModDst) cycle + + ! Skip mappings that are not ready + if (.not. MapAry(i)%Ready) cycle + + ! Perform input solve + call InputSolveMapping(MapAry(i), ModAry(MapAry(i)%iModSrc), ModAry(MapAry(i)%iModDst)) + if (ErrStat >= AbortErrLev) return + end do + end if + +contains + + subroutine ZeroDstLoadMesh(Mapping, ModDst) + type(MappingType), intent(inout) :: Mapping + type(ModDataType), intent(in) :: ModDst + type(MeshType), pointer :: DstMesh + + ! Get pointer to destination load mesh + call FAST_InputMeshPointer(ModDst, Turbine, Mapping%DstDL, DstMesh, iInput, ErrStat2, ErrMsg2) + if (Failed()) return + + ! If mesh has force, set it to zero + if (DstMesh%fieldmask(MASKID_FORCE)) DstMesh%Force = 0.0_ReKi + + ! If mesh has moment, set it to zero + if (DstMesh%fieldmask(MASKID_MOMENT)) DstMesh%Moment = 0.0_ReKi + + end subroutine + + subroutine InputSolveMapping(Mapping, ModSrc, ModDst) + type(MappingType), intent(inout) :: Mapping + type(ModDataType), intent(in) :: ModSrc, ModDst + type(MeshType), pointer :: SrcMesh, DstMesh + type(MeshType), pointer :: SrcDispMesh, DstDispMesh + + ! Select based on type of mapping + select case (Mapping%MapType) + + case (Map_Custom) + + call Custom_InputSolve(Mapping, ModSrc, ModDst, iInput, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + case (Map_Variable) + + ! Pack module output value into array + call VarPackOutput(ModSrc, Mapping%SrcVar, Mapping%VarData, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + ! If fewer source values than destination values, copy first value to all values + if (Mapping%SrcVar%Num < Mapping%DstVar%Num) then + Mapping%VarData = Mapping%VarData(1) + end if + + ! Unpack array into module input + call VarUnpackInput(ModDst, Mapping%DstVar, Mapping%VarData, Turbine, iInput, ErrStat2, ErrMsg2) + if (Failed()) return + + case (Map_MotionMesh) + + ! Get source and destination meshes + call FAST_OutputMeshPointer(ModSrc, Turbine, Mapping%SrcDL, SrcMesh, ErrStat2, ErrMsg2) + if (Failed()) return + call FAST_InputMeshPointer(ModDst, Turbine, Mapping%DstDL, DstMesh, iInput, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Perform transfer based on type + call TransferMesh(Mapping%XfrType, SrcMesh, DstMesh, Mapping%MeshMap, ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + case (Map_LoadMesh) + + ! Get source and destination meshes + call FAST_OutputMeshPointer(ModSrc, Turbine, Mapping%SrcDL, SrcMesh, ErrStat2, ErrMsg2) + if (Failed()) return + call FAST_InputMeshPointer(ModDst, Turbine, Mapping%DstDL, DstMesh, iInput, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Get source and destination displacement meshes + ! Note: Displacement meshes always references current input index when in input + call FAST_InputMeshPointer(ModSrc, Turbine, Mapping%SrcDispDL, SrcDispMesh, INPUT_CURR, ErrStat2, ErrMsg2) + if (Failed()) return + call FAST_OutputMeshPointer(ModDst, Turbine, Mapping%DstDispDL, DstDispMesh, ErrStat2, ErrMsg2) + if (ErrStat2 == ErrID_Fatal) call FAST_InputMeshPointer(ModDst, Turbine, Mapping%DstDispDL, DstDispMesh, INPUT_CURR, ErrStat2, ErrMsg2) + if (Failed()) return + + ! If DstDispMesh is a sibling of DstMesh + if (Mapping%DstUsesSibling) then + + ! Transfer the load mesh to the temporary load mesh to be summed below + call TransferMesh(Mapping%XfrType, SrcMesh, Mapping%TmpLoadMesh, Mapping%MeshMap, SrcDispMesh, DstDispMesh, ErrStat2, ErrMsg2) + if (Failed()) return + + else + + ! Transfer destination displacement mesh to temporary motion mesh (cousin of destination load mesh) + call TransferMesh(Mapping%XfrTypeAux, DstDispMesh, Mapping%TmpMotionMesh, Mapping%MeshMapAux, ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + ! Transfer to temporary load mesh using the temporary motion mesh as the destination displacement mesh + call TransferMesh(Mapping%XfrType, SrcMesh, Mapping%TmpLoadMesh, Mapping%MeshMap, SrcDispMesh, Mapping%TmpMotionMesh, ErrStat2, ErrMsg2) + if (Failed()) return + + end if + + ! Sum loads from temporary mesh to destination mesh + if (DstMesh%fieldmask(MASKID_FORCE)) DstMesh%Force = DstMesh%Force + Mapping%TmpLoadMesh%Force + if (DstMesh%fieldmask(MASKID_MOMENT)) DstMesh%Moment = DstMesh%Moment + Mapping%TmpLoadMesh%Moment + + end select + + end subroutine + + logical function Failed() + Failed = ErrStat2 /= ErrID_None + if (Failed) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, & + RoutineName//':Module='//trim(ModAry(iModDst)%Abbr)// & + ', Instance='//Num2LStr(ModAry(iModDst)%Ins)) + end function +end subroutine + +! Reset mapping read flags +subroutine FAST_ResetMappingReady(MapAry) + type(MappingType), intent(inout) :: MapAry(:) !< Mesh and variable mappings + integer(IntKi) :: i + do i = 1, size(MapAry) + select case (MapAry(i)%SrcModID) + case (Module_ExtInfw) ! Modules always ready to transfer + MapAry(i)%Ready = .true. + case default ! Default to transfer is not ready + MapAry(i)%Ready = .false. + end select + end do +end subroutine + +! TransferMesh calls the specific transfer function based on +! transfer type (Point_to_Point, Point_to_Line2, etc.) +subroutine TransferMesh(Typ, Src, Dst, MeshMap, SrcDisp, DstDisp, ErrStat, ErrMsg) + integer(IntKi), intent(in) :: Typ + type(MeshType), intent(in) :: Src + type(MeshType), intent(inout) :: Dst + type(MeshMapType), intent(inout) :: MeshMap + type(MeshType), optional, intent(in) :: SrcDisp, DstDisp + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + select case (Typ) + case (Xfr_Point_to_Point) + call Transfer_Point_to_Point(Src, Dst, MeshMap, ErrStat, ErrMsg, SrcDisp, DstDisp) + case (Xfr_Point_to_Line2) + call Transfer_Point_to_Line2(Src, Dst, MeshMap, ErrStat, ErrMsg, SrcDisp, DstDisp) + case (Xfr_Line2_to_Point) + call Transfer_Line2_to_Point(Src, Dst, MeshMap, ErrStat, ErrMsg, SrcDisp, DstDisp) + case (Xfr_Line2_to_Line2) + call Transfer_Line2_to_Line2(Src, Dst, MeshMap, ErrStat, ErrMsg, SrcDisp, DstDisp) + case default + ErrStat = ErrID_Fatal + ErrMsg = "TransferMesh: unknown transfer type: "//Num2LStr(Typ) + end select +end subroutine + +subroutine Custom_InputSolve(Mapping, ModSrc, ModDst, iInput, T, ErrStat, ErrMsg) + type(MappingType), intent(inout) :: Mapping + type(ModDataType), intent(in) :: ModSrc, ModDst + integer(IntKi), intent(in) :: iInput + type(FAST_TurbineType), intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'Custom_InputSolve' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, k, iRot, iBld + + real(R8Ki) :: omega_c(3) + real(R8Ki) :: r(3), r_hub(3) + real(R8Ki) :: Vrot(3), Vel(3) + real(R8Ki) :: DampingForce(3) + + ErrStat = ErrID_None + ErrMsg = '' + + ! Select based on mapping description + select case (Mapping%Desc) + +!------------------------------------------------------------------------------- +! AeroDyn Inputs +!------------------------------------------------------------------------------- + + case (Custom_ExtInfw_to_AD) + + ! ExtInfw updates the flow field used by InflowWind and AeroDyn so consider that an + ! input to InflowWind and perform the update during InflowWind's input solve + call ExtInfw_UpdateFlowField(T%p_FAST, T%ExtInfw, ErrStat2, ErrMsg2) + if (ErrStat >= AbortErrLev) return + + case (Custom_SrvD_to_AD) + + ! Set Control parameter (i.e. flaps) if using ServoDyn bem: + ! This takes in flap deflection for each blade (only one flap deflection angle per blade), + ! from ServoDyn (which comes from Bladed style DLL controller) + ! Commanded Airfoil UserProp for blade (must be same units as given in AD15 airfoil tables) + ! This is passed to AD15 to be interpolated with the airfoil table userprop column + ! (might be used for airfoil flap angles for example) + ! Must be same units as given in airfoil (no unit conversions handled in code)ß + do i = 1, size(T%AD%Input(iInput)%rotors(ModDst%Ins)%UserProp, dim=2) ! Blade + T%AD%Input(iInput)%rotors(ModDst%Ins)%UserProp(:, i) = T%SrvD%y(ModSrc%Ins)%BlAirfoilCom(i) + end do + +!------------------------------------------------------------------------------- +! ADsk Inputs +!------------------------------------------------------------------------------- + + case (Custom_ED_to_ADsk) + + T%ADsk%Input(iInput)%RotSpeed = T%ED%y(ModSrc%Ins)%RotSpeed + T%ADsk%Input(iInput)%BlPitch = T%ED%y(ModSrc%Ins)%BlPitch(1) ! ADsk only uses collective blade pitch + + case (Custom_SED_to_ADsk) + + T%ADsk%Input(iInput)%RotSpeed = T%SED%y%RotSpeed + T%ADsk%Input(iInput)%BlPitch = T%SED%y%BlPitch(1) ! ADsk only uses collective blade pitch + +!------------------------------------------------------------------------------- +! BeamDyn Inputs +!------------------------------------------------------------------------------- + + case (Custom_BD_Blade_Damping) + + ! Get rotational velocity and current hub position + omega_c = T%ED%y(ModSrc%iRotor)%RotSpeed * T%ED%y(ModSrc%iRotor)%HubPtMotion%Orientation(1,:,1) + r_hub = T%ED%y(ModSrc%iRotor)%HubPtMotion%Position(:,1) + T%ED%y(ModSrc%iRotor)%HubPtMotion%TranslationDisp(:,1) + + ! Get blade velocities at load mesh locations + call TransferMesh(Mapping%XfrType, T%BD%y(Mapping%DstIns)%BldMotion, Mapping%TmpMotionMesh, Mapping%MeshMap, ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + ! Remove rotor rotational velocity from node velocity + do i = 1, Mapping%TmpMotionMesh%Nnodes + r = Mapping%TmpMotionMesh%Position(:,i) + Mapping%TmpMotionMesh%TranslationDisp(:,i) - r_hub + Vrot = cross_product(omega_c, r) + Mapping%TmpMotionMesh%TranslationVel(:,i) = Mapping%TmpMotionMesh%TranslationVel(:,i) - Vrot + end do + + ! Apply damping force as Bld_Kdmp*(node velocity) + T%BD%Input(iInput, Mapping%DstIns)%PointLoad%Force = T%BD%Input(iInput, Mapping%DstIns)%PointLoad%Force - T%p_FAST%Bld_Kdmp * Mapping%TmpMotionMesh%TranslationVel + +!------------------------------------------------------------------------------- +! ElastoDyn Inputs +!------------------------------------------------------------------------------- + + case (Custom_SrvD_to_ED) + + T%ED%Input(iInput, ModDst%Ins)%GenTrq = T%SrvD%y(ModSrc%Ins)%GenTrq + T%ED%Input(iInput, ModDst%Ins)%HSSBrTrqC = T%SrvD%y(ModSrc%Ins)%HSSBrTrqC + T%ED%Input(iInput, ModDst%Ins)%BlPitchCom = T%SrvD%y(ModSrc%Ins)%BlPitchCom + T%ED%Input(iInput, ModDst%Ins)%BlPitchMom = T%SrvD%y(ModSrc%Ins)%BlPitchMom + T%ED%Input(iInput, ModDst%Ins)%YawMom = T%SrvD%y(ModSrc%Ins)%YawMom + + case (Custom_ED_Tower_Damping) + + ! Get tower velocities at load mesh locations + call TransferMesh(Mapping%XfrType, T%ED%y(ModDst%Ins)%TowerLn2Mesh, Mapping%TmpMotionMesh, Mapping%MeshMap, ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + ! Apply damping force as Twr_Kdmp*(node velocity) + T%ED%Input(iInput, Mapping%DstIns)%TowerPtLoads%Force = T%ED%Input(iInput, Mapping%DstIns)%TowerPtLoads%Force - T%p_FAST%Twr_Kdmp * Mapping%TmpMotionMesh%TranslationVel + + case (Custom_ED_Blade_Damping) + + ! Get rotational velocity and current hub position + omega_c = T%ED%y(ModDst%Ins)%RotSpeed * T%ED%y(ModDst%Ins)%HubPtMotion%Orientation(1,:,1) + r_hub = T%ED%y(ModDst%Ins)%HubPtMotion%Position(:,1) + T%ED%y(ModDst%Ins)%HubPtMotion%TranslationDisp(:,1) + + ! Get blade velocities at load mesh locations + call TransferMesh(Mapping%XfrType, T%ED%y(ModDst%Ins)%BladeLn2Mesh(Mapping%i), Mapping%TmpMotionMesh, Mapping%MeshMap, ErrStat=ErrStat2, ErrMsg=ErrMsg2) + if (Failed()) return + + ! Remove rotor rotational velocity from node velocity + do i = 1, Mapping%TmpMotionMesh%Nnodes + r = Mapping%TmpMotionMesh%Position(:,i) + Mapping%TmpMotionMesh%TranslationDisp(:,i) - r_hub + Vrot = cross_product(omega_c, r) + Mapping%TmpMotionMesh%TranslationVel(:,i) = Mapping%TmpMotionMesh%TranslationVel(:,i) - Vrot + end do + + ! Apply damping force as Bld_Kdmp*(node velocity) + T%ED%Input(iInput, Mapping%DstIns)%BladePtLoads(Mapping%i)%Force = T%ED%Input(iInput, Mapping%DstIns)%BladePtLoads(Mapping%i)%Force - T%p_FAST%Bld_Kdmp * Mapping%TmpMotionMesh%TranslationVel + + case (Custom_FF_to_ED) + + T%ED%Input(iInput, Mapping%DstIns)%PlatformPtMesh%Force = T%ED%Input(iInput, Mapping%DstIns)%PlatformPtMesh%Force + T%m_Glue%Ext%SubstructureLoadsFF%Force + T%ED%Input(iInput, Mapping%DstIns)%PlatformPtMesh%Moment = T%ED%Input(iInput, Mapping%DstIns)%PlatformPtMesh%Moment + T%m_Glue%Ext%SubstructureLoadsFF%Moment + +!------------------------------------------------------------------------------- +! SED Inputs +!------------------------------------------------------------------------------- + + case (Custom_SrvD_to_SED) + + T%SED%Input(iInput)%GenTrq = T%SrvD%y(ModSrc%Ins)%GenTrq + T%SED%Input(iInput)%HSSBrTrqC = T%SrvD%y(ModSrc%Ins)%HSSBrTrqC + T%SED%Input(iInput)%BlPitchCom = T%SrvD%y(ModSrc%Ins)%BlPitchCom + T%SED%Input(iInput)%YawPosCom = T%SrvD%y(ModSrc%Ins)%YawPosCom + T%SED%Input(iInput)%YawRateCom = T%SrvD%y(ModSrc%Ins)%YawRateCom + +!------------------------------------------------------------------------------- +! ExtInfw Inputs +!------------------------------------------------------------------------------- + + case (Custom_AD_to_ExtInfw) + + call ExtInfw_SetInputs(T%p_FAST, T%AD%Input(iInput), T%AD%y, T%SrvD%y(ModDst%Ins), T%ExtInfw, ErrStat2, ErrMsg2) + if (ErrStat >= AbortErrLev) return + call ExtInfw_SetWriteOutput(T%ExtInfw) + +!------------------------------------------------------------------------------- +! ExtLoads Inputs +!------------------------------------------------------------------------------- + + case (Custom_ED_to_ExtLd) + + T%ExtLd%u%az = T%ED%y(ModSrc%Ins)%LSSTipPxa + T%ExtLd%u%DX_u%bldPitch(:) = T%ED%y(ModSrc%Ins)%BlPitch + + ! Note: this may be better inside CalcOutput + call ExtLd_ConvertInpDataForExtProg(T%ExtLd%u, T%ExtLd%p, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + +!------------------------------------------------------------------------------- +! InflowWind Inputs +!------------------------------------------------------------------------------- + + case (Custom_ED_to_IfW) + + ! This section should be refactored so that IfW uses a hub point mesh + T%IfW%Input(iInput)%HubPosition = T%ED%y(ModSrc%Ins)%HubPtMotion%Position(:, 1) + & + T%ED%y(ModSrc%Ins)%HubPtMotion%TranslationDisp(:, 1) + T%IfW%Input(iInput)%HubOrientation = T%ED%y(ModSrc%Ins)%HubPtMotion%Orientation(:, :, 1) + + ! Set Lidar position directly from hub motion mesh + T%IfW%Input(iInput)%lidar%HubDisplacementX = T%ED%y(ModSrc%Ins)%HubPtMotion%TranslationDisp(1, 1) + T%IfW%Input(iInput)%lidar%HubDisplacementY = T%ED%y(ModSrc%Ins)%HubPtMotion%TranslationDisp(2, 1) + T%IfW%Input(iInput)%lidar%HubDisplacementZ = T%ED%y(ModSrc%Ins)%HubPtMotion%TranslationDisp(3, 1) + + case (Custom_SED_to_IfW) + + ! This section should be refactored so that IfW uses a hub point mesh + T%IfW%Input(iInput)%HubPosition = T%SED%y%HubPtMotion%Position(:, 1) + & + T%SED%y%HubPtMotion%TranslationDisp(:, 1) + T%IfW%Input(iInput)%HubOrientation = T%SED%y%HubPtMotion%Orientation(:, :, 1) + + ! Set Lidar position directly from hub motion mesh + T%IfW%Input(iInput)%lidar%HubDisplacementX = T%SED%y%HubPtMotion%TranslationDisp(1, 1) + T%IfW%Input(iInput)%lidar%HubDisplacementY = T%SED%y%HubPtMotion%TranslationDisp(2, 1) + T%IfW%Input(iInput)%lidar%HubDisplacementZ = T%SED%y%HubPtMotion%TranslationDisp(3, 1) + + case (Custom_SrvD_to_IfW) + +!------------------------------------------------------------------------------- +! MoorDyn Inputs +!------------------------------------------------------------------------------- + + case (Custom_SrvD_to_MD) + + ! Use Rotor 1 ServoDyn for MoorDyn inputs + if (ModSrc%iRotor == 1) then + if (allocated(T%MD%Input(iInput)%DeltaL) .and. allocated(T%SrvD%y(ModSrc%Ins)%CableDeltaL)) then + T%MD%Input(iInput)%DeltaL = T%SrvD%y(ModSrc%Ins)%CableDeltaL ! these should be sized identically during init + end if + + if (allocated(T%MD%Input(iInput)%DeltaLdot) .and. allocated(T%SrvD%y(ModSrc%Ins)%CableDeltaLdot)) then + T%MD%Input(iInput)%DeltaLdot = T%SrvD%y(ModSrc%Ins)%CableDeltaLdot ! these should be sized identically during init + end if + end if + +!------------------------------------------------------------------------------- +! SubDyn Inputs +!------------------------------------------------------------------------------- + + case (Custom_SrvD_to_SD) + + ! Use Rotor 1 ServoDyn for SubDyn inputs + if (ModSrc%iRotor == 1) then + if (allocated(T%SD%Input(iInput)%CableDeltaL) .and. allocated(T%SrvD%y(ModSrc%Ins)%CableDeltaL)) then + T%SD%Input(iInput)%CableDeltaL = T%SrvD%y(ModSrc%Ins)%CableDeltaL ! these should be sized identically during init + end if + end if + + case (Custom_FF_to_SD) + + T%SD%Input(iInput)%LMesh%Force = T%SD%Input(iInput)%LMesh%Force + T%m_Glue%Ext%SubstructureLoadsFF%Force + T%SD%Input(iInput)%LMesh%Moment = T%SD%Input(iInput)%LMesh%Moment + T%m_Glue%Ext%SubstructureLoadsFF%Moment + +!------------------------------------------------------------------------------- +! ServoDyn Inputs +!------------------------------------------------------------------------------- + + case (Custom_BD_to_SrvD) + + iBld = T%p_FAST%BDBldMap(ModSrc%Ins) + + T%SrvD%Input(iInput,ModDst%Ins)%RootMxc(iBld) = & + T%BD%y(Mapping%SrcIns)%RootMxr*cos(T%ED%y(ModDst%iRotor)%BlPitch(iBld)) + & + T%BD%y(Mapping%SrcIns)%RootMyr*sin(T%ED%y(ModDst%iRotor)%BlPitch(iBld)) + + T%SrvD%Input(iInput,ModDst%Ins)%RootMyc(iBld) = & + -T%BD%y(Mapping%SrcIns)%RootMxr*sin(T%ED%y(ModDst%iRotor)%BlPitch(iBld)) + & + T%BD%y(Mapping%SrcIns)%RootMyr*cos(T%ED%y(ModDst%iRotor)%BlPitch(iBld)) + + case (Custom_ED_to_SrvD) + + ! Blade root moment if not using BeamDyn + if (T%p_FAST%CompElast /= Module_BD) then + T%SrvD%Input(iInput,ModDst%Ins)%RootMxc = T%ED%y(ModSrc%Ins)%RootMxc ! fixed-size arrays: always size 3 + T%SrvD%Input(iInput,ModDst%Ins)%RootMyc = T%ED%y(ModSrc%Ins)%RootMyc ! fixed-size arrays: always size 3 + end if + + T%SrvD%Input(iInput,ModDst%Ins)%YawAngle = T%ED%y(ModSrc%Ins)%YawAngle ! nacelle yaw plus platform yaw + T%SrvD%Input(iInput,ModDst%Ins)%YawErr = T%SrvD%Input(iInput,ModDst%Ins)%WindDir - T%SrvD%Input(iInput,ModDst%Ins)%YawAngle ! the nacelle yaw error estimate (positive about zi-axis) + + T%SrvD%Input(iInput,ModDst%Ins)%BlPitch = T%ED%y(ModSrc%Ins)%BlPitch + T%SrvD%Input(iInput,ModDst%Ins)%LSS_Spd = T%ED%y(ModSrc%Ins)%LSS_Spd + T%SrvD%Input(iInput,ModDst%Ins)%RotSpeed = T%ED%y(ModSrc%Ins)%RotSpeed + + T%SrvD%Input(iInput,ModDst%Ins)%YawBrTAxp = T%ED%y(ModSrc%Ins)%YawBrTAxp + T%SrvD%Input(iInput,ModDst%Ins)%YawBrTAyp = T%ED%y(ModSrc%Ins)%YawBrTAyp + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipPxa = T%ED%y(ModSrc%Ins)%LSSTipPxa + + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMxa = T%ED%y(ModSrc%Ins)%LSSTipMxa + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMya = T%ED%y(ModSrc%Ins)%LSSTipMya + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMza = T%ED%y(ModSrc%Ins)%LSSTipMza + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMys = T%ED%y(ModSrc%Ins)%LSSTipMys + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMzs = T%ED%y(ModSrc%Ins)%LSSTipMzs + + T%SrvD%Input(iInput,ModDst%Ins)%YawBrMyn = T%ED%y(ModSrc%Ins)%YawBrMyn + T%SrvD%Input(iInput,ModDst%Ins)%YawBrMzn = T%ED%y(ModSrc%Ins)%YawBrMzn + T%SrvD%Input(iInput,ModDst%Ins)%NcIMURAxs = T%ED%y(ModSrc%Ins)%NcIMURAxs + T%SrvD%Input(iInput,ModDst%Ins)%NcIMURAys = T%ED%y(ModSrc%Ins)%NcIMURAys + T%SrvD%Input(iInput,ModDst%Ins)%NcIMURAzs = T%ED%y(ModSrc%Ins)%NcIMURAzs + + T%SrvD%Input(iInput,ModDst%Ins)%RotPwr = T%ED%y(ModSrc%Ins)%RotPwr + + T%SrvD%Input(iInput,ModDst%Ins)%LSShftFxa = T%ED%y(ModSrc%Ins)%LSShftFxa + T%SrvD%Input(iInput,ModDst%Ins)%LSShftFys = T%ED%y(ModSrc%Ins)%LSShftFys + T%SrvD%Input(iInput,ModDst%Ins)%LSShftFzs = T%ED%y(ModSrc%Ins)%LSShftFzs + + case (Custom_SED_to_SrvD) + + ! ServoDyn inputs from combination of InflowWind and ElastoDyn + T%SrvD%Input(iInput,ModDst%Ins)%YawAngle = T%SED%y%Yaw !nacelle yaw (platform rigid) + T%SrvD%Input(iInput,ModDst%Ins)%YawErr = T%SrvD%Input(iInput,ModDst%Ins)%WindDir - T%SrvD%Input(iInput,ModDst%Ins)%YawAngle ! the nacelle yaw error estimate (positive about zi-axis) + + ! ServoDyn inputs from Simplified-ElastoDyn + T%SrvD%Input(iInput,ModDst%Ins)%Yaw = T%SED%y%Yaw !nacelle yaw + T%SrvD%Input(iInput,ModDst%Ins)%YawRate = T%SED%y%YawRate + T%SrvD%Input(iInput,ModDst%Ins)%LSS_Spd = T%SED%y%RotSpeed + T%SrvD%Input(iInput,ModDst%Ins)%HSS_Spd = T%SED%y%HSS_Spd + T%SrvD%Input(iInput,ModDst%Ins)%RotSpeed = T%SED%y%RotSpeed + T%SrvD%Input(iInput,ModDst%Ins)%BlPitch = T%SED%y%BlPitch + + ! root moments + T%SrvD%Input(iInput,ModDst%Ins)%RootMxc = 0.0_ReKi ! y_ED%RootMxc ! fixed-size arrays: always size 3 + T%SrvD%Input(iInput,ModDst%Ins)%RootMyc = 0.0_ReKi ! y_ED%RootMyc ! fixed-size arrays: always size 3 + + T%SrvD%Input(iInput,ModDst%Ins)%YawBrTAxp = 0.0_ReKi ! y_ED%YawBrTAxp + T%SrvD%Input(iInput,ModDst%Ins)%YawBrTAyp = 0.0_ReKi ! y_ED%YawBrTAyp + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipPxa = T%SED%y%LSSTipPxa + + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMxa = T%SED%y%RotTrq + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMya = 0.0_ReKi ! y_ED%LSSTipMya + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMza = 0.0_ReKi ! y_ED%LSSTipMza + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMys = 0.0_ReKi ! y_ED%LSSTipMys + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMzs = 0.0_ReKi ! y_ED%LSSTipMzs + + T%SrvD%Input(iInput,ModDst%Ins)%YawBrMyn = 0.0_ReKi ! y_ED%YawBrMyn + T%SrvD%Input(iInput,ModDst%Ins)%YawBrMzn = 0.0_ReKi ! y_ED%YawBrMzn + T%SrvD%Input(iInput,ModDst%Ins)%NcIMURAxs = 0.0_ReKi ! y_ED%NcIMURAxs + T%SrvD%Input(iInput,ModDst%Ins)%NcIMURAys = 0.0_ReKi ! y_ED%NcIMURAys + T%SrvD%Input(iInput,ModDst%Ins)%NcIMURAzs = 0.0_ReKi ! y_ED%NcIMURAzs + + T%SrvD%Input(iInput,ModDst%Ins)%RotPwr = T%SED%y%RotPwr + + T%SrvD%Input(iInput,ModDst%Ins)%LSShftFxa = 0.0_ReKi ! y_ED%LSShftFxa + T%SrvD%Input(iInput,ModDst%Ins)%LSShftFys = 0.0_ReKi ! y_ED%LSShftFys + T%SrvD%Input(iInput,ModDst%Ins)%LSShftFzs = 0.0_ReKi ! y_ED%LSShftFzs + + case (Custom_IfW_to_SrvD) + + T%SrvD%Input(iInput,ModDst%Ins)%WindDir = atan2(T%IfW%y%HubVel(2), T%IfW%y%HubVel(1)) + T%SrvD%Input(iInput,ModDst%Ins)%HorWindV = sqrt(T%IfW%y%HubVel(1)**2 + T%IfW%y%HubVel(2)**2) + if (allocated(T%IfW%y%lidar%LidSpeed)) T%SrvD%Input(iInput,ModDst%Ins)%LidSpeed = T%IfW%y%lidar%LidSpeed + if (allocated(T%IfW%y%lidar%MsrPositionsX)) T%SrvD%Input(iInput,ModDst%Ins)%MsrPositionsX = T%IfW%y%lidar%MsrPositionsX + if (allocated(T%IfW%y%lidar%MsrPositionsY)) T%SrvD%Input(iInput,ModDst%Ins)%MsrPositionsY = T%IfW%y%lidar%MsrPositionsY + if (allocated(T%IfW%y%lidar%MsrPositionsZ)) T%SrvD%Input(iInput,ModDst%Ins)%MsrPositionsZ = T%IfW%y%lidar%MsrPositionsZ + T%SrvD%Input(iInput,ModDst%Ins)%YawErr = T%SrvD%Input(iInput,ModDst%Ins)%WindDir - T%SrvD%Input(iInput,ModDst%Ins)%YawAngle ! the nacelle yaw error estimate (positive about zi-axis) + + case (Custom_ExtInfw_to_SrvD) + + T%SrvD%Input(iInput,ModDst%Ins)%WindDir = ATAN2(T%ExtInfw%y%v(1), T%ExtInfw%y%u(1)) + T%SrvD%Input(iInput,ModDst%Ins)%HorWindV = SQRT(T%ExtInfw%y%u(1)**2 + T%ExtInfw%y%v(1)**2) + if (allocated(T%SrvD%Input(iInput,ModDst%Ins)%LidSpeed)) T%SrvD%Input(iInput,ModDst%Ins)%LidSpeed = 0.0 + if (allocated(T%SrvD%Input(iInput,ModDst%Ins)%MsrPositionsX)) T%SrvD%Input(iInput,ModDst%Ins)%MsrPositionsX = 0.0 + if (allocated(T%SrvD%Input(iInput,ModDst%Ins)%MsrPositionsY)) T%SrvD%Input(iInput,ModDst%Ins)%MsrPositionsY = 0.0 + if (allocated(T%SrvD%Input(iInput,ModDst%Ins)%MsrPositionsz)) T%SrvD%Input(iInput,ModDst%Ins)%MsrPositionsz = 0.0 + + ! the nacelle yaw error estimate (positive about zi-axis) + T%SrvD%Input(iInput,ModDst%Ins)%YawErr = T%SrvD%Input(iInput,ModDst%Ins)%WindDir - T%SrvD%Input(iInput,ModDst%Ins)%YawAngle + +!------------------------------------------------------------------------------- +! Unknown Mapping +!------------------------------------------------------------------------------- + + case default + + ErrStat = ErrID_Fatal + ErrMsg = "Custom_InputSolve: unknown mapping '"//trim(Mapping%Desc)//"'" + + end select + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine FAST_ResetRemapFlags(Mods, Maps, T, ErrStat, ErrMsg) + type(ModDataType), intent(in) :: Mods(:) !< Module data + type(MappingType), intent(inout) :: Maps(:) + type(FAST_TurbineType), target, intent(inout) :: T !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_ResetRemapFlags' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, k + type(MeshType), pointer :: SrcMesh, DstMesh + + ErrStat = ErrID_None + ErrMsg = '' + + ! Reset remap flags in mapping meshes + do i = 1, size(Maps) + select case (Maps(i)%MapType) + case (Map_LoadMesh, Map_MotionMesh) + + if (associated(Maps(i)%TmpLoadMesh%RemapFlag)) Maps(i)%TmpLoadMesh%RemapFlag = .false. + if (associated(Maps(i)%TmpMotionMesh%RemapFlag)) Maps(i)%TmpMotionMesh%RemapFlag = .false. + + call FAST_OutputMeshPointer(Mods(Maps(i)%iModSrc), T, Maps(i)%SrcDL, SrcMesh, ErrStat2, ErrMsg2) + if (Failed()) return + SrcMesh%RemapFlag = .false. + + call FAST_InputMeshPointer(Mods(Maps(i)%iModDst), T, Maps(i)%DstDL, DstMesh, INPUT_CURR, ErrStat2, ErrMsg2) + if (Failed()) return + DstMesh%RemapFlag = .false. + + end select + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +end module diff --git a/modules/openfast-library/src/FAST_ModGlue.f90 b/modules/openfast-library/src/FAST_ModGlue.f90 new file mode 100644 index 0000000000..645ca2626d --- /dev/null +++ b/modules/openfast-library/src/FAST_ModGlue.f90 @@ -0,0 +1,1641 @@ +!********************************************************************************************************************************** +! FAST_ModGlue.f90 performs linearization using the ModVars module. +!.................................................................................................................................. +! LICENSING +! Copyright (C) 2024 National Renewable Energy Laboratory +! +! This file is part of FAST. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +!********************************************************************************************************************************** +module FAST_ModGlue + +use NWTC_Library +use NWTC_LAPACK + +use FAST_ModTypes +use FAST_Types +use FAST_Funcs +use FAST_Mapping + +implicit none + +private + +public :: ModGlue_Init, & + ModGlue_Linearize_OP, & + ModGlue_CalcSteady, & + ModGlue_SaveOperatingPoint, & + ModGlue_RestoreOperatingPoint, & + ModGlue_CalcWriteLinearMatrices, & + ModGlue_CombineModules + +logical :: CalcSteadyDebug = .false. + +contains + +subroutine ModGlue_CombineModules(ModGlue, ModDataAry, Mappings, iModAry, FlagFilter, Linearize, ErrStat, ErrMsg, Name) + type(ModGlueType), intent(out) :: ModGlue + type(ModDataType), intent(in) :: ModDataAry(:) + integer(IntKi), intent(in) :: iModAry(:) + integer(IntKi), intent(in) :: FlagFilter + logical, intent(in) :: Linearize + type(MappingType), intent(in) :: Mappings(:) !< Mesh and variable mappings + integer(IntKi), intent(out) :: ErrStat + character(ErrMsgLen), intent(out) :: ErrMsg + character(*), optional, intent(in) :: Name + + character(*), parameter :: RoutineName = 'ModGlue_CombineModules' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: iGbl(2) + integer(IntKi) :: i, j, k + integer(IntKi) :: iMod, iVarGlue + integer(IntKi) :: xNumVals, uNumVals, yNumVals + integer(IntKi) :: xNumVars, uNumVars, yNumVars + integer(IntKi) :: ix, iz, iu, iy + character(20) :: NamePrefix + type(VarMapType) :: ModMap + + ! Initialize error return + ErrStat = ErrID_None + ErrMsg = "" + + ! If no modules or order is empty, return error + if ((size(ModDataAry) == 0) .or. (size(iModAry) == 0)) then + call SetErrStat(ErrID_Fatal, "No modules were used", ErrStat, ErrMsg, RoutineName) + return + end if + + ! Set module name + if (present(Name)) then + ModGlue%Name = Name + else + ModGlue%Name = '' + end if + + !---------------------------------------------------------------------------- + ! Allocate module data array + !---------------------------------------------------------------------------- + + ! Allocate module info array based on number of modules in iMod + allocate (ModGlue%ModData(size(iModAry)), stat=ErrStat2) + if (FailedAlloc("ModOut%VarsAry")) return + + !---------------------------------------------------------------------------- + ! Combine modules into glue module + !---------------------------------------------------------------------------- + + ! Initialize number of variables and values in each group + xNumVars = 0; uNumVars = 0; yNumVars = 0 + xNumVals = 0; uNumVals = 0; yNumVals = 0 + + ! Loop through each module and sum the number of variables that will be in + ! the combined module + do i = 1, size(iModAry) + associate (ModData => ModDataAry(iModAry(i)), GlueModData => ModGlue%ModData(i)) + + ! Copy values from source module info + GlueModData%Abbr = ModData%Abbr + GlueModData%ID = ModData%ID + GlueModData%iMod = ModData%iMod ! Keep original module index for input solve + GlueModData%Ins = ModData%Ins + GlueModData%DT = ModData%DT + GlueModData%SubSteps = ModData%SubSteps + GlueModData%iRotor = ModData%iRotor + + ! Continuous state + call CopyVariables(ModData%Vars%x, GlueModData%Vars%x, xNumVals); if (Failed()) return + GlueModData%Vars%Nx = ModData%Vars%Nx ! Same as original module + xNumVars = xNumVars + size(GlueModData%Vars%x) + + ! Input + call CopyVariables(ModData%Vars%u, GlueModData%Vars%u, uNumVals); if (Failed()) return + GlueModData%Vars%Nu = ModData%Vars%Nu ! Same as original module + uNumVars = uNumVars + size(GlueModData%Vars%u) + + ! Output + call CopyVariables(ModData%Vars%y, GlueModData%Vars%y, yNumVals); if (Failed()) return + GlueModData%Vars%Ny = ModData%Vars%Ny ! Same as original module + yNumVars = yNumVars + size(GlueModData%Vars%y) + + end associate + end do + + ! Set total number of values in glue module + ModGlue%Vars%Nx = xNumVals + ModGlue%Vars%Nu = uNumVals + ModGlue%Vars%Ny = yNumVals + + ! Allocate arrays for to hold combined variables + allocate (ModGlue%Vars%x(xNumVars), stat=ErrStat2); if (FailedAlloc("ModOut%Vars%x")) return + allocate (ModGlue%Vars%u(uNumVars), stat=ErrStat2); if (FailedAlloc("ModOut%Vars%u")) return + allocate (ModGlue%Vars%y(yNumVars), stat=ErrStat2); if (FailedAlloc("ModOut%Vars%y")) return + + ! Loop through module info in glue module + ix = 0; iz = 0; iu = 0; iy = 0 + do i = 1, size(ModGlue%ModData) + + associate (GlueModData => ModGlue%ModData(i)) + + ! Determine module name prefix for linearization + if ((GlueModData%ID == Module_BD) .or. (count(ModDataAry%ID == GlueModData%ID) > 1)) then + NamePrefix = trim(GlueModData%Abbr)//"_"//Num2LStr(GlueModData%Ins) + GlueModData%Abbr = trim(GlueModData%Abbr)//Num2LStr(GlueModData%Ins) + else + NamePrefix = GlueModData%Abbr + GlueModData%Abbr = GlueModData%Abbr + end if + + ! Continuous state + do j = 1, size(GlueModData%Vars%x) + ix = ix + 1 + ModGlue%Vars%x(ix) = GlueModData%Vars%x(j) + ModGlue%Vars%x(ix)%iLoc = ModGlue%Vars%x(ix)%iGlu ! Set local indices to glue indices + ModGlue%Vars%x(ix)%iGlu = 0 ! Set glue indices to 0 + call AddLinNamePrefix(ModGlue%Vars%x(ix), NamePrefix) + end do + + ! Input + do j = 1, size(GlueModData%Vars%u) + iu = iu + 1 + ModGlue%Vars%u(iu) = GlueModData%Vars%u(j) + ModGlue%Vars%u(iu)%iLoc = ModGlue%Vars%u(iu)%iGlu ! Set local indices to glue indices + ModGlue%Vars%u(iu)%iGlu = 0 ! Set glue indices to 0 + call AddLinNamePrefix(ModGlue%Vars%u(iu), NamePrefix) + end do + + ! Output + do j = 1, size(GlueModData%Vars%y) + iy = iy + 1 + ModGlue%Vars%y(iy) = GlueModData%Vars%y(j) + ModGlue%Vars%y(iy)%iLoc = ModGlue%Vars%y(iy)%iGlu ! Set local indices to glue indices + ModGlue%Vars%y(iy)%iGlu = 0 ! Set glue indices to 0 + call AddLinNamePrefix(ModGlue%Vars%y(iy), NamePrefix) + end do + + end associate + end do + + !---------------------------------------------------------------------------- + ! Determine mappings which apply to the modules in this glue module + !---------------------------------------------------------------------------- + + allocate (ModGlue%VarMaps(0)) + + ! Loop through mappings + do i = 1, size(Mappings) + + ! Find index of source module in glue module, cycle if not found + ModMap%iModSrc = 0 + do j = 1, size(iModAry) + if (iModAry(j) == Mappings(i)%iModSrc) then + ModMap%iModSrc = j + exit + end if + end do + if (ModMap%iModSrc == 0) cycle + + ! Find index of destination module in glue module, cycle if not found + ModMap%iModDst = 0 + do j = 1, size(iModAry) + if (iModAry(j) == Mappings(i)%iModDst) then + ModMap%iModDst = j + exit + end if + end do + if (ModMap%iModDst == 0) cycle + + ! Get source and destination modules from glue module data array + associate (Mapping => Mappings(i), & + ModSrc => ModGlue%ModData(ModMap%iModSrc), & + ModDst => ModGlue%ModData(ModMap%iModDst)) + + ! Set mapping index and clear variable indices + ModMap%iMapping = i + ModMap%iVarSrc = 0 + ModMap%iVarSrcDisp = 0 + ModMap%iVarDst = 0 + ModMap%iVarDstDisp = 0 + + ! Init variable indices and find indices that apply to the source data location + select case (Mapping%MapType) + case (Map_Variable) + + do j = 1, size(ModSrc%Vars%y) + if (MV_EqualDL(ModSrc%Vars%y(j)%DL, Mapping%SrcDL)) ModMap%iVarSrc(1) = j + end do + + case (Map_LoadMesh, Map_MotionMesh) + + do j = 1, size(ModSrc%Vars%y) + if (MV_EqualDL(ModSrc%Vars%y(j)%DL, Mapping%SrcDL)) ModMap%iVarSrc(ModSrc%Vars%y(j)%Field) = j + end do + + if (Mapping%MapType == Map_LoadMesh) then + do j = 1, size(ModSrc%Vars%u) + if (MV_EqualDL(ModSrc%Vars%u(j)%DL, Mapping%SrcDispDL)) ModMap%iVarSrcDisp(ModSrc%Vars%u(j)%Field) = j + end do + end if + + end select + + ! If no source variable indices found, cycle + if (all(ModMap%iVarSrc == 0)) cycle + if (Mapping%MapType == Map_LoadMesh .and. all(ModMap%iVarSrcDisp == 0)) cycle + + ! Init variable indices and find indices that apply to the destination data location + select case (Mapping%MapType) + case (Map_Variable) + + do j = 1, size(ModDst%Vars%u) + if (MV_EqualDL(ModDst%Vars%u(j)%DL, Mapping%DstDL)) ModMap%iVarDst(1) = j + end do + + case (Map_LoadMesh, Map_MotionMesh) + + do j = 1, size(ModDst%Vars%u) + if (MV_EqualDL(ModDst%Vars%u(j)%DL, Mapping%DstDL)) ModMap%iVarDst(ModDst%Vars%u(j)%Field) = j + end do + + if (Mapping%MapType == Map_LoadMesh) then + do j = 1, size(ModDst%Vars%y) + if (MV_EqualDL(ModDst%Vars%y(j)%DL, Mapping%DstDispDL)) ModMap%iVarDstDisp(ModDst%Vars%y(j)%Field) = j + end do + end if + + end select + + ! If no destination variable indices found, cycle + if (all(ModMap%iVarDst == 0)) cycle + if (Mapping%MapType == Map_LoadMesh .and. all(ModMap%iVarDstDisp == 0)) cycle + + ! Add new module mapping to array + ModGlue%VarMaps = [ModGlue%VarMaps, ModMap] + + end associate + end do + + !---------------------------------------------------------------------------- + ! Linearization + !---------------------------------------------------------------------------- + + if (.not. Linearize) return + + ! Allocate linearization arrays + if (ModGlue%Vars%Nx > 0) then + call AllocAry(ModGlue%Lin%x, ModGlue%Vars%Nx, "x", ErrStat2, ErrMsg2) + if (Failed()) return + end if + if (ModGlue%Vars%Nx > 0) then + call AllocAry(ModGlue%Lin%dx, ModGlue%Vars%Nx, "dx", ErrStat2, ErrMsg2) + if (Failed()) return + end if + if (ModGlue%Vars%Nu > 0) then + call AllocAry(ModGlue%Lin%u, ModGlue%Vars%Nu, "u", ErrStat2, ErrMsg2) + if (Failed()) return + end if + if (ModGlue%Vars%Ny > 0) then + call AllocAry(ModGlue%Lin%y, ModGlue%Vars%Ny, "y", ErrStat2, ErrMsg2) + if (Failed()) return + end if + + ! Allocate full Jacobian matrices + if (ModGlue%Vars%Ny > 0 .and. ModGlue%Vars%Nu > 0) then + call AllocAry(ModGlue%Lin%dYdu, ModGlue%Vars%Ny, ModGlue%Vars%Nu, "dYdu", ErrStat2, ErrMsg2) + if (Failed()) return + end if + if (ModGlue%Vars%Nx > 0 .and. ModGlue%Vars%Nu > 0) then + call AllocAry(ModGlue%Lin%dXdu, ModGlue%Vars%Nx, ModGlue%Vars%Nu, "dXdu", ErrStat2, ErrMsg2) + if (Failed()) return + end if + if (ModGlue%Vars%Ny > 0 .and. ModGlue%Vars%Nx > 0) then + call AllocAry(ModGlue%Lin%dYdx, ModGlue%Vars%Ny, ModGlue%Vars%Nx, "dYdx", ErrStat2, ErrMsg2) + if (Failed()) return + end if + if (ModGlue%Vars%Nx > 0 .and. ModGlue%Vars%Nx > 0) then + call AllocAry(ModGlue%Lin%dXdx, ModGlue%Vars%Nx, ModGlue%Vars%Nx, "dXdx", ErrStat2, ErrMsg2) + if (Failed()) return + end if + if (ModGlue%Vars%Nu > 0 .and. ModGlue%Vars%Nu > 0) then + call AllocAry(ModGlue%Lin%dUdu, ModGlue%Vars%Nu, ModGlue%Vars%Nu, "dUdu", ErrStat2, ErrMsg2) + if (Failed()) return + end if + if (ModGlue%Vars%Nu > 0 .and. ModGlue%Vars%Ny > 0) then + call AllocAry(ModGlue%Lin%dUdy, ModGlue%Vars%Nu, ModGlue%Vars%Ny, "dUdy", ErrStat2, ErrMsg2) + if (Failed()) return + end if + +contains + + subroutine CopyVariables(VarAryIn, VarAryOut, iVal) + type(ModVarType), intent(in) :: VarAryIn(:) + type(ModVarType), allocatable, intent(inout) :: VarAryOut(:) + integer(IntKi), intent(inout) :: iVal + + integer(IntKi) :: NumVars, NumVals, iVar + + ! Get number of variables that have flag + NumVars = 0 + do k = 1, size(VarAryIn) + if (MV_HasFlagsAny(VarAryIn(k), FlagFilter)) NumVars = NumVars + 1 + end do + + ! Allocate output array of variables + allocate (VarAryOut(NumVars), stat=ErrStat2) + if (ErrStat2 /= 0) then + ErrStat2 = ErrID_Fatal + ErrMsg2 = "Failed to allocate vars" + return + end if + + iVar = 1 + + ! Loop through variables in original module + do k = 1, size(VarAryIn) + + ! If variable doesn't have flag, cycle + if (.not. MV_HasFlagsAny(VarAryIn(k), FlagFilter)) cycle + + associate (Var => VarAryOut(iVar)) + + ! Copy variable + Var = VarAryIn(k) + + ! Get number of values in variable + NumVals = VarAryIn(k)%Num + + ! Set value indices in combined module + Var%iGlu = [iVal + 1, iVal + NumVals] + + ! Increment global value index + iVal = iVal + NumVals + + ! Increment variable index in module info variable array + iVar = iVar + 1 + + ! Deallocate linearization names if not doing linearization + if (.not. Linearize .and. allocated(Var%LinNames)) deallocate (Var%LinNames) + + end associate + + end do + + end subroutine + + subroutine AddLinNamePrefix(Var, Prefix) + type(ModVarType), intent(inout) :: Var + character(*), intent(in) :: Prefix + integer(IntKi) :: m + if (allocated(Var%LinNames)) then + do m = 1, size(Var%LinNames) + Var%LinNames(m) = trim(Prefix)//" "//Var%LinNames(m) + end do + end if + end subroutine + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function + + logical function FailedAlloc(NameLoc) + character(*), intent(in) :: NameLoc + if (ErrStat2 == 0) then + FailedAlloc = .false. + else + call SetErrStat(ErrID_Fatal, "Failed to allocate "//NameLoc, ErrStat, ErrMsg, RoutineName) + FailedAlloc = .true. + end if + end function + +end subroutine + +subroutine ModGlue_Init(p, m, y, p_FAST, m_FAST, Turbine, ErrStat, ErrMsg) + type(Glue_ParameterType), intent(inout) :: p !< Glue Parameters + type(Glue_MiscVarType), intent(inout) :: m !< Glue MiscVars + type(Glue_OutputFileType), intent(inout) :: y !< Glue Output + type(FAST_ParameterType), intent(inout) :: p_FAST !< FAST Parameters + type(FAST_MiscVarType), intent(inout) :: m_FAST !< FAST MiscVars + type(FAST_TurbineType), intent(inout) :: Turbine + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'ModGlue_Init' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi), allocatable :: modIDs(:), modIdx(:) + integer(IntKi) :: i, j, k + integer(IntKi) :: LinFlags + + ! Initialize error return + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Module order and indexing + !---------------------------------------------------------------------------- + + ! If no modules were added, return error + if (.not. allocated(m%ModData)) then + call SetErrStat(ErrID_Fatal, "No modules were used", ErrStat, ErrMsg, RoutineName) + return + end if + + ! Create array of indices for Mods array + modIdx = [(i, i=1, size(m%ModData))] + + ! Get array of module IDs + modIDs = [(m%ModData(i)%ID, i=1, size(m%ModData))] + + ! Establish module index order for linearization + p%Lin%iMod = [pack(modIdx, ModIDs == Module_IfW), & + pack(modIdx, ModIDs == Module_SeaSt), & + pack(modIdx, ModIDs == Module_SrvD), & + pack(modIdx, ModIDs == Module_ED), & + pack(modIdx, ModIDs == Module_BD), & + pack(modIdx, ModIDs == Module_AD), & + pack(modIdx, ModIDs == Module_HD), & + pack(modIdx, ModIDs == Module_SD), & + pack(modIdx, ModIDs == Module_ExtPtfm), & + pack(modIdx, ModIDs == Module_MAP), & + pack(modIdx, ModIDs == Module_MD)] + + ! Loop through modules, if module is not in index, return with error + if (p_FAST%Linearize) then + do i = 1, size(m%ModData) + if (.not. any(i == p%Lin%iMod)) then + call SetErrStat(ErrID_Fatal, "Module "//trim(m%ModData(i)%Abbr)// & + " not supported in linearization", ErrStat, ErrMsg, RoutineName) + return + end if + end do + end if + + !---------------------------------------------------------------------------- + ! Set Variable Flags for linearization + !---------------------------------------------------------------------------- + + ! Loop through each module by index + do i = 1, size(p%Lin%iMod) + associate (ModData => m%ModData(p%Lin%iMod(i))) + + ! Set linearize flag on all continuous state variables + do j = 1, size(ModData%Vars%x) + call MV_SetFlags(ModData%Vars%x(j), VF_Linearize) + end do + + ! Add or remove linearize flag based on requested input + select case (p_FAST%LinInputs) + case (LIN_NONE) + do j = 1, size(ModData%Vars%u) + call MV_ClearFlags(ModData%Vars%u(j), VF_Linearize) + end do + case (LIN_STANDARD) + ! For standard inputs, use VF_Linearize flag as set in the module + case (LIN_ALL) + do j = 1, size(ModData%Vars%u) + call MV_SetFlags(ModData%Vars%u(j), VF_Linearize) + end do + end select + + ! Remove linearize flag from input variables that have VF_NoLin flag + do j = 1, size(ModData%Vars%u) + if (MV_HasFlagsAll(ModData%Vars%u(j), VF_NoLin)) then + call MV_ClearFlags(ModData%Vars%u(j), VF_Linearize) + end if + end do + + ! Add or remove linearize flag based on requested output + select case (p_FAST%LinOutputs) + case (LIN_NONE) + do j = 1, size(ModData%Vars%y) + call MV_ClearFlags(ModData%Vars%y(j), VF_Linearize) + end do + case (LIN_STANDARD) ! Set linearize flag for write output variables + do j = 1, size(ModData%Vars%y) + if (MV_HasFlagsAll(ModData%Vars%y(j), VF_WriteOut)) then + call MV_SetFlags(ModData%Vars%y(j), VF_Linearize) + else + call MV_ClearFlags(ModData%Vars%y(j), VF_Linearize) + end if + end do + case (LIN_ALL) + do j = 1, size(ModData%Vars%y) + call MV_SetFlags(ModData%Vars%y(j), VF_Linearize) + end do + end select + + ! Remove linearize flag from output variables that have VF_NoLin flag + do j = 1, size(ModData%Vars%y) + if (MV_HasFlagsAll(ModData%Vars%y(j), VF_NoLin)) then + call MV_ClearFlags(ModData%Vars%y(j), VF_Linearize) + end if + end do + + end associate + end do + + !---------------------------------------------------------------------------- + ! Glue Module + !---------------------------------------------------------------------------- + + LinFlags = VF_Linearize + VF_Mapping + VF_Mesh + call ModGlue_CombineModules(m%ModGlue, m%ModData, m%Mappings, p%Lin%iMod, LinFlags, & + p_FAST%Linearize, ErrStat2, ErrMsg2, Name="Lin") + if (Failed()) return + + !---------------------------------------------------------------------------- + ! Allocate linearization arrays and matrices + !---------------------------------------------------------------------------- + + ! If linearization is enabled + if (p_FAST%Linearize) then + + ! Copy linearization parameters + p%Lin%NumTimes = max(p_FAST%NLinTimes, 2) + p%Lin%InterpOrder = p_FAST%InterpOrder + if (allocated(m_FAST%Lin%LinTimes)) then + y%Lin%Times = m_FAST%Lin%LinTimes + end if + + ! Initialize indices + m%Lin%TimeIndex = 1 + m%Lin%AzimuthIndex = 1 + + ! Set flag to save operating points during linearization if mode shapes requested + p%Lin%SaveOPs = p_FAST%WrVTK == VTK_ModeShapes + + ! Initialize arrays to store operating point states and input + call AllocAry(y%Lin%x, m%ModGlue%Vars%Nx, p%Lin%NumTimes, "Lin%x", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(y%Lin%u, m%ModGlue%Vars%Nu, p%Lin%NumTimes, "Lin%u", ErrStat2, ErrMsg2); if (Failed()) return + + end if + + ! If linearization and steady state calculation is enabled + if (p_FAST%Linearize .and. p_FAST%CalcSteady) then + + ! Disable saving of OPs during linearization as ModGlue_CalcSteady saves them automatically + p%Lin%SaveOPs = .false. + + ! Initialize variables + m%CS%AzimuthDelta = TwoPi_D/p%Lin%NumTimes + m%CS%NumRotations = 0 + m%CS%IsConverged = .false. + m%CS%FoundSteady = .false. + m%CS%ForceLin = .false. + + ! Calculate number of output values (ignoring write outputs) + m%CS%NumOutputs = 0 + do i = 1, size(m%ModGlue%Vars%y) + associate (Var => m%ModGlue%Vars%y(i)) + if (.not. MV_HasFlagsAll(Var, VF_WriteOut)) m%CS%NumOutputs = m%CS%NumOutputs + Var%Num + end associate + end do + + ! Allocate arrays + call AllocAry(y%Lin%Times, p%Lin%NumTimes, "Lin%Times", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%CS%AzimuthTarget, p%Lin%NumTimes, "CS%AzimuthTarget", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%CS%psi_buffer, p_FAST%LinInterpOrder + 1, "CS%psi_buffer", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%CS%y_buffer, m%ModGlue%Vars%Ny, p_FAST%LinInterpOrder + 1, "CS%y_buffer", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%CS%y_interp, m%ModGlue%Vars%Ny, "CS%y_interp", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%CS%y_diff, m%ModGlue%Vars%Ny, "CS%y_diff", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%CS%y_azimuth, m%ModGlue%Vars%Ny, p%Lin%NumTimes, "CS%y_azimuth", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%CS%y_ref, m%ModGlue%Vars%Ny, "CS%y_ref", ErrStat2, ErrMsg2); if (Failed()) return + + ! Initialize arrays to zero + m%CS%psi_buffer = 0.0_R8Ki + m%CS%y_buffer = 0.0_R8Ki + m%CS%y_interp = 0.0_R8Ki + m%CS%y_diff = 0.0_R8Ki + m%CS%y_azimuth = 0.0_R8Ki + m%CS%y_ref = 1.0_R8Ki + + end if + +contains + + subroutine CalcVarDataLoc(VarAry, DataSize) + type(ModVarType), intent(inout) :: VarAry(:) + integer(IntKi), intent(out) :: DataSize + DataSize = 0 + do i = 1, size(VarAry) + VarAry(i)%iLoc = [DataSize + 1, DataSize + VarAry(i)%Num] + DataSize = DataSize + VarAry(i)%Num + end do + end subroutine + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed + +end subroutine + +subroutine ModGlue_CalcSteady(n_t_global, t_global, p, m, y, p_FAST, m_FAST, T, ErrStat, ErrMsg) + + integer(IntKi), intent(IN) :: n_t_global !< integer time step + real(DbKi), intent(IN) :: t_global !< current simulation time + type(Glue_ParameterType), intent(inout) :: p !< Glue Parameters + type(Glue_MiscVarType), intent(inout) :: m !< Glue MiscVars + type(Glue_OutputFileType), intent(inout) :: y !< Glue Output + type(FAST_ParameterType), intent(inout) :: p_FAST !< FAST Parameters + type(FAST_MiscVarType), intent(inout) :: m_FAST !< FAST MiscVars + type(FAST_TurbineType), intent(inout) :: T !< Turbine Type + integer(IntKi), intent(OUT) :: ErrStat !< Error status of the operation + character(*), intent(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'ModGlue_CalcSteady' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + real(DbKi) :: DeltaAzimuth, AzimuthTargetDelta, AzimuthTarget + real(DbKi) :: psi !< psi (rotor azimuth) at which the outputs are defined + real(DbKi) :: error + logical :: ProcessAzimuth + integer(IntKi) :: i, j, iy + integer(IntKi), parameter :: iED = 1 + + ErrStat = ErrID_None + ErrMsg = "" + + ! Get current azimuth angle from ElastoDyn output + psi = real(T%ED%y(iED)%LSSTipPxa, R8Ki) + call Zero2TwoPi(psi) + + ! Cyclic shift psi buffer and set first index to new psi + do i = size(m%CS%psi_buffer) - 1, 1, -1 + m%CS%psi_buffer(i + 1) = m%CS%psi_buffer(i) + end do + ! If passing the 2PI boundary, subtract 2PI from saved values so interpolation works correctly + if (psi < m%CS%psi_buffer(1)) m%CS%psi_buffer = m%CS%psi_buffer - TwoPi_D + m%CS%psi_buffer(1) = psi + + ! Cyclic shift output buffer and collect outputs from all modules + do i = size(m%CS%psi_buffer) - 1, 1, -1 + m%CS%y_buffer(:, i + 1) = m%CS%y_buffer(:, i) + end do + + ! Loop through modules and collect output + do j = 1, size(m%ModGlue%ModData) + associate (ModData => m%ModGlue%ModData(j)) + + ! Skip of module has no outputs + if (size(ModData%Vars%y) == 0) cycle + + ! Get outputs + call FAST_GetOP(ModData, t_global, INPUT_CURR, STATE_CURR, T, ErrStat2, ErrMsg2, & + y_op=ModData%Lin%y, y_glue=m%ModGlue%Lin%y) + if (Failed()) return + + end associate + end do + + ! Copy outputs to buffer (can't be used directly since it's not allocatable) + m%CS%y_buffer(:, 1) = m%ModGlue%Lin%y + + ! If first call + if (n_t_global == 0) then + + ! Initialize azimuth targets + do i = 1, size(m%CS%AzimuthTarget) + m%CS%AzimuthTarget(i) = (i - 1)*m%CS%AzimuthDelta + psi + call Zero2TwoPi(m%CS%AzimuthTarget(i)) + end do + + ! Initialize psi buffer for interpolation based on time step and rotor speed + do i = 1, size(m%CS%psi_buffer) + m%CS%psi_buffer(i) = psi - (i - 1)*p_FAST%DT*T%ED%y(iED)%LSS_Spd + end do + + ! Initialize output buffer by copying outputs from first buffer location + do i = 2, size(m%CS%y_buffer, 2) + m%CS%y_buffer(:, i) = m%CS%y_buffer(:, 1) + end do + + end if + + ! Calculate change in azimuth from last call, if change is too great, return error + DeltaAzimuth = psi - m%CS%psi_buffer(1) + call Zero2TwoPi(DeltaAzimuth) + if (DeltaAzimuth > m%CS%AzimuthDelta) then + call SetErrStat(ErrID_Fatal, "The rotor is spinning too fast. The time step or NLinTimes is too large when CalcSteady=true.", ErrStat, ErrMsg, RoutineName) + return + end if + + ! Get the current azimuth target + AzimuthTarget = m%CS%AzimuthTarget(m%Lin%AzimuthIndex) + + ! Difference between current azimuth and the target + AzimuthTargetDelta = psi - AzimuthTarget + + ! Set flag to process next azimuth if psi is greater than the next azimuth target + ! and the difference between psi and the target is less than the AzimuthDelta (difference between targets) + ProcessAzimuth = (AzimuthTargetDelta >= 0.0_R8Ki) .and. (AzimuthTargetDelta < m%CS%AzimuthDelta) + + ! If this is the last step, force linearization + if (t_global >= p_FAST%TMax - 0.5_DbKi*p_FAST%DT) then + m%CS%ForceLin = .true. + m%Lin%AzimuthIndex = 1 + ProcessAzimuth = .true. + end if + + ! If flag is set to process azimuth + if (ProcessAzimuth) then + + ! Interpolate outputs to target azimuth + call MV_ExtrapInterp(m%ModGlue%Vars%y, m%CS%y_buffer, m%CS%psi_buffer, & + m%CS%y_interp, AzimuthTarget, ErrStat2, ErrMsg2) + if (Failed()) return + + ! If converged + if (m%CS%IsConverged) then + + ! Calculate error between interpolated outputs and outputs at this + ! azimuth from the previous rotation + error = CalcOutputErrorAtAzimuth() + + ! Sae error for output + T%y_FAST%DriverWriteOutput(4) = real(error, ReKi) + + ! Update converged flag based on error and tolerance + m%CS%IsConverged = (error < p_FAST%TrimTol) + + end if + + ! Save interpolated outputs for this azimuth + m%CS%y_azimuth(:, m%Lin%AzimuthIndex) = m%CS%y_interp + + ! If linearization is forced + if (m%CS%ForceLin) m%CS%IsConverged = .true. + + ! If converged or in first rotation, save this operating point for linearization later + if (m%CS%IsConverged .or. m%CS%NumRotations == 0) then ! + y%Lin%Times(m%Lin%AzimuthIndex) = t_global + m_FAST%Lin%LinTimes = y%Lin%Times + call ModGlue_SaveOperatingPoint(p, m, m%Lin%AzimuthIndex, m%CS%NumRotations == 0, T, ErrStat2, ErrMsg2) + if (Failed()) return + end if + + ! Increment the azimuth index counter + m%Lin%AzimuthIndex = m%Lin%AzimuthIndex + 1 + + ! If we've completed one rotor revolution + if (m%Lin%AzimuthIndex > p%Lin%NumTimes) then + + ! Increment number of rotations + m%CS%NumRotations = m%CS%NumRotations + 1 + + ! Save if steady state has been found + m%CS%FoundSteady = m%CS%IsConverged + + ! If steady state has been found, return + if (m%CS%FoundSteady) return + + ! Compute the reference values for this rotor revolution + m%CS%y_ref = max(maxval(m%CS%y_azimuth, dim=2) - minval(m%CS%y_azimuth, dim=2), 0.01_R8Ki) + + ! Check errors next rotor revolution + m%CS%IsConverged = .true. + + ! Reset the azimuth index + m%Lin%AzimuthIndex = 1 + + ! Forcing linearization if time is close to tmax (with sufficient margin) + + ! If rotor has nonzero speed + if (T%ED%p(iED)%RotSpeed > 0) then + + ! If simulation is at least 10 revolutions, and error in rotor speed less than 0.1% + if ((p_FAST%TMax > 10*(TwoPi_D)/T%ED%p(iED)%RotSpeed) .and. & + (t_global >= p_FAST%TMax - 2._DbKi*(TwoPi_D)/T%ED%p(iED)%RotSpeed)) then + if (abs(T%ED%y(iED)%RotSpeed - T%ED%p(iED)%RotSpeed)/T%ED%p(iED)%RotSpeed < 0.001) then + m%CS%ForceLin = .true. + end if + end if + else + if (t_global >= p_FAST%TMax - 1.5_DbKi*p_FAST%DT) then + m%CS%ForceLin = .true. + end if + end if + + end if + end if + + ! If linearization is being forced, set flags and display message + if (m%CS%ForceLin) then + m%CS%IsConverged = .true. + m%CS%FoundSteady = .true. + call WrScr('') + call WrScr('[WARNING] Steady state not found before end of simulation. Forcing linearization.') + end if + +contains + + function CalcOutputErrorAtAzimuth() result(eps_squared) + real(R8Ki) :: eps_squared_sum, eps_squared + integer(IntKi) :: un, k + + ! Calculate difference between interpolated outputs for this rotation and + ! interpolated outputs from previous rotation + call MV_ComputeDiff(m%ModGlue%Vars%y, m%CS%y_interp, m%CS%y_azimuth(:, m%Lin%AzimuthIndex), m%CS%y_diff) + + ! Initialize epsilon squared sum + eps_squared_sum = 0.0_R8Ki + + ! Loop through glue output variables + do i = 1, size(m%ModGlue%Vars%y) + associate (Var => m%ModGlue%Vars%y(i)) + + ! Skip write outputs + if (MV_HasFlagsAll(Var, VF_WriteOut)) cycle + + ! Loop through values in variable + do j = Var%iLoc(1), Var%iLoc(2) + + ! If difference is not essentially zero, sum difference + if (.not. EqualRealNos(m%CS%y_diff(j), 0.0_R8Ki)) then + eps_squared_sum = eps_squared_sum + (m%CS%y_diff(j)/m%CS%y_ref(j))**2 + end if + end do + end associate + end do + + ! Normalize error by number of outputs + eps_squared = eps_squared_sum/m%CS%NumOutputs + + ! If debug output requested + if (CalcSteadyDebug) then + + call OpenFOutFile(un, "CSDiff-"//trim(Num2LStr(m%CS%NumRotations))//"-"//trim(Num2LStr(m%Lin%AzimuthIndex))//".csv", ErrStat2, ErrMsg2) + write (un, *) "name;interp;azimuth;diff;ref;err" + + ! Loop through glue output variables + do i = 1, size(m%ModGlue%Vars%y) + associate (Var => m%ModGlue%Vars%y(i)) + + ! Skip write outputs + if (MV_HasFlagsAll(Var, VF_WriteOut)) cycle + + ! Loop through values in variable + k = 1 + do j = Var%iLoc(1), Var%iLoc(2) + write (un, *) trim(Var%LinNames(k)), ";", m%CS%y_interp(j), ";", m%CS%y_azimuth(j, m%Lin%AzimuthIndex), ";", & + m%CS%y_diff(j), ";", m%CS%y_ref(j), ";", (m%CS%y_diff(j)/m%CS%y_ref(j))**2 + k = k + 1 + end do + end associate + end do + + close (un) + end if + end function + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + +subroutine ModGlue_Linearize_OP(p, m, y, p_FAST, m_FAST, y_FAST, t_global, Turbine, ErrStat, ErrMsg) + + type(Glue_ParameterType), intent(inout) :: p !< Glue parameters + type(Glue_MiscVarType), intent(inout) :: m !< Glue MiscVars + type(Glue_OutputFileType), intent(inout) :: y !< Glue Output + type(FAST_ParameterType), intent(in) :: p_FAST + type(FAST_MiscVarType), intent(inout) :: m_FAST + type(FAST_OutputFileType), intent(inout) :: y_FAST + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + real(DbKi), intent(IN) :: t_global !< current (global) simulation time + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'ModGlue_Linearize_OP' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, k + integer(IntKi) :: ix, iz, iu, iy + integer(IntKi) :: Un + integer(IntKi) :: StateLinIndex, InputLinIndex + integer(IntKi), parameter :: iED = 1 + character(200) :: SimStr + character(MaxWrScrLen) :: BlankLine + character(1024) :: LinRootName + character(*), parameter :: Fmt = 'F10.2' + + ! Initialize error return + ErrStat = ErrID_None + ErrMsg = "" + + ! Write message to screen + BlankLine = "" + call WrOver(BlankLine) ! BlankLine contains MaxWrScrLen spaces + SimStr = '(RotSpeed='//trim(Num2LStr(Turbine%ED%y(iED)%RotSpeed*RPS2RPM, Fmt))//' rpm, BldPitch1='//trim(Num2LStr(Turbine%ED%y(iED)%BlPitch(1)*R2D, Fmt))//' deg)' + call WrOver(' Performing linearization '//trim(Num2LStr(m%Lin%TimeIndex))//' at simulation time '//TRIM(Num2LStr(t_global))//' s. '//trim(SimStr)) + call WrScr('') + + !---------------------------------------------------------------------------- + ! Save operating point + !---------------------------------------------------------------------------- + + ! If flag set to save operating points during linearization + if (p%Lin%SaveOPs) then + call ModGlue_SaveOperatingPoint(p, m, m%Lin%TimeIndex, .true., Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end if + + !---------------------------------------------------------------------------- + ! Initialization + !---------------------------------------------------------------------------- + + ! Get parameters + y_FAST%Lin%RotSpeed = Turbine%ED%y(iED)%RotSpeed + y_FAST%Lin%Azimuth = Turbine%ED%y(iED)%LSSTipPxa + + ! Assemble linearization root file name + LinRootName = trim(p_FAST%OutFileRoot)//'.'//trim(Num2LStr(m%Lin%TimeIndex)) + + ! Get unit number for writing files + call GetNewUnit(Un, ErrStat2, ErrMsg2); if (Failed()) return + + ! Initialize the index numbers + ix = 1 + iz = 1 + iu = 1 + iy = 1 + + ! Initialize data in Jacobian matrices to zero + if (allocated(m%ModGlue%Lin%dYdu)) m%ModGlue%Lin%dYdu = 0.0_R8Ki + if (allocated(m%ModGlue%Lin%dXdu)) m%ModGlue%Lin%dXdu = 0.0_R8Ki + if (allocated(m%ModGlue%Lin%dYdx)) m%ModGlue%Lin%dYdx = 0.0_R8Ki + if (allocated(m%ModGlue%Lin%dXdx)) m%ModGlue%Lin%dXdx = 0.0_R8Ki + + ! Loop through linearization modules by index + do i = 1, size(m%ModGlue%ModData) + associate (ModData => m%ModGlue%ModData(i)) + + ! Derivatives with respect to input + call FAST_JacobianPInput(ModData, t_global, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2, & + dYdu=ModData%Lin%dYdu, dYdu_glue=m%ModGlue%Lin%dYdu, & + dXdu=ModData%Lin%dXdu, dXdu_glue=m%ModGlue%Lin%dXdu) + if (Failed()) return + + ! Derivatives with respect to continuous state + call FAST_JacobianPContState(ModData, t_global, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2, & + dYdx=ModData%Lin%dYdx, dYdx_glue=m%ModGlue%Lin%dYdx, & + dXdx=ModData%Lin%dXdx, dXdx_glue=m%ModGlue%Lin%dXdx) + if (Failed()) return + + ! Operating point values (must come after Jacobian routines because + ! some modules calculate OP in those routines [MD]) + call FAST_GetOP(ModData, t_global, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2, & + u_op=ModData%Lin%u, u_glue=m%ModGlue%Lin%u, & + y_op=ModData%Lin%y, y_glue=m%ModGlue%Lin%y, & + x_op=ModData%Lin%x, x_glue=m%ModGlue%Lin%x, & + dx_op=ModData%Lin%dx, dx_glue=m%ModGlue%Lin%dx) + if (Failed()) return + + ! If requested, write the module linearization matrices was requested + if (p_FAST%LinOutMod) then + call ModGlue_CalcWriteLinearMatrices(ModData%Vars, ModData%Lin, p_FAST, y_FAST, t_global, Un, & + LinRootName, VF_Linearize, ErrStat2, ErrMsg2, ModSuffix=ModData%Abbr) + if (Failed()) return + end if + + end associate + end do + + ! Copy arrays into linearization operating points + if (allocated(m%ModGlue%Lin%x)) y%Lin%x(:, m%Lin%TimeIndex) = m%ModGlue%Lin%x + if (allocated(m%ModGlue%Lin%u)) y%Lin%u(:, m%Lin%TimeIndex) = m%ModGlue%Lin%u + + ! Linearize mesh mappings to populate dUdy and dUdu + call FAST_LinearizeMappings(m%ModGlue, m%Mappings, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Write glue code matrices to file + call ModGlue_CalcWriteLinearMatrices(m%ModGlue%Vars, m%ModGlue%Lin, p_FAST, y_FAST, t_global, Un, LinRootName, VF_Linearize, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Update index for next linearization time + m%Lin%TimeIndex = m%Lin%TimeIndex + 1 + +contains + logical function JacobianHasNaNs(Jac, label, abbr) + real(R8Ki), allocatable, intent(in) :: Jac(:, :) + character(*), intent(in) :: label, abbr + JacobianHasNaNs = .false. + if (.not. allocated(Jac)) return + if (size(Jac) == 0) return + if (.not. any(isnan(Jac))) return + ErrStat = ErrID_Fatal + ErrMsg = 'NaNs detected in dXdx for module '//abbr + JacobianHasNaNs = .true. + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + +subroutine ModGlue_SaveOperatingPoint(p, m, OPIndex, NewCopy, Turbine, ErrStat, ErrMsg) + type(Glue_ParameterType), intent(in) :: p + type(Glue_MiscVarType), intent(inout) :: m + integer(IntKi), intent(in) :: OPIndex + logical, intent(in) :: NewCopy + type(FAST_TurbineType), intent(inout) :: Turbine + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'ModGlue_SaveOperatingPoint' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: StateIndex, InputIndex, CtrlCode, i + + ErrStat = ErrID_None + ErrMsg = '' + + ! Set CtrlCode based on NewCopy flag + if (NewCopy) then + CtrlCode = MESH_NEWCOPY + else + CtrlCode = MESH_UPDATECOPY + end if + + ! Index into state array where linearization data will be stored for this OP + StateIndex = NumStateTimes + OPIndex + + ! Index into input save array where linearization data will be stored for OP + InputIndex = Turbine%p_FAST%InterpOrder + 1 + OPIndex + + ! Loop through modules by index + do i = 1, size(p%Lin%iMod) + associate (ModData => m%ModData(p%Lin%iMod(i))) + + ! Copy current module state to linearization save location + call FAST_CopyStates(ModData, Turbine, STATE_CURR, StateIndex, CtrlCode, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Copy current module output to linearization save location + call FAST_CopyInput(ModData, Turbine, INPUT_CURR, -InputIndex, CtrlCode, ErrStat2, ErrMsg2) + if (Failed()) return + + end associate + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + +subroutine ModGlue_RestoreOperatingPoint(p, m, OPIndex, Turbine, ErrStat, ErrMsg) + type(Glue_ParameterType), intent(in) :: p + type(Glue_MiscVarType), intent(inout) :: m + integer(IntKi), intent(in) :: OPIndex + type(FAST_TurbineType), intent(inout) :: Turbine + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'ModGlue_RestoreOperatingPoint' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: StateIndex, InputIndex, i + + ErrStat = ErrID_None + ErrMsg = '' + + ! Index into state array where linearization data will be stored for this OP + StateIndex = NumStateTimes + OPIndex + + ! Index into input save array where linearization data will be stored for OP + InputIndex = -(Turbine%p_FAST%InterpOrder + 1 + OPIndex) + + ! Loop through modules by index + do i = 1, size(p%Lin%iMod) + associate (ModData => m%ModData(p%Lin%iMod(i))) + + ! Copy current module state to linearization save location + call FAST_CopyStates(ModData, Turbine, StateIndex, STATE_CURR, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Copy current module input to linearization save location + call FAST_CopyInput(ModData, Turbine, InputIndex, INPUT_CURR, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + end associate + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + +!> CalcGlueStateMatrices forms the full-system state matrices for linearization: A, B, C, and D. +!! Note that it uses LAPACK_GEMM instead of MATMUL for matrix multiplications because of stack-space issues (these +!! matrices get large quickly). +subroutine CalcGlueStateMatrices(Vars, Lin, JacScaleFactor, ErrStat, ErrMsg) + type(ModVarsType), intent(in) :: Vars !< Glue variable data + type(ModLinType), intent(inout) :: Lin !< Glue linearization data + real(R8Ki), intent(in) :: JacScaleFactor !< Scale factor for conditioning the Jacobians + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'CalcGlueStateMatrices' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + real(R8Ki), allocatable :: G(:, :), tmp(:, :) + integer(IntKi), allocatable :: ipiv(:) + + if (.not. allocated(Lin%dUdu)) return + + ! A = dXdx + ! B = dXdu + ! C = dYdx + ! D = dYdu + + ! call DumpMatrix(1000, "dUdu.bin", Lin%dUdu, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(1000, "dUdy.bin", Lin%dUdy, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(1000, "A.bin", Lin%dXdx, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(1000, "B.bin", Lin%dXdu, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(1000, "C.bin", Lin%dYdx, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(1000, "D.bin", Lin%dYdu, ErrStat2, ErrMsg2); if (Failed()) return + + ! *** get G matrix **** + !---------------------- + call AllocAry(G, size(Lin%dUdu, 1), size(Lin%dUdu, 2), 'G', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(ipiv, Vars%Nu, 'ipiv', ErrStat2, ErrMsg2); if (Failed()) return + + ! G = dUdu + matmul(dUdy, y_FAST%Lin%Glue%D) + G = Lin%dUdu + call LAPACK_GEMM('N', 'N', 1.0_R8Ki, Lin%dUdy, Lin%dYdu, 1.0_R8Ki, G, ErrStat2, ErrMsg2); if (Failed()) return + + ! G can be ill-conditioned, so we are going to precondition with G_hat = S^(-1) * G * S + ! we will also multiply the right-hand-side of the equations that need G inverse so that + ! dUdy_hat = S^(-1)*dUdy and dUdu_hat = S^(-1)*dUdu + call Precondition(Vars%u, G, Lin%dUdu, Lin%dUdy, JacScaleFactor) + + ! Form G_hat^(-1) * (S^-1*dUdy) and G^(-1) * (S^-1*dUdu) + ! factor G for the two solves: + call LAPACK_getrf(M=size(G, 1), N=size(G, 2), A=G, IPIV=ipiv, ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + ! after the this solve, dUdy holds G_hat^(-1) * dUdy_hat: + call LAPACK_getrs(trans='N', N=size(G, 2), A=G, IPIV=ipiv, B=Lin%dUdy, ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + ! after the this solve, dUdu holds G_hat^(-1) * dUdu_hat: + call LAPACK_getrs(trans='N', N=size(G, 2), A=G, IPIV=ipiv, B=Lin%dUdu, ErrStat=ErrStat2, ErrMsg=ErrMsg2); if (Failed()) return + + ! Deallocate G and ipiv because the solves are complete + deallocate (G) + deallocate (ipiv) + + ! After this call, dUdu holds G^(-1)*dUdu and dUdy holds G^(-1)*dUdy + call Postcondition(Vars%u, Lin%dUdu, Lin%dUdy, JacScaleFactor) + + ! Allocate tmp matrix for A and C calculations + call AllocAry(tmp, Vars%Nu, Vars%Nx, 'G^-1*dUdy*C', ErrStat2, ErrMsg2); if (Failed()) return + + ! tmp = G^(-1) * dUdy * diag(C) + call LAPACK_GEMM('N', 'N', 1.0_R8Ki, Lin%dUdy, Lin%dYdx, 0.0_R8Ki, tmp, ErrStat2, ErrMsg2); if (Failed()) return + + ! A + ! dXdx = dXdx - matmul(dXdu, tmp) + call LAPACK_GEMM('N', 'N', -1.0_R8Ki, Lin%dXdu, tmp, 1.0_R8Ki, Lin%dXdx, ErrStat2, ErrMsg2); if (Failed()) return + + ! C + ! dYdx = dYdx - matmul(dYdu, tmp) + call LAPACK_GEMM('N', 'N', -1.0_R8Ki, Lin%dYdu, tmp, 1.0_R8Ki, Lin%dYdx, ErrStat2, ErrMsg2); if (Failed()) return + + ! B + tmp = Lin%dXdu + ! dXdu = matmul(dXdu, dUdu) + call LAPACK_GEMM('N', 'N', 1.0_R8Ki, tmp, Lin%dUdu, 0.0_R8Ki, Lin%dXdu, ErrStat2, ErrMsg2); if (Failed()) return + + ! D + tmp = Lin%dYdu + ! D = matmul(dYdu, dUdu) + call LAPACK_GEMM('N', 'N', 1.0_R8Ki, tmp, Lin%dUdu, 0.0_R8Ki, Lin%dYdu, ErrStat2, ErrMsg2); if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + +!> Precondition returns the preconditioned matrix, hat{G}, such that hat{G} = S^(-1) G S withS^(-1 defined +!! such that loads are scaled by p_FAST%UJacSclFact. It also returns the preconditioned matrices hat{dUdu} and +!! hat{dUdy} such that hat{dUdu} = S^(-1) dUdu and +!! hat{dUdy} = S^(-1) dUdy for the right-hand sides of the equations to be solved. +subroutine Precondition(uVars, G, dUdu, dUdy, JacScaleFactor) + type(ModVarType), intent(in) :: uVars(:) !< Input variables from glue code + real(R8Ki), intent(inout) :: G(:, :) !< variable for glue-code linearization (in is G; out is G_hat) + real(R8Ki), intent(inout) :: dUdu(:, :) !< jacobian in FAST linearization from right-hand-side of equation + real(R8Ki), intent(inout) :: dUdy(:, :) !< jacobian in FAST linearization from right-hand-side of equation + real(R8Ki), intent(in) :: JacScaleFactor !< jacobian scale factor + real(R8Ki), allocatable :: diag(:) !< diagonal elements of G + integer(IntKi) :: LoadFlags + integer(IntKi) :: i, j, k + logical :: isRowLoad, isColLoad + logical, allocatable :: isLoad(:) + + allocate (isLoad(size(dUdu, 1))) + isLoad = .false. + + ! Loop through glue code input variables (cols) + do i = 1, size(uVars) + + ! Get if col variable is a load + isColLoad = MV_IsLoad(uVars(i)) + + ! Get col variable start and end indices in matrix + associate (iLoc => uVars(i)%iLoc) + + isLoad(iLoc(1):iLoc(2)) = isColLoad + + ! Loop through glue code input variables (rows) + do j = 1, size(uVars) + + ! Get if row variable is a load + isRowLoad = MV_IsLoad(uVars(j)) + + ! Get row variable start and end indices in matrix + associate (jLoc => uVars(j)%iLoc) + + if (isColLoad .and. (.not. isRowLoad)) then + + ! Multiply columns of G + G(jLoc(1):jLoc(2), iLoc(1):iLoc(2)) = G(jLoc(1):jLoc(2), iLoc(1):iLoc(2))*JacScaleFactor + + else if (isRowLoad .and. (.not. isColLoad)) then + + ! Divide rows of G + G(jLoc(1):jLoc(2), iLoc(1):iLoc(2)) = G(jLoc(1):jLoc(2), iLoc(1):iLoc(2))/JacScaleFactor + + end if + + end associate + + end do + + ! Divide rows of dUdu and dUdy by scale factor + if (isColLoad) then + dUdu(iLoc(1):iLoc(2), :) = dUdu(iLoc(1):iLoc(2), :)/JacScaleFactor + dUdy(iLoc(1):iLoc(2), :) = dUdy(iLoc(1):iLoc(2), :)/JacScaleFactor + end if + + end associate + + end do + +end subroutine + +!> This routine returns the matrices tilde{dUdu} and tilde{dUdy} such that +!! tilde{dUdu} = G^(-1) dUdu and +!! tilde{dUdy} = G^(-1) dUdy, which have been solved using the preconditioned system defined in fast_lin::precondition. +subroutine Postcondition(uVars, dUdu, dUdy, JacScaleFactor) + type(ModVarType), intent(in) :: uVars(:) !< Input variables from glue code + real(R8Ki), intent(in) :: JacScaleFactor !< jacobian scale factor + real(R8Ki), intent(inout) :: dUdu(:, :) !< jacobian in FAST linearization from right-hand-side of equation + real(R8Ki), intent(inout) :: dUdy(:, :) !< jacobian in FAST linearization from right-hand-side of equation + integer(IntKi) :: i + + ! Loop through glue code input varies + do i = 1, size(uVars) + + ! If variable is a (force or moment), apply post-conditioner + if (uVars(i)%Field == FieldForce .or. uVars(i)%Field == FieldMoment) then + + ! Otherwise get variable start and end indices in matrix + associate (iLoc => uVars(i)%iLoc) + + ! Multiply rows of dUdu + dUdu(iLoc(1):iLoc(2), :) = dUdu(iLoc(1):iLoc(2), :)*JacScaleFactor + + ! Multiply rows of dUdy + dUdy(iLoc(1):iLoc(2), :) = dUdy(iLoc(1):iLoc(2), :)*JacScaleFactor + + end associate + + end if + end do + +end subroutine + +subroutine ModGlue_CalcWriteLinearMatrices(Vars, Lin, p_FAST, y_FAST, t_global, Un, LinRootName, FilterFlag, ErrStat, ErrMsg, ModSuffix, CalcGlue, FullOutput) + type(ModVarsType), intent(in) :: Vars !< Variable data + type(ModLinType), intent(inout) :: Lin !< Linearization data + type(FAST_ParameterType), intent(in) :: p_FAST !< Parameters + type(FAST_OutputFileType), intent(in) :: y_FAST !< Output variables + real(DbKi), intent(in) :: t_global !< current time step (written in file) + integer(IntKi), intent(in) :: Un !< Unit number for file + character(*), intent(in) :: LinRootName !< output file name + integer(IntKi), intent(in) :: FilterFlag !< Variable flag for filtering + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + character(*), optional, intent(in) :: ModSuffix !< Module suffix for file name + logical, optional, intent(in) :: CalcGlue !< Flag to calculate glue state matrices + logical, optional, intent(in) :: FullOutput !< Flag to output all Jacobians + + character(*), parameter :: RoutineName = 'WriteModuleLinearMatrices' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(32) :: Desc + character(1024) :: OutFileName + integer(IntKi) :: i + integer(IntKi) :: Nx, Nu, Ny + character(50) :: Fmt + logical, allocatable :: uUse(:), yUse(:), xUse(:) + logical :: CalcGlueLoc, FullOutputLoc + + ErrStat = ErrID_None + ErrMsg = "" + + ! Assemble output file name based on glue linearization abbreviation + if (present(ModSuffix)) then + OutFileName = trim(LinRootName)//"."//trim(ModSuffix)//".lin" + CalcGlueLoc = .false. + else + OutFileName = trim(LinRootName)//".lin" + CalcGlueLoc = .true. + end if + + if (present(FullOutput)) then + FullOutputLoc = FullOutput + else + FullOutputLoc = p_FAST%LinOutJac + end if + + ! Set flag to calculate glue matrices based on optional parameter + if (present(CalcGlue)) CalcGlueLoc = CalcGlue + + ! Open linearization file + call OpenFOutFile(Un, OutFileName, ErrStat2, ErrMsg2); if (Failed()) return + + ! Calculate number of values in variable after applying filter + Nx = MV_NumVals(Vars%x, FilterFlag) + Nu = MV_NumVals(Vars%u, FilterFlag) + Ny = MV_NumVals(Vars%y, FilterFlag) + + !---------------------------------------------------------------------------- + ! Header + !---------------------------------------------------------------------------- + + write (Un, '(/,A)') 'Linearized model: '//trim(y_FAST%FileDescLines(1)) + write (Un, '(1X,A,/)') trim(y_FAST%FileDescLines(2)) + write (Un, '(A,/)') trim(y_FAST%FileDescLines(3)) + + write (Un, '(A)') 'Simulation information:' + + fmt = '(3x,A,1x,'//trim(p_FAST%OutFmt_t)//',1x,A)' + Desc = 'Simulation time:'; write (Un, fmt) Desc, t_global, 's' + Desc = 'Rotor Speed: '; write (Un, fmt) Desc, y_FAST%Lin%RotSpeed, 'rad/s' + Desc = 'Azimuth: '; write (Un, fmt) Desc, y_FAST%Lin%Azimuth, 'rad' + Desc = 'Wind Speed: '; write (Un, fmt) Desc, y_FAST%Lin%WindSpeed, 'm/s' + + fmt = '(3x,A,1x,I5)' + Desc = 'Number of continuous states: '; write (Un, fmt) Desc, Nx + Desc = 'Number of discrete states: '; write (Un, fmt) Desc, 0 + Desc = 'Number of constraint states: '; write (Un, fmt) Desc, 0 + Desc = 'Number of inputs: '; write (Un, fmt) Desc, Nu + Desc = 'Number of outputs: '; write (Un, fmt) Desc, Ny + + Desc = 'Jacobians included in this file?' + fmt = '(3x,A,1x,A5)' + if (p_FAST%LinOutJac) then + write (Un, fmt) Desc, 'Yes' + else + write (Un, fmt) Desc, 'No' + end if + + write (Un, '()') !print a blank line + + if (Nx > 0 .and. allocated(Lin%x)) then + write (Un, '(A)') 'Order of continuous states:' + call WrLinFile_txt_Table(Vars%x, FilterFlag, p_FAST, Un, "Row/Column", Lin%x) + end if + + if (Nx > 0 .and. allocated(Lin%dx)) then + write (Un, '(A)') 'Order of continuous state derivatives:' + call WrLinFile_txt_Table(Vars%x, FilterFlag, p_FAST, Un, "Row/Column", Lin%dx, IsDeriv=.true.) + end if + + if (Nu > 0 .and. allocated(Lin%u)) then + write (Un, '(A)') 'Order of inputs:' + call WrLinFile_txt_Table(Vars%u, FilterFlag, p_FAST, Un, "Column ", Lin%u, ShowRot=.true.) + end if + + if (Ny > 0 .and. allocated(Lin%y)) then + write (Un, '(A)') 'Order of outputs:' + call WrLinFile_txt_Table(Vars%y, FilterFlag, p_FAST, Un, "Row ", Lin%y, ShowRot=.true.) + end if + + ! Create boolean array indicating which continuous state values to write + allocate (xUse(Vars%Nx)) + xUse = .false. + do i = 1, size(Vars%x) + associate (Var => Vars%x(i)) + if (MV_HasFlagsAll(Var, FilterFlag)) xUse(Var%iLoc(1):Var%iLoc(2)) = .true. + end associate + end do + + ! Create boolean array indicating which input values to write + allocate (uUse(Vars%Nu)) + uUse = .false. + do i = 1, size(Vars%u) + associate (Var => Vars%u(i)) + if (MV_HasFlagsAll(Var, FilterFlag)) uUse(Var%iLoc(1):Var%iLoc(2)) = .true. + end associate + end do + + ! Create boolean array indicating which output values to write + allocate (yUse(Vars%Ny)) + yUse = .false. + do i = 1, size(Vars%y) + associate (Var => Vars%y(i)) + if (MV_HasFlagsAll(Var, FilterFlag)) yUse(Var%iLoc(1):Var%iLoc(2)) = .true. + end associate + end do + + ! If Jacobian matrix output is requested + if (FullOutputLoc) then + write (Un, '(/,A,/)') 'Jacobian matrices:' + if (allocated(Lin%dUdu)) call WrPartialMatrix(Lin%dUdu, Un, p_FAST%OutFmt, 'dUdu', UseRow=uUse, UseCol=uUse) + if (allocated(Lin%dUdy)) call WrPartialMatrix(Lin%dUdy, Un, p_FAST%OutFmt, 'dUdy', UseRow=uUse, UseCol=yUse) + if (allocated(Lin%dXdy)) call WrPartialMatrix(Lin%dXdy, Un, p_FAST%OutFmt, 'dXdy', UseRow=xUse, UseCol=yUse) + if (allocated(Lin%J)) call WrPartialMatrix(Lin%J, Un, p_FAST%OutFmt, 'J') + if (present(ModSuffix)) then + if (allocated(Lin%dXdx)) call WrPartialMatrix(Lin%dXdx, Un, p_FAST%OutFmt, 'dXdx', UseRow=xUse, UseCol=xUse) + if (allocated(Lin%dXdu)) call WrPartialMatrix(Lin%dXdu, Un, p_FAST%OutFmt, 'dXdu', UseRow=xUse, UseCol=uUse) + if (allocated(Lin%dYdx)) call WrPartialMatrix(Lin%dYdx, Un, p_FAST%OutFmt, 'dYdx', UseRow=yUse, UseCol=xUse) + if (allocated(Lin%dYdu)) call WrPartialMatrix(Lin%dYdu, Un, p_FAST%OutFmt, 'dYdu', UseRow=yUse, UseCol=uUse) + end if + end if + + ! If this is glue code module, calculate the glue code state matrices (A, B, C, D) + ! Called here, after writing dUdu and dUdy, because those matrices are overwritten + ! in the process of calculating the other state matrices + if (CalcGlueLoc) then + call CalcGlueStateMatrices(Vars, Lin, real(p_FAST%UJacSclFact, R8Ki), ErrStat2, ErrMsg2) + if (Failed()) return + end if + + ! Write the linearized state matrices + write (Un, '(/,A,/)') 'Linearized state matrices:' + if (allocated(Lin%dXdx)) call WrPartialMatrix(Lin%dXdx, Un, p_FAST%OutFmt, 'A', UseRow=xUse, UseCol=xUse) + if (allocated(Lin%dXdu)) call WrPartialMatrix(Lin%dXdu, Un, p_FAST%OutFmt, 'B', UseRow=xUse, UseCol=uUse) + if (allocated(Lin%dYdx)) call WrPartialMatrix(Lin%dYdx, Un, p_FAST%OutFmt, 'C', UseRow=yUse, UseCol=xUse) + if (allocated(Lin%dYdu)) call WrPartialMatrix(Lin%dYdu, Un, p_FAST%OutFmt, 'D', UseRow=yUse, UseCol=uUse) + + ! Close file + close (Un) + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + if (Failed) close (Un) + end function Failed +end subroutine ModGlue_CalcWriteLinearMatrices + +subroutine WrLinFile_txt_Table(VarAry, FlagFilter, p_FAST, Un, RowCol, op, IsDeriv, ShowRot) + + type(ModVarType), intent(in) :: VarAry(:) !< variable array + integer(IntKi), intent(in) :: FlagFilter !< unit number + type(FAST_ParameterType) :: p_FAST !< Parameters + integer(IntKi), intent(in) :: Un !< unit number + character(*), intent(in) :: RowCol !< Row/Column description + real(R8Ki), intent(in) :: op(:) !< operating point values (possibly different size that Desc because of orientations) + logical, optional, intent(in) :: IsDeriv !< flag that tells us if we need to modify the channel names for derivatives (xdot) + logical, optional, intent(in) :: ShowRot !< flag to show rotation matrix if field is orientation + + character(*), parameter :: RoutineName = 'WrLinFile_txt_Table' + integer(IntKi) :: TS ! Tab stop column + integer(IntKi) :: i_op ! Index of value in operating piont + logical :: IsDerivLoc ! flag that tells us if we need to modify the channel names for derivatives (xdot) + logical :: VarRotFrame ! flag that tells us if this column is in the rotating frame + integer(IntKi) :: VarDerivOrder ! integer indicating the maximum time-derivative order of a channel (this will be 0 for anything that is not a continuous state) + character(100) :: Fmt, FmtStr, FmtRot + character(25) :: DerivStr, DerivUnitStr + logical :: ShowRotLoc + real(R8Ki) :: DCM(3, 3), rv(3) + integer(IntKi) :: i, j, RowColIdx + + ShowRotLoc = .false. + if (present(ShowRot)) ShowRotLoc = ShowRot + + IsDerivLoc = .false. + if (present(IsDeriv)) IsDerivLoc = IsDeriv + + if (IsDerivLoc) then + if (p_FAST%CompAeroMaps .and. p_FAST%CompElast /= MODULE_BD) then ! this might not work if we are using some other (not BD, ED) module with states + DerivStr = 'Second time derivative of' + DerivUnitStr = '/s^2' + else + DerivStr = 'First time derivative of' + DerivUnitStr = '/s' + end if + else + DerivStr = '' + DerivUnitStr = '' + end if + + ! tab stop after operating point + TS = 14 + 3*p_FAST%FmtWidth + 7 + + ! Construct write formats + Fmt = '(3x,I8,3x,'//trim(p_FAST%OutFmt)//',T'//trim(Num2LStr(TS))//',L8,8x,I8,9x,A)' + FmtRot = '(3x,I8,3x,'//trim(p_FAST%OutFmt)//',2(", ",'//trim(p_FAST%OutFmt)//'),T'//trim(Num2LStr(TS))//',L8,8x,I8,9x,A)' + FmtStr = '(3x,A10,1x,A,T'//trim(Num2LStr(TS))//',A15,1x,A16,1x,A)' + + ! Write header + write (Un, FmtStr) RowCol, 'Operating Point', 'Rotating Frame?', 'Derivative Order', 'Description' + write (Un, FmtStr) '----------', '---------------', '---------------', '----------------', '-----------' + + ! Loop through variables in array + RowColIdx = 0 + do i = 1, size(VarAry) + associate (Var => VarAry(i)) + + ! If variable does not have the filter flag, continue + if (.not. MV_HasFlagsAll(Var, FlagFilter)) cycle + + ! Is variable in the rotating frame? + VarRotFrame = MV_HasFlagsAll(Var, VF_RotFrame) + + ! Get variable derivative order + if (MV_HasFlagsAll(Var, VF_DerivOrder2)) then + VarDerivOrder = 2 + else if (MV_HasFlagsAll(Var, VF_DerivOrder1)) then + VarDerivOrder = 1 + else + VarDerivOrder = 0 + end if + + ! Loop through values in variable + do j = 1, Var%Num + + ! Increment value counter + RowColIdx = RowColIdx + 1 + + ! Index in operating point array + i_op = Var%iLoc(1) + j - 1 + + ! If variable is orientation and show rotation matrix flag is true + if (ShowRotLoc .and. (Var%Field == FieldOrientation)) then + + ! Skip writing if not the first value in orientation (3 values) + if (mod(j - 1, 3) /= 0) cycle + + ! Convert quaternion parameters to DCM + DCM = quat_to_dcm(real(op(i_op:i_op + 2), R8Ki)) + + ! Write 3 rows of data (full dcm) + write (Un, FmtRot) RowColIdx + 0, dcm(1, 1), dcm(1, 2), dcm(1, 3), VarRotFrame, VarDerivOrder, trim(Var%LinNames(j + 0)) + write (Un, FmtRot) RowColIdx + 1, dcm(2, 1), dcm(2, 2), dcm(2, 3), VarRotFrame, VarDerivOrder, trim(Var%LinNames(j + 1)) + write (Un, FmtRot) RowColIdx + 2, dcm(3, 1), dcm(3, 2), dcm(3, 3), VarRotFrame, VarDerivOrder, trim(Var%LinNames(j + 2)) + + else if (IsDerivLoc) then + + write (Un, Fmt) RowColIdx, op(i_op), VarRotFrame, VarDerivOrder, trim(DerivStr)//' '//trim(Var%LinNames(j))//trim(DerivUnitStr) + + else if (MV_HasFlagsAll(Var, VF_WM_Rot)) then ! BeamDyn state orientation + + ! Skip writing if not the first value in orientation (3 values) + if (mod(j - 1, 3) /= 0) cycle + + ! Convert from quaternion to rotation vector + rv = quat_to_rvec(op(i_op:i_op + 2)) + + ! Write all components of WM parameters + write (Un, Fmt) RowColIdx + 0, rv(1), VarRotFrame, VarDerivOrder, trim(Var%LinNames(j + 0)) + write (Un, Fmt) RowColIdx + 1, rv(2), VarRotFrame, VarDerivOrder, trim(Var%LinNames(j + 1)) + write (Un, Fmt) RowColIdx + 2, rv(3), VarRotFrame, VarDerivOrder, trim(Var%LinNames(j + 2)) + + else + + write (Un, Fmt) RowColIdx, op(i_op), VarRotFrame, VarDerivOrder, trim(Var%LinNames(j)) + + end if + + end do + end associate + end do + + write (Un, '()') !print a blank line + +end subroutine WrLinFile_txt_Table + +end module diff --git a/modules/openfast-library/src/FAST_Mods.f90 b/modules/openfast-library/src/FAST_Mods.f90 index a09e8f43d5..b7403451de 100644 --- a/modules/openfast-library/src/FAST_Mods.f90 +++ b/modules/openfast-library/src/FAST_Mods.f90 @@ -21,8 +21,7 @@ !********************************************************************************************************************************** MODULE FAST_ModTypes - USE NWTC_Library - USE FAST_Types + USE NWTC_Library_Types TYPE(ProgDesc) :: FAST_Ver = ProgDesc( 'OpenFAST', '', '' ) !< The version number of this module @@ -40,6 +39,11 @@ MODULE FAST_ModTypes INTEGER(IntKi), PARAMETER :: STATE_SAVED_CURR = 3 INTEGER(IntKi), PARAMETER :: STATE_SAVED_PRED = 4 + ! input array indices + INTEGER(IntKi), PARAMETER :: INPUT_TEMP = 0 + INTEGER(IntKi), PARAMETER :: INPUT_CURR = 1 + INTEGER(IntKi), PARAMETER :: INPUT_PREV = 2 + ! VTK visualization INTEGER(IntKi), PARAMETER :: VTK_Unknown = -1 !< unknown option (will produce error) INTEGER(IntKi), PARAMETER :: VTK_None = 0 !< none (no VTK output) @@ -70,7 +74,6 @@ MODULE FAST_ModTypes LOGICAL, PARAMETER :: BD_Solve_Option1 = .TRUE. - END MODULE FAST_ModTypes !======================================================================= diff --git a/modules/openfast-library/src/FAST_Registry.txt b/modules/openfast-library/src/FAST_Registry.txt index 4c1915047b..5aa331a16b 100644 --- a/modules/openfast-library/src/FAST_Registry.txt +++ b/modules/openfast-library/src/FAST_Registry.txt @@ -11,15 +11,17 @@ ################################################################################################################################### # ...... Include files (definitions from NWTC Library and module components) ............................................................................ include Registry_NWTC_Library.txt +usefrom Glue_Registry.txt usefrom ElastoDyn_Registry.txt usefrom SED_Registry.txt usefrom Registry_BeamDyn.txt usefrom ServoDyn_Registry.txt usefrom AeroDyn_Registry.txt usefrom AeroDisk_Registry.txt -usefrom ExtLoads_Registry.txt +usefrom ExtLoads_Registry.txt usefrom SubDyn_Registry.txt usefrom SeaState.txt +usefrom SoilDyn_Registry.txt usefrom HydroDyn.txt usefrom IceFloe_FASTRegistry.inp usefrom InflowWind.txt @@ -36,7 +38,11 @@ usefrom ExtPtfm_MCKF_Registry.txt # MODULE IDENTIFIERS: # NOTE WELL: The order of these modules is the order they get written to the output file; # Make sure the module identifiers start at 1 and that this order matches the orders in WrOutputLine and FAST_InitOutput!!! -param FAST - INTEGER Module_Unknown - -1 - "Unknown" - +param FAST - INTEGER LooseCoupling - 1 - "Loose Module Coupling" - +param FAST - INTEGER TightCouplingFixed - 2 - "Tight Module Coupling with fixed Jacobian updates (DT_UJac)" - +param FAST - INTEGER TightCouplingAdaptive - 3 - "Tight Module Coupling with adaptive Jacobian updates" - +# Module Identifiers +param ^ - INTEGER Module_Unknown - -1 - "Unknown" - param ^ - INTEGER Module_None - 0 - "No module selected" - param ^ - INTEGER Module_Glue - 1 - "Glue code" - param ^ - INTEGER Module_IfW - 2 - "InflowWind" - @@ -58,9 +64,10 @@ param ^ - INTEGER Module_IceF - 18 - "IceFloe" - param ^ - INTEGER Module_IceD - 19 - "IceDyn" - param ^ - INTEGER Module_ADsk - 20 - "AeroDisk" - param ^ - INTEGER Module_SED - 21 - "Simplified-ElastoDyn" - -param ^ - INTEGER NumModules - 21 - "The number of modules available in FAST" - +param ^ - INTEGER Module_SlD - 22 - "SoilDyn" - +param ^ - INTEGER NumModules - 22 - "The number of modules available in FAST" - # Other Constants -param ^ - INTEGER MaxNBlades - 3 - "Maximum number of blades allowed on a turbine" - +param ^ - INTEGER MaxBladesBD - 3 - "Maximum number of blades allowed on a turbine" - param ^ - INTEGER IceD_MaxLegs - 4 - "because I don't know how many legs there are before calling IceD_Init and I don't want to copy the data because of sibling mesh issues, I'm going to allocate IceD based on this number" - # Constants for steady-state solve (indices for output channels) param ^ - INTEGER SS_Indx_Pitch - 1 - "pitch" - @@ -89,7 +96,7 @@ typedef ^ FAST_VTK_SurfaceType SiKi MorisonVisRad {:} - - "radius of each Moriso typedef ^ FAST_VTK_ModeShapeType CHARACTER(1024) CheckpointRoot - - - "name of the checkpoint file written by FAST when linearization data was produced" -typedef ^ FAST_VTK_ModeShapeType CHARACTER(1024) MatlabFileName - - - "name of the file with eigenvectors written by Matlab" +typedef ^ FAST_VTK_ModeShapeType CHARACTER(1024) DataFileName - - - "name of the file with eigenvectors written by Matlab" typedef ^ FAST_VTK_ModeShapeType IntKi VTKLinModes - - - "Number of modes to visualize" - typedef ^ FAST_VTK_ModeShapeType IntKi VTKModes {:} - - "Which modes to visualize" - typedef ^ FAST_VTK_ModeShapeType IntKi VTKLinTim - - - "Switch to make one animation for all LinTimes together (1) or separate animations for each LinTimes(2)" - @@ -102,41 +109,43 @@ typedef ^ FAST_VTK_ModeShapeType R8Ki DampedFreq_Hz {:} - - typedef ^ FAST_VTK_ModeShapeType R8Ki x_eig_magnitude {:}{:}{:} - - "magnitude of eigenvector (dimension 1=state, dim 2= azimuth, dim 3 = mode)" - typedef ^ FAST_VTK_ModeShapeType R8Ki x_eig_phase {:}{:}{:} - - "phase of eigenvector (dimension 1=state, dim 2= azimuth, dim 3 = mode)" - - -typedef ^ FAST_SS_CaseType ReKi RotSpeed - - - "Rotor speed for this case of the steady-state solve [>0]" "(rad/s)" -typedef ^ FAST_SS_CaseType ReKi TSR - - - "TSR for this case of the steady-state solve [>0]" "(-)" -typedef ^ FAST_SS_CaseType ReKi WindSpeed - - - "Windspeed for this case of the steady-state solve [>0]" "(m/s)" -typedef ^ FAST_SS_CaseType ReKi Pitch - - - "Pitch angle for this case of the steady-state solve" "(rad)" - # ..... FAST_ParameterType data ....................................................................................................... # Misc data for coupling: typedef FAST FAST_ParameterType DbKi DT - - - "Integration time step [global time]" s -typedef ^ FAST_ParameterType DbKi DT_module {NumModules} - - "Integration time step [global time]" s -typedef ^ FAST_ParameterType IntKi n_substeps {NumModules} - - "The number of module substeps for advancing states from t_global to t_global_next" - typedef ^ FAST_ParameterType INTEGER n_TMax_m1 - - - "The time step of TMax - dt (the end time of the simulation)" (-) typedef ^ FAST_ParameterType DbKi TMax - - - "Total run time" s typedef ^ FAST_ParameterType IntKi InterpOrder - - - "Interpolation order {0,1,2}" - typedef ^ FAST_ParameterType IntKi NumCrctn - - - "Number of correction iterations" - typedef ^ FAST_ParameterType IntKi KMax - - - "Maximum number of input-output-solve or nonlinear solve residual equation iterations (KMax >= 1) [>0]" - typedef ^ FAST_ParameterType IntKi numIceLegs - - - "number of suport-structure legs in contact with ice (IceDyn coupling)" - -typedef ^ FAST_ParameterType IntKi nBeams - - - "number of BeamDyn instances" - +typedef ^ FAST_ParameterType IntKi RotNumBld : - - "number of blades in each rotor" - +typedef ^ FAST_ParameterType logical MirrorRotor : - - "Array of flags indicating if rotor rotation should be mirrored (true=mirror)" - +typedef ^ FAST_ParameterType IntKi NumBD - - - "number of BeamDyn instances" - +typedef ^ FAST_ParameterType IntKi BDRotMap : - - "array mapping BeamDyn instance to rotor number" - +typedef ^ FAST_ParameterType IntKi BDBldMap : - - "array mapping BeamDyn instance to blade number" - typedef ^ FAST_ParameterType LOGICAL BD_OutputSibling - - - "flag to determine if BD input is sibling of output mesh" - -typedef ^ FAST_ParameterType LOGICAL ModuleInitialized {NumModules} - - "An array determining if the module has been initialized" - +# Data for TC Solver: +typedef ^ FAST_ParameterType IntKi ModCoupling - - - "Module coupling type {1=loose; 2=tight with fixed Jacobian updates (DT_UJac); 3=tight with automatic Jacobian updates}" - +typedef ^ FAST_ParameterType DbKi RhoInf - - - "Numerical damping parameter for tight coupling generalized-alpha integrator (-) [0.0 to 1.0]" - +typedef ^ FAST_ParameterType DbKi ConvTol - - - "Convergence iteration error tolerance for tight coupling generalized alpha integrator (-)" - +typedef ^ FAST_ParameterType IntKi MaxConvIter - - - "Maximum number of convergence iterations for tight coupling generalized alpha integrator (-)" - # Data for Jacobians: typedef ^ FAST_ParameterType DbKi DT_Ujac - - - "Time between when we need to re-calculate these Jacobians" s typedef ^ FAST_ParameterType Reki UJacSclFact - - - "Scaling factor used to get similar magnitudes between accelerations, forces, and moments in Jacobians" - typedef ^ FAST_ParameterType IntKi SizeJac_Opt1 {9} - - "(1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion;" - typedef ^ FAST_ParameterType IntKi SolveOption - - - "Switch to determine which solve option we are going to use (see Solve_FullOpt1, etc)" - # Feature switches and flags: +typedef ^ FAST_ParameterType IntKi NRotors - - - "Number of rotors in turbine" - typedef ^ FAST_ParameterType IntKi CompElast - - - "Compute blade loads (switch) {Module_ED; Module_BD; Module_SED}" - typedef ^ FAST_ParameterType IntKi CompInflow - - - "Compute inflow wind conditions (switch) {Module_None; Module_IfW; Module_ExtInfw}" - typedef ^ FAST_ParameterType IntKi CompAero - - - "Compute aerodynamic loads (switch) {Module_None; Module_ADsk; Module_AD}" - typedef ^ FAST_ParameterType IntKi CompServo - - - "Compute control and electrical-drive dynamics (switch) {Module_None; Module_SrvD}" - typedef ^ FAST_ParameterType IntKi CompSeaSt - - - "Compute sea states; wave kinematics (switch) {Module_None; Module_SeaSt}" - typedef ^ FAST_ParameterType IntKi CompHydro - - - "Compute hydrodynamic loads (switch) {Module_None; Module_HD}" - -typedef ^ FAST_ParameterType IntKi CompSub - - - "Compute sub-structural dynamics (switch) {Module_None; Module_SD, Module_ExtPtfm}" - +typedef ^ FAST_ParameterType IntKi CompSub - - - "Compute sub-structural dynamics (switch) {Module_None; Module_SD, Module_ExtPtfm, Module_SlD}" - typedef ^ FAST_ParameterType IntKi CompMooring - - - "Compute mooring system (switch) {Module_None; Module_MAP; Module_FEAM; Module_MD; Module_Orca}" - typedef ^ FAST_ParameterType IntKi CompIce - - - "Compute ice loading (switch) {Module_None; Module_IceF, Module_IceD}" - +typedef ^ FAST_ParameterType IntKi CompSoil - - - "Compute soil-structural dynamics (switch) {Module_None; Module_SlD}" - typedef ^ FAST_ParameterType IntKi MHK - - - "MHK turbine type (switch) {0=Not an MHK turbine; 1=Fixed MHK turbine; 2=Floating MHK turbine}" - typedef ^ FAST_ParameterType LOGICAL UseDWM - - - "Use the DWM module in AeroDyn" - typedef ^ FAST_ParameterType LOGICAL Linearize - - - "Linearization analysis (flag)" - @@ -154,16 +163,17 @@ typedef ^ FAST_ParameterType ReKi Pvap - - - "Vapour pressure typedef ^ FAST_ParameterType ReKi WtrDpth - - - "Water depth" m typedef ^ FAST_ParameterType ReKi MSL2SWL - - - "Offset between still-water level and mean sea level" m # Input file names: -typedef ^ FAST_ParameterType CHARACTER(1024) EDFile - - - "The name of the ElastoDyn/Simplified-ElastoDyn input file" - -typedef ^ FAST_ParameterType CHARACTER(1024) BDBldFile {MaxNBlades} - - "Name of files containing BeamDyn inputs for each blade" - -typedef ^ FAST_ParameterType CHARACTER(1024) InflowFile - - - "Name of file containing inflow wind input parameters" - -typedef ^ FAST_ParameterType CHARACTER(1024) AeroFile - - - "Name of file containing aerodynamic input parameters" - -typedef ^ FAST_ParameterType CHARACTER(1024) ServoFile - - - "Name of file containing control and electrical-drive input parameters" - -typedef ^ FAST_ParameterType CHARACTER(1024) SeaStFile - - - "Name of file containing sea state input parameters" - -typedef ^ FAST_ParameterType CHARACTER(1024) HydroFile - - - "Name of file containing hydrodynamic input parameters" - -typedef ^ FAST_ParameterType CHARACTER(1024) SubFile - - - "Name of file containing sub-structural input parameters" - -typedef ^ FAST_ParameterType CHARACTER(1024) MooringFile - - - "Name of file containing mooring system input parameters" - -typedef ^ FAST_ParameterType CHARACTER(1024) IceFile - - - "Name of file containing ice loading input parameters" - +typedef ^ FAST_ParameterType CHARACTER(1024) EDFile : - - "ElastoDyn/Simplified-ElastoDyn input file paths (NRotors)" - +typedef ^ FAST_ParameterType CHARACTER(1024) BDBldFile :: - - "BeamDyn input file paths for each blade (MaxBladesBD,NRotors)" - +typedef ^ FAST_ParameterType CHARACTER(1024) ServoFile : - - "Turbine control and electrical-drive input file paths (NRotors)" - +typedef ^ FAST_ParameterType CHARACTER(1024) InflowFile - - - "Inflow wind input file path" - +typedef ^ FAST_ParameterType CHARACTER(1024) AeroFile - - - "Aerodynamic input file path" - +typedef ^ FAST_ParameterType CHARACTER(1024) SeaStFile - - - "Sea state input file path" - +typedef ^ FAST_ParameterType CHARACTER(1024) HydroFile - - - "Hydrodynamic input file path" - +typedef ^ FAST_ParameterType CHARACTER(1024) SubFile - - - "sub-structural input file path" - +typedef ^ FAST_ParameterType CHARACTER(1024) MooringFile - - - "mooring system input file path" - +typedef ^ FAST_ParameterType CHARACTER(1024) IceFile - - - "ice loading input file path" - +typedef ^ FAST_ParameterType CHARACTER(1024) SoilFile - - - "Name of file containing soil-structure input parameters" - # Parameters for file/screen output #typedef ^ FAST_ParameterType DbKi SttsTime - - - "Amount of time between screen status messages" s typedef ^ FAST_ParameterType DbKi TStart - - - "Time to begin tabular output" s @@ -208,7 +218,6 @@ typedef ^ FAST_ParameterType IntKi LinInputs - - - "Inputs included in lineariza typedef ^ FAST_ParameterType IntKi LinOutputs - - - "Outputs included in linearization (switch) {0=none; 1=from OutList(s); 2=all module outputs (debug)} [unused if Linearize=False]" - typedef ^ FAST_ParameterType LOGICAL LinOutJac - - - "Include full Jacabians in linearization output (for debug) (flag) [unused if Linearize=False; used only if LinInputs=LinOutputs=2]" - typedef ^ FAST_ParameterType LOGICAL LinOutMod - - - "Write module-level linearization output files in addition to output for full system? (flag) [unused if Linearize=False]" - -typedef ^ FAST_ParameterType FAST_VTK_ModeShapeType VTK_modes - - - "Data for VTK mode-shape visualization" - typedef ^ FAST_ParameterType IntKi Lin_NumMods - - - "number of modules in the linearization" typedef ^ FAST_ParameterType IntKi Lin_ModOrder {NumModules} - - "indices that determine which order the modules are in the glue-code linearization matrix" @@ -228,141 +237,11 @@ typedef ^ FAST_ParameterType ReKi WS_TSR {:} - - "List of WindSpeed or TSRs (dep typedef ^ FAST_ParameterType ReKi Pitch {:} - - "List of pitch angles for aeromap generation" "(rad)" typedef ^ FAST_ParameterType IntKi GearBox_index - - - "Index to gearbox rotation in state array (for steady-state calculations)" - - -# SAVED OPERATING POINT DATA FOR VTKLIN (visualization of mode shapes from linearization analysis) -# ..... IceDyn OP data ....................................................................................................... -typedef FAST FAST_LinStateSave IceD_ContinuousStateType x_IceD {:}{:} - - "Continuous states" -typedef ^ ^ IceD_DiscreteStateType xd_IceD {:}{:} - - "Discrete states" -typedef ^ ^ IceD_ConstraintStateType z_IceD {:}{:} - - "Constraint states" -typedef ^ ^ IceD_OtherStateType OtherSt_IceD {:}{:} - - "Other states" -typedef ^ ^ IceD_InputType u_IceD {:}{:} - - "System inputs" -# ..... BeamDyn OP data ....................................................................................................... -typedef FAST FAST_LinStateSave BD_ContinuousStateType x_BD {:}{:} - - "Continuous states" -typedef ^ ^ BD_DiscreteStateType xd_BD {:}{:} - - "Discrete states" -typedef ^ ^ BD_ConstraintStateType z_BD {:}{:} - - "Constraint states" -typedef ^ ^ BD_OtherStateType OtherSt_BD {:}{:} - - "Other states" -typedef ^ ^ BD_InputType u_BD {:}{:} - - "System inputs" -# ..... ElastoDyn OP data ..................................................................................................... -typedef FAST FAST_LinStateSave ED_ContinuousStateType x_ED {:} - - "Continuous states" -typedef ^ ^ ED_DiscreteStateType xd_ED {:} - - "Discrete states" -typedef ^ ^ ED_ConstraintStateType z_ED {:} - - "Constraint states" -typedef ^ ^ ED_OtherStateType OtherSt_ED {:} - - "Other states" -typedef ^ ^ ED_InputType u_ED {:} - - "System inputs" -# ..... No Simplified-ElastoDyn data ........................................................................................... -# ..... ServoDyn OP data ....................................................................................................... -typedef FAST FAST_LinStateSave SrvD_ContinuousStateType x_SrvD {:} - - "Continuous states" -typedef ^ ^ SrvD_DiscreteStateType xd_SrvD {:} - - "Discrete states" -typedef ^ ^ SrvD_ConstraintStateType z_SrvD {:} - - "Constraint states" -typedef ^ ^ SrvD_OtherStateType OtherSt_SrvD {:} - - "Other states" -typedef ^ ^ SrvD_InputType u_SrvD {:} - - "System inputs" -# ..... AeroDyn OP data ....................................................................................................... -typedef FAST FAST_LinStateSave AD_ContinuousStateType x_AD {:} - - "Continuous states" -typedef ^ ^ AD_DiscreteStateType xd_AD {:} - - "Discrete states" -typedef ^ ^ AD_ConstraintStateType z_AD {:} - - "Constraint states" -typedef ^ ^ AD_OtherStateType OtherSt_AD {:} - - "Other states" -typedef ^ ^ AD_InputType u_AD {:} - - "System inputs" -# ..... No AeroDisk data ...................................................................................................... -# ..... InflowWind OP data .................................................................................................... -typedef FAST FAST_LinStateSave InflowWind_ContinuousStateType x_IfW {:} - - "Continuous states" -typedef ^ ^ InflowWind_DiscreteStateType xd_IfW {:} - - "Discrete states" -typedef ^ ^ InflowWind_ConstraintStateType z_IfW {:} - - "Constraint states" -typedef ^ ^ InflowWind_OtherStateType OtherSt_IfW {:} - - "Other states" -typedef ^ ^ InflowWind_InputType u_IfW {:} - - "System inputs" -# ..... No ExternalInflow integration data ....................................................................................................... -# ..... SubDyn OP data ....................................................................................................... -typedef FAST FAST_LinStateSave SD_ContinuousStateType x_SD {:} - - "Continuous states" -typedef ^ ^ SD_DiscreteStateType xd_SD {:} - - "Discrete states" -typedef ^ ^ SD_ConstraintStateType z_SD {:} - - "Constraint states" -typedef ^ ^ SD_OtherStateType OtherSt_SD {:} - - "Other states" -typedef ^ ^ SD_InputType u_SD {:} - - "System inputs" -# ..... ExtPtfm OP data ....................................................................................................... -typedef FAST FAST_LinStateSave ExtPtfm_ContinuousStateType x_ExtPtfm {:} - - "Continuous states" -typedef ^ ^ ExtPtfm_DiscreteStateType xd_ExtPtfm {:} - - "Discrete states" -typedef ^ ^ ExtPtfm_ConstraintStateType z_ExtPtfm {:} - - "Constraint states" -typedef ^ ^ ExtPtfm_OtherStateType OtherSt_ExtPtfm {:} - - "Other states" -typedef ^ ^ ExtPtfm_InputType u_ExtPtfm {:} - - "System inputs" -# ..... HydroDyn OP data ....................................................................................................... -typedef FAST FAST_LinStateSave HydroDyn_ContinuousStateType x_HD {:} - - "Continuous states" -typedef ^ ^ HydroDyn_DiscreteStateType xd_HD {:} - - "Discrete states" -typedef ^ ^ HydroDyn_ConstraintStateType z_HD {:} - - "Constraint states" -typedef ^ ^ HydroDyn_OtherStateType OtherSt_HD {:} - - "Other states" -typedef ^ ^ HydroDyn_InputType u_HD {:} - - "System inputs" -# ..... SeaSt OP data ....................................................................................................... -typedef FAST FAST_LinStateSave SeaSt_ContinuousStateType x_SeaSt {:} - - "Continuous states" -typedef ^ ^ SeaSt_DiscreteStateType xd_SeaSt {:} - - "Discrete states" -typedef ^ ^ SeaSt_ConstraintStateType z_SeaSt {:} - - "Constraint states" -typedef ^ ^ SeaSt_OtherStateType OtherSt_SeaSt {:} - - "Other states" -typedef ^ ^ SeaSt_InputType u_SeaSt {:} - - "System inputs" -# ..... IceFloe OP data ....................................................................................................... -typedef FAST FAST_LinStateSave IceFloe_ContinuousStateType x_IceF {:} - - "Continuous states" -typedef ^ ^ IceFloe_DiscreteStateType xd_IceF {:} - - "Discrete states" -typedef ^ ^ IceFloe_ConstraintStateType z_IceF {:} - - "Constraint states" -typedef ^ ^ IceFloe_OtherStateType OtherSt_IceF {:} - - "Other states" -typedef ^ ^ IceFloe_InputType u_IceF {:} - - "System inputs" -# ..... MAP OP data ....................................................................................................... -typedef FAST FAST_LinStateSave MAP_ContinuousStateType x_MAP {:} - - "Continuous states" -typedef ^ ^ MAP_DiscreteStateType xd_MAP {:} - - "Discrete states" -typedef ^ ^ MAP_ConstraintStateType z_MAP {:} - - "Constraint states" -#typedef ^ ^ MAP_OtherStateType OtherSt_MAP {:} - - "Other states" -typedef ^ ^ MAP_InputType u_MAP {:} - - "System inputs" -# ..... FEAMooring OP data ....................................................................................................... -typedef FAST FAST_LinStateSave FEAM_ContinuousStateType x_FEAM {:} - - "Continuous states" -typedef ^ ^ FEAM_DiscreteStateType xd_FEAM {:} - - "Discrete states" -typedef ^ ^ FEAM_ConstraintStateType z_FEAM {:} - - "Constraint states" -typedef ^ ^ FEAM_OtherStateType OtherSt_FEAM {:} - - "Other states" -typedef ^ ^ FEAM_InputType u_FEAM {:} - - "System inputs" -# ..... MoorDyn OP data ....................................................................................................... -typedef FAST FAST_LinStateSave MD_ContinuousStateType x_MD {:} - - "Continuous states" -typedef ^ ^ MD_DiscreteStateType xd_MD {:} - - "Discrete states" -typedef ^ ^ MD_ConstraintStateType z_MD {:} - - "Constraint states" -typedef ^ ^ MD_OtherStateType OtherSt_MD {:} - - "Other states" -typedef ^ ^ MD_InputType u_MD {:} - - "System inputs" -# ..... NO OrcaFlex OP data ....................................................................................................... - -# ..... FAST_LinType data ....................................................................................................... -typedef FAST FAST_LinType CHARACTER(LinChanLen) Names_u {:} - - "Names of the linearized inputs" -typedef ^ FAST_LinType CHARACTER(LinChanLen) Names_y {:} - - "Names of the linearized outputs" -typedef ^ FAST_LinType CHARACTER(LinChanLen) Names_x {:} - - "Names of the linearized continuous states" -typedef ^ FAST_LinType CHARACTER(LinChanLen) Names_xd {:} - - "Names of the linearized discrete states" -typedef ^ FAST_LinType CHARACTER(LinChanLen) Names_z {:} - - "Names of the linearized constraint states" -typedef ^ FAST_LinType ReKi op_u {:} - - "input operating point" -typedef ^ FAST_LinType ReKi op_y {:} - - "output operating point" -typedef ^ FAST_LinType ReKi op_x {:} - - "continuous state operating point" -typedef ^ FAST_LinType ReKi op_dx {:} - - "1st time derivative of continuous state operating point" -typedef ^ FAST_LinType ReKi op_xd {:} - - "discrete state operating point" -typedef ^ FAST_LinType ReKi op_z {:} - - "constraint state operating point" -typedef ^ FAST_LinType R8Ki op_x_eig_mag {:} - - "continuous state eigenvector magnitude" -typedef ^ FAST_LinType R8Ki op_x_eig_phase {:} - - "continuous state eigenvector phase" -typedef ^ FAST_LinType Logical Use_u {:} - - "array same size as names_u, which indicates if this input is used in linearization output file" -typedef ^ FAST_LinType Logical Use_y {:} - - "array same size as names_y, which indicates if this output is used in linearization output file" -typedef ^ FAST_LinType R8Ki A {:}{:} - - "A matrix" -typedef ^ FAST_LinType R8Ki B {:}{:} - - "B matrix" -typedef ^ FAST_LinType R8Ki C {:}{:} - - "C matrix" -typedef ^ FAST_LinType R8Ki D {:}{:} - - "D matrix" -typedef ^ FAST_LinType R8Ki StateRotation {:}{:} - - "Matrix that rotates the continuous states" -typedef ^ FAST_LinType R8Ki StateRel_x {:}{:} - - "Matrix that defines the continuous states relative to root motion" -typedef ^ FAST_LinType R8Ki StateRel_xdot {:}{:} - - "Matrix that defines the continuous states relative to root motion" -typedef ^ FAST_LinType Logical IsLoad_u {:} - - "Whether the input is a load (used for scaling for potentially ill-conditioned G matrix)" -typedef ^ FAST_LinType Logical RotFrame_u {:} - - "Whether corresponding input is in rotating frame" -typedef ^ FAST_LinType Logical RotFrame_y {:} - - "Whether corresponding output is in rotating frame" -typedef ^ FAST_LinType Logical RotFrame_x {:} - - "Whether corresponding continuous state is in rotating frame" -typedef ^ FAST_LinType Logical RotFrame_z {:} - - "Whether corresponding constraint state is in rotating frame" -typedef ^ FAST_LinType IntKi DerivOrder_x {:} - - "Derivative order for continuous states" -typedef ^ FAST_LinType IntKi SizeLin {3} - - "sizes of (1) the module's inputs, (2) the module's linearized outputs, and (3) the module's continuous states" - -typedef ^ FAST_LinType IntKi LinStartIndx {3} - - "the starting index in combined matrices of (1) the module's inputs, (2) the module's linearized outputs, and (3) the module's continuous states" - -typedef ^ FAST_LinType IntKi NumOutputs - - - "number of WriteOutputs in each linearized module" - - -# ..... FAST_ModLinType data (for output) ........................................................................................... -typedef ^ FAST_ModLinType FAST_LinType Instance {:} - - "Linearization data for each module instance (e.g., 3 blades for BD)" - # ..... FAST_LinFileType data ....................................................................................................... -typedef FAST FAST_LinFileType FAST_ModLinType Modules {NumModules} - - "Linearization data for each module" -typedef ^ FAST_LinFileType FAST_LinType Glue - - - "Linearization data for the glue code (coupled system)" typedef ^ FAST_LinFileType ReKi RotSpeed - - - "Rotor azimuth angular speed" rad/s typedef ^ FAST_LinFileType ReKi Azimuth - - - "Rotor azimuth position" rad typedef ^ FAST_LinFileType ReKi WindSpeed - - - "Wind speed at reference height" m/s - # ..... FAST_MiscLinType data ....................................................................................................... typedef ^ FAST_MiscLinType DbKi LinTimes {:} - - "List of times at which to linearize" s typedef ^ FAST_MiscLinType IntKi CopyOP_CtrlCode - - - "mesh control code for copy type (new on first call; update otherwise)" - @@ -399,10 +278,9 @@ typedef ^ FAST_OutputFileType IntKi VTK_count - - - "Number of VTK files written typedef ^ FAST_OutputFileType IntKi VTK_LastWaveIndx - - - "last index into wave array" - typedef ^ FAST_OutputFileType FAST_LinFileType Lin - - - "linearization data for output" typedef ^ FAST_OutputFileType IntKi ActualChanLen - - - "width of the column headers output in the text and/or binary file" - -typedef ^ FAST_OutputFileType FAST_LinStateSave op - - - "operating points of states and inputs for VTK output of mode shapes" typedef ^ FAST_OutputFileType ReKi DriverWriteOutput {6} - - "pitch and tsr for current aero map case, plus error, number of iterations, wind speed, rotor speed" #typedef ^ FAST_OutputFileType CHARACTER(ChanLen) DriverWriteOutputHdr {:} - - "headers of data output from the driver" -#typedef ^ FAST_OutputFileType CHARACTER(ChanLen) DriverWriteOutputUnit {:} - - "units of data output from the driver" +#typedef ^ FAST_OutputFileType CHARACTER(ChanLen) DriverWriteOutputUnt {:} - - "units of data output from the driver" # ..... IceDyn data ....................................................................................................... @@ -413,13 +291,10 @@ typedef ^ ^ IceD_DiscreteStateType xd {:}{:} - - "Discrete states" typedef ^ ^ IceD_ConstraintStateType z {:}{:} - - "Constraint states" typedef ^ ^ IceD_OtherStateType OtherSt {:}{:} - - "Other states" typedef ^ ^ IceD_ParameterType p {:} - - "Parameters" -typedef ^ ^ IceD_InputType u {:} - - "System inputs" typedef ^ ^ IceD_OutputType y {:} - - "System outputs" typedef ^ ^ IceD_MiscVarType m {:} - - "Misc/optimization variables" typedef ^ ^ IceD_InputType Input {:}{:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ IceD_InputType Input_Saved {:}{:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:}{:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:}{:} - - "Backup Array of times associated with Input Array" # ..... BeamDyn data ....................................................................................................... # [ the last dimension of each allocatable array is for the instance of BeamDyn being used ] @@ -429,81 +304,56 @@ typedef ^ ^ BD_DiscreteStateType xd {:}{:} - - "Discrete states" typedef ^ ^ BD_ConstraintStateType z {:}{:} - - "Constraint states" typedef ^ ^ BD_OtherStateType OtherSt {:}{:} - - "Other states" typedef ^ ^ BD_ParameterType p {:} - - "Parameters" -typedef ^ ^ BD_InputType u {:} - - "System inputs" typedef ^ ^ BD_OutputType y {:} - - "System outputs" typedef ^ ^ BD_MiscVarType m {:} - - "Misc/optimization variables" -typedef ^ ^ BD_OutputType Output {:}{:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ BD_OutputType y_interp {:} - - "interpolated system outputs for CalcSteady" typedef ^ ^ BD_InputType Input {:}{:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ BD_InputType Input_Saved {:}{:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:}{:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:}{:} - - "Backup Array of times associated with Input Array" # ..... ElastoDyn data ....................................................................................................... -typedef FAST ElastoDyn_Data ED_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ ED_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ ED_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ ED_OtherStateType OtherSt {NumStateTimes} - - "Other states" -typedef ^ ^ ED_ParameterType p - - - "Parameters" -typedef ^ ^ ED_InputType u - - - "System inputs" -typedef ^ ^ ED_OutputType y - - - "System outputs" -typedef ^ ^ ED_MiscVarType m - - - "Misc (optimization) variables not associated with time" -typedef ^ ^ ED_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ ED_OutputType Output_bak {:} - - "Backup Array of outputs associated with InputTimes" -typedef ^ ^ ED_OutputType y_interp - - - "interpolated system outputs for CalcSteady" -typedef ^ ^ ED_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ ED_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" -typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" +typedef FAST ElastoDyn_Data ED_ContinuousStateType x {:}{:} - - "Continuous states" +typedef ^ ^ ED_DiscreteStateType xd {:}{:} - - "Discrete states" +typedef ^ ^ ED_ConstraintStateType z {:}{:} - - "Constraint states" +typedef ^ ^ ED_OtherStateType OtherSt {:}{:} - - "Other states" +typedef ^ ^ ED_ParameterType p {:} - - "Parameters" +typedef ^ ^ ED_OutputType y {:} - - "System outputs" +typedef ^ ^ ED_MiscVarType m {:} - - "Misc (optimization) variables not associated with time" +typedef ^ ^ ED_InputType Input {:}{:} - - "Array of inputs associated with InputTimes" +typedef ^ ^ DbKi InputTimes {:}{:} - - "Array of times associated with Input Array" # ..... Simplified-ElastoDyn data ............................................................................................ -typedef FAST SED_Data SED_ContinuousStateType x {2} - - "Continuous states" -typedef ^ ^ SED_DiscreteStateType xd {2} - - "Discrete states" -typedef ^ ^ SED_ConstraintStateType z {2} - - "Constraint states" -typedef ^ ^ SED_OtherStateType OtherSt {2} - - "Other states" +typedef FAST SED_Data SED_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ SED_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ SED_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ SED_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ SED_ParameterType p - - - "Parameters" -typedef ^ ^ SED_InputType u - - - "System inputs" typedef ^ ^ SED_OutputType y - - - "System outputs" typedef ^ ^ SED_MiscVarType m - - - "Misc (optimization) variables not associated with time" -typedef ^ ^ SED_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ SED_OutputType y_interp - - - "interpolated system outputs for CalcSteady" typedef ^ ^ SED_InputType Input {:} - - "Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" # ..... ServoDyn data ....................................................................................................... -typedef FAST ServoDyn_Data SrvD_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ SrvD_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ SrvD_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ SrvD_OtherStateType OtherSt {NumStateTimes} - - "Other states" -typedef ^ ^ SrvD_ParameterType p - - - "Parameters" -typedef ^ ^ SrvD_InputType u - - - "System inputs" -typedef ^ ^ SrvD_OutputType y - - - "System outputs" -typedef ^ ^ SrvD_MiscVarType m - - - "Misc (optimization) variables not associated with time" -typedef ^ ^ SrvD_MiscVarType m_bak - - - "Backup Misc (optimization) variables not associated with time" -typedef ^ ^ SrvD_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ SrvD_OutputType y_interp - - - "interpolated system outputs for CalcSteady" -typedef ^ ^ SrvD_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ SrvD_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" -typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" +typedef FAST ServoDyn_Data SrvD_ContinuousStateType x {:}{:} - - "Continuous states" +typedef ^ ^ SrvD_DiscreteStateType xd {:}{:} - - "Discrete states" +typedef ^ ^ SrvD_ConstraintStateType z {:}{:} - - "Constraint states" +typedef ^ ^ SrvD_OtherStateType OtherSt {:}{:} - - "Other states" +typedef ^ ^ SrvD_ParameterType p {:} - - "Parameters" +typedef ^ ^ SrvD_OutputType y {:} - - "System outputs" +typedef ^ ^ SrvD_MiscVarType m {:} - - "Misc (optimization) variables not associated with time" +typedef ^ ^ SrvD_InputType Input {:}{:} - - "Array of inputs associated with InputTimes" +typedef ^ ^ DbKi InputTimes {:}{:} - - "Array of times associated with Input Array" # ..... AeroDyn data ....................................................................................................... -typedef FAST AeroDyn_Data AD_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ AD_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ AD_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ AD_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST AeroDyn_Data AD_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ AD_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ AD_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ AD_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ AD_ParameterType p - - - "Parameters" -typedef ^ ^ AD_InputType u - - - "System inputs" typedef ^ ^ AD_OutputType y - - - "System outputs" typedef ^ ^ AD_MiscVarType m - - - "Misc/optimization variables" -typedef ^ ^ AD_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ AD_OutputType y_interp - - - "interpolated system outputs for CalcSteady" typedef ^ ^ AD_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ AD_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" # ..... ExtLoads data ....................................................................................................... typedef FAST ExtLoads_Data ExtLd_ContinuousStateType x {NumStateTimes} - - "Continuous states" @@ -517,34 +367,26 @@ typedef ^ ^ ExtLd_MiscVarType m - - - "Misc/optimization variables" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" # ..... AeroDisk data ....................................................................................................... -typedef FAST AeroDisk_Data ADsk_ContinuousStateType x {2} - - "Continuous states" -typedef ^ ^ ADsk_DiscreteStateType xd {2} - - "Discrete states" -typedef ^ ^ ADsk_ConstraintStateType z {2} - - "Constraint states" -typedef ^ ^ ADsk_OtherStateType OtherSt {2} - - "Other states" +typedef FAST AeroDisk_Data ADsk_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ ADsk_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ ADsk_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ ADsk_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ ADsk_ParameterType p - - - "Parameters" -typedef ^ ^ ADsk_InputType u - - - "System inputs" typedef ^ ^ ADsk_OutputType y - - - "System outputs" typedef ^ ^ ADsk_MiscVarType m - - - "Misc/optimization variables" -typedef ^ ^ ADsk_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ ADsk_OutputType y_interp - - - "interpolated system outputs for CalcSteady" typedef ^ ^ ADsk_InputType Input {:} - - "Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" # ..... InflowWind data ....................................................................................................... -typedef FAST InflowWind_Data InflowWind_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ InflowWind_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ InflowWind_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ InflowWind_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST InflowWind_Data InflowWind_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ InflowWind_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ InflowWind_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ InflowWind_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ InflowWind_ParameterType p - - - "Parameters" -typedef ^ ^ InflowWind_InputType u - - - "System inputs" typedef ^ ^ InflowWind_OutputType y - - - "System outputs" typedef ^ ^ InflowWind_MiscVarType m - - - "Misc/optimization variables" -typedef ^ ^ InflowWind_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ InflowWind_OutputType y_interp - - - "interpolated system outputs for CalcSteady" typedef ^ ^ InflowWind_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ InflowWind_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" # ..... ExternalInflow integration data ....................................................................................................... typedef FAST ExternalInflow_Data ExtInfw_InputType u - - - "System inputs" @@ -553,245 +395,119 @@ typedef ^ ^ ExtInfw_ParameterType p - - - "Parameters" typedef ^ ^ ExtInfw_MiscVarType m - - - "Parameters" # ..... SubDyn data ....................................................................................................... -typedef FAST SubDyn_Data SD_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ SD_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ SD_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ SD_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST SubDyn_Data SD_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ SD_ContinuousStateType dxdt - - - "Continuous state derivatives" +typedef ^ ^ SD_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ SD_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ SD_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ SD_ParameterType p - - - "Parameters" -typedef ^ ^ SD_InputType u - - - "System inputs" typedef ^ ^ SD_OutputType y - - - "System outputs" typedef ^ ^ SD_MiscVarType m - - - "Misc/optimization variables" typedef ^ ^ SD_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ SD_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" -typedef ^ ^ SD_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ SD_OutputType y_interp - - - "interpolated system outputs for CalcSteady" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" + +# ..... SoilDyn data ....................................................................................................... +typedef FAST SoilDyn_Data SlD_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ SlD_ContinuousStateType dxdt - - - "Continuous state derivatives" +typedef ^ ^ SlD_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ SlD_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ SlD_OtherStateType OtherSt {:} - - "Other states" +typedef ^ ^ SlD_ParameterType p - - - "Parameters" +typedef ^ ^ SlD_InputType u - - - "System inputs" +typedef ^ ^ SlD_OutputType y - - - "System outputs" +typedef ^ ^ SlD_MiscVarType m - - - "Misc/optimization variables" +typedef ^ ^ SlD_InputType Input {:} - - "Array of inputs associated with InputTimes" +typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" # ..... ExtPtfm data ....................................................................................................... -typedef FAST ExtPtfm_Data ExtPtfm_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ ExtPtfm_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ ExtPtfm_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ ExtPtfm_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST ExtPtfm_Data ExtPtfm_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ ExtPtfm_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ ExtPtfm_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ ExtPtfm_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ ExtPtfm_ParameterType p - - - "Parameters" -typedef ^ ^ ExtPtfm_InputType u - - - "System inputs" typedef ^ ^ ExtPtfm_OutputType y - - - "System outputs" typedef ^ ^ ExtPtfm_MiscVarType m - - - "Misc/optimization variables" typedef ^ ^ ExtPtfm_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ ExtPtfm_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" # ..... SeaState data ....................................................................................................... -typedef FAST SeaState_Data SeaSt_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ SeaSt_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ SeaSt_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ SeaSt_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST SeaState_Data SeaSt_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ SeaSt_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ SeaSt_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ SeaSt_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ SeaSt_ParameterType p - - - "Parameters" -typedef ^ ^ SeaSt_InputType u - - - "System inputs" typedef ^ ^ SeaSt_OutputType y - - - "System outputs" typedef ^ ^ SeaSt_MiscVarType m - - - "Misc/optimization variables" typedef ^ ^ SeaSt_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ SeaSt_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" -typedef ^ ^ SeaSt_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ SeaSt_OutputType y_interp - - - "interpolated system outputs for CalcSteady" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" # ..... HydroDyn data ....................................................................................................... -typedef FAST HydroDyn_Data HydroDyn_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ HydroDyn_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ HydroDyn_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ HydroDyn_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST HydroDyn_Data HydroDyn_ContinuousStateType x {:} - - "Continuous states" +typedef FAST HydroDyn_Data HydroDyn_ContinuousStateType dxdt - - - "Continuous state derivatives" +typedef ^ ^ HydroDyn_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ HydroDyn_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ HydroDyn_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ HydroDyn_ParameterType p - - - "Parameters" -typedef ^ ^ HydroDyn_InputType u - - - "System inputs" typedef ^ ^ HydroDyn_OutputType y - - - "System outputs" typedef ^ ^ HydroDyn_MiscVarType m - - - "Misc/optimization variables" -typedef ^ ^ HydroDyn_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ HydroDyn_OutputType y_interp - - - "interpolated system outputs for CalcSteady" typedef ^ ^ HydroDyn_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ HydroDyn_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" # ..... IceFloe data ....................................................................................................... -typedef FAST IceFloe_Data IceFloe_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ IceFloe_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ IceFloe_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ IceFloe_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST IceFloe_Data IceFloe_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ IceFloe_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ IceFloe_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ IceFloe_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ IceFloe_ParameterType p - - - "Parameters" -typedef ^ ^ IceFloe_InputType u - - - "System inputs" typedef ^ ^ IceFloe_OutputType y - - - "System outputs" typedef ^ ^ IceFloe_MiscVarType m - - - "Misc/optimization variables" typedef ^ ^ IceFloe_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ IceFloe_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" # ..... MAP data ....................................................................................................... -typedef FAST MAP_Data MAP_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ MAP_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ MAP_ConstraintStateType z {NumStateTimes} - - "Constraint states" +typedef FAST MAP_Data MAP_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ MAP_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ MAP_ConstraintStateType z {:} - - "Constraint states" typedef ^ ^ MAP_OtherStateType OtherSt - - - "Other/optimization states" typedef ^ ^ MAP_ParameterType p - - - "Parameters" -typedef ^ ^ MAP_InputType u - - - "System inputs" typedef ^ ^ MAP_OutputType y - - - "System outputs" +typedef ^ ^ MAP_MiscVarType m - - - "Misc/optimization variables" typedef ^ ^ MAP_OtherStateType OtherSt_old - - - "Other/optimization states (copied for the case of subcycling)" -typedef ^ ^ MAP_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ MAP_OutputType y_interp - - - "interpolated system outputs for CalcSteady" typedef ^ ^ MAP_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ MAP_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" # ..... FEAMooring data ....................................................................................................... -typedef FAST FEAMooring_Data FEAM_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ FEAM_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ FEAM_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ FEAM_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST FEAMooring_Data FEAM_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ FEAM_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ FEAM_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ FEAM_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ FEAM_ParameterType p - - - "Parameters" -typedef ^ ^ FEAM_InputType u - - - "System inputs" typedef ^ ^ FEAM_OutputType y - - - "System outputs" typedef ^ ^ FEAM_MiscVarType m - - - "Misc/optimization variables" typedef ^ ^ FEAM_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ FEAM_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" # ..... MoorDyn data ....................................................................................................... -typedef FAST MoorDyn_Data MD_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ MD_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ MD_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ MD_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST MoorDyn_Data MD_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ MD_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ MD_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ MD_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ MD_ParameterType p - - - "Parameters" -typedef ^ ^ MD_InputType u - - - "System inputs" typedef ^ ^ MD_OutputType y - - - "System outputs" typedef ^ ^ MD_MiscVarType m - - - "Misc/optimization variables" -typedef ^ ^ MD_OutputType Output {:} - - "Array of outputs associated with CalcSteady Azimuths" -typedef ^ ^ MD_OutputType y_interp - - - "interpolated system outputs for CalcSteady" typedef ^ ^ MD_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ MD_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" # ..... OrcaFlex data ....................................................................................................... -typedef FAST OrcaFlex_Data Orca_ContinuousStateType x {NumStateTimes} - - "Continuous states" -typedef ^ ^ Orca_DiscreteStateType xd {NumStateTimes} - - "Discrete states" -typedef ^ ^ Orca_ConstraintStateType z {NumStateTimes} - - "Constraint states" -typedef ^ ^ Orca_OtherStateType OtherSt {NumStateTimes} - - "Other states" +typedef FAST OrcaFlex_Data Orca_ContinuousStateType x {:} - - "Continuous states" +typedef ^ ^ Orca_DiscreteStateType xd {:} - - "Discrete states" +typedef ^ ^ Orca_ConstraintStateType z {:} - - "Constraint states" +typedef ^ ^ Orca_OtherStateType OtherSt {:} - - "Other states" typedef ^ ^ Orca_ParameterType p - - - "Parameters" -typedef ^ ^ Orca_InputType u - - - "System inputs" typedef ^ ^ Orca_OutputType y - - - "System outputs" typedef ^ ^ Orca_MiscVarType m - - - "Misc/optimization variables" typedef ^ ^ Orca_InputType Input {:} - - "Array of inputs associated with InputTimes" -typedef ^ ^ Orca_InputType Input_Saved {:} - - "Backup Array of inputs associated with InputTimes" typedef ^ ^ DbKi InputTimes {:} - - "Array of times associated with Input Array" -typedef ^ ^ DbKi InputTimes_Saved {:} - - "Backup Array of times associated with Input Array" - -# ..... FAST_ModuleMapType data ....................................................................................................... -# ! Data structures for mapping and coupling the various modules together -# ED <-> BD -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_BD_P {:} - - "Map ElastoDyn BladeRootMotion meshes to BeamDyn RootMotion point meshes" -typedef ^ FAST_ModuleMapType MeshMapType BD_P_2_ED_P {:} - - "Map BeamDyn ReactionForce loads point meshes to ElastoDyn HubPtLoad point mesh" -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_BD_P_Hub {:} - - "ElastoDyn hub to BeamDyn for hub orientation necessary for pitch actuator" -# ED/SD <-> HD -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_HD_PRP_P - - - "Map ElastoDyn PlatformPtMesh to HydroDyn platform reference Point" -typedef ^ FAST_ModuleMapType MeshMapType SubStructure_2_HD_W_P - - - "Map ElastoDyn PlatformPtMesh or SubDyn y2Mesh to HydroDyn WAMIT Point" -typedef ^ FAST_ModuleMapType MeshMapType HD_W_P_2_SubStructure - - - "Map HydroDyn WAMIT Point from y%WAMITMesh to ElastoDyn PlatformPtMesh or SD LMesh" -typedef ^ FAST_ModuleMapType MeshMapType SubStructure_2_HD_M_P - - - "Map ElastoDyn PlatformPtMesh or SubDyn y2Mesh to HydroDyn Morison Point" -typedef ^ FAST_ModuleMapType MeshMapType HD_M_P_2_SubStructure - - - "Map HydroDyn Morison Point to ElastoDyn PlatformPtMesh or SD LMesh" -# Structure (ED, SD, ExtPtfm) <-> Mooring (MAP, FEAM, MoorDyn, OrcaFlex) -typedef ^ FAST_ModuleMapType MeshMapType Structure_2_Mooring - - - "Map structural SD (y3Mesh)/ED to MAP/FEAM/MoorDyn/OrcaFlex point mesh" "Motions" -typedef ^ FAST_ModuleMapType MeshMapType Mooring_2_Structure - - - "Map FEAM/MAP/MoorDyn/OrcaFlex mesh to SD (LMesh)/ED (PlatformPtMesh)/ExtPtfm mesh" "Loads" -# ED <-> SD or User-Platform (ExtPtfm_MCKF) -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_SD_TP - - - "Map ElastoDyn PlatformPtMesh to SubDyn transition-piece point mesh" -typedef ^ FAST_ModuleMapType MeshMapType SD_TP_2_ED_P - - - "Map SubDyn transition-piece point mesh to ElastoDyn PlatformPtMesh" -# ED/BD <-> SrvD/StC -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_NStC_P_N {:} - - "Map ElastoDyn nacelle point mesh to ServoDyn/NStC point mesh" -typedef ^ FAST_ModuleMapType MeshMapType NStC_P_2_ED_P_N {:} - - "Map ServoDyn/NStC nacelle point mesh to ElastoDyn point mesh on the nacelle" -typedef ^ FAST_ModuleMapType MeshMapType ED_L_2_TStC_P_T {:} - - "Map ElastoDyn tower line2 mesh to ServoDyn/TStC point mesh" -typedef ^ FAST_ModuleMapType MeshMapType TStC_P_2_ED_P_T {:} - - "Map ServoDyn/TStC tower point mesh to ElastoDyn point load mesh on the tower" -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 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" -# ED --> SrvD -- PlatformPtMesh motion to SrvD%PtfmMotionMesh for passing to DLL -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_SrvD_P_P - - - "Map ElastoDyn/Simplified-ElastoDyn platform point mesh motion to ServoDyn point mesh -- for passing to controller" -# ED/BD/SED <-> AD (blades) -typedef ^ FAST_ModuleMapType MeshMapType BDED_L_2_AD_L_B {:} - - "Map ElastoDyn BladeLn2Mesh point meshes OR BeamDyn BldMotion line2 meshes to AeroDyn14 InputMarkers OR AeroDyn BladeMotion line2 meshes" -typedef ^ FAST_ModuleMapType MeshMapType AD_L_2_BDED_B {:} - - "Map AeroDyn14 InputMarkers or AeroDyn BladeLoad line2 meshes to ElastoDyn BladePtLoad point meshes or BeamDyn BldMotion line2 meshes" -typedef ^ FAST_ModuleMapType MeshMapType BD_L_2_BD_L {:} - - "Map BeamDyn BldMotion output meshes to locations on the BD input DistrLoad mesh stored in MeshMapType%y_BD_BldMotion_4Loads (BD input and output meshes are not siblings and in fact have nodes at different locations" -typedef ^ FAST_ModuleMapType MeshMapType SED_P_2_AD_L_B {:} - - "Map Simplified-ElastoDyn BladeRoot point meshes to rigid AeroDyn BladeMotion line2 meshes" -typedef ^ FAST_ModuleMapType MeshMapType SED_P_2_AD_P_R {:} - - "Map Simplified-ElastoDyn BladeRootMotion point meshes to AeroDyn BladeRootMotion point meshes" -typedef ^ FAST_ModuleMapType MeshMapType AD_L_2_SED_P {:} - - "Map AeroDyn blade load output mesh to Simplified-ElastoDyn Hub point mesh" -# ED <-> AD (nacelle, tower, hub, blade root, tailfin) -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_AD_P_N - - - "Map ElastoDyn Nacelle point motion mesh to AeroDyn Nacelle point motion mesh" -typedef ^ FAST_ModuleMapType MeshMapType AD_P_2_ED_P_N - - - "Map AeroDyn Nacelle point load mesh to ElastoDyn nacelle point load mesh" -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_AD_P_TF - - - "Map ElastoDyn TailFin CM point motion mesh to AeroDyn TailFin ref point motion mesh" -typedef ^ FAST_ModuleMapType MeshMapType AD_P_2_ED_P_TF - - - "Map AeroDyn TailFin ref point load mesh to ElastoDyn TailFin CM point load mesh" -typedef ^ FAST_ModuleMapType MeshMapType ED_L_2_AD_L_T - - - "Map ElastoDyn TowerLn2Mesh line2 mesh to AeroDyn14 Twr_InputMarkers or AeroDyn TowerMotion line2 mesh" -typedef ^ FAST_ModuleMapType MeshMapType AD_L_2_ED_P_T - - - "Map AeroDyn14 Twr_InputMarkers or AeroDyn TowerLoad line2 mesh to ElastoDyn TowerPtLoads point mesh" -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_AD_P_R {:} - - "Map ElastoDyn BladeRootMotion point meshes to AeroDyn BladeRootMotion point meshes" -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_AD_P_H - - - "Map ElastoDyn HubPtMotion point mesh to AeroDyn HubMotion point mesh" -# ED <-> ADsk (hub) -typedef ^ FAST_ModuleMapType MeshMapType ADsk_P_2_ED_P_H - - - "Map AeroDisk point load mesh to ElastoDyn hub point load mesh" -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_ADsk_P_H - - - "Map ElastoDyn HubPtMotion point mesh to AeroDisk HubMotion point mesh" -# SED <-> AD (nacelle, tower, hub, blade root) -typedef ^ FAST_ModuleMapType MeshMapType SED_P_2_AD_P_N - - - "Map Simplified-ElastoDyn Nacelle point motion mesh to AeroDyn Nacelle point motion mesh" -typedef ^ FAST_ModuleMapType MeshMapType SED_L_2_AD_L_T - - - "Map Simplified-ElastoDyn TowerLn2Mesh line2 mesh to AeroDyn TowerMotion line2 mesh" -typedef ^ FAST_ModuleMapType MeshMapType SED_P_2_AD_P_H - - - "Map Simplified-ElastoDyn HubPtMotion point mesh to AeroDyn HubMotion point mesh" -# SED <-> ADsk (hub) -typedef ^ FAST_ModuleMapType MeshMapType ADsk_P_2_SED_P_H - - - "Map AeroDisk point load mesh to Simplfied-ElastoDyn hub point load mesh" -typedef ^ FAST_ModuleMapType MeshMapType SED_P_2_ADsk_P_H - - - "Map Simplified-ElastoDyn HubPtMotion point mesh to AeroDisk HubMotion point mesh" -typedef ^ FAST_ModuleMapType MeshMapType AD_P_2_ED_P_H - - - "Map AeroDyn HubLoad point mesh to ElastoDyn HubPtLoad point mesh" -# ED/BD <-> ExtLd (blades) -typedef ^ FAST_ModuleMapType MeshMapType BDED_L_2_ExtLd_P_B {:} - - "Map ElastoDyn/BeamDyn BladeLn2Mesh point meshes OR BeamDyn BldMotion line2 meshes to ExtLoads point meshes" -typedef ^ FAST_ModuleMapType MeshMapType ExtLd_P_2_BDED_B {:} - - "Map ExtLoads at points to ElastoDyn BladePtLoad point meshes or BeamDyn BldMotion line2 meshes" -# ED <-> ExtLd (tower, hub, blade root) -typedef ^ FAST_ModuleMapType MeshMapType ED_L_2_ExtLd_P_T - - - "Map ElastoDyn TowerLn2Mesh line2 mesh to ExtLoads point mesh" -typedef ^ FAST_ModuleMapType MeshMapType ExtLd_P_2_ED_P_T - - - "Map ExtLoads TowerLoad point mesh to ElastoDyn TowerPtLoads point mesh" -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_ExtLd_P_R {:} - - "Map ElastoDyn BladeRootMotion point meshes to ExtLoads BladeRootMotion point meshes" -typedef ^ FAST_ModuleMapType MeshMapType ED_P_2_ExtLd_P_H - - - "Map ElastoDyn HubPtMotion point mesh to ExtLoads HubMotion point mesh" -typedef ^ FAST_ModuleMapType MeshMapType AD_L_2_ExtLd_B {:} - - "Map AeroDyn line loads on blades to ExtLoads point loads" -typedef ^ FAST_ModuleMapType MeshMapType AD_L_2_ExtLd_T - - - "Map AeroDyn line loads on tower to ExtKoads point loads" -# IceF <-> SD -typedef ^ FAST_ModuleMapType MeshMapType IceF_P_2_SD_P - - - "Map IceFloe point mesh to SubDyn LMesh point mesh" -typedef ^ FAST_ModuleMapType MeshMapType SDy3_P_2_IceF_P - - - "Map SubDyn y3Mesh point mesh to IceFloe point mesh" -# IceD <-> SD -typedef ^ FAST_ModuleMapType MeshMapType IceD_P_2_SD_P {:} - - "Map IceDyn point mesh to SubDyn LMesh point mesh" -typedef ^ FAST_ModuleMapType MeshMapType SDy3_P_2_IceD_P {:} - - "Map SubDyn y3Mesh point mesh to IceDyn point mesh" -# Stored Jacobians: -typedef ^ FAST_ModuleMapType ReKi Jacobian_Opt1 {:}{:} - - "Stored Jacobian in ED_HD_InputOutputSolve or FullOpt1_InputOutputSolve" -typedef ^ FAST_ModuleMapType Integer Jacobian_pivot {:} - - "Pivot array used for LU decomposition of Jacobian_Opt1" -typedef ^ FAST_ModuleMapType Integer Jac_u_indx {:}{:} - - "matrix to help fill/pack the u vector in computing the jacobian" -# Temporary copies of input meshes (stored here so we don't have to keep allocating/destroying them) -typedef ^ FAST_ModuleMapType MeshType u_ED_NacelleLoads - - - "copy of ED input mesh" -typedef ^ FAST_ModuleMapType MeshType SubstructureLoads_Tmp - - - "copy of substructure loads input mesh (ED or SD)" -typedef ^ FAST_ModuleMapType MeshType SubstructureLoads_Tmp2 - - - "copy of substructure loads input mesh (ED or SD, used only for temporary storage)" -typedef ^ FAST_ModuleMapType MeshType PlatformLoads_Tmp - - - "copy of platform loads input mesh (ED)" -typedef ^ FAST_ModuleMapType MeshType PlatformLoads_Tmp2 - - - "copy of platform loads input mesh (ED, used only for temporary storage)" -typedef ^ FAST_ModuleMapType MeshType SubstructureLoads_Tmp_Farm - - - "copy of substructure mesh used to store loads from farm-level MD" -typedef ^ FAST_ModuleMapType MeshType u_ED_TowerPtloads - - - "copy of ED input mesh" -typedef ^ FAST_ModuleMapType MeshType u_ED_BladePtLoads {:} - - "copy of ED input mesh" -typedef ^ FAST_ModuleMapType MeshType u_SD_TPMesh - - - "copy of SD input mesh" -#typedef ^ FAST_ModuleMapType MeshType u_HD_M_LumpedMesh - - - "copy of HD input mesh" -typedef ^ FAST_ModuleMapType MeshType u_HD_M_Mesh - - - "copy of HD morison input mesh" -typedef ^ FAST_ModuleMapType MeshType u_HD_W_Mesh - - - "copy of HD wamit input mesh" -#typedef ^ FAST_ModuleMapType MeshType u_HD_PRP_Mesh - - - "copy of HD PRP input mesh" -typedef ^ FAST_ModuleMapType MeshType u_ED_HubPtLoad - - - "copy of ED input mesh" -typedef ^ FAST_ModuleMapType MeshType u_ED_HubPtLoad_2 - - - "copy of ED input mesh" -typedef ^ FAST_ModuleMapType MeshType u_BD_RootMotion {:} - - "copy of BD input meshes" -typedef ^ FAST_ModuleMapType MeshType y_BD_BldMotion_4Loads {:} - - "BD blade motion output at locations on DistrLoad input meshes" -typedef ^ FAST_ModuleMapType MeshType u_BD_Distrload {:} - - "copy of BD DistrLoad input meshes" -typedef ^ FAST_ModuleMapType MeshType u_Orca_PtfmMesh - - - "copy of Orca PtfmMesh input mesh" -typedef ^ FAST_ModuleMapType MeshType u_ExtPtfm_PtfmMesh - - - "copy of ExtPtfm_MCKF PtfmMesh input mesh" -typedef ^ FAST_ModuleMapType MeshType u_SED_HubPtLoad - - - "copy of SED input mesh" -#typedef ^ FAST_ModuleMapType MeshType u_FarmMD_CoupledLoads - - - "FAST-internal copy of MoorDyn's CoupledLoads output mesh for use with shared moorings in FAST.Farm" -# for steady-state solve (convert 1 blade to all blades) -typedef ^ FAST_ModuleMapType R8Ki HubOrient {:}{:}{:} - - "Orientation matrix to translate results from blade 1 to remaining blades in aeromaps" "(-)" # ..... FAST_ExternalInput data ....................................................................................................... typedef FAST FAST_ExternInputType ReKi GenTrq - - - "generator torque input from Simulink/Labview" @@ -807,27 +523,25 @@ typedef ^ FAST_ExternInputType ReKi CableDeltaLdot {20} - - "Cable control Delta # ..... FAST_MiscVarType data ....................................................................................................... typedef FAST FAST_MiscVarType DbKi TiLstPrn - - - "The simulation time of the last print (to file)" (s) typedef ^ FAST_MiscVarType DbKi t_global - - - "Current simulation time (for global/FAST simulation)" (s) -typedef ^ FAST_MiscVarType DbKi NextJacCalcTime - - - "Time between calculating Jacobians in the HD-ED and SD-ED simulations" (s) typedef ^ FAST_MiscVarType ReKi PrevClockTime - - - "Clock time at start of simulation in seconds" (s) typedef ^ FAST_MiscVarType ReKi UsrTime1 - - - "User CPU time for simulation initialization" (s) typedef ^ FAST_MiscVarType ReKi UsrTime2 - - - "User CPU time for simulation (without initialization)" (s) typedef ^ FAST_MiscVarType INTEGER StrtTime {8} - - "Start time of simulation (including initialization)" typedef ^ FAST_MiscVarType INTEGER SimStrtTime {8} - - "Start time of simulation (after initialization)" #typedef ^ FAST_MiscVarType IntKi n_t_global - - - "simulation time step, loop counter for global (FAST) simulation" (s) -typedef ^ FAST_MiscVarType Logical calcJacobian - - - "Should we calculate Jacobians in Option 1?" (flag) typedef ^ FAST_MiscVarType FAST_ExternInputType ExternInput - - - "external input values" - typedef ^ FAST_MiscVarType FAST_MiscLinType Lin - - - "misc data for linearization analysis" - # ..... FAST_InitData data ....................................................................................................... typedef ^ FAST_InitData ED_InitInputType InData_ED - - - "ED Initialization input data" -typedef ^ FAST_InitData ED_InitOutputType OutData_ED - - - "ED Initialization output data" +typedef ^ FAST_InitData ED_InitOutputType OutData_ED : - - "ED Initialization output data" typedef ^ FAST_InitData SED_InitInputType InData_SED - - - "SED Initialization input data" typedef ^ FAST_InitData SED_InitOutputType OutData_SED - - - "SED Initialization output data" typedef ^ FAST_InitData BD_InitInputType InData_BD - - - "BD Initialization input data" typedef ^ FAST_InitData BD_InitOutputType OutData_BD : - - "BD Initialization output data" typedef ^ FAST_InitData SrvD_InitInputType InData_SrvD - - - "SrvD Initialization input data" -typedef ^ FAST_InitData SrvD_InitOutputType OutData_SrvD - - - "SrvD Initialization output data" +typedef ^ FAST_InitData SrvD_InitOutputType OutData_SrvD : - - "SrvD Initialization output data" typedef ^ FAST_InitData AD_InitInputType InData_AD - - - "AD Initialization input data" typedef ^ FAST_InitData AD_InitOutputType OutData_AD - - - "AD Initialization output data" typedef ^ FAST_InitData ADsk_InitInputType InData_ADsk - - - "ADsk Initialization input data" @@ -858,6 +572,8 @@ typedef ^ FAST_InitData IceFloe_InitInputType InData_IceF - - typedef ^ FAST_InitData IceFloe_InitOutputType OutData_IceF - - - "IceF Initialization output data" typedef ^ FAST_InitData IceD_InitInputType InData_IceD - - - "IceD Initialization input data" typedef ^ FAST_InitData IceD_InitOutputType OutData_IceD - - - "IceD Initialization output data (each instance will have the same output channels)" +typedef ^ FAST_InitData SlD_InitInputType InData_SlD - - - "SlD Initialization input data" +typedef ^ FAST_InitData SlD_InitOutputType OutData_SlD - - - "SlD Initialization output data" # ..... FAST External Initialization Input data ....................................................................................................... @@ -884,7 +600,9 @@ typedef ^ FAST_TurbineType IntKi TurbID - 1 - "Turbine ID Number" - typedef ^ FAST_TurbineType FAST_ParameterType p_FAST - - - "Parameters for the glue code" - typedef ^ FAST_TurbineType FAST_OutputFileType y_FAST - - - "Output variables for the glue code" - typedef ^ FAST_TurbineType FAST_MiscVarType m_FAST - - - "Miscellaneous variables" - -typedef ^ FAST_TurbineType FAST_ModuleMapType MeshMapData - - - "Data for mapping between modules" - +typedef ^ FAST_TurbineType Glue_ParameterType p_Glue - - - "Parameters for the glue code" - +typedef ^ FAST_TurbineType Glue_OutputFileType y_Glue - - - "Output variables for the glue code" - +typedef ^ FAST_TurbineType Glue_MiscVarType m_Glue - - - "Miscellaneous variables" - typedef ^ FAST_TurbineType ElastoDyn_Data ED - - - "Data for the ElastoDyn module" - typedef ^ FAST_TurbineType SED_Data SED - - - "Data for the Simplified-ElastoDyn module" - typedef ^ FAST_TurbineType BeamDyn_Data BD - - - "Data for the BeamDyn module" - @@ -897,6 +615,7 @@ typedef ^ FAST_TurbineType ExternalInflow_Data ExtInfw - - - "Data for ExternalI typedef ^ FAST_TurbineType SeaState_Data SeaSt - - - "Data for the SeaState module" - typedef ^ FAST_TurbineType HydroDyn_Data HD - - - "Data for the HydroDyn module" - typedef ^ FAST_TurbineType SubDyn_Data SD - - - "Data for the SubDyn module" - +typedef ^ FAST_TurbineType SoilDyn_Data SlD - - - "Data for the SoilDyn module" - typedef ^ FAST_TurbineType MAP_Data MAP - - - "Data for the MAP (Mooring Analysis Program) module" - typedef ^ FAST_TurbineType FEAMooring_Data FEAM - - - "Data for the FEAMooring module" - typedef ^ FAST_TurbineType MoorDyn_Data MD - - - "Data for the MoorDyn module" - diff --git a/modules/openfast-library/src/FAST_SS_Solver.f90 b/modules/openfast-library/src/FAST_SS_Solver.f90 deleted file mode 100644 index ffd64c979a..0000000000 --- a/modules/openfast-library/src/FAST_SS_Solver.f90 +++ /dev/null @@ -1,2185 +0,0 @@ -!********************************************************************************************************************************** -! LICENSING -! Copyright (C) 2020 Envision Energy USA, National Renewable Energy Laboratory -! -! This file is part of FAST. -! -! Licensed under the Apache License, Version 2.0 (the "License"); -! you may not use this file except in compliance with the License. -! You may obtain a copy of the License at -! -! http://www.apache.org/licenses/LICENSE-2.0 -! -! Unless required by applicable law or agreed to in writing, software -! distributed under the License is distributed on an "AS IS" BASIS, -! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -! See the License for the specific language governing permissions and -! limitations under the License. -!********************************************************************************************************************************** -!> This module contains the routines used by FAST to solve input-output equations and to advance states. -MODULE FAST_SS_Solver - - USE FAST_SOLVER - USE FAST_Linear - USE FAST_Subs - USE BeamDyn_Subs, ONLY: BD_CrvMatrixR, BD_CrvExtractCrv - - IMPLICIT NONE - - REAL(DbKi), PARAMETER :: SS_t_global = 0.0_DbKi - REAL(DbKi), PARAMETER :: UJacSclFact_x = 1.0d3 - - LOGICAL, PARAMETER :: output_debugging = .false. - -CONTAINS -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE SteadyStateCCSD( caseData, p_FAST, y_FAST, m_FAST, ED, BD, InputIndex, ErrStat, ErrMsg ) - - TYPE(FAST_SS_CaseType) , INTENT(IN ) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType), INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - INTEGER(IntKi), INTENT(IN ) :: InputIndex !< Index into input array - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - INTEGER(IntKi) :: i - INTEGER(IntKi) :: k - INTEGER(IntKi) :: BldMeshNode - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SteadyStateCCSD' - REAL(R8Ki) :: Omega_Hub(3) - REAL(R8Ki) :: position(3) - REAL(R8Ki) :: omega_cross_position(3) - - ErrStat = ErrID_None - ErrMsg = "" - - IF (p_FAST%CompElast == Module_ED) THEN - CALL ED_CalcContStateDeriv( SS_t_global, ED%Input(InputIndex), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), & - ED%OtherSt(STATE_CURR), ED%m, ED%x(STATE_PRED), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ELSEIF (p_FAST%CompElast == Module_BD) THEN - Omega_Hub(1) = caseData%RotSpeed - Omega_Hub(2:3) = 0.0_R8Ki - - DO K = 1,p_FAST%nBeams - CALL BD_CalcContStateDeriv( SS_t_global, BD%Input(InputIndex,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), & - BD%OtherSt(k,STATE_CURR), BD%m(k), BD%x(k,STATE_PRED), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! subtract xdot(y) here: - ! note that this only works when the BldMotion mesh is on the FE nodes - do i=2,BD%p(k)%node_total ! the first node isn't technically a state - BldMeshNode = BD%p(k)%NdIndx(i) - position = BD%y(k)%BldMotion%Position(:,BldMeshNode) + BD%y(k)%BldMotion%TranslationDisp(:,BldMeshNode) - omega_cross_position = cross_product( Omega_Hub, position ) - - BD%x(k, STATE_PRED)%q( 1:3,i) = BD%x(k, STATE_PRED)%q( 1:3,i) - omega_cross_position - BD%x(k, STATE_PRED)%q( 4:6,i) = BD%x(k, STATE_PRED)%q( 4:6,i) - Omega_Hub - BD%x(k, STATE_PRED)%dqdt( 1:3,i) = BD%x(k, STATE_PRED)%dqdt( 1:3,i) - cross_product( Omega_Hub, omega_cross_position ) - end do - - END DO - END IF - -END SUBROUTINE SteadyStateCCSD -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE SteadyStateCalculatedInputs( p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, InputIndex, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType), INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT(IN ) :: InputIndex !< Index into input array - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SteadyStateCalculatedInputs' - - ErrStat = ErrID_None - ErrMsg = "" - - ! transfer the motions first: - CALL SS_AD_InputSolve( p_FAST, AD%Input(InputIndex), ED%y, BD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! transfer the loads next: - IF (p_FAST%CompElast == Module_ED) THEN - CALL SS_ED_InputSolve( p_FAST, ED%Input(InputIndex), ED%y, AD%y, AD%Input(InputIndex), MeshMapData, ErrStat2, ErrMsg2 ) - - ELSEIF (p_FAST%CompElast == Module_BD) THEN - CALL SS_BD_InputSolve( p_FAST, BD, AD%y, AD%Input(InputIndex), MeshMapData, InputIndex, ErrStat2, ErrMsg2 ) - END IF - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - -END SUBROUTINE SteadyStateCalculatedInputs -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the blade load inputs required for BD. -SUBROUTINE SS_BD_InputSolve( p_FAST, BD, y_AD, u_AD, MeshMapData, InputIndex, ErrStat, ErrMsg ) -!.................................................................................................................................. - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BD Inputs at t - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD inputs (for AD-BD load transfer) - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT(IN ) :: InputIndex !< Index into input array - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SS_BD_InputSolve' - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - - ! BD inputs on blade from AeroDyn - - if (p_FAST%BD_OutputSibling) then - - DO K = 1, p_FAST%NumBl_Lin ! we don't need all blades here: p_FAST%nBeams ! Loop through all blades - - CALL Transfer_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(InputIndex,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), BD%y(k)%BldMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - END DO - - else - DO K = 1, p_FAST%NumBl_Lin ! we don't need all blades here: p_FAST%nBeams ! Loop through all blades - - ! need to transfer the BD output blade motions to nodes on a sibling of the BD blade motion mesh: - CALL Transfer_Line2_to_Line2( BD%y(k)%BldMotion, MeshMapData%y_BD_BldMotion_4Loads(k), MeshMapData%BD_L_2_BD_L(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - CALL Transfer_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(InputIndex,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), MeshMapData%y_BD_BldMotion_4Loads(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - END DO - end if - - - -END SUBROUTINE SS_BD_InputSolve -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the blade-load ElastoDyn inputs from blade 1 to the other blades. -SUBROUTINE SS_BD_InputSolve_OtherBlades( p_FAST, BD, MeshMapData, InputIndex ) - - ! Passed variables - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BD Inputs at t - - TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT(IN ) :: InputIndex !< Index into input array - - ! Local variables: - - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: J ! Loops through nodes - - - DO k = p_FAST%NumBl_Lin+1,p_FAST%nBeams - DO j=1,BD%Input(InputIndex,k)%DistrLoad%NNodes - BD%Input(InputIndex,k)%DistrLoad%Force( :,j) = MATMUL(BD%Input(InputIndex,1)%DistrLoad%Force( :,j), MeshMapData%HubOrient(:,:,k) ) - BD%Input(InputIndex,k)%DistrLoad%Moment(:,j) = MATMUL(BD%Input(InputIndex,1)%DistrLoad%Moment(:,j), MeshMapData%HubOrient(:,:,k) ) - END DO - END DO - -END SUBROUTINE SS_BD_InputSolve_OtherBlades - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the blade load inputs required for ED. -SUBROUTINE SS_ED_InputSolve( p_FAST, u_ED, y_ED, y_AD, u_AD, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(ED_InputType), INTENT(INOUT) :: u_ED !< ED Inputs at t - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD inputs (for AD-ED load transfer) - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SS_ED_InputSolve' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - ! ED inputs on blade from AeroDyn - - DO K = 1, p_FAST%NumBl_Lin !we don't need all blades here: SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - CALL Transfer_Line2_to_Point( y_AD%rotors(1)%BladeLoad(k), u_ED%BladePtLoads(k), MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), y_ED%BladeLn2Mesh(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO - -END SUBROUTINE SS_ED_InputSolve -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the blade-load ElastoDyn inputs from blade 1 to the other blades. -SUBROUTINE SS_ED_InputSolve_OtherBlades( p_FAST, u_ED, MeshMapData ) - - ! Passed variables - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(ED_InputType), INTENT(INOUT) :: u_ED !< ED Inputs at t - TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules - - ! Local variables: - - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: J ! Loops through nodes - - - DO k = p_FAST%NumBl_Lin+1,size(u_ED%BladePtLoads,1) - DO j=1,u_ED%BladePtLoads(k)%NNodes - u_ED%BladePtLoads(k)%Force( :,j) = MATMUL(u_ED%BladePtLoads(1)%Force( :,j), MeshMapData%HubOrient(:,:,k) ) - u_ED%BladePtLoads(k)%Moment(:,j) = MATMUL(u_ED%BladePtLoads(1)%Moment(:,j), MeshMapData%HubOrient(:,:,k) ) - END DO - END DO - -END SUBROUTINE SS_ED_InputSolve_OtherBlades - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the blade-motion AeroDyn inputs. -SUBROUTINE SS_AD_InputSolve( p_FAST, u_AD, y_ED, BD, MeshMapData, ErrStat, ErrMsg ) - - ! Passed variables - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< The inputs to AeroDyn14 - TYPE(ED_OutputType), INTENT(IN) :: y_ED !< The outputs from the structural dynamics module - TYPE(BeamDyn_Data), INTENT(IN) :: BD !< The data from BeamDyn (want the outputs only, but it's in an array) - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi) :: ErrStat !< Error status of the operation - CHARACTER(*) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SS_AD_InputSolve' - - - ErrStat = ErrID_None - ErrMsg = "" - - !------------------------------------------------------------------------------------------------- - ! Set the inputs from structure: - !------------------------------------------------------------------------------------------------- - IF (p_FAST%CompElast == Module_ED ) THEN - - DO k=1,p_FAST%NumBl_Lin !we don't need all blades here: size(y_ED%BladeLn2Mesh) - CALL Transfer_Line2_to_Line2( y_ED%BladeLn2Mesh(k), u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - - ELSEIF (p_FAST%CompElast == Module_BD ) THEN - - ! get them from BeamDyn - DO k=1,p_FAST%NumBl_Lin !we don't need all blades here: size(u_AD%BladeMotion) - CALL Transfer_Line2_to_Line2( BD%y(k)%BldMotion, u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - - END IF - - ! make sure these are the prescribed values: - DO k = 1,p_FAST%NumBl_Lin !we don't need all blades here: size(u_AD%BladeMotion,1) - u_AD%rotors(1)%BladeMotion(k)%RotationVel = 0.0_ReKi - u_AD%rotors(1)%BladeMotion(k)%TranslationAcc = 0.0_ReKi - END DO - - -END SUBROUTINE SS_AD_InputSolve -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the blade-motion AeroDyn inputs. -SUBROUTINE SS_AD_InputSolve_OtherBlades( p_FAST, u_AD, MeshMapData ) - - ! Passed variables - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< The inputs to AeroDyn14 - TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules - - ! Local variables: - - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: J ! Loops through nodes - - - DO k = p_FAST%NumBl_Lin+1,size(u_AD%rotors(1)%BladeMotion,1) - DO j=1,u_AD%rotors(1)%BladeMotion(k)%NNodes - u_AD%rotors(1)%BladeMotion(k)%TranslationDisp(:,j) = MATMUL( u_AD%rotors(1)%BladeMotion(1)%TranslationDisp(:,j), MeshMapData%HubOrient(:,:,k) ) - u_AD%rotors(1)%BladeMotion(k)%Orientation( :,:,j) = MATMUL( u_AD%rotors(1)%BladeMotion(1)%Orientation( :,:,j), MeshMapData%HubOrient(:,:,k) ) - u_AD%rotors(1)%BladeMotion(k)%TranslationVel( :,j) = MATMUL( u_AD%rotors(1)%BladeMotion(1)%TranslationVel( :,j), MeshMapData%HubOrient(:,:,k) ) - END DO - END DO - -END SUBROUTINE SS_AD_InputSolve_OtherBlades - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine performs the Input-Output solve for the steady-state solver. -!! Note that this has been customized for the physics in the problems and is not a general solution. -SUBROUTINE SolveSteadyState( caseData, Jmat, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData , ErrStat, ErrMsg ) -!.................................................................................................................................. - - ! Passed variables - TYPE(FAST_SS_CaseType) , INTENT(IN ) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case - REAL(R8Ki), INTENT(INOUT) :: Jmat(:,:) !< temporary storage space for jacobian matrix - - TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType) , INTENT(INOUT) :: y_FAST !< Glue-code output file values - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - - TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - CHARACTER(*), PARAMETER :: RoutineName = 'SolveSteadyState' - -!bjj: store these so that we don't reallocate every time? - REAL(R8Ki) :: u( p_FAST%SizeJac_Opt1(1)) ! size of loads/accelerations passed between the 6 modules - REAL(R8Ki) :: u_delta( p_FAST%SizeJac_Opt1(1)) ! size of loads/accelerations passed between the 6 modules - REAL(R8Ki) :: Fn_U_Resid( p_FAST%SizeJac_Opt1(1)) ! Residual of U - REAL(R8Ki) :: err - REAL(R8Ki) :: err_prev - REAL(R8Ki), PARAMETER :: reduction_factor = 0.1_R8Ki - - INTEGER(IntKi) :: nb ! loop counter (blade number) - INTEGER(IntKi) :: MaxIter ! maximum number of iterations - INTEGER(IntKi) :: K ! Input-output-solve iteration counter - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - LOGICAL :: GetWriteOutput ! flag to determine if we need WriteOutputs from this call to CalcOutput - - ! Note: p_FAST%UJacSclFact is a scaling factor that gets us similar magnitudes between loads and accelerations... - -!bjj: note, that this routine may have a problem if there is remapping done - - ErrStat = ErrID_None - ErrMsg = "" - !---------------------------------------------------------------------------------------------------- - ! Some record keeping stuff: - !---------------------------------------------------------------------------------------------------- - - CALL SteadyStateUpdateStates( caseData, p_FAST, ED, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - CALL SteadyStatePrescribedInputs( caseData, p_FAST, y_FAST, m_FAST, ED, BD, AD ) - CALL CopyStatesInputs( p_FAST, ED, BD, AD, ErrStat2, ErrMsg2, MESH_UPDATECOPY ) ! COPY the inputs to the temp copy (so we get updated input values) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - K = 0 - err = 1.0E3 - err_prev = err - - y_FAST%DriverWriteOutput(SS_Indx_Err) = -1 - y_FAST%DriverWriteOutput(SS_Indx_Iter) = 0 - y_FAST%DriverWriteOutput(SS_Indx_TSR) = caseData%tsr - y_FAST%DriverWriteOutput(SS_Indx_WS) = caseData%windSpeed - y_FAST%DriverWriteOutput(SS_Indx_Pitch) = caseData%Pitch*R2D - y_FAST%DriverWriteOutput(SS_Indx_RotSpeed) = caseData%RotSpeed*RPS2RPM - - MaxIter = p_FAST%KMax + 1 ! adding 1 here so that we get the error calculated correctly when we hit the max iteration - DO - - !------------------------------------------------------------------------------------------------- - ! Calculate outputs, based on inputs at this time - !------------------------------------------------------------------------------------------------- - GetWriteOutput = K > 0 ! we can skip this on the first call (because we always calculate outputs twice) - - IF ( p_FAST%CompElast == Module_ED ) THEN - CALL ED_CalcOutput( SS_t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), ED%y, ED%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF ( p_FAST%CompElast == Module_BD) THEN - do nb=1,p_FAST%nBeams - CALL BD_CalcOutput( SS_t_global, BD%Input(1,nb), BD%p(nb), BD%x(nb, STATE_CURR), BD%xd(nb, STATE_CURR), BD%z(nb, STATE_CURR), BD%OtherSt(nb, STATE_CURR), & - BD%y(nb), BD%m(nb), ErrStat2, ErrMsg2, GetWriteOutput ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end do - END IF - - IF (K==0) THEN - - ! set the AD input guess based on the structural output (this will ensure that the pitch is accounted for in the fixed aero-map solve:): - CALL SS_AD_InputSolve( p_FAST, AD%Input(1), ED%y, BD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL SS_AD_InputSolve_OtherBlades( p_FAST, AD%Input(1), MeshMapData ) ! transfer results from blade 1 to other blades - - !---------------------------------------------------------------------------------------------------- - ! set up x-u vector, using local initial guesses: - !---------------------------------------------------------------------------------------------------- - CALL Create_SS_Vector( p_FAST, y_FAST, u, AD, ED, BD, 1, STATE_CURR ) - - END IF - - CALL AD_CalcOutput(SS_t_global, AD%Input(1), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), AD%OtherSt(STATE_CURR), AD%y, AD%m, ErrStat2, ErrMsg2, GetWriteOutput ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) THEN - call resetInputsAndStates() - RETURN - END IF - - IF (K >= MaxIter) EXIT - - - !------------------------------------------------------------------------------------------------- - ! Calculate residual and the Jacobian: - ! (note that we don't want to change module%Input(1), here) - ! Also, the residual uses values from y_FAST, so do this before calculating the jacobian - !------------------------------------------------------------------------------------------------- - CALL SteadyStateSolve_Residual(caseData, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, u, Fn_U_Resid, ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) THEN - call resetInputsAndStates() - RETURN - END IF - - IF ( mod( K, p_FAST%N_UJac ) == 0 ) THEN - CALL FormSteadyStateJacobian( caseData, Jmat, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - call Precondition_Jmat(p_FAST, y_FAST, Jmat) - - ! Get the LU decomposition of this matrix using a LAPACK routine: - ! The result is of the form Jmat = P * L * U - - CALL LAPACK_getrf( M=size(Jmat,1), N=size(Jmat,2), & - A=Jmat, IPIV=MeshMapData%Jacobian_pivot, & - ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) THEN - call resetInputsAndStates() - RETURN - END IF - - END IF - - !------------------------------------------------------------------------------------------------- - ! Solve for delta u: Jac*u_delta = - Fn_U_Resid - ! using the LAPACK routine - !------------------------------------------------------------------------------------------------- - - u_delta = -Fn_U_Resid - CALL LAPACK_getrs( TRANS="N", N=SIZE(Jmat,1), A=Jmat, & - IPIV=MeshMapData%Jacobian_pivot, B=u_delta, ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) RETURN - - !------------------------------------------------------------------------------------------------- - ! check for error, update inputs if necessary, and iterate again - !------------------------------------------------------------------------------------------------- - err_prev = err - err = DOT_PRODUCT(u_delta, u_delta) - y_FAST%DriverWriteOutput(SS_Indx_Err) = sqrt(err) / p_FAST%SizeJac_Opt1(1) - - IF ( err <= p_FAST%TolerSquared) THEN - IF (K==0) THEN ! the error will be incorrect in this instance, but the outputs will be better - MaxIter = K - ELSE - EXIT - END IF - END IF - - IF (K >= p_FAST%KMax ) EXIT - IF (K > 5 .and. err > 1.0E35) EXIT ! this is obviously not converging. Let's try something else. - - !------------------------------------------------------------------------------------------------- - ! modify inputs and states for next iteration - !------------------------------------------------------------------------------------------------- - if (err > err_prev ) then - u_delta = u_delta * reduction_factor ! don't take a full step if we're getting farther from the solution! - err_prev = err_prev * reduction_factor - end if - - CALL Add_SteadyState_delta( p_FAST, y_FAST, u_delta, AD, ED, BD, MeshMapData ) - - !u = u + u_delta - CALL Create_SS_Vector( p_FAST, y_FAST, u, AD, ED, BD, 1, STATE_CURR ) - - K = K + 1 - y_FAST%DriverWriteOutput(SS_Indx_Iter) = k - - END DO ! K - - IF ( p_FAST%CompElast == Module_BD ) THEN - ! this doesn't actually get the correct hub point load from BD, but we'll get some outputs: - CALL ED_CalcOutput( SS_t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), ED%y, ED%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - call resetInputsAndStates() - -contains - subroutine resetInputsAndStates() - - IF ( err > p_FAST%TolerSquared ) THEN - CALL SetErrStat(ErrID_Severe, 'Steady-state solver did not converge.', ErrStat, ErrMsg, RoutineName) - - IF ( err > 100.0 ) THEN - ! if we didn't get close on the solution, we should reset the states and inputs because they very well could - ! lead to numerical issues on the next iteration. Here, set the initial values to 0: - - ! because loads occasionally get very large when it fails, manually set these to zero (otherwise - ! roundoff can lead to non-zero values with the method below, which is most useful for states) - IF( p_FAST%CompElast == Module_BD ) THEN - DO K = 1,p_FAST%nBeams - BD%Input(1,k)%DistrLoad%Force = 0.0_ReKi - BD%Input(1,k)%DistrLoad%Moment = 0.0_ReKi - END DO - - END IF - - CALL Create_SS_Vector( p_FAST, y_FAST, u, AD, ED, BD, 1, STATE_CURR ) ! find the values we have been modifying (in u... continuous states and inputs) - CALL Add_SteadyState_delta( p_FAST, y_FAST, -u, AD, ED, BD, MeshMapData ) ! and reset them to 0 (by adding -u) - - END IF - END IF - end subroutine resetInputsAndStates - -END SUBROUTINE SolveSteadyState -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE SteadyStateSolve_Residual(caseData, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, u_in, u_resid, ErrStat, ErrMsg) - ! Passed variables - TYPE(FAST_SS_CaseType) , INTENT(IN ) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case - TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType) , INTENT(INOUT) :: y_FAST !< Glue-code output file values - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - - TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - REAL( R8Ki ) , INTENT(IN ) :: u_in(:) !< The residual of the array of states and inputs we are trying to solve for - REAL( R8Ki ) , INTENT( OUT) :: u_resid(:) !< The residual of the array of states and inputs we are trying to solve for - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - REAL(R8Ki) :: Orientation(3,3) - INTEGER(IntKi) :: k, node - INTEGER(IntKi) :: ErrStat2 - INTEGER(IntKi) :: Indx_u_start - INTEGER(IntKi) :: Indx_u_angle_start(p_FAST%NumBl_Lin) - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SteadyStateSolve_Residual' - - integer, parameter :: InputIndex = 2 - - ErrStat = ErrID_None - ErrMsg = "" - - !note: prescribed inputs are already set in both InputIndex=1 and InputIndex=2 so we can ignore them here - - call SteadyStateCCSD( caseData, p_FAST, y_FAST, m_FAST, ED, BD, 1, ErrStat2, ErrMsg2 ) ! use current inputs and calculate CCSD in STATE_PRED - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! note that we don't need to calculate the inputs on more than p_FAST%NumBl_Lin blades because we are only using them to compute the Create_SS_Vector - call SteadyStateCalculatedInputs( p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, InputIndex, ErrStat2, ErrMsg2 ) ! calculate new inputs and store in InputIndex=2 - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - !.................. - ! Pack the output "residual vector" with these state derivatives and new inputs: - !.................. - CALL Create_SS_Vector( p_FAST, y_FAST, U_Resid, AD, ED, BD, InputIndex, STATE_PRED, Indx_u_angle_start ) - - ! Make the inputs a residual (subtract from previous inputs) - Indx_u_start = y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL) + 1 - U_Resid(Indx_u_start : ) = u_in(Indx_u_start : ) - U_Resid(Indx_u_start : ) - - ! we need to make a special case for the orientation matrices - do k=1,p_FAST%NumBl_Lin - Indx_u_start = Indx_u_angle_start(k) - do node=1, AD%Input(InputIndex)%rotors(1)%BladeMotion(k)%NNodes - Orientation = EulerConstruct( u_in( Indx_u_start:Indx_u_start+2 ) ) - Orientation = MATMUL(TRANSPOSE( AD%Input(InputIndex)%rotors(1)%BladeMotion(k)%Orientation(:,:,node)), Orientation) - U_Resid(Indx_u_start:Indx_u_start+2) = EulerExtract(Orientation) - Indx_u_start = Indx_u_start + 3 - end do - end do - -END SUBROUTINE SteadyStateSolve_Residual -!---------------------------------------------------------------------------------------------------------------------------------- -!> This subroutine saves the current states so they can be used to compute the residual. -SUBROUTINE CopyStatesInputs( p_FAST, ED, BD, AD, ErrStat, ErrMsg, CtrlCode ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - INTEGER(IntKi), INTENT(IN ) :: CtrlCode !< mesh copy control code (new, vs update) - - ! local variables - INTEGER(IntKi) :: k ! generic loop counters - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'CopyStatesInputs' - - - ErrStat = ErrID_None - ErrMsg = "" - - - !---------------------------------------------------------------------------------------- - !! copy the operating point of the states and inputs - !---------------------------------------------------------------------------------------- - - ! ElastoDyn: copy states and inputs - IF ( CtrlCode == MESH_NEWCOPY ) THEN - CALL ED_CopyContState (ED%x( STATE_CURR), ED%x( STATE_PRED), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_CURR), ED%xd(STATE_PRED), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_CURR), ED%z( STATE_PRED), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_CURR), ED%OtherSt( STATE_PRED), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - CALL ED_CopyInput (ED%Input(1), ED%Input(2), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! BeamDyn: copy states and inputs to OP array - IF ( p_FAST%CompElast == Module_BD ) THEN - - IF ( CtrlCode == MESH_NEWCOPY ) THEN - DO k=1,p_FAST%nBeams - CALL BD_CopyContState (BD%x( k,STATE_CURR),BD%x( k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_CURR),BD%xd(k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_CURR),BD%z( k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_CURR),BD%OtherSt( k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - END IF - - DO k=1,p_FAST%nBeams - CALL BD_CopyInput (BD%Input(1,k), BD%Input(2,k), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - END IF - - - - ! AeroDyn: copy states and inputs to OP array - IF ( CtrlCode == MESH_NEWCOPY ) THEN - CALL AD_CopyContState (AD%x( STATE_CURR), AD%x( STATE_PRED), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState (AD%xd(STATE_CURR), AD%xd(STATE_PRED), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState (AD%z( STATE_CURR), AD%z( STATE_PRED), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState( AD%OtherSt(STATE_CURR), AD%OtherSt(STATE_PRED), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - CALL AD_CopyInput (AD%Input(1), AD%Input(2), CtrlCode, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - -END SUBROUTINE CopyStatesInputs -!---------------------------------------------------------------------------------------------------------------------------------- -! This routine sets the rotor speed for the steady state cases. Rotor speed is a continuous state. -SUBROUTINE SteadyStateUpdateStates(CaseData, p_FAST, ED, ErrStat, ErrMsg ) -!.................................................................................................................................. - - ! Passed variables - TYPE(FAST_SS_CaseType) , INTENT(IN ) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: k ! generic loop counters - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SteadyStateUpdateStates' - - - ErrStat = ErrID_None - ErrMsg = "" - - - ED%x(STATE_CURR)%QDT(p_FAST%GearBox_Index) = caseData%RotSpeed - -END SUBROUTINE SteadyStateUpdateStates -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the preconditioned matrix, \f$ \hat{J} \f$, such that \f$ \hat{J} = S^(-1) J S \f$ with \f$S^(-1)\f$ defined -!! such that loads are scaled by p_FAST\%UJacSclFact. -SUBROUTINE Precondition_Jmat(p_FAST, y_FAST, Jmat) - - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - REAL(R8Ki), INTENT(INOUT) :: JMat(:,:) !< variable for steady-state solve (in is Jmat; out is Jmat_hat) - - - integer :: r, c, nx - - nx = y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL) - - !! Change J to J_hat: - do c=1,nx ! states are not loads: - - do r = 1,size(y_FAST%Lin%Glue%IsLoad_u) - if ( y_FAST%Lin%Glue%IsLoad_u(r) ) then - ! column is motion, but row is a load: - JMat(nx+r,c) = JMat(nx+r,c) / p_FAST%UJacSclFact - end if - end do - - end do - - - do c = 1,size(y_FAST%Lin%Glue%IsLoad_u) - - if ( y_FAST%Lin%Glue%IsLoad_u(c) ) then - - do r=1,nx ! states are not loads: - ! column is load, but row is a motion: - JMat(r,nx+c) = JMat(r,nx+c) * p_FAST%UJacSclFact - end do - - do r = 1,size(y_FAST%Lin%Glue%IsLoad_u) - if ( .not. y_FAST%Lin%Glue%IsLoad_u(r) ) then - ! column is load, but row is a motion: - JMat(nx+r,nx+c) = JMat(nx+r,nx+c) * p_FAST%UJacSclFact - end if - end do - - else - - do r = 1,size(y_FAST%Lin%Glue%IsLoad_u) - if ( y_FAST%Lin%Glue%IsLoad_u(r) ) then - ! column is motion, but row is a load: - JMat(nx+r,nx+c) = JMat(nx+r,nx+c) / p_FAST%UJacSclFact - end if - end do - - end if - - end do - - - -END SUBROUTINE Precondition_Jmat - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine basically packs the relevant parts of the modules' inputs and states for use in the steady-state solver. -SUBROUTINE Create_SS_Vector( p_FAST, y_FAST, u, AD, ED, BD, InputIndex, StateIndex, IndxOrientStart ) -!.................................................................................................................................. - TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Output variables for the glue code - REAL( R8Ki ) , INTENT(INOUT) :: u(:) !< The array of states and inputs we are trying to solve for - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - INTEGER(IntKi), INTENT(IN ) :: InputIndex - INTEGER(IntKi), INTENT(IN ) :: StateIndex - INTEGER(IntKi), optional, INTENT( OUT) :: IndxOrientStart(p_FAST%NumBl_Lin) - - ! local variables: - INTEGER :: n - INTEGER :: fieldIndx - INTEGER :: node - INTEGER :: indx, indx_last - INTEGER :: i, j, k - INTEGER :: nx, nStates - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - - - nx = y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL) ! make sure this is only STRUCTURAL states!!! - - ! structural code states: - IF ( p_FAST%CompElast == Module_ED ) THEN !bjj: QUESTION/FIXME: does this work when BD is used? Don't we have a combination of ED and BD states then??? Or are these only states on the blades? - nStates = nx - - if (StateIndex == STATE_PRED) then !this is actually the derivative of the current states instead of the value of the current states - do j = 1, nStates - indx = ED%p%DOFs%PS((j-1)*ED%p%NActvDOF_Stride + 1) - u(j) = ED%x( StateIndex )%QDT(indx) - end do - else - do j = 1, nStates - indx = ED%p%DOFs%PS((j-1)*ED%p%NActvDOF_Stride + 1) - u(j) = ED%x( StateIndex )%QT(indx) - end do - end if - - ELSEIF ( p_FAST%CompElast == Module_BD ) THEN - nStates = nx / 2 - - DO k=1,p_FAST%nBeams - indx = 1 - do i=2,BD%p(k)%node_total ! the first node isn't technically a state - indx_last = indx + BD%p(k)%dof_node - 1 - u( indx:indx_last ) = BD%x(k, StateIndex)%q( :,i) - u(nStates+indx:indx_last+nStates) = BD%x(k, StateIndex)%dqdt( :,i) - indx = indx_last+1 - end do - END DO - END IF !CompElast - - - - ! inputs: - ! we are at u_delta(nx+1 : end) - n = nx+1 - IF ( p_FAST%CompElast == Module_ED ) THEN - - do K = 1,p_FAST%NumBl_Lin !we don't need all blades here: SIZE(ED%Input(InputIndex)%BladePtLoads,1) ! Loop through all blades - - do node = 1, ED%Input(InputIndex)%BladePtLoads(k)%NNodes - do fieldIndx = 1,3 - u(n) = ED%Input(InputIndex)%BladePtLoads(k)%Force( fieldIndx,node) / p_FAST%UJacSclFact - n = n+1 - end do - end do - - do node = 1, ED%Input(InputIndex)%BladePtLoads(k)%NNodes - do fieldIndx = 1,3 - u(n) = ED%Input(InputIndex)%BladePtLoads(k)%Moment( fieldIndx,node) / p_FAST%UJacSclFact - n = n+1 - end do - end do - - end do - - ELSEIF ( p_FAST%CompElast == Module_BD ) THEN - - do K = 1,p_FAST%NumBl_Lin !we don't need all blades here: p_FAST%nBeams ! Loop through all blades - - do node = 1, BD%Input(InputIndex,k)%DistrLoad%NNodes - do fieldIndx = 1,3 - u(n) = BD%Input(InputIndex,k)%DistrLoad%Force( fieldIndx,node) / p_FAST%UJacSclFact - n = n+1 - end do - end do - - do node = 1, BD%Input(InputIndex,k)%DistrLoad%NNodes - do fieldIndx = 1,3 - u(n) = BD%Input(InputIndex,k)%DistrLoad%Moment( fieldIndx,node) / p_FAST%UJacSclFact - n = n+1 - end do - end do - - end do - END IF !CompElast - - - ! AeroDyn - DO k=1,p_FAST%NumBl_Lin !we don't need all blades here: SIZE(AD%Input(InputIndex)%BladeMotion) - do node = 1, AD%Input(InputIndex)%rotors(1)%BladeMotion(k)%NNodes - do fieldIndx = 1,3 - u(n) = AD%Input(InputIndex)%rotors(1)%BladeMotion(k)%TranslationDisp( fieldIndx,node) - n = n+1 - end do - end do - - if (PRESENT(IndxOrientStart)) IndxOrientStart(k) = n ! keep track of index for AD orientation - do node = 1, AD%Input(InputIndex)%rotors(1)%BladeMotion(k)%NNodes - u(n:n+2) = EulerExtract( AD%Input(InputIndex)%rotors(1)%BladeMotion(k)%Orientation(:,:,node) ) - n = n+3 - end do - - do node = 1, AD%Input(InputIndex)%rotors(1)%BladeMotion(k)%NNodes - do fieldIndx = 1,3 - u(n) = AD%Input(InputIndex)%rotors(1)%BladeMotion(k)%TranslationVel( fieldIndx,node) - n = n+1 - end do - end do - - END DO - - -END SUBROUTINE Create_SS_Vector - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine adds u_delta to the corresponding mesh field and scales it as appropriate -SUBROUTINE Add_SteadyState_delta( p_FAST, y_FAST, u_delta, AD, ED, BD, MeshMapData ) -!.................................................................................................................................. - TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Output variables for the glue code - REAL( R8Ki ) , INTENT(IN ) :: u_delta(:) !< The delta amount to add to the appropriate mesh fields - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(FAST_ModuleMapType) , INTENT(IN ) :: MeshMapData !< data for mapping meshes between modules - - ! local variables - INTEGER :: n - INTEGER :: fieldIndx - INTEGER :: node - INTEGER :: indx, indx_last - INTEGER :: i, j, k - INTEGER :: nx, nStates - - REAL(R8Ki) :: orientation(3,3) - REAL(R8Ki) :: rotation(3,3) - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - - - nx = y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL) - - ! structural code states: - IF ( p_FAST%CompElast == Module_ED ) THEN - nStates = nx - - do j = 1, nStates - - do k=1,ED%p%NActvDOF_Stride ! transfer these states to the other blades (this means that the original states MUST be set the same for all blades!!!) - indx = ED%p%DOFs%PS((j-1)*ED%p%NActvDOF_Stride + k) - - ED%x( STATE_CURR)%QT(indx) = ED%x( STATE_CURR)%QT( indx) + u_delta(j) - ED%x( STATE_CURR)%QDT(indx) = 0.0_R8Ki !ED%x( STATE_CURR)%QDT(indx) + u_delta(j+nStates) - end do - - end do - - - ELSEIF ( p_FAST%CompElast == Module_BD ) THEN - nStates = nx / 2 - - ! see BD's Perturb_x function: - - DO k=1,p_FAST%nBeams - indx = 1 - do i=2,BD%p(k)%node_total - indx_last = indx + BD%p(k)%dof_node - 1 - BD%x(k, STATE_CURR)%dqdt( :,i) = BD%x(k, STATE_CURR)%dqdt(:,i) + u_delta(nStates+indx:indx_last+nStates) - BD%x(k, STATE_CURR)%q( 1:3,i) = BD%x(k, STATE_CURR)%q( 1:3,i) + u_delta( indx:indx+2 ) - - ! w-m parameters - call BD_CrvMatrixR( BD%x(k, STATE_CURR)%q( 4:6,i), rotation ) ! returns the rotation matrix (transpose of DCM) that was stored in the state as a w-m parameter - orientation = transpose(rotation) - - call PerturbOrientationMatrix( Orientation, Perturbations = u_delta( indx+3:indx_last) ) - - rotation = transpose(orientation) - call BD_CrvExtractCrv( rotation, BD%x(k, STATE_CURR)%q( 4:6,i), ErrStat2, ErrMsg2 ) ! return the w-m parameters of the new orientation - - indx = indx_last+1 - end do - END DO - END IF !CompElast - - - - ! inputs: - ! we are at u_delta(nx+1 : end) - n = nx+1 - IF ( p_FAST%CompElast == Module_ED ) THEN - - do K = 1,p_FAST%NumBl_Lin !we don't need all blades here: SIZE(ED%Input(1)%BladePtLoads,1) ! Loop through all blades - - do node = 1, ED%Input(1)%BladePtLoads(k)%NNodes - do fieldIndx = 1,3 - ED%Input(1)%BladePtLoads(k)%Force( fieldIndx,node) = ED%Input(1)%BladePtLoads(k)%Force( fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - n = n+1 - end do - end do - - do node = 1, ED%Input(1)%BladePtLoads(k)%NNodes - do fieldIndx = 1,3 - ED%Input(1)%BladePtLoads(k)%Moment( fieldIndx,node) = ED%Input(1)%BladePtLoads(k)%Moment( fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - n = n+1 - end do - end do - - end do - - call SS_ED_InputSolve_OtherBlades( p_FAST, ED%Input(1), MeshMapData ) - - ELSEIF ( p_FAST%CompElast == Module_BD ) THEN - - do K = 1,p_FAST%NumBl_Lin !we don't need all blades here: p_FAST%nBeams ! Loop through all blades - - do node = 1, BD%Input(1,k)%DistrLoad%NNodes - do fieldIndx = 1,3 - BD%Input(1,k)%DistrLoad%Force( fieldIndx,node) = BD%Input(1,k)%DistrLoad%Force( fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - n = n+1 - end do - end do - - do node = 1, BD%Input(1,k)%DistrLoad%NNodes - do fieldIndx = 1,3 - BD%Input(1,k)%DistrLoad%Moment( fieldIndx,node) = BD%Input(1,k)%DistrLoad%Moment( fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - n = n+1 - end do - end do - - end do - - call SS_BD_InputSolve_OtherBlades( p_FAST, BD, MeshMapData, 1 ) ! 1 is for the input index (i.e., Input(1,Blades2-end) - - END IF !CompElast - - - ! AeroDyn - DO k=1,p_FAST%NumBl_Lin !we don't need all blades here: SIZE(AD%Input(1)%BladeMotion) - do node = 1, AD%Input(1)%rotors(1)%BladeMotion(k)%NNodes - do fieldIndx = 1,3 - AD%Input(1)%rotors(1)%BladeMotion(k)%TranslationDisp( fieldIndx,node) = AD%Input(1)%rotors(1)%BladeMotion(k)%TranslationDisp( fieldIndx,node) + u_delta(n) - n = n+1 - end do - end do - - do node = 1, AD%Input(1)%rotors(1)%BladeMotion(k)%NNodes - CALL PerturbOrientationMatrix( AD%Input(1)%rotors(1)%BladeMotion(k)%Orientation(:,:,node), Perturbations = u_delta(n:n+2) ) - n = n+3 - end do - - do node = 1, AD%Input(1)%rotors(1)%BladeMotion(k)%NNodes - AD%Input(1)%rotors(1)%BladeMotion(k)%TranslationVel( :,node) = AD%Input(1)%rotors(1)%BladeMotion(k)%TranslationVel( :,node) + u_delta(n:n+2) - - n = n+3 - end do - - END DO - - - ! now update the inputs on other blades: - CALL SS_AD_InputSolve_OtherBlades( p_FAST, AD%Input(1), MeshMapData ) ! transfer results from blade 1 to other blades - - -END SUBROUTINE Add_SteadyState_delta - -!---------------------------------------------------------------------------------------------------------------------------------- - - - - - -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE SteadyStatePrescribedInputs( caseData, p_FAST, y_FAST, m_FAST, ED, BD, AD ) - TYPE(FAST_SS_CaseType) , INTENT(IN ) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType), INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - - INTEGER(IntKi) :: k - REAL(R8Ki) :: theta(3) - - ! Set prescribed inputs for all of the modules in the steady-state solve - - - ED%Input(1)%TwrAddedMass = 0.0_ReKi - ED%Input(1)%PtfmAddedMass = 0.0_ReKi - - ED%Input(1)%TowerPtLoads%Force = 0.0 - ED%Input(1)%TowerPtLoads%Moment = 0.0 - ED%Input(1)%NacelleLoads%Force = 0.0 - ED%Input(1)%NacelleLoads%Moment = 0.0 - ED%Input(1)%HubPtLoad%Force = 0.0 ! these are from BD, but they don't affect the ED calculations for aeromaps, so set them to 0 - ED%Input(1)%HubPtLoad%Moment = 0.0 ! these are from BD, but they don't affect the ED calculations for aeromaps, so set them to 0 - - ED%Input(1)%BlPitchCom = caseData%Pitch - ED%Input(1)%YawMom = 0.0 - ED%Input(1)%HSSBrTrqC = 0.0 - ED%Input(1)%GenTrq = 0.0 - - ! BeamDyn - IF (p_FAST%CompElast == Module_BD) THEN - - !CALL ED_CalcOutput( 0.0_DbKi, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), ED%y, ED%m, ErrStat2, ErrMsg2 ) - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO k = 1,p_FAST%nBeams - BD%Input(1,k)%RootMotion%TranslationDisp = 0.0_ReKi - - theta = EulerExtract(BD%Input(1,k)%RootMotion%RefOrientation(:,:,1)) - theta(3) = -caseData%Pitch - BD%Input(1,k)%RootMotion%Orientation(:,:,1) = EulerConstruct(theta) - - BD%Input(1,k)%RootMotion%RotationVel(1,1) = caseData%RotSpeed !BD%Input(1,k)%RootMotion%RotationVel = ED%y_interp%BladeRootMotion(k)%RotationVel - BD%Input(1,k)%RootMotion%RotationVel(2:3,1) = 0.0_ReKi - - BD%Input(1,k)%RootMotion%TranslationVel(:,1) = cross_product( BD%Input(1,k)%RootMotion%RotationVel(:,1), BD%Input(1,k)%RootMotion%Position(:,1) - AD%Input(1)%rotors(1)%HubMotion%Position(:,1) ) ! ED%y_interp%BladeRootMotion(k)%TranslationVel - BD%Input(1,k)%RootMotion%TranslationAcc(:,1) = cross_product( BD%Input(1,k)%RootMotion%RotationVel(:,1), BD%Input(1,k)%RootMotion%TranslationVel(:,1) ) ! ED%y_interp%BladeRootMotion(k)%TranslationAcc - - BD%Input(1,k)%RootMotion%RotationAcc = 0.0_ReKi - END DO ! k=p_FAST%nBeams - - END IF ! BeamDyn - !BeamDyn's first "state" is not actually the state. So, do we need to do something with that????? - - - !AeroDyn - !note: i'm skipping the (unused) TowerMotion mesh - AD%Input(1)%rotors(1)%HubMotion%TranslationDisp = 0.0 - AD%Input(1)%rotors(1)%HubMotion%Orientation = AD%Input(1)%rotors(1)%HubMotion%RefOrientation - AD%Input(1)%rotors(1)%HubMotion%RotationVel(1, :) = caseData%RotSpeed - AD%Input(1)%rotors(1)%HubMotion%RotationVel(2:3,:) = 0.0_ReKi - - DO k = 1,size(AD%Input(1)%rotors(1)%BladeRootMotion,1) - theta = EulerExtract(AD%Input(1)%rotors(1)%BladeRootMotion(k)%RefOrientation(:,:,1)) - theta(3) = -caseData%Pitch - AD%Input(1)%rotors(1)%BladeRootMotion(k)%Orientation(:,:,1) = EulerConstruct(theta) !AD%Input(1)%BladeRootMotion(k)%RefOrientation - - AD%Input(1)%rotors(1)%BladeMotion(k)%RotationVel = 0.0_ReKi - !AD%Input(1)%rotors(1)%BladeMotion(k)%RotationAcc = 0.0_ReKi - AD%Input(1)%rotors(1)%BladeMotion(k)%TranslationAcc = 0.0_ReKi - END DO - - ! Set FlowField information -- AD calculates everything from the data stored in the FlowField pointer - AD%p%FlowField%Uniform%VelH(:) = caseData%WindSpeed - AD%p%FlowField%Uniform%LinShrV(:) = 0.0_ReKi - AD%p%FlowField%Uniform%AngleH(:) = 0.0_ReKi - AD%p%FlowField%PropagationDir = 0.0_ReKi - - AD%Input(1)%rotors(1)%UserProp = 0.0_ReKi - - -END SUBROUTINE SteadyStatePrescribedInputs -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE FormSteadyStateJacobian( caseData, Jmat, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, ErrStat, ErrMsg ) - TYPE(FAST_SS_CaseType) , INTENT(IN ) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case - REAL(R8Ki), INTENT(INOUT) :: Jmat(:,:) !< temporary storage space for jacobian matrix - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - CHARACTER(1024) :: LinRootName - REAL(R8Ki), ALLOCATABLE :: dUdu(:,:) !< temporary storage space for jacobian matrix - REAL(R8Ki), ALLOCATABLE :: dUdy(:,:) !< temporary storage space for jacobian matrix - REAL(R8Ki), ALLOCATABLE :: dxdotdy(:,:) !< temporary storage space for jacobian matrix - - - INTEGER(IntKi) :: Un - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FormSteadyStateJacobian' - - ErrStat = ErrID_None - ErrMsg = "" - - Jmat = 0.0_R8Ki ! initialize everything we are not spec - Un = -1 - - ! these values may get printed in the linearization output files, so we'll set them here: - y_FAST%Lin%WindSpeed = caseData%WindSpeed - y_FAST%Lin%RotSpeed = caseData%RotSpeed - y_FAST%Lin%Azimuth = 0.0 - - LinRootName = TRIM(p_FAST%OutFileRoot)//'.'//trim(num2lstr(m_FAST%Lin%NextLinTimeIndx)) - - call GetModuleJacobians( caseData, dxdotdy, p_FAST, y_FAST, m_FAST, ED, BD, AD, LinRootName, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - call GetGlueJacobians( dUdu, dUdy, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - - if (output_debugging) then - call WrLinFile_txt_Head(SS_t_global, p_FAST, y_FAST, y_FAST%Lin%Glue, LinRootName, Un, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - if (p_FAST%LinOutJac) then ! write these before they possibly get modified with LAPACK routines (in particular, dUdu) - call WrPartialMatrix( dUdu, Un, p_FAST%OutFmt, 'dUdu', UseRow=y_FAST%Lin%Glue%use_u, UseCol=y_FAST%Lin%Glue%use_u ) - call WrPartialMatrix( dUdy, Un, p_FAST%OutFmt, 'dUdy', UseRow=y_FAST%Lin%Glue%use_u, UseCol=y_FAST%Lin%Glue%use_y ) - call WrPartialMatrix( dxdotdy, Un, p_FAST%OutFmt, 'dxdotdy', UseRow=y_FAST%Lin%Glue%use_u, UseCol=y_FAST%Lin%Glue%use_y ) - end if - end if - - !----------------------------------------- - ! form J matrix - !----------------------------------------- - CALL GetBlock11(Jmat, dxdotdy, p_FAST, y_FAST, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL GetBlock12(Jmat, dxdotdy, p_FAST, y_FAST, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL GetBlock21(Jmat, dUdy, p_FAST, y_FAST, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL GetBlock22(Jmat, dUdy, dUdu, p_FAST, y_FAST, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - if (ErrStat >=AbortErrLev) then - call cleanup() - return - end if - - - - if (output_debugging) then - if (p_FAST%LinOutJac) then - ! Jacobians - call WrPartialMatrix( Jmat, Un, p_FAST%OutFmt, 'J' ) - end if - - ! finish writing the file - call WrLinFile_txt_End(Un, p_FAST, y_FAST%Lin%Glue ) - end if - - m_FAST%Lin%NextLinTimeIndx = m_FAST%Lin%NextLinTimeIndx + 1 -CONTAINS - SUBROUTINE Cleanup() - - IF (ALLOCATED(dUdu)) DEALLOCATE(dUdu) - IF (ALLOCATED(dUdy)) DEALLOCATE(dUdy) - IF (ALLOCATED(dxdotdy)) DEALLOCATE(dxdotdy) - - if (Un > 0) close(Un) - - END SUBROUTINE Cleanup - -END SUBROUTINE FormSteadyStateJacobian -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE GetModuleJacobians( caseData, dxdotdy, p_FAST, y_FAST, m_FAST, ED, BD, AD, LinRootName, ErrStat, ErrMsg ) - TYPE(FAST_SS_CaseType) , INTENT(IN ) :: caseData !< tsr, windSpeed, pitch, and rotor speed for this case - REAL(R8Ki), ALLOCATABLE ,INTENT(INOUT) :: dxdotdy(:,:) !< temporary storage space for jacobian matrix - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - CHARACTER(*), INTENT(IN ) :: LinRootName - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - REAL(R8Ki) :: OmegaSquared - INTEGER(IntKi) :: k - INTEGER(IntKi) :: i, r, c, nx - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - CHARACTER(*), PARAMETER :: RoutineName = 'GetModuleJacobians' - - ErrStat = ErrID_None - ErrMsg = "" - - !------------------------ - ! dx_dot/dy: - !------------------------ - if (.not. allocated(dxdotdy)) then - call AllocAry(dxdotdy, y_FAST%Lin%Glue%SizeLin(LIN_ContState_COL), y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), 'dxdotdy', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - dxdotdy = 0.0_R8Ki - - !..................... - ! Structure - !..................... - - y_FAST%Lin%RotSpeed = ED%y%RotSpeed - y_FAST%Lin%Azimuth = ED%y%LSSTipPxa - - !..................... - ! ElastoDyn - !..................... - if ( p_FAST%CompElast == Module_ED ) then - ! get the jacobians - call ED_JacobianPInput( SS_t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), & - ED%y, ED%m, ErrStat2, ErrMsg2, dYdu=y_FAST%Lin%Modules(Module_ED)%Instance(1)%D, dXdu=y_FAST%Lin%Modules(Module_ED)%Instance(1)%B ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - call ED_JacobianPContState( SS_t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), & - ED%y, ED%m, ErrStat2, ErrMsg2, dYdx=y_FAST%Lin%Modules(Module_ED)%Instance(1)%C, dXdx=y_FAST%Lin%Modules(Module_ED)%Instance(1)%A ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - ! get the operating point - if (output_debugging) then - call ED_GetOP( SS_t_global, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), & - ED%y, ED%m, ErrStat2, ErrMsg2, u_op=y_FAST%Lin%Modules(Module_ED)%Instance(1)%op_u, & - y_op=y_FAST%Lin%Modules(Module_ED)%Instance(1)%op_y, & - x_op=y_FAST%Lin%Modules(Module_ED)%Instance(1)%op_x, & - dx_op=y_FAST%Lin%Modules(Module_ED)%Instance(1)%op_dx ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) return - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_ED, 1, SS_t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - - !..................... - ! BeamDyn - !..................... - elseif ( p_FAST%CompElast == Module_BD ) then - - OmegaSquared = caseData%RotSpeed**2 - nx = size(dxdotdy,1)/2 - - do k=1,p_FAST%nBeams - - ! get the jacobians - call BD_JacobianPInput( SS_t_global, BD%Input(1,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), BD%OtherSt(k,STATE_CURR), & - BD%y(k), BD%m(k), ErrStat2, ErrMsg2, dYdu=y_FAST%Lin%Modules(Module_BD)%Instance(k)%D, & - dXdu=y_FAST%Lin%Modules(Module_BD)%Instance(k)%B, & - StateRel_x =y_FAST%Lin%Modules(Module_BD)%Instance(k)%StateRel_x, & - StateRel_xdot=y_FAST%Lin%Modules(Module_BD)%Instance(k)%StateRel_xdot ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - call BD_JacobianPContState( SS_t_global, BD%Input(1,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), BD%OtherSt(k,STATE_CURR), & - BD%y(k), BD%m(k), ErrStat2, ErrMsg2, dYdx=y_FAST%Lin%Modules(Module_BD)%Instance(k)%C, dXdx=y_FAST%Lin%Modules(Module_BD)%Instance(k)%A, & - StateRotation=y_FAST%Lin%Modules(Module_BD)%Instance(k)%StateRotation) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - if (output_debugging) then - ! get the operating point (for writing to file only) - call BD_GetOP( SS_t_global, BD%Input(1,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), BD%OtherSt(k,STATE_CURR), & - BD%y(k), BD%m(k), ErrStat2, ErrMsg2, u_op=y_FAST%Lin%Modules(Module_BD)%Instance(k)%op_u, y_op=y_FAST%Lin%Modules(Module_BD)%Instance(k)%op_y, & - x_op=y_FAST%Lin%Modules(Module_BD)%Instance(k)%op_x, dx_op=y_FAST%Lin%Modules(Module_BD)%Instance(k)%op_dx ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) return - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_BD, k, SS_t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - - ! calculate dxdotdy here: - ! NOTE that this implies that the FEA nodes (states) are the same as the output nodes!!!! (note that we have overlapping nodes at the element end points) - r = 1 - do i=2,BD%p(k)%node_total ! the first node isn't technically a state - c = (BD%p(k)%NdIndx(i)-1)*3 + 1 ! BldMeshNode = BD%p(k)%NdIndx(i) - - !dxdotdy(r:r+2,c:c+2) = SkewSymMat( [p_FAST%RotSpeed, 0.0_ReKi, 0.0_ReKi] ) - dxdotdy(r+2,c+1) = caseData%RotSpeed - dxdotdy(r+1,c+2) = -caseData%RotSpeed - - ! derivative - dxdotdy(r+nx+1,c+1) = -OmegaSquared - dxdotdy(r+nx+2,c+2) = -OmegaSquared - - r = r + BD%p(k)%dof_node - end do - - end do ! k - - end if !BeamDyn - - - !..................... - ! AeroDyn - !..................... - if ( p_FAST%CompAero == Module_AD ) then - ! get the jacobians - call AD_JacobianPInput( SS_t_global, AD%Input(1), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), & - AD%OtherSt(STATE_CURR), AD%y, AD%m, ErrStat2, ErrMsg2, & - dYdu=y_FAST%Lin%Modules(Module_AD)%Instance(1)%D ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - if (output_debugging) then - ! get the operating point - call AD_GetOP( SS_t_global, AD%Input(1), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), & - AD%OtherSt(STATE_CURR), AD%y, AD%m, ErrStat2, ErrMsg2, & - u_op=y_FAST%Lin%Modules(Module_AD)%Instance(1)%op_u, & - y_op=y_FAST%Lin%Modules(Module_AD)%Instance(1)%op_y ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) return - - - ! write the module matrices: - call WriteModuleLinearMatrices(Module_AD, 1, SS_t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) RETURN - end if - - end if - - ! move all module-level matrices into system-wide glue matrices: - call Glue_FormDiag( p_FAST, y_FAST, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - -END SUBROUTINE GetModuleJacobians -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE GetGlueJacobians( dUdu, dUdy, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, ErrStat, ErrMsg ) - REAL(R8Ki), ALLOCATABLE, INTENT(INOUT) :: dUdu(:,:) !< temporary storage space for jacobian matrix - REAL(R8Ki), ALLOCATABLE, INTENT(INOUT) :: dUdy(:,:) !< temporary storage space for jacobian matrix - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ThisModule - INTEGER(IntKi) :: i, j - INTEGER(IntKi) :: k - INTEGER(IntKi) :: r_start, r_end - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - CHARACTER(*), PARAMETER :: RoutineName = 'GetGlueJacobians' - - - ErrStat = ErrID_None - ErrMsg = "" - - !------------------------ - ! dU/du: - !------------------------ - if (.not. allocated(dUdu)) then - call AllocAry(dUdu, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), 'dUdu', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - dUdu = 0.0_R8Ki ! most of this matrix is zero, so we'll just initialize everything and set only the non-zero parts below - do j = 1,p_FAST%Lin_NumMods - ThisModule = p_FAST%Lin_ModOrder(j) - do k=1,size(y_FAST%Lin%Modules(ThisModule)%Instance) - r_start = y_FAST%Lin%Modules(ThisModule)%Instance(k)%LinStartIndx(LIN_INPUT_COL) - r_end = r_start + y_FAST%Lin%Modules(ThisModule)%Instance(k)%SizeLin( LIN_INPUT_COL) - 1 - do i = r_start,r_end - dUdu(i,i) = 1.0_R8Ki - end do - end do - end do - - - call LinearSS_AD_InputSolve_du( p_FAST, y_FAST, AD%Input(1), ED%y, BD, MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - IF (p_FAST%CompElast == Module_ED) THEN - call LinearSS_ED_InputSolve_du( p_FAST, y_FAST, ED%Input(1), ED%y, AD%y, AD%Input(1), MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ELSEIF (p_FAST%CompElast == Module_BD) THEN - call LinearSS_BD_InputSolve_du( p_FAST, y_FAST, AD%y, AD%Input(1), BD, MeshMapData, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF - -!!! write the module matrices: -!!!call WriteModuleLinearMatrices(Module_AD, 1, SS_t_global, p_FAST, y_FAST, LinRootName, ErrStat2, ErrMsg2) -!!! call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) -!!! if (ErrStat >=AbortErrLev) RETURN - - !------------------------ - ! dU/dy: - !------------------------ - if (.not. allocated(dUdy)) then - call AllocAry(dUdy, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), y_FAST%Lin%Glue%SizeLin(LIN_OUTPUT_COL), 'dUdy', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat>=AbortErrLev) return - end if - - dUdy = 0.0_R8Ki ! most of this matrix is zero, so we'll just initialize everything and set only the non-zero parts below - - - if (p_FAST%CompElast == Module_ED) then - call LinearSS_ED_InputSolve_dy( p_FAST, y_FAST, ED%p, ED%Input(1), ED%y, AD%y, AD%Input(1), MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - elseif (p_FAST%CompElast == MODULE_BD) then - call LinearSS_BD_InputSolve_dy( p_FAST, y_FAST, AD%y, AD%Input(1), BD, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - end if - - call LinearSS_AD_InputSolve_NoIfW_dy( p_FAST, y_FAST, AD%Input(1), ED%y, BD, MeshMapData, dUdy, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - if (output_debugging) then - ! for debugging: - call Glue_GetOP(p_FAST, y_FAST, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >=AbortErrLev) return - end if - -END SUBROUTINE GetGlueJacobians -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE GetBlock11(Jmat, dxdotdy, p_FAST, y_FAST, ErrStat, ErrMsg) - REAL(R8Ki), INTENT(INOUT) :: Jmat(:,:) !< Jacobian matrix of which we are calculating the upper left block: (1,1) - REAL(R8Ki), INTENT(IN ) :: dxdotdy(:,:) !< temporary storage space for jacobian matrix - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - REAL(R8Ki), ALLOCATABLE :: blockMat(:,:) - INTEGER(IntKi) :: r_start, c_start, r, c - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'GetBlock11' - - ErrStat = ErrID_None - ErrMsg = "" - - !--------------- - ! upper left corner of J matrix: size of A (uses only blade DOFs from the structural module) - !--------------- - call AllocAry(blockMat, y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'block matrix 1,1', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) return - - blockMat = y_FAST%Lin%Glue%A ! copy this so we don't overwrite y_FAST%Lin%Glue%A here - call LAPACK_GEMM( 'N', 'N', -1.0_R8Ki, dxdotdy, y_FAST%Lin%Glue%C, 1.0_R8Ki, blockMat, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - r_start = 1 - c_start = 1 - - ! dX/dx - dx_dot/dy * dY/dx = A - dx_dot/dy * C: - do c=1,size( blockMat, 2) - do r=1,size( blockMat, 1) - Jmat(r_start + r - 1, c_start + c - 1) = blockMat(r,c) - end do - end do - - - if (allocated (blockMat)) deallocate(blockMat) - - -END SUBROUTINE GetBlock11 -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE GetBlock12(Jmat, dxdotdy, p_FAST, y_FAST, ErrStat, ErrMsg) - REAL(R8Ki), INTENT(INOUT) :: Jmat(:,:) !< Jacobian matrix of which we are calculating the upper right block: (1,2) - REAL(R8Ki), INTENT(IN ) :: dxdotdy(:,:) !< temporary storage space for jacobian matrix - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - REAL(R8Ki), ALLOCATABLE :: blockMat(:,:) - INTEGER(IntKi) :: r_start, c_start, r, c - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'GetBlock11' - - ErrStat = ErrID_None - ErrMsg = "" - - !--------------- - ! upper right corner of J matrix: size of B (uses only blade DOFs from the structural module) - !--------------- - call AllocAry(blockMat, y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), 'block matrix 1,2', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) return - - blockMat = y_FAST%Lin%Glue%B ! copy this so we don't overwrite y_FAST%Lin%Glue%B here - call LAPACK_GEMM( 'N', 'N', -1.0_R8Ki, dxdotdy, y_FAST%Lin%Glue%D, 1.0_R8Ki, blockMat, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - r_start = 1 - c_start = y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL) + 1 - - ! dX/du - dx_dot/dy * dY/du = B - dx_dot/dy * D: - do c=1,size( blockMat, 2) - do r=1,size( blockMat, 1) - Jmat(r_start + r - 1, c_start + c - 1) = blockMat(r,c) - end do - end do - - - if (allocated (blockMat)) deallocate(blockMat) - - -END SUBROUTINE GetBlock12 -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE GetBlock21(Jmat, dUdy, p_FAST, y_FAST, ErrStat, ErrMsg) - REAL(R8Ki), INTENT(INOUT) :: Jmat(:,:) !< Jacobian matrix of which we are calculating the lower left block: (2,1) - REAL(R8Ki), INTENT(IN ) :: dUdy(:,:) !< dUdy matrix - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - REAL(R8Ki), ALLOCATABLE :: dUdx(:,:) - INTEGER(IntKi) :: r_start, c_start, r, c - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'GetBlock21' - - ErrStat = ErrID_None - ErrMsg = "" - - !--------------- - ! lower left corner of J matrix: - !--------------- - call AllocAry(dUdx, y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL), y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL), 'block matrix 2,1', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) return - - call LAPACK_GEMM( 'N', 'N', 1.0_R8Ki, dUdy, y_FAST%Lin%Glue%C, 0.0_R8Ki, dUdx, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - r_start = y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL) + 1 - c_start = 1 - - ! dU/dy * dY/dx: - do c=1,size( dUdx, 2) - do r=1,size( dUdx, 1) - Jmat(r_start + r - 1, c_start + c - 1) = dUdx(r,c) - end do - end do - - if (allocated (dUdx)) deallocate(dUdx) - -END SUBROUTINE GetBlock21 -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE GetBlock22(Jmat, dUdy, dUdu, p_FAST, y_FAST, ErrStat, ErrMsg) - REAL(R8Ki), INTENT(INOUT) :: Jmat(:,:) !< Jacobian matrix of which we are calculating the lower left block: (2,1) - REAL(R8Ki), INTENT(IN ) :: dUdy(:,:) !< dUdy matrix - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< dUdu matrix (note that it is modified on exit of this routine!) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: r_start, c_start, r, c - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'GetBlock22' - - ErrStat = ErrID_None - ErrMsg = "" - - !--------------- - ! lower right corner of J matrix: - !--------------- - call LAPACK_GEMM( 'N', 'N', 1.0_R8Ki, dUdy, y_FAST%Lin%Glue%D, 1.0_R8Ki, dUdu, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - r_start = y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL) + 1 - c_start = y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL) + 1 - - ! dU/du + dU/dy * dY/du: - do c=1,size( dUdu, 2) - do r=1,size( dUdu, 1) - Jmat(r_start + r - 1, c_start + c - 1) = dUdu(r,c) - end do - end do - - -END SUBROUTINE GetBlock22 -!---------------------------------------------------------------------------------------------------------------------------------- - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{ED}/du^{BD} and dU^{ED}/du^{AD} blocks (ED row) of dUdu. (i.e., how do changes in the AD and BD inputs affect the ED inputs?) -SUBROUTINE LinearSS_ED_InputSolve_du( p_FAST, y_FAST, u_ED, y_ED, y_AD, u_AD, MeshMapData, dUdu, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - TYPE(ED_InputType), INTENT(INOUT) :: u_ED !< ED Inputs at t - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< AD inputs (for AD-ED load linerization) - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: AD_Start_Bl ! starting index of dUdu (column) where AD blade motion inputs are located - INTEGER(IntKi) :: ED_Start_mt ! starting index of dUdu (row) where ED blade/tower or hub moment inputs are located - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'LinearSS_ED_InputSolve_du' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - !.......... - ! dU^{ED}/du^{AD} - !.......... - IF ( p_FAST%CompAero == Module_AD ) THEN - - ! ED inputs on blade from AeroDyn - IF (p_FAST%CompElast == Module_ED) THEN - - ED_Start_mt = y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - - DO K = 1,p_FAST%NumBl_Lin !we don't need all blades: SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - ED_Start_mt = ED_Start_mt + u_ED%BladePtLoads(k)%NNodes*3 ! skip the forces on this blade - AD_Start_Bl = SS_Indx_u_AD_Blade_Start(u_AD, p_FAST, y_FAST, k) - - CALL Linearize_Line2_to_Point( y_AD%rotors(1)%BladeLoad(k), u_ED%BladePtLoads(k), MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), y_ED%BladeLn2Mesh(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! AD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%AD_L_2_BDED_B(k)%dM%m_us )) then - call SetBlockMatrix( dUdu, MeshMapData%AD_L_2_BDED_B(k)%dM%m_us, ED_Start_mt, AD_Start_Bl ) - end if - - ! get starting index of next blade - ED_Start_mt = ED_Start_mt + u_ED%BladePtLoads(k)%NNodes* 3 ! skip the moments on this blade - - END DO - - END IF - - END IF - - -END SUBROUTINE LinearSS_ED_InputSolve_du -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{BD}/du^{BD} and dU^{BD}/du^{AD} blocks (BD row) of dUdu. (i.e., how do changes in the AD and BD inputs -!! affect the BD inputs?) This should be called only when p_FAST%CompElast == Module_BD. -SUBROUTINE LinearSS_BD_InputSolve_du( p_FAST, y_FAST, y_AD, u_AD, BD, MeshMapData, dUdu, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< Glue-code output parameters (for linearization) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< AD inputs (for AD-ED load linerization) - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BD data at t - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: k ! Loops through blades - INTEGER(IntKi) :: BD_Start ! starting index of dUdu (row) where BD inputs are located - INTEGER(IntKi) :: AD_Start ! starting index of dUdu (column) where AD inputs are located - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'LinearSS_BD_InputSolve_du' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - !.......... - ! dU^{BD}/du^{AD} - !.......... - IF ( p_FAST%CompAero == Module_AD ) THEN - - ! BD inputs on blade from AeroDyn - - - if (p_FAST%BD_OutputSibling) then - - DO K = 1,p_FAST%NumBl_Lin !we don't need all blades: p_FAST%nBeams ! Loop through all blades - CALL Linearize_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), BD%y(k)%BldMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO - - else - - DO K = 1,p_FAST%NumBl_Lin !we don't need all blades: p_FAST%nBeams ! Loop through all blades - !linearization for dUdy will need some matrix multiplies because of the transfer (chain rule!), but we will perform individual linearization calculations here - !!! need to transfer the BD output blade motions to nodes on a sibling of the BD blade motion mesh: - CALL Linearize_Line2_to_Line2( BD%y(k)%BldMotion, MeshMapData%y_BD_BldMotion_4Loads(k), MeshMapData%BD_L_2_BD_L(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - CALL Linearize_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), MeshMapData%y_BD_BldMotion_4Loads(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO - - end if - - - DO K = 1,p_FAST%NumBl_Lin !we don't need all blades: p_FAST%nBeams ! Loop through all blades - - ! AD is source in the mapping, so we want M_{uSm} - if (allocated(MeshMapData%AD_L_2_BDED_B(k)%dM%m_us )) then - AD_Start = SS_Indx_u_AD_Blade_Start(u_AD, p_FAST, y_FAST, k) ! index for the start of u_AD%BladeMotion(k)%translationDisp field - - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) & - + BD%Input(1,k)%DistrLoad%NNodes * 3 ! force field for each node (start with moment field) - - call SetBlockMatrix( dUdu, MeshMapData%AD_L_2_BDED_B(k)%dM%m_us, BD_Start, AD_Start ) - end if - - END DO - - END IF - -END SUBROUTINE LinearSS_BD_InputSolve_du -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{AD}/du^{AD} block of dUdu. (i.e., how do changes in the AD inputs affect the AD inputs?) -SUBROUTINE LinearSS_AD_InputSolve_du( p_FAST, y_FAST, u_AD, y_ED, BD, MeshMapData, dUdu, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< The inputs to AeroDyn14 - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< The outputs from the structural dynamics module - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BD data at t - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdu(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - INTEGER(IntKi), INTENT(INOUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT(INOUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: AD_Start_td ! starting index of dUdu (column) where AD translation displacements are located - INTEGER(IntKi) :: AD_Start_tv ! starting index of dUdu (column) where AD translation velocities are located - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'LinearSS_AD_InputSolve_du' - - - ErrStat = ErrID_None - ErrMsg = "" - - ! note that we assume this block matrix has been initialized to the identity matrix before calling this routine - - ! look at how the translational displacement gets transfered to the translational velocity: - !------------------------------------------------------------------------------------------------- - ! Set the inputs from ElastoDyn and/or BeamDyn: - !------------------------------------------------------------------------------------------------- - - ! blades - IF (p_FAST%CompElast == Module_ED ) THEN - - DO k=1,p_FAST%NumBl_Lin !we don't need all blades: size(u_AD%BladeMotion) - CALL Linearize_Line2_to_Line2( y_ED%BladeLn2Mesh(k), u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - - ELSEIF (p_FAST%CompElast == Module_BD ) THEN - - DO k=1,p_FAST%NumBl_Lin !we don't need all blades: size(u_AD%BladeMotion) - CALL Linearize_Line2_to_Line2( BD%y(k)%BldMotion, u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - - END IF - - - - DO k=1,p_FAST%NumBl_Lin !we don't need all blades: size(u_AD%BladeMotion) - - AD_Start_td = SS_Indx_u_AD_Blade_Start(u_AD, p_FAST, y_FAST, k) ! index for u_AD%BladeMotion(k)%translationDisp field - - !AD is the destination here, so we need tv_ud - if (allocated( MeshMapData%BDED_L_2_AD_L_B(k)%dM%tv_ud)) then - ! index for u_AD%BladeMotion(k+1)%translationVel field - AD_Start_tv = AD_Start_td + u_AD%rotors(1)%BladeMotion(k)%NNodes * 6 ! 2 fields (TranslationDisp and Orientation) with 3 components before translational velocity field - - call SetBlockMatrix( dUdu, MeshMapData%BDED_L_2_AD_L_B(k)%dM%tv_ud, AD_Start_tv, AD_Start_td ) - end if - - - END DO - - - -END SUBROUTINE LinearSS_AD_InputSolve_du - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{ED}/dy^{SrvD}, dU^{ED}/dy^{ED}, dU^{ED}/dy^{BD}, dU^{ED}/dy^{AD}, dU^{ED}/dy^{HD}, and dU^{ED}/dy^{MAP} -!! blocks of dUdy. (i.e., how do changes in the SrvD, ED, BD, AD, HD, and MAP outputs effect the ED inputs?) -SUBROUTINE LinearSS_ED_InputSolve_dy( p_FAST, y_FAST, p_ED, u_ED, y_ED, y_AD, u_AD, MeshMapData, dUdy, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_ParameterType), INTENT(IN ) :: p_ED !< ElastoDyn parameters - TYPE(ED_InputType), INTENT(INOUT) :: u_ED !< ED Inputs at t - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< AD inputs (for AD-ED load linerization) - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: AD_Out_Start ! starting index of dUdy (column) where particular AD fields are located - INTEGER(IntKi) :: ED_Start ! starting index of dUdy (row) where ED input fields are located - INTEGER(IntKi) :: ED_Out_Start ! starting index of dUdy (column) where ED output fields are located - CHARACTER(*), PARAMETER :: RoutineName = 'Linear_ED_InputSolve_dy' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - ! parts of dU^{ED}/dy^{AD} and dU^{ED}/dy^{ED}: - - ! ElastoDyn inputs on blade from AeroDyn and ElastoDyn - - AD_Out_Start = y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) ! start of y_AD%rotors(1)%BladeLoad(1)%Force field [2 fields (force, moment) with 3 components] - - DO K = 1,p_FAST%NumBl_Lin !we don't need all blades: SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - !!! ! This linearization was done in forming dUdu (see Linear_ED_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !CALL Linearize_Line2_to_Point( y_AD%rotors(1)%BladeLoad(k), u_ED%BladePtLoads(k), MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%BladeMotion(k), y_ED%BladeLn2Mesh(k) ) - - ! AD loads-to-ED loads transfer (dU^{ED}/dy^{AD}): - ED_Start = Indx_u_ED_Blade_Start(p_ED, u_ED, y_FAST, k) ! start of u_ED%BladePtLoads(k)%Force field - call Assemble_dUdy_Loads(y_AD%rotors(1)%BladeLoad(k), u_ED%BladePtLoads(k), MeshMapData%AD_L_2_BDED_B(k), ED_Start, AD_Out_Start, dUdy) - - ! ED translation displacement-to-ED moment transfer (dU^{ED}/dy^{ED}): - ED_Start = Indx_u_ED_Blade_Start(p_ED, u_ED, y_FAST, k) + u_ED%BladePtLoads(k)%NNodes*3 ! start of u_ED%BladePtLoads(k)%Moment field (skip the ED forces) - ED_Out_Start = SS_Indx_y_ED_Blade_Start(y_ED, p_FAST, y_FAST, k) ! start of y_ED%BladeLn2Mesh(1)%TranslationDisp field - call SetBlockMatrix( dUdy, MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD, ED_Start, ED_Out_Start ) - - AD_Out_Start = AD_Out_Start + y_AD%rotors(1)%BladeLoad(k)%NNodes*6 ! start of y_AD%rotors(1)%BladeLoad(k+1)%Force field [skip 2 fields to forces on next blade] - END DO - - -END SUBROUTINE LinearSS_ED_InputSolve_dy -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{BD}/dy^{ED}, dU^{BD}/dy^{BD}, and dU^{BD}/dy^{AD} blocks of dUdy. (i.e., how do -!! changes in the ED, BD, and AD outputs effect the BD inputs?) -SUBROUTINE LinearSS_BD_InputSolve_dy( p_FAST, y_FAST, y_AD, u_AD, BD, MeshMapData, dUdy, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< AD inputs (for AD-ED load linearization) - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BD data at t - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^(ED)/du^(AD) block - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: AD_Out_Start ! starting index of dUdy (column) where particular AD fields are located - INTEGER(IntKi) :: BD_Start ! starting index of dUdy (column) where particular BD fields are located - INTEGER(IntKi) :: BD_Out_Start ! starting index of dUdy (column) where BD output fields are located - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - REAL(R8Ki), ALLOCATABLE :: TempMat(:,:) ! temporary matrix for getting linearization matrices when BD input and output meshes are not siblings - CHARACTER(*), PARAMETER :: RoutineName = 'LinearSS_BD_InputSolve_dy' - - - ! Initialize error status - - ErrStat = ErrID_None - ErrMsg = "" - - ! parts of dU^{BD}/dy^{AD} and dU^{BD}/dy^{BD}: - - ! BeamDyn inputs on blade from AeroDyn and BeamDyn - - AD_Out_Start = y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) ! start of y_AD%rotors(1)%BladeLoad(1)%Force field [2 fields (force, moment) with 3 components] - DO K = 1,p_FAST%NumBl_Lin !we don't need all blades: p_FAST%nBeams ! Loop through all blades - - BD_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_INPUT_COL) ! start of BD%Input(1,k)%DistrLoad%Force field - - ! AD loads-to-BD loads transfer (dU^{BD}/dy^{AD}): - call Assemble_dUdy_Loads(y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), BD_Start, AD_Out_Start, dUdy) - AD_Out_Start = AD_Out_Start + y_AD%rotors(1)%BladeLoad(k)%NNodes*6 ! start of y_AD%rotors(1)%BladeLoad(k+1)%Force field [skip the moments to get to forces on next blade] - - - ! BD translation displacement-to-BD moment transfer (dU^{BD}/dy^{BD}): - BD_Start = BD_Start + BD%Input(1,k)%DistrLoad%NNodes * 3 ! start of BD%Input(1,k)%DistrLoad%Moment field (start with moment field) - BD_Out_Start = y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%LinStartIndx(LIN_OUTPUT_COL) ! start of BD%y(k)%BldMotion%TranslationDisp field - - - if (p_FAST%BD_OutputSibling) then - call SetBlockMatrix( dUdy, MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD, BD_Start, BD_Out_Start ) - else - call AllocAry(TempMat, size(MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD,1), size(MeshMapData%BD_L_2_BD_L(k)%dM%mi,2), 'TempMat', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat>=AbortErrLev) return - - ! these blocks should be small enough that we can use matmul instead of calling a LAPACK routine to do it. - TempMat = matmul(MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD,MeshMapData%BD_L_2_BD_L(k)%dM%mi) - call SetBlockMatrix( dUdy, TempMat, BD_Start, BD_Out_Start ) - - BD_Out_Start = BD_Out_Start + BD%y(k)%BldMotion%NNodes*3 ! start of BD%y(k)%BldMotion%Orientation field - TempMat = matmul(MeshMapData%AD_L_2_BDED_B(k)%dM%m_uD,MeshMapData%BD_L_2_BD_L(k)%dM%fx_p) - call SetBlockMatrix( dUdy, TempMat, BD_Start, BD_Out_Start ) - - deallocate(TempMat) ! the next blade may have a different number of nodes - end if - - END DO - - -END SUBROUTINE LinearSS_BD_InputSolve_dy -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine forms the dU^{AD}/dy^{ED} and dU^{AD}/dy^{BD} blocks of dUdy. (i.e., how do changes in the ED and BD outputs affect -!! the AD inputs?) -SUBROUTINE LinearSS_AD_InputSolve_NoIfW_dy( p_FAST, y_FAST, u_AD, y_ED, BD, MeshMapData, dUdy, ErrStat, ErrMsg ) - - ! Passed variables - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< The inputs to AeroDyn14 - TYPE(ED_OutputType), INTENT(IN) :: y_ED !< The outputs from the structural dynamics module - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BD data at t - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), INTENT(INOUT) :: dUdy(:,:) !< Jacobian matrix of which we are computing the dU^{AD}/dy^{ED} block - - INTEGER(IntKi) :: ErrStat !< Error status of the operation - CHARACTER(*) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: AD_Start ! starting index of dUdy (column) where particular AD fields are located - INTEGER(IntKi) :: ED_Out_Start! starting index of dUdy (row) where particular ED fields are located - INTEGER(IntKi) :: BD_Out_Start! starting index of dUdy (row) where particular BD fields are located - LOGICAL :: FieldMask(FIELDMASK_SIZE) -! INTEGER(IntKi) :: ErrStat2 -! CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'LinearSS_AD_InputSolve_NoIfW_dy' - - - ErrStat = ErrID_None - ErrMsg = "" - - ! Only assemble from the following source fields - FieldMask(MASKID_TRANSLATIONDISP) = .true. - FieldMask(MASKID_ORIENTATION) = .true. - FieldMask(MASKID_TRANSLATIONVEL) = .true. - FieldMask(MASKID_ROTATIONVEL) = .false. - FieldMask(MASKID_TRANSLATIONACC) = .false. - FieldMask(MASKID_ROTATIONACC) = .false. - - !------------------------------------------------------------------------------------------------- - ! Set the inputs from ElastoDyn and/or BeamDyn: - !------------------------------------------------------------------------------------------------- - !................................... - ! blades - !................................... - IF (p_FAST%CompElast == Module_ED ) THEN - - DO k=1,p_FAST%NumBl_Lin !we don't need all blades: size(y_ED%BladeLn2Mesh) - !!! ! This linearization was done in forming dUdu (see Linear_AD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!CALL Linearize_Line2_to_Line2( y_ED%BladeLn2Mesh(k), u_AD%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - - AD_Start = SS_Indx_u_AD_Blade_Start(u_AD, p_FAST, y_FAST, k) ! start of u_AD%BladeMotion(k)%TranslationDisp field - ED_Out_Start = SS_Indx_y_ED_Blade_Start(y_ED, p_FAST, y_FAST, k) ! start of y_ED%BladeLn2Mesh(k)%TranslationDisp field - CALL Assemble_dUdy_Motions(y_ED%BladeLn2Mesh(k), u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), AD_Start, ED_Out_Start, dUdy, FieldMask) - - END DO - - ELSEIF (p_FAST%CompElast == Module_BD ) THEN - !!! ! This linearization was done in forming dUdu (see Linear_AD_InputSolve_du()), so we don't need to re-calculate these matrices - !!! ! while forming dUdy, too. - !!!CALL Linearize_Line2_to_Line2( BD%y(k)%BldMotion, u_AD%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - - DO k=1,p_FAST%NumBl_Lin !we don't need all blades: p_FAST%nBeams - AD_Start = SS_Indx_u_AD_Blade_Start(u_AD, p_FAST, y_FAST, k) ! start of u_AD%BladeMotion(k)%TranslationDisp field - BD_Out_Start = y_FAST%Lin%Modules(Module_BD)%Instance(k)%LinStartIndx(LIN_OUTPUT_COL) - - CALL Assemble_dUdy_Motions(BD%y(k)%BldMotion, u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), AD_Start, BD_Out_Start, dUdy, FieldMask) - END DO - - END IF - - -END SUBROUTINE LinearSS_AD_InputSolve_NoIfW_dy -!---------------------------------------------------------------------------------------------------------------------------------- - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the u_AD%BladeMotion(k) mesh in the FAST linearization inputs. -FUNCTION SS_Indx_u_AD_Blade_Start(u_AD, p_FAST, y_FAST, BladeNum) RESULT(AD_Start) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD Inputs at t - INTEGER(IntKi), INTENT(IN ) :: BladeNum !< blade number to find index for - INTEGER :: k !< blade number loop - - INTEGER(IntKi) :: AD_Start !< starting index of this mesh in AeroDyn inputs - - AD_Start = y_FAST%Lin%Modules(Module_AD)%Instance(1)%LinStartIndx(LIN_INPUT_COL) - - do k = 1,min(BladeNum-1,p_FAST%NumBl_Lin) !size(u_AD%BladeMotion)) - AD_Start = AD_Start + u_AD%rotors(1)%BladeMotion(k)%NNodes * 9 ! 3 fields (TranslationDisp, MASKID_Orientation, TranslationVel) with 3 components - end do -END FUNCTION SS_Indx_u_AD_Blade_Start -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine returns the starting index for the y_ED%BladeLn2Mesh(BladeNum) mesh in the FAST linearization outputs. -FUNCTION SS_Indx_y_ED_Blade_Start(y_ED, p_FAST, y_FAST, BladeNum) RESULT(ED_Out_Start) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_OutputFileType), INTENT(IN ) :: y_FAST !< FAST output file data (for linearization) - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ED outputs at t - INTEGER(IntKi), INTENT(IN ) :: BladeNum !< blade number to find index for - INTEGER :: k !< blade number loop - - INTEGER(IntKi) :: ED_Out_Start !< starting index of this blade mesh in ElastoDyn outputs - - ED_Out_Start = y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%LinStartIndx(LIN_OUTPUT_COL) ! start of y_ED%BladeLn2Mesh(1)%TranslationDisp field (blade motions in y_ED) - if (allocated(y_ED%BladeLn2Mesh)) then - do k = 1,min(BladeNum-1,p_FAST%NumBl_Lin) ! we don't need all blades: SIZE(y_ED%BladeLn2Mesh,1)) ! Loop through all blades (p_ED%NumBl) - ED_Out_Start = ED_Out_Start + y_ED%BladeLn2Mesh(k)%NNodes*12 ! 4 fields with 3 components on each blade - end do - end if - -END FUNCTION SS_Indx_y_ED_Blade_Start -!---------------------------------------------------------------------------------------------------------------------------------- - - - -END MODULE FAST_SS_Solver diff --git a/modules/openfast-library/src/FAST_SS_Subs.f90 b/modules/openfast-library/src/FAST_SS_Subs.f90 deleted file mode 100644 index 9a6245cb11..0000000000 --- a/modules/openfast-library/src/FAST_SS_Subs.f90 +++ /dev/null @@ -1,335 +0,0 @@ -!********************************************************************************************************************************** -! FAST_Solver.f90, FAST_Subs.f90, FAST_Lin.f90, and FAST_Mods.f90 make up the FAST glue code in the FAST Modularization Framework. -! FAST_Prog.f90, FAST_Library.f90, FAST_Prog.c are different drivers for this code. -!.................................................................................................................................. -! LICENSING -! Copyright (C) 2013-2016 National Renewable Energy Laboratory -! -! This file is part of FAST. -! -! Licensed under the Apache License, Version 2.0 (the "License"); -! you may not use this file except in compliance with the License. -! You may obtain a copy of the License at -! -! http://www.apache.org/licenses/LICENSE-2.0 -! -! Unless required by applicable law or agreed to in writing, software -! distributed under the License is distributed on an "AS IS" BASIS, -! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -! See the License for the specific language governing permissions and -! limitations under the License. -!********************************************************************************************************************************** -MODULE FAST_SS_Subs - - USE FAST_SS_Solver - - IMPLICIT NONE - - -CONTAINS -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! DRIVER ROUTINE (runs + ends simulation) -! Put here so that we can call from either stand-alone code or from the ENFAST executable. -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -SUBROUTINE FAST_RunSteadyStateDriver( Turbine ) - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - - INTEGER(IntKi) :: ErrStat !< Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ProgName = TRIM(FAST_Ver%Name)//' Steady State' - FAST_Ver%Name = ProgName - - !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - ! initialization - !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - CALL FAST_InitializeSteadyState_T( Turbine, ErrStat, ErrMsg ) - CALL CheckError( ErrStat, ErrMsg, 'during module initialization' ) - - - !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - ! Calculate steady-state solutions: - !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - CALL FAST_SteadyState_T( Turbine, ErrStat, ErrMsg ) - CALL CheckError( ErrStat, ErrMsg, 'during steady-state solve' ) - - !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - ! Clean up and stop - !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - CALL ExitThisProgram_T( Turbine, ErrID_None, .true. ) - - CONTAINS - !............................................................................................................................... - SUBROUTINE CheckError(ErrID,Msg,SimMsg) - ! This subroutine sets the error message and level and cleans up if the error is >= AbortErrLev - !............................................................................................................................... - - ! Passed arguments - INTEGER(IntKi), INTENT(IN) :: ErrID ! The error identifier (ErrStat) - CHARACTER(*), INTENT(IN) :: Msg ! The error message (ErrMsg) - CHARACTER(*), INTENT(IN) :: SimMsg ! a message describing the location of the error - - IF ( ErrID /= ErrID_None ) THEN - CALL WrScr( NewLine//TRIM(Msg)//NewLine ) - - IF ( ErrID >= AbortErrLev ) THEN - CALL ExitThisProgram_T( Turbine, ErrID, .true., SimMsg ) - END IF - - END IF - - END SUBROUTINE CheckError -END SUBROUTINE FAST_RunSteadyStateDriver -!---------------------------------------------------------------------------------------------------------------------------------- - -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! INITIALIZATION ROUTINES -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -SUBROUTINE FAST_InitializeSteadyState_T( Turbine, ErrStat, ErrMsg ) - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - LOGICAL, PARAMETER :: CompAeroMaps = .true. - REAL(DbKi), PARAMETER :: t_initial = 0.0_DbKi - - Turbine%TurbID = 1 - - CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, CompAeroMaps, ErrStat, ErrMsg ) - if (ErrStat >= AbortErrLev) return - - ! If BeamDyn blades are being used, return error - if (Turbine%p_FAST%CompElast == Module_BD) then - ErrStat = ErrID_Fatal - ErrMsg = "AeroMap does not currently work with BeamDyn blades, support will be added in a future version of OpenFAST" - return - end if - - call InitFlowField() - - CALL SimStatus_FirstTime( Turbine%m_FAST%TiLstPrn, Turbine%m_FAST%PrevClockTime, Turbine%m_FAST%SimStrtTime, Turbine%m_FAST%UsrTime2, & - t_initial, Turbine%p_FAST%TMax, Turbine%p_FAST%TDesc, useCases=Turbine%p_FAST%CompAeroMaps) - - -contains - !> AD15 now directly accesses FlowField data from IfW. Since we don't use IfW, we need to manually set the FlowField data - !! NOTE: we deallocate(AD%p%FlowField) at the end of the simulation if CompAeroMaps is true - subroutine InitFlowField() - use InflowWind_IO, only: IfW_SteadyWind_Init - use InflowWind_IO_Types, only: InflowWind_IO_DestroySteady_InitInputType, InflowWind_IO_DestroyWindFileDat - type(Steady_InitInputType) :: InitInp - integer(IntKi) :: SumFileUnit = -1 - type(WindFileDat) :: WFileDat ! throw away data returned form init - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - - allocate(Turbine%AD%p%FlowField) - Turbine%AD%p%FlowField%FieldType = 1 ! Steady wind, init below. - InitInp%RefHt = 100.0_ReKi ! Any value will do here. No exponent, so this doesn't matter - InitInp%HWindSpeed = 8.0_ReKi ! This gets overwritten later before used - InitInp%PLExp = 0.0_ReKi ! no shear used - call IfW_SteadyWind_Init(InitInp, SumFileUnit, Turbine%AD%p%FlowField%Uniform, WFileDat, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'FAST_InitializeSteadyState_T:InitFlowField') - if (ErrStat >= AbortErrLev) deallocate(Turbine%AD%p%FlowField) - - call InflowWind_IO_DestroySteady_InitInputType(InitInp, ErrStat2, ErrMsg2) ! ignore errors here because I'm lazy - call InflowWind_IO_DestroyWindFileDat(WFileDat, ErrStat2, ErrMsg2) ! ignore errors here because I'm lazy - end subroutine -END SUBROUTINE FAST_InitializeSteadyState_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FAST_Solution for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_SteadyState_T( Turbine, ErrStat, ErrMsg ) - - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CALL FAST_SteadyState( Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%BD, Turbine%AD, Turbine%MeshMapData, ErrStat, ErrMsg ) - -END SUBROUTINE FAST_SteadyState_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine takes data from n_t_global and gets values at n_t_global + 1 -SUBROUTINE FAST_SteadyState(p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: n_case !< loop counter - REAL(DbKi) :: n_global - REAL(ReKi), ALLOCATABLE :: UnusedAry(:) - REAL(R8Ki), ALLOCATABLE :: Jmat(:,:) - TYPE(FAST_SS_CaseType) :: caseData ! tsr, windSpeed, pitch, and rotor speed for this case - TYPE(FAST_SS_CaseType) :: caseData_try2 ! tsr, windSpeed, pitch, and rotor speed for this case (to try a different operating point first) - - INTEGER(IntKi) :: NStatus - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - TYPE(IceD_OutputType), ALLOCATABLE :: y_IceD (:) !< IceDyn outputs (WriteOutput values are subset) - CHARACTER(MaxWrScrLen), PARAMETER :: BlankLine = " " - - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_SteadyState' - - ErrStat = ErrID_None - ErrMsg = "" - - CALL InitSSVariables(p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, JMat, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - if (ErrStat >= AbortErrLev) then - call Cleanup() - return - end if - - ! how often do we inform the user which case we are on? - NStatus = min( 100, p_FAST%NumSSCases/100 + 1) ! at least 100 every 100 cases or 100 times per simulation - call WrScr(NewLine) - - DO n_case = 1, p_FAST%NumSSCases - - if (mod(n_case,NStatus) == 0 .or. n_case==p_FAST%NumSSCases .or. n_case==1) then - call WrOver( ' Case '//trim(num2lstr(n_case))//' of '//trim(num2lstr(p_FAST%NumSSCases)) ) - end if - - - if (p_FAST%WindSpeedOrTSR==1) then - caseData%windSpeed = p_FAST%WS_TSR(n_case) - caseData%tsr = p_FAST%RotSpeed(n_case) * AD%p%rotors(1)%BEMT%rTipFixMax / caseData%windSpeed - else - caseData%tsr = p_FAST%WS_TSR(n_case) - caseData%windSpeed = p_FAST%RotSpeed(n_case) * AD%p%rotors(1)%BEMT%rTipFixMax / caseData%tsr - end if - caseData%pitch = p_FAST%Pitch(n_case) - caseData%RotSpeed = p_FAST%RotSpeed(n_case) - - ! Call steady-state solve for this pitch and rotor speed - call SolveSteadyState(caseData, Jmat, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, ErrStat2, ErrMsg2) - - if (ErrStat2 >= ErrID_Severe) then - ! we didn't converge; let's try a different operating point and see if that helps: - caseData_try2%RotSpeed = caseData%RotSpeed - caseData_try2%Pitch = caseData%Pitch * 0.5_ReKi - caseData_try2%TSR = caseData%TSR * 0.5_ReKi - caseData_try2%WindSpeed = caseData%WindSpeed * 0.5_ReKi - - call WrScr('Retrying case '//trim(num2lstr(n_case))//', first trying to get a better initial guess. Average error is '// & - trim(num2lstr(y_FAST%DriverWriteOutput(SS_Indx_Err)))//'.') - call SolveSteadyState(caseData_try2, Jmat, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, ErrStat2, ErrMsg2) - - ! if that worked, try the real case again: - if (ErrStat2 < AbortErrLev) then - call SolveSteadyState(caseData, Jmat, p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, ErrStat2, ErrMsg2) - call WrOver(BlankLine) - end if - - end if - - if (ErrStat2 > ErrID_None) then - ErrMsg2 = trim(ErrMsg2)//" case "//trim(num2lstr(n_case))//& - ' (tsr='//trim(num2lstr(caseData%tsr))//& - ', wind speed='//trim(num2lstr(caseData%windSpeed))//' m/s'//& - ', pitch='//trim(num2lstr(caseData%pitch*R2D))//' deg'//& - ', rotor speed='//trim(num2lstr(caseData%RotSpeed*RPS2RPM))//' rpm)' - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end if - - !---------------------------------------------------------------------------------------- - ! Write results to file - !---------------------------------------------------------------------------------------- - n_global = real(n_case, DbKi) ! n_global is double-precision so that we can reuse existing code. - - CALL WrOutputLine( n_global, p_FAST, y_FAST, UnusedAry, UnusedAry, ED%y%WriteOutput, UnusedAry, & - AD%y, UnusedAry, UnusedAry, UnusedAry, UnusedAry, UnusedAry, UnusedAry, UnusedAry, & - UnusedAry, UnusedAry, UnusedAry, UnusedAry, y_IceD, BD%y, ErrStat2, ErrMsg2 ) - - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) then - call Cleanup() - return - end if - - - ! in case we have a lot of error messages, let's print the non fatal ones here: - if (ErrStat > ErrID_None) then - call WrScr(trim(ErrMsg)) - call WrScr("") - ErrStat = ErrID_None - ErrMsg = "" - end if - - END DO - -CONTAINS - SUBROUTINE Cleanup() - if (allocated(Jmat)) deallocate(Jmat) - END SUBROUTINE Cleanup - - -END SUBROUTINE FAST_SteadyState -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE InitSSVariables(p_FAST, y_FAST, m_FAST, ED, BD, AD, MeshMapData, JMat, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - REAL(R8Ki), ALLOCATABLE , INTENT(INOUT) :: Jmat(:,:) !< Matrix for storing Jacobian - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: NumBlades !< number of blades - - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - - CHARACTER(*), PARAMETER :: RoutineName = 'SS_InitVariables' - - ErrStat = ErrID_None - ErrMsg = "" - - NumBlades = size(AD%y%rotors(1)%BladeLoad) - - - call AllocAry(Jmat, p_FAST%SizeJac_Opt1(1), p_FAST%SizeJac_Opt1(1), 'Jmat', ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - CALL AllocAry( MeshMapData%Jacobian_pivot, p_FAST%SizeJac_Opt1(1), 'Pivot array for Jacobian LU decomposition', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - !CALL AllocAry( MeshMapData%HubOrient, 3, 3, NumBlades, 'Hub orientation matrix', ErrStat2, ErrMsg2 ) - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - if (ErrStat >= AbortErrLev) return - - - CALL CopyStatesInputs( p_FAST, ED, BD, AD, ErrStat2, ErrMsg2, MESH_NEWCOPY ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - -END SUBROUTINE InitSSVariables -!---------------------------------------------------------------------------------------------------------------------------------- -END MODULE FAST_SS_Subs -!---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 4d0ee9910f..dd5b1a672e 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -1,6461 +1,2374 @@ -!********************************************************************************************************************************** -! FAST_Solver.f90, FAST_Subs.f90, FAST_Lin.f90, and FAST_Mods.f90 make up the FAST glue code in the FAST Modularization Framework. -! FAST_Prog.f90, FAST_Library.f90, FAST_Prog.c are different drivers for this code. -!.................................................................................................................................. -! LICENSING -! Copyright (C) 2013-2016 National Renewable Energy Laboratory -! -! This file is part of FAST. -! -! Licensed under the Apache License, Version 2.0 (the "License"); -! you may not use this file except in compliance with the License. -! You may obtain a copy of the License at -! -! http://www.apache.org/licenses/LICENSE-2.0 -! -! Unless required by applicable law or agreed to in writing, software -! distributed under the License is distributed on an "AS IS" BASIS, -! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -! See the License for the specific language governing permissions and -! limitations under the License. -!********************************************************************************************************************************** -!> This module contains the routines used by FAST to solve input-output equations and to advance states. -MODULE FAST_Solver - - USE NWTC_Library - USE NWTC_LAPACK - - USE FAST_ModTypes - - USE AeroDyn - USE AeroDisk - USE ExtLoads - USE InflowWind - USE ElastoDyn - USE SED - USE BeamDyn - USE FEAMooring - USE MoorDyn - USE MAP - USE OrcaFlexInterface - USE SeaState - USE HydroDyn - USE IceDyn - USE IceFloe - USE ServoDyn - USE SubDyn - USE ExternalInflow - Use ExtPtfm_MCKF - - - IMPLICIT NONE - -CONTAINS -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for BD--using the Option 2 solve method; currently the only inputs solved in this routine -!! are the blade distributed loads from AD15; other inputs are solved in option 1. -SUBROUTINE BD_InputSolve( p_FAST, BD, y_AD, u_AD, m_ExtLd, y_ExtLd, u_ExtLd, p_ExtLd, y_ED, y_SrvD, u_SrvD, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BD Inputs at t - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD inputs (for AD-BD load transfer) - TYPE(ExtLd_MiscVarType), INTENT(INOUT) :: m_ExtLd !< External Misc Var - TYPE(ExtLd_OutputType), INTENT(INOUT) :: y_ExtLd !< External Load outputs - TYPE(ExtLd_InputType), INTENT(IN ) :: u_ExtLd !< External Load inputs (for ExtL-BD load transfer) - TYPE(ExtLd_ParameterType), INTENT(IN ) :: p_ExtLd !< External Load parameters - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs - TYPE(SrvD_OutputType), INTENT(IN ) :: y_SrvD !< ServoDyn outputs - TYPE(SrvD_InputType), INTENT(IN ) :: u_SrvD !< ServoDyn Inputs (for SrvD-BD load transfer) - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - REAL(R8Ki) :: omega_c(3) ! variable for adding damping - REAL(R8Ki) :: r(3) ! variable for adding damping - REAL(R8Ki) :: r_hub(3) ! variable for adding damping - REAL(R8Ki) :: Vrot(3) ! variable for adding damping - - INTEGER(IntKi) :: I ! Loops through blade nodes - INTEGER(IntKi) :: J ! Loops through SrvD instances - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'BD_InputSolve' - - - ! Initialize error status +module FAST_Solver + +use FAST_Types +use NWTC_LAPACK +use FAST_ModTypes +use FAST_Mapping +use FAST_ModGlue +use FAST_Funcs +use ElastoDyn +use BeamDyn +use SubDyn +use AeroDyn +use ServoDyn + +implicit none + +private + +public :: FAST_SolverInit, & + FAST_SolverStep0, & + FAST_SolverStep, & + FAST_CalcOutputsAndSolveForInputs + +! Debugging +logical, parameter :: DebugSolver = .false. +integer(IntKi) :: DebugUn = -1 +character(*), parameter :: DebugFile = 'solver.dbg' +logical, parameter :: DebugJacobian = .false. +integer(IntKi) :: MatrixUn = -1 +logical, parameter :: FiniteDifferenceJacobian = .false. + +contains + +subroutine FAST_SolverInit(p_FAST, p, m, GlueModData, GlueModMaps, Turbine, ErrStat, ErrMsg) + type(FAST_ParameterType), intent(in) :: p_FAST !< FAST parameters + type(Glue_TCParam), intent(inout) :: p !< Glue Parameters + type(Glue_TCMisc), intent(out) :: m !< Glue miscellaneous variables + type(ModDataType), intent(inout) :: GlueModData(:) !< Glue module data + type(MappingType), intent(inout) :: GlueModMaps(:) !< Module mappings + type(FAST_TurbineType), intent(inout) :: Turbine !< all data for one instance of a turbine + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'Solver_Init' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, k + integer(IntKi), allocatable :: modIDs(:), modInds(:), iMod(:) + logical :: SrvDOpt1 + + !---------------------------------------------------------------------------- + ! Initialize data in TC structure + !---------------------------------------------------------------------------- + + ! Module coupling method + p%ModCoupling = p_FAST%ModCoupling + + ! Generalized alpha damping coefficient + p%RhoInf = p_FAST%RhoInf + + ! Max number of convergence iterations + p%MaxConvIter = p_FAST%MaxConvIter + + ! Convergence tolerance + p%ConvTol = p_FAST%ConvTol + + ! Solver time step + p%h = p_FAST%DT + + ! If time between Jacobian updates is less than the time step + if (p_FAST%DT_UJac < p_FAST%DT) then + p%NStep_UJac = huge(1_IntKi) ! Disable step based Jacobian updates + p%NIter_UJac = ceiling(p_FAST%DT_UJac/p_FAST%DT*real(p%MaxConvIter, R8Ki), IntKi) + else if (p_FAST%DT_UJac/p_FAST%DT + 1 < huge(1_IntKi)) then + p%NStep_UJac = ceiling(p_FAST%DT_UJac/p_FAST%DT, IntKi) + p%NIter_UJac = huge(1_IntKi) ! Disable iteration based Jacobian updates + else + p%NStep_UJac = huge(1_IntKi) ! Disable step based Jacobian updates + p%NIter_UJac = huge(1_IntKi) ! Disable iteration based Jacobian updates + end if + + ! Jacobian conditioning + p%Scale_UJac = p_FAST%UJacSclFact + + ! Generalized alpha integration constants + p%AlphaM = (2.0_R8Ki*p%RhoInf - 1.0_R8Ki)/(p%RhoInf + 1.0_R8Ki) + p%AlphaF = p%RhoInf/(p%RhoInf + 1.0_R8Ki) + p%Gamma = 0.5_R8Ki - p%AlphaM + p%AlphaF + p%Beta = (1.0_R8Ki - p%AlphaM + p%AlphaF)**2.0_R8Ki/4.0_R8Ki + + ! Precalculate some coefficients + p%BetaPrime = p%h*p%h*p%Beta*(1.0_R8Ki - p%AlphaF)/(1.0_R8Ki - p%AlphaM) + p%GammaPrime = p%h*p%Gamma*(1.0_R8Ki - p%AlphaF)/(1.0_R8Ki - p%AlphaM) + + ! ServoDyn is an Option 1 module if it has structural controllers + SrvDOpt1 = .false. + do i = 1, size(Turbine%SrvD%p) + SrvDOpt1 = SrvDOpt1 .or. & + (Turbine%SrvD%p(i)%NumBStC > 0) .or. & + (Turbine%SrvD%p(i)%NumTStC > 0) .or. & + (Turbine%SrvD%p(i)%NumSStC > 0) .or. & + (Turbine%SrvD%p(i)%NumNStC > 0) + end do + + + !---------------------------------------------------------------------------- + ! Module ordering for solve + !---------------------------------------------------------------------------- + + ! Create array of indices for Mods array + modInds = [(i, i=1, size(GlueModData))] + + ! Get array of module IDs + modIDs = [(GlueModData(i)%ID, i=1, size(GlueModData))] + + ! Indices of all modules in Step 0 initialization order (SrvD inputs) + p%iModInit = [pack(modInds, ModIDs == Module_SED), & + pack(modInds, ModIDs == Module_ED), & + pack(modInds, ModIDs == Module_BD), & + pack(modInds, ModIDs == Module_SD), & + pack(modInds, ModIDs == Module_ExtPtfm), & + pack(modInds, ModIDs == Module_IfW), & + pack(modInds, ModIDs == Module_ExtLd)] + + ! Indices of tight coupling modules + p%iModTC = [pack(modInds, ModIDs == Module_ED .and. p%ModCoupling /= LooseCoupling), & + pack(modInds, ModIDs == Module_BD .and. p%ModCoupling /= LooseCoupling), & + pack(modInds, ModIDs == Module_SD .and. p%ModCoupling /= LooseCoupling), & + pack(modInds, ModIDs == Module_ExtPtfm .and. p%ModCoupling /= LooseCoupling)] + + ! Indices of Option 1 modules + p%iModOpt1 = [pack(modInds, ModIDs == Module_SrvD .and. SrvDOpt1), & + pack(modInds, ModIDs == Module_ED .and. p%ModCoupling == LooseCoupling), & + pack(modInds, ModIDs == Module_BD .and. p%ModCoupling == LooseCoupling), & + pack(modInds, ModIDs == Module_SD .and. p%ModCoupling == LooseCoupling), & + pack(modInds, ModIDs == Module_ExtPtfm .and. p%ModCoupling == LooseCoupling), & + pack(modInds, ModIDs == Module_SED), & + pack(modInds, ModIDs == Module_AD .and. p_FAST%MHK /= MHK_None), & + pack(modInds, ModIDs == Module_HD), & + pack(modInds, ModIDs == Module_Orca), & + pack(modInds, ModIDs == Module_MD)] + + ! Indices of Option 2 modules + p%iModOpt2 = [pack(modInds, ModIDs == Module_SrvD), & + pack(modInds, ModIDs == Module_SED), & + pack(modInds, ModIDs == Module_ED), & + pack(modInds, ModIDs == Module_BD), & + pack(modInds, ModIDs == Module_SD), & + pack(modInds, ModIDs == Module_ExtPtfm), & + pack(modInds, ModIDs == Module_IfW), & + pack(modInds, ModIDs == Module_SeaSt), & + pack(modInds, ModIDs == Module_AD .and. p_FAST%MHK == MHK_None), & + pack(modInds, ModIDs == Module_ADsk), & + pack(modInds, ModIDs == Module_ExtLd), & + pack(modInds, ModIDs == Module_FEAM), & + pack(modInds, ModIDs == Module_IceD), & + pack(modInds, ModIDs == Module_IceF), & + pack(modInds, ModIDs == Module_MAP), & + pack(modInds, ModIDs == Module_SlD)] + + ! Indices of modules to perform InputSolves after the Option 1 solve + p%iModPost = [pack(modInds, ModIDs == Module_SrvD), & + pack(modInds, ModIDs == Module_ExtInfw)] + + !---------------------------------------------------------------------------- + ! Set module categories + !---------------------------------------------------------------------------- + + ! Tight coupling modules + do i = 1, size(p%iModTC) + GlueModData(p%iModTC(i))%Category = ior(GlueModData(p%iModTC(i))%Category, MC_Tight) + end do + + ! Option 1 modules + do i = 1, size(p%iModOpt1) + GlueModData(p%iModOpt1(i))%Category = ior(GlueModData(p%iModOpt1(i))%Category, MC_Option1) + end do + + ! Option 2 modules + do i = 1, size(p%iModOpt2) + GlueModData(p%iModOpt2(i))%Category = ior(GlueModData(p%iModOpt2(i))%Category, MC_Option2) + end do + + ! Post-solve modules + do i = 1, size(p%iModPost) + GlueModData(p%iModPost(i))%Category = ior(GlueModData(p%iModPost(i))%Category, MC_Post) + end do + + !---------------------------------------------------------------------------- + ! Check module attributes based on category + !---------------------------------------------------------------------------- + + ! Loop through tight-coupling modules + do i = 1, size(p%iModTC) + if (GlueModData(i)%SubSteps > 1) then + call WrScr('Info: tightly coupled module "'//trim(GlueModData(i)%Abbr)//'" requested '// & + 'time step of '//trim(Num2Lstr(GlueModData(i)%DT))//', which is different than '// & + 'glue-code time step of '//trim(Num2Lstr(p%h))//'. Sub-stepping disabled for this module.') + end if + end do + + !---------------------------------------------------------------------------- + ! Set solve flags and combine relevant modules into Solver module + !---------------------------------------------------------------------------- + + ! Set VF_Solve flag on Jacobian variables use by the tight coupling solver + call SetVarSolveFlags() + + ! Combination of TC and Option 1 module indices + iMod = [p%iModTC, p%iModOpt1] + + ! Build tight coupling module using solve variables from TC and Option 1 modules + call ModGlue_CombineModules(m%Mod, GlueModData, GlueModMaps, iMod, & + VF_Solve, .true., ErrStat2, ErrMsg2, Name='Solver') + if (Failed()) return + + !---------------------------------------------------------------------------- + ! Recalculate glue variable locations to simplify Jacobian construction + !---------------------------------------------------------------------------- + + call CalcVarGlobalIndices(p, m%Mod, p%NumQ, p%NumJ, ErrStat2, ErrMsg2) + if (Failed()) return + p%NumU = p%iJU(2) - p%iJU(2) + 1 + p%NumUT = p%iUT(2) - p%iUT(1) + 1 + + if (DebugJacobian) then + write (*, *) "Solver Jacobian States:" + do j = 1, size(m%Mod%Vars%x) + do k = 1, m%Mod%Vars%x(j)%Num + write (*, *) m%Mod%Vars%x(j)%iLoc(1) + k - 1, trim(m%Mod%Vars%x(j)%LinNames(k)) + end do + end do + + write (*, *) "Solver Jacobian Inputs:" + do j = 1, size(m%Mod%Vars%u) + do k = 1, m%Mod%Vars%u(j)%Num + write (*, *) m%Mod%Vars%u(j)%iLoc(1) + k - 1, trim(m%Mod%Vars%u(j)%LinNames(k)) + end do + end do + + write (*, *) "Solver Jacobian Outputs:" + do j = 1, size(m%Mod%Vars%y) + do k = 1, m%Mod%Vars%y(j)%Num + write (*, *) m%Mod%Vars%y(j)%iLoc(1) + k - 1, trim(m%Mod%Vars%y(j)%LinNames(k)) + end do + end do + end if + + !---------------------------------------------------------------------------- + ! Initialize MiscVars + !---------------------------------------------------------------------------- + + ! Set flag to warn about convergence errors + m%ConvWarn = .true. + + ! Calculated inputs array + call AllocAry(m%uCalc, m%Mod%Vars%Nu, "m%uCalc", ErrStat2, ErrMsg2); if (Failed()) return + + ! Generalized alpha state arrays + call AllocAry(m%StateCurr%q_prev, p%NumQ, "m%StateCurr%q_prev", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%StateCurr%x, p%NumQ, "m%StateCurr%q_delta", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%StateCurr%q, p%NumQ, "m%StateCurr%q", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%StateCurr%v, p%NumQ, "m%StateCurr%v", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%StateCurr%vd, p%NumQ, "m%StateCurr%vd", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%StateCurr%a, p%NumQ, "m%StateCurr%a", ErrStat2, ErrMsg2); if (Failed()) return + m%StateCurr%q_prev = 0.0_R8Ki + m%StateCurr%x = 0.0_R8Ki + m%StateCurr%q = 0.0_R8Ki + m%StateCurr%v = 0.0_R8Ki + m%StateCurr%vd = 0.0_R8Ki + m%StateCurr%a = 0.0_R8Ki + + ! Allocate Jacobian matrix, RHS/X matrix, Pivot array + call AllocAry(m%J11, p%NumQ, p%NumQ, "m%J11", ErrStat, ErrMsg); if (Failed()) return + call AllocAry(m%J12, p%NumQ, p%NumUT, "m%J12", ErrStat, ErrMsg); if (Failed()) return + call AllocAry(m%J21, p%NumUT, p%NumQ, "m%J21", ErrStat, ErrMsg); if (Failed()) return + call AllocAry(m%J22, p%NumU, p%NumU, "m%J22", ErrStat, ErrMsg); if (Failed()) return + call AllocAry(m%Tan, p%NumQ, p%NumQ, "m%Tan", ErrStat, ErrMsg); if (Failed()) return + call AllocAry(m%Mod%Lin%J, p%NumJ, p%NumJ, "m%J", ErrStat, ErrMsg); if (Failed()) return + call AllocAry(m%XB, p%NumJ, 1, "m%XB", ErrStat, ErrMsg); if (Failed()) return + call AllocAry(m%IPIV, p%NumJ, "m%IPIV", ErrStat, ErrMsg); if (Failed()) return + m%Mod%Lin%J = 0.0_R8Ki + if (p%NumQ > 0) then + call Eye2D(m%Tan, ErrStat2, ErrMsg2); if (Failed()) return + end if + + ! Allocate input-output solve Jacobian matrix and RHS vector + call AllocAry(m%IO_Jac, m%Mod%Vars%Nu, m%Mod%Vars%Nu, 'IO_Jac', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%IO_X, m%Mod%Vars%Nu, 1, 'IO_X', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(m%IO_R, m%Mod%Vars%Nu, 'IO_R', ErrStat2, ErrMsg2); if (Failed()) return + + !---------------------------------------------------------------------------- + ! Write debug info to file + !---------------------------------------------------------------------------- + + if (DebugSolver) then + call GetNewUnit(DebugUn, ErrStat2, ErrMsg2); if (Failed()) return + call OpenFOutFile(DebugUn, DebugFile, ErrStat2, ErrMsg2); if (Failed()) return + call Solver_Init_Debug(p, m, GlueModData, GlueModMaps) + end if + +contains + + ! SetVarSolveFlags adds the VF_Solve flags to variables in Option 1 modules + ! which need to be in the tight couping solver Jacobian. + subroutine SetVarSolveFlags() + logical :: SrcModTC, SrcModO1 + logical :: DstModTC, DstModO1 + logical :: DstForce, DstMoment + + ! Loop through tight coupling modules and add VF_Solve flag to continuous state variables + do i = 1, size(p%iModTC) + associate (ModData => GlueModData(p%iModTC(i))) + do j = 1, size(ModData%Vars%x) + call MV_SetFlags(ModData%Vars%x(j), VF_Solve) + end do + end associate + end do + + ! dUdu Motions + ! VarsDst%u, VarDst(FieldTransDisp), VarsDst%u, VarDst(FieldTransVel) + ! VarsDst%u, VarDst(FieldTransDisp), VarsDst%u, VarDst(FieldTransAcc) + + ! dUdu Loads + ! VarsSrc%u, VarSrcDisp(FieldTransDisp), VarsDst%u, VarDst(FieldMoment) + + ! dUdy Loads + ! VarsSrc%y, VarSrc(FieldForce), VarsDst%u, VarDst(FieldForce) + ! VarsSrc%y, VarSrc(FieldMoment), VarsDst%u, VarDst(FieldMoment) + ! VarsSrc%y, VarSrc(FieldForce), VarsDst%u, VarDst(FieldMoment) + ! VarsDst%y, VarDstDisp(FieldTransDisp), VarsDst%u, VarDst(FieldMoment) + ! VarsDst%y, VarDstDisp(FieldOrientation), VarsDst%u, VarDst(FieldMoment) + + ! dUdy Motions + ! VarsSrc%y, VarSrc(FieldTransDisp), VarsDst%u, VarDst(FieldTransDisp) + ! VarsSrc%y, VarSrc(FieldOrientation), VarsDst%u, VarDst(FieldTransDisp) + ! VarsSrc%y, VarSrc(FieldOrientation), VarsDst%u, VarDst(FieldOrientation) + ! VarsSrc%y, VarSrc(FieldTransVel), VarsDst%u, VarDst(FieldTransVel) + ! VarsSrc%y, VarSrc(FieldAngularVel), VarsDst%u, VarDst(FieldTransVel) + ! VarsSrc%y, VarSrc(FieldTransDisp), VarsDst%u, VarDst(FieldTransVel) + ! VarsSrc%y, VarSrc(FieldAngularVel), VarsDst%u, VarDst(FieldAngularVel) + ! VarsSrc%y, VarSrc(FieldTransDisp), VarsDst%u, VarDst(FieldTransAcc) + ! VarsSrc%y, VarSrc(FieldTransAcc), VarsDst%u, VarDst(FieldTransAcc) + ! VarsSrc%y, VarSrc(FieldAngularVel), VarsDst%u, VarDst(FieldTransAcc) + ! VarsSrc%y, VarSrc(FieldAngularAcc), VarsDst%u, VarDst(FieldTransAcc) + ! VarsSrc%y, VarSrc(FieldAngularAcc), VarsDst%u, VarDst(FieldAngularAcc) + + ! Loop through module mappings + do j = 1, size(GlueModMaps) + associate (Mapping => GlueModMaps(j), & + SrcMod => GlueModData(GlueModMaps(j)%iModSrc), & + DstMod => GlueModData(GlueModMaps(j)%iModDst)) + + ! Determine if source and destination modules are in tight coupling or Option 1 + SrcModTC = iand(SrcMod%Category, MC_Tight) /= 0 + SrcModO1 = iand(SrcMod%Category, MC_Option1) /= 0 + DstModTC = iand(DstMod%Category, MC_Tight) /= 0 + DstModO1 = iand(DstMod%Category, MC_Option1) /= 0 + + ! If source or destination module is not in TC or Option 1, continue + if (.not. (SrcModTC .or. SrcModO1)) cycle + if (.not. (DstModTC .or. DstModO1)) cycle + + ! Select based on mapping type + select case (Mapping%MapType) + case (Map_MotionMesh) + + ! If source and destination modules are tightly coupled + if (SrcModTC .and. DstModTC) then + + ! Add flag for source displacement, velocity, and acceleration + do i = 1, size(SrcMod%Vars%y) + associate (Var => SrcMod%Vars%y(i)) + if (MV_EqualDL(Mapping%SrcDL, Var%DL)) then + call MV_SetFlags(Var, VF_Solve) + end if + end associate + end do + + ! Add flag for destination displacement, velocity, and acceleration + do i = 1, size(DstMod%Vars%u) + associate (Var => DstMod%Vars%u(i)) + if (MV_EqualDL(Mapping%DstDL, Var%DL)) then + call MV_SetFlags(Var, VF_Solve) + end if + end associate + end do + + else + + ! Add flag for destination acceleration and translation disp for dUdu + do i = 1, size(DstMod%Vars%u) + associate (Var => DstMod%Vars%u(i)) + if (MV_EqualDL(Mapping%DstDL, Var%DL)) then + select case (Var%Field) + ! case (FieldTransDisp, FieldTransAcc, FieldAngularAcc) + case (FieldTransAcc, FieldAngularAcc) + call MV_SetFlags(Var, VF_Solve) + end select + end if + end associate + end do + + ! Add flag to source for dUdy terms + do i = 1, size(SrcMod%Vars%y) + associate (Var => SrcMod%Vars%y(i)) + if (MV_EqualDL(Mapping%SrcDL, Var%DL)) then + select case (Var%Field) + ! case (FieldTransDisp, FieldAngularVel, FieldTransAcc, FieldAngularAcc) + case (FieldTransAcc, FieldAngularAcc) + call MV_SetFlags(Var, VF_Solve) + end select + end if + end associate + end do + end if + + case (Map_LoadMesh) + + DstForce = .false. + DstMoment = .false. + + ! Add flag to destination loads + do i = 1, size(DstMod%Vars%u) + associate (Var => DstMod%Vars%u(i)) + if (MV_EqualDL(Mapping%DstDL, Var%DL)) then + select case (Var%Field) + case (FieldForce) + call MV_SetFlags(Var, VF_Solve) + DstForce = .true. + case (FieldMoment) + call MV_SetFlags(Var, VF_Solve) + DstMoment = .true. + end select + end if + end associate + end do + + ! Add flag to source loads + do i = 1, size(SrcMod%Vars%y) + associate (Var => SrcMod%Vars%y(i)) + if (MV_EqualDL(Mapping%SrcDL, Var%DL)) then + select case (Var%Field) + case (FieldForce, FieldMoment) + call MV_SetFlags(Var, VF_Solve) + end select + end if + end associate + end do + + if (SrcModTC .and. DstModTC) then + + ! Add flag to destination displacements and orientations for dUdy + ! if destination mesh has moments + if (DstMoment) then + do i = 1, size(DstMod%Vars%y) + associate (Var => DstMod%Vars%y(i)) + if (MV_EqualDL(Mapping%DstDispDL, Var%DL)) then + select case (Var%Field) + case (FieldTransDisp, FieldOrientation) + call MV_SetFlags(Var, VF_Solve) + end select + end if + end associate + end do + end if + + ! Add flag to source translation displacement for dUdu + ! if destination mesh has moments + if (DstMoment) then + do i = 1, size(SrcMod%Vars%u) + associate (Var => SrcMod%Vars%u(i)) + if (MV_EqualDL(Mapping%SrcDispDL, Var%DL)) then + select case (Var%Field) + case (FieldTransDisp) + call MV_SetFlags(Var, VF_Solve) + end select + end if + end associate + end do + end if + end if + + case (Map_Variable) + + ! This includes all variable-to-variable mappings for modules + ! that are in tight coupling and/or Option 1. May need to limit + ! this in the future to just loads and accelerations. + + ! Add flag to source variable + do i = 1, size(SrcMod%Vars%y) + associate (Var => SrcMod%Vars%y(i)) + if (.not. MV_EqualDL(Mapping%SrcDL, Var%DL)) cycle + select case (Var%Field) + case (FieldForce, FieldMoment) + call MV_SetFlags(Var, VF_Solve) + case (FieldScalar) + if (Var%DerivOrder == 2) call MV_SetFlags(Var, VF_Solve) + end select + end associate + end do + + ! Add flag to destination variable + do i = 1, size(DstMod%Vars%u) + associate (Var => DstMod%Vars%u(i)) + if (.not. MV_EqualDL(Mapping%DstDL, Var%DL)) cycle + select case (Var%Field) + case (FieldForce, FieldMoment) + call MV_SetFlags(Var, VF_Solve) + case (FieldScalar) + if (Var%DerivOrder == 2) call MV_SetFlags(Var, VF_Solve) + end select + end associate + end do + + end select + + end associate + end do + + ! Clear VF_Solve flag from variables that have VF_NoLin flag + do i = 1, size(GlueModData) + associate (ModData => GlueModData(i)) + if (allocated(ModData%Vars%u)) then + do j = 1, size(ModData%Vars%u) + associate (Var => ModData%Vars%u(j)) + if (MV_HasFlagsAny(Var, VF_NoLin)) call MV_ClearFlags(Var, VF_Solve) + end associate + end do + end if + if (allocated(ModData%Vars%y)) then + do j = 1, size(ModData%Vars%y) + associate (Var => ModData%Vars%y(j)) + if (MV_HasFlagsAny(Var, VF_NoLin)) call MV_ClearFlags(Var, VF_Solve) + end associate + end do + end if + end associate + end do + + ! If debugging, print out variables that will be solved + if (DebugSolver) then + do i = 1, size(GlueModData) + associate (ModData => GlueModData(i)) + if (allocated(ModData%Vars%u)) then + do j = 1, size(ModData%Vars%u) + associate (Var => ModData%Vars%u(j)) + if (MV_HasFlagsAny(Var, VF_Solve)) then + write (*, *) 'Solve u:', FAST_InputFieldName(ModData, Var%DL)//' '//MV_FieldString(Var%Field), Var%Num + end if + end associate + end do + end if + if (allocated(ModData%Vars%y)) then + do j = 1, size(ModData%Vars%y) + associate (Var => ModData%Vars%y(j)) + if (MV_HasFlagsAny(Var, VF_Solve)) then + write (*, *) 'Solve y:', FAST_OutputFieldName(ModData, Var%DL)//' '//MV_FieldString(Var%Field), Var%Num + end if + end associate + end do + end if + end associate + end do + end if + + end subroutine + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine CalcVarGlobalIndices(p, ModTC, NumQ, NumJ, ErrStat, ErrMsg) + type(Glue_TCParam), intent(inout) :: p !< Parameters + type(ModGlueType), intent(inout) :: ModTC !< Module data + integer(IntKi), intent(out) :: NumJ !< Number of rows in Jacobian + integer(IntKi), intent(out) :: NumQ !< Number of rows in state matrix + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'CalcVarGlobalIndices' + integer(IntKi) :: ErrStat2 ! local error status + character(ErrMsgLen) :: ErrMsg2 ! local error message + integer(IntKi) :: i, j, k, num, iGlu + integer(IntKi) :: ix, iu, iy + ErrStat = ErrID_None - ErrMsg = "" - - - ! BD inputs on blade from AeroDyn - IF (p_FAST%CompElast == Module_BD) THEN - - IF ( p_FAST%CompAero == Module_AD ) THEN - - if (p_FAST%BD_OutputSibling) then - - DO K = 1,p_FAST%nBeams ! Loop through all blades - - CALL Transfer_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), BD%y(k)%BldMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - END DO - - else - DO K = 1,p_FAST%nBeams ! Loop through all blades - - ! need to transfer the BD output blade motions to nodes on a sibling of the BD blade motion mesh: - CALL Transfer_Line2_to_Line2( BD%y(k)%BldMotion, MeshMapData%y_BD_BldMotion_4Loads(k), MeshMapData%BD_L_2_BD_L(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - CALL Transfer_Line2_to_Line2( y_AD%rotors(1)%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), MeshMapData%y_BD_BldMotion_4Loads(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - END DO + ErrMsg = '' + + ! Initialize indices to zero + p%iX1 = 0 + p%iX2 = 0 + p%iUT = 0 + p%iU1 = 0 + p%iUL = 0 + p%iyT = 0 + p%iy1 = 0 + p%iJX = 0 + p%iJU = 0 + p%iJUT = 0 + p%iJL = 0 + + ! Loop through modules in data array and zero glue locations + do i = 1, size(ModTC%ModData) + associate (Vars => ModTC%ModData(i)%Vars) + if (allocated(Vars%x)) then + do j = 1, size(Vars%x) + Vars%x(j)%iGlu = 0 + end do + end if + if (allocated(Vars%u)) then + do j = 1, size(Vars%u) + Vars%u(j)%iGlu = 0 + end do end if + if (allocated(Vars%y)) then + do j = 1, size(Vars%y) + Vars%y(j)%iGlu = 0 + end do + end if + end associate + end do + + !---------------------------------------------------------------------------- + ! Allocate q storage for generalized alpha algorithm + ! This matrix stores equation state in an (N,4) array where: + ! - N is the number of equations (rows) + ! - Column 1 is position + ! - Column 2 is velocity + ! - Column 3 is acceleration + ! - Column 4 is generalized alpha algorithmic acceleration + !---------------------------------------------------------------------------- + + ! Initialize number of q states (ignore derivatives) + NumQ = 0 + + ! Loop through tight coupling modules in glue module + do i = 1, size(p%iModTC) + + associate (xVars => ModTC%ModData(i)%Vars%x) + + ! Loop through state variables + do j = 1, size(xVars) + + ! Skip variables which already have a q index + if (xVars(j)%iq(1) > 0) cycle + + ! Set q index for variable and update number + xVars(j)%iq = [NumQ + 1, NumQ + xVars(j)%Num] + NumQ = NumQ + xVars(j)%Num + + ! Loop through remaining vars if the names match + do k = j + 1, size(xVars) + + ! If names are different then they don't match, skip + if (xVars(j)%Name /= xVars(k)%Name) cycle + + ! If field is not the same or a derivative of current field, skip + select case (xVars(j)%Field) + case (FieldTransDisp, FieldTransVel, FieldTransAcc) + if (all(xVars(k)%Field /= TransFields)) cycle + case (FieldOrientation, FieldAngularDisp, FieldAngularVel, FieldAngularAcc) + if (all(xVars(k)%Field /= AngularFields)) cycle + case (FieldScalar) + if (xVars(k)%Field /= FieldScalar) cycle + case (FieldForce, FieldMoment) + cycle + end select + + ! Copy q row indices + xVars(k)%iq = xVars(j)%iq + + end do + end do + end associate + end do + + !---------------------------------------------------------------------------- + ! Calculate TC state glue locations (displacements then velocities) + !---------------------------------------------------------------------------- + + ! Initialize glue index + iGlu = 0 + ix = 0 + + ! Set indices for displacement variables + do i = 1, size(ModTC%ModData) + associate (Vars => ModTC%ModData(i)%Vars) + if (.not. allocated(Vars%x)) cycle + do j = 1, size(Vars%x) + if (Vars%x(j)%DerivOrder == 0) then + Vars%x(j)%iGlu = [iGlu + 1, iGlu + Vars%x(j)%Num] + iGlu = Vars%x(j)%iGlu(2) + ix = ix + 1 + call NWTC_Library_CopyModVarType(Vars%x(j), ModTC%Vars%x(ix), MESH_NEWCOPY, ErrStat2, ErrMsg2) + ModTC%Vars%x(ix)%iLoc = ModTC%Vars%x(ix)%iGlu + do k = 1, ModTC%Vars%x(ix)%Num + ModTC%Vars%x(ix)%LinNames(k) = trim(ModTC%ModData(i)%Abbr)//" "//ModTC%Vars%x(ix)%LinNames(k) + end do + end if + end do + end associate + end do + + ! Start and end indices of displacement variables + if (iGlu > 0) p%iX1 = [1, iGlu] + + ! Set indices for velocity variables + do i = 1, size(ModTC%ModData) + associate (Vars => ModTC%ModData(i)%Vars) + if (.not. allocated(Vars%x)) cycle + do j = 1, size(Vars%x) + if (Vars%x(j)%DerivOrder == 1) then + Vars%x(j)%iGlu = [iGlu + 1, iGlu + Vars%x(j)%Num] + iGlu = Vars%x(j)%iGlu(2) + ix = ix + 1 + call NWTC_Library_CopyModVarType(Vars%x(j), ModTC%Vars%x(ix), MESH_NEWCOPY, ErrStat2, ErrMsg2) + ModTC%Vars%x(ix)%iLoc = ModTC%Vars%x(ix)%iGlu + do k = 1, ModTC%Vars%x(ix)%Num + ModTC%Vars%x(ix)%LinNames(k) = trim(ModTC%ModData(i)%Abbr)//" "//ModTC%Vars%x(ix)%LinNames(k) + end do + end if + end do + end associate + end do + + ! Start and end indices of velocity variables + if (iGlu > p%iX1(2)) p%iX2 = [p%iX1(2) + 1, iGlu] + + !---------------------------------------------------------------------------- + ! Calculate input variable glue locations (group load and non-load) + !---------------------------------------------------------------------------- + + ! Initialize glue index + iGlu = 0 + iu = 0 + + ! Set indices of Tight Coupling input variables (non-load) + do i = 1, size(p%iModTC) + associate (Vars => ModTC%ModData(i)%Vars) + if (.not. allocated(Vars%u)) cycle + do j = 1, size(Vars%u) + if (.not. MV_IsLoad(Vars%u(j))) then + Vars%u(j)%iGlu = [iGlu + 1, iGlu + Vars%u(j)%Num] + iGlu = Vars%u(j)%iGlu(2) + iu = iu + 1 + call NWTC_Library_CopyModVarType(Vars%u(j), ModTC%Vars%u(iu), MESH_NEWCOPY, ErrStat2, ErrMsg2) + ModTC%Vars%u(iu)%iLoc = ModTC%Vars%u(iu)%iGlu + do k = 1, ModTC%Vars%u(iu)%Num + ModTC%Vars%u(iu)%LinNames(k) = trim(ModTC%ModData(i)%Abbr)//" "//ModTC%Vars%u(iu)%LinNames(k) + end do + end if + end do + end associate + end do + + ! Set start index of load values + p%iUL(1) = iGlu + 1 + + ! Set indices of Tight Coupling input variables (load) + do i = 1, size(p%iModTC) + associate (Vars => ModTC%ModData(i)%Vars) + if (.not. allocated(Vars%u)) cycle + do j = 1, size(Vars%u) + if (MV_IsLoad(Vars%u(j))) then + Vars%u(j)%iGlu = [iGlu + 1, iGlu + Vars%u(j)%Num] + iGlu = Vars%u(j)%iGlu(2) + iu = iu + 1 + call NWTC_Library_CopyModVarType(Vars%u(j), ModTC%Vars%u(iu), MESH_NEWCOPY, ErrStat2, ErrMsg2) + ModTC%Vars%u(iu)%iLoc = ModTC%Vars%u(iu)%iGlu + do k = 1, ModTC%Vars%u(iu)%Num + ModTC%Vars%u(iu)%LinNames(k) = trim(ModTC%ModData(i)%Abbr)//" "//ModTC%Vars%u(iu)%LinNames(k) + end do + end if + end do + end associate + end do + + ! Set start/end indices for tight coupling inputs + if (iGlu > 0) p%iUT = [1, iGlu] + + ! Set indices of Option 1 input variables (load) + do i = size(p%iModTC) + 1, size(ModTC%ModData) + associate (Vars => ModTC%ModData(i)%Vars) + if (.not. allocated(Vars%u)) cycle + do j = 1, size(Vars%u) + if (MV_IsLoad(Vars%u(j))) then + Vars%u(j)%iGlu = [iGlu + 1, iGlu + Vars%u(j)%Num] + iGlu = Vars%u(j)%iGlu(2) + iu = iu + 1 + call NWTC_Library_CopyModVarType(Vars%u(j), ModTC%Vars%u(iu), MESH_NEWCOPY, ErrStat2, ErrMsg2) + ModTC%Vars%u(iu)%iLoc = ModTC%Vars%u(iu)%iGlu + do k = 1, ModTC%Vars%u(iu)%Num + ModTC%Vars%u(iu)%LinNames(k) = trim(ModTC%ModData(i)%Abbr)//" "//ModTC%Vars%u(iu)%LinNames(k) + end do + end if + end do + end associate + end do + + ! Set end index of load values + if (iGlu >= p%iUL(1)) p%iUL(2) = iGlu + + ! Set indices of Option 1 input variables (non-load) + do i = size(p%iModTC) + 1, size(ModTC%ModData) + associate (Vars => ModTC%ModData(i)%Vars) + if (.not. allocated(Vars%u)) cycle + do j = 1, size(Vars%u) + if (.not. MV_IsLoad(Vars%u(j))) then + Vars%u(j)%iGlu = [iGlu + 1, iGlu + Vars%u(j)%Num] + iGlu = Vars%u(j)%iGlu(2) + iu = iu + 1 + call NWTC_Library_CopyModVarType(Vars%u(j), ModTC%Vars%u(iu), MESH_NEWCOPY, ErrStat2, ErrMsg2) + ModTC%Vars%u(iu)%iLoc = ModTC%Vars%u(iu)%iGlu + do k = 1, ModTC%Vars%u(iu)%Num + ModTC%Vars%u(iu)%LinNames(k) = trim(ModTC%ModData(i)%Abbr)//" "//ModTC%Vars%u(iu)%LinNames(k) + end do + end if + end do + end associate + end do + + ! Set start/end indices for Option 1 inputs + if (iGlu > p%iUT(2)) p%iU1 = [p%iUT(2) + 1, iGlu] + + !---------------------------------------------------------------------------- + ! Calculate output variable categories and indices + !---------------------------------------------------------------------------- + + ! Initialize glue index + iGlu = 0 + iy = 0 + + ! Set indices of Tight Coupling output variables + do i = 1, size(p%iModTC) + associate (Vars => ModTC%ModData(i)%Vars) + if (.not. allocated(Vars%y)) cycle + do j = 1, size(Vars%y) + Vars%y(j)%iGlu = [iGlu + 1, iGlu + Vars%y(j)%Num] + iGlu = Vars%y(j)%iGlu(2) + iy = iy + 1 + call NWTC_Library_CopyModVarType(Vars%y(j), ModTC%Vars%y(iy), MESH_NEWCOPY, ErrStat2, ErrMsg2) + ModTC%Vars%y(iy)%iLoc = ModTC%Vars%y(iy)%iGlu + do k = 1, ModTC%Vars%y(iy)%Num + ModTC%Vars%y(iy)%LinNames(k) = trim(ModTC%ModData(i)%Abbr)//" "//ModTC%Vars%y(iy)%LinNames(k) + end do + end do + end associate + end do + + ! Save number of tight coupling inputs + if (iGlu > 0) p%iyT = [1, iGlu] + + ! Set indices of Option 1 output variables + do i = size(p%iModTC) + 1, size(ModTC%ModData) + associate (Vars => ModTC%ModData(i)%Vars) + if (.not. allocated(Vars%y)) cycle + do j = 1, size(Vars%y) + Vars%y(j)%iGlu = [iGlu + 1, iGlu + Vars%y(j)%Num] + iGlu = Vars%y(j)%iGlu(2) + iy = iy + 1 + call NWTC_Library_CopyModVarType(Vars%y(j), ModTC%Vars%y(iy), MESH_NEWCOPY, ErrStat2, ErrMsg2) + ModTC%Vars%y(iy)%iLoc = ModTC%Vars%y(iy)%iGlu + do k = 1, ModTC%Vars%y(iy)%Num + ModTC%Vars%y(iy)%LinNames(k) = trim(ModTC%ModData(i)%Abbr)//" "//ModTC%Vars%y(iy)%LinNames(k) + end do + end do + end associate + end do + + ! Calculate number of option 1 outputs + if (iGlu > p%iyT(2)) p%iy1 = [p%iyT(2) + 1, iGlu] + + !---------------------------------------------------------------------------- + ! Jacobian indices and ranges + !---------------------------------------------------------------------------- + + ! Calculate size of Jacobian matrix + NumJ = NumQ + ModTC%Vars%Nu + + ! Get start and end indices for state part of Jacobian + if (NumQ > 0) p%iJX = [1, NumQ] + + ! Get start and end indices for tight coupling input part of Jacobian + if (p%iUT(1) > 0) p%iJUT = NumQ + p%iUT + + ! Get start and end indices for input part of Jacobian + if (p%iUT(1) > 0 .or. p%iU1(2) > 0) p%iJU = NumQ + [1, max(p%iUT(2), p%iU1(2))] + + ! Get Jacobian indices containing loads + if (p%iUL(1) > 0) p%iJL = NumQ + p%iUL + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine FAST_SolverStep0(p, m, GlueModData, GlueModMaps, Turbine, ErrStat, ErrMsg) + type(Glue_TCParam), intent(in) :: p !< Parameters + type(Glue_TCMisc), intent(inout) :: m !< Misc variables + type(ModDataType), intent(inout) :: GlueModData(:) !< Glue module data + type(MappingType), intent(inout) :: GlueModMaps(:) !< Module mappings + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'FAST_SolverStep0' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, k + integer(IntKi), parameter :: n_t_global = -1 ! loop counter + integer(IntKi), parameter :: n_t_global_next = 0 ! loop counter + real(DbKi) :: t_initial ! next simulation time + real(DbKi) :: t_global_next ! next simulation time + logical :: IsConverged + integer(IntKi) :: ConvIter, CorrIter + real(R8Ki) :: ConvError + + ErrStat = ErrID_None + ErrMsg = '' + + !---------------------------------------------------------------------------- + ! Miscellaneous initial step setup + !---------------------------------------------------------------------------- + + t_initial = Turbine%m_FAST%t_global + t_global_next = t_initial + n_t_global_next*p%h + + ! Initialize Jacobian update counters to zero to calculate on first iteration + m%UJacIterRemain = 0 + m%UJacStepsRemain = 0 + + ! Initialize temporary input structure for TC and Option1 modules + do i = 1, size(m%Mod%ModData) + call FAST_CopyInput(m%Mod%ModData(i), Turbine, INPUT_CURR, INPUT_TEMP, MESH_NEWCOPY, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + !---------------------------------------------------------------------------- + ! Collect initial states from modules + !---------------------------------------------------------------------------- + + ! Transfer initial state from modules to solver + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + + ! Get continuous state operating points + call FAST_GetOP(ModData, t_initial, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2, & + x_op=ModData%Lin%x, x_glue=m%Mod%Lin%x) + if (Failed()) return + + ! Transfer initial module state to GA state + call TransferXtoQ(ModData, m%Mod%Lin%x, m%StateCurr) + + ! Transfer accelerations from BeamDyn + if (ModData%ID == Module_BD) then + call GetBDAccel(ModData, Turbine%BD%OtherSt(ModData%Ins, STATE_CURR), m%StateCurr) + end if + + end associate + end do + + ! Initialize + m%StateCurr%q_prev = m%StateCurr%q + m%StateCurr%x = 0.0_R8Ki + + ! Copy TC solver states from current to predicted + call Glue_CopyTC_State(m%StateCurr, m%StatePred, MESH_NEWCOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + !---------------------------------------------------------------------------- + ! Input solve and calc output for initial modules + !---------------------------------------------------------------------------- + + ! Reset mapping ready for transfer flag + call FAST_ResetMappingReady(GlueModMaps) + + ! Loop through initial module index list + do i = 1, size(p%iModInit) + + ! Solve for inputs + call FAST_InputSolve(p%iModInit(i), GlueModData, GlueModMaps, INPUT_CURR, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Calculate outputs + call FAST_CalcOutput(GlueModData(p%iModInit(i)), GlueModMaps, t_initial, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + end do + + !---------------------------------------------------------------------------- + ! Solve for inputs at initial time + !---------------------------------------------------------------------------- + + call FAST_CalcOutputsAndSolveForInputs(p, m, GlueModData, GlueModMaps, t_initial, INPUT_CURR, STATE_CURR, Turbine, & + ConvIter, ConvError, IsConverged, ErrStat2, ErrMsg2, UpdateJacobian=.true.) + if (Failed()) return + + ! Print warning if not converged + if (.not. IsConverged) then + call WrScr("Solver: initial step not converged, error="// & + trim(Num2LStr(ConvError))//", tol="//trim(Num2LStr(p%ConvTol))) + end if + + !---------------------------------------------------------------------------- + ! Post convergence calculations + !---------------------------------------------------------------------------- + + ! Set algorithmic acceleration from actual acceleration + m%StatePred%a = m%StatePred%vd + + ! Initialize the algorithmic acceleration to actual acceleration in BeamDyn + do i = 1, size(GlueModData) + if (GlueModData(i)%ID == Module_BD) then + Turbine%BD%OtherSt(GlueModData(i)%Ins, STATE_CURR)%xcc = & + Turbine%BD%OtherSt(GlueModData(i)%Ins, STATE_CURR)%acc + end if + end do + + !---------------------------------------------------------------------------- + ! Set Outputs + !---------------------------------------------------------------------------- + + Turbine%y_FAST%DriverWriteOutput(1) = real(ConvIter, ReKi) ! ConvIter + Turbine%y_FAST%DriverWriteOutput(2) = real(ConvError, ReKi) ! ConvError + Turbine%y_FAST%DriverWriteOutput(3) = real(1, ReKi) ! NumUJac + + !---------------------------------------------------------------------------- + ! Finite Difference of Jacobian + !---------------------------------------------------------------------------- + + if (FiniteDifferenceJacobian) call CalcFiniteDifferenceJacobian() + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function + subroutine CalcFiniteDifferenceJacobian() + real(R8Ki), allocatable :: JacRef(:, :), JacFD(:, :) + real(R8Ki), allocatable :: Rp(:), Rn(:), uSave(:) + integer(IntKi) :: ii, jj, col + + call AllocAry(uSave, m%Mod%Vars%Nu, "uSave", ErrStat2, ErrMsg2); if (Failed()) return + uSave = 0.0_R8Ki + + write(*,*) "CalcFiniteDifferenceJacobian1" + + ! Pack TC and Option 1 inputs into u array + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_GetOP(ModData, t_initial, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2, & + u_op=ModData%Lin%u, u_glue=uSave) + if (Failed()) return + end associate + end do + + write(*,*) "CalcFiniteDifferenceJacobian2" + + if (MatrixUn == -1) then + call GetNewUnit(MatrixUn, ErrStat2, ErrMsg2); if (Failed()) return + end if + + write(*,*) "CalcFiniteDifferenceJacobian3" + + ! Write input names + call OpenFOutFile(MatrixUn, "InpNames.txt", ErrStat2, ErrMsg2); if (Failed()) return + do ii = 1, size(m%Mod%Vars%u) + do jj = 1, m%Mod%Vars%u(ii)%Num + write (MatrixUn, *) m%Mod%Vars%u(ii)%iLoc(1) + jj - 1, trim(m%Mod%Vars%u(ii)%LinNames(jj)) + end do + end do + + write(*,*) "CalcFiniteDifferenceJacobian4" + + ! Build and save current Jacobian + call BuildJacobianIO(p, m, GlueModMaps, t_initial, INPUT_CURR, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + write(*,*) "CalcFiniteDifferenceJacobian5" + + call DumpMatrix(MatrixUn, "JacRef.bin", m%IO_Jac, ErrStat2, ErrMsg2); if (Failed()) return + + write(*,*) "CalcFiniteDifferenceJacobian6" + + call ModGlue_CalcWriteLinearMatrices(m%Mod%Vars, m%Mod%Lin, Turbine%p_FAST, Turbine%y_FAST, t_initial, MatrixUn, 'lin', VF_None, ErrStat2, ErrMsg2, CalcGlue=.false., FullOutput=.true.) + if (Failed()) return + + write(*,*) "CalcFiniteDifferenceJacobian7" + + ! Allocate finite difference Jacobian + call AllocAry(JacFD, m%Mod%Vars%Nu, m%Mod%Vars%Nu, 'JacFD', ErrStat2, ErrMsg2); if (Failed()) return + + ! Allocate storage for residual + call AllocAry(Rp, m%Mod%Vars%Nu, 'Rp', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Rn, m%Mod%Vars%Nu, 'Rn', ErrStat2, ErrMsg2); if (Failed()) return + + ! Loop through input variables + do ii = 1, size(m%Mod%Vars%u) + + ! Loop through number of values in variable + do jj = 1, m%Mod%Vars%u(ii)%Num + + ! Positive perturbation of input + call MV_Perturb(m%Mod%Vars%u(ii), jj, 1, uSave, m%Mod%Lin%u) + call CalcResidual(Rp) + + ! Negative perturbation of input + call MV_Perturb(m%Mod%Vars%u(ii), jj, -1, uSave, m%Mod%Lin%u) + call CalcResidual(Rn) + + ! Calculate column index + col = m%Mod%Vars%u(ii)%iLoc(1) + jj - 1 + + ! Calculate Jacobian column + JacFD(:, col) = (Rn - Rp)/(2.0_R8Ki*m%Mod%Vars%u(ii)%Perturb) + + end do + end do + + write(*,*) "CalcFiniteDifferenceJacobian" + + ! Write Jacobian matrices + call DumpMatrix(MatrixUn, "JacFD.bin", JacFD, ErrStat2, ErrMsg2); if (Failed()) return + + ! Restore module inputs + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_SetOP(ModData, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2, & + u_op=ModData%Lin%u, u_glue=uSave) + if (Failed()) return + end associate + end do + + end subroutine + + subroutine CalcResidual(Resid) + real(R8Ki), intent(out) :: Resid(:) + + ! Transfer perturbed inputs to modules + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_SetOP(ModData, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2, & + u_op=ModData%Lin%u, u_glue=m%Mod%Lin%u) + if (Failed()) return + end associate + end do + + !------------------------------------------------------------------------- + ! TC and Option 1: Calculate Outputs (Y) + !------------------------------------------------------------------------- + + do i = 1, size(m%Mod%ModData) + call FAST_CalcOutput(m%Mod%ModData(i), GlueModMaps, t_initial, INPUT_CURR, STATE_CURR, & + Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + !------------------------------------------------------------------------- + ! Formulate right hand side (U^tight, U^Option1) + !------------------------------------------------------------------------- + + ! Input solve for tight coupling modules + do i = 1, size(p%iModTC) + call FAST_InputSolve(p%iModTC(i), GlueModData, GlueModMaps, INPUT_TEMP, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + ! Input solve for Option 1 modules + do i = 1, size(p%iModOpt1) + call FAST_InputSolve(p%iModOpt1(i), GlueModData, GlueModMaps, INPUT_TEMP, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + ! Collect TC and Option 1 inputs into uCalc + do i = 1, size(m%Mod%ModData) + call FAST_GetOP(m%Mod%ModData(i), t_initial, INPUT_TEMP, STATE_CURR, Turbine, ErrStat2, ErrMsg2, & + u_op=m%Mod%ModData(i)%Lin%u, u_glue=m%uCalc) + if (Failed()) return + end do + + !------------------------------------------------------------------------- + ! Populate residual vector and apply conditioning to loads + !------------------------------------------------------------------------- + + ! Calculate difference in U for all Option 1 and TC modules (un - u_tmp) + call MV_ComputeDiff(m%Mod%Vars%u, m%uCalc, m%Mod%Lin%u, Resid) + end subroutine +end subroutine + +subroutine FAST_SolverStep(n_t_global, t_initial, p, m, GlueModData, GlueModMaps, Turbine, ErrStat, ErrMsg) + integer(IntKi), intent(in) :: n_t_global !< global time step + real(DbKi), intent(in) :: t_initial !< Initial simulation time + type(Glue_TCParam), intent(in) :: p !< Parameters + type(Glue_TCMisc), intent(inout) :: m !< Misc variables + type(ModDataType), intent(inout) :: GlueModData(:) !< Glue module data + type(MappingType), intent(inout) :: GlueModMaps(:) !< Module mappings + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'Solver_Step' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + logical, parameter :: IsSolve = .true. + integer(IntKi) :: ConvIter, CorrIter, TotalIter + integer(IntKi) :: NumUJac, NumCorrections + real(R8Ki) :: ConvError + real(DbKi) :: t_global_next ! next simulation time (m_FAST%t_global + p_FAST%dt) + integer(IntKi) :: n_t_global_next ! n_t_global + 1 + integer(IntKi) :: i, j, k + integer(IntKi) :: iMod + integer(IntKi) :: ConvUJac ! Jacobian updated for convergence + integer(IntKi) :: MaxConvUJac ! Max times Jacobian can be updated for convergence + real(R8Ki) :: RotDiff(3, 3) + + ErrStat = ErrID_None + ErrMsg = '' + + !---------------------------------------------------------------------------- + ! Miscellaneous step updates + !---------------------------------------------------------------------------- + + ! Calculate the next global time step number and time + n_t_global_next = n_t_global + 1 + t_global_next = t_initial + n_t_global_next*p%h + + ! Decrement number of time steps before updating the Jacobian + m%UJacStepsRemain = m%UJacStepsRemain - 1 + + ! Maximum number of times Jacobian can be updated for convergence. + ! Allow more updates on first step + MaxConvUJac = 1 + if (n_t_global == 0) MaxConvUJac = 3 + + ! Set Jacobian updated for convergence flag to false + ConvUJac = 0 + + ! Init counters for number of Jacobian updates and number of convergence iterations + NumUJac = 0 + TotalIter = 0 + + !---------------------------------------------------------------------------- + ! Correction Iterations + !---------------------------------------------------------------------------- + + ! Loop through correction iterations + CorrIter = 0 + NumCorrections = p%NumCrctn + do while (CorrIter <= NumCorrections) + + ! Reset mapping ready flags + call FAST_ResetMappingReady(GlueModMaps) + + ! Copy TC solver states from current to predicted + call Glue_CopyTC_State(m%StateCurr, m%StatePred, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Perform additional state manipulation on a per-module basis + do i = 1, size(p%iModTC) + associate (ModData => m%Mod%ModData(i)) + + ! Copy state from current to predicted + call FAST_CopyStates(ModData, Turbine, STATE_CURR, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Additional state manipulation per module + select case (ModData%ID) + case (Module_ED) + + ! Update the azimuth angle + call ED_UpdateAzimuth(Turbine%ED%p(ModData%Ins), Turbine%ED%x(ModData%Ins, STATE_PRED), ModData%DT) + call ED_UpdateBlPitch(Turbine%ED%p(ModData%Ins), Turbine%ED%x(ModData%Ins, STATE_PRED) ) + + case (Module_BD) + + ! Transfer acceleration from TC state to BeamDyn + call SetBDAccel(ModData, m%StatePred, Turbine%BD%OtherSt(ModData%Ins, STATE_PRED)) + + ! Reset BeamDyn states so they are relative to the root node + call BD_UpdateGlobalRef(Turbine%BD%Input(INPUT_CURR, ModData%Ins), & + Turbine%BD%p(ModData%Ins), & + Turbine%BD%x(ModData%Ins, STATE_PRED), & + Turbine%BD%OtherSt(ModData%Ins, STATE_PRED), & + ErrStat2, ErrMsg2) + if (Failed()) return + + ! Transfer acceleration from BeamDyn to state + call GetBDAccel(ModData, Turbine%BD%OtherSt(ModData%Ins, STATE_PRED), m%StatePred) + + case default + cycle + end select + + ! Collect updated states + call FAST_GetOP(ModData, t_global_next, INPUT_CURR, STATE_PRED, Turbine, ErrStat2, ErrMsg2, & + x_op=ModData%Lin%x, x_glue=m%Mod%Lin%x) + if (Failed()) return + + ! Transfer current states to linearization array + call TransferXtoQ(ModData, m%Mod%Lin%x, m%StatePred) + end associate + end do + + ! Update state prediction + call PredictNextState(p, m%StatePred, m%Mod%Vars) + + ! Loop through tight coupling modules + do i = 1, size(p%iModTC) + associate (ModData => m%Mod%ModData(i)) + + ! Transfer current states to linearization array + call TransferQtoX(ModData, m%StatePred, m%Mod%Lin%x) + + ! Transfer solver states to module + call FAST_SetOP(ModData, INPUT_CURR, STATE_PRED, Turbine, ErrStat2, ErrMsg2, & + x_op=ModData%Lin%x, x_glue=m%Mod%Lin%x) + if (Failed()) return + + ! Transfer accelerations to BeamDyn + if (ModData%ID == Module_BD) then + call SetBDAccel(ModData, m%StatePred, Turbine%BD%OtherSt(ModData%Ins, STATE_CURR)) + end if + end associate + end do + + !------------------------------------------------------------------------- + ! Option 2: Input Solve, Update States, Calc Output + !------------------------------------------------------------------------- + + ! Loop through Option 2 modules + do i = 1, size(p%iModOpt2) + associate (ModData => GlueModData(p%iModOpt2(i))) + + ! Solve for inputs + call FAST_InputSolve(p%iModOpt2(i), GlueModData, GlueModMaps, INPUT_CURR, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Update states of modules not in the tight coupling category + if (iand(ModData%Category, MC_Tight) == 0) then + call FAST_UpdateStates(ModData, t_initial, n_t_global, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end if + + ! Calculate outputs + call FAST_CalcOutput(ModData, GlueModMaps, t_global_next, INPUT_CURR, STATE_PRED, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end associate + end do + + !------------------------------------------------------------------------- + ! Option 1: Input Solve, Update States + !------------------------------------------------------------------------- + + do i = 1, size(p%iModOpt1) + associate (ModData => GlueModData(p%iModOpt1(i))) + + ! Solve for inputs to module + call FAST_InputSolve(p%iModOpt1(i), GlueModData, GlueModMaps, INPUT_CURR, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return - ELSE IF (p_FAST%CompAero == Module_ExtLd ) THEN + ! Update states for modules not updated in Option 2 + if (iand(ModData%Category, MC_Option2) == 0) then + call FAST_UpdateStates(GlueModData(p%iModOpt1(i)), t_initial, n_t_global, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end if + end associate + end do + + !------------------------------------------------------------------------- + ! TC: Input Solve + !------------------------------------------------------------------------- + + do i = 1, size(p%iModTC) + call FAST_InputSolve(p%iModTC(i), GlueModData, GlueModMaps, INPUT_CURR, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + !------------------------------------------------------------------------- + ! TC and Option 1: Save Inputs (u) + !------------------------------------------------------------------------- + + ! Pack TC and Option 1 inputs into u array + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_GetOP(ModData, t_global_next, INPUT_CURR, STATE_PRED, Turbine, ErrStat2, ErrMsg2, & + u_op=ModData%Lin%u, u_glue=m%Mod%Lin%u) + if (Failed()) return + end associate + end do - !Get the aerodyn loads first - do K = 1,p_FAST%nBeams ! Loop through all blades - call Transfer_Line2_to_Point( y_AD%rotors(1)%BladeLoad(k), y_ExtLd%BladeLoadAD(k), MeshMapData%AD_L_2_ExtLd_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), u_ExtLd%BladeMotion(k) ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + !------------------------------------------------------------------------- + ! Convergence Iterations + !------------------------------------------------------------------------- + + ! Loop through convergence iterations + do ConvIter = 0, p%MaxConvIter + + ! Increment total number of convergence iterations in step + TotalIter = TotalIter + 1 + + ! Decrement number of iterations before updating the Jacobian + m%UJacIterRemain = m%UJacIterRemain - 1 + + !---------------------------------------------------------------------- + ! TC and Option 1: Calculate Outputs (Y) + !---------------------------------------------------------------------- + + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_CalcOutput(ModData, GlueModMaps, t_global_next, INPUT_CURR, STATE_PRED, & + Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end associate end do - !Blend the aerodyn loads with the external loads - call ExtLd_ConvertOpDataForOpenFAST(y_ExtLd, u_ExtLd, m_ExtLd, p_ExtLd, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + !---------------------------------------------------------------------- + ! Convergence iteration check + !---------------------------------------------------------------------- - if (p_FAST%BD_OutputSibling) then + ! If Jacobian has zero size (no states or inputs), exit loop + if (p%NumJ == 0) exit - DO K = 1,p_FAST%nBeams ! Loop through all blades + ! If convergence iteration has reached or exceeded limit + if (ConvIter >= p%MaxConvIter) then - CALL Transfer_Point_to_Line2( y_ExtLd%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%ExtLd_P_2_BDED_B(k), ErrStat2, ErrMsg2, u_ExtLd%BladeMotion(k), BD%y(k)%BldMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! If module coupling is loose or tight with fixed Jacobian updates + if (p%ModCoupling == LooseCoupling .or. & + p%ModCoupling == TightCouplingFixed) then - END DO + ! Return with fatal error + call SetErrStat(ErrID_Fatal, "Failed to converge in "//trim(Num2LStr(p%MaxConvIter))// & + " iterations on step "//trim(Num2LStr(n_t_global_next))// & + " (error="//trim(Num2LStr(ConvError))// & + ", tolerance="//trim(Num2LStr(p%ConvTol))//").", & + ErrStat, ErrMsg, RoutineName) + return - else - DO K = 1,p_FAST%nBeams ! Loop through all blades + ! If the Jacobian has not been updated for convergence + else if ((ConvUJac < MaxConvUJac)) then - ! need to transfer the BD output blade motions to nodes on a sibling of the BD blade motion mesh: - CALL Transfer_Line2_to_Line2( BD%y(k)%BldMotion, MeshMapData%y_BD_BldMotion_4Loads(k), MeshMapData%BD_L_2_BD_L(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! Set counter to trigger a Jacobian update on next convergence iteration + m%UJacIterRemain = 0 - CALL Transfer_Point_to_Line2( y_ExtLd%BladeLoad(k), BD%Input(1,k)%DistrLoad, MeshMapData%ExtLd_P_2_BDED_B(k), ErrStat2, ErrMsg2, u_ExtLd%BladeMotion(k), MeshMapData%y_BD_BldMotion_4Loads(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! If at the maximum number of correction iterations, + ! increase limit to retry the step after the Jacobian is updated + if (CorrIter == NumCorrections) NumCorrections = NumCorrections + 1 - END DO - end if + ! Set flag indicating that the jacobian has been updated for convergence + ConvUJac = ConvUJac + 1 - ELSE - - DO K = 1,p_FAST%nBeams ! Loop through all blades - BD%Input(1,k)%DistrLoad%Force = 0.0_ReKi - BD%Input(1,k)%DistrLoad%Moment = 0.0_ReKi - END DO - - END IF - - ! Add blade loads from StrucCtrl in SrvD to BD loads - IF ( p_FAST%CompServo == Module_SrvD .and. allocated(y_SrvD%BStCLoadMesh)) THEN - do j=1,size(y_SrvD%BStCLoadMesh,2) - DO K = 1,p_FAST%nBeams ! Loop through all blades - IF (y_SrvD%BStCLoadMesh(K,J)%Committed) THEN - MeshMapData%u_BD_DistrLoad(k)%Force = 0.0_ReKi - MeshMapData%u_BD_DistrLoad(k)%Moment = 0.0_ReKi - CALL Transfer_Point_to_Line2( y_SrvD%BStCLoadMesh(k,J), MeshMapData%u_BD_DistrLoad(k), MeshMapData%BStC_P_2_BD_P_B(k,j), ErrStat2, ErrMsg2, u_SrvD%BStCMotionMesh(k,J), BD%y(k)%BldMotion ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//':u_BD_DistrLoad' ) - do I = 1,BD%Input(1,k)%DistrLoad%Nnodes ! Loop through the tower nodes / elements - BD%Input(1,k)%DistrLoad%Force(:,I) = BD%Input(1,k)%DistrLoad%Force(:,I) + MeshMapData%u_BD_DistrLoad(k)%Force(:,I) - BD%Input(1,k)%DistrLoad%Moment(:,I) = BD%Input(1,k)%DistrLoad%Moment(:,I) + MeshMapData%u_BD_DistrLoad(k)%Moment(:,I) - enddo - ENDIF - ENDDO - enddo - ENDIF - - END IF - - ! add damping in blades for linearization convergence - if (p_FAST%CalcSteady) then - - ! note that this assumes sibling meshes for input and output - - omega_c = y_ED%RotSpeed * y_ED%HubPtMotion%Orientation(1,:,1) - r_hub = y_ED%HubPtMotion%Position(:,1) + y_ED%HubPtMotion%TranslationDisp(:,1) - - if (p_FAST%BD_OutputSibling) then - - do k = 1,p_FAST%nBeams ! Loop through all blades - do j = 1,BD%Input(1,k)%DistrLoad%NNodes - r = BD%y(k)%BldMotion%Position(:,j) + BD%y(k)%BldMotion%TranslationDisp(:,j) - r_hub - Vrot = cross_product(omega_c, r) - BD%Input(1,k)%DistrLoad%Force(:,j) = BD%Input(1,k)%DistrLoad%Force(:,j) - p_FAST%Bld_Kdmp * ( BD%y(k)%BldMotion%TranslationVel(:,j) - Vrot ) - end do - end do - - else - - do k = 1,p_FAST%nBeams ! Loop through all blades - do j = 1,BD%Input(1,k)%DistrLoad%NNodes - r = MeshMapData%y_BD_BldMotion_4Loads(k)%Position(:,j) + MeshMapData%y_BD_BldMotion_4Loads(k)%TranslationDisp(:,j) - r_hub - Vrot = cross_product(omega_c, r) - BD%Input(1,k)%DistrLoad%Force(:,j) = BD%Input(1,k)%DistrLoad%Force(:,j) - p_FAST%Bld_Kdmp * ( MeshMapData%y_BD_BldMotion_4Loads(k)%TranslationVel(:,j) - Vrot ) - end do - end do - + else + + ! Otherwise, correction iteration with Jacobian update has been tried, + ! display warning that convergence failed and move to next step + call SetErrStat(ErrID_Warn, "Failed to converge in "//trim(Num2LStr(p%MaxConvIter))// & + " iterations on step "//trim(Num2LStr(n_t_global_next))// & + " (error="//trim(Num2LStr(ConvError))// & + ", tolerance="//trim(Num2LStr(p%ConvTol))//"). "// & + "Solution will continue but may be invalid.", & + ErrStat, ErrMsg, RoutineName) + end if + + ! Exit convergence loop to next correction iteration or next step + exit end if - end if - -END SUBROUTINE BD_InputSolve -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for ED--using the Option 2 solve method. Currently the only inputs not solved in this routine -!! are the fields on PlatformPtMesh, which are solved in Option 1. The fields on HubPtLoad are solved in both Option 2 and Option 1. -SUBROUTINE ED_InputSolve( p_FAST, u_ED, y_ED, y_AD, y_ADsk, y_SrvD, u_AD, u_ADsk, y_ExtLd, m_ExtLd, u_ExtLd, p_ExtLd, u_SrvD, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(ED_InputType), INTENT(INOUT) :: u_ED !< ED Inputs at t - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(ADsk_OutputType), INTENT(IN ) :: y_ADsk !< AeroDisk outputs - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD inputs (for AD-ED load transfer) - TYPE(ADsk_InputType), INTENT(IN ) :: u_ADsk !< ADsk inputs (for ADsk-ED load transfer) - TYPE(ExtLd_OutputType), INTENT(INOUT) :: y_ExtLd !< ExtLoads outputs - TYPE(ExtLd_MiscVarType), INTENT(INOUT) :: m_ExtLd !< ExtLoads misc var - TYPE(ExtLd_InputType), INTENT(IN ) :: u_ExtLd !< ExtLoads inputs (for ExtLoads-ED load transfer) - TYPE(ExtLd_ParameterType), INTENT(IN ) :: p_ExtLd !< ExtLoads parameters (for ExtLoads-ED load transfer) - TYPE(SrvD_OutputType), INTENT(IN ) :: y_SrvD !< ServoDyn outputs - TYPE(SrvD_InputType), INTENT(IN ) :: u_SrvD !< ServoDyn inputs - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - ! local variables - REAL(R8Ki) :: omega_c(3) ! variable for adding damping - REAL(R8Ki) :: r(3) ! variable for adding damping - REAL(R8Ki) :: r_hub(3) ! variable for adding damping - REAL(R8Ki) :: Vrot(3) ! variable for adding damping - - INTEGER(IntKi) :: J ! Loops through nodes / elements - INTEGER(IntKi) :: i ! Loops through nodes / elements - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'ED_InputSolve' - -! TYPE(MeshType), POINTER :: PlatformMotion -! TYPE(MeshType), POINTER :: PlatformLoads - - ! Initialize error status - ErrStat = ErrID_None - ErrMsg = "" - - - ! ED inputs on hub - if (p_FAST%CompAero == Module_ADsk) then - CALL Transfer_Point_to_Point( y_ADsk%AeroLoads, u_ED%HubPtLoad, MeshMapData%ADsk_P_2_ED_P_H, ErrStat2, ErrMsg2, u_ADsk%HubMotion, y_ED%HubPtMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - endif - - ! ED inputs on blade from AeroDyn - IF (p_FAST%CompElast == Module_ED) THEN - - IF ( p_FAST%CompAero == Module_AD ) THEN - - DO K = 1,SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - CALL Transfer_Line2_to_Point( y_AD%rotors(1)%BladeLoad(k), u_ED%BladePtLoads(k), MeshMapData%AD_L_2_BDED_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), y_ED%BladeLn2Mesh(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO - - ELSE IF (p_FAST%CompAero == Module_ExtLd ) THEN - - DO K = 1,SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - CALL Transfer_Line2_to_Point( y_AD%rotors(1)%BladeLoad(k), y_ExtLd%BladeLoadAD(k), MeshMapData%AD_L_2_ExtLd_B(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), u_ExtLd%BladeMotion(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO - - call ExtLd_ConvertOpDataForOpenFAST(y_ExtLd, u_ExtLd, m_ExtLd, p_ExtLd, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - DO K = 1,SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - ! NOTE - not only is BladeLn2Mesh not a Sbiling of BladePtLoads, it is a line 2 mesh with different number of nodes - CALL Transfer_Point_to_Point( y_ExtLd%BladeLoad(k), u_ED%BladePtLoads(k), MeshMapData%ExtLd_P_2_BDED_B(k), ErrStat2, ErrMsg2, u_ExtLd%BladeMotion(k), y_ED%BladeLn2Mesh(k) ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO - - ELSE - !p_FAST%CompAero = Module_None - DO K = 1,SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - u_ED%BladePtLoads(K)%Force = 0.0_ReKi - u_ED%BladePtLoads(K)%Moment = 0.0_ReKi - END DO - - END IF - - END IF - - - u_ED%TowerPtLoads%Force = 0.0_ReKi - u_ED%TowerPtLoads%Moment = 0.0_ReKi - IF ( p_FAST%CompAero == Module_AD ) THEN - - IF ( y_AD%rotors(1)%TowerLoad%Committed ) THEN - CALL Transfer_Line2_to_Point( y_AD%rotors(1)%TowerLoad, u_ED%TowerPtLoads, MeshMapData%AD_L_2_ED_P_T, ErrStat2, ErrMsg2, u_AD%rotors(1)%TowerMotion, y_ED%TowerLn2Mesh ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF - - ELSE IF (p_FAST%CompAero == Module_ExtLd ) THEN - - IF ( y_ExtLd%TowerLoad%Committed ) THEN ! NOTE - not only is TowerLn2Mesh not a Sbiling of TowerPtLoads, it is a line 2 mesh with different number of nodes - call Transfer_Line2_to_point( y_AD%rotors(1)%TowerLoad, y_ExtLd%TowerLoadAD, MeshMapData%AD_L_2_ExtLd_T, ErrStat2, ErrMsg2, u_AD%rotors(1)%TowerMotion, u_ExtLd%TowerMotion ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - call ExtLd_ConvertOpDataForOpenFAST(y_ExtLd, u_ExtLd, m_ExtLd, p_ExtLd, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - CALL Transfer_Point_to_Point( y_ExtLd%TowerLoad, u_ED%TowerPtLoads, MeshMapData%ExtLd_P_2_ED_P_T, ErrStat2, ErrMsg2, u_ExtLd%TowerMotion, y_ED%TowerLn2Mesh ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF - - ELSE - u_ED%TowerPtLoads%Force = 0.0_ReKi - u_ED%TowerPtLoads%Moment = 0.0_ReKi - END IF - - ! Initialize here so because we may be adding loads from SrvD/NStC with AD nacelle drag: - u_ED%NacelleLoads%Force = 0.0_ReKi - u_ED%NacelleLoads%Moment = 0.0_ReKi - - ! ED inputs from ServoDyn - IF ( p_FAST%CompServo == Module_SrvD ) THEN - - u_ED%GenTrq = y_SrvD%GenTrq - u_ED%HSSBrTrqC = y_SrvD%HSSBrTrqC - u_ED%BlPitchCom = y_SrvD%BlPitchCom - u_ED%YawMom = y_SrvD%YawMom - ! u_ED%TBDrCon = y_SrvD%TBDrCon !array - - ! StrucCtrl loads - IF ( ALLOCATED(y_SrvD%NStCLoadMesh) ) THEN ! Nacelle - do j=1,size(y_SrvD%NStCLoadMesh) - IF (y_SrvD%NStCLoadMesh(j)%Committed) THEN - CALL Transfer_Point_to_Point( y_SrvD%NStCLoadMesh(j), MeshMapData%u_ED_NacelleLoads, MeshMapData%NStC_P_2_ED_P_N(j), ErrStat2, ErrMsg2, u_SrvD%NStCMotionMesh(j), y_ED%NacelleMotion ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//':u_ED%NacelleLoads' ) - u_ED%NacelleLoads%Force = u_ED%NacelleLoads%Force + MeshMapData%u_ED_NacelleLoads%Force - u_ED%NacelleLoads%Moment = u_ED%NacelleLoads%Moment + MeshMapData%u_ED_NacelleLoads%Moment - ENDIF - enddo - END IF - - IF ( ALLOCATED(y_SrvD%TStCLoadMesh) ) THEN ! Tower - do j=1,size(y_SrvD%TStCLoadMesh) - IF (y_SrvD%TStCLoadMesh(j)%Committed) THEN ! size 1 only for TStC - MeshMapData%u_ED_TowerPtLoads%Force = 0.0_ReKi - MeshMapData%u_ED_TowerPtLoads%Moment = 0.0_ReKi - CALL Transfer_Point_to_Point( y_SrvD%TStCLoadMesh(j), MeshMapData%u_ED_TowerPtLoads, MeshMapData%TStC_P_2_ED_P_T(j), ErrStat2, ErrMsg2, u_SrvD%TStCMotionMesh(j), y_ED%TowerLn2Mesh ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//':u_ED%TowerPtLoads' ) - do K = 1,u_ED%TowerPtLoads%Nnodes ! Loop through the tower nodes / elements - u_ED%TowerPtLoads%Force(:,K) = u_ED%TowerPtLoads%Force(:,K) + MeshMapData%u_ED_TowerPtLoads%Force(:,K) - u_ED%TowerPtLoads%Moment(:,K) = u_ED%TowerPtLoads%Moment(:,K) + MeshMapData%u_ED_TowerPtLoads%Moment(:,K) - enddo - ENDIF - enddo - ENDIF - - IF (p_FAST%CompElast == Module_ED) THEN - IF ( ALLOCATED(y_SrvD%BStCLoadMesh) ) THEN ! Blades - do j=1,size(y_SrvD%BStCLoadMesh,2) - DO K = 1,SIZE(u_ED%BladePtLoads,1) ! Loop through all blades (p_ED%NumBl) - IF (y_SrvD%BStCLoadMesh(k,j)%Committed) THEN - MeshMapData%u_ED_BladePtLoads(k)%Force = 0.0_ReKi - MeshMapData%u_ED_BladePtLoads(k)%Moment = 0.0_ReKi - CALL Transfer_Point_to_Point( y_SrvD%BStCLoadMesh(k,j), MeshMapData%u_ED_BladePtLoads(k), MeshMapData%BStC_P_2_ED_P_B(k,j), ErrStat2, ErrMsg2, u_SrvD%BStCMotionMesh(k,j), y_ED%BladeLn2Mesh(k) ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//':u_ED%BladePtLoads' ) - do I = 1,u_ED%BladePtLoads(k)%Nnodes ! Loop through the tower nodes / elements - u_ED%BladePtLoads(k)%Force(:,I) = u_ED%BladePtLoads(k)%Force(:,I) + MeshMapData%u_ED_BladePtLoads(k)%Force(:,I) - u_ED%BladePtLoads(k)%Moment(:,I) = u_ED%BladePtLoads(k)%Moment(:,I) + MeshMapData%u_ED_BladePtLoads(k)%Moment(:,I) - enddo - END IF - ENDDO - enddo - ENDIF - ENDIF - - IF ( p_FAST%CompSub /= Module_SD ) THEN ! Platform loads if not SD - IF ( ALLOCATED(y_SrvD%SStCLoadMesh) ) THEN ! Platform - do j=1,size(y_SrvD%SStCLoadMesh) - IF (y_SrvD%SStCLoadMesh(j)%Committed) THEN - CALL Transfer_Point_to_Point( y_SrvD%SStCLoadMesh(j), MeshMapData%SubstructureLoads_Tmp, MeshMapData%SStC_P_P_2_SubStructure(j), ErrStat2, ErrMsg2, u_SrvD%SStCMotionMesh(j), y_ED%PlatformPtMesh ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//':u_ED%PlatformPtMesh' ) - u_ED%PlatformPtMesh%Force = u_ED%PlatformPtMesh%Force + MeshMapData%SubstructureLoads_Tmp%Force - u_ED%PlatformPtMesh%Moment = u_ED%PlatformPtMesh%Moment + MeshMapData%SubstructureLoads_Tmp%Moment - ENDIF - enddo - ENDIF - ENDIF - END IF - - - - u_ED%TwrAddedMass = 0.0_ReKi - u_ED%PtfmAddedMass = 0.0_ReKi - - IF ( p_FAST%CompAero == Module_AD ) THEN ! we have to do this after the nacelle loads from StrucCtrl NStC - ! Transfer AeroDyn nacelle loads to ElastoDyn. Store on intermediate mesh from MeshMapData - IF ( u_AD%rotors(1)%NacelleMotion%Committed ) THEN - CALL Transfer_Point_to_Point( y_AD%rotors(1)%NacelleLoad, MeshMapData%u_ED_NacelleLoads, MeshMapData%AD_P_2_ED_P_N, ErrStat2, ErrMsg2, u_AD%rotors(1)%NacelleMotion, y_ED%NacelleMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - u_ED%NacelleLoads%Force = u_ED%NacelleLoads%Force + MeshMapData%u_ED_NacelleLoads%Force - u_ED%NacelleLoads%Moment = u_ED%NacelleLoads%Moment + MeshMapData%u_ED_NacelleLoads%Moment - END IF - ! Transfer AeroDyn TailFin loads to ElastoDyn - IF ( u_AD%rotors(1)%TFinMotion%Committed ) THEN - CALL Transfer_Point_to_Point( y_AD%rotors(1)%TFinLoad, u_ED%TFinCMLoads, MeshMapData%AD_P_2_ED_P_TF, ErrStat2, ErrMsg2, u_AD%rotors(1)%TFinMotion, y_ED%TFinCMMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF - END IF - - IF ( p_FAST%CompAero == Module_AD .and. p_FAST%MHK /= MHK_None .and. .not. (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1)) THEN - u_ED%HubPtLoad%Force = 0.0_ReKi - u_ED%HubPtLoad%Moment = 0.0_ReKi - IF ( u_AD%rotors(1)%HubMotion%Committed ) THEN - CALL Transfer_Point_to_Point( y_AD%rotors(1)%HubLoad, MeshMapData%u_ED_HubPtLoad, MeshMapData%AD_P_2_ED_P_H, ErrStat2, ErrMsg2, u_AD%rotors(1)%HubMotion, y_ED%HubPtMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - u_ED%HubPtLoad%Force = u_ED%HubPtLoad%Force + MeshMapData%u_ED_HubPtLoad%Force - u_ED%HubPtLoad%Moment = u_ED%HubPtLoad%Moment + MeshMapData%u_ED_HubPtLoad%Moment - END IF - END IF - - ! add damping in blades and tower for linearization convergence - if (p_FAST%CalcSteady) then - - ! note that this assumes sibling meshes for input and output (the ED bladeLn2Mesh has the same first same first BladePtLoads%NNodes nodes as BladePtLoads, so this is okay) - do j = 1,u_ED%TowerPtLoads%NNodes ! u_ED%TowerPtLoads%NNodes is two less than y_ED%TowerLn2Mesh%NNodes - u_ED%TowerPtLoads%Force(:,j) = u_ED%TowerPtLoads%Force(:,j) - p_FAST%Twr_Kdmp * y_ED%TowerLn2Mesh%TranslationVel(:,j) - end do + !---------------------------------------------------------------------- + ! Formulate right hand side (X_2, U) + !---------------------------------------------------------------------- - IF (p_FAST%CompElast == Module_ED) THEN - omega_c = y_ED%RotSpeed * y_ED%HubPtMotion%Orientation(1,:,1) - r_hub = y_ED%HubPtMotion%Position(:,1) + y_ED%HubPtMotion%TranslationDisp(:,1) - - do k=1,SIZE(u_ED%BladePtLoads,1) - do j = 1,u_ED%BladePtLoads(k)%NNodes - r = y_ED%BladeLn2Mesh(k)%Position(:,j) + y_ED%BladeLn2Mesh(k)%TranslationDisp(:,j) - r_hub - Vrot = cross_product(omega_c, r) - u_ED%BladePtLoads(k)%Force(:,j) = u_ED%BladePtLoads(k)%Force(:,j) - p_FAST%Bld_Kdmp * ( y_ED%BladeLn2Mesh(k)%TranslationVel(:,j) - Vrot ) - end do + ! Calculate continuous state derivatives for tight coupling modules + do i = 1, size(p%iModTC) + call FAST_GetOP(m%Mod%ModData(i), t_global_next, INPUT_CURR, STATE_PRED, Turbine, ErrStat2, ErrMsg2, & + dx_op=m%Mod%ModData(i)%Lin%dx, dx_glue=m%Mod%Lin%dx) + if (Failed()) return end do - END IF - end if -END SUBROUTINE ED_InputSolve - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for SED--using the Option 2 solve method; currently the only input not solved in this routine -!! are the fields on PlatformPtMesh and HubPtLoad, which are solved in option 1. -SUBROUTINE SED_InputSolve( p_FAST, u_SED, y_SED, y_AD, y_ADsk, y_SrvD, u_AD, u_ADsk, u_SrvD, MeshMapData, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - TYPE(SED_InputType), INTENT(INOUT) :: u_SED !< SED Inputs at t - TYPE(SED_OutputType), INTENT(INOUT) :: y_SED !< Simplified-ElastoDyn outputs (need translation displacement on meshes for loads mapping) - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< AeroDyn outputs - TYPE(ADsk_OutputType), INTENT(IN ) :: y_ADsk !< AeroDisk outputs - TYPE(AD_InputType), INTENT(IN ) :: u_AD !< AD inputs (for AD-ED load transfer) - TYPE(ADsk_InputType), INTENT(IN ) :: u_ADsk !< ADsk inputs (for ADsk-ED load transfer) - TYPE(SrvD_OutputType), INTENT(IN ) :: y_SrvD !< ServoDyn outputs - TYPE(SrvD_InputType), INTENT(IN ) :: u_SrvD !< ServoDyn inputs - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message - - INTEGER(IntKi) :: k ! Loops through blades - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SED_InputSolve' - ErrStat = ErrID_None - ErrMsg = "" + ! Input solve for tight coupling modules + do i = 1, size(p%iModTC) + call FAST_InputSolve(p%iModTC(i), GlueModData, GlueModMaps, INPUT_TEMP, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + ! Input solve for Option 1 modules + do i = 1, size(p%iModOpt1) + call FAST_InputSolve(p%iModOpt1(i), GlueModData, GlueModMaps, INPUT_TEMP, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + ! Transfer inputs into uCalc + do i = 1, size(m%Mod%ModData) + call FAST_GetOP(m%Mod%ModData(i), t_global_next, INPUT_TEMP, STATE_PRED, Turbine, ErrStat2, ErrMsg2, & + u_op=m%Mod%ModData(i)%Lin%u, u_glue=m%uCalc) + if (Failed()) return + end do + + !---------------------------------------------------------------------- + ! Formulate Jacobian + !---------------------------------------------------------------------- + + ! If number of iterations or steps until Jacobian is to be updated + ! is zero or less, or first solution step, then rebuild the Jacobian. + ! Note: BuildJacobian resets these counters. + if ((m%UJacIterRemain <= 0) .or. (m%UJacStepsRemain <= 0)) then + NumUJac = NumUJac + 1 + call BuildJacobianTC(p, m, GlueModMaps, t_global_next, STATE_PRED, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end if + + !---------------------------------------------------------------------- + ! Populate residual vector and apply conditioning to loads + !---------------------------------------------------------------------- - !----------- - ! Aero Loads - !----------- - u_SED%HubPtLoad%Force = 0.0_ReKi - u_SED%HubPtLoad%Moment = 0.0_ReKi + ! Calculate difference between calculated and predicted accelerations + if (p%iJX(1) > 0) m%XB(p%iJX(1):p%iJX(2), 1) = m%Mod%Lin%dx(p%iX2(1):p%iX2(2)) - m%StatePred%vd - if (p_FAST%CompAero == Module_AD) then + ! Calculate difference in U for all Option 1 modules (un - u_tmp) + ! and add to RHS for TC and Option 1 modules + if (p%iJU(1) > 0) call MV_ComputeDiff(m%Mod%Vars%u, m%uCalc, m%Mod%Lin%u, m%XB(p%iJU(1):p%iJU(2), 1)) - ! AD --> SED hub - do k=1,size(y_AD%rotors(1)%BladeLoad) - !u_BD_RootMotion and y_ED2%HubPtMotion contain the displaced positions for load calculations - CALL Transfer_Line2_to_Point( y_AD%rotors(1)%BladeLoad(k), MeshMapData%u_SED_HubPtLoad, MeshMapData%AD_L_2_SED_P(k), ErrStat2, ErrMsg2, u_AD%rotors(1)%BladeMotion(k), y_SED%HubPtMotion) + ! Apply conditioning factor to loads in RHS + if (p%iJL(1) > 0) m%XB(p%iJL(1):p%iJL(2), 1) = m%XB(p%iJL(1):p%iJL(2), 1)/p%Scale_UJac + + !---------------------------------------------------------------------- + ! Solve for state and input perturbations + !---------------------------------------------------------------------- + + ! Solve Jacobian and RHS + call LAPACK_getrs('N', p%NumJ, m%Mod%Lin%J, m%IPIV, m%XB, ErrStat2, ErrMsg2) if (Failed()) return - u_SED%HubPtLoad%Force = u_SED%HubPtLoad%Force + MeshMapData%u_SED_HubPtLoad%Force - u_SED%HubPtLoad%Moment = u_SED%HubPtLoad%Moment + MeshMapData%u_SED_HubPtLoad%Moment - end do - elseif (p_FAST%CompAero == Module_ADsk) then + !---------------------------------------------------------------------- + ! Check perturbations for convergence and exit if below tolerance + !---------------------------------------------------------------------- - ! ADsk --> SED hub - CALL Transfer_Point_to_Point( y_ADsk%AeroLoads, u_SED%HubPtLoad, MeshMapData%ADsk_P_2_SED_P_H, ErrStat2, ErrMsg2, u_ADsk%HubMotion, y_SED%HubPtMotion ) - if (Failed()) return + ! Calculate average L2 norm of change in states and inputs + ConvError = TwoNorm(m%XB(:, 1))/size(m%XB) - endif + ! Write step debug info if requested + if (DebugSolver) call Solver_Step_Debug(p, m, n_t_global_next, CorrIter, ConvIter, ConvError) + ! If at least one convergence iteration has been done and + ! the RHS norm is less than convergence tolerance, exit loop + if ((ConvIter > 0) .and. (ConvError < p%ConvTol)) exit - !----------- - ! Controls - !----------- - if ( p_FAST%CompServo == Module_SrvD ) then - u_SED%GenTrq = y_SrvD%GenTrq - u_SED%HSSBrTrqC = y_SrvD%HSSBrTrqC - u_SED%BlPitchCom = y_SrvD%BlPitchCom - u_SED%YawPosCom = y_SrvD%YawPosCom - u_SED%YawRateCom = y_SrvD%YawRateCom - endif + ! Remove load condition conditioning on input changes + if (p%iJL(1) > 0) m%XB(p%iJL(1):p%iJL(2), 1) = m%XB(p%iJL(1):p%iJL(2), 1)*p%Scale_UJac -contains - logical function Failed() - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - Failed = ErrStat >= AbortErrLev - !if (Failed) call CleanUp() - end function Failed -END SUBROUTINE SED_InputSolve - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine determines the points in space where InflowWind needs to compute wind speeds. -SUBROUTINE IfW_InputSolve( p_FAST, m_FAST, u_IfW, p_IfW, u_AD, OtherSt_AD, y_ED,y_SED, ErrStat, ErrMsg ) - TYPE(InflowWind_InputType), INTENT(INOUT) :: u_IfW !< The inputs to InflowWind - TYPE(InflowWind_ParameterType), INTENT(IN ) :: p_IfW !< The parameters to InflowWind - TYPE(AD_InputType), INTENT(IN) :: u_AD !< The input meshes (already calculated) from AeroDyn - TYPE(AD_OtherStateType), INTENT(IN) :: OtherSt_AD !< The wake points from AeroDyn are in here (Free Vortex Wake) - TYPE(ED_OutputType), INTENT(IN) :: y_ED !< The outputs of the structural dynamics module (for IfW Lidar) - TYPE(SED_OutputType), INTENT(IN ) :: y_SED !< The outputs of the structural dynamics module (for IfW Lidar) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< misc FAST data, including inputs from external codes like Simulink - - INTEGER(IntKi) :: ErrStat !< Error status of the operation - CHARACTER(*) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - - INTEGER(IntKi) :: J ! Loops through nodes / elements. - INTEGER(IntKi) :: K ! Loops through blades. - INTEGER(IntKi) :: Node ! Node number for blade/node on mesh + !---------------------------------------------------------------------- + ! TC: Modify States + !---------------------------------------------------------------------- + if (p%iJX(1) > 0) call UpdateStatePrediction(p, m%Mod%Vars, m%XB(p%iJX(1):p%iJX(2), 1), m%StatePred) - ErrStat = ErrID_None - ErrMsg = "" - - - ! Fill input array for InflowWind - - Node = 0 - IF (p_FAST%CompServo == MODULE_SrvD) THEN - Node = Node + 1 - if (p_FAST%CompElast == Module_SED) then - u_IfW%PositionXYZ(:,Node) = y_SED%HubPtMotion%Position(:,1) - else - u_IfW%PositionXYZ(:,Node) = y_ED%HubPtMotion%Position(:,1) ! undisplaced position. Maybe we want to use the displaced position (y_ED%HubPtMotion%TranslationDisp) at some point in time. - endif - END IF - - !FIXME: is DiskVel still used? The following is used in DiskVel calculations - if (p_FAST%CompElast == Module_SED) then - u_IfW%HubPosition = y_SED%HubPtMotion%Position(:,1) + y_SED%HubPtMotion%TranslationDisp(:,1) - u_IfW%HubOrientation = y_SED%HubPtMotion%Orientation(:,:,1) - else - u_IfW%HubPosition = y_ED%HubPtMotion%Position(:,1) + y_ED%HubPtMotion%TranslationDisp(:,1) - u_IfW%HubOrientation = y_ED%HubPtMotion%Orientation(:,:,1) - endif - - - IF ( p_FAST%MHK /= MHK_None ) THEN - u_IfW%PositionXYZ(3,:) = u_IfW%PositionXYZ(3,:) + p_FAST%WtrDpth - ENDIF - -END SUBROUTINE IfW_InputSolve - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets all the AeroDyn inputs, except for the wind inflow values. -SUBROUTINE AD_InputSolve_NoIfW( p_FAST, u_AD, y_SrvD, y_ED, y_SED, BD, MeshMapData, ErrStat, ErrMsg ) - - ! Passed variables - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< The inputs to AeroDyn14 - TYPE(SrvD_OutputType), INTENT(IN ) :: y_SrvD !< ServoDyn outputs - TYPE(ED_OutputType), INTENT(IN) :: y_ED !< The outputs from the structural dynamics module ED - TYPE(SED_OutputType), INTENT(IN) :: y_SED !< The outputs from the structural dynamics module SED - TYPE(BeamDyn_Data), INTENT(IN) :: BD !< The data from BeamDyn (want the outputs only, but it's in an array) - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi) :: ErrStat !< Error status of the operation - CHARACTER(*) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! Local variables: - - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: k_bl ! Loops through blades - INTEGER(IntKi) :: k_bn ! Loops through blade nodes - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'AD_InputSolve_NoIfW' - - - ErrStat = ErrID_None - ErrMsg = "" - - - !------------------------------------------------------------------------------------------------- - ! Set the inputs from ElastoDyn and/or BeamDyn: - !------------------------------------------------------------------------------------------------- - - ! tower - IF (u_AD%rotors(1)%TowerMotion%Committed) then - if (y_SED%TowerLn2Mesh%Committed) then - CALL Transfer_Line2_to_Line2( y_SED%TowerLn2Mesh, u_AD%rotors(1)%TowerMotion, MeshMapData%SED_L_2_AD_L_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%TowerMotion' ) - elseif (y_ED%TowerLn2Mesh%Committed) then - CALL Transfer_Line2_to_Line2( y_ED%TowerLn2Mesh, u_AD%rotors(1)%TowerMotion, MeshMapData%ED_L_2_AD_L_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%TowerMotion' ) - endif - END IF - - - ! hub - if (p_FAST%CompElast == Module_SED) then - CALL Transfer_Point_to_Point( y_SED%HubPtMotion, u_AD%rotors(1)%HubMotion, MeshMapData%SED_P_2_AD_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%HubMotion' ) - else - CALL Transfer_Point_to_Point( y_ED%HubPtMotion, u_AD%rotors(1)%HubMotion, MeshMapData%ED_P_2_AD_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%HubMotion' ) - endif - - - ! blade root - if (p_FAST%CompElast == Module_SED) then - DO k=1,size(y_SED%BladeRootMotion) - CALL Transfer_Point_to_Point( y_SED%BladeRootMotion(k), u_AD%rotors(1)%BladeRootMotion(k), MeshMapData%SED_P_2_AD_P_R(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeRootMotion('//trim(num2lstr(k))//')' ) - END DO - else - DO k=1,size(y_ED%BladeRootMotion) - CALL Transfer_Point_to_Point( y_ED%BladeRootMotion(k), u_AD%rotors(1)%BladeRootMotion(k), MeshMapData%ED_P_2_AD_P_R(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeRootMotion('//trim(num2lstr(k))//')' ) - END DO - endif - - - ! blades - IF (p_FAST%CompElast == Module_SED) THEN - ! get rigid motion from SED - DO k=1,size(u_AD%rotors(1)%BladeMotion) - CALL Transfer_Point_to_Line2( y_SED%BladeRootMotion(k), u_AD%rotors(1)%BladeMotion(k), MeshMapData%SED_P_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - - ELSEIF (p_FAST%CompElast == Module_ED ) THEN - - DO k=1,size(y_ED%BladeLn2Mesh) - CALL Transfer_Line2_to_Line2( y_ED%BladeLn2Mesh(k), u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - - ELSEIF (p_FAST%CompElast == Module_BD ) THEN - - ! get them from BeamDyn - DO k=1,size(u_AD%rotors(1)%BladeMotion) - CALL Transfer_Line2_to_Line2( BD%y(k)%BldMotion, u_AD%rotors(1)%BladeMotion(k), MeshMapData%BDED_L_2_AD_L_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_AD%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - - END IF - - ! nacelle - IF (u_AD%rotors(1)%NacelleMotion%Committed) THEN - if (p_FAST%CompElast == Module_SED) then - CALL Transfer_Point_to_Point( y_SED%NacelleMotion, u_AD%rotors(1)%NacelleMotion, MeshMapData%SED_P_2_AD_P_N, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - else - CALL Transfer_Point_to_Point( y_ED%NacelleMotion, u_AD%rotors(1)%NacelleMotion, MeshMapData%ED_P_2_AD_P_N, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - endif - END IF - - ! Tailfin - Transfer ElastoDyn CM motion to AeroDyn ref point motion - IF (u_AD%rotors(1)%TFinMotion%Committed) THEN - CALL Transfer_Point_to_Point( y_ED%TFinCMMotion, u_AD%rotors(1)%TFinMotion, MeshMapData%ED_P_2_AD_P_TF, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF - - - - - ! Set Control parameter (i.e. flaps) if using ServoDyn - ! bem: This takes in flap deflection for each blade (only one flap deflection angle per blade), - ! from ServoDyn (which comes from Bladed style DLL controller) - ! Commanded Airfoil UserProp for blade (must be same units as given in AD15 airfoil tables) - ! This is passed to AD15 to be interpolated with the airfoil table userprop column - ! (might be used for airfoil flap angles for example) - if (p_FAST%CompServo == Module_SrvD) then - DO k_bl=1,size(u_AD%rotors(1)%UserProp,DIM=2) - DO k_bn=1,size(u_AD%rotors(1)%UserProp,DIM=1) - u_AD%rotors(1)%UserProp(k_bn , k_bl) = y_SrvD%BlAirfoilCom(k_bl) ! Must be same units as given in airfoil (no unit conversions handled in code) - END DO - END DO - endif - - -END SUBROUTINE AD_InputSolve_NoIfW -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets all the ExtLoads inputs, except for the wind inflow values. -SUBROUTINE ExtLd_InputSolve_NoIfW( p_FAST, u_ExtLd, p_ExtLd, y_ED, BD, MeshMapData, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< FAST parameter data - TYPE(ExtLd_InputType), INTENT(INOUT) :: u_ExtLd !< The inputs to ExtLoads - TYPE(ExtLd_ParameterType), INTENT(IN) :: p_ExtLd !< The parameters of ExtLoads - TYPE(ED_OutputType), INTENT(IN) :: y_ED !< The outputs from the structural dynamics module - TYPE(BeamDyn_Data), INTENT(IN) :: BD !< The data from BeamDyn (want the outputs only, but it's in an array) - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi) :: ErrStat !< Error status of the operation - CHARACTER(*) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: K ! Loops through blades - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'AD_InputSolve_NoIfW' + !---------------------------------------------------------------------- + ! TC and Option 1: Modify Inputs + !---------------------------------------------------------------------- - ErrStat = ErrID_None - ErrMsg = "" - - !------------------------------------------------------------------------------------------------- - ! Set the inputs from ElastoDyn and/or BeamDyn: - !------------------------------------------------------------------------------------------------- - - ! tower - IF (u_ExtLd%TowerMotion%Committed) THEN - CALL Transfer_Line2_to_Point( y_ED%TowerLn2Mesh, u_ExtLd%TowerMotion, MeshMapData%ED_L_2_ExtLd_P_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_ExtLd%TowerMotion' ) - END IF - - ! hub - CALL Transfer_Point_to_Point( y_ED%HubPtMotion, u_ExtLd%HubMotion, MeshMapData%ED_P_2_ExtLd_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_ExtLd%HubMotion' ) - - ! blade root - DO k=1,size(y_ED%BladeRootMotion) - CALL Transfer_Point_to_Point( y_ED%BladeRootMotion(k), u_ExtLd%BladeRootMotion(k), MeshMapData%ED_P_2_ExtLd_P_R(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_ExtLd%BladeRootMotion('//trim(num2lstr(k))//')' ) - END DO - - ! blades - IF (p_FAST%CompElast == Module_ED ) THEN - - DO k=1,size(y_ED%BladeLn2Mesh) - CALL Transfer_Line2_to_Point( y_ED%BladeLn2Mesh(k), u_ExtLd%BladeMotion(k), MeshMapData%BDED_L_2_ExtLd_P_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_ExtLd%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - - ELSEIF (p_FAST%CompElast == Module_BD ) THEN ! get them from BeamDyn - - DO k=1,size(u_ExtLd%BladeMotion) - CALL Transfer_Line2_to_Point( BD%y(k)%BldMotion, u_ExtLd%BladeMotion(k), MeshMapData%BDED_L_2_ExtLd_P_B(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//':u_ExtLd%BladeMotion('//trim(num2lstr(k))//')' ) - END DO - - END IF - - u_ExtLd%az = y_ED%LSSTipPxa - u_ExtLd%DX_u%bldPitch(:) = y_ED%BlPitch - - call ExtLd_ConvertInpDataForExtProg(u_ExtLd, p_ExtLd, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - -END SUBROUTINE ExtLd_InputSolve_NoIfW - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets all the AeroDisk, except for the wind inflow values. -SUBROUTINE ADsk_InputSolve_NoIfW( p_FAST, u_ADsk, y_ED, y_SED, MeshMapData, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< parameter FAST data - TYPE(ADsk_InputType), INTENT(INOUT) :: u_ADsk !< The inputs to AeroDyn14 - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< The outputs from the structural dynamics module - TYPE(SED_OutputType), INTENT(IN ) :: y_SED !< The outputs from the structural dynamics module - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), intent( out) :: ErrStat !< Error status of the operation - CHARACTER(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ErrStat = ErrID_None - ErrMsg = "" - - !------------------------------------------------------------------------------------------------- - ! Hub positions, orientations, and velocities: - !------------------------------------------------------------------------------------------------- - if (p_FAST%CompElast == Module_SED) then - CALL Transfer_Point_to_Point( y_SED%HubPtMotion, u_ADsk%HubMotion, MeshMapData%SED_P_2_ADsk_P_H, ErrStat, ErrMsg ) - u_ADsk%RotSpeed = y_SED%RotSpeed - u_ADsk%BlPitch = y_SED%BlPitch(1) ! ADsk only uses collective blade pitch - else - CALL Transfer_Point_to_Point( y_ED%HubPtMotion, u_ADsk%HubMotion, MeshMapData%ED_P_2_ADsk_P_H, ErrStat, ErrMsg ) - u_ADsk%RotSpeed = y_ED%RotSpeed - u_ADsk%BlPitch = y_ED%BlPitch(1) ! ADsk only uses collective blade pitch - endif - -END SUBROUTINE ADsk_InputSolve_NoIfW - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for ServoDyn -SUBROUTINE SrvD_InputSolve( p_FAST, m_FAST, u_SrvD, y_ED, y_SED, y_IfW, y_ExtInfw, p_ExtLd, y_BD, y_SD, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - - TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_MiscVarType), INTENT(IN) :: m_FAST !< Glue-code misc variables (including inputs from external sources like Simulink) - TYPE(SrvD_InputType), INTENT(INOUT) :: u_SrvD !< ServoDyn Inputs at t - TYPE(ED_OutputType),TARGET, INTENT(IN) :: y_ED !< ElastoDyn outputs - TYPE(SED_OutputType),TARGET, INTENT(IN) :: y_SED !< Simplified-ElastoDyn outputs - TYPE(InflowWind_OutputType), INTENT(IN) :: y_IfW !< InflowWind outputs - TYPE(ExtInfw_OutputType), INTENT(IN) :: y_ExtInfw !< ExternalInflow outputs - TYPE(ExtLd_ParameterType), INTENT(in) :: p_ExtLd !< Parameters of ExtLoads - TYPE(BD_OutputType), INTENT(IN) :: y_BD(:) !< BD Outputs - TYPE(SD_OutputType),TARGET, INTENT(IN) :: y_SD !< SD Outputs - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message -! TYPE(AD_OutputType), INTENT(IN) :: y_AD !< AeroDyn outputs - - INTEGER(IntKi) :: k ! blade loop counter - INTEGER(IntKi) :: j ! StC instance counter - TYPE(MeshType), POINTER :: SubStructureMotion - real(ReKi) :: z !< Local 'z' coordinate - real(ReKi) :: u !< Local u velocity - real(ReKi) :: v !< Local v velocity - real(ReKi) :: mean_vel !< Local mean velocity - real(ReKi) :: pi !< Our favorite number - - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SrvD_InputSolve' - - if (p_FAST%CompElast == Module_SED) then - SubStructureMotion => y_SED%PlatformPtMesh - elseif (p_FAST%CompSub == Module_SD) then - SubStructureMotion => y_SD%y3Mesh - else - SubStructureMotion => y_ED%PlatformPtMesh - endif + ! Add change in inputs + if (p%iJU(1) > 0) call MV_AddDelta(m%Mod%Vars%u, m%XB(p%iJU(1):p%iJU(2), 1), m%Mod%Lin%u) - ErrStat = ErrID_None - ErrMsg = "" - - ! Calculate horizontal hub-height wind direction (positive about zi-axis); these are - ! zero if there is no wind input when InflowWind is not used: - - IF ( p_FAST%CompInflow == Module_IfW ) THEN - - u_SrvD%WindDir = ATAN2( y_IfW%VelocityUVW(2,1), y_IfW%VelocityUVW(1,1) ) - u_SrvD%HorWindV = SQRT( y_IfW%VelocityUVW(1,1)**2 + y_IfW%VelocityUVW(2,1)**2 ) - if (allocated(y_IfW%lidar%LidSpeed )) u_SrvD%LidSpeed = y_IfW%lidar%LidSpeed - if (allocated(y_IfW%lidar%MsrPositionsX)) u_SrvD%MsrPositionsX = y_IfW%lidar%MsrPositionsX - if (allocated(y_IfW%lidar%MsrPositionsY)) u_SrvD%MsrPositionsY = y_IfW%lidar%MsrPositionsY - if (allocated(y_IfW%lidar%MsrPositionsZ)) u_SrvD%MsrPositionsZ = y_IfW%lidar%MsrPositionsZ - - ELSEIF ( p_FAST%CompInflow == Module_ExtInfw ) THEN - - u_SrvD%WindDir = ATAN2( y_ExtInfw%v(1), y_ExtInfw%u(1) ) - u_SrvD%HorWindV = SQRT( y_ExtInfw%u(1)**2 + y_ExtInfw%v(1)**2 ) - if (allocated(u_SrvD%LidSpeed )) u_SrvD%LidSpeed = 0.0 - if (allocated(u_SrvD%MsrPositionsX)) u_SrvD%MsrPositionsX = 0.0 - if (allocated(u_SrvD%MsrPositionsY)) u_SrvD%MsrPositionsY = 0.0 - if (allocated(u_SrvD%MsrPositionsz)) u_SrvD%MsrPositionsz = 0.0 - - ELSE ! No wind inflow - - u_SrvD%WindDir = 0.0 - u_SrvD%HorWindV = 0.0 - if (allocated(u_SrvD%LidSpeed )) u_SrvD%LidSpeed = 0.0 - if (allocated(u_SrvD%MsrPositionsX)) u_SrvD%MsrPositionsX = 0.0 - if (allocated(u_SrvD%MsrPositionsY)) u_SrvD%MsrPositionsY = 0.0 - if (allocated(u_SrvD%MsrPositionsz)) u_SrvD%MsrPositionsz = 0.0 - ENDIF - - - - if (p_FAST%CompElast == Module_SED) then - ! ServoDyn inputs from combination of InflowWind and ElastoDyn - u_SrvD%YawAngle = y_SED%Yaw !nacelle yaw (platform rigid) - u_SrvD%YawErr = u_SrvD%WindDir - u_SrvD%YawAngle ! the nacelle yaw error estimate (positive about zi-axis) - - ! ServoDyn inputs from Simplified-ElastoDyn - u_SrvD%Yaw = y_SED%Yaw !nacelle yaw - u_SrvD%YawRate = y_SED%YawRate - u_SrvD%LSS_Spd = y_SED%RotSpeed - u_SrvD%HSS_Spd = y_SED%HSS_Spd - u_SrvD%RotSpeed = y_SED%RotSpeed - u_SrvD%BlPitch = y_SED%BlPitch - - ! root moments - u_SrvD%RootMxc = 0.0_ReKi ! y_ED%RootMxc ! fixed-size arrays: always size 3 - u_SrvD%RootMyc = 0.0_ReKi ! y_ED%RootMyc ! fixed-size arrays: always size 3 - - u_SrvD%YawBrTAxp = 0.0_ReKi ! y_ED%YawBrTAxp - u_SrvD%YawBrTAyp = 0.0_ReKi ! y_ED%YawBrTAyp - u_SrvD%LSSTipPxa = y_SED%LSSTipPxa - - u_SrvD%LSSTipMxa = y_SED%RotTrq - u_SrvD%LSSTipMya = 0.0_ReKi ! y_ED%LSSTipMya - u_SrvD%LSSTipMza = 0.0_ReKi ! y_ED%LSSTipMza - u_SrvD%LSSTipMys = 0.0_ReKi ! y_ED%LSSTipMys - u_SrvD%LSSTipMzs = 0.0_ReKi ! y_ED%LSSTipMzs - - u_SrvD%YawBrMyn = 0.0_ReKi ! y_ED%YawBrMyn - u_SrvD%YawBrMzn = 0.0_ReKi ! y_ED%YawBrMzn - u_SrvD%NcIMURAxs = 0.0_ReKi ! y_ED%NcIMURAxs - u_SrvD%NcIMURAys = 0.0_ReKi ! y_ED%NcIMURAys - u_SrvD%NcIMURAzs = 0.0_ReKi ! y_ED%NcIMURAzs - - u_SrvD%RotPwr = y_SED%RotPwr - - u_SrvD%LSShftFxa = 0.0_ReKi ! y_ED%LSShftFxa - u_SrvD%LSShftFys = 0.0_ReKi ! y_ED%LSShftFys - u_SrvD%LSShftFzs = 0.0_ReKi ! y_ED%LSShftFzs + !---------------------------------------------------------------------- + ! TC and Option 1: Transfer updated states and inputs to modules + !---------------------------------------------------------------------- - else - - ! ServoDyn inputs from combination of InflowWind and ElastoDyn - - u_SrvD%YawAngle = y_ED%YawAngle !nacelle yaw plus platform yaw - u_SrvD%YawErr = u_SrvD%WindDir - u_SrvD%YawAngle ! the nacelle yaw error estimate (positive about zi-axis) - - - ! ServoDyn inputs from ElastoDyn - u_SrvD%Yaw = y_ED%Yaw !nacelle yaw - u_SrvD%YawRate = y_ED%YawRate - u_SrvD%BlPitch = y_ED%BlPitch - u_SrvD%LSS_Spd = y_ED%LSS_Spd - u_SrvD%HSS_Spd = y_ED%HSS_Spd - u_SrvD%RotSpeed = y_ED%RotSpeed - - IF ( p_FAST%CompElast == Module_BD ) THEN - - ! translate "b" system output from BD into "c" system for SrvD - do k=1,p_FAST%nBeams - u_SrvD%RootMxc(k) = y_BD(k)%RootMxr*COS(y_ED%BlPitch(k)) + y_BD(k)%RootMyr*SIN(y_ED%BlPitch(k)) - u_SrvD%RootMyc(k) = -y_BD(k)%RootMxr*SIN(y_ED%BlPitch(k)) + y_BD(k)%RootMyr*COS(y_ED%BlPitch(k)) + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + + ! Transfer States to linearization array + call TransferQtoX(ModData, m%StatePred, m%Mod%Lin%x) + + ! Transfer states and inputs to modules + call FAST_SetOP(ModData, INPUT_CURR, STATE_PRED, Turbine, ErrStat2, ErrMsg2, & + x_op=ModData%Lin%x, x_glue=m%Mod%Lin%x, & + u_op=ModData%Lin%u, u_glue=m%Mod%Lin%u) + if (Failed()) return + + ! Transfer accelerations to BeamDyn + ! if (ModData%ID == Module_BD) then + ! call SetBDAccel(ModData, m%StatePred, Turbine%BD%OtherSt(ModData%Ins, STATE_PRED)) + ! end if + + end associate end do - - ELSE - u_SrvD%RootMxc = y_ED%RootMxc ! fixed-size arrays: always size 3 - u_SrvD%RootMyc = y_ED%RootMyc ! fixed-size arrays: always size 3 - END IF - - - u_SrvD%YawBrTAxp = y_ED%YawBrTAxp - u_SrvD%YawBrTAyp = y_ED%YawBrTAyp - u_SrvD%LSSTipPxa = y_ED%LSSTipPxa - - u_SrvD%LSSTipMxa = y_ED%LSSTipMxa - u_SrvD%LSSTipMya = y_ED%LSSTipMya - u_SrvD%LSSTipMza = y_ED%LSSTipMza - u_SrvD%LSSTipMys = y_ED%LSSTipMys - u_SrvD%LSSTipMzs = y_ED%LSSTipMzs - - u_SrvD%YawBrMyn = y_ED%YawBrMyn - u_SrvD%YawBrMzn = y_ED%YawBrMzn - u_SrvD%NcIMURAxs = y_ED%NcIMURAxs - u_SrvD%NcIMURAys = y_ED%NcIMURAys - u_SrvD%NcIMURAzs = y_ED%NcIMURAzs - - u_SrvD%RotPwr = y_ED%RotPwr - - u_SrvD%LSShftFxa = y_ED%LSShftFxa - u_SrvD%LSShftFys = y_ED%LSShftFys - u_SrvD%LSShftFzs = y_ED%LSShftFzs - - ! ! ServoDyn inputs from AeroDyn - !IF ( p_FAST%CompAero == Module_AD ) THEN - !ELSE - !END IF - ! - endif ! SED/ED - - ! Platform motion mesh to pass to DLL -- NOTE: this is only the transition piece motion, and only passed when DLL is used - IF (y_ED%PlatformPtMesh%Committed .and. u_SrvD%PtfmMotionMesh%Committed ) THEN - CALL Transfer_Point_to_Point( y_ED%PlatformPtMesh, u_SrvD%PtfmMotionMesh, MeshMapData%ED_P_2_SrvD_P_P, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ENDIF - - - ! StrucCtrl input motion meshes - IF ( ALLOCATED(u_SrvD%NStCMotionMesh) ) THEN - do j = 1,size(u_SrvD%NStCMotionMesh) - IF (u_SrvD%NStCMotionMesh(j)%Committed) THEN - CALL Transfer_Point_to_Point( y_ED%NacelleMotion, u_SrvD%NStCMotionMesh(j), MeshMapData%ED_P_2_NStC_P_N(j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ENDIF - enddo - ENDIF - - IF ( ALLOCATED(u_SrvD%TStCMotionMesh) ) THEN - do j=1,size(u_SrvD%TStCMotionMesh) - IF (u_SrvD%TStCMotionMesh(j)%Committed) THEN - CALL Transfer_Line2_to_Point( y_ED%TowerLn2Mesh, u_SrvD%TStCMotionMesh(j), MeshMapData%ED_L_2_TStC_P_T(j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ENDIF - enddo - ENDIF - - ! Blade StrucCtrl - IF ( p_FAST%CompElast == Module_ED ) then - IF ( ALLOCATED(u_SrvD%BStCMotionMesh) ) THEN - do j=1,size(u_SrvD%BStCMotionMesh,2) - DO K = 1,SIZE(y_ED%BladeLn2Mesh,1) - IF (u_SrvD%BStCMotionMesh(K,j)%Committed) THEN - CALL Transfer_Line2_to_Point( y_ED%BladeLn2Mesh(K), u_SrvD%BStCMotionMesh(K,j), MeshMapData%ED_L_2_BStC_P_B(K,j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ENDIF - ENDDO - enddo - ENDIF - ELSEIF ( p_FAST%CompElast == Module_BD ) THEN - IF ( ALLOCATED(u_SrvD%BStCMotionMesh) ) THEN - do j=1,size(u_SrvD%BStCMotionMesh,2) - DO K = 1,SIZE(y_BD,1) - IF (u_SrvD%BStCMotionMesh(K,j)%Committed) THEN - CALL Transfer_Line2_to_Point( y_BD(k)%BldMotion, u_SrvD%BStCMotionMesh(K,j), MeshMapData%BD_L_2_BStC_P_B(K,j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ENDIF - ENDDO - enddo - ENDIF - ENDIF - - ! Platform - IF ( p_FAST%CompSub /= Module_None ) THEN - call Transfer_Substructure_to_SStC( u_SrvD, SubStructureMotion, MeshMapData, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF - - ! Transfer any cable length info from SD or MD - ! --> SrvD, SD, and MD are not setup for this yet. Add here if feedback is ever required - -#ifdef SIMULINK_TIMESHIFT - ! we're going to use the extrapolated values instead of the old values (Simulink inputs are from t, not t+dt) - CALL SrvD_SetExternalInputs( p_FAST, m_FAST, u_SrvD ) -#endif - - -END SUBROUTINE SrvD_InputSolve -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs for the SrvD%SStC mesh motion from SubDyn -SUBROUTINE Transfer_Substructure_to_SStC( u_SrvD, SubstructureMotionMesh, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - TYPE(SrvD_InputType), INTENT(INOUT) :: u_SrvD !< ServoDyn input - TYPE(MeshType), INTENT(IN ) :: SubstructureMotionMesh !< The outputs of the structural dynamics module - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - integer(IntKi) :: j ! Generic counter - - ErrStat = ErrID_None - ErrMsg = '' - !---------------------------------------------------------------------------------------------------- - ! Map SubDyn or ElastoDyn platform point mesh motion to ServoDyn/SStC point mesh -- motions - !---------------------------------------------------------------------------------------------------- - ! motions: - IF ( ALLOCATED(u_SrvD%SStCMotionMesh) ) THEN - do j=1,size(u_SrvD%SStCMotionMesh) - IF (u_SrvD%SStCMotionMesh(j)%Committed) THEN - CALL Transfer_Point_to_Point( SubstructureMotionMesh, u_SrvD%SStCMotionMesh(j), MeshMapData%SubStructure_2_SStC_P_P(j), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'Transfer_Substructure_to_SStC') - ENDIF - enddo - ENDIF -END SUBROUTINE Transfer_Substructure_to_SStC -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for ServoDyn from an external source (Simulink) -SUBROUTINE SrvD_SetExternalInputs( p_FAST, m_FAST, u_SrvD ) -!.................................................................................................................................. - - TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_MiscVarType), INTENT(IN) :: m_FAST !< Glue-code misc variables (including inputs from external sources like Simulink) - TYPE(SrvD_InputType), INTENT(INOUT) :: u_SrvD !< ServoDyn Inputs at t - - ! local variables - INTEGER(IntKi) :: i ! loop counter - - ! we are going to use extrapolated values because these external values from Simulink are at n instead of n+1 - u_SrvD%ExternalGenTrq = m_FAST%ExternInput%GenTrq - u_SrvD%ExternalElecPwr = m_FAST%ExternInput%ElecPwr - u_SrvD%ExternalYawPosCom = m_FAST%ExternInput%YawPosCom - u_SrvD%ExternalYawRateCom = m_FAST%ExternInput%YawRateCom - u_SrvD%ExternalHSSBrFrac = m_FAST%ExternInput%HSSBrFrac - - if (ALLOCATED(u_SrvD%ExternalBlPitchCom)) then !there should be no reason this isn't allocated, but ExternalInflow is acting strange... - do i=1,SIZE(u_SrvD%ExternalBlPitchCom) - u_SrvD%ExternalBlPitchCom(i) = m_FAST%ExternInput%BlPitchCom(i) end do - end if - if (ALLOCATED(u_SrvD%ExternalBlAirfoilCom)) then ! Added Blade Flap use with Simulink - do i=1,SIZE(u_SrvD%ExternalBlAirfoilCom) - u_SrvD%ExternalBlAirfoilCom(i) = m_FAST%ExternInput%BlAirfoilCom(i) - end do - end if + ! Increment correction iteration counter + CorrIter = CorrIter + 1 - ! Cable controls - if (ALLOCATED(u_SrvD%ExternalCableDeltaL)) then ! This is only allocated if cable control signals are requested - do i=1,min(SIZE(u_SrvD%ExternalCableDeltaL),SIZE(m_FAST%ExternInput%CableDeltaL)) - u_SrvD%ExternalCableDeltaL(i) = m_FAST%ExternInput%CableDeltaL(i) - end do - end if - if (ALLOCATED(u_SrvD%ExternalCableDeltaLdot)) then ! This is only allocated if cable control signals are requested - do i=1,min(SIZE(u_SrvD%ExternalCableDeltaLdot),SIZE(m_FAST%ExternInput%CableDeltaLdot)) - u_SrvD%ExternalCableDeltaLdot(i) = m_FAST%ExternInput%CableDeltaLdot(i) + ! Perform input solve for modules post Option 1 convergence + do i = 1, size(p%iModPost) + call FAST_InputSolve(p%iModPost(i), GlueModData, GlueModMaps, INPUT_CURR, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return end do - end if - ! StC controls - ! This is a placeholder for where StC controls would be passed if they are enabled from Simulink - -END SUBROUTINE SrvD_SetExternalInputs -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine transfers the SD outputs into inputs required for HD -SUBROUTINE Transfer_SubStructureMotion_to_HD( SubStructureMotionMesh2HD, u_HD_W_Mesh, u_HD_M_Mesh, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - TYPE(MeshType), INTENT(IN ) :: SubStructureMotionMesh2HD !< The outputs of the structural dynamics module - TYPE(MeshType), INTENT(INOUT) :: u_HD_W_Mesh !< HydroDyn input mesh (separated here so that we can use temp meshes in ED_SD_HD_InputSolve) - TYPE(MeshType), INTENT(INOUT) :: u_HD_M_Mesh !< HydroDyn input mesh (separated here so that we can use temp meshes in ED_SD_HD_InputSolve) - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - - ErrStat = ErrID_None - ErrMsg = "" - - IF ( u_HD_W_Mesh%Committed ) THEN - - ! These are the motions for the lumped point loads associated viscous drag on the WAMIT body and/or filled/flooded lumped forces of the WAMIT body - CALL Transfer_Point_to_Point( SubStructureMotionMesh2HD, u_HD_W_Mesh, MeshMapData%SubStructure_2_HD_W_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,'Transfer_SubStructureMotion_to_HD (u_HD%WAMITMesh)' ) - - END IF - IF ( u_HD_M_Mesh%Committed ) THEN - - ! These are the motions for the lumped point loads associated viscous drag on the WAMIT body and/or filled/flooded lumped forces of the WAMIT body - CALL Transfer_Point_to_Point( SubStructureMotionMesh2HD, u_HD_M_Mesh, MeshMapData%SubStructure_2_HD_M_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,'Transfer_SubStructureMotion_to_HD (u_HD%Morison%Mesh)' ) - - END IF - -END SUBROUTINE Transfer_SubStructureMotion_to_HD -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine transfers the platform motion output of the structural module (ED) into inputs required for HD -SUBROUTINE Transfer_PlatformMotion_to_HD( PlatformMotion, u_HD, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - TYPE(MeshType), INTENT(IN ) :: PlatformMotion !< The platform motion outputs of the structural dynamics module - TYPE(HydroDyn_InputType), INTENT(INOUT) :: u_HD !< HydroDyn input - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'Transfer_PlatformMotion_to_HD' - - - ErrStat = ErrID_None - ErrMsg = "" - - ! This is for case of rigid substructure - - ! Transfer the ED outputs of the platform motions to the HD input of which represents the same data - CALL Transfer_Point_to_Point( PlatformMotion, u_HD%PRPMesh, MeshMapData%ED_P_2_HD_PRP_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//' (u_HD%PRPMesh)' ) - - - CALL Transfer_SubStructureMotion_to_HD( PlatformMotion, u_HD%WAMITMesh, u_HD%Morison%Mesh, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - -END SUBROUTINE Transfer_PlatformMotion_to_HD -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine transfers the SrvD outputs into inputs required for SD MDM -SUBROUTINE Transfer_SrvD_to_SD_MD( p_FAST, y_SrvD, u_SD, u_MD ) -!.................................................................................................................................. - TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters - TYPE(SrvD_OutputType), INTENT(IN ) :: y_SrvD !< SrvD input - TYPE(SD_InputType), INTENT(INOUT) :: u_SD !< SubDyn input - TYPE(MD_InputType), INTENT(INOUT) :: u_MD !< MoorDyn input - - if (p_FAST%CompElast == Module_SED) return ! StCs not used with SED - if (p_FAST%CompServo /= Module_SrvD) return - - ! transfer SrvD outputs to other modules used in option 1: - IF ( p_FAST%CompSub == Module_SD ) THEN - if (allocated(u_SD%CableDeltaL) .and. allocated(y_SrvD%CableDeltaL)) then - u_SD%CableDeltaL = y_SrvD%CableDeltaL ! these should be sized identically during init - endif - ENDIF - - IF ( p_FAST%CompMooring == Module_MD ) THEN - if (allocated(u_MD%DeltaL) .and. allocated(y_SrvD%CableDeltaL)) then - u_MD%DeltaL = y_SrvD%CableDeltaL ! these should be sized identically during init - endif - if (allocated(u_MD%DeltaLdot) .and. allocated(y_SrvD%CableDeltaLdot)) then - u_MD%DeltaLdot = y_SrvD%CableDeltaLdot ! these should be sized identically during init - endif - ENDIF -END SUBROUTINE Transfer_SrvD_to_SD_MD -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine transfers the ED outputs into inputs required for HD, SD, ExtPtfm, BD, MAP, and/or FEAM -!> Note that this also calls SD_CalcOutput if SubDyn and HydroDyn are both used. -SUBROUTINE Transfer_Structure_to_Opt1Inputs( this_time, this_state, p_FAST, y_ED, u_HD, SD, u_ExtPtfm, u_MAP, u_FEAM, u_MD, u_Orca, u_BD, u_SrvD, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - REAL(DbKi) , intent(in ) :: this_time !< The current simulation time (actual or time of prediction) - INTEGER(IntKi) , intent(in ) :: this_state !< Index into the state array (current or predicted states) - TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters - TYPE(ED_OutputType),TARGET, INTENT(IN ) :: y_ED !< The outputs of the structural dynamics module - TYPE(HydroDyn_InputType), INTENT(INOUT) :: u_HD !< HydroDyn input - TYPE(SubDyn_Data), TARGET, INTENT(INOUT) :: SD !< SubDyn data (all data transferred so we can call SD_CalcOutput if necessary) - TYPE(ExtPtfm_InputType), INTENT(INOUT) :: u_ExtPtfm !< ExtPtfm_MCKF input - TYPE(MAP_InputType), INTENT(INOUT) :: u_MAP !< MAP input - TYPE(FEAM_InputType), INTENT(INOUT) :: u_FEAM !< FEAM input - TYPE(MD_InputType), INTENT(INOUT) :: u_MD !< MoorDyn input - TYPE(Orca_InputType), INTENT(INOUT) :: u_Orca !< OrcaFlex input - TYPE(BD_InputType), INTENT(INOUT) :: u_BD(:) !< BeamDyn inputs - TYPE(SrvD_InputType), INTENT(INOUT) :: u_SrvD !< SrvD input - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'Transfer_Structure_to_Opt1Inputs' - TYPE(MeshType), POINTER :: PlatformMotion - TYPE(MeshType), POINTER :: SubstructureMotion - TYPE(MeshType), POINTER :: SubstructureMotion2HD - - ErrStat = ErrID_None - ErrMsg = "" - - if (p_FAST%CompElast == Module_SED) return ! HD, SD, and BD not used with SED - - PlatformMotion => y_ED%PlatformPtMesh - - IF (p_FAST%CompSub == Module_SD) THEN - SubstructureMotion => SD%y%y3Mesh - SubstructureMotion2HD => SD%y%y2Mesh - ELSE - SubstructureMotion => PlatformMotion - SubstructureMotion2HD => PlatformMotion - ENDIF - - ! transfer ED outputs to other modules used in option 1: - - IF ( p_FAST%CompSub == Module_SD ) THEN - - ! Map ED (motion) outputs to SD inputs: - CALL Transfer_Point_to_Point( PlatformMotion, SD%Input(1)%TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//':u_SD%TPMesh' ) - - IF ( p_FAST%CompHydro == Module_HD ) THEN ! This call to SD_CalcOutput was added because of some instabilities in the TCF merge (per conversation with ADP in May/June 2021) - CALL SD_CalcOutput( this_time, SD%Input(1), SD%p, SD%x(this_state), SD%xd(this_state), SD%z(this_state), SD%OtherSt(this_state), SD%y, SD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ELSEIF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - - ! Map ED (motion) outputs to ExtPtfm inputs: - CALL Transfer_Point_to_Point( PlatformMotion, u_ExtPtfm%PtfmMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//':u_ExtPtfm%PtfmMesh' ) - - END IF - - IF ( p_FAST%CompHydro == Module_HD ) THEN - - CALL Transfer_Point_to_Point( PlatformMotion, u_HD%PRPMesh, MeshMapData%ED_P_2_HD_PRP_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg, RoutineName//' (u_HD%PRPMesh)' ) - - ! if we don't have a call to SD_CalcOutput, we need to check that p_FAST%CompSub /= Module_SD before this: - ! IF (p_FAST%CompSub /= Module_SD) THEN - CALL Transfer_SubStructureMotion_to_HD( SubstructureMotion2HD, u_HD%WAMITMesh, u_HD%Morison%Mesh, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - !END IF ! don't transfer for SubDyn unless we have called SD_CalcOutput - - END IF - - ! if we don't have a call to SD_CalcOutput, we need to check that p_FAST%CompSub /= Module_SD before this: - ! IF (p_FAST%CompSub /= Module_SD) THEN - IF ( p_FAST%CompMooring == Module_MAP ) THEN - ! motions: - CALL Transfer_Point_to_Point( SubstructureMotion, u_MAP%PtFairDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'u_MAP%PtFairDisplacement' ) - - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - ! motions: - CALL Transfer_Point_to_Point( SubstructureMotion, u_MD%CoupledKinematics(1), MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'u_MD%CoupledKinematics' ) - - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - ! motions: - CALL Transfer_Point_to_Point( SubstructureMotion, u_FEAM%PtFairleadDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'u_FEAM%PtFairleadDisplacement' ) - - ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - ! motions: - CALL Transfer_Point_to_Point( PlatformMotion, u_Orca%PtfmMesh, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//'u_Orca%PtfmMesh' ) - END IF - - ! Map motions for ServodDyn Structural control (TMD) if used. - ! don't transfer for SubDyn unless we have called SD_CalcOutput - IF ( p_FAST%CompServo == Module_SrvD ) THEN - call Transfer_Substructure_to_SStC( u_SrvD, SubstructureMotion, MeshMapData, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//'u_SrvD%SStCMotionMesh') - END IF - - !END IF ! don't transfer for SubDyn unless we have called SD_CalcOutput - - - IF ( p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN - ! map ED root and hub motion outputs to BeamDyn: - CALL Transfer_ED_to_BD(y_ED, u_BD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName ) - - END IF - - -END SUBROUTINE Transfer_Structure_to_Opt1Inputs - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for IceFloe. -SUBROUTINE IceFloe_InputSolve( u_IceF, SubstructureMotionMesh, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - - ! Passed variables - TYPE(IceFloe_InputType), INTENT(INOUT) :: u_IceF !< IceFloe input - TYPE(MeshType), INTENT(IN ) :: SubstructureMotionMesh !< Substructure motion (output) mesh - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - !---------------------------------------------------------------------------------------------------- - ! Map SD outputs to IceFloe inputs - !---------------------------------------------------------------------------------------------------- - ! motions: - CALL Transfer_Point_to_Point( SubstructureMotionMesh, u_IceF%IceMesh, MeshMapData%SDy3_P_2_IceF_P, ErrStat, ErrMsg ) - -END SUBROUTINE IceFloe_InputSolve -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for IceFloe. -SUBROUTINE IceD_InputSolve( u_IceD, SubstructureMotionMesh, MeshMapData, legNum, ErrStat, ErrMsg ) -!.................................................................................................................................. - - ! Passed variables - TYPE(IceD_InputType), INTENT(INOUT) :: u_IceD !< IceDyn input - TYPE(MeshType), INTENT(IN ) :: SubstructureMotionMesh !< Substructure motion (output) mesh - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - INTEGER(IntKi), INTENT(IN ) :: legNum !< which instance of IceDyn we're using - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - !---------------------------------------------------------------------------------------------------- - ! Map SD outputs to IceFloe inputs - !---------------------------------------------------------------------------------------------------- - ! motions: - CALL Transfer_Point_to_Point( SubstructureMotionMesh, u_IceD%PointMesh, MeshMapData%SDy3_P_2_IceD_P(legNum), ErrStat, ErrMsg ) - -END SUBROUTINE IceD_InputSolve -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for BeamDyn. -SUBROUTINE Transfer_ED_to_BD( y_ED, u_BD, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - - ! Passed variables - TYPE(BD_InputType), INTENT(INOUT) :: u_BD(:) !< BeamDyn inputs - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - - - ! local variables - INTEGER(IntKi) :: k - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'Transfer_ED_to_BD' - - ErrStat = ErrID_None - ErrMsg = "" - - !---------------------------------------------------------------------------------------------------- - ! Map ED outputs to BeamDyn inputs - !---------------------------------------------------------------------------------------------------- - ! motions: - do k = 1,size(y_ED%BladeRootMotion) - CALL Transfer_Point_to_Point( y_ED%BladeRootMotion(k), u_BD(k)%RootMotion, MeshMapData%ED_P_2_BD_P(k), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - CALL Transfer_Point_to_Point( y_ED%HubPtMotion, u_BD(k)%HubMotion, MeshMapData%ED_P_2_BD_P_Hub(k), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Reset mesh remap + call FAST_ResetRemapFlags(GlueModData, GlueModMaps, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return end do - - -END SUBROUTINE Transfer_ED_to_BD -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the inputs required for IceFloe. -SUBROUTINE Transfer_ED_to_BD_tmp( y_ED, MeshMapData, ErrStat, ErrMsg ) -!.................................................................................................................................. - - ! Passed variables - TYPE(ED_OutputType), INTENT(IN ) :: y_ED !< ElastoDyn outputs - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - - - ! local variables - INTEGER(IntKi) :: k - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'Transfer_ED_to_BD_tmp' - + + !---------------------------------------------------------------------------- + ! Set Outputs + !---------------------------------------------------------------------------- + + Turbine%y_FAST%DriverWriteOutput(1) = real(TotalIter, ReKi) ! ConvIter + Turbine%y_FAST%DriverWriteOutput(2) = real(ConvError, ReKi) ! ConvError + Turbine%y_FAST%DriverWriteOutput(3) = real(NumUJac, ReKi) ! NumUJac + +contains + logical function Failed() + if (ErrStat2 /= ErrID_None) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +subroutine FAST_CalcOutputsAndSolveForInputs(p, m, GlueModData, GlueModMaps, ThisTime, iInput, iState, Turbine, & + ConvIter, ConvError, IsConverged, ErrStat, ErrMsg, UpdateJacobian) + type(Glue_TCParam), intent(in) :: p !< Parameters + type(Glue_TCMisc), intent(inout) :: m !< Misc variables + type(ModDataType), intent(inout) :: GlueModData(:) !< Module data + type(MappingType), intent(inout) :: GlueModMaps(:) !< Module mappings at glue level + real(DbKi), intent(in) :: ThisTime !< Time + integer(IntKi), intent(in) :: iInput !< Input index + integer(IntKi), intent(in) :: iState !< State index + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ConvIter + real(R8Ki), intent(out) :: ConvError + logical, intent(out) :: IsConverged + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + logical, optional, intent(in) :: UpdateJacobian + + character(*), parameter :: RoutineName = 'FAST_CalcOutputsAndSolveForInputs' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + ErrStat = ErrID_None - ErrMsg = "" - - !---------------------------------------------------------------------------------------------------- - ! Map ED outputs to BeamDyn inputs - !---------------------------------------------------------------------------------------------------- - ! motions: - do k = 1,size(y_ED%BladeRootMotion) - CALL Transfer_Point_to_Point( y_ED%BladeRootMotion(k), MeshMapData%u_BD_RootMotion(k), MeshMapData%ED_P_2_BD_P(k), ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - + ErrMsg = '' + + !---------------------------------------------------------------------------- + ! Initialization + !---------------------------------------------------------------------------- + + ! Initialize convergence flag to false + IsConverged = .false. + + ! Initialize convergence error to zero + ConvError = 0.0_R8Ki + + !---------------------------------------------------------------------------- + ! Option 2: InputSolve and CalcOutput + !---------------------------------------------------------------------------- + + ! Do input solve and calculate outputs for Option 2 modules (except ServoDyn) + do i = 1, size(p%iModOpt2) + + ! Solve for inputs + call FAST_InputSolve(p%iModOpt2(i), GlueModData, GlueModMaps, iInput, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Calculate outputs + call FAST_CalcOutput(GlueModData(p%iModOpt2(i)), GlueModMaps, ThisTime, iInput, iState, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do - - -END SUBROUTINE Transfer_ED_to_BD_tmp -!---------------------------------------------------------------------------------------------------------------------------------- -!> function to return the size of perturbation in calculating jacobian with finite differences. Currently hard-coded to return 1. -REAL(ReKi) FUNCTION GetPerturb(x) - REAL(ReKi), INTENT(IN) :: x !< value that we want to perturb - - !GetPerturb = sqrt( EPSILON(x)) * max( abs(x), 1._ReKi) -! GetPerturb = 1.0e6 - GetPerturb = 1.0 - -END FUNCTION GetPerturb -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine performs the Input-Output solve for ED and HD. -!! Note that this has been customized for the physics in the problems and is not a general solution. -!! This is only called if there is no substructure model (RIGID substructure) -SUBROUTINE ED_HD_InputOutputSolve( this_time, p_FAST, calcJacobian & - , u_ED, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED, m_ED & - , u_HD, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD, m_HD & - , u_MAP, y_MAP, u_FEAM, y_FEAM, u_MD, y_MD, u_SrvD, y_SrvD & - , MeshMapData , ErrStat, ErrMsg, WriteThisStep ) -!.................................................................................................................................. - - USE ElastoDyn - USE HydroDyn - - ! Passed variables - - REAL(DbKi) , INTENT(IN ) :: this_time !< The current simulation time (actual or time of prediction) - TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - LOGICAL , INTENT(IN ) :: calcJacobian !< Should we calculate Jacobians this time? (should be TRUE on initialization, then can be false [significantly reducing computational time]) - - !ElastoDyn: - TYPE(ED_ContinuousStateType) , INTENT(IN ) :: x_ED !< Continuous states - TYPE(ED_DiscreteStateType) , INTENT(IN ) :: xd_ED !< Discrete states - TYPE(ED_ConstraintStateType) , INTENT(IN ) :: z_ED !< Constraint states - TYPE(ED_OtherStateType) , INTENT(INOUT) :: OtherSt_ED !< Other states - TYPE(ED_ParameterType) , INTENT(IN ) :: p_ED !< Parameters - TYPE(ED_InputType) , INTENT(INOUT) :: u_ED !< System inputs - TYPE(ED_OutputType) , INTENT(INOUT) :: y_ED !< System outputs - TYPE(ED_MiscVarType) , INTENT(INOUT) :: m_ED !< misc/optimization variables - - !HydroDyn: - TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x_HD !< Continuous states - TYPE(HydroDyn_DiscreteStateType) , INTENT(IN ) :: xd_HD !< Discrete states - TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z_HD !< Constraint states - TYPE(HydroDyn_OtherStateType) , INTENT(INOUT) :: OtherSt_HD !< Other states - TYPE(HydroDyn_ParameterType) , INTENT(IN ) :: p_HD !< Parameters - TYPE(HydroDyn_InputType) , INTENT(INOUT) :: u_HD !< System inputs - TYPE(HydroDyn_OutputType) , INTENT(INOUT) :: y_HD !< System outputs - TYPE(HydroDyn_MiscVarType) , INTENT(INOUT) :: m_HD !< misc/optimization variables - - ! MAP/FEAM/MoorDyn: - TYPE(MAP_OutputType), INTENT(IN ) :: y_MAP !< MAP outputs - TYPE(MAP_InputType), INTENT(INOUT) :: u_MAP !< MAP inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - TYPE(FEAM_OutputType), INTENT(IN ) :: y_FEAM !< FEAM outputs - TYPE(FEAM_InputType), INTENT(INOUT) :: u_FEAM !< FEAM inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - TYPE(MD_OutputType), INTENT(IN ) :: y_MD !< MoorDyn outputs - TYPE(MD_InputType), INTENT(INOUT) :: u_MD !< MoorDyn inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - - ! SrvD for TMD at platform - TYPE(SrvD_OutputType), INTENT(IN ) :: y_SrvD !< SrvD outputs - TYPE(SrvD_InputType), INTENT(INOUT) :: u_SrvD !< SrvD inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - - TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - LOGICAL , INTENT(IN ) :: WriteThisStep !< Will we print the WriteOutput values this step? - - ! Local variables: - INTEGER, PARAMETER :: NumInputs = SizeJac_ED_HD !12 - REAL(ReKi), PARAMETER :: TOL_Squared = (1.0E-4)**2 !not currently used because KMax = 1 - REAL(ReKi) :: ThisPerturb ! an arbitrary perturbation (these are linear, so it shouldn't matter) - - REAL(ReKi) :: u( NumInputs) ! 6 loads, 6 accelerations - REAL(ReKi) :: u_perturb( NumInputs) ! 6 loads, 6 accelerations - REAL(ReKi) :: u_delta( NumInputs) ! - REAL(ReKi) :: Fn_U_perturb(NumInputs) ! value of U with perturbations - REAL(ReKi) :: Fn_U_Resid( NumInputs) ! Residual of U - - - TYPE(ED_OutputType) :: y_ED_input ! Copy of system outputs sent to this routine (routine input value) - TYPE(ED_InputType) :: u_ED_perturb ! Perturbed system inputs - TYPE(ED_OutputType) :: y_ED_perturb ! Perturbed system outputs - TYPE(HydroDyn_InputType) :: u_HD_perturb ! Perturbed system inputs - TYPE(HydroDyn_OutputType) :: y_HD_perturb ! Perturbed system outputs - - - INTEGER(IntKi) :: i ! loop counter (jacobian column number) - INTEGER(IntKi) :: K ! Input-output-solve iteration counter - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'ED_HD_InputOutputSolve' - -#ifdef OUTPUT_ADDEDMASS - REAL(ReKi) :: AddedMassMatrix(6,6) - INTEGER :: UnAM -#endif -#ifdef OUTPUT_JACOBIAN - INTEGER :: UnJac -#endif - - ! Note: p_FAST%UJacSclFact is a scaling factor that gets us similar magnitudes between loads and accelerations... - -!bjj: note, that this routine may have a problem if there is remapping done - - ErrStat = ErrID_None - ErrMsg = "" - - ! note this routine should be called only - ! IF ( p_FAST%CompHydro == Module_HD .AND. p_FAST%CompSub == Module_None .and. p_FAST%CompElast /= Module_BD ) - - !---------------------------------------------------------------------------------------------------- - ! Some more record keeping stuff: - !---------------------------------------------------------------------------------------------------- - - ! We need to know the outputs that were sent to this routine: - CALL ED_CopyOutput( y_ED, y_ED_input, MESH_NEWCOPY, ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Local copies for perturbing inputs and outputs (computing Jacobian): - IF ( calcJacobian ) THEN - CALL ED_CopyInput( u_ED, u_ED_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOutput( y_ED, y_ED_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyInput( u_HD, u_HD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOutput( y_HD, y_HD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - !---------------------------------------------------------------------------------------------------- - ! set up u vector, using local initial guesses: - !---------------------------------------------------------------------------------------------------- - - ! make hydrodyn inputs consistant with elastodyn outputs - ! (do this because we're using outputs in the u vector): - CALL Transfer_PlatformMotion_to_HD(y_ED_input%PlatformPtMesh, u_HD, MeshMapData, ErrStat2, ErrMsg2 ) ! get u_HD from y_ED_input - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - u( 1: 3) = u_ED%PlatformPtMesh%Force(:,1) / p_FAST%UJacSclFact - u( 4: 6) = u_ED%PlatformPtMesh%Moment(:,1) / p_FAST%UJacSclFact - u( 7: 9) = y_ED_input%PlatformPtMesh%TranslationAcc(:,1) - u(10:12) = y_ED_input%PlatformPtMesh%RotationAcc(:,1) - - K = 0 - - DO - - !------------------------------------------------------------------------------------------------- - ! Calculate outputs at this_time, based on inputs at this_time - !------------------------------------------------------------------------------------------------- - - CALL ED_CalcOutput( this_time, u_ED, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED, m_ED, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL HydroDyn_CalcOutput( this_time, u_HD, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD, m_HD, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !write(*,*) 'y_HD%Morison%Mesh%Force', y_HD%Morison%Mesh%Force - !write(*,*) 'y_HD%Morison%Mesh%Moment', y_HD%Morison%Mesh%Moment - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - IF ( K >= p_FAST%KMax ) EXIT - - - !------------------------------------------------------------------------------------------------- - ! Calculate Jacobian: partial U/partial u: - ! (note that we don't want to change u_ED or u_HD here) - !------------------------------------------------------------------------------------------------- - - CALL U_ED_HD_Residual(y_ED, y_HD, u, Fn_U_Resid) ! U_ED_HD_Residual checks for error - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - IF ( calcJacobian ) THEN - - !............................... - ! Get ElastoDyn's contribution: - !............................... - DO i=1,6 !call ED_CalcOutput - - CALL ED_CopyInput( u_ED, u_ED_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u_perturb = u - CALL Perturb_u( i, u_perturb, u_ED_perturb=u_ED_perturb, perturb=ThisPerturb ) ! perturb u and u_ED by ThisPerturb [routine sets ThisPerturb] - - ! calculate outputs with perturbed inputs: - CALL ED_CalcOutput( this_time, u_ED_perturb, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED_perturb, m_ED, ErrStat2, ErrMsg2 ) !calculate y_ED_perturb - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - CALL U_ED_HD_Residual(y_ED_perturb, y_HD, u_perturb, Fn_U_perturb) ! get this perturbation, U_perturb - IF ( ErrStat >= AbortErrLev ) RETURN ! U_ED_HD_Residual checks for error - - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - - MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb - - END DO ! ElastoDyn contribution ( columns 1-6 ) - - !............................... - ! Get HydroDyn's contribution: - !............................... - DO i=7,12 !call HD_CalcOutput - - ! we want to perturb u_HD, but we're going to perturb the input y_ED and transfer that to HD to get u_HD - CALL ED_CopyOutput( y_ED_input, y_ED_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u_perturb = u - CALL Perturb_u( i, u_perturb, y_ED_perturb=y_ED_perturb, perturb=ThisPerturb ) ! perturb u and y_ED by ThisPerturb [routine sets ThisPerturb] - CALL Transfer_PlatformMotion_to_HD( y_ED_perturb%PlatformPtMesh, u_HD_perturb, MeshMapData, ErrStat2, ErrMsg2 ) ! get u_HD_perturb - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! calculate outputs with perturbed inputs: - CALL HydroDyn_CalcOutput( this_time, u_HD_perturb, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD_perturb, m_HD, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - CALL U_ED_HD_Residual(y_ED, y_HD_perturb, u_perturb, Fn_U_perturb) ! get this perturbation ! U_ED_HD_Residual checks for error - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb - - END DO ! HydroDyn contribution ( columns 7-12 ) - -#ifdef OUTPUT_ADDEDMASS - UnAM = -1 - !$OMP critical(fileopen_critical) - CALL GetNewUnit( UnAM, ErrStat, ErrMsg ) - CALL OpenFOutFile( UnAM, TRIM(p_FAST%OutFileRoot)//'.AddedMassMatrix', ErrStat2, ErrMsg2) - !$OMP end critical(fileopen_critical) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - AddedMassMatrix = MeshMapData%Jacobian_Opt1(1:6,7:12) * p_FAST%UJacSclFact - CALL WrMatrix(AddedMassMatrix,UnAM, p_FAST%OutFmt) - CLOSE( UnAM ) -#endif -#ifdef OUTPUT_JACOBIAN - UnJac = -1 - !$OMP critical(fileopen_critical) - CALL GetNewUnit( UnJac, ErrStat2, ErrMsg2 ) - CALL OpenFOutFile( UnJac, TRIM(p_FAST%OutFileRoot)//'.'//TRIM(num2lstr(this_time))//'.Jacobian2', ErrStat2, ErrMsg2) - !$OMP end critical(fileopen_critical) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - CALL WrFileNR(UnJac, ' ') - CALL WrFileNR(UnJac, ' ElastoDyn_Force_X') - CALL WrFileNR(UnJac, ' ElastoDyn_Force_Y') - CALL WrFileNR(UnJac, ' ElastoDyn_Force_Z') - CALL WrFileNR(UnJac, ' ElastoDyn_Moment_X') - CALL WrFileNR(UnJac, ' ElastoDyn_Moment_Y') - CALL WrFileNR(UnJac, ' ElastoDyn_Moment_Z') - - CALL WrFileNR(UnJac, ' y_ED_TranslationAcc_X') - CALL WrFileNR(UnJac, ' y_ED_TranslationAcc_Y') - CALL WrFileNR(UnJac, ' y_ED_TranslationAcc_Z') - CALL WrFileNR(UnJac, ' y_ED_RotationAcc_X') - CALL WrFileNR(UnJac, ' y_ED_RotationAcc_Y') - CALL WrFileNR(UnJac, ' y_ED_RotationAcc_Z') - WRITE(UnJac,'()') - - CALL WrMatrix(MeshMapData%Jacobian_Opt1,UnJac, p_FAST%OutFmt) - CLOSE( UnJac ) -#endif - - - ! Get the LU decomposition of this matrix using a LAPACK routine: - ! The result is of the form MeshMapDat%Jacobian_Opt1 = P * L * U - - CALL LAPACK_getrf( M=NumInputs, N=NumInputs, A=MeshMapData%Jacobian_Opt1, IPIV=MeshMapData%Jacobian_pivot, ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - END IF - - !------------------------------------------------------------------------------------------------- - ! Solve for delta u: Jac*u_delta = - Fn_U_Resid - ! using the LAPACK routine - !------------------------------------------------------------------------------------------------- - - u_delta = -Fn_U_Resid - CALL LAPACK_getrs( TRANS='N', N=NumInputs, A=MeshMapData%Jacobian_Opt1, IPIV=MeshMapData%Jacobian_pivot, B=u_delta, & - ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - !------------------------------------------------------------------------------------------------- - ! check for error, update inputs (u_ED and u_HD), and iterate again - !------------------------------------------------------------------------------------------------- - -! IF ( DOT_PRODUCT(u_delta, u_delta) <= TOL_Squared ) EXIT - - u = u + u_delta - - u_ED%PlatformPtMesh%Force( :,1) = u_ED%PlatformPtMesh%Force( :,1) + u_delta( 1: 3) * p_FAST%UJacSclFact - u_ED%PlatformPtMesh%Moment(:,1) = u_ED%PlatformPtMesh%Moment(:,1) + u_delta( 4: 6) * p_FAST%UJacSclFact - y_ED_input%PlatformPtMesh%TranslationAcc(:,1) = y_ED_input%PlatformPtMesh%TranslationAcc(:,1) + u_delta( 7: 9) - y_ED_input%PlatformPtMesh%RotationAcc( :,1) = y_ED_input%PlatformPtMesh%RotationAcc( :,1) + u_delta(10:12) - - CALL Transfer_PlatformMotion_to_HD( y_ED_input%PlatformPtMesh, u_HD, MeshMapData, ErrStat2, ErrMsg2 ) ! get u_HD with u_delta changes - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - K = K + 1 - - END DO ! K - - - CALL CleanUp() - -CONTAINS - !............................................................................................................................... - SUBROUTINE Perturb_u( n, u_perturb, u_ED_perturb, y_ED_perturb, perturb ) - ! This routine perturbs the nth element of the u array (and ED input/output it corresponds to) - !............................................................................................................................... -! REAL( ReKi ), INTENT(IN) :: this_U(NumInputs) - INTEGER( IntKi ) , INTENT(IN ) :: n - REAL( ReKi ) , INTENT(INOUT) :: u_perturb(numInputs) - TYPE(ED_InputType) , OPTIONAL , INTENT(INOUT) :: u_ED_perturb ! System inputs (needed only when 1 <= n <= 6) - TYPE(ED_OutputType), OPTIONAL , INTENT(INOUT) :: y_ED_perturb ! System outputs (needed only when 7 <= n <= 12) - REAL( ReKi ) , INTENT( OUT) :: perturb - - if ( n <= 6 ) then ! ED u - - if ( n <= 3 ) then - perturb = GetPerturb( u_ED_perturb%PlatformPtMesh%Force(n ,1) ) - u_ED_perturb%PlatformPtMesh%Force(n ,1) = u_ED_perturb%PlatformPtMesh%Force(n ,1) + perturb * p_FAST%UJacSclFact - else - perturb = GetPerturb( u_ED_perturb%PlatformPtMesh%Moment(n-3,1) ) - u_ED_perturb%PlatformPtMesh%Moment(n-3,1) = u_ED_perturb%PlatformPtMesh%Moment(n-3,1) + perturb * p_FAST%UJacSclFact + + !---------------------------------------------------------------------------- + ! Option 1: InputSolve + !---------------------------------------------------------------------------- + + ! Get inputs for Option 1 modules + do i = 1, size(p%iModOpt1) + call FAST_InputSolve(p%iModOpt1(i), GlueModData, GlueModMaps, iInput, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + !------------------------------------------------------------------------- + ! TC: Input Solve + !------------------------------------------------------------------------- + + do i = 1, size(p%iModTC) + call FAST_InputSolve(p%iModTC(i), GlueModData, GlueModMaps, iInput, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + !---------------------------------------------------------------------------- + ! TC and Option 1: Save Inputs (u) + !---------------------------------------------------------------------------- + + ! Pack TC and Option 1 inputs into u array + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_GetOP(ModData, ThisTime, iInput, iState, Turbine, ErrStat2, ErrMsg2, & + u_op=ModData%Lin%u, u_glue=m%Mod%Lin%u) + if (Failed()) return + end associate + end do + + !---------------------------------------------------------------------------- + ! Convergence Iterations + !---------------------------------------------------------------------------- + + ! Loop through convergence iterations + do ConvIter = 0, p%MaxConvIter + + !------------------------------------------------------------------------- + ! TC and Option 1: Calculate Outputs (Y) + !------------------------------------------------------------------------- + + do i = 1, size(m%Mod%ModData) + call FAST_CalcOutput(m%Mod%ModData(i), GlueModMaps, ThisTime, iInput, iState, & + Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + !------------------------------------------------------------------------- + ! Convergence iteration limit check + !------------------------------------------------------------------------- + + ! If no inputs, set converged flag and exit convergence loop + if (m%Mod%Vars%Nu == 0) then + IsConverged = .true. + exit end if - - else ! ED y = HD u - - if ( n <= 9 ) then - perturb = GetPerturb( y_ED_perturb%PlatformPtMesh%TranslationAcc(n-6,1) ) - y_ED_perturb%PlatformPtMesh%TranslationAcc(n-6,1) = y_ED_perturb%PlatformPtMesh%TranslationAcc(n-6,1) + perturb - else - perturb = GetPerturb( y_ED_perturb%PlatformPtMesh%RotationAcc(n-9,1) ) - y_ED_perturb%PlatformPtMesh%RotationAcc( n-9,1) = y_ED_perturb%PlatformPtMesh%RotationAcc( n-9,1) + perturb + + ! If convergence iteration has reached or exceeded limit, exit loop + if (ConvIter >= p%MaxConvIter) then + call SetErrStat(ErrID_Warn, "Failed to converge in "//trim(Num2LStr(p%MaxConvIter))// & + " iterations (error="//trim(Num2LStr(ConvError))// & + ", tolerance="//trim(Num2LStr(p%ConvTol))//").", & + ErrStat, ErrMsg, RoutineName) + exit end if - - end if - - u_perturb(n) = u_perturb(n) + perturb - - - END SUBROUTINE Perturb_u - !............................................................................................................................... - SUBROUTINE U_ED_HD_Residual( y_ED2, y_HD2, u_IN, U_Resid) - !............................................................................................................................... - - TYPE(ED_OutputType), TARGET , INTENT(IN ) :: y_ED2 ! System outputs - TYPE(HydroDyn_OutputType) , INTENT(IN ) :: y_HD2 ! System outputs - REAL(ReKi) , INTENT(IN ) :: u_in(NumInputs) - REAL(ReKi) , INTENT( OUT) :: U_Resid(NumInputs) - - integer(IntKi) :: j ! Generic counter - TYPE(MeshType), POINTER :: SubstructureMotion - TYPE(MeshType), POINTER :: PlatformMotions - TYPE(MeshType), POINTER :: SubstructureMotion2HD - - ! SD cannot be used, so these all point to the same place. Using separate variables so they match with values in the full option 1 solve - PlatformMotions => y_ED2%PlatformPtMesh - SubstructureMotion => y_ED2%PlatformPtMesh - SubstructureMotion2HD => y_ED2%PlatformPtMesh - - ! This is only called is there is no flexible substructure model (RIGID substructure) - - ! ! Transfer motions: - - !.................. - ! Set mooring line inputs (which don't have acceleration fields) - !.................. - !TODO: MoorDyn input mesh now has acceleration fields, and they are used in some uncommon cases. Is this an issue? <<< - - IF ( p_FAST%CompMooring == Module_MAP ) THEN - - ! note: MAP_InputSolve must be called before setting ED loads inputs (so that motions are known for loads [moment] mapping) - CALL Transfer_Point_to_Point( SubstructureMotion, u_MAP%PtFairDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL Transfer_Point_to_Point( y_MAP%PtFairleadLoad, MeshMapData%SubstructureLoads_Tmp, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, u_MAP%PtFairDisplacement, SubstructureMotion ) !u_MAP and y_ED contain the displacements needed for moment calculations - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - - ! note: MD_InputSolve must be called before setting ED loads inputs (so that motions are known for loads [moment] mapping) - CALL Transfer_Point_to_Point( SubstructureMotion, u_MD%CoupledKinematics(1), MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL Transfer_Point_to_Point( y_MD%CoupledLoads(1), MeshMapData%SubstructureLoads_Tmp, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, u_MD%CoupledKinematics(1), SubstructureMotion ) !u_MD and y_ED contain the displacements needed for moment calculations - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - - ! note: FEAM_InputSolve must be called before setting ED loads inputs (so that motions are known for loads [moment] mapping) - CALL Transfer_Point_to_Point( SubstructureMotion, u_FEAM%PtFairleadDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL Transfer_Point_to_Point( y_FEAM%PtFairleadLoad, MeshMapData%SubstructureLoads_Tmp, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, u_FEAM%PtFairleadDisplacement, SubstructureMotion ) !u_FEAM and y_ED contain the displacements needed for moment calculations - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSE - - MeshMapData%SubstructureLoads_Tmp%Force = 0.0_ReKi - MeshMapData%SubstructureLoads_Tmp%Moment = 0.0_ReKi - - END IF - - - ! add farm-level mooring loads if applicable >>> note: these are fixed loads from the previous time step <<< - IF (p_FAST%FarmIntegration) THEN - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp_Farm%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp_Farm%Moment - END IF - - - ! Map motions for ServodDyn Structural control (TMD) if used and forces from the TMD to the platform - IF ( p_FAST%CompServo == Module_SrvD .and. p_FAST%CompSub /= Module_SD ) THEN - call Transfer_Substructure_to_SStC( u_SrvD, SubstructureMotion, MeshMapData, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName//'u_SrvD%SStC%Mesh') - - ! we're mapping loads, so we also need the sibling meshes' displacements: - IF ( ALLOCATED(y_SrvD%SStCLoadMesh) ) THEN ! Platform - do j=1,size(y_SrvD%SStCLoadMesh) - IF (y_SrvD%SStCLoadMesh(j)%Committed) THEN - CALL Transfer_Point_to_Point( y_SrvD%SStCLoadMesh(j), MeshMapData%SubstructureLoads_Tmp2, MeshMapData%SStC_P_P_2_SubStructure(j), ErrStat2, ErrMsg2, u_SrvD%SStCMotionMesh(j), SubstructureMotion ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName//':u_ED%PlatformPtMesh' ) - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment - ENDIF - enddo - ENDIF - ENDIF - - - ! we use copies of the input meshes (we don't need to update values in the original data structures): - - ! Need to transfer motions first - CALL Transfer_SubStructureMotion_to_HD( SubstructureMotion2HD, MeshMapData%u_HD_W_Mesh, MeshMapData%u_HD_M_Mesh, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - if ( y_HD2%WAMITMesh%Committed ) then - ! we're mapping loads, so we also need the sibling meshes' displacements: - CALL Transfer_Point_to_Point( y_HD2%WAMITMesh, MeshMapData%SubstructureLoads_Tmp2, MeshMapData%HD_W_P_2_SubStructure, ErrStat2, ErrMsg2, MeshMapData%u_HD_W_Mesh, SubstructureMotion2HD) !u_HD_W_Mesh and SubStructureMotions contain the displaced positions for load calculations - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment + + !------------------------------------------------------------------------- + ! Update Jacobian + !------------------------------------------------------------------------- + + ! If flag is present to update the Jacobian + if (present(UpdateJacobian)) then + + ! If Jacobian update requested and this is the first convergence iteration + if (UpdateJacobian .and. (ConvIter == 0)) then + + ! Call function to update the Jacobian + call BuildJacobianIO(p, m, GlueModMaps, ThisTime, iState, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Condition Jacobian matrix before factoring + if (p%iUL(1) > 0) then + m%IO_Jac(p%iUL(1):p%iUL(2), :) = m%IO_Jac(p%iUL(1):p%iUL(2), :)/p%Scale_UJac + m%IO_Jac(:, p%iUL(1):p%iUL(2)) = m%IO_Jac(:, p%iUL(1):p%iUL(2))*p%Scale_UJac + end if + + ! Factor Jacobian matrix + call LAPACK_getrf(size(m%IO_Jac, 1), size(m%IO_Jac, 2), m%IO_Jac, m%IPIV, ErrStat2, ErrMsg2) + if (Failed()) return + + end if end if - - if ( y_HD2%Morison%Mesh%Committed ) then - ! we're mapping loads, so we also need the sibling meshes' displacements: - CALL Transfer_Point_to_Point( y_HD2%Morison%Mesh, MeshMapData%SubstructureLoads_Tmp2, MeshMapData%HD_M_P_2_SubStructure, ErrStat2, ErrMsg2, MeshMapData%u_HD_M_Mesh, SubStructureMotion2HD) !u_HD_W_Mesh and SubStructureMotions contain the displaced positions for load calculations - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment + + !------------------------------------------------------------------------- + ! Formulate right hand side (U^tight, U^Option1) + !------------------------------------------------------------------------- + + ! Input solve for tight coupling modules + do i = 1, size(p%iModTC) + call FAST_InputSolve(p%iModTC(i), GlueModData, GlueModMaps, INPUT_TEMP, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + ! Input solve for Option 1 modules + do i = 1, size(p%iModOpt1) + call FAST_InputSolve(p%iModOpt1(i), GlueModData, GlueModMaps, INPUT_TEMP, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + ! Collect TC and Option 1 inputs into uCalc + do i = 1, size(m%Mod%ModData) + call FAST_GetOP(m%Mod%ModData(i), ThisTime, INPUT_TEMP, iState, Turbine, ErrStat2, ErrMsg2, & + u_op=m%Mod%ModData(i)%Lin%u, u_glue=m%uCalc) + if (Failed()) return + end do + + !------------------------------------------------------------------------- + ! Populate residual vector and apply conditioning to loads + !------------------------------------------------------------------------- + + ! Calculate difference in U for all Option 1 modules (un - u_tmp) + ! and add to RHS for TC and Option 1 modules + call MV_ComputeDiff(m%Mod%Vars%u, m%uCalc, m%Mod%Lin%u, m%IO_R) + + ! Copy residual to RHS array for solve + m%IO_X(:, 1) = m%IO_R + + ! Apply conditioning factor to loads in RHS + if (p%iUL(1) > 0) m%IO_X(p%iUL(1):p%iUL(2), 1) = m%IO_X(p%iUL(1):p%iUL(2), 1)/p%Scale_UJac + + !------------------------------------------------------------------------- + ! Solve for state and input perturbations + !------------------------------------------------------------------------- + + ! Solve Jacobian and RHS + call LAPACK_getrs('N', size(m%IO_Jac, 1), m%IO_Jac, m%IPIV, m%IO_X, ErrStat2, ErrMsg2) + if (Failed()) return + + !------------------------------------------------------------------------- + ! Check perturbations for convergence and exit if below tolerance + !------------------------------------------------------------------------- + + ! Calculate average L2 norm of change in states and inputs + ConvError = TwoNorm(m%IO_X(:, 1))/size(m%IO_X) + + ! If the RHS norm is less than convergence tolerance, set flag and exit convergence loop + if (ConvError < p%ConvTol) then + IsConverged = .true. + exit end if - - U_Resid( 1: 3) = u_in( 1: 3) - MeshMapData%SubstructureLoads_Tmp%Force(:,1) / p_FAST%UJacSclFact - U_Resid( 4: 6) = u_in( 4: 6) - MeshMapData%SubstructureLoads_Tmp%Moment(:,1) / p_FAST%UJacSclFact - - ! note that PlatformMotions is the same as SubstructureMotion and SubstructureMotion2HD in this simplified option 1 solve: - U_Resid( 7: 9) = u_in( 7: 9) - PlatformMotions%TranslationAcc(:,1) - U_Resid(10:12) = u_in(10:12) - PlatformMotions%RotationAcc(:,1) - - PlatformMotions => NULL() - - END SUBROUTINE U_ED_HD_Residual - !............................................................................................................................... - SUBROUTINE CleanUp() - INTEGER(IntKi) :: ErrStat3 ! The error identifier (ErrStat) - CHARACTER(ErrMsgLen) :: ErrMsg3 ! The error message (ErrMsg) - - CALL ED_DestroyOutput(y_ED_input, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(RoutineName//'/ED_DestroyOutput: '//TRIM(ErrMsg3) ) - - IF ( calcJacobian ) THEN - CALL ED_DestroyInput( u_ED_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(RoutineName//'/ED_DestroyInput: '//TRIM(ErrMsg3) ) - CALL ED_DestroyOutput(y_ED_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(RoutineName//'/ED_DestroyOutput: '//TRIM(ErrMsg3) ) - - CALL HydroDyn_DestroyInput( u_HD_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(RoutineName//'/HydroDyn_DestroyInput: '//TRIM(ErrMsg3) ) - CALL HydroDyn_DestroyOutput(y_HD_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(RoutineName//'/HydroDyn_DestroyOutput: '//TRIM(ErrMsg3) ) - END IF - - - - END SUBROUTINE CleanUp - !............................................................................................................................... -END SUBROUTINE ED_HD_InputOutputSolve -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine performs the Input-Output solve for ED, SD, HD, BD, and/or the OrcaFlex Interface. -!! Note that this has been customized for the physics in the problems and is not a general solution. -SUBROUTINE FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & - , u_ED, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED, m_ED & - , u_SD, p_SD, x_SD, xd_SD, z_SD, OtherSt_SD, y_SD, m_SD & - , u_ExtPtfm,p_ExtPtfm,x_ExtPtfm,xd_ExtPtfm,z_ExtPtfm,OtherSt_ExtPtfm,y_ExtPtfm,m_ExtPtfm & - , u_HD, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD, m_HD & - , u_BD, p_BD, x_BD, xd_BD, z_BD, OtherSt_BD, y_BD, m_BD & - , u_Orca, p_Orca, x_Orca, xd_Orca, z_Orca, OtherSt_Orca, y_Orca, m_Orca & - , u_MAP, y_MAP & - , u_FEAM, y_FEAM & - , u_MD, y_MD & - , u_IceF, y_IceF & - , u_IceD, y_IceD & - , u_SrvD, y_SrvD & - , u_AD, y_AD & ! for buoyancy loads - , MeshMapData , ErrStat, ErrMsg, WriteThisStep ) -!.................................................................................................................................. - - USE ElastoDyn - USE SubDyn - USE HydroDyn - USE BeamDyn - USE OrcaFlexInterface - - ! Passed variables - - REAL(DbKi) , INTENT(IN ) :: this_time !< The current simulation time (actual or time of prediction) - TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - LOGICAL , INTENT(IN ) :: calcJacobian !< Should we calculate Jacobians this time? - - !ElastoDyn: - TYPE(ED_ContinuousStateType) , INTENT(IN ) :: x_ED !< Continuous states - TYPE(ED_DiscreteStateType) , INTENT(IN ) :: xd_ED !< Discrete states - TYPE(ED_ConstraintStateType) , INTENT(IN ) :: z_ED !< Constraint states - TYPE(ED_OtherStateType) , INTENT(IN ) :: OtherSt_ED !< Other states - TYPE(ED_ParameterType) , INTENT(IN ) :: p_ED !< Parameters - TYPE(ED_InputType) , INTENT(INOUT) :: u_ED !< System inputs - TYPE(ED_OutputType), TARGET , INTENT(INOUT) :: y_ED !< System outputs - TYPE(ED_MiscVarType) , INTENT(INOUT) :: m_ED !< misc/optimization variables - - !BeamDyn (one instance per blade): - TYPE(BD_ContinuousStateType) , INTENT(IN ) :: x_BD(:) !< Continuous states - TYPE(BD_DiscreteStateType) , INTENT(IN ) :: xd_BD(:) !< Discrete states - TYPE(BD_ConstraintStateType) , INTENT(IN ) :: z_BD(:) !< Constraint states - TYPE(BD_OtherStateType) , INTENT(IN ) :: OtherSt_BD(:) !< Other/optimization states - TYPE(BD_ParameterType) , INTENT(IN ) :: p_BD(:) !< Parameters - TYPE(BD_InputType) , INTENT(INOUT) :: u_BD(:) !< System inputs - TYPE(BD_OutputType) , INTENT(INOUT) :: y_BD(:) !< System outputs - TYPE(BD_MiscVarType) , INTENT(INOUT) :: m_BD(:) !< misc/optimization variables - - !SubDyn: - TYPE(SD_ContinuousStateType) , INTENT(IN ) :: x_SD !< Continuous states - TYPE(SD_DiscreteStateType) , INTENT(IN ) :: xd_SD !< Discrete states - TYPE(SD_ConstraintStateType) , INTENT(IN ) :: z_SD !< Constraint states - TYPE(SD_OtherStateType) , INTENT(IN ) :: OtherSt_SD !< Other states - TYPE(SD_ParameterType) , INTENT(IN ) :: p_SD !< Parameters - TYPE(SD_InputType) , INTENT(INOUT) :: u_SD !< System inputs - TYPE(SD_OutputType), TARGET , INTENT(INOUT) :: y_SD !< System outputs - TYPE(SD_MiscVarType) , INTENT(INOUT) :: m_SD !< misc/optimization variables - - !ExtPtfm: - TYPE(ExtPtfm_ContinuousStateType) , INTENT(IN ) :: x_ExtPtfm !< Continuous states - TYPE(ExtPtfm_DiscreteStateType) , INTENT(IN ) :: xd_ExtPtfm !< Discrete states - TYPE(ExtPtfm_ConstraintStateType) , INTENT(IN ) :: z_ExtPtfm !< Constraint states - TYPE(ExtPtfm_OtherStateType) , INTENT(IN ) :: OtherSt_ExtPtfm !< Other states - TYPE(ExtPtfm_ParameterType) , INTENT(IN ) :: p_ExtPtfm !< Parameters - TYPE(ExtPtfm_InputType) , INTENT(INOUT) :: u_ExtPtfm !< System inputs - TYPE(ExtPtfm_OutputType) , INTENT(INOUT) :: y_ExtPtfm !< System outputs - TYPE(ExtPtfm_MiscVarType) , INTENT(INOUT) :: m_ExtPtfm !< misc/optimization variables - - !HydroDyn: - TYPE(HydroDyn_ContinuousStateType), INTENT(IN ) :: x_HD !< Continuous states - TYPE(HydroDyn_DiscreteStateType) , INTENT(IN ) :: xd_HD !< Discrete states - TYPE(HydroDyn_ConstraintStateType), INTENT(IN ) :: z_HD !< Constraint states - TYPE(HydroDyn_OtherStateType) , INTENT(INOUT) :: OtherSt_HD !< Other states - TYPE(HydroDyn_ParameterType) , INTENT(IN ) :: p_HD !< Parameters - TYPE(HydroDyn_InputType) , INTENT(INOUT) :: u_HD !< System inputs - TYPE(HydroDyn_OutputType) , INTENT(INOUT) :: y_HD !< System outputs - TYPE(HydroDyn_MiscVarType) , INTENT(INOUT) :: m_HD !< misc/optimization variables - - !OrcaFlex: - TYPE(Orca_ContinuousStateType), INTENT(IN ) :: x_Orca !< Continuous states - TYPE(Orca_DiscreteStateType) , INTENT(IN ) :: xd_Orca !< Discrete states - TYPE(Orca_ConstraintStateType), INTENT(IN ) :: z_Orca !< Constraint states - TYPE(Orca_OtherStateType) , INTENT(IN ) :: OtherSt_Orca !< Other states - TYPE(Orca_ParameterType) , INTENT(IN ) :: p_Orca !< Parameters - TYPE(Orca_InputType) , INTENT(INOUT) :: u_Orca !< System inputs - TYPE(Orca_OutputType) , INTENT(INOUT) :: y_Orca !< System outputs - TYPE(Orca_MiscVarType) , INTENT(INOUT) :: m_Orca !< misc/optimization variables - - - ! MAP/FEAM/MoorDyn/IceFloe/IceDyn: - TYPE(MAP_OutputType), INTENT(IN ) :: y_MAP !< MAP outputs - TYPE(MAP_InputType), INTENT(INOUT) :: u_MAP !< MAP inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - TYPE(FEAM_OutputType), INTENT(IN ) :: y_FEAM !< FEAM outputs - TYPE(FEAM_InputType), INTENT(INOUT) :: u_FEAM !< FEAM inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - TYPE(MD_OutputType), INTENT(IN ) :: y_MD !< MoorDyn outputs - TYPE(MD_InputType), INTENT(INOUT) :: u_MD !< MoorDyn inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - TYPE(IceFloe_OutputType), INTENT(IN ) :: y_IceF !< IceFloe outputs - TYPE(IceFloe_InputType), INTENT(INOUT) :: u_IceF !< IceFloe inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - TYPE(IceD_OutputType), INTENT(IN ) :: y_IceD(:) !< IceDyn outputs - TYPE(IceD_InputType), INTENT(INOUT) :: u_IceD(:) !< IceDyn inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - TYPE(SrvD_OutputType), INTENT(IN ) :: y_SrvD !< SrvD outputs - TYPE(SrvD_InputType), INTENT(INOUT) :: u_SrvD !< SrvD inputs (INOUT just because I don't want to use another tempoarary mesh and we'll overwrite this later) - - ! AeroDyn -- for buoyancy loads on hub - TYPE(AD_OutputType), INTENT(IN ) :: y_AD !< The outputs to AeroDyn14 - TYPE(AD_InputType), INTENT(INOUT) :: u_AD !< The inputs to AeroDyn15 - - TYPE(FAST_ModuleMapType), TARGET , INTENT(INOUT) :: MeshMapData !< data for mapping meshes between modules - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - LOGICAL , INTENT(IN ) :: WriteThisStep !< Will we print the WriteOutput values this step? - - ! Local variables: - REAL(ReKi), PARAMETER :: TOL_Squared = (1.0E-4)**2 !not currently used because KMax = 1 - REAL(ReKi) :: ThisPerturb ! an arbitrary perturbation (these are linear, so it shouldn't matter) - - CHARACTER(*), PARAMETER :: RoutineName = 'FullOpt1_InputOutputSolve' - -!bjj: store these so that we don't reallocate every time? - REAL(ReKi) :: u( p_FAST%SizeJac_Opt1(1)) ! size of loads/accelerations passed between the 6 modules - REAL(ReKi) :: u_perturb( p_FAST%SizeJac_Opt1(1)) ! size of loads/accelerations passed between the 6 modules - REAL(ReKi) :: u_delta( p_FAST%SizeJac_Opt1(1)) ! size of loads/accelerations passed between the 6 modules - REAL(ReKi) :: Fn_U_perturb(p_FAST%SizeJac_Opt1(1)) ! value of U with perturbations - REAL(ReKi) :: Fn_U_Resid( p_FAST%SizeJac_Opt1(1)) ! Residual of U - - TYPE(ED_InputType) :: u_ED_perturb ! Perturbed system inputs - TYPE(ED_OutputType) :: y_ED_perturb ! Perturbed system outputs - TYPE(SD_InputType) :: u_SD_perturb ! Perturbed system inputs - TYPE(SD_OutputType) :: y_SD_perturb ! Perturbed system outputs - TYPE(HydroDyn_InputType) :: u_HD_perturb ! Perturbed system inputs - TYPE(HydroDyn_OutputType) :: y_HD_perturb ! Perturbed system outputs - TYPE(BD_InputType) :: u_BD_perturb ! Perturbed system inputs - TYPE(BD_OutputType), ALLOCATABLE :: y_BD_perturb(:) ! Perturbed system outputs - TYPE(Orca_InputType) :: u_Orca_perturb ! Perturbed system inputs - TYPE(Orca_OutputType) :: y_Orca_perturb ! Perturbed system outputs - TYPE(ExtPtfm_InputType) :: u_ExtPtfm_perturb ! Perturbed system inputs - TYPE(ExtPtfm_OutputType) :: y_ExtPtfm_perturb ! Perturbed system outputs - - - INTEGER(IntKi) :: i,j ! loop counters (jacobian column number) - INTEGER(IntKi) :: nb ! loop counter (blade number) - INTEGER(IntKi) :: K ! Input-output-solve iteration counter - INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation - CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - - TYPE(MeshType), POINTER :: PlatformMotionMesh_1 - TYPE(MeshType), POINTER :: SubStructureMotionMesh_1 - TYPE(MeshType), POINTER :: SubStructureMotionMesh2HD_1 - -#ifdef OUTPUT_ADDEDMASS - REAL(ReKi) :: AddedMassMatrix(6,6) - INTEGER :: UnAM - INTEGER :: AMIndx -#endif -#ifdef OUTPUT_JACOBIAN - INTEGER :: UnJac - INTEGER :: TmpIndx -#endif - - LOGICAL :: GetWriteOutput ! flag to determine if we need WriteOutputs from this call to CalcOutput - - ! Note: p_FAST%UJacSclFact is a scaling factor that gets us similar magnitudes between loads and accelerations... - -!bjj: note, that this routine may have a problem if there is remapping done - + + ! Remove load condition conditioning on input changes + if (p%iUL(1) > 0) m%IO_X(p%iUL(1):p%iUL(2), 1) = m%IO_X(p%iUL(1):p%iUL(2), 1)*p%Scale_UJac + + !------------------------------------------------------------------------- + ! Update inputs for Tight Coupling and Option 1 modules + !------------------------------------------------------------------------- + + ! Add change in inputs + call MV_AddDelta(m%Mod%Vars%u, m%IO_X(:, 1), m%Mod%Lin%u) + + ! Transfer updated TC and Option 1 inputs to modules + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_SetOP(ModData, iInput, iState, Turbine, ErrStat2, ErrMsg2, & + u_op=ModData%Lin%u, u_glue=m%Mod%Lin%u) + if (Failed()) return + end associate + end do + end do + + !---------------------------------------------------------------------------- + ! Post Option 1 solve + !---------------------------------------------------------------------------- + + ! Perform input solve for modules post Option 1 convergence + do i = 1, size(p%iModPost) + call FAST_InputSolve(p%iModPost(i), GlueModData, GlueModMaps, iInput, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end do + + ! Reset mesh remap + call FAST_ResetRemapFlags(GlueModData, GlueModMaps, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + +contains + logical function Failed() + if (ErrStat2 /= ErrID_None) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +! Build Jacobian for tight coupling solve +subroutine BuildJacobianTC(p, m, GlueModMaps, ThisTime, iState, Turbine, ErrStat, ErrMsg) + type(Glue_TCParam), intent(in) :: p !< Parameters + type(Glue_TCMisc), intent(inout) :: m !< Misc variables + type(MappingType), intent(inout) :: GlueModMaps(:) !< Module mappings at glue level + real(DbKi), intent(in) :: ThisTime !< Time + integer(IntKi), intent(in) :: iState !< State index + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'BuildJacobianTC' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + real(R8Ki), allocatable :: J22(:, :) + integer(IntKi) :: i, j, k, idx, iq1, iq2 + ErrStat = ErrID_None - ErrMsg = "" - - !---------------------------------------------------------------------------------------------------- - ! Some record keeping stuff: - !---------------------------------------------------------------------------------------------------- - - ! Local copies for perturbing inputs and outputs (computing Jacobian): - IF ( calcJacobian ) THEN - - CALL ED_CopyInput( u_ED, u_ED_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'u_ED_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOutput( y_ED, y_ED_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'y_ED_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - IF ( p_FAST%CompSub == Module_SD ) THEN - CALL SD_CopyInput( u_SD, u_SD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'u_SD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOutput( y_SD, y_SD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'y_SD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - CALL ExtPtfm_CopyInput( u_ExtPtfm, u_ExtPtfm_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'u_ExtPtfm_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOutput( y_ExtPtfm, y_ExtPtfm_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'y_ExtPtfm_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF ( p_FAST%CompHydro == Module_HD ) THEN - CALL HydroDyn_CopyInput( u_HD, u_HD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'u_HD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOutput( y_HD, y_HD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'y_HD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF ( p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN - ALLOCATE( y_BD_perturb(p_FAST%nBeams) , STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - call SetErrStat( ErrID_Fatal, 'Error allocating y_BD_perturb.', ErrStat, ErrMsg, RoutineName ) - call CleanUp() - return - end if - - !bjj: if this mesh could have different number of nodes per instance, we'd need an array. (but, it's a single point) - CALL BD_CopyInput( u_BD(1), u_BD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'u_BD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - do nb=1,p_FAST%nBeams - CALL BD_CopyOutput( y_BD(nb), y_BD_perturb(nb), MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'y_BD_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end do - - END IF - - IF ( p_FAST%CompMooring == Module_Orca ) THEN - CALL Orca_CopyInput( u_Orca, u_Orca_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'u_Orca_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOutput( y_Orca, y_Orca_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, 'y_Orca_perturb:'//ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF (ErrStat >= AbortErrLev) THEN - CALL CleanUp() - RETURN - END IF - - END IF - - !---------------------------------------------------------------------------------------------------- - ! set up u vector, using local initial guesses: - !---------------------------------------------------------------------------------------------------- - - ! we need BeamDyn input mesh to be an array of meshes, so first we'll copy into temporary storage: - DO nb=1,p_FAST%nBeams - call MeshCopy( u_BD(nb)%RootMotion, MeshMapData%u_BD_RootMotion(nb), MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL Create_FullOpt1_UVector(u, u_ED%PlatformPtMesh, u_SD%TPMesh, u_SD%LMesh, & - u_HD%Morison%Mesh, u_HD%WAMITMesh, u_ED%HubPtLoad, MeshMapData%u_BD_RootMotion, u_Orca%PtfmMesh, & - u_ExtPtfm%PtfmMesh, p_FAST ) - - K = 0 - - DO - - !------------------------------------------------------------------------------------------------- - ! Calculate outputs at this_time, based on inputs at this_time - !------------------------------------------------------------------------------------------------- - GetWriteOutput = WriteThisStep .and. K >= p_FAST%KMax ! we need this only on the last call to BD - - CALL ED_CalcOutput( this_time, u_ED, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED, m_ED, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - IF ( p_FAST%CompSub == Module_SD ) THEN - CALL SD_CalcOutput( this_time, u_SD, p_SD, x_SD, xd_SD, z_SD, OtherSt_SD, y_SD, m_SD, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - CALL ExtPtfm_CalcOutput( this_time, u_ExtPtfm, p_ExtPtfm, x_ExtPtfm, xd_ExtPtfm, z_ExtPtfm, OtherSt_ExtPtfm, & - y_ExtPtfm, m_ExtPtfm, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF ( p_FAST%CompHydro == Module_HD ) THEN - CALL HydroDyn_CalcOutput( this_time, u_HD, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD, m_HD, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF ( p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN - do nb=1,p_FAST%nBeams - CALL BD_CalcOutput( this_time, u_BD(nb), p_BD(nb), x_BD(nb), xd_BD(nb), z_BD(nb), OtherSt_BD(nb), y_BD(nb), m_BD(nb), ErrStat2, ErrMsg2, GetWriteOutput ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end do - END IF - - IF ( p_FAST%CompMooring == Module_Orca ) THEN - CALL Orca_CalcOutput( this_time, u_Orca, p_Orca, x_Orca, xd_Orca, z_Orca, OtherSt_Orca, y_Orca, m_Orca, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - - IF ( K >= p_FAST%KMax ) EXIT - - - !------------------------------------------------------------------------------------------------- - ! Calculate Jacobian: partial U/partial u: - ! (note that we don't want to change u_ED, u_SD, u_HD, u_BD, u_ExtPtfm, or u_Orca, here) - !------------------------------------------------------------------------------------------------- - - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, u, Fn_U_Resid) !May set errors here... - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - IF ( calcJacobian ) THEN - i = 0 - - !............................... - ! Get ElastoDyn's contribution: - !............................... - DO j=1,p_FAST%SizeJac_Opt1(2) !call ED_CalcOutput - i = i + 1 - - ! perturb u_ED: - CALL ED_CopyInput( u_ED, u_ED_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u_perturb = u - CALL Perturb_u_FullOpt1( p_FAST, MeshMapData%Jac_u_indx, i, u_perturb, u_ED_perturb=u_ED_perturb, perturb=ThisPerturb ) ! perturb u and u_ED by ThisPerturb [routine sets ThisPerturb] - - ! calculate outputs with perturbed inputs: - CALL ED_CalcOutput( this_time, u_ED_perturb, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED_perturb, m_ED, ErrStat2, ErrMsg2 ) !calculate y_ED_perturb - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - CALL U_FullOpt1_Residual(y_ED_perturb, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation, U_perturb - - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb - - END DO ! ElastoDyn contribution ( columns 1-p_FAST%SizeJac_Opt1(2) ) - - !............................... - ! Get SubDyn's contribution: (note if p_FAST%CompSub /= Module_SD, SizeJac_Opt1(3) = 0) - !............................... - DO j=1,p_FAST%SizeJac_Opt1(3) !call SD_CalcOutput - i = i + 1 ! i = j + p_FAST%SizeJac_Opt1(2) - - ! perturb u_SD: - CALL SD_CopyInput( u_SD, u_SD_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u_perturb = u - CALL Perturb_u_FullOpt1( p_FAST, MeshMapData%Jac_u_indx, i, u_perturb, u_SD_perturb=u_SD_perturb, perturb=ThisPerturb ) ! perturb u and u_SD by ThisPerturb [routine sets ThisPerturb] - - ! calculate outputs with perturbed inputs: - CALL SD_CalcOutput( this_time, u_SD_perturb, p_SD, x_SD, xd_SD, z_SD, OtherSt_SD, y_SD_perturb, m_SD, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - CALL U_FullOpt1_Residual(y_ED, y_SD_perturb, y_HD, y_BD, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb - - END DO ! SubDyn contribution - - - !............................... - ! Get HydroDyn's contribution: (note if p_FAST%CompHydro /= Module_HD, SizeJac_Opt1(4) = 0) - !............................... - DO j=1,p_FAST%SizeJac_Opt1(4) !call HydroDyn_CalcOutput - i = i + 1 ! i = j + p_FAST%SizeJac_Opt1(2) + p_FAST%SizeJac_Opt1(3) - - ! perturb u_HD: - CALL HydroDyn_CopyInput( u_HD, u_HD_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u_perturb = u - CALL Perturb_u_FullOpt1( p_FAST, MeshMapData%Jac_u_indx, i, u_perturb, u_HD_perturb=u_HD_perturb, perturb=ThisPerturb ) ! perturb u and u_HD by ThisPerturb [routine sets ThisPerturb] - - ! calculate outputs with perturbed inputs: - CALL HydroDyn_CalcOutput( this_time, u_HD_perturb, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD_perturb, m_HD, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD_perturb, y_BD, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb - - END DO !HydroDyn contribution - - !............................... - ! Get BeamDyn's contribution: (note if p_FAST%CompElast /= Module_BD, SizeJac_Opt1(5) = 0) - !............................... - DO nb=1,p_FAST%nBeams - CALL BD_CopyOutput(y_BD(nb),y_BD_perturb(nb),MESH_UPDATECOPY,ErrStat2,ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - DO nb=1,p_FAST%nBeams - - ! make sure we perturb the outputs from only the current blade (overwrite the previous perturbation with y_BD values) - if (nb > 1) then - CALL BD_CopyOutput( y_BD(nb-1), y_BD_perturb(nb-1), MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end if - - - DO j=1,p_FAST%SizeJac_Opt1(4+nb) !call BD_CalcOutput - i = i + 1 ! i = j + sum(p_FAST%SizeJac_Opt1(2:3+nb)) - ! perturb u_BD: - CALL BD_CopyInput( u_BD(nb), u_BD_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u_perturb = u - CALL Perturb_u_FullOpt1( p_FAST, MeshMapData%Jac_u_indx, i, u_perturb, u_BD_perturb=u_BD_perturb, perturb=ThisPerturb ) ! perturb u and u_HD by ThisPerturb [routine sets ThisPerturb] - - ! calculate outputs with perturbed inputs: - CALL BD_CalcOutput( this_time, u_BD_perturb, p_BD(nb), x_BD(nb), xd_BD(nb), z_BD(nb), OtherSt_BD(nb), y_BD_perturb(nb), m_BD(nb), ErrStat2, ErrMsg2, .false. ) ! We don't use the WriteOutput when computing the Jacobian - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD_perturb, y_Orca, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb - END DO - - - END DO !BeamDyn contribution - - - !............................... - ! Get OrcaFlex's contribution: (note if p_FAST%CompMooring /= Module_Orca, SizeJac_Opt1(8) = 0) - !............................... - DO j=1,p_FAST%SizeJac_Opt1(8) !call Orca_CalcOutput - i = i + 1 - - ! perturb u_Orca: - CALL Orca_CopyInput( u_Orca, u_Orca_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u_perturb = u - CALL Perturb_u_FullOpt1( p_FAST, MeshMapData%Jac_u_indx, i, u_perturb, u_Orca_perturb=u_Orca_perturb, perturb=ThisPerturb ) ! perturb u and u_Orca by ThisPerturb [routine sets ThisPerturb] - - ! calculate outputs with perturbed inputs: - CALL Orca_CalcOutput( this_time, u_Orca_perturb, p_Orca, x_Orca, xd_Orca, z_Orca, OtherSt_Orca, y_Orca_perturb, m_Orca, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca_perturb, y_ExtPtfm, u_perturb, Fn_U_perturb) ! get this perturbation - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb - - END DO !OrcaFlex contribution - - - !............................... - ! Get ExtPtfm's contribution: (note if p_FAST%CompSub /= Module_ExtPtfm, SizeJac_Opt1(9) = 0) - !............................... - DO j=1,p_FAST%SizeJac_Opt1(9) !call ExtPtfm_CalcOutput - i = i + 1 - - ! perturb u_ExtPtfm: - CALL ExtPtfm_CopyInput( u_ExtPtfm, u_ExtPtfm_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - u_perturb = u - CALL Perturb_u_FullOpt1( p_FAST, MeshMapData%Jac_u_indx, i, u_perturb, u_ExtPtfm_perturb=u_ExtPtfm_perturb, perturb=ThisPerturb ) ! perturb u and u_ExtPtfm by ThisPerturb [routine sets ThisPerturb] - - ! calculate outputs with perturbed inputs: - CALL ExtPtfm_CalcOutput( this_time, u_ExtPtfm_perturb, p_ExtPtfm, x_ExtPtfm, xd_ExtPtfm, z_ExtPtfm, & - OtherSt_ExtPtfm, y_ExtPtfm_perturb, m_ExtPtfm, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL U_FullOpt1_Residual(y_ED, y_SD, y_HD, y_BD, y_Orca, y_ExtPtfm_perturb, u_perturb, Fn_U_perturb) ! get this perturbation - - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb - - END DO !ExtPtfm contribution - -#ifdef OUTPUT_ADDEDMASS -IF (p_FAST%CompHydro == Module_HD ) THEN - UnAM = -1 - !$OMP critical(fileopen_critical) - CALL GetNewUnit( UnAM, ErrStat2, ErrMsg2 ) - CALL OpenFOutFile( UnAM, TRIM(p_FAST%OutFileRoot)//'.AddedMassMatrix', ErrStat2, ErrMsg2) - !$OMP end critical(fileopen_critical) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) RETURN - - AMIndx = p_FAST%SizeJac_Opt1(1) - 5 - sum(p_FAST%SizeJac_Opt1(5:)) !the start of the HydroDyn Mesh inputs in the Jacobian - AddedMassMatrix = MeshMapData%Jacobian_Opt1(1:6,AMIndx:(AMIndx+5)) * p_FAST%UJacSclFact - CALL WrMatrix(AddedMassMatrix,UnAM, p_FAST%OutFmt) - CLOSE( UnAM ) -END IF -#endif -#ifdef OUTPUT_JACOBIAN - UnJac = -1 - !$OMP critical(fileopen_critical) - CALL GetNewUnit( UnJac, ErrStat2, ErrMsg2 ) - CALL OpenFOutFile( UnJac, TRIM(p_FAST%OutFileRoot)//'.'//TRIM(num2lstr(this_time))//'.Jacobian', ErrStat2, ErrMsg2) - !$OMP end critical(fileopen_critical) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) RETURN - - CALL WrFileNR(UnJac, ' ') - IF (p_FAST%CompHydro == Module_HD .or. p_FAST%CompSub /= Module_None .or. p_FAST%CompMooring == Module_Orca) then - CALL WrFileNR(UnJac, ' ElastoDyn_Ptfm_Force_X') - CALL WrFileNR(UnJac, ' ElastoDyn_Ptfm_Force_Y') - CALL WrFileNR(UnJac, ' ElastoDyn_Ptfm_Force_Z') - CALL WrFileNR(UnJac, ' ElastoDyn_Ptfm_Moment_X') - CALL WrFileNR(UnJac, ' ElastoDyn_Ptfm_Moment_Y') - CALL WrFileNR(UnJac, ' ElastoDyn_Ptfm_Moment_Z') + ErrMsg = '' + + ! Reset Jacobian update countdown values + m%UJacIterRemain = p%NIter_UJac + m%UJacStepsRemain = p%NStep_UJac + + if (size(m%Mod%Lin%J) == 0) return + + !---------------------------------------------------------------------------- + ! Get module Jacobians and assemble + ! A: rows = x; columns = x (dXdx) + ! B: rows = x; columns = u (dXdu) + ! C: rows = y; columns = x (dYdx) + ! D: rows = y; columns = u (dYdu) + !---------------------------------------------------------------------------- + + ! Initialize Jacobian matrices + if (allocated(m%Mod%Lin%dYdx)) m%Mod%Lin%dYdx = 0.0_R8Ki + if (allocated(m%Mod%Lin%dXdx)) m%Mod%Lin%dXdx = 0.0_R8Ki + if (allocated(m%Mod%Lin%dXdu)) m%Mod%Lin%dXdu = 0.0_R8Ki + if (allocated(m%Mod%Lin%dYdu)) m%Mod%Lin%dYdu = 0.0_R8Ki + if (allocated(m%Mod%Lin%dUdy)) m%Mod%Lin%dUdy = 0.0_R8Ki + if (allocated(m%Mod%Lin%dUdu)) then + call Eye2D(m%Mod%Lin%dUdu, ErrStat2, ErrMsg2) + if (Failed()) return end if - - IF (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) then - CALL WrFileNR(UnJac, ' ElastoDyn_hub_Force_X') - CALL WrFileNR(UnJac, ' ElastoDyn_hub_Force_Y') - CALL WrFileNR(UnJac, ' ElastoDyn_hub_Force_Z') - CALL WrFileNR(UnJac, ' ElastoDyn_hub_Moment_X') - CALL WrFileNR(UnJac, ' ElastoDyn_hub_Moment_Y') - CALL WrFileNR(UnJac, ' ElastoDyn_hub_Moment_Z') - END IF - - - DO TmpIndx=1,u_SD%TPMesh%NNodes - CALL WrFileNR(UnJac, ' SD_TPMesh_TranslationAcc_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SD_TPMesh_TranslationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SD_TPMesh_TranslationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - - DO TmpIndx=1,u_SD%TPMesh%NNodes - CALL WrFileNR(UnJac, ' SD_TPMesh_RotationAcc_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SD_TPMesh_RotationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SD_TPMesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - - IF ( p_FAST%CompHydro == Module_HD ) THEN ! this SD mesh linked only when HD is enabled - DO TmpIndx=1,u_SD%LMesh%NNodes - CALL WrFileNR(UnJac, ' SD_LMesh_Force_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SD_LMesh_Force_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SD_LMesh_Force_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - DO TmpIndx=1,u_SD%LMesh%NNodes - CALL WrFileNR(UnJac, ' SD_LMesh_Moment_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SD_LMesh_Moment_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' SD_LMesh_Moment_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - END IF - - DO TmpIndx=1,u_HD%Morison%Mesh%NNodes - CALL WrFileNR(UnJac, ' HD_M_Mesh_TranslationAcc_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' HD_M_Mesh_TranslationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' HD_M_Mesh_TranslationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - DO TmpIndx=1,u_HD%Morison%Mesh%NNodes - CALL WrFileNR(UnJac, ' HD_M_Mesh_RotationAcc_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' HD_M_Mesh_RotationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' HD_M_Mesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - - DO TmpIndx=1,u_HD%WAMITMesh%NNodes - CALL WrFileNR(UnJac, ' HD_W_Mesh_TranslationAcc_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' HD_W_Mesh_TranslationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' HD_W_Mesh_TranslationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - DO TmpIndx=1,u_HD%WAMITMesh%NNodes - CALL WrFileNR(UnJac, ' HD_W_Mesh_RotationAcc_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' HD_W_Mesh_RotationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' HD_W_Mesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - - DO nb=1,p_FAST%nBeams - CALL WrFileNR(UnJac, ' BD_Root'//trim(num2lstr(nb))//'Motion_TranslationAcc_X') - CALL WrFileNR(UnJac, ' BD_Root'//trim(num2lstr(nb))//'Motion_TranslationAcc_Y') - CALL WrFileNR(UnJac, ' BD_Root'//trim(num2lstr(nb))//'Motion_TranslationAcc_Z') - CALL WrFileNR(UnJac, ' BD_Root'//trim(num2lstr(nb))//'Motion_RotationAcc_X') - CALL WrFileNR(UnJac, ' BD_Root'//trim(num2lstr(nb))//'Motion_RotationAcc_Y') - CALL WrFileNR(UnJac, ' BD_Root'//trim(num2lstr(nb))//'Motion_RotationAcc_Z') - END DO - - DO TmpIndx=1,u_Orca%PtfmMesh%NNodes - CALL WrFileNR(UnJac, ' Orca_PtfmMesh_TranslationAcc_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' Orca_PtfmMesh_TranslationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' Orca_PtfmMesh_TranslationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - - DO TmpIndx=1,u_Orca%PtfmMesh%NNodes - CALL WrFileNR(UnJac, ' Orca_PtfmMesh_RotationAcc_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' Orca_PtfmMesh_RotationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' Orca_PtfmMesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - - DO TmpIndx=1,u_ExtPtfm%PtfmMesh%NNodes - CALL WrFileNR(UnJac, ' ExtPtfm_PtfmMesh_RotationAcc_X_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' ExtPtfm_PtfmMesh_RotationAcc_Y_'//TRIM(Num2LStr(TmpIndx))) - CALL WrFileNR(UnJac, ' ExtPtfm_PtfmMesh_RotationAcc_Z_'//TRIM(Num2LStr(TmpIndx))) - END DO - - - WRITE(UnJac,'()') - - CALL WrMatrix(MeshMapData%Jacobian_Opt1,UnJac, p_FAST%OutFmt) - CLOSE( UnJac ) - -#endif - - - ! Get the LU decomposition of this matrix using a LAPACK routine: - ! The result is of the form MeshMapDat%Jacobian_Opt1 = P * L * U - - CALL LAPACK_getrf( M=p_FAST%SizeJac_Opt1(1), N=p_FAST%SizeJac_Opt1(1), & - A=MeshMapData%Jacobian_Opt1, IPIV=MeshMapData%Jacobian_pivot, & - ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - END IF - - !------------------------------------------------------------------------------------------------- - ! Solve for delta u: Jac*u_delta = - Fn_U_Resid - ! using the LAPACK routine - !------------------------------------------------------------------------------------------------- - - u_delta = -Fn_U_Resid - CALL LAPACK_getrs( TRANS="N", N=p_FAST%SizeJac_Opt1(1), A=MeshMapData%Jacobian_Opt1, & - IPIV=MeshMapData%Jacobian_pivot, B=u_delta, ErrStat=ErrStat2, ErrMsg=ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) THEN - CALL CleanUp() - RETURN - END IF - - !------------------------------------------------------------------------------------------------- - ! check for error, update inputs (u_ED and u_HD), and iterate again - !------------------------------------------------------------------------------------------------- - -! IF ( DOT_PRODUCT(u_delta, u_delta) <= TOL_Squared ) EXIT - - u = u + u_delta - CALL Add_FullOpt1_u_delta( p_FAST, MeshMapData%Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm ) - - K = K + 1 - - END DO ! K - - !............................................... - ! This is effectively doing option 2, where we set the input velocities and displacements based on the outputs we just calculated - !............................................... - - PlatformMotionMesh_1 => y_ED%PlatformPtMesh - if (p_FAST%CompSub == MODULE_SD) then - SubStructureMotionMesh_1 => y_SD%y3Mesh - SubStructureMotionMesh2HD_1 => y_SD%y2Mesh - - else - SubStructureMotionMesh_1 => y_ED%PlatformPtMesh - SubStructureMotionMesh2HD_1 => y_ED%PlatformPtMesh - end if - - - ! BD motion inputs: (from ED) - IF (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN - - ! Make copies of the accelerations we just solved for (so we don't overwrite them) - do nb = 1,p_FAST%nBeams - MeshMapData%u_BD_RootMotion(nb)%RotationAcc = u_BD(nb)%RootMotion%RotationAcc - MeshMapData%u_BD_RootMotion(nb)%TranslationAcc = u_BD(nb)%RootMotion%TranslationAcc - end do - - call Transfer_ED_to_BD(y_ED, u_BD, MeshMapData, ErrStat2, ErrMsg2 ) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! put the acceleration data (calucluted in this routine) back - do nb = 1,p_FAST%nBeams - u_BD(nb)%RootMotion%RotationAcc = MeshMapData%u_BD_RootMotion(nb)%RotationAcc - u_BD(nb)%RootMotion%TranslationAcc = MeshMapData%u_BD_RootMotion(nb)%TranslationAcc - end do - - END IF - - - !............... - ! HD motion inputs: (from SD and ED) - IF (p_FAST%CompHydro == Module_HD ) THEN - - ! Make copies of the accelerations we just solved for (so we don't overwrite them) - IF (MeshMapData%u_HD_M_Mesh%Committed) THEN - MeshMapData%u_HD_M_Mesh%RotationAcc = u_HD%Morison%Mesh%RotationAcc - MeshMapData%u_HD_M_Mesh%TranslationAcc = u_HD%Morison%Mesh%TranslationAcc - ENDIF - - IF (MeshMapData%u_HD_W_Mesh%Committed) THEN - MeshMapData%u_HD_W_Mesh%RotationAcc = u_HD%WAMITMesh%RotationAcc - MeshMapData%u_HD_W_Mesh%TranslationAcc = u_HD%WAMITMesh%TranslationAcc - ENDIF - - ! transfer the output data from ED and/or SD to inputs - CALL Transfer_Point_to_Point( PlatformMotionMesh_1, u_HD%PRPMesh, MeshMapData%ED_P_2_HD_PRP_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL Transfer_SubStructureMotion_to_HD( SubStructureMotionMesh2HD_1, u_HD%WAMITMesh, u_HD%Morison%Mesh, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - - - ! put the acceleration data (calucluted in this routine) back - IF (MeshMapData%u_HD_M_Mesh%Committed) THEN - u_HD%Morison%Mesh%RotationAcc = MeshMapData%u_HD_M_Mesh%RotationAcc - u_HD%Morison%Mesh%TranslationAcc = MeshMapData%u_HD_M_Mesh%TranslationAcc - ENDIF - - IF (MeshMapData%u_HD_W_Mesh%Committed) THEN - u_HD%WAMITMesh%RotationAcc = MeshMapData%u_HD_W_Mesh%RotationAcc - u_HD%WAMITMesh%TranslationAcc = MeshMapData%u_HD_W_Mesh%TranslationAcc - ENDIF - - !...... - - END IF - - IF ( p_FAST%CompSub == Module_SD ) THEN - !............... - ! SD motion inputs: (from ED) - - ! Map ED outputs to SD inputs (keeping the accelerations we just calculated): - - MeshMapData%u_SD_TPMesh%RotationAcc = u_SD%TPMesh%RotationAcc - MeshMapData%u_SD_TPMesh%TranslationAcc = u_SD%TPMesh%TranslationAcc - - CALL Transfer_Point_to_Point( PlatformMotionMesh_1, u_SD%TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - u_SD%TPMesh%RotationAcc = MeshMapData%u_SD_TPMesh%RotationAcc - u_SD%TPMesh%TranslationAcc = MeshMapData%u_SD_TPMesh%TranslationAcc - - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - !............... - ! ExtPtfm motion inputs: (from ED) - - ! Map ED outputs to ExtPtfm inputs (keeping the accelerations we just calculated): - - MeshMapData%u_ExtPtfm_PtfmMesh%RotationAcc = u_ExtPtfm%PtfmMesh%RotationAcc - MeshMapData%u_ExtPtfm_PtfmMesh%TranslationAcc = u_ExtPtfm%PtfmMesh%TranslationAcc - - CALL Transfer_Point_to_Point( PlatformMotionMesh_1, u_ExtPtfm%PtfmMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - u_ExtPtfm%PtfmMesh%RotationAcc = MeshMapData%u_ExtPtfm_PtfmMesh%RotationAcc - u_ExtPtfm%PtfmMesh%TranslationAcc = MeshMapData%u_ExtPtfm_PtfmMesh%TranslationAcc - END IF - - - IF ( p_FAST%CompMooring == Module_Orca ) THEN - !............... - ! Orca motion inputs: (from ED) - - ! Map ED outputs to Orca inputs (keeping the accelerations we just calculated): - - MeshMapData%u_Orca_PtfmMesh%RotationAcc = u_Orca%PtfmMesh%RotationAcc - MeshMapData%u_Orca_PtfmMesh%TranslationAcc = u_Orca%PtfmMesh%TranslationAcc - - CALL Transfer_Point_to_Point( PlatformMotionMesh_1, u_Orca%PtfmMesh, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - u_Orca%PtfmMesh%RotationAcc = MeshMapData%u_Orca_PtfmMesh%RotationAcc - u_Orca%PtfmMesh%TranslationAcc = MeshMapData%u_Orca_PtfmMesh%TranslationAcc - END IF - - !............................................... - ! We're finished - !............................................... - CALL CleanUp() - -CONTAINS - !............................................................................................................................... - SUBROUTINE U_FullOpt1_Residual( y_ED2, y_SD2, y_HD2, y_BD2, y_Orca2, y_ExtPtfm2, u_IN, U_Resid) - ! transfer outputs of ED, HD, SD, BD, and OrcaFlex (and any additional loads that get summed with them) into inputs for ED, HD, SD, BD, and OrcaFlex - !............................................................................................................................... - - TYPE(ED_OutputType), TARGET , INTENT(IN ) :: y_ED2 ! System outputs - TYPE(SD_OutputType), TARGET , INTENT(IN ) :: y_SD2 ! System outputs - TYPE(HydroDyn_OutputType) , INTENT(IN ) :: y_HD2 ! System outputs - TYPE(BD_OutputType) , INTENT(IN ) :: y_BD2(:) ! System outputs - TYPE(Orca_OutputType) , INTENT(IN ) :: y_Orca2 ! System outputs - TYPE(ExtPtfm_OutputType) , INTENT(IN ) :: y_ExtPtfm2 ! System outputs - REAL(ReKi) , INTENT(IN ) :: u_in(:) - REAL(ReKi) , INTENT( OUT) :: U_Resid(:) - - INTEGER(IntKi) :: i ! counter for ice leg and beamdyn loops - INTEGER(IntKi) :: k ! counter for SrvD TMD instances - TYPE(MeshType), POINTER :: PlatformMotions - TYPE(MeshType), POINTER :: SubstructureMotion - TYPE(MeshType), POINTER :: SubstructureMotion2HD - - TYPE(MeshType), POINTER :: SD_LMesh - TYPE(MeshType), POINTER :: ED_PtfmPtMesh - - TYPE(MeshType), TARGET :: BlankMesh - - PlatformMotions => y_ED2%PlatformPtMesh - - IF (p_FAST%CompSub == Module_SD) then - SubstructureMotion => y_SD2%y3Mesh - SubstructureMotion2HD => y_SD2%y2Mesh - SD_LMesh => MeshMapData%SubstructureLoads_Tmp - ELSE - SubstructureMotion => y_ED2%PlatformPtMesh - SubstructureMotion2HD => y_ED2%PlatformPtMesh - SD_LMesh => BlankMesh - END IF - - !.................. - ! Set mooring line and ice inputs (which don't have acceleration fields and aren't used elsewhere in this routine, thus we're using the actual inputs (not a copy) - ! Note that these values get overwritten at the completion of this routine.) - !.................. - - - IF ( p_FAST%CompMooring == Module_MAP ) THEN - - ! note: MAP_InputSolve must be called before setting ED loads inputs (so that motions are known for loads [moment] mapping) - CALL Transfer_Point_to_Point( SubstructureMotion, u_MAP%PtFairDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - - ! note: MD_InputSolve must be called before setting ED loads inputs (so that motions are known for loads [moment] mapping) - CALL Transfer_Point_to_Point( SubstructureMotion, u_MD%CoupledKinematics(1), MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - - ! note: FEAM_InputSolve must be called before setting ED loads inputs (so that motions are known for loads [moment] mapping) - CALL Transfer_Point_to_Point( SubstructureMotion, u_FEAM%PtFairleadDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - - ! Map ED motion output to Orca inputs: - ! note: must be called before setting ED loads inputs (so that Orca motions are known for loads [moment] mapping) - - ! NOTE THAT THIS USES **PlatformMotion** WHILE THE OTHER MOORING CODES COUPLE WITH **SubStructureMotion** - CALL Transfer_Point_to_Point( PlatformMotions, MeshMapData%u_Orca_PtfmMesh, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - END IF - - - IF ( p_FAST%CompIce == Module_IceF ) THEN - - CALL IceFloe_InputSolve( u_IceF, SubstructureMotion, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - - DO i=1,p_FAST%numIceLegs - - CALL IceD_InputSolve( u_IceD(i), SubstructureMotion, MeshMapData, i, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - END DO - - END IF - - - !.................. - ! Set motions for the ServoDyn Structural control for platform inputs (this has accelerations, but we assume the loads generated are small) - ! Note that these values get overwritten at the completion of this routine.) - !.................. - IF ( p_FAST%CompServo == Module_SrvD ) THEN - call Transfer_Substructure_to_SStC( u_SrvD, SubstructureMotion, MeshMapData, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ENDIF - - - MeshMapData%u_ED_HubPtLoad%Force = 0.0_ReKi - MeshMapData%u_ED_HubPtLoad%Moment = 0.0_ReKi - - IF ( p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN - - ! Transfer ED motions to BD inputs: - call Transfer_ED_to_BD_tmp( y_ED2, MeshMapData, ErrStat2, ErrMsg2 ) ! sets MeshMapData%u_BD_RootMotion(:) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ! Transfer BD loads to ED hub input: - ! we're mapping loads, so we also need the sibling meshes' displacements: - do i=1,p_FAST%nBeams - CALL Transfer_Point_to_Point( y_BD2(i)%ReactionForce, MeshMapData%u_ED_HubPtLoad_2, MeshMapData%BD_P_2_ED_P(i), ErrStat2, ErrMsg2, MeshMapData%u_BD_RootMotion(i), y_ED2%HubPtMotion) !u_BD_RootMotion and y_ED2%HubPtMotion contain the displaced positions for load calculations - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - MeshMapData%u_ED_HubPtLoad%Force = MeshMapData%u_ED_HubPtLoad%Force + MeshMapData%u_ED_HubPtLoad_2%Force - MeshMapData%u_ED_HubPtLoad%Moment = MeshMapData%u_ED_HubPtLoad%Moment + MeshMapData%u_ED_HubPtLoad_2%Moment - end do - IF ( p_FAST%CompAero == Module_AD .and. p_FAST%MHK /= MHK_None) THEN - IF ( u_AD%rotors(1)%HubMotion%Committed ) THEN - CALL Transfer_Point_to_Point( y_AD%rotors(1)%HubLoad, MeshMapData%u_ED_HubPtLoad_2, MeshMapData%AD_P_2_ED_P_H, ErrStat2, ErrMsg2, u_AD%rotors(1)%HubMotion, y_ED2%HubPtMotion ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - MeshMapData%u_ED_HubPtLoad%Force = MeshMapData%u_ED_HubPtLoad%Force + MeshMapData%u_ED_HubPtLoad_2%Force - MeshMapData%u_ED_HubPtLoad%Moment = MeshMapData%u_ED_HubPtLoad%Moment + MeshMapData%u_ED_HubPtLoad_2%Moment - END IF - END IF - END IF - - - MeshMapData%SubstructureLoads_Tmp%Force = 0.0_ReKi - MeshMapData%SubstructureLoads_Tmp%Moment = 0.0_ReKi - - IF ( p_FAST%CompHydro == Module_HD ) THEN - - !.................. - ! Get HD inputs on Morison%Mesh and WAMITMesh - !.................. - - ! SD or ED motions to HD: - CALL Transfer_SubStructureMotion_to_HD( SubstructureMotion2HD, MeshMapData%u_HD_W_Mesh, MeshMapData%u_HD_M_Mesh, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - - !.................. - ! Get Substructure loads inputs (MeshMapData%u_HD_W_Mesh and MeshMapData%u_HD_M_Mesh meshes must be set first) - !.................. - - ! Loads (outputs) from HD meshes transfered to SD LMesh (zero them out first because they get summed in Transfer_HD_to_SD) - IF ( y_HD2%WAMITMesh%Committed ) THEN - ! we're mapping loads, so we also need the sibling meshes' displacements: - CALL Transfer_Point_to_Point( y_HD2%WAMITMesh, MeshMapData%SubstructureLoads_Tmp2, MeshMapData%HD_W_P_2_SubStructure, ErrStat2, ErrMsg2, MeshMapData%u_HD_W_Mesh, SubStructureMotion2HD ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment - - END IF - - IF ( y_HD2%Morison%Mesh%Committed ) THEN - ! we're mapping loads, so we also need the sibling meshes' displacements: - CALL Transfer_Point_to_Point( y_HD2%Morison%Mesh, MeshMapData%SubstructureLoads_Tmp2, MeshMapData%HD_M_P_2_SubStructure, ErrStat2, ErrMsg2, MeshMapData%u_HD_M_Mesh, SubStructureMotion2HD ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF (ErrStat >= AbortErrLev) RETURN - - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment - - END IF - - IF ( p_FAST%CompIce == Module_IceF ) THEN - - ! SD loads from IceFloe: - IF ( y_IceF%iceMesh%Committed ) THEN - ! we're mapping loads, so we also need the sibling meshes' displacements: - CALL Transfer_Point_to_Point( y_IceF%iceMesh, MeshMapData%SubstructureLoads_Tmp2, MeshMapData%IceF_P_2_SD_P, ErrStat2, ErrMsg2, u_IceF%iceMesh, SubStructureMotion ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment - - - END IF !Module_IceF - - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - - ! SD loads from IceDyn: - DO i=1,p_FAST%numIceLegs - - IF ( y_IceD(i)%PointMesh%Committed ) THEN - ! we're mapping loads, so we also need the sibling meshes' displacements: - CALL Transfer_Point_to_Point( y_IceD(i)%PointMesh, MeshMapData%SubstructureLoads_Tmp2, MeshMapData%IceD_P_2_SD_P(i), ErrStat2, ErrMsg2, u_IceD(i)%PointMesh, SubStructureMotion ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment - - END IF - - END DO - - END IF ! Ice loading - - END IF ! HD is used (IceFloe/IceDyn can't be used unless HydroDyn is used) - - - !.................. - ! Get Substructure (SD or ED) loads inputs from ServoDyn Structural control - !.................. - IF ( p_FAST%CompServo == Module_SrvD .and. allocated(y_SrvD%SStCLoadMesh) ) THEN - do k=1,size(y_SrvD%SStCLoadMesh) - IF (y_SrvD%SStCLoadMesh(k)%Committed) THEN ! size 1 only for SStC - CALL Transfer_Point_to_Point( y_SrvD%SStCLoadMesh(k), MeshMapData%SubstructureLoads_Tmp2, MeshMapData%SStC_P_P_2_SubStructure(k), ErrStat2, ErrMsg2, u_SrvD%SStCMotionMesh(k), SubStructureMotion ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName ) - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment - ENDIF - enddo - ENDIF - - - - IF ( p_FAST%CompSub == Module_SD ) THEN - - !.................. - ! Get SD motions input - !.................. - - ! Motions (outputs) at ED platform ref point transfered to SD transition piece (input): - CALL Transfer_Point_to_Point( PlatformMotions, MeshMapData%u_SD_TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - !.................. - ! Get ED platform loads input - !.................. - - ! Loads (outputs) on the SD transition piece transfered to ED input location/mesh: - ! we're mapping loads, so we also need the sibling meshes' displacements: - CALL Transfer_Point_to_Point( y_SD2%Y1Mesh, MeshMapData%PlatformLoads_Tmp, MeshMapData%SD_TP_2_ED_P, ErrStat2, ErrMsg2, MeshMapData%u_SD_TPMesh, PlatformMotions ) !MeshMapData%u_SD_TPMesh contains the orientations needed for moment calculations - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - - ELSE IF (p_FAST%CompSub == Module_ExtPtfm) THEN - - !.................. - ! Get ExtPtfm motions input - !.................. - - ! Motions (outputs) at ED platform ref point transfered to ExtPtfm PtfmMesh (input): - CALL Transfer_Point_to_Point( PlatformMotions, MeshMapData%u_ExtPtfm_PtfmMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - !.................. - ! Get ED platform loads input - !.................. - - ! Loads (outputs) on the ExtPtfm platform mesh transfered to ED input location/mesh: - ! we're mapping loads, so we also need the sibling meshes' displacements: - CALL Transfer_Point_to_Point( y_ExtPtfm2%PtfmMesh, MeshMapData%PlatformLoads_Tmp, MeshMapData%SD_TP_2_ED_P, ErrStat2, ErrMsg2, MeshMapData%u_ExtPtfm_PtfmMesh, PlatformMotions ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ELSE - - MeshMapData%PlatformLoads_Tmp%Force = 0.0_ReKi - MeshMapData%PlatformLoads_Tmp%Moment = 0.0_ReKi - - END IF - - - !.................. - ! Get remaining portion of substructure (ED or SD) loads input on MeshMapData%SubstructureLoads_Tmp (must do this after all input motion meshes are set) - ! at this point, MeshMapData%PlatformLoads_Tmp contains the portion of loads from SD and/or HD - !.................. - - - ! Get the loads for ED/SD from a mooring module and add them: - IF ( p_FAST%CompMooring == Module_MAP ) THEN - CALL Transfer_Point_to_Point( y_MAP%PtFairleadLoad, MeshMapData%SubstructureLoads_Tmp2, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, u_MAP%PtFairDisplacement, SubStructureMotion ) !u_MAP and y_SD contain the displacements needed for moment calculations - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment - - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - CALL Transfer_Point_to_Point( y_MD%CoupledLoads(1), MeshMapData%SubstructureLoads_Tmp2, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, u_MD%CoupledKinematics(1), SubStructureMotion ) !u_MD and y_SD contain the displacements needed for moment calculations - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment - - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - CALL Transfer_Point_to_Point( y_FEAM%PtFairleadLoad, MeshMapData%SubstructureLoads_Tmp2, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, u_FEAM%PtFairleadDisplacement, SubStructureMotion ) !u_FEAM and y_SD contain the displacements needed for moment calculations - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp2%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp2%Moment - - ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - !NOTE: ORCAFLEX INTERFACE COUPLES WITH **PlatformMotions** AND NOT **SubStructureMotion** LIKE THE OTHER MOORING MODULES DO - - ! BECAUSE ORCAFLEX INTERFACE CANNOT BE USED WITH SUBDYN, THE SUBSTRUCTURELOADS DATA STRUCTURES POINT TO ELASTODYN (MORE LIKE PLATFORM MESH) - CALL Transfer_Point_to_Point( y_Orca2%PtfmMesh, MeshMapData%PlatformLoads_Tmp2, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2, MeshMapData%u_Orca_PtfmMesh, PlatformMotions ) !u_Orca_PtfmMesh and y_ED contain the displacements needed for moment calculations - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - MeshMapData%PlatformLoads_Tmp%Force = MeshMapData%PlatformLoads_Tmp%Force + MeshMapData%PlatformLoads_Tmp2%Force - MeshMapData%PlatformLoads_Tmp%Moment = MeshMapData%PlatformLoads_Tmp%Moment + MeshMapData%PlatformLoads_Tmp2%Moment - END IF - - - ! add farm-level mooring loads if applicable - IF (p_FAST%FarmIntegration) THEN - MeshMapData%SubstructureLoads_Tmp%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%SubstructureLoads_Tmp_Farm%Force - MeshMapData%SubstructureLoads_Tmp%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%SubstructureLoads_Tmp_Farm%Moment - END IF - - - !.................. - ! Calculate the residual with these new inputs: - !.................. - ! Make sure that the substructure loads get mapped with the platform loads when SD is not used: - IF (p_FAST%CompSub /= MODULE_SD) THEN - ! In this case, the substructure and platform are the same mesh: - ED_PtfmPtMesh => MeshMapData%PlatformLoads_Tmp - SD_LMesh => BlankMesh - - ED_PtfmPtMesh%Force = MeshMapData%SubstructureLoads_Tmp%Force + MeshMapData%PlatformLoads_Tmp%Force - ED_PtfmPtMesh%Moment = MeshMapData%SubstructureLoads_Tmp%Moment + MeshMapData%PlatformLoads_Tmp%Moment - ELSE - ED_PtfmPtMesh => MeshMapData%PlatformLoads_Tmp - SD_LMesh => MeshMapData%SubstructureLoads_Tmp - ENDIF - - CALL Create_FullOpt1_UVector(U_Resid, ED_PtfmPtMesh, MeshMapData%u_SD_TPMesh, SD_LMesh, & - MeshMapData%u_HD_M_Mesh, MeshMapData%u_HD_W_Mesh, & - MeshMapData%u_ED_HubPtLoad, MeshMapData%u_BD_RootMotion, MeshMapData%u_Orca_PtfmMesh, & - MeshMapData%u_ExtPtfm_PtfmMesh, p_FAST ) - - U_Resid = u_in - U_Resid - - PlatformMotions => NULL() - - END SUBROUTINE U_FullOpt1_Residual - !............................................................................................................................... - SUBROUTINE CleanUp() - INTEGER(IntKi) :: ErrStat3 ! The error identifier (ErrStat) - INTEGER(IntKi) :: nb - CHARACTER(ErrMsgLen) :: ErrMsg3 ! The error message (ErrMsg) - INTEGER(IntKi) :: nb_local - - IF ( calcJacobian ) THEN - CALL ED_DestroyInput( u_ED_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - CALL ED_DestroyOutput(y_ED_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - - CALL SD_DestroyInput( u_SD_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - CALL SD_DestroyOutput(y_SD_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - - CALL HydroDyn_DestroyInput( u_HD_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - CALL HydroDyn_DestroyOutput(y_HD_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - - CALL BD_DestroyInput( u_BD_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - if (allocated(y_BD_perturb)) then - do nb_local=1,size(y_BD_perturb) - CALL BD_DestroyOutput(y_BD_perturb(nb_local), ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) + + ! Loop through modules tight coupling modules + do i = 1, size(p%iModTC) + associate (ModData => m%Mod%ModData(i)) + + ! Calculate dYdx, dXdx for tight coupling modules + call FAST_JacobianPContState(ModData, ThisTime, INPUT_CURR, iState, Turbine, ErrStat2, ErrMsg2, & + dXdx=ModData%Lin%dXdx, dXdx_glue=m%Mod%Lin%dXdx, & + dYdx=ModData%Lin%dYdx, dYdx_glue=m%Mod%Lin%dYdx) + if (Failed()) return + + ! Calculate Jacobians wrt inputs + call FAST_JacobianPInput(ModData, ThisTime, INPUT_CURR, iState, Turbine, ErrStat2, ErrMsg2, & + dXdu=ModData%Lin%dXdu, dXdu_glue=m%Mod%Lin%dXdu, & + dYdu=ModData%Lin%dYdu, dYdu_glue=m%Mod%Lin%dYdu) + if (Failed()) return + end associate + end do + + ! Loop through Option 1 modules and calculate dYdu + do i = size(p%iModTC) + 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_JacobianPInput(ModData, ThisTime, INPUT_CURR, iState, Turbine, ErrStat2, ErrMsg2, & + dYdu=ModData%Lin%dYdu, dYdu_glue=m%Mod%Lin%dYdu) + if (Failed()) return + end associate + end do + + ! Calculate dUdu and dUdy for TC and Option 1 modules + if (allocated(m%Mod%Lin%dUdy) .and. allocated(m%Mod%Lin%dUdu)) then + call FAST_LinearizeMappings(m%Mod, GlueModMaps, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end if + + !---------------------------------------------------------------------------- + ! Assemble Jacobian + !---------------------------------------------------------------------------- + + ! If states in Jacobian + if (p%iJX(1) > 0) then + do i = 1, size(m%Mod%Vars%x) + if (m%Mod%Vars%x(i)%Field == FieldOrientation) then + do iq1 = m%Mod%Vars%x(i)%iq(1), m%Mod%Vars%x(i)%iq(2), 3 + iq2 = iq1 + 2 + m%Tan(iq1:iq2,iq1:iq2) = transpose(rvec_to_tan(m%StatePred%x(iq1:iq2))) end do - deallocate(y_BD_perturb) end if - - CALL Orca_DestroyInput( u_Orca_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - CALL Orca_DestroyOutput(y_Orca_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - - CALL ExtPtfm_DestroyInput( u_ExtPtfm_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - CALL ExtPtfm_DestroyOutput(y_ExtPtfm_perturb, ErrStat3, ErrMsg3 ) - IF (ErrStat3 /= ErrID_None) CALL WrScr(' '//RoutineName//TRIM(ErrMsg3) ) - - END IF - - - END SUBROUTINE CleanUp - !............................................................................................................................... -END SUBROUTINE FullOpt1_InputOutputSolve -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. -!! Do not change the order of this packing without changing subroutine Create_FullOpt1_UVector()! -SUBROUTINE Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD_M_Mesh, & - HD_WAMIT_Mesh, ED_HubPtLoad, u_BD, Orca_PtfmMesh, ExtPtfm_PtfmMesh, ErrStat, ErrMsg) - - TYPE(FAST_ParameterType) , INTENT(INOUT) :: p_FAST !< FAST parameters - TYPE(FAST_ModuleMapType) , INTENT(INOUT) :: MeshMapData !< data that maps meshes together - - ! input meshes for each of the 4 modules: - TYPE(MeshType) , INTENT(IN ) :: ED_PlatformPtMesh !< ElastoDyn's PlatformPtMesh - TYPE(MeshType) , INTENT(IN ) :: ED_HubPtLoad !< ElastoDyn's HubPtLoad mesh - TYPE(MeshType) , INTENT(IN ) :: SD_TPMesh !< SubDyn's TP (transition piece) mesh - TYPE(MeshType) , INTENT(IN ) :: SD_LMesh !< SubDyn's LMesh - TYPE(MeshType) , INTENT(IN ) :: HD_M_Mesh !< HydroDyn's Morison Lumped Mesh - TYPE(MeshType) , INTENT(IN ) :: HD_WAMIT_Mesh !< HydroDyn's WAMIT mesh - TYPE(BD_InputType) , INTENT(IN ) :: u_BD(:) !< inputs for each instance of the BeamDyn module (for the RootMotion meshes) - TYPE(MeshType) , INTENT(IN ) :: Orca_PtfmMesh !< OrcaFlex interface PtfmMesh - TYPE(MeshType) , INTENT(IN ) :: ExtPtfm_PtfmMesh !< ExtPtfm_MCKF interface PtfmMesh - - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CHARACTER(*), PARAMETER :: RoutineName = 'Init_FullOpt1_Jacobian' - - ! local variables: - INTEGER(IntKi) :: i, j, k, index - - ErrStat = ErrID_None - ErrMsg = "" - - ! determine how many inputs there are between the 6 modules (ED, SD, HD, BD, Orca, ExtPtfm) - p_FAST%SizeJac_Opt1 = 0 ! initialize whole array - - if (p_FAST%CompHydro == Module_HD .or. p_FAST%CompSub /= Module_None .or. p_FAST%CompMooring == Module_Orca) then - p_FAST%SizeJac_Opt1(2) = ED_PlatformPtMesh%NNodes*6 ! ED inputs: 3 forces and 3 moments per node (only 1 node) - else - p_FAST%SizeJac_Opt1(2) = 0 - end if - - - p_FAST%SizeJac_Opt1(3) = SD_TPMesh%NNodes*6 ! SD inputs: 6 accelerations per node (size of SD input from ED) - IF ( p_FAST%CompHydro == Module_HD ) THEN - p_FAST%SizeJac_Opt1(3) = p_FAST%SizeJac_Opt1(3) & - + SD_LMesh%NNodes *6 ! SD inputs: 6 loads per node (size of SD input from HD) - END IF - - p_FAST%SizeJac_Opt1(4) = HD_M_Mesh%NNodes *6 & ! HD inputs: 6 accelerations per node (on each Morison mesh) - + HD_WAMIT_Mesh%NNodes*6 ! HD inputs: 6 accelerations per node (on the WAMIT mesh) - - IF ( p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN - p_FAST%SizeJac_Opt1(2) = p_FAST%SizeJac_Opt1(2) & - + ED_HubPtLoad%NNodes *6 ! ED inputs: 6 loads per node (size of ED input from BD) - - p_FAST%SizeJac_Opt1(5:7) = 0 ! assumes a max of 3 blades - do k=1,size(u_BD) - p_FAST%SizeJac_Opt1(4+k) = u_BD(k)%RootMotion%NNodes *6 ! BD inputs: 6 accelerations per node (size of BD input from ED) end do - - END IF - - if ( p_FAST%CompMooring == Module_Orca ) then - p_FAST%SizeJac_Opt1(8) = Orca_PtfmMesh%NNodes*6 - else - p_FAST%SizeJac_Opt1(8) = 0 - end if - - if ( p_FAST%CompSub == Module_ExtPtfm ) then - p_FAST%SizeJac_Opt1(9) = ExtPtfm_PtfmMesh%NNodes*6 - else - p_FAST%SizeJac_Opt1(9) = 0 - end if - - - - p_FAST%SizeJac_Opt1(1) = sum( p_FAST%SizeJac_Opt1 ) ! all the inputs from these modules - - - ! allocate matrix to store jacobian - CALL AllocAry( MeshMapData%Jacobian_Opt1, p_FAST%SizeJac_Opt1(1), p_FAST%SizeJac_Opt1(1), "Jacobian for full option 1", ErrStat, ErrMsg ) - IF ( ErrStat /= ErrID_None ) RETURN - - ! allocate matrix to store index to help us figure out what the ith value of the u vector really means - ALLOCATE ( MeshMapData%Jac_u_indx( p_FAST%SizeJac_Opt1(1), 3 ), STAT = ErrStat ) - IF ( ErrStat /= 0 ) THEN - ErrStat = ErrID_Fatal - ErrMsg = 'Cannot allocate Jac_u_indx.' - RETURN - END IF - - ! fill matrix to store index to help us figure out what the ith value of the u vector really means - ! ( see Create_FullOpt1_UVector() ... these MUST match ) - ! column 1 indicates module's mesh and field - ! column 2 indicates the first index of the acceleration/load field - ! column 3 is the node - - !............... - ! ED inputs: - !............... - - index = 1 - if (p_FAST%CompHydro == Module_HD .or. p_FAST%CompSub /= Module_None .or. p_FAST%CompMooring == Module_Orca) then - - do i=1,ED_PlatformPtMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 1 !Module/Mesh/Field: u_ED%PlatformPtMesh%Force = 1 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - do i=1,ED_PlatformPtMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 2 !Module/Mesh/Field: u_ED%PlatformPtMesh%Moment = 2 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - end if - - - if (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) then - - do i=1,ED_HubPtLoad%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 3 !Module/Mesh/Field: u_ED%HubPtMesh%Force = 3 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - - do i=1,ED_HubPtLoad%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 4 !Module/Mesh/Field: u_ED%HubPtMesh%Moment = 4 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i + + ! Group (1,1) + associate (dX2dx2 => m%Mod%Lin%dXdx(p%iX2(1):p%iX2(2), p%iX2(1):p%iX2(2)), & + dX2dx1 => m%Mod%Lin%dXdx(p%iX2(1):p%iX2(2), p%iX1(1):p%iX1(2))) + m%J11 = -p%GammaPrime*dX2dx2 - p%BetaPrime*matmul(dX2dx1, m%Tan) + do i = p%iJX(1), p%iJX(2) + m%J11(i, i) = m%J11(i, i) + 1.0_R8Ki + end do + m%Mod%Lin%J(p%iJX(1):p%iJX(2), p%iJX(1):p%iJX(2)) = m%J11 + end associate + + ! Group (2,1) + if (p%iyT(1) > 0 .and. p%iUT(1) > 0) then + associate (dUTdyT => m%Mod%Lin%dUdy(p%iUT(1):p%iUT(2), p%iyT(1):p%iyT(2)), & + dYTdx2 => m%Mod%Lin%dYdx(p%iyT(1):p%iyT(2), p%iX2(1):p%iX2(2)), & + dYTdx1 => m%Mod%Lin%dYdx(p%iyT(1):p%iyT(2), p%iX1(1):p%iX1(2))) + m%Mod%Lin%J(p%iJUT(1):p%iJUT(2), p%iJX(1):p%iJX(2)) = & + p%GammaPrime*matmul(dUTdyT, dYTdx2) + p%BetaPrime*matmul(dUTdyT, matmul(dYTdx1, m%Tan)) + end associate + end if + + ! Group (1,2) + if (p%iUT(1) > 0) then + associate (J12 => m%Mod%Lin%J(p%iJX(1):p%iJX(2), p%iJUT(1):p%iJUT(2)), & + dX2duT => m%Mod%Lin%dXdu(p%iX2(1):p%iX2(2), p%iUT(1):p%iUT(2))) + J12 = -dX2duT + end associate + end if end if - - - !............... - ! SD inputs: - !............... - - ! SD_TPMesh - do i=1,SD_TPMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 5 !Module/Mesh/Field: u_SD%TPMesh%TranslationAcc = 5 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - do i=1,SD_TPMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 6 !Module/Mesh/Field: u_SD%TPMesh%RotationAcc = 6 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - IF ( p_FAST%CompHydro == Module_HD ) THEN ! this SD mesh linked only when HD is enabled - - ! SD_LMesh - do i=1,SD_LMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 7 !Module/Mesh/Field: u_SD%LMesh%Force = 7 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - do i=1,SD_LMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 8 !Module/Mesh/Field: u_SD%LMesh%Moment = 8 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - END IF - - !............... - ! HD inputs: - !............... - - !(Morison%Mesh) - do i=1,HD_M_Mesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 9 !Module/Mesh/Field: u_HD%Morison%Mesh%TranslationAcc = 9 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - do i=1,HD_M_Mesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 10 !Module/Mesh/Field: u_HD%Morison%Mesh%RotationAcc = 10 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - - !(Mesh) - do i=1,HD_WAMIT_Mesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 11 !Module/Mesh/Field: u_HD%WAMITMesh%TranslationAcc = 11 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - do i=1,HD_WAMIT_Mesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 12 !Module/Mesh/Field: u_HD%WAMITMesh%RotationAcc = 12 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - !............... - ! BD inputs: - !............... - - if (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) then - - do k=1,size(u_BD) - - do i=1,u_BD(k)%RootMotion%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 11 + 2*k !Module/Mesh/Field: u_BD(k)%RootMotion%TranslationAcc = 13 (k=1), 15 (k=2), 17 (k=3) - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - do i=1,u_BD(k)%RootMotion%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 12 + 2*k !Module/Mesh/Field: u_BD(k)%RootMotion%RotationAcc = 14 (k=1), 16 (k=2), 18 (k=3) - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - end do !k - - end if - - !............... - ! Orca inputs: - !............... - - ! Orca_PtfmMesh - do i=1,Orca_PtfmMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 19 !Module/Mesh/Field: u_Orca%PtfmMesh%TranslationAcc = 19 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - do i=1,Orca_PtfmMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 20 !Module/Mesh/Field: u_Orca%PtfmMesh%RotationAcc = 20 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - !............... - ! ExtPtfm inputs: - !............... - - ! ExtPtfm_PtfmMesh - do i=1,ExtPtfm_PtfmMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 21 !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%TranslationAcc = 21 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - do i=1,ExtPtfm_PtfmMesh%NNodes - do j=1,3 - MeshMapData%Jac_u_indx(index,1) = 22 !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%RotationAcc = 22 - MeshMapData%Jac_u_indx(index,2) = j !index: j - MeshMapData%Jac_u_indx(index,3) = i !Node: i - index = index + 1 - end do !j - end do !i - - -END SUBROUTINE Init_FullOpt1_Jacobian -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine basically packs the relevant parts of the modules' input meshes for use in this InputOutput solve. -!! Do not change the order of this packing without changing subroutine Init_FullOpt1_Jacobian()! -SUBROUTINE Create_FullOpt1_UVector(u, ED_PlatformPtMesh, SD_TPMesh, SD_LMesh, HD_M_Mesh, HD_WAMIT_Mesh, & - ED_HubPtLoad, BD_RootMotion, Orca_PtfmMesh, ExtPtfm_PtfmMesh, p_FAST ) -!.................................................................................................................................. - - REAL(ReKi) , INTENT(INOUT) :: u(:) !< output u vector - - ! input meshes for each of the 3 modules: - TYPE(MeshType) , INTENT(IN ) :: ED_PlatformPtMesh !< ElastoDyn PlatformPt mesh - TYPE(MeshType) , INTENT(IN ) :: SD_TPMesh !< SubDyn TP mesh - TYPE(MeshType) , INTENT(IN ) :: SD_LMesh !< SubDyn Lmesh - TYPE(MeshType) , INTENT(IN ) :: HD_M_Mesh !< HydroDyn Morison Lumped mesh - TYPE(MeshType) , INTENT(IN ) :: HD_WAMIT_Mesh !< HydroDyn WAMIT mesh - TYPE(MeshType) , INTENT(IN ) :: ED_HubPtLoad !< ElastoDyn HubPt mesh - TYPE(MeshType), ALLOCATABLE , INTENT(IN ) :: BD_RootMotion(:) !< BeamDyn RootMotion meshes - TYPE(MeshType) , INTENT(IN ) :: Orca_PtfmMesh !< OrcaFlex interface PtfmMesh - TYPE(MeshType) , INTENT(IN ) :: ExtPtfm_PtfmMesh !< ExtPtfm interface PtfmMesh - - TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< FAST parameters - - - ! local variables: - INTEGER(IntKi) :: i, k, indx_first, indx_last - - !............... - ! ED inputs: - !............... - if (p_FAST%CompHydro == Module_HD .or. p_FAST%CompSub /= Module_None .or. p_FAST%CompMooring == MODULE_Orca) then - u( 1: 3) = ED_PlatformPtMesh%Force(:,1) / p_FAST%UJacSclFact - u( 4: 6) = ED_PlatformPtMesh%Moment(:,1) / p_FAST%UJacSclFact - indx_first = 7 - else - indx_first = 1 + + ! Group (2,2) - Inputs = dUdu + matmul(dUdy, dYdu) + if (p%iJU(1) > 0) then + J22 = m%Mod%Lin%dUdu + call LAPACK_GEMM('N', 'N', 1.0_R8Ki, m%Mod%Lin%dUdy, m%Mod%Lin%dYdu, 1.0_R8Ki, J22, ErrStat2, ErrMsg2); if (Failed()) return + m%Mod%Lin%J(p%iJU(1):p%iJU(2), p%iJU(1):p%iJU(2)) = J22 end if - - - if (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) then - - do i=1,ED_HubPtLoad%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = ED_HubPtLoad%Force(:,i) / p_FAST%UJacSclFact - indx_first = indx_last + 1 - end do - - do i=1,ED_HubPtLoad%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = ED_HubPtLoad%Moment(:,i) / p_FAST%UJacSclFact - indx_first = indx_last + 1 + + ! Write debug matrices if requested + if (DebugJacobian) then + + ! Get module outputs + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_GetOP(ModData, ThisTime, INPUT_CURR, STATE_PRED, Turbine, ErrStat2, ErrMsg2, & + y_op=ModData%Lin%y, y_glue=m%Mod%Lin%y) + if (Failed()) return + end associate end do - + + ! Write debug info + call BuildJacobian_Debug(m, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + end if + + ! Condition jacobian matrix before factoring + if (p%iJL(1) > 0) then + m%Mod%Lin%J(p%iJL(1):p%iJL(2), :) = m%Mod%Lin%J(p%iJL(1):p%iJL(2), :)/p%Scale_UJac + m%Mod%Lin%J(:, p%iJL(1):p%iJL(2)) = m%Mod%Lin%J(:, p%iJL(1):p%iJL(2))*p%Scale_UJac end if - - - !............... - ! SD inputs (SD_TPMesh): - !............... - do i=1,SD_TPMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = SD_TPMesh%TranslationAcc(:,i) - indx_first = indx_last + 1 + + ! Factor jacobian matrix + call LAPACK_getrf(size(m%Mod%Lin%J, 1), size(m%Mod%Lin%J, 2), m%Mod%Lin%J, m%IPIV, ErrStat2, ErrMsg2) + if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +! Build Jacobian for Input-Output solve (FAST_CalcOutputsAndSolveForInputs) +subroutine BuildJacobianIO(p, m, GlueModMaps, ThisTime, iState, Turbine, ErrStat, ErrMsg) + type(Glue_TCParam), intent(in) :: p !< Parameters + type(Glue_TCMisc), intent(inout) :: m !< Misc variables + type(MappingType), intent(inout) :: GlueModMaps(:) !< Module mappings at glue level + real(DbKi), intent(in) :: ThisTime !< Time + integer(IntKi), intent(in) :: iState !< State index + type(FAST_TurbineType), intent(inout) :: Turbine !< Turbine type + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'BuildJacobian' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + real(R8Ki) :: phi, rv(3), T(3, 3), tmp1, tmp2, T2(3, 3) + integer(IntKi) :: i, j, k, idx + + ErrStat = ErrID_None + ErrMsg = '' + + !---------------------------------------------------------------------------- + ! Initialize matrices + !---------------------------------------------------------------------------- + + m%Mod%Lin%dYdu = 0.0_R8Ki + m%Mod%Lin%dUdy = 0.0_R8Ki + + call Eye2D(m%Mod%Lin%dUdu, ErrStat2, ErrMsg2) + if (Failed()) return + + !---------------------------------------------------------------------------- + ! Calculate Input-Output Solve Jacobian for TC and Option 1 modules + !---------------------------------------------------------------------------- + + ! Loop through TC and Option 1 modules and calculate dYdu + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call FAST_JacobianPInput(ModData, ThisTime, INPUT_CURR, iState, Turbine, ErrStat2, ErrMsg2, & + dYdu=ModData%Lin%dYdu, dYdu_glue=m%Mod%Lin%dYdu) + if (Failed()) return + end associate end do - do i=1,SD_TPMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = SD_TPMesh%RotationAcc(:,i) - indx_first = indx_last + 1 + ! Calculate dUdu and dUdy for TC and Option 1 modules + call FAST_LinearizeMappings(m%Mod, GlueModMaps, Turbine, ErrStat2, ErrMsg2) + if (Failed()) return + + !---------------------------------------------------------------------------- + ! Assemble Jacobian + !---------------------------------------------------------------------------- + + ! Jac = m%Mod%Lin%dUdu + matmul(m%Mod%Lin%dUdy, m%Mod%Lin%dYdu) + m%IO_Jac = m%Mod%Lin%dUdu + call LAPACK_GEMM('N', 'N', 1.0_R8Ki, m%Mod%Lin%dUdy, m%Mod%Lin%dYdu, 1.0_R8Ki, m%IO_Jac, ErrStat2, ErrMsg2) + if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +!------------------------------------------------------------------------------- +! Utility functions +!------------------------------------------------------------------------------- + +pure subroutine PredictNextState(p, State, Vars) + type(Glue_TCParam), intent(in) :: p + type(TC_State), intent(inout) :: State + type(ModVarsType), intent(in) :: Vars + real(R8Ki) :: v_p, vd_p, a_p + integer(IntKi) :: i + + ! Loop through values and calculate acceleration, algo acceleration, velocity, and delta displacement + do i = 1, size(State%q) + + ! Store previous velocity, acceleration, and algorithmic acceleration + v_p = State%v(i) + vd_p = State%vd(i) + a_p = State%a(i) + + ! Set acceleration to zero + State%vd(i) = 0.0_R8Ki + + ! Calculate new algorithmic acceleration + State%a(i) = (p%AlphaF*vd_p - p%AlphaM*a_p)/(1.0_R8Ki - p%AlphaM) + + ! Calculate new velocity + State%v(i) = v_p + p%h*(1.0_R8Ki - p%Gamma)*a_p + p%Gamma*p%h*State%a(i) + + ! Copy current displacement to previous displacement + State%q_prev(i) = State%q(i) + + ! Predict change in displacement + State%x(i) = p%h*v_p + p%h*p%h*(0.5_R8Ki - p%Beta)*a_p + p%Beta*p%h*p%h*State%a(i) end do - - if ( p_FAST%CompHydro == Module_HD ) then ! this SD mesh linked only when HD is enabled - ! SD inputs (SD_LMesh): - do i=1,SD_LMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = SD_LMesh%Force(:,i) / p_FAST%UJacSclFact - indx_first = indx_last + 1 - end do - - do i=1,SD_LMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = SD_LMesh%Moment(:,i) / p_FAST%UJacSclFact - indx_first = indx_last + 1 - end do - end if - - !............... - ! HD inputs (Morison%Mesh): - !............... - do i=1,HD_M_Mesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = HD_M_Mesh%TranslationAcc(:,i) - indx_first = indx_last + 1 + + ! Calculate new displacements from delta + call CalculateStateQ(State, Vars, p%h) +end subroutine + +pure subroutine CalculateStateQ(State, Vars, h) + type(TC_State), intent(inout) :: State + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: h + integer(IntKi) :: i, j, iq + real(R8Ki) :: quat_prev(3), quat_delta(3), quat_new(3) + real(R8Ki) :: T(3,3), psi(3), psi_norm, psi_tilde(3,3) + + ! Calculate new displacement (valid for all states except orientation) + State%q = State%q_prev + State%x + + ! Loop through variables and compose rotations + do i = 1, size(Vars%x) + select case (Vars%x(i)%Field) + case (FieldOrientation) + iq = Vars%x(i)%iq(1) + do j = 1, Vars%x(i)%Nodes + quat_delta = rvec_to_quat(State%x(iq:iq + 2)) + quat_prev = State%q_prev(iq:iq + 2) + quat_new = quat_compose(quat_prev, quat_delta) + State%q(iq:iq + 2) = quat_new + iq = iq + 3 + end do + end select end do - - do i=1,HD_M_Mesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = HD_M_Mesh%RotationAcc(:,i) - indx_first = indx_last + 1 +end subroutine + +pure subroutine UpdateStatePrediction(p, Vars, delta_vd, State) + type(Glue_TCParam), intent(in) :: p + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: delta_vd(:) + type(TC_State), intent(inout) :: State + + ! Update x by delta x + State%x = State%x + p%BetaPrime*delta_vd + + ! Update velocity + State%v = State%v + p%GammaPrime*delta_vd + + ! Update acceleration + State%vd = State%vd + delta_vd + + ! Update algorithmic acceleration + State%a = State%a + (1.0_R8Ki - p%AlphaF)/(1.0_R8Ki - p%AlphaM)*delta_vd + + ! Update displacement calculation + call CalculateStateQ(State, Vars, p%h) + +end subroutine + +pure subroutine TransferXtoQ(ModData, x, State) + type(ModDataType), intent(in) :: ModData + real(R8Ki), intent(in) :: x(:) + type(TC_State), intent(inout) :: State + integer(IntKi) :: i + do i = 1, size(ModData%Vars%x) + associate (Var => ModData%Vars%x(i)) + select case (Var%DerivOrder) + case (0) ! Displacement + State%q(Var%iq(1):Var%iq(2)) = x(Var%iGlu(1):Var%iGlu(2)) + case (1) ! Velocity + State%v(Var%iq(1):Var%iq(2)) = x(Var%iGlu(1):Var%iGlu(2)) + end select + end associate end do - - ! HD inputs (Mesh): - do i=1,HD_WAMIT_Mesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = HD_WAMIT_Mesh%TranslationAcc(:,i) - indx_first = indx_last + 1 +end subroutine + +pure subroutine TransferQtoX(ModData, State, x) + type(ModDataType), intent(in) :: ModData + type(TC_State), intent(in) :: State + real(R8Ki), intent(inout) :: x(:) + integer(IntKi) :: i + do i = 1, size(ModData%Vars%x) + associate (Var => ModData%Vars%x(i)) + select case (Var%DerivOrder) + case (0) ! Displacement + x(Var%iGlu(1):Var%iGlu(2)) = State%q(Var%iq(1):Var%iq(2)) + case (1) ! Velocity + x(Var%iGlu(1):Var%iGlu(2)) = State%v(Var%iq(1):Var%iq(2)) + end select + end associate end do - - do i=1,HD_WAMIT_Mesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = HD_WAMIT_Mesh%RotationAcc(:,i) - indx_first = indx_last + 1 - end do - - !............... - ! BD inputs: - !............... - if (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) then - - do k=1,p_FAST%nBeams - - do i=1,BD_RootMotion(k)%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = BD_RootMotion(k)%TranslationAcc(:,i) - indx_first = indx_last + 1 - end do !i - - do i=1,BD_RootMotion(k)%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = BD_RootMotion(k)%RotationAcc(:,i) - indx_first = indx_last + 1 - end do !i - - end do !k - - end if - - !............... - ! Orca inputs (Orca_PtfmMesh): - !............... - do i=1,Orca_PtfmMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = Orca_PtfmMesh%TranslationAcc(:,i) - indx_first = indx_last + 1 +end subroutine + +pure subroutine SetBDAccel(ModData, State, BD_OtherSt) + type(ModDataType), intent(in) :: ModData + type(TC_State), intent(in) :: State + type(BD_OtherStateType), intent(inout) :: BD_OtherSt + integer(IntKi) :: i + do i = 1, size(ModData%Vars%x) + associate (Var => ModData%Vars%x(i)) + select case (Var%Field) + case (FieldTransVel, FieldAngularVel) + BD_OtherSt%acc(Var%iLB:Var%iUB, Var%j) = State%vd(Var%iq(1):Var%iq(2)) + BD_OtherSt%xcc(Var%iLB:Var%iUB, Var%j) = State%a(Var%iq(1):Var%iq(2)) + end select + end associate + end do +end subroutine + +pure subroutine GetBDAccel(ModData, BD_OtherSt, State) + type(ModDataType), intent(in) :: ModData + type(BD_OtherStateType), intent(in) :: BD_OtherSt + type(TC_State), intent(inout) :: State + integer(IntKi) :: i + do i = 1, size(ModData%Vars%x) + associate (Var => ModData%Vars%x(i)) + select case (Var%Field) + case (FieldTransVel, FieldAngularVel) + State%vd(Var%iq(1):Var%iq(2)) = BD_OtherSt%acc(Var%iLB:Var%iUB, Var%j) + State%a(Var%iq(1):Var%iq(2)) = BD_OtherSt%xcc(Var%iLB:Var%iUB, Var%j) + end select + end associate + end do +end subroutine + +!------------------------------------------------------------------------------- +! Debugging routines +!------------------------------------------------------------------------------- + +subroutine Solver_Init_Debug(p, m, GlueModData, GlueModMaps) + type(Glue_TCParam), intent(in) :: p !< Parameters + type(Glue_TCMisc), intent(in) :: m !< Misc variables + type(ModDataType), intent(in) :: GlueModData(:) !< Module data + type(MappingType), intent(in) :: GlueModMaps(:) !< Module mappings at glue level + integer(IntKi) :: i, j + + write (DebugUn, '(A,*(I6))') " p%iJX2 = ", p%iJX + write (DebugUn, '(A,*(I6))') " p%iJUT = ", p%iJUT + write (DebugUn, '(A,*(I6))') " p%iJU = ", p%iJU + write (DebugUn, '(A,*(I6))') " p%iJL = ", p%iJL + write (DebugUn, '(A,*(I6))') " p%iX2 = ", p%iX2 + write (DebugUn, '(A,*(I6))') " p%iX1 = ", p%iX1 + write (DebugUn, '(A,*(I6))') " p%iUT = ", p%iUT + write (DebugUn, '(A,*(I6))') " p%iU1 = ", p%iU1 + write (DebugUn, '(A,*(I6))') " p%iyT = ", p%iyT + write (DebugUn, '(A,*(I6))') " p%iy1 = ", p%iy1 + write (DebugUn, *) "shape(m%dYdx) = ", shape(m%Mod%Lin%dYdx) + write (DebugUn, *) "shape(m%dYdu) = ", shape(m%Mod%Lin%dYdu) + write (DebugUn, *) "shape(m%dXdx) = ", shape(m%Mod%Lin%dXdx) + write (DebugUn, *) "shape(m%dXdu) = ", shape(m%Mod%Lin%dXdu) + write (DebugUn, *) "shape(m%dUdu) = ", shape(m%Mod%Lin%dUdu) + write (DebugUn, *) "shape(m%dUdy) = ", shape(m%Mod%Lin%dUdy) + + do j = 1, size(m%Mod%Vars%x) + write (DebugUn, *) "Var = X "//trim(m%Mod%Vars%x(j)%Name)// & + " ("//trim(MV_FieldString(m%Mod%Vars%x(j)%Field))//")" + write (DebugUn, '(A,*(I6))') " X iLoc = ", m%Mod%Vars%x(j)%iLoc + write (DebugUn, '(A,*(I6))') " X iq = ", m%Mod%Vars%x(j)%iq + end do + do j = 1, size(m%Mod%Vars%u) + write (DebugUn, *) "Var = U "//trim(m%Mod%Vars%u(j)%Name)// & + " ("//trim(MV_FieldString(m%Mod%Vars%u(j)%Field))//")" + write (DebugUn, '(A,*(I6))') " U iLoc = ", m%Mod%Vars%u(j)%iLoc + end do + do j = 1, size(m%Mod%Vars%y) + write (DebugUn, *) "Var = Y "//trim(m%Mod%Vars%y(j)%Name)// & + " ("//trim(MV_FieldString(m%Mod%Vars%y(j)%Field))//")" + write (DebugUn, '(A,*(I6))') " Y iLoc = ", m%Mod%Vars%y(j)%iLoc end do - do i=1,Orca_PtfmMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = Orca_PtfmMesh%RotationAcc(:,i) - indx_first = indx_last + 1 - end do - - !............... - ! ExtPtfm inputs (ExtPtfm_PtfmMesh): - !............... - do i=1,ExtPtfm_PtfmMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = ExtPtfm_PtfmMesh%TranslationAcc(:,i) - indx_first = indx_last + 1 + do i = 1, size(GlueModMaps) + associate (SrcMod => GlueModData(GlueModMaps(i)%iModSrc), & + DstMod => GlueModData(GlueModMaps(i)%iModDst)) + write (DebugUn, *) "Mapping = "//GlueModMaps(i)%Desc + write (DebugUn, *) " Src = "//trim(SrcMod%Abbr)//' Ins:'//trim(num2lstr(SrcMod%Ins))//' iMod:'//trim(num2lstr(SrcMod%iMod)) + write (DebugUn, *) " Dst = "//trim(DstMod%Abbr)//' Ins:'//trim(num2lstr(DstMod%Ins))//' iMod:'//trim(num2lstr(DstMod%iMod)) + end associate end do +end subroutine + +subroutine Solver_Step_Debug(p, m, step, iterCorr, iterConv, delta_norm) + type(Glue_TCParam), intent(in) :: p !< Parameters + type(Glue_TCMisc), intent(in) :: m !< Misc variables + integer(IntKi), intent(in) :: step + integer(IntKi), intent(in) :: iterCorr + integer(IntKi), intent(in) :: iterConv + real(R8Ki), intent(in) :: delta_norm + + write (DebugUn, *) "step = ", step + write (DebugUn, *) "iterCorr = ", iterCorr + write (DebugUn, *) "iterConv = ", iterConv + if (p%iJX(1) > 0) write (DebugUn, '(A,*(ES16.7))') " delta_x = ", m%XB(p%iJX(1):p%iJX(2), 1) + if (p%iJU(1) > 0) write (DebugUn, '(A,*(ES16.7))') " delta_u = ", m%XB(p%iJU(1):p%iJU(2), 1) + if (allocated(m%uCalc)) write (DebugUn, '(A,*(ES16.7))') " uCalc = ", m%uCalc + if (allocated(m%Mod%Lin%x)) write (DebugUn, '(A,*(ES16.7))') " x = ", m%Mod%Lin%x + if (allocated(m%Mod%Lin%u)) write (DebugUn, '(A,*(ES16.7))') " u = ", m%Mod%Lin%u + write (DebugUn, *) "delta_norm = ", delta_norm +end subroutine + +subroutine BuildJacobian_Debug(m, T, ErrStat, ErrMsg) + type(Glue_TCMisc), intent(inout) :: m !< Misc variables + type(FAST_TurbineType), intent(in) :: T !< Turbine + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(*), parameter :: RoutineName = 'BuildJacobian_Debug' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + + if (MatrixUn == -1) then + call GetNewUnit(MatrixUn, ErrStat2, ErrMsg2); if (Failed()) return + end if - do i=1,ExtPtfm_PtfmMesh%NNodes - indx_last = indx_first + 2 - u(indx_first:indx_last) = ExtPtfm_PtfmMesh%RotationAcc(:,i) - indx_first = indx_last + 1 - end do - - -END SUBROUTINE Create_FullOpt1_UVector -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine adds u_delta to the corresponding mesh field and scales it as appropriate -SUBROUTINE Add_FullOpt1_u_delta( p_FAST, Jac_u_indx, u_delta, u_ED, u_SD, u_HD, u_BD, u_Orca, u_ExtPtfm ) -!.................................................................................................................................. - TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - INTEGER( IntKi ) , INTENT(IN ) :: Jac_u_indx(:,:) !< Index to map Jacobian u-vector into mesh fields - REAL( ReKi ) , INTENT(IN ) :: u_delta(:) !< The delta amount to add to the appropriate mesh fields - TYPE(ED_InputType) , INTENT(INOUT) :: u_ED !< ED System inputs - TYPE(SD_InputType) , INTENT(INOUT) :: u_SD !< SD System inputs - TYPE(HydroDyn_InputType) , INTENT(INOUT) :: u_HD !< SD System inputs - TYPE(BD_InputType) , INTENT(INOUT) :: u_BD(:) !< BD System inputs - TYPE(Orca_InputType) , INTENT(INOUT) :: u_Orca !< Orca System inputs - TYPE(ExtPtfm_InputType) , INTENT(INOUT) :: u_ExtPtfm !< ExtPtfm System inputs - - ! local variables - INTEGER :: n - INTEGER :: fieldIndx - INTEGER :: node - - - DO n = 1,SIZE(u_delta) - - fieldIndx = Jac_u_indx(n,2) - node = Jac_u_indx(n,3) - - ! determine which mesh we're trying to perturb and perturb the input: - SELECT CASE( Jac_u_indx(n,1) ) - - CASE ( 1) !Module/Mesh/Field: u_ED%PlatformPtMesh%Force = 1 - u_ED%PlatformPtMesh%Force( fieldIndx,node) = u_ED%PlatformPtMesh%Force( fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - CASE ( 2) !Module/Mesh/Field: u_ED%PlatformPtMesh%Moment = 2 - u_ED%PlatformPtMesh%Moment(fieldIndx,node) = u_ED%PlatformPtMesh%Moment(fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - CASE ( 3) !Module/Mesh/Field: u_ED%HubPtMesh%Force = 3 - u_ED%HubPtLoad%Force( fieldIndx,node) = u_ED%HubPtLoad%Force( fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - CASE ( 4) !Module/Mesh/Field: u_ED%HubPtMesh%Moment = 4 - u_ED%HubPtLoad%Moment(fieldIndx,node) = u_ED%HubPtLoad%Moment(fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - - CASE ( 5) !Module/Mesh/Field: u_SD%TPMesh%TranslationAcc = 5 - u_SD%TPMesh%TranslationAcc(fieldIndx,node) = u_SD%TPMesh%TranslationAcc(fieldIndx,node) + u_delta(n) - CASE ( 6) !Module/Mesh/Field: u_SD%TPMesh%RotationAcc = 6 - u_SD%TPMesh%RotationAcc( fieldIndx,node) = u_SD%TPMesh%RotationAcc( fieldIndx,node) + u_delta(n) - CASE ( 7) !Module/Mesh/Field: u_SD%LMesh%Force = 7 - u_SD%LMesh%Force( fieldIndx,node) = u_SD%LMesh%Force( fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - CASE ( 8) !Module/Mesh/Field: u_SD%LMesh%Moment = 8 - u_SD%LMesh%Moment(fieldIndx,node) = u_SD%LMesh%Moment(fieldIndx,node) + u_delta(n) * p_FAST%UJacSclFact - - CASE ( 9) !Module/Mesh/Field: u_HD%Morison%Mesh%TranslationAcc = 9 - u_HD%Morison%Mesh%TranslationAcc(fieldIndx,node) = u_HD%Morison%Mesh%TranslationAcc(fieldIndx,node) + u_delta(n) - CASE (10) !Module/Mesh/Field: u_HD%Morison%Mesh%RotationAcc = 10 - u_HD%Morison%Mesh%RotationAcc( fieldIndx,node) = u_HD%Morison%Mesh%RotationAcc( fieldIndx,node) + u_delta(n) - - CASE (11) !Module/Mesh/Field: u_HD%WAMITMesh%TranslationAcc = 11 - u_HD%WAMITMesh%TranslationAcc( fieldIndx,node) = u_HD%WAMITMesh%TranslationAcc( fieldIndx,node) + u_delta(n) - CASE (12) !Module/Mesh/Field: u_HD%WAMITMesh%RotationAcc = 12 - u_HD%WAMITMesh%RotationAcc( fieldIndx,node) = u_HD%WAMITMesh%RotationAcc( fieldIndx,node) + u_delta(n) - - CASE (13) !Module/Mesh/Field: u_BD(1)%RootMotion%TranslationAcc = 13 (k=1) - u_BD(1)%RootMotion%TranslationAcc(fieldIndx,node) = u_BD(1)%RootMotion%TranslationAcc(fieldIndx,node) + u_delta(n) - CASE (14) !Module/Mesh/Field: u_BD(1)%RootMotion%RotationAcc = 14 (k=1) - u_BD(1)%RootMotion%RotationAcc( fieldIndx,node) = u_BD(1)%RootMotion%RotationAcc( fieldIndx,node) + u_delta(n) - CASE (15) !Module/Mesh/Field: u_BD(2)%RootMotion%TranslationAcc = 15 (k=2) - u_BD(2)%RootMotion%TranslationAcc(fieldIndx,node) = u_BD(2)%RootMotion%TranslationAcc(fieldIndx,node) + u_delta(n) - CASE (16) !Module/Mesh/Field: u_BD(2)%RootMotion%RotationAcc = 16 (k=2) - u_BD(2)%RootMotion%RotationAcc( fieldIndx,node) = u_BD(2)%RootMotion%RotationAcc( fieldIndx,node) + u_delta(n) - CASE (17) !Module/Mesh/Field: u_BD(3)%RootMotion%TranslationAcc = 17 (k=3) - u_BD(3)%RootMotion%TranslationAcc(fieldIndx,node) = u_BD(3)%RootMotion%TranslationAcc(fieldIndx,node) + u_delta(n) - CASE (18) !Module/Mesh/Field: u_BD(3)%RootMotion%RotationAcc = 18 (k=3) - u_BD(3)%RootMotion%RotationAcc( fieldIndx,node) = u_BD(3)%RootMotion%RotationAcc( fieldIndx,node) + u_delta(n) - - CASE (19) !Module/Mesh/Field: u_Orca%PtfmMesh%TranslationAcc = 19 - u_Orca%PtfmMesh%TranslationAcc( fieldIndx,node) = u_Orca%PtfmMesh%TranslationAcc( fieldIndx,node) + u_delta(n) - CASE (20) !Module/Mesh/Field: u_Orca%PtfmMesh%RotationAcc = 20 - u_Orca%PtfmMesh%RotationAcc( fieldIndx,node) = u_Orca%PtfmMesh%RotationAcc( fieldIndx,node) + u_delta(n) - - CASE (21) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%TranslationAcc = 21 - u_ExtPtfm%PtfmMesh%TranslationAcc( fieldIndx,node) = u_ExtPtfm%PtfmMesh%TranslationAcc( fieldIndx,node) + u_delta(n) - CASE (22) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%RotationAcc = 22 - u_ExtPtfm%PtfmMesh%RotationAcc( fieldIndx,node) = u_ExtPtfm%PtfmMesh%RotationAcc( fieldIndx,node) + u_delta(n) - - END SELECT - - END DO - -END SUBROUTINE Add_FullOpt1_u_delta -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) -SUBROUTINE Perturb_u_FullOpt1( p_FAST, Jac_u_indx, n, u_perturb, u_ED_perturb, u_SD_perturb, u_HD_perturb, u_BD_perturb, & - u_Orca_perturb, u_ExtPtfm_perturb, perturb ) -!............................................................................................................................... - TYPE(FAST_ParameterType) , INTENT(IN ) :: p_FAST !< Glue-code simulation parameters - INTEGER( IntKi ) , INTENT(IN ) :: Jac_u_indx(:,:) !< Index to map Jacobian u-vector into mesh fields - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - REAL( ReKi ) , INTENT(INOUT) :: u_perturb(:) !< array to be perturbed - TYPE(ED_InputType), OPTIONAL , INTENT(INOUT) :: u_ED_perturb !< ED System inputs (needed only when 1 <= n <= NumEDNodes=NumEDNodes) - TYPE(SD_InputType), OPTIONAL , INTENT(INOUT) :: u_SD_perturb !< SD System inputs (needed only when NumEDNodes +1 <= n <= NumEDNodes+NumSDNodes) [if SD is used] - TYPE(HydroDyn_InputType), OPTIONAL , INTENT(INOUT) :: u_HD_perturb !< HD System inputs (needed only when NumEDNodes+NumSDNodes +1 <= n <= NumEDNodes+NumSDNodes+NumHDNodes) [if HD is used and SD is used. if SD not used, - TYPE(BD_InputType), OPTIONAL , INTENT(INOUT) :: u_BD_perturb !< BD System inputs (needed only when NumEDNodes+NumSDNodes+NumHDNodes+1 <= n <= inf) [if BD is used] - TYPE(Orca_InputType), OPTIONAL , INTENT(INOUT) :: u_Orca_perturb !< Orca System inputs (needed only when NumEDNodes+NumSDNodes+NumHDNodes+NumBDNodes+1 <= n <= inf) [if Orca is used] - TYPE(ExtPtfm_InputType), OPTIONAL , INTENT(INOUT) :: u_ExtPtfm_perturb !< ExtPtfm System inputs (needed only when NumEDNodes+NumSDNodes+NumHDNodes+NumBDNodes+NumOcraNodes+1 <= n <= inf) [if ExtPtfm is used] - REAL( ReKi ) , INTENT( OUT) :: perturb !< amount that u_perturb(n) was perturbed - - ! local variables - INTEGER :: fieldIndx - INTEGER :: node - - - fieldIndx = Jac_u_indx(n,2) - node = Jac_u_indx(n,3) - - ! determine which mesh we're trying to perturb and perturb the input: - SELECT CASE( Jac_u_indx(n,1) ) - - CASE ( 1) !Module/Mesh/Field: u_ED%PlatformPtMesh%Force = 1 - perturb = GetPerturb( u_ED_perturb%PlatformPtMesh%Force(fieldIndx , node) ) - u_ED_perturb%PlatformPtMesh%Force( fieldIndx,node) = u_ED_perturb%PlatformPtMesh%Force( fieldIndx,node) + perturb * p_FAST%UJacSclFact - CASE ( 2) !Module/Mesh/Field: u_ED%PlatformPtMesh%Moment = 2 - perturb = GetPerturb( u_ED_perturb%PlatformPtMesh%Moment(fieldIndx , node) ) - u_ED_perturb%PlatformPtMesh%Moment(fieldIndx,node) = u_ED_perturb%PlatformPtMesh%Moment(fieldIndx,node) + perturb * p_FAST%UJacSclFact - CASE ( 3) !Module/Mesh/Field: u_ED%HubPtMesh%Force = 3 - perturb = GetPerturb( u_ED_perturb%HubPtLoad%Force(fieldIndx , node) ) - u_ED_perturb%HubPtLoad%Force( fieldIndx,node) = u_ED_perturb%HubPtLoad%Force( fieldIndx,node) + perturb * p_FAST%UJacSclFact - CASE ( 4) !Module/Mesh/Field: u_ED%HubPtMesh%Moment = 4 - perturb = GetPerturb( u_ED_perturb%HubPtLoad%Moment(fieldIndx , node) ) - u_ED_perturb%HubPtLoad%Moment( fieldIndx,node) = u_ED_perturb%HubPtLoad%Moment( fieldIndx,node) + perturb * p_FAST%UJacSclFact - - CASE ( 5) !Module/Mesh/Field: u_SD%TPMesh%TranslationAcc = 5 - perturb = GetPerturb( u_SD_perturb%TPMesh%TranslationAcc(fieldIndx , node) ) - u_SD_perturb%TPMesh%TranslationAcc(fieldIndx,node) = u_SD_perturb%TPMesh%TranslationAcc(fieldIndx,node) + perturb - CASE ( 6) !Module/Mesh/Field: u_SD%TPMesh%RotationAcc = 6 - perturb = GetPerturb( u_SD_perturb%TPMesh%RotationAcc(fieldIndx , node) ) - u_SD_perturb%TPMesh%RotationAcc( fieldIndx,node) = u_SD_perturb%TPMesh%RotationAcc( fieldIndx,node) + perturb - CASE ( 7) !Module/Mesh/Field: u_SD%LMesh%Force = 7 - perturb = GetPerturb( u_SD_perturb%LMesh%Force(fieldIndx , node) ) - u_SD_perturb%LMesh%Force( fieldIndx,node) = u_SD_perturb%LMesh%Force( fieldIndx,node) + perturb * p_FAST%UJacSclFact - CASE ( 8) !Module/Mesh/Field: u_SD%LMesh%Moment = 8 - perturb = GetPerturb( u_SD_perturb%LMesh%Moment(fieldIndx , node) ) - u_SD_perturb%LMesh%Moment(fieldIndx,node) = u_SD_perturb%LMesh%Moment(fieldIndx,node) + perturb * p_FAST%UJacSclFact - - CASE ( 9) !Module/Mesh/Field: u_HD%Morison%Mesh%TranslationAcc = 9 - perturb = GetPerturb( u_HD_perturb%Morison%Mesh%TranslationAcc(fieldIndx , node) ) - u_HD_perturb%Morison%Mesh%TranslationAcc(fieldIndx,node) = u_HD_perturb%Morison%Mesh%TranslationAcc(fieldIndx,node) + perturb - CASE ( 10) !Module/Mesh/Field: u_HD%Morison%Mesh%RotationAcc = 10 - perturb = GetPerturb( u_HD_perturb%Morison%Mesh%RotationAcc(fieldIndx , node) ) - u_HD_perturb%Morison%Mesh%RotationAcc( fieldIndx,node) = u_HD_perturb%Morison%Mesh%RotationAcc( fieldIndx,node) + perturb - - CASE (11) !Module/Mesh/Field: u_HD%WAMITMesh%TranslationAcc = 11 - perturb = GetPerturb( u_HD_perturb%WAMITMesh%TranslationAcc(fieldIndx , node) ) - u_HD_perturb%WAMITMesh%TranslationAcc(fieldIndx,node) = u_HD_perturb%WAMITMesh%TranslationAcc(fieldIndx,node) + perturb - CASE (12) !Module/Mesh/Field: u_HD%WAMITMesh%RotationAcc = 12 - perturb = GetPerturb( u_HD_perturb%WAMITMesh%RotationAcc(fieldIndx , node) ) - u_HD_perturb%WAMITMesh%RotationAcc( fieldIndx,node) = u_HD_perturb%WAMITMesh%RotationAcc( fieldIndx,node) + perturb - - CASE (13) !Module/Mesh/Field: u_BD(1)%RootMotion%TranslationAcc = 13 (k=1) - perturb = GetPerturb( u_BD_perturb%RootMotion%TranslationAcc(fieldIndx , node) ) - u_BD_perturb%RootMotion%TranslationAcc(fieldIndx,node) = u_BD_perturb%RootMotion%TranslationAcc(fieldIndx,node) + perturb - CASE (14) !Module/Mesh/Field: u_BD(1)%RootMotion%RotationAcc = 14 (k=1) - perturb = GetPerturb( u_BD_perturb%RootMotion%RotationAcc(fieldIndx , node) ) - u_BD_perturb%RootMotion%RotationAcc( fieldIndx,node) = u_BD_perturb%RootMotion%RotationAcc( fieldIndx,node) + perturb - CASE (15) !Module/Mesh/Field: u_BD(2)%RootMotion%TranslationAcc = 15 (k=2) - perturb = GetPerturb( u_BD_perturb%RootMotion%TranslationAcc(fieldIndx , node) ) - u_BD_perturb%RootMotion%TranslationAcc(fieldIndx,node) = u_BD_perturb%RootMotion%TranslationAcc(fieldIndx,node) + perturb - CASE (16) !Module/Mesh/Field: u_BD(2)%RootMotion%RotationAcc = 16 (k=2) - perturb = GetPerturb( u_BD_perturb%RootMotion%RotationAcc(fieldIndx , node) ) - u_BD_perturb%RootMotion%RotationAcc( fieldIndx,node) = u_BD_perturb%RootMotion%RotationAcc( fieldIndx,node) + perturb - CASE (17) !Module/Mesh/Field: u_BD(3)%RootMotion%TranslationAcc = 17 (k=3) - perturb = GetPerturb( u_BD_perturb%RootMotion%TranslationAcc(fieldIndx , node) ) - u_BD_perturb%RootMotion%TranslationAcc(fieldIndx,node) = u_BD_perturb%RootMotion%TranslationAcc(fieldIndx,node) + perturb - CASE (18) !Module/Mesh/Field: u_BD(3)%RootMotion%RotationAcc = 18 (k=3) - perturb = GetPerturb( u_BD_perturb%RootMotion%RotationAcc(fieldIndx , node) ) - u_BD_perturb%RootMotion%RotationAcc( fieldIndx,node) = u_BD_perturb%RootMotion%RotationAcc( fieldIndx,node) + perturb - - CASE (19) !Module/Mesh/Field: u_Orca%PtfmMesh%TranslationAcc = 19 - perturb = GetPerturb( u_Orca_perturb%PtfmMesh%TranslationAcc(fieldIndx , node) ) - u_Orca_perturb%PtfmMesh%TranslationAcc(fieldIndx,node) = u_Orca_perturb%PtfmMesh%TranslationAcc(fieldIndx,node) + perturb - CASE (20) !Module/Mesh/Field: u_Orca%PtfmMesh%RotationAcc = 20 - perturb = GetPerturb( u_Orca_perturb%PtfmMesh%RotationAcc(fieldIndx , node) ) - u_Orca_perturb%PtfmMesh%RotationAcc( fieldIndx,node) = u_Orca_perturb%PtfmMesh%RotationAcc( fieldIndx,node) + perturb - - CASE (21) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%TranslationAcc = 21 - perturb = GetPerturb( u_ExtPtfm_perturb%PtfmMesh%TranslationAcc(fieldIndx , node) ) - u_ExtPtfm_perturb%PtfmMesh%TranslationAcc(fieldIndx,node) = u_ExtPtfm_perturb%PtfmMesh%TranslationAcc(fieldIndx,node) + perturb - CASE (22) !Module/Mesh/Field: u_ExtPtfm%PtfmMesh%RotationAcc = 22 - perturb = GetPerturb( u_ExtPtfm_perturb%PtfmMesh%RotationAcc(fieldIndx , node) ) - u_ExtPtfm_perturb%PtfmMesh%RotationAcc( fieldIndx,node) = u_ExtPtfm_perturb%PtfmMesh%RotationAcc( fieldIndx,node) + perturb - - END SELECT - - u_perturb(n) = u_perturb(n) + perturb - - -END SUBROUTINE Perturb_u_FullOpt1 -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine resets the remap flags on all of the meshes -SUBROUTINE ResetRemapFlags(p_FAST, ED, SED, BD, AD, ExtLd, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD ) -!............................................................................................................................... - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< ExtLoads data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - !local variable(s) - - INTEGER(IntKi) :: i ! counter for ice legs - INTEGER(IntKi) :: k ! counter for blades - INTEGER(IntKi) :: j ! Counter for StC instances - - !..................................................................... - ! Reset each mesh's RemapFlag (after calling all InputSolve routines): - !..................................................................... - - if (p_FAST%CompElast == Module_SED) then - ! Simplified-ElastoDyn meshes - SED%y%PlatformPtMesh%RemapFlag = .FALSE. - DO K=1,SIZE(SED%y%BladeRootMotion) - SED%y%BladeRootMotion(K)%RemapFlag = .FALSE. - END DO - SED%y%NacelleMotion%RemapFlag = .FALSE. - SED%y%HubPtMotion%RemapFlag = .FALSE. - SED%Input(1)%HubPtLoad%RemapFlag = .FALSE. - else - ! ElastoDyn meshes - ED%Input( 1)%PlatformPtMesh%RemapFlag = .FALSE. - ED%y%PlatformPtMesh%RemapFlag = .FALSE. - ED%Input( 1)%TowerPtLoads%RemapFlag = .FALSE. - ED%y%TowerLn2Mesh%RemapFlag = .FALSE. - DO K=1,SIZE(ED%y%BladeRootMotion) - ED%y%BladeRootMotion(K)%RemapFlag = .FALSE. - END DO - if (allocated(ED%Input(1)%BladePtLoads)) then - DO K=1,SIZE(ED%Input(1)%BladePtLoads) - ED%Input( 1)%BladePtLoads(K)%RemapFlag = .FALSE. - ED%y%BladeLn2Mesh(K)%RemapFlag = .FALSE. - END DO - end if - - ED%Input( 1)%NacelleLoads%RemapFlag = .FALSE. - ED%y%NacelleMotion%RemapFlag = .FALSE. - ED%Input( 1)%TFinCMLoads%RemapFlag = .FALSE. - ED%y%TFinCMMotion%RemapFlag = .FALSE. - ED%Input( 1)%HubPtLoad%RemapFlag = .FALSE. - ED%y%HubPtMotion%RemapFlag = .FALSE. - endif - - ! BeamDyn meshes - IF ( p_FAST%CompElast == Module_BD ) THEN - DO i=1,p_FAST%nBeams - BD%Input(1,i)%RootMotion%RemapFlag = .FALSE. - BD%Input(1,i)%PointLoad%RemapFlag = .FALSE. - BD%Input(1,i)%DistrLoad%RemapFlag = .FALSE. - BD%Input(1,i)%HubMotion%RemapFlag = .FALSE. - - BD%y(i)%ReactionForce%RemapFlag = .FALSE. - BD%y(i)%BldMotion%RemapFlag = .FALSE. - END DO - END IF - - ! AeroDyn meshes - IF ( (p_FAST%CompAero == Module_AD) .OR. (p_FAST%CompAero == Module_ExtLd ) ) THEN - - IF (AD%Input(1)%rotors(1)%HubMotion%Committed) THEN - AD%Input(1)%rotors(1)%HubMotion%RemapFlag = .FALSE. - AD%y%rotors(1)%HubLoad%RemapFlag = .FALSE. - END IF - - IF (AD%Input(1)%rotors(1)%TowerMotion%Committed) THEN - AD%Input(1)%rotors(1)%TowerMotion%RemapFlag = .FALSE. - - IF (AD%y%rotors(1)%TowerLoad%Committed) THEN - AD%y%rotors(1)%TowerLoad%RemapFlag = .FALSE. - END IF - END IF - - IF (AD%Input(1)%rotors(1)%NacelleMotion%Committed) THEN - AD%Input(1)%rotors(1)%NacelleMotion%RemapFlag = .FALSE. - AD%y%rotors(1)%NacelleLoad%RemapFlag = .FALSE. - END IF - - IF (AD%Input(1)%rotors(1)%TFinMotion%Committed) THEN - AD%Input(1)%rotors(1)%TFinMotion%RemapFlag = .FALSE. - AD%y%rotors(1)%TFinLoad%RemapFlag = .FALSE. - END IF - - DO k=1,SIZE(AD%Input(1)%rotors(1)%BladeMotion) - AD%Input(1)%rotors(1)%BladeRootMotion(k)%RemapFlag = .FALSE. - AD%Input(1)%rotors(1)%BladeMotion( k)%RemapFlag = .FALSE. - AD%y%rotors(1)%BladeLoad( k)%RemapFlag = .FALSE. - END DO - - END IF - - IF (p_FAST%CompAero == Module_ExtLd ) THEN - - ExtLd%u%HubMotion%RemapFlag = .FALSE. - - IF ( ExtLd%u%TowerMotion%Committed ) THEN - ExtLd%u%TowerMotion%RemapFlag = .FALSE. - - IF ( ExtLd%y%TowerLoad%Committed ) THEN - ExtLd%y%TowerLoad%RemapFlag = .FALSE. - END IF - END IF - - DO k=1,SIZE( ExtLd%u%BladeMotion ) - ExtLd%u%BladeRootMotion(k)%RemapFlag = .FALSE. - ExtLd%u%BladeMotion( k)%RemapFlag = .FALSE. - ExtLd%y%BladeLoad( k)%RemapFlag = .FALSE. - END DO - - END IF - - ! ServoDyn -- StrucCtrl meshes - IF ( p_FAST%CompServo == Module_SrvD ) THEN - IF ( ALLOCATED(SrvD%y%NStCLoadMesh) ) THEN - do j=1,size(SrvD%y%NStCLoadMesh) - IF (SrvD%y%NStCLoadMesh(j)%Committed) THEN - SrvD%y%NStCLoadMesh(j)%RemapFlag = .FALSE. - SrvD%Input(1)%NStCMotionMesh(j)%RemapFlag = .FALSE. - END IF - enddo - END IF - - IF ( ALLOCATED(SrvD%y%TStCLoadMesh) ) THEN - do j=1,size(SrvD%y%TStCLoadMesh) - IF (SrvD%y%TStCLoadMesh(j)%Committed) THEN - SrvD%y%TStCLoadMesh(j)%RemapFlag = .FALSE. - SrvD%Input(1)%TStCMotionMesh(j)%RemapFlag = .FALSE. - END IF - enddo - ENDIF - - IF ( ALLOCATED(SrvD%y%BStCLoadMesh) ) THEN - do j=1,size(SrvD%y%BStCLoadMesh,2) - DO K = 1,SIZE(SrvD%y%BStCLoadMesh,1) - IF (SrvD%y%BStCLoadMesh(K,j)%Committed) THEN - SrvD%y%BStCLoadMesh(K,j)%RemapFlag = .FALSE. - SrvD%Input(1)%BStCMotionMesh(K,j)%RemapFlag = .FALSE. - END IF - END DO - enddo - ENDIF - - IF ( ALLOCATED(SrvD%y%SStCLoadMesh) ) THEN - do j=1,size(SrvD%y%SStCLoadMesh) - IF (SrvD%y%SStCLoadMesh(j)%Committed) THEN - SrvD%y%SStCLoadMesh(j)%RemapFlag = .FALSE. - SrvD%Input(1)%SStCMotionMesh(j)%RemapFlag = .FALSE. - END IF - enddo - ENDIF - - END IF - - ! HydroDyn - IF ( p_FAST%CompHydro == Module_HD ) THEN - HD%Input(1)%PRPMesh%RemapFlag = .FALSE. - IF (HD%Input(1)%WAMITMesh%Committed) THEN - HD%Input(1)%WAMITMesh%RemapFlag = .FALSE. - HD%y%WAMITMesh%RemapFlag = .FALSE. - END IF - IF (HD%Input(1)%Morison%Mesh%Committed) THEN - HD%Input(1)%Morison%Mesh%RemapFlag = .FALSE. - HD%y%Morison%Mesh%RemapFlag = .FALSE. - END IF - END IF - - ! SubDyn - IF ( p_FAST%CompSub == Module_SD ) THEN - IF (SD%Input(1)%TPMesh%Committed) THEN - SD%Input(1)%TPMesh%RemapFlag = .FALSE. - SD%y%Y1Mesh%RemapFlag = .FALSE. - END IF - - IF (SD%Input(1)%LMesh%Committed) THEN - SD%Input(1)%LMesh%RemapFlag = .FALSE. - SD%y%Y2Mesh%RemapFlag = .FALSE. - SD%y%Y3Mesh%RemapFlag = .FALSE. - END IF - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - IF (ExtPtfm%Input(1)%PtfmMesh%Committed) THEN - ExtPtfm%Input(1)%PtfmMesh%RemapFlag = .FALSE. - ExtPtfm%y%PtfmMesh%RemapFlag = .FALSE. - END IF - END IF - - - ! MAP , FEAM , MoorDyn, OrcaFlex - IF ( p_FAST%CompMooring == Module_MAP ) THEN - MAPp%Input(1)%PtFairDisplacement%RemapFlag = .FALSE. - MAPp%y%PtFairleadLoad%RemapFlag = .FALSE. - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - MD%Input(1)%CoupledKinematics(1)%RemapFlag = .FALSE. - MD%y%CoupledLoads(1)%RemapFlag = .FALSE. - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - FEAM%Input(1)%PtFairleadDisplacement%RemapFlag = .FALSE. - FEAM%y%PtFairleadLoad%RemapFlag = .FALSE. - ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - Orca%Input(1)%PtfmMesh%RemapFlag = .FALSE. - Orca%y%PtfmMesh%RemapFlag = .FALSE. - END IF - - ! IceFloe, IceDyn - IF ( p_FAST%CompIce == Module_IceF ) THEN - IF (IceF%Input(1)%iceMesh%Committed) THEN - IceF%Input(1)%iceMesh%RemapFlag = .FALSE. - IceF%y%iceMesh%RemapFlag = .FALSE. - END IF - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - DO i=1,p_FAST%numIceLegs - IF (IceD%Input(1,i)%PointMesh%Committed) THEN - IceD%Input(1,i)%PointMesh%RemapFlag = .FALSE. - IceD%y(i)%PointMesh%RemapFlag = .FALSE. - END IF - END DO - END IF - -END SUBROUTINE ResetRemapFlags -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes all of the mapping data structures needed between the various modules. -SUBROUTINE InitModuleMappings(p_FAST, ED, SED, BD, AD, ADsk, ExtLd, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg) -!............................................................................................................................... - - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code - TYPE(ElastoDyn_Data),TARGET,INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data),TARGET, INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< ExtLoads data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), TARGET, INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - INTEGER :: K, i ! loop counters - INTEGER :: j ! loop counter for StC instance - INTEGER :: NumBl ! number of blades - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - CHARACTER(*), PARAMETER :: RoutineName = 'InitModuleMappings' - - TYPE(MeshType), POINTER :: PlatformMotion - TYPE(MeshType), POINTER :: PlatformLoads - - TYPE(MeshType), POINTER :: SubstructureMotion2HD - TYPE(MeshType), POINTER :: SubstructureMotion - TYPE(MeshType), POINTER :: SubstructureLoads - !............................................................................................................................ - - ErrStat = ErrID_None - ErrMsg = "" - - if (p_FAST%CompElast == Module_SED) then - NumBl = SIZE(SED%y%BladeRootMotion,1) - PlatformMotion => SED%y%PlatformPtMesh - elseif (p_FAST%CompElast == Module_ED) then - NumBl = SIZE(ED%y%BladeRootMotion,1) - PlatformMotion => ED%y%PlatformPtMesh - PlatformLoads => ED%Input(1)%PlatformPtMesh - elseif (p_FAST%CompElast == Module_BD) then - NumBl = p_FAST%nBeams ! BeamDyn might set this to 1 blade for aeromaps (instead of SIZE(ED%y%BladeRootMotion,1)) - PlatformMotion => ED%y%PlatformPtMesh - PlatformLoads => ED%Input(1)%PlatformPtMesh - endif - - if (p_FAST%CompElast /= Module_SED) then ! HD cannot be used with SED - IF (p_FAST%CompSub == MODULE_SD) THEN - SubstructureMotion2HD => SD%y%y2Mesh - SubstructureMotion => SD%y%y3Mesh - SubstructureLoads => SD%Input(1)%LMesh - ELSE ! all of these get mapped to ElastoDyn ! (offshore floating with rigid substructure) - SubstructureMotion2HD => ED%y%PlatformPtMesh - SubstructureMotion => ED%y%PlatformPtMesh - SubstructureLoads => ED%Input(1)%PlatformPtMesh - END IF - endif - - - !............................................................................................................................ - ! Determine solver options: - !............................................................................................................................ - IF (p_FAST%CompElast == Module_BD .and. BD_Solve_Option1) THEN - - p_FAST%SolveOption = Solve_FullOpt1 - - ELSEIF (p_FAST%CompMooring == Module_Orca .or. & - p_FAST%CompSub /= Module_None ) THEN - - p_FAST%SolveOption = Solve_FullOpt1 - - ELSEIF ( p_FAST%CompHydro == Module_HD ) THEN - - IF (p_FAST%CompElast == Module_ED) THEN - p_FAST%SolveOption = Solve_SimplifiedOpt1 - ELSE - p_FAST%SolveOption = Solve_FullOpt1 - END IF - - ELSE - - p_FAST%SolveOption = Solve_FullOpt2 - - END IF - - - !............................................................................................................................ - ! Create the data structures and mappings in MeshMapType - !............................................................................................................................ - -!------------------------- -! ElastoDyn <-> BeamDyn -!------------------------- - IF ( p_FAST%CompElast == Module_BD ) THEN - - ! Blade meshes: (allocate two mapping data structures to number of blades, then allocate data inside the structures) - ALLOCATE( MeshMapData%ED_P_2_BD_P(NumBl), MeshMapData%BD_P_2_ED_P(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%ED_P_2_BD_P and MeshMapData%BD_P_2_ED_P.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - DO K=1,NumBl - CALL MeshMapCreate( ED%y%BladeRootMotion(K), BD%Input(1,k)%RootMotion, MeshMapData%ED_P_2_BD_P(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_BD_BladeRootMotion('//TRIM(Num2LStr(K))//')' ) - CALL MeshMapCreate( BD%y(k)%ReactionForce, ED%Input(1)%HubPtLoad, MeshMapData%BD_P_2_ED_P(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':BD_2_ED_ReactionLoad('//TRIM(Num2LStr(K))//')' ) - END DO - - ! Hub meshes: - ALLOCATE( MeshMapData%ED_P_2_BD_P_Hub(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%ED_P_2_BD_P_Hub.', ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - DO K=1,NumBl - CALL MeshMapCreate( ED%y%HubPtMotion, BD%Input(1,k)%HubMotion, MeshMapData%ED_P_2_BD_P_Hub(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_BD_HubMotion('//TRIM(Num2LStr(K))//')' ) - END DO - - END IF - - - IF ( p_FAST%CompServo == Module_SrvD ) THEN -!------------------------- -! ServoDyn <-> ElastoDyn -!------------------------- - ! Nacelle TMD - IF ( ALLOCATED(SrvD%Input(1)%NStCMotionMesh) ) THEN - j=size(SrvD%Input(1)%NStCMotionMesh) - ALLOCATE( MeshMapData%ED_P_2_NStC_P_N(j), MeshMapData%NStC_P_2_ED_P_N(j), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%ED_P_2_NStC_P_N and MeshMapData%NStC_P_2_ED_P_N.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - do j=1,size(SrvD%Input(1)%NStCMotionMesh) - IF ( SrvD%Input(1)%NStCMotionMesh(j)%Committed ) THEN - CALL MeshMapCreate( ED%y%NacelleMotion, SrvD%Input(1)%NStCMotionMesh(j), MeshMapData%ED_P_2_NStC_P_N(j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_SrvD_NacelleMotion' ) - CALL MeshMapCreate( SrvD%y%NStCLoadMesh(j), ED%Input(1)%NacelleLoads, MeshMapData%NStC_P_2_ED_P_N(j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SrvD_2_ED_NacelleLoads' ) - ENDIF - enddo - CALL MeshCopy( ED%Input(1)%NacelleLoads, MeshMapData%u_ED_NacelleLoads, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_ED_NacelleLoads' ) - END IF - - ! Tower TMD - IF ( ALLOCATED(SrvD%Input(1)%TStCMotionMesh) ) THEN - j=size(SrvD%Input(1)%TStCMotionMesh) - ALLOCATE( MeshMapData%ED_L_2_TStC_P_T(j), MeshMapData%TStC_P_2_ED_P_T(j), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%ED_L_2_TStC_P_T and MeshMapData%TStC_P_2_ED_P_T.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - do j=1,size(SrvD%Input(1)%TStCMotionMesh) - IF ( SrvD%Input(1)%TStCMotionMesh(j)%Committed ) THEN - CALL MeshMapCreate( ED%y%TowerLn2Mesh, SrvD%Input(1)%TStCMotionMesh(j), MeshMapData%ED_L_2_TStC_P_T(j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_SrvD_TowerMotion' ) - CALL MeshMapCreate( SrvD%y%TStCLoadMesh(j), ED%Input(1)%TowerPtLoads, MeshMapData%TStC_P_2_ED_P_T(j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SrvD_2_ED_TowerLoad' ) - CALL MeshCopy ( ED%Input(1)%TowerPtLoads, MeshMapData%u_ED_TowerPtLoads, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_ED_TowerPtLoads' ) - ENDIF - enddo - ENDIF - -!------------------------- -! ServoDyn <-> Blades -!------------------------- - IF ( ALLOCATED(SrvD%Input(1)%BStCMotionMesh) ) THEN - IF ( p_FAST%CompElast == Module_ED ) then ! ElastoDyn Blades - j=size(SrvD%Input(1)%BStCMotionMesh,2) - ALLOCATE( MeshMapData%ED_L_2_BStC_P_B(NumBl,j), MeshMapData%BStC_P_2_ED_P_B(NumBl,j), MeshMapData%u_ED_BladePtLoads(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%ED_L_2_BStC_P_B and MeshMapData%BStC_P_2_ED_P_B and MeshMapData%u_ED_BladePtLoads.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - do j=1,size(SrvD%Input(1)%BStCMotionMesh,2) - DO K = 1,NumBl - IF ( SrvD%Input(1)%BStCMotionMesh(K,j)%Committed ) THEN - CALL MeshMapCreate( ED%y%BladeLn2Mesh(K), SrvD%Input(1)%BStCMotionMesh(K,j), MeshMapData%ED_L_2_BStC_P_B(K,j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_L_2_BStC_P_B' ) - CALL MeshMapCreate( SrvD%y%BStCLoadMesh(K,j), ED%Input(1)%BladePtLoads(K), MeshMapData%BStC_P_2_ED_P_B(K,j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':BStC_P_2_ED_P_B' ) - END IF - ENDDO - enddo - do K = 1,NumBl - CALL MeshCopy ( ED%Input(1)%BladePtLoads(K), MeshMapData%u_ED_BladePtLoads(K), MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_ED_BladePtLoads('//trim(num2lstr(j))//','//trim(num2lstr(k))//')' ) - enddo - ELSEIF ( p_FAST%CompElast == Module_BD ) THEN ! BeamDyn Blades - j=size(SrvD%Input(1)%BStCMotionMesh,2) - ALLOCATE( MeshMapData%BD_L_2_BStC_P_B(NumBl,j), MeshMapData%BStC_P_2_BD_P_B(NumBl,j), MeshMapData%u_BD_DistrLoad(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%BD_L_2_BStC_P_B and MeshMapData%BStC_P_2_BD_P_B and MeshMapData%u_BD_DistrLoad.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - do j=1,size(SrvD%Input(1)%BStCMotionMesh,2) - DO K = 1,NumBl - IF ( SrvD%Input(1)%BStCMotionMesh(K,j)%Committed ) THEN - CALL MeshMapCreate( BD%y(k)%BldMotion, SrvD%Input(1)%BStCMotionMesh(K,j), MeshMapData%BD_L_2_BStC_P_B(K,j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':BD_L_2_BStC_P_B' ) - CALL MeshMapCreate( SrvD%y%BStCLoadMesh(K,j), BD%Input(1,k)%DistrLoad, MeshMapData%BStC_P_2_BD_P_B(K,j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':BStC_P_2_BD_P_B' ) - END IF - ENDDO - enddo - do K = 1,NumBl - CALL MeshCopy ( BD%Input(1,k)%DistrLoad, MeshMapData%u_BD_DistrLoad(k), MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_BD_DistrLoad('//trim(num2lstr(k))//')' ) - enddo - ENDIF - ENDIF - -!------------------------- -! ServoDyn <-> Platform and Substructure -!------------------------- - ! ServoDyn platform point mesh from ElastoDyn platform point mesh -- Motions passed to DLL - IF ( SrvD%Input(1)%PtfmMotionMesh%Committed ) THEN - CALL MeshMapCreate( PlatformMotion, SrvD%Input(1)%PtfmMotionMesh, MeshMapData%ED_P_2_SrvD_P_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_P_2_SrvD_P_P' ) - ENDIF - - IF ( ALLOCATED(SrvD%Input(1)%SStCMotionMesh) ) THEN - j=size(SrvD%Input(1)%SStCMotionMesh) - ALLOCATE( MeshMapData%SStC_P_P_2_SubStructure(j), MeshMapData%SubStructure_2_SStC_P_P(j), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%SStC_P_P_2_SubStructure and MeshMapData%SubStructure_2_SStC_P_P.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - do j=1,size(SrvD%Input(1)%SStCMotionMesh) - IF ( SrvD%Input(1)%SStCMotionMesh(j)%Committed ) THEN ! Single point per SStC instance - ! ServoDyn SStC point mesh to/from SubDyn/ElastoDyn point mesh - CALL MeshMapCreate( SubStructureMotion, SrvD%Input(1)%SStCMotionMesh(j), MeshMapData%SubStructure_2_SStC_P_P(j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SubStructure_2_SStC_P_P' ) - CALL MeshMapCreate( SrvD%y%SStCLoadMesh(j), SubStructureLoads, MeshMapData%SStC_P_P_2_SubStructure(j), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SStC_P_P_2_SubStructure' ) - ENDIF - enddo - ENDIF - - ENDIF - - - -!------------------------- -! ElastoDyn/Simplified-ElastoDyn <-> AeroDyn15 -!------------------------- - - IF ( (p_FAST%CompAero == Module_AD) .OR. (p_FAST%CompAero == Module_ExtLd) ) THEN ! ED-AD and/or BD-AD - - ! allocate per-blade space for mapping to structural module - if (p_FAST%CompElast == Module_SED) then - - ! Blade root meshes - ALLOCATE( MeshMapData%SED_P_2_AD_P_R(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%SED_P_2_AD_P_R.', ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - ! Blade meshes: Map SED blade root to AD blade line. Load is completely ignored. - ALLOCATE( MeshMapData%SED_P_2_AD_L_B(NumBl), MeshMapData%AD_L_2_SED_P(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%SED_P_2_AD_L_B and MeshMapData%AD_L_2_SED_P.', ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - else - - ! Blade root meshes - ALLOCATE( MeshMapData%ED_P_2_AD_P_R(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%ED_P_2_AD_P_R.', ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - ! Blade meshes: (allocate two mapping data structures to number of blades, then allocate data inside the structures) - ALLOCATE( MeshMapData%BDED_L_2_AD_L_B(NumBl), MeshMapData%AD_L_2_BDED_B(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%BDED_L_2_AD_L_B and MeshMapData%AD_L_2_BDED_B.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - endif - - -!------------------------- -! Simplified-ElastoDyn <-> AeroDyn -!------------------------- - IF ( p_FAST%CompElast == Module_SED ) then - ! blade root meshes - DO K=1,NumBl - CALL MeshMapCreate( SED%y%BladeRootMotion(K), AD%Input(1)%rotors(1)%BladeRootMotion(K), MeshMapData%SED_P_2_AD_P_R(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SED_2_AD_RootMotion('//TRIM(Num2LStr(K))//')' ) - END DO - - ! Hub point mesh - CALL MeshMapCreate( SED%y%HubPtMotion, AD%Input(1)%rotors(1)%HubMotion, MeshMapData%SED_P_2_AD_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SED_2_AD_HubMotion' ) - - ! Tower mesh: (SED does not use tower loads, so only motion mapped) - IF ( AD%Input(1)%rotors(1)%TowerMotion%Committed ) THEN - CALL MeshMapCreate( SED%y%TowerLn2Mesh, AD%Input(1)%rotors(1)%TowerMotion, MeshMapData%SED_L_2_AD_L_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SED_2_AD_TowerMotion' ) - END IF - ! Nacelle mesh: (SED does not use nacelle loads, so only motion mapped) - IF ( AD%Input(1)%rotors(1)%NacelleMotion%Committed ) THEN - CALL MeshMapCreate( SED%y%NacelleMotion, AD%Input(1)%rotors(1)%NacelleMotion, MeshMapData%SED_P_2_AD_P_N, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SED_2_AD_NacelleMotion' ) - endif - -!------------------------- -! ElastoDyn <-> AeroDyn -!------------------------- - ELSE ! ED or BD - ! blade root meshes - DO K=1,NumBl - CALL MeshMapCreate( ED%y%BladeRootMotion(K), AD%Input(1)%rotors(1)%BladeRootMotion(K), MeshMapData%ED_P_2_AD_P_R(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_AD_RootMotion('//TRIM(Num2LStr(K))//')' ) - END DO - - - ! Hub point mesh: - IF ( AD%Input(1)%rotors(1)%HubMotion%Committed ) THEN - CALL MeshMapCreate( ED%y%HubPtMotion, AD%Input(1)%rotors(1)%HubMotion, MeshMapData%ED_P_2_AD_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_AD_HubMotion' ) - CALL MeshMapCreate( AD%y%rotors(1)%HubLoad, ED%Input(1)%HubPtLoad, MeshMapData%AD_P_2_ED_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':AD_2_ED_HubLoad' ) - - CALL MeshCopy( ED%Input(1)%HubPtLoad, MeshMapData%u_ED_HubPtLoad, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_ED_HubPtLoad' ) - END IF - - - ! Tower mesh: - IF ( AD%Input(1)%rotors(1)%TowerMotion%Committed ) THEN - CALL MeshMapCreate( ED%y%TowerLn2Mesh, AD%Input(1)%rotors(1)%TowerMotion, MeshMapData%ED_L_2_AD_L_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_AD_TowerMotion' ) - - IF ( AD%y%rotors(1)%TowerLoad%Committed ) THEN - CALL MeshMapCreate( AD%y%rotors(1)%TowerLoad, ED%Input(1)%TowerPtLoads, MeshMapData%AD_L_2_ED_P_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':AD_2_ED_TowerLoad' ) - END IF - END IF - - ! Nacelle mesh: - IF ( AD%Input(1)%rotors(1)%NacelleMotion%Committed ) THEN - CALL MeshMapCreate( ED%y%NacelleMotion, AD%Input(1)%rotors(1)%NacelleMotion, MeshMapData%ED_P_2_AD_P_N, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_AD_NacelleMotion' ) - CALL MeshMapCreate( AD%y%rotors(1)%NacelleLoad, ED%Input(1)%NacelleLoads, MeshMapData%AD_P_2_ED_P_N, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':AD_2_ED_NacelleLoads' ) - if (.not. MeshMapData%u_ED_NacelleLoads%Committed ) then ! May have been set for NStC intance - CALL MeshCopy( ED%Input(1)%NacelleLoads, MeshMapData%u_ED_NacelleLoads, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_ED_NacelleLoads' ) - endif - END IF - - ! Tailfin mesh: - if ( AD%Input(1)%rotors(1)%TFinMotion%Committed ) then - CALL MeshMapCreate( ED%y%TFinCMMotion, AD%Input(1)%rotors(1)%TFinMotion, MeshMapData%ED_P_2_AD_P_TF, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_AD_TailFinMotion' ) - CALL MeshMapCreate( AD%y%rotors(1)%TFinLoad, ED%Input(1)%TFinCMLoads, MeshMapData%AD_P_2_ED_P_TF, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':AD_2_ED_TailFinLoads' ) - endif - END IF - - - IF ( p_FAST%CompElast == Module_SED ) then -!------------------------- -! Simplified-ElastoDyn <-> AeroDyn -!------------------------- - - ! Blade meshes: - DO K=1,NumBl - CALL MeshMapCreate( SED%y%BladeRootMotion(K), AD%Input(1)%rotors(1)%BladeMotion(K), MeshMapData%SED_P_2_AD_L_B(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SED_2_AD_BladeMotion('//TRIM(Num2LStr(K))//')' ) - CALL MeshMapCreate( AD%y%rotors(1)%BladeLoad(K), SED%Input(1)%HubPtLoad, MeshMapData%AD_L_2_SED_P(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':AD_L_2_SED_P('//TRIM(Num2LStr(K))//')' ) - END DO - CALL MeshCopy ( SED%Input(1)%HubPtLoad, MeshMapData%u_SED_HubPtLoad, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_SED_HubPtLoad' ) - - ELSEIF ( p_FAST%CompElast == Module_ED ) then -!------------------------- -! ElastoDyn <-> AeroDyn -!------------------------- - - ! Blade meshes: - DO K=1,NumBl - CALL MeshMapCreate( ED%y%BladeLn2Mesh(K), AD%Input(1)%rotors(1)%BladeMotion(K), MeshMapData%BDED_L_2_AD_L_B(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_AD_BladeMotion('//TRIM(Num2LStr(K))//')' ) - CALL MeshMapCreate( AD%y%rotors(1)%BladeLoad(K), ED%Input(1)%BladePtLoads(K), MeshMapData%AD_L_2_BDED_B(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':AD_2_ED_BladeLoad('//TRIM(Num2LStr(K))//')' ) - END DO - - ELSEIF ( p_FAST%CompElast == Module_BD ) then - -!------------------------- -! BeamDyn <-> AeroDyn -!------------------------- - - ! connect AD mesh with BeamDyn - DO K=1,NumBl - CALL MeshMapCreate( BD%y(k)%BldMotion, AD%Input(1)%rotors(1)%BladeMotion(K), MeshMapData%BDED_L_2_AD_L_B(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':BD_2_AD_BladeMotion('//TRIM(Num2LStr(K))//')' ) - CALL MeshMapCreate( AD%y%rotors(1)%BladeLoad(K), BD%Input(1,k)%DistrLoad, MeshMapData%AD_L_2_BDED_B(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':AD_2_BD_BladeLoad('//TRIM(Num2LStr(K))//')' ) - END DO - -!------------------------- -! BeamDyn <-> BeamDyn -!------------------------- - if (.not. p_FAST%BD_OutputSibling) then - - ! Blade meshes for load transfer: (allocate meshes at BD input locations for motions transferred from BD output locations) - ALLOCATE( MeshMapData%BD_L_2_BD_L(NumBl), MeshMapData%y_BD_BldMotion_4Loads(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%BD_L_2_BD_L and MeshMapData%y_BD_BldMotion_4Loads.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - DO K=1,NumBl - ! create the new mesh: - CALL MeshCopy ( SrcMesh = BD%Input(1,k)%DistrLoad & - , DestMesh = MeshMapData%y_BD_BldMotion_4Loads(k) & - , CtrlCode = MESH_SIBLING & - , IOS = COMPONENT_OUTPUT & - , TranslationDisp = .TRUE. & - , Orientation = .TRUE. & - , RotationVel = .TRUE. & - , TranslationVel = .TRUE. & - , RotationAcc = .TRUE. & - , TranslationAcc = .TRUE. & - , ErrStat = ErrStat2 & - , ErrMess = ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN - - ! create the mapping: - CALL MeshMapCreate( BD%y(k)%BldMotion, MeshMapData%y_BD_BldMotion_4Loads(k), MeshMapData%BD_L_2_BD_L(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':BD_2_BD_BladeMotion('//TRIM(Num2LStr(K))//')' ) - END DO - - end if !.not. p_FAST%BD_OutputSibling - - END IF ! CompElast - - - ELSEIF ( p_FAST%CompAero == Module_ADsk ) THEN ! ED-ADsk - if (p_FAST%CompElast == Module_SED) then -!------------------------- -! Simplified-ElastoDyn <-> AeroDisk -!------------------------- - ! Hub point mesh - CALL MeshMapCreate( SED%y%HubPtMotion, ADsk%Input(1)%HubMotion, MeshMapData%SED_P_2_ADsk_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SED_2_ADsk_HubMotion' ) - CALL MeshMapCreate( ADsk%y%AeroLoads, SED%Input(1)%HubPtLoad, MeshMapData%ADsk_P_2_SED_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ADsk_2_SED_HubPtLoad' ) - else -!------------------------- -! ElastoDyn <-> AeroDisk -!------------------------- - ! Hub point mesh - CALL MeshMapCreate( ED%y%HubPtMotion, ADsk%Input(1)%HubMotion, MeshMapData%ED_P_2_ADsk_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_2_ADsk_HubMotion' ) - CALL MeshMapCreate( ADsk%y%AeroLoads, ED%Input(1)%HubPtLoad, MeshMapData%ADsk_P_2_ED_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ADsk_2_ED_HubPtLoad' ) - endif ! SED/ED - END IF ! AeroDyn14/AeroDyn/AeroDisk to structural code - - IF ( p_FAST%CompAero == Module_ExtLd ) THEN ! ED-ExtLd and/or BD-ExtLd - - NumBl = SIZE(ExtLd%u%BladeRootMotion) ! Get number of blades - - ! Allocate memory for mapping between ED and ExtLoad blade root meshes - ALLOCATE( MeshMapData%ED_P_2_ExtLd_P_R(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%ED_P_2_ExtLd_P_R.', ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - ! Create the mesh mapping for mapping between ED and ExtLoad blade root meshes - DO K=1,NumBl - CALL MeshMapCreate( ED%y%BladeRootMotion(K), ExtLd%u%BladeRootMotion(K), MeshMapData%ED_P_2_ExtLd_P_R(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_P_2_ExtLd_P_R('//TRIM(Num2LStr(K))//')' ) - END DO - - ! Hub point mesh - CALL MeshMapCreate( ED%y%HubPtMotion, ExtLd%u%HubMotion, MeshMapData%ED_P_2_ExtLd_P_H, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_P_2_ExtLd_P_H' ) - - ! Blade meshes: (allocate two mapping data structures to number of blades, then allocate data inside the structures) - ALLOCATE( MeshMapData%BDED_L_2_ExtLd_P_B(NumBl), MeshMapData%ExtLd_P_2_BDED_B(NumBl), MeshMapData%AD_L_2_ExtLd_B(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%BDED_L_2_ExtLd_P_B and MeshMapData%ExtLd_P_2_BDED_B.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - ! Create mapping for AD line mesh to ExtLoads point mesh - do k=1,NumBl - call MeshMapCreate( AD%y%rotors(1)%BladeLoad(k), ExtLd%y%BladeLoadAD(k), MeshMapData%AD_L_2_ExtLd_B(k), ErrStat2, ErrMsg2) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':AD_L_2_ExtLd_B('//TRIM(Num2LStr(K))//')' ) - end do + ! Write module matrices to file + do i = 1, size(m%Mod%ModData) + associate (ModData => m%Mod%ModData(i)) + call ModGlue_CalcWriteLinearMatrices(ModData%Vars, ModData%Lin, T%p_FAST, T%y_FAST, 0.0_R8Ki, MatrixUn, "SolverTC", VF_None, ErrStat2, ErrMsg2, & + CalcGlue=.false., ModSuffix=ModData%Abbr, FullOutput=.true.) + if (Failed()) return + end associate + end do - IF ( p_FAST%CompElast == Module_ED ) then - - DO K=1,NumBl - ! Create mapping for ElastoDyn BldMotion line2 meshes to ExtLoads point mesh - CALL MeshMapCreate( ED%y%BladeLn2Mesh(K), ExtLd%u%BladeMotion(K), MeshMapData%BDED_L_2_ExtLd_P_B(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':BDED_L_2_ExtLd_P_B('//TRIM(Num2LStr(K))//')' ) - ! Create mapping for ExtLoads point mesh to ElastoDyn BldMotion line2 mesh - CALL MeshMapCreate( ExtLd%y%BladeLoad(K), ED%Input(1)%BladePtLoads(K), MeshMapData%ExtLd_P_2_BDED_B(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ExtLd_P_2_BDED_B('//TRIM(Num2LStr(K))//')' ) - END DO - - ELSEIF ( p_FAST%CompElast == Module_BD ) then - - ! connect ExtLoads mesh with BeamDyn - DO K=1,NumBl - ! Create mapping for BeamDyn BldMotion line2 meshes to ExtLoads point mesh - CALL MeshMapCreate( BD%y(k)%BldMotion, ExtLd%u%BladeMotion(K), MeshMapData%BDED_L_2_ExtLd_P_B(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':BDED_L_2_ExtLd_P_B('//TRIM(Num2LStr(K))//')' ) - ! Create mapping for ExtLoads point mesh to BeamDyn BldMotion line2 mesh - CALL MeshMapCreate( ExtLd%y%BladeLoad(K), BD%Input(1,k)%DistrLoad, MeshMapData%ExtLd_P_2_BDED_B(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ExtLd_P_2_BDED_B('//TRIM(Num2LStr(K))//')' ) - END DO - - IF (.not. p_FAST%BD_OutputSibling) then - - ! Blade meshes for load transfer: (allocate meshes at BD input locations for motions transferred from BD output locations) - ALLOCATE( MeshMapData%BD_L_2_BD_L(NumBl), MeshMapData%y_BD_BldMotion_4Loads(NumBl), STAT=ErrStat2 ) - IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Error allocating MeshMapData%BD_L_2_BD_L and MeshMapData%y_BD_BldMotion_4Loads.', & - ErrStat, ErrMsg, RoutineName ) - RETURN - END IF ! ( ErrStat2 /= 0 ) - - DO K=1,NumBl - ! create the new mesh: - CALL MeshCopy ( SrcMesh = BD%Input(1,k)%DistrLoad & - , DestMesh = MeshMapData%y_BD_BldMotion_4Loads(k) & - , CtrlCode = MESH_SIBLING & - , IOS = COMPONENT_OUTPUT & - , TranslationDisp = .TRUE. & - , Orientation = .TRUE. & - , RotationVel = .TRUE. & - , TranslationVel = .TRUE. & - , RotationAcc = .TRUE. & - , TranslationAcc = .TRUE. & - , ErrStat = ErrStat2 & - , ErrMess = ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN - - ! create the mapping: - CALL MeshMapCreate( BD%y(k)%BldMotion, MeshMapData%y_BD_BldMotion_4Loads(k), MeshMapData%BD_L_2_BD_L(K), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':BD_L_2_BD_L('//TRIM(Num2LStr(K))//')' ) - END DO - - END IF !.not. p_FAST%BD_OutputSibling - - ENDIF ! ( p_FAST%CompElast == Module_BD ) - - ! Tower mesh: - IF ( ExtLd%u%TowerMotion%Committed ) THEN - CALL MeshMapCreate( ED%y%TowerLn2Mesh, ExtLd%u%TowerMotion, MeshMapData%ED_L_2_ExtLd_P_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_L_2_ExtLd_P_T' ) - - IF ( ExtLd%y%TowerLoad%Committed ) THEN - CALL MeshMapCreate( ExtLd%y%TowerLoad, ED%Input(1)%TowerPtLoads, MeshMapData%ExtLd_P_2_ED_P_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ExtLd_P_2_ED_P_T' ) - - IF ( ( AD%Input(1)%rotors(1)%TowerMotion%Committed ) .and. ( AD%y%rotors(1)%TowerLoad%Committed ) ) THEN - !Aerodyn to External loads - CALL MeshMapCreate( AD%y%rotors(1)%TowerLoad, ExtLd%y%TowerLoadAD, MeshMapData%AD_L_2_ExtLd_T, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':AD_L_2_ExLd_T' ) - END IF - - END IF ! ( ExtLd%y%TowerLoad%Committed ) - END IF ! ( ExtLd%u%TowerMotion%Committed ) - - END IF ! ( p_FAST%CompAero == Module_ExtLd ) - - IF ( p_FAST%CompHydro == Module_HD ) THEN ! HydroDyn-{ElastoDyn or SubDyn} - - ! Regardless of the offshore configuration, ED platform motions will be mapped to the PRPMesh of HD - ! we're just going to assume PlatformLoads and PlatformMotion are committed - CALL MeshMapCreate( PlatformMotion, HD%Input(1)%PRPMesh, MeshMapData%ED_P_2_HD_PRP_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':ED_P_2_HD_PRP_P' ) - -!------------------------- -! HydroDyn <-> ElastoDyn or SubDyn -!------------------------- - ! NOTE: HD-SD couple with y2 mesh NOT y3! - - IF ( HD%y%WAMITMesh%Committed ) THEN ! meshes for floating - ! HydroDyn WAMIT point mesh to/from ElastoDyn or SD point mesh - CALL MeshMapCreate( HD%y%WAMITMesh, SubstructureLoads, MeshMapData%HD_W_P_2_SubStructure, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':HD_W_P_2_SubStructure' ) - CALL MeshMapCreate( SubstructureMotion2HD, HD%Input(1)%WAMITMesh, MeshMapData%SubStructure_2_HD_W_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SubStructure_2_HD_W_P' ) - END IF - - ! ElastoDyn or SD point mesh to HydroDyn Morison point mesh (ED sets inputs, but gets outputs from HD%y%WAMITMesh in floating case) - IF ( HD%Input(1)%Morison%Mesh%Committed ) THEN - CALL MeshMapCreate( HD%y%Morison%Mesh, SubstructureLoads, MeshMapData%HD_M_P_2_SubStructure, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':HD_M_P_2_SubStructure' ) - CALL MeshMapCreate( SubstructureMotion2HD, HD%Input(1)%Morison%Mesh, MeshMapData%SubStructure_2_HD_M_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SubStructure_2_HD_M_P' ) - END IF - - IF (ErrStat >= AbortErrLev ) RETURN - - END IF !HydroDyn-{ElastoDyn or SubDyn} - - -!------------------------- -! ElastoDyn <-> SubDyn -!------------------------- - IF ( p_FAST%CompSub == Module_SD ) THEN - - ! NOTE: the MeshMapCreate routine returns fatal errors if either mesh is not committed - - ! SubDyn transition piece point mesh to/from ElastoDyn point mesh - CALL MeshMapCreate( SD%y%Y1mesh, PlatformLoads, MeshMapData%SD_TP_2_ED_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SD_TP_2_Ptfm' ) - CALL MeshMapCreate( PlatformMotion, SD%Input(1)%TPMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Ptfm_2_SD_TP' ) - -!------------------------- -! ElastoDyn <-> ExtPtfm -!------------------------- - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - - ! NOTE: the MeshMapCreate routine returns fatal errors if either mesh is not committed - - ! ExtPtfm PtfmMesh point mesh to/from ElastoDyn point mesh - CALL MeshMapCreate( ExtPtfm%y%PtfmMesh, PlatformLoads, MeshMapData%SD_TP_2_ED_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SD_TP_2_Ptfm' ) - CALL MeshMapCreate( PlatformMotion, ExtPtfm%Input(1)%PtfmMesh, MeshMapData%ED_P_2_SD_TP, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Ptfm_2_SD_TP' ) - - END IF ! SubDyn,ExtPtfm - ElastoDyn - - - IF ( p_FAST%CompMooring == Module_MAP ) THEN -!------------------------- -! SubDyn/ElastoDyn <-> MAP -!------------------------- - ! MAP point mesh to/from SubDyn or ElastoDyn point mesh - CALL MeshMapCreate( MAPp%y%PtFairleadLoad, SubstructureLoads, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Mooring_2_Structure' ) - CALL MeshMapCreate( SubstructureMotion, MAPp%Input(1)%PtFairDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Structure_2_Mooring' ) - - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN -!------------------------- -! SubDyn/ElastoDyn <-> MoorDyn -!------------------------- - ! MoorDyn point mesh to/from SubDyn or ElastoDyn point mesh - CALL MeshMapCreate( MD%y%CoupledLoads(1), SubstructureLoads, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Mooring_2_Structure' ) - CALL MeshMapCreate( SubstructureMotion, MD%Input(1)%CoupledKinematics(1), MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Structure_2_Mooring' ) - - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN -!------------------------- -! SubDyn/ElastoDyn <-> FEAMooring -!------------------------- - ! FEAMooring point mesh to/from SubDyn or ElastoDyn point mesh - CALL MeshMapCreate( FEAM%y%PtFairleadLoad, SubstructureLoads, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Mooring_2_Structure' ) - CALL MeshMapCreate( SubstructureMotion, FEAM%Input(1)%PtFairleadDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Structure_2_Mooring' ) - - - ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - -!------------------------- -! ElastoDyn <-> OrcaFlex -!------------------------- - - ! OrcaFlex point mesh to/from ElastoDyn point mesh - CALL MeshMapCreate( Orca%y%PtfmMesh, PlatformLoads, MeshMapData%Mooring_2_Structure, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Mooring_P_2_Ptfm' ) - CALL MeshMapCreate( PlatformMotion, Orca%Input(1)%PtfmMesh, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':Ptfm_2_Mooring_P' ) - - END IF ! Mooring to substructure - - -!------------------------- -! SubDyn <-> IceFloe -!------------------------- - - IF ( p_FAST%CompIce == Module_IceF ) THEN - - ! IceFloe iceMesh point mesh to SubDyn LMesh point mesh - CALL MeshMapCreate( IceF%y%iceMesh, SubstructureLoads, MeshMapData%IceF_P_2_SD_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':IceF_P_2_SD_P' ) - ! SubDyn y3Mesh point mesh to IceFloe iceMesh point mesh - CALL MeshMapCreate( SubstructureMotion, IceF%Input(1)%iceMesh, MeshMapData%SDy3_P_2_IceF_P, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SDy3_P_2_IceF_P' ) - -!------------------------- -! SubDyn <-> IceDyn -!------------------------- - - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - - ALLOCATE( MeshMapData%IceD_P_2_SD_P( p_FAST%numIceLegs ) , & - MeshMapData%SDy3_P_2_IceD_P( p_FAST%numIceLegs ) , Stat=ErrStat2 ) - IF (ErrStat2 /= 0 ) THEN - CALL SetErrStat( ErrID_Fatal, 'Unable to allocate IceD_P_2_SD_P and SDy3_P_2_IceD_P', ErrStat, ErrMsg, RoutineName ) - RETURN - END IF - - DO i = 1,p_FAST%numIceLegs - - ! IceDyn PointMesh point mesh to SubDyn LMesh point mesh - CALL MeshMapCreate( IceD%y(i)%PointMesh, SubstructureLoads, MeshMapData%IceD_P_2_SD_P(i), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':IceD_P_2_SD_P('//TRIM(num2LStr(i))//')' ) - ! SubDyn y3Mesh point mesh to IceDyn PointMesh point mesh - CALL MeshMapCreate( SubstructureMotion, IceD%Input(1,i)%PointMesh, MeshMapData%SDy3_P_2_IceD_P(i), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SDy3_P_2_IceD_P('//TRIM(num2LStr(i))//')' ) - - END DO - - END IF ! SubDyn-IceFloe - - IF (ErrStat >= AbortErrLev ) RETURN - - !............................................................................................................................ - ! Initialize the Jacobian structures: - !............................................................................................................................ - IF (.not. p_FAST%CompAeroMaps) THEN - IF ( p_FAST%SolveOption == Solve_FullOpt1 ) THEN - CALL Init_FullOpt1_Jacobian( p_FAST, MeshMapData, ED%Input(1)%PlatformPtMesh, SD%Input(1)%TPMesh, SD%Input(1)%LMesh, & - HD%Input(1)%Morison%Mesh, HD%Input(1)%WAMITMesh, & - ED%Input(1)%HubPtLoad, BD%Input(1,:), Orca%Input(1)%PtfmMesh, ExtPtfm%Input(1)%PtfmMesh, ErrStat2, ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF ( p_FAST%SolveOption == Solve_SimplifiedOpt1 ) THEN - CALL AllocAry( MeshMapData%Jacobian_Opt1, SizeJac_ED_HD, SizeJac_ED_HD, 'Jacobian for Ptfm-HD coupling', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ENDIF - END IF - - IF ( ALLOCATED( MeshMapData%Jacobian_Opt1 ) ) THEN - CALL AllocAry( MeshMapData%Jacobian_pivot, SIZE(MeshMapData%Jacobian_Opt1), 'Pivot array for Jacobian LU decomposition', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF (ErrStat >= AbortErrLev ) RETURN - - !............................................................................................................................ - ! reset the remap flags (do this before making the copies else the copies will always have remap = true) - !............................................................................................................................ - CALL ResetRemapFlags(p_FAST, ED, SED, BD, AD, ExtLd, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD ) - - !............................................................................................................................ - ! initialize the temporary input meshes (for input-output solves in Solve Option 1): - ! (note that we do this after ResetRemapFlags() so that the copies have remap=false) - !............................................................................................................................ - IF ( p_FAST%SolveOption /= Solve_FullOpt2 .and. .not. p_FAST%CompAeroMaps) THEN - - ! Temporary meshes for transfering inputs to ED, HD, BD, Orca, and SD - CALL MeshCopy ( ED%Input(1)%HubPtLoad, MeshMapData%u_ED_HubPtLoad, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_ED_HubPtLoad' ) - - CALL MeshCopy ( SubStructureLoads, MeshMapData%SubstructureLoads_Tmp, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SubstructureLoads_Tmp' ) - - CALL MeshCopy ( SubStructureLoads, MeshMapData%SubstructureLoads_Tmp2, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SubstructureLoads_Tmp2' ) - - CALL MeshCopy ( PlatformLoads, MeshMapData%PlatformLoads_Tmp, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':PlatformLoads_Tmp' ) - - CALL MeshCopy ( PlatformLoads, MeshMapData%PlatformLoads_Tmp2, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':PlatformLoads_Tmp2' ) - - ! for now, setting up this additional load mesh for farm-level MD loads if in FAST.Farm (@mhall TODO: add more checks/handling) <<< - if (p_FAST%FarmIntegration) then - CALL MeshCopy ( SubStructureLoads, MeshMapData%SubstructureLoads_Tmp_Farm, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SubstructureLoads_Tmp_Farm' ) - - ! initialize to zero for safety (likely not necessary) - MeshMapData%SubstructureLoads_Tmp_Farm%Force = 0.0_ReKi - MeshMapData%SubstructureLoads_Tmp_Farm%Moment = 0.0_ReKi - end if - - IF ( p_FAST%CompElast == Module_BD ) THEN - - ! Temporary meshes for transfering inputs to ED and BD - CALL MeshCopy ( ED%Input(1)%HubPtLoad, MeshMapData%u_ED_HubPtLoad_2, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_ED_HubPtLoad_2' ) - - allocate( MeshMapData%u_BD_RootMotion( p_FAST%nBeams ), STAT = ErrStat2 ) - if (ErrStat2 /= 0) then - CALL SetErrStat( ErrID_Fatal, "Error allocating u_BD_RootMotion", ErrStat, ErrMsg, RoutineName ) - return - end if - - do k=1,p_FAST%nBeams - CALL MeshCopy ( BD%Input(1,k)%RootMotion, MeshMapData%u_BD_RootMotion(k), MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_BD_RootMotion('//trim(num2lstr(k))//')' ) - end do - - - END IF - - IF ( p_FAST%CompSub == Module_SD ) THEN - - CALL MeshCopy ( SD%Input(1)%TPMesh, MeshMapData%u_SD_TPMesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_SD_TPMesh' ) - - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - - CALL MeshCopy ( ExtPtfm%Input(1)%PtfmMesh, MeshMapData%u_ExtPtfm_PtfmMesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_ExtPtfm_PtfmMesh' ) - - END IF - - IF ( p_FAST%CompHydro == Module_HD ) THEN - - !TODO: GJH Is this needed, I created it as a place holder, 5/11/2020 - !CALL MeshCopy ( HD%Input(1)%PRPMesh, MeshMapData%u_HD_PRP_Mesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_HD_PRP_Mesh' ) - - CALL MeshCopy ( HD%Input(1)%WAMITMesh, MeshMapData%u_HD_W_Mesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_HD_W_Mesh' ) - - CALL MeshCopy ( HD%Input(1)%Morison%Mesh, MeshMapData%u_HD_M_Mesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_HD_M_Mesh' ) - - END IF - - IF ( p_FAST%CompMooring == Module_Orca ) THEN - - CALL MeshCopy ( Orca%Input(1)%PtfmMesh, MeshMapData%u_Orca_PtfmMesh, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':u_Orca_PtfmMesh' ) - - END IF - - - ELSEIF ( p_FAST%CompSub /= Module_SD ) THEN ! Platform loads from SrvD Structural control (TMDs) to ED in Full Option2 solve; bjj note: solves with SD are always option 1, so this condition is always true (could replace ELSEIF with ELSE) - - IF ( ALLOCATED(SrvD%Input(1)%SStCMotionMesh) ) THEN ! Platform TMD loads - CALL MeshCopy ( SubstructureLoads, MeshMapData%SubstructureLoads_Tmp, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':SubstructureLoads_Tmp' ) - ENDIF - - END IF - - - - !............................................................................................................................ - - -END SUBROUTINE InitModuleMappings -!---------------------------------------------------------------------------------------------------------------------------------- -!> This subroutine solves the input-output relations for all of the modules. It is a subroutine because it gets done twice-- -!! once at the start of the n_t_global loop and once in the j_pc loop, using different states. -!! *** Note that modules that do not have direct feedthrough should be called first. *** -SUBROUTINE CalcOutputs_And_SolveForInputs( n_t_global, this_time, this_state, calcJacobian, NextJacCalcTime, & - p_FAST, m_FAST, WriteThisStep, ED, SED, BD, & - SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - REAL(DbKi) , intent(in ) :: this_time !< The current simulation time (actual or time of prediction) - INTEGER(IntKi) , intent(in ) :: this_state !< Index into the state array (current or predicted states) - INTEGER(IntKi) , intent(in ) :: n_t_global !< current time step (used only for SrvD hack) - LOGICAL , intent(inout) :: calcJacobian !< Should we calculate Jacobians in Option 1? - REAL(DbKi) , intent(in ) :: NextJacCalcTime !< Time between calculating Jacobians in the HD-ED and SD-ED simulations - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Misc variables (including external inputs) for the glue code - LOGICAL , INTENT(IN ) :: WriteThisStep !< Will we print the WriteOutput values this step? - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< ExtLoads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - CHARACTER(*), PARAMETER :: RoutineName = 'CalcOutputs_And_SolveForInputs' - - -#ifdef OUTPUT_MASS_MATRIX - INTEGER :: UnMM -#endif - - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - ! Option 1: Solve for consistent inputs and outputs, which is required when Y has direct feedthrough in modules coupled together - ! bjj: If you are doing this option at the beginning as well as the end (after option 2), you must initialize the values of - ! MAPp%y, - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! Write glue code matrices to file + call ModGlue_CalcWriteLinearMatrices(m%Mod%Vars, m%Mod%Lin, T%p_FAST, T%y_FAST, 0.0_R8Ki, MatrixUn, "SolverTC", VF_None, ErrStat2, ErrMsg2, CalcGlue=.false., FullOutput=.true.) + if (Failed()) return + + ! call DumpMatrix(MatrixUn, "dUdu.bin", m%Mod%Lin%dUdu, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "dUdy.bin", m%Mod%Lin%dUdy, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "dXdu.bin", m%Mod%Lin%dXdu, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "dXdx.bin", m%Mod%Lin%dXdx, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "dYdu.bin", m%Mod%Lin%dYdu, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "dYdx.bin", m%Mod%Lin%dYdx, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "ED-dXdu.bin", T%ED%m%Vals%dXdu, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "ED-dXdx.bin", T%ED%m%Vals%dXdx, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "ED-dYdu.bin", T%ED%m%Vals%dYdu, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "ED-dYdx.bin", T%ED%m%Vals%dYdx, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "BD-dXdu.bin", T%BD%m(1)%Vals%dXdu, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "BD-dXdx.bin", T%BD%m(1)%Vals%dXdx, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "BD-dYdu.bin", T%BD%m(1)%Vals%dYdu, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "BD-dYdx.bin", T%BD%m(1)%Vals%dYdx, ErrStat2, ErrMsg2); if (Failed()) return + ! call DumpMatrix(MatrixUn, "J.bin", m%Mod%Lin%J, ErrStat2, ErrMsg2); if (Failed()) return - ErrStat = ErrID_None - ErrMsg = "" - - IF ( EqualRealNos( this_time, NextJacCalcTime ) .OR. NextJacCalcTime < this_time ) THEN - calcJacobian = .TRUE. - ELSE - calcJacobian = .FALSE. - END IF - - - !> ## This is OPTION 2 before OPTION 1: - !! - !! For cases with HydroDyn, BeamDyn, OrcaFlex interface, and/or SubDyn, it calls ED_CalcOuts (a time-sink) 3 times per step/correction - !! (plus the 6 calls when calculating the Jacobian). - !! In cases without HydroDyn or SubDyn, it is the same as Option 1 before 2 (with 1 call to ED_CalcOuts either way). - !! - !! Option 1 before 2 usually requires a correction step, whereas Option 2 before Option 1 often does not. Thus we are using this option, calling - !! ED_CalcOuts 3 times (option 2 before 1 with no correction step) instead of 4 times (option1 before 2 with one correction step). - !! Note that this analysis may change if/when AeroDyn14 (and ServoDyn?) generate different outputs on correction steps. (Currently, AeroDyn (v14) - !! returns old values until time advances.) - !! Also note that AD15's DBEMT module (and UA?) is heavily time-dependent without calling the structural code first (DBEMT's filters do not deal - !! well with the extrapolated inputs). - !! - !! ## Algorithm: - - - !> Solve option 2 (modules without direct feedthrough): - CALL SolveOption2(this_time, this_state, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, ExtLd, SD, SrvD, IfW, ExtInfw, MeshMapData, ErrStat2, ErrMsg2, n_t_global < 0, WriteThisStep) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - -#ifdef OUTPUT_MASS_MATRIX - if (n_t_global == 0 .and. p_FAST%CompElast /= Module_SED) then - UnMM = -1 - !$OMP critical(fileopen_critical) - CALL GetNewUnit( UnMM, ErrStat2, ErrMsg2 ) - CALL OpenFOutFile( UnMM, TRIM(p_FAST%OutFileRoot)//'.EDMassMatrix', ErrStat2, ErrMsg2) - !$OMP end critical(fileopen_critical) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( ErrStat >= AbortErrLev ) RETURN - CALL WrMatrix(ED%m%AugMat,UnMM, p_FAST%OutFmt) - CLOSE( UnMM ) - end if -#endif - - - !> transfer SrvD outputs to other modules used in option 1: - call Transfer_SrvD_to_SD_MD( p_FAST, SrvD%y, SD%Input(1), MD%Input(1) ) - - !> transfer ED outputs to other modules used in option 1 (because we've already computed ED_CalcOutput in SolveOption2): - !> Note that this also calls SD_CalcOutput if SubDyn and HydroDyn are both used. - CALL Transfer_Structure_to_Opt1Inputs( this_time, this_state, p_FAST, ED%y, HD%Input(1), SD, ExtPtfm%Input(1), & - MAPp%Input(1), FEAM%Input(1), MD%Input(1), & - Orca%Input(1), BD%Input(1,:), SrvD%Input(1), MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - !> Solve option 1 (rigorous solve on loads/accelerations) - CALL SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SrvD, AD, MeshMapData, ErrStat2, ErrMsg2, WriteThisStep) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - !> Now use the ElastoDyn and BD outputs from option1 to update the inputs for InflowWind, AeroDyn, and ServoDyn (necessary only if they have states) - - IF ( p_FAST%CompAero == Module_AD ) THEN - - CALL AD_InputSolve_NoIfW( p_FAST, AD%Input(1), SrvD%y, ED%y, SED%y, BD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSE IF (p_FAST%CompAero == Module_ExtLd ) THEN - - CALL AD_InputSolve_NoIfW( p_FAST, AD%Input(1), SrvD%y, ED%y, SED%y, BD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ExtLd_InputSolve_NoIfW( p_FAST, ExtLd%u, ExtLd%p, ED%y, BD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF - - IF ( p_FAST%CompInflow == Module_IfW ) THEN - CALL IfW_InputSolve( p_FAST, m_FAST, IfW%Input(1), IfW%p, AD%Input(1), AD%OtherSt(this_state), ED%y, SED%y, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSE IF ( p_FAST%CompInflow == Module_ExtInfw ) THEN - ! ExternalInflow is the driver and it sets these inputs outside of this solve; the ExternalInflow inputs and outputs thus don't change - ! in this scenario until ExternalInflow takes another step **this is a source of error, but it is the way the ExternalInflow-FAST7 coupling - ! works, so I'm not going to spend time that I don't have now to fix it** - CALL ExtInfw_SetInputs( p_FAST, AD%Input(1), AD%y, SrvD%y, ExtInfw, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - IF ( p_FAST%CompServo == Module_SrvD ) THEN - CALL SrvD_InputSolve( p_FAST, m_FAST, SrvD%Input(1), ED%y, SED%y, IfW%y, ExtInfw%y, ExtLd%p, BD%y, SD%y, MeshmapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF (p_FAST%CompElast == Module_BD .and. .NOT. BD_Solve_Option1) THEN - ! map ED root and hub motion outputs to BeamDyn: - CALL Transfer_ED_to_BD(ED%y, BD%Input(1,:), MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName ) - END IF - - !..................................................................... - ! Reset each mesh's RemapFlag (after calling all InputSolve routines): - !..................................................................... - - CALL ResetRemapFlags(p_FAST, ED, SED, BD, AD, ExtLd, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - - -END SUBROUTINE CalcOutputs_And_SolveForInputs -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine implements the "option 1" solve for all inputs with direct links to HD, SD, ExtPtfm, MAP, OrcaFlex interface, and the ED -!! platform reference point. Also in solve option 1 are the BD-ED blade root coupling. -SUBROUTINE SolveOption1(this_time, this_state, calcJacobian, p_FAST, ED, BD, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, SrvD, AD, MeshMapData, ErrStat, ErrMsg, WriteThisStep ) -!............................................................................................................................... - REAL(DbKi) , intent(in ) :: this_time !< The current simulation time (actual or time of prediction) - INTEGER(IntKi) , intent(in ) :: this_state !< Index into the state array (current or predicted states) - LOGICAL , intent(in ) :: calcJacobian !< Should we calculate Jacobians in Option 1? - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(ElastoDyn_Data), TARGET, INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), TARGET, INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - LOGICAL, INTENT(IN ) :: WriteThisStep !< Will we print the WriteOutput values this step? - - - INTEGER :: i ! loop counter - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - - CHARACTER(*), PARAMETER :: RoutineName = 'SolveOption1' - TYPE(MeshType), POINTER :: SubstructureMotion - - !............................................................................................................................ - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !> Option 1: solve for consistent inputs and outputs, which is required when Y has direct feedthrough in - !! modules coupled together - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - ErrStat = ErrID_None - ErrMsg = "" - - IF (p_FAST%CompSub == Module_SD) then - SubstructureMotion => SD%y%y3Mesh - ELSE - SubstructureMotion => ED%y%PlatformPtMesh - END IF - - ! Because MAP, FEAM, MoorDyn, IceDyn, and IceFloe do not contain acceleration inputs, we do this outside the DO loop in the ED{_SD}_HD_InputOutput solves. - IF ( p_FAST%CompMooring == Module_MAP ) THEN - - CALL MAP_CalcOutput( this_time, MAPp%Input(1), MAPp%p, MAPp%x(this_state), MAPp%xd(this_state), MAPp%z(this_state), & - MAPp%OtherSt, MAPp%y, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - - CALL MD_CalcOutput( this_time, MD%Input(1), MD%p, MD%x(this_state), MD%xd(this_state), MD%z(this_state), & - MD%OtherSt(this_state), MD%y, MD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - - CALL FEAM_CalcOutput( this_time, FEAM%Input(1), FEAM%p, FEAM%x(this_state), FEAM%xd(this_state), FEAM%z(this_state), & - FEAM%OtherSt(this_state), FEAM%y, FEAM%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF - - IF ( p_FAST%CompIce == Module_IceF ) THEN - - CALL IceFloe_CalcOutput( this_time, IceF%Input(1), IceF%p, IceF%x(this_state), IceF%xd(this_state), IceF%z(this_state), & - IceF%OtherSt(this_state), IceF%y, IceF%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - - DO i=1,p_FAST%numIceLegs - CALL IceD_CalcOutput( this_time, IceD%Input(1,i), IceD%p(i), IceD%x(i,this_state), IceD%xd(i,this_state), & - IceD%z(i,this_state), IceD%OtherSt(i,this_state), IceD%y(i), IceD%m(i), ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - END IF - - - ! the Structural control (TMD) from ServoDyn requires recalculating SrvD if we are using it. While it uses accelerations, - ! the masses involved are small enough compared to the platform that we don't need to account for them in the jacobian - IF ( p_FAST%CompServo == Module_SrvD .and. allocated(SrvD%Input(1)%SStCMotionMesh) ) THEN - ! need loads from SrvD%y%SStC%Mesh - CALL SrvD_CalcOutput( this_time, SrvD%Input(1), SrvD%p, SrvD%x(this_state), SrvD%xd(this_state), SrvD%z(this_state), & - SrvD%OtherSt(this_state), SrvD%y, SrvD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - IF (ErrStat >= AbortErrLev) RETURN - - IF (p_FAST%SolveOption == Solve_FullOpt1) THEN - - CALL FullOpt1_InputOutputSolve( this_time, p_FAST, calcJacobian & - , ED%Input(1), ED%p, ED%x( this_state), ED%xd( this_state), ED%z( this_state), ED%OtherSt( this_state), ED%y, ED%m & - , SD%Input(1), SD%p, SD%x( this_state), SD%xd( this_state), SD%z( this_state), SD%OtherSt( this_state), SD%y , SD%m & - , ExtPtfm%Input(1),ExtPtfm%p,ExtPtfm%x( this_state),ExtPtfm%xd( this_state),ExtPtfm%z( this_state),ExtPtfm%OtherSt( this_state),ExtPtfm%y,ExtPtfm%m & - , HD%Input(1), HD%p, HD%x( this_state), HD%xd( this_state), HD%z( this_state), HD%OtherSt( this_state), HD%y , HD%m & - , BD%Input(1,:), BD%p, BD%x(:,this_state), BD%xd(:,this_state), BD%z(:,this_state), BD%OtherSt(:,this_state), BD%y , BD%m & - , Orca%Input(1), Orca%p, Orca%x( this_state), Orca%xd( this_state), Orca%z( this_state), Orca%OtherSt( this_state), Orca%y , Orca%m & - , MAPp%Input(1), MAPp%y & - , FEAM%Input(1), FEAM%y & - , MD%Input(1), MD%y & - , IceF%Input(1), IceF%y & - , IceD%Input(1,:), IceD%y & ! bjj: I don't really want to make temp copies of input types. perhaps we should pass the whole Input() structure? (likewise for BD)... - , SrvD%Input(1), SrvD%y & - , AD%Input(1), AD%y & - , MeshMapData , ErrStat2, ErrMsg2, WriteThisStep ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - ELSEIF ( p_FAST%SolveOption == Solve_SimplifiedOpt1 ) THEN ! No substructure model - - CALL ED_HD_InputOutputSolve( this_time, p_FAST, calcJacobian & - , ED%Input(1), ED%p, ED%x(this_state), ED%xd(this_state), ED%z(this_state), ED%OtherSt(this_state), ED%y, ED%m & - , HD%Input(1), HD%p, HD%x(this_state), HD%xd(this_state), HD%z(this_state), HD%OtherSt(this_state), HD%y, HD%m & - , MAPp%Input(1), MAPp%y, FEAM%Input(1), FEAM%y, MD%Input(1), MD%y, SrvD%Input(1), SrvD%y & - , MeshMapData , ErrStat2, ErrMsg2, WriteThisStep ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF ! HD, BD, and/or SD coupled to ElastoDyn - -!.................. -! Set mooring line and ice inputs (which don't have acceleration fields) -!.................. - - - IF ( p_FAST%CompMooring == Module_MAP ) THEN - - ! note: MAP_InputSolve must be called before setting ED loads inputs (so that motions are known for loads [moment] mapping) - CALL Transfer_Point_to_Point( SubstructureMotion, MAPp%Input(1)%PtFairDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - - ! note: MD_InputSolve must be called before setting ED loads inputs (so that motions are known for loads [moment] mapping) - CALL Transfer_Point_to_Point( SubstructureMotion, MD%Input(1)%CoupledKinematics(1), MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - - ! note: FEAM_InputSolve must be called before setting ED loads inputs (so that motions are known for loads [moment] mapping) - CALL Transfer_Point_to_Point( SubstructureMotion, FEAM%Input(1)%PtFairleadDisplacement, MeshMapData%Structure_2_Mooring, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2, ErrStat, ErrMsg, RoutineName) - - END IF - - IF ( p_FAST%CompIce == Module_IceF ) THEN - - CALL IceFloe_InputSolve( IceF%Input(1), SubstructureMotion, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - - DO i=1,p_FAST%numIceLegs - - CALL IceD_InputSolve( IceD%Input(1,i), SubstructureMotion, MeshMapData, i, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':IceD_InputSolve' ) - - END DO - - END IF - - - ! Map motions for ServodDyn Structural control (TMD) if used (not allowed with SED). - IF ( p_FAST%CompServo == Module_SrvD .and. p_FAST%CompElast /= Module_SED ) THEN - call Transfer_Substructure_to_SStC( SrvD%Input(1), SubstructureMotion, MeshMapData, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - END IF - - -#ifdef DEBUG_MESH_TRANSFER_ICE - CALL WrScr('********************************************************') - CALL WrScr('**** IceF to SD point-to-point *****') - CALL WrScr('********************************************************') - CALL WriteMappingTransferToFile(SD%Input(1)%LMesh, SD%y%Y3Mesh, IceF%Input(1)%iceMesh, IceF%y%iceMesh,& - MeshMapData%SDy3_P_2_IceF_P, MeshMapData%IceF_P_2_SD_P, & - 'SD_y3_IceF_Meshes_t'//TRIM(Num2LStr(0))//'.PI.bin' ) - - - CALL WriteMappingTransferToFile(SD%Input(1)%LMesh, SD%y%Y2Mesh, HD%Input(1)%Morison%Mesh, HD%y%Morison%Mesh,& - MeshMapData%SubStructure_2_HD_M_P, MeshMapData%HD_M_P_2_SubStructure, & - 'SD_y2_HD_M_L_Meshes_t'//TRIM(Num2LStr(0))//'.PHL.bin' ) -#endif - -END SUBROUTINE SolveOption1 -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine implements the first part of the "option 2" solve for inputs that apply to BeamDyn and AeroDyn -SUBROUTINE SolveOption2a_Inp2BD(this_time, this_state, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, SrvD, IfW, ExtInfw, MeshMapData, ErrStat, ErrMsg, WriteThisStep) - REAL(DbKi) , intent(in ) :: this_time !< The current simulation time (actual or time of prediction) - INTEGER(IntKi) , intent(in ) :: this_state !< Index into the state array (current or predicted states) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Misc variables for the glue code (including external inputs) - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - LOGICAL , INTENT(IN ) :: WriteThisStep !< Will we print the WriteOutput values this step? - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - - CHARACTER(*), PARAMETER :: RoutineName = 'SolveOption2a_Inp2BD' - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !> ++ Option 2: Solve for inputs based only on the current outputs. - !! This is much faster than option 1 when the coupled modules do not have direct feedthrough. - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - ErrStat = ErrID_None - ErrMsg = "" - - IF ( p_FAST%CompElast == Module_SED ) THEN - CALL SED_CalcOutput( this_time, SED%Input(1), SED%p, SED%x(this_state), SED%xd(this_state), SED%z(this_state), SED%OtherSt(this_state), SED%y, SED%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSE - CALL ED_CalcOutput( this_time, ED%Input(1), ED%p, ED%x(this_state), ED%xd(this_state), ED%z(this_state), ED%OtherSt(this_state), ED%y, ED%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - IF ( p_FAST%CompElast == Module_BD ) THEN - ! map ED root and hub motion outputs to BeamDyn: - CALL Transfer_ED_to_BD(ED%y, BD%Input(1,:), MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat, ErrMsg,RoutineName ) - END IF - - END IF - -END SUBROUTINE SolveOption2a_Inp2BD -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine implements the first part of the "option 2" solve for inputs that apply to AeroDyn & InflowWind -SUBROUTINE SolveOption2b_Inp2IfW(this_time, this_state, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, SrvD, IfW, ExtInfw, MeshMapData, ErrStat, ErrMsg, WriteThisStep) - REAL(DbKi) , intent(in ) :: this_time !< The current simulation time (actual or time of prediction) - INTEGER(IntKi) , intent(in ) :: this_state !< Index into the state array (current or predicted states) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Misc variables for the glue code (including external inputs) - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - LOGICAL , INTENT(IN ) :: WriteThisStep !< Will we print the WriteOutput values this step? - - INTEGER(IntKi) :: k, node - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - - CHARACTER(*), PARAMETER :: RoutineName = 'SolveOption2b_Inp2IfW' - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !> ++ Option 2: Solve for inputs based only on the current outputs. - !! This is much faster than option 1 when the coupled modules do not have direct feedthrough. - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - ErrStat = ErrID_None - ErrMsg = "" - - - IF ( p_FAST%CompElast == Module_BD .AND. .NOT. BD_Solve_Option1 ) THEN - DO k=1,p_FAST%nBeams - CALL BD_CalcOutput( this_time, BD%Input(1,k), BD%p(k), BD%x(k,this_state), BD%xd(k,this_state),& - BD%z(k,this_state), BD%OtherSt(k,this_state), BD%y(k), BD%m(k), ErrStat2, ErrMsg2, .false. ) ! this WriteOutput will get overwritten in solve option 1 - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - END IF - - ! find the positions where we want inflow wind in AeroDyn (i.e., set all the motion inputs to AeroDyn) - IF ( ( p_FAST%CompAero == Module_AD ) .OR. (p_FAST%CompAero == Module_ExtLd) ) THEN - - ! note that this uses BD outputs, which are from the previous step (and need to be initialized) - CALL AD_InputSolve_NoIfW( p_FAST, AD%Input(1), SrvD%y, ED%y, SED%y, BD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - ELSE IF ( p_FAST%CompAero == Module_ADsk ) THEN - CALL ADsk_InputSolve_NoIfW( p_FAST, ADsk%Input(1), ED%y, SED%y, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - IF (p_FAST%CompInflow == Module_IfW) THEN - ! must be done after ED_CalcOutput and before AD_CalcOutput and SrvD - CALL IfW_InputSolve( p_FAST, m_FAST, IfW%Input(1), IfW%p, AD%Input(1), AD%OtherSt(this_state), ED%y, SED%y, ErrStat2, ErrMsg2 ) ! do we want this to be curr states - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !ELSE IF ( p_FAST%CompInflow == Module_ExtInfw ) THEN - ! ! ExternalInflow is the driver and it computes outputs outside of this solve; the ExternalInflow inputs and outputs thus don't change - ! ! in this scenario until ExternalInflow takes another step **this is a source of error, but it is the way the ExternalInflow-FAST7 coupling - ! ! works, so I'm not going to spend time that I don't have now to fix it** - ! CALL ExtInfw_SetInputs( p_FAST, AD%Input(1), AD%y, ED%y, SrvD%y, ExtInfw, ErrStat2, ErrMsg2 ) - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - -END SUBROUTINE SolveOption2b_Inp2IfW -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine implements the first part of the "option 2" solve for inputs that apply to AeroDyn and ServoDyn. -SUBROUTINE SolveOption2c_Inp2AD_SrvD(this_time, this_state, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, ExtLd, SD, SrvD, IfW, ExtInfw, MeshMapData, ErrStat, ErrMsg, WriteThisStep) - REAL(DbKi) , intent(in ) :: this_time !< The current simulation time (actual or time of prediction) - INTEGER(IntKi) , intent(in ) :: this_state !< Index into the state array (current or predicted states) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Misc variables for the glue code (including external inputs) - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< ExtLoads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - LOGICAL , INTENT(IN ) :: WriteThisStep !< Will we print the WriteOutput values this step? - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - - CHARACTER(*), PARAMETER :: RoutineName = 'SolveOption2c_Inp2AD_SrvD' - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !> ++ Option 2: Solve for inputs based only on the current outputs. - !! This is much faster than option 1 when the coupled modules do not have direct feedthrough. - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - ErrStat = ErrID_None - ErrMsg = "" - - - IF (p_FAST%CompInflow == Module_IfW) THEN - ! get Lidar position directly from hub mesh (may map meshes later) - if ( p_FAST%CompElast == Module_SED ) then - IfW%Input(1)%lidar%HubDisplacementX = SED%y%HubPtMotion%TranslationDisp(1,1) - IfW%Input(1)%lidar%HubDisplacementY = SED%y%HubPtMotion%TranslationDisp(2,1) - IfW%Input(1)%lidar%HubDisplacementZ = SED%y%HubPtMotion%TranslationDisp(3,1) - else - IfW%Input(1)%lidar%HubDisplacementX = ED%y%HubPtMotion%TranslationDisp(1,1) - IfW%Input(1)%lidar%HubDisplacementY = ED%y%HubPtMotion%TranslationDisp(2,1) - IfW%Input(1)%lidar%HubDisplacementZ = ED%y%HubPtMotion%TranslationDisp(3,1) - endif - - CALL InflowWind_CalcOutput( this_time, IfW%Input(1), IfW%p, IfW%x(this_state), IfW%xd(this_state), IfW%z(this_state), & - IfW%OtherSt(this_state), IfW%y, IfW%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSE IF ( p_FAST%CompInflow == Module_ExtInfw ) THEN - ! ExternalInflow is the driver and it computes outputs outside of this solve; the ExternalInflow inputs and outputs thus don't change - ! in this scenario until ExternalInflow takes another step **this is a source of error, but it is the way the OpenFOAM-FAST7 coupling - ! works, so I'm not going to spend time that I don't have now to fix it** - ! The outputs from ExternalInflow need to be transfered to the FlowField for use by AeroDyn, this seems like the right place - call ExtInfw_UpdateFlowField(p_FAST, ExtInfw, ErrStat2, ErrMsg2) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! CALL ExtInfw_SetInputs( p_FAST, AD%Input(1), AD%y, ED%y, SrvD%y, ExtInfw, ErrStat2, ErrMsg2 ) - ! CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! CALL ExtInfw_SetWriteOutput(OpFM) - END IF - - - IF ( p_FAST%CompServo == Module_SrvD ) THEN - CALL SrvD_InputSolve( p_FAST, m_FAST, SrvD%Input(1), ED%y, SED%y, IfW%y, ExtInfw%y, ExtLd%p, BD%y, SD%y, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - -END SUBROUTINE SolveOption2c_Inp2AD_SrvD -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine implements the "option 2" solve for all inputs without direct links to HD, SD, MAP, or the ED platform reference -!! point. -SUBROUTINE SolveOption2(this_time, this_state, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, ExtLd, SD, SrvD, IfW, ExtInfw, MeshMapData, ErrStat, ErrMsg, firstCall, WriteThisStep) -!............................................................................................................................... - LOGICAL , intent(in ) :: firstCall !< flag to determine how to call ServoDyn (a hack) - REAL(DbKi) , intent(in ) :: this_time !< The current simulation time (actual or time of prediction) - INTEGER(IntKi) , intent(in ) :: this_state !< Index into the state array (current or predicted states) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Misc variables for the glue code (including external inputs) - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLD !< ExtLoads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - LOGICAL , INTENT(IN ) :: WriteThisStep !< Will we print the WriteOutput values this step? - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - - CHARACTER(*), PARAMETER :: RoutineName = 'SolveOption2' - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !> ++ Option 2: Solve for inputs based only on the current outputs. - !! This is much faster than option 1 when the coupled modules do not have direct feedthrough. - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - ErrStat = ErrID_None - ErrMsg = "" - - - ! SolveOption2* routines are being called in FAST_AdvanceStates, but the first time we call CalcOutputs_And_SolveForInputs, we haven't called the AdvanceStates routine - IF (firstCall) THEN - ! call ElastoDyn's CalcOutput & compute BD inputs from ED: - CALL SolveOption2a_Inp2BD(this_time, this_state, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, SrvD, IfW, ExtInfw, MeshMapData, ErrStat2, ErrMsg2, WriteThisStep) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! compute AD position inputs; compute all of IfW inputs from ED/BD outputs: - CALL SolveOption2b_Inp2IfW(this_time, this_state, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, SrvD, IfW, ExtInfw, MeshMapData, ErrStat2, ErrMsg2, WriteThisStep) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! call IfW's CalcOutput; transfer wind-inflow inputs to AD; compute all of SrvD inputs: - CALL SolveOption2c_Inp2AD_SrvD(this_time, this_state, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, ExtLd, SD, SrvD, IfW, ExtInfw, MeshMapData, ErrStat2, ErrMsg2, WriteThisStep) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! ELSE ! these subroutines are called in the AdvanceStates routine before BD, IfW, AD, and SrvD states are updated. This gives a more accurate solution that would otherwise require a correction step. - END IF - - IF ( p_FAST%CompAero == Module_AD ) THEN - - CALL AD_CalcOutput( this_time, AD%Input(1), AD%p, AD%x(this_state), AD%xd(this_state), AD%z(this_state), & - AD%OtherSt(this_state), AD%y, AD%m, ErrStat2, ErrMsg2, WriteThisStep ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSE IF ( p_FAST%CompAero == Module_ADsk ) THEN - CALL ADsk_CalcOutput( this_time, ADsk%Input(1), ADsk%p, ADsk%x(this_state), ADsk%xd(this_state), ADsk%z(this_state), & - ADsk%OtherSt(this_state), ADsk%y, ADsk%m, ErrStat2, ErrMsg2, WriteThisStep ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSE IF (p_FAST%CompAero == Module_ExtLd ) THEN - - CALL AD_CalcOutput( this_time, AD%Input(1), AD%p, AD%x(this_state), AD%xd(this_state), AD%z(this_state), & - AD%OtherSt(this_state), AD%y, AD%m, ErrStat2, ErrMsg2, WriteThisStep ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ExtLd_CalcOutput( this_time, ExtLd%u, ExtLd%p, ExtLd%x(this_state), ExtLd%xd(this_state), ExtLd%z(this_state), & - ExtLd%OtherSt(this_state), ExtLd%y, ExtLd%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF - - - IF ( p_FAST%CompServo == Module_SrvD ) THEN - - CALL SrvD_CalcOutput( this_time, SrvD%Input(1), SrvD%p, SrvD%x(this_state), SrvD%xd(this_state), SrvD%z(this_state), & - SrvD%OtherSt(this_state), SrvD%y, SrvD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF - - - IF ( p_FAST%CompInflow == Module_ExtInfw ) THEN - ! ExternalInflow is the driver and it computes outputs outside of this solve; the ExternalInflow inputs and outputs thus don't change - ! in this scenario until ExternalInflow takes another step **this is a source of error, but it is the way the ExternalInflow-FAST7 coupling - ! works, so I'm not going to spend time that I don't have now to fix it** - ! note that I'm setting these inputs AFTER the call to ServoDyn so ExternalInflow gets all the inputs updated at the same step - CALL ExtInfw_SetInputs( p_FAST, AD%Input(1), AD%y, SrvD%y, ExtInfw, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtInfw_SetWriteOutput(ExtInfw) - - END IF - - - !bjj: note ED%Input(1) may be a sibling mesh of output, but ED%u is not (routine may update something that needs to be shared between siblings) - if (p_FAST%CompElast == Module_SED) then - CALL SED_InputSolve( p_FAST, SED%Input(1), SED%y, AD%y, ADsk%y, SrvD%y, AD%Input(1), ADsk%Input(1), SrvD%Input(1), MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - else - CALL ED_InputSolve( p_FAST, ED%Input(1), ED%y, AD%y, ADsk%y, SrvD%y, AD%Input(1), ADsk%Input(1), ExtLd%y, ExtLd%m, ExtLd%u, ExtLd%p, SrvD%Input(1), MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - endif - - CALL BD_InputSolve( p_FAST, BD, AD%y, AD%Input(1), ExtLd%m, ExtLd%y, ExtLd%u, ExtLd%p, ED%y, SrvD%y, SrvD%Input(1), MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - -END SUBROUTINE SolveOption2 -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routines advances the states of each module -SUBROUTINE FAST_AdvanceStates( t_initial, n_t_global, p_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg, WriteThisStep ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial simulation time (almost always 0) - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< integer time step - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< ExtLoads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules (added to help BD get better root motion inputs) - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - LOGICAL , INTENT(IN ) :: WriteThisStep !< Will we print the WriteOutput values this step (for optimizations with SolveOption2)? - - ! local variables - INTEGER(IntKi) :: i, k ! loop counters - - REAL(DbKi) :: t_module ! Current simulation time for module - REAL(DbKi) :: t_global_next ! Simulation time for computing outputs - INTEGER(IntKi) :: j_ss ! substep loop counter - INTEGER(IntKi) :: n_t_module ! simulation time step, loop counter for individual modules - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_AdvanceStates' - - - - ErrStat = ErrID_None - ErrMsg = "" - - t_global_next = (n_t_global+1) * p_FAST%dt + t_initial - - !---------------------------------------------------------------------------------------- - ! copy the states at step m_FAST%t_global and get prediction for step t_global_next - ! (note that we need to copy the states because UpdateStates updates the values - ! and we need to have the old values [at m_FAST%t_global] for the next j_pc step) - !---------------------------------------------------------------------------------------- - if (p_FAST%CompElast == Module_SED) then - ! Simplified-ElastoDyn: get predicted states - CALL SED_CopyContState (SED%x( STATE_CURR), SED%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SED_CopyDiscState (SED%xd(STATE_CURR), SED%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SED_CopyConstrState (SED%z( STATE_CURR), SED%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SED_CopyOtherState (SED%OtherSt( STATE_CURR), SED%OtherSt( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( MODULE_ED ) - n_t_module = n_t_global*p_FAST%n_substeps( MODULE_ED ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( MODULE_ED ) + t_initial - - CALL SED_UpdateStates( t_module, n_t_module, SED%Input, SED%InputTimes, SED%p, SED%x(STATE_PRED), SED%xd(STATE_PRED), & - SED%z(STATE_PRED), SED%OtherSt(STATE_PRED), SED%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN - END DO !j_ss - else - ! ElastoDyn: get predicted states - CALL ED_CopyContState (ED%x( STATE_CURR), ED%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_CURR), ED%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_CURR), ED%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_CURR), ED%OtherSt( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( MODULE_ED ) - n_t_module = n_t_global*p_FAST%n_substeps( MODULE_ED ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( MODULE_ED ) + t_initial - - CALL ED_UpdateStates( t_module, n_t_module, ED%Input, ED%InputTimes, ED%p, ED%x(STATE_PRED), ED%xd(STATE_PRED), & - ED%z(STATE_PRED), ED%OtherSt(STATE_PRED), ED%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN - END DO !j_ss - endif - - - ! BeamDyn doesn't like extrapolated rotations, so we will calculate them from ED and transfer instead of doing a correction step. - ! (Also calls ED_CalcOutput here so that we can use it for AeroDyn optimization, too): - CALL SolveOption2a_Inp2BD(t_global_next, STATE_PRED, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, SrvD, IfW, ExtInfw, MeshMapData, ErrStat2, ErrMsg2, WriteThisStep) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - IF ( p_FAST%CompElast == Module_BD ) THEN - - DO k=1,p_FAST%nBeams - - CALL BD_CopyContState (BD%x( k,STATE_CURR),BD%x( k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_CURR),BD%xd(k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_CURR),BD%z( k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_CURR),BD%OtherSt( k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_BD ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_BD ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_BD ) + t_initial - - CALL BD_UpdateStates( t_module, n_t_module, BD%Input(:,k), BD%InputTimes(:,k), BD%p(k), BD%x(k,STATE_PRED), & - BD%xd(k,STATE_PRED), BD%z(k,STATE_PRED), BD%OtherSt(k,STATE_PRED), BD%m(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName//':B'//trim(num2lstr(k))) - END DO !j_ss - - END DO !nBeams - IF (ErrStat >= AbortErrLev) RETURN - - END IF !CompElast - - - ! because AeroDyn DBEMT states depend heavily on getting inputs correct, we are overwriting its inputs with updated structural outputs here - CALL SolveOption2b_Inp2IfW(t_global_next, STATE_PRED, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, SrvD, IfW, ExtInfw, MeshMapData, ErrStat2, ErrMsg2, WriteThisStep) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - ! InflowWind: get predicted states -- NO STATES -! IF ( p_FAST%CompInflow == Module_IfW ) THEN -! CALL InflowWind_CopyContState (IfW%x( STATE_CURR), IfW%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) -! CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) -! CALL InflowWind_CopyDiscState (IfW%xd(STATE_CURR), IfW%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) -! CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) -! CALL InflowWind_CopyConstrState (IfW%z( STATE_CURR), IfW%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) -! CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) -! CALL InflowWind_CopyOtherState( IfW%OtherSt(STATE_CURR), IfW%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) -! CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) -! -! DO j_ss = 1, p_FAST%n_substeps( MODULE_IfW ) -! n_t_module = n_t_global*p_FAST%n_substeps( MODULE_IfW ) + j_ss - 1 -! t_module = n_t_module*p_FAST%dt_module( MODULE_IfW ) + t_initial -! -! CALL InflowWind_UpdateStates( t_module, n_t_module, IfW%Input, IfW%InputTimes, IfW%p, IfW%x(STATE_PRED), IfW%xd(STATE_PRED), & -! IfW%z(STATE_PRED), IfW%OtherSt(STATE_PRED), IfW%m, ErrStat2, ErrMsg2 ) -! CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) -! END DO !j_ss -! END IF - - - ! because AeroDyn DBEMT states depend heavily on getting inputs correct, we are overwriting its inputs with updated inflow outputs here - CALL SolveOption2c_Inp2AD_SrvD(t_global_next, STATE_PRED, p_FAST, m_FAST, ED, SED, BD, AD, ADsk, ExtLd, SD, SrvD, IfW, ExtInfw, MeshMapData, ErrStat2, ErrMsg2, WriteThisStep) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! AeroDyn: get predicted states - IF ( (p_FAST%CompAero == Module_AD) .or. (p_FAST%CompAero == Module_ExtLd) ) THEN - CALL AD_CopyContState (AD%x( STATE_CURR), AD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState (AD%xd(STATE_CURR), AD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState (AD%z( STATE_CURR), AD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState( AD%OtherSt(STATE_CURR), AD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( MODULE_AD ) - n_t_module = n_t_global*p_FAST%n_substeps( MODULE_AD ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( MODULE_AD ) + t_initial - - CALL AD_UpdateStates( t_module, n_t_module, AD%Input, AD%InputTimes, AD%p, AD%x(STATE_PRED), & - AD%xd(STATE_PRED), AD%z(STATE_PRED), AD%OtherSt(STATE_PRED), AD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - ELSEIF ( p_FAST%CompAero == Module_ADsk ) THEN - CALL ADsk_CopyContState (ADsk%x( STATE_CURR), ADsk%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ADsk_CopyDiscState (ADsk%xd(STATE_CURR), ADsk%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ADsk_CopyConstrState (ADsk%z( STATE_CURR), ADsk%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ADsk_CopyOtherState( ADsk%OtherSt(STATE_CURR), ADsk%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( MODULE_ADsk ) - n_t_module = n_t_global*p_FAST%n_substeps( MODULE_ADsk ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( MODULE_ADsk ) + t_initial - CALL ADsk_UpdateStates( t_module, n_t_module, ADsk%Input, ADsk%InputTimes, ADsk%p, ADsk%x(STATE_PRED), & - ADsk%xd(STATE_PRED), ADsk%z(STATE_PRED), ADsk%OtherSt(STATE_PRED), ADsk%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - END IF - - IF (p_FAST%CompAero == Module_ExtLd ) THEN - ! DO WE HAVE TO DO SOMETHING HERE? - END IF - - ! ServoDyn: get predicted states - IF ( p_FAST%CompServo == Module_SrvD ) THEN - CALL SrvD_CopyContState (SrvD%x( STATE_CURR), SrvD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_CURR), SrvD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_CURR), SrvD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState (SrvD%OtherSt( STATE_CURR), SrvD%OtherSt( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_SrvD ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_SrvD ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_SrvD ) + t_initial - - CALL SrvD_UpdateStates( t_module, n_t_module, SrvD%Input, SrvD%InputTimes, SrvD%p, SrvD%x(STATE_PRED), SrvD%xd(STATE_PRED), & - SrvD%z(STATE_PRED), SrvD%OtherSt(STATE_PRED), SrvD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - if (ErrStat >= AbortErrLev) return - END DO !j_ss - END IF - - - ! HydroDyn: get predicted states - IF ( p_FAST%CompHydro == Module_HD ) THEN - CALL HydroDyn_CopyContState (HD%x( STATE_CURR), HD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_CURR), HD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_CURR), HD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState( HD%OtherSt(STATE_CURR), HD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_HD ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_HD ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_HD ) + t_initial - - CALL HydroDyn_UpdateStates( t_module, n_t_module, HD%Input, HD%InputTimes, HD%p, HD%x(STATE_PRED), HD%xd(STATE_PRED), & - HD%z(STATE_PRED), HD%OtherSt(STATE_PRED), HD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - - END IF - - - ! SubDyn/ExtPtfm: get predicted states - IF ( p_FAST%CompSub == Module_SD ) THEN - CALL SD_CopyContState (SD%x( STATE_CURR), SD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (SD%xd(STATE_CURR), SD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState (SD%z( STATE_CURR), SD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState( SD%OtherSt(STATE_CURR), SD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_SD ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_SD ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_SD ) + t_initial - - CALL SD_UpdateStates( t_module, n_t_module, SD%Input, SD%InputTimes, SD%p, SD%x(STATE_PRED), SD%xd(STATE_PRED), & - SD%z(STATE_PRED), SD%OtherSt(STATE_PRED), SD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - ! ExtPtfm: get predicted states - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_CURR), ExtPtfm%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_CURR), ExtPtfm%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_CURR), ExtPtfm%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState( ExtPtfm%OtherSt(STATE_CURR), ExtPtfm%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_ExtPtfm ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_ExtPtfm ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_ExtPtfm ) + t_initial - - CALL ExtPtfm_UpdateStates( t_module, n_t_module, ExtPtfm%Input, ExtPtfm%InputTimes, ExtPtfm%p, ExtPtfm%x(STATE_PRED), & - ExtPtfm%xd(STATE_PRED), ExtPtfm%z(STATE_PRED), ExtPtfm%OtherSt(STATE_PRED), ExtPtfm%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - END IF - - - ! Mooring: MAP/FEAM/MD/Orca: get predicted states - IF (p_FAST%CompMooring == Module_MAP) THEN - CALL MAP_CopyContState (MAPp%x( STATE_CURR), MAPp%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_CURR), MAPp%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_CURR), MAPp%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! OtherStates in MAP++ acts like misc variables: - !CALL MAP_CopyOtherState( MAPp%OtherSt(STATE_CURR), MAPp%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - ! CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_MAP ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_MAP ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_MAP ) + t_initial - - CALL MAP_UpdateStates( t_module, n_t_module, MAPp%Input, MAPp%InputTimes, MAPp%p, MAPp%x(STATE_PRED), MAPp%xd(STATE_PRED), MAPp%z(STATE_PRED), MAPp%OtherSt, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - - ELSEIF (p_FAST%CompMooring == Module_MD) THEN - CALL MD_CopyContState (MD%x( STATE_CURR), MD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_CURR), MD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_CURR), MD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState( MD%OtherSt(STATE_CURR), MD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_MD ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_MD ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_MD ) + t_initial - - CALL MD_UpdateStates( t_module, n_t_module, MD%Input, MD%InputTimes, MD%p, MD%x(STATE_PRED), MD%xd(STATE_PRED), & - MD%z(STATE_PRED), MD%OtherSt(STATE_PRED), MD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN - CALL FEAM_CopyContState (FEAM%x( STATE_CURR), FEAM%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_CURR), FEAM%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_CURR), FEAM%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState( FEAM%OtherSt(STATE_CURR), FEAM%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_FEAM ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_FEAM ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_FEAM ) + t_initial - - CALL FEAM_UpdateStates( t_module, n_t_module, FEAM%Input, FEAM%InputTimes, FEAM%p, FEAM%x(STATE_PRED), FEAM%xd(STATE_PRED), & - FEAM%z(STATE_PRED), FEAM%OtherSt(STATE_PRED), FEAM%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - - ELSEIF (p_FAST%CompMooring == Module_Orca) THEN - CALL Orca_CopyContState (Orca%x( STATE_CURR), Orca%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyDiscState (Orca%xd(STATE_CURR), Orca%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyConstrState (Orca%z( STATE_CURR), Orca%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOtherState( Orca%OtherSt(STATE_CURR), Orca%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_Orca ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_Orca ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_Orca ) + t_initial - - CALL Orca_UpdateStates( t_module, n_t_module, Orca%Input, Orca%InputTimes, Orca%p, Orca%x(STATE_PRED), & - Orca%xd(STATE_PRED), Orca%z(STATE_PRED), Orca%OtherSt(STATE_PRED), Orca%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - - END IF - - - ! IceFloe/IceDyn: get predicted states - IF ( p_FAST%CompIce == Module_IceF ) THEN - CALL IceFloe_CopyContState (IceF%x( STATE_CURR), IceF%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_CURR), IceF%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_CURR), IceF%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState( IceF%OtherSt(STATE_CURR), IceF%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_IceF ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_IceF ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_IceF ) + t_initial - - CALL IceFloe_UpdateStates( t_module, n_t_module, IceF%Input, IceF%InputTimes, IceF%p, IceF%x(STATE_PRED), & - IceF%xd(STATE_PRED), IceF%z(STATE_PRED), IceF%OtherSt(STATE_PRED), IceF%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - - DO i=1,p_FAST%numIceLegs - - CALL IceD_CopyContState (IceD%x( i,STATE_CURR),IceD%x( i,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(i,STATE_CURR),IceD%xd(i,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( i,STATE_CURR),IceD%z( i,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState( IceD%OtherSt(i,STATE_CURR), IceD%OtherSt(i,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - DO j_ss = 1, p_FAST%n_substeps( Module_IceD ) - n_t_module = n_t_global*p_FAST%n_substeps( Module_IceD ) + j_ss - 1 - t_module = n_t_module*p_FAST%dt_module( Module_IceD ) + t_initial - - CALL IceD_UpdateStates( t_module, n_t_module, IceD%Input(:,i), IceD%InputTimes(:,i), IceD%p(i), IceD%x(i,STATE_PRED), & - IceD%xd(i,STATE_PRED), IceD%z(i,STATE_PRED), IceD%OtherSt(i,STATE_PRED), IceD%m(i), ErrStat2, ErrMsg2 ) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO !j_ss - END DO - - END IF - -END SUBROUTINE FAST_AdvanceStates -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine extrapolates inputs to modules to give predicted values at t+dt. -SUBROUTINE FAST_ExtrapInterpMods( t_global_next, p_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_global_next !< next global time step (t + dt), at which we're extrapolating inputs (and ED outputs) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< ExtLoads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - !TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData ! Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: i, j, k ! loop counters - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_ExtrapInterpMods' - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - ! Step 1.a: Extrapolate Inputs (gives predicted values at t+dt) - ! - ! a) Extrapolate inputs - ! to t + dt (i.e., t_global_next); will only be used by modules with an implicit dependence on input data. - ! b) Shift "window" of the ModName%Input - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - ErrStat = ErrID_None - ErrMsg = "" - - if (p_FAST%CompElast == Module_SED) then - ! Simplified-ElastoDyn - CALL SED_Input_ExtrapInterp(SED%Input, SED%InputTimes, SED%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - DO j = p_FAST%InterpOrder, 1, -1 - CALL SED_CopyInput (SED%Input(j), SED%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - SED%InputTimes(j+1) = SED%InputTimes(j) - END DO - - CALL SED_CopyInput (SED%u, SED%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - SED%InputTimes(1) = t_global_next - else - ! ElastoDyn - CALL ED_Input_ExtrapInterp(ED%Input, ED%InputTimes, ED%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - DO j = p_FAST%InterpOrder, 1, -1 - CALL ED_CopyInput (ED%Input(j), ED%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - ED%InputTimes(j+1) = ED%InputTimes(j) - END DO - - CALL ED_CopyInput (ED%u, ED%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - ED%InputTimes(1) = t_global_next - endif - - - ! BeamDyn - IF (p_FAST%CompElast == Module_BD) THEN - - DO k = 1,p_FAST%nBeams - - CALL BD_Input_ExtrapInterp(BD%Input(:,k), BD%InputTimes(:,k), BD%u(k), t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of BD%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL BD_CopyInput (BD%Input(j,k), BD%Input(j+1,k), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - BD%InputTimes(j+1,k) = BD%InputTimes(j,k) - END DO - - CALL BD_CopyInput (BD%u(k), BD%Input(1,k), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - BD%InputTimes(1,k) = t_global_next - - END DO ! k=p_FAST%nBeams - - END IF ! BeamDyn - - ! AeroDyn - IF ( (p_FAST%CompAero == Module_AD ) .or. (p_FAST%CompAero == Module_ExtLd ) ) THEN - - CALL AD_Input_ExtrapInterp(AD%Input, AD%InputTimes, AD%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of AD%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL AD_CopyInput (AD%Input(j), AD%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - AD%InputTimes(j+1) = AD%InputTimes(j) - END DO - - CALL AD_CopyInput (AD%u, AD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - AD%InputTimes(1) = t_global_next - - ELSEIF ( p_FAST%CompAero == Module_ADsk ) THEN - CALL ADsk_Input_ExtrapInterp(ADsk%Input, ADsk%InputTimes, ADsk%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of ADsk%Input - DO j = p_FAST%InterpOrder, 1, -1 - CALL ADsk_CopyInput (ADsk%Input(j), ADsk%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - ADsk%InputTimes(j+1) = ADsk%InputTimes(j) - END DO - - CALL ADsk_CopyInput (ADsk%u, ADsk%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - ADsk%InputTimes(1) = t_global_next - - END IF ! CompAero - - IF (p_FAST%CompAero == Module_ExtLd ) THEN - ! Don't need to do anything here. ExtLoads does not have inputs at different times - END IF - - ! InflowWind - IF ( p_FAST%CompInflow == Module_IfW ) THEN - - CALL InflowWind_Input_ExtrapInterp(IfW%Input, IfW%InputTimes, IfW%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of IfW%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL InflowWind_CopyInput (IfW%Input(j), IfW%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - IfW%InputTimes(j+1) = IfW%InputTimes(j) - END DO - - CALL InflowWind_CopyInput (IfW%u, IfW%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - IfW%InputTimes(1) = t_global_next - - END IF ! CompInflow - - - ! ServoDyn - IF ( p_FAST%CompServo == Module_SrvD ) THEN - - CALL SrvD_Input_ExtrapInterp(SrvD%Input, SrvD%InputTimes, SrvD%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of SrvD%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL SrvD_CopyInput (SrvD%Input(j), SrvD%Input(j+1), MESH_UPDATECOPY, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - SrvD%InputTimes(j+1) = SrvD%InputTimes(j) - END DO - - CALL SrvD_CopyInput (SrvD%u, SrvD%Input(1), MESH_UPDATECOPY, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - SrvD%InputTimes(1) = t_global_next - - - ! ! put zero-order hold on SrvD inputs from Simulink (avoids extrapolation issues) - !CALL SrvD_SetExternalInputs( p_FAST, m_FAST, SrvD%Input(1) ) - - END IF ! ServoDyn - - ! HydroDyn - IF ( p_FAST%CompHydro == Module_HD ) THEN - - CALL HydroDyn_Input_ExtrapInterp(HD%Input, HD%InputTimes, HD%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of HD%Input - - DO j = p_FAST%InterpOrder, 1, -1 - - CALL HydroDyn_CopyInput (HD%Input(j), HD%Input(j+1), MESH_UPDATECOPY, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - HD%InputTimes(j+1) = HD%InputTimes(j) - END DO - - CALL HydroDyn_CopyInput (HD%u, HD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - HD%InputTimes(1) = t_global_next - - END IF ! HydroDyn - - - ! SubDyn/ExtPtfm_MCKF - IF ( p_FAST%CompSub == Module_SD ) THEN - - CALL SD_Input_ExtrapInterp(SD%Input, SD%InputTimes, SD%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of SD%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL SD_CopyInput (SD%Input(j), SD%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - SD%InputTimes(j+1) = SD%InputTimes(j) - END DO - - CALL SD_CopyInput (SD%u, SD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - SD%InputTimes(1) = t_global_next - - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - - CALL ExtPtfm_Input_ExtrapInterp(ExtPtfm%Input, ExtPtfm%InputTimes, ExtPtfm%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of ExtPtfm%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL ExtPtfm_CopyInput (ExtPtfm%Input(j), ExtPtfm%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - ExtPtfm%InputTimes(j+1) = ExtPtfm%InputTimes(j) - END DO - - CALL ExtPtfm_CopyInput (ExtPtfm%u, ExtPtfm%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - ExtPtfm%InputTimes(1) = t_global_next - END IF ! SubDyn/ExtPtfm_MCKF - - - ! Mooring (MAP , FEAM , MoorDyn) - ! MAP - IF ( p_FAST%CompMooring == Module_MAP ) THEN - - CALL MAP_Input_ExtrapInterp(MAPp%Input, MAPp%InputTimes, MAPp%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of MAPp%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL MAP_CopyInput (MAPp%Input(j), MAPp%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - MAPp%InputTimes(j+1) = MAPp%InputTimes(j) - END DO - - CALL MAP_CopyInput (MAPp%u, MAPp%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - MAPp%InputTimes(1) = t_global_next - - ! MoorDyn - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - - CALL MD_Input_ExtrapInterp(MD%Input, MD%InputTimes, MD%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of MD%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL MD_CopyInput (MD%Input(j), MD%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - MD%InputTimes( j+1) = MD%InputTimes( j) - END DO - - CALL MD_CopyInput (MD%u, MD%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - MD%InputTimes(1) = t_global_next - - ! FEAM - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - - CALL FEAM_Input_ExtrapInterp(FEAM%Input, FEAM%InputTimes, FEAM%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of FEAM%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL FEAM_CopyInput (FEAM%Input(j), FEAM%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - FEAM%InputTimes( j+1) = FEAM%InputTimes( j) - END DO - - CALL FEAM_CopyInput (FEAM%u, FEAM%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - FEAM%InputTimes(1) = t_global_next - - ! OrcaFlex - ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - - CALL Orca_Input_ExtrapInterp(Orca%Input, Orca%InputTimes, Orca%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of Orca%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL Orca_CopyInput (Orca%Input(j), Orca%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - Orca%InputTimes( j+1) = Orca%InputTimes( j) - END DO - - CALL Orca_CopyInput (Orca%u, Orca%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - Orca%InputTimes(1) = t_global_next - - END IF ! MAP/FEAM/MoorDyn/OrcaFlex - - - - ! Ice (IceFloe or IceDyn) - ! IceFloe - IF ( p_FAST%CompIce == Module_IceF ) THEN - - CALL IceFloe_Input_ExtrapInterp(IceF%Input, IceF%InputTimes, IceF%u, t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of IceF%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL IceFloe_CopyInput (IceF%Input(j), IceF%Input(j+1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - IceF%InputTimes(j+1) = IceF%InputTimes(j) - END DO - - CALL IceFloe_CopyInput (IceF%u, IceF%Input(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - IceF%InputTimes(1) = t_global_next - - ! IceDyn - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - - DO i = 1,p_FAST%numIceLegs - - CALL IceD_Input_ExtrapInterp(IceD%Input(:,i), IceD%InputTimes(:,i), IceD%u(i), t_global_next, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - - ! Shift "window" of IceD%Input - - DO j = p_FAST%InterpOrder, 1, -1 - CALL IceD_CopyInput (IceD%Input(j,i), IceD%Input(j+1,i), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - IceD%InputTimes(j+1,i) = IceD%InputTimes(j,i) - END DO - - CALL IceD_CopyInput (IceD%u(i), IceD%Input(1,i), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName ) - IceD%InputTimes(1,i) = t_global_next - - END DO ! numIceLegs - - - END IF ! IceFloe/IceDyn - - -END SUBROUTINE FAST_ExtrapInterpMods -!---------------------------------------------------------------------------------------------------------------------------------- - - - -END MODULE FAST_Solver +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +end subroutine + +end module diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 7975b3d57f..48d3be5ed7 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -3,7 +3,7 @@ ! FAST_Prog.f90, FAST_Library.f90, FAST_Prog.c are different drivers for this code. !.................................................................................................................................. ! LICENSING -! Copyright (C) 2013-2016 National Renewable Energy Laboratory +! Copyright (C) 2013-2024 National Renewable Energy Laboratory ! ! This file is part of FAST. ! @@ -21,9 +21,39 @@ !********************************************************************************************************************************** MODULE FAST_Subs - USE FAST_Solver - USE FAST_Linear - USE VersionInfo + use FAST_Types + use FAST_ModTypes + use FAST_ModGlue + use VersionInfo + use FAST_Funcs + use FAST_Solver + use FAST_Mapping, only: FAST_InitMappings + use AeroDisk, only: ADsk_Init + use AeroDyn, only: AD_Init + use BeamDyn, only: BD_Init + use ElastoDyn, only: ED_Init + use ExtLoads, only: ExtLd_Init + use ExtPtfm_MCKF, only: ExtPtfm_Init + use ExternalInflow, only: Init_ExtInfw + use HydroDyn, only: HydroDyn_Init + use InflowWind, only: InflowWind_Init + use MAP, only: MAP_Init, MAP_Restart + use SED, only: SED_Init + use MoorDyn, only: MD_Init + use FEAMooring, only: FEAM_Init + use OrcaFlexInterface, only: Orca_Init + use IceFloe, only: IceFloe_Init + use IceDyn, only: IceD_Init + use SeaState, only: SeaSt_Init + use SoilDyn, only: SlD_Init + use SubDyn, only: SD_Init + use ServoDyn, only: SrvD_Init, & + Cmpl4SFun, & + Cmpl4LV, & + TrimCase_none, & + TrimCase_pitch, & + TrimCase_torque, & + TrimCase_yaw IMPLICIT NONE @@ -33,7 +63,6 @@ MODULE FAST_Subs !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ !> a wrapper routine to call FAST_Initialize at the full-turbine simulation level (makes easier to write top-level driver) SUBROUTINE FAST_InitializeAll_T( t_initial, TurbID, Turbine, ErrStat, ErrMsg, InFile, ExternInitData ) - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time INTEGER(IntKi), INTENT(IN ) :: TurbID !< turbine Identifier (1-NumTurbines) TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine @@ -45,36 +74,43 @@ SUBROUTINE FAST_InitializeAll_T( t_initial, TurbID, Turbine, ErrStat, ErrMsg, In LOGICAL, PARAMETER :: CompAeroMaps = .false. Turbine%TurbID = TurbID + CALL FAST_InitializeAll( t_initial, Turbine%m_Glue, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & + Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & + Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & + Turbine%IceF, Turbine%IceD, Turbine%SlD, CompAeroMaps, ErrStat, ErrMsg, InFile, ExternInitData ) + if(ErrStat >= AbortErrLev) return - IF (PRESENT(InFile)) THEN - IF (PRESENT(ExternInitData)) THEN - CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, CompAeroMaps, ErrStat, ErrMsg, InFile, ExternInitData ) - ELSE - CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, CompAeroMaps, ErrStat, ErrMsg, InFile ) - END IF - ELSE - CALL FAST_InitializeAll( t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, CompAeroMaps, ErrStat, ErrMsg ) - END IF + ! Initialize mappings between modules + call FAST_InitMappings(Turbine%m_Glue%Mappings, Turbine%m_Glue%ModData, Turbine, ErrStat, ErrMsg) + if(ErrStat >= AbortErrLev) return + + ! Initialize solver + call FAST_SolverInit(Turbine%p_FAST, Turbine%p_Glue%TC, Turbine%m_Glue%TC, & + Turbine%m_Glue%ModData, Turbine%m_Glue%Mappings, Turbine, ErrStat, ErrMsg) + if(ErrStat >= AbortErrLev) return + ! Write initialization data to FAST summary file: + if (Turbine%p_FAST%SumPrint) then + CALL FAST_WrSum(Turbine%p_FAST, Turbine%y_FAST, Turbine%m_Glue, ErrStat, ErrMsg) + if(ErrStat >= AbortErrLev) return + endif + + ! Initialize overall glue module for linearization + if (Turbine%p_FAST%Linearize) then + call ModGlue_Init(Turbine%p_Glue, Turbine%m_Glue, Turbine%y_Glue, & + Turbine%p_FAST, Turbine%m_FAST, Turbine, ErrStat, ErrMsg) + end if END SUBROUTINE FAST_InitializeAll_T !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to call Init routine for each module. This routine sets all of the init input data for each module. -SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, CompAeroMaps, ErrStat, ErrMsg, InFile, ExternInitData ) +SUBROUTINE FAST_InitializeAll( t_initial, m_Glue, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & + MAPp, FEAM, MD, Orca, IceF, IceD, SlD, CompAeroMaps, ErrStat, ErrMsg, InFile, ExternInitData ) use ElastoDyn_Parameters, only: Method_RK4 REAL(DbKi), INTENT(IN ) :: t_initial !< initial time + TYPE(Glue_MiscVarType), INTENT(INOUT) :: m_Glue !< Miscellaneous variables glue code TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables @@ -91,6 +127,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data + TYPE(SoilDyn_Data), INTENT(INOUT) :: SlD !< SoilDyn data TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data @@ -100,7 +137,6 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules LOGICAL, INTENT(IN ) :: CompAeroMaps !< Determines if simplifications are made to produce aero maps (not time-marching) INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation @@ -115,21 +151,24 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S REAL(ReKi) :: AirDens ! air density for initialization/normalization of ExternalInflow data + REAL(DbKi) :: dt_module ! temporary variable for module time step REAL(DbKi) :: dt_IceD ! tmp dt variable to ensure IceDyn doesn't specify different dt values for different legs (IceDyn instances) REAL(DbKi) :: dt_BD ! tmp dt variable to ensure BeamDyn doesn't specify different dt values for different instances INTEGER(IntKi) :: ErrStat2 INTEGER(IntKi) :: IceDim ! dimension we're pre-allocating for number of IceDyn legs/instances - INTEGER(IntKi) :: I ! generic loop counter + INTEGER(IntKi) :: i, j ! generic loop counters + INTEGER(IntKi) :: iRot ! rotor index INTEGER(IntKi) :: k ! blade loop counter + INTEGER(IntKi) :: InputAryLB ! Input array lower bound + INTEGER(IntKi) :: InputAryUB ! Input array upper bound + INTEGER(IntKi) :: StateAryLB ! States array lower bound + INTEGER(IntKi) :: StateAryUB ! States array upper bound logical :: CallStart REAL(R8Ki) :: theta(3) ! angles for hub orientation matrix for aeromaps - INTEGER(IntKi) :: NumBl - - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_InitializeAll' + CHARACTER(ErrMsgLen) :: ErrMsg2 !.......... @@ -148,7 +187,6 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S y_FAST%VTK_LastWaveIndx = 1 ! Start looking for wave data at the first index y_FAST%VTK_count = 0 ! first VTK file has 0 as output y_FAST%n_Out = 0 ! set the number of ouptut channels to 0 to indicate there's nothing to write to the binary file - p_FAST%ModuleInitialized = .FALSE. ! (array initialization) no modules are initialized ! Get the current time CALL DATE_AND_TIME ( Values=m_FAST%StrtTime ) ! Let's time the whole simulation @@ -157,13 +195,9 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S m_FAST%t_global = t_initial - 20. ! initialize this to a number < t_initial for error message in ProgAbort - m_FAST%calcJacobian = .TRUE. ! we need to calculate the Jacobian - m_FAST%NextJacCalcTime = m_FAST%t_global ! We want to calculate the Jacobian on the first step p_FAST%TDesc = '' ! p_FAST%CheckHSSBrTrqC = .false. - y_FAST%Lin%WindSpeed = 0.0_ReKi - if (present(ExternInitData)) then CallStart = .not. ExternInitData%FarmIntegration if (ExternInitData%TurbIDforName >= 0) p_FAST%TDesc = 'T'//trim(num2lstr(ExternInitData%TurbIDforName)) @@ -188,11 +222,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S InputFile = InFile ELSE CALL GetInputFileName(InputFile,p_FAST%UseDWM,ErrStat2,ErrMsg2) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + if (Failed()) return END IF ! ... Open and read input files ... @@ -207,304 +237,289 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S else CALL FAST_Init( p_FAST, m_FAST, y_FAST, t_initial, InputFile, ErrStat2, ErrMsg2, ExternInitData%TMax, ExternInitData%TurbIDforName, DTdriver=ExternInitData%DTdriver ) ! We have the name of the input file and the simulation length from somewhere else (e.g. Simulink) end if + if (Failed()) return else p_FAST%TurbinePos = 0.0_ReKi p_FAST%WaveFieldMod = 0 CALL FAST_Init( p_FAST, m_FAST, y_FAST, t_initial, InputFile, ErrStat2, ErrMsg2 ) ! We have the name of the input file from somewhere else (e.g. Simulink) + if (Failed()) return end if - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + ! Allocate array to hold number of blades per rotor + call AllocAry(p_FAST%RotNumBld, p_FAST%NRotors, "p_FAST%RotNumBld", ErrStat2, ErrMsg2); if (Failed()) return + + !---------------------------------------------------------------------------- + ! Module data arrays + !---------------------------------------------------------------------------- + + ! The module data input arrays store the inputs structures used for data + ! interpolation/extrapolation, those used for linearization, and + ! those used as backups for the CFD interface outer loop iteration. Each + ! input structure is at an index in a single array to facilitate copying + ! the data with the FAST_CopyInput routine in FAST_Funcs. The upper bound + ! is based on the interpolation order which stores order + 1 indices. The + ! linearization and backup inputs are stored at negative indices with the + ! lower bound calculated as interpolation order + 1 + number of + ! linearization times. For example, to backup all of the input history for + ! a CFD step, one would copy indices (1,InterpOrder+1) to (-1,-InterpOrder-1). + ! Index 0 (INPUT_TEMP) is used for temporary data storage and replaces `u` + ! in the previous code. Index 1 (INPUT_CURR) holds the current input used + ! in the majority of the glue code. When performing linearization, the input + ! is copied from INPUT_CURR to the negative of (LinTime index + InterpOrder + 1). + ! + ! To summarize, the memory layout looks like the following: + ! [NLinTime][InterpOrder + 1][0(INPUT_TEMP)][InterpOrder+1(INPUT_CURR, INPUT_PREV, ...)] + ! Input array upper bound is interpolation order plus 1 + InputAryUB = p_FAST%InterpOrder + 1 - !............................................................................................................................... + ! Input array lower bound is negative (sum of linearization times and upper bound) + InputAryLB = -(InputAryUB + max(p_FAST%NLinTimes, 2)) - p_FAST%dt_module = p_FAST%dt ! initialize time steps for each module + ! Module state data is handled in a similar fashion except linearization + ! data is stored after the four defined state times: STATE_CURR, STATE_PRED, + ! STATE_SAVED_CURR, and STATE_SAVED_PRED. At least two linearization states + ! are saved so CalcSteady can use a minimum of 2 points for determining + ! if the system has reached a steady state. - if (p_FAST%CompElast == Module_SED) then - ! ........................ - ! initialize Simplified-ElastoDyn (must be done first) - ! ........................ - ALLOCATE( SED%Input( p_FAST%InterpOrder+1 ), SED%InputTimes( p_FAST%InterpOrder+1 ),STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating SED%Input and SED%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + ! Module data state arrays include data at linearization times after saved states + StateAryLB = 1 + StateAryUB = NumStateTimes + max(p_FAST%NLinTimes, 2) + + !---------------------------------------------------------------------------- + ! Linearization + !---------------------------------------------------------------------------- + + y_FAST%Lin%WindSpeed = 0.0_ReKi + + !---------------------------------------------------------------------------- + ! Initialize ElastoDyn/SED (must be done first) + !---------------------------------------------------------------------------- + + select case (p_FAST%CompElast) + + case (Module_SED) ! Simplified-ElastoDyn + + allocate(SED%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("SED%Input")) return + allocate(SED%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("SED%InputTimes")) return + allocate(SED%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SED%x")) return + allocate(SED%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SED%xd")) return + allocate(SED%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SED%z")) return + allocate(SED%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SED%OtherSt")) return Init%InData_SED%Linearize = p_FAST%Linearize - Init%InData_SED%InputFile = p_FAST%EDFile + Init%InData_SED%InputFile = p_FAST%EDFile(1) Init%InData_SED%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_SED)) + ! Call module initialization routine + dt_module = p_FAST%DT CALL SED_Init( Init%InData_SED, SED%Input(1), SED%p, SED%x(STATE_CURR), SED%xd(STATE_CURR), SED%z(STATE_CURR), SED%OtherSt(STATE_CURR), & - SED%y, SED%m, p_FAST%dt_module( MODULE_SED ), Init%OutData_SED, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - p_FAST%ModuleInitialized(Module_SED) = .TRUE. - CALL SetModuleSubstepTime(Module_SED, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + SED%y, SED%m, dt_module, Init%OutData_SED, ErrStat2, ErrMsg2 ) + if (Failed()) return + + ! Add module to array of modules, return if errors occurred + CALL MV_AddModule(m_Glue%ModData, Module_SED, 'SED', 1, dt_module, p_FAST%DT, & + Init%OutData_SED%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2, iRotor=1) + if (Failed()) return - NumBl = Init%OutData_SED%NumBl + ! Save number of blades + p_FAST%RotNumBld(1) = Init%OutData_SED%NumBl - else - ! ........................ - ! initialize ElastoDyn (must be done first) - ! ........................ - ALLOCATE( ED%Input( p_FAST%InterpOrder+1 ), ED%InputTimes( p_FAST%InterpOrder+1 ),STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating ED%Input and ED%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + case default ! ElastoDyn + + ! Allocate module data arrays + allocate(ED%Input (InputAryLB:InputAryUB, p_FAST%NRotors), stat=ErrStat2); if (FailedAlloc("ED%Input")) return + allocate(ED%InputTimes (InputAryUB, p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("ED%InputTimes")) return + allocate(ED%x (p_FAST%NRotors, StateAryUB ), stat=ErrStat2); if (FailedAlloc("ED%x")) return + allocate(ED%xd (p_FAST%NRotors, StateAryUB ), stat=ErrStat2); if (FailedAlloc("ED%xd")) return + allocate(ED%z (p_FAST%NRotors, StateAryUB ), stat=ErrStat2); if (FailedAlloc("ED%z")) return + allocate(ED%OtherSt (p_FAST%NRotors, StateAryUB ), stat=ErrStat2); if (FailedAlloc("ED%OtherSt")) return + allocate(ED%p (p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("ED%p")) return + allocate(ED%y (p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("ED%y")) return + allocate(ED%m (p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("ED%m")) return + allocate(Init%OutData_ED(p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("Init%OutData_ED")) return + + ! Loop through rotors in turbine + do iRot = 1, p_FAST%NRotors - ALLOCATE( ED%Input_Saved( p_FAST%InterpOrder+1 ), ED%InputTimes_Saved( p_FAST%InterpOrder+1 ), ED%Output_bak( p_FAST%InterpOrder+1 ),STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating ED%Input_Saved, ED%Output_bak, and ED%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - Init%InData_ED%Linearize = p_FAST%Linearize - Init%InData_ED%CompAeroMaps = p_FAST%CompAeroMaps - Init%InData_ED%RotSpeed = p_FAST%RotSpeedInit - Init%InData_ED%InputFile = p_FAST%EDFile - - Init%InData_ED%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_ED)) - Init%InData_ED%CompElast = p_FAST%CompElast == Module_ED - - Init%InData_ED%Gravity = p_FAST%Gravity - - Init%InData_ED%MHK = p_FAST%MHK - Init%InData_ED%WtrDpth = p_FAST%WtrDpth - - CALL ED_Init( Init%InData_ED, ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), & - ED%y, ED%m, p_FAST%dt_module( MODULE_ED ), Init%OutData_ED, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Set initialization input + Init%InData_ED%Linearize = p_FAST%Linearize + Init%InData_ED%CompAeroMaps = p_FAST%CompAeroMaps + Init%InData_ED%RotSpeed = p_FAST%RotSpeedInit + Init%InData_ED%InputFile = p_FAST%EDFile(iRot) + + Init%InData_ED%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_ED)) + Init%InData_ED%CompElast = p_FAST%CompElast == Module_ED + Init%InData_ED%Gravity = p_FAST%Gravity + Init%InData_ED%MHK = p_FAST%MHK + Init%InData_ED%WtrDpth = p_FAST%WtrDpth + + ! Call module initialization routine + dt_module = p_FAST%DT + CALL ED_Init(Init%InData_ED, ED%Input(INPUT_CURR, iRot), ED%p(iRot), ED%x(iRot, STATE_CURR), & + ED%xd(iRot, STATE_CURR), ED%z(iRot, STATE_CURR), ED%OtherSt(iRot, STATE_CURR), & + ED%y(iRot), ED%m(iRot), dt_module, Init%OutData_ED(iRot), ErrStat2, ErrMsg2) + if (Failed()) return + + ! Add module to array of modules, return if errors occurred + CALL MV_AddModule(m_Glue%ModData, Module_ED, 'ED', iRot, dt_module, p_FAST%DT, & + Init%OutData_ED(iRot)%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2, iRotor=iRot) + if (Failed()) return - ! Assign the inital positions for use by MoorDyn initalization - p_FAST%PlatformPosInit = Init%OutData_ED%PlatformPos - - p_FAST%ModuleInitialized(Module_ED) = .TRUE. - CALL SetModuleSubstepTime(Module_ED, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - allocate( y_FAST%Lin%Modules(MODULE_ED)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(ED).", ErrStat, ErrMsg, RoutineName ) - else - - if (allocated(Init%OutData_ED%LinNames_y)) call move_alloc(Init%OutData_ED%LinNames_y,y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%Names_y) - if (allocated(Init%OutData_ED%LinNames_x)) call move_alloc(Init%OutData_ED%LinNames_x,y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%Names_x) - if (allocated(Init%OutData_ED%LinNames_u)) call move_alloc(Init%OutData_ED%LinNames_u,y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%Names_u) - if (allocated(Init%OutData_ED%RotFrame_y)) call move_alloc(Init%OutData_ED%RotFrame_y,y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%RotFrame_y) - if (allocated(Init%OutData_ED%RotFrame_x)) call move_alloc(Init%OutData_ED%RotFrame_x,y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%RotFrame_x) - if (allocated(Init%OutData_ED%DerivOrder_x)) call move_alloc(Init%OutData_ED%DerivOrder_x,y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%DerivOrder_x) - if (allocated(Init%OutData_ED%RotFrame_u)) call move_alloc(Init%OutData_ED%RotFrame_u,y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%RotFrame_u) - if (allocated(Init%OutData_ED%IsLoad_u )) call move_alloc(Init%OutData_ED%IsLoad_u ,y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%IsLoad_u ) - - if (allocated(Init%OutData_ED%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_ED)%Instance(1)%NumOutputs = size(Init%OutData_ED%WriteOutputHdr) - end if - - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - NumBl = Init%OutData_ED%NumBl - p_FAST%GearBox_index = Init%OutData_ED%GearBox_index - - - if (p_FAST%CalcSteady) then - if ( EqualRealNos(Init%OutData_ED%RotSpeed, 0.0_ReKi) ) then - p_FAST%TrimCase = TrimCase_none - p_FAST%NLinTimes = 1 - p_FAST%LinInterpOrder = 0 ! constant values - elseif ( Init%OutData_ED%isFixed_GenDOF ) then - p_FAST%TrimCase = TrimCase_none - end if - end if - endif ! SED/ED + ! Save number of blades for this rotor + p_FAST%RotNumBld(iRot) = Init%OutData_ED(iRot)%NumBl + ! Save the GearBox index + p_FAST%GearBox_index = Init%OutData_ED(iRot)%GearBox_index - ! ........................ - ! initialize BeamDyn - ! ........................ - IF ( p_FAST%CompElast == Module_BD ) THEN - IF (p_FAST%CompAeroMaps) then - p_FAST%nBeams = 1 ! initialize number of BeamDyn instances = 1 blade for aero maps - ELSE - p_FAST%nBeams = Init%OutData_ED%NumBl ! initialize number of BeamDyn instances = number of blades - END IF - ELSE - p_FAST%nBeams = 0 - END IF + ! Assign the inital positions for use by MoorDyn initalization + p_FAST%PlatformPosInit = Init%OutData_ED(iRot)%PlatformPos + + ! If steady state calculation is enabled + if (p_FAST%CalcSteady) then + if (EqualRealNos(Init%OutData_ED(iRot)%RotSpeed, 0.0_ReKi)) then + p_FAST%TrimCase = TrimCase_none + p_FAST%NLinTimes = 1 + p_FAST%LinInterpOrder = 0 ! constant values + elseif ( Init%OutData_ED(iRot)%isFixed_GenDOF ) then + p_FAST%TrimCase = TrimCase_none + end if + end if + end do - ALLOCATE( BD%Input( p_FAST%InterpOrder+1, p_FAST%nBeams ), BD%InputTimes( p_FAST%InterpOrder+1, p_FAST%nBeams ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating BD%Input and BD%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + end select ! SED/ED - ALLOCATE( BD%Input_Saved( p_FAST%InterpOrder+1, p_FAST%nBeams ), BD%InputTimes_Saved( p_FAST%InterpOrder+1, p_FAST%nBeams ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating BD%Input_Saved and BD%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - ALLOCATE( BD%x( p_FAST%nBeams,4), & - BD%xd( p_FAST%nBeams,4), & - BD%z( p_FAST%nBeams,4), & - BD%OtherSt( p_FAST%nBeams,4), & - BD%p( p_FAST%nBeams ), & - BD%u( p_FAST%nBeams ), & - BD%y( p_FAST%nBeams ), & - BD%m( p_FAST%nBeams ), & - Init%OutData_BD(p_FAST%nBeams ), & - STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating BeamDyn state, input, and output data.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + !---------------------------------------------------------------------------- + ! Initialize BeamDyn + !---------------------------------------------------------------------------- - IF (p_FAST%CompElast == Module_BD) THEN + if (p_FAST%CompElast == Module_BD) then + if (p_FAST%CompAeroMaps) then + p_FAST%NumBD = 1 ! initialize number of BeamDyn instances = 1 blade for aero maps + else + p_FAST%NumBD = sum(Init%OutData_ED%NumBl) ! initialize number of BeamDyn instances = number of blades + end if + ! Allocate array to map BeamDyn instance number to rotor number + call AllocAry(p_FAST%BDRotMap, p_FAST%NumBD, "BDRotMap", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(p_FAST%BDBldMap, p_FAST%NumBD, "BDBldMap", ErrStat2, ErrMsg2); if (Failed()) return + else + p_FAST%NumBD = 0 + end if - Init%InData_BD%DynamicSolve = .TRUE. ! FAST can only couple to BeamDyn when dynamic solve is used. + ! Allocate module data arrays + allocate(BD%Input (InputAryLB:InputAryUB, p_FAST%NumBD), stat=ErrStat2); if (FailedAlloc("BD%Input")) return + allocate(BD%InputTimes (InputAryUB, p_FAST%NumBD), stat=ErrStat2); if (FailedAlloc("BD%InputTimes")) return + allocate(BD%x (p_FAST%NumBD, StateAryUB ), stat=ErrStat2); if (FailedAlloc("BD%x")) return + allocate(BD%xd (p_FAST%NumBD, StateAryUB ), stat=ErrStat2); if (FailedAlloc("BD%xd")) return + allocate(BD%z (p_FAST%NumBD, StateAryUB ), stat=ErrStat2); if (FailedAlloc("BD%z")) return + allocate(BD%OtherSt (p_FAST%NumBD, StateAryUB ), stat=ErrStat2); if (FailedAlloc("BD%OtherSt")) return + allocate(BD%p (p_FAST%NumBD ), stat=ErrStat2); if (FailedAlloc("BD%p")) return + allocate(BD%y (p_FAST%NumBD ), stat=ErrStat2); if (FailedAlloc("BD%y")) return + allocate(BD%m (p_FAST%NumBD ), stat=ErrStat2); if (FailedAlloc("BD%m")) return + allocate(Init%OutData_BD (p_FAST%NumBD ), stat=ErrStat2); if (FailedAlloc("Init%OutData_BD")) return - Init%InData_BD%Linearize = p_FAST%Linearize - Init%InData_BD%CompAeroMaps = p_FAST%CompAeroMaps - Init%InData_BD%gravity = (/ 0.0_ReKi, 0.0_ReKi, -p_FAST%Gravity /) ! "Gravitational acceleration" m/s^2 + if (p_FAST%CompElast == Module_BD) then - ! now initialize BeamDyn for all beams - dt_BD = p_FAST%dt_module( MODULE_BD ) + ! Set initialization input + Init%InData_BD%DynamicSolve = .TRUE. ! FAST can only couple to BeamDyn when dynamic solve is used. + Init%InData_BD%Linearize = p_FAST%Linearize + Init%InData_BD%CompAeroMaps = p_FAST%CompAeroMaps + Init%InData_BD%gravity = [0.0_ReKi, 0.0_ReKi, -p_FAST%Gravity] ! "Gravitational acceleration" m/s^2 - Init%InData_BD%HubPos = ED%y%HubPtMotion%Position(:,1) - Init%InData_BD%HubRot = ED%y%HubPtMotion%RefOrientation(:,:,1) p_FAST%BD_OutputSibling = .true. - allocate( y_FAST%Lin%Modules(MODULE_BD)%Instance(p_FAST%nBeams), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(BD).", ErrStat, ErrMsg, RoutineName ) - CALL Cleanup() - RETURN - end if - - DO k=1,p_FAST%nBeams - Init%InData_BD%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_BD))//TRIM( Num2LStr(k) ) + j = 0 + do iRot = 1, p_FAST%NRotors + ! Blade number in rotor + DO k = 1, p_FAST%RotNumBld(iRot) + j = j + 1 ! BeamDyn instance number + p_FAST%BDRotMap(j) = iRot ! Set this rotor number for this instance + p_FAST%BDBldMap(j) = k ! Set this blade number for this instance - Init%InData_BD%InputFile = p_FAST%BDBldFile(k) - - Init%InData_BD%GlbPos = ED%y%BladeRootMotion(k)%Position(:,1) ! {:} - - "Initial Position Vector of the local blade coordinate system" - Init%InData_BD%GlbRot = ED%y%BladeRootMotion(k)%RefOrientation(:,:,1) ! {:}{:} - - "Initial direction cosine matrix of the local blade coordinate system" + Init%InData_BD%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_BD))& + &//'.R'//TRIM(Num2LStr(iRot))//'.B'//TRIM(Num2LStr(k)) + Init%InData_BD%InputFile = p_FAST%BDBldFile(k, iRot) + Init%InData_BD%GlbPos = ED%y(iRot)%BladeRootMotion(k)%Position(:,1) ! {:} - - "Initial Position Vector of the local blade coordinate system" + Init%InData_BD%GlbRot = ED%y(iRot)%BladeRootMotion(k)%RefOrientation(:,:,1) ! {:}{:} - - "Initial direction cosine matrix of the local blade coordinate system" ! These outputs are set in ElastoDyn only when BeamDyn is used: - Init%InData_BD%RootDisp = ED%y%BladeRootMotion(k)%TranslationDisp(:,1) ! {:} - - "Initial root displacement" - Init%InData_BD%RootOri = ED%y%BladeRootMotion(k)%Orientation(:,:,1) ! {:}{:} - - "Initial root orientation" - Init%InData_BD%RootVel(1:3) = ED%y%BladeRootMotion(k)%TranslationVel(:,1) ! {:} - - "Initial root velocities and angular veolcities" - Init%InData_BD%RootVel(4:6) = ED%y%BladeRootMotion(k)%RotationVel(:,1) ! {:} - - "Initial root velocities and angular veolcities" - - CALL BD_Init( Init%InData_BD, BD%Input(1,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), & - BD%OtherSt(k,STATE_CURR), BD%y(k), BD%m(k), dt_BD, Init%OutData_BD(k), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - !bjj: we're going to force this to have the same timestep because I don't want to have to deal with n BD modules with n timesteps. - IF ( k == 1 ) THEN - p_FAST%dt_module( MODULE_BD ) = dt_BD + Init%InData_BD%RootDisp = ED%y(iRot)%BladeRootMotion(k)%TranslationDisp(:,1) ! {:} - - "Initial root displacement" + Init%InData_BD%RootOri = ED%y(iRot)%BladeRootMotion(k)%Orientation(:,:,1) ! {:}{:} - - "Initial root orientation" + Init%InData_BD%RootVel(1:3) = ED%y(iRot)%BladeRootMotion(k)%TranslationVel(:,1) ! {:} - - "Initial root velocities and angular velocities" + Init%InData_BD%RootVel(4:6) = ED%y(iRot)%BladeRootMotion(k)%RotationVel(:,1) ! {:} - - "Initial root velocities and angular velocities" - p_FAST%ModuleInitialized(Module_BD) = .TRUE. ! this really should be once per BD instance, but BD doesn't care so I won't go through the effort to track this - CALL SetModuleSubstepTime(Module_BD, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ELSEIF ( .NOT. EqualRealNos( p_FAST%dt_module( MODULE_BD ),dt_BD )) THEN - CALL SetErrStat(ErrID_Fatal,"All instances of BeamDyn (one per blade) must have the same time step.",ErrStat,ErrMsg,RoutineName) - END IF + ! Call module initialization routine + dt_module = p_FAST%DT + CALL BD_Init(Init%InData_BD, BD%Input(INPUT_CURR,j), BD%p(j), BD%x(j,STATE_CURR), BD%xd(j,STATE_CURR), BD%z(j,STATE_CURR), & + BD%OtherSt(j,STATE_CURR), BD%y(j), BD%m(j), dt_module, Init%OutData_BD(j), ErrStat2, ErrMsg2) + if (Failed()) return ! We're going to do fewer computations if the BD input and output meshes that couple to AD are siblings (but it needs to be true for all instances): - if (BD%p(k)%BldMotionNodeLoc /= BD_MESH_QP) p_FAST%BD_OutputSibling = .false. - if (p_FAST%CompAeroMaps .and. BD%p(k)%BldMotionNodeLoc /= BD_MESH_FE) call SetErrStat(ErrID_Fatal, "BeamDyn aero maps must have outputs at FE nodes.", ErrStat, ErrMsg, RoutineName ) - - if (ErrStat>=AbortErrLev) exit !exit this loop so we don't get p_FAST%nBeams of the same errors - - if (size(y_FAST%Lin%Modules(MODULE_BD)%Instance) >= k) then ! for aero maps, we only use the first instance: - if (allocated(Init%OutData_BD(k)%LinNames_y)) call move_alloc(Init%OutData_BD(k)%LinNames_y, y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%Names_y ) - if (allocated(Init%OutData_BD(k)%LinNames_x)) call move_alloc(Init%OutData_BD(k)%LinNames_x, y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%Names_x ) - if (allocated(Init%OutData_BD(k)%LinNames_u)) call move_alloc(Init%OutData_BD(k)%LinNames_u, y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%Names_u ) - if (allocated(Init%OutData_BD(k)%RotFrame_y)) call move_alloc(Init%OutData_BD(k)%RotFrame_y, y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%RotFrame_y ) - if (allocated(Init%OutData_BD(k)%RotFrame_x)) call move_alloc(Init%OutData_BD(k)%RotFrame_x, y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%RotFrame_x ) - if (allocated(Init%OutData_BD(k)%RotFrame_u)) call move_alloc(Init%OutData_BD(k)%RotFrame_u, y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%RotFrame_u ) - if (allocated(Init%OutData_BD(k)%IsLoad_u )) call move_alloc(Init%OutData_BD(k)%IsLoad_u , y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%IsLoad_u ) - if (allocated(Init%OutData_BD(k)%DerivOrder_x)) call move_alloc(Init%OutData_BD(k)%DerivOrder_x, y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%DerivOrder_x ) - - if (allocated(Init%OutData_BD(k)%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_BD)%Instance(k)%NumOutputs = size(Init%OutData_BD(k)%WriteOutputHdr) - end if - - END DO - - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - + if (BD%p(j)%BldMotionNodeLoc /= BD_MESH_QP) p_FAST%BD_OutputSibling = .false. + if (p_FAST%CompAeroMaps .and. BD%p(j)%BldMotionNodeLoc /= BD_MESH_FE) call SetErrStat(ErrID_Fatal, "BeamDyn aero maps must have outputs at FE nodes.", ErrStat, ErrMsg, RoutineName) + + ! Add module instance to array of modules, return on failure + CALL MV_AddModule(m_Glue%ModData, Module_BD, 'BD', j, dt_module, & + p_FAST%DT, Init%OutData_BD(j)%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2, iRotor=iRot) + if (Failed()) return + + END DO + end do END IF - - ! ........................ - ! initialize InflowWind - ! ........................ - ALLOCATE( IfW%Input( p_FAST%InterpOrder+1 ), IfW%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating IfW%Input and IfW%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - ALLOCATE( IfW%Input_Saved( p_FAST%InterpOrder+1 ), IfW%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating IfW%Input_Saved and IfW%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - IF ( p_FAST%CompInflow == Module_IfW ) THEN - - Init%InData_IfW%Linearize = p_FAST%Linearize - Init%InData_IfW%InputFileName = p_FAST%InflowFile - Init%InData_IfW%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_IfW)) - Init%InData_IfW%FilePassingMethod= 0_IntKi ! IfW will read input file - Init%InData_IfW%FixedWindFileRootName = .FALSE. - Init%InData_IfW%OutputAccel = p_FAST%MHK /= MHK_None - - Init%InData_IfW%MHK = p_FAST%MHK - Init%InData_IfW%WtrDpth = p_FAST%WtrDpth - - Init%InData_IfW%NumWindPoints = 0 + !---------------------------------------------------------------------------- + ! Initialize InflowWind + !---------------------------------------------------------------------------- + + ! Allocate module data arrays + allocate(IfW%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("IfW%Input")) return + allocate(IfW%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("IfW%InputTimes")) return + allocate(IfW%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("IfW%x")) return + allocate(IfW%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("IfW%xd")) return + allocate(IfW%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("IfW%z")) return + allocate(IfW%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("IfW%OtherSt")) return + + select case(p_FAST%CompInflow) + case (Module_IfW) + + Init%InData_IfW%Linearize = p_FAST%Linearize + Init%InData_IfW%InputFileName = p_FAST%InflowFile + Init%InData_IfW%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_IfW)) + Init%InData_IfW%FilePassingMethod = 0_IntKi ! IfW will read input file + Init%InData_IfW%FixedWindFileRootName = .FALSE. + Init%InData_IfW%OutputAccel = p_FAST%MHK /= MHK_None + Init%InData_IfW%MHK = p_FAST%MHK + Init%InData_IfW%WtrDpth = p_FAST%WtrDpth - IF ( p_FAST%CompServo == Module_SrvD ) THEN + Init%InData_IfW%NumWindPoints = 0 + IF (p_FAST%CompServo == Module_SrvD) THEN Init%InData_IfW%NumWindPoints = Init%InData_IfW%NumWindPoints + 1 END IF ! lidar - Init%InData_IfW%LidarEnabled = .true. ! allowed with OF, but not FF - if (p_FAST%CompElast == Module_SED) then + ! TODO: Expand IfW to support multiple hubs + Init%InData_IfW%LidarEnabled = .true. ! Lidar allowed with OF, but not FF + select case (p_FAST%CompElast) + case (Module_SED) Init%InData_IfW%HubPosition = SED%y%HubPtMotion%Position(:,1) Init%InData_IfW%RadAvg = Init%OutData_SED%BladeLength - elseif ( p_FAST%CompElast == Module_ED ) then - Init%InData_IfW%HubPosition = ED%y%HubPtMotion%Position(:,1) - Init%InData_IfW%RadAvg = Init%OutData_ED%BladeLength - elseif ( p_FAST%CompElast == Module_BD ) then - Init%InData_IfW%HubPosition = ED%y%HubPtMotion%Position(:,1) - Init%InData_IfW%RadAvg = TwoNorm(BD%y(1)%BldMotion%Position(:,1) - BD%y(1)%BldMotion%Position(:,BD%y(1)%BldMotion%Nnodes)) - end if + case (Module_ED) + Init%InData_IfW%HubPosition = ED%y(1)%HubPtMotion%Position(:,1) + Init%InData_IfW%RadAvg = Init%OutData_ED(1)%BladeLength + case (Module_BD) + Init%InData_IfW%HubPosition = ED%y(1)%HubPtMotion%Position(:,1) + Init%InData_IfW%RadAvg = 0.0_ReKi + do k = 1, p_FAST%NumBD + Init%InData_IfW%RadAvg = Init%InData_IfW%RadAvg + TwoNorm(BD%y(k)%BldMotion%Position(:,1) - BD%y(k)%BldMotion%Position(:,BD%y(k)%BldMotion%Nnodes)) + end do + Init%InData_IfW%RadAvg = Init%InData_IfW%RadAvg / p_FAST%NumBD + end select - IF ( PRESENT(ExternInitData) ) THEN + IF (PRESENT(ExternInitData)) THEN Init%InData_IfW%Use4Dext = ExternInitData%FarmIntegration if (Init%InData_IfW%Use4Dext) then @@ -514,7 +529,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S Init%InData_IfW%FDext%Vel => ExternInitData%windGrid_data end if ELSE - Init%InData_IfW%Use4Dext = .false. + Init%InData_IfW%Use4Dext = .false. END IF ! OLAF might be used in AD, in which case we need to allow out of bounds for some calcs. To do that @@ -524,63 +539,47 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S Init%InData_IfW%BoxExceedAllow = .true. endif - CALL InflowWind_Init( Init%InData_IfW, IfW%Input(1), IfW%p, IfW%x(STATE_CURR), IfW%xd(STATE_CURR), IfW%z(STATE_CURR), & - IfW%OtherSt(STATE_CURR), IfW%y, IfW%m, p_FAST%dt_module( MODULE_IfW ), Init%OutData_IfW, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Call module initialization routine + dt_module = p_FAST%DT + CALL InflowWind_Init(Init%InData_IfW, IfW%Input(1), IfW%p, IfW%x(STATE_CURR), IfW%xd(STATE_CURR), IfW%z(STATE_CURR), & + IfW%OtherSt(STATE_CURR), IfW%y, IfW%m, dt_module, Init%OutData_IfW, ErrStat2, ErrMsg2) + if (Failed()) return - p_FAST%ModuleInitialized(Module_IfW) = .TRUE. - CALL SetModuleSubstepTime(Module_IfW, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - allocate( y_FAST%Lin%Modules(MODULE_IfW)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(IfW).", ErrStat, ErrMsg, RoutineName ) - else - if (allocated(Init%OutData_IfW%LinNames_y)) call move_alloc(Init%OutData_IfW%LinNames_y,y_FAST%Lin%Modules(MODULE_IfW)%Instance(1)%Names_y ) - if (allocated(Init%OutData_IfW%LinNames_u)) call move_alloc(Init%OutData_IfW%LinNames_u,y_FAST%Lin%Modules(MODULE_IfW)%Instance(1)%Names_u ) - if (allocated(Init%OutData_IfW%RotFrame_y)) call move_alloc(Init%OutData_IfW%RotFrame_y,y_FAST%Lin%Modules(MODULE_IfW)%Instance(1)%RotFrame_y ) - if (allocated(Init%OutData_IfW%RotFrame_u)) call move_alloc(Init%OutData_IfW%RotFrame_u,y_FAST%Lin%Modules(MODULE_IfW)%Instance(1)%RotFrame_u ) - if (allocated(Init%OutData_IfW%IsLoad_u )) call move_alloc(Init%OutData_IfW%IsLoad_u ,y_FAST%Lin%Modules(MODULE_IfW)%Instance(1)%IsLoad_u ) - - if (allocated(Init%OutData_IfW%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_IfW)%Instance(1)%NumOutputs = size(Init%OutData_IfW%WriteOutputHdr) - y_FAST%Lin%WindSpeed = Init%OutData_IfW%WindFileInfo%MWS - end if + y_FAST%Lin%WindSpeed = Init%OutData_IfW%WindFileInfo%MWS - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + ! Add module to list of modules, return on error + CALL MV_AddModule(m_Glue%ModData, Module_IfW, 'IfW', 1, dt_module, p_FAST%DT, & + Init%OutData_IfW%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2) + if (Failed()) return - ELSEIF ( p_FAST%CompInflow == Module_ExtInfw ) THEN + case (Module_ExtInfw) ! ExtInfw requires initialization of AD first, so nothing executed here - ELSE + case default Init%OutData_IfW%WindFileInfo%MWS = 0.0_ReKi - END IF ! CompInflow + end select ! CompInflow - ! ........................ - ! initialize SeaStates - ! ........................ - ALLOCATE( SeaSt%Input( p_FAST%InterpOrder+1 ), SeaSt%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating SeaSt%Input and SeaSt%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + !---------------------------------------------------------------------------- + ! Initialize SeaStates + !---------------------------------------------------------------------------- - ALLOCATE( SeaSt%Input_Saved( p_FAST%InterpOrder+1 ), SeaSt%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating SeaSt%Input_Saved and SeaSt%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + ! Allocate module data arrays + allocate(SeaSt%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("SeaSt%Input")) return + allocate(SeaSt%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("SeaSt%InputTimes")) return + allocate(SeaSt%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SeaSt%x")) return + allocate(SeaSt%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SeaSt%xd")) return + allocate(SeaSt%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SeaSt%z")) return + allocate(SeaSt%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SeaSt%OtherSt")) return if ( p_FAST%CompSeaSt == Module_SeaSt ) then + Init%InData_SeaSt%TMax = p_FAST%TMax Init%InData_SeaSt%Gravity = p_FAST%Gravity Init%InData_SeaSt%defWtrDens = p_FAST%WtrDens Init%InData_SeaSt%defWtrDpth = p_FAST%WtrDpth Init%InData_SeaSt%defMSL2SWL = p_FAST%MSL2SWL + Init%InData_SeaSt%MHK = p_FAST%MHK Init%InData_SeaSt%UseInputFile = .TRUE. Init%InData_SeaSt%Linearize = p_FAST%Linearize Init%InData_SeaSt%hasIce = p_FAST%CompIce /= Module_None @@ -588,23 +587,33 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S Init%InData_SeaSt%OutRootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_SeaSt)) Init%InData_SeaSt%WaveTimeShift = 0.0_DbKi ! for phase shifting wave field in time (positive value only) - ! these values support wave field handling + ! these values support wave field handling Init%InData_SeaSt%WaveFieldMod = p_FAST%WaveFieldMod Init%InData_SeaSt%PtfmLocationX = p_FAST%TurbinePos(1) Init%InData_SeaSt%PtfmLocationY = p_FAST%TurbinePos(2) - Init%InData_SeaSt%TMax = p_FAST%TMax + IF ( p_FAST%MHK /= MHK_None .AND. p_FAST%CompInflow == Module_IfW) THEN ! MHK turbine with dynamic current + ! Simulating an MHK turbine; load dynamic current from IfW + Init%InData_SeaSt%CurrField => Init%OutData_IfW%FlowField + Init%InData_SeaSt%hasCurrField = .TRUE. + ELSE + Init%InData_SeaSt%hasCurrField = .FALSE. + END IF + ! wave field visualization if (p_FAST%WrVTK == VTK_Animate .and. p_FAST%VTK_Type == VTK_Surf) Init%InData_SeaSt%SurfaceVis = .true. - - CALL SeaSt_Init( Init%InData_SeaSt, SeaSt%Input(1), SeaSt%p, SeaSt%x(STATE_CURR), SeaSt%xd(STATE_CURR), SeaSt%z(STATE_CURR), & - SeaSt%OtherSt(STATE_CURR), SeaSt%y, SeaSt%m, p_FAST%dt_module( MODULE_SeaSt ), Init%OutData_SeaSt, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - p_FAST%ModuleInitialized(Module_SeaSt) = .TRUE. - CALL SetModuleSubstepTime(Module_SeaSt, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Call module initialization routine + dt_module = p_FAST%DT + CALL SeaSt_Init(Init%InData_SeaSt, SeaSt%Input(1), SeaSt%p, SeaSt%x(STATE_CURR), SeaSt%xd(STATE_CURR), SeaSt%z(STATE_CURR), & + SeaSt%OtherSt(STATE_CURR), SeaSt%y, SeaSt%m, dt_module, Init%OutData_SeaSt, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Add module to array, return on error + call MV_AddModule(m_Glue%ModData, Module_SeaSt, 'SEA', 1, dt_module, p_FAST%DT, & + Init%OutData_SeaSt%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2) + if (Failed()) return if (allocated(Init%OutData_SeaSt%WaveElevVisGrid)) then p_FAST%VTK_surface%NWaveElevPts(1) = size(Init%OutData_SeaSt%WaveElevVisX) @@ -614,235 +623,205 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S p_FAST%VTK_surface%NWaveElevPts(2) = 0 endif - allocate( y_FAST%Lin%Modules(MODULE_SeaSt)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(SeaSt).", ErrStat, ErrMsg, RoutineName ) - else - if (allocated(Init%OutData_SeaSt%LinNames_y)) call move_alloc(Init%OutData_SeaSt%LinNames_y,y_FAST%Lin%Modules(MODULE_SeaSt)%Instance(1)%Names_y ) - if (allocated(Init%OutData_SeaSt%LinNames_u)) call move_alloc(Init%OutData_SeaSt%LinNames_u,y_FAST%Lin%Modules(MODULE_SeaSt)%Instance(1)%Names_u ) - if (allocated(Init%OutData_SeaSt%RotFrame_y)) call move_alloc(Init%OutData_SeaSt%RotFrame_y,y_FAST%Lin%Modules(MODULE_SeaSt)%Instance(1)%RotFrame_y ) - if (allocated(Init%OutData_SeaSt%RotFrame_u)) call move_alloc(Init%OutData_SeaSt%RotFrame_u,y_FAST%Lin%Modules(MODULE_SeaSt)%Instance(1)%RotFrame_u ) - if (allocated(Init%OutData_SeaSt%IsLoad_u )) call move_alloc(Init%OutData_SeaSt%IsLoad_u ,y_FAST%Lin%Modules(MODULE_SeaSt)%Instance(1)%IsLoad_u ) - - if (allocated(Init%OutData_SeaSt%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_SeaSt)%Instance(1)%NumOutputs = size(Init%OutData_SeaSt%WriteOutputHdr) - end if - - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - end if + !---------------------------------------------------------------------------- + ! Initialize AeroDyn / ADsk + !---------------------------------------------------------------------------- - ! ........................ - ! initialize AeroDyn / ADsk - ! ........................ - ALLOCATE( AD%Input( p_FAST%InterpOrder+1 ), AD%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating AD%Input and AD%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - ALLOCATE( AD%Input_Saved( p_FAST%InterpOrder+1 ), AD%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating AD%Input and AD%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - ALLOCATE( ADsk%Input( p_FAST%InterpOrder+1 ), ADsk%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating ADsk%Input and ADsk%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + select case (p_FAST%CompAero) - IF ( (p_FAST%CompAero == Module_AD) .OR. (p_FAST%CompAero == Module_ExtLd) ) THEN + case (Module_AD, Module_ExtLd) - allocate(Init%InData_AD%rotors(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat( ErrID_Fatal, 'Allocating rotors', errStat, errMsg, RoutineName ) - call Cleanup() - return - end if + ! Allocate module data arrays + allocate(AD%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("AD%Input")) return + allocate(AD%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("AD%InputTimes")) return + allocate(AD%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("AD%x")) return + allocate(AD%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("AD%xd")) return + allocate(AD%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("AD%z")) return + allocate(AD%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("AD%OtherSt")) return - Init%InData_AD%rotors(1)%NumBlades = NumBl + ! Set pointers to InflowWind FlowField + IF (p_FAST%CompInflow == Module_IfW) Init%InData_AD%FlowField => Init%OutData_IfW%FlowField - if (p_FAST%CompAeroMaps) then - CALL AllocAry( MeshMapData%HubOrient, 3, 3, Init%InData_AD%rotors(1)%NumBlades, 'Hub orientation matrix', ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + ! Allocate input data for NRotors + allocate(Init%InData_AD%rotors(p_FAST%NRotors), stat=ErrStat2); + if (FailedAlloc("AD%Init%InData_AD%rotors("//Num2LStr(p_FAST%NRotors)//")")) return - theta = 0.0_R8Ki - do k=1,Init%InData_AD%rotors(1)%NumBlades - theta(1) = TwoPi_R8 * (k-1) / Init%InData_AD%rotors(1)%NumBlades - MeshMapData%HubOrient(:,:,k) = EulerConstruct( theta ) - end do - end if + ! Loop through rotors + do iRot = 1, p_FAST%NRotors + ! Set number of blades in this rotor + Init%InData_AD%rotors(iRot)%NumBlades = p_FAST%RotNumBld(iRot) ! set initialization data for AD - CALL AllocAry( Init%InData_AD%rotors(1)%BladeRootPosition, 3, Init%InData_AD%rotors(1)%NumBlades, 'Init%InData_AD%rotors(1)%BladeRootPosition', errStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL AllocAry( Init%InData_AD%rotors(1)%BladeRootOrientation,3, 3, Init%InData_AD%rotors(1)%NumBlades, 'Init%InData_AD%rotors(1)%BladeRootOrientation', errStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + call AllocAry( Init%InData_AD%rotors(iRot)%BladeRootPosition, 3, Init%InData_AD%rotors(iRot)%NumBlades, 'Init%InData_AD%rotors(iRot)%BladeRootPosition', errStat2, ErrMsg2) + if (Failed()) return + + call AllocAry( Init%InData_AD%rotors(iRot)%BladeRootOrientation,3, 3, Init%InData_AD%rotors(iRot)%NumBlades, 'Init%InData_AD%rotors(iRot)%BladeRootOrientation', errStat2, ErrMsg2) + if (Failed()) return + + Init%InData_AD%Gravity = p_FAST%Gravity + Init%InData_AD%Linearize = p_FAST%Linearize + Init%InData_AD%CompAeroMaps = p_FAST%CompAeroMaps + Init%InData_AD%rotors(iRot)%RotSpeed = p_FAST%RotSpeedInit ! used only for aeromaps + Init%InData_AD%InputFile = p_FAST%AeroFile + Init%InData_AD%RootName = p_FAST%OutFileRoot + Init%InData_AD%MHK = p_FAST%MHK + Init%InData_AD%CompSeaSt = p_FAST%CompSeaSt /= Module_None + if ( p_FAST%MHK == MHK_None ) then + Init%InData_AD%defFldDens = p_FAST%AirDens + else + Init%InData_AD%defFldDens = p_FAST%WtrDens + end if + Init%InData_AD%defKinVisc = p_FAST%KinVisc + Init%InData_AD%defSpdSound = p_FAST%SpdSound + Init%InData_AD%defPatm = p_FAST%Patm + Init%InData_AD%defPvap = p_FAST%Pvap + Init%InData_AD%WtrDpth = p_FAST%WtrDpth + Init%InData_AD%MSL2SWL = p_FAST%MSL2SWL + + ! Copy hub, nacelle, and blade root position and orientation from SED or ED + if (p_FAST%CompElast == Module_SED) then + + Init%InData_AD%rotors(iRot)%HubPosition = SED%y%HubPtMotion%Position(:,1) + Init%InData_AD%rotors(iRot)%HubOrientation = SED%y%HubPtMotion%RefOrientation(:,:,1) + Init%InData_AD%rotors(iRot)%NacellePosition = SED%y%NacelleMotion%Position(:,1) + Init%InData_AD%rotors(iRot)%NacelleOrientation = SED%y%NacelleMotion%RefOrientation(:,:,1) + do k = 1, p_FAST%RotNumBld(iRot) + Init%InData_AD%rotors(iRot)%BladeRootPosition(:,k) = SED%y%BladeRootMotion(k)%Position(:,1) + Init%InData_AD%rotors(iRot)%BladeRootOrientation(:,:,k) = SED%y%BladeRootMotion(k)%RefOrientation(:,:,1) + end do - Init%InData_AD%Gravity = p_FAST%Gravity - Init%InData_AD%Linearize = p_FAST%Linearize - Init%InData_AD%CompAeroMaps = p_FAST%CompAeroMaps - Init%InData_AD%rotors(1)%RotSpeed = p_FAST%RotSpeedInit ! used only for aeromaps - Init%InData_AD%InputFile = p_FAST%AeroFile - Init%InData_AD%RootName = p_FAST%OutFileRoot - Init%InData_AD%MHK = p_FAST%MHK - if ( p_FAST%MHK == MHK_None ) then - Init%InData_AD%defFldDens = p_FAST%AirDens - else - Init%InData_AD%defFldDens = p_FAST%WtrDens - end if - Init%InData_AD%defKinVisc = p_FAST%KinVisc - Init%InData_AD%defSpdSound = p_FAST%SpdSound - Init%InData_AD%defPatm = p_FAST%Patm - Init%InData_AD%defPvap = p_FAST%Pvap - Init%InData_AD%WtrDpth = p_FAST%WtrDpth - Init%InData_AD%MSL2SWL = p_FAST%MSL2SWL + elseif (p_FAST%CompElast == Module_ED .or. p_FAST%CompElast == Module_BD) then + Init%InData_AD%rotors(iRot)%HubPosition = ED%y(iRot)%HubPtMotion%Position(:,1) + Init%InData_AD%rotors(iRot)%HubOrientation = ED%y(iRot)%HubPtMotion%RefOrientation(:,:,1) + Init%InData_AD%rotors(iRot)%NacellePosition = ED%y(iRot)%NacelleMotion%Position(:,1) + Init%InData_AD%rotors(iRot)%NacelleOrientation = ED%y(iRot)%NacelleMotion%RefOrientation(:,:,1) + do k = 1, p_FAST%RotNumBld(iRot) + Init%InData_AD%rotors(iRot)%BladeRootPosition(:,k) = ED%y(iRot)%BladeRootMotion(k)%Position(:,1) + Init%InData_AD%rotors(iRot)%BladeRootOrientation(:,:,k) = ED%y(iRot)%BladeRootMotion(k)%RefOrientation(:,:,1) + end do - if (p_FAST%CompElast == Module_SED) then - Init%InData_AD%rotors(1)%HubPosition = SED%y%HubPtMotion%Position(:,1) - Init%InData_AD%rotors(1)%HubOrientation = SED%y%HubPtMotion%RefOrientation(:,:,1) - Init%InData_AD%rotors(1)%NacellePosition = SED%y%NacelleMotion%Position(:,1) - Init%InData_AD%rotors(1)%NacelleOrientation = SED%y%NacelleMotion%RefOrientation(:,:,1) - do k=1,NumBl - Init%InData_AD%rotors(1)%BladeRootPosition(:,k) = SED%y%BladeRootMotion(k)%Position(:,1) - Init%InData_AD%rotors(1)%BladeRootOrientation(:,:,k) = SED%y%BladeRootMotion(k)%RefOrientation(:,:,1) - end do - elseif (p_FAST%CompElast == Module_ED .or. p_FAST%CompElast == Module_BD) then - Init%InData_AD%rotors(1)%HubPosition = ED%y%HubPtMotion%Position(:,1) - Init%InData_AD%rotors(1)%HubOrientation = ED%y%HubPtMotion%RefOrientation(:,:,1) - Init%InData_AD%rotors(1)%NacellePosition = ED%y%NacelleMotion%Position(:,1) - Init%InData_AD%rotors(1)%NacelleOrientation = ED%y%NacelleMotion%RefOrientation(:,:,1) - do k=1,NumBl - Init%InData_AD%rotors(1)%BladeRootPosition(:,k) = ED%y%BladeRootMotion(k)%Position(:,1) - Init%InData_AD%rotors(1)%BladeRootOrientation(:,:,k) = ED%y%BladeRootMotion(k)%RefOrientation(:,:,1) - end do - endif + endif - ! Note: not passing tailfin position and orientation at init - Init%InData_AD%rotors(1)%AeroProjMod = -1 ! -1 means AeroDyn will decide based on BEM_Mod + ! Note: not passing tail fin position and orientation at init + Init%InData_AD%rotors(iRot)%AeroProjMod = -1 ! -1 means AeroDyn will decide based on BEM_Mod - ! Set pointers to flowfield - IF (p_FAST%CompInflow == Module_IfW) Init%InData_AD%FlowField => Init%OutData_IfW%FlowField + end do - CALL AD_Init( Init%InData_AD, AD%Input(1), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), & - AD%OtherSt(STATE_CURR), AD%y, AD%m, p_FAST%dt_module( MODULE_AD ), Init%OutData_AD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Call module initialization subroutine to initialize all rotors + dt_module = p_FAST%DT + CALL AD_Init(Init%InData_AD, AD%Input(INPUT_CURR), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), & + AD%OtherSt(STATE_CURR), AD%y, AD%m, dt_module, Init%OutData_AD, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Loop through rotors and add module for each one + do iRot = 1, p_FAST%NRotors + CALL MV_AddModule(m_Glue%ModData, Module_AD, 'AD', iRot, dt_module, p_FAST%DT, & + Init%OutData_AD%rotors(iRot)%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2, iRotor=iRot) + if (Failed()) return + end do - p_FAST%ModuleInitialized(Module_AD) = .TRUE. - CALL SetModuleSubstepTime(Module_AD, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Set AD pointers to WaveField if MHK turbine and SeaState is enabled + if (p_FAST%MHK /= MHK_None .AND. p_FAST%CompSeaSt == Module_SeaSt) AD%p%WaveField => Init%OutData_SeaSt%WaveField - allocate( y_FAST%Lin%Modules(MODULE_AD)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(AD).", ErrStat, ErrMsg, RoutineName ) - else - if (allocated(Init%OutData_AD%rotors(1)%LinNames_u )) call move_alloc(Init%OutData_AD%rotors(1)%LinNames_u ,y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%Names_u ) - if (allocated(Init%OutData_AD%rotors(1)%LinNames_y )) call move_alloc(Init%OutData_AD%rotors(1)%LinNames_y ,y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%Names_y ) - if (allocated(Init%OutData_AD%rotors(1)%LinNames_x )) call move_alloc(Init%OutData_AD%rotors(1)%LinNames_x ,y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%Names_x ) - if (allocated(Init%OutData_AD%rotors(1)%RotFrame_u )) call move_alloc(Init%OutData_AD%rotors(1)%RotFrame_u ,y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%RotFrame_u ) - if (allocated(Init%OutData_AD%rotors(1)%RotFrame_y )) call move_alloc(Init%OutData_AD%rotors(1)%RotFrame_y ,y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%RotFrame_y ) - if (allocated(Init%OutData_AD%rotors(1)%RotFrame_x )) call move_alloc(Init%OutData_AD%rotors(1)%RotFrame_x ,y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%RotFrame_x ) - if (allocated(Init%OutData_AD%rotors(1)%IsLoad_u )) call move_alloc(Init%OutData_AD%rotors(1)%IsLoad_u ,y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%IsLoad_u ) - if (allocated(Init%OutData_AD%rotors(1)%DerivOrder_x)) call move_alloc(Init%OutData_AD%rotors(1)%DerivOrder_x,y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%DerivOrder_x ) - - if (allocated(Init%OutData_AD%rotors(1)%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_AD)%Instance(1)%NumOutputs = size(Init%OutData_AD%rotors(1)%WriteOutputHdr) - end if + ! If Aero Map is enabled, copy hub orientation for each blade + if (p_FAST%CompAeroMaps) then + CALL AllocAry(m_Glue%AM%HubOrientation, 3, 3, Init%InData_AD%rotors(1)%NumBlades, 'Hub orientation matrix', ErrStat2, ErrMsg2) + if (Failed()) return - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + theta = 0.0_R8Ki + do k=1,Init%InData_AD%rotors(1)%NumBlades + theta(1) = TwoPi_R8 * (k-1) / Init%InData_AD%rotors(1)%NumBlades + m_Glue%AM%HubOrientation(:,:,k) = EulerConstruct(theta) + end do + end if - ! AeroDyn may override the AirDens value. Store this to inform other modules AirDens = Init%OutData_AD%rotors(1)%AirDens - ELSEIF ( p_FAST%CompAero == Module_ADsk ) THEN + case (Module_ADsk) + + ! Allocate module data arrays + allocate(ADsk%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("ADsk%Input")) return + allocate(ADsk%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("ADsk%InputTimes")) return + allocate(ADsk%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("ADsk%x")) return + allocate(ADsk%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("ADsk%xd")) return + allocate(ADsk%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("ADsk%z")) return + allocate(ADsk%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("ADsk%OtherSt")) return + Init%InData_ADsk%InputFile = p_FAST%AeroFile Init%InData_ADsk%RootName = p_FAST%OutFileRoot + ! NOTE: cone angle is not included in the RotorRad calculation!!! if (p_FAST%CompElast == Module_SED) then Init%InData_ADsk%RotorRad = Init%OutData_SED%HubRad + Init%OutData_SED%BladeLength Init%InData_ADsk%HubPosition = SED%y%HubPtMotion%Position(:,1) Init%InData_ADsk%HubOrientation = SED%y%HubPtMotion%RefOrientation(:,:,1) else - Init%InData_ADsk%RotorRad = Init%OutData_ED%HubRad + Init%OutData_ED%BladeLength - Init%InData_ADsk%HubPosition = ED%y%HubPtMotion%Position(:,1) - Init%InData_ADsk%HubOrientation = ED%y%HubPtMotion%RefOrientation(:,:,1) + Init%InData_ADsk%RotorRad = Init%OutData_ED(1)%HubRad + Init%OutData_ED(1)%BladeLength + Init%InData_ADsk%HubPosition = ED%y(1)%HubPtMotion%Position(:,1) + Init%InData_ADsk%HubOrientation = ED%y(1)%HubPtMotion%RefOrientation(:,:,1) endif + Init%InData_ADsk%defAirDens = p_FAST%AirDens Init%InData_ADsk%Linearize = p_FAST%Linearize ! NOTE: This module cannot be linearized Init%InData_ADsk%UseInputFile = .true. !Init%InData_ADsk%PassedFileData = ! Passing filename instead of file contents IF (p_FAST%CompInflow == Module_IfW) Init%InData_ADsk%FlowField => Init%OutData_IfW%FlowField + ! Initialize module + dt_module = p_FAST%DT CALL ADsk_Init( Init%InData_ADsk, ADsk%Input(1), ADsk%p, ADsk%x(STATE_CURR), ADsk%xd(STATE_CURR), ADsk%z(STATE_CURR), & - ADsk%OtherSt(STATE_CURR), ADsk%y, ADsk%m, p_FAST%dt_module( MODULE_ADsk ), Init%OutData_ADsk, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ADsk%OtherSt(STATE_CURR), ADsk%y, ADsk%m, dt_module, Init%OutData_ADsk, ErrStat2, ErrMsg2 ) + if (Failed()) return - p_FAST%ModuleInitialized(Module_ADsk) = .TRUE. - CALL SetModuleSubstepTime(Module_ADsk, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Add module to array, return on error + call MV_AddModule(m_Glue%ModData, Module_ADsk, 'ADsk', 1, dt_module, p_FAST%DT, & + Init%OutData_ADsk%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2, iRotor=1) + if (Failed()) return ! AeroDisk may override the AirDens value. Store this to inform other modules AirDens = Init%OutData_ADsk%AirDens - END IF ! CompAero + end select ! CompAero - IF ( p_FAST%CompAero == Module_ExtLd ) THEN + !---------------------------------------------------------------------------- + ! External Loads + !---------------------------------------------------------------------------- - IF ( PRESENT(ExternInitData) ) THEN - - ! set initialization data for ExtLoads - CALL ExtLd_SetInitInput(Init%InData_ExtLd, Init%OutData_ED, ED%y, Init%OutData_BD, BD%y(:), Init%OutData_AD, p_FAST, ExternInitData, ErrStat2, ErrMsg2) - CALL ExtLd_Init( Init%InData_ExtLd, ExtLd%u, ExtLd%xd(1), ExtLd%p, ExtLd%y, ExtLd%m, p_FAST%dt_module( MODULE_ExtLd ), Init%OutData_ExtLd, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IF ((p_FAST%CompAero == Module_ExtLd) .and. PRESENT(ExternInitData)) THEN - p_FAST%ModuleInitialized(Module_ExtLd) = .TRUE. - CALL SetModuleSubstepTime(Module_ExtLd, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + ! Initialize module + dt_module = p_FAST%DT + CALL ExtLd_SetInitInput(Init%InData_ExtLd, Init%OutData_ED(1), ED%y(1), & + Init%OutData_BD, BD%y(:), Init%OutData_AD, p_FAST, & + ExternInitData, ErrStat2, ErrMsg2) + CALL ExtLd_Init(Init%InData_ExtLd, ExtLd%u, ExtLd%xd(1), ExtLd%p, ExtLd%y, ExtLd%m, & + dt_module, Init%OutData_ExtLd, ErrStat2, ErrMsg2) + if (Failed()) return - ! ExtLd may override the AirDens value. Store this to inform other modules - AirDens = Init%OutData_ExtLd%AirDens + ! Add module to list of modules, return on error + CALL MV_AddModule(m_Glue%ModData, Module_ExtLd, 'ExtLd', 1, dt_module, p_FAST%DT, & + Init%OutData_ExtLd%Vars, .false., ErrStat2, ErrMsg2, iRotor=1) + if (Failed()) return - END IF + ! ExtLd may override the AirDens value. Store this to inform other modules + AirDens = Init%OutData_ExtLd%AirDens END IF - ! ........................ - ! No aero of any sort - ! ........................ - IF ( (p_FAST%CompAero == Module_None) .or. (p_FAST%CompAero == Module_Unknown)) THEN + ! If no aero enabled, set air density to zero + IF ((p_FAST%CompAero == Module_None) .or. (p_FAST%CompAero == Module_Unknown)) THEN AirDens = 0.0_ReKi ENDIF - - ! ........................ - ! initialize ExtInfw - ! Ideally this would be initialized in the same logic as InflowWind above. However AD outputs are required - ! ........................ + !---------------------------------------------------------------------------- + ! ExtInfw + ! Ideally this would be initialized in the same logic as InflowWind above. + ! However, AD outputs are required + !---------------------------------------------------------------------------- IF ( p_FAST%CompInflow == Module_ExtInfw ) THEN IF ( PRESENT(ExternInitData) ) THEN @@ -872,16 +851,17 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S RETURN END IF - !Set node clustering type + ! Set node clustering type Init%InData_ExtInfw%NodeClusterType = ExternInitData%NodeClusterType - ! set up the data structures for integration with ExternalInflow - CALL Init_ExtInfw( Init%InData_ExtInfw, p_FAST, AirDens, AD%Input(1), Init%OutData_AD, AD%y, ExtInfw, Init%OutData_ExtInfw, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + ! Set up the data structures for integration with ExternalInflow + CALL Init_ExtInfw(Init%InData_ExtInfw, p_FAST, AirDens, AD%Input(1), Init%OutData_AD, AD%y, ExtInfw, Init%OutData_ExtInfw, ErrStat2, ErrMsg2) + if (Failed()) return - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + ! Add module to list of modules, return on error + CALL MV_AddModule(m_Glue%ModData, Module_ExtInfw, 'ExtInfw', 1, p_FAST%DT, p_FAST%DT, & + Init%OutData_ExtInfw%Vars, .false., ErrStat2, ErrMsg2) + if (Failed()) return !bjj: fix me!!! to do Init%OutData_IfW%WindFileInfo%MWS = 0.0_ReKi @@ -890,298 +870,283 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S IF (p_FAST%CompAero == Module_AD) AD%p%FlowField => Init%OutData_ExtInfw%FlowField endif + !---------------------------------------------------------------------------- + ! CompSoil (SoilDyn) + !---------------------------------------------------------------------------- - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - + ! Allocate module data arrays + allocate(SlD%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("SlD%Input")) return + allocate(SlD%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("SlD%InputTimes")) return + allocate(SlD%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SlD%x")) return + allocate(SlD%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SlD%xd")) return + allocate(SlD%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SlD%z")) return + allocate(SlD%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SlD%OtherSt")) return - ! ........................ - ! initialize HydroDyn - ! ........................ - ALLOCATE( HD%Input( p_FAST%InterpOrder+1 ), HD%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating HD%Input and HD%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + select case (p_FAST%CompSoil) - ALLOCATE( HD%Input_Saved( p_FAST%InterpOrder+1 ), HD%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating HD%Input_Saved and HD%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + ! SoilDyn + case (Module_SlD) - IF ( p_FAST%CompHydro == Module_HD ) THEN + ! SoilDyn requires SubDyn + if (p_FAST%CompSub /= Module_SD) then + call SetErrStat(ErrID_Fatal, "SoilDyn requires SubDyn (CompSub = 1)", ErrStat, ErrMsg, RoutineName) + return + end if - Init%InData_HD%Gravity = p_FAST%Gravity - Init%InData_HD%UseInputFile = .TRUE. - Init%InData_HD%InputFile = p_FAST%HydroFile - Init%InData_HD%OutRootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_HD)) - Init%InData_HD%TMax = p_FAST%TMax - Init%InData_HD%Linearize = p_FAST%Linearize - Init%InData_HD%PlatformPos = Init%OutData_ED%PlatformPos ! Initial platform position; PlatformPos(1:3) is effectively the initial position of the HD origin - if (p_FAST%WrVTK /= VTK_None) Init%InData_HD%VisMeshes=.true. - - ! if ( p_FAST%CompSeaSt == Module_SeaSt ) then ! this is always true - Init%InData_HD%InvalidWithSSExctn = Init%OutData_SeaSt%InvalidWithSSExctn - Init%InData_HD%WaveField => Init%OutData_SeaSt%WaveField - ! end if + ! Initialization input + Init%InData_SlD%InputFile = p_FAST%SoilFile + Init%InData_SlD%RootName = p_FAST%OutFileRoot + Init%InData_SlD%SlDNonLinearForcePortionOnly = .true. ! SoilDyn will only return the Non-Linear portion of the reaction force + Init%InData_SlD%WtrDpth = p_FAST%WtrDpth + + ! Initialize SoilDyn + dt_module = p_FAST%DT + CALL SlD_Init(Init%InData_SlD, SlD%Input(1), SlD%p, & + SlD%x(STATE_CURR), SlD%xd(STATE_CURR), & + SlD%z(STATE_CURR), SlD%OtherSt(STATE_CURR), & + SlD%y, SlD%m, dt_module, Init%OutData_SlD, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Add module to list of modules, return on error + CALL MV_AddModule(m_Glue%ModData, Module_SlD, 'SlD', 1, dt_module, p_FAST%DT, & + Init%OutData_SlD%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2) + if (Failed()) return + end select - CALL HydroDyn_Init( Init%InData_HD, HD%Input(1), HD%p, HD%x(STATE_CURR), HD%xd(STATE_CURR), HD%z(STATE_CURR), & - HD%OtherSt(STATE_CURR), HD%y, HD%m, p_FAST%dt_module( MODULE_HD ), Init%OutData_HD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + !---------------------------------------------------------------------------- + ! CompSub (SubDyn or ExtPtfm) + !---------------------------------------------------------------------------- - p_FAST%ModuleInitialized(Module_HD) = .TRUE. - CALL SetModuleSubstepTime(Module_HD, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Allocate module data arrays + allocate(SD%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("SD%Input")) return + allocate(SD%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("SD%InputTimes")) return + allocate(SD%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SD%x")) return + allocate(SD%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SD%xd")) return + allocate(SD%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SD%z")) return + allocate(SD%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("SD%OtherSt")) return - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - - allocate( y_FAST%Lin%Modules(MODULE_HD)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(HD).", ErrStat, ErrMsg, RoutineName ) - else - if (allocated(Init%OutData_HD%LinNames_y)) call move_alloc(Init%OutData_HD%LinNames_y,y_FAST%Lin%Modules(MODULE_HD)%Instance(1)%Names_y ) - if (allocated(Init%OutData_HD%LinNames_u)) call move_alloc(Init%OutData_HD%LinNames_u,y_FAST%Lin%Modules(MODULE_HD)%Instance(1)%Names_u ) - if (allocated(Init%OutData_HD%LinNames_x)) call move_alloc(Init%OutData_HD%LinNames_x, y_FAST%Lin%Modules(MODULE_HD)%Instance(1)%Names_x ) - if (allocated(Init%OutData_HD%DerivOrder_x)) call move_alloc(Init%OutData_HD%DerivOrder_x,y_FAST%Lin%Modules(MODULE_HD)%Instance(1)%DerivOrder_x) - if (allocated(Init%OutData_HD%IsLoad_u )) call move_alloc(Init%OutData_HD%IsLoad_u ,y_FAST%Lin%Modules(MODULE_HD)%Instance(1)%IsLoad_u ) - - if (allocated(Init%OutData_HD%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_HD)%Instance(1)%NumOutputs = size(Init%OutData_HD%WriteOutputHdr) - end if - - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - END IF ! CompHydro - - ! ........................ - ! initialize SubDyn or ExtPtfm_MCKF - ! ........................ - ALLOCATE( SD%Input( p_FAST%InterpOrder+1 ), SD%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating SD%Input and SD%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - ALLOCATE( SD%Input_Saved( p_FAST%InterpOrder+1 ), SD%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating SD%Input_Saved and SD%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - ALLOCATE( ExtPtfm%Input( p_FAST%InterpOrder+1 ), ExtPtfm%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating ExtPtfm%Input and ExtPtfm%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - ALLOCATE( ExtPtfm%Input_Saved( p_FAST%InterpOrder+1 ), ExtPtfm%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating ExtPtfm%Input_Saved and ExtPtfm%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + ! Allocate module data arrays + allocate(ExtPtfm%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("ExtPtfm%Input")) return + allocate(ExtPtfm%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("ExtPtfm%InputTimes")) return + allocate(ExtPtfm%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("ExtPtfm%x")) return + allocate(ExtPtfm%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("ExtPtfm%xd")) return + allocate(ExtPtfm%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("ExtPtfm%z")) return + allocate(ExtPtfm%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("ExtPtfm%OtherSt")) return - IF ( p_FAST%CompSub == Module_SD ) THEN + select case (p_FAST%CompSub) - IF ( p_FAST%CompHydro == Module_HD ) THEN - Init%InData_SD%WtrDpth = Init%OutData_SeaSt%WaveField%WtrDpth - ELSE - Init%InData_SD%WtrDpth = 0.0_ReKi - END IF + case (Module_SD) Init%InData_SD%Linearize = p_FAST%Linearize Init%InData_SD%g = p_FAST%Gravity - !Ini%tInData_SD%UseInputFile = .TRUE. Init%InData_SD%SDInputFile = p_FAST%SubFile Init%InData_SD%RootName = p_FAST%OutFileRoot - Init%InData_SD%TP_RefPoint = ED%y%PlatformPtMesh%Position(:,1) ! "Interface point" where loads will be transferred to - Init%InData_SD%SubRotateZ = 0.0 ! Used by driver to rotate structure around z + ! If SoilDyn is enabled + if (p_FAST%CompSoil == Module_SlD) then - CALL SD_Init( Init%InData_SD, SD%Input(1), SD%p, SD%x(STATE_CURR), SD%xd(STATE_CURR), SD%z(STATE_CURR), & - SD%OtherSt(STATE_CURR), SD%y, SD%m, p_FAST%dt_module( MODULE_SD ), Init%OutData_SD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Copy over the soil stiffness matrices + if (allocated(SlD%p%Stiffness)) then + Init%InData_SD%SoilStiffness = SlD%p%Stiffness + endif - p_FAST%ModuleInitialized(Module_SD) = .TRUE. - CALL SetModuleSubstepTime(Module_SD, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Make a copy of the SoilMesh to pass over + if (SlD%Input(INPUT_CURR)%SoilMesh%Initialized) then + call MeshCopy(SrcMesh = SlD%y%SoilMesh, & + DestMesh = Init%InData_SD%SoilMesh, & + CtrlCode = MESH_COUSIN, & + IOS = COMPONENT_OUTPUT, & + ErrStat = ErrStat2, & + ErrMess = ErrMsg2) + endif + endif - allocate( y_FAST%Lin%Modules(MODULE_SD)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(SD).", ErrStat, ErrMsg, RoutineName ) + ! Set the water depth + if (p_FAST%CompHydro == Module_HD) then + Init%InData_SD%WtrDpth = Init%OutData_SeaSt%WaveField%WtrDpth else - if (allocated(Init%OutData_SD%LinNames_y)) call move_alloc(Init%OutData_SD%LinNames_y,y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%Names_y) - if (allocated(Init%OutData_SD%LinNames_x)) call move_alloc(Init%OutData_SD%LinNames_x,y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%Names_x) - if (allocated(Init%OutData_SD%LinNames_u)) call move_alloc(Init%OutData_SD%LinNames_u,y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%Names_u) - if (allocated(Init%OutData_SD%RotFrame_y)) call move_alloc(Init%OutData_SD%RotFrame_y,y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%RotFrame_y) - if (allocated(Init%OutData_SD%RotFrame_x)) call move_alloc(Init%OutData_SD%RotFrame_x,y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%RotFrame_x) - if (allocated(Init%OutData_SD%RotFrame_u)) call move_alloc(Init%OutData_SD%RotFrame_u,y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%RotFrame_u) - if (allocated(Init%OutData_SD%IsLoad_u )) call move_alloc(Init%OutData_SD%IsLoad_u ,y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%IsLoad_u ) - if (allocated(Init%OutData_SD%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%NumOutputs = size(Init%OutData_SD%WriteOutputHdr) - if (allocated(Init%OutData_SD%DerivOrder_x)) call move_alloc(Init%OutData_SD%DerivOrder_x,y_FAST%Lin%Modules(MODULE_SD)%Instance(1)%DerivOrder_x) + Init%InData_SD%WtrDpth = 0.0_ReKi end if + + ! Used by driver to rotate structure around z + Init%InData_SD%SubRotateZ = 0.0 + + ! "Interface points" where loads and motion will be transferred to and from + Init%InData_SD%nTP = p_FAST%NRotors + call AllocAry(Init%InData_SD%TP_RefPoint, 3, p_FAST%NRotors, "TP_RefPoint", ErrStat2, ErrMsg2); if (Failed()) return + do iRot = 1, p_FAST%NRotors + Init%InData_SD%TP_RefPoint(:,iRot) = ED%y(iRot)%PlatformPtMesh%Position(:,1) + end do - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN + ! Call module initialization routine + dt_module = p_FAST%DT + CALL SD_Init(Init%InData_SD, SD%Input(1), SD%p, & + SD%x(STATE_CURR), SD%xd(STATE_CURR), & + SD%z(STATE_CURR), SD%OtherSt(STATE_CURR), & + SD%y, SD%m, dt_module, Init%OutData_SD, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Add module to glue code + CALL MV_AddModule(m_Glue%ModData, Module_SD, 'SD', 1, dt_module, p_FAST%DT, & + Init%OutData_SD%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2) + if (Failed()) return + + case (Module_ExtPtfm) Init%InData_ExtPtfm%InputFile = p_FAST%SubFile - Init%InData_ExtPtfm%RootName = trim(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_ExtPtfm)) + Init%InData_ExtPtfm%RootName = trim(p_FAST%OutFileRoot)//'.'//y_FAST%Module_Abrev(Module_ExtPtfm) Init%InData_ExtPtfm%Linearize = p_FAST%Linearize - Init%InData_ExtPtfm%PtfmRefzt = ED%p%PtfmRefzt ! Required + Init%InData_ExtPtfm%PtfmRefxt = ED%p(1)%PtfmRefxt + Init%InData_ExtPtfm%PtfmRefyt = ED%p(1)%PtfmRefyt + Init%InData_ExtPtfm%PtfmRefzt = ED%p(1)%PtfmRefzt ! Required + + ! Call module initialization routine + dt_module = p_FAST%DT + CALL ExtPtfm_Init(Init%InData_ExtPtfm, ExtPtfm%Input(1), ExtPtfm%p, & + ExtPtfm%x(STATE_CURR), ExtPtfm%xd(STATE_CURR), & + ExtPtfm%z(STATE_CURR), ExtPtfm%OtherSt(STATE_CURR), & + ExtPtfm%y, ExtPtfm%m, dt_module, Init%OutData_ExtPtfm, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Add module to glue code + CALL MV_AddModule(m_Glue%ModData, MODULE_ExtPtfm, 'ExtPtfm', 1, dt_module, p_FAST%DT, & + Init%OutData_ExtPtfm%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2) + if (Failed()) return + + end select - CALL ExtPtfm_Init( Init%InData_ExtPtfm, ExtPtfm%Input(1), ExtPtfm%p, & - ExtPtfm%x(STATE_CURR), ExtPtfm%xd(STATE_CURR), ExtPtfm%z(STATE_CURR), ExtPtfm%OtherSt(STATE_CURR), & - ExtPtfm%y, ExtPtfm%m, p_FAST%dt_module( MODULE_ExtPtfm ), Init%OutData_ExtPtfm, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + !---------------------------------------------------------------------------- + ! CompHydro (HydroDyn) + !---------------------------------------------------------------------------- - p_FAST%ModuleInitialized(MODULE_ExtPtfm) = .TRUE. - CALL SetModuleSubstepTime(MODULE_ExtPtfm, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Allocate module data arrays + allocate(HD%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("HD%Input")) return + allocate(HD%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("HD%InputTimes")) return + allocate(HD%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("HD%x")) return + allocate(HD%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("HD%xd")) return + allocate(HD%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("HD%z")) return + allocate(HD%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("HD%OtherSt")) return + + IF (p_FAST%CompHydro == Module_HD) THEN + + Init%InData_HD%Gravity = p_FAST%Gravity + Init%InData_HD%UseInputFile = .TRUE. + Init%InData_HD%InputFile = p_FAST%HydroFile + Init%InData_HD%OutRootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_HD)) + Init%InData_HD%TMax = p_FAST%TMax + Init%InData_HD%Linearize = p_FAST%Linearize - allocate( y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(ExtPtfm).", ErrStat, ErrMsg, RoutineName ) + ! Initial platform position; PlatformPos(1:3) is effectively the initial position of the HD origin + if ( p_FAST%CompSub == Module_SD ) then + if ( Init%OutData_SD%IsFloating ) then + if ( Init%OutData_SD%SDHasRBDoF ) then + Init%InData_HD%PlatformPos = Init%OutData_SD%PlatformPos + else + Init%InData_HD%PlatformPos = Init%OutData_ED(1)%PlatformPos + end if + else + Init%InData_HD%PlatformPos = 0.0 + endif else - if (allocated(Init%OutData_ExtPtfm%LinNames_y)) call move_alloc(Init%OutData_ExtPtfm%LinNames_y,y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1)%Names_y) - if (allocated(Init%OutData_ExtPtfm%LinNames_x)) call move_alloc(Init%OutData_ExtPtfm%LinNames_x,y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1)%Names_x) - if (allocated(Init%OutData_ExtPtfm%LinNames_u)) call move_alloc(Init%OutData_ExtPtfm%LinNames_u,y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1)%Names_u) - if (allocated(Init%OutData_ExtPtfm%RotFrame_y)) call move_alloc(Init%OutData_ExtPtfm%RotFrame_y,y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1)%RotFrame_y) - if (allocated(Init%OutData_ExtPtfm%RotFrame_x)) call move_alloc(Init%OutData_ExtPtfm%RotFrame_x,y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1)%RotFrame_x) - if (allocated(Init%OutData_ExtPtfm%RotFrame_u)) call move_alloc(Init%OutData_ExtPtfm%RotFrame_u,y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1)%RotFrame_u) - if (allocated(Init%OutData_ExtPtfm%IsLoad_u )) call move_alloc(Init%OutData_ExtPtfm%IsLoad_u ,y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1)%IsLoad_u ) - if (allocated(Init%OutData_ExtPtfm%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1)%NumOutputs = size(Init%OutData_ExtPtfm%WriteOutputHdr) - if (allocated(Init%OutData_ExtPtfm%DerivOrder_x)) call move_alloc(Init%OutData_ExtPtfm%DerivOrder_x,y_FAST%Lin%Modules(MODULE_ExtPtfm)%Instance(1)%DerivOrder_x) + Init%InData_HD%PlatformPos = Init%OutData_ED(1)%PlatformPos end if - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + ! If VTK output requested, set VisMeshes to true + if (p_FAST%WrVTK /= VTK_None) Init%InData_HD%VisMeshes = .true. + + ! Set information from SeaState + Init%InData_HD%InvalidWithSSExctn = Init%OutData_SeaSt%InvalidWithSSExctn + Init%InData_HD%WaveField => Init%OutData_SeaSt%WaveField + + ! Call module initialization routine + dt_module = p_FAST%DT + CALL HydroDyn_Init(Init%InData_HD, HD%Input(1), HD%p, & + HD%x(STATE_CURR), HD%xd(STATE_CURR), & + HD%z(STATE_CURR), HD%OtherSt(STATE_CURR), & + HD%y, HD%m, dt_module, Init%OutData_HD, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Add module + CALL MV_AddModule(m_Glue%ModData, Module_HD, 'HD', 1, dt_module, p_FAST%DT, & + Init%OutData_HD%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2) + if (Failed()) return - END IF + END IF ! CompHydro - ! ------------------------------ - ! initialize CompMooring modules - ! ------------------------------ - ALLOCATE( MAPp%Input( p_FAST%InterpOrder+1 ), MAPp%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating MAPp%Input and MAPp%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - ALLOCATE( MAPp%Input_Saved( p_FAST%InterpOrder+1 ), MAPp%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating MAPp%Input_Saved and MAPp%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - ALLOCATE( MD%Input( p_FAST%InterpOrder+1 ), MD%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating MD%Input and MD%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - ALLOCATE( MD%Input_Saved( p_FAST%InterpOrder+1 ), MD%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating MD%Input_Saved and MD%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - ALLOCATE( FEAM%Input( p_FAST%InterpOrder+1 ), FEAM%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating FEAM%Input and FEAM%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - ALLOCATE( FEAM%Input_Saved( p_FAST%InterpOrder+1 ), FEAM%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating FEAM%Input_Saved and FEAM%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - ALLOCATE( Orca%Input( p_FAST%InterpOrder+1 ), Orca%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating Orca%Input and Orca%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - ALLOCATE( Orca%Input_Saved( p_FAST%InterpOrder+1 ), Orca%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating Orca%Input_Saved and Orca%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + !---------------------------------------------------------------------------- + ! CompMooring + !---------------------------------------------------------------------------- + + ! Allocate module data arrays + allocate(MAPp%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("MAPp%Input")) return + allocate(MAPp%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("MAPp%InputTimes")) return + allocate(MAPp%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("MAPp%x")) return + allocate(MAPp%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("MAPp%xd")) return + allocate(MAPp%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("MAPp%z")) return + + ! Allocate module data arrays + allocate(MD%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("MD%Input")) return + allocate(MD%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("MD%InputTimes")) return + allocate(MD%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("MD%x")) return + allocate(MD%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("MD%xd")) return + allocate(MD%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("MD%z")) return + allocate(MD%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("MD%OtherSt")) return + + ! Allocate module data arrays + allocate(FEAM%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("FEAM%Input")) return + allocate(FEAM%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("FEAM%InputTimes")) return + allocate(FEAM%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("FEAM%x")) return + allocate(FEAM%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("FEAM%xd")) return + allocate(FEAM%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("FEAM%z")) return + allocate(FEAM%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("FEAM%OtherSt")) return + + ! Allocate module data arrays + allocate(Orca%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("Orca%Input")) return + allocate(Orca%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("Orca%InputTimes")) return + allocate(Orca%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("Orca%x")) return + allocate(Orca%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("Orca%xd")) return + allocate(Orca%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("Orca%z")) return + allocate(Orca%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("Orca%OtherSt")) return + + + select case (p_FAST%CompMooring) + + case (Module_MAP) - ! ........................ - ! initialize MAP - ! ........................ - IF (p_FAST%CompMooring == Module_MAP) THEN !bjj: until we modify this, MAP requires HydroDyn to be used. (perhaps we could send air density from AeroDyn or something...) CALL WrScr(NewLine) !bjj: I'm printing two blank lines here because MAP seems to be writing over the last line on the screen. -! Init%InData_MAP%rootname = p_FAST%OutFileRoot ! Output file name - Init%InData_MAP%gravity = p_FAST%Gravity ! This need to be according to g from driver + ! Init%InData_MAP%rootname = p_FAST%OutFileRoot ! Output file name + Init%InData_MAP%gravity = p_FAST%Gravity ! This need to be according to g from driver Init%InData_MAP%sea_density = Init%OutData_SeaSt%WaveField%WtrDens ! This needs to be set according to seawater density in SeaState - ! differences for MAP++ + ! differences for MAP++ Init%InData_MAP%file_name = p_FAST%MooringFile ! This needs to be set according to what is in the FAST input file. Init%InData_MAP%summary_file_name = TRIM(p_FAST%OutFileRoot)//'.MAP.sum' ! Output file name Init%InData_MAP%depth = -Init%OutData_SeaSt%WaveField%WtrDpth ! This need to be set according to the water depth in SeaState - Init%InData_MAP%LinInitInp%Linearize = p_FAST%Linearize - - CALL MAP_Init( Init%InData_MAP, MAPp%Input(1), MAPp%p, MAPp%x(STATE_CURR), MAPp%xd(STATE_CURR), MAPp%z(STATE_CURR), MAPp%OtherSt, & - MAPp%y, p_FAST%dt_module( MODULE_MAP ), Init%OutData_MAP, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + Init%InData_MAP%Linearize = p_FAST%Linearize - p_FAST%ModuleInitialized(Module_MAP) = .TRUE. - CALL SetModuleSubstepTime(Module_MAP, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - allocate( y_FAST%Lin%Modules(Module_MAP)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(MAP).", ErrStat, ErrMsg, RoutineName ) - else - if (allocated(Init%OutData_MAP%LinInitOut%LinNames_y)) call move_alloc(Init%OutData_MAP%LinInitOut%LinNames_y,y_FAST%Lin%Modules(Module_MAP)%Instance(1)%Names_y ) - if (allocated(Init%OutData_MAP%LinInitOut%LinNames_u)) call move_alloc(Init%OutData_MAP%LinInitOut%LinNames_u,y_FAST%Lin%Modules(Module_MAP)%Instance(1)%Names_u ) - if (allocated(Init%OutData_MAP%LinInitOut%IsLoad_u )) call move_alloc(Init%OutData_MAP%LinInitOut%IsLoad_u ,y_FAST%Lin%Modules(Module_MAP)%Instance(1)%IsLoad_u ) + ! Initialize module + dt_module = p_FAST%DT + CALL MAP_Init(Init%InData_MAP, MAPp%Input(1), MAPp%p, & + MAPp%x(STATE_CURR), MAPp%xd(STATE_CURR), & + MAPp%z(STATE_CURR), MAPp%OtherSt, & + MAPp%y, MAPp%m, dt_module, Init%OutData_MAP, ErrStat2, ErrMsg2) + if (Failed()) return - if (allocated(Init%OutData_MAP%WriteOutputHdr)) y_FAST%Lin%Modules(Module_MAP)%Instance(1)%NumOutputs = size(Init%OutData_MAP%WriteOutputHdr) - end if + ! Add module to glue code + CALL MV_AddModule(m_Glue%ModData, Module_MAP, 'MAP', 1, dt_module, p_FAST%DT, & + Init%OutData_MAP%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2) + if (Failed()) return - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - ! ........................ - ! initialize MoorDyn - ! ........................ - ELSEIF (p_FAST%CompMooring == Module_MD) THEN + case (Module_MD) ! some new allocations needed with version that's compatible with farm-level use - ALLOCATE( Init%InData_MD%PtfmInit(6,1), Init%InData_MD%TurbineRefPos(3,1), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating MoorDyn PtfmInit and TurbineRefPos initialization inputs.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + allocate(Init%InData_MD%PtfmInit (6,1), stat=ErrStat2); if (FailedAlloc("Init%InData_MD%PtfmInit")) return + allocate(Init%InData_MD%TurbineRefPos(3,1), stat=ErrStat2); if (FailedAlloc("Init%InData_MD%TurbineRefPos")) return Init%InData_MD%FileName = p_FAST%MooringFile ! This needs to be set according to what is in the FAST input file. Init%InData_MD%RootName = p_FAST%OutFileRoot @@ -1195,148 +1160,86 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S Init%InData_MD%Tmax = p_FAST%TMax ! expected simulation duration (used by MoorDyn for wave kinematics preprocesing) Init%InData_MD%Linearize = p_FAST%Linearize - if (p_FAST%WrVTK /= VTK_None) Init%InData_MD%VisMeshes=.true. + if (p_FAST%WrVTK /= VTK_None) Init%InData_MD%VisMeshes = .true. ! Assign the seastate pointer here Init%InData_MD%WaveField => Init%OutData_SeaSt%WaveField - CALL MD_Init( Init%InData_MD, MD%Input(1), MD%p, MD%x(STATE_CURR), MD%xd(STATE_CURR), MD%z(STATE_CURR), & - MD%OtherSt(STATE_CURR), MD%y, MD%m, p_FAST%dt_module( MODULE_MD ), Init%OutData_MD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Call module initialization routine + dt_module = p_FAST%DT + CALL MD_Init(Init%InData_MD, MD%Input(INPUT_CURR), MD%p, & + MD%x(STATE_CURR), MD%xd(STATE_CURR), & + MD%z(STATE_CURR), MD%OtherSt(STATE_CURR), & + MD%y, MD%m, dt_module, Init%OutData_MD, ErrStat2, ErrMsg2 ) + if (Failed()) return - p_FAST%ModuleInitialized(Module_MD) = .TRUE. - CALL SetModuleSubstepTime(Module_MD, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Add module to glue code + CALL MV_AddModule(m_Glue%ModData, Module_MD, 'MD', 1, dt_module, p_FAST%DT, & + Init%OutData_MD%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2) + if (Failed()) return - allocate( y_FAST%Lin%Modules(MODULE_MD)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(MD).", ErrStat, ErrMsg, RoutineName ) - else - if (allocated(Init%OutData_MD%LinNames_y)) call move_alloc(Init%OutData_MD%LinNames_y,y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%Names_y) - if (allocated(Init%OutData_MD%LinNames_x)) call move_alloc(Init%OutData_MD%LinNames_x,y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%Names_x) - if (allocated(Init%OutData_MD%LinNames_u)) call move_alloc(Init%OutData_MD%LinNames_u,y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%Names_u) - if (allocated(Init%OutData_MD%RotFrame_y)) call move_alloc(Init%OutData_MD%RotFrame_y,y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%RotFrame_y) - if (allocated(Init%OutData_MD%RotFrame_x)) call move_alloc(Init%OutData_MD%RotFrame_x,y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%RotFrame_x) - if (allocated(Init%OutData_MD%RotFrame_u)) call move_alloc(Init%OutData_MD%RotFrame_u,y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%RotFrame_u) - if (allocated(Init%OutData_MD%IsLoad_u )) call move_alloc(Init%OutData_MD%IsLoad_u ,y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%IsLoad_u ) - if (allocated(Init%OutData_MD%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%NumOutputs = size(Init%OutData_MD%WriteOutputHdr) - if (allocated(Init%OutData_MD%DerivOrder_x)) call move_alloc(Init%OutData_MD%DerivOrder_x,y_FAST%Lin%Modules(MODULE_MD)%Instance(1)%DerivOrder_x) - end if - - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - ! ........................ - ! initialize FEAM - ! ........................ - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN + case (Module_FEAM) Init%InData_FEAM%InputFile = p_FAST%MooringFile ! This needs to be set according to what is in the FAST input file. Init%InData_FEAM%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_FEAM)) - Init%InData_FEAM%PtfmInit = Init%OutData_ED%PlatformPos !ED%x(STATE_CURR)%QT(1:6) ! initial position of the platform !bjj: this should come from Init%OutData_ED, not x_ED - Init%InData_FEAM%NStepWave = 1 ! an arbitrary number > 0 (to set the size of the wave data, which currently contains all zero values) - Init%InData_FEAM%gravity = p_FAST%Gravity ! This need to be according to g from driver - Init%InData_FEAM%WtrDens = Init%OutData_SeaSt%WaveField%WtrDens ! This needs to be set according to seawater density in SeaState -! Init%InData_FEAM%depth = Init%OutData_SeaSt%WaveField%WtrDpth ! This need to be set according to the water depth in SeaState + Init%InData_FEAM%PtfmInit = Init%OutData_ED(1)%PlatformPos ! ED%x(STATE_CURR)%QT(1:6) ! initial position of the platform !bjj: this should come from Init%OutData_ED, not x_ED + Init%InData_FEAM%NStepWave = 1 ! an arbitrary number > 0 (to set the size of the wave data, which currently contains all zero values) + Init%InData_FEAM%gravity = p_FAST%Gravity ! This need to be according to g from driver + Init%InData_FEAM%WtrDens = Init%OutData_SeaSt%WaveField%WtrDens ! This needs to be set according to seawater density in SeaState + ! Init%InData_FEAM%depth = Init%OutData_SeaSt%WaveField%WtrDpth ! This need to be set according to the water depth in SeaState - CALL FEAM_Init( Init%InData_FEAM, FEAM%Input(1), FEAM%p, FEAM%x(STATE_CURR), FEAM%xd(STATE_CURR), FEAM%z(STATE_CURR), & - FEAM%OtherSt(STATE_CURR), FEAM%y, FEAM%m, p_FAST%dt_module( MODULE_FEAM ), Init%OutData_FEAM, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Call module initialization routine + dt_module = p_FAST%DT + CALL FEAM_Init(Init%InData_FEAM, FEAM%Input(INPUT_CURR), FEAM%p, & + FEAM%x(STATE_CURR), FEAM%xd(STATE_CURR), FEAM%z(STATE_CURR), & + FEAM%OtherSt(STATE_CURR), FEAM%y, FEAM%m, dt_module, & + Init%OutData_FEAM, ErrStat2, ErrMsg2) + if (Failed()) return - p_FAST%ModuleInitialized(Module_FEAM) = .TRUE. - CALL SetModuleSubstepTime(Module_FEAM, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Add module to glue code + CALL MV_AddModule(m_Glue%ModData, Module_FEAM, 'FEAM', 1, dt_module, p_FAST%DT, & + Init%OutData_FEAM%Vars, .false., ErrStat2, ErrMsg2) + if (Failed()) return - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - ! ........................ - ! initialize OrcaFlex Interface - ! ........................ - ELSEIF (p_FAST%CompMooring == Module_Orca) THEN + case (Module_Orca) Init%InData_Orca%InputFile = p_FAST%MooringFile Init%InData_Orca%RootName = p_FAST%OutFileRoot Init%InData_Orca%TMax = p_FAST%TMax - CALL Orca_Init( Init%InData_Orca, Orca%Input(1), Orca%p, Orca%x(STATE_CURR), Orca%xd(STATE_CURR), Orca%z(STATE_CURR), Orca%OtherSt(STATE_CURR), & - Orca%y, Orca%m, p_FAST%dt_module( MODULE_Orca ), Init%OutData_Orca, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - p_FAST%ModuleInitialized(MODULE_Orca) = .TRUE. - CALL SetModuleSubstepTime(MODULE_Orca, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - END IF - - ! ------------------------------ - ! initialize CompIce modules - ! ------------------------------ - ALLOCATE( IceF%Input( p_FAST%InterpOrder+1 ), IceF%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating IceF%Input and IceF%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - ALLOCATE( IceF%Input_Saved( p_FAST%InterpOrder+1 ), IceF%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating IceF%Input_Saved and IceF%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + ! Call module initialization routine + dt_module = p_FAST%DT + CALL Orca_Init(Init%InData_Orca, Orca%Input(INPUT_CURR), Orca%p, & + Orca%x(STATE_CURR), Orca%xd(STATE_CURR), & + Orca%z(STATE_CURR), Orca%OtherSt(STATE_CURR), & + Orca%y, Orca%m, dt_module, Init%OutData_Orca, ErrStat2, ErrMsg2 ) + if (Failed()) return - ! We need this to be allocated (else we have issues passing nonallocated arrays and using the first index of Input(), - ! but we don't need the space of IceD_MaxLegs if we're not using it. - IF ( p_FAST%CompIce /= Module_IceD ) THEN - IceDim = 1 - ELSE - IceDim = IceD_MaxLegs - END IF + ! Add module to glue code + CALL MV_AddModule(m_Glue%ModData, Module_Orca, 'Orca', 1, dt_module, p_FAST%DT, & + Init%OutData_Orca%Vars, .false., ErrStat2, ErrMsg2) + if (Failed()) return - ! because there may be multiple instances of IceDyn, we'll allocate arrays for that here - ! we could allocate these after - ALLOCATE( IceD%Input( p_FAST%InterpOrder+1, IceDim ), IceD%InputTimes( p_FAST%InterpOrder+1, IceDim ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating IceD%Input and IceD%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + END select - ALLOCATE( IceD%Input_Saved( p_FAST%InterpOrder+1, IceDim ), IceD%InputTimes_Saved( p_FAST%InterpOrder+1, IceDim ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating IceD%Input_Saved and IceD%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + !---------------------------------------------------------------------------- + ! CompIce (IceD and IceF) + !---------------------------------------------------------------------------- - ALLOCATE( IceD%x( IceDim,4), & - IceD%xd( IceDim,4), & - IceD%z( IceDim,4), & - IceD%OtherSt( IceDim,4), & - IceD%p( IceDim ), & - IceD%u( IceDim ), & - IceD%y( IceDim ), & - IceD%m( IceDim ), & - STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating IceD state, input, and output data.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + !------------------------------------- + ! Initialize IceFloe + !------------------------------------- + ! Allocate module data arrays + allocate(IceF%Input (InputAryLB:InputAryUB), stat=ErrStat2); if (FailedAlloc("IceF%Input")) return + allocate(IceF%InputTimes (InputAryUB ), stat=ErrStat2); if (FailedAlloc("IceF%InputTimes")) return + allocate(IceF%x (StateAryUB ), stat=ErrStat2); if (FailedAlloc("IceF%x")) return + allocate(IceF%xd (StateAryUB ), stat=ErrStat2); if (FailedAlloc("IceF%xd")) return + allocate(IceF%z (StateAryUB ), stat=ErrStat2); if (FailedAlloc("IceF%z")) return + allocate(IceF%OtherSt (StateAryUB ), stat=ErrStat2); if (FailedAlloc("IceF%OtherSt")) return - ! ........................ - ! initialize IceFloe - ! ........................ - IF ( p_FAST%CompIce == Module_IceF ) THEN + IF (p_FAST%CompIce == Module_IceF) THEN Init%InData_IceF%InputFile = p_FAST%IceFile Init%InData_IceF%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_IceF)) @@ -1344,22 +1247,40 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S Init%InData_IceF%MSL2SWL = Init%OutData_SeaSt%WaveField%MSL2SWL Init%InData_IceF%gravity = p_FAST%Gravity - CALL IceFloe_Init( Init%InData_IceF, IceF%Input(1), IceF%p, IceF%x(STATE_CURR), IceF%xd(STATE_CURR), IceF%z(STATE_CURR), & - IceF%OtherSt(STATE_CURR), IceF%y, IceF%m, p_FAST%dt_module( MODULE_IceF ), Init%OutData_IceF, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Call module initialization routine + dt_module = p_FAST%DT + CALL IceFloe_Init( Init%InData_IceF, IceF%Input(INPUT_CURR), IceF%p, IceF%x(STATE_CURR), IceF%xd(STATE_CURR), IceF%z(STATE_CURR), & + IceF%OtherSt(STATE_CURR), IceF%y, IceF%m, dt_module, Init%OutData_IceF, ErrStat2, ErrMsg2 ) + if (Failed()) return - p_FAST%ModuleInitialized(Module_IceF) = .TRUE. - CALL SetModuleSubstepTime(Module_IceF, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Add module to list of modules + CALL MV_AddModule(m_Glue%ModData, Module_IceF, 'IceF', 1, dt_module, p_FAST%DT, & + Init%OutData_IceF%Vars, .false., ErrStat2, ErrMsg2) + if (Failed()) return - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - ! ........................ - ! initialize IceDyn - ! ........................ - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN + end if + + !------------------------------------- + ! Initialize IceDyn + !------------------------------------- + + ! We need this to be allocated (else we have issues passing nonallocated arrays and using the first index of Input(), + ! but we don't need the space of IceD_MaxLegs if we're not using it. + IceDim = 1 + IF (p_FAST%CompIce == Module_IceD) IceDim = IceD_MaxLegs + + ! Allocate module data arrays + allocate(IceD%Input (InputAryLB:InputAryUB, IceDim ), stat=ErrStat2); if (FailedAlloc("IceD%Input")) return + allocate(IceD%InputTimes (InputAryUB, IceDim ), stat=ErrStat2); if (FailedAlloc("IceD%InputTimes")) return + allocate(IceD%x (IceDim, StateAryUB), stat=ErrStat2); if (FailedAlloc("IceD%x")) return + allocate(IceD%xd (IceDim, StateAryUB), stat=ErrStat2); if (FailedAlloc("IceD%xd")) return + allocate(IceD%z (IceDim, StateAryUB), stat=ErrStat2); if (FailedAlloc("IceD%z")) return + allocate(IceD%OtherSt (IceDim, StateAryUB), stat=ErrStat2); if (FailedAlloc("IceD%OtherSt")) return + allocate(IceD%p (IceDim ), stat=ErrStat2); if (FailedAlloc("IceD%p")) return + allocate(IceD%y (IceDim ), stat=ErrStat2); if (FailedAlloc("IceD%y")) return + allocate(IceD%m (IceDim ), stat=ErrStat2); if (FailedAlloc("IceD%m")) return + + IF (p_FAST%CompIce == Module_IceD) THEN Init%InData_IceD%InputFile = p_FAST%IceFile Init%InData_IceD%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_IceD))//'1' @@ -1369,16 +1290,19 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S Init%InData_IceD%TMax = p_FAST%TMax Init%InData_IceD%LegNum = 1 + ! Call module initialization + dt_module = p_FAST%DT CALL IceD_Init( Init%InData_IceD, IceD%Input(1,1), IceD%p(1), IceD%x(1,STATE_CURR), IceD%xd(1,STATE_CURR), IceD%z(1,STATE_CURR), & - IceD%OtherSt(1,STATE_CURR), IceD%y(1), IceD%m(1), p_FAST%dt_module( MODULE_IceD ), Init%OutData_IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + IceD%OtherSt(1,STATE_CURR), IceD%y(1), IceD%m(1), dt_module, Init%OutData_IceD, ErrStat2, ErrMsg2 ) + if (Failed()) return - p_FAST%ModuleInitialized(Module_IceD) = .TRUE. - CALL SetModuleSubstepTime(Module_IceD, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! Add module to list of modules + CALL MV_AddModule(m_Glue%ModData, Module_IceD, 'IceD', 1, dt_module, p_FAST%DT, & + Init%OutData_IceD%Vars, .false., ErrStat2, ErrMsg2) + if (Failed()) return - ! now initialize IceD for additional legs (if necessary) - dt_IceD = p_FAST%dt_module( MODULE_IceD ) + ! now initialize IceD for additional legs (if necessary) + dt_IceD = dt_module p_FAST%numIceLegs = Init%OutData_IceD%numLegs IF (p_FAST%numIceLegs > IceD_MaxLegs) THEN @@ -1386,330 +1310,277 @@ SUBROUTINE FAST_InitializeAll( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, S //TRIM(Num2LStr(p_FAST%numIceLegs))//' legs were specified.',ErrStat,ErrMsg,RoutineName) END IF + ! Loop through Icelegs + DO i = 2, p_FAST%numIceLegs ! basically, we just need IceDyn to set up its meshes for inputs/outputs and possibly initial values for states - DO i=2,p_FAST%numIceLegs ! basically, we just need IceDyn to set up its meshes for inputs/outputs and possibly initial values for states Init%InData_IceD%LegNum = i Init%InData_IceD%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_IceD))//TRIM(Num2LStr(i)) + ! Call module initialization routine + dt_module = p_FAST%DT CALL IceD_Init( Init%InData_IceD, IceD%Input(1,i), IceD%p(i), IceD%x(i,STATE_CURR), IceD%xd(i,STATE_CURR), IceD%z(i,STATE_CURR), & IceD%OtherSt(i,STATE_CURR), IceD%y(i), IceD%m(i), dt_IceD, Init%OutData_IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + if (Failed()) return !bjj: we're going to force this to have the same timestep because I don't want to have to deal with n IceD modules with n timesteps. - IF (.NOT. EqualRealNos( p_FAST%dt_module( MODULE_IceD ),dt_IceD )) THEN + IF (.NOT. EqualRealNos(dt_module, dt_IceD)) THEN CALL SetErrStat(ErrID_Fatal,"All instances of IceDyn (one per support-structure leg) must be the same",ErrStat,ErrMsg,RoutineName) + return END IF - END DO - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + ! Add module to list of modules + CALL MV_AddModule(m_Glue%ModData, Module_IceD, 'IceD', i, dt_module, p_FAST%DT, & + Init%OutData_IceD%Vars, .false., ErrStat2, ErrMsg2) + if (Failed()) return + END DO END IF - - ! ........................ - ! initialize ServoDyn - ! ........................ - ALLOCATE( SrvD%Input( p_FAST%InterpOrder+1 ), SrvD%InputTimes( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating SrvD%Input and SrvD%InputTimes.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF - - ALLOCATE( SrvD%Input_Saved( p_FAST%InterpOrder+1 ), SrvD%InputTimes_Saved( p_FAST%InterpOrder+1 ), STAT = ErrStat2 ) - IF (ErrStat2 /= 0) THEN - CALL SetErrStat(ErrID_Fatal,"Error allocating SrvD%Input_Saved and SrvD%InputTimes_Saved.",ErrStat,ErrMsg,RoutineName) - CALL Cleanup() - RETURN - END IF + !---------------------------------------------------------------------------- + ! CompServo (ServoDyn) + !---------------------------------------------------------------------------- + + ! Allocate module data arrays + allocate(SrvD%Input (InputAryLB:InputAryUB, p_FAST%NRotors), stat=ErrStat2); if (FailedAlloc("SrvD%Input")) return + allocate(SrvD%InputTimes (InputAryUB, p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("SrvD%InputTimes")) return + allocate(SrvD%x (p_FAST%NRotors, StateAryUB ), stat=ErrStat2); if (FailedAlloc("SrvD%x")) return + allocate(SrvD%xd (p_FAST%NRotors, StateAryUB ), stat=ErrStat2); if (FailedAlloc("SrvD%xd")) return + allocate(SrvD%z (p_FAST%NRotors, StateAryUB ), stat=ErrStat2); if (FailedAlloc("SrvD%z")) return + allocate(SrvD%OtherSt (p_FAST%NRotors, StateAryUB ), stat=ErrStat2); if (FailedAlloc("SrvD%OtherSt")) return + allocate(SrvD%p (p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("SrvD%p")) return + allocate(SrvD%y (p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("SrvD%y")) return + allocate(SrvD%m (p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("SrvD%m")) return + allocate(Init%OutData_SrvD(p_FAST%NRotors ), stat=ErrStat2); if (FailedAlloc("Init%OutData_SrvD")) return IF ( p_FAST%CompServo == Module_SrvD ) THEN - Init%InData_SrvD%InputFile = p_FAST%ServoFile - Init%InData_SrvD%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_SrvD)) - Init%InData_SrvD%NumBl = NumBl - Init%InData_SrvD%Gravity = (/ 0.0_ReKi, 0.0_ReKi, -p_FAST%Gravity /) ! "Gravitational acceleration vector" m/s^2 - - CALL AllocAry(Init%InData_SrvD%BlPitchInit, NumBl, 'BlPitchInit', ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= abortErrLev) then ! make sure allocatable arrays are valid before setting them - CALL Cleanup() - RETURN - end if - - if (p_FAST%CompElast == Module_SED) then - Init%InData_SrvD%NacRefPos(1:3) = SED%y%NacelleMotion%Position(1:3,1) - Init%InData_SrvD%NacTransDisp(1:3) = SED%y%NacelleMotion%TranslationDisp(1:3,1) ! R8Ki - Init%InData_SrvD%NacRefOrient(1:3,1:3) = SED%y%NacelleMotion%RefOrientation(1:3,1:3,1) ! R8Ki - Init%InData_SrvD%NacOrient(1:3,1:3) = SED%y%NacelleMotion%Orientation(1:3,1:3,1) ! R8Ki - Init%InData_SrvD%TwrBaseRefPos = 0.0_ReKi - Init%InData_SrvD%TwrBaseTransDisp = 0.0_R8Ki - Init%InData_SrvD%TwrBaseRefOrient = 0.0_R8Ki - Init%InData_SrvD%TwrBaseOrient = 0.0_R8Ki - Init%InData_SrvD%PtfmRefPos(1:3) = SED%y%PlatformPtMesh%Position(1:3,1) - Init%InData_SrvD%PtfmTransDisp(1:3) = SED%y%PlatformPtMesh%TranslationDisp(1:3,1) ! R8Ki - Init%InData_SrvD%PtfmRefOrient(1:3,1:3)= SED%y%PlatformPtMesh%RefOrientation(1:3,1:3,1) ! R8Ki - Init%InData_SrvD%PtfmOrient(1:3,1:3) = SED%y%PlatformPtMesh%Orientation(1:3,1:3,1) ! R8Ki - Init%InData_SrvD%RotSpeedRef = Init%OutData_SED%RotSpeed - Init%InData_SrvD%BlPitchInit = Init%OutData_SED%BlPitch - else - Init%InData_SrvD%NacRefPos(1:3) = ED%y%NacelleMotion%Position(1:3,1) - Init%InData_SrvD%NacTransDisp(1:3) = ED%y%NacelleMotion%TranslationDisp(1:3,1) ! R8Ki - Init%InData_SrvD%NacRefOrient(1:3,1:3) = ED%y%NacelleMotion%RefOrientation(1:3,1:3,1) ! R8Ki - Init%InData_SrvD%NacOrient(1:3,1:3) = ED%y%NacelleMotion%Orientation(1:3,1:3,1) ! R8Ki - Init%InData_SrvD%TwrBaseRefPos = Init%OutData_ED%TwrBaseRefPos - Init%InData_SrvD%TwrBaseTransDisp = Init%OutData_ED%TwrBaseTransDisp ! R8Ki - Init%InData_SrvD%TwrBaseRefOrient = Init%OutData_ED%TwrBaseRefOrient ! R8Ki - Init%InData_SrvD%TwrBaseOrient = Init%OutData_ED%TwrBaseOrient ! R8Ki - Init%InData_SrvD%PtfmRefPos(1:3) = ED%y%PlatformPtMesh%Position(1:3,1) - Init%InData_SrvD%PtfmTransDisp(1:3) = ED%y%PlatformPtMesh%TranslationDisp(1:3,1) ! R8Ki - Init%InData_SrvD%PtfmRefOrient(1:3,1:3)= ED%y%PlatformPtMesh%RefOrientation(1:3,1:3,1) ! R8Ki - Init%InData_SrvD%PtfmOrient(1:3,1:3) = ED%y%PlatformPtMesh%Orientation(1:3,1:3,1) ! R8Ki - Init%InData_SrvD%RotSpeedRef = Init%OutData_ED%RotSpeed - Init%InData_SrvD%BlPitchInit = Init%OutData_ED%BlPitch - endif - Init%InData_SrvD%TMax = p_FAST%TMax - Init%InData_SrvD%AirDens = AirDens - Init%InData_SrvD%AvgWindSpeed = Init%OutData_IfW%WindFileInfo%MWS - Init%InData_SrvD%Linearize = p_FAST%Linearize - Init%InData_SrvD%TrimCase = p_FAST%TrimCase - Init%InData_SrvD%TrimGain = p_FAST%TrimGain - Init%InData_SrvD%InterpOrder = p_FAST%InterpOrder - - CALL AllocAry( Init%InData_SrvD%BladeRootRefPos, 3, NumBl, 'Init%InData_SrvD%BladeRootRefPos', errStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL AllocAry( Init%InData_SrvD%BladeRootTransDisp, 3, NumBl, 'Init%InData_SrvD%BladeRootTransDisp', errStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL AllocAry( Init%InData_SrvD%BladeRootRefOrient, 3, 3, NumBl, 'Init%InData_SrvD%BladeRootRefOrient', errStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - CALL AllocAry( Init%InData_SrvD%BladeRootOrient, 3, 3, NumBl, 'Init%InData_SrvD%BladeRootOrient', errStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF - ! Set blade root info -- used for Blade StC. Set from SED even though SED is not compatible -- we won't know - ! if the BStC was used until after calling SrvD_Init. - if (p_FAST%CompElast == Module_SED) then - do k=1,NumBl - Init%InData_SrvD%BladeRootRefPos(:,k) = SED%y%BladeRootMotion(k)%Position(:,1) - Init%InData_SrvD%BladeRootTransDisp(:,k) = SED%y%BladeRootMotion(k)%TranslationDisp(:,1) - Init%InData_SrvD%BladeRootRefOrient(:,:,k)= SED%y%BladeRootMotion(k)%RefOrientation(:,:,1) - Init%InData_SrvD%BladeRootOrient(:,:,k) = SED%y%BladeRootMotion(k)%Orientation(:,:,1) - enddo - else - do k=1,NumBl - Init%InData_SrvD%BladeRootRefPos(:,k) = ED%y%BladeRootMotion(k)%Position(:,1) - Init%InData_SrvD%BladeRootTransDisp(:,k) = ED%y%BladeRootMotion(k)%TranslationDisp(:,1) - Init%InData_SrvD%BladeRootRefOrient(:,:,k)= ED%y%BladeRootMotion(k)%RefOrientation(:,:,1) - Init%InData_SrvD%BladeRootOrient(:,:,k) = ED%y%BladeRootMotion(k)%Orientation(:,:,1) - enddo - endif - - - - IF ( p_FAST%CompInflow == Module_IfW ) THEN ! assign the number of gates to ServD - Init%InData_SrvD%SensorType = IfW%p%lidar%SensorType - Init%InData_SrvD%NumBeam = IfW%p%lidar%NumBeam - Init%InData_SrvD%NumPulseGate = IfW%p%lidar%NumPulseGate - else - Init%InData_SrvD%SensorType = 0 - Init%InData_SrvD%NumBeam = 0 - Init%InData_SrvD%NumPulseGate = 0 - END IF - - - ! Set cable controls inputs (if requested by other modules) -- There is probably a nicer way to do this, but this will work for now. - call SetSrvDCableControls() - - CALL SrvD_Init( Init%InData_SrvD, SrvD%Input(1), SrvD%p, SrvD%x(STATE_CURR), SrvD%xd(STATE_CURR), SrvD%z(STATE_CURR), & - SrvD%OtherSt(STATE_CURR), SrvD%y, SrvD%m, p_FAST%dt_module( MODULE_SrvD ), Init%OutData_SrvD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - p_FAST%ModuleInitialized(Module_SrvD) = .TRUE. + ! Loop through the number of rotors + do iRot = 1, p_FAST%NRotors + + Init%InData_SrvD%InputFile = p_FAST%ServoFile(iRot) + Init%InData_SrvD%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_SrvD)) + Init%InData_SrvD%TightED = (p_FAST%ModCoupling == TightCouplingFixed) .or. (p_FAST%ModCoupling == TightCouplingAdaptive) + Init%InData_SrvD%NumBl = p_FAST%RotNumBld(iRot) + Init%InData_SrvD%Gravity = [0.0_ReKi, 0.0_ReKi, -p_FAST%Gravity] ! "Gravitational acceleration vector" m/s^2 + Init%InData_SrvD%TMax = p_FAST%TMax + Init%InData_SrvD%AirDens = AirDens + Init%InData_SrvD%AvgWindSpeed = Init%OutData_IfW%WindFileInfo%MWS + Init%InData_SrvD%Linearize = p_FAST%Linearize + Init%InData_SrvD%TrimCase = p_FAST%TrimCase + Init%InData_SrvD%TrimGain = p_FAST%TrimGain + Init%InData_SrvD%InterpOrder = p_FAST%InterpOrder + + if (allocated(Init%InData_SrvD%BlPitchInit)) deallocate(Init%InData_SrvD%BlPitchInit) + if (allocated(Init%InData_SrvD%BladeRootRefPos)) deallocate(Init%InData_SrvD%BladeRootRefPos) + if (allocated(Init%InData_SrvD%BladeRootTransDisp)) deallocate(Init%InData_SrvD%BladeRootTransDisp) + if (allocated(Init%InData_SrvD%BladeRootRefOrient)) deallocate(Init%InData_SrvD%BladeRootRefOrient) + if (allocated(Init%InData_SrvD%BladeRootOrient)) deallocate(Init%InData_SrvD%BladeRootOrient) + + call AllocAry(Init%InData_SrvD%BlPitchInit, p_FAST%RotNumBld(iRot), 'Init%InData_SrvD%BlPitchInit', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Init%InData_SrvD%BladeRootRefPos, 3, p_FAST%RotNumBld(iRot), 'Init%InData_SrvD%BladeRootRefPos', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Init%InData_SrvD%BladeRootTransDisp, 3, p_FAST%RotNumBld(iRot), 'Init%InData_SrvD%BladeRootTransDisp', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Init%InData_SrvD%BladeRootRefOrient, 3, 3, p_FAST%RotNumBld(iRot), 'Init%InData_SrvD%BladeRootRefOrient', ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(Init%InData_SrvD%BladeRootOrient, 3, 3, p_FAST%RotNumBld(iRot), 'Init%InData_SrvD%BladeRootOrient', ErrStat2, ErrMsg2); if (Failed()) return + + if (p_FAST%CompElast == Module_SED) then + Init%InData_SrvD%NacRefPos(1:3) = SED%y%NacelleMotion%Position(1:3,1) + Init%InData_SrvD%NacTransDisp(1:3) = SED%y%NacelleMotion%TranslationDisp(1:3,1) ! R8Ki + Init%InData_SrvD%NacRefOrient(1:3,1:3) = SED%y%NacelleMotion%RefOrientation(1:3,1:3,1) ! R8Ki + Init%InData_SrvD%NacOrient(1:3,1:3) = SED%y%NacelleMotion%Orientation(1:3,1:3,1) ! R8Ki + Init%InData_SrvD%TwrBaseRefPos = 0.0_ReKi + Init%InData_SrvD%TwrBaseTransDisp = 0.0_R8Ki + Init%InData_SrvD%TwrBaseRefOrient = 0.0_R8Ki + Init%InData_SrvD%TwrBaseOrient = 0.0_R8Ki + Init%InData_SrvD%PtfmRefPos(1:3) = SED%y%PlatformPtMesh%Position(1:3,1) + Init%InData_SrvD%PtfmTransDisp(1:3) = SED%y%PlatformPtMesh%TranslationDisp(1:3,1) ! R8Ki + Init%InData_SrvD%PtfmRefOrient(1:3,1:3)= SED%y%PlatformPtMesh%RefOrientation(1:3,1:3,1) ! R8Ki + Init%InData_SrvD%PtfmOrient(1:3,1:3) = SED%y%PlatformPtMesh%Orientation(1:3,1:3,1) ! R8Ki + Init%InData_SrvD%RotSpeedRef = Init%OutData_SED%RotSpeed + Init%InData_SrvD%BlPitchInit = Init%OutData_SED%BlPitch + else + Init%InData_SrvD%NacRefPos(1:3) = ED%y(iRot)%NacelleMotion%Position(1:3,1) + Init%InData_SrvD%NacTransDisp(1:3) = ED%y(iRot)%NacelleMotion%TranslationDisp(1:3,1) ! R8Ki + Init%InData_SrvD%NacRefOrient(1:3,1:3) = ED%y(iRot)%NacelleMotion%RefOrientation(1:3,1:3,1) ! R8Ki + Init%InData_SrvD%NacOrient(1:3,1:3) = ED%y(iRot)%NacelleMotion%Orientation(1:3,1:3,1) ! R8Ki + Init%InData_SrvD%TwrBaseRefPos = Init%OutData_ED(iRot)%TwrBaseRefPos + Init%InData_SrvD%TwrBaseTransDisp = Init%OutData_ED(iRot)%TwrBaseTransDisp ! R8Ki + Init%InData_SrvD%TwrBaseRefOrient = Init%OutData_ED(iRot)%TwrBaseRefOrient ! R8Ki + Init%InData_SrvD%TwrBaseOrient = Init%OutData_ED(iRot)%TwrBaseOrient ! R8Ki + Init%InData_SrvD%PtfmRefPos(1:3) = ED%y(iRot)%PlatformPtMesh%Position(1:3,1) + Init%InData_SrvD%PtfmTransDisp(1:3) = ED%y(iRot)%PlatformPtMesh%TranslationDisp(1:3,1) ! R8Ki + Init%InData_SrvD%PtfmRefOrient(1:3,1:3)= ED%y(iRot)%PlatformPtMesh%RefOrientation(1:3,1:3,1) ! R8Ki + Init%InData_SrvD%PtfmOrient(1:3,1:3) = ED%y(iRot)%PlatformPtMesh%Orientation(1:3,1:3,1) ! R8Ki + Init%InData_SrvD%RotSpeedRef = Init%OutData_ED(iRot)%RotSpeed + Init%InData_SrvD%BlPitchInit = Init%OutData_ED(iRot)%BlPitch + endif - !IF ( Init%OutData_SrvD%CouplingScheme == ExplicitLoose ) THEN ... bjj: abort if we're doing anything else! + ! Set blade root info -- used for Blade StC. Set from SED even though SED is not compatible -- we won't know + ! if the BStC was used until after calling SrvD_Init. + select case (p_FAST%CompElast) + case (Module_SED) + do k = 1, p_FAST%RotNumBld(iRot) + Init%InData_SrvD%BladeRootRefPos(:,k) = SED%y%BladeRootMotion(k)%Position(:,1) + Init%InData_SrvD%BladeRootTransDisp(:,k) = SED%y%BladeRootMotion(k)%TranslationDisp(:,1) + Init%InData_SrvD%BladeRootRefOrient(:,:,k)= SED%y%BladeRootMotion(k)%RefOrientation(:,:,1) + Init%InData_SrvD%BladeRootOrient(:,:,k) = SED%y%BladeRootMotion(k)%Orientation(:,:,1) + end do + case (Module_ED, Module_BD) + do k = 1, p_FAST%RotNumBld(iRot) + Init%InData_SrvD%BladeRootRefPos(:,k) = ED%y(iRot)%BladeRootMotion(k)%Position(:,1) + Init%InData_SrvD%BladeRootTransDisp(:,k) = ED%y(iRot)%BladeRootMotion(k)%TranslationDisp(:,1) + Init%InData_SrvD%BladeRootRefOrient(:,:,k)= ED%y(iRot)%BladeRootMotion(k)%RefOrientation(:,:,1) + Init%InData_SrvD%BladeRootOrient(:,:,k) = ED%y(iRot)%BladeRootMotion(k)%Orientation(:,:,1) + end do + end select - CALL SetModuleSubstepTime(Module_SrvD, p_FAST, y_FAST, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + ! TODO: update for multiple ServoDyn instances + IF ( p_FAST%CompInflow == Module_IfW ) THEN !assign the number of gates to ServD + Init%InData_SrvD%SensorType = IfW%p%lidar%SensorType + Init%InData_SrvD%NumBeam = IfW%p%lidar%NumBeam + Init%InData_SrvD%NumPulseGate = IfW%p%lidar%NumPulseGate + END IF - !! initialize SrvD%y%ElecPwr and SrvD%y%GenTq because they are one timestep different (used as input for the next step)? + ! Set cable controls inputs (if requested by other modules) -- There is probably a nicer way to do this, but this will work for now. + call SetSrvDCableControls() + + ! Call module initialization routine + dt_module = p_FAST%DT + CALL SrvD_Init(Init%InData_SrvD, SrvD%Input(INPUT_CURR, iRot), SrvD%p(iRot), & + SrvD%x(iRot, STATE_CURR), SrvD%xd(iRot, STATE_CURR), & + SrvD%z(iRot, STATE_CURR), SrvD%OtherSt(iRot, STATE_CURR), & + SrvD%y(iRot), SrvD%m(iRot), dt_module, Init%OutData_SrvD(iRot), ErrStat2, ErrMsg2 ) + if (Failed()) return + + IF ( p_FAST%CompInflow == Module_IfW ) THEN ! assign the number of gates to ServD + Init%InData_SrvD%SensorType = IfW%p%lidar%SensorType + Init%InData_SrvD%NumBeam = IfW%p%lidar%NumBeam + Init%InData_SrvD%NumPulseGate = IfW%p%lidar%NumPulseGate + else + Init%InData_SrvD%SensorType = 0 + Init%InData_SrvD%NumBeam = 0 + Init%InData_SrvD%NumPulseGate = 0 + END IF - allocate( y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1), stat=ErrStat2) - if (ErrStat2 /= 0 ) then - call SetErrStat(ErrID_Fatal, "Error allocating Lin%Modules(SrvD).", ErrStat, ErrMsg, RoutineName ) - else - if (allocated(Init%OutData_SrvD%LinNames_y)) call move_alloc(Init%OutData_SrvD%LinNames_y,y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%Names_y ) - if (allocated(Init%OutData_SrvD%LinNames_u)) call move_alloc(Init%OutData_SrvD%LinNames_u,y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%Names_u ) - if (allocated(Init%OutData_SrvD%LinNames_x)) call move_alloc(Init%OutData_SrvD%LinNames_x,y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%Names_x ) - if (allocated(Init%OutData_SrvD%RotFrame_y)) call move_alloc(Init%OutData_SrvD%RotFrame_y,y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%RotFrame_y ) - if (allocated(Init%OutData_SrvD%RotFrame_u)) call move_alloc(Init%OutData_SrvD%RotFrame_u,y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%RotFrame_u ) - if (allocated(Init%OutData_SrvD%RotFrame_x)) call move_alloc(Init%OutData_SrvD%RotFrame_x,y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%RotFrame_x ) - if (allocated(Init%OutData_SrvD%IsLoad_u )) call move_alloc(Init%OutData_SrvD%IsLoad_u ,y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%IsLoad_u ) - if (allocated(Init%OutData_SrvD%DerivOrder_x)) call move_alloc(Init%OutData_SrvD%DerivOrder_x,y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%DerivOrder_x) - - if (allocated(Init%OutData_SrvD%WriteOutputHdr)) y_FAST%Lin%Modules(MODULE_SrvD)%Instance(1)%NumOutputs = size(Init%OutData_SrvD%WriteOutputHdr) - end if + ! Add module to list of modules + CALL MV_AddModule(m_Glue%ModData, Module_SrvD, 'SrvD', iRot, dt_module, p_FAST%DT, & + Init%OutData_SrvD(iRot)%Vars, p_FAST%Linearize, ErrStat2, ErrMsg2, iRotor=iRot) + if (Failed()) return - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - END IF + !! initialize SrvD%y%ElecPwr and SrvD%y%GenTq because they are one timestep different (used as input for the next step)? - ! ........................ - ! some checks for AeroDyn and ElastoDyn inputs with the high-speed shaft brake hack in ElastoDyn: - ! (DO NOT COPY THIS CODE!) - ! ........................ + ! ........................ + ! some checks for AeroDyn and ElastoDyn inputs with the high-speed shaft brake hack in ElastoDyn: + ! (DO NOT COPY THIS CODE!) + ! ........................ + ! bjj: this is a hack to get high-speed shaft braking in FAST v8 + IF ( Init%OutData_SrvD(iRot)%UseHSSBrake ) THEN + IF ( ED%p(iRot)%method == Method_RK4 ) THEN ! bjj: should be using ElastoDyn's Method_ABM4 Method_AB4 parameters + CALL SetErrStat(ErrID_Fatal,'ElastoDyn must use the AB4 or ABM4 integration method to implement high-speed shaft braking.',ErrStat,ErrMsg,RoutineName) + ENDIF + END IF ! Init%OutData_SrvD(iRot)%UseHSSBrake + + ! SED module is not compatible with structural controls + if (p_FAST%CompElast == Module_SED) then + if (allocated(SrvD%Input(INPUT_CURR, iRot)%BStCMotionMesh)) call SetErrStat(ErrID_Fatal,'Blade Structural Controls (BStC) from ServoDyn are not compatible with the Simplified-ElastoDyn module (SED).',ErrStat,ErrMsg,RoutineName) + if (allocated(SrvD%Input(INPUT_CURR, iRot)%NStCMotionMesh)) call SetErrStat(ErrID_Fatal,'Nacelle Structural Controls (NStC) from ServoDyn are not compatible with the Simplified-ElastoDyn module (SED).',ErrStat,ErrMsg,RoutineName) + if (allocated(SrvD%Input(INPUT_CURR, iRot)%TStCMotionMesh)) call SetErrStat(ErrID_Fatal,'Tower Structural Controls (TStC) from ServoDyn are not compatible with the Simplified-ElastoDyn module (SED).',ErrStat,ErrMsg,RoutineName) + if (allocated(SrvD%Input(INPUT_CURR, iRot)%SStCMotionMesh)) call SetErrStat(ErrID_Fatal,'Substructure Structural Controls (SStC) from ServoDyn are not compatible with the Simplified-ElastoDyn module (SED).',ErrStat,ErrMsg,RoutineName) + endif + if (ErrStat >= AbortErrLev) return - IF ( Init%OutData_SrvD%UseHSSBrake ) THEN - IF ( ED%p%method == Method_RK4 ) THEN ! bjj: should be using ElastoDyn's Method_ABM4 Method_AB4 parameters - CALL SetErrStat(ErrID_Fatal,'ElastoDyn must use the AB4 or ABM4 integration method to implement high-speed shaft braking.',ErrStat,ErrMsg,RoutineName) - ENDIF - END IF ! Init%OutData_SrvD%UseHSSBrake - - ! SED module is not compatible with structural controls - if (p_FAST%CompElast == Module_SED) then - if (allocated(SrvD%Input(1)%BStCMotionMesh)) call SetErrStat(ErrID_Fatal,'Blade Structural Controls (BStC) from ServoDyn are not compatable with the Simplified-ElastoDyn module (SED).',ErrStat,ErrMsg,RoutineName) - if (allocated(SrvD%Input(1)%NStCMotionMesh)) call SetErrStat(ErrID_Fatal,'Nacelle Structural Controls (NStC) from ServoDyn are not compatable with the Simplified-ElastoDyn module (SED).',ErrStat,ErrMsg,RoutineName) - if (allocated(SrvD%Input(1)%TStCMotionMesh)) call SetErrStat(ErrID_Fatal,'Tower Structural Controls (TStC) from ServoDyn are not compatable with the Simplified-ElastoDyn module (SED).',ErrStat,ErrMsg,RoutineName) - if (allocated(SrvD%Input(1)%SStCMotionMesh)) call SetErrStat(ErrID_Fatal,'Substructure Structural Controls (SStC) from ServoDyn are not compatable with the Simplified-ElastoDyn module (SED).',ErrStat,ErrMsg,RoutineName) - endif + end do END IF + !---------------------------------------------------------------------------- + ! Set up output for glue code + ! (must be done after all modules are initialized so we have their WriteOutput information) + !---------------------------------------------------------------------------- - ! ........................ - ! Set up output for glue code (must be done after all modules are initialized so we have their WriteOutput information) - ! ........................ + CALL FAST_InitOutput(p_FAST, y_FAST, Init, ErrStat2, ErrMsg2) + if (Failed()) return - CALL FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - - ! ------------------------------------------------------------------------- - ! Initialize mesh-mapping data - ! ------------------------------------------------------------------------- - - CALL InitModuleMappings(p_FAST, ED, SED, BD, AD, ADsk, ExtLd, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - - IF (ErrStat >= AbortErrLev) THEN - CALL Cleanup() - RETURN - ELSEIF (ErrStat /= ErrID_None) THEN - ! a little work-around in case the mesh mapping info messages get too long - CALL WrScr( NewLine//TRIM(ErrMsg)//NewLine ) - ErrStat = ErrID_None - ErrMsg = "" - END IF - - ! ------------------------------------------------------------------------- - ! Initialize for linearization or computing aero maps: - ! ------------------------------------------------------------------------- - if ( p_FAST%Linearize .or. p_FAST%CompAeroMaps) then - ! NOTE: In the following call, we use Init%OutData_AD%BladeProps(1)%NumBlNds as the number of aero nodes on EACH blade, which - ! is consistent with the current AD implementation, but if AD changes this, then it must be handled here, too! - if (p_FAST%CompAero == MODULE_AD) then - call Init_Lin(p_FAST, y_FAST, m_FAST, AD, ED, NumBl, Init%OutData_AD%rotors(1)%BladeProps(1)%NumBlNds, ErrStat2, ErrMsg2) - else - call Init_Lin(p_FAST, y_FAST, m_FAST, AD, ED, NumBl, -1, ErrStat2, ErrMsg2) - endif - call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if (ErrStat >= AbortErrLev) then - call Cleanup() - return - end if - - if (p_FAST%CompAeroMaps) then - p_FAST%SizeJac_Opt1(1) = y_FAST%Lin%Glue%SizeLin(LIN_ContSTATE_COL) + y_FAST%Lin%Glue%SizeLin(LIN_INPUT_COL) - p_FAST%TolerSquared = p_FAST%TolerSquared * (p_FAST%SizeJac_Opt1(1)**2) ! do this calculation here so we don't have to keep dividing by the size of the array later - p_FAST%NumBl_Lin = 1 - else - p_FAST%NumBl_Lin = NumBl - end if - - end if - - - ! ------------------------------------------------------------------------- + !---------------------------------------------------------------------------- ! Initialize data for VTK output - ! ------------------------------------------------------------------------- + !---------------------------------------------------------------------------- + if ( p_FAST%WrVTK > VTK_None ) then - call SetVTKParameters(p_FAST, Init%OutData_ED, Init%OutData_SED, Init%OutData_AD, Init%OutData_SeaSt, Init%OutData_HD, ED, SED, BD, AD, HD, ErrStat2, ErrMsg2) + ! TODO: support multiple ElastoDyns + call SetVTKParameters(p_FAST, Init%OutData_ED(1), Init%OutData_SED, Init%OutData_AD, Init%OutData_SeaSt, Init%OutData_HD, ED, SED, BD, AD, HD, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) end if - ! ------------------------------------------------------------------------- - ! Write initialization data to FAST summary file: - ! ------------------------------------------------------------------------- - if (p_FAST%SumPrint) then - CALL FAST_WrSum( p_FAST, y_FAST, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - endif - - - ! ------------------------------------------------------------------------- - ! other misc variables initialized here: - ! ------------------------------------------------------------------------- + !---------------------------------------------------------------------------- + ! Other misc variables initialized + !---------------------------------------------------------------------------- m_FAST%t_global = t_initial ! Initialize external inputs for first step if ( p_FAST%CompServo == MODULE_SrvD ) then - m_FAST%ExternInput%GenTrq = SrvD%Input(1)%ExternalGenTrq !0.0_ReKi - m_FAST%ExternInput%ElecPwr = SrvD%Input(1)%ExternalElecPwr - m_FAST%ExternInput%YawPosCom = SrvD%Input(1)%ExternalYawPosCom - m_FAST%ExternInput%YawRateCom = SrvD%Input(1)%ExternalYawRateCom - m_FAST%ExternInput%HSSBrFrac = SrvD%Input(1)%ExternalHSSBrFrac - - do i=1,SIZE(SrvD%Input(1)%ExternalBlPitchCom) - m_FAST%ExternInput%BlPitchCom(i) = SrvD%Input(1)%ExternalBlPitchCom(i) + + m_FAST%ExternInput%GenTrq = SrvD%Input(INPUT_CURR,1)%ExternalGenTrq !0.0_ReKi + m_FAST%ExternInput%ElecPwr = SrvD%Input(INPUT_CURR,1)%ExternalElecPwr + m_FAST%ExternInput%YawPosCom = SrvD%Input(INPUT_CURR,1)%ExternalYawPosCom + m_FAST%ExternInput%YawRateCom = SrvD%Input(INPUT_CURR,1)%ExternalYawRateCom + m_FAST%ExternInput%HSSBrFrac = SrvD%Input(INPUT_CURR,1)%ExternalHSSBrFrac + + do i=1,SIZE(SrvD%Input(INPUT_CURR,1)%ExternalBlPitchCom) + m_FAST%ExternInput%BlPitchCom(i) = SrvD%Input(INPUT_CURR,1)%ExternalBlPitchCom(i) end do - do i=1,SIZE(SrvD%Input(1)%ExternalBlAirfoilCom) - m_FAST%ExternInput%BlAirfoilCom(i) = SrvD%Input(1)%ExternalBlAirfoilCom(i) + do i=1,SIZE(SrvD%Input(INPUT_CURR,1)%ExternalBlAirfoilCom) + m_FAST%ExternInput%BlAirfoilCom(i) = SrvD%Input(INPUT_CURR,1)%ExternalBlAirfoilCom(i) end do ! Cable Controls (only 20 channels are passed to simulink, but may be less or more in SrvD) - if (allocated(SrvD%Input(1)%ExternalCableDeltaL)) then - do i=1,min(SIZE(m_FAST%ExternInput%CableDeltaL),SIZE(SrvD%Input(1)%ExternalCableDeltaL)) - m_FAST%ExternInput%CableDeltaL(i) = SrvD%Input(1)%ExternalCableDeltaL(i) + if (allocated(SrvD%Input(INPUT_CURR,1)%ExternalCableDeltaL)) then + do i=1,min(SIZE(m_FAST%ExternInput%CableDeltaL),SIZE(SrvD%Input(INPUT_CURR,1)%ExternalCableDeltaL)) + m_FAST%ExternInput%CableDeltaL(i) = SrvD%Input(INPUT_CURR,1)%ExternalCableDeltaL(i) end do else ! Initialize to zero for consistency m_FAST%ExternInput%CableDeltaL = 0.0_Reki endif - if (allocated(SrvD%Input(1)%ExternalCableDeltaLdot)) then - do i=1,min(SIZE(m_FAST%ExternInput%CableDeltaLdot),SIZE(SrvD%Input(1)%ExternalCableDeltaLdot)) - m_FAST%ExternInput%CableDeltaLdot(i) = SrvD%Input(1)%ExternalCableDeltaLdot(i) + if (allocated(SrvD%Input(INPUT_CURR,1)%ExternalCableDeltaLdot)) then + do i=1,min(SIZE(m_FAST%ExternInput%CableDeltaLdot),SIZE(SrvD%Input(INPUT_CURR,1)%ExternalCableDeltaLdot)) + m_FAST%ExternInput%CableDeltaLdot(i) = SrvD%Input(INPUT_CURR,1)%ExternalCableDeltaLdot(i) end do else ! Initialize to zero for consistency m_FAST%ExternInput%CableDeltaLdot = 0.0_Reki endif end if + !---------------------------------------------------------------------------- + ! Cleanup + !---------------------------------------------------------------------------- + ! Deallocate arrays that are no longer used + CALL Cleanup() +CONTAINS - !............................................................................................................................... - ! Destroy initializion data - !............................................................................................................................... - CALL Cleanup() - -CONTAINS SUBROUTINE Cleanup() - !............................................................................................................................... - ! Destroy initializion data - !............................................................................................................................... - ! We assume that all initializion data points to parameter data, so we just nullify the pointers instead of deallocate - ! data that they point to: + ! Destroy initialization data CALL FAST_DestroyInitData( Init, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) END SUBROUTINE Cleanup + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + if (Failed) call Cleanup() + end function Failed + + logical function FailedAlloc(txt) + character(*), intent(in) :: txt + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, "Could not allocate "//txt, ErrStat, ErrMsg, RoutineName) + call Cleanup() + endif + FailedAlloc = ErrStat >= AbortErrLev + end function FailedAlloc + SUBROUTINE SetSrvDCableControls() ! There is probably a better method for doint this, but this will work for now. Kind of an ugly bit of hacking. Init%InData_SrvD%NumCableControl = 0 @@ -1813,7 +1684,6 @@ END SUBROUTINE FAST_InitializeAll SUBROUTINE FAST_ProgStart(ThisProgVer) TYPE(ProgDesc), INTENT(IN) :: ThisProgVer !< program name/date/version description - TYPE(ProgDesc) :: NewProgVer !< program name/date/version description NewProgVer = ThisProgVer @@ -1821,7 +1691,6 @@ SUBROUTINE FAST_ProgStart(ThisProgVer) NewProgVer%Name = ProgName end if - ! ... Initialize NWTC Library ! sets the pi constants, open console for output, etc... CALL NWTC_Init( ProgNameIN=NewProgVer%Name, EchoLibVer=.FALSE. ) @@ -1960,7 +1829,8 @@ SUBROUTINE FAST_Init( p, m_FAST, y_FAST, t_initial, InputFile, ErrStat, ErrMsg, y_FAST%Module_Ver( Module_Orca )%Name = 'OrcaFlexInterface' y_FAST%Module_Ver( Module_IceF )%Name = 'IceFloe' y_FAST%Module_Ver( Module_IceD )%Name = 'IceDyn' - + y_FAST%Module_Ver( Module_SlD )%Name = 'SoilDyn' + y_FAST%Module_Abrev( Module_Glue ) = 'FAST' y_FAST%Module_Abrev( Module_IfW ) = 'IfW' y_FAST%Module_Abrev( Module_ExtInfw) = 'ExtInfw' @@ -1981,8 +1851,8 @@ SUBROUTINE FAST_Init( p, m_FAST, y_FAST, t_initial, InputFile, ErrStat, ErrMsg, y_FAST%Module_Abrev( Module_Orca ) = 'Orca' y_FAST%Module_Abrev( Module_IceF ) = 'IceF' y_FAST%Module_Abrev( Module_IceD ) = 'IceD' - - p%n_substeps = 1 ! number of substeps for between modules and global/FAST time + y_FAST%Module_Abrev( Module_SlD ) = 'SlD' + p%BD_OutputSibling = .false. !............................................................................................................................... @@ -2028,7 +1898,7 @@ SUBROUTINE FAST_Init( p, m_FAST, y_FAST, t_initial, InputFile, ErrStat, ErrMsg, p%numIceLegs = 0 ! initialize number of support-structure legs in contact with ice (IceDyn will set this later) - p%nBeams = 0 ! initialize number of BeamDyn instances (will be set later) + p%NumBD = 0 ! initialize number of BeamDyn instances (will be set later) p%n_TMax_m1 = CEILING( ( (p%TMax - t_initial) / p%DT ) ) - 1 ! We're going to go from step 0 to n_TMax (thus the -1 here) @@ -2099,6 +1969,11 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) END IF END IF + ! Validate module coupling method + if ((p%ModCoupling < 1) .or. (p%ModCoupling > 3)) then + call SetErrStat( ErrID_Fatal, 'ModCoupling must be 1 (loose), 2 (tight with fixed Jacobian updates), or 3 (tight with automatic Jacobian updates).', ErrStat, ErrMsg, RoutineName) + end if + IF (p%tolerSquared < EPSILON(p%tolerSquared)) THEN CALL SetErrStat( ErrID_Fatal, 'Toler must be larger than sqrt(epsilon).', ErrStat, ErrMsg, RoutineName ) END IF @@ -2133,12 +2008,14 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) IF (p%CompSub == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompSub must be 0 (None), 1 (SubDyn), or 2 (ExtPtfm_MCKF).', ErrStat, ErrMsg, RoutineName ) IF (p%CompMooring == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompMooring must be 0 (None), 1 (MAP), 2 (FEAMooring), 3 (MoorDyn), or 4 (OrcaFlex).', ErrStat, ErrMsg, RoutineName ) IF (p%CompIce == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompIce must be 0 (None) or 1 (IceFloe).', ErrStat, ErrMsg, RoutineName ) + IF (p%CompSoil == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompSoil must be 0 (None) or 1 (coupled to SubDyn).', ErrStat, ErrMsg, RoutineName ) ! NOTE: If future modules consume SeaState data, then their checks should be added to this routine. 12/1/21 GJH if (p%CompHydro == Module_HD .and. p%CompSeaSt == Module_None) then CALL SetErrStat( ErrID_Fatal, 'SeaState must be used when HydroDyn is used. Set CompSeaSt = 1 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) end if + IF (p%CompSoil == Module_Unknown) CALL SetErrStat( ErrID_Fatal, 'CompSoil must be 0 (None) or 1 (coupled to SubDyn).', ErrStat, ErrMsg, RoutineName ) IF (p%CompHydro /= Module_HD) THEN IF (p%CompMooring == Module_MAP) THEN CALL SetErrStat( ErrID_Fatal, 'HydroDyn must be used when MAP is used. Set CompHydro > 0 or CompMooring = 0 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) @@ -2149,7 +2026,7 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) END IF ELSE IF (p%CompMooring == Module_Orca) CALL SetErrStat( ErrID_Fatal, 'HydroDyn cannot be used if OrcaFlex is used. Set CompHydro = 0 or CompMooring < 4 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) - IF (p%CompSub == Module_ExtPtfm) CALL SetErrStat( ErrID_Fatal, 'HydroDyn cannot be used if ExtPtfm_MCKF is used. Set CompHydro = 0 or CompSub < 2 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) + ! IF (p%CompSub == Module_ExtPtfm) CALL SetErrStat( ErrID_Fatal, 'HydroDyn cannot be used if ExtPtfm_MCKF is used. Set CompHydro = 0 or CompSub < 2 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) END IF ! SED cannot be used with certain modules @@ -2175,6 +2052,8 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) IF (p%CompElast == Module_BD .and. p%CompAero == Module_ADsk) CALL SetErrStat( ErrID_Fatal, 'AeroDisk cannot be used when BeamDyn is used. Change CompAero or CompElast in the FAST input file.', ErrStat, ErrMsg, RoutineName ) + IF ((p%CompSoil == Module_SlD) .and. (p%CompSub /= Module_SD)) CALL SetErrStat( ErrID_Fatal, 'SoilDyn cannot be used without SubDyn. Change CompSub or CompSoil in the FAST input file.', ErrStat, ErrMsg, RoutineName ) + ! No method at the moment for getting disk average velocity from ExtInfw if (p%CompAero == Module_ADsk .and. p%CompInflow == MODULE_ExtInfw) call SetErrStat( ErrID_Fatal, 'AeroDisk cannot be used with ExtInflow or the library interface', ErrStat, ErrMsg, RoutineName ) @@ -2184,7 +2063,7 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) IF (p%MHK /= MHK_None .and. p%MHK /= MHK_FixedBottom .and. p%MHK /= MHK_Floating) CALL SetErrStat( ErrID_Fatal, 'MHK switch is invalid. Set MHK to 0, 1, or 2 in the FAST input file.', ErrStat, ErrMsg, RoutineName ) - IF (p%MHK /= MHK_None .and. p%Linearize) CALL SetErrStat( ErrID_Warn, 'Linearization is not fully implemented for an MHK turbine (buoyancy not included in perturbations, and added mass not included anywhere).', ErrStat, ErrMsg, RoutineName ) + ! IF (p%MHK /= MHK_None .and. p%CompSeaSt == Module_SeaSt .and. p%CompInflow /= Module_IfW) CALL SetErrStat( ErrID_Fatal, 'InflowWind must be activated for MHK turbines when SeaState is used.', ErrStat, ErrMsg, RoutineName ) IF (p%Gravity < 0.0_ReKi) CALL SetErrStat( ErrID_Fatal, 'Gravity must not be negative.', ErrStat, ErrMsg, RoutineName ) @@ -2200,6 +2079,14 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) CALL SetErrStat( ErrID_Fatal, 'NumCrctn must be 0 or greater.', ErrStat, ErrMsg, RoutineName ) END IF + if (p%NRotors > 1) then + if (p%CompSub /= Module_SD) then + call SetErrStat(ErrID_Fatal, 'SubDyn must be used when multiple rotors are present. Set CompSub = 1 in the FAST input file.', ErrStat, ErrMsg, RoutineName) + end if + if (p%CompAero /= Module_Unknown .and. p%CompAero /= Module_AD) then + call SetErrStat(ErrID_Fatal, 'AeroDyn must be used when multiple rotors are present. Set CompAero = 2 in the FAST input file.', ErrStat, ErrMsg, RoutineName) + end if + end if if ( p%WrVTK == VTK_Unknown ) then call SetErrStat(ErrID_Fatal, 'WrVTK must be 0 (none), 1 (initialization only), 2 (animation), or 3 (mode shapes).', ErrStat, ErrMsg, RoutineName) @@ -2255,7 +2142,6 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) ! now, make sure we haven't asked for any modules that we can't yet linearize: if (p%CompAero == MODULE_ADsk) call SetErrStat(ErrID_Fatal,'Linearization is not implemented for the AeroDisk module.',ErrStat, ErrMsg, RoutineName) if (p%CompInflow == MODULE_ExtInfw) call SetErrStat(ErrID_Fatal,'Linearization is not implemented for the ExternalInflow coupling.',ErrStat, ErrMsg, RoutineName) - if (p%CompSub /= MODULE_None .and. p%CompSub /= MODULE_SD ) call SetErrStat(ErrID_Fatal,'Linearization is not implemented for the ExtPtfm_MCKF substructure module.',ErrStat, ErrMsg, RoutineName) if (p%CompMooring /= MODULE_None .and. p%CompMooring == MODULE_FEAM) call SetErrStat(ErrID_Fatal,'Linearization is not implemented for the FEAMooring mooring module.',ErrStat, ErrMsg, RoutineName) if (p%CompIce /= MODULE_None) call SetErrStat(ErrID_Fatal,'Linearization is not implemented for any of the ice loading modules.',ErrStat, ErrMsg, RoutineName) @@ -2299,28 +2185,23 @@ END SUBROUTINE ValidateInputData !> This routine initializes the output for the glue code, including writing the header for the primary output file. SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) - IMPLICIT NONE - - ! Passed variables - TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType), INTENT(INOUT) :: y_FAST !< Glue-code simulation outputs - TYPE(FAST_InitData), INTENT(IN) :: Init !< Initialization data for all modules - - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message corresponding to ErrStat - - - ! Local variables. - - INTEGER(IntKi) :: I, J ! Generic index for DO loops. - INTEGER(IntKi) :: indxNext ! The index of the next value to be written to an array - INTEGER(IntKi) :: NumOuts ! number of channels to be written to the output file(s) + TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters + TYPE(FAST_OutputFileType), INTENT(INOUT) :: y_FAST !< Glue-code simulation outputs + TYPE(FAST_InitData), INTENT(IN) :: Init !< Initialization data for all modules + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message corresponding to ErrStat + INTEGER(IntKi) :: i, j, K ! Generic index for DO loops. + INTEGER(IntKi) :: iRot ! Rotor index for DO loops. + INTEGER(IntKi) :: indxNext ! The index of the next value to be written to an array + INTEGER(IntKi) :: NumOuts ! number of channels to be written to the output file(s) + character(10) :: Prefix ! Output header prefix !...................................................... ! Set the description lines to be printed in the output file !...................................................... + y_FAST%FileDescLines(1) = 'Predictions were generated on '//CurDate()//' at '//CurTime()//' using '//TRIM(GetVersion(FAST_Ver, Cmpl4SFun, Cmpl4LV)) y_FAST%FileDescLines(2) = 'linked with ' //' '//TRIM(GetNVD(NWTC_Ver )) ! we'll get the rest of the linked modules in the section below y_FAST%FileDescLines(3) = 'Description from the FAST input file: '//TRIM(p_FAST%FTitle) @@ -2334,7 +2215,7 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) y_FAST%Module_Ver( Module_SED ) = Init%OutData_SED%Ver y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_SED ) )) ELSE - y_FAST%Module_Ver( Module_ED ) = Init%OutData_ED%Ver + y_FAST%Module_Ver( Module_ED ) = Init%OutData_ED(1)%Ver y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_ED ) )) END IF @@ -2361,7 +2242,7 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) END IF IF ( p_FAST%CompServo == Module_SrvD ) THEN - y_FAST%Module_Ver( Module_SrvD ) = Init%OutData_SrvD%Ver + y_FAST%Module_Ver( Module_SrvD ) = Init%OutData_SrvD(1)%Ver y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_SrvD ))) END IF @@ -2402,7 +2283,12 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_IceF ))) ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN y_FAST%Module_Ver( Module_IceD ) = Init%OutData_IceD%Ver - y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_IceD ))) + y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_IceD ))) + END IF + + IF ( p_FAST%CompSoil == Module_SlD ) THEN + y_FAST%Module_Ver( Module_SlD ) = Init%OutData_SlD%Ver + y_FAST%FileDescLines(2) = TRIM(y_FAST%FileDescLines(2) ) //'; '//TRIM(GetNVD(y_FAST%Module_Ver( Module_SlD ))) END IF !...................................................... @@ -2410,29 +2296,41 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) !...................................................... y_FAST%numOuts = 0 ! Initialize entire array - IF ( ALLOCATED( Init%OutData_IfW%WriteOutputHdr ) ) y_FAST%numOuts(Module_IfW) = SIZE(Init%OutData_IfW%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_ExtInfw%WriteOutputHdr ) ) y_FAST%numOuts(Module_ExtInfw) = SIZE(Init%OutData_ExtInfw%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_ED%WriteOutputHdr ) ) y_FAST%numOuts(Module_ED) = SIZE(Init%OutData_ED%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_SED%WriteOutputHdr ) ) y_FAST%numOuts(Module_SED) = SIZE(Init%OutData_SED%WriteOutputHdr) -do i=1,p_FAST%nBeams - IF ( ALLOCATED( Init%OutData_BD(i)%WriteOutputHdr) ) y_FAST%numOuts(Module_BD) = y_FAST%numOuts(Module_BD) + SIZE(Init%OutData_BD(i)%WriteOutputHdr) -end do - - IF ( ALLOCATED( Init%OutData_AD%rotors)) then - IF ( ALLOCATED( Init%OutData_AD%rotors(1)%WriteOutputHdr)) y_FAST%numOuts(Module_AD) = SIZE(Init%OutData_AD%rotors(1)%WriteOutputHdr) - ENDIF - IF ( ALLOCATED( Init%OutData_ADsk%WriteOutputHdr ) ) y_FAST%numOuts(Module_ADsk) = SIZE(Init%OutData_ADsk%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_SrvD%WriteOutputHdr ) ) y_FAST%numOuts(Module_SrvD) = SIZE(Init%OutData_SrvD%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_SeaSt%WriteOutputHdr ) ) y_FAST%numOuts(Module_SeaSt) = SIZE(Init%OutData_SeaSt%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_HD%WriteOutputHdr ) ) y_FAST%numOuts(Module_HD) = SIZE(Init%OutData_HD%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_SD%WriteOutputHdr ) ) y_FAST%numOuts(Module_SD) = SIZE(Init%OutData_SD%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_ExtPtfm%WriteOutputHdr) ) y_FAST%numOuts(Module_ExtPtfm)= SIZE(Init%OutData_ExtPtfm%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_MAP%WriteOutputHdr ) ) y_FAST%numOuts(Module_MAP) = SIZE(Init%OutData_MAP%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_FEAM%WriteOutputHdr ) ) y_FAST%numOuts(Module_FEAM) = SIZE(Init%OutData_FEAM%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_MD%WriteOutputHdr ) ) y_FAST%numOuts(Module_MD) = SIZE(Init%OutData_MD%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_Orca%WriteOutputHdr ) ) y_FAST%numOuts(Module_Orca) = SIZE(Init%OutData_Orca%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_IceF%WriteOutputHdr ) ) y_FAST%numOuts(Module_IceF) = SIZE(Init%OutData_IceF%WriteOutputHdr) - IF ( ALLOCATED( Init%OutData_IceD%WriteOutputHdr ) ) y_FAST%numOuts(Module_IceD) = SIZE(Init%OutData_IceD%WriteOutputHdr)*p_FAST%numIceLegs + if (allocated(Init%OutData_BD)) then + do i = 1, p_FAST%NumBD + if (allocated(Init%OutData_BD(i)%WriteOutputHdr)) y_FAST%numOuts(Module_BD) = y_FAST%numOuts(Module_BD) + size(Init%OutData_BD(i)%WriteOutputHdr) + end do + end if + if (allocated(Init%OutData_ED)) then + do i = 1, p_FAST%NRotors + if (allocated(Init%OutData_ED(i)%WriteOutputHdr)) y_FAST%numOuts(Module_ED) = y_FAST%numOuts(Module_ED) + size(Init%OutData_ED(i)%WriteOutputHdr) + end do + end if + if (allocated(Init%OutData_AD%rotors)) then + do i = 1, p_FAST%NRotors + if (allocated(Init%OutData_AD%rotors(i)%WriteOutputHdr)) y_FAST%numOuts(Module_AD) = y_FAST%numOuts(Module_AD) + size(Init%OutData_AD%rotors(i)%WriteOutputHdr) + end do + endif + if (allocated(Init%OutData_SrvD)) then + do i = 1, p_FAST%NRotors + if (allocated(Init%OutData_SrvD(i)%WriteOutputHdr)) y_FAST%numOuts(Module_SrvD) = y_FAST%numOuts(Module_SrvD) + size(Init%OutData_SrvD(i)%WriteOutputHdr) + end do + end if + if (allocated(Init%OutData_SED%WriteOutputHdr)) y_FAST%numOuts(Module_SED) = size(Init%OutData_SED%WriteOutputHdr) + if (allocated(Init%OutData_IfW%WriteOutputHdr)) y_FAST%numOuts(Module_IfW) = size(Init%OutData_IfW%WriteOutputHdr) + if (allocated(Init%OutData_ExtInfw%WriteOutputHdr)) y_FAST%numOuts(Module_ExtInfw) = size(Init%OutData_ExtInfw%WriteOutputHdr) + if (allocated(Init%OutData_ADsk%WriteOutputHdr)) y_FAST%numOuts(Module_ADsk) = size(Init%OutData_ADsk%WriteOutputHdr) + if (allocated(Init%OutData_SeaSt%WriteOutputHdr)) y_FAST%numOuts(Module_SeaSt) = size(Init%OutData_SeaSt%WriteOutputHdr) + if (allocated(Init%OutData_HD%WriteOutputHdr)) y_FAST%numOuts(Module_HD) = size(Init%OutData_HD%WriteOutputHdr) + if (allocated(Init%OutData_SD%WriteOutputHdr)) y_FAST%numOuts(Module_SD) = size(Init%OutData_SD%WriteOutputHdr) + if (allocated(Init%OutData_ExtPtfm%WriteOutputHdr)) y_FAST%numOuts(Module_ExtPtfm) = size(Init%OutData_ExtPtfm%WriteOutputHdr) + if (allocated(Init%OutData_MAP%WriteOutputHdr)) y_FAST%numOuts(Module_MAP) = size(Init%OutData_MAP%WriteOutputHdr) + if (allocated(Init%OutData_FEAM%WriteOutputHdr)) y_FAST%numOuts(Module_FEAM) = size(Init%OutData_FEAM%WriteOutputHdr) + if (allocated(Init%OutData_MD%WriteOutputHdr)) y_FAST%numOuts(Module_MD) = size(Init%OutData_MD%WriteOutputHdr) + if (allocated(Init%OutData_Orca%WriteOutputHdr)) y_FAST%numOuts(Module_Orca) = size(Init%OutData_Orca%WriteOutputHdr) + if (allocated(Init%OutData_IceF%WriteOutputHdr)) y_FAST%numOuts(Module_IceF) = size(Init%OutData_IceF%WriteOutputHdr) + if (allocated(Init%OutData_IceD%WriteOutputHdr)) y_FAST%numOuts(Module_IceD) = size(Init%OutData_IceD%WriteOutputHdr) * p_FAST%numIceLegs + IF (allocated(Init%OutData_SlD%WriteOutputHdr)) y_FAST%numOuts(Module_SlD) = size(Init%OutData_SlD%WriteOutputHdr) !...................................................... ! Initialize the output channel names and units @@ -2440,7 +2338,8 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) if (p_FAST%CompAeroMaps) then y_FAST%numOuts(Module_Glue) = 1 + size(y_FAST%DriverWriteOutput) else - y_FAST%numOuts(Module_Glue) = 1 ! time + y_FAST%numOuts(Module_Glue) = 4 ! time, ConvIter, ConvError, NumUJac + if (p_FAST%CalcSteady) y_FAST%numOuts(Module_Glue) = y_FAST%numOuts(Module_Glue) + 1 end if @@ -2473,136 +2372,196 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) y_FAST%ChannelNames(SS_Indx_WS+1) = 'WindSpeed' y_FAST%ChannelUnits(SS_Indx_WS+1) = '(m/s)' - else y_FAST%ChannelNames(1) = 'Time' y_FAST%ChannelUnits(1) = '(s)' + y_FAST%ChannelNames(2) = 'ConvIter' + y_FAST%ChannelUnits(2) = '(-)' + + y_FAST%ChannelNames(3) = 'ConvError' + y_FAST%ChannelUnits(3) = '(-)' + + y_FAST%ChannelNames(4) = 'NumUJac' + y_FAST%ChannelUnits(4) = '(-)' + + if (p_FAST%CalcSteady) then + y_FAST%ChannelNames(5) = 'CSError' + y_FAST%ChannelUnits(5) = '(-)' + end if end if + ! Initialize next index number indxNext = y_FAST%numOuts(Module_Glue) + 1 - DO i=1,y_FAST%numOuts(Module_ExtInfw) !ExternalInflow + ! ExternalInflow + do i = 1, y_FAST%numOuts(Module_ExtInfw) y_FAST%ChannelNames(indxNext) = Init%OutData_ExtInfw%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_ExtInfw%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_IfW) !InflowWind + ! InflowWind + do i = 1, y_FAST%numOuts(Module_IfW) y_FAST%ChannelNames(indxNext) = Init%OutData_IfW%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_IfW%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_ED) !ElastoDyn - y_FAST%ChannelNames(indxNext) = Init%OutData_ED%WriteOutputHdr(i) - y_FAST%ChannelUnits(indxNext) = Init%OutData_ED%WriteOutputUnt(i) - indxNext = indxNext + 1 - END DO + ! ElastoDyn + if (y_FAST%numOuts(Module_ED) > 0) then + prefix = '' + do iRot = 1, p_FAST%NRotors + if (.not. allocated(Init%OutData_ED(iRot)%WriteOutputHdr)) cycle + if (p_FAST%NRotors > 1) prefix = 'R'//Num2LStr(iRot) + do i = 1, size(Init%OutData_ED(iRot)%WriteOutputHdr) + y_FAST%ChannelNames(indxNext) = trim(prefix)//Init%OutData_ED(iRot)%WriteOutputHdr(i) + y_FAST%ChannelUnits(indxNext) = Init%OutData_ED(iRot)%WriteOutputUnt(i) + indxNext = indxNext + 1 + end do + end do + end if - DO i=1,y_FAST%numOuts(Module_SED) !Simnplified-ElastoDyn + ! Simplified-ElastoDyn + do i = 1, y_FAST%numOuts(Module_SED) y_FAST%ChannelNames(indxNext) = Init%OutData_SED%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_SED%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - IF ( y_FAST%numOuts(Module_BD) > 0_IntKi ) THEN !BeamDyn - do i=1,p_FAST%nBeams - if ( allocated(Init%OutData_BD(i)%WriteOutputHdr) ) then - do j=1,size(Init%OutData_BD(i)%WriteOutputHdr) - y_FAST%ChannelNames(indxNext) = 'B'//TRIM(Num2Lstr(i))//trim(Init%OutData_BD(i)%WriteOutputHdr(j)) - y_FAST%ChannelUnits(indxNext) = Init%OutData_BD(i)%WriteOutputUnt(j) + ! BeamDyn + if (y_FAST%numOuts(Module_BD) > 0) then + k = 0 + do iRot = 1, p_FAST%NRotors + do i = 1, Init%OutData_ED(iRot)%NumBl + k = k + 1 + if (.not. allocated(Init%OutData_BD(k)%WriteOutputHdr)) cycle + prefix = 'B'//Num2LStr(i) + if (p_FAST%NRotors > 1) prefix = 'R'//trim(Num2LStr(iRot))//prefix + do j = 1, size(Init%OutData_BD(k)%WriteOutputHdr) + y_FAST%ChannelNames(indxNext) = trim(prefix)//Init%OutData_BD(k)%WriteOutputHdr(j) + y_FAST%ChannelUnits(indxNext) = Init%OutData_BD(k)%WriteOutputUnt(j) indxNext = indxNext + 1 - end do ! j - end if + end do + end do end do - END IF - - - ! none for AeroDyn14 + end if - DO i=1,y_FAST%numOuts(Module_AD) !AeroDyn - y_FAST%ChannelNames(indxNext) = Init%OutData_AD%rotors(1)%WriteOutputHdr(i) - y_FAST%ChannelUnits(indxNext) = Init%OutData_AD%rotors(1)%WriteOutputUnt(i) - indxNext = indxNext + 1 - END DO + ! AeroDyn + if (y_FAST%numOuts(Module_AD) > 0) then + prefix = '' + do iRot = 1, p_FAST%NRotors + if (.not. allocated(Init%OutData_AD%rotors(iRot)%WriteOutputHdr)) cycle + if (p_FAST%NRotors > 1) prefix = 'R'//Num2LStr(iRot) + do i = 1, size(Init%OutData_AD%rotors(iRot)%WriteOutputHdr) + y_FAST%ChannelNames(indxNext) = trim(prefix)//Init%OutData_AD%rotors(iRot)%WriteOutputHdr(i) + y_FAST%ChannelUnits(indxNext) = Init%OutData_AD%rotors(iRot)%WriteOutputUnt(i) + indxNext = indxNext + 1 + end do + end do + end if - DO i=1,y_FAST%numOuts(Module_ADsk) !AeroDisk + ! AeroDisk + do i = 1, y_FAST%numOuts(Module_ADsk) y_FAST%ChannelNames(indxNext) = Init%OutData_ADsk%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_ADsk%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_SrvD) !ServoDyn - y_FAST%ChannelNames(indxNext) = Init%OutData_SrvD%WriteOutputHdr(i) - y_FAST%ChannelUnits(indxNext) = Init%OutData_SrvD%WriteOutputUnt(i) - indxNext = indxNext + 1 - END DO + ! ServoDyn + if (y_FAST%numOuts(Module_SrvD) > 0) then + prefix = '' + do iRot = 1, p_FAST%NRotors + if (.not. allocated(Init%OutData_SrvD(iRot)%WriteOutputHdr)) cycle + if (p_FAST%NRotors > 1) prefix = 'R'//Num2LStr(iRot) + do i = 1, size(Init%OutData_SrvD(iRot)%WriteOutputHdr) + y_FAST%ChannelNames(indxNext) = trim(prefix)//Init%OutData_SrvD(iRot)%WriteOutputHdr(i) + y_FAST%ChannelUnits(indxNext) = Init%OutData_SrvD(iRot)%WriteOutputUnt(i) + indxNext = indxNext + 1 + end do + end do + end if - DO i=1,y_FAST%numOuts(Module_SeaSt) !SeaState + ! SeaState + do i = 1, y_FAST%numOuts(Module_SeaSt) y_FAST%ChannelNames(indxNext) = Init%OutData_SeaSt%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_SeaSt%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_HD) !HydroDyn + ! HydroDyn + do i = 1, y_FAST%numOuts(Module_HD) y_FAST%ChannelNames(indxNext) = Init%OutData_HD%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_HD%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_SD) !SubDyn + ! SubDyn + do i = 1, y_FAST%numOuts(Module_SD) y_FAST%ChannelNames(indxNext) = Init%OutData_SD%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_SD%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_ExtPtfm) !ExtPtfm_MCKF + ! ExtPtfm_MCKF + do i = 1, y_FAST%numOuts(Module_ExtPtfm) y_FAST%ChannelNames(indxNext) = Init%OutData_ExtPtfm%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_ExtPtfm%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_MAP) !MAP + ! MAP + do i = 1, y_FAST%numOuts(Module_MAP) y_FAST%ChannelNames(indxNext) = Init%OutData_MAP%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_MAP%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_MD) !MoorDyn + ! MoorDyn + do i = 1, y_FAST%numOuts(Module_MD) y_FAST%ChannelNames(indxNext) = Init%OutData_MD%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_MD%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_FEAM) !FEAMooring + ! FEAMooring + do i = 1, y_FAST%numOuts(Module_FEAM) y_FAST%ChannelNames(indxNext) = Init%OutData_FEAM%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_FEAM%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_Orca) !OrcaFlex + ! OrcaFlex + do i = 1, y_FAST%numOuts(Module_Orca) y_FAST%ChannelNames(indxNext) = Init%OutData_Orca%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_Orca%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - DO i=1,y_FAST%numOuts(Module_IceF) !IceFloe + ! IceFloe + do i = 1, y_FAST%numOuts(Module_IceF) y_FAST%ChannelNames(indxNext) = Init%OutData_IceF%WriteOutputHdr(i) y_FAST%ChannelUnits(indxNext) = Init%OutData_IceF%WriteOutputUnt(i) indxNext = indxNext + 1 - END DO + end do - IF ( y_FAST%numOuts(Module_IceD) > 0_IntKi ) THEN !IceDyn - DO I=1,p_FAST%numIceLegs - DO J=1,SIZE(Init%OutData_IceD%WriteOutputHdr) - y_FAST%ChannelNames(indxNext) =TRIM(Init%OutData_IceD%WriteOutputHdr(J))//'L'//TRIM(Num2Lstr(I)) !bjj: do we want this "Lx" at the end? - y_FAST%ChannelUnits(indxNext) = Init%OutData_IceD%WriteOutputUnt(J) + ! IceDyn + if (y_FAST%numOuts(Module_IceD) > 0) THEN + do i = 1, p_FAST%numIceLegs + do j = 1, size(Init%OutData_IceD%WriteOutputHdr) + y_FAST%ChannelNames(indxNext) = TRIM(Init%OutData_IceD%WriteOutputHdr(j))//'L'//TRIM(Num2Lstr(i)) !bjj: do we want this "Lx" at the end? + y_FAST%ChannelUnits(indxNext) = Init%OutData_IceD%WriteOutputUnt(j) indxNext = indxNext + 1 - END DO ! J - END DO ! I - END IF + end do + end do + end if + ! SoilDyn + do i=1,y_FAST%numOuts(Module_SlD) + y_FAST%ChannelNames(indxNext) = Init%OutData_SlD%WriteOutputHdr(i) + y_FAST%ChannelUnits(indxNext) = Init%OutData_SlD%WriteOutputUnt(i) + indxNext = indxNext + 1 + end do !...................................................... ! Open the text output file and print the headers @@ -2611,9 +2570,9 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) IF (p_FAST%WrTxtOutFile) THEN y_FAST%ActualChanLen = max( MinChanLen, p_FAST%FmtWidth ) - DO I=1,NumOuts - y_FAST%ActualChanLen = max( y_FAST%ActualChanLen, LEN_TRIM(y_FAST%ChannelNames(I)) ) - y_FAST%ActualChanLen = max( y_FAST%ActualChanLen, LEN_TRIM(y_FAST%ChannelUnits(I)) ) + DO i=1,NumOuts + y_FAST%ActualChanLen = max( y_FAST%ActualChanLen, LEN_TRIM(y_FAST%ChannelNames(i)) ) + y_FAST%ActualChanLen = max( y_FAST%ActualChanLen, LEN_TRIM(y_FAST%ChannelUnits(i)) ) ENDDO ! I @@ -2641,15 +2600,15 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) CALL WrFileNR ( y_FAST%UnOu, trim(y_FAST%ChannelNames(1)) ) ! first one is time, with a special format - DO I=2,NumOuts - CALL WrFileNR ( y_FAST%UnOu, p_FAST%Delim//trim(y_FAST%ChannelNames(I)) ) + DO i=2,NumOuts + CALL WrFileNR ( y_FAST%UnOu, p_FAST%Delim//trim(y_FAST%ChannelNames(i)) ) ENDDO ! I else CALL WrFileNR ( y_FAST%UnOu, y_FAST%ChannelNames(1)(1:p_FAST%TChanLen) ) ! first one is time, with a special format - DO I=2,NumOuts - CALL WrFileNR ( y_FAST%UnOu, p_FAST%Delim//y_FAST%ChannelNames(I)(1:y_FAST%ActualChanLen) ) + DO i=2,NumOuts + CALL WrFileNR ( y_FAST%UnOu, p_FAST%Delim//y_FAST%ChannelNames(i)(1:y_FAST%ActualChanLen) ) ENDDO ! I end if @@ -2663,15 +2622,15 @@ SUBROUTINE FAST_InitOutput( p_FAST, y_FAST, Init, ErrStat, ErrMsg ) CALL WrFileNR ( y_FAST%UnOu, trim(y_FAST%ChannelUnits(1)) ) - DO I=2,NumOuts - CALL WrFileNR ( y_FAST%UnOu, p_FAST%Delim//trim(y_FAST%ChannelUnits(I)) ) + DO i=2,NumOuts + CALL WrFileNR ( y_FAST%UnOu, p_FAST%Delim//trim(y_FAST%ChannelUnits(i)) ) ENDDO ! I else CALL WrFileNR ( y_FAST%UnOu, y_FAST%ChannelUnits(1)(1:p_FAST%TChanLen) ) - DO I=2,NumOuts - CALL WrFileNR ( y_FAST%UnOu, p_FAST%Delim//y_FAST%ChannelUnits(I)(1:y_FAST%ActualChanLen) ) + DO i=2,NumOuts + CALL WrFileNR ( y_FAST%UnOu, p_FAST%Delim//y_FAST%ChannelUnits(i)(1:y_FAST%ActualChanLen) ) ENDDO ! I end if @@ -2716,9 +2675,6 @@ END SUBROUTINE FAST_InitOutput !! parameter structure (p). It prints to an echo file if requested. SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrStat, ErrMsg ) - IMPLICIT NONE - - ! Passed variables TYPE(FAST_ParameterType), INTENT(INOUT) :: p !< The parameter data for the FAST (glue-code) simulation TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables CHARACTER(*), INTENT(IN) :: InputFile !< Name of the file containing the primary input data @@ -2726,10 +2682,9 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message - ! Local variables: REAL(DbKi) :: TmpRate ! temporary variable to read VTK_fps before converting to #steps based on DT REAL(DbKi) :: TmpTime ! temporary variable to read SttsTime and ChkptTime before converting to #steps based on DT - INTEGER(IntKi) :: I ! loop counter + INTEGER(IntKi) :: I, j, iRot ! loop counter INTEGER(IntKi) :: UnIn ! Unit number for reading file INTEGER(IntKi) :: UnEc ! I/O unit for echo file. If > 0, file is open for writing. @@ -2763,10 +2718,7 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS CALL SetErrStat( ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) endif !$OMP end critical(fileopen_critical) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return p%NumSSCases = 0 p%RotSpeedInit = 0.0_ReKi @@ -2775,55 +2727,32 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS ! If echo is FALSE, don't write these lines to the echo file. ! If Echo is TRUE, rewind and write on the second try. - I = 1 !set the number of times we've read the file - DO - !-------------------------- HEADER --------------------------------------------- + DO I = 1, 2 + + !-------------------------- HEADER --------------------------------------------- CALL ReadCom( UnIn, InputFile, 'File header: Module Version (line 1)', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return CALL ReadStr( UnIn, InputFile, p%FTitle, 'FTitle', 'File Header: File Description (line 2)', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return + !---------------------- SIMULATION CONTROL -------------------------------------- - !---------------------- SIMULATION CONTROL -------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Simulation Control', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if - + if (Failed()) return ! Echo - Echo input data to .ech (flag): CALL ReadVar( UnIn, InputFile, Echo, "Echo", "Echo input data to .ech (flag)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if - + if (Failed()) return - IF (.NOT. Echo .OR. I > 1) EXIT !exit this loop + ! If echo was not requested or this is the second time reading this file, exit the loop + IF (.NOT. Echo .OR. I > 1) EXIT ! Otherwise, open the echo file, then rewind the input file and echo everything we've read - I = I + 1 ! make sure we do this only once (increment counter that says how many times we've read this file) - CALL OpenEcho ( UnEc, TRIM(p%OutFileRoot)//'.ech', ErrStat2, ErrMsg2, FAST_Ver ) - CALL SetErrStat( ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( UnEc > 0 ) WRITE (UnEc,'(/,A,/)') 'Data from '//TRIM(FAST_Ver%Name)//' primary input file "'//TRIM( InputFile )//'":' @@ -2842,485 +2771,414 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS CALL WrScr('') end if - ! AbortLevel - Error level when simulation should abort: CALL ReadVar( UnIn, InputFile, AbortLevel, "AbortLevel", "Error level when simulation should abort (string)", & ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2,ErrStat,ErrMsg,RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if - - IF (OverrideAbortErrLev) THEN - ! Let's set the abort level here.... knowing that everything before this aborted only on FATAL errors! - CALL Conv2UC( AbortLevel ) !convert to upper case - SELECT CASE( TRIM(AbortLevel) ) - CASE ( "WARNING" ) - AbortErrLev = ErrID_Warn - CASE ( "SEVERE" ) - AbortErrLev = ErrID_Severe - CASE ( "FATAL" ) - AbortErrLev = ErrID_Fatal - CASE DEFAULT - CALL SetErrStat( ErrID_Fatal, 'Invalid AbortLevel specified in FAST input file. '// & - 'Valid entries are "WARNING", "SEVERE", or "FATAL".',ErrStat,ErrMsg,RoutineName) - call cleanup() - RETURN - END SELECT - END IF - + if (Failed()) return + + IF (OverrideAbortErrLev) THEN + ! Let's set the abort level here.... knowing that everything before this aborted only on FATAL errors! + CALL Conv2UC( AbortLevel ) !convert to upper case + SELECT CASE( TRIM(AbortLevel) ) + CASE ( "WARNING" ) + AbortErrLev = ErrID_Warn + CASE ( "SEVERE" ) + AbortErrLev = ErrID_Severe + CASE ( "FATAL" ) + AbortErrLev = ErrID_Fatal + CASE DEFAULT + CALL SetErrStat( ErrID_Fatal, 'Invalid AbortLevel specified in FAST input file. '// & + 'Valid entries are "WARNING", "SEVERE", or "FATAL".',ErrStat,ErrMsg,RoutineName) + call cleanup() + RETURN + END SELECT + END IF ! TMax - Total run time (s): CALL ReadVar( UnIn, InputFile, p%TMax, "TMax", "Total run time (s)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! DT - Recommended module time step (s): CALL ReadVar( UnIn, InputFile, p%DT, "DT", "Recommended module time step (s)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return - if ( EqualRealNos(p%DT, 0.0_DbKi) ) then - ! add a fatal error here because we're going to divide by DT later in this routine: - CALL SetErrStat( ErrID_Fatal, 'DT cannot be zero.', ErrStat, ErrMsg, RoutineName) - call cleanup() - return - end if + if ( EqualRealNos(p%DT, 0.0_DbKi) ) then + ! add a fatal error here because we're going to divide by DT later in this routine: + CALL SetErrStat( ErrID_Fatal, 'DT cannot be zero.', ErrStat, ErrMsg, RoutineName) + call cleanup() + return + end if + ! ModCoupling - Module coupling method (switch) {1=loose; 2=tight with fixed Jacobian updates (DT_UJac); 3=tight with automatic Jacobian updates} + CALL ReadVar( UnIn, InputFile, p%ModCoupling, "ModCoupling", "Module coupling method (switch) "//& + "{1=loose; 2=tight with fixed Jacobian updates (DT_UJac); 3=tight with automatic Jacobian updates}", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return ! InterpOrder - Interpolation order for inputs and outputs {0=nearest neighbor ,1=linear, 2=quadratic} CALL ReadVar( UnIn, InputFile, p%InterpOrder, "InterpOrder", "Interpolation order "//& "for inputs and outputs {0=nearest neighbor ,1=linear, 2=quadratic} (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! NumCrctn - Number of predictor-corrector iterations {1=explicit calculation, i.e., no corrections} CALL ReadVar( UnIn, InputFile, p%NumCrctn, "NumCrctn", "Number of corrections"//& "{0=explicit calculation, i.e., no corrections} (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return + + ! RhoInf - Numerical damping parameter for tight coupling generalized-alpha integrator (-) [0.0 to 1.0] + CALL ReadVar( UnIn, InputFile, p%RhoInf, "RhoInf", "Numerical damping parameter "//& + "for tight coupling generalized-alpha integrator (-) [0.0 to 1.0]", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + + ! ConvTol - Convergence iteration error tolerance for tight coupling generalized alpha integrator (-) + CALL ReadVar( UnIn, InputFile, p%ConvTol, "ConvTol", "Convergence iteration error tolerance for tight coupling generalized alpha integrator (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + ! MaxConvIter - Maximum number of convergence interations for tight coupling generalized alpha integrator (-) + CALL ReadVar( UnIn, InputFile, p%MaxConvIter, "MaxConvIter", "Maximum number of convergence iterations "//& + "for tight coupling generalized alpha integrator (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + ! DT_UJac - Time between calls to get Jacobians (s) CALL ReadVar( UnIn, InputFile, p%DT_UJac, "DT_UJac", "Time between calls to get Jacobians (s)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! UJacSclFact - Scaling factor used in Jacobians (-) CALL ReadVar( UnIn, InputFile, p%UJacSclFact, "UJacSclFact", "Scaling factor used in Jacobians (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return !---------------------- FEATURE SWITCHES AND FLAGS -------------------------------- + + ! Read section header CALL ReadCom( UnIn, InputFile, 'Section Header: Feature Switches and Flags', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return + + ! NRotors - Number of rotors in turbine + CALL ReadVar( UnIn, InputFile, p%NRotors, "NRotors", "Number of rotors on turbine (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + + ! Return error if NRotors < 1 + if (p%NRotors < 1) then + call SetErrStat(ErrID_Fatal, "NRotors must be >= 1", ErrStat, ErrMsg, RoutineName) + return + end if ! CompElast - Compute structural dynamics (switch) {1=ElastoDyn; 2=ElastoDyn + BeamDyn for blades}: CALL ReadVar( UnIn, InputFile, p%CompElast, "CompElast", "Compute structural dynamics (switch) {1=ElastoDyn; 2=ElastoDyn + BeamDyn for blades; 3=Simplified-ElastoDyn}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return - ! immediately convert to values used inside the code: - IF ( p%CompElast == 1 ) THEN - p%CompElast = Module_ED - ELSEIF ( p%CompElast == 2 ) THEN - p%CompElast = Module_BD - ELSEIF ( p%CompElast == 3 ) THEN - p%CompElast = Module_SED - ELSE - p%CompElast = Module_Unknown - END IF + ! immediately convert to values used inside the code: + select case (p%CompElast) + case (1) + p%CompElast = Module_ED + case (2) + p%CompElast = Module_BD + case (3) + p%CompElast = Module_SED + case default + p%CompElast = Module_Unknown + end select ! CompInflow - inflow wind velocities (switch) {0=still air; 1=InflowWind}: CALL ReadVar( UnIn, InputFile, p%CompInflow, "CompInflow", "inflow wind velocities (switch) {0=still air; 1=InflowWind}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return - ! immediately convert to values used inside the code: - IF ( p%CompInflow == 0 ) THEN - p%CompInflow = Module_NONE - ELSEIF ( p%CompInflow == 1 ) THEN - p%CompInflow = Module_IfW - ELSEIF ( p%CompInflow == 2 ) THEN - p%CompInflow = Module_ExtInfw - ELSE - p%CompInflow = Module_Unknown - END IF + ! immediately convert to values used inside the code: + select case (p%CompInflow) + case (0) + p%CompInflow = Module_NONE + case (1) + p%CompInflow = Module_IfW + case (2) + p%CompInflow = Module_ExtInfw + case default + p%CompInflow = Module_Unknown + end select ! CompAero - Compute aerodynamic loads (switch) {0=None; 1=AeroDisk; 2=AeroDyn; 3=ExtLoads}: CALL ReadVar( UnIn, InputFile, p%CompAero, "CompAero", "Compute aerodynamic loads (switch) {0=None; 1=AeroDisk; 2=AeroDyn; 3=ExtLoads}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return - ! immediately convert to values used inside the code: - IF ( p%CompAero == 0 ) THEN - p%CompAero = Module_NONE - ELSEIF ( p%CompAero == 1 ) THEN - p%CompAero = Module_ADsk - ELSEIF ( p%CompAero == 2 ) THEN - p%CompAero = Module_AD - ELSEIF ( p%CompAero == 3 ) THEN - p%CompAero = Module_ExtLd - ELSE - p%CompAero = Module_Unknown - END IF + ! immediately convert to values used inside the code: + select case (p%CompAero) + case (0) + p%CompAero = Module_NONE + case (1) + p%CompAero = Module_ADsk + case (2) + p%CompAero = Module_AD + case (3) + p%CompAero = Module_ExtLd + case default + p%CompAero = Module_Unknown + end select ! CompServo - Compute control and electrical-drive dynamics (switch) {0=None; 1=ServoDyn}: CALL ReadVar( UnIn, InputFile, p%CompServo, "CompServo", "Compute control and electrical-drive dynamics (switch) {0=None; 1=ServoDyn}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if - - ! immediately convert to values used inside the code: - IF ( p%CompServo == 0 ) THEN - p%CompServo = Module_NONE - ELSEIF ( p%CompServo == 1 ) THEN - p%CompServo = Module_SrvD - ELSE - p%CompServo = Module_Unknown - END IF + if (Failed()) return + ! immediately convert to values used inside the code: + select case(p%CompServo) + case (0) + p%CompServo = Module_NONE + case (1) + p%CompServo = Module_SrvD + case default + p%CompServo = Module_Unknown + end select ! CompSeaSt - Compute sea state information (switch) {0=None; 1=SeaState}: CALL ReadVar( UnIn, InputFile, p%CompSeaSt, "CompSeaSt", "Compute sea state information (switch) {0=None; 1=SeaState}}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return - ! immediately convert to values used inside the code: - IF ( p%CompSeaSt == 0 ) THEN - p%CompSeaSt = Module_NONE - ELSEIF ( p%CompSeaSt == 1 ) THEN - p%CompSeaSt = Module_SeaSt - ELSE - p%CompSeaSt = Module_Unknown - END IF + ! immediately convert to values used inside the code: + select case(p%CompSeaSt) + case (0) + p%CompSeaSt = Module_NONE + case (1) + p%CompSeaSt = Module_SeaSt + case default + p%CompSeaSt = Module_Unknown + end select ! CompHydro - Compute hydrodynamic loads (switch) {0=None; 1=HydroDyn}: CALL ReadVar( UnIn, InputFile, p%CompHydro, "CompHydro", "Compute hydrodynamic loads (switch) {0=None; 1=HydroDyn}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return - ! immediately convert to values used inside the code: - IF ( p%CompHydro == 0 ) THEN - p%CompHydro = Module_NONE - ELSEIF ( p%CompHydro == 1 ) THEN - p%CompHydro = Module_HD - ELSE - p%CompHydro = Module_Unknown - END IF + ! immediately convert to values used inside the code: + select case (p%CompHydro) + case (0) + p%CompHydro = Module_NONE + case (1) + p%CompHydro = Module_HD + case default + p%CompHydro = Module_Unknown + end select ! CompSub - Compute sub-structural dynamics (switch) {0=None; 1=SubDyn; 2=ExtPtfm_MCKF}: CALL ReadVar( UnIn, InputFile, p%CompSub, "CompSub", "Compute sub-structural dynamics (switch) {0=None; 1=SubDyn}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return - ! immediately convert to values used inside the code: - IF ( p%CompSub == 0 ) THEN - p%CompSub = Module_NONE - ELSEIF ( p%CompSub == 1 ) THEN - p%CompSub = Module_SD - ELSEIF ( p%CompSub == 2 ) THEN - p%CompSub = Module_ExtPtfm - ELSE - p%CompSub = Module_Unknown - END IF + ! immediately convert to values used inside the code: + select case (p%CompSub) + case (0) + p%CompSub = Module_NONE + case (1) + p%CompSub = Module_SD + case (2) + p%CompSub = Module_ExtPtfm + case default + p%CompSub = Module_Unknown + end select ! CompMooring - Compute mooring line dynamics (flag): CALL ReadVar( UnIn, InputFile, p%CompMooring, "CompMooring", "Compute mooring system (switch) {0=None; 1=MAP; 2=FEAMooring; 3=MoorDyn; 4=OrcaFlex}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return - ! immediately convert to values used inside the code: - IF ( p%CompMooring == 0 ) THEN - p%CompMooring = Module_NONE - ELSEIF ( p%CompMooring == 1 ) THEN - p%CompMooring = Module_MAP - ELSEIF ( p%CompMooring == 2 ) THEN - p%CompMooring = Module_FEAM - ELSEIF ( p%CompMooring == 3 ) THEN - p%CompMooring = Module_MD - ELSEIF ( p%CompMooring == 4 ) THEN - p%CompMooring = Module_Orca - ELSE - p%CompMooring = Module_Unknown - END IF + ! immediately convert to values used inside the code: + select case (p%CompMooring) + case (0) + p%CompMooring = Module_NONE + case (1) + p%CompMooring = Module_MAP + case (2) + p%CompMooring = Module_FEAM + case (3) + p%CompMooring = Module_MD + case (4) + p%CompMooring = Module_Orca + case default + p%CompMooring = Module_Unknown + end select ! CompIce - Compute ice loads (switch) {0=None; 1=IceFloe}: CALL ReadVar( UnIn, InputFile, p%CompIce, "CompIce", "Compute ice loads (switch) {0=None; 1=IceFloe}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return - ! immediately convert to values used inside the code: - IF ( p%CompIce == 0 ) THEN - p%CompIce = Module_NONE - ELSEIF ( p%CompIce == 1 ) THEN - p%CompIce = Module_IceF - ELSEIF ( p%CompIce == 2 ) THEN - p%CompIce = Module_IceD - ELSE - p%CompIce = Module_Unknown - END IF + ! immediately convert to values used inside the code: + select case (p%CompIce) + case (0) + p%CompIce = Module_NONE + case (1) + p%CompIce = Module_IceF + case (2) + p%CompIce = Module_IceD + case default + p%CompIce = Module_Unknown + end select + + ! CompSoil - Compute sub-structural dynamics (switch) {0=None; 1=SoilDyn; 2=ExtPtfm_MCKF}: + CALL ReadVar( UnIn, InputFile, p%CompSoil, "CompSoil", "Compute soil-structural dynamics (switch) {0=None; 1=SoilDyn}", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + + ! immediately convert to values used inside the code: + select case (p%CompSoil) + case (0) + p%CompSoil = Module_NONE + case (1) + p%CompSoil = Module_SlD + case default + p%CompSoil = Module_Unknown + end select ! MHK - MHK turbine type (switch) {0=Not an MHK turbine; 1=Fixed MHK turbine; 2=Floating MHK turbine}: CALL ReadVar( UnIn, InputFile, p%MHK, "MHK", "MHK turbine type (switch) {0=Not an MHK turbine; 1=Fixed MHK turbine; 2=Floating MHK turbine}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return + + ! Allocate array of rotor mirror flags + call AllocAry(p%MirrorRotor, p%NRotors, "p%MirrorRotor", ErrStat2, ErrMsg2); if (Failed()) return + + ! Read list of rotor mirror flags + CALL ReadAry( UnIn, InputFile, p%MirrorRotor, p%NRotors, "MirrorRotor", "Flag to reverse rotor rotation direction [1 to NRotors] {F=Normal, T=Mirror}", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return !---------------------- ENVIRONMENTAL CONDITIONS -------------------------------- + + ! Read section header CALL ReadCom( UnIn, InputFile, 'Section Header: Environmental Conditions', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! Gravity - Gravitational acceleration (m/s^2): CALL ReadVar( UnIn, InputFile, p%Gravity, "Gravity", "Gravitational acceleration (m/s^2)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! AirDens - Air density (kg/m^3): CALL ReadVar( UnIn, InputFile, p%AirDens, "AirDens", "Air density (kg/m^3)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! WtrDens - Water density (kg/m^3): CALL ReadVar( UnIn, InputFile, p%WtrDens, "WtrDens", "Water density (kg/m^3)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! KinVisc - Kinematic viscosity of working fluid (m^2/s): CALL ReadVar( UnIn, InputFile, p%KinVisc, "KinVisc", "Kinematic viscosity of working fluid (m^2/s)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! SpdSound - Speed of sound in working fluid (m/s): CALL ReadVar( UnIn, InputFile, p%SpdSound, "SpdSound", "Speed of sound in working fluid (m/s)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! Patm - Atmospheric pressure (Pa): CALL ReadVar( UnIn, InputFile, p%Patm, "Patm", "Atmospheric pressure (Pa)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! Pvap - Vapour pressure of working fluid (Pa): CALL ReadVar( UnIn, InputFile, p%Pvap, "Pvap", "Vapour pressure of working fluid (Pa)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! WtrDpth - Water depth (m): CALL ReadVar( UnIn, InputFile, p%WtrDpth, "WtrDpth", "Water depth (m)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! MSL2SWL - Offset between still-water level and mean sea level (m): CALL ReadVar( UnIn, InputFile, p%MSL2SWL, "MSL2SWL", "Offset between still-water level and mean sea level (m)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return !---------------------- INPUT FILES --------------------------------------------- + + ! Allocate file path arrays that depend on number of rotors + call AllocAry(p%EDFile, p%NRotors, "p%EDFile", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(p%BDBldFile, MaxBladesBD, p%NRotors, "p%BDBldFile", ErrStat2, ErrMsg2); if (Failed()) return + call AllocAry(p%ServoFile, p%NRotors, "p%ServoFile", ErrStat2, ErrMsg2); if (Failed()) return + + ! Read section header CALL ReadCom( UnIn, InputFile, 'Section Header: Input Files', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! EDFile - Name of file containing ElastoDyn input parameters (-): - CALL ReadVar( UnIn, InputFile, p%EDFile, "EDFile", "Name of file containing ElastoDyn input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if - IF ( PathIsRelative( p%EDFile ) ) p%EDFile = TRIM(PriPath)//TRIM(p%EDFile) - -DO i=1,MaxNBlades - ! BDBldFile - Name of file containing BeamDyn blade input parameters (-): - CALL ReadVar( UnIn, InputFile, p%BDBldFile(i), "BDBldFile("//TRIM(num2LStr(i))//")", "Name of file containing BeamDyn blade "//trim(num2lstr(i))//"input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if - IF ( PathIsRelative( p%BDBldFile(i) ) ) p%BDBldFile(i) = TRIM(PriPath)//TRIM(p%BDBldFile(i)) -END DO + CALL ReadVar( UnIn, InputFile, p%EDFile(1), "EDFile", "Name of file containing ElastoDyn input parameters (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + IF ( PathIsRelative( p%EDFile(1) ) ) p%EDFile(1) = TRIM(PriPath)//TRIM(p%EDFile(1)) + + DO i = 1, MaxBladesBD + ! BDBldFile - Name of file containing BeamDyn blade input parameters (-): + CALL ReadVar( UnIn, InputFile, p%BDBldFile(i,1), "BDBldFile("//TRIM(num2LStr(i))//")", "Name of file containing BeamDyn blade "//trim(num2lstr(i))//"input parameters (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + IF ( PathIsRelative( p%BDBldFile(i,1) ) ) p%BDBldFile(i,1) = TRIM(PriPath)//TRIM(p%BDBldFile(i,1)) + END DO ! InflowFile - Name of file containing inflow wind input parameters (-): CALL ReadVar( UnIn, InputFile, p%InflowFile, "InflowFile", "Name of file containing inflow wind input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( PathIsRelative( p%InflowFile ) ) p%InflowFile = TRIM(PriPath)//TRIM(p%InflowFile) ! AeroFile - Name of file containing aerodynamic input parameters (-): CALL ReadVar( UnIn, InputFile, p%AeroFile, "AeroFile", "Name of file containing aerodynamic input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( PathIsRelative( p%AeroFile ) ) p%AeroFile = TRIM(PriPath)//TRIM(p%AeroFile) ! ServoFile - Name of file containing control and electrical-drive input parameters (-): - CALL ReadVar( UnIn, InputFile, p%ServoFile, "ServoFile", "Name of file containing control and electrical-drive input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if - IF ( PathIsRelative( p%ServoFile ) ) p%ServoFile = TRIM(PriPath)//TRIM(p%ServoFile) + CALL ReadVar( UnIn, InputFile, p%ServoFile(1), "ServoFile(1)", "Name of file containing control and electrical-drive input parameters (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + IF ( PathIsRelative( p%ServoFile(1) ) ) p%ServoFile(1) = TRIM(PriPath)//TRIM(p%ServoFile(1)) ! SeaStFile - Name of file containing sea state input parameters (-): CALL ReadVar( UnIn, InputFile, p%SeaStFile, "SeaStFile", "Name of file containing sea state input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( PathIsRelative( p%SeaStFile ) ) p%SeaStFile = TRIM(PriPath)//TRIM(p%SeaStFile) ! HydroFile - Name of file containing hydrodynamic input parameters (-): CALL ReadVar( UnIn, InputFile, p%HydroFile, "HydroFile", "Name of file containing hydrodynamic input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( PathIsRelative( p%HydroFile ) ) p%HydroFile = TRIM(PriPath)//TRIM(p%HydroFile) ! SubFile - Name of file containing sub-structural input parameters (-): CALL ReadVar( UnIn, InputFile, p%SubFile, "SubFile", "Name of file containing sub-structural input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( PathIsRelative( p%SubFile ) ) p%SubFile = TRIM(PriPath)//TRIM(p%SubFile) ! MooringFile - Name of file containing mooring system input parameters (-): CALL ReadVar( UnIn, InputFile, p%MooringFile, "MooringFile", "Name of file containing mooring system input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( PathIsRelative( p%MooringFile ) ) p%MooringFile = TRIM(PriPath)//TRIM(p%MooringFile) ! IceFile - Name of file containing ice input parameters (-): CALL ReadVar( UnIn, InputFile, p%IceFile, "IceFile", "Name of file containing ice input parameters (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( PathIsRelative( p%IceFile ) ) p%IceFile = TRIM(PriPath)//TRIM(p%IceFile) + ! SoilFile - Name of file containing soil-structural input parameters (-): + CALL ReadVar( UnIn, InputFile, p%SoilFile, "SoilFile", "Name of file containing soil-structural input parameters (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + IF ( PathIsRelative( p%SoilFile ) ) p%SoilFile = TRIM(PriPath)//TRIM(p%SoilFile) + + ! Read subsequent rotor input files + do iRot = 2, p%NRotors + + ! Read section header + CALL ReadCom( UnIn, InputFile, 'Section Header: Rotor '//TRIM(num2LStr(iRot))//' Input Files', ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return + + ! EDFile - Name of file containing ElastoDyn input parameters (-): + CALL ReadVar( UnIn, InputFile, p%EDFile(iRot), "EDFile", "Name of file containing ElastoDyn input parameters for rotor "//TRIM(num2LStr(iRot))//" (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + IF ( PathIsRelative( p%EDFile(iRot) ) ) p%EDFile(iRot) = TRIM(PriPath)//TRIM(p%EDFile(iRot)) + + ! BDBldFile - Name of file containing BeamDyn blade input parameters (-): + DO i = 1, MaxBladesBD + CALL ReadVar( UnIn, InputFile, p%BDBldFile(i,iRot), "BDBldFile("//TRIM(num2LStr(i))//")", "Name of file containing BeamDyn blade "//trim(num2lstr(i))//"input parameters for rotor "//TRIM(num2LStr(iRot))//" (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + IF ( PathIsRelative( p%BDBldFile(i,iRot) ) ) p%BDBldFile(i,iRot) = TRIM(PriPath)//TRIM(p%BDBldFile(i,iRot)) + END DO + + ! ServoFile - Name of file containing control and electrical-drive input parameters (-): + CALL ReadVar( UnIn, InputFile, p%ServoFile(iRot), "ServoFile", "Name of file containing control and electrical-drive input parameters for rotor "//TRIM(num2LStr(iRot))//" (-)", ErrStat2, ErrMsg2, UnEc) + if (Failed()) return + IF ( PathIsRelative( p%ServoFile(iRot) ) ) p%ServoFile(iRot) = TRIM(PriPath)//TRIM(p%ServoFile(iRot)) + + end do !---------------------- OUTPUT -------------------------------------------------- + CALL ReadCom( UnIn, InputFile, 'Section Header: Output', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! SumPrint - Print summary data to .sum (flag): CALL ReadVar( UnIn, InputFile, p%SumPrint, "SumPrint", "Print summary data to .sum (flag)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! SttsTime - Amount of time between screen status messages (s): CALL ReadVar( UnIn, InputFile, TmpTime, "SttsTime", "Amount of time between screen status messages (s)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF (TmpTime > p%TMax) THEN p%n_SttsTime = HUGE(p%n_SttsTime) @@ -3330,11 +3188,7 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS ! ChkptTime - Amount of time between creating checkpoint files for potential restart (s): CALL ReadVar( UnIn, InputFile, TmpTime, "ChkptTime", "Amount of time between creating checkpoint files for potential restart (s)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF (TmpTime > p%TMax) THEN p%n_ChkptTime = HUGE(p%n_ChkptTime) @@ -3345,11 +3199,7 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS ! DT_Out - Time step for tabular output (s): CALL ReadVar( UnIn, InputFile, Line, "DT_Out", "Time step for tabular output (s)", ErrStat2, ErrMsg2, UnEc) !CALL ReadVar( UnIn, InputFile, p%DT_Out, "DT_Out", "Time step for tabular output (s)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return CALL Conv2UC( Line ) IF ( INDEX(Line, "DEFAULT" ) == 1 ) THEN @@ -3370,11 +3220,7 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS ! TStart - Time to begin tabular output (s): CALL ReadVar( UnIn, InputFile, p%TStart, "TStart", "Time to begin tabular output (s)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return !> OutFileFmt - Format for tabular (time-marching) output file (switch) {1: text file [.out], 2: binary file [.outb], 4: HDF5 [.h5], add for combinations} @@ -3394,11 +3240,7 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS ! OutFileFmt - Format for tabular (time-marching) output file(s) (1: text file [.out], 2: binary file [.outb], 3: both) (-): CALL ReadVar( UnIn, InputFile, OutFileFmt, "OutFileFmt", "Format for tabular (time-marching) output file(s) {0: uncompressed binary and text file, 1: text file [.out], 2: compressed binary file [.outb], 3: both text and compressed binary, 4: uncompressed binary .outb]; add for combinations) (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return if (OutFileFmt == 0) OutFileFmt = 5 @@ -3432,11 +3274,7 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS ! TabDelim - Use tab delimiters in text tabular output file? (flag): CALL ReadVar( UnIn, InputFile, TabDelim, "TabDelim", "Use tab delimiters in text tabular output file? (flag)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( TabDelim ) THEN p%Delim = TAB @@ -3446,67 +3284,44 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS ! OutFmt - Format used for text tabular output (except time). Resulting field should be 10 characters. (-): CALL ReadVar( UnIn, InputFile, p%OutFmt, "OutFmt", "Format used for text tabular output (except time). Resulting field should be 10 characters. (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return !---------------------- LINEARIZATION ----------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Linearization', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if - + if (Failed()) return ! Linearize - Linearization analysis (flag) CALL ReadVar( UnIn, InputFile, p%Linearize, "Linearize", "Linearization analysis (flag)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if - + if (Failed()) return ! CalcSteady - Calculate a steady-state periodic operating point before linearization? [unused if Linearize=False] (flag) CALL ReadVar( UnIn, InputFile, p%CalcSteady, "CalcSteady", "Calculate a steady-state periodic operating point before linearization? (flag)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (Failed()) return ! TrimCase - Controller parameter to be trimmed {1:yaw; 2:torque; 3:pitch} [used only if CalcSteady=True] (-) CALL ReadVar( UnIn, InputFile, p%TrimCase, "TrimCase", "Controller parameter to be trimmed {1:yaw; 2:torque; 3:pitch} (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (Failed()) return ! TrimTol - Tolerance for the rotational speed convergence [used only if CalcSteady=True] (-) CALL ReadVar( UnIn, InputFile, p%TrimTol, "TrimTol", "Tolerance for the rotational speed convergence (-)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (Failed()) return ! TrimGain - Proportional gain for the rotational speed error (>0) [used only if CalcSteady=True] (rad/(rad/s) for yaw or pitch; Nm/(rad/s) for torque) CALL ReadVar( UnIn, InputFile, p%TrimGain, "TrimGain", "Proportional gain for the rotational speed error (>0) (rad/(rad/s) for yaw or pitch; Nm/(rad/s) for torque)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (Failed()) return ! Twr_Kdmp - Damping factor for the tower [used only if CalcSteady=True] (N/(m/s)) CALL ReadVar( UnIn, InputFile, p%Twr_Kdmp, "Twr_Kdmp", "Damping factor for the tower (N/(m/s))", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (Failed()) return ! Bld_Kdmp - Damping factor for the blades [used only if CalcSteady=True] (N/(m/s)) CALL ReadVar( UnIn, InputFile, p%Bld_Kdmp, "Bld_Kdmp", "Damping factor for the blades (N/(m/s))", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! NLinTimes - Number of times to linearize (or number of equally spaced azimuth steps in periodic linearized model) (-) [>=1] CALL ReadVar( UnIn, InputFile, p%NLinTimes, "NLinTimes", "Number of times to linearize (-) [>=1]", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return if (.not. p%Linearize) then p%CalcSteady = .false. @@ -3532,59 +3347,29 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS RETURN end if - ! temporary work-around for error with CalcSteady - if (p%CalcSteady .and. p%NLinTimes == 1 ) then - call SetErrStat(ErrID_Info, "Setting NLinTimes to 2 to avoid problem with CalcSteady with only one time.", ErrStat,ErrMsg,RoutineName) - p%NLinTimes = 2 - end if - ! LinInputs - Include inputs in linearization (switch) {0=none; 1=standard; 2=all module inputs (debug)} CALL ReadVar( UnIn, InputFile, p%LinInputs, "LinInputs", "Include inputs in linearization (switch) {0=none; 1=standard; 2=all module inputs (debug)}", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! LinOutputs - Include outputs in linearization (switch) (0=none; 1=from OutList(s); 2=all module outputs (debug)) CALL ReadVar( UnIn, InputFile, p%LinOutputs, "LinOutputs", "Include outputs in linearization (switch) (0=none; 1=from OutList(s); 2=all module outputs (debug))", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! LinOutJac - Include full Jacabians in linearization output (for debug) (flag) CALL ReadVar( UnIn, InputFile, p%LinOutJac, "LinOutJac", "Include full Jacabians in linearization output (for debug) (flag)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! LinOutMod - Write module-level linearization output files in addition to output for full system? (flag) CALL ReadVar( UnIn, InputFile, p%LinOutMod, "LinOutMod", "Write module-level linearization output files in addition to output for full system? (flag)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return !---------------------- VISUALIZATION ----------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Visualization', ErrStat2, ErrMsg2, UnEc ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! WrVTK - VTK Visualization data output: (switch) {0=none; 1=initialization data only; 2=animation; 3=mode shapes}: CALL ReadVar( UnIn, InputFile, p%WrVTK, "WrVTK", "Write VTK visualization files (0=none; 1=initialization data only; 2=animation; 3=mode shapes)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return IF ( p%WrVTK < 0 .OR. p%WrVTK > 3 ) THEN p%WrVTK = VTK_Unknown @@ -3592,11 +3377,7 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS ! VTK_Type - Type of VTK visualization data: (switch) {1=surfaces; 2=basic meshes (lines/points); 3=all meshes (debug)}: CALL ReadVar( UnIn, InputFile, p%VTK_Type, "VTK_Type", "Type of VTK visualization data: (1=surfaces; 2=basic meshes (lines/points); 3=all meshes)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! immediately convert to values used inside the code: IF ( p%VTK_Type == 0 ) THEN @@ -3620,19 +3401,11 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS ! VTK_fields - Write mesh fields to VTK data files? (flag) {true/false}: CALL ReadVar( UnIn, InputFile, p%VTK_fields, "VTK_fields", "Write mesh fields to VTK data files? (flag)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! VTK_fps - Frame rate for VTK output (frames per second) {will use closest integer multiple of DT} CALL ReadVar( UnIn, InputFile, p%VTK_fps, "VTK_fps", "Frame rate for VTK output(fps)", ErrStat2, ErrMsg2, UnEc) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if ( ErrStat >= AbortErrLev ) then - call cleanup() - RETURN - end if + if (Failed()) return ! convert frames-per-second to seconds per sample: @@ -3664,12 +3437,16 @@ SUBROUTINE FAST_ReadPrimaryFile( InputFile, p, m_FAST, OverrideAbortErrLev, ErrS RETURN CONTAINS - !............................................................................................................................... subroutine cleanup() CLOSE( UnIn ) IF ( UnEc > 0 ) CLOSE ( UnEc ) end subroutine cleanup - !............................................................................................................................... + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + if (Failed) call cleanup() + end function END SUBROUTINE FAST_ReadPrimaryFile !---------------------------------------------------------------------------------------------------------------------------------- !> This routine reads in the primary FAST input file for steady-state calculations, does some validation, and places the values it reads in the @@ -4034,7 +3811,7 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData ! calculate the number of digits in 'y_FAST%NOutSteps' (Maximum number of output steps to be written) ! this will be used to pad the write-out step in the VTK filename with zeros in calls to MeshWrVTK() - if (p_FAST%WrVTK == VTK_ModeShapes .AND. p_FAST%VTK_modes%VTKLinTim==1) then + if (p_FAST%WrVTK == VTK_ModeShapes) then if (p_FAST%NLinTimes < 1) p_FAST%NLinTimes = 1 !in case we reached here with an error p_FAST%VTK_tWidth = CEILING( log10( real( p_FAST%NLinTimes) ) ) + 1 else @@ -4090,8 +3867,9 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData y = SED%y%HubPtMotion%Position(3, 1) - SED%y%NacelleMotion%Position(3, 1) x = TwoNorm( SED%y%HubPtMotion%Position(1:2,1) - SED%y%NacelleMotion%Position(1:2,1) ) - p_FAST%VTK_Surface%HubRad else - y = ED%y%HubPtMotion%Position(3, 1) - ED%y%NacelleMotion%Position(3, 1) - x = TwoNorm( ED%y%HubPtMotion%Position(1:2,1) - ED%y%NacelleMotion%Position(1:2,1) ) - p_FAST%VTK_Surface%HubRad + ! TODO: Support multiple nacelles for multiple rotors + y = ED%y(1)%HubPtMotion%Position(3, 1) - ED%y(1)%NacelleMotion%Position(3, 1) + x = TwoNorm( ED%y(1)%HubPtMotion%Position(1:2,1) - ED%y(1)%NacelleMotion%Position(1:2,1) ) - p_FAST%VTK_Surface%HubRad endif @@ -4107,7 +3885,8 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData !....................... ! Create the tower surface data !....................... - TowerMotionMesh => ED%y%TowerLn2Mesh + ! TODO: Support multiple towers + TowerMotionMesh => ED%y(1)%TowerLn2Mesh CALL AllocAry(p_FAST%VTK_Surface%TowerRad,TowerMotionMesh%NNodes,'VTK_Surface%TowerRad',ErrStat2,ErrMsg2) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) @@ -4196,11 +3975,12 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData ELSE call WrScr('Using generic blade surfaces for ElastoDyn (rectangular airfoil, constant chord). ') ! TODO make this an option DO K=1,NumBl - rootNode = ED%y%BladeLn2Mesh(K)%NNodes - tipNode = ED%y%BladeLn2Mesh(K)%NNodes-1 - cylNode = min(2,ED%y%BladeLn2Mesh(K)%NNodes) + ! TODO: Support multiple rotors + rootNode = ED%y(1)%BladeLn2Mesh(K)%NNodes + tipNode = ED%y(1)%BladeLn2Mesh(K)%NNodes-1 + cylNode = min(2,ED%y(1)%BladeLn2Mesh(K)%NNodes) - call SetVTKDefaultBladeParams(ED%y%BladeLn2Mesh(K), p_FAST%VTK_Surface%BladeShape(K), tipNode, rootNode, cylNode, 4, ErrStat2, ErrMsg2) + call SetVTKDefaultBladeParams(ED%y(1)%BladeLn2Mesh(K), p_FAST%VTK_Surface%BladeShape(K), tipNode, rootNode, cylNode, 4, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF (ErrStat >= AbortErrLev) RETURN END DO @@ -4723,53 +4503,14 @@ SUBROUTINE ExtLd_SetInitInput(InitInData_ExtLd, InitOutData_ED, y_ED, InitOutDat RETURN END SUBROUTINE ExtLd_SetInitInput -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine sets the number of subcycles (substeps) for modules at initialization, checking to make sure that their requested -!! time step is valid. -SUBROUTINE SetModuleSubstepTime(ModuleID, p_FAST, y_FAST, ErrStat, ErrMsg) - INTEGER(IntKi), INTENT(IN ) :: ModuleID !< ID of the module to check time step and set - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - ErrStat = ErrID_None - ErrMsg = "" - - IF ( EqualRealNos( p_FAST%dt_module( ModuleID ), p_FAST%dt ) ) THEN - p_FAST%n_substeps(ModuleID) = 1 - ELSE - IF ( p_FAST%dt_module( ModuleID ) > p_FAST%dt ) THEN - ErrStat = ErrID_Fatal - ErrMsg = "The "//TRIM(y_FAST%Module_Ver(ModuleID)%Name)//" module time step ("//& - TRIM(Num2LStr(p_FAST%dt_module( ModuleID )))// & - " s) cannot be larger than FAST time step ("//TRIM(Num2LStr(p_FAST%dt))//" s)." - ELSE - ! calculate the number of subcycles: - p_FAST%n_substeps(ModuleID) = NINT( p_FAST%dt / p_FAST%dt_module( ModuleID ) ) - - ! let's make sure THE module DT is an exact integer divisor of the global (FAST) time step: - IF ( .NOT. EqualRealNos( p_FAST%dt, p_FAST%dt_module( ModuleID ) * p_FAST%n_substeps(ModuleID) ) ) THEN - ErrStat = ErrID_Fatal - ErrMsg = "The "//TRIM(y_FAST%Module_Ver(ModuleID)%Name)//" module time step ("//& - TRIM(Num2LStr(p_FAST%dt_module( ModuleID )))// & - " s) must be an integer divisor of the FAST time step ("//TRIM(Num2LStr(p_FAST%dt))//" s)." - END IF - END IF - END IF - - RETURN - -END SUBROUTINE SetModuleSubstepTime !---------------------------------------------------------------------------------------------------------------------------------- !> This writes data to the FAST summary file. -SUBROUTINE FAST_WrSum( p_FAST, y_FAST, MeshMapData, ErrStat, ErrMsg ) +SUBROUTINE FAST_WrSum( p_FAST, y_FAST, m_Glue, ErrStat, ErrMsg ) TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Glue-code simulation outputs (changes value of UnSum) - TYPE(FAST_ModuleMapType), INTENT(IN) :: MeshMapData !< Data for mapping between modules + TYPE(Glue_MiscVarType), INTENT(IN) :: m_Glue !< Glue-code misc vars INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status (level) CHARACTER(*), INTENT(OUT) :: ErrMsg !< Message describing error reported in ErrStat @@ -4809,13 +4550,8 @@ SUBROUTINE FAST_WrSum( p_FAST, y_FAST, MeshMapData, ErrStat, ErrMsg ) IF ((p_FAST%CompElast /= Module_ED) .or. (p_FAST%CompElast /= Module_BD)) DescStr = TRIM(DescStr)//NotUsedTxt WRITE (y_FAST%UnSum,Fmt) TRIM( DescStr ) - DO I = 2,NumModules - IF (p_FAST%ModuleInitialized(I)) THEN - WRITE (y_FAST%UnSum,Fmt) TRIM( GetNVD( y_FAST%Module_Ver( I ) ) ) - !ELSE - ! DescStr = GetNVD( y_FAST%Module_Ver( I ) ) - ! WRITE (y_FAST%UnSum,Fmt) TRIM( DescStr )//NotUsedTxt - END IF + do i = 1, size(m_Glue%ModData) + WRITE (y_FAST%UnSum,Fmt) TRIM( GetNVD( y_FAST%Module_Ver( m_Glue%ModData(i)%ID ) ) ) END DO DescStr = GetNVD( y_FAST%Module_Ver( Module_SED ) ) @@ -4879,7 +4615,11 @@ SUBROUTINE FAST_WrSum( p_FAST, y_FAST, MeshMapData, ErrStat, ErrMsg ) IF ( p_FAST%CompIce /= Module_IceD ) DescStr = TRIM(DescStr)//NotUsedTxt WRITE (y_FAST%UnSum,Fmt) TRIM( DescStr ) + DescStr = GetNVD( y_FAST%Module_Ver( Module_SlD ) ) + IF ( p_FAST%CompSoil /= Module_SlD ) DescStr = TRIM(DescStr)//NotUsedTxt + WRITE (y_FAST%UnSum,Fmt) TRIM( DescStr ) + !.......................... Information from FAST input File ...................................... ! OTHER information we could print here: ! current working directory @@ -4907,20 +4647,22 @@ SUBROUTINE FAST_WrSum( p_FAST, y_FAST, MeshMapData, ErrStat, ErrMsg ) WRITE(y_FAST%UnSum,'(/A,I1,A)' ) 'Interpolation order for input/output time histories: ', p_FAST%InterpOrder, TRIM(DescStr) WRITE(y_FAST%UnSum,'( A,I2)' ) 'Number of correction iterations: ', p_FAST%NumCrctn + !.......................... Data Mapping between Modules ................................................. - !.......................... Information About Coupling ................................................... + write (y_FAST%UnSum, '(/A)') "Module mapping data for transfer and linearization:" - IF ( ALLOCATED( MeshMapData%Jacobian_Opt1 ) ) then ! we're using option 1 - - IF ( p_FAST%CompSub /= Module_None .OR. p_FAST%CompElast == Module_BD .OR. p_FAST%CompMooring == Module_Orca ) THEN ! SubDyn-BeamDyn-HydroDyn-ElastoDyn-ExtPtfm - DescStr = 'ElastoDyn, SubDyn, HydroDyn, OrcaFlex, ExtPtfm_MCKF, and/or BeamDyn' - ELSE ! IF ( p_FAST%CompHydro == Module_HD ) THEN - DescStr = "ElastoDyn to HydroDyn" - END IF - - WRITE(y_FAST%UnSum,'( A,I6)' ) 'Number of rows in Jacobian matrix used for coupling '//TRIM(DescStr)//': ', & - SIZE(MeshMapData%Jacobian_Opt1, 1) - END IF + do i = 1, size(m_Glue%Mappings) + associate (SrcMod => m_Glue%ModData(m_Glue%Mappings(i)%iModSrc), & + DstMod => m_Glue%ModData(m_Glue%Mappings(i)%iModDst)) + if (m_Glue%Mappings(i)%MapType == Map_Custom) then + write (y_FAST%UnSum, *) 'Custom: '//& + trim(SrcMod%Abbr)//'('//trim(Num2LStr(SrcMod%Ins))//") -> "// & + trim(DstMod%Abbr)//'('//trim(Num2LStr(DstMod%Ins))//')' + else + write (y_FAST%UnSum, *) trim(m_Glue%Mappings(i)%Desc) + end if + end associate + end do !.......................... Time step information: ................................................... @@ -4931,10 +4673,10 @@ SUBROUTINE FAST_WrSum( p_FAST, y_FAST, MeshMapData, ErrStat, ErrMsg ) WRITE (y_FAST%UnSum, Fmt ) "-----------------", "---------------", "-------------" Fmt = '(2X,A17,2X,'//TRIM(p_FAST%OutFmt)//',:,T37,2X,I8,:,A)' WRITE (y_FAST%UnSum, Fmt ) "FAST (glue code) ", p_FAST%DT - DO Module_Number=2,NumModules ! assumes glue-code is module number 1 (i.e., MODULE_Glue == 1) - IF (p_FAST%ModuleInitialized(Module_Number)) THEN - WRITE (y_FAST%UnSum, Fmt ) y_FAST%Module_Ver(Module_Number)%Name, p_FAST%DT_module(Module_Number), p_FAST%n_substeps(Module_Number) - END IF + + do i = 1, size(m_Glue%ModData) + if (m_Glue%ModData(i)%Ins > 1) cycle + WRITE (y_FAST%UnSum, Fmt) y_FAST%Module_Ver(m_Glue%ModData(i)%ID)%Name, m_Glue%ModData(i)%DT, m_Glue%ModData(i)%SubSteps END DO IF ( p_FAST%n_DT_Out == 1_IntKi ) THEN WRITE (y_FAST%UnSum, Fmt ) "FAST output files", p_FAST%DT_out, 1_IntKi ! we'll write "1" instead of "1^-1" @@ -5004,4922 +4746,2307 @@ END SUBROUTINE FAST_WrSum !> Routine that calls FAST_Solution0 for one instance of a Turbine data structure. This is a separate subroutine so that the FAST !! driver programs do not need to change or operate on the individual module level. SUBROUTINE FAST_Solution0_T(Turbine, ErrStat, ErrMsg) + USE FAST_Solver, only: FAST_SolverStep0 TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CALL FAST_Solution0(Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) - -END SUBROUTINE FAST_Solution0_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls CalcOutput for the first time of the simulation (at t=0). After the initial solve, data arrays are initialized. -SUBROUTINE FAST_Solution0(p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< ExtLoads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables + CHARACTER(*), parameter :: RoutineName = 'FAST_Solution0' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 INTEGER(IntKi), PARAMETER :: n_t_global = -1 ! loop counter INTEGER(IntKi), PARAMETER :: n_t_global_next = 0 ! loop counter REAL(DbKi) :: t_initial ! next simulation time (t_global_next) - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Solution0' - - - !NOTE: m_FAST%t_global is t_initial in this routine - ErrStat = ErrID_None ErrMsg = "" + + ! NOTE: m_FAST%t_global is t_initial in this routine (used as t_global_next) + t_initial = Turbine%m_FAST%t_global + Turbine%y_FAST%WriteThisStep = NeedWriteOutput(n_t_global_next, t_initial, Turbine%p_FAST) + + if (Turbine%p_FAST%WrSttsTime) then + call SimStatus_FirstTime(Turbine%m_FAST%TiLstPrn, Turbine%m_FAST%PrevClockTime, & + Turbine%m_FAST%SimStrtTime, Turbine%m_FAST%UsrTime2, Turbine%m_FAST%t_global, & + Turbine%p_FAST%TMax, Turbine%p_FAST%TDesc) + end if - t_initial = m_FAST%t_global ! which is used in place of t_global_next - y_FAST%WriteThisStep = NeedWriteOutput(n_t_global_next, t_initial, p_FAST) - - IF (p_FAST%WrSttsTime) then - CALL SimStatus_FirstTime( m_FAST%TiLstPrn, m_FAST%PrevClockTime, m_FAST%SimStrtTime, m_FAST%UsrTime2, t_initial, p_FAST%TMax, p_FAST%TDesc ) - END IF - - + !---------------------------------------------------------------------------- ! Solve input-output relations; this section of code corresponds to Eq. (35) in Gasmi et al. (2013) - ! This code will be specific to the underlying modules + !---------------------------------------------------------------------------- - ! the initial ServoDyn and IfW/Lidar inputs from Simulink: - IF ( p_FAST%CompServo == Module_SrvD ) CALL SrvD_SetExternalInputs( p_FAST, m_FAST, SrvD%Input(1) ) - - if ( P_FAST%CompSeaSt == Module_SeaSt .and. y_FAST%WriteThisStep) then - ! note: SeaState has no inputs and only calculates WriteOutputs, so we don't need to call CalcOutput unless we are writing to the file - call SeaSt_CalcOutput( t_initial, SeaSt%u, SeaSt%p, SeaSt%x(1), SeaSt%xd(1), SeaSt%z(1), SeaSt%OtherSt(1), SeaSt%y, SeaSt%m, ErrStat2, ErrMsg2 ) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Get initial ServoDyn and IfW/Lidar inputs from Simulink + IF (Turbine%p_FAST%CompServo == Module_SrvD) then + CALL SrvD_SetExternalInputs(Turbine%p_FAST, Turbine%m_FAST, Turbine%SrvD%Input(INPUT_CURR,1)) end if - CALL CalcOutputs_And_SolveForInputs( n_t_global, t_initial, STATE_CURR, m_FAST%calcJacobian, m_FAST%NextJacCalcTime, & - p_FAST, m_FAST, y_FAST%WriteThisStep, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - !---------------------------------------------------------------------------------------- - ! Check to see if we should output data this time step: - !---------------------------------------------------------------------------------------- - - CALL WriteOutputToFile(n_t_global_next, t_initial, p_FAST, y_FAST, ED, SED, BD, AD, ADsk, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Perform initial solve + CALL FAST_SolverStep0(Turbine%p_Glue%TC, Turbine%m_Glue%TC, Turbine%m_Glue%ModData, & + Turbine%m_Glue%Mappings, Turbine, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + !---------------------------------------------------------------------------- + ! Write output to file + !---------------------------------------------------------------------------- + + ! Write module output to file + CALL WriteOutputToFile(n_t_global_next, t_initial, Turbine%p_FAST, & + Turbine%y_FAST, Turbine%ED, Turbine%SED, Turbine%BD, & + Turbine%AD, Turbine%ADsk, Turbine%IfW, Turbine%ExtInfw, & + Turbine%SeaSt, Turbine%HD, Turbine%SD, & + Turbine%ExtPtfm, Turbine%SrvD, Turbine%MAP, & + Turbine%FEAM, Turbine%MD, Turbine%Orca, & + Turbine%IceF, Turbine%IceD, Turbine%SlD, & + ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) ! turn off VTK output when - if (p_FAST%WrVTK == VTK_InitOnly) then - ! Write visualization data for initialization (and also note that we're ignoring any errors that occur doing so) - - call WriteVTK(t_initial, p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - + if (Turbine%p_FAST%WrVTK == VTK_InitOnly) then + call WriteVTK(t_initial, Turbine%p_FAST, Turbine%y_FAST, & + Turbine%ED, Turbine%SED, Turbine%BD, Turbine%AD, & + Turbine%IfW, Turbine%ExtInfw, Turbine%SeaSt, Turbine%HD, & + Turbine%SD, Turbine%ExtPtfm, Turbine%SrvD, Turbine%MAP, & + Turbine%FEAM, Turbine%MD, Turbine%Orca, Turbine%IceF, Turbine%IceD, Turbine%SlD) end if + !---------------------------------------------------------------------------- + ! Populate inputs at for ExtrapInterp and copy current state to predicted state + !---------------------------------------------------------------------------- - !............... - ! Copy values of these initial guesses for interpolation/extrapolation and - ! initialize predicted states for j_pc loop (use MESH_NEWCOPY here so we can use MESH_UPDATE copy later) - !............... + ! Initialize input and state arrays for all modules + call FAST_InitInputStateArrays(Turbine%m_Glue%ModData, t_initial, & + Turbine%p_FAST%DT, Turbine, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return - ! Initialize Input-Output arrays for interpolation/extrapolation: + ! Copy solver current state to previous state + call Glue_CopyTC_State(Turbine%m_Glue%TC%StatePred, Turbine%m_Glue%TC%StateCurr, & + MESH_NEWCOPY, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return - CALL FAST_InitIOarrays( m_FAST%t_global, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, IfW, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - -END SUBROUTINE FAST_Solution0 +END SUBROUTINE FAST_Solution0_T !---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the input and output arrays stored for extrapolation. They are initialized after the first input-output solve so that the first -!! extrapolations are used with values from the solution, not just initial guesses. It also creates new copies of the state variables, which need to -!! be stored for the predictor-corrector loop. -SUBROUTINE FAST_InitIOarrays( t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, IfW, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat, ErrMsg ) +!> Routine that calls FAST_InitIOarrays_SubStep for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. +SUBROUTINE FAST_InitIOarrays_SubStep_T(t_initial, Turbine, ErrStat, ErrMsg ) REAL(DbKi), INTENT(IN ) :: t_initial !< start time of the simulation - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ! local variables - INTEGER(IntKi) :: i, j, k ! loop counters INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_InitIOarrays' - + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_InitIOarrays_SubStep_T' + INTEGER(IntKi) :: i, j ErrStat = ErrID_None ErrMsg = "" - ! We fill (S)ED%InputTimes with negative times, but the (S)ED%Input values are identical for each of those times; this allows - ! us to use, e.g., quadratic interpolation that effectively acts as a zeroth-order extrapolation and first-order extrapolation - ! for the first and second time steps. (The interpolation order in the ExtrapInput routines are determined as - ! order = SIZE(ED%Input) - - IF (p_FAST%CompElast == Module_SED) THEN - DO j = 1, p_FAST%InterpOrder + 1 - SED%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - END DO - - DO j = 2, p_FAST%InterpOrder + 1 - CALL SED_CopyInput (SED%Input(1), SED%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL SED_CopyInput (SED%Input(1), SED%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL SED_CopyContState (SED%x( STATE_CURR), SED%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SED_CopyDiscState (SED%xd(STATE_CURR), SED%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SED_CopyConstrState (SED%z( STATE_CURR), SED%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SED_CopyOtherState (SED%OtherSt( STATE_CURR), SED%OtherSt( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSE - - DO j = 1, p_FAST%InterpOrder + 1 - ED%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - END DO - - DO j = 2, p_FAST%InterpOrder + 1 - CALL ED_CopyInput (ED%Input(1), ED%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL ED_CopyInput (ED%Input(1), ED%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL ED_CopyContState (ED%x( STATE_CURR), ED%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_CURR), ED%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_CURR), ED%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_CURR), ED%OtherSt( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ENDIF - - IF (p_FAST%CompElast == Module_BD ) THEN - - DO k = 1,p_FAST%nBeams - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - BD%InputTimes(j,k) = t_initial - (j - 1) * p_FAST%dt - END DO - - DO j = 2, p_FAST%InterpOrder + 1 - CALL BD_CopyInput (BD%Input(1,k), BD%Input(j,k), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL BD_CopyInput (BD%Input(1,k), BD%u(k), MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - ! Initialize predicted states for j_pc loop: - CALL BD_CopyContState (BD%x( k,STATE_CURR), BD%x( k,STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_CURR), BD%xd(k,STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_CURR), BD%z( k,STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_CURR), BD%OtherSt( k,STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Loop through modules + do i = 1, size(Turbine%m_Glue%ModData) - END DO ! nBeams + ! Copy from current input to input save locations + do j = 1, Turbine%p_FAST%InterpOrder + 1 + call FAST_CopyInput(Turbine%m_Glue%ModData(i), Turbine, INPUT_CURR, -j, MESH_NEWCOPY, ErrStat2, ErrMsg2) + call SetErrStat(Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat > AbortErrLev) return + end do - END IF ! CompElast + ! Copy from current state to saved current state + call FAST_CopyStates(Turbine%m_Glue%ModData(i), Turbine, STATE_CURR, STATE_SAVED_CURR, MESH_NEWCOPY, ErrStat2, ErrMsg2) + call SetErrStat(Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat > AbortErrLev) return + ! Copy from predicted state to saved predicted state + call FAST_CopyStates(Turbine%m_Glue%ModData(i), Turbine, STATE_PRED, STATE_SAVED_PRED, MESH_NEWCOPY, ErrStat2, ErrMsg2) + call SetErrStat(Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat > AbortErrLev) return - IF ( p_FAST%CompServo == Module_SrvD ) THEN - ! Initialize Input-Output arrays for interpolation/extrapolation: + end do - DO j = 1, p_FAST%InterpOrder + 1 - SrvD%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - !SrvD_OutputTimes(j) = t_initial - (j - 1) * dt - END DO +END SUBROUTINE FAST_InitIOarrays_SubStep_T - DO j = 2, p_FAST%InterpOrder + 1 - CALL SrvD_CopyInput (SrvD%Input(1), SrvD%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL SrvD_CopyInput (SrvD%Input(1), SrvD%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine that calls FAST_Reset_SubStep for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. +SUBROUTINE FAST_Reset_SubStep_T(t_initial, n_t_global, n_timesteps, Turbine, ErrStat, ErrMsg ) - ! Initialize predicted states for j_pc loop: - CALL SrvD_CopyContState (SrvD%x( STATE_CURR), SrvD%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_CURR), SrvD%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_CURR), SrvD%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState( SrvD%OtherSt(STATE_CURR), SrvD%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + USE BladedInterface, ONLY: CallBladedDLL ! Hack for Bladed-style DLL - END IF ! CompServo + REAL(DbKi), INTENT(IN ) :: t_initial !< initial time + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter + INTEGER(IntKi), INTENT(IN ) :: n_timesteps !< number of time steps to go back + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Reset_SubStep_T' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: old_avrSwap1 ! previous value of avrSwap(1) !hack for Bladed DLL checkpoint/restore + REAL(DbKi) :: t_global ! the time to which states, inputs and outputs are reset + REAL(DbKi), allocatable :: InputTimes(:) + INTEGER(IntKi) :: i, j + + ErrStat = ErrID_None + ErrMsg = "" - IF ( (p_FAST%CompAero == Module_AD) .or. (p_FAST%CompAero == Module_ExtLd) ) THEN - ! Copy values for interpolation/extrapolation: + ! Calculate input times + t_global = t_initial + n_t_global * Turbine%p_FAST%DT + InputTimes = [(t_global - (j - 1) * Turbine%p_FAST%DT, j = 1, Turbine%p_FAST%InterpOrder + 1)] - DO j = 1, p_FAST%InterpOrder + 1 - AD%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - END DO + ! Update the global time + Turbine%m_FAST%t_global = t_global - DO j = 2, p_FAST%InterpOrder + 1 - CALL AD_CopyInput (AD%Input(1), AD%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL AD_CopyInput (AD%Input(1), AD%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Loop through modules + do i = 1, size(Turbine%m_Glue%ModData) + associate (ModData => Turbine%m_Glue%ModData(i)) + ! Copy from current input to input save locations + do j = 1, Turbine%p_FAST%InterpOrder + 1 + call FAST_CopyInput(ModData, Turbine, -j, j, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat > AbortErrLev) return + end do - ! Initialize predicted states for j_pc loop: - CALL AD_CopyContState(AD%x(STATE_CURR), AD%x(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState(AD%xd(STATE_CURR), AD%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState(AD%z(STATE_CURR), AD%z(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState(AD%OtherSt(STATE_CURR), AD%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Copy from current state to saved current state + call FAST_CopyStates(ModData, Turbine, STATE_SAVED_CURR, STATE_CURR, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat > AbortErrLev) return + + ! Copy from predicted state to saved predicted state + call FAST_CopyStates(ModData, Turbine, STATE_SAVED_PRED, STATE_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat > AbortErrLev) return + + ! Select based on module ID + select case (ModData%ID) + case (Module_AD) + Turbine%AD%InputTimes = InputTimes + case (Module_BD) + Turbine%BD%InputTimes(:, ModData%Ins) = InputTimes + case (Module_ED) + Turbine%ED%InputTimes(:, ModData%Ins) = InputTimes + case (Module_ExtPtfm) + Turbine%ExtPtfm%InputTimes = InputTimes + case (Module_FEAM) + case (Module_HD) + Turbine%HD%InputTimes = InputTimes + case (Module_IceD) + Turbine%IceD%InputTimes(:, ModData%Ins) = InputTimes + case (Module_IceF) + Turbine%IceF%InputTimes = InputTimes + case (Module_IfW) + Turbine%IfW%InputTimes = InputTimes + case (Module_MAP) + Turbine%MAP%InputTimes = InputTimes + case (Module_MD) + Turbine%MD%InputTimes = InputTimes +! case (Module_ExtInfw) +! Turbine%ExtInfw%InputTimes = InputTimes + case (Module_Orca) + Turbine%Orca%InputTimes = InputTimes + case (Module_SD) + Turbine%SD%InputTimes = InputTimes + case (Module_SeaSt) + Turbine%SeaSt%InputTimes = InputTimes + case (Module_SrvD) + Turbine%SrvD%InputTimes(:,ModData%Ins) = InputTimes + + ! A hack to restore Bladed-style DLL data + if (Turbine%SrvD%p(ModData%Ins)%UseBladedInterface) then + if (Turbine%SrvD%m(ModData%Ins)%dll_data%avrSWAP( 1) > 0 ) then ! this isn't allocated if UseBladedInterface is FALSE + ! store value to be overwritten + old_avrSwap1 = Turbine%SrvD%m(ModData%Ins)%dll_data%avrSWAP( 1) + Turbine%SrvD%m(ModData%Ins)%dll_data%avrSWAP( 1) = -10 + CALL CallBladedDLL(Turbine%SrvD%Input(INPUT_CURR,ModData%Ins), Turbine%SrvD%p(ModData%Ins), Turbine%SrvD%m(ModData%Ins)%dll_data, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! put values back: + Turbine%SrvD%m(ModData%Ins)%dll_data%avrSWAP( 1) = old_avrSwap1 + end if + end if - ELSEIF ( p_FAST%CompAero == Module_ADsk ) THEN - ! Copy values for interpolation/extrapolation: + case default + call SetErrStat(ErrID_Fatal, "Unknown module "//ModData%Abbr, ErrStat, ErrMsg, RoutineName) + return + end select - DO j = 1, p_FAST%InterpOrder + 1 - ADsk%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - END DO + end associate + end do - DO j = 2, p_FAST%InterpOrder + 1 - CALL ADsk_CopyInput (ADsk%Input(1), ADsk%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL ADsk_CopyInput (ADsk%Input(1), ADsk%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) +END SUBROUTINE FAST_Reset_SubStep_T +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine that calls FAST_Store_SubStep for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. +SUBROUTINE FAST_Store_SubStep_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg) - ! Initialize predicted states for j_pc loop: - CALL ADsk_CopyContState (ADsk%x( STATE_CURR), ADsk%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ADsk_CopyDiscState (ADsk%xd(STATE_CURR), ADsk%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ADsk_CopyConstrState (ADsk%z( STATE_CURR), ADsk%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ADsk_CopyOtherState( ADsk%OtherSt(STATE_CURR), ADsk%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + USE BladedInterface, ONLY: CallBladedDLL ! Hack for Bladed-style DLL - END IF ! CompAero == Module_AD - - - - IF ( p_FAST%CompInflow == Module_IfW ) THEN - ! Copy values for interpolation/extrapolation: + REAL(DbKi), INTENT(IN ) :: t_initial !< initial time + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Store_SubStep_T' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: i, j ! generic loop counters + REAL(DbKi) :: t_global ! the time to which states, inputs and outputs are reset + INTEGER(IntKi) :: old_avrSwap1 ! previous value of avrSwap(1) !hack for Bladed DLL checkpoint/restore - DO j = 1, p_FAST%InterpOrder + 1 - IfW%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - !IfW%OutputTimes(i) = t_initial - (j - 1) * dt - END DO + ErrStat = ErrID_None + ErrMsg = "" - DO j = 2, p_FAST%InterpOrder + 1 - CALL InflowWind_CopyInput (IfW%Input(1), IfW%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL InflowWind_CopyInput (IfW%Input(1), IfW%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + t_global = t_initial + n_t_global * Turbine%p_FAST%DT + ! Loop through modules + do i = 1, size(Turbine%m_Glue%ModData) + associate (ModData => Turbine%m_Glue%ModData(i)) - ! Initialize predicted states for j_pc loop: - CALL InflowWind_CopyContState (IfW%x( STATE_CURR), IfW%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (IfW%xd(STATE_CURR), IfW%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (IfW%z( STATE_CURR), IfW%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState( IfW%OtherSt(STATE_CURR), IfW%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Copy from current input to input save locations + do j = 1, Turbine%p_FAST%InterpOrder + 1 + call FAST_CopyInput(ModData, Turbine, j, -j, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat > AbortErrLev) return + end do - END IF ! CompInflow == Module_IfW + ! Copy from current state to saved current state + call FAST_CopyStates(ModData, Turbine, STATE_CURR, STATE_SAVED_CURR, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat > AbortErrLev) return + + ! Copy from predicted state to saved predicted state + call FAST_CopyStates(ModData, Turbine, STATE_PRED, STATE_SAVED_PRED, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat > AbortErrLev) return + + ! A hack to store Bladed-style DLL data + if (ModData%ID == Module_SrvD) then + if (Turbine%SrvD%p(ModData%Ins)%UseBladedInterface) then + if (Turbine%SrvD%m(ModData%Ins)%dll_data%avrSWAP(ModData%Ins) > 0) then ! this isn't allocated if UseBladedInterface is FALSE + ! store value to be overwritten + old_avrSwap1 = Turbine%SrvD%m(ModData%Ins)%dll_data%avrSWAP(ModData%Ins) + Turbine%SrvD%m(ModData%Ins)%dll_data%avrSWAP(ModData%Ins) = -11 + CALL CallBladedDLL(Turbine%SrvD%Input(INPUT_CURR,ModData%Ins), Turbine%SrvD%p(ModData%Ins), Turbine%SrvD%m(ModData%Ins)%dll_data, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! put values back: + Turbine%SrvD%m(ModData%Ins)%dll_data%avrSWAP(ModData%Ins) = old_avrSwap1 + end if + end if + end if + end associate + end do - IF ( p_FAST%CompHydro == Module_HD ) THEN - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - HD%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - !HD_OutputTimes(i) = t_initial - (j - 1) * dt - END DO +END SUBROUTINE FAST_Store_SubStep_T - DO j = 2, p_FAST%InterpOrder + 1 - CALL HydroDyn_CopyInput (HD%Input(1), HD%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL HydroDyn_CopyInput (HD%Input(1), HD%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine that calls FAST_Solution for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. +SUBROUTINE FAST_Solution_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) + REAL(DbKi), INTENT(IN ) :: t_initial !< initial time + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ! Initialize predicted states for j_pc loop: - CALL HydroDyn_CopyContState (HD%x( STATE_CURR), HD%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_CURR), HD%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_CURR), HD%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState( HD%OtherSt(STATE_CURR), HD%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Solution' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: n_t_global_next ! n_t_global + 1 + REAL(R8Ki) :: t_global_next - END IF !CompHydro + ErrStat = ErrID_None + ErrMsg = '' + ! Calculate next global time + n_t_global_next = n_t_global + 1 + t_global_next = t_initial + n_t_global_next*Turbine%p_FAST%DT - IF (p_FAST%CompSub == Module_SD ) THEN + !---------------------------------------------------------------------------- + ! Step 1.a: set some variables and Extrapolate Inputs + !---------------------------------------------------------------------------- - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - SD%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - !SD_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + call FAST_Prework_T(t_initial, n_t_global, Turbine, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - DO j = 2, p_FAST%InterpOrder + 1 - CALL SD_CopyInput (SD%Input(1), SD%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL SD_CopyInput (SD%Input(1), SD%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + !---------------------------------------------------------------------------- + ! Step 1.b: Advance states (yield state and constraint values at t_global_next) + ! Step 1.c: Input-Output Solve + ! Step 2: Correct (continue in loop) + !---------------------------------------------------------------------------- + call FAST_UpdateStates_T(t_initial, n_t_global, Turbine, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ! Initialize predicted states for j_pc loop: - CALL SD_CopyContState (SD%x( STATE_CURR), SD%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (SD%xd(STATE_CURR), SD%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState (SD%z( STATE_CURR), SD%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState( SD%OtherSt(STATE_CURR), SD%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + !---------------------------------------------------------------------------- + ! Step 3: Save all final variables (advance to next time) and reset global time + !---------------------------------------------------------------------------- - ELSE IF (p_FAST%CompSub == Module_ExtPtfm ) THEN + call FAST_AdvanceToNextTimeStep_T(t_initial, n_t_global, Turbine, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - ExtPtfm%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - END DO + !---------------------------------------------------------------------------- + ! Write output data to file + !---------------------------------------------------------------------------- - DO j = 2, p_FAST%InterpOrder + 1 - CALL ExtPtfm_CopyInput (ExtPtfm%Input(1), ExtPtfm%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL ExtPtfm_CopyInput (ExtPtfm%Input(1), ExtPtfm%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call WriteOutputToFile(n_t_global_next, t_global_next, Turbine%p_FAST, Turbine%y_FAST, Turbine%ED, Turbine%SED, Turbine%BD, & + Turbine%AD, Turbine%ADsk, Turbine%IfW, Turbine%ExtInfw, Turbine%SeaSt, Turbine%HD, Turbine%SD, & + Turbine%ExtPtfm, Turbine%SrvD, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & + Turbine%IceF, Turbine%IceD, Turbine%SlD, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + !---------------------------------------------------------------------------- + ! Display simulation status every SttsTime-seconds (i.e., n_SttsTime steps): + !---------------------------------------------------------------------------- - ! Initialize predicted states for j_pc loop: - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_CURR), ExtPtfm%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_CURR), ExtPtfm%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_CURR), ExtPtfm%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState( ExtPtfm%OtherSt(STATE_CURR), ExtPtfm%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF ! CompSub + if (Turbine%p_FAST%WrSttsTime) then + if (MOD(n_t_global_next, Turbine%p_FAST%n_SttsTime) == 0) then + call SimStatus(Turbine%m_FAST%TiLstPrn, Turbine%m_FAST%PrevClockTime, & + Turbine%m_FAST%t_global, Turbine%p_FAST%TMax, Turbine%p_FAST%TDesc) + end if + end if +END SUBROUTINE FAST_Solution_T - IF (p_FAST%CompMooring == Module_MAP) THEN - ! Copy values for interpolation/extrapolation: +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine that calls FAST_Prework for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. +SUBROUTINE FAST_Prework_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) - DO j = 1, p_FAST%InterpOrder + 1 - MAPp%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - !MAP_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + REAL(DbKi), INTENT(IN ) :: t_initial !< initial time + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - DO j = 2, p_FAST%InterpOrder + 1 - CALL MAP_CopyInput (MAPp%Input(1), MAPp%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL MAP_CopyInput (MAPp%Input(1), MAPp%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL MAP_CopyContState (MAPp%x( STATE_CURR), MAPp%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_CURR), MAPp%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_CURR), MAPp%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( p_FAST%n_substeps( MODULE_MAP ) > 1 ) THEN - CALL MAP_CopyOtherState( MAPp%OtherSt, MAPp%OtherSt_old, MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Prework' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: n_t_global_next ! n_t_global + 1 + REAL(DbKi) :: t_global_next ! next simulation time (m_FAST%t_global + p_FAST%dt) + INTEGER(IntKi) :: i - ELSEIF (p_FAST%CompMooring == Module_MD) THEN - ! Copy values for interpolation/extrapolation: + ErrStat = ErrID_None + ErrMsg = "" - DO j = 1, p_FAST%InterpOrder + 1 - MD%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - !MD_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + n_t_global_next = n_t_global + 1 + t_global_next = t_initial + n_t_global_next * Turbine%p_FAST%DT - DO j = 2, p_FAST%InterpOrder + 1 - CALL MD_CopyInput (MD%Input(1), MD%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL MD_CopyInput (MD%Input(1), MD%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL MD_CopyContState (MD%x( STATE_CURR), MD%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_CURR), MD%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_CURR), MD%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState( MD%OtherSt(STATE_CURR), MD%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - FEAM%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - !FEAM_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + ! Set flag for writing output at time t_global_next + Turbine%y_FAST%WriteThisStep = NeedWriteOutput(n_t_global_next, t_global_next, Turbine%p_FAST) - DO j = 2, p_FAST%InterpOrder + 1 - CALL FEAM_CopyInput (FEAM%Input(1), FEAM%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL FEAM_CopyInput (FEAM%Input(1), FEAM%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL FEAM_CopyContState (FEAM%x( STATE_CURR), FEAM%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_CURR), FEAM%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_CURR), FEAM%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState( FEAM%OtherSt(STATE_CURR), FEAM%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompMooring == Module_Orca) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - Orca%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - END DO + ! the ServoDyn inputs from Simulink are for t, not t+dt, so we're going to overwrite the inputs from + ! the previous step before we extrapolate these inputs: + if (Turbine%p_FAST%CompServo == Module_SrvD) then + do i = 1, Turbine%p_FAST%NRotors + call SrvD_SetExternalInputs(Turbine%p_FAST, Turbine%m_FAST, Turbine%SrvD%Input(INPUT_CURR,i)) + end do + end if - DO j = 2, p_FAST%InterpOrder + 1 - CALL Orca_CopyInput (Orca%Input(1), Orca%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL Orca_CopyInput (Orca%Input(1), Orca%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL Orca_CopyContState (Orca%x( STATE_CURR), Orca%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyDiscState (Orca%xd(STATE_CURR), Orca%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyConstrState (Orca%z( STATE_CURR), Orca%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOtherState( Orca%OtherSt(STATE_CURR), Orca%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF ! CompMooring - - - IF (p_FAST%CompIce == Module_IceF ) THEN - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - IceF%InputTimes(j) = t_initial - (j - 1) * p_FAST%dt - !IceF_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + !! ## Step 1.a: Extrapolate Inputs + !! + !! gives predicted values at t+dt + !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - DO j = 2, p_FAST%InterpOrder + 1 - CALL IceFloe_CopyInput (IceF%Input(1), IceF%Input(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL IceFloe_CopyInput (IceF%Input(1), IceF%u, MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + do i = 1, size(Turbine%m_Glue%ModData) + call FAST_ExtrapInterp(Turbine%m_Glue%ModData(i), t_global_next, Turbine, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do +contains - ! Initialize predicted states for j_pc loop: - CALL IceFloe_CopyContState (IceF%x( STATE_CURR), IceF%x( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_CURR), IceF%xd(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_CURR), IceF%z( STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState( IceF%OtherSt(STATE_CURR), IceF%OtherSt(STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF (p_FAST%CompIce == Module_IceD ) THEN +END SUBROUTINE FAST_Prework_T +!---------------------------------------------------------------------------------------------------------------------------------- +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine that calls FAST_UpdateStates for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. +SUBROUTINE FAST_UpdateStates_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) - DO i = 1,p_FAST%numIceLegs + REAL(DbKi), INTENT(IN ) :: t_initial !< initial time + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - IceD%InputTimes(j,i) = t_initial - (j - 1) * p_FAST%dt - !IceD%OutputTimes(j,i) = t_initial - (j - 1) * dt - END DO + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UpdateStates' + INTEGER(IntKi) :: n_t_global_next ! n_t_global + 1 + REAL(DbKi) :: t_global_next ! next simulation time (m_FAST%t_global + p_FAST%dt) - DO j = 2, p_FAST%InterpOrder + 1 - CALL IceD_CopyInput (IceD%Input(1,i), IceD%Input(j,i), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL IceD_CopyInput (IceD%Input(1,i), IceD%u(i), MESH_NEWCOPY, Errstat2, ErrMsg2) ! do this to initialize meshes/allocatable arrays for output of ExtrapInterp routine - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ErrStat = ErrID_None + ErrMsg = "" + ! Calculate time + n_t_global_next = n_t_global + 1 + t_global_next = t_initial + n_t_global_next*Turbine%p_FAST%DT - ! Initialize predicted states for j_pc loop: - CALL IceD_CopyContState (IceD%x( i,STATE_CURR), IceD%x( i,STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(i,STATE_CURR), IceD%xd(i,STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( i,STATE_CURR), IceD%z( i,STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState( IceD%OtherSt(i,STATE_CURR), IceD%OtherSt(i,STATE_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + !! Solver Step + !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - END DO ! numIceLegs + ! Advance simulation one step and calculate outputs + CALL FAST_SolverStep(n_t_global, t_initial, Turbine%p_Glue%TC, Turbine%m_Glue%TC, & + Turbine%m_Glue%ModData, Turbine%m_Glue%Mappings, Turbine, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return - END IF ! CompIce +END SUBROUTINE FAST_UpdateStates_T -END SUBROUTINE FAST_InitIOarrays !---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FAST_InitIOarrays_SubStep for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!> Routine that calls FAST_AdvanceToNextTimeStep for one instance of a Turbine data structure. This is a separate subroutine so that the FAST !! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_InitIOarrays_SubStep_T(t_initial, Turbine, ErrStat, ErrMsg ) +SUBROUTINE FAST_AdvanceToNextTimeStep_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) - REAL(DbKi), INTENT(IN ) :: t_initial !< start time of the simulation - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + REAL(DbKi), INTENT(IN ) :: t_initial !< initial time + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_InitIOarrays_SubStep_T' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_AdvanceToNextTimeStep' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + REAL(DbKi) :: t_global_next ! next simulation time (m_FAST%t_global + p_FAST%dt) + INTEGER(IntKi) :: i - CALL FAST_InitIOarrays_SubStep(t_initial, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ExtLd, Turbine%IfW, & - Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, ErrStat2, ErrMsg2 ) + ErrStat = ErrID_None + ErrMsg = "" - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + !! ## Step 3: Save all final variables (advance to next time) + !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + ! Copy solver predicted state to current state + call Glue_CopyTC_State(Turbine%m_Glue%TC%StatePred, Turbine%m_Glue%TC%StateCurr, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return -END SUBROUTINE FAST_InitIOarrays_SubStep_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine initializes the input and output arrays stored for extrapolation when used in a sub-timestepping mode with an external driver program. They are initialized after the first input-output solve so that the first -!! extrapolations are used with values from the solution, not just initial guesses. It also creates new copies of the state variables, which need to -!! be stored for the predictor-corrector loop. -SUBROUTINE FAST_InitIOarrays_SubStep( t_initial, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, ExtLd, IfW, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat, ErrMsg ) + ! Copy the final predicted states from step t_global_next to actual states for that step + do i = 1, size(Turbine%m_Glue%ModData) + call FAST_CopyStates(Turbine%m_Glue%ModData(i), Turbine, STATE_PRED, STATE_CURR, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do - REAL(DbKi), INTENT(IN ) :: t_initial !< start time of the simulation - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Miscellaneous variables + !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + !! We've advanced everything to the next time step: + !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< ExtLoads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + !! update the global time + t_global_next = n_t_global+1 + Turbine%m_FAST%t_global = t_initial + t_global_next * Turbine%p_FAST%DT + +END SUBROUTINE FAST_AdvanceToNextTimeStep_T + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine that calls FAST_WriteOutput for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. +SUBROUTINE FAST_WriteOutput_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) + REAL(DbKi), INTENT(IN ) :: t_initial !< initial time + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ! local variables - INTEGER(IntKi) :: i, j, k ! loop counters + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_WriteOutput' INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_InitIOarrays_SubStep' - + REAL(DbKi) :: t_global ! this simulation time (m_FAST%t_global + p_FAST%dt) ErrStat = ErrID_None ErrMsg = "" - ! We fill ED%InputTimes with negative times, but the ED%Input values are identical for each of those times; this allows - ! us to use, e.g., quadratic interpolation that effectively acts as a zeroth-order extrapolation and first-order extrapolation - ! for the first and second time steps. (The interpolation order in the ExtrapInput routines are determined as - ! order = SIZE(ED%Input) - - DO j = 1, p_FAST%InterpOrder + 1 - ED%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - !ED_OutputTimes(p_FAST%InterpOrder + 1 + j) = t_initial - (j - 1) * dt - END DO + ! Calculate current time + t_global = t_initial + n_t_global*Turbine%p_FAST%DT - DO j = 1, p_FAST%InterpOrder + 1 - CALL ED_CopyInput (ED%Input(1), ED%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + !---------------------------------------------------------------------------- + !! Write output (subroutine checks y_FAST%WriteThisStep internally) + !---------------------------------------------------------------------------- - CALL ED_CopyOutput (ED%y, ED%Output_bak(1), MESH_NEWCOPY, Errstat2, ErrMsg2) !BJJ: THIS IS REALLY ONLY NECESSARY FOR ED-HD COUPLING AT THE MOMENT - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + call WriteOutputToFile(n_t_global, t_global, Turbine%p_FAST, Turbine%y_FAST, & + Turbine%ED, Turbine%SED, Turbine%BD, Turbine%AD, Turbine%ADsk, Turbine%IfW, Turbine%ExtInfw, & + Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, & + Turbine%SrvD, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & + Turbine%IceF, Turbine%IceD, Turbine%SlD, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - CALL ED_CopyContState (ED%x( STATE_CURR), ED%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_CURR), ED%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_CURR), ED%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_CURR), ED%OtherSt( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ED_CopyContState (ED%x( STATE_PRED), ED%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_PRED), ED%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_PRED), ED%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_PRED), ED%OtherSt( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - IF (p_FAST%CompElast == Module_BD ) THEN - - DO k = 1,p_FAST%nBeams - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - BD%InputTimes_Saved(j,k) = t_initial - (j - 1) * p_FAST%dt - END DO + !---------------------------------------------------------------------------- + !! Display simulation status every SttsTime-seconds (i.e., n_SttsTime steps): + !---------------------------------------------------------------------------- - DO j = 1, p_FAST%InterpOrder + 1 - CALL BD_CopyInput (BD%Input(1,k), BD%Input_Saved(j,k), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + if (Turbine%p_FAST%WrSttsTime) then + if (MOD(n_t_global, Turbine%p_FAST%n_SttsTime ) == 0) then + call SimStatus(Turbine%m_FAST%TiLstPrn, Turbine%m_FAST%PrevClockTime, & + Turbine%m_FAST%t_global, Turbine%p_FAST%TMax, Turbine%p_FAST%TDesc) + end if + end if - ! Initialize predicted states for j_pc loop: - CALL BD_CopyContState (BD%x( k,STATE_CURR), BD%x( k,STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_CURR), BD%xd(k,STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_CURR), BD%z( k,STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_CURR), BD%OtherSt( k,STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) +END SUBROUTINE FAST_WriteOutput_T - ! Initialize predicted states for j_pc loop: - CALL BD_CopyContState (BD%x( k,STATE_PRED), BD%x( k,STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_PRED), BD%xd(k,STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_PRED), BD%z( k,STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_PRED), BD%OtherSt( k,STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) +!---------------------------------------------------------------------------------------------------------------------------------- +! ROUTINES TO OUTPUT WRITE DATA TO FILE AT EACH REQUSTED TIME STEP +!---------------------------------------------------------------------------------------------------------------------------------- +FUNCTION NeedWriteOutput(n_t_global, t_global, p_FAST) + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< Current global time step + REAL(DbKi), INTENT(IN ) :: t_global !< Current global time + TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - END DO ! nBeams + LOGICAL :: NeedWriteOutput !< Function result; if true, WriteOutput values are needed on this time step - END IF ! CompElast + IF ( t_global >= p_FAST%TStart ) THEN ! note that if TStart isn't an multiple of DT_out, we will not necessarially start output to the file at TStart + NeedWriteOutput = MOD( n_t_global, p_FAST%n_DT_Out ) == 0 + ELSE + NeedWriteOutput = .FALSE. + END IF +END FUNCTION NeedWriteOutput +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine determines if it's time to write to the output files--based on a previous call to fast_subs::needwriteoutput--, and +!! calls the routine to write to the files with the output data. It should be called after all the output solves for a given time +!! have been completed, and assumes y_FAST\%WriteThisStep has been set. +SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, SED, BD, AD, ADsk, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & + SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD, ErrStat, ErrMsg) +!............................................................................................................................... + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< Current global time step + REAL(DbKi), INTENT(IN ) :: t_global !< Current global time + TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code + TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - IF ( p_FAST%CompServo == Module_SrvD ) THEN - ! Initialize Input-Output arrays for interpolation/extrapolation: + TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data + TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data + TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data + TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data + TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data + TYPE(AeroDisk_Data), INTENT(IN ) :: ADsk !< AeroDisk data + TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data + TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data + TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data + TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data + TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data + TYPE(ExtPtfm_Data), INTENT(IN ) :: ExtPtfm !< ExtPtfm_MCKF data + TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data + TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data + TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data + TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data + TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data + TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(IN ) :: SlD !< SoilDyn data - DO j = 1, p_FAST%InterpOrder + 1 - SrvD%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - !SrvD_OutputTimes(j) = t_initial - (j - 1) * dt - END DO + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - DO j = 1, p_FAST%InterpOrder + 1 - CALL SrvD_CopyInput (SrvD%Input(1), SrvD%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - ! Initialize predicted states for j_pc loop: - CALL SrvD_CopyContState (SrvD%x( STATE_CURR), SrvD%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_CURR), SrvD%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_CURR), SrvD%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState( SrvD%OtherSt(STATE_CURR), SrvD%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL SrvD_CopyContState (SrvD%x( STATE_PRED), SrvD%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_PRED), SrvD%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_PRED), SrvD%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState( SrvD%OtherSt(STATE_PRED), SrvD%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL SrvD_CopyMisc( SrvD%m, SrvD%m_bak, MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF ! CompServo - - - IF ( (p_FAST%CompAero == Module_AD) .or. (p_FAST%CompAero == Module_ExtLd) ) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - AD%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - END DO + CHARACTER(*), PARAMETER :: RoutineName = 'WriteOutputToFile' - DO j = 1, p_FAST%InterpOrder + 1 - CALL AD_CopyInput (AD%Input(1), AD%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ErrStat = ErrID_None + ErrMsg = "" - ! Initialize predicted states for j_pc loop: - CALL AD_CopyContState(AD%x(STATE_CURR), AD%x(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState(AD%xd(STATE_CURR), AD%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState(AD%z(STATE_CURR), AD%z(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState(AD%OtherSt(STATE_CURR), AD%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Write time-series channel data - ! Initialize predicted states for j_pc loop: - CALL AD_CopyContState(AD%x(STATE_PRED), AD%x(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState(AD%xd(STATE_PRED), AD%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState(AD%z(STATE_PRED), AD%z(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState(AD%OtherSt(STATE_PRED), AD%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + !y_FAST%WriteThisStep = NeedWriteOutput(n_t_global, t_global, p_FAST) + IF ( y_FAST%WriteThisStep ) THEN - END IF ! CompAero == Module_AD + ! Generate glue-code output file + CALL WrOutputLine(t_global, p_FAST, y_FAST, IfW%y%WriteOutput, ExtInfw%y%WriteOutput, & + ED%y, SED%y%WriteOutput, AD%y, ADsk%y%WriteOutput, SrvD%y, SeaSt%y%WriteOutput, & + HD%y%WriteOutput, SD%y%WriteOutput, ExtPtfm%y%WriteOutput, MAPp%y%WriteOutput, & + FEAM%y%WriteOutput, MD%y%WriteOutput, Orca%y%WriteOutput, IceF%y%WriteOutput, & + IceD%y, SlD%y%WriteOutput, BD%y, ErrStat, ErrMsg ) + ENDIF + ! Write visualization data (and also note that we're ignoring any errors that occur doing so) + IF ( p_FAST%WrVTK == VTK_Animate ) THEN + IF ( MOD( n_t_global, p_FAST%n_VTKTime ) == 0 ) THEN + call WriteVTK(t_global, p_FAST, y_FAST, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) + END IF + END IF - IF ( p_FAST%CompInflow == Module_IfW ) THEN - ! Copy values for interpolation/extrapolation: +END SUBROUTINE WriteOutputToFile +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine writes the module output to the primary output file(s). +SUBROUTINE WrOutputLine( t, p_FAST, y_FAST, IfWOutput, ExtInfwOutput, y_ED, SEDOutput, y_AD, ADskOutput, y_SrvD, SeaStOutput, HDOutput, SDOutput, ExtPtfmOutput,& + MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, SlDOutput, y_BD, ErrStat, ErrMsg) - DO j = 1, p_FAST%InterpOrder + 1 - IfW%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - !IfW%OutputTimes(i) = t_initial - (j - 1) * dt - END DO + IMPLICIT NONE - DO j = 1, p_FAST%InterpOrder + 1 - CALL InflowWind_CopyInput (IfW%Input(1), IfW%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ! Passed variables + REAL(DbKi), INTENT(IN) :: t !< Current simulation time, in seconds + TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters + TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Glue-code simulation outputs - ! Initialize predicted states for j_pc loop: - CALL InflowWind_CopyContState (IfW%x( STATE_CURR), IfW%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (IfW%xd(STATE_CURR), IfW%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (IfW%z( STATE_CURR), IfW%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState( IfW%OtherSt(STATE_CURR), IfW%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL InflowWind_CopyContState (IfW%x( STATE_PRED), IfW%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (IfW%xd(STATE_PRED), IfW%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (IfW%z( STATE_PRED), IfW%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState( IfW%OtherSt(STATE_PRED), IfW%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF ! CompInflow == Module_IfW + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: IfWOutput(:) !< InflowWind WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtInfwOutput(:) !< ExternalInflow WriteOutput values + TYPE(ED_OutputType), INTENT(IN) :: y_ED(:) !< ElastoDyn output data + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SEDOutput(:) !< Simplified-ElastoDyn WriteOutput values + TYPE(AD_OutputType), INTENT(IN) :: y_AD !< AeroDyn outputs (WriteOutput values are subset of allocated Rotors) + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ADskOutput(:) !< AeroDisk WriteOutput values + TYPE(SrvD_OutputType), INTENT(IN) :: y_SrvD(:) !< ServoDyn output data + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SeaStOutput(:) !< SeaState WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: HDOutput(:) !< HydroDyn WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SDOutput(:) !< SubDyn WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtPtfmOutput(:) !< ExtPtfm_MCKF WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: MAPOutput(:) !< MAP WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: FEAMOutput(:) !< FEAMooring WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: MDOutput(:) !< MoorDyn WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: OrcaOutput(:) !< OrcaFlex interface WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: IceFOutput(:) !< IceFloe WriteOutput values + TYPE(IceD_OutputType), INTENT(IN) :: y_IceD(:) !< IceDyn outputs (WriteOutput values are subset) + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SlDOutput(:) !< SoilDyn WriteOutput values + TYPE(BD_OutputType), INTENT(IN) :: y_BD(:) !< BeamDyn outputs (WriteOutput values are subset) - IF ( p_FAST%CompHydro == Module_HD ) THEN - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - HD%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - !HD_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message - DO j = 1, p_FAST%InterpOrder + 1 - CALL HydroDyn_CopyInput (HD%Input(1), HD%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ! Local variables. - ! Initialize predicted states for j_pc loop: - CALL HydroDyn_CopyContState (HD%x( STATE_CURR), HD%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_CURR), HD%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_CURR), HD%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState( HD%OtherSt(STATE_CURR), HD%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL HydroDyn_CopyContState (HD%x( STATE_PRED), HD%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_PRED), HD%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_PRED), HD%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState( HD%OtherSt(STATE_PRED), HD%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF !CompHydro - - - IF (p_FAST%CompSub == Module_SD ) THEN - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - SD%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - !SD_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + CHARACTER(200) :: Frmt ! A string to hold a format specifier + CHARACTER(p_FAST%TChanLen) :: TmpStr ! temporary string to print the time output as text - DO j = 1, p_FAST%InterpOrder + 1 - CALL SD_CopyInput (SD%Input(1), SD%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + REAL(ReKi) :: OutputAry(SIZE(y_FAST%ChannelNames)-1) - ! Initialize predicted states for j_pc loop: - CALL SD_CopyContState (SD%x( STATE_CURR), SD%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (SD%xd(STATE_CURR), SD%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState (SD%z( STATE_CURR), SD%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState( SD%OtherSt(STATE_CURR), SD%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL SD_CopyContState (SD%x( STATE_PRED), SD%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (SD%xd(STATE_PRED), SD%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState (SD%z( STATE_PRED), SD%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState( SD%OtherSt(STATE_PRED), SD%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSE IF (p_FAST%CompSub == Module_ExtPtfm ) THEN - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - ExtPtfm%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL ExtPtfm_CopyInput (ExtPtfm%Input(1), ExtPtfm%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - ! Initialize predicted states for j_pc loop: - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_CURR), ExtPtfm%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_CURR), ExtPtfm%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_CURR), ExtPtfm%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState( ExtPtfm%OtherSt(STATE_CURR), ExtPtfm%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_PRED), ExtPtfm%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_PRED), ExtPtfm%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_PRED), ExtPtfm%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState( ExtPtfm%OtherSt(STATE_PRED), ExtPtfm%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF ! CompSub - - - IF (p_FAST%CompMooring == Module_MAP) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - MAPp%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - !MAP_OutputTimes(i) = t_initial - (j - 1) * dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL MAP_CopyInput (MAPp%Input(1), MAPp%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - ! Initialize predicted states for j_pc loop: - CALL MAP_CopyContState (MAPp%x( STATE_CURR), MAPp%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_CURR), MAPp%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_CURR), MAPp%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( p_FAST%n_substeps( MODULE_MAP ) > 1 ) THEN - CALL MAP_CopyOtherState( MAPp%OtherSt, MAPp%OtherSt_old, MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ! Initialize predicted states for j_pc loop: - CALL MAP_CopyContState (MAPp%x( STATE_PRED), MAPp%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_PRED), MAPp%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_PRED), MAPp%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( p_FAST%n_substeps( MODULE_MAP ) > 1 ) THEN - CALL MAP_CopyOtherState( MAPp%OtherSt, MAPp%OtherSt_old, MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ELSEIF (p_FAST%CompMooring == Module_MD) THEN - ! Copy values for interpolation/extrapolation: + ErrStat = ErrID_None + ErrMsg = '' - DO j = 1, p_FAST%InterpOrder + 1 - MD%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - !MD_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + CALL FillOutputAry(p_FAST, y_FAST, IfWOutput, ExtInfwOutput, y_ED, SEDOutput, y_AD, ADskOutput, y_SrvD, SeaStOutput, HDOutput, SDOutput, ExtPtfmOutput, & + MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, SlDOutput, y_BD, OutputAry) - DO j = 1, p_FAST%InterpOrder + 1 - CALL MD_CopyInput (MD%Input(1), MD%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + IF (p_FAST%WrTxtOutFile) THEN - ! Initialize predicted states for j_pc loop: - CALL MD_CopyContState (MD%x( STATE_CURR), MD%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_CURR), MD%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_CURR), MD%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState( MD%OtherSt(STATE_CURR), MD%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL MD_CopyContState (MD%x( STATE_PRED), MD%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_PRED), MD%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_PRED), MD%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState( MD%OtherSt(STATE_PRED), MD%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - FEAM%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - !FEAM_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + ! Write one line of tabular output: + ! Frmt = '(F8.3,'//TRIM(Num2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutFmt )//'))' + Frmt = '"'//p_FAST%Delim//'"'//p_FAST%OutFmt ! format for array elements from individual modules - DO j = 1, p_FAST%InterpOrder + 1 - CALL FEAM_CopyInput (FEAM%Input(1), FEAM%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ! time + WRITE( TmpStr, '('//trim(p_FAST%OutFmt_t)//')' ) t + CALL WrFileNR( y_FAST%UnOu, TmpStr ) - ! Initialize predicted states for j_pc loop: - CALL FEAM_CopyContState (FEAM%x( STATE_CURR), FEAM%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_CURR), FEAM%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_CURR), FEAM%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState( FEAM%OtherSt(STATE_CURR), FEAM%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL FEAM_CopyContState (FEAM%x( STATE_PRED), FEAM%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_PRED), FEAM%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_PRED), FEAM%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState( FEAM%OtherSt(STATE_PRED), FEAM%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompMooring == Module_Orca) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - Orca%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - END DO + ! write the individual module output (convert to SiKi if necessary, so that we don't need to print so many digits in the exponent) + CALL WrNumAryFileNR ( y_FAST%UnOu, REAL(OutputAry,SiKi), Frmt, ErrStat, ErrMsg ) + !IF ( ErrStat >= AbortErrLev ) RETURN - DO j = 1, p_FAST%InterpOrder + 1 - CALL Orca_CopyInput (Orca%Input(1), Orca%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ! write a new line (advance to the next line) + WRITE (y_FAST%UnOu,'()') - ! Initialize predicted states for j_pc loop: - CALL Orca_CopyContState (Orca%x( STATE_CURR), Orca%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyDiscState (Orca%xd(STATE_CURR), Orca%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyConstrState (Orca%z( STATE_CURR), Orca%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOtherState( Orca%OtherSt(STATE_CURR), Orca%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL Orca_CopyContState (Orca%x( STATE_PRED), Orca%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyDiscState (Orca%xd(STATE_PRED), Orca%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyConstrState (Orca%z( STATE_PRED), Orca%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOtherState( Orca%OtherSt(STATE_PRED), Orca%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF ! CompMooring - - - IF (p_FAST%CompIce == Module_IceF ) THEN - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - IceF%InputTimes_Saved(j) = t_initial - (j - 1) * p_FAST%dt - !IceF_OutputTimes(i) = t_initial - (j - 1) * dt - END DO + END IF - DO j = 1, p_FAST%InterpOrder + 1 - CALL IceFloe_CopyInput (IceF%Input(1), IceF%Input_Saved(j), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - ! Initialize predicted states for j_pc loop: - CALL IceFloe_CopyContState (IceF%x( STATE_CURR), IceF%x( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_CURR), IceF%xd(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_CURR), IceF%z( STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState( IceF%OtherSt(STATE_CURR), IceF%OtherSt(STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! Initialize predicted states for j_pc loop: - CALL IceFloe_CopyContState (IceF%x( STATE_PRED), IceF%x( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_PRED), IceF%xd(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_PRED), IceF%z( STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState( IceF%OtherSt(STATE_PRED), IceF%OtherSt(STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompIce == Module_IceD ) THEN - - DO i = 1,p_FAST%numIceLegs - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - IceD%InputTimes_Saved(j,i) = t_initial - (j - 1) * p_FAST%dt - !IceD%OutputTimes(j,i) = t_initial - (j - 1) * dt - END DO + IF (p_FAST%WrBinOutFile) THEN - DO j = 1, p_FAST%InterpOrder + 1 - CALL IceD_CopyInput (IceD%Input(1,i), IceD%Input_Saved(j,i), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ! Write data to array for binary output file - ! Initialize predicted states for j_pc loop: - CALL IceD_CopyContState (IceD%x( i,STATE_CURR), IceD%x( i,STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(i,STATE_CURR), IceD%xd(i,STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( i,STATE_CURR), IceD%z( i,STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState( IceD%OtherSt(i,STATE_CURR), IceD%OtherSt(i,STATE_SAVED_CURR), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( y_FAST%n_Out == y_FAST%NOutSteps ) THEN + ErrStat = ErrID_Warn + ErrMsg = 'Not all data could be written to the binary output file.' + !CALL ProgWarn( 'Not all data could be written to the binary output file.' ) + !this really would only happen if we have an error somewhere else, right? + !otherwise, we could allocate a new, larger array and move existing data + ELSE + y_FAST%n_Out = y_FAST%n_Out + 1 - ! Initialize predicted states for j_pc loop: - CALL IceD_CopyContState (IceD%x( i,STATE_PRED), IceD%x( i,STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(i,STATE_PRED), IceD%xd(i,STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( i,STATE_PRED), IceD%z( i,STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState( IceD%OtherSt(i,STATE_PRED), IceD%OtherSt(i,STATE_SAVED_PRED), MESH_NEWCOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! store time data + IF ( y_FAST%n_Out == 1_IntKi .OR. p_FAST%WrBinMod == FileFmtID_WithTime ) THEN + y_FAST%TimeData(y_FAST%n_Out) = t ! Time associated with these outputs + END IF - END DO ! numIceLegs + ! store individual module data + y_FAST%AllOutData(:, y_FAST%n_Out) = OutputAry - END IF ! CompIce + END IF + END IF -END SUBROUTINE FAST_InitIOarrays_SubStep + RETURN +END SUBROUTINE WrOutputLine !---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FAST_Reset_SubStep for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_Reset_SubStep_T(t_initial, n_t_global, n_timesteps, Turbine, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - INTEGER(IntKi), INTENT(IN ) :: n_timesteps !< number of time steps to go back - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +!> Routine that calls FillOutputAry for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. (Called from Simulink interface.) +SUBROUTINE FillOutputAry_T(T, Outputs) - CALL FAST_Reset_SubStep(t_initial, n_t_global, n_timesteps, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%IfW, Turbine%ExtInfw, & - Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) + TYPE(FAST_TurbineType), INTENT(IN ) :: T !< all data for one instance of a turbine + REAL(ReKi), INTENT( OUT) :: Outputs(:) !< single array of output -END SUBROUTINE FAST_Reset_SubStep_T + CALL FillOutputAry(T%p_FAST, T%y_FAST, & + T%IfW%y%WriteOutput, & + T%ExtInfw%y%WriteOutput, & + T%ED%y, & + T%SED%y%WriteOutput, & + T%AD%y, & + T%ADsk%y%WriteOutput, & + T%SrvD%y, & + T%SeaSt%y%WriteOutput, & + T%HD%y%WriteOutput, & + T%SD%y%WriteOutput, & + T%ExtPtfm%y%WriteOutput, & + T%MAP%y%WriteOutput, & + T%FEAM%y%WriteOutput, & + T%MD%y%WriteOutput, & + T%Orca%y%WriteOutput, & + T%IceF%y%WriteOutput, & + T%IceD%y, & + T%SlD%y%WriteOutput, & + T%BD%y, & + Outputs) + +END SUBROUTINE FillOutputAry_T !---------------------------------------------------------------------------------------------------------------------------------- -!> This routine resets the states, inputs and output data from n_t_global to n_t_global - 1 -SUBROUTINE FAST_Reset_SubStep(t_initial, n_t_global, n_timesteps, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) +!> This routine concatenates all of the WriteOutput values from the module Output into one array to be written to the FAST +!! output file. +SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, ExtInfwOutput, y_ED, SEDOutput, y_AD, ADskOutput, y_SrvD, SeaStOutput, HDOutput, SDOutput, ExtPtfmOutput, & + MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, SlDOutput, y_BD, OutputAry) - USE BladedInterface, ONLY: CallBladedDLL ! Hack for Bladed-style DLL + TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters + TYPE(FAST_OutputFileType),INTENT(IN) :: y_FAST !< Glue-code simulation outputs - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - INTEGER(IntKi), INTENT(IN ) :: n_timesteps !< number of time steps to go back + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: IfWOutput(:) !< InflowWind WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtInfwOutput(:) !< ExternalInflow WriteOutput values + TYPE(ED_OutputType), INTENT(IN) :: y_ED(:) !< ElastoDyn WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SEDOutput(:) !< Simplified-ElastoDyn WriteOutput values + TYPE(AD_OutputType), INTENT(IN) :: y_AD !< AeroDyn outputs (WriteOutput values are subset of allocated Rotors) + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ADskOutput(:) !< AeroDisk WriteOutput values + TYPE(SrvD_OutputType), INTENT(IN) :: y_SrvD(:) !< ServoDyn output data + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SeaStOutput(:) !< SeaState WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: HDOutput(:) !< HydroDyn WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SDOutput(:) !< SubDyn WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtPtfmOutput(:) !< ExtPtfm_MCKF WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: MAPOutput(:) !< MAP WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: FEAMOutput(:) !< FEAMooring WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: MDOutput(:) !< MoorDyn WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: OrcaOutput(:) !< OrcaFlex interface WriteOutput values + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: IceFOutput(:) !< IceFloe WriteOutput values + TYPE(IceD_OutputType), INTENT(IN) :: y_IceD(:) !< IceDyn outputs (WriteOutput values are subset) + REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SlDOutput (:) !< SoilDyn WriteOutput values + TYPE(BD_OutputType), INTENT(IN) :: y_BD(:) !< BeamDyn outputs (WriteOutput values are subset) - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables + REAL(ReKi), INTENT(OUT) :: OutputAry(:) !< single array of output - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + INTEGER(IntKi) :: i ! loop counter + INTEGER(IntKi) :: IndexLast ! The index of the last row value to be written to AllOutData for this time step (column). + INTEGER(IntKi) :: IndexNext ! The index of the next row value to be written to AllOutData for this time step (column). - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + ! store individual module data into one array for output - ! local variables - INTEGER(IntKi) :: i, j, k ! generic loop counters - REAL(DbKi) :: t_global ! the time to which states, inputs and outputs are reset - INTEGER(IntKi) :: old_avrSwap1 ! previous value of avrSwap(1) !hack for Bladed DLL checkpoint/restore + IndexLast = 0 + IndexNext = 1 - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Reset_SubStep' + if (y_FAST%numOuts(Module_Glue) > 1) then ! if we output more than just the time channel.... + IndexLast = y_FAST%numOuts(Module_Glue) - 1 + OutputAry(IndexNext:IndexLast) = y_FAST%DriverWriteOutput(1:y_FAST%numOuts(Module_Glue)-1) + IndexNext = IndexLast + 1 + end if + if (y_FAST%numOuts(Module_IfW) > 0) then + IndexLast = IndexNext + size(IfWOutput) - 1 + OutputAry(IndexNext:IndexLast) = IfWOutput + IndexNext = IndexLast + 1 + end if - ErrStat = ErrID_None - ErrMsg = "" + if (y_FAST%numOuts(Module_ExtInfw) > 0) then + IndexLast = IndexNext + size(ExtInfwOutput) - 1 + OutputAry(IndexNext:IndexLast) = ExtInfwOutput + IndexNext = IndexLast + 1 + end if + if (y_FAST%numOuts(Module_ED) > 0) then + do i = 1, p_FAST%NRotors + if (.not. allocated(y_ED(i)%WriteOutput)) cycle + IndexLast = IndexNext + size(y_ED(i)%WriteOutput) - 1 + OutputAry(IndexNext:IndexLast) = y_ED(i)%WriteOutput + IndexNext = IndexLast + 1 + end do + end if - t_global = t_initial + n_t_global * p_FAST%DT + if (y_FAST%numOuts(Module_SED) > 0) then + IndexLast = IndexNext + size(SEDOutput) - 1 + OutputAry(IndexNext:IndexLast) = SEDOutput + IndexNext = IndexLast + 1 + end if - !---------------------------------------------------------------------------------------- - !! copy the stored states and inputs from n_t_global the current states and inputs - !---------------------------------------------------------------------------------------- + if (y_FAST%numOuts(Module_BD) > 0) then + do i = 1, p_FAST%NumBD + if (.not. allocated(y_BD(i)%WriteOutput)) cycle + IndexLast = IndexNext + size(y_BD(i)%WriteOutput) - 1 + OutputAry(IndexNext:IndexLast) = y_BD(i)%WriteOutput + IndexNext = IndexLast + 1 + end do + end if - DO j = 1, p_FAST%InterpOrder + 1 - ED%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - !ED_OutputTimes(j) = t_global - (j - 1) * dt - END DO + if (y_FAST%numOuts(Module_AD) > 0) then + do i = 1, p_FAST%NRotors + if (.not. allocated(y_AD%Rotors(i)%WriteOutput)) cycle + IndexLast = IndexNext + size(y_AD%Rotors(i)%WriteOutput) - 1 + OutputAry(IndexNext:IndexLast) = y_AD%Rotors(i)%WriteOutput + IndexNext = IndexLast + 1 + end do + end if - DO j = 1, p_FAST%InterpOrder + 1 - CALL ED_CopyInput (ED%Input_Saved(j), ED%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL ED_CopyOutput (ED%Output_bak(1), ED%y, MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ! ElastoDyn: copy final predictions to actual states - CALL ED_CopyContState (ED%x( STATE_SAVED_PRED), ED%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_SAVED_PRED), ED%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_SAVED_PRED), ED%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_SAVED_PRED), ED%OtherSt( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ED_CopyContState (ED%x( STATE_SAVED_CURR), ED%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_SAVED_CURR), ED%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_SAVED_CURR), ED%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_SAVED_CURR), ED%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - IF (p_FAST%CompElast == Module_BD ) THEN - - DO k = 1,p_FAST%nBeams - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - BD%InputTimes(j,k) = t_global - (j - 1) * p_FAST%dt - END DO + if (y_FAST%numOuts(Module_ADsk) > 0) then + IndexLast = IndexNext + size(ADskOutput) - 1 + OutputAry(IndexNext:IndexLast) = ADskOutput + IndexNext = IndexLast + 1 + end if - DO j = 1, p_FAST%InterpOrder + 1 - CALL BD_CopyInput (BD%Input_Saved(j,k), BD%Input(j,k), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + if (y_FAST%numOuts(Module_SrvD) > 0) then + do i = 1, p_FAST%NRotors + if (.not. allocated(y_SrvD(i)%WriteOutput)) cycle + IndexLast = IndexNext + size(y_SrvD(i)%WriteOutput) - 1 + OutputAry(IndexNext:IndexLast) = y_SrvD(i)%WriteOutput + IndexNext = IndexLast + 1 + end do + end if - CALL BD_CopyContState (BD%x( k,STATE_SAVED_PRED), BD%x( k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_SAVED_PRED), BD%xd(k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_SAVED_PRED), BD%z( k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_SAVED_PRED), BD%OtherSt( k,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (y_FAST%numOuts(Module_SeaSt) > 0) then + IndexLast = IndexNext + size(SeaStOutput) - 1 + OutputAry(IndexNext:IndexLast) = SeaStOutput + IndexNext = IndexLast + 1 + end if - CALL BD_CopyContState (BD%x( k,STATE_SAVED_CURR), BD%x( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_SAVED_CURR), BD%xd(k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_SAVED_CURR), BD%z( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_SAVED_CURR), BD%OtherSt( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + if (y_FAST%numOuts(Module_HD) > 0) then + IndexLast = IndexNext + size(HDOutput) - 1 + OutputAry(IndexNext:IndexLast) = HDOutput + IndexNext = IndexLast + 1 + end if - END IF + if (y_FAST%numOuts(Module_SD) > 0) then + IndexLast = IndexNext + size(SDOutput) - 1 + OutputAry(IndexNext:IndexLast) = SDOutput + IndexNext = IndexLast + 1 + end if + + if (y_FAST%numOuts(Module_ExtPtfm) > 0) then + IndexLast = IndexNext + size(ExtPtfmOutput) - 1 + OutputAry(IndexNext:IndexLast) = ExtPtfmOutput + IndexNext = IndexLast + 1 + end if - IF ( p_FAST%CompServo == Module_SrvD ) THEN + if (y_FAST%numOuts(Module_MAP) > 0) then + IndexLast = IndexNext + size(MAPOutput) - 1 + OutputAry(IndexNext:IndexLast) = MAPOutput + IndexNext = IndexLast + 1 + end if + + if (y_FAST%numOuts(Module_MD) > 0) then + IndexLast = IndexNext + size(MDOutput) - 1 + OutputAry(IndexNext:IndexLast) = MDOutput + IndexNext = IndexLast + 1 + end if + + if (y_FAST%numOuts(Module_FEAM) > 0) then + IndexLast = IndexNext + size(FEAMOutput) - 1 + OutputAry(IndexNext:IndexLast) = FEAMOutput + IndexNext = IndexLast + 1 + end if + + if (y_FAST%numOuts(Module_Orca) > 0) then + IndexLast = IndexNext + size(OrcaOutput) - 1 + OutputAry(IndexNext:IndexLast) = OrcaOutput + IndexNext = IndexLast + 1 + end if - ! A hack to restore Bladed-style DLL data - if (SrvD%p%UseBladedInterface) then - if (SrvD%m%dll_data%avrSWAP( 1) > 0 ) then ! this isn't allocated if UseBladedInterface is FALSE - ! store value to be overwritten - old_avrSwap1 = SrvD%m%dll_data%avrSWAP( 1) - SrvD%m%dll_data%avrSWAP( 1) = -10 - CALL CallBladedDLL(SrvD%Input(1), SrvD%p, SrvD%m%dll_data, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! put values back: - SrvD%m%dll_data%avrSWAP( 1) = old_avrSwap1 - end if + if (y_FAST%numOuts(Module_IceF) > 0) then + IndexLast = IndexNext + size(IceFOutput) - 1 + OutputAry(IndexNext:IndexLast) = IceFOutput + IndexNext = IndexLast + 1 + end if + + if (y_FAST%numOuts(Module_IceD) > 0) then + do i = 1, p_FAST%numIceLegs + if (.not. allocated(y_IceD(i)%WriteOutput)) cycle + IndexLast = IndexNext + size(y_IceD(i)%WriteOutput) - 1 + OutputAry(IndexNext:IndexLast) = y_IceD(i)%WriteOutput + IndexNext = IndexLast + 1 + end do end if - ! Initialize Input-Output arrays for interpolation/extrapolation: + if (y_FAST%numOuts(Module_SlD) > 0) then + IndexLast = IndexNext + size(SlDOutput) - 1 + OutputAry(IndexNext:IndexLast) = SlDOutput + IndexNext = IndexLast + 1 + end if - DO j = 1, p_FAST%InterpOrder + 1 - SrvD%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - END DO +END SUBROUTINE FillOutputAry +!---------------------------------------------------------------------------------------------------------------------------------- +SUBROUTINE WriteVTK(t_global, p_FAST, y_FAST, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) + REAL(DbKi), INTENT(IN ) :: t_global !< Current global time + TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code + TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code (only because we're updating VTK_LastWaveIndx) - DO j = 1, p_FAST%InterpOrder + 1 - CALL SrvD_CopyInput (SrvD%Input_Saved(j), SrvD%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data + TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data + TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data + TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data + TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data + TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data + TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data + TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data + TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data + TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data + TYPE(ExtPtfm_Data), INTENT(IN ) :: ExtPtfm !< ExtPtfm_MCKF data + TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data + TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data + TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data + TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data + TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data + TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(IN ) :: SlD !< SoilDyn data - CALL SrvD_CopyContState (SrvD%x( STATE_SAVED_PRED), SrvD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_SAVED_PRED), SrvD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_SAVED_PRED), SrvD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState (SrvD%OtherSt( STATE_SAVED_PRED), SrvD%OtherSt( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyContState (SrvD%x( STATE_SAVED_CURR), SrvD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_SAVED_CURR), SrvD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_SAVED_CURR), SrvD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState (SrvD%OtherSt( STATE_SAVED_CURR), SrvD%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMSg2 + CHARACTER(*), PARAMETER :: RoutineName = 'WriteVTK' - CALL SrvD_CopyMisc( SrvD%m_bak, SrvD%m, MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF + IF ( p_FAST%VTK_Type == VTK_Surf ) THEN + CALL WrVTK_Surfaces(t_global, p_FAST, y_FAST, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) + ELSE IF ( p_FAST%VTK_Type == VTK_Basic ) THEN + CALL WrVTK_BasicMeshes(p_FAST, y_FAST, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) + ELSE IF ( p_FAST%VTK_Type == VTK_All ) THEN + CALL WrVTK_AllMeshes(p_FAST, y_FAST, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) + ELSE IF (p_FAST%VTK_Type==VTK_Old) THEN + if (p_FAST%CompElast /= Module_SED) then !FIXME: SED is not included in these routines!!!! + CALL WriteInputMeshesToFile( ED%Input(1,:), AD%Input(1), SD%Input(1), HD%Input(1), MAPp%Input(1), BD%Input(1,:), TRIM(p_FAST%OutFileRoot)//'.InputMeshes.bin', ErrStat2, ErrMsg2) + CALL WriteMotionMeshesToFile(t_global, ED%y, SD%Input(1), SD%y, HD%Input(1), MAPp%Input(1), BD%y, BD%Input(1,:), y_FAST%UnGra, ErrStat2, ErrMsg2, TRIM(p_FAST%OutFileRoot)//'.gra') + endif + END IF - IF ( (p_FAST%CompAero == Module_AD) .or. (p_FAST%CompAero == Module_ExtLd) ) THEN - ! Copy values for interpolation/extrapolation: + y_FAST%VTK_count = y_FAST%VTK_count + 1 - DO j = 1, p_FAST%InterpOrder + 1 - AD%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - END DO +END SUBROUTINE WriteVTK +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine writes all the committed meshes to VTK-formatted files. It doesn't bother with returning an error code. +SUBROUTINE WrVTK_AllMeshes(p_FAST, y_FAST, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) + use FVW_IO, only: WrVTK_FVW - DO j = 1, p_FAST%InterpOrder + 1 - CALL AD_CopyInput (AD%Input_Saved(j), AD%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code + TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - CALL AD_CopyContState (AD%x( STATE_SAVED_PRED), AD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState (AD%xd(STATE_SAVED_PRED), AD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState (AD%z( STATE_SAVED_PRED), AD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState (AD%OtherSt(STATE_SAVED_PRED), AD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data + TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data + TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data + TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data + TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data + TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data + TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data + TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data + TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data + TYPE(ExtPtfm_Data), INTENT(IN ) :: ExtPtfm !< ExtPtfm data + TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data + TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data + TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data + TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data + TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data + TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(IN ) :: SlD !< SoilDyn data - CALL AD_CopyContState (AD%x( STATE_SAVED_CURR), AD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState (AD%xd(STATE_SAVED_CURR), AD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState (AD%z( STATE_SAVED_CURR), AD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState (AD%OtherSt(STATE_SAVED_CURR), AD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + INTEGER(IntKi) :: k, j, iRot, iBld - END IF ! CompAero == Module_AD + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMSg2 + CHARACTER(*), PARAMETER :: RoutineName = 'WrVTK_AllMeshes' + CHARACTER(10) :: Suffix - IF ( p_FAST%CompInflow == Module_IfW ) THEN - ! Copy values for interpolation/extrapolation: + ! I'm first going to just put all of the meshes that get mapped together, then decide if we're going to print/plot them all - DO j = 1, p_FAST%InterpOrder + 1 - IfW%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - !IfW%OutputTimes(i) = t_global - (j - 1) * dt - END DO + ! ElastoDyn + if (p_FAST%CompElast == Module_ED) then + + ! %BladePtLoads used only when not BD (see below) + do iRot = 1, p_FAST%NRotors - DO j = 1, p_FAST%InterpOrder + 1 - CALL InflowWind_CopyInput (IfW%Input_Saved(j), IfW%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + Suffix = '_R'//Num2LStr(iRot) - CALL InflowWind_CopyContState (IfW%x( STATE_SAVED_PRED), IfW%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (IfW%xd(STATE_SAVED_PRED), IfW%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (IfW%z( STATE_SAVED_PRED), IfW%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState (IfW%OtherSt( STATE_SAVED_PRED), IfW%OtherSt( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! ElastoDyn Outputs (motion) + call MeshWrVTK(p_FAST%TurbinePos, ED%y(iRot)%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_TowerLn2Mesh_motion'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + do K = 1, size(ED%y(iRot)%BladeRootMotion) + call MeshWrVTK(p_FAST%TurbinePos, ED%y(iRot)%BladeRootMotion(k), trim(p_FAST%VTK_OutFileRoot)//'.ED_BladeRootMotion'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + end do - CALL InflowWind_CopyContState (IfW%x( STATE_SAVED_CURR), IfW%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (IfW%xd(STATE_SAVED_CURR), IfW%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (IfW%z( STATE_SAVED_CURR), IfW%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState (IfW%OtherSt( STATE_SAVED_CURR), IfW%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! ElastoDyn inputs (loads) + call MeshWrVTK(p_FAST%TurbinePos, ED%Input(INPUT_CURR,iRot)%TowerPtLoads, trim(p_FAST%VTK_OutFileRoot)//'.ED_TowerPtLoads'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y(iRot)%TowerLn2Mesh) + call MeshWrVTK(p_FAST%TurbinePos, ED%Input(INPUT_CURR,iRot)%HubPtLoad, trim(p_FAST%VTK_OutFileRoot)//'.ED_Hub'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y(iRot)%HubPtMotion) + call MeshWrVTK(p_FAST%TurbinePos, ED%Input(INPUT_CURR,iRot)%NacelleLoads, trim(p_FAST%VTK_OutFileRoot)//'.ED_Nacelle'//Suffix ,& + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y(iRot)%NacelleMotion) + call MeshWrVTK(p_FAST%TurbinePos, ED%Input(INPUT_CURR,iRot)%TFinCMLoads, trim(p_FAST%VTK_OutFileRoot)//'.ED_TailFin'//Suffix ,& + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y(iRot)%TFinCMMotion) + call MeshWrVTK(p_FAST%TurbinePos, ED%Input(INPUT_CURR,iRot)%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_PlatformPtMesh'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y(iRot)%PlatformPtMesh) + end do + end if - END IF ! CompInflow == Module_IfW + ! BeamDyn + IF (p_FAST%CompElast == Module_BD .and. allocated(BD%Input) .and. allocated(BD%y)) THEN - IF ( p_FAST%CompHydro == Module_HD ) THEN - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - HD%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - !HD_OutputTimes(i) = t_global - (j - 1) * dt - END DO + ! BeamDyn inputs + k = 0 + do iRot = 1, p_FAST%NRotors + do iBld = 1, p_FAST%RotNumBld(iRot) - DO j = 1, p_FAST%InterpOrder + 1 - CALL HydroDyn_CopyInput (HD%Input_Saved(j), HD%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + Suffix = '_R'//trim(Num2LStr(iRot))//"B"//Num2LStr(iBld) ! Mesh suffix with rotor and blade number + k = k + 1 ! BeamDyn instance number + + !call MeshWrVTK(p_FAST%TurbinePos, BD%Input(1,k)%RootMotion, trim(p_FAST%VTK_OutFileRoot)//'.BD_RootMotion'//trim(Num2LStr(k)), & + ! y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + !call MeshWrVTK(p_FAST%TurbinePos, BD%Input(INPUT_CURR,k)%HubMotion, trim(p_FAST%VTK_OutFileRoot)//'.BD_HubMotion'//Suffix, & + ! y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + if (p_FAST%BD_OutputSibling) then + call MeshWrVTK(p_FAST%TurbinePos, BD%Input(1,k)%DistrLoad, trim(p_FAST%VTK_OutFileRoot)//'.BD_Blade'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, BD%y(k)%BldMotion) + else + call MeshWrVTK(p_FAST%TurbinePos, BD%y(k)%BldMotion, trim(p_FAST%VTK_OutFileRoot)//'.BD_BldMotion'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + end if + ! if (allocated(MeshMapData%y_BD_BldMotion_4Loads)) then + ! do K=1,NumBl + ! call MeshWrVTK(p_FAST%TurbinePos, BD%Input(1,k)%DistrLoad, trim(p_FAST%VTK_OutFileRoot)//'.BD_DistrLoad'//trim(Num2LStr(k)), & + ! y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, MeshMapData%y_BD_BldMotion_4Loads(k) ) + ! ! skipping PointLoad + ! end do + ! else - CALL HydroDyn_CopyContState (HD%x( STATE_SAVED_PRED), HD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_SAVED_PRED), HD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_SAVED_PRED), HD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState (HD%OtherSt(STATE_SAVED_PRED), HD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! BeamDyn outputs + call MeshWrVTK(p_FAST%TurbinePos, BD%y(k)%ReactionForce, & + trim(p_FAST%VTK_OutFileRoot)//'.BD_ReactionForce_RootMotion'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, BD%Input(1,k)%RootMotion) + end do + end do - CALL HydroDyn_CopyContState (HD%x( STATE_SAVED_CURR), HD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_SAVED_CURR), HD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_SAVED_CURR), HD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState (HD%OtherSt(STATE_SAVED_CURR), HD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ELSE if (p_FAST%CompElast == Module_ED .and. allocated(ED%Input)) then + ! ElastoDyn + do iRot = 1, p_FAST%NRotors + do iBld = 1, p_FAST%RotNumBld(iRot) - END IF !CompHydro + Suffix = '_R'//trim(Num2LStr(iRot))//"B"//Num2LStr(iBld) ! Mesh suffix with rotor and blade number + call MeshWrVTK(p_FAST%TurbinePos, ED%y(iRot)%BladeLn2Mesh(iBld), & + trim(p_FAST%VTK_OutFileRoot)//'.ED_BladeLn2Mesh_motion'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - IF (p_FAST%CompSub == Module_SD ) THEN + call MeshWrVTK(p_FAST%TurbinePos, ED%Input(1,iRot)%BladePtLoads(iBld), & + trim(p_FAST%VTK_OutFileRoot)//'.ED_BladePtLoads'//Suffix, & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y(iRot)%BladeLn2Mesh(iBld)) + end do + end do + ELSE if (p_FAST%CompElast == Module_SED .and. allocated(SED%Input)) then + ! Simplified-ElastoDyn + call MeshWrVTK(p_FAST%TurbinePos, SED%y%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.SED_PlatformPtMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + call MeshWrVTK(p_FAST%TurbinePos, SED%y%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SED_TowerLn2Mesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + call MeshWrVTK(p_FAST%TurbinePos, SED%y%NacelleMotion, trim(p_FAST%VTK_OutFileRoot)//'.SED_NacelleMotion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + call MeshWrVTK(p_FAST%TurbinePos, SED%y%HubPtMotion, trim(p_FAST%VTK_OutFileRoot)//'.SED_HubPtMotion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + do iBld = 1, size(SED%y%BladeRootMotion) + call MeshWrVTK(p_FAST%TurbinePos, SED%y%BladeRootMotion(iBld), & + trim(p_FAST%VTK_OutFileRoot)//'.SED_BladeRootMotion_B'//trim(Num2LStr(iBld)), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + enddo + END IF - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - SD%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - !SD_OutputTimes(i) = t_global - (j - 1) * dt - END DO + ! ServoDyn + if (allocated(SrvD%Input)) then + do iRot = 1, p_FAST%NRotors + if (allocated(SrvD%Input(INPUT_CURR,iRot)%NStCMotionMesh)) then + do j = 1, size(SrvD%Input(INPUT_CURR,iRot)%NStCMotionMesh) + if ( SrvD%Input(INPUT_CURR,iRot)%NStCMotionMesh(j)%Committed ) then + call MeshWrVTK(p_FAST%TurbinePos, SrvD%y(iRot)%NStCLoadMesh(j), & + trim(p_FAST%VTK_OutFileRoot)//'.SrvD_NStC'//trim(num2lstr(j)), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SrvD%Input(INPUT_CURR,iRot)%NStCMotionMesh(j) ) + end if + end do + end if + if (allocated(SrvD%Input(INPUT_CURR,iRot)%TStCMotionMesh)) then + do j = 1, size(SrvD%Input(INPUT_CURR,iRot)%TStCMotionMesh) + if ( SrvD%Input(INPUT_CURR,iRot)%TStCMotionMesh(j)%Committed ) then + call MeshWrVTK(p_FAST%TurbinePos, SrvD%y(iRot)%TStCLoadMesh(j), & + trim(p_FAST%VTK_OutFileRoot)//'.SrvD_TStC'//trim(num2lstr(j)), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, & + SrvD%Input(INPUT_CURR,iRot)%TStCMotionMesh(j) ) + end if + end do + end if + if (allocated(SrvD%Input(INPUT_CURR,iRot)%BStCMotionMesh)) then + do j = 1, size(SrvD%Input(INPUT_CURR,iRot)%BStCMotionMesh,2) + DO iBld = 1, size(SrvD%Input(INPUT_CURR,iRot)%BStCMotionMesh,1) + call MeshWrVTK(p_FAST%TurbinePos, SrvD%y(iRot)%BStCLoadMesh(iBld,j), & + trim(p_FAST%VTK_OutFileRoot)//'.SrvD_BStC'//trim(num2lstr(j))//'B'//trim(num2lstr(iBld)), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, & + SrvD%Input(INPUT_CURR,iRot)%BStCMotionMesh(iBld,j) ) + end do + end do + end if + if (allocated(SrvD%Input(INPUT_CURR,iRot)%SStCMotionMesh)) then + do j = 1, size(SrvD%Input(INPUT_CURR,iRot)%SStCMotionMesh) + if ( SrvD%Input(INPUT_CURR,iRot)%SStCMotionMesh(j)%Committed ) then + call MeshWrVTK(p_FAST%TurbinePos, SrvD%y(iRot)%SStCLoadMesh(j), & + trim(p_FAST%VTK_OutFileRoot)//'.SrvD_SStC'//trim(num2lstr(j)), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, & + SrvD%Input(INPUT_CURR,iRot)%SStCMotionMesh(j) ) + end if + end do + end if + end do + end if - DO j = 1, p_FAST%InterpOrder + 1 - CALL SD_CopyInput (SD%Input_Saved(j), SD%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL SD_CopyContState (SD%x( STATE_SAVED_PRED), SD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (SD%xd(STATE_SAVED_PRED), SD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState (SD%z( STATE_SAVED_PRED), SD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState (SD%OtherSt(STATE_SAVED_PRED), SD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! AeroDyn + IF ( p_FAST%CompAero == Module_AD .and. allocated(AD%Input)) then - CALL SD_CopyContState (SD%x( STATE_SAVED_CURR), SD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (SD%xd(STATE_SAVED_CURR), SD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState (SD%z( STATE_SAVED_CURR), SD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState (SD%OtherSt(STATE_SAVED_CURR), SD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (allocated(AD%Input(INPUT_CURR)%rotors) .and. allocated(AD%y%rotors)) then - ELSE IF (p_FAST%CompSub == Module_ExtPtfm ) THEN + ! Loop through rotors + do iRot = 1, p_FAST%NRotors - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - ExtPtfm%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - END DO + call MeshWrVTK(p_FAST%TurbinePos, AD%y%rotors(iRot)%TowerLoad, & + trim(p_FAST%VTK_OutFileRoot)//'.AD_Tower', & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, & + AD%Input(INPUT_CURR)%rotors(iRot)%TowerMotion ) - DO j = 1, p_FAST%InterpOrder + 1 - CALL ExtPtfm_CopyInput (ExtPtfm%Input_Saved(j), ExtPtfm%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + if (allocated(AD%Input(INPUT_CURR)%rotors(iRot)%BladeRootMotion)) then + do iBld = 1, size(AD%Input(INPUT_CURR)%rotors(iRot)%BladeRootMotion) + call MeshWrVTK(p_FAST%TurbinePos, AD%Input(INPUT_CURR)%rotors(iRot)%BladeRootMotion(iBld), & + trim(p_FAST%VTK_OutFileRoot)//'.AD_BladeRootMotion_R'//trim(Num2LStr(iRot))//"B"//Num2LStr(iBld), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_SAVED_PRED), ExtPtfm%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_SAVED_PRED), ExtPtfm%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_SAVED_PRED), ExtPtfm%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState (ExtPtfm%OtherSt(STATE_SAVED_PRED), ExtPtfm%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! call MeshWrVTK(p_FAST%TurbinePos, AD%Input(INPUT_CURR)%rotors(iRot)%BladeMotion(K), trim(p_FAST%VTK_OutFileRoot)//'.AD_BladeMotion'//trim(num2lstr(k)), & + ! y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + end do + end if - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_SAVED_CURR), ExtPtfm%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_SAVED_CURR), ExtPtfm%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_SAVED_CURR), ExtPtfm%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState (ExtPtfm%OtherSt(STATE_SAVED_CURR), ExtPtfm%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call MeshWrVTK(p_FAST%TurbinePos, AD%Input(INPUT_CURR)%rotors(iRot)%HubMotion, & + trim(p_FAST%VTK_OutFileRoot)//'.AD_HubMotion_R'//Num2LStr(iRot), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - END IF ! CompSub + ! call MeshWrVTK(p_FAST%TurbinePos, AD%Input(INPUT_CURR)%rotors(iRot)%TowerMotion, trim(p_FAST%VTK_OutFileRoot)//'.AD_TowerMotion', & + ! y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + IF (allocated(AD%y%rotors(iRot)%BladeLoad)) then + do iBld = 1, size(AD%y%rotors(iRot)%BladeLoad) + call MeshWrVTK(p_FAST%TurbinePos, AD%y%rotors(iRot)%BladeLoad(iBld), & + trim(p_FAST%VTK_OutFileRoot)//'.AD_Blade_R'//trim(Num2LStr(iRot))//"B"//Num2LStr(iBld), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, & + AD%Input(INPUT_CURR)%rotors(iRot)%BladeMotion(iBld)) + end do + end if + end do + end if - IF (p_FAST%CompMooring == Module_MAP) THEN - ! Copy values for interpolation/extrapolation: + ! FVW submodule of AD15 + if (allocated(AD%m%FVW_u)) then + if (allocated(AD%m%FVW_u(INPUT_CURR)%WingsMesh)) then + DO K = 1, size(AD%m%FVW_u(INPUT_CURR)%WingsMesh) + call MeshWrVTK(p_FAST%TurbinePos, AD%m%FVW_u(INPUT_CURR)%WingsMesh(k), & + trim(p_FAST%VTK_OutFileRoot)//'.FVW_WingsMesh'//trim(num2lstr(k)), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, AD%Input(1)%rotors(1)%BladeMotion(k)) + ! call MeshWrVTK(p_FAST%TurbinePos, AD%Input(1)%BladeMotion(K), & + ! trim(p_FAST%OutFileRoot)//'.AD_BladeMotion'//trim(num2lstr(k)), & + ! y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2 ) + END DO + ! Free wake + call WrVTK_FVW(AD%p%FVW, AD%x(STATE_CURR)%FVW, AD%z(STATE_CURR)%FVW, AD%m%FVW, & + trim(p_FAST%VTK_OutFileRoot)//'.FVW', & + y_FAST%VTK_count, p_FAST%VTK_tWidth, bladeFrame=.FALSE.) ! bladeFrame==.FALSE. to output in global coords + end if + end if + end if - DO j = 1, p_FAST%InterpOrder + 1 - MAPp%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - !MAP_OutputTimes(i) = t_global - (j - 1) * dt - END DO + ! AeroDisk + ! FIXME: add visualization for AeroDisk + + ! HydroDyn + IF ( p_FAST%CompHydro == Module_HD .and. allocated(HD%Input)) THEN + call MeshWrVTK(p_FAST%TurbinePos, HD%Input(1)%PRPMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_PRP', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + call MeshWrVTK(p_FAST%TurbinePos, HD%y%WamitMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_WAMIT', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%Input(1)%WAMITMesh ) + call MeshWrVTK(p_FAST%TurbinePos, HD%y%Morison%Mesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_MorisonPt', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%Input(1)%Morison%Mesh ) + if (HD%y%Morison%VisMesh%Committed) then + call MeshWrVTK(p_FAST%TurbinePos, HD%y%Morison%VisMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_Morison', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%Input(1)%Morison%Mesh ) + endif + END IF - DO j = 1, p_FAST%InterpOrder + 1 - CALL MAP_CopyInput (MAPp%Input_Saved(j), MAPp%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! SubDyn + IF ( p_FAST%CompSub == Module_SD .and. allocated(SD%Input)) THEN + !call MeshWrVTK(p_FAST%TurbinePos, SD%Input(1)%TPMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_TPMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + call MeshWrVTK(p_FAST%TurbinePos, SD%Input(1)%LMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_LMesh_y2Mesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SD%y%y2Mesh ) + call MeshWrVTK(p_FAST%TurbinePos, SD%Input(1)%LMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_LMesh_y3Mesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SD%y%y3Mesh ) + DO j = 1,size(SD%y%y1Mesh) + call MeshWrVTK(p_FAST%TurbinePos, SD%y%y1Mesh(j), trim(p_FAST%VTK_OutFileRoot)//'.SD_y1Mesh_TPMesh'//trim(num2lstr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SD%Input(1)%TPMesh(j) ) END DO + !call MeshWrVTK(p_FAST%TurbinePos, SD%y%y3Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y3Mesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + ELSE IF ( p_FAST%CompSub == Module_ExtPtfm .and. allocated(ExtPtfm%Input)) THEN + call MeshWrVTK(p_FAST%TurbinePos, ExtPtfm%y%PtfmMesh, trim(p_FAST%VTK_OutFileRoot)//'.ExtPtfm', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ExtPtfm%Input(1)%PtfmMesh ) + END IF - CALL MAP_CopyContState (MAPp%x( STATE_SAVED_PRED), MAPp%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_SAVED_PRED), MAPp%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_SAVED_PRED), MAPp%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !CALL MAP_CopyOtherState (MAPp%OtherSt(STATE_SAVED_PRED), MAPp%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - ! CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL MAP_CopyContState (MAPp%x( STATE_SAVED_CURR), MAPp%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_SAVED_CURR), MAPp%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_SAVED_CURR), MAPp%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !CALL MAP_CopyOtherState (MAPp%OtherSt(STATE_SAVED_CURR), MAPp%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - ! CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! MAP + IF ( p_FAST%CompMooring == Module_MAP ) THEN + if (allocated(MAPp%Input)) then + call MeshWrVTK(p_FAST%TurbinePos, MAPp%y%PtFairleadLoad, trim(p_FAST%VTK_OutFileRoot)//'.MAP_PtFairlead', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, MAPp%Input(1)%PtFairDisplacement ) + !call MeshWrVTK(p_FAST%TurbinePos, MAPp%Input(1)%PtFairDisplacement, trim(p_FAST%VTK_OutFileRoot)//'.MAP_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + end if - ELSEIF (p_FAST%CompMooring == Module_MD) THEN - ! Copy values for interpolation/extrapolation: + ! MoorDyn + ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN + if (allocated(MD%Input) .and. allocated(MD%y%CoupledLoads)) then + call MeshWrVTK(p_FAST%TurbinePos, MD%y%CoupledLoads(1), trim(p_FAST%VTK_OutFileRoot)//'.MD_PtFairlead', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, MD%Input(1)%CoupledKinematics(1) ) + !call MeshWrVTK(p_FAST%TurbinePos, MD%Input(1)%CoupledKinematics, trim(p_FAST%VTK_OutFileRoot)//'.MD_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + end if + if (allocated(MD%y%VisLinesMesh)) then + do j=1,size(MD%y%VisLinesMesh) + if (MD%y%VisLinesMesh(j)%Committed) then + call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisLinesMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.MD_Line'//trim(Num2LStr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) + endif + enddo + endif + if (allocated(MD%y%VisRodsMesh)) then + do j=1,size(MD%y%VisRodsMesh) + if (MD%y%VisRodsMesh(j)%Committed) then + call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisRodsMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.MD_Rod'//trim(Num2LStr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) + endif + enddo + endif - DO j = 1, p_FAST%InterpOrder + 1 - MD%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - !MD_OutputTimes(i) = t_global - (j - 1) * dt - END DO + ! FEAMooring + ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN + if (allocated(FEAM%Input)) then + call MeshWrVTK(p_FAST%TurbinePos, FEAM%y%PtFairleadLoad, trim(p_FAST%VTK_OutFileRoot)//'.FEAM_PtFairlead', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, FEAM%Input(1)%PtFairleadDisplacement ) + !call MeshWrVTK(p_FAST%TurbinePos, FEAM%Input(1)%PtFairleadDisplacement, trim(p_FAST%VTK_OutFileRoot)//'.FEAM_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + end if - DO j = 1, p_FAST%InterpOrder + 1 - CALL MD_CopyInput (MD%Input_Saved(j), MD%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ! Orca + ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN + if (allocated(Orca%Input)) then + call MeshWrVTK(p_FAST%TurbinePos, Orca%y%PtfmMesh, trim(p_FAST%VTK_OutFileRoot)//'.Orca_PtfmMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Orca%Input(1)%PtfmMesh ) + !call MeshWrVTK(p_FAST%TurbinePos, Orca%Input(1)%PtfmMesh, trim(p_FAST%VTK_OutFileRoot)//'.Orca_PtfmMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + end if + END IF - CALL MD_CopyContState (MD%x( STATE_SAVED_PRED), MD%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_SAVED_PRED), MD%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_SAVED_PRED), MD%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState (MD%OtherSt(STATE_SAVED_PRED), MD%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! IceFloe + IF ( p_FAST%CompIce == Module_IceF ) THEN + if (allocated(IceF%Input)) then + call MeshWrVTK(p_FAST%TurbinePos, IceF%y%iceMesh, trim(p_FAST%VTK_OutFileRoot)//'.IceF_iceMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, IceF%Input(1)%iceMesh ) + !call MeshWrVTK(p_FAST%TurbinePos, IceF%Input(1)%iceMesh, trim(p_FAST%VTK_OutFileRoot)//'.IceF_iceMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + end if - CALL MD_CopyContState (MD%x( STATE_SAVED_CURR), MD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_SAVED_CURR), MD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_SAVED_CURR), MD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState (MD%OtherSt(STATE_SAVED_CURR), MD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! IceDyn + ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN + if (allocated(IceD%Input) .and. allocated(IceD%y)) then - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN - ! Copy values for interpolation/extrapolation: + DO k = 1,p_FAST%numIceLegs + call MeshWrVTK(p_FAST%TurbinePos, IceD%y(k)%PointMesh, trim(p_FAST%VTK_OutFileRoot)//'.IceD_PointMesh'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, IceD%Input(1,k)%PointMesh ) + !call MeshWrVTK(p_FAST%TurbinePos, IceD%Input(1,k)%PointMesh, trim(p_FAST%VTK_OutFileRoot)//'.IceD_PointMesh_motion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + END DO + end if - DO j = 1, p_FAST%InterpOrder + 1 - FEAM%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - !FEAM_OutputTimes(i) = t_global - (j - 1) * dt - END DO + END IF - DO j = 1, p_FAST%InterpOrder + 1 - CALL FEAM_CopyInput (FEAM%Input_Saved(j), FEAM%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ! SoilDyn + IF ( p_FAST%CompSoil == Module_SlD .and. allocated(SlD%Input)) THEN + call MeshWrVTK(p_FAST%TurbinePos, SlD%y%SoilMesh, trim(p_FAST%VTK_OutFileRoot)//'.SlD_y_SoilMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SlD%Input(1)%SoilMesh ) + ! call MeshWrVTK(p_FAST%TurbinePos, SlD%Input(1)%SoilMesh, trim(p_FAST%VTK_OutFileRoot)//'.SlD_u_SoilMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SlD%y%SoilMesh ) + END IF - CALL FEAM_CopyContState (FEAM%x( STATE_SAVED_PRED), FEAM%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_SAVED_PRED), FEAM%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_SAVED_PRED), FEAM%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState (FEAM%OtherSt( STATE_SAVED_PRED), FEAM%OtherSt( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) +END SUBROUTINE WrVTK_AllMeshes +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine writes a minimal subset of meshes (enough to visualize the turbine) to VTK-formatted files. It doesn't bother with +!! returning an error code. +SUBROUTINE WrVTK_BasicMeshes(p_FAST, y_FAST, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) - CALL FEAM_CopyContState (FEAM%x( STATE_SAVED_CURR), FEAM%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_SAVED_CURR), FEAM%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_SAVED_CURR), FEAM%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState (FEAM%OtherSt( STATE_SAVED_CURR), FEAM%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code + TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - ELSEIF (p_FAST%CompMooring == Module_Orca) THEN - ! Copy values for interpolation/extrapolation: + TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data + TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data + TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data + TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data + TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data + TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data + TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data + TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data + TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data + TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data + TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data + TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data + TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data + TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data + TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(IN ) :: SlD !< SoilDyn data - DO j = 1, p_FAST%InterpOrder + 1 - Orca%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - END DO + INTEGER(IntKi) :: i, j, k, iRot, iBld + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMSg2 + CHARACTER(*), PARAMETER :: RoutineName = 'WrVTK_BasicMeshes' - DO j = 1, p_FAST%InterpOrder + 1 - CALL Orca_CopyInput (Orca%Input_Saved(j), Orca%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL Orca_CopyContState (Orca%x( STATE_SAVED_PRED), Orca%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyDiscState (Orca%xd(STATE_SAVED_PRED), Orca%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyConstrState (Orca%z( STATE_SAVED_PRED), Orca%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOtherState (Orca%OtherSt( STATE_SAVED_PRED), Orca%OtherSt( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Blades + IF ( p_FAST%CompAero == Module_AD .and. ALLOCATED(AD%Input) ) THEN ! These meshes may have airfoil data associated with nodes... + if (allocated(AD%Input(1)%rotors) .and. allocated(AD%y%rotors)) then + do iRot = 1, p_FAST%NRotors + do iBld = 1, p_FAST%RotNumBld(iRot) + call MeshWrVTK(p_FAST%TurbinePos, AD%Input(INPUT_CURR)%rotors(iRot)%BladeMotion(iBld), & + trim(p_FAST%VTK_OutFileRoot)//'.AD_Blade_R'//trim(num2lstr(iRot))//'B'//trim(num2lstr(iBld)), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Sib=AD%y%rotors(iRot)%BladeLoad(iBld) ) + end do + end do + end if + ELSE IF (p_FAST%CompElast == Module_BD .and. ALLOCATED(BD%y)) THEN + j = 0 + do iRot = 1, p_FAST%NRotors + do iBld = 1, p_FAST%RotNumBld(iRot) + j = j + 1 + call MeshWrVTK(p_FAST%TurbinePos, BD%y(j)%BldMotion, & + trim(p_FAST%VTK_OutFileRoot)//'.BD_BldMotion_R'//trim(num2lstr(iRot))//"B"//trim(num2lstr(iBld)), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + end do + end do + ELSE IF ( p_FAST%CompElast == Module_ED ) THEN + do iRot = 1, p_FAST%NRotors + do iBld = 1, p_FAST%RotNumBld(iRot) + call MeshWrVTK(p_FAST%TurbinePos, ED%y(iRot)%BladeLn2Mesh(iBld), & + trim(p_FAST%VTK_OutFileRoot)//'.ED_BladeLn2Mesh_motion_R'//trim(num2lstr(iRot))//'B'//trim(num2lstr(iBld)), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + end do + end do + END IF - CALL Orca_CopyContState (Orca%x( STATE_SAVED_CURR), Orca%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyDiscState (Orca%xd(STATE_SAVED_CURR), Orca%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyConstrState (Orca%z( STATE_SAVED_CURR), Orca%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOtherState (Orca%OtherSt( STATE_SAVED_CURR), Orca%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (p_FAST%CompElast == Module_SED) then + if (allocated(SED%Input)) then + ! Nacelle + call MeshWrVTK(p_FAST%TurbinePos, SED%y%NacelleMotion, trim(p_FAST%VTK_OutFileRoot)//'.SED_NacelleMotion', & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + ! Hub + call MeshWrVTK(p_FAST%TurbinePos, SED%y%HubPtMotion, trim(p_FAST%VTK_OutFileRoot)//'.SED_HubPtMotion', & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + ! Tower motions + call MeshWrVTK(p_FAST%TurbinePos, SED%y%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SED_TowerLn2Mesh', & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + end if + else + if (allocated(ED%Input)) then + do iRot = 1, p_FAST%NRotors + ! Nacelle + call MeshWrVTK(p_FAST%TurbinePos, ED%y(iRot)%NacelleMotion, trim(p_FAST%VTK_OutFileRoot)//'.ED_Nacelle_R'//Num2LStr(iRot), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Sib=ED%Input(INPUT_CURR,iRot)%NacelleLoads) + ! TailFin + call MeshWrVTK(p_FAST%TurbinePos, ED%y(iRot)%TFinCMMotion, trim(p_FAST%VTK_OutFileRoot)//'.ED_TailFin_R'//Num2LStr(iRot), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Sib=ED%Input(INPUT_CURR,iRot)%TFinCMLoads) + ! Hub + call MeshWrVTK(p_FAST%TurbinePos, ED%y(iRot)%HubPtMotion, trim(p_FAST%VTK_OutFileRoot)//'.ED_Hub_R'//Num2LStr(iRot), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Sib=ED%Input(INPUT_CURR,iRot)%HubPtLoad) + ! Tower motions + call MeshWrVTK(p_FAST%TurbinePos, ED%y(iRot)%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_TowerLn2Mesh_motion_R'//Num2LStr(iRot), & + y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) + end do + end if + endif - END IF ! CompMooring + ! ! Substructure + ! call MeshWrVTK(p_FAST%TurbinePos, ED%y%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_PlatformPtMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + ! IF ( p_FAST%CompSub == Module_SD ) THEN + ! call MeshWrVTK(p_FAST%TurbinePos, SD%Input(INPUT_CURR)%TPMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_TPMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + ! call MeshWrVTK(p_FAST%TurbinePos, SD%y%y2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y2Mesh_motion', y_FAST%VTK_count, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + ! call MeshWrVTK(p_FAST%TurbinePos, SD%y%y3Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y3Mesh_motion', y_FAST%VTK_count, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + ! END IF + IF ( p_FAST%CompHydro == Module_HD .and. ALLOCATED(HD%Input)) THEN + call MeshWrVTK(p_FAST%TurbinePos, HD%Input(INPUT_CURR)%WAMITMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_WAMIT', y_FAST%VTK_count, & + p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%y%WAMITMesh ) + call MeshWrVTK(p_FAST%TurbinePos, HD%Input(INPUT_CURR)%Morison%Mesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_MorisonPt', y_FAST%VTK_count, & + p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%y%Morison%Mesh ) + if (HD%y%Morison%VisMesh%Committed) then + call MeshWrVTK(p_FAST%TurbinePos, HD%y%Morison%VisMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_Morison', y_FAST%VTK_count, & + p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%Input(INPUT_CURR)%Morison%Mesh ) + endif + END IF - IF (p_FAST%CompIce == Module_IceF ) THEN - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - IceF%InputTimes(j) = t_global - (j - 1) * p_FAST%dt - !IceF_OutputTimes(i) = t_global - (j - 1) * dt - END DO + ! Mooring Lines? + ! IF ( p_FAST%CompMooring == Module_MAP ) THEN + ! call MeshWrVTK(p_FAST%TurbinePos, MAPp%Input(INPUT_CURR)%PtFairDisplacement, trim(p_FAST%VTK_OutFileRoot)//'.MAP_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + if ( p_FAST%CompMooring == Module_MD ) then + !call MeshWrVTK(p_FAST%TurbinePos, MD%Input(INPUT_CURR)%CoupledKinematics, trim(p_FAST%VTK_OutFileRoot)//'.MD_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + if (allocated(MD%y%VisLinesMesh)) then + do j=1,size(MD%y%VisLinesMesh) + if (MD%y%VisLinesMesh(j)%Committed) then + call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisLinesMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.MD_Line'//trim(Num2LStr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) + endif + enddo + endif + if (allocated(MD%y%VisRodsMesh)) then + do j=1,size(MD%y%VisRodsMesh) + if (MD%y%VisRodsMesh(j)%Committed) then + call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisRodsMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.MD_Rod'//trim(Num2LStr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) + endif + enddo + endif + endif + ! ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN + ! call MeshWrVTK(p_FAST%TurbinePos, FEAM%Input(1)%PtFairleadDisplacement, trim(p_FAST%VTK_OutFileRoot)//'FEAM_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) + ! END IF + +! SoilDyn +! IF ( p_FAST%CompSub == Module_SlD ) THEN +! call MeshWrVTK(p_FAST%TurbinePos, SlD%Input(1)%SoilMesh, trim(p_FAST%OutFileRoot)//'.SlD_uSoilMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) +! call MeshWrVTK(p_FAST%TurbinePos, SlD%y%SoilMesh, trim(p_FAST%OutFileRoot)//'.SlD_ySoilMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) +! END IF - DO j = 1, p_FAST%InterpOrder + 1 - CALL IceFloe_CopyInput (IceF%Input_Saved(j), IceF%Input(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL IceFloe_CopyContState (IceF%x( STATE_SAVED_PRED), IceF%x( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_SAVED_PRED), IceF%xd(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_SAVED_PRED), IceF%z( STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState (IceF%OtherSt(STATE_SAVED_PRED), IceF%OtherSt(STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL IceFloe_CopyContState (IceF%x( STATE_SAVED_CURR), IceF%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_SAVED_CURR), IceF%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_SAVED_CURR), IceF%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState (IceF%OtherSt(STATE_SAVED_CURR), IceF%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompIce == Module_IceD ) THEN - - DO i = 1,p_FAST%numIceLegs - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - IceD%InputTimes(j,i) = t_global - (j - 1) * p_FAST%dt - !IceD%OutputTimes(j,i) = t_global - (j - 1) * dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL IceD_CopyInput (IceD%Input_Saved(j,i), IceD%Input(j,i), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL IceD_CopyContState (IceD%x( i,STATE_SAVED_PRED), IceD%x( i,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(i,STATE_SAVED_PRED), IceD%xd(i,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( i,STATE_SAVED_PRED), IceD%z( i,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState (IceD%OtherSt( i,STATE_SAVED_PRED), IceD%OtherSt( i,STATE_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL IceD_CopyContState (IceD%x( i,STATE_SAVED_CURR), IceD%x( i,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(i,STATE_SAVED_CURR), IceD%xd(i,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( i,STATE_SAVED_CURR), IceD%z( i,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState (IceD%OtherSt( i,STATE_SAVED_CURR), IceD%OtherSt( i,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END DO ! numIceLegs - - END IF ! CompIce - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! We've moved everything back to the initial time step: - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! update the global time - - m_FAST%t_global = t_global -! y_FAST%n_Out = y_FAST%n_Out - n_timesteps - -END SUBROUTINE FAST_Reset_SubStep -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FAST_Store_SubStep for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_Store_SubStep_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CALL FAST_Store_SubStep(t_initial, n_t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%IfW, Turbine%ExtInfw, & - Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) - -END SUBROUTINE FAST_Store_SubStep_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine resets the states, inputs and output data from n_t_global to n_t_global - 1 -SUBROUTINE FAST_Store_SubStep(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - - USE BladedInterface, ONLY: CallBladedDLL ! Hack for Bladed-style DLL - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter +END SUBROUTINE WrVTK_BasicMeshes +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine writes a minimal subset of meshes with surfaces to VTK-formatted files. It doesn't bother with +!! returning an error code. +SUBROUTINE WrVTK_Surfaces(t_global, p_FAST, y_FAST, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) + use FVW_IO, only: WrVTK_FVW + REAL(DbKi), INTENT(IN ) :: t_global !< Current global time TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data), INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules + TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code (only because we're updating VTK_LastWaveIndx) - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data + TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data + TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data + TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data + TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data + TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data + TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data + TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data + TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data + TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data + TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data + TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data + TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data + TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data + TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data + TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop + TYPE(SoilDyn_Data), INTENT(IN ) :: SlD !< SoilDyn data - ! local variables - INTEGER(IntKi) :: i, j, k ! generic loop counters - REAL(DbKi) :: t_global ! the time to which states, inputs and outputs are reset - INTEGER(IntKi) :: old_avrSwap1 ! previous value of avrSwap(1) !hack for Bladed DLL checkpoint/restore + logical, parameter :: OutputFields = .FALSE. ! due to confusion about what fields mean on a surface, we are going to just output the basic meshes if people ask for fields + INTEGER(IntKi) :: iRot, iBld, iBD, L INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Store_SubStep' - - - ErrStat = ErrID_None - ErrMsg = "" - - - t_global = t_initial + n_t_global * p_FAST%DT - - !---------------------------------------------------------------------------------------- - !! copy the stored states and inputs from n_t_global the current states and inputs - !---------------------------------------------------------------------------------------- - - DO j = 1, p_FAST%InterpOrder + 1 - ED%InputTimes_Saved(j) = ED%InputTimes(j) - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL ED_CopyInput (ED%Input(j), ED%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - CALL ED_CopyOutput (ED%y, ED%Output_bak(1), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - ! ElastoDyn: copy final predictions to actual states - CALL ED_CopyContState (ED%x( STATE_PRED), ED%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_PRED), ED%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_PRED), ED%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_PRED), ED%OtherSt( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ED_CopyContState (ED%x( STATE_CURR), ED%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_CURR), ED%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_CURR), ED%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_CURR), ED%OtherSt( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - IF (p_FAST%CompElast == Module_BD ) THEN - - DO k = 1,p_FAST%nBeams - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - BD%InputTimes_Saved(j,k) = BD%InputTimes(j,k) - END DO + CHARACTER(ErrMsgLen) :: ErrMSg2 + CHARACTER(*), PARAMETER :: RoutineName = 'WrVTK_Surfaces' - DO j = 1, p_FAST%InterpOrder + 1 - CALL BD_CopyInput (BD%Input(j,k), BD%Input_Saved(j,k), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ! Ground (written at initialization) - CALL BD_CopyContState (BD%x( k,STATE_PRED), BD%x( k,STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_PRED), BD%xd(k,STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_PRED), BD%z( k,STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_PRED), BD%OtherSt( k,STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Wave elevation + if (allocated(p_FAST%VTK_Surface%WaveElevVisGrid)) call WrVTK_WaveElevVisGrid(t_global, p_FAST, y_FAST, SeaSt) - CALL BD_CopyContState (BD%x( k,STATE_CURR), BD%x( k,STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_CURR), BD%xd(k,STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_CURR), BD%z( k,STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_CURR), BD%OtherSt( k,STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + if (allocated(ED%Input)) then + do iRot = 1, p_FAST%NRotors + ! Nacelle + call MeshWrVTK_PointSurface (p_FAST%TurbinePos, ED%y(iRot)%NacelleMotion, trim(p_FAST%VTK_OutFileRoot)//'.NacelleSurface'//Num2LStr(iRot), & + y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts = p_FAST%VTK_Surface%NacelleBox, Sib=ED%Input(INPUT_CURR,iRot)%NacelleLoads ) + + ! TailFin TODO TailFin + !call MeshWrVTK_PointSurface (p_FAST%TurbinePos, ED%y(iRot)%TFinCMMotion, trim(p_FAST%VTK_OutFileRoot)//'.TailFinSurface'//Num2LStr(iRot), & + ! y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts = p_FAST%VTK_Surface%TFinBox, Sib=ED%Input(INPUT_CURR,iRot)%TFinCMLoads ) + + ! Hub + call MeshWrVTK_PointSurface(p_FAST%TurbinePos, ED%y(iRot)%HubPtMotion, trim(p_FAST%VTK_OutFileRoot)//'.HubSurface'//Num2LStr(iRot), & + y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , & + NumSegments=p_FAST%VTK_Surface%NumSectors, radius=p_FAST%VTK_Surface%HubRad, Sib=ED%Input(INPUT_CURR,iRot)%HubPtLoad ) + + ! Tower motions + call MeshWrVTK_Ln2Surface(p_FAST%TurbinePos, ED%y(iRot)%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.TowerSurface'//Num2LStr(iRot), & + y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, p_FAST%VTK_Surface%NumSectors, p_FAST%VTK_Surface%TowerRad ) + end do + end if + ! Blades + IF (p_FAST%CompAero == Module_AD .and. allocated(AD%Input)) THEN ! These meshes may have airfoil data associated with nodes... + if (allocated(AD%Input(INPUT_CURR)%rotors) .and. allocated(AD%y%rotors)) then + do iRot = 1, p_Fast%NRotors + do iBld = 1, p_FAST%RotNumBld(iRot) + call MeshWrVTK_Ln2Surface(p_FAST%TurbinePos, AD%Input(INPUT_CURR)%rotors(iRot)%BladeMotion(iBld), trim(p_FAST%VTK_OutFileRoot)//'.Blade_R'//trim(num2lstr(iRot))//'B'//trim(num2lstr(iBld))//'Surface', & + y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts=p_FAST%VTK_Surface%BladeShape(iBld)%AirfoilCoords, & + Sib=AD%y%rotors(iRot)%BladeLoad(iBld)) + end do + end do + end if + ELSE IF ( p_FAST%CompElast == Module_BD .and. allocated(BD%y)) THEN + iBD = 0 + do iRot = 1, p_FAST%NRotors + do iBld = 1, p_FAST%RotNumBld(iRot) + iBD = iBD + 1 + call MeshWrVTK_Ln2Surface (p_FAST%TurbinePos, BD%y(iBD)%BldMotion, trim(p_FAST%VTK_OutFileRoot)//'.Blade_R'//trim(num2lstr(iRot))//'B'//trim(num2lstr(iBld))//'Surface', & + y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts=p_FAST%VTK_Surface%BladeShape(iBD)%AirfoilCoords ) + end do + end do + ELSE IF ( p_FAST%CompElast == Module_ED ) THEN + do iRot = 1, p_FAST%NRotors + do iBld = 1, p_FAST%RotNumBld(iRot) + call MeshWrVTK_Ln2Surface (p_FAST%TurbinePos, ED%y(iRot)%BladeLn2Mesh(iBld), trim(p_FAST%VTK_OutFileRoot)//'.ED'//trim(Num2LStr(iRot))//'Blade'//trim(num2lstr(iBld))//'Surface', & + y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts=p_FAST%VTK_Surface%BladeShape(iBld)%AirfoilCoords ) + end do + end do + ! ELSE IF ( p_FAST%CompElast == Module_SED ) THEN ! No surface info from SED END IF - IF ( p_FAST%CompServo == Module_SrvD ) THEN - ! Initialize Input-Output arrays for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - SrvD%InputTimes_Saved(j) = SrvD%InputTimes(j) - END DO + ! Free wake + if (allocated(AD%m%FVW_u)) then + if (allocated(AD%m%FVW_u(1)%WingsMesh)) then + call WrVTK_FVW(AD%p%FVW, AD%x(1)%FVW, AD%z(1)%FVW, AD%m%FVW, trim(p_FAST%VTK_OutFileRoot)//'.FVW', y_FAST%VTK_count, p_FAST%VTK_tWidth, bladeFrame=.FALSE.) ! bladeFrame==.FALSE. to output in global coords + end if + end if - DO j = 1, p_FAST%InterpOrder + 1 - CALL SrvD_CopyInput (SrvD%Input(j), SrvD%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + ! Platform + ! call MeshWrVTK_PointSurface (p_FAST%TurbinePos, ED%y%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.PlatformSurface', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, Radius = p_FAST%VTK_Surface%GroundRad ) - CALL SrvD_CopyContState (SrvD%x( STATE_PRED), SrvD%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_PRED), SrvD%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_PRED), SrvD%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState (SrvD%OtherSt( STATE_PRED), SrvD%OtherSt( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyContState (SrvD%x( STATE_CURR), SrvD%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_CURR), SrvD%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_CURR), SrvD%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState (SrvD%OtherSt( STATE_CURR), SrvD%OtherSt( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Substructure + ! call MeshWrVTK(p_FAST%TurbinePos, ED%y%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_PlatformPtMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) + ! IF ( p_FAST%CompSub == Module_SD ) THEN + ! call MeshWrVTK(p_FAST%TurbinePos, SD%Input(1)%TPMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_TPMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) + ! call MeshWrVTK(p_FAST%TurbinePos, SD%y%y2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y2Mesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) + ! call MeshWrVTK(p_FAST%TurbinePos, SD%y%y3Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y3Mesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) + ! END IF - CALL SrvD_CopyMisc( SrvD%m, SrvD%m_bak, MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) +! SoilDyn +! IF ( p_FAST%CompSub == Module_SlD ) THEN +! call MeshWrVTK(p_FAST%TurbinePos, SlD%Input(1)%SoilMesh, trim(p_FAST%OutFileRoot)//'.SlD_uSoilMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) +! call MeshWrVTK(p_FAST%TurbinePos, SlD%y%SoilMesh, trim(p_FAST%OutFileRoot)//'.SlD_ySoilMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) +! END IF + ! HydroDyn + IF ( HD%y%Morison%VisMesh%Committed ) THEN + call MeshWrVTK_Ln2Surface(p_FAST%TurbinePos, HD%y%Morison%VisMesh, trim(p_FAST%VTK_OutFileRoot)//'.MorisonSurface', & + y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, p_FAST%VTK_Surface%NumSectors, & + p_FAST%VTK_Surface%MorisonVisRad) END IF - IF ( (p_FAST%CompAero == Module_AD) .or. (p_FAST%CompAero == Module_ExtLd) ) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - AD%InputTimes_Saved(j) = AD%InputTimes(j) - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL AD_CopyInput (AD%Input(j), AD%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL AD_CopyContState (AD%x( STATE_PRED), AD%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState (AD%xd(STATE_PRED), AD%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState (AD%z( STATE_PRED), AD%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState (AD%OtherSt(STATE_PRED), AD%OtherSt(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL AD_CopyContState (AD%x( STATE_CURR), AD%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState (AD%xd(STATE_CURR), AD%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState (AD%z( STATE_CURR), AD%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState (AD%OtherSt(STATE_CURR), AD%OtherSt(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF ! CompAero == Module_AD - - IF ( p_FAST%CompInflow == Module_IfW ) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - IfW%InputTimes_Saved(j) = IfW%InputTimes(j) - !IfW%OutputTimes(i) = t_global - (j - 1) * dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL InflowWind_CopyInput (IfW%Input(j), IfW%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL InflowWind_CopyContState (IfW%x( STATE_PRED), IfW%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (IfW%xd(STATE_PRED), IfW%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (IfW%z( STATE_PRED), IfW%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState (IfW%OtherSt( STATE_PRED), IfW%OtherSt( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL InflowWind_CopyContState (IfW%x( STATE_CURR), IfW%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (IfW%xd(STATE_CURR), IfW%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (IfW%z( STATE_CURR), IfW%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState (IfW%OtherSt( STATE_CURR), IfW%OtherSt( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF ! CompInflow == Module_IfW - - - IF ( p_FAST%CompHydro == Module_HD ) THEN - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - HD%InputTimes_Saved(j) = HD%InputTimes(j) - !HD_OutputTimes(i) = t_global - (j - 1) * dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL HydroDyn_CopyInput (HD%Input(j), HD%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL HydroDyn_CopyContState (HD%x( STATE_PRED), HD%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_PRED), HD%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_PRED), HD%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState (HD%OtherSt(STATE_PRED), HD%OtherSt(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL HydroDyn_CopyContState (HD%x( STATE_CURR), HD%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_CURR), HD%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_CURR), HD%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState (HD%OtherSt(STATE_CURR), HD%OtherSt(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF !CompHydro - - - IF (p_FAST%CompSub == Module_SD ) THEN - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - SD%InputTimes_Saved(j) = SD%InputTimes(j) - !SD_OutputTimes(i) = t_global - (j - 1) * dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL SD_CopyInput (SD%Input(j), SD%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL SD_CopyContState (SD%x( STATE_PRED), SD%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (SD%xd(STATE_PRED), SD%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState (SD%z( STATE_PRED), SD%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState (SD%OtherSt(STATE_PRED), SD%OtherSt(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL SD_CopyContState (SD%x( STATE_CURR), SD%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (SD%xd(STATE_CURR), SD%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState (SD%z( STATE_CURR), SD%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState (SD%OtherSt(STATE_CURR), SD%OtherSt(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSE IF (p_FAST%CompSub == Module_ExtPtfm ) THEN - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - ExtPtfm%InputTimes_Saved(j) = ExtPtfm%InputTimes(j) - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL ExtPtfm_CopyInput (ExtPtfm%Input(j), ExtPtfm%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_PRED), ExtPtfm%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_PRED), ExtPtfm%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_PRED), ExtPtfm%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState (ExtPtfm%OtherSt(STATE_PRED), ExtPtfm%OtherSt(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_CURR), ExtPtfm%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_CURR), ExtPtfm%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_CURR), ExtPtfm%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState (ExtPtfm%OtherSt(STATE_CURR), ExtPtfm%OtherSt(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF ! CompSub - - - IF (p_FAST%CompMooring == Module_MAP) THEN - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - MAPp%InputTimes_Saved(j) = MAPp%InputTimes(j) - !MAP_OutputTimes(i) = t_global - (j - 1) * dt - END DO + ! Mooring Lines? + ! IF ( p_FAST%CompMooring == Module_MAP ) THEN + ! call MeshWrVTK(p_FAST%TurbinePos, MAPp%Input(1)%PtFairDisplacement, trim(p_FAST%VTK_OutFileRoot)//'.MAP_PtFair_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) + if ( p_FAST%CompMooring == Module_MD ) THEN + !call MeshWrVTK(p_FAST%TurbinePos, MD%Input(1)%CoupledKinematics, trim(p_FAST%VTK_OutFileRoot)//'.MD_PtFair_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) + if (allocated(MD%y%VisLinesMesh)) then + do L = 1,size(MD%y%VisLinesMesh) + if (MD%y%VisLinesMesh(L)%Committed) then ! No orientation data, so surface representation not possible + call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisLinesMesh(L), trim(p_FAST%VTK_OutFileRoot)//'.MD_Line'//trim(Num2LStr(L)), y_FAST%VTK_count, p_FAST%VTK_fields, & + ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) + endif + enddo + endif + if (allocated(MD%y%VisRodsMesh)) then + do L = 1, size(MD%y%VisRodsMesh) + if (MD%y%VisRodsMesh(L)%Committed) then ! No orientation data, so surface representation not possible + call MeshWrVTK_Ln2Surface(p_FAST%TurbinePos, MD%y%VisRodsMesh(L), trim(p_FAST%VTK_OutFileRoot)//'.MD_Rod'//trim(Num2LStr(L))//'Surface', y_FAST%VTK_count, p_FAST%VTK_fields, & + ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth, NumSegments=p_FAST%VTK_Surface%NumSectors, Radius=MD%p%VisRodsDiam(L)%Diam ) + endif + enddo + endif + endif + ! ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN + ! call MeshWrVTK(p_FAST%TurbinePos, FEAM%Input(1)%PtFairleadDisplacement, trim(p_FAST%VTK_OutFileRoot)//'FEAM_PtFair_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) + ! END IF - DO j = 1, p_FAST%InterpOrder + 1 - CALL MAP_CopyInput (MAPp%Input(j), MAPp%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO + if (p_FAST%VTK_fields) then + call WrVTK_BasicMeshes(p_FAST, y_FAST, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, SlD) + end if - CALL MAP_CopyContState (MAPp%x( STATE_PRED), MAPp%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_PRED), MAPp%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_PRED), MAPp%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !CALL MAP_CopyOtherState (MAPp%OtherSt(STATE_PRED), MAPp%OtherSt(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - ! CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) +END SUBROUTINE WrVTK_Surfaces +!---------------------------------------------------------------------------------------------------------------------------------- +!> This subroutine writes the wave elevation data for a given time step +SUBROUTINE WrVTK_WaveElevVisGrid(t_global, p_FAST, y_FAST, SeaSt) - CALL MAP_CopyContState (MAPp%x( STATE_CURR), MAPp%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_CURR), MAPp%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_CURR), MAPp%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !CALL MAP_CopyOtherState (MAPp%OtherSt(STATE_CURR), MAPp%OtherSt(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - ! CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompMooring == Module_MD) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - MD%InputTimes_Saved(j) = MD%InputTimes(j) - !MD_OutputTimes(i) = t_global - (j - 1) * dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL MD_CopyInput (MD%Input(j), MD%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL MD_CopyContState (MD%x( STATE_PRED), MD%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_PRED), MD%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_PRED), MD%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState (MD%OtherSt(STATE_PRED), MD%OtherSt(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL MD_CopyContState (MD%x( STATE_CURR), MD%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_CURR), MD%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_CURR), MD%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState (MD%OtherSt(STATE_CURR), MD%OtherSt(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - FEAM%InputTimes_Saved(j) = FEAM%InputTimes(j) - !FEAM_OutputTimes(i) = t_global - (j - 1) * dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL FEAM_CopyInput (FEAM%Input(j), FEAM%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL FEAM_CopyContState (FEAM%x( STATE_PRED), FEAM%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_PRED), FEAM%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_PRED), FEAM%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState (FEAM%OtherSt( STATE_PRED), FEAM%OtherSt( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL FEAM_CopyContState (FEAM%x( STATE_CURR), FEAM%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_CURR), FEAM%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_CURR), FEAM%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState (FEAM%OtherSt( STATE_CURR), FEAM%OtherSt( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompMooring == Module_Orca) THEN - ! Copy values for interpolation/extrapolation: - - DO j = 1, p_FAST%InterpOrder + 1 - Orca%InputTimes_Saved(j) = Orca%InputTimes(j) - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL Orca_CopyInput (Orca%Input(j), Orca%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL Orca_CopyContState (Orca%x( STATE_PRED), Orca%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyDiscState (Orca%xd(STATE_PRED), Orca%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyConstrState (Orca%z( STATE_PRED), Orca%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOtherState (Orca%OtherSt( STATE_PRED), Orca%OtherSt( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL Orca_CopyContState (Orca%x( STATE_CURR), Orca%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyDiscState (Orca%xd(STATE_CURR), Orca%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyConstrState (Orca%z( STATE_CURR), Orca%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOtherState (Orca%OtherSt( STATE_CURR), Orca%OtherSt( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END IF ! CompMooring - - - IF (p_FAST%CompIce == Module_IceF ) THEN - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - IceF%InputTimes_Saved(j) = IceF%InputTimes(j) - !IceF_OutputTimes(i) = t_global - (j - 1) * dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL IceFloe_CopyInput (IceF%Input(j), IceF%Input_Saved(j), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL IceFloe_CopyContState (IceF%x( STATE_PRED), IceF%x( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_PRED), IceF%xd(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_PRED), IceF%z( STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState (IceF%OtherSt(STATE_PRED), IceF%OtherSt(STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL IceFloe_CopyContState (IceF%x( STATE_CURR), IceF%x( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_CURR), IceF%xd(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_CURR), IceF%z( STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState (IceF%OtherSt(STATE_CURR), IceF%OtherSt(STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - ELSEIF (p_FAST%CompIce == Module_IceD ) THEN - - DO i = 1,p_FAST%numIceLegs - - ! Copy values for interpolation/extrapolation: - DO j = 1, p_FAST%InterpOrder + 1 - IceD%InputTimes_Saved(j,i) = IceD%InputTimes(j,i) - !IceD%OutputTimes(j,i) = t_global - (j - 1) * dt - END DO - - DO j = 1, p_FAST%InterpOrder + 1 - CALL IceD_CopyInput (IceD%Input(j,i), IceD%Input_Saved(j,i), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat( Errstat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - - CALL IceD_CopyContState (IceD%x( i,STATE_PRED), IceD%x( i,STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(i,STATE_PRED), IceD%xd(i,STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( i,STATE_PRED), IceD%z( i,STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState (IceD%OtherSt( i,STATE_PRED), IceD%OtherSt( i,STATE_SAVED_PRED), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - CALL IceD_CopyContState (IceD%x( i,STATE_CURR), IceD%x( i,STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(i,STATE_CURR), IceD%xd(i,STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( i,STATE_CURR), IceD%z( i,STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState (IceD%OtherSt( i,STATE_CURR), IceD%OtherSt( i,STATE_SAVED_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - END DO ! numIceLegs - - END IF ! CompIce - - ! A hack to store Bladed-style DLL data - if (SrvD%p%UseBladedInterface) then - if (SrvD%m%dll_data%avrSWAP( 1) > 0 ) then ! this isn't allocated if UseBladedInterface is FALSE - ! store value to be overwritten - old_avrSwap1 = SrvD%m%dll_data%avrSWAP( 1) - SrvD%m%dll_data%avrSWAP( 1) = -11 - CALL CallBladedDLL(SrvD%Input(1), SrvD%p, SrvD%m%dll_data, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! put values back: - SrvD%m%dll_data%avrSWAP( 1) = old_avrSwap1 - end if - end if - -END SUBROUTINE FAST_Store_SubStep -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FAST_Solution for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_Solution_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CALL FAST_Solution(t_initial, n_t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) - -END SUBROUTINE FAST_Solution_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine takes data from n_t_global and gets values at n_t_global + 1 -SUBROUTINE FAST_Solution(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< External loads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: n_t_global_next ! n_t_global + 1 - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Solution' - - ErrStat = ErrID_None - ErrMsg = "" - - n_t_global_next = n_t_global+1 - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! ## Step 1.a: set some variables and Extrapolate Inputs - - call FAST_Prework(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, & - SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! ## Step 1.b: Advance states (yield state and constraint values at t_global_next) - !! ## Step 1.c: Input-Output Solve - !! ## Step 2: Correct (continue in loop) - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - call FAST_UpdateStates(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, & - SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! ## Step 3: Save all final variables (advance to next time) and reset global time - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - call FAST_AdvanceToNextTimeStep(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, & - SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - - !---------------------------------------------------------------------------------------- - !! Write outputs - !---------------------------------------------------------------------------------------- - call FAST_WriteOutput(t_initial, n_t_global_next, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, & - SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - -END SUBROUTINE FAST_Solution - -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FAST_Prework for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_Prework_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CALL FAST_Prework(t_initial, n_t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) - -END SUBROUTINE FAST_Prework_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine does thde prep work to advance the time step from n_t_global to n_t_global + 1 -SUBROUTINE FAST_Prework(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, & - SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< External loads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: n_t_global_next ! n_t_global + 1 - REAL(DbKi) :: t_global_next ! next simulation time (m_FAST%t_global + p_FAST%dt) - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Prework' - - - ErrStat = ErrID_None - ErrMsg = "" - - n_t_global_next = n_t_global+1 - t_global_next = t_initial + n_t_global_next*p_FAST%DT ! = m_FAST%t_global + p_FAST%dt - - ! set flag for writing output at time t_global_next - y_FAST%WriteThisStep = NeedWriteOutput(n_t_global_next, t_global_next, p_FAST) - - !! determine if the Jacobian should be calculated this time - IF ( m_FAST%calcJacobian ) THEN ! this was true (possibly at initialization), so we'll advance the time for the next calculation of the Jacobian - - if (p_FAST%CompMooring == Module_Orca .and. n_t_global < 5) then - m_FAST%NextJacCalcTime = m_FAST%t_global + p_FAST%DT ! the jacobian calculated with OrcaFlex at t=0 is incorrect, but is okay on the 2nd step (it's not okay for OrcaFlex version 10, so I increased this to 5) - else - m_FAST%NextJacCalcTime = m_FAST%t_global + p_FAST%DT_UJac - end if - - END IF - - ! the ServoDyn inputs from Simulink are for t, not t+dt, so we're going to overwrite the inputs from - ! the previous step before we extrapolate these inputs: - IF ( p_FAST%CompServo == Module_SrvD ) CALL SrvD_SetExternalInputs( p_FAST, m_FAST, SrvD%Input(1) ) - - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! ## Step 1.a: Extrapolate Inputs - !! - !! gives predicted values at t+dt - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - CALL FAST_ExtrapInterpMods( t_global_next, p_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - -END SUBROUTINE FAST_Prework -!---------------------------------------------------------------------------------------------------------------------------------- -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FAST_UpdateStates for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_UpdateStates_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CALL FAST_UpdateStates(t_initial, n_t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) - -END SUBROUTINE FAST_UpdateStates_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine takes data from n_t_global and predicts the states and output at n_t_global+1 -SUBROUTINE FAST_UpdateStates(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, & - SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< External loads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - REAL(DbKi) :: t_global_next ! next simulation time (m_FAST%t_global + p_FAST%dt) - INTEGER(IntKi) :: n_t_global_next ! n_t_global + 1 - INTEGER(IntKi) :: j_pc ! predictor-corrector loop counter - INTEGER(IntKi) :: NumCorrections ! number of corrections for this time step - INTEGER(IntKi), parameter :: MaxCorrections = 20 ! maximum number of corrections allowed - LOGICAL :: WriteThisStep ! Whether WriteOutput values will be printed - - !REAL(ReKi) :: ControlInputGuess ! value of controller inputs - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_UpdateStates' - - - ErrStat = ErrID_None - ErrMsg = "" - - t_global_next = t_initial + (n_t_global+1)*p_FAST%DT ! = m_FAST%t_global + p_FAST%dt - n_t_global_next = n_t_global+1 - - ! set number of corrections to be used for this time step: - IF ( p_FAST%CompElast == Module_BD ) THEN ! BD accelerations have fewer spikes with these corrections on the first several time steps - if (n_t_global > 2) then ! this 2 should probably be related to p_FAST%InterpOrder - NumCorrections = p_FAST%NumCrctn - elseif (n_t_global == 0) then - NumCorrections = max(p_FAST%NumCrctn,16) - else - NumCorrections = max(p_FAST%NumCrctn,1) - end if - ELSE - NumCorrections = p_FAST%NumCrctn - END IF - - !! predictor-corrector loop: - j_pc = 0 - do while (j_pc <= NumCorrections) - WriteThisStep = y_FAST%WriteThisStep .AND. j_pc==NumCorrections - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! ## Step 1.b: Advance states (yield state and constraint values at t_global_next) - !! - !! STATE_CURR values of x, xd, z, and OtherSt contain values at m_FAST%t_global; - !! STATE_PRED values contain values at t_global_next. - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - CALL FAST_AdvanceStates( t_initial, n_t_global, p_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2, WriteThisStep ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! ## Step 1.c: Input-Output Solve - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - ! save predicted inputs for comparison with corrected value later - !IF (p_FAST%CheckHSSBrTrqC) THEN - ! ControlInputGuess = ED%Input(1)%HSSBrTrqC - !END IF - - CALL CalcOutputs_And_SolveForInputs( n_t_global, t_global_next, STATE_PRED, m_FAST%calcJacobian, m_FAST%NextJacCalcTime, & - p_FAST, m_FAST, WriteThisStep, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! ## Step 2: Correct (continue in loop) - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - j_pc = j_pc + 1 - - ! ! Check if the predicted inputs were significantly different than the corrected inputs - ! ! (values before and after CalcOutputs_And_SolveForInputs) - !if (j_pc > NumCorrections) then - ! - ! !if (p_FAST%CheckHSSBrTrqC) then - ! ! if ( abs(ControlInputGuess - ED%Input(1)%HSSBrTrqC) > 50.0_ReKi ) then ! I randomly picked 50 N-m - ! ! NumCorrections = min(p_FAST%NumCrctn + 1, MaxCorrections) - ! ! ! print *, 'correction:', t_global_next, NumCorrections - ! ! cycle - ! ! end if - ! !end if - ! - ! ! check pitch position input to structural code (not implemented, yet) - !end if - - enddo ! j_pc - - - if ( P_FAST%CompSeaSt == Module_SeaSt .and. y_FAST%WriteThisStep) then - ! note: SeaState has no inputs and only calculates WriteOutputs, so we don't need to call CalcOutput unless we are writing to the file - call SeaSt_CalcOutput( t_global_next, SeaSt%u, SeaSt%p, SeaSt%x(1), SeaSt%xd(1), SeaSt%z(1), SeaSt%OtherSt(1), SeaSt%y, SeaSt%m, ErrStat2, ErrMsg2 ) - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end if - -END SUBROUTINE FAST_UpdateStates - -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FAST_AdvanceToNextTimeStep for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_AdvanceToNextTimeStep_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CALL FAST_AdvanceToNextTimeStep(t_initial, n_t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) - -END SUBROUTINE FAST_AdvanceToNextTimeStep_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine advances the time step from n_t_global to n_t_global + 1 and does all the relvant copying of data -SUBROUTINE FAST_AdvanceToNextTimeStep(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, & - SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< External loads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - REAL(DbKi) :: t_global_next ! next simulation time (m_FAST%t_global + p_FAST%dt) - INTEGER(IntKi) :: I, k ! generic loop counters - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_AdvanceToNextTimeStep' - - - ErrStat = ErrID_None - ErrMsg = "" - - t_global_next = t_initial + (n_t_global+1)*p_FAST%DT ! = m_FAST%t_global + p_FAST%dt - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! ## Step 3: Save all final variables (advance to next time) - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - !---------------------------------------------------------------------------------------- - !! copy the final predicted states from step t_global_next to actual states for that step - !---------------------------------------------------------------------------------------- - - IF ( p_FAST%CompElast == Module_SED ) THEN - ! Simplified-ElastoDyn: copy final predictions to actual states - CALL SED_CopyContState (SED%x( STATE_PRED), SED%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SED_CopyDiscState (SED%xd(STATE_PRED), SED%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SED_CopyConstrState (SED%z( STATE_PRED), SED%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SED_CopyOtherState (SED%OtherSt( STATE_PRED), SED%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSE - ! ElastoDyn: copy final predictions to actual states - CALL ED_CopyContState (ED%x( STATE_PRED), ED%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyDiscState (ED%xd(STATE_PRED), ED%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyConstrState (ED%z( STATE_PRED), ED%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ED_CopyOtherState (ED%OtherSt( STATE_PRED), ED%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ENDIF - - - ! BeamDyn: copy final predictions to actual states - IF ( p_FAST%CompElast == Module_BD ) THEN - DO k=1,p_FAST%nBeams - CALL BD_CopyContState (BD%x( k,STATE_PRED), BD%x( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyDiscState (BD%xd(k,STATE_PRED), BD%xd(k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyConstrState (BD%z( k,STATE_PRED), BD%z( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL BD_CopyOtherState (BD%OtherSt( k,STATE_PRED), BD%OtherSt( k,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - END IF - - - ! AeroDyn: copy final predictions to actual states; copy current outputs to next - IF ( (p_FAST%CompAero == Module_AD) .or. (p_FAST%CompAero == Module_ExtLd) ) THEN - CALL AD_CopyContState (AD%x( STATE_PRED), AD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyDiscState (AD%xd(STATE_PRED), AD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyConstrState (AD%z( STATE_PRED), AD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL AD_CopyOtherState (AD%OtherSt(STATE_PRED), AD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF ( p_FAST%CompAero == Module_ADsk ) THEN - CALL ADsk_CopyContState (ADsk%x( STATE_PRED), ADsk%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ADsk_CopyDiscState (ADsk%xd(STATE_PRED), ADsk%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ADsk_CopyConstrState (ADsk%z( STATE_PRED), ADsk%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ADsk_CopyOtherState (ADsk%OtherSt(STATE_PRED), ADsk%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! InflowWind: copy final predictions to actual states; copy current outputs to next - IF ( p_FAST%CompInflow == Module_IfW ) THEN - CALL InflowWind_CopyContState (IfW%x( STATE_PRED), IfW%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyDiscState (IfW%xd(STATE_PRED), IfW%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyConstrState (IfW%z( STATE_PRED), IfW%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL InflowWind_CopyOtherState (IfW%OtherSt( STATE_PRED), IfW%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! ServoDyn: copy final predictions to actual states; copy current outputs to next - IF ( p_FAST%CompServo == Module_SrvD ) THEN - CALL SrvD_CopyContState (SrvD%x( STATE_PRED), SrvD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyDiscState (SrvD%xd(STATE_PRED), SrvD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyConstrState (SrvD%z( STATE_PRED), SrvD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SrvD_CopyOtherState (SrvD%OtherSt( STATE_PRED), SrvD%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ! SeaState has no states - - ! HydroDyn: copy final predictions to actual states - IF ( p_FAST%CompHydro == Module_HD ) THEN - CALL HydroDyn_CopyContState (HD%x( STATE_PRED), HD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyDiscState (HD%xd(STATE_PRED), HD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyConstrState (HD%z( STATE_PRED), HD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL HydroDyn_CopyOtherState (HD%OtherSt(STATE_PRED), HD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! SubDyn: copy final predictions to actual states - IF ( p_FAST%CompSub == Module_SD ) THEN - CALL SD_CopyContState (SD%x( STATE_PRED), SD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyDiscState (SD%xd(STATE_PRED), SD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyConstrState (SD%z( STATE_PRED), SD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL SD_CopyOtherState (SD%OtherSt(STATE_PRED), SD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm ) THEN - CALL ExtPtfm_CopyContState (ExtPtfm%x( STATE_PRED), ExtPtfm%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyDiscState (ExtPtfm%xd(STATE_PRED), ExtPtfm%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyConstrState (ExtPtfm%z( STATE_PRED), ExtPtfm%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ExtPtfm_CopyOtherState (ExtPtfm%OtherSt(STATE_PRED), ExtPtfm%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - - ! MAP: copy final predictions to actual states - IF (p_FAST%CompMooring == Module_MAP) THEN - CALL MAP_CopyContState (MAPp%x( STATE_PRED), MAPp%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyDiscState (MAPp%xd(STATE_PRED), MAPp%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MAP_CopyConstrState (MAPp%z( STATE_PRED), MAPp%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - !CALL MAP_CopyOtherState (MAPp%OtherSt(STATE_PRED), MAPp%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - ! CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF (p_FAST%CompMooring == Module_MD) THEN - CALL MD_CopyContState (MD%x( STATE_PRED), MD%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyDiscState (MD%xd(STATE_PRED), MD%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyConstrState (MD%z( STATE_PRED), MD%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL MD_CopyOtherState (MD%OtherSt(STATE_PRED), MD%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF (p_FAST%CompMooring == Module_FEAM) THEN - CALL FEAM_CopyContState (FEAM%x( STATE_PRED), FEAM%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyDiscState (FEAM%xd(STATE_PRED), FEAM%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyConstrState (FEAM%z( STATE_PRED), FEAM%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL FEAM_CopyOtherState (FEAM%OtherSt( STATE_PRED), FEAM%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF (p_FAST%CompMooring == Module_Orca) THEN - CALL Orca_CopyContState (Orca%x( STATE_PRED), Orca%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyDiscState (Orca%xd(STATE_PRED), Orca%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyConstrState (Orca%z( STATE_PRED), Orca%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL Orca_CopyOtherState (Orca%OtherSt( STATE_PRED), Orca%OtherSt( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END IF - - ! IceFloe: copy final predictions to actual states - IF ( p_FAST%CompIce == Module_IceF ) THEN - CALL IceFloe_CopyContState (IceF%x( STATE_PRED), IceF%x( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyDiscState (IceF%xd(STATE_PRED), IceF%xd(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyConstrState (IceF%z( STATE_PRED), IceF%z( STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceFloe_CopyOtherState (IceF%OtherSt(STATE_PRED), IceF%OtherSt(STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - DO i=1,p_FAST%numIceLegs - CALL IceD_CopyContState (IceD%x( i,STATE_PRED), IceD%x( i,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyDiscState (IceD%xd(i,STATE_PRED), IceD%xd(i,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyConstrState (IceD%z( i,STATE_PRED), IceD%z( i,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL IceD_CopyOtherState (IceD%OtherSt( i,STATE_PRED), IceD%OtherSt( i,STATE_CURR), MESH_UPDATECOPY, Errstat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - END DO - END IF - - - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - !! We've advanced everything to the next time step: - !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - !! update the global time - - m_FAST%t_global = t_global_next - -END SUBROUTINE FAST_AdvanceToNextTimeStep -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FAST_WriteOutput for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_WriteOutput_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - CALL FAST_WriteOutput(t_initial, n_t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat, ErrMsg ) - -END SUBROUTINE FAST_WriteOutput_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine writes the outputs at this timestep -SUBROUTINE FAST_WriteOutput(t_initial, n_t_global, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, & - SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< loop counter - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(IN ) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(IN ) :: ExtLd !< External loads data - TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(IN ) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - REAL(DbKi) :: t_global ! this simulation time (m_FAST%t_global + p_FAST%dt) - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_WriteOutput' - - - ErrStat = ErrID_None - ErrMsg = "" - - t_global = t_initial + n_t_global*p_FAST%DT - - !---------------------------------------------------------------------------------------- - !! Check to see if we should output data this time step: - !---------------------------------------------------------------------------------------- - CALL WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, SED, BD, AD, ADsk, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & - SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - - !---------------------------------------------------------------------------------------- - !! Display simulation status every SttsTime-seconds (i.e., n_SttsTime steps): - !---------------------------------------------------------------------------------------- - - IF (p_FAST%WrSttsTime) then - IF ( MOD( n_t_global, p_FAST%n_SttsTime ) == 0 ) THEN - CALL SimStatus( m_FAST%TiLstPrn, m_FAST%PrevClockTime, m_FAST%t_global, p_FAST%TMax, p_FAST%TDesc ) - ENDIF - ENDIF - -END SUBROUTINE FAST_WriteOutput - -!---------------------------------------------------------------------------------------------------------------------------------- -! ROUTINES TO OUTPUT WRITE DATA TO FILE AT EACH REQUSTED TIME STEP -!---------------------------------------------------------------------------------------------------------------------------------- -FUNCTION NeedWriteOutput(n_t_global, t_global, p_FAST) - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< Current global time step - REAL(DbKi), INTENT(IN ) :: t_global !< Current global time - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - - LOGICAL :: NeedWriteOutput !< Function result; if true, WriteOutput values are needed on this time step - - IF ( t_global >= p_FAST%TStart ) THEN ! note that if TStart isn't an multiple of DT_out, we will not necessarially start output to the file at TStart - NeedWriteOutput = MOD( n_t_global, p_FAST%n_DT_Out ) == 0 - ELSE - NeedWriteOutput = .FALSE. - END IF - -END FUNCTION NeedWriteOutput -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine determines if it's time to write to the output files--based on a previous call to fast_subs::needwriteoutput--, and -!! calls the routine to write to the files with the output data. It should be called after all the output solves for a given time -!! have been completed, and assumes y_FAST\%WriteThisStep has been set. -SUBROUTINE WriteOutputToFile(n_t_global, t_global, p_FAST, y_FAST, ED, SED, BD, AD, ADsk, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & - SrvD, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg) -!............................................................................................................................... - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< Current global time step - REAL(DbKi), INTENT(IN ) :: t_global !< Current global time - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - - TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(IN ) :: ADsk !< AeroDisk data - TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(IN ) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop - - TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - CHARACTER(*), PARAMETER :: RoutineName = 'WriteOutputToFile' - - ErrStat = ErrID_None - ErrMsg = "" - - ! Write time-series channel data - - !y_FAST%WriteThisStep = NeedWriteOutput(n_t_global, t_global, p_FAST) - IF ( y_FAST%WriteThisStep ) THEN - - ! Generate glue-code output file - CALL WrOutputLine( t_global, p_FAST, y_FAST, IfW%y%WriteOutput, ExtInfw%y%WriteOutput, ED%y%WriteOutput, SED%y%WriteOutput, & - AD%y, ADsk%y%WriteOutput, SrvD%y%WriteOutput, SeaSt%y%WriteOutput, HD%y%WriteOutput, SD%y%WriteOutput, ExtPtfm%y%WriteOutput, MAPp%y%WriteOutput, & - FEAM%y%WriteOutput, MD%y%WriteOutput, Orca%y%WriteOutput, IceF%y%WriteOutput, IceD%y, BD%y, ErrStat, ErrMsg ) - - ENDIF - - ! Write visualization data (and also note that we're ignoring any errors that occur doing so) - IF ( p_FAST%WrVTK == VTK_Animate ) THEN - IF ( MOD( n_t_global, p_FAST%n_VTKTime ) == 0 ) THEN - call WriteVTK(t_global, p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - END IF - END IF - - -END SUBROUTINE WriteOutputToFile -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine writes the module output to the primary output file(s). -SUBROUTINE WrOutputLine( t, p_FAST, y_FAST, IfWOutput, ExtInfwOutput, EDOutput, SEDOutput, y_AD, ADskOutput, SrvDOutput, SeaStOutput, HDOutput, SDOutput, ExtPtfmOutput,& - MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, y_BD, ErrStat, ErrMsg) - - IMPLICIT NONE - - ! Passed variables - REAL(DbKi), INTENT(IN) :: t !< Current simulation time, in seconds - TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Glue-code simulation outputs - - - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: IfWOutput (:) !< InflowWind WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtInfwOutput (:) !< ExternalInflow WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: EDOutput (:) !< ElastoDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SEDOutput (:) !< Simplified-ElastoDyn WriteOutput values - TYPE(AD_OutputType), INTENT(IN) :: y_AD !< AeroDyn outputs (WriteOutput values are subset of allocated Rotors) - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ADskOutput (:) !< AeroDisk WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SrvDOutput (:) !< ServoDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SeaStOutput (:) !< SeaState WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: HDOutput (:) !< HydroDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SDOutput (:) !< SubDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtPtfmOutput (:) !< ExtPtfm_MCKF WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: MAPOutput (:) !< MAP WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: FEAMOutput (:) !< FEAMooring WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: MDOutput (:) !< MoorDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: OrcaOutput (:) !< OrcaFlex interface WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: IceFOutput (:) !< IceFloe WriteOutput values - TYPE(IceD_OutputType), INTENT(IN) :: y_IceD (:) !< IceDyn outputs (WriteOutput values are subset) - TYPE(BD_OutputType), INTENT(IN) :: y_BD (:) !< BeamDyn outputs (WriteOutput values are subset) - - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message - - ! Local variables. - - CHARACTER(200) :: Frmt ! A string to hold a format specifier - CHARACTER(p_FAST%TChanLen) :: TmpStr ! temporary string to print the time output as text - - REAL(ReKi) :: OutputAry(SIZE(y_FAST%ChannelNames)-1) - - ErrStat = ErrID_None - ErrMsg = '' - - CALL FillOutputAry(p_FAST, y_FAST, IfWOutput, ExtInfwOutput, EDOutput, SEDOutput, y_AD, ADskOutput, SrvDOutput, SeaStOutput, HDOutput, SDOutput, ExtPtfmOutput, & - MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, y_BD, OutputAry) - - IF (p_FAST%WrTxtOutFile) THEN - - ! Write one line of tabular output: - ! Frmt = '(F8.3,'//TRIM(Num2LStr(p%NumOuts))//'(:,A,'//TRIM( p%OutFmt )//'))' - Frmt = '"'//p_FAST%Delim//'"'//p_FAST%OutFmt ! format for array elements from individual modules - - ! time - WRITE( TmpStr, '('//trim(p_FAST%OutFmt_t)//')' ) t - CALL WrFileNR( y_FAST%UnOu, TmpStr ) - - ! write the individual module output (convert to SiKi if necessary, so that we don't need to print so many digits in the exponent) - CALL WrNumAryFileNR ( y_FAST%UnOu, REAL(OutputAry,SiKi), Frmt, ErrStat, ErrMsg ) - !IF ( ErrStat >= AbortErrLev ) RETURN - - ! write a new line (advance to the next line) - WRITE (y_FAST%UnOu,'()') - - END IF - - - IF (p_FAST%WrBinOutFile) THEN - - ! Write data to array for binary output file - - IF ( y_FAST%n_Out == y_FAST%NOutSteps ) THEN - ErrStat = ErrID_Warn - ErrMsg = 'Not all data could be written to the binary output file.' - !CALL ProgWarn( 'Not all data could be written to the binary output file.' ) - !this really would only happen if we have an error somewhere else, right? - !otherwise, we could allocate a new, larger array and move existing data - ELSE - y_FAST%n_Out = y_FAST%n_Out + 1 - - ! store time data - IF ( y_FAST%n_Out == 1_IntKi .OR. p_FAST%WrBinMod == FileFmtID_WithTime ) THEN - y_FAST%TimeData(y_FAST%n_Out) = t ! Time associated with these outputs - END IF - - ! store individual module data - y_FAST%AllOutData(:, y_FAST%n_Out) = OutputAry - - END IF - - END IF - - RETURN -END SUBROUTINE WrOutputLine -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that calls FillOutputAry for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. (Called from Simulink interface.) -SUBROUTINE FillOutputAry_T(Turbine, Outputs) - - TYPE(FAST_TurbineType), INTENT(IN ) :: Turbine !< all data for one instance of a turbine - REAL(ReKi), INTENT( OUT) :: Outputs(:) !< single array of output - - - CALL FillOutputAry(Turbine%p_FAST, Turbine%y_FAST, Turbine%IfW%y%WriteOutput, Turbine%ExtInfw%y%WriteOutput, & - Turbine%ED%y%WriteOutput, Turbine%SED%y%WriteOutput, Turbine%AD%y, Turbine%ADsk%y%WriteOutput, Turbine%SrvD%y%WriteOutput, & - Turbine%SeaSt%y%WriteOutput, Turbine%HD%y%WriteOutput, Turbine%SD%y%WriteOutput, Turbine%ExtPtfm%y%WriteOutput, Turbine%MAP%y%WriteOutput, & - Turbine%FEAM%y%WriteOutput, Turbine%MD%y%WriteOutput, Turbine%Orca%y%WriteOutput, & - Turbine%IceF%y%WriteOutput, Turbine%IceD%y, Turbine%BD%y, Outputs) - -END SUBROUTINE FillOutputAry_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine concatenates all of the WriteOutput values from the module Output into one array to be written to the FAST -!! output file. -SUBROUTINE FillOutputAry(p_FAST, y_FAST, IfWOutput, ExtInfwOutput, EDOutput, SEDOutput, y_AD, ADskOutput, SrvDOutput, SeaStOutput, HDOutput, SDOutput, ExtPtfmOutput, & - MAPOutput, FEAMOutput, MDOutput, OrcaOutput, IceFOutput, y_IceD, y_BD, OutputAry) - - TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters - TYPE(FAST_OutputFileType),INTENT(IN) :: y_FAST !< Glue-code simulation outputs - - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: IfWOutput (:) !< InflowWind WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtInfwOutput (:) !< ExternalInflow WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: EDOutput (:) !< ElastoDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SEDOutput (:) !< Simplified-ElastoDyn WriteOutput values - TYPE(AD_OutputType), INTENT(IN) :: y_AD !< AeroDyn outputs (WriteOutput values are subset of allocated Rotors) - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ADskOutput (:) !< AeroDisk WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SrvDOutput (:) !< ServoDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SeaStOutput (:) !< SeaState WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: HDOutput (:) !< HydroDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: SDOutput (:) !< SubDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: ExtPtfmOutput (:) !< ExtPtfm_MCKF WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: MAPOutput (:) !< MAP WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: FEAMOutput (:) !< FEAMooring WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: MDOutput (:) !< MoorDyn WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: OrcaOutput (:) !< OrcaFlex interface WriteOutput values - REAL(ReKi), ALLOCATABLE, INTENT(IN) :: IceFOutput (:) !< IceFloe WriteOutput values - TYPE(IceD_OutputType), INTENT(IN) :: y_IceD (:) !< IceDyn outputs (WriteOutput values are subset) - TYPE(BD_OutputType), INTENT(IN) :: y_BD (:) !< BeamDyn outputs (WriteOutput values are subset) - - REAL(ReKi), INTENT(OUT) :: OutputAry(:) !< single array of output - - INTEGER(IntKi) :: i ! loop counter - INTEGER(IntKi) :: indxLast ! The index of the last row value to be written to AllOutData for this time step (column). - INTEGER(IntKi) :: indxNext ! The index of the next row value to be written to AllOutData for this time step (column). - - - ! store individual module data into one array for output - - indxLast = 0 - indxNext = 1 - - IF (y_FAST%numOuts(Module_Glue) > 1) THEN ! if we output more than just the time channel.... - indxLast = indxNext + SIZE(y_FAST%DriverWriteOutput) - 1 - OutputAry(indxNext:indxLast) = y_FAST%DriverWriteOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_IfW) > 0 ) THEN - indxLast = indxNext + SIZE(IfWOutput) - 1 - OutputAry(indxNext:indxLast) = IfWOutput - indxNext = IndxLast + 1 - ELSEIF ( y_FAST%numOuts(Module_ExtInfw) > 0 ) THEN - indxLast = indxNext + SIZE(ExtInfwOutput) - 1 - OutputAry(indxNext:indxLast) = ExtInfwOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_ED) > 0 ) THEN - indxLast = indxNext + SIZE(EDOutput) - 1 - OutputAry(indxNext:indxLast) = EDOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_SED) > 0 ) THEN - indxLast = indxNext + SIZE(SEDOutput) - 1 - OutputAry(indxNext:indxLast) = SEDOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_BD) > 0 ) THEN - do i=1,SIZE(y_BD) - indxLast = indxNext + SIZE(y_BD(i)%WriteOutput) - 1 - OutputAry(indxNext:indxLast) = y_BD(i)%WriteOutput - indxNext = IndxLast + 1 - end do - END IF - - IF ( y_FAST%numOuts(Module_AD) > 0 ) THEN - do i=1,SIZE(y_AD%Rotors) - if (allocated(y_AD%Rotors(i)%WriteOutput)) then - indxLast = indxNext + SIZE(y_AD%Rotors(i)%WriteOutput) - 1 - OutputAry(indxNext:indxLast) = y_AD%Rotors(i)%WriteOutput - indxNext = IndxLast + 1 - endif - end do - END IF - - IF ( y_FAST%numOuts(Module_ADsk) > 0 ) THEN - indxLast = indxNext + SIZE(ADskOutput) - 1 - OutputAry(indxNext:indxLast) = ADskOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_SrvD) > 0 ) THEN - indxLast = indxNext + SIZE(SrvDOutput) - 1 - OutputAry(indxNext:indxLast) = SrvDOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_SeaSt) > 0 ) THEN - indxLast = indxNext + SIZE(SeaStOutput) - 1 - OutputAry(indxNext:indxLast) = SeaStOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_HD) > 0 ) THEN - indxLast = indxNext + SIZE(HDOutput) - 1 - OutputAry(indxNext:indxLast) = HDOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_SD) > 0 ) THEN - indxLast = indxNext + SIZE(SDOutput) - 1 - OutputAry(indxNext:indxLast) = SDOutput - indxNext = IndxLast + 1 - ELSE IF ( y_FAST%numOuts(Module_ExtPtfm) > 0 ) THEN - indxLast = indxNext + SIZE(ExtPtfmOutput) - 1 - OutputAry(indxNext:indxLast) = ExtPtfmOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_MAP) > 0 ) THEN - indxLast = indxNext + SIZE(MAPOutput) - 1 - OutputAry(indxNext:indxLast) = MAPOutput - indxNext = IndxLast + 1 - ELSEIF ( y_FAST%numOuts(Module_MD) > 0 ) THEN - indxLast = indxNext + SIZE(MDOutput) - 1 - OutputAry(indxNext:indxLast) = MDOutput - indxNext = IndxLast + 1 - ELSEIF ( y_FAST%numOuts(Module_FEAM) > 0 ) THEN - indxLast = indxNext + SIZE(FEAMOutput) - 1 - OutputAry(indxNext:indxLast) = FEAMOutput - indxNext = IndxLast + 1 - ELSEIF ( y_FAST%numOuts(Module_Orca) > 0 ) THEN - indxLast = indxNext + SIZE(OrcaOutput) - 1 - OutputAry(indxNext:indxLast) = OrcaOutput - indxNext = IndxLast + 1 - END IF - - IF ( y_FAST%numOuts(Module_IceF) > 0 ) THEN - indxLast = indxNext + SIZE(IceFOutput) - 1 - OutputAry(indxNext:indxLast) = IceFOutput - indxNext = IndxLast + 1 - ELSEIF ( y_FAST%numOuts(Module_IceD) > 0 ) THEN - DO i=1,p_FAST%numIceLegs - indxLast = indxNext + SIZE(y_IceD(i)%WriteOutput) - 1 - OutputAry(indxNext:indxLast) = y_IceD(i)%WriteOutput - indxNext = IndxLast + 1 - END DO - END IF - -END SUBROUTINE FillOutputAry -!---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE WriteVTK(t_global, p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - REAL(DbKi), INTENT(IN ) :: t_global !< Current global time - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code (only because we're updating VTK_LastWaveIndx) - TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules - - TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(IN ) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop - - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - CHARACTER(*), PARAMETER :: RoutineName = 'WriteVTK' - - - IF ( p_FAST%VTK_Type == VTK_Surf ) THEN - CALL WrVTK_Surfaces(t_global, p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - ELSE IF ( p_FAST%VTK_Type == VTK_Basic ) THEN - CALL WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - ELSE IF ( p_FAST%VTK_Type == VTK_All ) THEN - CALL WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - ELSE IF (p_FAST%VTK_Type==VTK_Old) THEN - if (p_FAST%CompElast /= Module_SED) then !FIXME: SED is not included in these routines!!!! - CALL WriteInputMeshesToFile( ED%Input(1), AD%Input(1), SD%Input(1), HD%Input(1), MAPp%Input(1), BD%Input(1,:), TRIM(p_FAST%OutFileRoot)//'.InputMeshes.bin', ErrStat2, ErrMsg2) - CALL WriteMotionMeshesToFile(t_global, ED%y, SD%Input(1), SD%y, HD%Input(1), MAPp%Input(1), BD%y, BD%Input(1,:), y_FAST%UnGra, ErrStat2, ErrMsg2, TRIM(p_FAST%OutFileRoot)//'.gra') - endif - !unOut = -1 - !CALL MeshWrBin ( unOut, AD%y%BladeLoad(2), ErrStat2, ErrMsg2, 'AD_2_ED_loads.bin'); IF (ErrStat2 /= ErrID_None) CALL WrScr(TRIM(ErrMsg2)) - !CALL MeshWrBin ( unOut, ED%Input(1)%BladePtLoads(2),ErrStat2, ErrMsg2, 'AD_2_ED_loads.bin'); IF (ErrStat2 /= ErrID_None) CALL WrScr(TRIM(ErrMsg2)) - !CALL MeshMapWrBin( unOut, AD%y%BladeLoad(2), ED%Input(1)%BladePtLoads(2), MeshMapData%AD_L_2_BDED_B(2), ErrStat2, ErrMsg2, 'AD_2_ED_loads.bin' ); IF (ErrStat2 /= ErrID_None) CALL WrScr(TRIM(ErrMsg2)) - !close( unOut ) - END IF - - y_FAST%VTK_count = y_FAST%VTK_count + 1 - -END SUBROUTINE WriteVTK -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine writes all the committed meshes to VTK-formatted files. It doesn't bother with returning an error code. -SUBROUTINE WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - use FVW_IO, only: WrVTK_FVW - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules - - TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(IN ) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop - - -! logical :: outputFields ! flag to determine if we want to output the HD mesh fields - INTEGER(IntKi) :: NumBl, k - INTEGER(IntKi) :: j ! counter for StC instance at location - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - CHARACTER(*), PARAMETER :: RoutineName = 'WrVTK_AllMeshes' - - - - NumBl = 0 - if (allocated(ED%y%BladeRootMotion)) then - NumBl = SIZE(ED%y%BladeRootMotion) - elseif (allocated(SED%y%BladeRootMotion)) then - NumBl = SIZE(SED%y%BladeRootMotion) - end if - - - -! I'm first going to just put all of the meshes that get mapped together, then decide if we're going to print/plot them all - -! ElastoDyn - if (allocated(ED%Input)) then - - ! ElastoDyn outputs (motions) - DO K=1,NumBl - !%BladeLn2Mesh(K) used only when not BD (see below) - call MeshWrVTK(p_FAST%TurbinePos, ED%y%BladeRootMotion(K), trim(p_FAST%VTK_OutFileRoot)//'.ED_BladeRootMotion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - END DO - - call MeshWrVTK(p_FAST%TurbinePos, ED%y%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_TowerLn2Mesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - -! these will get output with their sibling input meshes - !call MeshWrVTK(p_FAST%TurbinePos, ED%y%HubPtMotion, trim(p_FAST%VTK_OutFileRoot)//'.ED_HubPtMotion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - !call MeshWrVTK(p_FAST%TurbinePos, ED%y%NacelleMotion, trim(p_FAST%VTK_OutFileRoot)//'.ED_NacelleMotion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - !call MeshWrVTK(p_FAST%TurbinePos, ED%y%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_PlatformPtMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - - ! ElastoDyn inputs (loads) - ! %BladePtLoads used only when not BD (see below) - call MeshWrVTK(p_FAST%TurbinePos, ED%Input(1)%TowerPtLoads, trim(p_FAST%VTK_OutFileRoot)//'.ED_TowerPtLoads', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y%TowerLn2Mesh ) - call MeshWrVTK(p_FAST%TurbinePos, ED%Input(1)%HubPtLoad, trim(p_FAST%VTK_OutFileRoot)//'.ED_Hub', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y%HubPtMotion ) - call MeshWrVTK(p_FAST%TurbinePos, ED%Input(1)%NacelleLoads, trim(p_FAST%VTK_OutFileRoot)//'.ED_Nacelle' ,y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y%NacelleMotion ) - call MeshWrVTK(p_FAST%TurbinePos, ED%Input(1)%TFinCMLoads, trim(p_FAST%VTK_OutFileRoot)//'.ED_TailFin' ,y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y%TFinCMMotion ) - call MeshWrVTK(p_FAST%TurbinePos, ED%Input(1)%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_PlatformPtMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y%PlatformPtMesh ) - end if - - -! BeamDyn - IF ( p_FAST%CompElast == Module_BD .and. allocated(BD%Input) .and. allocated(BD%y)) THEN - - do K=1,NumBl - ! BeamDyn inputs - !call MeshWrVTK(p_FAST%TurbinePos, BD%Input(1,k)%RootMotion, trim(p_FAST%VTK_OutFileRoot)//'.BD_RootMotion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - call MeshWrVTK(p_FAST%TurbinePos, BD%Input(1,k)%HubMotion, trim(p_FAST%VTK_OutFileRoot)//'.BD_HubMotion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - end do - if (allocated(MeshMapData%y_BD_BldMotion_4Loads)) then - do K=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, BD%Input(1,k)%DistrLoad, trim(p_FAST%VTK_OutFileRoot)//'.BD_DistrLoad'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, MeshMapData%y_BD_BldMotion_4Loads(k) ) - ! skipping PointLoad - end do - elseif (p_FAST%BD_OutputSibling) then - do K=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, BD%Input(1,k)%DistrLoad, trim(p_FAST%VTK_OutFileRoot)//'.BD_Blade'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, BD%y(k)%BldMotion ) - ! skipping PointLoad - end do - end if - - do K=1,NumBl - ! BeamDyn outputs - call MeshWrVTK(p_FAST%TurbinePos, BD%y(k)%ReactionForce, trim(p_FAST%VTK_OutFileRoot)//'.BD_ReactionForce_RootMotion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, BD%Input(1,k)%RootMotion ) - end do - - if (.not. p_FAST%BD_OutputSibling) then !otherwise this mesh has been put with the DistrLoad mesh - do K=1,NumBl - ! BeamDyn outputs - call MeshWrVTK(p_FAST%TurbinePos, BD%y(k)%BldMotion, trim(p_FAST%VTK_OutFileRoot)//'.BD_BldMotion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - end do - end if - - - ELSE if (p_FAST%CompElast == Module_ED .and. allocated(ED%Input)) then - ! ElastoDyn - DO K=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, ED%y%BladeLn2Mesh(K), trim(p_FAST%VTK_OutFileRoot)//'.ED_BladeLn2Mesh_motion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - call MeshWrVTK(p_FAST%TurbinePos, ED%Input(1)%BladePtLoads(K), trim(p_FAST%VTK_OutFileRoot)//'.ED_BladePtLoads'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ED%y%BladeLn2Mesh(K) ) - END DO - ELSE if (p_FAST%CompElast == Module_SED .and. allocated(SED%Input)) then - ! Simplified-ElastoDyn - call MeshWrVTK(p_FAST%TurbinePos, SED%y%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.SED_PlatformPtMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - call MeshWrVTK(p_FAST%TurbinePos, SED%y%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SED_TowerLn2Mesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - call MeshWrVTK(p_FAST%TurbinePos, SED%y%NacelleMotion, trim(p_FAST%VTK_OutFileRoot)//'.SED_NacelleMotion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - call MeshWrVTK(p_FAST%TurbinePos, SED%y%HubPtMotion, trim(p_FAST%VTK_OutFileRoot)//'.SED_HubPtMotion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - do k=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, SED%y%BladeRootMotion(k), trim(p_FAST%VTK_OutFileRoot)//'.SED_BladeRootMotion'//trim(Num2LStr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - enddo - END IF - -! ServoDyn - if (allocated(SrvD%Input)) then - IF ( ALLOCATED(SrvD%Input(1)%NStCMotionMesh) ) THEN - do j=1,size(SrvD%Input(1)%NStCMotionMesh) - IF ( SrvD%Input(1)%NStCMotionMesh(j)%Committed ) THEN - call MeshWrVTK(p_FAST%TurbinePos, SrvD%y%NStCLoadMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.SrvD_NStC'//trim(num2lstr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SrvD%Input(1)%NStCMotionMesh(j) ) - ENDIF - enddo - ENDIF - IF ( ALLOCATED(SrvD%Input(1)%TStCMotionMesh) ) THEN - do j=1,size(SrvD%Input(1)%TStCMotionMesh) - IF ( SrvD%Input(1)%TStCMotionMesh(j)%Committed ) THEN - call MeshWrVTK(p_FAST%TurbinePos, SrvD%y%TStCLoadMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.SrvD_TStC'//trim(num2lstr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SrvD%Input(1)%TStCMotionMesh(j) ) - ENDIF - enddo - ENDIF - IF ( ALLOCATED(SrvD%Input(1)%BStCMotionMesh) ) THEN - do j=1,size(SrvD%Input(1)%BStCMotionMesh,2) - DO K=1,size(SrvD%Input(1)%BStCMotionMesh,1) - call MeshWrVTK(p_FAST%TurbinePos, SrvD%y%BStCLoadMesh(k,j), trim(p_FAST%VTK_OutFileRoot)//'.SrvD_BStC'//trim(num2lstr(j))//'B'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SrvD%Input(1)%BStCMotionMesh(k,j) ) - ENDDO - enddo - ENDIF - IF ( ALLOCATED(SrvD%Input(1)%SStCMotionMesh) ) THEN - do j=1,size(SrvD%Input(1)%SStCMotionMesh) - IF ( SrvD%Input(1)%SStCMotionMesh(j)%Committed ) THEN - call MeshWrVTK(p_FAST%TurbinePos, SrvD%y%SStCLoadMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.SrvD_SStC'//trim(num2lstr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SrvD%Input(1)%SStCMotionMesh(j) ) - ENDIF - enddo - ENDIF - end if - - -! AeroDyn - IF ( p_FAST%CompAero == Module_AD .and. allocated(AD%Input)) THEN - if (allocated(AD%Input(1)%rotors) .and. allocated(AD%y%rotors) ) then - if (allocated(AD%Input(1)%rotors(1)%BladeRootMotion)) then - - DO K=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, AD%Input(1)%rotors(1)%BladeRootMotion(K), trim(p_FAST%VTK_OutFileRoot)//'.AD_BladeRootMotion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - !call MeshWrVTK(p_FAST%TurbinePos, AD%Input(1)%rotors(1)%BladeMotion(K), trim(p_FAST%VTK_OutFileRoot)//'.AD_BladeMotion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - END DO - - call MeshWrVTK(p_FAST%TurbinePos, AD%Input(1)%rotors(1)%HubMotion, trim(p_FAST%VTK_OutFileRoot)//'.AD_HubMotion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - !call MeshWrVTK(p_FAST%TurbinePos, AD%Input(1)%rotors(1)%TowerMotion, trim(p_FAST%VTK_OutFileRoot)//'.AD_TowerMotion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - - IF (allocated(AD%y%rotors(1)%BladeLoad)) then - DO K=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, AD%y%rotors(1)%BladeLoad(K), trim(p_FAST%VTK_OutFileRoot)//'.AD_Blade'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, AD%Input(1)%rotors(1)%BladeMotion(k) ) - END DO - END IF - call MeshWrVTK(p_FAST%TurbinePos, AD%y%rotors(1)%TowerLoad, trim(p_FAST%VTK_OutFileRoot)//'.AD_Tower', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, AD%Input(1)%rotors(1)%TowerMotion ) - - end if - end if - call MeshWrVTK(p_FAST%TurbinePos, AD%y%rotors(1)%TowerLoad, trim(p_FAST%VTK_OutFileRoot)//'.AD_Tower', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, AD%Input(1)%rotors(1)%TowerMotion ) - - ! FVW submodule of AD15 - if (allocated(AD%m%FVW_u)) then - if (allocated(AD%m%FVW_u(1)%WingsMesh)) then - DO K=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, AD%m%FVW_u(1)%WingsMesh(k), trim(p_FAST%VTK_OutFileRoot)//'.FVW_WingsMesh'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, AD%Input(1)%rotors(1)%BladeMotion(k) ) - !call MeshWrVTK(p_FAST%TurbinePos, AD%Input(1)%BladeMotion(K), trim(p_FAST%OutFileRoot)//'.AD_BladeMotion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2 ) - END DO - ! Free wake - call WrVTK_FVW(AD%p%FVW, AD%x(1)%FVW, AD%z(1)%FVW, AD%m%FVW, trim(p_FAST%VTK_OutFileRoot)//'.FVW', y_FAST%VTK_count, p_FAST%VTK_tWidth, bladeFrame=.FALSE.) ! bladeFrame==.FALSE. to output in global coords - end if - end if - END IF - -! AeroDisk -!FIXME: add visualization for AeroDisk - -! HydroDyn - IF ( p_FAST%CompHydro == Module_HD .and. allocated(HD%Input)) THEN - call MeshWrVTK(p_FAST%TurbinePos, HD%Input(1)%PRPMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_PRP', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - call MeshWrVTK(p_FAST%TurbinePos, HD%y%WamitMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_WAMIT', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%Input(1)%WAMITMesh ) - call MeshWrVTK(p_FAST%TurbinePos, HD%y%Morison%Mesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_MorisonPt', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%Input(1)%Morison%Mesh ) - if (HD%y%Morison%VisMesh%Committed) then - call MeshWrVTK(p_FAST%TurbinePos, HD%y%Morison%VisMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_Morison', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%Input(1)%Morison%Mesh ) - endif - END IF - -! SubDyn - IF ( p_FAST%CompSub == Module_SD .and. allocated(SD%Input)) THEN - !call MeshWrVTK(p_FAST%TurbinePos, SD%Input(1)%TPMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_TPMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - call MeshWrVTK(p_FAST%TurbinePos, SD%Input(1)%LMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_LMesh_y2Mesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SD%y%y2Mesh ) - call MeshWrVTK(p_FAST%TurbinePos, SD%Input(1)%LMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_LMesh_y3Mesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SD%y%y3Mesh ) - - call MeshWrVTK(p_FAST%TurbinePos, SD%y%y1Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y1Mesh_TPMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, SD%Input(1)%TPMesh ) - !call MeshWrVTK(p_FAST%TurbinePos, SD%y%y3Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y3Mesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - ELSE IF ( p_FAST%CompSub == Module_ExtPtfm .and. allocated(ExtPtfm%Input)) THEN - call MeshWrVTK(p_FAST%TurbinePos, ExtPtfm%y%PtfmMesh, trim(p_FAST%VTK_OutFileRoot)//'.ExtPtfm', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, ExtPtfm%Input(1)%PtfmMesh ) - END IF - -! MAP - IF ( p_FAST%CompMooring == Module_MAP ) THEN - if (allocated(MAPp%Input)) then - call MeshWrVTK(p_FAST%TurbinePos, MAPp%y%PtFairleadLoad, trim(p_FAST%VTK_OutFileRoot)//'.MAP_PtFairlead', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, MAPp%Input(1)%PtFairDisplacement ) - !call MeshWrVTK(p_FAST%TurbinePos, MAPp%Input(1)%PtFairDisplacement, trim(p_FAST%VTK_OutFileRoot)//'.MAP_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - end if - -! MoorDyn - ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN - if (allocated(MD%Input) .and. allocated(MD%y%CoupledLoads)) then - call MeshWrVTK(p_FAST%TurbinePos, MD%y%CoupledLoads(1), trim(p_FAST%VTK_OutFileRoot)//'.MD_PtFairlead', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, MD%Input(1)%CoupledKinematics(1) ) - !call MeshWrVTK(p_FAST%TurbinePos, MD%Input(1)%CoupledKinematics, trim(p_FAST%VTK_OutFileRoot)//'.MD_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - end if - if (allocated(MD%y%VisLinesMesh)) then - do j=1,size(MD%y%VisLinesMesh) - if (MD%y%VisLinesMesh(j)%Committed) then - call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisLinesMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.MD_Line'//trim(Num2LStr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) - endif - enddo - endif - if (allocated(MD%y%VisRodsMesh)) then - do j=1,size(MD%y%VisRodsMesh) - if (MD%y%VisRodsMesh(j)%Committed) then - call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisRodsMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.MD_Rod'//trim(Num2LStr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) - endif - enddo - endif - -! FEAMooring - ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN - if (allocated(FEAM%Input)) then - call MeshWrVTK(p_FAST%TurbinePos, FEAM%y%PtFairleadLoad, trim(p_FAST%VTK_OutFileRoot)//'.FEAM_PtFairlead', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, FEAM%Input(1)%PtFairleadDisplacement ) - !call MeshWrVTK(p_FAST%TurbinePos, FEAM%Input(1)%PtFairleadDisplacement, trim(p_FAST%VTK_OutFileRoot)//'.FEAM_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - end if - -! Orca - ELSEIF ( p_FAST%CompMooring == Module_Orca ) THEN - if (allocated(Orca%Input)) then - call MeshWrVTK(p_FAST%TurbinePos, Orca%y%PtfmMesh, trim(p_FAST%VTK_OutFileRoot)//'.Orca_PtfmMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Orca%Input(1)%PtfmMesh ) - !call MeshWrVTK(p_FAST%TurbinePos, Orca%Input(1)%PtfmMesh, trim(p_FAST%VTK_OutFileRoot)//'.Orca_PtfmMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - end if - END IF - - -! IceFloe - IF ( p_FAST%CompIce == Module_IceF ) THEN - if (allocated(IceF%Input)) then - call MeshWrVTK(p_FAST%TurbinePos, IceF%y%iceMesh, trim(p_FAST%VTK_OutFileRoot)//'.IceF_iceMesh', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, IceF%Input(1)%iceMesh ) - !call MeshWrVTK(p_FAST%TurbinePos, IceF%Input(1)%iceMesh, trim(p_FAST%VTK_OutFileRoot)//'.IceF_iceMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - end if - -! IceDyn - ELSEIF ( p_FAST%CompIce == Module_IceD ) THEN - if (allocated(IceD%Input) .and. allocated(IceD%y)) then - - DO k = 1,p_FAST%numIceLegs - call MeshWrVTK(p_FAST%TurbinePos, IceD%y(k)%PointMesh, trim(p_FAST%VTK_OutFileRoot)//'.IceD_PointMesh'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, IceD%Input(1,k)%PointMesh ) - !call MeshWrVTK(p_FAST%TurbinePos, IceD%Input(1,k)%PointMesh, trim(p_FAST%VTK_OutFileRoot)//'.IceD_PointMesh_motion'//trim(num2lstr(k)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - END DO - end if - - END IF - - -END SUBROUTINE WrVTK_AllMeshes -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine writes a minimal subset of meshes (enough to visualize the turbine) to VTK-formatted files. It doesn't bother with -!! returning an error code. -SUBROUTINE WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(IN ) :: y_FAST !< Output variables for the glue code - TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules - - TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data - TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data - TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop - - INTEGER(IntKi) :: NumBl, k, j - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - CHARACTER(*), PARAMETER :: RoutineName = 'WrVTK_BasicMeshes' - - - NumBl = 0 - if (allocated(ED%y%BladeRootMotion)) then - NumBl = SIZE(ED%y%BladeRootMotion) - elseif (allocated(SED%y%BladeRootMotion)) then - NumBl = SIZE(SED%y%BladeRootMotion) - end if - - -! Blades - IF ( p_FAST%CompAero == Module_AD .and. ALLOCATED(AD%Input) ) THEN ! These meshes may have airfoil data associated with nodes... - if (allocated(AD%Input(1)%rotors) .and. allocated(AD%y%rotors)) then - DO K=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, AD%Input(1)%rotors(1)%BladeMotion(K), trim(p_FAST%VTK_OutFileRoot)//'.AD_Blade'//trim(num2lstr(k)), & - y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Sib=AD%y%rotors(1)%BladeLoad(K) ) - END DO - end if - ELSE IF ( p_FAST%CompElast == Module_BD .and. ALLOCATED(BD%y)) THEN - DO K=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, BD%y(k)%BldMotion, trim(p_FAST%VTK_OutFileRoot)//'.BD_BldMotion'//trim(num2lstr(k)), & - y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - END DO - ELSE IF ( p_FAST%CompElast == Module_ED ) THEN - DO K=1,NumBl - call MeshWrVTK(p_FAST%TurbinePos, ED%y%BladeLn2Mesh(K), trim(p_FAST%VTK_OutFileRoot)//'.ED_BladeLn2Mesh_motion'//trim(num2lstr(k)), & - y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - END DO - END IF - -! Nacelle - if (p_FAST%CompElast == Module_SED) then - if (allocated(SED%Input)) then - ! Nacelle - call MeshWrVTK(p_FAST%TurbinePos, SED%y%NacelleMotion, trim(p_FAST%VTK_OutFileRoot)//'.SED_NacelleMotion', y_FAST%VTK_count, & - p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - ! Hub - call MeshWrVTK(p_FAST%TurbinePos, SED%y%HubPtMotion, trim(p_FAST%VTK_OutFileRoot)//'.SED_HubPtMotion', y_FAST%VTK_count, & - p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - ! Tower motions - call MeshWrVTK(p_FAST%TurbinePos, SED%y%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SED_TowerLn2Mesh', y_FAST%VTK_count, & - p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth) - end if - else - if (allocated(ED%Input)) then - ! Nacelle - call MeshWrVTK(p_FAST%TurbinePos, ED%y%NacelleMotion, trim(p_FAST%VTK_OutFileRoot)//'.ED_Nacelle', y_FAST%VTK_count, & - p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Sib=ED%Input(1)%NacelleLoads ) - ! TailFin - call MeshWrVTK(p_FAST%TurbinePos, ED%y%TFinCMMotion, trim(p_FAST%VTK_OutFileRoot)//'.ED_TailFin', y_FAST%VTK_count, & - p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Sib=ED%Input(1)%TFinCMLoads ) - ! Hub - call MeshWrVTK(p_FAST%TurbinePos, ED%y%HubPtMotion, trim(p_FAST%VTK_OutFileRoot)//'.ED_Hub', y_FAST%VTK_count, & - p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, Sib=ED%Input(1)%HubPtLoad ) - ! Tower motions - call MeshWrVTK(p_FAST%TurbinePos, ED%y%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_TowerLn2Mesh_motion', & - y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - end if - endif - - -! Substructure -! call MeshWrVTK(p_FAST%TurbinePos, ED%y%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_PlatformPtMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) -! IF ( p_FAST%CompSub == Module_SD ) THEN -! call MeshWrVTK(p_FAST%TurbinePos, SD%Input(1)%TPMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_TPMesh_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) -! call MeshWrVTK(p_FAST%TurbinePos, SD%y%y2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y2Mesh_motion', y_FAST%VTK_count, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) -! call MeshWrVTK(p_FAST%TurbinePos, SD%y%y3Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y3Mesh_motion', y_FAST%VTK_count, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) -! END IF - - IF ( p_FAST%CompHydro == Module_HD .and. ALLOCATED(HD%Input)) THEN - call MeshWrVTK(p_FAST%TurbinePos, HD%Input(1)%WAMITMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_WAMIT', y_FAST%VTK_count, & - p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%y%WAMITMesh ) - call MeshWrVTK(p_FAST%TurbinePos, HD%Input(1)%Morison%Mesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_MorisonPt', y_FAST%VTK_count, & - p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%y%Morison%Mesh ) - if (HD%y%Morison%VisMesh%Committed) then - call MeshWrVTK(p_FAST%TurbinePos, HD%y%Morison%VisMesh, trim(p_FAST%VTK_OutFileRoot)//'.HD_Morison', y_FAST%VTK_count, & - p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, HD%Input(1)%Morison%Mesh ) - endif - END IF - - -! Mooring Lines? -! IF ( p_FAST%CompMooring == Module_MAP ) THEN -! call MeshWrVTK(p_FAST%TurbinePos, MAPp%Input(1)%PtFairDisplacement, trim(p_FAST%VTK_OutFileRoot)//'.MAP_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - if ( p_FAST%CompMooring == Module_MD ) then - !call MeshWrVTK(p_FAST%TurbinePos, MD%Input(1)%CoupledKinematics, trim(p_FAST%VTK_OutFileRoot)//'.MD_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) - if (allocated(MD%y%VisLinesMesh)) then - do j=1,size(MD%y%VisLinesMesh) - if (MD%y%VisLinesMesh(j)%Committed) then - call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisLinesMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.MD_Line'//trim(Num2LStr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) - endif - enddo - endif - if (allocated(MD%y%VisRodsMesh)) then - do j=1,size(MD%y%VisRodsMesh) - if (MD%y%VisRodsMesh(j)%Committed) then - call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisRodsMesh(j), trim(p_FAST%VTK_OutFileRoot)//'.MD_Rod'//trim(Num2LStr(j)), y_FAST%VTK_count, p_FAST%VTK_fields, ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) - endif - enddo - endif - endif -! ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN -! call MeshWrVTK(p_FAST%TurbinePos, FEAM%Input(1)%PtFairleadDisplacement, trim(p_FAST%VTK_OutFileRoot)//'FEAM_PtFair_motion', y_FAST%VTK_count, p_FAST%VTK_fields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth ) -! END IF - - -END SUBROUTINE WrVTK_BasicMeshes -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine writes a minimal subset of meshes with surfaces to VTK-formatted files. It doesn't bother with -!! returning an error code. -SUBROUTINE WrVTK_Surfaces(t_global, p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - use FVW_IO, only: WrVTK_FVW - - REAL(DbKi), INTENT(IN ) :: t_global !< Current global time - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code (only because we're updating VTK_LastWaveIndx) - TYPE(FAST_ModuleMapType), INTENT(IN ) :: MeshMapData !< Data for mapping between modules - - TYPE(ElastoDyn_Data), INTENT(IN ) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(IN ) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(IN ) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(IN ) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(IN ) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(IN ) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(IN ) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(IN ) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(IN ) :: SD !< SubDyn data - TYPE(MAP_Data), INTENT(IN ) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(IN ) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(IN ) :: MD !< MoorDyn data - TYPE(OrcaFlex_Data), INTENT(IN ) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(IN ) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(IN ) :: IceD !< All the IceDyn data used in time-step loop - - - logical, parameter :: OutputFields = .FALSE. ! due to confusion about what fields mean on a surface, we are going to just output the basic meshes if people ask for fields - INTEGER(IntKi) :: NumBl, k, L - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMSg2 - CHARACTER(*), PARAMETER :: RoutineName = 'WrVTK_Surfaces' - - NumBl = 0 - if (allocated(ED%y%BladeRootMotion)) then - NumBl = SIZE(ED%y%BladeRootMotion) - elseif (allocated(SED%y%BladeRootMotion)) then - NumBl = SIZE(SED%y%BladeRootMotion) - end if - -! Ground (written at initialization) - -! Wave elevation - if ( allocated( p_FAST%VTK_Surface%WaveElevVisGrid ) ) call WrVTK_WaveElevVisGrid( t_global, p_FAST, y_FAST, SeaSt) - - if (allocated(ED%Input)) then - ! Nacelle - call MeshWrVTK_PointSurface (p_FAST%TurbinePos, ED%y%NacelleMotion, trim(p_FAST%VTK_OutFileRoot)//'.NacelleSurface', & - y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts = p_FAST%VTK_Surface%NacelleBox, Sib=ED%Input(1)%NacelleLoads ) - ! TailFin TODO TailFin - !call MeshWrVTK_PointSurface (p_FAST%TurbinePos, ED%y%TFinCMMotion, trim(p_FAST%VTK_OutFileRoot)//'.TailFinSurface', & - ! y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts = p_FAST%VTK_Surface%TFinBox, Sib=ED%Input(1)%TFinCMLoads ) - - ! Hub - call MeshWrVTK_PointSurface (p_FAST%TurbinePos, ED%y%HubPtMotion, trim(p_FAST%VTK_OutFileRoot)//'.HubSurface', & - y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , & - NumSegments=p_FAST%VTK_Surface%NumSectors, radius=p_FAST%VTK_Surface%HubRad, Sib=ED%Input(1)%HubPtLoad ) - - ! Tower motions - call MeshWrVTK_Ln2Surface (p_FAST%TurbinePos, ED%y%TowerLn2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.TowerSurface', & - y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, p_FAST%VTK_Surface%NumSectors, p_FAST%VTK_Surface%TowerRad ) - end if - -! Blades - IF ( p_FAST%CompAero == Module_AD .and. allocated(AD%Input)) THEN ! These meshes may have airfoil data associated with nodes... - if (allocated(AD%Input(1)%rotors) .and. allocated(AD%y%rotors)) then - DO K=1,NumBl - call MeshWrVTK_Ln2Surface (p_FAST%TurbinePos, AD%Input(1)%rotors(1)%BladeMotion(K), trim(p_FAST%VTK_OutFileRoot)//'.Blade'//trim(num2lstr(k))//'Surface', & - y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts=p_FAST%VTK_Surface%BladeShape(K)%AirfoilCoords & - ,Sib=AD%y%rotors(1)%BladeLoad(k) ) - END DO - end if - ELSE IF ( p_FAST%CompElast == Module_BD .and. allocated(BD%y)) THEN - DO K=1,NumBl - call MeshWrVTK_Ln2Surface (p_FAST%TurbinePos, BD%y(k)%BldMotion, trim(p_FAST%VTK_OutFileRoot)//'.Blade'//trim(num2lstr(k))//'Surface', & - y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts=p_FAST%VTK_Surface%BladeShape(K)%AirfoilCoords ) - END DO - ELSE IF ( p_FAST%CompElast == Module_ED ) THEN - DO K=1,NumBl - call MeshWrVTK_Ln2Surface (p_FAST%TurbinePos, ED%y%BladeLn2Mesh(K), trim(p_FAST%VTK_OutFileRoot)//'.Blade'//trim(num2lstr(k))//'Surface', & - y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth , verts=p_FAST%VTK_Surface%BladeShape(K)%AirfoilCoords ) - END DO -! ELSE IF ( p_FAST%CompElast == Module_SED ) THEN ! No surface info from SED - END IF - -! Free wake - if (allocated(AD%m%FVW_u)) then - if (allocated(AD%m%FVW_u(1)%WingsMesh)) then - call WrVTK_FVW(AD%p%FVW, AD%x(1)%FVW, AD%z(1)%FVW, AD%m%FVW, trim(p_FAST%VTK_OutFileRoot)//'.FVW', y_FAST%VTK_count, p_FAST%VTK_tWidth, bladeFrame=.FALSE.) ! bladeFrame==.FALSE. to output in global coords - end if - end if - - -! Platform -! call MeshWrVTK_PointSurface (p_FAST%TurbinePos, ED%y%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.PlatformSurface', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, Radius = p_FAST%VTK_Surface%GroundRad ) - - -! Substructure -! call MeshWrVTK(p_FAST%TurbinePos, ED%y%PlatformPtMesh, trim(p_FAST%VTK_OutFileRoot)//'.ED_PlatformPtMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) -! IF ( p_FAST%CompSub == Module_SD ) THEN -! call MeshWrVTK(p_FAST%TurbinePos, SD%Input(1)%TPMesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_TPMesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) -! call MeshWrVTK(p_FAST%TurbinePos, SD%y%y2Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y2Mesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) -! call MeshWrVTK(p_FAST%TurbinePos, SD%y%y3Mesh, trim(p_FAST%VTK_OutFileRoot)//'.SD_y3Mesh_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) -! END IF - - -! HydroDyn - IF ( HD%y%Morison%VisMesh%Committed ) THEN - call MeshWrVTK_Ln2Surface (p_FAST%TurbinePos, HD%y%Morison%VisMesh, trim(p_FAST%VTK_OutFileRoot)//'.MorisonSurface', & - y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2, p_FAST%VTK_tWidth, p_FAST%VTK_Surface%NumSectors, & - p_FAST%VTK_Surface%MorisonVisRad ) - END IF - - -! Mooring Lines? -! IF ( p_FAST%CompMooring == Module_MAP ) THEN -! call MeshWrVTK(p_FAST%TurbinePos, MAPp%Input(1)%PtFairDisplacement, trim(p_FAST%VTK_OutFileRoot)//'.MAP_PtFair_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) - if ( p_FAST%CompMooring == Module_MD ) THEN - !call MeshWrVTK(p_FAST%TurbinePos, MD%Input(1)%CoupledKinematics, trim(p_FAST%VTK_OutFileRoot)//'.MD_PtFair_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) - if (allocated(MD%y%VisLinesMesh)) then - do L=1,size(MD%y%VisLinesMesh) - if (MD%y%VisLinesMesh(L)%Committed) then ! No orientation data, so surface representation not possible - call MeshWrVTK(p_FAST%TurbinePos, MD%y%VisLinesMesh(L), trim(p_FAST%VTK_OutFileRoot)//'.MD_Line'//trim(Num2LStr(L)), y_FAST%VTK_count, p_FAST%VTK_fields, & - ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth ) - endif - enddo - endif - if (allocated(MD%y%VisRodsMesh)) then - do L=1,size(MD%y%VisRodsMesh) - if (MD%y%VisRodsMesh(L)%Committed) then ! No orientation data, so surface representation not possible - call MeshWrVTK_Ln2Surface(p_FAST%TurbinePos, MD%y%VisRodsMesh(L), trim(p_FAST%VTK_OutFileRoot)//'.MD_Rod'//trim(Num2LStr(L))//'Surface', y_FAST%VTK_count, p_FAST%VTK_fields, & - ErrSTat2, ErrMsg2, p_FAST%VTK_tWidth, NumSegments=p_FAST%VTK_Surface%NumSectors, Radius=MD%p%VisRodsDiam(L)%Diam ) - endif - enddo - endif - endif -! ELSEIF ( p_FAST%CompMooring == Module_FEAM ) THEN -! call MeshWrVTK(p_FAST%TurbinePos, FEAM%Input(1)%PtFairleadDisplacement, trim(p_FAST%VTK_OutFileRoot)//'FEAM_PtFair_motion', y_FAST%VTK_count, OutputFields, ErrStat2, ErrMsg2 ) -! END IF - - - if (p_FAST%VTK_fields) then - call WrVTK_BasicMeshes(p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - end if - - -END SUBROUTINE WrVTK_Surfaces -!---------------------------------------------------------------------------------------------------------------------------------- -!> This subroutine writes the wave elevation data for a given time step -SUBROUTINE WrVTK_WaveElevVisGrid(t_global, p_FAST, y_FAST, SeaSt) - - REAL(DbKi), INTENT(IN ) :: t_global !< Current global time - TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - - TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data - - ! local variables - INTEGER(IntKi) :: Un ! fortran unit number - INTEGER(IntKi) :: n, iy, ix ! loop counters - REAL(SiKi) :: t - CHARACTER(1024) :: FileName - INTEGER(IntKi) :: NumberOfPoints - INTEGER(IntKi), parameter :: NumberOfLines = 0 - INTEGER(IntKi) :: NumberOfPolys - CHARACTER(1024) :: Tstr - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*),PARAMETER :: RoutineName = 'WrVTK_WaveElevVisGrid' - - - NumberOfPoints = p_FAST%VTK_surface%NWaveElevPts(1) * p_FAST%VTK_surface%NWaveElevPts(2) - ! I'm going to make triangles for now. we should probably just make this a structured file at some point - NumberOfPolys = ( p_FAST%VTK_surface%NWaveElevPts(1) - 1 ) * & - ( p_FAST%VTK_surface%NWaveElevPts(2) - 1 ) * 2 - - !................................................................. - ! write the data that potentially changes each time step: - !................................................................. - ! construct the string for the zero-padded VTK write-out step - write(Tstr, '(i' // trim(Num2LStr(p_FAST%VTK_tWidth)) //'.'// trim(Num2LStr(p_FAST%VTK_tWidth)) // ')') y_FAST%VTK_count - - ! PolyData (.vtp) - Serial vtkPolyData (unstructured) file - FileName = TRIM(p_FAST%VTK_OutFileRoot)//'.WaveSurface.'//TRIM(Tstr)//'.vtp' - - call WrVTK_header( FileName, NumberOfPoints, NumberOfLines, NumberOfPolys, Un, ErrStat2, ErrMsg2 ) - if (ErrStat2 >= AbortErrLev) return - -! points (nodes, augmented with NumSegments): - WRITE(Un,'(A)') ' ' - WRITE(Un,'(A)') ' ' - - ! I'm not going to interpolate in time; I'm just going to get the index of the closest wave time value - t = REAL(t_global,SiKi) - call GetWaveElevIndx( t, SeaSt%p%WaveField%WaveTime, y_FAST%VTK_LastWaveIndx ) - - do ix=1,p_FAST%VTK_surface%NWaveElevPts(1) - do iy=1,p_FAST%VTK_surface%NWaveElevPts(2) - WRITE(Un,VTK_AryFmt) p_FAST%VTK_surface%WaveElevVisX(ix), p_FAST%VTK_surface%WaveElevVisY(iy), p_FAST%VTK_surface%WaveElevVisGrid(y_FAST%VTK_LastWaveIndx,ix,iy) - end do - end do - - WRITE(Un,'(A)') ' ' - WRITE(Un,'(A)') ' ' - - - WRITE(Un,'(A)') ' ' - WRITE(Un,'(A)') ' ' - - do ix=1,p_FAST%VTK_surface%NWaveElevPts(1)-1 - do iy=1,p_FAST%VTK_surface%NWaveElevPts(2)-1 - n = p_FAST%VTK_surface%NWaveElevPts(2)*(ix-1)+iy - 1 ! points start at 0 - - WRITE(Un,'(3(i7))') n, n+1, n+p_FAST%VTK_surface%NWaveElevPts(2) - WRITE(Un,'(3(i7))') n+1, n+1+p_FAST%VTK_surface%NWaveElevPts(2), n+p_FAST%VTK_surface%NWaveElevPts(2) - - end do - end do - WRITE(Un,'(A)') ' ' - - WRITE(Un,'(A)') ' ' - do n=1,NumberOfPolys - WRITE(Un,'(i7)') 3*n - end do - WRITE(Un,'(A)') ' ' - WRITE(Un,'(A)') ' ' - - call WrVTK_footer( Un ) - -END SUBROUTINE WrVTK_WaveElevVisGrid -!---------------------------------------------------------------------------------------------------------------------------------- -!> This function returns the index, Ind, of the XAry closest to XValIn, where XAry is assumed to be periodic. It starts -!! searching at the value of Ind from a previous step. -SUBROUTINE GetWaveElevIndx( XValIn, XAry, Ind ) - - ! Argument declarations. - - INTEGER, INTENT(INOUT) :: Ind ! Initial and final index into the arrays. - - REAL(SiKi), INTENT(IN) :: XAry (:) !< Array of X values to be interpolated. - REAL(SiKi), INTENT(IN) :: XValIn !< X value to be found - - - INTEGER :: AryLen ! Length of the arrays. - REAL(SiKi) :: XVal !< X to be found (wrapped/periodic) - - - AryLen = size(XAry) - - ! Wrap XValIn into the range XAry(1) to XAry(AryLen) - XVal = MOD(XValIn, XAry(AryLen)) - - - - ! Let's check the limits first. - - IF ( XVal <= XAry(1) ) THEN - Ind = 1 - RETURN - ELSE IF ( XVal >= XAry(AryLen) ) THEN - Ind = AryLen - RETURN - ELSE - ! Set the Ind to the first index if we are at the beginning of XAry - IF ( XVal <= XAry(2) ) THEN - Ind = 1 - END IF - END IF - - - ! Let's interpolate! - - Ind = MAX( MIN( Ind, AryLen-1 ), 1 ) - - DO - - IF ( XVal < XAry(Ind) ) THEN - - Ind = Ind - 1 - - ELSE IF ( XVal >= XAry(Ind+1) ) THEN - - Ind = Ind + 1 - - ELSE - - ! XAry(Ind) <= XVal < XAry(Ind+1) - ! this would make it the "closest" node, but I'm not going to worry about that for visualization purposes - !if ( XVal > (XAry(Ind+1) + XAry(Ind))/2.0_SiKi ) Ind = Ind + 1 - - RETURN - - END IF - - END DO - - RETURN -END SUBROUTINE GetWaveElevIndx -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine writes Input Mesh information to a binary file (for debugging). It both opens and closes the file. -SUBROUTINE WriteInputMeshesToFile(u_ED, u_AD, u_SD, u_HD, u_MAP, u_BD, FileName, ErrStat, ErrMsg) - TYPE(ED_InputType), INTENT(IN) :: u_ED !< ElastoDyn inputs - TYPE(AD_InputType), INTENT(IN) :: u_AD !< AeroDyn inputs - TYPE(SD_InputType), INTENT(IN) :: u_SD !< SubDyn inputs - TYPE(HydroDyn_InputType), INTENT(IN) :: u_HD !< HydroDyn inputs - TYPE(MAP_InputType), INTENT(IN) :: u_MAP !< MAP inputs - TYPE(BD_InputType), INTENT(IN) :: u_BD(:) !< BeamDyn inputs - CHARACTER(*), INTENT(IN) :: FileName !< Name of file to write this information to - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - INTEGER(IntKi) :: unOut - INTEGER(IntKi) :: K_local - INTEGER(B4Ki), PARAMETER :: File_ID = 3 - INTEGER(B4Ki) :: NumBl - - ! Open the binary output file: - unOut=-1 - !$OMP critical(fileopen_critical) - CALL GetNewUnit( unOut, ErrStat, ErrMsg ) - CALL OpenBOutFile ( unOut, TRIM(FileName), ErrStat, ErrMsg ) - !$OMP end critical(fileopen_critical) - IF (ErrStat /= ErrID_None) RETURN - - ! note that I'm not doing anything with the errors here, so it won't tell - ! you there was a problem writing the data unless it was the last call. - - ! Add a file identification number (in case we ever have to change this): - WRITE( unOut, IOSTAT=ErrStat ) File_ID - - ! Add how many blade meshes there are: - NumBl = SIZE(u_ED%BladePtLoads,1) ! Note that NumBl is B4Ki - WRITE( unOut, IOSTAT=ErrStat ) NumBl - - ! Add all of the input meshes: - DO K_local = 1,NumBl - CALL MeshWrBin( unOut, u_ED%BladePtLoads(K_local), ErrStat, ErrMsg ) - END DO - CALL MeshWrBin( unOut, u_ED%TowerPtLoads, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_ED%PlatformPtMesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_SD%TPMesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_SD%LMesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_HD%Morison%Mesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_HD%WAMITMesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_MAP%PtFairDisplacement, ErrStat, ErrMsg ) - ! Add how many BD blade meshes there are: -!FIXME: if u_BD is not allocated, size could return garbage here!!!! - NumBl = SIZE(u_BD,1) ! Note that NumBl is B4Ki - WRITE( unOut, IOSTAT=ErrStat ) NumBl - - DO K_local = 1,NumBl - CALL MeshWrBin( unOut, u_BD(K_local)%RootMotion, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_BD(K_local)%DistrLoad, ErrStat, ErrMsg ) - END DO - - ! Add how many AD blade meshes there are: - NumBl = SIZE(u_AD%rotors(1)%BladeMotion,1) ! Note that NumBl is B4Ki - WRITE( unOut, IOSTAT=ErrStat ) NumBl - - DO K_local = 1,NumBl - CALL MeshWrBin( unOut, u_AD%rotors(1)%BladeMotion(k_local), ErrStat, ErrMsg ) - END DO - - ! Close the file - CLOSE(unOut) - -END SUBROUTINE WriteInputMeshesToFile -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine writes motion mesh data to a binary file (for rudimentary visualization and debugging). If unOut < 0, a new file -!! will be opened for writing (FileName). It is up to the caller of this routine to close the file. -SUBROUTINE WriteMotionMeshesToFile(time, y_ED, u_SD, y_SD, u_HD, u_MAP, y_BD, u_BD, UnOut, ErrStat, ErrMsg, FileName) - REAL(DbKi), INTENT(IN) :: time !< current simulation time - TYPE(ED_OutputType), INTENT(IN) :: y_ED !< ElastoDyn outputs - TYPE(SD_InputType), INTENT(IN) :: u_SD !< SubDyn inputs - TYPE(SD_OutputType), INTENT(IN) :: y_SD !< SubDyn outputs - TYPE(HydroDyn_InputType), INTENT(IN) :: u_HD !< HydroDyn inputs - TYPE(MAP_InputType), INTENT(IN) :: u_MAP !< MAP inputs - TYPE(BD_OutputType), INTENT(IN) :: y_BD(:) !< BeamDyn outputs - TYPE(BD_InputType), INTENT(IN) :: u_BD(:) !< BeamDyn inputs - INTEGER(IntKi) , INTENT(INOUT) :: unOut !< Unit number to write where this info should be written. If unOut < 0, a new file will be opened and the opened unit number will be returned. - CHARACTER(*), INTENT(IN) :: FileName !< If unOut < 0, FileName will be opened for writing this mesh information. - - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - - REAL(R8Ki) :: t - - INTEGER(IntKi) :: K_local - INTEGER(B4Ki), PARAMETER :: File_ID = 101 - INTEGER(B4Ki) :: NumBl - - t = time ! convert to 8-bytes if necessary (DbKi might not be R8Ki) - - ! note that I'm not doing anything with the errors here, so it won't tell - ! you there was a problem writing the data unless it was the last call. - - - ! Open the binary output file and write a header: - if (unOut<0) then - !$OMP critical(fileopen_critical) - CALL GetNewUnit( unOut, ErrStat, ErrMsg ) - - CALL OpenBOutFile ( unOut, TRIM(FileName), ErrStat, ErrMsg ) - !$OMP end critical(fileopen_critical) - IF (ErrStat /= ErrID_None) RETURN - - ! Add a file identification number (in case we ever have to change this): - WRITE( unOut, IOSTAT=ErrStat ) File_ID - - ! Add how many blade meshes there are: - NumBl = SIZE(y_ED%BladeLn2Mesh,1) ! Note that NumBl is B4Ki - WRITE( unOut, IOSTAT=ErrStat ) NumBl -!FIXME: if y_BD is not allocated, size could return garbage here!!!! - NumBl = SIZE(y_BD,1) ! Note that NumBl is B4Ki - WRITE( unOut, IOSTAT=ErrStat ) NumBl - end if - - WRITE( unOut, IOSTAT=ErrStat ) t - - ! Add all of the meshes with motions: - DO K_local = 1,SIZE(y_ED%BladeLn2Mesh,1) - CALL MeshWrBin( unOut, y_ED%BladeLn2Mesh(K_local), ErrStat, ErrMsg ) - END DO - CALL MeshWrBin( unOut, y_ED%TowerLn2Mesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, y_ED%PlatformPtMesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_SD%TPMesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, y_SD%y2Mesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, y_SD%y3Mesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_HD%Morison%Mesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_HD%WAMITMesh, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, u_MAP%PtFairDisplacement, ErrStat, ErrMsg ) - DO K_local = 1,SIZE(y_BD,1) - CALL MeshWrBin( unOut, u_BD(K_local)%RootMotion, ErrStat, ErrMsg ) - CALL MeshWrBin( unOut, y_BD(K_local)%BldMotion, ErrStat, ErrMsg ) - END DO - - ! - ! ! Close the file - !CLOSE(unOut) - ! -END SUBROUTINE WriteMotionMeshesToFile -!---------------------------------------------------------------------------------------------------------------------------------- - - -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! Linerization routines -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> Routine that calls FAST_Linearize_T for an array of Turbine data structures if the linearization flag is set for each individual turbine. -SUBROUTINE FAST_Linearize_Tary(t_initial, n_t_global, Turbine, ErrStat, ErrMsg) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial simulation time (almost always 0) - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< integer time step - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine(:) !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - INTEGER(IntKi) :: i_turb, NumTurbines - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Linearize_Tary' - - - NumTurbines = SIZE(Turbine) - ErrStat = ErrID_None - ErrMsg = "" - - DO i_turb = 1,NumTurbines - - CALL FAST_Linearize_T(t_initial, n_t_global, Turbine(i_turb), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN - - END DO - - -END SUBROUTINE FAST_Linearize_Tary -!---------------------------------------------------------------------------------------------------------------------------------- -!> Routine that performs lineaization at an operating point for a turbine. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -SUBROUTINE FAST_Linearize_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial simulation time (almost always 0) - INTEGER(IntKi), INTENT(IN ) :: n_t_global !< integer time step - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables - REAL(DbKi) :: t_global ! current simulation time - REAL(DbKi) :: next_lin_time ! next simulation time where linearization analysis should be performed - INTEGER(IntKi) :: iLinTime ! loop counter - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Linearize_T' - - - ErrStat = ErrID_None - ErrMsg = "" - - if ( .not. Turbine%p_FAST%Linearize ) return - - if (.not. Turbine%p_FAST%CalcSteady) then - - if ( Turbine%m_FAST%Lin%NextLinTimeIndx <= Turbine%p_FAST%NLinTimes ) then !bjj: maybe this logic should go in FAST_Linearize_OP??? - - next_lin_time = Turbine%m_FAST%Lin%LinTimes( Turbine%m_FAST%Lin%NextLinTimeIndx ) - t_global = t_initial + n_t_global*Turbine%p_FAST%dt - - if ( EqualRealNos( t_global, next_lin_time ) .or. t_global > next_lin_time ) then + REAL(DbKi), INTENT(IN ) :: t_global !< Current global time + TYPE(FAST_ParameterType), INTENT(IN ) :: p_FAST !< Parameters for the glue code + TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - CALL FAST_Linearize_OP(t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%IfW, Turbine%ExtInfw, & - Turbine%HD, Turbine%SeaSt, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN + TYPE(SeaState_Data), INTENT(IN ) :: SeaSt !< SeaState data - if (Turbine%p_FAST%WrVTK == VTK_ModeShapes) then - if (Turbine%m_FAST%Lin%NextLinTimeIndx > Turbine%p_FAST%NLinTimes) call WrVTKCheckpoint() - end if + ! local variables + INTEGER(IntKi) :: Un ! fortran unit number + INTEGER(IntKi) :: n, iy, ix ! loop counters + REAL(SiKi) :: t + CHARACTER(1024) :: FileName + INTEGER(IntKi) :: NumberOfPoints + INTEGER(IntKi), parameter :: NumberOfLines = 0 + INTEGER(IntKi) :: NumberOfPolys + CHARACTER(1024) :: Tstr + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + CHARACTER(*),PARAMETER :: RoutineName = 'WrVTK_WaveElevVisGrid' - end if - end if + NumberOfPoints = p_FAST%VTK_surface%NWaveElevPts(1) * p_FAST%VTK_surface%NWaveElevPts(2) + ! I'm going to make triangles for now. we should probably just make this a structured file at some point + NumberOfPolys = ( p_FAST%VTK_surface%NWaveElevPts(1) - 1 ) * & + ( p_FAST%VTK_surface%NWaveElevPts(2) - 1 ) * 2 - else ! CalcSteady + !................................................................. + ! write the data that potentially changes each time step: + !................................................................. + ! construct the string for the zero-padded VTK write-out step + write(Tstr, '(i' // trim(Num2LStr(p_FAST%VTK_tWidth)) //'.'// trim(Num2LStr(p_FAST%VTK_tWidth)) // ')') y_FAST%VTK_count - t_global = t_initial + n_t_global*Turbine%p_FAST%dt + ! PolyData (.vtp) - Serial vtkPolyData (unstructured) file + FileName = TRIM(p_FAST%VTK_OutFileRoot)//'.WaveSurface.'//TRIM(Tstr)//'.vtp' - call FAST_CalcSteady( n_t_global, t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, Turbine%ED, Turbine%BD, Turbine%SrvD, & - Turbine%AD, Turbine%IfW, Turbine%ExtInfw, Turbine%HD, Turbine%SeaSt, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, & - Turbine%Orca, Turbine%IceF, Turbine%IceD, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + call WrVTK_header( FileName, NumberOfPoints, NumberOfLines, NumberOfPolys, Un, ErrStat2, ErrMsg2 ) + if (ErrStat2 >= AbortErrLev) return - if (Turbine%m_FAST%Lin%FoundSteady) then - if (Turbine%m_FAST%Lin%ForceLin) then - Turbine%p_FAST%NLinTimes=1 - endif +! points (nodes, augmented with NumSegments): + WRITE(Un,'(A)') ' ' + WRITE(Un,'(A)') ' ' - do iLinTime=1,Turbine%p_FAST%NLinTimes - t_global = Turbine%m_FAST%Lin%LinTimes(iLinTime) + ! I'm not going to interpolate in time; I'm just going to get the index of the closest wave time value + t = REAL(t_global,SiKi) + call GetWaveElevIndx( t, SeaSt%p%WaveField%WaveTime, y_FAST%VTK_LastWaveIndx ) - call SetOperatingPoint(iLinTime, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, Turbine%ED, Turbine%BD, Turbine%SrvD, & - Turbine%AD, Turbine%IfW, Turbine%ExtInfw, Turbine%HD, Turbine%SeaSt, Turbine%SD, Turbine%ExtPtfm, & - Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, Turbine%IceF, Turbine%IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + do ix=1,p_FAST%VTK_surface%NWaveElevPts(1) + do iy=1,p_FAST%VTK_surface%NWaveElevPts(2) + WRITE(Un,VTK_AryFmt) p_FAST%VTK_surface%WaveElevVisX(ix), p_FAST%VTK_surface%WaveElevVisY(iy), p_FAST%VTK_surface%WaveElevVisGrid(y_FAST%VTK_LastWaveIndx,ix,iy) + end do + end do - if (Turbine%p_FAST%DT_UJac < Turbine%p_FAST%TMax) then - Turbine%m_FAST%calcJacobian = .true. - Turbine%m_FAST%NextJacCalcTime = t_global - end if + WRITE(Un,'(A)') ' ' + WRITE(Un,'(A)') ' ' - CALL CalcOutputs_And_SolveForInputs( -1, t_global, STATE_CURR, Turbine%m_FAST%calcJacobian, Turbine%m_FAST%NextJacCalcTime, & - Turbine%p_FAST, Turbine%m_FAST, .false., Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%ExtLd, Turbine%IfW, Turbine%ExtInfw, & - Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN - CALL FAST_Linearize_OP(t_global, Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%IfW, Turbine%ExtInfw, & - Turbine%HD, Turbine%SeaSt, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN + WRITE(Un,'(A)') ' ' + WRITE(Un,'(A)') ' ' - end do + do ix=1,p_FAST%VTK_surface%NWaveElevPts(1)-1 + do iy=1,p_FAST%VTK_surface%NWaveElevPts(2)-1 + n = p_FAST%VTK_surface%NWaveElevPts(2)*(ix-1)+iy - 1 ! points start at 0 - if (Turbine%p_FAST%WrVTK == VTK_ModeShapes) CALL WrVTKCheckpoint() + WRITE(Un,'(3(i7))') n, n+1, n+p_FAST%VTK_surface%NWaveElevPts(2) + WRITE(Un,'(3(i7))') n+1, n+1+p_FAST%VTK_surface%NWaveElevPts(2), n+p_FAST%VTK_surface%NWaveElevPts(2) - if (Turbine%m_FAST%Lin%ForceLin) then - ErrStat2 = ErrID_Warn - ErrMsg2 = 'Linearization was forced at simulation end. The linearized model may not be sufficiently representative of the solution in steady state.' - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - endif + end do + end do + WRITE(Un,'(A)') ' ' - end if + WRITE(Un,'(A)') ' ' + do n=1,NumberOfPolys + WRITE(Un,'(i7)') 3*n + end do + WRITE(Un,'(A)') ' ' + WRITE(Un,'(A)') ' ' - end if - return + call WrVTK_footer( Un ) -contains - subroutine WrVTKCheckpoint() - ! we are creating a checkpoint file for each turbine, so setting NumTurbines=1 in the file - CALL FAST_CreateCheckpoint_T(t_initial, Turbine%p_FAST%n_TMax_m1+1, 1, Turbine, TRIM(Turbine%p_FAST%OutFileRoot)//'.ModeShapeVTK', ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - end subroutine WrVTKCheckpoint -END SUBROUTINE FAST_Linearize_T +END SUBROUTINE WrVTK_WaveElevVisGrid !---------------------------------------------------------------------------------------------------------------------------------- +!> This function returns the index, Ind, of the XAry closest to XValIn, where XAry is assumed to be periodic. It starts +!! searching at the value of Ind from a previous step. +SUBROUTINE GetWaveElevIndx( XValIn, XAry, Ind ) -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -! PROGRAM EXIT ROUTINES -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> Routine that calls ExitThisProgram for one instance of a Turbine data structure. This is a separate subroutine so that the FAST -!! driver programs do not need to change or operate on the individual module level. -!! This routine should be called from glue code only (e.g., FAST_Prog.f90). It should not be called in any of these driver routines. -SUBROUTINE ExitThisProgram_T( Turbine, ErrLevel_in, StopTheProgram, ErrLocMsg, SkipRunTimeMsg ) + ! Argument declarations. - TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< Data for one turbine instance - INTEGER(IntKi), INTENT(IN) :: ErrLevel_in !< Error level when Error == .TRUE. (required when Error is .TRUE.) - LOGICAL, INTENT(IN) :: StopTheProgram !< flag indicating if the program should end (false if there are more turbines to end) - CHARACTER(*), OPTIONAL, INTENT(IN) :: ErrLocMsg !< an optional message describing the location of the error - LOGICAL, OPTIONAL, INTENT(IN) :: SkipRunTimeMsg !< an optional message describing run-time stats + INTEGER, INTENT(INOUT) :: Ind ! Initial and final index into the arrays. - LOGICAL :: SkipRunTimes - INTEGER(IntKi) :: ErrStat - CHARACTER(ErrMsgLen) :: ErrMsg + REAL(SiKi), INTENT(IN) :: XAry (:) !< Array of X values to be interpolated. + REAL(SiKi), INTENT(IN) :: XValIn !< X value to be found - IF (PRESENT(SkipRunTimeMsg)) THEN - SkipRunTimes = SkipRunTimeMsg - ELSE - SkipRunTimes = .FALSE. - END IF + INTEGER :: AryLen ! Length of the arrays. + REAL(SiKi) :: XVal !< X to be found (wrapped/periodic) - IF (PRESENT(ErrLocMsg)) THEN - CALL ExitThisProgram( Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrLevel_in, StopTheProgram, ErrLocMsg, SkipRunTimes ) + AryLen = size(XAry) - ELSE + ! Wrap XValIn into the range XAry(1) to XAry(AryLen) + XVal = MOD(XValIn, XAry(AryLen)) - CALL ExitThisProgram( Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, & - Turbine%ED, Turbine%SED, Turbine%BD, Turbine%SrvD, Turbine%AD, Turbine%ADsk, Turbine%IfW, Turbine%ExtInfw, & - Turbine%SeaSt, Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%MAP, Turbine%FEAM, Turbine%MD, Turbine%Orca, & - Turbine%IceF, Turbine%IceD, Turbine%MeshMapData, ErrLevel_in, StopTheProgram, SkipRunTimeMsg=SkipRunTimes ) - END IF + ! Let's check the limits first. - CALL FAST_DestroyTurbineType( Turbine, ErrStat, ErrMsg) ! just in case we missed some data in ExitThisProgram() + IF ( XVal <= XAry(1) ) THEN + Ind = 1 + RETURN + ELSE IF ( XVal >= XAry(AryLen) ) THEN + Ind = AryLen + RETURN + ELSE + ! Set the Ind to the first index if we are at the beginning of XAry + IF ( XVal <= XAry(2) ) THEN + Ind = 1 + END IF + END IF -END SUBROUTINE ExitThisProgram_T -!---------------------------------------------------------------------------------------------------------------------------------- -!> This subroutine is called when FAST exits. It calls all the modules' end routines and cleans up variables declared in the -!! main program. If there was an error, it also aborts. Otherwise, it prints the run times and performs a normal exit. -!! This routine should not be called from glue code (e.g., FAST_Prog.f90) or ExitThisProgram_T only. It should not be called in any -!! of these driver routines. -SUBROUTINE ExitThisProgram( p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrLevel_in, StopTheProgram, ErrLocMsg, SkipRunTimeMsg ) -!............................................................................................................................... + ! Let's interpolate! - ! Passed arguments - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables + Ind = MAX( MIN( Ind, AryLen-1 ), 1 ) - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + DO - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules + IF ( XVal < XAry(Ind) ) THEN - INTEGER(IntKi), INTENT(IN) :: ErrLevel_in !< Error level when Error == .TRUE. (required when Error is .TRUE.) - LOGICAL, INTENT(IN) :: StopTheProgram !< flag indicating if the program should end (false if there are more turbines to end) - CHARACTER(*), OPTIONAL, INTENT(IN) :: ErrLocMsg !< an optional message describing the location of the error - LOGICAL, OPTIONAL, INTENT(IN) :: SkipRunTimeMsg !< an optional message describing run-time stats + Ind = Ind - 1 + ELSE IF ( XVal >= XAry(Ind+1) ) THEN - ! Local variables: - INTEGER(IntKi) :: ErrorLevel - LOGICAL :: PrintRunTimes + Ind = Ind + 1 - INTEGER(IntKi) :: ErrStat2 ! Error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message - CHARACTER(1224) :: SimMsg ! optional message to print about where the error took place in the simulation + ELSE - CHARACTER(*), PARAMETER :: RoutineName = 'ExitThisProgram' + ! XAry(Ind) <= XVal < XAry(Ind+1) + ! this would make it the "closest" node, but I'm not going to worry about that for visualization purposes + !if ( XVal > (XAry(Ind+1) + XAry(Ind))/2.0_SiKi ) Ind = Ind + 1 + RETURN - ErrorLevel = ErrLevel_in + END IF - ! for debugging, let's output the meshes and all of their fields - IF ( ErrorLevel >= AbortErrLev .AND. p_FAST%WrVTK > VTK_None .and. .not. m_FAST%Lin%FoundSteady) THEN - p_FAST%VTK_OutFileRoot = trim(p_FAST%VTK_OutFileRoot)//'.DebugError' - p_FAST%VTK_fields = .true. - CALL WrVTK_AllMeshes(p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) - end if + END DO + RETURN +END SUBROUTINE GetWaveElevIndx +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine writes Input Mesh information to a binary file (for debugging). It both opens and closes the file. +SUBROUTINE WriteInputMeshesToFile(u_ED, u_AD, u_SD, u_HD, u_MAP, u_BD, FileName, ErrStat, ErrMsg) + TYPE(ED_InputType), INTENT(IN) :: u_ED(:) !< ElastoDyn inputs + TYPE(AD_InputType), INTENT(IN) :: u_AD !< AeroDyn inputs + TYPE(SD_InputType), INTENT(IN) :: u_SD !< SubDyn inputs + TYPE(HydroDyn_InputType), INTENT(IN) :: u_HD !< HydroDyn inputs + TYPE(MAP_InputType), INTENT(IN) :: u_MAP !< MAP inputs + TYPE(BD_InputType), INTENT(IN) :: u_BD(:) !< BeamDyn inputs + CHARACTER(*), INTENT(IN) :: FileName !< Name of file to write this information to + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ! If we are doing AeroMaps, there is leftover data in AD15 parameters - if (p_FAST%CompAeroMaps) then - if (associated(AD%p%FlowField)) deallocate(AD%p%FlowField) - endif + INTEGER(IntKi) :: unOut + INTEGER(IntKi) :: J_local, K_local + INTEGER(B4Ki), PARAMETER :: File_ID = 3 + INTEGER(B4Ki) :: NumBl + ! Open the binary output file: + unOut=-1 + !$OMP critical(fileopen_critical) + CALL GetNewUnit( unOut, ErrStat, ErrMsg ) + CALL OpenBOutFile ( unOut, TRIM(FileName), ErrStat, ErrMsg ) + !$OMP end critical(fileopen_critical) + IF (ErrStat /= ErrID_None) RETURN - ! End all modules - CALL FAST_EndMods( p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, IfW, SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat2, ErrMsg2 ) - IF (ErrStat2 /= ErrID_None) THEN - CALL WrScr( NewLine//RoutineName//':'//TRIM(ErrMsg2)//NewLine ) - ErrorLevel = MAX(ErrorLevel,ErrStat2) - END IF + ! note that I'm not doing anything with the errors here, so it won't tell + ! you there was a problem writing the data unless it was the last call. - ! Destroy all data associated with FAST variables: + ! Add a file identification number (in case we ever have to change this): + WRITE( unOut, IOSTAT=ErrStat ) File_ID - CALL FAST_DestroyAll( p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) - IF (ErrStat2 /= ErrID_None) THEN - CALL WrScr( NewLine//RoutineName//':'//TRIM(ErrMsg2)//NewLine ) - ErrorLevel = MAX(ErrorLevel,ErrStat2) - END IF + do J_local = 1,size(u_ED) + ! Add how many blade meshes there are: + NumBl = SIZE(u_ED(J_local)%BladePtLoads,1) ! Note that NumBl is B4Ki + WRITE( unOut, IOSTAT=ErrStat ) NumBl + ! Add all of the input meshes: + DO K_local = 1,NumBl + CALL MeshWrBin( unOut, u_ED(J_local)%BladePtLoads(K_local), ErrStat, ErrMsg ) + END DO + CALL MeshWrBin( unOut, u_ED(J_local)%TowerPtLoads, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, u_ED(J_local)%PlatformPtMesh, ErrStat, ErrMsg ) + end do + do J_local = 1,size(u_SD%TPMesh) + CALL MeshWrBin( unOut, u_SD%TPMesh(J_local), ErrStat, ErrMsg ) + end do + CALL MeshWrBin( unOut, u_SD%LMesh, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, u_HD%Morison%Mesh, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, u_HD%WAMITMesh, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, u_MAP%PtFairDisplacement, ErrStat, ErrMsg ) + ! Add how many BD blade meshes there are: +!FIXME: if u_BD is not allocated, size could return garbage here!!!! + NumBl = SIZE(u_BD,1) ! Note that NumBl is B4Ki + WRITE( unOut, IOSTAT=ErrStat ) NumBl - !............................................................................................................................ - ! Set exit error code if there was an error; - !............................................................................................................................ - IF ( ErrorLevel >= AbortErrLev ) THEN + DO K_local = 1,NumBl + CALL MeshWrBin( unOut, u_BD(K_local)%RootMotion, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, u_BD(K_local)%DistrLoad, ErrStat, ErrMsg ) + END DO - IF (PRESENT(ErrLocMsg)) THEN - SimMsg = ErrLocMsg - ELSE - SimMsg = 'after the simulation completed' - END IF + ! Add how many AD blade meshes there are: + NumBl = SIZE(u_AD%rotors(1)%BladeMotion,1) ! Note that NumBl is B4Ki + WRITE( unOut, IOSTAT=ErrStat ) NumBl - IF (y_FAST%UnSum > 0) THEN - CLOSE(y_FAST%UnSum) - y_FAST%UnSum = -1 - END IF + DO K_local = 1,NumBl + CALL MeshWrBin( unOut, u_AD%rotors(1)%BladeMotion(k_local), ErrStat, ErrMsg ) + END DO + ! Close the file + CLOSE(unOut) - SimMsg = TRIM(FAST_Ver%Name)//' encountered an error '//TRIM(SimMsg)//'.'//NewLine//' Simulation error level: '//TRIM(GetErrStr(ErrorLevel)) -#if (defined COMPILE_SIMULINK || defined COMPILE_LABVIEW) - ! When built as a shared library/dll, don't end the program. - CALL WrScr(trim(SimMsg)) -#else - if (StopTheProgram) then - CALL ProgAbort( trim(SimMsg), TrapErrors=.FALSE., TimeWait=3._ReKi ) ! wait 3 seconds (in case they double-clicked and got an error) - else - CALL WrScr(trim(SimMsg)) - end if -#endif - END IF +END SUBROUTINE WriteInputMeshesToFile +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine writes motion mesh data to a binary file (for rudimentary visualization and debugging). If unOut < 0, a new file +!! will be opened for writing (FileName). It is up to the caller of this routine to close the file. +SUBROUTINE WriteMotionMeshesToFile(time, y_ED, u_SD, y_SD, u_HD, u_MAP, y_BD, u_BD, UnOut, ErrStat, ErrMsg, FileName) + REAL(DbKi), INTENT(IN) :: time !< current simulation time + TYPE(ED_OutputType), INTENT(IN) :: y_ED(:) !< ElastoDyn outputs + TYPE(SD_InputType), INTENT(IN) :: u_SD !< SubDyn inputs + TYPE(SD_OutputType), INTENT(IN) :: y_SD !< SubDyn outputs + TYPE(HydroDyn_InputType), INTENT(IN) :: u_HD !< HydroDyn inputs + TYPE(MAP_InputType), INTENT(IN) :: u_MAP !< MAP inputs + TYPE(BD_OutputType), INTENT(IN) :: y_BD(:) !< BeamDyn outputs + TYPE(BD_InputType), INTENT(IN) :: u_BD(:) !< BeamDyn inputs + INTEGER(IntKi) , INTENT(INOUT) :: unOut !< Unit number to write where this info should be written. If unOut < 0, a new file will be opened and the opened unit number will be returned. + CHARACTER(*), INTENT(IN) :: FileName !< If unOut < 0, FileName will be opened for writing this mesh information. - !............................................................................................................................ - ! Write simulation times and stop - !............................................................................................................................ - if (present(SkipRunTimeMsg)) then - PrintRunTimes = .not. SkipRunTimeMsg - else - PrintRunTimes = .true. - end if + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status of the operation + CHARACTER(*) , INTENT(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - IF (p_FAST%WrSttsTime .and. PrintRunTimes) THEN - CALL RunTimes( m_FAST%StrtTime, m_FAST%UsrTime1, m_FAST%SimStrtTime, m_FAST%UsrTime2, m_FAST%t_global, UnSum=y_FAST%UnSum, DescStrIn=p_FAST%TDesc, useCases=p_FAST%CompAeroMaps ) - END IF - IF (y_FAST%UnSum > 0) THEN - CLOSE(y_FAST%UnSum) - y_FAST%UnSum = -1 - END IF - if (StopTheProgram) then -#if (defined COMPILE_SIMULINK || defined COMPILE_LABVIEW) - ! for Simulink, this may not be a normal stop. It might call this after an error in the model. - CALL WrScr( NewLine//' '//TRIM(FAST_Ver%Name)//' completed.'//NewLine ) -#else - CALL NormStop( ) -#endif - end if + REAL(R8Ki) :: t + INTEGER(IntKi) :: J_local, K_local + INTEGER(B4Ki), PARAMETER :: File_ID = 101 + INTEGER(B4Ki) :: NumBl -END SUBROUTINE ExitThisProgram -!---------------------------------------------------------------------------------------------------------------------------------- -!> This subroutine is called at program termination. It writes any additional output files, -!! deallocates variables for FAST file I/O and closes files. -SUBROUTINE FAST_EndOutput( p_FAST, y_FAST, m_FAST, ErrStat, ErrMsg ) + t = time ! convert to 8-bytes if necessary (DbKi might not be R8Ki) - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< FAST Parameters - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< FAST Output - TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Miscellaneous variables (only for the final time) + ! note that I'm not doing anything with the errors here, so it won't tell + ! you there was a problem writing the data unless it was the last call. - INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status - CHARACTER(*), INTENT(OUT) :: ErrMsg !< Message associated with errro status - ! local variables - CHARACTER(LEN(y_FAST%FileDescLines)*3) :: FileDesc ! The description of the run, to be written in the binary output file + ! Open the binary output file and write a header: + if (unOut<0) then + !$OMP critical(fileopen_critical) + CALL GetNewUnit( unOut, ErrStat, ErrMsg ) + CALL OpenBOutFile ( unOut, TRIM(FileName), ErrStat, ErrMsg ) + !$OMP end critical(fileopen_critical) + IF (ErrStat /= ErrID_None) RETURN - ! Initialize some values + ! Add a file identification number (in case we ever have to change this): + WRITE( unOut, IOSTAT=ErrStat ) File_ID - ErrStat = ErrID_None - ErrMsg = '' + ! Add how many blade meshes there are: + do J_local = 1,size(y_ED) + NumBl = SIZE(y_ED(J_local)%BladeLn2Mesh,1) ! Note that NumBl is B4Ki + WRITE( unOut, IOSTAT=ErrStat ) NumBl + end do +!FIXME: if y_BD is not allocated, size could return garbage here!!!! + NumBl = SIZE(y_BD,1) ! Note that NumBl is B4Ki + WRITE( unOut, IOSTAT=ErrStat ) NumBl + end if - !------------------------------------------------------------------------------------------------- - ! Write the binary output file if requested - !------------------------------------------------------------------------------------------------- + WRITE( unOut, IOSTAT=ErrStat ) t - IF (p_FAST%WrBinOutFile .AND. y_FAST%n_Out > 0) THEN + ! Add all of the meshes with motions: + do J_local = 1,size(y_ED) + DO K_local = 1,SIZE(y_ED(J_local)%BladeLn2Mesh,1) + CALL MeshWrBin( unOut, y_ED(J_local)%BladeLn2Mesh(K_local), ErrStat, ErrMsg ) + END DO + CALL MeshWrBin( unOut, y_ED(J_local)%TowerLn2Mesh, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, y_ED(J_local)%PlatformPtMesh, ErrStat, ErrMsg ) + end do + do J_local = 1,size(u_SD%TPMesh) + CALL MeshWrBin( unOut, u_SD%TPMesh(J_local), ErrStat, ErrMsg ) + end do + CALL MeshWrBin( unOut, y_SD%y2Mesh, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, y_SD%y3Mesh, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, u_HD%Morison%Mesh, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, u_HD%WAMITMesh, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, u_MAP%PtFairDisplacement, ErrStat, ErrMsg ) + DO K_local = 1,SIZE(y_BD,1) + CALL MeshWrBin( unOut, u_BD(K_local)%RootMotion, ErrStat, ErrMsg ) + CALL MeshWrBin( unOut, y_BD(K_local)%BldMotion, ErrStat, ErrMsg ) + END DO - FileDesc = TRIM(y_FAST%FileDescLines(1))//' '//TRIM(y_FAST%FileDescLines(2))//'; '//TRIM(y_FAST%FileDescLines(3)) + ! + ! ! Close the file + !CLOSE(unOut) + ! +END SUBROUTINE WriteMotionMeshesToFile +!---------------------------------------------------------------------------------------------------------------------------------- - CALL WrBinFAST(TRIM(p_FAST%OutFileRoot)//'.outb', Int(p_FAST%WrBinMod, B2Ki), TRIM(FileDesc), & - y_FAST%ChannelNames, y_FAST%ChannelUnits, y_FAST%TimeData, y_FAST%AllOutData(:,1:y_FAST%n_Out), ErrStat, ErrMsg) - IF ( ErrStat /= ErrID_None ) CALL WrScr( TRIM(GetErrStr(ErrStat))//' when writing binary output file: '//TRIM(ErrMsg) ) +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +! Linerization routines +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +!> Routine that calls FAST_Linearize_T for an array of Turbine data structures if the linearization flag is set for each individual turbine. +SUBROUTINE FAST_Linearize_Tary(t_initial, n_t_global, Turbine, ErrStat, ErrMsg) - END IF + REAL(DbKi), INTENT(IN ) :: t_initial !< initial simulation time (almost always 0) + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< integer time step + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine(:) !< all data for one instance of a turbine + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + ! local variables + INTEGER(IntKi) :: i_turb, NumTurbines + INTEGER(IntKi) :: ErrStat2 ! local error status + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Linearize_Tary' - !------------------------------------------------------------------------------------------------- - ! Close the text tabular output file and summary file (if opened) - !------------------------------------------------------------------------------------------------- - IF (y_FAST%UnOu > 0) THEN ! I/O unit number for the tabular output file - CLOSE( y_FAST%UnOu ) - y_FAST%UnOu = -1 - END IF - IF (y_FAST%UnSum > 0) THEN ! I/O unit number for the tabular output file - CLOSE( y_FAST%UnSum ) - y_FAST%UnSum = -1 - END IF + NumTurbines = SIZE(Turbine) + ErrStat = ErrID_None + ErrMsg = "" - IF (y_FAST%UnGra > 0) THEN ! I/O unit number for the graphics output file - CLOSE( y_FAST%UnGra ) - y_FAST%UnGra = -1 - END IF + DO i_turb = 1,NumTurbines - !------------------------------------------------------------------------------------------------- - ! Deallocate arrays - !------------------------------------------------------------------------------------------------- + CALL FAST_Linearize_T(t_initial, n_t_global, Turbine(i_turb), ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) RETURN - ! Output - IF ( ALLOCATED(y_FAST%AllOutData ) ) DEALLOCATE(y_FAST%AllOutData ) - IF ( ALLOCATED(y_FAST%TimeData ) ) DEALLOCATE(y_FAST%TimeData ) - IF ( ALLOCATED(y_FAST%ChannelNames ) ) DEALLOCATE(y_FAST%ChannelNames ) - IF ( ALLOCATED(y_FAST%ChannelUnits ) ) DEALLOCATE(y_FAST%ChannelUnits ) + END DO -END SUBROUTINE FAST_EndOutput +END SUBROUTINE FAST_Linearize_Tary !---------------------------------------------------------------------------------------------------------------------------------- -!> This routine calls the end routines for each module that was previously initialized. -SUBROUTINE FAST_EndMods( p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, IfW, SeaSt, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat, ErrMsg ) - - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop +!> Routine that performs lineaization at an operating point for a turbine. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. +SUBROUTINE FAST_Linearize_T(t_initial, n_t_global, Turbine, ErrStat, ErrMsg) + REAL(DbKi), INTENT(IN ) :: t_initial !< initial simulation time (almost always 0) + INTEGER(IntKi), INTENT(IN ) :: n_t_global !< integer time step + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< all data for one instance of a turbine INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ! local variables - INTEGER(IntKi) :: i, k ! loop counter - - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_EndMods' + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_Linearize_T' + INTEGER(IntKi) :: ErrStat2 ! local error status + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message + REAL(DbKi) :: t_global ! current simulation time + REAL(DbKi) :: next_lin_time ! next simulation time where linearization analysis should be performed + INTEGER(IntKi) :: iLinTime ! loop counter + INTEGER(IntKi) :: i ! loop counter - !............................................................................................................................... - ! End all modules (and write binary FAST output file) - !............................................................................................................................... ErrStat = ErrID_None ErrMsg = "" + ! Skip function if not performing linearization + if (.not. Turbine%p_FAST%Linearize) return - IF ( p_FAST%ModuleInitialized(Module_ED) ) THEN - CALL ED_End( ED%Input(1), ED%p, ED%x(STATE_CURR), ED%xd(STATE_CURR), ED%z(STATE_CURR), ED%OtherSt(STATE_CURR), & - ED%y, ED%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF + ! Calculate current time + t_global = t_initial + n_t_global*Turbine%p_FAST%dt - IF ( p_FAST%ModuleInitialized(Module_SED) ) THEN - CALL SED_End( SED%Input(1), SED%p, SED%x(STATE_CURR), SED%xd(STATE_CURR), SED%z(STATE_CURR), SED%OtherSt(STATE_CURR), & - SED%y, SED%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF + ! If linearization times specified directly (not using CalcSteady) + if (.not. Turbine%p_FAST%CalcSteady) then - IF ( p_FAST%ModuleInitialized(Module_BD) ) THEN + if (Turbine%m_Glue%Lin%TimeIndex <= Turbine%p_FAST%NLinTimes) then !bjj: maybe this logic should go in FAST_Linearize_OP??? - DO k=1,p_FAST%nBeams - CALL BD_End(BD%Input(1,k), BD%p(k), BD%x(k,STATE_CURR), BD%xd(k,STATE_CURR), BD%z(k,STATE_CURR), & - BD%OtherSt(k,STATE_CURR), BD%y(k), BD%m(k), ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO + ! Get next linearization time + next_lin_time = Turbine%m_FAST%Lin%LinTimes(Turbine%m_Glue%Lin%TimeIndex) - END IF + ! If current time is greater than or very close to next linearization time + if ((t_global > next_lin_time) .or. EqualRealNos(t_global,next_lin_time)) then + ! Perform linearization + call ModGlue_Linearize_OP(Turbine%p_Glue, Turbine%m_Glue, Turbine%y_Glue, & + Turbine%p_FAST, Turbine%m_FAST, Turbine%y_FAST, t_global, Turbine, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return - IF ( p_FAST%ModuleInitialized(Module_AD) ) THEN - CALL AD_End( AD%Input(1), AD%p, AD%x(STATE_CURR), AD%xd(STATE_CURR), AD%z(STATE_CURR), & - AD%OtherSt(STATE_CURR), AD%y, AD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ELSEIF ( p_FAST%ModuleInitialized(Module_ADsk) ) THEN - CALL ADsk_End( ADsk%Input(1), ADsk%p, ADsk%x(STATE_CURR), ADsk%xd(STATE_CURR), ADsk%z(STATE_CURR), & - ADsk%OtherSt(STATE_CURR), ADsk%y, ADsk%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF + ! If VTK flag is for modeshapes and all of the times have been linearizaed + if ((Turbine%p_FAST%WrVTK == VTK_ModeShapes) .and. & + (Turbine%m_Glue%Lin%TimeIndex > Turbine%p_FAST%NLinTimes)) then + ! we are creating a checkpoint file for each turbine, so setting NumTurbines=1 in the file + CALL FAST_CreateCheckpoint_T(t_initial, Turbine%p_FAST%n_TMax_m1+1, 1, Turbine, TRIM(Turbine%p_FAST%OutFileRoot)//'.ModeShapeVTK', ErrStat2, ErrMsg2 ) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + end if - IF ( p_FAST%ModuleInitialized(Module_IfW) ) THEN - CALL InflowWind_End( IfW%Input(1), IfW%p, IfW%x(STATE_CURR), IfW%xd(STATE_CURR), IfW%z(STATE_CURR), IfW%OtherSt(STATE_CURR), & - IfW%y, IfW%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF + end if - IF ( p_FAST%ModuleInitialized(Module_SrvD) ) THEN - CALL SrvD_End( SrvD%Input(1), SrvD%p, SrvD%x(STATE_CURR), SrvD%xd(STATE_CURR), SrvD%z(STATE_CURR), SrvD%OtherSt(STATE_CURR), & - SrvD%y, SrvD%m, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF + end if - IF ( p_FAST%ModuleInitialized(Module_HD) ) THEN - CALL HydroDyn_End( HD%Input(1), HD%p, HD%x(STATE_CURR), HD%xd(STATE_CURR), HD%z(STATE_CURR), HD%OtherSt(STATE_CURR), & - HD%y, HD%m, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF + else ! CalcSteady - IF ( p_FAST%ModuleInitialized(Module_SD) ) THEN - CALL SD_End( SD%Input(1), SD%p, SD%x(STATE_CURR), SD%xd(STATE_CURR), SD%z(STATE_CURR), SD%OtherSt(STATE_CURR), & - SD%y, SD%m, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ELSE IF ( p_FAST%ModuleInitialized(Module_ExtPtfm) ) THEN - CALL ExtPtfm_End( ExtPtfm%Input(1), ExtPtfm%p, ExtPtfm%x(STATE_CURR), ExtPtfm%xd(STATE_CURR), ExtPtfm%z(STATE_CURR), & - ExtPtfm%OtherSt(STATE_CURR), ExtPtfm%y, ExtPtfm%m, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF + t_global = t_initial + n_t_global * Turbine%p_FAST%DT - IF ( p_FAST%ModuleInitialized(Module_MAP) ) THEN - CALL MAP_End( MAPp%Input(1), MAPp%p, MAPp%x(STATE_CURR), MAPp%xd(STATE_CURR), MAPp%z(STATE_CURR), MAPp%OtherSt, & - MAPp%y, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ELSEIF ( p_FAST%ModuleInitialized(Module_MD) ) THEN - CALL MD_End( MD%Input(1), MD%p, MD%x(STATE_CURR), MD%xd(STATE_CURR), MD%z(STATE_CURR), MD%OtherSt(STATE_CURR), & - MD%y, MD%m, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ELSEIF ( p_FAST%ModuleInitialized(Module_FEAM) ) THEN - CALL FEAM_End( FEAM%Input(1), FEAM%p, FEAM%x(STATE_CURR), FEAM%xd(STATE_CURR), FEAM%z(STATE_CURR), & - FEAM%OtherSt(STATE_CURR), FEAM%y, FEAM%m, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ELSEIF ( p_FAST%ModuleInitialized(Module_Orca) ) THEN - CALL Orca_End( Orca%Input(1), Orca%p, Orca%x(STATE_CURR), Orca%xd(STATE_CURR), Orca%z(STATE_CURR), Orca%OtherSt(STATE_CURR), & - Orca%y, Orca%m, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF + ! Perform steady state calculation + call ModGlue_CalcSteady(n_t_global, t_global, Turbine%p_Glue, Turbine%m_Glue, Turbine%y_Glue, & + Turbine%p_FAST, Turbine%m_FAST, Turbine, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - IF ( p_FAST%ModuleInitialized(Module_IceF) ) THEN - CALL IceFloe_End(IceF%Input(1), IceF%p, IceF%x(STATE_CURR), IceF%xd(STATE_CURR), IceF%z(STATE_CURR), & - IceF%OtherSt(STATE_CURR), IceF%y, IceF%m, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ELSEIF ( p_FAST%ModuleInitialized(Module_IceD) ) THEN + ! Save this for use elsewhere in the code + Turbine%m_FAST%Lin%FoundSteady = Turbine%m_Glue%CS%FoundSteady - DO i=1,p_FAST%numIceLegs - CALL IceD_End(IceD%Input(1,i), IceD%p(i), IceD%x(i,STATE_CURR), IceD%xd(i,STATE_CURR), IceD%z(i,STATE_CURR), & - IceD%OtherSt(i,STATE_CURR), IceD%y(i), IceD%m(i), ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END DO + ! If steady state was found + if (Turbine%m_Glue%CS%FoundSteady) then - END IF + ! If linearization was forced, only linearize at first time + if (Turbine%m_Glue%CS%ForceLin) then + Turbine%p_FAST%NLinTimes = 1 + endif - IF ( p_FAST%ModuleInitialized(Module_SeaSt) ) THEN - ! make sure this is done AFTER any module that may be pointing to SeaSt data -- we deallocate the pointer targets here - CALL SeaSt_End( SeaSt%Input(1), SeaSt%p, SeaSt%x(STATE_CURR), SeaSt%xd(STATE_CURR), SeaSt%z(STATE_CURR), SeaSt%OtherSt(STATE_CURR), & - SeaSt%y, SeaSt%m, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - END IF + ! Loop through linearization times + do iLinTime = 1, Turbine%p_FAST%NLinTimes - - - ! Write output to file (do this after ending modules so that we have more memory to use if needed) - CALL FAST_EndOutput( p_FAST, y_FAST, m_FAST, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! Set global time to saved linearization time + t_global = Turbine%y_Glue%Lin%Times(iLinTime) + + ! Restore operating point so linearization can be performed + call ModGlue_RestoreOperatingPoint(Turbine%p_Glue, Turbine%m_Glue, iLinTime, Turbine, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF (ErrStat >= AbortErrLev) RETURN + + ! Calculate outputs using restored operating points + do i = 1, size(Turbine%m_Glue%ModData) + call FAST_CalcOutput(Turbine%m_Glue%ModData(i), Turbine%m_Glue%Mappings, & + t_global, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + ! call CalcOutputs_And_SolveForInputs(Turbine%p_Glue%TC, Turbine%m_Glue%TC, & + ! Turbine%m_Glue%ModData, Turbine%m_Glue%Mappings, & + ! t_global, INPUT_CURR, STATE_CURR, Turbine, ErrStat2, ErrMsg2) + ! call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! if (ErrStat >= AbortErrLev) return + + ! Linearize at operating points + call ModGlue_Linearize_OP(Turbine%p_Glue, Turbine%m_Glue, Turbine%y_Glue, & + Turbine%p_FAST, Turbine%m_FAST, Turbine%y_FAST, t_global, Turbine, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + end do + + ! If mode shape VTKs were requested, write checkpoint file + if (Turbine%p_FAST%WrVTK == VTK_ModeShapes) then + ! we are creating a checkpoint file for each turbine, so setting NumTurbines=1 in the file + CALL FAST_CreateCheckpoint_T(t_initial, Turbine%p_FAST%n_TMax_m1+1, 1, Turbine, TRIM(Turbine%p_FAST%OutFileRoot)//'.ModeShapeVTK', ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + end if + + ! If linearization was forced, display message + if (Turbine%m_Glue%CS%ForceLin) then + ErrStat2 = ErrID_Warn + ErrMsg2 = 'Linearization was forced at simulation end. The linearized model may not be sufficiently representative of the solution in steady state.' + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + endif + end if + end if -END SUBROUTINE FAST_EndMods +END SUBROUTINE FAST_Linearize_T !---------------------------------------------------------------------------------------------------------------------------------- -!> This routine calls the destroy routines for each module. (It is basically a duplicate of FAST_DestroyTurbineType().) -SUBROUTINE FAST_DestroyAll( p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat, ErrMsg ) - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +! PROGRAM EXIT ROUTINES +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +!> Routine that calls ExitThisProgram for one instance of a Turbine data structure. This is a separate subroutine so that the FAST +!! driver programs do not need to change or operate on the individual module level. +!! This routine should be called from glue code only (e.g., FAST_Prog.f90). It should not be called in any of these driver routines. +SUBROUTINE ExitThisProgram_T( Turbine, ErrLevel_in, StopTheProgram, ErrLocMsg, SkipRunTimeMsg ) + + TYPE(FAST_TurbineType), INTENT(INOUT) :: Turbine !< Data for one turbine instance + INTEGER(IntKi), INTENT(IN) :: ErrLevel_in !< Error level when Error == .TRUE. (required when Error is .TRUE.) + LOGICAL, INTENT(IN) :: StopTheProgram !< flag indicating if the program should end (false if there are more turbines to end) + CHARACTER(*), OPTIONAL, INTENT(IN) :: ErrLocMsg !< an optional message describing the location of the error + LOGICAL, OPTIONAL, INTENT(IN) :: SkipRunTimeMsg !< an optional message describing run-time stats + + CHARACTER(*), PARAMETER :: RoutineName = 'ExitThisProgram' + INTEGER(IntKi) :: ErrStat + CHARACTER(ErrMsgLen) :: ErrMsg + INTEGER(IntKi) :: UnSum + INTEGER(IntKi) :: ErrorLevel + LOGICAL :: PrintRunTimes + CHARACTER(1224) :: SimMsg ! optional message to print about where the error took place in the simulation + INTEGER(IntKi) :: StrtTime(8) + REAL(ReKi) :: UsrTime1 + INTEGER(IntKi) :: SimStrtTime(8) + REAL(ReKi) :: UsrTime2 + REAL(DbKi) :: t_global + CHARACTER(4) :: TDesc + + ! Store incomming error level + ErrorLevel = ErrLevel_in + + ! Set flag to print runtimes depending on argument + if (present(SkipRunTimeMsg)) then + PrintRunTimes = .not. SkipRunTimeMsg + else + PrintRunTimes = .true. + end if + + ! Print runtime if write status flag is set + PrintRunTimes = PrintRunTimes .and. Turbine%p_FAST%WrSttsTime + + ! Save some data before destorying TurbineType + unSum = Turbine%y_FAST%UnSum + StrtTime = Turbine%m_FAST%StrtTime + UsrTime1 = Turbine%m_FAST%UsrTime1 + SimStrtTime = Turbine%m_FAST%SimStrtTime + UsrTime2 = Turbine%m_FAST%UsrTime2 + t_global = Turbine%m_FAST%t_global + TDesc = Turbine%p_FAST%TDesc + + ! for debugging, let's output the meshes and all of their fields + IF ((ErrorLevel >= AbortErrLev) .and. & + (Turbine%p_FAST%WrVTK > VTK_None) .and. & + (.not. Turbine%m_FAST%Lin%FoundSteady)) THEN + Turbine%p_FAST%VTK_OutFileRoot = trim(Turbine%p_FAST%VTK_OutFileRoot)//'.DebugError' + Turbine%p_FAST%VTK_fields = .true. + CALL WrVTK_AllMeshes(Turbine%p_FAST, Turbine%y_FAST, Turbine%ED, & + Turbine%SED, Turbine%BD, Turbine%AD, Turbine%IfW, Turbine%ExtInfw, & + Turbine%HD, Turbine%SD, Turbine%ExtPtfm, Turbine%SrvD, Turbine%MAP, & + Turbine%FEAM, Turbine%MD, Turbine%Orca, Turbine%IceF, Turbine%IceD, Turbine%SlD) + end if - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop + ! If we are doing AeroMaps, there is leftover data in AD15 parameters + if (Turbine%p_FAST%CompAeroMaps) then + if (associated(Turbine%AD%p%FlowField)) deallocate(Turbine%AD%p%FlowField) + endif - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules + ! End all modules + if (allocated(Turbine%m_Glue%ModData)) then + CALL FAST_ModEnd(Turbine%m_Glue%ModData, Turbine, ErrStat, ErrMsg) + IF (ErrStat /= ErrID_None) THEN + CALL WrScr(NewLine//RoutineName//':'//TRIM(ErrMsg)//NewLine) + ErrorLevel = MAX(ErrorLevel,ErrStat) + END IF + end if - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + ! Write output to file (do this after ending modules so that we have more memory to use if needed) + call FAST_EndOutput(Turbine%p_FAST, Turbine%y_FAST, Turbine%m_FAST, ErrStat, ErrMsg) + IF (ErrStat /= ErrID_None) THEN + CALL WrScr(NewLine//RoutineName//':'//TRIM(ErrMsg)//NewLine) + ErrorLevel = MAX(ErrorLevel,ErrStat) + END IF + + ! Destroy all data associated with FAST variables: + call FAST_DestroyTurbineType(Turbine, ErrStat, ErrMsg) + IF (ErrStat /= ErrID_None) THEN + CALL WrScr(NewLine//RoutineName//':'//TRIM(ErrMsg)//NewLine) + ErrorLevel = MAX(ErrorLevel,ErrStat) + END IF - ! local variables - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_DestroyAll' + !---------------------------------------------------------------------------- + ! Set exit error code if there was an error + !---------------------------------------------------------------------------- + IF (ErrorLevel >= AbortErrLev) THEN + IF (PRESENT(ErrLocMsg)) THEN + SimMsg = ErrLocMsg + ELSE + SimMsg = 'after the simulation completed' + END IF - ! ------------------------------------------------------------------------- - ! Deallocate/Destroy structures associated with mesh mapping - ! ------------------------------------------------------------------------- + IF (UnSum > 0) THEN + CLOSE(UnSum) + UnSum = -1 + END IF - ErrStat = ErrID_None - ErrMsg = "" + SimMsg = TRIM(FAST_Ver%Name)//' encountered an error '//TRIM(SimMsg)//'.'//NewLine//' Simulation error level: '//TRIM(GetErrStr(ErrorLevel)) +#if (defined COMPILE_SIMULINK || defined COMPILE_LABVIEW) + ! When built as a shared library/dll, don't end the program. + CALL WrScr(trim(SimMsg)) +#else + if (StopTheProgram) then + CALL ProgAbort(SimMsg, TrapErrors=.FALSE., TimeWait=3._ReKi) ! wait 3 seconds (in case they double-clicked and got an error) + else + CALL WrScr(trim(SimMsg)) + end if +#endif + END IF - ! FAST - CALL FAST_DestroyParam( p_FAST, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + !---------------------------------------------------------------------------- + ! Write simulation times and stop + !---------------------------------------------------------------------------- - CALL FAST_DestroyOutputFileType( y_FAST, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! Print runtime if write status time + IF (PrintRunTimes) THEN + CALL RunTimes(StrtTime, UsrTime1, SimStrtTime, UsrTime2, t_global, & + UnSum=UnSum, DescStrIn=TDesc) + END IF - CALL FAST_DestroyMisc( m_FAST, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! Close summary file if opened + IF (UnSum > 0) then + CLOSE(UnSum) + Turbine%y_FAST%UnSum = -1 + end if - ! ElastoDyn - CALL FAST_DestroyElastoDyn_Data( ED, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (StopTheProgram) then +#if (defined COMPILE_SIMULINK || defined COMPILE_LABVIEW) + ! for Simulink, this may not be a normal stop. It might call this after an error in the model. + CALL WrScr(NewLine//' '//TRIM(FAST_Ver%Name)//' completed.'//NewLine) +#else + CALL NormStop() +#endif + end if - ! Simplified-ElastoDyn - CALL FAST_DestroySED_Data( SED, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +END SUBROUTINE ExitThisProgram_T +!---------------------------------------------------------------------------------------------------------------------------------- +!> This subroutine is called at program termination. It writes any additional output files, +!! deallocates variables for FAST file I/O and closes files. +SUBROUTINE FAST_EndOutput( p_FAST, y_FAST, m_FAST, ErrStat, ErrMsg ) - ! BeamDyn - CALL FAST_DestroyBeamDyn_Data( BD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< FAST Parameters + TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< FAST Output + TYPE(FAST_MiscVarType), INTENT(IN ) :: m_FAST !< Miscellaneous variables (only for the final time) - ! ServoDyn - CALL FAST_DestroyServoDyn_Data( SrvD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + INTEGER(IntKi), INTENT(OUT) :: ErrStat !< Error status + CHARACTER(*), INTENT(OUT) :: ErrMsg !< Message associated with errro status - ! AeroDyn - CALL FAST_DestroyAeroDyn_Data( AD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! local variables + CHARACTER(LEN(y_FAST%FileDescLines)*3) :: FileDesc ! The description of the run, to be written in the binary output file - ! InflowWind - CALL FAST_DestroyInflowWind_Data( IfW, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ! ExternalInflow - CALL FAST_DestroyExternalInflow_Data( ExtInfw, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ! Initialize some values - ! SeaState - CALL FAST_DestroySeaState_Data( SeaSt, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + ErrStat = ErrID_None + ErrMsg = '' - ! HydroDyn - CALL FAST_DestroyHydroDyn_Data( HD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + !------------------------------------------------------------------------------------------------- + ! Write the binary output file if requested + !------------------------------------------------------------------------------------------------- - ! SubDyn - CALL FAST_DestroySubDyn_Data( SD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (p_FAST%WrBinOutFile .AND. y_FAST%n_Out > 0) THEN - ! ExtPtfm - CALL FAST_DestroyExtPtfm_Data( ExtPtfm, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + FileDesc = TRIM(y_FAST%FileDescLines(1))//' '//TRIM(y_FAST%FileDescLines(2))//'; '//TRIM(y_FAST%FileDescLines(3)) - ! MAP - CALL FAST_DestroyMAP_Data( MAPp, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + CALL WrBinFAST(TRIM(p_FAST%OutFileRoot)//'.outb', Int(p_FAST%WrBinMod, B2Ki), TRIM(FileDesc), & + y_FAST%ChannelNames, y_FAST%ChannelUnits, y_FAST%TimeData, y_FAST%AllOutData(:,1:y_FAST%n_Out), ErrStat, ErrMsg) - ! FEAMooring - CALL FAST_DestroyFEAMooring_Data( FEAM, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF ( ErrStat /= ErrID_None ) CALL WrScr( TRIM(GetErrStr(ErrStat))//' when writing binary output file: '//TRIM(ErrMsg) ) - ! MoorDyn - CALL FAST_DestroyMoorDyn_Data( MD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + END IF - ! Orca - CALL FAST_DestroyOrcaFlex_Data( Orca, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - ! IceFloe - CALL FAST_DestroyIceFloe_Data( IceF, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + !------------------------------------------------------------------------------------------------- + ! Close the text tabular output file and summary file (if opened) + !------------------------------------------------------------------------------------------------- + IF (y_FAST%UnOu > 0) THEN ! I/O unit number for the tabular output file + CLOSE( y_FAST%UnOu ) + y_FAST%UnOu = -1 + END IF - ! IceDyn - CALL FAST_DestroyIceDyn_Data( IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (y_FAST%UnSum > 0) THEN ! I/O unit number for the tabular output file + CLOSE( y_FAST%UnSum ) + y_FAST%UnSum = -1 + END IF - ! Module (Mesh) Mapping data - CALL FAST_DestroyModuleMapType( MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + IF (y_FAST%UnGra > 0) THEN ! I/O unit number for the graphics output file + CLOSE( y_FAST%UnGra ) + y_FAST%UnGra = -1 + END IF + !------------------------------------------------------------------------------------------------- + ! Deallocate arrays + !------------------------------------------------------------------------------------------------- + ! Output + IF ( ALLOCATED(y_FAST%AllOutData ) ) DEALLOCATE(y_FAST%AllOutData ) + IF ( ALLOCATED(y_FAST%TimeData ) ) DEALLOCATE(y_FAST%TimeData ) + IF ( ALLOCATED(y_FAST%ChannelNames ) ) DEALLOCATE(y_FAST%ChannelNames ) + IF ( ALLOCATED(y_FAST%ChannelUnits ) ) DEALLOCATE(y_FAST%ChannelUnits ) - END SUBROUTINE FAST_DestroyAll -!---------------------------------------------------------------------------------------------------------------------------------- +END SUBROUTINE FAST_EndOutput !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! CHECKPOINT/RESTART ROUTINES @@ -9984,6 +7111,7 @@ SUBROUTINE FAST_CreateCheckpoint_T(t_initial, n_t_global, NumTurbines, Turbine, ! local variables: type(RegFile) :: RF + INTEGER(IntKi) :: iRot ! rotor index INTEGER(IntKi) :: unOut ! unit number for output file INTEGER(IntKi) :: old_avrSwap1 ! previous value of avrSwap(1) !hack for Bladed DLL checkpoint/restore INTEGER(IntKi) :: ErrStat2 ! local error status @@ -10048,26 +7176,27 @@ SUBROUTINE FAST_CreateCheckpoint_T(t_initial, n_t_global, NumTurbines, Turbine, IF (PRESENT(Unit)) Unit = unOut ! A hack to pack Bladed-style DLL data - IF (Turbine%SrvD%p%UseBladedInterface) THEN - if (Turbine%SrvD%m%dll_data%avrSWAP( 1) > 0 ) then - ! store value to be overwritten - old_avrSwap1 = Turbine%SrvD%m%dll_data%avrSWAP( 1) - FileName = Turbine%SrvD%m%dll_data%DLL_InFile - ! overwrite values: - Turbine%SrvD%m%dll_data%DLL_InFile = DLLFileName - Turbine%SrvD%m%dll_data%avrSWAP(50) = REAL( LEN_TRIM(DLLFileName) ) +1 ! No. of characters in the "INFILE" argument (-) (we add one for the C NULL CHARACTER) - Turbine%SrvD%m%dll_data%avrSWAP( 1) = GH_DISCON_STATUS_CHECKPOINT - Turbine%SrvD%m%dll_data%SimStatus = Turbine%SrvD%m%dll_data%avrSWAP( 1) - CALL CallBladedDLL(Turbine%SrvD%Input(1), Turbine%SrvD%p, Turbine%SrvD%m%dll_data, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + do iRot = 1, Turbine%p_FAST%NRotors + if (.not. Turbine%SrvD%p(iRot)%UseBladedInterface) cycle + if (Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) <= 0) cycle + + ! store value to be overwritten + old_avrSwap1 = Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) + FileName = Turbine%SrvD%m(iRot)%dll_data%DLL_InFile + ! overwrite values: + Turbine%SrvD%m(iRot)%dll_data%DLL_InFile = DLLFileName + Turbine%SrvD%m(iRot)%dll_data%avrSWAP(50) = REAL( LEN_TRIM(DLLFileName) ) +1 ! No. of characters in the "INFILE" argument (-) (we add one for the C NULL CHARACTER) + Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) = GH_DISCON_STATUS_CHECKPOINT + Turbine%SrvD%m(iRot)%dll_data%SimStatus = Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) + CALL CallBladedDLL(Turbine%SrvD%Input(INPUT_CURR,iRot), Turbine%SrvD%p(iRot), Turbine%SrvD%m(iRot)%dll_data, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! put values back: - Turbine%SrvD%m%dll_data%DLL_InFile = FileName - Turbine%SrvD%m%dll_data%avrSWAP(50) = REAL( LEN_TRIM(FileName) ) +1 ! No. of characters in the "INFILE" argument (-) (we add one for the C NULL CHARACTER) - Turbine%SrvD%m%dll_data%avrSWAP( 1) = old_avrSwap1 - Turbine%SrvD%m%dll_data%SimStatus = Turbine%SrvD%m%dll_data%avrSWAP( 1) - end if - END IF + ! put values back: + Turbine%SrvD%m(iRot)%dll_data%DLL_InFile = FileName + Turbine%SrvD%m(iRot)%dll_data%avrSWAP(50) = REAL( LEN_TRIM(FileName) ) +1 ! No. of characters in the "INFILE" argument (-) (we add one for the C NULL CHARACTER) + Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) = old_avrSwap1 + Turbine%SrvD%m(iRot)%dll_data%SimStatus = Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) + end do END SUBROUTINE FAST_CreateCheckpoint_T !---------------------------------------------------------------------------------------------------------------------------------- @@ -10139,6 +7268,7 @@ SUBROUTINE FAST_RestoreFromCheckpoint_T(t_initial, n_t_global, NumTurbines, Turb ! local variables: type(RegFile) :: RF + INTEGER(IntKi) :: iRot ! rotor index INTEGER(IntKi) :: unIn ! unit number for input file INTEGER(IntKi) :: old_avrSwap1 ! previous value of avrSwap(1) !hack for Bladed DLL checkpoint/restore INTEGER(IntKi) :: ErrStat2 ! local error status @@ -10208,25 +7338,26 @@ SUBROUTINE FAST_RestoreFromCheckpoint_T(t_initial, n_t_global, NumTurbines, Turb ! A hack to restore Bladed-style DLL data - if (Turbine%SrvD%p%UseBladedInterface) then - if (Turbine%SrvD%m%dll_data%avrSWAP( 1) > 0 ) then ! this isn't allocated if UseBladedInterface is FALSE - ! store value to be overwritten - old_avrSwap1 = Turbine%SrvD%m%dll_data%avrSWAP( 1) - FileName = Turbine%SrvD%m%dll_data%DLL_InFile - ! overwrite values before calling DLL: - Turbine%SrvD%m%dll_data%DLL_InFile = DLLFileName - Turbine%SrvD%m%dll_data%avrSWAP(50) = REAL( LEN_TRIM(DLLFileName) ) +1 ! No. of characters in the "INFILE" argument (-) (we add one for the C NULL CHARACTER) - Turbine%SrvD%m%dll_data%avrSWAP( 1) = GH_DISCON_STATUS_RESTARTING - Turbine%SrvD%m%dll_data%SimStatus = Turbine%SrvD%m%dll_data%avrSWAP( 1) - CALL CallBladedDLL(Turbine%SrvD%Input(1), Turbine%SrvD%p, Turbine%SrvD%m%dll_data, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - ! put values back: - Turbine%SrvD%m%dll_data%DLL_InFile = FileName - Turbine%SrvD%m%dll_data%avrSWAP(50) = REAL( LEN_TRIM(FileName) ) +1 ! No. of characters in the "INFILE" argument (-) (we add one for the C NULL CHARACTER) - Turbine%SrvD%m%dll_data%avrSWAP( 1) = old_avrSwap1 - Turbine%SrvD%m%dll_data%SimStatus = Turbine%SrvD%m%dll_data%avrSWAP( 1) - end if - end if + do iRot = 1, Turbine%p_FAST%NRotors + if (.not. Turbine%SrvD%p(iRot)%UseBladedInterface) cycle + if (Turbine%SrvD%m(iRot)%dll_data%avrSWAP(1) <= 0) cycle ! this isn't allocated if UseBladedInterface is FALSE + + ! store value to be overwritten + old_avrSwap1 = Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) + FileName = Turbine%SrvD%m(iRot)%dll_data%DLL_InFile + ! overwrite values before calling DLL: + Turbine%SrvD%m(iRot)%dll_data%DLL_InFile = DLLFileName + Turbine%SrvD%m(iRot)%dll_data%avrSWAP(50) = REAL( LEN_TRIM(DLLFileName) ) +1 ! No. of characters in the "INFILE" argument (-) (we add one for the C NULL CHARACTER) + Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) = GH_DISCON_STATUS_RESTARTING + Turbine%SrvD%m(iRot)%dll_data%SimStatus = Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) + CALL CallBladedDLL(Turbine%SrvD%Input(INPUT_CURR,iRot), Turbine%SrvD%p(iRot), Turbine%SrvD%m(iRot)%dll_data, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! put values back: + Turbine%SrvD%m(iRot)%dll_data%DLL_InFile = FileName + Turbine%SrvD%m(iRot)%dll_data%avrSWAP(50) = REAL( LEN_TRIM(FileName) ) +1 ! No. of characters in the "INFILE" argument (-) (we add one for the C NULL CHARACTER) + Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) = old_avrSwap1 + Turbine%SrvD%m(iRot)%dll_data%SimStatus = Turbine%SrvD%m(iRot)%dll_data%avrSWAP( 1) + end do ! deal with sibling meshes here: ! (ignoring for now; they are not going to be siblings on restart) @@ -10260,12 +7391,15 @@ SUBROUTINE FAST_RestoreForVTKModeShape_Tary(t_initial, Turbine, InputFileName, E CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables + CHARACTER(*), PARAMETER :: RoutineName = 'FAST_RestoreForVTKModeShape_Tary' + INTEGER(IntKi) :: ErrStat2 ! local error status + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message INTEGER(IntKi) :: i_turb INTEGER(IntKi) :: n_t_global !< loop counter INTEGER(IntKi) :: NumTurbines ! Number of turbines in this simulation - INTEGER(IntKi) :: ErrStat2 ! local error status - CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message - CHARACTER(*), PARAMETER :: RoutineName = 'FAST_RestoreForVTKModeShape_Tary' + INTEGER(IntKi) :: i_ext + CHARACTER(1024) :: OutFileRoot + TYPE(FAST_VTK_ModeShapeType) :: VTK_Modes ErrStat = ErrID_None @@ -10277,27 +7411,29 @@ SUBROUTINE FAST_RestoreForVTKModeShape_Tary(t_initial, Turbine, InputFileName, E return end if - - CALL ReadModeShapeFile( Turbine(1)%p_FAST, trim(InputFileName), ErrStat2, ErrMsg2, checkpointOnly=.true. ) + CALL ReadModeShapeFile( Turbine(1)%p_FAST, trim(InputFileName), VTK_Modes, ErrStat2, ErrMsg2, checkpointOnly=.true. ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) if (ErrStat >= AbortErrLev) return + + ! Save checkpoint root path as read from mode shape file and remove extension + OutFileRoot = VTK_modes%CheckpointRoot + i_ext = index(OutFileRoot, '.ModeShapeVTK', back=.true.) + if (i_ext > 1) OutFileRoot = OutFileRoot(:i_ext - 1) - CALL FAST_RestoreFromCheckpoint_Tary( t_initial, n_t_global, Turbine, trim(Turbine(1)%p_FAST%VTK_modes%CheckpointRoot), ErrStat2, ErrMsg2, silent=.true. ) + CALL FAST_RestoreFromCheckpoint_Tary( t_initial, n_t_global, Turbine, trim(VTK_modes%CheckpointRoot), ErrStat2, ErrMsg2, silent=.true. ) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - DO i_turb = 1,NumTurbines if (.not. allocated(Turbine(i_turb)%m_FAST%Lin%LinTimes)) then call SetErrStat(ErrID_Fatal, "Mode-shape visualization requires a checkpoint file from a simulation with linearization analysis, but NLinTimes is 0.", ErrStat, ErrMsg, RoutineName) return end if - CALL FAST_RestoreForVTKModeShape_T(t_initial, Turbine(i_turb)%p_FAST, Turbine(i_turb)%y_FAST, Turbine(i_turb)%m_FAST, & - Turbine(i_turb)%ED, Turbine(i_turb)%SED, Turbine(i_turb)%BD, Turbine(i_turb)%SrvD, & - Turbine(i_turb)%AD, Turbine(i_turb)%ADsk, Turbine(i_turb)%ExtLd, Turbine(i_turb)%IfW, Turbine(i_turb)%ExtInfw, & - Turbine(i_turb)%SeaSt, Turbine(i_turb)%HD, Turbine(i_turb)%SD, Turbine(i_turb)%ExtPtfm, Turbine(i_turb)%MAP, Turbine(i_turb)%FEAM, Turbine(i_turb)%MD, Turbine(i_turb)%Orca, & - Turbine(i_turb)%IceF, Turbine(i_turb)%IceD, Turbine(i_turb)%MeshMapData, trim(InputFileName), ErrStat2, ErrMsg2 ) + CALL FAST_RestoreForVTKModeShape_T(t_initial, trim(InputFileName), VTK_Modes, Turbine(i_turb), ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + + ! If extension was found, overwrite saved out file root + if (i_ext > 1) Turbine(i_turb)%p_FAST%OutFileRoot = OutFileRoot END DO @@ -10305,40 +7441,14 @@ END SUBROUTINE FAST_RestoreForVTKModeShape_Tary !---------------------------------------------------------------------------------------------------------------------------------- !> This routine calculates the motions generated by mode shapes and outputs VTK data for it -SUBROUTINE FAST_RestoreForVTKModeShape_T(t_initial, p_FAST, y_FAST, m_FAST, ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, InputFileName, ErrStat, ErrMsg ) - - REAL(DbKi), INTENT(IN ) :: t_initial !< initial time - - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code - TYPE(FAST_OutputFileType),INTENT(INOUT) :: y_FAST !< Output variables for the glue code - TYPE(FAST_MiscVarType), INTENT(INOUT) :: m_FAST !< Miscellaneous variables - - TYPE(ElastoDyn_Data), INTENT(INOUT) :: ED !< ElastoDyn data - TYPE(SED_Data), INTENT(INOUT) :: SED !< Simplified-ElastoDyn data (note: not linearized, but need for interfaces to routines called here) - TYPE(BeamDyn_Data), INTENT(INOUT) :: BD !< BeamDyn data - TYPE(ServoDyn_Data), INTENT(INOUT) :: SrvD !< ServoDyn data - TYPE(AeroDyn_Data), INTENT(INOUT) :: AD !< AeroDyn data - TYPE(AeroDisk_Data), INTENT(INOUT) :: ADsk !< AeroDisk data - TYPE(ExtLoads_Data), INTENT(INOUT) :: ExtLd !< ExtLoads data - TYPE(InflowWind_Data), INTENT(INOUT) :: IfW !< InflowWind data - TYPE(ExternalInflow_Data),INTENT(INOUT) :: ExtInfw !< ExternalInflow data - TYPE(SeaState_Data), INTENT(INOUT) :: SeaSt !< SeaState data - TYPE(HydroDyn_Data), INTENT(INOUT) :: HD !< HydroDyn data - TYPE(SubDyn_Data), INTENT(INOUT) :: SD !< SubDyn data - TYPE(ExtPtfm_Data), INTENT(INOUT) :: ExtPtfm !< ExtPtfm_MCKF data - TYPE(MAP_Data), INTENT(INOUT) :: MAPp !< MAP data - TYPE(FEAMooring_Data), INTENT(INOUT) :: FEAM !< FEAMooring data - TYPE(MoorDyn_Data), INTENT(INOUT) :: MD !< Data for the MoorDyn module - TYPE(OrcaFlex_Data), INTENT(INOUT) :: Orca !< OrcaFlex interface data - TYPE(IceFloe_Data), INTENT(INOUT) :: IceF !< IceFloe data - TYPE(IceDyn_Data), INTENT(INOUT) :: IceD !< All the IceDyn data used in time-step loop +SUBROUTINE FAST_RestoreForVTKModeShape_T(t_initial, InputFileName, VTK_Modes, T, ErrStat, ErrMsg ) - TYPE(FAST_ModuleMapType), INTENT(INOUT) :: MeshMapData !< Data for mapping between modules - CHARACTER(*), INTENT(IN ) :: InputFileName !< Name of the input file - - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + REAL(DbKi), INTENT(IN ) :: t_initial !< initial time + CHARACTER(*), INTENT(IN ) :: InputFileName !< Name of the input file + TYPE(FAST_TurbineType), INTENT(INOUT) :: T !< Turbine type + TYPE(FAST_VTK_ModeShapeType), INTENT(INOUT) :: VTK_Modes + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables REAL(DbKi) :: dt ! time @@ -10357,123 +7467,166 @@ SUBROUTINE FAST_RestoreForVTKModeShape_T(t_initial, p_FAST, y_FAST, m_FAST, ED, CHARACTER(*), PARAMETER :: RoutineName = 'FAST_RestoreForVTKModeShape_T' CHARACTER(1024) :: VTK_RootName CHARACTER(1024) :: VTK_RootDir - CHARACTER(1024) :: vtkroot CHARACTER(1024) :: sInfo !< String used for formatted screen output - + REAL(R8Ki), allocatable :: Perturb(:) ErrStat = ErrID_None ErrMsg = "" - CALL ReadModeShapeFile( p_FAST, trim(InputFileName), ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + CALL ReadModeShapeFile(T%p_FAST, trim(InputFileName), VTK_Modes, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call ReadModeShapeMatlabFile( p_FAST, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - if (ErrStat >= AbortErrLev ) return + call ReadModeShapeDataFile(VTK_Modes, T%p_FAST%NLinTimes, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return - y_FAST%WriteThisStep = .true. - y_FAST%UnSum = -1 + T%y_FAST%WriteThisStep = .true. + T%y_FAST%UnSum = -1 - NLinTimes = min( p_FAST%VTK_modes%VTKNLinTimes, size(p_FAST%VTK_modes%x_eig_magnitude,2), p_FAST%NLinTimes ) + NLinTimes = min(VTK_modes%VTKNLinTimes, size(VTK_modes%x_eig_magnitude,2), T%p_FAST%NLinTimes) - VTK_RootName = p_FAST%VTK_OutFileRoot + VTK_RootName = T%p_FAST%VTK_OutFileRoot ! Creating VTK folder in case user deleted it. - ! We have to extract the vtk root dir again because p_FAST%VTK_OutFileRoot contains the full basename - call GetPath ( p_FAST%OutFileRoot, VTK_RootDir, vtkroot ) + ! We have to extract the vtk root dir again because T%p_FAST%VTK_OutFileRoot contains the full basename + call GetPath(T%p_FAST%OutFileRoot, VTK_RootDir) VTK_RootDir = trim(VTK_RootDir) // 'vtk' - call MKDIR( trim(VTK_RootDir) ) + call MKDIR(trim(VTK_RootDir)) + ! Get maximum number of modes based on size of data in file + iModeMax = size(VTK_Modes%x_eig_magnitude, 3) - iModeMax = size(p_FAST%VTK_Modes%x_eig_magnitude, 3) + ! Loop through modes + do iMode = 1,VTK_modes%VTKLinModes - do iMode = 1,p_FAST%VTK_modes%VTKLinModes - ModeNo = p_FAST%VTK_modes%VTKModes(iMode) - if (ModeNo>iModeMax) then + ! Get mode number + ModeNo = VTK_modes%VTKModes(iMode) + + ! If mode number exceeds maximum number of modes, print message and exit loop + if (ModeNo > iModeMax) then call WrScr(' Skipping mode '//trim(num2lstr(ModeNo))//', maximum number of modes reached ('//trim(num2lstr(iModeMax))//'). Exiting.') exit; endif - call GetTimeConstants(p_FAST%VTK_modes%DampedFreq_Hz(ModeNo), p_FAST%VTK_fps, p_FAST%VTK_modes%VTKLinTim, nt, dt, p_FAST%VTK_tWidth ) - write(sInfo, '(A,I4,A,F12.4,A,I4,A,I0)') 'Mode',ModeNo,', Freq=', p_FAST%VTK_modes%DampedFreq_Hz(ModeNo),'Hz, NLinTimes=',NLinTimes,', nt=',nt + + ! Calculate visualization steps? + call GetTimeConstants(VTK_modes%DampedFreq_Hz(ModeNo), T%p_FAST%VTK_fps, VTK_modes%VTKLinTim, nt, dt, T%p_FAST%VTK_tWidth) + + write(sInfo, '(A,I4,A,F12.4,A,I4,A,I0)') 'Mode',ModeNo,', Freq=', VTK_modes%DampedFreq_Hz(ModeNo),'Hz, NLinTimes=',NLinTimes,', nt=',nt call WrScr(trim(sInfo)) if (nt > 500) then call WrScr(' Skipping mode '//trim(num2lstr(ModeNo))//' due to low frequency.') cycle endif - select case (p_FAST%VTK_modes%VTKLinTim) + ! Switch to make one animation for all LinTimes together (1) or separate animations for each LinTimes (2) + select case (VTK_modes%VTKLinTim) case (1) - p_FAST%VTK_OutFileRoot = trim(VTK_RootName)//'.Mode'//trim(num2lstr(ModeNo)) - y_FAST%VTK_count = 1 ! we are skipping the reference meshes by starting at 1 - do iLinTime = 1,NLinTimes - tprime = m_FAST%Lin%LinTimes(iLinTime) - m_FAST%Lin%LinTimes(1) - - if (p_FAST%DT_UJac < p_FAST%TMax) then - m_FAST%calcJacobian = .true. - m_FAST%NextJacCalcTime = m_FAST%Lin%LinTimes(iLinTime) - end if - call SetOperatingPoint(iLinTime, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Set output file path + T%p_FAST%VTK_OutFileRoot = trim(VTK_RootName)//'.Mode'//trim(num2lstr(ModeNo)) - ! set perturbation of states based on x_eig magnitude and phase - call PerturbOP(tprime, iLinTime, ModeNo, p_FAST, y_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN + ! Skip the reference meshe output by starting at 1 + T%y_FAST%VTK_count = 1 - CALL CalcOutputs_And_SolveForInputs( -1, m_FAST%Lin%LinTimes(iLinTime), STATE_CURR, m_FAST%calcJacobian, m_FAST%NextJacCalcTime, & - p_FAST, m_FAST, .true., ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN + ! Loop through linearization times + do iLinTime = 1, NLinTimes + + ! Calculate time as difference from first linearization time + tprime = T%m_FAST%Lin%LinTimes(iLinTime) - T%m_FAST%Lin%LinTimes(1) - call WriteVTK(m_FAST%Lin%LinTimes(iLinTime), p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + ! Calculate state perturbation + Perturb = VTK_Modes%VTKLinScale * VTK_Modes%x_eig_magnitude(:, iLinTime, iMode) * & + cos(TwoPi_D * VTK_Modes%DampedFreq_Hz(iMode) * tprime + VTK_Modes%x_eig_phase(:, iLinTime, iMode) + VTK_Modes%VTKLinPhase) + + ! Perturb states and output VTK + call CalcOutputModeShapeVTK(T%m_FAST%Lin%LinTimes(iLinTime), Perturb) end do ! iLinTime + case (2) - do iLinTime = 1,NLinTimes - p_FAST%VTK_OutFileRoot = trim(VTK_RootName)//'.Mode'//trim(num2lstr(ModeNo))//'.LinTime'//trim(num2lstr(iLinTime)) - y_FAST%VTK_count = 1 ! we are skipping the reference meshes by starting at 1 + ! Loop through linearization times + do iLinTime = 1, NLinTimes - if (p_FAST%DT_UJac < p_FAST%TMax) then - m_FAST%calcJacobian = .true. - m_FAST%NextJacCalcTime = m_FAST%Lin%LinTimes(iLinTime) - end if + ! Set output file path + T%p_FAST%VTK_OutFileRoot = trim(VTK_RootName)//'.Mode'//trim(num2lstr(ModeNo))//'.LinTime'//trim(num2lstr(iLinTime)) - do it = 1,nt - tprime = (it-1)*dt + ! Skip the reference meshe output by starting at 1 + T%y_FAST%VTK_count = 1 - call SetOperatingPoint(iLinTime, p_FAST, y_FAST, m_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, & - MAPp, FEAM, MD, Orca, IceF, IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + ! Loop through times between linearization times + do it = 0, nt-1 - ! set perturbation of states based on x_eig magnitude and phase - call PerturbOP(tprime, iLinTime, ModeNo, p_FAST, y_FAST, ED, BD, SrvD, AD, IfW, ExtInfw, HD, SeaSt, SD, ExtPtfm, MAPp, FEAM, MD, Orca, & - IceF, IceD, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN + ! Calculate time as step output step + tprime = it*dt - CALL CalcOutputs_And_SolveForInputs( -1, m_FAST%Lin%LinTimes(iLinTime), STATE_CURR, m_FAST%calcJacobian, m_FAST%NextJacCalcTime, & - p_FAST, m_FAST, .true., ED, SED, BD, SrvD, AD, ADsk, ExtLd, IfW, ExtInfw, HD, SD, ExtPtfm, MAPp, FEAM, MD, Orca, IceF, IceD, MeshMapData, ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF (ErrStat >= AbortErrLev) RETURN + ! Calculate state perturbation + Perturb = VTK_Modes%VTKLinScale * VTK_Modes%x_eig_magnitude(:, iLinTime, iMode) * & + cos(TwoPi_D * VTK_Modes%DampedFreq_Hz(iMode) * tprime + VTK_Modes%x_eig_phase(:, iLinTime, iMode) + VTK_Modes%VTKLinPhase) - call WriteVTK(m_FAST%Lin%LinTimes(iLinTime)+tprime, p_FAST, y_FAST, MeshMapData, ED, SED, BD, AD, IfW, ExtInfw, SeaSt, HD, SD, ExtPtfm, SrvD, MAPp, FEAM, MD, Orca, IceF, IceD) + ! Perturb states and output VTK + call CalcOutputModeShapeVTK(T%m_FAST%Lin%LinTimes(iLinTime)+tprime, Perturb) end do ! it end do ! iLinTime - end select ! VTKLinTim=1 or 2 - end do ! iMode +contains + subroutine CalcOutputModeShapeVTK(TimeVTK, Perturb) + use FAST_Solver, only : FAST_CalcOutputsAndSolveForInputs + real(DbKi), intent(in) :: TimeVTK + real(DbKi), intent(in) :: Perturb(:) + integer(IntKi) :: ConvIter + real(DbKi) :: ConvError + logical :: IsConverged + integer(IntKi) :: i + + ! Restore operating point + call ModGlue_RestoreOperatingPoint(T%p_Glue, T%m_Glue, iLinTime, T, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + ! Collect states from restored operating points + do i = 1, size(T%m_Glue%ModGlue%ModData) + associate (ModData => T%m_Glue%ModGlue%ModData(i)) + call FAST_GetOP(ModData, t_initial, INPUT_CURR, STATE_CURR, T, ErrStat2, ErrMsg2, & + x_op=ModData%Lin%x, x_glue=T%m_Glue%ModGlue%Lin%x) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end associate + end do + + ! Add state perturbation to collected states + call MV_AddDelta(T%m_Glue%ModGlue%Vars%x, Perturb, T%m_Glue%ModGlue%Lin%x) + + ! Replace states with perturbed states + do i = 1, size(T%m_Glue%ModGlue%ModData) + associate (ModData => T%m_Glue%ModGlue%ModData(i)) + call FAST_SetOP(ModData, INPUT_CURR, STATE_CURR, T, ErrStat2, ErrMsg2, & + x_op=ModData%Lin%x, x_glue=T%m_Glue%ModGlue%Lin%x) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end associate + end do + + ! Calcualte outputs based on perturbed states + call FAST_CalcOutputsAndSolveForInputs(T%p_Glue%TC, T%m_Glue%TC, T%m_Glue%ModData, T%m_Glue%Mappings, T%m_FAST%Lin%LinTimes(iLinTime), & + INPUT_CURR, STATE_CURR, T, ConvIter, ConvError, IsConverged, & + ErrStat2, ErrMsg2, UpdateJacobian=.true.) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (ErrStat >= AbortErrLev) return + ! Write VTK output + call WriteVTK(TimeVTK, T%p_FAST, T%y_FAST, & + T%ED, T%SED, T%BD, T%AD, T%IfW, T%ExtInfw, T%SeaSt, T%HD, T%SD, & + T%ExtPtfm, T%SrvD, T%MAP, T%FEAM, T%MD, T%Orca, T%IceF, T%IceD, T%SlD) + end subroutine END SUBROUTINE FAST_RestoreForVTKModeShape_T + !---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE GetTimeConstants(DampedFreq_Hz, VTK_fps, VTKLinTim, nt, dt, VTK_tWidth) REAL(R8Ki), INTENT(IN ) :: DampedFreq_Hz @@ -10515,15 +7668,16 @@ SUBROUTINE GetTimeConstants(DampedFreq_Hz, VTK_fps, VTKLinTim, nt, dt, VTK_tWidt END SUBROUTINE GetTimeConstants !---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE ReadModeShapeMatlabFile(p_FAST, ErrStat, ErrMsg) - TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None +SUBROUTINE ReadModeShapeDataFile(VTK_Modes, NLinTimesReq, ErrStat, ErrMsg) + TYPE(FAST_VTK_ModeShapeType), INTENT(INOUT) :: VTK_Modes !< Parameters for the glue code + INTEGER(IntKi), INTENT(IN ) :: NLinTimesReq !< Num linearization times required in file + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'ReadModeShapeMatlabFile' + CHARACTER(*), PARAMETER :: RoutineName = 'ReadModeShapeDataFile' INTEGER(4) :: FileType INTEGER(4) :: nModes @@ -10540,83 +7694,83 @@ SUBROUTINE ReadModeShapeMatlabFile(p_FAST, ErrStat, ErrMsg) !$OMP critical(fileopen_critical) CALL GetNewUnit( UnIn, ErrStat2, ErrMsg2 ) - CALL OpenBInpFile ( UnIn, trim(p_FAST%VTK_modes%MatlabFileName), ErrStat2, ErrMsg2 ) + CALL OpenBInpFile ( UnIn, trim(VTK_modes%DataFileName), ErrStat2, ErrMsg2 ) !$OMP end critical(fileopen_critical) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) IF (ErrStat >= AbortErrLev) RETURN ! Process the requested data records of this file. - CALL WrScr ( NewLine//' =======================================================' ) - CALL WrScr ( ' Reading binary mode file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".') + CALL WrScr(NewLine//' =======================================================') + CALL WrScr(' Reading binary mode file "'//trim(VTK_modes%DataFileName)//'".') ! Read some of the header information. READ (UnIn, IOSTAT=ErrStat2) FileType ! placeholder for future file format changes IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading FileType from file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading FileType from file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF READ (UnIn, IOSTAT=ErrStat2) nModes ! number of modes in the file IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading nModes from file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading nModes from file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF READ (UnIn, IOSTAT=ErrStat2) nStates ! number of states in the file IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading nStates from file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading nStates from file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF READ (UnIn, IOSTAT=ErrStat2) NLinTimes ! number of linearization times / azimuths in the file IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading NLinTimes from file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading NLinTimes from file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF - CALL WrScr ( ' Number of modes: '//TRIM(num2lstr(nModes))//', states: '//TRIM(num2lstr(nStates))//', linTimes: '//TRIM(num2lstr(NLinTimes))//'.') + CALL WrScr(' Number of modes: '//TRIM(num2lstr(nModes))//', states: '//TRIM(num2lstr(nStates))//', linTimes: '//TRIM(num2lstr(NLinTimes))//'.') - ALLOCATE( p_FAST%VTK_Modes%NaturalFreq_Hz(nModes), & - p_FAST%VTK_Modes%DampingRatio( nModes), & - p_FAST%VTK_Modes%DampedFreq_Hz( nModes), STAT=ErrStat2 ) + ALLOCATE( VTK_Modes%NaturalFreq_Hz(nModes), & + VTK_Modes%DampingRatio( nModes), & + VTK_Modes%DampedFreq_Hz( nModes), STAT=ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat ( ErrID_Fatal, 'Error allocating arrays to read from file.', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF - READ(UnIn, IOSTAT=ErrStat2) p_FAST%VTK_Modes%NaturalFreq_Hz ! read entire array + READ(UnIn, IOSTAT=ErrStat2) VTK_Modes%NaturalFreq_Hz ! read entire array IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading NaturalFreq_Hz array from file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading NaturalFreq_Hz array from file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF - READ(UnIn, IOSTAT=ErrStat2) p_FAST%VTK_Modes%DampingRatio ! read entire array + READ(UnIn, IOSTAT=ErrStat2) VTK_Modes%DampingRatio ! read entire array IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading DampingRatio array from file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading DampingRatio array from file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF - READ(UnIn, IOSTAT=ErrStat2) p_FAST%VTK_Modes%DampedFreq_Hz ! read entire array + READ(UnIn, IOSTAT=ErrStat2) VTK_Modes%DampedFreq_Hz ! read entire array IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading DampedFreq_Hz array from file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading DampedFreq_Hz array from file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF - if (NLinTimes /= p_FAST%NLinTimes) CALL SetErrStat(ErrID_Severe,'Number of times linearization was performed is not the same as the number of linearization times in the linearization analysis file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName) + if (NLinTimes /= NLinTimesReq) CALL SetErrStat(ErrID_Severe,'Number of times linearization was performed is not the same as the number of linearization times in the linearization analysis file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName) ! Maximum mode index requested by user - iModeMax = maxval(p_FAST%VTK_modes%VTKModes(:)) + iModeMax = maxval(VTK_modes%VTKModes(:)) if (nModes < iModeMax) then call WrScr(' Warning: the maximum index in VTKModes ('//trim(num2lstr(iModeMax))//') exceeds the number of modes ('//trim(num2lstr(nModes))//') from binary file.'); endif ! Let's read only the number of modes we need to use nModes = min( nModes, iModeMax) - ALLOCATE( p_FAST%VTK_Modes%x_eig_magnitude(nStates, NLinTimes, nModes), & - p_FAST%VTK_Modes%x_eig_phase( nStates, NLinTimes, nModes), STAT=ErrStat2 ) + ALLOCATE( VTK_Modes%x_eig_magnitude(nStates, NLinTimes, nModes), & + VTK_Modes%x_eig_phase( nStates, NLinTimes, nModes), STAT=ErrStat2 ) IF ( ErrStat2 /= 0 ) THEN CALL SetErrStat ( ErrID_Fatal, 'Error allocating arrays to read from file.', ErrStat, ErrMsg, RoutineName ) RETURN @@ -10624,25 +7778,26 @@ SUBROUTINE ReadModeShapeMatlabFile(p_FAST, ErrStat, ErrMsg) do iMode = 1,nModes - READ(UnIn, IOSTAT=ErrStat2) p_FAST%VTK_Modes%x_eig_magnitude(:,:,iMode) ! read data for one mode + READ(UnIn, IOSTAT=ErrStat2) VTK_Modes%x_eig_magnitude(:,:,iMode) ! read data for one mode IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading x_eig_magnitude from file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading x_eig_magnitude from file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF - READ(UnIn, IOSTAT=ErrStat2) p_FAST%VTK_Modes%x_eig_phase(:,:,iMode) ! read data for one mode + READ(UnIn, IOSTAT=ErrStat2) VTK_Modes%x_eig_phase(:,:,iMode) ! read data for one mode IF ( ErrStat2 /= 0 ) THEN - CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading x_eig_phase from file "'//TRIM( p_FAST%VTK_modes%MatlabFileName )//'".', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat ( ErrID_Fatal, 'Fatal error reading x_eig_phase from file "'//trim(VTK_modes%DataFileName )//'".', ErrStat, ErrMsg, RoutineName ) RETURN ENDIF end do -END SUBROUTINE ReadModeShapeMatlabFile +END SUBROUTINE ReadModeShapeDataFile !---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE ReadModeShapeFile(p_FAST, InputFile, ErrStat, ErrMsg, checkpointOnly) +SUBROUTINE ReadModeShapeFile(p_FAST, InputFile, VTK_Modes, ErrStat, ErrMsg, checkpointOnly) TYPE(FAST_ParameterType), INTENT(INOUT) :: p_FAST !< Parameters for the glue code CHARACTER(*), INTENT(IN ) :: InputFile !< Name of the text input file to read + TYPE(FAST_VTK_ModeShapeType), INTENT(INOUT) :: VTK_Modes !< Parameters for the glue code INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None LOGICAL, OPTIONAL, INTENT(IN ) :: checkpointOnly !< Whether to return after reading checkpoint file name @@ -10684,10 +7839,10 @@ SUBROUTINE ReadModeShapeFile(p_FAST, InputFile, ErrStat, ErrMsg, checkpointOnly) CALL ReadCom( UnIn, InputFile, 'Section Header: File Names', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ReadVar( UnIn, InputFile, p_FAST%VTK_modes%CheckpointRoot, 'CheckpointRoot', 'Name of the checkpoint file written by FAST when linearization data was produced', ErrStat2, ErrMsg2, UnEc ) + CALL ReadVar( UnIn, InputFile, VTK_modes%CheckpointRoot, 'CheckpointRoot', 'Name of the checkpoint file written by FAST when linearization data was produced', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - IF ( PathIsRelative( p_FAST%VTK_modes%CheckpointRoot ) ) p_FAST%VTK_modes%CheckpointRoot = TRIM(PriPath)//TRIM(p_FAST%VTK_modes%CheckpointRoot) + IF ( PathIsRelative( VTK_modes%CheckpointRoot ) ) VTK_modes%CheckpointRoot = TRIM(PriPath)//TRIM(VTK_modes%CheckpointRoot) if (present(checkpointOnly)) then if (checkpointOnly) then @@ -10697,24 +7852,24 @@ SUBROUTINE ReadModeShapeFile(p_FAST, InputFile, ErrStat, ErrMsg, checkpointOnly) end if - CALL ReadVar( UnIn, InputFile, p_FAST%VTK_modes%MatlabFileName, 'MatlabFileName', 'Name of the file with eigenvectors written by Matlab', ErrStat2, ErrMsg2, UnEc ) + CALL ReadVar( UnIn, InputFile, VTK_modes%DataFileName, 'DataFileName', 'Name of the file with eigenvectors written by Matlab', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) IF ( ErrStat >= AbortErrLev ) THEN CALL Cleanup() RETURN END IF - IF ( PathIsRelative( p_FAST%VTK_modes%MatlabFileName ) ) p_FAST%VTK_modes%MatlabFileName = TRIM(PriPath)//TRIM(p_FAST%VTK_modes%MatlabFileName) + IF ( PathIsRelative( VTK_modes%DataFileName ) ) VTK_modes%DataFileName = TRIM(PriPath)//TRIM(VTK_modes%DataFileName) !----------- VISUALIZATION OPTIONS ------------------------------------------ CALL ReadCom( UnIn, InputFile, 'Section Header: Visualization Options', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ReadVar( UnIn, InputFile, p_FAST%VTK_modes%VTKLinModes, 'VTKLinModes', 'Number of modes to visualize', ErrStat2, ErrMsg2, UnEc ) + CALL ReadVar( UnIn, InputFile, VTK_modes%VTKLinModes, 'VTKLinModes', 'Number of modes to visualize', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - if (p_FAST%VTK_modes%VTKLinModes <= 0) CALL SetErrStat( ErrID_Fatal, "VTKLinModes must be a positive number.", ErrStat, ErrMsg, RoutineName ) + if (VTK_modes%VTKLinModes <= 0) CALL SetErrStat( ErrID_Fatal, "VTKLinModes must be a positive number.", ErrStat, ErrMsg, RoutineName ) if (ErrStat >= AbortErrLev) then CALL Cleanup() @@ -10722,57 +7877,57 @@ SUBROUTINE ReadModeShapeFile(p_FAST, InputFile, ErrStat, ErrMsg, checkpointOnly) end if - call AllocAry( p_FAST%VTK_modes%VTKModes, p_FAST%VTK_modes%VTKLinModes, 'VTKModes', ErrStat2, ErrMsg2) + call AllocAry( VTK_modes%VTKModes, VTK_modes%VTKLinModes, 'VTKModes', ErrStat2, ErrMsg2) call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) if ( ErrStat >= AbortErrLev ) then call Cleanup() return end if - p_FAST%VTK_modes%VTKModes = -1 + VTK_modes%VTKModes = -1 - CALL ReadAry( UnIn, InputFile, p_FAST%VTK_modes%VTKModes, p_FAST%VTK_modes%VTKLinModes, 'VTKModes', 'List of modes to visualize', ErrStat2, ErrMsg2, UnEc ) - ! note that we don't check the ErrStat here; if the user entered fewer than p_FAST%VTK_modes%VTKLinModes values, we will use the + CALL ReadAry( UnIn, InputFile, VTK_modes%VTKModes, VTK_modes%VTKLinModes, 'VTKModes', 'List of modes to visualize', ErrStat2, ErrMsg2, UnEc ) + ! note that we don't check the ErrStat here; if the user entered fewer than VTK_modes%VTKLinModes values, we will use the ! last entry to fill in remaining values. !Check 1st value, we need at least one good value from user or throw error - IF (p_FAST%VTK_modes%VTKModes(1) < 0 ) THEN + IF (VTK_modes%VTKModes(1) < 0 ) THEN call SetErrStat( ErrID_Fatal, "VTKModes must contain positive numbers.", ErrStat, ErrMsg, RoutineName ) CALL CleanUp() RETURN ELSE - DO i = 2, p_FAST%VTK_modes%VTKLinModes - IF ( p_FAST%VTK_modes%VTKModes(i) < 0 ) THEN - p_FAST%VTK_modes%VTKModes(i)=p_FAST%VTK_modes%VTKModes(i-1) + 1 + DO i = 2, VTK_modes%VTKLinModes + IF ( VTK_modes%VTKModes(i) < 0 ) THEN + VTK_modes%VTKModes(i)=VTK_modes%VTKModes(i-1) + 1 ENDIF ENDDO ENDIF - CALL ReadVar( UnIn, InputFile, p_FAST%VTK_modes%VTKLinScale, 'VTKLinScale', 'Mode shape visualization scaling factor', ErrStat2, ErrMsg2, UnEc ) + CALL ReadVar( UnIn, InputFile, VTK_modes%VTKLinScale, 'VTKLinScale', 'Mode shape visualization scaling factor', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ReadVar( UnIn, InputFile, p_FAST%VTK_modes%VTKLinTim, 'VTKLinTim', 'Switch to make one animation for all LinTimes together (1) or separate animations for each LinTimes(2)', ErrStat2, ErrMsg2, UnEc ) + CALL ReadVar( UnIn, InputFile, VTK_modes%VTKLinTim, 'VTKLinTim', 'Switch to make one animation for all LinTimes together (1) or separate animations for each LinTimes(2)', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) CALL ReadVar( UnIn, InputFile, VTKLinTimes1, 'VTKLinTimes1', 'If VTKLinTim=2, visualize modes at LinTimes(1) only?', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - CALL ReadVar( UnIn, InputFile, p_FAST%VTK_modes%VTKLinPhase, 'VTKLinPhase', 'Phase when making one animation for all LinTimes together (used only when VTKLinTim=1)', ErrStat2, ErrMsg2, UnEc ) + CALL ReadVar( UnIn, InputFile, VTK_modes%VTKLinPhase, 'VTKLinPhase', 'Phase when making one animation for all LinTimes together (used only when VTKLinTim=1)', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) ! overwrite these based on inputs: - if (p_FAST%VTK_modes%VTKLinTim == 2) then - !p_FAST%VTK_modes%VTKLinPhase = 0 ! "Phase when making one animation for all LinTimes together (used only when VTKLinTim=1)" - + if (VTK_modes%VTKLinTim == 2) then + !VTK_modes%VTKLinPhase = 0 ! "Phase when making one animation for all LinTimes together (used only when VTKLinTim=1)" - if (VTKLinTimes1) then - p_FAST%VTK_modes%VTKNLinTimes = 1 + VTK_modes%VTKNLinTimes = 1 else - p_FAST%VTK_modes%VTKNLinTimes = p_FAST%NLinTimes + VTK_modes%VTKNLinTimes = p_FAST%NLinTimes end if else - p_FAST%VTK_modes%VTKNLinTimes = p_FAST%NLinTimes + VTK_modes%VTKNLinTimes = p_FAST%NLinTimes end if contains @@ -10781,6 +7936,54 @@ SUBROUTINE Cleanup() END SUBROUTINE Cleanup END SUBROUTINE ReadModeShapeFile + +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine sets the inputs required for ServoDyn from an external source (Simulink) +SUBROUTINE SrvD_SetExternalInputs(p_FAST, m_FAST, u_SrvD) + + TYPE(FAST_ParameterType), INTENT(IN) :: p_FAST !< Glue-code simulation parameters + TYPE(FAST_MiscVarType), INTENT(IN) :: m_FAST !< Glue-code misc variables (including inputs from external sources like Simulink) + TYPE(SrvD_InputType), INTENT(INOUT) :: u_SrvD !< ServoDyn Inputs at t + + INTEGER(IntKi) :: i ! loop counter + + ! we are going to use extrapolated values because these external values from Simulink are at n instead of n+1 + u_SrvD%ExternalGenTrq = m_FAST%ExternInput%GenTrq + u_SrvD%ExternalElecPwr = m_FAST%ExternInput%ElecPwr + u_SrvD%ExternalYawPosCom = m_FAST%ExternInput%YawPosCom + u_SrvD%ExternalYawRateCom = m_FAST%ExternInput%YawRateCom + u_SrvD%ExternalHSSBrFrac = m_FAST%ExternInput%HSSBrFrac + + if (ALLOCATED(u_SrvD%ExternalBlPitchCom)) then !there should be no reason this isn't allocated, but ExternalInflow is acting strange... + do i=1,SIZE(u_SrvD%ExternalBlPitchCom) + u_SrvD%ExternalBlPitchCom(i) = m_FAST%ExternInput%BlPitchCom(i) + end do + end if + + if (ALLOCATED(u_SrvD%ExternalBlAirfoilCom)) then ! Added Blade Flap use with Simulink + do i=1,SIZE(u_SrvD%ExternalBlAirfoilCom) + u_SrvD%ExternalBlAirfoilCom(i) = m_FAST%ExternInput%BlAirfoilCom(i) + end do + end if + + ! Cable controls + if (ALLOCATED(u_SrvD%ExternalCableDeltaL)) then ! This is only allocated if cable control signals are requested + do i=1,min(SIZE(u_SrvD%ExternalCableDeltaL),SIZE(m_FAST%ExternInput%CableDeltaL)) + u_SrvD%ExternalCableDeltaL(i) = m_FAST%ExternInput%CableDeltaL(i) + end do + end if + + if (ALLOCATED(u_SrvD%ExternalCableDeltaLdot)) then ! This is only allocated if cable control signals are requested + do i=1,min(SIZE(u_SrvD%ExternalCableDeltaLdot),SIZE(m_FAST%ExternInput%CableDeltaLdot)) + u_SrvD%ExternalCableDeltaLdot(i) = m_FAST%ExternInput%CableDeltaLdot(i) + end do + end if + + ! StC controls + ! This is a placeholder for where StC controls would be passed if they are enabled from Simulink + +END SUBROUTINE SrvD_SetExternalInputs + !---------------------------------------------------------------------------------------------------------------------------------- END MODULE FAST_Subs !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/openfast-library/src/FAST_Types.f90 b/modules/openfast-library/src/FAST_Types.f90 index 64b9ac18be..ac56b2841a 100644 --- a/modules/openfast-library/src/FAST_Types.f90 +++ b/modules/openfast-library/src/FAST_Types.f90 @@ -31,6 +31,7 @@ !! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. MODULE FAST_Types !--------------------------------------------------------------------------------------------------------------------------------- +USE Glue_Types USE ElastoDyn_Types USE SED_Types USE BeamDyn_Types @@ -40,6 +41,7 @@ MODULE FAST_Types USE ExtLoads_Types USE SubDyn_Types USE SeaState_Types +USE SoilDyn_Types USE HydroDyn_Types USE IceFloe_Types USE ExternalInflow_Types @@ -51,38 +53,42 @@ MODULE FAST_Types USE ExtPtfm_MCKF_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_Unknown = -1 ! Unknown [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_None = 0 ! No module selected [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_Glue = 1 ! Glue code [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IfW = 2 ! InflowWind [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ExtInfw = 3 ! ExternalInflow [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ED = 4 ! ElastoDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_BD = 5 ! BeamDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_AD = 7 ! AeroDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ExtLd = 8 ! ExternalLoads [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SrvD = 9 ! ServoDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SeaSt = 10 ! SeaState [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_HD = 11 ! HydroDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SD = 12 ! SubDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ExtPtfm = 13 ! External Platform Loading MCKF [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_MAP = 14 ! MAP (Mooring Analysis Program) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_FEAM = 15 ! FEAMooring [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_MD = 16 ! MoorDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_Orca = 17 ! OrcaFlex integration (HD/Mooring) [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceF = 18 ! IceFloe [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceD = 19 ! IceDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ADsk = 20 ! AeroDisk [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SED = 21 ! Simplified-ElastoDyn [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: NumModules = 21 ! The number of modules available in FAST [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: MaxNBlades = 3 ! Maximum number of blades allowed on a turbine [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: IceD_MaxLegs = 4 ! because I don't know how many legs there are before calling IceD_Init and I don't want to copy the data because of sibling mesh issues, I'm going to allocate IceD based on this number [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_Pitch = 1 ! pitch [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_TSR = 2 ! TSR [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_WS = 3 ! wind speed [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_RotSpeed = 4 ! rotor speed [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_Err = 5 ! err in the ss solve [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_Iter = 6 ! number of iterations [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: NumStateTimes = 4 ! size of arrays of state derived types (Continuous state type etc). (STATE_CURR, STATE_PRED, STATE_SAVED_CURR, STATE_SAVED_PRED) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: LooseCoupling = 1 ! Loose Module Coupling [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TightCouplingFixed = 2 ! Tight Module Coupling with fixed Jacobian updates (DT_UJac) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: TightCouplingAdaptive = 3 ! Tight Module Coupling with adaptive Jacobian updates [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_Unknown = -1 ! Unknown [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_None = 0 ! No module selected [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_Glue = 1 ! Glue code [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IfW = 2 ! InflowWind [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ExtInfw = 3 ! ExternalInflow [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ED = 4 ! ElastoDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_BD = 5 ! BeamDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_AD = 7 ! AeroDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ExtLd = 8 ! ExternalLoads [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SrvD = 9 ! ServoDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SeaSt = 10 ! SeaState [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_HD = 11 ! HydroDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SD = 12 ! SubDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ExtPtfm = 13 ! External Platform Loading MCKF [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_MAP = 14 ! MAP (Mooring Analysis Program) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_FEAM = 15 ! FEAMooring [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_MD = 16 ! MoorDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_Orca = 17 ! OrcaFlex integration (HD/Mooring) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceF = 18 ! IceFloe [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_IceD = 19 ! IceDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_ADsk = 20 ! AeroDisk [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SED = 21 ! Simplified-ElastoDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Module_SlD = 22 ! SoilDyn [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: NumModules = 22 ! The number of modules available in FAST [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: MaxBladesBD = 3 ! Maximum number of blades allowed on a turbine [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: IceD_MaxLegs = 4 ! because I don't know how many legs there are before calling IceD_Init and I don't want to copy the data because of sibling mesh issues, I'm going to allocate IceD based on this number [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_Pitch = 1 ! pitch [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_TSR = 2 ! TSR [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_WS = 3 ! wind speed [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_RotSpeed = 4 ! rotor speed [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_Err = 5 ! err in the ss solve [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SS_Indx_Iter = 6 ! number of iterations [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: NumStateTimes = 4 ! size of arrays of state derived types (Continuous state type etc). (STATE_CURR, STATE_PRED, STATE_SAVED_CURR, STATE_SAVED_PRED) [-] ! ========= FAST_VTK_BLSurfaceType ======= TYPE, PUBLIC :: FAST_VTK_BLSurfaceType REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: AirfoilCoords !< x,y coordinates for airfoil around each blade node on a blade (relative to reference) [-] @@ -106,7 +112,7 @@ MODULE FAST_Types ! ========= FAST_VTK_ModeShapeType ======= TYPE, PUBLIC :: FAST_VTK_ModeShapeType CHARACTER(1024) :: CheckpointRoot !< name of the checkpoint file written by FAST when linearization data was produced [-] - CHARACTER(1024) :: MatlabFileName !< name of the file with eigenvectors written by Matlab [-] + CHARACTER(1024) :: DataFileName !< name of the file with eigenvectors written by Matlab [-] INTEGER(IntKi) :: VTKLinModes = 0_IntKi !< Number of modes to visualize [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: VTKModes !< Which modes to visualize [-] INTEGER(IntKi) :: VTKLinTim = 0_IntKi !< Switch to make one animation for all LinTimes together (1) or separate animations for each LinTimes(2) [-] @@ -120,41 +126,40 @@ MODULE FAST_Types REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: x_eig_phase !< phase of eigenvector (dimension 1=state, dim 2= azimuth, dim 3 = mode) [-] END TYPE FAST_VTK_ModeShapeType ! ======================= -! ========= FAST_SS_CaseType ======= - TYPE, PUBLIC :: FAST_SS_CaseType - REAL(ReKi) :: RotSpeed = 0.0_ReKi !< Rotor speed for this case of the steady-state solve [>0] [(rad/s)] - REAL(ReKi) :: TSR = 0.0_ReKi !< TSR for this case of the steady-state solve [>0] [(-)] - REAL(ReKi) :: WindSpeed = 0.0_ReKi !< Windspeed for this case of the steady-state solve [>0] [(m/s)] - REAL(ReKi) :: Pitch = 0.0_ReKi !< Pitch angle for this case of the steady-state solve [(rad)] - END TYPE FAST_SS_CaseType -! ======================= ! ========= FAST_ParameterType ======= TYPE, PUBLIC :: FAST_ParameterType REAL(DbKi) :: DT = 0.0_R8Ki !< Integration time step [global time] [s] - REAL(DbKi) , DIMENSION(1:NumModules) :: DT_module = 0.0_R8Ki !< Integration time step [global time] [s] - INTEGER(IntKi) , DIMENSION(1:NumModules) :: n_substeps = 0_IntKi !< The number of module substeps for advancing states from t_global to t_global_next [-] INTEGER(IntKi) :: n_TMax_m1 = 0_IntKi !< The time step of TMax - dt (the end time of the simulation) [(-)] REAL(DbKi) :: TMax = 0.0_R8Ki !< Total run time [s] INTEGER(IntKi) :: InterpOrder = 0_IntKi !< Interpolation order {0,1,2} [-] INTEGER(IntKi) :: NumCrctn = 0_IntKi !< Number of correction iterations [-] INTEGER(IntKi) :: KMax = 0_IntKi !< Maximum number of input-output-solve or nonlinear solve residual equation iterations (KMax >= 1) [>0] [-] INTEGER(IntKi) :: numIceLegs = 0_IntKi !< number of suport-structure legs in contact with ice (IceDyn coupling) [-] - INTEGER(IntKi) :: nBeams = 0_IntKi !< number of BeamDyn instances [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: RotNumBld !< number of blades in each rotor [-] + LOGICAL , DIMENSION(:), ALLOCATABLE :: MirrorRotor !< Array of flags indicating if rotor rotation should be mirrored (true=mirror) [-] + INTEGER(IntKi) :: NumBD = 0_IntKi !< number of BeamDyn instances [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BDRotMap !< array mapping BeamDyn instance to rotor number [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: BDBldMap !< array mapping BeamDyn instance to blade number [-] LOGICAL :: BD_OutputSibling = .false. !< flag to determine if BD input is sibling of output mesh [-] - LOGICAL , DIMENSION(1:NumModules) :: ModuleInitialized = .false. !< An array determining if the module has been initialized [-] + INTEGER(IntKi) :: ModCoupling = 0_IntKi !< Module coupling type {1=loose; 2=tight with fixed Jacobian updates (DT_UJac); 3=tight with automatic Jacobian updates} [-] + REAL(DbKi) :: RhoInf = 0.0_R8Ki !< Numerical damping parameter for tight coupling generalized-alpha integrator (-) [0.0 to 1.0] [-] + REAL(DbKi) :: ConvTol = 0.0_R8Ki !< Convergence iteration error tolerance for tight coupling generalized alpha integrator (-) [-] + INTEGER(IntKi) :: MaxConvIter = 0_IntKi !< Maximum number of convergence iterations for tight coupling generalized alpha integrator (-) [-] REAL(DbKi) :: DT_Ujac = 0.0_R8Ki !< Time between when we need to re-calculate these Jacobians [s] REAL(ReKi) :: UJacSclFact = 0.0_ReKi !< Scaling factor used to get similar magnitudes between accelerations, forces, and moments in Jacobians [-] INTEGER(IntKi) , DIMENSION(1:9) :: SizeJac_Opt1 = 0_IntKi !< (1)=size of matrix; (2)=size of ED portion; (3)=size of SD portion [2 meshes]; (4)=size of HD portion; (5)=size of BD portion blade 1; (6)=size of BD portion blade 2; (7)=size of BD portion blade 3; (8)=size of Orca portion; (9)=size of ExtPtfm portion; [-] INTEGER(IntKi) :: SolveOption = 0_IntKi !< Switch to determine which solve option we are going to use (see Solve_FullOpt1, etc) [-] + INTEGER(IntKi) :: NRotors = 0_IntKi !< Number of rotors in turbine [-] INTEGER(IntKi) :: CompElast = 0_IntKi !< Compute blade loads (switch) {Module_ED; Module_BD; Module_SED} [-] INTEGER(IntKi) :: CompInflow = 0_IntKi !< Compute inflow wind conditions (switch) {Module_None; Module_IfW; Module_ExtInfw} [-] INTEGER(IntKi) :: CompAero = 0_IntKi !< Compute aerodynamic loads (switch) {Module_None; Module_ADsk; Module_AD} [-] INTEGER(IntKi) :: CompServo = 0_IntKi !< Compute control and electrical-drive dynamics (switch) {Module_None; Module_SrvD} [-] INTEGER(IntKi) :: CompSeaSt = 0_IntKi !< Compute sea states; wave kinematics (switch) {Module_None; Module_SeaSt} [-] INTEGER(IntKi) :: CompHydro = 0_IntKi !< Compute hydrodynamic loads (switch) {Module_None; Module_HD} [-] - INTEGER(IntKi) :: CompSub = 0_IntKi !< Compute sub-structural dynamics (switch) {Module_None; Module_SD, Module_ExtPtfm} [-] + INTEGER(IntKi) :: CompSub = 0_IntKi !< Compute sub-structural dynamics (switch) {Module_None; Module_SD, Module_ExtPtfm, Module_SlD} [-] INTEGER(IntKi) :: CompMooring = 0_IntKi !< Compute mooring system (switch) {Module_None; Module_MAP; Module_FEAM; Module_MD; Module_Orca} [-] INTEGER(IntKi) :: CompIce = 0_IntKi !< Compute ice loading (switch) {Module_None; Module_IceF, Module_IceD} [-] + INTEGER(IntKi) :: CompSoil = 0_IntKi !< Compute soil-structural dynamics (switch) {Module_None; Module_SlD} [-] INTEGER(IntKi) :: MHK = 0_IntKi !< MHK turbine type (switch) {0=Not an MHK turbine; 1=Fixed MHK turbine; 2=Floating MHK turbine} [-] LOGICAL :: UseDWM = .false. !< Use the DWM module in AeroDyn [-] LOGICAL :: Linearize = .false. !< Linearization analysis (flag) [-] @@ -170,16 +175,17 @@ MODULE FAST_Types REAL(ReKi) :: Pvap = 0.0_ReKi !< Vapour pressure of working fluid [Pa] REAL(ReKi) :: WtrDpth = 0.0_ReKi !< Water depth [m] REAL(ReKi) :: MSL2SWL = 0.0_ReKi !< Offset between still-water level and mean sea level [m] - CHARACTER(1024) :: EDFile !< The name of the ElastoDyn/Simplified-ElastoDyn input file [-] - CHARACTER(1024) , DIMENSION(1:MaxNBlades) :: BDBldFile !< Name of files containing BeamDyn inputs for each blade [-] - CHARACTER(1024) :: InflowFile !< Name of file containing inflow wind input parameters [-] - CHARACTER(1024) :: AeroFile !< Name of file containing aerodynamic input parameters [-] - CHARACTER(1024) :: ServoFile !< Name of file containing control and electrical-drive input parameters [-] - CHARACTER(1024) :: SeaStFile !< Name of file containing sea state input parameters [-] - CHARACTER(1024) :: HydroFile !< Name of file containing hydrodynamic input parameters [-] - CHARACTER(1024) :: SubFile !< Name of file containing sub-structural input parameters [-] - CHARACTER(1024) :: MooringFile !< Name of file containing mooring system input parameters [-] - CHARACTER(1024) :: IceFile !< Name of file containing ice loading input parameters [-] + CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: EDFile !< ElastoDyn/Simplified-ElastoDyn input file paths (NRotors) [-] + CHARACTER(1024) , DIMENSION(:,:), ALLOCATABLE :: BDBldFile !< BeamDyn input file paths for each blade (MaxBladesBD,NRotors) [-] + CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: ServoFile !< Turbine control and electrical-drive input file paths (NRotors) [-] + CHARACTER(1024) :: InflowFile !< Inflow wind input file path [-] + CHARACTER(1024) :: AeroFile !< Aerodynamic input file path [-] + CHARACTER(1024) :: SeaStFile !< Sea state input file path [-] + CHARACTER(1024) :: HydroFile !< Hydrodynamic input file path [-] + CHARACTER(1024) :: SubFile !< sub-structural input file path [-] + CHARACTER(1024) :: MooringFile !< mooring system input file path [-] + CHARACTER(1024) :: IceFile !< ice loading input file path [-] + CHARACTER(1024) :: SoilFile !< Name of file containing soil-structure input parameters [-] REAL(DbKi) :: TStart = 0.0_R8Ki !< Time to begin tabular output [s] REAL(DbKi) :: DT_Out = 0.0_R8Ki !< Time step for tabular output [s] LOGICAL :: WrSttsTime = .false. !< Whether we should write the status times to the screen [-] @@ -219,7 +225,6 @@ MODULE FAST_Types INTEGER(IntKi) :: LinOutputs = 0_IntKi !< Outputs included in linearization (switch) {0=none; 1=from OutList(s); 2=all module outputs (debug)} [unused if Linearize=False] [-] LOGICAL :: LinOutJac = .false. !< Include full Jacabians in linearization output (for debug) (flag) [unused if Linearize=False; used only if LinInputs=LinOutputs=2] [-] LOGICAL :: LinOutMod = .false. !< Write module-level linearization output files in addition to output for full system? (flag) [unused if Linearize=False] [-] - TYPE(FAST_VTK_ModeShapeType) :: VTK_modes !< Data for VTK mode-shape visualization [-] INTEGER(IntKi) :: Lin_NumMods = 0_IntKi !< number of modules in the linearization [-] INTEGER(IntKi) , DIMENSION(1:NumModules) :: Lin_ModOrder = 0_IntKi !< indices that determine which order the modules are in the glue-code linearization matrix [-] INTEGER(IntKi) :: LinInterpOrder = 0_IntKi !< Interpolation order for CalcSteady solution [-] @@ -236,123 +241,8 @@ MODULE FAST_Types INTEGER(IntKi) :: GearBox_index = 0_IntKi !< Index to gearbox rotation in state array (for steady-state calculations) [-] END TYPE FAST_ParameterType ! ======================= -! ========= FAST_LinStateSave ======= - TYPE, PUBLIC :: FAST_LinStateSave - TYPE(IceD_ContinuousStateType) , DIMENSION(:,:), ALLOCATABLE :: x_IceD !< Continuous states [-] - TYPE(IceD_DiscreteStateType) , DIMENSION(:,:), ALLOCATABLE :: xd_IceD !< Discrete states [-] - TYPE(IceD_ConstraintStateType) , DIMENSION(:,:), ALLOCATABLE :: z_IceD !< Constraint states [-] - TYPE(IceD_OtherStateType) , DIMENSION(:,:), ALLOCATABLE :: OtherSt_IceD !< Other states [-] - TYPE(IceD_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_IceD !< System inputs [-] - TYPE(BD_ContinuousStateType) , DIMENSION(:,:), ALLOCATABLE :: x_BD !< Continuous states [-] - TYPE(BD_DiscreteStateType) , DIMENSION(:,:), ALLOCATABLE :: xd_BD !< Discrete states [-] - TYPE(BD_ConstraintStateType) , DIMENSION(:,:), ALLOCATABLE :: z_BD !< Constraint states [-] - TYPE(BD_OtherStateType) , DIMENSION(:,:), ALLOCATABLE :: OtherSt_BD !< Other states [-] - TYPE(BD_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_BD !< System inputs [-] - TYPE(ED_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_ED !< Continuous states [-] - TYPE(ED_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_ED !< Discrete states [-] - TYPE(ED_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_ED !< Constraint states [-] - TYPE(ED_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_ED !< Other states [-] - TYPE(ED_InputType) , DIMENSION(:), ALLOCATABLE :: u_ED !< System inputs [-] - TYPE(SrvD_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_SrvD !< Continuous states [-] - TYPE(SrvD_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_SrvD !< Discrete states [-] - TYPE(SrvD_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_SrvD !< Constraint states [-] - TYPE(SrvD_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_SrvD !< Other states [-] - TYPE(SrvD_InputType) , DIMENSION(:), ALLOCATABLE :: u_SrvD !< System inputs [-] - TYPE(AD_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_AD !< Continuous states [-] - TYPE(AD_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_AD !< Discrete states [-] - TYPE(AD_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_AD !< Constraint states [-] - TYPE(AD_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_AD !< Other states [-] - TYPE(AD_InputType) , DIMENSION(:), ALLOCATABLE :: u_AD !< System inputs [-] - TYPE(InflowWind_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_IfW !< Continuous states [-] - TYPE(InflowWind_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_IfW !< Discrete states [-] - TYPE(InflowWind_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_IfW !< Constraint states [-] - TYPE(InflowWind_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_IfW !< Other states [-] - TYPE(InflowWind_InputType) , DIMENSION(:), ALLOCATABLE :: u_IfW !< System inputs [-] - TYPE(SD_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_SD !< Continuous states [-] - TYPE(SD_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_SD !< Discrete states [-] - TYPE(SD_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_SD !< Constraint states [-] - TYPE(SD_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_SD !< Other states [-] - TYPE(SD_InputType) , DIMENSION(:), ALLOCATABLE :: u_SD !< System inputs [-] - TYPE(ExtPtfm_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_ExtPtfm !< Continuous states [-] - TYPE(ExtPtfm_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_ExtPtfm !< Discrete states [-] - TYPE(ExtPtfm_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_ExtPtfm !< Constraint states [-] - TYPE(ExtPtfm_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_ExtPtfm !< Other states [-] - TYPE(ExtPtfm_InputType) , DIMENSION(:), ALLOCATABLE :: u_ExtPtfm !< System inputs [-] - TYPE(HydroDyn_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_HD !< Continuous states [-] - TYPE(HydroDyn_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_HD !< Discrete states [-] - TYPE(HydroDyn_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_HD !< Constraint states [-] - TYPE(HydroDyn_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_HD !< Other states [-] - TYPE(HydroDyn_InputType) , DIMENSION(:), ALLOCATABLE :: u_HD !< System inputs [-] - TYPE(SeaSt_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_SeaSt !< Continuous states [-] - TYPE(SeaSt_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_SeaSt !< Discrete states [-] - TYPE(SeaSt_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_SeaSt !< Constraint states [-] - TYPE(SeaSt_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_SeaSt !< Other states [-] - TYPE(SeaSt_InputType) , DIMENSION(:), ALLOCATABLE :: u_SeaSt !< System inputs [-] - TYPE(IceFloe_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_IceF !< Continuous states [-] - TYPE(IceFloe_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_IceF !< Discrete states [-] - TYPE(IceFloe_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_IceF !< Constraint states [-] - TYPE(IceFloe_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_IceF !< Other states [-] - TYPE(IceFloe_InputType) , DIMENSION(:), ALLOCATABLE :: u_IceF !< System inputs [-] - TYPE(MAP_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_MAP !< Continuous states [-] - TYPE(MAP_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_MAP !< Discrete states [-] - TYPE(MAP_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_MAP !< Constraint states [-] - TYPE(MAP_InputType) , DIMENSION(:), ALLOCATABLE :: u_MAP !< System inputs [-] - TYPE(FEAM_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_FEAM !< Continuous states [-] - TYPE(FEAM_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_FEAM !< Discrete states [-] - TYPE(FEAM_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_FEAM !< Constraint states [-] - TYPE(FEAM_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_FEAM !< Other states [-] - TYPE(FEAM_InputType) , DIMENSION(:), ALLOCATABLE :: u_FEAM !< System inputs [-] - TYPE(MD_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x_MD !< Continuous states [-] - TYPE(MD_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd_MD !< Discrete states [-] - TYPE(MD_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z_MD !< Constraint states [-] - TYPE(MD_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt_MD !< Other states [-] - TYPE(MD_InputType) , DIMENSION(:), ALLOCATABLE :: u_MD !< System inputs [-] - END TYPE FAST_LinStateSave -! ======================= -! ========= FAST_LinType ======= - TYPE, PUBLIC :: FAST_LinType - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: Names_u !< Names of the linearized inputs [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: Names_y !< Names of the linearized outputs [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: Names_x !< Names of the linearized continuous states [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: Names_xd !< Names of the linearized discrete states [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: Names_z !< Names of the linearized constraint states [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: op_u !< input operating point [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: op_y !< output operating point [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: op_x !< continuous state operating point [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: op_dx !< 1st time derivative of continuous state operating point [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: op_xd !< discrete state operating point [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: op_z !< constraint state operating point [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: op_x_eig_mag !< continuous state eigenvector magnitude [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: op_x_eig_phase !< continuous state eigenvector phase [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: Use_u !< array same size as names_u, which indicates if this input is used in linearization output file [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: Use_y !< array same size as names_y, which indicates if this output is used in linearization output file [-] - REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: A !< A matrix [-] - REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: B !< B matrix [-] - REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: C !< C matrix [-] - REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: D !< D matrix [-] - REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: StateRotation !< Matrix that rotates the continuous states [-] - REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: StateRel_x !< Matrix that defines the continuous states relative to root motion [-] - REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: StateRel_xdot !< Matrix that defines the continuous states relative to root motion [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Whether the input is a load (used for scaling for potentially ill-conditioned G matrix) [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_u !< Whether corresponding input is in rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_y !< Whether corresponding output is in rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_x !< Whether corresponding continuous state is in rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_z !< Whether corresponding constraint state is in rotating frame [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: DerivOrder_x !< Derivative order for continuous states [-] - INTEGER(IntKi) , DIMENSION(1:3) :: SizeLin = 0_IntKi !< sizes of (1) the module's inputs, (2) the module's linearized outputs, and (3) the module's continuous states [-] - INTEGER(IntKi) , DIMENSION(1:3) :: LinStartIndx = 0_IntKi !< the starting index in combined matrices of (1) the module's inputs, (2) the module's linearized outputs, and (3) the module's continuous states [-] - INTEGER(IntKi) :: NumOutputs = 0_IntKi !< number of WriteOutputs in each linearized module [-] - END TYPE FAST_LinType -! ======================= -! ========= FAST_ModLinType ======= - TYPE, PUBLIC :: FAST_ModLinType - TYPE(FAST_LinType) , DIMENSION(:), ALLOCATABLE :: Instance !< Linearization data for each module instance (e.g., 3 blades for BD) [-] - END TYPE FAST_ModLinType -! ======================= ! ========= FAST_LinFileType ======= TYPE, PUBLIC :: FAST_LinFileType - TYPE(FAST_ModLinType) , DIMENSION(1:NumModules) :: Modules !< Linearization data for each module [-] - TYPE(FAST_LinType) :: Glue !< Linearization data for the glue code (coupled system) [-] REAL(ReKi) :: RotSpeed = 0.0_ReKi !< Rotor azimuth angular speed [rad/s] REAL(ReKi) :: Azimuth = 0.0_ReKi !< Rotor azimuth position [rad] REAL(ReKi) :: WindSpeed = 0.0_ReKi !< Wind speed at reference height [m/s] @@ -395,7 +285,6 @@ MODULE FAST_Types INTEGER(IntKi) :: VTK_LastWaveIndx = 0_IntKi !< last index into wave array [-] TYPE(FAST_LinFileType) :: Lin !< linearization data for output [-] INTEGER(IntKi) :: ActualChanLen = 0_IntKi !< width of the column headers output in the text and/or binary file [-] - TYPE(FAST_LinStateSave) :: op !< operating points of states and inputs for VTK output of mode shapes [-] REAL(ReKi) , DIMENSION(1:6) :: DriverWriteOutput = 0.0_ReKi !< pitch and tsr for current aero map case, plus error, number of iterations, wind speed, rotor speed [-] END TYPE FAST_OutputFileType ! ======================= @@ -406,13 +295,10 @@ MODULE FAST_Types TYPE(IceD_ConstraintStateType) , DIMENSION(:,:), ALLOCATABLE :: z !< Constraint states [-] TYPE(IceD_OtherStateType) , DIMENSION(:,:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(IceD_ParameterType) , DIMENSION(:), ALLOCATABLE :: p !< Parameters [-] - TYPE(IceD_InputType) , DIMENSION(:), ALLOCATABLE :: u !< System inputs [-] TYPE(IceD_OutputType) , DIMENSION(:), ALLOCATABLE :: y !< System outputs [-] TYPE(IceD_MiscVarType) , DIMENSION(:), ALLOCATABLE :: m !< Misc/optimization variables [-] TYPE(IceD_InputType) , DIMENSION(:,:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(IceD_InputType) , DIMENSION(:,:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:,:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:,:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE IceDyn_Data ! ======================= ! ========= BeamDyn_Data ======= @@ -422,87 +308,62 @@ MODULE FAST_Types TYPE(BD_ConstraintStateType) , DIMENSION(:,:), ALLOCATABLE :: z !< Constraint states [-] TYPE(BD_OtherStateType) , DIMENSION(:,:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(BD_ParameterType) , DIMENSION(:), ALLOCATABLE :: p !< Parameters [-] - TYPE(BD_InputType) , DIMENSION(:), ALLOCATABLE :: u !< System inputs [-] TYPE(BD_OutputType) , DIMENSION(:), ALLOCATABLE :: y !< System outputs [-] TYPE(BD_MiscVarType) , DIMENSION(:), ALLOCATABLE :: m !< Misc/optimization variables [-] - TYPE(BD_OutputType) , DIMENSION(:,:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(BD_OutputType) , DIMENSION(:), ALLOCATABLE :: y_interp !< interpolated system outputs for CalcSteady [-] TYPE(BD_InputType) , DIMENSION(:,:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(BD_InputType) , DIMENSION(:,:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:,:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:,:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE BeamDyn_Data ! ======================= ! ========= ElastoDyn_Data ======= TYPE, PUBLIC :: ElastoDyn_Data - TYPE(ED_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(ED_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(ED_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(ED_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] - TYPE(ED_ParameterType) :: p !< Parameters [-] - TYPE(ED_InputType) :: u !< System inputs [-] - TYPE(ED_OutputType) :: y !< System outputs [-] - TYPE(ED_MiscVarType) :: m !< Misc (optimization) variables not associated with time [-] - TYPE(ED_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(ED_OutputType) , DIMENSION(:), ALLOCATABLE :: Output_bak !< Backup Array of outputs associated with InputTimes [-] - TYPE(ED_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] - TYPE(ED_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(ED_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] + TYPE(ED_ContinuousStateType) , DIMENSION(:,:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(ED_DiscreteStateType) , DIMENSION(:,:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(ED_ConstraintStateType) , DIMENSION(:,:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(ED_OtherStateType) , DIMENSION(:,:), ALLOCATABLE :: OtherSt !< Other states [-] + TYPE(ED_ParameterType) , DIMENSION(:), ALLOCATABLE :: p !< Parameters [-] + TYPE(ED_OutputType) , DIMENSION(:), ALLOCATABLE :: y !< System outputs [-] + TYPE(ED_MiscVarType) , DIMENSION(:), ALLOCATABLE :: m !< Misc (optimization) variables not associated with time [-] + TYPE(ED_InputType) , DIMENSION(:,:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] + REAL(DbKi) , DIMENSION(:,:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] END TYPE ElastoDyn_Data ! ======================= ! ========= SED_Data ======= TYPE, PUBLIC :: SED_Data - TYPE(SED_ContinuousStateType) , DIMENSION(1:2) :: x !< Continuous states [-] - TYPE(SED_DiscreteStateType) , DIMENSION(1:2) :: xd !< Discrete states [-] - TYPE(SED_ConstraintStateType) , DIMENSION(1:2) :: z !< Constraint states [-] - TYPE(SED_OtherStateType) , DIMENSION(1:2) :: OtherSt !< Other states [-] + TYPE(SED_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(SED_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(SED_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(SED_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(SED_ParameterType) :: p !< Parameters [-] - TYPE(SED_InputType) :: u !< System inputs [-] TYPE(SED_OutputType) :: y !< System outputs [-] TYPE(SED_MiscVarType) :: m !< Misc (optimization) variables not associated with time [-] - TYPE(SED_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(SED_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] TYPE(SED_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] END TYPE SED_Data ! ======================= ! ========= ServoDyn_Data ======= TYPE, PUBLIC :: ServoDyn_Data - TYPE(SrvD_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(SrvD_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(SrvD_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(SrvD_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] - TYPE(SrvD_ParameterType) :: p !< Parameters [-] - TYPE(SrvD_InputType) :: u !< System inputs [-] - TYPE(SrvD_OutputType) :: y !< System outputs [-] - TYPE(SrvD_MiscVarType) :: m !< Misc (optimization) variables not associated with time [-] - TYPE(SrvD_MiscVarType) :: m_bak !< Backup Misc (optimization) variables not associated with time [-] - TYPE(SrvD_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(SrvD_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] - TYPE(SrvD_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(SrvD_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] + TYPE(SrvD_ContinuousStateType) , DIMENSION(:,:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(SrvD_DiscreteStateType) , DIMENSION(:,:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(SrvD_ConstraintStateType) , DIMENSION(:,:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(SrvD_OtherStateType) , DIMENSION(:,:), ALLOCATABLE :: OtherSt !< Other states [-] + TYPE(SrvD_ParameterType) , DIMENSION(:), ALLOCATABLE :: p !< Parameters [-] + TYPE(SrvD_OutputType) , DIMENSION(:), ALLOCATABLE :: y !< System outputs [-] + TYPE(SrvD_MiscVarType) , DIMENSION(:), ALLOCATABLE :: m !< Misc (optimization) variables not associated with time [-] + TYPE(SrvD_InputType) , DIMENSION(:,:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] + REAL(DbKi) , DIMENSION(:,:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] END TYPE ServoDyn_Data ! ======================= ! ========= AeroDyn_Data ======= TYPE, PUBLIC :: AeroDyn_Data - TYPE(AD_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(AD_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(AD_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(AD_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(AD_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(AD_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(AD_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(AD_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(AD_ParameterType) :: p !< Parameters [-] - TYPE(AD_InputType) :: u !< System inputs [-] TYPE(AD_OutputType) :: y !< System outputs [-] TYPE(AD_MiscVarType) :: m !< Misc/optimization variables [-] - TYPE(AD_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(AD_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] TYPE(AD_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(AD_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE AeroDyn_Data ! ======================= ! ========= ExtLoads_Data ======= @@ -520,36 +381,28 @@ MODULE FAST_Types ! ======================= ! ========= AeroDisk_Data ======= TYPE, PUBLIC :: AeroDisk_Data - TYPE(ADsk_ContinuousStateType) , DIMENSION(1:2) :: x !< Continuous states [-] - TYPE(ADsk_DiscreteStateType) , DIMENSION(1:2) :: xd !< Discrete states [-] - TYPE(ADsk_ConstraintStateType) , DIMENSION(1:2) :: z !< Constraint states [-] - TYPE(ADsk_OtherStateType) , DIMENSION(1:2) :: OtherSt !< Other states [-] + TYPE(ADsk_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(ADsk_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(ADsk_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(ADsk_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(ADsk_ParameterType) :: p !< Parameters [-] - TYPE(ADsk_InputType) :: u !< System inputs [-] TYPE(ADsk_OutputType) :: y !< System outputs [-] TYPE(ADsk_MiscVarType) :: m !< Misc/optimization variables [-] - TYPE(ADsk_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(ADsk_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] TYPE(ADsk_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] END TYPE AeroDisk_Data ! ======================= ! ========= InflowWind_Data ======= TYPE, PUBLIC :: InflowWind_Data - TYPE(InflowWind_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(InflowWind_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(InflowWind_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(InflowWind_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(InflowWind_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(InflowWind_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(InflowWind_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(InflowWind_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(InflowWind_ParameterType) :: p !< Parameters [-] - TYPE(InflowWind_InputType) :: u !< System inputs [-] TYPE(InflowWind_OutputType) :: y !< System outputs [-] TYPE(InflowWind_MiscVarType) :: m !< Misc/optimization variables [-] - TYPE(InflowWind_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(InflowWind_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] TYPE(InflowWind_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(InflowWind_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE InflowWind_Data ! ======================= ! ========= ExternalInflow_Data ======= @@ -562,242 +415,139 @@ MODULE FAST_Types ! ======================= ! ========= SubDyn_Data ======= TYPE, PUBLIC :: SubDyn_Data - TYPE(SD_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(SD_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(SD_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(SD_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(SD_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(SD_ContinuousStateType) :: dxdt !< Continuous state derivatives [-] + TYPE(SD_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(SD_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(SD_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(SD_ParameterType) :: p !< Parameters [-] - TYPE(SD_InputType) :: u !< System inputs [-] TYPE(SD_OutputType) :: y !< System outputs [-] TYPE(SD_MiscVarType) :: m !< Misc/optimization variables [-] TYPE(SD_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(SD_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] - TYPE(SD_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(SD_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE SubDyn_Data ! ======================= +! ========= SoilDyn_Data ======= + TYPE, PUBLIC :: SoilDyn_Data + TYPE(SlD_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(SlD_ContinuousStateType) :: dxdt !< Continuous state derivatives [-] + TYPE(SlD_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(SlD_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(SlD_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] + TYPE(SlD_ParameterType) :: p !< Parameters [-] + TYPE(SlD_InputType) :: u !< System inputs [-] + TYPE(SlD_OutputType) :: y !< System outputs [-] + TYPE(SlD_MiscVarType) :: m !< Misc/optimization variables [-] + TYPE(SlD_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] + REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] + END TYPE SoilDyn_Data +! ======================= ! ========= ExtPtfm_Data ======= TYPE, PUBLIC :: ExtPtfm_Data - TYPE(ExtPtfm_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(ExtPtfm_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(ExtPtfm_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(ExtPtfm_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(ExtPtfm_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(ExtPtfm_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(ExtPtfm_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(ExtPtfm_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(ExtPtfm_ParameterType) :: p !< Parameters [-] - TYPE(ExtPtfm_InputType) :: u !< System inputs [-] TYPE(ExtPtfm_OutputType) :: y !< System outputs [-] TYPE(ExtPtfm_MiscVarType) :: m !< Misc/optimization variables [-] TYPE(ExtPtfm_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(ExtPtfm_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE ExtPtfm_Data ! ======================= ! ========= SeaState_Data ======= TYPE, PUBLIC :: SeaState_Data - TYPE(SeaSt_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(SeaSt_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(SeaSt_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(SeaSt_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(SeaSt_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(SeaSt_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(SeaSt_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(SeaSt_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(SeaSt_ParameterType) :: p !< Parameters [-] - TYPE(SeaSt_InputType) :: u !< System inputs [-] TYPE(SeaSt_OutputType) :: y !< System outputs [-] TYPE(SeaSt_MiscVarType) :: m !< Misc/optimization variables [-] TYPE(SeaSt_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(SeaSt_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] - TYPE(SeaSt_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(SeaSt_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE SeaState_Data ! ======================= ! ========= HydroDyn_Data ======= TYPE, PUBLIC :: HydroDyn_Data - TYPE(HydroDyn_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(HydroDyn_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(HydroDyn_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(HydroDyn_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(HydroDyn_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(HydroDyn_ContinuousStateType) :: dxdt !< Continuous state derivatives [-] + TYPE(HydroDyn_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(HydroDyn_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(HydroDyn_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(HydroDyn_ParameterType) :: p !< Parameters [-] - TYPE(HydroDyn_InputType) :: u !< System inputs [-] TYPE(HydroDyn_OutputType) :: y !< System outputs [-] TYPE(HydroDyn_MiscVarType) :: m !< Misc/optimization variables [-] - TYPE(HydroDyn_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(HydroDyn_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] TYPE(HydroDyn_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(HydroDyn_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE HydroDyn_Data ! ======================= ! ========= IceFloe_Data ======= TYPE, PUBLIC :: IceFloe_Data - TYPE(IceFloe_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(IceFloe_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(IceFloe_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(IceFloe_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(IceFloe_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(IceFloe_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(IceFloe_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(IceFloe_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(IceFloe_ParameterType) :: p !< Parameters [-] - TYPE(IceFloe_InputType) :: u !< System inputs [-] TYPE(IceFloe_OutputType) :: y !< System outputs [-] TYPE(IceFloe_MiscVarType) :: m !< Misc/optimization variables [-] TYPE(IceFloe_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(IceFloe_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE IceFloe_Data ! ======================= ! ========= MAP_Data ======= TYPE, PUBLIC :: MAP_Data - TYPE(MAP_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(MAP_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(MAP_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] + TYPE(MAP_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(MAP_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(MAP_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] TYPE(MAP_OtherStateType) :: OtherSt !< Other/optimization states [-] TYPE(MAP_ParameterType) :: p !< Parameters [-] - TYPE(MAP_InputType) :: u !< System inputs [-] TYPE(MAP_OutputType) :: y !< System outputs [-] + TYPE(MAP_MiscVarType) :: m !< Misc/optimization variables [-] TYPE(MAP_OtherStateType) :: OtherSt_old !< Other/optimization states (copied for the case of subcycling) [-] - TYPE(MAP_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(MAP_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] TYPE(MAP_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(MAP_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE MAP_Data ! ======================= ! ========= FEAMooring_Data ======= TYPE, PUBLIC :: FEAMooring_Data - TYPE(FEAM_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(FEAM_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(FEAM_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(FEAM_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(FEAM_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(FEAM_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(FEAM_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(FEAM_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(FEAM_ParameterType) :: p !< Parameters [-] - TYPE(FEAM_InputType) :: u !< System inputs [-] TYPE(FEAM_OutputType) :: y !< System outputs [-] TYPE(FEAM_MiscVarType) :: m !< Misc/optimization variables [-] TYPE(FEAM_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(FEAM_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE FEAMooring_Data ! ======================= ! ========= MoorDyn_Data ======= TYPE, PUBLIC :: MoorDyn_Data - TYPE(MD_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(MD_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(MD_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(MD_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(MD_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(MD_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(MD_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(MD_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(MD_ParameterType) :: p !< Parameters [-] - TYPE(MD_InputType) :: u !< System inputs [-] TYPE(MD_OutputType) :: y !< System outputs [-] TYPE(MD_MiscVarType) :: m !< Misc/optimization variables [-] - TYPE(MD_OutputType) , DIMENSION(:), ALLOCATABLE :: Output !< Array of outputs associated with CalcSteady Azimuths [-] - TYPE(MD_OutputType) :: y_interp !< interpolated system outputs for CalcSteady [-] TYPE(MD_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(MD_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE MoorDyn_Data ! ======================= ! ========= OrcaFlex_Data ======= TYPE, PUBLIC :: OrcaFlex_Data - TYPE(Orca_ContinuousStateType) , DIMENSION(1:NumStateTimes) :: x !< Continuous states [-] - TYPE(Orca_DiscreteStateType) , DIMENSION(1:NumStateTimes) :: xd !< Discrete states [-] - TYPE(Orca_ConstraintStateType) , DIMENSION(1:NumStateTimes) :: z !< Constraint states [-] - TYPE(Orca_OtherStateType) , DIMENSION(1:NumStateTimes) :: OtherSt !< Other states [-] + TYPE(Orca_ContinuousStateType) , DIMENSION(:), ALLOCATABLE :: x !< Continuous states [-] + TYPE(Orca_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: xd !< Discrete states [-] + TYPE(Orca_ConstraintStateType) , DIMENSION(:), ALLOCATABLE :: z !< Constraint states [-] + TYPE(Orca_OtherStateType) , DIMENSION(:), ALLOCATABLE :: OtherSt !< Other states [-] TYPE(Orca_ParameterType) :: p !< Parameters [-] - TYPE(Orca_InputType) :: u !< System inputs [-] TYPE(Orca_OutputType) :: y !< System outputs [-] TYPE(Orca_MiscVarType) :: m !< Misc/optimization variables [-] TYPE(Orca_InputType) , DIMENSION(:), ALLOCATABLE :: Input !< Array of inputs associated with InputTimes [-] - TYPE(Orca_InputType) , DIMENSION(:), ALLOCATABLE :: Input_Saved !< Backup Array of inputs associated with InputTimes [-] REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes !< Array of times associated with Input Array [-] - REAL(DbKi) , DIMENSION(:), ALLOCATABLE :: InputTimes_Saved !< Backup Array of times associated with Input Array [-] END TYPE OrcaFlex_Data ! ======================= -! ========= FAST_ModuleMapType ======= - TYPE, PUBLIC :: FAST_ModuleMapType - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: ED_P_2_BD_P !< Map ElastoDyn BladeRootMotion meshes to BeamDyn RootMotion point meshes [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: BD_P_2_ED_P !< Map BeamDyn ReactionForce loads point meshes to ElastoDyn HubPtLoad point mesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: ED_P_2_BD_P_Hub !< ElastoDyn hub to BeamDyn for hub orientation necessary for pitch actuator [-] - TYPE(MeshMapType) :: ED_P_2_HD_PRP_P !< Map ElastoDyn PlatformPtMesh to HydroDyn platform reference Point [-] - TYPE(MeshMapType) :: SubStructure_2_HD_W_P !< Map ElastoDyn PlatformPtMesh or SubDyn y2Mesh to HydroDyn WAMIT Point [-] - TYPE(MeshMapType) :: HD_W_P_2_SubStructure !< Map HydroDyn WAMIT Point from y%WAMITMesh to ElastoDyn PlatformPtMesh or SD LMesh [-] - TYPE(MeshMapType) :: SubStructure_2_HD_M_P !< Map ElastoDyn PlatformPtMesh or SubDyn y2Mesh to HydroDyn Morison Point [-] - TYPE(MeshMapType) :: HD_M_P_2_SubStructure !< Map HydroDyn Morison Point to ElastoDyn PlatformPtMesh or SD LMesh [-] - TYPE(MeshMapType) :: Structure_2_Mooring !< Map structural SD (y3Mesh)/ED to MAP/FEAM/MoorDyn/OrcaFlex point mesh [Motions] - TYPE(MeshMapType) :: Mooring_2_Structure !< Map FEAM/MAP/MoorDyn/OrcaFlex mesh to SD (LMesh)/ED (PlatformPtMesh)/ExtPtfm mesh [Loads] - TYPE(MeshMapType) :: ED_P_2_SD_TP !< Map ElastoDyn PlatformPtMesh to SubDyn transition-piece point mesh [-] - TYPE(MeshMapType) :: SD_TP_2_ED_P !< Map SubDyn transition-piece point mesh to ElastoDyn PlatformPtMesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: ED_P_2_NStC_P_N !< Map ElastoDyn nacelle point mesh to ServoDyn/NStC point mesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: NStC_P_2_ED_P_N !< Map ServoDyn/NStC nacelle point mesh to ElastoDyn point mesh on the nacelle [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: ED_L_2_TStC_P_T !< Map ElastoDyn tower line2 mesh to ServoDyn/TStC point mesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: TStC_P_2_ED_P_T !< Map ServoDyn/TStC tower point mesh to ElastoDyn point load mesh on the tower [-] - 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 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 [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: BDED_L_2_AD_L_B !< Map ElastoDyn BladeLn2Mesh point meshes OR BeamDyn BldMotion line2 meshes to AeroDyn14 InputMarkers OR AeroDyn BladeMotion line2 meshes [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: AD_L_2_BDED_B !< Map AeroDyn14 InputMarkers or AeroDyn BladeLoad line2 meshes to ElastoDyn BladePtLoad point meshes or BeamDyn BldMotion line2 meshes [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: BD_L_2_BD_L !< Map BeamDyn BldMotion output meshes to locations on the BD input DistrLoad mesh stored in MeshMapType%y_BD_BldMotion_4Loads (BD input and output meshes are not siblings and in fact have nodes at different locations [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: SED_P_2_AD_L_B !< Map Simplified-ElastoDyn BladeRoot point meshes to rigid AeroDyn BladeMotion line2 meshes [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: SED_P_2_AD_P_R !< Map Simplified-ElastoDyn BladeRootMotion point meshes to AeroDyn BladeRootMotion point meshes [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: AD_L_2_SED_P !< Map AeroDyn blade load output mesh to Simplified-ElastoDyn Hub point mesh [-] - TYPE(MeshMapType) :: ED_P_2_AD_P_N !< Map ElastoDyn Nacelle point motion mesh to AeroDyn Nacelle point motion mesh [-] - TYPE(MeshMapType) :: AD_P_2_ED_P_N !< Map AeroDyn Nacelle point load mesh to ElastoDyn nacelle point load mesh [-] - TYPE(MeshMapType) :: ED_P_2_AD_P_TF !< Map ElastoDyn TailFin CM point motion mesh to AeroDyn TailFin ref point motion mesh [-] - TYPE(MeshMapType) :: AD_P_2_ED_P_TF !< Map AeroDyn TailFin ref point load mesh to ElastoDyn TailFin CM point load mesh [-] - TYPE(MeshMapType) :: ED_L_2_AD_L_T !< Map ElastoDyn TowerLn2Mesh line2 mesh to AeroDyn14 Twr_InputMarkers or AeroDyn TowerMotion line2 mesh [-] - TYPE(MeshMapType) :: AD_L_2_ED_P_T !< Map AeroDyn14 Twr_InputMarkers or AeroDyn TowerLoad line2 mesh to ElastoDyn TowerPtLoads point mesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: ED_P_2_AD_P_R !< Map ElastoDyn BladeRootMotion point meshes to AeroDyn BladeRootMotion point meshes [-] - TYPE(MeshMapType) :: ED_P_2_AD_P_H !< Map ElastoDyn HubPtMotion point mesh to AeroDyn HubMotion point mesh [-] - TYPE(MeshMapType) :: ADsk_P_2_ED_P_H !< Map AeroDisk point load mesh to ElastoDyn hub point load mesh [-] - TYPE(MeshMapType) :: ED_P_2_ADsk_P_H !< Map ElastoDyn HubPtMotion point mesh to AeroDisk HubMotion point mesh [-] - TYPE(MeshMapType) :: SED_P_2_AD_P_N !< Map Simplified-ElastoDyn Nacelle point motion mesh to AeroDyn Nacelle point motion mesh [-] - TYPE(MeshMapType) :: SED_L_2_AD_L_T !< Map Simplified-ElastoDyn TowerLn2Mesh line2 mesh to AeroDyn TowerMotion line2 mesh [-] - TYPE(MeshMapType) :: SED_P_2_AD_P_H !< Map Simplified-ElastoDyn HubPtMotion point mesh to AeroDyn HubMotion point mesh [-] - TYPE(MeshMapType) :: ADsk_P_2_SED_P_H !< Map AeroDisk point load mesh to Simplfied-ElastoDyn hub point load mesh [-] - TYPE(MeshMapType) :: SED_P_2_ADsk_P_H !< Map Simplified-ElastoDyn HubPtMotion point mesh to AeroDisk HubMotion point mesh [-] - TYPE(MeshMapType) :: AD_P_2_ED_P_H !< Map AeroDyn HubLoad point mesh to ElastoDyn HubPtLoad point mesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: BDED_L_2_ExtLd_P_B !< Map ElastoDyn/BeamDyn BladeLn2Mesh point meshes OR BeamDyn BldMotion line2 meshes to ExtLoads point meshes [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: ExtLd_P_2_BDED_B !< Map ExtLoads at points to ElastoDyn BladePtLoad point meshes or BeamDyn BldMotion line2 meshes [-] - TYPE(MeshMapType) :: ED_L_2_ExtLd_P_T !< Map ElastoDyn TowerLn2Mesh line2 mesh to ExtLoads point mesh [-] - TYPE(MeshMapType) :: ExtLd_P_2_ED_P_T !< Map ExtLoads TowerLoad point mesh to ElastoDyn TowerPtLoads point mesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: ED_P_2_ExtLd_P_R !< Map ElastoDyn BladeRootMotion point meshes to ExtLoads BladeRootMotion point meshes [-] - TYPE(MeshMapType) :: ED_P_2_ExtLd_P_H !< Map ElastoDyn HubPtMotion point mesh to ExtLoads HubMotion point mesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: AD_L_2_ExtLd_B !< Map AeroDyn line loads on blades to ExtLoads point loads [-] - TYPE(MeshMapType) :: AD_L_2_ExtLd_T !< Map AeroDyn line loads on tower to ExtKoads point loads [-] - TYPE(MeshMapType) :: IceF_P_2_SD_P !< Map IceFloe point mesh to SubDyn LMesh point mesh [-] - TYPE(MeshMapType) :: SDy3_P_2_IceF_P !< Map SubDyn y3Mesh point mesh to IceFloe point mesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: IceD_P_2_SD_P !< Map IceDyn point mesh to SubDyn LMesh point mesh [-] - TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: SDy3_P_2_IceD_P !< Map SubDyn y3Mesh point mesh to IceDyn point mesh [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Jacobian_Opt1 !< Stored Jacobian in ED_HD_InputOutputSolve or FullOpt1_InputOutputSolve [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: Jacobian_pivot !< Pivot array used for LU decomposition of Jacobian_Opt1 [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] - TYPE(MeshType) :: u_ED_NacelleLoads !< copy of ED input mesh [-] - TYPE(MeshType) :: SubstructureLoads_Tmp !< copy of substructure loads input mesh (ED or SD) [-] - TYPE(MeshType) :: SubstructureLoads_Tmp2 !< copy of substructure loads input mesh (ED or SD, used only for temporary storage) [-] - TYPE(MeshType) :: PlatformLoads_Tmp !< copy of platform loads input mesh (ED) [-] - TYPE(MeshType) :: PlatformLoads_Tmp2 !< copy of platform loads input mesh (ED, used only for temporary storage) [-] - TYPE(MeshType) :: SubstructureLoads_Tmp_Farm !< copy of substructure mesh used to store loads from farm-level MD [-] - TYPE(MeshType) :: u_ED_TowerPtloads !< copy of ED input mesh [-] - TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: u_ED_BladePtLoads !< copy of ED input mesh [-] - TYPE(MeshType) :: u_SD_TPMesh !< copy of SD input mesh [-] - TYPE(MeshType) :: u_HD_M_Mesh !< copy of HD morison input mesh [-] - TYPE(MeshType) :: u_HD_W_Mesh !< copy of HD wamit input mesh [-] - TYPE(MeshType) :: u_ED_HubPtLoad !< copy of ED input mesh [-] - TYPE(MeshType) :: u_ED_HubPtLoad_2 !< copy of ED input mesh [-] - TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: u_BD_RootMotion !< copy of BD input meshes [-] - TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: y_BD_BldMotion_4Loads !< BD blade motion output at locations on DistrLoad input meshes [-] - TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: u_BD_Distrload !< copy of BD DistrLoad input meshes [-] - TYPE(MeshType) :: u_Orca_PtfmMesh !< copy of Orca PtfmMesh input mesh [-] - TYPE(MeshType) :: u_ExtPtfm_PtfmMesh !< copy of ExtPtfm_MCKF PtfmMesh input mesh [-] - TYPE(MeshType) :: u_SED_HubPtLoad !< copy of SED input mesh [-] - REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: HubOrient !< Orientation matrix to translate results from blade 1 to remaining blades in aeromaps [(-)] - END TYPE FAST_ModuleMapType -! ======================= ! ========= FAST_ExternInputType ======= TYPE, PUBLIC :: FAST_ExternInputType REAL(ReKi) :: GenTrq = 0.0_ReKi !< generator torque input from Simulink/Labview [-] @@ -815,13 +565,11 @@ MODULE FAST_Types TYPE, PUBLIC :: FAST_MiscVarType REAL(DbKi) :: TiLstPrn = 0.0_R8Ki !< The simulation time of the last print (to file) [(s)] REAL(DbKi) :: t_global = 0.0_R8Ki !< Current simulation time (for global/FAST simulation) [(s)] - REAL(DbKi) :: NextJacCalcTime = 0.0_R8Ki !< Time between calculating Jacobians in the HD-ED and SD-ED simulations [(s)] REAL(ReKi) :: PrevClockTime = 0.0_ReKi !< Clock time at start of simulation in seconds [(s)] REAL(ReKi) :: UsrTime1 = 0.0_ReKi !< User CPU time for simulation initialization [(s)] REAL(ReKi) :: UsrTime2 = 0.0_ReKi !< User CPU time for simulation (without initialization) [(s)] INTEGER(IntKi) , DIMENSION(1:8) :: StrtTime = 0_IntKi !< Start time of simulation (including initialization) [-] INTEGER(IntKi) , DIMENSION(1:8) :: SimStrtTime = 0_IntKi !< Start time of simulation (after initialization) [-] - LOGICAL :: calcJacobian = .false. !< Should we calculate Jacobians in Option 1? [(flag)] TYPE(FAST_ExternInputType) :: ExternInput !< external input values [-] TYPE(FAST_MiscLinType) :: Lin !< misc data for linearization analysis [-] END TYPE FAST_MiscVarType @@ -829,13 +577,13 @@ MODULE FAST_Types ! ========= FAST_InitData ======= TYPE, PUBLIC :: FAST_InitData TYPE(ED_InitInputType) :: InData_ED !< ED Initialization input data [-] - TYPE(ED_InitOutputType) :: OutData_ED !< ED Initialization output data [-] + TYPE(ED_InitOutputType) , DIMENSION(:), ALLOCATABLE :: OutData_ED !< ED Initialization output data [-] TYPE(SED_InitInputType) :: InData_SED !< SED Initialization input data [-] TYPE(SED_InitOutputType) :: OutData_SED !< SED Initialization output data [-] TYPE(BD_InitInputType) :: InData_BD !< BD Initialization input data [-] TYPE(BD_InitOutputType) , DIMENSION(:), ALLOCATABLE :: OutData_BD !< BD Initialization output data [-] TYPE(SrvD_InitInputType) :: InData_SrvD !< SrvD Initialization input data [-] - TYPE(SrvD_InitOutputType) :: OutData_SrvD !< SrvD Initialization output data [-] + TYPE(SrvD_InitOutputType) , DIMENSION(:), ALLOCATABLE :: OutData_SrvD !< SrvD Initialization output data [-] TYPE(AD_InitInputType) :: InData_AD !< AD Initialization input data [-] TYPE(AD_InitOutputType) :: OutData_AD !< AD Initialization output data [-] TYPE(ADsk_InitInputType) :: InData_ADsk !< ADsk Initialization input data [-] @@ -866,6 +614,8 @@ MODULE FAST_Types TYPE(IceFloe_InitOutputType) :: OutData_IceF !< IceF Initialization output data [-] TYPE(IceD_InitInputType) :: InData_IceD !< IceD Initialization input data [-] TYPE(IceD_InitOutputType) :: OutData_IceD !< IceD Initialization output data (each instance will have the same output channels) [-] + TYPE(SlD_InitInputType) :: InData_SlD !< SlD Initialization input data [-] + TYPE(SlD_InitOutputType) :: OutData_SlD !< SlD Initialization output data [-] END TYPE FAST_InitData ! ======================= ! ========= FAST_ExternInitType ======= @@ -895,7 +645,9 @@ MODULE FAST_Types TYPE(FAST_ParameterType) :: p_FAST !< Parameters for the glue code [-] TYPE(FAST_OutputFileType) :: y_FAST !< Output variables for the glue code [-] TYPE(FAST_MiscVarType) :: m_FAST !< Miscellaneous variables [-] - TYPE(FAST_ModuleMapType) :: MeshMapData !< Data for mapping between modules [-] + TYPE(Glue_ParameterType) :: p_Glue !< Parameters for the glue code [-] + TYPE(Glue_OutputFileType) :: y_Glue !< Output variables for the glue code [-] + TYPE(Glue_MiscVarType) :: m_Glue !< Miscellaneous variables [-] TYPE(ElastoDyn_Data) :: ED !< Data for the ElastoDyn module [-] TYPE(SED_Data) :: SED !< Data for the Simplified-ElastoDyn module [-] TYPE(BeamDyn_Data) :: BD !< Data for the BeamDyn module [-] @@ -908,6 +660,7 @@ MODULE FAST_Types TYPE(SeaState_Data) :: SeaSt !< Data for the SeaState module [-] TYPE(HydroDyn_Data) :: HD !< Data for the HydroDyn module [-] TYPE(SubDyn_Data) :: SD !< Data for the SubDyn module [-] + TYPE(SoilDyn_Data) :: SlD !< Data for the SoilDyn module [-] TYPE(MAP_Data) :: MAP !< Data for the MAP (Mooring Analysis Program) module [-] TYPE(FEAMooring_Data) :: FEAM !< Data for the FEAMooring module [-] TYPE(MoorDyn_Data) :: MD !< Data for the MoorDyn module [-] @@ -917,7 +670,8 @@ MODULE FAST_Types TYPE(ExtPtfm_Data) :: ExtPtfm !< Data for the ExtPtfm (external platform loading) module [-] END TYPE FAST_TurbineType ! ======================= -CONTAINS + +contains subroutine FAST_CopyVTK_BLSurfaceType(SrcVTK_BLSurfaceTypeData, DstVTK_BLSurfaceTypeData, CtrlCode, ErrStat, ErrMsg) type(FAST_VTK_BLSurfaceType), intent(in) :: SrcVTK_BLSurfaceTypeData @@ -1184,7 +938,7 @@ subroutine FAST_CopyVTK_ModeShapeType(SrcVTK_ModeShapeTypeData, DstVTK_ModeShape ErrStat = ErrID_None ErrMsg = '' DstVTK_ModeShapeTypeData%CheckpointRoot = SrcVTK_ModeShapeTypeData%CheckpointRoot - DstVTK_ModeShapeTypeData%MatlabFileName = SrcVTK_ModeShapeTypeData%MatlabFileName + DstVTK_ModeShapeTypeData%DataFileName = SrcVTK_ModeShapeTypeData%DataFileName DstVTK_ModeShapeTypeData%VTKLinModes = SrcVTK_ModeShapeTypeData%VTKLinModes if (allocated(SrcVTK_ModeShapeTypeData%VTKModes)) then LB(1:1) = lbound(SrcVTK_ModeShapeTypeData%VTKModes) @@ -1297,7 +1051,7 @@ subroutine FAST_PackVTK_ModeShapeType(RF, Indata) character(*), parameter :: RoutineName = 'FAST_PackVTK_ModeShapeType' if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%CheckpointRoot) - call RegPack(RF, InData%MatlabFileName) + call RegPack(RF, InData%DataFileName) call RegPack(RF, InData%VTKLinModes) call RegPackAlloc(RF, InData%VTKModes) call RegPack(RF, InData%VTKLinTim) @@ -1321,7 +1075,7 @@ subroutine FAST_UnPackVTK_ModeShapeType(RF, OutData) logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%CheckpointRoot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%MatlabFileName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DataFileName); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VTKLinModes); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%VTKModes); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VTKLinTim); if (RegCheckErr(RF, RoutineName)) return @@ -1335,81 +1089,84 @@ subroutine FAST_UnPackVTK_ModeShapeType(RF, OutData) call RegUnpackAlloc(RF, OutData%x_eig_phase); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopySS_CaseType(SrcSS_CaseTypeData, DstSS_CaseTypeData, CtrlCode, ErrStat, ErrMsg) - type(FAST_SS_CaseType), intent(in) :: SrcSS_CaseTypeData - type(FAST_SS_CaseType), intent(inout) :: DstSS_CaseTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'FAST_CopySS_CaseType' - ErrStat = ErrID_None - ErrMsg = '' - DstSS_CaseTypeData%RotSpeed = SrcSS_CaseTypeData%RotSpeed - DstSS_CaseTypeData%TSR = SrcSS_CaseTypeData%TSR - DstSS_CaseTypeData%WindSpeed = SrcSS_CaseTypeData%WindSpeed - DstSS_CaseTypeData%Pitch = SrcSS_CaseTypeData%Pitch -end subroutine - -subroutine FAST_DestroySS_CaseType(SS_CaseTypeData, ErrStat, ErrMsg) - type(FAST_SS_CaseType), intent(inout) :: SS_CaseTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'FAST_DestroySS_CaseType' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine FAST_PackSS_CaseType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(FAST_SS_CaseType), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackSS_CaseType' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%RotSpeed) - call RegPack(RF, InData%TSR) - call RegPack(RF, InData%WindSpeed) - call RegPack(RF, InData%Pitch) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackSS_CaseType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(FAST_SS_CaseType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackSS_CaseType' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TSR); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WindSpeed); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Pitch); if (RegCheckErr(RF, RoutineName)) return -end subroutine - subroutine FAST_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) type(FAST_ParameterType), intent(in) :: SrcParamData type(FAST_ParameterType), intent(inout) :: DstParamData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'FAST_CopyParam' ErrStat = ErrID_None ErrMsg = '' DstParamData%DT = SrcParamData%DT - DstParamData%DT_module = SrcParamData%DT_module - DstParamData%n_substeps = SrcParamData%n_substeps DstParamData%n_TMax_m1 = SrcParamData%n_TMax_m1 DstParamData%TMax = SrcParamData%TMax DstParamData%InterpOrder = SrcParamData%InterpOrder DstParamData%NumCrctn = SrcParamData%NumCrctn DstParamData%KMax = SrcParamData%KMax DstParamData%numIceLegs = SrcParamData%numIceLegs - DstParamData%nBeams = SrcParamData%nBeams + if (allocated(SrcParamData%RotNumBld)) then + LB(1:1) = lbound(SrcParamData%RotNumBld) + UB(1:1) = ubound(SrcParamData%RotNumBld) + if (.not. allocated(DstParamData%RotNumBld)) then + allocate(DstParamData%RotNumBld(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%RotNumBld.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%RotNumBld = SrcParamData%RotNumBld + end if + if (allocated(SrcParamData%MirrorRotor)) then + LB(1:1) = lbound(SrcParamData%MirrorRotor) + UB(1:1) = ubound(SrcParamData%MirrorRotor) + if (.not. allocated(DstParamData%MirrorRotor)) then + allocate(DstParamData%MirrorRotor(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MirrorRotor.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%MirrorRotor = SrcParamData%MirrorRotor + end if + DstParamData%NumBD = SrcParamData%NumBD + if (allocated(SrcParamData%BDRotMap)) then + LB(1:1) = lbound(SrcParamData%BDRotMap) + UB(1:1) = ubound(SrcParamData%BDRotMap) + if (.not. allocated(DstParamData%BDRotMap)) then + allocate(DstParamData%BDRotMap(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BDRotMap.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%BDRotMap = SrcParamData%BDRotMap + end if + if (allocated(SrcParamData%BDBldMap)) then + LB(1:1) = lbound(SrcParamData%BDBldMap) + UB(1:1) = ubound(SrcParamData%BDBldMap) + if (.not. allocated(DstParamData%BDBldMap)) then + allocate(DstParamData%BDBldMap(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BDBldMap.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%BDBldMap = SrcParamData%BDBldMap + end if DstParamData%BD_OutputSibling = SrcParamData%BD_OutputSibling - DstParamData%ModuleInitialized = SrcParamData%ModuleInitialized + DstParamData%ModCoupling = SrcParamData%ModCoupling + DstParamData%RhoInf = SrcParamData%RhoInf + DstParamData%ConvTol = SrcParamData%ConvTol + DstParamData%MaxConvIter = SrcParamData%MaxConvIter DstParamData%DT_Ujac = SrcParamData%DT_Ujac DstParamData%UJacSclFact = SrcParamData%UJacSclFact DstParamData%SizeJac_Opt1 = SrcParamData%SizeJac_Opt1 DstParamData%SolveOption = SrcParamData%SolveOption + DstParamData%NRotors = SrcParamData%NRotors DstParamData%CompElast = SrcParamData%CompElast DstParamData%CompInflow = SrcParamData%CompInflow DstParamData%CompAero = SrcParamData%CompAero @@ -1419,6 +1176,7 @@ subroutine FAST_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%CompSub = SrcParamData%CompSub DstParamData%CompMooring = SrcParamData%CompMooring DstParamData%CompIce = SrcParamData%CompIce + DstParamData%CompSoil = SrcParamData%CompSoil DstParamData%MHK = SrcParamData%MHK DstParamData%UseDWM = SrcParamData%UseDWM DstParamData%Linearize = SrcParamData%Linearize @@ -1434,16 +1192,50 @@ subroutine FAST_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%Pvap = SrcParamData%Pvap DstParamData%WtrDpth = SrcParamData%WtrDpth DstParamData%MSL2SWL = SrcParamData%MSL2SWL - DstParamData%EDFile = SrcParamData%EDFile - DstParamData%BDBldFile = SrcParamData%BDBldFile + if (allocated(SrcParamData%EDFile)) then + LB(1:1) = lbound(SrcParamData%EDFile) + UB(1:1) = ubound(SrcParamData%EDFile) + if (.not. allocated(DstParamData%EDFile)) then + allocate(DstParamData%EDFile(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EDFile.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%EDFile = SrcParamData%EDFile + end if + if (allocated(SrcParamData%BDBldFile)) then + LB(1:2) = lbound(SrcParamData%BDBldFile) + UB(1:2) = ubound(SrcParamData%BDBldFile) + if (.not. allocated(DstParamData%BDBldFile)) then + allocate(DstParamData%BDBldFile(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BDBldFile.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%BDBldFile = SrcParamData%BDBldFile + end if + if (allocated(SrcParamData%ServoFile)) then + LB(1:1) = lbound(SrcParamData%ServoFile) + UB(1:1) = ubound(SrcParamData%ServoFile) + if (.not. allocated(DstParamData%ServoFile)) then + allocate(DstParamData%ServoFile(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ServoFile.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%ServoFile = SrcParamData%ServoFile + end if DstParamData%InflowFile = SrcParamData%InflowFile DstParamData%AeroFile = SrcParamData%AeroFile - DstParamData%ServoFile = SrcParamData%ServoFile DstParamData%SeaStFile = SrcParamData%SeaStFile DstParamData%HydroFile = SrcParamData%HydroFile DstParamData%SubFile = SrcParamData%SubFile DstParamData%MooringFile = SrcParamData%MooringFile DstParamData%IceFile = SrcParamData%IceFile + DstParamData%SoilFile = SrcParamData%SoilFile DstParamData%TStart = SrcParamData%TStart DstParamData%DT_Out = SrcParamData%DT_Out DstParamData%WrSttsTime = SrcParamData%WrSttsTime @@ -1485,9 +1277,6 @@ subroutine FAST_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%LinOutputs = SrcParamData%LinOutputs DstParamData%LinOutJac = SrcParamData%LinOutJac DstParamData%LinOutMod = SrcParamData%LinOutMod - call FAST_CopyVTK_ModeShapeType(SrcParamData%VTK_modes, DstParamData%VTK_modes, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return DstParamData%Lin_NumMods = SrcParamData%Lin_NumMods DstParamData%Lin_ModOrder = SrcParamData%Lin_ModOrder DstParamData%LinInterpOrder = SrcParamData%LinInterpOrder @@ -1546,10 +1335,29 @@ subroutine FAST_DestroyParam(ParamData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'FAST_DestroyParam' ErrStat = ErrID_None ErrMsg = '' + if (allocated(ParamData%RotNumBld)) then + deallocate(ParamData%RotNumBld) + end if + if (allocated(ParamData%MirrorRotor)) then + deallocate(ParamData%MirrorRotor) + end if + if (allocated(ParamData%BDRotMap)) then + deallocate(ParamData%BDRotMap) + end if + if (allocated(ParamData%BDBldMap)) then + deallocate(ParamData%BDBldMap) + end if + if (allocated(ParamData%EDFile)) then + deallocate(ParamData%EDFile) + end if + if (allocated(ParamData%BDBldFile)) then + deallocate(ParamData%BDBldFile) + end if + if (allocated(ParamData%ServoFile)) then + deallocate(ParamData%ServoFile) + end if call FAST_DestroyVTK_SurfaceType(ParamData%VTK_surface, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call FAST_DestroyVTK_ModeShapeType(ParamData%VTK_modes, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(ParamData%RotSpeed)) then deallocate(ParamData%RotSpeed) end if @@ -1567,21 +1375,27 @@ subroutine FAST_PackParam(RF, Indata) character(*), parameter :: RoutineName = 'FAST_PackParam' if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%DT) - call RegPack(RF, InData%DT_module) - call RegPack(RF, InData%n_substeps) call RegPack(RF, InData%n_TMax_m1) call RegPack(RF, InData%TMax) call RegPack(RF, InData%InterpOrder) call RegPack(RF, InData%NumCrctn) call RegPack(RF, InData%KMax) call RegPack(RF, InData%numIceLegs) - call RegPack(RF, InData%nBeams) + call RegPackAlloc(RF, InData%RotNumBld) + call RegPackAlloc(RF, InData%MirrorRotor) + call RegPack(RF, InData%NumBD) + call RegPackAlloc(RF, InData%BDRotMap) + call RegPackAlloc(RF, InData%BDBldMap) call RegPack(RF, InData%BD_OutputSibling) - call RegPack(RF, InData%ModuleInitialized) + call RegPack(RF, InData%ModCoupling) + call RegPack(RF, InData%RhoInf) + call RegPack(RF, InData%ConvTol) + call RegPack(RF, InData%MaxConvIter) call RegPack(RF, InData%DT_Ujac) call RegPack(RF, InData%UJacSclFact) call RegPack(RF, InData%SizeJac_Opt1) call RegPack(RF, InData%SolveOption) + call RegPack(RF, InData%NRotors) call RegPack(RF, InData%CompElast) call RegPack(RF, InData%CompInflow) call RegPack(RF, InData%CompAero) @@ -1591,6 +1405,7 @@ subroutine FAST_PackParam(RF, Indata) call RegPack(RF, InData%CompSub) call RegPack(RF, InData%CompMooring) call RegPack(RF, InData%CompIce) + call RegPack(RF, InData%CompSoil) call RegPack(RF, InData%MHK) call RegPack(RF, InData%UseDWM) call RegPack(RF, InData%Linearize) @@ -1606,16 +1421,17 @@ subroutine FAST_PackParam(RF, Indata) call RegPack(RF, InData%Pvap) call RegPack(RF, InData%WtrDpth) call RegPack(RF, InData%MSL2SWL) - call RegPack(RF, InData%EDFile) - call RegPack(RF, InData%BDBldFile) + call RegPackAlloc(RF, InData%EDFile) + call RegPackAlloc(RF, InData%BDBldFile) + call RegPackAlloc(RF, InData%ServoFile) call RegPack(RF, InData%InflowFile) call RegPack(RF, InData%AeroFile) - call RegPack(RF, InData%ServoFile) call RegPack(RF, InData%SeaStFile) call RegPack(RF, InData%HydroFile) call RegPack(RF, InData%SubFile) call RegPack(RF, InData%MooringFile) call RegPack(RF, InData%IceFile) + call RegPack(RF, InData%SoilFile) call RegPack(RF, InData%TStart) call RegPack(RF, InData%DT_Out) call RegPack(RF, InData%WrSttsTime) @@ -1655,7 +1471,6 @@ subroutine FAST_PackParam(RF, Indata) call RegPack(RF, InData%LinOutputs) call RegPack(RF, InData%LinOutJac) call RegPack(RF, InData%LinOutMod) - call FAST_PackVTK_ModeShapeType(RF, InData%VTK_modes) call RegPack(RF, InData%Lin_NumMods) call RegPack(RF, InData%Lin_ModOrder) call RegPack(RF, InData%LinInterpOrder) @@ -1677,26 +1492,32 @@ subroutine FAST_UnPackParam(RF, OutData) type(RegFile), intent(inout) :: RF type(FAST_ParameterType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'FAST_UnPackParam' - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%DT_module); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%n_substeps); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%n_TMax_m1); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TMax); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%InterpOrder); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumCrctn); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%KMax); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%numIceLegs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%nBeams); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%RotNumBld); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%MirrorRotor); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumBD); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BDRotMap); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BDBldMap); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%BD_OutputSibling); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ModuleInitialized); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ModCoupling); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RhoInf); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ConvTol); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MaxConvIter); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DT_Ujac); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UJacSclFact); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SizeJac_Opt1); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SolveOption); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NRotors); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompElast); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompInflow); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompAero); if (RegCheckErr(RF, RoutineName)) return @@ -1706,6 +1527,7 @@ subroutine FAST_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%CompSub); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompMooring); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompIce); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CompSoil); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%MHK); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UseDWM); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return @@ -1721,16 +1543,17 @@ subroutine FAST_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%Pvap); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%MSL2SWL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%EDFile); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BDBldFile); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EDFile); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BDBldFile); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%ServoFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%InflowFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%AeroFile); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ServoFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SeaStFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HydroFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SubFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%MooringFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%IceFile); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SoilFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TStart); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DT_Out); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WrSttsTime); if (RegCheckErr(RF, RoutineName)) return @@ -1770,7 +1593,6 @@ subroutine FAST_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%LinOutputs); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%LinOutJac); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%LinOutMod); if (RegCheckErr(RF, RoutineName)) return - call FAST_UnpackVTK_ModeShapeType(RF, OutData%VTK_modes) ! VTK_modes call RegUnpack(RF, OutData%Lin_NumMods); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Lin_ModOrder); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%LinInterpOrder); if (RegCheckErr(RF, RoutineName)) return @@ -1787,7328 +1609,1848 @@ subroutine FAST_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%GearBox_index); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyLinStateSave(SrcLinStateSaveData, DstLinStateSaveData, CtrlCode, ErrStat, ErrMsg) - type(FAST_LinStateSave), intent(inout) :: SrcLinStateSaveData - type(FAST_LinStateSave), intent(inout) :: DstLinStateSaveData +subroutine FAST_CopyLinFileType(SrcLinFileTypeData, DstLinFileTypeData, CtrlCode, ErrStat, ErrMsg) + type(FAST_LinFileType), intent(in) :: SrcLinFileTypeData + type(FAST_LinFileType), intent(inout) :: DstLinFileTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'FAST_CopyLinFileType' + ErrStat = ErrID_None + ErrMsg = '' + DstLinFileTypeData%RotSpeed = SrcLinFileTypeData%RotSpeed + DstLinFileTypeData%Azimuth = SrcLinFileTypeData%Azimuth + DstLinFileTypeData%WindSpeed = SrcLinFileTypeData%WindSpeed +end subroutine + +subroutine FAST_DestroyLinFileType(LinFileTypeData, ErrStat, ErrMsg) + type(FAST_LinFileType), intent(inout) :: LinFileTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'FAST_DestroyLinFileType' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine FAST_PackLinFileType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(FAST_LinFileType), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackLinFileType' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%RotSpeed) + call RegPack(RF, InData%Azimuth) + call RegPack(RF, InData%WindSpeed) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_UnPackLinFileType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(FAST_LinFileType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackLinFileType' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Azimuth); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WindSpeed); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_CopyMiscLinType(SrcMiscLinTypeData, DstMiscLinTypeData, CtrlCode, ErrStat, ErrMsg) + type(FAST_MiscLinType), intent(in) :: SrcMiscLinTypeData + type(FAST_MiscLinType), intent(inout) :: DstMiscLinTypeData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyLinStateSave' + character(*), parameter :: RoutineName = 'FAST_CopyMiscLinType' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcLinStateSaveData%x_IceD)) then - LB(1:2) = lbound(SrcLinStateSaveData%x_IceD) - UB(1:2) = ubound(SrcLinStateSaveData%x_IceD) - if (.not. allocated(DstLinStateSaveData%x_IceD)) then - allocate(DstLinStateSaveData%x_IceD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcMiscLinTypeData%LinTimes)) then + LB(1:1) = lbound(SrcMiscLinTypeData%LinTimes) + UB(1:1) = ubound(SrcMiscLinTypeData%LinTimes) + if (.not. allocated(DstMiscLinTypeData%LinTimes)) then + allocate(DstMiscLinTypeData%LinTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_IceD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%LinTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyContState(SrcLinStateSaveData%x_IceD(i1,i2), DstLinStateSaveData%x_IceD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstMiscLinTypeData%LinTimes = SrcMiscLinTypeData%LinTimes end if - if (allocated(SrcLinStateSaveData%xd_IceD)) then - LB(1:2) = lbound(SrcLinStateSaveData%xd_IceD) - UB(1:2) = ubound(SrcLinStateSaveData%xd_IceD) - if (.not. allocated(DstLinStateSaveData%xd_IceD)) then - allocate(DstLinStateSaveData%xd_IceD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + DstMiscLinTypeData%CopyOP_CtrlCode = SrcMiscLinTypeData%CopyOP_CtrlCode + if (allocated(SrcMiscLinTypeData%AzimTarget)) then + LB(1:1) = lbound(SrcMiscLinTypeData%AzimTarget) + UB(1:1) = ubound(SrcMiscLinTypeData%AzimTarget) + if (.not. allocated(DstMiscLinTypeData%AzimTarget)) then + allocate(DstMiscLinTypeData%AzimTarget(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_IceD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%AzimTarget.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyDiscState(SrcLinStateSaveData%xd_IceD(i1,i2), DstLinStateSaveData%xd_IceD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstMiscLinTypeData%AzimTarget = SrcMiscLinTypeData%AzimTarget end if - if (allocated(SrcLinStateSaveData%z_IceD)) then - LB(1:2) = lbound(SrcLinStateSaveData%z_IceD) - UB(1:2) = ubound(SrcLinStateSaveData%z_IceD) - if (.not. allocated(DstLinStateSaveData%z_IceD)) then - allocate(DstLinStateSaveData%z_IceD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + DstMiscLinTypeData%IsConverged = SrcMiscLinTypeData%IsConverged + DstMiscLinTypeData%FoundSteady = SrcMiscLinTypeData%FoundSteady + DstMiscLinTypeData%ForceLin = SrcMiscLinTypeData%ForceLin + DstMiscLinTypeData%n_rot = SrcMiscLinTypeData%n_rot + DstMiscLinTypeData%AzimIndx = SrcMiscLinTypeData%AzimIndx + DstMiscLinTypeData%NextLinTimeIndx = SrcMiscLinTypeData%NextLinTimeIndx + if (allocated(SrcMiscLinTypeData%Psi)) then + LB(1:1) = lbound(SrcMiscLinTypeData%Psi) + UB(1:1) = ubound(SrcMiscLinTypeData%Psi) + if (.not. allocated(DstMiscLinTypeData%Psi)) then + allocate(DstMiscLinTypeData%Psi(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_IceD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%Psi.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyConstrState(SrcLinStateSaveData%z_IceD(i1,i2), DstLinStateSaveData%z_IceD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstMiscLinTypeData%Psi = SrcMiscLinTypeData%Psi end if - if (allocated(SrcLinStateSaveData%OtherSt_IceD)) then - LB(1:2) = lbound(SrcLinStateSaveData%OtherSt_IceD) - UB(1:2) = ubound(SrcLinStateSaveData%OtherSt_IceD) - if (.not. allocated(DstLinStateSaveData%OtherSt_IceD)) then - allocate(DstLinStateSaveData%OtherSt_IceD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcMiscLinTypeData%y_interp)) then + LB(1:1) = lbound(SrcMiscLinTypeData%y_interp) + UB(1:1) = ubound(SrcMiscLinTypeData%y_interp) + if (.not. allocated(DstMiscLinTypeData%y_interp)) then + allocate(DstMiscLinTypeData%y_interp(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_IceD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%y_interp.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyOtherState(SrcLinStateSaveData%OtherSt_IceD(i1,i2), DstLinStateSaveData%OtherSt_IceD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstMiscLinTypeData%y_interp = SrcMiscLinTypeData%y_interp end if - if (allocated(SrcLinStateSaveData%u_IceD)) then - LB(1:2) = lbound(SrcLinStateSaveData%u_IceD) - UB(1:2) = ubound(SrcLinStateSaveData%u_IceD) - if (.not. allocated(DstLinStateSaveData%u_IceD)) then - allocate(DstLinStateSaveData%u_IceD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcMiscLinTypeData%y_ref)) then + LB(1:1) = lbound(SrcMiscLinTypeData%y_ref) + UB(1:1) = ubound(SrcMiscLinTypeData%y_ref) + if (.not. allocated(DstMiscLinTypeData%y_ref)) then + allocate(DstMiscLinTypeData%y_ref(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_IceD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%y_ref.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyInput(SrcLinStateSaveData%u_IceD(i1,i2), DstLinStateSaveData%u_IceD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstMiscLinTypeData%y_ref = SrcMiscLinTypeData%y_ref end if - if (allocated(SrcLinStateSaveData%x_BD)) then - LB(1:2) = lbound(SrcLinStateSaveData%x_BD) - UB(1:2) = ubound(SrcLinStateSaveData%x_BD) - if (.not. allocated(DstLinStateSaveData%x_BD)) then - allocate(DstLinStateSaveData%x_BD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcMiscLinTypeData%Y_prevRot)) then + LB(1:2) = lbound(SrcMiscLinTypeData%Y_prevRot) + UB(1:2) = ubound(SrcMiscLinTypeData%Y_prevRot) + if (.not. allocated(DstMiscLinTypeData%Y_prevRot)) then + allocate(DstMiscLinTypeData%Y_prevRot(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_BD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%Y_prevRot.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyContState(SrcLinStateSaveData%x_BD(i1,i2), DstLinStateSaveData%x_BD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstMiscLinTypeData%Y_prevRot = SrcMiscLinTypeData%Y_prevRot end if - if (allocated(SrcLinStateSaveData%xd_BD)) then - LB(1:2) = lbound(SrcLinStateSaveData%xd_BD) - UB(1:2) = ubound(SrcLinStateSaveData%xd_BD) - if (.not. allocated(DstLinStateSaveData%xd_BD)) then - allocate(DstLinStateSaveData%xd_BD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_BD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyDiscState(SrcLinStateSaveData%xd_BD(i1,i2), DstLinStateSaveData%xd_BD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do +end subroutine + +subroutine FAST_DestroyMiscLinType(MiscLinTypeData, ErrStat, ErrMsg) + type(FAST_MiscLinType), intent(inout) :: MiscLinTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'FAST_DestroyMiscLinType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(MiscLinTypeData%LinTimes)) then + deallocate(MiscLinTypeData%LinTimes) end if - if (allocated(SrcLinStateSaveData%z_BD)) then - LB(1:2) = lbound(SrcLinStateSaveData%z_BD) - UB(1:2) = ubound(SrcLinStateSaveData%z_BD) - if (.not. allocated(DstLinStateSaveData%z_BD)) then - allocate(DstLinStateSaveData%z_BD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_BD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyConstrState(SrcLinStateSaveData%z_BD(i1,i2), DstLinStateSaveData%z_BD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + if (allocated(MiscLinTypeData%AzimTarget)) then + deallocate(MiscLinTypeData%AzimTarget) end if - if (allocated(SrcLinStateSaveData%OtherSt_BD)) then - LB(1:2) = lbound(SrcLinStateSaveData%OtherSt_BD) - UB(1:2) = ubound(SrcLinStateSaveData%OtherSt_BD) - if (.not. allocated(DstLinStateSaveData%OtherSt_BD)) then - allocate(DstLinStateSaveData%OtherSt_BD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_BD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyOtherState(SrcLinStateSaveData%OtherSt_BD(i1,i2), DstLinStateSaveData%OtherSt_BD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcLinStateSaveData%u_BD)) then - LB(1:2) = lbound(SrcLinStateSaveData%u_BD) - UB(1:2) = ubound(SrcLinStateSaveData%u_BD) - if (.not. allocated(DstLinStateSaveData%u_BD)) then - allocate(DstLinStateSaveData%u_BD(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_BD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyInput(SrcLinStateSaveData%u_BD(i1,i2), DstLinStateSaveData%u_BD(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcLinStateSaveData%x_ED)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_ED) - UB(1:1) = ubound(SrcLinStateSaveData%x_ED) - if (.not. allocated(DstLinStateSaveData%x_ED)) then - allocate(DstLinStateSaveData%x_ED(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_ED.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ED_CopyContState(SrcLinStateSaveData%x_ED(i1), DstLinStateSaveData%x_ED(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_ED)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_ED) - UB(1:1) = ubound(SrcLinStateSaveData%xd_ED) - if (.not. allocated(DstLinStateSaveData%xd_ED)) then - allocate(DstLinStateSaveData%xd_ED(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_ED.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ED_CopyDiscState(SrcLinStateSaveData%xd_ED(i1), DstLinStateSaveData%xd_ED(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + if (allocated(MiscLinTypeData%Psi)) then + deallocate(MiscLinTypeData%Psi) end if - if (allocated(SrcLinStateSaveData%z_ED)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_ED) - UB(1:1) = ubound(SrcLinStateSaveData%z_ED) - if (.not. allocated(DstLinStateSaveData%z_ED)) then - allocate(DstLinStateSaveData%z_ED(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_ED.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ED_CopyConstrState(SrcLinStateSaveData%z_ED(i1), DstLinStateSaveData%z_ED(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + if (allocated(MiscLinTypeData%y_interp)) then + deallocate(MiscLinTypeData%y_interp) end if - if (allocated(SrcLinStateSaveData%OtherSt_ED)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_ED) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_ED) - if (.not. allocated(DstLinStateSaveData%OtherSt_ED)) then - allocate(DstLinStateSaveData%OtherSt_ED(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_ED.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ED_CopyOtherState(SrcLinStateSaveData%OtherSt_ED(i1), DstLinStateSaveData%OtherSt_ED(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + if (allocated(MiscLinTypeData%y_ref)) then + deallocate(MiscLinTypeData%y_ref) end if - if (allocated(SrcLinStateSaveData%u_ED)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_ED) - UB(1:1) = ubound(SrcLinStateSaveData%u_ED) - if (.not. allocated(DstLinStateSaveData%u_ED)) then - allocate(DstLinStateSaveData%u_ED(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_ED.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ED_CopyInput(SrcLinStateSaveData%u_ED(i1), DstLinStateSaveData%u_ED(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + if (allocated(MiscLinTypeData%Y_prevRot)) then + deallocate(MiscLinTypeData%Y_prevRot) end if - if (allocated(SrcLinStateSaveData%x_SrvD)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_SrvD) - UB(1:1) = ubound(SrcLinStateSaveData%x_SrvD) - if (.not. allocated(DstLinStateSaveData%x_SrvD)) then - allocate(DstLinStateSaveData%x_SrvD(LB(1):UB(1)), stat=ErrStat2) +end subroutine + +subroutine FAST_PackMiscLinType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(FAST_MiscLinType), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackMiscLinType' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%LinTimes) + call RegPack(RF, InData%CopyOP_CtrlCode) + call RegPackAlloc(RF, InData%AzimTarget) + call RegPack(RF, InData%IsConverged) + call RegPack(RF, InData%FoundSteady) + call RegPack(RF, InData%ForceLin) + call RegPack(RF, InData%n_rot) + call RegPack(RF, InData%AzimIndx) + call RegPack(RF, InData%NextLinTimeIndx) + call RegPackAlloc(RF, InData%Psi) + call RegPackAlloc(RF, InData%y_interp) + call RegPackAlloc(RF, InData%y_ref) + call RegPackAlloc(RF, InData%Y_prevRot) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_UnPackMiscLinType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(FAST_MiscLinType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackMiscLinType' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%LinTimes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CopyOP_CtrlCode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AzimTarget); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%IsConverged); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%FoundSteady); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ForceLin); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%n_rot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AzimIndx); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NextLinTimeIndx); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Psi); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y_interp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y_ref); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Y_prevRot); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_CopyOutputFileType(SrcOutputFileTypeData, DstOutputFileTypeData, CtrlCode, ErrStat, ErrMsg) + type(FAST_OutputFileType), intent(in) :: SrcOutputFileTypeData + type(FAST_OutputFileType), intent(inout) :: DstOutputFileTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_CopyOutputFileType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcOutputFileTypeData%TimeData)) then + LB(1:1) = lbound(SrcOutputFileTypeData%TimeData) + UB(1:1) = ubound(SrcOutputFileTypeData%TimeData) + if (.not. allocated(DstOutputFileTypeData%TimeData)) then + allocate(DstOutputFileTypeData%TimeData(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_SrvD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputFileTypeData%TimeData.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call SrvD_CopyContState(SrcLinStateSaveData%x_SrvD(i1), DstLinStateSaveData%x_SrvD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstOutputFileTypeData%TimeData = SrcOutputFileTypeData%TimeData end if - if (allocated(SrcLinStateSaveData%xd_SrvD)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_SrvD) - UB(1:1) = ubound(SrcLinStateSaveData%xd_SrvD) - if (.not. allocated(DstLinStateSaveData%xd_SrvD)) then - allocate(DstLinStateSaveData%xd_SrvD(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputFileTypeData%AllOutData)) then + LB(1:2) = lbound(SrcOutputFileTypeData%AllOutData) + UB(1:2) = ubound(SrcOutputFileTypeData%AllOutData) + if (.not. allocated(DstOutputFileTypeData%AllOutData)) then + allocate(DstOutputFileTypeData%AllOutData(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_SrvD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputFileTypeData%AllOutData.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call SrvD_CopyDiscState(SrcLinStateSaveData%xd_SrvD(i1), DstLinStateSaveData%xd_SrvD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstOutputFileTypeData%AllOutData = SrcOutputFileTypeData%AllOutData end if - if (allocated(SrcLinStateSaveData%z_SrvD)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_SrvD) - UB(1:1) = ubound(SrcLinStateSaveData%z_SrvD) - if (.not. allocated(DstLinStateSaveData%z_SrvD)) then - allocate(DstLinStateSaveData%z_SrvD(LB(1):UB(1)), stat=ErrStat2) + DstOutputFileTypeData%n_Out = SrcOutputFileTypeData%n_Out + DstOutputFileTypeData%NOutSteps = SrcOutputFileTypeData%NOutSteps + DstOutputFileTypeData%numOuts = SrcOutputFileTypeData%numOuts + DstOutputFileTypeData%UnOu = SrcOutputFileTypeData%UnOu + DstOutputFileTypeData%UnSum = SrcOutputFileTypeData%UnSum + DstOutputFileTypeData%UnGra = SrcOutputFileTypeData%UnGra + DstOutputFileTypeData%FileDescLines = SrcOutputFileTypeData%FileDescLines + if (allocated(SrcOutputFileTypeData%ChannelNames)) then + LB(1:1) = lbound(SrcOutputFileTypeData%ChannelNames) + UB(1:1) = ubound(SrcOutputFileTypeData%ChannelNames) + if (.not. allocated(DstOutputFileTypeData%ChannelNames)) then + allocate(DstOutputFileTypeData%ChannelNames(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_SrvD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputFileTypeData%ChannelNames.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call SrvD_CopyConstrState(SrcLinStateSaveData%z_SrvD(i1), DstLinStateSaveData%z_SrvD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstOutputFileTypeData%ChannelNames = SrcOutputFileTypeData%ChannelNames end if - if (allocated(SrcLinStateSaveData%OtherSt_SrvD)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_SrvD) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_SrvD) - if (.not. allocated(DstLinStateSaveData%OtherSt_SrvD)) then - allocate(DstLinStateSaveData%OtherSt_SrvD(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputFileTypeData%ChannelUnits)) then + LB(1:1) = lbound(SrcOutputFileTypeData%ChannelUnits) + UB(1:1) = ubound(SrcOutputFileTypeData%ChannelUnits) + if (.not. allocated(DstOutputFileTypeData%ChannelUnits)) then + allocate(DstOutputFileTypeData%ChannelUnits(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_SrvD.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputFileTypeData%ChannelUnits.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call SrvD_CopyOtherState(SrcLinStateSaveData%OtherSt_SrvD(i1), DstLinStateSaveData%OtherSt_SrvD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstOutputFileTypeData%ChannelUnits = SrcOutputFileTypeData%ChannelUnits end if - if (allocated(SrcLinStateSaveData%u_SrvD)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_SrvD) - UB(1:1) = ubound(SrcLinStateSaveData%u_SrvD) - if (.not. allocated(DstLinStateSaveData%u_SrvD)) then - allocate(DstLinStateSaveData%u_SrvD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_SrvD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SrvD_CopyInput(SrcLinStateSaveData%u_SrvD(i1), DstLinStateSaveData%u_SrvD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + LB(1:1) = lbound(SrcOutputFileTypeData%Module_Ver) + UB(1:1) = ubound(SrcOutputFileTypeData%Module_Ver) + do i1 = LB(1), UB(1) + call NWTC_Library_CopyProgDesc(SrcOutputFileTypeData%Module_Ver(i1), DstOutputFileTypeData%Module_Ver(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + DstOutputFileTypeData%Module_Abrev = SrcOutputFileTypeData%Module_Abrev + DstOutputFileTypeData%WriteThisStep = SrcOutputFileTypeData%WriteThisStep + DstOutputFileTypeData%VTK_count = SrcOutputFileTypeData%VTK_count + DstOutputFileTypeData%VTK_LastWaveIndx = SrcOutputFileTypeData%VTK_LastWaveIndx + call FAST_CopyLinFileType(SrcOutputFileTypeData%Lin, DstOutputFileTypeData%Lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstOutputFileTypeData%ActualChanLen = SrcOutputFileTypeData%ActualChanLen + DstOutputFileTypeData%DriverWriteOutput = SrcOutputFileTypeData%DriverWriteOutput +end subroutine + +subroutine FAST_DestroyOutputFileType(OutputFileTypeData, ErrStat, ErrMsg) + type(FAST_OutputFileType), intent(inout) :: OutputFileTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_DestroyOutputFileType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(OutputFileTypeData%TimeData)) then + deallocate(OutputFileTypeData%TimeData) end if - if (allocated(SrcLinStateSaveData%x_AD)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_AD) - UB(1:1) = ubound(SrcLinStateSaveData%x_AD) - if (.not. allocated(DstLinStateSaveData%x_AD)) then - allocate(DstLinStateSaveData%x_AD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_AD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call AD_CopyContState(SrcLinStateSaveData%x_AD(i1), DstLinStateSaveData%x_AD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + if (allocated(OutputFileTypeData%AllOutData)) then + deallocate(OutputFileTypeData%AllOutData) end if - if (allocated(SrcLinStateSaveData%xd_AD)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_AD) - UB(1:1) = ubound(SrcLinStateSaveData%xd_AD) - if (.not. allocated(DstLinStateSaveData%xd_AD)) then - allocate(DstLinStateSaveData%xd_AD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_AD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call AD_CopyDiscState(SrcLinStateSaveData%xd_AD(i1), DstLinStateSaveData%xd_AD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + if (allocated(OutputFileTypeData%ChannelNames)) then + deallocate(OutputFileTypeData%ChannelNames) end if - if (allocated(SrcLinStateSaveData%z_AD)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_AD) - UB(1:1) = ubound(SrcLinStateSaveData%z_AD) - if (.not. allocated(DstLinStateSaveData%z_AD)) then - allocate(DstLinStateSaveData%z_AD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_AD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call AD_CopyConstrState(SrcLinStateSaveData%z_AD(i1), DstLinStateSaveData%z_AD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%OtherSt_AD)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_AD) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_AD) - if (.not. allocated(DstLinStateSaveData%OtherSt_AD)) then - allocate(DstLinStateSaveData%OtherSt_AD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_AD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call AD_CopyOtherState(SrcLinStateSaveData%OtherSt_AD(i1), DstLinStateSaveData%OtherSt_AD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_AD)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_AD) - UB(1:1) = ubound(SrcLinStateSaveData%u_AD) - if (.not. allocated(DstLinStateSaveData%u_AD)) then - allocate(DstLinStateSaveData%u_AD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_AD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call AD_CopyInput(SrcLinStateSaveData%u_AD(i1), DstLinStateSaveData%u_AD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%x_IfW)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_IfW) - UB(1:1) = ubound(SrcLinStateSaveData%x_IfW) - if (.not. allocated(DstLinStateSaveData%x_IfW)) then - allocate(DstLinStateSaveData%x_IfW(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_IfW.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call InflowWind_CopyContState(SrcLinStateSaveData%x_IfW(i1), DstLinStateSaveData%x_IfW(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_IfW)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_IfW) - UB(1:1) = ubound(SrcLinStateSaveData%xd_IfW) - if (.not. allocated(DstLinStateSaveData%xd_IfW)) then - allocate(DstLinStateSaveData%xd_IfW(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_IfW.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call InflowWind_CopyDiscState(SrcLinStateSaveData%xd_IfW(i1), DstLinStateSaveData%xd_IfW(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%z_IfW)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_IfW) - UB(1:1) = ubound(SrcLinStateSaveData%z_IfW) - if (.not. allocated(DstLinStateSaveData%z_IfW)) then - allocate(DstLinStateSaveData%z_IfW(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_IfW.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call InflowWind_CopyConstrState(SrcLinStateSaveData%z_IfW(i1), DstLinStateSaveData%z_IfW(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%OtherSt_IfW)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_IfW) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_IfW) - if (.not. allocated(DstLinStateSaveData%OtherSt_IfW)) then - allocate(DstLinStateSaveData%OtherSt_IfW(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_IfW.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call InflowWind_CopyOtherState(SrcLinStateSaveData%OtherSt_IfW(i1), DstLinStateSaveData%OtherSt_IfW(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_IfW)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_IfW) - UB(1:1) = ubound(SrcLinStateSaveData%u_IfW) - if (.not. allocated(DstLinStateSaveData%u_IfW)) then - allocate(DstLinStateSaveData%u_IfW(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_IfW.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call InflowWind_CopyInput(SrcLinStateSaveData%u_IfW(i1), DstLinStateSaveData%u_IfW(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%x_SD)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_SD) - UB(1:1) = ubound(SrcLinStateSaveData%x_SD) - if (.not. allocated(DstLinStateSaveData%x_SD)) then - allocate(DstLinStateSaveData%x_SD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_SD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SD_CopyContState(SrcLinStateSaveData%x_SD(i1), DstLinStateSaveData%x_SD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_SD)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_SD) - UB(1:1) = ubound(SrcLinStateSaveData%xd_SD) - if (.not. allocated(DstLinStateSaveData%xd_SD)) then - allocate(DstLinStateSaveData%xd_SD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_SD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SD_CopyDiscState(SrcLinStateSaveData%xd_SD(i1), DstLinStateSaveData%xd_SD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%z_SD)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_SD) - UB(1:1) = ubound(SrcLinStateSaveData%z_SD) - if (.not. allocated(DstLinStateSaveData%z_SD)) then - allocate(DstLinStateSaveData%z_SD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_SD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SD_CopyConstrState(SrcLinStateSaveData%z_SD(i1), DstLinStateSaveData%z_SD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%OtherSt_SD)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_SD) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_SD) - if (.not. allocated(DstLinStateSaveData%OtherSt_SD)) then - allocate(DstLinStateSaveData%OtherSt_SD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_SD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SD_CopyOtherState(SrcLinStateSaveData%OtherSt_SD(i1), DstLinStateSaveData%OtherSt_SD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_SD)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_SD) - UB(1:1) = ubound(SrcLinStateSaveData%u_SD) - if (.not. allocated(DstLinStateSaveData%u_SD)) then - allocate(DstLinStateSaveData%u_SD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_SD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SD_CopyInput(SrcLinStateSaveData%u_SD(i1), DstLinStateSaveData%u_SD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%x_ExtPtfm)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_ExtPtfm) - UB(1:1) = ubound(SrcLinStateSaveData%x_ExtPtfm) - if (.not. allocated(DstLinStateSaveData%x_ExtPtfm)) then - allocate(DstLinStateSaveData%x_ExtPtfm(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_ExtPtfm.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ExtPtfm_CopyContState(SrcLinStateSaveData%x_ExtPtfm(i1), DstLinStateSaveData%x_ExtPtfm(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_ExtPtfm)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_ExtPtfm) - UB(1:1) = ubound(SrcLinStateSaveData%xd_ExtPtfm) - if (.not. allocated(DstLinStateSaveData%xd_ExtPtfm)) then - allocate(DstLinStateSaveData%xd_ExtPtfm(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_ExtPtfm.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ExtPtfm_CopyDiscState(SrcLinStateSaveData%xd_ExtPtfm(i1), DstLinStateSaveData%xd_ExtPtfm(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%z_ExtPtfm)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_ExtPtfm) - UB(1:1) = ubound(SrcLinStateSaveData%z_ExtPtfm) - if (.not. allocated(DstLinStateSaveData%z_ExtPtfm)) then - allocate(DstLinStateSaveData%z_ExtPtfm(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_ExtPtfm.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ExtPtfm_CopyConstrState(SrcLinStateSaveData%z_ExtPtfm(i1), DstLinStateSaveData%z_ExtPtfm(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%OtherSt_ExtPtfm)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_ExtPtfm) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_ExtPtfm) - if (.not. allocated(DstLinStateSaveData%OtherSt_ExtPtfm)) then - allocate(DstLinStateSaveData%OtherSt_ExtPtfm(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_ExtPtfm.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ExtPtfm_CopyOtherState(SrcLinStateSaveData%OtherSt_ExtPtfm(i1), DstLinStateSaveData%OtherSt_ExtPtfm(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_ExtPtfm)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_ExtPtfm) - UB(1:1) = ubound(SrcLinStateSaveData%u_ExtPtfm) - if (.not. allocated(DstLinStateSaveData%u_ExtPtfm)) then - allocate(DstLinStateSaveData%u_ExtPtfm(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_ExtPtfm.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ExtPtfm_CopyInput(SrcLinStateSaveData%u_ExtPtfm(i1), DstLinStateSaveData%u_ExtPtfm(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%x_HD)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_HD) - UB(1:1) = ubound(SrcLinStateSaveData%x_HD) - if (.not. allocated(DstLinStateSaveData%x_HD)) then - allocate(DstLinStateSaveData%x_HD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_HD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call HydroDyn_CopyContState(SrcLinStateSaveData%x_HD(i1), DstLinStateSaveData%x_HD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_HD)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_HD) - UB(1:1) = ubound(SrcLinStateSaveData%xd_HD) - if (.not. allocated(DstLinStateSaveData%xd_HD)) then - allocate(DstLinStateSaveData%xd_HD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_HD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call HydroDyn_CopyDiscState(SrcLinStateSaveData%xd_HD(i1), DstLinStateSaveData%xd_HD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%z_HD)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_HD) - UB(1:1) = ubound(SrcLinStateSaveData%z_HD) - if (.not. allocated(DstLinStateSaveData%z_HD)) then - allocate(DstLinStateSaveData%z_HD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_HD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call HydroDyn_CopyConstrState(SrcLinStateSaveData%z_HD(i1), DstLinStateSaveData%z_HD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%OtherSt_HD)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_HD) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_HD) - if (.not. allocated(DstLinStateSaveData%OtherSt_HD)) then - allocate(DstLinStateSaveData%OtherSt_HD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_HD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call HydroDyn_CopyOtherState(SrcLinStateSaveData%OtherSt_HD(i1), DstLinStateSaveData%OtherSt_HD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_HD)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_HD) - UB(1:1) = ubound(SrcLinStateSaveData%u_HD) - if (.not. allocated(DstLinStateSaveData%u_HD)) then - allocate(DstLinStateSaveData%u_HD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_HD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call HydroDyn_CopyInput(SrcLinStateSaveData%u_HD(i1), DstLinStateSaveData%u_HD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%x_SeaSt)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_SeaSt) - UB(1:1) = ubound(SrcLinStateSaveData%x_SeaSt) - if (.not. allocated(DstLinStateSaveData%x_SeaSt)) then - allocate(DstLinStateSaveData%x_SeaSt(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_SeaSt.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SeaSt_CopyContState(SrcLinStateSaveData%x_SeaSt(i1), DstLinStateSaveData%x_SeaSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_SeaSt)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_SeaSt) - UB(1:1) = ubound(SrcLinStateSaveData%xd_SeaSt) - if (.not. allocated(DstLinStateSaveData%xd_SeaSt)) then - allocate(DstLinStateSaveData%xd_SeaSt(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_SeaSt.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SeaSt_CopyDiscState(SrcLinStateSaveData%xd_SeaSt(i1), DstLinStateSaveData%xd_SeaSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%z_SeaSt)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_SeaSt) - UB(1:1) = ubound(SrcLinStateSaveData%z_SeaSt) - if (.not. allocated(DstLinStateSaveData%z_SeaSt)) then - allocate(DstLinStateSaveData%z_SeaSt(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_SeaSt.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SeaSt_CopyConstrState(SrcLinStateSaveData%z_SeaSt(i1), DstLinStateSaveData%z_SeaSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%OtherSt_SeaSt)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_SeaSt) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_SeaSt) - if (.not. allocated(DstLinStateSaveData%OtherSt_SeaSt)) then - allocate(DstLinStateSaveData%OtherSt_SeaSt(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_SeaSt.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SeaSt_CopyOtherState(SrcLinStateSaveData%OtherSt_SeaSt(i1), DstLinStateSaveData%OtherSt_SeaSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_SeaSt)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_SeaSt) - UB(1:1) = ubound(SrcLinStateSaveData%u_SeaSt) - if (.not. allocated(DstLinStateSaveData%u_SeaSt)) then - allocate(DstLinStateSaveData%u_SeaSt(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_SeaSt.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call SeaSt_CopyInput(SrcLinStateSaveData%u_SeaSt(i1), DstLinStateSaveData%u_SeaSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%x_IceF)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_IceF) - UB(1:1) = ubound(SrcLinStateSaveData%x_IceF) - if (.not. allocated(DstLinStateSaveData%x_IceF)) then - allocate(DstLinStateSaveData%x_IceF(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_IceF.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call IceFloe_CopyContState(SrcLinStateSaveData%x_IceF(i1), DstLinStateSaveData%x_IceF(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_IceF)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_IceF) - UB(1:1) = ubound(SrcLinStateSaveData%xd_IceF) - if (.not. allocated(DstLinStateSaveData%xd_IceF)) then - allocate(DstLinStateSaveData%xd_IceF(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_IceF.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call IceFloe_CopyDiscState(SrcLinStateSaveData%xd_IceF(i1), DstLinStateSaveData%xd_IceF(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%z_IceF)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_IceF) - UB(1:1) = ubound(SrcLinStateSaveData%z_IceF) - if (.not. allocated(DstLinStateSaveData%z_IceF)) then - allocate(DstLinStateSaveData%z_IceF(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_IceF.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call IceFloe_CopyConstrState(SrcLinStateSaveData%z_IceF(i1), DstLinStateSaveData%z_IceF(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%OtherSt_IceF)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_IceF) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_IceF) - if (.not. allocated(DstLinStateSaveData%OtherSt_IceF)) then - allocate(DstLinStateSaveData%OtherSt_IceF(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_IceF.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call IceFloe_CopyOtherState(SrcLinStateSaveData%OtherSt_IceF(i1), DstLinStateSaveData%OtherSt_IceF(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_IceF)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_IceF) - UB(1:1) = ubound(SrcLinStateSaveData%u_IceF) - if (.not. allocated(DstLinStateSaveData%u_IceF)) then - allocate(DstLinStateSaveData%u_IceF(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_IceF.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call IceFloe_CopyInput(SrcLinStateSaveData%u_IceF(i1), DstLinStateSaveData%u_IceF(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%x_MAP)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_MAP) - UB(1:1) = ubound(SrcLinStateSaveData%x_MAP) - if (.not. allocated(DstLinStateSaveData%x_MAP)) then - allocate(DstLinStateSaveData%x_MAP(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_MAP.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MAP_CopyContState(SrcLinStateSaveData%x_MAP(i1), DstLinStateSaveData%x_MAP(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_MAP)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_MAP) - UB(1:1) = ubound(SrcLinStateSaveData%xd_MAP) - if (.not. allocated(DstLinStateSaveData%xd_MAP)) then - allocate(DstLinStateSaveData%xd_MAP(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_MAP.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MAP_CopyDiscState(SrcLinStateSaveData%xd_MAP(i1), DstLinStateSaveData%xd_MAP(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%z_MAP)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_MAP) - UB(1:1) = ubound(SrcLinStateSaveData%z_MAP) - if (.not. allocated(DstLinStateSaveData%z_MAP)) then - allocate(DstLinStateSaveData%z_MAP(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_MAP.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MAP_CopyConstrState(SrcLinStateSaveData%z_MAP(i1), DstLinStateSaveData%z_MAP(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_MAP)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_MAP) - UB(1:1) = ubound(SrcLinStateSaveData%u_MAP) - if (.not. allocated(DstLinStateSaveData%u_MAP)) then - allocate(DstLinStateSaveData%u_MAP(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_MAP.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MAP_CopyInput(SrcLinStateSaveData%u_MAP(i1), DstLinStateSaveData%u_MAP(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%x_FEAM)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_FEAM) - UB(1:1) = ubound(SrcLinStateSaveData%x_FEAM) - if (.not. allocated(DstLinStateSaveData%x_FEAM)) then - allocate(DstLinStateSaveData%x_FEAM(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_FEAM.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call FEAM_CopyContState(SrcLinStateSaveData%x_FEAM(i1), DstLinStateSaveData%x_FEAM(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_FEAM)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_FEAM) - UB(1:1) = ubound(SrcLinStateSaveData%xd_FEAM) - if (.not. allocated(DstLinStateSaveData%xd_FEAM)) then - allocate(DstLinStateSaveData%xd_FEAM(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_FEAM.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call FEAM_CopyDiscState(SrcLinStateSaveData%xd_FEAM(i1), DstLinStateSaveData%xd_FEAM(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%z_FEAM)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_FEAM) - UB(1:1) = ubound(SrcLinStateSaveData%z_FEAM) - if (.not. allocated(DstLinStateSaveData%z_FEAM)) then - allocate(DstLinStateSaveData%z_FEAM(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_FEAM.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call FEAM_CopyConstrState(SrcLinStateSaveData%z_FEAM(i1), DstLinStateSaveData%z_FEAM(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%OtherSt_FEAM)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_FEAM) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_FEAM) - if (.not. allocated(DstLinStateSaveData%OtherSt_FEAM)) then - allocate(DstLinStateSaveData%OtherSt_FEAM(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_FEAM.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call FEAM_CopyOtherState(SrcLinStateSaveData%OtherSt_FEAM(i1), DstLinStateSaveData%OtherSt_FEAM(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_FEAM)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_FEAM) - UB(1:1) = ubound(SrcLinStateSaveData%u_FEAM) - if (.not. allocated(DstLinStateSaveData%u_FEAM)) then - allocate(DstLinStateSaveData%u_FEAM(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_FEAM.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call FEAM_CopyInput(SrcLinStateSaveData%u_FEAM(i1), DstLinStateSaveData%u_FEAM(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%x_MD)) then - LB(1:1) = lbound(SrcLinStateSaveData%x_MD) - UB(1:1) = ubound(SrcLinStateSaveData%x_MD) - if (.not. allocated(DstLinStateSaveData%x_MD)) then - allocate(DstLinStateSaveData%x_MD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%x_MD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MD_CopyContState(SrcLinStateSaveData%x_MD(i1), DstLinStateSaveData%x_MD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%xd_MD)) then - LB(1:1) = lbound(SrcLinStateSaveData%xd_MD) - UB(1:1) = ubound(SrcLinStateSaveData%xd_MD) - if (.not. allocated(DstLinStateSaveData%xd_MD)) then - allocate(DstLinStateSaveData%xd_MD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%xd_MD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MD_CopyDiscState(SrcLinStateSaveData%xd_MD(i1), DstLinStateSaveData%xd_MD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%z_MD)) then - LB(1:1) = lbound(SrcLinStateSaveData%z_MD) - UB(1:1) = ubound(SrcLinStateSaveData%z_MD) - if (.not. allocated(DstLinStateSaveData%z_MD)) then - allocate(DstLinStateSaveData%z_MD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%z_MD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MD_CopyConstrState(SrcLinStateSaveData%z_MD(i1), DstLinStateSaveData%z_MD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%OtherSt_MD)) then - LB(1:1) = lbound(SrcLinStateSaveData%OtherSt_MD) - UB(1:1) = ubound(SrcLinStateSaveData%OtherSt_MD) - if (.not. allocated(DstLinStateSaveData%OtherSt_MD)) then - allocate(DstLinStateSaveData%OtherSt_MD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%OtherSt_MD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MD_CopyOtherState(SrcLinStateSaveData%OtherSt_MD(i1), DstLinStateSaveData%OtherSt_MD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcLinStateSaveData%u_MD)) then - LB(1:1) = lbound(SrcLinStateSaveData%u_MD) - UB(1:1) = ubound(SrcLinStateSaveData%u_MD) - if (.not. allocated(DstLinStateSaveData%u_MD)) then - allocate(DstLinStateSaveData%u_MD(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinStateSaveData%u_MD.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MD_CopyInput(SrcLinStateSaveData%u_MD(i1), DstLinStateSaveData%u_MD(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if -end subroutine - -subroutine FAST_DestroyLinStateSave(LinStateSaveData, ErrStat, ErrMsg) - type(FAST_LinStateSave), intent(inout) :: LinStateSaveData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyLinStateSave' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(LinStateSaveData%x_IceD)) then - LB(1:2) = lbound(LinStateSaveData%x_IceD) - UB(1:2) = ubound(LinStateSaveData%x_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyContState(LinStateSaveData%x_IceD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%x_IceD) - end if - if (allocated(LinStateSaveData%xd_IceD)) then - LB(1:2) = lbound(LinStateSaveData%xd_IceD) - UB(1:2) = ubound(LinStateSaveData%xd_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyDiscState(LinStateSaveData%xd_IceD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%xd_IceD) - end if - if (allocated(LinStateSaveData%z_IceD)) then - LB(1:2) = lbound(LinStateSaveData%z_IceD) - UB(1:2) = ubound(LinStateSaveData%z_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyConstrState(LinStateSaveData%z_IceD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%z_IceD) - end if - if (allocated(LinStateSaveData%OtherSt_IceD)) then - LB(1:2) = lbound(LinStateSaveData%OtherSt_IceD) - UB(1:2) = ubound(LinStateSaveData%OtherSt_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyOtherState(LinStateSaveData%OtherSt_IceD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%OtherSt_IceD) - end if - if (allocated(LinStateSaveData%u_IceD)) then - LB(1:2) = lbound(LinStateSaveData%u_IceD) - UB(1:2) = ubound(LinStateSaveData%u_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyInput(LinStateSaveData%u_IceD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%u_IceD) - end if - if (allocated(LinStateSaveData%x_BD)) then - LB(1:2) = lbound(LinStateSaveData%x_BD) - UB(1:2) = ubound(LinStateSaveData%x_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyContState(LinStateSaveData%x_BD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%x_BD) - end if - if (allocated(LinStateSaveData%xd_BD)) then - LB(1:2) = lbound(LinStateSaveData%xd_BD) - UB(1:2) = ubound(LinStateSaveData%xd_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyDiscState(LinStateSaveData%xd_BD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%xd_BD) - end if - if (allocated(LinStateSaveData%z_BD)) then - LB(1:2) = lbound(LinStateSaveData%z_BD) - UB(1:2) = ubound(LinStateSaveData%z_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyConstrState(LinStateSaveData%z_BD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%z_BD) - end if - if (allocated(LinStateSaveData%OtherSt_BD)) then - LB(1:2) = lbound(LinStateSaveData%OtherSt_BD) - UB(1:2) = ubound(LinStateSaveData%OtherSt_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyOtherState(LinStateSaveData%OtherSt_BD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%OtherSt_BD) - end if - if (allocated(LinStateSaveData%u_BD)) then - LB(1:2) = lbound(LinStateSaveData%u_BD) - UB(1:2) = ubound(LinStateSaveData%u_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyInput(LinStateSaveData%u_BD(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(LinStateSaveData%u_BD) - end if - if (allocated(LinStateSaveData%x_ED)) then - LB(1:1) = lbound(LinStateSaveData%x_ED) - UB(1:1) = ubound(LinStateSaveData%x_ED) - do i1 = LB(1), UB(1) - call ED_DestroyContState(LinStateSaveData%x_ED(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_ED) - end if - if (allocated(LinStateSaveData%xd_ED)) then - LB(1:1) = lbound(LinStateSaveData%xd_ED) - UB(1:1) = ubound(LinStateSaveData%xd_ED) - do i1 = LB(1), UB(1) - call ED_DestroyDiscState(LinStateSaveData%xd_ED(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_ED) - end if - if (allocated(LinStateSaveData%z_ED)) then - LB(1:1) = lbound(LinStateSaveData%z_ED) - UB(1:1) = ubound(LinStateSaveData%z_ED) - do i1 = LB(1), UB(1) - call ED_DestroyConstrState(LinStateSaveData%z_ED(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_ED) - end if - if (allocated(LinStateSaveData%OtherSt_ED)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_ED) - UB(1:1) = ubound(LinStateSaveData%OtherSt_ED) - do i1 = LB(1), UB(1) - call ED_DestroyOtherState(LinStateSaveData%OtherSt_ED(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_ED) - end if - if (allocated(LinStateSaveData%u_ED)) then - LB(1:1) = lbound(LinStateSaveData%u_ED) - UB(1:1) = ubound(LinStateSaveData%u_ED) - do i1 = LB(1), UB(1) - call ED_DestroyInput(LinStateSaveData%u_ED(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_ED) - end if - if (allocated(LinStateSaveData%x_SrvD)) then - LB(1:1) = lbound(LinStateSaveData%x_SrvD) - UB(1:1) = ubound(LinStateSaveData%x_SrvD) - do i1 = LB(1), UB(1) - call SrvD_DestroyContState(LinStateSaveData%x_SrvD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_SrvD) - end if - if (allocated(LinStateSaveData%xd_SrvD)) then - LB(1:1) = lbound(LinStateSaveData%xd_SrvD) - UB(1:1) = ubound(LinStateSaveData%xd_SrvD) - do i1 = LB(1), UB(1) - call SrvD_DestroyDiscState(LinStateSaveData%xd_SrvD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_SrvD) - end if - if (allocated(LinStateSaveData%z_SrvD)) then - LB(1:1) = lbound(LinStateSaveData%z_SrvD) - UB(1:1) = ubound(LinStateSaveData%z_SrvD) - do i1 = LB(1), UB(1) - call SrvD_DestroyConstrState(LinStateSaveData%z_SrvD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_SrvD) - end if - if (allocated(LinStateSaveData%OtherSt_SrvD)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_SrvD) - UB(1:1) = ubound(LinStateSaveData%OtherSt_SrvD) - do i1 = LB(1), UB(1) - call SrvD_DestroyOtherState(LinStateSaveData%OtherSt_SrvD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_SrvD) - end if - if (allocated(LinStateSaveData%u_SrvD)) then - LB(1:1) = lbound(LinStateSaveData%u_SrvD) - UB(1:1) = ubound(LinStateSaveData%u_SrvD) - do i1 = LB(1), UB(1) - call SrvD_DestroyInput(LinStateSaveData%u_SrvD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_SrvD) - end if - if (allocated(LinStateSaveData%x_AD)) then - LB(1:1) = lbound(LinStateSaveData%x_AD) - UB(1:1) = ubound(LinStateSaveData%x_AD) - do i1 = LB(1), UB(1) - call AD_DestroyContState(LinStateSaveData%x_AD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_AD) - end if - if (allocated(LinStateSaveData%xd_AD)) then - LB(1:1) = lbound(LinStateSaveData%xd_AD) - UB(1:1) = ubound(LinStateSaveData%xd_AD) - do i1 = LB(1), UB(1) - call AD_DestroyDiscState(LinStateSaveData%xd_AD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_AD) - end if - if (allocated(LinStateSaveData%z_AD)) then - LB(1:1) = lbound(LinStateSaveData%z_AD) - UB(1:1) = ubound(LinStateSaveData%z_AD) - do i1 = LB(1), UB(1) - call AD_DestroyConstrState(LinStateSaveData%z_AD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_AD) - end if - if (allocated(LinStateSaveData%OtherSt_AD)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_AD) - UB(1:1) = ubound(LinStateSaveData%OtherSt_AD) - do i1 = LB(1), UB(1) - call AD_DestroyOtherState(LinStateSaveData%OtherSt_AD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_AD) - end if - if (allocated(LinStateSaveData%u_AD)) then - LB(1:1) = lbound(LinStateSaveData%u_AD) - UB(1:1) = ubound(LinStateSaveData%u_AD) - do i1 = LB(1), UB(1) - call AD_DestroyInput(LinStateSaveData%u_AD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_AD) - end if - if (allocated(LinStateSaveData%x_IfW)) then - LB(1:1) = lbound(LinStateSaveData%x_IfW) - UB(1:1) = ubound(LinStateSaveData%x_IfW) - do i1 = LB(1), UB(1) - call InflowWind_DestroyContState(LinStateSaveData%x_IfW(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_IfW) - end if - if (allocated(LinStateSaveData%xd_IfW)) then - LB(1:1) = lbound(LinStateSaveData%xd_IfW) - UB(1:1) = ubound(LinStateSaveData%xd_IfW) - do i1 = LB(1), UB(1) - call InflowWind_DestroyDiscState(LinStateSaveData%xd_IfW(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_IfW) - end if - if (allocated(LinStateSaveData%z_IfW)) then - LB(1:1) = lbound(LinStateSaveData%z_IfW) - UB(1:1) = ubound(LinStateSaveData%z_IfW) - do i1 = LB(1), UB(1) - call InflowWind_DestroyConstrState(LinStateSaveData%z_IfW(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_IfW) - end if - if (allocated(LinStateSaveData%OtherSt_IfW)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_IfW) - UB(1:1) = ubound(LinStateSaveData%OtherSt_IfW) - do i1 = LB(1), UB(1) - call InflowWind_DestroyOtherState(LinStateSaveData%OtherSt_IfW(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_IfW) - end if - if (allocated(LinStateSaveData%u_IfW)) then - LB(1:1) = lbound(LinStateSaveData%u_IfW) - UB(1:1) = ubound(LinStateSaveData%u_IfW) - do i1 = LB(1), UB(1) - call InflowWind_DestroyInput(LinStateSaveData%u_IfW(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_IfW) - end if - if (allocated(LinStateSaveData%x_SD)) then - LB(1:1) = lbound(LinStateSaveData%x_SD) - UB(1:1) = ubound(LinStateSaveData%x_SD) - do i1 = LB(1), UB(1) - call SD_DestroyContState(LinStateSaveData%x_SD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_SD) - end if - if (allocated(LinStateSaveData%xd_SD)) then - LB(1:1) = lbound(LinStateSaveData%xd_SD) - UB(1:1) = ubound(LinStateSaveData%xd_SD) - do i1 = LB(1), UB(1) - call SD_DestroyDiscState(LinStateSaveData%xd_SD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_SD) - end if - if (allocated(LinStateSaveData%z_SD)) then - LB(1:1) = lbound(LinStateSaveData%z_SD) - UB(1:1) = ubound(LinStateSaveData%z_SD) - do i1 = LB(1), UB(1) - call SD_DestroyConstrState(LinStateSaveData%z_SD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_SD) - end if - if (allocated(LinStateSaveData%OtherSt_SD)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_SD) - UB(1:1) = ubound(LinStateSaveData%OtherSt_SD) - do i1 = LB(1), UB(1) - call SD_DestroyOtherState(LinStateSaveData%OtherSt_SD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_SD) - end if - if (allocated(LinStateSaveData%u_SD)) then - LB(1:1) = lbound(LinStateSaveData%u_SD) - UB(1:1) = ubound(LinStateSaveData%u_SD) - do i1 = LB(1), UB(1) - call SD_DestroyInput(LinStateSaveData%u_SD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_SD) - end if - if (allocated(LinStateSaveData%x_ExtPtfm)) then - LB(1:1) = lbound(LinStateSaveData%x_ExtPtfm) - UB(1:1) = ubound(LinStateSaveData%x_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_DestroyContState(LinStateSaveData%x_ExtPtfm(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_ExtPtfm) - end if - if (allocated(LinStateSaveData%xd_ExtPtfm)) then - LB(1:1) = lbound(LinStateSaveData%xd_ExtPtfm) - UB(1:1) = ubound(LinStateSaveData%xd_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_DestroyDiscState(LinStateSaveData%xd_ExtPtfm(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_ExtPtfm) - end if - if (allocated(LinStateSaveData%z_ExtPtfm)) then - LB(1:1) = lbound(LinStateSaveData%z_ExtPtfm) - UB(1:1) = ubound(LinStateSaveData%z_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_DestroyConstrState(LinStateSaveData%z_ExtPtfm(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_ExtPtfm) - end if - if (allocated(LinStateSaveData%OtherSt_ExtPtfm)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_ExtPtfm) - UB(1:1) = ubound(LinStateSaveData%OtherSt_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_DestroyOtherState(LinStateSaveData%OtherSt_ExtPtfm(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_ExtPtfm) - end if - if (allocated(LinStateSaveData%u_ExtPtfm)) then - LB(1:1) = lbound(LinStateSaveData%u_ExtPtfm) - UB(1:1) = ubound(LinStateSaveData%u_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_DestroyInput(LinStateSaveData%u_ExtPtfm(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_ExtPtfm) - end if - if (allocated(LinStateSaveData%x_HD)) then - LB(1:1) = lbound(LinStateSaveData%x_HD) - UB(1:1) = ubound(LinStateSaveData%x_HD) - do i1 = LB(1), UB(1) - call HydroDyn_DestroyContState(LinStateSaveData%x_HD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_HD) - end if - if (allocated(LinStateSaveData%xd_HD)) then - LB(1:1) = lbound(LinStateSaveData%xd_HD) - UB(1:1) = ubound(LinStateSaveData%xd_HD) - do i1 = LB(1), UB(1) - call HydroDyn_DestroyDiscState(LinStateSaveData%xd_HD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_HD) - end if - if (allocated(LinStateSaveData%z_HD)) then - LB(1:1) = lbound(LinStateSaveData%z_HD) - UB(1:1) = ubound(LinStateSaveData%z_HD) - do i1 = LB(1), UB(1) - call HydroDyn_DestroyConstrState(LinStateSaveData%z_HD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_HD) - end if - if (allocated(LinStateSaveData%OtherSt_HD)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_HD) - UB(1:1) = ubound(LinStateSaveData%OtherSt_HD) - do i1 = LB(1), UB(1) - call HydroDyn_DestroyOtherState(LinStateSaveData%OtherSt_HD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_HD) - end if - if (allocated(LinStateSaveData%u_HD)) then - LB(1:1) = lbound(LinStateSaveData%u_HD) - UB(1:1) = ubound(LinStateSaveData%u_HD) - do i1 = LB(1), UB(1) - call HydroDyn_DestroyInput(LinStateSaveData%u_HD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_HD) - end if - if (allocated(LinStateSaveData%x_SeaSt)) then - LB(1:1) = lbound(LinStateSaveData%x_SeaSt) - UB(1:1) = ubound(LinStateSaveData%x_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_DestroyContState(LinStateSaveData%x_SeaSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_SeaSt) - end if - if (allocated(LinStateSaveData%xd_SeaSt)) then - LB(1:1) = lbound(LinStateSaveData%xd_SeaSt) - UB(1:1) = ubound(LinStateSaveData%xd_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_DestroyDiscState(LinStateSaveData%xd_SeaSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_SeaSt) - end if - if (allocated(LinStateSaveData%z_SeaSt)) then - LB(1:1) = lbound(LinStateSaveData%z_SeaSt) - UB(1:1) = ubound(LinStateSaveData%z_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_DestroyConstrState(LinStateSaveData%z_SeaSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_SeaSt) - end if - if (allocated(LinStateSaveData%OtherSt_SeaSt)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_SeaSt) - UB(1:1) = ubound(LinStateSaveData%OtherSt_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_DestroyOtherState(LinStateSaveData%OtherSt_SeaSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_SeaSt) - end if - if (allocated(LinStateSaveData%u_SeaSt)) then - LB(1:1) = lbound(LinStateSaveData%u_SeaSt) - UB(1:1) = ubound(LinStateSaveData%u_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_DestroyInput(LinStateSaveData%u_SeaSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_SeaSt) - end if - if (allocated(LinStateSaveData%x_IceF)) then - LB(1:1) = lbound(LinStateSaveData%x_IceF) - UB(1:1) = ubound(LinStateSaveData%x_IceF) - do i1 = LB(1), UB(1) - call IceFloe_DestroyContState(LinStateSaveData%x_IceF(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_IceF) - end if - if (allocated(LinStateSaveData%xd_IceF)) then - LB(1:1) = lbound(LinStateSaveData%xd_IceF) - UB(1:1) = ubound(LinStateSaveData%xd_IceF) - do i1 = LB(1), UB(1) - call IceFloe_DestroyDiscState(LinStateSaveData%xd_IceF(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_IceF) - end if - if (allocated(LinStateSaveData%z_IceF)) then - LB(1:1) = lbound(LinStateSaveData%z_IceF) - UB(1:1) = ubound(LinStateSaveData%z_IceF) - do i1 = LB(1), UB(1) - call IceFloe_DestroyConstrState(LinStateSaveData%z_IceF(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_IceF) - end if - if (allocated(LinStateSaveData%OtherSt_IceF)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_IceF) - UB(1:1) = ubound(LinStateSaveData%OtherSt_IceF) - do i1 = LB(1), UB(1) - call IceFloe_DestroyOtherState(LinStateSaveData%OtherSt_IceF(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_IceF) - end if - if (allocated(LinStateSaveData%u_IceF)) then - LB(1:1) = lbound(LinStateSaveData%u_IceF) - UB(1:1) = ubound(LinStateSaveData%u_IceF) - do i1 = LB(1), UB(1) - call IceFloe_DestroyInput(LinStateSaveData%u_IceF(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_IceF) - end if - if (allocated(LinStateSaveData%x_MAP)) then - LB(1:1) = lbound(LinStateSaveData%x_MAP) - UB(1:1) = ubound(LinStateSaveData%x_MAP) - do i1 = LB(1), UB(1) - call MAP_DestroyContState(LinStateSaveData%x_MAP(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_MAP) - end if - if (allocated(LinStateSaveData%xd_MAP)) then - LB(1:1) = lbound(LinStateSaveData%xd_MAP) - UB(1:1) = ubound(LinStateSaveData%xd_MAP) - do i1 = LB(1), UB(1) - call MAP_DestroyDiscState(LinStateSaveData%xd_MAP(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_MAP) - end if - if (allocated(LinStateSaveData%z_MAP)) then - LB(1:1) = lbound(LinStateSaveData%z_MAP) - UB(1:1) = ubound(LinStateSaveData%z_MAP) - do i1 = LB(1), UB(1) - call MAP_DestroyConstrState(LinStateSaveData%z_MAP(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_MAP) - end if - if (allocated(LinStateSaveData%u_MAP)) then - LB(1:1) = lbound(LinStateSaveData%u_MAP) - UB(1:1) = ubound(LinStateSaveData%u_MAP) - do i1 = LB(1), UB(1) - call MAP_DestroyInput(LinStateSaveData%u_MAP(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_MAP) - end if - if (allocated(LinStateSaveData%x_FEAM)) then - LB(1:1) = lbound(LinStateSaveData%x_FEAM) - UB(1:1) = ubound(LinStateSaveData%x_FEAM) - do i1 = LB(1), UB(1) - call FEAM_DestroyContState(LinStateSaveData%x_FEAM(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_FEAM) - end if - if (allocated(LinStateSaveData%xd_FEAM)) then - LB(1:1) = lbound(LinStateSaveData%xd_FEAM) - UB(1:1) = ubound(LinStateSaveData%xd_FEAM) - do i1 = LB(1), UB(1) - call FEAM_DestroyDiscState(LinStateSaveData%xd_FEAM(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_FEAM) - end if - if (allocated(LinStateSaveData%z_FEAM)) then - LB(1:1) = lbound(LinStateSaveData%z_FEAM) - UB(1:1) = ubound(LinStateSaveData%z_FEAM) - do i1 = LB(1), UB(1) - call FEAM_DestroyConstrState(LinStateSaveData%z_FEAM(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_FEAM) - end if - if (allocated(LinStateSaveData%OtherSt_FEAM)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_FEAM) - UB(1:1) = ubound(LinStateSaveData%OtherSt_FEAM) - do i1 = LB(1), UB(1) - call FEAM_DestroyOtherState(LinStateSaveData%OtherSt_FEAM(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_FEAM) - end if - if (allocated(LinStateSaveData%u_FEAM)) then - LB(1:1) = lbound(LinStateSaveData%u_FEAM) - UB(1:1) = ubound(LinStateSaveData%u_FEAM) - do i1 = LB(1), UB(1) - call FEAM_DestroyInput(LinStateSaveData%u_FEAM(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_FEAM) - end if - if (allocated(LinStateSaveData%x_MD)) then - LB(1:1) = lbound(LinStateSaveData%x_MD) - UB(1:1) = ubound(LinStateSaveData%x_MD) - do i1 = LB(1), UB(1) - call MD_DestroyContState(LinStateSaveData%x_MD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%x_MD) - end if - if (allocated(LinStateSaveData%xd_MD)) then - LB(1:1) = lbound(LinStateSaveData%xd_MD) - UB(1:1) = ubound(LinStateSaveData%xd_MD) - do i1 = LB(1), UB(1) - call MD_DestroyDiscState(LinStateSaveData%xd_MD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%xd_MD) - end if - if (allocated(LinStateSaveData%z_MD)) then - LB(1:1) = lbound(LinStateSaveData%z_MD) - UB(1:1) = ubound(LinStateSaveData%z_MD) - do i1 = LB(1), UB(1) - call MD_DestroyConstrState(LinStateSaveData%z_MD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%z_MD) - end if - if (allocated(LinStateSaveData%OtherSt_MD)) then - LB(1:1) = lbound(LinStateSaveData%OtherSt_MD) - UB(1:1) = ubound(LinStateSaveData%OtherSt_MD) - do i1 = LB(1), UB(1) - call MD_DestroyOtherState(LinStateSaveData%OtherSt_MD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%OtherSt_MD) - end if - if (allocated(LinStateSaveData%u_MD)) then - LB(1:1) = lbound(LinStateSaveData%u_MD) - UB(1:1) = ubound(LinStateSaveData%u_MD) - do i1 = LB(1), UB(1) - call MD_DestroyInput(LinStateSaveData%u_MD(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(LinStateSaveData%u_MD) - end if -end subroutine - -subroutine FAST_PackLinStateSave(RF, Indata) - type(RegFile), intent(inout) :: RF - type(FAST_LinStateSave), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackLinStateSave' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%x_IceD)) - if (allocated(InData%x_IceD)) then - call RegPackBounds(RF, 2, lbound(InData%x_IceD), ubound(InData%x_IceD)) - LB(1:2) = lbound(InData%x_IceD) - UB(1:2) = ubound(InData%x_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackContState(RF, InData%x_IceD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%xd_IceD)) - if (allocated(InData%xd_IceD)) then - call RegPackBounds(RF, 2, lbound(InData%xd_IceD), ubound(InData%xd_IceD)) - LB(1:2) = lbound(InData%xd_IceD) - UB(1:2) = ubound(InData%xd_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackDiscState(RF, InData%xd_IceD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%z_IceD)) - if (allocated(InData%z_IceD)) then - call RegPackBounds(RF, 2, lbound(InData%z_IceD), ubound(InData%z_IceD)) - LB(1:2) = lbound(InData%z_IceD) - UB(1:2) = ubound(InData%z_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackConstrState(RF, InData%z_IceD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%OtherSt_IceD)) - if (allocated(InData%OtherSt_IceD)) then - call RegPackBounds(RF, 2, lbound(InData%OtherSt_IceD), ubound(InData%OtherSt_IceD)) - LB(1:2) = lbound(InData%OtherSt_IceD) - UB(1:2) = ubound(InData%OtherSt_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackOtherState(RF, InData%OtherSt_IceD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%u_IceD)) - if (allocated(InData%u_IceD)) then - call RegPackBounds(RF, 2, lbound(InData%u_IceD), ubound(InData%u_IceD)) - LB(1:2) = lbound(InData%u_IceD) - UB(1:2) = ubound(InData%u_IceD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackInput(RF, InData%u_IceD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%x_BD)) - if (allocated(InData%x_BD)) then - call RegPackBounds(RF, 2, lbound(InData%x_BD), ubound(InData%x_BD)) - LB(1:2) = lbound(InData%x_BD) - UB(1:2) = ubound(InData%x_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackContState(RF, InData%x_BD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%xd_BD)) - if (allocated(InData%xd_BD)) then - call RegPackBounds(RF, 2, lbound(InData%xd_BD), ubound(InData%xd_BD)) - LB(1:2) = lbound(InData%xd_BD) - UB(1:2) = ubound(InData%xd_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackDiscState(RF, InData%xd_BD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%z_BD)) - if (allocated(InData%z_BD)) then - call RegPackBounds(RF, 2, lbound(InData%z_BD), ubound(InData%z_BD)) - LB(1:2) = lbound(InData%z_BD) - UB(1:2) = ubound(InData%z_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackConstrState(RF, InData%z_BD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%OtherSt_BD)) - if (allocated(InData%OtherSt_BD)) then - call RegPackBounds(RF, 2, lbound(InData%OtherSt_BD), ubound(InData%OtherSt_BD)) - LB(1:2) = lbound(InData%OtherSt_BD) - UB(1:2) = ubound(InData%OtherSt_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackOtherState(RF, InData%OtherSt_BD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%u_BD)) - if (allocated(InData%u_BD)) then - call RegPackBounds(RF, 2, lbound(InData%u_BD), ubound(InData%u_BD)) - LB(1:2) = lbound(InData%u_BD) - UB(1:2) = ubound(InData%u_BD) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackInput(RF, InData%u_BD(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%x_ED)) - if (allocated(InData%x_ED)) then - call RegPackBounds(RF, 1, lbound(InData%x_ED), ubound(InData%x_ED)) - LB(1:1) = lbound(InData%x_ED) - UB(1:1) = ubound(InData%x_ED) - do i1 = LB(1), UB(1) - call ED_PackContState(RF, InData%x_ED(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_ED)) - if (allocated(InData%xd_ED)) then - call RegPackBounds(RF, 1, lbound(InData%xd_ED), ubound(InData%xd_ED)) - LB(1:1) = lbound(InData%xd_ED) - UB(1:1) = ubound(InData%xd_ED) - do i1 = LB(1), UB(1) - call ED_PackDiscState(RF, InData%xd_ED(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_ED)) - if (allocated(InData%z_ED)) then - call RegPackBounds(RF, 1, lbound(InData%z_ED), ubound(InData%z_ED)) - LB(1:1) = lbound(InData%z_ED) - UB(1:1) = ubound(InData%z_ED) - do i1 = LB(1), UB(1) - call ED_PackConstrState(RF, InData%z_ED(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_ED)) - if (allocated(InData%OtherSt_ED)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_ED), ubound(InData%OtherSt_ED)) - LB(1:1) = lbound(InData%OtherSt_ED) - UB(1:1) = ubound(InData%OtherSt_ED) - do i1 = LB(1), UB(1) - call ED_PackOtherState(RF, InData%OtherSt_ED(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_ED)) - if (allocated(InData%u_ED)) then - call RegPackBounds(RF, 1, lbound(InData%u_ED), ubound(InData%u_ED)) - LB(1:1) = lbound(InData%u_ED) - UB(1:1) = ubound(InData%u_ED) - do i1 = LB(1), UB(1) - call ED_PackInput(RF, InData%u_ED(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_SrvD)) - if (allocated(InData%x_SrvD)) then - call RegPackBounds(RF, 1, lbound(InData%x_SrvD), ubound(InData%x_SrvD)) - LB(1:1) = lbound(InData%x_SrvD) - UB(1:1) = ubound(InData%x_SrvD) - do i1 = LB(1), UB(1) - call SrvD_PackContState(RF, InData%x_SrvD(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_SrvD)) - if (allocated(InData%xd_SrvD)) then - call RegPackBounds(RF, 1, lbound(InData%xd_SrvD), ubound(InData%xd_SrvD)) - LB(1:1) = lbound(InData%xd_SrvD) - UB(1:1) = ubound(InData%xd_SrvD) - do i1 = LB(1), UB(1) - call SrvD_PackDiscState(RF, InData%xd_SrvD(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_SrvD)) - if (allocated(InData%z_SrvD)) then - call RegPackBounds(RF, 1, lbound(InData%z_SrvD), ubound(InData%z_SrvD)) - LB(1:1) = lbound(InData%z_SrvD) - UB(1:1) = ubound(InData%z_SrvD) - do i1 = LB(1), UB(1) - call SrvD_PackConstrState(RF, InData%z_SrvD(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_SrvD)) - if (allocated(InData%OtherSt_SrvD)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_SrvD), ubound(InData%OtherSt_SrvD)) - LB(1:1) = lbound(InData%OtherSt_SrvD) - UB(1:1) = ubound(InData%OtherSt_SrvD) - do i1 = LB(1), UB(1) - call SrvD_PackOtherState(RF, InData%OtherSt_SrvD(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_SrvD)) - if (allocated(InData%u_SrvD)) then - call RegPackBounds(RF, 1, lbound(InData%u_SrvD), ubound(InData%u_SrvD)) - LB(1:1) = lbound(InData%u_SrvD) - UB(1:1) = ubound(InData%u_SrvD) - do i1 = LB(1), UB(1) - call SrvD_PackInput(RF, InData%u_SrvD(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_AD)) - if (allocated(InData%x_AD)) then - call RegPackBounds(RF, 1, lbound(InData%x_AD), ubound(InData%x_AD)) - LB(1:1) = lbound(InData%x_AD) - UB(1:1) = ubound(InData%x_AD) - do i1 = LB(1), UB(1) - call AD_PackContState(RF, InData%x_AD(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_AD)) - if (allocated(InData%xd_AD)) then - call RegPackBounds(RF, 1, lbound(InData%xd_AD), ubound(InData%xd_AD)) - LB(1:1) = lbound(InData%xd_AD) - UB(1:1) = ubound(InData%xd_AD) - do i1 = LB(1), UB(1) - call AD_PackDiscState(RF, InData%xd_AD(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_AD)) - if (allocated(InData%z_AD)) then - call RegPackBounds(RF, 1, lbound(InData%z_AD), ubound(InData%z_AD)) - LB(1:1) = lbound(InData%z_AD) - UB(1:1) = ubound(InData%z_AD) - do i1 = LB(1), UB(1) - call AD_PackConstrState(RF, InData%z_AD(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_AD)) - if (allocated(InData%OtherSt_AD)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_AD), ubound(InData%OtherSt_AD)) - LB(1:1) = lbound(InData%OtherSt_AD) - UB(1:1) = ubound(InData%OtherSt_AD) - do i1 = LB(1), UB(1) - call AD_PackOtherState(RF, InData%OtherSt_AD(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_AD)) - if (allocated(InData%u_AD)) then - call RegPackBounds(RF, 1, lbound(InData%u_AD), ubound(InData%u_AD)) - LB(1:1) = lbound(InData%u_AD) - UB(1:1) = ubound(InData%u_AD) - do i1 = LB(1), UB(1) - call AD_PackInput(RF, InData%u_AD(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_IfW)) - if (allocated(InData%x_IfW)) then - call RegPackBounds(RF, 1, lbound(InData%x_IfW), ubound(InData%x_IfW)) - LB(1:1) = lbound(InData%x_IfW) - UB(1:1) = ubound(InData%x_IfW) - do i1 = LB(1), UB(1) - call InflowWind_PackContState(RF, InData%x_IfW(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_IfW)) - if (allocated(InData%xd_IfW)) then - call RegPackBounds(RF, 1, lbound(InData%xd_IfW), ubound(InData%xd_IfW)) - LB(1:1) = lbound(InData%xd_IfW) - UB(1:1) = ubound(InData%xd_IfW) - do i1 = LB(1), UB(1) - call InflowWind_PackDiscState(RF, InData%xd_IfW(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_IfW)) - if (allocated(InData%z_IfW)) then - call RegPackBounds(RF, 1, lbound(InData%z_IfW), ubound(InData%z_IfW)) - LB(1:1) = lbound(InData%z_IfW) - UB(1:1) = ubound(InData%z_IfW) - do i1 = LB(1), UB(1) - call InflowWind_PackConstrState(RF, InData%z_IfW(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_IfW)) - if (allocated(InData%OtherSt_IfW)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_IfW), ubound(InData%OtherSt_IfW)) - LB(1:1) = lbound(InData%OtherSt_IfW) - UB(1:1) = ubound(InData%OtherSt_IfW) - do i1 = LB(1), UB(1) - call InflowWind_PackOtherState(RF, InData%OtherSt_IfW(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_IfW)) - if (allocated(InData%u_IfW)) then - call RegPackBounds(RF, 1, lbound(InData%u_IfW), ubound(InData%u_IfW)) - LB(1:1) = lbound(InData%u_IfW) - UB(1:1) = ubound(InData%u_IfW) - do i1 = LB(1), UB(1) - call InflowWind_PackInput(RF, InData%u_IfW(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_SD)) - if (allocated(InData%x_SD)) then - call RegPackBounds(RF, 1, lbound(InData%x_SD), ubound(InData%x_SD)) - LB(1:1) = lbound(InData%x_SD) - UB(1:1) = ubound(InData%x_SD) - do i1 = LB(1), UB(1) - call SD_PackContState(RF, InData%x_SD(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_SD)) - if (allocated(InData%xd_SD)) then - call RegPackBounds(RF, 1, lbound(InData%xd_SD), ubound(InData%xd_SD)) - LB(1:1) = lbound(InData%xd_SD) - UB(1:1) = ubound(InData%xd_SD) - do i1 = LB(1), UB(1) - call SD_PackDiscState(RF, InData%xd_SD(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_SD)) - if (allocated(InData%z_SD)) then - call RegPackBounds(RF, 1, lbound(InData%z_SD), ubound(InData%z_SD)) - LB(1:1) = lbound(InData%z_SD) - UB(1:1) = ubound(InData%z_SD) - do i1 = LB(1), UB(1) - call SD_PackConstrState(RF, InData%z_SD(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_SD)) - if (allocated(InData%OtherSt_SD)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_SD), ubound(InData%OtherSt_SD)) - LB(1:1) = lbound(InData%OtherSt_SD) - UB(1:1) = ubound(InData%OtherSt_SD) - do i1 = LB(1), UB(1) - call SD_PackOtherState(RF, InData%OtherSt_SD(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_SD)) - if (allocated(InData%u_SD)) then - call RegPackBounds(RF, 1, lbound(InData%u_SD), ubound(InData%u_SD)) - LB(1:1) = lbound(InData%u_SD) - UB(1:1) = ubound(InData%u_SD) - do i1 = LB(1), UB(1) - call SD_PackInput(RF, InData%u_SD(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_ExtPtfm)) - if (allocated(InData%x_ExtPtfm)) then - call RegPackBounds(RF, 1, lbound(InData%x_ExtPtfm), ubound(InData%x_ExtPtfm)) - LB(1:1) = lbound(InData%x_ExtPtfm) - UB(1:1) = ubound(InData%x_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_PackContState(RF, InData%x_ExtPtfm(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_ExtPtfm)) - if (allocated(InData%xd_ExtPtfm)) then - call RegPackBounds(RF, 1, lbound(InData%xd_ExtPtfm), ubound(InData%xd_ExtPtfm)) - LB(1:1) = lbound(InData%xd_ExtPtfm) - UB(1:1) = ubound(InData%xd_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_PackDiscState(RF, InData%xd_ExtPtfm(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_ExtPtfm)) - if (allocated(InData%z_ExtPtfm)) then - call RegPackBounds(RF, 1, lbound(InData%z_ExtPtfm), ubound(InData%z_ExtPtfm)) - LB(1:1) = lbound(InData%z_ExtPtfm) - UB(1:1) = ubound(InData%z_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_PackConstrState(RF, InData%z_ExtPtfm(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_ExtPtfm)) - if (allocated(InData%OtherSt_ExtPtfm)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_ExtPtfm), ubound(InData%OtherSt_ExtPtfm)) - LB(1:1) = lbound(InData%OtherSt_ExtPtfm) - UB(1:1) = ubound(InData%OtherSt_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_PackOtherState(RF, InData%OtherSt_ExtPtfm(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_ExtPtfm)) - if (allocated(InData%u_ExtPtfm)) then - call RegPackBounds(RF, 1, lbound(InData%u_ExtPtfm), ubound(InData%u_ExtPtfm)) - LB(1:1) = lbound(InData%u_ExtPtfm) - UB(1:1) = ubound(InData%u_ExtPtfm) - do i1 = LB(1), UB(1) - call ExtPtfm_PackInput(RF, InData%u_ExtPtfm(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_HD)) - if (allocated(InData%x_HD)) then - call RegPackBounds(RF, 1, lbound(InData%x_HD), ubound(InData%x_HD)) - LB(1:1) = lbound(InData%x_HD) - UB(1:1) = ubound(InData%x_HD) - do i1 = LB(1), UB(1) - call HydroDyn_PackContState(RF, InData%x_HD(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_HD)) - if (allocated(InData%xd_HD)) then - call RegPackBounds(RF, 1, lbound(InData%xd_HD), ubound(InData%xd_HD)) - LB(1:1) = lbound(InData%xd_HD) - UB(1:1) = ubound(InData%xd_HD) - do i1 = LB(1), UB(1) - call HydroDyn_PackDiscState(RF, InData%xd_HD(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_HD)) - if (allocated(InData%z_HD)) then - call RegPackBounds(RF, 1, lbound(InData%z_HD), ubound(InData%z_HD)) - LB(1:1) = lbound(InData%z_HD) - UB(1:1) = ubound(InData%z_HD) - do i1 = LB(1), UB(1) - call HydroDyn_PackConstrState(RF, InData%z_HD(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_HD)) - if (allocated(InData%OtherSt_HD)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_HD), ubound(InData%OtherSt_HD)) - LB(1:1) = lbound(InData%OtherSt_HD) - UB(1:1) = ubound(InData%OtherSt_HD) - do i1 = LB(1), UB(1) - call HydroDyn_PackOtherState(RF, InData%OtherSt_HD(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_HD)) - if (allocated(InData%u_HD)) then - call RegPackBounds(RF, 1, lbound(InData%u_HD), ubound(InData%u_HD)) - LB(1:1) = lbound(InData%u_HD) - UB(1:1) = ubound(InData%u_HD) - do i1 = LB(1), UB(1) - call HydroDyn_PackInput(RF, InData%u_HD(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_SeaSt)) - if (allocated(InData%x_SeaSt)) then - call RegPackBounds(RF, 1, lbound(InData%x_SeaSt), ubound(InData%x_SeaSt)) - LB(1:1) = lbound(InData%x_SeaSt) - UB(1:1) = ubound(InData%x_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_PackContState(RF, InData%x_SeaSt(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_SeaSt)) - if (allocated(InData%xd_SeaSt)) then - call RegPackBounds(RF, 1, lbound(InData%xd_SeaSt), ubound(InData%xd_SeaSt)) - LB(1:1) = lbound(InData%xd_SeaSt) - UB(1:1) = ubound(InData%xd_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_PackDiscState(RF, InData%xd_SeaSt(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_SeaSt)) - if (allocated(InData%z_SeaSt)) then - call RegPackBounds(RF, 1, lbound(InData%z_SeaSt), ubound(InData%z_SeaSt)) - LB(1:1) = lbound(InData%z_SeaSt) - UB(1:1) = ubound(InData%z_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_PackConstrState(RF, InData%z_SeaSt(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_SeaSt)) - if (allocated(InData%OtherSt_SeaSt)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_SeaSt), ubound(InData%OtherSt_SeaSt)) - LB(1:1) = lbound(InData%OtherSt_SeaSt) - UB(1:1) = ubound(InData%OtherSt_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_PackOtherState(RF, InData%OtherSt_SeaSt(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_SeaSt)) - if (allocated(InData%u_SeaSt)) then - call RegPackBounds(RF, 1, lbound(InData%u_SeaSt), ubound(InData%u_SeaSt)) - LB(1:1) = lbound(InData%u_SeaSt) - UB(1:1) = ubound(InData%u_SeaSt) - do i1 = LB(1), UB(1) - call SeaSt_PackInput(RF, InData%u_SeaSt(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_IceF)) - if (allocated(InData%x_IceF)) then - call RegPackBounds(RF, 1, lbound(InData%x_IceF), ubound(InData%x_IceF)) - LB(1:1) = lbound(InData%x_IceF) - UB(1:1) = ubound(InData%x_IceF) - do i1 = LB(1), UB(1) - call IceFloe_PackContState(RF, InData%x_IceF(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_IceF)) - if (allocated(InData%xd_IceF)) then - call RegPackBounds(RF, 1, lbound(InData%xd_IceF), ubound(InData%xd_IceF)) - LB(1:1) = lbound(InData%xd_IceF) - UB(1:1) = ubound(InData%xd_IceF) - do i1 = LB(1), UB(1) - call IceFloe_PackDiscState(RF, InData%xd_IceF(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_IceF)) - if (allocated(InData%z_IceF)) then - call RegPackBounds(RF, 1, lbound(InData%z_IceF), ubound(InData%z_IceF)) - LB(1:1) = lbound(InData%z_IceF) - UB(1:1) = ubound(InData%z_IceF) - do i1 = LB(1), UB(1) - call IceFloe_PackConstrState(RF, InData%z_IceF(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_IceF)) - if (allocated(InData%OtherSt_IceF)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_IceF), ubound(InData%OtherSt_IceF)) - LB(1:1) = lbound(InData%OtherSt_IceF) - UB(1:1) = ubound(InData%OtherSt_IceF) - do i1 = LB(1), UB(1) - call IceFloe_PackOtherState(RF, InData%OtherSt_IceF(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_IceF)) - if (allocated(InData%u_IceF)) then - call RegPackBounds(RF, 1, lbound(InData%u_IceF), ubound(InData%u_IceF)) - LB(1:1) = lbound(InData%u_IceF) - UB(1:1) = ubound(InData%u_IceF) - do i1 = LB(1), UB(1) - call IceFloe_PackInput(RF, InData%u_IceF(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_MAP)) - if (allocated(InData%x_MAP)) then - call RegPackBounds(RF, 1, lbound(InData%x_MAP), ubound(InData%x_MAP)) - LB(1:1) = lbound(InData%x_MAP) - UB(1:1) = ubound(InData%x_MAP) - do i1 = LB(1), UB(1) - call MAP_PackContState(RF, InData%x_MAP(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_MAP)) - if (allocated(InData%xd_MAP)) then - call RegPackBounds(RF, 1, lbound(InData%xd_MAP), ubound(InData%xd_MAP)) - LB(1:1) = lbound(InData%xd_MAP) - UB(1:1) = ubound(InData%xd_MAP) - do i1 = LB(1), UB(1) - call MAP_PackDiscState(RF, InData%xd_MAP(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_MAP)) - if (allocated(InData%z_MAP)) then - call RegPackBounds(RF, 1, lbound(InData%z_MAP), ubound(InData%z_MAP)) - LB(1:1) = lbound(InData%z_MAP) - UB(1:1) = ubound(InData%z_MAP) - do i1 = LB(1), UB(1) - call MAP_PackConstrState(RF, InData%z_MAP(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_MAP)) - if (allocated(InData%u_MAP)) then - call RegPackBounds(RF, 1, lbound(InData%u_MAP), ubound(InData%u_MAP)) - LB(1:1) = lbound(InData%u_MAP) - UB(1:1) = ubound(InData%u_MAP) - do i1 = LB(1), UB(1) - call MAP_PackInput(RF, InData%u_MAP(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_FEAM)) - if (allocated(InData%x_FEAM)) then - call RegPackBounds(RF, 1, lbound(InData%x_FEAM), ubound(InData%x_FEAM)) - LB(1:1) = lbound(InData%x_FEAM) - UB(1:1) = ubound(InData%x_FEAM) - do i1 = LB(1), UB(1) - call FEAM_PackContState(RF, InData%x_FEAM(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_FEAM)) - if (allocated(InData%xd_FEAM)) then - call RegPackBounds(RF, 1, lbound(InData%xd_FEAM), ubound(InData%xd_FEAM)) - LB(1:1) = lbound(InData%xd_FEAM) - UB(1:1) = ubound(InData%xd_FEAM) - do i1 = LB(1), UB(1) - call FEAM_PackDiscState(RF, InData%xd_FEAM(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_FEAM)) - if (allocated(InData%z_FEAM)) then - call RegPackBounds(RF, 1, lbound(InData%z_FEAM), ubound(InData%z_FEAM)) - LB(1:1) = lbound(InData%z_FEAM) - UB(1:1) = ubound(InData%z_FEAM) - do i1 = LB(1), UB(1) - call FEAM_PackConstrState(RF, InData%z_FEAM(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_FEAM)) - if (allocated(InData%OtherSt_FEAM)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_FEAM), ubound(InData%OtherSt_FEAM)) - LB(1:1) = lbound(InData%OtherSt_FEAM) - UB(1:1) = ubound(InData%OtherSt_FEAM) - do i1 = LB(1), UB(1) - call FEAM_PackOtherState(RF, InData%OtherSt_FEAM(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_FEAM)) - if (allocated(InData%u_FEAM)) then - call RegPackBounds(RF, 1, lbound(InData%u_FEAM), ubound(InData%u_FEAM)) - LB(1:1) = lbound(InData%u_FEAM) - UB(1:1) = ubound(InData%u_FEAM) - do i1 = LB(1), UB(1) - call FEAM_PackInput(RF, InData%u_FEAM(i1)) - end do - end if - call RegPack(RF, allocated(InData%x_MD)) - if (allocated(InData%x_MD)) then - call RegPackBounds(RF, 1, lbound(InData%x_MD), ubound(InData%x_MD)) - LB(1:1) = lbound(InData%x_MD) - UB(1:1) = ubound(InData%x_MD) - do i1 = LB(1), UB(1) - call MD_PackContState(RF, InData%x_MD(i1)) - end do - end if - call RegPack(RF, allocated(InData%xd_MD)) - if (allocated(InData%xd_MD)) then - call RegPackBounds(RF, 1, lbound(InData%xd_MD), ubound(InData%xd_MD)) - LB(1:1) = lbound(InData%xd_MD) - UB(1:1) = ubound(InData%xd_MD) - do i1 = LB(1), UB(1) - call MD_PackDiscState(RF, InData%xd_MD(i1)) - end do - end if - call RegPack(RF, allocated(InData%z_MD)) - if (allocated(InData%z_MD)) then - call RegPackBounds(RF, 1, lbound(InData%z_MD), ubound(InData%z_MD)) - LB(1:1) = lbound(InData%z_MD) - UB(1:1) = ubound(InData%z_MD) - do i1 = LB(1), UB(1) - call MD_PackConstrState(RF, InData%z_MD(i1)) - end do - end if - call RegPack(RF, allocated(InData%OtherSt_MD)) - if (allocated(InData%OtherSt_MD)) then - call RegPackBounds(RF, 1, lbound(InData%OtherSt_MD), ubound(InData%OtherSt_MD)) - LB(1:1) = lbound(InData%OtherSt_MD) - UB(1:1) = ubound(InData%OtherSt_MD) - do i1 = LB(1), UB(1) - call MD_PackOtherState(RF, InData%OtherSt_MD(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_MD)) - if (allocated(InData%u_MD)) then - call RegPackBounds(RF, 1, lbound(InData%u_MD), ubound(InData%u_MD)) - LB(1:1) = lbound(InData%u_MD) - UB(1:1) = ubound(InData%u_MD) - do i1 = LB(1), UB(1) - call MD_PackInput(RF, InData%u_MD(i1)) - end do - end if - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackLinStateSave(RF, OutData) - type(RegFile), intent(inout) :: RF - type(FAST_LinStateSave), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackLinStateSave' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%x_IceD)) deallocate(OutData%x_IceD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_IceD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_IceD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackContState(RF, OutData%x_IceD(i1,i2)) ! x_IceD - end do - end do - end if - if (allocated(OutData%xd_IceD)) deallocate(OutData%xd_IceD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_IceD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_IceD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackDiscState(RF, OutData%xd_IceD(i1,i2)) ! xd_IceD - end do - end do - end if - if (allocated(OutData%z_IceD)) deallocate(OutData%z_IceD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_IceD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_IceD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackConstrState(RF, OutData%z_IceD(i1,i2)) ! z_IceD - end do - end do - end if - if (allocated(OutData%OtherSt_IceD)) deallocate(OutData%OtherSt_IceD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_IceD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_IceD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackOtherState(RF, OutData%OtherSt_IceD(i1,i2)) ! OtherSt_IceD - end do - end do - end if - if (allocated(OutData%u_IceD)) deallocate(OutData%u_IceD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_IceD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_IceD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackInput(RF, OutData%u_IceD(i1,i2)) ! u_IceD - end do - end do - end if - if (allocated(OutData%x_BD)) deallocate(OutData%x_BD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_BD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_BD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_UnpackContState(RF, OutData%x_BD(i1,i2)) ! x_BD - end do - end do - end if - if (allocated(OutData%xd_BD)) deallocate(OutData%xd_BD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_BD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_BD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_UnpackDiscState(RF, OutData%xd_BD(i1,i2)) ! xd_BD - end do - end do - end if - if (allocated(OutData%z_BD)) deallocate(OutData%z_BD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_BD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_BD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_UnpackConstrState(RF, OutData%z_BD(i1,i2)) ! z_BD - end do - end do - end if - if (allocated(OutData%OtherSt_BD)) deallocate(OutData%OtherSt_BD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_BD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_BD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_UnpackOtherState(RF, OutData%OtherSt_BD(i1,i2)) ! OtherSt_BD - end do - end do - end if - if (allocated(OutData%u_BD)) deallocate(OutData%u_BD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_BD(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_BD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_UnpackInput(RF, OutData%u_BD(i1,i2)) ! u_BD - end do - end do - end if - if (allocated(OutData%x_ED)) deallocate(OutData%x_ED) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_ED(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_ED.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ED_UnpackContState(RF, OutData%x_ED(i1)) ! x_ED - end do - end if - if (allocated(OutData%xd_ED)) deallocate(OutData%xd_ED) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_ED(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_ED.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ED_UnpackDiscState(RF, OutData%xd_ED(i1)) ! xd_ED - end do - end if - if (allocated(OutData%z_ED)) deallocate(OutData%z_ED) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_ED(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_ED.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ED_UnpackConstrState(RF, OutData%z_ED(i1)) ! z_ED - end do - end if - if (allocated(OutData%OtherSt_ED)) deallocate(OutData%OtherSt_ED) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_ED(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_ED.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ED_UnpackOtherState(RF, OutData%OtherSt_ED(i1)) ! OtherSt_ED - end do - end if - if (allocated(OutData%u_ED)) deallocate(OutData%u_ED) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_ED(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_ED.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ED_UnpackInput(RF, OutData%u_ED(i1)) ! u_ED - end do - end if - if (allocated(OutData%x_SrvD)) deallocate(OutData%x_SrvD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_SrvD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_SrvD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SrvD_UnpackContState(RF, OutData%x_SrvD(i1)) ! x_SrvD - end do - end if - if (allocated(OutData%xd_SrvD)) deallocate(OutData%xd_SrvD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_SrvD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_SrvD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SrvD_UnpackDiscState(RF, OutData%xd_SrvD(i1)) ! xd_SrvD - end do - end if - if (allocated(OutData%z_SrvD)) deallocate(OutData%z_SrvD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_SrvD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_SrvD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SrvD_UnpackConstrState(RF, OutData%z_SrvD(i1)) ! z_SrvD - end do - end if - if (allocated(OutData%OtherSt_SrvD)) deallocate(OutData%OtherSt_SrvD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_SrvD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_SrvD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SrvD_UnpackOtherState(RF, OutData%OtherSt_SrvD(i1)) ! OtherSt_SrvD - end do - end if - if (allocated(OutData%u_SrvD)) deallocate(OutData%u_SrvD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_SrvD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_SrvD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SrvD_UnpackInput(RF, OutData%u_SrvD(i1)) ! u_SrvD - end do - end if - if (allocated(OutData%x_AD)) deallocate(OutData%x_AD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_AD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_AD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call AD_UnpackContState(RF, OutData%x_AD(i1)) ! x_AD - end do - end if - if (allocated(OutData%xd_AD)) deallocate(OutData%xd_AD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_AD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_AD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call AD_UnpackDiscState(RF, OutData%xd_AD(i1)) ! xd_AD - end do - end if - if (allocated(OutData%z_AD)) deallocate(OutData%z_AD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_AD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_AD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call AD_UnpackConstrState(RF, OutData%z_AD(i1)) ! z_AD - end do - end if - if (allocated(OutData%OtherSt_AD)) deallocate(OutData%OtherSt_AD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_AD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_AD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call AD_UnpackOtherState(RF, OutData%OtherSt_AD(i1)) ! OtherSt_AD - end do - end if - if (allocated(OutData%u_AD)) deallocate(OutData%u_AD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_AD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_AD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call AD_UnpackInput(RF, OutData%u_AD(i1)) ! u_AD - end do - end if - if (allocated(OutData%x_IfW)) deallocate(OutData%x_IfW) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_IfW(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call InflowWind_UnpackContState(RF, OutData%x_IfW(i1)) ! x_IfW - end do - end if - if (allocated(OutData%xd_IfW)) deallocate(OutData%xd_IfW) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_IfW(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call InflowWind_UnpackDiscState(RF, OutData%xd_IfW(i1)) ! xd_IfW - end do - end if - if (allocated(OutData%z_IfW)) deallocate(OutData%z_IfW) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_IfW(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call InflowWind_UnpackConstrState(RF, OutData%z_IfW(i1)) ! z_IfW - end do - end if - if (allocated(OutData%OtherSt_IfW)) deallocate(OutData%OtherSt_IfW) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_IfW(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call InflowWind_UnpackOtherState(RF, OutData%OtherSt_IfW(i1)) ! OtherSt_IfW - end do - end if - if (allocated(OutData%u_IfW)) deallocate(OutData%u_IfW) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_IfW(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_IfW.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call InflowWind_UnpackInput(RF, OutData%u_IfW(i1)) ! u_IfW - end do - end if - if (allocated(OutData%x_SD)) deallocate(OutData%x_SD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_SD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_SD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SD_UnpackContState(RF, OutData%x_SD(i1)) ! x_SD - end do - end if - if (allocated(OutData%xd_SD)) deallocate(OutData%xd_SD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_SD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_SD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SD_UnpackDiscState(RF, OutData%xd_SD(i1)) ! xd_SD - end do - end if - if (allocated(OutData%z_SD)) deallocate(OutData%z_SD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_SD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_SD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SD_UnpackConstrState(RF, OutData%z_SD(i1)) ! z_SD - end do - end if - if (allocated(OutData%OtherSt_SD)) deallocate(OutData%OtherSt_SD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_SD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_SD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SD_UnpackOtherState(RF, OutData%OtherSt_SD(i1)) ! OtherSt_SD - end do - end if - if (allocated(OutData%u_SD)) deallocate(OutData%u_SD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_SD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_SD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SD_UnpackInput(RF, OutData%u_SD(i1)) ! u_SD - end do - end if - if (allocated(OutData%x_ExtPtfm)) deallocate(OutData%x_ExtPtfm) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_ExtPtfm(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_ExtPtfm.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ExtPtfm_UnpackContState(RF, OutData%x_ExtPtfm(i1)) ! x_ExtPtfm - end do - end if - if (allocated(OutData%xd_ExtPtfm)) deallocate(OutData%xd_ExtPtfm) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_ExtPtfm(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_ExtPtfm.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ExtPtfm_UnpackDiscState(RF, OutData%xd_ExtPtfm(i1)) ! xd_ExtPtfm - end do - end if - if (allocated(OutData%z_ExtPtfm)) deallocate(OutData%z_ExtPtfm) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_ExtPtfm(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_ExtPtfm.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ExtPtfm_UnpackConstrState(RF, OutData%z_ExtPtfm(i1)) ! z_ExtPtfm - end do - end if - if (allocated(OutData%OtherSt_ExtPtfm)) deallocate(OutData%OtherSt_ExtPtfm) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_ExtPtfm(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_ExtPtfm.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ExtPtfm_UnpackOtherState(RF, OutData%OtherSt_ExtPtfm(i1)) ! OtherSt_ExtPtfm - end do - end if - if (allocated(OutData%u_ExtPtfm)) deallocate(OutData%u_ExtPtfm) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_ExtPtfm(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_ExtPtfm.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ExtPtfm_UnpackInput(RF, OutData%u_ExtPtfm(i1)) ! u_ExtPtfm - end do - end if - if (allocated(OutData%x_HD)) deallocate(OutData%x_HD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_HD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_HD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call HydroDyn_UnpackContState(RF, OutData%x_HD(i1)) ! x_HD - end do - end if - if (allocated(OutData%xd_HD)) deallocate(OutData%xd_HD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_HD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_HD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call HydroDyn_UnpackDiscState(RF, OutData%xd_HD(i1)) ! xd_HD - end do - end if - if (allocated(OutData%z_HD)) deallocate(OutData%z_HD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_HD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_HD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call HydroDyn_UnpackConstrState(RF, OutData%z_HD(i1)) ! z_HD - end do - end if - if (allocated(OutData%OtherSt_HD)) deallocate(OutData%OtherSt_HD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_HD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_HD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call HydroDyn_UnpackOtherState(RF, OutData%OtherSt_HD(i1)) ! OtherSt_HD - end do - end if - if (allocated(OutData%u_HD)) deallocate(OutData%u_HD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_HD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_HD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call HydroDyn_UnpackInput(RF, OutData%u_HD(i1)) ! u_HD - end do - end if - if (allocated(OutData%x_SeaSt)) deallocate(OutData%x_SeaSt) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_SeaSt(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_SeaSt.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SeaSt_UnpackContState(RF, OutData%x_SeaSt(i1)) ! x_SeaSt - end do - end if - if (allocated(OutData%xd_SeaSt)) deallocate(OutData%xd_SeaSt) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_SeaSt(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_SeaSt.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SeaSt_UnpackDiscState(RF, OutData%xd_SeaSt(i1)) ! xd_SeaSt - end do - end if - if (allocated(OutData%z_SeaSt)) deallocate(OutData%z_SeaSt) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_SeaSt(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_SeaSt.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SeaSt_UnpackConstrState(RF, OutData%z_SeaSt(i1)) ! z_SeaSt - end do - end if - if (allocated(OutData%OtherSt_SeaSt)) deallocate(OutData%OtherSt_SeaSt) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_SeaSt(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_SeaSt.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SeaSt_UnpackOtherState(RF, OutData%OtherSt_SeaSt(i1)) ! OtherSt_SeaSt - end do - end if - if (allocated(OutData%u_SeaSt)) deallocate(OutData%u_SeaSt) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_SeaSt(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_SeaSt.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SeaSt_UnpackInput(RF, OutData%u_SeaSt(i1)) ! u_SeaSt - end do - end if - if (allocated(OutData%x_IceF)) deallocate(OutData%x_IceF) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_IceF(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_IceF.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call IceFloe_UnpackContState(RF, OutData%x_IceF(i1)) ! x_IceF - end do - end if - if (allocated(OutData%xd_IceF)) deallocate(OutData%xd_IceF) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_IceF(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_IceF.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call IceFloe_UnpackDiscState(RF, OutData%xd_IceF(i1)) ! xd_IceF - end do - end if - if (allocated(OutData%z_IceF)) deallocate(OutData%z_IceF) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_IceF(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_IceF.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call IceFloe_UnpackConstrState(RF, OutData%z_IceF(i1)) ! z_IceF - end do - end if - if (allocated(OutData%OtherSt_IceF)) deallocate(OutData%OtherSt_IceF) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_IceF(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_IceF.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call IceFloe_UnpackOtherState(RF, OutData%OtherSt_IceF(i1)) ! OtherSt_IceF - end do - end if - if (allocated(OutData%u_IceF)) deallocate(OutData%u_IceF) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_IceF(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_IceF.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call IceFloe_UnpackInput(RF, OutData%u_IceF(i1)) ! u_IceF - end do - end if - if (allocated(OutData%x_MAP)) deallocate(OutData%x_MAP) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_MAP(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_MAP.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MAP_UnpackContState(RF, OutData%x_MAP(i1)) ! x_MAP - end do - end if - if (allocated(OutData%xd_MAP)) deallocate(OutData%xd_MAP) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_MAP(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_MAP.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MAP_UnpackDiscState(RF, OutData%xd_MAP(i1)) ! xd_MAP - end do - end if - if (allocated(OutData%z_MAP)) deallocate(OutData%z_MAP) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_MAP(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_MAP.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MAP_UnpackConstrState(RF, OutData%z_MAP(i1)) ! z_MAP - end do - end if - if (allocated(OutData%u_MAP)) deallocate(OutData%u_MAP) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_MAP(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_MAP.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MAP_UnpackInput(RF, OutData%u_MAP(i1)) ! u_MAP - end do - end if - if (allocated(OutData%x_FEAM)) deallocate(OutData%x_FEAM) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_FEAM(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_FEAM.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call FEAM_UnpackContState(RF, OutData%x_FEAM(i1)) ! x_FEAM - end do - end if - if (allocated(OutData%xd_FEAM)) deallocate(OutData%xd_FEAM) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_FEAM(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_FEAM.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call FEAM_UnpackDiscState(RF, OutData%xd_FEAM(i1)) ! xd_FEAM - end do - end if - if (allocated(OutData%z_FEAM)) deallocate(OutData%z_FEAM) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_FEAM(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_FEAM.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call FEAM_UnpackConstrState(RF, OutData%z_FEAM(i1)) ! z_FEAM - end do - end if - if (allocated(OutData%OtherSt_FEAM)) deallocate(OutData%OtherSt_FEAM) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_FEAM(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_FEAM.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call FEAM_UnpackOtherState(RF, OutData%OtherSt_FEAM(i1)) ! OtherSt_FEAM - end do - end if - if (allocated(OutData%u_FEAM)) deallocate(OutData%u_FEAM) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_FEAM(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_FEAM.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call FEAM_UnpackInput(RF, OutData%u_FEAM(i1)) ! u_FEAM - end do - end if - if (allocated(OutData%x_MD)) deallocate(OutData%x_MD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x_MD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x_MD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackContState(RF, OutData%x_MD(i1)) ! x_MD - end do - end if - if (allocated(OutData%xd_MD)) deallocate(OutData%xd_MD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd_MD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd_MD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackDiscState(RF, OutData%xd_MD(i1)) ! xd_MD - end do - end if - if (allocated(OutData%z_MD)) deallocate(OutData%z_MD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z_MD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z_MD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackConstrState(RF, OutData%z_MD(i1)) ! z_MD - end do - end if - if (allocated(OutData%OtherSt_MD)) deallocate(OutData%OtherSt_MD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt_MD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt_MD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackOtherState(RF, OutData%OtherSt_MD(i1)) ! OtherSt_MD - end do - end if - if (allocated(OutData%u_MD)) deallocate(OutData%u_MD) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_MD(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_MD.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call MD_UnpackInput(RF, OutData%u_MD(i1)) ! u_MD - end do - end if -end subroutine - -subroutine FAST_CopyLinType(SrcLinTypeData, DstLinTypeData, CtrlCode, ErrStat, ErrMsg) - type(FAST_LinType), intent(in) :: SrcLinTypeData - type(FAST_LinType), intent(inout) :: DstLinTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(*), parameter :: RoutineName = 'FAST_CopyLinType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcLinTypeData%Names_u)) then - LB(1:1) = lbound(SrcLinTypeData%Names_u) - UB(1:1) = ubound(SrcLinTypeData%Names_u) - if (.not. allocated(DstLinTypeData%Names_u)) then - allocate(DstLinTypeData%Names_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%Names_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%Names_u = SrcLinTypeData%Names_u - end if - if (allocated(SrcLinTypeData%Names_y)) then - LB(1:1) = lbound(SrcLinTypeData%Names_y) - UB(1:1) = ubound(SrcLinTypeData%Names_y) - if (.not. allocated(DstLinTypeData%Names_y)) then - allocate(DstLinTypeData%Names_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%Names_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%Names_y = SrcLinTypeData%Names_y - end if - if (allocated(SrcLinTypeData%Names_x)) then - LB(1:1) = lbound(SrcLinTypeData%Names_x) - UB(1:1) = ubound(SrcLinTypeData%Names_x) - if (.not. allocated(DstLinTypeData%Names_x)) then - allocate(DstLinTypeData%Names_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%Names_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%Names_x = SrcLinTypeData%Names_x - end if - if (allocated(SrcLinTypeData%Names_xd)) then - LB(1:1) = lbound(SrcLinTypeData%Names_xd) - UB(1:1) = ubound(SrcLinTypeData%Names_xd) - if (.not. allocated(DstLinTypeData%Names_xd)) then - allocate(DstLinTypeData%Names_xd(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%Names_xd.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%Names_xd = SrcLinTypeData%Names_xd - end if - if (allocated(SrcLinTypeData%Names_z)) then - LB(1:1) = lbound(SrcLinTypeData%Names_z) - UB(1:1) = ubound(SrcLinTypeData%Names_z) - if (.not. allocated(DstLinTypeData%Names_z)) then - allocate(DstLinTypeData%Names_z(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%Names_z.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%Names_z = SrcLinTypeData%Names_z - end if - if (allocated(SrcLinTypeData%op_u)) then - LB(1:1) = lbound(SrcLinTypeData%op_u) - UB(1:1) = ubound(SrcLinTypeData%op_u) - if (.not. allocated(DstLinTypeData%op_u)) then - allocate(DstLinTypeData%op_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%op_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%op_u = SrcLinTypeData%op_u - end if - if (allocated(SrcLinTypeData%op_y)) then - LB(1:1) = lbound(SrcLinTypeData%op_y) - UB(1:1) = ubound(SrcLinTypeData%op_y) - if (.not. allocated(DstLinTypeData%op_y)) then - allocate(DstLinTypeData%op_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%op_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%op_y = SrcLinTypeData%op_y - end if - if (allocated(SrcLinTypeData%op_x)) then - LB(1:1) = lbound(SrcLinTypeData%op_x) - UB(1:1) = ubound(SrcLinTypeData%op_x) - if (.not. allocated(DstLinTypeData%op_x)) then - allocate(DstLinTypeData%op_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%op_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%op_x = SrcLinTypeData%op_x - end if - if (allocated(SrcLinTypeData%op_dx)) then - LB(1:1) = lbound(SrcLinTypeData%op_dx) - UB(1:1) = ubound(SrcLinTypeData%op_dx) - if (.not. allocated(DstLinTypeData%op_dx)) then - allocate(DstLinTypeData%op_dx(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%op_dx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%op_dx = SrcLinTypeData%op_dx - end if - if (allocated(SrcLinTypeData%op_xd)) then - LB(1:1) = lbound(SrcLinTypeData%op_xd) - UB(1:1) = ubound(SrcLinTypeData%op_xd) - if (.not. allocated(DstLinTypeData%op_xd)) then - allocate(DstLinTypeData%op_xd(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%op_xd.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%op_xd = SrcLinTypeData%op_xd - end if - if (allocated(SrcLinTypeData%op_z)) then - LB(1:1) = lbound(SrcLinTypeData%op_z) - UB(1:1) = ubound(SrcLinTypeData%op_z) - if (.not. allocated(DstLinTypeData%op_z)) then - allocate(DstLinTypeData%op_z(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%op_z.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%op_z = SrcLinTypeData%op_z - end if - if (allocated(SrcLinTypeData%op_x_eig_mag)) then - LB(1:1) = lbound(SrcLinTypeData%op_x_eig_mag) - UB(1:1) = ubound(SrcLinTypeData%op_x_eig_mag) - if (.not. allocated(DstLinTypeData%op_x_eig_mag)) then - allocate(DstLinTypeData%op_x_eig_mag(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%op_x_eig_mag.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%op_x_eig_mag = SrcLinTypeData%op_x_eig_mag - end if - if (allocated(SrcLinTypeData%op_x_eig_phase)) then - LB(1:1) = lbound(SrcLinTypeData%op_x_eig_phase) - UB(1:1) = ubound(SrcLinTypeData%op_x_eig_phase) - if (.not. allocated(DstLinTypeData%op_x_eig_phase)) then - allocate(DstLinTypeData%op_x_eig_phase(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%op_x_eig_phase.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%op_x_eig_phase = SrcLinTypeData%op_x_eig_phase - end if - if (allocated(SrcLinTypeData%Use_u)) then - LB(1:1) = lbound(SrcLinTypeData%Use_u) - UB(1:1) = ubound(SrcLinTypeData%Use_u) - if (.not. allocated(DstLinTypeData%Use_u)) then - allocate(DstLinTypeData%Use_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%Use_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%Use_u = SrcLinTypeData%Use_u - end if - if (allocated(SrcLinTypeData%Use_y)) then - LB(1:1) = lbound(SrcLinTypeData%Use_y) - UB(1:1) = ubound(SrcLinTypeData%Use_y) - if (.not. allocated(DstLinTypeData%Use_y)) then - allocate(DstLinTypeData%Use_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%Use_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%Use_y = SrcLinTypeData%Use_y - end if - if (allocated(SrcLinTypeData%A)) then - LB(1:2) = lbound(SrcLinTypeData%A) - UB(1:2) = ubound(SrcLinTypeData%A) - if (.not. allocated(DstLinTypeData%A)) then - allocate(DstLinTypeData%A(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%A.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%A = SrcLinTypeData%A - end if - if (allocated(SrcLinTypeData%B)) then - LB(1:2) = lbound(SrcLinTypeData%B) - UB(1:2) = ubound(SrcLinTypeData%B) - if (.not. allocated(DstLinTypeData%B)) then - allocate(DstLinTypeData%B(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%B.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%B = SrcLinTypeData%B - end if - if (allocated(SrcLinTypeData%C)) then - LB(1:2) = lbound(SrcLinTypeData%C) - UB(1:2) = ubound(SrcLinTypeData%C) - if (.not. allocated(DstLinTypeData%C)) then - allocate(DstLinTypeData%C(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%C.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%C = SrcLinTypeData%C - end if - if (allocated(SrcLinTypeData%D)) then - LB(1:2) = lbound(SrcLinTypeData%D) - UB(1:2) = ubound(SrcLinTypeData%D) - if (.not. allocated(DstLinTypeData%D)) then - allocate(DstLinTypeData%D(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%D.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%D = SrcLinTypeData%D - end if - if (allocated(SrcLinTypeData%StateRotation)) then - LB(1:2) = lbound(SrcLinTypeData%StateRotation) - UB(1:2) = ubound(SrcLinTypeData%StateRotation) - if (.not. allocated(DstLinTypeData%StateRotation)) then - allocate(DstLinTypeData%StateRotation(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%StateRotation.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%StateRotation = SrcLinTypeData%StateRotation - end if - if (allocated(SrcLinTypeData%StateRel_x)) then - LB(1:2) = lbound(SrcLinTypeData%StateRel_x) - UB(1:2) = ubound(SrcLinTypeData%StateRel_x) - if (.not. allocated(DstLinTypeData%StateRel_x)) then - allocate(DstLinTypeData%StateRel_x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%StateRel_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%StateRel_x = SrcLinTypeData%StateRel_x - end if - if (allocated(SrcLinTypeData%StateRel_xdot)) then - LB(1:2) = lbound(SrcLinTypeData%StateRel_xdot) - UB(1:2) = ubound(SrcLinTypeData%StateRel_xdot) - if (.not. allocated(DstLinTypeData%StateRel_xdot)) then - allocate(DstLinTypeData%StateRel_xdot(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%StateRel_xdot.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%StateRel_xdot = SrcLinTypeData%StateRel_xdot - end if - if (allocated(SrcLinTypeData%IsLoad_u)) then - LB(1:1) = lbound(SrcLinTypeData%IsLoad_u) - UB(1:1) = ubound(SrcLinTypeData%IsLoad_u) - if (.not. allocated(DstLinTypeData%IsLoad_u)) then - allocate(DstLinTypeData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%IsLoad_u = SrcLinTypeData%IsLoad_u - end if - if (allocated(SrcLinTypeData%RotFrame_u)) then - LB(1:1) = lbound(SrcLinTypeData%RotFrame_u) - UB(1:1) = ubound(SrcLinTypeData%RotFrame_u) - if (.not. allocated(DstLinTypeData%RotFrame_u)) then - allocate(DstLinTypeData%RotFrame_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%RotFrame_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%RotFrame_u = SrcLinTypeData%RotFrame_u - end if - if (allocated(SrcLinTypeData%RotFrame_y)) then - LB(1:1) = lbound(SrcLinTypeData%RotFrame_y) - UB(1:1) = ubound(SrcLinTypeData%RotFrame_y) - if (.not. allocated(DstLinTypeData%RotFrame_y)) then - allocate(DstLinTypeData%RotFrame_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%RotFrame_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%RotFrame_y = SrcLinTypeData%RotFrame_y - end if - if (allocated(SrcLinTypeData%RotFrame_x)) then - LB(1:1) = lbound(SrcLinTypeData%RotFrame_x) - UB(1:1) = ubound(SrcLinTypeData%RotFrame_x) - if (.not. allocated(DstLinTypeData%RotFrame_x)) then - allocate(DstLinTypeData%RotFrame_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%RotFrame_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%RotFrame_x = SrcLinTypeData%RotFrame_x - end if - if (allocated(SrcLinTypeData%RotFrame_z)) then - LB(1:1) = lbound(SrcLinTypeData%RotFrame_z) - UB(1:1) = ubound(SrcLinTypeData%RotFrame_z) - if (.not. allocated(DstLinTypeData%RotFrame_z)) then - allocate(DstLinTypeData%RotFrame_z(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%RotFrame_z.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%RotFrame_z = SrcLinTypeData%RotFrame_z - end if - if (allocated(SrcLinTypeData%DerivOrder_x)) then - LB(1:1) = lbound(SrcLinTypeData%DerivOrder_x) - UB(1:1) = ubound(SrcLinTypeData%DerivOrder_x) - if (.not. allocated(DstLinTypeData%DerivOrder_x)) then - allocate(DstLinTypeData%DerivOrder_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinTypeData%DerivOrder_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinTypeData%DerivOrder_x = SrcLinTypeData%DerivOrder_x - end if - DstLinTypeData%SizeLin = SrcLinTypeData%SizeLin - DstLinTypeData%LinStartIndx = SrcLinTypeData%LinStartIndx - DstLinTypeData%NumOutputs = SrcLinTypeData%NumOutputs -end subroutine - -subroutine FAST_DestroyLinType(LinTypeData, ErrStat, ErrMsg) - type(FAST_LinType), intent(inout) :: LinTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'FAST_DestroyLinType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(LinTypeData%Names_u)) then - deallocate(LinTypeData%Names_u) - end if - if (allocated(LinTypeData%Names_y)) then - deallocate(LinTypeData%Names_y) - end if - if (allocated(LinTypeData%Names_x)) then - deallocate(LinTypeData%Names_x) - end if - if (allocated(LinTypeData%Names_xd)) then - deallocate(LinTypeData%Names_xd) - end if - if (allocated(LinTypeData%Names_z)) then - deallocate(LinTypeData%Names_z) - end if - if (allocated(LinTypeData%op_u)) then - deallocate(LinTypeData%op_u) - end if - if (allocated(LinTypeData%op_y)) then - deallocate(LinTypeData%op_y) - end if - if (allocated(LinTypeData%op_x)) then - deallocate(LinTypeData%op_x) - end if - if (allocated(LinTypeData%op_dx)) then - deallocate(LinTypeData%op_dx) - end if - if (allocated(LinTypeData%op_xd)) then - deallocate(LinTypeData%op_xd) - end if - if (allocated(LinTypeData%op_z)) then - deallocate(LinTypeData%op_z) - end if - if (allocated(LinTypeData%op_x_eig_mag)) then - deallocate(LinTypeData%op_x_eig_mag) - end if - if (allocated(LinTypeData%op_x_eig_phase)) then - deallocate(LinTypeData%op_x_eig_phase) - end if - if (allocated(LinTypeData%Use_u)) then - deallocate(LinTypeData%Use_u) - end if - if (allocated(LinTypeData%Use_y)) then - deallocate(LinTypeData%Use_y) - end if - if (allocated(LinTypeData%A)) then - deallocate(LinTypeData%A) - end if - if (allocated(LinTypeData%B)) then - deallocate(LinTypeData%B) - end if - if (allocated(LinTypeData%C)) then - deallocate(LinTypeData%C) - end if - if (allocated(LinTypeData%D)) then - deallocate(LinTypeData%D) - end if - if (allocated(LinTypeData%StateRotation)) then - deallocate(LinTypeData%StateRotation) - end if - if (allocated(LinTypeData%StateRel_x)) then - deallocate(LinTypeData%StateRel_x) - end if - if (allocated(LinTypeData%StateRel_xdot)) then - deallocate(LinTypeData%StateRel_xdot) - end if - if (allocated(LinTypeData%IsLoad_u)) then - deallocate(LinTypeData%IsLoad_u) - end if - if (allocated(LinTypeData%RotFrame_u)) then - deallocate(LinTypeData%RotFrame_u) - end if - if (allocated(LinTypeData%RotFrame_y)) then - deallocate(LinTypeData%RotFrame_y) - end if - if (allocated(LinTypeData%RotFrame_x)) then - deallocate(LinTypeData%RotFrame_x) - end if - if (allocated(LinTypeData%RotFrame_z)) then - deallocate(LinTypeData%RotFrame_z) - end if - if (allocated(LinTypeData%DerivOrder_x)) then - deallocate(LinTypeData%DerivOrder_x) - end if -end subroutine - -subroutine FAST_PackLinType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(FAST_LinType), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackLinType' - if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%Names_u) - call RegPackAlloc(RF, InData%Names_y) - call RegPackAlloc(RF, InData%Names_x) - call RegPackAlloc(RF, InData%Names_xd) - call RegPackAlloc(RF, InData%Names_z) - call RegPackAlloc(RF, InData%op_u) - call RegPackAlloc(RF, InData%op_y) - call RegPackAlloc(RF, InData%op_x) - call RegPackAlloc(RF, InData%op_dx) - call RegPackAlloc(RF, InData%op_xd) - call RegPackAlloc(RF, InData%op_z) - call RegPackAlloc(RF, InData%op_x_eig_mag) - call RegPackAlloc(RF, InData%op_x_eig_phase) - call RegPackAlloc(RF, InData%Use_u) - call RegPackAlloc(RF, InData%Use_y) - call RegPackAlloc(RF, InData%A) - call RegPackAlloc(RF, InData%B) - call RegPackAlloc(RF, InData%C) - call RegPackAlloc(RF, InData%D) - call RegPackAlloc(RF, InData%StateRotation) - call RegPackAlloc(RF, InData%StateRel_x) - call RegPackAlloc(RF, InData%StateRel_xdot) - call RegPackAlloc(RF, InData%IsLoad_u) - call RegPackAlloc(RF, InData%RotFrame_u) - call RegPackAlloc(RF, InData%RotFrame_y) - call RegPackAlloc(RF, InData%RotFrame_x) - call RegPackAlloc(RF, InData%RotFrame_z) - call RegPackAlloc(RF, InData%DerivOrder_x) - call RegPack(RF, InData%SizeLin) - call RegPack(RF, InData%LinStartIndx) - call RegPack(RF, InData%NumOutputs) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackLinType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(FAST_LinType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackLinType' - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%Names_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Names_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Names_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Names_xd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Names_z); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%op_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%op_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%op_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%op_dx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%op_xd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%op_z); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%op_x_eig_mag); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%op_x_eig_phase); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Use_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Use_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%A); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%B); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%C); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%D); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%StateRotation); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%StateRel_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%StateRel_xdot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_z); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DerivOrder_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SizeLin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LinStartIndx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumOutputs); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyModLinType(SrcModLinTypeData, DstModLinTypeData, CtrlCode, ErrStat, ErrMsg) - type(FAST_ModLinType), intent(in) :: SrcModLinTypeData - type(FAST_ModLinType), intent(inout) :: DstModLinTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyModLinType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcModLinTypeData%Instance)) then - LB(1:1) = lbound(SrcModLinTypeData%Instance) - UB(1:1) = ubound(SrcModLinTypeData%Instance) - if (.not. allocated(DstModLinTypeData%Instance)) then - allocate(DstModLinTypeData%Instance(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModLinTypeData%Instance.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call FAST_CopyLinType(SrcModLinTypeData%Instance(i1), DstModLinTypeData%Instance(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if -end subroutine - -subroutine FAST_DestroyModLinType(ModLinTypeData, ErrStat, ErrMsg) - type(FAST_ModLinType), intent(inout) :: ModLinTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyModLinType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(ModLinTypeData%Instance)) then - LB(1:1) = lbound(ModLinTypeData%Instance) - UB(1:1) = ubound(ModLinTypeData%Instance) - do i1 = LB(1), UB(1) - call FAST_DestroyLinType(ModLinTypeData%Instance(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ModLinTypeData%Instance) - end if -end subroutine - -subroutine FAST_PackModLinType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(FAST_ModLinType), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackModLinType' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%Instance)) - if (allocated(InData%Instance)) then - call RegPackBounds(RF, 1, lbound(InData%Instance), ubound(InData%Instance)) - LB(1:1) = lbound(InData%Instance) - UB(1:1) = ubound(InData%Instance) - do i1 = LB(1), UB(1) - call FAST_PackLinType(RF, InData%Instance(i1)) - end do - end if - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackModLinType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(FAST_ModLinType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackModLinType' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%Instance)) deallocate(OutData%Instance) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Instance(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Instance.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call FAST_UnpackLinType(RF, OutData%Instance(i1)) ! Instance - end do - end if -end subroutine - -subroutine FAST_CopyLinFileType(SrcLinFileTypeData, DstLinFileTypeData, CtrlCode, ErrStat, ErrMsg) - type(FAST_LinFileType), intent(in) :: SrcLinFileTypeData - type(FAST_LinFileType), intent(inout) :: DstLinFileTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyLinFileType' - ErrStat = ErrID_None - ErrMsg = '' - LB(1:1) = lbound(SrcLinFileTypeData%Modules) - UB(1:1) = ubound(SrcLinFileTypeData%Modules) - do i1 = LB(1), UB(1) - call FAST_CopyModLinType(SrcLinFileTypeData%Modules(i1), DstLinFileTypeData%Modules(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call FAST_CopyLinType(SrcLinFileTypeData%Glue, DstLinFileTypeData%Glue, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstLinFileTypeData%RotSpeed = SrcLinFileTypeData%RotSpeed - DstLinFileTypeData%Azimuth = SrcLinFileTypeData%Azimuth - DstLinFileTypeData%WindSpeed = SrcLinFileTypeData%WindSpeed -end subroutine - -subroutine FAST_DestroyLinFileType(LinFileTypeData, ErrStat, ErrMsg) - type(FAST_LinFileType), intent(inout) :: LinFileTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyLinFileType' - ErrStat = ErrID_None - ErrMsg = '' - LB(1:1) = lbound(LinFileTypeData%Modules) - UB(1:1) = ubound(LinFileTypeData%Modules) - do i1 = LB(1), UB(1) - call FAST_DestroyModLinType(LinFileTypeData%Modules(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call FAST_DestroyLinType(LinFileTypeData%Glue, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) -end subroutine - -subroutine FAST_PackLinFileType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(FAST_LinFileType), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackLinFileType' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%Modules) - UB(1:1) = ubound(InData%Modules) - do i1 = LB(1), UB(1) - call FAST_PackModLinType(RF, InData%Modules(i1)) - end do - call FAST_PackLinType(RF, InData%Glue) - call RegPack(RF, InData%RotSpeed) - call RegPack(RF, InData%Azimuth) - call RegPack(RF, InData%WindSpeed) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackLinFileType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(FAST_LinFileType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackLinFileType' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%Modules) - UB(1:1) = ubound(OutData%Modules) - do i1 = LB(1), UB(1) - call FAST_UnpackModLinType(RF, OutData%Modules(i1)) ! Modules - end do - call FAST_UnpackLinType(RF, OutData%Glue) ! Glue - call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Azimuth); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WindSpeed); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyMiscLinType(SrcMiscLinTypeData, DstMiscLinTypeData, CtrlCode, ErrStat, ErrMsg) - type(FAST_MiscLinType), intent(in) :: SrcMiscLinTypeData - type(FAST_MiscLinType), intent(inout) :: DstMiscLinTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(*), parameter :: RoutineName = 'FAST_CopyMiscLinType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcMiscLinTypeData%LinTimes)) then - LB(1:1) = lbound(SrcMiscLinTypeData%LinTimes) - UB(1:1) = ubound(SrcMiscLinTypeData%LinTimes) - if (.not. allocated(DstMiscLinTypeData%LinTimes)) then - allocate(DstMiscLinTypeData%LinTimes(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%LinTimes.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscLinTypeData%LinTimes = SrcMiscLinTypeData%LinTimes - end if - DstMiscLinTypeData%CopyOP_CtrlCode = SrcMiscLinTypeData%CopyOP_CtrlCode - if (allocated(SrcMiscLinTypeData%AzimTarget)) then - LB(1:1) = lbound(SrcMiscLinTypeData%AzimTarget) - UB(1:1) = ubound(SrcMiscLinTypeData%AzimTarget) - if (.not. allocated(DstMiscLinTypeData%AzimTarget)) then - allocate(DstMiscLinTypeData%AzimTarget(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%AzimTarget.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscLinTypeData%AzimTarget = SrcMiscLinTypeData%AzimTarget - end if - DstMiscLinTypeData%IsConverged = SrcMiscLinTypeData%IsConverged - DstMiscLinTypeData%FoundSteady = SrcMiscLinTypeData%FoundSteady - DstMiscLinTypeData%ForceLin = SrcMiscLinTypeData%ForceLin - DstMiscLinTypeData%n_rot = SrcMiscLinTypeData%n_rot - DstMiscLinTypeData%AzimIndx = SrcMiscLinTypeData%AzimIndx - DstMiscLinTypeData%NextLinTimeIndx = SrcMiscLinTypeData%NextLinTimeIndx - if (allocated(SrcMiscLinTypeData%Psi)) then - LB(1:1) = lbound(SrcMiscLinTypeData%Psi) - UB(1:1) = ubound(SrcMiscLinTypeData%Psi) - if (.not. allocated(DstMiscLinTypeData%Psi)) then - allocate(DstMiscLinTypeData%Psi(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%Psi.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscLinTypeData%Psi = SrcMiscLinTypeData%Psi - end if - if (allocated(SrcMiscLinTypeData%y_interp)) then - LB(1:1) = lbound(SrcMiscLinTypeData%y_interp) - UB(1:1) = ubound(SrcMiscLinTypeData%y_interp) - if (.not. allocated(DstMiscLinTypeData%y_interp)) then - allocate(DstMiscLinTypeData%y_interp(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%y_interp.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscLinTypeData%y_interp = SrcMiscLinTypeData%y_interp - end if - if (allocated(SrcMiscLinTypeData%y_ref)) then - LB(1:1) = lbound(SrcMiscLinTypeData%y_ref) - UB(1:1) = ubound(SrcMiscLinTypeData%y_ref) - if (.not. allocated(DstMiscLinTypeData%y_ref)) then - allocate(DstMiscLinTypeData%y_ref(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%y_ref.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscLinTypeData%y_ref = SrcMiscLinTypeData%y_ref - end if - if (allocated(SrcMiscLinTypeData%Y_prevRot)) then - LB(1:2) = lbound(SrcMiscLinTypeData%Y_prevRot) - UB(1:2) = ubound(SrcMiscLinTypeData%Y_prevRot) - if (.not. allocated(DstMiscLinTypeData%Y_prevRot)) then - allocate(DstMiscLinTypeData%Y_prevRot(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscLinTypeData%Y_prevRot.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstMiscLinTypeData%Y_prevRot = SrcMiscLinTypeData%Y_prevRot - end if -end subroutine - -subroutine FAST_DestroyMiscLinType(MiscLinTypeData, ErrStat, ErrMsg) - type(FAST_MiscLinType), intent(inout) :: MiscLinTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'FAST_DestroyMiscLinType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(MiscLinTypeData%LinTimes)) then - deallocate(MiscLinTypeData%LinTimes) - end if - if (allocated(MiscLinTypeData%AzimTarget)) then - deallocate(MiscLinTypeData%AzimTarget) - end if - if (allocated(MiscLinTypeData%Psi)) then - deallocate(MiscLinTypeData%Psi) - end if - if (allocated(MiscLinTypeData%y_interp)) then - deallocate(MiscLinTypeData%y_interp) - end if - if (allocated(MiscLinTypeData%y_ref)) then - deallocate(MiscLinTypeData%y_ref) - end if - if (allocated(MiscLinTypeData%Y_prevRot)) then - deallocate(MiscLinTypeData%Y_prevRot) - end if -end subroutine - -subroutine FAST_PackMiscLinType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(FAST_MiscLinType), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackMiscLinType' - if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%LinTimes) - call RegPack(RF, InData%CopyOP_CtrlCode) - call RegPackAlloc(RF, InData%AzimTarget) - call RegPack(RF, InData%IsConverged) - call RegPack(RF, InData%FoundSteady) - call RegPack(RF, InData%ForceLin) - call RegPack(RF, InData%n_rot) - call RegPack(RF, InData%AzimIndx) - call RegPack(RF, InData%NextLinTimeIndx) - call RegPackAlloc(RF, InData%Psi) - call RegPackAlloc(RF, InData%y_interp) - call RegPackAlloc(RF, InData%y_ref) - call RegPackAlloc(RF, InData%Y_prevRot) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackMiscLinType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(FAST_MiscLinType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackMiscLinType' - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%LinTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%CopyOP_CtrlCode); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AzimTarget); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%IsConverged); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%FoundSteady); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ForceLin); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%n_rot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AzimIndx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NextLinTimeIndx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Psi); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%y_interp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%y_ref); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Y_prevRot); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyOutputFileType(SrcOutputFileTypeData, DstOutputFileTypeData, CtrlCode, ErrStat, ErrMsg) - type(FAST_OutputFileType), intent(inout) :: SrcOutputFileTypeData - type(FAST_OutputFileType), intent(inout) :: DstOutputFileTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyOutputFileType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcOutputFileTypeData%TimeData)) then - LB(1:1) = lbound(SrcOutputFileTypeData%TimeData) - UB(1:1) = ubound(SrcOutputFileTypeData%TimeData) - if (.not. allocated(DstOutputFileTypeData%TimeData)) then - allocate(DstOutputFileTypeData%TimeData(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputFileTypeData%TimeData.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstOutputFileTypeData%TimeData = SrcOutputFileTypeData%TimeData - end if - if (allocated(SrcOutputFileTypeData%AllOutData)) then - LB(1:2) = lbound(SrcOutputFileTypeData%AllOutData) - UB(1:2) = ubound(SrcOutputFileTypeData%AllOutData) - if (.not. allocated(DstOutputFileTypeData%AllOutData)) then - allocate(DstOutputFileTypeData%AllOutData(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputFileTypeData%AllOutData.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstOutputFileTypeData%AllOutData = SrcOutputFileTypeData%AllOutData - end if - DstOutputFileTypeData%n_Out = SrcOutputFileTypeData%n_Out - DstOutputFileTypeData%NOutSteps = SrcOutputFileTypeData%NOutSteps - DstOutputFileTypeData%numOuts = SrcOutputFileTypeData%numOuts - DstOutputFileTypeData%UnOu = SrcOutputFileTypeData%UnOu - DstOutputFileTypeData%UnSum = SrcOutputFileTypeData%UnSum - DstOutputFileTypeData%UnGra = SrcOutputFileTypeData%UnGra - DstOutputFileTypeData%FileDescLines = SrcOutputFileTypeData%FileDescLines - if (allocated(SrcOutputFileTypeData%ChannelNames)) then - LB(1:1) = lbound(SrcOutputFileTypeData%ChannelNames) - UB(1:1) = ubound(SrcOutputFileTypeData%ChannelNames) - if (.not. allocated(DstOutputFileTypeData%ChannelNames)) then - allocate(DstOutputFileTypeData%ChannelNames(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputFileTypeData%ChannelNames.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstOutputFileTypeData%ChannelNames = SrcOutputFileTypeData%ChannelNames - end if - if (allocated(SrcOutputFileTypeData%ChannelUnits)) then - LB(1:1) = lbound(SrcOutputFileTypeData%ChannelUnits) - UB(1:1) = ubound(SrcOutputFileTypeData%ChannelUnits) - if (.not. allocated(DstOutputFileTypeData%ChannelUnits)) then - allocate(DstOutputFileTypeData%ChannelUnits(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputFileTypeData%ChannelUnits.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstOutputFileTypeData%ChannelUnits = SrcOutputFileTypeData%ChannelUnits - end if - LB(1:1) = lbound(SrcOutputFileTypeData%Module_Ver) - UB(1:1) = ubound(SrcOutputFileTypeData%Module_Ver) - do i1 = LB(1), UB(1) - call NWTC_Library_CopyProgDesc(SrcOutputFileTypeData%Module_Ver(i1), DstOutputFileTypeData%Module_Ver(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - DstOutputFileTypeData%Module_Abrev = SrcOutputFileTypeData%Module_Abrev - DstOutputFileTypeData%WriteThisStep = SrcOutputFileTypeData%WriteThisStep - DstOutputFileTypeData%VTK_count = SrcOutputFileTypeData%VTK_count - DstOutputFileTypeData%VTK_LastWaveIndx = SrcOutputFileTypeData%VTK_LastWaveIndx - call FAST_CopyLinFileType(SrcOutputFileTypeData%Lin, DstOutputFileTypeData%Lin, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstOutputFileTypeData%ActualChanLen = SrcOutputFileTypeData%ActualChanLen - call FAST_CopyLinStateSave(SrcOutputFileTypeData%op, DstOutputFileTypeData%op, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstOutputFileTypeData%DriverWriteOutput = SrcOutputFileTypeData%DriverWriteOutput -end subroutine - -subroutine FAST_DestroyOutputFileType(OutputFileTypeData, ErrStat, ErrMsg) - type(FAST_OutputFileType), intent(inout) :: OutputFileTypeData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyOutputFileType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(OutputFileTypeData%TimeData)) then - deallocate(OutputFileTypeData%TimeData) - end if - if (allocated(OutputFileTypeData%AllOutData)) then - deallocate(OutputFileTypeData%AllOutData) - end if - if (allocated(OutputFileTypeData%ChannelNames)) then - deallocate(OutputFileTypeData%ChannelNames) - end if - if (allocated(OutputFileTypeData%ChannelUnits)) then - deallocate(OutputFileTypeData%ChannelUnits) - end if - LB(1:1) = lbound(OutputFileTypeData%Module_Ver) - UB(1:1) = ubound(OutputFileTypeData%Module_Ver) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyProgDesc(OutputFileTypeData%Module_Ver(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call FAST_DestroyLinFileType(OutputFileTypeData%Lin, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call FAST_DestroyLinStateSave(OutputFileTypeData%op, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) -end subroutine - -subroutine FAST_PackOutputFileType(RF, Indata) - type(RegFile), intent(inout) :: RF - type(FAST_OutputFileType), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackOutputFileType' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%TimeData) - call RegPackAlloc(RF, InData%AllOutData) - call RegPack(RF, InData%n_Out) - call RegPack(RF, InData%NOutSteps) - call RegPack(RF, InData%numOuts) - call RegPack(RF, InData%UnOu) - call RegPack(RF, InData%UnSum) - call RegPack(RF, InData%UnGra) - call RegPack(RF, InData%FileDescLines) - call RegPackAlloc(RF, InData%ChannelNames) - call RegPackAlloc(RF, InData%ChannelUnits) - LB(1:1) = lbound(InData%Module_Ver) - UB(1:1) = ubound(InData%Module_Ver) - do i1 = LB(1), UB(1) - call NWTC_Library_PackProgDesc(RF, InData%Module_Ver(i1)) - end do - call RegPack(RF, InData%Module_Abrev) - call RegPack(RF, InData%WriteThisStep) - call RegPack(RF, InData%VTK_count) - call RegPack(RF, InData%VTK_LastWaveIndx) - call FAST_PackLinFileType(RF, InData%Lin) - call RegPack(RF, InData%ActualChanLen) - call FAST_PackLinStateSave(RF, InData%op) - call RegPack(RF, InData%DriverWriteOutput) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackOutputFileType(RF, OutData) - type(RegFile), intent(inout) :: RF - type(FAST_OutputFileType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackOutputFileType' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%TimeData); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AllOutData); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%n_Out); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NOutSteps); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%numOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UnOu); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UnSum); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UnGra); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%FileDescLines); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%ChannelNames); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%ChannelUnits); if (RegCheckErr(RF, RoutineName)) return - LB(1:1) = lbound(OutData%Module_Ver) - UB(1:1) = ubound(OutData%Module_Ver) - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackProgDesc(RF, OutData%Module_Ver(i1)) ! Module_Ver - end do - call RegUnpack(RF, OutData%Module_Abrev); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WriteThisStep); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VTK_count); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VTK_LastWaveIndx); if (RegCheckErr(RF, RoutineName)) return - call FAST_UnpackLinFileType(RF, OutData%Lin) ! Lin - call RegUnpack(RF, OutData%ActualChanLen); if (RegCheckErr(RF, RoutineName)) return - call FAST_UnpackLinStateSave(RF, OutData%op) ! op - call RegUnpack(RF, OutData%DriverWriteOutput); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyIceDyn_Data(SrcIceDyn_DataData, DstIceDyn_DataData, CtrlCode, ErrStat, ErrMsg) - type(IceDyn_Data), intent(inout) :: SrcIceDyn_DataData - type(IceDyn_Data), intent(inout) :: DstIceDyn_DataData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyIceDyn_Data' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcIceDyn_DataData%x)) then - LB(1:2) = lbound(SrcIceDyn_DataData%x) - UB(1:2) = ubound(SrcIceDyn_DataData%x) - if (.not. allocated(DstIceDyn_DataData%x)) then - allocate(DstIceDyn_DataData%x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyContState(SrcIceDyn_DataData%x(i1,i2), DstIceDyn_DataData%x(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcIceDyn_DataData%xd)) then - LB(1:2) = lbound(SrcIceDyn_DataData%xd) - UB(1:2) = ubound(SrcIceDyn_DataData%xd) - if (.not. allocated(DstIceDyn_DataData%xd)) then - allocate(DstIceDyn_DataData%xd(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyDiscState(SrcIceDyn_DataData%xd(i1,i2), DstIceDyn_DataData%xd(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcIceDyn_DataData%z)) then - LB(1:2) = lbound(SrcIceDyn_DataData%z) - UB(1:2) = ubound(SrcIceDyn_DataData%z) - if (.not. allocated(DstIceDyn_DataData%z)) then - allocate(DstIceDyn_DataData%z(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyConstrState(SrcIceDyn_DataData%z(i1,i2), DstIceDyn_DataData%z(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcIceDyn_DataData%OtherSt)) then - LB(1:2) = lbound(SrcIceDyn_DataData%OtherSt) - UB(1:2) = ubound(SrcIceDyn_DataData%OtherSt) - if (.not. allocated(DstIceDyn_DataData%OtherSt)) then - allocate(DstIceDyn_DataData%OtherSt(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyOtherState(SrcIceDyn_DataData%OtherSt(i1,i2), DstIceDyn_DataData%OtherSt(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcIceDyn_DataData%p)) then - LB(1:1) = lbound(SrcIceDyn_DataData%p) - UB(1:1) = ubound(SrcIceDyn_DataData%p) - if (.not. allocated(DstIceDyn_DataData%p)) then - allocate(DstIceDyn_DataData%p(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%p.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call IceD_CopyParam(SrcIceDyn_DataData%p(i1), DstIceDyn_DataData%p(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcIceDyn_DataData%u)) then - LB(1:1) = lbound(SrcIceDyn_DataData%u) - UB(1:1) = ubound(SrcIceDyn_DataData%u) - if (.not. allocated(DstIceDyn_DataData%u)) then - allocate(DstIceDyn_DataData%u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call IceD_CopyInput(SrcIceDyn_DataData%u(i1), DstIceDyn_DataData%u(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcIceDyn_DataData%y)) then - LB(1:1) = lbound(SrcIceDyn_DataData%y) - UB(1:1) = ubound(SrcIceDyn_DataData%y) - if (.not. allocated(DstIceDyn_DataData%y)) then - allocate(DstIceDyn_DataData%y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call IceD_CopyOutput(SrcIceDyn_DataData%y(i1), DstIceDyn_DataData%y(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcIceDyn_DataData%m)) then - LB(1:1) = lbound(SrcIceDyn_DataData%m) - UB(1:1) = ubound(SrcIceDyn_DataData%m) - if (.not. allocated(DstIceDyn_DataData%m)) then - allocate(DstIceDyn_DataData%m(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%m.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call IceD_CopyMisc(SrcIceDyn_DataData%m(i1), DstIceDyn_DataData%m(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcIceDyn_DataData%Input)) then - LB(1:2) = lbound(SrcIceDyn_DataData%Input) - UB(1:2) = ubound(SrcIceDyn_DataData%Input) - if (.not. allocated(DstIceDyn_DataData%Input)) then - allocate(DstIceDyn_DataData%Input(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyInput(SrcIceDyn_DataData%Input(i1,i2), DstIceDyn_DataData%Input(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcIceDyn_DataData%Input_Saved)) then - LB(1:2) = lbound(SrcIceDyn_DataData%Input_Saved) - UB(1:2) = ubound(SrcIceDyn_DataData%Input_Saved) - if (.not. allocated(DstIceDyn_DataData%Input_Saved)) then - allocate(DstIceDyn_DataData%Input_Saved(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_CopyInput(SrcIceDyn_DataData%Input_Saved(i1,i2), DstIceDyn_DataData%Input_Saved(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcIceDyn_DataData%InputTimes)) then - LB(1:2) = lbound(SrcIceDyn_DataData%InputTimes) - UB(1:2) = ubound(SrcIceDyn_DataData%InputTimes) - if (.not. allocated(DstIceDyn_DataData%InputTimes)) then - allocate(DstIceDyn_DataData%InputTimes(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstIceDyn_DataData%InputTimes = SrcIceDyn_DataData%InputTimes - end if - if (allocated(SrcIceDyn_DataData%InputTimes_Saved)) then - LB(1:2) = lbound(SrcIceDyn_DataData%InputTimes_Saved) - UB(1:2) = ubound(SrcIceDyn_DataData%InputTimes_Saved) - if (.not. allocated(DstIceDyn_DataData%InputTimes_Saved)) then - allocate(DstIceDyn_DataData%InputTimes_Saved(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstIceDyn_DataData%InputTimes_Saved = SrcIceDyn_DataData%InputTimes_Saved - end if -end subroutine - -subroutine FAST_DestroyIceDyn_Data(IceDyn_DataData, ErrStat, ErrMsg) - type(IceDyn_Data), intent(inout) :: IceDyn_DataData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyIceDyn_Data' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(IceDyn_DataData%x)) then - LB(1:2) = lbound(IceDyn_DataData%x) - UB(1:2) = ubound(IceDyn_DataData%x) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyContState(IceDyn_DataData%x(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(IceDyn_DataData%x) - end if - if (allocated(IceDyn_DataData%xd)) then - LB(1:2) = lbound(IceDyn_DataData%xd) - UB(1:2) = ubound(IceDyn_DataData%xd) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyDiscState(IceDyn_DataData%xd(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(IceDyn_DataData%xd) - end if - if (allocated(IceDyn_DataData%z)) then - LB(1:2) = lbound(IceDyn_DataData%z) - UB(1:2) = ubound(IceDyn_DataData%z) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyConstrState(IceDyn_DataData%z(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(IceDyn_DataData%z) - end if - if (allocated(IceDyn_DataData%OtherSt)) then - LB(1:2) = lbound(IceDyn_DataData%OtherSt) - UB(1:2) = ubound(IceDyn_DataData%OtherSt) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyOtherState(IceDyn_DataData%OtherSt(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(IceDyn_DataData%OtherSt) - end if - if (allocated(IceDyn_DataData%p)) then - LB(1:1) = lbound(IceDyn_DataData%p) - UB(1:1) = ubound(IceDyn_DataData%p) - do i1 = LB(1), UB(1) - call IceD_DestroyParam(IceDyn_DataData%p(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(IceDyn_DataData%p) - end if - if (allocated(IceDyn_DataData%u)) then - LB(1:1) = lbound(IceDyn_DataData%u) - UB(1:1) = ubound(IceDyn_DataData%u) - do i1 = LB(1), UB(1) - call IceD_DestroyInput(IceDyn_DataData%u(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(IceDyn_DataData%u) - end if - if (allocated(IceDyn_DataData%y)) then - LB(1:1) = lbound(IceDyn_DataData%y) - UB(1:1) = ubound(IceDyn_DataData%y) - do i1 = LB(1), UB(1) - call IceD_DestroyOutput(IceDyn_DataData%y(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(IceDyn_DataData%y) - end if - if (allocated(IceDyn_DataData%m)) then - LB(1:1) = lbound(IceDyn_DataData%m) - UB(1:1) = ubound(IceDyn_DataData%m) - do i1 = LB(1), UB(1) - call IceD_DestroyMisc(IceDyn_DataData%m(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(IceDyn_DataData%m) - end if - if (allocated(IceDyn_DataData%Input)) then - LB(1:2) = lbound(IceDyn_DataData%Input) - UB(1:2) = ubound(IceDyn_DataData%Input) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyInput(IceDyn_DataData%Input(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(IceDyn_DataData%Input) - end if - if (allocated(IceDyn_DataData%Input_Saved)) then - LB(1:2) = lbound(IceDyn_DataData%Input_Saved) - UB(1:2) = ubound(IceDyn_DataData%Input_Saved) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_DestroyInput(IceDyn_DataData%Input_Saved(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(IceDyn_DataData%Input_Saved) - end if - if (allocated(IceDyn_DataData%InputTimes)) then - deallocate(IceDyn_DataData%InputTimes) - end if - if (allocated(IceDyn_DataData%InputTimes_Saved)) then - deallocate(IceDyn_DataData%InputTimes_Saved) - end if -end subroutine - -subroutine FAST_PackIceDyn_Data(RF, Indata) - type(RegFile), intent(inout) :: RF - type(IceDyn_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackIceDyn_Data' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%x)) - if (allocated(InData%x)) then - call RegPackBounds(RF, 2, lbound(InData%x), ubound(InData%x)) - LB(1:2) = lbound(InData%x) - UB(1:2) = ubound(InData%x) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackContState(RF, InData%x(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%xd)) - if (allocated(InData%xd)) then - call RegPackBounds(RF, 2, lbound(InData%xd), ubound(InData%xd)) - LB(1:2) = lbound(InData%xd) - UB(1:2) = ubound(InData%xd) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackDiscState(RF, InData%xd(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%z)) - if (allocated(InData%z)) then - call RegPackBounds(RF, 2, lbound(InData%z), ubound(InData%z)) - LB(1:2) = lbound(InData%z) - UB(1:2) = ubound(InData%z) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackConstrState(RF, InData%z(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%OtherSt)) - if (allocated(InData%OtherSt)) then - call RegPackBounds(RF, 2, lbound(InData%OtherSt), ubound(InData%OtherSt)) - LB(1:2) = lbound(InData%OtherSt) - UB(1:2) = ubound(InData%OtherSt) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackOtherState(RF, InData%OtherSt(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%p)) - if (allocated(InData%p)) then - call RegPackBounds(RF, 1, lbound(InData%p), ubound(InData%p)) - LB(1:1) = lbound(InData%p) - UB(1:1) = ubound(InData%p) - do i1 = LB(1), UB(1) - call IceD_PackParam(RF, InData%p(i1)) - end do - end if - call RegPack(RF, allocated(InData%u)) - if (allocated(InData%u)) then - call RegPackBounds(RF, 1, lbound(InData%u), ubound(InData%u)) - LB(1:1) = lbound(InData%u) - UB(1:1) = ubound(InData%u) - do i1 = LB(1), UB(1) - call IceD_PackInput(RF, InData%u(i1)) - end do - end if - call RegPack(RF, allocated(InData%y)) - if (allocated(InData%y)) then - call RegPackBounds(RF, 1, lbound(InData%y), ubound(InData%y)) - LB(1:1) = lbound(InData%y) - UB(1:1) = ubound(InData%y) - do i1 = LB(1), UB(1) - call IceD_PackOutput(RF, InData%y(i1)) - end do - end if - call RegPack(RF, allocated(InData%m)) - if (allocated(InData%m)) then - call RegPackBounds(RF, 1, lbound(InData%m), ubound(InData%m)) - LB(1:1) = lbound(InData%m) - UB(1:1) = ubound(InData%m) - do i1 = LB(1), UB(1) - call IceD_PackMisc(RF, InData%m(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input)) - if (allocated(InData%Input)) then - call RegPackBounds(RF, 2, lbound(InData%Input), ubound(InData%Input)) - LB(1:2) = lbound(InData%Input) - UB(1:2) = ubound(InData%Input) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackInput(RF, InData%Input(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 2, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:2) = lbound(InData%Input_Saved) - UB(1:2) = ubound(InData%Input_Saved) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_PackInput(RF, InData%Input_Saved(i1,i2)) - end do - end do - end if - call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackIceDyn_Data(RF, OutData) - type(RegFile), intent(inout) :: RF - type(IceDyn_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackIceDyn_Data' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%x)) deallocate(OutData%x) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackContState(RF, OutData%x(i1,i2)) ! x - end do - end do - end if - if (allocated(OutData%xd)) deallocate(OutData%xd) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackDiscState(RF, OutData%xd(i1,i2)) ! xd - end do - end do - end if - if (allocated(OutData%z)) deallocate(OutData%z) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackConstrState(RF, OutData%z(i1,i2)) ! z - end do - end do - end if - if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackOtherState(RF, OutData%OtherSt(i1,i2)) ! OtherSt - end do - end do - end if - if (allocated(OutData%p)) deallocate(OutData%p) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%p(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%p.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call IceD_UnpackParam(RF, OutData%p(i1)) ! p - end do - end if - if (allocated(OutData%u)) deallocate(OutData%u) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call IceD_UnpackInput(RF, OutData%u(i1)) ! u - end do - end if - if (allocated(OutData%y)) deallocate(OutData%y) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%y(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call IceD_UnpackOutput(RF, OutData%y(i1)) ! y - end do - end if - if (allocated(OutData%m)) deallocate(OutData%m) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%m(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%m.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call IceD_UnpackMisc(RF, OutData%m(i1)) ! m - end do - end if - if (allocated(OutData%Input)) deallocate(OutData%Input) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackInput(RF, OutData%Input(i1,i2)) ! Input - end do - end do - end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call IceD_UnpackInput(RF, OutData%Input_Saved(i1,i2)) ! Input_Saved - end do - end do - end if - call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyBeamDyn_Data(SrcBeamDyn_DataData, DstBeamDyn_DataData, CtrlCode, ErrStat, ErrMsg) - type(BeamDyn_Data), intent(inout) :: SrcBeamDyn_DataData - type(BeamDyn_Data), intent(inout) :: DstBeamDyn_DataData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyBeamDyn_Data' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcBeamDyn_DataData%x)) then - LB(1:2) = lbound(SrcBeamDyn_DataData%x) - UB(1:2) = ubound(SrcBeamDyn_DataData%x) - if (.not. allocated(DstBeamDyn_DataData%x)) then - allocate(DstBeamDyn_DataData%x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyContState(SrcBeamDyn_DataData%x(i1,i2), DstBeamDyn_DataData%x(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcBeamDyn_DataData%xd)) then - LB(1:2) = lbound(SrcBeamDyn_DataData%xd) - UB(1:2) = ubound(SrcBeamDyn_DataData%xd) - if (.not. allocated(DstBeamDyn_DataData%xd)) then - allocate(DstBeamDyn_DataData%xd(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyDiscState(SrcBeamDyn_DataData%xd(i1,i2), DstBeamDyn_DataData%xd(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcBeamDyn_DataData%z)) then - LB(1:2) = lbound(SrcBeamDyn_DataData%z) - UB(1:2) = ubound(SrcBeamDyn_DataData%z) - if (.not. allocated(DstBeamDyn_DataData%z)) then - allocate(DstBeamDyn_DataData%z(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyConstrState(SrcBeamDyn_DataData%z(i1,i2), DstBeamDyn_DataData%z(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcBeamDyn_DataData%OtherSt)) then - LB(1:2) = lbound(SrcBeamDyn_DataData%OtherSt) - UB(1:2) = ubound(SrcBeamDyn_DataData%OtherSt) - if (.not. allocated(DstBeamDyn_DataData%OtherSt)) then - allocate(DstBeamDyn_DataData%OtherSt(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyOtherState(SrcBeamDyn_DataData%OtherSt(i1,i2), DstBeamDyn_DataData%OtherSt(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcBeamDyn_DataData%p)) then - LB(1:1) = lbound(SrcBeamDyn_DataData%p) - UB(1:1) = ubound(SrcBeamDyn_DataData%p) - if (.not. allocated(DstBeamDyn_DataData%p)) then - allocate(DstBeamDyn_DataData%p(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%p.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call BD_CopyParam(SrcBeamDyn_DataData%p(i1), DstBeamDyn_DataData%p(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcBeamDyn_DataData%u)) then - LB(1:1) = lbound(SrcBeamDyn_DataData%u) - UB(1:1) = ubound(SrcBeamDyn_DataData%u) - if (.not. allocated(DstBeamDyn_DataData%u)) then - allocate(DstBeamDyn_DataData%u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call BD_CopyInput(SrcBeamDyn_DataData%u(i1), DstBeamDyn_DataData%u(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcBeamDyn_DataData%y)) then - LB(1:1) = lbound(SrcBeamDyn_DataData%y) - UB(1:1) = ubound(SrcBeamDyn_DataData%y) - if (.not. allocated(DstBeamDyn_DataData%y)) then - allocate(DstBeamDyn_DataData%y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call BD_CopyOutput(SrcBeamDyn_DataData%y(i1), DstBeamDyn_DataData%y(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcBeamDyn_DataData%m)) then - LB(1:1) = lbound(SrcBeamDyn_DataData%m) - UB(1:1) = ubound(SrcBeamDyn_DataData%m) - if (.not. allocated(DstBeamDyn_DataData%m)) then - allocate(DstBeamDyn_DataData%m(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%m.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call BD_CopyMisc(SrcBeamDyn_DataData%m(i1), DstBeamDyn_DataData%m(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcBeamDyn_DataData%Output)) then - LB(1:2) = lbound(SrcBeamDyn_DataData%Output) - UB(1:2) = ubound(SrcBeamDyn_DataData%Output) - if (.not. allocated(DstBeamDyn_DataData%Output)) then - allocate(DstBeamDyn_DataData%Output(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%Output.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyOutput(SrcBeamDyn_DataData%Output(i1,i2), DstBeamDyn_DataData%Output(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcBeamDyn_DataData%y_interp)) then - LB(1:1) = lbound(SrcBeamDyn_DataData%y_interp) - UB(1:1) = ubound(SrcBeamDyn_DataData%y_interp) - if (.not. allocated(DstBeamDyn_DataData%y_interp)) then - allocate(DstBeamDyn_DataData%y_interp(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%y_interp.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call BD_CopyOutput(SrcBeamDyn_DataData%y_interp(i1), DstBeamDyn_DataData%y_interp(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcBeamDyn_DataData%Input)) then - LB(1:2) = lbound(SrcBeamDyn_DataData%Input) - UB(1:2) = ubound(SrcBeamDyn_DataData%Input) - if (.not. allocated(DstBeamDyn_DataData%Input)) then - allocate(DstBeamDyn_DataData%Input(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyInput(SrcBeamDyn_DataData%Input(i1,i2), DstBeamDyn_DataData%Input(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcBeamDyn_DataData%Input_Saved)) then - LB(1:2) = lbound(SrcBeamDyn_DataData%Input_Saved) - UB(1:2) = ubound(SrcBeamDyn_DataData%Input_Saved) - if (.not. allocated(DstBeamDyn_DataData%Input_Saved)) then - allocate(DstBeamDyn_DataData%Input_Saved(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_CopyInput(SrcBeamDyn_DataData%Input_Saved(i1,i2), DstBeamDyn_DataData%Input_Saved(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcBeamDyn_DataData%InputTimes)) then - LB(1:2) = lbound(SrcBeamDyn_DataData%InputTimes) - UB(1:2) = ubound(SrcBeamDyn_DataData%InputTimes) - if (.not. allocated(DstBeamDyn_DataData%InputTimes)) then - allocate(DstBeamDyn_DataData%InputTimes(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstBeamDyn_DataData%InputTimes = SrcBeamDyn_DataData%InputTimes - end if - if (allocated(SrcBeamDyn_DataData%InputTimes_Saved)) then - LB(1:2) = lbound(SrcBeamDyn_DataData%InputTimes_Saved) - UB(1:2) = ubound(SrcBeamDyn_DataData%InputTimes_Saved) - if (.not. allocated(DstBeamDyn_DataData%InputTimes_Saved)) then - allocate(DstBeamDyn_DataData%InputTimes_Saved(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstBeamDyn_DataData%InputTimes_Saved = SrcBeamDyn_DataData%InputTimes_Saved - end if -end subroutine - -subroutine FAST_DestroyBeamDyn_Data(BeamDyn_DataData, ErrStat, ErrMsg) - type(BeamDyn_Data), intent(inout) :: BeamDyn_DataData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyBeamDyn_Data' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(BeamDyn_DataData%x)) then - LB(1:2) = lbound(BeamDyn_DataData%x) - UB(1:2) = ubound(BeamDyn_DataData%x) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyContState(BeamDyn_DataData%x(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(BeamDyn_DataData%x) - end if - if (allocated(BeamDyn_DataData%xd)) then - LB(1:2) = lbound(BeamDyn_DataData%xd) - UB(1:2) = ubound(BeamDyn_DataData%xd) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyDiscState(BeamDyn_DataData%xd(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(BeamDyn_DataData%xd) - end if - if (allocated(BeamDyn_DataData%z)) then - LB(1:2) = lbound(BeamDyn_DataData%z) - UB(1:2) = ubound(BeamDyn_DataData%z) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyConstrState(BeamDyn_DataData%z(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(BeamDyn_DataData%z) - end if - if (allocated(BeamDyn_DataData%OtherSt)) then - LB(1:2) = lbound(BeamDyn_DataData%OtherSt) - UB(1:2) = ubound(BeamDyn_DataData%OtherSt) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyOtherState(BeamDyn_DataData%OtherSt(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(BeamDyn_DataData%OtherSt) - end if - if (allocated(BeamDyn_DataData%p)) then - LB(1:1) = lbound(BeamDyn_DataData%p) - UB(1:1) = ubound(BeamDyn_DataData%p) - do i1 = LB(1), UB(1) - call BD_DestroyParam(BeamDyn_DataData%p(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(BeamDyn_DataData%p) - end if - if (allocated(BeamDyn_DataData%u)) then - LB(1:1) = lbound(BeamDyn_DataData%u) - UB(1:1) = ubound(BeamDyn_DataData%u) - do i1 = LB(1), UB(1) - call BD_DestroyInput(BeamDyn_DataData%u(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(BeamDyn_DataData%u) - end if - if (allocated(BeamDyn_DataData%y)) then - LB(1:1) = lbound(BeamDyn_DataData%y) - UB(1:1) = ubound(BeamDyn_DataData%y) - do i1 = LB(1), UB(1) - call BD_DestroyOutput(BeamDyn_DataData%y(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(BeamDyn_DataData%y) - end if - if (allocated(BeamDyn_DataData%m)) then - LB(1:1) = lbound(BeamDyn_DataData%m) - UB(1:1) = ubound(BeamDyn_DataData%m) - do i1 = LB(1), UB(1) - call BD_DestroyMisc(BeamDyn_DataData%m(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(BeamDyn_DataData%m) - end if - if (allocated(BeamDyn_DataData%Output)) then - LB(1:2) = lbound(BeamDyn_DataData%Output) - UB(1:2) = ubound(BeamDyn_DataData%Output) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyOutput(BeamDyn_DataData%Output(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(BeamDyn_DataData%Output) - end if - if (allocated(BeamDyn_DataData%y_interp)) then - LB(1:1) = lbound(BeamDyn_DataData%y_interp) - UB(1:1) = ubound(BeamDyn_DataData%y_interp) - do i1 = LB(1), UB(1) - call BD_DestroyOutput(BeamDyn_DataData%y_interp(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(BeamDyn_DataData%y_interp) - end if - if (allocated(BeamDyn_DataData%Input)) then - LB(1:2) = lbound(BeamDyn_DataData%Input) - UB(1:2) = ubound(BeamDyn_DataData%Input) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyInput(BeamDyn_DataData%Input(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(BeamDyn_DataData%Input) - end if - if (allocated(BeamDyn_DataData%Input_Saved)) then - LB(1:2) = lbound(BeamDyn_DataData%Input_Saved) - UB(1:2) = ubound(BeamDyn_DataData%Input_Saved) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_DestroyInput(BeamDyn_DataData%Input_Saved(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(BeamDyn_DataData%Input_Saved) - end if - if (allocated(BeamDyn_DataData%InputTimes)) then - deallocate(BeamDyn_DataData%InputTimes) - end if - if (allocated(BeamDyn_DataData%InputTimes_Saved)) then - deallocate(BeamDyn_DataData%InputTimes_Saved) + if (allocated(OutputFileTypeData%ChannelUnits)) then + deallocate(OutputFileTypeData%ChannelUnits) end if + LB(1:1) = lbound(OutputFileTypeData%Module_Ver) + UB(1:1) = ubound(OutputFileTypeData%Module_Ver) + do i1 = LB(1), UB(1) + call NWTC_Library_DestroyProgDesc(OutputFileTypeData%Module_Ver(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + call FAST_DestroyLinFileType(OutputFileTypeData%Lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine -subroutine FAST_PackBeamDyn_Data(RF, Indata) +subroutine FAST_PackOutputFileType(RF, Indata) type(RegFile), intent(inout) :: RF - type(BeamDyn_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackBeamDyn_Data' + type(FAST_OutputFileType), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackOutputFileType' integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%x)) - if (allocated(InData%x)) then - call RegPackBounds(RF, 2, lbound(InData%x), ubound(InData%x)) - LB(1:2) = lbound(InData%x) - UB(1:2) = ubound(InData%x) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackContState(RF, InData%x(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%xd)) - if (allocated(InData%xd)) then - call RegPackBounds(RF, 2, lbound(InData%xd), ubound(InData%xd)) - LB(1:2) = lbound(InData%xd) - UB(1:2) = ubound(InData%xd) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackDiscState(RF, InData%xd(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%z)) - if (allocated(InData%z)) then - call RegPackBounds(RF, 2, lbound(InData%z), ubound(InData%z)) - LB(1:2) = lbound(InData%z) - UB(1:2) = ubound(InData%z) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackConstrState(RF, InData%z(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%OtherSt)) - if (allocated(InData%OtherSt)) then - call RegPackBounds(RF, 2, lbound(InData%OtherSt), ubound(InData%OtherSt)) - LB(1:2) = lbound(InData%OtherSt) - UB(1:2) = ubound(InData%OtherSt) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackOtherState(RF, InData%OtherSt(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%p)) - if (allocated(InData%p)) then - call RegPackBounds(RF, 1, lbound(InData%p), ubound(InData%p)) - LB(1:1) = lbound(InData%p) - UB(1:1) = ubound(InData%p) - do i1 = LB(1), UB(1) - call BD_PackParam(RF, InData%p(i1)) - end do - end if - call RegPack(RF, allocated(InData%u)) - if (allocated(InData%u)) then - call RegPackBounds(RF, 1, lbound(InData%u), ubound(InData%u)) - LB(1:1) = lbound(InData%u) - UB(1:1) = ubound(InData%u) - do i1 = LB(1), UB(1) - call BD_PackInput(RF, InData%u(i1)) - end do - end if - call RegPack(RF, allocated(InData%y)) - if (allocated(InData%y)) then - call RegPackBounds(RF, 1, lbound(InData%y), ubound(InData%y)) - LB(1:1) = lbound(InData%y) - UB(1:1) = ubound(InData%y) - do i1 = LB(1), UB(1) - call BD_PackOutput(RF, InData%y(i1)) - end do - end if - call RegPack(RF, allocated(InData%m)) - if (allocated(InData%m)) then - call RegPackBounds(RF, 1, lbound(InData%m), ubound(InData%m)) - LB(1:1) = lbound(InData%m) - UB(1:1) = ubound(InData%m) - do i1 = LB(1), UB(1) - call BD_PackMisc(RF, InData%m(i1)) - end do - end if - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 2, lbound(InData%Output), ubound(InData%Output)) - LB(1:2) = lbound(InData%Output) - UB(1:2) = ubound(InData%Output) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackOutput(RF, InData%Output(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%y_interp)) - if (allocated(InData%y_interp)) then - call RegPackBounds(RF, 1, lbound(InData%y_interp), ubound(InData%y_interp)) - LB(1:1) = lbound(InData%y_interp) - UB(1:1) = ubound(InData%y_interp) - do i1 = LB(1), UB(1) - call BD_PackOutput(RF, InData%y_interp(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input)) - if (allocated(InData%Input)) then - call RegPackBounds(RF, 2, lbound(InData%Input), ubound(InData%Input)) - LB(1:2) = lbound(InData%Input) - UB(1:2) = ubound(InData%Input) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackInput(RF, InData%Input(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 2, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:2) = lbound(InData%Input_Saved) - UB(1:2) = ubound(InData%Input_Saved) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_PackInput(RF, InData%Input_Saved(i1,i2)) - end do - end do - end if - call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) + call RegPackAlloc(RF, InData%TimeData) + call RegPackAlloc(RF, InData%AllOutData) + call RegPack(RF, InData%n_Out) + call RegPack(RF, InData%NOutSteps) + call RegPack(RF, InData%numOuts) + call RegPack(RF, InData%UnOu) + call RegPack(RF, InData%UnSum) + call RegPack(RF, InData%UnGra) + call RegPack(RF, InData%FileDescLines) + call RegPackAlloc(RF, InData%ChannelNames) + call RegPackAlloc(RF, InData%ChannelUnits) + LB(1:1) = lbound(InData%Module_Ver) + UB(1:1) = ubound(InData%Module_Ver) + do i1 = LB(1), UB(1) + call NWTC_Library_PackProgDesc(RF, InData%Module_Ver(i1)) + end do + call RegPack(RF, InData%Module_Abrev) + call RegPack(RF, InData%WriteThisStep) + call RegPack(RF, InData%VTK_count) + call RegPack(RF, InData%VTK_LastWaveIndx) + call FAST_PackLinFileType(RF, InData%Lin) + call RegPack(RF, InData%ActualChanLen) + call RegPack(RF, InData%DriverWriteOutput) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackBeamDyn_Data(RF, OutData) +subroutine FAST_UnPackOutputFileType(RF, OutData) type(RegFile), intent(inout) :: RF - type(BeamDyn_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackBeamDyn_Data' + type(FAST_OutputFileType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackOutputFileType' integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%x)) deallocate(OutData%x) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%x(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_UnpackContState(RF, OutData%x(i1,i2)) ! x - end do - end do - end if - if (allocated(OutData%xd)) deallocate(OutData%xd) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%xd(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_UnpackDiscState(RF, OutData%xd(i1,i2)) ! xd - end do - end do - end if - if (allocated(OutData%z)) deallocate(OutData%z) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%z(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_UnpackConstrState(RF, OutData%z(i1,i2)) ! z - end do - end do - end if - if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OtherSt(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call BD_UnpackOtherState(RF, OutData%OtherSt(i1,i2)) ! OtherSt - end do - end do - end if - if (allocated(OutData%p)) deallocate(OutData%p) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%p(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%p.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call BD_UnpackParam(RF, OutData%p(i1)) ! p - end do - end if - if (allocated(OutData%u)) deallocate(OutData%u) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call BD_UnpackInput(RF, OutData%u(i1)) ! u - end do - end if - if (allocated(OutData%y)) deallocate(OutData%y) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%y(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call BD_UnpackOutput(RF, OutData%y(i1)) ! y - end do - end if - if (allocated(OutData%m)) deallocate(OutData%m) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%m(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%m.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call BD_UnpackMisc(RF, OutData%m(i1)) ! m - end do - end if - if (allocated(OutData%Output)) deallocate(OutData%Output) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%TimeData); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AllOutData); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%n_Out); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NOutSteps); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%numOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UnOu); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UnSum); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UnGra); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%FileDescLines); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%ChannelNames); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%ChannelUnits); if (RegCheckErr(RF, RoutineName)) return + LB(1:1) = lbound(OutData%Module_Ver) + UB(1:1) = ubound(OutData%Module_Ver) + do i1 = LB(1), UB(1) + call NWTC_Library_UnpackProgDesc(RF, OutData%Module_Ver(i1)) ! Module_Ver + end do + call RegUnpack(RF, OutData%Module_Abrev); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WriteThisStep); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VTK_count); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VTK_LastWaveIndx); if (RegCheckErr(RF, RoutineName)) return + call FAST_UnpackLinFileType(RF, OutData%Lin) ! Lin + call RegUnpack(RF, OutData%ActualChanLen); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DriverWriteOutput); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_CopyIceDyn_Data(SrcIceDyn_DataData, DstIceDyn_DataData, CtrlCode, ErrStat, ErrMsg) + type(IceDyn_Data), intent(inout) :: SrcIceDyn_DataData + type(IceDyn_Data), intent(inout) :: DstIceDyn_DataData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_CopyIceDyn_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcIceDyn_DataData%x)) then + LB(1:2) = lbound(SrcIceDyn_DataData%x) + UB(1:2) = ubound(SrcIceDyn_DataData%x) + if (.not. allocated(DstIceDyn_DataData%x)) then + allocate(DstIceDyn_DataData%x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call BD_UnpackOutput(RF, OutData%Output(i1,i2)) ! Output + call IceD_CopyContState(SrcIceDyn_DataData%x(i1,i2), DstIceDyn_DataData%x(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end do end if - if (allocated(OutData%y_interp)) deallocate(OutData%y_interp) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%y_interp(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_interp.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call BD_UnpackOutput(RF, OutData%y_interp(i1)) ! y_interp - end do - end if - if (allocated(OutData%Input)) deallocate(OutData%Input) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcIceDyn_DataData%xd)) then + LB(1:2) = lbound(SrcIceDyn_DataData%xd) + UB(1:2) = ubound(SrcIceDyn_DataData%xd) + if (.not. allocated(DstIceDyn_DataData%xd)) then + allocate(DstIceDyn_DataData%xd(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call BD_UnpackInput(RF, OutData%Input(i1,i2)) ! Input + call IceD_CopyDiscState(SrcIceDyn_DataData%xd(i1,i2), DstIceDyn_DataData%xd(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcIceDyn_DataData%z)) then + LB(1:2) = lbound(SrcIceDyn_DataData%z) + UB(1:2) = ubound(SrcIceDyn_DataData%z) + if (.not. allocated(DstIceDyn_DataData%z)) then + allocate(DstIceDyn_DataData%z(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call BD_UnpackInput(RF, OutData%Input_Saved(i1,i2)) ! Input_Saved + call IceD_CopyConstrState(SrcIceDyn_DataData%z(i1,i2), DstIceDyn_DataData%z(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end do end if - call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyElastoDyn_Data(SrcElastoDyn_DataData, DstElastoDyn_DataData, CtrlCode, ErrStat, ErrMsg) - type(ElastoDyn_Data), intent(inout) :: SrcElastoDyn_DataData - type(ElastoDyn_Data), intent(inout) :: DstElastoDyn_DataData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyElastoDyn_Data' - ErrStat = ErrID_None - ErrMsg = '' - LB(1:1) = lbound(SrcElastoDyn_DataData%x) - UB(1:1) = ubound(SrcElastoDyn_DataData%x) - do i1 = LB(1), UB(1) - call ED_CopyContState(SrcElastoDyn_DataData%x(i1), DstElastoDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcElastoDyn_DataData%xd) - UB(1:1) = ubound(SrcElastoDyn_DataData%xd) - do i1 = LB(1), UB(1) - call ED_CopyDiscState(SrcElastoDyn_DataData%xd(i1), DstElastoDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcElastoDyn_DataData%z) - UB(1:1) = ubound(SrcElastoDyn_DataData%z) - do i1 = LB(1), UB(1) - call ED_CopyConstrState(SrcElastoDyn_DataData%z(i1), DstElastoDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcElastoDyn_DataData%OtherSt) - UB(1:1) = ubound(SrcElastoDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call ED_CopyOtherState(SrcElastoDyn_DataData%OtherSt(i1), DstElastoDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call ED_CopyParam(SrcElastoDyn_DataData%p, DstElastoDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ED_CopyInput(SrcElastoDyn_DataData%u, DstElastoDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ED_CopyOutput(SrcElastoDyn_DataData%y, DstElastoDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ED_CopyMisc(SrcElastoDyn_DataData%m, DstElastoDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcElastoDyn_DataData%Output)) then - LB(1:1) = lbound(SrcElastoDyn_DataData%Output) - UB(1:1) = ubound(SrcElastoDyn_DataData%Output) - if (.not. allocated(DstElastoDyn_DataData%Output)) then - allocate(DstElastoDyn_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcIceDyn_DataData%OtherSt)) then + LB(1:2) = lbound(SrcIceDyn_DataData%OtherSt) + UB(1:2) = ubound(SrcIceDyn_DataData%OtherSt) + if (.not. allocated(DstIceDyn_DataData%OtherSt)) then + allocate(DstIceDyn_DataData%OtherSt(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call ED_CopyOutput(SrcElastoDyn_DataData%Output(i1), DstElastoDyn_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_CopyOtherState(SrcIceDyn_DataData%OtherSt(i1,i2), DstIceDyn_DataData%OtherSt(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end do end if - if (allocated(SrcElastoDyn_DataData%Output_bak)) then - LB(1:1) = lbound(SrcElastoDyn_DataData%Output_bak) - UB(1:1) = ubound(SrcElastoDyn_DataData%Output_bak) - if (.not. allocated(DstElastoDyn_DataData%Output_bak)) then - allocate(DstElastoDyn_DataData%Output_bak(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcIceDyn_DataData%p)) then + LB(1:1) = lbound(SrcIceDyn_DataData%p) + UB(1:1) = ubound(SrcIceDyn_DataData%p) + if (.not. allocated(DstIceDyn_DataData%p)) then + allocate(DstIceDyn_DataData%p(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%Output_bak.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%p.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call ED_CopyOutput(SrcElastoDyn_DataData%Output_bak(i1), DstElastoDyn_DataData%Output_bak(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceD_CopyParam(SrcIceDyn_DataData%p(i1), DstIceDyn_DataData%p(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call ED_CopyOutput(SrcElastoDyn_DataData%y_interp, DstElastoDyn_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcElastoDyn_DataData%Input)) then - LB(1:1) = lbound(SrcElastoDyn_DataData%Input) - UB(1:1) = ubound(SrcElastoDyn_DataData%Input) - if (.not. allocated(DstElastoDyn_DataData%Input)) then - allocate(DstElastoDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcIceDyn_DataData%y)) then + LB(1:1) = lbound(SrcIceDyn_DataData%y) + UB(1:1) = ubound(SrcIceDyn_DataData%y) + if (.not. allocated(DstIceDyn_DataData%y)) then + allocate(DstIceDyn_DataData%y(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%y.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call ED_CopyInput(SrcElastoDyn_DataData%Input(i1), DstElastoDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceD_CopyOutput(SrcIceDyn_DataData%y(i1), DstIceDyn_DataData%y(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcElastoDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcElastoDyn_DataData%Input_Saved) - UB(1:1) = ubound(SrcElastoDyn_DataData%Input_Saved) - if (.not. allocated(DstElastoDyn_DataData%Input_Saved)) then - allocate(DstElastoDyn_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcIceDyn_DataData%m)) then + LB(1:1) = lbound(SrcIceDyn_DataData%m) + UB(1:1) = ubound(SrcIceDyn_DataData%m) + if (.not. allocated(DstIceDyn_DataData%m)) then + allocate(DstIceDyn_DataData%m(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%m.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call ED_CopyInput(SrcElastoDyn_DataData%Input_Saved(i1), DstElastoDyn_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceD_CopyMisc(SrcIceDyn_DataData%m(i1), DstIceDyn_DataData%m(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcElastoDyn_DataData%InputTimes)) then - LB(1:1) = lbound(SrcElastoDyn_DataData%InputTimes) - UB(1:1) = ubound(SrcElastoDyn_DataData%InputTimes) - if (.not. allocated(DstElastoDyn_DataData%InputTimes)) then - allocate(DstElastoDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcIceDyn_DataData%Input)) then + LB(1:2) = lbound(SrcIceDyn_DataData%Input) + UB(1:2) = ubound(SrcIceDyn_DataData%Input) + if (.not. allocated(DstIceDyn_DataData%Input)) then + allocate(DstIceDyn_DataData%Input(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if - DstElastoDyn_DataData%InputTimes = SrcElastoDyn_DataData%InputTimes + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_CopyInput(SrcIceDyn_DataData%Input(i1,i2), DstIceDyn_DataData%Input(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do end if - if (allocated(SrcElastoDyn_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcElastoDyn_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcElastoDyn_DataData%InputTimes_Saved) - if (.not. allocated(DstElastoDyn_DataData%InputTimes_Saved)) then - allocate(DstElastoDyn_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcIceDyn_DataData%InputTimes)) then + LB(1:2) = lbound(SrcIceDyn_DataData%InputTimes) + UB(1:2) = ubound(SrcIceDyn_DataData%InputTimes) + if (.not. allocated(DstIceDyn_DataData%InputTimes)) then + allocate(DstIceDyn_DataData%InputTimes(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstElastoDyn_DataData%InputTimes_Saved = SrcElastoDyn_DataData%InputTimes_Saved + DstIceDyn_DataData%InputTimes = SrcIceDyn_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyElastoDyn_Data(ElastoDyn_DataData, ErrStat, ErrMsg) - type(ElastoDyn_Data), intent(inout) :: ElastoDyn_DataData +subroutine FAST_DestroyIceDyn_Data(IceDyn_DataData, ErrStat, ErrMsg) + type(IceDyn_Data), intent(inout) :: IceDyn_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyElastoDyn_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyIceDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(ElastoDyn_DataData%x) - UB(1:1) = ubound(ElastoDyn_DataData%x) - do i1 = LB(1), UB(1) - call ED_DestroyContState(ElastoDyn_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(ElastoDyn_DataData%xd) - UB(1:1) = ubound(ElastoDyn_DataData%xd) - do i1 = LB(1), UB(1) - call ED_DestroyDiscState(ElastoDyn_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(ElastoDyn_DataData%z) - UB(1:1) = ubound(ElastoDyn_DataData%z) - do i1 = LB(1), UB(1) - call ED_DestroyConstrState(ElastoDyn_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(ElastoDyn_DataData%OtherSt) - UB(1:1) = ubound(ElastoDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call ED_DestroyOtherState(ElastoDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call ED_DestroyParam(ElastoDyn_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ED_DestroyInput(ElastoDyn_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ED_DestroyOutput(ElastoDyn_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ED_DestroyMisc(ElastoDyn_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ElastoDyn_DataData%Output)) then - LB(1:1) = lbound(ElastoDyn_DataData%Output) - UB(1:1) = ubound(ElastoDyn_DataData%Output) - do i1 = LB(1), UB(1) - call ED_DestroyOutput(ElastoDyn_DataData%Output(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(IceDyn_DataData%x)) then + LB(1:2) = lbound(IceDyn_DataData%x) + UB(1:2) = ubound(IceDyn_DataData%x) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_DestroyContState(IceDyn_DataData%x(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(IceDyn_DataData%x) + end if + if (allocated(IceDyn_DataData%xd)) then + LB(1:2) = lbound(IceDyn_DataData%xd) + UB(1:2) = ubound(IceDyn_DataData%xd) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_DestroyDiscState(IceDyn_DataData%xd(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(IceDyn_DataData%xd) + end if + if (allocated(IceDyn_DataData%z)) then + LB(1:2) = lbound(IceDyn_DataData%z) + UB(1:2) = ubound(IceDyn_DataData%z) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_DestroyConstrState(IceDyn_DataData%z(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(IceDyn_DataData%z) + end if + if (allocated(IceDyn_DataData%OtherSt)) then + LB(1:2) = lbound(IceDyn_DataData%OtherSt) + UB(1:2) = ubound(IceDyn_DataData%OtherSt) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_DestroyOtherState(IceDyn_DataData%OtherSt(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do end do - deallocate(ElastoDyn_DataData%Output) + deallocate(IceDyn_DataData%OtherSt) end if - if (allocated(ElastoDyn_DataData%Output_bak)) then - LB(1:1) = lbound(ElastoDyn_DataData%Output_bak) - UB(1:1) = ubound(ElastoDyn_DataData%Output_bak) + if (allocated(IceDyn_DataData%p)) then + LB(1:1) = lbound(IceDyn_DataData%p) + UB(1:1) = ubound(IceDyn_DataData%p) do i1 = LB(1), UB(1) - call ED_DestroyOutput(ElastoDyn_DataData%Output_bak(i1), ErrStat2, ErrMsg2) + call IceD_DestroyParam(IceDyn_DataData%p(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ElastoDyn_DataData%Output_bak) + deallocate(IceDyn_DataData%p) end if - call ED_DestroyOutput(ElastoDyn_DataData%y_interp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ElastoDyn_DataData%Input)) then - LB(1:1) = lbound(ElastoDyn_DataData%Input) - UB(1:1) = ubound(ElastoDyn_DataData%Input) + if (allocated(IceDyn_DataData%y)) then + LB(1:1) = lbound(IceDyn_DataData%y) + UB(1:1) = ubound(IceDyn_DataData%y) do i1 = LB(1), UB(1) - call ED_DestroyInput(ElastoDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call IceD_DestroyOutput(IceDyn_DataData%y(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ElastoDyn_DataData%Input) + deallocate(IceDyn_DataData%y) end if - if (allocated(ElastoDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(ElastoDyn_DataData%Input_Saved) - UB(1:1) = ubound(ElastoDyn_DataData%Input_Saved) + if (allocated(IceDyn_DataData%m)) then + LB(1:1) = lbound(IceDyn_DataData%m) + UB(1:1) = ubound(IceDyn_DataData%m) do i1 = LB(1), UB(1) - call ED_DestroyInput(ElastoDyn_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call IceD_DestroyMisc(IceDyn_DataData%m(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ElastoDyn_DataData%Input_Saved) + deallocate(IceDyn_DataData%m) end if - if (allocated(ElastoDyn_DataData%InputTimes)) then - deallocate(ElastoDyn_DataData%InputTimes) + if (allocated(IceDyn_DataData%Input)) then + LB(1:2) = lbound(IceDyn_DataData%Input) + UB(1:2) = ubound(IceDyn_DataData%Input) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_DestroyInput(IceDyn_DataData%Input(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(IceDyn_DataData%Input) end if - if (allocated(ElastoDyn_DataData%InputTimes_Saved)) then - deallocate(ElastoDyn_DataData%InputTimes_Saved) + if (allocated(IceDyn_DataData%InputTimes)) then + deallocate(IceDyn_DataData%InputTimes) end if end subroutine -subroutine FAST_PackElastoDyn_Data(RF, Indata) +subroutine FAST_PackIceDyn_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(ElastoDyn_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackElastoDyn_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(IceDyn_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackIceDyn_Data' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call ED_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call ED_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call ED_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call ED_PackOtherState(RF, InData%OtherSt(i1)) - end do - call ED_PackParam(RF, InData%p) - call ED_PackInput(RF, InData%u) - call ED_PackOutput(RF, InData%y) - call ED_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) - do i1 = LB(1), UB(1) - call ED_PackOutput(RF, InData%Output(i1)) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 2, lbound(InData%x), ubound(InData%x)) + LB(1:2) = lbound(InData%x) + UB(1:2) = ubound(InData%x) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_PackContState(RF, InData%x(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 2, lbound(InData%xd), ubound(InData%xd)) + LB(1:2) = lbound(InData%xd) + UB(1:2) = ubound(InData%xd) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_PackDiscState(RF, InData%xd(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 2, lbound(InData%z), ubound(InData%z)) + LB(1:2) = lbound(InData%z) + UB(1:2) = ubound(InData%z) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_PackConstrState(RF, InData%z(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 2, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:2) = lbound(InData%OtherSt) + UB(1:2) = ubound(InData%OtherSt) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_PackOtherState(RF, InData%OtherSt(i1,i2)) + end do end do end if - call RegPack(RF, allocated(InData%Output_bak)) - if (allocated(InData%Output_bak)) then - call RegPackBounds(RF, 1, lbound(InData%Output_bak), ubound(InData%Output_bak)) - LB(1:1) = lbound(InData%Output_bak) - UB(1:1) = ubound(InData%Output_bak) + call RegPack(RF, allocated(InData%p)) + if (allocated(InData%p)) then + call RegPackBounds(RF, 1, lbound(InData%p), ubound(InData%p)) + LB(1:1) = lbound(InData%p) + UB(1:1) = ubound(InData%p) do i1 = LB(1), UB(1) - call ED_PackOutput(RF, InData%Output_bak(i1)) + call IceD_PackParam(RF, InData%p(i1)) end do end if - call ED_PackOutput(RF, InData%y_interp) - call RegPack(RF, allocated(InData%Input)) - if (allocated(InData%Input)) then - call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) - LB(1:1) = lbound(InData%Input) - UB(1:1) = ubound(InData%Input) + call RegPack(RF, allocated(InData%y)) + if (allocated(InData%y)) then + call RegPackBounds(RF, 1, lbound(InData%y), ubound(InData%y)) + LB(1:1) = lbound(InData%y) + UB(1:1) = ubound(InData%y) do i1 = LB(1), UB(1) - call ED_PackInput(RF, InData%Input(i1)) + call IceD_PackOutput(RF, InData%y(i1)) end do end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) + call RegPack(RF, allocated(InData%m)) + if (allocated(InData%m)) then + call RegPackBounds(RF, 1, lbound(InData%m), ubound(InData%m)) + LB(1:1) = lbound(InData%m) + UB(1:1) = ubound(InData%m) do i1 = LB(1), UB(1) - call ED_PackInput(RF, InData%Input_Saved(i1)) + call IceD_PackMisc(RF, InData%m(i1)) + end do + end if + call RegPack(RF, allocated(InData%Input)) + if (allocated(InData%Input)) then + call RegPackBounds(RF, 2, lbound(InData%Input), ubound(InData%Input)) + LB(1:2) = lbound(InData%Input) + UB(1:2) = ubound(InData%Input) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_PackInput(RF, InData%Input(i1,i2)) + end do end do end if call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackElastoDyn_Data(RF, OutData) +subroutine FAST_UnPackIceDyn_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(ElastoDyn_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackElastoDyn_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(IceDyn_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackIceDyn_Data' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call ED_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call ED_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call ED_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call ED_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call ED_UnpackParam(RF, OutData%p) ! p - call ED_UnpackInput(RF, OutData%u) ! u - call ED_UnpackOutput(RF, OutData%y) ! y - call ED_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Output)) deallocate(OutData%Output) + if (allocated(OutData%x)) deallocate(OutData%x) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%x(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_UnpackContState(RF, OutData%x(i1,i2)) ! x + end do + end do + end if + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_UnpackDiscState(RF, OutData%xd(i1,i2)) ! xd + end do + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_UnpackConstrState(RF, OutData%z(i1,i2)) ! z + end do + end do + end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_UnpackOtherState(RF, OutData%OtherSt(i1,i2)) ! OtherSt + end do + end do + end if + if (allocated(OutData%p)) deallocate(OutData%p) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%p(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%p.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call ED_UnpackOutput(RF, OutData%Output(i1)) ! Output + call IceD_UnpackParam(RF, OutData%p(i1)) ! p end do end if - if (allocated(OutData%Output_bak)) deallocate(OutData%Output_bak) + if (allocated(OutData%y)) deallocate(OutData%y) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output_bak(LB(1):UB(1)),stat=stat) + allocate(OutData%y(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output_bak.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call ED_UnpackOutput(RF, OutData%Output_bak(i1)) ! Output_bak + call IceD_UnpackOutput(RF, OutData%y(i1)) ! y end do end if - call ED_UnpackOutput(RF, OutData%y_interp) ! y_interp - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%m)) deallocate(OutData%m) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%m(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%m.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call ED_UnpackInput(RF, OutData%Input(i1)) ! Input + call IceD_UnpackMisc(RF, OutData%m(i1)) ! m end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Input(LB(1):UB(1),LB(2):UB(2)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if - do i1 = LB(1), UB(1) - call ED_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call IceD_UnpackInput(RF, OutData%Input(i1,i2)) ! Input + end do end do end if call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopySED_Data(SrcSED_DataData, DstSED_DataData, CtrlCode, ErrStat, ErrMsg) - type(SED_Data), intent(inout) :: SrcSED_DataData - type(SED_Data), intent(inout) :: DstSED_DataData +subroutine FAST_CopyBeamDyn_Data(SrcBeamDyn_DataData, DstBeamDyn_DataData, CtrlCode, ErrStat, ErrMsg) + type(BeamDyn_Data), intent(inout) :: SrcBeamDyn_DataData + type(BeamDyn_Data), intent(inout) :: DstBeamDyn_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopySED_Data' + character(*), parameter :: RoutineName = 'FAST_CopyBeamDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcSED_DataData%x) - UB(1:1) = ubound(SrcSED_DataData%x) - do i1 = LB(1), UB(1) - call SED_CopyContState(SrcSED_DataData%x(i1), DstSED_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcSED_DataData%xd) - UB(1:1) = ubound(SrcSED_DataData%xd) - do i1 = LB(1), UB(1) - call SED_CopyDiscState(SrcSED_DataData%xd(i1), DstSED_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcSED_DataData%z) - UB(1:1) = ubound(SrcSED_DataData%z) - do i1 = LB(1), UB(1) - call SED_CopyConstrState(SrcSED_DataData%z(i1), DstSED_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcSED_DataData%OtherSt) - UB(1:1) = ubound(SrcSED_DataData%OtherSt) - do i1 = LB(1), UB(1) - call SED_CopyOtherState(SrcSED_DataData%OtherSt(i1), DstSED_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call SED_CopyParam(SrcSED_DataData%p, DstSED_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SED_CopyInput(SrcSED_DataData%u, DstSED_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SED_CopyOutput(SrcSED_DataData%y, DstSED_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SED_CopyMisc(SrcSED_DataData%m, DstSED_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcSED_DataData%Output)) then - LB(1:1) = lbound(SrcSED_DataData%Output) - UB(1:1) = ubound(SrcSED_DataData%Output) - if (.not. allocated(DstSED_DataData%Output)) then - allocate(DstSED_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcBeamDyn_DataData%x)) then + LB(1:2) = lbound(SrcBeamDyn_DataData%x) + UB(1:2) = ubound(SrcBeamDyn_DataData%x) + if (.not. allocated(DstBeamDyn_DataData%x)) then + allocate(DstBeamDyn_DataData%x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSED_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call SED_CopyOutput(SrcSED_DataData%Output(i1), DstSED_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_CopyContState(SrcBeamDyn_DataData%x(i1,i2), DstBeamDyn_DataData%x(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end do end if - call SED_CopyOutput(SrcSED_DataData%y_interp, DstSED_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcSED_DataData%Input)) then - LB(1:1) = lbound(SrcSED_DataData%Input) - UB(1:1) = ubound(SrcSED_DataData%Input) - if (.not. allocated(DstSED_DataData%Input)) then - allocate(DstSED_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcBeamDyn_DataData%xd)) then + LB(1:2) = lbound(SrcBeamDyn_DataData%xd) + UB(1:2) = ubound(SrcBeamDyn_DataData%xd) + if (.not. allocated(DstBeamDyn_DataData%xd)) then + allocate(DstBeamDyn_DataData%xd(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSED_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call SED_CopyInput(SrcSED_DataData%Input(i1), DstSED_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_CopyDiscState(SrcBeamDyn_DataData%xd(i1,i2), DstBeamDyn_DataData%xd(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end do end if - if (allocated(SrcSED_DataData%InputTimes)) then - LB(1:1) = lbound(SrcSED_DataData%InputTimes) - UB(1:1) = ubound(SrcSED_DataData%InputTimes) - if (.not. allocated(DstSED_DataData%InputTimes)) then - allocate(DstSED_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcBeamDyn_DataData%z)) then + LB(1:2) = lbound(SrcBeamDyn_DataData%z) + UB(1:2) = ubound(SrcBeamDyn_DataData%z) + if (.not. allocated(DstBeamDyn_DataData%z)) then + allocate(DstBeamDyn_DataData%z(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSED_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if - DstSED_DataData%InputTimes = SrcSED_DataData%InputTimes - end if -end subroutine - -subroutine FAST_DestroySED_Data(SED_DataData, ErrStat, ErrMsg) - type(SED_Data), intent(inout) :: SED_DataData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroySED_Data' - ErrStat = ErrID_None - ErrMsg = '' - LB(1:1) = lbound(SED_DataData%x) - UB(1:1) = ubound(SED_DataData%x) - do i1 = LB(1), UB(1) - call SED_DestroyContState(SED_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(SED_DataData%xd) - UB(1:1) = ubound(SED_DataData%xd) - do i1 = LB(1), UB(1) - call SED_DestroyDiscState(SED_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(SED_DataData%z) - UB(1:1) = ubound(SED_DataData%z) - do i1 = LB(1), UB(1) - call SED_DestroyConstrState(SED_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(SED_DataData%OtherSt) - UB(1:1) = ubound(SED_DataData%OtherSt) - do i1 = LB(1), UB(1) - call SED_DestroyOtherState(SED_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call SED_DestroyParam(SED_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SED_DestroyInput(SED_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SED_DestroyOutput(SED_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SED_DestroyMisc(SED_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(SED_DataData%Output)) then - LB(1:1) = lbound(SED_DataData%Output) - UB(1:1) = ubound(SED_DataData%Output) - do i1 = LB(1), UB(1) - call SED_DestroyOutput(SED_DataData%Output(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(SED_DataData%Output) - end if - call SED_DestroyOutput(SED_DataData%y_interp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(SED_DataData%Input)) then - LB(1:1) = lbound(SED_DataData%Input) - UB(1:1) = ubound(SED_DataData%Input) - do i1 = LB(1), UB(1) - call SED_DestroyInput(SED_DataData%Input(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(SED_DataData%Input) - end if - if (allocated(SED_DataData%InputTimes)) then - deallocate(SED_DataData%InputTimes) - end if -end subroutine - -subroutine FAST_PackSED_Data(RF, Indata) - type(RegFile), intent(inout) :: RF - type(SED_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackSED_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call SED_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call SED_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call SED_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call SED_PackOtherState(RF, InData%OtherSt(i1)) - end do - call SED_PackParam(RF, InData%p) - call SED_PackInput(RF, InData%u) - call SED_PackOutput(RF, InData%y) - call SED_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) - do i1 = LB(1), UB(1) - call SED_PackOutput(RF, InData%Output(i1)) - end do - end if - call SED_PackOutput(RF, InData%y_interp) - call RegPack(RF, allocated(InData%Input)) - if (allocated(InData%Input)) then - call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) - LB(1:1) = lbound(InData%Input) - UB(1:1) = ubound(InData%Input) - do i1 = LB(1), UB(1) - call SED_PackInput(RF, InData%Input(i1)) - end do - end if - call RegPackAlloc(RF, InData%InputTimes) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackSED_Data(RF, OutData) - type(RegFile), intent(inout) :: RF - type(SED_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackSED_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call SED_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call SED_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call SED_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call SED_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call SED_UnpackParam(RF, OutData%p) ! p - call SED_UnpackInput(RF, OutData%u) ! u - call SED_UnpackOutput(RF, OutData%y) ! y - call SED_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Output)) deallocate(OutData%Output) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call SED_UnpackOutput(RF, OutData%Output(i1)) ! Output + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_CopyConstrState(SrcBeamDyn_DataData%z(i1,i2), DstBeamDyn_DataData%z(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end do end if - call SED_UnpackOutput(RF, OutData%y_interp) ! y_interp - if (allocated(OutData%Input)) deallocate(OutData%Input) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcBeamDyn_DataData%OtherSt)) then + LB(1:2) = lbound(SrcBeamDyn_DataData%OtherSt) + UB(1:2) = ubound(SrcBeamDyn_DataData%OtherSt) + if (.not. allocated(DstBeamDyn_DataData%OtherSt)) then + allocate(DstBeamDyn_DataData%OtherSt(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i1 = LB(1), UB(1) - call SED_UnpackInput(RF, OutData%Input(i1)) ! Input + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_CopyOtherState(SrcBeamDyn_DataData%OtherSt(i1,i2), DstBeamDyn_DataData%OtherSt(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end do end if - call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyServoDyn_Data(SrcServoDyn_DataData, DstServoDyn_DataData, CtrlCode, ErrStat, ErrMsg) - type(ServoDyn_Data), intent(inout) :: SrcServoDyn_DataData - type(ServoDyn_Data), intent(inout) :: DstServoDyn_DataData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyServoDyn_Data' - ErrStat = ErrID_None - ErrMsg = '' - LB(1:1) = lbound(SrcServoDyn_DataData%x) - UB(1:1) = ubound(SrcServoDyn_DataData%x) - do i1 = LB(1), UB(1) - call SrvD_CopyContState(SrcServoDyn_DataData%x(i1), DstServoDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcServoDyn_DataData%xd) - UB(1:1) = ubound(SrcServoDyn_DataData%xd) - do i1 = LB(1), UB(1) - call SrvD_CopyDiscState(SrcServoDyn_DataData%xd(i1), DstServoDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcServoDyn_DataData%z) - UB(1:1) = ubound(SrcServoDyn_DataData%z) - do i1 = LB(1), UB(1) - call SrvD_CopyConstrState(SrcServoDyn_DataData%z(i1), DstServoDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcServoDyn_DataData%OtherSt) - UB(1:1) = ubound(SrcServoDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call SrvD_CopyOtherState(SrcServoDyn_DataData%OtherSt(i1), DstServoDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call SrvD_CopyParam(SrcServoDyn_DataData%p, DstServoDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SrvD_CopyInput(SrcServoDyn_DataData%u, DstServoDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SrvD_CopyOutput(SrcServoDyn_DataData%y, DstServoDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SrvD_CopyMisc(SrcServoDyn_DataData%m, DstServoDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SrvD_CopyMisc(SrcServoDyn_DataData%m_bak, DstServoDyn_DataData%m_bak, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcServoDyn_DataData%Output)) then - LB(1:1) = lbound(SrcServoDyn_DataData%Output) - UB(1:1) = ubound(SrcServoDyn_DataData%Output) - if (.not. allocated(DstServoDyn_DataData%Output)) then - allocate(DstServoDyn_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcBeamDyn_DataData%p)) then + LB(1:1) = lbound(SrcBeamDyn_DataData%p) + UB(1:1) = ubound(SrcBeamDyn_DataData%p) + if (.not. allocated(DstBeamDyn_DataData%p)) then + allocate(DstBeamDyn_DataData%p(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%p.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call SrvD_CopyOutput(SrcServoDyn_DataData%Output(i1), DstServoDyn_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) + call BD_CopyParam(SrcBeamDyn_DataData%p(i1), DstBeamDyn_DataData%p(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call SrvD_CopyOutput(SrcServoDyn_DataData%y_interp, DstServoDyn_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcServoDyn_DataData%Input)) then - LB(1:1) = lbound(SrcServoDyn_DataData%Input) - UB(1:1) = ubound(SrcServoDyn_DataData%Input) - if (.not. allocated(DstServoDyn_DataData%Input)) then - allocate(DstServoDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcBeamDyn_DataData%y)) then + LB(1:1) = lbound(SrcBeamDyn_DataData%y) + UB(1:1) = ubound(SrcBeamDyn_DataData%y) + if (.not. allocated(DstBeamDyn_DataData%y)) then + allocate(DstBeamDyn_DataData%y(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%y.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call SrvD_CopyInput(SrcServoDyn_DataData%Input(i1), DstServoDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call BD_CopyOutput(SrcBeamDyn_DataData%y(i1), DstBeamDyn_DataData%y(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcServoDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcServoDyn_DataData%Input_Saved) - UB(1:1) = ubound(SrcServoDyn_DataData%Input_Saved) - if (.not. allocated(DstServoDyn_DataData%Input_Saved)) then - allocate(DstServoDyn_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcBeamDyn_DataData%m)) then + LB(1:1) = lbound(SrcBeamDyn_DataData%m) + UB(1:1) = ubound(SrcBeamDyn_DataData%m) + if (.not. allocated(DstBeamDyn_DataData%m)) then + allocate(DstBeamDyn_DataData%m(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%m.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call SrvD_CopyInput(SrcServoDyn_DataData%Input_Saved(i1), DstServoDyn_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call BD_CopyMisc(SrcBeamDyn_DataData%m(i1), DstBeamDyn_DataData%m(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcServoDyn_DataData%InputTimes)) then - LB(1:1) = lbound(SrcServoDyn_DataData%InputTimes) - UB(1:1) = ubound(SrcServoDyn_DataData%InputTimes) - if (.not. allocated(DstServoDyn_DataData%InputTimes)) then - allocate(DstServoDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcBeamDyn_DataData%Input)) then + LB(1:2) = lbound(SrcBeamDyn_DataData%Input) + UB(1:2) = ubound(SrcBeamDyn_DataData%Input) + if (.not. allocated(DstBeamDyn_DataData%Input)) then + allocate(DstBeamDyn_DataData%Input(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if - DstServoDyn_DataData%InputTimes = SrcServoDyn_DataData%InputTimes + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_CopyInput(SrcBeamDyn_DataData%Input(i1,i2), DstBeamDyn_DataData%Input(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do end if - if (allocated(SrcServoDyn_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcServoDyn_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcServoDyn_DataData%InputTimes_Saved) - if (.not. allocated(DstServoDyn_DataData%InputTimes_Saved)) then - allocate(DstServoDyn_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcBeamDyn_DataData%InputTimes)) then + LB(1:2) = lbound(SrcBeamDyn_DataData%InputTimes) + UB(1:2) = ubound(SrcBeamDyn_DataData%InputTimes) + if (.not. allocated(DstBeamDyn_DataData%InputTimes)) then + allocate(DstBeamDyn_DataData%InputTimes(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstBeamDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstServoDyn_DataData%InputTimes_Saved = SrcServoDyn_DataData%InputTimes_Saved + DstBeamDyn_DataData%InputTimes = SrcBeamDyn_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyServoDyn_Data(ServoDyn_DataData, ErrStat, ErrMsg) - type(ServoDyn_Data), intent(inout) :: ServoDyn_DataData +subroutine FAST_DestroyBeamDyn_Data(BeamDyn_DataData, ErrStat, ErrMsg) + type(BeamDyn_Data), intent(inout) :: BeamDyn_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyServoDyn_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyBeamDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(ServoDyn_DataData%x) - UB(1:1) = ubound(ServoDyn_DataData%x) - do i1 = LB(1), UB(1) - call SrvD_DestroyContState(ServoDyn_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(ServoDyn_DataData%xd) - UB(1:1) = ubound(ServoDyn_DataData%xd) - do i1 = LB(1), UB(1) - call SrvD_DestroyDiscState(ServoDyn_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(ServoDyn_DataData%z) - UB(1:1) = ubound(ServoDyn_DataData%z) - do i1 = LB(1), UB(1) - call SrvD_DestroyConstrState(ServoDyn_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(ServoDyn_DataData%OtherSt) - UB(1:1) = ubound(ServoDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call SrvD_DestroyOtherState(ServoDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call SrvD_DestroyParam(ServoDyn_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SrvD_DestroyInput(ServoDyn_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SrvD_DestroyOutput(ServoDyn_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SrvD_DestroyMisc(ServoDyn_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SrvD_DestroyMisc(ServoDyn_DataData%m_bak, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ServoDyn_DataData%Output)) then - LB(1:1) = lbound(ServoDyn_DataData%Output) - UB(1:1) = ubound(ServoDyn_DataData%Output) + if (allocated(BeamDyn_DataData%x)) then + LB(1:2) = lbound(BeamDyn_DataData%x) + UB(1:2) = ubound(BeamDyn_DataData%x) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_DestroyContState(BeamDyn_DataData%x(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(BeamDyn_DataData%x) + end if + if (allocated(BeamDyn_DataData%xd)) then + LB(1:2) = lbound(BeamDyn_DataData%xd) + UB(1:2) = ubound(BeamDyn_DataData%xd) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_DestroyDiscState(BeamDyn_DataData%xd(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(BeamDyn_DataData%xd) + end if + if (allocated(BeamDyn_DataData%z)) then + LB(1:2) = lbound(BeamDyn_DataData%z) + UB(1:2) = ubound(BeamDyn_DataData%z) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_DestroyConstrState(BeamDyn_DataData%z(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(BeamDyn_DataData%z) + end if + if (allocated(BeamDyn_DataData%OtherSt)) then + LB(1:2) = lbound(BeamDyn_DataData%OtherSt) + UB(1:2) = ubound(BeamDyn_DataData%OtherSt) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_DestroyOtherState(BeamDyn_DataData%OtherSt(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(BeamDyn_DataData%OtherSt) + end if + if (allocated(BeamDyn_DataData%p)) then + LB(1:1) = lbound(BeamDyn_DataData%p) + UB(1:1) = ubound(BeamDyn_DataData%p) + do i1 = LB(1), UB(1) + call BD_DestroyParam(BeamDyn_DataData%p(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(BeamDyn_DataData%p) + end if + if (allocated(BeamDyn_DataData%y)) then + LB(1:1) = lbound(BeamDyn_DataData%y) + UB(1:1) = ubound(BeamDyn_DataData%y) + do i1 = LB(1), UB(1) + call BD_DestroyOutput(BeamDyn_DataData%y(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(BeamDyn_DataData%y) + end if + if (allocated(BeamDyn_DataData%m)) then + LB(1:1) = lbound(BeamDyn_DataData%m) + UB(1:1) = ubound(BeamDyn_DataData%m) do i1 = LB(1), UB(1) - call SrvD_DestroyOutput(ServoDyn_DataData%Output(i1), ErrStat2, ErrMsg2) + call BD_DestroyMisc(BeamDyn_DataData%m(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ServoDyn_DataData%Output) + deallocate(BeamDyn_DataData%m) + end if + if (allocated(BeamDyn_DataData%Input)) then + LB(1:2) = lbound(BeamDyn_DataData%Input) + UB(1:2) = ubound(BeamDyn_DataData%Input) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_DestroyInput(BeamDyn_DataData%Input(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(BeamDyn_DataData%Input) + end if + if (allocated(BeamDyn_DataData%InputTimes)) then + deallocate(BeamDyn_DataData%InputTimes) + end if +end subroutine + +subroutine FAST_PackBeamDyn_Data(RF, Indata) + type(RegFile), intent(inout) :: RF + type(BeamDyn_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackBeamDyn_Data' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 2, lbound(InData%x), ubound(InData%x)) + LB(1:2) = lbound(InData%x) + UB(1:2) = ubound(InData%x) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_PackContState(RF, InData%x(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 2, lbound(InData%xd), ubound(InData%xd)) + LB(1:2) = lbound(InData%xd) + UB(1:2) = ubound(InData%xd) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_PackDiscState(RF, InData%xd(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 2, lbound(InData%z), ubound(InData%z)) + LB(1:2) = lbound(InData%z) + UB(1:2) = ubound(InData%z) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_PackConstrState(RF, InData%z(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 2, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:2) = lbound(InData%OtherSt) + UB(1:2) = ubound(InData%OtherSt) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_PackOtherState(RF, InData%OtherSt(i1,i2)) + end do + end do end if - call SrvD_DestroyOutput(ServoDyn_DataData%y_interp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ServoDyn_DataData%Input)) then - LB(1:1) = lbound(ServoDyn_DataData%Input) - UB(1:1) = ubound(ServoDyn_DataData%Input) + call RegPack(RF, allocated(InData%p)) + if (allocated(InData%p)) then + call RegPackBounds(RF, 1, lbound(InData%p), ubound(InData%p)) + LB(1:1) = lbound(InData%p) + UB(1:1) = ubound(InData%p) do i1 = LB(1), UB(1) - call SrvD_DestroyInput(ServoDyn_DataData%Input(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call BD_PackParam(RF, InData%p(i1)) end do - deallocate(ServoDyn_DataData%Input) end if - if (allocated(ServoDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(ServoDyn_DataData%Input_Saved) - UB(1:1) = ubound(ServoDyn_DataData%Input_Saved) + call RegPack(RF, allocated(InData%y)) + if (allocated(InData%y)) then + call RegPackBounds(RF, 1, lbound(InData%y), ubound(InData%y)) + LB(1:1) = lbound(InData%y) + UB(1:1) = ubound(InData%y) do i1 = LB(1), UB(1) - call SrvD_DestroyInput(ServoDyn_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call BD_PackOutput(RF, InData%y(i1)) end do - deallocate(ServoDyn_DataData%Input_Saved) - end if - if (allocated(ServoDyn_DataData%InputTimes)) then - deallocate(ServoDyn_DataData%InputTimes) - end if - if (allocated(ServoDyn_DataData%InputTimes_Saved)) then - deallocate(ServoDyn_DataData%InputTimes_Saved) end if -end subroutine - -subroutine FAST_PackServoDyn_Data(RF, Indata) - type(RegFile), intent(inout) :: RF - type(ServoDyn_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackServoDyn_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call SrvD_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call SrvD_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call SrvD_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call SrvD_PackOtherState(RF, InData%OtherSt(i1)) - end do - call SrvD_PackParam(RF, InData%p) - call SrvD_PackInput(RF, InData%u) - call SrvD_PackOutput(RF, InData%y) - call SrvD_PackMisc(RF, InData%m) - call SrvD_PackMisc(RF, InData%m_bak) - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) + call RegPack(RF, allocated(InData%m)) + if (allocated(InData%m)) then + call RegPackBounds(RF, 1, lbound(InData%m), ubound(InData%m)) + LB(1:1) = lbound(InData%m) + UB(1:1) = ubound(InData%m) do i1 = LB(1), UB(1) - call SrvD_PackOutput(RF, InData%Output(i1)) + call BD_PackMisc(RF, InData%m(i1)) end do end if - call SrvD_PackOutput(RF, InData%y_interp) call RegPack(RF, allocated(InData%Input)) if (allocated(InData%Input)) then - call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) - LB(1:1) = lbound(InData%Input) - UB(1:1) = ubound(InData%Input) - do i1 = LB(1), UB(1) - call SrvD_PackInput(RF, InData%Input(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call SrvD_PackInput(RF, InData%Input_Saved(i1)) + call RegPackBounds(RF, 2, lbound(InData%Input), ubound(InData%Input)) + LB(1:2) = lbound(InData%Input) + UB(1:2) = ubound(InData%Input) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_PackInput(RF, InData%Input(i1,i2)) + end do end do end if call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackServoDyn_Data(RF, OutData) +subroutine FAST_UnPackBeamDyn_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(ServoDyn_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackServoDyn_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(BeamDyn_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackBeamDyn_Data' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call SrvD_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call SrvD_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call SrvD_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call SrvD_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call SrvD_UnpackParam(RF, OutData%p) ! p - call SrvD_UnpackInput(RF, OutData%u) ! u - call SrvD_UnpackOutput(RF, OutData%y) ! y - call SrvD_UnpackMisc(RF, OutData%m) ! m - call SrvD_UnpackMisc(RF, OutData%m_bak) ! m_bak - if (allocated(OutData%Output)) deallocate(OutData%Output) + if (allocated(OutData%x)) deallocate(OutData%x) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%x(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_UnpackContState(RF, OutData%x(i1,i2)) ! x + end do + end do + end if + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_UnpackDiscState(RF, OutData%xd(i1,i2)) ! xd + end do + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_UnpackConstrState(RF, OutData%z(i1,i2)) ! z + end do + end do + end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_UnpackOtherState(RF, OutData%OtherSt(i1,i2)) ! OtherSt + end do + end do + end if + if (allocated(OutData%p)) deallocate(OutData%p) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%p(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%p.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call SrvD_UnpackOutput(RF, OutData%Output(i1)) ! Output + call BD_UnpackParam(RF, OutData%p(i1)) ! p end do end if - call SrvD_UnpackOutput(RF, OutData%y_interp) ! y_interp - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%y)) deallocate(OutData%y) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%y(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call SrvD_UnpackInput(RF, OutData%Input(i1)) ! Input + call BD_UnpackOutput(RF, OutData%y(i1)) ! y end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + if (allocated(OutData%m)) deallocate(OutData%m) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%m(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%m.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call SrvD_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call BD_UnpackMisc(RF, OutData%m(i1)) ! m + end do + end if + if (allocated(OutData%Input)) deallocate(OutData%Input) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Input(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call BD_UnpackInput(RF, OutData%Input(i1,i2)) ! Input + end do end do end if call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyAeroDyn_Data(SrcAeroDyn_DataData, DstAeroDyn_DataData, CtrlCode, ErrStat, ErrMsg) - type(AeroDyn_Data), intent(inout) :: SrcAeroDyn_DataData - type(AeroDyn_Data), intent(inout) :: DstAeroDyn_DataData +subroutine FAST_CopyElastoDyn_Data(SrcElastoDyn_DataData, DstElastoDyn_DataData, CtrlCode, ErrStat, ErrMsg) + type(ElastoDyn_Data), intent(inout) :: SrcElastoDyn_DataData + type(ElastoDyn_Data), intent(inout) :: DstElastoDyn_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyAeroDyn_Data' + character(*), parameter :: RoutineName = 'FAST_CopyElastoDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcAeroDyn_DataData%x) - UB(1:1) = ubound(SrcAeroDyn_DataData%x) - do i1 = LB(1), UB(1) - call AD_CopyContState(SrcAeroDyn_DataData%x(i1), DstAeroDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcAeroDyn_DataData%xd) - UB(1:1) = ubound(SrcAeroDyn_DataData%xd) - do i1 = LB(1), UB(1) - call AD_CopyDiscState(SrcAeroDyn_DataData%xd(i1), DstAeroDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcAeroDyn_DataData%z) - UB(1:1) = ubound(SrcAeroDyn_DataData%z) - do i1 = LB(1), UB(1) - call AD_CopyConstrState(SrcAeroDyn_DataData%z(i1), DstAeroDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcAeroDyn_DataData%OtherSt) - UB(1:1) = ubound(SrcAeroDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call AD_CopyOtherState(SrcAeroDyn_DataData%OtherSt(i1), DstAeroDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call AD_CopyParam(SrcAeroDyn_DataData%p, DstAeroDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call AD_CopyInput(SrcAeroDyn_DataData%u, DstAeroDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call AD_CopyOutput(SrcAeroDyn_DataData%y, DstAeroDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call AD_CopyMisc(SrcAeroDyn_DataData%m, DstAeroDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcAeroDyn_DataData%Output)) then - LB(1:1) = lbound(SrcAeroDyn_DataData%Output) - UB(1:1) = ubound(SrcAeroDyn_DataData%Output) - if (.not. allocated(DstAeroDyn_DataData%Output)) then - allocate(DstAeroDyn_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcElastoDyn_DataData%x)) then + LB(1:2) = lbound(SrcElastoDyn_DataData%x) + UB(1:2) = ubound(SrcElastoDyn_DataData%x) + if (.not. allocated(DstElastoDyn_DataData%x)) then + allocate(DstElastoDyn_DataData%x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_CopyContState(SrcElastoDyn_DataData%x(i1,i2), DstElastoDyn_DataData%x(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcElastoDyn_DataData%xd)) then + LB(1:2) = lbound(SrcElastoDyn_DataData%xd) + UB(1:2) = ubound(SrcElastoDyn_DataData%xd) + if (.not. allocated(DstElastoDyn_DataData%xd)) then + allocate(DstElastoDyn_DataData%xd(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_CopyDiscState(SrcElastoDyn_DataData%xd(i1,i2), DstElastoDyn_DataData%xd(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcElastoDyn_DataData%z)) then + LB(1:2) = lbound(SrcElastoDyn_DataData%z) + UB(1:2) = ubound(SrcElastoDyn_DataData%z) + if (.not. allocated(DstElastoDyn_DataData%z)) then + allocate(DstElastoDyn_DataData%z(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_CopyConstrState(SrcElastoDyn_DataData%z(i1,i2), DstElastoDyn_DataData%z(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcElastoDyn_DataData%OtherSt)) then + LB(1:2) = lbound(SrcElastoDyn_DataData%OtherSt) + UB(1:2) = ubound(SrcElastoDyn_DataData%OtherSt) + if (.not. allocated(DstElastoDyn_DataData%OtherSt)) then + allocate(DstElastoDyn_DataData%OtherSt(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_CopyOtherState(SrcElastoDyn_DataData%OtherSt(i1,i2), DstElastoDyn_DataData%OtherSt(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcElastoDyn_DataData%p)) then + LB(1:1) = lbound(SrcElastoDyn_DataData%p) + UB(1:1) = ubound(SrcElastoDyn_DataData%p) + if (.not. allocated(DstElastoDyn_DataData%p)) then + allocate(DstElastoDyn_DataData%p(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%p.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call AD_CopyOutput(SrcAeroDyn_DataData%Output(i1), DstAeroDyn_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) + call ED_CopyParam(SrcElastoDyn_DataData%p(i1), DstElastoDyn_DataData%p(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call AD_CopyOutput(SrcAeroDyn_DataData%y_interp, DstAeroDyn_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcAeroDyn_DataData%Input)) then - LB(1:1) = lbound(SrcAeroDyn_DataData%Input) - UB(1:1) = ubound(SrcAeroDyn_DataData%Input) - if (.not. allocated(DstAeroDyn_DataData%Input)) then - allocate(DstAeroDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcElastoDyn_DataData%y)) then + LB(1:1) = lbound(SrcElastoDyn_DataData%y) + UB(1:1) = ubound(SrcElastoDyn_DataData%y) + if (.not. allocated(DstElastoDyn_DataData%y)) then + allocate(DstElastoDyn_DataData%y(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%y.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call AD_CopyInput(SrcAeroDyn_DataData%Input(i1), DstAeroDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call ED_CopyOutput(SrcElastoDyn_DataData%y(i1), DstElastoDyn_DataData%y(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcAeroDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcAeroDyn_DataData%Input_Saved) - UB(1:1) = ubound(SrcAeroDyn_DataData%Input_Saved) - if (.not. allocated(DstAeroDyn_DataData%Input_Saved)) then - allocate(DstAeroDyn_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcElastoDyn_DataData%m)) then + LB(1:1) = lbound(SrcElastoDyn_DataData%m) + UB(1:1) = ubound(SrcElastoDyn_DataData%m) + if (.not. allocated(DstElastoDyn_DataData%m)) then + allocate(DstElastoDyn_DataData%m(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%m.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call AD_CopyInput(SrcAeroDyn_DataData%Input_Saved(i1), DstAeroDyn_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call ED_CopyMisc(SrcElastoDyn_DataData%m(i1), DstElastoDyn_DataData%m(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcAeroDyn_DataData%InputTimes)) then - LB(1:1) = lbound(SrcAeroDyn_DataData%InputTimes) - UB(1:1) = ubound(SrcAeroDyn_DataData%InputTimes) - if (.not. allocated(DstAeroDyn_DataData%InputTimes)) then - allocate(DstAeroDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcElastoDyn_DataData%Input)) then + LB(1:2) = lbound(SrcElastoDyn_DataData%Input) + UB(1:2) = ubound(SrcElastoDyn_DataData%Input) + if (.not. allocated(DstElastoDyn_DataData%Input)) then + allocate(DstElastoDyn_DataData%Input(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if - DstAeroDyn_DataData%InputTimes = SrcAeroDyn_DataData%InputTimes + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_CopyInput(SrcElastoDyn_DataData%Input(i1,i2), DstElastoDyn_DataData%Input(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do end if - if (allocated(SrcAeroDyn_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcAeroDyn_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcAeroDyn_DataData%InputTimes_Saved) - if (.not. allocated(DstAeroDyn_DataData%InputTimes_Saved)) then - allocate(DstAeroDyn_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcElastoDyn_DataData%InputTimes)) then + LB(1:2) = lbound(SrcElastoDyn_DataData%InputTimes) + UB(1:2) = ubound(SrcElastoDyn_DataData%InputTimes) + if (.not. allocated(DstElastoDyn_DataData%InputTimes)) then + allocate(DstElastoDyn_DataData%InputTimes(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstElastoDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstAeroDyn_DataData%InputTimes_Saved = SrcAeroDyn_DataData%InputTimes_Saved + DstElastoDyn_DataData%InputTimes = SrcElastoDyn_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyAeroDyn_Data(AeroDyn_DataData, ErrStat, ErrMsg) - type(AeroDyn_Data), intent(inout) :: AeroDyn_DataData +subroutine FAST_DestroyElastoDyn_Data(ElastoDyn_DataData, ErrStat, ErrMsg) + type(ElastoDyn_Data), intent(inout) :: ElastoDyn_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyAeroDyn_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyElastoDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(AeroDyn_DataData%x) - UB(1:1) = ubound(AeroDyn_DataData%x) - do i1 = LB(1), UB(1) - call AD_DestroyContState(AeroDyn_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(AeroDyn_DataData%xd) - UB(1:1) = ubound(AeroDyn_DataData%xd) - do i1 = LB(1), UB(1) - call AD_DestroyDiscState(AeroDyn_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(AeroDyn_DataData%z) - UB(1:1) = ubound(AeroDyn_DataData%z) - do i1 = LB(1), UB(1) - call AD_DestroyConstrState(AeroDyn_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(AeroDyn_DataData%OtherSt) - UB(1:1) = ubound(AeroDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call AD_DestroyOtherState(AeroDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call AD_DestroyParam(AeroDyn_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AD_DestroyInput(AeroDyn_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AD_DestroyOutput(AeroDyn_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call AD_DestroyMisc(AeroDyn_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(AeroDyn_DataData%Output)) then - LB(1:1) = lbound(AeroDyn_DataData%Output) - UB(1:1) = ubound(AeroDyn_DataData%Output) + if (allocated(ElastoDyn_DataData%x)) then + LB(1:2) = lbound(ElastoDyn_DataData%x) + UB(1:2) = ubound(ElastoDyn_DataData%x) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_DestroyContState(ElastoDyn_DataData%x(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ElastoDyn_DataData%x) + end if + if (allocated(ElastoDyn_DataData%xd)) then + LB(1:2) = lbound(ElastoDyn_DataData%xd) + UB(1:2) = ubound(ElastoDyn_DataData%xd) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_DestroyDiscState(ElastoDyn_DataData%xd(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ElastoDyn_DataData%xd) + end if + if (allocated(ElastoDyn_DataData%z)) then + LB(1:2) = lbound(ElastoDyn_DataData%z) + UB(1:2) = ubound(ElastoDyn_DataData%z) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_DestroyConstrState(ElastoDyn_DataData%z(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ElastoDyn_DataData%z) + end if + if (allocated(ElastoDyn_DataData%OtherSt)) then + LB(1:2) = lbound(ElastoDyn_DataData%OtherSt) + UB(1:2) = ubound(ElastoDyn_DataData%OtherSt) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_DestroyOtherState(ElastoDyn_DataData%OtherSt(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ElastoDyn_DataData%OtherSt) + end if + if (allocated(ElastoDyn_DataData%p)) then + LB(1:1) = lbound(ElastoDyn_DataData%p) + UB(1:1) = ubound(ElastoDyn_DataData%p) do i1 = LB(1), UB(1) - call AD_DestroyOutput(AeroDyn_DataData%Output(i1), ErrStat2, ErrMsg2) + call ED_DestroyParam(ElastoDyn_DataData%p(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(AeroDyn_DataData%Output) + deallocate(ElastoDyn_DataData%p) end if - call AD_DestroyOutput(AeroDyn_DataData%y_interp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(AeroDyn_DataData%Input)) then - LB(1:1) = lbound(AeroDyn_DataData%Input) - UB(1:1) = ubound(AeroDyn_DataData%Input) + if (allocated(ElastoDyn_DataData%y)) then + LB(1:1) = lbound(ElastoDyn_DataData%y) + UB(1:1) = ubound(ElastoDyn_DataData%y) do i1 = LB(1), UB(1) - call AD_DestroyInput(AeroDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call ED_DestroyOutput(ElastoDyn_DataData%y(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(AeroDyn_DataData%Input) + deallocate(ElastoDyn_DataData%y) end if - if (allocated(AeroDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(AeroDyn_DataData%Input_Saved) - UB(1:1) = ubound(AeroDyn_DataData%Input_Saved) + if (allocated(ElastoDyn_DataData%m)) then + LB(1:1) = lbound(ElastoDyn_DataData%m) + UB(1:1) = ubound(ElastoDyn_DataData%m) do i1 = LB(1), UB(1) - call AD_DestroyInput(AeroDyn_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call ED_DestroyMisc(ElastoDyn_DataData%m(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(AeroDyn_DataData%Input_Saved) + deallocate(ElastoDyn_DataData%m) end if - if (allocated(AeroDyn_DataData%InputTimes)) then - deallocate(AeroDyn_DataData%InputTimes) + if (allocated(ElastoDyn_DataData%Input)) then + LB(1:2) = lbound(ElastoDyn_DataData%Input) + UB(1:2) = ubound(ElastoDyn_DataData%Input) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_DestroyInput(ElastoDyn_DataData%Input(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ElastoDyn_DataData%Input) end if - if (allocated(AeroDyn_DataData%InputTimes_Saved)) then - deallocate(AeroDyn_DataData%InputTimes_Saved) + if (allocated(ElastoDyn_DataData%InputTimes)) then + deallocate(ElastoDyn_DataData%InputTimes) end if end subroutine -subroutine FAST_PackAeroDyn_Data(RF, Indata) +subroutine FAST_PackElastoDyn_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(AeroDyn_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackAeroDyn_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(ElastoDyn_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackElastoDyn_Data' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call AD_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call AD_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call AD_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call AD_PackOtherState(RF, InData%OtherSt(i1)) - end do - call AD_PackParam(RF, InData%p) - call AD_PackInput(RF, InData%u) - call AD_PackOutput(RF, InData%y) - call AD_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 2, lbound(InData%x), ubound(InData%x)) + LB(1:2) = lbound(InData%x) + UB(1:2) = ubound(InData%x) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_PackContState(RF, InData%x(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 2, lbound(InData%xd), ubound(InData%xd)) + LB(1:2) = lbound(InData%xd) + UB(1:2) = ubound(InData%xd) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_PackDiscState(RF, InData%xd(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 2, lbound(InData%z), ubound(InData%z)) + LB(1:2) = lbound(InData%z) + UB(1:2) = ubound(InData%z) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_PackConstrState(RF, InData%z(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 2, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:2) = lbound(InData%OtherSt) + UB(1:2) = ubound(InData%OtherSt) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_PackOtherState(RF, InData%OtherSt(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%p)) + if (allocated(InData%p)) then + call RegPackBounds(RF, 1, lbound(InData%p), ubound(InData%p)) + LB(1:1) = lbound(InData%p) + UB(1:1) = ubound(InData%p) + do i1 = LB(1), UB(1) + call ED_PackParam(RF, InData%p(i1)) + end do + end if + call RegPack(RF, allocated(InData%y)) + if (allocated(InData%y)) then + call RegPackBounds(RF, 1, lbound(InData%y), ubound(InData%y)) + LB(1:1) = lbound(InData%y) + UB(1:1) = ubound(InData%y) + do i1 = LB(1), UB(1) + call ED_PackOutput(RF, InData%y(i1)) + end do + end if + call RegPack(RF, allocated(InData%m)) + if (allocated(InData%m)) then + call RegPackBounds(RF, 1, lbound(InData%m), ubound(InData%m)) + LB(1:1) = lbound(InData%m) + UB(1:1) = ubound(InData%m) do i1 = LB(1), UB(1) - call AD_PackOutput(RF, InData%Output(i1)) + call ED_PackMisc(RF, InData%m(i1)) end do end if - call AD_PackOutput(RF, InData%y_interp) call RegPack(RF, allocated(InData%Input)) if (allocated(InData%Input)) then - call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) - LB(1:1) = lbound(InData%Input) - UB(1:1) = ubound(InData%Input) - do i1 = LB(1), UB(1) - call AD_PackInput(RF, InData%Input(i1)) + call RegPackBounds(RF, 2, lbound(InData%Input), ubound(InData%Input)) + LB(1:2) = lbound(InData%Input) + UB(1:2) = ubound(InData%Input) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_PackInput(RF, InData%Input(i1,i2)) + end do + end do + end if + call RegPackAlloc(RF, InData%InputTimes) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_UnPackElastoDyn_Data(RF, OutData) + type(RegFile), intent(inout) :: RF + type(ElastoDyn_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackElastoDyn_Data' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%x)) deallocate(OutData%x) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%x(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_UnpackContState(RF, OutData%x(i1,i2)) ! x + end do + end do + end if + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_UnpackDiscState(RF, OutData%xd(i1,i2)) ! xd + end do + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_UnpackConstrState(RF, OutData%z(i1,i2)) ! z + end do end do end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call AD_PackInput(RF, InData%Input_Saved(i1)) + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_UnpackOtherState(RF, OutData%OtherSt(i1,i2)) ! OtherSt + end do end do end if - call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackAeroDyn_Data(RF, OutData) - type(RegFile), intent(inout) :: RF - type(AeroDyn_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackAeroDyn_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call AD_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call AD_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call AD_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call AD_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call AD_UnpackParam(RF, OutData%p) ! p - call AD_UnpackInput(RF, OutData%u) ! u - call AD_UnpackOutput(RF, OutData%y) ! y - call AD_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Output)) deallocate(OutData%Output) + if (allocated(OutData%p)) deallocate(OutData%p) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%p(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%p.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call AD_UnpackOutput(RF, OutData%Output(i1)) ! Output + call ED_UnpackParam(RF, OutData%p(i1)) ! p end do end if - call AD_UnpackOutput(RF, OutData%y_interp) ! y_interp - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%y)) deallocate(OutData%y) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%y(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call AD_UnpackInput(RF, OutData%Input(i1)) ! Input + call ED_UnpackOutput(RF, OutData%y(i1)) ! y end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + if (allocated(OutData%m)) deallocate(OutData%m) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%m(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%m.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call AD_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call ED_UnpackMisc(RF, OutData%m(i1)) ! m + end do + end if + if (allocated(OutData%Input)) deallocate(OutData%Input) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Input(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call ED_UnpackInput(RF, OutData%Input(i1,i2)) ! Input + end do end do end if - call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyExtLoads_Data(SrcExtLoads_DataData, DstExtLoads_DataData, CtrlCode, ErrStat, ErrMsg) - type(ExtLoads_Data), intent(inout) :: SrcExtLoads_DataData - type(ExtLoads_Data), intent(inout) :: DstExtLoads_DataData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyExtLoads_Data' - ErrStat = ErrID_None - ErrMsg = '' - LB(1:1) = lbound(SrcExtLoads_DataData%x) - UB(1:1) = ubound(SrcExtLoads_DataData%x) - do i1 = LB(1), UB(1) - call ExtLd_CopyContState(SrcExtLoads_DataData%x(i1), DstExtLoads_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcExtLoads_DataData%xd) - UB(1:1) = ubound(SrcExtLoads_DataData%xd) - do i1 = LB(1), UB(1) - call ExtLd_CopyDiscState(SrcExtLoads_DataData%xd(i1), DstExtLoads_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcExtLoads_DataData%z) - UB(1:1) = ubound(SrcExtLoads_DataData%z) - do i1 = LB(1), UB(1) - call ExtLd_CopyConstrState(SrcExtLoads_DataData%z(i1), DstExtLoads_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcExtLoads_DataData%OtherSt) - UB(1:1) = ubound(SrcExtLoads_DataData%OtherSt) - do i1 = LB(1), UB(1) - call ExtLd_CopyOtherState(SrcExtLoads_DataData%OtherSt(i1), DstExtLoads_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call ExtLd_CopyParam(SrcExtLoads_DataData%p, DstExtLoads_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ExtLd_CopyInput(SrcExtLoads_DataData%u, DstExtLoads_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ExtLd_CopyOutput(SrcExtLoads_DataData%y, DstExtLoads_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ExtLd_CopyMisc(SrcExtLoads_DataData%m, DstExtLoads_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcExtLoads_DataData%InputTimes)) then - LB(1:1) = lbound(SrcExtLoads_DataData%InputTimes) - UB(1:1) = ubound(SrcExtLoads_DataData%InputTimes) - if (.not. allocated(DstExtLoads_DataData%InputTimes)) then - allocate(DstExtLoads_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstExtLoads_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstExtLoads_DataData%InputTimes = SrcExtLoads_DataData%InputTimes - end if -end subroutine - -subroutine FAST_DestroyExtLoads_Data(ExtLoads_DataData, ErrStat, ErrMsg) - type(ExtLoads_Data), intent(inout) :: ExtLoads_DataData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyExtLoads_Data' - ErrStat = ErrID_None - ErrMsg = '' - LB(1:1) = lbound(ExtLoads_DataData%x) - UB(1:1) = ubound(ExtLoads_DataData%x) - do i1 = LB(1), UB(1) - call ExtLd_DestroyContState(ExtLoads_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(ExtLoads_DataData%xd) - UB(1:1) = ubound(ExtLoads_DataData%xd) - do i1 = LB(1), UB(1) - call ExtLd_DestroyDiscState(ExtLoads_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(ExtLoads_DataData%z) - UB(1:1) = ubound(ExtLoads_DataData%z) - do i1 = LB(1), UB(1) - call ExtLd_DestroyConstrState(ExtLoads_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(ExtLoads_DataData%OtherSt) - UB(1:1) = ubound(ExtLoads_DataData%OtherSt) - do i1 = LB(1), UB(1) - call ExtLd_DestroyOtherState(ExtLoads_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call ExtLd_DestroyParam(ExtLoads_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ExtLd_DestroyInput(ExtLoads_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ExtLd_DestroyOutput(ExtLoads_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ExtLd_DestroyMisc(ExtLoads_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ExtLoads_DataData%InputTimes)) then - deallocate(ExtLoads_DataData%InputTimes) - end if -end subroutine - -subroutine FAST_PackExtLoads_Data(RF, Indata) - type(RegFile), intent(inout) :: RF - type(ExtLoads_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackExtLoads_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call ExtLd_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call ExtLd_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call ExtLd_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call ExtLd_PackOtherState(RF, InData%OtherSt(i1)) - end do - call ExtLd_PackParam(RF, InData%p) - call ExtLd_PackInput(RF, InData%u) - call ExtLd_PackOutput(RF, InData%y) - call ExtLd_PackMisc(RF, InData%m) - call RegPackAlloc(RF, InData%InputTimes) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackExtLoads_Data(RF, OutData) - type(RegFile), intent(inout) :: RF - type(ExtLoads_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackExtLoads_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call ExtLd_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call ExtLd_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call ExtLd_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call ExtLd_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call ExtLd_UnpackParam(RF, OutData%p) ! p - call ExtLd_UnpackInput(RF, OutData%u) ! u - call ExtLd_UnpackOutput(RF, OutData%y) ! y - call ExtLd_UnpackMisc(RF, OutData%m) ! m call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyAeroDisk_Data(SrcAeroDisk_DataData, DstAeroDisk_DataData, CtrlCode, ErrStat, ErrMsg) - type(AeroDisk_Data), intent(inout) :: SrcAeroDisk_DataData - type(AeroDisk_Data), intent(inout) :: DstAeroDisk_DataData +subroutine FAST_CopySED_Data(SrcSED_DataData, DstSED_DataData, CtrlCode, ErrStat, ErrMsg) + type(SED_Data), intent(inout) :: SrcSED_DataData + type(SED_Data), intent(inout) :: DstSED_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -9116,267 +3458,302 @@ subroutine FAST_CopyAeroDisk_Data(SrcAeroDisk_DataData, DstAeroDisk_DataData, Ct integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyAeroDisk_Data' + character(*), parameter :: RoutineName = 'FAST_CopySED_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcAeroDisk_DataData%x) - UB(1:1) = ubound(SrcAeroDisk_DataData%x) - do i1 = LB(1), UB(1) - call ADsk_CopyContState(SrcAeroDisk_DataData%x(i1), DstAeroDisk_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcAeroDisk_DataData%xd) - UB(1:1) = ubound(SrcAeroDisk_DataData%xd) - do i1 = LB(1), UB(1) - call ADsk_CopyDiscState(SrcAeroDisk_DataData%xd(i1), DstAeroDisk_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcAeroDisk_DataData%z) - UB(1:1) = ubound(SrcAeroDisk_DataData%z) - do i1 = LB(1), UB(1) - call ADsk_CopyConstrState(SrcAeroDisk_DataData%z(i1), DstAeroDisk_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcAeroDisk_DataData%OtherSt) - UB(1:1) = ubound(SrcAeroDisk_DataData%OtherSt) - do i1 = LB(1), UB(1) - call ADsk_CopyOtherState(SrcAeroDisk_DataData%OtherSt(i1), DstAeroDisk_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call ADsk_CopyParam(SrcAeroDisk_DataData%p, DstAeroDisk_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ADsk_CopyInput(SrcAeroDisk_DataData%u, DstAeroDisk_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ADsk_CopyOutput(SrcAeroDisk_DataData%y, DstAeroDisk_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ADsk_CopyMisc(SrcAeroDisk_DataData%m, DstAeroDisk_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcAeroDisk_DataData%Output)) then - LB(1:1) = lbound(SrcAeroDisk_DataData%Output) - UB(1:1) = ubound(SrcAeroDisk_DataData%Output) - if (.not. allocated(DstAeroDisk_DataData%Output)) then - allocate(DstAeroDisk_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSED_DataData%x)) then + LB(1:1) = lbound(SrcSED_DataData%x) + UB(1:1) = ubound(SrcSED_DataData%x) + if (.not. allocated(DstSED_DataData%x)) then + allocate(DstSED_DataData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstSED_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SED_CopyContState(SrcSED_DataData%x(i1), DstSED_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcSED_DataData%xd)) then + LB(1:1) = lbound(SrcSED_DataData%xd) + UB(1:1) = ubound(SrcSED_DataData%xd) + if (.not. allocated(DstSED_DataData%xd)) then + allocate(DstSED_DataData%xd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstSED_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SED_CopyDiscState(SrcSED_DataData%xd(i1), DstSED_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcSED_DataData%z)) then + LB(1:1) = lbound(SrcSED_DataData%z) + UB(1:1) = ubound(SrcSED_DataData%z) + if (.not. allocated(DstSED_DataData%z)) then + allocate(DstSED_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDisk_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSED_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call ADsk_CopyOutput(SrcAeroDisk_DataData%Output(i1), DstAeroDisk_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) + call SED_CopyConstrState(SrcSED_DataData%z(i1), DstSED_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call ADsk_CopyOutput(SrcAeroDisk_DataData%y_interp, DstAeroDisk_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) + if (allocated(SrcSED_DataData%OtherSt)) then + LB(1:1) = lbound(SrcSED_DataData%OtherSt) + UB(1:1) = ubound(SrcSED_DataData%OtherSt) + if (.not. allocated(DstSED_DataData%OtherSt)) then + allocate(DstSED_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstSED_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SED_CopyOtherState(SrcSED_DataData%OtherSt(i1), DstSED_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call SED_CopyParam(SrcSED_DataData%p, DstSED_DataData%p, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcAeroDisk_DataData%Input)) then - LB(1:1) = lbound(SrcAeroDisk_DataData%Input) - UB(1:1) = ubound(SrcAeroDisk_DataData%Input) - if (.not. allocated(DstAeroDisk_DataData%Input)) then - allocate(DstAeroDisk_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + call SED_CopyOutput(SrcSED_DataData%y, DstSED_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SED_CopyMisc(SrcSED_DataData%m, DstSED_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcSED_DataData%Input)) then + LB(1:1) = lbound(SrcSED_DataData%Input) + UB(1:1) = ubound(SrcSED_DataData%Input) + if (.not. allocated(DstSED_DataData%Input)) then + allocate(DstSED_DataData%Input(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDisk_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSED_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call ADsk_CopyInput(SrcAeroDisk_DataData%Input(i1), DstAeroDisk_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SED_CopyInput(SrcSED_DataData%Input(i1), DstSED_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcAeroDisk_DataData%InputTimes)) then - LB(1:1) = lbound(SrcAeroDisk_DataData%InputTimes) - UB(1:1) = ubound(SrcAeroDisk_DataData%InputTimes) - if (.not. allocated(DstAeroDisk_DataData%InputTimes)) then - allocate(DstAeroDisk_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSED_DataData%InputTimes)) then + LB(1:1) = lbound(SrcSED_DataData%InputTimes) + UB(1:1) = ubound(SrcSED_DataData%InputTimes) + if (.not. allocated(DstSED_DataData%InputTimes)) then + allocate(DstSED_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDisk_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSED_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstAeroDisk_DataData%InputTimes = SrcAeroDisk_DataData%InputTimes + DstSED_DataData%InputTimes = SrcSED_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyAeroDisk_Data(AeroDisk_DataData, ErrStat, ErrMsg) - type(AeroDisk_Data), intent(inout) :: AeroDisk_DataData +subroutine FAST_DestroySED_Data(SED_DataData, ErrStat, ErrMsg) + type(SED_Data), intent(inout) :: SED_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyAeroDisk_Data' + character(*), parameter :: RoutineName = 'FAST_DestroySED_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(AeroDisk_DataData%x) - UB(1:1) = ubound(AeroDisk_DataData%x) - do i1 = LB(1), UB(1) - call ADsk_DestroyContState(AeroDisk_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(AeroDisk_DataData%xd) - UB(1:1) = ubound(AeroDisk_DataData%xd) - do i1 = LB(1), UB(1) - call ADsk_DestroyDiscState(AeroDisk_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(AeroDisk_DataData%z) - UB(1:1) = ubound(AeroDisk_DataData%z) - do i1 = LB(1), UB(1) - call ADsk_DestroyConstrState(AeroDisk_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(AeroDisk_DataData%OtherSt) - UB(1:1) = ubound(AeroDisk_DataData%OtherSt) - do i1 = LB(1), UB(1) - call ADsk_DestroyOtherState(AeroDisk_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call ADsk_DestroyParam(AeroDisk_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ADsk_DestroyInput(AeroDisk_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ADsk_DestroyOutput(AeroDisk_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ADsk_DestroyMisc(AeroDisk_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(AeroDisk_DataData%Output)) then - LB(1:1) = lbound(AeroDisk_DataData%Output) - UB(1:1) = ubound(AeroDisk_DataData%Output) + if (allocated(SED_DataData%x)) then + LB(1:1) = lbound(SED_DataData%x) + UB(1:1) = ubound(SED_DataData%x) + do i1 = LB(1), UB(1) + call SED_DestroyContState(SED_DataData%x(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SED_DataData%x) + end if + if (allocated(SED_DataData%xd)) then + LB(1:1) = lbound(SED_DataData%xd) + UB(1:1) = ubound(SED_DataData%xd) + do i1 = LB(1), UB(1) + call SED_DestroyDiscState(SED_DataData%xd(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SED_DataData%xd) + end if + if (allocated(SED_DataData%z)) then + LB(1:1) = lbound(SED_DataData%z) + UB(1:1) = ubound(SED_DataData%z) + do i1 = LB(1), UB(1) + call SED_DestroyConstrState(SED_DataData%z(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SED_DataData%z) + end if + if (allocated(SED_DataData%OtherSt)) then + LB(1:1) = lbound(SED_DataData%OtherSt) + UB(1:1) = ubound(SED_DataData%OtherSt) do i1 = LB(1), UB(1) - call ADsk_DestroyOutput(AeroDisk_DataData%Output(i1), ErrStat2, ErrMsg2) + call SED_DestroyOtherState(SED_DataData%OtherSt(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(AeroDisk_DataData%Output) + deallocate(SED_DataData%OtherSt) end if - call ADsk_DestroyOutput(AeroDisk_DataData%y_interp, ErrStat2, ErrMsg2) + call SED_DestroyParam(SED_DataData%p, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(AeroDisk_DataData%Input)) then - LB(1:1) = lbound(AeroDisk_DataData%Input) - UB(1:1) = ubound(AeroDisk_DataData%Input) + call SED_DestroyOutput(SED_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SED_DestroyMisc(SED_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(SED_DataData%Input)) then + LB(1:1) = lbound(SED_DataData%Input) + UB(1:1) = ubound(SED_DataData%Input) do i1 = LB(1), UB(1) - call ADsk_DestroyInput(AeroDisk_DataData%Input(i1), ErrStat2, ErrMsg2) + call SED_DestroyInput(SED_DataData%Input(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(AeroDisk_DataData%Input) + deallocate(SED_DataData%Input) end if - if (allocated(AeroDisk_DataData%InputTimes)) then - deallocate(AeroDisk_DataData%InputTimes) + if (allocated(SED_DataData%InputTimes)) then + deallocate(SED_DataData%InputTimes) end if end subroutine -subroutine FAST_PackAeroDisk_Data(RF, Indata) +subroutine FAST_PackSED_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(AeroDisk_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackAeroDisk_Data' + type(SED_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackSED_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call ADsk_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call ADsk_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call ADsk_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call ADsk_PackOtherState(RF, InData%OtherSt(i1)) - end do - call ADsk_PackParam(RF, InData%p) - call ADsk_PackInput(RF, InData%u) - call ADsk_PackOutput(RF, InData%y) - call ADsk_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) + do i1 = LB(1), UB(1) + call SED_PackContState(RF, InData%x(i1)) + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) + do i1 = LB(1), UB(1) + call SED_PackDiscState(RF, InData%xd(i1)) + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) + do i1 = LB(1), UB(1) + call SED_PackConstrState(RF, InData%z(i1)) + end do + end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call ADsk_PackOutput(RF, InData%Output(i1)) + call SED_PackOtherState(RF, InData%OtherSt(i1)) end do end if - call ADsk_PackOutput(RF, InData%y_interp) + call SED_PackParam(RF, InData%p) + call SED_PackOutput(RF, InData%y) + call SED_PackMisc(RF, InData%m) call RegPack(RF, allocated(InData%Input)) if (allocated(InData%Input)) then call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) LB(1:1) = lbound(InData%Input) UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call ADsk_PackInput(RF, InData%Input(i1)) + call SED_PackInput(RF, InData%Input(i1)) + end do + end if + call RegPackAlloc(RF, InData%InputTimes) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_UnPackSED_Data(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SED_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackSED_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%x)) deallocate(OutData%x) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%x(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SED_UnpackContState(RF, OutData%x(i1)) ! x + end do + end if + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SED_UnpackDiscState(RF, OutData%xd(i1)) ! xd + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SED_UnpackConstrState(RF, OutData%z(i1)) ! z end do end if - call RegPackAlloc(RF, InData%InputTimes) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackAeroDisk_Data(RF, OutData) - type(RegFile), intent(inout) :: RF - type(AeroDisk_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackAeroDisk_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call ADsk_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call ADsk_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call ADsk_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call ADsk_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call ADsk_UnpackParam(RF, OutData%p) ! p - call ADsk_UnpackInput(RF, OutData%u) ! u - call ADsk_UnpackOutput(RF, OutData%y) ! y - call ADsk_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Output)) deallocate(OutData%Output) + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call ADsk_UnpackOutput(RF, OutData%Output(i1)) ! Output + call SED_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - call ADsk_UnpackOutput(RF, OutData%y_interp) ! y_interp + call SED_UnpackParam(RF, OutData%p) ! p + call SED_UnpackOutput(RF, OutData%y) ! y + call SED_UnpackMisc(RF, OutData%m) ! m if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -9387,433 +3764,497 @@ subroutine FAST_UnPackAeroDisk_Data(RF, OutData) return end if do i1 = LB(1), UB(1) - call ADsk_UnpackInput(RF, OutData%Input(i1)) ! Input + call SED_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyInflowWind_Data(SrcInflowWind_DataData, DstInflowWind_DataData, CtrlCode, ErrStat, ErrMsg) - type(InflowWind_Data), intent(in) :: SrcInflowWind_DataData - type(InflowWind_Data), intent(inout) :: DstInflowWind_DataData +subroutine FAST_CopyServoDyn_Data(SrcServoDyn_DataData, DstServoDyn_DataData, CtrlCode, ErrStat, ErrMsg) + type(ServoDyn_Data), intent(inout) :: SrcServoDyn_DataData + type(ServoDyn_Data), intent(inout) :: DstServoDyn_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyInflowWind_Data' + character(*), parameter :: RoutineName = 'FAST_CopyServoDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcInflowWind_DataData%x) - UB(1:1) = ubound(SrcInflowWind_DataData%x) - do i1 = LB(1), UB(1) - call InflowWind_CopyContState(SrcInflowWind_DataData%x(i1), DstInflowWind_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcInflowWind_DataData%xd) - UB(1:1) = ubound(SrcInflowWind_DataData%xd) - do i1 = LB(1), UB(1) - call InflowWind_CopyDiscState(SrcInflowWind_DataData%xd(i1), DstInflowWind_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcInflowWind_DataData%z) - UB(1:1) = ubound(SrcInflowWind_DataData%z) - do i1 = LB(1), UB(1) - call InflowWind_CopyConstrState(SrcInflowWind_DataData%z(i1), DstInflowWind_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcInflowWind_DataData%OtherSt) - UB(1:1) = ubound(SrcInflowWind_DataData%OtherSt) - do i1 = LB(1), UB(1) - call InflowWind_CopyOtherState(SrcInflowWind_DataData%OtherSt(i1), DstInflowWind_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call InflowWind_CopyParam(SrcInflowWind_DataData%p, DstInflowWind_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call InflowWind_CopyInput(SrcInflowWind_DataData%u, DstInflowWind_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call InflowWind_CopyOutput(SrcInflowWind_DataData%y, DstInflowWind_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call InflowWind_CopyMisc(SrcInflowWind_DataData%m, DstInflowWind_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcInflowWind_DataData%Output)) then - LB(1:1) = lbound(SrcInflowWind_DataData%Output) - UB(1:1) = ubound(SrcInflowWind_DataData%Output) - if (.not. allocated(DstInflowWind_DataData%Output)) then - allocate(DstInflowWind_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcServoDyn_DataData%x)) then + LB(1:2) = lbound(SrcServoDyn_DataData%x) + UB(1:2) = ubound(SrcServoDyn_DataData%x) + if (.not. allocated(DstServoDyn_DataData%x)) then + allocate(DstServoDyn_DataData%x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_CopyContState(SrcServoDyn_DataData%x(i1,i2), DstServoDyn_DataData%x(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcServoDyn_DataData%xd)) then + LB(1:2) = lbound(SrcServoDyn_DataData%xd) + UB(1:2) = ubound(SrcServoDyn_DataData%xd) + if (.not. allocated(DstServoDyn_DataData%xd)) then + allocate(DstServoDyn_DataData%xd(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_CopyDiscState(SrcServoDyn_DataData%xd(i1,i2), DstServoDyn_DataData%xd(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcServoDyn_DataData%z)) then + LB(1:2) = lbound(SrcServoDyn_DataData%z) + UB(1:2) = ubound(SrcServoDyn_DataData%z) + if (.not. allocated(DstServoDyn_DataData%z)) then + allocate(DstServoDyn_DataData%z(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_CopyConstrState(SrcServoDyn_DataData%z(i1,i2), DstServoDyn_DataData%z(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcServoDyn_DataData%OtherSt)) then + LB(1:2) = lbound(SrcServoDyn_DataData%OtherSt) + UB(1:2) = ubound(SrcServoDyn_DataData%OtherSt) + if (.not. allocated(DstServoDyn_DataData%OtherSt)) then + allocate(DstServoDyn_DataData%OtherSt(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_CopyOtherState(SrcServoDyn_DataData%OtherSt(i1,i2), DstServoDyn_DataData%OtherSt(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcServoDyn_DataData%p)) then + LB(1:1) = lbound(SrcServoDyn_DataData%p) + UB(1:1) = ubound(SrcServoDyn_DataData%p) + if (.not. allocated(DstServoDyn_DataData%p)) then + allocate(DstServoDyn_DataData%p(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%p.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call InflowWind_CopyOutput(SrcInflowWind_DataData%Output(i1), DstInflowWind_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) + call SrvD_CopyParam(SrcServoDyn_DataData%p(i1), DstServoDyn_DataData%p(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call InflowWind_CopyOutput(SrcInflowWind_DataData%y_interp, DstInflowWind_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcInflowWind_DataData%Input)) then - LB(1:1) = lbound(SrcInflowWind_DataData%Input) - UB(1:1) = ubound(SrcInflowWind_DataData%Input) - if (.not. allocated(DstInflowWind_DataData%Input)) then - allocate(DstInflowWind_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcServoDyn_DataData%y)) then + LB(1:1) = lbound(SrcServoDyn_DataData%y) + UB(1:1) = ubound(SrcServoDyn_DataData%y) + if (.not. allocated(DstServoDyn_DataData%y)) then + allocate(DstServoDyn_DataData%y(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%y.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call InflowWind_CopyInput(SrcInflowWind_DataData%Input(i1), DstInflowWind_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SrvD_CopyOutput(SrcServoDyn_DataData%y(i1), DstServoDyn_DataData%y(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcInflowWind_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcInflowWind_DataData%Input_Saved) - UB(1:1) = ubound(SrcInflowWind_DataData%Input_Saved) - if (.not. allocated(DstInflowWind_DataData%Input_Saved)) then - allocate(DstInflowWind_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcServoDyn_DataData%m)) then + LB(1:1) = lbound(SrcServoDyn_DataData%m) + UB(1:1) = ubound(SrcServoDyn_DataData%m) + if (.not. allocated(DstServoDyn_DataData%m)) then + allocate(DstServoDyn_DataData%m(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%m.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call InflowWind_CopyInput(SrcInflowWind_DataData%Input_Saved(i1), DstInflowWind_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call SrvD_CopyMisc(SrcServoDyn_DataData%m(i1), DstServoDyn_DataData%m(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcInflowWind_DataData%InputTimes)) then - LB(1:1) = lbound(SrcInflowWind_DataData%InputTimes) - UB(1:1) = ubound(SrcInflowWind_DataData%InputTimes) - if (.not. allocated(DstInflowWind_DataData%InputTimes)) then - allocate(DstInflowWind_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcServoDyn_DataData%Input)) then + LB(1:2) = lbound(SrcServoDyn_DataData%Input) + UB(1:2) = ubound(SrcServoDyn_DataData%Input) + if (.not. allocated(DstServoDyn_DataData%Input)) then + allocate(DstServoDyn_DataData%Input(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInflowWind_DataData%InputTimes = SrcInflowWind_DataData%InputTimes + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_CopyInput(SrcServoDyn_DataData%Input(i1,i2), DstServoDyn_DataData%Input(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do end if - if (allocated(SrcInflowWind_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcInflowWind_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcInflowWind_DataData%InputTimes_Saved) - if (.not. allocated(DstInflowWind_DataData%InputTimes_Saved)) then - allocate(DstInflowWind_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcServoDyn_DataData%InputTimes)) then + LB(1:2) = lbound(SrcServoDyn_DataData%InputTimes) + UB(1:2) = ubound(SrcServoDyn_DataData%InputTimes) + if (.not. allocated(DstServoDyn_DataData%InputTimes)) then + allocate(DstServoDyn_DataData%InputTimes(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstServoDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInflowWind_DataData%InputTimes_Saved = SrcInflowWind_DataData%InputTimes_Saved + DstServoDyn_DataData%InputTimes = SrcServoDyn_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyInflowWind_Data(InflowWind_DataData, ErrStat, ErrMsg) - type(InflowWind_Data), intent(inout) :: InflowWind_DataData +subroutine FAST_DestroyServoDyn_Data(ServoDyn_DataData, ErrStat, ErrMsg) + type(ServoDyn_Data), intent(inout) :: ServoDyn_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyInflowWind_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyServoDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(InflowWind_DataData%x) - UB(1:1) = ubound(InflowWind_DataData%x) - do i1 = LB(1), UB(1) - call InflowWind_DestroyContState(InflowWind_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(InflowWind_DataData%xd) - UB(1:1) = ubound(InflowWind_DataData%xd) - do i1 = LB(1), UB(1) - call InflowWind_DestroyDiscState(InflowWind_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(InflowWind_DataData%z) - UB(1:1) = ubound(InflowWind_DataData%z) - do i1 = LB(1), UB(1) - call InflowWind_DestroyConstrState(InflowWind_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(InflowWind_DataData%OtherSt) - UB(1:1) = ubound(InflowWind_DataData%OtherSt) - do i1 = LB(1), UB(1) - call InflowWind_DestroyOtherState(InflowWind_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call InflowWind_DestroyParam(InflowWind_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call InflowWind_DestroyInput(InflowWind_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call InflowWind_DestroyOutput(InflowWind_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call InflowWind_DestroyMisc(InflowWind_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(InflowWind_DataData%Output)) then - LB(1:1) = lbound(InflowWind_DataData%Output) - UB(1:1) = ubound(InflowWind_DataData%Output) + if (allocated(ServoDyn_DataData%x)) then + LB(1:2) = lbound(ServoDyn_DataData%x) + UB(1:2) = ubound(ServoDyn_DataData%x) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_DestroyContState(ServoDyn_DataData%x(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ServoDyn_DataData%x) + end if + if (allocated(ServoDyn_DataData%xd)) then + LB(1:2) = lbound(ServoDyn_DataData%xd) + UB(1:2) = ubound(ServoDyn_DataData%xd) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_DestroyDiscState(ServoDyn_DataData%xd(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ServoDyn_DataData%xd) + end if + if (allocated(ServoDyn_DataData%z)) then + LB(1:2) = lbound(ServoDyn_DataData%z) + UB(1:2) = ubound(ServoDyn_DataData%z) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_DestroyConstrState(ServoDyn_DataData%z(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ServoDyn_DataData%z) + end if + if (allocated(ServoDyn_DataData%OtherSt)) then + LB(1:2) = lbound(ServoDyn_DataData%OtherSt) + UB(1:2) = ubound(ServoDyn_DataData%OtherSt) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_DestroyOtherState(ServoDyn_DataData%OtherSt(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ServoDyn_DataData%OtherSt) + end if + if (allocated(ServoDyn_DataData%p)) then + LB(1:1) = lbound(ServoDyn_DataData%p) + UB(1:1) = ubound(ServoDyn_DataData%p) + do i1 = LB(1), UB(1) + call SrvD_DestroyParam(ServoDyn_DataData%p(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ServoDyn_DataData%p) + end if + if (allocated(ServoDyn_DataData%y)) then + LB(1:1) = lbound(ServoDyn_DataData%y) + UB(1:1) = ubound(ServoDyn_DataData%y) + do i1 = LB(1), UB(1) + call SrvD_DestroyOutput(ServoDyn_DataData%y(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ServoDyn_DataData%y) + end if + if (allocated(ServoDyn_DataData%m)) then + LB(1:1) = lbound(ServoDyn_DataData%m) + UB(1:1) = ubound(ServoDyn_DataData%m) do i1 = LB(1), UB(1) - call InflowWind_DestroyOutput(InflowWind_DataData%Output(i1), ErrStat2, ErrMsg2) + call SrvD_DestroyMisc(ServoDyn_DataData%m(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(InflowWind_DataData%Output) + deallocate(ServoDyn_DataData%m) + end if + if (allocated(ServoDyn_DataData%Input)) then + LB(1:2) = lbound(ServoDyn_DataData%Input) + UB(1:2) = ubound(ServoDyn_DataData%Input) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_DestroyInput(ServoDyn_DataData%Input(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(ServoDyn_DataData%Input) + end if + if (allocated(ServoDyn_DataData%InputTimes)) then + deallocate(ServoDyn_DataData%InputTimes) + end if +end subroutine + +subroutine FAST_PackServoDyn_Data(RF, Indata) + type(RegFile), intent(inout) :: RF + type(ServoDyn_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackServoDyn_Data' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 2, lbound(InData%x), ubound(InData%x)) + LB(1:2) = lbound(InData%x) + UB(1:2) = ubound(InData%x) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_PackContState(RF, InData%x(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 2, lbound(InData%xd), ubound(InData%xd)) + LB(1:2) = lbound(InData%xd) + UB(1:2) = ubound(InData%xd) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_PackDiscState(RF, InData%xd(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 2, lbound(InData%z), ubound(InData%z)) + LB(1:2) = lbound(InData%z) + UB(1:2) = ubound(InData%z) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_PackConstrState(RF, InData%z(i1,i2)) + end do + end do end if - call InflowWind_DestroyOutput(InflowWind_DataData%y_interp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(InflowWind_DataData%Input)) then - LB(1:1) = lbound(InflowWind_DataData%Input) - UB(1:1) = ubound(InflowWind_DataData%Input) - do i1 = LB(1), UB(1) - call InflowWind_DestroyInput(InflowWind_DataData%Input(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 2, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:2) = lbound(InData%OtherSt) + UB(1:2) = ubound(InData%OtherSt) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_PackOtherState(RF, InData%OtherSt(i1,i2)) + end do end do - deallocate(InflowWind_DataData%Input) end if - if (allocated(InflowWind_DataData%Input_Saved)) then - LB(1:1) = lbound(InflowWind_DataData%Input_Saved) - UB(1:1) = ubound(InflowWind_DataData%Input_Saved) + call RegPack(RF, allocated(InData%p)) + if (allocated(InData%p)) then + call RegPackBounds(RF, 1, lbound(InData%p), ubound(InData%p)) + LB(1:1) = lbound(InData%p) + UB(1:1) = ubound(InData%p) do i1 = LB(1), UB(1) - call InflowWind_DestroyInput(InflowWind_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SrvD_PackParam(RF, InData%p(i1)) end do - deallocate(InflowWind_DataData%Input_Saved) - end if - if (allocated(InflowWind_DataData%InputTimes)) then - deallocate(InflowWind_DataData%InputTimes) end if - if (allocated(InflowWind_DataData%InputTimes_Saved)) then - deallocate(InflowWind_DataData%InputTimes_Saved) - end if -end subroutine - -subroutine FAST_PackInflowWind_Data(RF, Indata) - type(RegFile), intent(inout) :: RF - type(InflowWind_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackInflowWind_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) - if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call InflowWind_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call InflowWind_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call InflowWind_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call InflowWind_PackOtherState(RF, InData%OtherSt(i1)) - end do - call InflowWind_PackParam(RF, InData%p) - call InflowWind_PackInput(RF, InData%u) - call InflowWind_PackOutput(RF, InData%y) - call InflowWind_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) + call RegPack(RF, allocated(InData%y)) + if (allocated(InData%y)) then + call RegPackBounds(RF, 1, lbound(InData%y), ubound(InData%y)) + LB(1:1) = lbound(InData%y) + UB(1:1) = ubound(InData%y) do i1 = LB(1), UB(1) - call InflowWind_PackOutput(RF, InData%Output(i1)) + call SrvD_PackOutput(RF, InData%y(i1)) end do end if - call InflowWind_PackOutput(RF, InData%y_interp) - call RegPack(RF, allocated(InData%Input)) - if (allocated(InData%Input)) then - call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) - LB(1:1) = lbound(InData%Input) - UB(1:1) = ubound(InData%Input) + call RegPack(RF, allocated(InData%m)) + if (allocated(InData%m)) then + call RegPackBounds(RF, 1, lbound(InData%m), ubound(InData%m)) + LB(1:1) = lbound(InData%m) + UB(1:1) = ubound(InData%m) do i1 = LB(1), UB(1) - call InflowWind_PackInput(RF, InData%Input(i1)) + call SrvD_PackMisc(RF, InData%m(i1)) end do end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call InflowWind_PackInput(RF, InData%Input_Saved(i1)) + call RegPack(RF, allocated(InData%Input)) + if (allocated(InData%Input)) then + call RegPackBounds(RF, 2, lbound(InData%Input), ubound(InData%Input)) + LB(1:2) = lbound(InData%Input) + UB(1:2) = ubound(InData%Input) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_PackInput(RF, InData%Input(i1,i2)) + end do end do end if call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackInflowWind_Data(RF, OutData) +subroutine FAST_UnPackServoDyn_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(InflowWind_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackInflowWind_Data' - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) + type(ServoDyn_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackServoDyn_Data' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call InflowWind_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call InflowWind_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call InflowWind_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call InflowWind_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call InflowWind_UnpackParam(RF, OutData%p) ! p - call InflowWind_UnpackInput(RF, OutData%u) ! u - call InflowWind_UnpackOutput(RF, OutData%y) ! y - call InflowWind_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Output)) deallocate(OutData%Output) + if (allocated(OutData%x)) deallocate(OutData%x) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%x(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_UnpackContState(RF, OutData%x(i1,i2)) ! x + end do + end do + end if + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_UnpackDiscState(RF, OutData%xd(i1,i2)) ! xd + end do + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_UnpackConstrState(RF, OutData%z(i1,i2)) ! z + end do + end do + end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_UnpackOtherState(RF, OutData%OtherSt(i1,i2)) ! OtherSt + end do + end do + end if + if (allocated(OutData%p)) deallocate(OutData%p) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%p(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%p.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call InflowWind_UnpackOutput(RF, OutData%Output(i1)) ! Output + call SrvD_UnpackParam(RF, OutData%p(i1)) ! p end do end if - call InflowWind_UnpackOutput(RF, OutData%y_interp) ! y_interp - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%y)) deallocate(OutData%y) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%y(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call InflowWind_UnpackInput(RF, OutData%Input(i1)) ! Input + call SrvD_UnpackOutput(RF, OutData%y(i1)) ! y end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + if (allocated(OutData%m)) deallocate(OutData%m) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%m(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%m.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call InflowWind_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call SrvD_UnpackMisc(RF, OutData%m(i1)) ! m end do end if - call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyExternalInflow_Data(SrcExternalInflow_DataData, DstExternalInflow_DataData, CtrlCode, ErrStat, ErrMsg) - type(ExternalInflow_Data), intent(inout) :: SrcExternalInflow_DataData - type(ExternalInflow_Data), intent(inout) :: DstExternalInflow_DataData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyExternalInflow_Data' - ErrStat = ErrID_None - ErrMsg = '' - call ExtInfw_CopyInput(SrcExternalInflow_DataData%u, DstExternalInflow_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ExtInfw_CopyOutput(SrcExternalInflow_DataData%y, DstExternalInflow_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ExtInfw_CopyParam(SrcExternalInflow_DataData%p, DstExternalInflow_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call ExtInfw_CopyMisc(SrcExternalInflow_DataData%m, DstExternalInflow_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return -end subroutine - -subroutine FAST_DestroyExternalInflow_Data(ExternalInflow_DataData, ErrStat, ErrMsg) - type(ExternalInflow_Data), intent(inout) :: ExternalInflow_DataData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyExternalInflow_Data' - ErrStat = ErrID_None - ErrMsg = '' - call ExtInfw_DestroyInput(ExternalInflow_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ExtInfw_DestroyOutput(ExternalInflow_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ExtInfw_DestroyParam(ExternalInflow_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ExtInfw_DestroyMisc(ExternalInflow_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) -end subroutine - -subroutine FAST_PackExternalInflow_Data(RF, Indata) - type(RegFile), intent(inout) :: RF - type(ExternalInflow_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackExternalInflow_Data' - if (RF%ErrStat >= AbortErrLev) return - call ExtInfw_PackInput(RF, InData%u) - call ExtInfw_PackOutput(RF, InData%y) - call ExtInfw_PackParam(RF, InData%p) - call ExtInfw_PackMisc(RF, InData%m) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_UnPackExternalInflow_Data(RF, OutData) - type(RegFile), intent(inout) :: RF - type(ExternalInflow_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackExternalInflow_Data' - if (RF%ErrStat /= ErrID_None) return - call ExtInfw_UnpackInput(RF, OutData%u) ! u - call ExtInfw_UnpackOutput(RF, OutData%y) ! y - call ExtInfw_UnpackParam(RF, OutData%p) ! p - call ExtInfw_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Input(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call SrvD_UnpackInput(RF, OutData%Input(i1,i2)) ! Input + end do + end do + end if + call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopySubDyn_Data(SrcSubDyn_DataData, DstSubDyn_DataData, CtrlCode, ErrStat, ErrMsg) - type(SubDyn_Data), intent(inout) :: SrcSubDyn_DataData - type(SubDyn_Data), intent(inout) :: DstSubDyn_DataData +subroutine FAST_CopyAeroDyn_Data(SrcAeroDyn_DataData, DstAeroDyn_DataData, CtrlCode, ErrStat, ErrMsg) + type(AeroDyn_Data), intent(inout) :: SrcAeroDyn_DataData + type(AeroDyn_Data), intent(inout) :: DstAeroDyn_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -9821,350 +4262,321 @@ subroutine FAST_CopySubDyn_Data(SrcSubDyn_DataData, DstSubDyn_DataData, CtrlCode integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopySubDyn_Data' + character(*), parameter :: RoutineName = 'FAST_CopyAeroDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcSubDyn_DataData%x) - UB(1:1) = ubound(SrcSubDyn_DataData%x) - do i1 = LB(1), UB(1) - call SD_CopyContState(SrcSubDyn_DataData%x(i1), DstSubDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcSubDyn_DataData%xd) - UB(1:1) = ubound(SrcSubDyn_DataData%xd) - do i1 = LB(1), UB(1) - call SD_CopyDiscState(SrcSubDyn_DataData%xd(i1), DstSubDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcSubDyn_DataData%z) - UB(1:1) = ubound(SrcSubDyn_DataData%z) - do i1 = LB(1), UB(1) - call SD_CopyConstrState(SrcSubDyn_DataData%z(i1), DstSubDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcSubDyn_DataData%OtherSt) - UB(1:1) = ubound(SrcSubDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call SD_CopyOtherState(SrcSubDyn_DataData%OtherSt(i1), DstSubDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call SD_CopyParam(SrcSubDyn_DataData%p, DstSubDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SD_CopyInput(SrcSubDyn_DataData%u, DstSubDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SD_CopyOutput(SrcSubDyn_DataData%y, DstSubDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SD_CopyMisc(SrcSubDyn_DataData%m, DstSubDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcSubDyn_DataData%Input)) then - LB(1:1) = lbound(SrcSubDyn_DataData%Input) - UB(1:1) = ubound(SrcSubDyn_DataData%Input) - if (.not. allocated(DstSubDyn_DataData%Input)) then - allocate(DstSubDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcAeroDyn_DataData%x)) then + LB(1:1) = lbound(SrcAeroDyn_DataData%x) + UB(1:1) = ubound(SrcAeroDyn_DataData%x) + if (.not. allocated(DstAeroDyn_DataData%x)) then + allocate(DstAeroDyn_DataData%x(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call SD_CopyInput(SrcSubDyn_DataData%Input(i1), DstSubDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call AD_CopyContState(SrcAeroDyn_DataData%x(i1), DstAeroDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcAeroDyn_DataData%xd)) then + LB(1:1) = lbound(SrcAeroDyn_DataData%xd) + UB(1:1) = ubound(SrcAeroDyn_DataData%xd) + if (.not. allocated(DstAeroDyn_DataData%xd)) then + allocate(DstAeroDyn_DataData%xd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call AD_CopyDiscState(SrcAeroDyn_DataData%xd(i1), DstAeroDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcSubDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcSubDyn_DataData%Input_Saved) - UB(1:1) = ubound(SrcSubDyn_DataData%Input_Saved) - if (.not. allocated(DstSubDyn_DataData%Input_Saved)) then - allocate(DstSubDyn_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcAeroDyn_DataData%z)) then + LB(1:1) = lbound(SrcAeroDyn_DataData%z) + UB(1:1) = ubound(SrcAeroDyn_DataData%z) + if (.not. allocated(DstAeroDyn_DataData%z)) then + allocate(DstAeroDyn_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call SD_CopyInput(SrcSubDyn_DataData%Input_Saved(i1), DstSubDyn_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call AD_CopyConstrState(SrcAeroDyn_DataData%z(i1), DstAeroDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcSubDyn_DataData%Output)) then - LB(1:1) = lbound(SrcSubDyn_DataData%Output) - UB(1:1) = ubound(SrcSubDyn_DataData%Output) - if (.not. allocated(DstSubDyn_DataData%Output)) then - allocate(DstSubDyn_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcAeroDyn_DataData%OtherSt)) then + LB(1:1) = lbound(SrcAeroDyn_DataData%OtherSt) + UB(1:1) = ubound(SrcAeroDyn_DataData%OtherSt) + if (.not. allocated(DstAeroDyn_DataData%OtherSt)) then + allocate(DstAeroDyn_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call SD_CopyOutput(SrcSubDyn_DataData%Output(i1), DstSubDyn_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) + call AD_CopyOtherState(SrcAeroDyn_DataData%OtherSt(i1), DstAeroDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call SD_CopyOutput(SrcSubDyn_DataData%y_interp, DstSubDyn_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) + call AD_CopyParam(SrcAeroDyn_DataData%p, DstAeroDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcSubDyn_DataData%InputTimes)) then - LB(1:1) = lbound(SrcSubDyn_DataData%InputTimes) - UB(1:1) = ubound(SrcSubDyn_DataData%InputTimes) - if (.not. allocated(DstSubDyn_DataData%InputTimes)) then - allocate(DstSubDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + call AD_CopyOutput(SrcAeroDyn_DataData%y, DstAeroDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call AD_CopyMisc(SrcAeroDyn_DataData%m, DstAeroDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcAeroDyn_DataData%Input)) then + LB(1:1) = lbound(SrcAeroDyn_DataData%Input) + UB(1:1) = ubound(SrcAeroDyn_DataData%Input) + if (.not. allocated(DstAeroDyn_DataData%Input)) then + allocate(DstAeroDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if - DstSubDyn_DataData%InputTimes = SrcSubDyn_DataData%InputTimes + do i1 = LB(1), UB(1) + call AD_CopyInput(SrcAeroDyn_DataData%Input(i1), DstAeroDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcSubDyn_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcSubDyn_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcSubDyn_DataData%InputTimes_Saved) - if (.not. allocated(DstSubDyn_DataData%InputTimes_Saved)) then - allocate(DstSubDyn_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcAeroDyn_DataData%InputTimes)) then + LB(1:1) = lbound(SrcAeroDyn_DataData%InputTimes) + UB(1:1) = ubound(SrcAeroDyn_DataData%InputTimes) + if (.not. allocated(DstAeroDyn_DataData%InputTimes)) then + allocate(DstAeroDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstSubDyn_DataData%InputTimes_Saved = SrcSubDyn_DataData%InputTimes_Saved + DstAeroDyn_DataData%InputTimes = SrcAeroDyn_DataData%InputTimes end if end subroutine -subroutine FAST_DestroySubDyn_Data(SubDyn_DataData, ErrStat, ErrMsg) - type(SubDyn_Data), intent(inout) :: SubDyn_DataData +subroutine FAST_DestroyAeroDyn_Data(AeroDyn_DataData, ErrStat, ErrMsg) + type(AeroDyn_Data), intent(inout) :: AeroDyn_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroySubDyn_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyAeroDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SubDyn_DataData%x) - UB(1:1) = ubound(SubDyn_DataData%x) - do i1 = LB(1), UB(1) - call SD_DestroyContState(SubDyn_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(SubDyn_DataData%xd) - UB(1:1) = ubound(SubDyn_DataData%xd) - do i1 = LB(1), UB(1) - call SD_DestroyDiscState(SubDyn_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(SubDyn_DataData%z) - UB(1:1) = ubound(SubDyn_DataData%z) - do i1 = LB(1), UB(1) - call SD_DestroyConstrState(SubDyn_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(SubDyn_DataData%OtherSt) - UB(1:1) = ubound(SubDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call SD_DestroyOtherState(SubDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call SD_DestroyParam(SubDyn_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SD_DestroyInput(SubDyn_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SD_DestroyOutput(SubDyn_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SD_DestroyMisc(SubDyn_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(SubDyn_DataData%Input)) then - LB(1:1) = lbound(SubDyn_DataData%Input) - UB(1:1) = ubound(SubDyn_DataData%Input) + if (allocated(AeroDyn_DataData%x)) then + LB(1:1) = lbound(AeroDyn_DataData%x) + UB(1:1) = ubound(AeroDyn_DataData%x) do i1 = LB(1), UB(1) - call SD_DestroyInput(SubDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call AD_DestroyContState(AeroDyn_DataData%x(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(SubDyn_DataData%Input) + deallocate(AeroDyn_DataData%x) + end if + if (allocated(AeroDyn_DataData%xd)) then + LB(1:1) = lbound(AeroDyn_DataData%xd) + UB(1:1) = ubound(AeroDyn_DataData%xd) + do i1 = LB(1), UB(1) + call AD_DestroyDiscState(AeroDyn_DataData%xd(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(AeroDyn_DataData%xd) end if - if (allocated(SubDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(SubDyn_DataData%Input_Saved) - UB(1:1) = ubound(SubDyn_DataData%Input_Saved) + if (allocated(AeroDyn_DataData%z)) then + LB(1:1) = lbound(AeroDyn_DataData%z) + UB(1:1) = ubound(AeroDyn_DataData%z) do i1 = LB(1), UB(1) - call SD_DestroyInput(SubDyn_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call AD_DestroyConstrState(AeroDyn_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(SubDyn_DataData%Input_Saved) + deallocate(AeroDyn_DataData%z) end if - if (allocated(SubDyn_DataData%Output)) then - LB(1:1) = lbound(SubDyn_DataData%Output) - UB(1:1) = ubound(SubDyn_DataData%Output) + if (allocated(AeroDyn_DataData%OtherSt)) then + LB(1:1) = lbound(AeroDyn_DataData%OtherSt) + UB(1:1) = ubound(AeroDyn_DataData%OtherSt) do i1 = LB(1), UB(1) - call SD_DestroyOutput(SubDyn_DataData%Output(i1), ErrStat2, ErrMsg2) + call AD_DestroyOtherState(AeroDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(SubDyn_DataData%Output) + deallocate(AeroDyn_DataData%OtherSt) end if - call SD_DestroyOutput(SubDyn_DataData%y_interp, ErrStat2, ErrMsg2) + call AD_DestroyParam(AeroDyn_DataData%p, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(SubDyn_DataData%InputTimes)) then - deallocate(SubDyn_DataData%InputTimes) + call AD_DestroyOutput(AeroDyn_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call AD_DestroyMisc(AeroDyn_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(AeroDyn_DataData%Input)) then + LB(1:1) = lbound(AeroDyn_DataData%Input) + UB(1:1) = ubound(AeroDyn_DataData%Input) + do i1 = LB(1), UB(1) + call AD_DestroyInput(AeroDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(AeroDyn_DataData%Input) end if - if (allocated(SubDyn_DataData%InputTimes_Saved)) then - deallocate(SubDyn_DataData%InputTimes_Saved) + if (allocated(AeroDyn_DataData%InputTimes)) then + deallocate(AeroDyn_DataData%InputTimes) end if end subroutine -subroutine FAST_PackSubDyn_Data(RF, Indata) +subroutine FAST_PackAeroDyn_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(SubDyn_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackSubDyn_Data' + type(AeroDyn_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackAeroDyn_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call SD_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call SD_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call SD_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call SD_PackOtherState(RF, InData%OtherSt(i1)) - end do - call SD_PackParam(RF, InData%p) - call SD_PackInput(RF, InData%u) - call SD_PackOutput(RF, InData%y) - call SD_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Input)) - if (allocated(InData%Input)) then - call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) - LB(1:1) = lbound(InData%Input) - UB(1:1) = ubound(InData%Input) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) do i1 = LB(1), UB(1) - call SD_PackInput(RF, InData%Input(i1)) + call AD_PackContState(RF, InData%x(i1)) + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) + do i1 = LB(1), UB(1) + call AD_PackDiscState(RF, InData%xd(i1)) + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) + do i1 = LB(1), UB(1) + call AD_PackConstrState(RF, InData%z(i1)) end do end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call SD_PackInput(RF, InData%Input_Saved(i1)) + call AD_PackOtherState(RF, InData%OtherSt(i1)) end do end if - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) + call AD_PackParam(RF, InData%p) + call AD_PackOutput(RF, InData%y) + call AD_PackMisc(RF, InData%m) + call RegPack(RF, allocated(InData%Input)) + if (allocated(InData%Input)) then + call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) + LB(1:1) = lbound(InData%Input) + UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call SD_PackOutput(RF, InData%Output(i1)) + call AD_PackInput(RF, InData%Input(i1)) end do end if - call SD_PackOutput(RF, InData%y_interp) call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackSubDyn_Data(RF, OutData) +subroutine FAST_UnPackAeroDyn_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(SubDyn_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackSubDyn_Data' + type(AeroDyn_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackAeroDyn_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call SD_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call SD_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call SD_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call SD_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call SD_UnpackParam(RF, OutData%p) ! p - call SD_UnpackInput(RF, OutData%u) ! u - call SD_UnpackOutput(RF, OutData%y) ! y - call SD_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call SD_UnpackInput(RF, OutData%Input(i1)) ! Input + call AD_UnpackContState(RF, OutData%x(i1)) ! x + end do + end if + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call AD_UnpackDiscState(RF, OutData%xd(i1)) ! xd + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call AD_UnpackConstrState(RF, OutData%z(i1)) ! z end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call SD_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call AD_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(OutData%Output)) deallocate(OutData%Output) + call AD_UnpackParam(RF, OutData%p) ! p + call AD_UnpackOutput(RF, OutData%y) ! y + call AD_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%Input(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call SD_UnpackOutput(RF, OutData%Output(i1)) ! Output + call AD_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if - call SD_UnpackOutput(RF, OutData%y_interp) ! y_interp call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyExtPtfm_Data(SrcExtPtfm_DataData, DstExtPtfm_DataData, CtrlCode, ErrStat, ErrMsg) - type(ExtPtfm_Data), intent(inout) :: SrcExtPtfm_DataData - type(ExtPtfm_Data), intent(inout) :: DstExtPtfm_DataData +subroutine FAST_CopyExtLoads_Data(SrcExtLoads_DataData, DstExtLoads_DataData, CtrlCode, ErrStat, ErrMsg) + type(ExtLoads_Data), intent(inout) :: SrcExtLoads_DataData + type(ExtLoads_Data), intent(inout) :: DstExtLoads_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -10172,234 +4584,150 @@ subroutine FAST_CopyExtPtfm_Data(SrcExtPtfm_DataData, DstExtPtfm_DataData, CtrlC integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyExtPtfm_Data' + character(*), parameter :: RoutineName = 'FAST_CopyExtLoads_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcExtPtfm_DataData%x) - UB(1:1) = ubound(SrcExtPtfm_DataData%x) + LB(1:1) = lbound(SrcExtLoads_DataData%x) + UB(1:1) = ubound(SrcExtLoads_DataData%x) do i1 = LB(1), UB(1) - call ExtPtfm_CopyContState(SrcExtPtfm_DataData%x(i1), DstExtPtfm_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call ExtLd_CopyContState(SrcExtLoads_DataData%x(i1), DstExtLoads_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do - LB(1:1) = lbound(SrcExtPtfm_DataData%xd) - UB(1:1) = ubound(SrcExtPtfm_DataData%xd) + LB(1:1) = lbound(SrcExtLoads_DataData%xd) + UB(1:1) = ubound(SrcExtLoads_DataData%xd) do i1 = LB(1), UB(1) - call ExtPtfm_CopyDiscState(SrcExtPtfm_DataData%xd(i1), DstExtPtfm_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) + call ExtLd_CopyDiscState(SrcExtLoads_DataData%xd(i1), DstExtLoads_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do - LB(1:1) = lbound(SrcExtPtfm_DataData%z) - UB(1:1) = ubound(SrcExtPtfm_DataData%z) + LB(1:1) = lbound(SrcExtLoads_DataData%z) + UB(1:1) = ubound(SrcExtLoads_DataData%z) do i1 = LB(1), UB(1) - call ExtPtfm_CopyConstrState(SrcExtPtfm_DataData%z(i1), DstExtPtfm_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) + call ExtLd_CopyConstrState(SrcExtLoads_DataData%z(i1), DstExtLoads_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do - LB(1:1) = lbound(SrcExtPtfm_DataData%OtherSt) - UB(1:1) = ubound(SrcExtPtfm_DataData%OtherSt) + LB(1:1) = lbound(SrcExtLoads_DataData%OtherSt) + UB(1:1) = ubound(SrcExtLoads_DataData%OtherSt) do i1 = LB(1), UB(1) - call ExtPtfm_CopyOtherState(SrcExtPtfm_DataData%OtherSt(i1), DstExtPtfm_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) + call ExtLd_CopyOtherState(SrcExtLoads_DataData%OtherSt(i1), DstExtLoads_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do - call ExtPtfm_CopyParam(SrcExtPtfm_DataData%p, DstExtPtfm_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call ExtLd_CopyParam(SrcExtLoads_DataData%p, DstExtLoads_DataData%p, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call ExtPtfm_CopyInput(SrcExtPtfm_DataData%u, DstExtPtfm_DataData%u, CtrlCode, ErrStat2, ErrMsg2) + call ExtLd_CopyInput(SrcExtLoads_DataData%u, DstExtLoads_DataData%u, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call ExtPtfm_CopyOutput(SrcExtPtfm_DataData%y, DstExtPtfm_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call ExtLd_CopyOutput(SrcExtLoads_DataData%y, DstExtLoads_DataData%y, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call ExtPtfm_CopyMisc(SrcExtPtfm_DataData%m, DstExtPtfm_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call ExtLd_CopyMisc(SrcExtLoads_DataData%m, DstExtLoads_DataData%m, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcExtPtfm_DataData%Input)) then - LB(1:1) = lbound(SrcExtPtfm_DataData%Input) - UB(1:1) = ubound(SrcExtPtfm_DataData%Input) - if (.not. allocated(DstExtPtfm_DataData%Input)) then - allocate(DstExtPtfm_DataData%Input(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%Input.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ExtPtfm_CopyInput(SrcExtPtfm_DataData%Input(i1), DstExtPtfm_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcExtPtfm_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcExtPtfm_DataData%Input_Saved) - UB(1:1) = ubound(SrcExtPtfm_DataData%Input_Saved) - if (.not. allocated(DstExtPtfm_DataData%Input_Saved)) then - allocate(DstExtPtfm_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call ExtPtfm_CopyInput(SrcExtPtfm_DataData%Input_Saved(i1), DstExtPtfm_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcExtPtfm_DataData%InputTimes)) then - LB(1:1) = lbound(SrcExtPtfm_DataData%InputTimes) - UB(1:1) = ubound(SrcExtPtfm_DataData%InputTimes) - if (.not. allocated(DstExtPtfm_DataData%InputTimes)) then - allocate(DstExtPtfm_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstExtPtfm_DataData%InputTimes = SrcExtPtfm_DataData%InputTimes - end if - if (allocated(SrcExtPtfm_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcExtPtfm_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcExtPtfm_DataData%InputTimes_Saved) - if (.not. allocated(DstExtPtfm_DataData%InputTimes_Saved)) then - allocate(DstExtPtfm_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcExtLoads_DataData%InputTimes)) then + LB(1:1) = lbound(SrcExtLoads_DataData%InputTimes) + UB(1:1) = ubound(SrcExtLoads_DataData%InputTimes) + if (.not. allocated(DstExtLoads_DataData%InputTimes)) then + allocate(DstExtLoads_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstExtLoads_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstExtPtfm_DataData%InputTimes_Saved = SrcExtPtfm_DataData%InputTimes_Saved + DstExtLoads_DataData%InputTimes = SrcExtLoads_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyExtPtfm_Data(ExtPtfm_DataData, ErrStat, ErrMsg) - type(ExtPtfm_Data), intent(inout) :: ExtPtfm_DataData +subroutine FAST_DestroyExtLoads_Data(ExtLoads_DataData, ErrStat, ErrMsg) + type(ExtLoads_Data), intent(inout) :: ExtLoads_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyExtPtfm_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyExtLoads_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(ExtPtfm_DataData%x) - UB(1:1) = ubound(ExtPtfm_DataData%x) + LB(1:1) = lbound(ExtLoads_DataData%x) + UB(1:1) = ubound(ExtLoads_DataData%x) do i1 = LB(1), UB(1) - call ExtPtfm_DestroyContState(ExtPtfm_DataData%x(i1), ErrStat2, ErrMsg2) + call ExtLd_DestroyContState(ExtLoads_DataData%x(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - LB(1:1) = lbound(ExtPtfm_DataData%xd) - UB(1:1) = ubound(ExtPtfm_DataData%xd) + LB(1:1) = lbound(ExtLoads_DataData%xd) + UB(1:1) = ubound(ExtLoads_DataData%xd) do i1 = LB(1), UB(1) - call ExtPtfm_DestroyDiscState(ExtPtfm_DataData%xd(i1), ErrStat2, ErrMsg2) + call ExtLd_DestroyDiscState(ExtLoads_DataData%xd(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - LB(1:1) = lbound(ExtPtfm_DataData%z) - UB(1:1) = ubound(ExtPtfm_DataData%z) + LB(1:1) = lbound(ExtLoads_DataData%z) + UB(1:1) = ubound(ExtLoads_DataData%z) do i1 = LB(1), UB(1) - call ExtPtfm_DestroyConstrState(ExtPtfm_DataData%z(i1), ErrStat2, ErrMsg2) + call ExtLd_DestroyConstrState(ExtLoads_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - LB(1:1) = lbound(ExtPtfm_DataData%OtherSt) - UB(1:1) = ubound(ExtPtfm_DataData%OtherSt) + LB(1:1) = lbound(ExtLoads_DataData%OtherSt) + UB(1:1) = ubound(ExtLoads_DataData%OtherSt) do i1 = LB(1), UB(1) - call ExtPtfm_DestroyOtherState(ExtPtfm_DataData%OtherSt(i1), ErrStat2, ErrMsg2) + call ExtLd_DestroyOtherState(ExtLoads_DataData%OtherSt(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - call ExtPtfm_DestroyParam(ExtPtfm_DataData%p, ErrStat2, ErrMsg2) + call ExtLd_DestroyParam(ExtLoads_DataData%p, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ExtPtfm_DestroyInput(ExtPtfm_DataData%u, ErrStat2, ErrMsg2) + call ExtLd_DestroyInput(ExtLoads_DataData%u, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ExtPtfm_DestroyOutput(ExtPtfm_DataData%y, ErrStat2, ErrMsg2) + call ExtLd_DestroyOutput(ExtLoads_DataData%y, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ExtPtfm_DestroyMisc(ExtPtfm_DataData%m, ErrStat2, ErrMsg2) + call ExtLd_DestroyMisc(ExtLoads_DataData%m, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ExtPtfm_DataData%Input)) then - LB(1:1) = lbound(ExtPtfm_DataData%Input) - UB(1:1) = ubound(ExtPtfm_DataData%Input) - do i1 = LB(1), UB(1) - call ExtPtfm_DestroyInput(ExtPtfm_DataData%Input(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ExtPtfm_DataData%Input) - end if - if (allocated(ExtPtfm_DataData%Input_Saved)) then - LB(1:1) = lbound(ExtPtfm_DataData%Input_Saved) - UB(1:1) = ubound(ExtPtfm_DataData%Input_Saved) - do i1 = LB(1), UB(1) - call ExtPtfm_DestroyInput(ExtPtfm_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ExtPtfm_DataData%Input_Saved) - end if - if (allocated(ExtPtfm_DataData%InputTimes)) then - deallocate(ExtPtfm_DataData%InputTimes) - end if - if (allocated(ExtPtfm_DataData%InputTimes_Saved)) then - deallocate(ExtPtfm_DataData%InputTimes_Saved) + if (allocated(ExtLoads_DataData%InputTimes)) then + deallocate(ExtLoads_DataData%InputTimes) end if end subroutine -subroutine FAST_PackExtPtfm_Data(RF, Indata) +subroutine FAST_PackExtLoads_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(ExtPtfm_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackExtPtfm_Data' + type(ExtLoads_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackExtLoads_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return LB(1:1) = lbound(InData%x) UB(1:1) = ubound(InData%x) do i1 = LB(1), UB(1) - call ExtPtfm_PackContState(RF, InData%x(i1)) + call ExtLd_PackContState(RF, InData%x(i1)) end do LB(1:1) = lbound(InData%xd) UB(1:1) = ubound(InData%xd) do i1 = LB(1), UB(1) - call ExtPtfm_PackDiscState(RF, InData%xd(i1)) + call ExtLd_PackDiscState(RF, InData%xd(i1)) end do LB(1:1) = lbound(InData%z) UB(1:1) = ubound(InData%z) do i1 = LB(1), UB(1) - call ExtPtfm_PackConstrState(RF, InData%z(i1)) + call ExtLd_PackConstrState(RF, InData%z(i1)) end do LB(1:1) = lbound(InData%OtherSt) UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call ExtPtfm_PackOtherState(RF, InData%OtherSt(i1)) + call ExtLd_PackOtherState(RF, InData%OtherSt(i1)) end do - call ExtPtfm_PackParam(RF, InData%p) - call ExtPtfm_PackInput(RF, InData%u) - call ExtPtfm_PackOutput(RF, InData%y) - call ExtPtfm_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Input)) - if (allocated(InData%Input)) then - call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) - LB(1:1) = lbound(InData%Input) - UB(1:1) = ubound(InData%Input) - do i1 = LB(1), UB(1) - call ExtPtfm_PackInput(RF, InData%Input(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call ExtPtfm_PackInput(RF, InData%Input_Saved(i1)) - end do - end if + call ExtLd_PackParam(RF, InData%p) + call ExtLd_PackInput(RF, InData%u) + call ExtLd_PackOutput(RF, InData%y) + call ExtLd_PackMisc(RF, InData%m) call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackExtPtfm_Data(RF, OutData) +subroutine FAST_UnPackExtLoads_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(ExtPtfm_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackExtPtfm_Data' + type(ExtLoads_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackExtLoads_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat @@ -10408,60 +4736,33 @@ subroutine FAST_UnPackExtPtfm_Data(RF, OutData) LB(1:1) = lbound(OutData%x) UB(1:1) = ubound(OutData%x) do i1 = LB(1), UB(1) - call ExtPtfm_UnpackContState(RF, OutData%x(i1)) ! x + call ExtLd_UnpackContState(RF, OutData%x(i1)) ! x end do LB(1:1) = lbound(OutData%xd) UB(1:1) = ubound(OutData%xd) do i1 = LB(1), UB(1) - call ExtPtfm_UnpackDiscState(RF, OutData%xd(i1)) ! xd + call ExtLd_UnpackDiscState(RF, OutData%xd(i1)) ! xd end do LB(1:1) = lbound(OutData%z) UB(1:1) = ubound(OutData%z) do i1 = LB(1), UB(1) - call ExtPtfm_UnpackConstrState(RF, OutData%z(i1)) ! z + call ExtLd_UnpackConstrState(RF, OutData%z(i1)) ! z end do LB(1:1) = lbound(OutData%OtherSt) UB(1:1) = ubound(OutData%OtherSt) do i1 = LB(1), UB(1) - call ExtPtfm_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt + call ExtLd_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do - call ExtPtfm_UnpackParam(RF, OutData%p) ! p - call ExtPtfm_UnpackInput(RF, OutData%u) ! u - call ExtPtfm_UnpackOutput(RF, OutData%y) ! y - call ExtPtfm_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Input)) deallocate(OutData%Input) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ExtPtfm_UnpackInput(RF, OutData%Input(i1)) ! Input - end do - end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call ExtPtfm_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved - end do - end if + call ExtLd_UnpackParam(RF, OutData%p) ! p + call ExtLd_UnpackInput(RF, OutData%u) ! u + call ExtLd_UnpackOutput(RF, OutData%y) ! y + call ExtLd_UnpackMisc(RF, OutData%m) ! m call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopySeaState_Data(SrcSeaState_DataData, DstSeaState_DataData, CtrlCode, ErrStat, ErrMsg) - type(SeaState_Data), intent(in) :: SrcSeaState_DataData - type(SeaState_Data), intent(inout) :: DstSeaState_DataData +subroutine FAST_CopyAeroDisk_Data(SrcAeroDisk_DataData, DstAeroDisk_DataData, CtrlCode, ErrStat, ErrMsg) + type(AeroDisk_Data), intent(inout) :: SrcAeroDisk_DataData + type(AeroDisk_Data), intent(inout) :: DstAeroDisk_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -10469,350 +4770,321 @@ subroutine FAST_CopySeaState_Data(SrcSeaState_DataData, DstSeaState_DataData, Ct integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopySeaState_Data' + character(*), parameter :: RoutineName = 'FAST_CopyAeroDisk_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcSeaState_DataData%x) - UB(1:1) = ubound(SrcSeaState_DataData%x) - do i1 = LB(1), UB(1) - call SeaSt_CopyContState(SrcSeaState_DataData%x(i1), DstSeaState_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcSeaState_DataData%xd) - UB(1:1) = ubound(SrcSeaState_DataData%xd) - do i1 = LB(1), UB(1) - call SeaSt_CopyDiscState(SrcSeaState_DataData%xd(i1), DstSeaState_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcSeaState_DataData%z) - UB(1:1) = ubound(SrcSeaState_DataData%z) - do i1 = LB(1), UB(1) - call SeaSt_CopyConstrState(SrcSeaState_DataData%z(i1), DstSeaState_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcSeaState_DataData%OtherSt) - UB(1:1) = ubound(SrcSeaState_DataData%OtherSt) - do i1 = LB(1), UB(1) - call SeaSt_CopyOtherState(SrcSeaState_DataData%OtherSt(i1), DstSeaState_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call SeaSt_CopyParam(SrcSeaState_DataData%p, DstSeaState_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SeaSt_CopyInput(SrcSeaState_DataData%u, DstSeaState_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SeaSt_CopyOutput(SrcSeaState_DataData%y, DstSeaState_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SeaSt_CopyMisc(SrcSeaState_DataData%m, DstSeaState_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcSeaState_DataData%Input)) then - LB(1:1) = lbound(SrcSeaState_DataData%Input) - UB(1:1) = ubound(SrcSeaState_DataData%Input) - if (.not. allocated(DstSeaState_DataData%Input)) then - allocate(DstSeaState_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcAeroDisk_DataData%x)) then + LB(1:1) = lbound(SrcAeroDisk_DataData%x) + UB(1:1) = ubound(SrcAeroDisk_DataData%x) + if (.not. allocated(DstAeroDisk_DataData%x)) then + allocate(DstAeroDisk_DataData%x(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDisk_DataData%x.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call SeaSt_CopyInput(SrcSeaState_DataData%Input(i1), DstSeaState_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call ADsk_CopyContState(SrcAeroDisk_DataData%x(i1), DstAeroDisk_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcAeroDisk_DataData%xd)) then + LB(1:1) = lbound(SrcAeroDisk_DataData%xd) + UB(1:1) = ubound(SrcAeroDisk_DataData%xd) + if (.not. allocated(DstAeroDisk_DataData%xd)) then + allocate(DstAeroDisk_DataData%xd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDisk_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call ADsk_CopyDiscState(SrcAeroDisk_DataData%xd(i1), DstAeroDisk_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcSeaState_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcSeaState_DataData%Input_Saved) - UB(1:1) = ubound(SrcSeaState_DataData%Input_Saved) - if (.not. allocated(DstSeaState_DataData%Input_Saved)) then - allocate(DstSeaState_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcAeroDisk_DataData%z)) then + LB(1:1) = lbound(SrcAeroDisk_DataData%z) + UB(1:1) = ubound(SrcAeroDisk_DataData%z) + if (.not. allocated(DstAeroDisk_DataData%z)) then + allocate(DstAeroDisk_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDisk_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call SeaSt_CopyInput(SrcSeaState_DataData%Input_Saved(i1), DstSeaState_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call ADsk_CopyConstrState(SrcAeroDisk_DataData%z(i1), DstAeroDisk_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcSeaState_DataData%Output)) then - LB(1:1) = lbound(SrcSeaState_DataData%Output) - UB(1:1) = ubound(SrcSeaState_DataData%Output) - if (.not. allocated(DstSeaState_DataData%Output)) then - allocate(DstSeaState_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcAeroDisk_DataData%OtherSt)) then + LB(1:1) = lbound(SrcAeroDisk_DataData%OtherSt) + UB(1:1) = ubound(SrcAeroDisk_DataData%OtherSt) + if (.not. allocated(DstAeroDisk_DataData%OtherSt)) then + allocate(DstAeroDisk_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDisk_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call SeaSt_CopyOutput(SrcSeaState_DataData%Output(i1), DstSeaState_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) + call ADsk_CopyOtherState(SrcAeroDisk_DataData%OtherSt(i1), DstAeroDisk_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call SeaSt_CopyOutput(SrcSeaState_DataData%y_interp, DstSeaState_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) + call ADsk_CopyParam(SrcAeroDisk_DataData%p, DstAeroDisk_DataData%p, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcSeaState_DataData%InputTimes)) then - LB(1:1) = lbound(SrcSeaState_DataData%InputTimes) - UB(1:1) = ubound(SrcSeaState_DataData%InputTimes) - if (.not. allocated(DstSeaState_DataData%InputTimes)) then - allocate(DstSeaState_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + call ADsk_CopyOutput(SrcAeroDisk_DataData%y, DstAeroDisk_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ADsk_CopyMisc(SrcAeroDisk_DataData%m, DstAeroDisk_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcAeroDisk_DataData%Input)) then + LB(1:1) = lbound(SrcAeroDisk_DataData%Input) + UB(1:1) = ubound(SrcAeroDisk_DataData%Input) + if (.not. allocated(DstAeroDisk_DataData%Input)) then + allocate(DstAeroDisk_DataData%Input(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDisk_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if - DstSeaState_DataData%InputTimes = SrcSeaState_DataData%InputTimes + do i1 = LB(1), UB(1) + call ADsk_CopyInput(SrcAeroDisk_DataData%Input(i1), DstAeroDisk_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcSeaState_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcSeaState_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcSeaState_DataData%InputTimes_Saved) - if (.not. allocated(DstSeaState_DataData%InputTimes_Saved)) then - allocate(DstSeaState_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcAeroDisk_DataData%InputTimes)) then + LB(1:1) = lbound(SrcAeroDisk_DataData%InputTimes) + UB(1:1) = ubound(SrcAeroDisk_DataData%InputTimes) + if (.not. allocated(DstAeroDisk_DataData%InputTimes)) then + allocate(DstAeroDisk_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroDisk_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstSeaState_DataData%InputTimes_Saved = SrcSeaState_DataData%InputTimes_Saved + DstAeroDisk_DataData%InputTimes = SrcAeroDisk_DataData%InputTimes end if end subroutine -subroutine FAST_DestroySeaState_Data(SeaState_DataData, ErrStat, ErrMsg) - type(SeaState_Data), intent(inout) :: SeaState_DataData +subroutine FAST_DestroyAeroDisk_Data(AeroDisk_DataData, ErrStat, ErrMsg) + type(AeroDisk_Data), intent(inout) :: AeroDisk_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroySeaState_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyAeroDisk_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SeaState_DataData%x) - UB(1:1) = ubound(SeaState_DataData%x) - do i1 = LB(1), UB(1) - call SeaSt_DestroyContState(SeaState_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(SeaState_DataData%xd) - UB(1:1) = ubound(SeaState_DataData%xd) - do i1 = LB(1), UB(1) - call SeaSt_DestroyDiscState(SeaState_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(SeaState_DataData%z) - UB(1:1) = ubound(SeaState_DataData%z) - do i1 = LB(1), UB(1) - call SeaSt_DestroyConstrState(SeaState_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(SeaState_DataData%OtherSt) - UB(1:1) = ubound(SeaState_DataData%OtherSt) - do i1 = LB(1), UB(1) - call SeaSt_DestroyOtherState(SeaState_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call SeaSt_DestroyParam(SeaState_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SeaSt_DestroyInput(SeaState_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SeaSt_DestroyOutput(SeaState_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SeaSt_DestroyMisc(SeaState_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(SeaState_DataData%Input)) then - LB(1:1) = lbound(SeaState_DataData%Input) - UB(1:1) = ubound(SeaState_DataData%Input) + if (allocated(AeroDisk_DataData%x)) then + LB(1:1) = lbound(AeroDisk_DataData%x) + UB(1:1) = ubound(AeroDisk_DataData%x) do i1 = LB(1), UB(1) - call SeaSt_DestroyInput(SeaState_DataData%Input(i1), ErrStat2, ErrMsg2) + call ADsk_DestroyContState(AeroDisk_DataData%x(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(SeaState_DataData%Input) + deallocate(AeroDisk_DataData%x) + end if + if (allocated(AeroDisk_DataData%xd)) then + LB(1:1) = lbound(AeroDisk_DataData%xd) + UB(1:1) = ubound(AeroDisk_DataData%xd) + do i1 = LB(1), UB(1) + call ADsk_DestroyDiscState(AeroDisk_DataData%xd(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(AeroDisk_DataData%xd) end if - if (allocated(SeaState_DataData%Input_Saved)) then - LB(1:1) = lbound(SeaState_DataData%Input_Saved) - UB(1:1) = ubound(SeaState_DataData%Input_Saved) + if (allocated(AeroDisk_DataData%z)) then + LB(1:1) = lbound(AeroDisk_DataData%z) + UB(1:1) = ubound(AeroDisk_DataData%z) do i1 = LB(1), UB(1) - call SeaSt_DestroyInput(SeaState_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call ADsk_DestroyConstrState(AeroDisk_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(SeaState_DataData%Input_Saved) + deallocate(AeroDisk_DataData%z) end if - if (allocated(SeaState_DataData%Output)) then - LB(1:1) = lbound(SeaState_DataData%Output) - UB(1:1) = ubound(SeaState_DataData%Output) + if (allocated(AeroDisk_DataData%OtherSt)) then + LB(1:1) = lbound(AeroDisk_DataData%OtherSt) + UB(1:1) = ubound(AeroDisk_DataData%OtherSt) do i1 = LB(1), UB(1) - call SeaSt_DestroyOutput(SeaState_DataData%Output(i1), ErrStat2, ErrMsg2) + call ADsk_DestroyOtherState(AeroDisk_DataData%OtherSt(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(SeaState_DataData%Output) + deallocate(AeroDisk_DataData%OtherSt) end if - call SeaSt_DestroyOutput(SeaState_DataData%y_interp, ErrStat2, ErrMsg2) + call ADsk_DestroyParam(AeroDisk_DataData%p, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(SeaState_DataData%InputTimes)) then - deallocate(SeaState_DataData%InputTimes) + call ADsk_DestroyOutput(AeroDisk_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ADsk_DestroyMisc(AeroDisk_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(AeroDisk_DataData%Input)) then + LB(1:1) = lbound(AeroDisk_DataData%Input) + UB(1:1) = ubound(AeroDisk_DataData%Input) + do i1 = LB(1), UB(1) + call ADsk_DestroyInput(AeroDisk_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(AeroDisk_DataData%Input) end if - if (allocated(SeaState_DataData%InputTimes_Saved)) then - deallocate(SeaState_DataData%InputTimes_Saved) + if (allocated(AeroDisk_DataData%InputTimes)) then + deallocate(AeroDisk_DataData%InputTimes) end if end subroutine -subroutine FAST_PackSeaState_Data(RF, Indata) +subroutine FAST_PackAeroDisk_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(SeaState_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackSeaState_Data' + type(AeroDisk_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackAeroDisk_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call SeaSt_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call SeaSt_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call SeaSt_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call SeaSt_PackOtherState(RF, InData%OtherSt(i1)) - end do - call SeaSt_PackParam(RF, InData%p) - call SeaSt_PackInput(RF, InData%u) - call SeaSt_PackOutput(RF, InData%y) - call SeaSt_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Input)) - if (allocated(InData%Input)) then - call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) - LB(1:1) = lbound(InData%Input) - UB(1:1) = ubound(InData%Input) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) do i1 = LB(1), UB(1) - call SeaSt_PackInput(RF, InData%Input(i1)) + call ADsk_PackContState(RF, InData%x(i1)) + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) + do i1 = LB(1), UB(1) + call ADsk_PackDiscState(RF, InData%xd(i1)) + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) + do i1 = LB(1), UB(1) + call ADsk_PackConstrState(RF, InData%z(i1)) end do end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call SeaSt_PackInput(RF, InData%Input_Saved(i1)) + call ADsk_PackOtherState(RF, InData%OtherSt(i1)) end do end if - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) + call ADsk_PackParam(RF, InData%p) + call ADsk_PackOutput(RF, InData%y) + call ADsk_PackMisc(RF, InData%m) + call RegPack(RF, allocated(InData%Input)) + if (allocated(InData%Input)) then + call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) + LB(1:1) = lbound(InData%Input) + UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call SeaSt_PackOutput(RF, InData%Output(i1)) + call ADsk_PackInput(RF, InData%Input(i1)) end do end if - call SeaSt_PackOutput(RF, InData%y_interp) call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackSeaState_Data(RF, OutData) +subroutine FAST_UnPackAeroDisk_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(SeaState_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackSeaState_Data' + type(AeroDisk_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackAeroDisk_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call SeaSt_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call SeaSt_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call SeaSt_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call SeaSt_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call SeaSt_UnpackParam(RF, OutData%p) ! p - call SeaSt_UnpackInput(RF, OutData%u) ! u - call SeaSt_UnpackOutput(RF, OutData%y) ! y - call SeaSt_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call SeaSt_UnpackInput(RF, OutData%Input(i1)) ! Input + call ADsk_UnpackContState(RF, OutData%x(i1)) ! x + end do + end if + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call ADsk_UnpackDiscState(RF, OutData%xd(i1)) ! xd + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call ADsk_UnpackConstrState(RF, OutData%z(i1)) ! z end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call SeaSt_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call ADsk_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(OutData%Output)) deallocate(OutData%Output) + call ADsk_UnpackParam(RF, OutData%p) ! p + call ADsk_UnpackOutput(RF, OutData%y) ! y + call ADsk_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%Input(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call SeaSt_UnpackOutput(RF, OutData%Output(i1)) ! Output + call ADsk_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if - call SeaSt_UnpackOutput(RF, OutData%y_interp) ! y_interp call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyHydroDyn_Data(SrcHydroDyn_DataData, DstHydroDyn_DataData, CtrlCode, ErrStat, ErrMsg) - type(HydroDyn_Data), intent(inout) :: SrcHydroDyn_DataData - type(HydroDyn_Data), intent(inout) :: DstHydroDyn_DataData +subroutine FAST_CopyInflowWind_Data(SrcInflowWind_DataData, DstInflowWind_DataData, CtrlCode, ErrStat, ErrMsg) + type(InflowWind_Data), intent(in) :: SrcInflowWind_DataData + type(InflowWind_Data), intent(inout) :: DstInflowWind_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -10820,647 +5092,717 @@ subroutine FAST_CopyHydroDyn_Data(SrcHydroDyn_DataData, DstHydroDyn_DataData, Ct integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyHydroDyn_Data' + character(*), parameter :: RoutineName = 'FAST_CopyInflowWind_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcHydroDyn_DataData%x) - UB(1:1) = ubound(SrcHydroDyn_DataData%x) - do i1 = LB(1), UB(1) - call HydroDyn_CopyContState(SrcHydroDyn_DataData%x(i1), DstHydroDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcHydroDyn_DataData%xd) - UB(1:1) = ubound(SrcHydroDyn_DataData%xd) - do i1 = LB(1), UB(1) - call HydroDyn_CopyDiscState(SrcHydroDyn_DataData%xd(i1), DstHydroDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcHydroDyn_DataData%z) - UB(1:1) = ubound(SrcHydroDyn_DataData%z) - do i1 = LB(1), UB(1) - call HydroDyn_CopyConstrState(SrcHydroDyn_DataData%z(i1), DstHydroDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcHydroDyn_DataData%OtherSt) - UB(1:1) = ubound(SrcHydroDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call HydroDyn_CopyOtherState(SrcHydroDyn_DataData%OtherSt(i1), DstHydroDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call HydroDyn_CopyParam(SrcHydroDyn_DataData%p, DstHydroDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call HydroDyn_CopyInput(SrcHydroDyn_DataData%u, DstHydroDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call HydroDyn_CopyOutput(SrcHydroDyn_DataData%y, DstHydroDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call HydroDyn_CopyMisc(SrcHydroDyn_DataData%m, DstHydroDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcHydroDyn_DataData%Output)) then - LB(1:1) = lbound(SrcHydroDyn_DataData%Output) - UB(1:1) = ubound(SrcHydroDyn_DataData%Output) - if (.not. allocated(DstHydroDyn_DataData%Output)) then - allocate(DstHydroDyn_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInflowWind_DataData%x)) then + LB(1:1) = lbound(SrcInflowWind_DataData%x) + UB(1:1) = ubound(SrcInflowWind_DataData%x) + if (.not. allocated(DstInflowWind_DataData%x)) then + allocate(DstInflowWind_DataData%x(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%x.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call HydroDyn_CopyOutput(SrcHydroDyn_DataData%Output(i1), DstHydroDyn_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) + call InflowWind_CopyContState(SrcInflowWind_DataData%x(i1), DstInflowWind_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call HydroDyn_CopyOutput(SrcHydroDyn_DataData%y_interp, DstHydroDyn_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcHydroDyn_DataData%Input)) then - LB(1:1) = lbound(SrcHydroDyn_DataData%Input) - UB(1:1) = ubound(SrcHydroDyn_DataData%Input) - if (.not. allocated(DstHydroDyn_DataData%Input)) then - allocate(DstHydroDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInflowWind_DataData%xd)) then + LB(1:1) = lbound(SrcInflowWind_DataData%xd) + UB(1:1) = ubound(SrcInflowWind_DataData%xd) + if (.not. allocated(DstInflowWind_DataData%xd)) then + allocate(DstInflowWind_DataData%xd(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%xd.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call HydroDyn_CopyInput(SrcHydroDyn_DataData%Input(i1), DstHydroDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call InflowWind_CopyDiscState(SrcInflowWind_DataData%xd(i1), DstInflowWind_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcInflowWind_DataData%z)) then + LB(1:1) = lbound(SrcInflowWind_DataData%z) + UB(1:1) = ubound(SrcInflowWind_DataData%z) + if (.not. allocated(DstInflowWind_DataData%z)) then + allocate(DstInflowWind_DataData%z(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%z.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call InflowWind_CopyConstrState(SrcInflowWind_DataData%z(i1), DstInflowWind_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcInflowWind_DataData%OtherSt)) then + LB(1:1) = lbound(SrcInflowWind_DataData%OtherSt) + UB(1:1) = ubound(SrcInflowWind_DataData%OtherSt) + if (.not. allocated(DstInflowWind_DataData%OtherSt)) then + allocate(DstInflowWind_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call InflowWind_CopyOtherState(SrcInflowWind_DataData%OtherSt(i1), DstInflowWind_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcHydroDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcHydroDyn_DataData%Input_Saved) - UB(1:1) = ubound(SrcHydroDyn_DataData%Input_Saved) - if (.not. allocated(DstHydroDyn_DataData%Input_Saved)) then - allocate(DstHydroDyn_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + call InflowWind_CopyParam(SrcInflowWind_DataData%p, DstInflowWind_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call InflowWind_CopyOutput(SrcInflowWind_DataData%y, DstInflowWind_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call InflowWind_CopyMisc(SrcInflowWind_DataData%m, DstInflowWind_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcInflowWind_DataData%Input)) then + LB(1:1) = lbound(SrcInflowWind_DataData%Input) + UB(1:1) = ubound(SrcInflowWind_DataData%Input) + if (.not. allocated(DstInflowWind_DataData%Input)) then + allocate(DstInflowWind_DataData%Input(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call HydroDyn_CopyInput(SrcHydroDyn_DataData%Input_Saved(i1), DstHydroDyn_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call InflowWind_CopyInput(SrcInflowWind_DataData%Input(i1), DstInflowWind_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcHydroDyn_DataData%InputTimes)) then - LB(1:1) = lbound(SrcHydroDyn_DataData%InputTimes) - UB(1:1) = ubound(SrcHydroDyn_DataData%InputTimes) - if (.not. allocated(DstHydroDyn_DataData%InputTimes)) then - allocate(DstHydroDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstHydroDyn_DataData%InputTimes = SrcHydroDyn_DataData%InputTimes - end if - if (allocated(SrcHydroDyn_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcHydroDyn_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcHydroDyn_DataData%InputTimes_Saved) - if (.not. allocated(DstHydroDyn_DataData%InputTimes_Saved)) then - allocate(DstHydroDyn_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInflowWind_DataData%InputTimes)) then + LB(1:1) = lbound(SrcInflowWind_DataData%InputTimes) + UB(1:1) = ubound(SrcInflowWind_DataData%InputTimes) + if (.not. allocated(DstInflowWind_DataData%InputTimes)) then + allocate(DstInflowWind_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInflowWind_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstHydroDyn_DataData%InputTimes_Saved = SrcHydroDyn_DataData%InputTimes_Saved + DstInflowWind_DataData%InputTimes = SrcInflowWind_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyHydroDyn_Data(HydroDyn_DataData, ErrStat, ErrMsg) - type(HydroDyn_Data), intent(inout) :: HydroDyn_DataData +subroutine FAST_DestroyInflowWind_Data(InflowWind_DataData, ErrStat, ErrMsg) + type(InflowWind_Data), intent(inout) :: InflowWind_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyHydroDyn_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyInflowWind_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(HydroDyn_DataData%x) - UB(1:1) = ubound(HydroDyn_DataData%x) - do i1 = LB(1), UB(1) - call HydroDyn_DestroyContState(HydroDyn_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(HydroDyn_DataData%xd) - UB(1:1) = ubound(HydroDyn_DataData%xd) - do i1 = LB(1), UB(1) - call HydroDyn_DestroyDiscState(HydroDyn_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(HydroDyn_DataData%z) - UB(1:1) = ubound(HydroDyn_DataData%z) - do i1 = LB(1), UB(1) - call HydroDyn_DestroyConstrState(HydroDyn_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(HydroDyn_DataData%OtherSt) - UB(1:1) = ubound(HydroDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call HydroDyn_DestroyOtherState(HydroDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call HydroDyn_DestroyParam(HydroDyn_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call HydroDyn_DestroyInput(HydroDyn_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call HydroDyn_DestroyOutput(HydroDyn_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call HydroDyn_DestroyMisc(HydroDyn_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(HydroDyn_DataData%Output)) then - LB(1:1) = lbound(HydroDyn_DataData%Output) - UB(1:1) = ubound(HydroDyn_DataData%Output) + if (allocated(InflowWind_DataData%x)) then + LB(1:1) = lbound(InflowWind_DataData%x) + UB(1:1) = ubound(InflowWind_DataData%x) do i1 = LB(1), UB(1) - call HydroDyn_DestroyOutput(HydroDyn_DataData%Output(i1), ErrStat2, ErrMsg2) + call InflowWind_DestroyContState(InflowWind_DataData%x(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(HydroDyn_DataData%Output) + deallocate(InflowWind_DataData%x) end if - call HydroDyn_DestroyOutput(HydroDyn_DataData%y_interp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(HydroDyn_DataData%Input)) then - LB(1:1) = lbound(HydroDyn_DataData%Input) - UB(1:1) = ubound(HydroDyn_DataData%Input) + if (allocated(InflowWind_DataData%xd)) then + LB(1:1) = lbound(InflowWind_DataData%xd) + UB(1:1) = ubound(InflowWind_DataData%xd) do i1 = LB(1), UB(1) - call HydroDyn_DestroyInput(HydroDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call InflowWind_DestroyDiscState(InflowWind_DataData%xd(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(HydroDyn_DataData%Input) + deallocate(InflowWind_DataData%xd) end if - if (allocated(HydroDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(HydroDyn_DataData%Input_Saved) - UB(1:1) = ubound(HydroDyn_DataData%Input_Saved) + if (allocated(InflowWind_DataData%z)) then + LB(1:1) = lbound(InflowWind_DataData%z) + UB(1:1) = ubound(InflowWind_DataData%z) do i1 = LB(1), UB(1) - call HydroDyn_DestroyInput(HydroDyn_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call InflowWind_DestroyConstrState(InflowWind_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(HydroDyn_DataData%Input_Saved) + deallocate(InflowWind_DataData%z) end if - if (allocated(HydroDyn_DataData%InputTimes)) then - deallocate(HydroDyn_DataData%InputTimes) + if (allocated(InflowWind_DataData%OtherSt)) then + LB(1:1) = lbound(InflowWind_DataData%OtherSt) + UB(1:1) = ubound(InflowWind_DataData%OtherSt) + do i1 = LB(1), UB(1) + call InflowWind_DestroyOtherState(InflowWind_DataData%OtherSt(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(InflowWind_DataData%OtherSt) + end if + call InflowWind_DestroyParam(InflowWind_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call InflowWind_DestroyOutput(InflowWind_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call InflowWind_DestroyMisc(InflowWind_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InflowWind_DataData%Input)) then + LB(1:1) = lbound(InflowWind_DataData%Input) + UB(1:1) = ubound(InflowWind_DataData%Input) + do i1 = LB(1), UB(1) + call InflowWind_DestroyInput(InflowWind_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(InflowWind_DataData%Input) end if - if (allocated(HydroDyn_DataData%InputTimes_Saved)) then - deallocate(HydroDyn_DataData%InputTimes_Saved) + if (allocated(InflowWind_DataData%InputTimes)) then + deallocate(InflowWind_DataData%InputTimes) end if end subroutine -subroutine FAST_PackHydroDyn_Data(RF, Indata) +subroutine FAST_PackInflowWind_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(HydroDyn_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackHydroDyn_Data' + type(InflowWind_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackInflowWind_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call HydroDyn_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call HydroDyn_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call HydroDyn_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call HydroDyn_PackOtherState(RF, InData%OtherSt(i1)) - end do - call HydroDyn_PackParam(RF, InData%p) - call HydroDyn_PackInput(RF, InData%u) - call HydroDyn_PackOutput(RF, InData%y) - call HydroDyn_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) + do i1 = LB(1), UB(1) + call InflowWind_PackContState(RF, InData%x(i1)) + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) + do i1 = LB(1), UB(1) + call InflowWind_PackDiscState(RF, InData%xd(i1)) + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) do i1 = LB(1), UB(1) - call HydroDyn_PackOutput(RF, InData%Output(i1)) + call InflowWind_PackConstrState(RF, InData%z(i1)) end do end if - call HydroDyn_PackOutput(RF, InData%y_interp) + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) + do i1 = LB(1), UB(1) + call InflowWind_PackOtherState(RF, InData%OtherSt(i1)) + end do + end if + call InflowWind_PackParam(RF, InData%p) + call InflowWind_PackOutput(RF, InData%y) + call InflowWind_PackMisc(RF, InData%m) call RegPack(RF, allocated(InData%Input)) if (allocated(InData%Input)) then call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) LB(1:1) = lbound(InData%Input) UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call HydroDyn_PackInput(RF, InData%Input(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call HydroDyn_PackInput(RF, InData%Input_Saved(i1)) + call InflowWind_PackInput(RF, InData%Input(i1)) end do end if call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackHydroDyn_Data(RF, OutData) +subroutine FAST_UnPackInflowWind_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(HydroDyn_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackHydroDyn_Data' + type(InflowWind_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackInflowWind_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call HydroDyn_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call HydroDyn_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call HydroDyn_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call HydroDyn_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call HydroDyn_UnpackParam(RF, OutData%p) ! p - call HydroDyn_UnpackInput(RF, OutData%u) ! u - call HydroDyn_UnpackOutput(RF, OutData%y) ! y - call HydroDyn_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Output)) deallocate(OutData%Output) + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call HydroDyn_UnpackOutput(RF, OutData%Output(i1)) ! Output + call InflowWind_UnpackContState(RF, OutData%x(i1)) ! x end do end if - call HydroDyn_UnpackOutput(RF, OutData%y_interp) ! y_interp - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%xd)) deallocate(OutData%xd) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%xd(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call HydroDyn_UnpackInput(RF, OutData%Input(i1)) ! Input + call InflowWind_UnpackDiscState(RF, OutData%xd(i1)) ! xd + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call InflowWind_UnpackConstrState(RF, OutData%z(i1)) ! z + end do + end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call InflowWind_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + call InflowWind_UnpackParam(RF, OutData%p) ! p + call InflowWind_UnpackOutput(RF, OutData%y) ! y + call InflowWind_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%Input(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call HydroDyn_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call InflowWind_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyIceFloe_Data(SrcIceFloe_DataData, DstIceFloe_DataData, CtrlCode, ErrStat, ErrMsg) - type(IceFloe_Data), intent(inout) :: SrcIceFloe_DataData - type(IceFloe_Data), intent(inout) :: DstIceFloe_DataData +subroutine FAST_CopyExternalInflow_Data(SrcExternalInflow_DataData, DstExternalInflow_DataData, CtrlCode, ErrStat, ErrMsg) + type(ExternalInflow_Data), intent(inout) :: SrcExternalInflow_DataData + type(ExternalInflow_Data), intent(inout) :: DstExternalInflow_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1 - integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyIceFloe_Data' + character(*), parameter :: RoutineName = 'FAST_CopyExternalInflow_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcIceFloe_DataData%x) - UB(1:1) = ubound(SrcIceFloe_DataData%x) - do i1 = LB(1), UB(1) - call IceFloe_CopyContState(SrcIceFloe_DataData%x(i1), DstIceFloe_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcIceFloe_DataData%xd) - UB(1:1) = ubound(SrcIceFloe_DataData%xd) - do i1 = LB(1), UB(1) - call IceFloe_CopyDiscState(SrcIceFloe_DataData%xd(i1), DstIceFloe_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcIceFloe_DataData%z) - UB(1:1) = ubound(SrcIceFloe_DataData%z) - do i1 = LB(1), UB(1) - call IceFloe_CopyConstrState(SrcIceFloe_DataData%z(i1), DstIceFloe_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcIceFloe_DataData%OtherSt) - UB(1:1) = ubound(SrcIceFloe_DataData%OtherSt) - do i1 = LB(1), UB(1) - call IceFloe_CopyOtherState(SrcIceFloe_DataData%OtherSt(i1), DstIceFloe_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call IceFloe_CopyParam(SrcIceFloe_DataData%p, DstIceFloe_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call ExtInfw_CopyInput(SrcExternalInflow_DataData%u, DstExternalInflow_DataData%u, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ExtInfw_CopyOutput(SrcExternalInflow_DataData%y, DstExternalInflow_DataData%y, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call IceFloe_CopyInput(SrcIceFloe_DataData%u, DstIceFloe_DataData%u, CtrlCode, ErrStat2, ErrMsg2) + call ExtInfw_CopyParam(SrcExternalInflow_DataData%p, DstExternalInflow_DataData%p, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call IceFloe_CopyOutput(SrcIceFloe_DataData%y, DstIceFloe_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call ExtInfw_CopyMisc(SrcExternalInflow_DataData%m, DstExternalInflow_DataData%m, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call IceFloe_CopyMisc(SrcIceFloe_DataData%m, DstIceFloe_DataData%m, CtrlCode, ErrStat2, ErrMsg2) +end subroutine + +subroutine FAST_DestroyExternalInflow_Data(ExternalInflow_DataData, ErrStat, ErrMsg) + type(ExternalInflow_Data), intent(inout) :: ExternalInflow_DataData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_DestroyExternalInflow_Data' + ErrStat = ErrID_None + ErrMsg = '' + call ExtInfw_DestroyInput(ExternalInflow_DataData%u, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtInfw_DestroyOutput(ExternalInflow_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtInfw_DestroyParam(ExternalInflow_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtInfw_DestroyMisc(ExternalInflow_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine FAST_PackExternalInflow_Data(RF, Indata) + type(RegFile), intent(inout) :: RF + type(ExternalInflow_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackExternalInflow_Data' + if (RF%ErrStat >= AbortErrLev) return + call ExtInfw_PackInput(RF, InData%u) + call ExtInfw_PackOutput(RF, InData%y) + call ExtInfw_PackParam(RF, InData%p) + call ExtInfw_PackMisc(RF, InData%m) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_UnPackExternalInflow_Data(RF, OutData) + type(RegFile), intent(inout) :: RF + type(ExternalInflow_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackExternalInflow_Data' + if (RF%ErrStat /= ErrID_None) return + call ExtInfw_UnpackInput(RF, OutData%u) ! u + call ExtInfw_UnpackOutput(RF, OutData%y) ! y + call ExtInfw_UnpackParam(RF, OutData%p) ! p + call ExtInfw_UnpackMisc(RF, OutData%m) ! m +end subroutine + +subroutine FAST_CopySubDyn_Data(SrcSubDyn_DataData, DstSubDyn_DataData, CtrlCode, ErrStat, ErrMsg) + type(SubDyn_Data), intent(inout) :: SrcSubDyn_DataData + type(SubDyn_Data), intent(inout) :: DstSubDyn_DataData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_CopySubDyn_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcSubDyn_DataData%x)) then + LB(1:1) = lbound(SrcSubDyn_DataData%x) + UB(1:1) = ubound(SrcSubDyn_DataData%x) + if (.not. allocated(DstSubDyn_DataData%x)) then + allocate(DstSubDyn_DataData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SD_CopyContState(SrcSubDyn_DataData%x(i1), DstSubDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call SD_CopyContState(SrcSubDyn_DataData%dxdt, DstSubDyn_DataData%dxdt, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcIceFloe_DataData%Input)) then - LB(1:1) = lbound(SrcIceFloe_DataData%Input) - UB(1:1) = ubound(SrcIceFloe_DataData%Input) - if (.not. allocated(DstIceFloe_DataData%Input)) then - allocate(DstIceFloe_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSubDyn_DataData%xd)) then + LB(1:1) = lbound(SrcSubDyn_DataData%xd) + UB(1:1) = ubound(SrcSubDyn_DataData%xd) + if (.not. allocated(DstSubDyn_DataData%xd)) then + allocate(DstSubDyn_DataData%xd(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call IceFloe_CopyInput(SrcIceFloe_DataData%Input(i1), DstIceFloe_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SD_CopyDiscState(SrcSubDyn_DataData%xd(i1), DstSubDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcIceFloe_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcIceFloe_DataData%Input_Saved) - UB(1:1) = ubound(SrcIceFloe_DataData%Input_Saved) - if (.not. allocated(DstIceFloe_DataData%Input_Saved)) then - allocate(DstIceFloe_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSubDyn_DataData%z)) then + LB(1:1) = lbound(SrcSubDyn_DataData%z) + UB(1:1) = ubound(SrcSubDyn_DataData%z) + if (.not. allocated(DstSubDyn_DataData%z)) then + allocate(DstSubDyn_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call IceFloe_CopyInput(SrcIceFloe_DataData%Input_Saved(i1), DstIceFloe_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call SD_CopyConstrState(SrcSubDyn_DataData%z(i1), DstSubDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcIceFloe_DataData%InputTimes)) then - LB(1:1) = lbound(SrcIceFloe_DataData%InputTimes) - UB(1:1) = ubound(SrcIceFloe_DataData%InputTimes) - if (.not. allocated(DstIceFloe_DataData%InputTimes)) then - allocate(DstIceFloe_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSubDyn_DataData%OtherSt)) then + LB(1:1) = lbound(SrcSubDyn_DataData%OtherSt) + UB(1:1) = ubound(SrcSubDyn_DataData%OtherSt) + if (.not. allocated(DstSubDyn_DataData%OtherSt)) then + allocate(DstSubDyn_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) return end if end if - DstIceFloe_DataData%InputTimes = SrcIceFloe_DataData%InputTimes + do i1 = LB(1), UB(1) + call SD_CopyOtherState(SrcSubDyn_DataData%OtherSt(i1), DstSubDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call SD_CopyParam(SrcSubDyn_DataData%p, DstSubDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SD_CopyOutput(SrcSubDyn_DataData%y, DstSubDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SD_CopyMisc(SrcSubDyn_DataData%m, DstSubDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcSubDyn_DataData%Input)) then + LB(1:1) = lbound(SrcSubDyn_DataData%Input) + UB(1:1) = ubound(SrcSubDyn_DataData%Input) + if (.not. allocated(DstSubDyn_DataData%Input)) then + allocate(DstSubDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SD_CopyInput(SrcSubDyn_DataData%Input(i1), DstSubDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcIceFloe_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcIceFloe_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcIceFloe_DataData%InputTimes_Saved) - if (.not. allocated(DstIceFloe_DataData%InputTimes_Saved)) then - allocate(DstIceFloe_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSubDyn_DataData%InputTimes)) then + LB(1:1) = lbound(SrcSubDyn_DataData%InputTimes) + UB(1:1) = ubound(SrcSubDyn_DataData%InputTimes) + if (.not. allocated(DstSubDyn_DataData%InputTimes)) then + allocate(DstSubDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSubDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstIceFloe_DataData%InputTimes_Saved = SrcIceFloe_DataData%InputTimes_Saved + DstSubDyn_DataData%InputTimes = SrcSubDyn_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyIceFloe_Data(IceFloe_DataData, ErrStat, ErrMsg) - type(IceFloe_Data), intent(inout) :: IceFloe_DataData +subroutine FAST_DestroySubDyn_Data(SubDyn_DataData, ErrStat, ErrMsg) + type(SubDyn_Data), intent(inout) :: SubDyn_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyIceFloe_Data' + character(*), parameter :: RoutineName = 'FAST_DestroySubDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(IceFloe_DataData%x) - UB(1:1) = ubound(IceFloe_DataData%x) - do i1 = LB(1), UB(1) - call IceFloe_DestroyContState(IceFloe_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(IceFloe_DataData%xd) - UB(1:1) = ubound(IceFloe_DataData%xd) - do i1 = LB(1), UB(1) - call IceFloe_DestroyDiscState(IceFloe_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(IceFloe_DataData%z) - UB(1:1) = ubound(IceFloe_DataData%z) - do i1 = LB(1), UB(1) - call IceFloe_DestroyConstrState(IceFloe_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(IceFloe_DataData%OtherSt) - UB(1:1) = ubound(IceFloe_DataData%OtherSt) - do i1 = LB(1), UB(1) - call IceFloe_DestroyOtherState(IceFloe_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call IceFloe_DestroyParam(IceFloe_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call IceFloe_DestroyInput(IceFloe_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call IceFloe_DestroyOutput(IceFloe_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call IceFloe_DestroyMisc(IceFloe_DataData%m, ErrStat2, ErrMsg2) + if (allocated(SubDyn_DataData%x)) then + LB(1:1) = lbound(SubDyn_DataData%x) + UB(1:1) = ubound(SubDyn_DataData%x) + do i1 = LB(1), UB(1) + call SD_DestroyContState(SubDyn_DataData%x(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SubDyn_DataData%x) + end if + call SD_DestroyContState(SubDyn_DataData%dxdt, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(IceFloe_DataData%Input)) then - LB(1:1) = lbound(IceFloe_DataData%Input) - UB(1:1) = ubound(IceFloe_DataData%Input) + if (allocated(SubDyn_DataData%xd)) then + LB(1:1) = lbound(SubDyn_DataData%xd) + UB(1:1) = ubound(SubDyn_DataData%xd) do i1 = LB(1), UB(1) - call IceFloe_DestroyInput(IceFloe_DataData%Input(i1), ErrStat2, ErrMsg2) + call SD_DestroyDiscState(SubDyn_DataData%xd(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(IceFloe_DataData%Input) + deallocate(SubDyn_DataData%xd) end if - if (allocated(IceFloe_DataData%Input_Saved)) then - LB(1:1) = lbound(IceFloe_DataData%Input_Saved) - UB(1:1) = ubound(IceFloe_DataData%Input_Saved) + if (allocated(SubDyn_DataData%z)) then + LB(1:1) = lbound(SubDyn_DataData%z) + UB(1:1) = ubound(SubDyn_DataData%z) do i1 = LB(1), UB(1) - call IceFloe_DestroyInput(IceFloe_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call SD_DestroyConstrState(SubDyn_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(IceFloe_DataData%Input_Saved) + deallocate(SubDyn_DataData%z) end if - if (allocated(IceFloe_DataData%InputTimes)) then - deallocate(IceFloe_DataData%InputTimes) + if (allocated(SubDyn_DataData%OtherSt)) then + LB(1:1) = lbound(SubDyn_DataData%OtherSt) + UB(1:1) = ubound(SubDyn_DataData%OtherSt) + do i1 = LB(1), UB(1) + call SD_DestroyOtherState(SubDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SubDyn_DataData%OtherSt) + end if + call SD_DestroyParam(SubDyn_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SD_DestroyOutput(SubDyn_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SD_DestroyMisc(SubDyn_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(SubDyn_DataData%Input)) then + LB(1:1) = lbound(SubDyn_DataData%Input) + UB(1:1) = ubound(SubDyn_DataData%Input) + do i1 = LB(1), UB(1) + call SD_DestroyInput(SubDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SubDyn_DataData%Input) end if - if (allocated(IceFloe_DataData%InputTimes_Saved)) then - deallocate(IceFloe_DataData%InputTimes_Saved) + if (allocated(SubDyn_DataData%InputTimes)) then + deallocate(SubDyn_DataData%InputTimes) end if end subroutine -subroutine FAST_PackIceFloe_Data(RF, Indata) +subroutine FAST_PackSubDyn_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(IceFloe_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackIceFloe_Data' + type(SubDyn_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackSubDyn_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call IceFloe_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call IceFloe_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call IceFloe_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call IceFloe_PackOtherState(RF, InData%OtherSt(i1)) - end do - call IceFloe_PackParam(RF, InData%p) - call IceFloe_PackInput(RF, InData%u) - call IceFloe_PackOutput(RF, InData%y) - call IceFloe_PackMisc(RF, InData%m) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) + do i1 = LB(1), UB(1) + call SD_PackContState(RF, InData%x(i1)) + end do + end if + call SD_PackContState(RF, InData%dxdt) + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) + do i1 = LB(1), UB(1) + call SD_PackDiscState(RF, InData%xd(i1)) + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) + do i1 = LB(1), UB(1) + call SD_PackConstrState(RF, InData%z(i1)) + end do + end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) + do i1 = LB(1), UB(1) + call SD_PackOtherState(RF, InData%OtherSt(i1)) + end do + end if + call SD_PackParam(RF, InData%p) + call SD_PackOutput(RF, InData%y) + call SD_PackMisc(RF, InData%m) call RegPack(RF, allocated(InData%Input)) if (allocated(InData%Input)) then call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) LB(1:1) = lbound(InData%Input) UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call IceFloe_PackInput(RF, InData%Input(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call IceFloe_PackInput(RF, InData%Input_Saved(i1)) + call SD_PackInput(RF, InData%Input(i1)) end do end if call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackIceFloe_Data(RF, OutData) +subroutine FAST_UnPackSubDyn_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(IceFloe_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackIceFloe_Data' + type(SubDyn_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackSubDyn_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call IceFloe_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call IceFloe_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call IceFloe_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call IceFloe_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call IceFloe_UnpackParam(RF, OutData%p) ! p - call IceFloe_UnpackInput(RF, OutData%u) ! u - call IceFloe_UnpackOutput(RF, OutData%y) ! y - call IceFloe_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call IceFloe_UnpackInput(RF, OutData%Input(i1)) ! Input + call SD_UnpackContState(RF, OutData%x(i1)) ! x + end do + end if + call SD_UnpackContState(RF, OutData%dxdt) ! dxdt + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SD_UnpackDiscState(RF, OutData%xd(i1)) ! xd + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SD_UnpackConstrState(RF, OutData%z(i1)) ! z + end do + end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SD_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + call SD_UnpackParam(RF, OutData%p) ! p + call SD_UnpackOutput(RF, OutData%y) ! y + call SD_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%Input(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call IceFloe_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call SD_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyMAP_Data(SrcMAP_DataData, DstMAP_DataData, CtrlCode, ErrStat, ErrMsg) - type(MAP_Data), intent(inout) :: SrcMAP_DataData - type(MAP_Data), intent(inout) :: DstMAP_DataData +subroutine FAST_CopySoilDyn_Data(SrcSoilDyn_DataData, DstSoilDyn_DataData, CtrlCode, ErrStat, ErrMsg) + type(SoilDyn_Data), intent(inout) :: SrcSoilDyn_DataData + type(SoilDyn_Data), intent(inout) :: DstSoilDyn_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -11468,334 +5810,335 @@ subroutine FAST_CopyMAP_Data(SrcMAP_DataData, DstMAP_DataData, CtrlCode, ErrStat integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyMAP_Data' + character(*), parameter :: RoutineName = 'FAST_CopySoilDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcMAP_DataData%x) - UB(1:1) = ubound(SrcMAP_DataData%x) - do i1 = LB(1), UB(1) - call MAP_CopyContState(SrcMAP_DataData%x(i1), DstMAP_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcMAP_DataData%xd) - UB(1:1) = ubound(SrcMAP_DataData%xd) - do i1 = LB(1), UB(1) - call MAP_CopyDiscState(SrcMAP_DataData%xd(i1), DstMAP_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcMAP_DataData%z) - UB(1:1) = ubound(SrcMAP_DataData%z) - do i1 = LB(1), UB(1) - call MAP_CopyConstrState(SrcMAP_DataData%z(i1), DstMAP_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call MAP_CopyOtherState(SrcMAP_DataData%OtherSt, DstMAP_DataData%OtherSt, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MAP_CopyParam(SrcMAP_DataData%p, DstMAP_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MAP_CopyInput(SrcMAP_DataData%u, DstMAP_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MAP_CopyOutput(SrcMAP_DataData%y, DstMAP_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MAP_CopyOtherState(SrcMAP_DataData%OtherSt_old, DstMAP_DataData%OtherSt_old, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcMAP_DataData%Output)) then - LB(1:1) = lbound(SrcMAP_DataData%Output) - UB(1:1) = ubound(SrcMAP_DataData%Output) - if (.not. allocated(DstMAP_DataData%Output)) then - allocate(DstMAP_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSoilDyn_DataData%x)) then + LB(1:1) = lbound(SrcSoilDyn_DataData%x) + UB(1:1) = ubound(SrcSoilDyn_DataData%x) + if (.not. allocated(DstSoilDyn_DataData%x)) then + allocate(DstSoilDyn_DataData%x(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSoilDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MAP_CopyOutput(SrcMAP_DataData%Output(i1), DstMAP_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) + call SlD_CopyContState(SrcSoilDyn_DataData%x(i1), DstSoilDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call MAP_CopyOutput(SrcMAP_DataData%y_interp, DstMAP_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) + call SlD_CopyContState(SrcSoilDyn_DataData%dxdt, DstSoilDyn_DataData%dxdt, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcMAP_DataData%Input)) then - LB(1:1) = lbound(SrcMAP_DataData%Input) - UB(1:1) = ubound(SrcMAP_DataData%Input) - if (.not. allocated(DstMAP_DataData%Input)) then - allocate(DstMAP_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSoilDyn_DataData%xd)) then + LB(1:1) = lbound(SrcSoilDyn_DataData%xd) + UB(1:1) = ubound(SrcSoilDyn_DataData%xd) + if (.not. allocated(DstSoilDyn_DataData%xd)) then + allocate(DstSoilDyn_DataData%xd(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSoilDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MAP_CopyInput(SrcMAP_DataData%Input(i1), DstMAP_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SlD_CopyDiscState(SrcSoilDyn_DataData%xd(i1), DstSoilDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMAP_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcMAP_DataData%Input_Saved) - UB(1:1) = ubound(SrcMAP_DataData%Input_Saved) - if (.not. allocated(DstMAP_DataData%Input_Saved)) then - allocate(DstMAP_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSoilDyn_DataData%z)) then + LB(1:1) = lbound(SrcSoilDyn_DataData%z) + UB(1:1) = ubound(SrcSoilDyn_DataData%z) + if (.not. allocated(DstSoilDyn_DataData%z)) then + allocate(DstSoilDyn_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSoilDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MAP_CopyInput(SrcMAP_DataData%Input_Saved(i1), DstMAP_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call SlD_CopyConstrState(SrcSoilDyn_DataData%z(i1), DstSoilDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMAP_DataData%InputTimes)) then - LB(1:1) = lbound(SrcMAP_DataData%InputTimes) - UB(1:1) = ubound(SrcMAP_DataData%InputTimes) - if (.not. allocated(DstMAP_DataData%InputTimes)) then - allocate(DstMAP_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSoilDyn_DataData%OtherSt)) then + LB(1:1) = lbound(SrcSoilDyn_DataData%OtherSt) + UB(1:1) = ubound(SrcSoilDyn_DataData%OtherSt) + if (.not. allocated(DstSoilDyn_DataData%OtherSt)) then + allocate(DstSoilDyn_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSoilDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMAP_DataData%InputTimes = SrcMAP_DataData%InputTimes + do i1 = LB(1), UB(1) + call SlD_CopyOtherState(SrcSoilDyn_DataData%OtherSt(i1), DstSoilDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call SlD_CopyParam(SrcSoilDyn_DataData%p, DstSoilDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SlD_CopyInput(SrcSoilDyn_DataData%u, DstSoilDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SlD_CopyOutput(SrcSoilDyn_DataData%y, DstSoilDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SlD_CopyMisc(SrcSoilDyn_DataData%m, DstSoilDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcSoilDyn_DataData%Input)) then + LB(1:1) = lbound(SrcSoilDyn_DataData%Input) + UB(1:1) = ubound(SrcSoilDyn_DataData%Input) + if (.not. allocated(DstSoilDyn_DataData%Input)) then + allocate(DstSoilDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstSoilDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SlD_CopyInput(SrcSoilDyn_DataData%Input(i1), DstSoilDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcMAP_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcMAP_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcMAP_DataData%InputTimes_Saved) - if (.not. allocated(DstMAP_DataData%InputTimes_Saved)) then - allocate(DstMAP_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSoilDyn_DataData%InputTimes)) then + LB(1:1) = lbound(SrcSoilDyn_DataData%InputTimes) + UB(1:1) = ubound(SrcSoilDyn_DataData%InputTimes) + if (.not. allocated(DstSoilDyn_DataData%InputTimes)) then + allocate(DstSoilDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSoilDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMAP_DataData%InputTimes_Saved = SrcMAP_DataData%InputTimes_Saved + DstSoilDyn_DataData%InputTimes = SrcSoilDyn_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyMAP_Data(MAP_DataData, ErrStat, ErrMsg) - type(MAP_Data), intent(inout) :: MAP_DataData +subroutine FAST_DestroySoilDyn_Data(SoilDyn_DataData, ErrStat, ErrMsg) + type(SoilDyn_Data), intent(inout) :: SoilDyn_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyMAP_Data' + character(*), parameter :: RoutineName = 'FAST_DestroySoilDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(MAP_DataData%x) - UB(1:1) = ubound(MAP_DataData%x) - do i1 = LB(1), UB(1) - call MAP_DestroyContState(MAP_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(MAP_DataData%xd) - UB(1:1) = ubound(MAP_DataData%xd) - do i1 = LB(1), UB(1) - call MAP_DestroyDiscState(MAP_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(MAP_DataData%z) - UB(1:1) = ubound(MAP_DataData%z) - do i1 = LB(1), UB(1) - call MAP_DestroyConstrState(MAP_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call MAP_DestroyOtherState(MAP_DataData%OtherSt, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MAP_DestroyParam(MAP_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MAP_DestroyInput(MAP_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MAP_DestroyOutput(MAP_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MAP_DestroyOtherState(MAP_DataData%OtherSt_old, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MAP_DataData%Output)) then - LB(1:1) = lbound(MAP_DataData%Output) - UB(1:1) = ubound(MAP_DataData%Output) + if (allocated(SoilDyn_DataData%x)) then + LB(1:1) = lbound(SoilDyn_DataData%x) + UB(1:1) = ubound(SoilDyn_DataData%x) do i1 = LB(1), UB(1) - call MAP_DestroyOutput(MAP_DataData%Output(i1), ErrStat2, ErrMsg2) + call SlD_DestroyContState(SoilDyn_DataData%x(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MAP_DataData%Output) + deallocate(SoilDyn_DataData%x) end if - call MAP_DestroyOutput(MAP_DataData%y_interp, ErrStat2, ErrMsg2) + call SlD_DestroyContState(SoilDyn_DataData%dxdt, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MAP_DataData%Input)) then - LB(1:1) = lbound(MAP_DataData%Input) - UB(1:1) = ubound(MAP_DataData%Input) + if (allocated(SoilDyn_DataData%xd)) then + LB(1:1) = lbound(SoilDyn_DataData%xd) + UB(1:1) = ubound(SoilDyn_DataData%xd) do i1 = LB(1), UB(1) - call MAP_DestroyInput(MAP_DataData%Input(i1), ErrStat2, ErrMsg2) + call SlD_DestroyDiscState(SoilDyn_DataData%xd(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MAP_DataData%Input) + deallocate(SoilDyn_DataData%xd) end if - if (allocated(MAP_DataData%Input_Saved)) then - LB(1:1) = lbound(MAP_DataData%Input_Saved) - UB(1:1) = ubound(MAP_DataData%Input_Saved) + if (allocated(SoilDyn_DataData%z)) then + LB(1:1) = lbound(SoilDyn_DataData%z) + UB(1:1) = ubound(SoilDyn_DataData%z) do i1 = LB(1), UB(1) - call MAP_DestroyInput(MAP_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call SlD_DestroyConstrState(SoilDyn_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MAP_DataData%Input_Saved) + deallocate(SoilDyn_DataData%z) end if - if (allocated(MAP_DataData%InputTimes)) then - deallocate(MAP_DataData%InputTimes) + if (allocated(SoilDyn_DataData%OtherSt)) then + LB(1:1) = lbound(SoilDyn_DataData%OtherSt) + UB(1:1) = ubound(SoilDyn_DataData%OtherSt) + do i1 = LB(1), UB(1) + call SlD_DestroyOtherState(SoilDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SoilDyn_DataData%OtherSt) + end if + call SlD_DestroyParam(SoilDyn_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyInput(SoilDyn_DataData%u, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyOutput(SoilDyn_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyMisc(SoilDyn_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(SoilDyn_DataData%Input)) then + LB(1:1) = lbound(SoilDyn_DataData%Input) + UB(1:1) = ubound(SoilDyn_DataData%Input) + do i1 = LB(1), UB(1) + call SlD_DestroyInput(SoilDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SoilDyn_DataData%Input) end if - if (allocated(MAP_DataData%InputTimes_Saved)) then - deallocate(MAP_DataData%InputTimes_Saved) + if (allocated(SoilDyn_DataData%InputTimes)) then + deallocate(SoilDyn_DataData%InputTimes) end if end subroutine -subroutine FAST_PackMAP_Data(RF, Indata) +subroutine FAST_PackSoilDyn_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(MAP_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackMAP_Data' + type(SoilDyn_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackSoilDyn_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call MAP_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call MAP_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call MAP_PackConstrState(RF, InData%z(i1)) - end do - call MAP_PackOtherState(RF, InData%OtherSt) - call MAP_PackParam(RF, InData%p) - call MAP_PackInput(RF, InData%u) - call MAP_PackOutput(RF, InData%y) - call MAP_PackOtherState(RF, InData%OtherSt_old) - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) + do i1 = LB(1), UB(1) + call SlD_PackContState(RF, InData%x(i1)) + end do + end if + call SlD_PackContState(RF, InData%dxdt) + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) + do i1 = LB(1), UB(1) + call SlD_PackDiscState(RF, InData%xd(i1)) + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) + do i1 = LB(1), UB(1) + call SlD_PackConstrState(RF, InData%z(i1)) + end do + end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call MAP_PackOutput(RF, InData%Output(i1)) + call SlD_PackOtherState(RF, InData%OtherSt(i1)) end do end if - call MAP_PackOutput(RF, InData%y_interp) + call SlD_PackParam(RF, InData%p) + call SlD_PackInput(RF, InData%u) + call SlD_PackOutput(RF, InData%y) + call SlD_PackMisc(RF, InData%m) call RegPack(RF, allocated(InData%Input)) if (allocated(InData%Input)) then call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) LB(1:1) = lbound(InData%Input) UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call MAP_PackInput(RF, InData%Input(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call MAP_PackInput(RF, InData%Input_Saved(i1)) + call SlD_PackInput(RF, InData%Input(i1)) end do end if call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackMAP_Data(RF, OutData) +subroutine FAST_UnPackSoilDyn_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(MAP_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackMAP_Data' + type(SoilDyn_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackSoilDyn_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call MAP_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call MAP_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call MAP_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - call MAP_UnpackOtherState(RF, OutData%OtherSt) ! OtherSt - call MAP_UnpackParam(RF, OutData%p) ! p - call MAP_UnpackInput(RF, OutData%u) ! u - call MAP_UnpackOutput(RF, OutData%y) ! y - call MAP_UnpackOtherState(RF, OutData%OtherSt_old) ! OtherSt_old - if (allocated(OutData%Output)) deallocate(OutData%Output) + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MAP_UnpackOutput(RF, OutData%Output(i1)) ! Output + call SlD_UnpackContState(RF, OutData%x(i1)) ! x end do end if - call MAP_UnpackOutput(RF, OutData%y_interp) ! y_interp - if (allocated(OutData%Input)) deallocate(OutData%Input) + call SlD_UnpackContState(RF, OutData%dxdt) ! dxdt + if (allocated(OutData%xd)) deallocate(OutData%xd) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%xd(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MAP_UnpackInput(RF, OutData%Input(i1)) ! Input + call SlD_UnpackDiscState(RF, OutData%xd(i1)) ! xd + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SlD_UnpackConstrState(RF, OutData%z(i1)) ! z + end do + end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SlD_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + call SlD_UnpackParam(RF, OutData%p) ! p + call SlD_UnpackInput(RF, OutData%u) ! u + call SlD_UnpackOutput(RF, OutData%y) ! y + call SlD_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%Input(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MAP_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call SlD_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyFEAMooring_Data(SrcFEAMooring_DataData, DstFEAMooring_DataData, CtrlCode, ErrStat, ErrMsg) - type(FEAMooring_Data), intent(inout) :: SrcFEAMooring_DataData - type(FEAMooring_Data), intent(inout) :: DstFEAMooring_DataData +subroutine FAST_CopyExtPtfm_Data(SrcExtPtfm_DataData, DstExtPtfm_DataData, CtrlCode, ErrStat, ErrMsg) + type(ExtPtfm_Data), intent(inout) :: SrcExtPtfm_DataData + type(ExtPtfm_Data), intent(inout) :: DstExtPtfm_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -11803,296 +6146,321 @@ subroutine FAST_CopyFEAMooring_Data(SrcFEAMooring_DataData, DstFEAMooring_DataDa integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyFEAMooring_Data' + character(*), parameter :: RoutineName = 'FAST_CopyExtPtfm_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcFEAMooring_DataData%x) - UB(1:1) = ubound(SrcFEAMooring_DataData%x) - do i1 = LB(1), UB(1) - call FEAM_CopyContState(SrcFEAMooring_DataData%x(i1), DstFEAMooring_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcFEAMooring_DataData%xd) - UB(1:1) = ubound(SrcFEAMooring_DataData%xd) - do i1 = LB(1), UB(1) - call FEAM_CopyDiscState(SrcFEAMooring_DataData%xd(i1), DstFEAMooring_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcFEAMooring_DataData%z) - UB(1:1) = ubound(SrcFEAMooring_DataData%z) - do i1 = LB(1), UB(1) - call FEAM_CopyConstrState(SrcFEAMooring_DataData%z(i1), DstFEAMooring_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcFEAMooring_DataData%OtherSt) - UB(1:1) = ubound(SrcFEAMooring_DataData%OtherSt) - do i1 = LB(1), UB(1) - call FEAM_CopyOtherState(SrcFEAMooring_DataData%OtherSt(i1), DstFEAMooring_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call FEAM_CopyParam(SrcFEAMooring_DataData%p, DstFEAMooring_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call FEAM_CopyInput(SrcFEAMooring_DataData%u, DstFEAMooring_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call FEAM_CopyOutput(SrcFEAMooring_DataData%y, DstFEAMooring_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call FEAM_CopyMisc(SrcFEAMooring_DataData%m, DstFEAMooring_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcFEAMooring_DataData%Input)) then - LB(1:1) = lbound(SrcFEAMooring_DataData%Input) - UB(1:1) = ubound(SrcFEAMooring_DataData%Input) - if (.not. allocated(DstFEAMooring_DataData%Input)) then - allocate(DstFEAMooring_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcExtPtfm_DataData%x)) then + LB(1:1) = lbound(SrcExtPtfm_DataData%x) + UB(1:1) = ubound(SrcExtPtfm_DataData%x) + if (.not. allocated(DstExtPtfm_DataData%x)) then + allocate(DstExtPtfm_DataData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call ExtPtfm_CopyContState(SrcExtPtfm_DataData%x(i1), DstExtPtfm_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcExtPtfm_DataData%xd)) then + LB(1:1) = lbound(SrcExtPtfm_DataData%xd) + UB(1:1) = ubound(SrcExtPtfm_DataData%xd) + if (.not. allocated(DstExtPtfm_DataData%xd)) then + allocate(DstExtPtfm_DataData%xd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call ExtPtfm_CopyDiscState(SrcExtPtfm_DataData%xd(i1), DstExtPtfm_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcExtPtfm_DataData%z)) then + LB(1:1) = lbound(SrcExtPtfm_DataData%z) + UB(1:1) = ubound(SrcExtPtfm_DataData%z) + if (.not. allocated(DstExtPtfm_DataData%z)) then + allocate(DstExtPtfm_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call FEAM_CopyInput(SrcFEAMooring_DataData%Input(i1), DstFEAMooring_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call ExtPtfm_CopyConstrState(SrcExtPtfm_DataData%z(i1), DstExtPtfm_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcFEAMooring_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcFEAMooring_DataData%Input_Saved) - UB(1:1) = ubound(SrcFEAMooring_DataData%Input_Saved) - if (.not. allocated(DstFEAMooring_DataData%Input_Saved)) then - allocate(DstFEAMooring_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcExtPtfm_DataData%OtherSt)) then + LB(1:1) = lbound(SrcExtPtfm_DataData%OtherSt) + UB(1:1) = ubound(SrcExtPtfm_DataData%OtherSt) + if (.not. allocated(DstExtPtfm_DataData%OtherSt)) then + allocate(DstExtPtfm_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call FEAM_CopyInput(SrcFEAMooring_DataData%Input_Saved(i1), DstFEAMooring_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call ExtPtfm_CopyOtherState(SrcExtPtfm_DataData%OtherSt(i1), DstExtPtfm_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcFEAMooring_DataData%InputTimes)) then - LB(1:1) = lbound(SrcFEAMooring_DataData%InputTimes) - UB(1:1) = ubound(SrcFEAMooring_DataData%InputTimes) - if (.not. allocated(DstFEAMooring_DataData%InputTimes)) then - allocate(DstFEAMooring_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + call ExtPtfm_CopyParam(SrcExtPtfm_DataData%p, DstExtPtfm_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ExtPtfm_CopyOutput(SrcExtPtfm_DataData%y, DstExtPtfm_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call ExtPtfm_CopyMisc(SrcExtPtfm_DataData%m, DstExtPtfm_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcExtPtfm_DataData%Input)) then + LB(1:1) = lbound(SrcExtPtfm_DataData%Input) + UB(1:1) = ubound(SrcExtPtfm_DataData%Input) + if (.not. allocated(DstExtPtfm_DataData%Input)) then + allocate(DstExtPtfm_DataData%Input(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if - DstFEAMooring_DataData%InputTimes = SrcFEAMooring_DataData%InputTimes + do i1 = LB(1), UB(1) + call ExtPtfm_CopyInput(SrcExtPtfm_DataData%Input(i1), DstExtPtfm_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcFEAMooring_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcFEAMooring_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcFEAMooring_DataData%InputTimes_Saved) - if (.not. allocated(DstFEAMooring_DataData%InputTimes_Saved)) then - allocate(DstFEAMooring_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcExtPtfm_DataData%InputTimes)) then + LB(1:1) = lbound(SrcExtPtfm_DataData%InputTimes) + UB(1:1) = ubound(SrcExtPtfm_DataData%InputTimes) + if (.not. allocated(DstExtPtfm_DataData%InputTimes)) then + allocate(DstExtPtfm_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstExtPtfm_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstFEAMooring_DataData%InputTimes_Saved = SrcFEAMooring_DataData%InputTimes_Saved + DstExtPtfm_DataData%InputTimes = SrcExtPtfm_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyFEAMooring_Data(FEAMooring_DataData, ErrStat, ErrMsg) - type(FEAMooring_Data), intent(inout) :: FEAMooring_DataData +subroutine FAST_DestroyExtPtfm_Data(ExtPtfm_DataData, ErrStat, ErrMsg) + type(ExtPtfm_Data), intent(inout) :: ExtPtfm_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyFEAMooring_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyExtPtfm_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(FEAMooring_DataData%x) - UB(1:1) = ubound(FEAMooring_DataData%x) - do i1 = LB(1), UB(1) - call FEAM_DestroyContState(FEAMooring_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(FEAMooring_DataData%xd) - UB(1:1) = ubound(FEAMooring_DataData%xd) - do i1 = LB(1), UB(1) - call FEAM_DestroyDiscState(FEAMooring_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(FEAMooring_DataData%z) - UB(1:1) = ubound(FEAMooring_DataData%z) - do i1 = LB(1), UB(1) - call FEAM_DestroyConstrState(FEAMooring_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(FEAMooring_DataData%OtherSt) - UB(1:1) = ubound(FEAMooring_DataData%OtherSt) - do i1 = LB(1), UB(1) - call FEAM_DestroyOtherState(FEAMooring_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call FEAM_DestroyParam(FEAMooring_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call FEAM_DestroyInput(FEAMooring_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call FEAM_DestroyOutput(FEAMooring_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call FEAM_DestroyMisc(FEAMooring_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(FEAMooring_DataData%Input)) then - LB(1:1) = lbound(FEAMooring_DataData%Input) - UB(1:1) = ubound(FEAMooring_DataData%Input) + if (allocated(ExtPtfm_DataData%x)) then + LB(1:1) = lbound(ExtPtfm_DataData%x) + UB(1:1) = ubound(ExtPtfm_DataData%x) do i1 = LB(1), UB(1) - call FEAM_DestroyInput(FEAMooring_DataData%Input(i1), ErrStat2, ErrMsg2) + call ExtPtfm_DestroyContState(ExtPtfm_DataData%x(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(FEAMooring_DataData%Input) + deallocate(ExtPtfm_DataData%x) end if - if (allocated(FEAMooring_DataData%Input_Saved)) then - LB(1:1) = lbound(FEAMooring_DataData%Input_Saved) - UB(1:1) = ubound(FEAMooring_DataData%Input_Saved) + if (allocated(ExtPtfm_DataData%xd)) then + LB(1:1) = lbound(ExtPtfm_DataData%xd) + UB(1:1) = ubound(ExtPtfm_DataData%xd) do i1 = LB(1), UB(1) - call FEAM_DestroyInput(FEAMooring_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call ExtPtfm_DestroyDiscState(ExtPtfm_DataData%xd(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(FEAMooring_DataData%Input_Saved) + deallocate(ExtPtfm_DataData%xd) end if - if (allocated(FEAMooring_DataData%InputTimes)) then - deallocate(FEAMooring_DataData%InputTimes) + if (allocated(ExtPtfm_DataData%z)) then + LB(1:1) = lbound(ExtPtfm_DataData%z) + UB(1:1) = ubound(ExtPtfm_DataData%z) + do i1 = LB(1), UB(1) + call ExtPtfm_DestroyConstrState(ExtPtfm_DataData%z(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ExtPtfm_DataData%z) + end if + if (allocated(ExtPtfm_DataData%OtherSt)) then + LB(1:1) = lbound(ExtPtfm_DataData%OtherSt) + UB(1:1) = ubound(ExtPtfm_DataData%OtherSt) + do i1 = LB(1), UB(1) + call ExtPtfm_DestroyOtherState(ExtPtfm_DataData%OtherSt(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ExtPtfm_DataData%OtherSt) + end if + call ExtPtfm_DestroyParam(ExtPtfm_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtPtfm_DestroyOutput(ExtPtfm_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call ExtPtfm_DestroyMisc(ExtPtfm_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(ExtPtfm_DataData%Input)) then + LB(1:1) = lbound(ExtPtfm_DataData%Input) + UB(1:1) = ubound(ExtPtfm_DataData%Input) + do i1 = LB(1), UB(1) + call ExtPtfm_DestroyInput(ExtPtfm_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ExtPtfm_DataData%Input) end if - if (allocated(FEAMooring_DataData%InputTimes_Saved)) then - deallocate(FEAMooring_DataData%InputTimes_Saved) + if (allocated(ExtPtfm_DataData%InputTimes)) then + deallocate(ExtPtfm_DataData%InputTimes) end if end subroutine -subroutine FAST_PackFEAMooring_Data(RF, Indata) +subroutine FAST_PackExtPtfm_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(FEAMooring_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackFEAMooring_Data' + type(ExtPtfm_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackExtPtfm_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call FEAM_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call FEAM_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call FEAM_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call FEAM_PackOtherState(RF, InData%OtherSt(i1)) - end do - call FEAM_PackParam(RF, InData%p) - call FEAM_PackInput(RF, InData%u) - call FEAM_PackOutput(RF, InData%y) - call FEAM_PackMisc(RF, InData%m) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) + do i1 = LB(1), UB(1) + call ExtPtfm_PackContState(RF, InData%x(i1)) + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) + do i1 = LB(1), UB(1) + call ExtPtfm_PackDiscState(RF, InData%xd(i1)) + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) + do i1 = LB(1), UB(1) + call ExtPtfm_PackConstrState(RF, InData%z(i1)) + end do + end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) + do i1 = LB(1), UB(1) + call ExtPtfm_PackOtherState(RF, InData%OtherSt(i1)) + end do + end if + call ExtPtfm_PackParam(RF, InData%p) + call ExtPtfm_PackOutput(RF, InData%y) + call ExtPtfm_PackMisc(RF, InData%m) call RegPack(RF, allocated(InData%Input)) if (allocated(InData%Input)) then call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) LB(1:1) = lbound(InData%Input) UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call FEAM_PackInput(RF, InData%Input(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call FEAM_PackInput(RF, InData%Input_Saved(i1)) + call ExtPtfm_PackInput(RF, InData%Input(i1)) end do end if call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackFEAMooring_Data(RF, OutData) +subroutine FAST_UnPackExtPtfm_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(FEAMooring_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackFEAMooring_Data' + type(ExtPtfm_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackExtPtfm_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call FEAM_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call FEAM_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call FEAM_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call FEAM_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call FEAM_UnpackParam(RF, OutData%p) ! p - call FEAM_UnpackInput(RF, OutData%u) ! u - call FEAM_UnpackOutput(RF, OutData%y) ! y - call FEAM_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call FEAM_UnpackInput(RF, OutData%Input(i1)) ! Input + call ExtPtfm_UnpackContState(RF, OutData%x(i1)) ! x + end do + end if + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call ExtPtfm_UnpackDiscState(RF, OutData%xd(i1)) ! xd + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call ExtPtfm_UnpackConstrState(RF, OutData%z(i1)) ! z + end do + end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call ExtPtfm_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + call ExtPtfm_UnpackParam(RF, OutData%p) ! p + call ExtPtfm_UnpackOutput(RF, OutData%y) ! y + call ExtPtfm_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%Input(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call FEAM_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call ExtPtfm_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyMoorDyn_Data(SrcMoorDyn_DataData, DstMoorDyn_DataData, CtrlCode, ErrStat, ErrMsg) - type(MoorDyn_Data), intent(inout) :: SrcMoorDyn_DataData - type(MoorDyn_Data), intent(inout) :: DstMoorDyn_DataData +subroutine FAST_CopySeaState_Data(SrcSeaState_DataData, DstSeaState_DataData, CtrlCode, ErrStat, ErrMsg) + type(SeaState_Data), intent(in) :: SrcSeaState_DataData + type(SeaState_Data), intent(inout) :: DstSeaState_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -12100,350 +6468,321 @@ subroutine FAST_CopyMoorDyn_Data(SrcMoorDyn_DataData, DstMoorDyn_DataData, CtrlC integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyMoorDyn_Data' + character(*), parameter :: RoutineName = 'FAST_CopySeaState_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcMoorDyn_DataData%x) - UB(1:1) = ubound(SrcMoorDyn_DataData%x) - do i1 = LB(1), UB(1) - call MD_CopyContState(SrcMoorDyn_DataData%x(i1), DstMoorDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcMoorDyn_DataData%xd) - UB(1:1) = ubound(SrcMoorDyn_DataData%xd) - do i1 = LB(1), UB(1) - call MD_CopyDiscState(SrcMoorDyn_DataData%xd(i1), DstMoorDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcMoorDyn_DataData%z) - UB(1:1) = ubound(SrcMoorDyn_DataData%z) - do i1 = LB(1), UB(1) - call MD_CopyConstrState(SrcMoorDyn_DataData%z(i1), DstMoorDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcMoorDyn_DataData%OtherSt) - UB(1:1) = ubound(SrcMoorDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call MD_CopyOtherState(SrcMoorDyn_DataData%OtherSt(i1), DstMoorDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call MD_CopyParam(SrcMoorDyn_DataData%p, DstMoorDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MD_CopyInput(SrcMoorDyn_DataData%u, DstMoorDyn_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MD_CopyOutput(SrcMoorDyn_DataData%y, DstMoorDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MD_CopyMisc(SrcMoorDyn_DataData%m, DstMoorDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcMoorDyn_DataData%Output)) then - LB(1:1) = lbound(SrcMoorDyn_DataData%Output) - UB(1:1) = ubound(SrcMoorDyn_DataData%Output) - if (.not. allocated(DstMoorDyn_DataData%Output)) then - allocate(DstMoorDyn_DataData%Output(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSeaState_DataData%x)) then + LB(1:1) = lbound(SrcSeaState_DataData%x) + UB(1:1) = ubound(SrcSeaState_DataData%x) + if (.not. allocated(DstSeaState_DataData%x)) then + allocate(DstSeaState_DataData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SeaSt_CopyContState(SrcSeaState_DataData%x(i1), DstSeaState_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcSeaState_DataData%xd)) then + LB(1:1) = lbound(SrcSeaState_DataData%xd) + UB(1:1) = ubound(SrcSeaState_DataData%xd) + if (.not. allocated(DstSeaState_DataData%xd)) then + allocate(DstSeaState_DataData%xd(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%Output.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%xd.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MD_CopyOutput(SrcMoorDyn_DataData%Output(i1), DstMoorDyn_DataData%Output(i1), CtrlCode, ErrStat2, ErrMsg2) + call SeaSt_CopyDiscState(SrcSeaState_DataData%xd(i1), DstSeaState_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call MD_CopyOutput(SrcMoorDyn_DataData%y_interp, DstMoorDyn_DataData%y_interp, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcMoorDyn_DataData%Input)) then - LB(1:1) = lbound(SrcMoorDyn_DataData%Input) - UB(1:1) = ubound(SrcMoorDyn_DataData%Input) - if (.not. allocated(DstMoorDyn_DataData%Input)) then - allocate(DstMoorDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSeaState_DataData%z)) then + LB(1:1) = lbound(SrcSeaState_DataData%z) + UB(1:1) = ubound(SrcSeaState_DataData%z) + if (.not. allocated(DstSeaState_DataData%z)) then + allocate(DstSeaState_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MD_CopyInput(SrcMoorDyn_DataData%Input(i1), DstMoorDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SeaSt_CopyConstrState(SrcSeaState_DataData%z(i1), DstSeaState_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMoorDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcMoorDyn_DataData%Input_Saved) - UB(1:1) = ubound(SrcMoorDyn_DataData%Input_Saved) - if (.not. allocated(DstMoorDyn_DataData%Input_Saved)) then - allocate(DstMoorDyn_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSeaState_DataData%OtherSt)) then + LB(1:1) = lbound(SrcSeaState_DataData%OtherSt) + UB(1:1) = ubound(SrcSeaState_DataData%OtherSt) + if (.not. allocated(DstSeaState_DataData%OtherSt)) then + allocate(DstSeaState_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MD_CopyInput(SrcMoorDyn_DataData%Input_Saved(i1), DstMoorDyn_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call SeaSt_CopyOtherState(SrcSeaState_DataData%OtherSt(i1), DstSeaState_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMoorDyn_DataData%InputTimes)) then - LB(1:1) = lbound(SrcMoorDyn_DataData%InputTimes) - UB(1:1) = ubound(SrcMoorDyn_DataData%InputTimes) - if (.not. allocated(DstMoorDyn_DataData%InputTimes)) then - allocate(DstMoorDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + call SeaSt_CopyParam(SrcSeaState_DataData%p, DstSeaState_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyOutput(SrcSeaState_DataData%y, DstSeaState_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyMisc(SrcSeaState_DataData%m, DstSeaState_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcSeaState_DataData%Input)) then + LB(1:1) = lbound(SrcSeaState_DataData%Input) + UB(1:1) = ubound(SrcSeaState_DataData%Input) + if (.not. allocated(DstSeaState_DataData%Input)) then + allocate(DstSeaState_DataData%Input(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMoorDyn_DataData%InputTimes = SrcMoorDyn_DataData%InputTimes + do i1 = LB(1), UB(1) + call SeaSt_CopyInput(SrcSeaState_DataData%Input(i1), DstSeaState_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcMoorDyn_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcMoorDyn_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcMoorDyn_DataData%InputTimes_Saved) - if (.not. allocated(DstMoorDyn_DataData%InputTimes_Saved)) then - allocate(DstMoorDyn_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcSeaState_DataData%InputTimes)) then + LB(1:1) = lbound(SrcSeaState_DataData%InputTimes) + UB(1:1) = ubound(SrcSeaState_DataData%InputTimes) + if (.not. allocated(DstSeaState_DataData%InputTimes)) then + allocate(DstSeaState_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstSeaState_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMoorDyn_DataData%InputTimes_Saved = SrcMoorDyn_DataData%InputTimes_Saved + DstSeaState_DataData%InputTimes = SrcSeaState_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyMoorDyn_Data(MoorDyn_DataData, ErrStat, ErrMsg) - type(MoorDyn_Data), intent(inout) :: MoorDyn_DataData +subroutine FAST_DestroySeaState_Data(SeaState_DataData, ErrStat, ErrMsg) + type(SeaState_Data), intent(inout) :: SeaState_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyMoorDyn_Data' + character(*), parameter :: RoutineName = 'FAST_DestroySeaState_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(MoorDyn_DataData%x) - UB(1:1) = ubound(MoorDyn_DataData%x) - do i1 = LB(1), UB(1) - call MD_DestroyContState(MoorDyn_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(MoorDyn_DataData%xd) - UB(1:1) = ubound(MoorDyn_DataData%xd) - do i1 = LB(1), UB(1) - call MD_DestroyDiscState(MoorDyn_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(MoorDyn_DataData%z) - UB(1:1) = ubound(MoorDyn_DataData%z) - do i1 = LB(1), UB(1) - call MD_DestroyConstrState(MoorDyn_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(MoorDyn_DataData%OtherSt) - UB(1:1) = ubound(MoorDyn_DataData%OtherSt) - do i1 = LB(1), UB(1) - call MD_DestroyOtherState(MoorDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call MD_DestroyParam(MoorDyn_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MD_DestroyInput(MoorDyn_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MD_DestroyOutput(MoorDyn_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MD_DestroyMisc(MoorDyn_DataData%m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MoorDyn_DataData%Output)) then - LB(1:1) = lbound(MoorDyn_DataData%Output) - UB(1:1) = ubound(MoorDyn_DataData%Output) + if (allocated(SeaState_DataData%x)) then + LB(1:1) = lbound(SeaState_DataData%x) + UB(1:1) = ubound(SeaState_DataData%x) do i1 = LB(1), UB(1) - call MD_DestroyOutput(MoorDyn_DataData%Output(i1), ErrStat2, ErrMsg2) + call SeaSt_DestroyContState(SeaState_DataData%x(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MoorDyn_DataData%Output) + deallocate(SeaState_DataData%x) end if - call MD_DestroyOutput(MoorDyn_DataData%y_interp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MoorDyn_DataData%Input)) then - LB(1:1) = lbound(MoorDyn_DataData%Input) - UB(1:1) = ubound(MoorDyn_DataData%Input) + if (allocated(SeaState_DataData%xd)) then + LB(1:1) = lbound(SeaState_DataData%xd) + UB(1:1) = ubound(SeaState_DataData%xd) do i1 = LB(1), UB(1) - call MD_DestroyInput(MoorDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call SeaSt_DestroyDiscState(SeaState_DataData%xd(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MoorDyn_DataData%Input) + deallocate(SeaState_DataData%xd) end if - if (allocated(MoorDyn_DataData%Input_Saved)) then - LB(1:1) = lbound(MoorDyn_DataData%Input_Saved) - UB(1:1) = ubound(MoorDyn_DataData%Input_Saved) + if (allocated(SeaState_DataData%z)) then + LB(1:1) = lbound(SeaState_DataData%z) + UB(1:1) = ubound(SeaState_DataData%z) do i1 = LB(1), UB(1) - call MD_DestroyInput(MoorDyn_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call SeaSt_DestroyConstrState(SeaState_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MoorDyn_DataData%Input_Saved) + deallocate(SeaState_DataData%z) end if - if (allocated(MoorDyn_DataData%InputTimes)) then - deallocate(MoorDyn_DataData%InputTimes) + if (allocated(SeaState_DataData%OtherSt)) then + LB(1:1) = lbound(SeaState_DataData%OtherSt) + UB(1:1) = ubound(SeaState_DataData%OtherSt) + do i1 = LB(1), UB(1) + call SeaSt_DestroyOtherState(SeaState_DataData%OtherSt(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SeaState_DataData%OtherSt) + end if + call SeaSt_DestroyParam(SeaState_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyOutput(SeaState_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyMisc(SeaState_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(SeaState_DataData%Input)) then + LB(1:1) = lbound(SeaState_DataData%Input) + UB(1:1) = ubound(SeaState_DataData%Input) + do i1 = LB(1), UB(1) + call SeaSt_DestroyInput(SeaState_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(SeaState_DataData%Input) end if - if (allocated(MoorDyn_DataData%InputTimes_Saved)) then - deallocate(MoorDyn_DataData%InputTimes_Saved) + if (allocated(SeaState_DataData%InputTimes)) then + deallocate(SeaState_DataData%InputTimes) end if end subroutine -subroutine FAST_PackMoorDyn_Data(RF, Indata) +subroutine FAST_PackSeaState_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(MoorDyn_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackMoorDyn_Data' + type(SeaState_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackSeaState_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call MD_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call MD_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call MD_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call MD_PackOtherState(RF, InData%OtherSt(i1)) - end do - call MD_PackParam(RF, InData%p) - call MD_PackInput(RF, InData%u) - call MD_PackOutput(RF, InData%y) - call MD_PackMisc(RF, InData%m) - call RegPack(RF, allocated(InData%Output)) - if (allocated(InData%Output)) then - call RegPackBounds(RF, 1, lbound(InData%Output), ubound(InData%Output)) - LB(1:1) = lbound(InData%Output) - UB(1:1) = ubound(InData%Output) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) + do i1 = LB(1), UB(1) + call SeaSt_PackContState(RF, InData%x(i1)) + end do + end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) + do i1 = LB(1), UB(1) + call SeaSt_PackDiscState(RF, InData%xd(i1)) + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) + do i1 = LB(1), UB(1) + call SeaSt_PackConstrState(RF, InData%z(i1)) + end do + end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call MD_PackOutput(RF, InData%Output(i1)) + call SeaSt_PackOtherState(RF, InData%OtherSt(i1)) end do end if - call MD_PackOutput(RF, InData%y_interp) + call SeaSt_PackParam(RF, InData%p) + call SeaSt_PackOutput(RF, InData%y) + call SeaSt_PackMisc(RF, InData%m) call RegPack(RF, allocated(InData%Input)) if (allocated(InData%Input)) then call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) LB(1:1) = lbound(InData%Input) UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call MD_PackInput(RF, InData%Input(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call MD_PackInput(RF, InData%Input_Saved(i1)) + call SeaSt_PackInput(RF, InData%Input(i1)) end do end if call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackMoorDyn_Data(RF, OutData) +subroutine FAST_UnPackSeaState_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(MoorDyn_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackMoorDyn_Data' + type(SeaState_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackSeaState_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call MD_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call MD_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call MD_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call MD_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call MD_UnpackParam(RF, OutData%p) ! p - call MD_UnpackInput(RF, OutData%u) ! u - call MD_UnpackOutput(RF, OutData%y) ! y - call MD_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Output)) deallocate(OutData%Output) + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Output(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Output.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MD_UnpackOutput(RF, OutData%Output(i1)) ! Output + call SeaSt_UnpackContState(RF, OutData%x(i1)) ! x end do end if - call MD_UnpackOutput(RF, OutData%y_interp) ! y_interp - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%xd)) deallocate(OutData%xd) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%xd(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MD_UnpackInput(RF, OutData%Input(i1)) ! Input + call SeaSt_UnpackDiscState(RF, OutData%xd(i1)) ! xd + end do + end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SeaSt_UnpackConstrState(RF, OutData%z(i1)) ! z + end do + end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SeaSt_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + call SeaSt_UnpackParam(RF, OutData%p) ! p + call SeaSt_UnpackOutput(RF, OutData%y) ! y + call SeaSt_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%Input(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MD_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call SeaSt_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_CopyOrcaFlex_Data(SrcOrcaFlex_DataData, DstOrcaFlex_DataData, CtrlCode, ErrStat, ErrMsg) - type(OrcaFlex_Data), intent(inout) :: SrcOrcaFlex_DataData - type(OrcaFlex_Data), intent(inout) :: DstOrcaFlex_DataData +subroutine FAST_CopyHydroDyn_Data(SrcHydroDyn_DataData, DstHydroDyn_DataData, CtrlCode, ErrStat, ErrMsg) + type(HydroDyn_Data), intent(inout) :: SrcHydroDyn_DataData + type(HydroDyn_Data), intent(inout) :: DstHydroDyn_DataData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -12451,2172 +6790,1900 @@ subroutine FAST_CopyOrcaFlex_Data(SrcOrcaFlex_DataData, DstOrcaFlex_DataData, Ct integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyOrcaFlex_Data' + character(*), parameter :: RoutineName = 'FAST_CopyHydroDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(SrcOrcaFlex_DataData%x) - UB(1:1) = ubound(SrcOrcaFlex_DataData%x) - do i1 = LB(1), UB(1) - call Orca_CopyContState(SrcOrcaFlex_DataData%x(i1), DstOrcaFlex_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcOrcaFlex_DataData%xd) - UB(1:1) = ubound(SrcOrcaFlex_DataData%xd) - do i1 = LB(1), UB(1) - call Orca_CopyDiscState(SrcOrcaFlex_DataData%xd(i1), DstOrcaFlex_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcOrcaFlex_DataData%z) - UB(1:1) = ubound(SrcOrcaFlex_DataData%z) - do i1 = LB(1), UB(1) - call Orca_CopyConstrState(SrcOrcaFlex_DataData%z(i1), DstOrcaFlex_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - LB(1:1) = lbound(SrcOrcaFlex_DataData%OtherSt) - UB(1:1) = ubound(SrcOrcaFlex_DataData%OtherSt) - do i1 = LB(1), UB(1) - call Orca_CopyOtherState(SrcOrcaFlex_DataData%OtherSt(i1), DstOrcaFlex_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - call Orca_CopyParam(SrcOrcaFlex_DataData%p, DstOrcaFlex_DataData%p, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call Orca_CopyInput(SrcOrcaFlex_DataData%u, DstOrcaFlex_DataData%u, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call Orca_CopyOutput(SrcOrcaFlex_DataData%y, DstOrcaFlex_DataData%y, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call Orca_CopyMisc(SrcOrcaFlex_DataData%m, DstOrcaFlex_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + if (allocated(SrcHydroDyn_DataData%x)) then + LB(1:1) = lbound(SrcHydroDyn_DataData%x) + UB(1:1) = ubound(SrcHydroDyn_DataData%x) + if (.not. allocated(DstHydroDyn_DataData%x)) then + allocate(DstHydroDyn_DataData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call HydroDyn_CopyContState(SrcHydroDyn_DataData%x(i1), DstHydroDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call HydroDyn_CopyContState(SrcHydroDyn_DataData%dxdt, DstHydroDyn_DataData%dxdt, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcOrcaFlex_DataData%Input)) then - LB(1:1) = lbound(SrcOrcaFlex_DataData%Input) - UB(1:1) = ubound(SrcOrcaFlex_DataData%Input) - if (.not. allocated(DstOrcaFlex_DataData%Input)) then - allocate(DstOrcaFlex_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcHydroDyn_DataData%xd)) then + LB(1:1) = lbound(SrcHydroDyn_DataData%xd) + UB(1:1) = ubound(SrcHydroDyn_DataData%xd) + if (.not. allocated(DstHydroDyn_DataData%xd)) then + allocate(DstHydroDyn_DataData%xd(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%Input.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call Orca_CopyInput(SrcOrcaFlex_DataData%Input(i1), DstOrcaFlex_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call HydroDyn_CopyDiscState(SrcHydroDyn_DataData%xd(i1), DstHydroDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcOrcaFlex_DataData%Input_Saved)) then - LB(1:1) = lbound(SrcOrcaFlex_DataData%Input_Saved) - UB(1:1) = ubound(SrcOrcaFlex_DataData%Input_Saved) - if (.not. allocated(DstOrcaFlex_DataData%Input_Saved)) then - allocate(DstOrcaFlex_DataData%Input_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcHydroDyn_DataData%z)) then + LB(1:1) = lbound(SrcHydroDyn_DataData%z) + UB(1:1) = ubound(SrcHydroDyn_DataData%z) + if (.not. allocated(DstHydroDyn_DataData%z)) then + allocate(DstHydroDyn_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%Input_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call Orca_CopyInput(SrcOrcaFlex_DataData%Input_Saved(i1), DstOrcaFlex_DataData%Input_Saved(i1), CtrlCode, ErrStat2, ErrMsg2) + call HydroDyn_CopyConstrState(SrcHydroDyn_DataData%z(i1), DstHydroDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcOrcaFlex_DataData%InputTimes)) then - LB(1:1) = lbound(SrcOrcaFlex_DataData%InputTimes) - UB(1:1) = ubound(SrcOrcaFlex_DataData%InputTimes) - if (.not. allocated(DstOrcaFlex_DataData%InputTimes)) then - allocate(DstOrcaFlex_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcHydroDyn_DataData%OtherSt)) then + LB(1:1) = lbound(SrcHydroDyn_DataData%OtherSt) + UB(1:1) = ubound(SrcHydroDyn_DataData%OtherSt) + if (.not. allocated(DstHydroDyn_DataData%OtherSt)) then + allocate(DstHydroDyn_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOrcaFlex_DataData%InputTimes = SrcOrcaFlex_DataData%InputTimes + do i1 = LB(1), UB(1) + call HydroDyn_CopyOtherState(SrcHydroDyn_DataData%OtherSt(i1), DstHydroDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call HydroDyn_CopyParam(SrcHydroDyn_DataData%p, DstHydroDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call HydroDyn_CopyOutput(SrcHydroDyn_DataData%y, DstHydroDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call HydroDyn_CopyMisc(SrcHydroDyn_DataData%m, DstHydroDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcHydroDyn_DataData%Input)) then + LB(1:1) = lbound(SrcHydroDyn_DataData%Input) + UB(1:1) = ubound(SrcHydroDyn_DataData%Input) + if (.not. allocated(DstHydroDyn_DataData%Input)) then + allocate(DstHydroDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call HydroDyn_CopyInput(SrcHydroDyn_DataData%Input(i1), DstHydroDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcOrcaFlex_DataData%InputTimes_Saved)) then - LB(1:1) = lbound(SrcOrcaFlex_DataData%InputTimes_Saved) - UB(1:1) = ubound(SrcOrcaFlex_DataData%InputTimes_Saved) - if (.not. allocated(DstOrcaFlex_DataData%InputTimes_Saved)) then - allocate(DstOrcaFlex_DataData%InputTimes_Saved(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcHydroDyn_DataData%InputTimes)) then + LB(1:1) = lbound(SrcHydroDyn_DataData%InputTimes) + UB(1:1) = ubound(SrcHydroDyn_DataData%InputTimes) + if (.not. allocated(DstHydroDyn_DataData%InputTimes)) then + allocate(DstHydroDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%InputTimes_Saved.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstHydroDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOrcaFlex_DataData%InputTimes_Saved = SrcOrcaFlex_DataData%InputTimes_Saved + DstHydroDyn_DataData%InputTimes = SrcHydroDyn_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyOrcaFlex_Data(OrcaFlex_DataData, ErrStat, ErrMsg) - type(OrcaFlex_Data), intent(inout) :: OrcaFlex_DataData +subroutine FAST_DestroyHydroDyn_Data(HydroDyn_DataData, ErrStat, ErrMsg) + type(HydroDyn_Data), intent(inout) :: HydroDyn_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyOrcaFlex_Data' + character(*), parameter :: RoutineName = 'FAST_DestroyHydroDyn_Data' ErrStat = ErrID_None ErrMsg = '' - LB(1:1) = lbound(OrcaFlex_DataData%x) - UB(1:1) = ubound(OrcaFlex_DataData%x) - do i1 = LB(1), UB(1) - call Orca_DestroyContState(OrcaFlex_DataData%x(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(OrcaFlex_DataData%xd) - UB(1:1) = ubound(OrcaFlex_DataData%xd) - do i1 = LB(1), UB(1) - call Orca_DestroyDiscState(OrcaFlex_DataData%xd(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(OrcaFlex_DataData%z) - UB(1:1) = ubound(OrcaFlex_DataData%z) - do i1 = LB(1), UB(1) - call Orca_DestroyConstrState(OrcaFlex_DataData%z(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - LB(1:1) = lbound(OrcaFlex_DataData%OtherSt) - UB(1:1) = ubound(OrcaFlex_DataData%OtherSt) - do i1 = LB(1), UB(1) - call Orca_DestroyOtherState(OrcaFlex_DataData%OtherSt(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - call Orca_DestroyParam(OrcaFlex_DataData%p, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call Orca_DestroyInput(OrcaFlex_DataData%u, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call Orca_DestroyOutput(OrcaFlex_DataData%y, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call Orca_DestroyMisc(OrcaFlex_DataData%m, ErrStat2, ErrMsg2) + if (allocated(HydroDyn_DataData%x)) then + LB(1:1) = lbound(HydroDyn_DataData%x) + UB(1:1) = ubound(HydroDyn_DataData%x) + do i1 = LB(1), UB(1) + call HydroDyn_DestroyContState(HydroDyn_DataData%x(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(HydroDyn_DataData%x) + end if + call HydroDyn_DestroyContState(HydroDyn_DataData%dxdt, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(OrcaFlex_DataData%Input)) then - LB(1:1) = lbound(OrcaFlex_DataData%Input) - UB(1:1) = ubound(OrcaFlex_DataData%Input) + if (allocated(HydroDyn_DataData%xd)) then + LB(1:1) = lbound(HydroDyn_DataData%xd) + UB(1:1) = ubound(HydroDyn_DataData%xd) do i1 = LB(1), UB(1) - call Orca_DestroyInput(OrcaFlex_DataData%Input(i1), ErrStat2, ErrMsg2) + call HydroDyn_DestroyDiscState(HydroDyn_DataData%xd(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OrcaFlex_DataData%Input) + deallocate(HydroDyn_DataData%xd) end if - if (allocated(OrcaFlex_DataData%Input_Saved)) then - LB(1:1) = lbound(OrcaFlex_DataData%Input_Saved) - UB(1:1) = ubound(OrcaFlex_DataData%Input_Saved) + if (allocated(HydroDyn_DataData%z)) then + LB(1:1) = lbound(HydroDyn_DataData%z) + UB(1:1) = ubound(HydroDyn_DataData%z) do i1 = LB(1), UB(1) - call Orca_DestroyInput(OrcaFlex_DataData%Input_Saved(i1), ErrStat2, ErrMsg2) + call HydroDyn_DestroyConstrState(HydroDyn_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OrcaFlex_DataData%Input_Saved) + deallocate(HydroDyn_DataData%z) end if - if (allocated(OrcaFlex_DataData%InputTimes)) then - deallocate(OrcaFlex_DataData%InputTimes) + if (allocated(HydroDyn_DataData%OtherSt)) then + LB(1:1) = lbound(HydroDyn_DataData%OtherSt) + UB(1:1) = ubound(HydroDyn_DataData%OtherSt) + do i1 = LB(1), UB(1) + call HydroDyn_DestroyOtherState(HydroDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(HydroDyn_DataData%OtherSt) + end if + call HydroDyn_DestroyParam(HydroDyn_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call HydroDyn_DestroyOutput(HydroDyn_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call HydroDyn_DestroyMisc(HydroDyn_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(HydroDyn_DataData%Input)) then + LB(1:1) = lbound(HydroDyn_DataData%Input) + UB(1:1) = ubound(HydroDyn_DataData%Input) + do i1 = LB(1), UB(1) + call HydroDyn_DestroyInput(HydroDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(HydroDyn_DataData%Input) end if - if (allocated(OrcaFlex_DataData%InputTimes_Saved)) then - deallocate(OrcaFlex_DataData%InputTimes_Saved) + if (allocated(HydroDyn_DataData%InputTimes)) then + deallocate(HydroDyn_DataData%InputTimes) end if end subroutine -subroutine FAST_PackOrcaFlex_Data(RF, Indata) +subroutine FAST_PackHydroDyn_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(OrcaFlex_Data), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackOrcaFlex_Data' + type(HydroDyn_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackHydroDyn_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - LB(1:1) = lbound(InData%x) - UB(1:1) = ubound(InData%x) - do i1 = LB(1), UB(1) - call Orca_PackContState(RF, InData%x(i1)) - end do - LB(1:1) = lbound(InData%xd) - UB(1:1) = ubound(InData%xd) - do i1 = LB(1), UB(1) - call Orca_PackDiscState(RF, InData%xd(i1)) - end do - LB(1:1) = lbound(InData%z) - UB(1:1) = ubound(InData%z) - do i1 = LB(1), UB(1) - call Orca_PackConstrState(RF, InData%z(i1)) - end do - LB(1:1) = lbound(InData%OtherSt) - UB(1:1) = ubound(InData%OtherSt) - do i1 = LB(1), UB(1) - call Orca_PackOtherState(RF, InData%OtherSt(i1)) - end do - call Orca_PackParam(RF, InData%p) - call Orca_PackInput(RF, InData%u) - call Orca_PackOutput(RF, InData%y) - call Orca_PackMisc(RF, InData%m) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) + do i1 = LB(1), UB(1) + call HydroDyn_PackContState(RF, InData%x(i1)) + end do + end if + call HydroDyn_PackContState(RF, InData%dxdt) + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) + do i1 = LB(1), UB(1) + call HydroDyn_PackDiscState(RF, InData%xd(i1)) + end do + end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) + do i1 = LB(1), UB(1) + call HydroDyn_PackConstrState(RF, InData%z(i1)) + end do + end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) + do i1 = LB(1), UB(1) + call HydroDyn_PackOtherState(RF, InData%OtherSt(i1)) + end do + end if + call HydroDyn_PackParam(RF, InData%p) + call HydroDyn_PackOutput(RF, InData%y) + call HydroDyn_PackMisc(RF, InData%m) call RegPack(RF, allocated(InData%Input)) if (allocated(InData%Input)) then call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) LB(1:1) = lbound(InData%Input) UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call Orca_PackInput(RF, InData%Input(i1)) - end do - end if - call RegPack(RF, allocated(InData%Input_Saved)) - if (allocated(InData%Input_Saved)) then - call RegPackBounds(RF, 1, lbound(InData%Input_Saved), ubound(InData%Input_Saved)) - LB(1:1) = lbound(InData%Input_Saved) - UB(1:1) = ubound(InData%Input_Saved) - do i1 = LB(1), UB(1) - call Orca_PackInput(RF, InData%Input_Saved(i1)) + call HydroDyn_PackInput(RF, InData%Input(i1)) end do end if call RegPackAlloc(RF, InData%InputTimes) - call RegPackAlloc(RF, InData%InputTimes_Saved) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackOrcaFlex_Data(RF, OutData) +subroutine FAST_UnPackHydroDyn_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(OrcaFlex_Data), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackOrcaFlex_Data' + type(HydroDyn_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackHydroDyn_Data' integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - LB(1:1) = lbound(OutData%x) - UB(1:1) = ubound(OutData%x) - do i1 = LB(1), UB(1) - call Orca_UnpackContState(RF, OutData%x(i1)) ! x - end do - LB(1:1) = lbound(OutData%xd) - UB(1:1) = ubound(OutData%xd) - do i1 = LB(1), UB(1) - call Orca_UnpackDiscState(RF, OutData%xd(i1)) ! xd - end do - LB(1:1) = lbound(OutData%z) - UB(1:1) = ubound(OutData%z) - do i1 = LB(1), UB(1) - call Orca_UnpackConstrState(RF, OutData%z(i1)) ! z - end do - LB(1:1) = lbound(OutData%OtherSt) - UB(1:1) = ubound(OutData%OtherSt) - do i1 = LB(1), UB(1) - call Orca_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt - end do - call Orca_UnpackParam(RF, OutData%p) ! p - call Orca_UnpackInput(RF, OutData%u) ! u - call Orca_UnpackOutput(RF, OutData%y) ! y - call Orca_UnpackMisc(RF, OutData%m) ! m - if (allocated(OutData%Input)) deallocate(OutData%Input) + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call Orca_UnpackInput(RF, OutData%Input(i1)) ! Input + call HydroDyn_UnpackContState(RF, OutData%x(i1)) ! x + end do + end if + call HydroDyn_UnpackContState(RF, OutData%dxdt) ! dxdt + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call HydroDyn_UnpackDiscState(RF, OutData%xd(i1)) ! xd end do end if - if (allocated(OutData%Input_Saved)) deallocate(OutData%Input_Saved) + if (allocated(OutData%z)) deallocate(OutData%z) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%Input_Saved(LB(1):UB(1)),stat=stat) + allocate(OutData%z(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input_Saved.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call Orca_UnpackInput(RF, OutData%Input_Saved(i1)) ! Input_Saved + call HydroDyn_UnpackConstrState(RF, OutData%z(i1)) ! z end do end if - call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%InputTimes_Saved); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine FAST_CopyModuleMapType(SrcModuleMapTypeData, DstModuleMapTypeData, CtrlCode, ErrStat, ErrMsg) - type(FAST_ModuleMapType), intent(inout) :: SrcModuleMapTypeData - type(FAST_ModuleMapType), intent(inout) :: DstModuleMapTypeData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_CopyModuleMapType' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(SrcModuleMapTypeData%ED_P_2_BD_P)) then - LB(1:1) = lbound(SrcModuleMapTypeData%ED_P_2_BD_P) - UB(1:1) = ubound(SrcModuleMapTypeData%ED_P_2_BD_P) - if (.not. allocated(DstModuleMapTypeData%ED_P_2_BD_P)) then - allocate(DstModuleMapTypeData%ED_P_2_BD_P(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%ED_P_2_BD_P.', ErrStat, ErrMsg, RoutineName) - return - end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_BD_P(i1), DstModuleMapTypeData%ED_P_2_BD_P(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call HydroDyn_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(SrcModuleMapTypeData%BD_P_2_ED_P)) then - LB(1:1) = lbound(SrcModuleMapTypeData%BD_P_2_ED_P) - UB(1:1) = ubound(SrcModuleMapTypeData%BD_P_2_ED_P) - if (.not. allocated(DstModuleMapTypeData%BD_P_2_ED_P)) then - allocate(DstModuleMapTypeData%BD_P_2_ED_P(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%BD_P_2_ED_P.', ErrStat, ErrMsg, RoutineName) - return - end if + call HydroDyn_UnpackParam(RF, OutData%p) ! p + call HydroDyn_UnpackOutput(RF, OutData%y) ! y + call HydroDyn_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Input(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%BD_P_2_ED_P(i1), DstModuleMapTypeData%BD_P_2_ED_P(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call HydroDyn_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if - if (allocated(SrcModuleMapTypeData%ED_P_2_BD_P_Hub)) then - LB(1:1) = lbound(SrcModuleMapTypeData%ED_P_2_BD_P_Hub) - UB(1:1) = ubound(SrcModuleMapTypeData%ED_P_2_BD_P_Hub) - if (.not. allocated(DstModuleMapTypeData%ED_P_2_BD_P_Hub)) then - allocate(DstModuleMapTypeData%ED_P_2_BD_P_Hub(LB(1):UB(1)), stat=ErrStat2) + call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_CopyIceFloe_Data(SrcIceFloe_DataData, DstIceFloe_DataData, CtrlCode, ErrStat, ErrMsg) + type(IceFloe_Data), intent(inout) :: SrcIceFloe_DataData + type(IceFloe_Data), intent(inout) :: DstIceFloe_DataData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_CopyIceFloe_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcIceFloe_DataData%x)) then + LB(1:1) = lbound(SrcIceFloe_DataData%x) + UB(1:1) = ubound(SrcIceFloe_DataData%x) + if (.not. allocated(DstIceFloe_DataData%x)) then + allocate(DstIceFloe_DataData%x(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%ED_P_2_BD_P_Hub.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%x.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_BD_P_Hub(i1), DstModuleMapTypeData%ED_P_2_BD_P_Hub(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceFloe_CopyContState(SrcIceFloe_DataData%x(i1), DstIceFloe_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_HD_PRP_P, DstModuleMapTypeData%ED_P_2_HD_PRP_P, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SubStructure_2_HD_W_P, DstModuleMapTypeData%SubStructure_2_HD_W_P, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%HD_W_P_2_SubStructure, DstModuleMapTypeData%HD_W_P_2_SubStructure, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SubStructure_2_HD_M_P, DstModuleMapTypeData%SubStructure_2_HD_M_P, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%HD_M_P_2_SubStructure, DstModuleMapTypeData%HD_M_P_2_SubStructure, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%Structure_2_Mooring, DstModuleMapTypeData%Structure_2_Mooring, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%Mooring_2_Structure, DstModuleMapTypeData%Mooring_2_Structure, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_SD_TP, DstModuleMapTypeData%ED_P_2_SD_TP, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SD_TP_2_ED_P, DstModuleMapTypeData%SD_TP_2_ED_P, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%ED_P_2_NStC_P_N)) then - LB(1:1) = lbound(SrcModuleMapTypeData%ED_P_2_NStC_P_N) - UB(1:1) = ubound(SrcModuleMapTypeData%ED_P_2_NStC_P_N) - if (.not. allocated(DstModuleMapTypeData%ED_P_2_NStC_P_N)) then - allocate(DstModuleMapTypeData%ED_P_2_NStC_P_N(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcIceFloe_DataData%xd)) then + LB(1:1) = lbound(SrcIceFloe_DataData%xd) + UB(1:1) = ubound(SrcIceFloe_DataData%xd) + if (.not. allocated(DstIceFloe_DataData%xd)) then + allocate(DstIceFloe_DataData%xd(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%ED_P_2_NStC_P_N.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%xd.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_NStC_P_N(i1), DstModuleMapTypeData%ED_P_2_NStC_P_N(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceFloe_CopyDiscState(SrcIceFloe_DataData%xd(i1), DstIceFloe_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcModuleMapTypeData%NStC_P_2_ED_P_N)) then - LB(1:1) = lbound(SrcModuleMapTypeData%NStC_P_2_ED_P_N) - UB(1:1) = ubound(SrcModuleMapTypeData%NStC_P_2_ED_P_N) - if (.not. allocated(DstModuleMapTypeData%NStC_P_2_ED_P_N)) then - allocate(DstModuleMapTypeData%NStC_P_2_ED_P_N(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcIceFloe_DataData%z)) then + LB(1:1) = lbound(SrcIceFloe_DataData%z) + UB(1:1) = ubound(SrcIceFloe_DataData%z) + if (.not. allocated(DstIceFloe_DataData%z)) then + allocate(DstIceFloe_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%NStC_P_2_ED_P_N.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%NStC_P_2_ED_P_N(i1), DstModuleMapTypeData%NStC_P_2_ED_P_N(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceFloe_CopyConstrState(SrcIceFloe_DataData%z(i1), DstIceFloe_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcModuleMapTypeData%ED_L_2_TStC_P_T)) then - LB(1:1) = lbound(SrcModuleMapTypeData%ED_L_2_TStC_P_T) - UB(1:1) = ubound(SrcModuleMapTypeData%ED_L_2_TStC_P_T) - if (.not. allocated(DstModuleMapTypeData%ED_L_2_TStC_P_T)) then - allocate(DstModuleMapTypeData%ED_L_2_TStC_P_T(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcIceFloe_DataData%OtherSt)) then + LB(1:1) = lbound(SrcIceFloe_DataData%OtherSt) + UB(1:1) = ubound(SrcIceFloe_DataData%OtherSt) + if (.not. allocated(DstIceFloe_DataData%OtherSt)) then + allocate(DstIceFloe_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%ED_L_2_TStC_P_T.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_L_2_TStC_P_T(i1), DstModuleMapTypeData%ED_L_2_TStC_P_T(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceFloe_CopyOtherState(SrcIceFloe_DataData%OtherSt(i1), DstIceFloe_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcModuleMapTypeData%TStC_P_2_ED_P_T)) then - LB(1:1) = lbound(SrcModuleMapTypeData%TStC_P_2_ED_P_T) - UB(1:1) = ubound(SrcModuleMapTypeData%TStC_P_2_ED_P_T) - if (.not. allocated(DstModuleMapTypeData%TStC_P_2_ED_P_T)) then - allocate(DstModuleMapTypeData%TStC_P_2_ED_P_T(LB(1):UB(1)), stat=ErrStat2) + call IceFloe_CopyParam(SrcIceFloe_DataData%p, DstIceFloe_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceFloe_CopyOutput(SrcIceFloe_DataData%y, DstIceFloe_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call IceFloe_CopyMisc(SrcIceFloe_DataData%m, DstIceFloe_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcIceFloe_DataData%Input)) then + LB(1:1) = lbound(SrcIceFloe_DataData%Input) + UB(1:1) = ubound(SrcIceFloe_DataData%Input) + if (.not. allocated(DstIceFloe_DataData%Input)) then + allocate(DstIceFloe_DataData%Input(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%TStC_P_2_ED_P_T.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%TStC_P_2_ED_P_T(i1), DstModuleMapTypeData%TStC_P_2_ED_P_T(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceFloe_CopyInput(SrcIceFloe_DataData%Input(i1), DstIceFloe_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcModuleMapTypeData%ED_L_2_BStC_P_B)) then - LB(1:2) = lbound(SrcModuleMapTypeData%ED_L_2_BStC_P_B) - UB(1:2) = ubound(SrcModuleMapTypeData%ED_L_2_BStC_P_B) - if (.not. allocated(DstModuleMapTypeData%ED_L_2_BStC_P_B)) then - allocate(DstModuleMapTypeData%ED_L_2_BStC_P_B(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%ED_L_2_BStC_P_B.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_L_2_BStC_P_B(i1,i2), DstModuleMapTypeData%ED_L_2_BStC_P_B(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do - end if - if (allocated(SrcModuleMapTypeData%BStC_P_2_ED_P_B)) then - LB(1:2) = lbound(SrcModuleMapTypeData%BStC_P_2_ED_P_B) - UB(1:2) = ubound(SrcModuleMapTypeData%BStC_P_2_ED_P_B) - if (.not. allocated(DstModuleMapTypeData%BStC_P_2_ED_P_B)) then - allocate(DstModuleMapTypeData%BStC_P_2_ED_P_B(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcIceFloe_DataData%InputTimes)) then + LB(1:1) = lbound(SrcIceFloe_DataData%InputTimes) + UB(1:1) = ubound(SrcIceFloe_DataData%InputTimes) + if (.not. allocated(DstIceFloe_DataData%InputTimes)) then + allocate(DstIceFloe_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%BStC_P_2_ED_P_B.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstIceFloe_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%BStC_P_2_ED_P_B(i1,i2), DstModuleMapTypeData%BStC_P_2_ED_P_B(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstIceFloe_DataData%InputTimes = SrcIceFloe_DataData%InputTimes end if - if (allocated(SrcModuleMapTypeData%BD_L_2_BStC_P_B)) then - LB(1:2) = lbound(SrcModuleMapTypeData%BD_L_2_BStC_P_B) - UB(1:2) = ubound(SrcModuleMapTypeData%BD_L_2_BStC_P_B) - if (.not. allocated(DstModuleMapTypeData%BD_L_2_BStC_P_B)) then - allocate(DstModuleMapTypeData%BD_L_2_BStC_P_B(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%BD_L_2_BStC_P_B.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%BD_L_2_BStC_P_B(i1,i2), DstModuleMapTypeData%BD_L_2_BStC_P_B(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do +end subroutine + +subroutine FAST_DestroyIceFloe_Data(IceFloe_DataData, ErrStat, ErrMsg) + type(IceFloe_Data), intent(inout) :: IceFloe_DataData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_DestroyIceFloe_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(IceFloe_DataData%x)) then + LB(1:1) = lbound(IceFloe_DataData%x) + UB(1:1) = ubound(IceFloe_DataData%x) + do i1 = LB(1), UB(1) + call IceFloe_DestroyContState(IceFloe_DataData%x(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(IceFloe_DataData%x) end if - if (allocated(SrcModuleMapTypeData%BStC_P_2_BD_P_B)) then - LB(1:2) = lbound(SrcModuleMapTypeData%BStC_P_2_BD_P_B) - UB(1:2) = ubound(SrcModuleMapTypeData%BStC_P_2_BD_P_B) - if (.not. allocated(DstModuleMapTypeData%BStC_P_2_BD_P_B)) then - allocate(DstModuleMapTypeData%BStC_P_2_BD_P_B(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%BStC_P_2_BD_P_B.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%BStC_P_2_BD_P_B(i1,i2), DstModuleMapTypeData%BStC_P_2_BD_P_B(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + if (allocated(IceFloe_DataData%xd)) then + LB(1:1) = lbound(IceFloe_DataData%xd) + UB(1:1) = ubound(IceFloe_DataData%xd) + do i1 = LB(1), UB(1) + call IceFloe_DestroyDiscState(IceFloe_DataData%xd(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(IceFloe_DataData%xd) end if - if (allocated(SrcModuleMapTypeData%SStC_P_P_2_SubStructure)) then - LB(1:1) = lbound(SrcModuleMapTypeData%SStC_P_P_2_SubStructure) - UB(1:1) = ubound(SrcModuleMapTypeData%SStC_P_P_2_SubStructure) - if (.not. allocated(DstModuleMapTypeData%SStC_P_P_2_SubStructure)) then - allocate(DstModuleMapTypeData%SStC_P_P_2_SubStructure(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%SStC_P_P_2_SubStructure.', ErrStat, ErrMsg, RoutineName) - return - end if - end if + if (allocated(IceFloe_DataData%z)) then + LB(1:1) = lbound(IceFloe_DataData%z) + UB(1:1) = ubound(IceFloe_DataData%z) do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SStC_P_P_2_SubStructure(i1), DstModuleMapTypeData%SStC_P_P_2_SubStructure(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceFloe_DestroyConstrState(IceFloe_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return end do + deallocate(IceFloe_DataData%z) end if - if (allocated(SrcModuleMapTypeData%SubStructure_2_SStC_P_P)) then - LB(1:1) = lbound(SrcModuleMapTypeData%SubStructure_2_SStC_P_P) - UB(1:1) = ubound(SrcModuleMapTypeData%SubStructure_2_SStC_P_P) - if (.not. allocated(DstModuleMapTypeData%SubStructure_2_SStC_P_P)) then - allocate(DstModuleMapTypeData%SubStructure_2_SStC_P_P(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%SubStructure_2_SStC_P_P.', ErrStat, ErrMsg, RoutineName) - return - end if - end if + if (allocated(IceFloe_DataData%OtherSt)) then + LB(1:1) = lbound(IceFloe_DataData%OtherSt) + UB(1:1) = ubound(IceFloe_DataData%OtherSt) do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SubStructure_2_SStC_P_P(i1), DstModuleMapTypeData%SubStructure_2_SStC_P_P(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceFloe_DestroyOtherState(IceFloe_DataData%OtherSt(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return end do + deallocate(IceFloe_DataData%OtherSt) end if - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_SrvD_P_P, DstModuleMapTypeData%ED_P_2_SrvD_P_P, CtrlCode, ErrStat2, ErrMsg2) + call IceFloe_DestroyParam(IceFloe_DataData%p, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%BDED_L_2_AD_L_B)) then - LB(1:1) = lbound(SrcModuleMapTypeData%BDED_L_2_AD_L_B) - UB(1:1) = ubound(SrcModuleMapTypeData%BDED_L_2_AD_L_B) - if (.not. allocated(DstModuleMapTypeData%BDED_L_2_AD_L_B)) then - allocate(DstModuleMapTypeData%BDED_L_2_AD_L_B(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%BDED_L_2_AD_L_B.', ErrStat, ErrMsg, RoutineName) - return - end if - end if + call IceFloe_DestroyOutput(IceFloe_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call IceFloe_DestroyMisc(IceFloe_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(IceFloe_DataData%Input)) then + LB(1:1) = lbound(IceFloe_DataData%Input) + UB(1:1) = ubound(IceFloe_DataData%Input) do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%BDED_L_2_AD_L_B(i1), DstModuleMapTypeData%BDED_L_2_AD_L_B(i1), CtrlCode, ErrStat2, ErrMsg2) + call IceFloe_DestroyInput(IceFloe_DataData%Input(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return end do + deallocate(IceFloe_DataData%Input) end if - if (allocated(SrcModuleMapTypeData%AD_L_2_BDED_B)) then - LB(1:1) = lbound(SrcModuleMapTypeData%AD_L_2_BDED_B) - UB(1:1) = ubound(SrcModuleMapTypeData%AD_L_2_BDED_B) - if (.not. allocated(DstModuleMapTypeData%AD_L_2_BDED_B)) then - allocate(DstModuleMapTypeData%AD_L_2_BDED_B(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%AD_L_2_BDED_B.', ErrStat, ErrMsg, RoutineName) - return - end if - end if + if (allocated(IceFloe_DataData%InputTimes)) then + deallocate(IceFloe_DataData%InputTimes) + end if +end subroutine + +subroutine FAST_PackIceFloe_Data(RF, Indata) + type(RegFile), intent(inout) :: RF + type(IceFloe_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackIceFloe_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%AD_L_2_BDED_B(i1), DstModuleMapTypeData%AD_L_2_BDED_B(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_PackContState(RF, InData%x(i1)) end do end if - if (allocated(SrcModuleMapTypeData%BD_L_2_BD_L)) then - LB(1:1) = lbound(SrcModuleMapTypeData%BD_L_2_BD_L) - UB(1:1) = ubound(SrcModuleMapTypeData%BD_L_2_BD_L) - if (.not. allocated(DstModuleMapTypeData%BD_L_2_BD_L)) then - allocate(DstModuleMapTypeData%BD_L_2_BD_L(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%BD_L_2_BD_L.', ErrStat, ErrMsg, RoutineName) - return - end if - end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%BD_L_2_BD_L(i1), DstModuleMapTypeData%BD_L_2_BD_L(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_PackDiscState(RF, InData%xd(i1)) end do end if - if (allocated(SrcModuleMapTypeData%SED_P_2_AD_L_B)) then - LB(1:1) = lbound(SrcModuleMapTypeData%SED_P_2_AD_L_B) - UB(1:1) = ubound(SrcModuleMapTypeData%SED_P_2_AD_L_B) - if (.not. allocated(DstModuleMapTypeData%SED_P_2_AD_L_B)) then - allocate(DstModuleMapTypeData%SED_P_2_AD_L_B(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%SED_P_2_AD_L_B.', ErrStat, ErrMsg, RoutineName) - return - end if - end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SED_P_2_AD_L_B(i1), DstModuleMapTypeData%SED_P_2_AD_L_B(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_PackConstrState(RF, InData%z(i1)) end do end if - if (allocated(SrcModuleMapTypeData%SED_P_2_AD_P_R)) then - LB(1:1) = lbound(SrcModuleMapTypeData%SED_P_2_AD_P_R) - UB(1:1) = ubound(SrcModuleMapTypeData%SED_P_2_AD_P_R) - if (.not. allocated(DstModuleMapTypeData%SED_P_2_AD_P_R)) then - allocate(DstModuleMapTypeData%SED_P_2_AD_P_R(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%SED_P_2_AD_P_R.', ErrStat, ErrMsg, RoutineName) - return - end if - end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SED_P_2_AD_P_R(i1), DstModuleMapTypeData%SED_P_2_AD_P_R(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_PackOtherState(RF, InData%OtherSt(i1)) end do end if - if (allocated(SrcModuleMapTypeData%AD_L_2_SED_P)) then - LB(1:1) = lbound(SrcModuleMapTypeData%AD_L_2_SED_P) - UB(1:1) = ubound(SrcModuleMapTypeData%AD_L_2_SED_P) - if (.not. allocated(DstModuleMapTypeData%AD_L_2_SED_P)) then - allocate(DstModuleMapTypeData%AD_L_2_SED_P(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%AD_L_2_SED_P.', ErrStat, ErrMsg, RoutineName) - return - end if - end if + call IceFloe_PackParam(RF, InData%p) + call IceFloe_PackOutput(RF, InData%y) + call IceFloe_PackMisc(RF, InData%m) + call RegPack(RF, allocated(InData%Input)) + if (allocated(InData%Input)) then + call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) + LB(1:1) = lbound(InData%Input) + UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%AD_L_2_SED_P(i1), DstModuleMapTypeData%AD_L_2_SED_P(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_PackInput(RF, InData%Input(i1)) end do end if - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_AD_P_N, DstModuleMapTypeData%ED_P_2_AD_P_N, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%AD_P_2_ED_P_N, DstModuleMapTypeData%AD_P_2_ED_P_N, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_AD_P_TF, DstModuleMapTypeData%ED_P_2_AD_P_TF, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%AD_P_2_ED_P_TF, DstModuleMapTypeData%AD_P_2_ED_P_TF, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_L_2_AD_L_T, DstModuleMapTypeData%ED_L_2_AD_L_T, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%AD_L_2_ED_P_T, DstModuleMapTypeData%AD_L_2_ED_P_T, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%ED_P_2_AD_P_R)) then - LB(1:1) = lbound(SrcModuleMapTypeData%ED_P_2_AD_P_R) - UB(1:1) = ubound(SrcModuleMapTypeData%ED_P_2_AD_P_R) - if (.not. allocated(DstModuleMapTypeData%ED_P_2_AD_P_R)) then - allocate(DstModuleMapTypeData%ED_P_2_AD_P_R(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%ED_P_2_AD_P_R.', ErrStat, ErrMsg, RoutineName) - return - end if + call RegPackAlloc(RF, InData%InputTimes) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_UnPackIceFloe_Data(RF, OutData) + type(RegFile), intent(inout) :: RF + type(IceFloe_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackIceFloe_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%x)) deallocate(OutData%x) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%x(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_AD_P_R(i1), DstModuleMapTypeData%ED_P_2_AD_P_R(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_UnpackContState(RF, OutData%x(i1)) ! x end do end if - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_AD_P_H, DstModuleMapTypeData%ED_P_2_AD_P_H, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ADsk_P_2_ED_P_H, DstModuleMapTypeData%ADsk_P_2_ED_P_H, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_ADsk_P_H, DstModuleMapTypeData%ED_P_2_ADsk_P_H, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SED_P_2_AD_P_N, DstModuleMapTypeData%SED_P_2_AD_P_N, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SED_L_2_AD_L_T, DstModuleMapTypeData%SED_L_2_AD_L_T, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SED_P_2_AD_P_H, DstModuleMapTypeData%SED_P_2_AD_P_H, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ADsk_P_2_SED_P_H, DstModuleMapTypeData%ADsk_P_2_SED_P_H, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SED_P_2_ADsk_P_H, DstModuleMapTypeData%SED_P_2_ADsk_P_H, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%AD_P_2_ED_P_H, DstModuleMapTypeData%AD_P_2_ED_P_H, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%BDED_L_2_ExtLd_P_B)) then - LB(1:1) = lbound(SrcModuleMapTypeData%BDED_L_2_ExtLd_P_B) - UB(1:1) = ubound(SrcModuleMapTypeData%BDED_L_2_ExtLd_P_B) - if (.not. allocated(DstModuleMapTypeData%BDED_L_2_ExtLd_P_B)) then - allocate(DstModuleMapTypeData%BDED_L_2_ExtLd_P_B(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%BDED_L_2_ExtLd_P_B.', ErrStat, ErrMsg, RoutineName) - return - end if + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%BDED_L_2_ExtLd_P_B(i1), DstModuleMapTypeData%BDED_L_2_ExtLd_P_B(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_UnpackDiscState(RF, OutData%xd(i1)) ! xd end do end if - if (allocated(SrcModuleMapTypeData%ExtLd_P_2_BDED_B)) then - LB(1:1) = lbound(SrcModuleMapTypeData%ExtLd_P_2_BDED_B) - UB(1:1) = ubound(SrcModuleMapTypeData%ExtLd_P_2_BDED_B) - if (.not. allocated(DstModuleMapTypeData%ExtLd_P_2_BDED_B)) then - allocate(DstModuleMapTypeData%ExtLd_P_2_BDED_B(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%ExtLd_P_2_BDED_B.', ErrStat, ErrMsg, RoutineName) - return - end if + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ExtLd_P_2_BDED_B(i1), DstModuleMapTypeData%ExtLd_P_2_BDED_B(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_UnpackConstrState(RF, OutData%z(i1)) ! z end do end if - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_L_2_ExtLd_P_T, DstModuleMapTypeData%ED_L_2_ExtLd_P_T, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ExtLd_P_2_ED_P_T, DstModuleMapTypeData%ExtLd_P_2_ED_P_T, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%ED_P_2_ExtLd_P_R)) then - LB(1:1) = lbound(SrcModuleMapTypeData%ED_P_2_ExtLd_P_R) - UB(1:1) = ubound(SrcModuleMapTypeData%ED_P_2_ExtLd_P_R) - if (.not. allocated(DstModuleMapTypeData%ED_P_2_ExtLd_P_R)) then - allocate(DstModuleMapTypeData%ED_P_2_ExtLd_P_R(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%ED_P_2_ExtLd_P_R.', ErrStat, ErrMsg, RoutineName) - return - end if + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_ExtLd_P_R(i1), DstModuleMapTypeData%ED_P_2_ExtLd_P_R(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%ED_P_2_ExtLd_P_H, DstModuleMapTypeData%ED_P_2_ExtLd_P_H, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%AD_L_2_ExtLd_B)) then - LB(1:1) = lbound(SrcModuleMapTypeData%AD_L_2_ExtLd_B) - UB(1:1) = ubound(SrcModuleMapTypeData%AD_L_2_ExtLd_B) - if (.not. allocated(DstModuleMapTypeData%AD_L_2_ExtLd_B)) then - allocate(DstModuleMapTypeData%AD_L_2_ExtLd_B(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%AD_L_2_ExtLd_B.', ErrStat, ErrMsg, RoutineName) - return - end if + call IceFloe_UnpackParam(RF, OutData%p) ! p + call IceFloe_UnpackOutput(RF, OutData%y) ! y + call IceFloe_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Input(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + return end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%AD_L_2_ExtLd_B(i1), DstModuleMapTypeData%AD_L_2_ExtLd_B(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + call IceFloe_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%AD_L_2_ExtLd_T, DstModuleMapTypeData%AD_L_2_ExtLd_T, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%IceF_P_2_SD_P, DstModuleMapTypeData%IceF_P_2_SD_P, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SDy3_P_2_IceF_P, DstModuleMapTypeData%SDy3_P_2_IceF_P, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%IceD_P_2_SD_P)) then - LB(1:1) = lbound(SrcModuleMapTypeData%IceD_P_2_SD_P) - UB(1:1) = ubound(SrcModuleMapTypeData%IceD_P_2_SD_P) - if (.not. allocated(DstModuleMapTypeData%IceD_P_2_SD_P)) then - allocate(DstModuleMapTypeData%IceD_P_2_SD_P(LB(1):UB(1)), stat=ErrStat2) + call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_CopyMAP_Data(SrcMAP_DataData, DstMAP_DataData, CtrlCode, ErrStat, ErrMsg) + type(MAP_Data), intent(inout) :: SrcMAP_DataData + type(MAP_Data), intent(inout) :: DstMAP_DataData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_CopyMAP_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcMAP_DataData%x)) then + LB(1:1) = lbound(SrcMAP_DataData%x) + UB(1:1) = ubound(SrcMAP_DataData%x) + if (.not. allocated(DstMAP_DataData%x)) then + allocate(DstMAP_DataData%x(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%IceD_P_2_SD_P.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%x.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%IceD_P_2_SD_P(i1), DstModuleMapTypeData%IceD_P_2_SD_P(i1), CtrlCode, ErrStat2, ErrMsg2) + call MAP_CopyContState(SrcMAP_DataData%x(i1), DstMAP_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcModuleMapTypeData%SDy3_P_2_IceD_P)) then - LB(1:1) = lbound(SrcModuleMapTypeData%SDy3_P_2_IceD_P) - UB(1:1) = ubound(SrcModuleMapTypeData%SDy3_P_2_IceD_P) - if (.not. allocated(DstModuleMapTypeData%SDy3_P_2_IceD_P)) then - allocate(DstModuleMapTypeData%SDy3_P_2_IceD_P(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMAP_DataData%xd)) then + LB(1:1) = lbound(SrcMAP_DataData%xd) + UB(1:1) = ubound(SrcMAP_DataData%xd) + if (.not. allocated(DstMAP_DataData%xd)) then + allocate(DstMAP_DataData%xd(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%SDy3_P_2_IceD_P.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%xd.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call NWTC_Library_CopyMeshMapType(SrcModuleMapTypeData%SDy3_P_2_IceD_P(i1), DstModuleMapTypeData%SDy3_P_2_IceD_P(i1), CtrlCode, ErrStat2, ErrMsg2) + call MAP_CopyDiscState(SrcMAP_DataData%xd(i1), DstMAP_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcModuleMapTypeData%Jacobian_Opt1)) then - LB(1:2) = lbound(SrcModuleMapTypeData%Jacobian_Opt1) - UB(1:2) = ubound(SrcModuleMapTypeData%Jacobian_Opt1) - if (.not. allocated(DstModuleMapTypeData%Jacobian_Opt1)) then - allocate(DstModuleMapTypeData%Jacobian_Opt1(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%Jacobian_Opt1.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModuleMapTypeData%Jacobian_Opt1 = SrcModuleMapTypeData%Jacobian_Opt1 - end if - if (allocated(SrcModuleMapTypeData%Jacobian_pivot)) then - LB(1:1) = lbound(SrcModuleMapTypeData%Jacobian_pivot) - UB(1:1) = ubound(SrcModuleMapTypeData%Jacobian_pivot) - if (.not. allocated(DstModuleMapTypeData%Jacobian_pivot)) then - allocate(DstModuleMapTypeData%Jacobian_pivot(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%Jacobian_pivot.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModuleMapTypeData%Jacobian_pivot = SrcModuleMapTypeData%Jacobian_pivot - end if - if (allocated(SrcModuleMapTypeData%Jac_u_indx)) then - LB(1:2) = lbound(SrcModuleMapTypeData%Jac_u_indx) - UB(1:2) = ubound(SrcModuleMapTypeData%Jac_u_indx) - if (.not. allocated(DstModuleMapTypeData%Jac_u_indx)) then - allocate(DstModuleMapTypeData%Jac_u_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%Jac_u_indx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstModuleMapTypeData%Jac_u_indx = SrcModuleMapTypeData%Jac_u_indx - end if - call MeshCopy(SrcModuleMapTypeData%u_ED_NacelleLoads, DstModuleMapTypeData%u_ED_NacelleLoads, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%SubstructureLoads_Tmp, DstModuleMapTypeData%SubstructureLoads_Tmp, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%SubstructureLoads_Tmp2, DstModuleMapTypeData%SubstructureLoads_Tmp2, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%PlatformLoads_Tmp, DstModuleMapTypeData%PlatformLoads_Tmp, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%PlatformLoads_Tmp2, DstModuleMapTypeData%PlatformLoads_Tmp2, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%SubstructureLoads_Tmp_Farm, DstModuleMapTypeData%SubstructureLoads_Tmp_Farm, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%u_ED_TowerPtloads, DstModuleMapTypeData%u_ED_TowerPtloads, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%u_ED_BladePtLoads)) then - LB(1:1) = lbound(SrcModuleMapTypeData%u_ED_BladePtLoads) - UB(1:1) = ubound(SrcModuleMapTypeData%u_ED_BladePtLoads) - if (.not. allocated(DstModuleMapTypeData%u_ED_BladePtLoads)) then - allocate(DstModuleMapTypeData%u_ED_BladePtLoads(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMAP_DataData%z)) then + LB(1:1) = lbound(SrcMAP_DataData%z) + UB(1:1) = ubound(SrcMAP_DataData%z) + if (.not. allocated(DstMAP_DataData%z)) then + allocate(DstMAP_DataData%z(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%u_ED_BladePtLoads.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%z.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcModuleMapTypeData%u_ED_BladePtLoads(i1), DstModuleMapTypeData%u_ED_BladePtLoads(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call MAP_CopyConstrState(SrcMAP_DataData%z(i1), DstMAP_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call MeshCopy(SrcModuleMapTypeData%u_SD_TPMesh, DstModuleMapTypeData%u_SD_TPMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call MAP_CopyOtherState(SrcMAP_DataData%OtherSt, DstMAP_DataData%OtherSt, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%u_HD_M_Mesh, DstModuleMapTypeData%u_HD_M_Mesh, CtrlCode, ErrStat2, ErrMsg2 ) + call MAP_CopyParam(SrcMAP_DataData%p, DstMAP_DataData%p, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%u_HD_W_Mesh, DstModuleMapTypeData%u_HD_W_Mesh, CtrlCode, ErrStat2, ErrMsg2 ) + call MAP_CopyOutput(SrcMAP_DataData%y, DstMAP_DataData%y, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%u_ED_HubPtLoad, DstModuleMapTypeData%u_ED_HubPtLoad, CtrlCode, ErrStat2, ErrMsg2 ) + call MAP_CopyMisc(SrcMAP_DataData%m, DstMAP_DataData%m, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%u_ED_HubPtLoad_2, DstModuleMapTypeData%u_ED_HubPtLoad_2, CtrlCode, ErrStat2, ErrMsg2 ) + call MAP_CopyOtherState(SrcMAP_DataData%OtherSt_old, DstMAP_DataData%OtherSt_old, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%u_BD_RootMotion)) then - LB(1:1) = lbound(SrcModuleMapTypeData%u_BD_RootMotion) - UB(1:1) = ubound(SrcModuleMapTypeData%u_BD_RootMotion) - if (.not. allocated(DstModuleMapTypeData%u_BD_RootMotion)) then - allocate(DstModuleMapTypeData%u_BD_RootMotion(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%u_BD_RootMotion.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcModuleMapTypeData%u_BD_RootMotion(i1), DstModuleMapTypeData%u_BD_RootMotion(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcModuleMapTypeData%y_BD_BldMotion_4Loads)) then - LB(1:1) = lbound(SrcModuleMapTypeData%y_BD_BldMotion_4Loads) - UB(1:1) = ubound(SrcModuleMapTypeData%y_BD_BldMotion_4Loads) - if (.not. allocated(DstModuleMapTypeData%y_BD_BldMotion_4Loads)) then - allocate(DstModuleMapTypeData%y_BD_BldMotion_4Loads(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%y_BD_BldMotion_4Loads.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call MeshCopy(SrcModuleMapTypeData%y_BD_BldMotion_4Loads(i1), DstModuleMapTypeData%y_BD_BldMotion_4Loads(i1), CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcModuleMapTypeData%u_BD_Distrload)) then - LB(1:1) = lbound(SrcModuleMapTypeData%u_BD_Distrload) - UB(1:1) = ubound(SrcModuleMapTypeData%u_BD_Distrload) - if (.not. allocated(DstModuleMapTypeData%u_BD_Distrload)) then - allocate(DstModuleMapTypeData%u_BD_Distrload(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMAP_DataData%Input)) then + LB(1:1) = lbound(SrcMAP_DataData%Input) + UB(1:1) = ubound(SrcMAP_DataData%Input) + if (.not. allocated(DstMAP_DataData%Input)) then + allocate(DstMAP_DataData%Input(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%u_BD_Distrload.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%Input.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcModuleMapTypeData%u_BD_Distrload(i1), DstModuleMapTypeData%u_BD_Distrload(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call MAP_CopyInput(SrcMAP_DataData%Input(i1), DstMAP_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call MeshCopy(SrcModuleMapTypeData%u_Orca_PtfmMesh, DstModuleMapTypeData%u_Orca_PtfmMesh, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%u_ExtPtfm_PtfmMesh, DstModuleMapTypeData%u_ExtPtfm_PtfmMesh, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call MeshCopy(SrcModuleMapTypeData%u_SED_HubPtLoad, DstModuleMapTypeData%u_SED_HubPtLoad, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcModuleMapTypeData%HubOrient)) then - LB(1:3) = lbound(SrcModuleMapTypeData%HubOrient) - UB(1:3) = ubound(SrcModuleMapTypeData%HubOrient) - if (.not. allocated(DstModuleMapTypeData%HubOrient)) then - allocate(DstModuleMapTypeData%HubOrient(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (allocated(SrcMAP_DataData%InputTimes)) then + LB(1:1) = lbound(SrcMAP_DataData%InputTimes) + UB(1:1) = ubound(SrcMAP_DataData%InputTimes) + if (.not. allocated(DstMAP_DataData%InputTimes)) then + allocate(DstMAP_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstModuleMapTypeData%HubOrient.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMAP_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstModuleMapTypeData%HubOrient = SrcModuleMapTypeData%HubOrient + DstMAP_DataData%InputTimes = SrcMAP_DataData%InputTimes end if end subroutine -subroutine FAST_DestroyModuleMapType(ModuleMapTypeData, ErrStat, ErrMsg) - type(FAST_ModuleMapType), intent(inout) :: ModuleMapTypeData +subroutine FAST_DestroyMAP_Data(MAP_DataData, ErrStat, ErrMsg) + type(MAP_Data), intent(inout) :: MAP_DataData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'FAST_DestroyModuleMapType' + character(*), parameter :: RoutineName = 'FAST_DestroyMAP_Data' ErrStat = ErrID_None ErrMsg = '' - if (allocated(ModuleMapTypeData%ED_P_2_BD_P)) then - LB(1:1) = lbound(ModuleMapTypeData%ED_P_2_BD_P) - UB(1:1) = ubound(ModuleMapTypeData%ED_P_2_BD_P) + if (allocated(MAP_DataData%x)) then + LB(1:1) = lbound(MAP_DataData%x) + UB(1:1) = ubound(MAP_DataData%x) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_BD_P(i1), ErrStat2, ErrMsg2) + call MAP_DestroyContState(MAP_DataData%x(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ModuleMapTypeData%ED_P_2_BD_P) + deallocate(MAP_DataData%x) end if - if (allocated(ModuleMapTypeData%BD_P_2_ED_P)) then - LB(1:1) = lbound(ModuleMapTypeData%BD_P_2_ED_P) - UB(1:1) = ubound(ModuleMapTypeData%BD_P_2_ED_P) + if (allocated(MAP_DataData%xd)) then + LB(1:1) = lbound(MAP_DataData%xd) + UB(1:1) = ubound(MAP_DataData%xd) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%BD_P_2_ED_P(i1), ErrStat2, ErrMsg2) + call MAP_DestroyDiscState(MAP_DataData%xd(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ModuleMapTypeData%BD_P_2_ED_P) + deallocate(MAP_DataData%xd) end if - if (allocated(ModuleMapTypeData%ED_P_2_BD_P_Hub)) then - LB(1:1) = lbound(ModuleMapTypeData%ED_P_2_BD_P_Hub) - UB(1:1) = ubound(ModuleMapTypeData%ED_P_2_BD_P_Hub) + if (allocated(MAP_DataData%z)) then + LB(1:1) = lbound(MAP_DataData%z) + UB(1:1) = ubound(MAP_DataData%z) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_BD_P_Hub(i1), ErrStat2, ErrMsg2) + call MAP_DestroyConstrState(MAP_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ModuleMapTypeData%ED_P_2_BD_P_Hub) + deallocate(MAP_DataData%z) end if - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_HD_PRP_P, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SubStructure_2_HD_W_P, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%HD_W_P_2_SubStructure, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SubStructure_2_HD_M_P, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%HD_M_P_2_SubStructure, ErrStat2, ErrMsg2) + call MAP_DestroyOtherState(MAP_DataData%OtherSt, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%Structure_2_Mooring, ErrStat2, ErrMsg2) + call MAP_DestroyParam(MAP_DataData%p, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%Mooring_2_Structure, ErrStat2, ErrMsg2) + call MAP_DestroyOutput(MAP_DataData%y, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_SD_TP, ErrStat2, ErrMsg2) + call MAP_DestroyMisc(MAP_DataData%m, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SD_TP_2_ED_P, ErrStat2, ErrMsg2) + call MAP_DestroyOtherState(MAP_DataData%OtherSt_old, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%ED_P_2_NStC_P_N)) then - LB(1:1) = lbound(ModuleMapTypeData%ED_P_2_NStC_P_N) - UB(1:1) = ubound(ModuleMapTypeData%ED_P_2_NStC_P_N) + if (allocated(MAP_DataData%Input)) then + LB(1:1) = lbound(MAP_DataData%Input) + UB(1:1) = ubound(MAP_DataData%Input) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_NStC_P_N(i1), ErrStat2, ErrMsg2) + call MAP_DestroyInput(MAP_DataData%Input(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ModuleMapTypeData%ED_P_2_NStC_P_N) + deallocate(MAP_DataData%Input) end if - if (allocated(ModuleMapTypeData%NStC_P_2_ED_P_N)) then - LB(1:1) = lbound(ModuleMapTypeData%NStC_P_2_ED_P_N) - UB(1:1) = ubound(ModuleMapTypeData%NStC_P_2_ED_P_N) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%NStC_P_2_ED_P_N(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ModuleMapTypeData%NStC_P_2_ED_P_N) + if (allocated(MAP_DataData%InputTimes)) then + deallocate(MAP_DataData%InputTimes) end if - if (allocated(ModuleMapTypeData%ED_L_2_TStC_P_T)) then - LB(1:1) = lbound(ModuleMapTypeData%ED_L_2_TStC_P_T) - UB(1:1) = ubound(ModuleMapTypeData%ED_L_2_TStC_P_T) +end subroutine + +subroutine FAST_PackMAP_Data(RF, Indata) + type(RegFile), intent(inout) :: RF + type(MAP_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackMAP_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_L_2_TStC_P_T(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MAP_PackContState(RF, InData%x(i1)) end do - deallocate(ModuleMapTypeData%ED_L_2_TStC_P_T) end if - if (allocated(ModuleMapTypeData%TStC_P_2_ED_P_T)) then - LB(1:1) = lbound(ModuleMapTypeData%TStC_P_2_ED_P_T) - UB(1:1) = ubound(ModuleMapTypeData%TStC_P_2_ED_P_T) + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%TStC_P_2_ED_P_T(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ModuleMapTypeData%TStC_P_2_ED_P_T) - end if - if (allocated(ModuleMapTypeData%ED_L_2_BStC_P_B)) then - LB(1:2) = lbound(ModuleMapTypeData%ED_L_2_BStC_P_B) - UB(1:2) = ubound(ModuleMapTypeData%ED_L_2_BStC_P_B) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_L_2_BStC_P_B(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(ModuleMapTypeData%ED_L_2_BStC_P_B) - end if - if (allocated(ModuleMapTypeData%BStC_P_2_ED_P_B)) then - LB(1:2) = lbound(ModuleMapTypeData%BStC_P_2_ED_P_B) - UB(1:2) = ubound(ModuleMapTypeData%BStC_P_2_ED_P_B) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%BStC_P_2_ED_P_B(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(ModuleMapTypeData%BStC_P_2_ED_P_B) - end if - if (allocated(ModuleMapTypeData%BD_L_2_BStC_P_B)) then - LB(1:2) = lbound(ModuleMapTypeData%BD_L_2_BStC_P_B) - UB(1:2) = ubound(ModuleMapTypeData%BD_L_2_BStC_P_B) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%BD_L_2_BStC_P_B(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do + call MAP_PackDiscState(RF, InData%xd(i1)) end do - deallocate(ModuleMapTypeData%BD_L_2_BStC_P_B) end if - if (allocated(ModuleMapTypeData%BStC_P_2_BD_P_B)) then - LB(1:2) = lbound(ModuleMapTypeData%BStC_P_2_BD_P_B) - UB(1:2) = ubound(ModuleMapTypeData%BStC_P_2_BD_P_B) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%BStC_P_2_BD_P_B(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) + do i1 = LB(1), UB(1) + call MAP_PackConstrState(RF, InData%z(i1)) end do - deallocate(ModuleMapTypeData%BStC_P_2_BD_P_B) end if - if (allocated(ModuleMapTypeData%SStC_P_P_2_SubStructure)) then - LB(1:1) = lbound(ModuleMapTypeData%SStC_P_P_2_SubStructure) - UB(1:1) = ubound(ModuleMapTypeData%SStC_P_P_2_SubStructure) + call MAP_PackOtherState(RF, InData%OtherSt) + call MAP_PackParam(RF, InData%p) + call MAP_PackOutput(RF, InData%y) + call MAP_PackMisc(RF, InData%m) + call MAP_PackOtherState(RF, InData%OtherSt_old) + call RegPack(RF, allocated(InData%Input)) + if (allocated(InData%Input)) then + call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) + LB(1:1) = lbound(InData%Input) + UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SStC_P_P_2_SubStructure(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MAP_PackInput(RF, InData%Input(i1)) end do - deallocate(ModuleMapTypeData%SStC_P_P_2_SubStructure) end if - if (allocated(ModuleMapTypeData%SubStructure_2_SStC_P_P)) then - LB(1:1) = lbound(ModuleMapTypeData%SubStructure_2_SStC_P_P) - UB(1:1) = ubound(ModuleMapTypeData%SubStructure_2_SStC_P_P) + call RegPackAlloc(RF, InData%InputTimes) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_UnPackMAP_Data(RF, OutData) + type(RegFile), intent(inout) :: RF + type(MAP_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackMAP_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%x)) deallocate(OutData%x) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%x(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SubStructure_2_SStC_P_P(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MAP_UnpackContState(RF, OutData%x(i1)) ! x end do - deallocate(ModuleMapTypeData%SubStructure_2_SStC_P_P) end if - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_SrvD_P_P, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%BDED_L_2_AD_L_B)) then - LB(1:1) = lbound(ModuleMapTypeData%BDED_L_2_AD_L_B) - UB(1:1) = ubound(ModuleMapTypeData%BDED_L_2_AD_L_B) + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%BDED_L_2_AD_L_B(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MAP_UnpackDiscState(RF, OutData%xd(i1)) ! xd end do - deallocate(ModuleMapTypeData%BDED_L_2_AD_L_B) end if - if (allocated(ModuleMapTypeData%AD_L_2_BDED_B)) then - LB(1:1) = lbound(ModuleMapTypeData%AD_L_2_BDED_B) - UB(1:1) = ubound(ModuleMapTypeData%AD_L_2_BDED_B) + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%AD_L_2_BDED_B(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MAP_UnpackConstrState(RF, OutData%z(i1)) ! z end do - deallocate(ModuleMapTypeData%AD_L_2_BDED_B) end if - if (allocated(ModuleMapTypeData%BD_L_2_BD_L)) then - LB(1:1) = lbound(ModuleMapTypeData%BD_L_2_BD_L) - UB(1:1) = ubound(ModuleMapTypeData%BD_L_2_BD_L) + call MAP_UnpackOtherState(RF, OutData%OtherSt) ! OtherSt + call MAP_UnpackParam(RF, OutData%p) ! p + call MAP_UnpackOutput(RF, OutData%y) ! y + call MAP_UnpackMisc(RF, OutData%m) ! m + call MAP_UnpackOtherState(RF, OutData%OtherSt_old) ! OtherSt_old + if (allocated(OutData%Input)) deallocate(OutData%Input) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Input(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%BD_L_2_BD_L(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MAP_UnpackInput(RF, OutData%Input(i1)) ! Input end do - deallocate(ModuleMapTypeData%BD_L_2_BD_L) end if - if (allocated(ModuleMapTypeData%SED_P_2_AD_L_B)) then - LB(1:1) = lbound(ModuleMapTypeData%SED_P_2_AD_L_B) - UB(1:1) = ubound(ModuleMapTypeData%SED_P_2_AD_L_B) + call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_CopyFEAMooring_Data(SrcFEAMooring_DataData, DstFEAMooring_DataData, CtrlCode, ErrStat, ErrMsg) + type(FEAMooring_Data), intent(inout) :: SrcFEAMooring_DataData + type(FEAMooring_Data), intent(inout) :: DstFEAMooring_DataData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_CopyFEAMooring_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcFEAMooring_DataData%x)) then + LB(1:1) = lbound(SrcFEAMooring_DataData%x) + UB(1:1) = ubound(SrcFEAMooring_DataData%x) + if (.not. allocated(DstFEAMooring_DataData%x)) then + allocate(DstFEAMooring_DataData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SED_P_2_AD_L_B(i1), ErrStat2, ErrMsg2) + call FEAM_CopyContState(SrcFEAMooring_DataData%x(i1), DstFEAMooring_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do - deallocate(ModuleMapTypeData%SED_P_2_AD_L_B) end if - if (allocated(ModuleMapTypeData%SED_P_2_AD_P_R)) then - LB(1:1) = lbound(ModuleMapTypeData%SED_P_2_AD_P_R) - UB(1:1) = ubound(ModuleMapTypeData%SED_P_2_AD_P_R) + if (allocated(SrcFEAMooring_DataData%xd)) then + LB(1:1) = lbound(SrcFEAMooring_DataData%xd) + UB(1:1) = ubound(SrcFEAMooring_DataData%xd) + if (.not. allocated(DstFEAMooring_DataData%xd)) then + allocate(DstFEAMooring_DataData%xd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SED_P_2_AD_P_R(i1), ErrStat2, ErrMsg2) + call FEAM_CopyDiscState(SrcFEAMooring_DataData%xd(i1), DstFEAMooring_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do - deallocate(ModuleMapTypeData%SED_P_2_AD_P_R) end if - if (allocated(ModuleMapTypeData%AD_L_2_SED_P)) then - LB(1:1) = lbound(ModuleMapTypeData%AD_L_2_SED_P) - UB(1:1) = ubound(ModuleMapTypeData%AD_L_2_SED_P) + if (allocated(SrcFEAMooring_DataData%z)) then + LB(1:1) = lbound(SrcFEAMooring_DataData%z) + UB(1:1) = ubound(SrcFEAMooring_DataData%z) + if (.not. allocated(DstFEAMooring_DataData%z)) then + allocate(DstFEAMooring_DataData%z(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%z.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%AD_L_2_SED_P(i1), ErrStat2, ErrMsg2) + call FEAM_CopyConstrState(SrcFEAMooring_DataData%z(i1), DstFEAMooring_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do - deallocate(ModuleMapTypeData%AD_L_2_SED_P) end if - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_AD_P_N, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%AD_P_2_ED_P_N, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_AD_P_TF, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%AD_P_2_ED_P_TF, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_L_2_AD_L_T, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%AD_L_2_ED_P_T, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%ED_P_2_AD_P_R)) then - LB(1:1) = lbound(ModuleMapTypeData%ED_P_2_AD_P_R) - UB(1:1) = ubound(ModuleMapTypeData%ED_P_2_AD_P_R) + if (allocated(SrcFEAMooring_DataData%OtherSt)) then + LB(1:1) = lbound(SrcFEAMooring_DataData%OtherSt) + UB(1:1) = ubound(SrcFEAMooring_DataData%OtherSt) + if (.not. allocated(DstFEAMooring_DataData%OtherSt)) then + allocate(DstFEAMooring_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_AD_P_R(i1), ErrStat2, ErrMsg2) + call FEAM_CopyOtherState(SrcFEAMooring_DataData%OtherSt(i1), DstFEAMooring_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do - deallocate(ModuleMapTypeData%ED_P_2_AD_P_R) end if - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_AD_P_H, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ADsk_P_2_ED_P_H, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_ADsk_P_H, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SED_P_2_AD_P_N, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SED_L_2_AD_L_T, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SED_P_2_AD_P_H, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ADsk_P_2_SED_P_H, ErrStat2, ErrMsg2) + call FEAM_CopyParam(SrcFEAMooring_DataData%p, DstFEAMooring_DataData%p, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SED_P_2_ADsk_P_H, ErrStat2, ErrMsg2) + if (ErrStat >= AbortErrLev) return + call FEAM_CopyOutput(SrcFEAMooring_DataData%y, DstFEAMooring_DataData%y, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%AD_P_2_ED_P_H, ErrStat2, ErrMsg2) + if (ErrStat >= AbortErrLev) return + call FEAM_CopyMisc(SrcFEAMooring_DataData%m, DstFEAMooring_DataData%m, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%BDED_L_2_ExtLd_P_B)) then - LB(1:1) = lbound(ModuleMapTypeData%BDED_L_2_ExtLd_P_B) - UB(1:1) = ubound(ModuleMapTypeData%BDED_L_2_ExtLd_P_B) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%BDED_L_2_ExtLd_P_B(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ModuleMapTypeData%BDED_L_2_ExtLd_P_B) - end if - if (allocated(ModuleMapTypeData%ExtLd_P_2_BDED_B)) then - LB(1:1) = lbound(ModuleMapTypeData%ExtLd_P_2_BDED_B) - UB(1:1) = ubound(ModuleMapTypeData%ExtLd_P_2_BDED_B) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcFEAMooring_DataData%Input)) then + LB(1:1) = lbound(SrcFEAMooring_DataData%Input) + UB(1:1) = ubound(SrcFEAMooring_DataData%Input) + if (.not. allocated(DstFEAMooring_DataData%Input)) then + allocate(DstFEAMooring_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%Input.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ExtLd_P_2_BDED_B(i1), ErrStat2, ErrMsg2) + call FEAM_CopyInput(SrcFEAMooring_DataData%Input(i1), DstFEAMooring_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do - deallocate(ModuleMapTypeData%ExtLd_P_2_BDED_B) end if - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_L_2_ExtLd_P_T, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ExtLd_P_2_ED_P_T, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%ED_P_2_ExtLd_P_R)) then - LB(1:1) = lbound(ModuleMapTypeData%ED_P_2_ExtLd_P_R) - UB(1:1) = ubound(ModuleMapTypeData%ED_P_2_ExtLd_P_R) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_ExtLd_P_R(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ModuleMapTypeData%ED_P_2_ExtLd_P_R) + if (allocated(SrcFEAMooring_DataData%InputTimes)) then + LB(1:1) = lbound(SrcFEAMooring_DataData%InputTimes) + UB(1:1) = ubound(SrcFEAMooring_DataData%InputTimes) + if (.not. allocated(DstFEAMooring_DataData%InputTimes)) then + allocate(DstFEAMooring_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstFEAMooring_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstFEAMooring_DataData%InputTimes = SrcFEAMooring_DataData%InputTimes end if - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%ED_P_2_ExtLd_P_H, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%AD_L_2_ExtLd_B)) then - LB(1:1) = lbound(ModuleMapTypeData%AD_L_2_ExtLd_B) - UB(1:1) = ubound(ModuleMapTypeData%AD_L_2_ExtLd_B) +end subroutine + +subroutine FAST_DestroyFEAMooring_Data(FEAMooring_DataData, ErrStat, ErrMsg) + type(FEAMooring_Data), intent(inout) :: FEAMooring_DataData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_DestroyFEAMooring_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(FEAMooring_DataData%x)) then + LB(1:1) = lbound(FEAMooring_DataData%x) + UB(1:1) = ubound(FEAMooring_DataData%x) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%AD_L_2_ExtLd_B(i1), ErrStat2, ErrMsg2) + call FEAM_DestroyContState(FEAMooring_DataData%x(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ModuleMapTypeData%AD_L_2_ExtLd_B) + deallocate(FEAMooring_DataData%x) end if - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%AD_L_2_ExtLd_T, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%IceF_P_2_SD_P, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SDy3_P_2_IceF_P, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%IceD_P_2_SD_P)) then - LB(1:1) = lbound(ModuleMapTypeData%IceD_P_2_SD_P) - UB(1:1) = ubound(ModuleMapTypeData%IceD_P_2_SD_P) + if (allocated(FEAMooring_DataData%xd)) then + LB(1:1) = lbound(FEAMooring_DataData%xd) + UB(1:1) = ubound(FEAMooring_DataData%xd) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%IceD_P_2_SD_P(i1), ErrStat2, ErrMsg2) + call FEAM_DestroyDiscState(FEAMooring_DataData%xd(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ModuleMapTypeData%IceD_P_2_SD_P) + deallocate(FEAMooring_DataData%xd) end if - if (allocated(ModuleMapTypeData%SDy3_P_2_IceD_P)) then - LB(1:1) = lbound(ModuleMapTypeData%SDy3_P_2_IceD_P) - UB(1:1) = ubound(ModuleMapTypeData%SDy3_P_2_IceD_P) + if (allocated(FEAMooring_DataData%z)) then + LB(1:1) = lbound(FEAMooring_DataData%z) + UB(1:1) = ubound(FEAMooring_DataData%z) do i1 = LB(1), UB(1) - call NWTC_Library_DestroyMeshMapType(ModuleMapTypeData%SDy3_P_2_IceD_P(i1), ErrStat2, ErrMsg2) + call FEAM_DestroyConstrState(FEAMooring_DataData%z(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ModuleMapTypeData%SDy3_P_2_IceD_P) + deallocate(FEAMooring_DataData%z) end if - if (allocated(ModuleMapTypeData%Jacobian_Opt1)) then - deallocate(ModuleMapTypeData%Jacobian_Opt1) - end if - if (allocated(ModuleMapTypeData%Jacobian_pivot)) then - deallocate(ModuleMapTypeData%Jacobian_pivot) - end if - if (allocated(ModuleMapTypeData%Jac_u_indx)) then - deallocate(ModuleMapTypeData%Jac_u_indx) - end if - call MeshDestroy( ModuleMapTypeData%u_ED_NacelleLoads, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%SubstructureLoads_Tmp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%SubstructureLoads_Tmp2, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%PlatformLoads_Tmp, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%PlatformLoads_Tmp2, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%SubstructureLoads_Tmp_Farm, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%u_ED_TowerPtloads, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%u_ED_BladePtLoads)) then - LB(1:1) = lbound(ModuleMapTypeData%u_ED_BladePtLoads) - UB(1:1) = ubound(ModuleMapTypeData%u_ED_BladePtLoads) + if (allocated(FEAMooring_DataData%OtherSt)) then + LB(1:1) = lbound(FEAMooring_DataData%OtherSt) + UB(1:1) = ubound(FEAMooring_DataData%OtherSt) do i1 = LB(1), UB(1) - call MeshDestroy( ModuleMapTypeData%u_ED_BladePtLoads(i1), ErrStat2, ErrMsg2) + call FEAM_DestroyOtherState(FEAMooring_DataData%OtherSt(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ModuleMapTypeData%u_ED_BladePtLoads) + deallocate(FEAMooring_DataData%OtherSt) end if - call MeshDestroy( ModuleMapTypeData%u_SD_TPMesh, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%u_HD_M_Mesh, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%u_HD_W_Mesh, ErrStat2, ErrMsg2) + call FEAM_DestroyParam(FEAMooring_DataData%p, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%u_ED_HubPtLoad, ErrStat2, ErrMsg2) + call FEAM_DestroyOutput(FEAMooring_DataData%y, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%u_ED_HubPtLoad_2, ErrStat2, ErrMsg2) + call FEAM_DestroyMisc(FEAMooring_DataData%m, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%u_BD_RootMotion)) then - LB(1:1) = lbound(ModuleMapTypeData%u_BD_RootMotion) - UB(1:1) = ubound(ModuleMapTypeData%u_BD_RootMotion) - do i1 = LB(1), UB(1) - call MeshDestroy( ModuleMapTypeData%u_BD_RootMotion(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ModuleMapTypeData%u_BD_RootMotion) - end if - if (allocated(ModuleMapTypeData%y_BD_BldMotion_4Loads)) then - LB(1:1) = lbound(ModuleMapTypeData%y_BD_BldMotion_4Loads) - UB(1:1) = ubound(ModuleMapTypeData%y_BD_BldMotion_4Loads) - do i1 = LB(1), UB(1) - call MeshDestroy( ModuleMapTypeData%y_BD_BldMotion_4Loads(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ModuleMapTypeData%y_BD_BldMotion_4Loads) - end if - if (allocated(ModuleMapTypeData%u_BD_Distrload)) then - LB(1:1) = lbound(ModuleMapTypeData%u_BD_Distrload) - UB(1:1) = ubound(ModuleMapTypeData%u_BD_Distrload) + if (allocated(FEAMooring_DataData%Input)) then + LB(1:1) = lbound(FEAMooring_DataData%Input) + UB(1:1) = ubound(FEAMooring_DataData%Input) do i1 = LB(1), UB(1) - call MeshDestroy( ModuleMapTypeData%u_BD_Distrload(i1), ErrStat2, ErrMsg2) + call FEAM_DestroyInput(FEAMooring_DataData%Input(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ModuleMapTypeData%u_BD_Distrload) + deallocate(FEAMooring_DataData%Input) end if - call MeshDestroy( ModuleMapTypeData%u_Orca_PtfmMesh, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%u_ExtPtfm_PtfmMesh, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( ModuleMapTypeData%u_SED_HubPtLoad, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ModuleMapTypeData%HubOrient)) then - deallocate(ModuleMapTypeData%HubOrient) + if (allocated(FEAMooring_DataData%InputTimes)) then + deallocate(FEAMooring_DataData%InputTimes) end if end subroutine -subroutine FAST_PackModuleMapType(RF, Indata) +subroutine FAST_PackFEAMooring_Data(RF, Indata) type(RegFile), intent(inout) :: RF - type(FAST_ModuleMapType), intent(in) :: InData - character(*), parameter :: RoutineName = 'FAST_PackModuleMapType' - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + type(FEAMooring_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackFEAMooring_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, allocated(InData%ED_P_2_BD_P)) - if (allocated(InData%ED_P_2_BD_P)) then - call RegPackBounds(RF, 1, lbound(InData%ED_P_2_BD_P), ubound(InData%ED_P_2_BD_P)) - LB(1:1) = lbound(InData%ED_P_2_BD_P) - UB(1:1) = ubound(InData%ED_P_2_BD_P) + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_BD_P(i1)) + call FEAM_PackContState(RF, InData%x(i1)) end do end if - call RegPack(RF, allocated(InData%BD_P_2_ED_P)) - if (allocated(InData%BD_P_2_ED_P)) then - call RegPackBounds(RF, 1, lbound(InData%BD_P_2_ED_P), ubound(InData%BD_P_2_ED_P)) - LB(1:1) = lbound(InData%BD_P_2_ED_P) - UB(1:1) = ubound(InData%BD_P_2_ED_P) + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%BD_P_2_ED_P(i1)) + call FEAM_PackDiscState(RF, InData%xd(i1)) end do end if - call RegPack(RF, allocated(InData%ED_P_2_BD_P_Hub)) - if (allocated(InData%ED_P_2_BD_P_Hub)) then - call RegPackBounds(RF, 1, lbound(InData%ED_P_2_BD_P_Hub), ubound(InData%ED_P_2_BD_P_Hub)) - LB(1:1) = lbound(InData%ED_P_2_BD_P_Hub) - UB(1:1) = ubound(InData%ED_P_2_BD_P_Hub) + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_BD_P_Hub(i1)) + call FEAM_PackConstrState(RF, InData%z(i1)) end do end if - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_HD_PRP_P) - call NWTC_Library_PackMeshMapType(RF, InData%SubStructure_2_HD_W_P) - call NWTC_Library_PackMeshMapType(RF, InData%HD_W_P_2_SubStructure) - call NWTC_Library_PackMeshMapType(RF, InData%SubStructure_2_HD_M_P) - call NWTC_Library_PackMeshMapType(RF, InData%HD_M_P_2_SubStructure) - call NWTC_Library_PackMeshMapType(RF, InData%Structure_2_Mooring) - call NWTC_Library_PackMeshMapType(RF, InData%Mooring_2_Structure) - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_SD_TP) - call NWTC_Library_PackMeshMapType(RF, InData%SD_TP_2_ED_P) - call RegPack(RF, allocated(InData%ED_P_2_NStC_P_N)) - if (allocated(InData%ED_P_2_NStC_P_N)) then - call RegPackBounds(RF, 1, lbound(InData%ED_P_2_NStC_P_N), ubound(InData%ED_P_2_NStC_P_N)) - LB(1:1) = lbound(InData%ED_P_2_NStC_P_N) - UB(1:1) = ubound(InData%ED_P_2_NStC_P_N) + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_NStC_P_N(i1)) + call FEAM_PackOtherState(RF, InData%OtherSt(i1)) end do end if - call RegPack(RF, allocated(InData%NStC_P_2_ED_P_N)) - if (allocated(InData%NStC_P_2_ED_P_N)) then - call RegPackBounds(RF, 1, lbound(InData%NStC_P_2_ED_P_N), ubound(InData%NStC_P_2_ED_P_N)) - LB(1:1) = lbound(InData%NStC_P_2_ED_P_N) - UB(1:1) = ubound(InData%NStC_P_2_ED_P_N) + call FEAM_PackParam(RF, InData%p) + call FEAM_PackOutput(RF, InData%y) + call FEAM_PackMisc(RF, InData%m) + call RegPack(RF, allocated(InData%Input)) + if (allocated(InData%Input)) then + call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) + LB(1:1) = lbound(InData%Input) + UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%NStC_P_2_ED_P_N(i1)) + call FEAM_PackInput(RF, InData%Input(i1)) end do end if - call RegPack(RF, allocated(InData%ED_L_2_TStC_P_T)) - if (allocated(InData%ED_L_2_TStC_P_T)) then - call RegPackBounds(RF, 1, lbound(InData%ED_L_2_TStC_P_T), ubound(InData%ED_L_2_TStC_P_T)) - LB(1:1) = lbound(InData%ED_L_2_TStC_P_T) - UB(1:1) = ubound(InData%ED_L_2_TStC_P_T) + call RegPackAlloc(RF, InData%InputTimes) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_UnPackFEAMooring_Data(RF, OutData) + type(RegFile), intent(inout) :: RF + type(FEAMooring_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackFEAMooring_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%x)) deallocate(OutData%x) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%x(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%ED_L_2_TStC_P_T(i1)) + call FEAM_UnpackContState(RF, OutData%x(i1)) ! x end do end if - call RegPack(RF, allocated(InData%TStC_P_2_ED_P_T)) - if (allocated(InData%TStC_P_2_ED_P_T)) then - call RegPackBounds(RF, 1, lbound(InData%TStC_P_2_ED_P_T), ubound(InData%TStC_P_2_ED_P_T)) - LB(1:1) = lbound(InData%TStC_P_2_ED_P_T) - UB(1:1) = ubound(InData%TStC_P_2_ED_P_T) + if (allocated(OutData%xd)) deallocate(OutData%xd) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%xd(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%TStC_P_2_ED_P_T(i1)) - end do - end if - call RegPack(RF, allocated(InData%ED_L_2_BStC_P_B)) - if (allocated(InData%ED_L_2_BStC_P_B)) then - call RegPackBounds(RF, 2, lbound(InData%ED_L_2_BStC_P_B), ubound(InData%ED_L_2_BStC_P_B)) - LB(1:2) = lbound(InData%ED_L_2_BStC_P_B) - UB(1:2) = ubound(InData%ED_L_2_BStC_P_B) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%ED_L_2_BStC_P_B(i1,i2)) - end do + call FEAM_UnpackDiscState(RF, OutData%xd(i1)) ! xd end do end if - call RegPack(RF, allocated(InData%BStC_P_2_ED_P_B)) - if (allocated(InData%BStC_P_2_ED_P_B)) then - call RegPackBounds(RF, 2, lbound(InData%BStC_P_2_ED_P_B), ubound(InData%BStC_P_2_ED_P_B)) - LB(1:2) = lbound(InData%BStC_P_2_ED_P_B) - UB(1:2) = ubound(InData%BStC_P_2_ED_P_B) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%BStC_P_2_ED_P_B(i1,i2)) - end do + if (allocated(OutData%z)) deallocate(OutData%z) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%z(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call FEAM_UnpackConstrState(RF, OutData%z(i1)) ! z end do end if - call RegPack(RF, allocated(InData%BD_L_2_BStC_P_B)) - if (allocated(InData%BD_L_2_BStC_P_B)) then - call RegPackBounds(RF, 2, lbound(InData%BD_L_2_BStC_P_B), ubound(InData%BD_L_2_BStC_P_B)) - LB(1:2) = lbound(InData%BD_L_2_BStC_P_B) - UB(1:2) = ubound(InData%BD_L_2_BStC_P_B) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%BD_L_2_BStC_P_B(i1,i2)) - end do + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call FEAM_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - call RegPack(RF, allocated(InData%BStC_P_2_BD_P_B)) - if (allocated(InData%BStC_P_2_BD_P_B)) then - call RegPackBounds(RF, 2, lbound(InData%BStC_P_2_BD_P_B), ubound(InData%BStC_P_2_BD_P_B)) - LB(1:2) = lbound(InData%BStC_P_2_BD_P_B) - UB(1:2) = ubound(InData%BStC_P_2_BD_P_B) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%BStC_P_2_BD_P_B(i1,i2)) - end do + call FEAM_UnpackParam(RF, OutData%p) ! p + call FEAM_UnpackOutput(RF, OutData%y) ! y + call FEAM_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Input(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call FEAM_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if - call RegPack(RF, allocated(InData%SStC_P_P_2_SubStructure)) - if (allocated(InData%SStC_P_P_2_SubStructure)) then - call RegPackBounds(RF, 1, lbound(InData%SStC_P_P_2_SubStructure), ubound(InData%SStC_P_P_2_SubStructure)) - LB(1:1) = lbound(InData%SStC_P_P_2_SubStructure) - UB(1:1) = ubound(InData%SStC_P_P_2_SubStructure) + call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_CopyMoorDyn_Data(SrcMoorDyn_DataData, DstMoorDyn_DataData, CtrlCode, ErrStat, ErrMsg) + type(MoorDyn_Data), intent(inout) :: SrcMoorDyn_DataData + type(MoorDyn_Data), intent(inout) :: DstMoorDyn_DataData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_CopyMoorDyn_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcMoorDyn_DataData%x)) then + LB(1:1) = lbound(SrcMoorDyn_DataData%x) + UB(1:1) = ubound(SrcMoorDyn_DataData%x) + if (.not. allocated(DstMoorDyn_DataData%x)) then + allocate(DstMoorDyn_DataData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%SStC_P_P_2_SubStructure(i1)) + call MD_CopyContState(SrcMoorDyn_DataData%x(i1), DstMoorDyn_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - call RegPack(RF, allocated(InData%SubStructure_2_SStC_P_P)) - if (allocated(InData%SubStructure_2_SStC_P_P)) then - call RegPackBounds(RF, 1, lbound(InData%SubStructure_2_SStC_P_P), ubound(InData%SubStructure_2_SStC_P_P)) - LB(1:1) = lbound(InData%SubStructure_2_SStC_P_P) - UB(1:1) = ubound(InData%SubStructure_2_SStC_P_P) + if (allocated(SrcMoorDyn_DataData%xd)) then + LB(1:1) = lbound(SrcMoorDyn_DataData%xd) + UB(1:1) = ubound(SrcMoorDyn_DataData%xd) + if (.not. allocated(DstMoorDyn_DataData%xd)) then + allocate(DstMoorDyn_DataData%xd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%SubStructure_2_SStC_P_P(i1)) + call MD_CopyDiscState(SrcMoorDyn_DataData%xd(i1), DstMoorDyn_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_SrvD_P_P) - call RegPack(RF, allocated(InData%BDED_L_2_AD_L_B)) - if (allocated(InData%BDED_L_2_AD_L_B)) then - call RegPackBounds(RF, 1, lbound(InData%BDED_L_2_AD_L_B), ubound(InData%BDED_L_2_AD_L_B)) - LB(1:1) = lbound(InData%BDED_L_2_AD_L_B) - UB(1:1) = ubound(InData%BDED_L_2_AD_L_B) + if (allocated(SrcMoorDyn_DataData%z)) then + LB(1:1) = lbound(SrcMoorDyn_DataData%z) + UB(1:1) = ubound(SrcMoorDyn_DataData%z) + if (.not. allocated(DstMoorDyn_DataData%z)) then + allocate(DstMoorDyn_DataData%z(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%z.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%BDED_L_2_AD_L_B(i1)) + call MD_CopyConstrState(SrcMoorDyn_DataData%z(i1), DstMoorDyn_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - call RegPack(RF, allocated(InData%AD_L_2_BDED_B)) - if (allocated(InData%AD_L_2_BDED_B)) then - call RegPackBounds(RF, 1, lbound(InData%AD_L_2_BDED_B), ubound(InData%AD_L_2_BDED_B)) - LB(1:1) = lbound(InData%AD_L_2_BDED_B) - UB(1:1) = ubound(InData%AD_L_2_BDED_B) + if (allocated(SrcMoorDyn_DataData%OtherSt)) then + LB(1:1) = lbound(SrcMoorDyn_DataData%OtherSt) + UB(1:1) = ubound(SrcMoorDyn_DataData%OtherSt) + if (.not. allocated(DstMoorDyn_DataData%OtherSt)) then + allocate(DstMoorDyn_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%AD_L_2_BDED_B(i1)) + call MD_CopyOtherState(SrcMoorDyn_DataData%OtherSt(i1), DstMoorDyn_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - call RegPack(RF, allocated(InData%BD_L_2_BD_L)) - if (allocated(InData%BD_L_2_BD_L)) then - call RegPackBounds(RF, 1, lbound(InData%BD_L_2_BD_L), ubound(InData%BD_L_2_BD_L)) - LB(1:1) = lbound(InData%BD_L_2_BD_L) - UB(1:1) = ubound(InData%BD_L_2_BD_L) + call MD_CopyParam(SrcMoorDyn_DataData%p, DstMoorDyn_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MD_CopyOutput(SrcMoorDyn_DataData%y, DstMoorDyn_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MD_CopyMisc(SrcMoorDyn_DataData%m, DstMoorDyn_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcMoorDyn_DataData%Input)) then + LB(1:1) = lbound(SrcMoorDyn_DataData%Input) + UB(1:1) = ubound(SrcMoorDyn_DataData%Input) + if (.not. allocated(DstMoorDyn_DataData%Input)) then + allocate(DstMoorDyn_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%Input.', ErrStat, ErrMsg, RoutineName) + return + end if + end if do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%BD_L_2_BD_L(i1)) + call MD_CopyInput(SrcMoorDyn_DataData%Input(i1), DstMoorDyn_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - call RegPack(RF, allocated(InData%SED_P_2_AD_L_B)) - if (allocated(InData%SED_P_2_AD_L_B)) then - call RegPackBounds(RF, 1, lbound(InData%SED_P_2_AD_L_B), ubound(InData%SED_P_2_AD_L_B)) - LB(1:1) = lbound(InData%SED_P_2_AD_L_B) - UB(1:1) = ubound(InData%SED_P_2_AD_L_B) - do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%SED_P_2_AD_L_B(i1)) - end do + if (allocated(SrcMoorDyn_DataData%InputTimes)) then + LB(1:1) = lbound(SrcMoorDyn_DataData%InputTimes) + UB(1:1) = ubound(SrcMoorDyn_DataData%InputTimes) + if (.not. allocated(DstMoorDyn_DataData%InputTimes)) then + allocate(DstMoorDyn_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMoorDyn_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMoorDyn_DataData%InputTimes = SrcMoorDyn_DataData%InputTimes end if - call RegPack(RF, allocated(InData%SED_P_2_AD_P_R)) - if (allocated(InData%SED_P_2_AD_P_R)) then - call RegPackBounds(RF, 1, lbound(InData%SED_P_2_AD_P_R), ubound(InData%SED_P_2_AD_P_R)) - LB(1:1) = lbound(InData%SED_P_2_AD_P_R) - UB(1:1) = ubound(InData%SED_P_2_AD_P_R) +end subroutine + +subroutine FAST_DestroyMoorDyn_Data(MoorDyn_DataData, ErrStat, ErrMsg) + type(MoorDyn_Data), intent(inout) :: MoorDyn_DataData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_DestroyMoorDyn_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(MoorDyn_DataData%x)) then + LB(1:1) = lbound(MoorDyn_DataData%x) + UB(1:1) = ubound(MoorDyn_DataData%x) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%SED_P_2_AD_P_R(i1)) + call MD_DestroyContState(MoorDyn_DataData%x(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(MoorDyn_DataData%x) end if - call RegPack(RF, allocated(InData%AD_L_2_SED_P)) - if (allocated(InData%AD_L_2_SED_P)) then - call RegPackBounds(RF, 1, lbound(InData%AD_L_2_SED_P), ubound(InData%AD_L_2_SED_P)) - LB(1:1) = lbound(InData%AD_L_2_SED_P) - UB(1:1) = ubound(InData%AD_L_2_SED_P) + if (allocated(MoorDyn_DataData%xd)) then + LB(1:1) = lbound(MoorDyn_DataData%xd) + UB(1:1) = ubound(MoorDyn_DataData%xd) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%AD_L_2_SED_P(i1)) + call MD_DestroyDiscState(MoorDyn_DataData%xd(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(MoorDyn_DataData%xd) end if - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_AD_P_N) - call NWTC_Library_PackMeshMapType(RF, InData%AD_P_2_ED_P_N) - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_AD_P_TF) - call NWTC_Library_PackMeshMapType(RF, InData%AD_P_2_ED_P_TF) - call NWTC_Library_PackMeshMapType(RF, InData%ED_L_2_AD_L_T) - call NWTC_Library_PackMeshMapType(RF, InData%AD_L_2_ED_P_T) - call RegPack(RF, allocated(InData%ED_P_2_AD_P_R)) - if (allocated(InData%ED_P_2_AD_P_R)) then - call RegPackBounds(RF, 1, lbound(InData%ED_P_2_AD_P_R), ubound(InData%ED_P_2_AD_P_R)) - LB(1:1) = lbound(InData%ED_P_2_AD_P_R) - UB(1:1) = ubound(InData%ED_P_2_AD_P_R) + if (allocated(MoorDyn_DataData%z)) then + LB(1:1) = lbound(MoorDyn_DataData%z) + UB(1:1) = ubound(MoorDyn_DataData%z) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_AD_P_R(i1)) + call MD_DestroyConstrState(MoorDyn_DataData%z(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(MoorDyn_DataData%z) end if - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_AD_P_H) - call NWTC_Library_PackMeshMapType(RF, InData%ADsk_P_2_ED_P_H) - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_ADsk_P_H) - call NWTC_Library_PackMeshMapType(RF, InData%SED_P_2_AD_P_N) - call NWTC_Library_PackMeshMapType(RF, InData%SED_L_2_AD_L_T) - call NWTC_Library_PackMeshMapType(RF, InData%SED_P_2_AD_P_H) - call NWTC_Library_PackMeshMapType(RF, InData%ADsk_P_2_SED_P_H) - call NWTC_Library_PackMeshMapType(RF, InData%SED_P_2_ADsk_P_H) - call NWTC_Library_PackMeshMapType(RF, InData%AD_P_2_ED_P_H) - call RegPack(RF, allocated(InData%BDED_L_2_ExtLd_P_B)) - if (allocated(InData%BDED_L_2_ExtLd_P_B)) then - call RegPackBounds(RF, 1, lbound(InData%BDED_L_2_ExtLd_P_B), ubound(InData%BDED_L_2_ExtLd_P_B)) - LB(1:1) = lbound(InData%BDED_L_2_ExtLd_P_B) - UB(1:1) = ubound(InData%BDED_L_2_ExtLd_P_B) + if (allocated(MoorDyn_DataData%OtherSt)) then + LB(1:1) = lbound(MoorDyn_DataData%OtherSt) + UB(1:1) = ubound(MoorDyn_DataData%OtherSt) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%BDED_L_2_ExtLd_P_B(i1)) + call MD_DestroyOtherState(MoorDyn_DataData%OtherSt(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(MoorDyn_DataData%OtherSt) end if - call RegPack(RF, allocated(InData%ExtLd_P_2_BDED_B)) - if (allocated(InData%ExtLd_P_2_BDED_B)) then - call RegPackBounds(RF, 1, lbound(InData%ExtLd_P_2_BDED_B), ubound(InData%ExtLd_P_2_BDED_B)) - LB(1:1) = lbound(InData%ExtLd_P_2_BDED_B) - UB(1:1) = ubound(InData%ExtLd_P_2_BDED_B) + call MD_DestroyParam(MoorDyn_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MD_DestroyOutput(MoorDyn_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MD_DestroyMisc(MoorDyn_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MoorDyn_DataData%Input)) then + LB(1:1) = lbound(MoorDyn_DataData%Input) + UB(1:1) = ubound(MoorDyn_DataData%Input) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%ExtLd_P_2_BDED_B(i1)) + call MD_DestroyInput(MoorDyn_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(MoorDyn_DataData%Input) end if - call NWTC_Library_PackMeshMapType(RF, InData%ED_L_2_ExtLd_P_T) - call NWTC_Library_PackMeshMapType(RF, InData%ExtLd_P_2_ED_P_T) - call RegPack(RF, allocated(InData%ED_P_2_ExtLd_P_R)) - if (allocated(InData%ED_P_2_ExtLd_P_R)) then - call RegPackBounds(RF, 1, lbound(InData%ED_P_2_ExtLd_P_R), ubound(InData%ED_P_2_ExtLd_P_R)) - LB(1:1) = lbound(InData%ED_P_2_ExtLd_P_R) - UB(1:1) = ubound(InData%ED_P_2_ExtLd_P_R) - do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_ExtLd_P_R(i1)) - end do + if (allocated(MoorDyn_DataData%InputTimes)) then + deallocate(MoorDyn_DataData%InputTimes) end if - call NWTC_Library_PackMeshMapType(RF, InData%ED_P_2_ExtLd_P_H) - call RegPack(RF, allocated(InData%AD_L_2_ExtLd_B)) - if (allocated(InData%AD_L_2_ExtLd_B)) then - call RegPackBounds(RF, 1, lbound(InData%AD_L_2_ExtLd_B), ubound(InData%AD_L_2_ExtLd_B)) - LB(1:1) = lbound(InData%AD_L_2_ExtLd_B) - UB(1:1) = ubound(InData%AD_L_2_ExtLd_B) +end subroutine + +subroutine FAST_PackMoorDyn_Data(RF, Indata) + type(RegFile), intent(inout) :: RF + type(MoorDyn_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackMoorDyn_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%AD_L_2_ExtLd_B(i1)) + call MD_PackContState(RF, InData%x(i1)) end do end if - call NWTC_Library_PackMeshMapType(RF, InData%AD_L_2_ExtLd_T) - call NWTC_Library_PackMeshMapType(RF, InData%IceF_P_2_SD_P) - call NWTC_Library_PackMeshMapType(RF, InData%SDy3_P_2_IceF_P) - call RegPack(RF, allocated(InData%IceD_P_2_SD_P)) - if (allocated(InData%IceD_P_2_SD_P)) then - call RegPackBounds(RF, 1, lbound(InData%IceD_P_2_SD_P), ubound(InData%IceD_P_2_SD_P)) - LB(1:1) = lbound(InData%IceD_P_2_SD_P) - UB(1:1) = ubound(InData%IceD_P_2_SD_P) + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%IceD_P_2_SD_P(i1)) + call MD_PackDiscState(RF, InData%xd(i1)) end do end if - call RegPack(RF, allocated(InData%SDy3_P_2_IceD_P)) - if (allocated(InData%SDy3_P_2_IceD_P)) then - call RegPackBounds(RF, 1, lbound(InData%SDy3_P_2_IceD_P), ubound(InData%SDy3_P_2_IceD_P)) - LB(1:1) = lbound(InData%SDy3_P_2_IceD_P) - UB(1:1) = ubound(InData%SDy3_P_2_IceD_P) + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) do i1 = LB(1), UB(1) - call NWTC_Library_PackMeshMapType(RF, InData%SDy3_P_2_IceD_P(i1)) - end do - end if - call RegPackAlloc(RF, InData%Jacobian_Opt1) - call RegPackAlloc(RF, InData%Jacobian_pivot) - call RegPackAlloc(RF, InData%Jac_u_indx) - call MeshPack(RF, InData%u_ED_NacelleLoads) - call MeshPack(RF, InData%SubstructureLoads_Tmp) - call MeshPack(RF, InData%SubstructureLoads_Tmp2) - call MeshPack(RF, InData%PlatformLoads_Tmp) - call MeshPack(RF, InData%PlatformLoads_Tmp2) - call MeshPack(RF, InData%SubstructureLoads_Tmp_Farm) - call MeshPack(RF, InData%u_ED_TowerPtloads) - call RegPack(RF, allocated(InData%u_ED_BladePtLoads)) - if (allocated(InData%u_ED_BladePtLoads)) then - call RegPackBounds(RF, 1, lbound(InData%u_ED_BladePtLoads), ubound(InData%u_ED_BladePtLoads)) - LB(1:1) = lbound(InData%u_ED_BladePtLoads) - UB(1:1) = ubound(InData%u_ED_BladePtLoads) - do i1 = LB(1), UB(1) - call MeshPack(RF, InData%u_ED_BladePtLoads(i1)) - end do - end if - call MeshPack(RF, InData%u_SD_TPMesh) - call MeshPack(RF, InData%u_HD_M_Mesh) - call MeshPack(RF, InData%u_HD_W_Mesh) - call MeshPack(RF, InData%u_ED_HubPtLoad) - call MeshPack(RF, InData%u_ED_HubPtLoad_2) - call RegPack(RF, allocated(InData%u_BD_RootMotion)) - if (allocated(InData%u_BD_RootMotion)) then - call RegPackBounds(RF, 1, lbound(InData%u_BD_RootMotion), ubound(InData%u_BD_RootMotion)) - LB(1:1) = lbound(InData%u_BD_RootMotion) - UB(1:1) = ubound(InData%u_BD_RootMotion) - do i1 = LB(1), UB(1) - call MeshPack(RF, InData%u_BD_RootMotion(i1)) + call MD_PackConstrState(RF, InData%z(i1)) end do end if - call RegPack(RF, allocated(InData%y_BD_BldMotion_4Loads)) - if (allocated(InData%y_BD_BldMotion_4Loads)) then - call RegPackBounds(RF, 1, lbound(InData%y_BD_BldMotion_4Loads), ubound(InData%y_BD_BldMotion_4Loads)) - LB(1:1) = lbound(InData%y_BD_BldMotion_4Loads) - UB(1:1) = ubound(InData%y_BD_BldMotion_4Loads) + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%y_BD_BldMotion_4Loads(i1)) + call MD_PackOtherState(RF, InData%OtherSt(i1)) end do end if - call RegPack(RF, allocated(InData%u_BD_Distrload)) - if (allocated(InData%u_BD_Distrload)) then - call RegPackBounds(RF, 1, lbound(InData%u_BD_Distrload), ubound(InData%u_BD_Distrload)) - LB(1:1) = lbound(InData%u_BD_Distrload) - UB(1:1) = ubound(InData%u_BD_Distrload) + call MD_PackParam(RF, InData%p) + call MD_PackOutput(RF, InData%y) + call MD_PackMisc(RF, InData%m) + call RegPack(RF, allocated(InData%Input)) + if (allocated(InData%Input)) then + call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) + LB(1:1) = lbound(InData%Input) + UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%u_BD_Distrload(i1)) + call MD_PackInput(RF, InData%Input(i1)) end do end if - call MeshPack(RF, InData%u_Orca_PtfmMesh) - call MeshPack(RF, InData%u_ExtPtfm_PtfmMesh) - call MeshPack(RF, InData%u_SED_HubPtLoad) - call RegPackAlloc(RF, InData%HubOrient) + call RegPackAlloc(RF, InData%InputTimes) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine FAST_UnPackModuleMapType(RF, OutData) +subroutine FAST_UnPackMoorDyn_Data(RF, OutData) type(RegFile), intent(inout) :: RF - type(FAST_ModuleMapType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'FAST_UnPackModuleMapType' - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + type(MoorDyn_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackMoorDyn_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - if (allocated(OutData%ED_P_2_BD_P)) deallocate(OutData%ED_P_2_BD_P) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%ED_P_2_BD_P(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ED_P_2_BD_P.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_BD_P(i1)) ! ED_P_2_BD_P - end do - end if - if (allocated(OutData%BD_P_2_ED_P)) deallocate(OutData%BD_P_2_ED_P) + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BD_P_2_ED_P(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BD_P_2_ED_P.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%BD_P_2_ED_P(i1)) ! BD_P_2_ED_P + call MD_UnpackContState(RF, OutData%x(i1)) ! x end do end if - if (allocated(OutData%ED_P_2_BD_P_Hub)) deallocate(OutData%ED_P_2_BD_P_Hub) + if (allocated(OutData%xd)) deallocate(OutData%xd) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%ED_P_2_BD_P_Hub(LB(1):UB(1)),stat=stat) + allocate(OutData%xd(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ED_P_2_BD_P_Hub.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_BD_P_Hub(i1)) ! ED_P_2_BD_P_Hub + call MD_UnpackDiscState(RF, OutData%xd(i1)) ! xd end do end if - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_HD_PRP_P) ! ED_P_2_HD_PRP_P - call NWTC_Library_UnpackMeshMapType(RF, OutData%SubStructure_2_HD_W_P) ! SubStructure_2_HD_W_P - call NWTC_Library_UnpackMeshMapType(RF, OutData%HD_W_P_2_SubStructure) ! HD_W_P_2_SubStructure - call NWTC_Library_UnpackMeshMapType(RF, OutData%SubStructure_2_HD_M_P) ! SubStructure_2_HD_M_P - call NWTC_Library_UnpackMeshMapType(RF, OutData%HD_M_P_2_SubStructure) ! HD_M_P_2_SubStructure - call NWTC_Library_UnpackMeshMapType(RF, OutData%Structure_2_Mooring) ! Structure_2_Mooring - call NWTC_Library_UnpackMeshMapType(RF, OutData%Mooring_2_Structure) ! Mooring_2_Structure - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_SD_TP) ! ED_P_2_SD_TP - call NWTC_Library_UnpackMeshMapType(RF, OutData%SD_TP_2_ED_P) ! SD_TP_2_ED_P - if (allocated(OutData%ED_P_2_NStC_P_N)) deallocate(OutData%ED_P_2_NStC_P_N) + if (allocated(OutData%z)) deallocate(OutData%z) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%ED_P_2_NStC_P_N(LB(1):UB(1)),stat=stat) + allocate(OutData%z(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ED_P_2_NStC_P_N.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_NStC_P_N(i1)) ! ED_P_2_NStC_P_N + call MD_UnpackConstrState(RF, OutData%z(i1)) ! z end do end if - if (allocated(OutData%NStC_P_2_ED_P_N)) deallocate(OutData%NStC_P_2_ED_P_N) + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%NStC_P_2_ED_P_N(LB(1):UB(1)),stat=stat) + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%NStC_P_2_ED_P_N.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%NStC_P_2_ED_P_N(i1)) ! NStC_P_2_ED_P_N + call MD_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(OutData%ED_L_2_TStC_P_T)) deallocate(OutData%ED_L_2_TStC_P_T) + call MD_UnpackParam(RF, OutData%p) ! p + call MD_UnpackOutput(RF, OutData%y) ! y + call MD_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%ED_L_2_TStC_P_T(LB(1):UB(1)),stat=stat) + allocate(OutData%Input(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ED_L_2_TStC_P_T.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_L_2_TStC_P_T(i1)) ! ED_L_2_TStC_P_T + call MD_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if - if (allocated(OutData%TStC_P_2_ED_P_T)) deallocate(OutData%TStC_P_2_ED_P_T) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%TStC_P_2_ED_P_T(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%TStC_P_2_ED_P_T.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_CopyOrcaFlex_Data(SrcOrcaFlex_DataData, DstOrcaFlex_DataData, CtrlCode, ErrStat, ErrMsg) + type(OrcaFlex_Data), intent(inout) :: SrcOrcaFlex_DataData + type(OrcaFlex_Data), intent(inout) :: DstOrcaFlex_DataData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_CopyOrcaFlex_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcOrcaFlex_DataData%x)) then + LB(1:1) = lbound(SrcOrcaFlex_DataData%x) + UB(1:1) = ubound(SrcOrcaFlex_DataData%x) + if (.not. allocated(DstOrcaFlex_DataData%x)) then + allocate(DstOrcaFlex_DataData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%x.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%TStC_P_2_ED_P_T(i1)) ! TStC_P_2_ED_P_T - end do - end if - if (allocated(OutData%ED_L_2_BStC_P_B)) deallocate(OutData%ED_L_2_BStC_P_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%ED_L_2_BStC_P_B(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ED_L_2_BStC_P_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_L_2_BStC_P_B(i1,i2)) ! ED_L_2_BStC_P_B - end do - end do - end if - if (allocated(OutData%BStC_P_2_ED_P_B)) deallocate(OutData%BStC_P_2_ED_P_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BStC_P_2_ED_P_B(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BStC_P_2_ED_P_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%BStC_P_2_ED_P_B(i1,i2)) ! BStC_P_2_ED_P_B - end do - end do - end if - if (allocated(OutData%BD_L_2_BStC_P_B)) deallocate(OutData%BD_L_2_BStC_P_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BD_L_2_BStC_P_B(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BD_L_2_BStC_P_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%BD_L_2_BStC_P_B(i1,i2)) ! BD_L_2_BStC_P_B - end do - end do - end if - if (allocated(OutData%BStC_P_2_BD_P_B)) deallocate(OutData%BStC_P_2_BD_P_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BStC_P_2_BD_P_B(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BStC_P_2_BD_P_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%BStC_P_2_BD_P_B(i1,i2)) ! BStC_P_2_BD_P_B - end do + call Orca_CopyContState(SrcOrcaFlex_DataData%x(i1), DstOrcaFlex_DataData%x(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - if (allocated(OutData%SStC_P_P_2_SubStructure)) deallocate(OutData%SStC_P_P_2_SubStructure) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%SStC_P_P_2_SubStructure(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SStC_P_P_2_SubStructure.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcOrcaFlex_DataData%xd)) then + LB(1:1) = lbound(SrcOrcaFlex_DataData%xd) + UB(1:1) = ubound(SrcOrcaFlex_DataData%xd) + if (.not. allocated(DstOrcaFlex_DataData%xd)) then + allocate(DstOrcaFlex_DataData%xd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%SStC_P_P_2_SubStructure(i1)) ! SStC_P_P_2_SubStructure + call Orca_CopyDiscState(SrcOrcaFlex_DataData%xd(i1), DstOrcaFlex_DataData%xd(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - if (allocated(OutData%SubStructure_2_SStC_P_P)) deallocate(OutData%SubStructure_2_SStC_P_P) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%SubStructure_2_SStC_P_P(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SubStructure_2_SStC_P_P.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcOrcaFlex_DataData%z)) then + LB(1:1) = lbound(SrcOrcaFlex_DataData%z) + UB(1:1) = ubound(SrcOrcaFlex_DataData%z) + if (.not. allocated(DstOrcaFlex_DataData%z)) then + allocate(DstOrcaFlex_DataData%z(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%z.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%SubStructure_2_SStC_P_P(i1)) ! SubStructure_2_SStC_P_P + call Orca_CopyConstrState(SrcOrcaFlex_DataData%z(i1), DstOrcaFlex_DataData%z(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_SrvD_P_P) ! ED_P_2_SrvD_P_P - if (allocated(OutData%BDED_L_2_AD_L_B)) deallocate(OutData%BDED_L_2_AD_L_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BDED_L_2_AD_L_B(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BDED_L_2_AD_L_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcOrcaFlex_DataData%OtherSt)) then + LB(1:1) = lbound(SrcOrcaFlex_DataData%OtherSt) + UB(1:1) = ubound(SrcOrcaFlex_DataData%OtherSt) + if (.not. allocated(DstOrcaFlex_DataData%OtherSt)) then + allocate(DstOrcaFlex_DataData%OtherSt(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%OtherSt.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%BDED_L_2_AD_L_B(i1)) ! BDED_L_2_AD_L_B + call Orca_CopyOtherState(SrcOrcaFlex_DataData%OtherSt(i1), DstOrcaFlex_DataData%OtherSt(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - if (allocated(OutData%AD_L_2_BDED_B)) deallocate(OutData%AD_L_2_BDED_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%AD_L_2_BDED_B(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%AD_L_2_BDED_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + call Orca_CopyParam(SrcOrcaFlex_DataData%p, DstOrcaFlex_DataData%p, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Orca_CopyOutput(SrcOrcaFlex_DataData%y, DstOrcaFlex_DataData%y, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Orca_CopyMisc(SrcOrcaFlex_DataData%m, DstOrcaFlex_DataData%m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcOrcaFlex_DataData%Input)) then + LB(1:1) = lbound(SrcOrcaFlex_DataData%Input) + UB(1:1) = ubound(SrcOrcaFlex_DataData%Input) + if (.not. allocated(DstOrcaFlex_DataData%Input)) then + allocate(DstOrcaFlex_DataData%Input(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%Input.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%AD_L_2_BDED_B(i1)) ! AD_L_2_BDED_B + call Orca_CopyInput(SrcOrcaFlex_DataData%Input(i1), DstOrcaFlex_DataData%Input(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - if (allocated(OutData%BD_L_2_BD_L)) deallocate(OutData%BD_L_2_BD_L) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BD_L_2_BD_L(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BD_L_2_BD_L.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcOrcaFlex_DataData%InputTimes)) then + LB(1:1) = lbound(SrcOrcaFlex_DataData%InputTimes) + UB(1:1) = ubound(SrcOrcaFlex_DataData%InputTimes) + if (.not. allocated(DstOrcaFlex_DataData%InputTimes)) then + allocate(DstOrcaFlex_DataData%InputTimes(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOrcaFlex_DataData%InputTimes.', ErrStat, ErrMsg, RoutineName) + return + end if end if + DstOrcaFlex_DataData%InputTimes = SrcOrcaFlex_DataData%InputTimes + end if +end subroutine + +subroutine FAST_DestroyOrcaFlex_Data(OrcaFlex_DataData, ErrStat, ErrMsg) + type(OrcaFlex_Data), intent(inout) :: OrcaFlex_DataData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'FAST_DestroyOrcaFlex_Data' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(OrcaFlex_DataData%x)) then + LB(1:1) = lbound(OrcaFlex_DataData%x) + UB(1:1) = ubound(OrcaFlex_DataData%x) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%BD_L_2_BD_L(i1)) ! BD_L_2_BD_L + call Orca_DestroyContState(OrcaFlex_DataData%x(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(OrcaFlex_DataData%x) end if - if (allocated(OutData%SED_P_2_AD_L_B)) deallocate(OutData%SED_P_2_AD_L_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%SED_P_2_AD_L_B(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SED_P_2_AD_L_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + if (allocated(OrcaFlex_DataData%xd)) then + LB(1:1) = lbound(OrcaFlex_DataData%xd) + UB(1:1) = ubound(OrcaFlex_DataData%xd) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%SED_P_2_AD_L_B(i1)) ! SED_P_2_AD_L_B + call Orca_DestroyDiscState(OrcaFlex_DataData%xd(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(OrcaFlex_DataData%xd) end if - if (allocated(OutData%SED_P_2_AD_P_R)) deallocate(OutData%SED_P_2_AD_P_R) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%SED_P_2_AD_P_R(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SED_P_2_AD_P_R.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + if (allocated(OrcaFlex_DataData%z)) then + LB(1:1) = lbound(OrcaFlex_DataData%z) + UB(1:1) = ubound(OrcaFlex_DataData%z) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%SED_P_2_AD_P_R(i1)) ! SED_P_2_AD_P_R + call Orca_DestroyConstrState(OrcaFlex_DataData%z(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(OrcaFlex_DataData%z) end if - if (allocated(OutData%AD_L_2_SED_P)) deallocate(OutData%AD_L_2_SED_P) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%AD_L_2_SED_P(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%AD_L_2_SED_P.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + if (allocated(OrcaFlex_DataData%OtherSt)) then + LB(1:1) = lbound(OrcaFlex_DataData%OtherSt) + UB(1:1) = ubound(OrcaFlex_DataData%OtherSt) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%AD_L_2_SED_P(i1)) ! AD_L_2_SED_P + call Orca_DestroyOtherState(OrcaFlex_DataData%OtherSt(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(OrcaFlex_DataData%OtherSt) end if - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_AD_P_N) ! ED_P_2_AD_P_N - call NWTC_Library_UnpackMeshMapType(RF, OutData%AD_P_2_ED_P_N) ! AD_P_2_ED_P_N - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_AD_P_TF) ! ED_P_2_AD_P_TF - call NWTC_Library_UnpackMeshMapType(RF, OutData%AD_P_2_ED_P_TF) ! AD_P_2_ED_P_TF - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_L_2_AD_L_T) ! ED_L_2_AD_L_T - call NWTC_Library_UnpackMeshMapType(RF, OutData%AD_L_2_ED_P_T) ! AD_L_2_ED_P_T - if (allocated(OutData%ED_P_2_AD_P_R)) deallocate(OutData%ED_P_2_AD_P_R) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%ED_P_2_AD_P_R(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ED_P_2_AD_P_R.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + call Orca_DestroyParam(OrcaFlex_DataData%p, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Orca_DestroyOutput(OrcaFlex_DataData%y, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Orca_DestroyMisc(OrcaFlex_DataData%m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(OrcaFlex_DataData%Input)) then + LB(1:1) = lbound(OrcaFlex_DataData%Input) + UB(1:1) = ubound(OrcaFlex_DataData%Input) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_AD_P_R(i1)) ! ED_P_2_AD_P_R + call Orca_DestroyInput(OrcaFlex_DataData%Input(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do + deallocate(OrcaFlex_DataData%Input) end if - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_AD_P_H) ! ED_P_2_AD_P_H - call NWTC_Library_UnpackMeshMapType(RF, OutData%ADsk_P_2_ED_P_H) ! ADsk_P_2_ED_P_H - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_ADsk_P_H) ! ED_P_2_ADsk_P_H - call NWTC_Library_UnpackMeshMapType(RF, OutData%SED_P_2_AD_P_N) ! SED_P_2_AD_P_N - call NWTC_Library_UnpackMeshMapType(RF, OutData%SED_L_2_AD_L_T) ! SED_L_2_AD_L_T - call NWTC_Library_UnpackMeshMapType(RF, OutData%SED_P_2_AD_P_H) ! SED_P_2_AD_P_H - call NWTC_Library_UnpackMeshMapType(RF, OutData%ADsk_P_2_SED_P_H) ! ADsk_P_2_SED_P_H - call NWTC_Library_UnpackMeshMapType(RF, OutData%SED_P_2_ADsk_P_H) ! SED_P_2_ADsk_P_H - call NWTC_Library_UnpackMeshMapType(RF, OutData%AD_P_2_ED_P_H) ! AD_P_2_ED_P_H - if (allocated(OutData%BDED_L_2_ExtLd_P_B)) deallocate(OutData%BDED_L_2_ExtLd_P_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BDED_L_2_ExtLd_P_B(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BDED_L_2_ExtLd_P_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + if (allocated(OrcaFlex_DataData%InputTimes)) then + deallocate(OrcaFlex_DataData%InputTimes) + end if +end subroutine + +subroutine FAST_PackOrcaFlex_Data(RF, Indata) + type(RegFile), intent(inout) :: RF + type(OrcaFlex_Data), intent(in) :: InData + character(*), parameter :: RoutineName = 'FAST_PackOrcaFlex_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%x)) + if (allocated(InData%x)) then + call RegPackBounds(RF, 1, lbound(InData%x), ubound(InData%x)) + LB(1:1) = lbound(InData%x) + UB(1:1) = ubound(InData%x) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%BDED_L_2_ExtLd_P_B(i1)) ! BDED_L_2_ExtLd_P_B + call Orca_PackContState(RF, InData%x(i1)) end do end if - if (allocated(OutData%ExtLd_P_2_BDED_B)) deallocate(OutData%ExtLd_P_2_BDED_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%ExtLd_P_2_BDED_B(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ExtLd_P_2_BDED_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + call RegPack(RF, allocated(InData%xd)) + if (allocated(InData%xd)) then + call RegPackBounds(RF, 1, lbound(InData%xd), ubound(InData%xd)) + LB(1:1) = lbound(InData%xd) + UB(1:1) = ubound(InData%xd) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%ExtLd_P_2_BDED_B(i1)) ! ExtLd_P_2_BDED_B + call Orca_PackDiscState(RF, InData%xd(i1)) end do end if - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_L_2_ExtLd_P_T) ! ED_L_2_ExtLd_P_T - call NWTC_Library_UnpackMeshMapType(RF, OutData%ExtLd_P_2_ED_P_T) ! ExtLd_P_2_ED_P_T - if (allocated(OutData%ED_P_2_ExtLd_P_R)) deallocate(OutData%ED_P_2_ExtLd_P_R) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%ED_P_2_ExtLd_P_R(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ED_P_2_ExtLd_P_R.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + call RegPack(RF, allocated(InData%z)) + if (allocated(InData%z)) then + call RegPackBounds(RF, 1, lbound(InData%z), ubound(InData%z)) + LB(1:1) = lbound(InData%z) + UB(1:1) = ubound(InData%z) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_ExtLd_P_R(i1)) ! ED_P_2_ExtLd_P_R + call Orca_PackConstrState(RF, InData%z(i1)) end do end if - call NWTC_Library_UnpackMeshMapType(RF, OutData%ED_P_2_ExtLd_P_H) ! ED_P_2_ExtLd_P_H - if (allocated(OutData%AD_L_2_ExtLd_B)) deallocate(OutData%AD_L_2_ExtLd_B) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%AD_L_2_ExtLd_B(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%AD_L_2_ExtLd_B.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + call RegPack(RF, allocated(InData%OtherSt)) + if (allocated(InData%OtherSt)) then + call RegPackBounds(RF, 1, lbound(InData%OtherSt), ubound(InData%OtherSt)) + LB(1:1) = lbound(InData%OtherSt) + UB(1:1) = ubound(InData%OtherSt) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%AD_L_2_ExtLd_B(i1)) ! AD_L_2_ExtLd_B + call Orca_PackOtherState(RF, InData%OtherSt(i1)) end do end if - call NWTC_Library_UnpackMeshMapType(RF, OutData%AD_L_2_ExtLd_T) ! AD_L_2_ExtLd_T - call NWTC_Library_UnpackMeshMapType(RF, OutData%IceF_P_2_SD_P) ! IceF_P_2_SD_P - call NWTC_Library_UnpackMeshMapType(RF, OutData%SDy3_P_2_IceF_P) ! SDy3_P_2_IceF_P - if (allocated(OutData%IceD_P_2_SD_P)) deallocate(OutData%IceD_P_2_SD_P) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%IceD_P_2_SD_P(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%IceD_P_2_SD_P.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if + call Orca_PackParam(RF, InData%p) + call Orca_PackOutput(RF, InData%y) + call Orca_PackMisc(RF, InData%m) + call RegPack(RF, allocated(InData%Input)) + if (allocated(InData%Input)) then + call RegPackBounds(RF, 1, lbound(InData%Input), ubound(InData%Input)) + LB(1:1) = lbound(InData%Input) + UB(1:1) = ubound(InData%Input) do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%IceD_P_2_SD_P(i1)) ! IceD_P_2_SD_P + call Orca_PackInput(RF, InData%Input(i1)) end do end if - if (allocated(OutData%SDy3_P_2_IceD_P)) deallocate(OutData%SDy3_P_2_IceD_P) + call RegPackAlloc(RF, InData%InputTimes) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine FAST_UnPackOrcaFlex_Data(RF, OutData) + type(RegFile), intent(inout) :: RF + type(OrcaFlex_Data), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'FAST_UnPackOrcaFlex_Data' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%x)) deallocate(OutData%x) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%SDy3_P_2_IceD_P(LB(1):UB(1)),stat=stat) + allocate(OutData%x(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SDy3_P_2_IceD_P.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%x.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call NWTC_Library_UnpackMeshMapType(RF, OutData%SDy3_P_2_IceD_P(i1)) ! SDy3_P_2_IceD_P + call Orca_UnpackContState(RF, OutData%x(i1)) ! x end do end if - call RegUnpackAlloc(RF, OutData%Jacobian_Opt1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jacobian_pivot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_u_indx); if (RegCheckErr(RF, RoutineName)) return - call MeshUnpack(RF, OutData%u_ED_NacelleLoads) ! u_ED_NacelleLoads - call MeshUnpack(RF, OutData%SubstructureLoads_Tmp) ! SubstructureLoads_Tmp - call MeshUnpack(RF, OutData%SubstructureLoads_Tmp2) ! SubstructureLoads_Tmp2 - call MeshUnpack(RF, OutData%PlatformLoads_Tmp) ! PlatformLoads_Tmp - call MeshUnpack(RF, OutData%PlatformLoads_Tmp2) ! PlatformLoads_Tmp2 - call MeshUnpack(RF, OutData%SubstructureLoads_Tmp_Farm) ! SubstructureLoads_Tmp_Farm - call MeshUnpack(RF, OutData%u_ED_TowerPtloads) ! u_ED_TowerPtloads - if (allocated(OutData%u_ED_BladePtLoads)) deallocate(OutData%u_ED_BladePtLoads) + if (allocated(OutData%xd)) deallocate(OutData%xd) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_ED_BladePtLoads(LB(1):UB(1)),stat=stat) + allocate(OutData%xd(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_ED_BladePtLoads.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%xd.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%u_ED_BladePtLoads(i1)) ! u_ED_BladePtLoads + call Orca_UnpackDiscState(RF, OutData%xd(i1)) ! xd end do end if - call MeshUnpack(RF, OutData%u_SD_TPMesh) ! u_SD_TPMesh - call MeshUnpack(RF, OutData%u_HD_M_Mesh) ! u_HD_M_Mesh - call MeshUnpack(RF, OutData%u_HD_W_Mesh) ! u_HD_W_Mesh - call MeshUnpack(RF, OutData%u_ED_HubPtLoad) ! u_ED_HubPtLoad - call MeshUnpack(RF, OutData%u_ED_HubPtLoad_2) ! u_ED_HubPtLoad_2 - if (allocated(OutData%u_BD_RootMotion)) deallocate(OutData%u_BD_RootMotion) + if (allocated(OutData%z)) deallocate(OutData%z) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_BD_RootMotion(LB(1):UB(1)),stat=stat) + allocate(OutData%z(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_BD_RootMotion.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%z.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%u_BD_RootMotion(i1)) ! u_BD_RootMotion + call Orca_UnpackConstrState(RF, OutData%z(i1)) ! z end do end if - if (allocated(OutData%y_BD_BldMotion_4Loads)) deallocate(OutData%y_BD_BldMotion_4Loads) + if (allocated(OutData%OtherSt)) deallocate(OutData%OtherSt) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%y_BD_BldMotion_4Loads(LB(1):UB(1)),stat=stat) + allocate(OutData%OtherSt(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_BD_BldMotion_4Loads.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OtherSt.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%y_BD_BldMotion_4Loads(i1)) ! y_BD_BldMotion_4Loads + call Orca_UnpackOtherState(RF, OutData%OtherSt(i1)) ! OtherSt end do end if - if (allocated(OutData%u_BD_Distrload)) deallocate(OutData%u_BD_Distrload) + call Orca_UnpackParam(RF, OutData%p) ! p + call Orca_UnpackOutput(RF, OutData%y) ! y + call Orca_UnpackMisc(RF, OutData%m) ! m + if (allocated(OutData%Input)) deallocate(OutData%Input) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_BD_Distrload(LB(1):UB(1)),stat=stat) + allocate(OutData%Input(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_BD_Distrload.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Input.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%u_BD_Distrload(i1)) ! u_BD_Distrload + call Orca_UnpackInput(RF, OutData%Input(i1)) ! Input end do end if - call MeshUnpack(RF, OutData%u_Orca_PtfmMesh) ! u_Orca_PtfmMesh - call MeshUnpack(RF, OutData%u_ExtPtfm_PtfmMesh) ! u_ExtPtfm_PtfmMesh - call MeshUnpack(RF, OutData%u_SED_HubPtLoad) ! u_SED_HubPtLoad - call RegUnpackAlloc(RF, OutData%HubOrient); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%InputTimes); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine FAST_CopyExternInputType(SrcExternInputTypeData, DstExternInputTypeData, CtrlCode, ErrStat, ErrMsg) @@ -14694,13 +8761,11 @@ subroutine FAST_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) ErrMsg = '' DstMiscData%TiLstPrn = SrcMiscData%TiLstPrn DstMiscData%t_global = SrcMiscData%t_global - DstMiscData%NextJacCalcTime = SrcMiscData%NextJacCalcTime DstMiscData%PrevClockTime = SrcMiscData%PrevClockTime DstMiscData%UsrTime1 = SrcMiscData%UsrTime1 DstMiscData%UsrTime2 = SrcMiscData%UsrTime2 DstMiscData%StrtTime = SrcMiscData%StrtTime DstMiscData%SimStrtTime = SrcMiscData%SimStrtTime - DstMiscData%calcJacobian = SrcMiscData%calcJacobian call FAST_CopyExternInputType(SrcMiscData%ExternInput, DstMiscData%ExternInput, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -14731,13 +8796,11 @@ subroutine FAST_PackMisc(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%TiLstPrn) call RegPack(RF, InData%t_global) - call RegPack(RF, InData%NextJacCalcTime) call RegPack(RF, InData%PrevClockTime) call RegPack(RF, InData%UsrTime1) call RegPack(RF, InData%UsrTime2) call RegPack(RF, InData%StrtTime) call RegPack(RF, InData%SimStrtTime) - call RegPack(RF, InData%calcJacobian) call FAST_PackExternInputType(RF, InData%ExternInput) call FAST_PackMiscLinType(RF, InData%Lin) if (RegCheckErr(RF, RoutineName)) return @@ -14750,13 +8813,11 @@ subroutine FAST_UnPackMisc(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%TiLstPrn); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%t_global); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NextJacCalcTime); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PrevClockTime); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UsrTime1); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UsrTime2); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%StrtTime); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SimStrtTime); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%calcJacobian); if (RegCheckErr(RF, RoutineName)) return call FAST_UnpackExternInputType(RF, OutData%ExternInput) ! ExternInput call FAST_UnpackMiscLinType(RF, OutData%Lin) ! Lin end subroutine @@ -14777,9 +8838,22 @@ subroutine FAST_CopyInitData(SrcInitDataData, DstInitDataData, CtrlCode, ErrStat call ED_CopyInitInput(SrcInitDataData%InData_ED, DstInitDataData%InData_ED, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call ED_CopyInitOutput(SrcInitDataData%OutData_ED, DstInitDataData%OutData_ED, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + if (allocated(SrcInitDataData%OutData_ED)) then + LB(1:1) = lbound(SrcInitDataData%OutData_ED) + UB(1:1) = ubound(SrcInitDataData%OutData_ED) + if (.not. allocated(DstInitDataData%OutData_ED)) then + allocate(DstInitDataData%OutData_ED(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitDataData%OutData_ED.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call ED_CopyInitOutput(SrcInitDataData%OutData_ED(i1), DstInitDataData%OutData_ED(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if call SED_CopyInitInput(SrcInitDataData%InData_SED, DstInitDataData%InData_SED, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -14808,9 +8882,22 @@ subroutine FAST_CopyInitData(SrcInitDataData, DstInitDataData, CtrlCode, ErrStat call SrvD_CopyInitInput(SrcInitDataData%InData_SrvD, DstInitDataData%InData_SrvD, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call SrvD_CopyInitOutput(SrcInitDataData%OutData_SrvD, DstInitDataData%OutData_SrvD, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + if (allocated(SrcInitDataData%OutData_SrvD)) then + LB(1:1) = lbound(SrcInitDataData%OutData_SrvD) + UB(1:1) = ubound(SrcInitDataData%OutData_SrvD) + if (.not. allocated(DstInitDataData%OutData_SrvD)) then + allocate(DstInitDataData%OutData_SrvD(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitDataData%OutData_SrvD.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SrvD_CopyInitOutput(SrcInitDataData%OutData_SrvD(i1), DstInitDataData%OutData_SrvD(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if call AD_CopyInitInput(SrcInitDataData%InData_AD, DstInitDataData%InData_AD, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -14901,6 +8988,12 @@ subroutine FAST_CopyInitData(SrcInitDataData, DstInitDataData, CtrlCode, ErrStat call IceD_CopyInitOutput(SrcInitDataData%OutData_IceD, DstInitDataData%OutData_IceD, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call SlD_CopyInitInput(SrcInitDataData%InData_SlD, DstInitDataData%InData_SlD, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SlD_CopyInitOutput(SrcInitDataData%OutData_SlD, DstInitDataData%OutData_SlD, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine FAST_DestroyInitData(InitDataData, ErrStat, ErrMsg) @@ -14916,8 +9009,15 @@ subroutine FAST_DestroyInitData(InitDataData, ErrStat, ErrMsg) ErrMsg = '' call ED_DestroyInitInput(InitDataData%InData_ED, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call ED_DestroyInitOutput(InitDataData%OutData_ED, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InitDataData%OutData_ED)) then + LB(1:1) = lbound(InitDataData%OutData_ED) + UB(1:1) = ubound(InitDataData%OutData_ED) + do i1 = LB(1), UB(1) + call ED_DestroyInitOutput(InitDataData%OutData_ED(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(InitDataData%OutData_ED) + end if call SED_DestroyInitInput(InitDataData%InData_SED, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call SED_DestroyInitOutput(InitDataData%OutData_SED, ErrStat2, ErrMsg2) @@ -14935,8 +9035,15 @@ subroutine FAST_DestroyInitData(InitDataData, ErrStat, ErrMsg) end if call SrvD_DestroyInitInput(InitDataData%InData_SrvD, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SrvD_DestroyInitOutput(InitDataData%OutData_SrvD, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InitDataData%OutData_SrvD)) then + LB(1:1) = lbound(InitDataData%OutData_SrvD) + UB(1:1) = ubound(InitDataData%OutData_SrvD) + do i1 = LB(1), UB(1) + call SrvD_DestroyInitOutput(InitDataData%OutData_SrvD(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(InitDataData%OutData_SrvD) + end if call AD_DestroyInitInput(InitDataData%InData_AD, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call AD_DestroyInitOutput(InitDataData%OutData_AD, ErrStat2, ErrMsg2) @@ -14997,6 +9104,10 @@ subroutine FAST_DestroyInitData(InitDataData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call IceD_DestroyInitOutput(InitDataData%OutData_IceD, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyInitInput(InitDataData%InData_SlD, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyInitOutput(InitDataData%OutData_SlD, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine FAST_PackInitData(RF, Indata) @@ -15007,7 +9118,15 @@ subroutine FAST_PackInitData(RF, Indata) integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return call ED_PackInitInput(RF, InData%InData_ED) - call ED_PackInitOutput(RF, InData%OutData_ED) + call RegPack(RF, allocated(InData%OutData_ED)) + if (allocated(InData%OutData_ED)) then + call RegPackBounds(RF, 1, lbound(InData%OutData_ED), ubound(InData%OutData_ED)) + LB(1:1) = lbound(InData%OutData_ED) + UB(1:1) = ubound(InData%OutData_ED) + do i1 = LB(1), UB(1) + call ED_PackInitOutput(RF, InData%OutData_ED(i1)) + end do + end if call SED_PackInitInput(RF, InData%InData_SED) call SED_PackInitOutput(RF, InData%OutData_SED) call BD_PackInitInput(RF, InData%InData_BD) @@ -15021,7 +9140,15 @@ subroutine FAST_PackInitData(RF, Indata) end do end if call SrvD_PackInitInput(RF, InData%InData_SrvD) - call SrvD_PackInitOutput(RF, InData%OutData_SrvD) + call RegPack(RF, allocated(InData%OutData_SrvD)) + if (allocated(InData%OutData_SrvD)) then + call RegPackBounds(RF, 1, lbound(InData%OutData_SrvD), ubound(InData%OutData_SrvD)) + LB(1:1) = lbound(InData%OutData_SrvD) + UB(1:1) = ubound(InData%OutData_SrvD) + do i1 = LB(1), UB(1) + call SrvD_PackInitOutput(RF, InData%OutData_SrvD(i1)) + end do + end if call AD_PackInitInput(RF, InData%InData_AD) call AD_PackInitOutput(RF, InData%OutData_AD) call ADsk_PackInitInput(RF, InData%InData_ADsk) @@ -15052,6 +9179,8 @@ subroutine FAST_PackInitData(RF, Indata) call IceFloe_PackInitOutput(RF, InData%OutData_IceF) call IceD_PackInitInput(RF, InData%InData_IceD) call IceD_PackInitOutput(RF, InData%OutData_IceD) + call SlD_PackInitInput(RF, InData%InData_SlD) + call SlD_PackInitOutput(RF, InData%OutData_SlD) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -15065,7 +9194,19 @@ subroutine FAST_UnPackInitData(RF, OutData) logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call ED_UnpackInitInput(RF, OutData%InData_ED) ! InData_ED - call ED_UnpackInitOutput(RF, OutData%OutData_ED) ! OutData_ED + if (allocated(OutData%OutData_ED)) deallocate(OutData%OutData_ED) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OutData_ED(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutData_ED.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call ED_UnpackInitOutput(RF, OutData%OutData_ED(i1)) ! OutData_ED + end do + end if call SED_UnpackInitInput(RF, OutData%InData_SED) ! InData_SED call SED_UnpackInitOutput(RF, OutData%OutData_SED) ! OutData_SED call BD_UnpackInitInput(RF, OutData%InData_BD) ! InData_BD @@ -15083,7 +9224,19 @@ subroutine FAST_UnPackInitData(RF, OutData) end do end if call SrvD_UnpackInitInput(RF, OutData%InData_SrvD) ! InData_SrvD - call SrvD_UnpackInitOutput(RF, OutData%OutData_SrvD) ! OutData_SrvD + if (allocated(OutData%OutData_SrvD)) deallocate(OutData%OutData_SrvD) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OutData_SrvD(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutData_SrvD.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SrvD_UnpackInitOutput(RF, OutData%OutData_SrvD(i1)) ! OutData_SrvD + end do + end if call AD_UnpackInitInput(RF, OutData%InData_AD) ! InData_AD call AD_UnpackInitOutput(RF, OutData%OutData_AD) ! OutData_AD call ADsk_UnpackInitInput(RF, OutData%InData_ADsk) ! InData_ADsk @@ -15114,6 +9267,8 @@ subroutine FAST_UnPackInitData(RF, OutData) call IceFloe_UnpackInitOutput(RF, OutData%OutData_IceF) ! OutData_IceF call IceD_UnpackInitInput(RF, OutData%InData_IceD) ! InData_IceD call IceD_UnpackInitOutput(RF, OutData%OutData_IceD) ! OutData_IceD + call SlD_UnpackInitInput(RF, OutData%InData_SlD) ! InData_SlD + call SlD_UnpackInitOutput(RF, OutData%OutData_SlD) ! OutData_SlD end subroutine subroutine FAST_CopyExternInitType(SrcExternInitTypeData, DstExternInitTypeData, CtrlCode, ErrStat, ErrMsg) @@ -15232,7 +9387,13 @@ subroutine FAST_CopyTurbineType(SrcTurbineTypeData, DstTurbineTypeData, CtrlCode call FAST_CopyMisc(SrcTurbineTypeData%m_FAST, DstTurbineTypeData%m_FAST, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - call FAST_CopyModuleMapType(SrcTurbineTypeData%MeshMapData, DstTurbineTypeData%MeshMapData, CtrlCode, ErrStat2, ErrMsg2) + call Glue_CopyParam(SrcTurbineTypeData%p_Glue, DstTurbineTypeData%p_Glue, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyOutputFileType(SrcTurbineTypeData%y_Glue, DstTurbineTypeData%y_Glue, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyMisc(SrcTurbineTypeData%m_Glue, DstTurbineTypeData%m_Glue, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return call FAST_CopyElastoDyn_Data(SrcTurbineTypeData%ED, DstTurbineTypeData%ED, CtrlCode, ErrStat2, ErrMsg2) @@ -15271,6 +9432,9 @@ subroutine FAST_CopyTurbineType(SrcTurbineTypeData, DstTurbineTypeData, CtrlCode call FAST_CopySubDyn_Data(SrcTurbineTypeData%SD, DstTurbineTypeData%SD, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call FAST_CopySoilDyn_Data(SrcTurbineTypeData%SlD, DstTurbineTypeData%SlD, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return call FAST_CopyMAP_Data(SrcTurbineTypeData%MAP, DstTurbineTypeData%MAP, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -15309,7 +9473,11 @@ subroutine FAST_DestroyTurbineType(TurbineTypeData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call FAST_DestroyMisc(TurbineTypeData%m_FAST, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call FAST_DestroyModuleMapType(TurbineTypeData%MeshMapData, ErrStat2, ErrMsg2) + call Glue_DestroyParam(TurbineTypeData%p_Glue, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyOutputFileType(TurbineTypeData%y_Glue, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyMisc(TurbineTypeData%m_Glue, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call FAST_DestroyElastoDyn_Data(TurbineTypeData%ED, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -15335,6 +9503,8 @@ subroutine FAST_DestroyTurbineType(TurbineTypeData, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call FAST_DestroySubDyn_Data(TurbineTypeData%SD, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call FAST_DestroySoilDyn_Data(TurbineTypeData%SlD, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call FAST_DestroyMAP_Data(TurbineTypeData%MAP, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) call FAST_DestroyFEAMooring_Data(TurbineTypeData%FEAM, ErrStat2, ErrMsg2) @@ -15360,7 +9530,9 @@ subroutine FAST_PackTurbineType(RF, Indata) call FAST_PackParam(RF, InData%p_FAST) call FAST_PackOutputFileType(RF, InData%y_FAST) call FAST_PackMisc(RF, InData%m_FAST) - call FAST_PackModuleMapType(RF, InData%MeshMapData) + call Glue_PackParam(RF, InData%p_Glue) + call Glue_PackOutputFileType(RF, InData%y_Glue) + call Glue_PackMisc(RF, InData%m_Glue) call FAST_PackElastoDyn_Data(RF, InData%ED) call FAST_PackSED_Data(RF, InData%SED) call FAST_PackBeamDyn_Data(RF, InData%BD) @@ -15373,6 +9545,7 @@ subroutine FAST_PackTurbineType(RF, Indata) call FAST_PackSeaState_Data(RF, InData%SeaSt) call FAST_PackHydroDyn_Data(RF, InData%HD) call FAST_PackSubDyn_Data(RF, InData%SD) + call FAST_PackSoilDyn_Data(RF, InData%SlD) call FAST_PackMAP_Data(RF, InData%MAP) call FAST_PackFEAMooring_Data(RF, InData%FEAM) call FAST_PackMoorDyn_Data(RF, InData%MD) @@ -15392,7 +9565,9 @@ subroutine FAST_UnPackTurbineType(RF, OutData) call FAST_UnpackParam(RF, OutData%p_FAST) ! p_FAST call FAST_UnpackOutputFileType(RF, OutData%y_FAST) ! y_FAST call FAST_UnpackMisc(RF, OutData%m_FAST) ! m_FAST - call FAST_UnpackModuleMapType(RF, OutData%MeshMapData) ! MeshMapData + call Glue_UnpackParam(RF, OutData%p_Glue) ! p_Glue + call Glue_UnpackOutputFileType(RF, OutData%y_Glue) ! y_Glue + call Glue_UnpackMisc(RF, OutData%m_Glue) ! m_Glue call FAST_UnpackElastoDyn_Data(RF, OutData%ED) ! ED call FAST_UnpackSED_Data(RF, OutData%SED) ! SED call FAST_UnpackBeamDyn_Data(RF, OutData%BD) ! BD @@ -15405,6 +9580,7 @@ subroutine FAST_UnPackTurbineType(RF, OutData) call FAST_UnpackSeaState_Data(RF, OutData%SeaSt) ! SeaSt call FAST_UnpackHydroDyn_Data(RF, OutData%HD) ! HD call FAST_UnpackSubDyn_Data(RF, OutData%SD) ! SD + call FAST_UnpackSoilDyn_Data(RF, OutData%SlD) ! SlD call FAST_UnpackMAP_Data(RF, OutData%MAP) ! MAP call FAST_UnpackFEAMooring_Data(RF, OutData%FEAM) ! FEAM call FAST_UnpackMoorDyn_Data(RF, OutData%MD) ! MD @@ -15413,5 +9589,7 @@ subroutine FAST_UnPackTurbineType(RF, OutData) call FAST_UnpackIceDyn_Data(RF, OutData%IceD) ! IceD call FAST_UnpackExtPtfm_Data(RF, OutData%ExtPtfm) ! ExtPtfm end subroutine + END MODULE FAST_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/openfast-library/src/Glue_Registry.txt b/modules/openfast-library/src/Glue_Registry.txt new file mode 100644 index 0000000000..c098ee5537 --- /dev/null +++ b/modules/openfast-library/src/Glue_Registry.txt @@ -0,0 +1,203 @@ +#---------------------------------------------------------------------------------------------------------------------------------- +# Registry for FAST v8 in the FAST Modularization Framework +# This Registry file is used to create FAST_Types which contains data used in the FAST glue code. +# It also contains copy, destroy, pack, and unpack routines associated with each defined data types. +# See the NWTC Programmer's Handbook for further information on the format/contents of this file. +# +# Entries are of the form +# +# +# Use ^ as a shortcut for the value in the same column from the previous line. +#---------------------------------------------------------------------------------------------------------------------------------- +include Registry_NWTC_Library.txt + +#---------------------------------------------------------------------------------------------------------------------------------- +# Module Mapping Type (Variable, Load Mesh, Motion Mesh) +#---------------------------------------------------------------------------------------------------------------------------------- + +param Glue - IntKi Map_LoadMesh - 1 - "Load mesh mapping type" - +param ^ - IntKi Map_MotionMesh - 2 - "Motion mesh mapping type" - +param ^ - IntKi Map_Variable - 3 - "Individual variable mapping type" - +param ^ - IntKi Map_Custom - 4 - "Custom mapping not used for linearization" - + +typedef ^ VarMapType IntKi iMapping - 0 - "Mapping index" +typedef ^ ^ IntKi iModSrc - 0 - "Source module index in module array" +typedef ^ ^ IntKi iModDst - 0 - "Destination module index in module array" +typedef ^ ^ IntKi iVarSrc 10 0 - "Source variable indices (Vars%y)" +typedef ^ ^ IntKi iVarSrcDisp 10 0 - "Source variable indices (Vars%u)" +typedef ^ ^ IntKi iVarDst 10 0 - "Destination variable indices (Vars%u)" +typedef ^ ^ IntKi iVarDstDisp 10 0 - "Destination variable indices (Vars%y)" + +typedef ^ ModGlueType character(ChanLen) Name - - - "Glue name" - +typedef ^ ^ ModDataType ModData : - - "Array of module info" - +typedef ^ ^ ModVarsType Vars - - - "Combined module variables" - +typedef ^ ^ ModLinType Lin - - - "Glue linearization data" - +typedef ^ ^ VarMapType VarMaps : - - "Var mapping" + +typedef ^ MappingType character(128) Desc - - - "Description of mapping (used to lookup non-mesh maps)" - +typedef ^ ^ IntKi iModSrc - 0 - "Source module index in ModData array" - +typedef ^ ^ IntKi iModDst - 0 - "Destination module index in ModData array" - +typedef ^ ^ IntKi SrcModID - 0 - "Source module ID" - +typedef ^ ^ IntKi DstModID - 0 - "Destination module ID" - +typedef ^ ^ IntKi SrcIns - 0 - "Source module Instance" - +typedef ^ ^ IntKi DstIns - 0 - "Destination module Instance" - +typedef ^ ^ DatLoc SrcDL - - - "Source mesh locator (number and indices)" - +typedef ^ ^ DatLoc DstDL - - - "Destination mesh locator (number and indices)" - +typedef ^ ^ DatLoc SrcDispDL - - - "Source displacement mesh locator (number and indices)" - +typedef ^ ^ DatLoc DstDispDL - - - "Destination displacement mesh locator (number and indices)" - +typedef ^ ^ IntKi MapType - 0 - "Integer denoting mapping type (1=Load Mesh, 2=Motion Mesh, 3=Variable, 4=Custom)" - +typedef ^ ^ IntKi XfrType - 0 - "Integer denoting transfer type (1=P-to-P, 2=L-to-P, 3=P-to-L, 4=L-to-L)" - +typedef ^ ^ IntKi XfrTypeAux - 0 - "Integer denoting transfer type to auxiliary mesh (1=P-to-P, 2=L-to-P, 3=P-to-L, 4=L-to-L)" - +typedef ^ ^ IntKi i - 0 - "Integer for custom mapping index" - +typedef ^ ^ logical Ready - F - "Flag indicating source data is ready to be transferred" - +typedef ^ ^ logical DstUsesSibling - F - "Flag indicating the destination displacement mesh is a sibling of the source destination load mesh" - +typedef ^ ^ R8Ki TmpMatrix :: - - "Temporary matrix for performing transfer for destination load meshes without sibling motion meshes" - +typedef ^ ^ R8Ki VarData : - - "Data array for variable mapping" - +typedef ^ ^ ModVarType SrcVar - - - "Source variable for variable mapping" - +typedef ^ ^ ModVarType DstVar - - - "Destination variable for variable mapping" - +typedef ^ ^ MeshMapType MeshMap - - - "Mesh mapping from Source variable to Destination variable" - +typedef ^ ^ MeshMapType MeshMapAux - - - "Auxiliary mesh mapping for destination load meshes without sibling motion mesh" - +typedef ^ ^ MeshType TmpLoadMesh - - - "Temporary load mesh for intermediate transfers" - +typedef ^ ^ MeshType TmpMotionMesh - - - "Temporary motion mesh for intermediate transfers" - + +#---------------------------------------------------------------------------------------------------------------------------------- +# Glue Parameters +#---------------------------------------------------------------------------------------------------------------------------------- + +typedef ^ Glue_LinParam IntKi NumTimes - - - "Number of times to linearize" - +typedef ^ ^ IntKi InterpOrder - - - "Interpolation order" - +typedef ^ ^ logical SaveOPs - - - "flag to save operating points during linearization" - +typedef ^ ^ IntKi iMod : - - "ModData index order for linearization" - + +typedef ^ Glue_TCParam R8Ki h - - - "solution time step" - +typedef ^ ^ R8Ki ConvTol - - - "Solution convergence tolerance" - +typedef ^ ^ IntKi ModCoupling - - - "Module coupling method {1=loose; 2=tight with fixed Jacobian updates (DT_UJac); 3=tight with automatic Jacobian updates}" - +typedef ^ ^ IntKi NumCrctn - - - "" - +typedef ^ ^ IntKi MaxConvIter - - - "" - +typedef ^ ^ IntKi NIter_UJac - - - "Number of solution iterations between updating the Jacobian" - +typedef ^ ^ IntKi NStep_UJac - - - "Number of global time steps between updating the Jacobian" - +typedef ^ ^ R8Ki Scale_UJac - - - "Jacobian load scaling factor" - +typedef ^ ^ R8Ki RhoInf - - - "Rho infinity used for calculating Generalized-alpha coefficients" - +typedef ^ ^ R8Ki AlphaM - - - "Generalized-alpha alpha_m coefficient" - +typedef ^ ^ R8Ki AlphaF - - - "Generalized-alpha alpha_f coefficient" - +typedef ^ ^ R8Ki Beta - - - "Generalized-alpha beta coefficient" - +typedef ^ ^ R8Ki Gamma - - - "Generalized-alpha gamma coefficient" - +typedef ^ ^ R8Ki BetaPrime - - - "Generalized-alpha beta prime" - +typedef ^ ^ R8Ki GammaPrime - - - "Generalized-alpha gamma prime" - +typedef ^ ^ IntKi NumJ - - - "Number of values in Jacobian" - +typedef ^ ^ IntKi NumQ - - - "Number of states in Jacobian" - +typedef ^ ^ IntKi NumU - - - "Number of total inputs in Jacobian" - +typedef ^ ^ IntKi NumUT - - - "Number of TC inputs in Jacobian" - +typedef ^ ^ IntKi iX1 2 - - "" - +typedef ^ ^ IntKi iX2 2 - - "" - +typedef ^ ^ IntKi iUT 2 - - "" - +typedef ^ ^ IntKi iU1 2 - - "" - +typedef ^ ^ IntKi iUL 2 - - "Input load indices" - +typedef ^ ^ IntKi iyT 2 - - "" - +typedef ^ ^ IntKi iy1 2 - - "" - +typedef ^ ^ IntKi iJX 2 - - "Indices of Jacobian q variables" - +typedef ^ ^ IntKi iJU 2 - - "Indices of Jacobian input variables" - +typedef ^ ^ IntKi iJUT 2 - - "Indices of Jacobian input variables from tight coupling" - +typedef ^ ^ IntKi iJL 2 - - "Indices of Jacobian load variables" - +typedef ^ ^ IntKi iModInit : - - "ModData index order for step 0 initialization" - +typedef ^ ^ IntKi iModTC : - - "ModData index order for tight coupling modules" - +typedef ^ ^ IntKi iModOpt1 : - - "ModData index order for option 1 modules" - +typedef ^ ^ IntKi iModOpt2 : - - "ModData index order for option 2 modules" - +typedef ^ ^ IntKi iModPost : - - "ModData index order for post option 1 modules" - + +typedef ^ Glue_ParameterType Glue_LinParam Lin - - - "Linearization parameters" +typedef ^ ^ Glue_TCParam TC - - - "Tight Coupling solver parameters" + +#---------------------------------------------------------------------------------------------------------------------------------- +# Output Data +#---------------------------------------------------------------------------------------------------------------------------------- + +typedef ^ Glue_LinSave R8Ki Times : - - "linearization times" - +typedef ^ ^ R8Ki u :: - - "linearization operating point input" - +typedef ^ ^ R8Ki x :: - - "linearization operating point continuous state" - +typedef ^ ^ R8Ki xd :: - - "linearization operating point discrete state" - +typedef ^ ^ R8Ki z :: - - "linearization operating point constraint state" - +typedef ^ ^ R8Ki OtherSt :: - - "linearization operating point other state" - + +typedef ^ Glue_OutputFileType Glue_LinSave Lin - - - "Operating point data for linearization" + +#---------------------------------------------------------------------------------------------------------------------------------- +# Miscellaneous Data +#---------------------------------------------------------------------------------------------------------------------------------- + +typedef ^ Glue_CalcSteady R8Ki AzimuthTarget : - - "target azimuth positions where outputs are calculated" - +typedef ^ ^ R8Ki AzimuthDelta - - - "" - +typedef ^ ^ logical IsConverged - - - "Steady State calculation is converged" - +typedef ^ ^ logical FoundSteady - - - "" - +typedef ^ ^ logical ForceLin - - - "" - +typedef ^ ^ IntKi NumRotations - - - "Number of rotor rotations" - +typedef ^ ^ IntKi NumOutputs - - - "Number of output values (ignoring write outputs)" - +typedef ^ ^ R8Ki psi_buffer : - - "azimuth buffer for interpolation" - +typedef ^ ^ R8Ki y_buffer :: - - "output buffer for interpolation" - +typedef ^ ^ R8Ki y_azimuth :: - - "output values at target azimuths" - +typedef ^ ^ R8Ki y_interp : - - "output values interpolated to target azimuth" - +typedef ^ ^ R8Ki y_diff : - - "difference between outputs from current and previous rotation" - +typedef ^ ^ R8Ki y_ref : - - "reference output values for error calculation" - + +typedef ^ AeroMapCase ReKi RotSpeed - - - "Rotor speed for this case of the steady-state solve [>0]" "rad/s" +typedef ^ ^ ReKi TSR - - - "TSR for this case of the steady-state solve [>0]" "-" +typedef ^ ^ ReKi WindSpeed - - - "Windspeed for this case of the steady-state solve [>0]" "m/s" +typedef ^ ^ ReKi Pitch - - - "Pitch angle for this case of the steady-state solve" "rad" + +typedef ^ Glue_AeroMap IntKi iModOrder : - - "Module indices in global ModDataAry" +typedef ^ ^ ModGlueType Mod - - - "Module combining all active modules" - +typedef ^ ^ R8Ki Jac11 :: - - "Components of Jacobian matrix" - +typedef ^ ^ R8Ki Jac12 :: - - "Components of Jacobian matrix" - +typedef ^ ^ R8Ki Jac21 :: - - "Components of Jacobian matrix" - +typedef ^ ^ R8Ki Jac22 :: - - "Components of Jacobian matrix" - +typedef ^ ^ IntKi JacPivot : - - "Jacobian matrix pivot array" - +typedef ^ ^ R8Ki JacScale - - - "Jacobian scaling factor for loads" - +typedef ^ ^ R8Ki SolveTolerance - - - "Allowable solution tolerance" - +typedef ^ ^ R8Ki HubOrientation ::: - - "Hub orientation matrix for each blade" - +typedef ^ ^ R8Ki u1 : - - "" - +typedef ^ ^ R8Ki u2 : - - "" - +typedef ^ ^ R8Ki Residual : - - "" - +typedef ^ ^ R8Ki SolveDelta : - - "" - +typedef ^ ^ AeroMapCase Cases : - - "cases to run for aero mapping" - +typedef ^ ^ IntKi LinFileNum - 1 - "Linearization file number" - + +typedef ^ TC_State R8Ki q_prev : - - "Generalized alpha previous step displacement" - +typedef ^ ^ R8Ki x : - - "Generalized alpha change in displacement" - +typedef ^ ^ R8Ki q : - - "Generalized alpha predicted displacement" - +typedef ^ ^ R8Ki v : - - "Generalized alpha velocities" - +typedef ^ ^ R8Ki vd : - - "Generalized alpha acceleration" - +typedef ^ ^ R8Ki a : - - "Generalized alpha algorithmic acceleration" - + +typedef ^ Glue_TCMisc ModGlueType Mod - - - "Glue module combining tight coupling modules" - +typedef ^ ^ TC_State StateCurr - - - "Tight Coupling current state" +typedef ^ ^ TC_State StatePred - - - "Tight Coupling predicted state" +typedef ^ ^ R8Ki UCalc : - - "" - +typedef ^ ^ R8Ki XB :: - - "" - +typedef ^ ^ IntKi IPIV : - - "" - +typedef ^ ^ IntKi IterTotal - 0 - "" - +typedef ^ ^ IntKi UJacIterRemain - 0 - "Number of convergence iterations until Jacobian update" - +typedef ^ ^ IntKi UJacStepsRemain - 0 - "Number of time steps until Jacobian update" - +typedef ^ ^ logical ConvWarn - - - "Flag to warn about convergence failure" - +typedef ^ ^ R8Ki IO_R : - - "Input Solve residual (RHS)" - +typedef ^ ^ R8Ki IO_X :: - - "Input Solve delta input" - +typedef ^ ^ R8Ki IO_Jac :: - - "Input Solve jacobian" - +typedef ^ ^ R8Ki J11 :: - - "Jacobian upper left quadrant" - +typedef ^ ^ R8Ki J12 :: - - "Jacobian upper right quadrant" - +typedef ^ ^ R8Ki J21 :: - - "Jacobian lower left quadrant" - +typedef ^ ^ R8Ki J22 :: - - "Jacobian lower right quadrant" - +typedef ^ ^ R8Ki Tan :: - - "State tangent matrix" - + +typedef ^ Glue_LinMisc IntKi TimeIndex - - - "" - +typedef ^ ^ IntKi AzimuthIndex - - - "" - +typedef ^ ^ logical IsConverged - - - "" - + +typedef ^ Glue_External MeshType SubstructureLoadsFF - - - "Externally applied substructure loads from FAST.Farm" - + +typedef ^ Glue_MiscVarType ModDataType ModData : - - "Module variable and value data" - +typedef ^ ^ MappingType Mappings : - - "Module mapping" - +typedef ^ ^ ModGlueType ModGlue - - - "Glue code module" - +typedef ^ ^ Glue_External Ext - - - "External data (ie. FAST.Farm)" - +typedef ^ ^ Glue_LinMisc Lin - - - "Linearization misc vars" +typedef ^ ^ Glue_CalcSteady CS - - - "CalcSteady calculation data" +typedef ^ ^ Glue_AeroMap AM - - - "AeroMap data" +typedef ^ ^ Glue_TCMisc TC - - - "Tight Coupling Miscellaneous data" diff --git a/modules/openfast-library/src/Glue_Types.f90 b/modules/openfast-library/src/Glue_Types.f90 new file mode 100644 index 0000000000..cdbfd4dc5b --- /dev/null +++ b/modules/openfast-library/src/Glue_Types.f90 @@ -0,0 +1,2390 @@ +!STARTOFREGISTRYGENERATEDFILE 'Glue_Types.f90' +! +! WARNING This file is generated automatically by the FAST registry. +! Do not edit. Your changes to this file will be lost. +! +! FAST Registry +!********************************************************************************************************************************* +! Glue_Types +!................................................................................................................................. +! This file is part of Glue. +! +! Copyright (C) 2012-2016 National Renewable Energy Laboratory +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +! +! W A R N I N G : This file was automatically generated from the FAST registry. Changes made to this file may be lost. +! +!********************************************************************************************************************************* +!> This module contains the user-defined types needed in Glue. It also contains copy, destroy, pack, and +!! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. +MODULE Glue_Types +!--------------------------------------------------------------------------------------------------------------------------------- +USE NWTC_Library +IMPLICIT NONE + INTEGER(IntKi), PUBLIC, PARAMETER :: Map_LoadMesh = 1 ! Load mesh mapping type [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Map_MotionMesh = 2 ! Motion mesh mapping type [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Map_Variable = 3 ! Individual variable mapping type [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Map_Custom = 4 ! Custom mapping not used for linearization [-] +! ========= VarMapType ======= + TYPE, PUBLIC :: VarMapType + INTEGER(IntKi) :: iMapping = 0 !< Mapping index [-] + INTEGER(IntKi) :: iModSrc = 0 !< Source module index in module array [-] + INTEGER(IntKi) :: iModDst = 0 !< Destination module index in module array [-] + INTEGER(IntKi) , DIMENSION(1:10) :: iVarSrc = 0 !< Source variable indices (Vars%y) [-] + INTEGER(IntKi) , DIMENSION(1:10) :: iVarSrcDisp = 0 !< Source variable indices (Vars%u) [-] + INTEGER(IntKi) , DIMENSION(1:10) :: iVarDst = 0 !< Destination variable indices (Vars%u) [-] + INTEGER(IntKi) , DIMENSION(1:10) :: iVarDstDisp = 0 !< Destination variable indices (Vars%y) [-] + END TYPE VarMapType +! ======================= +! ========= ModGlueType ======= + TYPE, PUBLIC :: ModGlueType + character(ChanLen) :: Name !< Glue name [-] + TYPE(ModDataType) , DIMENSION(:), ALLOCATABLE :: ModData !< Array of module info [-] + TYPE(ModVarsType) :: Vars !< Combined module variables [-] + TYPE(ModLinType) :: Lin !< Glue linearization data [-] + TYPE(VarMapType) , DIMENSION(:), ALLOCATABLE :: VarMaps !< Var mapping [-] + END TYPE ModGlueType +! ======================= +! ========= MappingType ======= + TYPE, PUBLIC :: MappingType + character(128) :: Desc !< Description of mapping (used to lookup non-mesh maps) [-] + INTEGER(IntKi) :: iModSrc = 0 !< Source module index in ModData array [-] + INTEGER(IntKi) :: iModDst = 0 !< Destination module index in ModData array [-] + INTEGER(IntKi) :: SrcModID = 0 !< Source module ID [-] + INTEGER(IntKi) :: DstModID = 0 !< Destination module ID [-] + INTEGER(IntKi) :: SrcIns = 0 !< Source module Instance [-] + INTEGER(IntKi) :: DstIns = 0 !< Destination module Instance [-] + TYPE(DatLoc) :: SrcDL !< Source mesh locator (number and indices) [-] + TYPE(DatLoc) :: DstDL !< Destination mesh locator (number and indices) [-] + TYPE(DatLoc) :: SrcDispDL !< Source displacement mesh locator (number and indices) [-] + TYPE(DatLoc) :: DstDispDL !< Destination displacement mesh locator (number and indices) [-] + INTEGER(IntKi) :: MapType = 0 !< Integer denoting mapping type (1=Load Mesh, 2=Motion Mesh, 3=Variable, 4=Custom) [-] + INTEGER(IntKi) :: XfrType = 0 !< Integer denoting transfer type (1=P-to-P, 2=L-to-P, 3=P-to-L, 4=L-to-L) [-] + INTEGER(IntKi) :: XfrTypeAux = 0 !< Integer denoting transfer type to auxiliary mesh (1=P-to-P, 2=L-to-P, 3=P-to-L, 4=L-to-L) [-] + INTEGER(IntKi) :: i = 0 !< Integer for custom mapping index [-] + LOGICAL :: Ready = .false. !< Flag indicating source data is ready to be transferred [-] + LOGICAL :: DstUsesSibling = .false. !< Flag indicating the destination displacement mesh is a sibling of the source destination load mesh [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: TmpMatrix !< Temporary matrix for performing transfer for destination load meshes without sibling motion meshes [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: VarData !< Data array for variable mapping [-] + TYPE(ModVarType) :: SrcVar !< Source variable for variable mapping [-] + TYPE(ModVarType) :: DstVar !< Destination variable for variable mapping [-] + TYPE(MeshMapType) :: MeshMap !< Mesh mapping from Source variable to Destination variable [-] + TYPE(MeshMapType) :: MeshMapAux !< Auxiliary mesh mapping for destination load meshes without sibling motion mesh [-] + TYPE(MeshType) :: TmpLoadMesh !< Temporary load mesh for intermediate transfers [-] + TYPE(MeshType) :: TmpMotionMesh !< Temporary motion mesh for intermediate transfers [-] + END TYPE MappingType +! ======================= +! ========= Glue_LinParam ======= + TYPE, PUBLIC :: Glue_LinParam + INTEGER(IntKi) :: NumTimes = 0_IntKi !< Number of times to linearize [-] + INTEGER(IntKi) :: InterpOrder = 0_IntKi !< Interpolation order [-] + LOGICAL :: SaveOPs = .false. !< flag to save operating points during linearization [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iMod !< ModData index order for linearization [-] + END TYPE Glue_LinParam +! ======================= +! ========= Glue_TCParam ======= + TYPE, PUBLIC :: Glue_TCParam + REAL(R8Ki) :: h = 0.0_R8Ki !< solution time step [-] + REAL(R8Ki) :: ConvTol = 0.0_R8Ki !< Solution convergence tolerance [-] + INTEGER(IntKi) :: ModCoupling = 0_IntKi !< Module coupling method {1=loose; 2=tight with fixed Jacobian updates (DT_UJac); 3=tight with automatic Jacobian updates} [-] + INTEGER(IntKi) :: NumCrctn = 0_IntKi !< [-] + INTEGER(IntKi) :: MaxConvIter = 0_IntKi !< [-] + INTEGER(IntKi) :: NIter_UJac = 0_IntKi !< Number of solution iterations between updating the Jacobian [-] + INTEGER(IntKi) :: NStep_UJac = 0_IntKi !< Number of global time steps between updating the Jacobian [-] + REAL(R8Ki) :: Scale_UJac = 0.0_R8Ki !< Jacobian load scaling factor [-] + REAL(R8Ki) :: RhoInf = 0.0_R8Ki !< Rho infinity used for calculating Generalized-alpha coefficients [-] + REAL(R8Ki) :: AlphaM = 0.0_R8Ki !< Generalized-alpha alpha_m coefficient [-] + REAL(R8Ki) :: AlphaF = 0.0_R8Ki !< Generalized-alpha alpha_f coefficient [-] + REAL(R8Ki) :: Beta = 0.0_R8Ki !< Generalized-alpha beta coefficient [-] + REAL(R8Ki) :: Gamma = 0.0_R8Ki !< Generalized-alpha gamma coefficient [-] + REAL(R8Ki) :: BetaPrime = 0.0_R8Ki !< Generalized-alpha beta prime [-] + REAL(R8Ki) :: GammaPrime = 0.0_R8Ki !< Generalized-alpha gamma prime [-] + INTEGER(IntKi) :: NumJ = 0_IntKi !< Number of values in Jacobian [-] + INTEGER(IntKi) :: NumQ = 0_IntKi !< Number of states in Jacobian [-] + INTEGER(IntKi) :: NumU = 0_IntKi !< Number of total inputs in Jacobian [-] + INTEGER(IntKi) :: NumUT = 0_IntKi !< Number of TC inputs in Jacobian [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iX1 = 0_IntKi !< [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iX2 = 0_IntKi !< [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iUT = 0_IntKi !< [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iU1 = 0_IntKi !< [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iUL = 0_IntKi !< Input load indices [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iyT = 0_IntKi !< [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iy1 = 0_IntKi !< [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iJX = 0_IntKi !< Indices of Jacobian q variables [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iJU = 0_IntKi !< Indices of Jacobian input variables [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iJUT = 0_IntKi !< Indices of Jacobian input variables from tight coupling [-] + INTEGER(IntKi) , DIMENSION(1:2) :: iJL = 0_IntKi !< Indices of Jacobian load variables [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iModInit !< ModData index order for step 0 initialization [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iModTC !< ModData index order for tight coupling modules [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iModOpt1 !< ModData index order for option 1 modules [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iModOpt2 !< ModData index order for option 2 modules [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iModPost !< ModData index order for post option 1 modules [-] + END TYPE Glue_TCParam +! ======================= +! ========= Glue_ParameterType ======= + TYPE, PUBLIC :: Glue_ParameterType + TYPE(Glue_LinParam) :: Lin !< Linearization parameters [-] + TYPE(Glue_TCParam) :: TC !< Tight Coupling solver parameters [-] + END TYPE Glue_ParameterType +! ======================= +! ========= Glue_LinSave ======= + TYPE, PUBLIC :: Glue_LinSave + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: Times !< linearization times [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: u !< linearization operating point input [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: x !< linearization operating point continuous state [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: xd !< linearization operating point discrete state [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: z !< linearization operating point constraint state [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: OtherSt !< linearization operating point other state [-] + END TYPE Glue_LinSave +! ======================= +! ========= Glue_OutputFileType ======= + TYPE, PUBLIC :: Glue_OutputFileType + TYPE(Glue_LinSave) :: Lin !< Operating point data for linearization [-] + END TYPE Glue_OutputFileType +! ======================= +! ========= Glue_CalcSteady ======= + TYPE, PUBLIC :: Glue_CalcSteady + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: AzimuthTarget !< target azimuth positions where outputs are calculated [-] + REAL(R8Ki) :: AzimuthDelta = 0.0_R8Ki !< [-] + LOGICAL :: IsConverged = .false. !< Steady State calculation is converged [-] + LOGICAL :: FoundSteady = .false. !< [-] + LOGICAL :: ForceLin = .false. !< [-] + INTEGER(IntKi) :: NumRotations = 0_IntKi !< Number of rotor rotations [-] + INTEGER(IntKi) :: NumOutputs = 0_IntKi !< Number of output values (ignoring write outputs) [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: psi_buffer !< azimuth buffer for interpolation [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: y_buffer !< output buffer for interpolation [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: y_azimuth !< output values at target azimuths [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: y_interp !< output values interpolated to target azimuth [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: y_diff !< difference between outputs from current and previous rotation [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: y_ref !< reference output values for error calculation [-] + END TYPE Glue_CalcSteady +! ======================= +! ========= AeroMapCase ======= + TYPE, PUBLIC :: AeroMapCase + REAL(ReKi) :: RotSpeed = 0.0_ReKi !< Rotor speed for this case of the steady-state solve [>0] [rad/s] + REAL(ReKi) :: TSR = 0.0_ReKi !< TSR for this case of the steady-state solve [>0] [-] + REAL(ReKi) :: WindSpeed = 0.0_ReKi !< Windspeed for this case of the steady-state solve [>0] [m/s] + REAL(ReKi) :: Pitch = 0.0_ReKi !< Pitch angle for this case of the steady-state solve [rad] + END TYPE AeroMapCase +! ======================= +! ========= Glue_AeroMap ======= + TYPE, PUBLIC :: Glue_AeroMap + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: iModOrder !< Module indices in global ModDataAry [-] + TYPE(ModGlueType) :: Mod !< Module combining all active modules [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: Jac11 !< Components of Jacobian matrix [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: Jac12 !< Components of Jacobian matrix [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: Jac21 !< Components of Jacobian matrix [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: Jac22 !< Components of Jacobian matrix [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: JacPivot !< Jacobian matrix pivot array [-] + REAL(R8Ki) :: JacScale = 0.0_R8Ki !< Jacobian scaling factor for loads [-] + REAL(R8Ki) :: SolveTolerance = 0.0_R8Ki !< Allowable solution tolerance [-] + REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: HubOrientation !< Hub orientation matrix for each blade [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: u1 !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: u2 !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: Residual !< [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: SolveDelta !< [-] + TYPE(AeroMapCase) , DIMENSION(:), ALLOCATABLE :: Cases !< cases to run for aero mapping [-] + INTEGER(IntKi) :: LinFileNum = 1 !< Linearization file number [-] + END TYPE Glue_AeroMap +! ======================= +! ========= TC_State ======= + TYPE, PUBLIC :: TC_State + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: q_prev !< Generalized alpha previous step displacement [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: x !< Generalized alpha change in displacement [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: q !< Generalized alpha predicted displacement [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: v !< Generalized alpha velocities [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: vd !< Generalized alpha acceleration [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: a !< Generalized alpha algorithmic acceleration [-] + END TYPE TC_State +! ======================= +! ========= Glue_TCMisc ======= + TYPE, PUBLIC :: Glue_TCMisc + TYPE(ModGlueType) :: Mod !< Glue module combining tight coupling modules [-] + TYPE(TC_State) :: StateCurr !< Tight Coupling current state [-] + TYPE(TC_State) :: StatePred !< Tight Coupling predicted state [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: UCalc !< [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: XB !< [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IPIV !< [-] + INTEGER(IntKi) :: IterTotal = 0 !< [-] + INTEGER(IntKi) :: UJacIterRemain = 0 !< Number of convergence iterations until Jacobian update [-] + INTEGER(IntKi) :: UJacStepsRemain = 0 !< Number of time steps until Jacobian update [-] + LOGICAL :: ConvWarn = .false. !< Flag to warn about convergence failure [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: IO_R !< Input Solve residual (RHS) [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: IO_X !< Input Solve delta input [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: IO_Jac !< Input Solve jacobian [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: J11 !< Jacobian upper left quadrant [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: J12 !< Jacobian upper right quadrant [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: J21 !< Jacobian lower left quadrant [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: J22 !< Jacobian lower right quadrant [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: Tan !< State tangent matrix [-] + END TYPE Glue_TCMisc +! ======================= +! ========= Glue_LinMisc ======= + TYPE, PUBLIC :: Glue_LinMisc + INTEGER(IntKi) :: TimeIndex = 0_IntKi !< [-] + INTEGER(IntKi) :: AzimuthIndex = 0_IntKi !< [-] + LOGICAL :: IsConverged = .false. !< [-] + END TYPE Glue_LinMisc +! ======================= +! ========= Glue_External ======= + TYPE, PUBLIC :: Glue_External + TYPE(MeshType) :: SubstructureLoadsFF !< Externally applied substructure loads from FAST.Farm [-] + END TYPE Glue_External +! ======================= +! ========= Glue_MiscVarType ======= + TYPE, PUBLIC :: Glue_MiscVarType + TYPE(ModDataType) , DIMENSION(:), ALLOCATABLE :: ModData !< Module variable and value data [-] + TYPE(MappingType) , DIMENSION(:), ALLOCATABLE :: Mappings !< Module mapping [-] + TYPE(ModGlueType) :: ModGlue !< Glue code module [-] + TYPE(Glue_External) :: Ext !< External data (ie. FAST.Farm) [-] + TYPE(Glue_LinMisc) :: Lin !< Linearization misc vars [-] + TYPE(Glue_CalcSteady) :: CS !< CalcSteady calculation data [-] + TYPE(Glue_AeroMap) :: AM !< AeroMap data [-] + TYPE(Glue_TCMisc) :: TC !< Tight Coupling Miscellaneous data [-] + END TYPE Glue_MiscVarType +! ======================= + +contains + +subroutine Glue_CopyVarMapType(SrcVarMapTypeData, DstVarMapTypeData, CtrlCode, ErrStat, ErrMsg) + type(VarMapType), intent(in) :: SrcVarMapTypeData + type(VarMapType), intent(inout) :: DstVarMapTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_CopyVarMapType' + ErrStat = ErrID_None + ErrMsg = '' + DstVarMapTypeData%iMapping = SrcVarMapTypeData%iMapping + DstVarMapTypeData%iModSrc = SrcVarMapTypeData%iModSrc + DstVarMapTypeData%iModDst = SrcVarMapTypeData%iModDst + DstVarMapTypeData%iVarSrc = SrcVarMapTypeData%iVarSrc + DstVarMapTypeData%iVarSrcDisp = SrcVarMapTypeData%iVarSrcDisp + DstVarMapTypeData%iVarDst = SrcVarMapTypeData%iVarDst + DstVarMapTypeData%iVarDstDisp = SrcVarMapTypeData%iVarDstDisp +end subroutine + +subroutine Glue_DestroyVarMapType(VarMapTypeData, ErrStat, ErrMsg) + type(VarMapType), intent(inout) :: VarMapTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_DestroyVarMapType' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine Glue_PackVarMapType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(VarMapType), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackVarMapType' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%iMapping) + call RegPack(RF, InData%iModSrc) + call RegPack(RF, InData%iModDst) + call RegPack(RF, InData%iVarSrc) + call RegPack(RF, InData%iVarSrcDisp) + call RegPack(RF, InData%iVarDst) + call RegPack(RF, InData%iVarDstDisp) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackVarMapType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(VarMapType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackVarMapType' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%iMapping); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iModSrc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iModDst); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iVarSrc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iVarSrcDisp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iVarDst); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iVarDstDisp); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyModGlueType(SrcModGlueTypeData, DstModGlueTypeData, CtrlCode, ErrStat, ErrMsg) + type(ModGlueType), intent(in) :: SrcModGlueTypeData + type(ModGlueType), intent(inout) :: DstModGlueTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_CopyModGlueType' + ErrStat = ErrID_None + ErrMsg = '' + DstModGlueTypeData%Name = SrcModGlueTypeData%Name + if (allocated(SrcModGlueTypeData%ModData)) then + LB(1:1) = lbound(SrcModGlueTypeData%ModData) + UB(1:1) = ubound(SrcModGlueTypeData%ModData) + if (.not. allocated(DstModGlueTypeData%ModData)) then + allocate(DstModGlueTypeData%ModData(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstModGlueTypeData%ModData.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call NWTC_Library_CopyModDataType(SrcModGlueTypeData%ModData(i1), DstModGlueTypeData%ModData(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call NWTC_Library_CopyModVarsType(SrcModGlueTypeData%Vars, DstModGlueTypeData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyModLinType(SrcModGlueTypeData%Lin, DstModGlueTypeData%Lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcModGlueTypeData%VarMaps)) then + LB(1:1) = lbound(SrcModGlueTypeData%VarMaps) + UB(1:1) = ubound(SrcModGlueTypeData%VarMaps) + if (.not. allocated(DstModGlueTypeData%VarMaps)) then + allocate(DstModGlueTypeData%VarMaps(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstModGlueTypeData%VarMaps.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call Glue_CopyVarMapType(SrcModGlueTypeData%VarMaps(i1), DstModGlueTypeData%VarMaps(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if +end subroutine + +subroutine Glue_DestroyModGlueType(ModGlueTypeData, ErrStat, ErrMsg) + type(ModGlueType), intent(inout) :: ModGlueTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_DestroyModGlueType' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(ModGlueTypeData%ModData)) then + LB(1:1) = lbound(ModGlueTypeData%ModData) + UB(1:1) = ubound(ModGlueTypeData%ModData) + do i1 = LB(1), UB(1) + call NWTC_Library_DestroyModDataType(ModGlueTypeData%ModData(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ModGlueTypeData%ModData) + end if + call NWTC_Library_DestroyModVarsType(ModGlueTypeData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModLinType(ModGlueTypeData%Lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(ModGlueTypeData%VarMaps)) then + LB(1:1) = lbound(ModGlueTypeData%VarMaps) + UB(1:1) = ubound(ModGlueTypeData%VarMaps) + do i1 = LB(1), UB(1) + call Glue_DestroyVarMapType(ModGlueTypeData%VarMaps(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ModGlueTypeData%VarMaps) + end if +end subroutine + +subroutine Glue_PackModGlueType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(ModGlueType), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackModGlueType' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%Name) + call RegPack(RF, allocated(InData%ModData)) + if (allocated(InData%ModData)) then + call RegPackBounds(RF, 1, lbound(InData%ModData), ubound(InData%ModData)) + LB(1:1) = lbound(InData%ModData) + UB(1:1) = ubound(InData%ModData) + do i1 = LB(1), UB(1) + call NWTC_Library_PackModDataType(RF, InData%ModData(i1)) + end do + end if + call NWTC_Library_PackModVarsType(RF, InData%Vars) + call NWTC_Library_PackModLinType(RF, InData%Lin) + call RegPack(RF, allocated(InData%VarMaps)) + if (allocated(InData%VarMaps)) then + call RegPackBounds(RF, 1, lbound(InData%VarMaps), ubound(InData%VarMaps)) + LB(1:1) = lbound(InData%VarMaps) + UB(1:1) = ubound(InData%VarMaps) + do i1 = LB(1), UB(1) + call Glue_PackVarMapType(RF, InData%VarMaps(i1)) + end do + end if + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackModGlueType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(ModGlueType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackModGlueType' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%Name); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%ModData)) deallocate(OutData%ModData) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%ModData(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ModData.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call NWTC_Library_UnpackModDataType(RF, OutData%ModData(i1)) ! ModData + end do + end if + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars + call NWTC_Library_UnpackModLinType(RF, OutData%Lin) ! Lin + if (allocated(OutData%VarMaps)) deallocate(OutData%VarMaps) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%VarMaps(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%VarMaps.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call Glue_UnpackVarMapType(RF, OutData%VarMaps(i1)) ! VarMaps + end do + end if +end subroutine + +subroutine Glue_CopyMappingType(SrcMappingTypeData, DstMappingTypeData, CtrlCode, ErrStat, ErrMsg) + type(MappingType), intent(inout) :: SrcMappingTypeData + type(MappingType), intent(inout) :: DstMappingTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_CopyMappingType' + ErrStat = ErrID_None + ErrMsg = '' + DstMappingTypeData%Desc = SrcMappingTypeData%Desc + DstMappingTypeData%iModSrc = SrcMappingTypeData%iModSrc + DstMappingTypeData%iModDst = SrcMappingTypeData%iModDst + DstMappingTypeData%SrcModID = SrcMappingTypeData%SrcModID + DstMappingTypeData%DstModID = SrcMappingTypeData%DstModID + DstMappingTypeData%SrcIns = SrcMappingTypeData%SrcIns + DstMappingTypeData%DstIns = SrcMappingTypeData%DstIns + call NWTC_Library_CopyDatLoc(SrcMappingTypeData%SrcDL, DstMappingTypeData%SrcDL, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyDatLoc(SrcMappingTypeData%DstDL, DstMappingTypeData%DstDL, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyDatLoc(SrcMappingTypeData%SrcDispDL, DstMappingTypeData%SrcDispDL, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyDatLoc(SrcMappingTypeData%DstDispDL, DstMappingTypeData%DstDispDL, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstMappingTypeData%MapType = SrcMappingTypeData%MapType + DstMappingTypeData%XfrType = SrcMappingTypeData%XfrType + DstMappingTypeData%XfrTypeAux = SrcMappingTypeData%XfrTypeAux + DstMappingTypeData%i = SrcMappingTypeData%i + DstMappingTypeData%Ready = SrcMappingTypeData%Ready + DstMappingTypeData%DstUsesSibling = SrcMappingTypeData%DstUsesSibling + if (allocated(SrcMappingTypeData%TmpMatrix)) then + LB(1:2) = lbound(SrcMappingTypeData%TmpMatrix) + UB(1:2) = ubound(SrcMappingTypeData%TmpMatrix) + if (.not. allocated(DstMappingTypeData%TmpMatrix)) then + allocate(DstMappingTypeData%TmpMatrix(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMappingTypeData%TmpMatrix.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMappingTypeData%TmpMatrix = SrcMappingTypeData%TmpMatrix + end if + if (allocated(SrcMappingTypeData%VarData)) then + LB(1:1) = lbound(SrcMappingTypeData%VarData) + UB(1:1) = ubound(SrcMappingTypeData%VarData) + if (.not. allocated(DstMappingTypeData%VarData)) then + allocate(DstMappingTypeData%VarData(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMappingTypeData%VarData.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMappingTypeData%VarData = SrcMappingTypeData%VarData + end if + call NWTC_Library_CopyModVarType(SrcMappingTypeData%SrcVar, DstMappingTypeData%SrcVar, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyModVarType(SrcMappingTypeData%DstVar, DstMappingTypeData%DstVar, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyMeshMapType(SrcMappingTypeData%MeshMap, DstMappingTypeData%MeshMap, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyMeshMapType(SrcMappingTypeData%MeshMapAux, DstMappingTypeData%MeshMapAux, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcMappingTypeData%TmpLoadMesh, DstMappingTypeData%TmpLoadMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call MeshCopy(SrcMappingTypeData%TmpMotionMesh, DstMappingTypeData%TmpMotionMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine Glue_DestroyMappingType(MappingTypeData, ErrStat, ErrMsg) + type(MappingType), intent(inout) :: MappingTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_DestroyMappingType' + ErrStat = ErrID_None + ErrMsg = '' + call NWTC_Library_DestroyDatLoc(MappingTypeData%SrcDL, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyDatLoc(MappingTypeData%DstDL, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyDatLoc(MappingTypeData%SrcDispDL, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyDatLoc(MappingTypeData%DstDispDL, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MappingTypeData%TmpMatrix)) then + deallocate(MappingTypeData%TmpMatrix) + end if + if (allocated(MappingTypeData%VarData)) then + deallocate(MappingTypeData%VarData) + end if + call NWTC_Library_DestroyModVarType(MappingTypeData%SrcVar, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModVarType(MappingTypeData%DstVar, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyMeshMapType(MappingTypeData%MeshMap, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyMeshMapType(MappingTypeData%MeshMapAux, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( MappingTypeData%TmpLoadMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( MappingTypeData%TmpMotionMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine Glue_PackMappingType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(MappingType), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackMappingType' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%Desc) + call RegPack(RF, InData%iModSrc) + call RegPack(RF, InData%iModDst) + call RegPack(RF, InData%SrcModID) + call RegPack(RF, InData%DstModID) + call RegPack(RF, InData%SrcIns) + call RegPack(RF, InData%DstIns) + call NWTC_Library_PackDatLoc(RF, InData%SrcDL) + call NWTC_Library_PackDatLoc(RF, InData%DstDL) + call NWTC_Library_PackDatLoc(RF, InData%SrcDispDL) + call NWTC_Library_PackDatLoc(RF, InData%DstDispDL) + call RegPack(RF, InData%MapType) + call RegPack(RF, InData%XfrType) + call RegPack(RF, InData%XfrTypeAux) + call RegPack(RF, InData%i) + call RegPack(RF, InData%Ready) + call RegPack(RF, InData%DstUsesSibling) + call RegPackAlloc(RF, InData%TmpMatrix) + call RegPackAlloc(RF, InData%VarData) + call NWTC_Library_PackModVarType(RF, InData%SrcVar) + call NWTC_Library_PackModVarType(RF, InData%DstVar) + call NWTC_Library_PackMeshMapType(RF, InData%MeshMap) + call NWTC_Library_PackMeshMapType(RF, InData%MeshMapAux) + call MeshPack(RF, InData%TmpLoadMesh) + call MeshPack(RF, InData%TmpMotionMesh) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackMappingType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(MappingType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackMappingType' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%Desc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iModSrc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iModDst); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SrcModID); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DstModID); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SrcIns); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DstIns); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackDatLoc(RF, OutData%SrcDL) ! SrcDL + call NWTC_Library_UnpackDatLoc(RF, OutData%DstDL) ! DstDL + call NWTC_Library_UnpackDatLoc(RF, OutData%SrcDispDL) ! SrcDispDL + call NWTC_Library_UnpackDatLoc(RF, OutData%DstDispDL) ! DstDispDL + call RegUnpack(RF, OutData%MapType); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%XfrType); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%XfrTypeAux); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%i); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Ready); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DstUsesSibling); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TmpMatrix); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%VarData); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarType(RF, OutData%SrcVar) ! SrcVar + call NWTC_Library_UnpackModVarType(RF, OutData%DstVar) ! DstVar + call NWTC_Library_UnpackMeshMapType(RF, OutData%MeshMap) ! MeshMap + call NWTC_Library_UnpackMeshMapType(RF, OutData%MeshMapAux) ! MeshMapAux + call MeshUnpack(RF, OutData%TmpLoadMesh) ! TmpLoadMesh + call MeshUnpack(RF, OutData%TmpMotionMesh) ! TmpMotionMesh +end subroutine + +subroutine Glue_CopyLinParam(SrcLinParamData, DstLinParamData, CtrlCode, ErrStat, ErrMsg) + type(Glue_LinParam), intent(in) :: SrcLinParamData + type(Glue_LinParam), intent(inout) :: DstLinParamData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'Glue_CopyLinParam' + ErrStat = ErrID_None + ErrMsg = '' + DstLinParamData%NumTimes = SrcLinParamData%NumTimes + DstLinParamData%InterpOrder = SrcLinParamData%InterpOrder + DstLinParamData%SaveOPs = SrcLinParamData%SaveOPs + if (allocated(SrcLinParamData%iMod)) then + LB(1:1) = lbound(SrcLinParamData%iMod) + UB(1:1) = ubound(SrcLinParamData%iMod) + if (.not. allocated(DstLinParamData%iMod)) then + allocate(DstLinParamData%iMod(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstLinParamData%iMod.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstLinParamData%iMod = SrcLinParamData%iMod + end if +end subroutine + +subroutine Glue_DestroyLinParam(LinParamData, ErrStat, ErrMsg) + type(Glue_LinParam), intent(inout) :: LinParamData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_DestroyLinParam' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(LinParamData%iMod)) then + deallocate(LinParamData%iMod) + end if +end subroutine + +subroutine Glue_PackLinParam(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_LinParam), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackLinParam' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%NumTimes) + call RegPack(RF, InData%InterpOrder) + call RegPack(RF, InData%SaveOPs) + call RegPackAlloc(RF, InData%iMod) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackLinParam(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_LinParam), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackLinParam' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%NumTimes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%InterpOrder); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SaveOPs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%iMod); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyTCParam(SrcTCParamData, DstTCParamData, CtrlCode, ErrStat, ErrMsg) + type(Glue_TCParam), intent(in) :: SrcTCParamData + type(Glue_TCParam), intent(inout) :: DstTCParamData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'Glue_CopyTCParam' + ErrStat = ErrID_None + ErrMsg = '' + DstTCParamData%h = SrcTCParamData%h + DstTCParamData%ConvTol = SrcTCParamData%ConvTol + DstTCParamData%ModCoupling = SrcTCParamData%ModCoupling + DstTCParamData%NumCrctn = SrcTCParamData%NumCrctn + DstTCParamData%MaxConvIter = SrcTCParamData%MaxConvIter + DstTCParamData%NIter_UJac = SrcTCParamData%NIter_UJac + DstTCParamData%NStep_UJac = SrcTCParamData%NStep_UJac + DstTCParamData%Scale_UJac = SrcTCParamData%Scale_UJac + DstTCParamData%RhoInf = SrcTCParamData%RhoInf + DstTCParamData%AlphaM = SrcTCParamData%AlphaM + DstTCParamData%AlphaF = SrcTCParamData%AlphaF + DstTCParamData%Beta = SrcTCParamData%Beta + DstTCParamData%Gamma = SrcTCParamData%Gamma + DstTCParamData%BetaPrime = SrcTCParamData%BetaPrime + DstTCParamData%GammaPrime = SrcTCParamData%GammaPrime + DstTCParamData%NumJ = SrcTCParamData%NumJ + DstTCParamData%NumQ = SrcTCParamData%NumQ + DstTCParamData%NumU = SrcTCParamData%NumU + DstTCParamData%NumUT = SrcTCParamData%NumUT + DstTCParamData%iX1 = SrcTCParamData%iX1 + DstTCParamData%iX2 = SrcTCParamData%iX2 + DstTCParamData%iUT = SrcTCParamData%iUT + DstTCParamData%iU1 = SrcTCParamData%iU1 + DstTCParamData%iUL = SrcTCParamData%iUL + DstTCParamData%iyT = SrcTCParamData%iyT + DstTCParamData%iy1 = SrcTCParamData%iy1 + DstTCParamData%iJX = SrcTCParamData%iJX + DstTCParamData%iJU = SrcTCParamData%iJU + DstTCParamData%iJUT = SrcTCParamData%iJUT + DstTCParamData%iJL = SrcTCParamData%iJL + if (allocated(SrcTCParamData%iModInit)) then + LB(1:1) = lbound(SrcTCParamData%iModInit) + UB(1:1) = ubound(SrcTCParamData%iModInit) + if (.not. allocated(DstTCParamData%iModInit)) then + allocate(DstTCParamData%iModInit(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCParamData%iModInit.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCParamData%iModInit = SrcTCParamData%iModInit + end if + if (allocated(SrcTCParamData%iModTC)) then + LB(1:1) = lbound(SrcTCParamData%iModTC) + UB(1:1) = ubound(SrcTCParamData%iModTC) + if (.not. allocated(DstTCParamData%iModTC)) then + allocate(DstTCParamData%iModTC(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCParamData%iModTC.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCParamData%iModTC = SrcTCParamData%iModTC + end if + if (allocated(SrcTCParamData%iModOpt1)) then + LB(1:1) = lbound(SrcTCParamData%iModOpt1) + UB(1:1) = ubound(SrcTCParamData%iModOpt1) + if (.not. allocated(DstTCParamData%iModOpt1)) then + allocate(DstTCParamData%iModOpt1(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCParamData%iModOpt1.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCParamData%iModOpt1 = SrcTCParamData%iModOpt1 + end if + if (allocated(SrcTCParamData%iModOpt2)) then + LB(1:1) = lbound(SrcTCParamData%iModOpt2) + UB(1:1) = ubound(SrcTCParamData%iModOpt2) + if (.not. allocated(DstTCParamData%iModOpt2)) then + allocate(DstTCParamData%iModOpt2(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCParamData%iModOpt2.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCParamData%iModOpt2 = SrcTCParamData%iModOpt2 + end if + if (allocated(SrcTCParamData%iModPost)) then + LB(1:1) = lbound(SrcTCParamData%iModPost) + UB(1:1) = ubound(SrcTCParamData%iModPost) + if (.not. allocated(DstTCParamData%iModPost)) then + allocate(DstTCParamData%iModPost(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCParamData%iModPost.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCParamData%iModPost = SrcTCParamData%iModPost + end if +end subroutine + +subroutine Glue_DestroyTCParam(TCParamData, ErrStat, ErrMsg) + type(Glue_TCParam), intent(inout) :: TCParamData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_DestroyTCParam' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(TCParamData%iModInit)) then + deallocate(TCParamData%iModInit) + end if + if (allocated(TCParamData%iModTC)) then + deallocate(TCParamData%iModTC) + end if + if (allocated(TCParamData%iModOpt1)) then + deallocate(TCParamData%iModOpt1) + end if + if (allocated(TCParamData%iModOpt2)) then + deallocate(TCParamData%iModOpt2) + end if + if (allocated(TCParamData%iModPost)) then + deallocate(TCParamData%iModPost) + end if +end subroutine + +subroutine Glue_PackTCParam(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_TCParam), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackTCParam' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%h) + call RegPack(RF, InData%ConvTol) + call RegPack(RF, InData%ModCoupling) + call RegPack(RF, InData%NumCrctn) + call RegPack(RF, InData%MaxConvIter) + call RegPack(RF, InData%NIter_UJac) + call RegPack(RF, InData%NStep_UJac) + call RegPack(RF, InData%Scale_UJac) + call RegPack(RF, InData%RhoInf) + call RegPack(RF, InData%AlphaM) + call RegPack(RF, InData%AlphaF) + call RegPack(RF, InData%Beta) + call RegPack(RF, InData%Gamma) + call RegPack(RF, InData%BetaPrime) + call RegPack(RF, InData%GammaPrime) + call RegPack(RF, InData%NumJ) + call RegPack(RF, InData%NumQ) + call RegPack(RF, InData%NumU) + call RegPack(RF, InData%NumUT) + call RegPack(RF, InData%iX1) + call RegPack(RF, InData%iX2) + call RegPack(RF, InData%iUT) + call RegPack(RF, InData%iU1) + call RegPack(RF, InData%iUL) + call RegPack(RF, InData%iyT) + call RegPack(RF, InData%iy1) + call RegPack(RF, InData%iJX) + call RegPack(RF, InData%iJU) + call RegPack(RF, InData%iJUT) + call RegPack(RF, InData%iJL) + call RegPackAlloc(RF, InData%iModInit) + call RegPackAlloc(RF, InData%iModTC) + call RegPackAlloc(RF, InData%iModOpt1) + call RegPackAlloc(RF, InData%iModOpt2) + call RegPackAlloc(RF, InData%iModPost) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackTCParam(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_TCParam), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackTCParam' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%h); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ConvTol); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ModCoupling); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumCrctn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MaxConvIter); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NIter_UJac); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NStep_UJac); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Scale_UJac); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RhoInf); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AlphaM); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AlphaF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Beta); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Gamma); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%BetaPrime); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%GammaPrime); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumJ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumQ); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumU); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumUT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iX1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iX2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iUT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iU1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iUL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iyT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iy1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iJX); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iJU); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iJUT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%iJL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%iModInit); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%iModTC); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%iModOpt1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%iModOpt2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%iModPost); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) + type(Glue_ParameterType), intent(in) :: SrcParamData + type(Glue_ParameterType), intent(inout) :: DstParamData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_CopyParam' + ErrStat = ErrID_None + ErrMsg = '' + call Glue_CopyLinParam(SrcParamData%Lin, DstParamData%Lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyTCParam(SrcParamData%TC, DstParamData%TC, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine Glue_DestroyParam(ParamData, ErrStat, ErrMsg) + type(Glue_ParameterType), intent(inout) :: ParamData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_DestroyParam' + ErrStat = ErrID_None + ErrMsg = '' + call Glue_DestroyLinParam(ParamData%Lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyTCParam(ParamData%TC, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine Glue_PackParam(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_ParameterType), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackParam' + if (RF%ErrStat >= AbortErrLev) return + call Glue_PackLinParam(RF, InData%Lin) + call Glue_PackTCParam(RF, InData%TC) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackParam(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_ParameterType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackParam' + if (RF%ErrStat /= ErrID_None) return + call Glue_UnpackLinParam(RF, OutData%Lin) ! Lin + call Glue_UnpackTCParam(RF, OutData%TC) ! TC +end subroutine + +subroutine Glue_CopyLinSave(SrcLinSaveData, DstLinSaveData, CtrlCode, ErrStat, ErrMsg) + type(Glue_LinSave), intent(in) :: SrcLinSaveData + type(Glue_LinSave), intent(inout) :: DstLinSaveData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'Glue_CopyLinSave' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcLinSaveData%Times)) then + LB(1:1) = lbound(SrcLinSaveData%Times) + UB(1:1) = ubound(SrcLinSaveData%Times) + if (.not. allocated(DstLinSaveData%Times)) then + allocate(DstLinSaveData%Times(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstLinSaveData%Times.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstLinSaveData%Times = SrcLinSaveData%Times + end if + if (allocated(SrcLinSaveData%u)) then + LB(1:2) = lbound(SrcLinSaveData%u) + UB(1:2) = ubound(SrcLinSaveData%u) + if (.not. allocated(DstLinSaveData%u)) then + allocate(DstLinSaveData%u(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstLinSaveData%u.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstLinSaveData%u = SrcLinSaveData%u + end if + if (allocated(SrcLinSaveData%x)) then + LB(1:2) = lbound(SrcLinSaveData%x) + UB(1:2) = ubound(SrcLinSaveData%x) + if (.not. allocated(DstLinSaveData%x)) then + allocate(DstLinSaveData%x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstLinSaveData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstLinSaveData%x = SrcLinSaveData%x + end if + if (allocated(SrcLinSaveData%xd)) then + LB(1:2) = lbound(SrcLinSaveData%xd) + UB(1:2) = ubound(SrcLinSaveData%xd) + if (.not. allocated(DstLinSaveData%xd)) then + allocate(DstLinSaveData%xd(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstLinSaveData%xd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstLinSaveData%xd = SrcLinSaveData%xd + end if + if (allocated(SrcLinSaveData%z)) then + LB(1:2) = lbound(SrcLinSaveData%z) + UB(1:2) = ubound(SrcLinSaveData%z) + if (.not. allocated(DstLinSaveData%z)) then + allocate(DstLinSaveData%z(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstLinSaveData%z.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstLinSaveData%z = SrcLinSaveData%z + end if + if (allocated(SrcLinSaveData%OtherSt)) then + LB(1:2) = lbound(SrcLinSaveData%OtherSt) + UB(1:2) = ubound(SrcLinSaveData%OtherSt) + if (.not. allocated(DstLinSaveData%OtherSt)) then + allocate(DstLinSaveData%OtherSt(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstLinSaveData%OtherSt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstLinSaveData%OtherSt = SrcLinSaveData%OtherSt + end if +end subroutine + +subroutine Glue_DestroyLinSave(LinSaveData, ErrStat, ErrMsg) + type(Glue_LinSave), intent(inout) :: LinSaveData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_DestroyLinSave' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(LinSaveData%Times)) then + deallocate(LinSaveData%Times) + end if + if (allocated(LinSaveData%u)) then + deallocate(LinSaveData%u) + end if + if (allocated(LinSaveData%x)) then + deallocate(LinSaveData%x) + end if + if (allocated(LinSaveData%xd)) then + deallocate(LinSaveData%xd) + end if + if (allocated(LinSaveData%z)) then + deallocate(LinSaveData%z) + end if + if (allocated(LinSaveData%OtherSt)) then + deallocate(LinSaveData%OtherSt) + end if +end subroutine + +subroutine Glue_PackLinSave(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_LinSave), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackLinSave' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%Times) + call RegPackAlloc(RF, InData%u) + call RegPackAlloc(RF, InData%x) + call RegPackAlloc(RF, InData%xd) + call RegPackAlloc(RF, InData%z) + call RegPackAlloc(RF, InData%OtherSt) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackLinSave(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_LinSave), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackLinSave' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%Times); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%u); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%x); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%xd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%z); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%OtherSt); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyOutputFileType(SrcOutputFileTypeData, DstOutputFileTypeData, CtrlCode, ErrStat, ErrMsg) + type(Glue_OutputFileType), intent(in) :: SrcOutputFileTypeData + type(Glue_OutputFileType), intent(inout) :: DstOutputFileTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_CopyOutputFileType' + ErrStat = ErrID_None + ErrMsg = '' + call Glue_CopyLinSave(SrcOutputFileTypeData%Lin, DstOutputFileTypeData%Lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine Glue_DestroyOutputFileType(OutputFileTypeData, ErrStat, ErrMsg) + type(Glue_OutputFileType), intent(inout) :: OutputFileTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_DestroyOutputFileType' + ErrStat = ErrID_None + ErrMsg = '' + call Glue_DestroyLinSave(OutputFileTypeData%Lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine Glue_PackOutputFileType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_OutputFileType), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackOutputFileType' + if (RF%ErrStat >= AbortErrLev) return + call Glue_PackLinSave(RF, InData%Lin) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackOutputFileType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_OutputFileType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackOutputFileType' + if (RF%ErrStat /= ErrID_None) return + call Glue_UnpackLinSave(RF, OutData%Lin) ! Lin +end subroutine + +subroutine Glue_CopyCalcSteady(SrcCalcSteadyData, DstCalcSteadyData, CtrlCode, ErrStat, ErrMsg) + type(Glue_CalcSteady), intent(in) :: SrcCalcSteadyData + type(Glue_CalcSteady), intent(inout) :: DstCalcSteadyData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'Glue_CopyCalcSteady' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcCalcSteadyData%AzimuthTarget)) then + LB(1:1) = lbound(SrcCalcSteadyData%AzimuthTarget) + UB(1:1) = ubound(SrcCalcSteadyData%AzimuthTarget) + if (.not. allocated(DstCalcSteadyData%AzimuthTarget)) then + allocate(DstCalcSteadyData%AzimuthTarget(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstCalcSteadyData%AzimuthTarget.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstCalcSteadyData%AzimuthTarget = SrcCalcSteadyData%AzimuthTarget + end if + DstCalcSteadyData%AzimuthDelta = SrcCalcSteadyData%AzimuthDelta + DstCalcSteadyData%IsConverged = SrcCalcSteadyData%IsConverged + DstCalcSteadyData%FoundSteady = SrcCalcSteadyData%FoundSteady + DstCalcSteadyData%ForceLin = SrcCalcSteadyData%ForceLin + DstCalcSteadyData%NumRotations = SrcCalcSteadyData%NumRotations + DstCalcSteadyData%NumOutputs = SrcCalcSteadyData%NumOutputs + if (allocated(SrcCalcSteadyData%psi_buffer)) then + LB(1:1) = lbound(SrcCalcSteadyData%psi_buffer) + UB(1:1) = ubound(SrcCalcSteadyData%psi_buffer) + if (.not. allocated(DstCalcSteadyData%psi_buffer)) then + allocate(DstCalcSteadyData%psi_buffer(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstCalcSteadyData%psi_buffer.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstCalcSteadyData%psi_buffer = SrcCalcSteadyData%psi_buffer + end if + if (allocated(SrcCalcSteadyData%y_buffer)) then + LB(1:2) = lbound(SrcCalcSteadyData%y_buffer) + UB(1:2) = ubound(SrcCalcSteadyData%y_buffer) + if (.not. allocated(DstCalcSteadyData%y_buffer)) then + allocate(DstCalcSteadyData%y_buffer(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstCalcSteadyData%y_buffer.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstCalcSteadyData%y_buffer = SrcCalcSteadyData%y_buffer + end if + if (allocated(SrcCalcSteadyData%y_azimuth)) then + LB(1:2) = lbound(SrcCalcSteadyData%y_azimuth) + UB(1:2) = ubound(SrcCalcSteadyData%y_azimuth) + if (.not. allocated(DstCalcSteadyData%y_azimuth)) then + allocate(DstCalcSteadyData%y_azimuth(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstCalcSteadyData%y_azimuth.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstCalcSteadyData%y_azimuth = SrcCalcSteadyData%y_azimuth + end if + if (allocated(SrcCalcSteadyData%y_interp)) then + LB(1:1) = lbound(SrcCalcSteadyData%y_interp) + UB(1:1) = ubound(SrcCalcSteadyData%y_interp) + if (.not. allocated(DstCalcSteadyData%y_interp)) then + allocate(DstCalcSteadyData%y_interp(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstCalcSteadyData%y_interp.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstCalcSteadyData%y_interp = SrcCalcSteadyData%y_interp + end if + if (allocated(SrcCalcSteadyData%y_diff)) then + LB(1:1) = lbound(SrcCalcSteadyData%y_diff) + UB(1:1) = ubound(SrcCalcSteadyData%y_diff) + if (.not. allocated(DstCalcSteadyData%y_diff)) then + allocate(DstCalcSteadyData%y_diff(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstCalcSteadyData%y_diff.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstCalcSteadyData%y_diff = SrcCalcSteadyData%y_diff + end if + if (allocated(SrcCalcSteadyData%y_ref)) then + LB(1:1) = lbound(SrcCalcSteadyData%y_ref) + UB(1:1) = ubound(SrcCalcSteadyData%y_ref) + if (.not. allocated(DstCalcSteadyData%y_ref)) then + allocate(DstCalcSteadyData%y_ref(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstCalcSteadyData%y_ref.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstCalcSteadyData%y_ref = SrcCalcSteadyData%y_ref + end if +end subroutine + +subroutine Glue_DestroyCalcSteady(CalcSteadyData, ErrStat, ErrMsg) + type(Glue_CalcSteady), intent(inout) :: CalcSteadyData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_DestroyCalcSteady' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(CalcSteadyData%AzimuthTarget)) then + deallocate(CalcSteadyData%AzimuthTarget) + end if + if (allocated(CalcSteadyData%psi_buffer)) then + deallocate(CalcSteadyData%psi_buffer) + end if + if (allocated(CalcSteadyData%y_buffer)) then + deallocate(CalcSteadyData%y_buffer) + end if + if (allocated(CalcSteadyData%y_azimuth)) then + deallocate(CalcSteadyData%y_azimuth) + end if + if (allocated(CalcSteadyData%y_interp)) then + deallocate(CalcSteadyData%y_interp) + end if + if (allocated(CalcSteadyData%y_diff)) then + deallocate(CalcSteadyData%y_diff) + end if + if (allocated(CalcSteadyData%y_ref)) then + deallocate(CalcSteadyData%y_ref) + end if +end subroutine + +subroutine Glue_PackCalcSteady(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_CalcSteady), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackCalcSteady' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%AzimuthTarget) + call RegPack(RF, InData%AzimuthDelta) + call RegPack(RF, InData%IsConverged) + call RegPack(RF, InData%FoundSteady) + call RegPack(RF, InData%ForceLin) + call RegPack(RF, InData%NumRotations) + call RegPack(RF, InData%NumOutputs) + call RegPackAlloc(RF, InData%psi_buffer) + call RegPackAlloc(RF, InData%y_buffer) + call RegPackAlloc(RF, InData%y_azimuth) + call RegPackAlloc(RF, InData%y_interp) + call RegPackAlloc(RF, InData%y_diff) + call RegPackAlloc(RF, InData%y_ref) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackCalcSteady(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_CalcSteady), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackCalcSteady' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%AzimuthTarget); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AzimuthDelta); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%IsConverged); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%FoundSteady); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ForceLin); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumRotations); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumOutputs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%psi_buffer); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y_buffer); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y_azimuth); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y_interp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y_diff); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%y_ref); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyAeroMapCase(SrcAeroMapCaseData, DstAeroMapCaseData, CtrlCode, ErrStat, ErrMsg) + type(AeroMapCase), intent(in) :: SrcAeroMapCaseData + type(AeroMapCase), intent(inout) :: DstAeroMapCaseData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_CopyAeroMapCase' + ErrStat = ErrID_None + ErrMsg = '' + DstAeroMapCaseData%RotSpeed = SrcAeroMapCaseData%RotSpeed + DstAeroMapCaseData%TSR = SrcAeroMapCaseData%TSR + DstAeroMapCaseData%WindSpeed = SrcAeroMapCaseData%WindSpeed + DstAeroMapCaseData%Pitch = SrcAeroMapCaseData%Pitch +end subroutine + +subroutine Glue_DestroyAeroMapCase(AeroMapCaseData, ErrStat, ErrMsg) + type(AeroMapCase), intent(inout) :: AeroMapCaseData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_DestroyAeroMapCase' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine Glue_PackAeroMapCase(RF, Indata) + type(RegFile), intent(inout) :: RF + type(AeroMapCase), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackAeroMapCase' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%RotSpeed) + call RegPack(RF, InData%TSR) + call RegPack(RF, InData%WindSpeed) + call RegPack(RF, InData%Pitch) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackAeroMapCase(RF, OutData) + type(RegFile), intent(inout) :: RF + type(AeroMapCase), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackAeroMapCase' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TSR); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WindSpeed); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Pitch); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyAeroMap(SrcAeroMapData, DstAeroMapData, CtrlCode, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(in) :: SrcAeroMapData + type(Glue_AeroMap), intent(inout) :: DstAeroMapData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_CopyAeroMap' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcAeroMapData%iModOrder)) then + LB(1:1) = lbound(SrcAeroMapData%iModOrder) + UB(1:1) = ubound(SrcAeroMapData%iModOrder) + if (.not. allocated(DstAeroMapData%iModOrder)) then + allocate(DstAeroMapData%iModOrder(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%iModOrder.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%iModOrder = SrcAeroMapData%iModOrder + end if + call Glue_CopyModGlueType(SrcAeroMapData%Mod, DstAeroMapData%Mod, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcAeroMapData%Jac11)) then + LB(1:2) = lbound(SrcAeroMapData%Jac11) + UB(1:2) = ubound(SrcAeroMapData%Jac11) + if (.not. allocated(DstAeroMapData%Jac11)) then + allocate(DstAeroMapData%Jac11(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%Jac11.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%Jac11 = SrcAeroMapData%Jac11 + end if + if (allocated(SrcAeroMapData%Jac12)) then + LB(1:2) = lbound(SrcAeroMapData%Jac12) + UB(1:2) = ubound(SrcAeroMapData%Jac12) + if (.not. allocated(DstAeroMapData%Jac12)) then + allocate(DstAeroMapData%Jac12(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%Jac12.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%Jac12 = SrcAeroMapData%Jac12 + end if + if (allocated(SrcAeroMapData%Jac21)) then + LB(1:2) = lbound(SrcAeroMapData%Jac21) + UB(1:2) = ubound(SrcAeroMapData%Jac21) + if (.not. allocated(DstAeroMapData%Jac21)) then + allocate(DstAeroMapData%Jac21(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%Jac21.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%Jac21 = SrcAeroMapData%Jac21 + end if + if (allocated(SrcAeroMapData%Jac22)) then + LB(1:2) = lbound(SrcAeroMapData%Jac22) + UB(1:2) = ubound(SrcAeroMapData%Jac22) + if (.not. allocated(DstAeroMapData%Jac22)) then + allocate(DstAeroMapData%Jac22(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%Jac22.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%Jac22 = SrcAeroMapData%Jac22 + end if + if (allocated(SrcAeroMapData%JacPivot)) then + LB(1:1) = lbound(SrcAeroMapData%JacPivot) + UB(1:1) = ubound(SrcAeroMapData%JacPivot) + if (.not. allocated(DstAeroMapData%JacPivot)) then + allocate(DstAeroMapData%JacPivot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%JacPivot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%JacPivot = SrcAeroMapData%JacPivot + end if + DstAeroMapData%JacScale = SrcAeroMapData%JacScale + DstAeroMapData%SolveTolerance = SrcAeroMapData%SolveTolerance + if (allocated(SrcAeroMapData%HubOrientation)) then + LB(1:3) = lbound(SrcAeroMapData%HubOrientation) + UB(1:3) = ubound(SrcAeroMapData%HubOrientation) + if (.not. allocated(DstAeroMapData%HubOrientation)) then + allocate(DstAeroMapData%HubOrientation(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%HubOrientation.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%HubOrientation = SrcAeroMapData%HubOrientation + end if + if (allocated(SrcAeroMapData%u1)) then + LB(1:1) = lbound(SrcAeroMapData%u1) + UB(1:1) = ubound(SrcAeroMapData%u1) + if (.not. allocated(DstAeroMapData%u1)) then + allocate(DstAeroMapData%u1(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%u1.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%u1 = SrcAeroMapData%u1 + end if + if (allocated(SrcAeroMapData%u2)) then + LB(1:1) = lbound(SrcAeroMapData%u2) + UB(1:1) = ubound(SrcAeroMapData%u2) + if (.not. allocated(DstAeroMapData%u2)) then + allocate(DstAeroMapData%u2(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%u2.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%u2 = SrcAeroMapData%u2 + end if + if (allocated(SrcAeroMapData%Residual)) then + LB(1:1) = lbound(SrcAeroMapData%Residual) + UB(1:1) = ubound(SrcAeroMapData%Residual) + if (.not. allocated(DstAeroMapData%Residual)) then + allocate(DstAeroMapData%Residual(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%Residual.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%Residual = SrcAeroMapData%Residual + end if + if (allocated(SrcAeroMapData%SolveDelta)) then + LB(1:1) = lbound(SrcAeroMapData%SolveDelta) + UB(1:1) = ubound(SrcAeroMapData%SolveDelta) + if (.not. allocated(DstAeroMapData%SolveDelta)) then + allocate(DstAeroMapData%SolveDelta(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%SolveDelta.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstAeroMapData%SolveDelta = SrcAeroMapData%SolveDelta + end if + if (allocated(SrcAeroMapData%Cases)) then + LB(1:1) = lbound(SrcAeroMapData%Cases) + UB(1:1) = ubound(SrcAeroMapData%Cases) + if (.not. allocated(DstAeroMapData%Cases)) then + allocate(DstAeroMapData%Cases(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstAeroMapData%Cases.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call Glue_CopyAeroMapCase(SrcAeroMapData%Cases(i1), DstAeroMapData%Cases(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + DstAeroMapData%LinFileNum = SrcAeroMapData%LinFileNum +end subroutine + +subroutine Glue_DestroyAeroMap(AeroMapData, ErrStat, ErrMsg) + type(Glue_AeroMap), intent(inout) :: AeroMapData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_DestroyAeroMap' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(AeroMapData%iModOrder)) then + deallocate(AeroMapData%iModOrder) + end if + call Glue_DestroyModGlueType(AeroMapData%Mod, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(AeroMapData%Jac11)) then + deallocate(AeroMapData%Jac11) + end if + if (allocated(AeroMapData%Jac12)) then + deallocate(AeroMapData%Jac12) + end if + if (allocated(AeroMapData%Jac21)) then + deallocate(AeroMapData%Jac21) + end if + if (allocated(AeroMapData%Jac22)) then + deallocate(AeroMapData%Jac22) + end if + if (allocated(AeroMapData%JacPivot)) then + deallocate(AeroMapData%JacPivot) + end if + if (allocated(AeroMapData%HubOrientation)) then + deallocate(AeroMapData%HubOrientation) + end if + if (allocated(AeroMapData%u1)) then + deallocate(AeroMapData%u1) + end if + if (allocated(AeroMapData%u2)) then + deallocate(AeroMapData%u2) + end if + if (allocated(AeroMapData%Residual)) then + deallocate(AeroMapData%Residual) + end if + if (allocated(AeroMapData%SolveDelta)) then + deallocate(AeroMapData%SolveDelta) + end if + if (allocated(AeroMapData%Cases)) then + LB(1:1) = lbound(AeroMapData%Cases) + UB(1:1) = ubound(AeroMapData%Cases) + do i1 = LB(1), UB(1) + call Glue_DestroyAeroMapCase(AeroMapData%Cases(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(AeroMapData%Cases) + end if +end subroutine + +subroutine Glue_PackAeroMap(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_AeroMap), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackAeroMap' + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%iModOrder) + call Glue_PackModGlueType(RF, InData%Mod) + call RegPackAlloc(RF, InData%Jac11) + call RegPackAlloc(RF, InData%Jac12) + call RegPackAlloc(RF, InData%Jac21) + call RegPackAlloc(RF, InData%Jac22) + call RegPackAlloc(RF, InData%JacPivot) + call RegPack(RF, InData%JacScale) + call RegPack(RF, InData%SolveTolerance) + call RegPackAlloc(RF, InData%HubOrientation) + call RegPackAlloc(RF, InData%u1) + call RegPackAlloc(RF, InData%u2) + call RegPackAlloc(RF, InData%Residual) + call RegPackAlloc(RF, InData%SolveDelta) + call RegPack(RF, allocated(InData%Cases)) + if (allocated(InData%Cases)) then + call RegPackBounds(RF, 1, lbound(InData%Cases), ubound(InData%Cases)) + LB(1:1) = lbound(InData%Cases) + UB(1:1) = ubound(InData%Cases) + do i1 = LB(1), UB(1) + call Glue_PackAeroMapCase(RF, InData%Cases(i1)) + end do + end if + call RegPack(RF, InData%LinFileNum) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackAeroMap(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_AeroMap), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackAeroMap' + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%iModOrder); if (RegCheckErr(RF, RoutineName)) return + call Glue_UnpackModGlueType(RF, OutData%Mod) ! Mod + call RegUnpackAlloc(RF, OutData%Jac11); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Jac12); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Jac21); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Jac22); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%JacPivot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%JacScale); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SolveTolerance); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%HubOrientation); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%u1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%u2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Residual); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%SolveDelta); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%Cases)) deallocate(OutData%Cases) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Cases(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Cases.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call Glue_UnpackAeroMapCase(RF, OutData%Cases(i1)) ! Cases + end do + end if + call RegUnpack(RF, OutData%LinFileNum); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyTC_State(SrcTC_StateData, DstTC_StateData, CtrlCode, ErrStat, ErrMsg) + type(TC_State), intent(in) :: SrcTC_StateData + type(TC_State), intent(inout) :: DstTC_StateData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'Glue_CopyTC_State' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcTC_StateData%q_prev)) then + LB(1:1) = lbound(SrcTC_StateData%q_prev) + UB(1:1) = ubound(SrcTC_StateData%q_prev) + if (.not. allocated(DstTC_StateData%q_prev)) then + allocate(DstTC_StateData%q_prev(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTC_StateData%q_prev.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTC_StateData%q_prev = SrcTC_StateData%q_prev + end if + if (allocated(SrcTC_StateData%x)) then + LB(1:1) = lbound(SrcTC_StateData%x) + UB(1:1) = ubound(SrcTC_StateData%x) + if (.not. allocated(DstTC_StateData%x)) then + allocate(DstTC_StateData%x(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTC_StateData%x.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTC_StateData%x = SrcTC_StateData%x + end if + if (allocated(SrcTC_StateData%q)) then + LB(1:1) = lbound(SrcTC_StateData%q) + UB(1:1) = ubound(SrcTC_StateData%q) + if (.not. allocated(DstTC_StateData%q)) then + allocate(DstTC_StateData%q(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTC_StateData%q.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTC_StateData%q = SrcTC_StateData%q + end if + if (allocated(SrcTC_StateData%v)) then + LB(1:1) = lbound(SrcTC_StateData%v) + UB(1:1) = ubound(SrcTC_StateData%v) + if (.not. allocated(DstTC_StateData%v)) then + allocate(DstTC_StateData%v(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTC_StateData%v.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTC_StateData%v = SrcTC_StateData%v + end if + if (allocated(SrcTC_StateData%vd)) then + LB(1:1) = lbound(SrcTC_StateData%vd) + UB(1:1) = ubound(SrcTC_StateData%vd) + if (.not. allocated(DstTC_StateData%vd)) then + allocate(DstTC_StateData%vd(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTC_StateData%vd.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTC_StateData%vd = SrcTC_StateData%vd + end if + if (allocated(SrcTC_StateData%a)) then + LB(1:1) = lbound(SrcTC_StateData%a) + UB(1:1) = ubound(SrcTC_StateData%a) + if (.not. allocated(DstTC_StateData%a)) then + allocate(DstTC_StateData%a(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTC_StateData%a.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTC_StateData%a = SrcTC_StateData%a + end if +end subroutine + +subroutine Glue_DestroyTC_State(TC_StateData, ErrStat, ErrMsg) + type(TC_State), intent(inout) :: TC_StateData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_DestroyTC_State' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(TC_StateData%q_prev)) then + deallocate(TC_StateData%q_prev) + end if + if (allocated(TC_StateData%x)) then + deallocate(TC_StateData%x) + end if + if (allocated(TC_StateData%q)) then + deallocate(TC_StateData%q) + end if + if (allocated(TC_StateData%v)) then + deallocate(TC_StateData%v) + end if + if (allocated(TC_StateData%vd)) then + deallocate(TC_StateData%vd) + end if + if (allocated(TC_StateData%a)) then + deallocate(TC_StateData%a) + end if +end subroutine + +subroutine Glue_PackTC_State(RF, Indata) + type(RegFile), intent(inout) :: RF + type(TC_State), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackTC_State' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%q_prev) + call RegPackAlloc(RF, InData%x) + call RegPackAlloc(RF, InData%q) + call RegPackAlloc(RF, InData%v) + call RegPackAlloc(RF, InData%vd) + call RegPackAlloc(RF, InData%a) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackTC_State(RF, OutData) + type(RegFile), intent(inout) :: RF + type(TC_State), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackTC_State' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%q_prev); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%x); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%q); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%v); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%vd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%a); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyTCMisc(SrcTCMiscData, DstTCMiscData, CtrlCode, ErrStat, ErrMsg) + type(Glue_TCMisc), intent(in) :: SrcTCMiscData + type(Glue_TCMisc), intent(inout) :: DstTCMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_CopyTCMisc' + ErrStat = ErrID_None + ErrMsg = '' + call Glue_CopyModGlueType(SrcTCMiscData%Mod, DstTCMiscData%Mod, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyTC_State(SrcTCMiscData%StateCurr, DstTCMiscData%StateCurr, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyTC_State(SrcTCMiscData%StatePred, DstTCMiscData%StatePred, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcTCMiscData%UCalc)) then + LB(1:1) = lbound(SrcTCMiscData%UCalc) + UB(1:1) = ubound(SrcTCMiscData%UCalc) + if (.not. allocated(DstTCMiscData%UCalc)) then + allocate(DstTCMiscData%UCalc(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%UCalc.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%UCalc = SrcTCMiscData%UCalc + end if + if (allocated(SrcTCMiscData%XB)) then + LB(1:2) = lbound(SrcTCMiscData%XB) + UB(1:2) = ubound(SrcTCMiscData%XB) + if (.not. allocated(DstTCMiscData%XB)) then + allocate(DstTCMiscData%XB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%XB.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%XB = SrcTCMiscData%XB + end if + if (allocated(SrcTCMiscData%IPIV)) then + LB(1:1) = lbound(SrcTCMiscData%IPIV) + UB(1:1) = ubound(SrcTCMiscData%IPIV) + if (.not. allocated(DstTCMiscData%IPIV)) then + allocate(DstTCMiscData%IPIV(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%IPIV.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%IPIV = SrcTCMiscData%IPIV + end if + DstTCMiscData%IterTotal = SrcTCMiscData%IterTotal + DstTCMiscData%UJacIterRemain = SrcTCMiscData%UJacIterRemain + DstTCMiscData%UJacStepsRemain = SrcTCMiscData%UJacStepsRemain + DstTCMiscData%ConvWarn = SrcTCMiscData%ConvWarn + if (allocated(SrcTCMiscData%IO_R)) then + LB(1:1) = lbound(SrcTCMiscData%IO_R) + UB(1:1) = ubound(SrcTCMiscData%IO_R) + if (.not. allocated(DstTCMiscData%IO_R)) then + allocate(DstTCMiscData%IO_R(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%IO_R.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%IO_R = SrcTCMiscData%IO_R + end if + if (allocated(SrcTCMiscData%IO_X)) then + LB(1:2) = lbound(SrcTCMiscData%IO_X) + UB(1:2) = ubound(SrcTCMiscData%IO_X) + if (.not. allocated(DstTCMiscData%IO_X)) then + allocate(DstTCMiscData%IO_X(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%IO_X.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%IO_X = SrcTCMiscData%IO_X + end if + if (allocated(SrcTCMiscData%IO_Jac)) then + LB(1:2) = lbound(SrcTCMiscData%IO_Jac) + UB(1:2) = ubound(SrcTCMiscData%IO_Jac) + if (.not. allocated(DstTCMiscData%IO_Jac)) then + allocate(DstTCMiscData%IO_Jac(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%IO_Jac.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%IO_Jac = SrcTCMiscData%IO_Jac + end if + if (allocated(SrcTCMiscData%J11)) then + LB(1:2) = lbound(SrcTCMiscData%J11) + UB(1:2) = ubound(SrcTCMiscData%J11) + if (.not. allocated(DstTCMiscData%J11)) then + allocate(DstTCMiscData%J11(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%J11.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%J11 = SrcTCMiscData%J11 + end if + if (allocated(SrcTCMiscData%J12)) then + LB(1:2) = lbound(SrcTCMiscData%J12) + UB(1:2) = ubound(SrcTCMiscData%J12) + if (.not. allocated(DstTCMiscData%J12)) then + allocate(DstTCMiscData%J12(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%J12.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%J12 = SrcTCMiscData%J12 + end if + if (allocated(SrcTCMiscData%J21)) then + LB(1:2) = lbound(SrcTCMiscData%J21) + UB(1:2) = ubound(SrcTCMiscData%J21) + if (.not. allocated(DstTCMiscData%J21)) then + allocate(DstTCMiscData%J21(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%J21.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%J21 = SrcTCMiscData%J21 + end if + if (allocated(SrcTCMiscData%J22)) then + LB(1:2) = lbound(SrcTCMiscData%J22) + UB(1:2) = ubound(SrcTCMiscData%J22) + if (.not. allocated(DstTCMiscData%J22)) then + allocate(DstTCMiscData%J22(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%J22.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%J22 = SrcTCMiscData%J22 + end if + if (allocated(SrcTCMiscData%Tan)) then + LB(1:2) = lbound(SrcTCMiscData%Tan) + UB(1:2) = ubound(SrcTCMiscData%Tan) + if (.not. allocated(DstTCMiscData%Tan)) then + allocate(DstTCMiscData%Tan(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstTCMiscData%Tan.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstTCMiscData%Tan = SrcTCMiscData%Tan + end if +end subroutine + +subroutine Glue_DestroyTCMisc(TCMiscData, ErrStat, ErrMsg) + type(Glue_TCMisc), intent(inout) :: TCMiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_DestroyTCMisc' + ErrStat = ErrID_None + ErrMsg = '' + call Glue_DestroyModGlueType(TCMiscData%Mod, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyTC_State(TCMiscData%StateCurr, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyTC_State(TCMiscData%StatePred, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(TCMiscData%UCalc)) then + deallocate(TCMiscData%UCalc) + end if + if (allocated(TCMiscData%XB)) then + deallocate(TCMiscData%XB) + end if + if (allocated(TCMiscData%IPIV)) then + deallocate(TCMiscData%IPIV) + end if + if (allocated(TCMiscData%IO_R)) then + deallocate(TCMiscData%IO_R) + end if + if (allocated(TCMiscData%IO_X)) then + deallocate(TCMiscData%IO_X) + end if + if (allocated(TCMiscData%IO_Jac)) then + deallocate(TCMiscData%IO_Jac) + end if + if (allocated(TCMiscData%J11)) then + deallocate(TCMiscData%J11) + end if + if (allocated(TCMiscData%J12)) then + deallocate(TCMiscData%J12) + end if + if (allocated(TCMiscData%J21)) then + deallocate(TCMiscData%J21) + end if + if (allocated(TCMiscData%J22)) then + deallocate(TCMiscData%J22) + end if + if (allocated(TCMiscData%Tan)) then + deallocate(TCMiscData%Tan) + end if +end subroutine + +subroutine Glue_PackTCMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_TCMisc), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackTCMisc' + if (RF%ErrStat >= AbortErrLev) return + call Glue_PackModGlueType(RF, InData%Mod) + call Glue_PackTC_State(RF, InData%StateCurr) + call Glue_PackTC_State(RF, InData%StatePred) + call RegPackAlloc(RF, InData%UCalc) + call RegPackAlloc(RF, InData%XB) + call RegPackAlloc(RF, InData%IPIV) + call RegPack(RF, InData%IterTotal) + call RegPack(RF, InData%UJacIterRemain) + call RegPack(RF, InData%UJacStepsRemain) + call RegPack(RF, InData%ConvWarn) + call RegPackAlloc(RF, InData%IO_R) + call RegPackAlloc(RF, InData%IO_X) + call RegPackAlloc(RF, InData%IO_Jac) + call RegPackAlloc(RF, InData%J11) + call RegPackAlloc(RF, InData%J12) + call RegPackAlloc(RF, InData%J21) + call RegPackAlloc(RF, InData%J22) + call RegPackAlloc(RF, InData%Tan) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackTCMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_TCMisc), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackTCMisc' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call Glue_UnpackModGlueType(RF, OutData%Mod) ! Mod + call Glue_UnpackTC_State(RF, OutData%StateCurr) ! StateCurr + call Glue_UnpackTC_State(RF, OutData%StatePred) ! StatePred + call RegUnpackAlloc(RF, OutData%UCalc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%XB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%IPIV); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%IterTotal); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UJacIterRemain); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UJacStepsRemain); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ConvWarn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%IO_R); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%IO_X); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%IO_Jac); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%J11); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%J12); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%J21); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%J22); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Tan); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyLinMisc(SrcLinMiscData, DstLinMiscData, CtrlCode, ErrStat, ErrMsg) + type(Glue_LinMisc), intent(in) :: SrcLinMiscData + type(Glue_LinMisc), intent(inout) :: DstLinMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_CopyLinMisc' + ErrStat = ErrID_None + ErrMsg = '' + DstLinMiscData%TimeIndex = SrcLinMiscData%TimeIndex + DstLinMiscData%AzimuthIndex = SrcLinMiscData%AzimuthIndex + DstLinMiscData%IsConverged = SrcLinMiscData%IsConverged +end subroutine + +subroutine Glue_DestroyLinMisc(LinMiscData, ErrStat, ErrMsg) + type(Glue_LinMisc), intent(inout) :: LinMiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'Glue_DestroyLinMisc' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine Glue_PackLinMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_LinMisc), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackLinMisc' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%TimeIndex) + call RegPack(RF, InData%AzimuthIndex) + call RegPack(RF, InData%IsConverged) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackLinMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_LinMisc), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackLinMisc' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%TimeIndex); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AzimuthIndex); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%IsConverged); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_CopyExternal(SrcExternalData, DstExternalData, CtrlCode, ErrStat, ErrMsg) + type(Glue_External), intent(inout) :: SrcExternalData + type(Glue_External), intent(inout) :: DstExternalData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_CopyExternal' + ErrStat = ErrID_None + ErrMsg = '' + call MeshCopy(SrcExternalData%SubstructureLoadsFF, DstExternalData%SubstructureLoadsFF, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine Glue_DestroyExternal(ExternalData, ErrStat, ErrMsg) + type(Glue_External), intent(inout) :: ExternalData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_DestroyExternal' + ErrStat = ErrID_None + ErrMsg = '' + call MeshDestroy( ExternalData%SubstructureLoadsFF, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine Glue_PackExternal(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_External), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackExternal' + if (RF%ErrStat >= AbortErrLev) return + call MeshPack(RF, InData%SubstructureLoadsFF) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackExternal(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_External), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackExternal' + if (RF%ErrStat /= ErrID_None) return + call MeshUnpack(RF, OutData%SubstructureLoadsFF) ! SubstructureLoadsFF +end subroutine + +subroutine Glue_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(Glue_MiscVarType), intent(inout) :: SrcMiscData + type(Glue_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcMiscData%ModData)) then + LB(1:1) = lbound(SrcMiscData%ModData) + UB(1:1) = ubound(SrcMiscData%ModData) + if (.not. allocated(DstMiscData%ModData)) then + allocate(DstMiscData%ModData(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%ModData.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call NWTC_Library_CopyModDataType(SrcMiscData%ModData(i1), DstMiscData%ModData(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%Mappings)) then + LB(1:1) = lbound(SrcMiscData%Mappings) + UB(1:1) = ubound(SrcMiscData%Mappings) + if (.not. allocated(DstMiscData%Mappings)) then + allocate(DstMiscData%Mappings(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Mappings.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call Glue_CopyMappingType(SrcMiscData%Mappings(i1), DstMiscData%Mappings(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + call Glue_CopyModGlueType(SrcMiscData%ModGlue, DstMiscData%ModGlue, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyExternal(SrcMiscData%Ext, DstMiscData%Ext, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyLinMisc(SrcMiscData%Lin, DstMiscData%Lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyCalcSteady(SrcMiscData%CS, DstMiscData%CS, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyAeroMap(SrcMiscData%AM, DstMiscData%AM, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call Glue_CopyTCMisc(SrcMiscData%TC, DstMiscData%TC, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine Glue_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(Glue_MiscVarType), intent(inout) :: MiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'Glue_DestroyMisc' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(MiscData%ModData)) then + LB(1:1) = lbound(MiscData%ModData) + UB(1:1) = ubound(MiscData%ModData) + do i1 = LB(1), UB(1) + call NWTC_Library_DestroyModDataType(MiscData%ModData(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%ModData) + end if + if (allocated(MiscData%Mappings)) then + LB(1:1) = lbound(MiscData%Mappings) + UB(1:1) = ubound(MiscData%Mappings) + do i1 = LB(1), UB(1) + call Glue_DestroyMappingType(MiscData%Mappings(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%Mappings) + end if + call Glue_DestroyModGlueType(MiscData%ModGlue, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyExternal(MiscData%Ext, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyLinMisc(MiscData%Lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyCalcSteady(MiscData%CS, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyAeroMap(MiscData%AM, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call Glue_DestroyTCMisc(MiscData%TC, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine Glue_PackMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(Glue_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'Glue_PackMisc' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%ModData)) + if (allocated(InData%ModData)) then + call RegPackBounds(RF, 1, lbound(InData%ModData), ubound(InData%ModData)) + LB(1:1) = lbound(InData%ModData) + UB(1:1) = ubound(InData%ModData) + do i1 = LB(1), UB(1) + call NWTC_Library_PackModDataType(RF, InData%ModData(i1)) + end do + end if + call RegPack(RF, allocated(InData%Mappings)) + if (allocated(InData%Mappings)) then + call RegPackBounds(RF, 1, lbound(InData%Mappings), ubound(InData%Mappings)) + LB(1:1) = lbound(InData%Mappings) + UB(1:1) = ubound(InData%Mappings) + do i1 = LB(1), UB(1) + call Glue_PackMappingType(RF, InData%Mappings(i1)) + end do + end if + call Glue_PackModGlueType(RF, InData%ModGlue) + call Glue_PackExternal(RF, InData%Ext) + call Glue_PackLinMisc(RF, InData%Lin) + call Glue_PackCalcSteady(RF, InData%CS) + call Glue_PackAeroMap(RF, InData%AM) + call Glue_PackTCMisc(RF, InData%TC) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine Glue_UnPackMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(Glue_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'Glue_UnPackMisc' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%ModData)) deallocate(OutData%ModData) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%ModData(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%ModData.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call NWTC_Library_UnpackModDataType(RF, OutData%ModData(i1)) ! ModData + end do + end if + if (allocated(OutData%Mappings)) deallocate(OutData%Mappings) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Mappings(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Mappings.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call Glue_UnpackMappingType(RF, OutData%Mappings(i1)) ! Mappings + end do + end if + call Glue_UnpackModGlueType(RF, OutData%ModGlue) ! ModGlue + call Glue_UnpackExternal(RF, OutData%Ext) ! Ext + call Glue_UnpackLinMisc(RF, OutData%Lin) ! Lin + call Glue_UnpackCalcSteady(RF, OutData%CS) ! CS + call Glue_UnpackAeroMap(RF, OutData%AM) ! AM + call Glue_UnpackTCMisc(RF, OutData%TC) ! TC +end subroutine + +END MODULE Glue_Types + +!ENDOFREGISTRYGENERATEDFILE diff --git a/modules/openfast-registry/src/registry.hpp b/modules/openfast-registry/src/registry.hpp index 0232f8c5bc..48a92447ca 100644 --- a/modules/openfast-registry/src/registry.hpp +++ b/modules/openfast-registry/src/registry.hpp @@ -9,6 +9,7 @@ #include #include #include +#include std::string tolower(std::string s); @@ -307,6 +308,94 @@ struct DataType // Derived data type and all of its fields only contain reals return true; } + + void get_field_names_paths(const std::string &name_prefix, const std::string &path_prefix, int index_num, std::vector &fields) + { + // Loop through fields + for (const auto &field : this->fields) + { + std::string array_index; + switch (field.rank) + { + case 5: + array_index = ", DL%i" + std::to_string(index_num + 5) + array_index; + case 4: + array_index = ", DL%i" + std::to_string(index_num + 4) + array_index; + case 3: + array_index = ", DL%i" + std::to_string(index_num + 3) + array_index; + case 2: + array_index = ", DL%i" + std::to_string(index_num + 2) + array_index; + case 1: + array_index = "(DL%i" + std::to_string(index_num + 1) + array_index + ")"; + } + + // If field is not derived or it is a mesh + if (field.data_type->tag != Tag::Derived) + { + auto new_field = field; + new_field.name = name_prefix + "_" + field.name; + new_field.desc = path_prefix + "%" + field.name; + fields.push_back(new_field); + } + else if ((tolower(field.data_type->derived.name).compare("meshtype") == 0)) + { + auto new_field = field; + new_field.name = name_prefix + "_" + field.name; + new_field.desc = path_prefix + "%" + field.name + array_index; + fields.push_back(new_field); + } + else + { + field.data_type->derived.get_field_names_paths(name_prefix + "_" + field.name, + path_prefix + "%" + field.name + array_index, + index_num + field.rank, fields); + } + } + } + + void get_mesh_names_paths(const std::string &name_prefix, const std::string &path_prefix, int index_num, std::vector &names, std::vector &paths) + { + // Loop through fields + for (const auto &field : this->fields) + { + // Skip fields that aren't derived types or don't contain meshes + if ((field.data_type->tag != Tag::Derived) || !field.data_type->derived.contains_mesh) + { + continue; + } + + auto &ddt = field.data_type->derived; + + std::string array_index; + switch (field.rank) + { + case 5: + array_index = ", DL%i" + std::to_string(index_num + 5) + array_index; + case 4: + array_index = ", DL%i" + std::to_string(index_num + 4) + array_index; + case 3: + array_index = ", DL%i" + std::to_string(index_num + 3) + array_index; + case 2: + array_index = ", DL%i" + std::to_string(index_num + 2) + array_index; + case 1: + array_index = "(DL%i" + std::to_string(index_num + 1) + array_index + ")"; + } + + // If this field is a mesh, add field name to vector + // otherwise get mesh names within derived type + if (tolower(ddt.name).compare("meshtype") == 0) + { + names.push_back(name_prefix + "_" + field.name); + paths.push_back(path_prefix + "%" + field.name + array_index); + } + else + { + field.data_type->derived.get_mesh_names_paths(name_prefix + "_" + field.name, + path_prefix + "%" + field.name + array_index, + index_num + field.rank, names, paths); + } + } + } }; Derived derived; diff --git a/modules/openfast-registry/src/registry_gen_fortran.cpp b/modules/openfast-registry/src/registry_gen_fortran.cpp index e440e90cc6..0328df39a0 100644 --- a/modules/openfast-registry/src/registry_gen_fortran.cpp +++ b/modules/openfast-registry/src/registry_gen_fortran.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "registry.hpp" #include "templates.hpp" @@ -10,12 +11,13 @@ void gen_ExtrapInterp(std::ostream &w, const Module &mod, std::string type_name_ std::string type_kind, const bool useModPrefix); void gen_copy(std::ostream &w, const Module &mod, const DataType::Derived &ddt, const bool gen_c_code); -void gen_destroy(std::ostream &out, const Module &mod, const DataType::Derived &ddt, +void gen_destroy(std::ostream &w, const Module &mod, const DataType::Derived &ddt, const bool gen_c_code); -void gen_pack(std::ostream &out, const Module &mod, const DataType::Derived &ddt, +void gen_pack(std::ostream &w, const Module &mod, const DataType::Derived &ddt, const bool gen_c_code); -void gen_unpack(std::ostream &out, const Module &mod, const DataType::Derived &ddt, +void gen_unpack(std::ostream &w, const Module &mod, const DataType::Derived &ddt, bool gen_c_code); +void gen_var_routines(std::ostream &w, const Module &mod); void gen_copy_c2f(std::ostream &w, const Module &mod, const DataType::Derived &ddt); void gen_copy_f2c(std::ostream &w, const Module &mod, const DataType::Derived &ddt); @@ -90,6 +92,7 @@ void Registry::gen_fortran_module(const Module &mod, const std::string &out_dir) this->gen_fortran_subs(w, mod); + w << "\n"; w << "!ENDOFREGISTRYGENERATEDFILE\n"; return; } @@ -108,7 +111,8 @@ void Registry::gen_fortran_module(const Module &mod, const std::string &out_dir) // If this is the NWTC Library, we're not going to print "USE NWTC_Library" if (tolower(mod.name).compare("nwtc_library") == 0) - w << "USE SysSubs\n" + w << "USE Precision\n" + << "USE SysSubs\n" << "USE ModReg\n"; else w << "USE NWTC_Library\n"; @@ -118,7 +122,7 @@ void Registry::gen_fortran_module(const Module &mod, const std::string &out_dir) // Write parameters to file for (const auto ¶m : mod.params) { - w << " " << param.type->basic.type_fortran << ", PUBLIC, PARAMETER :: " << param.name; + w << " " << param.type->basic.type_fortran << ", PUBLIC, PARAMETER :: " << std::setw(32) << std::left << param.name; if (!param.value.empty()) w << " = " << param.value; @@ -295,13 +299,46 @@ void Registry::gen_fortran_module(const Module &mod, const std::string &out_dir) w << "! =======================\n"; } - w << "CONTAINS\n"; + int field_num = 0; + std::vector> field_params({ + {"ContinuousState", "x"}, + {"Input", "u"}, + {"Output", "y"}, + }); + + for (const auto &tmp : field_params) + { + auto type_name = mod.nickname + "_" + tmp[0] + "Type"; + if (tolower(mod.name).compare("aerodyn") == 0) + { + type_name = std::string("Rot") + tmp[0] + "Type"; + } + auto it = mod.data_types.find(type_name); + if (it == mod.data_types.end()) + continue; + + // Get mesh names in derived type or subtypes and add parameters for identifying the mesh + std::string prefix = mod.nickname + "_" + tmp[1]; + auto &ddt = it->second->derived; + std::vector fields; + ddt.get_field_names_paths(prefix, mod.nickname, 0, fields); + auto param_type = this->find_data_type("integer"); + for (const auto &field : fields) + { + ++field_num; + // w << " type(DatDesc), public, parameter :: " << std::setw(32) << std::left << field.name << " = DatDesc(" << field_num << ", " << field.rank << ", \"" << field.desc << "\")\n"; + w << " integer(IntKi), public, parameter :: " << std::setw(32) << std::left << field.name << " = " << std::setw(3) << std::right << field_num << " ! " << field.desc << "\n" + << std::left; + } + } + + w << "\ncontains\n"; // Generate subroutines for this module this->gen_fortran_subs(w, mod); // Write module footer - w << "END MODULE " << mod.name << "_Types\n"; + w << "\nEND MODULE " << mod.name << "_Types\n\n"; w << "!ENDOFREGISTRYGENERATEDFILE\n"; } @@ -348,6 +385,8 @@ void Registry::gen_fortran_subs(std::ostream &w, const Module &mod) if (tolower(mod.name).compare("aerodyn") == 0) gen_ExtrapInterp(w, mod, "InflowType", "DbKi", 1); } + + gen_var_routines(w, mod); } void gen_copy(std::ostream &w, const Module &mod, const DataType::Derived &ddt, @@ -1637,3 +1676,302 @@ void gen_copy_f2c(std::ostream &w, const Module &mod, const DataType::Derived &d w << indent << "END SUBROUTINE"; w << indent; } + +void gen_var_routines(std::ostream &w, const Module &mod) +{ + //-------------------------------------------------------------------------- + // Subroutines to get mesh pointer functions + //-------------------------------------------------------------------------- + + for (const auto &tmp : std::vector>{ + {"Input", "u"}, + {"Output", "y"}, + }) + { + auto type_name = mod.nickname + "_" + tmp[0] + "Type"; + if (tolower(mod.name).compare("aerodyn") == 0) + { + type_name = std::string("Rot") + tmp[0] + "Type"; + } + auto it = mod.data_types.find(type_name); + if (it == mod.data_types.end()) + { + continue; + } + auto &ddt = it->second->derived; + + // Get mesh names in derived type or subtypes and add parameters for identifying the mesh + std::vector mesh_names, mesh_paths; + ddt.get_mesh_names_paths(mod.nickname + "_" + tmp[1], tmp[1], 0, mesh_names, mesh_paths); + std::string routine_name = mod.nickname + "_" + tmp[0] + "MeshPointer"; + std::string indent("\n"); + + // Mesh pointer routine + w << indent << "function " << routine_name << "(" << tmp[1] << ", DL) result(Mesh)"; + indent += " "; + w << indent << std::setw(40) << "type(" + ddt.type_fortran + "), target, intent(in) " << ":: " << tmp[1]; + w << indent << "type(DatLoc), intent(in) :: DL"; + w << indent << "type(MeshType), pointer :: Mesh"; + w << indent << "nullify(Mesh)"; + w << indent << "select case (DL%Num)"; + for (int i = 0; i < mesh_paths.size(); ++i) + { + w << indent << "case (" << mesh_names[i] << ")"; + w << indent << " Mesh => " << mesh_paths[i]; + } + w << indent << "end select"; + indent.erase(indent.size() - 3); + w << indent << "end function"; + w << indent; + } + + //-------------------------------------------------------------------------- + // Subroutines to pack and unpack arrays based on variables + //-------------------------------------------------------------------------- + + for (const auto &tmp : std::vector>{ + {"ContinuousState", "x", "ContState"}, + {"ContinuousState", "x", "ContStateDeriv"}, + {"Input", "u", "Input"}, + {"Output", "y", "Output"}, + }) + { + auto base_type = tmp[0]; + auto &abbr = tmp[1]; + auto short_type = tmp[2]; + auto type_name = mod.nickname + "_" + base_type + "Type"; + if (tolower(mod.name).compare("aerodyn") == 0) + { + type_name = std::string("Rot") + base_type + "Type"; + } + auto it = mod.data_types.find(type_name); + if (it == mod.data_types.end()) + continue; + auto &ddt = it->second->derived; + + // Get mesh names in derived type or subtypes and add parameters for identifying the mesh + std::vector fields; + ddt.get_field_names_paths(mod.nickname + "_" + abbr, abbr, 0, fields); + + //-------------------------------- + // Vars packing routine + //-------------------------------- + + std::string routine_name = mod.nickname + "_VarsPack" + short_type; + std::string indent("\n"); + w << indent << "subroutine " << routine_name << "(Vars, " << abbr << ", ValAry)"; + indent += " "; + w << indent << std::setw(40) << "type(" + ddt.type_fortran + "), intent(in) " << ":: " << abbr; + w << indent << "type(ModVarsType), intent(in) :: Vars"; + w << indent << "real(R8Ki), intent(inout) :: ValAry(:)"; + w << indent << "integer(IntKi) :: i"; + w << indent << "do i = 1, size(Vars%" << abbr << ")"; + w << indent << " call " << mod.nickname + "_VarPack" + short_type + "(Vars%" << abbr << "(i), " << abbr << ", ValAry)"; + w << indent << "end do"; + indent.erase(indent.size() - 3); + w << indent << "end subroutine"; + w << indent; + + //-------------------------------- + // Var packing routine + //-------------------------------- + + w << indent << "subroutine " << mod.nickname + "_VarPack" + short_type + "(V, " << abbr << ", ValAry)"; + indent += " "; + w << indent << "type(ModVarType), intent(in) :: V"; + w << indent << std::setw(40) << "type(" + ddt.type_fortran + "), intent(in) " << ":: " << abbr; + w << indent << "real(R8Ki), intent(inout) :: ValAry(:)"; + w << indent << "associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2)))"; + indent += " "; + w << indent << "select case (DL%Num)"; + for (const auto &field : fields) + { + w << indent << "case (" << field.name << ")"; + std::string comment = "Scalar"; + auto field_path = field.desc; + if (field.data_type->tag == DataType::Tag::Derived) + { + comment = "Mesh"; + } + else if (field.rank > 0) + { + comment = std::string("Rank ") + std::to_string(field.rank) + " Array"; + } + + if ((field.name.compare("BD_x_q") == 0) && (short_type.compare("ContState") == 0)) + { + // This is a hack to convert BeamDyn's WM orientations to quaternions + w << indent << " if (V%Field == FieldOrientation) then"; + w << indent << " VarVals = wm_to_quat(wm_inv(x%q(4:6, V%j))) ! Convert WM parameters to quaternions"; + w << indent << " else"; + w << indent << std::setw(71) << " VarVals = " + field_path + "(V%iLB:V%iUB,V%j)" << "! " + comment; + w << indent << " end if"; + } + else if (field.data_type->tag == DataType::Tag::Derived) + { + w << indent << std::setw(71) <<" call MV_PackMesh(V, " + field_path + ", ValAry)" << " ! Mesh"; + } + else + { + std::string tmp; + switch (field.rank) + { + case 0: + tmp = "VarVals(1) = " + field_path; + break; + case 1: + tmp = "VarVals = " + field_path + "(V%iLB:V%iUB)"; + break; + case 2: + tmp = "VarVals = " + field_path + "(V%iLB:V%iUB,V%j)"; + break; + case 3: + tmp = "VarVals = " + field_path + "(V%iLB:V%iUB, V%j, V%k)"; + break; + case 4: + tmp = "VarVals = " + field_path + "(V%iLB:V%iUB, V%j, V%k, V%m)"; + break; + case 5: + tmp = "VarVals = " + field_path + "(V%iLB:V%iUB, V%j, V%k, V%m, V%n)"; + break; + } + w << indent << std::setw(71) << " " + tmp << " ! " + comment; + } + } + w << indent << "case default"; + w << indent << " VarVals = 0.0_R8Ki"; + w << indent << "end select"; + indent.erase(indent.size() - 3); + w << indent << "end associate"; + indent.erase(indent.size() - 3); + w << indent << "end subroutine"; + w << indent; + + //-------------------------------- + // Skip for Continuous state derivatives + //-------------------------------- + + if (short_type.compare("ContStateDeriv") == 0) + continue; + + //-------------------------------- + // Vars unpacking routine + //-------------------------------- + + indent = "\n"; + routine_name = mod.nickname + "_VarsUnpack" + short_type; + w << indent << "subroutine " << routine_name << "(Vars, ValAry, " << abbr << ")"; + indent += " "; + w << indent << "type(ModVarsType), intent(in) :: Vars"; + w << indent << "real(R8Ki), intent(in) :: ValAry(:)"; + w << indent << std::setw(40) << "type(" + ddt.type_fortran + "), intent(inout) " << ":: " + abbr; + w << indent << "integer(IntKi) :: i"; + w << indent << "do i = 1, size(Vars%" << abbr << ")"; + w << indent << " call " << mod.nickname + "_VarUnpack" + short_type + "(Vars%" << abbr << "(i), ValAry, " << abbr << ")"; + w << indent << "end do"; + indent.erase(indent.size() - 3); + w << indent << "end subroutine"; + w << indent; + + //-------------------------------- + // Var unpacking routine + //-------------------------------- + + w << indent << "subroutine " << mod.nickname + "_VarUnpack" + short_type + "(V, ValAry, " << abbr << ")"; + indent += " "; + w << indent << "type(ModVarType), intent(in) :: V"; + w << indent << "real(R8Ki), intent(in) :: ValAry(:)"; + w << indent << std::setw(40) << "type(" + ddt.type_fortran + "), intent(inout) " << ":: " << abbr; + w << indent << "associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2)))"; + indent += " "; + w << indent << "select case (DL%Num)"; + for (const auto &field : fields) + { + w << indent << "case (" << field.name << ")"; + std::string comment = "Scalar"; + auto field_path = field.desc; + if (field.rank > 0) + { + comment = std::string("Rank ") + std::to_string(field.rank) + " Array"; + } + if (field.name.compare("BD_x_q") == 0) + { + // This is a hack to convert BeamDyn's WM orientations to quaternions + w << indent << " if (V%Field == FieldOrientation) then"; + w << indent << " x%q(4:6, V%j) = wm_inv(quat_to_wm(VarVals)) ! Convert quaternion to WM parameters"; + w << indent << " else"; + w << indent << std::setw(71) << " " + field_path + "(V%iLB:V%iUB, V%j) = VarVals" << " ! Rank 2 Array"; + w << indent << " end if"; + } + else if (field.data_type->tag == DataType::Tag::Derived) + { + w << indent << std::setw(71) <<" call MV_UnpackMesh(V, ValAry, " + field_path + ")" << " ! Mesh"; + } + else + { + std::string tmp; + switch (field.rank) + { + case 0: + tmp = field_path + " = VarVals(1)"; + break; + case 1: + tmp = field_path + "(V%iLB:V%iUB) = VarVals"; + break; + case 2: + tmp = field_path + "(V%iLB:V%iUB, V%j) = VarVals"; + break; + case 3: + tmp = field_path + "(V%iLB:V%iUB, V%j, V%k) = VarVals"; + break; + case 4: + tmp = field_path + "(V%iLB:V%iUB, V%j, V%k, V%m) = VarVals"; + break; + case 5: + tmp = field_path + "(V%iLB:V%iUB, V%j, V%k, V%m, V%n) = VarVals"; + break; + } + w << indent << std::setw(71) << " " + tmp << " ! " + comment; + } + } + w << indent << "end select"; + indent.erase(indent.size() - 3); + w << indent << "end associate"; + indent.erase(indent.size() - 3); + w << indent << "end subroutine"; + w << indent; + + //-------------------------------- + // Field name routines + //-------------------------------- + + indent = "\n"; + routine_name = mod.nickname + "_" + tmp[0] + "FieldName"; + w << indent << "function " << routine_name << "(DL) result(Name)"; + indent += " "; + w << indent << "type(DatLoc), intent(in) :: DL"; + w << indent << "character(32) :: Name"; + w << indent << "select case (DL%Num)"; + for (const auto &field : fields) + { + std::string new_path(field.desc); + for (int j = 1; j < 5; ++j) + { + auto ind_str = "DL%i" + std::to_string(j); + auto ind = new_path.find(ind_str); + if (ind != std::string::npos) + { + new_path = new_path.substr(0, ind) + "\"//trim(Num2LStr(" + ind_str + "))//\"" + new_path.substr(ind + 5); + } + } + w << indent << "case (" << field.name << ")"; + w << indent << " Name = \"" << new_path << "\""; + } + w << indent << "case default"; + w << indent << " Name = \"Unknown Field\""; + w << indent << "end select"; + indent.erase(indent.size() - 3); + w << indent << "end function"; + w << indent; + } +} diff --git a/modules/openfast-registry/src/registry_parse.cpp b/modules/openfast-registry/src/registry_parse.cpp index e8ad7cdaf9..b0132ca2be 100644 --- a/modules/openfast-registry/src/registry_parse.cpp +++ b/modules/openfast-registry/src/registry_parse.cpp @@ -71,6 +71,23 @@ void Registry::parse(const std::string &file_name, const int recurse_level) auto module_name = has_slash ? fields_prev[1].substr(0, slash_index) : fields_prev[1]; this->use_modules.push_back(module_name); } + + // If this is not the root file, return + if (recurse_level != 0) + { + return; + } + + // Get the root module + std::shared_ptr mod; + for (auto &it : this->modules) + { + if (it.second->is_root) + { + mod = it.second; + break; + } + } } int Registry::parse_line(const std::string &line, std::vector &fields_prev, diff --git a/modules/openfast-registry/src/templates.hpp b/modules/openfast-registry/src/templates.hpp index 628d89bfad..b1adb0e39e 100644 --- a/modules/openfast-registry/src/templates.hpp +++ b/modules/openfast-registry/src/templates.hpp @@ -62,21 +62,9 @@ const std::string registry_template( "typedef ^ ^ LOGICAL Linearize - .FALSE. - \"Flag that tells this module if the glue code wants to linearize.\" -\n" "\n" "# Define outputs from the initialization routine here:\n" + "typedef ^ InitOutputType ModVarsType Vars - - - \"Module Variables for glue code\" - \n" "typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - \"Names of the output-to-file channels\" -\n" "typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - \"Units of the output-to-file channels\" -\n" - "# if this module has implemented linearization, return the names of the rows/columns of the Jacobian matrices:\n" - "#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_y {:} - - \"Names of the outputs used in linearization\" - \n" - "#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_x {:} - - \"Names of the continuous states used in linearization\" -\n" - "#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_xd {:} - - \"Names of the discrete states used in linearization\" -\n" - "#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_z {:} - - \"Names of the constraint states used in linearization\" -\n" - "#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_u {:} - - \"Names of the inputs used in linearization\" -\n" - "#typedef ^ InitOutputType LOGICAL RotFrame_y {:} - - \"Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame\" -\n" - "#typedef ^ InitOutputType LOGICAL RotFrame_x {:} - - \"Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame\" -\n" - "#typedef ^ InitOutputType LOGICAL RotFrame_xd {:} - - \"Flag that tells FAST if the discrete states used in linearization are in the rotating frame\" -\n" - "#typedef ^ InitOutputType LOGICAL RotFrame_z {:} - - \"Flag that tells FAST if the constraint states used in linearization are in the rotating frame\" -\n" - "#typedef ^ InitOutputType LOGICAL RotFrame_u {:} - - \"Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame\" -\n" - "#typedef ^ InitOutputType LOGICAL IsLoad_u {:} - - \"Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrices)\" -\n" - "#typedef ^ InitOutputType IntKi DerivOrder_x {:} - - \"Integer that tells FAST/MBC3 the order derivative for the continuous states used in linearization\" -\n" "\n" "\n" "# ..... States ....................................................................................................................\n" @@ -128,7 +116,7 @@ const std::string module_template( "!!\n" "! ..................................................................................................................................\n" "!! ## LICENSING\n" - "!! Copyright (C) 2012-2013, 2015-2016 National Renewable Energy Laboratory\n" + "!! Copyright (C) 2025 National Renewable Energy Laboratory\n" "!!\n" "!! This file is part of ModuleName.\n" "!!\n" @@ -180,7 +168,6 @@ const std::string module_template( " PUBLIC :: ModName_JacobianPConstrState ! Routine to compute the Jacobians of the output(Y), continuous - (X), discrete -\n" " ! (Xd), and constraint - state(Z) functions all with respect to the constraint\n" " ! states(z)\n" - " PUBLIC :: ModName_GetOP ! Routine to get the operating-point values for linearization (from data structures to arrays)\n" "\n" "CONTAINS\n" "!----------------------------------------------------------------------------------------------------------------------------------\n" @@ -212,10 +199,10 @@ const std::string module_template( "\n" " ! local variables\n" "\n" - " INTEGER(IntKi) :: NumOuts ! number of outputs; would probably be in the parameter type\n" + " CHARACTER(*), PARAMETER :: RoutineName = 'ModName_Init'\n" " INTEGER(IntKi) :: ErrStat2 ! local error status\n" " CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message\n" - " CHARACTER(*), PARAMETER :: RoutineName = 'ModName_Init'\n" + " INTEGER(IntKi) :: NumOuts ! number of outputs; would probably be in the parameter type\n" "\n" " !! Initialize variables\n" "\n" @@ -254,18 +241,16 @@ const std::string module_template( "\n" "\n" " ! Define system output initializations (set up mesh) here:\n" - " call AllocAry( y%WriteOutput, NumOuts, 'WriteOutput', ErrStat2, ErrMsg2 )\n" - " call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) ! set return error status based on local (concatenate errors)\n" - " if (ErrStat >= AbortErrLev) return ! if there are local variables that need to be deallocated, do so before early return\n" - " \n" + " call AllocAry(y%WriteOutput, NumOuts, 'WriteOutput', ErrStat2, ErrMsg2)\n" + " if (Failed()) return\n" + "\n" " y%DummyOutput = 0\n" " y%WriteOutput = 0\n" "\n" "\n" " ! Define initialization-routine output here:\n" - " call AllocAry(InitOut%WriteOutputHdr,NumOuts,'WriteOutputHdr',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" - " call AllocAry(InitOut%WriteOutputUnt,NumOuts,'WriteOutputUnt',ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" - " if (ErrStat >= AbortErrLev) return ! if there are local variables that need to be deallocated, do so before early return\n" + " call AllocAry(InitOut%WriteOutputHdr, NumOuts, 'WriteOutputHdr', ErrStat2, ErrMsg2); if (Failed()) return\n" + " call AllocAry(InitOut%WriteOutputUnt, NumOuts, 'WriteOutputUnt', ErrStat2, ErrMsg2); if (Failed()) return\n" "\n" " InitOut%WriteOutputHdr = (/ 'Time ', 'Column2' /)\n" " InitOut%WriteOutputUnt = (/ '(s)', '(-)' /)\n" @@ -277,21 +262,17 @@ const std::string module_template( " !Interval = p%DT\n" "\n" "\n" - " if (InitInp%Linearize) then\n" - "\n" - " ! If this module does not implement the four Jacobian routines at the end of this template, or the module cannot\n" - " ! linearize with the features that are enabled, stop the simulation if InitInp%Linearize is true.\n" - "\n" - " CALL SetErrStat( ErrID_Fatal, 'ModuleName cannot perform linearization analysis.', ErrStat, ErrMsg, RoutineName)\n" - "\n" - " ! Otherwise, if the module does allow linearization, return the appropriate Jacobian row/column names and rotating-frame flags here:\n" - " ! Allocate and set these variables: InitOut%LinNames_y, InitOut%LinNames_x, InitOut%LinNames_xd, InitOut%LinNames_z, InitOut%LinNames_u\n" - " ! Allocate and set these variables: InitOut%RotFrame_y, InitOut%RotFrame_x, InitOut%RotFrame_xd, InitOut%RotFrame_z, InitOut%RotFrame_u\n" - " ! Allocate and set these variables: InitOut%IsLoad_u, InitOut%DerivOrder_x\n" - "\n" - " end if\n" "\n" "\n" + "contains\n" + " logical function Failed()\n" + " call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName)\n" + " Failed = ErrStat >= AbortErrLev\n" + " if (Failed) Cleanup()\n" + " end function Failed\n" + " subroutine Cleanup()\n" + " ! Add code to deallocate local variables when an error occurs" + " end subroutine\n" "END SUBROUTINE ModName_Init\n" "!----------------------------------------------------------------------------------------------------------------------------------\n" "!> This routine is called at the end of the simulation.\n" @@ -310,9 +291,9 @@ const std::string module_template( " CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None\n" "\n" " ! local variables\n" + " CHARACTER(*), PARAMETER :: RoutineName = 'ModName_End'\n" " INTEGER(IntKi) :: ErrStat2 ! local error status\n" " CHARACTER(ErrMsgLen) :: ErrMsg2 ! local error message\n" - " CHARACTER(*), PARAMETER :: RoutineName = 'ModName_End'\n" "\n" " ! Initialize ErrStat\n" "\n" @@ -328,31 +309,29 @@ const std::string module_template( "\n" " !! Destroy the input data:\n" "\n" - " call ModName_DestroyInput( u, ErrStat2, ErrMsg2 )\n" - " call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" + " call ModName_DestroyInput(u, ErrStat2, ErrMsg2); if (Failed()) return\n" "\n" "\n" " !! Destroy the parameter data:\n" "\n" - " call ModName_DestroyParam( p, ErrStat2, ErrMsg2 )\n" - " call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" + " call ModName_DestroyParam(p, ErrStat2, ErrMsg2); if (Failed()) return\n" "\n" " !! Destroy the state data:\n" "\n" - " call ModName_DestroyContState( x, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" - " call ModName_DestroyDiscState( xd, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" - " call ModName_DestroyConstrState( z, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" - " call ModName_DestroyOtherState( OtherState, ErrStat2,ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" + " call ModName_DestroyContState( x, ErrStat2, ErrMsg2); if (Failed()) return\n" + " call ModName_DestroyDiscState( xd, ErrStat2, ErrMsg2); if (Failed()) return\n" + " call ModName_DestroyConstrState(z, ErrStat2, ErrMsg2); if (Failed()) return\n" + " call ModName_DestroyOtherState( OtherState, ErrStat2, ErrMsg2); if (Failed()) return\n" "\n" "\n" " !! Destroy the output data:\n" "\n" - " call ModName_DestroyOutput( y, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" + " call ModName_DestroyOutput(y, ErrStat2, ErrMsg2); if (Failed()) return\n" "\n" " \n" " !! Destroy the misc data:\n" "\n" - " call ModName_DestroyMisc( misc, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName)\n" + " call ModName_DestroyMisc(misc, ErrStat2, ErrMsg2); if (Failed()) return\n" "\n" "\n" "END SUBROUTINE ModName_End\n" @@ -911,61 +890,8 @@ const std::string module_template( "\n" "\n" "END SUBROUTINE ModName_JacobianPConstrState\n" - "!----------------------------------------------------------------------------------------------------------------------------------\n" - "!> Routine to pack the data structures representing the operating points into arrays for linearization.\n" - "SUBROUTINE ModName_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op )\n" - "\n" - " REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point\n" - " TYPE(ModName_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required)\n" - " TYPE(ModName_ParameterType), INTENT(IN ) :: p !< Parameters\n" - " TYPE(ModName_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point\n" - " TYPE(ModName_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point\n" - " TYPE(ModName_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point\n" - " TYPE(ModName_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point\n" - " TYPE(ModName_OutputType), INTENT(IN ) :: y !< Output at operating point\n" - " TYPE(ModName_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables\n" - " INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation\n" - " CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None\n" - " REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs\n" - " REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs\n" - " REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states\n" - " REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states\n" - " REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states\n" - " REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states\n" - "\n" - "\n" - " ! Initialize ErrStat\n" - "\n" - " ErrStat = ErrID_None\n" - " ErrMsg = ''\n" - "\n" - " IF ( PRESENT( u_op ) ) THEN\n" - "\n" - " END IF\n" - "\n" - " IF ( PRESENT( y_op ) ) THEN\n" - " END IF\n" - "\n" - " IF ( PRESENT( x_op ) ) THEN\n" - "\n" - " END IF\n" - "\n" - " IF ( PRESENT( dx_op ) ) THEN\n" - "\n" - " END IF\n" - "\n" - " IF ( PRESENT( xd_op ) ) THEN\n" - "\n" - " END IF\n" - "\n" - " IF ( PRESENT( z_op ) ) THEN\n" - "\n" - " END IF\n" - "\n" - "END SUBROUTINE ModName_GetOP\n" - "!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" "\n" "END MODULE ModuleName\n" "!**********************************************************************************************************************************\n"); -#endif \ No newline at end of file +#endif diff --git a/modules/orcaflex-interface/CMakeLists.txt b/modules/orcaflex-interface/CMakeLists.txt index 737f57be9a..e2f9748484 100644 --- a/modules/orcaflex-interface/CMakeLists.txt +++ b/modules/orcaflex-interface/CMakeLists.txt @@ -18,12 +18,18 @@ if (GENERATE_TYPES) generate_f90_types(src/OrcaFlexInterface.txt ${CMAKE_CURRENT_LIST_DIR}/src/OrcaFlexInterface_Types.f90) endif() +if (WIN_DLL_LOAD) + add_definitions(-DLibLoad) +else (WIN_DLL_LOAD) + add_definitions(-DNO_LibLoad) +endif (WIN_DLL_LOAD) + add_library(orcaflexlib STATIC src/OrcaFlexInterface.f90 src/OrcaFlexInterface_Types.f90 ) target_link_libraries(orcaflexlib nwtclibs) -if (ORCA_DLL_LOAD) +if (WIN_DLL_LOAD) target_compile_definitions(orcaflexlib PUBLIC LibLoad) else () target_compile_definitions(orcaflexlib PUBLIC NO_LibLoad) diff --git a/modules/orcaflex-interface/src/OrcaFlexInterface.f90 b/modules/orcaflex-interface/src/OrcaFlexInterface.f90 index 3671b6266c..1f37fc862a 100644 --- a/modules/orcaflex-interface/src/OrcaFlexInterface.f90 +++ b/modules/orcaflex-interface/src/OrcaFlexInterface.f90 @@ -375,8 +375,18 @@ SUBROUTINE Orca_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO m%PtfmFt = 0.0_ReKi m%LastTimeStep = -1.0_DbKi - InitOut%Ver = Orca_Ver + !............................................................................................ + ! Module Variables + !............................................................................................ + + call Orca_InitVars(u, p, x, y, m, InitOut, .false., ErrStatTmp, ErrMsgTmp) + CALL SetErrStat( ErrStatTmp, ErrMsgTmp, ErrStat, ErrMsg, RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp + RETURN + END IF + InitOut%Ver = Orca_Ver CONTAINS !------------------------------------------------------------------ @@ -391,6 +401,59 @@ END SUBROUTINE CleanUp END SUBROUTINE Orca_Init +!---------------------------------------------------------------------------------------------------------------------------------- + +subroutine Orca_InitVars(u, p, x, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(Orca_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(Orca_ParameterType), intent(inout) :: p !< Parameters + type(Orca_ContinuousStateType), intent(inout) :: x !< Continuous state + type(Orca_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(Orca_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(Orca_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in ) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent( out) :: ErrStat !< Error status of the operation + character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'Orca_InitVars' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i, j, Flags, idx + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(InitOut%Vars%u, "PtfmMesh", MotionFields, DatLoc(Orca_u_PtfmMesh), & + Mesh=u%PtfmMesh) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(InitOut%Vars%y, 'PtfmMesh', LoadFields, DatLoc(Orca_y_PtfmMesh), & + Mesh=y%PtfmMesh) + + !---------------------------------------------------------------------------- + ! Initialize Variables and Values + !---------------------------------------------------------------------------- + + CALL MV_InitVarsJac(InitOut%Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- !> This routine reads in the primary OrcaFlex Interface input file and places the values it reads in the InputFileData structure. !! It opens an echo file if requested. diff --git a/modules/orcaflex-interface/src/OrcaFlexInterface.txt b/modules/orcaflex-interface/src/OrcaFlexInterface.txt index da75c894e1..9e901a31a7 100644 --- a/modules/orcaflex-interface/src/OrcaFlexInterface.txt +++ b/modules/orcaflex-interface/src/OrcaFlexInterface.txt @@ -22,6 +22,7 @@ typedef ^ ^ ReKi TMax typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - typedef ^ ^ CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - +typedef ^ ^ ModVarsType Vars - - - "Module Variables" # Inputfile information @@ -44,7 +45,8 @@ typedef ^ OtherStateType SiKi DummyOtherState - - - "Remov # ..... Misc/Optimization variables................................................................................................. # Define any data that are used only for efficiency purposes (these variables are not associated with time): # e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. -typedef ^ MiscVarType ReKi PtfmAM {6}{6} - - "Added mass matrix results from OrcaFlex" - +typedef ^ MiscVarType ModJacType Jac - - - "Jacobian matrices and arrays corresponding to module variables" +typedef ^ ^ ReKi PtfmAM {6}{6} - - "Added mass matrix results from OrcaFlex" - typedef ^ ^ ReKi PtfmFt {6} - - "Force/moment results from OrcaFlex" - typedef ^ ^ ReKi F_PtfmAM {6} - - "Force/moment results calculated from the added mass and accel" - typedef ^ ^ ReKi AllOuts : - - "An array holding the value of all of the calculated (not only selected) output channels" "see OutListParameters.xlsx spreadsheet" diff --git a/modules/orcaflex-interface/src/OrcaFlexInterface_Types.f90 b/modules/orcaflex-interface/src/OrcaFlexInterface_Types.f90 index 8b70866a69..26c51b23bd 100644 --- a/modules/orcaflex-interface/src/OrcaFlexInterface_Types.f90 +++ b/modules/orcaflex-interface/src/OrcaFlexInterface_Types.f90 @@ -45,6 +45,7 @@ MODULE OrcaFlexInterface_Types TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE Orca_InitOutputType ! ======================= ! ========= Orca_InputFile ======= @@ -63,6 +64,7 @@ MODULE OrcaFlexInterface_Types ! ======================= ! ========= Orca_MiscVarType ======= TYPE, PUBLIC :: Orca_MiscVarType + TYPE(ModJacType) :: Jac !< Jacobian matrices and arrays corresponding to module variables [-] REAL(ReKi) , DIMENSION(1:6,1:6) :: PtfmAM = 0.0_ReKi !< Added mass matrix results from OrcaFlex [-] REAL(ReKi) , DIMENSION(1:6) :: PtfmFt = 0.0_ReKi !< Force/moment results from OrcaFlex [-] REAL(ReKi) , DIMENSION(1:6) :: F_PtfmAM = 0.0_ReKi !< Force/moment results calculated from the added mass and accel [-] @@ -106,7 +108,12 @@ MODULE OrcaFlexInterface_Types REAL(ReKi) :: DummyConstrState = 0.0_ReKi !< Dummy placeholder [-] END TYPE Orca_ConstraintStateType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: Orca_x_Dummy = 1 ! Orca%Dummy + integer(IntKi), public, parameter :: Orca_u_PtfmMesh = 2 ! Orca%PtfmMesh + integer(IntKi), public, parameter :: Orca_y_PtfmMesh = 3 ! Orca%PtfmMesh + integer(IntKi), public, parameter :: Orca_y_WriteOutput = 4 ! Orca%WriteOutput + +contains subroutine Orca_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(Orca_InitInputType), intent(in) :: SrcInitInputData @@ -191,6 +198,9 @@ subroutine Orca_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, E end if DstInitOutputData%WriteOutputUnt = SrcInitOutputData%WriteOutputUnt end if + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine Orca_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -210,6 +220,8 @@ subroutine Orca_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) if (allocated(InitOutputData%WriteOutputUnt)) then deallocate(InitOutputData%WriteOutputUnt) end if + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine Orca_PackInitOutput(RF, Indata) @@ -220,6 +232,7 @@ subroutine Orca_PackInitOutput(RF, Indata) call NWTC_Library_PackProgDesc(RF, InData%Ver) call RegPackAlloc(RF, InData%WriteOutputHdr) call RegPackAlloc(RF, InData%WriteOutputUnt) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -234,6 +247,7 @@ subroutine Orca_UnPackInitOutput(RF, OutData) call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine Orca_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg) @@ -332,9 +346,13 @@ subroutine Orca_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) character(*), intent( out) :: ErrMsg integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'Orca_CopyMisc' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return DstMiscData%PtfmAM = SrcMiscData%PtfmAM DstMiscData%PtfmFt = SrcMiscData%PtfmFt DstMiscData%F_PtfmAM = SrcMiscData%F_PtfmAM @@ -357,9 +375,13 @@ subroutine Orca_DestroyMisc(MiscData, ErrStat, ErrMsg) type(Orca_MiscVarType), intent(inout) :: MiscData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'Orca_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(MiscData%AllOuts)) then deallocate(MiscData%AllOuts) end if @@ -370,6 +392,7 @@ subroutine Orca_PackMisc(RF, Indata) type(Orca_MiscVarType), intent(in) :: InData character(*), parameter :: RoutineName = 'Orca_PackMisc' if (RF%ErrStat >= AbortErrLev) return + call NWTC_Library_PackModJacType(RF, InData%Jac) call RegPack(RF, InData%PtfmAM) call RegPack(RF, InData%PtfmFt) call RegPack(RF, InData%F_PtfmAM) @@ -386,6 +409,7 @@ subroutine Orca_UnPackMisc(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac call RegUnpack(RF, OutData%PtfmAM); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmFt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%F_PtfmAM); if (RegCheckErr(RF, RoutineName)) return @@ -1054,5 +1078,230 @@ SUBROUTINE Orca_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, E y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function Orca_InputMeshPointer(u, DL) result(Mesh) + type(Orca_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (Orca_u_PtfmMesh) + Mesh => u%PtfmMesh + end select +end function + +function Orca_OutputMeshPointer(y, DL) result(Mesh) + type(Orca_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (Orca_y_PtfmMesh) + Mesh => y%PtfmMesh + end select +end function + +subroutine Orca_VarsPackContState(Vars, x, ValAry) + type(Orca_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call Orca_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine Orca_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(Orca_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Orca_x_Dummy) + VarVals(1) = x%Dummy ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Orca_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Orca_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call Orca_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine Orca_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Orca_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Orca_x_Dummy) + x%Dummy = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function Orca_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Orca_x_Dummy) + Name = "x%Dummy" + case default + Name = "Unknown Field" + end select +end function + +subroutine Orca_VarsPackContStateDeriv(Vars, x, ValAry) + type(Orca_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call Orca_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine Orca_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(Orca_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Orca_x_Dummy) + VarVals(1) = x%Dummy ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Orca_VarsPackInput(Vars, u, ValAry) + type(Orca_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call Orca_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine Orca_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(Orca_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Orca_u_PtfmMesh) + call MV_PackMesh(V, u%PtfmMesh, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Orca_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Orca_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call Orca_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine Orca_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Orca_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Orca_u_PtfmMesh) + call MV_UnpackMesh(V, ValAry, u%PtfmMesh) ! Mesh + end select + end associate +end subroutine + +function Orca_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Orca_u_PtfmMesh) + Name = "u%PtfmMesh" + case default + Name = "Unknown Field" + end select +end function + +subroutine Orca_VarsPackOutput(Vars, y, ValAry) + type(Orca_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call Orca_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine Orca_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(Orca_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Orca_y_PtfmMesh) + call MV_PackMesh(V, y%PtfmMesh, ValAry) ! Mesh + case (Orca_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine Orca_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(Orca_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call Orca_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine Orca_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(Orca_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (Orca_y_PtfmMesh) + call MV_UnpackMesh(V, ValAry, y%PtfmMesh) ! Mesh + case (Orca_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function Orca_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (Orca_y_PtfmMesh) + Name = "y%PtfmMesh" + case (Orca_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE OrcaFlexInterface_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/CMakeLists.txt b/modules/seastate/CMakeLists.txt index 2b834f0e8d..4a624f62ae 100644 --- a/modules/seastate/CMakeLists.txt +++ b/modules/seastate/CMakeLists.txt @@ -37,7 +37,7 @@ add_library(seastlib STATIC src/SeaSt_WaveField_Types.f90 src/SeaState_Types.f90 ) -target_link_libraries(seastlib nwtclibs versioninfolib) +target_link_libraries(seastlib ifwlib nwtclibs versioninfolib) # C-bindings interface library @@ -48,13 +48,14 @@ target_link_libraries(seastlib nwtclibs versioninfolib) add_library(seastate_c_binding_object OBJECT src/SeaState_C_Binding.f90) target_link_libraries(seastate_c_binding_object seastlib nwtclibs versioninfolib) set_property(TARGET seastate_c_binding_object PROPERTY POSITION_INDEPENDENT_CODE 1) # required for shared libs +if(APPLE OR UNIX) + target_compile_definitions(seastate_c_binding_object PRIVATE IMPLICIT_DLLEXPORT) +endif() # shared add_library(seastate_c_binding SHARED $) target_link_libraries(seastate_c_binding seastlib nwtclibs versioninfolib) -if(APPLE OR UNIX) - target_compile_definitions(seastate_c_binding PRIVATE IMPLICIT_DLLEXPORT) -endif() + # C-bindings static interface # This is a workaround for building wavetank into a single DLL (also allows setting CU globaly for sending screen to file for labview integration) diff --git a/modules/seastate/src/Current.f90 b/modules/seastate/src/Current.f90 index 5d57f642e5..83f7786c99 100644 --- a/modules/seastate/src/Current.f90 +++ b/modules/seastate/src/Current.f90 @@ -215,7 +215,6 @@ SUBROUTINE Current_Init( InitInp, InitOut, ErrStat, ErrMsg ) END DO END IF - ! Compute the partial derivative for wave stretching CALL Calc_Current( InitInp, 0.0_SiKi, InitInp%EffWtrDpth, InitInp%DirRoot, CurrVxi0, CurrVyi0 ) @@ -224,6 +223,9 @@ SUBROUTINE Current_Init( InitInp, InitOut, ErrStat, ErrMsg ) InitOut%PCurrVxiPz0 = ( CurrVxi0 - CurrVxiS )/SmllNmbr ! xi-direction InitOut%PCurrVyiPz0 = ( CurrVyi0 - CurrVyiS )/SmllNmbr ! yi-direction + ! Save the current velocity at the surface for wave-current modeling + InitOut%CurrVxi0 = CurrVxi0 + InitOut%CurrVyi0 = CurrVyi0 END SUBROUTINE Current_Init diff --git a/modules/seastate/src/Current.txt b/modules/seastate/src/Current.txt index f4f6ccd0e3..9c076b60e2 100644 --- a/modules/seastate/src/Current.txt +++ b/modules/seastate/src/Current.txt @@ -39,5 +39,7 @@ typedef ^ InitOutputType SiKi Cu typedef ^ ^ SiKi CurrVyi {:} - - "" - typedef ^ ^ SiKi PCurrVxiPz0 - - - "" - typedef ^ ^ SiKi PCurrVyiPz0 - - - "" - +typedef ^ ^ SiKi CurrVxi0 - - - "" - +typedef ^ ^ SiKi CurrVyi0 - - - "" - # diff --git a/modules/seastate/src/Current_Types.f90 b/modules/seastate/src/Current_Types.f90 index 3ed765adbd..b8a15c83a4 100644 --- a/modules/seastate/src/Current_Types.f90 +++ b/modules/seastate/src/Current_Types.f90 @@ -56,9 +56,12 @@ MODULE Current_Types REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: CurrVyi !< [-] REAL(SiKi) :: PCurrVxiPz0 = 0.0_R4Ki !< [-] REAL(SiKi) :: PCurrVyiPz0 = 0.0_R4Ki !< [-] + REAL(SiKi) :: CurrVxi0 = 0.0_R4Ki !< [-] + REAL(SiKi) :: CurrVyi0 = 0.0_R4Ki !< [-] END TYPE Current_InitOutputType ! ======================= -CONTAINS + +contains subroutine Current_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(Current_InitInputType), intent(in) :: SrcInitInputData @@ -190,6 +193,8 @@ subroutine Current_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode end if DstInitOutputData%PCurrVxiPz0 = SrcInitOutputData%PCurrVxiPz0 DstInitOutputData%PCurrVyiPz0 = SrcInitOutputData%PCurrVyiPz0 + DstInitOutputData%CurrVxi0 = SrcInitOutputData%CurrVxi0 + DstInitOutputData%CurrVyi0 = SrcInitOutputData%CurrVyi0 end subroutine subroutine Current_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -216,6 +221,8 @@ subroutine Current_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%CurrVyi) call RegPack(RF, InData%PCurrVxiPz0) call RegPack(RF, InData%PCurrVyiPz0) + call RegPack(RF, InData%CurrVxi0) + call RegPack(RF, InData%CurrVyi0) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -231,6 +238,10 @@ subroutine Current_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%CurrVyi); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PCurrVxiPz0); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PCurrVyiPz0); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CurrVxi0); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CurrVyi0); if (RegCheckErr(RF, RoutineName)) return end subroutine + END MODULE Current_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/SeaSt_WaveField.f90 b/modules/seastate/src/SeaSt_WaveField.f90 index 392576750a..a2ec7321da 100644 --- a/modules/seastate/src/SeaSt_WaveField.f90 +++ b/modules/seastate/src/SeaSt_WaveField.f90 @@ -2,6 +2,7 @@ MODULE SeaSt_WaveField USE GridInterp USE SeaSt_WaveField_Types +USE IfW_FlowField, only: IfW_FlowField_GetVelAcc USE GridInterp_Types IMPLICIT NONE @@ -9,105 +10,61 @@ MODULE SeaSt_WaveField PRIVATE ! Public functions and subroutines -PUBLIC WaveField_GetNodeWaveElev1 -PUBLIC WaveField_GetNodeWaveElev2 PUBLIC WaveField_GetNodeTotalWaveElev PUBLIC WaveField_GetMinMaxWaveElevEstimate PUBLIC WaveField_GetNodeWaveNormal PUBLIC WaveField_GetNodeWaveKin +PUBLIC WaveField_GetNodeWaveVel PUBLIC WaveField_GetNodeWaveVelAcc PUBLIC WaveField_GetWaveKin +PUBLIC WaveField_GetWaveVelAcc_AD +PUBLIC WaveField_GetMeanDynSurfCurr PUBLIC WaveField_GetDynP CONTAINS !-------------------- Subroutine for wave elevation ------------------! -function WaveField_GetNodeWaveElev1( WaveField, WaveField_m, Time, pos, ErrStat, ErrMsg ) + +FUNCTION WaveField_GetNodeTotalWaveElev( WaveField, WaveField_m, Time, pos, ErrStat, ErrMsg, Elev1, Elev2 ) type(SeaSt_WaveFieldType), intent(in ) :: WaveField type(GridInterp_MiscVarType), intent(inout) :: WaveField_m real(DbKi), intent(in ) :: Time real(ReKi), intent(in ) :: pos(*) ! Position at which free-surface elevation is to be calculated. Third entry ignored if present. integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if errStat /= ErrID_None + real(SiKi), optional, intent( out) :: Elev1, Elev2 ! Elev1 and Elev2 components - real(SiKi) :: WaveField_GetNodeWaveElev1 - real(SiKi) :: Zeta - character(*), parameter :: RoutineName = 'WaveField_GetNodeWaveElev1' + real(SiKi) :: WaveField_GetNodeTotalWaveElev + real(SiKi) :: Zeta1, Zeta2 + character(*), parameter :: RoutineName = 'WaveField_GetNodeTotalWaveElev' integer(IntKi) :: errStat2 character(ErrMsgLen) :: errMsg2 ErrStat = ErrID_None - ErrMsg = "" + + IF (ALLOCATED(WaveField%WaveElev1) .or. ALLOCATED(WaveField%WaveElev2)) then + CALL WaveField_Interp_Setup3D(Time, pos, WaveField%SrfGridParams, WaveField_m, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end if IF (ALLOCATED(WaveField%WaveElev1)) THEN - CALL WaveField_Interp_Setup3D( Time+WaveField%WaveTimeShift, pos, WaveField%SrfGridParams, WaveField_m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Zeta = GridInterp3D(WaveField%WaveElev1,WaveField_m) + Zeta1 = GridInterp3D(WaveField%WaveElev1, WaveField_m) ELSE - Zeta = 0.0_SiKi + Zeta1 = 0.0_SiKi END IF - WaveField_GetNodeWaveElev1 = Zeta - -end function WaveField_GetNodeWaveElev1 - - -function WaveField_GetNodeWaveElev2( WaveField, WaveField_m, Time, pos, ErrStat, ErrMsg ) - type(SeaSt_WaveFieldType), intent(in ) :: WaveField - type(GridInterp_MiscVarType), intent(inout) :: WaveField_m - real(DbKi), intent(in ) :: Time - real(ReKi), intent(in ) :: pos(*) ! Position at which free-surface elevation is to be calculated. Third entry ignored if present. - integer(IntKi), intent( out) :: ErrStat ! Error status of the operation - character(*), intent( out) :: ErrMsg ! Error message if errStat /= ErrID_None - - real(SiKi) :: WaveField_GetNodeWaveElev2 - real(SiKi) :: Zeta - character(*), parameter :: RoutineName = 'WaveField_GetNodeWaveElev2' - integer(IntKi) :: errStat2 - character(ErrMsgLen) :: errMsg2 - - ErrStat = ErrID_None - ErrMsg = "" - IF (ALLOCATED(WaveField%WaveElev2)) THEN - CALL WaveField_Interp_Setup3D( Time+WaveField%WaveTimeShift, pos, WaveField%SrfGridParams, WaveField_m, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Zeta = GridInterp3D(WaveField%WaveElev2,WaveField_m) + Zeta2 = GridInterp3D(WaveField%WaveElev2, WaveField_m) ELSE - Zeta = 0.0_SiKi + Zeta2 = 0.0_SiKi END IF - WaveField_GetNodeWaveElev2 = Zeta - -end function WaveField_GetNodeWaveElev2 - + if (present(Elev1)) Elev1 = Zeta1 + if (present(Elev2)) Elev2 = Zeta2 -FUNCTION WaveField_GetNodeTotalWaveElev( WaveField, WaveField_m, Time, pos, ErrStat, ErrMsg ) - type(SeaSt_WaveFieldType), intent(in ) :: WaveField - type(GridInterp_MiscVarType), intent(inout) :: WaveField_m - real(DbKi), intent(in ) :: Time - real(ReKi), intent(in ) :: pos(*) ! Position at which free-surface elevation is to be calculated. Third entry ignored if present. - integer(IntKi), intent( out) :: ErrStat ! Error status of the operation - character(*), intent( out) :: ErrMsg ! Error message if errStat /= ErrID_None - - real(SiKi) :: WaveField_GetNodeTotalWaveElev - real(SiKi) :: Zeta1, Zeta2 - character(*), parameter :: RoutineName = 'WaveField_GetNodeTotalWaveElev' - integer(IntKi) :: errStat2 - character(ErrMsgLen) :: errMsg2 - - ErrStat = ErrID_None - ErrMsg = "" - - Zeta1 = WaveField_GetNodeWaveElev1( WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2 ); if (Failed()) return; - Zeta2 = WaveField_GetNodeWaveElev2( WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2 ); if (Failed()) return; WaveField_GetNodeTotalWaveElev = Zeta1 + Zeta2 -contains - logical function Failed() - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - end function END FUNCTION WaveField_GetNodeTotalWaveElev @@ -146,7 +103,7 @@ SUBROUTINE WaveField_GetNodeWaveNormal( WaveField, WaveField_m, Time, pos, n, Er type(SeaSt_WaveFieldType), intent(in ) :: WaveField type(GridInterp_MiscVarType), intent(inout) :: WaveField_m real(DbKi), intent(in ) :: Time - real(ReKi), intent(in ) :: pos(*) ! Position at which free-surface normal is to be calculated. Third entry ignored if present. + real(ReKi), intent(in ) :: pos(:) ! Position at which free-surface normal is to be calculated. Third entry ignored if present. real(ReKi), intent( out) :: n(3) ! Free-surface normal vector integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if errStat /= ErrID_None @@ -157,7 +114,6 @@ SUBROUTINE WaveField_GetNodeWaveNormal( WaveField, WaveField_m, Time, pos, n, Er character(ErrMsgLen) :: errMsg2 ErrStat = ErrID_None - ErrMsg = "" call GridInterpSetupN( (/Real(Time+WaveField%WaveTimeShift,ReKi),pos(1),pos(2)/), WaveField%SrfGridParams, WaveField_m, ErrStat2, ErrMsg2 ) slope = GridInterpS( WaveField%WaveElev1, WaveField%SrfGridParams, WaveField_m ) @@ -177,12 +133,13 @@ END SUBROUTINE WaveField_GetNodeWaveNormal !-------------------- Subroutine for full wave field kinematics --------------------! -SUBROUTINE WaveField_GetNodeWaveKin( WaveField, WaveField_m, Time, pos, forceNodeInWater, nodeInWater, WaveElev1, WaveElev2, WaveElev, FDynP, FV, FA, FAMCF, ErrStat, ErrMsg ) +SUBROUTINE WaveField_GetNodeWaveKin( WaveField, WaveField_m, Time, pos, forceNodeInWater, fetchDynCurrent, nodeInWater, WaveElev1, WaveElev2, WaveElev, FDynP, FV, FA, FAMCF, ErrStat, ErrMsg ) type(SeaSt_WaveFieldType), intent(in ) :: WaveField type(GridInterp_MiscVarType), intent(inout) :: WaveField_m real(DbKi), intent(in ) :: Time real(ReKi), intent(in ) :: pos(3) logical, intent(in ) :: forceNodeInWater + logical, intent(in ) :: fetchDynCurrent real(SiKi), intent( out) :: WaveElev1 real(SiKi), intent( out) :: WaveElev2 real(SiKi), intent( out) :: WaveElev @@ -194,22 +151,22 @@ SUBROUTINE WaveField_GetNodeWaveKin( WaveField, WaveField_m, Time, pos, forceNod integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if errStat /= ErrID_None - real(ReKi) :: posXY(2), posPrime(3), posXY0(3) + real(ReKi) :: posXY(2), posPrime(3), posXY0(3), PosOffset(3), posDummy(3,1) + integer(IntKi) :: startNode + real(ReKi), allocatable :: FV_DC(:,:), FA_DC(:,:) character(*), parameter :: RoutineName = 'WaveField_GetNodeWaveKin' integer(IntKi) :: errStat2 character(ErrMsgLen) :: errMsg2 ErrStat = ErrID_None - ErrMsg = "" posXY = pos(1:2) posXY0 = (/pos(1),pos(2),0.0_ReKi/) FAMCF(:) = 0.0 - ! Wave elevation - WaveElev1 = WaveField_GetNodeWaveElev1( WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2 ); if (Failed()) return; - WaveElev2 = WaveField_GetNodeWaveElev2( WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2 ); if (Failed()) return; - WaveElev = WaveElev1 + WaveElev2 + ! Wave elevation (Calls WaveField_Interp_Setup3D internally so WaveField_Interp_3D can be used below) + WaveElev = WaveField_GetNodeTotalWaveElev(WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2, Elev1=WaveElev1, Elev2=WaveElev2) + if (Failed()) return IF (WaveField%WaveStMod == 0) THEN ! No wave stretching @@ -261,7 +218,7 @@ SUBROUTINE WaveField_GetNodeWaveKin( WaveField, WaveField_m, Time, pos, forceNod FAMCF(:) = GridInterp4DVec( WaveField%WaveAccMCF, WaveField_m ) END IF - ! Extrapoled wave stretching + ! Extrapolated wave stretching IF (WaveField%WaveStMod == 2) THEN CALL WaveField_Interp_Setup3D( Time+WaveField%WaveTimeShift, posXY, WaveField%SrfGridParams, WaveField_m, ErrStat2, ErrMsg2 ); if (Failed()) return; FV(:) = FV(:) + GridInterp3DVec( WaveField%PWaveVel0, WaveField_m ) * pos(3) @@ -303,11 +260,28 @@ SUBROUTINE WaveField_GetNodeWaveKin( WaveField, WaveField_m, Time, pos, forceNod END IF ! If wave stretching is on or off + ! Get dynamic current velocity and acceleration + IF (fetchDynCurrent .AND. WaveField%hasCurrField) THEN + startNode = -1 + PosOffset = (/0.0_ReKi,0.0_ReKi,WaveField%EffWtrDpth/) + posDummy(:,1) = pos + ALLOCATE(FV_DC(3,1), STAT=ErrStat2); if (FailedMsg('Error allocating FV_DC')) return; + ALLOCATE(FA_DC(3,1), STAT=ErrStat2); if (FailedMsg('Error allocating FA_DC')) return; + CALL IfW_FlowField_GetVelAcc(WaveField%CurrField, startNode, Time, posDummy, FV_DC, FA_DC, ErrStat2, ErrMsg2, PosOffset=PosOffset); if (Failed()) return; + FV = FV + nodeInWater * FV_DC(:,1) + FA = FA + nodeInWater * FA_DC(:,1) + END IF + contains logical function Failed() call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) Failed = ErrStat >= AbortErrLev end function + logical function FailedMsg(ErrMsg2) + character(*), intent(in ) :: ErrMsg2 + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + FailedMsg = ErrStat >= AbortErrLev + end function END SUBROUTINE WaveField_GetNodeWaveKin @@ -330,8 +304,6 @@ SUBROUTINE WaveField_GetDynP( WaveField, WaveField_m, Time, pos, forceNodeInWate character(ErrMsgLen) :: errMsg2 ! Temporary vars not kept - real(SiKi) :: WaveElev1 - real(SiKi) :: WaveElev2 real(SiKi) :: WaveElev ErrStat = ErrID_None @@ -340,10 +312,8 @@ SUBROUTINE WaveField_GetDynP( WaveField, WaveField_m, Time, pos, forceNodeInWate posXY = pos(1:2) posXY0 = (/pos(1),pos(2),0.0_ReKi/) - ! Wave elevation - WaveElev1 = WaveField_GetNodeWaveElev1( WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2 ); if (Failed()) return; - WaveElev2 = WaveField_GetNodeWaveElev2( WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2 ); if (Failed()) return; - WaveElev = WaveElev1 + WaveElev2 + ! Wave elevation (Calls WaveField_Interp_Setup3D internally so WaveField_Interp_3D_vec can be used below) + WaveElev = WaveField_GetNodeTotalWaveElev( WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2 ); if (Failed()) return; IF (WaveField%WaveStMod == 0) THEN ! No wave stretching @@ -409,33 +379,148 @@ END SUBROUTINE WaveField_GetDynP !-------------------- Subroutine for wave field velocity only --------------------! -SUBROUTINE WaveField_GetNodeWaveVelAcc( WaveField, WaveField_m, Time, pos, forceNodeInWater, nodeInWater, FV, FA, ErrStat, ErrMsg ) +SUBROUTINE WaveField_GetNodeWaveVel( WaveField, WaveField_m, Time, pos, forceNodeInWater, fetchDynCurrent, nodeInWater, FV, ErrStat, ErrMsg ) type(SeaSt_WaveFieldType), intent(in ) :: WaveField type(GridInterp_MiscVarType), intent(inout) :: WaveField_m real(DbKi), intent(in ) :: Time real(ReKi), intent(in ) :: pos(3) logical, intent(in ) :: forceNodeInWater + logical, intent(in ) :: fetchDynCurrent integer(IntKi), intent( out) :: nodeInWater real(SiKi), intent( out) :: FV(3) - real(SiKi), intent( out) :: FA(3) integer(IntKi), intent( out) :: ErrStat ! Error status of the operation character(*), intent( out) :: ErrMsg ! Error message if errStat /= ErrID_None real(SiKi) :: WaveElev - real(ReKi) :: posXY(2), posPrime(3), posXY0(3) + real(ReKi) :: posXY(2), posPrime(3), posXY0(3), PosOffset(3), posDummy(3,1) + real(ReKi), allocatable :: FV_DC(:,:), FA_DC(:,:) + integer(IntKi) :: startNode character(*), parameter :: RoutineName = 'WaveField_GetNodeWaveVel' integer(IntKi) :: errStat2 character(ErrMsgLen) :: errMsg2 ErrStat = ErrID_None - ErrMsg = "" posXY = pos(1:2) posXY0 = (/pos(1),pos(2),0.0_ReKi/) - ! Wave elevation + ! Wave elevation (Calls WaveField_Interp_Setup3D internally so WaveField_Interp_3D_vec can be used below) WaveElev = WaveField_GetNodeTotalWaveElev( WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2 ); if (Failed()) return; + IF (WaveField%WaveStMod == 0) THEN ! No wave stretching + + IF ( pos(3) <= 0.0_ReKi) THEN ! Node is at or below the SWL + nodeInWater = 1_IntKi + ! Use location to obtain interpolated values of kinematics + CALL WaveField_Interp_Setup4D( Time+WaveField%WaveTimeShift, pos, WaveField%GridDepth, WaveField%VolGridParams, WaveField_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + FV(:) = GridInterp4DVec( WaveField%WaveVel, WaveField_m ) + ELSE ! Node is above the SWL + nodeInWater = 0_IntKi + FV(:) = 0.0 + END IF + + ELSE ! Wave stretching enabled + + IF ( (pos(3) <= WaveElev) .OR. forceNodeInWater ) THEN ! Node is submerged + + nodeInWater = 1_IntKi + + IF ( WaveField%WaveStMod < 3 ) THEN ! Vertical or extrapolated wave stretching + + IF ( pos(3) <= 0.0_SiKi) THEN ! Node is below the SWL - evaluate wave dynamics as usual + + ! Use location to obtain interpolated values of kinematics + CALL WaveField_Interp_Setup4D( Time+WaveField%WaveTimeShift, pos, WaveField%GridDepth, WaveField%VolGridParams, WaveField_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + FV(:) = GridInterp4DVec( WaveField%WaveVel, WaveField_m ) + + ELSE ! Node is above SWL - need wave stretching + + ! Vertical wave stretching + CALL WaveField_Interp_Setup4D( Time, posXY0, WaveField%GridDepth, WaveField%VolGridParams, WaveField_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + FV(:) = GridInterp4DVec( WaveField%WaveVel, WaveField_m ) + + ! Extrapolated wave stretching + IF (WaveField%WaveStMod == 2) THEN + CALL WaveField_Interp_Setup3D( Time+WaveField%WaveTimeShift, posXY, WaveField%SrfGridParams, WaveField_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + FV(:) = FV(:) + GridInterp3DVec( WaveField%PWaveVel0, WaveField_m ) * pos(3) + END IF + + END IF ! Node is submerged + + ELSE ! Wheeler stretching - no need to check whether the node is above or below SWL + + ! Map the node z-position linearly from [-EffWtrDpth,m%WaveElev(j)] to [-EffWtrDpth,0] + posPrime = pos + posPrime(3) = WaveField%EffWtrDpth*(WaveField%EffWtrDpth+pos(3))/(WaveField%EffWtrDpth+WaveElev)-WaveField%EffWtrDpth + posPrime(3) = MIN( posPrime(3), 0.0_ReKi) ! Clamp z-position to zero. Needed when forceNodeInWater=.TRUE. + + ! Obtain the wave-field variables by interpolation with the mapped position. + CALL WaveField_Interp_Setup4D( Time+WaveField%WaveTimeShift, posPrime, WaveField%GridDepth, WaveField%VolGridParams, WaveField_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + FV(:) = GridInterp4DVec( WaveField%WaveVel, WaveField_m ) + + END IF + + ELSE ! Node is out of water - zero-out all wave dynamics + + nodeInWater = 0_IntKi + FV(:) = 0.0 + + END IF ! If node is in or out of water + + END IF ! If wave stretching is on or off + + ! Get dynamic current velocity + IF (fetchDynCurrent .AND. WaveField%hasCurrField) THEN + startNode = -1 + PosOffset = (/0.0_ReKi,0.0_ReKi,WaveField%EffWtrDpth/) + posDummy(:,1) = pos + ALLOCATE(FV_DC(3,1), STAT=ErrStat2); if (FailedMsg('Error allocating FV_DC')) return; + CALL IfW_FlowField_GetVelAcc(WaveField%CurrField, startNode, Time, posDummy, FV_DC, FA_DC, ErrStat2, ErrMsg2, PosOffset=PosOffset); if (Failed()) return; + FV = FV + nodeInWater * FV_DC(:,1) + END IF + +contains + logical function Failed() + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Failed = ErrStat >= AbortErrLev + end function + logical function FailedMsg(ErrMsg2) + character(*), intent(in ) :: ErrMsg2 + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + FailedMsg = ErrStat >= AbortErrLev + end function +END SUBROUTINE WaveField_GetNodeWaveVel + + +SUBROUTINE WaveField_GetNodeWaveVelAcc( WaveField, WaveField_m, Time, pos, forceNodeInWater, fetchDynCurrent, nodeInWater, FV, FA, ErrStat, ErrMsg ) + type(SeaSt_WaveFieldType), intent(in ) :: WaveField + type(GridInterp_MiscVarType), intent(inout) :: WaveField_m + real(DbKi), intent(in ) :: Time + real(ReKi), intent(in ) :: pos(3) + logical, intent(in ) :: forceNodeInWater + logical, intent(in ) :: fetchDynCurrent + real(SiKi), intent( out) :: FV(3) + real(SiKi), intent( out) :: FA(3) + integer(IntKi), intent( out) :: nodeInWater + integer(IntKi), intent( out) :: ErrStat ! Error status of the operation + character(*), intent( out) :: ErrMsg ! Error message if errStat /= ErrID_None + + real(SiKi) :: WaveElev + real(ReKi) :: posXY(2), posPrime(3), posXY0(3), PosOffset(3), posDummy(3,1) + integer(IntKi) :: startNode + real(ReKi), allocatable :: FV_DC(:,:), FA_DC(:,:) + character(*), parameter :: RoutineName = 'WaveField_GetNodeWaveVelAcc' + integer(IntKi) :: errStat2 + character(ErrMsgLen) :: errMsg2 + + ErrStat = ErrID_None + + posXY = pos(1:2) + posXY0 = (/pos(1),pos(2),0.0_ReKi/) + + ! Wave elevation + WaveElev = WaveField_GetNodeTotalWaveElev( WaveField, WaveField_m, Time, pos, ErrStat2, ErrMsg2 ); if (Failed()) return; + IF (WaveField%WaveStMod == 0) THEN ! No wave stretching IF ( pos(3) <= 0.0_ReKi) THEN ! Node is at or below the SWL @@ -472,7 +557,7 @@ SUBROUTINE WaveField_GetNodeWaveVelAcc( WaveField, WaveField_m, Time, pos, force FV(:) = GridInterp4DVec( WaveField%WaveVel, WaveField_m ) FA(:) = GridInterp4DVec( WaveField%WaveAcc, WaveField_m ) - ! Extrapoled wave stretching + ! Extrapolated wave stretching IF (WaveField%WaveStMod == 2) THEN CALL WaveField_Interp_Setup3D( Time+WaveField%WaveTimeShift, posXY, WaveField%SrfGridParams, WaveField_m, ErrStat2, ErrMsg2 ); if (Failed()) return; FV(:) = FV(:) + GridInterp3DVec( WaveField%PWaveVel0, WaveField_m ) * pos(3) @@ -492,7 +577,6 @@ SUBROUTINE WaveField_GetNodeWaveVelAcc( WaveField, WaveField_m, Time, pos, force CALL WaveField_Interp_Setup4D( Time+WaveField%WaveTimeShift, posPrime, WaveField%GridDepth, WaveField%VolGridParams, WaveField_m, ErrStat2, ErrMsg2 ); if (Failed()) return; FV(:) = GridInterp4DVec( WaveField%WaveVel, WaveField_m ) FA(:) = GridInterp4DVec( WaveField%WaveAcc, WaveField_m ) - END IF ELSE ! Node is out of water - zero-out all wave dynamics @@ -500,25 +584,42 @@ SUBROUTINE WaveField_GetNodeWaveVelAcc( WaveField, WaveField_m, Time, pos, force nodeInWater = 0_IntKi FV(:) = 0.0 FA(:) = 0.0 - END IF ! If node is in or out of water END IF ! If wave stretching is on or off + + ! Get dynamic current velocity and acceleration + IF (fetchDynCurrent .AND. WaveField%hasCurrField) THEN + startNode = -1 + PosOffset = (/0.0_ReKi,0.0_ReKi,WaveField%EffWtrDpth/) + posDummy(:,1) = pos + ALLOCATE(FV_DC(3,1), STAT=ErrStat2); if (FailedMsg('Error allocating FV_DC')) return; + ALLOCATE(FA_DC(3,1), STAT=ErrStat2); if (FailedMsg('Error allocating FA_DC')) return; + CALL IfW_FlowField_GetVelAcc(WaveField%CurrField, startNode, Time, posDummy, FV_DC, FA_DC, ErrStat2, ErrMsg2, PosOffset=PosOffset); if (Failed()) return; + FV = FV + nodeInWater * FV_DC(:,1) + FA = FA + nodeInWater * FA_DC(:,1) + END IF contains logical function Failed() call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) Failed = ErrStat >= AbortErrLev end function + logical function FailedMsg(ErrMsg2) + character(*), intent(in ) :: ErrMsg2 + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + FailedMsg = ErrStat >= AbortErrLev + end function END SUBROUTINE WaveField_GetNodeWaveVelAcc -SUBROUTINE WaveField_GetWaveKin( WaveField, WaveField_m, Time, pos, forceNodeInWater, nodeInWater, WaveElev1, WaveElev2, WaveElev, FDynP, FV, FA, FAMCF, ErrStat, ErrMsg ) +SUBROUTINE WaveField_GetWaveKin( WaveField, WaveField_m, Time, pos, forceNodeInWater, fetchDynCurrent, nodeInWater, WaveElev1, WaveElev2, WaveElev, FDynP, FV, FA, FAMCF, ErrStat, ErrMsg ) type(SeaSt_WaveFieldType), intent(in ) :: WaveField type(GridInterp_MiscVarType), intent(inout) :: WaveField_m real(DbKi), intent(in ) :: Time real(ReKi), intent(in ) :: pos(:,:) logical, intent(in ) :: forceNodeInWater + logical, intent(in ) :: fetchDynCurrent real(SiKi), intent( out) :: WaveElev1(:) real(SiKi), intent( out) :: WaveElev2(:) real(SiKi), intent( out) :: WaveElev(:) @@ -534,15 +635,16 @@ SUBROUTINE WaveField_GetWaveKin( WaveField, WaveField_m, Time, pos, forceNodeInW integer(IntKi) :: errStat2 character(ErrMsgLen) :: errMsg2 - integer(IntKi) :: NumPoints, i + integer(IntKi) :: NumPoints, i, startNode real(SiKi) :: FDynP_node, FV_node(3), FA_node(3), FAMCF_node(3) + real(ReKi) :: PosOffset(3) + real(ReKi), allocatable :: FV_DC(:,:), FA_DC(:,:) ErrStat = ErrID_None - ErrMsg = "" NumPoints = size(pos, dim=2) DO i = 1, NumPoints - CALL WaveField_GetNodeWaveKin( WaveField, WaveField_m, Time, pos(:,i), forceNodeInWater, nodeInWater(i), WaveElev1(i), WaveElev2(i), WaveElev(i), FDynP_node, FV_node, FA_node, FAMCF_node, ErrStat2, ErrMsg2 ) + CALL WaveField_GetNodeWaveKin( WaveField, WaveField_m, Time, pos(:,i), forceNodeInWater, .FALSE., nodeInWater(i), WaveElev1(i), WaveElev2(i), WaveElev(i), FDynP_node, FV_node, FA_node, FAMCF_node, ErrStat2, ErrMsg2 ) if (Failed()) return; FDynP(i) = REAL(FDynP_node,ReKi) FV(:, i) = REAL(FV_node, ReKi) @@ -552,14 +654,171 @@ SUBROUTINE WaveField_GetWaveKin( WaveField, WaveField_m, Time, pos, forceNodeInW END IF END DO + ! If dynamic current field from IfW is present, get velocity and acceleration contributions + IF (fetchDynCurrent .AND. WaveField%hasCurrField) THEN + startNode = -1 + PosOffset = (/0.0_ReKi,0.0_ReKi,WaveField%EffWtrDpth/) + ALLOCATE(FV_DC( 3, NumPoints ), STAT=ErrStat2); if (FailedMsg('Error allocating FV_DC')) return; + ALLOCATE(FA_DC( 3, NumPoints ), STAT=ErrStat2); if (FailedMsg('Error allocating FA_DC')) return; + CALL IfW_FlowField_GetVelAcc(WaveField%CurrField, startNode, Time, pos, FV_DC, FA_DC, ErrStat2, ErrMsg2, PosOffset=PosOffset); if (Failed()) return; + + ! Add contributions from IfW current field if node is in water + DO i = 1, NumPoints + FV(:,i) = FV(:,i) + nodeInWater(i) * FV_DC(:,i) + FA(:,i) = FA(:,i) + nodeInWater(i) * FA_DC(:,i) + END DO + + END IF + contains logical function Failed() call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) Failed = ErrStat >= AbortErrLev end function + logical function FailedMsg(ErrMsgTmp) + character(*), intent(in ) :: ErrMsgTmp + call SetErrStat( ErrStat2, ErrMsgTmp, ErrStat, ErrMsg, RoutineName ) + FailedMsg = ErrStat >= AbortErrLev + end function end subroutine WaveField_GetWaveKin +! This subroutine is intended for AeroDyn when modeling MHK turbines +SUBROUTINE WaveField_GetWaveVelAcc_AD( WaveField, WaveField_m, StartNode, Time, pos, FV, FA, ErrStat, ErrMsg ) + type(SeaSt_WaveFieldType), intent(in ) :: WaveField + type(GridInterp_MiscVarType), intent(inout) :: WaveField_m + integer(IntKi), intent(in ) :: StartNode + real(DbKi), intent(in ) :: Time + real(ReKi), intent(in ) :: pos(:,:) ! z=0 at MSL + real(ReKi), intent( out) :: FV(:,:) + real(ReKi), allocatable, intent(inout) :: FA(:,:) + integer(IntKi), intent( out) :: ErrStat ! Error status of the operation + character(*), intent( out) :: ErrMsg ! Error message if errStat /= ErrID_None + integer(IntKi), allocatable :: nodeInWater(:) + integer(IntKi) :: NumPoints, i + real(SiKi) :: FV_node(3), FA_node(3) + real(ReKi) :: PosOffset(3), MSL2SWL, WtrDpth + real(ReKi), allocatable :: FV_DC(:,:), FA_DC(:,:) + logical :: getAcc + character(*), parameter :: RoutineName = 'WaveField_GetWaveVelAcc_AD' + integer(IntKi) :: errStat2 + character(ErrMsgLen) :: errMsg2 + + ErrStat = ErrID_None + + MSL2SWL = WaveField%MSL2SWL + WtrDpth = WaveField%EffWtrDpth - MSL2SWL + getAcc = ALLOCATED(FA) + NumPoints = size(pos, dim=2) + + ALLOCATE( nodeInWater(NumPoints), STAT=ErrStat2); if (FailedMsg('Error allocating nodeInWater')) return; + + ! Note: SeaState wavefield grid has z=0 on the SWL + IF (getAcc) THEN + DO i = 1, NumPoints + CALL WaveField_GetNodeWaveVelAcc( WaveField, WaveField_m, Time, pos(:,i)-[0.0_ReKi,0.0_ReKi,real(MSL2SWL, ReKi)], .FALSE., .FALSE., nodeInWater(i), FV_node, FA_node, ErrStat2, ErrMsg2 ); if (Failed()) return; + FV(:, i) = REAL(FV_node, ReKi) + FA(:, i) = REAL(FA_node, ReKi) + END DO + ELSE + DO i = 1, NumPoints + CALL WaveField_GetNodeWaveVel( WaveField, WaveField_m, Time, pos(:,i)-[0.0_ReKi,0.0_ReKi,real(MSL2SWL, ReKi)], .FALSE., .FALSE., nodeInWater(i), FV_node, ErrStat2, ErrMsg2 ); if (Failed()) return; + FV(:, i) = REAL(FV_node, ReKi) + END DO + END IF + + ! If dynamic current field from IfW is present, get velocity and acceleration contributions + IF (WaveField%hasCurrField) THEN + PosOffset = (/0.0_ReKi,0.0_ReKi,WtrDpth/) ! IfW FlowField grid effectively has z=0 on the seabed + ALLOCATE(FV_DC( 3, NumPoints ), STAT=ErrStat2); if (FailedMsg('Error allocating FV_DC')) return; + IF (getAcc) THEN + ALLOCATE(FA_DC( 3, NumPoints ), STAT=ErrStat2); if (FailedMsg('Error allocating FA_DC')) return; + END IF + CALL IfW_FlowField_GetVelAcc(WaveField%CurrField, StartNode, Time, pos, FV_DC, FA_DC, ErrStat2, ErrMsg2, PosOffset=PosOffset); if (Failed()) return; + + ! Add contributions from IfW current field if node is in water + DO i = 1, NumPoints + FV(:,i) = FV(:,i) + nodeInWater(i) * FV_DC(:,i) + END DO + IF (getAcc) THEN + DO i = 1, NumPoints + FA(:,i) = FA(:,i) + nodeInWater(i) * FA_DC(:,i) + END DO + END IF + END IF + +contains + logical function Failed() + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Failed = ErrStat >= AbortErrLev + end function + logical function FailedMsg(ErrMsg2) + character(*), intent(in ) :: ErrMsg2 + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + FailedMsg = ErrStat >= AbortErrLev + end function +END SUBROUTINE WaveField_GetWaveVelAcc_AD + +!-------------------- Subroutine for wave field velocity only --------------------! +SUBROUTINE WaveField_GetMeanDynSurfCurr( WaveField, WaveTMax, WaveDT, CurrVxi0, CurrVyi0, ErrStat, ErrMsg ) + type(SeaSt_WaveFieldType), intent(in ) :: WaveField + + real(DbKi), intent(in ) :: WaveTMax + real(DbKi), intent(in ) :: WaveDT + + real(SiKi), intent( out) :: CurrVxi0 + real(SiKi), intent( out) :: CurrVyi0 + integer(IntKi), intent( out) :: ErrStat ! Error status of the operation + character(*), intent( out) :: ErrMsg ! Error message if errStat /= ErrID_None + + real(ReKi) :: pos(3,1), PosOffset(3) + real(ReKi), allocatable :: FV_DC(:,:), FA_DC(:,:) + integer(IntKi) :: startNode + integer(IntKi) :: step + real(DbKi) :: time + character(*), parameter :: RoutineName = 'WaveField_GetMeanDynSurfCurr' + integer(IntKi) :: errStat2 + character(ErrMsgLen) :: errMsg2 + + ErrStat = ErrID_None + + CurrVxi0 = 0.0_SiKi + CurrVyi0 = 0.0_SiKi + + ! Get dynamic current velocity + IF ( WaveField%hasCurrField ) THEN + + pos = 0.0_ReKi + step = 0_IntKi + time = 0.0_DbKi + startNode = -1 + PosOffset = (/0.0_ReKi,0.0_ReKi,WaveField%EffWtrDpth/) + ALLOCATE(FV_DC(3,1), STAT=ErrStat2); if (FailedMsg('Error allocating FV_DC')) return; + + DO WHILE ( time <= WaveTMax) + CALL IfW_FlowField_GetVelAcc(WaveField%CurrField, startNode, Time, pos, FV_DC, FA_DC, ErrStat2, ErrMsg2, PosOffset=PosOffset); if (Failed()) return; + CurrVxi0 = CurrVxi0 + FV_DC(1,1) + CurrVyi0 = CurrVyi0 + FV_DC(2,1) + step = step + 1 + time = time + WaveDT + END DO + CurrVxi0 = CurrVxi0 / REAL(step,SiKi) + CurrVyi0 = CurrVyi0 / REAL(step,SiKi) + + END IF + +contains + logical function Failed() + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Failed = ErrStat >= AbortErrLev + end function + logical function FailedMsg(ErrMsg2) + character(*), intent(in ) :: ErrMsg2 + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + FailedMsg = ErrStat >= AbortErrLev + end function +END SUBROUTINE WaveField_GetMeanDynSurfCurr + !---------------------------------------------------------------------------------------------------- ! Interpolation related functions !---------------------------------------------------------------------------------------------------- @@ -580,7 +839,6 @@ subroutine WaveField_Interp_Setup3D( Time, Position, p, m, ErrStat, ErrMsg ) character(ErrMsgLen) :: ErrMsg2 ErrStat = ErrID_None - ErrMsg = "" CALL GridInterpSetup3D((/Real(Time,ReKi),Position(1),Position(2)/), p, m, ErrStat2, ErrMsg2 ) if (Failed()) return; diff --git a/modules/seastate/src/SeaSt_WaveField.txt b/modules/seastate/src/SeaSt_WaveField.txt index d7ab572f09..c1327b8f6e 100644 --- a/modules/seastate/src/SeaSt_WaveField.txt +++ b/modules/seastate/src/SeaSt_WaveField.txt @@ -4,6 +4,8 @@ usefrom GridInterp.txt #--------------------------------------------------------------------------------------------------------------------------------------------------------- # Data structures for representing wave fields. # +usefrom IfW_FlowField.txt + param SeaSt_WaveField - INTEGER WaveDirMod_None - 0 - "WaveDirMod = 0 [Directional spreading function is NONE]" - param SeaSt_WaveField - INTEGER WaveDirMod_COS2S - 1 - "WaveDirMod = 1 [Directional spreading function is COS2S]" - @@ -21,6 +23,11 @@ param SeaSt_WaveField - INTEGER ConstWaveMod param SeaSt_WaveField - INTEGER ConstWaveMod_CrestElev - 1 - "ConstWaveMod = 1 [Constrained wave model: Constrained wave with specified crest elevation, alpha]" - param SeaSt_WaveField - INTEGER ConstWaveMod_Peak2Trough - 2 - "ConstWaveMod = 2 [Constrained wave model: Constrained wave with guaranteed peak-to-trough crest height, HCrest]" - +param SeaSt_WaveField - INTEGER WvCrntMod_Superpose - 0 - "WvCrntMod = 0 [Simpler superposition]" - +param SeaSt_WaveField - INTEGER WvCrntMod_Doppler - 1 - "WvCrntMod = 1 [Doppler effect]" - +param SeaSt_WaveField - INTEGER WvCrntMod_Full - 2 - "WvCrntMod = 2 [Doppler effect and amplitude/spectrum scaling]" - + + #--------------------------------------------------------------------------------------------------------------------------------------------------------- # #--------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -51,6 +58,8 @@ typedef ^ ^ ReKi MSL2SWL typedef ^ ^ SiKi WaveElevC {:}{:}{:} - - "Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part" (m) typedef ^ ^ SiKi WaveElevC0 {:}{:} - - "Fourier components of the incident wave elevation at the platform reference point. First column is the real part; second column is the imaginary part" (m) typedef ^ ^ SiKi WaveDirArr {:} - - "Wave direction array. Each frequency has a unique direction of WaveNDir > 1" (degrees) +typedef ^ ^ LOGICAL hasCurrField - - - "True if CurrField is populated for MHK simulations" (-) +typedef ^ ^ FlowFieldType *CurrField - - - "Pointer to FlowField type from InflowWind containing the dynamic current information" (-) typedef ^ ^ ReKi WtrDpth - - - "Water depth, this is necessary to inform glue-code what the module is using for WtrDpth (may not be the glue-code's default)" (m) typedef ^ ^ ReKi WtrDens - - - "Water density, this is necessary to inform glue-code what the module is using for WtrDens (may not be the glue-code's default)" (kg/m^3) @@ -68,6 +77,7 @@ typedef ^ ^ SiKi WvLowCOffS typedef ^ ^ SiKi WvHiCOffS - - - "Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0]" (rad/s) typedef ^ ^ SiKi WaveDOmega - - - "Frequency step for incident wave calculations" (rad/s) typedef ^ ^ INTEGER WaveMod - - - "Incident wave kinematics model: See valid values in SeaSt_WaveField module parameters." - +typedef ^ ^ INTEGER WvCrntMod - - - "Wave-current modeling option." - typedef ^ ^ INTEGER NStepWave - - - "Total number of frequency components = total number of time steps in the incident wave" - typedef ^ ^ INTEGER NStepWave2 - - - "NStepWave / 2" - diff --git a/modules/seastate/src/SeaSt_WaveField_Types.f90 b/modules/seastate/src/SeaSt_WaveField_Types.f90 index a7493d67e6..cba2c94b4c 100644 --- a/modules/seastate/src/SeaSt_WaveField_Types.f90 +++ b/modules/seastate/src/SeaSt_WaveField_Types.f90 @@ -33,22 +33,26 @@ MODULE SeaSt_WaveField_Types !--------------------------------------------------------------------------------------------------------------------------------- USE Current_Types USE GridInterp_Types +USE IfW_FlowField_Types USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveDirMod_None = 0 ! WaveDirMod = 0 [Directional spreading function is NONE] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveDirMod_COS2S = 1 ! WaveDirMod = 1 [Directional spreading function is COS2S] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_None = 0 ! WaveMod = 0 [Incident wave kinematics model: NONE (still water)] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_Regular = 1 ! WaveMod = 1 [Incident wave kinematics model: Regular (periodic)] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_RegularUsrPh = 10 ! WaveMod = 1P# [Incident wave kinematics model: Regular (user specified phase)] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_JONSWAP = 2 ! WaveMod = 2 [Incident wave kinematics model: JONSWAP/Pierson-Moskowitz spectrum (irregular)] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_WhiteNoise = 3 ! WaveMod = 3 [Incident wave kinematics model: White noise spectrum (irregular)] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_UserSpctrm = 4 ! WaveMod = 4 [Incident wave kinematics model: user-defined spectrum from routine UserWaveSpctrm (irregular)] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_ExtElev = 5 ! WaveMod = 5 [Incident wave kinematics model: Externally generated wave-elevation time series] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_ExtFull = 6 ! WaveMod = 6 [Incident wave kinematics model: Externally generated full wave-kinematics time series (invalid for PotMod/=0)] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_UserFreq = 7 ! WaveMod = 7 [Incident wave kinematics model: user-defined wave frequency components] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: ConstWaveMod_None = 0 ! ConstWaveMod = 0 [Constrained wave model: No constrained waves] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: ConstWaveMod_CrestElev = 1 ! ConstWaveMod = 1 [Constrained wave model: Constrained wave with specified crest elevation, alpha] [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: ConstWaveMod_Peak2Trough = 2 ! ConstWaveMod = 2 [Constrained wave model: Constrained wave with guaranteed peak-to-trough crest height, HCrest] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveDirMod_None = 0 ! WaveDirMod = 0 [Directional spreading function is NONE] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveDirMod_COS2S = 1 ! WaveDirMod = 1 [Directional spreading function is COS2S] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_None = 0 ! WaveMod = 0 [Incident wave kinematics model: NONE (still water)] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_Regular = 1 ! WaveMod = 1 [Incident wave kinematics model: Regular (periodic)] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_RegularUsrPh = 10 ! WaveMod = 1P# [Incident wave kinematics model: Regular (user specified phase)] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_JONSWAP = 2 ! WaveMod = 2 [Incident wave kinematics model: JONSWAP/Pierson-Moskowitz spectrum (irregular)] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_WhiteNoise = 3 ! WaveMod = 3 [Incident wave kinematics model: White noise spectrum (irregular)] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_UserSpctrm = 4 ! WaveMod = 4 [Incident wave kinematics model: user-defined spectrum from routine UserWaveSpctrm (irregular)] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_ExtElev = 5 ! WaveMod = 5 [Incident wave kinematics model: Externally generated wave-elevation time series] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_ExtFull = 6 ! WaveMod = 6 [Incident wave kinematics model: Externally generated full wave-kinematics time series (invalid for PotMod/=0)] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WaveMod_UserFreq = 7 ! WaveMod = 7 [Incident wave kinematics model: user-defined wave frequency components] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ConstWaveMod_None = 0 ! ConstWaveMod = 0 [Constrained wave model: No constrained waves] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ConstWaveMod_CrestElev = 1 ! ConstWaveMod = 1 [Constrained wave model: Constrained wave with specified crest elevation, alpha] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: ConstWaveMod_Peak2Trough = 2 ! ConstWaveMod = 2 [Constrained wave model: Constrained wave with guaranteed peak-to-trough crest height, HCrest] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WvCrntMod_Superpose = 0 ! WvCrntMod = 0 [Simpler superposition] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WvCrntMod_Doppler = 1 ! WvCrntMod = 1 [Doppler effect] [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WvCrntMod_Full = 2 ! WvCrntMod = 2 [Doppler effect and amplitude/spectrum scaling] [-] ! ========= SeaSt_WaveField_MiscVarType ======= TYPE, PUBLIC :: SeaSt_WaveField_MiscVarType REAL(SiKi) , DIMENSION(1:8) :: N3D = 0.0_R4Ki !< this is the weighting function for 3-d velocity field [-] @@ -80,6 +84,8 @@ MODULE SeaSt_WaveField_Types REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveElevC !< Discrete Fourier transform of the instantaneous elevation of incident waves at all grid points. First column is real part, second column is imaginary part [(m)] REAL(SiKi) , DIMENSION(:,:), ALLOCATABLE :: WaveElevC0 !< Fourier components of the incident wave elevation at the platform reference point. First column is the real part; second column is the imaginary part [(m)] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveDirArr !< Wave direction array. Each frequency has a unique direction of WaveNDir > 1 [(degrees)] + LOGICAL :: hasCurrField = .false. !< True if CurrField is populated for MHK simulations [(-)] + TYPE(FlowFieldType) , POINTER :: CurrField => NULL() !< Pointer to FlowField type from InflowWind containing the dynamic current information [(-)] REAL(ReKi) :: WtrDpth = 0.0_ReKi !< Water depth, this is necessary to inform glue-code what the module is using for WtrDpth (may not be the glue-code's default) [(m)] REAL(ReKi) :: WtrDens = 0.0_ReKi !< Water density, this is necessary to inform glue-code what the module is using for WtrDens (may not be the glue-code's default) [(kg/m^3)] REAL(SiKi) :: RhoXg = 0.0_R4Ki !< = WtrDens*Gravity [-] @@ -96,6 +102,7 @@ MODULE SeaSt_WaveField_Types REAL(SiKi) :: WvHiCOffS = 0.0_R4Ki !< Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0] [(rad/s)] REAL(SiKi) :: WaveDOmega = 0.0_R4Ki !< Frequency step for incident wave calculations [(rad/s)] INTEGER(IntKi) :: WaveMod = 0_IntKi !< Incident wave kinematics model: See valid values in SeaSt_WaveField module parameters. [-] + INTEGER(IntKi) :: WvCrntMod = 0_IntKi !< Wave-current modeling option. [-] INTEGER(IntKi) :: NStepWave = 0_IntKi !< Total number of frequency components = total number of time steps in the incident wave [-] INTEGER(IntKi) :: NStepWave2 = 0_IntKi !< NStepWave / 2 [-] REAL(SiKi) :: GridDepth = 0.0_R4Ki !< Depth (>0) of wave grid below SWL [m] @@ -103,7 +110,8 @@ MODULE SeaSt_WaveField_Types TYPE(Current_InitInputType) :: Current_InitInput !< InitInputs in the Current Module. For coupling with MD. [-] END TYPE SeaSt_WaveFieldType ! ======================= -CONTAINS + +contains subroutine SeaSt_WaveField_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) type(SeaSt_WaveField_MiscVarType), intent(in) :: SrcMiscData @@ -356,6 +364,8 @@ subroutine SeaSt_WaveField_CopySeaSt_WaveFieldType(SrcSeaSt_WaveFieldTypeData, D end if DstSeaSt_WaveFieldTypeData%WaveDirArr = SrcSeaSt_WaveFieldTypeData%WaveDirArr end if + DstSeaSt_WaveFieldTypeData%hasCurrField = SrcSeaSt_WaveFieldTypeData%hasCurrField + DstSeaSt_WaveFieldTypeData%CurrField => SrcSeaSt_WaveFieldTypeData%CurrField DstSeaSt_WaveFieldTypeData%WtrDpth = SrcSeaSt_WaveFieldTypeData%WtrDpth DstSeaSt_WaveFieldTypeData%WtrDens = SrcSeaSt_WaveFieldTypeData%WtrDens DstSeaSt_WaveFieldTypeData%RhoXg = SrcSeaSt_WaveFieldTypeData%RhoXg @@ -372,6 +382,7 @@ subroutine SeaSt_WaveField_CopySeaSt_WaveFieldType(SrcSeaSt_WaveFieldTypeData, D DstSeaSt_WaveFieldTypeData%WvHiCOffS = SrcSeaSt_WaveFieldTypeData%WvHiCOffS DstSeaSt_WaveFieldTypeData%WaveDOmega = SrcSeaSt_WaveFieldTypeData%WaveDOmega DstSeaSt_WaveFieldTypeData%WaveMod = SrcSeaSt_WaveFieldTypeData%WaveMod + DstSeaSt_WaveFieldTypeData%WvCrntMod = SrcSeaSt_WaveFieldTypeData%WvCrntMod DstSeaSt_WaveFieldTypeData%NStepWave = SrcSeaSt_WaveFieldTypeData%NStepWave DstSeaSt_WaveFieldTypeData%NStepWave2 = SrcSeaSt_WaveFieldTypeData%NStepWave2 DstSeaSt_WaveFieldTypeData%GridDepth = SrcSeaSt_WaveFieldTypeData%GridDepth @@ -439,6 +450,7 @@ subroutine SeaSt_WaveField_DestroySeaSt_WaveFieldType(SeaSt_WaveFieldTypeData, E if (allocated(SeaSt_WaveFieldTypeData%WaveDirArr)) then deallocate(SeaSt_WaveFieldTypeData%WaveDirArr) end if + nullify(SeaSt_WaveFieldTypeData%CurrField) call Current_DestroyInitInput(SeaSt_WaveFieldTypeData%Current_InitInput, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine @@ -447,6 +459,7 @@ subroutine SeaSt_WaveField_PackSeaSt_WaveFieldType(RF, Indata) type(RegFile), intent(inout) :: RF type(SeaSt_WaveFieldType), intent(in) :: InData character(*), parameter :: RoutineName = 'SeaSt_WaveField_PackSeaSt_WaveFieldType' + logical :: PtrInIndex if (RF%ErrStat >= AbortErrLev) return call RegPackAlloc(RF, InData%WaveTime) call RegPackAlloc(RF, InData%WaveDynP) @@ -468,6 +481,14 @@ subroutine SeaSt_WaveField_PackSeaSt_WaveFieldType(RF, Indata) call RegPackAlloc(RF, InData%WaveElevC) call RegPackAlloc(RF, InData%WaveElevC0) call RegPackAlloc(RF, InData%WaveDirArr) + call RegPack(RF, InData%hasCurrField) + call RegPack(RF, associated(InData%CurrField)) + if (associated(InData%CurrField)) then + call RegPackPointer(RF, c_loc(InData%CurrField), PtrInIndex) + if (.not. PtrInIndex) then + call IfW_FlowField_PackFlowFieldType(RF, InData%CurrField) + end if + end if call RegPack(RF, InData%WtrDpth) call RegPack(RF, InData%WtrDens) call RegPack(RF, InData%RhoXg) @@ -484,6 +505,7 @@ subroutine SeaSt_WaveField_PackSeaSt_WaveFieldType(RF, Indata) call RegPack(RF, InData%WvHiCOffS) call RegPack(RF, InData%WaveDOmega) call RegPack(RF, InData%WaveMod) + call RegPack(RF, InData%WvCrntMod) call RegPack(RF, InData%NStepWave) call RegPack(RF, InData%NStepWave2) call RegPack(RF, InData%GridDepth) @@ -499,6 +521,8 @@ subroutine SeaSt_WaveField_UnPackSeaSt_WaveFieldType(RF, OutData) integer(B4Ki) :: LB(5), UB(5) integer(IntKi) :: stat logical :: IsAllocAssoc + integer(B8Ki) :: PtrIdx + type(c_ptr) :: Ptr if (RF%ErrStat /= ErrID_None) return call RegUnpackAlloc(RF, OutData%WaveTime); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WaveDynP); if (RegCheckErr(RF, RoutineName)) return @@ -520,6 +544,25 @@ subroutine SeaSt_WaveField_UnPackSeaSt_WaveFieldType(RF, OutData) call RegUnpackAlloc(RF, OutData%WaveElevC); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WaveElevC0); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WaveDirArr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%hasCurrField); if (RegCheckErr(RF, RoutineName)) return + if (associated(OutData%CurrField)) deallocate(OutData%CurrField) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackPointer(RF, Ptr, PtrIdx); if (RegCheckErr(RF, RoutineName)) return + if (c_associated(Ptr)) then + call c_f_pointer(Ptr, OutData%CurrField) + else + allocate(OutData%CurrField,stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%CurrField.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + RF%Pointers(PtrIdx) = c_loc(OutData%CurrField) + call IfW_FlowField_UnpackFlowFieldType(RF, OutData%CurrField) ! CurrField + end if + else + OutData%CurrField => null() + end if call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WtrDens); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RhoXg); if (RegCheckErr(RF, RoutineName)) return @@ -536,11 +579,14 @@ subroutine SeaSt_WaveField_UnPackSeaSt_WaveFieldType(RF, OutData) call RegUnpack(RF, OutData%WvHiCOffS); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveDOmega); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WvCrntMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NStepWave); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NStepWave2); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GridDepth); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveTimeShift); if (RegCheckErr(RF, RoutineName)) return call Current_UnpackInitInput(RF, OutData%Current_InitInput) ! Current_InitInput end subroutine + END MODULE SeaSt_WaveField_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/SeaState.f90 b/modules/seastate/src/SeaState.f90 index 6bce2063b9..f57de4396e 100644 --- a/modules/seastate/src/SeaState.f90 +++ b/modules/seastate/src/SeaState.f90 @@ -54,7 +54,9 @@ MODULE SeaState PUBLIC :: SeaSt_JacobianPContState ! Jacobians dY/dx, dX/dx, dXd/dx, and dZ/dx PUBLIC :: SeaSt_JacobianPDiscState ! Jacobians dY/dxd, dX/dxd, dXd/dxd, and dZ/dxd PUBLIC :: SeaSt_JacobianPConstrState ! Jacobians dY/dz, dX/dz, dXd/dz, and dZ/dz - PUBLIC :: SeaSt_GetOP ! operating points u_op, y_op, x_op, dx_op, xd_op, and z_op + + PUBLIC :: SeaSt_PackExtInputAry ! Pack extended inputs + PUBLIC :: SeaSt_PackExtOutputAry ! Pack extended outputs CONTAINS !---------------------------------------------------------------------------------------------------------------------------------- @@ -153,12 +155,24 @@ SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init ! Initialize Current module CALL Current_Init(InputFileData%Current, Current_InitOut, ErrStat2, ErrMsg2 ); if(Failed()) return; - - p%WaveField%Current_InitInput = InputFileData%Current ! Save the current input data for later use by MD + p%WaveField%Current_InitInput = InputFileData%Current ! Save the current input data for later use by MD (What if InflowWind current is used?) + + ! Dynamic current from IfW + p%WaveField%hasCurrField = InitInp%hasCurrField + IF ( p%WaveField%hasCurrField ) THEN + ! Load dynamic current from IfW + p%WaveField%CurrField => InitInp%CurrField + IF ( InputFileData%WvCrntMod /= WvCrntMod_Superpose ) THEN + CALL WaveField_GetMeanDynSurfCurr( p%WaveField, InputFileData%Waves%WaveTMax, InputFileData%Waves%WaveDT, Current_InitOut%CurrVxi0, Current_InitOut%CurrVyi0, ErrStat2, ErrMsg2 ); if(Failed()) return; + END IF + END IF ! Move initialization output data from Current module into the initialization input data for the Waves module IF (ALLOCATED(Current_InitOut%CurrVxi)) CALL Move_Alloc( Current_InitOut%CurrVxi, InputFileData%Waves%CurrVxi ) IF (ALLOCATED(Current_InitOut%CurrVyi)) CALL Move_Alloc( Current_InitOut%CurrVyi, InputFileData%Waves%CurrVyi ) + + InputFileData%Waves%CurrVxi0 = Current_InitOut%CurrVxi0 + InputFileData%Waves%CurrVyi0 = Current_InitOut%CurrVyi0 InputFileData%Waves%PCurrVxiPz0 = Current_InitOut%PCurrVxiPz0 InputFileData%Waves%PCurrVyiPz0 = Current_InitOut%PCurrVyiPz0 @@ -355,13 +369,13 @@ SUBROUTINE SeaSt_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, Init call SetErrStat( ErrID_Fatal, 'Constrained wave conditions cannot be used for linearization. Set ConstWaveMod=0.', ErrStat, ErrMsg, RoutineName ) end if - ! set the Jacobian info if we don't have a fatal error - if (ErrStat < AbortErrLev) then - call SeaSt_Init_Jacobian(p, InitOut, ErrStat2, ErrMsg2) - if (Failed()) return - endif end if + ! Initialize module variables if we don't have a fatal error + if (ErrStat < AbortErrLev) then + call SeaSt_InitVars(InitOut%Vars, u, p, x, y, m, InitOut, InputFileData, InitInp%Linearize, ErrStat2, ErrMsg2) + if (Failed()) return + endif ! Destroy the local initialization data CALL CleanUp() @@ -468,6 +482,81 @@ subroutine SurfaceVisGenerate(ErrStat3, ErrMsg3) end subroutine SurfaceVisGenerate END SUBROUTINE SeaSt_Init + +subroutine SeaSt_InitVars(Vars, u, p, x, y, m, InitOut, InputFileData, Linearize, ErrStat, ErrMsg) + type(ModVarsType), intent(out) :: Vars !< Module variables + type(SeaSt_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(SeaSt_ParameterType), intent(inout) :: p !< Parameters + type(SeaSt_ContinuousStateType), intent(inout) :: x !< Continuous state + type(SeaSt_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(SeaSt_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SeaSt_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + type(SeaSt_InputFile), intent(in) :: InputFileData !< Input file data + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SeaSt_InitVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + + integer(IntKi) :: i, j, k + integer(IntKi), allocatable :: BladeMeshFields(:) + real(R8Ki) :: MaxThrust, MaxTorque, ScaleLength + integer(IntKi) :: Flags, Field + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + ! Extended input + call MV_AddVar(Vars%u, "WaveElev0", FieldScalar, DatLoc(SeaSt_u_WaveElev0), & + Flags=VF_ExtLin, & + Perturb=0.02_R8Ki * Pi / 180.0_R8Ki * max(1.0_R8Ki, real(p%WaveField%WtrDpth, R8Ki)), & + LinNames=['Extended input: wave elevation at platform ref point, m']) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + ! Extended output + call MV_AddVar(Vars%y, "WaveElev0", FieldScalar, DatLoc(SeaSt_y_WaveElev0), & + Flags=VF_ExtLin, & + LinNames=['Extended output: wave elevation at platform ref point, m']) + + ! Output variables + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, DatLoc(SeaSt_y_WriteOutput), & + Num=p%NumOuts, & + Flags=VF_WriteOut, & + LinNames=[(WriteOutputLinName(i), i = 1, p%numOuts)]) + + !---------------------------------------------------------------------------- + ! Initialize Variables and Jacobian data + !---------------------------------------------------------------------------- + + call MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call SeaSt_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SeaSt_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + +contains + function WriteOutputLinName(idx) result(name) + integer(IntKi), intent(in) :: idx + character(LinChanLen) :: name + name = trim(InitOut%WriteOutputHdr(idx))//', '//trim(InitOut%WriteOutputUnt(idx)) + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine !---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE AddArrays_4D(Array1, Array2, ArrayName, ErrStat, ErrMsg) REAL(SiKi), INTENT(INOUT) :: Array1(:,:,:,:) @@ -643,7 +732,7 @@ SUBROUTINE SeaSt_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er REAL(SiKi) :: WaveAcc(3,p%NWaveKin) REAL(SiKi) :: WaveAccMCF(3,p%NWaveKin) REAL(SiKi) :: WaveDynP(p%NWaveKin) - REAL(ReKi) :: AllOuts(MaxOutPts) + REAL(ReKi) :: AllOuts(0:MaxOutPts) real(ReKi) :: positionXYZ(3), positionXY(2) REAL(SiKi) :: zeta @@ -682,19 +771,17 @@ SUBROUTINE SeaSt_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, Er DO i = 1, p%NWaveKin positionXYZ = (/p%WaveKinxi(i),p%WaveKinyi(i),p%WaveKinzi(i)/) - CALL WaveField_GetNodeWaveKin( p%WaveField, m%WaveField_m, Time, positionXYZ, .FALSE., nodeInWater, zeta1, zeta2, zeta, WaveDynP(i), WaveVel(:,i), WaveAcc(:,i), WaveAccMCF(:,i), ErrStat2, ErrMsg2 ) + CALL WaveField_GetNodeWaveKin( p%WaveField, m%WaveField_m, Time, positionXYZ, .FALSE., .TRUE., nodeInWater, zeta1, zeta2, zeta, WaveDynP(i), WaveVel(:,i), WaveAcc(:,i), WaveAccMCF(:,i), ErrStat2, ErrMsg2 ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) END DO ! Compute the wave elevations at the requested output locations for this time. Note that p%WaveElev has the second order added to it already. DO i = 1, p%NWaveElev positionXY = (/p%WaveElevxi(i),p%WaveElevyi(i)/) - WaveElev1(i) = WaveField_GetNodeWaveElev1( p%WaveField, m%WaveField_m, Time, positionXY, ErrStat2, ErrMsg2 ) + zeta = WaveField_GetNodeTotalWaveElev(p%WaveField, m%WaveField_m, Time, positionXY, ErrStat2, ErrMsg2, Elev1=WaveElev1(i), Elev2=WaveElev2(i)) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - WaveElev2(i) = WaveField_GetNodeWaveElev2( p%WaveField, m%WaveField_m, Time, positionXY, ErrStat2, ErrMsg2 ) - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - WaveElev(i) = WaveElev1(i) + WaveElev2(i) END DO + WaveElev = WaveElev1 + WaveElev2 ! Map calculated results into the AllOuts Array CALL SeaStOut_MapOutputs( p, WaveElev, WaveElev1, WaveElev2, WaveVel, WaveAcc, WaveAccMCF, WaveDynP, AllOuts, ErrStat2, ErrMsg2 ) @@ -756,102 +843,11 @@ END SUBROUTINE SeaSt_CalcConstrStateResidual -!---------------------------------------------------------------------------------------------------------------------------------- -! Linearization routines -!---------------------------------------------------------------------------------------------------------------------------------- -!> Initialize Jacobian info for linearization (only u and y) -subroutine SeaSt_Init_Jacobian(p, InitOut, ErrStat, ErrMsg) - type(SeaSt_ParameterType), intent(inout) :: p !< Parameters - type(SeaSt_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - integer(IntKi) :: nu, ny ! counters for number of u and y linearization terms - integer(IntKi) :: i, idx ! generic indexing - integer(IntKi) :: ExtStart ! start of Extended input/output - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SeaSt_Init_Jacobian' - - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = '' - - !-------------------------- - ! Init Jacobians for u - !-------------------------- - - ! One extended input (WaveElev0), and no regular inputs. Starts at first index. - nu = 1 - p%LinParams%NumExtendedInputs = 1 - ! Total number of inputs (including regular and extended inputs) - p%LinParams%Jac_nu = nu - - ! Allocate storage for names, indexing, and perturbations - call AllocAry(InitOut%LinNames_u, nu, "LinNames_u", ErrStat2, ErrMsg2); if (Failed()) return - call AllocAry(InitOut%RotFrame_u, nu, "RotFrame_u", ErrStat2, ErrMsg2); if (Failed()) return - call AllocAry(InitOut%IsLoad_u, nu, "IsLoad_u", ErrStat2, ErrMsg2); if (Failed()) return - call AllocAry(p%LinParams%du, nu, "LinParams%du", ErrStat2, ErrMsg2); if (Failed()) return - - ! Step through list of inputs and save names. No regular inputs, so we skip directly to the Extended input - ! WaveElev0 - extended input - ExtStart = 1 - InitOut%LinNames_u(ExtStart) = 'Extended input: wave elevation at platform ref point, m' - InitOut%RotFrame_u(ExtStart) = .false. - InitOut%IsLoad_u( ExtStart) = .false. - - p%LinParams%Jac_u_idxStartList%Extended = ExtStart - p%LinParams%du(ExtStart) = 0.02_ReKi * Pi / 180.0_ReKi * max(1.0_ReKi, p%WaveField%WtrDpth) ! TODO: check that this is the correct perturbation to use - - - !-------------------------- - ! Init Jacobians for y - !-------------------------- - - ! No regular outputs, only the extended outputs and the WrOuts - p%LinParams%NumExtendedOutputs = 1 - ExtStart = 1 ! Extended output is the first output - ny = 1 ! one extended output - p%LinParams%Jac_y_idxStartList%Extended = 1 - - ! Nunber of WrOuts (only if output to OpenFAST) - if ( p%OutSwtch /= 1 .and. allocated(InitOut%WriteOutputHdr) ) then - ny = ny + size(InitOut%WriteOutputHdr) - endif - - ! start position for WrOuts (may be beyond ny) - p%LinParams%Jac_y_idxStartList%WrOuts = p%LinParams%Jac_y_idxStartList%Extended + p%LinParams%NumExtendedOutputs - - ! Total number of outs (including regular outs and extended outs) - p%LinParams%Jac_ny = ny - - ! allocate some things - call AllocAry(InitOut%LinNames_y, ny, "LinNames_y", ErrStat2, ErrMsg2); if (Failed()) return; - call AllocAry(InitOut%RotFrame_y, ny, "RotFrame_y", ErrStat2, ErrMsg2); if (Failed()) return; - InitOut%RotFrame_y = .false. ! No outputs in rotating frame - - ! Set names: no regular output, so start at extended output - InitOut%LinNames_y(ExtStart) = 'Extended output: wave elevation at platform ref point, m' - - ! WrOuts names (only if output to OpenFAST) - if ( p%OutSwtch > 1 .and. allocated(InitOut%WriteOutputHdr) ) then - do i = 1,size(InitOut%WriteOutputHdr) - idx = p%LinParams%Jac_y_idxStartList%WrOuts - 1 + i ! current index - InitOut%LinNames_y(idx) = trim(InitOut%WriteOutputHdr(i))//', '//trim(InitOut%WriteOutputUnt(i)) - enddo - endif - - -contains - logical function Failed() - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - end function Failed -end subroutine SeaSt_Init_Jacobian !---------------------------------------------------------------------------------------------------------------------------------- !> Linearization Jacobians dY/du, dX/du, dXd/du, and dZ/du -subroutine SeaSt_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +subroutine SeaSt_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) + type(ModVarsType), intent(in ) :: Vars !< Module variables real(DbKi), intent(in ) :: t !< Time in seconds at operating point type(SeaSt_InputType), intent(inout) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) type(SeaSt_ParameterType), intent(in ) :: p !< Parameters @@ -868,54 +864,47 @@ subroutine SeaSt_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, E real(R8Ki), allocatable, optional, intent(inout) :: dXddu(:,:) !< Partial derivatives of discrete state real(R8Ki), allocatable, optional, intent(inout) :: dZdu(:,:) !< Partial derivatives of constraint state + character(*), parameter :: RoutineName = 'SeaSt_JacobianPInput' integer(IntKi) :: idx_dY,idx_du,i integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SeaSt_JacobianPInput' + integer(IntKi) :: iVar_u_WaveElev0, iVar_y_WaveElev0 ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' - if ( present( dYdu ) ) then - - ! If dYdu is allocated, make sure it is the correct size - if (allocated(dYdu)) then - if (size(dYdu,1) /= p%LinParams%Jac_ny .or. size(dYdu,2) /= p%LinParams%Jac_nu) deallocate (dYdu) + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) + if (present(dYdu)) then + + if (.not. allocated(dYdu)) then + call AllocAry(dYdu, m%Jac%Ny, m%Jac%Nu, 'dYdu', ErrStat2, ErrMsg2); if(Failed()) return endif - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: - ! - inputs are extended inputs only - ! - outputs are the extended outputs and the WriteOutput values - if (.not. ALLOCATED(dYdu)) then - call AllocAry( dYdu, p%LinParams%Jac_ny, p%LinParams%Jac_nu, 'dYdu', ErrStat2, ErrMsg2 ) - if (Failed()) return - end if - + ! Initialize Jacobian to zero dYdu = 0.0_R8Ki - ! Extended inputs to extended outputs (direct pass-through) - do i=1,min(p%LinParams%NumExtendedInputs,p%LinParams%NumExtendedOutputs) - idx_du = p%LinParams%Jac_u_idxStartList%Extended + i - 1 - idx_dY = p%LinParams%Jac_y_idxStartList%Extended + i - 1 - dYdu(idx_dY,idx_du) = 1.0_R8Ki - enddo + iVar_u_WaveElev0 = MV_FindVarDatLoc(Vars%u, DatLoc(SeaSt_u_WaveElev0)) + iVar_y_WaveElev0 = MV_FindVarDatLoc(Vars%y, DatLoc(SeaSt_y_WaveElev0)) + ! Extended input to extended output (direct pass-through) + if (iVar_u_WaveElev0 > 0 .and. iVar_y_WaveElev0 > 0) then + dYdu(Vars%y(iVar_y_WaveElev0)%iLoc(1), Vars%u(iVar_u_WaveElev0)%iLoc(1)) = 1.0_R8Ki + end if + ! It isn't possible to determine the relationship between the extended input and the WrOuts. So we leave them all zero. - endif - ! No states or constraints, so deallocate any such matrices - if ( present( dXdu ) ) then + if (present(dXdu)) then if (allocated(dXdu)) deallocate(dXdu) endif - if ( present( dXddu ) ) then + if (present(dXddu)) then if (allocated(dXddu)) deallocate(dXddu) endif - if ( present( dZdu ) ) then + if (present(dZdu)) then if (allocated(dZdu)) deallocate(dZdu) endif @@ -929,7 +918,8 @@ end subroutine SeaSt_JacobianPInput !---------------------------------------------------------------------------------------------------------------------------------- !> Linearization Jacobians dY/dx, dX/dx, dXd/dx, and dZ/dx !! No continuous states, so this doesn't do anything -subroutine SeaSt_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +subroutine SeaSt_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) + type(ModVarsType), intent(in ) :: Vars !< Module variables real(DbKi), intent(in ) :: t !< Time in seconds at operating point type(SeaSt_InputType), intent(in ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) type(SeaSt_ParameterType), intent(in ) :: p !< Parameters @@ -970,7 +960,8 @@ end subroutine SeaSt_JacobianPContState !---------------------------------------------------------------------------------------------------------------------------------- !> Linearization Jacobians dY/dxd, dX/dxd, dXd/dxd, and dZ/dxd !! No discrete states, so this doesn't do anything -subroutine SeaSt_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) +subroutine SeaSt_JacobianPDiscState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd) + type(ModVarsType), intent(in ) :: Vars !< Module variables real(DbKi), intent(in ) :: t !< Time in seconds at operating point type(SeaSt_InputType), intent(in ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) type(SeaSt_ParameterType), intent(in ) :: p !< Parameters @@ -1011,7 +1002,8 @@ end subroutine SeaSt_JacobianPDiscState !---------------------------------------------------------------------------------------------------------------------------------- !> Linearization Jacobians dY/dz, dX/dz, dXd/dz, and dZ/dz !! No constraint states, so this doesn't do anything -subroutine SeaSt_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) +subroutine SeaSt_JacobianPConstrState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz) + type(ModVarsType), intent(in ) :: Vars !< Module variables real(DbKi), intent(in ) :: t !< Time in seconds at operating point type(SeaSt_InputType), intent(in ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) type(SeaSt_ParameterType), intent(in ) :: p !< Parameters @@ -1049,79 +1041,43 @@ subroutine SeaSt_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrS ! endif end subroutine SeaSt_JacobianPConstrState -!---------------------------------------------------------------------------------------------------------------------------------- -!> Linearization operating points u_op, y_op, x_op, dx_op, xd_op, and z_op -subroutine SeaSt_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) - real(DbKi), intent(in ) :: t !< Time in seconds at operating point - type(SeaSt_InputType), intent(in ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - type(SeaSt_ParameterType), intent(in ) :: p !< Parameters - type(SeaSt_ContinuousStateType), intent(in ) :: x !< Continuous states at operating point - type(SeaSt_DiscreteStateType), intent(in ) :: xd !< Discrete states at operating point - type(SeaSt_ConstraintStateType), intent(in ) :: z !< Constraint states at operating point - type(SeaSt_OtherStateType), intent(in ) :: OtherState !< Other states at operating point - type(SeaSt_OutputType), intent(in ) :: y !< Output at operating point - type(SeaSt_MiscVarType), intent(inout) :: m !< Misc/optimization variables - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - real(ReKi), allocatable, optional, intent(inout) :: u_op(:) !< values of linearized inputs - real(ReKi), allocatable, optional, intent(inout) :: y_op(:) !< values of linearized outputs - real(ReKi), allocatable, optional, intent(inout) :: x_op(:) !< values of linearized continuous states - real(ReKi), allocatable, optional, intent(inout) :: dx_op(:) !< values of first time derivatives of linearized continuous states - real(ReKi), allocatable, optional, intent(inout) :: xd_op(:) !< values of linearized discrete states - real(ReKi), allocatable, optional, intent(inout) :: z_op(:) !< values of linearized constraint states - - integer(IntKi) :: idxStart, idxEnd - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SeaSt_GetOP' - - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = '' - - - if ( present( u_op ) ) then - if (.not. allocated(u_op)) then - call AllocAry(u_op, p%LinParams%Jac_nu, 'u_op', ErrStat2, ErrMsg2) - if (Failed()) return - end if - - ! no regular inputs, only extended input - u_op(p%LinParams%Jac_u_idxStartList%Extended) = 0.0_ReKi ! WaveElev0 is zero to be consistent with linearization requirements - ! NOTE: if more extended inputs are added, place them here - end if - - if ( present( y_op ) ) then - if (.not. allocated(y_op)) then - call AllocAry(y_op, p%LinParams%Jac_ny, 'y_op', ErrStat2, ErrMsg2) - if (Failed()) return - end if - - ! no regular outputs, only extended output and WrOuts - y_op(p%LinParams%Jac_y_idxStartList%Extended) = 0.0_ReKi ! WaveElev0 is zero to be consistent with linearization requirements - ! NOTE: if more extended inputs are added, place them here - - ! WrOuts may not be sent to OpenFAST (y_op sized smaller if WrOuts not sent to OpenFAST) - if (p%LinParams%Jac_y_idxStartList%WrOuts <= p%LinParams%Jac_ny) then - idxStart = p%LinParams%Jac_y_idxStartList%WrOuts - idxEnd = p%LinParams%Jac_y_idxStartList%WrOuts + p%NumOuts - 1 - ! unnecessary array check to make me feel better about the potentially sloppy indexing - if (idxEnd > p%LinParams%Jac_ny) then - ErrStat2 = ErrID_Fatal; ErrMsg2 = "Error in the y_op sizing -- u_op not large enough for WrOuts" - if (Failed()) return - endif - ! copy over the returned outputs - y_op(idxStart:idxEnd) = y%WriteOutput(1:p%NumOuts) - endif - end if - - -contains - logical function Failed() - call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - end function Failed -end subroutine SeaSt_GetOP +subroutine SeaSt_PackExtInputAry(Vars, u, ValAry) + type(ModVarsType), intent(in) :: Vars !< Module variables + type(SeaSt_InputType), intent(in) :: u !< Inputs + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + + ! Loop through Input variables + do i = 1, size(Vars%u) + associate (Var => Vars%u(i)) + ! Select based on data location number + select case (Var%DL%Num) + case (SeaSt_u_WaveElev0) + ! WaveElev0 is zero to be consistent with linearization requirements + ValAry(Vars%u(i)%iLoc(1):Vars%u(i)%iLoc(2)) = 0.0_R8Ki + end select + end associate + end do +end subroutine + +subroutine SeaSt_PackExtOutputAry(Vars, y, ValAry) + type(ModVarsType), intent(in) :: Vars !< Module variables + type(SeaSt_OutputType), intent(in) :: y !< Outputs + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + + ! Loop through output variables + do i = 1, size(Vars%y) + associate (Var => Vars%y(i)) + ! Select based on data location number + select case (Var%DL%Num) + case (SeaSt_y_WaveElev0) + ! WaveElev0 is zero to be consistent with linearization requirements + ValAry(Vars%y(i)%iLoc(1):Vars%y(i)%iLoc(2)) = 0.0_R8Ki + end select + end associate + end do +end subroutine !---------------------------------------------------------------------------------------------------------------------------------- END MODULE SeaState diff --git a/modules/seastate/src/SeaState.txt b/modules/seastate/src/SeaState.txt index 67d328588a..10da071ba5 100644 --- a/modules/seastate/src/SeaState.txt +++ b/modules/seastate/src/SeaState.txt @@ -18,6 +18,9 @@ usefrom Current.txt usefrom Waves.txt usefrom Waves2.txt usefrom SeaSt_WaveField.txt + +param SeaState/SeaSt - IntKi SeaSt_u_WaveElev0 - -1 - "WaveElev0 Extended input DatLoc number" - +param ^ - IntKi SeaSt_y_WaveElev0 - -2 - "WaveElev0 Extended output DatLoc number" - # # typedef SeaState/SeaSt SeaSt_InputFile LOGICAL EchoFlag - - - "Echo the input file" @@ -61,7 +64,7 @@ typedef ^ ^ SiKi WvLowCO typedef ^ ^ SiKi WvHiCOffS - - - "Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0]" (rad/s) typedef ^ ^ SiKi WaveDOmega - - - "Frequency step for incident wave calculations" (rad/s) typedef ^ ^ INTEGER WaveMod - - - "Incident wave kinematics model: See valid values in SeaSt_WaveField module parameters." - - +typedef ^ ^ INTEGER WvCrntMod - - - "Wave-current modeling option" - typedef SeaState/SeaSt InitInputType CHARACTER(1024) InputFile - - - "Supplied by Driver: full path and filename for the SeaState module" - typedef ^ ^ LOGICAL UseInputFile - .TRUE. - "Supplied by Driver: .TRUE. if using a input file, .FALSE. if all inputs are being passed in by the caller" - @@ -71,6 +74,7 @@ typedef ^ ^ ReKi Gra typedef ^ ^ ReKi defWtrDens - - - "Default water density from the driver; may be overwritten " "(kg/m^3)" typedef ^ ^ ReKi defWtrDpth - - - "Default water depth from the driver; may be overwritten " "m" typedef ^ ^ ReKi defMSL2SWL - - - "Default mean sea level to still water level from the driver; may be overwritten" "m" +typedef ^ ^ IntKi MHK - - - "MHK flag" - typedef ^ ^ DbKi TMax - - - "Supplied by Driver: The total simulation time" "(sec)" typedef ^ ^ DbKi WaveTimeShift - 0 - "Add this to the time to effectively phase shift the wave (useful for hybrid tank testing). Positive value only (advance time)" (s) typedef ^ ^ INTEGER WaveFieldMod - - - "Wave field handling (-) (switch) 0: use individual SeaState inputs without adjustment, 1: adjust wave phases based on turbine offsets from farm origin" - @@ -79,9 +83,12 @@ typedef ^ ^ ReKi Ptf typedef ^ ^ IntKi WrWvKinMod - 0 - "0,1, or 2 indicating whether we are going to write out kinematics files. [ignored if WaveMod = 6, if 1 or 2 then files are written using the outrootname]" - typedef ^ ^ LOGICAL HasIce - - - "Supplied by Driver: Whether this simulation has ice loading (flag)" - typedef ^ ^ Logical Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - +typedef ^ ^ LOGICAL hasCurrField - - - "Flag to indicate whether to expect current field from IfW" - +typedef ^ ^ IntKi CompSeaSt - - - "Flag to indicate whether SeaState module is activated" - typedef ^ ^ Logical SurfaceVis - .FALSE. - "Turn on grid surface visualization outputs" - typedef ^ ^ IntKi SurfaceVisNx - 0 - "Number of points in X direction to output for visualization grid. Use 0 or negative to set to SeaState resolution." - typedef ^ ^ IntKi SurfaceVisNy - 0 - "Number of points in Y direction to output for visualization grid. Use 0 or negative to set to SeaState resolution." - +typedef ^ ^ FlowFieldType *CurrField - - - "Pointer to FlowField type from InflowWind containing the dynamic current information" (-) # # @@ -95,11 +102,7 @@ typedef ^ ^ SiKi Wav typedef ^ ^ SiKi WaveElevVisY {:} - - "Y locations of grid output" "m,-" typedef ^ ^ SiKi WaveElevVisGrid {:}{:}{:} - - "Wave elevation time-series at each of the points given by WaveElevXY. First dimension is the timestep. Second/third dimensions are the grid of points." (m) typedef ^ ^ SeaSt_WaveFieldType *WaveField - - - "Pointer to wave field" -typedef ^ ^ CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -typedef ^ ^ CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -typedef ^ ^ LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - -typedef ^ ^ LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - -typedef ^ ^ LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix)" - +typedef ^ ^ ModVarsType Vars - - - "Module Variables" @@ -121,29 +124,6 @@ typedef ^ ConstraintStateType R8Ki # Define any other states, including integer or logical states here: typedef ^ OtherStateType R8Ki UnusedStates - - - "placeholder for states" - # -# ..... Misc/Optimization variables................................................................................................. -# Define any data that are used only for efficiency purposes (these variables are not associated with time): -# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. -typedef ^ MiscVarType INTEGER Decimate - - - "The output decimation counter" - -typedef ^ ^ DbKi LastOutTime - - - "Last time step which was written to the output file (sec)" - -typedef ^ ^ INTEGER LastIndWave - - - "The last index used in the wave kinematics arrays, used to optimize interpolation" - -typedef ^ ^ GridInterp_MiscVarType WaveField_m - - - "misc var information from the Grid Interpolation module" - - -# .... Linearization params ....................................................................................................... -# NOTE: This is overkill given how limited linearization is. For completeness and similarity to other modules, keeping all this here. Also note some -# values are set here, but will be overwritten in the code. -typedef ^ Jac_u_idxStarts IntKi Extended - 1 - "Index to first point in u jacobian for Extended" - -typedef ^ Jac_y_idxStarts IntKi Extended - 1 - "Index to first point in y jacobian for Extended" - -typedef ^ Jac_y_idxStarts IntKi WrOuts - 2 - "Index to first point in y jacobian for WrOuts" - -typedef ^ SeaSt_LinParams IntKi NumExtendedInputs - 1 - "number of extended inputs" - -typedef ^ ^ IntKi NumExtendedOutputs - 1 - "number of extended outputs" - -typedef ^ ^ Jac_u_idxStarts Jac_u_idxStartList - - - "Starting indices for all Jac_u components" - -typedef ^ ^ Jac_y_idxStarts Jac_y_idxStartList - - - "Starting indices for all Jac_y components" - -typedef ^ ^ ReKi du {:} - - "vector that determines size of perturbation for u (inputs)" -typedef ^ ^ IntKi Jac_nu - - - "number of inputs in jacobian matrix" - -typedef ^ ^ IntKi Jac_ny - - - "number of outputs in jacobian matrix" - - - # ..... Parameters ................................................................................................................ # Define parameters here: @@ -169,7 +149,6 @@ typedef ^ ^ CHARACTER(1) Del typedef ^ ^ INTEGER UnOutFile - - - "File unit for the SeaState outputs" - typedef ^ ^ INTEGER OutDec - - - "Write every OutDec time steps" - typedef ^ ^ SeaSt_WaveFieldType &WaveField - - - "Wave field" - -typedef ^ ^ SeaSt_LinParams LinParams - - - "Linearization parameters" - # # @@ -182,3 +161,16 @@ typedef ^ InputType SiKi Dum # ..... Outputs ................................................................................................................... # Define outputs that are contained on the mesh here: typedef ^ OutputType ReKi WriteOutput {:} - - "Outputs to be written to the output file(s)" - + +# ..... Misc/Optimization variables................................................................................................. +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef ^ MiscVarType INTEGER Decimate - - - "The output decimation counter" - +typedef ^ ^ DbKi LastOutTime - - - "Last time step which was written to the output file (sec)" - +typedef ^ ^ INTEGER LastIndWave - - - "The last index used in the wave kinematics arrays, used to optimize interpolation" - +typedef ^ ^ GridInterp_MiscVarType WaveField_m - - - "misc var information from the SeaState Interpolation module" - + +# .... Linearization ....................................................................................................... +typedef ^ ^ ModJacType Jac - - - "Values corresponding to module variables" - +typedef ^ ^ SeaSt_InputType u_perturb - - - "Input type for linearization perturbation" - +typedef ^ ^ SeaSt_OutputType y_lin - - - "Output type for linearization perturbation" - diff --git a/modules/seastate/src/SeaState_C_Binding.f90 b/modules/seastate/src/SeaState_C_Binding.f90 index 747b786d7d..1d15ebae9e 100644 --- a/modules/seastate/src/SeaState_C_Binding.f90 +++ b/modules/seastate/src/SeaState_C_Binding.f90 @@ -520,8 +520,7 @@ subroutine SeaSt_C_GetFluidVelAcc(Time_C, Pos_C, Vel_C, Acc_C, NodeInWater_C, Er real(SiKi) :: Vel(3) real(SiKi) :: Acc(3) logical :: forceNodeInWater -!FIXME:dev-tc uncomment next line -! logical :: fetchDynCurrent + logical, parameter :: fetchDynCurrent = .true. integer(IntKi) :: nodeInWater integer :: ErrStat, ErrStat2 character(ErrMsgLen) :: ErrMsg, ErrMsg2 @@ -554,9 +553,7 @@ subroutine SeaSt_C_GetFluidVelAcc(Time_C, Pos_C, Vel_C, Acc_C, NodeInWater_C, Er ! - if node is out of water, velocity and acceleration are zero ! - if position is outside the wave field boundary, it will simply return boundary edge value ! - time must be positive or a fatal error occurs - call WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, pos, forceNodeInWater, nodeInWater, Vel, Acc, ErrStat, ErrMsg ) -!FIXME:dev-tc use next line instead of above -! call WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, pos, forceNodeInWater, fetchDynCurrent, nodeInWater, Vel, Acc, ErrStat, ErrMsg ) + call WaveField_GetNodeWaveVelAcc( p%WaveField, m%WaveField_m, Time, pos, forceNodeInWater, fetchDynCurrent, nodeInWater, Vel, Acc, ErrStat, ErrMsg ) ! Store resulting velocity and acceleration as C type Vel_c = real(Vel,c_float) diff --git a/modules/seastate/src/SeaState_DriverCode.f90 b/modules/seastate/src/SeaState_DriverCode.f90 index aec84e8ba3..f1ae3fb7a0 100644 --- a/modules/seastate/src/SeaState_DriverCode.f90 +++ b/modules/seastate/src/SeaState_DriverCode.f90 @@ -193,6 +193,7 @@ program SeaStateDriver ! Clean up and exit call SeaSt_DvrCleanup() end if + p%WaveField%hasCurrField = .FALSE. if ( Interval /= drvrInitInp%TimeInterval) then call SetErrStat( ErrID_Fatal, 'The SeaState Module attempted to change timestep interval, but this is not allowed. The SeaState Module must use the Driver Interval.', ErrStat, ErrMsg, 'Driver') diff --git a/modules/seastate/src/SeaState_Input.f90 b/modules/seastate/src/SeaState_Input.f90 index ded517105d..7ebfcf016b 100644 --- a/modules/seastate/src/SeaState_Input.f90 +++ b/modules/seastate/src/SeaState_Input.f90 @@ -174,6 +174,10 @@ subroutine SeaSt_ParseInput( InputFileName, OutRootName, defWtrDens, defWtrDpth, call ParseVar( FileInfo_In, CurLine, 'WaveStMod', InputFileData%WaveStMod, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; + ! WvCrntMod - Model switch for wave-current modeling. + call ParseVar( FileInfo_In, CurLine, 'WvCrntMod', InputFileData%WvCrntMod, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return; + ! WaveTMax - Analysis time for incident wave calculations. call ParseVar( FileInfo_In, CurLine, 'WaveTMax', InputFileData%Waves%WaveTMax, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return; @@ -618,7 +622,20 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, InputFileData, ErrStat, Er RETURN END IF END IF - + + ! WvCrntMod - Model switch for wave-current modeling + SELECT CASE(InputFileData%WvCrntMod) + CASE(WvCrntMod_Superpose) + CASE(WvCrntMod_Doppler) + CASE(WvCrntMod_Full) + CASE DEFAULT + call SetErrStat( ErrID_Fatal,'WvCrntMod must be 0, 1, or 2',ErrStat,ErrMsg,RoutineName) + return + END SELECT + + IF ( InputFileData%WaveMod == WaveMod_None .or. InputFileData%WaveMod == WaveMod_ExtFull ) THEN ! WvCrntMod is not used + InputFileData%WvCrntMod = 0_IntKi + END IF ! WaveTMax - Analysis time for incident wave calculations. @@ -691,11 +708,19 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, InputFileData, ErrStat, Er end if - ! WavePkShp - Peak shape parameter - if ( ( InputFileData%Waves%WavePkShp < 1.0 ) .OR. ( InputFileData%Waves%WavePkShp > 7.0 ) ) then - call SetErrStat( ErrID_Fatal,'WavePkShp must be greater than or equal to 1 and less than or equal to 7.',ErrStat,ErrMsg,RoutineName) - return + if ( InputFileData%WaveMod == WaveMod_JONSWAP ) then ! Only used for JONSWAP/Pierson-Moskowitz spectrum + + if ( ( InputFileData%Waves%WavePkShp < 1.0_SiKi ) .OR. ( InputFileData%Waves%WavePkShp > 7.0_SiKi ) ) then + call SetErrStat( ErrID_Fatal,'WavePkShp must be greater than or equal to 1 and less than or equal to 7.',ErrStat,ErrMsg,RoutineName) + return + end if + + else + + ! For nonJONSWAP/Pierson-Moskowitz spectrum, WavePkShp is not used. Force it to 1.0. + InputFileData%Waves%WavePkShp = 1.0_SiKi + end if @@ -809,6 +834,10 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, InputFileData, ErrStat, Er call SetErrStat( ErrID_Fatal,' WaveDirRange should be less than a full circle.',ErrStat,ErrMsg,RoutineName) ENDIF + if ( InputFileData%Waves%WaveNDir == 1_IntKi) then + InputFileData%WaveMultiDir = .false. + endif + else ! Set everything to zero if we aren't going to use it InputFileData%Waves%WaveNDir = 1 ! Only one direction set -- this shouldn't get used later anyhow @@ -896,6 +925,10 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, InputFileData, ErrStat, Er ! CurrMod - Current profile model switch + if ( InitInp%hasCurrField ) then + call SetErrStat( ErrID_Warn,'Expecting current field from InflowWind. Setting CurrMod to 0.',ErrStat,ErrMsg,RoutineName) + InputFileData%Current%CurrMod = 0 + end if if ( ( InputFileData%Current%CurrMod /= 0 ) .AND. ( InputFileData%Current%CurrMod /= 1 ) .AND. ( InputFileData%Current%CurrMod /= 2 ) ) then call SetErrStat( ErrID_Fatal,'CurrMod must be 0, 1, or 2.',ErrStat,ErrMsg,RoutineName) @@ -907,28 +940,23 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, InputFileData, ErrStat, Er return end if + ! if ( ( InputFileData%Current%CurrMod /= 0 ) .AND. ( InitInp%MHK /= MHK_None ) ) then + ! call SetErrStat( ErrID_Fatal,'CurrMod must be set to 0 for an MHK turbine.',ErrStat,ErrMsg,RoutineName) + ! return + ! end if - ! CurrSSV0 - Sub-surface current velocity at still water level if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. + !------------------------- Sub-surface current ------------------------- + + ! CurrSSV0 - Sub-surface current velocity at still water level if ( InputFileData%Current%CurrSSV0 < 0.0 ) then call SetErrStat( ErrID_Fatal,'CurrSSV0 must not be less than zero.',ErrStat,ErrMsg,RoutineName) return end if - else - - InputFileData%Current%CurrSSV0 = 0.0 - - end if - - ! CurrSSDirChr - Sub-surface current heading direction - - if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. - - if ( TRIM(InputFileData%Current%CurrSSDirChr) == 'DEFAULT' ) then ! .TRUE. when one wants to use the default value of codirectionality between sub-surface current and incident wave propogation heading directions. if ( InputFileData%WaveMod == WaveMod_None ) then @@ -952,94 +980,63 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, InputFileData, ErrStat, Er end if - - else - - InputFileData%Current%CurrSSDir = 0.0 - - end if - + !------------------------- Near-surface current ------------------------ ! CurrNSRef - Near-surface current reference depth. - - if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. - if ( InputFileData%Current%CurrNSRef <= 0.0 ) then call SetErrStat( ErrID_Fatal,'CurrNSRef must be greater than zero.',ErrStat,ErrMsg,RoutineName) return end if - else - - InputFileData%Current%CurrNSRef = 0.0 - - end if - - - - ! CurrNSV0 - Near-surface current velocity at still water level. - - if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. - + ! CurrNSV0 - Near-surface current velocity at still water level. if ( InputFileData%Current%CurrNSV0 < 0.0 ) then call SetErrStat( ErrID_Fatal,'CurrNSV0 must not be less than zero.',ErrStat,ErrMsg,RoutineName) return end if - else - - InputFileData%Current%CurrNSV0 = 0.0 - - end if - - ! CurrNSDir - Near-surface current heading direction. - - if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. - if ( ( InputFileData%Current%CurrNSDir <= -180.0 ) .OR. ( InputFileData%Current%CurrNSDir > 180.0 ) ) then call SetErrStat( ErrID_Fatal,'CurrNSDir must be greater than -180 and less than or equal to 180.',ErrStat,ErrMsg,RoutineName) return end if - else - - InputFileData%Current%CurrNSDir = 0.0 - - end if - + !---------------------- Depth-independent current ---------------------- ! CurrDIV - Depth-independent current velocity. - - if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. - if ( InputFileData%Current%CurrDIV < 0.0 ) then call SetErrStat( ErrID_Fatal,'CurrDIV must not be less than zero.',ErrStat,ErrMsg,RoutineName) return end if - else - - InputFileData%Current%CurrDIV = 0.0 - - end if - - ! CurrDIDir - Depth-independent current heading direction. - - if ( InputFileData%Current%CurrMod == 1 ) then ! .TRUE if we have standard current. - if ( ( InputFileData%Current%CurrDIDir <= -180.0 ) .OR. ( InputFileData%Current%CurrDIDir > 180.0 ) ) then call SetErrStat( ErrID_Fatal,'CurrDIDir must be greater than -180 and less than or equal to 180.',ErrStat,ErrMsg,RoutineName) return end if - else + else ! No current or user-defined current + InputFileData%Current%CurrSSV0 = 0.0 + InputFileData%Current%CurrSSDir = 0.0 + InputFileData%Current%CurrNSRef = 0.0 + InputFileData%Current%CurrNSV0 = 0.0 + InputFileData%Current%CurrNSDir = 0.0 + InputFileData%Current%CurrDIV = 0.0 InputFileData%Current%CurrDIDir = 0.0 end if + if ( InputFileData%Current%CurrMod == 0 .and. .not. InitInp%hasCurrField ) then ! No current + InputFileData%WvCrntMod = 0_IntKi + end if + + if ( InputFileData%Waves2%WvDiffQTFF .OR. InputFileData%Waves2%WvSumQTFF ) then + if (InputFileData%WvCrntMod /= WvCrntMod_Superpose) then + call SetErrStat( ErrID_Fatal,' 2nd-order waves are not supported with WvCrntMod = 1 or 2. Set WvCrntMod = 0 or set both WvDiffQTF and WvSumQTF to false. ',ErrStat,ErrMsg,RoutineName) + return + end if + end if + !------------------------------------------------------------------------------------------------- ! Data section for MacCamy-Fuchs diffraction model !------------------------------------------------------------------------------------------------- @@ -1173,6 +1170,7 @@ subroutine SeaStateInput_ProcessInitData( InitInp, p, InputFileData, ErrStat, Er p%WaveField%WaveMod = InputFileData%WaveMod p%WaveField%WaveStMod = InputFileData%WaveStMod + p%WaveField%WvCrntMod = InputFileData%WvCrntMod p%WaveField%WtrDens = InputFileData%WtrDens ! may have overwritten default InitInp p%WaveField%RhoXg = p%WaveField%WtrDens*InitInp%Gravity ! For WAMIT and WAMIT2 p%WaveField%WaveDir = InputFileData%WaveDir diff --git a/modules/seastate/src/SeaState_Output.f90 b/modules/seastate/src/SeaState_Output.f90 index 64d9f60677..2f596ed51a 100644 --- a/modules/seastate/src/SeaState_Output.f90 +++ b/modules/seastate/src/SeaState_Output.f90 @@ -490,7 +490,7 @@ subroutine SeaStOut_MapOutputs( p, WaveElev, WaveElev1, WaveElev2, WaveVel, Wav REAL(SiKi), intent( in ) :: WaveAcc(:,:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) REAL(SiKi), intent( in ) :: WaveAccMCF(:,:) ! Instantaneous first order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) REAL(SiKi), intent( in ) :: WaveDynP(:) ! Instantaneous second order elevation of incident waves at each of the NWaveElev points where the incident wave elevations can be output (meters) - REAL(ReKi), intent( out ) :: AllOuts(MaxOutpts) + REAL(ReKi), intent( out ) :: AllOuts(0:MaxOutpts) INTEGER(IntKi), intent( out ) :: ErrStat ! Error status of the operation CHARACTER(*), intent( out ) :: ErrMsg ! Error message if ErrStat /= ErrID_None @@ -916,21 +916,16 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) Indx = FindValidChannelIndx(OutList(I), ValidParamAry, p%OutParam(I)%SignM) - IF ( Indx > 0 ) THEN ! we found the channel name - IF ( InvalidOutput( ParamIndxAry(Indx) ) ) THEN ! but, it isn't valid for these settings - p%OutParam(I)%Indx = 0 ! pick any valid channel (I just picked "Time=0" here because it's universal) - p%OutParam(I)%Units = "INVALID" - p%OutParam(I)%SignM = 0 - ELSE - p%OutParam(I)%Indx = ParamIndxAry(Indx) - p%OutParam(I)%Units = ParamUnitsAry(Indx) ! it's a valid output - END IF - ELSE ! this channel isn't valid + ! If channel has no index or is invalid + IF ( Indx <= 0 .or. InvalidOutput( ParamIndxAry(Indx) ) ) THEN p%OutParam(I)%Indx = 0 ! pick any valid channel (I just picked "Time=0" here because it's universal) p%OutParam(I)%Units = "INVALID" p%OutParam(I)%SignM = 0 ! multiply all results by zero - CALL SetErrStat(ErrID_Warn, TRIM(p%OutParam(I)%Name)//" is not an available output channel.",ErrStat,ErrMsg,RoutineName) + ELSE + ! Channel is invalid + p%OutParam(I)%Indx = ParamIndxAry(Indx) + p%OutParam(I)%Units = ParamUnitsAry(Indx) ! it's a valid output END IF END DO diff --git a/modules/seastate/src/SeaState_Types.f90 b/modules/seastate/src/SeaState_Types.f90 index 7d19e1e2bf..b15181ef0c 100644 --- a/modules/seastate/src/SeaState_Types.f90 +++ b/modules/seastate/src/SeaState_Types.f90 @@ -37,6 +37,8 @@ MODULE SeaState_Types USE SeaSt_WaveField_Types USE NWTC_Library IMPLICIT NONE + INTEGER(IntKi), PUBLIC, PARAMETER :: SeaSt_u_WaveElev0 = -1 ! WaveElev0 Extended input DatLoc number [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SeaSt_y_WaveElev0 = -2 ! WaveElev0 Extended output DatLoc number [-] ! ========= SeaSt_InputFile ======= TYPE, PUBLIC :: SeaSt_InputFile LOGICAL :: EchoFlag = .false. !< Echo the input file [-] @@ -80,6 +82,7 @@ MODULE SeaState_Types REAL(SiKi) :: WvHiCOffS = 0.0_R4Ki !< Maximum frequency used in the sum-QTF method [Ignored if SumQTF = 0] [(rad/s)] REAL(SiKi) :: WaveDOmega = 0.0_R4Ki !< Frequency step for incident wave calculations [(rad/s)] INTEGER(IntKi) :: WaveMod = 0_IntKi !< Incident wave kinematics model: See valid values in SeaSt_WaveField module parameters. [-] + INTEGER(IntKi) :: WvCrntMod = 0_IntKi !< Wave-current modeling option [-] END TYPE SeaSt_InputFile ! ======================= ! ========= SeaSt_InitInputType ======= @@ -92,6 +95,7 @@ MODULE SeaState_Types REAL(ReKi) :: defWtrDens = 0.0_ReKi !< Default water density from the driver; may be overwritten [(kg/m^3)] REAL(ReKi) :: defWtrDpth = 0.0_ReKi !< Default water depth from the driver; may be overwritten [m] REAL(ReKi) :: defMSL2SWL = 0.0_ReKi !< Default mean sea level to still water level from the driver; may be overwritten [m] + INTEGER(IntKi) :: MHK = 0_IntKi !< MHK flag [-] REAL(DbKi) :: TMax = 0.0_R8Ki !< Supplied by Driver: The total simulation time [(sec)] REAL(DbKi) :: WaveTimeShift = 0 !< Add this to the time to effectively phase shift the wave (useful for hybrid tank testing). Positive value only (advance time) [(s)] INTEGER(IntKi) :: WaveFieldMod = 0_IntKi !< Wave field handling (-) (switch) 0: use individual SeaState inputs without adjustment, 1: adjust wave phases based on turbine offsets from farm origin [-] @@ -100,9 +104,12 @@ MODULE SeaState_Types INTEGER(IntKi) :: WrWvKinMod = 0 !< 0,1, or 2 indicating whether we are going to write out kinematics files. [ignored if WaveMod = 6, if 1 or 2 then files are written using the outrootname] [-] LOGICAL :: HasIce = .false. !< Supplied by Driver: Whether this simulation has ice loading (flag) [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] + LOGICAL :: hasCurrField = .false. !< Flag to indicate whether to expect current field from IfW [-] + INTEGER(IntKi) :: CompSeaSt = 0_IntKi !< Flag to indicate whether SeaState module is activated [-] LOGICAL :: SurfaceVis = .FALSE. !< Turn on grid surface visualization outputs [-] INTEGER(IntKi) :: SurfaceVisNx = 0 !< Number of points in X direction to output for visualization grid. Use 0 or negative to set to SeaState resolution. [-] INTEGER(IntKi) :: SurfaceVisNy = 0 !< Number of points in Y direction to output for visualization grid. Use 0 or negative to set to SeaState resolution. [-] + TYPE(FlowFieldType) , POINTER :: CurrField => NULL() !< Pointer to FlowField type from InflowWind containing the dynamic current information [(-)] END TYPE SeaSt_InitInputType ! ======================= ! ========= SeaSt_InitOutputType ======= @@ -115,11 +122,7 @@ MODULE SeaState_Types REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveElevVisY !< Y locations of grid output [m,-] REAL(SiKi) , DIMENSION(:,:,:), ALLOCATABLE :: WaveElevVisGrid !< Wave elevation time-series at each of the points given by WaveElevXY. First dimension is the timestep. Second/third dimensions are the grid of points. [(m)] TYPE(SeaSt_WaveFieldType) , POINTER :: WaveField => NULL() !< Pointer to wave field [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_u !< Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_y !< Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] END TYPE SeaSt_InitOutputType ! ======================= ! ========= SeaSt_ContinuousStateType ======= @@ -142,36 +145,6 @@ MODULE SeaState_Types REAL(R8Ki) :: UnusedStates = 0.0_R8Ki !< placeholder for states [-] END TYPE SeaSt_OtherStateType ! ======================= -! ========= SeaSt_MiscVarType ======= - TYPE, PUBLIC :: SeaSt_MiscVarType - INTEGER(IntKi) :: Decimate = 0_IntKi !< The output decimation counter [-] - REAL(DbKi) :: LastOutTime = 0.0_R8Ki !< Last time step which was written to the output file (sec) [-] - INTEGER(IntKi) :: LastIndWave = 0_IntKi !< The last index used in the wave kinematics arrays, used to optimize interpolation [-] - TYPE(GridInterp_MiscVarType) :: WaveField_m !< misc var information from the Grid Interpolation module [-] - END TYPE SeaSt_MiscVarType -! ======================= -! ========= Jac_u_idxStarts ======= - TYPE, PUBLIC :: Jac_u_idxStarts - INTEGER(IntKi) :: Extended = 1 !< Index to first point in u jacobian for Extended [-] - END TYPE Jac_u_idxStarts -! ======================= -! ========= Jac_y_idxStarts ======= - TYPE, PUBLIC :: Jac_y_idxStarts - INTEGER(IntKi) :: Extended = 1 !< Index to first point in y jacobian for Extended [-] - INTEGER(IntKi) :: WrOuts = 2 !< Index to first point in y jacobian for WrOuts [-] - END TYPE Jac_y_idxStarts -! ======================= -! ========= SeaSt_LinParams ======= - TYPE, PUBLIC :: SeaSt_LinParams - INTEGER(IntKi) :: NumExtendedInputs = 1 !< number of extended inputs [-] - INTEGER(IntKi) :: NumExtendedOutputs = 1 !< number of extended outputs [-] - TYPE(Jac_u_idxStarts) :: Jac_u_idxStartList !< Starting indices for all Jac_u components [-] - TYPE(Jac_y_idxStarts) :: Jac_y_idxStartList !< Starting indices for all Jac_y components [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: du !< vector that determines size of perturbation for u (inputs) [-] - INTEGER(IntKi) :: Jac_nu = 0_IntKi !< number of inputs in jacobian matrix [-] - INTEGER(IntKi) :: Jac_ny = 0_IntKi !< number of outputs in jacobian matrix [-] - END TYPE SeaSt_LinParams -! ======================= ! ========= SeaSt_ParameterType ======= TYPE, PUBLIC :: SeaSt_ParameterType REAL(DbKi) :: WaveDT = 0.0_R8Ki !< Wave DT [sec] @@ -194,7 +167,6 @@ MODULE SeaState_Types INTEGER(IntKi) :: UnOutFile = 0_IntKi !< File unit for the SeaState outputs [-] INTEGER(IntKi) :: OutDec = 0_IntKi !< Write every OutDec time steps [-] TYPE(SeaSt_WaveFieldType) , POINTER :: WaveField => NULL() !< Wave field [-] - TYPE(SeaSt_LinParams) :: LinParams !< Linearization parameters [-] END TYPE SeaSt_ParameterType ! ======================= ! ========= SeaSt_InputType ======= @@ -207,7 +179,22 @@ MODULE SeaState_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Outputs to be written to the output file(s) [-] END TYPE SeaSt_OutputType ! ======================= -CONTAINS +! ========= SeaSt_MiscVarType ======= + TYPE, PUBLIC :: SeaSt_MiscVarType + INTEGER(IntKi) :: Decimate = 0_IntKi !< The output decimation counter [-] + REAL(DbKi) :: LastOutTime = 0.0_R8Ki !< Last time step which was written to the output file (sec) [-] + INTEGER(IntKi) :: LastIndWave = 0_IntKi !< The last index used in the wave kinematics arrays, used to optimize interpolation [-] + TYPE(GridInterp_MiscVarType) :: WaveField_m !< misc var information from the SeaState Interpolation module [-] + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] + TYPE(SeaSt_InputType) :: u_perturb !< Input type for linearization perturbation [-] + TYPE(SeaSt_OutputType) :: y_lin !< Output type for linearization perturbation [-] + END TYPE SeaSt_MiscVarType +! ======================= + integer(IntKi), public, parameter :: SeaSt_x_UnusedStates = 1 ! SeaSt%UnusedStates + integer(IntKi), public, parameter :: SeaSt_u_DummyInput = 2 ! SeaSt%DummyInput + integer(IntKi), public, parameter :: SeaSt_y_WriteOutput = 3 ! SeaSt%WriteOutput + +contains subroutine SeaSt_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg) type(SeaSt_InputFile), intent(in) :: SrcInputFileData @@ -334,6 +321,7 @@ subroutine SeaSt_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, Err DstInputFileData%WvHiCOffS = SrcInputFileData%WvHiCOffS DstInputFileData%WaveDOmega = SrcInputFileData%WaveDOmega DstInputFileData%WaveMod = SrcInputFileData%WaveMod + DstInputFileData%WvCrntMod = SrcInputFileData%WvCrntMod end subroutine subroutine SeaSt_DestroyInputFile(InputFileData, ErrStat, ErrMsg) @@ -417,6 +405,7 @@ subroutine SeaSt_PackInputFile(RF, Indata) call RegPack(RF, InData%WvHiCOffS) call RegPack(RF, InData%WaveDOmega) call RegPack(RF, InData%WaveMod) + call RegPack(RF, InData%WvCrntMod) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -469,6 +458,7 @@ subroutine SeaSt_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%WvHiCOffS); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveDOmega); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveMod); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WvCrntMod); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine SeaSt_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) @@ -477,6 +467,7 @@ subroutine SeaSt_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, Err integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(0), UB(0) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'SeaSt_CopyInitInput' @@ -492,6 +483,7 @@ subroutine SeaSt_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, Err DstInitInputData%defWtrDens = SrcInitInputData%defWtrDens DstInitInputData%defWtrDpth = SrcInitInputData%defWtrDpth DstInitInputData%defMSL2SWL = SrcInitInputData%defMSL2SWL + DstInitInputData%MHK = SrcInitInputData%MHK DstInitInputData%TMax = SrcInitInputData%TMax DstInitInputData%WaveTimeShift = SrcInitInputData%WaveTimeShift DstInitInputData%WaveFieldMod = SrcInitInputData%WaveFieldMod @@ -500,9 +492,12 @@ subroutine SeaSt_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, Err DstInitInputData%WrWvKinMod = SrcInitInputData%WrWvKinMod DstInitInputData%HasIce = SrcInitInputData%HasIce DstInitInputData%Linearize = SrcInitInputData%Linearize + DstInitInputData%hasCurrField = SrcInitInputData%hasCurrField + DstInitInputData%CompSeaSt = SrcInitInputData%CompSeaSt DstInitInputData%SurfaceVis = SrcInitInputData%SurfaceVis DstInitInputData%SurfaceVisNx = SrcInitInputData%SurfaceVisNx DstInitInputData%SurfaceVisNy = SrcInitInputData%SurfaceVisNy + DstInitInputData%CurrField => SrcInitInputData%CurrField end subroutine subroutine SeaSt_DestroyInitInput(InitInputData, ErrStat, ErrMsg) @@ -516,12 +511,14 @@ subroutine SeaSt_DestroyInitInput(InitInputData, ErrStat, ErrMsg) ErrMsg = '' call NWTC_Library_DestroyFileInfoType(InitInputData%PassedFileData, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + nullify(InitInputData%CurrField) end subroutine subroutine SeaSt_PackInitInput(RF, Indata) type(RegFile), intent(inout) :: RF type(SeaSt_InitInputType), intent(in) :: InData character(*), parameter :: RoutineName = 'SeaSt_PackInitInput' + logical :: PtrInIndex if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%InputFile) call RegPack(RF, InData%UseInputFile) @@ -531,6 +528,7 @@ subroutine SeaSt_PackInitInput(RF, Indata) call RegPack(RF, InData%defWtrDens) call RegPack(RF, InData%defWtrDpth) call RegPack(RF, InData%defMSL2SWL) + call RegPack(RF, InData%MHK) call RegPack(RF, InData%TMax) call RegPack(RF, InData%WaveTimeShift) call RegPack(RF, InData%WaveFieldMod) @@ -539,9 +537,18 @@ subroutine SeaSt_PackInitInput(RF, Indata) call RegPack(RF, InData%WrWvKinMod) call RegPack(RF, InData%HasIce) call RegPack(RF, InData%Linearize) + call RegPack(RF, InData%hasCurrField) + call RegPack(RF, InData%CompSeaSt) call RegPack(RF, InData%SurfaceVis) call RegPack(RF, InData%SurfaceVisNx) call RegPack(RF, InData%SurfaceVisNy) + call RegPack(RF, associated(InData%CurrField)) + if (associated(InData%CurrField)) then + call RegPackPointer(RF, c_loc(InData%CurrField), PtrInIndex) + if (.not. PtrInIndex) then + call IfW_FlowField_PackFlowFieldType(RF, InData%CurrField) + end if + end if if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -549,6 +556,11 @@ subroutine SeaSt_UnPackInitInput(RF, OutData) type(RegFile), intent(inout) :: RF type(SeaSt_InitInputType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'SeaSt_UnPackInitInput' + integer(B4Ki) :: LB(0), UB(0) + integer(IntKi) :: stat + logical :: IsAllocAssoc + integer(B8Ki) :: PtrIdx + type(c_ptr) :: Ptr if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%InputFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UseInputFile); if (RegCheckErr(RF, RoutineName)) return @@ -558,6 +570,7 @@ subroutine SeaSt_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%defWtrDens); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%defWtrDpth); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%defMSL2SWL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MHK); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TMax); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveTimeShift); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveFieldMod); if (RegCheckErr(RF, RoutineName)) return @@ -566,9 +579,29 @@ subroutine SeaSt_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%WrWvKinMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HasIce); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%hasCurrField); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CompSeaSt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SurfaceVis); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SurfaceVisNx); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SurfaceVisNy); if (RegCheckErr(RF, RoutineName)) return + if (associated(OutData%CurrField)) deallocate(OutData%CurrField) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackPointer(RF, Ptr, PtrIdx); if (RegCheckErr(RF, RoutineName)) return + if (c_associated(Ptr)) then + call c_f_pointer(Ptr, OutData%CurrField) + else + allocate(OutData%CurrField,stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%CurrField.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + RF%Pointers(PtrIdx) = c_loc(OutData%CurrField) + call IfW_FlowField_UnpackFlowFieldType(RF, OutData%CurrField) ! CurrField + end if + else + OutData%CurrField => null() + end if end subroutine subroutine SeaSt_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg) @@ -648,66 +681,9 @@ subroutine SeaSt_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, DstInitOutputData%WaveElevVisGrid = SrcInitOutputData%WaveElevVisGrid end if DstInitOutputData%WaveField => SrcInitOutputData%WaveField - if (allocated(SrcInitOutputData%LinNames_y)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_y) - UB(1:1) = ubound(SrcInitOutputData%LinNames_y) - if (.not. allocated(DstInitOutputData%LinNames_y)) then - allocate(DstInitOutputData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_y = SrcInitOutputData%LinNames_y - end if - if (allocated(SrcInitOutputData%LinNames_u)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_u) - UB(1:1) = ubound(SrcInitOutputData%LinNames_u) - if (.not. allocated(DstInitOutputData%LinNames_u)) then - allocate(DstInitOutputData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_u = SrcInitOutputData%LinNames_u - end if - if (allocated(SrcInitOutputData%RotFrame_u)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_u) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_u) - if (.not. allocated(DstInitOutputData%RotFrame_u)) then - allocate(DstInitOutputData%RotFrame_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_u = SrcInitOutputData%RotFrame_u - end if - if (allocated(SrcInitOutputData%RotFrame_y)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_y) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_y) - if (.not. allocated(DstInitOutputData%RotFrame_y)) then - allocate(DstInitOutputData%RotFrame_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_y = SrcInitOutputData%RotFrame_y - end if - if (allocated(SrcInitOutputData%IsLoad_u)) then - LB(1:1) = lbound(SrcInitOutputData%IsLoad_u) - UB(1:1) = ubound(SrcInitOutputData%IsLoad_u) - if (.not. allocated(DstInitOutputData%IsLoad_u)) then - allocate(DstInitOutputData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%IsLoad_u = SrcInitOutputData%IsLoad_u - end if + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine SeaSt_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -737,21 +713,8 @@ subroutine SeaSt_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) deallocate(InitOutputData%WaveElevVisGrid) end if nullify(InitOutputData%WaveField) - if (allocated(InitOutputData%LinNames_y)) then - deallocate(InitOutputData%LinNames_y) - end if - if (allocated(InitOutputData%LinNames_u)) then - deallocate(InitOutputData%LinNames_u) - end if - if (allocated(InitOutputData%RotFrame_u)) then - deallocate(InitOutputData%RotFrame_u) - end if - if (allocated(InitOutputData%RotFrame_y)) then - deallocate(InitOutputData%RotFrame_y) - end if - if (allocated(InitOutputData%IsLoad_u)) then - deallocate(InitOutputData%IsLoad_u) - end if + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine SeaSt_PackInitOutput(RF, Indata) @@ -774,11 +737,7 @@ subroutine SeaSt_PackInitOutput(RF, Indata) call SeaSt_WaveField_PackSeaSt_WaveFieldType(RF, InData%WaveField) end if end if - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%RotFrame_u) - call RegPackAlloc(RF, InData%RotFrame_y) - call RegPackAlloc(RF, InData%IsLoad_u) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -817,11 +776,7 @@ subroutine SeaSt_UnPackInitOutput(RF, OutData) else OutData%WaveField => null() end if - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine SeaSt_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg) @@ -976,226 +931,6 @@ subroutine SeaSt_UnPackOtherState(RF, OutData) call RegUnpack(RF, OutData%UnusedStates); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine SeaSt_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(SeaSt_MiscVarType), intent(in) :: SrcMiscData - type(SeaSt_MiscVarType), intent(inout) :: DstMiscData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SeaSt_CopyMisc' - ErrStat = ErrID_None - ErrMsg = '' - DstMiscData%Decimate = SrcMiscData%Decimate - DstMiscData%LastOutTime = SrcMiscData%LastOutTime - DstMiscData%LastIndWave = SrcMiscData%LastIndWave - call GridInterp_CopyMisc(SrcMiscData%WaveField_m, DstMiscData%WaveField_m, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return -end subroutine - -subroutine SeaSt_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(SeaSt_MiscVarType), intent(inout) :: MiscData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SeaSt_DestroyMisc' - ErrStat = ErrID_None - ErrMsg = '' - call GridInterp_DestroyMisc(MiscData%WaveField_m, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) -end subroutine - -subroutine SeaSt_PackMisc(RF, Indata) - type(RegFile), intent(inout) :: RF - type(SeaSt_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'SeaSt_PackMisc' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%Decimate) - call RegPack(RF, InData%LastOutTime) - call RegPack(RF, InData%LastIndWave) - call GridInterp_PackMisc(RF, InData%WaveField_m) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine SeaSt_UnPackMisc(RF, OutData) - type(RegFile), intent(inout) :: RF - type(SeaSt_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SeaSt_UnPackMisc' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%Decimate); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LastOutTime); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LastIndWave); if (RegCheckErr(RF, RoutineName)) return - call GridInterp_UnpackMisc(RF, OutData%WaveField_m) ! WaveField_m -end subroutine - -subroutine SeaSt_CopyJac_u_idxStarts(SrcJac_u_idxStartsData, DstJac_u_idxStartsData, CtrlCode, ErrStat, ErrMsg) - type(Jac_u_idxStarts), intent(in) :: SrcJac_u_idxStartsData - type(Jac_u_idxStarts), intent(inout) :: DstJac_u_idxStartsData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'SeaSt_CopyJac_u_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' - DstJac_u_idxStartsData%Extended = SrcJac_u_idxStartsData%Extended -end subroutine - -subroutine SeaSt_DestroyJac_u_idxStarts(Jac_u_idxStartsData, ErrStat, ErrMsg) - type(Jac_u_idxStarts), intent(inout) :: Jac_u_idxStartsData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'SeaSt_DestroyJac_u_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine SeaSt_PackJac_u_idxStarts(RF, Indata) - type(RegFile), intent(inout) :: RF - type(Jac_u_idxStarts), intent(in) :: InData - character(*), parameter :: RoutineName = 'SeaSt_PackJac_u_idxStarts' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%Extended) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine SeaSt_UnPackJac_u_idxStarts(RF, OutData) - type(RegFile), intent(inout) :: RF - type(Jac_u_idxStarts), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SeaSt_UnPackJac_u_idxStarts' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%Extended); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine SeaSt_CopyJac_y_idxStarts(SrcJac_y_idxStartsData, DstJac_y_idxStartsData, CtrlCode, ErrStat, ErrMsg) - type(Jac_y_idxStarts), intent(in) :: SrcJac_y_idxStartsData - type(Jac_y_idxStarts), intent(inout) :: DstJac_y_idxStartsData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'SeaSt_CopyJac_y_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' - DstJac_y_idxStartsData%Extended = SrcJac_y_idxStartsData%Extended - DstJac_y_idxStartsData%WrOuts = SrcJac_y_idxStartsData%WrOuts -end subroutine - -subroutine SeaSt_DestroyJac_y_idxStarts(Jac_y_idxStartsData, ErrStat, ErrMsg) - type(Jac_y_idxStarts), intent(inout) :: Jac_y_idxStartsData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'SeaSt_DestroyJac_y_idxStarts' - ErrStat = ErrID_None - ErrMsg = '' -end subroutine - -subroutine SeaSt_PackJac_y_idxStarts(RF, Indata) - type(RegFile), intent(inout) :: RF - type(Jac_y_idxStarts), intent(in) :: InData - character(*), parameter :: RoutineName = 'SeaSt_PackJac_y_idxStarts' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%Extended) - call RegPack(RF, InData%WrOuts) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine SeaSt_UnPackJac_y_idxStarts(RF, OutData) - type(RegFile), intent(inout) :: RF - type(Jac_y_idxStarts), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SeaSt_UnPackJac_y_idxStarts' - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%Extended); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WrOuts); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine SeaSt_CopyLinParams(SrcLinParamsData, DstLinParamsData, CtrlCode, ErrStat, ErrMsg) - type(SeaSt_LinParams), intent(in) :: SrcLinParamsData - type(SeaSt_LinParams), intent(inout) :: DstLinParamsData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SeaSt_CopyLinParams' - ErrStat = ErrID_None - ErrMsg = '' - DstLinParamsData%NumExtendedInputs = SrcLinParamsData%NumExtendedInputs - DstLinParamsData%NumExtendedOutputs = SrcLinParamsData%NumExtendedOutputs - call SeaSt_CopyJac_u_idxStarts(SrcLinParamsData%Jac_u_idxStartList, DstLinParamsData%Jac_u_idxStartList, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - call SeaSt_CopyJac_y_idxStarts(SrcLinParamsData%Jac_y_idxStartList, DstLinParamsData%Jac_y_idxStartList, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcLinParamsData%du)) then - LB(1:1) = lbound(SrcLinParamsData%du) - UB(1:1) = ubound(SrcLinParamsData%du) - if (.not. allocated(DstLinParamsData%du)) then - allocate(DstLinParamsData%du(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstLinParamsData%du.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstLinParamsData%du = SrcLinParamsData%du - end if - DstLinParamsData%Jac_nu = SrcLinParamsData%Jac_nu - DstLinParamsData%Jac_ny = SrcLinParamsData%Jac_ny -end subroutine - -subroutine SeaSt_DestroyLinParams(LinParamsData, ErrStat, ErrMsg) - type(SeaSt_LinParams), intent(inout) :: LinParamsData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SeaSt_DestroyLinParams' - ErrStat = ErrID_None - ErrMsg = '' - call SeaSt_DestroyJac_u_idxStarts(LinParamsData%Jac_u_idxStartList, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call SeaSt_DestroyJac_y_idxStarts(LinParamsData%Jac_y_idxStartList, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(LinParamsData%du)) then - deallocate(LinParamsData%du) - end if -end subroutine - -subroutine SeaSt_PackLinParams(RF, Indata) - type(RegFile), intent(inout) :: RF - type(SeaSt_LinParams), intent(in) :: InData - character(*), parameter :: RoutineName = 'SeaSt_PackLinParams' - if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%NumExtendedInputs) - call RegPack(RF, InData%NumExtendedOutputs) - call SeaSt_PackJac_u_idxStarts(RF, InData%Jac_u_idxStartList) - call SeaSt_PackJac_y_idxStarts(RF, InData%Jac_y_idxStartList) - call RegPackAlloc(RF, InData%du) - call RegPack(RF, InData%Jac_nu) - call RegPack(RF, InData%Jac_ny) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine SeaSt_UnPackLinParams(RF, OutData) - type(RegFile), intent(inout) :: RF - type(SeaSt_LinParams), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SeaSt_UnPackLinParams' - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%NumExtendedInputs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumExtendedOutputs); if (RegCheckErr(RF, RoutineName)) return - call SeaSt_UnpackJac_u_idxStarts(RF, OutData%Jac_u_idxStartList) ! Jac_u_idxStartList - call SeaSt_UnpackJac_y_idxStarts(RF, OutData%Jac_y_idxStartList) ! Jac_y_idxStartList - call RegUnpackAlloc(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_nu); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return -end subroutine - subroutine SeaSt_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) type(SeaSt_ParameterType), intent(in) :: SrcParamData type(SeaSt_ParameterType), intent(inout) :: DstParamData @@ -1310,9 +1045,6 @@ subroutine SeaSt_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end if - call SeaSt_CopyLinParams(SrcParamData%LinParams, DstParamData%LinParams, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return end subroutine subroutine SeaSt_DestroyParam(ParamData, ErrStat, ErrMsg) @@ -1356,8 +1088,6 @@ subroutine SeaSt_DestroyParam(ParamData, ErrStat, ErrMsg) deallocate(ParamData%WaveField) ParamData%WaveField => null() end if - call SeaSt_DestroyLinParams(ParamData%LinParams, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine SeaSt_PackParam(RF, Indata) @@ -1402,7 +1132,6 @@ subroutine SeaSt_PackParam(RF, Indata) call SeaSt_WaveField_PackSeaSt_WaveFieldType(RF, InData%WaveField) end if end if - call SeaSt_PackLinParams(RF, InData%LinParams) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1466,7 +1195,6 @@ subroutine SeaSt_UnPackParam(RF, OutData) else OutData%WaveField => null() end if - call SeaSt_UnpackLinParams(RF, OutData%LinParams) ! LinParams end subroutine subroutine SeaSt_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) @@ -1563,5 +1291,296 @@ subroutine SeaSt_UnPackOutput(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return end subroutine + +subroutine SeaSt_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(SeaSt_MiscVarType), intent(in) :: SrcMiscData + type(SeaSt_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SeaSt_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + DstMiscData%Decimate = SrcMiscData%Decimate + DstMiscData%LastOutTime = SrcMiscData%LastOutTime + DstMiscData%LastIndWave = SrcMiscData%LastIndWave + call GridInterp_CopyMisc(SrcMiscData%WaveField_m, DstMiscData%WaveField_m, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SeaSt_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine SeaSt_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(SeaSt_MiscVarType), intent(inout) :: MiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SeaSt_DestroyMisc' + ErrStat = ErrID_None + ErrMsg = '' + call GridInterp_DestroyMisc(MiscData%WaveField_m, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SeaSt_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine SeaSt_PackMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SeaSt_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SeaSt_PackMisc' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%Decimate) + call RegPack(RF, InData%LastOutTime) + call RegPack(RF, InData%LastIndWave) + call GridInterp_PackMisc(RF, InData%WaveField_m) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call SeaSt_PackInput(RF, InData%u_perturb) + call SeaSt_PackOutput(RF, InData%y_lin) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SeaSt_UnPackMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SeaSt_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SeaSt_UnPackMisc' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%Decimate); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LastOutTime); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LastIndWave); if (RegCheckErr(RF, RoutineName)) return + call GridInterp_UnpackMisc(RF, OutData%WaveField_m) ! WaveField_m + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call SeaSt_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call SeaSt_UnpackOutput(RF, OutData%y_lin) ! y_lin +end subroutine + +function SeaSt_InputMeshPointer(u, DL) result(Mesh) + type(SeaSt_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function SeaSt_OutputMeshPointer(y, DL) result(Mesh) + type(SeaSt_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine SeaSt_VarsPackContState(Vars, x, ValAry) + type(SeaSt_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SeaSt_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SeaSt_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SeaSt_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SeaSt_x_UnusedStates) + VarVals(1) = x%UnusedStates ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SeaSt_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SeaSt_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SeaSt_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine SeaSt_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SeaSt_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SeaSt_x_UnusedStates) + x%UnusedStates = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function SeaSt_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SeaSt_x_UnusedStates) + Name = "x%UnusedStates" + case default + Name = "Unknown Field" + end select +end function + +subroutine SeaSt_VarsPackContStateDeriv(Vars, x, ValAry) + type(SeaSt_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SeaSt_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SeaSt_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SeaSt_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SeaSt_x_UnusedStates) + VarVals(1) = x%UnusedStates ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SeaSt_VarsPackInput(Vars, u, ValAry) + type(SeaSt_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SeaSt_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine SeaSt_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(SeaSt_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SeaSt_u_DummyInput) + VarVals(1) = u%DummyInput ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SeaSt_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SeaSt_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SeaSt_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine SeaSt_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SeaSt_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SeaSt_u_DummyInput) + u%DummyInput = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function SeaSt_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SeaSt_u_DummyInput) + Name = "u%DummyInput" + case default + Name = "Unknown Field" + end select +end function + +subroutine SeaSt_VarsPackOutput(Vars, y, ValAry) + type(SeaSt_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SeaSt_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine SeaSt_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(SeaSt_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SeaSt_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SeaSt_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SeaSt_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SeaSt_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine SeaSt_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SeaSt_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SeaSt_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SeaSt_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SeaSt_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE SeaState_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/Waves.f90 b/modules/seastate/src/Waves.f90 index f4580fa0f7..a965549971 100644 --- a/modules/seastate/src/Waves.f90 +++ b/modules/seastate/src/Waves.f90 @@ -291,6 +291,79 @@ SUBROUTINE UserWaveSpctrm ( Omega, WaveDir, DirRoot, WaveS1Sdd ) RETURN END SUBROUTINE UserWaveSpctrm + + + SUBROUTINE WaveDispRel ( Omega, g, h, CurrVw0, OmegaCrit, Omega_i_Crit, Omega_i, k, ErrStat, ErrMsg ) + + IMPLICIT NONE + + ! Passed Variables: + + REAL(ReKi), INTENT(IN ) :: g ! Gravitational acceleration (m/s^2) + REAL(ReKi), INTENT(IN ) :: h ! Water depth (meters) + REAL(SiKi), INTENT(IN ) :: Omega ! Absolute wave frequency (rad/s) + REAL(SiKi), INTENT(IN ) :: OmegaCrit ! Critical absolute wave frequency (rad/s) + REAL(SiKi), INTENT(IN ) :: Omega_i_Crit ! Critical intrinsic wave frequency (rad/s) + REAL(ReKi), INTENT(IN ) :: CurrVw0 ! Current velocity projected onto the mean wave direction (m/s) + REAL(SiKi), INTENT( OUT) :: Omega_i ! Intrinsic wave frequency (rad/s) + REAL(SiKi), INTENT( OUT) :: k ! Wave number (1/m) + INTEGER(IntKi),INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + ! Local variables + + REAL(SiKi) :: kh ! Depth normalized wave number + REAL(SiKi) :: Vg ! Group velocity + REAL(SiKi) :: F + REAL(SiKi) :: FPrime + INTEGER(IntKi) :: i + LOGICAL :: tolMet = .TRUE. + + INTEGER(IntKi), PARAMETER :: maxIter = 20 + REAL(SiKi), PARAMETER :: tol = 1.0E-5 + CHARACTER(*), PARAMETER :: RoutineName = 'WaveDispRel' + + ErrStat = ErrID_None + ErrMsg = "" + + IF ( CurrVw0 < 0.0_ReKi .and. Omega > OmegaCrit ) THEN ! No solution + k = -1.0_SiKi + Omega_i = -1.0_SiKi + RETURN + END IF + + ! Initial guess + omega_i = omega + + DO i = 1,maxIter + if ( CurrVw0 < 0.0_ReKi .and. omega_i >= omega_i_crit ) then + omega_i = omega_i_crit - tol + end if + if ( omega_i < 0.0_SiKi ) then + omega_i = 0.0_SiKi + end if + k = WaveNumber ( omega_i, g, h ) + F = omega - omega_i - CurrVw0 * k + IF ( ABS(F) < tol ) THEN + tolMet = .TRUE. + EXIT + ELSE + kh = k * h + Vg = 0.5_SiKi * (omega_i/k) * ( 1.0_SiKi + 2.0_SiKi * kh / sinh(2.0*kh) ) + FPrime = - CurrVw0/Vg - 1.0_SiKi + IF ( FPrime == 0.0_SiKi) EXIT + omega_i = omega_i - F/FPrime + END IF + END DO + IF ( .NOT. tolMet ) THEN + k = WaveNumber ( omega_i, g, h ) + CALL SetErrStat(ErrID_Warn,' Failed to converge. ',ErrStat,ErrMsg,RoutineName) + CALL WrScr('[WARNING] SeaState dispersion relation solver did not reach the predefined tolerance within the maximum allowed number of iterations. The problematic wave (absolute) frequency is '//TRIM(Num2LStr(omega))//' rad/s.') + END IF + + END SUBROUTINE WaveDispRel + + !======================================================================= FUNCTION WaveNumber ( Omega, g, h ) @@ -629,7 +702,7 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None ! Local Variables - COMPLEX(SiKi) :: ImagOmega ! = ImagNmbr*Omega (rad/s) + COMPLEX(SiKi) :: ImagOmegaI ! = ImagNmbr*OmegaI (rad/s) COMPLEX(SiKi), ALLOCATABLE :: PWaveAccC0HxiPz0(:,:) ! Partial derivative of WaveAccC0Hxi(:) with respect to zi at zi = 0 (1/s^2) COMPLEX(SiKi), ALLOCATABLE :: PWaveAccC0HyiPz0(:,:) ! Partial derivative of WaveAccC0Hyi(:) with respect to zi at zi = 0 (1/s^2) COMPLEX(SiKi), ALLOCATABLE :: PWaveAccC0VPz0(:,:) ! Partial derivative of WaveAccC0V (:) with respect to zi at zi = 0 (1/s^2) @@ -668,6 +741,7 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) COMPLEX(SiKi) :: WaveElevxiPrime0 REAL(SiKi), ALLOCATABLE :: WaveKinzi0Prime(:) ! zi-coordinates for points where the incident wave kinematics will be computed before applying stretching; these are relative to the mean see level (meters) INTEGER , ALLOCATABLE :: WaveKinPrimeMap(:) + REAL(SiKi) :: OmegaI ! Wave intrinsic frequency (rad/sec) REAL(SiKi) :: WaveNmbr ! Wavenumber of the current frequency component (1/meter) REAL(SiKi), ALLOCATABLE :: WaveVel0Hxi (:,:) ! Instantaneous xi-direction velocity of incident waves before applying stretching at the zi-coordinates for points (m/s ) REAL(SiKi), ALLOCATABLE :: WaveVel0Hyi (:,:) ! Instantaneous yi-direction velocity of incident waves before applying stretching at the zi-coordinates for points (m/s ) @@ -700,7 +774,13 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) REAL(SiKi), ALLOCATABLE :: PWaveAcc0HxiMCFPz0(:,:) ! Discrete Fourier transform of the instantaneous horizontal acceleration in x-direction of incident waves before applying stretching at the zi-coordinates for points (m/s^2) REAL(SiKi), ALLOCATABLE :: PWaveAcc0HyiMCFPz0(:,:) ! Discrete Fourier transform of the instantaneous horizontal acceleration in y-direction of incident waves before applying stretching at the zi-coordinates for points (m/s^2) REAL(SiKi), ALLOCATABLE :: PWaveAcc0VMCFPz0(:,:) ! Discrete Fourier transform of the instantaneous vertical acceleration of incident waves before applying stretching at the zi-coordinates for points (m/s^2) - + + + REAL(ReKi) :: CurrVw0 ! Projection of MSL current velocity on to the mean wave direction + REAL(SiKi) :: CurrV0 ! Magnitude of MSL current velocity + REAL(SiKi) :: OmegaCrit ! Critial absolute wave angular frequency at which wave energy cannot propagate + REAL(SiKi) :: Omega_i_Crit ! Critial intrinsic wave angular frequency at which wave energy cannot propagate + LOGICAL :: bFirstNonzeroWaveComponent ! Variables for error handling INTEGER(IntKi) :: ErrStatTmp !< Temporary error status @@ -772,8 +852,52 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) ! WaveDOmega = 2*Pi/(NStepWave*WaveDT) ! = 2*Pi/WaveTMax + ! Determine the critical wave frequencies at which wave energy can no longer propogate against an opposing current + ! Note that OmegaCrit and Omega_i_Crit will be -1 if no current or aligned waves and current + IF ( WaveField%WvCrntMod /= WvCrntMod_Superpose ) THEN + IF ( WaveField%WaveMod == WaveMod_UserFreq .or. WaveField%WaveMod == WaveMod_UserSpctrm) THEN ! Need to determine wave heading and check for multidirectional waves based on components + bFirstNonzeroWaveComponent = .true. + DO I = 0,WaveField%NStepWave2 + IF ( .not. EqualRealNos(WaveField%WaveElevC0(1,I),0.0_SiKi) .or. .not. EqualRealNos(WaveField%WaveElevC0(2,I),0.0_SiKi) ) THEN + IF ( bFirstNonzeroWaveComponent ) THEN + WaveField%WaveDir = WaveField%WaveDirArr(I) + bFirstNonzeroWaveComponent = .false. + ELSE + IF ( .not. EqualRealNos( WaveField%WaveDir, WaveField%WaveDirArr(I) ) ) then ! Multidirectional waves + CALL SetErrStat(ErrID_Fatal,' Multidirectional waves are not supported with WvCrntMod = 1 or 2. Set WvCrntMod to 0. ',ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + END IF + END IF + END IF + END DO + ELSE ! Can check for multidirectional waves based on input settings + IF ( WaveField%WaveMultiDir ) THEN + CALL SetErrStat( ErrID_Fatal,'Multidirectional waves are not supported with WvCrntMod = 1 or 2. Set WvCrntMod to 0.',ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + END IF + END IF + CurrVw0 = InitInp%CurrVxi0 * COS( D2R*WaveField%WaveDir ) + InitInp%CurrVyi0 * SIN( D2R*WaveField%WaveDir ) + ELSE + CurrVw0 = 0.0_ReKi + ENDIF + CurrV0 = SQRT( InitInp%CurrVxi0**2 + InitInp%CurrVyi0**2 ) + IF ( WaveField%WvCrntMod == WvCrntMod_Full .and. CurrV0 > 0.0_ReKi ) THEN ! Check if waves and current are colinear + IF ( ABS( CurrVw0/CurrV0 ) < COS( D2R*10.0 ) ) THEN + CALL SetErrStat(ErrID_Fatal,' Waves and current must be colinear (aligned or opposing) when WvCrntMod = 2. Set WvCrntMod to 0 or 1. ',ErrStat,ErrMsg,RoutineName) + CALL CleanUp() + RETURN + END IF + END IF + CALL GetOmegaCritical( CurrVw0, InitInp%Gravity, WaveField%EffWtrDpth, OmegaCrit, Omega_i_Crit, ErrStatTmp, ErrMsgTmp ) + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF ! Set new value for NStepWave so that the FFT algorithms are efficient. Note that if this method is changed, the method ! used to calculate the number of multidirectional wave directions (WaveNDir) and the UserWaveElevations_Init subroutine @@ -884,6 +1008,11 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) call Get_1Spsd_and_WaveElevC0(InitInp, InitOut, WaveField, OmegaArr, WaveS1SddArr) + IF ( WaveField%WvCrntMod == WvCrntMod_Full ) THEN + ! Scale wave spectrum and wave amplitudes to account for wave-current interaction + ! Valid for colinear waves and current in deepwater only + call WaveCurrentInteraction(CurrVw0, InitInp%Gravity, WaveField, OmegaArr, WaveS1SddArr) + END IF !> # Multi Directional Waves call CalculateWaveDirection(InitInp, InitOut, WaveField, ErrStatTmp, ErrMsgTmp); if (Failed()) return; @@ -912,7 +1041,7 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) ! Only do this if WaveMod = 2 (JONSWAP/Pierson-Moskowitz Spectrum) and ConstWaveMod /= ConstWaveMod_None IF ( WaveField%WaveMod == WaveMod_JONSWAP .AND. InitInp%ConstWaveMod /= ConstWaveMod_None ) THEN ! adjust InitOut%WaveElevC0 for constrained wave: - call ConstrainedNewWaves(InitInp, InitOut, WaveField, OmegaArr, WaveS1SddArr, CosWaveDir, SinWaveDir, FFT_Data, ErrStatTmp, ErrMsgTmp) + call ConstrainedNewWaves(InitInp, InitOut, WaveField, OmegaArr, WaveS1SddArr, CosWaveDir, SinWaveDir, CurrVw0, OmegaCrit, Omega_I_Crit, FFT_Data, ErrStatTmp, ErrMsgTmp) call SetErrStat(ErrStatTmp,ErrMsgTmp, ErrStat,ErrMsg,RoutineName) if (ErrStat >= AbortErrLev) then call cleanup() @@ -936,8 +1065,13 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) tmpComplex = CMPLX( WaveField%WaveElevC0(1,I), WaveField%WaveElevC0(2,I)) ! some redundant calculations with later, but insignificant - WaveNmbr = WaveNumber ( OmegaArr(I), InitInp%Gravity, WaveField%EffWtrDpth ) - + CALL WaveDispRel ( OmegaArr(I), InitInp%Gravity, WaveField%EffWtrDpth, CurrVw0, OmegaCrit, Omega_i_Crit, OmegaI, WaveNmbr, ErrStatTmp, ErrMsgTmp ) + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + ! apply the phase shift tmpComplex = tmpComplex * EXP( -ImagNmbr*WaveNmbr*( InitInp%PtfmLocationX*CosWaveDir(I) + InitInp%PtfmLocationY*SinWaveDir(I) )) @@ -959,11 +1093,17 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) ! Set tmpComplex to the Ith element of the WAveElevC0 array tmpComplex = CMPLX( WaveField%WaveElevC0(1,I), WaveField%WaveElevC0(2,I)) - ! Compute the frequency of this component and its imaginary value: - ImagOmega = ImagNmbr*OmegaArr(I) - ! Compute the wavenumber: - WaveNmbr = WaveNumber ( OmegaArr(I), InitInp%Gravity, WaveField%EffWtrDpth ) + CALL WaveDispRel ( OmegaArr(I), InitInp%Gravity, WaveField%EffWtrDpth, CurrVw0, OmegaCrit, Omega_i_Crit, OmegaI, WaveNmbr, ErrStatTmp, ErrMsgTmp ) + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + IF (OmegaI < 0.0_SiKi) EXIT + + ! Compute the frequency of this component and its imaginary value: + ImagOmegaI = ImagNmbr*OmegaI ! Wavenumber-dependent acceleration scaling for MacCamy-Fuchs model MCFC = 0.0_ReKi @@ -986,14 +1126,14 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) WaveDynPC0 (I,J) = WaveField%RhoXg*tmpComplex*WaveElevxiPrime0 * COSHNumOvrCOSHDen ( WaveNmbr, WaveField%EffWtrDpth, WaveKinzi0Prime(J) ) - WaveVelC0Hxi (I,J) = CosWaveDir(I)*OmegaArr(I)*tmpComplex* WaveElevxiPrime0 * COSHNumOvrSINHDen ( WaveNmbr, WaveField%EffWtrDpth, WaveKinzi0Prime(J) ) - WaveVelC0Hyi (I,J) = SinWaveDir(I)*OmegaArr(I)*tmpComplex* WaveElevxiPrime0 * COSHNumOvrSINHDen ( WaveNmbr, WaveField%EffWtrDpth, WaveKinzi0Prime(J) ) + WaveVelC0Hxi (I,J) = CosWaveDir(I)*OmegaI*tmpComplex* WaveElevxiPrime0 * COSHNumOvrSINHDen ( WaveNmbr, WaveField%EffWtrDpth, WaveKinzi0Prime(J) ) + WaveVelC0Hyi (I,J) = SinWaveDir(I)*OmegaI*tmpComplex* WaveElevxiPrime0 * COSHNumOvrSINHDen ( WaveNmbr, WaveField%EffWtrDpth, WaveKinzi0Prime(J) ) - WaveVelC0V (I,J) = ImagOmega*tmpComplex* WaveElevxiPrime0 * SINHNumOvrSINHDen ( WaveNmbr, WaveField%EffWtrDpth, WaveKinzi0Prime(J) ) - WaveAccC0Hxi (I,J) = ImagOmega* WaveVelC0Hxi (I,J) + WaveVelC0V (I,J) = ImagOmegaI*tmpComplex* WaveElevxiPrime0 * SINHNumOvrSINHDen ( WaveNmbr, WaveField%EffWtrDpth, WaveKinzi0Prime(J) ) + WaveAccC0Hxi (I,J) = ImagOmegaI* WaveVelC0Hxi (I,J) - WaveAccC0Hyi (I,J) = ImagOmega* WaveVelC0Hyi (I,J) - WaveAccC0V (I,J) = ImagOmega* WaveVelC0V (I,J) + WaveAccC0Hyi (I,J) = ImagOmegaI* WaveVelC0Hyi (I,J) + WaveAccC0V (I,J) = ImagOmegaI* WaveVelC0V (I,J) IF (WaveField%MCFD > 0.0_SiKi) THEN WaveAccC0HxiMCF(I,J) = WaveAccC0Hxi(I,J) * MCFC @@ -1008,18 +1148,18 @@ SUBROUTINE VariousWaves_Init ( InitInp, InitOut, WaveField, ErrStat, ErrMsg ) InitInp%WaveKinGridyi(J)*SinWaveDir(I) )) ! Partial derivatives at zi = 0 PWaveDynPC0BPz0 (I,J) = WaveField%RhoXg* tmpComplex*WaveElevxiPrime0*WaveNmbr*TANH ( WaveNmbr*WaveField%EffWtrDpth ) - PWaveVelC0HxiPz0(I,J) = CosWaveDir(I)*OmegaArr(I)*tmpComplex*WaveElevxiPrime0*WaveNmbr - PWaveVelC0HyiPz0(I,J) = SinWaveDir(I)*OmegaArr(I)*tmpComplex*WaveElevxiPrime0*WaveNmbr + PWaveVelC0HxiPz0(I,J) = CosWaveDir(I)*OmegaI*tmpComplex*WaveElevxiPrime0*WaveNmbr + PWaveVelC0HyiPz0(I,J) = SinWaveDir(I)*OmegaI*tmpComplex*WaveElevxiPrime0*WaveNmbr IF (I == 0_IntKi) THEN ! Zero frequency component - Need to avoid division by zero. PWaveVelC0VPz0 (I,J) = 0.0_ReKi ELSE - PWaveVelC0VPz0 (I,J) = ImagOmega*tmpComplex*WaveElevxiPrime0*WaveNmbr/TANH ( WaveNmbr*WaveField%EffWtrDpth ) + PWaveVelC0VPz0 (I,J) = ImagOmegaI*tmpComplex*WaveElevxiPrime0*WaveNmbr/TANH ( WaveNmbr*WaveField%EffWtrDpth ) END IF - PWaveAccC0HxiPz0(I,J) = ImagOmega*PWaveVelC0HxiPz0(I,J) - PWaveAccC0HyiPz0(I,J) = ImagOmega*PWaveVelC0HyiPz0(I,J) - PWaveAccC0VPz0 (I,J) = ImagOmega*PWaveVelC0VPz0 (I,J) + PWaveAccC0HxiPz0(I,J) = ImagOmegaI*PWaveVelC0HxiPz0(I,J) + PWaveAccC0HyiPz0(I,J) = ImagOmegaI*PWaveVelC0HyiPz0(I,J) + PWaveAccC0VPz0 (I,J) = ImagOmegaI*PWaveVelC0VPz0 (I,J) IF (WaveField%MCFD > 0.0_SiKi) THEN @@ -1348,7 +1488,14 @@ SUBROUTINE WaveElevTimeSeriesAtXY(Xcoord,Ycoord, WaveElevAtXY, WaveElevCAtXY, tm ! Loop through the positive frequency components (including zero). DO I = 0,WaveField%NStepWave2 - WaveNmbr = WaveNumber ( OmegaArr(I), InitInp%Gravity, WaveField%EffWtrDpth ) + CALL WaveDispRel ( OmegaArr(I), InitInp%Gravity, WaveField%EffWtrDpth, CurrVw0, OmegaCrit, Omega_i_Crit, OmegaI, WaveNmbr, ErrStatTmp, ErrMsgTmp ) + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + CALL CleanUp() + RETURN + END IF + IF (OmegaI < 0.0_SiKi) EXIT + tmpComplexArr(I) = CMPLX( WaveField%WaveElevC0(1,I), WaveField%WaveElevC0(2,I)) * & EXP( -ImagNmbr*WaveNmbr*( Xcoord*CosWaveDir(I)+ & Ycoord*SinWaveDir(I) ) ) @@ -1365,6 +1512,71 @@ SUBROUTINE WaveElevTimeSeriesAtXY(Xcoord,Ycoord, WaveElevAtXY, WaveElevCAtXY, tm END SUBROUTINE WaveElevTimeSeriesAtXY +!-------------------------------------------------------------------------------- + SUBROUTINE GetOmegaCritical( CurrVw0, Gravity, EffWtrDpth, Omega_Critical, Omega_i_Critical, ErrStat, ErrMsg ) + ! This subroutine solves for the absolute and intrinsic critical wave frequencies + ! at which wave energy can no longer propagate against the current + + ! Passed Variables: + REAL(ReKi), INTENT(IN ) :: CurrVw0 + REAL(ReKi), INTENT(IN ) :: EffWtrDpth + REAL(ReKi), INTENT(IN ) :: Gravity + REAL(SiKi), INTENT( OUT) :: Omega_Critical + REAL(SiKi), INTENT( OUT) :: Omega_i_Critical + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + ! Local Variables: + REAL(ReKi) :: x ! = k*h unknown to solve + REAL(ReKi) :: k ! wave number + REAL(ReKi) :: c + REAL(ReKi) :: F + REAL(ReKi) :: FPrime + + LOGICAL :: tolMet = .FALSE. + INTEGER(IntKi) :: i + INTEGER(IntKi), PARAMETER :: maxIter = 20 + REAL(ReKi), PARAMETER :: tol = 1.0E-5 + + ! Error handling + CHARACTER(*), PARAMETER :: RoutineName = 'GetOmegaCritical' + ErrStat = ErrID_None + ErrMsg = "" + + IF (CurrVw0 >= 0.0_ReKi) THEN ! Aligned waves and current, no Omega_Critical + Omega_Critical = -1.0_SiKi + RETURN + END IF + + c = 2.0_ReKi * CurrVw0 / SQRT( Gravity * EffWtrDpth ) + IF ( c < -2.0_ReKi ) THEN + CALL SetErrStat(ErrID_Fatal,' Current opposing the waves is too fast; waves cannot propagate. ',ErrStat,ErrMsg,RoutineName) + RETURN + END IF + + ! Solve for Omega_Critical using Newton-Raphson method + x = InitInp%Gravity * WaveField%EffWtrDpth / ( 4.0_ReKi * CurrVw0 * CurrVw0 ) ! Initial guess based on deepwater limit + DO i = 1,maxIter + F = c + SQRT( tanh(x) / x ) * ( 1.0_ReKi + 2.0_ReKi * x / sinh( 2.0_ReKi * x ) ) + IF ( ABS(F) < tol ) THEN + tolMet = .TRUE. + EXIT + ELSE + FPrime = 1.0_ReKi/sinh(x) * (1.0_ReKi/cosh(x))**3 * ( 8.0_ReKi*x**2 - cosh(4.0_ReKi*x) + 8.0_ReKi*x*(sinh(2.0_ReKi*x)-2.0_ReKi*x*cosh(2.0_ReKi*x)) + 1.0_ReKi )/( 16.0_ReKi*SQRT(x**3*tanh(x)) ) + IF ( FPrime == 0.0_ReKi ) EXIT + x = x - F/FPrime + END IF + END DO + IF ( .NOT. tolMet ) THEN + CALL SetErrStat(ErrID_Warn,' Failed to converge. ',ErrStat,ErrMsg,RoutineName) + END IF + + k = x / EffWtrDpth + Omega_i_Critical = REAL( SQRT( Gravity * k * tanh( x ) ) , SiKi ) + Omega_Critical = Omega_i_Critical + REAL( k * CurrVw0 , SiKi ) + + END SUBROUTINE GetOmegaCritical + !-------------------------------------------------------------------------------- SUBROUTINE CleanUp( ) @@ -2159,8 +2371,37 @@ SUBROUTINE Get_1Spsd_and_WaveElevC0(InitInp, InitOut, WaveField, OmegaArr, WaveS END SUBROUTINE Get_1Spsd_and_WaveElevC0 !------------------------------------------------------------------------------------------------------------------------ +SUBROUTINE WaveCurrentInteraction(CurrVw0, Gravity, WaveField, OmegaArr, WaveS1SddArr) + REAL(ReKi), INTENT(IN ) :: CurrVw0 + REAL(ReKi), INTENT(IN ) :: Gravity + TYPE(SeaSt_WaveFieldType), INTENT(INOUT) :: WaveField + REAL(SiKi), INTENT(IN ) :: OmegaArr(0:WaveField%NStepWave2) !< Array of all non-negative angular frequencies (rad/s) + REAL(SiKi), INTENT(INOUT) :: WaveS1SddArr(0:WaveField%NStepWave2) !< One-sided power spectral density of the wave spectrum at all non-negative frequencies (m^2/(rad/s)) + + INTEGER(IntKi) :: I + REAL(SiKi) :: c0, c1, c2, Sc + + c0 = 4.0_SiKi * REAL( CurrVw0 / Gravity , SiKi ) + + DO I = 0,WaveField%NStepWave2 + + c1 = 1.0_SiKi + c0 * OmegaArr(I) + IF ( c1 <= 0.0_SiKi ) THEN + Sc = 0.0_SiKi + ELSE + c2 = SQRT( c1 ) + Sc = 4.0_SiKi / ( (1+c2)**2 * c2 ) + END IF + + WaveField%WaveElevC0(:,I) = SQRT( Sc ) * WaveField%WaveElevC0(:,I) + WaveS1SddArr(I) = Sc * WaveS1SddArr(I) + + END DO + +END SUBROUTINE WaveCurrentInteraction +!------------------------------------------------------------------------------------------------------------------------ !> update WaveField%WaveElevC0; call InitFFT before calling this routine! -SUBROUTINE ConstrainedNewWaves(InitInp, InitOut, WaveField, OmegaArr, WaveS1SddArr, CosWaveDir, SinWaveDir, FFT_Data, ErrStat, ErrMsg) +SUBROUTINE ConstrainedNewWaves(InitInp, InitOut, WaveField, OmegaArr, WaveS1SddArr, CosWaveDir, SinWaveDir, CurrVw0, OmegaCrit, Omega_I_Crit, FFT_Data, ErrStat, ErrMsg) TYPE(Waves_InitInputType), INTENT(IN ) :: InitInp ! Input data for initialization routine TYPE(Waves_InitOutputType), INTENT(INOUT) :: InitOut ! Output data @@ -2169,12 +2410,16 @@ SUBROUTINE ConstrainedNewWaves(InitInp, InitOut, WaveField, OmegaArr, WaveS1SddA REAL(SiKi), INTENT(IN ) :: WaveS1SddArr(0:WaveField%NStepWave2) !< One-sided power spectral density of the wave spectrum at all non-negative frequencies (m^2/(rad/s)) REAL(SiKi), INTENT(IN ) :: CosWaveDir(0:WaveField%NStepWave2) !< COS( WaveDirArr(I) ) -- Each wave frequency has a unique wave direction REAL(SiKi), INTENT(IN ) :: SinWaveDir(0:WaveField%NStepWave2) !< SIN( WaveDirArr(I) ) -- Each wave frequency has a unique wave direction + REAL(ReKi), INTENT(IN ) :: CurrVw0 !< Current velocity along the mean wave direction at MSL + REAL(SiKi), INTENT(IN ) :: OmegaCrit !< Critical absolute wave frequency (rad/s) + REAL(SiKi), INTENT(IN ) :: Omega_I_Crit !< Critical intrinsic wave frequency (rad/s) TYPE(FFT_DataType), INTENT(IN ) :: FFT_Data !< data for FFT computations, already initialized INTEGER(IntKi), INTENT( OUT) :: ErrStat !< error level/status CHARACTER(ErrMsgLen), INTENT( OUT) :: ErrMsg !< error message REAL(SiKi) :: WaveNmbr ! Wavenumber of the current frequency component (1/meter) + REAL(SiKi) :: OmegaI ! Intrinsic wave frequency (rad/s) INTEGER :: I ! Generic index ! Variables for constrained wave @@ -2199,7 +2444,7 @@ SUBROUTINE ConstrainedNewWaves(InitInp, InitOut, WaveField, OmegaArr, WaveS1SddA COMPLEX(SiKi) :: tmpComplex ! A temporary varible to hold the complex value of the wave elevation before storing it into a REAL array INTEGER(IntKi) :: ErrStatTmp !< error level/status -! CHARACTER(ErrMsgLen) :: ErrMsgTmp !< error message + CHARACTER(ErrMsgLen) :: ErrMsgTmp !< error message CHARACTER(*), PARAMETER :: RoutineName = 'ConstrainedNewWaves' @@ -2273,7 +2518,11 @@ SUBROUTINE ConstrainedNewWaves(InitInp, InitOut, WaveField, OmegaArr, WaveS1SddA ! Modify the wave phase so that the crest shows up at the right place and the right time DO I = 1,WaveField%NStepWave2-1 - WaveNmbr = WaveNumber ( OmegaArr(I), InitInp%Gravity, WaveField%EffWtrDpth ) + CALL WaveDispRel ( OmegaArr(I), InitInp%Gravity, WaveField%EffWtrDpth, CurrVw0, OmegaCrit, Omega_i_Crit, OmegaI, WaveNmbr, ErrStatTmp, ErrMsgTmp ) + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,RoutineName) + IF ( ErrStat >= AbortErrLev ) THEN + RETURN + END IF ConstWavePhase = WaveNmbr*(CosWaveDir(I)*InitInp%CrestXi + & SinWaveDir(I)*InitInp%CrestYi) - & OmegaArr(I)*InitInp%CrestTime diff --git a/modules/seastate/src/Waves.txt b/modules/seastate/src/Waves.txt index 262c5dc74c..a5660b73ce 100644 --- a/modules/seastate/src/Waves.txt +++ b/modules/seastate/src/Waves.txt @@ -40,6 +40,8 @@ typedef ^ ^ SiKi WaveKinGrid typedef ^ ^ SiKi WaveKinGridzi {:} - - "zi-coordinates for grid points where the incident wave kinematics will be computed (grid points); these are relative to the mean sea level" (meters) typedef ^ ^ SiKi CurrVxi {:} - - "xi-component of the current velocity at elevation i" (m/s) typedef ^ ^ SiKi CurrVyi {:} - - "yi-component of the current velocity at elevation i" (m/s) +typedef ^ ^ SiKi CurrVxi0 - - - "xi-component of the current velocity at MSL" (m/s) +typedef ^ ^ SiKi CurrVyi0 - - - "yi-component of the current velocity at MSL" (m/s) typedef ^ ^ SiKi PCurrVxiPz0 - - - "xi-component of the partial derivative of the current velocity at elevation near mean sea level" (m/s) typedef ^ ^ SiKi PCurrVyiPz0 - - - "yi-component of the partial derivative of the current velocity at elevation near mean sea level" (m/s) typedef ^ ^ NWTC_RandomNumber_ParameterType RNG - - - "Parameters for the pseudo random number generator" - diff --git a/modules/seastate/src/Waves2_Types.f90 b/modules/seastate/src/Waves2_Types.f90 index 02a2606df1..34e1bb24f2 100644 --- a/modules/seastate/src/Waves2_Types.f90 +++ b/modules/seastate/src/Waves2_Types.f90 @@ -56,7 +56,8 @@ MODULE Waves2_Types REAL(SiKi) , DIMENSION(:,:,:,:,:), ALLOCATABLE :: WaveVel2S !< Instantaneous 2nd-order sum frequency correction for the velocity of incident waves in the xi- (1), yi- (2), and zi- (3) directions, respectively, at each of the NWaveKinGrid points where the incident wave kinematics will be computed (The values include both the velocity of incident waves and the velocity of current.) [(m/s)] END TYPE Waves2_InitOutputType ! ======================= -CONTAINS + +contains subroutine Waves2_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(Waves2_InitInputType), intent(in) :: SrcInitInputData @@ -308,5 +309,7 @@ subroutine Waves2_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WaveVel2D); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WaveVel2S); if (RegCheckErr(RF, RoutineName)) return end subroutine + END MODULE Waves2_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/seastate/src/Waves_Types.f90 b/modules/seastate/src/Waves_Types.f90 index 0c3e3c9f99..dde08f29e3 100644 --- a/modules/seastate/src/Waves_Types.f90 +++ b/modules/seastate/src/Waves_Types.f90 @@ -57,6 +57,8 @@ MODULE Waves_Types REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: WaveKinGridzi !< zi-coordinates for grid points where the incident wave kinematics will be computed (grid points); these are relative to the mean sea level [(meters)] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: CurrVxi !< xi-component of the current velocity at elevation i [(m/s)] REAL(SiKi) , DIMENSION(:), ALLOCATABLE :: CurrVyi !< yi-component of the current velocity at elevation i [(m/s)] + REAL(SiKi) :: CurrVxi0 = 0.0_R4Ki !< xi-component of the current velocity at MSL [(m/s)] + REAL(SiKi) :: CurrVyi0 = 0.0_R4Ki !< yi-component of the current velocity at MSL [(m/s)] REAL(SiKi) :: PCurrVxiPz0 = 0.0_R4Ki !< xi-component of the partial derivative of the current velocity at elevation near mean sea level [(m/s)] REAL(SiKi) :: PCurrVyiPz0 = 0.0_R4Ki !< yi-component of the partial derivative of the current velocity at elevation near mean sea level [(m/s)] TYPE(NWTC_RandomNumber_ParameterType) :: RNG !< Parameters for the pseudo random number generator [-] @@ -76,7 +78,8 @@ MODULE Waves_Types REAL(DbKi) :: WaveTMax = 0.0_R8Ki !< Analysis time for incident wave calculations; the actual analysis time may be larger than this value in order for the maintain an effecient FFT [(sec)] END TYPE Waves_InitOutputType ! ======================= -CONTAINS + +contains subroutine Waves_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(Waves_InitInputType), intent(in) :: SrcInitInputData @@ -167,6 +170,8 @@ subroutine Waves_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, Err end if DstInitInputData%CurrVyi = SrcInitInputData%CurrVyi end if + DstInitInputData%CurrVxi0 = SrcInitInputData%CurrVxi0 + DstInitInputData%CurrVyi0 = SrcInitInputData%CurrVyi0 DstInitInputData%PCurrVxiPz0 = SrcInitInputData%PCurrVxiPz0 DstInitInputData%PCurrVyiPz0 = SrcInitInputData%PCurrVyiPz0 call NWTC_Library_CopyNWTC_RandomNumber_ParameterType(SrcInitInputData%RNG, DstInitInputData%RNG, CtrlCode, ErrStat2, ErrMsg2) @@ -237,6 +242,8 @@ subroutine Waves_PackInitInput(RF, Indata) call RegPackAlloc(RF, InData%WaveKinGridzi) call RegPackAlloc(RF, InData%CurrVxi) call RegPackAlloc(RF, InData%CurrVyi) + call RegPack(RF, InData%CurrVxi0) + call RegPack(RF, InData%CurrVyi0) call RegPack(RF, InData%PCurrVxiPz0) call RegPack(RF, InData%PCurrVyiPz0) call NWTC_Library_PackNWTC_RandomNumber_ParameterType(RF, InData%RNG) @@ -281,6 +288,8 @@ subroutine Waves_UnPackInitInput(RF, OutData) call RegUnpackAlloc(RF, OutData%WaveKinGridzi); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%CurrVxi); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%CurrVyi); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CurrVxi0); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CurrVyi0); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PCurrVxiPz0); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PCurrVyiPz0); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackNWTC_RandomNumber_ParameterType(RF, OutData%RNG) ! RNG @@ -334,5 +343,7 @@ subroutine Waves_UnPackInitOutput(RF, OutData) call RegUnpack(RF, OutData%WaveNDir); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WaveTMax); if (RegCheckErr(RF, RoutineName)) return end subroutine + END MODULE Waves_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/servodyn/src/ServoDyn.f90 b/modules/servodyn/src/ServoDyn.f90 index e88e37ee82..b1b5dc6fa8 100644 --- a/modules/servodyn/src/ServoDyn.f90 +++ b/modules/servodyn/src/ServoDyn.f90 @@ -48,12 +48,6 @@ MODULE ServoDyn LOGICAL, PARAMETER, PUBLIC :: Cmpl4LV = .FALSE. ! Is the module being compiled for Labview? #endif - - ! indices into linearization arrays - - INTEGER, PARAMETER, PUBLIC :: SrvD_Indx_Y_BlPitchCom(3) = (/1,2,3/) ! sometime remove this and calculate by p%NumBl (requires mods to FAST_Lin that I'm too lazy to deal with right now -- ADP) - - ! Parameters for type of control INTEGER(IntKi), PARAMETER :: ControlMode_NONE = 0 !< The (ServoDyn-universal) control code for not using a particular type of control @@ -92,7 +86,6 @@ MODULE ServoDyn PUBLIC :: SrvD_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- ! (Xd), and constraint-state (Z) equations all with respect to the constraint ! states (z) - PUBLIC :: SrvD_GetOP ! Routine to pack the operating point values (for linearization) into arrays CONTAINS @@ -136,6 +129,7 @@ SUBROUTINE SrvD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO INTEGER(IntKi) :: K ! loop counter INTEGER(IntKi) :: nPts ! number of linear wind-speed points INTEGER(IntKi) :: UnSum ! Summary file unit + LOGICAL :: Linearize INTEGER(IntKi) :: ErrStat2 ! temporary Error status of the operation CHARACTER(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None @@ -270,6 +264,10 @@ SUBROUTINE SrvD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO CALL AllocAry( m%xd_BlPitchFilter, p%NumBl, 'BlPitchFilter', ErrStat2, ErrMsg2 ) if (Failed()) return; m%xd_BlPitchFilter = p%BlPitchInit + + CALL AllocAry( m%xd_BlPRateFilter, p%NumBl, 'BlPRateFilter', ErrStat2, ErrMsg2 ) + if (Failed()) return; + m%xd_BlPitchFilter = 0.0_ReKi !....................... ! Other states for pitch maneuver @@ -312,6 +310,9 @@ SUBROUTINE SrvD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO CALL AllocAry( u%BlPitch, p%NumBl, 'BlPitch', ErrStat2, ErrMsg2 ) if (Failed()) return; + CALL AllocAry( u%BlPRate, p%NumBl, 'BlPRate', ErrStat2, ErrMsg2 ) + if (Failed()) return; + CALL AllocAry( u%ExternalBlPitchCom, p%NumBl, 'ExternalBlPitchCom', ErrStat2, ErrMsg2 ) if (Failed()) return; @@ -383,6 +384,15 @@ SUBROUTINE SrvD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO !............................................................................................ CALL AllocAry( y%BlPitchCom, p%NumBl, 'BlPitchCom', ErrStat2, ErrMsg2 ) if (Failed()) return; + y%BlPitchCom = InputFileData%PitNeut(1:p%NumBl) + + CALL AllocAry( y%BlPRateCom, p%NumBl, 'BlPRateCom', ErrStat2, ErrMsg2 ) + if (Failed()) return; + y%BlPRateCom = 0.0_ReKi + + CALL AllocAry( y%BlPitchMom, p%NumBl, 'BlPitchMom', ErrStat2, ErrMsg2 ) + if (Failed()) return; + y%BlPitchMom = 0.0_ReKi ! Commanded Airfoil UserProp for blade. Must be same units as given in AD15 airfoil tables ! This is passed to AD15 to be interpolated with the airfoil table userprop column @@ -510,9 +520,7 @@ SUBROUTINE SrvD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO p%TrimGain = InitInp%TrimGain p%RotSpeedRef = InitInp%RotSpeedRef - if (InitInp%Linearize) then - call SrvD_Init_Jacobian(InitInp, p, u, y, InitOut, ErrStat2, ErrMsg2); if(Failed()) return; - else + if (.not. InitInp%Linearize) then p%TrimCase = TrimCase_none end if @@ -553,6 +561,12 @@ SUBROUTINE SrvD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitO InitOut%CouplingScheme = ExplicitLoose END IF + !............................................................................................ + ! Initialize module variables + !............................................................................................ + Linearize = InitInp%Linearize .or. ((p%NumBStC + p%NumNStC + p%NumTStC + p%NumSStC) > 0) + call SrvD_InitVars( InitInp, u, p, x, y, m, InitOut, Linearize, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) !............................................................................................ ! Close summary file: @@ -583,517 +597,276 @@ subroutine Cleanup() ! Ignore any errors here end subroutine Cleanup END SUBROUTINE SrvD_Init -!---------------------------------------------------------------------------------------------------------------------------------- -!> Initialize everything needed for linearization -subroutine SrvD_Init_Jacobian( InitInp, p, u, y, InitOut, ErrStat, ErrMsg ) - type(SrvD_InitInputType), intent(in ) :: InitInp !< Input data for initialization routine - type(SrvD_ParameterType), intent(inout) :: p !< Parameters - type(SrvD_InputType), intent(in ) :: u !< An initial guess for the input; input mesh must be defined - type(SrvD_OutputType), intent(in ) :: y !< outputs - type(SrvD_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - - ! local variables: - character(*), parameter :: RoutineName = 'SrvD_Init_Jacobian' - integer(IntKi) :: ErrStat2 ! temporary Error status of the operation - character(ErrMsgLen) :: ErrMsg2 ! temporary Error message if ErrStat /= ErrID_None - real(ReKi) :: dx - real(R8Ki) :: du_t, du_r +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine initializes module variables for use by the solver and linearization. +subroutine SrvD_InitVars(InitInp, u, p, x, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(SrvD_InitInputType), intent(in) :: InitInp !< Initialization input + type(SrvD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(SrvD_ParameterType), intent(inout) :: p !< Parameters + type(SrvD_ContinuousStateType), intent(inout) :: x !< Continuous state + type(SrvD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(SrvD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SrvD_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SrvD_InitVars' + integer(IntKi) :: ErrStat2 ! Temporary Error status + character(ErrMsgLen) :: ErrMsg2 ! Temporary Error message + character(ChanLen) :: Desc + integer(IntKi) :: i, j, k + character(36), parameter :: StCLabels(*) = [& + ' local displacement state X m ', & + ' local displacement state dX/dt m/s', & + ' local displacement state Y m ', & + ' local displacement state dY/dt m/s', & + ' local displacement state Z m ', & + ' local displacement state dZ/dt m/s'] + integer(IntKi), parameter :: StCInds(*) = [1, 3, 5, 2, 4, 6] + real(R8Ki) :: xPerturb, uPerturbTrans, uPerturbAng, uPerturbs(6) ErrStat = ErrID_None - ErrMsg = "" + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + ! Calculate perturbations + xPerturb = 0.2_R8Ki*Pi/180.0_R8Ki * max(real(TwoNorm(InitInp%NacRefPos - InitInp%TwrBaseRefPos), R8Ki), 1.0_R8Ki) + + ! Blade Structural Controller + do j = 1, p%NumBStC + do i = 1, p%NumBl + Desc = 'Blade '//trim(Num2LStr(i))//' StC '//Num2LStr(j) + do k = 1, size(StCInds) + call MV_AddVar(InitOut%Vars%x, Desc, FieldScalar, DatLoc(SrvD_x_BStC_StC_x, j), & + iAry=StCInds(k), jAry=i, & + Flags=ior(VF_DerivOrder2,VF_RotFrame), & + LinNames=[trim(Desc)//StCLabels(StCInds(k))], & + Perturb=xPerturb) + end do + end do + end do - ! --- System dimension - ! rough estimate based on tower length - dx = 0.2_ReKi*Pi/180.0_ReKi * max(TwoNorm(InitInp%NacRefPos - InitInp%TwrBaseRefPos), 1.0_ReKi) - ! for translation inputs - du_t = 0.2_R8Ki*Pi_R8/180.0_R8Ki * max(real(TwoNorm(InitInp%NacRefPos - InitInp%TwrBaseRefPos),R8Ki), 1.0_R8Ki) - ! for rotation inputs - du_r = 0.2_R8Ki * Pi_R8 / 180.0_R8Ki + ! Nacelle Structural Controller + do j = 1, p%NumNStC + Desc = 'Nacelle StC '//Num2LStr(j) + do k = 1, size(StCInds) + call MV_AddVar(InitOut%Vars%x, Desc, FieldScalar, DatLoc(SrvD_x_NStC_StC_x, j), & + iAry=StCInds(k), jAry=1, & + Flags=VF_DerivOrder2, & + LinNames=[trim(Desc)//StCLabels(StCInds(k))], & + Perturb=xPerturb) + end do + enddo - ! initialize jacobian indices - call SrvD_Init_Jacobian_y(); if (ErrStat >= AbortErrLev) return; - call SrvD_Init_Jacobian_x(dx); if (ErrStat >= AbortErrLev) return; - call SrvD_Init_Jacobian_u(du_t,du_r); if (ErrStat >= AbortErrLev) return; + ! Tower Structural Controller + do j = 1, p%NumTStC + Desc = 'Tower StC '//Num2LStr(j) + do k = 1, size(StCInds) + call MV_AddVar(InitOut%Vars%x, Desc, FieldScalar, DatLoc(SrvD_x_TStC_StC_x, j), & + iAry=StCInds(k), jAry=1, & + Flags=VF_DerivOrder2, & + LinNames=[trim(Desc)//StCLabels(StCInds(k))], & + Perturb=xPerturb) + end do + enddo - ! To figure out what is going on, use this to print stuff to screen - !call CheckInfo() + ! Substructure Structural Controller + do j = 1, p%NumSStC + Desc = 'Substructure StC '//Num2LStr(j) + do k = 1, size(StCInds) + call MV_AddVar(InitOut%Vars%x, Desc, FieldScalar, DatLoc(SrvD_x_SStC_StC_x, j), & + iAry=StCInds(k), jAry=1, & + Flags=VF_DerivOrder2, & + LinNames=[trim(Desc)//StCLabels(StCInds(k))], & + Perturb=xPerturb) + end do + enddo -contains - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - end function Failed - !> This routine initializes the Jacobian parameters and - !! initialization outputs for the linearized outputs. - subroutine SrvD_Init_Jacobian_y() - integer(IntKi) :: i, j, index_next - ! determine how many outputs there are in the Jacobian - p%Jac_ny = 0 - - ! outputs always passed - p%Jac_ny = p%Jac_ny & - + size(y%BlPitchCom) & ! y%BlPitchCom(:) - + 1 & ! y%YawMom - + 1 & ! y%GenTrq - + 1 ! y%ElecPwr - - ! StC related outputs - p%Jac_ny = p%Jac_ny & - + p%NumBStC * 6 * p%NumBl & ! 3 Force, 3 Moment at each BStC instance on each blade - + p%NumNStC * 6 & ! 3 Force, 3 Moment at each NStC instance - + p%NumTStC * 6 & ! 3 Force, 3 Moment at each TStC instance - + p%NumSStC * 6 ! 3 Force, 3 Moment at each SStC instance - - ! User requested outputs - p%Jac_ny = p%Jac_ny & - + p%NumOuts ! user requested outputs - - !-------------------------------- - ! linearization output names - !-------------------------------- - call AllocAry(InitOut%LinNames_y, p%Jac_ny, 'LinNames_y', ErrStat2, ErrMsg2); if (Failed()) return; - call AllocAry(InitOut%RotFrame_y, p%Jac_ny, 'RotFrame_y', ErrStat2, ErrMsg2); if (Failed()) return; - InitOut%RotFrame_y = .false. ! Meshes are in global, not rotating frame - index_next = 1 ! Index counter initialize - - ! y%BlPitchCom -- NOTE: assumed order of these outputs - do i=1,size(y%BlPitchCom) - InitOut%LinNames_y(index_next) = 'BlPitchCom('//trim(num2lstr(i))//'), rad' - InitOut%RotFrame_y(index_next) = .true. - index_next = index_next + 1 + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + uPerturbTrans = 0.2_R8Ki*Pi_R8/180.0_R8Ki * max(real(TwoNorm(InitInp%NacRefPos - InitInp%TwrBaseRefPos),R8Ki), 1.0_R8Ki) + uPerturbAng = 0.2_R8Ki * Pi_R8 / 180.0_R8Ki + uPerturbs = [uPerturbTrans, uPerturbAng, uPerturbTrans, uPerturbAng, uPerturbTrans, uPerturbAng] + + call MV_AddVar(InitOut%Vars%u, "BlPitch", FieldScalar, & + DatLoc(SrvD_u_BlPitch), & + Flags=ior(VF_RotFrame, VF_2PI), & + Num=size(u%BlPitch), & + Perturb=uPerturbAng, & + LinNames=[('BlPitch('//trim(Num2LStr(i))//'), rad', i = 1, size(u%BlPitch))]) + + call MV_AddVar(InitOut%Vars%u, "BlPRate", FieldScalar, & + DatLoc(SrvD_u_BlPRate), & + Flags=VF_RotFrame, & + Num=size(u%BlPRate), & + Perturb=uPerturbAng, & + LinNames=[('BlPRate('//trim(Num2LStr(i))//'), rad/s', i = 1, size(u%BlPRate))]) + + call MV_AddVar(InitOut%Vars%u, "Yaw", FieldScalar, & + DatLoc(SrvD_u_Yaw), & + Flags=VF_2PI, & + Perturb=uPerturbAng, & + LinNames=['Yaw, rad']) + + call MV_AddVar(InitOut%Vars%u, "YawRate", FieldScalar, & + DatLoc(SrvD_u_YawRate), & + Perturb=uPerturbAng, & + LinNames=['YawRate, rad/s']) + + call MV_AddVar(InitOut%Vars%u, "HSS_Spd", FieldScalar, & + DatLoc(SrvD_u_HSS_Spd), & + Perturb=0.1_R8Ki, & + LinNames=['HSS_Spd, rad/s']) + + ! Structural controllers + do j = 1, p%NumBStC + do i = 1, p%NumBl + call MV_AddMeshVar(InitOut%Vars%u, 'Blade '//trim(Num2LStr(i))//' StC '//Num2LStr(j), MotionFields, & + DatLoc(SrvD_u_BStCMotionMesh, i, j), & + Mesh=u%BStCMotionMesh(i, j), & + Perturbs=uPerturbs) end do + end do - ! y%YawMom -- not in rotating frame - InitOut%LinNames_y(index_next) = 'YawMom, Nm'; index_next = index_next + 1 - - ! y%GenPwr -- not in rotating frame - InitOut%LinNames_y(index_next) = 'GenTrq, Nm'; index_next = index_next + 1 - - ! y%ElecPwr -- not in rotating frame - InitOut%LinNames_y(index_next) = 'ElecPwr, W'; index_next = index_next + 1 - - !-------------------------------- - ! StC related outputs - !-------------------------------- - CALL AllocAry(p%Jac_Idx_BStC_y, 2, p%NumBl, p%NumBStC, 'Jac_Idx_BStC_y', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_BStC_y = 0_IntKi - CALL AllocAry(p%Jac_Idx_NStC_y, 2, p%NumNStC, 'Jac_Idx_NStC_y', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_NStC_y = 0_IntKi - CALL AllocAry(p%Jac_Idx_TStC_y, 2, p%NumTStC, 'Jac_Idx_TStC_y', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_TStC_y = 0_IntKi - CALL AllocAry(p%Jac_Idx_SStC_y, 2, p%NumSStC, 'Jac_Idx_SStC_y', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_SStC_y = 0_IntKi - ! Blade - if (p%NumBStC > 0) then - do j=1,p%NumBStC - do i=1,p%NumBl - p%Jac_Idx_BStC_y(1,i,j) = index_next ! Start index of BStC in y - call PackLoadMesh_Names( y%BStCLoadMesh(i,j), 'Blade '//trim(num2lstr(i))//' StC '//trim(num2lstr(j)), InitOut%LinNames_y, index_next ) - p%Jac_Idx_BStC_y(2,i,j) = index_next-1 ! End index of BStC in y - enddo - enddo - endif - ! Nacelle - if (p%NumNStC > 0) then - do j=1,p%NumNStC - p%Jac_Idx_NStC_y(1,j) = index_next ! Start index of NStC in y - call PackLoadMesh_Names( y%NStCLoadMesh(j), 'Nacelle StC '//trim(num2lstr(j)), InitOut%LinNames_y, index_next ) - p%Jac_Idx_NStC_y(2,j) = index_next-1 ! End index of NStC in y - enddo - endif - ! Tower - if (p%NumTStC > 0) then - do j=1,p%NumTStC - p%Jac_Idx_TStC_y(1,j) = index_next ! Start index of TStC in y - call PackLoadMesh_Names( y%TStCLoadMesh(j), 'Tower StC '//trim(num2lstr(j)), InitOut%LinNames_y, index_next ) - p%Jac_Idx_TStC_y(2,j) = index_next-1 ! End index of TStC in y - enddo - endif - ! Sub-tructure - if (p%NumSStC > 0) then - do j=1,p%NumSStC - p%Jac_Idx_SStC_y(1,j) = index_next ! Start index of SStC in y - call PackLoadMesh_Names( y%SStCLoadMesh(j), 'Substructure StC '//trim(num2lstr(j)), InitOut%LinNames_y, index_next ) - p%Jac_Idx_SStC_y(2,j) = index_next-1 ! End index of SStC in y - enddo - endif + do j = 1, p%NumNStC + call MV_AddMeshVar(InitOut%Vars%u, 'Nacelle StC '//Num2LStr(j), MotionFields, & + DatLoc(SrvD_u_NStCMotionMesh, j), & + Mesh=u%NStCMotionMesh(j), & + Perturbs=uPerturbs) + enddo + + do j = 1, p%NumTStC + call MV_AddMeshVar(InitOut%Vars%u, 'Tower StC '//Num2LStr(j), MotionFields, & + DatLoc(SrvD_u_TStCMotionMesh, j), & + Mesh=u%TStCMotionMesh(j), & + Perturbs=uPerturbs) + enddo - !-------------------------------- - ! y%OutParam -- User requested outputs - ! Some outputs are in rotating frame - !-------------------------------- - do i=1,p%NumOuts - InitOut%LinNames_y(index_next) = trim(p%OutParam(i)%Name)//', '//p%OutParam(i)%Units - if (ANY( p%OutParam(i)%Indx == BlPitchC )) InitOut%RotFrame_y(index_next) = .true. ! WriteOutput BlPitch commands - ! Blade StC local output channels - if (ANY( p%OutParam(i)%Indx == BStC_XQ )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC X displacements - if (ANY( p%OutParam(i)%Indx == BStC_XQD )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC X displacement velocities - if (ANY( p%OutParam(i)%Indx == BStC_YQ )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC Y displacements - if (ANY( p%OutParam(i)%Indx == BStC_YQD )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC Y displacement velocities - if (ANY( p%OutParam(i)%Indx == BStC_ZQ )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC Z displacements - if (ANY( p%OutParam(i)%Indx == BStC_ZQD )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC Z displacement velocities - if (ANY( p%OutParam(i)%Indx == BStC_Fxl )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC local forces and moments - if (ANY( p%OutParam(i)%Indx == BStC_Fyl )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC local forces and moments - if (ANY( p%OutParam(i)%Indx == BStC_Fzl )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC local forces and moments - if (ANY( p%OutParam(i)%Indx == BStC_Mxl )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC local forces and moments - if (ANY( p%OutParam(i)%Indx == BStC_Myl )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC local forces and moments - if (ANY( p%OutParam(i)%Indx == BStC_Mzl )) InitOut%RotFrame_y(index_next) = .true. ! Blade StC local forces and moments - index_next = index_next + 1 + do j = 1, p%NumSStC + call MV_AddMeshVar(InitOut%Vars%u, 'Substructure StC '//Num2LStr(j), MotionFields, & + DatLoc(SrvD_u_SStCMotionMesh, j), & + Mesh=u%SStCMotionMesh(j), & + Perturbs=uPerturbs) + enddo + + call MV_AddMeshVar(InitOut%Vars%u, 'PtfmMotionMesh ', MotionFields, & + DatLoc(SrvD_u_PtfmMotionMesh), & + Mesh=u%PtfmMotionMesh, & + Perturbs=uPerturbs) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddVar(InitOut%Vars%y, "BlPitchCom", FieldScalar, & + DatLoc(SrvD_y_BlPitchCom), & + Flags=VF_RotFrame + VF_2PI, & + Num=size(y%BlPitchCom), & + LinNames=[('BlPitchCom('//trim(Num2LStr(i))//'), rad', i = 1, size(y%BlPitchCom))]) + + call MV_AddVar(InitOut%Vars%y, "BlPRateCom", FieldScalar, & + DatLoc(SrvD_y_BlPRateCom), & + Flags=VF_RotFrame, & + Num=size(y%BlPRateCom), & + LinNames=[('BlPRateCom('//trim(Num2LStr(i))//'), rad/s', i = 1, size(y%BlPRateCom))]) + + call MV_AddVar(InitOut%Vars%y, "BlPitchMom", FieldScalar, & + DatLoc(SrvD_y_BlPitchMom), & + Flags=VF_RotFrame, & + Num=size(y%BlPitchMom), & + LinNames=[('BlPitchMom('//trim(Num2LStr(i))//'), Nm', i = 1, size(y%BlPitchMom))]) + + call MV_AddVar(InitOut%Vars%y, "YawMom", FieldScalar, & + DatLoc(SrvD_y_YawMom), & + LinNames=['YawMom, Nm']) + + call MV_AddVar(InitOut%Vars%y, "GenTrq", FieldScalar, & + DatLoc(SrvD_y_GenTrq), & + LinNames=['GenTrq, Nm']) + + call MV_AddVar(InitOut%Vars%y, "ElecPwr", FieldScalar, & + DatLoc(SrvD_y_ElecPwr), & + LinNames=['ElecPwr, W']) + + ! Structural controllers + if (p%NumBStC > 0) then + do j = 1, p%NumBStC + do i = 1, p%NumBl + call MV_AddMeshVar(InitOut%Vars%y, 'Blade '//trim(Num2LStr(i))//' StC '//Num2LStr(j), LoadFields, & + DatLoc(SrvD_y_BStCLoadMesh, i, j), & + Mesh=y%BStCLoadMesh(i,j)) + end do end do - end subroutine SrvD_Init_Jacobian_y - - !> This routine initializes the Jacobian parameters and initialization outputs for the linearized continuous states. - subroutine SrvD_Init_Jacobian_x(dx) - real(ReKi), intent(in ) :: dx ! default perturbation size - integer(IntKi) :: i, j, k, index_next - p%Jac_nx = 0 ! no states other than StC states - ! StC related states - p%Jac_nx = p%Jac_nx & - + p%NumBStC * 2 * 3 * p%NumBl & ! 3 displacement state, 3 displacement state derivatives at each BStC instance on each blade - + p%NumNStC * 2 * 3 & ! 3 displacement state, 3 displacement state derivatives at each NStC instance - + p%NumTStC * 2 * 3 & ! 3 displacement state, 3 displacement state derivatives at each TStC instance - + p%NumSStC * 2 * 3 ! 3 displacement state, 3 displacement state derivatives at each SStC instance - - ! allocate space for the row/column names and for perturbation sizes - CALL AllocAry(InitOut%LinNames_x , p%Jac_nx, 'LinNames_x' , ErrStat2, ErrMsg2); if (Failed()) return; - CALL AllocAry(InitOut%RotFrame_x , p%Jac_nx, 'RotFrame_x' , ErrStat2, ErrMsg2); if (Failed()) return; - CALL AllocAry(InitOut%DerivOrder_x, p%Jac_nx, 'DerivOrder_x', ErrStat2, ErrMsg2); if (Failed()) return; - ! --- Jac_x_indx: matrix to store index to help us figure out what the ith value of the x vector really means - ! column 1 indicates module's mesh and field perturbation index (index to p%dx) - ! column 2 indicates the first index (x-y-z component) (unused) - ! column 3 is the StC motion mesh (Instance index) - ! column 4 is the StC motion mesh (blade index BStC mesh, ignored on others) - call allocAry( p%Jac_x_indx, p%Jac_nx, 4, 'p%Jac_x_indx', ErrStat2, ErrMsg2); if (Failed()) return; - p%Jac_x_indx = 0_IntKi - ! perturbation sizes - CALL AllocAry(p%dx, 24, 'x perturbation', ErrStat2, ErrMsg2); if (Failed()) return; - p%dx(1:24) = dx ! all state perturbations are the same for disp and velocity - - ! Initialize RotFrame and DerivOrder - InitOut%RotFrame_x = .false. - InitOut%DerivOrder_x = 2 - !-------------------------------- - ! linearization state names - !-------------------------------- - CALL AllocAry(p%Jac_Idx_BStC_x, 2, p%NumBl, p%NumBStC, 'Jac_Idx_BStC_x', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_BStC_x = 0_IntKi - CALL AllocAry(p%Jac_Idx_NStC_x, 2, p%NumNStC, 'Jac_Idx_NStC_x', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_NStC_x = 0_IntKi - CALL AllocAry(p%Jac_Idx_TStC_x, 2, p%NumTStC, 'Jac_Idx_TStC_x', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_TStC_x = 0_IntKi - CALL AllocAry(p%Jac_Idx_SStC_x, 2, p%NumSStC, 'Jac_Idx_SStC_x', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_SStC_x = 0_IntKi - index_next = 0 ! Index counter initialize - ! Blade StC -- displacement state - if (p%NumBStC > 0) then - do j=1,p%NumBStC - do k=1,p%NumBl - p%Jac_Idx_BStC_x(1,k,j) = index_next+1 ! Start index of BStC in x - p%Jac_x_indx(index_next+1:index_next+6,1) = (/ 1, 2, 3, 4, 5, 6/) ! StC type and field index - p%Jac_x_indx(index_next+1:index_next+6,2) = (/ 1, 2, 3, 1, 2, 3/) ! component (x,y,z) - p%Jac_x_indx(index_next+1:index_next+6,3) = j ! Instance - p%Jac_x_indx(index_next+1:index_next+6,4) = k ! blade - InitOut%LinNames_x(index_next+1) = 'Blade '//trim(num2lstr(k))//' StC '//trim(num2lstr(j))//' local displacement state X m'; ! x x%BStC(j)%StC_x(1,k) - InitOut%LinNames_x(index_next+2) = 'Blade '//trim(num2lstr(k))//' StC '//trim(num2lstr(j))//' local displacement state Y m'; ! y x%BStC(j)%StC_x(3,k) - InitOut%LinNames_x(index_next+3) = 'Blade '//trim(num2lstr(k))//' StC '//trim(num2lstr(j))//' local displacement state Z m'; ! z x%BStC(j)%StC_x(5,k) - InitOut%LinNames_x(index_next+4) = 'Blade '//trim(num2lstr(k))//' StC '//trim(num2lstr(j))//' local displacement state dX/dt m/s'; ! x-dot x%BStC(j)%StC_x(2,k) - InitOut%LinNames_x(index_next+5) = 'Blade '//trim(num2lstr(k))//' StC '//trim(num2lstr(j))//' local displacement state dY/dt m/s'; ! y-dot x%BStC(j)%StC_x(4,k) - InitOut%LinNames_x(index_next+6) = 'Blade '//trim(num2lstr(k))//' StC '//trim(num2lstr(j))//' local displacement state dZ/dt m/s'; ! z-dot x%BStC(j)%StC_x(6,k) - InitOut%RotFrame_x(index_next+1:index_next+6) = .true. - index_next = index_next + 6 - p%Jac_Idx_BStC_x(2,k,j) = index_next ! End index of BStC in x - enddo - enddo - endif - ! Nacelle StC -- displacement state - if (p%NumNStC > 0) then - do j=1,p%NumNStC - p%Jac_Idx_NStC_x(1,j) = index_next+1 ! Start index of NStC in x - p%Jac_x_indx(index_next+1:index_next+6,1) = (/ 7, 8, 9,10,11,12/) ! StC type and field index - p%Jac_x_indx(index_next+1:index_next+6,2) = (/ 1, 2, 3, 1, 2, 3/) ! component (x,y,z) - p%Jac_x_indx(index_next+1:index_next+6,3) = j ! Instance - InitOut%LinNames_x(index_next+1) = 'Nacelle StC '//trim(num2lstr(j))//' local displacement state X m'; ! x x%NStC(j)%StC_x(1,1) - InitOut%LinNames_x(index_next+2) = 'Nacelle StC '//trim(num2lstr(j))//' local displacement state Y m'; ! y x%NStC(j)%StC_x(3,1) - InitOut%LinNames_x(index_next+3) = 'Nacelle StC '//trim(num2lstr(j))//' local displacement state Z m'; ! z x%NStC(j)%StC_x(5,1) - InitOut%LinNames_x(index_next+4) = 'Nacelle StC '//trim(num2lstr(j))//' local displacement state dX/dt m/s'; ! x-dot x%NStC(j)%StC_x(2,1) - InitOut%LinNames_x(index_next+5) = 'Nacelle StC '//trim(num2lstr(j))//' local displacement state dY/dt m/s'; ! y-dot x%NStC(j)%StC_x(4,1) - InitOut%LinNames_x(index_next+6) = 'Nacelle StC '//trim(num2lstr(j))//' local displacement state dZ/dt m/s'; ! z-dot x%NStC(j)%StC_x(6,1) - index_next = index_next + 6 - p%Jac_Idx_NStC_x(2,j) = index_next ! End index of NStC in x - enddo - endif - ! Tower StC -- displacement state - if (p%NumTStC > 0) then - do j=1,p%NumTStC - p%Jac_Idx_TStC_x(1,j) = index_next+1 ! Start index of TStC in x - p%Jac_x_indx(index_next+1:index_next+6,1) = (/13,14,15,16,17,18/) ! StC type and field index - p%Jac_x_indx(index_next+1:index_next+6,2) = (/ 1, 2, 3, 1, 2, 3/) ! component (x,y,z) - p%Jac_x_indx(index_next+1:index_next+6,3) = j ! Instance - InitOut%LinNames_x(index_next+1) = 'Tower StC '//trim(num2lstr(j))//' local displacement state X m'; ! x x%TStC(j)%StC_x(1,1) - InitOut%LinNames_x(index_next+2) = 'Tower StC '//trim(num2lstr(j))//' local displacement state Y m'; ! y x%TStC(j)%StC_x(3,1) - InitOut%LinNames_x(index_next+3) = 'Tower StC '//trim(num2lstr(j))//' local displacement state Z m'; ! z x%TStC(j)%StC_x(5,1) - InitOut%LinNames_x(index_next+4) = 'Tower StC '//trim(num2lstr(j))//' local displacement state dX/dt m/s'; ! x-dot x%TStC(j)%StC_x(2,1) - InitOut%LinNames_x(index_next+5) = 'Tower StC '//trim(num2lstr(j))//' local displacement state dY/dt m/s'; ! y-dot x%TStC(j)%StC_x(4,1) - InitOut%LinNames_x(index_next+6) = 'Tower StC '//trim(num2lstr(j))//' local displacement state dZ/dt m/s'; ! z-dot x%TStC(j)%StC_x(6,1) - index_next = index_next + 6 - p%Jac_Idx_TStC_x(2,j) = index_next ! End index of TStC in x - enddo - endif - ! Substructure StC -- displacement state - if (p%NumSStC > 0) then - do j=1,p%NumSStC - p%Jac_Idx_SStC_x(1,j) = index_next+1 ! Start index of SStC in x - p%Jac_x_indx(index_next+1:index_next+6,1) = (/19,20,21,22,23,24/) ! StC type and field index - p%Jac_x_indx(index_next+1:index_next+6,2) = (/ 1, 2, 3, 1, 2, 3/) ! component (x,y,z) - p%Jac_x_indx(index_next+1:index_next+6,3) = j ! Instance - InitOut%LinNames_x(index_next+1) = 'Substructure StC '//trim(num2lstr(j))//' local displacement state X m'; ! x x%SStC(j)%StC_x(1,1) - InitOut%LinNames_x(index_next+2) = 'Substructure StC '//trim(num2lstr(j))//' local displacement state Y m'; ! y x%SStC(j)%StC_x(3,1) - InitOut%LinNames_x(index_next+3) = 'Substructure StC '//trim(num2lstr(j))//' local displacement state Z m'; ! z x%SStC(j)%StC_x(5,1) - InitOut%LinNames_x(index_next+4) = 'Substructure StC '//trim(num2lstr(j))//' local displacement state dX/dt m/s'; ! x-dot x%SStC(j)%StC_x(2,1) - InitOut%LinNames_x(index_next+5) = 'Substructure StC '//trim(num2lstr(j))//' local displacement state dY/dt m/s'; ! y-dot x%SStC(j)%StC_x(4,1) - InitOut%LinNames_x(index_next+6) = 'Substructure StC '//trim(num2lstr(j))//' local displacement state dZ/dt m/s'; ! z-dot x%SStC(j)%StC_x(6,1) - index_next = index_next + 6 - p%Jac_Idx_SStC_x(2,j) = index_next ! End index of SStC in x - enddo - endif - end subroutine SrvD_Init_Jacobian_x - - !> This routine initializes the Jacobian parameters and initialization outputs for the linearized inputs - subroutine SrvD_Init_Jacobian_u(du_t,du_r) - real(R8Ki), intent(in ) :: du_t ! default perturbation size for input translations - real(R8Ki), intent(in ) :: du_r ! default perturbation size for input rotations - integer(IntKi) :: i, j, k, index_next - integer(IntKi) :: i_meshField ! Counter for mesh fields - ! Standard inputs - p%Jac_nu = 3 ! Yaw, YawRate, HSS_Spd - ! StC related inputs - p%Jac_nu = p%Jac_nu & - + p%NumBStC * 18 * p%NumBl & ! 3 Translation Displacements + 3 orientations + 6 velocities + 6 accelerations at each BStC instance on each blade - + p%NumNStC * 18 & ! 3 Translation Displacements + 3 orientations + 6 velocities + 6 accelerations at each NStC instance - + p%NumTStC * 18 & ! 3 Translation Displacements + 3 orientations + 6 velocities + 6 accelerations at each TStC instance - + p%NumSStC * 18 ! 3 Translation Displacements + 3 orientations + 6 velocities + 6 accelerations at each SStC instance - - ! allocate space for the row/column names and for perturbation sizes - ! --- Info of linearized inputs (Names, RotFrame, IsLoad) - call AllocAry(InitOut%LinNames_u, p%Jac_nu, 'LinNames_u', ErrStat2, ErrMsg2); if (Failed()) return; - call AllocAry(InitOut%RotFrame_u, p%Jac_nu, 'RotFrame_u', ErrStat2, ErrMsg2); if (Failed()) return; - call AllocAry(InitOut%IsLoad_u, p%Jac_nu, 'IsLoad_u' , ErrStat2, ErrMsg2); if (Failed()) return; - ! --- Jac_u_indx: matrix to store index to help us figure out what the ith value of the u vector really means - ! column 1 indicates module's mesh and field perturbation index (index to p%du) - ! column 2 indicates the first index (x-y-z component) of the field - ! column 3 is the StC motion mesh (Instance index) - ! column 4 is the StC motion mesh (blade index BStC mesh, ignored on others) - call allocAry( p%Jac_u_indx, p%Jac_nu, 4, 'p%Jac_u_indx', ErrStat2, ErrMsg2); if (Failed()) return; - p%Jac_u_indx = 0 - ! perturbation sizes - CALL AllocAry(p%du, 24, 'u perturbation', ErrStat2, ErrMsg2); if (Failed()) return; - p%du( 1) = du_t ! Blade u%*Mesh%TranslationDisp = 1; - p%du( 2) = du_r ! Blade u%*Mesh%Orientation = 2; - p%du( 3) = du_t ! Blade u%*Mesh%TranslationVel = 3; - p%du( 4) = du_r ! Blade u%*Mesh%RotationVel = 4; - p%du( 5) = du_t ! Blade u%*Mesh%TranslationAcc = 5; - p%du( 6) = du_r ! Blade u%*Mesh%RotationAcc = 6; - p%du( 7:12) = p%du( 1:6) ! Nacelle - p%du(13:18) = p%du( 1:6) ! Tower - p%du(19:24) = p%du( 1:6) ! Substructure - - ! Initialize RotFrame_u and IsLoad_u - InitOut%RotFrame_u = .false. ! every StC input is on a mesh, which stores values in the global (not rotating) frame - InitOut%IsLoad_u = .false. ! No loads present - - !-------------------------------- - ! linearization input names - !-------------------------------- - index_next = 1 - ! u%Yaw -- not in rotating frame - InitOut%LinNames_u(index_next) = 'Yaw, rad'; index_next = index_next + 1 - - ! u%YawRate -- not in rotating frame - InitOut%LinNames_u(index_next) = 'YawRate, rad/s'; index_next = index_next + 1 - - ! u%HSS_Spd -- not in rotating frame - InitOut%LinNames_u(index_next) = 'HSS_Spd, rad/s'; index_next = index_next + 1 - - !-------------------------------- - ! StC related inputs - !-------------------------------- - CALL AllocAry(p%Jac_Idx_BStC_u, 2, p%NumBl, p%NumBStC, 'Jac_Idx_BStC_u', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_BStC_u = 0_IntKi - CALL AllocAry(p%Jac_Idx_NStC_u, 2, p%NumNStC, 'Jac_Idx_NStC_u', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_NStC_u = 0_IntKi - CALL AllocAry(p%Jac_Idx_TStC_u, 2, p%NumTStC, 'Jac_Idx_TStC_u', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_TStC_u = 0_IntKi - CALL AllocAry(p%Jac_Idx_SStC_u, 2, p%NumSStC, 'Jac_Idx_SStC_u', ErrStat2, ErrMsg2); if (Failed()) return; p%Jac_Idx_SStC_u = 0_IntKi - ! Blade - if (p%NumBStC > 0) then - do j=1,p%NumBStC - do i=1,p%NumBl - p%Jac_Idx_BStC_u(1,i,j) = index_next ! Start index of BStC in u - call PackMotionMesh_Names( u%BStCMotionMesh(i,j), 'Blade '//trim(num2lstr(i))//' StC '//trim(num2lstr(j)), InitOut%LinNames_u, index_next ) - p%Jac_Idx_BStC_u(2,i,j) = index_next-1 ! End index of BStC in u - enddo - enddo - endif - ! Nacelle - if (p%NumNStC > 0) then - do j=1,p%NumNStC - p%Jac_Idx_NStC_u(1,j) = index_next ! Start index of NStC in u - call PackMotionMesh_Names( u%NStCMotionMesh(j), 'Nacelle StC '//trim(num2lstr(j)), InitOut%LinNames_u, index_next ) - p%Jac_Idx_NStC_u(2,j) = index_next-1 ! End index of NStC in u - enddo - endif - ! Tower - if (p%NumTStC > 0) then - do j=1,p%NumTStC - p%Jac_Idx_TStC_u(1,j) = index_next ! Start index of TStC in u - call PackMotionMesh_Names( u%TStCMotionMesh(j), 'Tower StC '//trim(num2lstr(j)), InitOut%LinNames_u, index_next ) - p%Jac_Idx_TStC_u(2,j) = index_next-1 ! End index of TStC in u - enddo - endif - ! Sub-structure - if (p%NumSStC > 0) then - do j=1,p%NumSStC - p%Jac_Idx_SStC_u(1,j) = index_next ! Start index of SStC in u - call PackMotionMesh_Names( u%SStCMotionMesh(j), 'Substructure StC '//trim(num2lstr(j)), InitOut%LinNames_u, index_next ) - p%Jac_Idx_SStC_u(2,j) = index_next-1 ! End index of SStC in u - enddo - endif + end if - !-------------------------------- - ! linearization perturbation size - !-------------------------------- - index_next = 1 - !! u%Yaw -- not in rotating frame NOTE: this is calculated exactly, so not necessary to track - !! u%YawRate -- not in rotating frame NOTE: this is calculated exactly, so not necessary to track - !! u%HSS_Spd -- not in rotating frame NOTE: this is calculated exactly, so not necessary to track - - ! Blade StC instances - do j=1,p%NumBStC - do i=1,p%NumBl - index_next = p%Jac_Idx_BStC_u(1,i,j) - do i_meshField = 1,6 - do k=1,3 - p%Jac_u_indx(index_next,1) = i_meshField ! (TransDisp,Orient,TransVel,RotVel,TransAcc,RotAcc) - p%Jac_u_indx(index_next,2) = k ! component (x,y,z) - p%Jac_u_indx(index_next,3) = j ! Instance - p%Jac_u_indx(index_next,4) = i ! blade - index_next = index_next + 1 - enddo - enddo - enddo - enddo - ! Nacelle StC instances - do j=1,p%NumNStC - index_next = p%Jac_Idx_NStC_u(1,j) - do i_meshField = 7,12 - do k=1,3 - p%Jac_u_indx(index_next,1) = i_meshField ! (TransDisp,Orient,TransVel,RotVel,TransAcc,RotAcc) - p%Jac_u_indx(index_next,2) = k ! component (x,y,z) - p%Jac_u_indx(index_next,3) = j ! Instance - p%Jac_u_indx(index_next,4) = 1 ! Ignored - index_next = index_next + 1 - enddo - enddo + if (p%NumNStC > 0) then + do j = 1, p%NumNStC + call MV_AddMeshVar(InitOut%Vars%y, 'Nacelle StC '//Num2LStr(j), LoadFields, & + DatLoc(SrvD_y_NStCLoadMesh, j), & + Mesh=y%NStCLoadMesh(j)) enddo - ! Tower StC instances - do j=1,p%NumTStC - index_next = p%Jac_Idx_TStC_u(1,j) - do i_meshField = 13,18 - do k=1,3 - p%Jac_u_indx(index_next,1) = i_meshField ! (TransDisp,Orient,TransVel,RotVel,TransAcc,RotAcc) - p%Jac_u_indx(index_next,2) = k ! component (x,y,z) - p%Jac_u_indx(index_next,3) = j ! Instance - p%Jac_u_indx(index_next,4) = 1 ! Ignored - index_next = index_next + 1 - enddo - enddo + end if + + if (p%NumTStC > 0) then + do j = 1, p%NumTStC + call MV_AddMeshVar(InitOut%Vars%y, 'Tower StC '//Num2LStr(j), LoadFields, & + DatLoc(SrvD_y_TStCLoadMesh, j), & + Mesh=y%TStCLoadMesh(j)) enddo - ! Substructure StC instances - do j=1,p%NumSStC - index_next = p%Jac_Idx_SStC_u(1,j) - do i_meshField = 19,24 - do k=1,3 - p%Jac_u_indx(index_next,1) = i_meshField ! (TransDisp,Orient,TransVel,RotVel,TransAcc,RotAcc) - p%Jac_u_indx(index_next,2) = k ! component (x,y,z) - p%Jac_u_indx(index_next,3) = j ! Instance - p%Jac_u_indx(index_next,4) = 1 ! Ignored - index_next = index_next + 1 - enddo - enddo + end if + + if (p%NumSStC > 0) then + do j = 1, p%NumSStC + call MV_AddMeshVar(InitOut%Vars%y, 'Substructure StC '//Num2LStr(j), LoadFields, & + DatLoc(SrvD_y_SStCLoadMesh, j), & + Mesh=y%SStCLoadMesh(j)) enddo - end subroutine SrvD_Init_Jacobian_u - - subroutine CheckInfo() - character(1) :: Flag,FlagLoad - integer(IntKi) :: i,j,k - ! print out some info - if (allocated(InitOut%LinNames_y)) then - call WrScr('LinNames_y') - do j=1,p%NumBStC - do k=1,p%NumBl - call WrScr(' BStC '//trim(Num2LStr(j))//' blade '//trim(Num2LStr(k))//' range: '//trim(Num2LStr(p%Jac_Idx_BStC_y(1,k,j)))//' '//trim(Num2LStr(p%Jac_Idx_BStC_y(2,k,j)))) - enddo - enddo - do j=1,p%NumNStC - call WrScr(' NStC '//trim(Num2LStr(j))//' range: '//trim(Num2LStr(p%Jac_Idx_NStC_y(1,j)))//' '//trim(Num2LStr(p%Jac_Idx_NStC_y(2,j)))) - enddo - do j=1,p%NumTStC - call WrScr(' TStC '//trim(Num2LStr(j))//' range: '//trim(Num2LStr(p%Jac_Idx_TStC_y(1,j)))//' '//trim(Num2LStr(p%Jac_Idx_TStC_y(2,j)))) - enddo - do j=1,p%NumSStC - call WrScr(' SStC '//trim(Num2LStr(j))//' range: '//trim(Num2LStr(p%Jac_Idx_SStC_y(1,j)))//' '//trim(Num2LStr(p%Jac_Idx_SStC_y(2,j)))) - enddo - do i=1,size(InitOut%LinNames_y) - Flag='F' - if (InitOut%RotFrame_y(i)) Flag='T' - call WrScr(' '//Num2LStr(i)//Flag//' '//InitOut%LinNames_y(i)) - enddo - endif - if (allocated(InitOut%LinNames_x)) then - call WrScr('LinNames_x') - do j=1,p%NumBStC - do k=1,p%NumBl - call WrScr(' BStC '//trim(Num2LStr(j))//' blade '//trim(Num2LStr(k))//' range: '//trim(Num2LStr(p%Jac_Idx_BStC_x(1,k,j)))//' '//trim(Num2LStr(p%Jac_Idx_BStC_x(2,k,j)))) - enddo - enddo - do j=1,p%NumNStC - call WrScr(' NStC '//trim(Num2LStr(j))//' range: '//trim(Num2LStr(p%Jac_Idx_NStC_x(1,j)))//' '//trim(Num2LStr(p%Jac_Idx_NStC_x(2,j)))) - enddo - do j=1,p%NumTStC - call WrScr(' TStC '//trim(Num2LStr(j))//' range: '//trim(Num2LStr(p%Jac_Idx_TStC_x(1,j)))//' '//trim(Num2LStr(p%Jac_Idx_TStC_x(2,j)))) - enddo - do j=1,p%NumSStC - call WrScr(' SStC '//trim(Num2LStr(j))//' range: '//trim(Num2LStr(p%Jac_Idx_SStC_x(1,j)))//' '//trim(Num2LStr(p%Jac_Idx_SStC_x(2,j)))) - enddo - do i=1,size(InitOut%LinNames_x) - Flag='F' - if (InitOut%RotFrame_x(i)) Flag='T' - call WrScr(' '//Num2LStr(i)//Flag//' '//trim(Num2LStr(InitOut%DerivOrder_x(i)))//' '//InitOut%LinNames_x(i)) - enddo - endif - if (allocated(InitOut%LinNames_u)) then - call WrScr('Perturb Size u') - do i=1,size(p%du) - call WrScr(' '//trim(Num2LStr(i))//' '//trim(Num2LStr(p%du(i)))) - enddo - call WrScr('LinNames_u') - do j=1,p%NumBStC - do k=1,p%NumBl - call WrScr(' BStC '//trim(Num2LStr(j))//' blade '//trim(Num2LStr(k))//' range: '//trim(Num2LStr(p%Jac_Idx_BStC_u(1,k,j)))//' '//trim(Num2LStr(p%Jac_Idx_BStC_u(2,k,j)))) - enddo - enddo - do j=1,p%NumNStC - call WrScr(' NStC '//trim(Num2LStr(j))//' range: '//trim(Num2LStr(p%Jac_Idx_NStC_u(1,j)))//' '//trim(Num2LStr(p%Jac_Idx_NStC_u(2,j)))) - enddo - do j=1,p%NumTStC - call WrScr(' TStC '//trim(Num2LStr(j))//' range: '//trim(Num2LStr(p%Jac_Idx_TStC_u(1,j)))//' '//trim(Num2LStr(p%Jac_Idx_TStC_u(2,j)))) - enddo - do j=1,p%NumSStC - call WrScr(' SStC '//trim(Num2LStr(j))//' range: '//trim(Num2LStr(p%Jac_Idx_SStC_u(1,j)))//' '//trim(Num2LStr(p%Jac_Idx_SStC_u(2,j)))) - enddo - do i=1,size(InitOut%LinNames_u) - Flag='F' - FlagLoad='F' - if (InitOut%RotFrame_u(i)) Flag='T' - if (InitOut%IsLoad_u(i)) FlagLoad='T' - call WrScr(' '//Num2LStr(i)//Flag//' '//FlagLoad//' ('// & - trim(Num2LStr(p%Jac_u_indx(i,1)))//','//trim(Num2LStr(p%Jac_u_indx(i,2)))//','//trim(Num2LStr(p%Jac_u_indx(i,3)))// & - ') '//InitOut%LinNames_u(i)) - enddo - endif - end subroutine CheckInfo -end subroutine SrvD_Init_Jacobian + end if + + ! Write Outputs + do i = 1, p%NumOuts + call MV_AddVar(InitOut%Vars%y, p%OutParam(i)%Name, FieldScalar, & + DatLoc(SrvD_y_WriteOutput), iAry=i, & + Flags=VF_WriteOut + OutParamFlags(p%OutParam(i)%Indx), & + LinNames=[trim(p%OutParam(i)%Name)//', '//p%OutParam(i)%Units], & + Active=(p%OutParam(i)%Indx > 0)) + end do + + !---------------------------------------------------------------------------- + ! Initialize Variables and Jacobian data + !---------------------------------------------------------------------------- + + CALL MV_InitVarsJac(InitOut%Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call SrvD_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + +contains + function OutParamFlags(indx) result(flagsRes) + integer(IntKi), intent(in) :: indx + integer(IntKi) :: flagsRes + integer(IntKi), parameter :: RotatingFrameIndices(*) = [& + BlPitchC, BStC_XQ, BStC_XQD, BStC_YQ, BStC_YQD, BStC_ZQ, BStC_ZQD, & + BStC_Fxl, BStC_Fyl, BStC_Fzl, BStC_Mxl, BStC_Myl, BStC_Mzl] + if (any(indx == RotatingFrameIndices)) then + flagsRes = VF_RotFrame + else + flagsRes = VF_None + end if + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine !---------------------------------------------------------------------------------------------------------------------------------- !> This routine sets the data structures for the structural control (StC) module -- Nacelle Instances @@ -1657,7 +1430,10 @@ subroutine StC_CtrlChan_Setup(m,p,CtrlChanInitInfo,UnSum,ErrStat,ErrMsg) if (p%SStC(i)%StC_CMode == ControlMode_DLL) p%StCCMode = ControlMode_DLL enddo - if (p%NumStC_Control==0) return ! No reason to do anything else + if (p%NumStC_Control==0) then + p%StCCMode = 0_IntKi ! Effectively no DLL control + return ! No reason to do anything else + end if ! Allocate StC averaging info (if multiple StC's request same channel, average the measured data for those channels allocate(p%StCMeasNumPerChan(p%NumStC_Control), STAT=ErrStat2); if ( AllErr('Could not allocate StCMeasNumPerChan') ) return; @@ -2202,7 +1978,7 @@ SUBROUTINE SrvD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg if (Failed()) return; ! Pitch control: - CALL Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, y%BlPitchCom, y%ElecPwr, m, ErrStat2, ErrMsg2 ) + CALL Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, y%BlPitchCom, y%BlPRateCom, y%BlPitchMom, y%ElecPwr, m, ErrStat2, ErrMsg2 ) if (Failed()) return; ! Yaw control: @@ -2426,6 +2202,7 @@ SUBROUTINE SrvD_UpdateDiscState( t, u, p, x, xd, z, OtherState, m, ErrStat, ErrM INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 integer(IntKi) :: j ! Index to instance of StC for location + real(ReKi) :: speedErr ! Initialize ErrStat @@ -2434,9 +2211,13 @@ SUBROUTINE SrvD_UpdateDiscState( t, u, p, x, xd, z, OtherState, m, ErrStat, ErrM select case (p%TrimCase) case (TrimCase_yaw) - xd%CtrlOffset = xd%CtrlOffset + (u%RotSpeed - p%RotSpeedRef) * sign(p%TrimGain, p%YawNeut + xd%CtrlOffset) + speedErr = (u%RotSpeed - p%RotSpeedRef) * sign(p%TrimGain, p%YawNeut + xd%CtrlOffset) + xd%CtrlIntegral = xd%CtrlIntegral + speedErr + xd%CtrlOffset = xd%CtrlIntegral + speedErr * 100.0_ReKi case (TrimCase_torque, TrimCase_pitch) - xd%CtrlOffset = xd%CtrlOffset + (u%RotSpeed - p%RotSpeedRef) * p%TrimGain + speedErr = (u%RotSpeed - p%RotSpeedRef) * p%TrimGain + xd%CtrlIntegral = xd%CtrlIntegral + speedErr + xd%CtrlOffset = xd%CtrlIntegral + speedErr * 1000.0_ReKi ! case default ! xd%CtrlOffset = 0.0_ReKi ! same as initialized value end select @@ -2531,7 +2312,8 @@ END SUBROUTINE SrvD_CalcConstrStateResidual !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the inputs (u). The partial derivatives dY/du and dX/du are returned. -SUBROUTINE SrvD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu ) +SUBROUTINE SrvD_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu ) + type(ModVarsType), intent(in ) :: Vars !< Module vars real(DbKi), intent(in ) :: t !< Time in seconds at operating point type(SrvD_InputType), intent(inout) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) type(SrvD_ParameterType), intent(in ) :: p !< Parameters @@ -2555,981 +2337,115 @@ SUBROUTINE SrvD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, Er real(R8Ki), allocatable, optional, intent(inout) :: dZdu(:,:) !< Partial derivatives of constraint state !! functions (Z) with respect to inputs (u) [intent in to avoid deallocation] - ! local variables - integer(IntKi) :: ErrStat2 ! Error status of the operation - character(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat /= ErrID_None - character(*), parameter :: RoutineName = 'SrvD_JacobianPInput' - - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = '' - - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: - IF ( PRESENT( dYdu ) ) THEN - call Jac_dYdu( t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2, dYdu ) - if (Failed()) return - END IF - - IF ( PRESENT( dXdu ) ) THEN - call Jac_dXdu( t, u, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2, dXdu ) - if (Failed()) return - END IF - - IF ( PRESENT( dXddu ) ) THEN - if (allocated(dXddu)) deallocate(dXddu) - END IF - - IF ( PRESENT( dZdu ) ) THEN - if (allocated(dZdu)) deallocate(dZdu) - END IF - -contains - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - end function Failed -END SUBROUTINE SrvD_JacobianPInput - -!> Calculate the jacobian dYdu -subroutine Jac_dYdu( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu ) - real(DbKi), intent(in ) :: t !< Time in seconds at operating point - type(SrvD_InputType), intent(inout) :: u !< Inputs at operating point (out for copy only) - type(SrvD_ParameterType), intent(in ) :: p !< Parameters - type(SrvD_ContinuousStateType), intent(in ) :: x !< Continuous states at operating point - type(SrvD_DiscreteStateType), intent(in ) :: xd !< Discrete states at operating point - type(SrvD_ConstraintStateType), intent(in ) :: z !< Constraint states at operating point - type(SrvD_OtherStateType), intent(in ) :: OtherState !< Other states at operating point - type(SrvD_OutputType), intent(inout) :: y !< Output (need to make copies) - type(SrvD_MiscVarType), intent(inout) :: m !< Misc/optimization variables - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - real(R8Ki), allocatable, intent(inout) :: dYdu(:,:) !< Partial derivatives of output functions - - integer(IntKi) :: n ! Generic loop index - type(SrvD_InputType) :: u_perturb ! copy of inputs to perturb - type(SrvD_OutputType) :: y_p ! outputs positive perturbed - type(SrvD_OutputType) :: y_m ! outputs negative perturbed - real(R8Ki) :: delta_p ! delta+ change in input or state - real(R8Ki) :: delta_m ! delta- change in input or state - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'Jac_dYdu' + character(*), parameter :: RoutineName = 'SrvD_JacobianPInput' + integer(IntKi) :: ErrStat2 ! Error status of the operation + character(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat /= ErrID_None + integer(IntKi) :: i, j, iCol ! Loop indices ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' - ! Allocate the dYdu array - if (.not. allocated(dYdu)) then - call allocAry(dYdu, p%Jac_ny, p%Jac_nu, 'dYdu', ErrStat2, ErrMsg2) - if (Failed()) return - elseif ( (size(dYdu,1) /= p%Jac_ny) .or. (size(dYdu,2) /= p%Jac_nu) ) then - deallocate(dYdu) - call allocAry(dYdu, p%Jac_ny, p%Jac_nu, 'dYdu', ErrStat2, ErrMsg2) - if (Failed()) return - end if - dYdu = 0.0_R8Ki - - !------------------------------------------------------------- - ! Calculate first three rows for Yaw, YawRate, HSS_Spd inputs - ! This is an analytical calculation. - ! First 3 columns in dY/du - !------------------------------------------------------------- - call dYdu_YawGen(); if (ErrStat > AbortErrLev) return; - - !------------------------------------------------------------- - ! Perturb each StC instance individually and place in appropriate location in dYdu - ! Each StC is basically an isolated piece that doesn't interact with any other StC or with anything else in SrvD, - ! so we take advantage of that here for computational expediency. - !------------------------------------------------------------- - ! make a copy of the inputs to perturb if an StC exists - if ( (p%NumBStC + p%NumNStC + p%NumTStC + p%NumSStC) > 0 ) then - call SrvD_CopyInput( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - endif - !------------------- - ! Blade StC - if (p%NumBStC > 0) then - do n=p%Jac_Idx_BStC_u(1,1,1),p%Jac_Idx_BStC_u(2,p%NumBl,p%NumBStC) ! input range for BStC - - ! perturb positive - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_BStC_dYdu( n, +1, u_perturb, delta_p, y_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_BStC_dYdu( n, -1, u_perturb, delta_m, y_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dY( p, y_p, y_m, delta_p, delta_m, dYdu(:,n) ) - enddo - endif - !------------------- - ! Nacelle StC - if (p%NumNStC > 0) then - do n=p%Jac_Idx_NStC_u(1,1),p%Jac_Idx_NStC_u(2,p%NumNStC) ! input range for NStC - - ! perturb positive - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_NStC_dYdu( n, +1, u_perturb, delta_p, y_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_NStC_dYdu( n, -1, u_perturb, delta_m, y_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dY( p, y_p, y_m, delta_p, delta_m, dYdu(:,n) ) - enddo - endif - !------------------- - ! Tower StC - if (p%NumTStC > 0) then - do n=p%Jac_Idx_TStC_u(1,1),p%Jac_Idx_TStC_u(2,p%NumTStC) ! input range for TStC - - ! perturb positive - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_TStC_dYdu( n, +1, u_perturb, delta_p, y_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_TStC_dYdu( n, -1, u_perturb, delta_m, y_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Update copy of the inputs to perturb + call SrvD_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackInput(Vars, u, m%Jac%u) - ! Central difference - call Compute_dY( p, y_p, y_m, delta_p, delta_m, dYdu(:,n) ) - enddo - endif - !------------------- - ! Substructure StC - if (p%NumSStC > 0) then - do n=p%Jac_Idx_SStC_u(1,1),p%Jac_Idx_SStC_u(2,p%NumSStC) ! input range for SStC - - ! perturb positive - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_SStC_dYdu( n, +1, u_perturb, delta_p, y_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_SStC_dYdu( n, -1, u_perturb, delta_m, y_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dY( p, y_p, y_m, delta_p, delta_m, dYdu(:,n) ) - enddo - endif - call Cleanup() - -contains - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - if (Failed) call Cleanup - end function Failed - - subroutine Cleanup() - ! Ignore any errors from the destroy (these weren't created if no StCs) - call SrvD_DestroyInput( u_perturb, ErrStat2, ErrMsg2 ) - call SrvD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call SrvD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - end subroutine Cleanup - - !> Subroutine for the yaw and generator portions of the dYdu matrix (first three rows of dYdu) - !! This is part of dYdu uses analytical results - subroutine dYdu_YawGen() - integer(IntKi) :: i ! Generic indices - real(R8Ki) :: GenTrq_du, ElecPwr_du ! derivatives of generator torque and electrical power w.r.t. u%HSS_SPD - integer,parameter :: Indx_u_Yaw = 1 - integer,parameter :: Indx_u_YawRate = 2 - integer,parameter :: Indx_u_HSS_Spd = 3 - integer :: SrvD_Indx_Y_YawMom - integer :: SrvD_Indx_Y_GenTrq - integer :: SrvD_Indx_Y_ElecPwr - integer :: SrvD_Indx_Y_WrOutput - real(R8Ki) :: AllOuts(3,MaxOutPts) ! Extra precision here since analytical - - SrvD_Indx_Y_YawMom = size(SrvD_Indx_Y_BlPitchCom) + 1 ! sometime change this to p%NumBl - SrvD_Indx_Y_GenTrq = SrvD_Indx_Y_YawMom + 1 - SrvD_Indx_Y_ElecPwr = SrvD_Indx_Y_GenTrq + 1 - SrvD_Indx_Y_WrOutput = p%Jac_ny - p%NumOuts ! Index to location before user requested outputs - - !> \f{equation}{ \frac{\partial Y}{\partial u} = \begin{bmatrix} - !! \frac{\partial Y_{BlPitchCom_1}}{\partial u_{Yaw}} & \frac{\partial Y_{BlPitchCom_1}}{\partial u_{YawRate}} & \frac{\partial Y_{BlPitchCom_1}}{\partial u_{HSS\_Spd}} \\ - !! \frac{\partial Y_{BlPitchCom_2}}{\partial u_{Yaw}} & \frac{\partial Y_{BlPitchCom_2}}{\partial u_{YawRate}} & \frac{\partial Y_{BlPitchCom_2}}{\partial u_{HSS\_Spd}} \\ - !! \frac{\partial Y_{BlPitchCom_3}}{\partial u_{Yaw}} & \frac{\partial Y_{BlPitchCom_3}}{\partial u_{YawRate}} & \frac{\partial Y_{BlPitchCom_3}}{\partial u_{HSS\_Spd}} \\ - !! \frac{\partial Y_{YawMom}}{\partial u_{Yaw}} & \frac{\partial Y_{YawMom}}{\partial u_{YawRate}} & \frac{\partial Y_{YawMom}}{\partial u_{HSS\_Spd}} \\ - !! \frac{\partial Y_{GenTrq}}{\partial u_{Yaw}} & \frac{\partial Y_{GenTrq}}{\partial u_{YawRate}} & \frac{\partial Y_{GenTrq}}{\partial u_{HSS\_Spd}} \\ - !! \frac{\partial Y_{ElecPwr}}{\partial u_{Yaw}} & \frac{\partial Y_{ElecPwr}}{\partial u_{YawRate}} & \frac{\partial Y_{ElecPwr}}{\partial u_{HSS\_Spd}} \\ - !! \frac{\partial Y_{WriteOutput_i}}{\partial u_{Yaw}} & \frac{\partial Y_{WriteOutput_i}}{\partial u_{YawRate}} & \frac{\partial Y_{WriteOutput_i}}{\partial u_{HSS\_Spd}} \end{bmatrix} - !! = \begin{bmatrix} - !! 0 & 0 & 0 \\ - !! 0 & 0 & 0 \\ - !! 0 & 0 & 0 \\ - !! \frac{\partial Y_{YawMom}}{\partial u_{Yaw}} & \frac{\partial Y_{YawMom}}{\partial u_{YawRate}} & 0 \\ - !! 0 & 0 & \frac{\partial Y_{GenTrq}}{\partial u_{HSS\_Spd}} \\ - !! 0 & 0 & \frac{\partial Y_{ElecPwr}}{\partial u_{HSS\_Spd}} \\ - !! \frac{\partial Y_{WriteOutput_i}}{\partial u_{Yaw}} & \frac{\partial Y_{WriteOutput_i}}{\partial u_{YawRate}} & \frac{\partial Y_{WriteOutput_i}}{\partial u_{HSS\_Spd}} \end{bmatrix} - !!\f} - - ! ! Torque control: - !> Compute - !> \f$ \frac{\partial Y_{GenTrq}}{\partial u_{HSS\_Spd}} \f$ and - !> \f$ \frac{\partial Y_{ElecPwr}}{\partial u_{HSS\_Spd}} \f$ in servodyn::torque_jacobianpinput. - call Torque_JacobianPInput( t, u, p, x, xd, z, OtherState, m, GenTrq_du, ElecPwr_du, ErrStat2, ErrMsg2 ) - if (Failed()) return - dYdu(SrvD_Indx_Y_GenTrq, Indx_u_HSS_Spd) = GenTrq_du - dYdu(SrvD_Indx_Y_ElecPwr,Indx_u_HSS_Spd) = ElecPwr_du - - ! Pitch control: - !> \f$ \frac{\partial Y_{BlPitchCom_k}}{\partial u} = 0 \f$ - - ! Yaw control: - !> \f$ \frac{\partial Y_{YawMom}}{\partial u_{Yaw}} = -p\%YawSpr \f$ - dYdu(SrvD_Indx_Y_YawMom,Indx_u_Yaw) = -p%YawSpr ! from Yaw_CalcOutput - !> \f$ \frac{\partial Y_{YawMom}}{\partial u_{YawRate}} = -p\%YawDamp \f$ - dYdu(SrvD_Indx_Y_YawMom,Indx_u_YawRate) = -p%YawDamp ! from Yaw_CalcOutput - - !............................................................................... - ! Calculate the output channels that will be affected by u%{Yaw,YawRate,HSS_Spd} - ! These terms are analytically calculated - !............................................................................... - AllOuts = 0.0_R8Ki ! all variables not specified below are zeros (either constant or disabled): - AllOuts(1:3, GenTq) = 0.001_R8Ki*dYdu(SrvD_Indx_Y_GenTrq,1:3) - AllOuts(1:3, GenPwr) = 0.001_R8Ki*dYdu(SrvD_Indx_Y_ElecPwr,1:3) - AllOuts(1:3, YawMomCom) = -0.001_R8Ki*dYdu(SrvD_Indx_Y_YawMom,1:3) - - !............................................................................... - ! Place the selected output channels into the WriteOutput(:) portion of the - ! jacobian with the proper sign: - !............................................................................... - do I = 1,p%NumOuts ! Loop through all selected output channels - if (p%OutParam(I)%Indx > 0_IntKi) then - dYdu(I+SrvD_Indx_Y_WrOutput,1:3) = p%OutParam(I)%SignM * AllOuts( 1:3, p%OutParam(I)%Indx ) - else - dYdu(I+SrvD_Indx_Y_WrOutput,1:3) = 0.0_R8Ki - endif - enddo ! I - All selected output channels - end subroutine dYdu_YawGen - - !> Calculated dYdu for BStC instance - subroutine Jac_BStC_dYdu( n, sgn, u_perturb, delta, y_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_InputType), intent(inout) :: u_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_OutputType), intent(inout) :: y_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: i,j,k ! Generic indices - type(StC_InputType) :: u_StC ! copy of the StC inputs for StC_CalcOutput call - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - real(ReKi) :: AllOuts(0:MaxOutPts) ! All the available output channels - perturbed (ReKi since WriteOutput is ReKi) - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_u_indx array. This allows us to simplify the number of calls dramatically - k = p%Jac_u_indx(n,4) ! this blade - j = p%Jac_u_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_u( p, n, sgn, u_perturb, delta ) - ! Transfer motion mesh to this particular instance - call StC_CopyInput( m%u_BStC(1,j), u_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - call Transfer_Point_to_Point( u_perturb%BStCMotionMesh(k,j), u_StC%Mesh(k), m%SrvD_MeshMap%u_BStC_Mot2_BStC(k,j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! Set StC control channels - !call SetStCInput_CtrlChans(u_BStC) - ! call Calc - call StC_CopyOutput(m%y_BStC( j), y_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - CALL StC_CalcOutput( t, u_StC, p%BStC(j), x%BStC(j), xd%BStC(j), z%BStC(j), OtherState%BStC(j), y_StC, m%BStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - CALL Transfer_Point_to_Point( y_StC%Mesh(k), y_perturb%BStCLoadMesh(k,j), m%SrvD_MeshMap%BStC_Frc2_y_BStC(k,j), ErrStat3, ErrMsg3, u_perturb%BStCMotionMesh(k,j), u_perturb%BStCMotionMesh(k,j) ); if (ErrStat3 > AbortErrLev) return - ! collect relevant outputs - AllOuts = 0.0_ReKi - call Set_BStC_Outs_Instance( j, p%NumBl, x%BStC(j), m%BStC(j), y_StC, AllOuts) - call StC_DestroyInput( u_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - call StC_DestroyOutput( y_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - !------------------- - ! Store outputs - do I = 1,p%NumOuts ! Loop through all selected output channels - y_perturb%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) - enddo -! do I = 1,p%NumOuts_DLL ! Loop through all DLL logging channels -! y_perturb%WriteOutput(I+p%NumOuts) = m%dll_data%LogChannels( I ) -! enddo - end subroutine Jac_BStC_dYdu - - !> Calculated dYdu for NStC instance - subroutine Jac_NStC_dYdu( n, sgn, u_perturb, delta, y_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_InputType), intent(inout) :: u_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_OutputType), intent(inout) :: y_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: i,j,k ! Generic indices - type(StC_InputType) :: u_StC ! copy of the StC inputs for StC_CalcOutput call - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - real(ReKi) :: AllOuts(0:MaxOutPts) ! All the available output channels - perturbed (ReKi since WriteOutput is ReKi) - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_u_indx array. This allows us to simplify the number of calls dramatically - j = p%Jac_u_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - call SrvD_Perturb_u( p, n, sgn, u_perturb, delta ) - ! Transfer motion mesh to this particular instance - call StC_CopyInput( m%u_NStC(1,j), u_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - call Transfer_Point_to_Point( u_perturb%NStCMotionMesh(j), u_StC%Mesh(1), m%SrvD_MeshMap%u_NStC_Mot2_NStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! Set StC control channels - !call SetStCInput_CtrlChans(u_NStC) - ! call Calc - call StC_CopyOutput(m%y_NStC( j), y_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3) - CALL StC_CalcOutput( t, u_StC, p%NStC(j), x%NStC(j), xd%NStC(j), z%NStC(j), OtherState%NStC(j), y_StC, m%NStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - CALL Transfer_Point_to_Point( y_StC%Mesh(1), y_perturb%NStCLoadMesh(j), m%SrvD_MeshMap%NStC_Frc2_y_NStC(j), ErrStat3, ErrMsg3, u_perturb%NStCMotionMesh(j), u_perturb%NStCMotionMesh(j) ); if (ErrStat3 > AbortErrLev) return - ! collect relevant outputs - AllOuts = 0.0_ReKi - call Set_NStC_Outs_Instance( j, x%NStC(j), m%NStC(j), y_StC, AllOuts) - call StC_DestroyInput( u_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - call StC_DestroyOutput( y_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - !------------------- - ! Store outputs - do I = 1,p%NumOuts ! Loop through all selected output channels - y_perturb%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) - enddo ! I - All selected output channels -! do I = 1,p%NumOuts_DLL ! Loop through all DLL logging channels -! y_perturb%WriteOutput(I+p%NumOuts) = m%dll_data%LogChannels( I ) -! enddo - end subroutine Jac_NStC_dYdu - - !> Calculated dYdu for TStC instance - subroutine Jac_TStC_dYdu( n, sgn, u_perturb, delta, y_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_InputType), intent(inout) :: u_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_OutputType), intent(inout) :: y_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: i,j,k ! Generic indices - type(StC_InputType) :: u_StC ! copy of the StC inputs for StC_CalcOutput call - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - real(ReKi) :: AllOuts(0:MaxOutPts) ! All the available output channels - perturbed (ReKi since WriteOutput is ReKi) - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_u_indx array. This allows us to simplify the number of calls dramatically - j = p%Jac_u_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - call SrvD_Perturb_u( p, n, sgn, u_perturb, delta ) - ! Transfer motion mesh to this particular instance - call StC_CopyInput( m%u_TStC(1,j), u_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - call Transfer_Point_to_Point( u_perturb%TStCMotionMesh(j), u_StC%Mesh(1), m%SrvD_MeshMap%u_TStC_Mot2_TStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! Set StC control channels - !call SetStCInput_CtrlChans(u_TStC) - ! call Calc - call StC_CopyOutput(m%y_TStC( j), y_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - CALL StC_CalcOutput( t, u_StC, p%TStC(j), x%TStC(j), xd%TStC(j), z%TStC(j), OtherState%TStC(j), y_StC, m%TStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - CALL Transfer_Point_to_Point( y_StC%Mesh(1), y_perturb%TStCLoadMesh(j), m%SrvD_MeshMap%TStC_Frc2_y_TStC(j), ErrStat3, ErrMsg3, u_perturb%TStCMotionMesh(j), u_perturb%TStCMotionMesh(j) ); if (ErrStat3 > AbortErrLev) return - ! collect relevant outputs - AllOuts = 0.0_ReKi - call Set_TStC_Outs_Instance( j, x%TStC(j), m%TStC(j), y_StC, AllOuts) - call StC_DestroyInput( u_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - call StC_DestroyOutput( y_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - !------------------- - ! Store outputs - do I = 1,p%NumOuts ! Loop through all selected output channels - y_perturb%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) - enddo ! I - All selected output channels -! do I = 1,p%NumOuts_DLL ! Loop through all DLL logging channels -! y_perturb%WriteOutput(I+p%NumOuts) = m%dll_data%LogChannels( I ) -! enddo - end subroutine Jac_TStC_dYdu - - !> Calculated dYdu for SStC instance - subroutine Jac_SStC_dYdu( n, sgn, u_perturb, delta, y_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_InputType), intent(inout) :: u_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_OutputType), intent(inout) :: y_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: i,j,k ! Generic indices - type(StC_InputType) :: u_StC ! copy of the StC inputs for StC_CalcOutput call - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - real(ReKi) :: AllOuts(0:MaxOutPts) ! All the available output channels - perturbed (ReKi since WriteOutput is ReKi) - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_u_indx array. This allows us to simplify the number of calls dramatically - j = p%Jac_u_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - call SrvD_Perturb_u( p, n, sgn, u_perturb, delta ) - ! Transfer motion mesh to this particular instance - call StC_CopyInput( m%u_SStC(1,j), u_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - call Transfer_Point_to_Point( u_perturb%SStCMotionMesh(j), u_StC%Mesh(1), m%SrvD_MeshMap%u_SStC_Mot2_SStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! Set StC control channels - !call SetStCInput_CtrlChans(u_SStC) - ! call Calc - call StC_CopyOutput(m%y_SStC( j), y_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - CALL StC_CalcOutput( t, u_StC, p%SStC(j), x%SStC(j), xd%SStC(j), z%SStC(j), OtherState%SStC(j), y_StC, m%SStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - CALL Transfer_Point_to_Point( y_StC%Mesh(1), y_perturb%SStCLoadMesh(j), m%SrvD_MeshMap%SStC_Frc2_y_SStC(j), ErrStat3, ErrMsg3, u_perturb%SStCMotionMesh(j), u_perturb%SStCMotionMesh(j) ); if (ErrStat3 > AbortErrLev) return - ! collect relevant outputs - AllOuts = 0.0_ReKi - call Set_SStC_Outs_Instance( j, x%SStC(j), m%SStC(j), y_StC, AllOuts) - call StC_DestroyInput( u_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - call StC_DestroyOutput( y_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - !------------------- - ! Store outputs - do I = 1,p%NumOuts ! Loop through all selected output channels - y_perturb%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) - enddo ! I - All selected output channels -! do I = 1,p%NumOuts_DLL ! Loop through all DLL logging channels -! y_perturb%WriteOutput(I+p%NumOuts) = m%dll_data%LogChannels( I ) -! enddo - end subroutine Jac_SStC_dYdu -end subroutine Jac_dYdu - -!> Calculate the jacobian dXdu -!! The only states exist with the StC instances -subroutine Jac_dXdu(t, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg, dXdu) - real(DbKi), intent(in ) :: t !< Time in seconds at operating point - type(SrvD_InputType), intent(inout) :: u !< Inputs at operating point (out for copy only) - type(SrvD_ParameterType), intent(in ) :: p !< Parameters - type(SrvD_ContinuousStateType), intent(in ) :: x !< Continuous states at operating point - type(SrvD_DiscreteStateType), intent(in ) :: xd !< Discrete states at operating point - type(SrvD_ConstraintStateType), intent(in ) :: z !< Constraint states at operating point - type(SrvD_OtherStateType), intent(in ) :: OtherState !< Other states at operating point - type(SrvD_MiscVarType), intent(inout) :: m !< Misc/optimization variables - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - real(R8Ki), allocatable, intent(inout) :: dXdu(:,:) !< Partial derivatives of output functions - - integer(IntKi) :: n ! Generic loop index - type(SrvD_InputType) :: u_perturb ! copy of inputs to perturb - type(SrvD_ContinuousStateType) :: dx_p ! states positive perturbed - type(SrvD_ContinuousStateType) :: dx_m ! states negative perturbed - real(R8Ki) :: delta_p ! delta+ change in input or state - real(R8Ki) :: delta_m ! delta- change in input or state - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'Jac_dXdu' - - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = '' - - ! Allocate the dXdu array regardless what states may or may not exist (glue code needs this) - if (.not. allocated(dXdu)) then - call allocAry(dXdu, p%Jac_nx, p%Jac_nu, 'dXdu', ErrStat2, ErrMsg2) - if (Failed()) return - elseif ( (size(dXdu,1) /= p%Jac_nx) .or. (size(dXdu,2) /= p%Jac_nu) ) then - deallocate(dXdu) - call allocAry(dXdu, p%Jac_nx, p%Jac_nu, 'dXdu', ErrStat2, ErrMsg2) - if (Failed()) return - endif - dXdu = 0.0_R8Ki - - !------------------------------------------------------------- - ! Perturb each StC instance individually and place in appropriate location in dXdu - ! Each StC is basically an isolated piece that doesn't interact with any other StC or with anything else in SrvD, - ! so we take advantage of that here for computational expediency. - !------------------------------------------------------------- - ! make a copy of the inputs to perturb if an StC exists - if ( (p%NumBStC + p%NumNStC + p%NumTStC + p%NumSStC) > 0 ) then - call SrvD_CopyInput( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - else - return ! nothing further to do here - endif - !------------------- - ! Blade StC - if (p%NumBStC > 0) then - do n=p%Jac_Idx_BStC_u(1,1,1),p%Jac_Idx_BStC_u(2,p%NumBl,p%NumBStC) ! input range for BStC + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdu)) then - ! perturb positive - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_BStC_dXdu( n, +1, u_perturb, delta_p, dx_p, ErrStat2, ErrMsg2 ); if (Failed()) return; + if (.not. allocated(dYdu)) then + call AllocAry(dYdu, Vars%Ny, Vars%Nu, 'dYdu', ErrStat2, ErrMsg2) + if (Failed()) return + end if - ! perturb negative - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_BStC_dXdu( n, -1, u_perturb, delta_m, dx_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Update copy of the inputs to perturb + call SrvD_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackInput(Vars, u, m%Jac%u) - ! Central difference - call Compute_dX( p, dx_p, dx_m, delta_p, delta_m, dXdu(:,n) ) - enddo - endif - !------------------- - ! Nacelle StC - if (p%NumNStC > 0) then - do n=p%Jac_Idx_NStC_u(1,1),p%Jac_Idx_NStC_u(2,p%NumNStC) ! input range for NStC + ! Loop through input variables + do i = 1, size(Vars%u) - ! perturb positive - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_NStC_dXdu( n, +1, u_perturb, delta_p, dx_p, ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num - ! perturb negative - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_NStC_dXdu( n, -1, u_perturb, delta_m, dx_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Calculate column index + iCol = Vars%u(i)%iLoc(1) + j - 1 - ! Central difference - call Compute_dX( p, dx_p, dx_m, delta_p, delta_m, dXdu(:,n) ) - enddo - endif - !------------------- - ! Tower StC - if (p%NumTStC > 0) then - do n=p%Jac_Idx_TStC_u(1,1),p%Jac_Idx_TStC_u(2,p%NumTStC) ! input range for TStC + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call SrvD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SrvD_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) - ! perturb positive - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_TStC_dXdu( n, +1, u_perturb, delta_p, dx_p, ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call SrvD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SrvD_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) - ! perturb negative - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_TStC_dXdu( n, -1, u_perturb, delta_m, dx_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,iCol)) + end do + end do + END IF - ! Central difference - call Compute_dX( p, dx_p, dx_m, delta_p, delta_m, dXdu(:,n) ) - enddo - endif - !------------------- - ! Substructure StC - if (p%NumSStC > 0) then - do n=p%Jac_Idx_SStC_u(1,1),p%Jac_Idx_SStC_u(2,p%NumSStC) ! input range for SStC + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + if (present(dXdu) .and. (m%Jac%Nx > 0)) then - ! perturb positive - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_SStC_dXdu( n, +1, u_perturb, delta_p, dx_p, ErrStat2, ErrMsg2 ); if (Failed()) return; + ! Allocate dXdu if not allocated + if (.not. allocated(dXdu)) then + call AllocAry(dXdu, m%Jac%Nx, m%Jac%Nu, 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return + end if + + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num + + ! Calculate column index + iCol = Vars%u(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call SrvD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SrvD_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call SrvD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SrvD_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdu(:,iCol) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%u(i)%Perturb) + end do + end do + END IF - ! perturb negative - call SrvD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_SStC_dXdu( n, -1, u_perturb, delta_m, dx_m, ErrStat2, ErrMsg2 ); if (Failed()) return; + if (present(dXddu)) then + if (allocated(dXddu)) deallocate(dXddu) + end if - ! Central difference - call Compute_dX( p, dx_p, dx_m, delta_p, delta_m, dXdu(:,n) ) - enddo - endif - call Cleanup() + if (present(dZdu)) then + if (allocated(dZdu)) deallocate(dZdu) + end if contains logical function Failed() CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) Failed = ErrStat >= AbortErrLev - if (Failed) call Cleanup end function Failed - - subroutine Cleanup() - ! Ignore any errors from the destroy (these weren't created if no StCs) - call SrvD_DestroyInput( u_perturb, ErrStat2, ErrMsg2 ) - call SrvD_DestroyContState( dx_p, ErrStat2, ErrMsg2 ) - call SrvD_DestroyContState( dx_m, ErrStat2, ErrMsg2 ) - end subroutine Cleanup - - !> Calculated dXdu for BStC instance - subroutine Jac_BStC_dXdu( n, sgn, u_perturb, delta, x_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_InputType), intent(inout) :: u_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: j,k ! Generic indices - type(StC_InputType) :: u_StC ! copy of the StC inputs for StC_CalcOutput call - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_u_indx array. This allows us to simplify the number of calls dramatically - k = p%Jac_u_indx(n,4) ! this blade - j = p%Jac_u_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_u( p, n, sgn, u_perturb, delta ) - ! Transfer motion mesh to this particular instance - call StC_CopyInput( m%u_BStC(1,j), u_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - call Transfer_Point_to_Point( u_perturb%BStCMotionMesh(k,j), u_StC%Mesh(k), m%SrvD_MeshMap%u_BStC_Mot2_BStC(k,j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! calculate change in ContState - call StC_CalcContStateDeriv( t, u_StC, p%BStC(j), x%BStC(j), xd%BStC(j), z%BStC(j), OtherState%BStC(j), m%BStC(j), x_perturb%BStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! cleanup - call StC_DestroyInput( u_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - end subroutine Jac_BStC_dXdu - - !> Calculated dXdu for NStC instance - subroutine Jac_NStC_dXdu( n, sgn, u_perturb, delta, x_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_InputType), intent(inout) :: u_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: j ! Generic indices - type(StC_InputType) :: u_StC ! copy of the StC inputs for StC_CalcOutput call - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_u_indx array. This allows us to simplify the number of calls dramatically - j = p%Jac_u_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_u( p, n, sgn, u_perturb, delta ) - ! Transfer motion mesh to this particular instance - call StC_CopyInput( m%u_NStC(1,j), u_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - call Transfer_Point_to_Point( u_perturb%NStCMotionMesh(j), u_StC%Mesh(1), m%SrvD_MeshMap%u_NStC_Mot2_NStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! calculate change in ContState - call StC_CalcContStateDeriv( t, u_StC, p%NStC(j), x%NStC(j), xd%NStC(j), z%NStC(j), OtherState%NStC(j), m%NStC(j), x_perturb%NStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! cleanup - call StC_DestroyInput( u_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - end subroutine Jac_NStC_dXdu - - !> Calculated dXdu for TStC instance - subroutine Jac_TStC_dXdu( n, sgn, u_perturb, delta, x_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_InputType), intent(inout) :: u_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: j ! Generic indices - type(StC_InputType) :: u_StC ! copy of the StC inputs for StC_CalcOutput call - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_u_indx array. This allows us to simplify the number of calls dramatically - j = p%Jac_u_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_u( p, n, sgn, u_perturb, delta ) - ! Transfer motion mesh to this particular instance - call StC_CopyInput( m%u_TStC(1,j), u_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - call Transfer_Point_to_Point( u_perturb%TStCMotionMesh(j), u_StC%Mesh(1), m%SrvD_MeshMap%u_TStC_Mot2_TStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! calculate change in ContState - call StC_CalcContStateDeriv( t, u_StC, p%TStC(j), x%TStC(j), xd%TStC(j), z%TStC(j), OtherState%TStC(j), m%TStC(j), x_perturb%TStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! cleanup - call StC_DestroyInput( u_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - end subroutine Jac_TStC_dXdu - - !> Calculated dXdu for SStC instance - subroutine Jac_SStC_dXdu( n, sgn, u_perturb, delta, x_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_InputType), intent(inout) :: u_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: j ! Generic indices - type(StC_InputType) :: u_StC ! copy of the StC inputs for StC_CalcOutput call - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_u_indx array. This allows us to simplify the number of calls dramatically - j = p%Jac_u_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_u( p, n, sgn, u_perturb, delta ) - ! Transfer motion mesh to this particular instance - call StC_CopyInput( m%u_SStC(1,j), u_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - call Transfer_Point_to_Point( u_perturb%SStCMotionMesh(j), u_StC%Mesh(1), m%SrvD_MeshMap%u_SStC_Mot2_SStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! calculate change in ContState - call StC_CalcContStateDeriv( t, u_StC, p%SStC(j), x%SStC(j), xd%SStC(j), z%SStC(j), OtherState%SStC(j), m%SStC(j), x_perturb%SStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - ! cleanup - call StC_DestroyInput( u_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - end subroutine Jac_SStC_dXdu -end subroutine Jac_dXdu - - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the single mesh point associated with the nth element of the u array -!! WARNING: this routine must exactly match Init_Jacobian::SrvD_Init_Jacobian_u -subroutine SrvD_Perturb_u( p, n, perturb_sign, u, du ) - type(SrvD_ParameterType), intent(in ) :: p !< parameters - integer(IntKi), intent(in ) :: n !< number of array element to use - integer(IntKi), intent(in ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - type(SrvD_InputType), intent(inout) :: u !< perturbed SrvD inputs - real(R8Ki), intent( out) :: du !< amount that specific input was perturbed - ! local variables - integer :: fieldIndx - integer :: instance, blade ! for StC mesh motions - fieldIndx = p%Jac_u_indx(n,2) - instance = p%Jac_u_indx(n,3) - blade = p%Jac_u_indx(n,4) - du = p%du( p%Jac_u_indx(n,1) ) - ! determine which mesh we're trying to perturb and perturb the input: - select case( p%Jac_u_indx(n,1) ) - !------------------------------- - ! 1:6 --> u%BStCMotionMesh(:,:)% - case ( 1) ! TranslationDisp = 1; - u%BStCMotionMesh(blade,instance)%TranslationDisp(fieldIndx,1) = u%BStCMotionMesh(blade,instance)%TranslationDisp(fieldIndx,1) + du * perturb_sign - case ( 2) ! Orientation = 2; - CALL PerturbOrientationMatrix( u%BStCMotionMesh(blade,instance)%Orientation(:,:,1), du * perturb_sign, fieldIndx ) - case ( 3) ! TranslationVel = 3; - u%BStCMotionMesh(blade,instance)%TranslationVel( fieldIndx,1) = u%BStCMotionMesh(blade,instance)%TranslationVel( fieldIndx,1) + du * perturb_sign - case ( 4) ! RotationVel = 4; - u%BStCMotionMesh(blade,instance)%RotationVel( fieldIndx,1) = u%BStCMotionMesh(blade,instance)%RotationVel( fieldIndx,1) + du * perturb_sign - case ( 5) ! TranslationAcc = 5; - u%BStCMotionMesh(blade,instance)%TranslationAcc( fieldIndx,1) = u%BStCMotionMesh(blade,instance)%TranslationAcc( fieldIndx,1) + du * perturb_sign - case ( 6) ! RotationAcc = 6; - u%BStCMotionMesh(blade,instance)%RotationAcc( fieldIndx,1) = u%BStCMotionMesh(blade,instance)%RotationAcc( fieldIndx,1) + du * perturb_sign - !------------------------------- - ! 7:12 --> u%NStCMotionMesh(:)% - case ( 7) ! TranslationDisp = 1; - u%NStCMotionMesh(instance)%TranslationDisp(fieldIndx,1) = u%NStCMotionMesh(instance)%TranslationDisp(fieldIndx,1) + du * perturb_sign - case ( 8) ! Orientation = 2; - CALL PerturbOrientationMatrix( u%NStCMotionMesh(instance)%Orientation(:,:,1), du * perturb_sign, fieldIndx ) - case ( 9) ! TranslationVel = 3; - u%NStCMotionMesh(instance)%TranslationVel( fieldIndx,1) = u%NStCMotionMesh(instance)%TranslationVel( fieldIndx,1) + du * perturb_sign - case (10) ! RotationVel = 4; - u%NStCMotionMesh(instance)%RotationVel( fieldIndx,1) = u%NStCMotionMesh(instance)%RotationVel( fieldIndx,1) + du * perturb_sign - case (11) ! TranslationAcc = 5; - u%NStCMotionMesh(instance)%TranslationAcc( fieldIndx,1) = u%NStCMotionMesh(instance)%TranslationAcc( fieldIndx,1) + du * perturb_sign - case (12) ! RotationAcc = 6; - u%NStCMotionMesh(instance)%RotationAcc( fieldIndx,1) = u%NStCMotionMesh(instance)%RotationAcc( fieldIndx,1) + du * perturb_sign - !------------------------------- - ! 13:18 --> u%TStCMotionMesh(:)% - case (13) ! TranslationDisp = 1; - u%TStCMotionMesh(instance)%TranslationDisp(fieldIndx,1) = u%TStCMotionMesh(instance)%TranslationDisp(fieldIndx,1) + du * perturb_sign - case (14) ! Orientation = 2; - CALL PerturbOrientationMatrix( u%TStCMotionMesh(instance)%Orientation(:,:,1), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - case (15) ! TranslationVel = 3; - u%TStCMotionMesh(instance)%TranslationVel( fieldIndx,1) = u%TStCMotionMesh(instance)%TranslationVel( fieldIndx,1) + du * perturb_sign - case (16) ! RotationVel = 4; - u%TStCMotionMesh(instance)%RotationVel( fieldIndx,1) = u%TStCMotionMesh(instance)%RotationVel( fieldIndx,1) + du * perturb_sign - case (17) ! TranslationAcc = 5; - u%TStCMotionMesh(instance)%TranslationAcc( fieldIndx,1) = u%TStCMotionMesh(instance)%TranslationAcc( fieldIndx,1) + du * perturb_sign - case (18) ! RotationAcc = 6; - u%TStCMotionMesh(instance)%RotationAcc( fieldIndx,1) = u%TStCMotionMesh(instance)%RotationAcc( fieldIndx,1) + du * perturb_sign - !------------------------------- - ! 19:24 --> u%SStCMotionMesh(:)% - case (19) ! TranslationDisp = 1; - u%SStCMotionMesh(instance)%TranslationDisp(fieldIndx,1) = u%SStCMotionMesh(instance)%TranslationDisp(fieldIndx,1) + du * perturb_sign - case (20) ! Orientation = 2; - CALL PerturbOrientationMatrix( u%SStCMotionMesh(instance)%Orientation(:,:,1), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - case (21) ! TranslationVel = 3; - u%SStCMotionMesh(instance)%TranslationVel( fieldIndx,1) = u%SStCMotionMesh(instance)%TranslationVel( fieldIndx,1) + du * perturb_sign - case (22) ! RotationVel = 4; - u%SStCMotionMesh(instance)%RotationVel( fieldIndx,1) = u%SStCMotionMesh(instance)%RotationVel( fieldIndx,1) + du * perturb_sign - case (23) ! TranslationAcc = 5; - u%SStCMotionMesh(instance)%TranslationAcc( fieldIndx,1) = u%SStCMotionMesh(instance)%TranslationAcc( fieldIndx,1) + du * perturb_sign - case (24) ! RotationAcc = 6; - u%SStCMotionMesh(instance)%RotationAcc( fieldIndx,1) = u%SStCMotionMesh(instance)%RotationAcc( fieldIndx,1) + du * perturb_sign - end select -end subroutine SrvD_Perturb_u - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the single mesh point associated with the nth element of the u array -!! WARNING: this routine must exactly match Init_Jacobian::SrvD_Init_Jacobian_x -subroutine SrvD_Perturb_x( p, n, perturb_sign, x, dx ) - type(SrvD_ParameterType), intent(in ) :: p !< parameters - integer(IntKi), intent(in ) :: n !< number of array element to use - integer(IntKi), intent(in ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - type(SrvD_ContinuousStateType), intent(inout) :: x !< perturbed SrvD ContStates - real(R8Ki), intent( out) :: dx !< amount that specific input was perturbed - ! local variables - integer :: component - integer :: instance, blade ! for StC mesh motions - component = p%Jac_x_indx(n,2) ! component (x,y,z) -- unused - instance = p%Jac_x_indx(n,3) - blade = p%Jac_x_indx(n,4) - dx = p%dx( p%Jac_x_indx(n,1) ) - ! determine which mesh we're trying to perturb and perturb the input: - select case( p%Jac_x_indx(n,1) ) ! StC+field index - !------------------------------- - ! 1:6 --> x%BStC(instance)%StC_x - case ( 1) ! x - x%BStC(instance)%StC_x(1,blade) = x%BStC(instance)%StC_x(1,blade) + dx * perturb_sign - case ( 2) ! y - x%BStC(instance)%StC_x(3,blade) = x%BStC(instance)%StC_x(3,blade) + dx * perturb_sign - case ( 3) ! z - x%BStC(instance)%StC_x(5,blade) = x%BStC(instance)%StC_x(5,blade) + dx * perturb_sign - case ( 4) ! x-dot - x%BStC(instance)%StC_x(2,blade) = x%BStC(instance)%StC_x(2,blade) + dx * perturb_sign - case ( 5) ! y-dot - x%BStC(instance)%StC_x(4,blade) = x%BStC(instance)%StC_x(4,blade) + dx * perturb_sign - case ( 6) ! z-dot - x%BStC(instance)%StC_x(6,blade) = x%BStC(instance)%StC_x(6,blade) + dx * perturb_sign - !------------------------------- - ! 7:12 --> x%NStC(instance)%StC_x - case ( 7) ! x - x%NStC(instance)%StC_x(1,1) = x%NStC(instance)%StC_x(1,1) + dx * perturb_sign - case ( 8) ! y - x%NStC(instance)%StC_x(3,1) = x%NStC(instance)%StC_x(3,1) + dx * perturb_sign - case ( 9) ! z - x%NStC(instance)%StC_x(5,1) = x%NStC(instance)%StC_x(5,1) + dx * perturb_sign - case (10) ! x-dot - x%NStC(instance)%StC_x(2,1) = x%NStC(instance)%StC_x(2,1) + dx * perturb_sign - case (11) ! y-dot - x%NStC(instance)%StC_x(4,1) = x%NStC(instance)%StC_x(4,1) + dx * perturb_sign - case (12) ! z-dot - x%NStC(instance)%StC_x(6,1) = x%NStC(instance)%StC_x(6,1) + dx * perturb_sign - !------------------------------- - ! 13:18 --> x%TStC(instance)%StC_x - case (13) ! x - x%TStC(instance)%StC_x(1,1) = x%TStC(instance)%StC_x(1,1) + dx * perturb_sign - case (14) ! y - x%TStC(instance)%StC_x(3,1) = x%TStC(instance)%StC_x(3,1) + dx * perturb_sign - case (15) ! z - x%TStC(instance)%StC_x(5,1) = x%TStC(instance)%StC_x(5,1) + dx * perturb_sign - case (16) ! x-dot - x%TStC(instance)%StC_x(2,1) = x%TStC(instance)%StC_x(2,1) + dx * perturb_sign - case (17) ! y-dot - x%TStC(instance)%StC_x(4,1) = x%TStC(instance)%StC_x(4,1) + dx * perturb_sign - case (18) ! z-dot - x%TStC(instance)%StC_x(6,1) = x%TStC(instance)%StC_x(6,1) + dx * perturb_sign - !------------------------------- - ! 19:24 --> x%SStC(instance)%StC_x - case (19) ! x - x%SStC(instance)%StC_x(1,1) = x%SStC(instance)%StC_x(1,1) + dx * perturb_sign - case (20) ! y - x%SStC(instance)%StC_x(3,1) = x%SStC(instance)%StC_x(3,1) + dx * perturb_sign - case (21) ! z - x%SStC(instance)%StC_x(5,1) = x%SStC(instance)%StC_x(5,1) + dx * perturb_sign - case (22) ! x-dot - x%SStC(instance)%StC_x(2,1) = x%SStC(instance)%StC_x(2,1) + dx * perturb_sign - case (23) ! y-dot - x%SStC(instance)%StC_x(4,1) = x%SStC(instance)%StC_x(4,1) + dx * perturb_sign - case (24) ! z-dot - x%SStC(instance)%StC_x(6,1) = x%SStC(instance)%StC_x(6,1) + dx * perturb_sign - end select -end subroutine SrvD_Perturb_x - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine servodyn::SrvD_Init_Jacobian_y is consistant with this routine! -SUBROUTINE Compute_dY(p, y_p, y_m, delta_p, delta_m, dY) - type(SrvD_ParameterType), intent(in ) :: p !< parameters - type(SrvD_OutputType), intent(in ) :: y_p !< SrvD outputs at \f$ u + \Delta u \f$ or \f$ x + \Delta x \f$ (p=plus) - type(SrvD_OutputType), intent(in ) :: y_m !< SrvD outputs at \f$ u - \Delta u \f$ or \f$ x - \Delta x \f$ (m=minus) - real(R8Ki), intent(in ) :: delta_p !< difference in inputs or states \f$ delta = \Delta u \f$ or \f$ delta = \Delta x \f$ - real(R8Ki), intent(in ) :: delta_m !< difference in inputs or states \f$ delta = \Delta u \f$ or \f$ delta = \Delta x \f$ - real(R8Ki), intent(inout) :: dY(:) !< column of dYdu or dYdx: \f$ \frac{\partial Y}{\partial u_i} = \frac{y_p - y_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial Y}{\partial x_i} = \frac{y_p - y_m}{2 \, \Delta x}\f$ - - ! local variables: - integer(IntKi) :: i,j,k ! generic counters - integer(IntKi) :: indx_first ! index indicating next value of dY to be filled - integer(IntKi) :: SrvD_Indx_Y_WrOutput - - ! StC related outputs - if (p%NumBStC > 0) then - do j=1,p%NumBStC - do i=1,p%NumBl - indx_first = p%Jac_Idx_BStC_y(1,i,j) - call PackLoadMesh_dY( y_p%BStCLoadMesh(i,j), y_m%BStCLoadMesh(i,j), dY, indx_first ) - enddo - enddo - endif - if (p%NumNStC > 0) then - do j=1,p%NumNStC - indx_first = p%Jac_Idx_NStC_y(1,j) - call PackLoadMesh_dY( y_p%NStCLoadMesh(j), y_m%NStCLoadMesh(j), dY, indx_first ) - enddo - endif - if (p%NumTStC > 0) then - do j=1,p%NumTStC - indx_first = p%Jac_Idx_TStC_y(1,j) - call PackLoadMesh_dY( y_p%TStCLoadMesh(j), y_m%TStCLoadMesh(j), dY, indx_first ) - enddo - endif - if (p%NumSStC > 0) then - do j=1,p%NumSStC - indx_first = p%Jac_Idx_SStC_y(1,j) - call PackLoadMesh_dY( y_p%SStCLoadMesh(j), y_m%SStCLoadMesh(j), dY, indx_first ) - enddo - endif - - ! outputs - SrvD_Indx_Y_WrOutput = p%Jac_ny - p%NumOuts ! Index to location before user requested outputs - do k=1,p%NumOuts - dY(SrvD_Indx_Y_WrOutput+k) = real( y_p%WriteOutput(k) - y_m%WriteOutput(k), R8Ki ) - end do - - dY = dY / (delta_p + delta_m) -END SUBROUTINE Compute_dY - -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine servodyn::SrvD_Init_Jacobian_x is consistant with this routine! -subroutine Compute_dX( p, x_p, x_m, delta_p, delta_m, dX ) - type(SrvD_ParameterType), intent(in ) :: p !< parameters - type(SrvD_ContinuousStateType), intent(in ) :: x_p !< SrvD continuous states at \f$ u + \Delta u \f$ or \f$ x + \Delta x \f$ (p=plus) - type(SrvD_ContinuousStateType), intent(in ) :: x_m !< SrvD continuous states at \f$ u - \Delta u \f$ or \f$ x - \Delta x \f$ (m=minus) - real(R8Ki), intent(in ) :: delta_p !< difference in inputs or states \f$ delta = \Delta u \f$ or \f$ delta = \Delta x \f$ - real(R8Ki), intent(in ) :: delta_m !< difference in inputs or states \f$ delta = \Delta u \f$ or \f$ delta = \Delta x \f$ - real(R8Ki), intent(inout) :: dX(:) !< column of dXdu or dXdx: \f$ \frac{\partial X}{\partial u_i} = \frac{x_p - x_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial X}{\partial x_i} = \frac{x_p - x_m}{2 \, \Delta x}\f$ - - ! local variables: - integer(IntKi) :: i,j,k ! generic counters - integer(IntKi) :: indx_prev ! index indicating index in dX before this one to be filled - - ! StC related outputs - if (p%NumBStC > 0) then - do j=1,p%NumBStC - do k=1,p%NumBl - indx_prev = p%Jac_Idx_BStC_x(1,k,j)-1 - dX(indx_prev+1) = x_p%BStC(j)%StC_x(1,k) - x_m%BStC(j)%StC_x(1,k) ! x x%BStC(j)%StC_x(1,k) - dX(indx_prev+2) = x_p%BStC(j)%StC_x(3,k) - x_m%BStC(j)%StC_x(3,k) ! y x%BStC(j)%StC_x(3,k) - dX(indx_prev+3) = x_p%BStC(j)%StC_x(5,k) - x_m%BStC(j)%StC_x(5,k) ! z x%BStC(j)%StC_x(5,k) - dX(indx_prev+4) = x_p%BStC(j)%StC_x(2,k) - x_m%BStC(j)%StC_x(2,k) ! x-dot x%BStC(j)%StC_x(2,k) - dX(indx_prev+5) = x_p%BStC(j)%StC_x(4,k) - x_m%BStC(j)%StC_x(4,k) ! y-dot x%BStC(j)%StC_x(4,k) - dX(indx_prev+6) = x_p%BStC(j)%StC_x(6,k) - x_m%BStC(j)%StC_x(6,k) ! z-dot x%BStC(j)%StC_x(6,k) - indx_prev = indx_prev + 6 - enddo - enddo - endif - if (p%NumNStC > 0) then - do j=1,p%NumNStC - indx_prev = p%Jac_Idx_NStC_x(1,j)-1 - dX(indx_prev+1) = x_p%NStC(j)%StC_x(1,1) - x_m%NStC(j)%StC_x(1,1) ! x x%NStC(j)%StC_x(1,1) - dX(indx_prev+2) = x_p%NStC(j)%StC_x(3,1) - x_m%NStC(j)%StC_x(3,1) ! y x%NStC(j)%StC_x(3,1) - dX(indx_prev+3) = x_p%NStC(j)%StC_x(5,1) - x_m%NStC(j)%StC_x(5,1) ! z x%NStC(j)%StC_x(5,1) - dX(indx_prev+4) = x_p%NStC(j)%StC_x(2,1) - x_m%NStC(j)%StC_x(2,1) ! x-dot x%NStC(j)%StC_x(2,1) - dX(indx_prev+5) = x_p%NStC(j)%StC_x(4,1) - x_m%NStC(j)%StC_x(4,1) ! y-dot x%NStC(j)%StC_x(4,1) - dX(indx_prev+6) = x_p%NStC(j)%StC_x(6,1) - x_m%NStC(j)%StC_x(6,1) ! z-dot x%NStC(j)%StC_x(6,1) - indx_prev = indx_prev + 6 - enddo - endif - if (p%NumTStC > 0) then - do j=1,p%NumTStC - indx_prev = p%Jac_Idx_TStC_x(1,j)-1 - dX(indx_prev+1) = x_p%TStC(j)%StC_x(1,1) - x_m%TStC(j)%StC_x(1,1) ! x x%TStC(j)%StC_x(1,1) - dX(indx_prev+2) = x_p%TStC(j)%StC_x(3,1) - x_m%TStC(j)%StC_x(3,1) ! y x%TStC(j)%StC_x(3,1) - dX(indx_prev+3) = x_p%TStC(j)%StC_x(5,1) - x_m%TStC(j)%StC_x(5,1) ! z x%TStC(j)%StC_x(5,1) - dX(indx_prev+4) = x_p%TStC(j)%StC_x(2,1) - x_m%TStC(j)%StC_x(2,1) ! x-dot x%TStC(j)%StC_x(2,1) - dX(indx_prev+5) = x_p%TStC(j)%StC_x(4,1) - x_m%TStC(j)%StC_x(4,1) ! y-dot x%TStC(j)%StC_x(4,1) - dX(indx_prev+6) = x_p%TStC(j)%StC_x(6,1) - x_m%TStC(j)%StC_x(6,1) ! z-dot x%TStC(j)%StC_x(6,1) - indx_prev = indx_prev + 6 - enddo - endif - if (p%NumSStC > 0) then - do j=1,p%NumSStC - indx_prev = p%Jac_Idx_SStC_x(1,j)-1 - dX(indx_prev+1) = x_p%SStC(j)%StC_x(1,1) - x_m%SStC(j)%StC_x(1,1) ! x x%SStC(j)%StC_x(1,1) - dX(indx_prev+2) = x_p%SStC(j)%StC_x(3,1) - x_m%SStC(j)%StC_x(3,1) ! y x%SStC(j)%StC_x(3,1) - dX(indx_prev+3) = x_p%SStC(j)%StC_x(5,1) - x_m%SStC(j)%StC_x(5,1) ! z x%SStC(j)%StC_x(5,1) - dX(indx_prev+4) = x_p%SStC(j)%StC_x(2,1) - x_m%SStC(j)%StC_x(2,1) ! x-dot x%SStC(j)%StC_x(2,1) - dX(indx_prev+5) = x_p%SStC(j)%StC_x(4,1) - x_m%SStC(j)%StC_x(4,1) ! y-dot x%SStC(j)%StC_x(4,1) - dX(indx_prev+6) = x_p%SStC(j)%StC_x(6,1) - x_m%SStC(j)%StC_x(6,1) ! z-dot x%SStC(j)%StC_x(6,1) - indx_prev = indx_prev + 6 - enddo - endif - - dX = dX / (delta_p + delta_m) -end subroutine Compute_dX - +END SUBROUTINE SrvD_JacobianPInput !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and DZ/dx are returned. !! Note SrvD does not have continuous states, so these are not set. -SUBROUTINE SrvD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +SUBROUTINE SrvD_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) !.................................................................................................................................. + type(ModVarsType), intent(in ) :: Vars !< Module vars real(DbKi), intent(in ) :: t !< Time in seconds at operating point type(SrvD_InputType), intent(in ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) type(SrvD_ParameterType), intent(in ) :: p !< Parameters @@ -3560,554 +2476,100 @@ SUBROUTINE SrvD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat integer(IntKi) :: ErrStat2 ! Error status of the operation character(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat /= ErrID_None character(*), parameter :: RoutineName = 'SrvD_JacobianPContState' + integer(IntKi) :: i, j, iCol ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: - IF ( PRESENT( dYdx ) ) THEN - call Jac_dYdx( t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2, dYdx ) - if (Failed()) return - END IF + ! Copy state values + call SrvD_CopyContState(x, m%x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackContState(Vars, x, m%Jac%x) - IF ( PRESENT( dXdx ) ) THEN - call Jac_dXdx( t, u, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2, dXdx ) - if (Failed()) return - END IF + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdx)) then - IF ( PRESENT( dXddx ) ) THEN - if (allocated(dXddx)) deallocate(dXddx) - END IF + ! Allocate dYdx if not allocated + if (.not. allocated(dYdx)) then + call AllocAry(dYdx, m%Jac%Ny, m%Jac%Nx, 'dYdx', ErrStat2, ErrMsg2); if (Failed()) return + end if - IF ( PRESENT( dZdx ) ) THEN - if (allocated(dZdx)) deallocate(dZdx) - END IF + ! Loop through state variables + do i = 1, size(Vars%x) -contains - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - end function Failed -END SUBROUTINE SrvD_JacobianPContState + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num -!> Calculate the jacobian dYdx -subroutine Jac_dYdx( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx ) - real(DbKi), intent(in ) :: t !< Time in seconds at operating point - type(SrvD_InputType), intent(in ) :: u !< Inputs at operating point - type(SrvD_ParameterType), intent(in ) :: p !< Parameters - type(SrvD_ContinuousStateType), intent(in ) :: x !< Continuous states at operating point - type(SrvD_DiscreteStateType), intent(in ) :: xd !< Discrete states at operating point - type(SrvD_ConstraintStateType), intent(in ) :: z !< Constraint states at operating point - type(SrvD_OtherStateType), intent(in ) :: OtherState !< Other states at operating point - type(SrvD_OutputType), intent(inout) :: y !< Output (need to make copies) - type(SrvD_MiscVarType), intent(inout) :: m !< Misc/optimization variables - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - real(R8Ki), allocatable, intent(inout) :: dYdx(:,:) !< Partial derivatives of output functions - - integer(IntKi) :: n ! Generic loop index -- index to x for perturb - type(SrvD_OutputType) :: y_p ! outputs positive perturbed - type(SrvD_OutputType) :: y_m ! outputs negative perturbed - type(SrvD_ContinuousStateType) :: x_temp ! copy of inputs to perturb - real(R8Ki) :: delta_p ! delta+ change in input or state - real(R8Ki) :: delta_m ! delta- change in input or state - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'Jac_dYdx' + ! Calculate column index + iCol = Vars%x(i)%iLoc(1) + j - 1 - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = '' + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call SrvD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SrvD_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) - ! Allocate the dYdx array regardless what states may or may not exist (glue code needs this) - if (.not. allocated(dYdx)) then - call allocAry(dYdx, p%Jac_ny, p%Jac_nx, 'dYdx', ErrStat2, ErrMsg2) - if (Failed()) return - elseif ( (size(dYdx,1) /= p%Jac_ny) .or. (size(dYdx,2) /= p%Jac_nx) ) then - deallocate(dYdx) - call allocAry(dYdx, p%Jac_ny, p%Jac_nx, 'dYdx', ErrStat2, ErrMsg2) - if (Failed()) return - endif - dYdx = 0.0_R8Ki - - !------------------------------------------------------------- - ! Perturb each StC instance individually and place in appropriate location in dYdx - ! Each StC is basically an isolated piece that doesn't interact with any other StC or with anything else in SrvD, - ! so we take advantage of that here for computational expediency. - !------------------------------------------------------------- - ! make a copy of the inputs to perturb if an StC exists - if ( (p%NumBStC + p%NumNStC + p%NumTStC + p%NumSStC) > 0 ) then - call SrvD_CopyContState( x, x_temp, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - else - return ! Nothing further to do here - endif - !------------------- - ! Blade StC - if (p%NumBStC > 0) then - do n=p%Jac_Idx_BStC_x(1,1,1),p%Jac_Idx_BStC_x(2,p%NumBl,p%NumBStC) ! state range for BStC - ! perturb positive - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_BStC_dYdx( n, +1, x_temp, delta_p, y_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_BStC_dYdx( n, -1, x_temp, delta_m, y_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dY( p, y_p, y_m, delta_p, delta_m, dYdx(:,n) ) - enddo - endif - !------------------- - ! Nacelle StC - if (p%NumNStC > 0) then - do n=p%Jac_Idx_NStC_x(1,1),p%Jac_Idx_NStC_x(2,p%NumNStC) ! state range for NStC - ! perturb positive - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_NStC_dYdx( n, +1, x_temp, delta_p, y_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_NStC_dYdx( n, -1, x_temp, delta_m, y_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dY( p, y_p, y_m, delta_p, delta_m, dYdx(:,n) ) - enddo - endif - !------------------- - ! Tower StC - if (p%NumTStC > 0) then - do n=p%Jac_Idx_TStC_x(1,1),p%Jac_Idx_TStC_x(2,p%NumTStC) ! state range for TStC - ! perturb positive - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_TStC_dYdx( n, +1, x_temp, delta_p, y_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_TStC_dYdx( n, -1, x_temp, delta_m, y_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dY( p, y_p, y_m, delta_p, delta_m, dYdx(:,n) ) - enddo - endif - !------------------- - ! Substructure StC - if (p%NumSStC > 0) then - do n=p%Jac_Idx_SStC_x(1,1),p%Jac_Idx_SStC_x(2,p%NumSStC) ! state range for SStC - ! perturb positive - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_SStC_dYdx( n, +1, x_temp, delta_p, y_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyOutput( y, y_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_SStC_dYdx( n, -1, x_temp, delta_m, y_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dY( p, y_p, y_m, delta_p, delta_m, dYdx(:,n) ) - enddo - endif - call Cleanup() + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call SrvD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SrvD_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) -contains - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - if (Failed) call Cleanup - end function Failed + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%x(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdx(:,iCol)) + end do + end do + end if - subroutine Cleanup() - ! Ignore any errors from the destroy (these weren't created if no StCs) - call SrvD_DestroyContState( x_temp, ErrStat2, ErrMsg2 ) - call SrvD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call SrvD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - end subroutine Cleanup + ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + if (present(dXdx) .and. (m%Jac%Nx > 0)) then - !> Calculated dYdx for BStC instance - subroutine Jac_BStC_dYdx( n, sgn, x_perturb, delta, y_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_OutputType), intent(inout) :: y_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: i,j,k ! Generic indices - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - real(ReKi) :: AllOuts(0:MaxOutPts) ! All the available output channels - perturbed (ReKi since WriteOutput is ReKi) - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_x_indx array. This allows us to simplify the number of calls dramatically - k = p%Jac_x_indx(n,4) ! this blade - j = p%Jac_x_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_x( p, n, sgn, x_perturb, delta ) - ! call Calc - call StC_CopyOutput(m%y_BStC( j), y_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - CALL StC_CalcOutput( t, m%u_BStC(1,j), p%BStC(j), x_perturb%BStC(j), xd%BStC(j), z%BStC(j), OtherState%BStC(j), y_StC, m%BStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - CALL Transfer_Point_to_Point( y_StC%Mesh(k), y_perturb%BStCLoadMesh(k,j), m%SrvD_MeshMap%BStC_Frc2_y_BStC(k,j), ErrStat3, ErrMsg3, u%BStCMotionMesh(k,j), u%BStCMotionMesh(k,j) ); if (ErrStat3 > AbortErrLev) return - ! collect relevant outputs - AllOuts = 0.0_ReKi - call Set_BStC_Outs_Instance(j, p%NumBl, x_perturb%BStC(j), m%BStC(j), y_StC, AllOuts) - call StC_DestroyOutput( y_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - !------------------- - ! Store outputs - do I = 1,p%NumOuts ! Loop through all selected output channels - y_perturb%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) - enddo -! do I = 1,p%NumOuts_DLL ! Loop through all DLL logging channels -! y_perturb%WriteOutput(I+p%NumOuts) = m%dll_data%LogChannels( I ) -! enddo - end subroutine Jac_BStC_dYdx - - !> Calculated dYdx for NStC instance - subroutine Jac_NStC_dYdx( n, sgn, x_perturb, delta, y_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_OutputType), intent(inout) :: y_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: i,j ! Generic indices - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - real(ReKi) :: AllOuts(0:MaxOutPts) ! All the available output channels - perturbed (ReKi since WriteOutput is ReKi) - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_x_indx array. This allows us to simplify the number of calls dramatically - j = p%Jac_x_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_x( p, n, sgn, x_perturb, delta ) - ! call Calc - call StC_CopyOutput(m%y_NStC( j), y_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - CALL StC_CalcOutput( t, m%u_NStC(1,j), p%NStC(j), x_perturb%NStC(j), xd%NStC(j), z%NStC(j), OtherState%NStC(j), y_StC, m%NStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - CALL Transfer_Point_to_Point( y_StC%Mesh(1), y_perturb%NStCLoadMesh(j), m%SrvD_MeshMap%NStC_Frc2_y_NStC(j), ErrStat3, ErrMsg3, u%NStCMotionMesh(j), u%NStCMotionMesh(j) ); if (ErrStat3 > AbortErrLev) return - ! collect relevant outputs - AllOuts = 0.0_ReKi - call Set_NStC_Outs_Instance(j, x_perturb%NStC(j), m%NStC(j), y_StC, AllOuts) - call StC_DestroyOutput( y_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - !------------------- - ! Store outputs - do I = 1,p%NumOuts ! Loop through all selected output channels - y_perturb%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) - enddo -! do I = 1,p%NumOuts_DLL ! Loop through all DLL logging channels -! y_perturb%WriteOutput(I+p%NumOuts) = m%dll_data%LogChannels( I ) -! enddo - end subroutine Jac_NStC_dYdx - - !> Calculated dYdx for TStC instance - subroutine Jac_TStC_dYdx( n, sgn, x_perturb, delta, y_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_OutputType), intent(inout) :: y_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: i,j ! Generic indices - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - real(ReKi) :: AllOuts(0:MaxOutPts) ! All the available output channels - perturbed (ReKi since WriteOutput is ReKi) - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_x_indx array. This allows us to simplify the number of calls dramatically - j = p%Jac_x_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_x( p, n, sgn, x_perturb, delta ) - ! call Calc - call StC_CopyOutput(m%y_TStC( j), y_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - CALL StC_CalcOutput( t, m%u_TStC(1,j), p%TStC(j), x_perturb%TStC(j), xd%TStC(j), z%TStC(j), OtherState%TStC(j), y_StC, m%TStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - CALL Transfer_Point_to_Point( y_StC%Mesh(1), y_perturb%TStCLoadMesh(j), m%SrvD_MeshMap%TStC_Frc2_y_TStC(j), ErrStat3, ErrMsg3, u%TStCMotionMesh(j), u%TStCMotionMesh(j) ); if (ErrStat3 > AbortErrLev) return - ! collect relevant outputs - AllOuts = 0.0_ReKi - call Set_TStC_Outs_Instance(j, x_perturb%TStC(j), m%TStC(j), y_StC, AllOuts) - call StC_DestroyOutput( y_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - !------------------- - ! Store outputs - do I = 1,p%NumOuts ! Loop through all selected output channels - y_perturb%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) - enddo -! do I = 1,p%NumOuts_DLL ! Loop through all DLL logging channels -! y_perturb%WriteOutput(I+p%NumOuts) = m%dll_data%LogChannels( I ) -! enddo - end subroutine Jac_TStC_dYdx - - !> Calculated dYdx for SStC instance - subroutine Jac_SStC_dYdx( n, sgn, x_perturb, delta, y_perturb, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! copy of inputs to perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - type(SrvD_OutputType), intent(inout) :: y_perturb ! outputs perturbed - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: i,j ! Generic indices - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - real(ReKi) :: AllOuts(0:MaxOutPts) ! All the available output channels - perturbed (ReKi since WriteOutput is ReKi) - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_x_indx array. This allows us to simplify the number of calls dramatically - j = p%Jac_x_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_x( p, n, sgn, x_perturb, delta ) - ! call Calc - call StC_CopyOutput(m%y_SStC( j), y_StC, MESH_NEWCOPY, ErrStat3, ErrMsg3); if (ErrStat3 > AbortErrLev) return - CALL StC_CalcOutput( t, m%u_SStC(1,j), p%SStC(j), x_perturb%SStC(j), xd%SStC(j), z%SStC(j), OtherState%SStC(j), y_StC, m%SStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - CALL Transfer_Point_to_Point( y_StC%Mesh(1), y_perturb%SStCLoadMesh(j), m%SrvD_MeshMap%SStC_Frc2_y_SStC(j), ErrStat3, ErrMsg3, u%SStCMotionMesh(j), u%SStCMotionMesh(j) ); if (ErrStat3 > AbortErrLev) return - ! collect relevant outputs - AllOuts = 0.0_ReKi - call Set_SStC_Outs_Instance(j, x_perturb%SStC(j), m%SStC(j), y_StC, AllOuts) - call StC_DestroyOutput( y_StC, ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - !------------------- - ! Store outputs - do I = 1,p%NumOuts ! Loop through all selected output channels - y_perturb%WriteOutput(I) = p%OutParam(I)%SignM * AllOuts( p%OutParam(I)%Indx ) - enddo -! do I = 1,p%NumOuts_DLL ! Loop through all DLL logging channels -! y_perturb%WriteOutput(I+p%NumOuts) = m%dll_data%LogChannels( I ) -! enddo - end subroutine Jac_SStC_dYdx -end subroutine Jac_dYdx - -!> Calculate the jacobian dXdx -!! The only states exist with the StC instances -subroutine Jac_dXdx(t, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg, dXdx) - real(DbKi), intent(in ) :: t !< Time in seconds at operating point - type(SrvD_InputType), intent(in ) :: u !< Inputs at operating point - type(SrvD_ParameterType), intent(in ) :: p !< Parameters - type(SrvD_ContinuousStateType), intent(in ) :: x !< Continuous states at operating point - type(SrvD_DiscreteStateType), intent(in ) :: xd !< Discrete states at operating point - type(SrvD_ConstraintStateType), intent(in ) :: z !< Constraint states at operating point - type(SrvD_OtherStateType), intent(in ) :: OtherState !< Other states at operating point - type(SrvD_MiscVarType), intent(inout) :: m !< Misc/optimization variables - integer(IntKi), intent( out) :: ErrStat !< Error status of the operation - character(*), intent( out) :: ErrMsg !< Error message if ErrStat /= ErrID_None - real(R8Ki), allocatable, intent(inout) :: dXdx(:,:) !< Partial derivatives of output functions - - integer(IntKi) :: n ! Generic loop index - type(SrvD_ContinuousStateType) :: dx_p ! states positive perturbed - type(SrvD_ContinuousStateType) :: dx_m ! states negative perturbed - type(SrvD_ContinuousStateType) :: x_temp ! copy of states to perturb - real(R8Ki) :: delta_p ! delta+ change in input or state - real(R8Ki) :: delta_m ! delta- change in input or state - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'Jac_dXdx' + ! Allocate dXdx if not allocated + if (.not. allocated(dXdx)) then + call AllocAry(dXdx, m%Jac%Nx, m%Jac%Nx, 'dXdx', ErrStat2, ErrMsg2); if (Failed()) return + end if - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = '' + ! Loop through state variables + do i = 1, size(Vars%x) - ! Allocate the dXdx array regardless what states may or may not exist (glue code needs this) - if (.not. allocated(dXdx)) then - call allocAry(dXdx, p%Jac_nx, p%Jac_nx, 'dXdx', ErrStat2, ErrMsg2) - if (Failed()) return - elseif ( (size(dXdx,1) /= p%Jac_nx) .or. (size(dXdx,2) /= p%Jac_nx) ) then - deallocate(dXdx) - call allocAry(dXdx, p%Jac_nx, p%Jac_nx, 'dXdx', ErrStat2, ErrMsg2) - if (Failed()) return - endif - dXdx = 0.0_R8Ki - - !------------------------------------------------------------- - ! Perturb each StC instance individually and place in appropriate location in dYdx - ! Each StC is basically an isolated piece that doesn't interact with any other StC or with anything else in SrvD, - ! so we take advantage of that here for computational expediency. - !------------------------------------------------------------- - ! make a copy of the inputs to perturb if an StC exists - if ( (p%NumBStC + p%NumNStC + p%NumTStC + p%NumSStC) > 0 ) then - call SrvD_CopyContState( x, x_temp, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_NEWCOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - else - return ! Nothing futher to do here - endif - !------------------- - ! Blade StC - if (p%NumBStC > 0) then - do n=p%Jac_Idx_BStC_x(1,1,1),p%Jac_Idx_BStC_x(2,p%NumBl,p%NumBStC) ! state range for BStC - ! perturb positive - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_BStC_dXdx( n, +1, x_temp, delta_p, dx_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_BStC_dXdx( n, -1, x_temp, delta_m, dx_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dX( p, dx_p, dx_m, delta_p, delta_m, dXdx(:,n) ) - enddo - endif - !------------------- - ! Nacelle StC - if (p%NumNStC > 0) then - do n=p%Jac_Idx_NStC_x(1,1),p%Jac_Idx_NStC_x(2,p%NumNStC) ! state range for NStC - ! perturb positive - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_NStC_dXdx( n, +1, x_temp, delta_p, dx_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_NStC_dXdx( n, -1, x_temp, delta_m, dx_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dX( p, dx_p, dx_m, delta_p, delta_m, dXdx(:,n) ) - enddo - endif - !------------------- - ! Tower StC - if (p%NumTStC > 0) then - do n=p%Jac_Idx_TStC_x(1,1),p%Jac_Idx_TStC_x(2,p%NumTStC) ! state range for TStC - ! perturb positive - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_TStC_dXdx( n, +1, x_temp, delta_p, dx_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_TStC_dXdx( n, -1, x_temp, delta_m, dx_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dX( p, dx_p, dx_m, delta_p, delta_m, dXdx(:,n) ) - enddo - endif - !------------------- - ! Substructure StC - if (p%NumSStC > 0) then - do n=p%Jac_Idx_SStC_x(1,1),p%Jac_Idx_SStC_x(2,p%NumSStC) ! state range for SStC - ! perturb positive - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_p, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_SStC_dXdx( n, +1, x_temp, delta_p, dx_p, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! perturb negative - call SrvD_CopyContState( x, x_temp, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call SrvD_CopyContState( x, dx_m, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); if (Failed()) return; - call Jac_SStC_dXdx( n, -1, x_temp, delta_m, dx_m, ErrStat2, ErrMsg2 ); if (Failed()) return; - - ! Central difference - call Compute_dX( p, dx_p, dx_m, delta_p, delta_m, dXdx(:,n) ) - enddo - endif - call Cleanup() + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate column index + iCol = Vars%x(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call SrvD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SrvD_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call SrvD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SrvD_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SrvD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdx(:,iCol) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%x(i)%Perturb) + end do + end do + end if + + if (present(dXddx)) then + if (allocated(dXddx)) deallocate(dXddx) + end if + + if (present(dZdx)) then + if (allocated(dZdx)) deallocate(dZdx) + end if contains logical function Failed() CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) Failed = ErrStat >= AbortErrLev - if (Failed) call Cleanup end function Failed - - subroutine Cleanup() - ! Ignore any errors from the destroy (these weren't created if no StCs) - call SrvD_DestroyContState( x_temp, ErrStat2, ErrMsg2 ) - call SrvD_DestroyContState( dx_p, ErrStat2, ErrMsg2 ) - call SrvD_DestroyContState( dx_m, ErrStat2, ErrMsg2 ) - end subroutine Cleanup - - !> Calculated dYdx for BStC instance - subroutine Jac_BStC_dXdx( n, sgn, x_perturb, delta, x_perturb_out, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! copy of states before perturb - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb_out ! copy of states after perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: j,k ! Generic indices - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_x_indx array. This allows us to simplify the number of calls dramatically - k = p%Jac_x_indx(n,4) ! this blade - j = p%Jac_x_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_x( p, n, sgn, x_perturb, delta ) - ! calculate change in ContState - call StC_CalcContStateDeriv( t, m%u_BStC(1,j), p%BStC(j), x_perturb%BStC(j), xd%BStC(j), z%BStC(j), OtherState%BStC(j), m%BStC(j), x_perturb_out%BStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - end subroutine Jac_BStC_dXdx - - !> Calculated dYdx for NStC instance - subroutine Jac_NStC_dXdx( n, sgn, x_perturb, delta, x_perturb_out, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! copy of states before perturb - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb_out ! copy of states after perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: j,k ! Generic indices - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_x_indx array. This allows us to simplify the number of calls dramatically - k = p%Jac_x_indx(n,4) ! this blade - j = p%Jac_x_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_x( p, n, sgn, x_perturb, delta ) - ! calculate change in ContState - call StC_CalcContStateDeriv( t, m%u_NStC(1,j), p%NStC(j), x_perturb%NStC(j), xd%NStC(j), z%NStC(j), OtherState%NStC(j), m%NStC(j), x_perturb_out%NStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - end subroutine Jac_NStC_dXdx - - !> Calculated dYdx for TStC instance - subroutine Jac_TStC_dXdx( n, sgn, x_perturb, delta, x_perturb_out, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! copy of states before perturb - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb_out ! copy of states after perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: j,k ! Generic indices - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_x_indx array. This allows us to simplify the number of calls dramatically - k = p%Jac_x_indx(n,4) ! this blade - j = p%Jac_x_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_x( p, n, sgn, x_perturb, delta ) - ! calculate change in ContState - call StC_CalcContStateDeriv( t, m%u_TStC(1,j), p%TStC(j), x_perturb%TStC(j), xd%TStC(j), z%TStC(j), OtherState%TStC(j), m%TStC(j), x_perturb_out%TStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - end subroutine Jac_TStC_dXdx - - !> Calculated dYdx for SStC instance - subroutine Jac_SStC_dXdx( n, sgn, x_perturb, delta, x_perturb_out, ErrStat3, ErrMsg3) - integer(IntKi), intent(in ) :: n ! which input to perturb - integer(IntKi), intent(in ) :: sgn ! sign of perturbation - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb ! copy of states before perturb - type(SrvD_ContinuousStateType), intent(inout) :: x_perturb_out ! copy of states after perturb - real(R8Ki), intent( out) :: delta ! delta+/- change in input or state - integer(IntKi), intent( out) :: ErrStat3 - character(ErrMsgLen), intent( out) :: ErrMsg3 - integer(IntKi) :: j,k ! Generic indices - type(StC_OutputType) :: y_StC ! copy of the StC outputs for StC_CalcOutput call - ! Since this is acting on only a single blade within a single StC instance, we can look up exactly which one - ! from the Jac_x_indx array. This allows us to simplify the number of calls dramatically - k = p%Jac_x_indx(n,4) ! this blade - j = p%Jac_x_indx(n,3) ! this instance - !------------------- - ! get u_op +/- delta u - call SrvD_Perturb_x( p, n, sgn, x_perturb, delta ) - ! calculate change in ContState - call StC_CalcContStateDeriv( t, m%u_SStC(1,j), p%SStC(j), x_perturb%SStC(j), xd%SStC(j), z%SStC(j), OtherState%SStC(j), m%SStC(j), x_perturb_out%SStC(j), ErrStat3, ErrMsg3 ); if (ErrStat3 > AbortErrLev) return - end subroutine Jac_SStC_dXdx - -end subroutine Jac_dXdx +END SUBROUTINE SrvD_JacobianPContState !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions @@ -4213,256 +2675,7 @@ SUBROUTINE SrvD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrSt if (allocated(dZdz)) deallocate(dZdz) END IF END SUBROUTINE SrvD_JacobianPConstrState -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE SrvD_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(SrvD_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(SrvD_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(SrvD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(SrvD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(SrvD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(SrvD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(SrvD_OutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(SrvD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - - INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) - CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None - CHARACTER(*), PARAMETER :: RoutineName = 'SrvD_GetOP' - - ! Initialize ErrStat - ErrStat = ErrID_None - ErrMsg = '' - !.......................................... - IF ( PRESENT( u_op ) ) THEN - call Get_u_op() - if (ErrStat >= AbortErrLev) return - END IF - !.......................................... - IF ( PRESENT( y_op ) ) THEN - call Get_y_op() - if (ErrStat >= AbortErrLev) return - END IF - !.......................................... - IF ( PRESENT( x_op ) ) THEN - call Get_x_op() - if (ErrStat >= AbortErrLev) return - END IF - !.......................................... - IF ( PRESENT( dx_op ) ) THEN - call Get_dx_op() - if (ErrStat >= AbortErrLev) return - END IF - !.......................................... - IF ( PRESENT( xd_op ) ) THEN - END IF - !.......................................... - IF ( PRESENT( z_op ) ) THEN - END IF -CONTAINS - logical function Failed() - CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) - Failed = ErrStat >= AbortErrLev - end function Failed - - !> Get the operating point inputs and pack - subroutine Get_u_op() - integer(IntKi) :: nu,i,j,index_next - - if (.not. allocated(u_op)) then - ! our operating point includes DCM (orientation) matrices, not just small angles like the perturbation matrices do - nu = p%Jac_nu & - + p%NumBStC * 6 * p%NumBl & ! Jac_nu has 3 for Orientation, but we need 9 at each BStC instance on each blade - + p%NumNStC * 6 & ! Jac_nu has 3 for Orientation, but we need 9 at each NStC instance - + p%NumTStC * 6 & ! Jac_nu has 3 for Orientation, but we need 9 at each TStC instance - + p%NumSStC * 6 ! Jac_nu has 3 for Orientation, but we need 9 at each SStC instance - CALL AllocAry( u_op, nu, 'u_op', ErrStat2, ErrMsg2 ) - if (Failed()) return; - end if - - index_next=1 - ! Fixed inputs - u_op(index_next) = u%Yaw; index_next = index_next + 1 - u_op(index_next) = u%YawRate; index_next = index_next + 1 - u_op(index_next) = u%HSS_Spd; index_next = index_next + 1 - - ! StC related inputs - do j=1,p%NumBStC ! Blade - do i=1,p%NumBl - call PackMotionMesh( u%BStCMotionMesh(i,j), u_op, index_next ) - enddo - enddo - do j=1,p%NumNStC ! Nacelle - call PackMotionMesh( u%NStCMotionMesh(j), u_op, index_next ) - enddo - do j=1,p%NumTStC ! Tower - call PackMotionMesh( u%TStCMotionMesh(j), u_op, index_next ) - enddo - do j=1,p%NumSStC ! Sub-structure - call PackMotionMesh( u%SStCMotionMesh(j), u_op, index_next ) - enddo - end subroutine Get_u_op - - !> Get the operating point outputs and pack - subroutine Get_y_op() - integer(IntKi) :: i,j,index_next - - if (.not. allocated(y_op)) then - CALL AllocAry( y_op, p%Jac_ny, 'y_op', ErrStat2, ErrMsg2 ) - if (Failed()) return; - end if - - index_next=1 - do i=1,size(y%BlPitchCom) - y_op(index_next) = y%BlPitchCom(i) - index_next = index_next + 1 - end do - - y_op(index_next) = y%YawMom; index_next = index_next + 1 - y_op(index_next) = y%GenTrq; index_next = index_next + 1 - y_op(index_next) = y%ElecPwr; index_next = index_next + 1 - - ! StC related outputs - do j=1,p%NumBStC ! Blade - do i=1,p%NumBl - call PackLoadMesh( y%BStCLoadMesh(i,j), y_op, index_next ) - enddo - enddo - do j=1,p%NumNStC ! Nacelle - call PackLoadMesh( y%NStCLoadMesh(j), y_op, index_next ) - enddo - do j=1,p%NumTStC ! Tower - call PackLoadMesh( y%TStCLoadMesh(j), y_op, index_next ) - enddo - do j=1,p%NumSStC ! Sub-structure - call PackLoadMesh( y%SStCLoadMesh(j), y_op, index_next ) - enddo - - ! y%outputs - do i=1,p%NumOuts - y_op(index_next) = y%WriteOutput(i) - index_next = index_next + 1 - end do - end subroutine Get_y_op - - !> Get the operating point continuous states and pack - subroutine Get_x_op() - integer(IntKi) :: i,j,k,idx - - if (.not. allocated(x_op)) then - CALL AllocAry( x_op, p%Jac_nx, 'x_op', ErrStat2, ErrMsg2 ) - if (Failed()) return; - end if - idx = 0 - do j=1,p%NumBStC ! Blade StC -- displacement and velocity state - do k=1,p%NumBl - x_op(idx+1) = x%BStC(j)%StC_x(1,k) ! x --> x%BStC(j)%StC_x(1,k) - x_op(idx+2) = x%BStC(j)%StC_x(3,k) ! y --> x%BStC(j)%StC_x(3,k) - x_op(idx+3) = x%BStC(j)%StC_x(5,k) ! z --> x%BStC(j)%StC_x(5,k) - x_op(idx+4) = x%BStC(j)%StC_x(2,k) ! dx/dt --> x%BStC(j)%StC_x(2,k) - x_op(idx+5) = x%BStC(j)%StC_x(4,k) ! dy/dt --> x%BStC(j)%StC_x(4,k) - x_op(idx+6) = x%BStC(j)%StC_x(6,k) ! dz/dt --> x%BStC(j)%StC_x(6,k) - idx = idx + 6 - enddo - enddo - do j=1,p%NumNStC ! Nacelle StC -- displacement and velocity state - x_op(idx+1) = x%NStC(j)%StC_x(1,1) ! x --> x%NStC(j)%StC_x(1,1) - x_op(idx+2) = x%NStC(j)%StC_x(3,1) ! y --> x%NStC(j)%StC_x(3,1) - x_op(idx+3) = x%NStC(j)%StC_x(5,1) ! z --> x%NStC(j)%StC_x(5,1) - x_op(idx+4) = x%NStC(j)%StC_x(2,1) ! dx/dt --> x%NStC(j)%StC_x(2,1) - x_op(idx+5) = x%NStC(j)%StC_x(4,1) ! dy/dt --> x%NStC(j)%StC_x(4,1) - x_op(idx+6) = x%NStC(j)%StC_x(6,1) ! dz/dt --> x%NStC(j)%StC_x(6,1) - idx = idx + 6 - enddo - do j=1,p%NumTStC ! Tower StC -- displacement and velocity state - x_op(idx+1) = x%TStC(j)%StC_x(1,1) ! x --> x%TStC(j)%StC_x(1,1) - x_op(idx+2) = x%TStC(j)%StC_x(3,1) ! y --> x%TStC(j)%StC_x(3,1) - x_op(idx+3) = x%TStC(j)%StC_x(5,1) ! z --> x%TStC(j)%StC_x(5,1) - x_op(idx+4) = x%TStC(j)%StC_x(2,1) ! dx/dt --> x%TStC(j)%StC_x(2,1) - x_op(idx+5) = x%TStC(j)%StC_x(4,1) ! dy/dt --> x%TStC(j)%StC_x(4,1) - x_op(idx+6) = x%TStC(j)%StC_x(6,1) ! dz/dt --> x%TStC(j)%StC_x(6,1) - idx = idx + 6 - enddo - do j=1,p%NumSStC ! Substructure StC -- displacement and velocity state - x_op(idx+1) = x%SStC(j)%StC_x(1,1) ! x --> x%SStC(j)%StC_x(1,1) - x_op(idx+2) = x%SStC(j)%StC_x(3,1) ! y --> x%SStC(j)%StC_x(3,1) - x_op(idx+3) = x%SStC(j)%StC_x(5,1) ! z --> x%SStC(j)%StC_x(5,1) - x_op(idx+4) = x%SStC(j)%StC_x(2,1) ! dx/dt --> x%SStC(j)%StC_x(2,1) - x_op(idx+5) = x%SStC(j)%StC_x(4,1) ! dy/dt --> x%SStC(j)%StC_x(4,1) - x_op(idx+6) = x%SStC(j)%StC_x(6,1) ! dz/dt --> x%SStC(j)%StC_x(6,1) - idx = idx + 6 - enddo - end subroutine Get_x_op - - !> Get the operating point continuous states derivatives and pack - !! rather than copy the logic in CalcContStateDeriv for the StCs, we'll just - !! call it directly - subroutine Get_dx_op() - integer(IntKi) :: i,j,k,idx - type(SrvD_ContinuousStateType) :: dx !< derivative of continuous states at operating point - - if (.not. allocated(dx_op)) then - CALL AllocAry( dx_op, p%Jac_nx, 'dx_op', ErrStat2, ErrMsg2 ) - if (Failed()) return; - end if - call SrvD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dx, ErrStat2, ErrMsg2 ) - if (Failed()) then - call SrvD_DestroyContState( dx, ErrStat2, ErrMsg2) - return - end if - idx = 0 - do j=1,p%NumBStC ! Blade StC -- displacement and velocity state - do k=1,p%NumBl - dx_op(idx+1) = dx%BStC(j)%StC_x(1,k) ! x --> dx%BStC(j)%StC_x(1,k) - dx_op(idx+2) = dx%BStC(j)%StC_x(3,k) ! y --> dx%BStC(j)%StC_x(3,k) - dx_op(idx+3) = dx%BStC(j)%StC_x(5,k) ! z --> dx%BStC(j)%StC_x(5,k) - dx_op(idx+4) = dx%BStC(j)%StC_x(2,k) ! dx/dt --> dx%BStC(j)%StC_x(2,k) - dx_op(idx+5) = dx%BStC(j)%StC_x(4,k) ! dy/dt --> dx%BStC(j)%StC_x(4,k) - dx_op(idx+6) = dx%BStC(j)%StC_x(6,k) ! dz/dt --> dx%BStC(j)%StC_x(6,k) - idx = idx + 6 - enddo - enddo - do j=1,p%NumNStC ! Nacelle StC -- displacement and velocity state - dx_op(idx+1) = dx%NStC(j)%StC_x(1,1) ! x --> dx%NStC(j)%StC_x(1,1) - dx_op(idx+2) = dx%NStC(j)%StC_x(3,1) ! y --> dx%NStC(j)%StC_x(3,1) - dx_op(idx+3) = dx%NStC(j)%StC_x(5,1) ! z --> dx%NStC(j)%StC_x(5,1) - dx_op(idx+4) = dx%NStC(j)%StC_x(2,1) ! dx/dt --> dx%NStC(j)%StC_x(2,1) - dx_op(idx+5) = dx%NStC(j)%StC_x(4,1) ! dy/dt --> dx%NStC(j)%StC_x(4,1) - dx_op(idx+6) = dx%NStC(j)%StC_x(6,1) ! dz/dt --> dx%NStC(j)%StC_x(6,1) - idx = idx + 6 - enddo - do j=1,p%NumTStC ! Tower StC -- displacement and velocity state - dx_op(idx+1) = dx%TStC(j)%StC_x(1,1) ! x --> dx%TStC(j)%StC_x(1,1) - dx_op(idx+2) = dx%TStC(j)%StC_x(3,1) ! y --> dx%TStC(j)%StC_x(3,1) - dx_op(idx+3) = dx%TStC(j)%StC_x(5,1) ! z --> dx%TStC(j)%StC_x(5,1) - dx_op(idx+4) = dx%TStC(j)%StC_x(2,1) ! dx/dt --> dx%TStC(j)%StC_x(2,1) - dx_op(idx+5) = dx%TStC(j)%StC_x(4,1) ! dy/dt --> dx%TStC(j)%StC_x(4,1) - dx_op(idx+6) = dx%TStC(j)%StC_x(6,1) ! dz/dt --> dx%TStC(j)%StC_x(6,1) - idx = idx + 6 - enddo - do j=1,p%NumSStC ! Substructure StC -- displacement and velocity state - dx_op(idx+1) = dx%SStC(j)%StC_x(1,1) ! x --> dx%SStC(j)%StC_x(1,1) - dx_op(idx+2) = dx%SStC(j)%StC_x(3,1) ! y --> dx%SStC(j)%StC_x(3,1) - dx_op(idx+3) = dx%SStC(j)%StC_x(5,1) ! z --> dx%SStC(j)%StC_x(5,1) - dx_op(idx+4) = dx%SStC(j)%StC_x(2,1) ! dx/dt --> dx%SStC(j)%StC_x(2,1) - dx_op(idx+5) = dx%SStC(j)%StC_x(4,1) ! dy/dt --> dx%SStC(j)%StC_x(4,1) - dx_op(idx+6) = dx%SStC(j)%StC_x(6,1) ! dz/dt --> dx%SStC(j)%StC_x(6,1) - idx = idx + 6 - enddo - ! clean up - call SrvD_DestroyContState( dx, ErrStat2, ErrMsg2) - end subroutine Get_dx_op - -END SUBROUTINE SrvD_GetOP !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ !---------------------------------------------------------------------------------------------------------------------------------- @@ -4734,6 +2947,11 @@ END SUBROUTINE Torque_ValidateData !> This routine performs the checks on inputs for the high-speed shaft brake. SUBROUTINE HSSBr_ValidateData( ) + ! If ElastoDyn is tightly coupled, HSSBrMode must be NONE + IF (InitInp%TightED .and. (InputFileData%HSSBrMode /= ControlMode_NONE)) then + CALL SetErrStat( ErrID_Fatal, 'HSSBrMode must be 0 for tight-coupling.', ErrStat, ErrMsg, RoutineName ) + end if + ! Some special checks based on whether inputs will come from external source (e.g., Simulink, LabVIEW) IF ( .NOT. Cmpl4SFun .AND. .NOT. Cmpl4LV ) THEN @@ -4816,14 +3034,19 @@ SUBROUTINE SrvD_SetParameters( InputFileData, p, UnSum, ErrStat, ErrMsg ) p%PCMode = InputFileData%PCMode p%TPCOn = InputFileData%TPCOn - CALL AllocAry( p%TPitManS, p%NumBl, 'TPitManS', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); p%TPitManS =0.0_DbKi - CALL AllocAry( p%BlPitchF, p%NumBl, 'BlPitchF', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); p%BlPitchF =0.0_ReKi - CALL AllocAry( p%PitManRat, p%NumBl, 'PitManRat', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); p%PitManRat=0.0_ReKi + CALL AllocAry( p%PitNeut, p%NumBl, 'PitNeut', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); p%PitNeut = 0.0_ReKi + CALL AllocAry( p%PitSpr, p%NumBl, 'PitSpr', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); p%PitSpr = 0.0_ReKi + CALL AllocAry( p%PitDamp, p%NumBl, 'PitDamp', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); p%PitDamp = 0.0_ReKi + CALL AllocAry( p%TPitManS, p%NumBl, 'TPitManS', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); p%TPitManS = 0.0_DbKi + CALL AllocAry( p%BlPitchF, p%NumBl, 'BlPitchF', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); p%BlPitchF = 0.0_ReKi + CALL AllocAry( p%PitManRat, p%NumBl, 'PitManRat', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); p%PitManRat = 0.0_ReKi IF (ErrStat >= AbortErrLev) RETURN - - p%TPitManS = InputFileData%TPitManS( 1:min(p%NumBl,size(InputFileData%TPitManS))) - p%BlPitchF = InputFileData%BlPitchF( 1:min(p%NumBl,size(InputFileData%BlPitchF))) + p%PitNeut = InputFileData%PitNeut( 1:min(p%NumBl,size(InputFileData%PitNeut ))) + p%PitSpr = InputFileData%PitSpr( 1:min(p%NumBl,size(InputFileData%PitSpr ))) + p%PitDamp = InputFileData%PitDamp( 1:min(p%NumBl,size(InputFileData%PitDamp ))) + p%TPitManS = InputFileData%TPitManS( 1:min(p%NumBl,size(InputFileData%TPitManS ))) + p%BlPitchF = InputFileData%BlPitchF( 1:min(p%NumBl,size(InputFileData%BlPitchF ))) p%PitManRat = InputFileData%PitManRat(1:min(p%NumBl,size(InputFileData%PitManRat))) if (UnSum >0) then @@ -4833,6 +3056,10 @@ SUBROUTINE SrvD_SetParameters( InputFileData, p, UnSum, ErrStat, ErrMsg ) write(UnSum, '(A43,I2)') ' PCMode -- Pitch control mode: ',p%PCMode write(UnSum, '(A43,ES20.12e3)') ' TPCOn -- pitch control start time: ',p%TPCOn write(UnSum, '(A)') ' -------------------' + write(UnSum, '(A43,3ES12.5e2)') ' PitNeut -- pitch neutral position: ',p%PitNeut(1:min(p%NumBl,size(InputFileData%PitNeut))) + write(UnSum, '(A43,3ES12.5e2)') ' PitSpr -- pitch spring constant: ',p%PitSpr( 1:min(p%NumBl,size(InputFileData%PitSpr ))) + write(UnSum, '(A43,3ES12.5e2)') ' PitDamp -- pitch damping constant: ',p%PitDamp(1:min(p%NumBl,size(InputFileData%PitDamp))) + write(UnSum, '(A)') ' -------------------' write(UnSum, '(A43,3ES12.5e2)') ' TPitManS -- pitch override start time: ',p%TPitManS( 1:min(p%NumBl,size(InputFileData%TPitManS))) write(UnSum, '(A43,3ES12.5e2)') ' BlPitchF -- pitch override final pos: ',p%BlPitchF( 1:min(p%NumBl,size(InputFileData%BlPitchF))) write(UnSum, '(A43,3ES12.5e2)') ' PitManRat -- pitch override rate: ',p%PitManRat(1:min(p%NumBl,size(InputFileData%PitManRat))) @@ -5313,7 +3540,7 @@ SUBROUTINE Yaw_UpdateStates( t, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) END SUBROUTINE Yaw_UpdateStates !---------------------------------------------------------------------------------------------------------------------------------- !> Routine for computing the pitch output: blade pitch commands. This routine is used in both loose and tight coupling. -SUBROUTINE Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, BlPitchCom, ElecPwr, m, ErrStat, ErrMsg ) +SUBROUTINE Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, BlPitchCom, BlPRateCom, BlPitchMom, ElecPwr, m, ErrStat, ErrMsg ) !.................................................................................................................................. REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds @@ -5323,7 +3550,12 @@ SUBROUTINE Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, BlPitchCom, ElecPwr, TYPE(SrvD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t TYPE(SrvD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at t TYPE(SrvD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at t - REAL(ReKi), INTENT(INOUT) :: BlPitchCom(:) !< pitch outputs computed at t (Input only so that mesh con- + REAL(ReKi), INTENT(INOUT) :: BlPitchCom(:) !< pitch command outputs computed at t (Input only so that mesh con- + !! nectivity information does not have to be recalculated) + REAL(ReKi), INTENT(INOUT) :: BlPRateCom(:) !< pitch rate command outputs computed at t (Input only so that mesh con- + !! nectivity information does not have to be recalculated) + !! Not directly used currently. Only used to compute pitch moments. + REAL(ReKi), INTENT(INOUT) :: BlPitchMom(:) !< pitch moment outputs computed at t (Input only so that mesh con- !! nectivity information does not have to be recalculated) REAL(ReKi), INTENT(IN ) :: ElecPwr !< Electrical power (watts) TYPE(SrvD_MiscVarType), INTENT(INOUT) :: m !< Misc (optimization) variables @@ -5332,7 +3564,6 @@ SUBROUTINE Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, BlPitchCom, ElecPwr, ! local variables REAL(ReKi) :: factor - REAL(ReKi) :: PitManRat INTEGER(IntKi) :: K ! counter for blades @@ -5360,10 +3591,12 @@ SUBROUTINE Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, BlPitchCom, ElecPwr, CASE ( ControlMode_USER ) ! User-defined from routine PitchCntrl(). CALL PitchCntrl ( u%BlPitch, ElecPwr, u%LSS_Spd, u%TwrAccel, p%NumBl, t, p%DT, p%PriPath, BlPitchCom ) + BlPRateCom = 0.0_ReKi ! Enable this optionally in the future CASE ( ControlMode_EXTERN ) ! User-defined from Simulink or LabVIEW. BlPitchCom = u%ExternalBlPitchCom(1:p%NumBl) + BlPRateCom = 0.0_ReKi ! Enable this optionally in the future CASE ( ControlMode_DLL ) ! User-defined pitch control from Bladed-style DLL @@ -5376,13 +3609,18 @@ SUBROUTINE Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, BlPitchCom, ElecPwr, BlPitchCom = m%dll_data%BlPitchCom(1:p%NumBl) end if + ! Estimate pitch rate command using finite differencing + BlPRateCom = ( m%dll_data%BlPitchCom(1:p%NumBl) - m%dll_data%PrevBlPitch(1:p%NumBl) ) / m%dll_data%DLL_DT + ! update the filter state once per time step IF ( EqualRealNos( t - p%DT, m%LastTimeFiltered ) ) THEN m%xd_BlPitchFilter = p%BlAlpha * m%xd_BlPitchFilter + (1.0_ReKi - p%BlAlpha) * BlPitchCom + m%xd_BlPRateFilter = p%BlAlpha * m%xd_BlPRateFilter + (1.0_ReKi - p%BlAlpha) * BlPRateCom m%LastTimeFiltered = t END IF BlPitchCom = p%BlAlpha * m%xd_BlPitchFilter + (1.0_ReKi - p%BlAlpha) * BlPitchCom + BlPRateCom = p%BlAlpha * m%xd_BlPRateFilter + (1.0_ReKi - p%BlAlpha) * BlPRateCom END SELECT @@ -5390,11 +3628,11 @@ SUBROUTINE Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, BlPitchCom, ElecPwr, ! Use the initial blade pitch angles: - BlPitchCom = p%BlPitchInit + BlPitchCom = p%PitNeut(1:p%NumBl) + BlPRateCom = 0.0_ReKi ENDIF - !................................................................... ! Override standard pitch control with a linear maneuver if necessary: !................................................................... @@ -5407,11 +3645,12 @@ SUBROUTINE Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, BlPitchCom, ElecPwr, IF ( t >= OtherState%TPitManE(K) ) THEN ! Override pitch maneuver has ended, blade is locked at BlPitchF. BlPitchCom(K) = p%BlPitchF(K) + BlPRateCom(K) = 0.0_ReKi ELSE - PitManRat = SIGN( p%PitManRat(K), p%BlPitchF(K) - OtherState%BlPitchI(K) ) ! Modify the sign of PitManRat based on the direction of the pitch maneuever - BlPitchCom(K) = OtherState%BlPitchI(K) + PitManRat*( t - p%TPitManS(K) ) ! Increment the blade pitch using PitManRat + BlPRateCom(K) = SIGN( p%PitManRat(K), p%BlPitchF(K) - OtherState%BlPitchI(K) ) ! Modify the sign of PitManRat based on the direction of the pitch maneuever + BlPitchCom(K) = OtherState%BlPitchI(K) + BlPRateCom(K)*( t - p%TPitManS(K) ) ! Increment the blade pitch using PitManRat END IF @@ -5420,14 +3659,21 @@ SUBROUTINE Pitch_CalcOutput( t, u, p, x, xd, z, OtherState, BlPitchCom, ElecPwr, ENDDO ! K - blades + !................................................................... + ! Calculate the pitch moment: + !................................................................... + + BlPitchMom = - p%PitSpr * ( u%BlPitch - BlPitchCom ) & + - p%PitDamp * ( u%BlPRate - BlPRateCom ) + !................................................................... ! Apply trim case for linearization: !................................................................... if (p%TrimCase==TrimCase_pitch) then BlPitchCom = BlPitchCom + xd%CtrlOffset + BlPitchMom = BlPitchMom + xd%CtrlOffset * p%PitSpr end if - END SUBROUTINE Pitch_CalcOutput !---------------------------------------------------------------------------------------------------------------------------------- !> This routine updates the continuous and other states associated with the pitch controller: BegPitMan, BlPitchI, and TPitManE. diff --git a/modules/servodyn/src/ServoDyn_IO.f90 b/modules/servodyn/src/ServoDyn_IO.f90 index 2a618589b4..0454b76673 100644 --- a/modules/servodyn/src/ServoDyn_IO.f90 +++ b/modules/servodyn/src/ServoDyn_IO.f90 @@ -36,7 +36,7 @@ MODULE ServoDyn_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 04-Feb-2021 08:42:27. +! This code was generated by "Write_ChckOutLst.m" at 29-Oct-2025 13:26:57. ! Indices for computing output channels: @@ -61,550 +61,559 @@ MODULE ServoDyn_IO INTEGER(IntKi), PARAMETER :: BlPitchC1 = 4 INTEGER(IntKi), PARAMETER :: BlPitchC2 = 5 INTEGER(IntKi), PARAMETER :: BlPitchC3 = 6 + INTEGER(IntKi), PARAMETER :: BlPRateC1 = 7 + INTEGER(IntKi), PARAMETER :: BlPRateC2 = 8 + INTEGER(IntKi), PARAMETER :: BlPRateC3 = 9 + INTEGER(IntKi), PARAMETER :: BlPitchM1 = 10 + INTEGER(IntKi), PARAMETER :: BlPitchM2 = 11 + INTEGER(IntKi), PARAMETER :: BlPitchM3 = 12 ! Generator and Torque Control: - INTEGER(IntKi), PARAMETER :: GenTq = 7 - INTEGER(IntKi), PARAMETER :: GenPwr = 8 + INTEGER(IntKi), PARAMETER :: GenTq = 13 + INTEGER(IntKi), PARAMETER :: GenPwr = 14 ! High Speed Shaft Brake: - INTEGER(IntKi), PARAMETER :: HSSBrTqC = 9 + INTEGER(IntKi), PARAMETER :: HSSBrTqC = 15 ! Nacelle Yaw Control: - INTEGER(IntKi), PARAMETER :: YawMomCom = 10 + INTEGER(IntKi), PARAMETER :: YawMomCom = 16 ! Nacelle Structural Control (StC): - INTEGER(IntKi), PARAMETER :: NStC1_XQ = 11 - INTEGER(IntKi), PARAMETER :: NStC1_XQD = 12 - INTEGER(IntKi), PARAMETER :: NStC1_YQ = 13 - INTEGER(IntKi), PARAMETER :: NStC1_YQD = 14 - INTEGER(IntKi), PARAMETER :: NStC1_ZQ = 15 - INTEGER(IntKi), PARAMETER :: NStC1_ZQD = 16 - INTEGER(IntKi), PARAMETER :: NStC1_Fxi = 17 - INTEGER(IntKi), PARAMETER :: NStC1_Fyi = 18 - INTEGER(IntKi), PARAMETER :: NStC1_Fzi = 19 - INTEGER(IntKi), PARAMETER :: NStC1_Mxi = 20 - INTEGER(IntKi), PARAMETER :: NStC1_Myi = 21 - INTEGER(IntKi), PARAMETER :: NStC1_Mzi = 22 - INTEGER(IntKi), PARAMETER :: NStC1_Fxl = 23 - INTEGER(IntKi), PARAMETER :: NStC1_Fyl = 24 - INTEGER(IntKi), PARAMETER :: NStC1_Fzl = 25 - INTEGER(IntKi), PARAMETER :: NStC1_Mxl = 26 - INTEGER(IntKi), PARAMETER :: NStC1_Myl = 27 - INTEGER(IntKi), PARAMETER :: NStC1_Mzl = 28 - INTEGER(IntKi), PARAMETER :: NStC2_XQ = 29 - INTEGER(IntKi), PARAMETER :: NStC2_XQD = 30 - INTEGER(IntKi), PARAMETER :: NStC2_YQ = 31 - INTEGER(IntKi), PARAMETER :: NStC2_YQD = 32 - INTEGER(IntKi), PARAMETER :: NStC2_ZQ = 33 - INTEGER(IntKi), PARAMETER :: NStC2_ZQD = 34 - INTEGER(IntKi), PARAMETER :: NStC2_Fxi = 35 - INTEGER(IntKi), PARAMETER :: NStC2_Fyi = 36 - INTEGER(IntKi), PARAMETER :: NStC2_Fzi = 37 - INTEGER(IntKi), PARAMETER :: NStC2_Mxi = 38 - INTEGER(IntKi), PARAMETER :: NStC2_Myi = 39 - INTEGER(IntKi), PARAMETER :: NStC2_Mzi = 40 - INTEGER(IntKi), PARAMETER :: NStC2_Fxl = 41 - INTEGER(IntKi), PARAMETER :: NStC2_Fyl = 42 - INTEGER(IntKi), PARAMETER :: NStC2_Fzl = 43 - INTEGER(IntKi), PARAMETER :: NStC2_Mxl = 44 - INTEGER(IntKi), PARAMETER :: NStC2_Myl = 45 - INTEGER(IntKi), PARAMETER :: NStC2_Mzl = 46 - INTEGER(IntKi), PARAMETER :: NStC3_XQ = 47 - INTEGER(IntKi), PARAMETER :: NStC3_XQD = 48 - INTEGER(IntKi), PARAMETER :: NStC3_YQ = 49 - INTEGER(IntKi), PARAMETER :: NStC3_YQD = 50 - INTEGER(IntKi), PARAMETER :: NStC3_ZQ = 51 - INTEGER(IntKi), PARAMETER :: NStC3_ZQD = 52 - INTEGER(IntKi), PARAMETER :: NStC3_Fxi = 53 - INTEGER(IntKi), PARAMETER :: NStC3_Fyi = 54 - INTEGER(IntKi), PARAMETER :: NStC3_Fzi = 55 - INTEGER(IntKi), PARAMETER :: NStC3_Mxi = 56 - INTEGER(IntKi), PARAMETER :: NStC3_Myi = 57 - INTEGER(IntKi), PARAMETER :: NStC3_Mzi = 58 - INTEGER(IntKi), PARAMETER :: NStC3_Fxl = 59 - INTEGER(IntKi), PARAMETER :: NStC3_Fyl = 60 - INTEGER(IntKi), PARAMETER :: NStC3_Fzl = 61 - INTEGER(IntKi), PARAMETER :: NStC3_Mxl = 62 - INTEGER(IntKi), PARAMETER :: NStC3_Myl = 63 - INTEGER(IntKi), PARAMETER :: NStC3_Mzl = 64 - INTEGER(IntKi), PARAMETER :: NStC4_XQ = 65 - INTEGER(IntKi), PARAMETER :: NStC4_XQD = 66 - INTEGER(IntKi), PARAMETER :: NStC4_YQ = 67 - INTEGER(IntKi), PARAMETER :: NStC4_YQD = 68 - INTEGER(IntKi), PARAMETER :: NStC4_ZQ = 69 - INTEGER(IntKi), PARAMETER :: NStC4_ZQD = 70 - INTEGER(IntKi), PARAMETER :: NStC4_Fxi = 71 - INTEGER(IntKi), PARAMETER :: NStC4_Fyi = 72 - INTEGER(IntKi), PARAMETER :: NStC4_Fzi = 73 - INTEGER(IntKi), PARAMETER :: NStC4_Mxi = 74 - INTEGER(IntKi), PARAMETER :: NStC4_Myi = 75 - INTEGER(IntKi), PARAMETER :: NStC4_Mzi = 76 - INTEGER(IntKi), PARAMETER :: NStC4_Fxl = 77 - INTEGER(IntKi), PARAMETER :: NStC4_Fyl = 78 - INTEGER(IntKi), PARAMETER :: NStC4_Fzl = 79 - INTEGER(IntKi), PARAMETER :: NStC4_Mxl = 80 - INTEGER(IntKi), PARAMETER :: NStC4_Myl = 81 - INTEGER(IntKi), PARAMETER :: NStC4_Mzl = 82 + INTEGER(IntKi), PARAMETER :: NStC1_XQ = 17 + INTEGER(IntKi), PARAMETER :: NStC1_XQD = 18 + INTEGER(IntKi), PARAMETER :: NStC1_YQ = 19 + INTEGER(IntKi), PARAMETER :: NStC1_YQD = 20 + INTEGER(IntKi), PARAMETER :: NStC1_ZQ = 21 + INTEGER(IntKi), PARAMETER :: NStC1_ZQD = 22 + INTEGER(IntKi), PARAMETER :: NStC1_Fxi = 23 + INTEGER(IntKi), PARAMETER :: NStC1_Fyi = 24 + INTEGER(IntKi), PARAMETER :: NStC1_Fzi = 25 + INTEGER(IntKi), PARAMETER :: NStC1_Mxi = 26 + INTEGER(IntKi), PARAMETER :: NStC1_Myi = 27 + INTEGER(IntKi), PARAMETER :: NStC1_Mzi = 28 + INTEGER(IntKi), PARAMETER :: NStC1_Fxl = 29 + INTEGER(IntKi), PARAMETER :: NStC1_Fyl = 30 + INTEGER(IntKi), PARAMETER :: NStC1_Fzl = 31 + INTEGER(IntKi), PARAMETER :: NStC1_Mxl = 32 + INTEGER(IntKi), PARAMETER :: NStC1_Myl = 33 + INTEGER(IntKi), PARAMETER :: NStC1_Mzl = 34 + INTEGER(IntKi), PARAMETER :: NStC2_XQ = 35 + INTEGER(IntKi), PARAMETER :: NStC2_XQD = 36 + INTEGER(IntKi), PARAMETER :: NStC2_YQ = 37 + INTEGER(IntKi), PARAMETER :: NStC2_YQD = 38 + INTEGER(IntKi), PARAMETER :: NStC2_ZQ = 39 + INTEGER(IntKi), PARAMETER :: NStC2_ZQD = 40 + INTEGER(IntKi), PARAMETER :: NStC2_Fxi = 41 + INTEGER(IntKi), PARAMETER :: NStC2_Fyi = 42 + INTEGER(IntKi), PARAMETER :: NStC2_Fzi = 43 + INTEGER(IntKi), PARAMETER :: NStC2_Mxi = 44 + INTEGER(IntKi), PARAMETER :: NStC2_Myi = 45 + INTEGER(IntKi), PARAMETER :: NStC2_Mzi = 46 + INTEGER(IntKi), PARAMETER :: NStC2_Fxl = 47 + INTEGER(IntKi), PARAMETER :: NStC2_Fyl = 48 + INTEGER(IntKi), PARAMETER :: NStC2_Fzl = 49 + INTEGER(IntKi), PARAMETER :: NStC2_Mxl = 50 + INTEGER(IntKi), PARAMETER :: NStC2_Myl = 51 + INTEGER(IntKi), PARAMETER :: NStC2_Mzl = 52 + INTEGER(IntKi), PARAMETER :: NStC3_XQ = 53 + INTEGER(IntKi), PARAMETER :: NStC3_XQD = 54 + INTEGER(IntKi), PARAMETER :: NStC3_YQ = 55 + INTEGER(IntKi), PARAMETER :: NStC3_YQD = 56 + INTEGER(IntKi), PARAMETER :: NStC3_ZQ = 57 + INTEGER(IntKi), PARAMETER :: NStC3_ZQD = 58 + INTEGER(IntKi), PARAMETER :: NStC3_Fxi = 59 + INTEGER(IntKi), PARAMETER :: NStC3_Fyi = 60 + INTEGER(IntKi), PARAMETER :: NStC3_Fzi = 61 + INTEGER(IntKi), PARAMETER :: NStC3_Mxi = 62 + INTEGER(IntKi), PARAMETER :: NStC3_Myi = 63 + INTEGER(IntKi), PARAMETER :: NStC3_Mzi = 64 + INTEGER(IntKi), PARAMETER :: NStC3_Fxl = 65 + INTEGER(IntKi), PARAMETER :: NStC3_Fyl = 66 + INTEGER(IntKi), PARAMETER :: NStC3_Fzl = 67 + INTEGER(IntKi), PARAMETER :: NStC3_Mxl = 68 + INTEGER(IntKi), PARAMETER :: NStC3_Myl = 69 + INTEGER(IntKi), PARAMETER :: NStC3_Mzl = 70 + INTEGER(IntKi), PARAMETER :: NStC4_XQ = 71 + INTEGER(IntKi), PARAMETER :: NStC4_XQD = 72 + INTEGER(IntKi), PARAMETER :: NStC4_YQ = 73 + INTEGER(IntKi), PARAMETER :: NStC4_YQD = 74 + INTEGER(IntKi), PARAMETER :: NStC4_ZQ = 75 + INTEGER(IntKi), PARAMETER :: NStC4_ZQD = 76 + INTEGER(IntKi), PARAMETER :: NStC4_Fxi = 77 + INTEGER(IntKi), PARAMETER :: NStC4_Fyi = 78 + INTEGER(IntKi), PARAMETER :: NStC4_Fzi = 79 + INTEGER(IntKi), PARAMETER :: NStC4_Mxi = 80 + INTEGER(IntKi), PARAMETER :: NStC4_Myi = 81 + INTEGER(IntKi), PARAMETER :: NStC4_Mzi = 82 + INTEGER(IntKi), PARAMETER :: NStC4_Fxl = 83 + INTEGER(IntKi), PARAMETER :: NStC4_Fyl = 84 + INTEGER(IntKi), PARAMETER :: NStC4_Fzl = 85 + INTEGER(IntKi), PARAMETER :: NStC4_Mxl = 86 + INTEGER(IntKi), PARAMETER :: NStC4_Myl = 87 + INTEGER(IntKi), PARAMETER :: NStC4_Mzl = 88 ! Tower Structural Control (StC): - INTEGER(IntKi), PARAMETER :: TStC1_XQ = 83 - INTEGER(IntKi), PARAMETER :: TStC1_XQD = 84 - INTEGER(IntKi), PARAMETER :: TStC1_YQ = 85 - INTEGER(IntKi), PARAMETER :: TStC1_YQD = 86 - INTEGER(IntKi), PARAMETER :: TStC1_ZQ = 87 - INTEGER(IntKi), PARAMETER :: TStC1_ZQD = 88 - INTEGER(IntKi), PARAMETER :: TStC1_Fxi = 89 - INTEGER(IntKi), PARAMETER :: TStC1_Fyi = 90 - INTEGER(IntKi), PARAMETER :: TStC1_Fzi = 91 - INTEGER(IntKi), PARAMETER :: TStC1_Mxi = 92 - INTEGER(IntKi), PARAMETER :: TStC1_Myi = 93 - INTEGER(IntKi), PARAMETER :: TStC1_Mzi = 94 - INTEGER(IntKi), PARAMETER :: TStC1_Fxl = 95 - INTEGER(IntKi), PARAMETER :: TStC1_Fyl = 96 - INTEGER(IntKi), PARAMETER :: TStC1_Fzl = 97 - INTEGER(IntKi), PARAMETER :: TStC1_Mxl = 98 - INTEGER(IntKi), PARAMETER :: TStC1_Myl = 99 - INTEGER(IntKi), PARAMETER :: TStC1_Mzl = 100 - INTEGER(IntKi), PARAMETER :: TStC2_XQ = 101 - INTEGER(IntKi), PARAMETER :: TStC2_XQD = 102 - INTEGER(IntKi), PARAMETER :: TStC2_YQ = 103 - INTEGER(IntKi), PARAMETER :: TStC2_YQD = 104 - INTEGER(IntKi), PARAMETER :: TStC2_ZQ = 105 - INTEGER(IntKi), PARAMETER :: TStC2_ZQD = 106 - INTEGER(IntKi), PARAMETER :: TStC2_Fxi = 107 - INTEGER(IntKi), PARAMETER :: TStC2_Fyi = 108 - INTEGER(IntKi), PARAMETER :: TStC2_Fzi = 109 - INTEGER(IntKi), PARAMETER :: TStC2_Mxi = 110 - INTEGER(IntKi), PARAMETER :: TStC2_Myi = 111 - INTEGER(IntKi), PARAMETER :: TStC2_Mzi = 112 - INTEGER(IntKi), PARAMETER :: TStC2_Fxl = 113 - INTEGER(IntKi), PARAMETER :: TStC2_Fyl = 114 - INTEGER(IntKi), PARAMETER :: TStC2_Fzl = 115 - INTEGER(IntKi), PARAMETER :: TStC2_Mxl = 116 - INTEGER(IntKi), PARAMETER :: TStC2_Myl = 117 - INTEGER(IntKi), PARAMETER :: TStC2_Mzl = 118 - INTEGER(IntKi), PARAMETER :: TStC3_XQ = 119 - INTEGER(IntKi), PARAMETER :: TStC3_XQD = 120 - INTEGER(IntKi), PARAMETER :: TStC3_YQ = 121 - INTEGER(IntKi), PARAMETER :: TStC3_YQD = 122 - INTEGER(IntKi), PARAMETER :: TStC3_ZQ = 123 - INTEGER(IntKi), PARAMETER :: TStC3_ZQD = 124 - INTEGER(IntKi), PARAMETER :: TStC3_Fxi = 125 - INTEGER(IntKi), PARAMETER :: TStC3_Fyi = 126 - INTEGER(IntKi), PARAMETER :: TStC3_Fzi = 127 - INTEGER(IntKi), PARAMETER :: TStC3_Mxi = 128 - INTEGER(IntKi), PARAMETER :: TStC3_Myi = 129 - INTEGER(IntKi), PARAMETER :: TStC3_Mzi = 130 - INTEGER(IntKi), PARAMETER :: TStC3_Fxl = 131 - INTEGER(IntKi), PARAMETER :: TStC3_Fyl = 132 - INTEGER(IntKi), PARAMETER :: TStC3_Fzl = 133 - INTEGER(IntKi), PARAMETER :: TStC3_Mxl = 134 - INTEGER(IntKi), PARAMETER :: TStC3_Myl = 135 - INTEGER(IntKi), PARAMETER :: TStC3_Mzl = 136 - INTEGER(IntKi), PARAMETER :: TStC4_XQ = 137 - INTEGER(IntKi), PARAMETER :: TStC4_XQD = 138 - INTEGER(IntKi), PARAMETER :: TStC4_YQ = 139 - INTEGER(IntKi), PARAMETER :: TStC4_YQD = 140 - INTEGER(IntKi), PARAMETER :: TStC4_ZQ = 141 - INTEGER(IntKi), PARAMETER :: TStC4_ZQD = 142 - INTEGER(IntKi), PARAMETER :: TStC4_Fxi = 143 - INTEGER(IntKi), PARAMETER :: TStC4_Fyi = 144 - INTEGER(IntKi), PARAMETER :: TStC4_Fzi = 145 - INTEGER(IntKi), PARAMETER :: TStC4_Mxi = 146 - INTEGER(IntKi), PARAMETER :: TStC4_Myi = 147 - INTEGER(IntKi), PARAMETER :: TStC4_Mzi = 148 - INTEGER(IntKi), PARAMETER :: TStC4_Fxl = 149 - INTEGER(IntKi), PARAMETER :: TStC4_Fyl = 150 - INTEGER(IntKi), PARAMETER :: TStC4_Fzl = 151 - INTEGER(IntKi), PARAMETER :: TStC4_Mxl = 152 - INTEGER(IntKi), PARAMETER :: TStC4_Myl = 153 - INTEGER(IntKi), PARAMETER :: TStC4_Mzl = 154 + INTEGER(IntKi), PARAMETER :: TStC1_XQ = 89 + INTEGER(IntKi), PARAMETER :: TStC1_XQD = 90 + INTEGER(IntKi), PARAMETER :: TStC1_YQ = 91 + INTEGER(IntKi), PARAMETER :: TStC1_YQD = 92 + INTEGER(IntKi), PARAMETER :: TStC1_ZQ = 93 + INTEGER(IntKi), PARAMETER :: TStC1_ZQD = 94 + INTEGER(IntKi), PARAMETER :: TStC1_Fxi = 95 + INTEGER(IntKi), PARAMETER :: TStC1_Fyi = 96 + INTEGER(IntKi), PARAMETER :: TStC1_Fzi = 97 + INTEGER(IntKi), PARAMETER :: TStC1_Mxi = 98 + INTEGER(IntKi), PARAMETER :: TStC1_Myi = 99 + INTEGER(IntKi), PARAMETER :: TStC1_Mzi = 100 + INTEGER(IntKi), PARAMETER :: TStC1_Fxl = 101 + INTEGER(IntKi), PARAMETER :: TStC1_Fyl = 102 + INTEGER(IntKi), PARAMETER :: TStC1_Fzl = 103 + INTEGER(IntKi), PARAMETER :: TStC1_Mxl = 104 + INTEGER(IntKi), PARAMETER :: TStC1_Myl = 105 + INTEGER(IntKi), PARAMETER :: TStC1_Mzl = 106 + INTEGER(IntKi), PARAMETER :: TStC2_XQ = 107 + INTEGER(IntKi), PARAMETER :: TStC2_XQD = 108 + INTEGER(IntKi), PARAMETER :: TStC2_YQ = 109 + INTEGER(IntKi), PARAMETER :: TStC2_YQD = 110 + INTEGER(IntKi), PARAMETER :: TStC2_ZQ = 111 + INTEGER(IntKi), PARAMETER :: TStC2_ZQD = 112 + INTEGER(IntKi), PARAMETER :: TStC2_Fxi = 113 + INTEGER(IntKi), PARAMETER :: TStC2_Fyi = 114 + INTEGER(IntKi), PARAMETER :: TStC2_Fzi = 115 + INTEGER(IntKi), PARAMETER :: TStC2_Mxi = 116 + INTEGER(IntKi), PARAMETER :: TStC2_Myi = 117 + INTEGER(IntKi), PARAMETER :: TStC2_Mzi = 118 + INTEGER(IntKi), PARAMETER :: TStC2_Fxl = 119 + INTEGER(IntKi), PARAMETER :: TStC2_Fyl = 120 + INTEGER(IntKi), PARAMETER :: TStC2_Fzl = 121 + INTEGER(IntKi), PARAMETER :: TStC2_Mxl = 122 + INTEGER(IntKi), PARAMETER :: TStC2_Myl = 123 + INTEGER(IntKi), PARAMETER :: TStC2_Mzl = 124 + INTEGER(IntKi), PARAMETER :: TStC3_XQ = 125 + INTEGER(IntKi), PARAMETER :: TStC3_XQD = 126 + INTEGER(IntKi), PARAMETER :: TStC3_YQ = 127 + INTEGER(IntKi), PARAMETER :: TStC3_YQD = 128 + INTEGER(IntKi), PARAMETER :: TStC3_ZQ = 129 + INTEGER(IntKi), PARAMETER :: TStC3_ZQD = 130 + INTEGER(IntKi), PARAMETER :: TStC3_Fxi = 131 + INTEGER(IntKi), PARAMETER :: TStC3_Fyi = 132 + INTEGER(IntKi), PARAMETER :: TStC3_Fzi = 133 + INTEGER(IntKi), PARAMETER :: TStC3_Mxi = 134 + INTEGER(IntKi), PARAMETER :: TStC3_Myi = 135 + INTEGER(IntKi), PARAMETER :: TStC3_Mzi = 136 + INTEGER(IntKi), PARAMETER :: TStC3_Fxl = 137 + INTEGER(IntKi), PARAMETER :: TStC3_Fyl = 138 + INTEGER(IntKi), PARAMETER :: TStC3_Fzl = 139 + INTEGER(IntKi), PARAMETER :: TStC3_Mxl = 140 + INTEGER(IntKi), PARAMETER :: TStC3_Myl = 141 + INTEGER(IntKi), PARAMETER :: TStC3_Mzl = 142 + INTEGER(IntKi), PARAMETER :: TStC4_XQ = 143 + INTEGER(IntKi), PARAMETER :: TStC4_XQD = 144 + INTEGER(IntKi), PARAMETER :: TStC4_YQ = 145 + INTEGER(IntKi), PARAMETER :: TStC4_YQD = 146 + INTEGER(IntKi), PARAMETER :: TStC4_ZQ = 147 + INTEGER(IntKi), PARAMETER :: TStC4_ZQD = 148 + INTEGER(IntKi), PARAMETER :: TStC4_Fxi = 149 + INTEGER(IntKi), PARAMETER :: TStC4_Fyi = 150 + INTEGER(IntKi), PARAMETER :: TStC4_Fzi = 151 + INTEGER(IntKi), PARAMETER :: TStC4_Mxi = 152 + INTEGER(IntKi), PARAMETER :: TStC4_Myi = 153 + INTEGER(IntKi), PARAMETER :: TStC4_Mzi = 154 + INTEGER(IntKi), PARAMETER :: TStC4_Fxl = 155 + INTEGER(IntKi), PARAMETER :: TStC4_Fyl = 156 + INTEGER(IntKi), PARAMETER :: TStC4_Fzl = 157 + INTEGER(IntKi), PARAMETER :: TStC4_Mxl = 158 + INTEGER(IntKi), PARAMETER :: TStC4_Myl = 159 + INTEGER(IntKi), PARAMETER :: TStC4_Mzl = 160 ! Blade Structural Control (StC): - INTEGER(IntKi), PARAMETER :: BStC1_B1_XQ = 155 - INTEGER(IntKi), PARAMETER :: BStC1_B1_XQD = 156 - INTEGER(IntKi), PARAMETER :: BStC1_B1_YQ = 157 - INTEGER(IntKi), PARAMETER :: BStC1_B1_YQD = 158 - INTEGER(IntKi), PARAMETER :: BStC1_B1_ZQ = 159 - INTEGER(IntKi), PARAMETER :: BStC1_B1_ZQD = 160 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Fxi = 161 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Fyi = 162 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Fzi = 163 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Mxi = 164 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Myi = 165 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Mzi = 166 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Fxl = 167 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Fyl = 168 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Fzl = 169 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Mxl = 170 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Myl = 171 - INTEGER(IntKi), PARAMETER :: BStC1_B1_Mzl = 172 - INTEGER(IntKi), PARAMETER :: BStC2_B1_XQ = 173 - INTEGER(IntKi), PARAMETER :: BStC2_B1_XQD = 174 - INTEGER(IntKi), PARAMETER :: BStC2_B1_YQ = 175 - INTEGER(IntKi), PARAMETER :: BStC2_B1_YQD = 176 - INTEGER(IntKi), PARAMETER :: BStC2_B1_ZQ = 177 - INTEGER(IntKi), PARAMETER :: BStC2_B1_ZQD = 178 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Fxi = 179 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Fyi = 180 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Fzi = 181 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Mxi = 182 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Myi = 183 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Mzi = 184 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Fxl = 185 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Fyl = 186 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Fzl = 187 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Mxl = 188 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Myl = 189 - INTEGER(IntKi), PARAMETER :: BStC2_B1_Mzl = 190 - INTEGER(IntKi), PARAMETER :: BStC3_B1_XQ = 191 - INTEGER(IntKi), PARAMETER :: BStC3_B1_XQD = 192 - INTEGER(IntKi), PARAMETER :: BStC3_B1_YQ = 193 - INTEGER(IntKi), PARAMETER :: BStC3_B1_YQD = 194 - INTEGER(IntKi), PARAMETER :: BStC3_B1_ZQ = 195 - INTEGER(IntKi), PARAMETER :: BStC3_B1_ZQD = 196 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Fxi = 197 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Fyi = 198 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Fzi = 199 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Mxi = 200 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Myi = 201 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Mzi = 202 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Fxl = 203 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Fyl = 204 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Fzl = 205 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Mxl = 206 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Myl = 207 - INTEGER(IntKi), PARAMETER :: BStC3_B1_Mzl = 208 - INTEGER(IntKi), PARAMETER :: BStC4_B1_XQ = 209 - INTEGER(IntKi), PARAMETER :: BStC4_B1_XQD = 210 - INTEGER(IntKi), PARAMETER :: BStC4_B1_YQ = 211 - INTEGER(IntKi), PARAMETER :: BStC4_B1_YQD = 212 - INTEGER(IntKi), PARAMETER :: BStC4_B1_ZQ = 213 - INTEGER(IntKi), PARAMETER :: BStC4_B1_ZQD = 214 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Fxi = 215 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Fyi = 216 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Fzi = 217 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Mxi = 218 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Myi = 219 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Mzi = 220 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Fxl = 221 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Fyl = 222 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Fzl = 223 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Mxl = 224 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Myl = 225 - INTEGER(IntKi), PARAMETER :: BStC4_B1_Mzl = 226 - INTEGER(IntKi), PARAMETER :: BStC1_B2_XQ = 227 - INTEGER(IntKi), PARAMETER :: BStC1_B2_XQD = 228 - INTEGER(IntKi), PARAMETER :: BStC1_B2_YQ = 229 - INTEGER(IntKi), PARAMETER :: BStC1_B2_YQD = 230 - INTEGER(IntKi), PARAMETER :: BStC1_B2_ZQ = 231 - INTEGER(IntKi), PARAMETER :: BStC1_B2_ZQD = 232 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Fxi = 233 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Fyi = 234 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Fzi = 235 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Mxi = 236 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Myi = 237 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Mzi = 238 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Fxl = 239 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Fyl = 240 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Fzl = 241 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Mxl = 242 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Myl = 243 - INTEGER(IntKi), PARAMETER :: BStC1_B2_Mzl = 244 - INTEGER(IntKi), PARAMETER :: BStC2_B2_XQ = 245 - INTEGER(IntKi), PARAMETER :: BStC2_B2_XQD = 246 - INTEGER(IntKi), PARAMETER :: BStC2_B2_YQ = 247 - INTEGER(IntKi), PARAMETER :: BStC2_B2_YQD = 248 - INTEGER(IntKi), PARAMETER :: BStC2_B2_ZQ = 249 - INTEGER(IntKi), PARAMETER :: BStC2_B2_ZQD = 250 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Fxi = 251 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Fyi = 252 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Fzi = 253 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Mxi = 254 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Myi = 255 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Mzi = 256 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Fxl = 257 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Fyl = 258 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Fzl = 259 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Mxl = 260 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Myl = 261 - INTEGER(IntKi), PARAMETER :: BStC2_B2_Mzl = 262 - INTEGER(IntKi), PARAMETER :: BStC3_B2_XQ = 263 - INTEGER(IntKi), PARAMETER :: BStC3_B2_XQD = 264 - INTEGER(IntKi), PARAMETER :: BStC3_B2_YQ = 265 - INTEGER(IntKi), PARAMETER :: BStC3_B2_YQD = 266 - INTEGER(IntKi), PARAMETER :: BStC3_B2_ZQ = 267 - INTEGER(IntKi), PARAMETER :: BStC3_B2_ZQD = 268 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Fxi = 269 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Fyi = 270 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Fzi = 271 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Mxi = 272 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Myi = 273 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Mzi = 274 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Fxl = 275 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Fyl = 276 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Fzl = 277 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Mxl = 278 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Myl = 279 - INTEGER(IntKi), PARAMETER :: BStC3_B2_Mzl = 280 - INTEGER(IntKi), PARAMETER :: BStC4_B2_XQ = 281 - INTEGER(IntKi), PARAMETER :: BStC4_B2_XQD = 282 - INTEGER(IntKi), PARAMETER :: BStC4_B2_YQ = 283 - INTEGER(IntKi), PARAMETER :: BStC4_B2_YQD = 284 - INTEGER(IntKi), PARAMETER :: BStC4_B2_ZQ = 285 - INTEGER(IntKi), PARAMETER :: BStC4_B2_ZQD = 286 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Fxi = 287 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Fyi = 288 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Fzi = 289 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Mxi = 290 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Myi = 291 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Mzi = 292 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Fxl = 293 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Fyl = 294 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Fzl = 295 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Mxl = 296 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Myl = 297 - INTEGER(IntKi), PARAMETER :: BStC4_B2_Mzl = 298 - INTEGER(IntKi), PARAMETER :: BStC1_B3_XQ = 299 - INTEGER(IntKi), PARAMETER :: BStC1_B3_XQD = 300 - INTEGER(IntKi), PARAMETER :: BStC1_B3_YQ = 301 - INTEGER(IntKi), PARAMETER :: BStC1_B3_YQD = 302 - INTEGER(IntKi), PARAMETER :: BStC1_B3_ZQ = 303 - INTEGER(IntKi), PARAMETER :: BStC1_B3_ZQD = 304 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Fxi = 305 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Fyi = 306 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Fzi = 307 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Mxi = 308 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Myi = 309 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Mzi = 310 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Fxl = 311 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Fyl = 312 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Fzl = 313 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Mxl = 314 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Myl = 315 - INTEGER(IntKi), PARAMETER :: BStC1_B3_Mzl = 316 - INTEGER(IntKi), PARAMETER :: BStC2_B3_XQ = 317 - INTEGER(IntKi), PARAMETER :: BStC2_B3_XQD = 318 - INTEGER(IntKi), PARAMETER :: BStC2_B3_YQ = 319 - INTEGER(IntKi), PARAMETER :: BStC2_B3_YQD = 320 - INTEGER(IntKi), PARAMETER :: BStC2_B3_ZQ = 321 - INTEGER(IntKi), PARAMETER :: BStC2_B3_ZQD = 322 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Fxi = 323 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Fyi = 324 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Fzi = 325 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Mxi = 326 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Myi = 327 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Mzi = 328 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Fxl = 329 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Fyl = 330 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Fzl = 331 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Mxl = 332 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Myl = 333 - INTEGER(IntKi), PARAMETER :: BStC2_B3_Mzl = 334 - INTEGER(IntKi), PARAMETER :: BStC3_B3_XQ = 335 - INTEGER(IntKi), PARAMETER :: BStC3_B3_XQD = 336 - INTEGER(IntKi), PARAMETER :: BStC3_B3_YQ = 337 - INTEGER(IntKi), PARAMETER :: BStC3_B3_YQD = 338 - INTEGER(IntKi), PARAMETER :: BStC3_B3_ZQ = 339 - INTEGER(IntKi), PARAMETER :: BStC3_B3_ZQD = 340 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Fxi = 341 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Fyi = 342 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Fzi = 343 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Mxi = 344 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Myi = 345 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Mzi = 346 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Fxl = 347 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Fyl = 348 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Fzl = 349 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Mxl = 350 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Myl = 351 - INTEGER(IntKi), PARAMETER :: BStC3_B3_Mzl = 352 - INTEGER(IntKi), PARAMETER :: BStC4_B3_XQ = 353 - INTEGER(IntKi), PARAMETER :: BStC4_B3_XQD = 354 - INTEGER(IntKi), PARAMETER :: BStC4_B3_YQ = 355 - INTEGER(IntKi), PARAMETER :: BStC4_B3_YQD = 356 - INTEGER(IntKi), PARAMETER :: BStC4_B3_ZQ = 357 - INTEGER(IntKi), PARAMETER :: BStC4_B3_ZQD = 358 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Fxi = 359 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Fyi = 360 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Fzi = 361 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Mxi = 362 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Myi = 363 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Mzi = 364 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Fxl = 365 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Fyl = 366 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Fzl = 367 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Mxl = 368 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Myl = 369 - INTEGER(IntKi), PARAMETER :: BStC4_B3_Mzl = 370 - INTEGER(IntKi), PARAMETER :: BStC1_B4_XQ = 371 - INTEGER(IntKi), PARAMETER :: BStC1_B4_XQD = 372 - INTEGER(IntKi), PARAMETER :: BStC1_B4_YQ = 373 - INTEGER(IntKi), PARAMETER :: BStC1_B4_YQD = 374 - INTEGER(IntKi), PARAMETER :: BStC1_B4_ZQ = 375 - INTEGER(IntKi), PARAMETER :: BStC1_B4_ZQD = 376 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Fxi = 377 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Fyi = 378 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Fzi = 379 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Mxi = 380 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Myi = 381 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Mzi = 382 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Fxl = 383 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Fyl = 384 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Fzl = 385 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Mxl = 386 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Myl = 387 - INTEGER(IntKi), PARAMETER :: BStC1_B4_Mzl = 388 - INTEGER(IntKi), PARAMETER :: BStC2_B4_XQ = 389 - INTEGER(IntKi), PARAMETER :: BStC2_B4_XQD = 390 - INTEGER(IntKi), PARAMETER :: BStC2_B4_YQ = 391 - INTEGER(IntKi), PARAMETER :: BStC2_B4_YQD = 392 - INTEGER(IntKi), PARAMETER :: BStC2_B4_ZQ = 393 - INTEGER(IntKi), PARAMETER :: BStC2_B4_ZQD = 394 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Fxi = 395 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Fyi = 396 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Fzi = 397 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Mxi = 398 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Myi = 399 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Mzi = 400 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Fxl = 401 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Fyl = 402 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Fzl = 403 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Mxl = 404 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Myl = 405 - INTEGER(IntKi), PARAMETER :: BStC2_B4_Mzl = 406 - INTEGER(IntKi), PARAMETER :: BStC3_B4_XQ = 407 - INTEGER(IntKi), PARAMETER :: BStC3_B4_XQD = 408 - INTEGER(IntKi), PARAMETER :: BStC3_B4_YQ = 409 - INTEGER(IntKi), PARAMETER :: BStC3_B4_YQD = 410 - INTEGER(IntKi), PARAMETER :: BStC3_B4_ZQ = 411 - INTEGER(IntKi), PARAMETER :: BStC3_B4_ZQD = 412 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Fxi = 413 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Fyi = 414 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Fzi = 415 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Mxi = 416 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Myi = 417 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Mzi = 418 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Fxl = 419 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Fyl = 420 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Fzl = 421 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Mxl = 422 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Myl = 423 - INTEGER(IntKi), PARAMETER :: BStC3_B4_Mzl = 424 - INTEGER(IntKi), PARAMETER :: BStC4_B4_XQ = 425 - INTEGER(IntKi), PARAMETER :: BStC4_B4_XQD = 426 - INTEGER(IntKi), PARAMETER :: BStC4_B4_YQ = 427 - INTEGER(IntKi), PARAMETER :: BStC4_B4_YQD = 428 - INTEGER(IntKi), PARAMETER :: BStC4_B4_ZQ = 429 - INTEGER(IntKi), PARAMETER :: BStC4_B4_ZQD = 430 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Fxi = 431 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Fyi = 432 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Fzi = 433 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Mxi = 434 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Myi = 435 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Mzi = 436 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Fxl = 437 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Fyl = 438 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Fzl = 439 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Mxl = 440 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Myl = 441 - INTEGER(IntKi), PARAMETER :: BStC4_B4_Mzl = 442 + INTEGER(IntKi), PARAMETER :: BStC1_B1_XQ = 161 + INTEGER(IntKi), PARAMETER :: BStC1_B1_XQD = 162 + INTEGER(IntKi), PARAMETER :: BStC1_B1_YQ = 163 + INTEGER(IntKi), PARAMETER :: BStC1_B1_YQD = 164 + INTEGER(IntKi), PARAMETER :: BStC1_B1_ZQ = 165 + INTEGER(IntKi), PARAMETER :: BStC1_B1_ZQD = 166 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Fxi = 167 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Fyi = 168 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Fzi = 169 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Mxi = 170 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Myi = 171 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Mzi = 172 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Fxl = 173 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Fyl = 174 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Fzl = 175 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Mxl = 176 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Myl = 177 + INTEGER(IntKi), PARAMETER :: BStC1_B1_Mzl = 178 + INTEGER(IntKi), PARAMETER :: BStC2_B1_XQ = 179 + INTEGER(IntKi), PARAMETER :: BStC2_B1_XQD = 180 + INTEGER(IntKi), PARAMETER :: BStC2_B1_YQ = 181 + INTEGER(IntKi), PARAMETER :: BStC2_B1_YQD = 182 + INTEGER(IntKi), PARAMETER :: BStC2_B1_ZQ = 183 + INTEGER(IntKi), PARAMETER :: BStC2_B1_ZQD = 184 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Fxi = 185 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Fyi = 186 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Fzi = 187 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Mxi = 188 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Myi = 189 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Mzi = 190 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Fxl = 191 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Fyl = 192 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Fzl = 193 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Mxl = 194 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Myl = 195 + INTEGER(IntKi), PARAMETER :: BStC2_B1_Mzl = 196 + INTEGER(IntKi), PARAMETER :: BStC3_B1_XQ = 197 + INTEGER(IntKi), PARAMETER :: BStC3_B1_XQD = 198 + INTEGER(IntKi), PARAMETER :: BStC3_B1_YQ = 199 + INTEGER(IntKi), PARAMETER :: BStC3_B1_YQD = 200 + INTEGER(IntKi), PARAMETER :: BStC3_B1_ZQ = 201 + INTEGER(IntKi), PARAMETER :: BStC3_B1_ZQD = 202 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Fxi = 203 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Fyi = 204 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Fzi = 205 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Mxi = 206 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Myi = 207 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Mzi = 208 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Fxl = 209 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Fyl = 210 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Fzl = 211 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Mxl = 212 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Myl = 213 + INTEGER(IntKi), PARAMETER :: BStC3_B1_Mzl = 214 + INTEGER(IntKi), PARAMETER :: BStC4_B1_XQ = 215 + INTEGER(IntKi), PARAMETER :: BStC4_B1_XQD = 216 + INTEGER(IntKi), PARAMETER :: BStC4_B1_YQ = 217 + INTEGER(IntKi), PARAMETER :: BStC4_B1_YQD = 218 + INTEGER(IntKi), PARAMETER :: BStC4_B1_ZQ = 219 + INTEGER(IntKi), PARAMETER :: BStC4_B1_ZQD = 220 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Fxi = 221 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Fyi = 222 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Fzi = 223 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Mxi = 224 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Myi = 225 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Mzi = 226 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Fxl = 227 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Fyl = 228 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Fzl = 229 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Mxl = 230 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Myl = 231 + INTEGER(IntKi), PARAMETER :: BStC4_B1_Mzl = 232 + INTEGER(IntKi), PARAMETER :: BStC1_B2_XQ = 233 + INTEGER(IntKi), PARAMETER :: BStC1_B2_XQD = 234 + INTEGER(IntKi), PARAMETER :: BStC1_B2_YQ = 235 + INTEGER(IntKi), PARAMETER :: BStC1_B2_YQD = 236 + INTEGER(IntKi), PARAMETER :: BStC1_B2_ZQ = 237 + INTEGER(IntKi), PARAMETER :: BStC1_B2_ZQD = 238 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Fxi = 239 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Fyi = 240 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Fzi = 241 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Mxi = 242 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Myi = 243 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Mzi = 244 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Fxl = 245 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Fyl = 246 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Fzl = 247 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Mxl = 248 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Myl = 249 + INTEGER(IntKi), PARAMETER :: BStC1_B2_Mzl = 250 + INTEGER(IntKi), PARAMETER :: BStC2_B2_XQ = 251 + INTEGER(IntKi), PARAMETER :: BStC2_B2_XQD = 252 + INTEGER(IntKi), PARAMETER :: BStC2_B2_YQ = 253 + INTEGER(IntKi), PARAMETER :: BStC2_B2_YQD = 254 + INTEGER(IntKi), PARAMETER :: BStC2_B2_ZQ = 255 + INTEGER(IntKi), PARAMETER :: BStC2_B2_ZQD = 256 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Fxi = 257 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Fyi = 258 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Fzi = 259 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Mxi = 260 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Myi = 261 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Mzi = 262 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Fxl = 263 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Fyl = 264 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Fzl = 265 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Mxl = 266 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Myl = 267 + INTEGER(IntKi), PARAMETER :: BStC2_B2_Mzl = 268 + INTEGER(IntKi), PARAMETER :: BStC3_B2_XQ = 269 + INTEGER(IntKi), PARAMETER :: BStC3_B2_XQD = 270 + INTEGER(IntKi), PARAMETER :: BStC3_B2_YQ = 271 + INTEGER(IntKi), PARAMETER :: BStC3_B2_YQD = 272 + INTEGER(IntKi), PARAMETER :: BStC3_B2_ZQ = 273 + INTEGER(IntKi), PARAMETER :: BStC3_B2_ZQD = 274 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Fxi = 275 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Fyi = 276 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Fzi = 277 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Mxi = 278 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Myi = 279 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Mzi = 280 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Fxl = 281 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Fyl = 282 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Fzl = 283 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Mxl = 284 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Myl = 285 + INTEGER(IntKi), PARAMETER :: BStC3_B2_Mzl = 286 + INTEGER(IntKi), PARAMETER :: BStC4_B2_XQ = 287 + INTEGER(IntKi), PARAMETER :: BStC4_B2_XQD = 288 + INTEGER(IntKi), PARAMETER :: BStC4_B2_YQ = 289 + INTEGER(IntKi), PARAMETER :: BStC4_B2_YQD = 290 + INTEGER(IntKi), PARAMETER :: BStC4_B2_ZQ = 291 + INTEGER(IntKi), PARAMETER :: BStC4_B2_ZQD = 292 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Fxi = 293 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Fyi = 294 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Fzi = 295 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Mxi = 296 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Myi = 297 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Mzi = 298 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Fxl = 299 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Fyl = 300 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Fzl = 301 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Mxl = 302 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Myl = 303 + INTEGER(IntKi), PARAMETER :: BStC4_B2_Mzl = 304 + INTEGER(IntKi), PARAMETER :: BStC1_B3_XQ = 305 + INTEGER(IntKi), PARAMETER :: BStC1_B3_XQD = 306 + INTEGER(IntKi), PARAMETER :: BStC1_B3_YQ = 307 + INTEGER(IntKi), PARAMETER :: BStC1_B3_YQD = 308 + INTEGER(IntKi), PARAMETER :: BStC1_B3_ZQ = 309 + INTEGER(IntKi), PARAMETER :: BStC1_B3_ZQD = 310 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Fxi = 311 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Fyi = 312 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Fzi = 313 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Mxi = 314 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Myi = 315 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Mzi = 316 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Fxl = 317 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Fyl = 318 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Fzl = 319 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Mxl = 320 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Myl = 321 + INTEGER(IntKi), PARAMETER :: BStC1_B3_Mzl = 322 + INTEGER(IntKi), PARAMETER :: BStC2_B3_XQ = 323 + INTEGER(IntKi), PARAMETER :: BStC2_B3_XQD = 324 + INTEGER(IntKi), PARAMETER :: BStC2_B3_YQ = 325 + INTEGER(IntKi), PARAMETER :: BStC2_B3_YQD = 326 + INTEGER(IntKi), PARAMETER :: BStC2_B3_ZQ = 327 + INTEGER(IntKi), PARAMETER :: BStC2_B3_ZQD = 328 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Fxi = 329 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Fyi = 330 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Fzi = 331 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Mxi = 332 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Myi = 333 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Mzi = 334 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Fxl = 335 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Fyl = 336 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Fzl = 337 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Mxl = 338 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Myl = 339 + INTEGER(IntKi), PARAMETER :: BStC2_B3_Mzl = 340 + INTEGER(IntKi), PARAMETER :: BStC3_B3_XQ = 341 + INTEGER(IntKi), PARAMETER :: BStC3_B3_XQD = 342 + INTEGER(IntKi), PARAMETER :: BStC3_B3_YQ = 343 + INTEGER(IntKi), PARAMETER :: BStC3_B3_YQD = 344 + INTEGER(IntKi), PARAMETER :: BStC3_B3_ZQ = 345 + INTEGER(IntKi), PARAMETER :: BStC3_B3_ZQD = 346 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Fxi = 347 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Fyi = 348 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Fzi = 349 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Mxi = 350 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Myi = 351 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Mzi = 352 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Fxl = 353 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Fyl = 354 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Fzl = 355 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Mxl = 356 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Myl = 357 + INTEGER(IntKi), PARAMETER :: BStC3_B3_Mzl = 358 + INTEGER(IntKi), PARAMETER :: BStC4_B3_XQ = 359 + INTEGER(IntKi), PARAMETER :: BStC4_B3_XQD = 360 + INTEGER(IntKi), PARAMETER :: BStC4_B3_YQ = 361 + INTEGER(IntKi), PARAMETER :: BStC4_B3_YQD = 362 + INTEGER(IntKi), PARAMETER :: BStC4_B3_ZQ = 363 + INTEGER(IntKi), PARAMETER :: BStC4_B3_ZQD = 364 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Fxi = 365 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Fyi = 366 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Fzi = 367 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Mxi = 368 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Myi = 369 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Mzi = 370 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Fxl = 371 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Fyl = 372 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Fzl = 373 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Mxl = 374 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Myl = 375 + INTEGER(IntKi), PARAMETER :: BStC4_B3_Mzl = 376 + INTEGER(IntKi), PARAMETER :: BStC1_B4_XQ = 377 + INTEGER(IntKi), PARAMETER :: BStC1_B4_XQD = 378 + INTEGER(IntKi), PARAMETER :: BStC1_B4_YQ = 379 + INTEGER(IntKi), PARAMETER :: BStC1_B4_YQD = 380 + INTEGER(IntKi), PARAMETER :: BStC1_B4_ZQ = 381 + INTEGER(IntKi), PARAMETER :: BStC1_B4_ZQD = 382 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Fxi = 383 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Fyi = 384 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Fzi = 385 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Mxi = 386 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Myi = 387 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Mzi = 388 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Fxl = 389 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Fyl = 390 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Fzl = 391 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Mxl = 392 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Myl = 393 + INTEGER(IntKi), PARAMETER :: BStC1_B4_Mzl = 394 + INTEGER(IntKi), PARAMETER :: BStC2_B4_XQ = 395 + INTEGER(IntKi), PARAMETER :: BStC2_B4_XQD = 396 + INTEGER(IntKi), PARAMETER :: BStC2_B4_YQ = 397 + INTEGER(IntKi), PARAMETER :: BStC2_B4_YQD = 398 + INTEGER(IntKi), PARAMETER :: BStC2_B4_ZQ = 399 + INTEGER(IntKi), PARAMETER :: BStC2_B4_ZQD = 400 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Fxi = 401 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Fyi = 402 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Fzi = 403 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Mxi = 404 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Myi = 405 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Mzi = 406 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Fxl = 407 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Fyl = 408 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Fzl = 409 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Mxl = 410 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Myl = 411 + INTEGER(IntKi), PARAMETER :: BStC2_B4_Mzl = 412 + INTEGER(IntKi), PARAMETER :: BStC3_B4_XQ = 413 + INTEGER(IntKi), PARAMETER :: BStC3_B4_XQD = 414 + INTEGER(IntKi), PARAMETER :: BStC3_B4_YQ = 415 + INTEGER(IntKi), PARAMETER :: BStC3_B4_YQD = 416 + INTEGER(IntKi), PARAMETER :: BStC3_B4_ZQ = 417 + INTEGER(IntKi), PARAMETER :: BStC3_B4_ZQD = 418 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Fxi = 419 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Fyi = 420 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Fzi = 421 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Mxi = 422 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Myi = 423 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Mzi = 424 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Fxl = 425 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Fyl = 426 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Fzl = 427 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Mxl = 428 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Myl = 429 + INTEGER(IntKi), PARAMETER :: BStC3_B4_Mzl = 430 + INTEGER(IntKi), PARAMETER :: BStC4_B4_XQ = 431 + INTEGER(IntKi), PARAMETER :: BStC4_B4_XQD = 432 + INTEGER(IntKi), PARAMETER :: BStC4_B4_YQ = 433 + INTEGER(IntKi), PARAMETER :: BStC4_B4_YQD = 434 + INTEGER(IntKi), PARAMETER :: BStC4_B4_ZQ = 435 + INTEGER(IntKi), PARAMETER :: BStC4_B4_ZQD = 436 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Fxi = 437 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Fyi = 438 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Fzi = 439 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Mxi = 440 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Myi = 441 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Mzi = 442 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Fxl = 443 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Fyl = 444 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Fzl = 445 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Mxl = 446 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Myl = 447 + INTEGER(IntKi), PARAMETER :: BStC4_B4_Mzl = 448 ! Substructure Structural Control (StC): - INTEGER(IntKi), PARAMETER :: SStC1_XQ = 443 - INTEGER(IntKi), PARAMETER :: SStC1_XQD = 444 - INTEGER(IntKi), PARAMETER :: SStC1_YQ = 445 - INTEGER(IntKi), PARAMETER :: SStC1_YQD = 446 - INTEGER(IntKi), PARAMETER :: SStC1_ZQ = 447 - INTEGER(IntKi), PARAMETER :: SStC1_ZQD = 448 - INTEGER(IntKi), PARAMETER :: SStC1_Fxi = 449 - INTEGER(IntKi), PARAMETER :: SStC1_Fyi = 450 - INTEGER(IntKi), PARAMETER :: SStC1_Fzi = 451 - INTEGER(IntKi), PARAMETER :: SStC1_Mxi = 452 - INTEGER(IntKi), PARAMETER :: SStC1_Myi = 453 - INTEGER(IntKi), PARAMETER :: SStC1_Mzi = 454 - INTEGER(IntKi), PARAMETER :: SStC1_Fxl = 455 - INTEGER(IntKi), PARAMETER :: SStC1_Fyl = 456 - INTEGER(IntKi), PARAMETER :: SStC1_Fzl = 457 - INTEGER(IntKi), PARAMETER :: SStC1_Mxl = 458 - INTEGER(IntKi), PARAMETER :: SStC1_Myl = 459 - INTEGER(IntKi), PARAMETER :: SStC1_Mzl = 460 - INTEGER(IntKi), PARAMETER :: SStC2_XQ = 461 - INTEGER(IntKi), PARAMETER :: SStC2_XQD = 462 - INTEGER(IntKi), PARAMETER :: SStC2_YQ = 463 - INTEGER(IntKi), PARAMETER :: SStC2_YQD = 464 - INTEGER(IntKi), PARAMETER :: SStC2_ZQ = 465 - INTEGER(IntKi), PARAMETER :: SStC2_ZQD = 466 - INTEGER(IntKi), PARAMETER :: SStC2_Fxi = 467 - INTEGER(IntKi), PARAMETER :: SStC2_Fyi = 468 - INTEGER(IntKi), PARAMETER :: SStC2_Fzi = 469 - INTEGER(IntKi), PARAMETER :: SStC2_Mxi = 470 - INTEGER(IntKi), PARAMETER :: SStC2_Myi = 471 - INTEGER(IntKi), PARAMETER :: SStC2_Mzi = 472 - INTEGER(IntKi), PARAMETER :: SStC2_Fxl = 473 - INTEGER(IntKi), PARAMETER :: SStC2_Fyl = 474 - INTEGER(IntKi), PARAMETER :: SStC2_Fzl = 475 - INTEGER(IntKi), PARAMETER :: SStC2_Mxl = 476 - INTEGER(IntKi), PARAMETER :: SStC2_Myl = 477 - INTEGER(IntKi), PARAMETER :: SStC2_Mzl = 478 - INTEGER(IntKi), PARAMETER :: SStC3_XQ = 479 - INTEGER(IntKi), PARAMETER :: SStC3_XQD = 480 - INTEGER(IntKi), PARAMETER :: SStC3_YQ = 481 - INTEGER(IntKi), PARAMETER :: SStC3_YQD = 482 - INTEGER(IntKi), PARAMETER :: SStC3_ZQ = 483 - INTEGER(IntKi), PARAMETER :: SStC3_ZQD = 484 - INTEGER(IntKi), PARAMETER :: SStC3_Fxi = 485 - INTEGER(IntKi), PARAMETER :: SStC3_Fyi = 486 - INTEGER(IntKi), PARAMETER :: SStC3_Fzi = 487 - INTEGER(IntKi), PARAMETER :: SStC3_Mxi = 488 - INTEGER(IntKi), PARAMETER :: SStC3_Myi = 489 - INTEGER(IntKi), PARAMETER :: SStC3_Mzi = 490 - INTEGER(IntKi), PARAMETER :: SStC3_Fxl = 491 - INTEGER(IntKi), PARAMETER :: SStC3_Fyl = 492 - INTEGER(IntKi), PARAMETER :: SStC3_Fzl = 493 - INTEGER(IntKi), PARAMETER :: SStC3_Mxl = 494 - INTEGER(IntKi), PARAMETER :: SStC3_Myl = 495 - INTEGER(IntKi), PARAMETER :: SStC3_Mzl = 496 - INTEGER(IntKi), PARAMETER :: SStC4_XQ = 497 - INTEGER(IntKi), PARAMETER :: SStC4_XQD = 498 - INTEGER(IntKi), PARAMETER :: SStC4_YQ = 499 - INTEGER(IntKi), PARAMETER :: SStC4_YQD = 500 - INTEGER(IntKi), PARAMETER :: SStC4_ZQ = 501 - INTEGER(IntKi), PARAMETER :: SStC4_ZQD = 502 - INTEGER(IntKi), PARAMETER :: SStC4_Fxi = 503 - INTEGER(IntKi), PARAMETER :: SStC4_Fyi = 504 - INTEGER(IntKi), PARAMETER :: SStC4_Fzi = 505 - INTEGER(IntKi), PARAMETER :: SStC4_Mxi = 506 - INTEGER(IntKi), PARAMETER :: SStC4_Myi = 507 - INTEGER(IntKi), PARAMETER :: SStC4_Mzi = 508 - INTEGER(IntKi), PARAMETER :: SStC4_Fxl = 509 - INTEGER(IntKi), PARAMETER :: SStC4_Fyl = 510 - INTEGER(IntKi), PARAMETER :: SStC4_Fzl = 511 - INTEGER(IntKi), PARAMETER :: SStC4_Mxl = 512 - INTEGER(IntKi), PARAMETER :: SStC4_Myl = 513 - INTEGER(IntKi), PARAMETER :: SStC4_Mzl = 514 + INTEGER(IntKi), PARAMETER :: SStC1_XQ = 449 + INTEGER(IntKi), PARAMETER :: SStC1_XQD = 450 + INTEGER(IntKi), PARAMETER :: SStC1_YQ = 451 + INTEGER(IntKi), PARAMETER :: SStC1_YQD = 452 + INTEGER(IntKi), PARAMETER :: SStC1_ZQ = 453 + INTEGER(IntKi), PARAMETER :: SStC1_ZQD = 454 + INTEGER(IntKi), PARAMETER :: SStC1_Fxi = 455 + INTEGER(IntKi), PARAMETER :: SStC1_Fyi = 456 + INTEGER(IntKi), PARAMETER :: SStC1_Fzi = 457 + INTEGER(IntKi), PARAMETER :: SStC1_Mxi = 458 + INTEGER(IntKi), PARAMETER :: SStC1_Myi = 459 + INTEGER(IntKi), PARAMETER :: SStC1_Mzi = 460 + INTEGER(IntKi), PARAMETER :: SStC1_Fxl = 461 + INTEGER(IntKi), PARAMETER :: SStC1_Fyl = 462 + INTEGER(IntKi), PARAMETER :: SStC1_Fzl = 463 + INTEGER(IntKi), PARAMETER :: SStC1_Mxl = 464 + INTEGER(IntKi), PARAMETER :: SStC1_Myl = 465 + INTEGER(IntKi), PARAMETER :: SStC1_Mzl = 466 + INTEGER(IntKi), PARAMETER :: SStC2_XQ = 467 + INTEGER(IntKi), PARAMETER :: SStC2_XQD = 468 + INTEGER(IntKi), PARAMETER :: SStC2_YQ = 469 + INTEGER(IntKi), PARAMETER :: SStC2_YQD = 470 + INTEGER(IntKi), PARAMETER :: SStC2_ZQ = 471 + INTEGER(IntKi), PARAMETER :: SStC2_ZQD = 472 + INTEGER(IntKi), PARAMETER :: SStC2_Fxi = 473 + INTEGER(IntKi), PARAMETER :: SStC2_Fyi = 474 + INTEGER(IntKi), PARAMETER :: SStC2_Fzi = 475 + INTEGER(IntKi), PARAMETER :: SStC2_Mxi = 476 + INTEGER(IntKi), PARAMETER :: SStC2_Myi = 477 + INTEGER(IntKi), PARAMETER :: SStC2_Mzi = 478 + INTEGER(IntKi), PARAMETER :: SStC2_Fxl = 479 + INTEGER(IntKi), PARAMETER :: SStC2_Fyl = 480 + INTEGER(IntKi), PARAMETER :: SStC2_Fzl = 481 + INTEGER(IntKi), PARAMETER :: SStC2_Mxl = 482 + INTEGER(IntKi), PARAMETER :: SStC2_Myl = 483 + INTEGER(IntKi), PARAMETER :: SStC2_Mzl = 484 + INTEGER(IntKi), PARAMETER :: SStC3_XQ = 485 + INTEGER(IntKi), PARAMETER :: SStC3_XQD = 486 + INTEGER(IntKi), PARAMETER :: SStC3_YQ = 487 + INTEGER(IntKi), PARAMETER :: SStC3_YQD = 488 + INTEGER(IntKi), PARAMETER :: SStC3_ZQ = 489 + INTEGER(IntKi), PARAMETER :: SStC3_ZQD = 490 + INTEGER(IntKi), PARAMETER :: SStC3_Fxi = 491 + INTEGER(IntKi), PARAMETER :: SStC3_Fyi = 492 + INTEGER(IntKi), PARAMETER :: SStC3_Fzi = 493 + INTEGER(IntKi), PARAMETER :: SStC3_Mxi = 494 + INTEGER(IntKi), PARAMETER :: SStC3_Myi = 495 + INTEGER(IntKi), PARAMETER :: SStC3_Mzi = 496 + INTEGER(IntKi), PARAMETER :: SStC3_Fxl = 497 + INTEGER(IntKi), PARAMETER :: SStC3_Fyl = 498 + INTEGER(IntKi), PARAMETER :: SStC3_Fzl = 499 + INTEGER(IntKi), PARAMETER :: SStC3_Mxl = 500 + INTEGER(IntKi), PARAMETER :: SStC3_Myl = 501 + INTEGER(IntKi), PARAMETER :: SStC3_Mzl = 502 + INTEGER(IntKi), PARAMETER :: SStC4_XQ = 503 + INTEGER(IntKi), PARAMETER :: SStC4_XQD = 504 + INTEGER(IntKi), PARAMETER :: SStC4_YQ = 505 + INTEGER(IntKi), PARAMETER :: SStC4_YQD = 506 + INTEGER(IntKi), PARAMETER :: SStC4_ZQ = 507 + INTEGER(IntKi), PARAMETER :: SStC4_ZQD = 508 + INTEGER(IntKi), PARAMETER :: SStC4_Fxi = 509 + INTEGER(IntKi), PARAMETER :: SStC4_Fyi = 510 + INTEGER(IntKi), PARAMETER :: SStC4_Fzi = 511 + INTEGER(IntKi), PARAMETER :: SStC4_Mxi = 512 + INTEGER(IntKi), PARAMETER :: SStC4_Myi = 513 + INTEGER(IntKi), PARAMETER :: SStC4_Mzi = 514 + INTEGER(IntKi), PARAMETER :: SStC4_Fxl = 515 + INTEGER(IntKi), PARAMETER :: SStC4_Fyl = 516 + INTEGER(IntKi), PARAMETER :: SStC4_Fzl = 517 + INTEGER(IntKi), PARAMETER :: SStC4_Mxl = 518 + INTEGER(IntKi), PARAMETER :: SStC4_Myl = 519 + INTEGER(IntKi), PARAMETER :: SStC4_Mzl = 520 ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER :: MaxOutPts = 514 + INTEGER(IntKi), PARAMETER :: MaxOutPts = 520 -!End of code generated by Matlab script +!End of code generated by Matlab script Write_ChckOutLst ! =================================================================================================== INTEGER(IntKi), PARAMETER :: BlPitchC (3) = (/ BlPitchC1, BlPitchC2, BlPitchC3 /) + INTEGER(IntKi), PARAMETER :: BlPRateC (3) = (/ BlPRateC1, BlPRateC2, BlPRateC3 /) + INTEGER(IntKi), PARAMETER :: BlPitchM (3) = (/ BlPitchM1, BlPitchM2, BlPitchM3 /) + INTEGER(IntKi), PARAMETER :: BlAirfoilC (3) = (/ BlAirFlC1, BlAirFlC2, BlAirFlC3 /) ! Structural Control outputs -- these arrays simplify the output a little. The MaxBlOuts and MaxStC @@ -791,6 +800,8 @@ subroutine Set_SrvD_Outs( p, y, m, AllOuts ) DO K=1,p%NumBl AllOuts( BlPitchC(K) ) = y%BlPitchCom(K)*R2D + AllOuts( BlPRateC(K) ) = y%BlPRateCom(K)*R2D + AllOuts( BlPitchM(K) ) = y%BlPitchMom(K)*0.001 AllOuts( BlAirfoilC(K) ) = y%BlAirfoilCom(K) END DO @@ -820,7 +831,7 @@ subroutine Set_NStC_Outs_Instance( i, x, m, y, AllOuts ) ! Nacelle single St real(ReKi), intent(inout) :: AllOuts(0:MaxOutPts) ! All the available output channels integer :: j j=1 - if (i < MaxStC) then + if (i <= MaxStC) then AllOuts(NStC_XQ( i)) = x%StC_x(1,1) ! x AllOuts(NStC_XQD(i)) = x%StC_x(2,1) ! x-dot AllOuts(NStC_YQ( i)) = x%StC_x(3,1) ! y @@ -864,7 +875,7 @@ subroutine Set_TStC_Outs_Instance( i, x, m, y, AllOuts ) ! Tower single StC real(ReKi), intent(inout) :: AllOuts(0:MaxOutPts) ! All the available output channels integer :: j j=1 - if (i < MaxStC) then + if (i <= MaxStC) then AllOuts(TStC_XQ( i)) = x%StC_x(1,1) ! x AllOuts(TStC_XQD(i)) = x%StC_x(2,1) ! x-dot AllOuts(TStC_YQ( i)) = x%StC_x(3,1) ! y @@ -908,7 +919,7 @@ subroutine Set_BStC_Outs_Instance( i, numBl, x, m, y, AllOuts ) ! Single type(StC_OutputType), intent(in ) :: y !< Outputs computed at Time real(ReKi), intent(inout) :: AllOuts(0:MaxOutPts) ! All the available output channels integer :: j - if (i < MaxStC) then + if (i <= MaxStC) then do j=1,min(NumBl,MaxBlOuts) AllOuts(BStC_XQ( i,j)) = x%StC_x(1,j) ! x AllOuts(BStC_XQD(i,j)) = x%StC_x(2,j) ! x-dot @@ -954,7 +965,7 @@ subroutine Set_SStC_Outs_Instance( i, x, m, y, AllOuts ) ! Platform real(ReKi), intent(inout) :: AllOuts(0:MaxOutPts) ! All the available output channels integer :: j j=1 - if (i < MaxStC) then + if (i <= MaxStC) then AllOuts(SStC_XQ( i)) = x%StC_x(1,1) ! x AllOuts(SStC_XQD(i)) = x%StC_x(2,1) ! x-dot AllOuts(SStC_YQ( i)) = x%StC_x(3,1) ! y @@ -1057,6 +1068,28 @@ subroutine ParseInputFileInfo( PriPath, InputFile, OutFileRoot, FileInfo_In, Inp call ParseVar( FileInfo_In, CurLine, 'TPCOn', InputFileData%TPCOn, ErrStat2, ErrMsg2, UnEcho ) if (Failed()) return; + ! PitNeut - Neutral pitch position--pitch spring moment is zero at this pitch (degrees) + do i=1,size(InputFileData%PitNeut) + TmpChr='PitNeut('//trim(Num2LStr(i))//')' + call ParseVar( FileInfo_In, CurLine, trim(TmpChr), InputFileData%PitNeut(i), ErrStat2, ErrMsg2, UnEcho ) + if (Failed()) return; + enddo + InputFileData%PitNeut = InputFileData%PitNeut*D2R + + ! PitSpr - Blade-pitch spring constant (N-m/rad) + do i=1,size(InputFileData%PitSpr) + TmpChr='PitSpr('//trim(Num2LStr(i))//')' + call ParseVar( FileInfo_In, CurLine, trim(TmpChr), InputFileData%PitSpr(i), ErrStat2, ErrMsg2, UnEcho ) + if (Failed()) return; + enddo + + ! PitDamp - Blade-pitch damping constant (N-m/(rad/s)) + do i=1,size(InputFileData%PitDamp) + TmpChr='PitDamp('//trim(Num2LStr(i))//')' + call ParseVar( FileInfo_In, CurLine, trim(TmpChr), InputFileData%PitDamp(i), ErrStat2, ErrMsg2, UnEcho ) + if (Failed()) return; + enddo + ! TPitManS - Time to start override pitch maneuver for blade 1 and end standard pitch control (s) do i=1,size(InputFileData%TPitManS) TmpChr='TPitManS('//trim(Num2LStr(i))//')' @@ -1494,7 +1527,7 @@ end subroutine ParseInputFileInfo !! 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 04-Feb-2021 08:42:27. +!! This routine was generated by Write_ChckOutLst.m using the parameters listed in OutListParameters.xlsx at 29-Oct-2025 13:26:57. SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) !.................................................................................................................................. @@ -1519,9 +1552,10 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(518) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(524) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically "BLAIRFLC1 ","BLAIRFLC2 ","BLAIRFLC3 ","BLFLAP1 ","BLFLAP2 ","BLFLAP3 ", & - "BLPITCHC1 ","BLPITCHC2 ","BLPITCHC3 ","BSTC1_B1_FXI","BSTC1_B1_FXL","BSTC1_B1_FYI", & + "BLPITCHC1 ","BLPITCHC2 ","BLPITCHC3 ","BLPITCHM1 ","BLPITCHM2 ","BLPITCHM3 ", & + "BLPRATEC1 ","BLPRATEC2 ","BLPRATEC3 ","BSTC1_B1_FXI","BSTC1_B1_FXL","BSTC1_B1_FYI", & "BSTC1_B1_FYL","BSTC1_B1_FZI","BSTC1_B1_FZL","BSTC1_B1_MXI","BSTC1_B1_MXL","BSTC1_B1_MYI", & "BSTC1_B1_MYL","BSTC1_B1_MZI","BSTC1_B1_MZL","BSTC1_B1_XQ ","BSTC1_B1_XQD","BSTC1_B1_YQ ", & "BSTC1_B1_YQD","BSTC1_B1_ZQ ","BSTC1_B1_ZQD","BSTC1_B2_FXI","BSTC1_B2_FXL","BSTC1_B2_FYI", & @@ -1607,9 +1641,10 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) "TSTC4_MXI ","TSTC4_MXL ","TSTC4_MYI ","TSTC4_MYL ","TSTC4_MZI ","TSTC4_MZL ", & "TSTC4_XQ ","TSTC4_XQD ","TSTC4_YQ ","TSTC4_YQD ","TSTC4_ZQ ","TSTC4_ZQD ", & "YAWMOM ","YAWMOMCOM "/) - INTEGER(IntKi), PARAMETER :: ParamIndxAry(518) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(524) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) BlAirFlC1 , BlAirFlC2 , BlAirFlC3 , BlAirFlC1 , BlAirFlC2 , BlAirFlC3 , & - BlPitchC1 , BlPitchC2 , BlPitchC3 , BStC1_B1_Fxi , BStC1_B1_Fxl , BStC1_B1_Fyi , & + BlPitchC1 , BlPitchC2 , BlPitchC3 , BlPitchM1 , BlPitchM2 , BlPitchM3 , & + BlPRateC1 , BlPRateC2 , BlPRateC3 , BStC1_B1_Fxi , BStC1_B1_Fxl , BStC1_B1_Fyi , & BStC1_B1_Fyl , BStC1_B1_Fzi , BStC1_B1_Fzl , BStC1_B1_Mxi , BStC1_B1_Mxl , BStC1_B1_Myi , & BStC1_B1_Myl , BStC1_B1_Mzi , BStC1_B1_Mzl , BStC1_B1_XQ , BStC1_B1_XQD , BStC1_B1_YQ , & BStC1_B1_YQD , BStC1_B1_ZQ , BStC1_B1_ZQD , BStC1_B2_Fxi , BStC1_B2_Fxl , BStC1_B2_Fyi , & @@ -1695,94 +1730,95 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) TStC4_Mxi , TStC4_Mxl , TStC4_Myi , TStC4_Myl , TStC4_Mzi , TStC4_Mzl , & TStC4_XQ , TStC4_XQD , TStC4_YQ , TStC4_YQD , TStC4_ZQ , TStC4_ZQD , & YawMomCom , YawMomCom /) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(518) = (/ & ! This lists the units corresponding to the allowed parameters - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(deg) ","(deg) ","(deg) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & - "(kN) ","(kN) ","(kN) ","(kN-m)","(kN-m)","(kN-m)", & - "(kN-m)","(kN-m)","(kN-m)","(m) ","(m/s) ","(m) ", & - "(m/s) ","(m) ","(m/s) ","(kW) ","(kN-m)","(kN-m)", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & - "(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)","(kN-m)", & - "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & - "(kN-m)","(kN-m)"/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(524) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(deg) ","(deg) ","(deg) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(deg/s)","(deg/s)","(deg/s)","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kN) ","(kN) ","(kN) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(m) ","(m/s) ","(m) ", & + "(m/s) ","(m) ","(m/s) ","(kW) ","(kN-m) ","(kN-m) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN) ","(kN) ","(kN) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(m) ","(m/s) ","(m) ","(m/s) ","(m) ","(m/s) ", & + "(kN-m) ","(kN-m) "/) ! Initialize values @@ -1795,6 +1831,8 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) InvalidOutput( BlAirFlC3) = ( p%NumBl < 3 ) InvalidOutput( BlPitchC3) = ( p%NumBl < 3 ) + InvalidOutput( BlPRateC3) = ( p%NumBl < 3 ) + InvalidOutput( BlPitchM3) = ( p%NumBl < 3 ) InvalidOutput( NStC1_XQ) = ( p%NumNStC<1 ) InvalidOutput( NStC1_XQD) = ( p%NumNStC<1 ) InvalidOutput( NStC1_YQ) = ( p%NumNStC<1 ) @@ -2386,6 +2424,7 @@ END SUBROUTINE SetOutParam !********************************************************************************************************************************** + !==================================================================================================== subroutine InitializeSummaryFile(InputFileData,OutfileRoot,UnSum,ErrStat,ErrMsg) type(SrvD_InputFile), intent(in ) :: InputFileData !< Data stored in the module's input file diff --git a/modules/servodyn/src/ServoDyn_Registry.txt b/modules/servodyn/src/ServoDyn_Registry.txt index c752d57c97..7234bca769 100644 --- a/modules/servodyn/src/ServoDyn_Registry.txt +++ b/modules/servodyn/src/ServoDyn_Registry.txt @@ -18,6 +18,7 @@ usefrom StrucCtrl_Registry.txt # Define inputs that the initialization routine may need here: typedef ServoDyn/SrvD InitInputType CHARACTER(1024) InputFile - - - "Name of the input file" - typedef ^ InitInputType Logical Linearize - .FALSE. - "Flag that tells this module if the glue code wants to linearize." - +typedef ^ InitInputType Logical TightED - - - "ElastoDyn is tightly coupled" - typedef ^ InitInputType IntKi NumBl - - - "Number of blades on the turbine" - typedef ^ InitInputType CHARACTER(1024) RootName - - - "RootName for writing output files" - typedef ^ InitInputType ReKi BlPitchInit {:} - - "Initial blade pitch" - @@ -60,6 +61,7 @@ typedef ^ InitInputType IntKi NumPulseGate - - - "Number of pulse gates" - typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - +typedef ^ InitOutputType ModVarsType Vars - - - "Module Variables" - typedef ^ InitOutputType IntKi CouplingScheme - - - "Switch that indicates if a particular coupling scheme is required" - typedef ^ InitOutputType Logical UseHSSBrake - - - "flag to determine if high-speed shaft brake is potentially used (true=yes)" - # Linearization @@ -79,6 +81,9 @@ typedef ServoDyn/SrvD SrvD_InputFile DbKi DT - - - "Communication interval for c typedef ^ SrvD_InputFile LOGICAL Echo - - - "Echo the input file out" - typedef ^ SrvD_InputFile IntKi PCMode - - - "Pitch control mode" - typedef ^ SrvD_InputFile DbKi TPCOn - - - "Time to enable active pitch control [unused when PCMode=0]" s +typedef ^ SrvD_InputFile ReKi PitNeut 3 - - "Neutral pitch position--pitch spring moment is zero at this pitch" deg +typedef ^ SrvD_InputFile ReKi PitSpr 3 - - "Blade-pitch spring constant" N-m/rad +typedef ^ SrvD_InputFile ReKi PitDamp 3 - - "Blade-pitch damping constant" N-m/(rad/s) typedef ^ SrvD_InputFile DbKi TPitManS 3 - - "Time to start override pitch maneuver for blade (K) and end standard pitch control" s typedef ^ SrvD_InputFile ReKi PitManRat 3 - - "Pitch rates at which override pitch maneuvers head toward final pitch angles" rad/s typedef ^ SrvD_InputFile ReKi BlPitchF 3 - - "Blade (K) final pitch for pitch maneuvers" radians @@ -282,6 +287,7 @@ typedef ^ ContinuousStateType StC_ContinuousStateType SStC {:} - - "StC module i # Define discrete (nondifferentiable) states here: typedef ^ DiscreteStateType ReKi CtrlOffset - - - "Controller offset parameter" N-m +typedef ^ DiscreteStateType ReKi CtrlIntegral - 0 - "Controller integral parameter" N-m #typedef ^ DiscreteStateType ReKi BlPitchFilter {:} - - "blade pitch filter" - typedef ^ DiscreteStateType StC_DiscreteStateType BStC {:} - - "StC module states - blade" - typedef ^ DiscreteStateType StC_DiscreteStateType NStC {:} - - "StC module states - nacelle" - @@ -328,27 +334,6 @@ typedef ^ SrvD_ModuleMapType MeshMapType NStC_Frc2_y_NStC {:} - - "Map loads: m% typedef ^ SrvD_ModuleMapType MeshMapType TStC_Frc2_y_TStC {:} - - "Map loads: m%y_TStCLoadMesh to y%TStC%LoadMesh" typedef ^ SrvD_ModuleMapType MeshMapType SStC_Frc2_y_SStC {:} - - "Map loads: m%y_SStCLoadMesh to y%SStC%LoadMesh" -# ..... Misc Variables ................................................................................................................ -typedef ^ MiscVarType DbKi LastTimeCalled - - - "last time the CalcOutput/Bladed DLL was called" s -typedef ^ MiscVarType BladedDLLType dll_data - - - "data used for Bladed DLL" - -typedef ^ MiscVarType logical FirstWarn - - - "Whether or not this is the first warning about the DLL being called without Explicit-Loose coupling." - -typedef ^ MiscVarType DbKi LastTimeFiltered - - - "last time the CalcOutput/Bladed DLL was filtered" s -typedef ^ MiscVarType ReKi xd_BlPitchFilter {:} - - "blade pitch filter" - -typedef ^ MiscVarType StC_MiscVarType BStC {:} - - "StC module misc vars - blade" - -typedef ^ MiscVarType StC_MiscVarType NStC {:} - - "StC module misc vars - nacelle" - -typedef ^ MiscVarType StC_MiscVarType TStC {:} - - "StC module misc vars - tower" - -typedef ^ MiscVarType StC_MiscVarType SStC {:} - - "StC module misc vars - substructure" - -typedef ^ MiscVarType StC_InputType u_BStC {:}{:} - - "StC module inputs - blade size:(interpOrder,NumBStC)" - -typedef ^ MiscVarType StC_InputType u_NStC {:}{:} - - "StC module inputs - nacelle size:(interpOrder,NumNStC)" - -typedef ^ MiscVarType StC_InputType u_TStC {:}{:} - - "StC module inputs - tower size:(interpOrder,NumTStC)" - -typedef ^ MiscVarType StC_InputType u_SStC {:}{:} - - "StC module inputs - substructure size:(interpOrder,NumSStC)" - -typedef ^ MiscVarType StC_OutputType y_BStC {:} - - "StC module outputs - blade" - -typedef ^ MiscVarType StC_OutputType y_NStC {:} - - "StC module outputs - nacelle" - -typedef ^ MiscVarType StC_OutputType y_TStC {:} - - "StC module outputs - tower" - -typedef ^ MiscVarType StC_OutputType y_SStC {:} - - "StC module outputs - substructure" - -typedef ^ MiscVarType SrvD_ModuleMapType SrvD_MeshMap - - - "Mesh mapping from inputs/output meshes to StC input/output meshes" - -typedef ^ MiscVarType IntKi PrevTstepNcall - -1 - "Previous timestep N for tracking when in predictor/corrector loop for setting StC u values" - - # ..... Parameters ................................................................................................................ # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: @@ -407,7 +392,10 @@ typedef ^ ParameterType LOGICAL GenTiStr - - - "Start generator based upon T: ti typedef ^ ParameterType ReKi VS_Rgn2K - - - "Generator torque constant in Region 2 for simple variable-speed generator control (HSS side) [used only when VSContrl=1]" N-m/(rad/s)^2 typedef ^ ParameterType ReKi YawNeut - - - "Neutral yaw position--yaw spring force is zero at this yaw" radians typedef ^ ParameterType ReKi YawSpr - - - "Nacelle-yaw spring constant" N-m/rad -typedef ^ ParameterType ReKi YawDamp - - - "Nacelle-yaw constant" N-m/(rad/s) +typedef ^ ParameterType ReKi YawDamp - - - "Nacelle-yaw damping constant" N-m/(rad/s) +typedef ^ ParameterType ReKi PitNeut {:} - - "Neutral blade pitch position--pitch spring force is zero at this angle" rad +typedef ^ ParameterType ReKi PitSpr {:} - - "Blade-pitch spring constant" N-m/rad +typedef ^ ParameterType ReKi PitDamp {:} - - "Blade-pitch damping constant" N-m/(rad/s) typedef ^ ParameterType DbKi TpBrDT - - - "Time for tip-brake to reach full deployment once released" s typedef ^ ParameterType ReKi TBDepISp {:} - - "Deployment-initiation speed for the tip brakes" rad/s typedef ^ ParameterType ReKi TBDrConN - - - "Tip-brake drag constant during normal operation, Cd*Area" @@ -455,36 +443,16 @@ typedef ^ ParameterType Logical EXavrSWAP - - - "Use extendend avr SWAP" - typedef ^ ParameterType IntKi NumCableControl - - - "Number of cable control channels requested" - typedef ^ ParameterType IntKi NumStC_Control - - - "Number of cable StC channels requested" - typedef ^ ParameterType IntKi StCMeasNumPerChan {:} - - "Number of cable StC channel to average on each control channel sent to DLL" - -# parameters for linearization -typedef ^ ParameterType Integer Jac_u_indx {:}{:} - - "matrix to help fill/pack the u vector in computing the jacobian" - -typedef ^ ParameterType Integer Jac_x_indx {:}{:} - - "matrix to help fill/pack the x vector in computing the jacobian" - -typedef ^ ParameterType R8Ki du {:} - - "vector that determines size of perturbation for u (inputs)" -typedef ^ ParameterType ReKi dx {:} - - "vector that determines size of perturbation for x (continuous states)" -typedef ^ ParameterType Integer Jac_nu - - - "number of inputs in jacobian matrix" - -typedef ^ ParameterType Integer Jac_ny - - - "number of outputs in jacobian matrix" - -typedef ^ ParameterType Integer Jac_nx - - - "the number of continuous states in jacobian matrix" - -typedef ^ ParameterType Integer Jac_Idx_BStC_u {:}{:}{:} - - "the start and end indices of blade StC u jacobian [ start/end, blade, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_NStC_u {:}{:} - - "the start and end indices of nacelle StC u jacobian [ start/end, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_TStC_u {:}{:} - - "the start and end indices of tower StC u jacobian [ start/end, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_SStC_u {:}{:} - - "the start and end indices of substructure StC u jacobian [ start/end, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_BStC_x {:}{:}{:} - - "the start and end indices of blade StC x jacobian [ start/end, blade, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_NStC_x {:}{:} - - "the start and end indices of nacelle StC x jacobian [ start/end, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_TStC_x {:}{:} - - "the start and end indices of tower StC x jacobian [ start/end, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_SStC_x {:}{:} - - "the start and end indices of substructure StC x jacobian [ start/end, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_BStC_y {:}{:}{:} - - "the start and end indices of blade StC y jacobian [ start/end, blade, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_NStC_y {:}{:} - - "the start and end indices of nacelle StC y jacobian [ start/end, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_TStC_y {:}{:} - - "the start and end indices of tower StC y jacobian [ start/end, instance ]" - -typedef ^ ParameterType Integer Jac_Idx_SStC_y {:}{:} - - "the start and end indices of substructure StC y jacobian [ start/end, instance ]" - # parameters for lidar assisted control typedef ^ ParameterType IntKi SensorType - - - "Lidar sensor type" - typedef ^ ParameterType IntKi NumBeam - - - "Number of beams" - typedef ^ ParameterType IntKi NumPulseGate - - - "Number of pulse gates" - - # ..... Inputs .................................................................................................................... # Define inputs that are not on this mesh here: typedef ^ InputType ReKi BlPitch {:} - 2pi "Current blade pitch angles" radians +typedef ^ InputType ReKi BlPRate {:} - - "Current blade pitch rate" rad/s typedef ^ InputType ReKi Yaw - - 2pi "Current nacelle yaw" radians typedef ^ InputType ReKi YawRate - - - "Current nacelle yaw rate" rad/s typedef ^ InputType ReKi LSS_Spd - - - "Low-speed shaft (LSS) speed at entrance to gearbox" rad/s @@ -540,7 +508,9 @@ typedef ^ InputType ReKi MsrPositionsZ {:} - - "Lidar Z direction measuremen #typedef ^ OutputType MeshType MeshedOutput - - - "Meshed output data" - # Define outputs that are not on this mesh here: typedef ^ OutputType ReKi WriteOutput {:} - - "Data to be written to an output file: see WriteOutputHdr for names of each variable" "see WriteOutputUnt" +typedef ^ OutputType ReKi BlPitchMom {:} - - "Blade-pitch moment transmitted to the blades" N-m typedef ^ OutputType ReKi BlPitchCom {:} - 2pi "Commanded blade pitch angles" radians +typedef ^ OutputType ReKi BlPRateCom {:} - - "Commanded blade pitch rates; only used to compute blade-pitch moment" rad/s typedef ^ OutputType ReKi BlAirfoilCom {:} - - "Commanded Airfoil UserProp for blade. Passed to AD15 for airfoil interpolation (must be same units as given in AD15 airfoil tables)" - typedef ^ OutputType ReKi YawMom - - - "Torque transmitted through the yaw bearing" N-m typedef ^ OutputType ReKi YawPosCom - - - "Yaw command from controller (for SED module)" rad @@ -556,3 +526,31 @@ typedef ^ OutputType MeshType BStCLoadMesh {:}{:} - - "StC module blade o typedef ^ OutputType MeshType NStCLoadMesh {:} - - "StC module nacelle output load mesh" - typedef ^ OutputType MeshType TStCLoadMesh {:} - - "StC module tower output load mesh" - typedef ^ OutputType MeshType SStCLoadMesh {:} - - "StC module substructure output load mesh" - + + +# ..... Misc Variables ................................................................................................................ +typedef ^ MiscVarType DbKi LastTimeCalled - - - "last time the CalcOutput/Bladed DLL was called" s +typedef ^ MiscVarType BladedDLLType dll_data - - - "data used for Bladed DLL" - +typedef ^ MiscVarType logical FirstWarn - - - "Whether or not this is the first warning about the DLL being called without Explicit-Loose coupling." - +typedef ^ MiscVarType DbKi LastTimeFiltered - - - "last time the CalcOutput/Bladed DLL was filtered" s +typedef ^ MiscVarType ReKi xd_BlPitchFilter {:} - - "blade pitch filter" rad +typedef ^ MiscVarType ReKi xd_BlPRateFilter {:} - - "blade pitch rate filter" rad/s +typedef ^ MiscVarType StC_MiscVarType BStC {:} - - "StC module misc vars - blade" - +typedef ^ MiscVarType StC_MiscVarType NStC {:} - - "StC module misc vars - nacelle" - +typedef ^ MiscVarType StC_MiscVarType TStC {:} - - "StC module misc vars - tower" - +typedef ^ MiscVarType StC_MiscVarType SStC {:} - - "StC module misc vars - substructure" - +typedef ^ MiscVarType StC_InputType u_BStC {:}{:} - - "StC module inputs - blade size:(interpOrder,NumBStC)" - +typedef ^ MiscVarType StC_InputType u_NStC {:}{:} - - "StC module inputs - nacelle size:(interpOrder,NumNStC)" - +typedef ^ MiscVarType StC_InputType u_TStC {:}{:} - - "StC module inputs - tower size:(interpOrder,NumTStC)" - +typedef ^ MiscVarType StC_InputType u_SStC {:}{:} - - "StC module inputs - substructure size:(interpOrder,NumSStC)" - +typedef ^ MiscVarType StC_OutputType y_BStC {:} - - "StC module outputs - blade" - +typedef ^ MiscVarType StC_OutputType y_NStC {:} - - "StC module outputs - nacelle" - +typedef ^ MiscVarType StC_OutputType y_TStC {:} - - "StC module outputs - tower" - +typedef ^ MiscVarType StC_OutputType y_SStC {:} - - "StC module outputs - substructure" - +typedef ^ MiscVarType SrvD_ModuleMapType SrvD_MeshMap - - - "Mesh mapping from inputs/output meshes to StC input/output meshes" - +typedef ^ MiscVarType IntKi PrevTstepNcall - -1 - "Previous timestep N for tracking when in predictor/corrector loop for setting StC u values" - +typedef ^ MiscVarType ModJacType Jac - - - "Jacobian matrices and arrays corresponding to module variables" +typedef ^ MiscVarType SrvD_ContinuousStateType x_perturb - - - "Continuous state for perturbation in Jacobian routines" - +typedef ^ MiscVarType SrvD_ContinuousStateType dxdt_lin - - - "Continuous state derivative for output in Jacobian routines" - +typedef ^ MiscVarType SrvD_InputType u_perturb - - - "Input for perturbation in Jacobian routines" - +typedef ^ MiscVarType SrvD_OutputType y_lin - - - "Output for output in Jacobian routines" - diff --git a/modules/servodyn/src/ServoDyn_Types.f90 b/modules/servodyn/src/ServoDyn_Types.f90 index b9fb0a0f40..50c511492d 100644 --- a/modules/servodyn/src/ServoDyn_Types.f90 +++ b/modules/servodyn/src/ServoDyn_Types.f90 @@ -38,6 +38,7 @@ MODULE ServoDyn_Types TYPE, PUBLIC :: SrvD_InitInputType CHARACTER(1024) :: InputFile !< Name of the input file [-] LOGICAL :: Linearize = .FALSE. !< Flag that tells this module if the glue code wants to linearize. [-] + LOGICAL :: TightED = .false. !< ElastoDyn is tightly coupled [-] INTEGER(IntKi) :: NumBl = 0_IntKi !< Number of blades on the turbine [-] CHARACTER(1024) :: RootName !< RootName for writing output files [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPitchInit !< Initial blade pitch [-] @@ -79,6 +80,7 @@ MODULE ServoDyn_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] INTEGER(IntKi) :: CouplingScheme = 0_IntKi !< Switch that indicates if a particular coupling scheme is required [-] LOGICAL :: UseHSSBrake = .false. !< flag to determine if high-speed shaft brake is potentially used (true=yes) [-] CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] @@ -97,6 +99,9 @@ MODULE ServoDyn_Types LOGICAL :: Echo = .false. !< Echo the input file out [-] INTEGER(IntKi) :: PCMode = 0_IntKi !< Pitch control mode [-] REAL(DbKi) :: TPCOn = 0.0_R8Ki !< Time to enable active pitch control [unused when PCMode=0] [s] + REAL(ReKi) , DIMENSION(1:3) :: PitNeut = 0.0_ReKi !< Neutral pitch position--pitch spring moment is zero at this pitch [deg] + REAL(ReKi) , DIMENSION(1:3) :: PitSpr = 0.0_ReKi !< Blade-pitch spring constant [N-m/rad] + REAL(ReKi) , DIMENSION(1:3) :: PitDamp = 0.0_ReKi !< Blade-pitch damping constant [N-m/(rad/s)] REAL(DbKi) , DIMENSION(1:3) :: TPitManS = 0.0_R8Ki !< Time to start override pitch maneuver for blade (K) and end standard pitch control [s] REAL(ReKi) , DIMENSION(1:3) :: PitManRat = 0.0_ReKi !< Pitch rates at which override pitch maneuvers head toward final pitch angles [rad/s] REAL(ReKi) , DIMENSION(1:3) :: BlPitchF = 0.0_ReKi !< Blade (K) final pitch for pitch maneuvers [radians] @@ -292,6 +297,7 @@ MODULE ServoDyn_Types ! ========= SrvD_DiscreteStateType ======= TYPE, PUBLIC :: SrvD_DiscreteStateType REAL(ReKi) :: CtrlOffset = 0.0_ReKi !< Controller offset parameter [N-m] + REAL(ReKi) :: CtrlIntegral = 0 !< Controller integral parameter [N-m] TYPE(StC_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: BStC !< StC module states - blade [-] TYPE(StC_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: NStC !< StC module states - nacelle [-] TYPE(StC_DiscreteStateType) , DIMENSION(:), ALLOCATABLE :: TStC !< StC module states - tower [-] @@ -339,29 +345,6 @@ MODULE ServoDyn_Types TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: SStC_Frc2_y_SStC !< Map loads: m%y_SStCLoadMesh to y%SStC%LoadMesh [-] END TYPE SrvD_ModuleMapType ! ======================= -! ========= SrvD_MiscVarType ======= - TYPE, PUBLIC :: SrvD_MiscVarType - REAL(DbKi) :: LastTimeCalled = 0.0_R8Ki !< last time the CalcOutput/Bladed DLL was called [s] - TYPE(BladedDLLType) :: dll_data !< data used for Bladed DLL [-] - LOGICAL :: FirstWarn = .false. !< Whether or not this is the first warning about the DLL being called without Explicit-Loose coupling. [-] - REAL(DbKi) :: LastTimeFiltered = 0.0_R8Ki !< last time the CalcOutput/Bladed DLL was filtered [s] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: xd_BlPitchFilter !< blade pitch filter [-] - TYPE(StC_MiscVarType) , DIMENSION(:), ALLOCATABLE :: BStC !< StC module misc vars - blade [-] - TYPE(StC_MiscVarType) , DIMENSION(:), ALLOCATABLE :: NStC !< StC module misc vars - nacelle [-] - TYPE(StC_MiscVarType) , DIMENSION(:), ALLOCATABLE :: TStC !< StC module misc vars - tower [-] - TYPE(StC_MiscVarType) , DIMENSION(:), ALLOCATABLE :: SStC !< StC module misc vars - substructure [-] - TYPE(StC_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_BStC !< StC module inputs - blade size:(interpOrder,NumBStC) [-] - TYPE(StC_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_NStC !< StC module inputs - nacelle size:(interpOrder,NumNStC) [-] - TYPE(StC_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_TStC !< StC module inputs - tower size:(interpOrder,NumTStC) [-] - TYPE(StC_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_SStC !< StC module inputs - substructure size:(interpOrder,NumSStC) [-] - TYPE(StC_OutputType) , DIMENSION(:), ALLOCATABLE :: y_BStC !< StC module outputs - blade [-] - TYPE(StC_OutputType) , DIMENSION(:), ALLOCATABLE :: y_NStC !< StC module outputs - nacelle [-] - TYPE(StC_OutputType) , DIMENSION(:), ALLOCATABLE :: y_TStC !< StC module outputs - tower [-] - TYPE(StC_OutputType) , DIMENSION(:), ALLOCATABLE :: y_SStC !< StC module outputs - substructure [-] - TYPE(SrvD_ModuleMapType) :: SrvD_MeshMap !< Mesh mapping from inputs/output meshes to StC input/output meshes [-] - INTEGER(IntKi) :: PrevTstepNcall = -1 !< Previous timestep N for tracking when in predictor/corrector loop for setting StC u values [-] - END TYPE SrvD_MiscVarType -! ======================= ! ========= SrvD_ParameterType ======= TYPE, PUBLIC :: SrvD_ParameterType REAL(DbKi) :: DT = 0.0_R8Ki !< Time step for continuous state integration & discrete state update [seconds] @@ -419,7 +402,10 @@ MODULE ServoDyn_Types REAL(ReKi) :: VS_Rgn2K = 0.0_ReKi !< Generator torque constant in Region 2 for simple variable-speed generator control (HSS side) [used only when VSContrl=1] [N-m/(rad/s)^2] REAL(ReKi) :: YawNeut = 0.0_ReKi !< Neutral yaw position--yaw spring force is zero at this yaw [radians] REAL(ReKi) :: YawSpr = 0.0_ReKi !< Nacelle-yaw spring constant [N-m/rad] - REAL(ReKi) :: YawDamp = 0.0_ReKi !< Nacelle-yaw constant [N-m/(rad/s)] + REAL(ReKi) :: YawDamp = 0.0_ReKi !< Nacelle-yaw damping constant [N-m/(rad/s)] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PitNeut !< Neutral blade pitch position--pitch spring force is zero at this angle [rad] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PitSpr !< Blade-pitch spring constant [N-m/rad] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: PitDamp !< Blade-pitch damping constant [N-m/(rad/s)] REAL(DbKi) :: TpBrDT = 0.0_R8Ki !< Time for tip-brake to reach full deployment once released [s] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TBDepISp !< Deployment-initiation speed for the tip brakes [rad/s] REAL(ReKi) :: TBDrConN = 0.0_ReKi !< Tip-brake drag constant during normal operation, Cd*Area [-] @@ -463,25 +449,6 @@ MODULE ServoDyn_Types INTEGER(IntKi) :: NumCableControl = 0_IntKi !< Number of cable control channels requested [-] INTEGER(IntKi) :: NumStC_Control = 0_IntKi !< Number of cable StC channels requested [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: StCMeasNumPerChan !< Number of cable StC channel to average on each control channel sent to DLL [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_x_indx !< matrix to help fill/pack the x vector in computing the jacobian [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: du !< vector that determines size of perturbation for u (inputs) [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: dx !< vector that determines size of perturbation for x (continuous states) [-] - INTEGER(IntKi) :: Jac_nu = 0_IntKi !< number of inputs in jacobian matrix [-] - INTEGER(IntKi) :: Jac_ny = 0_IntKi !< number of outputs in jacobian matrix [-] - INTEGER(IntKi) :: Jac_nx = 0_IntKi !< the number of continuous states in jacobian matrix [-] - INTEGER(IntKi) , DIMENSION(:,:,:), ALLOCATABLE :: Jac_Idx_BStC_u !< the start and end indices of blade StC u jacobian [ start/end, blade, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_Idx_NStC_u !< the start and end indices of nacelle StC u jacobian [ start/end, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_Idx_TStC_u !< the start and end indices of tower StC u jacobian [ start/end, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_Idx_SStC_u !< the start and end indices of substructure StC u jacobian [ start/end, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:,:), ALLOCATABLE :: Jac_Idx_BStC_x !< the start and end indices of blade StC x jacobian [ start/end, blade, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_Idx_NStC_x !< the start and end indices of nacelle StC x jacobian [ start/end, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_Idx_TStC_x !< the start and end indices of tower StC x jacobian [ start/end, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_Idx_SStC_x !< the start and end indices of substructure StC x jacobian [ start/end, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:,:), ALLOCATABLE :: Jac_Idx_BStC_y !< the start and end indices of blade StC y jacobian [ start/end, blade, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_Idx_NStC_y !< the start and end indices of nacelle StC y jacobian [ start/end, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_Idx_TStC_y !< the start and end indices of tower StC y jacobian [ start/end, instance ] [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_Idx_SStC_y !< the start and end indices of substructure StC y jacobian [ start/end, instance ] [-] INTEGER(IntKi) :: SensorType = 0_IntKi !< Lidar sensor type [-] INTEGER(IntKi) :: NumBeam = 0_IntKi !< Number of beams [-] INTEGER(IntKi) :: NumPulseGate = 0_IntKi !< Number of pulse gates [-] @@ -490,6 +457,7 @@ MODULE ServoDyn_Types ! ========= SrvD_InputType ======= TYPE, PUBLIC :: SrvD_InputType REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPitch !< Current blade pitch angles [radians] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPRate !< Current blade pitch rate [rad/s] REAL(ReKi) :: Yaw = 0.0_ReKi !< Current nacelle yaw [radians] REAL(ReKi) :: YawRate = 0.0_ReKi !< Current nacelle yaw rate [rad/s] REAL(ReKi) :: LSS_Spd = 0.0_ReKi !< Low-speed shaft (LSS) speed at entrance to gearbox [rad/s] @@ -542,7 +510,9 @@ MODULE ServoDyn_Types ! ========= SrvD_OutputType ======= TYPE, PUBLIC :: SrvD_OutputType REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Data to be written to an output file: see WriteOutputHdr for names of each variable [see WriteOutputUnt] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPitchMom !< Blade-pitch moment transmitted to the blades [N-m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPitchCom !< Commanded blade pitch angles [radians] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlPRateCom !< Commanded blade pitch rates; only used to compute blade-pitch moment [rad/s] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: BlAirfoilCom !< Commanded Airfoil UserProp for blade. Passed to AD15 for airfoil interpolation (must be same units as given in AD15 airfoil tables) [-] REAL(ReKi) :: YawMom = 0.0_ReKi !< Torque transmitted through the yaw bearing [N-m] REAL(ReKi) :: YawPosCom = 0.0_ReKi !< Yaw command from controller (for SED module) [rad] @@ -559,7 +529,109 @@ MODULE ServoDyn_Types TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: SStCLoadMesh !< StC module substructure output load mesh [-] END TYPE SrvD_OutputType ! ======================= -CONTAINS +! ========= SrvD_MiscVarType ======= + TYPE, PUBLIC :: SrvD_MiscVarType + REAL(DbKi) :: LastTimeCalled = 0.0_R8Ki !< last time the CalcOutput/Bladed DLL was called [s] + TYPE(BladedDLLType) :: dll_data !< data used for Bladed DLL [-] + LOGICAL :: FirstWarn = .false. !< Whether or not this is the first warning about the DLL being called without Explicit-Loose coupling. [-] + REAL(DbKi) :: LastTimeFiltered = 0.0_R8Ki !< last time the CalcOutput/Bladed DLL was filtered [s] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: xd_BlPitchFilter !< blade pitch filter [rad] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: xd_BlPRateFilter !< blade pitch rate filter [rad/s] + TYPE(StC_MiscVarType) , DIMENSION(:), ALLOCATABLE :: BStC !< StC module misc vars - blade [-] + TYPE(StC_MiscVarType) , DIMENSION(:), ALLOCATABLE :: NStC !< StC module misc vars - nacelle [-] + TYPE(StC_MiscVarType) , DIMENSION(:), ALLOCATABLE :: TStC !< StC module misc vars - tower [-] + TYPE(StC_MiscVarType) , DIMENSION(:), ALLOCATABLE :: SStC !< StC module misc vars - substructure [-] + TYPE(StC_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_BStC !< StC module inputs - blade size:(interpOrder,NumBStC) [-] + TYPE(StC_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_NStC !< StC module inputs - nacelle size:(interpOrder,NumNStC) [-] + TYPE(StC_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_TStC !< StC module inputs - tower size:(interpOrder,NumTStC) [-] + TYPE(StC_InputType) , DIMENSION(:,:), ALLOCATABLE :: u_SStC !< StC module inputs - substructure size:(interpOrder,NumSStC) [-] + TYPE(StC_OutputType) , DIMENSION(:), ALLOCATABLE :: y_BStC !< StC module outputs - blade [-] + TYPE(StC_OutputType) , DIMENSION(:), ALLOCATABLE :: y_NStC !< StC module outputs - nacelle [-] + TYPE(StC_OutputType) , DIMENSION(:), ALLOCATABLE :: y_TStC !< StC module outputs - tower [-] + TYPE(StC_OutputType) , DIMENSION(:), ALLOCATABLE :: y_SStC !< StC module outputs - substructure [-] + TYPE(SrvD_ModuleMapType) :: SrvD_MeshMap !< Mesh mapping from inputs/output meshes to StC input/output meshes [-] + INTEGER(IntKi) :: PrevTstepNcall = -1 !< Previous timestep N for tracking when in predictor/corrector loop for setting StC u values [-] + TYPE(ModJacType) :: Jac !< Jacobian matrices and arrays corresponding to module variables [-] + TYPE(SrvD_ContinuousStateType) :: x_perturb !< Continuous state for perturbation in Jacobian routines [-] + TYPE(SrvD_ContinuousStateType) :: dxdt_lin !< Continuous state derivative for output in Jacobian routines [-] + TYPE(SrvD_InputType) :: u_perturb !< Input for perturbation in Jacobian routines [-] + TYPE(SrvD_OutputType) :: y_lin !< Output for output in Jacobian routines [-] + END TYPE SrvD_MiscVarType +! ======================= + integer(IntKi), public, parameter :: SrvD_x_DummyContState = 1 ! SrvD%DummyContState + integer(IntKi), public, parameter :: SrvD_x_BStC_StC_x = 2 ! SrvD%BStC(DL%i1)%StC_x + integer(IntKi), public, parameter :: SrvD_x_NStC_StC_x = 3 ! SrvD%NStC(DL%i1)%StC_x + integer(IntKi), public, parameter :: SrvD_x_TStC_StC_x = 4 ! SrvD%TStC(DL%i1)%StC_x + integer(IntKi), public, parameter :: SrvD_x_SStC_StC_x = 5 ! SrvD%SStC(DL%i1)%StC_x + integer(IntKi), public, parameter :: SrvD_u_BlPitch = 6 ! SrvD%BlPitch + integer(IntKi), public, parameter :: SrvD_u_BlPRate = 7 ! SrvD%BlPRate + integer(IntKi), public, parameter :: SrvD_u_Yaw = 8 ! SrvD%Yaw + integer(IntKi), public, parameter :: SrvD_u_YawRate = 9 ! SrvD%YawRate + integer(IntKi), public, parameter :: SrvD_u_LSS_Spd = 10 ! SrvD%LSS_Spd + integer(IntKi), public, parameter :: SrvD_u_HSS_Spd = 11 ! SrvD%HSS_Spd + integer(IntKi), public, parameter :: SrvD_u_RotSpeed = 12 ! SrvD%RotSpeed + integer(IntKi), public, parameter :: SrvD_u_ExternalYawPosCom = 13 ! SrvD%ExternalYawPosCom + integer(IntKi), public, parameter :: SrvD_u_ExternalYawRateCom = 14 ! SrvD%ExternalYawRateCom + integer(IntKi), public, parameter :: SrvD_u_ExternalBlPitchCom = 15 ! SrvD%ExternalBlPitchCom + integer(IntKi), public, parameter :: SrvD_u_ExternalGenTrq = 16 ! SrvD%ExternalGenTrq + integer(IntKi), public, parameter :: SrvD_u_ExternalElecPwr = 17 ! SrvD%ExternalElecPwr + integer(IntKi), public, parameter :: SrvD_u_ExternalHSSBrFrac = 18 ! SrvD%ExternalHSSBrFrac + integer(IntKi), public, parameter :: SrvD_u_ExternalBlAirfoilCom = 19 ! SrvD%ExternalBlAirfoilCom + integer(IntKi), public, parameter :: SrvD_u_ExternalCableDeltaL = 20 ! SrvD%ExternalCableDeltaL + integer(IntKi), public, parameter :: SrvD_u_ExternalCableDeltaLdot = 21 ! SrvD%ExternalCableDeltaLdot + integer(IntKi), public, parameter :: SrvD_u_TwrAccel = 22 ! SrvD%TwrAccel + integer(IntKi), public, parameter :: SrvD_u_YawErr = 23 ! SrvD%YawErr + integer(IntKi), public, parameter :: SrvD_u_WindDir = 24 ! SrvD%WindDir + integer(IntKi), public, parameter :: SrvD_u_RootMyc = 25 ! SrvD%RootMyc + integer(IntKi), public, parameter :: SrvD_u_YawBrTAxp = 26 ! SrvD%YawBrTAxp + integer(IntKi), public, parameter :: SrvD_u_YawBrTAyp = 27 ! SrvD%YawBrTAyp + integer(IntKi), public, parameter :: SrvD_u_LSSTipPxa = 28 ! SrvD%LSSTipPxa + integer(IntKi), public, parameter :: SrvD_u_RootMxc = 29 ! SrvD%RootMxc + integer(IntKi), public, parameter :: SrvD_u_LSSTipMxa = 30 ! SrvD%LSSTipMxa + integer(IntKi), public, parameter :: SrvD_u_LSSTipMya = 31 ! SrvD%LSSTipMya + integer(IntKi), public, parameter :: SrvD_u_LSSTipMza = 32 ! SrvD%LSSTipMza + integer(IntKi), public, parameter :: SrvD_u_LSSTipMys = 33 ! SrvD%LSSTipMys + integer(IntKi), public, parameter :: SrvD_u_LSSTipMzs = 34 ! SrvD%LSSTipMzs + integer(IntKi), public, parameter :: SrvD_u_YawBrMyn = 35 ! SrvD%YawBrMyn + integer(IntKi), public, parameter :: SrvD_u_YawBrMzn = 36 ! SrvD%YawBrMzn + integer(IntKi), public, parameter :: SrvD_u_NcIMURAxs = 37 ! SrvD%NcIMURAxs + integer(IntKi), public, parameter :: SrvD_u_NcIMURAys = 38 ! SrvD%NcIMURAys + integer(IntKi), public, parameter :: SrvD_u_NcIMURAzs = 39 ! SrvD%NcIMURAzs + integer(IntKi), public, parameter :: SrvD_u_RotPwr = 40 ! SrvD%RotPwr + integer(IntKi), public, parameter :: SrvD_u_HorWindV = 41 ! SrvD%HorWindV + integer(IntKi), public, parameter :: SrvD_u_YawAngle = 42 ! SrvD%YawAngle + integer(IntKi), public, parameter :: SrvD_u_LSShftFxa = 43 ! SrvD%LSShftFxa + integer(IntKi), public, parameter :: SrvD_u_LSShftFys = 44 ! SrvD%LSShftFys + integer(IntKi), public, parameter :: SrvD_u_LSShftFzs = 45 ! SrvD%LSShftFzs + integer(IntKi), public, parameter :: SrvD_u_PtfmMotionMesh = 46 ! SrvD%PtfmMotionMesh + integer(IntKi), public, parameter :: SrvD_u_BStCMotionMesh = 47 ! SrvD%BStCMotionMesh(DL%i1, DL%i2) + integer(IntKi), public, parameter :: SrvD_u_NStCMotionMesh = 48 ! SrvD%NStCMotionMesh(DL%i1) + integer(IntKi), public, parameter :: SrvD_u_TStCMotionMesh = 49 ! SrvD%TStCMotionMesh(DL%i1) + integer(IntKi), public, parameter :: SrvD_u_SStCMotionMesh = 50 ! SrvD%SStCMotionMesh(DL%i1) + integer(IntKi), public, parameter :: SrvD_u_LidSpeed = 51 ! SrvD%LidSpeed + integer(IntKi), public, parameter :: SrvD_u_MsrPositionsX = 52 ! SrvD%MsrPositionsX + integer(IntKi), public, parameter :: SrvD_u_MsrPositionsY = 53 ! SrvD%MsrPositionsY + integer(IntKi), public, parameter :: SrvD_u_MsrPositionsZ = 54 ! SrvD%MsrPositionsZ + integer(IntKi), public, parameter :: SrvD_y_WriteOutput = 55 ! SrvD%WriteOutput + integer(IntKi), public, parameter :: SrvD_y_BlPitchMom = 56 ! SrvD%BlPitchMom + integer(IntKi), public, parameter :: SrvD_y_BlPitchCom = 57 ! SrvD%BlPitchCom + integer(IntKi), public, parameter :: SrvD_y_BlPRateCom = 58 ! SrvD%BlPRateCom + integer(IntKi), public, parameter :: SrvD_y_BlAirfoilCom = 59 ! SrvD%BlAirfoilCom + integer(IntKi), public, parameter :: SrvD_y_YawMom = 60 ! SrvD%YawMom + integer(IntKi), public, parameter :: SrvD_y_YawPosCom = 61 ! SrvD%YawPosCom + integer(IntKi), public, parameter :: SrvD_y_YawRateCom = 62 ! SrvD%YawRateCom + integer(IntKi), public, parameter :: SrvD_y_GenTrq = 63 ! SrvD%GenTrq + integer(IntKi), public, parameter :: SrvD_y_HSSBrTrqC = 64 ! SrvD%HSSBrTrqC + integer(IntKi), public, parameter :: SrvD_y_ElecPwr = 65 ! SrvD%ElecPwr + integer(IntKi), public, parameter :: SrvD_y_TBDrCon = 66 ! SrvD%TBDrCon + integer(IntKi), public, parameter :: SrvD_y_CableDeltaL = 67 ! SrvD%CableDeltaL + integer(IntKi), public, parameter :: SrvD_y_CableDeltaLdot = 68 ! SrvD%CableDeltaLdot + integer(IntKi), public, parameter :: SrvD_y_BStCLoadMesh = 69 ! SrvD%BStCLoadMesh(DL%i1, DL%i2) + integer(IntKi), public, parameter :: SrvD_y_NStCLoadMesh = 70 ! SrvD%NStCLoadMesh(DL%i1) + integer(IntKi), public, parameter :: SrvD_y_TStCLoadMesh = 71 ! SrvD%TStCLoadMesh(DL%i1) + integer(IntKi), public, parameter :: SrvD_y_SStCLoadMesh = 72 ! SrvD%SStCLoadMesh(DL%i1) + +contains subroutine SrvD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) type(SrvD_InitInputType), intent(in) :: SrcInitInputData @@ -575,6 +647,7 @@ subroutine SrvD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrS ErrMsg = '' DstInitInputData%InputFile = SrcInitInputData%InputFile DstInitInputData%Linearize = SrcInitInputData%Linearize + DstInitInputData%TightED = SrcInitInputData%TightED DstInitInputData%NumBl = SrcInitInputData%NumBl DstInitInputData%RootName = SrcInitInputData%RootName if (allocated(SrcInitInputData%BlPitchInit)) then @@ -717,6 +790,7 @@ subroutine SrvD_PackInitInput(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%InputFile) call RegPack(RF, InData%Linearize) + call RegPack(RF, InData%TightED) call RegPack(RF, InData%NumBl) call RegPack(RF, InData%RootName) call RegPackAlloc(RF, InData%BlPitchInit) @@ -764,6 +838,7 @@ subroutine SrvD_UnPackInitInput(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%InputFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TightED); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumBl); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BlPitchInit); if (RegCheckErr(RF, RoutineName)) return @@ -839,6 +914,9 @@ subroutine SrvD_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, E call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return DstInitOutputData%CouplingScheme = SrcInitOutputData%CouplingScheme DstInitOutputData%UseHSSBrake = SrcInitOutputData%UseHSSBrake if (allocated(SrcInitOutputData%LinNames_y)) then @@ -956,6 +1034,8 @@ subroutine SrvD_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(InitOutputData%LinNames_y)) then deallocate(InitOutputData%LinNames_y) end if @@ -990,6 +1070,7 @@ subroutine SrvD_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%WriteOutputHdr) call RegPackAlloc(RF, InData%WriteOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) + call NWTC_Library_PackModVarsType(RF, InData%Vars) call RegPack(RF, InData%CouplingScheme) call RegPack(RF, InData%UseHSSBrake) call RegPackAlloc(RF, InData%LinNames_y) @@ -1014,6 +1095,7 @@ subroutine SrvD_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars call RegUnpack(RF, OutData%CouplingScheme); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UseHSSBrake); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return @@ -1041,6 +1123,9 @@ subroutine SrvD_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrS DstInputFileData%Echo = SrcInputFileData%Echo DstInputFileData%PCMode = SrcInputFileData%PCMode DstInputFileData%TPCOn = SrcInputFileData%TPCOn + DstInputFileData%PitNeut = SrcInputFileData%PitNeut + DstInputFileData%PitSpr = SrcInputFileData%PitSpr + DstInputFileData%PitDamp = SrcInputFileData%PitDamp DstInputFileData%TPitManS = SrcInputFileData%TPitManS DstInputFileData%PitManRat = SrcInputFileData%PitManRat DstInputFileData%BlPitchF = SrcInputFileData%BlPitchF @@ -1242,6 +1327,9 @@ subroutine SrvD_PackInputFile(RF, Indata) call RegPack(RF, InData%Echo) call RegPack(RF, InData%PCMode) call RegPack(RF, InData%TPCOn) + call RegPack(RF, InData%PitNeut) + call RegPack(RF, InData%PitSpr) + call RegPack(RF, InData%PitDamp) call RegPack(RF, InData%TPitManS) call RegPack(RF, InData%PitManRat) call RegPack(RF, InData%BlPitchF) @@ -1340,6 +1428,9 @@ subroutine SrvD_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%Echo); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PCMode); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TPCOn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PitNeut); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PitSpr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PitDamp); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TPitManS); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PitManRat); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%BlPitchF); if (RegCheckErr(RF, RoutineName)) return @@ -2404,6 +2495,7 @@ subroutine SrvD_CopyDiscState(SrcDiscStateData, DstDiscStateData, CtrlCode, ErrS ErrStat = ErrID_None ErrMsg = '' DstDiscStateData%CtrlOffset = SrcDiscStateData%CtrlOffset + DstDiscStateData%CtrlIntegral = SrcDiscStateData%CtrlIntegral if (allocated(SrcDiscStateData%BStC)) then LB(1:1) = lbound(SrcDiscStateData%BStC) UB(1:1) = ubound(SrcDiscStateData%BStC) @@ -2527,6 +2619,7 @@ subroutine SrvD_PackDiscState(RF, Indata) integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%CtrlOffset) + call RegPack(RF, InData%CtrlIntegral) call RegPack(RF, allocated(InData%BStC)) if (allocated(InData%BStC)) then call RegPackBounds(RF, 1, lbound(InData%BStC), ubound(InData%BStC)) @@ -2576,6 +2669,7 @@ subroutine SrvD_UnPackDiscState(RF, OutData) logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%CtrlOffset); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CtrlIntegral); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%BStC)) deallocate(OutData%BStC) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -3668,398 +3762,502 @@ subroutine SrvD_UnPackModuleMapType(RF, OutData) end if end subroutine -subroutine SrvD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(SrvD_MiscVarType), intent(inout) :: SrcMiscData - type(SrvD_MiscVarType), intent(inout) :: DstMiscData +subroutine SrvD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) + type(SrvD_ParameterType), intent(in) :: SrcParamData + type(SrvD_ParameterType), intent(inout) :: DstParamData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SrvD_CopyMisc' + character(*), parameter :: RoutineName = 'SrvD_CopyParam' ErrStat = ErrID_None ErrMsg = '' - DstMiscData%LastTimeCalled = SrcMiscData%LastTimeCalled - call SrvD_CopyBladedDLLType(SrcMiscData%dll_data, DstMiscData%dll_data, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstMiscData%FirstWarn = SrcMiscData%FirstWarn - DstMiscData%LastTimeFiltered = SrcMiscData%LastTimeFiltered - if (allocated(SrcMiscData%xd_BlPitchFilter)) then - LB(1:1) = lbound(SrcMiscData%xd_BlPitchFilter) - UB(1:1) = ubound(SrcMiscData%xd_BlPitchFilter) - if (.not. allocated(DstMiscData%xd_BlPitchFilter)) then - allocate(DstMiscData%xd_BlPitchFilter(LB(1):UB(1)), stat=ErrStat2) + DstParamData%DT = SrcParamData%DT + DstParamData%HSSBrDT = SrcParamData%HSSBrDT + DstParamData%HSSBrTqF = SrcParamData%HSSBrTqF + DstParamData%SIG_POSl = SrcParamData%SIG_POSl + DstParamData%SIG_POTq = SrcParamData%SIG_POTq + DstParamData%SIG_SlPc = SrcParamData%SIG_SlPc + DstParamData%SIG_Slop = SrcParamData%SIG_Slop + DstParamData%SIG_SySp = SrcParamData%SIG_SySp + DstParamData%TEC_A0 = SrcParamData%TEC_A0 + DstParamData%TEC_C0 = SrcParamData%TEC_C0 + DstParamData%TEC_C1 = SrcParamData%TEC_C1 + DstParamData%TEC_C2 = SrcParamData%TEC_C2 + DstParamData%TEC_K2 = SrcParamData%TEC_K2 + DstParamData%TEC_MR = SrcParamData%TEC_MR + DstParamData%TEC_Re1 = SrcParamData%TEC_Re1 + DstParamData%TEC_RLR = SrcParamData%TEC_RLR + DstParamData%TEC_RRes = SrcParamData%TEC_RRes + DstParamData%TEC_SRes = SrcParamData%TEC_SRes + DstParamData%TEC_SySp = SrcParamData%TEC_SySp + DstParamData%TEC_V1a = SrcParamData%TEC_V1a + DstParamData%TEC_VLL = SrcParamData%TEC_VLL + DstParamData%TEC_Xe1 = SrcParamData%TEC_Xe1 + DstParamData%GenEff = SrcParamData%GenEff + if (allocated(SrcParamData%BlPitchInit)) then + LB(1:1) = lbound(SrcParamData%BlPitchInit) + UB(1:1) = ubound(SrcParamData%BlPitchInit) + if (.not. allocated(DstParamData%BlPitchInit)) then + allocate(DstParamData%BlPitchInit(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%xd_BlPitchFilter.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BlPitchInit.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%xd_BlPitchFilter = SrcMiscData%xd_BlPitchFilter + DstParamData%BlPitchInit = SrcParamData%BlPitchInit end if - if (allocated(SrcMiscData%BStC)) then - LB(1:1) = lbound(SrcMiscData%BStC) - UB(1:1) = ubound(SrcMiscData%BStC) - if (.not. allocated(DstMiscData%BStC)) then - allocate(DstMiscData%BStC(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%BlPitchF)) then + LB(1:1) = lbound(SrcParamData%BlPitchF) + UB(1:1) = ubound(SrcParamData%BlPitchF) + if (.not. allocated(DstParamData%BlPitchF)) then + allocate(DstParamData%BlPitchF(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BlPitchF.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call StC_CopyMisc(SrcMiscData%BStC(i1), DstMiscData%BStC(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%BlPitchF = SrcParamData%BlPitchF end if - if (allocated(SrcMiscData%NStC)) then - LB(1:1) = lbound(SrcMiscData%NStC) - UB(1:1) = ubound(SrcMiscData%NStC) - if (.not. allocated(DstMiscData%NStC)) then - allocate(DstMiscData%NStC(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%PitManRat)) then + LB(1:1) = lbound(SrcParamData%PitManRat) + UB(1:1) = ubound(SrcParamData%PitManRat) + if (.not. allocated(DstParamData%PitManRat)) then + allocate(DstParamData%PitManRat(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%NStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PitManRat.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call StC_CopyMisc(SrcMiscData%NStC(i1), DstMiscData%NStC(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%PitManRat = SrcParamData%PitManRat end if - if (allocated(SrcMiscData%TStC)) then - LB(1:1) = lbound(SrcMiscData%TStC) - UB(1:1) = ubound(SrcMiscData%TStC) - if (.not. allocated(DstMiscData%TStC)) then - allocate(DstMiscData%TStC(LB(1):UB(1)), stat=ErrStat2) + DstParamData%YawManRat = SrcParamData%YawManRat + DstParamData%NacYawF = SrcParamData%NacYawF + DstParamData%SpdGenOn = SrcParamData%SpdGenOn + DstParamData%THSSBrDp = SrcParamData%THSSBrDp + DstParamData%THSSBrFl = SrcParamData%THSSBrFl + DstParamData%TimGenOf = SrcParamData%TimGenOf + DstParamData%TimGenOn = SrcParamData%TimGenOn + DstParamData%TPCOn = SrcParamData%TPCOn + if (allocated(SrcParamData%TPitManS)) then + LB(1:1) = lbound(SrcParamData%TPitManS) + UB(1:1) = ubound(SrcParamData%TPitManS) + if (.not. allocated(DstParamData%TPitManS)) then + allocate(DstParamData%TPitManS(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%TStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TPitManS.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call StC_CopyMisc(SrcMiscData%TStC(i1), DstMiscData%TStC(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%TPitManS = SrcParamData%TPitManS end if - if (allocated(SrcMiscData%SStC)) then - LB(1:1) = lbound(SrcMiscData%SStC) - UB(1:1) = ubound(SrcMiscData%SStC) - if (.not. allocated(DstMiscData%SStC)) then - allocate(DstMiscData%SStC(LB(1):UB(1)), stat=ErrStat2) + DstParamData%TYawManS = SrcParamData%TYawManS + DstParamData%TYCOn = SrcParamData%TYCOn + DstParamData%VS_RtGnSp = SrcParamData%VS_RtGnSp + DstParamData%VS_RtTq = SrcParamData%VS_RtTq + DstParamData%VS_Slope = SrcParamData%VS_Slope + DstParamData%VS_SlPc = SrcParamData%VS_SlPc + DstParamData%VS_SySp = SrcParamData%VS_SySp + DstParamData%VS_TrGnSp = SrcParamData%VS_TrGnSp + DstParamData%YawPosCom = SrcParamData%YawPosCom + DstParamData%YawRateCom = SrcParamData%YawRateCom + DstParamData%GenModel = SrcParamData%GenModel + DstParamData%HSSBrMode = SrcParamData%HSSBrMode + DstParamData%PCMode = SrcParamData%PCMode + DstParamData%VSContrl = SrcParamData%VSContrl + DstParamData%YCMode = SrcParamData%YCMode + DstParamData%GenTiStp = SrcParamData%GenTiStp + DstParamData%GenTiStr = SrcParamData%GenTiStr + DstParamData%VS_Rgn2K = SrcParamData%VS_Rgn2K + DstParamData%YawNeut = SrcParamData%YawNeut + DstParamData%YawSpr = SrcParamData%YawSpr + DstParamData%YawDamp = SrcParamData%YawDamp + if (allocated(SrcParamData%PitNeut)) then + LB(1:1) = lbound(SrcParamData%PitNeut) + UB(1:1) = ubound(SrcParamData%PitNeut) + if (.not. allocated(DstParamData%PitNeut)) then + allocate(DstParamData%PitNeut(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%SStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PitNeut.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call StC_CopyMisc(SrcMiscData%SStC(i1), DstMiscData%SStC(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%PitNeut = SrcParamData%PitNeut end if - if (allocated(SrcMiscData%u_BStC)) then - LB(1:2) = lbound(SrcMiscData%u_BStC) - UB(1:2) = ubound(SrcMiscData%u_BStC) - if (.not. allocated(DstMiscData%u_BStC)) then - allocate(DstMiscData%u_BStC(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%PitSpr)) then + LB(1:1) = lbound(SrcParamData%PitSpr) + UB(1:1) = ubound(SrcParamData%PitSpr) + if (.not. allocated(DstParamData%PitSpr)) then + allocate(DstParamData%PitSpr(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_BStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PitSpr.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_CopyInput(SrcMiscData%u_BStC(i1,i2), DstMiscData%u_BStC(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstParamData%PitSpr = SrcParamData%PitSpr end if - if (allocated(SrcMiscData%u_NStC)) then - LB(1:2) = lbound(SrcMiscData%u_NStC) - UB(1:2) = ubound(SrcMiscData%u_NStC) - if (.not. allocated(DstMiscData%u_NStC)) then - allocate(DstMiscData%u_NStC(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%PitDamp)) then + LB(1:1) = lbound(SrcParamData%PitDamp) + UB(1:1) = ubound(SrcParamData%PitDamp) + if (.not. allocated(DstParamData%PitDamp)) then + allocate(DstParamData%PitDamp(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_NStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PitDamp.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_CopyInput(SrcMiscData%u_NStC(i1,i2), DstMiscData%u_NStC(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstParamData%PitDamp = SrcParamData%PitDamp end if - if (allocated(SrcMiscData%u_TStC)) then - LB(1:2) = lbound(SrcMiscData%u_TStC) - UB(1:2) = ubound(SrcMiscData%u_TStC) - if (.not. allocated(DstMiscData%u_TStC)) then - allocate(DstMiscData%u_TStC(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + DstParamData%TpBrDT = SrcParamData%TpBrDT + if (allocated(SrcParamData%TBDepISp)) then + LB(1:1) = lbound(SrcParamData%TBDepISp) + UB(1:1) = ubound(SrcParamData%TBDepISp) + if (.not. allocated(DstParamData%TBDepISp)) then + allocate(DstParamData%TBDepISp(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_TStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TBDepISp.', ErrStat, ErrMsg, RoutineName) return end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_CopyInput(SrcMiscData%u_TStC(i1,i2), DstMiscData%u_TStC(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end do + DstParamData%TBDepISp = SrcParamData%TBDepISp end if - if (allocated(SrcMiscData%u_SStC)) then - LB(1:2) = lbound(SrcMiscData%u_SStC) - UB(1:2) = ubound(SrcMiscData%u_SStC) - if (.not. allocated(DstMiscData%u_SStC)) then - allocate(DstMiscData%u_SStC(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_SStC.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_CopyInput(SrcMiscData%u_SStC(i1,i2), DstMiscData%u_SStC(i1,i2), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%TBDrConN = SrcParamData%TBDrConN + DstParamData%TBDrConD = SrcParamData%TBDrConD + DstParamData%NumBl = SrcParamData%NumBl + DstParamData%NumBStC = SrcParamData%NumBStC + DstParamData%NumNStC = SrcParamData%NumNStC + DstParamData%NumTStC = SrcParamData%NumTStC + DstParamData%NumSStC = SrcParamData%NumSStC + DstParamData%AfCmode = SrcParamData%AfCmode + DstParamData%AfC_Mean = SrcParamData%AfC_Mean + DstParamData%AfC_Amp = SrcParamData%AfC_Amp + DstParamData%AfC_Phase = SrcParamData%AfC_Phase + DstParamData%CCmode = SrcParamData%CCmode + DstParamData%StCCmode = SrcParamData%StCCmode + DstParamData%NumOuts = SrcParamData%NumOuts + DstParamData%NumOuts_DLL = SrcParamData%NumOuts_DLL + DstParamData%RootName = SrcParamData%RootName + DstParamData%PriPath = SrcParamData%PriPath + if (allocated(SrcParamData%OutParam)) then + LB(1:1) = lbound(SrcParamData%OutParam) + UB(1:1) = ubound(SrcParamData%OutParam) + if (.not. allocated(DstParamData%OutParam)) then + allocate(DstParamData%OutParam(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call NWTC_Library_CopyOutParmType(SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMiscData%y_BStC)) then - LB(1:1) = lbound(SrcMiscData%y_BStC) - UB(1:1) = ubound(SrcMiscData%y_BStC) - if (.not. allocated(DstMiscData%y_BStC)) then - allocate(DstMiscData%y_BStC(LB(1):UB(1)), stat=ErrStat2) + DstParamData%Delim = SrcParamData%Delim + DstParamData%UseBladedInterface = SrcParamData%UseBladedInterface + DstParamData%UseLegacyInterface = SrcParamData%UseLegacyInterface + DstParamData%DLL_Trgt = SrcParamData%DLL_Trgt + DstParamData%DLL_Ramp = SrcParamData%DLL_Ramp + DstParamData%BlAlpha = SrcParamData%BlAlpha + DstParamData%DLL_n = SrcParamData%DLL_n + DstParamData%avcOUTNAME_LEN = SrcParamData%avcOUTNAME_LEN + DstParamData%NacYaw_North = SrcParamData%NacYaw_North + DstParamData%AvgWindSpeed = SrcParamData%AvgWindSpeed + DstParamData%AirDens = SrcParamData%AirDens + DstParamData%TrimCase = SrcParamData%TrimCase + DstParamData%TrimGain = SrcParamData%TrimGain + DstParamData%RotSpeedRef = SrcParamData%RotSpeedRef + if (allocated(SrcParamData%BStC)) then + LB(1:1) = lbound(SrcParamData%BStC) + UB(1:1) = ubound(SrcParamData%BStC) + if (.not. allocated(DstParamData%BStC)) then + allocate(DstParamData%BStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%y_BStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BStC.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call StC_CopyOutput(SrcMiscData%y_BStC(i1), DstMiscData%y_BStC(i1), CtrlCode, ErrStat2, ErrMsg2) + call StC_CopyParam(SrcParamData%BStC(i1), DstParamData%BStC(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMiscData%y_NStC)) then - LB(1:1) = lbound(SrcMiscData%y_NStC) - UB(1:1) = ubound(SrcMiscData%y_NStC) - if (.not. allocated(DstMiscData%y_NStC)) then - allocate(DstMiscData%y_NStC(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%NStC)) then + LB(1:1) = lbound(SrcParamData%NStC) + UB(1:1) = ubound(SrcParamData%NStC) + if (.not. allocated(DstParamData%NStC)) then + allocate(DstParamData%NStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%y_NStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NStC.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call StC_CopyOutput(SrcMiscData%y_NStC(i1), DstMiscData%y_NStC(i1), CtrlCode, ErrStat2, ErrMsg2) + call StC_CopyParam(SrcParamData%NStC(i1), DstParamData%NStC(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMiscData%y_TStC)) then - LB(1:1) = lbound(SrcMiscData%y_TStC) - UB(1:1) = ubound(SrcMiscData%y_TStC) - if (.not. allocated(DstMiscData%y_TStC)) then - allocate(DstMiscData%y_TStC(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%TStC)) then + LB(1:1) = lbound(SrcParamData%TStC) + UB(1:1) = ubound(SrcParamData%TStC) + if (.not. allocated(DstParamData%TStC)) then + allocate(DstParamData%TStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%y_TStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TStC.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call StC_CopyOutput(SrcMiscData%y_TStC(i1), DstMiscData%y_TStC(i1), CtrlCode, ErrStat2, ErrMsg2) + call StC_CopyParam(SrcParamData%TStC(i1), DstParamData%TStC(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcMiscData%y_SStC)) then - LB(1:1) = lbound(SrcMiscData%y_SStC) - UB(1:1) = ubound(SrcMiscData%y_SStC) - if (.not. allocated(DstMiscData%y_SStC)) then - allocate(DstMiscData%y_SStC(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%SStC)) then + LB(1:1) = lbound(SrcParamData%SStC) + UB(1:1) = ubound(SrcParamData%SStC) + if (.not. allocated(DstParamData%SStC)) then + allocate(DstParamData%SStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%y_SStC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%SStC.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call StC_CopyOutput(SrcMiscData%y_SStC(i1), DstMiscData%y_SStC(i1), CtrlCode, ErrStat2, ErrMsg2) + call StC_CopyParam(SrcParamData%SStC(i1), DstParamData%SStC(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - call SrvD_CopyModuleMapType(SrcMiscData%SrvD_MeshMap, DstMiscData%SrvD_MeshMap, CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - DstMiscData%PrevTstepNcall = SrcMiscData%PrevTstepNcall + DstParamData%InterpOrder = SrcParamData%InterpOrder + DstParamData%EXavrSWAP = SrcParamData%EXavrSWAP + DstParamData%NumCableControl = SrcParamData%NumCableControl + DstParamData%NumStC_Control = SrcParamData%NumStC_Control + if (allocated(SrcParamData%StCMeasNumPerChan)) then + LB(1:1) = lbound(SrcParamData%StCMeasNumPerChan) + UB(1:1) = ubound(SrcParamData%StCMeasNumPerChan) + if (.not. allocated(DstParamData%StCMeasNumPerChan)) then + allocate(DstParamData%StCMeasNumPerChan(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%StCMeasNumPerChan.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%StCMeasNumPerChan = SrcParamData%StCMeasNumPerChan + end if + DstParamData%SensorType = SrcParamData%SensorType + DstParamData%NumBeam = SrcParamData%NumBeam + DstParamData%NumPulseGate = SrcParamData%NumPulseGate end subroutine -subroutine SrvD_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(SrvD_MiscVarType), intent(inout) :: MiscData +subroutine SrvD_DestroyParam(ParamData, ErrStat, ErrMsg) + type(SrvD_ParameterType), intent(inout) :: ParamData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SrvD_DestroyMisc' + character(*), parameter :: RoutineName = 'SrvD_DestroyParam' ErrStat = ErrID_None ErrMsg = '' - call SrvD_DestroyBladedDLLType(MiscData%dll_data, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(MiscData%xd_BlPitchFilter)) then - deallocate(MiscData%xd_BlPitchFilter) + if (allocated(ParamData%BlPitchInit)) then + deallocate(ParamData%BlPitchInit) end if - if (allocated(MiscData%BStC)) then - LB(1:1) = lbound(MiscData%BStC) - UB(1:1) = ubound(MiscData%BStC) + if (allocated(ParamData%BlPitchF)) then + deallocate(ParamData%BlPitchF) + end if + if (allocated(ParamData%PitManRat)) then + deallocate(ParamData%PitManRat) + end if + if (allocated(ParamData%TPitManS)) then + deallocate(ParamData%TPitManS) + end if + if (allocated(ParamData%PitNeut)) then + deallocate(ParamData%PitNeut) + end if + if (allocated(ParamData%PitSpr)) then + deallocate(ParamData%PitSpr) + end if + if (allocated(ParamData%PitDamp)) then + deallocate(ParamData%PitDamp) + end if + if (allocated(ParamData%TBDepISp)) then + deallocate(ParamData%TBDepISp) + end if + if (allocated(ParamData%OutParam)) then + LB(1:1) = lbound(ParamData%OutParam) + UB(1:1) = ubound(ParamData%OutParam) do i1 = LB(1), UB(1) - call StC_DestroyMisc(MiscData%BStC(i1), ErrStat2, ErrMsg2) + call NWTC_Library_DestroyOutParmType(ParamData%OutParam(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MiscData%BStC) + deallocate(ParamData%OutParam) end if - if (allocated(MiscData%NStC)) then - LB(1:1) = lbound(MiscData%NStC) - UB(1:1) = ubound(MiscData%NStC) + call FreeDynamicLib( ParamData%DLL_Trgt, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(ParamData%BStC)) then + LB(1:1) = lbound(ParamData%BStC) + UB(1:1) = ubound(ParamData%BStC) do i1 = LB(1), UB(1) - call StC_DestroyMisc(MiscData%NStC(i1), ErrStat2, ErrMsg2) + call StC_DestroyParam(ParamData%BStC(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MiscData%NStC) + deallocate(ParamData%BStC) end if - if (allocated(MiscData%TStC)) then - LB(1:1) = lbound(MiscData%TStC) - UB(1:1) = ubound(MiscData%TStC) + if (allocated(ParamData%NStC)) then + LB(1:1) = lbound(ParamData%NStC) + UB(1:1) = ubound(ParamData%NStC) do i1 = LB(1), UB(1) - call StC_DestroyMisc(MiscData%TStC(i1), ErrStat2, ErrMsg2) + call StC_DestroyParam(ParamData%NStC(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MiscData%TStC) + deallocate(ParamData%NStC) end if - if (allocated(MiscData%SStC)) then - LB(1:1) = lbound(MiscData%SStC) - UB(1:1) = ubound(MiscData%SStC) + if (allocated(ParamData%TStC)) then + LB(1:1) = lbound(ParamData%TStC) + UB(1:1) = ubound(ParamData%TStC) do i1 = LB(1), UB(1) - call StC_DestroyMisc(MiscData%SStC(i1), ErrStat2, ErrMsg2) + call StC_DestroyParam(ParamData%TStC(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MiscData%SStC) - end if - if (allocated(MiscData%u_BStC)) then - LB(1:2) = lbound(MiscData%u_BStC) - UB(1:2) = ubound(MiscData%u_BStC) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_DestroyInput(MiscData%u_BStC(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(MiscData%u_BStC) - end if - if (allocated(MiscData%u_NStC)) then - LB(1:2) = lbound(MiscData%u_NStC) - UB(1:2) = ubound(MiscData%u_NStC) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_DestroyInput(MiscData%u_NStC(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(MiscData%u_NStC) - end if - if (allocated(MiscData%u_TStC)) then - LB(1:2) = lbound(MiscData%u_TStC) - UB(1:2) = ubound(MiscData%u_TStC) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_DestroyInput(MiscData%u_TStC(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(MiscData%u_TStC) - end if - if (allocated(MiscData%u_SStC)) then - LB(1:2) = lbound(MiscData%u_SStC) - UB(1:2) = ubound(MiscData%u_SStC) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_DestroyInput(MiscData%u_SStC(i1,i2), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - end do - deallocate(MiscData%u_SStC) + deallocate(ParamData%TStC) end if - if (allocated(MiscData%y_BStC)) then - LB(1:1) = lbound(MiscData%y_BStC) - UB(1:1) = ubound(MiscData%y_BStC) + if (allocated(ParamData%SStC)) then + LB(1:1) = lbound(ParamData%SStC) + UB(1:1) = ubound(ParamData%SStC) do i1 = LB(1), UB(1) - call StC_DestroyOutput(MiscData%y_BStC(i1), ErrStat2, ErrMsg2) + call StC_DestroyParam(ParamData%SStC(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(MiscData%y_BStC) + deallocate(ParamData%SStC) end if - if (allocated(MiscData%y_NStC)) then - LB(1:1) = lbound(MiscData%y_NStC) - UB(1:1) = ubound(MiscData%y_NStC) - do i1 = LB(1), UB(1) - call StC_DestroyOutput(MiscData%y_NStC(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%y_NStC) - end if - if (allocated(MiscData%y_TStC)) then - LB(1:1) = lbound(MiscData%y_TStC) - UB(1:1) = ubound(MiscData%y_TStC) - do i1 = LB(1), UB(1) - call StC_DestroyOutput(MiscData%y_TStC(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%y_TStC) - end if - if (allocated(MiscData%y_SStC)) then - LB(1:1) = lbound(MiscData%y_SStC) - UB(1:1) = ubound(MiscData%y_SStC) - do i1 = LB(1), UB(1) - call StC_DestroyOutput(MiscData%y_SStC(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(MiscData%y_SStC) + if (allocated(ParamData%StCMeasNumPerChan)) then + deallocate(ParamData%StCMeasNumPerChan) end if - call SrvD_DestroyModuleMapType(MiscData%SrvD_MeshMap, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine -subroutine SrvD_PackMisc(RF, Indata) +subroutine SrvD_PackParam(RF, Indata) type(RegFile), intent(inout) :: RF - type(SrvD_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'SrvD_PackMisc' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + type(SrvD_ParameterType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SrvD_PackParam' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%LastTimeCalled) - call SrvD_PackBladedDLLType(RF, InData%dll_data) - call RegPack(RF, InData%FirstWarn) - call RegPack(RF, InData%LastTimeFiltered) - call RegPackAlloc(RF, InData%xd_BlPitchFilter) + call RegPack(RF, InData%DT) + call RegPack(RF, InData%HSSBrDT) + call RegPack(RF, InData%HSSBrTqF) + call RegPack(RF, InData%SIG_POSl) + call RegPack(RF, InData%SIG_POTq) + call RegPack(RF, InData%SIG_SlPc) + call RegPack(RF, InData%SIG_Slop) + call RegPack(RF, InData%SIG_SySp) + call RegPack(RF, InData%TEC_A0) + call RegPack(RF, InData%TEC_C0) + call RegPack(RF, InData%TEC_C1) + call RegPack(RF, InData%TEC_C2) + call RegPack(RF, InData%TEC_K2) + call RegPack(RF, InData%TEC_MR) + call RegPack(RF, InData%TEC_Re1) + call RegPack(RF, InData%TEC_RLR) + call RegPack(RF, InData%TEC_RRes) + call RegPack(RF, InData%TEC_SRes) + call RegPack(RF, InData%TEC_SySp) + call RegPack(RF, InData%TEC_V1a) + call RegPack(RF, InData%TEC_VLL) + call RegPack(RF, InData%TEC_Xe1) + call RegPack(RF, InData%GenEff) + call RegPackAlloc(RF, InData%BlPitchInit) + call RegPackAlloc(RF, InData%BlPitchF) + call RegPackAlloc(RF, InData%PitManRat) + call RegPack(RF, InData%YawManRat) + call RegPack(RF, InData%NacYawF) + call RegPack(RF, InData%SpdGenOn) + call RegPack(RF, InData%THSSBrDp) + call RegPack(RF, InData%THSSBrFl) + call RegPack(RF, InData%TimGenOf) + call RegPack(RF, InData%TimGenOn) + call RegPack(RF, InData%TPCOn) + call RegPackAlloc(RF, InData%TPitManS) + call RegPack(RF, InData%TYawManS) + call RegPack(RF, InData%TYCOn) + call RegPack(RF, InData%VS_RtGnSp) + call RegPack(RF, InData%VS_RtTq) + call RegPack(RF, InData%VS_Slope) + call RegPack(RF, InData%VS_SlPc) + call RegPack(RF, InData%VS_SySp) + call RegPack(RF, InData%VS_TrGnSp) + call RegPack(RF, InData%YawPosCom) + call RegPack(RF, InData%YawRateCom) + call RegPack(RF, InData%GenModel) + call RegPack(RF, InData%HSSBrMode) + call RegPack(RF, InData%PCMode) + call RegPack(RF, InData%VSContrl) + call RegPack(RF, InData%YCMode) + call RegPack(RF, InData%GenTiStp) + call RegPack(RF, InData%GenTiStr) + call RegPack(RF, InData%VS_Rgn2K) + call RegPack(RF, InData%YawNeut) + call RegPack(RF, InData%YawSpr) + call RegPack(RF, InData%YawDamp) + call RegPackAlloc(RF, InData%PitNeut) + call RegPackAlloc(RF, InData%PitSpr) + call RegPackAlloc(RF, InData%PitDamp) + call RegPack(RF, InData%TpBrDT) + call RegPackAlloc(RF, InData%TBDepISp) + call RegPack(RF, InData%TBDrConN) + call RegPack(RF, InData%TBDrConD) + call RegPack(RF, InData%NumBl) + call RegPack(RF, InData%NumBStC) + call RegPack(RF, InData%NumNStC) + call RegPack(RF, InData%NumTStC) + call RegPack(RF, InData%NumSStC) + call RegPack(RF, InData%AfCmode) + call RegPack(RF, InData%AfC_Mean) + call RegPack(RF, InData%AfC_Amp) + call RegPack(RF, InData%AfC_Phase) + call RegPack(RF, InData%CCmode) + call RegPack(RF, InData%StCCmode) + call RegPack(RF, InData%NumOuts) + call RegPack(RF, InData%NumOuts_DLL) + call RegPack(RF, InData%RootName) + call RegPack(RF, InData%PriPath) + call RegPack(RF, allocated(InData%OutParam)) + if (allocated(InData%OutParam)) then + call RegPackBounds(RF, 1, lbound(InData%OutParam), ubound(InData%OutParam)) + LB(1:1) = lbound(InData%OutParam) + UB(1:1) = ubound(InData%OutParam) + do i1 = LB(1), UB(1) + call NWTC_Library_PackOutParmType(RF, InData%OutParam(i1)) + end do + end if + call RegPack(RF, InData%Delim) + call RegPack(RF, InData%UseBladedInterface) + call RegPack(RF, InData%UseLegacyInterface) + call DLLTypePack(RF, InData%DLL_Trgt) + call RegPack(RF, InData%DLL_Ramp) + call RegPack(RF, InData%BlAlpha) + call RegPack(RF, InData%DLL_n) + call RegPack(RF, InData%avcOUTNAME_LEN) + call RegPack(RF, InData%NacYaw_North) + call RegPack(RF, InData%AvgWindSpeed) + call RegPack(RF, InData%AirDens) + call RegPack(RF, InData%TrimCase) + call RegPack(RF, InData%TrimGain) + call RegPack(RF, InData%RotSpeedRef) call RegPack(RF, allocated(InData%BStC)) if (allocated(InData%BStC)) then call RegPackBounds(RF, 1, lbound(InData%BStC), ubound(InData%BStC)) LB(1:1) = lbound(InData%BStC) UB(1:1) = ubound(InData%BStC) do i1 = LB(1), UB(1) - call StC_PackMisc(RF, InData%BStC(i1)) + call StC_PackParam(RF, InData%BStC(i1)) end do end if call RegPack(RF, allocated(InData%NStC)) @@ -4068,7 +4266,7 @@ subroutine SrvD_PackMisc(RF, Indata) LB(1:1) = lbound(InData%NStC) UB(1:1) = ubound(InData%NStC) do i1 = LB(1), UB(1) - call StC_PackMisc(RF, InData%NStC(i1)) + call StC_PackParam(RF, InData%NStC(i1)) end do end if call RegPack(RF, allocated(InData%TStC)) @@ -4077,7 +4275,7 @@ subroutine SrvD_PackMisc(RF, Indata) LB(1:1) = lbound(InData%TStC) UB(1:1) = ubound(InData%TStC) do i1 = LB(1), UB(1) - call StC_PackMisc(RF, InData%TStC(i1)) + call StC_PackParam(RF, InData%TStC(i1)) end do end if call RegPack(RF, allocated(InData%SStC)) @@ -4086,108 +4284,134 @@ subroutine SrvD_PackMisc(RF, Indata) LB(1:1) = lbound(InData%SStC) UB(1:1) = ubound(InData%SStC) do i1 = LB(1), UB(1) - call StC_PackMisc(RF, InData%SStC(i1)) - end do - end if - call RegPack(RF, allocated(InData%u_BStC)) - if (allocated(InData%u_BStC)) then - call RegPackBounds(RF, 2, lbound(InData%u_BStC), ubound(InData%u_BStC)) - LB(1:2) = lbound(InData%u_BStC) - UB(1:2) = ubound(InData%u_BStC) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_PackInput(RF, InData%u_BStC(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%u_NStC)) - if (allocated(InData%u_NStC)) then - call RegPackBounds(RF, 2, lbound(InData%u_NStC), ubound(InData%u_NStC)) - LB(1:2) = lbound(InData%u_NStC) - UB(1:2) = ubound(InData%u_NStC) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_PackInput(RF, InData%u_NStC(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%u_TStC)) - if (allocated(InData%u_TStC)) then - call RegPackBounds(RF, 2, lbound(InData%u_TStC), ubound(InData%u_TStC)) - LB(1:2) = lbound(InData%u_TStC) - UB(1:2) = ubound(InData%u_TStC) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_PackInput(RF, InData%u_TStC(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%u_SStC)) - if (allocated(InData%u_SStC)) then - call RegPackBounds(RF, 2, lbound(InData%u_SStC), ubound(InData%u_SStC)) - LB(1:2) = lbound(InData%u_SStC) - UB(1:2) = ubound(InData%u_SStC) - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_PackInput(RF, InData%u_SStC(i1,i2)) - end do - end do - end if - call RegPack(RF, allocated(InData%y_BStC)) - if (allocated(InData%y_BStC)) then - call RegPackBounds(RF, 1, lbound(InData%y_BStC), ubound(InData%y_BStC)) - LB(1:1) = lbound(InData%y_BStC) - UB(1:1) = ubound(InData%y_BStC) - do i1 = LB(1), UB(1) - call StC_PackOutput(RF, InData%y_BStC(i1)) - end do - end if - call RegPack(RF, allocated(InData%y_NStC)) - if (allocated(InData%y_NStC)) then - call RegPackBounds(RF, 1, lbound(InData%y_NStC), ubound(InData%y_NStC)) - LB(1:1) = lbound(InData%y_NStC) - UB(1:1) = ubound(InData%y_NStC) - do i1 = LB(1), UB(1) - call StC_PackOutput(RF, InData%y_NStC(i1)) - end do - end if - call RegPack(RF, allocated(InData%y_TStC)) - if (allocated(InData%y_TStC)) then - call RegPackBounds(RF, 1, lbound(InData%y_TStC), ubound(InData%y_TStC)) - LB(1:1) = lbound(InData%y_TStC) - UB(1:1) = ubound(InData%y_TStC) - do i1 = LB(1), UB(1) - call StC_PackOutput(RF, InData%y_TStC(i1)) - end do - end if - call RegPack(RF, allocated(InData%y_SStC)) - if (allocated(InData%y_SStC)) then - call RegPackBounds(RF, 1, lbound(InData%y_SStC), ubound(InData%y_SStC)) - LB(1:1) = lbound(InData%y_SStC) - UB(1:1) = ubound(InData%y_SStC) - do i1 = LB(1), UB(1) - call StC_PackOutput(RF, InData%y_SStC(i1)) + call StC_PackParam(RF, InData%SStC(i1)) end do end if - call SrvD_PackModuleMapType(RF, InData%SrvD_MeshMap) - call RegPack(RF, InData%PrevTstepNcall) + call RegPack(RF, InData%InterpOrder) + call RegPack(RF, InData%EXavrSWAP) + call RegPack(RF, InData%NumCableControl) + call RegPack(RF, InData%NumStC_Control) + call RegPackAlloc(RF, InData%StCMeasNumPerChan) + call RegPack(RF, InData%SensorType) + call RegPack(RF, InData%NumBeam) + call RegPack(RF, InData%NumPulseGate) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine SrvD_UnPackMisc(RF, OutData) +subroutine SrvD_UnPackParam(RF, OutData) type(RegFile), intent(inout) :: RF - type(SrvD_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SrvD_UnPackMisc' - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) + type(SrvD_ParameterType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SrvD_UnPackParam' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%LastTimeCalled); if (RegCheckErr(RF, RoutineName)) return - call SrvD_UnpackBladedDLLType(RF, OutData%dll_data) ! dll_data - call RegUnpack(RF, OutData%FirstWarn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LastTimeFiltered); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%xd_BlPitchFilter); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HSSBrDT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HSSBrTqF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SIG_POSl); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SIG_POTq); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SIG_SlPc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SIG_Slop); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SIG_SySp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_A0); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_C0); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_C1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_C2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_K2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_MR); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_Re1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_RLR); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_RRes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_SRes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_SySp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_V1a); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_VLL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TEC_Xe1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%GenEff); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPitchInit); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPitchF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PitManRat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawManRat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacYawF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SpdGenOn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%THSSBrDp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%THSSBrFl); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TimGenOf); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TimGenOn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TPCOn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TPitManS); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TYawManS); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TYCOn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VS_RtGnSp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VS_RtTq); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VS_Slope); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VS_SlPc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VS_SySp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VS_TrGnSp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawPosCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawRateCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%GenModel); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HSSBrMode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PCMode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VSContrl); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YCMode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%GenTiStp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%GenTiStr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%VS_Rgn2K); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawNeut); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawSpr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawDamp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PitNeut); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PitSpr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PitDamp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TpBrDT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TBDepISp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TBDrConN); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TBDrConD); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumBl); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumBStC); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumNStC); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumTStC); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumSStC); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AfCmode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AfC_Mean); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AfC_Amp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AfC_Phase); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CCmode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%StCCmode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumOuts_DLL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PriPath); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%OutParam)) deallocate(OutData%OutParam) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OutParam(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call NWTC_Library_UnpackOutParmType(RF, OutData%OutParam(i1)) ! OutParam + end do + end if + call RegUnpack(RF, OutData%Delim); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UseBladedInterface); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UseLegacyInterface); if (RegCheckErr(RF, RoutineName)) return + call DLLTypeUnpack(RF, OutData%DLL_Trgt) ! DLL_Trgt + call RegUnpack(RF, OutData%DLL_Ramp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%BlAlpha); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DLL_n); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%avcOUTNAME_LEN); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacYaw_North); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AvgWindSpeed); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TrimCase); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TrimGain); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotSpeedRef); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%BStC)) deallocate(OutData%BStC) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -4198,7 +4422,7 @@ subroutine SrvD_UnPackMisc(RF, OutData) return end if do i1 = LB(1), UB(1) - call StC_UnpackMisc(RF, OutData%BStC(i1)) ! BStC + call StC_UnpackParam(RF, OutData%BStC(i1)) ! BStC end do end if if (allocated(OutData%NStC)) deallocate(OutData%NStC) @@ -4211,7 +4435,7 @@ subroutine SrvD_UnPackMisc(RF, OutData) return end if do i1 = LB(1), UB(1) - call StC_UnpackMisc(RF, OutData%NStC(i1)) ! NStC + call StC_UnpackParam(RF, OutData%NStC(i1)) ! NStC end do end if if (allocated(OutData%TStC)) deallocate(OutData%TStC) @@ -4224,7 +4448,7 @@ subroutine SrvD_UnPackMisc(RF, OutData) return end if do i1 = LB(1), UB(1) - call StC_UnpackMisc(RF, OutData%TStC(i1)) ! TStC + call StC_UnpackParam(RF, OutData%TStC(i1)) ! TStC end do end if if (allocated(OutData%SStC)) deallocate(OutData%SStC) @@ -4237,1070 +4461,546 @@ subroutine SrvD_UnPackMisc(RF, OutData) return end if do i1 = LB(1), UB(1) - call StC_UnpackMisc(RF, OutData%SStC(i1)) ! SStC + call StC_UnpackParam(RF, OutData%SStC(i1)) ! SStC end do end if - if (allocated(OutData%u_BStC)) deallocate(OutData%u_BStC) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_BStC(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_BStC.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + call RegUnpack(RF, OutData%InterpOrder); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%EXavrSWAP); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumCableControl); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumStC_Control); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%StCMeasNumPerChan); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SensorType); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumBeam); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumPulseGate); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SrvD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) + type(SrvD_InputType), intent(inout) :: SrcInputData + type(SrvD_InputType), intent(inout) :: DstInputData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SrvD_CopyInput' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcInputData%BlPitch)) then + LB(1:1) = lbound(SrcInputData%BlPitch) + UB(1:1) = ubound(SrcInputData%BlPitch) + if (.not. allocated(DstInputData%BlPitch)) then + allocate(DstInputData%BlPitch(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%BlPitch.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_UnpackInput(RF, OutData%u_BStC(i1,i2)) ! u_BStC - end do - end do + DstInputData%BlPitch = SrcInputData%BlPitch end if - if (allocated(OutData%u_NStC)) deallocate(OutData%u_NStC) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_NStC(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_NStC.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcInputData%BlPRate)) then + LB(1:1) = lbound(SrcInputData%BlPRate) + UB(1:1) = ubound(SrcInputData%BlPRate) + if (.not. allocated(DstInputData%BlPRate)) then + allocate(DstInputData%BlPRate(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%BlPRate.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_UnpackInput(RF, OutData%u_NStC(i1,i2)) ! u_NStC - end do - end do + DstInputData%BlPRate = SrcInputData%BlPRate end if - if (allocated(OutData%u_TStC)) deallocate(OutData%u_TStC) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_TStC(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_TStC.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + DstInputData%Yaw = SrcInputData%Yaw + DstInputData%YawRate = SrcInputData%YawRate + DstInputData%LSS_Spd = SrcInputData%LSS_Spd + DstInputData%HSS_Spd = SrcInputData%HSS_Spd + DstInputData%RotSpeed = SrcInputData%RotSpeed + DstInputData%ExternalYawPosCom = SrcInputData%ExternalYawPosCom + DstInputData%ExternalYawRateCom = SrcInputData%ExternalYawRateCom + if (allocated(SrcInputData%ExternalBlPitchCom)) then + LB(1:1) = lbound(SrcInputData%ExternalBlPitchCom) + UB(1:1) = ubound(SrcInputData%ExternalBlPitchCom) + if (.not. allocated(DstInputData%ExternalBlPitchCom)) then + allocate(DstInputData%ExternalBlPitchCom(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%ExternalBlPitchCom.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_UnpackInput(RF, OutData%u_TStC(i1,i2)) ! u_TStC - end do - end do + DstInputData%ExternalBlPitchCom = SrcInputData%ExternalBlPitchCom end if - if (allocated(OutData%u_SStC)) deallocate(OutData%u_SStC) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%u_SStC(LB(1):UB(1),LB(2):UB(2)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_SStC.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + DstInputData%ExternalGenTrq = SrcInputData%ExternalGenTrq + DstInputData%ExternalElecPwr = SrcInputData%ExternalElecPwr + DstInputData%ExternalHSSBrFrac = SrcInputData%ExternalHSSBrFrac + if (allocated(SrcInputData%ExternalBlAirfoilCom)) then + LB(1:1) = lbound(SrcInputData%ExternalBlAirfoilCom) + UB(1:1) = ubound(SrcInputData%ExternalBlAirfoilCom) + if (.not. allocated(DstInputData%ExternalBlAirfoilCom)) then + allocate(DstInputData%ExternalBlAirfoilCom(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%ExternalBlAirfoilCom.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i2 = LB(2), UB(2) - do i1 = LB(1), UB(1) - call StC_UnpackInput(RF, OutData%u_SStC(i1,i2)) ! u_SStC - end do - end do + DstInputData%ExternalBlAirfoilCom = SrcInputData%ExternalBlAirfoilCom end if - if (allocated(OutData%y_BStC)) deallocate(OutData%y_BStC) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%y_BStC(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_BStC.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcInputData%ExternalCableDeltaL)) then + LB(1:1) = lbound(SrcInputData%ExternalCableDeltaL) + UB(1:1) = ubound(SrcInputData%ExternalCableDeltaL) + if (.not. allocated(DstInputData%ExternalCableDeltaL)) then + allocate(DstInputData%ExternalCableDeltaL(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%ExternalCableDeltaL.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i1 = LB(1), UB(1) - call StC_UnpackOutput(RF, OutData%y_BStC(i1)) ! y_BStC - end do + DstInputData%ExternalCableDeltaL = SrcInputData%ExternalCableDeltaL end if - if (allocated(OutData%y_NStC)) deallocate(OutData%y_NStC) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%y_NStC(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_NStC.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcInputData%ExternalCableDeltaLdot)) then + LB(1:1) = lbound(SrcInputData%ExternalCableDeltaLdot) + UB(1:1) = ubound(SrcInputData%ExternalCableDeltaLdot) + if (.not. allocated(DstInputData%ExternalCableDeltaLdot)) then + allocate(DstInputData%ExternalCableDeltaLdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%ExternalCableDeltaLdot.', ErrStat, ErrMsg, RoutineName) + return + end if end if - do i1 = LB(1), UB(1) - call StC_UnpackOutput(RF, OutData%y_NStC(i1)) ! y_NStC + DstInputData%ExternalCableDeltaLdot = SrcInputData%ExternalCableDeltaLdot + end if + DstInputData%TwrAccel = SrcInputData%TwrAccel + DstInputData%YawErr = SrcInputData%YawErr + DstInputData%WindDir = SrcInputData%WindDir + DstInputData%RootMyc = SrcInputData%RootMyc + DstInputData%YawBrTAxp = SrcInputData%YawBrTAxp + DstInputData%YawBrTAyp = SrcInputData%YawBrTAyp + DstInputData%LSSTipPxa = SrcInputData%LSSTipPxa + DstInputData%RootMxc = SrcInputData%RootMxc + DstInputData%LSSTipMxa = SrcInputData%LSSTipMxa + DstInputData%LSSTipMya = SrcInputData%LSSTipMya + DstInputData%LSSTipMza = SrcInputData%LSSTipMza + DstInputData%LSSTipMys = SrcInputData%LSSTipMys + DstInputData%LSSTipMzs = SrcInputData%LSSTipMzs + DstInputData%YawBrMyn = SrcInputData%YawBrMyn + DstInputData%YawBrMzn = SrcInputData%YawBrMzn + DstInputData%NcIMURAxs = SrcInputData%NcIMURAxs + DstInputData%NcIMURAys = SrcInputData%NcIMURAys + DstInputData%NcIMURAzs = SrcInputData%NcIMURAzs + DstInputData%RotPwr = SrcInputData%RotPwr + DstInputData%HorWindV = SrcInputData%HorWindV + DstInputData%YawAngle = SrcInputData%YawAngle + DstInputData%LSShftFxa = SrcInputData%LSShftFxa + DstInputData%LSShftFys = SrcInputData%LSShftFys + DstInputData%LSShftFzs = SrcInputData%LSShftFzs + call MeshCopy(SrcInputData%PtfmMotionMesh, DstInputData%PtfmMotionMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcInputData%BStCMotionMesh)) then + LB(1:2) = lbound(SrcInputData%BStCMotionMesh) + UB(1:2) = ubound(SrcInputData%BStCMotionMesh) + if (.not. allocated(DstInputData%BStCMotionMesh)) then + allocate(DstInputData%BStCMotionMesh(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%BStCMotionMesh.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call MeshCopy(SrcInputData%BStCMotionMesh(i1,i2), DstInputData%BStCMotionMesh(i1,i2), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end do end if - if (allocated(OutData%y_TStC)) deallocate(OutData%y_TStC) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%y_TStC(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_TStC.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcInputData%NStCMotionMesh)) then + LB(1:1) = lbound(SrcInputData%NStCMotionMesh) + UB(1:1) = ubound(SrcInputData%NStCMotionMesh) + if (.not. allocated(DstInputData%NStCMotionMesh)) then + allocate(DstInputData%NStCMotionMesh(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%NStCMotionMesh.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i1 = LB(1), UB(1) - call StC_UnpackOutput(RF, OutData%y_TStC(i1)) ! y_TStC + call MeshCopy(SrcInputData%NStCMotionMesh(i1), DstInputData%NStCMotionMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - if (allocated(OutData%y_SStC)) deallocate(OutData%y_SStC) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%y_SStC(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_SStC.', RF%ErrStat, RF%ErrMsg, RoutineName) - return + if (allocated(SrcInputData%TStCMotionMesh)) then + LB(1:1) = lbound(SrcInputData%TStCMotionMesh) + UB(1:1) = ubound(SrcInputData%TStCMotionMesh) + if (.not. allocated(DstInputData%TStCMotionMesh)) then + allocate(DstInputData%TStCMotionMesh(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%TStCMotionMesh.', ErrStat, ErrMsg, RoutineName) + return + end if end if do i1 = LB(1), UB(1) - call StC_UnpackOutput(RF, OutData%y_SStC(i1)) ! y_SStC + call MeshCopy(SrcInputData%TStCMotionMesh(i1), DstInputData%TStCMotionMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end do end if - call SrvD_UnpackModuleMapType(RF, OutData%SrvD_MeshMap) ! SrvD_MeshMap - call RegUnpack(RF, OutData%PrevTstepNcall); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine SrvD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) - type(SrvD_ParameterType), intent(in) :: SrcParamData - type(SrvD_ParameterType), intent(inout) :: DstParamData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SrvD_CopyParam' - ErrStat = ErrID_None - ErrMsg = '' - DstParamData%DT = SrcParamData%DT - DstParamData%HSSBrDT = SrcParamData%HSSBrDT - DstParamData%HSSBrTqF = SrcParamData%HSSBrTqF - DstParamData%SIG_POSl = SrcParamData%SIG_POSl - DstParamData%SIG_POTq = SrcParamData%SIG_POTq - DstParamData%SIG_SlPc = SrcParamData%SIG_SlPc - DstParamData%SIG_Slop = SrcParamData%SIG_Slop - DstParamData%SIG_SySp = SrcParamData%SIG_SySp - DstParamData%TEC_A0 = SrcParamData%TEC_A0 - DstParamData%TEC_C0 = SrcParamData%TEC_C0 - DstParamData%TEC_C1 = SrcParamData%TEC_C1 - DstParamData%TEC_C2 = SrcParamData%TEC_C2 - DstParamData%TEC_K2 = SrcParamData%TEC_K2 - DstParamData%TEC_MR = SrcParamData%TEC_MR - DstParamData%TEC_Re1 = SrcParamData%TEC_Re1 - DstParamData%TEC_RLR = SrcParamData%TEC_RLR - DstParamData%TEC_RRes = SrcParamData%TEC_RRes - DstParamData%TEC_SRes = SrcParamData%TEC_SRes - DstParamData%TEC_SySp = SrcParamData%TEC_SySp - DstParamData%TEC_V1a = SrcParamData%TEC_V1a - DstParamData%TEC_VLL = SrcParamData%TEC_VLL - DstParamData%TEC_Xe1 = SrcParamData%TEC_Xe1 - DstParamData%GenEff = SrcParamData%GenEff - if (allocated(SrcParamData%BlPitchInit)) then - LB(1:1) = lbound(SrcParamData%BlPitchInit) - UB(1:1) = ubound(SrcParamData%BlPitchInit) - if (.not. allocated(DstParamData%BlPitchInit)) then - allocate(DstParamData%BlPitchInit(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInputData%SStCMotionMesh)) then + LB(1:1) = lbound(SrcInputData%SStCMotionMesh) + UB(1:1) = ubound(SrcInputData%SStCMotionMesh) + if (.not. allocated(DstInputData%SStCMotionMesh)) then + allocate(DstInputData%SStCMotionMesh(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BlPitchInit.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%SStCMotionMesh.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%BlPitchInit = SrcParamData%BlPitchInit + do i1 = LB(1), UB(1) + call MeshCopy(SrcInputData%SStCMotionMesh(i1), DstInputData%SStCMotionMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcParamData%BlPitchF)) then - LB(1:1) = lbound(SrcParamData%BlPitchF) - UB(1:1) = ubound(SrcParamData%BlPitchF) - if (.not. allocated(DstParamData%BlPitchF)) then - allocate(DstParamData%BlPitchF(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInputData%LidSpeed)) then + LB(1:1) = lbound(SrcInputData%LidSpeed) + UB(1:1) = ubound(SrcInputData%LidSpeed) + if (.not. allocated(DstInputData%LidSpeed)) then + allocate(DstInputData%LidSpeed(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BlPitchF.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%LidSpeed.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%BlPitchF = SrcParamData%BlPitchF + DstInputData%LidSpeed = SrcInputData%LidSpeed end if - if (allocated(SrcParamData%PitManRat)) then - LB(1:1) = lbound(SrcParamData%PitManRat) - UB(1:1) = ubound(SrcParamData%PitManRat) - if (.not. allocated(DstParamData%PitManRat)) then - allocate(DstParamData%PitManRat(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInputData%MsrPositionsX)) then + LB(1:1) = lbound(SrcInputData%MsrPositionsX) + UB(1:1) = ubound(SrcInputData%MsrPositionsX) + if (.not. allocated(DstInputData%MsrPositionsX)) then + allocate(DstInputData%MsrPositionsX(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PitManRat.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%MsrPositionsX.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%PitManRat = SrcParamData%PitManRat + DstInputData%MsrPositionsX = SrcInputData%MsrPositionsX end if - DstParamData%YawManRat = SrcParamData%YawManRat - DstParamData%NacYawF = SrcParamData%NacYawF - DstParamData%SpdGenOn = SrcParamData%SpdGenOn - DstParamData%THSSBrDp = SrcParamData%THSSBrDp - DstParamData%THSSBrFl = SrcParamData%THSSBrFl - DstParamData%TimGenOf = SrcParamData%TimGenOf - DstParamData%TimGenOn = SrcParamData%TimGenOn - DstParamData%TPCOn = SrcParamData%TPCOn - if (allocated(SrcParamData%TPitManS)) then - LB(1:1) = lbound(SrcParamData%TPitManS) - UB(1:1) = ubound(SrcParamData%TPitManS) - if (.not. allocated(DstParamData%TPitManS)) then - allocate(DstParamData%TPitManS(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInputData%MsrPositionsY)) then + LB(1:1) = lbound(SrcInputData%MsrPositionsY) + UB(1:1) = ubound(SrcInputData%MsrPositionsY) + if (.not. allocated(DstInputData%MsrPositionsY)) then + allocate(DstInputData%MsrPositionsY(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TPitManS.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%MsrPositionsY.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%TPitManS = SrcParamData%TPitManS + DstInputData%MsrPositionsY = SrcInputData%MsrPositionsY end if - DstParamData%TYawManS = SrcParamData%TYawManS - DstParamData%TYCOn = SrcParamData%TYCOn - DstParamData%VS_RtGnSp = SrcParamData%VS_RtGnSp - DstParamData%VS_RtTq = SrcParamData%VS_RtTq - DstParamData%VS_Slope = SrcParamData%VS_Slope - DstParamData%VS_SlPc = SrcParamData%VS_SlPc - DstParamData%VS_SySp = SrcParamData%VS_SySp - DstParamData%VS_TrGnSp = SrcParamData%VS_TrGnSp - DstParamData%YawPosCom = SrcParamData%YawPosCom - DstParamData%YawRateCom = SrcParamData%YawRateCom - DstParamData%GenModel = SrcParamData%GenModel - DstParamData%HSSBrMode = SrcParamData%HSSBrMode - DstParamData%PCMode = SrcParamData%PCMode - DstParamData%VSContrl = SrcParamData%VSContrl - DstParamData%YCMode = SrcParamData%YCMode - DstParamData%GenTiStp = SrcParamData%GenTiStp - DstParamData%GenTiStr = SrcParamData%GenTiStr - DstParamData%VS_Rgn2K = SrcParamData%VS_Rgn2K - DstParamData%YawNeut = SrcParamData%YawNeut - DstParamData%YawSpr = SrcParamData%YawSpr - DstParamData%YawDamp = SrcParamData%YawDamp - DstParamData%TpBrDT = SrcParamData%TpBrDT - if (allocated(SrcParamData%TBDepISp)) then - LB(1:1) = lbound(SrcParamData%TBDepISp) - UB(1:1) = ubound(SrcParamData%TBDepISp) - if (.not. allocated(DstParamData%TBDepISp)) then - allocate(DstParamData%TBDepISp(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcInputData%MsrPositionsZ)) then + LB(1:1) = lbound(SrcInputData%MsrPositionsZ) + UB(1:1) = ubound(SrcInputData%MsrPositionsZ) + if (.not. allocated(DstInputData%MsrPositionsZ)) then + allocate(DstInputData%MsrPositionsZ(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TBDepISp.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%MsrPositionsZ.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%TBDepISp = SrcParamData%TBDepISp + DstInputData%MsrPositionsZ = SrcInputData%MsrPositionsZ end if - DstParamData%TBDrConN = SrcParamData%TBDrConN - DstParamData%TBDrConD = SrcParamData%TBDrConD - DstParamData%NumBl = SrcParamData%NumBl - DstParamData%NumBStC = SrcParamData%NumBStC - DstParamData%NumNStC = SrcParamData%NumNStC - DstParamData%NumTStC = SrcParamData%NumTStC - DstParamData%NumSStC = SrcParamData%NumSStC - DstParamData%AfCmode = SrcParamData%AfCmode - DstParamData%AfC_Mean = SrcParamData%AfC_Mean - DstParamData%AfC_Amp = SrcParamData%AfC_Amp - DstParamData%AfC_Phase = SrcParamData%AfC_Phase - DstParamData%CCmode = SrcParamData%CCmode - DstParamData%StCCmode = SrcParamData%StCCmode - DstParamData%NumOuts = SrcParamData%NumOuts - DstParamData%NumOuts_DLL = SrcParamData%NumOuts_DLL - DstParamData%RootName = SrcParamData%RootName - DstParamData%PriPath = SrcParamData%PriPath - if (allocated(SrcParamData%OutParam)) then - LB(1:1) = lbound(SrcParamData%OutParam) - UB(1:1) = ubound(SrcParamData%OutParam) - if (.not. allocated(DstParamData%OutParam)) then - allocate(DstParamData%OutParam(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call NWTC_Library_CopyOutParmType(SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - DstParamData%Delim = SrcParamData%Delim - DstParamData%UseBladedInterface = SrcParamData%UseBladedInterface - DstParamData%UseLegacyInterface = SrcParamData%UseLegacyInterface - DstParamData%DLL_Trgt = SrcParamData%DLL_Trgt - DstParamData%DLL_Ramp = SrcParamData%DLL_Ramp - DstParamData%BlAlpha = SrcParamData%BlAlpha - DstParamData%DLL_n = SrcParamData%DLL_n - DstParamData%avcOUTNAME_LEN = SrcParamData%avcOUTNAME_LEN - DstParamData%NacYaw_North = SrcParamData%NacYaw_North - DstParamData%AvgWindSpeed = SrcParamData%AvgWindSpeed - DstParamData%AirDens = SrcParamData%AirDens - DstParamData%TrimCase = SrcParamData%TrimCase - DstParamData%TrimGain = SrcParamData%TrimGain - DstParamData%RotSpeedRef = SrcParamData%RotSpeedRef - if (allocated(SrcParamData%BStC)) then - LB(1:1) = lbound(SrcParamData%BStC) - UB(1:1) = ubound(SrcParamData%BStC) - if (.not. allocated(DstParamData%BStC)) then - allocate(DstParamData%BStC(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%BStC.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call StC_CopyParam(SrcParamData%BStC(i1), DstParamData%BStC(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcParamData%NStC)) then - LB(1:1) = lbound(SrcParamData%NStC) - UB(1:1) = ubound(SrcParamData%NStC) - if (.not. allocated(DstParamData%NStC)) then - allocate(DstParamData%NStC(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NStC.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call StC_CopyParam(SrcParamData%NStC(i1), DstParamData%NStC(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcParamData%TStC)) then - LB(1:1) = lbound(SrcParamData%TStC) - UB(1:1) = ubound(SrcParamData%TStC) - if (.not. allocated(DstParamData%TStC)) then - allocate(DstParamData%TStC(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TStC.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call StC_CopyParam(SrcParamData%TStC(i1), DstParamData%TStC(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - if (allocated(SrcParamData%SStC)) then - LB(1:1) = lbound(SrcParamData%SStC) - UB(1:1) = ubound(SrcParamData%SStC) - if (.not. allocated(DstParamData%SStC)) then - allocate(DstParamData%SStC(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%SStC.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - do i1 = LB(1), UB(1) - call StC_CopyParam(SrcParamData%SStC(i1), DstParamData%SStC(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do - end if - DstParamData%InterpOrder = SrcParamData%InterpOrder - DstParamData%EXavrSWAP = SrcParamData%EXavrSWAP - DstParamData%NumCableControl = SrcParamData%NumCableControl - DstParamData%NumStC_Control = SrcParamData%NumStC_Control - if (allocated(SrcParamData%StCMeasNumPerChan)) then - LB(1:1) = lbound(SrcParamData%StCMeasNumPerChan) - UB(1:1) = ubound(SrcParamData%StCMeasNumPerChan) - if (.not. allocated(DstParamData%StCMeasNumPerChan)) then - allocate(DstParamData%StCMeasNumPerChan(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%StCMeasNumPerChan.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%StCMeasNumPerChan = SrcParamData%StCMeasNumPerChan - end if - if (allocated(SrcParamData%Jac_u_indx)) then - LB(1:2) = lbound(SrcParamData%Jac_u_indx) - UB(1:2) = ubound(SrcParamData%Jac_u_indx) - if (.not. allocated(DstParamData%Jac_u_indx)) then - allocate(DstParamData%Jac_u_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_u_indx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_u_indx = SrcParamData%Jac_u_indx - end if - if (allocated(SrcParamData%Jac_x_indx)) then - LB(1:2) = lbound(SrcParamData%Jac_x_indx) - UB(1:2) = ubound(SrcParamData%Jac_x_indx) - if (.not. allocated(DstParamData%Jac_x_indx)) then - allocate(DstParamData%Jac_x_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_x_indx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_x_indx = SrcParamData%Jac_x_indx - end if - if (allocated(SrcParamData%du)) then - LB(1:1) = lbound(SrcParamData%du) - UB(1:1) = ubound(SrcParamData%du) - if (.not. allocated(DstParamData%du)) then - allocate(DstParamData%du(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%du.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%du = SrcParamData%du - end if - if (allocated(SrcParamData%dx)) then - LB(1:1) = lbound(SrcParamData%dx) - UB(1:1) = ubound(SrcParamData%dx) - if (.not. allocated(DstParamData%dx)) then - allocate(DstParamData%dx(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%dx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%dx = SrcParamData%dx - end if - DstParamData%Jac_nu = SrcParamData%Jac_nu - DstParamData%Jac_ny = SrcParamData%Jac_ny - DstParamData%Jac_nx = SrcParamData%Jac_nx - if (allocated(SrcParamData%Jac_Idx_BStC_u)) then - LB(1:3) = lbound(SrcParamData%Jac_Idx_BStC_u) - UB(1:3) = ubound(SrcParamData%Jac_Idx_BStC_u) - if (.not. allocated(DstParamData%Jac_Idx_BStC_u)) then - allocate(DstParamData%Jac_Idx_BStC_u(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_BStC_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_BStC_u = SrcParamData%Jac_Idx_BStC_u - end if - if (allocated(SrcParamData%Jac_Idx_NStC_u)) then - LB(1:2) = lbound(SrcParamData%Jac_Idx_NStC_u) - UB(1:2) = ubound(SrcParamData%Jac_Idx_NStC_u) - if (.not. allocated(DstParamData%Jac_Idx_NStC_u)) then - allocate(DstParamData%Jac_Idx_NStC_u(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_NStC_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_NStC_u = SrcParamData%Jac_Idx_NStC_u - end if - if (allocated(SrcParamData%Jac_Idx_TStC_u)) then - LB(1:2) = lbound(SrcParamData%Jac_Idx_TStC_u) - UB(1:2) = ubound(SrcParamData%Jac_Idx_TStC_u) - if (.not. allocated(DstParamData%Jac_Idx_TStC_u)) then - allocate(DstParamData%Jac_Idx_TStC_u(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_TStC_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_TStC_u = SrcParamData%Jac_Idx_TStC_u - end if - if (allocated(SrcParamData%Jac_Idx_SStC_u)) then - LB(1:2) = lbound(SrcParamData%Jac_Idx_SStC_u) - UB(1:2) = ubound(SrcParamData%Jac_Idx_SStC_u) - if (.not. allocated(DstParamData%Jac_Idx_SStC_u)) then - allocate(DstParamData%Jac_Idx_SStC_u(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_SStC_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_SStC_u = SrcParamData%Jac_Idx_SStC_u - end if - if (allocated(SrcParamData%Jac_Idx_BStC_x)) then - LB(1:3) = lbound(SrcParamData%Jac_Idx_BStC_x) - UB(1:3) = ubound(SrcParamData%Jac_Idx_BStC_x) - if (.not. allocated(DstParamData%Jac_Idx_BStC_x)) then - allocate(DstParamData%Jac_Idx_BStC_x(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_BStC_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_BStC_x = SrcParamData%Jac_Idx_BStC_x - end if - if (allocated(SrcParamData%Jac_Idx_NStC_x)) then - LB(1:2) = lbound(SrcParamData%Jac_Idx_NStC_x) - UB(1:2) = ubound(SrcParamData%Jac_Idx_NStC_x) - if (.not. allocated(DstParamData%Jac_Idx_NStC_x)) then - allocate(DstParamData%Jac_Idx_NStC_x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_NStC_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_NStC_x = SrcParamData%Jac_Idx_NStC_x - end if - if (allocated(SrcParamData%Jac_Idx_TStC_x)) then - LB(1:2) = lbound(SrcParamData%Jac_Idx_TStC_x) - UB(1:2) = ubound(SrcParamData%Jac_Idx_TStC_x) - if (.not. allocated(DstParamData%Jac_Idx_TStC_x)) then - allocate(DstParamData%Jac_Idx_TStC_x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_TStC_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_TStC_x = SrcParamData%Jac_Idx_TStC_x - end if - if (allocated(SrcParamData%Jac_Idx_SStC_x)) then - LB(1:2) = lbound(SrcParamData%Jac_Idx_SStC_x) - UB(1:2) = ubound(SrcParamData%Jac_Idx_SStC_x) - if (.not. allocated(DstParamData%Jac_Idx_SStC_x)) then - allocate(DstParamData%Jac_Idx_SStC_x(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_SStC_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_SStC_x = SrcParamData%Jac_Idx_SStC_x - end if - if (allocated(SrcParamData%Jac_Idx_BStC_y)) then - LB(1:3) = lbound(SrcParamData%Jac_Idx_BStC_y) - UB(1:3) = ubound(SrcParamData%Jac_Idx_BStC_y) - if (.not. allocated(DstParamData%Jac_Idx_BStC_y)) then - allocate(DstParamData%Jac_Idx_BStC_y(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_BStC_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_BStC_y = SrcParamData%Jac_Idx_BStC_y - end if - if (allocated(SrcParamData%Jac_Idx_NStC_y)) then - LB(1:2) = lbound(SrcParamData%Jac_Idx_NStC_y) - UB(1:2) = ubound(SrcParamData%Jac_Idx_NStC_y) - if (.not. allocated(DstParamData%Jac_Idx_NStC_y)) then - allocate(DstParamData%Jac_Idx_NStC_y(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_NStC_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_NStC_y = SrcParamData%Jac_Idx_NStC_y - end if - if (allocated(SrcParamData%Jac_Idx_TStC_y)) then - LB(1:2) = lbound(SrcParamData%Jac_Idx_TStC_y) - UB(1:2) = ubound(SrcParamData%Jac_Idx_TStC_y) - if (.not. allocated(DstParamData%Jac_Idx_TStC_y)) then - allocate(DstParamData%Jac_Idx_TStC_y(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_TStC_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_TStC_y = SrcParamData%Jac_Idx_TStC_y - end if - if (allocated(SrcParamData%Jac_Idx_SStC_y)) then - LB(1:2) = lbound(SrcParamData%Jac_Idx_SStC_y) - UB(1:2) = ubound(SrcParamData%Jac_Idx_SStC_y) - if (.not. allocated(DstParamData%Jac_Idx_SStC_y)) then - allocate(DstParamData%Jac_Idx_SStC_y(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_Idx_SStC_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_Idx_SStC_y = SrcParamData%Jac_Idx_SStC_y - end if - DstParamData%SensorType = SrcParamData%SensorType - DstParamData%NumBeam = SrcParamData%NumBeam - DstParamData%NumPulseGate = SrcParamData%NumPulseGate end subroutine -subroutine SrvD_DestroyParam(ParamData, ErrStat, ErrMsg) - type(SrvD_ParameterType), intent(inout) :: ParamData +subroutine SrvD_DestroyInput(InputData, ErrStat, ErrMsg) + type(SrvD_InputType), intent(inout) :: InputData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SrvD_DestroyParam' + character(*), parameter :: RoutineName = 'SrvD_DestroyInput' ErrStat = ErrID_None ErrMsg = '' - if (allocated(ParamData%BlPitchInit)) then - deallocate(ParamData%BlPitchInit) + if (allocated(InputData%BlPitch)) then + deallocate(InputData%BlPitch) end if - if (allocated(ParamData%BlPitchF)) then - deallocate(ParamData%BlPitchF) + if (allocated(InputData%BlPRate)) then + deallocate(InputData%BlPRate) end if - if (allocated(ParamData%PitManRat)) then - deallocate(ParamData%PitManRat) + if (allocated(InputData%ExternalBlPitchCom)) then + deallocate(InputData%ExternalBlPitchCom) end if - if (allocated(ParamData%TPitManS)) then - deallocate(ParamData%TPitManS) + if (allocated(InputData%ExternalBlAirfoilCom)) then + deallocate(InputData%ExternalBlAirfoilCom) end if - if (allocated(ParamData%TBDepISp)) then - deallocate(ParamData%TBDepISp) + if (allocated(InputData%ExternalCableDeltaL)) then + deallocate(InputData%ExternalCableDeltaL) end if - if (allocated(ParamData%OutParam)) then - LB(1:1) = lbound(ParamData%OutParam) - UB(1:1) = ubound(ParamData%OutParam) - do i1 = LB(1), UB(1) - call NWTC_Library_DestroyOutParmType(ParamData%OutParam(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - end do - deallocate(ParamData%OutParam) + if (allocated(InputData%ExternalCableDeltaLdot)) then + deallocate(InputData%ExternalCableDeltaLdot) end if - call FreeDynamicLib( ParamData%DLL_Trgt, ErrStat2, ErrMsg2) + call MeshDestroy( InputData%PtfmMotionMesh, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(ParamData%BStC)) then - LB(1:1) = lbound(ParamData%BStC) - UB(1:1) = ubound(ParamData%BStC) - do i1 = LB(1), UB(1) - call StC_DestroyParam(ParamData%BStC(i1), ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InputData%BStCMotionMesh)) then + LB(1:2) = lbound(InputData%BStCMotionMesh) + UB(1:2) = ubound(InputData%BStCMotionMesh) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call MeshDestroy( InputData%BStCMotionMesh(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do end do - deallocate(ParamData%BStC) + deallocate(InputData%BStCMotionMesh) end if - if (allocated(ParamData%NStC)) then - LB(1:1) = lbound(ParamData%NStC) - UB(1:1) = ubound(ParamData%NStC) + if (allocated(InputData%NStCMotionMesh)) then + LB(1:1) = lbound(InputData%NStCMotionMesh) + UB(1:1) = ubound(InputData%NStCMotionMesh) do i1 = LB(1), UB(1) - call StC_DestroyParam(ParamData%NStC(i1), ErrStat2, ErrMsg2) + call MeshDestroy( InputData%NStCMotionMesh(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ParamData%NStC) + deallocate(InputData%NStCMotionMesh) end if - if (allocated(ParamData%TStC)) then - LB(1:1) = lbound(ParamData%TStC) - UB(1:1) = ubound(ParamData%TStC) + if (allocated(InputData%TStCMotionMesh)) then + LB(1:1) = lbound(InputData%TStCMotionMesh) + UB(1:1) = ubound(InputData%TStCMotionMesh) do i1 = LB(1), UB(1) - call StC_DestroyParam(ParamData%TStC(i1), ErrStat2, ErrMsg2) + call MeshDestroy( InputData%TStCMotionMesh(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ParamData%TStC) + deallocate(InputData%TStCMotionMesh) end if - if (allocated(ParamData%SStC)) then - LB(1:1) = lbound(ParamData%SStC) - UB(1:1) = ubound(ParamData%SStC) + if (allocated(InputData%SStCMotionMesh)) then + LB(1:1) = lbound(InputData%SStCMotionMesh) + UB(1:1) = ubound(InputData%SStCMotionMesh) do i1 = LB(1), UB(1) - call StC_DestroyParam(ParamData%SStC(i1), ErrStat2, ErrMsg2) + call MeshDestroy( InputData%SStCMotionMesh(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(ParamData%SStC) - end if - if (allocated(ParamData%StCMeasNumPerChan)) then - deallocate(ParamData%StCMeasNumPerChan) - end if - if (allocated(ParamData%Jac_u_indx)) then - deallocate(ParamData%Jac_u_indx) - end if - if (allocated(ParamData%Jac_x_indx)) then - deallocate(ParamData%Jac_x_indx) - end if - if (allocated(ParamData%du)) then - deallocate(ParamData%du) - end if - if (allocated(ParamData%dx)) then - deallocate(ParamData%dx) - end if - if (allocated(ParamData%Jac_Idx_BStC_u)) then - deallocate(ParamData%Jac_Idx_BStC_u) - end if - if (allocated(ParamData%Jac_Idx_NStC_u)) then - deallocate(ParamData%Jac_Idx_NStC_u) - end if - if (allocated(ParamData%Jac_Idx_TStC_u)) then - deallocate(ParamData%Jac_Idx_TStC_u) - end if - if (allocated(ParamData%Jac_Idx_SStC_u)) then - deallocate(ParamData%Jac_Idx_SStC_u) - end if - if (allocated(ParamData%Jac_Idx_BStC_x)) then - deallocate(ParamData%Jac_Idx_BStC_x) - end if - if (allocated(ParamData%Jac_Idx_NStC_x)) then - deallocate(ParamData%Jac_Idx_NStC_x) - end if - if (allocated(ParamData%Jac_Idx_TStC_x)) then - deallocate(ParamData%Jac_Idx_TStC_x) - end if - if (allocated(ParamData%Jac_Idx_SStC_x)) then - deallocate(ParamData%Jac_Idx_SStC_x) + deallocate(InputData%SStCMotionMesh) end if - if (allocated(ParamData%Jac_Idx_BStC_y)) then - deallocate(ParamData%Jac_Idx_BStC_y) + if (allocated(InputData%LidSpeed)) then + deallocate(InputData%LidSpeed) end if - if (allocated(ParamData%Jac_Idx_NStC_y)) then - deallocate(ParamData%Jac_Idx_NStC_y) + if (allocated(InputData%MsrPositionsX)) then + deallocate(InputData%MsrPositionsX) end if - if (allocated(ParamData%Jac_Idx_TStC_y)) then - deallocate(ParamData%Jac_Idx_TStC_y) + if (allocated(InputData%MsrPositionsY)) then + deallocate(InputData%MsrPositionsY) end if - if (allocated(ParamData%Jac_Idx_SStC_y)) then - deallocate(ParamData%Jac_Idx_SStC_y) + if (allocated(InputData%MsrPositionsZ)) then + deallocate(InputData%MsrPositionsZ) end if end subroutine -subroutine SrvD_PackParam(RF, Indata) +subroutine SrvD_PackInput(RF, Indata) type(RegFile), intent(inout) :: RF - type(SrvD_ParameterType), intent(in) :: InData - character(*), parameter :: RoutineName = 'SrvD_PackParam' - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + type(SrvD_InputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SrvD_PackInput' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return - call RegPack(RF, InData%DT) - call RegPack(RF, InData%HSSBrDT) - call RegPack(RF, InData%HSSBrTqF) - call RegPack(RF, InData%SIG_POSl) - call RegPack(RF, InData%SIG_POTq) - call RegPack(RF, InData%SIG_SlPc) - call RegPack(RF, InData%SIG_Slop) - call RegPack(RF, InData%SIG_SySp) - call RegPack(RF, InData%TEC_A0) - call RegPack(RF, InData%TEC_C0) - call RegPack(RF, InData%TEC_C1) - call RegPack(RF, InData%TEC_C2) - call RegPack(RF, InData%TEC_K2) - call RegPack(RF, InData%TEC_MR) - call RegPack(RF, InData%TEC_Re1) - call RegPack(RF, InData%TEC_RLR) - call RegPack(RF, InData%TEC_RRes) - call RegPack(RF, InData%TEC_SRes) - call RegPack(RF, InData%TEC_SySp) - call RegPack(RF, InData%TEC_V1a) - call RegPack(RF, InData%TEC_VLL) - call RegPack(RF, InData%TEC_Xe1) - call RegPack(RF, InData%GenEff) - call RegPackAlloc(RF, InData%BlPitchInit) - call RegPackAlloc(RF, InData%BlPitchF) - call RegPackAlloc(RF, InData%PitManRat) - call RegPack(RF, InData%YawManRat) - call RegPack(RF, InData%NacYawF) - call RegPack(RF, InData%SpdGenOn) - call RegPack(RF, InData%THSSBrDp) - call RegPack(RF, InData%THSSBrFl) - call RegPack(RF, InData%TimGenOf) - call RegPack(RF, InData%TimGenOn) - call RegPack(RF, InData%TPCOn) - call RegPackAlloc(RF, InData%TPitManS) - call RegPack(RF, InData%TYawManS) - call RegPack(RF, InData%TYCOn) - call RegPack(RF, InData%VS_RtGnSp) - call RegPack(RF, InData%VS_RtTq) - call RegPack(RF, InData%VS_Slope) - call RegPack(RF, InData%VS_SlPc) - call RegPack(RF, InData%VS_SySp) - call RegPack(RF, InData%VS_TrGnSp) - call RegPack(RF, InData%YawPosCom) - call RegPack(RF, InData%YawRateCom) - call RegPack(RF, InData%GenModel) - call RegPack(RF, InData%HSSBrMode) - call RegPack(RF, InData%PCMode) - call RegPack(RF, InData%VSContrl) - call RegPack(RF, InData%YCMode) - call RegPack(RF, InData%GenTiStp) - call RegPack(RF, InData%GenTiStr) - call RegPack(RF, InData%VS_Rgn2K) - call RegPack(RF, InData%YawNeut) - call RegPack(RF, InData%YawSpr) - call RegPack(RF, InData%YawDamp) - call RegPack(RF, InData%TpBrDT) - call RegPackAlloc(RF, InData%TBDepISp) - call RegPack(RF, InData%TBDrConN) - call RegPack(RF, InData%TBDrConD) - call RegPack(RF, InData%NumBl) - call RegPack(RF, InData%NumBStC) - call RegPack(RF, InData%NumNStC) - call RegPack(RF, InData%NumTStC) - call RegPack(RF, InData%NumSStC) - call RegPack(RF, InData%AfCmode) - call RegPack(RF, InData%AfC_Mean) - call RegPack(RF, InData%AfC_Amp) - call RegPack(RF, InData%AfC_Phase) - call RegPack(RF, InData%CCmode) - call RegPack(RF, InData%StCCmode) - call RegPack(RF, InData%NumOuts) - call RegPack(RF, InData%NumOuts_DLL) - call RegPack(RF, InData%RootName) - call RegPack(RF, InData%PriPath) - call RegPack(RF, allocated(InData%OutParam)) - if (allocated(InData%OutParam)) then - call RegPackBounds(RF, 1, lbound(InData%OutParam), ubound(InData%OutParam)) - LB(1:1) = lbound(InData%OutParam) - UB(1:1) = ubound(InData%OutParam) - do i1 = LB(1), UB(1) - call NWTC_Library_PackOutParmType(RF, InData%OutParam(i1)) - end do - end if - call RegPack(RF, InData%Delim) - call RegPack(RF, InData%UseBladedInterface) - call RegPack(RF, InData%UseLegacyInterface) - call DLLTypePack(RF, InData%DLL_Trgt) - call RegPack(RF, InData%DLL_Ramp) - call RegPack(RF, InData%BlAlpha) - call RegPack(RF, InData%DLL_n) - call RegPack(RF, InData%avcOUTNAME_LEN) - call RegPack(RF, InData%NacYaw_North) - call RegPack(RF, InData%AvgWindSpeed) - call RegPack(RF, InData%AirDens) - call RegPack(RF, InData%TrimCase) - call RegPack(RF, InData%TrimGain) - call RegPack(RF, InData%RotSpeedRef) - call RegPack(RF, allocated(InData%BStC)) - if (allocated(InData%BStC)) then - call RegPackBounds(RF, 1, lbound(InData%BStC), ubound(InData%BStC)) - LB(1:1) = lbound(InData%BStC) - UB(1:1) = ubound(InData%BStC) - do i1 = LB(1), UB(1) - call StC_PackParam(RF, InData%BStC(i1)) + call RegPackAlloc(RF, InData%BlPitch) + call RegPackAlloc(RF, InData%BlPRate) + call RegPack(RF, InData%Yaw) + call RegPack(RF, InData%YawRate) + call RegPack(RF, InData%LSS_Spd) + call RegPack(RF, InData%HSS_Spd) + call RegPack(RF, InData%RotSpeed) + call RegPack(RF, InData%ExternalYawPosCom) + call RegPack(RF, InData%ExternalYawRateCom) + call RegPackAlloc(RF, InData%ExternalBlPitchCom) + call RegPack(RF, InData%ExternalGenTrq) + call RegPack(RF, InData%ExternalElecPwr) + call RegPack(RF, InData%ExternalHSSBrFrac) + call RegPackAlloc(RF, InData%ExternalBlAirfoilCom) + call RegPackAlloc(RF, InData%ExternalCableDeltaL) + call RegPackAlloc(RF, InData%ExternalCableDeltaLdot) + call RegPack(RF, InData%TwrAccel) + call RegPack(RF, InData%YawErr) + call RegPack(RF, InData%WindDir) + call RegPack(RF, InData%RootMyc) + call RegPack(RF, InData%YawBrTAxp) + call RegPack(RF, InData%YawBrTAyp) + call RegPack(RF, InData%LSSTipPxa) + call RegPack(RF, InData%RootMxc) + call RegPack(RF, InData%LSSTipMxa) + call RegPack(RF, InData%LSSTipMya) + call RegPack(RF, InData%LSSTipMza) + call RegPack(RF, InData%LSSTipMys) + call RegPack(RF, InData%LSSTipMzs) + call RegPack(RF, InData%YawBrMyn) + call RegPack(RF, InData%YawBrMzn) + call RegPack(RF, InData%NcIMURAxs) + call RegPack(RF, InData%NcIMURAys) + call RegPack(RF, InData%NcIMURAzs) + call RegPack(RF, InData%RotPwr) + call RegPack(RF, InData%HorWindV) + call RegPack(RF, InData%YawAngle) + call RegPack(RF, InData%LSShftFxa) + call RegPack(RF, InData%LSShftFys) + call RegPack(RF, InData%LSShftFzs) + call MeshPack(RF, InData%PtfmMotionMesh) + call RegPack(RF, allocated(InData%BStCMotionMesh)) + if (allocated(InData%BStCMotionMesh)) then + call RegPackBounds(RF, 2, lbound(InData%BStCMotionMesh), ubound(InData%BStCMotionMesh)) + LB(1:2) = lbound(InData%BStCMotionMesh) + UB(1:2) = ubound(InData%BStCMotionMesh) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%BStCMotionMesh(i1,i2)) + end do end do end if - call RegPack(RF, allocated(InData%NStC)) - if (allocated(InData%NStC)) then - call RegPackBounds(RF, 1, lbound(InData%NStC), ubound(InData%NStC)) - LB(1:1) = lbound(InData%NStC) - UB(1:1) = ubound(InData%NStC) + call RegPack(RF, allocated(InData%NStCMotionMesh)) + if (allocated(InData%NStCMotionMesh)) then + call RegPackBounds(RF, 1, lbound(InData%NStCMotionMesh), ubound(InData%NStCMotionMesh)) + LB(1:1) = lbound(InData%NStCMotionMesh) + UB(1:1) = ubound(InData%NStCMotionMesh) do i1 = LB(1), UB(1) - call StC_PackParam(RF, InData%NStC(i1)) + call MeshPack(RF, InData%NStCMotionMesh(i1)) end do end if - call RegPack(RF, allocated(InData%TStC)) - if (allocated(InData%TStC)) then - call RegPackBounds(RF, 1, lbound(InData%TStC), ubound(InData%TStC)) - LB(1:1) = lbound(InData%TStC) - UB(1:1) = ubound(InData%TStC) + call RegPack(RF, allocated(InData%TStCMotionMesh)) + if (allocated(InData%TStCMotionMesh)) then + call RegPackBounds(RF, 1, lbound(InData%TStCMotionMesh), ubound(InData%TStCMotionMesh)) + LB(1:1) = lbound(InData%TStCMotionMesh) + UB(1:1) = ubound(InData%TStCMotionMesh) do i1 = LB(1), UB(1) - call StC_PackParam(RF, InData%TStC(i1)) + call MeshPack(RF, InData%TStCMotionMesh(i1)) end do end if - call RegPack(RF, allocated(InData%SStC)) - if (allocated(InData%SStC)) then - call RegPackBounds(RF, 1, lbound(InData%SStC), ubound(InData%SStC)) - LB(1:1) = lbound(InData%SStC) - UB(1:1) = ubound(InData%SStC) + call RegPack(RF, allocated(InData%SStCMotionMesh)) + if (allocated(InData%SStCMotionMesh)) then + call RegPackBounds(RF, 1, lbound(InData%SStCMotionMesh), ubound(InData%SStCMotionMesh)) + LB(1:1) = lbound(InData%SStCMotionMesh) + UB(1:1) = ubound(InData%SStCMotionMesh) do i1 = LB(1), UB(1) - call StC_PackParam(RF, InData%SStC(i1)) + call MeshPack(RF, InData%SStCMotionMesh(i1)) end do end if - call RegPack(RF, InData%InterpOrder) - call RegPack(RF, InData%EXavrSWAP) - call RegPack(RF, InData%NumCableControl) - call RegPack(RF, InData%NumStC_Control) - call RegPackAlloc(RF, InData%StCMeasNumPerChan) - call RegPackAlloc(RF, InData%Jac_u_indx) - call RegPackAlloc(RF, InData%Jac_x_indx) - call RegPackAlloc(RF, InData%du) - call RegPackAlloc(RF, InData%dx) - call RegPack(RF, InData%Jac_nu) - call RegPack(RF, InData%Jac_ny) - call RegPack(RF, InData%Jac_nx) - call RegPackAlloc(RF, InData%Jac_Idx_BStC_u) - call RegPackAlloc(RF, InData%Jac_Idx_NStC_u) - call RegPackAlloc(RF, InData%Jac_Idx_TStC_u) - call RegPackAlloc(RF, InData%Jac_Idx_SStC_u) - call RegPackAlloc(RF, InData%Jac_Idx_BStC_x) - call RegPackAlloc(RF, InData%Jac_Idx_NStC_x) - call RegPackAlloc(RF, InData%Jac_Idx_TStC_x) - call RegPackAlloc(RF, InData%Jac_Idx_SStC_x) - call RegPackAlloc(RF, InData%Jac_Idx_BStC_y) - call RegPackAlloc(RF, InData%Jac_Idx_NStC_y) - call RegPackAlloc(RF, InData%Jac_Idx_TStC_y) - call RegPackAlloc(RF, InData%Jac_Idx_SStC_y) - call RegPack(RF, InData%SensorType) - call RegPack(RF, InData%NumBeam) - call RegPack(RF, InData%NumPulseGate) + call RegPackAlloc(RF, InData%LidSpeed) + call RegPackAlloc(RF, InData%MsrPositionsX) + call RegPackAlloc(RF, InData%MsrPositionsY) + call RegPackAlloc(RF, InData%MsrPositionsZ) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine SrvD_UnPackParam(RF, OutData) +subroutine SrvD_UnPackInput(RF, OutData) type(RegFile), intent(inout) :: RF - type(SrvD_ParameterType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SrvD_UnPackParam' - integer(B4Ki) :: i1, i2, i3 - integer(B4Ki) :: LB(3), UB(3) + type(SrvD_InputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SrvD_UnPackInput' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HSSBrDT); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HSSBrTqF); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SIG_POSl); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SIG_POTq); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SIG_SlPc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SIG_Slop); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SIG_SySp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_A0); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_C0); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_C1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_C2); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_K2); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_MR); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_Re1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_RLR); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_RRes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_SRes); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_SySp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_V1a); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_VLL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TEC_Xe1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%GenEff); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlPitchInit); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlPitchF); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%PitManRat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawManRat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NacYawF); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SpdGenOn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%THSSBrDp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%THSSBrFl); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TimGenOf); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TimGenOn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TPCOn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TPitManS); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TYawManS); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TYCOn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VS_RtGnSp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VS_RtTq); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VS_Slope); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VS_SlPc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VS_SySp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VS_TrGnSp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawPosCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawRateCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%GenModel); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HSSBrMode); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%PCMode); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VSContrl); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YCMode); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%GenTiStp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%GenTiStr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%VS_Rgn2K); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawNeut); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawSpr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawDamp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TpBrDT); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TBDepISp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TBDrConN); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TBDrConD); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumBl); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumBStC); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumNStC); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumTStC); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumSStC); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AfCmode); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AfC_Mean); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AfC_Amp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AfC_Phase); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%CCmode); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%StCCmode); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumOuts_DLL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%PriPath); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%OutParam)) deallocate(OutData%OutParam) - call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return - if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%OutParam(LB(1):UB(1)),stat=stat) - if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', RF%ErrStat, RF%ErrMsg, RoutineName) - return - end if - do i1 = LB(1), UB(1) - call NWTC_Library_UnpackOutParmType(RF, OutData%OutParam(i1)) ! OutParam - end do - end if - call RegUnpack(RF, OutData%Delim); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UseBladedInterface); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%UseLegacyInterface); if (RegCheckErr(RF, RoutineName)) return - call DLLTypeUnpack(RF, OutData%DLL_Trgt) ! DLL_Trgt - call RegUnpack(RF, OutData%DLL_Ramp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%BlAlpha); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%DLL_n); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%avcOUTNAME_LEN); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NacYaw_North); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AvgWindSpeed); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TrimCase); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TrimGain); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RotSpeedRef); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%BStC)) deallocate(OutData%BStC) + call RegUnpackAlloc(RF, OutData%BlPitch); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPRate); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Yaw); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawRate); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSS_Spd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HSS_Spd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ExternalYawPosCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ExternalYawRateCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%ExternalBlPitchCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ExternalGenTrq); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ExternalElecPwr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ExternalHSSBrFrac); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%ExternalBlAirfoilCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%ExternalCableDeltaL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%ExternalCableDeltaLdot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TwrAccel); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawErr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WindDir); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootMyc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawBrTAxp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawBrTAyp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipPxa); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootMxc); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMxa); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMya); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMza); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMys); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSSTipMzs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawBrMyn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawBrMzn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NcIMURAxs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NcIMURAys); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NcIMURAzs); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotPwr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HorWindV); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawAngle); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSShftFxa); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSShftFys); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LSShftFzs); if (RegCheckErr(RF, RoutineName)) return + call MeshUnpack(RF, OutData%PtfmMotionMesh) ! PtfmMotionMesh + if (allocated(OutData%BStCMotionMesh)) deallocate(OutData%BStCMotionMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then - call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BStC(LB(1):UB(1)),stat=stat) + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BStCMotionMesh(LB(1):UB(1),LB(2):UB(2)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BStCMotionMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if - do i1 = LB(1), UB(1) - call StC_UnpackParam(RF, OutData%BStC(i1)) ! BStC + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%BStCMotionMesh(i1,i2)) ! BStCMotionMesh + end do end do end if - if (allocated(OutData%NStC)) deallocate(OutData%NStC) + if (allocated(OutData%NStCMotionMesh)) deallocate(OutData%NStCMotionMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%NStC(LB(1):UB(1)),stat=stat) + allocate(OutData%NStCMotionMesh(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%NStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%NStCMotionMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call StC_UnpackParam(RF, OutData%NStC(i1)) ! NStC + call MeshUnpack(RF, OutData%NStCMotionMesh(i1)) ! NStCMotionMesh end do end if - if (allocated(OutData%TStC)) deallocate(OutData%TStC) + if (allocated(OutData%TStCMotionMesh)) deallocate(OutData%TStCMotionMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%TStC(LB(1):UB(1)),stat=stat) + allocate(OutData%TStCMotionMesh(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%TStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%TStCMotionMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call StC_UnpackParam(RF, OutData%TStC(i1)) ! TStC + call MeshUnpack(RF, OutData%TStCMotionMesh(i1)) ! TStCMotionMesh end do end if - if (allocated(OutData%SStC)) deallocate(OutData%SStC) + if (allocated(OutData%SStCMotionMesh)) deallocate(OutData%SStCMotionMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%SStC(LB(1):UB(1)),stat=stat) + allocate(OutData%SStCMotionMesh(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SStCMotionMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call StC_UnpackParam(RF, OutData%SStC(i1)) ! SStC + call MeshUnpack(RF, OutData%SStCMotionMesh(i1)) ! SStCMotionMesh end do end if - call RegUnpack(RF, OutData%InterpOrder); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%EXavrSWAP); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumCableControl); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumStC_Control); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%StCMeasNumPerChan); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_u_indx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_x_indx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%dx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_nu); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_nx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_BStC_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_NStC_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_TStC_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_SStC_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_BStC_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_NStC_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_TStC_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_SStC_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_BStC_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_NStC_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_TStC_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_Idx_SStC_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%SensorType); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumBeam); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumPulseGate); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%LidSpeed); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%MsrPositionsX); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%MsrPositionsY); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%MsrPositionsZ); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine SrvD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) - type(SrvD_InputType), intent(inout) :: SrcInputData - type(SrvD_InputType), intent(inout) :: DstInputData +subroutine SrvD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) + type(SrvD_OutputType), intent(inout) :: SrcOutputData + type(SrvD_OutputType), intent(inout) :: DstOutputData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -5308,506 +5008,398 @@ subroutine SrvD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SrvD_CopyInput' + character(*), parameter :: RoutineName = 'SrvD_CopyOutput' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcInputData%BlPitch)) then - LB(1:1) = lbound(SrcInputData%BlPitch) - UB(1:1) = ubound(SrcInputData%BlPitch) - if (.not. allocated(DstInputData%BlPitch)) then - allocate(DstInputData%BlPitch(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%WriteOutput)) then + LB(1:1) = lbound(SrcOutputData%WriteOutput) + UB(1:1) = ubound(SrcOutputData%WriteOutput) + if (.not. allocated(DstOutputData%WriteOutput)) then + allocate(DstOutputData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%WriteOutput = SrcOutputData%WriteOutput + end if + if (allocated(SrcOutputData%BlPitchMom)) then + LB(1:1) = lbound(SrcOutputData%BlPitchMom) + UB(1:1) = ubound(SrcOutputData%BlPitchMom) + if (.not. allocated(DstOutputData%BlPitchMom)) then + allocate(DstOutputData%BlPitchMom(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%BlPitch.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BlPitchMom.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInputData%BlPitch = SrcInputData%BlPitch + DstOutputData%BlPitchMom = SrcOutputData%BlPitchMom end if - DstInputData%Yaw = SrcInputData%Yaw - DstInputData%YawRate = SrcInputData%YawRate - DstInputData%LSS_Spd = SrcInputData%LSS_Spd - DstInputData%HSS_Spd = SrcInputData%HSS_Spd - DstInputData%RotSpeed = SrcInputData%RotSpeed - DstInputData%ExternalYawPosCom = SrcInputData%ExternalYawPosCom - DstInputData%ExternalYawRateCom = SrcInputData%ExternalYawRateCom - if (allocated(SrcInputData%ExternalBlPitchCom)) then - LB(1:1) = lbound(SrcInputData%ExternalBlPitchCom) - UB(1:1) = ubound(SrcInputData%ExternalBlPitchCom) - if (.not. allocated(DstInputData%ExternalBlPitchCom)) then - allocate(DstInputData%ExternalBlPitchCom(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%BlPitchCom)) then + LB(1:1) = lbound(SrcOutputData%BlPitchCom) + UB(1:1) = ubound(SrcOutputData%BlPitchCom) + if (.not. allocated(DstOutputData%BlPitchCom)) then + allocate(DstOutputData%BlPitchCom(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%ExternalBlPitchCom.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BlPitchCom.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInputData%ExternalBlPitchCom = SrcInputData%ExternalBlPitchCom + DstOutputData%BlPitchCom = SrcOutputData%BlPitchCom end if - DstInputData%ExternalGenTrq = SrcInputData%ExternalGenTrq - DstInputData%ExternalElecPwr = SrcInputData%ExternalElecPwr - DstInputData%ExternalHSSBrFrac = SrcInputData%ExternalHSSBrFrac - if (allocated(SrcInputData%ExternalBlAirfoilCom)) then - LB(1:1) = lbound(SrcInputData%ExternalBlAirfoilCom) - UB(1:1) = ubound(SrcInputData%ExternalBlAirfoilCom) - if (.not. allocated(DstInputData%ExternalBlAirfoilCom)) then - allocate(DstInputData%ExternalBlAirfoilCom(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%BlPRateCom)) then + LB(1:1) = lbound(SrcOutputData%BlPRateCom) + UB(1:1) = ubound(SrcOutputData%BlPRateCom) + if (.not. allocated(DstOutputData%BlPRateCom)) then + allocate(DstOutputData%BlPRateCom(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%ExternalBlAirfoilCom.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BlPRateCom.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInputData%ExternalBlAirfoilCom = SrcInputData%ExternalBlAirfoilCom + DstOutputData%BlPRateCom = SrcOutputData%BlPRateCom end if - if (allocated(SrcInputData%ExternalCableDeltaL)) then - LB(1:1) = lbound(SrcInputData%ExternalCableDeltaL) - UB(1:1) = ubound(SrcInputData%ExternalCableDeltaL) - if (.not. allocated(DstInputData%ExternalCableDeltaL)) then - allocate(DstInputData%ExternalCableDeltaL(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%BlAirfoilCom)) then + LB(1:1) = lbound(SrcOutputData%BlAirfoilCom) + UB(1:1) = ubound(SrcOutputData%BlAirfoilCom) + if (.not. allocated(DstOutputData%BlAirfoilCom)) then + allocate(DstOutputData%BlAirfoilCom(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%ExternalCableDeltaL.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BlAirfoilCom.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInputData%ExternalCableDeltaL = SrcInputData%ExternalCableDeltaL + DstOutputData%BlAirfoilCom = SrcOutputData%BlAirfoilCom end if - if (allocated(SrcInputData%ExternalCableDeltaLdot)) then - LB(1:1) = lbound(SrcInputData%ExternalCableDeltaLdot) - UB(1:1) = ubound(SrcInputData%ExternalCableDeltaLdot) - if (.not. allocated(DstInputData%ExternalCableDeltaLdot)) then - allocate(DstInputData%ExternalCableDeltaLdot(LB(1):UB(1)), stat=ErrStat2) + DstOutputData%YawMom = SrcOutputData%YawMom + DstOutputData%YawPosCom = SrcOutputData%YawPosCom + DstOutputData%YawRateCom = SrcOutputData%YawRateCom + DstOutputData%GenTrq = SrcOutputData%GenTrq + DstOutputData%HSSBrTrqC = SrcOutputData%HSSBrTrqC + DstOutputData%ElecPwr = SrcOutputData%ElecPwr + if (allocated(SrcOutputData%TBDrCon)) then + LB(1:1) = lbound(SrcOutputData%TBDrCon) + UB(1:1) = ubound(SrcOutputData%TBDrCon) + if (.not. allocated(DstOutputData%TBDrCon)) then + allocate(DstOutputData%TBDrCon(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%ExternalCableDeltaLdot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%TBDrCon.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInputData%ExternalCableDeltaLdot = SrcInputData%ExternalCableDeltaLdot + DstOutputData%TBDrCon = SrcOutputData%TBDrCon end if - DstInputData%TwrAccel = SrcInputData%TwrAccel - DstInputData%YawErr = SrcInputData%YawErr - DstInputData%WindDir = SrcInputData%WindDir - DstInputData%RootMyc = SrcInputData%RootMyc - DstInputData%YawBrTAxp = SrcInputData%YawBrTAxp - DstInputData%YawBrTAyp = SrcInputData%YawBrTAyp - DstInputData%LSSTipPxa = SrcInputData%LSSTipPxa - DstInputData%RootMxc = SrcInputData%RootMxc - DstInputData%LSSTipMxa = SrcInputData%LSSTipMxa - DstInputData%LSSTipMya = SrcInputData%LSSTipMya - DstInputData%LSSTipMza = SrcInputData%LSSTipMza - DstInputData%LSSTipMys = SrcInputData%LSSTipMys - DstInputData%LSSTipMzs = SrcInputData%LSSTipMzs - DstInputData%YawBrMyn = SrcInputData%YawBrMyn - DstInputData%YawBrMzn = SrcInputData%YawBrMzn - DstInputData%NcIMURAxs = SrcInputData%NcIMURAxs - DstInputData%NcIMURAys = SrcInputData%NcIMURAys - DstInputData%NcIMURAzs = SrcInputData%NcIMURAzs - DstInputData%RotPwr = SrcInputData%RotPwr - DstInputData%HorWindV = SrcInputData%HorWindV - DstInputData%YawAngle = SrcInputData%YawAngle - DstInputData%LSShftFxa = SrcInputData%LSShftFxa - DstInputData%LSShftFys = SrcInputData%LSShftFys - DstInputData%LSShftFzs = SrcInputData%LSShftFzs - call MeshCopy(SrcInputData%PtfmMotionMesh, DstInputData%PtfmMotionMesh, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - if (allocated(SrcInputData%BStCMotionMesh)) then - LB(1:2) = lbound(SrcInputData%BStCMotionMesh) - UB(1:2) = ubound(SrcInputData%BStCMotionMesh) - if (.not. allocated(DstInputData%BStCMotionMesh)) then - allocate(DstInputData%BStCMotionMesh(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcOutputData%CableDeltaL)) then + LB(1:1) = lbound(SrcOutputData%CableDeltaL) + UB(1:1) = ubound(SrcOutputData%CableDeltaL) + if (.not. allocated(DstOutputData%CableDeltaL)) then + allocate(DstOutputData%CableDeltaL(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%BStCMotionMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%CableDeltaL.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%CableDeltaL = SrcOutputData%CableDeltaL + end if + if (allocated(SrcOutputData%CableDeltaLdot)) then + LB(1:1) = lbound(SrcOutputData%CableDeltaLdot) + UB(1:1) = ubound(SrcOutputData%CableDeltaLdot) + if (.not. allocated(DstOutputData%CableDeltaLdot)) then + allocate(DstOutputData%CableDeltaLdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%CableDeltaLdot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%CableDeltaLdot = SrcOutputData%CableDeltaLdot + end if + if (allocated(SrcOutputData%BStCLoadMesh)) then + LB(1:2) = lbound(SrcOutputData%BStCLoadMesh) + UB(1:2) = ubound(SrcOutputData%BStCLoadMesh) + if (.not. allocated(DstOutputData%BStCLoadMesh)) then + allocate(DstOutputData%BStCLoadMesh(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BStCLoadMesh.', ErrStat, ErrMsg, RoutineName) return end if end if do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call MeshCopy(SrcInputData%BStCMotionMesh(i1,i2), DstInputData%BStCMotionMesh(i1,i2), CtrlCode, ErrStat2, ErrMsg2 ) + call MeshCopy(SrcOutputData%BStCLoadMesh(i1,i2), DstOutputData%BStCLoadMesh(i1,i2), CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end do end if - if (allocated(SrcInputData%NStCMotionMesh)) then - LB(1:1) = lbound(SrcInputData%NStCMotionMesh) - UB(1:1) = ubound(SrcInputData%NStCMotionMesh) - if (.not. allocated(DstInputData%NStCMotionMesh)) then - allocate(DstInputData%NStCMotionMesh(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%NStCLoadMesh)) then + LB(1:1) = lbound(SrcOutputData%NStCLoadMesh) + UB(1:1) = ubound(SrcOutputData%NStCLoadMesh) + if (.not. allocated(DstOutputData%NStCLoadMesh)) then + allocate(DstOutputData%NStCLoadMesh(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%NStCMotionMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%NStCLoadMesh.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcInputData%NStCMotionMesh(i1), DstInputData%NStCMotionMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call MeshCopy(SrcOutputData%NStCLoadMesh(i1), DstOutputData%NStCLoadMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcInputData%TStCMotionMesh)) then - LB(1:1) = lbound(SrcInputData%TStCMotionMesh) - UB(1:1) = ubound(SrcInputData%TStCMotionMesh) - if (.not. allocated(DstInputData%TStCMotionMesh)) then - allocate(DstInputData%TStCMotionMesh(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%TStCLoadMesh)) then + LB(1:1) = lbound(SrcOutputData%TStCLoadMesh) + UB(1:1) = ubound(SrcOutputData%TStCLoadMesh) + if (.not. allocated(DstOutputData%TStCLoadMesh)) then + allocate(DstOutputData%TStCLoadMesh(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%TStCMotionMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%TStCLoadMesh.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcInputData%TStCMotionMesh(i1), DstInputData%TStCMotionMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call MeshCopy(SrcOutputData%TStCLoadMesh(i1), DstOutputData%TStCLoadMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcInputData%SStCMotionMesh)) then - LB(1:1) = lbound(SrcInputData%SStCMotionMesh) - UB(1:1) = ubound(SrcInputData%SStCMotionMesh) - if (.not. allocated(DstInputData%SStCMotionMesh)) then - allocate(DstInputData%SStCMotionMesh(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcOutputData%SStCLoadMesh)) then + LB(1:1) = lbound(SrcOutputData%SStCLoadMesh) + UB(1:1) = ubound(SrcOutputData%SStCLoadMesh) + if (.not. allocated(DstOutputData%SStCLoadMesh)) then + allocate(DstOutputData%SStCLoadMesh(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%SStCMotionMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%SStCLoadMesh.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcInputData%SStCMotionMesh(i1), DstInputData%SStCMotionMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call MeshCopy(SrcOutputData%SStCLoadMesh(i1), DstOutputData%SStCLoadMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcInputData%LidSpeed)) then - LB(1:1) = lbound(SrcInputData%LidSpeed) - UB(1:1) = ubound(SrcInputData%LidSpeed) - if (.not. allocated(DstInputData%LidSpeed)) then - allocate(DstInputData%LidSpeed(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%LidSpeed.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInputData%LidSpeed = SrcInputData%LidSpeed - end if - if (allocated(SrcInputData%MsrPositionsX)) then - LB(1:1) = lbound(SrcInputData%MsrPositionsX) - UB(1:1) = ubound(SrcInputData%MsrPositionsX) - if (.not. allocated(DstInputData%MsrPositionsX)) then - allocate(DstInputData%MsrPositionsX(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%MsrPositionsX.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInputData%MsrPositionsX = SrcInputData%MsrPositionsX - end if - if (allocated(SrcInputData%MsrPositionsY)) then - LB(1:1) = lbound(SrcInputData%MsrPositionsY) - UB(1:1) = ubound(SrcInputData%MsrPositionsY) - if (.not. allocated(DstInputData%MsrPositionsY)) then - allocate(DstInputData%MsrPositionsY(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%MsrPositionsY.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInputData%MsrPositionsY = SrcInputData%MsrPositionsY - end if - if (allocated(SrcInputData%MsrPositionsZ)) then - LB(1:1) = lbound(SrcInputData%MsrPositionsZ) - UB(1:1) = ubound(SrcInputData%MsrPositionsZ) - if (.not. allocated(DstInputData%MsrPositionsZ)) then - allocate(DstInputData%MsrPositionsZ(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%MsrPositionsZ.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInputData%MsrPositionsZ = SrcInputData%MsrPositionsZ - end if end subroutine -subroutine SrvD_DestroyInput(InputData, ErrStat, ErrMsg) - type(SrvD_InputType), intent(inout) :: InputData +subroutine SrvD_DestroyOutput(OutputData, ErrStat, ErrMsg) + type(SrvD_OutputType), intent(inout) :: OutputData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SrvD_DestroyInput' + character(*), parameter :: RoutineName = 'SrvD_DestroyOutput' ErrStat = ErrID_None ErrMsg = '' - if (allocated(InputData%BlPitch)) then - deallocate(InputData%BlPitch) + if (allocated(OutputData%WriteOutput)) then + deallocate(OutputData%WriteOutput) end if - if (allocated(InputData%ExternalBlPitchCom)) then - deallocate(InputData%ExternalBlPitchCom) + if (allocated(OutputData%BlPitchMom)) then + deallocate(OutputData%BlPitchMom) end if - if (allocated(InputData%ExternalBlAirfoilCom)) then - deallocate(InputData%ExternalBlAirfoilCom) + if (allocated(OutputData%BlPitchCom)) then + deallocate(OutputData%BlPitchCom) end if - if (allocated(InputData%ExternalCableDeltaL)) then - deallocate(InputData%ExternalCableDeltaL) + if (allocated(OutputData%BlPRateCom)) then + deallocate(OutputData%BlPRateCom) end if - if (allocated(InputData%ExternalCableDeltaLdot)) then - deallocate(InputData%ExternalCableDeltaLdot) + if (allocated(OutputData%BlAirfoilCom)) then + deallocate(OutputData%BlAirfoilCom) + end if + if (allocated(OutputData%TBDrCon)) then + deallocate(OutputData%TBDrCon) + end if + if (allocated(OutputData%CableDeltaL)) then + deallocate(OutputData%CableDeltaL) end if - call MeshDestroy( InputData%PtfmMotionMesh, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(InputData%BStCMotionMesh)) then - LB(1:2) = lbound(InputData%BStCMotionMesh) - UB(1:2) = ubound(InputData%BStCMotionMesh) + if (allocated(OutputData%CableDeltaLdot)) then + deallocate(OutputData%CableDeltaLdot) + end if + if (allocated(OutputData%BStCLoadMesh)) then + LB(1:2) = lbound(OutputData%BStCLoadMesh) + UB(1:2) = ubound(OutputData%BStCLoadMesh) do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call MeshDestroy( InputData%BStCMotionMesh(i1,i2), ErrStat2, ErrMsg2) + call MeshDestroy( OutputData%BStCLoadMesh(i1,i2), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do end do - deallocate(InputData%BStCMotionMesh) + deallocate(OutputData%BStCLoadMesh) end if - if (allocated(InputData%NStCMotionMesh)) then - LB(1:1) = lbound(InputData%NStCMotionMesh) - UB(1:1) = ubound(InputData%NStCMotionMesh) + if (allocated(OutputData%NStCLoadMesh)) then + LB(1:1) = lbound(OutputData%NStCLoadMesh) + UB(1:1) = ubound(OutputData%NStCLoadMesh) do i1 = LB(1), UB(1) - call MeshDestroy( InputData%NStCMotionMesh(i1), ErrStat2, ErrMsg2) + call MeshDestroy( OutputData%NStCLoadMesh(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(InputData%NStCMotionMesh) + deallocate(OutputData%NStCLoadMesh) end if - if (allocated(InputData%TStCMotionMesh)) then - LB(1:1) = lbound(InputData%TStCMotionMesh) - UB(1:1) = ubound(InputData%TStCMotionMesh) + if (allocated(OutputData%TStCLoadMesh)) then + LB(1:1) = lbound(OutputData%TStCLoadMesh) + UB(1:1) = ubound(OutputData%TStCLoadMesh) do i1 = LB(1), UB(1) - call MeshDestroy( InputData%TStCMotionMesh(i1), ErrStat2, ErrMsg2) + call MeshDestroy( OutputData%TStCLoadMesh(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(InputData%TStCMotionMesh) + deallocate(OutputData%TStCLoadMesh) end if - if (allocated(InputData%SStCMotionMesh)) then - LB(1:1) = lbound(InputData%SStCMotionMesh) - UB(1:1) = ubound(InputData%SStCMotionMesh) + if (allocated(OutputData%SStCLoadMesh)) then + LB(1:1) = lbound(OutputData%SStCLoadMesh) + UB(1:1) = ubound(OutputData%SStCLoadMesh) do i1 = LB(1), UB(1) - call MeshDestroy( InputData%SStCMotionMesh(i1), ErrStat2, ErrMsg2) + call MeshDestroy( OutputData%SStCLoadMesh(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(InputData%SStCMotionMesh) - end if - if (allocated(InputData%LidSpeed)) then - deallocate(InputData%LidSpeed) - end if - if (allocated(InputData%MsrPositionsX)) then - deallocate(InputData%MsrPositionsX) - end if - if (allocated(InputData%MsrPositionsY)) then - deallocate(InputData%MsrPositionsY) - end if - if (allocated(InputData%MsrPositionsZ)) then - deallocate(InputData%MsrPositionsZ) + deallocate(OutputData%SStCLoadMesh) end if end subroutine -subroutine SrvD_PackInput(RF, Indata) +subroutine SrvD_PackOutput(RF, Indata) type(RegFile), intent(inout) :: RF - type(SrvD_InputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'SrvD_PackInput' + type(SrvD_OutputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SrvD_PackOutput' integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%BlPitch) - call RegPack(RF, InData%Yaw) - call RegPack(RF, InData%YawRate) - call RegPack(RF, InData%LSS_Spd) - call RegPack(RF, InData%HSS_Spd) - call RegPack(RF, InData%RotSpeed) - call RegPack(RF, InData%ExternalYawPosCom) - call RegPack(RF, InData%ExternalYawRateCom) - call RegPackAlloc(RF, InData%ExternalBlPitchCom) - call RegPack(RF, InData%ExternalGenTrq) - call RegPack(RF, InData%ExternalElecPwr) - call RegPack(RF, InData%ExternalHSSBrFrac) - call RegPackAlloc(RF, InData%ExternalBlAirfoilCom) - call RegPackAlloc(RF, InData%ExternalCableDeltaL) - call RegPackAlloc(RF, InData%ExternalCableDeltaLdot) - call RegPack(RF, InData%TwrAccel) - call RegPack(RF, InData%YawErr) - call RegPack(RF, InData%WindDir) - call RegPack(RF, InData%RootMyc) - call RegPack(RF, InData%YawBrTAxp) - call RegPack(RF, InData%YawBrTAyp) - call RegPack(RF, InData%LSSTipPxa) - call RegPack(RF, InData%RootMxc) - call RegPack(RF, InData%LSSTipMxa) - call RegPack(RF, InData%LSSTipMya) - call RegPack(RF, InData%LSSTipMza) - call RegPack(RF, InData%LSSTipMys) - call RegPack(RF, InData%LSSTipMzs) - call RegPack(RF, InData%YawBrMyn) - call RegPack(RF, InData%YawBrMzn) - call RegPack(RF, InData%NcIMURAxs) - call RegPack(RF, InData%NcIMURAys) - call RegPack(RF, InData%NcIMURAzs) - call RegPack(RF, InData%RotPwr) - call RegPack(RF, InData%HorWindV) - call RegPack(RF, InData%YawAngle) - call RegPack(RF, InData%LSShftFxa) - call RegPack(RF, InData%LSShftFys) - call RegPack(RF, InData%LSShftFzs) - call MeshPack(RF, InData%PtfmMotionMesh) - call RegPack(RF, allocated(InData%BStCMotionMesh)) - if (allocated(InData%BStCMotionMesh)) then - call RegPackBounds(RF, 2, lbound(InData%BStCMotionMesh), ubound(InData%BStCMotionMesh)) - LB(1:2) = lbound(InData%BStCMotionMesh) - UB(1:2) = ubound(InData%BStCMotionMesh) + call RegPackAlloc(RF, InData%WriteOutput) + call RegPackAlloc(RF, InData%BlPitchMom) + call RegPackAlloc(RF, InData%BlPitchCom) + call RegPackAlloc(RF, InData%BlPRateCom) + call RegPackAlloc(RF, InData%BlAirfoilCom) + call RegPack(RF, InData%YawMom) + call RegPack(RF, InData%YawPosCom) + call RegPack(RF, InData%YawRateCom) + call RegPack(RF, InData%GenTrq) + call RegPack(RF, InData%HSSBrTrqC) + call RegPack(RF, InData%ElecPwr) + call RegPackAlloc(RF, InData%TBDrCon) + call RegPackAlloc(RF, InData%CableDeltaL) + call RegPackAlloc(RF, InData%CableDeltaLdot) + call RegPack(RF, allocated(InData%BStCLoadMesh)) + if (allocated(InData%BStCLoadMesh)) then + call RegPackBounds(RF, 2, lbound(InData%BStCLoadMesh), ubound(InData%BStCLoadMesh)) + LB(1:2) = lbound(InData%BStCLoadMesh) + UB(1:2) = ubound(InData%BStCLoadMesh) do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BStCMotionMesh(i1,i2)) + call MeshPack(RF, InData%BStCLoadMesh(i1,i2)) end do end do end if - call RegPack(RF, allocated(InData%NStCMotionMesh)) - if (allocated(InData%NStCMotionMesh)) then - call RegPackBounds(RF, 1, lbound(InData%NStCMotionMesh), ubound(InData%NStCMotionMesh)) - LB(1:1) = lbound(InData%NStCMotionMesh) - UB(1:1) = ubound(InData%NStCMotionMesh) + call RegPack(RF, allocated(InData%NStCLoadMesh)) + if (allocated(InData%NStCLoadMesh)) then + call RegPackBounds(RF, 1, lbound(InData%NStCLoadMesh), ubound(InData%NStCLoadMesh)) + LB(1:1) = lbound(InData%NStCLoadMesh) + UB(1:1) = ubound(InData%NStCLoadMesh) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%NStCMotionMesh(i1)) + call MeshPack(RF, InData%NStCLoadMesh(i1)) end do end if - call RegPack(RF, allocated(InData%TStCMotionMesh)) - if (allocated(InData%TStCMotionMesh)) then - call RegPackBounds(RF, 1, lbound(InData%TStCMotionMesh), ubound(InData%TStCMotionMesh)) - LB(1:1) = lbound(InData%TStCMotionMesh) - UB(1:1) = ubound(InData%TStCMotionMesh) + call RegPack(RF, allocated(InData%TStCLoadMesh)) + if (allocated(InData%TStCLoadMesh)) then + call RegPackBounds(RF, 1, lbound(InData%TStCLoadMesh), ubound(InData%TStCLoadMesh)) + LB(1:1) = lbound(InData%TStCLoadMesh) + UB(1:1) = ubound(InData%TStCLoadMesh) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%TStCMotionMesh(i1)) + call MeshPack(RF, InData%TStCLoadMesh(i1)) end do end if - call RegPack(RF, allocated(InData%SStCMotionMesh)) - if (allocated(InData%SStCMotionMesh)) then - call RegPackBounds(RF, 1, lbound(InData%SStCMotionMesh), ubound(InData%SStCMotionMesh)) - LB(1:1) = lbound(InData%SStCMotionMesh) - UB(1:1) = ubound(InData%SStCMotionMesh) + call RegPack(RF, allocated(InData%SStCLoadMesh)) + if (allocated(InData%SStCLoadMesh)) then + call RegPackBounds(RF, 1, lbound(InData%SStCLoadMesh), ubound(InData%SStCLoadMesh)) + LB(1:1) = lbound(InData%SStCLoadMesh) + UB(1:1) = ubound(InData%SStCLoadMesh) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%SStCMotionMesh(i1)) + call MeshPack(RF, InData%SStCLoadMesh(i1)) end do end if - call RegPackAlloc(RF, InData%LidSpeed) - call RegPackAlloc(RF, InData%MsrPositionsX) - call RegPackAlloc(RF, InData%MsrPositionsY) - call RegPackAlloc(RF, InData%MsrPositionsZ) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine SrvD_UnPackInput(RF, OutData) +subroutine SrvD_UnPackOutput(RF, OutData) type(RegFile), intent(inout) :: RF - type(SrvD_InputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SrvD_UnPackInput' + type(SrvD_OutputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SrvD_UnPackOutput' integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%BlPitch); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Yaw); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawRate); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSS_Spd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HSS_Spd); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ExternalYawPosCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ExternalYawRateCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%ExternalBlPitchCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ExternalGenTrq); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ExternalElecPwr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ExternalHSSBrFrac); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%ExternalBlAirfoilCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%ExternalCableDeltaL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%ExternalCableDeltaLdot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TwrAccel); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawErr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%WindDir); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RootMyc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawBrTAxp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawBrTAyp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipPxa); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RootMxc); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMxa); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMya); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMza); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMys); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSSTipMzs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawBrMyn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawBrMzn); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NcIMURAxs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NcIMURAys); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NcIMURAzs); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RotPwr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HorWindV); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawAngle); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSShftFxa); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSShftFys); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LSShftFzs); if (RegCheckErr(RF, RoutineName)) return - call MeshUnpack(RF, OutData%PtfmMotionMesh) ! PtfmMotionMesh - if (allocated(OutData%BStCMotionMesh)) deallocate(OutData%BStCMotionMesh) + call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPitchMom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPitchCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlPRateCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%BlAirfoilCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawMom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawPosCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%YawRateCom); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%GenTrq); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%HSSBrTrqC); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ElecPwr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TBDrCon); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%CableDeltaL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%CableDeltaLdot); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%BStCLoadMesh)) deallocate(OutData%BStCLoadMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BStCMotionMesh(LB(1):UB(1),LB(2):UB(2)),stat=stat) + allocate(OutData%BStCLoadMesh(LB(1):UB(1),LB(2):UB(2)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BStCMotionMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BStCLoadMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BStCMotionMesh(i1,i2)) ! BStCMotionMesh + call MeshUnpack(RF, OutData%BStCLoadMesh(i1,i2)) ! BStCLoadMesh end do end do end if - if (allocated(OutData%NStCMotionMesh)) deallocate(OutData%NStCMotionMesh) + if (allocated(OutData%NStCLoadMesh)) deallocate(OutData%NStCLoadMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%NStCMotionMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%NStCLoadMesh(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%NStCMotionMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%NStCLoadMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%NStCMotionMesh(i1)) ! NStCMotionMesh + call MeshUnpack(RF, OutData%NStCLoadMesh(i1)) ! NStCLoadMesh end do end if - if (allocated(OutData%TStCMotionMesh)) deallocate(OutData%TStCMotionMesh) + if (allocated(OutData%TStCLoadMesh)) deallocate(OutData%TStCLoadMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%TStCMotionMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%TStCLoadMesh(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%TStCMotionMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%TStCLoadMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%TStCMotionMesh(i1)) ! TStCMotionMesh + call MeshUnpack(RF, OutData%TStCLoadMesh(i1)) ! TStCLoadMesh end do end if - if (allocated(OutData%SStCMotionMesh)) deallocate(OutData%SStCMotionMesh) + if (allocated(OutData%SStCLoadMesh)) deallocate(OutData%SStCLoadMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%SStCMotionMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%SStCLoadMesh(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SStCMotionMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SStCLoadMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%SStCMotionMesh(i1)) ! SStCMotionMesh + call MeshUnpack(RF, OutData%SStCLoadMesh(i1)) ! SStCLoadMesh end do end if - call RegUnpackAlloc(RF, OutData%LidSpeed); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%MsrPositionsX); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%MsrPositionsY); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%MsrPositionsZ); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine SrvD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) - type(SrvD_OutputType), intent(inout) :: SrcOutputData - type(SrvD_OutputType), intent(inout) :: DstOutputData +subroutine SrvD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(SrvD_MiscVarType), intent(inout) :: SrcMiscData + type(SrvD_MiscVarType), intent(inout) :: DstMiscData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg @@ -5815,359 +5407,734 @@ subroutine SrvD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrM integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SrvD_CopyOutput' + character(*), parameter :: RoutineName = 'SrvD_CopyMisc' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcOutputData%WriteOutput)) then - LB(1:1) = lbound(SrcOutputData%WriteOutput) - UB(1:1) = ubound(SrcOutputData%WriteOutput) - if (.not. allocated(DstOutputData%WriteOutput)) then - allocate(DstOutputData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) + DstMiscData%LastTimeCalled = SrcMiscData%LastTimeCalled + call SrvD_CopyBladedDLLType(SrcMiscData%dll_data, DstMiscData%dll_data, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstMiscData%FirstWarn = SrcMiscData%FirstWarn + DstMiscData%LastTimeFiltered = SrcMiscData%LastTimeFiltered + if (allocated(SrcMiscData%xd_BlPitchFilter)) then + LB(1:1) = lbound(SrcMiscData%xd_BlPitchFilter) + UB(1:1) = ubound(SrcMiscData%xd_BlPitchFilter) + if (.not. allocated(DstMiscData%xd_BlPitchFilter)) then + allocate(DstMiscData%xd_BlPitchFilter(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%xd_BlPitchFilter.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOutputData%WriteOutput = SrcOutputData%WriteOutput + DstMiscData%xd_BlPitchFilter = SrcMiscData%xd_BlPitchFilter end if - if (allocated(SrcOutputData%BlPitchCom)) then - LB(1:1) = lbound(SrcOutputData%BlPitchCom) - UB(1:1) = ubound(SrcOutputData%BlPitchCom) - if (.not. allocated(DstOutputData%BlPitchCom)) then - allocate(DstOutputData%BlPitchCom(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%xd_BlPRateFilter)) then + LB(1:1) = lbound(SrcMiscData%xd_BlPRateFilter) + UB(1:1) = ubound(SrcMiscData%xd_BlPRateFilter) + if (.not. allocated(DstMiscData%xd_BlPRateFilter)) then + allocate(DstMiscData%xd_BlPRateFilter(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BlPitchCom.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%xd_BlPRateFilter.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOutputData%BlPitchCom = SrcOutputData%BlPitchCom + DstMiscData%xd_BlPRateFilter = SrcMiscData%xd_BlPRateFilter end if - if (allocated(SrcOutputData%BlAirfoilCom)) then - LB(1:1) = lbound(SrcOutputData%BlAirfoilCom) - UB(1:1) = ubound(SrcOutputData%BlAirfoilCom) - if (.not. allocated(DstOutputData%BlAirfoilCom)) then - allocate(DstOutputData%BlAirfoilCom(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%BStC)) then + LB(1:1) = lbound(SrcMiscData%BStC) + UB(1:1) = ubound(SrcMiscData%BStC) + if (.not. allocated(DstMiscData%BStC)) then + allocate(DstMiscData%BStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BlAirfoilCom.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%BStC.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOutputData%BlAirfoilCom = SrcOutputData%BlAirfoilCom + do i1 = LB(1), UB(1) + call StC_CopyMisc(SrcMiscData%BStC(i1), DstMiscData%BStC(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - DstOutputData%YawMom = SrcOutputData%YawMom - DstOutputData%YawPosCom = SrcOutputData%YawPosCom - DstOutputData%YawRateCom = SrcOutputData%YawRateCom - DstOutputData%GenTrq = SrcOutputData%GenTrq - DstOutputData%HSSBrTrqC = SrcOutputData%HSSBrTrqC - DstOutputData%ElecPwr = SrcOutputData%ElecPwr - if (allocated(SrcOutputData%TBDrCon)) then - LB(1:1) = lbound(SrcOutputData%TBDrCon) - UB(1:1) = ubound(SrcOutputData%TBDrCon) - if (.not. allocated(DstOutputData%TBDrCon)) then - allocate(DstOutputData%TBDrCon(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%NStC)) then + LB(1:1) = lbound(SrcMiscData%NStC) + UB(1:1) = ubound(SrcMiscData%NStC) + if (.not. allocated(DstMiscData%NStC)) then + allocate(DstMiscData%NStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%TBDrCon.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%NStC.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOutputData%TBDrCon = SrcOutputData%TBDrCon + do i1 = LB(1), UB(1) + call StC_CopyMisc(SrcMiscData%NStC(i1), DstMiscData%NStC(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcOutputData%CableDeltaL)) then - LB(1:1) = lbound(SrcOutputData%CableDeltaL) - UB(1:1) = ubound(SrcOutputData%CableDeltaL) - if (.not. allocated(DstOutputData%CableDeltaL)) then - allocate(DstOutputData%CableDeltaL(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%TStC)) then + LB(1:1) = lbound(SrcMiscData%TStC) + UB(1:1) = ubound(SrcMiscData%TStC) + if (.not. allocated(DstMiscData%TStC)) then + allocate(DstMiscData%TStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%CableDeltaL.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%TStC.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOutputData%CableDeltaL = SrcOutputData%CableDeltaL + do i1 = LB(1), UB(1) + call StC_CopyMisc(SrcMiscData%TStC(i1), DstMiscData%TStC(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcOutputData%CableDeltaLdot)) then - LB(1:1) = lbound(SrcOutputData%CableDeltaLdot) - UB(1:1) = ubound(SrcOutputData%CableDeltaLdot) - if (.not. allocated(DstOutputData%CableDeltaLdot)) then - allocate(DstOutputData%CableDeltaLdot(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%SStC)) then + LB(1:1) = lbound(SrcMiscData%SStC) + UB(1:1) = ubound(SrcMiscData%SStC) + if (.not. allocated(DstMiscData%SStC)) then + allocate(DstMiscData%SStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%CableDeltaLdot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%SStC.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOutputData%CableDeltaLdot = SrcOutputData%CableDeltaLdot + do i1 = LB(1), UB(1) + call StC_CopyMisc(SrcMiscData%SStC(i1), DstMiscData%SStC(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcOutputData%BStCLoadMesh)) then - LB(1:2) = lbound(SrcOutputData%BStCLoadMesh) - UB(1:2) = ubound(SrcOutputData%BStCLoadMesh) - if (.not. allocated(DstOutputData%BStCLoadMesh)) then - allocate(DstOutputData%BStCLoadMesh(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcMiscData%u_BStC)) then + LB(1:2) = lbound(SrcMiscData%u_BStC) + UB(1:2) = ubound(SrcMiscData%u_BStC) + if (.not. allocated(DstMiscData%u_BStC)) then + allocate(DstMiscData%u_BStC(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%BStCLoadMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_BStC.', ErrStat, ErrMsg, RoutineName) return end if end if do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%BStCLoadMesh(i1,i2), DstOutputData%BStCLoadMesh(i1,i2), CtrlCode, ErrStat2, ErrMsg2 ) + call StC_CopyInput(SrcMiscData%u_BStC(i1,i2), DstMiscData%u_BStC(i1,i2), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end do end if - if (allocated(SrcOutputData%NStCLoadMesh)) then - LB(1:1) = lbound(SrcOutputData%NStCLoadMesh) - UB(1:1) = ubound(SrcOutputData%NStCLoadMesh) - if (.not. allocated(DstOutputData%NStCLoadMesh)) then - allocate(DstOutputData%NStCLoadMesh(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%u_NStC)) then + LB(1:2) = lbound(SrcMiscData%u_NStC) + UB(1:2) = ubound(SrcMiscData%u_NStC) + if (.not. allocated(DstMiscData%u_NStC)) then + allocate(DstMiscData%u_NStC(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%NStCLoadMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_NStC.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_CopyInput(SrcMiscData%u_NStC(i1,i2), DstMiscData%u_NStC(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcMiscData%u_TStC)) then + LB(1:2) = lbound(SrcMiscData%u_TStC) + UB(1:2) = ubound(SrcMiscData%u_TStC) + if (.not. allocated(DstMiscData%u_TStC)) then + allocate(DstMiscData%u_TStC(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_TStC.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_CopyInput(SrcMiscData%u_TStC(i1,i2), DstMiscData%u_TStC(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcMiscData%u_SStC)) then + LB(1:2) = lbound(SrcMiscData%u_SStC) + UB(1:2) = ubound(SrcMiscData%u_SStC) + if (.not. allocated(DstMiscData%u_SStC)) then + allocate(DstMiscData%u_SStC(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_SStC.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_CopyInput(SrcMiscData%u_SStC(i1,i2), DstMiscData%u_SStC(i1,i2), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end do + end if + if (allocated(SrcMiscData%y_BStC)) then + LB(1:1) = lbound(SrcMiscData%y_BStC) + UB(1:1) = ubound(SrcMiscData%y_BStC) + if (.not. allocated(DstMiscData%y_BStC)) then + allocate(DstMiscData%y_BStC(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%y_BStC.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%NStCLoadMesh(i1), DstOutputData%NStCLoadMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call StC_CopyOutput(SrcMiscData%y_BStC(i1), DstMiscData%y_BStC(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcOutputData%TStCLoadMesh)) then - LB(1:1) = lbound(SrcOutputData%TStCLoadMesh) - UB(1:1) = ubound(SrcOutputData%TStCLoadMesh) - if (.not. allocated(DstOutputData%TStCLoadMesh)) then - allocate(DstOutputData%TStCLoadMesh(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%y_NStC)) then + LB(1:1) = lbound(SrcMiscData%y_NStC) + UB(1:1) = ubound(SrcMiscData%y_NStC) + if (.not. allocated(DstMiscData%y_NStC)) then + allocate(DstMiscData%y_NStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%TStCLoadMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%y_NStC.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%TStCLoadMesh(i1), DstOutputData%TStCLoadMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call StC_CopyOutput(SrcMiscData%y_NStC(i1), DstMiscData%y_NStC(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if - if (allocated(SrcOutputData%SStCLoadMesh)) then - LB(1:1) = lbound(SrcOutputData%SStCLoadMesh) - UB(1:1) = ubound(SrcOutputData%SStCLoadMesh) - if (.not. allocated(DstOutputData%SStCLoadMesh)) then - allocate(DstOutputData%SStCLoadMesh(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcMiscData%y_TStC)) then + LB(1:1) = lbound(SrcMiscData%y_TStC) + UB(1:1) = ubound(SrcMiscData%y_TStC) + if (.not. allocated(DstMiscData%y_TStC)) then + allocate(DstMiscData%y_TStC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%SStCLoadMesh.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%y_TStC.', ErrStat, ErrMsg, RoutineName) return end if end if do i1 = LB(1), UB(1) - call MeshCopy(SrcOutputData%SStCLoadMesh(i1), DstOutputData%SStCLoadMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call StC_CopyOutput(SrcMiscData%y_TStC(i1), DstMiscData%y_TStC(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%y_SStC)) then + LB(1:1) = lbound(SrcMiscData%y_SStC) + UB(1:1) = ubound(SrcMiscData%y_SStC) + if (.not. allocated(DstMiscData%y_SStC)) then + allocate(DstMiscData%y_SStC(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%y_SStC.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call StC_CopyOutput(SrcMiscData%y_SStC(i1), DstMiscData%y_SStC(i1), CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return end do end if + call SrvD_CopyModuleMapType(SrcMiscData%SrvD_MeshMap, DstMiscData%SrvD_MeshMap, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstMiscData%PrevTstepNcall = SrcMiscData%PrevTstepNcall + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SrvD_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SrvD_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SrvD_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SrvD_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine -subroutine SrvD_DestroyOutput(OutputData, ErrStat, ErrMsg) - type(SrvD_OutputType), intent(inout) :: OutputData +subroutine SrvD_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(SrvD_MiscVarType), intent(inout) :: MiscData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SrvD_DestroyOutput' + character(*), parameter :: RoutineName = 'SrvD_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' - if (allocated(OutputData%WriteOutput)) then - deallocate(OutputData%WriteOutput) + call SrvD_DestroyBladedDLLType(MiscData%dll_data, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%xd_BlPitchFilter)) then + deallocate(MiscData%xd_BlPitchFilter) end if - if (allocated(OutputData%BlPitchCom)) then - deallocate(OutputData%BlPitchCom) + if (allocated(MiscData%xd_BlPRateFilter)) then + deallocate(MiscData%xd_BlPRateFilter) end if - if (allocated(OutputData%BlAirfoilCom)) then - deallocate(OutputData%BlAirfoilCom) + if (allocated(MiscData%BStC)) then + LB(1:1) = lbound(MiscData%BStC) + UB(1:1) = ubound(MiscData%BStC) + do i1 = LB(1), UB(1) + call StC_DestroyMisc(MiscData%BStC(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%BStC) end if - if (allocated(OutputData%TBDrCon)) then - deallocate(OutputData%TBDrCon) + if (allocated(MiscData%NStC)) then + LB(1:1) = lbound(MiscData%NStC) + UB(1:1) = ubound(MiscData%NStC) + do i1 = LB(1), UB(1) + call StC_DestroyMisc(MiscData%NStC(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%NStC) end if - if (allocated(OutputData%CableDeltaL)) then - deallocate(OutputData%CableDeltaL) + if (allocated(MiscData%TStC)) then + LB(1:1) = lbound(MiscData%TStC) + UB(1:1) = ubound(MiscData%TStC) + do i1 = LB(1), UB(1) + call StC_DestroyMisc(MiscData%TStC(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%TStC) end if - if (allocated(OutputData%CableDeltaLdot)) then - deallocate(OutputData%CableDeltaLdot) + if (allocated(MiscData%SStC)) then + LB(1:1) = lbound(MiscData%SStC) + UB(1:1) = ubound(MiscData%SStC) + do i1 = LB(1), UB(1) + call StC_DestroyMisc(MiscData%SStC(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%SStC) end if - if (allocated(OutputData%BStCLoadMesh)) then - LB(1:2) = lbound(OutputData%BStCLoadMesh) - UB(1:2) = ubound(OutputData%BStCLoadMesh) + if (allocated(MiscData%u_BStC)) then + LB(1:2) = lbound(MiscData%u_BStC) + UB(1:2) = ubound(MiscData%u_BStC) do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%BStCLoadMesh(i1,i2), ErrStat2, ErrMsg2) + call StC_DestroyInput(MiscData%u_BStC(i1,i2), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do end do - deallocate(OutputData%BStCLoadMesh) + deallocate(MiscData%u_BStC) end if - if (allocated(OutputData%NStCLoadMesh)) then - LB(1:1) = lbound(OutputData%NStCLoadMesh) - UB(1:1) = ubound(OutputData%NStCLoadMesh) + if (allocated(MiscData%u_NStC)) then + LB(1:2) = lbound(MiscData%u_NStC) + UB(1:2) = ubound(MiscData%u_NStC) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_DestroyInput(MiscData%u_NStC(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(MiscData%u_NStC) + end if + if (allocated(MiscData%u_TStC)) then + LB(1:2) = lbound(MiscData%u_TStC) + UB(1:2) = ubound(MiscData%u_TStC) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_DestroyInput(MiscData%u_TStC(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(MiscData%u_TStC) + end if + if (allocated(MiscData%u_SStC)) then + LB(1:2) = lbound(MiscData%u_SStC) + UB(1:2) = ubound(MiscData%u_SStC) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_DestroyInput(MiscData%u_SStC(i1,i2), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + end do + deallocate(MiscData%u_SStC) + end if + if (allocated(MiscData%y_BStC)) then + LB(1:1) = lbound(MiscData%y_BStC) + UB(1:1) = ubound(MiscData%y_BStC) do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%NStCLoadMesh(i1), ErrStat2, ErrMsg2) + call StC_DestroyOutput(MiscData%y_BStC(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%NStCLoadMesh) + deallocate(MiscData%y_BStC) end if - if (allocated(OutputData%TStCLoadMesh)) then - LB(1:1) = lbound(OutputData%TStCLoadMesh) - UB(1:1) = ubound(OutputData%TStCLoadMesh) + if (allocated(MiscData%y_NStC)) then + LB(1:1) = lbound(MiscData%y_NStC) + UB(1:1) = ubound(MiscData%y_NStC) do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%TStCLoadMesh(i1), ErrStat2, ErrMsg2) + call StC_DestroyOutput(MiscData%y_NStC(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%TStCLoadMesh) + deallocate(MiscData%y_NStC) end if - if (allocated(OutputData%SStCLoadMesh)) then - LB(1:1) = lbound(OutputData%SStCLoadMesh) - UB(1:1) = ubound(OutputData%SStCLoadMesh) + if (allocated(MiscData%y_TStC)) then + LB(1:1) = lbound(MiscData%y_TStC) + UB(1:1) = ubound(MiscData%y_TStC) do i1 = LB(1), UB(1) - call MeshDestroy( OutputData%SStCLoadMesh(i1), ErrStat2, ErrMsg2) + call StC_DestroyOutput(MiscData%y_TStC(i1), ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end do - deallocate(OutputData%SStCLoadMesh) + deallocate(MiscData%y_TStC) + end if + if (allocated(MiscData%y_SStC)) then + LB(1:1) = lbound(MiscData%y_SStC) + UB(1:1) = ubound(MiscData%y_SStC) + do i1 = LB(1), UB(1) + call StC_DestroyOutput(MiscData%y_SStC(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%y_SStC) end if + call SrvD_DestroyModuleMapType(MiscData%SrvD_MeshMap, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SrvD_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SrvD_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SrvD_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SrvD_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine -subroutine SrvD_PackOutput(RF, Indata) +subroutine SrvD_PackMisc(RF, Indata) type(RegFile), intent(inout) :: RF - type(SrvD_OutputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'SrvD_PackOutput' + type(SrvD_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SrvD_PackMisc' integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%WriteOutput) - call RegPackAlloc(RF, InData%BlPitchCom) - call RegPackAlloc(RF, InData%BlAirfoilCom) - call RegPack(RF, InData%YawMom) - call RegPack(RF, InData%YawPosCom) - call RegPack(RF, InData%YawRateCom) - call RegPack(RF, InData%GenTrq) - call RegPack(RF, InData%HSSBrTrqC) - call RegPack(RF, InData%ElecPwr) - call RegPackAlloc(RF, InData%TBDrCon) - call RegPackAlloc(RF, InData%CableDeltaL) - call RegPackAlloc(RF, InData%CableDeltaLdot) - call RegPack(RF, allocated(InData%BStCLoadMesh)) - if (allocated(InData%BStCLoadMesh)) then - call RegPackBounds(RF, 2, lbound(InData%BStCLoadMesh), ubound(InData%BStCLoadMesh)) - LB(1:2) = lbound(InData%BStCLoadMesh) - UB(1:2) = ubound(InData%BStCLoadMesh) + call RegPack(RF, InData%LastTimeCalled) + call SrvD_PackBladedDLLType(RF, InData%dll_data) + call RegPack(RF, InData%FirstWarn) + call RegPack(RF, InData%LastTimeFiltered) + call RegPackAlloc(RF, InData%xd_BlPitchFilter) + call RegPackAlloc(RF, InData%xd_BlPRateFilter) + call RegPack(RF, allocated(InData%BStC)) + if (allocated(InData%BStC)) then + call RegPackBounds(RF, 1, lbound(InData%BStC), ubound(InData%BStC)) + LB(1:1) = lbound(InData%BStC) + UB(1:1) = ubound(InData%BStC) + do i1 = LB(1), UB(1) + call StC_PackMisc(RF, InData%BStC(i1)) + end do + end if + call RegPack(RF, allocated(InData%NStC)) + if (allocated(InData%NStC)) then + call RegPackBounds(RF, 1, lbound(InData%NStC), ubound(InData%NStC)) + LB(1:1) = lbound(InData%NStC) + UB(1:1) = ubound(InData%NStC) + do i1 = LB(1), UB(1) + call StC_PackMisc(RF, InData%NStC(i1)) + end do + end if + call RegPack(RF, allocated(InData%TStC)) + if (allocated(InData%TStC)) then + call RegPackBounds(RF, 1, lbound(InData%TStC), ubound(InData%TStC)) + LB(1:1) = lbound(InData%TStC) + UB(1:1) = ubound(InData%TStC) + do i1 = LB(1), UB(1) + call StC_PackMisc(RF, InData%TStC(i1)) + end do + end if + call RegPack(RF, allocated(InData%SStC)) + if (allocated(InData%SStC)) then + call RegPackBounds(RF, 1, lbound(InData%SStC), ubound(InData%SStC)) + LB(1:1) = lbound(InData%SStC) + UB(1:1) = ubound(InData%SStC) + do i1 = LB(1), UB(1) + call StC_PackMisc(RF, InData%SStC(i1)) + end do + end if + call RegPack(RF, allocated(InData%u_BStC)) + if (allocated(InData%u_BStC)) then + call RegPackBounds(RF, 2, lbound(InData%u_BStC), ubound(InData%u_BStC)) + LB(1:2) = lbound(InData%u_BStC) + UB(1:2) = ubound(InData%u_BStC) do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%BStCLoadMesh(i1,i2)) + call StC_PackInput(RF, InData%u_BStC(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%u_NStC)) + if (allocated(InData%u_NStC)) then + call RegPackBounds(RF, 2, lbound(InData%u_NStC), ubound(InData%u_NStC)) + LB(1:2) = lbound(InData%u_NStC) + UB(1:2) = ubound(InData%u_NStC) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_PackInput(RF, InData%u_NStC(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%u_TStC)) + if (allocated(InData%u_TStC)) then + call RegPackBounds(RF, 2, lbound(InData%u_TStC), ubound(InData%u_TStC)) + LB(1:2) = lbound(InData%u_TStC) + UB(1:2) = ubound(InData%u_TStC) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_PackInput(RF, InData%u_TStC(i1,i2)) + end do + end do + end if + call RegPack(RF, allocated(InData%u_SStC)) + if (allocated(InData%u_SStC)) then + call RegPackBounds(RF, 2, lbound(InData%u_SStC), ubound(InData%u_SStC)) + LB(1:2) = lbound(InData%u_SStC) + UB(1:2) = ubound(InData%u_SStC) + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_PackInput(RF, InData%u_SStC(i1,i2)) end do end do end if - call RegPack(RF, allocated(InData%NStCLoadMesh)) - if (allocated(InData%NStCLoadMesh)) then - call RegPackBounds(RF, 1, lbound(InData%NStCLoadMesh), ubound(InData%NStCLoadMesh)) - LB(1:1) = lbound(InData%NStCLoadMesh) - UB(1:1) = ubound(InData%NStCLoadMesh) + call RegPack(RF, allocated(InData%y_BStC)) + if (allocated(InData%y_BStC)) then + call RegPackBounds(RF, 1, lbound(InData%y_BStC), ubound(InData%y_BStC)) + LB(1:1) = lbound(InData%y_BStC) + UB(1:1) = ubound(InData%y_BStC) + do i1 = LB(1), UB(1) + call StC_PackOutput(RF, InData%y_BStC(i1)) + end do + end if + call RegPack(RF, allocated(InData%y_NStC)) + if (allocated(InData%y_NStC)) then + call RegPackBounds(RF, 1, lbound(InData%y_NStC), ubound(InData%y_NStC)) + LB(1:1) = lbound(InData%y_NStC) + UB(1:1) = ubound(InData%y_NStC) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%NStCLoadMesh(i1)) + call StC_PackOutput(RF, InData%y_NStC(i1)) end do end if - call RegPack(RF, allocated(InData%TStCLoadMesh)) - if (allocated(InData%TStCLoadMesh)) then - call RegPackBounds(RF, 1, lbound(InData%TStCLoadMesh), ubound(InData%TStCLoadMesh)) - LB(1:1) = lbound(InData%TStCLoadMesh) - UB(1:1) = ubound(InData%TStCLoadMesh) + call RegPack(RF, allocated(InData%y_TStC)) + if (allocated(InData%y_TStC)) then + call RegPackBounds(RF, 1, lbound(InData%y_TStC), ubound(InData%y_TStC)) + LB(1:1) = lbound(InData%y_TStC) + UB(1:1) = ubound(InData%y_TStC) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%TStCLoadMesh(i1)) + call StC_PackOutput(RF, InData%y_TStC(i1)) end do end if - call RegPack(RF, allocated(InData%SStCLoadMesh)) - if (allocated(InData%SStCLoadMesh)) then - call RegPackBounds(RF, 1, lbound(InData%SStCLoadMesh), ubound(InData%SStCLoadMesh)) - LB(1:1) = lbound(InData%SStCLoadMesh) - UB(1:1) = ubound(InData%SStCLoadMesh) + call RegPack(RF, allocated(InData%y_SStC)) + if (allocated(InData%y_SStC)) then + call RegPackBounds(RF, 1, lbound(InData%y_SStC), ubound(InData%y_SStC)) + LB(1:1) = lbound(InData%y_SStC) + UB(1:1) = ubound(InData%y_SStC) do i1 = LB(1), UB(1) - call MeshPack(RF, InData%SStCLoadMesh(i1)) + call StC_PackOutput(RF, InData%y_SStC(i1)) end do end if + call SrvD_PackModuleMapType(RF, InData%SrvD_MeshMap) + call RegPack(RF, InData%PrevTstepNcall) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call SrvD_PackContState(RF, InData%x_perturb) + call SrvD_PackContState(RF, InData%dxdt_lin) + call SrvD_PackInput(RF, InData%u_perturb) + call SrvD_PackOutput(RF, InData%y_lin) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine SrvD_UnPackOutput(RF, OutData) +subroutine SrvD_UnPackMisc(RF, OutData) type(RegFile), intent(inout) :: RF - type(SrvD_OutputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SrvD_UnPackOutput' + type(SrvD_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SrvD_UnPackMisc' integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlPitchCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%BlAirfoilCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawMom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawPosCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%YawRateCom); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%GenTrq); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%HSSBrTrqC); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%ElecPwr); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%TBDrCon); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%CableDeltaL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%CableDeltaLdot); if (RegCheckErr(RF, RoutineName)) return - if (allocated(OutData%BStCLoadMesh)) deallocate(OutData%BStCLoadMesh) + call RegUnpack(RF, OutData%LastTimeCalled); if (RegCheckErr(RF, RoutineName)) return + call SrvD_UnpackBladedDLLType(RF, OutData%dll_data) ! dll_data + call RegUnpack(RF, OutData%FirstWarn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LastTimeFiltered); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%xd_BlPitchFilter); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%xd_BlPRateFilter); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%BStC)) deallocate(OutData%BStC) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%BStC(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call StC_UnpackMisc(RF, OutData%BStC(i1)) ! BStC + end do + end if + if (allocated(OutData%NStC)) deallocate(OutData%NStC) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%NStC(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%NStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call StC_UnpackMisc(RF, OutData%NStC(i1)) ! NStC + end do + end if + if (allocated(OutData%TStC)) deallocate(OutData%TStC) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%TStC(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%TStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call StC_UnpackMisc(RF, OutData%TStC(i1)) ! TStC + end do + end if + if (allocated(OutData%SStC)) deallocate(OutData%SStC) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%SStC(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call StC_UnpackMisc(RF, OutData%SStC(i1)) ! SStC + end do + end if + if (allocated(OutData%u_BStC)) deallocate(OutData%u_BStC) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%BStCLoadMesh(LB(1):UB(1),LB(2):UB(2)),stat=stat) + allocate(OutData%u_BStC(LB(1):UB(1),LB(2):UB(2)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%BStCLoadMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_BStC.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i2 = LB(2), UB(2) do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%BStCLoadMesh(i1,i2)) ! BStCLoadMesh + call StC_UnpackInput(RF, OutData%u_BStC(i1,i2)) ! u_BStC end do end do end if - if (allocated(OutData%NStCLoadMesh)) deallocate(OutData%NStCLoadMesh) + if (allocated(OutData%u_NStC)) deallocate(OutData%u_NStC) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%u_NStC(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_NStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_UnpackInput(RF, OutData%u_NStC(i1,i2)) ! u_NStC + end do + end do + end if + if (allocated(OutData%u_TStC)) deallocate(OutData%u_TStC) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%u_TStC(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_TStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_UnpackInput(RF, OutData%u_TStC(i1,i2)) ! u_TStC + end do + end do + end if + if (allocated(OutData%u_SStC)) deallocate(OutData%u_SStC) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 2, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%u_SStC(LB(1):UB(1),LB(2):UB(2)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%u_SStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i2 = LB(2), UB(2) + do i1 = LB(1), UB(1) + call StC_UnpackInput(RF, OutData%u_SStC(i1,i2)) ! u_SStC + end do + end do + end if + if (allocated(OutData%y_BStC)) deallocate(OutData%y_BStC) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%NStCLoadMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%y_BStC(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%NStCLoadMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_BStC.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%NStCLoadMesh(i1)) ! NStCLoadMesh + call StC_UnpackOutput(RF, OutData%y_BStC(i1)) ! y_BStC end do end if - if (allocated(OutData%TStCLoadMesh)) deallocate(OutData%TStCLoadMesh) + if (allocated(OutData%y_NStC)) deallocate(OutData%y_NStC) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%TStCLoadMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%y_NStC(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%TStCLoadMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_NStC.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%TStCLoadMesh(i1)) ! TStCLoadMesh + call StC_UnpackOutput(RF, OutData%y_NStC(i1)) ! y_NStC end do end if - if (allocated(OutData%SStCLoadMesh)) deallocate(OutData%SStCLoadMesh) + if (allocated(OutData%y_TStC)) deallocate(OutData%y_TStC) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return - allocate(OutData%SStCLoadMesh(LB(1):UB(1)),stat=stat) + allocate(OutData%y_TStC(LB(1):UB(1)),stat=stat) if (stat /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating OutData%SStCLoadMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_TStC.', RF%ErrStat, RF%ErrMsg, RoutineName) return end if do i1 = LB(1), UB(1) - call MeshUnpack(RF, OutData%SStCLoadMesh(i1)) ! SStCLoadMesh + call StC_UnpackOutput(RF, OutData%y_TStC(i1)) ! y_TStC end do end if + if (allocated(OutData%y_SStC)) deallocate(OutData%y_SStC) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%y_SStC(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%y_SStC.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call StC_UnpackOutput(RF, OutData%y_SStC(i1)) ! y_SStC + end do + end if + call SrvD_UnpackModuleMapType(RF, OutData%SrvD_MeshMap) ! SrvD_MeshMap + call RegUnpack(RF, OutData%PrevTstepNcall); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call SrvD_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call SrvD_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call SrvD_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call SrvD_UnpackOutput(RF, OutData%y_lin) ! y_lin end subroutine subroutine SrvD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -6274,6 +6241,9 @@ SUBROUTINE SrvD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg CALL Angles_ExtrapInterp( u1%BlPitch(i1), u2%BlPitch(i1), tin, u_out%BlPitch(i1), tin_out ) END DO END IF ! check if allocated + IF (ALLOCATED(u_out%BlPRate) .AND. ALLOCATED(u1%BlPRate)) THEN + u_out%BlPRate = a1*u1%BlPRate + a2*u2%BlPRate + END IF ! check if allocated CALL Angles_ExtrapInterp( u1%Yaw, u2%Yaw, tin, u_out%Yaw, tin_out ) u_out%YawRate = a1*u1%YawRate + a2*u2%YawRate u_out%LSS_Spd = a1*u1%LSS_Spd + a2*u2%LSS_Spd @@ -6426,6 +6396,9 @@ SUBROUTINE SrvD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, Er CALL Angles_ExtrapInterp( u1%BlPitch(i1), u2%BlPitch(i1), u3%BlPitch(i1), tin, u_out%BlPitch(i1), tin_out ) END DO END IF ! check if allocated + IF (ALLOCATED(u_out%BlPRate) .AND. ALLOCATED(u1%BlPRate)) THEN + u_out%BlPRate = a1*u1%BlPRate + a2*u2%BlPRate + a3*u3%BlPRate + END IF ! check if allocated CALL Angles_ExtrapInterp( u1%Yaw, u2%Yaw, u3%Yaw, tin, u_out%Yaw, tin_out ) u_out%YawRate = a1*u1%YawRate + a2*u2%YawRate + a3*u3%YawRate u_out%LSS_Spd = a1*u1%LSS_Spd + a2*u2%LSS_Spd + a3*u3%LSS_Spd @@ -6618,11 +6591,17 @@ SUBROUTINE SrvD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMs IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput END IF ! check if allocated + IF (ALLOCATED(y_out%BlPitchMom) .AND. ALLOCATED(y1%BlPitchMom)) THEN + y_out%BlPitchMom = a1*y1%BlPitchMom + a2*y2%BlPitchMom + END IF ! check if allocated IF (ALLOCATED(y_out%BlPitchCom) .AND. ALLOCATED(y1%BlPitchCom)) THEN do i1 = lbound(y_out%BlPitchCom,1),ubound(y_out%BlPitchCom,1) CALL Angles_ExtrapInterp( y1%BlPitchCom(i1), y2%BlPitchCom(i1), tin, y_out%BlPitchCom(i1), tin_out ) END DO END IF ! check if allocated + IF (ALLOCATED(y_out%BlPRateCom) .AND. ALLOCATED(y1%BlPRateCom)) THEN + y_out%BlPRateCom = a1*y1%BlPRateCom + a2*y2%BlPRateCom + END IF ! check if allocated IF (ALLOCATED(y_out%BlAirfoilCom) .AND. ALLOCATED(y1%BlAirfoilCom)) THEN y_out%BlAirfoilCom = a1*y1%BlAirfoilCom + a2*y2%BlAirfoilCom END IF ! check if allocated @@ -6729,11 +6708,17 @@ SUBROUTINE SrvD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, E IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated + IF (ALLOCATED(y_out%BlPitchMom) .AND. ALLOCATED(y1%BlPitchMom)) THEN + y_out%BlPitchMom = a1*y1%BlPitchMom + a2*y2%BlPitchMom + a3*y3%BlPitchMom + END IF ! check if allocated IF (ALLOCATED(y_out%BlPitchCom) .AND. ALLOCATED(y1%BlPitchCom)) THEN do i1 = lbound(y_out%BlPitchCom,1),ubound(y_out%BlPitchCom,1) CALL Angles_ExtrapInterp( y1%BlPitchCom(i1), y2%BlPitchCom(i1), y3%BlPitchCom(i1), tin, y_out%BlPitchCom(i1), tin_out ) END DO END IF ! check if allocated + IF (ALLOCATED(y_out%BlPRateCom) .AND. ALLOCATED(y1%BlPRateCom)) THEN + y_out%BlPRateCom = a1*y1%BlPRateCom + a2*y2%BlPRateCom + a3*y3%BlPRateCom + END IF ! check if allocated IF (ALLOCATED(y_out%BlAirfoilCom) .AND. ALLOCATED(y1%BlAirfoilCom)) THEN y_out%BlAirfoilCom = a1*y1%BlAirfoilCom + a2*y2%BlAirfoilCom + a3*y3%BlAirfoilCom END IF ! check if allocated @@ -6779,5 +6764,660 @@ SUBROUTINE SrvD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, E END DO END IF ! check if allocated END SUBROUTINE + +function SrvD_InputMeshPointer(u, DL) result(Mesh) + type(SrvD_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (SrvD_u_PtfmMotionMesh) + Mesh => u%PtfmMotionMesh + case (SrvD_u_BStCMotionMesh) + Mesh => u%BStCMotionMesh(DL%i1, DL%i2) + case (SrvD_u_NStCMotionMesh) + Mesh => u%NStCMotionMesh(DL%i1) + case (SrvD_u_TStCMotionMesh) + Mesh => u%TStCMotionMesh(DL%i1) + case (SrvD_u_SStCMotionMesh) + Mesh => u%SStCMotionMesh(DL%i1) + end select +end function + +function SrvD_OutputMeshPointer(y, DL) result(Mesh) + type(SrvD_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (SrvD_y_BStCLoadMesh) + Mesh => y%BStCLoadMesh(DL%i1, DL%i2) + case (SrvD_y_NStCLoadMesh) + Mesh => y%NStCLoadMesh(DL%i1) + case (SrvD_y_TStCLoadMesh) + Mesh => y%TStCLoadMesh(DL%i1) + case (SrvD_y_SStCLoadMesh) + Mesh => y%SStCLoadMesh(DL%i1) + end select +end function + +subroutine SrvD_VarsPackContState(Vars, x, ValAry) + type(SrvD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SrvD_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SrvD_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SrvD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SrvD_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case (SrvD_x_BStC_StC_x) + VarVals = x%BStC(DL%i1)%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (SrvD_x_NStC_StC_x) + VarVals = x%NStC(DL%i1)%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (SrvD_x_TStC_StC_x) + VarVals = x%TStC(DL%i1)%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (SrvD_x_SStC_StC_x) + VarVals = x%SStC(DL%i1)%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SrvD_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SrvD_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SrvD_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine SrvD_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SrvD_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SrvD_x_DummyContState) + x%DummyContState = VarVals(1) ! Scalar + case (SrvD_x_BStC_StC_x) + x%BStC(DL%i1)%StC_x(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (SrvD_x_NStC_StC_x) + x%NStC(DL%i1)%StC_x(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (SrvD_x_TStC_StC_x) + x%TStC(DL%i1)%StC_x(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (SrvD_x_SStC_StC_x) + x%SStC(DL%i1)%StC_x(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function SrvD_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SrvD_x_DummyContState) + Name = "x%DummyContState" + case (SrvD_x_BStC_StC_x) + Name = "x%BStC("//trim(Num2LStr(DL%i1))//")%StC_x" + case (SrvD_x_NStC_StC_x) + Name = "x%NStC("//trim(Num2LStr(DL%i1))//")%StC_x" + case (SrvD_x_TStC_StC_x) + Name = "x%TStC("//trim(Num2LStr(DL%i1))//")%StC_x" + case (SrvD_x_SStC_StC_x) + Name = "x%SStC("//trim(Num2LStr(DL%i1))//")%StC_x" + case default + Name = "Unknown Field" + end select +end function + +subroutine SrvD_VarsPackContStateDeriv(Vars, x, ValAry) + type(SrvD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SrvD_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SrvD_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SrvD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SrvD_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case (SrvD_x_BStC_StC_x) + VarVals = x%BStC(DL%i1)%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (SrvD_x_NStC_StC_x) + VarVals = x%NStC(DL%i1)%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (SrvD_x_TStC_StC_x) + VarVals = x%TStC(DL%i1)%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (SrvD_x_SStC_StC_x) + VarVals = x%SStC(DL%i1)%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SrvD_VarsPackInput(Vars, u, ValAry) + type(SrvD_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SrvD_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine SrvD_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(SrvD_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SrvD_u_BlPitch) + VarVals = u%BlPitch(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_BlPRate) + VarVals = u%BlPRate(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_Yaw) + VarVals(1) = u%Yaw ! Scalar + case (SrvD_u_YawRate) + VarVals(1) = u%YawRate ! Scalar + case (SrvD_u_LSS_Spd) + VarVals(1) = u%LSS_Spd ! Scalar + case (SrvD_u_HSS_Spd) + VarVals(1) = u%HSS_Spd ! Scalar + case (SrvD_u_RotSpeed) + VarVals(1) = u%RotSpeed ! Scalar + case (SrvD_u_ExternalYawPosCom) + VarVals(1) = u%ExternalYawPosCom ! Scalar + case (SrvD_u_ExternalYawRateCom) + VarVals(1) = u%ExternalYawRateCom ! Scalar + case (SrvD_u_ExternalBlPitchCom) + VarVals = u%ExternalBlPitchCom(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_ExternalGenTrq) + VarVals(1) = u%ExternalGenTrq ! Scalar + case (SrvD_u_ExternalElecPwr) + VarVals(1) = u%ExternalElecPwr ! Scalar + case (SrvD_u_ExternalHSSBrFrac) + VarVals(1) = u%ExternalHSSBrFrac ! Scalar + case (SrvD_u_ExternalBlAirfoilCom) + VarVals = u%ExternalBlAirfoilCom(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_ExternalCableDeltaL) + VarVals = u%ExternalCableDeltaL(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_ExternalCableDeltaLdot) + VarVals = u%ExternalCableDeltaLdot(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_TwrAccel) + VarVals(1) = u%TwrAccel ! Scalar + case (SrvD_u_YawErr) + VarVals(1) = u%YawErr ! Scalar + case (SrvD_u_WindDir) + VarVals(1) = u%WindDir ! Scalar + case (SrvD_u_RootMyc) + VarVals = u%RootMyc(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_YawBrTAxp) + VarVals(1) = u%YawBrTAxp ! Scalar + case (SrvD_u_YawBrTAyp) + VarVals(1) = u%YawBrTAyp ! Scalar + case (SrvD_u_LSSTipPxa) + VarVals(1) = u%LSSTipPxa ! Scalar + case (SrvD_u_RootMxc) + VarVals = u%RootMxc(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_LSSTipMxa) + VarVals(1) = u%LSSTipMxa ! Scalar + case (SrvD_u_LSSTipMya) + VarVals(1) = u%LSSTipMya ! Scalar + case (SrvD_u_LSSTipMza) + VarVals(1) = u%LSSTipMza ! Scalar + case (SrvD_u_LSSTipMys) + VarVals(1) = u%LSSTipMys ! Scalar + case (SrvD_u_LSSTipMzs) + VarVals(1) = u%LSSTipMzs ! Scalar + case (SrvD_u_YawBrMyn) + VarVals(1) = u%YawBrMyn ! Scalar + case (SrvD_u_YawBrMzn) + VarVals(1) = u%YawBrMzn ! Scalar + case (SrvD_u_NcIMURAxs) + VarVals(1) = u%NcIMURAxs ! Scalar + case (SrvD_u_NcIMURAys) + VarVals(1) = u%NcIMURAys ! Scalar + case (SrvD_u_NcIMURAzs) + VarVals(1) = u%NcIMURAzs ! Scalar + case (SrvD_u_RotPwr) + VarVals(1) = u%RotPwr ! Scalar + case (SrvD_u_HorWindV) + VarVals(1) = u%HorWindV ! Scalar + case (SrvD_u_YawAngle) + VarVals(1) = u%YawAngle ! Scalar + case (SrvD_u_LSShftFxa) + VarVals(1) = u%LSShftFxa ! Scalar + case (SrvD_u_LSShftFys) + VarVals(1) = u%LSShftFys ! Scalar + case (SrvD_u_LSShftFzs) + VarVals(1) = u%LSShftFzs ! Scalar + case (SrvD_u_PtfmMotionMesh) + call MV_PackMesh(V, u%PtfmMotionMesh, ValAry) ! Mesh + case (SrvD_u_BStCMotionMesh) + call MV_PackMesh(V, u%BStCMotionMesh(DL%i1, DL%i2), ValAry) ! Mesh + case (SrvD_u_NStCMotionMesh) + call MV_PackMesh(V, u%NStCMotionMesh(DL%i1), ValAry) ! Mesh + case (SrvD_u_TStCMotionMesh) + call MV_PackMesh(V, u%TStCMotionMesh(DL%i1), ValAry) ! Mesh + case (SrvD_u_SStCMotionMesh) + call MV_PackMesh(V, u%SStCMotionMesh(DL%i1), ValAry) ! Mesh + case (SrvD_u_LidSpeed) + VarVals = u%LidSpeed(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_MsrPositionsX) + VarVals = u%MsrPositionsX(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_MsrPositionsY) + VarVals = u%MsrPositionsY(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_u_MsrPositionsZ) + VarVals = u%MsrPositionsZ(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SrvD_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SrvD_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SrvD_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine SrvD_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SrvD_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SrvD_u_BlPitch) + u%BlPitch(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_BlPRate) + u%BlPRate(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_Yaw) + u%Yaw = VarVals(1) ! Scalar + case (SrvD_u_YawRate) + u%YawRate = VarVals(1) ! Scalar + case (SrvD_u_LSS_Spd) + u%LSS_Spd = VarVals(1) ! Scalar + case (SrvD_u_HSS_Spd) + u%HSS_Spd = VarVals(1) ! Scalar + case (SrvD_u_RotSpeed) + u%RotSpeed = VarVals(1) ! Scalar + case (SrvD_u_ExternalYawPosCom) + u%ExternalYawPosCom = VarVals(1) ! Scalar + case (SrvD_u_ExternalYawRateCom) + u%ExternalYawRateCom = VarVals(1) ! Scalar + case (SrvD_u_ExternalBlPitchCom) + u%ExternalBlPitchCom(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_ExternalGenTrq) + u%ExternalGenTrq = VarVals(1) ! Scalar + case (SrvD_u_ExternalElecPwr) + u%ExternalElecPwr = VarVals(1) ! Scalar + case (SrvD_u_ExternalHSSBrFrac) + u%ExternalHSSBrFrac = VarVals(1) ! Scalar + case (SrvD_u_ExternalBlAirfoilCom) + u%ExternalBlAirfoilCom(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_ExternalCableDeltaL) + u%ExternalCableDeltaL(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_ExternalCableDeltaLdot) + u%ExternalCableDeltaLdot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_TwrAccel) + u%TwrAccel = VarVals(1) ! Scalar + case (SrvD_u_YawErr) + u%YawErr = VarVals(1) ! Scalar + case (SrvD_u_WindDir) + u%WindDir = VarVals(1) ! Scalar + case (SrvD_u_RootMyc) + u%RootMyc(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_YawBrTAxp) + u%YawBrTAxp = VarVals(1) ! Scalar + case (SrvD_u_YawBrTAyp) + u%YawBrTAyp = VarVals(1) ! Scalar + case (SrvD_u_LSSTipPxa) + u%LSSTipPxa = VarVals(1) ! Scalar + case (SrvD_u_RootMxc) + u%RootMxc(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_LSSTipMxa) + u%LSSTipMxa = VarVals(1) ! Scalar + case (SrvD_u_LSSTipMya) + u%LSSTipMya = VarVals(1) ! Scalar + case (SrvD_u_LSSTipMza) + u%LSSTipMza = VarVals(1) ! Scalar + case (SrvD_u_LSSTipMys) + u%LSSTipMys = VarVals(1) ! Scalar + case (SrvD_u_LSSTipMzs) + u%LSSTipMzs = VarVals(1) ! Scalar + case (SrvD_u_YawBrMyn) + u%YawBrMyn = VarVals(1) ! Scalar + case (SrvD_u_YawBrMzn) + u%YawBrMzn = VarVals(1) ! Scalar + case (SrvD_u_NcIMURAxs) + u%NcIMURAxs = VarVals(1) ! Scalar + case (SrvD_u_NcIMURAys) + u%NcIMURAys = VarVals(1) ! Scalar + case (SrvD_u_NcIMURAzs) + u%NcIMURAzs = VarVals(1) ! Scalar + case (SrvD_u_RotPwr) + u%RotPwr = VarVals(1) ! Scalar + case (SrvD_u_HorWindV) + u%HorWindV = VarVals(1) ! Scalar + case (SrvD_u_YawAngle) + u%YawAngle = VarVals(1) ! Scalar + case (SrvD_u_LSShftFxa) + u%LSShftFxa = VarVals(1) ! Scalar + case (SrvD_u_LSShftFys) + u%LSShftFys = VarVals(1) ! Scalar + case (SrvD_u_LSShftFzs) + u%LSShftFzs = VarVals(1) ! Scalar + case (SrvD_u_PtfmMotionMesh) + call MV_UnpackMesh(V, ValAry, u%PtfmMotionMesh) ! Mesh + case (SrvD_u_BStCMotionMesh) + call MV_UnpackMesh(V, ValAry, u%BStCMotionMesh(DL%i1, DL%i2)) ! Mesh + case (SrvD_u_NStCMotionMesh) + call MV_UnpackMesh(V, ValAry, u%NStCMotionMesh(DL%i1)) ! Mesh + case (SrvD_u_TStCMotionMesh) + call MV_UnpackMesh(V, ValAry, u%TStCMotionMesh(DL%i1)) ! Mesh + case (SrvD_u_SStCMotionMesh) + call MV_UnpackMesh(V, ValAry, u%SStCMotionMesh(DL%i1)) ! Mesh + case (SrvD_u_LidSpeed) + u%LidSpeed(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_MsrPositionsX) + u%MsrPositionsX(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_MsrPositionsY) + u%MsrPositionsY(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_u_MsrPositionsZ) + u%MsrPositionsZ(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SrvD_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SrvD_u_BlPitch) + Name = "u%BlPitch" + case (SrvD_u_BlPRate) + Name = "u%BlPRate" + case (SrvD_u_Yaw) + Name = "u%Yaw" + case (SrvD_u_YawRate) + Name = "u%YawRate" + case (SrvD_u_LSS_Spd) + Name = "u%LSS_Spd" + case (SrvD_u_HSS_Spd) + Name = "u%HSS_Spd" + case (SrvD_u_RotSpeed) + Name = "u%RotSpeed" + case (SrvD_u_ExternalYawPosCom) + Name = "u%ExternalYawPosCom" + case (SrvD_u_ExternalYawRateCom) + Name = "u%ExternalYawRateCom" + case (SrvD_u_ExternalBlPitchCom) + Name = "u%ExternalBlPitchCom" + case (SrvD_u_ExternalGenTrq) + Name = "u%ExternalGenTrq" + case (SrvD_u_ExternalElecPwr) + Name = "u%ExternalElecPwr" + case (SrvD_u_ExternalHSSBrFrac) + Name = "u%ExternalHSSBrFrac" + case (SrvD_u_ExternalBlAirfoilCom) + Name = "u%ExternalBlAirfoilCom" + case (SrvD_u_ExternalCableDeltaL) + Name = "u%ExternalCableDeltaL" + case (SrvD_u_ExternalCableDeltaLdot) + Name = "u%ExternalCableDeltaLdot" + case (SrvD_u_TwrAccel) + Name = "u%TwrAccel" + case (SrvD_u_YawErr) + Name = "u%YawErr" + case (SrvD_u_WindDir) + Name = "u%WindDir" + case (SrvD_u_RootMyc) + Name = "u%RootMyc" + case (SrvD_u_YawBrTAxp) + Name = "u%YawBrTAxp" + case (SrvD_u_YawBrTAyp) + Name = "u%YawBrTAyp" + case (SrvD_u_LSSTipPxa) + Name = "u%LSSTipPxa" + case (SrvD_u_RootMxc) + Name = "u%RootMxc" + case (SrvD_u_LSSTipMxa) + Name = "u%LSSTipMxa" + case (SrvD_u_LSSTipMya) + Name = "u%LSSTipMya" + case (SrvD_u_LSSTipMza) + Name = "u%LSSTipMza" + case (SrvD_u_LSSTipMys) + Name = "u%LSSTipMys" + case (SrvD_u_LSSTipMzs) + Name = "u%LSSTipMzs" + case (SrvD_u_YawBrMyn) + Name = "u%YawBrMyn" + case (SrvD_u_YawBrMzn) + Name = "u%YawBrMzn" + case (SrvD_u_NcIMURAxs) + Name = "u%NcIMURAxs" + case (SrvD_u_NcIMURAys) + Name = "u%NcIMURAys" + case (SrvD_u_NcIMURAzs) + Name = "u%NcIMURAzs" + case (SrvD_u_RotPwr) + Name = "u%RotPwr" + case (SrvD_u_HorWindV) + Name = "u%HorWindV" + case (SrvD_u_YawAngle) + Name = "u%YawAngle" + case (SrvD_u_LSShftFxa) + Name = "u%LSShftFxa" + case (SrvD_u_LSShftFys) + Name = "u%LSShftFys" + case (SrvD_u_LSShftFzs) + Name = "u%LSShftFzs" + case (SrvD_u_PtfmMotionMesh) + Name = "u%PtfmMotionMesh" + case (SrvD_u_BStCMotionMesh) + Name = "u%BStCMotionMesh("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")" + case (SrvD_u_NStCMotionMesh) + Name = "u%NStCMotionMesh("//trim(Num2LStr(DL%i1))//")" + case (SrvD_u_TStCMotionMesh) + Name = "u%TStCMotionMesh("//trim(Num2LStr(DL%i1))//")" + case (SrvD_u_SStCMotionMesh) + Name = "u%SStCMotionMesh("//trim(Num2LStr(DL%i1))//")" + case (SrvD_u_LidSpeed) + Name = "u%LidSpeed" + case (SrvD_u_MsrPositionsX) + Name = "u%MsrPositionsX" + case (SrvD_u_MsrPositionsY) + Name = "u%MsrPositionsY" + case (SrvD_u_MsrPositionsZ) + Name = "u%MsrPositionsZ" + case default + Name = "Unknown Field" + end select +end function + +subroutine SrvD_VarsPackOutput(Vars, y, ValAry) + type(SrvD_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SrvD_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine SrvD_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(SrvD_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SrvD_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_y_BlPitchMom) + VarVals = y%BlPitchMom(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_y_BlPitchCom) + VarVals = y%BlPitchCom(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_y_BlPRateCom) + VarVals = y%BlPRateCom(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_y_BlAirfoilCom) + VarVals = y%BlAirfoilCom(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_y_YawMom) + VarVals(1) = y%YawMom ! Scalar + case (SrvD_y_YawPosCom) + VarVals(1) = y%YawPosCom ! Scalar + case (SrvD_y_YawRateCom) + VarVals(1) = y%YawRateCom ! Scalar + case (SrvD_y_GenTrq) + VarVals(1) = y%GenTrq ! Scalar + case (SrvD_y_HSSBrTrqC) + VarVals(1) = y%HSSBrTrqC ! Scalar + case (SrvD_y_ElecPwr) + VarVals(1) = y%ElecPwr ! Scalar + case (SrvD_y_TBDrCon) + VarVals = y%TBDrCon(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_y_CableDeltaL) + VarVals = y%CableDeltaL(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_y_CableDeltaLdot) + VarVals = y%CableDeltaLdot(V%iLB:V%iUB) ! Rank 1 Array + case (SrvD_y_BStCLoadMesh) + call MV_PackMesh(V, y%BStCLoadMesh(DL%i1, DL%i2), ValAry) ! Mesh + case (SrvD_y_NStCLoadMesh) + call MV_PackMesh(V, y%NStCLoadMesh(DL%i1), ValAry) ! Mesh + case (SrvD_y_TStCLoadMesh) + call MV_PackMesh(V, y%TStCLoadMesh(DL%i1), ValAry) ! Mesh + case (SrvD_y_SStCLoadMesh) + call MV_PackMesh(V, y%SStCLoadMesh(DL%i1), ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SrvD_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SrvD_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SrvD_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine SrvD_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SrvD_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SrvD_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_y_BlPitchMom) + y%BlPitchMom(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_y_BlPitchCom) + y%BlPitchCom(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_y_BlPRateCom) + y%BlPRateCom(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_y_BlAirfoilCom) + y%BlAirfoilCom(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_y_YawMom) + y%YawMom = VarVals(1) ! Scalar + case (SrvD_y_YawPosCom) + y%YawPosCom = VarVals(1) ! Scalar + case (SrvD_y_YawRateCom) + y%YawRateCom = VarVals(1) ! Scalar + case (SrvD_y_GenTrq) + y%GenTrq = VarVals(1) ! Scalar + case (SrvD_y_HSSBrTrqC) + y%HSSBrTrqC = VarVals(1) ! Scalar + case (SrvD_y_ElecPwr) + y%ElecPwr = VarVals(1) ! Scalar + case (SrvD_y_TBDrCon) + y%TBDrCon(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_y_CableDeltaL) + y%CableDeltaL(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_y_CableDeltaLdot) + y%CableDeltaLdot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SrvD_y_BStCLoadMesh) + call MV_UnpackMesh(V, ValAry, y%BStCLoadMesh(DL%i1, DL%i2)) ! Mesh + case (SrvD_y_NStCLoadMesh) + call MV_UnpackMesh(V, ValAry, y%NStCLoadMesh(DL%i1)) ! Mesh + case (SrvD_y_TStCLoadMesh) + call MV_UnpackMesh(V, ValAry, y%TStCLoadMesh(DL%i1)) ! Mesh + case (SrvD_y_SStCLoadMesh) + call MV_UnpackMesh(V, ValAry, y%SStCLoadMesh(DL%i1)) ! Mesh + end select + end associate +end subroutine + +function SrvD_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SrvD_y_WriteOutput) + Name = "y%WriteOutput" + case (SrvD_y_BlPitchMom) + Name = "y%BlPitchMom" + case (SrvD_y_BlPitchCom) + Name = "y%BlPitchCom" + case (SrvD_y_BlPRateCom) + Name = "y%BlPRateCom" + case (SrvD_y_BlAirfoilCom) + Name = "y%BlAirfoilCom" + case (SrvD_y_YawMom) + Name = "y%YawMom" + case (SrvD_y_YawPosCom) + Name = "y%YawPosCom" + case (SrvD_y_YawRateCom) + Name = "y%YawRateCom" + case (SrvD_y_GenTrq) + Name = "y%GenTrq" + case (SrvD_y_HSSBrTrqC) + Name = "y%HSSBrTrqC" + case (SrvD_y_ElecPwr) + Name = "y%ElecPwr" + case (SrvD_y_TBDrCon) + Name = "y%TBDrCon" + case (SrvD_y_CableDeltaL) + Name = "y%CableDeltaL" + case (SrvD_y_CableDeltaLdot) + Name = "y%CableDeltaLdot" + case (SrvD_y_BStCLoadMesh) + Name = "y%BStCLoadMesh("//trim(Num2LStr(DL%i1))//", "//trim(Num2LStr(DL%i2))//")" + case (SrvD_y_NStCLoadMesh) + Name = "y%NStCLoadMesh("//trim(Num2LStr(DL%i1))//")" + case (SrvD_y_TStCLoadMesh) + Name = "y%TStCLoadMesh("//trim(Num2LStr(DL%i1))//")" + case (SrvD_y_SStCLoadMesh) + Name = "y%SStCLoadMesh("//trim(Num2LStr(DL%i1))//")" + case default + Name = "Unknown Field" + end select +end function + END MODULE ServoDyn_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/servodyn/src/StrucCtrl.f90 b/modules/servodyn/src/StrucCtrl.f90 index d559173750..0ffc852e5d 100644 --- a/modules/servodyn/src/StrucCtrl.f90 +++ b/modules/servodyn/src/StrucCtrl.f90 @@ -6,6 +6,7 @@ MODULE StrucCtrl USE StrucCtrl_Types USE NWTC_Library + USE UserSubs, ONLY: UserStC IMPLICIT NONE @@ -26,7 +27,7 @@ MODULE StrucCtrl ! continuous states, and updating discrete states PUBLIC :: StC_CalcOutput ! Routine for computing outputs - ! PUBLIC :: StC_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual + !PUBLIC :: StC_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual PUBLIC :: StC_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states !PUBLIC :: StC_UpdateDiscState ! Tight coupling routine for updating discrete states @@ -47,14 +48,17 @@ MODULE StrucCtrl INTEGER(IntKi), PRIVATE, PARAMETER :: ControlMode_NONE = 0 !< The (StC-universal) control code for not using a particular type of control INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_Indept = 1 !< independent DOFs - INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_Omni = 2 !< omni-directional - INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_TLCD = 3 !< tuned liquid column dampers !MEG & SP - INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_Prescribed = 4 !< prescribed force series - INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_ForceDLL = 5 !< prescribed force series + INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_Omni = 2 !< 2DOF omni-directional + INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_Omni3 = 3 !< 3DOF omni-directional + INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_TLCD = 5 !< tuned liquid column dampers !MEG & SP + INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_Prescribed = 6 !< prescribed force series + INTEGER(IntKi), PRIVATE, PARAMETER :: DOFMode_ForceDLL = 7 !< dll force series + INTEGER(IntKi), PRIVATE, PARAMETER :: CMODE_Semi = 1 !< semi-active control + INTEGER(IntKi), PRIVATE, PARAMETER :: CMODE_ActiveUsrSub = 3 !< active control based on user subroutine INTEGER(IntKi), PRIVATE, PARAMETER :: CMODE_ActiveEXTERN = 4 !< active control - INTEGER(IntKi), PRIVATE, PARAMETER :: CMODE_ActiveDLL = 5 !< active control + INTEGER(IntKi), PRIVATE, PARAMETER :: CMODE_ActiveDLL = 5 !< active control based on DLL INTEGER(IntKi), PRIVATE, PARAMETER :: SA_CMODE_GH_vel = 1 !< 1: velocity-based ground hook control; INTEGER(IntKi), PRIVATE, PARAMETER :: SA_CMODE_GH_invVel = 2 !< 2: Inverse velocity-based ground hook control @@ -102,7 +106,7 @@ SUBROUTINE StC_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu REAL(ReKi), allocatable, dimension(:,:) :: RefPosGlobal type(FileInfoType) :: FileInfo_In !< The derived type for holding the full input file for parsing -- we may pass this in the future - type(FileInfoType) :: FileInfo_In_PrescribeFrc !< The derived type for holding the prescribed forces input file for parsing -- we may pass this in the future + type(FileInfoType), allocatable :: FileInfo_In_PrescribeFrc(:) !< The derived type for holding the prescribed forces input file for parsing -- we may pass this in the future character(1024) :: PriPath !< Primary path integer(IntKi) :: UnEcho INTEGER(IntKi) :: ErrStat2 ! local error status @@ -152,21 +156,40 @@ SUBROUTINE StC_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu ! read in the prescribed forces file if ( InputFileData%StC_DOF_MODE == DOFMode_Prescribed ) then + allocate(FileInfo_In_PrescribeFrc(InitInp%NumMeshPts), STAT=ErrStat2 ) ! Blade TMD may have individual prescribed force input files for each blade instance + if (ErrStat2 /= ErrID_None) ErrMsg2="Error allocating FileInfo_In_PrescribeFrc(NumMeshPts)" + if (Failed()) return; if (InitInp%UseInputFile_PrescribeFrc) then ! Read the entire input file, minus any comment lines, into the FileInfo_In ! data structure in memory for further processing. - call ProcessComFile( InputFileData%PrescribedForcesFile, FileInfo_In_PrescribeFrc, ErrStat2, ErrMsg2 ) + do i=1,InitInp%NumMeshPts + call ProcessComFile( InputFileData%PrescribedForcesFile(i), FileInfo_In_PrescribeFrc(i), ErrStat2, ErrMsg2 ) + if (Failed()) return; + enddo else + ! Can't pass multipl prescribed forces files yet + if (InitInp%NumMeshPts > 1) then + ErrStat2 = ErrID_Fatal + ErrMsg2 = "Cannot use multiple passed prescribed forces input files with blade StCs yet" + if (Failed()) return; + else ! put passed string info into the FileInfo_In -- FileInfo structure - call NWTC_Library_CopyFileInfoType( InitInp%PassedPrescribeFrcData, FileInfo_In_PrescribeFrc, MESH_NEWCOPY, ErrStat2, ErrMsg2 ) + call NWTC_Library_CopyFileInfoType( InitInp%PassedPrescribeFrcData, FileInfo_In_PrescribeFrc(1), MESH_NEWCOPY, ErrStat2, ErrMsg2 ) + endif endif - if (Failed()) return; ! For diagnostic purposes, the following can be used to display the contents ! of the FileInfo_In data structure. - !call Print_FileInfo_Struct( CU, FileInfo_In_PrescribeFrc ) ! CU is the screen -- different number on different systems. + !do i=1,InitInp%NumMeshPts + ! call Print_FileInfo_Struct( CU, FileInfo_In_PrescribeFrc ) ! CU is the screen -- different number on different systems. + !enddo ! Parse the FileInfo_In_PrescribeFrc structure of data from the inputfile into the InitInp%InputFile structure - CALL StC_ParseTimeSeriesFileInfo( InputFileData%PrescribedForcesFile, FileInfo_In_PrescribeFrc, InputFileData, UnEcho, ErrStat2, ErrMsg2 ) - if (Failed()) return; + allocate(InputFileData%StC_PrescribedForce(InitInp%NumMeshPts), STAT=ErrStat2 ) ! Blade TMD may have individual prescribed force input files for each blade instance + if (ErrStat2 /= ErrID_None) ErrMsg2="Error allocating FileInfo_In_PrescribeFrc(NumMeshPts)" + if (Failed()) return; + do i=1,InitInp%NumMeshPts + CALL StC_ParseTimeSeriesFileInfo( InputFileData%PrescribedForcesFile(i), FileInfo_In_PrescribeFrc(i), InputFileData%StC_PrescribedForce(i), UnEcho, ErrStat2, ErrMsg2 ) + if (Failed()) return; + enddo endif !............................................................................................ @@ -198,7 +221,7 @@ SUBROUTINE StC_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu x%StC_x(2,i_pt) = 0 x%StC_x(3,i_pt) = InputFileData%StC_Y_DSP x%StC_x(4,i_pt) = 0 - if ((p%StC_DOF_MODE == DOFMode_Indept) .and. p%StC_Z_DOF) then ! Should be zero for omni and TLCD + if (((p%StC_DOF_MODE == DOFMode_Indept) .and. p%StC_Z_DOF) .or. (p%StC_DOF_MODE == DOFMode_Omni3)) then ! Should be zero for omni and TLCD x%StC_x(5,i_pt) = InputFileData%StC_Z_DSP else x%StC_x(5,i_pt) = 0.0_ReKi @@ -421,6 +444,7 @@ SUBROUTINE cleanup() if (UnEcho > 0) close(UnEcho) ! Close echo file if (allocated(RefPosGlobal )) deallocate(RefPosGlobal ) CALL StC_DestroyInputFile( InputFileData, ErrStat2, ErrMsg2) ! Ignore warnings here. + if (allocated(FileInfo_In_PrescribeFrc)) deallocate(FileInfo_In_PrescribeFrc) END SUBROUTINE cleanup !......................................... END SUBROUTINE StC_Init @@ -822,7 +846,7 @@ SUBROUTINE StC_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM m%M_P(3,i_pt) = - F_X_P(2) * x%StC_x(1,i_pt) + F_Y_P(1) * x%StC_x(3,i_pt) ! NOTE signs match document, but are changed from prior value ! forces and moments in global coordinates - y%Mesh(i_pt)%Force(:,1) = real(matmul(transpose(u%Mesh(i_pt)%Orientation(:,:,1)),m%F_P(1:3,i_pt)),ReKi) + y%Mesh(i_pt)%Force(:,1) = real(matmul(transpose(u%Mesh(i_pt)%Orientation(:,:,1)),m%F_P(1:3,i_pt)),ReKi) y%Mesh(i_pt)%Moment(:,1) = real(matmul(transpose(u%Mesh(i_pt)%Orientation(:,:,1)),m%M_P(1:3,i_pt)),ReKi) enddo @@ -832,9 +856,9 @@ SUBROUTINE StC_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM ! StrucCtrl external forces of dependent degrees: do i_pt=1,p%NumMeshPts - F_XY_P(1) = 0 - F_XY_P(2) = 0 - F_XY_P(3) = - p%M_XY * ( m%a_G(3,i_pt) - m%rddot_P(3,i_pt) & + F_XY_P(1) = 0.0_ReKi + F_XY_P(2) = 0.0_ReKi + F_XY_P(3) = - p%M_Omni * ( m%a_G(3,i_pt) - m%rddot_P(3,i_pt) & - (m%alpha_P(1,i_pt) + m%omega_P(2,i_pt)*m%omega_P(3,i_pt))*x%StC_x(3,i_pt) & + (m%alpha_P(2,i_pt) - m%omega_P(1,i_pt)*m%omega_P(3,i_pt))*x%StC_x(1,i_pt) & - 2*m%omega_P(1,i_pt)*x%StC_x(4,i_pt) & @@ -846,12 +870,29 @@ SUBROUTINE StC_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM m%F_P(2,i_pt) = m%K(2,i_pt) * x%StC_x(3,i_pt) + m%C_ctrl(2,i_pt) * x%StC_x(4,i_pt) + m%C_Brake(2,i_pt) * x%StC_x(4,i_pt) - m%F_stop(2,i_pt) - m%F_ext(2,i_pt) - m%F_fr(2,i_pt) - F_XY_P(2) + m%F_table(2,i_pt)*(m%F_k(2,i_pt)) m%F_P(3,i_pt) = - F_XY_P(3) - m%M_P(1,i_pt) = - F_XY_P(3) * x%StC_x(3,i_pt) - m%M_P(2,i_pt) = F_XY_P(3) * x%StC_x(1,i_pt) - m%M_P(3,i_pt) = - F_XY_P(1) * x%StC_x(3,i_pt) + F_XY_P(2) * x%StC_x(1,i_pt) + ! Compute M_P using F_P insteand in case the other load components can generate moments about P + m%M_P(1:3,i_pt) = cross_product( x%StC_x([1,3,5],i_pt), m%F_P(1:3,i_pt) ) ! forces and moments in global coordinates - y%Mesh(i_pt)%Force(:,1) = real(matmul(transpose(u%Mesh(i_pt)%Orientation(:,:,1)),m%F_P(1:3,i_pt)),ReKi) + y%Mesh(i_pt)%Force(:,1) = real(matmul(transpose(u%Mesh(i_pt)%Orientation(:,:,1)),m%F_P(1:3,i_pt)),ReKi) + y%Mesh(i_pt)%Moment(:,1) = real(matmul(transpose(u%Mesh(i_pt)%Orientation(:,:,1)),m%M_P(1:3,i_pt)),ReKi) + enddo + + ELSE IF (p%StC_DOF_MODE == DOFMode_Omni3) THEN + + !note: m%F_k is computed earlier in StC_CalcContStateDeriv + + ! StrucCtrl external forces of dependent degrees: + do i_pt=1,p%NumMeshPts + + ! forces and moments in local coordinates + m%F_P(1:3,i_pt) = m%K(1:3,i_pt) * x%StC_x([1,3,5],i_pt) + (m%C_ctrl(1:3,i_pt) + m%C_Brake(1:3,i_pt)) * x%StC_x([2,4,6],i_pt) & + - m%F_stop(1:3,i_pt) - m%F_ext(1:3,i_pt) - m%F_fr(1:3,i_pt) + m%F_table(1:3,i_pt)*(m%F_k(1:3,i_pt)) + m%F_P( 3,i_pt) = m%F_P( 3,i_pt) - p%StC_Z_PreLd + m%M_P(1:3,i_pt) = cross_product( x%StC_x([1,3,5],i_pt), m%F_P(1:3,i_pt) ) + + ! forces and moments in global coordinates + y%Mesh(i_pt)%Force(:,1) = real(matmul(transpose(u%Mesh(i_pt)%Orientation(:,:,1)),m%F_P(1:3,i_pt)),ReKi) y%Mesh(i_pt)%Moment(:,1) = real(matmul(transpose(u%Mesh(i_pt)%Orientation(:,:,1)),m%M_P(1:3,i_pt)),ReKi) enddo @@ -958,10 +999,12 @@ SUBROUTINE StC_CalcOutput( Time, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM ! Note that the prescribed force is applied the same to all Mesh pts ! that are passed into this instance of the StC do i=1,3 - ! Get interpolated force -- this is not in any particular coordinate system yet - m%F_P(i,:) = InterpStp( real(Time,ReKi), p%StC_PrescribedForce(1,:),p%StC_PrescribedForce(i+1,:),m%PrescribedInterpIdx, size(p%StC_PrescribedForce,2)) - ! Get interpolated moment -- this is not in any particular coordinate system yet - m%M_P(i,:) = InterpStp( real(Time,ReKi), p%StC_PrescribedForce(1,:),p%StC_PrescribedForce(i+4,:),m%PrescribedInterpIdx, size(p%StC_PrescribedForce,2)) + do i_pt=1,p%NumMeshPts + ! Get interpolated force -- this is not in any particular coordinate system yet + m%F_P(i,i_pt) = InterpStp( real(Time,ReKi), p%StC_PrescribedForce(i_pt)%data(1,:),p%StC_PrescribedForce(i_pt)%data(i+1,:),m%PrescribedInterpIdx, size(p%StC_PrescribedForce(i_pt)%data,2)) + ! Get interpolated moment -- this is not in any particular coordinate system yet + m%M_P(i,i_pt) = InterpStp( real(Time,ReKi), p%StC_PrescribedForce(i_pt)%data(1,:),p%StC_PrescribedForce(i_pt)%data(i+4,:),m%PrescribedInterpIdx, size(p%StC_PrescribedForce(i_pt)%data,2)) + enddo enddo if (p%PrescribedForcesCoordSys == PRESCRIBED_FORCE_GLOBAL) then ! Global coords @@ -1085,9 +1128,9 @@ SUBROUTINE StC_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, Er do i_pt=1,p%NumMeshPts ! Aggregate acceleration terms - m%Acc(1,i_pt) = - m%rddot_P(1,i_pt) + m%a_G(1,i_pt) + 1 / p%M_X * ( m%F_ext(1,i_pt) + m%F_stop(1,i_pt) - m%F_table(1,i_pt) ) - m%Acc(2,i_pt) = - m%rddot_P(2,i_pt) + m%a_G(2,i_pt) + 1 / p%M_Y * ( m%F_ext(2,i_pt) + m%F_stop(2,i_pt) - m%F_table(2,i_pt) ) - m%Acc(3,i_pt) = - m%rddot_P(3,i_pt) + m%a_G(3,i_pt) + 1 / p%M_Z * ( m%F_ext(3,i_pt) + m%F_stop(3,i_pt) - m%F_table(3,i_pt) + p%StC_Z_PreLd ) + m%Acc(1,i_pt) = - m%rddot_P(1,i_pt) + m%a_G(1,i_pt) + 1.0_ReKi / p%M_X * ( m%F_ext(1,i_pt) + m%F_stop(1,i_pt) - m%F_table(1,i_pt) ) + m%Acc(2,i_pt) = - m%rddot_P(2,i_pt) + m%a_G(2,i_pt) + 1.0_ReKi / p%M_Y * ( m%F_ext(2,i_pt) + m%F_stop(2,i_pt) - m%F_table(2,i_pt) ) + m%Acc(3,i_pt) = - m%rddot_P(3,i_pt) + m%a_G(3,i_pt) + 1.0_ReKi / p%M_Z * ( m%F_ext(3,i_pt) + m%F_stop(3,i_pt) - m%F_table(3,i_pt) + p%StC_Z_PreLd ) enddo ELSE IF (p%StC_DOF_MODE == DOFMode_Omni) THEN @@ -1095,20 +1138,33 @@ SUBROUTINE StC_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, Er do i_pt=1,p%NumMeshPts denom = SQRT(x%StC_x(1,i_pt)**2+x%StC_x(3,i_pt)**2) IF ( EqualRealNos( denom, 0.0_ReKi) ) THEN - m%F_k(1,i_pt) = 0.0 - m%F_k(2,i_pt) = 0.0 + m%F_k(1:2,i_pt) = 0.0_ReKi ELSE - m%F_k(1,i_pt) = x%StC_x(1,i_pt)/denom - m%F_k(2,i_pt) = x%StC_x(3,i_pt)/denom + m%F_k(1:2,i_pt) = x%StC_x([1,3],i_pt)/denom END IF - m%F_k(3,i_pt) = 0.0 + m%F_k(3,i_pt) = 0.0_ReKi ! Aggregate acceleration terms - m%Acc(1,i_pt) = - m%rddot_P(1,i_pt) + m%a_G(1,i_pt) + 1 / p%M_XY * ( m%F_ext(1,i_pt) + m%F_stop(1,i_pt) - m%F_table(1,i_pt)*(m%F_k(1,i_pt)) ) - m%Acc(2,i_pt) = - m%rddot_P(2,i_pt) + m%a_G(2,i_pt) + 1 / p%M_XY * ( m%F_ext(2,i_pt) + m%F_stop(2,i_pt) - m%F_table(2,i_pt)*(m%F_k(2,i_pt)) ) + m%Acc(1,i_pt) = - m%rddot_P(1,i_pt) + m%a_G(1,i_pt) + 1.0_ReKi / p%M_Omni * ( m%F_ext(1,i_pt) + m%F_stop(1,i_pt) - m%F_table(1,i_pt)*(m%F_k(1,i_pt)) ) + m%Acc(2,i_pt) = - m%rddot_P(2,i_pt) + m%a_G(2,i_pt) + 1.0_ReKi / p%M_Omni * ( m%F_ext(2,i_pt) + m%F_stop(2,i_pt) - m%F_table(2,i_pt)*(m%F_k(2,i_pt)) ) m%Acc(3,i_pt) = 0.0_ReKi enddo + ELSE IF (p%StC_DOF_MODE == DOFMode_Omni3) THEN + + do i_pt=1,p%NumMeshPts + denom = SQRT(x%StC_x(1,i_pt)**2+x%StC_x(3,i_pt)**2+x%StC_x(5,i_pt)**2) + IF ( EqualRealNos( denom, 0.0_ReKi) ) THEN + m%F_k(1:3,i_pt) = 0.0_ReKi + ELSE + m%F_k(1:3,i_pt) = x%StC_x([1,3,5],i_pt)/denom + END IF + + ! Aggregate acceleration terms (this is the difference between the absolute accelerations of the TMD and P in N frame) + m%Acc(1:3,i_pt) = - m%rddot_P(1:3,i_pt) + m%a_G(1:3,i_pt) + 1.0_ReKi / p%M_Omni * ( m%F_ext(1:3,i_pt) + m%F_stop(1:3,i_pt) - m%F_table(1:3,i_pt)*(m%F_k(1:3,i_pt)) ) + m%Acc( 3,i_pt) = m%Acc( 3,i_pt) + p%StC_Z_PreLd / p%M_Omni + enddo + ENDIF @@ -1150,7 +1206,8 @@ SUBROUTINE StC_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, Er enddo END IF - if ( .not. (p%StC_DOF_MODE == DOFMode_Indept .AND. p%StC_Z_DOF)) then ! z not used in any other configuration + if ( .not. ( (p%StC_DOF_MODE == DOFMode_Indept .AND. p%StC_Z_DOF) .or. (p%StC_DOF_MODE == DOFMode_Omni3) )) then + ! z not used in any other configuration do i_pt=1,p%NumMeshPts dxdt%StC_x(5,i_pt) = 0.0_ReKi enddo @@ -1169,7 +1226,7 @@ SUBROUTINE StC_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, Er ELSE IF (p%StC_CMODE == CMODE_Semi) THEN ! ground hook control CALL StC_GroundHookDamp(dxdt,x,u,p,m%rdisp_P,m%rdot_P,m%C_ctrl,m%C_Brake,m%F_fr) ELSE IF (p%StC_CMODE == CMODE_ActiveDLL) THEN ! Active control from DLL - call StC_ActiveCtrl_StiffDamp(u,p,m%K,m%C_ctrl,m%C_Brake,m%F_ext,m%M_ext) + call StC_ActiveCtrl_StiffDamp(u,x,p,m%K,m%C_ctrl,m%C_Brake,m%F_ext,m%M_ext) m%F_fr = 0.0_ReKi if (.not. p%Use_F_TBL) then K(1:3,:) = m%K(1:3,:) @@ -1183,6 +1240,12 @@ SUBROUTINE StC_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, Er ! K(1:3,i_pt) = m%F_table(1:3,i_pt) - m%K(1:3,i_pt) ! enddo endif + ELSE IF (p%StC_CMODE == CMODE_ActiveUsrSub) THEN ! Active control from user subroutine + call StC_ActiveCtrl_UsrSub(u,x,p,m%K,m%C_ctrl,m%C_Brake,m%F_ext,m%M_ext) + m%F_fr = 0.0_ReKi + if (.not. p%Use_F_TBL) then + K(1:3,:) = m%K(1:3,:) + endif END IF @@ -1229,21 +1292,36 @@ SUBROUTINE StC_CalcContStateDeriv( Time, u, p, x, xd, z, OtherState, m, dxdt, Er ELSE IF (p%StC_DOF_MODE == DOFMode_Omni) THEN ! Only includes X and Y ! Compute the first time derivatives of the continuous states of Omnidirectional tuned masse damper mode by sm 2015-0904 do i_pt=1,p%NumMeshPts - dxdt%StC_x(2,i_pt) = ( m%omega_P(2,i_pt)**2 + m%omega_P(3,i_pt)**2 - K(1,i_pt) / p%M_XY) * x%StC_x(1,i_pt) & - - ( m%C_ctrl( 1,i_pt)/p%M_XY ) * x%StC_x(2,i_pt) & - - ( m%C_Brake(1,i_pt)/p%M_XY ) * x%StC_x(2,i_pt) & - + m%Acc(1,i_pt) + 1/p%M_XY * ( m%F_fr(1,i_pt) ) & + dxdt%StC_x(2,i_pt) = ( m%omega_P(2,i_pt)**2 + m%omega_P(3,i_pt)**2 - K(1,i_pt) / p%M_Omni) * x%StC_x(1,i_pt) & + - ( m%C_ctrl( 1,i_pt)/p%M_Omni ) * x%StC_x(2,i_pt) & + - ( m%C_Brake(1,i_pt)/p%M_Omni ) * x%StC_x(2,i_pt) & + + m%Acc(1,i_pt) + 1/p%M_Omni * ( m%F_fr(1,i_pt) ) & - ( m%omega_P(1,i_pt)*m%omega_P(2,i_pt) - m%alpha_P(3,i_pt) ) * x%StC_x(3,i_pt) & +2 * m%omega_P(3,i_pt) * x%StC_x(4,i_pt) - dxdt%StC_x(4,i_pt) = ( m%omega_P(1,i_pt)**2 + m%omega_P(3,i_pt)**2 - K(2,i_pt) / p%M_XY) * x%StC_x(3,i_pt) & - - ( m%C_ctrl( 2,i_pt)/p%M_XY ) * x%StC_x(4,i_pt) & - - ( m%C_Brake(2,i_pt)/p%M_XY ) * x%StC_x(4,i_pt) & - + m%Acc(2,i_pt) + 1/p%M_XY * ( m%F_fr(2,i_pt) ) & + dxdt%StC_x(4,i_pt) = ( m%omega_P(1,i_pt)**2 + m%omega_P(3,i_pt)**2 - K(2,i_pt) / p%M_Omni) * x%StC_x(3,i_pt) & + - ( m%C_ctrl( 2,i_pt)/p%M_Omni ) * x%StC_x(4,i_pt) & + - ( m%C_Brake(2,i_pt)/p%M_Omni ) * x%StC_x(4,i_pt) & + + m%Acc(2,i_pt) + 1/p%M_Omni * ( m%F_fr(2,i_pt) ) & - ( m%omega_P(1,i_pt)*m%omega_P(2,i_pt) + m%alpha_P(3,i_pt) ) * x%StC_x(1,i_pt) & -2 * m%omega_P(3,i_pt) * x%StC_x(2,i_pt) dxdt%StC_x(6,i_pt) = 0.0_ReKi ! Z is off enddo + ELSE IF (p%StC_DOF_MODE == DOFMode_Omni3) THEN + ! Compute the first time derivatives of the continuous states of Omnidirectional tuned masse damper mode by sm 2015-0904 + do i_pt=1,p%NumMeshPts + + dxdt%StC_x([2,4,6],i_pt) = 1.0_ReKi/p%M_Omni * & + ( - K(1:3,i_pt) * x%StC_x([1,3,5],i_pt) & ! Stiffness + - ( m%C_ctrl(1:3,i_pt) + m%C_Brake(1:3,i_pt) ) * x%StC_x([2,4,6],i_pt) & ! Damping + + m%F_fr(1:3,i_pt) ) ! Friction + dxdt%StC_x([2,4,6],i_pt) = dxdt%StC_x([2,4,6],i_pt) + m%Acc(1:3,i_pt) & + - cross_product( m%omega_P(:,i_pt), cross_product(m%omega_P(:,i_pt),x%StC_x([1,3,5],i_pt)) ) & + - cross_product( m%alpha_P(:,i_pt), x%StC_x([1,3,5],i_pt) ) & + - 2.0_ReKi * cross_product( m%omega_P(:,i_pt), x%StC_x([2,4,6],i_pt) ) + + enddo + ELSE IF (p%StC_DOF_MODE == DOFMode_TLCD) THEN !MEG & SP ! Compute the first time derivatives of the continuous states of TLCD mode do i_pt=1,p%NumMeshPts @@ -1649,8 +1727,9 @@ SUBROUTINE StC_GroundHookDamp(dxdt,x,u,p,rdisp_P,rdot_P,C_ctrl,C_Brake,F_fr) enddo END SUBROUTINE StC_GroundHookDamp !---------------------------------------------------------------------------------------------------------------------------------- -SUBROUTINE StC_ActiveCtrl_StiffDamp(u,p,K_ctrl,C_ctrl,C_Brake,F_ctrl,M_ctrl) +SUBROUTINE StC_ActiveCtrl_StiffDamp(u,x,p,K_ctrl,C_ctrl,C_Brake,F_ctrl,M_ctrl) TYPE(StC_InputType), INTENT(IN ) :: u !< Inputs at Time + TYPE(StC_ContinuousStateType), INTENT(IN ) :: x !< State at Time TYPE(StC_ParameterType), INTENT(IN ) :: p !< The module's parameter data real(ReKi), intent(inout) :: K_ctrl(:,:) !< stiffness commanded by dll -- leave alone if no ctrl real(ReKi), intent(inout) :: C_ctrl(:,:) !< damping commanded by dll @@ -1665,16 +1744,40 @@ SUBROUTINE StC_ActiveCtrl_StiffDamp(u,p,K_ctrl,C_ctrl,C_Brake,F_ctrl,M_ctrl) C_Brake(1:3,i_pt) = u%CmdBrake(1:3,p%StC_CChan(i_pt)) F_ctrl(1:3,i_pt) = u%CmdForce(1:3,p%StC_CChan(i_pt)) M_ctrl(1:3,i_pt) = u%CmdMoment(1:3,p%StC_CChan(i_pt)) - else ! Use parameters from file (as if no control) -- leave K value as that may be set by table prior - C_ctrl(1,:) = p%C_X - C_ctrl(2,:) = p%C_Y - C_ctrl(3,:) = p%C_Z - C_Brake = 0.0_ReKi - F_ctrl = 0.0_ReKi - M_ctrl = 0.0_ReKi + else ! Use parameters from file (as if no control) -- leave K value as that may be set by table prior; yes, but K_ctrl is not used if table is used + K_ctrl(1:3,i_pt) = [p%K_X,p%K_Y,p%K_Z] + C_ctrl(1:3,i_pt) = [p%C_X,p%C_Y,p%C_Z] + C_Brake(1:3,i_pt) = 0.0_ReKi + F_ctrl(1:3,i_pt) = 0.0_ReKi + M_ctrl(1:3,i_pt) = 0.0_ReKi endif enddo END SUBROUTINE StC_ActiveCtrl_StiffDamp + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Example user subroutine for active structure control +SUBROUTINE StC_ActiveCtrl_UsrSub(u,x,p,K_ctrl,C_ctrl,C_Brake,F_ctrl,M_ctrl) + TYPE(StC_InputType), INTENT(IN ) :: u !< Inputs at Time + TYPE(StC_ContinuousStateType), INTENT(IN ) :: x !< State at Time + TYPE(StC_ParameterType), INTENT(IN ) :: p !< The module's parameter data + real(ReKi), intent(inout) :: K_ctrl(:,:) !< stiffness commanded by dll -- leave alone if no ctrl + real(ReKi), intent(inout) :: C_ctrl(:,:) !< damping commanded by dll + real(ReKi), intent(inout) :: C_Brake(:,:) !< brake commanded by dll + real(ReKi), intent(inout) :: F_ctrl(:,:) !< force commanded by dll + real(ReKi), intent(inout) :: M_ctrl(:,:) !< moment commanded by dll + integer(IntKi) :: i_pt ! counter for mesh points + do i_pt=1,p%NumMeshPts + call UserStC(x%StC_x([1,3,5],i_pt),& ! Apparent relative displacement + x%StC_x([2,4,6],i_pt),& ! Apparent relative velocity + K_ctrl (1:3,i_pt),& + C_ctrl (1:3,i_pt),& + C_Brake(1:3,i_pt),& + F_ctrl (1:3,i_pt),& + M_ctrl (1:3,i_pt)) + enddo + +END SUBROUTINE StC_ActiveCtrl_UsrSub + !---------------------------------------------------------------------------------------------------------------------------------- !> Extrapolate or interpolate stiffness value based on stiffness table. SUBROUTINE SpringForceExtrapInterp(x, p, F_table,ErrStat,ErrMsg) @@ -1709,15 +1812,17 @@ SUBROUTINE SpringForceExtrapInterp(x, p, F_table,ErrStat,ErrMsg) do i_pt=1,p%NumMeshPts - IF (p%StC_DOF_MODE == DOFMode_Indept .OR. p%StC_DOF_MODE == DOFMode_Omni) THEN + IF (p%StC_DOF_MODE == DOFMode_Indept .OR. p%StC_DOF_MODE == DOFMode_Omni .OR. p%StC_DOF_MODE == DOFMode_Omni3) THEN IF (p%StC_DOF_MODE == DOFMode_Indept) THEN DO I = 1,3 Disp(I) = x%StC_x(J(I),i_pt) END DO - ELSE !IF (p%StC_DOF_MODE == DOFMode_Omni) THEN ! Only X and Y + ELSE IF (p%StC_DOF_MODE == DOFMode_Omni) THEN ! Only X and Y Disp = SQRT(x%StC_x(1,i_pt)**2+x%StC_x(3,i_pt)**2) ! constant assignment to vector Disp(3) = 0.0_ReKi + ELSE ! IF (p%StC_DOF_MODE == DOFMode_Omni3) THEN ! X, Y, and Z + Disp = SQRT(x%StC_x(1,i_pt)**2+x%StC_x(3,i_pt)**2+x%StC_x(5,i_pt)**2) END IF @@ -1812,9 +1917,11 @@ SUBROUTINE StC_ParseInputFileInfo( PriPath, InputFile, RootName, NumMeshPts, Fil ! DOF mode (switch) { 0: No StC or TLCD DOF; ! 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); - ! 2: StC_XY_DOF (Omni-Directional StC); - ! 3: TLCD; - ! 4: Prescribed force/moment time series} + ! 2: StC_XY_DOF (2DOF Omni-Directional StC); + ! 3: StC_XYZ_DOF (3DOF Omni-Directional StC); + ! 5: TLCD; + ! 6: Prescribed force/moment time series} + ! 7: Force determined by external DLL call ParseVar( FileInfo_In, Curline, 'StC_DOF_MODE', InputFileData%StC_DOF_MODE, ErrStat2, ErrMsg2, UnEcho ) If (Failed()) return; ! DOF on or off for StC X (flag) [Used only when StC_DOF_MODE=1] @@ -1911,8 +2018,8 @@ SUBROUTINE StC_ParseInputFileInfo( PriPath, InputFile, RootName, NumMeshPts, Fil ! StC Z mass (kg) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] call ParseVar( FileInfo_In, Curline, 'StC_Z_M', InputFileData%StC_Z_M, ErrStat2, ErrMsg2, UnEcho ) If (Failed()) return; - ! StC Z mass (kg) [used only when StC_DOF_MODE=2] - call ParseVar( FileInfo_In, Curline, 'StC_XY_M', InputFileData%StC_XY_M, ErrStat2, ErrMsg2, UnEcho ) + ! StC Omni mass (kg) [used only when StC_DOF_MODE=2 or 3] + call ParseVar( FileInfo_In, Curline, 'StC_Omni_M', InputFileData%StC_Omni_M, ErrStat2, ErrMsg2, UnEcho ) If (Failed()) return; ! StC X stiffness (N/m) call ParseVar( FileInfo_In, Curline, 'StC_X_K', InputFileData%StC_X_K, ErrStat2, ErrMsg2, UnEcho ) @@ -2012,6 +2119,9 @@ SUBROUTINE StC_ParseInputFileInfo( PriPath, InputFile, RootName, NumMeshPts, Fil allocate( InputFileData%StC_CChan(NumMeshPts), STAT=ErrStat2 ) ! Blade TMD will possibly have independent TMD's for each instance if (ErrStat2 /= ErrID_None) ErrMsg2="Error allocating InputFileData%StC_CChan(NumMeshPts)" If (Failed()) return; + allocate( InputFileData%PrescribedForcesFile(NumMeshPts), STAT=ErrStat2 ) ! Blade TMD may have individual prescribed force input files for each blade instance + if (ErrStat2 /= ErrID_None) ErrMsg2="Error allocating InputFileData%PrescribedForcesFile(NumMeshPts)" + if (Failed()) return; call ParseAry( FileInfo_In, CurLine, 'StC_CChan', InputFileData%StC_CChan, NumMeshPts, ErrStat2, ErrMsg2 ) if ( ErrStat2 /= ErrID_None) then ! If we didn't read a full array, then try reading just one input ! If there was an error, CurLine didn't advance, so no resetting of it needed @@ -2113,10 +2223,23 @@ SUBROUTINE StC_ParseInputFileInfo( PriPath, InputFile, RootName, NumMeshPts, Fil call ParseVar( FileInfo_In, Curline, 'PrescribedForcesCoordSys', InputFileData%PrescribedForcesCoordSys, ErrStat2, ErrMsg2 ) If (Failed()) return; ! Prescribed input time series - call ParseVar( FileInfo_In, Curline, 'PrescribedForcesFile', InputFileData%PrescribedForcesFile, ErrStat2, ErrMsg2, IsPath=.true. ) + call ParseVar( FileInfo_In, Curline, 'PrescribedForcesFile', InputFileData%PrescribedForcesFile(1), ErrStat2, ErrMsg2, IsPath=.true. ) if (Failed()) return; - if ( PathIsRelative( InputFileData%PrescribedForcesFile ) ) InputFileData%PrescribedForcesFile = TRIM(PriPath)//TRIM(InputFileData%PrescribedForcesFile) - + if ( PathIsRelative( InputFileData%PrescribedForcesFile(1) ) ) InputFileData%PrescribedForcesFile(1) = TRIM(PriPath)//TRIM(InputFileData%PrescribedForcesFile(1)) + if (NumMeshPts > 1) then ! if we have multiple mesh points for blade StC, attempt to read multiple files. If fails, copy same name over. + do i=2,NumMeshPts + call ParseVar( FileInfo_In, Curline, 'PrescribedForcesFile', InputFileData%PrescribedForcesFile(i), ErrStat2, ErrMsg2, IsPath=.true. ) + if (ErrStat2 == ErrID_None) then + if ( PathIsRelative( InputFileData%PrescribedForcesFile(i) ) ) InputFileData%PrescribedForcesFile(i) = TRIM(PriPath)//TRIM(InputFileData%PrescribedForcesFile(i)) + else + InputFileData%PrescribedForcesFile(i) = InputFileData%PrescribedForcesFile(1) + ErrStat2 = ErrID_Info + ErrMsg2 = "Using StC blade 1 time series force data for blade "//trim(Num2LStr(i)) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'StC_ParseInputFileInfo' ) + endif + enddo + ErrStat2 = ErrID_None ! clear tmp errstat + endif CONTAINS !------------------------------------------------------------------------------------------------- @@ -2154,29 +2277,48 @@ subroutine StC_ValidatePrimaryData( InputFileData, InitInp, ErrStat, ErrMsg ) IF ( InputFileData%StC_DOF_MODE /= ControlMode_None .and. & InputFileData%StC_DOF_MODE /= DOFMode_Indept .and. & InputFileData%StC_DOF_MODE /= DOFMode_Omni .and. & + InputFileData%StC_DOF_MODE /= DOFMode_Omni3 .and. & InputFileData%StC_DOF_MODE /= DOFMode_TLCD .and. & InputFileData%StC_DOF_MODE /= DOFMode_Prescribed .and. & InputFileData%StC_DOF_MODE /= DOFMode_ForceDLL) & - CALL SetErrStat( ErrID_Fatal, 'DOF mode (StC_DOF_MODE) must be 0 (no DOF), 1 (two independent DOFs), '// & - 'or 2 (omni-directional), or 3 (TLCD), 4 (prescribed force time-series), or 5 (force from external DLL).', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat( ErrID_Fatal, 'DOF mode (StC_DOF_MODE) must be ' //& + trim(Num2LStr(ControlMode_None)) //' (no DOF), ' //& + trim(Num2LStr(DOFMode_Indept)) //' (two/three independent DOFs), ' //& + trim(Num2LStr(DOFMode_Omni)) //' (2DOF omni-directional), ' //& + trim(Num2LStr(DOFMode_Omni3)) //' (3DOF omni-directional), ' //& + trim(Num2LStr(DOFMode_TLCD)) //' (TLCD), ' //& + trim(Num2LStr(DOFMode_Prescribed))//' (prescribed force time-series), or '//& + trim(Num2LStr(DOFMode_ForceDLL)) //' (force from external DLL).', & + ErrStat, ErrMsg, RoutineName ) ! Check control modes IF ( InputFileData%StC_CMODE /= ControlMode_None .and. & InputFileData%StC_CMODE /= CMODE_Semi .and. & + InputFileData%StC_CMODE /= CMODE_ActiveUsrSub .and. & InputFileData%StC_CMODE /= CMODE_ActiveDLL ) & !InputFileData%StC_CMode /= CMODE_ActiveEXTERN .and. & ! Not an option at the moment --> 4 (active with Simulink control), - CALL SetErrStat( ErrID_Fatal, 'Control mode (StC_CMode) must be 0 (none), 1 (semi-active),'// & - ' or 5 (active with DLL control) in this version of StrucCtrl.', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat( ErrID_Fatal, 'Control mode (StC_CMode) must be ' //& + trim(Num2LStr(ControlMode_None)) //' (none), ' //& + trim(Num2LStr(CMODE_Semi)) //' (semi-active), ' //& + trim(Num2LStr(CMODE_ActiveUsrSub))//' (active with user subroutine), or ' //& + trim(Num2LStr(CMODE_ActiveDLL)) //' (active with DLL control) in this version of StrucCtrl.', & + ErrStat, ErrMsg, RoutineName ) ! Check control channel - if ( InputFileData%StC_CMode == CMODE_ActiveDLL ) then + if ( InputFileData%StC_CMode == CMODE_ActiveUsrSub .or. InputFileData%StC_CMode == CMODE_ActiveDLL ) then if ( InputFileData%StC_DOF_MODE /= DOFMode_Indept .and. & InputFileData%StC_DOF_MODE /= DOFMode_Omni .and. & + InputFileData%StC_DOF_MODE /= DOFMode_Omni3 .and. & InputFileData%StC_DOF_MODE /= DOFMode_ForceDLL) then - call SetErrStat( ErrID_Fatal, 'Control mode 4 (active with Simulink control), or 5 (active with DLL control) '// & - 'can only be used with independent or omni DOF (StC_DOF_Mode=1 or 2) or force from external DLL '// & - '(StC_DOF_Mode = 5) in this version of StrucCtrl.', ErrStat, ErrMsg, RoutineName ) + call SetErrStat( ErrID_Fatal, & + 'Control mode '//trim(Num2LStr(CMODE_ActiveUsrSub))//' (active with user subroutine) or '//& + trim(Num2LStr(CMODE_ActiveDLL)) //' (active with DLL control) ' //& + 'can only be used with independent or omni DOF (StC_DOF_Mode='//trim(Num2LStr(DOFMode_Indept))//', '//& + trim(Num2LStr(DOFMode_Omni))//', or '//trim(Num2LStr(DOFMode_Omni3))//') or external force (StC_DOF_Mode = '//& + trim(Num2LStr(DOFMode_ForceDLL))//') in this version of StrucCtrl.', ErrStat, ErrMsg, RoutineName ) endif + endif + if ( InputFileData%StC_CMode == CMODE_ActiveDLL ) then if (InitInp%NumMeshPts > 1) then do i=2,InitInp%NumMeshPts ! Warn if controlling multiple mesh points with single instance (blade TMD) if ( InputFileData%StC_CChan(i) == InputFileData%StC_CChan(1) ) then @@ -2188,10 +2330,10 @@ subroutine StC_ValidatePrimaryData( InputFileData, InitInp, ErrStat, ErrMsg ) endif do i=1,InitInp%NumMeshPts ! Check we are in range of number of control channel groups if ( InputFileData%StC_CChan(i) < 0 .or. InputFileData%StC_CChan(i) > 10 ) then - call SetErrStat( ErrID_Fatal, 'Control channel (StC_CChan) must be between 0 (off) and 10 when StC_CMode=5.', ErrStat, ErrMsg, RoutineName ) + call SetErrStat( ErrID_Fatal, 'Control channel (StC_CChan) must be between 0 (off) and 10 when StC_CMode='//trim(Num2LStr(CMODE_ActiveDLL))//'.', ErrStat, ErrMsg, RoutineName ) endif if ( InputFileData%StC_CChan(i) == 0 ) then - call SetErrStat( ErrID_Warn, 'Control mode 5 (active with DLL control) requested, but no control channel specified. No external force will be applied.', ErrStat, ErrMsg, RoutineName ) + call SetErrStat( ErrID_Warn, 'Control mode '//trim(Num2LStr(CMODE_ActiveDLL))//' (active with DLL control) requested, but no control channel specified. No external force will be applied.', ErrStat, ErrMsg, RoutineName ) endif enddo endif @@ -2201,9 +2343,13 @@ subroutine StC_ValidatePrimaryData( InputFileData, InitInp, ErrStat, ErrMsg ) InputFileData%StC_SA_MODE /= SA_CMODE_GH_disp .and. & InputFileData%StC_SA_MODE /= SA_CMODE_Ph_FF .and. & InputFileData%StC_SA_MODE /= SA_CMODE_Ph_DF ) then - CALL SetErrStat( ErrID_Fatal, 'Semi-active control mode (StC_SA_MODE) must be 1 (velocity-based ground hook control), '// & - '2 (inverse velocity-based ground hook control), 3 (displacement-based ground hook control), '// & - '4 (phase difference algorithm with friction force), or 5 (phase difference algorithm with damping force).', ErrStat, ErrMsg, RoutineName ) + CALL SetErrStat( ErrID_Fatal, 'Semi-active control mode (StC_SA_MODE) must be ' //& + trim(Num2LStr(SA_CMODE_GH_vel)) //' (velocity-based ground hook control), ' //& + trim(Num2LStr(SA_CMODE_GH_invVel))//' (inverse velocity-based ground hook control), ' //& + trim(Num2LStr(SA_CMODE_GH_disp)) //' (displacement-based ground hook control), ' //& + trim(Num2LStr(SA_CMODE_Ph_FF)) //' (phase difference algorithm with friction force), or '//& + trim(Num2LStr(SA_CMODE_Ph_DF)) //' (phase difference algorithm with damping force).', & + ErrStat, ErrMsg, RoutineName ) END IF ! Prescribed forces @@ -2224,8 +2370,8 @@ subroutine StC_ValidatePrimaryData( InputFileData, InitInp, ErrStat, ErrMsg ) endif ! Need active DLL control - if (InputFileData%StC_CMODE /= CMODE_ActiveDLL) THEN - call SetErrStat( ErrID_Fatal, 'StC_CMODE must be '//trim(Num2LStr(CMODE_ActiveDLL))// & + if (InputFileData%StC_CMODE /= CMODE_ActiveDLL .and. InputFileData%StC_CMODE /= CMODE_ActiveUsrSub) THEN + call SetErrStat( ErrID_Fatal, 'StC_CMODE must be '//trim(Num2LStr(CMODE_ActiveUsrSub))//' or '//trim(Num2LStr(CMODE_ActiveDLL))// & ' when StC_DOF_MODE is '//trim(Num2LStr(DOFMode_ForceDLL)) , ErrStat, ErrMsg, RoutineName ) endif endif @@ -2246,12 +2392,21 @@ subroutine StC_ValidatePrimaryData( InputFileData, InitInp, ErrStat, ErrMsg ) if (InputFileData%StC_DOF_MODE == DOFMode_Indept .and. InputFileData%StC_Z_DOF .and. (InputFileData%StC_Z_K <= 0.0_ReKi) ) & call SetErrStat(ErrID_Fatal,'StC_Z_K must be > 0 when StC_Z_DOF is enabled', ErrStat,ErrMsg,RoutineName) - if (InputFileData%StC_DOF_MODE == DOFMode_Omni .and. (InputFileData%StC_XY_M <= 0.0_ReKi) ) & - call SetErrStat(ErrID_Fatal,'StC_XY_M must be > 0 when DOF mode 2 (omni-directional) is used', ErrStat,ErrMsg,RoutineName) + if (InputFileData%StC_DOF_MODE == DOFMode_Omni .and. (InputFileData%StC_Omni_M <= 0.0_ReKi) ) & + call SetErrStat(ErrID_Fatal,'StC_Omni_M must be > 0 when DOF mode '//trim(Num2LStr(DOFMode_Omni))//' (2DOF omni-directional) is used', ErrStat,ErrMsg,RoutineName) if (InputFileData%StC_DOF_MODE == DOFMode_Omni .and. (InputFileData%StC_X_K <= 0.0_ReKi) ) & - call SetErrStat(ErrID_Fatal,'StC_X_K must be > 0 when DOF mode 2 (omni-directional) is used', ErrStat,ErrMsg,RoutineName) + call SetErrStat(ErrID_Fatal,'StC_X_K must be > 0 when DOF mode '//trim(Num2LStr(DOFMode_Omni))//' (2DOF omni-directional) is used', ErrStat,ErrMsg,RoutineName) if (InputFileData%StC_DOF_MODE == DOFMode_Omni .and. (InputFileData%StC_Y_K <= 0.0_ReKi) ) & - call SetErrStat(ErrID_Fatal,'StC_Y_K must be > 0 when DOF mode 2 (omni-directional) is used', ErrStat,ErrMsg,RoutineName) + call SetErrStat(ErrID_Fatal,'StC_Y_K must be > 0 when DOF mode '//trim(Num2LStr(DOFMode_Omni))//' (2DOF omni-directional) is used', ErrStat,ErrMsg,RoutineName) + + if (InputFileData%StC_DOF_MODE == DOFMode_Omni3 .and. (InputFileData%StC_Omni_M <= 0.0_ReKi) ) & + call SetErrStat(ErrID_Fatal,'StC_Omni_M must be > 0 when DOF mode '//trim(Num2LStr(DOFMode_Omni3))//' (3DOF omni-directional) is used', ErrStat,ErrMsg,RoutineName) + if (InputFileData%StC_DOF_MODE == DOFMode_Omni3 .and. (InputFileData%StC_X_K <= 0.0_ReKi) ) & + call SetErrStat(ErrID_Fatal,'StC_X_K must be > 0 when DOF mode '//trim(Num2LStr(DOFMode_Omni3))//' (3DOF omni-directional) is used', ErrStat,ErrMsg,RoutineName) + if (InputFileData%StC_DOF_MODE == DOFMode_Omni3 .and. (InputFileData%StC_Y_K <= 0.0_ReKi) ) & + call SetErrStat(ErrID_Fatal,'StC_Y_K must be > 0 when DOF mode '//trim(Num2LStr(DOFMode_Omni3))//' (3DOF omni-directional) is used', ErrStat,ErrMsg,RoutineName) + if (InputFileData%StC_DOF_MODE == DOFMode_Omni3 .and. (InputFileData%StC_Z_K <= 0.0_ReKi) ) & + call SetErrStat(ErrID_Fatal,'StC_Z_K must be > 0 when DOF mode '//trim(Num2LStr(DOFMode_Omni3))//' (3DOF omni-directional) is used', ErrStat,ErrMsg,RoutineName) ! Check spring preload in ZDof TmpCh = trim(InputFileData%StC_Z_PreLdC) @@ -2283,6 +2438,7 @@ SUBROUTINE StC_SetParameters( InputFileData, InitInp, p, Interval, ErrStat, ErrM ! Local variables character(10) :: TmpCh ! Temporary string for figuring out what to do with preload on Z spring + integer(IntKi) :: i ! generic counter INTEGER(IntKi) :: ErrStat2 ! Temporary error ID CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary message describing error CHARACTER(*), PARAMETER :: RoutineName = 'StC_SetParameters' @@ -2331,7 +2487,7 @@ SUBROUTINE StC_SetParameters( InputFileData, InitInp, p, Interval, ErrStat, ErrM p%C_Z = InputFileData%StC_Z_C ! StC Omni parameters - p%M_XY = InputFileData%StC_XY_M + p%M_Omni = InputFileData%StC_Omni_M ! Fore-Aft TLCD Parameters ! MEG & SP p%L_X = InputFileData%L_X @@ -2383,7 +2539,7 @@ SUBROUTINE StC_SetParameters( InputFileData, InitInp, p, Interval, ErrStat, ErrM p%Use_F_TBL = InputFileData%Use_F_TBL if (allocated(InputFileData%F_TBL)) then call AllocAry(p%F_TBL,SIZE(InputFiledata%F_TBL,1),SIZE(InputFiledata%F_TBL,2),'F_TBL', ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); if (ErrStat >= ErrID_Fatal) return + if (Failed()) return; p%F_TBL = InputFileData%F_TBL endif @@ -2391,10 +2547,14 @@ SUBROUTINE StC_SetParameters( InputFileData, InitInp, p, Interval, ErrStat, ErrM p%StC_Z_PreLd = 0.0_ReKi TmpCh = trim(InputFileData%StC_Z_PreLdC) call Conv2UC(TmpCh) - if (InputFileData%StC_DOF_MODE == DOFMode_Indept .and. InputFileData%StC_Z_DOF .and. & - (INDEX(TmpCh, "NONE") /= 1) ) then + if ( ((InputFileData%StC_DOF_MODE == DOFMode_Indept .and. InputFileData%StC_Z_DOF) .or. (InputFileData%StC_DOF_MODE == DOFMode_Omni3)) & + .and. (INDEX(TmpCh, "NONE") /= 1) ) then if (INDEX(TmpCh, "GRAVITY") == 1 ) then ! if gravity, then calculate - p%StC_Z_PreLd = -p%Gravity(3)*p%M_Z + if ( InputFileData%StC_DOF_MODE == DOFMode_Indept ) then + p%StC_Z_PreLd = -p%Gravity(3)*p%M_Z + else + p%StC_Z_PreLd = -p%Gravity(3)*p%M_Omni + end if else READ (InputFileData%StC_Z_PreLdC,*,IOSTAT=ErrStat2) p%StC_Z_PreLd ! Read a real number and store if (ErrStat2 /= 0) call SetErrStat(ErrID_Fatal,'StC_Z_PreLd must be "gravity", "none" or a real number', ErrStat,ErrMsg,RoutineName) @@ -2402,12 +2562,16 @@ SUBROUTINE StC_SetParameters( InputFileData, InitInp, p, Interval, ErrStat, ErrM endif endif - ! Prescribed forces + ! Prescribed forces - copy data over p%PrescribedForcesCoordSys = InputFileData%PrescribedForcesCoordSys if (allocated(InputFileData%StC_PrescribedForce)) then - call AllocAry( p%StC_PrescribedForce, size(InputFileData%StC_PrescribedForce,1), size(InputFileData%StC_PrescribedForce,2),"Array of force data", ErrStat2, ErrMsg2 ) - CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName); if (ErrStat >= ErrID_Fatal) return - p%StC_PrescribedForce = InputFileData%StC_PrescribedForce + allocate(p%StC_PrescribedForce(size(InputFileData%StC_PrescribedForce)), STAT=ErrStat2 ) ! Blade TMD may have individual prescribed force input files for each blade instance + if (ErrStat2 /= ErrID_None) ErrMsg2="Error allocating p%PrescribedForcesFile(NumMeshPts)" + if (Failed()) return; + do i=1,p%NumMeshPts + call StC_CopyPrescrFrcTseries(InputFileData%StC_PrescribedForce(i), p%StC_PrescribedForce(i), MESH_NEWCOPY, ErrStat2, ErrMsg2) + if (Failed()) return; + enddo endif ! StC Control channels @@ -2418,28 +2582,28 @@ SUBROUTINE StC_SetParameters( InputFileData, InitInp, p, Interval, ErrStat, ErrM p%StC_CChan = 0 ! turn off regardless of input file request. endif +contains + !------------------------------------------------------------------------------------------------- + logical function Failed() + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + Failed = ErrStat >= AbortErrLev + end function Failed END SUBROUTINE StC_SetParameters -subroutine StC_ParseTimeSeriesFileInfo( InputFile, FileInfo_In, InputFileData, UnEcho, ErrStat, ErrMsg ) - - implicit none - - ! Passed variables - CHARACTER(*), intent(in ) :: InputFile !< Name of the file containing the primary input data - type(StC_InputFile), intent(inout) :: InputFileData !< All the data in the StrucCtrl input file - type(FileInfoType), intent(in ) :: FileInfo_In !< The derived type for holding the file information. - integer(IntKi), intent(inout) :: UnEcho !< The local unit number for this module's echo file - integer(IntKi), intent( out) :: ErrStat !< Error status - CHARACTER(ErrMsgLen), intent( out) :: ErrMsg !< Error message - - ! Local variables: - integer(IntKi) :: i !< generic counter - integer(IntKi) :: ErrStat2 !< Temporary Error status - character(ErrMsgLen) :: ErrMsg2 !< Temporary Error message - integer(IntKi) :: CurLine !< current entry in FileInfo_In%Lines array - real(ReKi) :: TmpRe7(7) !< temporary 7 number array for reading values in - character(*), parameter :: RoutineName='StC_ParseTimeSeriesFileInfo' +subroutine StC_ParseTimeSeriesFileInfo( InputFile, FileInfo_In, StC_PrescribedForce, UnEcho, ErrStat, ErrMsg ) + CHARACTER(*), intent(in ) :: InputFile !< Name of the file containing the primary input data + type(StC_PrescrFrcTseries), intent(inout) :: StC_PrescribedForce !< Parsed timeseries data + type(FileInfoType), intent(in ) :: FileInfo_In !< The derived type for holding the file information. + integer(IntKi), intent(inout) :: UnEcho !< The local unit number for this module's echo file + integer(IntKi), intent( out) :: ErrStat !< Error status + CHARACTER(ErrMsgLen), intent( out) :: ErrMsg !< Error message + integer(IntKi) :: i !< generic counter + integer(IntKi) :: ErrStat2 !< Temporary Error status + character(ErrMsgLen) :: ErrMsg2 !< Temporary Error message + integer(IntKi) :: CurLine !< current entry in FileInfo_In%Lines array + real(ReKi) :: TmpRe7(7) !< temporary 7 number array for reading values in + character(*), parameter :: RoutineName='StC_ParseTimeSeriesFileInfo' ! Initialization of subroutine ErrMsg = '' @@ -2449,7 +2613,8 @@ subroutine StC_ParseTimeSeriesFileInfo( InputFile, FileInfo_In, InputFileData, U ! This file should only contain a table. Header lines etc should be commented out. Any blank lines at the ! end get removed by the ProcessCom - call AllocAry( InputFileData%StC_PrescribedForce, 7, FileInfo_In%NumLines, "Array of force data", ErrStat2, ErrMsg2 ) +!FIXME: need to make this an array of arrays. + call AllocAry( StC_PrescribedForce%data, 7, FileInfo_In%NumLines, "Array of force data", ErrStat2, ErrMsg2 ) if (Failed()) return; ! Loop over all table lines. Expecting 7 colunns @@ -2457,7 +2622,7 @@ subroutine StC_ParseTimeSeriesFileInfo( InputFile, FileInfo_In, InputFileData, U do i=1,FileInfo_In%NumLines call ParseAry ( FileInfo_In, CurLine, 'Coordinates', TmpRe7, 7, ErrStat2, ErrMsg2, UnEcho ) if (Failed()) return; - InputFileData%StC_PrescribedForce(1:7,i) = TmpRe7 + StC_PrescribedForce%data(1:7,i) = TmpRe7 enddo contains diff --git a/modules/servodyn/src/StrucCtrl_Registry.txt b/modules/servodyn/src/StrucCtrl_Registry.txt index 92bbbc3a2b..9329bc07d0 100644 --- a/modules/servodyn/src/StrucCtrl_Registry.txt +++ b/modules/servodyn/src/StrucCtrl_Registry.txt @@ -9,23 +9,25 @@ ################################################################################################################################### include Registry_NWTC_Library.txt +typedef StrucCtrl/StC StC_PrescrFrcTseries ReKi data {:}{:} - - "StC prescribed force time-series info" "(s,N,N-m)" + # ..... Input File data ....................................................................................................... typedef StrucCtrl/StC StC_InputFile CHARACTER(1024) StCFileName - - - "Name of the input file; remove if there is no file" - typedef ^ ^ LOGICAL Echo - - - "Echo input file to echo file" - -typedef ^ ^ INTEGER StC_CMODE - - - "control mode {0:none; 1: Semi-Active Control Mode; 2: Active Control Mode;} " - +typedef ^ ^ INTEGER StC_CMODE - - - "control mode {0:none; 1: Semi-Active Control Mode; 3: Active Control Mode through user subroutine; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} " - typedef ^ ^ INTEGER StC_SA_MODE - - - "Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} " - -typedef ^ ^ INTEGER StC_DOF_MODE - - - "DOF mode {0: NO StC_DOF; 1: StC_X_DOF and StC_Y_DOF; 2: StC_XY_DOF; 3: TLCD; 4: Prescribed force/moment time series}" - +typedef ^ ^ INTEGER StC_DOF_MODE - - - "DOF mode {0: NO StC_DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF; 2: StC_XY_DOF; 3: StC_XYZ_DOF; 5: TLCD; 6: Prescribed force/moment time series; 7: Force determined by external DLL}" - typedef ^ ^ LOGICAL StC_X_DOF - - - "DOF on or off" - typedef ^ ^ LOGICAL StC_Y_DOF - - - "DOF on or off" - typedef ^ ^ LOGICAL StC_Z_DOF - - - "DOF on or off" - typedef ^ ^ ReKi StC_X_DSP - - - "StC_X initial displacement" m typedef ^ ^ ReKi StC_Y_DSP - - - "StC_Y initial displacement" m typedef ^ ^ ReKi StC_Z_DSP - - - "StC_Z initial displacement" m -typedef ^ ^ Character(10) StC_Z_PreLdC - - - "StC_Z spring preload" N +typedef ^ ^ Character(10) StC_Z_PreLdC - - - "StC_Z spring preload" N typedef ^ ^ ReKi StC_X_M - - - "StC X mass" kg typedef ^ ^ ReKi StC_Y_M - - - "StC Y mass" kg typedef ^ ^ ReKi StC_Z_M - - - "StC Z mass" kg -typedef ^ ^ ReKi StC_XY_M - - - "StC XY mass" kg +typedef ^ ^ ReKi StC_Omni_M - - - "StC omni mass" kg typedef ^ ^ ReKi StC_X_K - - - "StC X stiffness" "N/m" typedef ^ ^ ReKi StC_Y_K - - - "StC Y stiffness" "N/m" typedef ^ ^ ReKi StC_Z_K - - - "StC Y stiffness" "N/m" @@ -73,8 +75,8 @@ typedef ^ ^ IntKi NKInpSt - - - "Number of input spring force rows in tabl typedef ^ ^ CHARACTER(1024) StC_F_TBL_FILE - - - "user-defined spring table filename" - typedef ^ ^ ReKi F_TBL {:}{:} - - "user-defined spring force" "N" typedef ^ ^ IntKi PrescribedForcesCoordSys - - - "Prescribed forces coordinate system {0: global; 1: local}" - -typedef ^ ^ CHARACTER(1024) PrescribedForcesFile - - - "Prescribed force time-series filename" - -typedef ^ ^ ReKi StC_PrescribedForce {:}{:} - - "StC prescribed force time-series info" "(s,N,N-m)" +typedef ^ ^ CHARACTER(1024) PrescribedForcesFile : - - "Prescribed force time-series filename" - +typedef ^ ^ StC_PrescrFrcTseries StC_PrescribedForce {:} - - "StC prescribed force time-series info" "(s,N,N-m)" typedef ^ ^ IntKi StC_CChan {:} - - "StC control chan to use -- one per instance" - # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: @@ -149,7 +151,7 @@ typedef ^ MiscVarType IntKi PrescribedInterpIdx - - - "Index for interpolatio # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: typedef ^ ParameterType DbKi DT - - - "Time step for cont. state integration & disc. state update" seconds typedef ^ ^ CHARACTER(1024) RootName - - - "RootName for writing output files" - -typedef ^ ^ INTEGER StC_DOF_MODE - - - "DOF mode {0: NO StC_DOF; 1: StC_X_DOF and StC_Y_DOF; 2: StC_XY_DOF; 3: TLCD; 4: Prescribed force/moment time series}" - +typedef ^ ^ INTEGER StC_DOF_MODE - - - "DOF mode {0: NO StC_DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF; 2: StC_XY_DOF; 3: StC_XYZ_DOF; 5: TLCD; 6: Prescribed force/moment time series; 7: Force determined by external DLL}" - typedef ^ ^ LOGICAL StC_X_DOF - - - "DOF on or off" - typedef ^ ^ LOGICAL StC_Y_DOF - - - "DOF on or off" - typedef ^ ^ LOGICAL StC_Z_DOF - - - "DOF on or off" - @@ -157,7 +159,7 @@ typedef ^ ^ ReKi StC_Z_PreLd - - - "StC_Z spring preload" N typedef ^ ^ ReKi M_X - - - "StC mass" kg typedef ^ ^ ReKi M_Y - - - "StC mass" kg typedef ^ ^ ReKi M_Z - - - "StC mass" kg -typedef ^ ^ ReKi M_XY - - - "StCXY mass" kg +typedef ^ ^ ReKi M_Omni - - - "StC omni mass" kg typedef ^ ^ ReKi K_X - - - "StC stiffness" "N/m" typedef ^ ^ ReKi K_Y - - - "StC stiffness" "N/m" typedef ^ ^ ReKi K_Z - - - "StC stiffness" "N/m" @@ -169,7 +171,7 @@ typedef ^ ^ ReKi C_S {3} - - "StC stop damping" "N/(m/s)" typedef ^ ^ ReKi P_SP {3} - - "Positive stop position (maximum mass displacement)" m typedef ^ ^ ReKi N_SP {3} - - "Negative stop position (minimum X mass displacement)" m typedef ^ ^ ReKi Gravity {3} - - "Gravitational acceleration vector" "m/s^2" -typedef ^ ^ IntKi StC_CMODE - - - "control mode {0:none; 1: Semi-Active Control Mode; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} " - +typedef ^ ^ IntKi StC_CMODE - - - "control mode {0:none; 1: Semi-Active Control Mode; 3: Active Control Mode through user subroutine; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} " - typedef ^ ^ IntKi StC_SA_MODE - - - "Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} " - typedef ^ ^ ReKi StC_X_C_HIGH - - - "StC X high damping for ground hook control" "N/(m/s)" typedef ^ ^ ReKi StC_X_C_LOW - - - "StC X low damping for ground hook control" "N/(m/s)" @@ -196,7 +198,7 @@ typedef ^ ^ LOGICAL Use_F_TBL - - - "use spring force from user-defined ta typedef ^ ^ ReKi F_TBL {:}{:} - - "user-defined spring force" "N" typedef ^ ParameterType IntKi NumMeshPts - - - "Number of mesh points" - typedef ^ ^ IntKi PrescribedForcesCoordSys - - - "Prescribed forces coordinate system {0: global; 1: local}" - -typedef ^ ^ ReKi StC_PrescribedForce {:}{:} - - "StC prescribed force time-series info" "(s,N,N-m)" +typedef ^ ^ StC_PrescrFrcTseries StC_PrescribedForce {:} - - "StC prescribed force time-series info" "(s,N,N-m)" typedef ^ ^ IntKi StC_CChan {:} - - "StC control chan to use" - # ..... Inputs .................................................................................................................... # Define inputs that are contained on the mesh here: diff --git a/modules/servodyn/src/StrucCtrl_Types.f90 b/modules/servodyn/src/StrucCtrl_Types.f90 index 98995f861a..c25d951de6 100644 --- a/modules/servodyn/src/StrucCtrl_Types.f90 +++ b/modules/servodyn/src/StrucCtrl_Types.f90 @@ -33,13 +33,18 @@ MODULE StrucCtrl_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE +! ========= StC_PrescrFrcTseries ======= + TYPE, PUBLIC :: StC_PrescrFrcTseries + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: data !< StC prescribed force time-series info [(s,N,N-m)] + END TYPE StC_PrescrFrcTseries +! ======================= ! ========= StC_InputFile ======= TYPE, PUBLIC :: StC_InputFile CHARACTER(1024) :: StCFileName !< Name of the input file; remove if there is no file [-] LOGICAL :: Echo = .false. !< Echo input file to echo file [-] - INTEGER(IntKi) :: StC_CMODE = 0_IntKi !< control mode {0:none; 1: Semi-Active Control Mode; 2: Active Control Mode;} [-] + INTEGER(IntKi) :: StC_CMODE = 0_IntKi !< control mode {0:none; 1: Semi-Active Control Mode; 3: Active Control Mode through user subroutine; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} [-] INTEGER(IntKi) :: StC_SA_MODE = 0_IntKi !< Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} [-] - INTEGER(IntKi) :: StC_DOF_MODE = 0_IntKi !< DOF mode {0: NO StC_DOF; 1: StC_X_DOF and StC_Y_DOF; 2: StC_XY_DOF; 3: TLCD; 4: Prescribed force/moment time series} [-] + INTEGER(IntKi) :: StC_DOF_MODE = 0_IntKi !< DOF mode {0: NO StC_DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF; 2: StC_XY_DOF; 3: StC_XYZ_DOF; 5: TLCD; 6: Prescribed force/moment time series; 7: Force determined by external DLL} [-] LOGICAL :: StC_X_DOF = .false. !< DOF on or off [-] LOGICAL :: StC_Y_DOF = .false. !< DOF on or off [-] LOGICAL :: StC_Z_DOF = .false. !< DOF on or off [-] @@ -50,7 +55,7 @@ MODULE StrucCtrl_Types REAL(ReKi) :: StC_X_M = 0.0_ReKi !< StC X mass [kg] REAL(ReKi) :: StC_Y_M = 0.0_ReKi !< StC Y mass [kg] REAL(ReKi) :: StC_Z_M = 0.0_ReKi !< StC Z mass [kg] - REAL(ReKi) :: StC_XY_M = 0.0_ReKi !< StC XY mass [kg] + REAL(ReKi) :: StC_Omni_M = 0.0_ReKi !< StC omni mass [kg] REAL(ReKi) :: StC_X_K = 0.0_ReKi !< StC X stiffness [N/m] REAL(ReKi) :: StC_Y_K = 0.0_ReKi !< StC Y stiffness [N/m] REAL(ReKi) :: StC_Z_K = 0.0_ReKi !< StC Y stiffness [N/m] @@ -98,8 +103,8 @@ MODULE StrucCtrl_Types CHARACTER(1024) :: StC_F_TBL_FILE !< user-defined spring table filename [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: F_TBL !< user-defined spring force [N] INTEGER(IntKi) :: PrescribedForcesCoordSys = 0_IntKi !< Prescribed forces coordinate system {0: global; 1: local} [-] - CHARACTER(1024) :: PrescribedForcesFile !< Prescribed force time-series filename [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: StC_PrescribedForce !< StC prescribed force time-series info [(s,N,N-m)] + CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: PrescribedForcesFile !< Prescribed force time-series filename [-] + TYPE(StC_PrescrFrcTseries) , DIMENSION(:), ALLOCATABLE :: StC_PrescribedForce !< StC prescribed force time-series info [(s,N,N-m)] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: StC_CChan !< StC control chan to use -- one per instance [-] END TYPE StC_InputFile ! ======================= @@ -183,7 +188,7 @@ MODULE StrucCtrl_Types TYPE, PUBLIC :: StC_ParameterType REAL(DbKi) :: DT = 0.0_R8Ki !< Time step for cont. state integration & disc. state update [seconds] CHARACTER(1024) :: RootName !< RootName for writing output files [-] - INTEGER(IntKi) :: StC_DOF_MODE = 0_IntKi !< DOF mode {0: NO StC_DOF; 1: StC_X_DOF and StC_Y_DOF; 2: StC_XY_DOF; 3: TLCD; 4: Prescribed force/moment time series} [-] + INTEGER(IntKi) :: StC_DOF_MODE = 0_IntKi !< DOF mode {0: NO StC_DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF; 2: StC_XY_DOF; 3: StC_XYZ_DOF; 5: TLCD; 6: Prescribed force/moment time series; 7: Force determined by external DLL} [-] LOGICAL :: StC_X_DOF = .false. !< DOF on or off [-] LOGICAL :: StC_Y_DOF = .false. !< DOF on or off [-] LOGICAL :: StC_Z_DOF = .false. !< DOF on or off [-] @@ -191,7 +196,7 @@ MODULE StrucCtrl_Types REAL(ReKi) :: M_X = 0.0_ReKi !< StC mass [kg] REAL(ReKi) :: M_Y = 0.0_ReKi !< StC mass [kg] REAL(ReKi) :: M_Z = 0.0_ReKi !< StC mass [kg] - REAL(ReKi) :: M_XY = 0.0_ReKi !< StCXY mass [kg] + REAL(ReKi) :: M_Omni = 0.0_ReKi !< StC omni mass [kg] REAL(ReKi) :: K_X = 0.0_ReKi !< StC stiffness [N/m] REAL(ReKi) :: K_Y = 0.0_ReKi !< StC stiffness [N/m] REAL(ReKi) :: K_Z = 0.0_ReKi !< StC stiffness [N/m] @@ -203,7 +208,7 @@ MODULE StrucCtrl_Types REAL(ReKi) , DIMENSION(1:3) :: P_SP = 0.0_ReKi !< Positive stop position (maximum mass displacement) [m] REAL(ReKi) , DIMENSION(1:3) :: N_SP = 0.0_ReKi !< Negative stop position (minimum X mass displacement) [m] REAL(ReKi) , DIMENSION(1:3) :: Gravity = 0.0_ReKi !< Gravitational acceleration vector [m/s^2] - INTEGER(IntKi) :: StC_CMODE = 0_IntKi !< control mode {0:none; 1: Semi-Active Control Mode; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} [-] + INTEGER(IntKi) :: StC_CMODE = 0_IntKi !< control mode {0:none; 1: Semi-Active Control Mode; 3: Active Control Mode through user subroutine; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} [-] INTEGER(IntKi) :: StC_SA_MODE = 0_IntKi !< Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} [-] REAL(ReKi) :: StC_X_C_HIGH = 0.0_ReKi !< StC X high damping for ground hook control [N/(m/s)] REAL(ReKi) :: StC_X_C_LOW = 0.0_ReKi !< StC X low damping for ground hook control [N/(m/s)] @@ -230,7 +235,7 @@ MODULE StrucCtrl_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: F_TBL !< user-defined spring force [N] INTEGER(IntKi) :: NumMeshPts = 0_IntKi !< Number of mesh points [-] INTEGER(IntKi) :: PrescribedForcesCoordSys = 0_IntKi !< Prescribed forces coordinate system {0: global; 1: local} [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: StC_PrescribedForce !< StC prescribed force time-series info [(s,N,N-m)] + TYPE(StC_PrescrFrcTseries) , DIMENSION(:), ALLOCATABLE :: StC_PrescribedForce !< StC prescribed force time-series info [(s,N,N-m)] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: StC_CChan !< StC control chan to use [-] END TYPE StC_ParameterType ! ======================= @@ -251,7 +256,75 @@ MODULE StrucCtrl_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: MeasVel !< StC measured relative velocity of tmd mass (local coordinates) signal to controller [m/s] END TYPE StC_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: StC_x_StC_x = 1 ! StC%StC_x + integer(IntKi), public, parameter :: StC_u_Mesh = 2 ! StC%Mesh(DL%i1) + integer(IntKi), public, parameter :: StC_u_CmdStiff = 3 ! StC%CmdStiff + integer(IntKi), public, parameter :: StC_u_CmdDamp = 4 ! StC%CmdDamp + integer(IntKi), public, parameter :: StC_u_CmdBrake = 5 ! StC%CmdBrake + integer(IntKi), public, parameter :: StC_u_CmdForce = 6 ! StC%CmdForce + integer(IntKi), public, parameter :: StC_u_CmdMoment = 7 ! StC%CmdMoment + integer(IntKi), public, parameter :: StC_y_Mesh = 8 ! StC%Mesh(DL%i1) + integer(IntKi), public, parameter :: StC_y_MeasDisp = 9 ! StC%MeasDisp + integer(IntKi), public, parameter :: StC_y_MeasVel = 10 ! StC%MeasVel + +contains + +subroutine StC_CopyPrescrFrcTseries(SrcPrescrFrcTseriesData, DstPrescrFrcTseriesData, CtrlCode, ErrStat, ErrMsg) + type(StC_PrescrFrcTseries), intent(in) :: SrcPrescrFrcTseriesData + type(StC_PrescrFrcTseries), intent(inout) :: DstPrescrFrcTseriesData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'StC_CopyPrescrFrcTseries' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcPrescrFrcTseriesData%data)) then + LB(1:2) = lbound(SrcPrescrFrcTseriesData%data) + UB(1:2) = ubound(SrcPrescrFrcTseriesData%data) + if (.not. allocated(DstPrescrFrcTseriesData%data)) then + allocate(DstPrescrFrcTseriesData%data(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstPrescrFrcTseriesData%data.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstPrescrFrcTseriesData%data = SrcPrescrFrcTseriesData%data + end if +end subroutine + +subroutine StC_DestroyPrescrFrcTseries(PrescrFrcTseriesData, ErrStat, ErrMsg) + type(StC_PrescrFrcTseries), intent(inout) :: PrescrFrcTseriesData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'StC_DestroyPrescrFrcTseries' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(PrescrFrcTseriesData%data)) then + deallocate(PrescrFrcTseriesData%data) + end if +end subroutine + +subroutine StC_PackPrescrFrcTseries(RF, Indata) + type(RegFile), intent(inout) :: RF + type(StC_PrescrFrcTseries), intent(in) :: InData + character(*), parameter :: RoutineName = 'StC_PackPrescrFrcTseries' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%data) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine StC_UnPackPrescrFrcTseries(RF, OutData) + type(RegFile), intent(inout) :: RF + type(StC_PrescrFrcTseries), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'StC_UnPackPrescrFrcTseries' + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%data); if (RegCheckErr(RF, RoutineName)) return +end subroutine subroutine StC_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg) type(StC_InputFile), intent(in) :: SrcInputFileData @@ -259,8 +332,10 @@ subroutine StC_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSt integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'StC_CopyInputFile' ErrStat = ErrID_None ErrMsg = '' @@ -279,7 +354,7 @@ subroutine StC_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSt DstInputFileData%StC_X_M = SrcInputFileData%StC_X_M DstInputFileData%StC_Y_M = SrcInputFileData%StC_Y_M DstInputFileData%StC_Z_M = SrcInputFileData%StC_Z_M - DstInputFileData%StC_XY_M = SrcInputFileData%StC_XY_M + DstInputFileData%StC_Omni_M = SrcInputFileData%StC_Omni_M DstInputFileData%StC_X_K = SrcInputFileData%StC_X_K DstInputFileData%StC_Y_K = SrcInputFileData%StC_Y_K DstInputFileData%StC_Z_K = SrcInputFileData%StC_Z_K @@ -338,18 +413,33 @@ subroutine StC_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSt DstInputFileData%F_TBL = SrcInputFileData%F_TBL end if DstInputFileData%PrescribedForcesCoordSys = SrcInputFileData%PrescribedForcesCoordSys - DstInputFileData%PrescribedForcesFile = SrcInputFileData%PrescribedForcesFile + if (allocated(SrcInputFileData%PrescribedForcesFile)) then + LB(1:1) = lbound(SrcInputFileData%PrescribedForcesFile) + UB(1:1) = ubound(SrcInputFileData%PrescribedForcesFile) + if (.not. allocated(DstInputFileData%PrescribedForcesFile)) then + allocate(DstInputFileData%PrescribedForcesFile(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PrescribedForcesFile.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%PrescribedForcesFile = SrcInputFileData%PrescribedForcesFile + end if if (allocated(SrcInputFileData%StC_PrescribedForce)) then - LB(1:2) = lbound(SrcInputFileData%StC_PrescribedForce) - UB(1:2) = ubound(SrcInputFileData%StC_PrescribedForce) + LB(1:1) = lbound(SrcInputFileData%StC_PrescribedForce) + UB(1:1) = ubound(SrcInputFileData%StC_PrescribedForce) if (.not. allocated(DstInputFileData%StC_PrescribedForce)) then - allocate(DstInputFileData%StC_PrescribedForce(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + allocate(DstInputFileData%StC_PrescribedForce(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%StC_PrescribedForce.', ErrStat, ErrMsg, RoutineName) return end if end if - DstInputFileData%StC_PrescribedForce = SrcInputFileData%StC_PrescribedForce + do i1 = LB(1), UB(1) + call StC_CopyPrescrFrcTseries(SrcInputFileData%StC_PrescribedForce(i1), DstInputFileData%StC_PrescribedForce(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if if (allocated(SrcInputFileData%StC_CChan)) then LB(1:1) = lbound(SrcInputFileData%StC_CChan) @@ -369,13 +459,26 @@ subroutine StC_DestroyInputFile(InputFileData, ErrStat, ErrMsg) type(StC_InputFile), intent(inout) :: InputFileData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'StC_DestroyInputFile' ErrStat = ErrID_None ErrMsg = '' if (allocated(InputFileData%F_TBL)) then deallocate(InputFileData%F_TBL) end if + if (allocated(InputFileData%PrescribedForcesFile)) then + deallocate(InputFileData%PrescribedForcesFile) + end if if (allocated(InputFileData%StC_PrescribedForce)) then + LB(1:1) = lbound(InputFileData%StC_PrescribedForce) + UB(1:1) = ubound(InputFileData%StC_PrescribedForce) + do i1 = LB(1), UB(1) + call StC_DestroyPrescrFrcTseries(InputFileData%StC_PrescribedForce(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do deallocate(InputFileData%StC_PrescribedForce) end if if (allocated(InputFileData%StC_CChan)) then @@ -387,6 +490,8 @@ subroutine StC_PackInputFile(RF, Indata) type(RegFile), intent(inout) :: RF type(StC_InputFile), intent(in) :: InData character(*), parameter :: RoutineName = 'StC_PackInputFile' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%StCFileName) call RegPack(RF, InData%Echo) @@ -403,7 +508,7 @@ subroutine StC_PackInputFile(RF, Indata) call RegPack(RF, InData%StC_X_M) call RegPack(RF, InData%StC_Y_M) call RegPack(RF, InData%StC_Z_M) - call RegPack(RF, InData%StC_XY_M) + call RegPack(RF, InData%StC_Omni_M) call RegPack(RF, InData%StC_X_K) call RegPack(RF, InData%StC_Y_K) call RegPack(RF, InData%StC_Z_K) @@ -451,8 +556,16 @@ subroutine StC_PackInputFile(RF, Indata) call RegPack(RF, InData%StC_F_TBL_FILE) call RegPackAlloc(RF, InData%F_TBL) call RegPack(RF, InData%PrescribedForcesCoordSys) - call RegPack(RF, InData%PrescribedForcesFile) - call RegPackAlloc(RF, InData%StC_PrescribedForce) + call RegPackAlloc(RF, InData%PrescribedForcesFile) + call RegPack(RF, allocated(InData%StC_PrescribedForce)) + if (allocated(InData%StC_PrescribedForce)) then + call RegPackBounds(RF, 1, lbound(InData%StC_PrescribedForce), ubound(InData%StC_PrescribedForce)) + LB(1:1) = lbound(InData%StC_PrescribedForce) + UB(1:1) = ubound(InData%StC_PrescribedForce) + do i1 = LB(1), UB(1) + call StC_PackPrescrFrcTseries(RF, InData%StC_PrescribedForce(i1)) + end do + end if call RegPackAlloc(RF, InData%StC_CChan) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -461,6 +574,7 @@ subroutine StC_UnPackInputFile(RF, OutData) type(RegFile), intent(inout) :: RF type(StC_InputFile), intent(inout) :: OutData character(*), parameter :: RoutineName = 'StC_UnPackInputFile' + integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc @@ -480,7 +594,7 @@ subroutine StC_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%StC_X_M); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%StC_Y_M); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%StC_Z_M); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%StC_XY_M); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%StC_Omni_M); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%StC_X_K); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%StC_Y_K); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%StC_Z_K); if (RegCheckErr(RF, RoutineName)) return @@ -528,8 +642,20 @@ subroutine StC_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%StC_F_TBL_FILE); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%F_TBL); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PrescribedForcesCoordSys); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%PrescribedForcesFile); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%StC_PrescribedForce); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PrescribedForcesFile); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%StC_PrescribedForce)) deallocate(OutData%StC_PrescribedForce) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%StC_PrescribedForce(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%StC_PrescribedForce.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call StC_UnpackPrescrFrcTseries(RF, OutData%StC_PrescribedForce(i1)) ! StC_PrescribedForce + end do + end if call RegUnpackAlloc(RF, OutData%StC_CChan); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1435,8 +1561,10 @@ subroutine StC_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'StC_CopyParam' ErrStat = ErrID_None ErrMsg = '' @@ -1450,7 +1578,7 @@ subroutine StC_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%M_X = SrcParamData%M_X DstParamData%M_Y = SrcParamData%M_Y DstParamData%M_Z = SrcParamData%M_Z - DstParamData%M_XY = SrcParamData%M_XY + DstParamData%M_Omni = SrcParamData%M_Omni DstParamData%K_X = SrcParamData%K_X DstParamData%K_Y = SrcParamData%K_Y DstParamData%K_Z = SrcParamData%K_Z @@ -1501,16 +1629,20 @@ subroutine StC_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%NumMeshPts = SrcParamData%NumMeshPts DstParamData%PrescribedForcesCoordSys = SrcParamData%PrescribedForcesCoordSys if (allocated(SrcParamData%StC_PrescribedForce)) then - LB(1:2) = lbound(SrcParamData%StC_PrescribedForce) - UB(1:2) = ubound(SrcParamData%StC_PrescribedForce) + LB(1:1) = lbound(SrcParamData%StC_PrescribedForce) + UB(1:1) = ubound(SrcParamData%StC_PrescribedForce) if (.not. allocated(DstParamData%StC_PrescribedForce)) then - allocate(DstParamData%StC_PrescribedForce(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + allocate(DstParamData%StC_PrescribedForce(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%StC_PrescribedForce.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%StC_PrescribedForce = SrcParamData%StC_PrescribedForce + do i1 = LB(1), UB(1) + call StC_CopyPrescrFrcTseries(SrcParamData%StC_PrescribedForce(i1), DstParamData%StC_PrescribedForce(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if if (allocated(SrcParamData%StC_CChan)) then LB(1:1) = lbound(SrcParamData%StC_CChan) @@ -1530,6 +1662,10 @@ subroutine StC_DestroyParam(ParamData, ErrStat, ErrMsg) type(StC_ParameterType), intent(inout) :: ParamData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'StC_DestroyParam' ErrStat = ErrID_None ErrMsg = '' @@ -1537,6 +1673,12 @@ subroutine StC_DestroyParam(ParamData, ErrStat, ErrMsg) deallocate(ParamData%F_TBL) end if if (allocated(ParamData%StC_PrescribedForce)) then + LB(1:1) = lbound(ParamData%StC_PrescribedForce) + UB(1:1) = ubound(ParamData%StC_PrescribedForce) + do i1 = LB(1), UB(1) + call StC_DestroyPrescrFrcTseries(ParamData%StC_PrescribedForce(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do deallocate(ParamData%StC_PrescribedForce) end if if (allocated(ParamData%StC_CChan)) then @@ -1548,6 +1690,8 @@ subroutine StC_PackParam(RF, Indata) type(RegFile), intent(inout) :: RF type(StC_ParameterType), intent(in) :: InData character(*), parameter :: RoutineName = 'StC_PackParam' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%DT) call RegPack(RF, InData%RootName) @@ -1559,7 +1703,7 @@ subroutine StC_PackParam(RF, Indata) call RegPack(RF, InData%M_X) call RegPack(RF, InData%M_Y) call RegPack(RF, InData%M_Z) - call RegPack(RF, InData%M_XY) + call RegPack(RF, InData%M_Omni) call RegPack(RF, InData%K_X) call RegPack(RF, InData%K_Y) call RegPack(RF, InData%K_Z) @@ -1598,7 +1742,15 @@ subroutine StC_PackParam(RF, Indata) call RegPackAlloc(RF, InData%F_TBL) call RegPack(RF, InData%NumMeshPts) call RegPack(RF, InData%PrescribedForcesCoordSys) - call RegPackAlloc(RF, InData%StC_PrescribedForce) + call RegPack(RF, allocated(InData%StC_PrescribedForce)) + if (allocated(InData%StC_PrescribedForce)) then + call RegPackBounds(RF, 1, lbound(InData%StC_PrescribedForce), ubound(InData%StC_PrescribedForce)) + LB(1:1) = lbound(InData%StC_PrescribedForce) + UB(1:1) = ubound(InData%StC_PrescribedForce) + do i1 = LB(1), UB(1) + call StC_PackPrescrFrcTseries(RF, InData%StC_PrescribedForce(i1)) + end do + end if call RegPackAlloc(RF, InData%StC_CChan) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1607,6 +1759,7 @@ subroutine StC_UnPackParam(RF, OutData) type(RegFile), intent(inout) :: RF type(StC_ParameterType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'StC_UnPackParam' + integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc @@ -1621,7 +1774,7 @@ subroutine StC_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%M_X); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%M_Y); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%M_Z); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%M_XY); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%M_Omni); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%K_X); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%K_Y); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%K_Z); if (RegCheckErr(RF, RoutineName)) return @@ -1660,7 +1813,19 @@ subroutine StC_UnPackParam(RF, OutData) call RegUnpackAlloc(RF, OutData%F_TBL); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumMeshPts); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PrescribedForcesCoordSys); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%StC_PrescribedForce); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%StC_PrescribedForce)) deallocate(OutData%StC_PrescribedForce) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%StC_PrescribedForce(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%StC_PrescribedForce.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call StC_UnpackPrescrFrcTseries(RF, OutData%StC_PrescribedForce(i1)) ! StC_PrescribedForce + end do + end if call RegUnpackAlloc(RF, OutData%StC_CChan); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -2360,5 +2525,266 @@ SUBROUTINE StC_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Er y_out%MeasVel = a1*y1%MeasVel + a2*y2%MeasVel + a3*y3%MeasVel END IF ! check if allocated END SUBROUTINE + +function StC_InputMeshPointer(u, DL) result(Mesh) + type(StC_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (StC_u_Mesh) + Mesh => u%Mesh(DL%i1) + end select +end function + +function StC_OutputMeshPointer(y, DL) result(Mesh) + type(StC_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (StC_y_Mesh) + Mesh => y%Mesh(DL%i1) + end select +end function + +subroutine StC_VarsPackContState(Vars, x, ValAry) + type(StC_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call StC_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine StC_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(StC_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (StC_x_StC_x) + VarVals = x%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine StC_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(StC_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call StC_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine StC_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(StC_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (StC_x_StC_x) + x%StC_x(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function StC_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (StC_x_StC_x) + Name = "x%StC_x" + case default + Name = "Unknown Field" + end select +end function + +subroutine StC_VarsPackContStateDeriv(Vars, x, ValAry) + type(StC_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call StC_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine StC_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(StC_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (StC_x_StC_x) + VarVals = x%StC_x(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine StC_VarsPackInput(Vars, u, ValAry) + type(StC_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call StC_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine StC_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(StC_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (StC_u_Mesh) + call MV_PackMesh(V, u%Mesh(DL%i1), ValAry) ! Mesh + case (StC_u_CmdStiff) + VarVals = u%CmdStiff(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (StC_u_CmdDamp) + VarVals = u%CmdDamp(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (StC_u_CmdBrake) + VarVals = u%CmdBrake(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (StC_u_CmdForce) + VarVals = u%CmdForce(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (StC_u_CmdMoment) + VarVals = u%CmdMoment(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine StC_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(StC_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call StC_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine StC_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(StC_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (StC_u_Mesh) + call MV_UnpackMesh(V, ValAry, u%Mesh(DL%i1)) ! Mesh + case (StC_u_CmdStiff) + u%CmdStiff(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (StC_u_CmdDamp) + u%CmdDamp(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (StC_u_CmdBrake) + u%CmdBrake(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (StC_u_CmdForce) + u%CmdForce(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (StC_u_CmdMoment) + u%CmdMoment(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function StC_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (StC_u_Mesh) + Name = "u%Mesh("//trim(Num2LStr(DL%i1))//")" + case (StC_u_CmdStiff) + Name = "u%CmdStiff" + case (StC_u_CmdDamp) + Name = "u%CmdDamp" + case (StC_u_CmdBrake) + Name = "u%CmdBrake" + case (StC_u_CmdForce) + Name = "u%CmdForce" + case (StC_u_CmdMoment) + Name = "u%CmdMoment" + case default + Name = "Unknown Field" + end select +end function + +subroutine StC_VarsPackOutput(Vars, y, ValAry) + type(StC_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call StC_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine StC_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(StC_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (StC_y_Mesh) + call MV_PackMesh(V, y%Mesh(DL%i1), ValAry) ! Mesh + case (StC_y_MeasDisp) + VarVals = y%MeasDisp(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (StC_y_MeasVel) + VarVals = y%MeasVel(V%iLB:V%iUB,V%j) ! Rank 2 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine StC_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(StC_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call StC_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine StC_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(StC_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (StC_y_Mesh) + call MV_UnpackMesh(V, ValAry, y%Mesh(DL%i1)) ! Mesh + case (StC_y_MeasDisp) + y%MeasDisp(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (StC_y_MeasVel) + y%MeasVel(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + end select + end associate +end subroutine + +function StC_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (StC_y_Mesh) + Name = "y%Mesh("//trim(Num2LStr(DL%i1))//")" + case (StC_y_MeasDisp) + Name = "y%MeasDisp" + case (StC_y_MeasVel) + Name = "y%MeasVel" + case default + Name = "Unknown Field" + end select +end function + END MODULE StrucCtrl_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/servodyn/src/UserSubs.f90 b/modules/servodyn/src/UserSubs.f90 index 7ac97a52f4..90122cd708 100644 --- a/modules/servodyn/src/UserSubs.f90 +++ b/modules/servodyn/src/UserSubs.f90 @@ -459,5 +459,39 @@ SUBROUTINE UserYawCont ( YawPos, YawRate, WindDir, YawError, NumBl, ZTime, DT, D RETURN END SUBROUTINE UserYawCont + +!========================================================================== +! Template for user-defined structural control subroutine used with StC_CMODE=3 +! Currently, this can only be used with +! StC_DOF_MODE = 1 (three independent StC/TMD DOFs), +! 2 (2DOF (XY) omni-directional StC/TMDs), +! 3 (3DOF (XYZ) omni-directional StC/TMDs), +! or 7 (external forces and moments). +! d is the apparent 3DOF displacement of the TMD mass relative to the parent structure. +! v is the apparent 3DOF velocity of the TMD mass relative to the parent structure. +! For blade control, UserStC is called for each mesh point separately. +SUBROUTINE UserStC(d,v,K_ctrl,C_ctrl,C_Brake,F_ctrl,M_ctrl) + +USE Precision +USE NWTC_Library +IMPLICIT NONE + +REAL(ReKi), INTENT(IN ) :: d(3) !< TMD mass apparent relative displacement +REAL(ReKi), INTENT(IN ) :: v(3) !< TMD mass apparent relative velocity +REAL(ReKi), INTENT(OUT) :: K_ctrl(3) !< stiffness commanded +REAL(ReKi), INTENT(OUT) :: C_ctrl(3) !< damping commanded +REAL(ReKi), INTENT(OUT) :: C_Brake(3) !< brake dmpg commanded +REAL(ReKi), INTENT(OUT) :: F_ctrl(3) !< force commanded +REAL(ReKi), INTENT(OUT) :: M_ctrl(3) !< moment commanded + +! Replace the lines below with controller/actuator logic +K_ctrl = 0.0_ReKi +C_ctrl = 0.0_ReKi +C_Brake = 0.0_ReKi +F_ctrl = 0.0_ReKi +M_ctrl = 0.0_ReKi + +END SUBROUTINE UserStc + !======================================================================= end module UserSubs diff --git a/modules/simple-elastodyn/src/SED.f90 b/modules/simple-elastodyn/src/SED.f90 index e1b433356a..3c1d2fa540 100644 --- a/modules/simple-elastodyn/src/SED.f90 +++ b/modules/simple-elastodyn/src/SED.f90 @@ -37,15 +37,14 @@ MODULE SED public :: SED_UpdateStates public :: SED_CalcOutput public :: SED_CalcContStateDeriv - + public :: SED_JacobianPInput + public :: SED_JacobianPContState + ! Linearization is not supported by this module, so the following routines are omitted !public :: SED_CalcConstrStateResidual !public :: SED_UpdateDiscState - !public :: SED_JacobianPInput - !public :: SED_JacobianPContState !public :: SED_JacobianPDiscState !public :: SED_JacobianPConstrState - !public :: SED_GetOP CONTAINS @@ -141,6 +140,10 @@ SUBROUTINE SED_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOu ! Set InitOutputs call Init_InitY(ErrStat2,ErrMsg2); if (Failed()) return + ! Initialize module variables + call SED_InitVars(u, p, x, y, m, InitOut%Vars, InputFileData, .false., ErrStat2, ErrMsg2) + if (Failed()) return + contains logical function Failed() call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -532,6 +535,145 @@ end subroutine Init_Y END SUBROUTINE SED_Init +subroutine SED_InitVars(u, p, x, y, m, Vars, InputFileData, Linearize, ErrStat, ErrMsg) + type(SED_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(SED_ParameterType), intent(inout) :: p !< Parameters + type(SED_ContinuousStateType), intent(inout) :: x !< Continuous state + type(SED_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(SED_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(ModVarsType), intent(inout) :: Vars !< Module variables + type(SED_InputFile), intent(in) :: InputFileData !< Input file data + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_No ne + + character(*), parameter :: RoutineName = 'SED_InitVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + real(R8Ki) :: MaxThrust, MaxTorque, ScaleLength + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = "" + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + call MV_AddVar(Vars%x, 'GeneratorAzimuth', FieldAngularDisp, & + DL=DatLoc(SED_x_QT), iAry=DOF_Az, & + Flags=VF_DerivOrder2, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Variable speed generator DOF (internal DOF index = DOF_Az), rad'], & + Active=p%GenDOF) + + call MV_AddVar(Vars%x, 'GeneratorAzimuth', FieldAngularVel, & + DL=DatLoc(SED_x_QDT), iAry=DOF_Az, & + Flags=VF_DerivOrder2, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['First time derivative of Variable speed generator DOF (internal DOF index = DOF_Az), rad/s'], & + Active=p%GenDOF) + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + ScaleLength = max(p%TipRad, p%TowerHt, 1.0_ReKi) + MaxThrust = 490.0_R8Ki * pi_D / 9.0_R8Ki * ScaleLength**2 + MaxTorque = 122.5_R8Ki * pi_D / 27.0_R8Ki * ScaleLength**3 + + call MV_AddMeshVar(Vars%u, "Hub", LoadFields, & + DL=DatLoc(SED_u_HubPtLoad), & + Mesh=u%HubPtLoad, & + Perturbs=[MaxThrust / 100.0_R8Ki, & + MaxTorque / 100.0_R8Ki]) + + call MV_AddVar(Vars%u, "GenTrq", FieldScalar, & + DL=DatLoc(SED_u_GenTrq), & + Flags=VF_Linearize, & + Perturb=MaxTorque / (100.0_R8Ki*p%GBoxRatio), & + LinNames=['Generator torque, Nm']) + + call MV_AddVar(Vars%u, "BlPitchCom", FieldScalar, & + DL=DatLoc(SED_u_BlPitchCom), iAry=1, & + Num=p%NumBl, & + Flags=VF_RotFrame + VF_Linearize + VF_2PI, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=[('Blade '//trim(num2lstr(i))//' pitch command, rad', i=1,p%NumBl)]) + + call MV_AddVar(Vars%u, "YawPosCom", FieldScalar, & + DL=DatLoc(SED_u_YawPosCom), & + Flags=VF_Linearize, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Yaw position command, rad']) + + call MV_AddVar(Vars%u, "YawRateCom", FieldScalar, & + DL=DatLoc(SED_u_YawRateCom), & + Flags=VF_Linearize, & + Perturb=2.0_R8Ki * D2R_D, & + LinNames=['Yaw rate command, rad/s']) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + call MV_AddMeshVar(Vars%y, 'Hub', MotionFields, & + DatLoc(SED_y_HubPtMotion), & + Mesh=y%HubPtMotion) + + call MV_AddMeshVar(Vars%y, 'Platform', MotionFields, & + DatLoc(SED_y_PlatformPtMesh), & + Mesh=y%PlatformPtMesh) + + call MV_AddMeshVar(Vars%y, 'Tower', MotionFields, & + DatLoc(SED_y_TowerLn2Mesh), & + Mesh=y%TowerLn2Mesh, & + Flags=VF_Line) + + do i = 1, p%NumBl + call MV_AddMeshVar(Vars%y, 'Blade root '//Num2LStr(i), MotionFields, & + DatLoc(SED_y_BladeRootMotion, i), & + Mesh=y%BladeRootMotion(i)) + end do + + call MV_AddMeshVar(Vars%y, 'Nacelle', MotionFields, & + DatLoc(SED_y_NacelleMotion), & + Mesh=y%NacelleMotion) + + !-------------------- + ! Non-mesh outputs + !-------------------- + + call MV_AddVar(Vars%y, 'Yaw', FieldScalar, & + DatLoc(SED_y_Yaw), & + Flags=VF_2PI, & + LinNames=['Yaw, rad']) + + call MV_AddVar(Vars%y, 'YawRate', FieldScalar, & + DatLoc(SED_y_YawRate), & + LinNames=['YawRate, rad/s']) + + call MV_AddVar(Vars%y, 'HSS_Spd', FieldScalar, & + DatLoc(SED_y_HSS_Spd), & + LinNames=['HSS_Spd, rad/s']) + + !---------------------------------------------------------------------------- + ! Initialization dependent on linearization + !---------------------------------------------------------------------------- + + call MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call SED_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SED_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SED_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SED_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine !---------------------------------------------------------------------------------------------------------------------------------- !> This routine is called at the end of the simulation. @@ -1375,6 +1517,250 @@ logical function Failed() end function Failed END SUBROUTINE SED_CalcContStateDeriv +!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions +!! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and dZ/du are returned. +SUBROUTINE SED_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +!.................................................................................................................................. + + type(ModVarsType), INTENT(IN ) :: Vars !< Module variables + REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point + TYPE(SED_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) + TYPE(SED_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SED_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point + TYPE(SED_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point + TYPE(SED_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point + TYPE(SED_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point + TYPE(SED_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); + !! Output fields are not used by this routine, but type is + !! available here so that mesh parameter information (i.e., + !! connectivity) does not have to be recalculated for dYdu. + TYPE(SED_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdu(:,:) !< Partial derivatives of output functions (Y) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) with respect to the inputs (u) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) with respect to the inputs (u) [intent in to avoid deallocation] + + CHARACTER(*), PARAMETER :: RoutineName = 'SED_JacobianPInput' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, iCol + + ErrStat = ErrID_None + ErrMsg = '' + + ! Update copy of the inputs to perturb + call SED_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackInput(Vars, u, m%Jac%u) + + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdu)) then + + ! Allocate dYdu if not allocated + if (.not. allocated(dYdu)) then + call AllocAry(dYdu, m%Jac%Ny, m%Jac%Nu, 'dYdu', ErrStat2, ErrMsg2); if (Failed()) return + end if + + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num + + ! Calculate column index + iCol = Vars%u(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call SED_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SED_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call SED_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SED_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,iCol)) + end do + end do + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + if (present(dXdu) .and. (m%Jac%Nx > 0)) then + + ! Allocate dXdu if not allocated + if (.not. allocated(dXdu)) then + call AllocAry(dXdu, m%Jac%Nx, m%Jac%Nu, 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return + end if + + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%u(i)%Num + + ! Calculate column index + iCol = Vars%u(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call SED_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SED_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call SED_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SED_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdu(:,iCol) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%u(i)%Perturb) + end do + end do + end if + + if (present(dXddu)) then + if (allocated(dXddu)) deallocate(dXddu) + end if + + if (present(dZdu)) then + if (allocated(dZdu)) deallocate(dZdu) + end if + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +END SUBROUTINE SED_JacobianPInput + +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions +!! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. +SUBROUTINE SED_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) + + type(ModVarsType), INTENT(IN ) :: Vars !< Module variables + REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point + TYPE(SED_InputType), INTENT(IN ) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) + TYPE(SED_ParameterType), INTENT(IN ) :: p !< Parameters + TYPE(SED_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point + TYPE(SED_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point + TYPE(SED_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point + TYPE(SED_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point + TYPE(SED_OutputType), INTENT(INOUT) :: y !< Output (change to inout if a mesh copy is required); + !! Output fields are not used by this routine, but type is + !! available here so that mesh parameter information (i.e., + !! connectivity) does not have to be recalculated for dYdu. + TYPE(SED_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dYdx(:,:) !< Partial derivatives of output functions (Y) with respect to the continuous states (x) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state functions (X) with respect to the continuous states (x) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state functions (Xd) with respect to the continuous states (x) [intent in to avoid deallocation] + REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state functions (Z) with respect to the continuous states (x) [intent in to avoid deallocation] + + CHARACTER(*), PARAMETER :: RoutineName = 'ED_JacobianPContState' + INTEGER(IntKi) :: ErrStat2 + CHARACTER(ErrMsgLen) :: ErrMsg2 + INTEGER(IntKi) :: i, j, iCol + + ErrStat = ErrID_None + ErrMsg = '' + + ! Copy state values + call SED_CopyContState(x, m%x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackContState(Vars, x, m%Jac%x) + + ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + if (present(dYdx)) then + + ! Allocate dYdx if not allocated + if (.not. allocated(dYdx)) then + call AllocAry(dYdx, m%Jac%Ny, m%Jac%Nx, 'dYdx', ErrStat2, ErrMsg2); if (Failed()) return + end if + + ! Loop through state variables + do i = 1, size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate column index + iCol = Vars%x(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call SED_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SED_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call SED_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SED_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%x(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdx(:,iCol)) + end do + end do + + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + if (present(dXdx) .and. (m%Jac%Nx > 0)) then + + ! Allocate dXdx if not allocated + if (.not. allocated(dXdx)) then + call AllocAry(dXdx, m%Jac%Nx, m%Jac%Nx, 'dXdx', ErrStat2, ErrMsg2); if (Failed()) return + end if + + ! Loop through state variables + do i = 1, size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate column index + iCol = Vars%x(i)%iLoc(1) + j - 1 + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call SED_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SED_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call SED_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SED_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SED_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Get partial derivative via central difference and store in full linearization array + dXdx(:,iCol) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%x(i)%Perturb) + end do + end do + end if + + if (present(dXddx)) then + if (allocated(dXddx)) deallocate(dXddx) + end if + + if (present(dZdx)) then + if (allocated(dZdx)) deallocate(dZdx) + end if + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function +END SUBROUTINE SED_JacobianPContState END MODULE SED !********************************************************************************************************************************** diff --git a/modules/simple-elastodyn/src/SED_Registry.txt b/modules/simple-elastodyn/src/SED_Registry.txt index 5f52f1ea70..da9b22187c 100644 --- a/modules/simple-elastodyn/src/SED_Registry.txt +++ b/modules/simple-elastodyn/src/SED_Registry.txt @@ -64,7 +64,7 @@ typedef ^ InitOutputType ReKi PlatformPos {6} - typedef ^ InitOutputType ReKi HubRad - - - "Preconed hub radius (distance from the rotor apex to the blade root)" m typedef ^ InitOutputType ReKi RotSpeed - - - "Initial or fixed rotor speed" rad/s typedef ^ InitOutputType LOGICAL GenDOF - - - "whether the generator DOF is on (true) or off (false)" - - +typedef ^ InitOutputType ModVarsType Vars - - - "Module variables" - # ..... Inputs .................................................................................................................... # inputs on meshes: @@ -154,4 +154,9 @@ typedef ^ MiscVarType MeshMapType mapNac2Hub - - typedef ^ MiscVarType MeshMapType mapHub2Root {:} - - "Mesh mapping from Hub to BladeRootMotion (blade pitch overwritten in calc)" - typedef ^ MiscVarType R8Ki QD2T {:} - - "Current estimate of first derivative of QD (acceleration matrix) for each degree of freedom" typedef ^ MiscVarType ReKi HubPt_X {3} - - "X orientation of hub calculated in CalcOutput -- saving so we don't recalculate a bunch of things to get it in UpdateStates" +typedef ^ MiscVarType ModJacType Jac - - - "Values corresponding to module variables" +typedef ^ MiscVarType SED_ContinuousStateType x_perturb - - - "Continuous state type for linearization perturbation" - +typedef ^ MiscVarType SED_ContinuousStateType dxdt_lin - - - "Continuous state type for linearization output" - +typedef ^ MiscVarType SED_InputType u_perturb - - - "Input type for linearization perturbation" - +typedef ^ MiscVarType SED_OutputType y_lin - - - "Output type for linearization output" - diff --git a/modules/simple-elastodyn/src/SED_Types.f90 b/modules/simple-elastodyn/src/SED_Types.f90 index e5b3e3ddf1..ea94df58bd 100644 --- a/modules/simple-elastodyn/src/SED_Types.f90 +++ b/modules/simple-elastodyn/src/SED_Types.f90 @@ -33,7 +33,7 @@ MODULE SED_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: SED_NMX = 4 ! Used in updating predictor-corrector values (size of state history) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: SED_NMX = 4 ! Used in updating predictor-corrector values (size of state history) [-] ! ========= SED_InputFile ======= TYPE, PUBLIC :: SED_InputFile LOGICAL :: Echo = .false. !< Echo the input file [-] @@ -85,6 +85,7 @@ MODULE SED_Types REAL(ReKi) :: HubRad = 0.0_ReKi !< Preconed hub radius (distance from the rotor apex to the blade root) [m] REAL(ReKi) :: RotSpeed = 0.0_ReKi !< Initial or fixed rotor speed [rad/s] LOGICAL :: GenDOF = .false. !< whether the generator DOF is on (true) or off (false) [-] + TYPE(ModVarsType) :: Vars !< Module variables [-] END TYPE SED_InitOutputType ! ======================= ! ========= SED_InputType ======= @@ -178,9 +179,37 @@ MODULE SED_Types TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: mapHub2Root !< Mesh mapping from Hub to BladeRootMotion (blade pitch overwritten in calc) [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: QD2T !< Current estimate of first derivative of QD (acceleration matrix) for each degree of freedom [-] REAL(ReKi) , DIMENSION(1:3) :: HubPt_X = 0.0_ReKi !< X orientation of hub calculated in CalcOutput -- saving so we don't recalculate a bunch of things to get it in UpdateStates [-] + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] + TYPE(SED_ContinuousStateType) :: x_perturb !< Continuous state type for linearization perturbation [-] + TYPE(SED_ContinuousStateType) :: dxdt_lin !< Continuous state type for linearization output [-] + TYPE(SED_InputType) :: u_perturb !< Input type for linearization perturbation [-] + TYPE(SED_OutputType) :: y_lin !< Output type for linearization output [-] END TYPE SED_MiscVarType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: SED_x_QT = 1 ! SED%QT + integer(IntKi), public, parameter :: SED_x_QDT = 2 ! SED%QDT + integer(IntKi), public, parameter :: SED_u_HubPtLoad = 3 ! SED%HubPtLoad + integer(IntKi), public, parameter :: SED_u_HSSBrTrqC = 4 ! SED%HSSBrTrqC + integer(IntKi), public, parameter :: SED_u_GenTrq = 5 ! SED%GenTrq + integer(IntKi), public, parameter :: SED_u_BlPitchCom = 6 ! SED%BlPitchCom + integer(IntKi), public, parameter :: SED_u_YawPosCom = 7 ! SED%YawPosCom + integer(IntKi), public, parameter :: SED_u_YawRateCom = 8 ! SED%YawRateCom + integer(IntKi), public, parameter :: SED_y_BladeRootMotion = 9 ! SED%BladeRootMotion(DL%i1) + integer(IntKi), public, parameter :: SED_y_HubPtMotion = 10 ! SED%HubPtMotion + integer(IntKi), public, parameter :: SED_y_NacelleMotion = 11 ! SED%NacelleMotion + integer(IntKi), public, parameter :: SED_y_TowerLn2Mesh = 12 ! SED%TowerLn2Mesh + integer(IntKi), public, parameter :: SED_y_PlatformPtMesh = 13 ! SED%PlatformPtMesh + integer(IntKi), public, parameter :: SED_y_LSSTipPxa = 14 ! SED%LSSTipPxa + integer(IntKi), public, parameter :: SED_y_RotSpeed = 15 ! SED%RotSpeed + integer(IntKi), public, parameter :: SED_y_RotPwr = 16 ! SED%RotPwr + integer(IntKi), public, parameter :: SED_y_RotTrq = 17 ! SED%RotTrq + integer(IntKi), public, parameter :: SED_y_HSS_Spd = 18 ! SED%HSS_Spd + integer(IntKi), public, parameter :: SED_y_Yaw = 19 ! SED%Yaw + integer(IntKi), public, parameter :: SED_y_YawRate = 20 ! SED%YawRate + integer(IntKi), public, parameter :: SED_y_BlPitch = 21 ! SED%BlPitch + integer(IntKi), public, parameter :: SED_y_WriteOutput = 22 ! SED%WriteOutput + +contains subroutine SED_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg) type(SED_InputFile), intent(in) :: SrcInputFileData @@ -425,6 +454,9 @@ subroutine SED_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, Er DstInitOutputData%HubRad = SrcInitOutputData%HubRad DstInitOutputData%RotSpeed = SrcInitOutputData%RotSpeed DstInitOutputData%GenDOF = SrcInitOutputData%GenDOF + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine SED_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) @@ -447,6 +479,8 @@ subroutine SED_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) if (allocated(InitOutputData%BlPitch)) then deallocate(InitOutputData%BlPitch) end if + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine SED_PackInitOutput(RF, Indata) @@ -466,6 +500,7 @@ subroutine SED_PackInitOutput(RF, Indata) call RegPack(RF, InData%HubRad) call RegPack(RF, InData%RotSpeed) call RegPack(RF, InData%GenDOF) + call NWTC_Library_PackModVarsType(RF, InData%Vars) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -489,6 +524,7 @@ subroutine SED_UnPackInitOutput(RF, OutData) call RegUnpack(RF, OutData%HubRad); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GenDOF); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars end subroutine subroutine SED_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) @@ -1212,6 +1248,21 @@ subroutine SED_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) DstMiscData%QD2T = SrcMiscData%QD2T end if DstMiscData%HubPt_X = SrcMiscData%HubPt_X + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SED_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SED_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SED_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SED_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return end subroutine subroutine SED_DestroyMisc(MiscData, ErrStat, ErrMsg) @@ -1242,6 +1293,16 @@ subroutine SED_DestroyMisc(MiscData, ErrStat, ErrMsg) if (allocated(MiscData%QD2T)) then deallocate(MiscData%QD2T) end if + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SED_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SED_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SED_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SED_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) end subroutine subroutine SED_PackMisc(RF, Indata) @@ -1264,6 +1325,11 @@ subroutine SED_PackMisc(RF, Indata) end if call RegPackAlloc(RF, InData%QD2T) call RegPack(RF, InData%HubPt_X) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call SED_PackContState(RF, InData%x_perturb) + call SED_PackContState(RF, InData%dxdt_lin) + call SED_PackInput(RF, InData%u_perturb) + call SED_PackOutput(RF, InData%y_lin) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1293,6 +1359,11 @@ subroutine SED_UnPackMisc(RF, OutData) end if call RegUnpackAlloc(RF, OutData%QD2T); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HubPt_X); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call SED_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call SED_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call SED_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call SED_UnpackOutput(RF, OutData%y_lin) ! y_lin end subroutine subroutine SED_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -1686,5 +1757,348 @@ SUBROUTINE SED_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Er y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function SED_InputMeshPointer(u, DL) result(Mesh) + type(SED_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (SED_u_HubPtLoad) + Mesh => u%HubPtLoad + end select +end function + +function SED_OutputMeshPointer(y, DL) result(Mesh) + type(SED_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (SED_y_BladeRootMotion) + Mesh => y%BladeRootMotion(DL%i1) + case (SED_y_HubPtMotion) + Mesh => y%HubPtMotion + case (SED_y_NacelleMotion) + Mesh => y%NacelleMotion + case (SED_y_TowerLn2Mesh) + Mesh => y%TowerLn2Mesh + case (SED_y_PlatformPtMesh) + Mesh => y%PlatformPtMesh + end select +end function + +subroutine SED_VarsPackContState(Vars, x, ValAry) + type(SED_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SED_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SED_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SED_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SED_x_QT) + VarVals = x%QT(V%iLB:V%iUB) ! Rank 1 Array + case (SED_x_QDT) + VarVals = x%QDT(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SED_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SED_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SED_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine SED_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SED_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SED_x_QT) + x%QT(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SED_x_QDT) + x%QDT(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SED_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SED_x_QT) + Name = "x%QT" + case (SED_x_QDT) + Name = "x%QDT" + case default + Name = "Unknown Field" + end select +end function + +subroutine SED_VarsPackContStateDeriv(Vars, x, ValAry) + type(SED_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SED_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SED_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SED_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SED_x_QT) + VarVals = x%QT(V%iLB:V%iUB) ! Rank 1 Array + case (SED_x_QDT) + VarVals = x%QDT(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SED_VarsPackInput(Vars, u, ValAry) + type(SED_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SED_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine SED_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(SED_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SED_u_HubPtLoad) + call MV_PackMesh(V, u%HubPtLoad, ValAry) ! Mesh + case (SED_u_HSSBrTrqC) + VarVals(1) = u%HSSBrTrqC ! Scalar + case (SED_u_GenTrq) + VarVals(1) = u%GenTrq ! Scalar + case (SED_u_BlPitchCom) + VarVals = u%BlPitchCom(V%iLB:V%iUB) ! Rank 1 Array + case (SED_u_YawPosCom) + VarVals(1) = u%YawPosCom ! Scalar + case (SED_u_YawRateCom) + VarVals(1) = u%YawRateCom ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SED_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SED_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SED_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine SED_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SED_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SED_u_HubPtLoad) + call MV_UnpackMesh(V, ValAry, u%HubPtLoad) ! Mesh + case (SED_u_HSSBrTrqC) + u%HSSBrTrqC = VarVals(1) ! Scalar + case (SED_u_GenTrq) + u%GenTrq = VarVals(1) ! Scalar + case (SED_u_BlPitchCom) + u%BlPitchCom(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SED_u_YawPosCom) + u%YawPosCom = VarVals(1) ! Scalar + case (SED_u_YawRateCom) + u%YawRateCom = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function SED_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SED_u_HubPtLoad) + Name = "u%HubPtLoad" + case (SED_u_HSSBrTrqC) + Name = "u%HSSBrTrqC" + case (SED_u_GenTrq) + Name = "u%GenTrq" + case (SED_u_BlPitchCom) + Name = "u%BlPitchCom" + case (SED_u_YawPosCom) + Name = "u%YawPosCom" + case (SED_u_YawRateCom) + Name = "u%YawRateCom" + case default + Name = "Unknown Field" + end select +end function + +subroutine SED_VarsPackOutput(Vars, y, ValAry) + type(SED_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SED_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine SED_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(SED_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SED_y_BladeRootMotion) + call MV_PackMesh(V, y%BladeRootMotion(DL%i1), ValAry) ! Mesh + case (SED_y_HubPtMotion) + call MV_PackMesh(V, y%HubPtMotion, ValAry) ! Mesh + case (SED_y_NacelleMotion) + call MV_PackMesh(V, y%NacelleMotion, ValAry) ! Mesh + case (SED_y_TowerLn2Mesh) + call MV_PackMesh(V, y%TowerLn2Mesh, ValAry) ! Mesh + case (SED_y_PlatformPtMesh) + call MV_PackMesh(V, y%PlatformPtMesh, ValAry) ! Mesh + case (SED_y_LSSTipPxa) + VarVals(1) = y%LSSTipPxa ! Scalar + case (SED_y_RotSpeed) + VarVals(1) = y%RotSpeed ! Scalar + case (SED_y_RotPwr) + VarVals(1) = y%RotPwr ! Scalar + case (SED_y_RotTrq) + VarVals(1) = y%RotTrq ! Scalar + case (SED_y_HSS_Spd) + VarVals(1) = y%HSS_Spd ! Scalar + case (SED_y_Yaw) + VarVals(1) = y%Yaw ! Scalar + case (SED_y_YawRate) + VarVals(1) = y%YawRate ! Scalar + case (SED_y_BlPitch) + VarVals = y%BlPitch(V%iLB:V%iUB) ! Rank 1 Array + case (SED_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SED_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SED_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SED_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine SED_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SED_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SED_y_BladeRootMotion) + call MV_UnpackMesh(V, ValAry, y%BladeRootMotion(DL%i1)) ! Mesh + case (SED_y_HubPtMotion) + call MV_UnpackMesh(V, ValAry, y%HubPtMotion) ! Mesh + case (SED_y_NacelleMotion) + call MV_UnpackMesh(V, ValAry, y%NacelleMotion) ! Mesh + case (SED_y_TowerLn2Mesh) + call MV_UnpackMesh(V, ValAry, y%TowerLn2Mesh) ! Mesh + case (SED_y_PlatformPtMesh) + call MV_UnpackMesh(V, ValAry, y%PlatformPtMesh) ! Mesh + case (SED_y_LSSTipPxa) + y%LSSTipPxa = VarVals(1) ! Scalar + case (SED_y_RotSpeed) + y%RotSpeed = VarVals(1) ! Scalar + case (SED_y_RotPwr) + y%RotPwr = VarVals(1) ! Scalar + case (SED_y_RotTrq) + y%RotTrq = VarVals(1) ! Scalar + case (SED_y_HSS_Spd) + y%HSS_Spd = VarVals(1) ! Scalar + case (SED_y_Yaw) + y%Yaw = VarVals(1) ! Scalar + case (SED_y_YawRate) + y%YawRate = VarVals(1) ! Scalar + case (SED_y_BlPitch) + y%BlPitch(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SED_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SED_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SED_y_BladeRootMotion) + Name = "y%BladeRootMotion("//trim(Num2LStr(DL%i1))//")" + case (SED_y_HubPtMotion) + Name = "y%HubPtMotion" + case (SED_y_NacelleMotion) + Name = "y%NacelleMotion" + case (SED_y_TowerLn2Mesh) + Name = "y%TowerLn2Mesh" + case (SED_y_PlatformPtMesh) + Name = "y%PlatformPtMesh" + case (SED_y_LSSTipPxa) + Name = "y%LSSTipPxa" + case (SED_y_RotSpeed) + Name = "y%RotSpeed" + case (SED_y_RotPwr) + Name = "y%RotPwr" + case (SED_y_RotTrq) + Name = "y%RotTrq" + case (SED_y_HSS_Spd) + Name = "y%HSS_Spd" + case (SED_y_Yaw) + Name = "y%Yaw" + case (SED_y_YawRate) + Name = "y%YawRate" + case (SED_y_BlPitch) + Name = "y%BlPitch" + case (SED_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE SED_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/soildyn/CMakeLists.txt b/modules/soildyn/CMakeLists.txt new file mode 100644 index 0000000000..eca873d5a1 --- /dev/null +++ b/modules/soildyn/CMakeLists.txt @@ -0,0 +1,48 @@ +# +# Copyright 2016 National Renewable Energy Laboratory +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +if (GENERATE_TYPES) + generate_f90_types(src/SoilDyn_Registry.txt ${CMAKE_CURRENT_LIST_DIR}/src/SoilDyn_Types.f90) +endif() + +# SoilDyn Library +add_library(soildynlib STATIC + src/REDWINinterface.f90 + src/SoilDyn.f90 + src/SoilDyn_IO.f90 + src/SoilDyn_Types.f90) +target_link_libraries(soildynlib nwtclibs) +if (WIN_DLL_LOAD) + target_compile_definitions(soildynlib PRIVATE LibLoad) +else (WIN_DLL_LOAD) + target_compile_definitions(soildynlib PRIVATE NO_LibLoad) +endif (WIN_DLL_LOAD) + +# SoilDyn Driver +add_executable(soildyn_driver + src/driver/SoilDyn_Driver_Types.f90 + src/driver/SoilDyn_Driver_Subs.f90 + src/driver/SoilDyn_Driver.f90 +) +target_link_libraries(soildyn_driver soildynlib nwtclibs versioninfolib) + + +install(TARGETS soildynlib soildyn_driver + EXPORT "${CMAKE_PROJECT_NAME}Libraries" + RUNTIME DESTINATION bin + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib +) diff --git a/modules/soildyn/README.md b/modules/soildyn/README.md new file mode 100644 index 0000000000..230c536dc9 --- /dev/null +++ b/modules/soildyn/README.md @@ -0,0 +1,3 @@ +# OpenFAST SoilDyn Module + +This directory contains the module SoilDyn. This module models the soil structure interface, and can be coupled to external DLL such as RedWin. diff --git a/modules/soildyn/src/REDWINinterface.f90 b/modules/soildyn/src/REDWINinterface.f90 new file mode 100644 index 0000000000..cc2326a966 --- /dev/null +++ b/modules/soildyn/src/REDWINinterface.f90 @@ -0,0 +1,522 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2013-2016 National Renewable Energy Laboratory +! +! This file is part of SoilDyn. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** +module REDWINinterface + +!> NOTE: The REDWIN coordinate system is not the same as the OpenFAST global coordinate frame. The Y axis +!! is flipped, and the Z axis is flipped. However, because REDWIN does not have a preferred +!! directionality (it is the same response amplitude for the negative direction time series of +!! displacements), this does not matter. So we simply ignore the fact that the coordinate frames +!! are flipped on Y and Z. + +use NWTC_Library, only: IntKi, ReKi, SiKi, DbKi, R8Ki, ProgDesc, DLL_Type, ErrMsgLen, PathIsRelative, & + OS_DESC, ErrID_None, ErrID_Info, ErrID_Warn, ErrID_Fatal, AbortErrLev, PathSep, & + NewLine, Num2LStr, Get_CWD, LoadDynamicLib, FreeDynamicLib, SetErrStat, DispNVD +use SoilDyn_Types, only: REDWINdllType + +implicit none + +integer(IntKi), parameter :: IDtask_unkown = 0_IntKi ! Unknown task (placeholder for error checking) +integer(IntKi), parameter :: IDtask_init = 1_IntKi ! Initialize DLL +integer(IntKi), parameter :: IDtask_calc = 2_IntKi ! Calculate resultant force +integer(IntKi), parameter :: IDtask_stiff = 3_IntKi ! Return stiffness 6x6 + +!> Definition of the DLL Interface (from REDWIN): +abstract interface + subroutine REDWINdll_interface_v00(PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D) + use, intrinsic :: ISO_C_Binding, only: C_INT, C_CHAR, C_DOUBLE + character(kind=c_char), intent(inout) :: PROPSFILE(45) + character(kind=c_char), intent(inout) :: LDISPFILE(45) + integer(c_int), intent(inout) :: IDTask + integer(c_int), intent(inout) :: nErrorCode + real(c_double), intent(inout) :: Props(1:100, 1:200) + real(c_double), intent(inout) :: StVar(1:12, 1:100) + integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) + real(c_double), intent(inout) :: Disp(1:6) ! meters and radians + real(c_double), intent(inout) :: Force(1:6) + real(c_double), intent(inout) :: D(1:6, 1:6) + integer(c_int), intent(inout) :: ErrorCode(1:100) + end subroutine REDWINdll_interface_v00 +end interface + +#ifdef STATIC_DLL_LOAD +interface + ! DO NOT REMOVE or MODIFY LINES starting with "!DEC$" or "!GCC$" + ! !DEC$ specifies attributes for IVF and !GCC$ specifies attributes for gfortran + ! NOTE: BIND(C... does not appear to be built into the DLL from REDWIN. + subroutine INTERFACEFOUNDATION(PROPSFILE, LDISPFILE, IDTask, nErrorCode, ErrorCode, Props, StVar, StVarPrint, Disp, Force, D) !BIND(C, NAME='INTERFACEFOUNDATION') + !DEC$ ATTRIBUTES DLLIMPORT :: INTERFACEFOUNDATION + !GCC$ ATTRIBUTES DLLIMPORT :: INTERFACEFOUNDATION + use, intrinsic :: ISO_C_Binding, only: C_INT, C_CHAR, C_DOUBLE + character(kind=c_char), intent(inout) :: PROPSFILE(45) + character(kind=c_char), intent(inout) :: LDISPFILE(45) + integer(c_int), intent(inout) :: IDTask + integer(c_int), intent(inout) :: nErrorCode + real(c_double), intent(inout) :: Props(1:100, 1:200) + real(c_double), intent(inout) :: StVar(1:12, 1:100) + integer(c_int), intent(inout) :: StVarPrint(1:12, 1:100) + real(c_double), intent(inout) :: Disp(1:6) ! meters and radians + real(c_double), intent(inout) :: Force(1:6) + real(c_double), intent(inout) :: D(1:6, 1:6) + integer(c_int), intent(inout) :: ErrorCode(1:100) + end subroutine INTERFACEFOUNDATION +end interface +#endif + +type(ProgDesc), parameter :: REDWINinterface_Ver = ProgDesc('SoilDyn Interface for REDWIN soil interaction DLLs', 'using '//TRIM(OS_Desc), '28-Aug-2022') + +! Interface version (in case we end up with multiple different versions supported at some later date) +integer(IntKi), parameter :: RW_v00 = 0 ! Version number +integer(IntKi), parameter :: RW_ver = RW_v00 ! Current version number (read from DLL file) + +contains +!================================================================================================================================== +!> This SUBROUTINE is used to call the REDWIN-style DLL. +subroutine CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat, ErrMsg) + use, intrinsic :: ISO_C_Binding, only: C_F_PROCPOINTER + ! Passed Variables: + type(DLL_Type), intent(in) :: DLL_Trgt ! The DLL to be called. + integer(IntKi), intent(in) :: DLL_Model ! The DLL model type + type(REDWINdllType), intent(inout) :: dll_data ! data type containing the dll required arrays in DLL coordinate frame + + integer(IntKi), intent(out) :: ErrStat ! Error status of the operation + character(*), intent(out) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + procedure(REDWINdll_interface_V00), pointer:: REDWIN_Subroutine_v00 ! The address of the procedure in the RedWin DLL + +#ifdef STATIC_DLL_LOAD + ! if we're statically loading the library (i.e., OpenFOAM), we can just call INTERFACEFOUNDATION(); + call INTERFACEFOUNDATION(PROPSFILE, LDISPFILE, & + dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & + dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & + dll_data%Disp, dll_data%Force, dll_data%D) +#else + ! Call the DLL (first associate the address from the procedure in the DLL with the subroutine): + if (RW_Ver == RW_v00) then + call C_F_PROCPOINTER(DLL_Trgt%ProcAddr(1), REDWIN_Subroutine_v00) + call REDWIN_Subroutine_v00(dll_data%PROPSfile, dll_data%LDISPfile, & + dll_data%IDTask, dll_data%nErrorCode, dll_data%ErrorCode, & + dll_data%Props, dll_data%StVar, dll_data%StVarPrint, & + dll_data%Disp, dll_data%Force, dll_data%D) + end if +#endif + + ! Call routine for error trapping the returned ErrorCodes + call CheckREDWINerrors(dll_data, DLL_Model, dll_data%SuppressWarn, ErrStat, ErrMsg) + return +end subroutine CallREDWINdll + +!================================================================================================================================== +!> This routine initializes variables used in the REDWIN DLL interface. +subroutine REDWINinterface_Init(DLL_FileName, DLL_ProcName, DLL_Trgt, DLL_Model, dll_data, UseREDWINinterface, ErrStat, ErrMsg) + + character(1024), intent(in) :: DLL_FileName !< DLL filename from input file + character(1024), intent(in) :: DLL_ProcName !< Procedure name from input file + type(DLL_Type), intent(inout) :: DLL_Trgt !< The DLL to be called. + integer(IntKi), intent(in) :: DLL_Model !< Model type of the DLL + type(REDWINdllType), intent(inout) :: dll_data !< DLL coordinate frame arrays in here + logical, intent(out) :: UseREDWINinterface !< Can use the interface + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_Init' + logical :: FileExist + character(1024) :: CwdPath !< Path of current working directory + character(1024) :: PropsLoc !< Full path to PropsFile location + character(1024) :: LDispLoc !< Full path to LDispFile location + + ErrStat = ErrID_None + ErrMsg = '' + + call DispNVD(REDWINinterface_Ver) ! Display the version of this interface + + ! Get current working directory for checking DLL input files. + call Get_CWD(CwdPath, ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, ' Cannot get current working directory to check DLL input files.', ErrStat, ErrMsg, RoutineName) + return + end if + CwdPath = trim(CwdPath)//PathSep + + call CheckPaths() + if (ErrStat >= AbortErrLev) return + + ! Define and load the DLL: + DLL_Trgt%FileName = DLL_FileName + DLL_Trgt%ProcName = "" ! initialize all procedures to empty so we try to load only one + DLL_Trgt%ProcName(1) = DLL_ProcName + call LoadDynamicLib(DLL_Trgt, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Initialize DLL + dll_data%IDtask = IDtask_init + call CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2) + if (Failed()) return + + ! Checks on model version + ! NOTE: there is not a good way to tell exactly which DLL model is in use. The DLL does not return + ! much info that would identify it. Ideally we would add some checks here to figure out if + ! the model number we read from the input file matches the actual DLL model. + ! For Model 1, the Props(1,1) will indicate which runmode we are using. Test that here + + ! Set status flag: + UseREDWINinterface = .true. + +contains + subroutine CheckPaths() + ! Check existance of DLL input files. The DLL does not check this, and will + ! catastrophically fail if they are not found. + if (PathIsRelative(dll_data%PROPSfile)) then + PropsLoc = trim(CwdPath)//trim(dll_data%PROPSfile(3:len_trim(dll_data%PROPSfile))) ! remove the leading ./ + else + PropsLoc = trim(dll_data%PROPSfile) + end if + if (PathIsRelative(dll_data%LDISPfile)) then + LDispLoc = trim(CwdPath)//trim(dll_data%LDISPfile(3:len_trim(dll_data%LDISPfile))) ! remove the leading ./ + else + LDispLoc = trim(dll_data%LDISPfile) + end if + inquire (file=trim(PropsLoc), exist=FileExist) + if (.not. FileExist) call SetErrStat(ErrID_Fatal, 'PropsFile '//trim(dll_data%PROPSfile)// & + ' not found (path must be relative to the working directory, or absolute)', ErrStat, ErrMsg, RoutineName) + inquire (file=trim(LDispLoc), exist=FileExist) + if (.not. FileExist) call SetErrStat(ErrID_Fatal, 'LDispFile '//trim(dll_data%LDISPFile)// & + ' not found (path must be relative to the working direcotry, or absolute)', ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) UseREDWINinterface = .false. + end subroutine CheckPaths + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + if (ErrStat >= AbortErrLev) UseREDWINinterface = .false. + end function Failed +end subroutine REDWINinterface_Init + +!================================================================================================================================== +!> This routine would call the DLL a final time, but there appears to be no end routine for the DLL, +!! so we don't need to make a last call. It also frees the dynamic library (doesn't do anything on +!! static linked). +subroutine REDWINinterface_End(DLL_Trgt, ErrStat, ErrMsg) + + type(DLL_Type), intent(inout) :: DLL_Trgt ! The DLL to be called. + integer(IntKi), intent(OUT) :: ErrStat !< Error status of the operation + character(*), intent(OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables: + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_End' + + ErrStat = ErrID_None + ErrMsg = '' + + ! Free the library (note: this doesn't do anything #ifdef STATIC_DLL_LOAD because DLL_Trgt is 0 (NULL)) + call FreeDynamicLib(DLL_Trgt, ErrStat, ErrMsg) + +end subroutine REDWINinterface_End + +!================================================================================================================================== +!> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as +!! necessary in the main ServoDyn CalcOutput routine. +subroutine REDWINinterface_CalcOutput(DLL_Trgt, DLL_Model, Displacement, Force, dll_data, ErrStat, ErrMsg) + + type(DLL_Type), intent(in) :: DLL_Trgt !< The DLL to be called. + integer(IntKi), intent(in) :: DLL_Model !< Model type of the DLL + real(R8Ki), intent(in) :: Displacement(6) !< OpenFAST global coordinate frame + real(R8Ki), intent(out) :: Force(6) !< OpenFAST global coordinate frame + type(REDWINdllType), intent(inout) :: dll_data !< DLL coordinate frame arrays in here + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables: + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_CalcOutput' + + ! Initialize error values: + ErrStat = ErrID_None + ErrMsg = '' + + ! Copy data over + dll_data%Disp = Displacement + +#ifdef DEBUG_REDWIN_INTERFACE +!CALL WrNumAryFileNR ( 58, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) +!write(58,'()') +#endif + + ! Call the REDWIN-style DLL: + dll_data%IDtask = IDtask_calc + call CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if (Failed()) return; + ! Coordinate transform from REDWIN frame + Force = dll_data%Force + + ! Call routine for error trapping the returned ErrorCodes + call CheckREDWINerrors(dll_data, DLL_Model, dll_data%SuppressWarn, ErrStat2, ErrMsg2); if (Failed()) return; +#ifdef DEBUG_REDWIN_INTERFACE +!CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) +!write(59,'()') +#endif + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine REDWINinterface_CalcOutput + +!================================================================================================================================== +!> This routine sets the AVRswap array, calls the routine from the REDWIN DLL, and sets the outputs from the call to be used as +!! necessary in the main ServoDyn CalcOutput routine. +subroutine REDWINinterface_GetStiffMatrix(DLL_Trgt, DLL_Model, Displacement, Force, StiffMatrix, dll_data, ErrStat, ErrMsg) + + type(DLL_Type), intent(in) :: DLL_Trgt !< The DLL to be called. + integer(IntKi), intent(in) :: DLL_Model !< Model type of the DLL + real(R8Ki), intent(in) :: Displacement(6) !< Displacement (OpenFAST global coords) + real(R8Ki), intent(out) :: Force(6) !< Resulting force (OpenFAST global coords) + real(R8Ki), intent(out) :: StiffMatrix(6, 6) !< Returned stiffness (OpenFAST global coords) + type(REDWINdllType), intent(inout) :: dll_data + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + ! local variables: + integer(IntKi) :: ErrStat2 ! The error status code + character(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred + character(*), parameter :: RoutineName = 'REDWINinterface_GetStiffMatrix' + + ! Initialize error values: + ErrStat = ErrID_None + ErrMsg = '' + + ! Coordinate transform to REDWIN frame + dll_data%Disp = Displacement + + ! Call the REDWIN-style DLL: + dll_data%IDtask = IDtask_stiff + call CallREDWINdll(DLL_Trgt, DLL_Model, dll_data, ErrStat2, ErrMsg2); if (Failed()) return; + ! Coordinate transformation + Force = dll_data%Force + StiffMatrix = dll_data%D + +#ifdef DEBUG_REDWIN_INTERFACE +!CALL WrNumAryFileNR ( 59, m%dll_data%avrSWAP,'1x,ES15.6E2', ErrStat, ErrMsg ) +!write(59,'()') +#endif + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine REDWINinterface_GetStiffMatrix + +!================================================================================================================================== +!> Check errors from REDWIN +!! Error values taken from "20150014-11-R_Rev0_3D_Foundation Model Library.pdf" +!! +!! NOTE: the DLL does not at present return any error codes. Instead when it hits an error +!! it simply aborts the whole program without returning. So this routine will never +!! actually catch any errors... :( +subroutine CheckREDWINerrors(dll_data, DLL_Model, SuppressWarn, ErrStat, ErrMsg) + type(REDWINdllType), intent(in) :: dll_data ! data type + integer(IntKi), intent(in) :: DLL_Model ! Model type of the DLL + logical, intent(inout) :: SuppressWarn ! from dll_data%SupressWarn + integer(IntKi), intent(out) :: ErrStat ! Error status of the operation + character(*), intent(out) :: ErrMsg ! Error message if ErrStat /= ErrID_None + integer(IntKi) :: i + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + ErrStat = ErrID_none + ErrMsg = '' + + select case (DLL_Model) + case (1) + do i = 1, dll_data%nErrorCode + call CheckErrorsModel1(dll_data%ErrorCode(i), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'REDWIN DLL error') + end do + case (2) + do i = 1, dll_data%nErrorCode + call CheckErrorsModel2(dll_data%ErrorCode(i), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'REDWIN DLL error') + end do + case (3) + do i = 1, dll_data%nErrorCode + call CheckErrorsModel3(dll_data%ErrorCode(i), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'REDWIN DLL error') + end do + case default + end select + + ! Check if this is only a warning, and if we should supress further warnings (only one warning exists in each DLL model, rest are errors + if (ErrStat == ErrID_Warn) then + if (SuppressWarn) then + ErrStat = ErrID_None + ErrMsg = '' + else + SuppressWarn = .true. + end if + end if + +contains + + !> Check error codes from DLL model 1 + subroutine CheckErrorsModel1(ErrVal, ErrStat, ErrMsg) + ! 1 Warning: The number of rows in LDISDPFILE exceed the maximum number supported (200). The calibration will proceed using the first 200 values. + ! Reduce the number of data points in the input file. + ! 2 Error in the interpolation tool used in the model calibration. The value you are trying to interpolate is outside the interpolation curve. + ! Please inspect LDISPFILE to make sure that it covers a wide enough range and that all values are positive. + ! Try to extend the input load-displacement curves in LDISPFILE. + integer(IntKi), intent(in) :: ErrVal + integer(IntKi), intent(out) :: ErrStat + character(ErrMsgLen), intent(out) :: ErrMSg + integer(IntKi), parameter :: MaxErr = 2 + + if ((ErrVal > MaxErr) .or. (ErrVal < 0)) then + ErrStat = ErrID_Fatal + ErrMSg = 'Unknown error from REDWIN DLL: '//trim(num2lstr(ErrVal))//'. Only '//trim(num2lstr(MaxErr))//' values are known.' & + //NewLine//' --> Check that the correct REDWIN DLL model is specified and used.' + return + end if + + select case (ErrVal) + case (0) + ErrStat = ErrID_None + ErrMsg = '' + case (1) + ErrStat = ErrID_Warn + ErrMsg = 'The number of rows in LDISDPFILE exceed the maximum number supported (200). The calibration will proceed using the first 200 values.' & + //NewLine//' --> Reduce the number of data points in the input file.' + case (2) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the interpolation tool used in the model calibration. The value you are trying to interpolate is outside the interpolation curve.' & + //NewLine//' --> Please inspect LDISPFILE to make sure that it covers a wide enough range and that all values are positive. ' & + //'Try to extend the input load-displacement curves in LDISPFILE.' + end select + end subroutine CheckErrorsModel1 + + !> Check error codes from DLL model 2 + subroutine CheckErrorsModel2(ErrVal, ErrStat, ErrMsg) + ! 1 Warning: The plastic force- displacement calibration curve has several zero-rows. The solution does not stop, but the results may be inaccurate or erroneous. + ! Check that the provided coefficients of the elastic stiffness matrix are consistent with the load-displacement input curves. + ! 2 Error. The iteration to find the plastic rotation increment and the plastic displacement increment did not converge. + ! The force you are trying to apply might be outside the calibrated range. Please extend the input load-displacement curves in LDISPFILE. + ! Alternatively, increase the number of iterations in PROPSFILE. + ! 3 Error in the interpolation tool used in the model calibration. The value you are trying to interpolate is outside the interpolation curve. + ! Please inspect LDISPFILE to make sure that it covers a wide enough range and that all values are positive. Try to extend the input load-displacement curves in LDISPFILE. + ! 4 Error in the calibration tool. The contours of plastic horizontal displacement and the contours of plastic rotation are parallel. + ! The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent. + ! 5 Error in the calibration tool. The calculation of the orientation of the yield surfaces might be wrong. + ! The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent. + ! 6 Error in the calibration tool. The contours of plastic horizontal displacement are steeper than the contours of plastic rotation. + ! The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent. + integer(IntKi), intent(in) :: ErrVal + integer(IntKi), intent(out) :: ErrStat + character(ErrMsgLen), intent(out) :: ErrMSg + integer(IntKi), parameter :: MaxErr = 6 + + if ((ErrVal > MaxErr) .or. (ErrVal < 0)) then + ErrStat = ErrID_Fatal + ErrMSg = 'Unknown error from REDWIN DLL: '//trim(num2lstr(ErrVal))//'. Only '//trim(num2lstr(MaxErr))//' values are known.' + return + end if + + select case (ErrVal) + case (0) + ErrStat = ErrID_None + ErrMsg = '' + case (1) + ErrStat = ErrID_Warn + ErrMsg = 'The plastic force- displacement calibration curve has several zero-rows. The solution does not stop, but the results may be inaccurate or erroneous.' & + //NewLine//' --> Check that the provided coefficients of the elastic stiffness matrix are consistent with the load-displacement input curves.' + case (2) + ErrStat = ErrID_Fatal + ErrMsg = 'The iteration to find the plastic rotation increment and the plastic displacement increment did not converge.' & + //NewLine//' --> The force you are trying to apply might be outside the calibrated range. Please extend the input load-displacement curves ' & + //'in LDISPFILE. Alternatively, increase the number of iterations in PROPSFILE.' + case (3) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the interpolation tool used in the model calibration. The value you are trying to interpolate is outside the interpolation curve.' & + //NewLine//' --> Please inspect LDISPFILE to make sure that it covers a wide enough range and that all values are positive. ' & + //'Try to extend the input load-displacement curves in LDISPFILE.' + case (4) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the calibration tool. The contours of plastic horizontal displacement and the contours of plastic rotation are parallel. ' & + //NewLine//' --> The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent.' + case (5) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the calibration tool. The calculation of the orientation of the yield surfaces might be wrong.' & + //NewLine//' --> The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent.' + case (6) + ErrStat = ErrID_Fatal + ErrMsg = 'Error in the calibration tool. The contours of plastic horizontal displacement are steeper than the contours of plastic rotation.' & + //NewLine//' --> The input might be non-physical. Please check that LDISPFILE is in the correct format and that the units are consistent.' + end select + end subroutine CheckErrorsModel2 + + !> Check error codes from DLL model 3 + subroutine CheckErrorsModel3(ErrVal, ErrStat, ErrMsg) + ! 1 Warning. The solution in the current sub-step seems to be diverging. Will attempt to reduce the step size. + ! The step size may be too large for convergence to be reached. The model will attempt to try again with a smaller step size. + ! 2 Error. The sub-stepping algorithm in the multi-surface plasticity model did not converge. + ! The cause of divergence is usually that the applied loads exceed the calibration range, or that there are several identical spring stiffness for low load levels. + ! Possible solutions are: reduce the number of yield surfaces (Ns), increase the number of substeps (nsub), increase the range of the input load-displacement files. + ! 3 Error in the calibration tool. The input file cannot be found. + ! Check that the file name and path of the input files PROPSFILE and LDISPFILE are correctly specified. + ! 4 Error in the calibration tool during read of PROPSFILE or LDISPFILE. + ! Check that the format of the input files are correct. + integer(IntKi), intent(in) :: ErrVal + integer(IntKi), intent(out) :: ErrStat + character(ErrMsgLen), intent(out) :: ErrMSg + integer(IntKi), parameter :: MaxErr = 4 + + if ((ErrVal > MaxErr) .or. (ErrVal < 0)) then + ErrStat = ErrID_Fatal + ErrMSg = 'Unknown error from REDWIN DLL: '//trim(num2lstr(ErrVal))//'. Only '//trim(num2lstr(MaxErr))//' values are known.' + return + end if + + select case (ErrVal) + case (0) + ErrStat = ErrID_None + ErrMsg = '' + case (1) + ErrStat = ErrID_Warn + ErrMsg = 'The solution in the current sub-step seems to be diverging. Will attempt to reduce the step size.' & + //NewLine//' --> The step size may be too large for convergence to be reached.' & + //' The model will attempt to try again with a smaller step size.' + case (2) + ErrMsg = 'The sub-stepping algorithm in the multi-surface plasticity model did not converge.' & + //NewLine//' --> The cause of divergence is usually that the applied loads exceed the calibration range, or that there' & + //' are several identical spring stiffness for low load levels. Possible solutions are: reduce the number of yield surfaces' & + //'(Ns), increase the number of substeps (nsub), increase the range of the input load-displacement files.' + case (3) + ErrMsg = 'Error in the calibration tool. The input file cannot be found.' & + //NewLine//' --> Check that the file name and path of the input files PROPSFILE and LDISPFILE are correctly specified.' + case (4) + ErrMsg = 'Error in the calibration tool during read of PROPSFILE or LDISPFILE.' & + //NewLine//' --> Check that the format of the input files are correct.' + end select + end subroutine CheckErrorsModel3 +end subroutine CheckREDWINerrors + +end module REDWINinterface diff --git a/modules/soildyn/src/SoilDyn.f90 b/modules/soildyn/src/SoilDyn.f90 new file mode 100644 index 0000000000..10de0275cc --- /dev/null +++ b/modules/soildyn/src/SoilDyn.f90 @@ -0,0 +1,665 @@ +!********************************************************************************************************************************** +!> ## SoilDyn +!! The SoilDyn and SoilDyn_Types modules make up a template for creating user-defined calculations in the FAST Modularization +!! Framework. SoilDyn_Types will be auto-generated by the FAST registry program, based on the variables specified in the +!! SoilDyn_Registry.txt file. +! .................................................................................................................................. +!! ## LICENSING +!! Copyright (C) 2012-2013, 2015-2016 National Renewable Energy Laboratory +!! +!! This file is part of SoilDyn. +!! +!! Licensed under the Apache License, Version 2.0 (the "License"); +!! you may not use this file except in compliance with the License. +!! You may obtain a copy of the License at +!! +!! http://www.apache.org/licenses/LICENSE-2.0 +!! +!! Unless required by applicable law or agreed to in writing, software +!! distributed under the License is distributed on an "AS IS" BASIS, +!! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +!! See the License for the specific language governing permissions and +!! limitations under the License. +!********************************************************************************************************************************** +module SoilDyn + +use SoilDyn_Types +use SoilDyn_IO +use NWTC_Library +use REDWINinterface + +implicit none + +private + +type(ProgDesc), parameter :: SlD_Ver = ProgDesc('SoilDyn', 'v0.01.00', '24-Aug-2022') !< module date/version information + +! ..... Public Subroutines ................................................................................................... +public :: SlD_Init ! Initialization routine +public :: SlD_End ! Ending routine (includes clean up) +public :: SlD_UpdateStates ! Loose coupling routine for solving for constraint states, integrating +public :: SlD_CalcOutput ! Routine for computing outputs + +!NOTE: these are placeholders for now. +!!! PUBLIC :: SlD_CalcConstrStateResidual ! Tight coupling routine for returning the constraint state residual +!!! PUBLIC :: SlD_CalcContStateDeriv ! Tight coupling routine for computing derivatives of continuous states +!!! PUBLIC :: SlD_UpdateDiscState ! Tight coupling routine for updating discrete states +!!! PUBLIC :: SlD_JacobianPInput ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the inputs (u) +!!! PUBLIC :: SlD_JacobianPContState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the continuous states (x) +!!! PUBLIC :: SlD_JacobianPDiscState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the discrete states (xd) +!!! PUBLIC :: SlD_JacobianPConstrState ! Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions all with respect to the constraint states (z) +!!! PUBLIC :: SlD_GetOP ! Routine to get the operating-point values for linearization (from data structures to arrays) + +contains + +!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +!> This routine is called at the start of the simulation to perform initialization steps. +!! The parameters are set here and not changed during the simulation. +!! The initial states and initial guess for the input are defined. +subroutine SlD_Init(InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut, ErrStat, ErrMsg) + + type(SlD_InitInputType), intent(in) :: InitInp !< Input data for initialization routine + type(SlD_InputType), intent(out) :: u !< An initial guess for the input; input mesh must be defined + type(SlD_ParameterType), intent(out) :: p !< Parameters + type(SlD_ContinuousStateType), intent(out) :: x !< Initial continuous states + type(SlD_DiscreteStateType), intent(out) :: xd !< Initial discrete states + type(SlD_ConstraintStateType), intent(out) :: z !< Initial guess of the constraint states + type(SlD_OtherStateType), intent(out) :: OtherState !< Initial other states (logical, etc) + type(SlD_OutputType), intent(out) :: y !< Initial system outputs + type(SlD_MiscVarType), intent(out) :: m !< Misc variables for optimization (not copied in glue code) + real(DbKi), intent(inout) :: Interval !< Coupling interval in seconds + type(SlD_InitOutputType), intent(out) :: InitOut !< Output for initialization routine + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SlD_Init' + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message + type(SlD_InputFile) :: InputFileData !< Data stored in the module's input file + integer(IntKi) :: j + + ! Initialize variables + ErrStat = ErrID_None + ErrMsg = "" + + ! Initialize the NWTC Subroutine Library + call NWTC_Init() + + ! Display the module information + call DispNVD(SlD_Ver) + + ! Set some names + call GetRoot(InitInp%InputFile, p%RootFileName) + p%EchoFileName = TRIM(p%RootFileName)//".ech" + p%SumFileName = TRIM(p%RootFileName)//"SlD.sum" + + call SlD_ReadInput(InitInp%InputFile, p%EchoFileName, InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; + call SlD_ValidateInput(InitInp, InputFileData, ErrStat2, ErrMsg2); if (Failed()) return; + + ! Define parameters here: + p%DT = Interval + p%DLL_Model = InputFileData%DLL_Model + p%DLL_OnlyStiff = InputFileData%DLL_OnlyStiff + p%CalcOption = InputFileData%CalcOption + + p%UseREDWINinterface = .false. ! Initially set to false in case DLL not used. + + ! Define initial system states here: + x%DummyContState = 0.0_ReKi + z%DummyConstrState = 0.0_ReKi + OtherState%DummyOtherState = 0.0_ReKi + + ! are the returned reaction forces only the non-linear portion (used when SubDyn is calculating the linear portion) + p%SlDNonLinearForcePortionOnly = InitInp%SlDNonLinearForcePortionOnly + if (p%SlDNonLinearForcePortionOnly) call WrScr(' SoilDyn returning only non-linear portion of reaction forces') + + ! If the module does not implement the four Jacobian routines at the end of this template, or the module cannot + ! linearize with the features that are enabled, stop the simulation if InitInp%Linearize is true. + if (InitInp%Linearize) then + call SetErrStat(ErrID_Fatal, 'SoilDyn cannot perform linearization analysis.', ErrStat, ErrMsg, RoutineName) + return + end if + + call SlD_InitMeshes(InputFileData, u, y, p, m, ErrStat2, ErrMsg2); if (Failed()) return; + + ! Set miscvars: including dll_data arrays and checking for input files. + call SlD_InitStatesMisc(InputFileData, m, xd, ErrStat2, ErrMsg2); if (Failed()) return; + + ! Setup and initialize the Calc Options + select case (p%CalcOption) + case (Calc_StiffDamp) + call move_alloc(InputFileData%Stiffness, p%Stiffness) + !call move_alloc(InputFileData%Damping,p%Damping) + case (Calc_PYcurve) + case (Calc_REDWIN) + call SlD_REDWINsetup(InputFileData, p, m, xd, ErrStat, ErrMsg) + end select + + ! set parameters for I/O data + InitOut%Ver = SlD_Ver + p%NumOuts = InputFileData%NumOuts + call AllocAry(InitOut%WriteOutputHdr, p%NumOuts, 'WriteOutputHdr', errStat2, errMsg2); if (Failed()) return; + call AllocAry(InitOut%WriteOutputUnt, p%NumOuts, 'WriteOutputUnt', errStat2, errMsg2); if (Failed()) return; + call AllocAry(y%WriteOutput, p%NumOuts, 'WriteOutput', ErrStat2, ErrMsg2); if (Failed()) return; + y%WriteOutput = 0 + + call SetOutParam(InputFileData%OutList, p, ErrStat2, ErrMsg2); if (Failed()) return; + do j = 1, p%NumOuts + InitOut%WriteOutputHdr(j) = p%OutParam(j)%Name + InitOut%WriteOutputUnt(j) = p%OutParam(j)%Units + end do + + call SlD_InitVars(u, p, x, y, m, InitOut%Vars, InitInp%Linearize, ErrStat2, ErrMsg2) + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed + + subroutine SlD_REDWINsetup(InputFileData, p, m, xd, ErrStat, ErrMsg) + type(SlD_InputFile), intent(in) :: InputFileData !< Data stored in the module's input file + type(SlD_ParameterType), intent(inout) :: p !< Parameters + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SlD_DiscreteStateType), intent(inout) :: xd !< Initial discrete states + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message + real(R8Ki) :: NullDispl(6) !< ignored + real(R8Ki) :: NullForce(6) !< ignored + integer(IntKi) :: i ! Generic counter + + ErrStat = ErrID_None + ErrMsg = "" + + ! set placeholder for DLL stifness matrices + call AllocAry(p%Stiffness, 6, 6, size(m%dll_data), 'DLL stiffness matrices', ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! Initialize the dll + do i = 1, size(m%dll_data) + call REDWINinterface_Init(InputFileData%DLL_FileName, InputFileData%DLL_ProcName, p%DLL_Trgt, p%DLL_Model, & + m%dll_data(i), p%UseREDWINinterface, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName); if (ErrStat >= AbortErrLev) return + NullDispl = 0.0_R8Ki + NullForce = 0.0_ReKi + call REDWINinterface_GetStiffMatrix(p%DLL_Trgt, p%DLL_Model, NullDispl, NullForce, p%StiffNess(1:6, 1:6, i), m%dll_data(i), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + ! now initialize the states info from the miscvar + xd%dll_states(i)%Props = m%dll_data(i)%Props + xd%dll_states(i)%StVar = m%dll_data(i)%StVar + end do + end subroutine SlD_REDWINsetup + + !> Allocate arrays for storing the DLL input file names, and check that they exist. The DLL has no error checking (as of 2020.02.10) + !! and will create empty input files before segfaulting. + subroutine SlD_InitStatesMisc(InputFileData, m, xd, ErrStat, ErrMsg) + type(SlD_InputFile), intent(in) :: InputFileData !< Data stored in the module's input file + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SlD_DiscreteStateType), intent(out) :: xd !< Initial discrete states + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + integer(IntKi) :: ErrStat2 !< local error status + character(ErrMsgLen) :: ErrMsg2 !< local error message + integer(IntKi) :: i ! Generic counter + + ErrStat = ErrID_None + ErrMsg = '' + + call AllocAry(m%ForceTotal, 6, p%NumPoints, 'ForceTotal array for output', ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + select case (p%CalcOption) + case (Calc_StiffDamp) + allocate (xd%dll_states(1), STAT=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate xd%dll_states', ErrStat, ErrMsg, RoutineName) + return + end if + + case (Calc_PYcurve) + allocate (xd%dll_states(1), STAT=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate xd%dll_states', ErrStat, ErrMsg, RoutineName) + return + end if + + case (Calc_REDWIN) + !------------------- + ! Set DLL data + allocate (m%dll_data(InputFileData%DLL_NumPoints), STAT=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate m%dll_data', ErrStat, ErrMsg, RoutineName) + return + end if + + allocate (xd%dll_states(InputFileData%DLL_NumPoints), STAT=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Could not allocate xd%dll_states', ErrStat, ErrMsg, RoutineName) + return + end if + + ! Set the input file names and check they are not too long. Existance checks done in the interface routine. + do i = 1, InputFileData%DLL_NumPoints + m%dll_data(i)%PROPSfile = trim(InputFileData%DLL_PropsFile(i)) + if (len(m%dll_data(i)%PROPSfile) < len_trim(InputFileData%DLL_PropsFile(i))) then + call SetErrStat(ErrID_Fatal, 'PropsFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%PROPSfile)))// & + ' characters (DLL limitation)', ErrStat, ErrMsg, '') + end if + m%dll_data(i)%LDISPfile = trim(InputFileData%DLL_LDispFile(i)) + if (len(m%dll_data(i)%LDISPfile) < len_trim(InputFileData%DLL_LDispFile(i))) then + call SetErrStat(ErrID_Fatal, 'LDispFile #'//trim(Num2LStr(i))//' name is longer than '//trim(Num2LStr(len(m%dll_data(i)%LDISPfile)))// & + ' characters (DLL limitation)', ErrStat, ErrMsg, '') + end if + end do + + end select + if (ErrStat >= AbortErrLev) return + end subroutine SlD_InitStatesMisc + + subroutine SlD_InitMeshes(InputFileData, u, y, p, m, ErrStat, ErrMsg) + type(SlD_InputFile), intent(in) :: InputFileData !< Data stored in the module's input file + type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(SlD_OutputType), intent(inout) :: y !< Initial system outputs + type(SlD_ParameterType), intent(inout) :: p !< Parameters + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + integer(IntKi), intent(out) :: ErrStat + character(*), intent(out) :: ErrMsg + + character(ErrMsgLen) :: ErrMsg2 !< local error message + integer(IntKi) :: ErrStat2 !< local error status + real(R8Ki) :: DCM(3, 3) + real(ReKi), allocatable :: MeshLocations(:, :) + integer(IntKi) :: i + + select case (p%CalcOption) + + case (Calc_StiffDamp) + p%NumPoints = 1_IntKi + !FIXME: update to allow more than one set of points + ! NumPoints = InputFileData%StiffDamp_NumPoints + p%NumPoints = 1 + call AllocAry(MeshLocations, 3, p%NumPoints, 'Mesh locations', ErrStat, ErrMsg); + do i = 1, size(MeshLocations, 2) + MeshLocations(1:3, i) = InputFileData%SD_locations(1:3, i) + end do + + case (Calc_PYcurve) + p%NumPoints = InputFileData%PY_NumPoints + call AllocAry(MeshLocations, 3, p%NumPoints, 'Mesh locations', ErrStat, ErrMsg); + do i = 1, size(MeshLocations, 2) + MeshLocations(1:3, i) = InputFileData%PY_locations(1:3, i) + end do + + case (Calc_REDWIN) + p%NumPoints = InputFileData%DLL_NumPoints + call AllocAry(MeshLocations, 3, p%NumPoints, 'Mesh locations', ErrStat, ErrMsg); + do i = 1, size(MeshLocations, 2) + MeshLocations(1:3, i) = InputFileData%DLL_locations(1:3, i) + end do + + case default + ErrStat = ErrID_Fatal + ErrMsg = ' Unknown calculation type '//trim(Num2LStr(p%CalcOption)) + return + end select + + !................................. + ! u%SoilMesh (for coupling with external codes) + !................................. + + call MeshCreate(BlankMesh=u%SoilMesh & + , IOS=COMPONENT_INPUT & + , NNodes=p%NumPoints & + , TranslationDisp=.true. & + , TranslationVel=.false. & + , TranslationAcc=.false. & + , Orientation=.true. & + , RotationVel=.false. & + , RotationAcc=.false. & + , ErrStat=ErrStat2 & + , ErrMess=ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + ! Assuming zero orientation displacement for start + call Eye2D(DCM, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + do i = 1, p%NumPoints + call MeshPositionNode(Mesh=u%SoilMesh & + , INode=i & + , Pos=MeshLocations(1:3, i) & + , ErrStat=ErrStat2 & + , ErrMess=ErrMsg2 & + , Orient=DCM) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + call MeshConstructElement(Mesh=u%SoilMesh & + , Xelement=ELEMENT_POINT & + , P1=i & + , ErrStat=ErrStat2 & + , ErrMess=ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + + call MeshCommit(Mesh=u%SoilMesh, ErrStat=ErrStat2, ErrMess=ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + !................................. + ! y%SoilMesh (for coupling with external codes) + !................................. + + call MeshCopy(SrcMesh=u%SoilMesh & + , DestMesh=y%SoilMesh & + , CtrlCode=MESH_SIBLING & + , IOS=COMPONENT_OUTPUT & + , Force=.true. & + , Moment=.true. & + , ErrStat=ErrStat2 & + , ErrMess=ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + + end subroutine SlD_InitMeshes +end subroutine SlD_Init + + +subroutine SlD_InitVars(u, p, x, y, m, Vars, Linearize, ErrStat, ErrMsg) + type(SlD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(SlD_ParameterType), intent(inout) :: p !< Parameters + type(SlD_ContinuousStateType), intent(inout) :: x !< Continuous state + type(SlD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(ModVarsType), intent(inout) :: Vars !< Module variables + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SlD_InitVars' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i + + ErrStat = ErrID_None + ErrMsg = "" + + ! Clear module variables type + call NWTC_Library_DestroyModVarsType(Vars, ErrStat2, ErrMsg2); if (Failed()) return + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + + ! SoilDyn has no continuous state variables + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + ! Soil contact point motions + call MV_AddMeshVar(Vars%u, "SoilMesh", MotionFields, & + DL=DatLoc(SlD_u_SoilMesh), & + Mesh=u%SoilMesh) + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + ! Reaction forces + call MV_AddMeshVar(Vars%y, 'SoilMesh', LoadFields, & + DL=DatLoc(SlD_y_SoilMesh), & + Mesh=y%SoilMesh) + + ! Write output variables + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, & + DL=DatLoc(SlD_y_WriteOutput), & + Num=p%NumOuts, & + Flags=VF_WriteOut, & + LinNames=[(WriteOutputLinName(i),i=1,p%NumOuts)]) + + !---------------------------------------------------------------------------- + ! Initialization dependent on linearization + !---------------------------------------------------------------------------- + + call MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + if (Linearize) then + call SlD_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SlD_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SlD_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SlD_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + end if + +contains + + function WriteOutputLinName(idx) result(LinName) + integer(IntKi), intent(in) :: idx + character(LinChanLen) :: LinName + LinName = trim(p%OutParam(idx)%Name)//', '//p%OutParam(idx)%Units + end function + + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + +!---------------------------------------------------------------------------------------------------------------------------------- +!> This routine is called at the end of the simulation. +subroutine SlD_End(u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg) + + type(SlD_InputType), intent(inout) :: u !< System inputs + type(SlD_ParameterType), intent(inout) :: p !< Parameters + type(SlD_ContinuousStateType), intent(inout) :: x !< Continuous states + type(SlD_DiscreteStateType), intent(inout) :: xd !< Discrete states + type(SlD_ConstraintStateType), intent(inout) :: z !< Constraint states + type(SlD_OtherStateType), intent(inout) :: OtherState !< Other states + type(SlD_OutputType), intent(inout) :: y !< System outputs + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'SlD_End' + integer(IntKi) :: ErrStat2 ! local error status + character(ErrMsgLen) :: ErrMsg2 ! local error message + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + + !! Place any last minute operations or calculations here: + if (p%UseREDWINinterface) then + call REDWINinterface_End(p%DLL_Trgt, ErrStat, ErrMsg) + end if + + !! Destroy the input data: + call SlD_DestroyInput(u, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + !! Destroy the parameter data: We won't keep warnings from p since it will complain about FreeDynamicLib when not compiled with it + call SlD_DestroyParam(p, ErrStat2, ErrMsg2) !; call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) + + !! Destroy the state data: + call SlD_DestroyContState(x, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyDiscState(xd, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyConstrState(z, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyOtherState(OtherState, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + !! Destroy the output data: + call SlD_DestroyOutput(y, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + + !! Destroy the misc data: + call SlD_DestroyMisc(m, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + +end subroutine SlD_End + +!==================================================================================================== +! The following routines were added to satisfy the framework, but do nothing useful. +!==================================================================================================== +!> This is a loose coupling routine for solving constraint states, integrating continuous states, and updating discrete and other +!! states. Continuous, constraint, discrete, and other states are updated to values at t + Interval. +subroutine SlD_UpdateStates(t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg) + real(DbKi), intent(in) :: t !< Current simulation time in seconds + integer(IntKi), intent(in) :: n !< Current step of the simulation: t = n*Interval + type(SlD_InputType), intent(inout) :: Inputs(:) !< Inputs at InputTimes (output from this routine only + !! because of record keeping in routines that copy meshes) + real(DbKi), intent(in) :: InputTimes(:) !< Times in seconds associated with Inputs + type(SlD_ParameterType), intent(in) :: p !< Parameters + type(SlD_ContinuousStateType), intent(inout) :: x !< Input: Continuous states at t; + !! Output: Continuous states at t + Interval + type(SlD_DiscreteStateType), intent(inout) :: xd !< Input: Discrete states at t; + !! Output: Discrete states at t + Interval + type(SlD_ConstraintStateType), intent(inout) :: z !< Input: Constraint states at t; + !! Output: Constraint states at t + Interval + type(SlD_OtherStateType), intent(inout) :: OtherState !< Other states: Other states at t; + !! Output: Other states at t + Interval + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + integer(IntKi) :: i !< Generic counter + + ! Initialize variables + ErrStat = ErrID_None ! no error has occurred + ErrMsg = "" + + x%DummyContState = 0.0_ReKi + z%DummyConstrState = 0.0_ReKi + + ! The DLL states are copied over from misc var (ideally the DLL would have an update states + ! routine, but it doesn't so we have to work around that to satisfy the framework requirements) + if (p%CalcOption == Calc_REDWIN) then + do i = 1, size(xd%dll_states) + xd%dll_states(i)%Props = m%dll_data(i)%Props + xd%dll_states(i)%StVar = m%dll_data(i)%StVar + end do + else + do i = 1, size(xd%dll_states) + xd%dll_states(i)%Props = 0.0_R8Ki + xd%dll_states(i)%StVar = 0.0_R8Ki + end do + end if + +end subroutine SlD_UpdateStates + +!---------------------------------------------------------------------------------------------------------------------------------- +!> This is a routine for computing outputs, used in both loose and tight coupling. +subroutine SlD_CalcOutput(t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg) + + real(DbKi), intent(in) :: t !< Current simulation time in seconds + type(SlD_InputType), intent(in) :: u !< Inputs at t + type(SlD_ParameterType), intent(in) :: p !< Parameters + type(SlD_ContinuousStateType), intent(in) :: x !< Continuous states at t + type(SlD_DiscreteStateType), intent(in) :: xd !< Discrete states at t + type(SlD_ConstraintStateType), intent(in) :: z !< Constraint states at t + type(SlD_OtherStateType), intent(in) :: OtherState !< Other states at t + type(SlD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SlD_OutputType), intent(inout) :: y !< Outputs computed at t (Input only so that mesh con- + !! nectivity information does not have to be recalculated) + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + integer(IntKi) :: ErrStat2 ! local error status + character(ErrMsgLen) :: ErrMsg2 ! local error message + character(*), parameter :: RoutineName = 'SlD_CalcOutput' + + real(ReKi) :: AllOuts(0:MaxOutPts) + real(R8Ki) :: Displacement(6) + real(R8Ki) :: ForceLinear(6) + integer(IntKi) :: i !< generic counter + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + + select case (p%CalcOption) + case (Calc_StiffDamp) + + !TODO: add ability to do more than one point + do i = 1, 1 + ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) + Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3, i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3, 1:3, i), ErrStat2, ErrMsg2); if (Failed()) return; + ! Calculate reaction with F = k*dX + m%ForceTotal(1:6, i) = matmul(p%Stiffness(1:6, 1:6, i), Displacement) + if (p%SlDNonLinearForcePortionOnly) then + ForceLinear = matmul(p%Stiffness(1:6, 1:6, i), Displacement) + end if + + ! TODO: add damping term effects here + + ! Return reaction force onto the resulting point mesh + y%SoilMesh%Force(1:3, i) = -real(m%ForceTotal(1:3, i), ReKi) + y%SoilMesh%Moment(1:3, i) = -real(m%ForceTotal(4:6, i), ReKi) + + ! Subtract out the linear piece here + if (p%SlDNonLinearForcePortionOnly) then + y%SoilMesh%Force(1:3, i) = y%SoilMesh%Force(1:3, i) + real(ForceLinear(1:3), ReKi) + y%SoilMesh%Moment(1:3, i) = y%SoilMesh%Moment(1:3, i) + real(ForceLinear(4:6), ReKi) + end if + end do + + case (Calc_PYcurve) + call SetErrStat(ErrID_Fatal, ' SoilDyn does not support P-Y curve calculations yet.', ErrStat, ErrMsg, RoutineName) + + case (Calc_REDWIN) + ! call the dll + do i = 1, size(m%dll_data) + + ! copy the state info over to miscvar for passing to dll (we are separating states out to better match the framework) + m%dll_data(i)%Props = xd%dll_states(i)%Props + m%dll_data(i)%StVar = xd%dll_states(i)%StVar + + ! Copy displacement from point mesh (angles in radians -- REDWIN dll also uses rad) + Displacement(1:3) = u%SoilMesh%TranslationDisp(1:3, i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = GetSmllRotAngs(u%SoilMesh%Orientation(1:3, 1:3, i), ErrStat2, ErrMsg2); if (Failed()) return; ! Small angle assumption should be valid here -- Note we are assuming reforientation is identity + + ! Linear portion of the stiffness reaction (NOTE: the DLL stiffness info is stored in parameters + if (p%SlDNonLinearForcePortionOnly) then + ForceLinear = matmul(p%Stiffness(1:6, 1:6, i), Displacement) + end if + + call REDWINinterface_CalcOutput(p%DLL_Trgt, p%DLL_Model, Displacement, m%ForceTotal(1:6, i), m%dll_data(i), ErrStat2, ErrMsg2); if (Failed()) return; + ! Return reaction force onto the resulting point mesh + y%SoilMesh%Force(1:3, i) = -real(m%ForceTotal(1:3, i), ReKi) + y%SoilMesh%Moment(1:3, i) = -real(m%ForceTotal(4:6, i), ReKi) + + ! Subtract out the linear piece here + if (p%SlDNonLinearForcePortionOnly) then + y%SoilMesh%Force(1:3, i) = y%SoilMesh%Force(1:3, i) + real(ForceLinear(1:3), ReKi) + y%SoilMesh%Moment(1:3, i) = y%SoilMesh%Moment(1:3, i) + real(ForceLinear(4:6), ReKi) + end if + end do + end select + + ! Outputs + call SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat2, ErrMsg2); if (Failed()) return; + do i = 1, p%NumOuts + y%WriteOutput(i) = p%OutParam(i)%SignM*Allouts(p%OutParam(i)%Indx) + end do + +contains + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine SlD_CalcOutput + +end module SoilDyn + +!********************************************************************************************************************************** +!NOTE: the following have been omitted. When we add the other methods for calculating (6x6 Stiffness/Damping) and the P-Y curve, then +! some of these will need to be added. Leaving this as a placeholder for the moment. +!SUBROUTINE SlD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat, ErrMsg ) +!SUBROUTINE SlD_UpdateDiscState( t, n, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) +!SUBROUTINE SlD_CalcConstrStateResidual( t, u, p, x, xd, z, OtherState, m, Z_residual, ErrStat, ErrMsg ) +!SUBROUTINE SlD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +!SUBROUTINE SlD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx ) +!SUBROUTINE SlD_JacobianPDiscState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdxd, dXdxd, dXddxd, dZdxd ) +!SUBROUTINE SlD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdz, dXdz, dXddz, dZdz ) +!SUBROUTINE SlD_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op ) diff --git a/modules/soildyn/src/SoilDyn_IO.f90 b/modules/soildyn/src/SoilDyn_IO.f90 new file mode 100644 index 0000000000..eb0a60b30b --- /dev/null +++ b/modules/soildyn/src/SoilDyn_IO.f90 @@ -0,0 +1,849 @@ +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2020 National Renewable Energy Laboratory +! +! This file is part of SoilDyn. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** +MODULE SoilDyn_IO + + USE SoilDyn_Types + USE NWTC_Library + + IMPLICIT NONE + +! =================================================================================================== +! 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 12-Mar-2020 13:30:14. + + ! Indices for computing output channels: + ! NOTES: + ! (1) These parameters are in the order stored in "OutListParameters.xlsx" + ! (2) Array AllOuts() must be dimensioned to the value of the largest output parameter + + ! Time: + + INTEGER(IntKi), PARAMETER :: Time = 0 + + + ! Forces: + + INTEGER(IntKi), PARAMETER :: Sld1Fxg = 1 + INTEGER(IntKi), PARAMETER :: Sld1Fyg = 2 + INTEGER(IntKi), PARAMETER :: Sld1Fzg = 3 + INTEGER(IntKi), PARAMETER :: Sld1Mxg = 4 + INTEGER(IntKi), PARAMETER :: Sld1Myg = 5 + INTEGER(IntKi), PARAMETER :: Sld1Mzg = 6 + INTEGER(IntKi), PARAMETER :: Sld2Fxg = 7 + INTEGER(IntKi), PARAMETER :: Sld2Fyg = 8 + INTEGER(IntKi), PARAMETER :: Sld2Fzg = 9 + INTEGER(IntKi), PARAMETER :: Sld2Mxg = 10 + INTEGER(IntKi), PARAMETER :: Sld2Myg = 11 + INTEGER(IntKi), PARAMETER :: Sld2Mzg = 12 + INTEGER(IntKi), PARAMETER :: Sld3Fxg = 13 + INTEGER(IntKi), PARAMETER :: Sld3Fyg = 14 + INTEGER(IntKi), PARAMETER :: Sld3Fzg = 15 + INTEGER(IntKi), PARAMETER :: Sld3Mxg = 16 + INTEGER(IntKi), PARAMETER :: Sld3Myg = 17 + INTEGER(IntKi), PARAMETER :: Sld3Mzg = 18 + INTEGER(IntKi), PARAMETER :: Sld4Fxg = 19 + INTEGER(IntKi), PARAMETER :: Sld4Fyg = 20 + INTEGER(IntKi), PARAMETER :: Sld4Fzg = 21 + INTEGER(IntKi), PARAMETER :: Sld4Mxg = 22 + INTEGER(IntKi), PARAMETER :: Sld4Myg = 23 + INTEGER(IntKi), PARAMETER :: Sld4Mzg = 24 + INTEGER(IntKi), PARAMETER :: Sld5Fxg = 25 + INTEGER(IntKi), PARAMETER :: Sld5Fyg = 26 + INTEGER(IntKi), PARAMETER :: Sld5Fzg = 27 + INTEGER(IntKi), PARAMETER :: Sld5Mxg = 28 + INTEGER(IntKi), PARAMETER :: Sld5Myg = 29 + INTEGER(IntKi), PARAMETER :: Sld5Mzg = 30 + INTEGER(IntKi), PARAMETER :: Sld6Fxg = 31 + INTEGER(IntKi), PARAMETER :: Sld6Fyg = 32 + INTEGER(IntKi), PARAMETER :: Sld6Fzg = 33 + INTEGER(IntKi), PARAMETER :: Sld6Mxg = 34 + INTEGER(IntKi), PARAMETER :: Sld6Myg = 35 + INTEGER(IntKi), PARAMETER :: Sld6Mzg = 36 + INTEGER(IntKi), PARAMETER :: Sld7Fxg = 37 + INTEGER(IntKi), PARAMETER :: Sld7Fyg = 38 + INTEGER(IntKi), PARAMETER :: Sld7Fzg = 39 + INTEGER(IntKi), PARAMETER :: Sld7Mxg = 40 + INTEGER(IntKi), PARAMETER :: Sld7Myg = 41 + INTEGER(IntKi), PARAMETER :: Sld7Mzg = 42 + INTEGER(IntKi), PARAMETER :: Sld8Fxg = 43 + INTEGER(IntKi), PARAMETER :: Sld8Fyg = 44 + INTEGER(IntKi), PARAMETER :: Sld8Fzg = 45 + INTEGER(IntKi), PARAMETER :: Sld8Mxg = 46 + INTEGER(IntKi), PARAMETER :: Sld8Myg = 47 + INTEGER(IntKi), PARAMETER :: Sld8Mzg = 48 + INTEGER(IntKi), PARAMETER :: Sld9Fxg = 49 + INTEGER(IntKi), PARAMETER :: Sld9Fyg = 50 + INTEGER(IntKi), PARAMETER :: Sld9Fzg = 51 + INTEGER(IntKi), PARAMETER :: Sld9Mxg = 52 + INTEGER(IntKi), PARAMETER :: Sld9Myg = 53 + INTEGER(IntKi), PARAMETER :: Sld9Mzg = 54 + + + ! Displacements: + + INTEGER(IntKi), PARAMETER :: Sld1TDxg = 55 + INTEGER(IntKi), PARAMETER :: Sld1TDyg = 56 + INTEGER(IntKi), PARAMETER :: Sld1TDzg = 57 + INTEGER(IntKi), PARAMETER :: Sld1RDxg = 58 + INTEGER(IntKi), PARAMETER :: Sld1RDyg = 59 + INTEGER(IntKi), PARAMETER :: Sld1RDzg = 60 + INTEGER(IntKi), PARAMETER :: Sld2TDxg = 61 + INTEGER(IntKi), PARAMETER :: Sld2TDyg = 62 + INTEGER(IntKi), PARAMETER :: Sld2TDzg = 63 + INTEGER(IntKi), PARAMETER :: Sld2RDxg = 64 + INTEGER(IntKi), PARAMETER :: Sld2RDyg = 65 + INTEGER(IntKi), PARAMETER :: Sld2RDzg = 66 + INTEGER(IntKi), PARAMETER :: Sld3TDxg = 67 + INTEGER(IntKi), PARAMETER :: Sld3TDyg = 68 + INTEGER(IntKi), PARAMETER :: Sld3TDzg = 69 + INTEGER(IntKi), PARAMETER :: Sld3RDxg = 70 + INTEGER(IntKi), PARAMETER :: Sld3RDyg = 71 + INTEGER(IntKi), PARAMETER :: Sld3RDzg = 72 + INTEGER(IntKi), PARAMETER :: Sld4TDxg = 73 + INTEGER(IntKi), PARAMETER :: Sld4TDyg = 74 + INTEGER(IntKi), PARAMETER :: Sld4TDzg = 75 + INTEGER(IntKi), PARAMETER :: Sld4RDxg = 76 + INTEGER(IntKi), PARAMETER :: Sld4RDyg = 77 + INTEGER(IntKi), PARAMETER :: Sld4RDzg = 78 + INTEGER(IntKi), PARAMETER :: Sld5TDxg = 79 + INTEGER(IntKi), PARAMETER :: Sld5TDyg = 80 + INTEGER(IntKi), PARAMETER :: Sld5TDzg = 81 + INTEGER(IntKi), PARAMETER :: Sld5RDxg = 82 + INTEGER(IntKi), PARAMETER :: Sld5RDyg = 83 + INTEGER(IntKi), PARAMETER :: Sld5RDzg = 84 + INTEGER(IntKi), PARAMETER :: Sld6TDxg = 85 + INTEGER(IntKi), PARAMETER :: Sld6TDyg = 86 + INTEGER(IntKi), PARAMETER :: Sld6TDzg = 87 + INTEGER(IntKi), PARAMETER :: Sld6RDxg = 88 + INTEGER(IntKi), PARAMETER :: Sld6RDyg = 89 + INTEGER(IntKi), PARAMETER :: Sld6RDzg = 90 + INTEGER(IntKi), PARAMETER :: Sld7TDxg = 91 + INTEGER(IntKi), PARAMETER :: Sld7TDyg = 92 + INTEGER(IntKi), PARAMETER :: Sld7TDzg = 93 + INTEGER(IntKi), PARAMETER :: Sld7RDxg = 94 + INTEGER(IntKi), PARAMETER :: Sld7RDyg = 95 + INTEGER(IntKi), PARAMETER :: Sld7RDzg = 96 + INTEGER(IntKi), PARAMETER :: Sld8TDxg = 97 + INTEGER(IntKi), PARAMETER :: Sld8TDyg = 98 + INTEGER(IntKi), PARAMETER :: Sld8TDzg = 99 + INTEGER(IntKi), PARAMETER :: Sld8RDxg = 100 + INTEGER(IntKi), PARAMETER :: Sld8RDyg = 101 + INTEGER(IntKi), PARAMETER :: Sld8RDzg = 102 + INTEGER(IntKi), PARAMETER :: Sld9TDxg = 103 + INTEGER(IntKi), PARAMETER :: Sld9TDyg = 104 + INTEGER(IntKi), PARAMETER :: Sld9TDzg = 105 + INTEGER(IntKi), PARAMETER :: Sld9RDxg = 106 + INTEGER(IntKi), PARAMETER :: Sld9RDyg = 107 + INTEGER(IntKi), PARAMETER :: Sld9RDzg = 108 + + + ! The maximum number of output channels which can be output by the code. + INTEGER(IntKi), PARAMETER :: MaxOutPts = 108 + +!End of code generated by Matlab script +! =================================================================================================== + ! The following simplify my output assigning later in the WriteOutput routine + integer(IntKi), parameter :: MaxNumberOfOutputLocations = 9 ! This is based on our coding of 1 digit on output point number + integer(IntKi), parameter :: SoilPtF(6,MaxNumberOfOutputLocations) = reshape( (/ & ! Forces and moments indices + SlD1Fxg, SlD1Fyg, SlD1Fzg, SlD1Mxg, SlD1Myg, SlD1Mzg, & ! SoilPt 1 + SlD2Fxg, SlD2Fyg, SlD2Fzg, SlD2Mxg, SlD2Myg, SlD2Mzg, & ! SoilPt 2 + SlD3Fxg, SlD3Fyg, SlD3Fzg, SlD3Mxg, SlD3Myg, SlD3Mzg, & ! SoilPt 3 + SlD4Fxg, SlD4Fyg, SlD4Fzg, SlD4Mxg, SlD4Myg, SlD4Mzg, & ! SoilPt 4 + SlD5Fxg, SlD5Fyg, SlD5Fzg, SlD5Mxg, SlD5Myg, SlD5Mzg, & ! SoilPt 5 + SlD6Fxg, SlD6Fyg, SlD6Fzg, SlD6Mxg, SlD6Myg, SlD6Mzg, & ! SoilPt 6 + SlD7Fxg, SlD7Fyg, SlD7Fzg, SlD7Mxg, SlD7Myg, SlD7Mzg, & ! SoilPt 7 + SlD8Fxg, SlD8Fyg, SlD8Fzg, SlD8Mxg, SlD8Myg, SlD8Mzg, & ! SoilPt 8 + SlD9Fxg, SlD9Fyg, SlD9Fzg, SlD9Mxg, SlD9Myg, SlD9Mzg & ! SoilPt 9 + /), (/6,MaxNumberOfOutputLocations/) ) + integer(IntKi), parameter :: SoilPtD(6,MaxNumberOfOutputLocations) = reshape( (/ & ! Soil point displacements indices + SlD1TDxg,SlD1TDyg,SlD1TDzg,SlD1RDxg,SlD1RDyg,SlD1RDzg, & ! SoilPt 1 + SlD2TDxg,SlD2TDyg,SlD2TDzg,SlD2RDxg,SlD2RDyg,SlD2RDzg, & ! SoilPt 2 + SlD3TDxg,SlD3TDyg,SlD3TDzg,SlD3RDxg,SlD3RDyg,SlD3RDzg, & ! SoilPt 3 + SlD4TDxg,SlD4TDyg,SlD4TDzg,SlD4RDxg,SlD4RDyg,SlD4RDzg, & ! SoilPt 4 + SlD5TDxg,SlD5TDyg,SlD5TDzg,SlD5RDxg,SlD5RDyg,SlD5RDzg, & ! SoilPt 5 + SlD6TDxg,SlD6TDyg,SlD6TDzg,SlD6RDxg,SlD6RDyg,SlD6RDzg, & ! SoilPt 6 + SlD7TDxg,SlD7TDyg,SlD7TDzg,SlD7RDxg,SlD7RDyg,SlD7RDzg, & ! SoilPt 7 + SlD8TDxg,SlD8TDyg,SlD8TDzg,SlD8RDxg,SlD8RDyg,SlD8RDzg, & ! SoilPt 8 + SlD9TDxg,SlD9TDyg,SlD9TDzg,SlD9RDxg,SlD9RDyg,SlD9RDzg & ! SoilPt 9 + /), (/6,MaxNumberOfOutputLocations/) ) +! =================================================================================================== + +CONTAINS + + +!==================================================================================================== +!> This public subroutine reads the input required for SoilDyn from the file whose name is an +!! input parameter. +subroutine SlD_ReadInput( InputFileName, EchoFileName, InputFileData, ErrStat, ErrMsg ) + + character(*), intent(in ) :: InputFileName !< name of the input file + character(*), intent(in ) :: EchoFileName !< name of the echo file + type(SlD_InputFile), intent(inout) :: InputFileData !< The data for initialization + integer(IntKi), intent( out) :: ErrStat !< Returned error status from this subroutine + character(*), intent( out) :: ErrMsg !< Returned error message from this subroutine + + integer(IntKi) :: UnitInput !< Unit number for the input file + integer(IntKi) :: UnitEcho !< The local unit number for this module's echo file + character(35) :: Fmt !< Output format for logical parameters. (matches NWTC Subroutine Library format) + character(200) :: Line !< Temporary storage of a line from the input file (to compare with "default") + integer(IntKi) :: LineLen !< Length of the line read + integer(IntKi) :: i !< Generic counter + + integer(IntKi) :: TmpErrStat !< Temporary error status + integer(IntKi) :: IOS !< Temporary error status + character(ErrMsgLen) :: TmpErrMsg !< Temporary error message + character(1024) :: PriPath !< Path name of the primary file + character(*), PARAMETER :: RoutineName="SlD_ReadInput" + + + ! Initialize local data + + UnitEcho = -1 + Fmt = "( 2X, L11, 2X, A, T30, ' - ', A )" + ErrStat = ErrID_None + ErrMsg = "" + InputFileData%EchoFlag = .FALSE. ! initialize for error handling (cleanup() routine) + CALL GetPath( InputFileName, PriPath ) ! Input files will be relative to the path where the primary input file is located. + + + ! allocate the array for the OutList + CALL AllocAry( InputFileData%OutList, MaxOutPts, "SoilDyn Input File's OutList", TmpErrStat, TmpErrMsg ); if (Failed()) return; + + !------------------------------------------------------------------------------------------------- + ! Open the file + !------------------------------------------------------------------------------------------------- + + CALL GetNewUnit( UnitInput, TmpErrStat, TmpErrMsg ); if (Failed()) return; + CALL OpenFInpFile( UnitInput, TRIM(InputFileName), TmpErrStat, TmpErrMsg ); if (Failed()) return; + + + !------------------------------------------------------------------------------------------------- + ! File header + !------------------------------------------------------------------------------------------------- + + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 1', TmpErrStat, TmpErrMsg ); if (Failed()) return; + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 2', TmpErrStat, TmpErrMsg ); if (Failed()) return; + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg ); if (Failed()) return; + + ! Echo Input Files. + call ReadVar ( UnitInput, InputFileName, InputFileData%EchoFlag, 'Echo', 'Echo Input', TmpErrStat, TmpErrMsg ); if (Failed()) return; + + ! If we are Echoing the input then we should re-read the first three lines so that we can echo them + ! using the NWTC_Library routines. The echoing is done inside those routines via a global variable + ! which we must store, set, and then replace on error or completion. + IF ( InputFileData%EchoFlag ) THEN + call OpenEcho ( UnitEcho, TRIM(EchoFileName), TmpErrStat, TmpErrMsg ); if (Failed()) return; + rewind(UnitInput) + + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 1', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file header line 2', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! Echo Input Files. + call ReadVar ( UnitInput, InputFileName, InputFileData%EchoFlag, 'Echo', 'Echo the input file data', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + end if + + ! DT - Time interval for SoilDyn calculations {or default} (s): + CALL ReadVar( UnitInput, InputFileName, Line, "DT", "Time interval for soil calculations {or default} (s)", TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + CALL Conv2UC( Line ) + IF ( INDEX(Line, "DEFAULT" ) /= 1 ) THEN ! If it's not "default", read this variable; otherwise use the value already stored in InputFileData%DTAero + READ( Line, *, IOSTAT=IOS) InputFileData%DT + CALL CheckIOS ( IOS, InputFileName, 'DT', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; + END IF + + ! CalcOption -- option on which calculation methodology to use {1: Stiffness / Damping matrices, 2: P-Y curves [unavailable], 3: coupled REDWIN DLL} + call ReadVar( UnitInput, InputFileName, InputFileData%CalcOption, "CalcOption", "Calculation methodology to use", TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + + + !------------------------------------------------------------------------------------------------- + !> Read Stiffness / Damping section [ CalcOption == 1 only ] Calc_StiffDamp + !------------------------------------------------------------------------------------------------- + + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! In general, the stiffness and damping matrices will have the following symmetries: + ! K11 = K22 + ! K15 = -K24 + ! K51 = -K42 + ! K55 = K44 + + ! Location + !NOTE: only 1 SD_location allowed at present. TODO allow multiple SD_locations + allocate( InputFileData%SD_locations(3,1), STAT=TmpErrStat ) ! InputFileData%SD_NumPoints + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate SD_locations', ErrStat, ErrMsg, RoutineName) + call ReadAry( UnitInput, InputFileName, InputFileData%SD_locations(1:3,1), 3, 'SD_locations', 'Stiffness Damping location', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + + ! Stiffness + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call AllocAry( InputFileData%Stiffness, 6, 6, 1, 'Stiffness matrices', TmpErrStat, TmpErrMsg ); if (Failed()) return; + do i=1,6 + call ReadAry( UnitInput, InputFileName, InputFileData%Stiffness(i,:,1), 6, 'Stiffness', 'Elastic stiffness matrix', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + end do + + ! Damping + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call AllocAry( InputFileData%Damping, 6, 6, 1, 'Damping matrices', TmpErrStat, TmpErrMsg ); if (Failed()) return; + do i=1,6 + call ReadAry( UnitInput, InputFileName, InputFileData%Damping(i,:,1), 6, 'Damping', 'Elastic damping ratio (-)', TmpErrStat, TmpErrMsg, UnitEcho); if (Failed()) return; + end do + + !------------------------------------------------------------------------------------------------- + !> Read P-Y curve section [ CalcOption == 2 only ] Calc_PYcurve + !------------------------------------------------------------------------------------------------- + + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call ReadVar( UnitInput, InputFileName, InputFileData%PY_NumPoints, "PY_NumPoints", "Number of PY curve points", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! Allocate arrays to hold the information that will be read in next + allocate( InputFileData%PY_locations(3,InputFileData%PY_NumPoints), STAT=TmpErrStat ) + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate PY_locations', ErrStat, ErrMsg, RoutineName) + allocate( InputFileData%PY_inputFile(InputFileData%PY_NumPoints), STAT=TmpErrStat ) + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate PY_inputFile', ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) then + call CleanUp() + return + endif + + ! Now read in the set of PY curves + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line in PY curve data', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! Read in each line of location and input file ( ---- Location (x,y,z) ------- Point InputFile ------------- ) + do i=1,InputFileData%PY_NumPoints + call ReadLine( UnitInput, '', Line, LineLen, TmpErrStat ) + if (TmpErrStat /= 0) then + call SetErrStat( ErrID_Fatal, 'Error reading PY_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) + return + endif + READ( Line, *, IOSTAT=IOS) InputFileData%PY_locations(1:3,i), InputFileData%PY_inputFile(i) + CALL CheckIOS ( IOS, InputFileName, 'DT', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; ! NOTE: unclear if the message returned will match what was misread. + + ! Check for relative paths in the file names + if ( PathIsRelative( InputFileData%PY_inputFile(i) ) ) InputFileData%PY_inputFile(i) = TRIM(PriPath)//TRIM(InputFileData%PY_inputFile(i)) + + ! Add stuff to echo file if it is used + if ( InputFileData%EchoFlag ) then + write(UnitEcho,*) ' Location ('//trim(Num2LStr(i))//')' + write(UnitEcho,*) InputFileData%PY_locations(1:3,i), trim(InputFileData%PY_inputFile(i)) + endif + end do + + + !------------------------------------------------------------------------------------------------- + !> Read REDWIN interface for DLL section [ CalcOption == 3 only ] Calc_REDWIN + !------------------------------------------------------------------------------------------------- + + + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + +!FIXME: parse out the 's' option. + ! DLL model, and optionally only use stiffness matrix in response calcs + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_modelChr, "DLL_Model", "REDWIN DLL model to use", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call Conv2UC( InputFileData%DLL_modelChr ) ! Convert Line to upper case. + + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_FileName, "DLL_FileName", "REDWIN DLL model used", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + call ReadVar( UnitInput, InputFileName, InputFileData%DLL_NumPoints, "DLL_NumPoints", "Number of DLL interfaces", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! Allocate arrays to hold the information that will be read in next + allocate( InputFileData%DLL_locations(3,InputFileData%DLL_NumPoints), STAT=TmpErrStat ) + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_locations', ErrStat, ErrMsg, RoutineName) + allocate( InputFileData%DLL_PropsFile(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_PropsFile', ErrStat, ErrMsg, RoutineName) + allocate( InputFileData%DLL_LDispFile(InputFileData%DLL_NumPoints), STAT=TmpErrStat ) + if (TmpErrStat /= 0) call SetErrStat(ErrID_Fatal, 'Could not allocate DLL_LDispFile', ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) then + call CleanUp() + return + endif + + ! Now read in the set of DLL connections + call ReadCom( UnitInput, InputFileName, 'SoilDyn input file separator line in DLL data', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + ! Read in each line of location and input file ( ---- Location (x,y,z) ------- Point InputFile ------------- ) + do i=1,InputFileData%DLL_NumPoints + call ReadLine( UnitInput, '', Line, LineLen, TmpErrStat ) + if (TmpErrStat /= 0) then + call SetErrStat( ErrID_Fatal, 'Error reading DLL_curve line '//trim(Num2LStr(i))//' from '//InputFileName//'.', ErrStat, ErrMsg, RoutineName) + return + endif + READ( Line, *, IOSTAT=IOS) InputFileData%DLL_locations(1:3,i), InputFileData%DLL_PropsFile(i), InputFileData%DLL_LDispFile(i) + CALL CheckIOS ( IOS, InputFileName, 'DLL info', NumType, TmpErrStat, TmpErrMsg ); if (Failed()) return; ! NOTE: unclear if the message returned will match what was misread. + + ! Check for relative paths in the file names + if ( PathIsRelative( InputFileData%DLL_PropsFile(i) ) ) InputFileData%DLL_PropsFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_PropsFile(i)) + if ( PathIsRelative( InputFileData%DLL_LDispFile(i) ) ) InputFileData%DLL_LDispFile(i) = TRIM(PriPath)//TRIM(InputFileData%DLL_LDispFile(i)) + + ! Add stuff to echo file if it is used + if ( InputFileData%EchoFlag ) then + write(UnitEcho,*) ' Location ('//trim(Num2LStr(i))//')' + write(UnitEcho,*) InputFileData%DLL_locations(1:3,i), trim(InputFileData%DLL_PropsFile(i)), ' ',trim(InputFileData%DLL_LDispFile(i)), ' ',trim(InputFileData%DLL_FileName) + endif + end do + + InputFileData%DLL_ProcName = 'INTERFACEFOUNDATION' ! This is hard coded for now + + !---------------------- OUTPUT -------------------------------------------------- + CALL ReadCom( UnitInput, InputFileName, 'Section Header: Output', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + ! SumPrint - Print summary data to .IfW.sum (flag): + CALL ReadVar( UnitInput, InputFileName, InputFileData%SumPrint, "SumPrint", "Print summary data to .SlD.sum (flag)", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + + !---------------------- OUTLIST -------------------------------------------- + CALL ReadCom( UnitInput, InputFileName, 'Section Header: OutList', TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + CALL SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + + ! OutList - List of user-requested output channels (-): -- uses routine from the NWTC_Library + CALL ReadOutputList ( UnitInput, InputFileName, InputFileData%OutList, InputFileData%NumOuts, 'OutList', & + "List of user-requested output channels", TmpErrStat, TmpErrMsg, UnitEcho ); if (Failed()) return; + + + + !------------------------------------------------------------------------------------------------- + ! This is the end of the input file + !------------------------------------------------------------------------------------------------- + + call Cleanup() + return + + CONTAINS + logical function Failed() + call SetErrStat( TmpErrStat, TmpErrMsg, ErrStat, ErrMsg, RoutineName ) + Failed = ErrStat >= AbortErrLev + if (ErrStat >= AbortErrLev) call CleanUp() + end function Failed + subroutine Cleanup() + ! Close input file + close ( UnitInput ) + ! Cleanup the Echo file and global variables + if ( InputFileData%EchoFlag ) then + close(UnitEcho) + end if + end subroutine Cleanup + +END SUBROUTINE SlD_ReadInput + + +!==================================================================================================== +!> This private subroutine verifies the input required for SoilDyn is correctly specified. This +!! routine checks all the parameters that are common with all the wind types, then calls subroutines +!! that check the parameters specific to each wind type. Only the parameters corresponding to the +!! desired wind type are evaluated; the rest are ignored. Additional checks will be performed after +!! the respective wind file has been read in, but these checks will be performed within the respective +!! wind module. +! +! The reason for structuring it this way is to allow for relocating the validation routines for the +! wind type into their respective modules. It might also prove useful later if we change languages +! but retain the fortran wind modules. +SUBROUTINE SlD_ValidateInput( InitInp, InputFileData, ErrStat, ErrMsg ) + TYPE(SlD_InitInputType), INTENT(IN ) :: InitInp !< Input data for initialization + TYPE(SlD_InputFile), INTENT(INOUT) :: InputFileData !< The data for initialization + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status from this subroutine + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message from this subroutine + INTEGER(IntKi) :: ErrStat2 !< Temporary error status for subroutine and function calls + CHARACTER(ErrMsgLen) :: ErrMsg2 !< Temporary error message for subroutine and function calls + INTEGER(IntKi) :: I !< Generic counter + CHARACTER(*), PARAMETER :: RoutineName="SlD_ValidateInput" + integer(IntKi) :: IOS !< Temporary error status + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + + select case(InputFileData%CalcOption) + case (Calc_StiffDamp) + call ValidateStiffnessMatrix() + case (Calc_PYcurve) + call ValidatePYcurves() + case (Calc_REDWIN) + call ValidateDLL() + end select + + +CONTAINS + subroutine ValidateStiffnessMatrix() + call CheckWtrDepth( InputFileData%SD_locations, 'SD locations', ErrStat2, ErrMsg2) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ! Notify user that damping does not yet work + if (maxval(abs(InputFileData%Damping)) > epsilon(1.0_ReKi)) then + call SetErrStat( ErrID_Severe, 'Damping matrix not supported yet with CalcOption==1 in SoilDyn. Ignoring values entered.', ErrStat, ErrMsg, RoutineName) + endif + end subroutine ValidateStiffnessMatrix + + subroutine ValidatePYcurves() + call CheckWtrDepth( InputFileData%PY_locations, 'PY locations', ErrStat2, ErrMsg2) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + ! Placeholder + end subroutine ValidatePYcurves + + subroutine ValidateDLL() + call CheckWtrDepth( InputFileData%DLL_locations, 'DLL locations', ErrStat2, ErrMsg2) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + + ! Check the model + read( InputFileData%DLL_modelChr(1:1), *, IOSTAT=IOS ) InputFileData%DLL_model + call CheckIOS ( IOS, "", 'DLL_model', NumType, ErrStat2, ErrMsg2 ) + call SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + if ( ErrStat >= AbortErrLev ) return + if ( InputFileData%DLL_model > 3_IntKi .or. InputFileData%DLL_model < 1_IntKi ) then + call SetErrStat( ErrID_Fatal,' DLL_Model must be 1, 2, or 3', ErrStat,ErrMsg,RoutineName) + endif + ! Disable option 1 and 3 + if ( InputFileData%DLL_model /= 2_IntKi ) then + call SetErrStat( ErrID_Fatal,' Only DLL_Model 2 is currently supported and validated.', ErrStat,ErrMsg,RoutineName) + return + endif + InputFileData%DLL_OnlyStiff = .false. + if (LEN_TRIM(InputFileData%DLL_modelChr) > 1_IntKi ) then + if ( InputFileData%DLL_modelChr(2:2) == 'S' ) then + InputFileData%DLL_OnlyStiff = .true. + call SetErrStat( ErrID_Info, ' Using only the stiffness matrices from the REDWIN DLL', ErrStat,ErrMsg,RoutineName ) + else + call SetErrStat( ErrID_Fatal, ' Unknown option '''//InputFileData%DLL_modelChr(2:2)//''' on the DLL_model', ErrStat,ErrMsg,RoutineName) + endif + endif + + end subroutine ValidateDLL + + subroutine CheckWtrDepth(Depths,InfoDesc,ErrStat3,ErrMsg3) + real(ReKi), intent(in ) :: Depths(:,:) + character(*), intent(in ) :: InfoDesc + integer(IntKi), intent( out) :: ErrStat3 + character(ErrMsgLen), intent( out) :: ErrMsg3 + ErrStat3 = ErrID_None + ErrMsg3 = '' + do i = 1,size(Depths,dim=2) + if (Depths(3,i) > -abs(InitInp%WtrDpth)) then + call SetErrStat( ErrID_Fatal, ' Soil location '//trim(Num2LStr(i))//' ('//trim(Num2LStr(Depths(3,i)))// & + ' m) for '//trim(InfoDesc)//' is above mudline',ErrStat3,ErrMsg3,'') + endif + end do + if (ErrStat3 /= ErrID_None) ErrMsg3=trim(ErrMsg3)//NewLine//'Water depth passed to SoilDyn = '//trim(Num2LStr(InitInp%WtrDpth))//' m' + return + end subroutine CheckWtrDepth + +END SUBROUTINE SlD_ValidateInput + + + +!********************************************************************************************************************************** +! 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 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 12-Mar-2020 13:30:14. +SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) +!.................................................................................................................................. + + IMPLICIT NONE + + ! Passed variables + + CHARACTER(ChanLen), INTENT(IN ) :: OutList(:) !< The list out user-requested outputs + TYPE(SlD_ParameterType), INTENT(INOUT) :: p !< The module parameters + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< The error status code + CHARACTER(*), INTENT( OUT) :: ErrMsg !< The error message, if an error occurred + + ! Local variables + + INTEGER :: ErrStat2 ! temporary (local) error status + INTEGER :: I ! Generic loop-counting index + INTEGER :: J ! Generic loop-counting index + INTEGER :: INDX ! Index for valid arrays + + LOGICAL :: CheckOutListAgain ! Flag used to determine if output parameter starting with "M" is valid (or the negative of another parameter) + LOGICAL :: InvalidOutput(0:MaxOutPts) ! This array determines if the output channel is valid for this configuration + CHARACTER(ChanLen) :: OutListTmp ! A string to temporarily hold OutList(I) + CHARACTER(*), PARAMETER :: RoutineName = "SetOutParam" + + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(108) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "SLD1FXG ","SLD1FYG ","SLD1FZG ","SLD1MXG ","SLD1MYG ","SLD1MZG ","SLD1RDXG ", & + "SLD1RDYG ","SLD1RDZG ","SLD1TDXG ","SLD1TDYG ","SLD1TDZG ","SLD2FXG ","SLD2FYG ", & + "SLD2FZG ","SLD2MXG ","SLD2MYG ","SLD2MZG ","SLD2RDXG ","SLD2RDYG ","SLD2RDZG ", & + "SLD2TDXG ","SLD2TDYG ","SLD2TDZG ","SLD3FXG ","SLD3FYG ","SLD3FZG ","SLD3MXG ", & + "SLD3MYG ","SLD3MZG ","SLD3RDXG ","SLD3RDYG ","SLD3RDZG ","SLD3TDXG ","SLD3TDYG ", & + "SLD3TDZG ","SLD4FXG ","SLD4FYG ","SLD4FZG ","SLD4MXG ","SLD4MYG ","SLD4MZG ", & + "SLD4RDXG ","SLD4RDYG ","SLD4RDZG ","SLD4TDXG ","SLD4TDYG ","SLD4TDZG ","SLD5FXG ", & + "SLD5FYG ","SLD5FZG ","SLD5MXG ","SLD5MYG ","SLD5MZG ","SLD5RDXG ","SLD5RDYG ", & + "SLD5RDZG ","SLD5TDXG ","SLD5TDYG ","SLD5TDZG ","SLD6FXG ","SLD6FYG ","SLD6FZG ", & + "SLD6MXG ","SLD6MYG ","SLD6MZG ","SLD6RDXG ","SLD6RDYG ","SLD6RDZG ","SLD6TDXG ", & + "SLD6TDYG ","SLD6TDZG ","SLD7FXG ","SLD7FYG ","SLD7FZG ","SLD7MXG ","SLD7MYG ", & + "SLD7MZG ","SLD7RDXG ","SLD7RDYG ","SLD7RDZG ","SLD7TDXG ","SLD7TDYG ","SLD7TDZG ", & + "SLD8FXG ","SLD8FYG ","SLD8FZG ","SLD8MXG ","SLD8MYG ","SLD8MZG ","SLD8RDXG ", & + "SLD8RDYG ","SLD8RDZG ","SLD8TDXG ","SLD8TDYG ","SLD8TDZG ","SLD9FXG ","SLD9FYG ", & + "SLD9FZG ","SLD9MXG ","SLD9MYG ","SLD9MZG ","SLD9RDXG ","SLD9RDYG ","SLD9RDZG ", & + "SLD9TDXG ","SLD9TDYG ","SLD9TDZG "/) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(108) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + Sld1Fxg , Sld1Fyg , Sld1Fzg , Sld1Mxg , Sld1Myg , Sld1Mzg , Sld1RDxg , & + Sld1RDyg , Sld1RDzg , Sld1TDxg , Sld1TDyg , Sld1TDzg , Sld2Fxg , Sld2Fyg , & + Sld2Fzg , Sld2Mxg , Sld2Myg , Sld2Mzg , Sld2RDxg , Sld2RDyg , Sld2RDzg , & + Sld2TDxg , Sld2TDyg , Sld2TDzg , Sld3Fxg , Sld3Fyg , Sld3Fzg , Sld3Mxg , & + Sld3Myg , Sld3Mzg , Sld3RDxg , Sld3RDyg , Sld3RDzg , Sld3TDxg , Sld3TDyg , & + Sld3TDzg , Sld4Fxg , Sld4Fyg , Sld4Fzg , Sld4Mxg , Sld4Myg , Sld4Mzg , & + Sld4RDxg , Sld4RDyg , Sld4RDzg , Sld4TDxg , Sld4TDyg , Sld4TDzg , Sld5Fxg , & + Sld5Fyg , Sld5Fzg , Sld5Mxg , Sld5Myg , Sld5Mzg , Sld5RDxg , Sld5RDyg , & + Sld5RDzg , Sld5TDxg , Sld5TDyg , Sld5TDzg , Sld6Fxg , Sld6Fyg , Sld6Fzg , & + Sld6Mxg , Sld6Myg , Sld6Mzg , Sld6RDxg , Sld6RDyg , Sld6RDzg , Sld6TDxg , & + Sld6TDyg , Sld6TDzg , Sld7Fxg , Sld7Fyg , Sld7Fzg , Sld7Mxg , Sld7Myg , & + Sld7Mzg , Sld7RDxg , Sld7RDyg , Sld7RDzg , Sld7TDxg , Sld7TDyg , Sld7TDzg , & + Sld8Fxg , Sld8Fyg , Sld8Fzg , Sld8Mxg , Sld8Myg , Sld8Mzg , Sld8RDxg , & + Sld8RDyg , Sld8RDzg , Sld8TDxg , Sld8TDyg , Sld8TDzg , Sld9Fxg , Sld9Fyg , & + Sld9Fzg , Sld9Mxg , Sld9Myg , Sld9Mzg , Sld9RDxg , Sld9RDyg , Sld9RDzg , & + Sld9TDxg , Sld9TDyg , Sld9TDzg /) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(108) = (/ & ! This lists the units corresponding to the allowed parameters + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ", & + "(deg) ","(deg) ","(m) ","(m) ","(m) ","(kN) ","(kN) ", & + "(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ", & + "(m) ","(m) ","(m) ","(kN) ","(kN) ","(kN) ","(kN-m) ", & + "(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ","(m) ","(m) ", & + "(m) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ", & + "(deg) ","(deg) ","(deg) ","(m) ","(m) ","(m) ","(kN) ", & + "(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ", & + "(deg) ","(m) ","(m) ","(m) ","(kN) ","(kN) ","(kN) ", & + "(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ","(m) ", & + "(m) ","(m) ","(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ", & + "(kN-m) ","(deg) ","(deg) ","(deg) ","(m) ","(m) ","(m) ", & + "(kN) ","(kN) ","(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ", & + "(deg) ","(deg) ","(m) ","(m) ","(m) ","(kN) ","(kN) ", & + "(kN) ","(kN-m) ","(kN-m) ","(kN-m) ","(deg) ","(deg) ","(deg) ", & + "(m) ","(m) ","(m) "/) + + character(4) :: TmpPrefix + + ! Initialize values + ErrStat = ErrID_None + ErrMsg = "" + InvalidOutput = .FALSE. + + +! ..... Developer must add checking for invalid inputs here: ..... + ! Check outputs based on how many points (p%NumPoints) we are interfacing with soil + ! --> Loop through possible output names and check leading prefix. + ! If it is above the number of points interfacing to soil, mark invalid. + do I=p%NumPoints+1,MaxNumberOfOutputLocations + TmpPrefix='SLD'//trim(Num2LStr(I)) + do J=1,MaxOutPts + if ( INDEX(TmpPrefix, ValidParamAry(J)(1:len(TmpPrefix))) == 1 ) InvalidOutput( ParamIndxAry(J) ) = .TRUE. + end do + end do +! ................. End of validity checking ................. + + + !------------------------------------------------------------------------------------------------- + ! Allocate and set index, name, and units for the output channels + ! If a selected output channel is not available in this module, set error flag. + !------------------------------------------------------------------------------------------------- + + ALLOCATE ( p%OutParam(0:p%NumOuts) , STAT=ErrStat2 ) + IF ( ErrStat2 /= 0_IntKi ) THEN + CALL SetErrStat( ErrID_Fatal,"Error allocating memory for the SoilDyn OutParam array.", ErrStat, ErrMsg, RoutineName ) + RETURN + ENDIF + + ! Set index, name, and units for the time output channel: + + p%OutParam(0)%Indx = Time + p%OutParam(0)%Name = "Time" ! OutParam(0) is the time channel by default. + p%OutParam(0)%Units = "(s)" + p%OutParam(0)%SignM = 1 + + + ! Set index, name, and units for all of the output channels. + ! If a selected output channel is not available by this module set ErrStat = ErrID_Warn. + + DO I = 1,p%NumOuts + + p%OutParam(I)%Name = OutList(I) + OutListTmp = OutList(I) + + ! Reverse the sign (+/-) of the output channel if the user prefixed the + ! channel name with a "-", "_", "m", or "M" character indicating "minus". + + + CheckOutListAgain = .FALSE. + + IF ( INDEX( "-_", OutListTmp(1:1) ) > 0 ) THEN + p%OutParam(I)%SignM = -1 ! ex, "-TipDxc1" causes the sign of TipDxc1 to be switched. + OutListTmp = OutListTmp(2:) + ELSE IF ( INDEX( "mM", OutListTmp(1:1) ) > 0 ) THEN ! We'll assume this is a variable name for now, (if not, we will check later if OutListTmp(2:) is also a variable name) + CheckOutListAgain = .TRUE. + p%OutParam(I)%SignM = 1 + ELSE + p%OutParam(I)%SignM = 1 + END IF + + CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case + + + Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) + + + ! If it started with an "M" (CheckOutListAgain) we didn't find the value in our list (Indx < 1) + + IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again + p%OutParam(I)%SignM = -1 ! ex, "MTipDxc1" causes the sign of TipDxc1 to be switched. + OutListTmp = OutListTmp(2:) + + Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) + END IF + + + IF ( Indx > 0 ) THEN ! we found the channel name + p%OutParam(I)%Indx = ParamIndxAry(Indx) + IF ( InvalidOutput( ParamIndxAry(Indx) ) ) THEN ! but, it isn't valid for these settings + p%OutParam(I)%Units = "INVALID" + p%OutParam(I)%SignM = 0 + ELSE + p%OutParam(I)%Units = ParamUnitsAry(Indx) ! it's a valid output + 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) + p%OutParam(I)%Units = "INVALID" + p%OutParam(I)%SignM = 0 ! multiply all results by zero + + CALL SetErrStat(ErrID_Fatal, TRIM(p%OutParam(I)%Name)//" is not an available output channel.",ErrStat,ErrMsg,RoutineName) + END IF + + END DO + + RETURN +END SUBROUTINE SetOutParam +!---------------------------------------------------------------------------------------------------------------------------------- +!End of code generated by Matlab script +!********************************************************************************************************************************** + + +!==================================================================================================== +SUBROUTINE SlD_OpenSumFile( SumFileUnit, SummaryName, IfW_Prog, WindType, ErrStat, ErrMsg ) + INTEGER(IntKi), INTENT( OUT) :: SumFileUnit !< the unit number for the SoilDyn summary file + CHARACTER(*), INTENT(IN ) :: SummaryName !< the name of the SoilDyn summary file + TYPE(ProgDesc), INTENT(IN ) :: IfW_Prog !< the name/version/date of the SoilDyn program + INTEGER(IntKi), INTENT(IN ) :: WindType !< type identifying what wind we are using + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< returns a non-zero value when an error occurs + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + INTEGER(IntKi) :: TmpErrStat !< Temporary error status for checking how the WRITE worked + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + + SumFileUnit = -1 + CALL GetNewUnit( SumFileUnit ) + CALL OpenFOutFile ( SumFileUnit, SummaryName, ErrStat, ErrMsg ) + IF (ErrStat >=AbortErrLev) RETURN + + ! Write the summary file header + WRITE(SumFileUnit,'(/,A/)',IOSTAT=TmpErrStat) 'This summary file was generated by '//TRIM( IfW_Prog%Name )//& + ' '//TRIM( IfW_Prog%Ver )//' on '//CurDate()//' at '//CurTime()//'.' + WRITE(SumFileUnit,'(A14,I1)',IOSTAT=TmpErrStat) ' WindType: ',WindType + IF ( TmpErrStat /= 0 ) THEN + CALL SetErrStat(ErrID_Fatal,'Error writing to summary file.',ErrStat,ErrMsg,'') + RETURN + END IF +END SUBROUTINE SlD_OpenSumFile +!==================================================================================================== +SUBROUTINE SlD_CloseSumFile( SumFileUnit, ErrStat, ErrMsg ) + INTEGER(IntKi), INTENT(INOUT) :: SumFileUnit !< the unit number for the SoilDyn summary file + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< returns a non-zero value when an error occurs + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + INTEGER(IntKi) :: TmpErrStat + CHARACTER(1024) :: TmpErrMsg + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = '' + TmpErrStat = ErrID_None + TmpErrMsg = '' + + ! Write any closing information in the summary file + IF ( SumFileUnit > 0_IntKi ) THEN + WRITE (SumFileUnit,'(/,A/)', IOSTAT=TmpErrStat) 'This summary file was closed on '//CurDate()//' at '//CurTime()//'.' + IF (TmpErrStat /= 0_IntKi) CALL SetErrStat( ErrID_Fatal, 'Problem writing to the SoilDyn summary file.', ErrStat, ErrMsg, '' ) + + ! Close the file + CLOSE( SumFileUnit, IOSTAT=TmpErrStat ) + IF (TmpErrStat /= 0_IntKi) CALL SetErrStat( ErrID_Fatal, 'Problem closing the SoilDyn summary file.', ErrStat, ErrMsg, '' ) + END IF +END SUBROUTINE SlD_CloseSumFile +!==================================================================================================== + +!> Set the output channels +!! Note: there is an assumption here that only small angle deflections will occur +subroutine SlD_WriteOutput(p, AllOuts, u, y, m, ErrStat, ErrMsg ) + + type(SlD_ParameterType), intent(in ) :: p !< The module parameters + real(ReKi), intent(inout) :: AllOuts(0:) !< array of values to potentially write to file + type(SlD_InputType), intent(in ) :: u !< inputs + type(SlD_OutputType), intent(in ) :: y !< outputs + type(SlD_MiscVarType), intent(inout) :: m !< misc/optimization variables (for computing mesh transfers) + integer(IntKi), intent( out) :: ErrStat !< The error status code + character(*), intent( out) :: ErrMsg !< The error message, if an error occurred + + ! local variables + character(*), parameter :: RoutineName = 'SlD_WriteOutput' + integer(IntKi) :: i,j ! generic counters + real(ReKi) :: Theta(3) ! euler angle extraction (small angle assumption required for this module anyhow) + + ErrStat = ErrID_None + ErrMsg = '' + AllOuts = 0.0_ReKi + if (p%NumOuts < 1) return + + ! Cycle through the soil interaction points only (all the others are marked invalid anyhow) + do i=1,p%NumPoints + ! Forces + do j=1,3 + AllOuts( SoilPtF(j,i) ) = real( -m%ForceTotal(j,i) / 1000.0_ReKi, SiKi ) + end do + + ! Moments + do j=4,6 + AllOuts( SoilPtF(j,i) ) = real( -m%ForceTotal(j,i) / 1000.0_ReKi, SiKi ) + end do + + ! Translation displacement + do j=1,3 + AllOuts( SoilPtD(j ,i) ) = real( u%SoilMesh%TranslationDisp(j,i), SiKi ) + end do + + ! We have defined the referene orientatation aligned with XYZ, so we don't need as much math here. + ! Small angle assumption must be valid for computations in this module, so GetSmllRotAngs extract is sufficient + Theta = real( GetSmllRotAngs(u%SoilMesh%Orientation(1:3,1:3,i), ErrStat, ErrMsg), ReKi) ! orientations are double + do j=1,3 + AllOuts( SoilPtD(j+3,i) ) = Theta(j)*R2D + end do + end do + + + + +end subroutine SlD_WriteOutput +!********************************************************************************************************************************** +END MODULE SoilDyn_IO diff --git a/modules/soildyn/src/SoilDyn_Registry.txt b/modules/soildyn/src/SoilDyn_Registry.txt new file mode 100644 index 0000000000..872133c97b --- /dev/null +++ b/modules/soildyn/src/SoilDyn_Registry.txt @@ -0,0 +1,132 @@ +################################################################################################################################### +# Registry for SoilDyn in the FAST Modularization Framework +# This Registry file is used to create MODULE SoilDyn_Types, which contains all of the user-defined types needed in SoilDyn. +# It also contains copy, destroy, pack, and unpack routines associated with each defined data types. +# +# Entries are of the form +# keyword +# +# Use ^ as a shortcut for the value from the previous line. +# See NWTC Programmer's Handbook for further information on the format/contents of this file. +################################################################################################################################### + +# ...... Include files (definitions from NWTC Library) ............................................................................ +include Registry_NWTC_Library.txt + +#Parameters CalcOptions: {1: Stiffness / Damping matrices [unavailable], 2: P-Y curves [unavailable], 3: coupled REDWIN DLL} +param SoilDyn/SlD - IntKi Calc_StiffDamp - 1 - "Stiffness / Damping calculations (currently unavailable)" - +param ^ - IntKi Calc_PYcurve - 2 - "P-Y curve calculations (currently unavailable)" - +param ^ - IntKi Calc_REDWIN - 3 - "Coupled to REDWIN dll for soil reaction forces" - + +# REDWIN interface DLL type +# ..... Data for using REDWIN DLLs ....................................................................................................... +# Values set to type R8Ki are defined in the REDWIN fortran code as kind=selected_real_kind(p=15) +typedef ^ REDWINdllType character(45) PROPSFILE - - - "" - +typedef ^ ^ character(45) LDISPFILE - - - "" - +typedef ^ ^ IntKi IDtask - - - "Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix" - +typedef ^ ^ IntKi nErrorCode - - - "number of returned error codes" - +typedef ^ ^ IntKi ErrorCode {100} - - "Array containing one or more error codes. These are specific to each model." - +typedef ^ ^ R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - +typedef ^ ^ R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - +typedef ^ ^ IntKi StVarPrint {12}{100} - - "Array indicating which state variables should be printed to the screen. This feature is currently not supported." - +typedef ^ ^ R8Ki Disp {6} - - "Displacements. Follows convention of REDWIN orientation." '(m, rad)' +typedef ^ ^ R8Ki Force {6} - - "Forces. Follows convention of REDWIN orientations." '(N)' +typedef ^ ^ R8Ki D {6}{6} - - "The 6 x 6 elastic macro-element stiffness matrix at the SFI." - +typedef ^ ^ LOGICAL SuppressWarn - .FALSE. - "Supress further warnings." - +typedef ^ ^ IntKi RunMode - 0 - "RunMode of DLL (read from Props(1,1) in Model 1 during initialization" - + + +typedef ^ REDWINdllStates R8Ki Props {100}{200} - - "Array containing foundation model properties (used internally by the REDWIN models). Specific to each model." - +typedef ^ ^ R8Ki StVar {12}{100} - - "Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model." - + + +# SoilDyn input file +typedef ^ SlD_InputFile LOGICAL EchoFlag - - - "Echo the input file" - +typedef ^ ^ CHARACTER(ChanLen) OutList : - - "List of user-requested output channels" - +typedef ^ ^ R8Ki DT - - - "Timestep requested" '(s)' +typedef ^ ^ IntKi CalcOption - - - "Calculation methodology to use" - +typedef ^ ^ ReKi SD_locations :: - - "Location of the Stiffness damping point" '(m)' +typedef ^ ^ R8Ki Stiffness ::: - - "Stiffness matrix 6x6" '(N/m, N-m/rad)' +typedef ^ ^ R8Ki Damping ::: - - "Damping ratio matrix 6x6" - +typedef ^ ^ IntKi PY_numpoints - - - "Number of P-Y curve mesh points" - +typedef ^ ^ ReKi PY_locations :: - - "P-Y curve location points for mesh" '(m)' +typedef ^ ^ character(1024) PY_inputFile : - - "Input file with P-Y curve data" - +typedef ^ ^ IntKi DLL_model - - - "REDWIN DLL model type to use" - +typedef ^ ^ CHARACTER(2) DLL_modelChr - - - "REDWIN DLL model type to use - character string" - +typedef ^ ^ CHARACTER(1024) DLL_FileName - - - "Name of the DLL file including the full path" - +typedef ^ ^ CHARACTER(1024) DLL_ProcName - - - "Name of the procedure in the DLL that will be called" - +typedef ^ ^ IntKi DLL_numpoints - - - "Number of points to interface to DLL" - +typedef ^ ^ ReKi DLL_locations :: - - "DLL location points for mesh" '(m)' +typedef ^ ^ CHARACTER(1024) DLL_PROPSFILE : - - "Name of PROPSFILE input file used in DLL" - +typedef ^ ^ CHARACTER(1024) DLL_LDISPFILE : - - "Name of LDISPFILE input file used in DLL" - +typedef ^ ^ LOGICAL SumPrint - - - "Print summary information to file (.SlD.sum)" - +typedef ^ ^ IntKi NumOuts - - - "Number of outputs requested" - +typedef ^ ^ logical DLL_OnlyStiff - - - "use only the DLL stiffness matrices in calculating response" - + +# ..... Initialization data ....................................................................................................... +# Define inputs that the initialization routine may need here: +# e.g., the name of the input file, the file root name, etc. +typedef ^ InitInputType CHARACTER(1024) InputFile - - - "Name of the input file" - +typedef ^ ^ CHARACTER(1024) RootName - - - "Root name of the input file" - +typedef ^ ^ LOGICAL Linearize - F - "Flag that tells this module if the glue code wants to linearize." - +typedef ^ ^ ReKi WtrDpth - - - "Water depth to mudline (global coordinates)" '(m)' +typedef ^ ^ logical SlDNonLinearForcePortionOnly - F - "Only the non-linear portion of the reaction forces is returned" - + +# Define outputs from the initialization routine here: +typedef ^ InitOutputType ModVarsType Vars - - - "Module Variables" +typedef ^ ^ CHARACTER(ChanLen) WriteOutputHdr : - - "Names of the output-to-file channels" - +typedef ^ ^ CHARACTER(ChanLen) WriteOutputUnt : - - "Units of the output-to-file channels" - +typedef ^ ^ ProgDesc Ver - - - "This module's name, version, and date" - +typedef ^ ^ ReKi SoilStiffness ::: - - "Soil stiffness at each mesh point (in order)" '(N/m, N-m/rad)' + +# ..... States .................................................................................................................... +# Define continuous (differentiable) states here: +typedef ^ ContinuousStateType ReKi DummyContState - - - "Remove this variable if you have continuous states" - + +# Define discrete (nondifferentiable) states here: +typedef ^ DiscreteStateType REDWINdllStates dll_states : - - "State data used for REDWIN DLL (we think)" - + +# Define constraint states here: +typedef ^ ConstraintStateType ReKi DummyConstrState - - - "Remove this variable if you have constraint states" - + +# Define any other states, including integer or logical states here: +typedef ^ OtherStateType IntKi DummyOtherState - - - "Remove this variable if you have other states" - + +# Parameters ................................................................................................................ +# Define parameters here: +# Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: +typedef ^ ParameterType DbKi DT - - - "Time step for cont. state integration & disc. state update" seconds +typedef ^ ^ DLL_Type DLL_Trgt - - - "The addresses and names of the Bladed DLL and its procedure" - +typedef ^ ^ DbKi DLL_DT - - - "Time step for DLL" seconds +typedef ^ ^ CHARACTER(1024) RootName - - - "RootName for writing output files" - +typedef ^ ^ LOGICAL UseREDWINinterface - F - "True if interface successfully initialized" - +typedef ^ ^ CHARACTER(1024) RootFileName - - - "Root file name" - +typedef ^ ^ CHARACTER(1024) EchoFileName - - - "Name of echo file" - +typedef ^ ^ CHARACTER(1024) SumFileName - - - "Name of summary file" - +typedef ^ ^ IntKi DLL_model - - - "REDWIN DLL model type to use" - +typedef ^ ^ IntKi CalcOption - - - "Calculation methodology to use" - +typedef ^ ^ OutParmType OutParam : - - "Names and units (and other characteristics) of all requested output parameters" - +typedef ^ ^ IntKi NumOuts - - - "Number of parameters in the output list (number of outputs requested)" - +typedef ^ ^ IntKi NumPoints - - - "Number of points interfacing soil with" - +typedef ^ ^ ReKi WtrDepth - - - "Water depth to mudline (global coordinates)" '(m)' +typedef ^ ^ R8Ki Stiffness ::: - - "Stiffness matrix" '(N/m, N-m/rad)' +typedef ^ ^ logical DLL_OnlyStiff - - - "Use only the stiffness matrix in calculating the restoring forces" - +typedef ^ ^ logical SlDNonLinearForcePortionOnly - F - "Only the non-linear portion of the reaction forces is returned" - + +# Inputs .................................................................................................................... +typedef ^ InputType MeshType SoilMesh - - - "Mesh of soil contact points" - + +# Outputs ................................................................................................................... +typedef ^ OutputType ReKi WriteOutput : - - "Example of data to be written to an output file" "s,-" +typedef ^ ^ MeshType SoilMesh - - - "reaction forces and moments point mesh (may be multiple points)" - + +# Misc/Optimization variables................................................................................................. +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef ^ MiscVarType REDWINdllType dll_data : - - "data used for REDWIN DLL" - +typedef ^ ^ R8Ki ForceTotal :: - - "Total reaction force at each node" - +typedef ^ ^ ModJacType Jac - - - "Values corresponding to module variables" +typedef ^ ^ SlD_ContinuousStateType x_perturb - - - "Continuous state perturbation" - +typedef ^ ^ SlD_ContinuousStateType dxdt_lin - - - "Continuous state derivative" - +typedef ^ ^ SlD_InputType u_perturb - - - "Input perturbation" - +typedef ^ ^ SlD_OutputType y_lin - - - "Output" - diff --git a/modules/soildyn/src/SoilDyn_Types.f90 b/modules/soildyn/src/SoilDyn_Types.f90 new file mode 100644 index 0000000000..e5afda70e5 --- /dev/null +++ b/modules/soildyn/src/SoilDyn_Types.f90 @@ -0,0 +1,1855 @@ +!STARTOFREGISTRYGENERATEDFILE 'SoilDyn_Types.f90' +! +! WARNING This file is generated automatically by the FAST registry. +! Do not edit. Your changes to this file will be lost. +! +! FAST Registry +!********************************************************************************************************************************* +! SoilDyn_Types +!................................................................................................................................. +! This file is part of SoilDyn. +! +! Copyright (C) 2012-2016 National Renewable Energy Laboratory +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +! +! W A R N I N G : This file was automatically generated from the FAST registry. Changes made to this file may be lost. +! +!********************************************************************************************************************************* +!> This module contains the user-defined types needed in SoilDyn. It also contains copy, destroy, pack, and +!! unpack routines associated with each defined data type. This code is automatically generated by the FAST Registry. +MODULE SoilDyn_Types +!--------------------------------------------------------------------------------------------------------------------------------- +USE NWTC_Library +IMPLICIT NONE + INTEGER(IntKi), PUBLIC, PARAMETER :: Calc_StiffDamp = 1 ! Stiffness / Damping calculations (currently unavailable) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Calc_PYcurve = 2 ! P-Y curve calculations (currently unavailable) [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Calc_REDWIN = 3 ! Coupled to REDWIN dll for soil reaction forces [-] +! ========= REDWINdllType ======= + TYPE, PUBLIC :: REDWINdllType + character(45) :: PROPSFILE !< [-] + character(45) :: LDISPFILE !< [-] + INTEGER(IntKi) :: IDtask = 0_IntKi !< Task identifier for what DLL should do: IDTask = 1: Read input properties, initialize and calibrate model IDTask = 2: Calculate forces based on displacement at end of step IDTask = 3: Calculate elastic macro-element stiffness matrix [-] + INTEGER(IntKi) :: nErrorCode = 0_IntKi !< number of returned error codes [-] + INTEGER(IntKi) , DIMENSION(1:100) :: ErrorCode = 0_IntKi !< Array containing one or more error codes. These are specific to each model. [-] + REAL(R8Ki) , DIMENSION(1:100,1:200) :: Props = 0.0_R8Ki !< Array containing foundation model properties (used internally by the REDWIN models). Specific to each model. [-] + REAL(R8Ki) , DIMENSION(1:12,1:100) :: StVar = 0.0_R8Ki !< Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model. [-] + INTEGER(IntKi) , DIMENSION(1:12,1:100) :: StVarPrint = 0_IntKi !< Array indicating which state variables should be printed to the screen. This feature is currently not supported. [-] + REAL(R8Ki) , DIMENSION(1:6) :: Disp = 0.0_R8Ki !< Displacements. Follows convention of REDWIN orientation. ['(m,] + REAL(R8Ki) , DIMENSION(1:6) :: Force = 0.0_R8Ki !< Forces. Follows convention of REDWIN orientations. ['(N)'] + REAL(R8Ki) , DIMENSION(1:6,1:6) :: D = 0.0_R8Ki !< The 6 x 6 elastic macro-element stiffness matrix at the SFI. [-] + LOGICAL :: SuppressWarn = .FALSE. !< Supress further warnings. [-] + INTEGER(IntKi) :: RunMode = 0 !< RunMode of DLL (read from Props(1,1) in Model 1 during initialization [-] + END TYPE REDWINdllType +! ======================= +! ========= REDWINdllStates ======= + TYPE, PUBLIC :: REDWINdllStates + REAL(R8Ki) , DIMENSION(1:100,1:200) :: Props = 0.0_R8Ki !< Array containing foundation model properties (used internally by the REDWIN models). Specific to each model. [-] + REAL(R8Ki) , DIMENSION(1:12,1:100) :: StVar = 0.0_R8Ki !< Array containing the state variables at the end of the step (used internally by the REDWIN models). Specific to each model. [-] + END TYPE REDWINdllStates +! ======================= +! ========= SlD_InputFile ======= + TYPE, PUBLIC :: SlD_InputFile + LOGICAL :: EchoFlag = .false. !< Echo the input file [-] + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: OutList !< List of user-requested output channels [-] + REAL(R8Ki) :: DT = 0.0_R8Ki !< Timestep requested ['(s)'] + INTEGER(IntKi) :: CalcOption = 0_IntKi !< Calculation methodology to use [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: SD_locations !< Location of the Stiffness damping point ['(m)'] + REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: Stiffness !< Stiffness matrix 6x6 ['(N/m,] + REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: Damping !< Damping ratio matrix 6x6 [-] + INTEGER(IntKi) :: PY_numpoints = 0_IntKi !< Number of P-Y curve mesh points [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PY_locations !< P-Y curve location points for mesh ['(m)'] + character(1024) , DIMENSION(:), ALLOCATABLE :: PY_inputFile !< Input file with P-Y curve data [-] + INTEGER(IntKi) :: DLL_model = 0_IntKi !< REDWIN DLL model type to use [-] + CHARACTER(2) :: DLL_modelChr !< REDWIN DLL model type to use - character string [-] + CHARACTER(1024) :: DLL_FileName !< Name of the DLL file including the full path [-] + CHARACTER(1024) :: DLL_ProcName !< Name of the procedure in the DLL that will be called [-] + INTEGER(IntKi) :: DLL_numpoints = 0_IntKi !< Number of points to interface to DLL [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DLL_locations !< DLL location points for mesh ['(m)'] + CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: DLL_PROPSFILE !< Name of PROPSFILE input file used in DLL [-] + CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: DLL_LDISPFILE !< Name of LDISPFILE input file used in DLL [-] + LOGICAL :: SumPrint = .false. !< Print summary information to file (.SlD.sum) [-] + INTEGER(IntKi) :: NumOuts = 0_IntKi !< Number of outputs requested [-] + LOGICAL :: DLL_OnlyStiff = .false. !< use only the DLL stiffness matrices in calculating response [-] + END TYPE SlD_InputFile +! ======================= +! ========= SlD_InitInputType ======= + TYPE, PUBLIC :: SlD_InitInputType + CHARACTER(1024) :: InputFile !< Name of the input file [-] + CHARACTER(1024) :: RootName !< Root name of the input file [-] + LOGICAL :: Linearize = .false. !< Flag that tells this module if the glue code wants to linearize. [-] + REAL(ReKi) :: WtrDpth = 0.0_ReKi !< Water depth to mudline (global coordinates) ['(m)'] + LOGICAL :: SlDNonLinearForcePortionOnly = .false. !< Only the non-linear portion of the reaction forces is returned [-] + END TYPE SlD_InitInputType +! ======================= +! ========= SlD_InitOutputType ======= + TYPE, PUBLIC :: SlD_InitOutputType + TYPE(ModVarsType) :: Vars !< Module Variables [-] + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] + CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] + TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] + REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: SoilStiffness !< Soil stiffness at each mesh point (in order) ['(N/m,] + END TYPE SlD_InitOutputType +! ======================= +! ========= SlD_ContinuousStateType ======= + TYPE, PUBLIC :: SlD_ContinuousStateType + REAL(ReKi) :: DummyContState = 0.0_ReKi !< Remove this variable if you have continuous states [-] + END TYPE SlD_ContinuousStateType +! ======================= +! ========= SlD_DiscreteStateType ======= + TYPE, PUBLIC :: SlD_DiscreteStateType + TYPE(REDWINdllStates) , DIMENSION(:), ALLOCATABLE :: dll_states !< State data used for REDWIN DLL (we think) [-] + END TYPE SlD_DiscreteStateType +! ======================= +! ========= SlD_ConstraintStateType ======= + TYPE, PUBLIC :: SlD_ConstraintStateType + REAL(ReKi) :: DummyConstrState = 0.0_ReKi !< Remove this variable if you have constraint states [-] + END TYPE SlD_ConstraintStateType +! ======================= +! ========= SlD_OtherStateType ======= + TYPE, PUBLIC :: SlD_OtherStateType + INTEGER(IntKi) :: DummyOtherState = 0_IntKi !< Remove this variable if you have other states [-] + END TYPE SlD_OtherStateType +! ======================= +! ========= SlD_ParameterType ======= + TYPE, PUBLIC :: SlD_ParameterType + REAL(DbKi) :: DT = 0.0_R8Ki !< Time step for cont. state integration & disc. state update [seconds] + TYPE(DLL_Type) :: DLL_Trgt !< The addresses and names of the Bladed DLL and its procedure [-] + REAL(DbKi) :: DLL_DT = 0.0_R8Ki !< Time step for DLL [seconds] + CHARACTER(1024) :: RootName !< RootName for writing output files [-] + LOGICAL :: UseREDWINinterface = .false. !< True if interface successfully initialized [-] + CHARACTER(1024) :: RootFileName !< Root file name [-] + CHARACTER(1024) :: EchoFileName !< Name of echo file [-] + CHARACTER(1024) :: SumFileName !< Name of summary file [-] + INTEGER(IntKi) :: DLL_model = 0_IntKi !< REDWIN DLL model type to use [-] + INTEGER(IntKi) :: CalcOption = 0_IntKi !< Calculation methodology to use [-] + TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: OutParam !< Names and units (and other characteristics) of all requested output parameters [-] + INTEGER(IntKi) :: NumOuts = 0_IntKi !< Number of parameters in the output list (number of outputs requested) [-] + INTEGER(IntKi) :: NumPoints = 0_IntKi !< Number of points interfacing soil with [-] + REAL(ReKi) :: WtrDepth = 0.0_ReKi !< Water depth to mudline (global coordinates) ['(m)'] + REAL(R8Ki) , DIMENSION(:,:,:), ALLOCATABLE :: Stiffness !< Stiffness matrix ['(N/m,] + LOGICAL :: DLL_OnlyStiff = .false. !< Use only the stiffness matrix in calculating the restoring forces [-] + LOGICAL :: SlDNonLinearForcePortionOnly = .false. !< Only the non-linear portion of the reaction forces is returned [-] + END TYPE SlD_ParameterType +! ======================= +! ========= SlD_InputType ======= + TYPE, PUBLIC :: SlD_InputType + TYPE(MeshType) :: SoilMesh !< Mesh of soil contact points [-] + END TYPE SlD_InputType +! ======================= +! ========= SlD_OutputType ======= + TYPE, PUBLIC :: SlD_OutputType + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Example of data to be written to an output file [s,-] + TYPE(MeshType) :: SoilMesh !< reaction forces and moments point mesh (may be multiple points) [-] + END TYPE SlD_OutputType +! ======================= +! ========= SlD_MiscVarType ======= + TYPE, PUBLIC :: SlD_MiscVarType + TYPE(REDWINdllType) , DIMENSION(:), ALLOCATABLE :: dll_data !< data used for REDWIN DLL [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: ForceTotal !< Total reaction force at each node [-] + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] + TYPE(SlD_ContinuousStateType) :: x_perturb !< Continuous state perturbation [-] + TYPE(SlD_ContinuousStateType) :: dxdt_lin !< Continuous state derivative [-] + TYPE(SlD_InputType) :: u_perturb !< Input perturbation [-] + TYPE(SlD_OutputType) :: y_lin !< Output [-] + END TYPE SlD_MiscVarType +! ======================= + integer(IntKi), public, parameter :: SlD_x_DummyContState = 1 ! SlD%DummyContState + integer(IntKi), public, parameter :: SlD_u_SoilMesh = 2 ! SlD%SoilMesh + integer(IntKi), public, parameter :: SlD_y_WriteOutput = 3 ! SlD%WriteOutput + integer(IntKi), public, parameter :: SlD_y_SoilMesh = 4 ! SlD%SoilMesh + +contains + +subroutine SlD_CopyREDWINdllType(SrcREDWINdllTypeData, DstREDWINdllTypeData, CtrlCode, ErrStat, ErrMsg) + type(REDWINdllType), intent(in) :: SrcREDWINdllTypeData + type(REDWINdllType), intent(inout) :: DstREDWINdllTypeData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_CopyREDWINdllType' + ErrStat = ErrID_None + ErrMsg = '' + DstREDWINdllTypeData%PROPSFILE = SrcREDWINdllTypeData%PROPSFILE + DstREDWINdllTypeData%LDISPFILE = SrcREDWINdllTypeData%LDISPFILE + DstREDWINdllTypeData%IDtask = SrcREDWINdllTypeData%IDtask + DstREDWINdllTypeData%nErrorCode = SrcREDWINdllTypeData%nErrorCode + DstREDWINdllTypeData%ErrorCode = SrcREDWINdllTypeData%ErrorCode + DstREDWINdllTypeData%Props = SrcREDWINdllTypeData%Props + DstREDWINdllTypeData%StVar = SrcREDWINdllTypeData%StVar + DstREDWINdllTypeData%StVarPrint = SrcREDWINdllTypeData%StVarPrint + DstREDWINdllTypeData%Disp = SrcREDWINdllTypeData%Disp + DstREDWINdllTypeData%Force = SrcREDWINdllTypeData%Force + DstREDWINdllTypeData%D = SrcREDWINdllTypeData%D + DstREDWINdllTypeData%SuppressWarn = SrcREDWINdllTypeData%SuppressWarn + DstREDWINdllTypeData%RunMode = SrcREDWINdllTypeData%RunMode +end subroutine + +subroutine SlD_DestroyREDWINdllType(REDWINdllTypeData, ErrStat, ErrMsg) + type(REDWINdllType), intent(inout) :: REDWINdllTypeData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_DestroyREDWINdllType' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine SlD_PackREDWINdllType(RF, Indata) + type(RegFile), intent(inout) :: RF + type(REDWINdllType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackREDWINdllType' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%PROPSFILE) + call RegPack(RF, InData%LDISPFILE) + call RegPack(RF, InData%IDtask) + call RegPack(RF, InData%nErrorCode) + call RegPack(RF, InData%ErrorCode) + call RegPack(RF, InData%Props) + call RegPack(RF, InData%StVar) + call RegPack(RF, InData%StVarPrint) + call RegPack(RF, InData%Disp) + call RegPack(RF, InData%Force) + call RegPack(RF, InData%D) + call RegPack(RF, InData%SuppressWarn) + call RegPack(RF, InData%RunMode) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackREDWINdllType(RF, OutData) + type(RegFile), intent(inout) :: RF + type(REDWINdllType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackREDWINdllType' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%PROPSFILE); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LDISPFILE); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%IDtask); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nErrorCode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%ErrorCode); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Props); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%StVar); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%StVarPrint); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Disp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Force); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%D); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SuppressWarn); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RunMode); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_CopyREDWINdllStates(SrcREDWINdllStatesData, DstREDWINdllStatesData, CtrlCode, ErrStat, ErrMsg) + type(REDWINdllStates), intent(in) :: SrcREDWINdllStatesData + type(REDWINdllStates), intent(inout) :: DstREDWINdllStatesData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_CopyREDWINdllStates' + ErrStat = ErrID_None + ErrMsg = '' + DstREDWINdllStatesData%Props = SrcREDWINdllStatesData%Props + DstREDWINdllStatesData%StVar = SrcREDWINdllStatesData%StVar +end subroutine + +subroutine SlD_DestroyREDWINdllStates(REDWINdllStatesData, ErrStat, ErrMsg) + type(REDWINdllStates), intent(inout) :: REDWINdllStatesData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_DestroyREDWINdllStates' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine SlD_PackREDWINdllStates(RF, Indata) + type(RegFile), intent(inout) :: RF + type(REDWINdllStates), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackREDWINdllStates' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%Props) + call RegPack(RF, InData%StVar) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackREDWINdllStates(RF, OutData) + type(RegFile), intent(inout) :: RF + type(REDWINdllStates), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackREDWINdllStates' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%Props); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%StVar); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrStat, ErrMsg) + type(SlD_InputFile), intent(in) :: SrcInputFileData + type(SlD_InputFile), intent(inout) :: DstInputFileData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: ErrStat2 + character(*), parameter :: RoutineName = 'SlD_CopyInputFile' + ErrStat = ErrID_None + ErrMsg = '' + DstInputFileData%EchoFlag = SrcInputFileData%EchoFlag + if (allocated(SrcInputFileData%OutList)) then + LB(1:1) = lbound(SrcInputFileData%OutList) + UB(1:1) = ubound(SrcInputFileData%OutList) + if (.not. allocated(DstInputFileData%OutList)) then + allocate(DstInputFileData%OutList(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%OutList.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%OutList = SrcInputFileData%OutList + end if + DstInputFileData%DT = SrcInputFileData%DT + DstInputFileData%CalcOption = SrcInputFileData%CalcOption + if (allocated(SrcInputFileData%SD_locations)) then + LB(1:2) = lbound(SrcInputFileData%SD_locations) + UB(1:2) = ubound(SrcInputFileData%SD_locations) + if (.not. allocated(DstInputFileData%SD_locations)) then + allocate(DstInputFileData%SD_locations(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%SD_locations.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%SD_locations = SrcInputFileData%SD_locations + end if + if (allocated(SrcInputFileData%Stiffness)) then + LB(1:3) = lbound(SrcInputFileData%Stiffness) + UB(1:3) = ubound(SrcInputFileData%Stiffness) + if (.not. allocated(DstInputFileData%Stiffness)) then + allocate(DstInputFileData%Stiffness(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%Stiffness.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%Stiffness = SrcInputFileData%Stiffness + end if + if (allocated(SrcInputFileData%Damping)) then + LB(1:3) = lbound(SrcInputFileData%Damping) + UB(1:3) = ubound(SrcInputFileData%Damping) + if (.not. allocated(DstInputFileData%Damping)) then + allocate(DstInputFileData%Damping(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%Damping.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%Damping = SrcInputFileData%Damping + end if + DstInputFileData%PY_numpoints = SrcInputFileData%PY_numpoints + if (allocated(SrcInputFileData%PY_locations)) then + LB(1:2) = lbound(SrcInputFileData%PY_locations) + UB(1:2) = ubound(SrcInputFileData%PY_locations) + if (.not. allocated(DstInputFileData%PY_locations)) then + allocate(DstInputFileData%PY_locations(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PY_locations.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%PY_locations = SrcInputFileData%PY_locations + end if + if (allocated(SrcInputFileData%PY_inputFile)) then + LB(1:1) = lbound(SrcInputFileData%PY_inputFile) + UB(1:1) = ubound(SrcInputFileData%PY_inputFile) + if (.not. allocated(DstInputFileData%PY_inputFile)) then + allocate(DstInputFileData%PY_inputFile(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%PY_inputFile.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%PY_inputFile = SrcInputFileData%PY_inputFile + end if + DstInputFileData%DLL_model = SrcInputFileData%DLL_model + DstInputFileData%DLL_modelChr = SrcInputFileData%DLL_modelChr + DstInputFileData%DLL_FileName = SrcInputFileData%DLL_FileName + DstInputFileData%DLL_ProcName = SrcInputFileData%DLL_ProcName + DstInputFileData%DLL_numpoints = SrcInputFileData%DLL_numpoints + if (allocated(SrcInputFileData%DLL_locations)) then + LB(1:2) = lbound(SrcInputFileData%DLL_locations) + UB(1:2) = ubound(SrcInputFileData%DLL_locations) + if (.not. allocated(DstInputFileData%DLL_locations)) then + allocate(DstInputFileData%DLL_locations(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%DLL_locations.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%DLL_locations = SrcInputFileData%DLL_locations + end if + if (allocated(SrcInputFileData%DLL_PROPSFILE)) then + LB(1:1) = lbound(SrcInputFileData%DLL_PROPSFILE) + UB(1:1) = ubound(SrcInputFileData%DLL_PROPSFILE) + if (.not. allocated(DstInputFileData%DLL_PROPSFILE)) then + allocate(DstInputFileData%DLL_PROPSFILE(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%DLL_PROPSFILE.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%DLL_PROPSFILE = SrcInputFileData%DLL_PROPSFILE + end if + if (allocated(SrcInputFileData%DLL_LDISPFILE)) then + LB(1:1) = lbound(SrcInputFileData%DLL_LDISPFILE) + UB(1:1) = ubound(SrcInputFileData%DLL_LDISPFILE) + if (.not. allocated(DstInputFileData%DLL_LDISPFILE)) then + allocate(DstInputFileData%DLL_LDISPFILE(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputFileData%DLL_LDISPFILE.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInputFileData%DLL_LDISPFILE = SrcInputFileData%DLL_LDISPFILE + end if + DstInputFileData%SumPrint = SrcInputFileData%SumPrint + DstInputFileData%NumOuts = SrcInputFileData%NumOuts + DstInputFileData%DLL_OnlyStiff = SrcInputFileData%DLL_OnlyStiff +end subroutine + +subroutine SlD_DestroyInputFile(InputFileData, ErrStat, ErrMsg) + type(SlD_InputFile), intent(inout) :: InputFileData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_DestroyInputFile' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(InputFileData%OutList)) then + deallocate(InputFileData%OutList) + end if + if (allocated(InputFileData%SD_locations)) then + deallocate(InputFileData%SD_locations) + end if + if (allocated(InputFileData%Stiffness)) then + deallocate(InputFileData%Stiffness) + end if + if (allocated(InputFileData%Damping)) then + deallocate(InputFileData%Damping) + end if + if (allocated(InputFileData%PY_locations)) then + deallocate(InputFileData%PY_locations) + end if + if (allocated(InputFileData%PY_inputFile)) then + deallocate(InputFileData%PY_inputFile) + end if + if (allocated(InputFileData%DLL_locations)) then + deallocate(InputFileData%DLL_locations) + end if + if (allocated(InputFileData%DLL_PROPSFILE)) then + deallocate(InputFileData%DLL_PROPSFILE) + end if + if (allocated(InputFileData%DLL_LDISPFILE)) then + deallocate(InputFileData%DLL_LDISPFILE) + end if +end subroutine + +subroutine SlD_PackInputFile(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_InputFile), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackInputFile' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%EchoFlag) + call RegPackAlloc(RF, InData%OutList) + call RegPack(RF, InData%DT) + call RegPack(RF, InData%CalcOption) + call RegPackAlloc(RF, InData%SD_locations) + call RegPackAlloc(RF, InData%Stiffness) + call RegPackAlloc(RF, InData%Damping) + call RegPack(RF, InData%PY_numpoints) + call RegPackAlloc(RF, InData%PY_locations) + call RegPackAlloc(RF, InData%PY_inputFile) + call RegPack(RF, InData%DLL_model) + call RegPack(RF, InData%DLL_modelChr) + call RegPack(RF, InData%DLL_FileName) + call RegPack(RF, InData%DLL_ProcName) + call RegPack(RF, InData%DLL_numpoints) + call RegPackAlloc(RF, InData%DLL_locations) + call RegPackAlloc(RF, InData%DLL_PROPSFILE) + call RegPackAlloc(RF, InData%DLL_LDISPFILE) + call RegPack(RF, InData%SumPrint) + call RegPack(RF, InData%NumOuts) + call RegPack(RF, InData%DLL_OnlyStiff) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackInputFile(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_InputFile), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackInputFile' + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%EchoFlag); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%OutList); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CalcOption); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%SD_locations); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Stiffness); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Damping); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PY_numpoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PY_locations); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%PY_inputFile); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DLL_model); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DLL_modelChr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DLL_FileName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DLL_ProcName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DLL_numpoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%DLL_locations); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%DLL_PROPSFILE); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%DLL_LDISPFILE); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SumPrint); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DLL_OnlyStiff); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) + type(SlD_InitInputType), intent(in) :: SrcInitInputData + type(SlD_InitInputType), intent(inout) :: DstInitInputData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_CopyInitInput' + ErrStat = ErrID_None + ErrMsg = '' + DstInitInputData%InputFile = SrcInitInputData%InputFile + DstInitInputData%RootName = SrcInitInputData%RootName + DstInitInputData%Linearize = SrcInitInputData%Linearize + DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth + DstInitInputData%SlDNonLinearForcePortionOnly = SrcInitInputData%SlDNonLinearForcePortionOnly +end subroutine + +subroutine SlD_DestroyInitInput(InitInputData, ErrStat, ErrMsg) + type(SlD_InitInputType), intent(inout) :: InitInputData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_DestroyInitInput' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine SlD_PackInitInput(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_InitInputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackInitInput' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%InputFile) + call RegPack(RF, InData%RootName) + call RegPack(RF, InData%Linearize) + call RegPack(RF, InData%WtrDpth) + call RegPack(RF, InData%SlDNonLinearForcePortionOnly) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackInitInput(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_InitInputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackInitInput' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%InputFile); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SlDNonLinearForcePortionOnly); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg) + type(SlD_InitOutputType), intent(in) :: SrcInitOutputData + type(SlD_InitOutputType), intent(inout) :: DstInitOutputData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_CopyInitOutput' + ErrStat = ErrID_None + ErrMsg = '' + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcInitOutputData%WriteOutputHdr)) then + LB(1:1) = lbound(SrcInitOutputData%WriteOutputHdr) + UB(1:1) = ubound(SrcInitOutputData%WriteOutputHdr) + if (.not. allocated(DstInitOutputData%WriteOutputHdr)) then + allocate(DstInitOutputData%WriteOutputHdr(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WriteOutputHdr.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInitOutputData%WriteOutputHdr = SrcInitOutputData%WriteOutputHdr + end if + if (allocated(SrcInitOutputData%WriteOutputUnt)) then + LB(1:1) = lbound(SrcInitOutputData%WriteOutputUnt) + UB(1:1) = ubound(SrcInitOutputData%WriteOutputUnt) + if (.not. allocated(DstInitOutputData%WriteOutputUnt)) then + allocate(DstInitOutputData%WriteOutputUnt(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%WriteOutputUnt.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInitOutputData%WriteOutputUnt = SrcInitOutputData%WriteOutputUnt + end if + call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcInitOutputData%SoilStiffness)) then + LB(1:3) = lbound(SrcInitOutputData%SoilStiffness) + UB(1:3) = ubound(SrcInitOutputData%SoilStiffness) + if (.not. allocated(DstInitOutputData%SoilStiffness)) then + allocate(DstInitOutputData%SoilStiffness(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%SoilStiffness.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInitOutputData%SoilStiffness = SrcInitOutputData%SoilStiffness + end if +end subroutine + +subroutine SlD_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) + type(SlD_InitOutputType), intent(inout) :: InitOutputData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_DestroyInitOutput' + ErrStat = ErrID_None + ErrMsg = '' + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InitOutputData%WriteOutputHdr)) then + deallocate(InitOutputData%WriteOutputHdr) + end if + if (allocated(InitOutputData%WriteOutputUnt)) then + deallocate(InitOutputData%WriteOutputUnt) + end if + call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InitOutputData%SoilStiffness)) then + deallocate(InitOutputData%SoilStiffness) + end if +end subroutine + +subroutine SlD_PackInitOutput(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_InitOutputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackInitOutput' + if (RF%ErrStat >= AbortErrLev) return + call NWTC_Library_PackModVarsType(RF, InData%Vars) + call RegPackAlloc(RF, InData%WriteOutputHdr) + call RegPackAlloc(RF, InData%WriteOutputUnt) + call NWTC_Library_PackProgDesc(RF, InData%Ver) + call RegPackAlloc(RF, InData%SoilStiffness) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackInitOutput(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_InitOutputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackInitOutput' + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars + call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver + call RegUnpackAlloc(RF, OutData%SoilStiffness); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg) + type(SlD_ContinuousStateType), intent(in) :: SrcContStateData + type(SlD_ContinuousStateType), intent(inout) :: DstContStateData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_CopyContState' + ErrStat = ErrID_None + ErrMsg = '' + DstContStateData%DummyContState = SrcContStateData%DummyContState +end subroutine + +subroutine SlD_DestroyContState(ContStateData, ErrStat, ErrMsg) + type(SlD_ContinuousStateType), intent(inout) :: ContStateData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_DestroyContState' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine SlD_PackContState(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_ContinuousStateType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackContState' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%DummyContState) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackContState(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_ContinuousStateType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackContState' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%DummyContState); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_CopyDiscState(SrcDiscStateData, DstDiscStateData, CtrlCode, ErrStat, ErrMsg) + type(SlD_DiscreteStateType), intent(in) :: SrcDiscStateData + type(SlD_DiscreteStateType), intent(inout) :: DstDiscStateData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_CopyDiscState' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcDiscStateData%dll_states)) then + LB(1:1) = lbound(SrcDiscStateData%dll_states) + UB(1:1) = ubound(SrcDiscStateData%dll_states) + if (.not. allocated(DstDiscStateData%dll_states)) then + allocate(DstDiscStateData%dll_states(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstDiscStateData%dll_states.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SlD_CopyREDWINdllStates(SrcDiscStateData%dll_states(i1), DstDiscStateData%dll_states(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if +end subroutine + +subroutine SlD_DestroyDiscState(DiscStateData, ErrStat, ErrMsg) + type(SlD_DiscreteStateType), intent(inout) :: DiscStateData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_DestroyDiscState' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(DiscStateData%dll_states)) then + LB(1:1) = lbound(DiscStateData%dll_states) + UB(1:1) = ubound(DiscStateData%dll_states) + do i1 = LB(1), UB(1) + call SlD_DestroyREDWINdllStates(DiscStateData%dll_states(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(DiscStateData%dll_states) + end if +end subroutine + +subroutine SlD_PackDiscState(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_DiscreteStateType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackDiscState' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%dll_states)) + if (allocated(InData%dll_states)) then + call RegPackBounds(RF, 1, lbound(InData%dll_states), ubound(InData%dll_states)) + LB(1:1) = lbound(InData%dll_states) + UB(1:1) = ubound(InData%dll_states) + do i1 = LB(1), UB(1) + call SlD_PackREDWINdllStates(RF, InData%dll_states(i1)) + end do + end if + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackDiscState(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_DiscreteStateType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackDiscState' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%dll_states)) deallocate(OutData%dll_states) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%dll_states(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%dll_states.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SlD_UnpackREDWINdllStates(RF, OutData%dll_states(i1)) ! dll_states + end do + end if +end subroutine + +subroutine SlD_CopyConstrState(SrcConstrStateData, DstConstrStateData, CtrlCode, ErrStat, ErrMsg) + type(SlD_ConstraintStateType), intent(in) :: SrcConstrStateData + type(SlD_ConstraintStateType), intent(inout) :: DstConstrStateData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_CopyConstrState' + ErrStat = ErrID_None + ErrMsg = '' + DstConstrStateData%DummyConstrState = SrcConstrStateData%DummyConstrState +end subroutine + +subroutine SlD_DestroyConstrState(ConstrStateData, ErrStat, ErrMsg) + type(SlD_ConstraintStateType), intent(inout) :: ConstrStateData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_DestroyConstrState' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine SlD_PackConstrState(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_ConstraintStateType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackConstrState' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%DummyConstrState) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackConstrState(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_ConstraintStateType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackConstrState' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%DummyConstrState); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_CopyOtherState(SrcOtherStateData, DstOtherStateData, CtrlCode, ErrStat, ErrMsg) + type(SlD_OtherStateType), intent(in) :: SrcOtherStateData + type(SlD_OtherStateType), intent(inout) :: DstOtherStateData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_CopyOtherState' + ErrStat = ErrID_None + ErrMsg = '' + DstOtherStateData%DummyOtherState = SrcOtherStateData%DummyOtherState +end subroutine + +subroutine SlD_DestroyOtherState(OtherStateData, ErrStat, ErrMsg) + type(SlD_OtherStateType), intent(inout) :: OtherStateData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + character(*), parameter :: RoutineName = 'SlD_DestroyOtherState' + ErrStat = ErrID_None + ErrMsg = '' +end subroutine + +subroutine SlD_PackOtherState(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_OtherStateType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackOtherState' + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%DummyOtherState) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackOtherState(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_OtherStateType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackOtherState' + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%DummyOtherState); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) + type(SlD_ParameterType), intent(in) :: SrcParamData + type(SlD_ParameterType), intent(inout) :: DstParamData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_CopyParam' + ErrStat = ErrID_None + ErrMsg = '' + DstParamData%DT = SrcParamData%DT + DstParamData%DLL_Trgt = SrcParamData%DLL_Trgt + DstParamData%DLL_DT = SrcParamData%DLL_DT + DstParamData%RootName = SrcParamData%RootName + DstParamData%UseREDWINinterface = SrcParamData%UseREDWINinterface + DstParamData%RootFileName = SrcParamData%RootFileName + DstParamData%EchoFileName = SrcParamData%EchoFileName + DstParamData%SumFileName = SrcParamData%SumFileName + DstParamData%DLL_model = SrcParamData%DLL_model + DstParamData%CalcOption = SrcParamData%CalcOption + if (allocated(SrcParamData%OutParam)) then + LB(1:1) = lbound(SrcParamData%OutParam) + UB(1:1) = ubound(SrcParamData%OutParam) + if (.not. allocated(DstParamData%OutParam)) then + allocate(DstParamData%OutParam(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%OutParam.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call NWTC_Library_CopyOutParmType(SrcParamData%OutParam(i1), DstParamData%OutParam(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + DstParamData%NumOuts = SrcParamData%NumOuts + DstParamData%NumPoints = SrcParamData%NumPoints + DstParamData%WtrDepth = SrcParamData%WtrDepth + if (allocated(SrcParamData%Stiffness)) then + LB(1:3) = lbound(SrcParamData%Stiffness) + UB(1:3) = ubound(SrcParamData%Stiffness) + if (.not. allocated(DstParamData%Stiffness)) then + allocate(DstParamData%Stiffness(LB(1):UB(1),LB(2):UB(2),LB(3):UB(3)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Stiffness.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstParamData%Stiffness = SrcParamData%Stiffness + end if + DstParamData%DLL_OnlyStiff = SrcParamData%DLL_OnlyStiff + DstParamData%SlDNonLinearForcePortionOnly = SrcParamData%SlDNonLinearForcePortionOnly +end subroutine + +subroutine SlD_DestroyParam(ParamData, ErrStat, ErrMsg) + type(SlD_ParameterType), intent(inout) :: ParamData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_DestroyParam' + ErrStat = ErrID_None + ErrMsg = '' + call FreeDynamicLib( ParamData%DLL_Trgt, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(ParamData%OutParam)) then + LB(1:1) = lbound(ParamData%OutParam) + UB(1:1) = ubound(ParamData%OutParam) + do i1 = LB(1), UB(1) + call NWTC_Library_DestroyOutParmType(ParamData%OutParam(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(ParamData%OutParam) + end if + if (allocated(ParamData%Stiffness)) then + deallocate(ParamData%Stiffness) + end if +end subroutine + +subroutine SlD_PackParam(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_ParameterType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackParam' + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%DT) + call DLLTypePack(RF, InData%DLL_Trgt) + call RegPack(RF, InData%DLL_DT) + call RegPack(RF, InData%RootName) + call RegPack(RF, InData%UseREDWINinterface) + call RegPack(RF, InData%RootFileName) + call RegPack(RF, InData%EchoFileName) + call RegPack(RF, InData%SumFileName) + call RegPack(RF, InData%DLL_model) + call RegPack(RF, InData%CalcOption) + call RegPack(RF, allocated(InData%OutParam)) + if (allocated(InData%OutParam)) then + call RegPackBounds(RF, 1, lbound(InData%OutParam), ubound(InData%OutParam)) + LB(1:1) = lbound(InData%OutParam) + UB(1:1) = ubound(InData%OutParam) + do i1 = LB(1), UB(1) + call NWTC_Library_PackOutParmType(RF, InData%OutParam(i1)) + end do + end if + call RegPack(RF, InData%NumOuts) + call RegPack(RF, InData%NumPoints) + call RegPack(RF, InData%WtrDepth) + call RegPackAlloc(RF, InData%Stiffness) + call RegPack(RF, InData%DLL_OnlyStiff) + call RegPack(RF, InData%SlDNonLinearForcePortionOnly) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackParam(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_ParameterType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackParam' + integer(B4Ki) :: i1, i2, i3 + integer(B4Ki) :: LB(3), UB(3) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return + call DLLTypeUnpack(RF, OutData%DLL_Trgt) ! DLL_Trgt + call RegUnpack(RF, OutData%DLL_DT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%UseREDWINinterface); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RootFileName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%EchoFileName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SumFileName); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DLL_model); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%CalcOption); if (RegCheckErr(RF, RoutineName)) return + if (allocated(OutData%OutParam)) deallocate(OutData%OutParam) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%OutParam(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%OutParam.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call NWTC_Library_UnpackOutParmType(RF, OutData%OutParam(i1)) ! OutParam + end do + end if + call RegUnpack(RF, OutData%NumOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumPoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%WtrDepth); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Stiffness); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%DLL_OnlyStiff); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SlDNonLinearForcePortionOnly); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) + type(SlD_InputType), intent(inout) :: SrcInputData + type(SlD_InputType), intent(inout) :: DstInputData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_CopyInput' + ErrStat = ErrID_None + ErrMsg = '' + call MeshCopy(SrcInputData%SoilMesh, DstInputData%SoilMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine SlD_DestroyInput(InputData, ErrStat, ErrMsg) + type(SlD_InputType), intent(inout) :: InputData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_DestroyInput' + ErrStat = ErrID_None + ErrMsg = '' + call MeshDestroy( InputData%SoilMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine SlD_PackInput(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_InputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackInput' + if (RF%ErrStat >= AbortErrLev) return + call MeshPack(RF, InData%SoilMesh) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackInput(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_InputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackInput' + if (RF%ErrStat /= ErrID_None) return + call MeshUnpack(RF, OutData%SoilMesh) ! SoilMesh +end subroutine + +subroutine SlD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg) + type(SlD_OutputType), intent(inout) :: SrcOutputData + type(SlD_OutputType), intent(inout) :: DstOutputData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_CopyOutput' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcOutputData%WriteOutput)) then + LB(1:1) = lbound(SrcOutputData%WriteOutput) + UB(1:1) = ubound(SrcOutputData%WriteOutput) + if (.not. allocated(DstOutputData%WriteOutput)) then + allocate(DstOutputData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%WriteOutput = SrcOutputData%WriteOutput + end if + call MeshCopy(SrcOutputData%SoilMesh, DstOutputData%SoilMesh, CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine SlD_DestroyOutput(OutputData, ErrStat, ErrMsg) + type(SlD_OutputType), intent(inout) :: OutputData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_DestroyOutput' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(OutputData%WriteOutput)) then + deallocate(OutputData%WriteOutput) + end if + call MeshDestroy( OutputData%SoilMesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine SlD_PackOutput(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_OutputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackOutput' + if (RF%ErrStat >= AbortErrLev) return + call RegPackAlloc(RF, InData%WriteOutput) + call MeshPack(RF, InData%SoilMesh) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackOutput(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_OutputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackOutput' + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return + call MeshUnpack(RF, OutData%SoilMesh) ! SoilMesh +end subroutine + +subroutine SlD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(SlD_MiscVarType), intent(inout) :: SrcMiscData + type(SlD_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(SrcMiscData%dll_data)) then + LB(1:1) = lbound(SrcMiscData%dll_data) + UB(1:1) = ubound(SrcMiscData%dll_data) + if (.not. allocated(DstMiscData%dll_data)) then + allocate(DstMiscData%dll_data(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%dll_data.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call SlD_CopyREDWINdllType(SrcMiscData%dll_data(i1), DstMiscData%dll_data(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if + if (allocated(SrcMiscData%ForceTotal)) then + LB(1:2) = lbound(SrcMiscData%ForceTotal) + UB(1:2) = ubound(SrcMiscData%ForceTotal) + if (.not. allocated(DstMiscData%ForceTotal)) then + allocate(DstMiscData%ForceTotal(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%ForceTotal.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%ForceTotal = SrcMiscData%ForceTotal + end if + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SlD_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SlD_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SlD_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SlD_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return +end subroutine + +subroutine SlD_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(SlD_MiscVarType), intent(inout) :: MiscData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SlD_DestroyMisc' + ErrStat = ErrID_None + ErrMsg = '' + if (allocated(MiscData%dll_data)) then + LB(1:1) = lbound(MiscData%dll_data) + UB(1:1) = ubound(MiscData%dll_data) + do i1 = LB(1), UB(1) + call SlD_DestroyREDWINdllType(MiscData%dll_data(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(MiscData%dll_data) + end if + if (allocated(MiscData%ForceTotal)) then + deallocate(MiscData%ForceTotal) + end if + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SlD_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) +end subroutine + +subroutine SlD_PackMisc(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SlD_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SlD_PackMisc' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, allocated(InData%dll_data)) + if (allocated(InData%dll_data)) then + call RegPackBounds(RF, 1, lbound(InData%dll_data), ubound(InData%dll_data)) + LB(1:1) = lbound(InData%dll_data) + UB(1:1) = ubound(InData%dll_data) + do i1 = LB(1), UB(1) + call SlD_PackREDWINdllType(RF, InData%dll_data(i1)) + end do + end if + call RegPackAlloc(RF, InData%ForceTotal) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call SlD_PackContState(RF, InData%x_perturb) + call SlD_PackContState(RF, InData%dxdt_lin) + call SlD_PackInput(RF, InData%u_perturb) + call SlD_PackOutput(RF, InData%y_lin) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SlD_UnPackMisc(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SlD_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SlD_UnPackMisc' + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + if (allocated(OutData%dll_data)) deallocate(OutData%dll_data) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%dll_data(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%dll_data.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call SlD_UnpackREDWINdllType(RF, OutData%dll_data(i1)) ! dll_data + end do + end if + call RegUnpackAlloc(RF, OutData%ForceTotal); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call SlD_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call SlD_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call SlD_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call SlD_UnpackOutput(RF, OutData%y_lin) ! y_lin +end subroutine + +subroutine SlD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) + ! + ! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time + ! values of u (which has values associated with times in t). Order of the interpolation is given by the size of u + ! + ! expressions below based on either + ! + ! f(t) = a + ! f(t) = a + b * t, or + ! f(t) = a + b * t + c * t**2 + ! + ! where a, b and c are determined as the solution to + ! f(t1) = u1, f(t2) = u2, f(t3) = u3 (as appropriate) + ! + !---------------------------------------------------------------------------------------------------------------------------------- + + type(SlD_InputType), intent(inout) :: u(:) ! Input at t1 > t2 > t3 + real(DbKi), intent(in ) :: t(:) ! Times associated with the Inputs + type(SlD_InputType), intent(inout) :: u_out ! Input at tin_out + real(DbKi), intent(in ) :: t_out ! time to be extrap/interp'd to + integer(IntKi), intent( out) :: ErrStat ! Error status of the operation + character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + integer(IntKi) :: order ! order of polynomial fit (max 2) + integer(IntKi) :: ErrStat2 ! local errors + character(ErrMsgLen) :: ErrMsg2 ! local errors + character(*), PARAMETER :: RoutineName = 'SlD_Input_ExtrapInterp' + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = '' + if (size(t) /= size(u)) then + call SetErrStat(ErrID_Fatal, 'size(t) must equal size(u)', ErrStat, ErrMsg, RoutineName) + return + endif + order = size(u) - 1 + select case (order) + case (0) + call SlD_CopyInput(u(1), u_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + case (1) + call SlD_Input_ExtrapInterp1(u(1), u(2), t, u_out, t_out, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + case (2) + call SlD_Input_ExtrapInterp2(u(1), u(2), u(3), t, u_out, t_out, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + case default + call SetErrStat(ErrID_Fatal, 'size(u) must be less than 4 (order must be less than 3).', ErrStat, ErrMsg, RoutineName) + return + end select +end subroutine + +SUBROUTINE SlD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = u1, f(t2) = u2 +! +!.................................................................................................................................. + + TYPE(SlD_InputType), INTENT(INOUT) :: u1 ! Input at t1 > t2 + TYPE(SlD_InputType), INTENT(INOUT) :: u2 ! Input at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Inputs + TYPE(SlD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Input_ExtrapInterp1' + REAL(DbKi) :: a1, a2 ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = '' + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF (EqualRealNos(t(1), t(2))) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg, RoutineName) + RETURN + END IF + + ! Calculate weighting factors from Lagrange polynomial + a1 = -(t_out - t(2))/t(2) + a2 = t_out/t(2) + + CALL MeshExtrapInterp1(u1%SoilMesh, u2%SoilMesh, tin, u_out%SoilMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) +END SUBROUTINE + +SUBROUTINE SlD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Input u_out at time t_out, from previous/future time +! values of u (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = u1, f(t2) = u2, f(t3) = u3 +! +!.................................................................................................................................. + + TYPE(SlD_InputType), INTENT(INOUT) :: u1 ! Input at t1 > t2 > t3 + TYPE(SlD_InputType), INTENT(INOUT) :: u2 ! Input at t2 > t3 + TYPE(SlD_InputType), INTENT(INOUT) :: u3 ! Input at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Inputs + TYPE(SlD_InputType), INTENT(INOUT) :: u_out ! Input at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Inputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: a1,a2,a3 ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Input_ExtrapInterp2' + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = '' + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ! Calculate Lagrange polynomial coefficients + a1 = (t_out - t(2))*(t_out - t(3))/((t(1) - t(2))*(t(1) - t(3))) + a2 = (t_out - t(1))*(t_out - t(3))/((t(2) - t(1))*(t(2) - t(3))) + a3 = (t_out - t(1))*(t_out - t(2))/((t(3) - t(1))*(t(3) - t(2))) + CALL MeshExtrapInterp2(u1%SoilMesh, u2%SoilMesh, u3%SoilMesh, tin, u_out%SoilMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) +END SUBROUTINE + +subroutine SlD_Output_ExtrapInterp(y, t, y_out, t_out, ErrStat, ErrMsg) + ! + ! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time + ! values of y (which has values associated with times in t). Order of the interpolation is given by the size of y + ! + ! expressions below based on either + ! + ! f(t) = a + ! f(t) = a + b * t, or + ! f(t) = a + b * t + c * t**2 + ! + ! where a, b and c are determined as the solution to + ! f(t1) = y1, f(t2) = y2, f(t3) = y3 (as appropriate) + ! + !---------------------------------------------------------------------------------------------------------------------------------- + + type(SlD_OutputType), intent(inout) :: y(:) ! Output at t1 > t2 > t3 + real(DbKi), intent(in ) :: t(:) ! Times associated with the Outputs + type(SlD_OutputType), intent(inout) :: y_out ! Output at tin_out + real(DbKi), intent(in ) :: t_out ! time to be extrap/interp'd to + integer(IntKi), intent( out) :: ErrStat ! Error status of the operation + character(*), intent( out) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + integer(IntKi) :: order ! order of polynomial fit (max 2) + integer(IntKi) :: ErrStat2 ! local errors + character(ErrMsgLen) :: ErrMsg2 ! local errors + character(*), PARAMETER :: RoutineName = 'SlD_Output_ExtrapInterp' + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = '' + if (size(t) /= size(y)) then + call SetErrStat(ErrID_Fatal, 'size(t) must equal size(y)', ErrStat, ErrMsg, RoutineName) + return + endif + order = size(y) - 1 + select case (order) + case (0) + call SlD_CopyOutput(y(1), y_out, MESH_UPDATECOPY, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + case (1) + call SlD_Output_ExtrapInterp1(y(1), y(2), t, y_out, t_out, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + case (2) + call SlD_Output_ExtrapInterp2(y(1), y(2), y(3), t, y_out, t_out, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + case default + call SetErrStat(ErrID_Fatal, 'size(y) must be less than 4 (order must be less than 3).', ErrStat, ErrMsg, RoutineName) + return + end select +end subroutine + +SUBROUTINE SlD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 1. +! +! f(t) = a + b * t, or +! +! where a and b are determined as the solution to +! f(t1) = y1, f(t2) = y2 +! +!.................................................................................................................................. + + TYPE(SlD_OutputType), INTENT(INOUT) :: y1 ! Output at t1 > t2 + TYPE(SlD_OutputType), INTENT(INOUT) :: y2 ! Output at t2 + REAL(DbKi), INTENT(IN ) :: tin(2) ! Times associated with the Outputs + TYPE(SlD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(2) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Output_ExtrapInterp1' + REAL(DbKi) :: a1, a2 ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = '' + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF (EqualRealNos(t(1), t(2))) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg, RoutineName) + RETURN + END IF + + ! Calculate weighting factors from Lagrange polynomial + a1 = -(t_out - t(2))/t(2) + a2 = t_out/t(2) + + IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN + y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + END IF ! check if allocated + CALL MeshExtrapInterp1(y1%SoilMesh, y2%SoilMesh, tin, y_out%SoilMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) +END SUBROUTINE + +SUBROUTINE SlD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, ErrMsg ) +! +! This subroutine calculates a extrapolated (or interpolated) Output y_out at time t_out, from previous/future time +! values of y (which has values associated with times in t). Order of the interpolation is 2. +! +! expressions below based on either +! +! f(t) = a + b * t + c * t**2 +! +! where a, b and c are determined as the solution to +! f(t1) = y1, f(t2) = y2, f(t3) = y3 +! +!.................................................................................................................................. + + TYPE(SlD_OutputType), INTENT(INOUT) :: y1 ! Output at t1 > t2 > t3 + TYPE(SlD_OutputType), INTENT(INOUT) :: y2 ! Output at t2 > t3 + TYPE(SlD_OutputType), INTENT(INOUT) :: y3 ! Output at t3 + REAL(DbKi), INTENT(IN ) :: tin(3) ! Times associated with the Outputs + TYPE(SlD_OutputType), INTENT(INOUT) :: y_out ! Output at tin_out + REAL(DbKi), INTENT(IN ) :: tin_out ! time to be extrap/interp'd to + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + ! local variables + REAL(DbKi) :: t(3) ! Times associated with the Outputs + REAL(DbKi) :: t_out ! Time to which to be extrap/interpd + INTEGER(IntKi) :: order ! order of polynomial fit (max 2) + REAL(DbKi) :: a1,a2,a3 ! temporary for extrapolation/interpolation + INTEGER(IntKi) :: ErrStat2 ! local errors + CHARACTER(ErrMsgLen) :: ErrMsg2 ! local errors + CHARACTER(*), PARAMETER :: RoutineName = 'SlD_Output_ExtrapInterp2' + INTEGER :: i01 ! dim1 level 0 counter variable for arrays of ddts + INTEGER :: i1 ! dim1 counter variable for arrays + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = '' + ! we'll subtract a constant from the times to resolve some + ! numerical issues when t gets large (and to simplify the equations) + t = tin - tin(1) + t_out = tin_out - tin(1) + + IF ( EqualRealNos( t(1), t(2) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(2) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(2), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(2) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + ELSE IF ( EqualRealNos( t(1), t(3) ) ) THEN + CALL SetErrStat(ErrID_Fatal, 't(1) must not equal t(3) to avoid a division-by-zero error.', ErrStat, ErrMsg,RoutineName) + RETURN + END IF + + ! Calculate Lagrange polynomial coefficients + a1 = (t_out - t(2))*(t_out - t(3))/((t(1) - t(2))*(t(1) - t(3))) + a2 = (t_out - t(1))*(t_out - t(3))/((t(2) - t(1))*(t(2) - t(3))) + a3 = (t_out - t(1))*(t_out - t(2))/((t(3) - t(1))*(t(3) - t(2))) + IF (ALLOCATED(y_out%WriteOutput) .AND. ALLOCATED(y1%WriteOutput)) THEN + y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput + END IF ! check if allocated + CALL MeshExtrapInterp2(y1%SoilMesh, y2%SoilMesh, y3%SoilMesh, tin, y_out%SoilMesh, tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) +END SUBROUTINE + +function SlD_InputMeshPointer(u, DL) result(Mesh) + type(SlD_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (SlD_u_SoilMesh) + Mesh => u%SoilMesh + end select +end function + +function SlD_OutputMeshPointer(y, DL) result(Mesh) + type(SlD_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (SlD_y_SoilMesh) + Mesh => y%SoilMesh + end select +end function + +subroutine SlD_VarsPackContState(Vars, x, ValAry) + type(SlD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SlD_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SlD_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SlD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SlD_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SlD_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SlD_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SlD_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine SlD_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SlD_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SlD_x_DummyContState) + x%DummyContState = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function SlD_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SlD_x_DummyContState) + Name = "x%DummyContState" + case default + Name = "Unknown Field" + end select +end function + +subroutine SlD_VarsPackContStateDeriv(Vars, x, ValAry) + type(SlD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SlD_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SlD_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SlD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SlD_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SlD_VarsPackInput(Vars, u, ValAry) + type(SlD_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SlD_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine SlD_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(SlD_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SlD_u_SoilMesh) + call MV_PackMesh(V, u%SoilMesh, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SlD_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SlD_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SlD_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine SlD_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SlD_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SlD_u_SoilMesh) + call MV_UnpackMesh(V, ValAry, u%SoilMesh) ! Mesh + end select + end associate +end subroutine + +function SlD_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SlD_u_SoilMesh) + Name = "u%SoilMesh" + case default + Name = "Unknown Field" + end select +end function + +subroutine SlD_VarsPackOutput(Vars, y, ValAry) + type(SlD_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SlD_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine SlD_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(SlD_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SlD_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case (SlD_y_SoilMesh) + call MV_PackMesh(V, y%SoilMesh, ValAry) ! Mesh + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SlD_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SlD_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SlD_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine SlD_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SlD_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SlD_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SlD_y_SoilMesh) + call MV_UnpackMesh(V, ValAry, y%SoilMesh) ! Mesh + end select + end associate +end subroutine + +function SlD_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SlD_y_WriteOutput) + Name = "y%WriteOutput" + case (SlD_y_SoilMesh) + Name = "y%SoilMesh" + case default + Name = "Unknown Field" + end select +end function + +END MODULE SoilDyn_Types + +!ENDOFREGISTRYGENERATEDFILE diff --git a/modules/soildyn/src/driver/SoilDyn_Driver.f90 b/modules/soildyn/src/driver/SoilDyn_Driver.f90 new file mode 100644 index 0000000000..9f917c55b9 --- /dev/null +++ b/modules/soildyn/src/driver/SoilDyn_Driver.f90 @@ -0,0 +1,370 @@ +!********************************************************************************************************************************** +!> ## SoilDyn_DriverCode: This code tests the SoilDyn module +!!.................................................................................................................................. +!! LICENSING +!! Copyright (C) 2012, 2015 National Renewable Energy Laboratory +!! +!! This file is part of SoilDyn. +!! +!! Licensed under the Apache License, Version 2.0 (the "License"); +!! you may not use this file except in compliance with the License. +!! You may obtain a copy of the License at +!! +!! http://www.apache.org/licenses/LICENSE-2.0 +!! +!! Unless required by applicable law or agreed to in writing, software +!! distributed under the License is distributed on an "AS IS" BASIS, +!! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +!! See the License for the specific language governing permissions and +!! limitations under the License. +!********************************************************************************************************************************** +PROGRAM SoilDyn_Driver + + USE NWTC_Library + USE VersionInfo + USE SoilDyn + USE SoilDyn_Types + USE SoilDyn_Driver_Subs + USE SoilDyn_Driver_Types + USE REDWINinterface, only: REDWINinterface_GetStiffMatrix + + IMPLICIT NONE + + TYPE( ProgDesc ), PARAMETER :: ProgInfo = ProgDesc("SlD_Driver","","") + INTEGER(IntKi) :: SlDDriver_Verbose = 5 ! Verbose level. 0 = none, 5 = some, 10 = lots + + + + integer(IntKi), parameter :: NumInp = 1 !< Number of inputs sent to SoilDyn_UpdateStates + + ! Program variables + real(DbKi) :: Time !< Variable for storing time, in seconds + real(DbKi) :: TimeInterval !< Interval between time steps, in seconds + real(DbKi) :: TStart !< Time to start + real(DbKi) :: TMax !< Maximum time if found by default + integer(IntKi) :: NumTSteps !< number of timesteps + logical :: TimeIntervalFound !< Interval between time steps, in seconds + real(DbKi) :: InputTime(NumInp) !< Variable for storing time associated with inputs, in seconds + real(R8Ki), allocatable :: DisplacementList(:,:) !< List of displacements and times to apply {idx 1 = time step, idx 2 = [T, dX, dY, dZ, dTheta_X, dTheta_Y, dTheta_Z]} + + type(SlD_InitInputType) :: InitInData !< Input data for initialization + type(SlD_InitOutputType) :: InitOutData !< Output data from initialization + + type(SlD_ContinuousStateType) :: x !< Continuous states + type(SlD_DiscreteStateType) :: xd !< Discrete states + type(SlD_ConstraintStateType) :: z !< Constraint states + type(SlD_ConstraintStateType) :: Z_residual !< Residual of the constraint state functions (Z) + type(SlD_OtherStateType) :: OtherState !< Other states + type(SlD_MiscVarType) :: misc !< Optimization variables + + type(SlD_ParameterType) :: p !< Parameters + type(SlD_InputType) :: u(NumInp) !< System inputs + type(SlD_OutputType) :: y !< System outputs + + ! Local variables for this code + TYPE(SlDDriver_Flags) :: CLSettingsFlags ! Flags indicating which command line arguments were specified + TYPE(SlDDriver_Settings) :: CLSettings ! Command line arguments passed in + TYPE(SlDDriver_Flags) :: SettingsFlags ! Flags indicating which settings were specified (includes CL and ipt file) + TYPE(SlDDriver_Settings) :: Settings ! Driver settings + REAL(DbKi) :: Timer(1:2) ! Keep track of how long this takes to run + + ! Data transfer + real(R8Ki) :: Force(6) + real(R8Ki) :: Displacement(6) + real(R8Ki) :: StiffMatrix(6,6) + real(R8Ki) :: Theta(3) + + INTEGER(IntKi) :: n !< Loop counter (for time step) + integer(IntKi) :: i !< generic loop counter + integer(IntKi) :: DimIdx !< Index of current dimension + integer(IntKi) :: TmpIdx(6) !< Index of last point accessed by dimension + INTEGER(IntKi) :: ErrStat !< Status of error message + CHARACTER(ErrMsgLen) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + CHARACTER(200) :: git_commit ! String containing the current git commit hash + TYPE(ProgDesc), PARAMETER :: version = ProgDesc( 'SoilDyn Driver', '', '' ) ! The version number of this program. + integer(IntKi) :: DvrOut + character(1024) :: OutputFileRootName + + + ! initialize library + call NWTC_Init + call DispNVD(ProgInfo) + DvrOut=-1 ! Set output unit to negative + + ! Display the copyright notice + CALL DispCopyrightLicense( version%Name ) + ! Obtain OpenFAST git commit hash + git_commit = QueryGitVersion() + ! Tell our users what they're running + CALL WrScr( ' Running '//GetNVD( version )//' a part of OpenFAST - '//TRIM(git_Commit)//NewLine//' linked with '//TRIM( GetNVD( NWTC_Ver ))//NewLine ) + + ! Start the timer + call CPU_TIME( Timer(1) ) + + ! Initialize the driver settings to their default values (same as the CL -- command line -- values) + call InitSettingsFlags( ProgInfo, CLSettings, CLSettingsFlags ) + Settings = CLSettings + SettingsFlags = CLSettingsFlags + + ! Parse the input line + call RetrieveArgs( CLSettings, CLSettingsFlags, ErrStat, ErrMsg ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL ProgAbort( ErrMsg ) + ELSEIF ( ErrStat /= 0 ) THEN + CALL WrScr( NewLine//ErrMsg ) + ErrStat = ErrID_None + ENDIF + + ! Check if we are doing verbose error reporting + IF ( CLSettingsFlags%VVerbose ) SlDDriver_Verbose = 10_IntKi + IF ( CLSettingsFlags%Verbose ) SlDDriver_Verbose = 7_IntKi + + ! Verbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrScr('--- Settings from the command line: ---') + CALL printSettings( CLSettingsFlags, CLSettings ) + CALL WrSCr(NewLine) + ENDIF + + ! Verbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrScr('--- Driver settings (before reading driver ipt file): ---') + CALL printSettings( SettingsFlags, Settings ) + CALL WrScr(NewLine) + ENDIF + + + ! Copy the input file information from the CLSettings to the Settings. + ! At this point only one input file type can be set. + IF ( CLSettingsFlags%DvrIptFile ) THEN + SettingsFlags%DvrIptFile = CLSettingsFlags%DvrIptFile + Settings%DvrIptFileName = CLSettings%DvrIptFileName + ELSE + SettingsFlags%SlDIptFile = CLSettingsFlags%SlDIptFile + Settings%SlDIptFileName = CLSettings%SlDIptFileName + ENDIF + + ! If the filename given was not the SlD input file (-ifw option), then it is treated + ! as the driver input file (flag should be set correctly by RetrieveArgs). So, we must + ! open this. + IF ( SettingsFlags%DvrIptFile ) THEN + + ! Read the driver input file + CALL ReadDvrIptFile( CLSettings%DvrIptFileName, SettingsFlags, Settings, ProgInfo, ErrStat, ErrMsg ) + call CheckErr('') + + ! VVerbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrScr(NewLine//'--- Driver settings after reading the driver ipt file: ---') + CALL printSettings( SettingsFlags, Settings ) + CALL WrScr(NewLine) + ENDIF + + ! VVerbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) CALL WrScr('Updating driver settings with command line arguments') + + ELSE + + ! VVerbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) CALL WrScr('No driver input file used. Updating driver settings with command line arguments') + + ENDIF + + ! Since there were no settings picked up from the driver input file, we need to copy over all + ! the CLSettings into the regular Settings. The SettingsFlags%DvrIptFile is a flag indicating + ! if the driver input file read. + CALL UpdateSettingsWithCL( SettingsFlags, Settings, CLSettingsFlags, CLSettings, SettingsFlags%DvrIptFile, ErrStat, ErrMsg ) + call CheckErr('') + + ! Verbose error reporting + IF ( SlDDriver_Verbose >= 10_IntKi ) THEN + CALL WrScr(NewLine//'--- Driver settings after copying over CL settings: ---') + CALL printSettings( SettingsFlags, Settings ) + CALL WrScr(NewLine) + ENDIF + + + !------------------------------------------ + ! Read DisplacementList from InputDispFile + ! NOTE: DiplacementList is arranged for speed in interpolation + ! -- index 1 = time step + ! -- index 2 = [T, dX, dY, dZ, dTheta_X, dTheta_Y, dTheta_Z] + !------------------------------------------ + if ( SettingsFlags%InputDispFile ) then + call ReadInputDispFile( Settings%InputDispFile, DisplacementList, ErrStat, ErrMsg ) + call CheckErr('') + + if ( SlDDriver_Verbose >= 10_IntKi ) call WrScr('Input Displacements given for '//trim(Num2LStr(size(DisplacementList,1)))// & + ' time steps from T = '//trim(Num2LStr(DisplacementList(1,1)))//' to '//trim(Num2LStr(DisplacementList(size(DisplacementList,1),1)))//' seconds.') + endif + + + !------------------------------------------ + ! Logic for timestep and total time for sim. + !------------------------------------------ + if ( SettingsFlags%TStart ) then + TStart = Settings%TStart + else + TStart = 0.0_DbKi + ! TODO: if using the input file, could start at the initial time given there (set the TStart with a "default" input option) + endif + + + + TimeIntervalFound=.true. ! If specified or default value set + ! DT - timestep. If default was specified, then calculate default level. + if ( SettingsFlags%DTdefault ) then + if ( SettingsFlags%InputDispFile ) then + ! Set a value to start with (something larger than any expected DT). + TimeIntervalFound=.false. + TimeInterval=1000.0_DbKi + ! Step through all lines to get smallest DT + do n=min(2,size(DisplacementList,1)),size(DisplacementList,1) ! Start at 2nd point (min to avoid stepping over end for single line files) + TimeInterval=min(TimeInterval, real(DisplacementList(n,1)-DisplacementList(n-1,1), DbKi)) + TimeIntervalFound=.true. + enddo + if (TimeIntervalFound) then + call WrScr('Using smallest DT from data file: '//trim(Num2LStr(TimeInterval))//' seconds.') + else + call WrScr('No time timesteps found in input displacement file. Using only one timestep.') + endif + else + ! set default level. NOTE: the REDWIN dll does not use any form of timestep, so this is merely for bookkeeping. + TimeInterval = 0.01_DbKi + call WrScr('Setting default timestep to '//trim(Num2LStr(TimeInterval))//' seconds.') + endif + endif + + + ! TMax and NumTSteps from input file or from the value specified (specified overrides) + if ( SettingsFlags%NumTimeStepsDefault ) then + if ( SettingsFlags%InputDispFile ) then + TMax = real(DisplacementList(size(DisplacementList,1),1), DbKi) + NumTSteps = ceiling( TMax / TimeInterval ) + else ! Do one timestep + NumTSteps = 1_IntKi + TMax = TimeInterval * NumTSteps + endif + elseif ( SettingsFlags%NumTimeSteps ) then ! Override with number of timesteps + TMax = TimeInterval * Settings%NumTimeSteps + TStart + NumTSteps = Settings%NumTimeSteps + else + NumTSteps = 1_IntKi + TMax = TimeInterval * NumTSteps + endif + + + + ! Routines called in initialization + !............................................................................................................................... + + InitInData%InputFile = Settings%SldIptFileName + InitInData%SlDNonLinearForcePortionOnly = SettingsFlags%SlDNonLinearForcePortionOnly + + ! Initialize the module + CALL SlD_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) + IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary + CALL WrScr( 'After Init: '//ErrMsg ) + if ( ErrStat >= AbortErrLev ) call ProgEnd() + END IF + + ! Set the output file + call GetRoot(Settings%SlDIptFileName,OutputFileRootName) + call Dvr_InitializeOutputFile(DvrOut, InitOutData, OutputFileRootName, ErrStat, ErrMsg) + call CheckErr('Setting output file'); + + ! Destroy initialization data + CALL SlD_DestroyInitInput( InitInData, ErrStat, ErrMsg ) + CALL SlD_DestroyInitOutput( InitOutData, ErrStat, ErrMsg ) + + + ! If requested, get the stiffness matrix + if ( SettingsFlags%StiffMatOut .and. p%CalcOption==Calc_REDWIN ) then + do i=1,size(misc%dll_data) + call WrScr('Stiffness matrix for point '//trim(Num2LStr(i))//' at T = 0') + call WrMatrix( p%Stiffness(1:6,1:6,i), CU, '(ES12.4)', ' StiffMatrix' ) + enddo + endif + + + ! Routines called in loose coupling -- the glue code may implement this in various ways + !............................................................................................................................... + + + TmpIdx(1:6) = 0_IntKi + + DO n = 0,NumTSteps + Time = n*TimeInterval+TStart + InputTime(1) = Time + + ! interpolate into the input data to get the displacement. Set this as u then run + if ( SettingsFlags%InputDispFile ) then + do i=1,u(1)%SoilMesh%NNodes + ! InterpStpReal( X, Xary, Yary, indx, size) + do DimIdx=1,3 + u(1)%SoilMesh%TranslationDisp(DimIdx,i) = InterpStpReal8( real(Time,R8Ki), DisplacementList(:,1), DisplacementList(:,DimIdx+1), TmpIdx(DimIdx), size(DisplacementList,1) ) + enddo + do DimIdx=1,3 + Theta(DimIdx) = InterpStpReal8( real(Time,R8Ki), DisplacementList(:,1), DisplacementList(:,DimIdx+4), TmpIdx(DimIdx), size(DisplacementList,1) ) + enddo + u(1)%SoilMesh%Orientation(1:3,1:3,i) = EulerConstruct(Theta) + enddo + endif + + ! Calculate outputs at n + CALL SlD_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ); + call CheckErr('After CalcOutput: '); + + ! There are no states to update in SoilDyn, but for completeness we add this. + ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 + CALL SlD_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, misc, ErrStat, ErrMsg ); + call CheckErr(''); + + !call Dvr_WriteOutputLine(Time,DvrOut,p%OutFmt,y) + call Dvr_WriteOutputLine(Time,DvrOut,"ES20.12E2",y) + END DO + + + + ! If requested, get the stiffness matrix using whatever the last value of displacement was + if ( SettingsFlags%StiffMatOut .and. p%CalcOption==Calc_REDWIN ) then + do i=1,size(misc%dll_data) + ! Copy displacement from point mesh + Displacement(1:3) = u(1)%SoilMesh%TranslationDisp(1:3,i) ! Translations -- This is R8Ki in the mesh + Displacement(4:6) = EulerExtract(u(1)%SoilMesh%Orientation(1:3,1:3,i)) ! Small angle assumption should be valid here -- Note we are assuming reforientation is 0 + call REDWINinterface_GetStiffMatrix( p%DLL_Trgt, p%DLL_Model, Displacement, Force, StiffMatrix, misc%dll_data(i), ErrStat, ErrMsg ) + IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary + CALL WrScr( 'Get stiffness: '//ErrMsg ) + if ( ErrStat >= AbortErrLev ) call ProgEnd() + END IF + + call WrScr('Stiffness matrix for point '//trim(Num2LStr(i))//' at T = '//trim(Num2LStr(TMax))) + call WrMatrix( StiffMatrix, CU, '(ES12.4)', ' StiffMatrix' ) + enddo + endif + + + !............................................................................................................................... + ! Routine to terminate program execution + !............................................................................................................................... + if (DvrOut>0) close(DvrOut) + CALL SlD_End( u(1), p, x, xd, z, OtherState, y, misc, ErrStat, ErrMsg ) + + IF ( ErrStat /= ErrID_None ) THEN + CALL WrScr( 'After End: '//ErrMsg ) + END IF + +CONTAINS + subroutine CheckErr(Text) + character(*), intent(in) :: Text + IF ( ErrStat /= ErrID_None ) THEN ! Check if there was an error and do something about it if necessary + CALL WrScr( Text//ErrMsg ) + if ( ErrStat >= AbortErrLev ) call ProgEnd() + END IF + end subroutine CheckErr + subroutine ProgEnd() + ! Placeholder for moment + Call ProgAbort('Fatal error encountered. Ending.') + end subroutine ProgEnd +END PROGRAM SoilDyn_Driver diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 new file mode 100644 index 0000000000..6b934fa6b9 --- /dev/null +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Subs.f90 @@ -0,0 +1,1143 @@ +!********************************************************************************************************************************** +! +! MODULE: SoilDyn_Driver_Subs - This module contains subroutines used by the SoilDyn Driver program +! +!********************************************************************************************************************************** +!********************************************************************************************************************************** +! LICENSING +! Copyright (C) 2020 National Renewable Energy Laboratory +! +! This file is part of SoilDyn. +! +! Licensed under the Apache License, Version 2.0 (the "License"); +! you may not use this file except in compliance with the License. +! You may obtain a copy of the License at +! +! http://www.apache.org/licenses/LICENSE-2.0 +! +! Unless required by applicable law or agreed to in writing, software +! distributed under the License is distributed on an "AS IS" BASIS, +! WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +! See the License for the specific language governing permissions and +! limitations under the License. +! +!********************************************************************************************************************************** +MODULE SoilDyn_Driver_Subs + + USE NWTC_Library + USE SoilDyn_Driver_Types + IMPLICIT NONE + +! NOTE: This is loosely based on the InflowWind driver code. + +CONTAINS +!-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +!> Print out help information +SUBROUTINE DispHelpText() + ! Statement about usage + CALL WrScr("") + CALL WrScr(" Syntax: SoilDyn_Driver [options]") + CALL WrScr("") + CALL WrScr(" where: -- Name of driver input file to use") + CALL WrScr(" options: "//SWChar//"sld -- treat as name of SoilDyn input file") + CALL WrScr(" (no driver input file)") + CALL WrScr("") + CALL WrScr(" The following options will overwrite values in the driver input file:") + CALL WrScr(" "//SwChar//"DT[#] -- timestep ") + CALL WrScr(" "//SwChar//"TStart[#] -- start time ") + CALL WrScr(" "//SwChar//"TSteps[#] -- number of timesteps ") + CALL WrScr(" "//SwChar//"v -- verbose output ") + CALL WrScr(" "//SwChar//"vv -- very verbose output ") + CALL WrScr(" "//SwChar//"NonLinear -- only return non-linear portion of reaction force") + CALL WrScr(" "//SwChar//"help -- print this help menu and exit") + CALL WrScr("") + CALL WrScr(" Notes:") + CALL WrScr(" -- Options are not case sensitive.") + CALL WrScr("") +!FIXME: update this +END SUBROUTINE DispHelpText + + +subroutine InitSettingsFlags( ProgInfo, CLSettings, CLFlags ) + implicit none + ! Storing the arguments + type( ProgDesc ), intent(in ) :: ProgInfo + type( SlDDriver_Settings ), intent( out) :: CLSettings !< Command line arguments passed in + type( SlDDriver_Flags ), intent( out) :: CLFlags !< Flags indicating which command line arguments were specified + + ! Set some CLSettings to null/default values + CLSettings%DvrIptFileName = "" ! No input name name until set + CLSettings%SlDIptFileName = "" ! No SlD input file name until set + CLSettings%InputDispFile = "" ! No SlD input displacement timeseries file name until set + CLSettings%NumTimeSteps = 0_IntKi + CLSettings%DT = 0.0_DbKi + CLSettings%TStart = 0.0_ReKi + CLSettings%ProgInfo = ProgInfo ! Driver info + + ! Set some CLFlags to null/default values + CLFlags%DvrIptFile = .FALSE. ! Driver input filename given as command line argument + CLFlags%SlDIptFile = .FALSE. ! SoilDyn input filename given as command line argument + CLFlags%InputDispFile = .FALSE. ! No SlD input displacement timeseries file name until set + CLFlags%TStart = .FALSE. ! specified time to start at + CLFlags%StiffMatOut = .FALSE. ! stiffness matrix output at start and end + CLFlags%NumTimeSteps = .FALSE. ! specified a number of timesteps + CLFlags%NumTimeStepsDefault = .FALSE. ! specified 'DEFAULT' for number of timesteps + CLFlags%DT = .FALSE. ! specified a resolution in time + CLFlags%DTDefault = .FALSE. ! specified 'DEFAULT' for resolution in time + CLFlags%Verbose = .FALSE. ! Turn on verbose error reporting? + CLFlags%VVerbose = .FALSE. ! Turn on very verbose error reporting? + CLFlags%SlDNonLinearForcePortionOnly = .FALSE. ! Report only non-linear portion of forces + +end subroutine InitSettingsFlags + +!-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +!> This subroutine retrieves the command line arguments and passes them to the +!! SoilDyn_driver_subs::parsearg routine for processing. +SUBROUTINE RetrieveArgs( CLSettings, CLFlags, ErrStat, ErrMsg ) + ! Storing the arguments + type( SlDDriver_Flags ), intent( out) :: CLFlags !< Flags indicating which command line arguments were specified + type( SlDDriver_Settings ), intent( out) :: CLSettings !< Command line arguments passed in + integer(IntKi), intent( out) :: ErrStat + CHARACTER(*), intent( out) :: ErrMsg + + ! Local variable + integer(IntKi) :: i !< Generic counter + character(1024) :: Arg !< argument given + character(1024) :: ArgUC !< Upper case argument to check + integer(IntKi) :: NumInputArgs !< Number of argements passed in from command line + logical :: sldFlag !< The -sld flag was set + character(1024) :: FileName !< Filename from the command line. + logical :: FileNameGiven !< Flag indicating if a filename was given. + integer(IntKi) :: ErrStatTmp !< Temporary error status (for calls) + character(1024) :: ErrMsgTmp !< Temporary error message (for calls) + + ! initialize some things + CLFlags%DvrIptFile = .FALSE. + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + ErrMsg = '' + ErrMsgTmp = '' + sldFlag = .FALSE. + FileNameGiven = .FALSE. + FileName = '' + + ! Check how many arguments are passed in + NumInputArgs = COMMAND_ARGUMENT_COUNT() + + ! exit if we don't have enough + IF (NumInputArgs == 0) THEN + CALL SetErrStat(ErrID_Fatal," Insufficient Arguments. Use option "//SwChar//"help for help menu.", & + ErrStat,ErrMsg,'RetrieveArgs') + RETURN + ENDIF + + + ! Loop through all the arguments, and store them + DO i=1,NumInputArgs + ! get the ith argument + CALL get_command_argument(i, Arg) + ArgUC = Arg + + ! convert to uppercase + CALL Conv2UC( ArgUC ) + + ! Check to see if it is a control parameter or the filename + IF ( INDEX( SwChar, ArgUC(1:1) ) > 0 ) THEN + + ! check to see if we asked for help + IF ( ArgUC(2:5) == "HELP" ) THEN + CALL DispHelpText() + CALL ProgExit(0) + ENDIF + + + ! Check the argument and put it where it belongs + ! chop the SwChar off before passing the argument + CALL ParseArg( CLSettings, CLFlags, ArgUC(2:), Arg(2:), sldFlag, ErrStatTmp, ErrMsgTmp ) + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,'RetrieveArgs') + IF (ErrStat>AbortErrLev) RETURN + + ELSE + + ! since there is no switch character, assume it is the filename, unless we already set one + IF ( FileNameGiven ) THEN + CALL SetErrStat(ErrID_Fatal," Multiple driver input filenames given: "//TRIM(FileName)//", "//TRIM(Arg), & + ErrStat,ErrMsg,'RetrieveArgs') + RETURN + ELSE + FileName = TRIM(Arg) + FileNameGiven = .TRUE. + ENDIF + + ENDIF + END DO + + + ! Was a filename given? + IF ( .NOT. FileNameGiven ) THEN + CALL SetErrStat( ErrID_Fatal, " No filename given.", ErrStat, ErrMsg, 'RetrieveArgs' ) + RETURN + ENDIF + + ! Was the -sld flag set? If so, the filename is the SoilDyn input file. Otherwise + ! it is the driver input file. + IF ( sldFlag ) THEN + CLSettings%SlDIptFileName = TRIM(FileName) + CLFlags%SlDIptFile = .TRUE. + ELSE + CLSettings%DvrIptFileName = TRIM(FileName) + CLFlags%DvrIptFile = .TRUE. + ENDIF + + + + !------------------------------------------------------------------------------- + !------------------------------------------------------------------------------- + CONTAINS + + + !------------------------------------------------------------------------------- + !> Convert a string to a real number + FUNCTION StringToReal( StringIn, ErrStat ) + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT(IN ) :: StringIn + + REAL(ReKi) :: StringToReal + INTEGER(IntKi) :: ErrStatTmp ! Temporary variable to hold the error status + + read( StringIn, *, iostat=ErrStatTmp) StringToReal + + ! If that isn't a number, only warn since we can continue by skipping this value + IF ( ErrStatTmp .ne. 0 ) ErrStat = ErrID_Warn + + END FUNCTION StringToReal + + + + !------------------------------------------------------------------------------- + SUBROUTINE ParseArg( CLSettings, CLFlags, ThisArgUC, ThisArg, sldFlagSet, ErrStat, ErrMsg ) + !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-! + ! Parse and store the input argument ! + !-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-! + + USE NWTC_Library + USE SoilDyn_Driver_Types + USE SoilDyn_Types + + IMPLICIT NONE + + ! Storing the arguments + TYPE( SlDDriver_Flags ), INTENT(INOUT) :: CLFlags ! Flags indicating which arguments were specified + TYPE( SlDDriver_Settings ), INTENT(INOUT) :: CLSettings ! Arguments passed in + + CHARACTER(*), INTENT(IN ) :: ThisArgUC ! The current argument (upper case for testing) + CHARACTER(*), INTENT(IN ) :: ThisArg ! The current argument (as passed in for error messages) + LOGICAL, INTENT(INOUT) :: sldFlagSet ! Was the -sld flag given? + + ! Error Handling + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + + + ! local variables + INTEGER(IntKi) :: Delim1 ! where the [ is + INTEGER(IntKi) :: Delim2 ! where the ] is + INTEGER(IntKi) :: DelimSep ! where the : is + REAL(ReKi) :: TempReal ! temp variable to hold a real + + INTEGER(IntKi) :: ErrStatTmp ! Temporary error status for calls + + + + ! Initialize some things + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + ErrMsg = '' + + ! Get the delimiters -- returns 0 if there isn't one + Delim1 = INDEX(ThisArgUC,'[') + Delim2 = INDEX(ThisArgUC,']') + DelimSep = INDEX(ThisArgUC,':') + + + ! check that if there is an opening bracket, then there is a closing one + IF ( (Delim1 > 0_IntKi ) .and. (Delim2 < Delim1) ) THEN + CALL SetErrStat(ErrID_Warn," Syntax error in option: '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArg') + RETURN + ENDIF + + ! check that if there is a colon, then there are brackets + IF ( (DelimSep > 0_IntKi) .and. (Delim1 == 0_IntKi) ) THEN + CALL SetErrStat(ErrID_Warn," Syntax error in option: '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArg') + RETURN + ENDIF + + + ! If no delimeters were given, than this option is simply a flag + IF ( Delim1 == 0_IntKi ) THEN + ! check to see if the filename is the name of the SlD input file + IF ( ThisArgUC(1:9) == "NONLINEAR" ) THEN + CLFlags%SlDNonLinearForcePortionOnly = .TRUE. + RETURN + ELSEIF ( ThisArgUC(1:3) == "SLD" ) THEN + sldFlagSet = .TRUE. ! More logic in the routine that calls this one to set things. + RETURN + ELSEIF ( ThisArgUC(1:2) == "VV" ) THEN + CLFlags%VVerbose = .TRUE. + RETURN + ELSEIF ( ThisArgUC(1:1) == "V" ) THEN + CLFlags%Verbose = .TRUE. + RETURN + ELSE + CALL SetErrStat( ErrID_Warn," Unrecognized option '"//SwChar//TRIM(ThisArg)//"'. Ignoring. Use option "//SwChar//"help for list of options.", & + ErrStat,ErrMsg,'ParseArg') + ENDIF + + ENDIF + + + ! "DT[#]" + IF( ThisArgUC(1:Delim1) == "DT[" ) THEN + TempReal = StringToReal( ThisArgUC(Delim1+1:Delim2-1), ErrStat ) + IF ( ErrStat == ErrID_None ) THEN + CLFlags%Dt = .TRUE. + CLSettings%DT = abs(TempReal) + ELSE + CLFlags%Dt = .FALSE. + IF ( ErrStat == ErrID_Warn ) THEN + CALL SetErrStat(ErrStatTmp," Invalid number in option '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArgs') + ELSE + CALL SetErrStat( ErrID_Fatal," Something failed in parsing option '"//SwChar//TRIM(ThisArg)//"'.", & + ErrStat, ErrMsg, 'ParseArg') + ENDIF + RETURN + ENDIF + + + ! "TSTEPS[#]" + ELSEIF( ThisArgUC(1:Delim1) == "TSTEPS[" ) THEN + TempReal = StringToReal( ThisArgUC(Delim1+1:Delim2-1), ErrStat ) + IF ( ErrStat == ErrID_None ) THEN + CLFlags%NumTimeSteps = .TRUE. + CLSettings%NumTimeSteps = nint(abs(TempReal)) + ELSE + CLFlags%NumTimeSteps = .FALSE. + CLSettings%NumTimeSteps = 1_IntKi + IF ( ErrStat == ErrID_Warn ) THEN + CALL SetErrStat(ErrStatTmp," Invalid number in option '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArgs') + ELSE + CALL SetErrStat( ErrID_Fatal," Something failed in parsing option '"//SwChar//TRIM(ThisArg)//"'.", & + ErrStat, ErrMsg, 'ParseArg') + ENDIF + RETURN + ENDIF + + + + ! "TSTART[#]" + ELSEIF( ThisArgUC(1:Delim1) == "TSTART[" ) THEN + TempReal = StringToReal( ThisArgUC(Delim1+1:Delim2-1), ErrStat ) + IF ( ErrStat == ErrID_None ) THEN + CLFlags%TStart = .TRUE. + CLSettings%TStart = abs(TempReal) + ELSE + CLFlags%TStart = .FALSE. + IF ( ErrStat == ErrID_Warn ) THEN + CALL SetErrStat(ErrStatTmp," Invalid number in option '"//SwChar//TRIM(ThisArg)//"'. Ignoring.", & + ErrStat,ErrMsg,'ParseArgs') + ELSE + CALL SetErrStat( ErrID_Fatal," Something failed in parsing option '"//SwChar//TRIM(ThisArg)//"'.", & + ErrStat, ErrMsg, 'ParseArg') + ENDIF + RETURN + ENDIF +!FIXME: add in the other inputs here. + + ELSE + ErrMsg = " Unrecognized option: '"//SwChar//TRIM(ThisArg)//"'. Ignoring. Use option "//SwChar//"help for list of options." + ErrStat = ErrID_Warn + ENDIF + + END SUBROUTINE ParseArg + !------------------------------------------------------------------------------- + +END SUBROUTINE RetrieveArgs + + +!-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +!-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +!> This subroutine reads the driver input file and sets up the flags and settings +!! for the driver code. Any settings from the command line options will override +!! this. +SUBROUTINE ReadDvrIptFile( DvrFileName, DvrFlags, DvrSettings, ProgInfo, ErrStat, ErrMsg ) + + CHARACTER(1024), INTENT(IN ) :: DvrFileName + TYPE(SlDDriver_Flags), INTENT(INOUT) :: DvrFlags + TYPE(SlDDriver_Settings), INTENT(INOUT) :: DvrSettings + TYPE(ProgDesc), INTENT(IN ) :: ProgInfo + INTEGER(IntKi), INTENT( OUT) :: ErrStat ! returns a non-zero value when an error occurs + CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + + ! Local variables + INTEGER(IntKi) :: UnIn ! Unit number for the driver input file + CHARACTER(1024) :: FileName ! Name of SoilDyn driver input file + + ! Input file echoing + LOGICAL :: EchoFileContents ! Do we echo the driver file out or not? + INTEGER(IntKi) :: UnEchoLocal ! The local unit number for this module's echo file + CHARACTER(1024) :: EchoFileName ! Name of SoilDyn driver echo file + + ! Time steps + CHARACTER(1024) :: InputChr ! Character string for timesteps and input file names (to handle DEFAULT or NONE value) + + ! Local error handling + INTEGER(IntKi) :: ios !< I/O status + INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls + CHARACTER(1024) :: ErrMsgTmp !< Temporary error messages for calls + + + ! Initialize the echo file unit to -1 which is the default to prevent echoing, we will alter this based on user input + UnEchoLocal = -1 + + FileName = TRIM(DvrFileName) + + CALL GetNewUnit( UnIn ) + CALL OpenFInpFile( UnIn, FileName, ErrStatTmp, ErrMsgTmp ) + IF ( ErrStatTmp /= ErrID_None ) THEN + CALL SetErrStat(ErrID_Fatal,' Failed to open SoilDyn Driver input file: '//FileName, & + ErrStat,ErrMsg,'ReadDvrIptFile') + CLOSE( UnIn ) + RETURN + ENDIF + + + CALL WrScr( 'Opening SoilDyn Driver input file: '//trim(FileName) ) + + + !------------------------------------------------------------------------------------------------- + ! File header + !------------------------------------------------------------------------------------------------- + + CALL ReadCom( UnIn, FileName,' SoilDyn Driver input file header line 1', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file header line 2', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file seperator line', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + ! Echo Input Files. + CALL ReadVar ( UnIn, FileName, EchoFileContents, 'Echo', 'Echo Input', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + + ! If we are Echoing the input then we should re-read the first three lines so that we can echo them + ! using the NWTC_Library routines. The echoing is done inside those routines via a global variable + ! which we must store, set, and then replace on error or completion. + + IF ( EchoFileContents ) THEN + + EchoFileName = TRIM(FileName)//'.ech' + CALL GetNewUnit( UnEchoLocal ) + CALL OpenEcho ( UnEchoLocal, EchoFileName, ErrStatTmp, ErrMsgTmp, ProgInfo ) + if (Failed()) return + + REWIND(UnIn) + + ! Reread and echo + CALL ReadCom( UnIn, FileName,' SoilDyn Driver input file header line 1', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file header line 2', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + CALL ReadCom( UnIn, FileName, 'SoilDyn Driver input file seperator line', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! Echo Input Files. + CALL ReadVar ( UnIn, FileName, EchoFileContents, 'Echo', 'Echo Input', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ENDIF + + + !------------------------------------------------------------------------------------------------- + ! Driver setup section + !------------------------------------------------------------------------------------------------- + + ! Header + CALL ReadCom( UnIn, FileName,' Driver setup section, comment line', ErrStatTmp, ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! SoilDyn input file + CALL ReadVar( UnIn, FileName,DvrSettings%SlDIptFileName,'SlDIptFileName',' SoilDyn input filename', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) then + return + else + DvrFlags%SlDIptFile = .TRUE. + endif + + + ! TStart -- start time + CALL ReadVar( UnIn, FileName,DvrSettings%TStart,'TStart',' Time in wind file to start parsing.', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) then + return + else + DvrFlags%TStart = .TRUE. + endif + + + ! DT -- Timestep size for the driver to take (or DEFAULT for what the file contains) + CALL ReadVar( UnIn, FileName,InputChr,'InputChr',' Character string for Timestep size for the driver to take (or DEFAULT for what the file contains).', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! Check if we asked for the DEFAULT (use what is in the file) + CALL Conv2UC( InputChr ) + IF ( TRIM(InputChr) == 'DEFAULT' ) THEN ! we asked for the default value + DvrFlags%DT = .TRUE. + DvrFlags%DTDefault = .TRUE. ! This flag tells us to use the inflow wind file values + ELSE + ! We probably have a number if it isn't 'DEFAULT', so do an internal read and check to + ! make sure that it was appropriately interpretted. + READ (InputChr,*,IOSTAT=IOS) DvrSettings%DT + IF ( IOS /= 0 ) THEN ! problem in the read, so parse the error. + CALL CheckIOS ( IOS, '', 'DT',NumType, ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + ELSE ! Was ok, so set the flags + DvrFlags%DT = .TRUE. + DvrFlags%DTDefault = .FALSE. + ENDIF + ENDIF + + + ! Number of timesteps + CALL ReadVar( UnIn, FileName,InputChr,'InputChr',' Character string for number of timesteps to read.', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! Check if we asked for the DEFAULT (use what is in the file) + CALL Conv2UC( InputChr ) + IF ( TRIM(InputChr) == 'DEFAULT' ) THEN ! we asked for the default value + DvrFlags%NumTimeSteps = .FALSE. + DvrFlags%NumTimeStepsDefault = .TRUE. ! This flag tells us to use the inflow wind file values + ELSE + ! We probably have a number if it isn't 'DEFAULT', so do an internal read and check to + ! make sure that it was appropriately interpretted. + READ (InputChr,*,IOSTAT=IOS) DvrSettings%NumTimeSteps + IF ( IOS /= 0 ) THEN ! problem in the read, so parse the error. + CALL CheckIOS ( IOS, '', 'NumTimeSteps',NumType, ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + ELSE ! Was ok, so set the flags + DvrFlags%NumTimeSteps = .TRUE. + DvrFlags%NumTimeStepsDefault = .FALSE. + ENDIF + ENDIF + + + ! Stiffness matrix + CALL ReadVar( UnIn, FileName,DvrFlags%StiffMatOut,'StiffMatOut',' Output stiffness matrices at start and end', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + ! Non-linear reaction portion only + CALL ReadVar( UnIn, FileName,DvrFlags%SlDNonLinearForcePortionOnly,'SlDNonLinearForcePortionOnly',' Only report the non-linear portion of the reaction force.', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + + + !------------------------------------------------------------------------------------------------- + ! SoilDyn time series input -- this is read from a file of 7 columns (time and 6 dof) + !------------------------------------------------------------------------------------------------- + + ! InputDispFile input file + CALL ReadVar( UnIn, FileName,InputChr,'InputDispFile',' SoilDyn input displacements filename', & + ErrStatTmp,ErrMsgTmp, UnEchoLocal ) + if (Failed()) return + + DvrSettings%InputDispFile = InputChr + call Conv2UC( InputChr ) + if (trim(InputChr) == 'NONE') then + DvrSettings%InputDispFile = '' + DvrFlags%InputDispFile = .FALSE. + else + DvrFlags%InputDispFile = .TRUE. + endif + + + ! Close the echo and input file + CALL CleanupEchoFile( EchoFileContents, UnEchoLocal ) + CLOSE( UnIn ) + + +CONTAINS + + !> Set error status, close stuff, and return + logical function Failed() + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,'ReadDvrIptFile') + if (ErrStat >= AbortErrLev) then + CALL CleanupEchoFile( EchoFileContents, UnEchoLocal ) + CLOSE( UnIn ) + endif + Failed = ErrStat >= AbortErrLev + end function Failed + + !> Clean up the module echo file + subroutine CleanupEchoFile( EchoFlag, UnEcho) + logical, intent(in ) :: EchoFlag ! local version of echo flag + integer(IntKi), intent(in ) :: UnEcho ! echo unit number + + ! Close this module's echo file + if ( EchoFlag ) then + close(UnEcho) + endif + END SUBROUTINE CleanupEchoFile + +END SUBROUTINE ReadDvrIptFile + + +!> This subroutine copies an command line (CL) settings over to the program settings. Warnings are +!! issued if anything is changed from what the driver input file requested. +SUBROUTINE UpdateSettingsWithCL( DvrFlags, DvrSettings, CLFlags, CLSettings, DVRIPT, ErrStat, ErrMsg ) + + TYPE(SlDDriver_Flags), INTENT(INOUT) :: DvrFlags + TYPE(SlDDriver_Settings), INTENT(INOUT) :: DvrSettings + TYPE(SlDDriver_Flags), INTENT(IN ) :: CLFlags + TYPE(SlDDriver_Settings), INTENT(IN ) :: CLSettings + LOGICAL, INTENT(IN ) :: DVRIPT + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + + + ! Local variables + INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls + CHARACTER(1024) :: ErrMsgTmp !< Temporary error status for calls + LOGICAL :: WindGridModify !< Did we modify any of the WindGrid related settings? + character(*), parameter :: RoutineName = 'UpdateSettingsWithCL' + + ! Initialization + WindGridModify = .FALSE. + + ! Initialize the error handling + ErrStat = ErrID_None + ErrMsg = '' + ErrStatTmp = ErrID_None + ErrMsgTmp = '' + + + !-------------------------------------------- + ! Did we change any time information? + !-------------------------------------------- + + ! Check TStart + IF ( CLFlags%TStart ) THEN + IF ( DvrFlags%TStart .AND. ( .NOT. EqualRealNos(DvrSettings%TStart, CLSettings%TStart) ) ) THEN + CALL SetErrStat( ErrID_Warn, ' Overriding driver input value for TStart with '//TRIM(Num2LStr(CLSettings%TStart))//'.', & + ErrStat,ErrMsg,RoutineName) + ELSE + DvrFlags%TStart = .TRUE. + ENDIF + DvrSettings%TStart = CLSettings%TStart + ENDIF + + ! Check DT + IF ( CLFlags%DT ) THEN + IF ( DvrFlags%DT .AND. ( .NOT. EqualRealNos(DvrSettings%DT, CLSettings%DT) ) ) THEN + CALL SetErrStat( ErrID_Warn, ' Overriding driver input value for DT with '//TRIM(Num2LStr(CLSettings%DT))//'.', & + ErrStat,ErrMsg,RoutineName) + ELSE + DvrFlags%DT = .TRUE. + ENDIF + DvrSettings%DT = CLSettings%DT + DvrFlags%DTDefault = .FALSE. + ENDIF + + ! Check NumTimeSteps + IF ( CLFlags%NumTimeSteps ) THEN + IF ( DvrFlags%NumTimeSteps .AND. ( DvrSettings%NumTimeSteps /= CLSettings%NumTimeSteps ) ) THEN + CALL SetErrStat( ErrID_Warn, ' Overriding driver input value for NumTimeSteps with '// & + TRIM(Num2LStr(CLSettings%NumTimeSteps))//'.',& + ErrStat,ErrMsg,RoutineName) + ELSE + DvrFlags%NumTimeSteps = .TRUE. + ENDIF + DvrSettings%NumTimeSteps = CLSettings%NumTimeSteps + DvrFlags%NumTimeStepsDefault = .FALSE. + ENDIF + + ! Make sure there is at least one timestep + DvrSettings%NumTimeSteps = MAX(DvrSettings%NumTimeSteps,1_IntKi) + + + !-------------------------------------------- + ! If there was no driver input file, we need to set a few things. + !-------------------------------------------- + + IF ( .NOT. DVRIPT ) THEN + + ! Do we need to set the NumTimeStepsDefault flag? + IF ( .NOT. DvrFlags%NumTimeSteps ) THEN + DvrFlags%NumTimeStepsDefault = .TRUE. + CALL SetErrStat( ErrID_Info,' The number of timesteps is not specified. Defaulting to what is in the input series file.', & + ErrStat,ErrMsg,RoutineName) + ENDIF + ENDIF + + +!FIXME: remove this after parsing rest of input file. + ! If no DT value has been set (DEFAULT requested), we need to set a default to pass into SlD + IF ( .NOT. DvrFlags%DT ) THEN + DvrSettings%DT = 0.025_DbKi ! This value gets passed into the SlD_Init routine, so something must be set. + ENDIF + + +END SUBROUTINE UpdateSettingsWithCL + + + +SUBROUTINE ReadInputDispFile( InputDispFile, DisplacementList, ErrStat, ErrMsg ) + CHARACTER(1024), INTENT(IN ) :: InputDispFile !< Name of the points file to read + REAL(R8Ki), ALLOCATABLE, INTENT( OUT) :: DisplacementList(:,:) !< The coordinates we read in: idx 1 = timestep, idx 2 = values + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< The error status + CHARACTER(*), INTENT( OUT) :: ErrMsg !< The message for the status + + ! Local variables + CHARACTER(1024) :: ErrMsgTmp !< Temporary error message for calls + INTEGER(IntKi) :: ErrStatTmp !< Temporary error status for calls + INTEGER(IntKi) :: FiUnitPoints !< Unit number for points file to open + + INTEGER(IntKi) :: NumDataColumns !< Number of data columns + INTEGER(IntKi) :: NumDataPoints !< Number of lines of data (one point per line) + INTEGER(IntKi) :: NumHeaderLines !< Number of header lines to ignore + + INTEGER(IntKi) :: I !< Generic counter + character(*), parameter :: RoutineName = 'ReadInputDispFile' + + ! Initialization of subroutine + ErrMsg = '' + ErrMsgTmp = '' + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + + + ! Now open file + CALL GetNewUnit( FiUnitPoints, ErrStatTmp, ErrMsgTmp ); if (Failed()) return + CALL OpenFInpFile( FiUnitPoints, TRIM(InputDispFile), ErrStatTmp, ErrMsgTmp ) ! Unformatted input file + if (Failed()) return + + ! Find out how long the file is + CALL GetFileLength( FiUnitPoints, InputDispFile, NumDataColumns, NumDataPoints, NumHeaderLines, ErrMsgTmp, ErrStatTmp ) + if (Failed()) return + IF ( NumDataColumns /= 7 ) THEN + ErrStatTmp = ErrID_Fatal + ErrMsgTmp = ' Expecting seven columns in '//TRIM(InputDispFile)//' corresponding to '// & + 'time, dX, dY, dZ, dTheta_X, dTheta_Y, dTheta_Z coordinates. Instead found '//TRIM(Num2LStr(NumDataColumns))//' columns.' + if (Failed()) return + ENDIF + + + ! Allocate the storage for the data + CALL AllocAry( DisplacementList, NumDataPoints, 7, "Array of Points data", ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + + + ! Read in the headers and throw them away + DO I=1,NumHeaderLines + CALL ReadCom( FiUnitPoints, InputDispFile,' Points file header line', ErrStatTmp, ErrMsgTmp ) + if (Failed()) return + ENDDO + + ! Read in the datapoints -- This is arranged with time in first index for speed in later interpolation operations + DO I=1,NumDataPoints + CALL ReadAry ( FiUnitPoints, InputDispFile, DisplacementList(I,:), 7, 'DisplacementList', & + 'Coordinate point from Points file', ErrStatTmp, ErrMsgTmp) + if (Failed()) return + ENDDO + + CLOSE( FiUnitPoints ) + +CONTAINS + !> Set error status, close stuff, and return + logical function Failed() + CALL SetErrStat(ErrStatTmp,ErrMsgTmp,ErrStat,ErrMsg,RoutineName) + if (ErrStat >= AbortErrLev .and. FiUnitPoints >0) close( FiUnitPoints ) + Failed = ErrStat >= AbortErrLev + end function Failed + + + !------------------------------------------------------------------------------------------------------------------------------- + !> This subroutine looks at a file that has been opened and finds out how many header lines there are, how many columns there + !! are, and how many lines of data there are in the file. + !! + !! A few things are assumed about the file: + !! 1. Any header lines are the first thing in the file. + !! 2. No text appears anyplace other than in first part of the file + !! 3. The datalines only contain numbers that can be read in as reals. + !! + !! Limitations: + !! 1. only handles up to 20 words (columns) on a line + !! 2. empty lines are considered text lines + !! 3. All data rows must contain the same number of columns + !! + !! + SUBROUTINE GetFileLength(UnitDataFile, DataFileName, NumDataColumns, NumDataLines, NumHeaderLines, ErrMsg, ErrStat) + + INTEGER(IntKi), INTENT(IN ) :: UnitDataFile !< Unit number of the file we are looking at. + CHARACTER(*), INTENT(IN ) :: DataFileName !< The name of the file we are looking at. + INTEGER(IntKi), INTENT( OUT) :: NumDataColumns !< The number of columns in the data file. + INTEGER(IntKi), INTENT( OUT) :: NumDataLines !< Number of lines containing data + INTEGER(IntKi), INTENT( OUT) :: NumHeaderLines !< Number of header lines at the start of the file + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error Message to return (empty if all good) + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Status flag if there were any problems (ErrID_None if all good) + + ! Local Variables + CHARACTER(2048) :: ErrMsgTmp !< Temporary message variable. Used in calls. + INTEGER(IntKi) :: ErrStatTmp !< Temporary error status. Used in calls. + INTEGER(IntKi) :: LclErrStat !< Temporary error status. Used locally to indicate when we have reached the end of the file. + INTEGER(IntKi) :: TmpIOErrStat !< Temporary error status for the internal read of the first word to a real number + LOGICAL :: IsRealNum !< Flag indicating if the first word on the line was a real number + + CHARACTER(1024) :: TextLine !< One line of text read from the file + INTEGER(IntKi) :: LineLen !< The length of the line read in + CHARACTER(1024) :: StrRead !< String containing the first word read in + REAL(R8Ki) :: RealRead !< Returns value of the number (if there was one), or NaN (as set by NWTC_Num) if there wasn't + CHARACTER(24) :: Words(20) !< Array of words we extract from a line. We shouldn't have more than 20. + INTEGER(IntKi) :: i !< simple integer counters + INTEGER(IntKi) :: LineNumber !< the line I am on + LOGICAL :: LineHasText !< Flag indicating if the line I just read has text. If so, it is a header line. + LOGICAL :: HaveReadData !< Flag indicating if I have started reading data. + INTEGER(IntKi) :: NumWords !< Number of words on a line + INTEGER(IntKi) :: FirstDataLineNum !< Line number of the first row of data in the file + + ! Initialize the error handling + ErrStat = ErrID_None + ErrStatTmp = ErrID_None + LclErrStat = ErrID_None + ErrMsg = '' + ErrMsgTmp = '' + + ! Set some of the flags and counters + HaveReadData = .FALSE. + NumDataColumns = 0 + NumHeaderLines = 0 + NumDataLines = 0 + LineNumber = 0 + + ! Just in case we were handed a file that we are part way through reading (should never be true), rewind to the start + + REWIND( UnitDataFile ) + + !------------------------------------ + !> The variable LclErrStat is used to indicate when we have reached the end of the file or had an error from + !! ReadLine. Until that occurs, we read each line, and decide if it contained any non-numeric data. The + !! first group of lines containing non-numeric data is considered the header. The first line of all numeric + !! data is considered the start of the data section. Any non-numeric containing found within the data section + !! will be considered as an invalid file format at which point we will return a fatal error from this routine. + + DO WHILE ( LclErrStat == ErrID_None ) + + !> Reset the indicator flag for the non-numeric content + LineHasText = .FALSE. + + !> Read in a single line from the file + CALL ReadLine( UnitDataFile, '', TextLine, LineLen, LclErrStat ) + + !> If there was an error in reading the file, then exit. + !! Possible causes: reading beyond end of file in which case we are done so don't process it. + IF ( LclErrStat /= ErrID_None ) EXIT + + !> Increment the line counter. + LineNumber = LineNumber + 1 + + !> Read all the words on the line into the array called 'Words'. Only the first words will be encountered + !! will be stored. The others are empty (i.e. only three words on the line, so the remaining 17 are empty). + CALL GetWords( TextLine, Words, 20 ) + + !> Cycle through and count how many are not empty. Once an empty value is encountered, all the rest should + !! be empty if GetWords worked correctly. The index of the last non-empty value is stored. + DO i=1,20 + IF (TRIM(Words(i)) .ne. '') NumWords=i + ENDDO + + + !> Now cycle through the first 'NumWords' of non-empty values stored in 'Words'. Words should contain + !! everything that is one the line. The subroutine ReadRealNumberFromString will set a flag 'IsRealNum' + !! when the value in Words(i) can be read as a real(R8Ki). 'StrRead' will contain the string equivalent. + DO i=1,NumWords + CALL ReadRealNumberFromString( Words(i), RealRead, StrRead, IsRealNum, ErrStatTmp, ErrMsgTmp, TmpIOErrStat ) + IF ( .NOT. IsRealNum) LineHasText = .TRUE. + ENDDO + + !> If all the words on that line had no text in them, then it must have been a line of data. + !! If not, then we have either a header line, which is ok, or a line containing text in the middle of the + !! the data section, which is not good (the flag HaveReadData tells us which case this is). + IF ( LineHasText ) THEN + IF ( HaveReadData ) THEN ! Uh oh, we have already read a line of data before now, so there is a problem + CALL SetErrStat( ErrID_Fatal, ' Found text on line '//TRIM(Num2LStr(LineNumber))//' of '//TRIM(DataFileName)// & + ' when real numbers were expected. There may be a problem with format of the file: '// & + TRIM(DataFileName)//'.', ErrStat, ErrMsg, RoutineName) + IF ( ErrStat >= AbortErrLev ) RETURN + ELSE + NumHeaderLines = NumHeaderLines + 1 + ENDIF + ELSE ! No text, must be data line + NumDataLines = NumDataLines + 1 + ! If this is the first row of data, then store the number of words that were on the line + IF ( .NOT. HaveReadData ) THEN + ! If this is the first line of data, keep some relevant info about it and the number of columns in it + HaveReadData = .TRUE. + FirstDataLineNum = LineNumber ! Keep the line number of the first row of data (for error reporting) + NumDataColumns = NumWords + ELSE + ! Make sure that the number columns on the row matches the number of columnns on the first row of data. + IF ( NumWords /= NumDataColumns ) THEN + CALL SetErrStat( ErrID_Fatal, ' Error in file: '//TRIM(DataFileName)//'.'// & + ' The number of data columns on line '//TRIM(Num2LStr(LineNumber))// & + '('//TRIM(Num2LStr(NumWords))//' columns) is different than the number of columns on first row of data '// & + ' (line: '//TRIM(Num2LStr(FirstDataLineNum))//', '//TRIM(Num2LStr(NumDataColumns))//' columns).', & + ErrStat, ErrMsg, RoutineName) + IF ( ErrStat >= AbortErrLev ) RETURN + ENDIF + ENDIF + ENDIF + + ENDDO + + REWIND( UnitDataFile ) + + END SUBROUTINE GetFileLength + + !------------------------------------------------------------------------------- + !> This subroutine takes a line of text that is passed in and reads the first + !! word to see if it is a number. An internal read is used to do this. If + !! it is a number, it is started in ValueRead and returned. The flag IsRealNum + !! is set to true. Otherwise, ValueRead is set to NaN (value from the NWTC_Num) + !! and the flag is set to false. + !! + !! The IsRealNum flag is set to indicate if we actually have a real number or + !! not. After calling this routine, a simple if statement can be used: + !! + !! @code + !! IF (IsRealNum) THEN + !! ! do something + !! ELSE + !! ! do something else + !! ENDIF + !! @endcode + !! + !------------------------------------------------------------------------------- + SUBROUTINE ReadRealNumberFromString(StringToParse, ValueRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) + CHARACTER(*), INTENT(IN ) :: StringToParse !< The string we were handed. + REAL(R8Ki), INTENT( OUT) :: ValueRead !< The variable being read. Returns as NaN (library defined) if not a Real. + CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. + LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message including message from ReadNum + INTEGER(IntKi), INTENT( OUT) :: IOErrStat !< Error status from the internal read. Useful for diagnostics. + + ErrStat = ErrID_None + ErrMsg = '' + + ! ReadNum returns a string contained in StrRead. So, we now try to do an internal read to VarRead and then trap errors. + read(StringToParse,*,IOSTAT=IOErrStat) StrRead + read(StringToParse,*,IOSTAT=IOErrStat) ValueRead + + ! If IOErrStat==0, then we have a real number, anything else is a problem. + if (IOErrStat==0) then + IsRealNum = .TRUE. + else + IsRealNum = .FALSE. + ValueRead = NaN ! This is NaN as defined in the NWTC_Num. + ErrMsg = 'Not a real number. '//TRIM(ErrMsgTmp)//NewLine + ErrSTat = ErrID_Severe + endif + + RETURN + END SUBROUTINE ReadRealNumberFromString + + !------------------------------------------------------------------------------- + !> This subroutine works with the ReadNum routine from the library. ReadNum is + !! called to read a word from the input file. An internal read is then done to + !! convert the string to a number that is stored in VarRead and returned. + !! + !! The IsRealNum flag is set to indicate if we actually have a real number or + !! not. After calling this routine, a simple if statement can be used: + !! + !! @code + !! IF (ISRealNum) THEN + !! ! do something + !! ELSE + !! ! do something else + !! ENDIF + !! @endcode + !! + !------------------------------------------------------------------------------- + SUBROUTINE ReadRealNumber(UnitNum, FileName, VarName, VarRead, StrRead, IsRealNum, ErrStat, ErrMsg, IOErrStat) + INTEGER(IntKi), INTENT(IN ) :: UnitNum !< The unit number of the file being read + CHARACTER(*), INTENT(IN ) :: FileName !< The name of the file being read. Used in the ErrMsg from ReadNum (Library routine). + CHARACTER(*), INTENT(IN ) :: VarName !< The variable we are reading. Used in the ErrMsg from ReadNum (Library routine)'. + REAL(R8Ki), INTENT( OUT) :: VarRead !< The variable being read. Returns as NaN (library defined) if not a Real. + CHARACTER(*), INTENT( OUT) :: StrRead !< A string containing what was read from the ReadNum routine. + LOGICAL, INTENT( OUT) :: IsRealNum !< Flag indicating if we successfully read a Real + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< ErrID level returned from ReadNum + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message including message from ReadNum + INTEGER(IntKi), INTENT( OUT) :: IOErrStat !< Error status from the internal read. Useful for diagnostics. + + INTEGER(IntKi) :: ErrStatTmp + CHARACTER(2048) :: ErrMsgTmp + + ErrStat = ErrID_None + ErrMsg = '' + + ! Now call the ReadNum routine to get the number + ! If it is a word that does not start with T or F, then ReadNum won't give any errors. + CALL ReadNum( UnitNum, FileName, StrRead, VarName, ErrStatTmp, ErrMsgTmp) + + ! ReadNum returns a string contained in StrRead. So, we now try to do an internal read to VarRead and then trap errors. + read(StrRead,*,IOSTAT=IOErrStat) VarRead + + ! If IOErrStat==0, then we have a real number, anything else is a problem. + if (IOErrStat==0) then + IsRealNum = .TRUE. + else + IsRealNum = .FALSE. + VarRead = NaN ! This is NaN as defined in the NWTC_Num. + ErrMsg = 'Not a real number. '//TRIM(ErrMsgTmp)//NewLine + ErrStat = ErrStatTmp ! The ErrStatTmp returned by the ReadNum routine is an ErrID level. + endif + RETURN + END SUBROUTINE ReadRealNumber + +END SUBROUTINE ReadInputDispFile + + + + +!> This routine exists only to support the development of the module. It will not be needed after the module is complete. +SUBROUTINE printSettings( DvrFlags, DvrSettings ) + ! The arguments + TYPE( SlDDriver_Flags ), INTENT(IN ) :: DvrFlags !< Flags indicating which settings were set + TYPE( SlDDriver_Settings ), INTENT(IN ) :: DvrSettings !< Stored settings + + CALL WrsCr(TRIM(GetNVD(DvrSettings%ProgInfo))) + CALL WrScr(' DvrIptFile: '//FLAG(DvrFlags%DvrIptFile)// ' '//TRIM(DvrSettings%DvrIptFileName)) + CALL WrScr(' SlDIptFile: '//FLAG(DvrFlags%SlDIptFile)// ' '//TRIM(DvrSettings%SlDIptFileName)) + CALL WrScr(' TStart: '//FLAG(DvrFlags%TStart)// ' '//TRIM(Num2LStr(DvrSettings%TStart))) + IF ( DvrFlags%DTDefault) THEN + CALL WrScr(' DT: '//FLAG(DvrFlags%DT)// ' DEFAULT') + ELSE + CALL WrScr(' DT: '//FLAG(DvrFlags%DT)// ' '//TRIM(Num2LStr(DvrSettings%DT))) + ENDIF + IF ( DvrFlags%NumTimeStepsDefault) THEN + CALL WrScr(' NumTimeSteps: '//FLAG(DvrFlags%NumTimeSteps)// ' DEFAULT') + ELSE + CALL WrScr(' NumTimeSteps: '//FLAG(DvrFlags%NumTimeSteps)// ' '//TRIM(Num2LStr(DvrSettings%NumTimeSteps))) + ENDIF + CALL WrScr(' StiffMatOut: '//FLAG(DvrFlags%StiffMatOut)) + CALL WrScr(' Verbose: '//FLAG(DvrFlags%Verbose)) + CALL WrScr(' VVerbose: '//FLAG(DvrFlags%VVerbose)) + RETURN +END SUBROUTINE printSettings + + +!> This routine exists only to support the development of the module. It will not be kept after the module is complete. +!! This routine takes a flag setting (LOGICAL) and exports either 'T' or '-' for T/F (respectively) +FUNCTION FLAG(flagval) + LOGICAL, INTENT(IN ) :: flagval !< Value of the flag + CHARACTER(1) :: FLAG !< character interpretation (for prettiness when printing) + IF ( flagval ) THEN + FLAG = 'T' + ELSE + FLAG = '-' + ENDIF + RETURN +END FUNCTION FLAG + + +SUBROUTINE Dvr_InitializeOutputFile(OutUnit,IntOutput,RootName,ErrStat,ErrMsg) + integer(IntKi), intent( out):: OutUnit + type(SlD_InitOutputType), intent(in ):: IntOutput ! Output for initialization routine + integer(IntKi), intent( out):: ErrStat ! Error status of the operation + character(*), intent( out):: ErrMsg ! Error message if ErrStat /= ErrID_None + character(*), intent(in ):: RootName + integer(IntKi) :: i + integer(IntKi) :: numOuts + integer(IntKi) :: ErrStat2 ! Temporary Error status + character(ErrMsgLen) :: ErrMsg2 ! Temporary Error message + character(*), parameter :: RoutineName = 'Dvr_InitializeOutputFile' + + ErrStat = ErrID_none + ErrMsg = "" + + CALL GetNewUnit(OutUnit,ErrStat2,ErrMsg2) + CALL OpenFOutFile ( OutUnit, trim(RootName)//'.out', ErrStat2, ErrMsg2 ) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + if (ErrStat >= AbortErrLev) return + + write (OutUnit,'(/,A)') 'Predictions were generated on '//CurDate()//' at '//CurTime()//' using '//trim(GetNVD(IntOutput%Ver)) + write (OutUnit,'()' ) !print a blank line + + numOuts = size(IntOutput%WriteOutputHdr) + !...................................................... + ! Write the names of the output parameters on one line: + !...................................................... + + write (OutUnit,'()') + write (OutUnit,'()') + write (OutUnit,'()') + + call WrFileNR ( OutUnit, 'Time' ) + + do i=1,NumOuts + call WrFileNR ( OutUnit, tab//IntOutput%WriteOutputHdr(i) ) + end do ! i + + write (OutUnit,'()') + + !...................................................... + ! Write the units of the output parameters on one line: + !...................................................... + + call WrFileNR ( OutUnit, '(s)' ) + + do i=1,NumOuts + call WrFileNR ( Outunit, tab//trim(IntOutput%WriteOutputUnt(i)) ) + end do ! i + + write (OutUnit,'()') + + +END SUBROUTINE Dvr_InitializeOutputFile + +!---------------------------------------------------------------------------------------------------------------------------------- +SUBROUTINE Dvr_WriteOutputLine(t,OutUnit, OutFmt, Output) + real(DbKi) , intent(in ) :: t ! simulation time (s) + integer(IntKi) , intent(in ) :: OutUnit ! Status of error message + character(*) , intent(in ) :: OutFmt + type(SlD_OutputType), intent(in ) :: Output + integer(IntKi) :: errStat ! Status of error message (we're going to ignore errors in writing to the file) + character(ErrMsgLen) :: errMsg ! Error message if ErrStat /= ErrID_None + character(200) :: frmt ! A string to hold a format specifier + character(15) :: tmpStr ! temporary string to print the time output as text + + frmt = '"'//tab//'"'//trim(OutFmt) ! format for array elements from individual modules + + ! time + write( tmpStr, '(F15.6)' ) t + call WrFileNR( OutUnit, tmpStr ) + call WrNumAryFileNR ( OutUnit, Output%WriteOutput, frmt, errStat, errMsg ) + + ! write a new line (advance to the next line) + write (OutUnit,'()') +end subroutine Dvr_WriteOutputLine + + +END MODULE SoilDyn_Driver_Subs diff --git a/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 new file mode 100644 index 0000000000..fe145586c4 --- /dev/null +++ b/modules/soildyn/src/driver/SoilDyn_Driver_Types.f90 @@ -0,0 +1,68 @@ +!********************************************************************************************************************************** +! +! MODULE: SlD_Driver_Types - This module contains types used by the SoilDyn Driver program to store arguments passed in +! +! The types listed here are used within the SoilDyn Driver program to store the settings. These settings are read in as +! command line arguments, then stored within these types. +! +!********************************************************************************************************************************** +! +!.................................................................................................................................. +! LICENSING +! Copyright (C) 2015 National Renewable Energy Laboratory +! +! This file is part of SoilDyn. +! +! SoilDyn is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as +! published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. +! +! This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty +! of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +! +! You should have received a copy of the GNU General Public License along with SoilDyn. +! If not, see . +! +!********************************************************************************************************************************** + +MODULE SoilDyn_Driver_Types + + USE NWTC_Library + USE SoilDyn_Types + + IMPLICIT NONE + + !> This contains flags to note if the settings were made. This same data structure is + !! used both during the driver input file and the command line options. + TYPE :: SlDDriver_Flags + LOGICAL :: DvrIptFile = .FALSE. !< Was an input file name given on the command line? + LOGICAL :: SlDIptFile = .FALSE. !< Was an SoilDyn input file requested? + LOGICAL :: InputDispFile = .FALSE. !< Input displacement time series + LOGICAL :: TStart = .FALSE. !< specified a start time + LOGICAL :: StiffMatOut = .FALSE. !< output stiffness matrices at start and finish + LOGICAL :: NumTimeSteps = .FALSE. !< specified a number of timesteps to process + LOGICAL :: NumTimeStepsDefault = .FALSE. !< specified a 'DEFAULT' for number of timesteps to process + LOGICAL :: DT = .FALSE. !< specified a resolution in time + LOGICAL :: DTDefault = .FALSE. !< specified a 'DEFAULT' for the time resolution + LOGICAL :: Verbose = .FALSE. !< Verbose error reporting + LOGICAL :: VVerbose = .FALSE. !< Very Verbose error reporting + LOGICAL :: SlDNonLinearForcePortionOnly = .FALSE. !< To only return the non-linear portion of the reaction force + END TYPE SlDDriver_Flags + + + ! This contains all the settings (possible passed in arguments). + TYPE :: SlDDriver_Settings + CHARACTER(1024) :: DvrIptFileName !< Driver input file name + CHARACTER(1024) :: SlDIptFileName !< Filename of SoilDyn input file to read (if no driver input file) + CHARACTER(1024) :: InputDispFile !< Filename of SoilDyn time series displacements + + INTEGER(IntKi) :: NumTimeSteps !< Number of timesteps + REAL(DbKi) :: DT !< resolution of time + REAL(DbKi) :: TStart !< Start time + + TYPE(ProgDesc) :: ProgInfo !< Program info + TYPE(ProgDesc) :: SlDProgInfo !< Program info for SoilDyn + + END TYPE SlDDriver_Settings + + +END MODULE SoilDyn_Driver_Types diff --git a/modules/subdyn/src/FEM.f90 b/modules/subdyn/src/FEM.f90 index 3e5d6113d2..f645c10c5c 100644 --- a/modules/subdyn/src/FEM.f90 +++ b/modules/subdyn/src/FEM.f90 @@ -33,162 +33,6 @@ MODULE FEM CONTAINS -!------------------------------------------------------------------------------------------------------ -!> Return eigenvalues, Omega, and eigenvectors - -SUBROUTINE EigenSolve(K, M, N, bCheckSingularity, EigVect, Omega, ErrStat, ErrMsg ) - USE NWTC_LAPACK, only: LAPACK_ggev - INTEGER , INTENT(IN ) :: N !< Number of degrees of freedom, size of M and K - REAL(LaKi), INTENT(INOUT) :: K(N, N) !< Stiffness matrix - REAL(LaKi), INTENT(INOUT) :: M(N, N) !< Mass matrix - LOGICAL, INTENT(IN ) :: bCheckSingularity ! If True, the solver will fail if rigid modes are present - REAL(LaKi), INTENT(INOUT) :: EigVect(N, N) !< Returned Eigenvectors - REAL(LaKi), INTENT(INOUT) :: Omega(N) !< Returned Eigenvalues - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - ! LOCALS - REAL(LaKi), ALLOCATABLE :: WORK (:), VL(:,:), AlphaR(:), AlphaI(:), BETA(:) ! eigensolver variables - INTEGER :: i - INTEGER :: LWORK !variables for the eigensolver - INTEGER, ALLOCATABLE :: KEY(:) - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - REAL(LaKi) :: normA - REAL(LaKi) :: Omega2(N) !< Squared eigenvalues - REAL(LaKi), parameter :: MAX_EIGENVALUE = HUGE(1.0_ReKi) ! To avoid overflow when switching to ReKi - - ErrStat = ErrID_None - ErrMsg = '' - - ! allocate working arrays and return arrays for the eigensolver - LWORK=8*N + 16 !this is what the eigensolver wants >> bjj: +16 because of MKL ?ggev documenation ( "lwork >= max(1, 8n+16) for real flavors"), though LAPACK documenation says 8n is fine - !bjj: there seems to be a memory problem in *GGEV, so I'm making the WORK array larger to see if I can figure it out - CALL AllocAry( Work, LWORK, 'Work', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') - CALL AllocAry( AlphaR, N, 'AlphaR', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') - CALL AllocAry( AlphaI, N, 'AlphaI', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') - CALL AllocAry( Beta, N, 'Beta', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') - CALL AllocAry( VL, N, N, 'VL', ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'EigenSolve') - CALL AllocAry( KEY, N, 'KEY', ErrStat2, ErrMsg2 ); if(Failed()) return - - ! --- Eigenvalue analysis - ! note: SGGEV seems to have memory issues in certain cases. The eigenvalues seem to be okay, but the eigenvectors vary wildly with different compiling options. - ! DGGEV seems to work better, so I'm making these variables LaKi (which is set to R8Ki for now) - bjj 4/25/2014 - ! bjj: This comes from the LAPACK documentation: - ! Note: the quotients AlphaR(j)/BETA(j) and AlphaI(j)/BETA(j) may easily over- or underflow, and BETA(j) may even be zero. - ! Thus, the user should avoid naively computing the ratio Alpha/beta. However, AlphaR and AlphaI will be always less - ! than and usually comparable with norm(A) in magnitude, and BETA always less than and usually comparable with norm(B). - ! Omega2=AlphaR/BETA !Note this may not be correct if AlphaI<>0 and/or BETA=0 TO INCLUDE ERROR CHECK, also they need to be sorted - CALL LAPACK_ggev('N','V',N ,K, M, AlphaR, AlphaI, Beta, VL, EigVect, WORK, LWORK, ErrStat2, ErrMsg2) - if(Failed()) return - - ! --- Determinign and sorting eigen frequencies - Omega2(:) =0.0_LaKi - DO I=1,N !Initialize the key and calculate Omega - KEY(I)=I - !Omega2(I) = AlphaR(I)/Beta(I) - if ( EqualRealNos(real(Beta(I),ReKi),0.0_ReKi) ) then - ! --- Beta =0 - if (bCheckSingularity) call WrScr('[WARN] Large eigenvalue found, system may be ill-conditioned') - Omega2(I) = MAX_EIGENVALUE - elseif ( EqualRealNos(real(AlphaI(I),ReKi),0.0_ReKi) ) THEN - ! --- Real Eigenvalues - IF ( AlphaR(I)<0.0_LaKi ) THEN - if ( (AlphaR(I)/Beta(I))<1e-6_LaKi ) then - ! Tolerating very small negative eigenvalues - if (bCheckSingularity) call WrScr('[INFO] Negative eigenvalue found with small norm (system may contain rigid body mode)') - Omega2(I)=0.0_LaKi - else - if (bCheckSingularity) call WrScr('[WARN] Negative eigenvalue found, system may be ill-conditioned.') - Omega2(I)=AlphaR(I)/Beta(I) - endif - else - Omega2(I) = AlphaR(I)/Beta(I) - endif - else - ! --- Complex Eigenvalues - normA = sqrt(AlphaR(I)**2 + AlphaI(I)**2) - if ( (normA/Beta(I))<1e-6_LaKi ) then - ! Tolerating very small eigenvalues with imaginary part - if (bCheckSingularity) call WrScr('[WARN] Complex eigenvalue found with small norm, approximating as 0') - Omega2(I) = 0.0_LaKi - elseif ( abs(AlphaR(I))>1e3_LaKi*abs(AlphaI(I)) ) then - ! Tolerating very small imaginary part compared to real part... (not pretty) - if (bCheckSingularity) call WrScr('[WARN] Complex eigenvalue found with small Im compare to Re') - Omega2(I) = AlphaR(I)/Beta(I) - else - if (bCheckSingularity) call WrScr('[WARN] Complex eigenvalue found with large imaginary value)') - Omega2(I) = MAX_EIGENVALUE - endif - !call Fatal('Complex eigenvalue found, system may be ill-conditioned'); return - endif - ! Capping to avoid overflow - if (Omega2(I)> MAX_EIGENVALUE) then - Omega2(I) = MAX_EIGENVALUE - endif - enddo - - ! Sorting. LASRT has issues for double precision 64 bit on windows - !CALL ScaLAPACK_LASRT('I',N,Omega2,KEY,ErrStat2,ErrMsg2); if(Failed()) return - CALL sort_in_place(Omega2,KEY) - - ! --- Sorting eigen vectors - ! KEEP ME: scaling of the eigenvectors using generalized mass =identity criterion - ! ALLOCATE(normcoeff(N,N), STAT = ErrStat ) - ! result1 = matmul(M,EigVect) - ! result2 = matmul(transpose(EigVect),result1) - ! normcoeff=sqrt(result2) !This should be a diagonal matrix which contains the normalization factors - ! normcoeff=sqrt(matmul(transpose(EigVect),matmul(M,EigVect))) !This should be a diagonal matrix which contains the normalization factors - VL=EigVect !temporary storage for sorting EigVect - DO I=1,N - !EigVect(:,I)=VL(:,KEY(I))/normcoeff(KEY(I),KEY(I)) !reordered and normalized - EigVect(:,I)=VL(:,KEY(I)) !just reordered as Huimin had a normalization outside of this one - ENDDO - !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++! - - ! --- Return Omega (capped by huge(ReKi)) and check for singularity - Omega(:) = 0.0_LaKi - do I=1,N - if (EqualRealNos(real(Omega2(I),ReKi), 0.0_ReKi)) then ! NOTE: may be necessary for some corner numerics - Omega(i)=0.0_LaKi - if (bCheckSingularity) then - call Fatal('Zero eigenvalue found, system may contain rigid body mode'); return - endif - elseif (Omega2(I)>0) then - Omega(i)=sqrt(Omega2(I)) - else - ! Negative eigenfrequency - print*,'>>> Wrong eigenfrequency, Omega^2=',Omega2(I) ! <<< This should never happen - Omega(i)= 0.0_LaKi - call Fatal('Negative eigenvalue found, system may be ill-conditioned'); return - endif - enddo - - CALL CleanupEigen() - RETURN - -CONTAINS - LOGICAL FUNCTION Failed() - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'EigenSolve') - Failed = ErrStat >= AbortErrLev - if (Failed) call CleanUpEigen() - END FUNCTION Failed - - SUBROUTINE Fatal(ErrMsg_in) - character(len=*), intent(in) :: ErrMsg_in - CALL SetErrStat(ErrID_Fatal, ErrMsg_in, ErrStat, ErrMsg, 'EigenSolve'); - CALL CleanUpEigen() - END SUBROUTINE Fatal - - SUBROUTINE CleanupEigen() - IF (ALLOCATED(Work) ) DEALLOCATE(Work) - IF (ALLOCATED(AlphaR)) DEALLOCATE(AlphaR) - IF (ALLOCATED(AlphaI)) DEALLOCATE(AlphaI) - IF (ALLOCATED(Beta) ) DEALLOCATE(Beta) - IF (ALLOCATED(VL) ) DEALLOCATE(VL) - IF (ALLOCATED(KEY) ) DEALLOCATE(KEY) - END SUBROUTINE CleanupEigen - -END SUBROUTINE EigenSolve pure subroutine sort_in_place(a,key) real(LaKi), intent(inout), dimension(:) :: a @@ -687,6 +531,8 @@ END SUBROUTINE CraigBamptonReduction_FromPartition !! Case1: K and M are taken "as is", this is used for the "LL" part of the matrix !! Case2: K and M contain some constraints lines, and they need to be removed from the Mass/Stiffness matrix. Used for full system SUBROUTINE EigenSolveWrap(K, M, nDOF, NOmega, bCheckSingularity, EigVect, Omega, ErrStat, ErrMsg, bDOF ) + USE NWTC_Num, only: EigenSolve + INTEGER, INTENT(IN ) :: nDOF ! Total degrees of freedom of the incoming system REAL(FEKi), INTENT(IN ) :: K(nDOF, nDOF) ! stiffness matrix REAL(FEKi), INTENT(IN ) :: M(nDOF, nDOF) ! mass matrix @@ -1586,7 +1432,6 @@ SUBROUTINE PseudoInverse(A, Ainv, ErrStat, ErrMsg) end do ! Compute Ainv = 1.0*V^t * U^t + 0.0*Ainv V*(inv(S))*U' !call DGEMM( 'T', 'T', N, M, K, 1.0, V, K, U, M, 0.0, Ainv, N) - print*,'8' call LAPACK_GEMM( 'T', 'T', 1.0_FEKi, Vt, U, 0.0_FEKi, Ainv, ErrStat, ErrMsg) ! --- Compute rank !tol=maxval(shape(A))*epsilon(maxval(S)) diff --git a/modules/subdyn/src/SD_FEM.f90 b/modules/subdyn/src/SD_FEM.f90 index 3816ff5a21..2b56d40019 100644 --- a/modules/subdyn/src/SD_FEM.f90 +++ b/modules/subdyn/src/SD_FEM.f90 @@ -24,7 +24,8 @@ MODULE SD_FEM INTEGER(IntKi), PARAMETER :: MaxMemJnt = 20 ! Maximum number of members at one joint - INTEGER(IntKi), PARAMETER :: nDOFL_TP = 6 !TODO rename me ! 6 degrees of freedom (length of u subarray [UTP]) + 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]), current used for output only. Need to update this to reflect multiple transition pieces. ! values of these parameters are ordered by their place in SubDyn input file: INTEGER(IntKi), PARAMETER :: JointsCol = 9 ! Number of columns in Joints (JointID, JointXss, JointYss, JointZss, JointType, JointDirX JointDirY JointDirZ JointStiff) @@ -77,8 +78,8 @@ MODULE SD_FEM ! Types of Guyan Damping INTEGER(IntKi), PARAMETER :: idGuyanDamp_None = 0 INTEGER(IntKi), PARAMETER :: idGuyanDamp_Rayleigh = 1 - INTEGER(IntKi), PARAMETER :: idGuyanDamp_66 = 2 - INTEGER(IntKi) :: idGuyanDamp_Valid(3) = (/idGuyanDamp_None, idGuyanDamp_Rayleigh, idGuyanDamp_66 /) + INTEGER(IntKi), PARAMETER :: idGuyanDamp_Matrix = 2 + INTEGER(IntKi) :: idGuyanDamp_Valid(3) = (/idGuyanDamp_None, idGuyanDamp_Rayleigh, idGuyanDamp_Matrix /) INTEGER(IntKi), PARAMETER :: SDMaxInpCols = MAX(JointsCol,InterfCol,MembersCol,PropSetsBCCol,PropSetsBRCol,PropSetsXCol,PropSetsSCol,COSMsCol,CMassCol) @@ -90,7 +91,7 @@ MODULE SD_FEM ! Implementation Flags LOGICAL, PARAMETER :: DEV_VERSION = .false. LOGICAL, PARAMETER :: BC_Before_CB = .true. - LOGICAL, PARAMETER :: ANALYTICAL_LIN = .true. + LOGICAL, PARAMETER :: ANALYTICAL_LIN = .false. ! Analytical linearization is no longer valid in general LOGICAL, PARAMETER :: GUYAN_RIGID_FLOATING = .true. @@ -242,17 +243,18 @@ END FUNCTION NodeHasRigidElem !! Typically called to get: !! - the transformation from the interface points to the TP point !! - the transformation from the bottom nodes to SubDyn origin (0,0,) -SUBROUTINE RigidTrnsf(Init, p, RefPoint, DOF, nDOF, T_ref, ErrStat, ErrMsg) +SUBROUTINE RigidTrnsf(Init, p, RefPoint, DOF, nDOF, nTP, T_ref, ErrStat, ErrMsg) TYPE(SD_InitType), INTENT(IN ) :: Init ! Input data for initialization routine TYPE(SD_ParameterType), INTENT(IN ) :: p - REAL(ReKi), INTENT(IN ) :: RefPoint(3) ! Coordinate of the reference point + REAL(ReKi), INTENT(IN ) :: RefPoint(3,*) ! Coordinate of the reference point INTEGER(IntKi), INTENT(IN ) :: nDOF ! Number of DOFS INTEGER(IntKi), INTENT(IN ) :: DOF(nDOF) ! DOF indices that are used to create the transformation matrix - REAL(ReKi), INTENT( OUT) :: T_ref(nDOF,6) ! matrix that relates the subset of DOFs to the reference point + INTEGER(IntKi), INTENT(IN ) :: nTP ! Number of transition pieces + REAL(ReKi), INTENT( OUT) :: T_ref(nDOF,6*nTP) ! matrix that relates the subset of DOFs to the reference point INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None ! local variables - INTEGER :: I, iDOF, iiDOF, iNode, nDOFPerNode + INTEGER :: I, iDOF, iiDOF, iNode, nDOFPerNode, iTP REAL(ReKi) :: dx, dy, dz REAL(ReKi), dimension(6) :: Line ErrStat = ErrID_None @@ -263,6 +265,11 @@ SUBROUTINE RigidTrnsf(Init, p, RefPoint, DOF, nDOF, T_ref, ErrStat, ErrMsg) iNode = p%DOFred2Nodes(iDOF,1) ! First column is node nDOFPerNode = p%DOFred2Nodes(iDOF,2) ! Second column is number of DOF per node iiDOF = p%DOFred2Nodes(iDOF,3) ! Third column is dof index for this joint (1-6 for cantilever) + if (nTP==1) then + iTP = 1 + else + iTP = p%TPIdx(FINDLOCI(p%Nodes_I(:,1),iNode)) + endif if ((iiDOF<1) .or. (iiDOF>6)) then ErrMsg = 'RigidTrnsf, node DOF number is not valid. DOF:'//trim(Num2LStr(iDOF))//' Node:'//trim(Num2LStr(iNode))//' iiDOF:'//trim(Num2LStr(iiDOF)); ErrStat = ErrID_Fatal @@ -272,13 +279,17 @@ SUBROUTINE RigidTrnsf(Init, p, RefPoint, DOF, nDOF, T_ref, ErrStat, ErrMsg) ErrMsg = 'RigidTrnsf, node doesnt have 6 DOFs. DOF:'//trim(Num2LStr(iDOF))//' Node:'//trim(Num2LStr(iNode))//' nDOF:'//trim(Num2LStr(nDOFPerNode)); ErrStat = ErrID_Fatal return endif + if (iTP<1) then + ErrMsg = 'RigidTrnsf, interface node not attached to any transition piece. Node:'//trim(Num2LStr(iNode)); ErrStat = ErrID_Fatal + return + endif - dx = Init%Nodes(iNode, 2) - RefPoint(1) - dy = Init%Nodes(iNode, 3) - RefPoint(2) - dz = Init%Nodes(iNode, 4) - RefPoint(3) + dx = Init%Nodes(iNode, 2) - RefPoint(1,iTP) + dy = Init%Nodes(iNode, 3) - RefPoint(2,iTP) + dz = Init%Nodes(iNode, 4) - RefPoint(3,iTP) CALL RigidTransformationLine(dx,dy,dz,iiDOF,Line) !returns Line - T_ref(I, 1:6) = Line + T_ref(I, (6*iTP-5):(6*iTP)) = Line ENDDO END SUBROUTINE RigidTrnsf @@ -864,7 +875,7 @@ END SUBROUTINE SetNewPropBR END SUBROUTINE SD_Discrt -!> Store relative vector between nodes and TP point, to later compute Guyan rigid body motion +!> Store relative vector between nodes and the first TP point, to later compute Guyan rigid body motion subroutine StoreNodesRelPos(Init, p, ErrStat, ErrMsg) type(SD_InitType), intent(in ) :: Init type(SD_ParameterType), intent(inout) :: p @@ -880,9 +891,9 @@ subroutine StoreNodesRelPos(Init, p, ErrStat, ErrMsg) call AllocAry(p%DP0, 3, size(Init%Nodes,1), 'DP0', ErrStat2, ErrMsg2); if(Failed()) return do i = 1, size(Init%Nodes,1) - p%DP0(1, i) = Init%Nodes(i, 2) - Init%TP_RefPoint(1) - p%DP0(2, i) = Init%Nodes(i, 3) - Init%TP_RefPoint(2) - p%DP0(3, i) = Init%Nodes(i, 4) - Init%TP_RefPoint(3) + p%DP0(1, i) = Init%Nodes(i, 2) - Init%TP_RefPoint(1,1) + p%DP0(2, i) = Init%Nodes(i, 3) - Init%TP_RefPoint(2,1) + p%DP0(3, i) = Init%Nodes(i, 4) - Init%TP_RefPoint(3,1) enddo contains @@ -1341,13 +1352,22 @@ SUBROUTINE CheckBCs(p, ErrStat, ErrMsg) END SUBROUTINE CheckBCs !> Check interface inputs, and remap 0s and 1s -SUBROUTINE CheckIntf(p, ErrStat, ErrMsg) +SUBROUTINE CheckIntf(p, TPIdxInput, RB_RefJoint, ErrStat, ErrMsg) TYPE(SD_ParameterType),INTENT(INOUT) :: p + INTEGER(IntKi), INTENT(INOUT) :: TPIdxInput(:) + INTEGER(IntKi), INTENT( OUT) :: RB_RefJoint INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None - INTEGER(IntKi) :: I, J, iNode + INTEGER(IntKi) :: I, J, iNode, iFound, TPIDOffset + LOGICAL, ALLOCATABLE :: TPExist(:) + LOGICAL :: TP1NodeFound ErrMsg = "" ErrStat = ErrID_None + + call AllocAry(TPExist,p%nNodes_I,'TPExist',ErrStat,ErrMsg); if (ErrStat/=ErrID_None) return; + TPExist = .FALSE. + p%nTP = -1; + DO I = 1, p%nNodes_I iNode = p%Nodes_I(I,1) ! Node index DO J = 1, 6 ! ItfTDXss ItfTDYss ItfTDZss ItfRDXss ItfRDYss ItfRDZss @@ -1363,6 +1383,70 @@ SUBROUTINE CheckIntf(p, ErrStat, ErrMsg) endif ENDDO ENDDO + + TPIDOffset = 0 + DO I = 1, p%nNodes_I + IF ( TPIdxInput(I) == 0 ) THEN + TPIDOffset = 1 + EXIT + END IF + ENDDO + TPIdxInput = TPIdxInput + TPIDOffset + + DO I = 1, p%nNodes_I + iNode = p%Nodes_I(I,1) ! Node index + if ( (TPIdxInput(I)<=0) .or. (TPIdxInput(I)>p%nNodes_I) ) then + ErrStat = ErrID_Fatal + ErrMsg = 'Transition-piece index must be sequential starting from 0 (floating with multiple transition pieces) or 1 (all other cases), check interface node:'//trim(Num2LStr(iNode)) + return + else + if (TPIdxInput(I)>p%nTP) p%nTP = TPIdxInput(I) + TPExist(TPIdxInput(I)) = .TRUE. + p%TPIdx(I) = TPIdxInput(I) + endif + ENDDO + + DO I = 1,p%nTP + if (.not.TPExist(I)) then + ErrStat = ErrID_Fatal + ErrMsg = 'Transition-piece index must be sequential starting from 0 (floating with multiple transition pieces) or 1 (all other cases), missing reference to transition piece '//trim(Num2LStr(I-TPIDOffset)) + return + end if + ENDDO + + p%nDOFRB = 0 + if (p%Floating .and. (p%nTP>1)) then + p%TP1IsRBRefPt = .true. + p%nDOFRB = 6 + if (TPIDOffset == 0) then + ErrStat = ErrID_Fatal + ErrMsg = 'For a floating structure with more than one transition pieces, must have one and only one interface joint assigned to the dummy transition piece (TPID=0) used to represent rigid-body motion. ' + return + end if + else + p%TP1IsRBRefPt = .false. + end if + + TP1NodeFound = .false. + if (p%TP1IsRBRefPt) then + do I = 1, p%nNodes_I + if (p%TPIdx(I) == 1) then + if (.not.TP1NodeFound) then + TP1NodeFound = .true. + RB_RefJoint = p%Nodes_I(I,1) + else + ErrStat = ErrID_Fatal + ErrMsg = ' Only one joint can be assigned to the dummy transition piece (TPID=0) serving as the rigid-body reference point for the floating structure. ' + return + end if + end if + end do + else + RB_RefJoint = -1 + endif + + deallocate(TPExist) + END SUBROUTINE CheckIntf @@ -2492,8 +2576,12 @@ logical function isFloating(Init, p) type(SD_InitType), intent(in ):: Init type(SD_ParameterType),intent(in ) :: p integer(IntKi) :: i - !isFloating=size(p%Nodes_C)>0 isFloating=.True. + ! If soil stiffness is provided by SoilDyn, return false + if (allocated(Init%Soil_K)) then + isFloating=.false. + return + end if do i =1,size(p%Nodes_C,1) if ((all(p%Nodes_C(I,2:7)==idBC_Internal)) .and. (Init%SSIfile(i)=='')) then continue diff --git a/modules/subdyn/src/SubDyn.f90 b/modules/subdyn/src/SubDyn.f90 index dda4c7b05b..ef7ae276ba 100644 --- a/modules/subdyn/src/SubDyn.f90 +++ b/modules/subdyn/src/SubDyn.f90 @@ -25,7 +25,6 @@ Module SubDyn USE NWTC_Library USE SubDyn_Types - USE SubDyn_Output_Params, only: MaxOutPts USE SubDyn_Output USE SubDyn_Tests USE SD_FEM @@ -47,44 +46,61 @@ Module SubDyn PUBLIC :: SD_JacobianPInput ! PUBLIC :: SD_JacobianPDiscState ! PUBLIC :: SD_JacobianPConstrState ! - PUBLIC :: SD_GetOP ! PUBLIC :: SD_ProgDesc CONTAINS -SUBROUTINE CreateTPMeshes( TP_RefPoint, inputMesh, outputMesh, ErrStat, ErrMsg ) - REAL(ReKi), INTENT( IN ) :: TP_RefPoint(3) - TYPE(MeshType), INTENT( INOUT ) :: inputMesh ! u%TPMesh - TYPE(MeshType), INTENT( INOUT ) :: outputMesh ! y%Y1Mesh +SUBROUTINE CreateTPMeshes( nTP, TP_RefPoint, inputMesh, outputMesh, ErrStat, ErrMsg ) + INTEGER(IntKi), INTENT( IN ) :: nTP + REAL(ReKi), INTENT( IN ) :: TP_RefPoint(3,nTP) + TYPE(MeshType),ALLOCATABLE,INTENT( INOUT ) :: inputMesh(:) ! u%TPMesh + TYPE(MeshType),ALLOCATABLE,INTENT( INOUT ) :: outputMesh(:) ! y%Y1Mesh INTEGER(IntKi), INTENT( OUT) :: ErrStat ! Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None + INTEGER(IntKi) :: i + + Allocate(inputMesh(nTP), STAT=ErrStat) + IF (ErrStat/=0) THEN + ErrStat = ErrID_FATAL + return + END IF + Allocate(outputMesh(nTP), STAT=ErrStat) + IF (ErrStat/=0) THEN + ErrStat = ErrID_FATAL + return + END IF + ! NOTE: The initialization of the fields for these meshes is to be handled by FAST/Driver - CALL MeshCreate( BlankMesh = inputMesh & - ,IOS = COMPONENT_INPUT & - ,Nnodes = 1 & - ,ErrStat = ErrStat & - ,ErrMess = ErrMsg & - ,TranslationDisp = .TRUE. & - ,Orientation = .TRUE. & - ,TranslationVel = .TRUE. & - ,RotationVel = .TRUE. & - ,TranslationAcc = .TRUE. & - ,RotationAcc = .TRUE. ) - ! Create the node and mesh element, note: assumes identiy matrix as reference orientation - CALL MeshPositionNode (inputMesh, 1, TP_RefPoint, ErrStat, ErrMsg); IF(ErrStat>=AbortErrLev) return - CALL MeshConstructElement(inputMesh, ELEMENT_POINT, ErrStat, ErrMsg, 1) - CALL MeshCommit( inputMesh, ErrStat, ErrMsg); if(ErrStat >= AbortErrLev) return + do i = 1,nTP + CALL MeshCreate( BlankMesh = inputMesh(i) & + ,IOS = COMPONENT_INPUT & + ,Nnodes = 1 & + ,ErrStat = ErrStat & + ,ErrMess = ErrMsg & + ,TranslationDisp = .TRUE. & + ,Orientation = .TRUE. & + ,TranslationVel = .TRUE. & + ,RotationVel = .TRUE. & + ,TranslationAcc = .TRUE. & + ,RotationAcc = .TRUE. ) + + ! Create the node and mesh element, note: assumes identiy matrix as reference orientation + CALL MeshPositionNode (inputMesh(i), 1, TP_RefPoint(:,i), ErrStat, ErrMsg); IF(ErrStat>=AbortErrLev) return + CALL MeshConstructElement(inputMesh(i), ELEMENT_POINT, ErrStat, ErrMsg, 1); IF(ErrStat>=AbortErrLev) return + CALL MeshCommit( inputMesh(i), ErrStat, ErrMsg); if(ErrStat >= AbortErrLev) return - ! Create the Transition Piece reference point output mesh as a sibling copy of the input mesh - CALL MeshCopy ( SrcMesh = inputMesh & - ,DestMesh = outputMesh & - ,CtrlCode = MESH_SIBLING & - ,IOS = COMPONENT_OUTPUT & - ,ErrStat = ErrStat & - ,ErrMess = ErrMsg & - ,Force = .TRUE. & - ,Moment = .TRUE. ) + ! Create the Transition Piece reference point output mesh as a sibling copy of the input mesh + CALL MeshCopy ( SrcMesh = inputMesh(i) & + ,DestMesh = outputMesh(i) & + ,CtrlCode = MESH_SIBLING & + ,IOS = COMPONENT_OUTPUT & + ,ErrStat = ErrStat & + ,ErrMess = ErrMsg & + ,Force = .TRUE. & + ,Moment = .TRUE. ) + enddo + END SUBROUTINE CreateTPMeshes !--------------------------------------------------------------------------- !> Create output (Y2, for motion) and input (u, for forces)meshes, based on SubDyn nodes @@ -219,8 +235,7 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO endif ! transfer glue-code information to data structure for SubDyn initialization: - Init%g = InitInput%g - Init%TP_RefPoint = InitInput%TP_RefPoint + Init%g = InitInput%g Init%SubRotateZ = InitInput%SubRotateZ Init%RootName = InitInput%RootName if ((allocated(InitInput%SoilStiffness)) .and. (InitInput%SoilMesh%Initialized)) then @@ -257,11 +272,28 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO ! Parse the SubDyn inputs CALL SD_Input(InitInput%SDInputFile, Init, p, ErrStat2, ErrMsg2); if(Failed()) return if (p%Floating) then - call WrScr(' Floating case detected, Guyan modes will be rigid body modes') + call WrScr(' Floating case detected') else call WrScr(' Fixed bottom case detected') endif + ! Check transition-piece reference points from the glue-code or SD driver + if (p%TP1IsRBRefPt) then + ! If the first transition piece is a dummy one used as the rigid-body reference point + Init%nTP = InitInput%nTP + 1 + call AllocAry(Init%TP_RefPoint, 3, Init%nTP, 'TP_RefPoint', ErrStat2, ErrMsg2); if(Failed()) return + Init%TP_RefPoint(1:3,1) = Init%Joints(FINDLOCI(Init%Joints(:,1),Init%RB_RefJoint),2:4) + Init%TP_RefPoint(1:3,2:Init%nTP) = InitInput%TP_RefPoint + else + Init%nTP = InitInput%nTP + Init%TP_RefPoint = InitInput%TP_RefPoint + endif + if (Init%nTP/=p%nTP) then + ErrStat2=ErrID_Fatal + ErrMsg2=' SD Error: The number of transition pieces referenced by the interface nodes does not match that from the glue-code or SubDyn driver input file. ' + endif + if(Failed()) return + ! -------------------------------------------------------------------------------- ! --- Manipulation of Init and parameters ! -------------------------------------------------------------------------------- @@ -308,12 +340,10 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO ! Nodes into (I,C,L,R): I=Interface ,C=Boundary (bottom), R=(I+C), L=Interior ! DOFs into (B,F,L): B=Leader (i.e. Rbar) ,F=Fixed, L=Interior call PartitionDOFNodes(Init, m, p, ErrStat2, ErrMsg2) ; if(Failed()) return - if (p%GuyanLoadCorrection) then - if (p%Floating) then - call WrScr(' Guyan extra moment and rotated CB-frame will be used (floating case detected)') - else - call WrScr(' Guyan extra moment will be included in loads (fixed-bottom case detected)') - endif + if (p%Floating) then + call WrScr(' Guyan extra moment and rotated CB-frame will be used (floating case detected)') + else + call WrScr(' Guyan extra moment will be included in loads (fixed-bottom case detected)') endif ! --- Craig-Bampton reduction (sets many parameters) @@ -328,6 +358,14 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO x%qmdot = 0.0_ReKi m%qmdotdot= 0.0_ReKi END IF + IF ( p%TP1IsRBRefPt ) THEN + CALL AllocAry(x%qR, 6, 'x%qR', ErrStat2, ErrMsg2 ); if(Failed()) return + CALL AllocAry(x%qRdot, 6, 'x%qRdot', ErrStat2, ErrMsg2 ); if(Failed()) return + CALL AllocAry(m%qRdotdot, 6, 'm%qRdotdot', ErrStat2, ErrMsg2 ); if(Failed()) return + x%qR = Init%qR0 + x%qRdot = 0.0_ReKi + m%qRdotdot= 0.0_ReKi + END IF xd%DummyDiscState = 0.0_ReKi z%DummyConstrState = 0.0_ReKi @@ -345,12 +383,41 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO ! Allocate miscellaneous variables, used only to avoid temporary copies of variables allocated/deallocated and sometimes recomputed each time CALL AllocMiscVars(p, m, ErrStat2, ErrMsg2); if(Failed()) return - + + ! Copy initial platform displacement and floating flag to initialization output + InitOut%IsFloating = p%Floating + InitOut%SDHasRBDoF = p%TP1IsRBRefPt + IF ( p%TP1IsRBRefPt ) THEN + InitOut%PlatformPos(4:6) = Init%qR0(4:6) + InitOut%PlatformPos(1:3) = Init%qR0(1:3) + p%RBRefPt - matmul( p%RBRefPt, EulerConstructZYX(Init%qR0(4:6)) ) + END IF + ! -------------------------------------------------------------------------------- ! --- Initialize Inputs and Outputs ! -------------------------------------------------------------------------------- + ! Create the rigid-body reference point mesh (Y0Mesh) + CALL MeshCreate( BlankMesh = y%Y0Mesh & + ,IOS = COMPONENT_OUTPUT & + ,Nnodes = 1 & + ,ErrStat = ErrStat2 & + ,ErrMess = ErrMsg2 & + ,TranslationDisp = .TRUE. & + ,Orientation = .TRUE. & + ,TranslationVel = .TRUE. & + ,RotationVel = .TRUE. & + ,TranslationAcc = .TRUE. & + ,RotationAcc = .TRUE. ) + if(Failed()) return + CALL MeshPositionNode (y%Y0Mesh, 1, p%RBRefPt, ErrStat2, ErrMsg2); if(Failed()) return + CALL MeshConstructElement(y%Y0Mesh, ELEMENT_POINT, ErrStat2, ErrMsg2, 1); if(Failed()) return + CALL MeshCommit( y%Y0Mesh, ErrStat2, ErrMsg2); if(Failed()) return + ! Create the input and output meshes associated with Transition Piece reference point - CALL CreateTPMeshes( InitInput%TP_RefPoint, u%TPMesh, y%Y1Mesh, ErrStat2, ErrMsg2 ); if(Failed()) return + if (p%TP1IsRBRefPt) then + CALL CreateTPMeshes( p%nTP-1, Init%TP_RefPoint(:,2:p%nTP), u%TPMesh, y%Y1Mesh, ErrStat2, ErrMsg2 ); if(Failed()) return + else + CALL CreateTPMeshes( p%nTP, Init%TP_RefPoint, u%TPMesh, y%Y1Mesh, ErrStat2, ErrMsg2 ); if(Failed()) return + end if ! Construct the input mesh (u%LMesh, force on nodes) and output mesh (y%Y2Mesh, displacements) CALL CreateInputOutputMeshes( p%nNodes, Init%Nodes, u%LMesh, y%Y2Mesh, y%Y3Mesh, ErrStat2, ErrMsg2 ); if(Failed()) return @@ -360,7 +427,7 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO ! Compute the vector from reference point P to rigid-body CoG for floating structures ! Set TI2, transformation matrix from R DOFs to SubDyn Origin CALL AllocAry( TI2, p%nDOFR__ , 6, 'TI2', ErrStat2, ErrMsg2 ); if(Failed()) return - CALL RigidTrnsf(Init, p, (/0._ReKi, 0._ReKi, 0._ReKi/), p%IDR__, p%nDOFR__, TI2, ErrStat2, ErrMsg2); if(Failed()) return + CALL RigidTrnsf(Init, p, (/0._ReKi, 0._ReKi, 0._ReKi/), p%IDR__, p%nDOFR__, 1_IntKi, TI2, ErrStat2, ErrMsg2); if(Failed()) return ! Compute Rigid body mass matrix (without Soil, and using both Interface and Reactions nodes as leader DOF) if (p%nDOFR__/=p%nDOF__Rb) then call SD_Guyan_RigidBodyMass(Init, p, MBB, ErrStat2, ErrMsg2); if(Failed()) return @@ -375,7 +442,7 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO M_O(3,1:2)= 0.0_ReKi; M_O(3,6 )= 0.0_ReKi M_O(4,1 )= 0.0_ReKi; M_O(5,2 )= 0.0_ReKi; M_O(6,3 )= 0.0_ReKi; CALL rigidBodyMassMatrixCOG(M_O, rOG); - p%rPG = rOG-InitInput%TP_RefPoint + p%rPG = rOG-Init%TP_RefPoint(1:3,1) END IF ! --- Eigen values of full system (for summary file output only) @@ -417,9 +484,9 @@ SUBROUTINE SD_Init( InitInput, u, p, x, xd, z, OtherState, y, m, Interval, InitO CALL SDOUT_OpenOutput( SD_ProgDesc, Init%RootName, p, InitOut, ErrStat2, ErrMsg2 ); if(Failed()) return END IF - if (InitInput%Linearize) then - call SD_Init_Jacobian(Init, p, u, y, InitOut, ErrStat2, ErrMsg2); if(Failed()) return - endif + ! Initialize module variables + call SD_InitVars(InitOut%Vars, Init, u, p, x, y, m, InitOut, InitInput%Linearize .or. (p%IntMethod .eq. 4), ErrStat2, ErrMsg2); if(Failed()) return + call NWTC_Library_CopyModVarsType(InitOut%Vars, p%Vars, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return ! Tell GLUECODE the SubDyn timestep interval Interval = p%SDdeltaT @@ -444,6 +511,119 @@ END SUBROUTINE CleanUp END SUBROUTINE SD_Init +!---------------------------------------------------------------------------------------------------------------------------------- +!> SD_InitVars initializes the variables for this module for use by the solver and linearization +subroutine SD_InitVars(Vars, Init, u, p, x, y, m, InitOut, Linearize, ErrStat, ErrMsg) + type(ModVarsType), intent(out) :: Vars !< Module variables + type(SD_InitType), intent(in) :: Init !< Input data for initialization routine + type(SD_InputType), intent(inout) :: u !< An initial guess for the input; input mesh must be defined + type(SD_ParameterType), intent(inout) :: p !< Parameters + type(SD_ContinuousStateType), intent(inout) :: x !< Continuous State + type(SD_OutputType), intent(inout) :: y !< Initial system outputs (outputs are not calculated; + type(SD_MiscVarType), intent(inout) :: m !< Misc variables for optimization (not copied in glue code) + type(SD_InitOutputType), intent(inout) :: InitOut !< Output for initialization routine + logical, intent(in) :: Linearize !< Flag to initialize linearization variables + integer(IntKi), intent(out) :: ErrStat !< Error status of the operation + character(*), intent(out) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + character(*), parameter :: RoutineName = 'Init_ModuleVars' + INTEGER(IntKi) :: ErrStat2 ! Temporary Error status + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Temporary Error message + + integer(IntKi) :: i, j + real(R8Ki) :: dx, dy, dz, maxDim + + !---------------------------------------------------------------------------- + ! Continuous State Variables + !---------------------------------------------------------------------------- + call MV_AddVar(Vars%x, "RBMotion", FieldScalar, DatLoc(SD_x_qR), & + Num=p%nDOFRB, & + DerivOrder=0, & + Perturb=2.0_ReKi*D2R_D, & + LinNames=[('Rigid-body mode '//trim(num2lstr(i))//' displacement, m or rad', i=1, p%nDOFRB)]) + + call MV_AddVar(Vars%x, "RBMotion", FieldScalar, DatLoc(SD_x_qRdot), & + Num=p%nDOFRB, & + DerivOrder=1, & + Perturb=2.0_ReKi*D2R_D, & + LinNames=[('First time derivative of rigid-body mode '//trim(num2lstr(i))//' displacement, (m or rad)/s', i=1, p%nDOFRB)]) + + call MV_AddVar(Vars%x, "Modes", FieldScalar, DatLoc(SD_x_qm), & + Num=p%nDOFM, & + DerivOrder=0, & + Perturb=2.0_ReKi*D2R_D, & + LinNames=[('Craig-Bampton mode '//trim(num2lstr(i))//' amplitude, -', i=1, p%nDOFM)]) + + call MV_AddVar(Vars%x, "Modes", FieldScalar, DatLoc(SD_x_qmdot), & + Num=p%nDOFM, & + DerivOrder=1, & + Perturb=2.0_ReKi*D2R_D, & + LinNames=[('First time derivative of Craig-Bampton mode '//trim(num2lstr(i))//' amplitude, -/s', i=1, p%nDOFM)]) + + !---------------------------------------------------------------------------- + ! Input variables + !---------------------------------------------------------------------------- + + dx = maxval(Init%Nodes(:,2))- minval(Init%Nodes(:,2)) + dy = maxval(Init%Nodes(:,3))- minval(Init%Nodes(:,3)) + dz = maxval(Init%Nodes(:,4))- minval(Init%Nodes(:,4)) + maxDim = max(dx, dy, dz) + + do i = 1, size(u%TPMesh) + call MV_AddMeshVar(Vars%u, "TPMesh"//trim(Num2Lstr(i)), MotionFields, DatLoc(SD_u_TPMesh, i), & + Mesh=u%TPMesh(i), & + Perturbs=[2.0_R8Ki*D2R_D, & ! TranslationDisp + 2.0_R8Ki*D2R_D, & ! Orientation + 2.0_R8Ki*D2R_D, & ! TranslationVel + 2.0_R8Ki*D2R_D, & ! RotationVel + 2.0_R8Ki*D2R_D, & ! TranslationAcc + 2.0_R8Ki*D2R_D]) ! RotationAcc + enddo + + call MV_AddMeshVar(Vars%u, "LMesh", LoadFields, DatLoc(SD_u_LMesh), & + Mesh=u%LMesh, & + Perturbs=[170*maxDim**2, 14*maxDim**3]) ! Force, Moment + + !---------------------------------------------------------------------------- + ! Output variables + !---------------------------------------------------------------------------- + + ! Mesh variables + call MV_AddMeshVar(Vars%y, 'Y0Mesh', MotionFields, DatLoc(SD_y_Y0Mesh), Mesh=y%Y0Mesh) + do i = 1,size(y%Y1Mesh) + call MV_AddMeshVar(Vars%y, 'Y1Mesh'//trim(Num2Lstr(i)), LoadFields, DatLoc(SD_y_Y1Mesh,i), Mesh=y%Y1Mesh(i)) + enddo + call MV_AddMeshVar(Vars%y, 'Y2Mesh', MotionFields, DatLoc(SD_y_Y2Mesh), Mesh=y%Y2Mesh) + call MV_AddMeshVar(Vars%y, 'Y3Mesh', MotionFields, DatLoc(SD_y_Y3Mesh), Mesh=y%Y3Mesh) + + ! Output variables + call MV_AddVar(Vars%y, "WriteOutput", FieldScalar, DatLoc(SD_y_WriteOutput), & + Num=p%NumOuts, & + Flags=VF_WriteOut, & + LinNames=[(WriteOutputLinName(i), i = 1, p%numOuts)]) + + !---------------------------------------------------------------------------- + ! Initialize Variables and Values + !---------------------------------------------------------------------------- + + CALL MV_InitVarsJac(Vars, m%Jac, Linearize, ErrStat2, ErrMsg2); if (Failed()) return + + call SD_CopyContState(x, m%x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SD_CopyContState(x, m%dxdt_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SD_CopyInput(u, m%u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + call SD_CopyOutput(y, m%y_lin, MESH_NEWCOPY, ErrStat2, ErrMsg2); if (Failed()) return + +contains + character(LinChanLen) function WriteOutputLinName(idx) + integer(IntKi), intent(in) :: idx + WriteOutputLinName = trim(InitOut%WriteOutputHdr(idx))//', '//trim(InitOut%WriteOutputUnt(idx)) + end function + logical function Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev + end function Failed +end subroutine + !---------------------------------------------------------------------------------------------------------------------------------- !> Loose coupling routine for solving for constraint states, integrating continuous states, and updating discrete and other states. !! Continuous, discrete, constraint, and other states are updated for t + Interval. @@ -468,7 +648,7 @@ SUBROUTINE SD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m ErrStat = ErrID_None ! no error has occurred ErrMsg = "" - IF ( p%nDOFM == 0) RETURN ! no retained modes = no states + IF ( p%nDOFM == 0 .and. (.not.p%TP1IsRBRefPt) ) RETURN ! no retained modes = no states IF (p%IntMethod .eq. 1) THEN CALL SD_RK4( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) @@ -482,6 +662,142 @@ SUBROUTINE SD_UpdateStates( t, n, Inputs, InputTimes, p, x, xd, z, OtherState, m END SUBROUTINE SD_UpdateStates +!---------------------------------------------------------------------------------------------------------------------------------- +!> Routine for solving the combined equations of motion. +SUBROUTINE SD_SolveEOM( t, u, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) + REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds + TYPE(SD_InputType), INTENT(IN ) :: u !< Inputs at t + TYPE(SD_ParameterType),target,INTENT(IN ) :: p !< Parameters + TYPE(SD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t + TYPE(SD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t + TYPE(SD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at t + TYPE(SD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at t + TYPE(SD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + + REAL(ReKi) :: F_I(6*p%nNodes_I), F_TP1(6) + REAL(R8Ki), dimension(3,3) :: Rg2b, Rb2g + REAL(R8Ki), dimension(3,3) :: tmp + REAL(ReKi) :: qRR, qRP, qRY, qRRdot, qRPdot, qRYdot + REAL(R8Ki), dimension(6) :: EOM_RHS + REAL(R8Ki), ALLOCATABLE :: tmpInv(:,:) + INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None + + ! Initialize ErrStat + ErrStat = ErrID_None + ErrMsg = "" + + call GetUTP(u,p,x,m,ErrStat2,ErrMsg2,bPrime=(.true.)); if(Failed()) return + call GetExtForceOnInternalDOF(u, p, x, m, m%F_L, ErrStat2, ErrMsg2, ExtraMoment=(.not.p%Floating), RotateLoads=(p%Floating)); if(Failed()) return + + if (p%Floating) then ! Floating structure: everything is in the rigid-body frame + + if (p%TP1IsRBRefPt) then ! More than one transition piece + + call GetExtForceOnInterfaceDOF(p, m, F_I) + + F_TP1 = matmul( F_I, p%TI(:,1:6) ) & + - matmul(p%D1_142(1:6,:), m%F_L ) ! p%D1_142 is -matmul( T_I^T, Phi_Rb^T ) + + EOM_RHS = matmul( p%EOM_RHS1_1 , m%Udotdot_TP(7:p%nDOFL_TP) ) & + + matmul( p%EOM_RHS1_2 , m%Udot_TP (7:p%nDOFL_TP) ) & + + matmul( p%EOM_RHS1_3 , m%U_TP (7:p%nDOFL_TP) ) & + + F_TP1 + EOM_RHS(1:3) = EOM_RHS(1:3) - p%MBB(1,1)*cross_product(m%udot_TP(4:6),cross_product(m%udot_TP(4:6),p%rPG)) + EOM_RHS(4:6) = EOM_RHS(4:6) - cross_product(m%udot_TP(4:6),matmul(p%MBB(4:6,4:6),m%udot_TP(4:6))) + if (p%nDOFM>0) then + EOM_RHS = EOM_RHS & + + matmul( p%EOM_RHS1_4, x%qmdot ) & + + matmul( p%EOM_RHS1_5, x%qm ) & + + matmul( p%EOM_RHS1_6, matmul( m%F_L, p%PhiM ) ) + end if + + ! Rigid-body translational and angular acceleration in rigid-body frame + m%Udotdot_TP(1:6) = matmul( p%EOM_LHS1 , EOM_RHS ) + + m%F_TP(1:6) = F_TP1 ! Likely not needed, but good for completeness + m%F_TP(7:p%nDOFL_TP) = matmul( p%EOM_RHS3_1 , m%Udotdot_TP(1:6) ) & + + matmul( p%MBB(7:p%nDOFL_TP,7:p%nDOFL_TP) , m%Udotdot_TP(7:p%nDOFL_TP) ) & + + matmul( p%CBB(7:p%nDOFL_TP,7:p%nDOFL_TP) , m%Udot_TP(7:p%nDOFL_TP) ) & + + matmul( p%KBB(7:p%nDOFL_TP,7:p%nDOFL_TP) , m%U_TP(7:p%nDOFL_TP) ) + + if (p%nDOFM>0) then + m%qmdotdot = matmul( p%EOM_RHS2_1 , m%Udotdot_TP(1:6) ) & + - matmul( p%MmB(:,7:p%nDOFL_TP) , m%Udotdot_TP(7:p%nDOFL_TP) ) & + - p%CMMDiag * x%qmdot & + - p%KMMDiag * x%qm & + + matmul( m%F_L, p%PhiM ) + m%F_TP(7:p%nDOFL_TP) = m%F_TP(7:p%nDOFL_TP) + matmul( p%MBm(7:p%nDOFL_TP,:) , m%qmdotdot ) + end if + + ! Second time derivatives of rigid-body states + Rb2g = transpose(EulerConstructZYX(x%qR(4:6))) + m%qRdotdot(1:3) = matmul(Rb2g,m%Udotdot_TP(1:3)) ! Translational acceleration in earth-fixed frame + ! Second time derivatives for Tait-Bryan angles + qRR = x%qR(4) + qRP = x%qR(5) + qRY = x%qR(6) + qRRdot = x%qRdot(4) + qRPdot = x%qRdot(5) + qRYdot = x%qRdot(6) + tmp(1,1:3) = (/ cos(qRP)*cos(qRY), -sin(qRY), 0.0/) + tmp(2,1:3) = (/ cos(qRP)*sin(qRY), cos(qRY), 0.0/) + tmp(3,1:3) = (/-sin(qRP) , 0.0, 1.0/) + call PseudoInverse(tmp, tmpInv, ErrStat2, ErrMsg2); if (Failed()) return + m%qRdotdot(4:6) = matmul( tmpInv, matmul(Rb2g,m%Udotdot_TP(4:6)) - & + (/ -qRPdot*qRYdot*cos(qRY) - qRRdot*(qRPdot*sin(qRP)*cos(qRY)+qRYdot*cos(qRP)*sin(qRY)), & + -qRPdot*qRYdot*sin(qRY) - qRRdot*(qRPdot*sin(qRP)*sin(qRY)-qRYdot*cos(qRP)*cos(qRY)), & + -qRPdot*qRRdot*cos(qRP) /) ) + if (allocated(tmpInv)) deallocate(tmpInv) + + ! Call GetUTP again with bPrime=.false. to fully populate m%Udotdot_TP + call GetUTP(u,p,x,m,ErrStat2,ErrMsg2,bPrime=(.false.)); if(Failed()) return + + else ! Should have only one transition piece in this cases + + m%F_TP = matmul( p%MBB , m%Udotdot_TP ) + m%F_TP(1:3) = m%F_TP(1:3) + p%MBB(1,1)*cross_product(m%udot_TP(4:6),cross_product(m%udot_TP(4:6),p%rPG)) + m%F_TP(4:6) = m%F_TP(4:6) + cross_product(m%udot_TP(4:6),matmul(p%MBB(4:6,4:6),m%udot_TP(4:6))) + + if (p%nDOFM>0) then + m%qmdotdot = - matmul( p%MmB , m%Udotdot_TP ) & + - p%CMMDiag * x%qmdot & + - p%KMMDiag * x%qm & + + matmul( m%F_L, p%PhiM ) + m%F_TP = m%F_TP + matmul( p%MBm , m%qmdotdot ) + end if + + endif + + else ! Fixed-bottom structure: everything is in the global earth-fixed frame + + m%F_TP = MATMUL( p%MBB , m%Udotdot_TP ) & + + MATMUL( p%CBB , m%Udot_TP ) & + + MATMUL( p%KBB , m%U_TP ) + + if (p%nDOFM>0) then + + m%qmdotdot = - MATMUL( p%MMB , m%Udotdot_TP ) & + - p%CMMDiag * x%qmdot & + - p%KMMDiag * x%qm & + + matmul( m%F_L, p%PhiM ) ! F_M = PhiM^T * F_L + + m%F_TP = m%F_TP + MATMUL( p%MBm, m%qmdotdot ) + + endif + + endif + +CONTAINS + LOGICAL FUNCTION Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SD_SolveEOM') + Failed = ErrStat >= AbortErrLev + END FUNCTION Failed + +END SUBROUTINE SD_SolveEOM + !---------------------------------------------------------------------------------------------------------------------------------- !> Routine for computing outputs, used in both loose and tight coupling. @@ -498,165 +814,61 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) TYPE(SD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + !locals - INTEGER(IntKi) :: I ! Counters - INTEGER(IntKi) :: iSDNode - REAL(ReKi) :: rotations(3) - REAL(ReKi) :: Y1(6) - REAL(ReKi) :: Y1_CB(6) - REAL(ReKi) :: Y1_CB_L(6) - REAL(ReKi) :: Y1_Guy_R(6) - REAL(ReKi) :: Y1_Guy_L(6) - REAL(ReKi) :: Y1_Utp(6) - REAL(ReKi) :: Y1_GuyanLoadCorrection(3) ! Lever arm moment contributions due to interface displacement - REAL(ReKi) :: udotdot_TP(6) - INTEGER(IntKi), pointer :: DOFList(:) - REAL(ReKi) :: DCM(3,3) - REAL(ReKi) :: MBB(6,6), CBB(6,6) ! Guyan mode inertia and damping matrices transformed to earth-fixed frame of reference - REAL(ReKi) :: F_I(6*p%nNodes_I) ! !Forces from all interface nodes listed in one big array ( those translated to TP ref point HydroTP(6) are implicitly calculated in the equations) - TYPE(SD_ContinuousStateType) :: dxdt ! Continuous state derivatives at t- for output file qmdotdot purposes only - ! Variables for Guyan rigid body motion - real(ReKi), dimension(3) :: Om, OmD ! Omega, OmegaDot (body rotational speed and acceleration) - real(ReKi), dimension(3) :: rIP ! Vector from TP to rotated Node - real(ReKi), dimension(3) :: rIP0 ! Vector from TP to Node (undeflected) - real(ReKi), dimension(3) :: Om_X_r ! Crossproduct of Omega and r - real(ReKi), dimension(3) :: duP ! Displacement of node due to rigid rotation - real(ReKi), dimension(3) :: vP ! Rigid-body velocity of node - real(ReKi), dimension(3) :: aP ! Rigid-body acceleration of node - real(R8Ki), dimension(3,3) :: Rg2b ! Rotation matrix global 2 body coordinates - real(R8Ki), dimension(3,3) :: Rb2g ! Rotation matrix body 2 global coordinates - real(R8Ki), dimension(6,6) :: RRb2g ! Rotation matrix body 2 global coordinates, acts on a 6-vector - INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) - CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None + INTEGER(IntKi) :: I, idx, iSDNode ! Counters + REAL(ReKi) :: Y1_GuyanLoadCorrection(3) ! Lever arm moment contributions due to interface displacement + INTEGER(IntKi), pointer :: DOFList(:) + REAL(R8Ki) :: DCM(3,3) + REAL(ReKi) :: F_I(6*p%nNodes_I) ! Forces from all interface nodes listed in one big array ( those translated to TP ref point HydroTP(6) are implicitly calculated in the equations) + ! Variables for rigid body motion + real(ReKi), dimension(3) :: rIP ! Vector from TP to rotated Node + real(ReKi), dimension(3) :: rIP0 ! Vector from TP to Node (undeflected) + real(ReKi), dimension(3) :: duP ! Displacement of node due to rigid rotation + real(R8Ki), dimension(3,3) :: Rg2b ! Rotation matrix global 2 body coordinates + real(R8Ki), dimension(3,3) :: Rb2g ! Rotation matrix body 2 global coordinates + INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None + ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" + call SD_SolveEOM( t, u, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2 ); if(Failed()) return + call GetUFulls(u, p, x, m, ErrStat2, ErrMsg2); if(Failed()) return + ! --- Convert inputs to FEM DOFs and convenient 6-vector storage ! Compute the roll, pitch, and yaw angles given the input direction cosine matrix - IF ( p%Floating ) THEN - ! Only needed for outputs when floating - rotations = EulerExtractZYX(u%TPMesh%Orientation(:,:,1)) - ELSE - ! Need to be small angles due to the Guyan stiffness terms - rotations = GetSmllRotAngs(u%TPMesh%Orientation(:,:,1), ErrStat2, ErrMsg2); if(Failed()) return - END IF - m%u_TP = (/REAL(u%TPMesh%TranslationDisp(:,1),ReKi), rotations/) - m%udot_TP = (/u%TPMesh%TranslationVel( :,1), u%TPMesh%RotationVel(:,1)/) - m%udotdot_TP = (/u%TPMesh%TranslationAcc( :,1), u%TPMesh%RotationAcc(:,1)/) - Rg2b(1:3,1:3) = u%TPMesh%Orientation(:,:,1) ! global 2 body coordinates - Rb2g(1:3,1:3) = transpose(u%TPMesh%Orientation(:,:,1)) - RRb2g(:,:) = 0.0_R8Ki - RRb2g(1:3,1:3) = Rb2g - RRb2g(4:6,4:6) = Rb2g + if ( p%Floating ) THEN + Rg2b = EulerConstructZYX(m%u_TP(4:6)) + Rb2g = transpose(Rg2b) + end if ! -------------------------------------------------------------------------------- ! --- Output Meshes 2&3 ! -------------------------------------------------------------------------------- + ! Y0Mesh: Rigid-body reference point (TP1) motion ! Y2Mesh: rigidbody displacements , elastic velocities and accelerations on all FEM nodes ! Y3Mesh: elastic displacements without SIM, elastic velocities and accelerations on all FEM nodes - - ! External force on internal nodes (m%F_L) based on LMesh + FG (grav+cable) + controllable cables - ! - We only apply the lever arm for (fixed-bottom case + GuyanLoadCorrection) - ! - We only rotate the external loads for (floating case + GuyanLoadCorrection) - call GetExtForceOnInternalDOF(u, p, x, m, m%F_L, ErrStat2, ErrMsg2, GuyanLoadCorrection=(p%GuyanLoadCorrection.and..not.p%Floating), RotateLoads=(p%GuyanLoadCorrection.and.p%Floating)); if(Failed()) return - ! --- CB modes contribution to motion (L-DOF only) - if ( p%nDOFM > 0) then - if (p%GuyanLoadCorrection.and.p%Floating) then ! >>> Rotate All - udotdot_TP(1:3) = matmul(Rg2b, u%TPMesh%TranslationAcc( :,1)) - udotdot_TP(4:6) = matmul(Rg2b, u%TPMesh%RotationAcc(:,1) ) - else - udotdot_TP = (/u%TPMesh%TranslationAcc( :,1), u%TPMesh%RotationAcc(:,1)/) - endif - m%UL = matmul( p%PhiM, x%qm ) - m%UL_dot = matmul( p%PhiM, x%qmdot ) - m%UL_dotdot = matmul( p%C2_61, x%qm ) + matmul( p%C2_62 , x%qmdot ) & - + matmul( p%D2_63, udotdot_TP ) + matmul( p%D2_64, m%F_L ) - else - m%UL = 0.0_ReKi - m%UL_dot = 0.0_ReKi - m%UL_dotdot = 0.0_ReKi - end if - ! --- Adding Guyan contribution to R and L DOFs - if (.not.p%Floating) then - ! Then we add the Guyan motion here - m%UR_bar = matmul( p%TI , m%u_TP ) - m%UR_bar_dot = matmul( p%TI , m%udot_TP ) - m%UR_bar_dotdot = matmul( p%TI , m%udotdot_TP ) - m%UL = m%UL + matmul( p%PhiRb_TI, m%u_TP ) - m%UL_dot = m%UL_dot + matmul( p%PhiRb_TI, m%udot_TP ) - m%UL_dotdot = m%UL_dotdot + matmul( p%PhiRb_TI, m%udotdot_TP ) - else - ! We know that the Guyan modes are rigid body modes. - ! We will add them in the "Full system" later - m%UR_bar = 0.0_ReKi - m%UR_bar_dot = 0.0_ReKi - m%UR_bar_dotdot = 0.0_ReKi - endif - m%UL_NS = m%UL ! Storing displacements without SIM - ! Static improvement (modify UL) - if (p%SttcSolve/=idSIM_None) then - m%F_L2 = MATMUL(p%PhiL_T , m%F_L) ! NOTE: Gravity in F_L - m%UL_SIM = MATMUL(p%PhiLInvOmgL2, m%F_L2) - if ( p%nDOFM > 0) then - m%UL_0m = MATMUL(p%PhiLInvOmgL2(:,1:p%nDOFM), m%F_L2(1:p%nDOFM) ) - m%UL_SIM = m%UL_SIM - m%UL_0m - end if - m%UL = m%UL + m%UL_SIM - endif - - ! --- Build original DOF vectors ("full", prior to constraints and CB) - call ReducedToFull(p, m, m%UR_bar , m%UL , m%U_full ) - call ReducedToFull(p, m, m%UR_bar_dot , m%UL_dot , m%U_full_dot ) - call ReducedToFull(p, m, m%UR_bar_dotdot, m%UL_dotdot, m%U_full_dotdot) - ! Do the same for the displacements without SIM. We'll use those for Y3 mesh - call ReducedToFull(p, m, m%UR_bar , m%UL_NS , m%U_full_NS ) - - ! Storing elastic motion (full motion for fixed bottom, CB motion+SIM for floating) - m%U_full_elast = m%U_full - ! --- Place displacement/velocity/acceleration into Y2 output mesh if (p%Floating) then - ! For floating, we compute the Guyan motion directly (rigid body motion with TP as origin) - ! This introduce non-linear "rotations" effects, where the bottom node should "go up", and not just translate horizontally - Om(1:3) = u%TPMesh%RotationVel(1:3,1) - OmD(1:3) = u%TPMesh%RotationAcc(1:3,1) + + y%Y0mesh%TranslationDisp(:,1) = m%u_TP(1:3) + y%Y0mesh%Orientation(:,:,1) = Rg2b + y%Y0mesh%TranslationVel(:,1) = matmul( Rb2g, m%udot_TP(1:3) ) + y%Y0mesh%RotationVel(:,1) = matmul( Rb2g, m%udot_TP(4:6) ) + y%Y0mesh%TranslationAcc(:,1) = matmul( Rb2g, m%udotdot_TP(1:3) ) + y%Y0mesh%RotationAcc(:,1) = matmul( Rb2g, m%udotdot_TP(4:6) ) + do iSDNode = 1,p%nNodes - DOFList => p%NodesDOF(iSDNode)%List ! Alias to shorten notations + associate (DOFList => p%NodesDOF(iSDNode)%List) ! Alias to shorten notations ! --- Guyan (rigid body) motion in global coordinates rIP0(1:3) = p%DP0(1:3, iSDNode) rIP(1:3) = matmul(Rb2g, rIP0) duP(1:3) = rIP - rIP0 + m%u_TP(1:3) - Om_X_r(1:3) = cross_product(Om, rIP) - vP(1:3) = u%TPMesh%TranslationVel(1:3,1) + Om_X_r - aP(1:3) = u%TPMesh%TranslationAcc(1:3,1) + cross_product(OmD, rIP) + cross_product(Om, Om_X_r) - - ! Full displacements CB-rotated + Guyan (KEEP ME) >>> Rotate All - if (p%GuyanLoadCorrection) then - m%U_full_NS (DOFList(1:3)) = matmul(Rb2g, m%U_full_NS (DOFList(1:3))) + duP(1:3) - CALL SmllRotTrans('Nodal rotation',m%U_full_NS(DOFList(4)),m%U_full_NS(DOFList(5)),m%U_full_NS(DOFList(6)),DCM,'',ErrStat2,ErrMsg2); if(Failed()) return - m%U_full_NS (DOFList(4:6)) = EulerExtractZYX( matmul(DCM,Rg2b) ) - m%U_full (DOFList(1:3)) = matmul(Rb2g, m%U_full (DOFList(1:3))) + duP(1:3) - CALL SmllRotTrans('Nodal rotation',m%U_full(DOFList(4)),m%U_full(DOFList(5)),m%U_full(DOFList(6)),DCM,'',ErrStat2,ErrMsg2); if(Failed()) return - m%U_full (DOFList(4:6)) = EulerExtractZYX( matmul(DCM,Rg2b) ) - m%U_full_dot (DOFList(1:3)) = matmul(Rb2g, m%U_full_dot (DOFList(1:3))) + vP(1:3) - m%U_full_dot (DOFList(4:6)) = matmul(Rb2g, m%U_full_dot (DOFList(4:6))) + Om(1:3) - m%U_full_dotdot(DOFList(1:3)) = matmul(Rb2g, m%U_full_dotdot(DOFList(1:3))) + aP(1:3) - m%U_full_dotdot(DOFList(4:6)) = matmul(Rb2g, m%U_full_dotdot(DOFList(4:6))) + OmD(1:3) - else - m%U_full_NS (DOFList(1:3)) = m%U_full_NS (DOFList(1:3)) + duP(1:3) - m%U_full_NS (DOFList(4:6)) = m%U_full_NS (DOFList(4:6)) + rotations(1:3) - m%U_full (DOFList(1:3)) = m%U_full (DOFList(1:3)) + duP(1:3) - m%U_full (DOFList(4:6)) = m%U_full (DOFList(4:6)) + rotations(1:3) - m%U_full_dot (DOFList(1:3)) = m%U_full_dot (DOFList(1:3)) + vP(1:3) - m%U_full_dot (DOFList(4:6)) = m%U_full_dot (DOFList(4:6)) + Om(1:3) - m%U_full_dotdot(DOFList(1:3)) = m%U_full_dotdot(DOFList(1:3)) + aP(1:3) - m%U_full_dotdot(DOFList(4:6)) = m%U_full_dotdot(DOFList(4:6)) + OmD(1:3) - endif - ! --- Rigid body displacements for hydrodyn - y%Y2mesh%Orientation (:,:,iSDNode) = u%TPMesh%Orientation(:,:,1) - y%Y2mesh%TranslationDisp (:,iSDNode) = duP(1:3) ! Y2: NOTE: only the Guyan displacements for floating + y%Y2mesh%Orientation (:,:,iSDNode) = Rg2b + y%Y2mesh%TranslationDisp (:,iSDNode) = duP(1:3) ! Y2: NOTE: only the rigid-body displacements for floating ! --- Full elastic displacements for others (moordyn) y%Y3mesh%Orientation (:,:,iSDNode) = EulerConstructZYX(m%U_full_NS(DOFList(4:6))) y%Y3mesh%TranslationDisp (:,iSDNode) = m%U_full_NS (DOFList(1:3)) ! Y3: Guyan+CB (but no SIM) displacements @@ -665,11 +877,12 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) y%Y2mesh%TranslationAcc (:,iSDNode) = m%U_full_dotdot (DOFList(1:3)) y%Y2mesh%RotationVel (:,iSDNode) = m%U_full_dot (DOFList(4:6)) y%Y2mesh%RotationAcc (:,iSDNode) = m%U_full_dotdot (DOFList(4:6)) + end associate enddo else ! --- Fixed bottom - Y3 and Y2 meshes are identical in this case do iSDNode = 1,p%nNodes - DOFList => p%NodesDOF(iSDNode)%List ! Alias to shorten notations + associate(DOFList => p%NodesDOF(iSDNode)%List) ! Alias to shorten notations ! TODO TODO which orientation to give for joints with more than 6 dofs? ! Construct the direction cosine matrix given the output angles CALL SmllRotTrans( 'UR_bar input angles', m%U_full_NS(DOFList(4)), m%U_full_NS(DOFList(5)), m%U_full_NS(DOFList(6)), DCM, '', ErrStat2, ErrMsg2); if(Failed()) return @@ -679,148 +892,71 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) y%Y2mesh%TranslationAcc (:,iSDNode) = m%U_full_dotdot (DOFList(1:3)) y%Y2mesh%RotationVel (:,iSDNode) = m%U_full_dot (DOFList(4:6)) y%Y2mesh%RotationAcc (:,iSDNode) = m%U_full_dotdot (DOFList(4:6)) - y%Y3mesh%TranslationDisp (:,iSDNode) = y%Y2mesh%TranslationDisp (:,iSDNode) - y%Y3mesh%Orientation (:,:,iSDNode) = y%Y2mesh%Orientation (:,:,iSDNode) + end associate enddo + y%Y3mesh%TranslationDisp = y%Y2mesh%TranslationDisp + y%Y3mesh%Orientation = y%Y2mesh%Orientation endif - ! --- Y3 mesh and Y2 mesh both have elastic (Guyan+CB) velocities and accelerations - do iSDNode = 1,p%nNodes - y%Y3mesh%TranslationVel (:,iSDNode) = y%Y2mesh%TranslationVel (:,iSDNode) - y%Y3mesh%TranslationAcc (:,iSDNode) = y%Y2mesh%TranslationAcc (:,iSDNode) - y%Y3mesh%RotationVel (:,iSDNode) = y%Y2mesh%RotationVel (:,iSDNode) - y%Y3mesh%RotationAcc (:,iSDNode) = y%Y2mesh%RotationAcc (:,iSDNode) - enddo + y%Y3mesh%TranslationVel = y%Y2mesh%TranslationVel + y%Y3mesh%TranslationAcc = y%Y2mesh%TranslationAcc + y%Y3mesh%RotationVel = y%Y2mesh%RotationVel + y%Y3mesh%RotationAcc = y%Y2mesh%RotationAcc ! -------------------------------------------------------------------------------- ! --- Outputs 1, Y1=-F_TP, reaction force from SubDyn to ElastoDyn (stored in y%Y1Mesh) ! -------------------------------------------------------------------------------- - ! Contribution from Craig-Bampton modes qm and qdot_m - if ( p%nDOFM > 0) then - Y1_CB = -( matmul(p%C1_11, x%qm) + matmul(p%C1_12, x%qmdot) ) ! - ( [-M_Bm K_mm]q_m + [-M_Bm C_mm] qdot_m ) - if (p%GuyanLoadCorrection.and.p%Floating) then - Y1_CB = matmul(RRb2g, Y1_CB) !>>> Rotate All - endif - else - Y1_CB = 0.0_ReKi - endif - ! print *, 'Y1_CB: ', Y1_CB - - ! Contribution from U_TP, Udot_TP, Uddot_TP, Reaction/coupling force at TP - if (p%GuyanLoadCorrection.and.p%Floating) then - ! Transform the body-frame Guyan mode (rigid-body) inertia and damping matrix to global frame - MBB = matmul(RRb2g, matmul(p%MBB,transpose(RRb2g))) - CBB = matmul(RRb2g, matmul(p%CBB,transpose(RRb2g))) - ! Y1_Utp = - (matmul(p%KBB, m%u_TP) + matmul(p%CBB, m%udot_TP) + matmul(MBB,m%udotdot_TP) ) - Y1_Utp = - ( matmul(CBB,m%udot_TP) + matmul(MBB,m%udotdot_TP) ) - ! Add back the nonlinear terms of the Guyan mode equation of motion - Y1_Utp(1:3) = Y1_Utp(1:3) - MBB(1,1)*cross_product(m%udot_TP(4:6),cross_product(m%udot_TP(4:6),matmul(Rb2g,p%rPG))) - Y1_Utp(4:6) = Y1_Utp(4:6) - cross_product(m%udot_TP(4:6),matmul(MBB(4:6,4:6),m%udot_TP(4:6))) - else - Y1_Utp = - (matmul(p%KBB, m%u_TP) + matmul(p%CBB, m%udot_TP) + matmul(p%MBB,m%udotdot_TP) ) + ! External force on internal nodes (m%F_L) based on LMesh + FG (grav+cable) + controllable cables + ! - We only apply the lever arm for (fixed-bottom case + GuyanLoadCorrection) + ! - We only rotate the external loads for (floating case + GuyanLoadCorrection) + call GetExtForceOnInternalDOF(u, p, x, m, m%F_L, ErrStat2, ErrMsg2, ExtraMoment=(.not.p%Floating), RotateLoads=(p%Floating)); if(Failed()) return + call GetExtForceOnInterfaceDOF(p, m, F_I) + m%Y1_Guy_R = matmul( F_I, p%TI ) ! = - [-T_I.^T] F_R = [T_I.^T] F_R =~ F_R T_I (~: FORTRAN convention) + m%Y1_Guy_L = - matmul(p%D1_142, m%F_L) ! = - (- T_I^T . Phi_Rb^T) F_L, rotated loads + ! Total contribution + m%Y1 = m%Y1_Guy_R + m%Y1_Guy_L - m%F_TP + if (p%Floating) then + do i = 1,p%nTP + idx = 6*i-5 + m%Y1(idx :idx+2) = matmul( Rb2g , m%Y1(idx :idx+2) ) + m%Y1(idx+3:idx+5) = matmul( Rb2g , m%Y1(idx+3:idx+5) ) + enddo end if - if (p%nDOFM>0) then - !>>> Rotate All - ! NOTE: this introduces some hysteresis - if (p%GuyanLoadCorrection.and.p%Floating) then - udotdot_TP(1:3) = matmul(Rg2b, u%TPMesh%TranslationAcc( :,1)) - udotdot_TP(4:6) = matmul(Rg2b, u%TPMesh%RotationAcc(:,1) ) - Y1_Utp = Y1_Utp + matmul(RRb2g, matmul(p%MBmmB, udotdot_TP)) + ! Computing extra moments due to lever arm introduced by interface displacement + ! Y1_MExtra = - MExtra = -u_TP x Y1(1:3) ! NOTE: double cancellation of signs + if (p%floating) then + if (p%TP1IsRBRefPt) then + do i = 2,p%nTP + Y1_GuyanLoadCorrection = -cross_product( matmul( Rb2g , m%u_TP((6*(i-1)+1):(6*(i-1)+3)) ) , m%Y1((6*(i-1)+1):(6*(i-1)+3)) ) + m%Y1((6*(i-1)+4):(6*(i-1)+6)) = m%Y1((6*(i-1)+4):(6*(i-1)+6)) + Y1_GuyanLoadCorrection + y%Y1Mesh(i-1)%Force (:,1) = m%Y1((6*(i-1)+1):(6*(i-1)+3)) + y%Y1Mesh(i-1)%Moment(:,1) = m%Y1((6*(i-1)+4):(6*(i-1)+6)) + enddo else - Y1_Utp = Y1_Utp + matmul(p%MBmmB, m%udotdot_TP) - endif - endif - - if (p%GuyanLoadCorrection.and.p%Floating) then - ! --- Special case for floating with extra moment, we use "rotated loads" m%F_L previously computed - ! Contributions from external forces - Note: T_I is in the rotated frame - call GetExtForceOnInterfaceDOF(p, m, F_I) - Y1_Guy_R = matmul( F_I, p%TI ) ! = - [-T_I.^T] F_R = [T_I.^T] F_R =~ F_R T_I (~: FORTRAN convention) - Y1_Guy_R = matmul(RRb2g, Y1_Guy_R) - Y1_Guy_L = - matmul(p%D1_142, m%F_L) ! = - (- T_I^T . Phi_Rb^T) F_L, rotated loads - Y1_Guy_L = matmul(RRb2g, Y1_Guy_L) - Y1_CB_L = - matmul(p%D1_141, m%F_L) ! = - (M_Bm . Phi_m^T) "F_L", where "F_L"=Rg2b F_L are rotated loads - Y1_CB_L = matmul(RRb2g, Y1_CB_L) ! = - Rb2g (M_Bm . Phi_m^T) Rg2b F_L - else ! .not.(p%GuyanLoadCorrection.and.p%Floating) - ! Compute "non-rotated" external force on internal (F_L) and interface nodes (F_I) - call GetExtForceOnInternalDOF(u, p, x, m, m%F_L, ErrStat2, ErrMsg2, GuyanLoadCorrection=(p%GuyanLoadCorrection), RotateLoads=.False.); if(Failed()) return - call GetExtForceOnInterfaceDOF(p, m, F_I) - ! Contributions from external forces - Y1_Guy_R = matmul( F_I, p%TI ) ! = - [-T_I.^T] F_R = [T_I.^T] F_R =~ F_R T_I (~: FORTRAN convention) - Y1_Guy_L = - matmul(p%D1_142, m%F_L) ! = - (- T_I^T . Phi_Rb^T) F_L, non-rotated loads - Y1_CB_L = - matmul(p%D1_141, m%F_L) ! = - (M_Bm . Phi_m^T) F_L, non-rotated loads - endif - - ! Old implementation below - ! ! --- Special case for floating with extramoment, we use "rotated loads" m%F_L previously computed - ! if (p%GuyanLoadCorrection.and.p%Floating) then - ! Y1_CB_L = - (matmul(p%D1_141, m%F_L)) ! = - (M_Bm . Phi_m^T) "F_L", where "F_L"=Rg2b F_L are rotated loads - ! Y1_CB_L = matmul(RRb2g, Y1_CB_L) ! = - Rb2g (M_Bm . Phi_m^T) Rg2b F_L - ! endif - ! - ! ! Compute "non-rotated" external force on internal (F_L) and interface nodes (F_I) - ! call GetExtForceOnInternalDOF(u, p, x, m, m%F_L, ErrStat2, ErrMsg2, GuyanLoadCorrection=(p%GuyanLoadCorrection), RotateLoads=.False.); if(Failed()) return - ! call GetExtForceOnInterfaceDOF(p, m, F_I) - ! - ! ! Contributions from external forces - ! Y1_Guy_R = matmul( F_I, p%TI ) ! = - [-T_I.^T] F_R = [T_I.^T] F_R =~ F_R T_I (~: FORTRAN convention) - ! Y1_Guy_L = - matmul(p%D1_142, m%F_L) ! = - (- T_I^T . Phi_Rb^T) F_L, non-rotated loads - ! - ! if (.not.(p%GuyanLoadCorrection.and.p%Floating)) then - ! Y1_CB_L = - (matmul(p%D1_141, m%F_L)) ! = - (M_Bm . Phi_m^T) F_L, non-rotated loads - ! endif - - ! Total contribution - Y1 = Y1_CB + Y1_Utp + Y1_CB_L+ Y1_Guy_L + Y1_Guy_R - - ! KEEP ME - !if ( p%nDOFM > 0) then - ! Y1 = -( matmul(p%C1_11, x%qm) + matmul(p%C1_12,x%qmdot) & - ! + matmul(p%KBB, m%u_TP) + matmul(p%CBB, m%udot_TP) + matmul(p%MBB - p%MBmmB, m%udotdot_TP) & - ! + matmul(p%D1_141, m%F_L) + matmul(p%D1_142, m%F_L) - matmul( F_I, p%TI ) ) - !else ! No retained modes, so there are no states - ! Y1 = -( matmul(p%KBB, m%u_TP) + matmul(p%CBB, m%udot_TP) + matmul(p%MBB - p%MBmmB, m%udotdot_TP) & - ! + matmul(p%D1_141, m%F_L) + matmul(p%D1_142, m%F_L) - matmul( F_I, p%TI ) ) - !end if + do i = 1,p%nTP + y%Y1Mesh(i)%Force (:,1) = m%Y1((6*(i-1)+1):(6*(i-1)+3)) + y%Y1Mesh(i)%Moment(:,1) = m%Y1((6*(i-1)+4):(6*(i-1)+6)) + enddo + end if + else if (.not.p%floating) then + do i = 1,p%nTP + Y1_GuyanLoadCorrection = -cross_product( m%u_TP((6*(i-1)+1):(6*(i-1)+3)) , m%Y1((6*(i-1)+1):(6*(i-1)+3)) ) + m%Y1((6*(i-1)+4):(6*(i-1)+6)) = m%Y1((6*(i-1)+4):(6*(i-1)+6)) + Y1_GuyanLoadCorrection + y%Y1Mesh(i)%Force (:,1) = m%Y1((6*(i-1)+1):(6*(i-1)+3)) + y%Y1Mesh(i)%Moment(:,1) = m%Y1((6*(i-1)+4):(6*(i-1)+6)) + enddo + end if - ! Computing extra moments due to lever arm introduced by interface displacement - ! Y1_MExtra = - MExtra = -u_TP x Y1(1:3) ! NOTE: double cancellation of signs - if (p%GuyanLoadCorrection) then - if (.not.p%floating) then ! if Fixed, transfer from non deflected TP to u_TP - Y1_GuyanLoadCorrection(1) = - m%u_TP(2) * Y1(3) + m%u_TP(3) * Y1(2) - Y1_GuyanLoadCorrection(2) = - m%u_TP(3) * Y1(1) + m%u_TP(1) * Y1(3) - Y1_GuyanLoadCorrection(3) = - m%u_TP(1) * Y1(2) + m%u_TP(2) * Y1(1) - Y1(4:6) = Y1(4:6) + Y1_GuyanLoadCorrection - endif - endif - ! values on the interface mesh are Y1 (SubDyn forces) + Hydrodynamic forces - y%Y1Mesh%Force (:,1) = Y1(1:3) - y%Y1Mesh%Moment(:,1) = Y1(4:6) - - !________________________________________ - ! CALCULATE OUTPUT TO BE WRITTEN TO FILE - !________________________________________ - ! OutSwtch determines whether or not to actually output results via the WriteOutput array - ! 0 = No one needs the SubDyn outputs provided via the WriteOutput array. - ! 1 = SubDyn will generate an output file of its own. - ! 2 = the caller will handle the outputs, but SubDyn needs to provide them. - ! 3 = Both 1 and 2 + !________________________________________ + ! CALCULATE OUTPUT TO BE WRITTEN TO FILE + !________________________________________ + ! OutSwtch determines whether or not to actually output results via the WriteOutput array + ! 0 = No one needs the SubDyn outputs provided via the WriteOutput array. + ! 1 = SubDyn will generate an output file of its own. + ! 2 = the caller will handle the outputs, but SubDyn needs to provide them. + ! 3 = Both 1 and 2 IF ( p%OutSwtch > 0 ) THEN - ! call CalcContStateDeriv one more time to store these qmdotdot for debugging purposes in the output file - !find xdot at t - IF ( p%nDOFM > 0 ) THEN - ! note that this re-sets m%udotdot_TP and m%F_L, but they are the same values as earlier in this routine so it doesn't change results in SDOut_MapOutputs() - CALL SD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrStat2, ErrMsg2 ); if(Failed()) return - !Assign the acceleration to the x variable since it will be used for output file purposes for SSqmdd01-99, and dxdt will disappear - m%qmdotdot=dxdt%qmdot - ! Destroy dxdt because it is not necessary for the rest of the subroutine - CALL SD_DestroyContState( dxdt, ErrStat2, ErrMsg2); if(Failed()) return - END IF - ! 6-vectors (making sure they are up to date for outputs - m%udot_TP = (/u%TPMesh%TranslationVel(:,1),u%TPMesh%RotationVel(:,1)/) - m%udotdot_TP = (/u%TPMesh%TranslationAcc(:,1),u%TPMesh%RotationAcc(:,1)/) - ! Write the previous output data into the output file IF ( ( p%OutSwtch == 1 .OR. p%OutSwtch == 3 ) .AND. ( t > m%LastOutTime ) ) THEN IF ((m%Decimat .EQ. p%OutDec) .OR. (m%Decimat .EQ. 0)) THEN @@ -829,7 +965,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ELSE m%Decimat=m%Decimat+1 ENDIF - END IF + END IF ! Map calculated results into the AllOuts Array + perform averaging and all necessary extra calculations CALL SDOut_MapOutputs(u, p, x, y, m, m%AllOuts, ErrStat2, ErrMsg2); if(Failed()) return @@ -839,7 +975,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) y%WriteOutput(I) = p%OutParam(I)%SignM * m%AllOuts( p%OutParam(I)%Indx ) IF ( p%OutSwtch == 1 .OR. p%OutSwtch == 3 ) THEN m%SDWrOutput(I) = y%WriteOutput(I) - END IF + END IF END DO m%LastOutTime = t ENDIF @@ -848,12 +984,7 @@ SUBROUTINE SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) LOGICAL FUNCTION Failed() call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SD_CalcOutput') Failed = ErrStat >= AbortErrLev - if (Failed) call CleanUp() END FUNCTION Failed - - SUBROUTINE CleanUp - CALL SD_DestroyContState( dxdt, ErrStat2, ErrMsg2) - END SUBROUTINE CleanUp END SUBROUTINE SD_CalcOutput @@ -864,41 +995,41 @@ SUBROUTINE SD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrSta REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds TYPE(SD_InputType), INTENT(IN ) :: u !< Inputs at t TYPE(SD_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(SD_ContinuousStateType), INTENT(IN) :: x !< Continuous states at t -WHY IS THIS INOUT and not JUST IN? RRD, changed to IN on2/19/14 check with Greg + TYPE(SD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t TYPE(SD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at t TYPE(SD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at t TYPE(SD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at t TYPE(SD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - TYPE(SD_ContinuousStateType), INTENT( OUT) :: dxdt !< Continuous state derivatives at t + TYPE(SD_ContinuousStateType), INTENT(INOUT) :: dxdt !< Continuous state derivatives at t INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi) :: udotdot_TP(6) + INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = "" - - ! INTENT(OUT) automatically deallocates the arrays on entry, we have to allocate them here - CALL AllocAry(dxdt%qm, p%nDOFM, 'dxdt%qm', ErrStat2, ErrMsg2 ); CALL SetErrStat ( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SD_CalcContStateDeriv' ) - CALL AllocAry(dxdt%qmdot, p%nDOFM, 'dxdt%qmdot', ErrStat2, ErrMsg2 ); CALL SetErrStat ( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SD_CalcContStateDeriv' ) - IF ( ErrStat >= AbortErrLev ) RETURN - IF ( p%nDOFM == 0 ) RETURN - - ! Compute F_L, force on internal DOF - CALL GetExtForceOnInternalDOF(u, p, x, m, m%F_L, ErrStat2, ErrMsg2, GuyanLoadCorrection=(p%GuyanLoadCorrection.and..not.p%Floating), RotateLoads=(p%GuyanLoadCorrection.and.p%Floating)) - - udotdot_TP = (/u%TPMesh%TranslationAcc(:,1), u%TPMesh%RotationAcc(:,1)/) - if (p%GuyanLoadCorrection.and.p%Floating) then - ! >>> Rotate All - udotdot_TP to body coordinates - udotdot_TP(1:3) = matmul( u%TPMesh%Orientation(:,:,1), udotdot_TP(1:3) ) - udotdot_TP(4:6) = matmul( u%TPMesh%Orientation(:,:,1), udotdot_TP(4:6) ) - endif - + ! State equation - dxdt%qm= x%qmdot - ! NOTE: matmul( TRANSPOSE(p%PhiM), m%F_L ) = matmul( m%F_L, p%PhiM ) because F_L is 1-D - dxdt%qmdot = -p%KMMDiag*x%qm - p%CMMDiag*x%qmdot - matmul(p%MMB,udotdot_TP) + matmul(m%F_L, p%PhiM) + call SD_SolveEOM( t, u, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2 ); if (Failed()) return + + ! Craig-Bampton states + if (p%nDOFM > 0) then + dxdt%qm = x%qmdot + dxdt%qmdot = m%qmdotdot + endif + + ! Rigid-body states + if (p%TP1IsRBRefPt) then + dxdt%qR = x%qRdot + dxdt%qRdot = m%qRdotdot + endif + +CONTAINS + LOGICAL FUNCTION Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SD_CalcContStateDeriv') + Failed = ErrStat >= AbortErrLev + END FUNCTION Failed END SUBROUTINE SD_CalcContStateDeriv @@ -927,6 +1058,8 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) LOGICAL :: Dummy_Bool INTEGER(IntKi) :: Dummy_Int REAL(R8Ki) :: tmpMat(3,3) +INTEGER(IntKi), ALLOCATABLE :: TPIdxInput(:) +INTEGER(IntKi), ALLOCATABLE :: tmpIntAry(:) INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 @@ -986,7 +1119,7 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) IF ( ( p%SDdeltaT <= 0 ) ) THEN call Fatal('SDdeltaT must be greater than or equal to 0.') return - END IF + END IF END IF CALL ReadVar ( UnIn, SDInputFile, p%IntMethod, 'IntMethod', 'Integration Method',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return @@ -1002,20 +1135,6 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) endif IF (Check(.not.(any(idSIM_Valid==p%SttcSolve)), 'Invalid value entered for SttcSolve')) return -! GuyanLoadCorrection - For legacy, allowing this line to be a comment -! CALL ReadVar (UnIn, SDInputFile, Dummy_Str, 'GuyanLoadCorrection', 'Add extra lever arm contribution to interface loads', ErrStat2, ErrMsg2, UnEc); if(Failed()) return -! if (is_logical(Dummy_Str, Dummy_Bool)) then ! the parameter was present -! p%GuyanLoadCorrection=Dummy_Bool -! ! We still need to read the comment on the next line -! CALL ReadCom ( UnIn, SDInputFile, ' FEA and CRAIG-BAMPTON PARAMETERS ', ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -! else ! we have a actually read a comment line, we do nothing. -! call LegacyWarning('ExtraMom line missing from input file. Assuming no extra moment.') -! p%GuyanLoadCorrection=.False. ! For Legacy, GuyanLoadCorrection is False -! endif - -! GuyanLoadCorrection will always be set to true. The corresponding user input is commented out above. -p%GuyanLoadCorrection=.True. - !-------------------- FEA and CRAIG-BAMPTON PARAMETERS--------------------------- CALL ReadCom ( UnIn, SDInputFile, ' FEA and CRAIG-BAMPTON PARAMETERS ', ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadIVar ( UnIn, SDInputFile, Init%FEMMod, 'FEMMod', 'FEM analysis mode' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return ! 0= Euler-Bernoulli(E-B); 1=Tapered E-B; 2= Timoshenko; 3= tapered Timoshenko @@ -1078,24 +1197,28 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) if (is_numeric(Dummy_Str, DummyFloat)) then Init%GuyanDampMod=int(DummyFloat) CALL ReadAry( UnIn, SDInputFile, Init%RayleighDamp, 2, "RayleighDamp", "", ErrStat2, ErrMsg2, UnEc) - CALL ReadVar (UnIn, SDInputFile, Dummy_Int, 'GuyanDampSize', 'Guyan damping matrix size', ErrStat2, ErrMsg2, UnEc); if(Failed()) return - IF (Check(Dummy_Int/=6, 'Invalid value entered for GuyanDampSize, value should be 6 for now.')) return - CALL ReadAry( UnIn, SDInputFile, Init%GuyanDampMat(1,:), 6, "GuyanDampMat1", "Guyan Damping matrix ", ErrStat2, ErrMsg2, UnEc) - CALL ReadAry( UnIn, SDInputFile, Init%GuyanDampMat(2,:), 6, "GuyanDampMat2", "Guyan Damping matrix ", ErrStat2, ErrMsg2, UnEc) - CALL ReadAry( UnIn, SDInputFile, Init%GuyanDampMat(3,:), 6, "GuyanDampMat3", "Guyan Damping matrix ", ErrStat2, ErrMsg2, UnEc) - CALL ReadAry( UnIn, SDInputFile, Init%GuyanDampMat(4,:), 6, "GuyanDampMat4", "Guyan Damping matrix ", ErrStat2, ErrMsg2, UnEc) - CALL ReadAry( UnIn, SDInputFile, Init%GuyanDampMat(5,:), 6, "GuyanDampMat5", "Guyan Damping matrix ", ErrStat2, ErrMsg2, UnEc) - CALL ReadAry( UnIn, SDInputFile, Init%GuyanDampMat(6,:), 6, "GuyanDampMat6", "Guyan Damping matrix ", ErrStat2, ErrMsg2, UnEc) - CALL ReadCom ( UnIn, SDInputFile, 'STRUCTURE JOINTS' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return + CALL ReadVar (UnIn, SDInputFile, Init%GuyanDampSize, 'GuyanDampSize', 'Guyan damping matrix size', ErrStat2, ErrMsg2, UnEc); if(Failed()) return + CALL AllocAry(Init%GuyanDampMat, Init%GuyanDampSize, Init%GuyanDampSize, 'GuyanDampMat', ErrStat2, ErrMsg2 ); if(Failed()) return + do i = 1,Init%GuyanDampSize + CALL ReadAry( UnIn, SDInputFile, Init%GuyanDampMat(i,:), Init%GuyanDampSize, "GuyanDampMat", "Guyan Damping matrix ", ErrStat2, ErrMsg2, UnEc); if(Failed()) return + end do + CALL ReadCom( UnIn, SDInputFile, 'Initial Rigid-Body Position' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return else call LegacyWarning('GuyanDampMod and following lines missing from input file. Assuming 0 Guyan damping.') Init%GuyanDampMod = idGuyanDamp_None Init%RayleighDamp = 0.0_ReKi - Init%GuyanDampMat = 0.0_ReKi + ! Init%GuyanDampMat = 0.0_ReKi endif IF (Check(.not.(any(idGuyanDamp_Valid==Init%GuyanDampMod)), 'Invalid value entered for GuyanDampMod')) return +!------- Initial rigid-body position [used only for floating structures with more than one transition pieces] ------- +CALL ReadCom( UnIn, SDInputFile, 'Initial Rigid-Body Position Headers',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadCom( UnIn, SDInputFile, 'Initial Rigid-Body Position Units' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadAry( UnIn, SDInputFile, Init%qR0, 6, "qR0", "initial rigid-body position ", ErrStat2, ErrMsg2, UnEc); if(Failed()) return +Init%qR0(4:6) = Init%qR0(4:6) * D2R + !--------------------- STRUCTURE JOINTS: joints connect structure members ------------------------------- +CALL ReadCom ( UnIn, SDInputFile, 'STRUCTURE JOINTS' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadIVar ( UnIn, SDInputFile, Init%NJoints, 'NJoints', 'Number of joints',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadCom ( UnIn, SDInputFile, 'Joint Coordinates Headers' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadCom ( UnIn, SDInputFile, 'Joint Coordinates Units' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return @@ -1189,7 +1312,6 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) ! Trigger: determine if floating/fixed based on BCs and SSI file p%Floating = isFloating(Init,p) - !------- INTERFACE JOINTS: T/F for Locked (to the TP)/Free DOF @each Interface Joint (only Locked-to-TP implemented thus far (=rigid TP)) --------- ! Joints with reaction forces, joint number and locked/free dof CALL ReadCom ( UnIn, SDInputFile, 'INTERFACE JOINTS' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return @@ -1197,10 +1319,14 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) CALL ReadCom ( UnIn, SDInputFile, 'Interface joints headers',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadCom ( UnIn, SDInputFile, 'Interface joints units ',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL AllocAry(p%Nodes_I, p%nNodes_I, InterfCol, 'Interf', ErrStat2, ErrMsg2); if(Failed()) return -p%Nodes_I(:,:) = 1 ! Important: By default all DOFs are contrained +CALL AllocAry(p%Nodes_I, p%nNodes_I, InterfCol, 'Interf', ErrStat2, ErrMsg2); if(Failed()) return +CALL AllocAry(p%TPIdx, p%nNodes_I, 'TPIdx', ErrStat2, ErrMsg2); if(Failed()) return +CALL AllocAry(tmpIntAry, 8, 'tmpIntAry', ErrStat2, ErrMsg2); if(Failed()) return +CALL AllocAry(TPIdxInput, p%nNodes_I, 'TPIdxInput', ErrStat2, ErrMsg2); if(Failed()) return +p%Nodes_I(:,:) = 1 ! Important: By default all DOFs are contrained p%Nodes_I(:,1) = -1 ! First column is node, initalize to wrong value for safety -! Reading interface lines one by one, allowing for 1 or 7 columns (cannot use ReadIAry) +p%TPIdx(:) = -1 ! Initialize to no associated transition piece +! Reading interface lines one by one, allowing for 2 or 8 columns (cannot use ReadIAry) DO I = 1, p%nNodes_I READ(UnIn, FMT='(A)', IOSTAT=ErrStat2) Line ; ErrMsg2='Error reading interface line'; if (Failed()) return j = index(line, achar(13)) ! Remove any carriage returns in this line (required by the Flang compiler) @@ -1208,18 +1334,24 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) line(j:j) = " " j = index(line, achar(13)) end do - call ReadIAryFromStrSD(Line, p%Nodes_I(I,:), 7, nColValid, nColNumeric); - if ((nColValid/=nColNumeric).or.((nColNumeric/=1).and.(nColNumeric/=7)) ) then - CALL Fatal(' Error in file "'//TRIM(SDInputFile)//'": Interface line must consist of 1 or 7 numerical values. Problematic line: "'//trim(Line)//'"') + call ReadIAryFromStrSD(Line, tmpIntAry, 8, nColValid, nColNumeric); + if ((nColValid/=nColNumeric).or.((nColNumeric/=2).and.(nColNumeric/=8)) ) then + CALL Fatal(' Error in file "'//TRIM(SDInputFile)//'": Interface line must consist of 2 or 8 numerical values. Problematic line: "'//trim(Line)//'"') return endif - if (any(p%Nodes_I(I,:)<=0)) then + if (any(tmpIntAry(3:8)<=0)) then CALL Fatal(' Error in file "'//TRIM(SDInputFile)//'": For now, all DOF must be activated for interface lines. Problematic line: "'//trim(Line)//'"') return endif + p%Nodes_I(I, 1) = tmpIntAry( 1) + p%Nodes_I(I,2:7) = tmpIntAry(3:8) + TPIdxInput(I) = tmpIntAry( 2) ENDDO IF (Check( ( p%nNodes_I < 0 ) .OR. (p%nNodes_I > Init%NJoints), 'NInterf must be non-negative and less than number of joints.')) RETURN -call CheckIntf(p, ErrStat2, ErrMsg2); if (Failed()) return +call CheckIntf(p, TPIdxInput, Init%RB_RefJoint, ErrStat2, ErrMsg2); if (Failed()) return + +deallocate(TPIdxInput) +deallocate(tmpIntAry) !----------------------------------- MEMBERS -------------------------------------- ! One day we will need to take care of COSMIDs for non-circular members @@ -1289,43 +1421,43 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) !------------------ MEMBER CROSS-SECTION PROPERTY data 1/3 [isotropic material for now: use this table if circular-tubular elements ------------------------ CALL ReadCom ( UnIn, SDInputFile, ' Member CROSS-Section Property Data 1/3 ',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsBC, 'NPropSets', 'Number of property sets',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL ReadCom ( UnIn, SDInputFile, 'Property Data 1/2 Header' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL ReadCom ( UnIn, SDInputFile, 'Property Data 1/2 Units ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsBC, 'NPropSetsCyl', 'Number of circular beam section property sets',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadCom ( UnIn, SDInputFile, 'Property Data 1/3 Header' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadCom ( UnIn, SDInputFile, 'Property Data 1/3 Units ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL AllocAry(Init%PropSetsBC, Init%NPropSetsBC, PropSetsBCCol, 'PropSets', ErrStat2, ErrMsg2) ; if(Failed()) return DO I = 1, Init%NPropSetsBC - CALL ReadAry( UnIn, SDInputFile, Dummy_ReAry, PropSetsBCCol, 'PropSets', 'PropSets number and values ', ErrStat2 , ErrMsg2, UnEc); if(Failed()) return + CALL ReadAry( UnIn, SDInputFile, Dummy_ReAry, PropSetsBCCol, 'PropSetsBC', 'PropSetsBC ID and values ', ErrStat2 , ErrMsg2, UnEc); if(Failed()) return Init%PropSetsBC(I,:) = Dummy_ReAry(1:PropSetsBCCol) ENDDO IF (Check( Init%NPropSetsBC < 0, 'NPropSetsBC must be >=0')) return !------------------ MEMBER CROSS-SECTION PROPERTY data 2/3 [isotropic material for now: use this table if rectangular-tubular elements --------------------- CALL ReadCom ( UnIn, SDInputFile, ' Member CROSS-Section Property Data 2/3 ',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsBR, 'NPropSets', 'Number of property sets',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL ReadCom ( UnIn, SDInputFile, 'Property Data 1/2 Header' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL ReadCom ( UnIn, SDInputFile, 'Property Data 1/2 Units ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsBR, 'NPropSetsRec', 'Number of rectangular beam section property sets',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadCom ( UnIn, SDInputFile, 'Property Data 2/3 Header' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadCom ( UnIn, SDInputFile, 'Property Data 2/3 Units ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL AllocAry(Init%PropSetsBR, Init%NPropSetsBR, PropSetsBRCol, 'PropSets', ErrStat2, ErrMsg2) ; if(Failed()) return DO I = 1, Init%NPropSetsBR - CALL ReadAry( UnIn, SDInputFile, Dummy_ReAry, PropSetsBRCol, 'PropSets', 'PropSets number and values ', ErrStat2 , ErrMsg2, UnEc); if(Failed()) return + CALL ReadAry( UnIn, SDInputFile, Dummy_ReAry, PropSetsBRCol, 'PropSetsBR', 'PropSetsBR ID and values ', ErrStat2 , ErrMsg2, UnEc); if(Failed()) return Init%PropSetsBR(I,:) = Dummy_ReAry(1:PropSetsBRCol) ENDDO IF (Check( Init%NPropSetsBR < 0, 'NPropSetsBR must be >=0')) return -!------------------ MEMBER CROSS-SECTION PROPERTY data 2/3 [isotropic material for now: use this table if any section other than circular, however provide COSM(i,j) below) ------------------------ +!------------------ MEMBER CROSS-SECTION PROPERTY data 3/3 [isotropic material for now: use this table if other elements) ---------------------------------- CALL ReadCom ( UnIn, SDInputFile, 'Member CROSS-Section Property Data 3/3 ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsX, 'NXPropSets', 'Number of non-circular property sets',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL ReadCom ( UnIn, SDInputFile, 'Property Data 2/2 Header' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL ReadCom ( UnIn, SDInputFile, 'Property Data 2/2 Unit ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return -CALL AllocAry(Init%PropSetsX, Init%NPropSetsX, PropSetsXCol, 'XPropSets', ErrStat2, ErrMsg2); if(Failed()) return +CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsX, 'NXPropSets', 'Number of arbitrary beam section property sets',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadCom ( UnIn, SDInputFile, 'Property Data 3/3 Header' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL ReadCom ( UnIn, SDInputFile, 'Property Data 3/3 Units ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return +CALL AllocAry(Init%PropSetsX, Init%NPropSetsX, PropSetsXCol, 'PropSetsX', ErrStat2, ErrMsg2); if(Failed()) return DO I = 1, Init%NPropSetsX - CALL ReadAry( UnIn, SDInputFile, Init%PropSetsX(I,:), PropSetsXCol, 'XPropSets', 'XPropSets ID and values ', ErrStat2, ErrMsg2, UnEc ); if(Failed()) return + CALL ReadAry( UnIn, SDInputFile, Init%PropSetsX(I,:), PropSetsXCol, 'PropSetsX', 'PropSetsX ID and values ', ErrStat2, ErrMsg2, UnEc ); if(Failed()) return ENDDO IF (Check( Init%NPropSetsX < 0, 'NPropSetsX must be >=0')) return if (.not. LegacyFormat) then !-------------------------- CABLE PROPERTIES ------------------------------------- CALL ReadCom ( UnIn, SDInputFile, 'Cable properties' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return - CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsC, 'NPropSetsC', 'Number of cable properties' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return + CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsC, 'NCablePropSets', 'Number of cable properties' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadCom ( UnIn, SDInputFile, 'Cable properties Header' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadCom ( UnIn, SDInputFile, 'Cable properties Unit ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return IF (Check( Init%NPropSetsC < 0, 'NPropSetsCable must be >=0')) return @@ -1357,7 +1489,7 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) !----------------------- RIGID LINK PROPERTIES ------------------------------------ CALL ReadCom ( UnIn, SDInputFile, 'Rigid link properties' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return - CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsR, 'NPropSetsR', 'Number of rigid link properties' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return + CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsR, 'NRigidPropSets', 'Number of rigid link properties' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadCom ( UnIn, SDInputFile, 'Rigid link properties Header' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadCom ( UnIn, SDInputFile, 'Rigid link properties Unit ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL AllocAry(Init%PropSetsR, Init%NPropSetsR, PropSetsRCol, 'RigidPropSets', ErrStat2, ErrMsg2); if(Failed()) return @@ -1367,7 +1499,7 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) IF (Check( Init%NPropSetsR < 0, 'NPropSetsRigid must be >=0')) return !----------------------- SPRING ELEMENT PROPERTIES -------------------------------- CALL ReadCom ( UnIn, SDInputFile, 'Spring element properties' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return - CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsS, 'NPropSetsS', 'Number of spring properties' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return + CALL ReadIVar ( UnIn, SDInputFile, Init%NPropSetsS, 'NSpringPropSets', 'Number of spring properties' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadCom ( UnIn, SDInputFile, 'Spring element properties Header' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return CALL ReadCom ( UnIn, SDInputFile, 'Spring element properties Unit ' ,ErrStat2, ErrMsg2, UnEc ); if(Failed()) return IF (Check( Init%NPropSetsS < 0, 'NPropSetsSpring must be >=0')) return @@ -1524,7 +1656,7 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) IF ( ErrStat2 /= 0 .OR. p%MOutLst(I)%NOutCnt < 1 .OR. p%MOutLst(I)%NOutCnt > 9 .OR. p%MOutLst(I)%NOutCnt > Init%Ndiv+1) THEN CALL Fatal(' Error in file "'//TRIM(SDInputFile)//'": NOutCnt must be >= 1 and <= minimim(Ndiv+1,9)') RETURN - END IF + END IF CALL AllocAry( p%MOutLst(I)%NodeCnt, p%MOutLst(I)%NOutCnt, 'NodeCnt', ErrStat2, ErrMsg2); if(Failed()) return READ(Line,*,IOSTAT=ErrStat2) p%MOutLst(I)%MemberID, p%MOutLst(I)%NOutCnt, p%MOutLst(I)%NodeCnt @@ -1556,7 +1688,7 @@ SUBROUTINE SD_Input(SDInputFile, Init, p, ErrStat,ErrMsg) END IF END IF END DO -END IF +END IF ! OutList - list of requested parameters to output to a file CALL ReadCom( UnIn, SDInputFile, 'SSOutList',ErrStat2, ErrMsg2, UnEc ); if(Failed()) return @@ -1739,7 +1871,7 @@ SUBROUTINE SD_End( u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) CALL SDOut_WriteOutputs( p%UnJckF, m%LastOutTime, m%SDWrOutput, p, ErrStat, ErrMsg ) ENDIF CALL SDOut_CloseOutput( p, ErrStat, ErrMsg ) - END IF + END IF ! Destroy data CALL SD_DestroyInput( u, ErrStat, ErrMsg ) @@ -1811,10 +1943,18 @@ SUBROUTINE SD_AB4( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg endif CALL SD_CopyContState( xdot, OtherState%xdot ( 1 ), MESH_UPDATECOPY, ErrStat, ErrMsg ) !OtherState%xdot ( 1 ) = xdot ! make sure this is most up to date - x%qm = x%qm + (p%SDDeltaT / 24.) * ( 55.*OtherState%xdot(1)%qm - 59.*OtherState%xdot(2)%qm + 37.*OtherState%xdot(3)%qm & - - 9. * OtherState%xdot(4)%qm ) - x%qmdot = x%qmdot + (p%SDDeltaT / 24.) * ( 55.*OtherState%xdot(1)%qmdot - 59.*OtherState%xdot(2)%qmdot & + if (p%nDOFM>0) then + x%qm = x%qm + (p%SDDeltaT / 24.) * ( 55.*OtherState%xdot(1)%qm - 59.*OtherState%xdot(2)%qm + 37.*OtherState%xdot(3)%qm & + - 9. * OtherState%xdot(4)%qm ) + x%qmdot = x%qmdot + (p%SDDeltaT / 24.) * ( 55.*OtherState%xdot(1)%qmdot - 59.*OtherState%xdot(2)%qmdot & + 37.*OtherState%xdot(3)%qmdot - 9.*OtherState%xdot(4)%qmdot ) + end if + if (p%TP1IsRBRefPt) then + x%qR = x%qR + (p%SDDeltaT / 24.) * ( 55.*OtherState%xdot(1)%qR - 59.*OtherState%xdot(2)%qR + 37.*OtherState%xdot(3)%qR & + - 9. * OtherState%xdot(4)%qR ) + x%qRdot = x%qRdot + (p%SDDeltaT / 24.) * ( 55.*OtherState%xdot(1)%qRdot - 59.*OtherState%xdot(2)%qRdot & + + 37.*OtherState%xdot(3)%qRdot - 9.*OtherState%xdot(4)%qRdot ) + end if endif CALL SD_DestroyContState(xdot, ErrStat, ErrMsg) CALL SD_DestroyInput(u_interp, ErrStat, ErrMsg) @@ -1866,15 +2006,35 @@ SUBROUTINE SD_ABM4( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg CALL SD_CalcContStateDeriv(t + p%SDDeltaT, u_interp, p, x_pred, xd, z, OtherState, m, xdot_pred, ErrStat, ErrMsg ) ! initializes xdot_pred CALL SD_DestroyInput( u_interp, ErrStat, ErrMsg) ! local copy no longer needed - x%qm = x%qm + (p%SDDeltaT / 24.) * ( 9. * xdot_pred%qm + 19. * OtherState%xdot(1)%qm - 5. * OtherState%xdot(2)%qm & - + 1. * OtherState%xdot(3)%qm ) + if (p%nDOFM>0) then + x%qm = x%qm + (p%SDDeltaT / 24.) * ( 9. * xdot_pred%qm + 19. * OtherState%xdot(1)%qm - 5. * OtherState%xdot(2)%qm & + + 1. * OtherState%xdot(3)%qm ) - x%qmdot = x%qmdot + (p%SDDeltaT / 24.) * ( 9. * xdot_pred%qmdot + 19. * OtherState%xdot(1)%qmdot - 5. * OtherState%xdot(2)%qmdot & - + 1. * OtherState%xdot(3)%qmdot ) + x%qmdot = x%qmdot + (p%SDDeltaT / 24.) * ( 9. * xdot_pred%qmdot + 19. * OtherState%xdot(1)%qmdot - 5. * OtherState%xdot(2)%qmdot & + + 1. * OtherState%xdot(3)%qmdot ) + endif + + if (p%TP1IsRBRefPt) then + x%qR = x%qR + (p%SDDeltaT / 24.) * ( 9. * xdot_pred%qR + 19. * OtherState%xdot(1)%qR - 5. * OtherState%xdot(2)%qR & + + 1. * OtherState%xdot(3)%qR ) + + x%qRdot = x%qRdot + (p%SDDeltaT / 24.) * ( 9. * xdot_pred%qRdot + 19. * OtherState%xdot(1)%qRdot - 5. * OtherState%xdot(2)%qRdot & + + 1. * OtherState%xdot(3)%qRdot ) + endif + CALL SD_DestroyContState( xdot_pred, ErrStat, ErrMsg) ! local copy no longer needed else - x%qm = x_pred%qm - x%qmdot = x_pred%qmdot + + if (p%nDOFM>0) then + x%qm = x_pred%qm + x%qmdot = x_pred%qmdot + endif + + if (p%TP1IsRBRefPt) then + x%qR = x_pred%qR + x%qRdot = x_pred%qRdot + endif + endif CALL SD_DestroyContState( x_pred, ErrStat, ErrMsg) ! local copy no longer needed @@ -1936,35 +2096,77 @@ SUBROUTINE SD_RK4( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ! find xdot at t CALL SD_CalcContStateDeriv( t, u_interp, p, x, xd, z, OtherState, m, xdot, ErrStat, ErrMsg ) !initializes xdot - k1%qm = p%SDDeltaT * xdot%qm - k1%qmdot = p%SDDeltaT * xdot%qmdot - x_tmp%qm = x%qm + 0.5 * k1%qm - x_tmp%qmdot = x%qmdot + 0.5 * k1%qmdot + + if (p%nDOFM>0) then + k1%qm = p%SDDeltaT * xdot%qm + k1%qmdot = p%SDDeltaT * xdot%qmdot + x_tmp%qm = x%qm + 0.5 * k1%qm + x_tmp%qmdot = x%qmdot + 0.5 * k1%qmdot + endif + + if (p%TP1IsRBRefPt) then + k1%qR = p%SDDeltaT * xdot%qR + k1%qRdot = p%SDDeltaT * xdot%qRdot + x_tmp%qR = x%qR + 0.5 * k1%qR + x_tmp%qRdot = x%qRdot + 0.5 * k1%qRdot + endif + ! interpolate u to find u_interp = u(t + dt/2) CALL SD_Input_ExtrapInterp(u, utimes, u_interp, t+0.5*p%SDDeltaT, ErrStat, ErrMsg) ! find xdot at t + dt/2 CALL SD_CalcContStateDeriv( t + 0.5*p%SDDeltaT, u_interp, p, x_tmp, xd, z, OtherState, m, xdot, ErrStat, ErrMsg ) - k2%qm = p%SDDeltaT * xdot%qm - k2%qmdot = p%SDDeltaT * xdot%qmdot - x_tmp%qm = x%qm + 0.5 * k2%qm - x_tmp%qmdot = x%qmdot + 0.5 * k2%qmdot + + if (p%nDOFM>0) then + k2%qm = p%SDDeltaT * xdot%qm + k2%qmdot = p%SDDeltaT * xdot%qmdot + x_tmp%qm = x%qm + 0.5 * k2%qm + x_tmp%qmdot = x%qmdot + 0.5 * k2%qmdot + endif + + if (p%TP1IsRBRefPt) then + k2%qR = p%SDDeltaT * xdot%qR + k2%qRdot = p%SDDeltaT * xdot%qRdot + x_tmp%qR = x%qR + 0.5 * k2%qR + x_tmp%qRdot = x%qRdot + 0.5 * k2%qRdot + endif ! find xdot at t + dt/2 CALL SD_CalcContStateDeriv( t + 0.5*p%SDDeltaT, u_interp, p, x_tmp, xd, z, OtherState, m, xdot, ErrStat, ErrMsg ) - k3%qm = p%SDDeltaT * xdot%qm - k3%qmdot = p%SDDeltaT * xdot%qmdot - x_tmp%qm = x%qm + k3%qm - x_tmp%qmdot = x%qmdot + k3%qmdot + + if (p%nDOFM>0) then + k3%qm = p%SDDeltaT * xdot%qm + k3%qmdot = p%SDDeltaT * xdot%qmdot + x_tmp%qm = x%qm + k3%qm + x_tmp%qmdot = x%qmdot + k3%qmdot + endif + + if (p%TP1IsRBRefPt) then + k3%qR = p%SDDeltaT * xdot%qR + k3%qRdot = p%SDDeltaT * xdot%qRdot + x_tmp%qR = x%qR + k3%qR + x_tmp%qRdot = x%qRdot + k3%qRdot + endif + ! interpolate u to find u_interp = u(t + dt) CALL SD_Input_ExtrapInterp(u, utimes, u_interp, t + p%SDDeltaT, ErrStat, ErrMsg) ! find xdot at t + dt CALL SD_CalcContStateDeriv( t + p%SDDeltaT, u_interp, p, x_tmp, xd, z, OtherState, m, xdot, ErrStat, ErrMsg ) - k4%qm = p%SDDeltaT * xdot%qm - k4%qmdot = p%SDDeltaT * xdot%qmdot - x%qm = x%qm + ( k1%qm + 2. * k2%qm + 2. * k3%qm + k4%qm ) / 6. - x%qmdot = x%qmdot + ( k1%qmdot + 2. * k2%qmdot + 2. * k3%qmdot + k4%qmdot ) / 6. + + if (p%nDOFM>0) then + k4%qm = p%SDDeltaT * xdot%qm + k4%qmdot = p%SDDeltaT * xdot%qmdot + x%qm = x%qm + ( k1%qm + 2. * k2%qm + 2. * k3%qm + k4%qm ) / 6. + x%qmdot = x%qmdot + ( k1%qmdot + 2. * k2%qmdot + 2. * k3%qmdot + k4%qmdot ) / 6. + endif + + if (p%TP1IsRBRefPt) then + k4%qR = p%SDDeltaT * xdot%qR + k4%qRdot = p%SDDeltaT * xdot%qRdot + x%qR = x%qR + ( k1%qR + 2. * k2%qR + 2. * k3%qR + k4%qR ) / 6. + x%qRdot = x%qRdot + ( k1%qRdot + 2. * k2%qRdot + 2. * k3%qRdot + k4%qRdot ) / 6. + endif CALL CleanUp() @@ -1980,7 +2182,7 @@ SUBROUTINE CleanUp() CALL SD_DestroyContState( k4, ErrStat3, ErrMsg3 ) CALL SD_DestroyContState( x_tmp, ErrStat3, ErrMsg3 ) CALL SD_DestroyInput( u_interp, ErrStat3, ErrMsg3 ) - END SUBROUTINE CleanUp + END SUBROUTINE CleanUp END SUBROUTINE SD_RK4 @@ -2001,7 +2203,7 @@ END SUBROUTINE SD_RK4 !! Thus x_n+1 = x_n - J^-1 *dt/2 * (2*A*x_n + B *(u_n + u_n+1) +2*Fx) !! or J*( x_n - x_n+1 ) = dt * ( A*x_n + B *(u_n + u_n+1)/2 + Fx) SUBROUTINE SD_AM2( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ) - USE NWTC_LAPACK, only: LAPACK_getrs + USE NWTC_LAPACK, only: LAPACK_gels REAL(DbKi), INTENT(IN ) :: t !< Current simulation time in seconds INTEGER(IntKi), INTENT(IN ) :: n !< time step number TYPE(SD_InputType), INTENT(INOUT) :: u(:) !< Inputs at t @@ -2015,61 +2217,60 @@ SUBROUTINE SD_AM2( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None ! local variables - TYPE(SD_InputType) :: u_interp ! interpolated value of inputs - REAL(ReKi) :: xq(2*p%nDOFM) !temporary states (qm and qmdot only) - REAL(ReKi) :: udotdot_TP2(6) ! temporary copy of udotdot_TP + TYPE(SD_InputType) :: u_interp ! interpolated value of inputs + TYPE(SD_OutputType) :: y + INTEGER(IntKi) :: i INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 ErrStat = ErrID_None - ErrMsg = "" + ErrMsg = "" ! Initialize interim vars CALL SD_CopyInput( u(1), u_interp, MESH_NEWCOPY, ErrStat2,ErrMsg2);CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SD_AM2') - !Start by getting u_n and u_n+1 - ! interpolate u to find u_interp = u(t) = u_n + ! Interpolate u to find u_interp = u(t) = u_n CALL SD_Input_ExtrapInterp( u, utimes, u_interp, t, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SD_AM2') - CALL GetExtForceOnInternalDOF(u_interp, p, x, m, m%F_L, ErrStat2, ErrMsg2, GuyanLoadCorrection=(p%GuyanLoadCorrection.and..not.p%Floating), RotateLoads=(p%GuyanLoadCorrection.and.p%Floating)) - m%udotdot_TP = (/u_interp%TPMesh%TranslationAcc(:,1), u_interp%TPMesh%RotationAcc(:,1)/) - if (p%GuyanLoadCorrection.and.p%Floating) then - ! >>> Rotate All - udotdot_TP to body coordinates - m%udotdot_TP(1:3) = matmul(u_interp%TPMesh%Orientation(:,:,1), m%udotdot_TP(1:3)) - m%udotdot_TP(4:6) = matmul(u_interp%TPMesh%Orientation(:,:,1), m%udotdot_TP(4:6)) - endif - - ! extrapolate u to find u_interp = u(t + dt)=u_n+1 + + ! Estimate the Jacobian matrix of dx_dot/dx numerically + CALL SD_JacobianPContState( p%Vars, t, u_interp, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dXdx=m%AM2Jac) + + ! Get the left-hand-side matrix AM2Jac = I - 0.5 * dt * dx_dot/dx + m%AM2Jac = - 0.5_R8Ki * p%SDDeltaT * m%AM2Jac + do i = 1,m%Jac%Nx + m%AM2Jac(i,i) = m%AM2Jac(i,i) + 1.0_R8Ki + end do + + ! Compute the right-hand side xq = dt * ( x_dot(u_n,x_n) + x_dot(u_n+1,x_n) ) / 2 + CALL SD_CalcContStateDeriv( t, u_interp, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SD_AM2') + CALL SD_VarsPackContState(p%Vars, m%dxdt_lin, m%AM2xq(:,1)) CALL SD_Input_ExtrapInterp(u, utimes, u_interp, t+p%SDDeltaT, ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SD_AM2') - CALL GetExtForceOnInternalDOF(u_interp, p, x, m, m%F_L2, ErrStat2, ErrMsg2, GuyanLoadCorrection=(p%GuyanLoadCorrection.and..not.p%Floating), RotateLoads=(p%GuyanLoadCorrection.and.p%Floating)) - udotdot_TP2 = (/u_interp%TPMesh%TranslationAcc(:,1), u_interp%TPMesh%RotationAcc(:,1)/) - if (p%GuyanLoadCorrection.and.p%Floating) then - ! >>> Rotate All - udotdot_TP to body coordinates - udotdot_TP2(1:3) = matmul(u_interp%TPMesh%Orientation(:,:,1), udotdot_TP2(1:3)) - udotdot_TP2(4:6) = matmul(u_interp%TPMesh%Orientation(:,:,1), udotdot_TP2(4:6)) - endif - - ! calculate (u_n + u_n+1)/2 - udotdot_TP2 = 0.5_ReKi * ( udotdot_TP2 + m%udotdot_TP ) - m%F_L2 = 0.5_ReKi * ( m%F_L2 + m%F_L ) - - ! set xq = dt * ( A*x_n + B *(u_n + u_n+1)/2 + Fx) - xq( 1: p%nDOFM)=p%SDDeltaT * x%qmdot !upper portion of array - xq(1+p%nDOFM:2*p%nDOFM)=p%SDDeltaT * (-p%KMMDiag*x%qm - p%CMMDiag*x%qmdot - matmul(p%MMB, udotdot_TP2) + matmul(m%F_L2,p%PhiM )) !lower portion of array - ! note: matmul(F_L2,p%PhiM ) = matmul(p%PhiM_T,F_L2) because F_L2 is 1-D - + CALL SD_CalcContStateDeriv( t+p%SDDeltaT, u_interp, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2 ); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SD_AM2') + CALL SD_VarsPackContState(p%Vars, m%dxdt_lin, m%AM2xq2(:,1)) + m%AM2xq(:,1) = 0.5_R8Ki * p%SDDeltaT * (m%AM2xq(:,1) + m%AM2xq2(:,1)) + !.................................................... ! Solve for xq: (equivalent to xq= matmul(p%AM2InvJac,xq) - ! J*( x_n - x_n+1 ) = dt * ( A*x_n + B *(u_n + u_n+1)/2 + Fx) - !.................................................... - CALL LAPACK_getrs( TRANS='N',N=SIZE(p%AM2Jac,1),A=p%AM2Jac,IPIV=p%AM2JacPiv, B=xq, ErrStat=ErrStat2, ErrMsg=ErrMsg2); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SD_AM2') - - ! after the LAPACK solve, xq = ( x_n - x_n+1 ); so now we can solve for x_n+1: - x%qm = x%qm - xq( 1: p%nDOFM) - x%qmdot = x%qmdot - xq(p%nDOFM+1:2*p%nDOFM) - + ! J*( x_n - x_n+1 ) = dt * ( x_dot(u_n,x_n) + x_dot(u_n+1,x_n) )/2 + ! J*( x_n - x_n+1 ) = dt * ( A*x_n + B *(u_n + u_n+1)/2 + Fx) <- if linear but no longer the case + !.................................................... + CALL LAPACK_gels( 'N', m%AM2Jac, m%AM2xq, ErrStat2, ErrMsg2); CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,'SD_AM2') + CALL SD_VarsUnpackContState(p%Vars, m%AM2xq(:,1), m%dxdt_lin) + + ! Update states + if (p%TP1IsRBRefPt) then + x%qR = x%qR + m%dxdt_lin%qR + x%qRdot = x%qRdot + m%dxdt_lin%qRdot + endif + if (p%nDOFM>0) then + x%qm = x%qm + m%dxdt_lin%qm + x%qmdot = x%qmdot + m%dxdt_lin%qmdot + endif + ! clean up temporary variable(s) - CALL SD_DestroyInput( u_interp, ErrStat, ErrMsg ) - + CALL SD_DestroyInput( u_interp, ErrStat, ErrMsg ) + CALL SD_DestroyOutput( y, ErrStat, ErrMsg ) + END SUBROUTINE SD_AM2 !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -2078,7 +2279,8 @@ END SUBROUTINE SD_AM2 !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the inputs (u). The partial derivatives dY/du, dX/du, dXd/du, and DZ/du are returned. -SUBROUTINE SD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) +SUBROUTINE SD_JacobianPInput(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdu, dXdu, dXddu, dZdu) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(SD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(SD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -2094,103 +2296,109 @@ SUBROUTINE SD_JacobianPInput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrM REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdu(:,:) !< Partial derivatives of continuous state functions (X) wrt the inputs (u) [intent in to avoid deallocation] REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddu(:,:) !< Partial derivatives of discrete state functions (Xd) wrt the inputs (u) [intent in to avoid deallocation] REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdu(:,:) !< Partial derivatives of constraint state functions (Z) wrt the inputs (u) [intent in to avoid deallocation] - ! local variables - TYPE(SD_OutputType) :: y_m, y_p - TYPE(SD_ContinuousStateType) :: x_m, x_p - TYPE(SD_InputType) :: u_perturb - REAL(R8Ki) :: delta_p, delta_m ! delta change in input (plus, minus) - INTEGER(IntKi) :: i - integer(intKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SD_JacobianPInput' - ! Initialize ErrStat + + character(*), parameter :: RoutineName = 'SD_JacobianPInput' + integer(intKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, k, col + ErrStat = ErrID_None ErrMsg = '' - ! get OP values here: - call SD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2 ); if(Failed()) return - ! make a copy of the inputs to perturb - call SD_CopyInput( u, u_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return - IF ( PRESENT( dYdu ) ) THEN - ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: - if (.not. allocated(dYdu) ) then - call AllocAry(dYdu,p%Jac_ny, size(p%Jac_u_indx,1),'dYdu', ErrStat2, ErrMsg2); if(Failed()) return + + ! Calculate OP values here + call SD_CalcOutput(t, u, p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2 ); if(Failed()) return + + ! Make a copy of the inputs to perturb + call SD_CopyInput(u, m%u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if(Failed()) return + call SD_VarsPackInput(Vars, u, m%Jac%u) + + ! Calculate the partial derivative of the output functions (Y) with respect to the inputs (u) here: + if (present(dYdu)) then + + if (.not. allocated(dYdu)) then + call AllocAry(dYdu, m%Jac%Ny, m%Jac%Nu, 'dYdu', ErrStat2, ErrMsg2); if(Failed()) return end if - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call SD_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return - call SD_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return - do i=1,size(p%Jac_u_indx,1) - ! get u_op + delta_p u - call SD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call SD_Perturb_u( p, i, 1, u_perturb, delta_p ) - ! compute y at u_op + delta_p u - call SD_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get u_op - delta_m u - call SD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call SD_Perturb_u( p, i, -1, u_perturb, delta_m ) - ! compute y at u_op - delta_m u - call SD_CalcOutput( t, u_perturb, p, x, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get central difference: - call SD_Compute_dY( p, y_p, y_m, delta_p, dYdu(:,i) ) + + ! Loop through input variables + do i = 1, size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1,Vars%u(i)%Num + + ! Calculate positive perturbation + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call SD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SD_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call SD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SD_CalcOutput(t, m%u_perturb, p, x, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference + call MV_ComputeCentralDiff(Vars%y, Vars%u(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdu(:,col)) + end do end do - if(Failed()) return - END IF - IF ( PRESENT( dXdu ) ) THEN - ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: - ! TODO: dXdu should be constant, in theory we dont' need to recompute it - !if(ANALYTICAL_LIN) then - ! Analytical lin cannot be used anymore with extra mom - ! call StateMatrices(p, ErrStat2, ErrMsg2, BB=dXdu); if(Failed()) return ! Allocation occurs in function - !else - if (.not. allocated(dXdu)) then - call AllocAry(dXdu, p%Jac_nx * 2, size(p%Jac_u_indx,1), 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return - endif - do i=1,size(p%Jac_u_indx,1) - ! get u_op + delta u - call SD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call SD_Perturb_u( p, i, 1, u_perturb, delta_p ) - ! compute x at u_op + delta u - call SD_CalcContStateDeriv( t, u_perturb, p, x, xd, z, OtherState, m, x_p, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get u_op - delta u - call SD_CopyInput( u, u_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call SD_Perturb_u( p, i, -1, u_perturb, delta_m ) - ! compute x at u_op - delta u - call SD_CalcContStateDeriv( t, u_perturb, p, x, xd, z, OtherState, m, x_m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get central difference: - ! we may have had an error allocating memory, so we'll check - if(Failed()) return - ! get central difference: - call SD_Compute_dX( p, x_p, x_m, delta_p, dXdu(:,i) ) + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the inputs (u) here: + if (present(dXdu) .and. (m%Jac%Nx > 0)) then + + if (.not. allocated(dXdu)) then + call AllocAry(dXdu, m%Jac%Nx, m%Jac%Nu, 'dXdu', ErrStat2, ErrMsg2); if (Failed()) return + endif + + ! Loop through input variables + do i = 1,size(Vars%u) + + ! Loop through number of linearization perturbations in variable + do j = 1,Vars%u(i)%Num + + ! Calculate positive perturbation and resulting continuous state derivatives + call MV_Perturb(Vars%u(i), j, 1, m%Jac%u, m%Jac%u_perturb) + call SD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SD_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation and resulting continuous state derivatives + call MV_Perturb(Vars%u(i), j, -1, m%Jac%u, m%Jac%u_perturb) + call SD_VarsUnpackInput(Vars, m%Jac%u_perturb, m%u_perturb) + call SD_CalcContStateDeriv(t, m%u_perturb, p, x, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Calculate column index + col = Vars%u(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference + dXdu(:,col) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%u(i)%Perturb) end do - !endif ! analytical or numerical - END IF ! dXdu - IF ( PRESENT( dXddu ) ) THEN + end do + end if + + if (present(dXddu)) then if (allocated(dXddu)) deallocate(dXddu) - END IF - IF ( PRESENT( dZdu ) ) THEN + end if + + if (present(dZdu)) then if (allocated(dZdu)) deallocate(dZdu) - END IF - call CleanUp() -contains + end if +contains logical function Failed() - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - Failed = ErrStat >= AbortErrLev - if (Failed) call CleanUp() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + Failed = ErrStat >= AbortErrLev end function Failed - - subroutine CleanUp() - call SD_DestroyContState( x_p, ErrStat2, ErrMsg2 ) ! we don't need this any more - call SD_DestroyContState( x_m, ErrStat2, ErrMsg2 ) ! we don't need this any more - call SD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call SD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call SD_DestroyInput(u_perturb, ErrStat2, ErrMsg2 ) - end subroutine cleanup - END SUBROUTINE SD_JacobianPInput !---------------------------------------------------------------------------------------------------------------------------------- !> Routine to compute the Jacobians of the output (Y), continuous- (X), discrete- (Xd), and constraint-state (Z) functions !! with respect to the continuous states (x). The partial derivatives dY/dx, dX/dx, dXd/dx, and dZ/dx are returned. -SUBROUTINE SD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) +SUBROUTINE SD_JacobianPContState(Vars, t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, dYdx, dXdx, dXddx, dZdx) + TYPE(ModVarsType), INTENT(IN ) :: Vars !< Module variables REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point TYPE(SD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) TYPE(SD_ParameterType), INTENT(IN ) :: p !< Parameters @@ -2206,103 +2414,116 @@ SUBROUTINE SD_JacobianPContState( t, u, p, x, xd, z, OtherState, y, m, ErrStat, REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXdx(:,:) !< Partial derivatives of continuous state functions (X) wrt the continuous states (x) [intent in to avoid deallocation] REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dXddx(:,:) !< Partial derivatives of discrete state functions (Xd) wrt the continuous states (x) [intent in to avoid deallocation] REAL(R8Ki), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dZdx(:,:) !< Partial derivatives of constraint state functions (Z) wrt the continuous states (x) [intent in to avoid deallocation] - ! local variables - TYPE(SD_OutputType) :: y_p, y_m - TYPE(SD_ContinuousStateType) :: x_p, x_m - TYPE(SD_ContinuousStateType) :: x_perturb - REAL(R8Ki) :: delta ! delta change in input or state - INTEGER(IntKi) :: i, k - INTEGER(IntKi) :: idx - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SD_JacobianPContState' + + character(*), parameter :: RoutineName = 'SD_JacobianPContState' + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + integer(IntKi) :: i, j, k, col + ! Initialize ErrStat ErrStat = ErrID_None ErrMsg = '' + + ! If no state variables, return + if (m%Jac%Nx == 0) return + ! make a copy of the continuous states to perturb NOTE: MESH_NEWCOPY - call SD_CopyContState( x, x_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return - IF ( PRESENT( dYdx ) ) THEN - ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + call SD_CopyContState(x, m%x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2); if(Failed()) return + call SD_VarsPackContState(Vars, x, m%Jac%x) + + ! Calculate the partial derivative of the output functions (Y) with respect to the continuous states (x) here: + if (present(dYdx)) then + + ! Allocate dYdx if not allocated if (.not. allocated(dYdx)) then - call AllocAry(dYdx, p%Jac_ny, p%Jac_nx*2, 'dYdx', ErrStat2, ErrMsg2); if(Failed()) return + call AllocAry(dYdx, m%Jac%Ny, m%Jac%Nx, 'dYdx', ErrStat2, ErrMsg2); if(Failed()) return end if - ! make a copy of outputs because we will need two for the central difference computations (with orientations) - call SD_CopyOutput( y, y_p, MESH_NEWCOPY, ErrStat2, ErrMsg2); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call SD_CopyOutput( y, y_m, MESH_NEWCOPY, ErrStat2, ErrMsg2); if(Failed()) return - idx = 1 - do k=1,2 ! 1=disp, 2=veloc - do i=1,p%Jac_nx ! CB mode - ! get x_op + delta x - call SD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call SD_perturb_x(p, k, i, 1, x_perturb, delta ) - ! compute y at x_op + delta x - call SD_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_p, m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get x_op - delta x - call SD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call SD_perturb_x(p, k, i, -1, x_perturb, delta ) - ! compute y at x_op - delta x - call SD_CalcOutput( t, u, p, x_perturb, xd, z, OtherState, y_m, m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get central difference: - call SD_Compute_dY( p, y_p, y_m, delta, dYdx(:,idx) ) - idx = idx+1 + + ! Loop through state variables + do i = 1,size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1,Vars%x(i)%Num + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call SD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SD_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call SD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SD_CalcOutput(t, u, p, m%x_perturb, xd, z, OtherState, m%y_lin, m, ErrStat2, ErrMsg2); if (Failed()) return + call SD_VarsPackOutput(Vars, m%y_lin, m%Jac%y_neg) + + ! Calculate column index + col = Vars%x(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference and store in full linearization array + call MV_ComputeCentralDiff(Vars%y, Vars%x(i)%Perturb, m%Jac%y_pos, m%Jac%y_neg, dYdx(:,col)) end do end do - if(Failed()) return - END IF - IF ( PRESENT( dXdx ) ) THEN - ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: - ! TODO: dXdx should be constant, in theory we don't need to recompute it - if(ANALYTICAL_LIN) then - call StateMatrices(p, ErrStat2, ErrMsg2, AA=dXdx); if(Failed()) return ! Allocation occurs in function - else + end if + + ! Calculate the partial derivative of the continuous state functions (X) with respect to the continuous states (x) here: + ! TODO: dXdx should be constant, in theory we don't need to recompute it + if (present(dXdx)) then + + ! If analytical linearization is enabled + ! if (ANALYTICAL_LIN) then + + ! ! Calculate dXdx as state matrix, allocation occurs in function + ! call StateMatrices(p, ErrStat2, ErrMsg2, AA=dXdx); if(Failed()) return + + ! else + + ! Allocate dXdx if not allocated if (.not. allocated(dXdx)) then - call AllocAry(dXdx, p%Jac_nx * 2, p%Jac_nx * 2, 'dXdx', ErrStat2, ErrMsg2); if(Failed()) return + call AllocAry(dXdx, m%Jac%Nx, m%Jac%Nx, 'dXdx', ErrStat2, ErrMsg2); if(Failed()) return end if - idx = 1 ! counter into dXdx - do k=1,2 ! 1=positions (x_perturb%q); 2=velocities (x_perturb%dqdt) - do i=1,p%Jac_nx - ! get x_op + delta x - call SD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call SD_perturb_x(p, k, i, 1, x_perturb, delta ) - ! compute x at x_op + delta x - call SD_CalcContStateDeriv( t, u, p, x_perturb, xd, z, OtherState, m, x_p, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - ! get x_op - delta x - call SD_CopyContState( x, x_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - call SD_perturb_x(p, k, i, -1, x_perturb, delta ) - ! compute x at x_op - delta x - call SD_CalcContStateDeriv( t, u, p, x_perturb, xd, z, OtherState, m, x_m, ErrStat2, ErrMsg2 ); call SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) - if(Failed()) return - ! get central difference: - call SD_Compute_dX( p, x_p, x_m, delta, dXdx(:,idx) ) - idx = idx+1 + + ! Loop through state variables + do i = 1,size(Vars%x) + + ! Loop through number of linearization perturbations in variable + do j = 1, Vars%x(i)%Num + + ! Calculate positive perturbation + call MV_Perturb(Vars%x(i), j, 1, m%Jac%x, m%Jac%x_perturb) + call SD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SD_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_pos) + + ! Calculate negative perturbation + call MV_Perturb(Vars%x(i), j, -1, m%Jac%x, m%Jac%x_perturb) + call SD_VarsUnpackContState(Vars, m%Jac%x_perturb, m%x_perturb) + call SD_CalcContStateDeriv(t, u, p, m%x_perturb, xd, z, OtherState, m, m%dxdt_lin, ErrStat2, ErrMsg2); if (Failed()) return + call SD_VarsPackContState(Vars, m%dxdt_lin, m%Jac%x_neg) + + ! Calculate column index + col = Vars%x(i)%iLoc(1) + j - 1 + + ! Get partial derivative via central difference and store in full linearization array + dXdx(:,col) = (m%Jac%x_pos - m%Jac%x_neg) / (2.0_R8Ki * Vars%x(i)%Perturb) end do end do - endif ! analytical or numerical - END IF - IF ( PRESENT( dXddx ) ) THEN + ! endif ! analytical or numerical + end if + + if (present(dXddx)) then if (allocated(dXddx)) deallocate(dXddx) - END IF - IF ( PRESENT( dZdx ) ) THEN + end if + + if (present(dZdx)) then if (allocated(dZdx)) deallocate(dZdx) - END IF - call CleanUp() + end if contains - logical function Failed() - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SD_JacobianPContState') + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) Failed = ErrStat >= AbortErrLev - if (Failed) call CleanUp() end function Failed - - subroutine CleanUp() - call SD_DestroyOutput( y_p, ErrStat2, ErrMsg2 ) - call SD_DestroyOutput( y_m, ErrStat2, ErrMsg2 ) - call SD_DestroyContState( x_p, ErrStat2, ErrMsg2 ) - call SD_DestroyContState( x_m, ErrStat2, ErrMsg2 ) - call SD_DestroyContState(x_perturb, ErrStat2, ErrMsg2 ) - end subroutine cleanup - END SUBROUTINE SD_JacobianPContState !---------------------------------------------------------------------------------------------------------------------------------- @@ -2371,130 +2592,7 @@ SUBROUTINE SD_JacobianPConstrState( t, u, p, x, xd, z, OtherState, y, m, ErrStat IF ( PRESENT(dZdz) ) THEN END IF END SUBROUTINE SD_JacobianPConstrState -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> Routine to pack the data structures representing the operating points into arrays for linearization. -SUBROUTINE SD_GetOP( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, u_op, y_op, x_op, dx_op, xd_op, z_op, NeedTrimOP ) - REAL(DbKi), INTENT(IN ) :: t !< Time in seconds at operating point - TYPE(SD_InputType), INTENT(INOUT) :: u !< Inputs at operating point (may change to inout if a mesh copy is required) - TYPE(SD_ParameterType), INTENT(IN ) :: p !< Parameters - TYPE(SD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point - TYPE(SD_DiscreteStateType), INTENT(IN ) :: xd !< Discrete states at operating point - TYPE(SD_ConstraintStateType), INTENT(IN ) :: z !< Constraint states at operating point - TYPE(SD_OtherStateType), INTENT(IN ) :: OtherState !< Other states at operating point - TYPE(SD_OutputType), INTENT(IN ) :: y !< Output at operating point - TYPE(SD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: u_op(:) !< values of linearized inputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: y_op(:) !< values of linearized outputs - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: x_op(:) !< values of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: dx_op(:) !< values of first time derivatives of linearized continuous states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: xd_op(:) !< values of linearized discrete states - REAL(ReKi), ALLOCATABLE, OPTIONAL, INTENT(INOUT) :: z_op(:) !< values of linearized constraint states - LOGICAL, OPTIONAL, INTENT(IN ) :: NeedTrimOP !< whether a y_op values should contain values for trim solution (3-value representation instead of full orientation matrices, no rotation acc) - - ! Local - INTEGER(IntKi) :: idx, i - LOGICAL :: ReturnTrimOP - INTEGER(IntKi) :: nu - INTEGER(IntKi) :: ny - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SD_GetOP' - LOGICAL :: FieldMask(FIELDMASK_SIZE) - TYPE(SD_ContinuousStateType) :: dx ! derivative of continuous states at operating point - ErrStat = ErrID_None - ErrMsg = '' - IF ( PRESENT( u_op ) ) THEN - nu = size(p%Jac_u_indx,1) + u%TPMesh%NNodes * 6 ! Jac_u_indx has 3 orientation angles, but the OP needs the full 9 elements of the DCM (thus 6 more per node) - if (.not. allocated(u_op)) then - call AllocAry(u_op, nu, 'u_op', ErrStat2, ErrMsg2); if(Failed()) return - end if - idx = 1 - FieldMask = .false. - FieldMask(MASKID_TranslationDisp) = .true. - FieldMask(MASKID_Orientation) = .true. - FieldMask(MASKID_TranslationVel) = .true. - FieldMask(MASKID_RotationVel) = .true. - FieldMask(MASKID_TranslationAcc) = .true. - FieldMask(MASKID_RotationAcc) = .true. - call PackMotionMesh(u%TPMesh, u_op, idx, FieldMask=FieldMask) - call PackLoadMesh(u%LMesh, u_op, idx) - END IF - - IF ( PRESENT( y_op ) ) THEN - ny = p%Jac_ny + y%Y2Mesh%NNodes * 6 + y%Y3Mesh%NNodes * 6 ! Jac_ny has 3 orientation angles, but the OP needs the full 9 elements of the DCM (thus 6 more per node) - if (.not. allocated(y_op)) then - call AllocAry(y_op, ny, 'y_op', ErrStat2, ErrMsg2); if(Failed()) return - end if - - if (present(NeedTrimOP)) then - ReturnTrimOP = NeedTrimOP - else - ReturnTrimOP = .false. - end if - - if (ReturnTrimOP) y_op = 0.0_ReKi ! initialize in case we are returning packed orientations and don't fill the entire array - - idx = 1 - call PackLoadMesh(y%Y1Mesh, y_op, idx) - FieldMask = .false. - FieldMask(MASKID_TranslationDisp) = .true. - FieldMask(MASKID_Orientation) = .true. - FieldMask(MASKID_TranslationVel) = .true. - FieldMask(MASKID_RotationVel) = .true. - FieldMask(MASKID_TranslationAcc) = .true. - FieldMask(MASKID_RotationAcc) = .true. - call PackMotionMesh(y%Y2Mesh, y_op, idx, FieldMask=FieldMask, TrimOP=ReturnTrimOP) - call PackMotionMesh(y%Y3Mesh, y_op, idx, FieldMask=FieldMask, TrimOP=ReturnTrimOP) - idx = idx - 1 - do i=1,p%NumOuts - y_op(i+idx) = y%WriteOutput(i) - end do - END IF - - IF ( PRESENT( x_op ) ) THEN - if (.not. allocated(x_op)) then - call AllocAry(x_op, p%Jac_nx*2,'x_op',ErrStat2,ErrMsg2); if (Failed()) return - end if - do i=1, p%Jac_nx - x_op(i) = x%qm(i) - end do - do i=1, p%Jac_nx - x_op(i+p%nDOFM) = x%qmdot(i) - end do - END IF - IF ( PRESENT( dx_op ) ) THEN - if (.not. allocated(dx_op)) then - call AllocAry(dx_op, p%Jac_nx * 2,'dx_op',ErrStat2,ErrMsg2); if(failed()) return - end if - call SD_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dx, ErrStat2, ErrMsg2 ) ; if(Failed()) return - idx = 1 - do i=1, p%Jac_nx - dx_op(i) = dx%qm(i) - end do - do i=1, p%Jac_nx - dx_op(i+p%nDOFM) = dx%qmdot(i) - end do - END IF - IF ( PRESENT( xd_op ) ) THEN - ! pass - END IF - IF ( PRESENT( z_op ) ) THEN - ! pass - END IF - call CleanUp() -contains - logical function Failed() - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - Failed = ErrStat >= AbortErrLev - if (Failed) call CleanUp() - end function Failed - subroutine CleanUp() - call SD_DestroyContState(dx, ErrStat2, ErrMsg2); - end subroutine -END SUBROUTINE SD_GetOP !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ !------------------------------------------------------------------------------------------------------ !> Perform Craig Bampton (CB) reduction and set parameters needed for States and Ouputs equations @@ -2707,8 +2805,13 @@ SUBROUTINE SetParameters(Init, p, MBBb, MBmb, KBBb, PhiRb, nM_out, OmegaL, PhiL, CHARACTER(*), INTENT( OUT) :: ErrMsg ! Error message if ErrStat /= ErrID_None ! local variables real(FEKi), allocatable :: Temp(:,:) - real(ReKi) :: TI_transpose(nDOFL_TP,p%nDOFI__) !bjj: added this so we don't have to take the transpose 5+ times - integer(IntKi) :: I + real(ReKi) :: dx,dy,dz + real(ReKi) :: TI_transpose(p%nDOFL_TP,p%nDOFI__) !bjj: added this so we don't have to take the transpose 5+ times + real(ReKi) :: GMat_transpose(p%nDOFL_TP,p%nDOFL_TP) + real(R8Ki) :: EOM_LHS1(6,6) + real(ReKi) :: Cmm(p%nDOFM,p%nDOFM), Kmm(p%nDOFM,p%nDOFM) + + integer(IntKi) :: I,J integer(IntKi) :: n ! size of jacobian in AM2 calculation INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 @@ -2726,8 +2829,23 @@ SUBROUTINE SetParameters(Init, p, MBBb, MBmb, KBBb, PhiRb, nM_out, OmegaL, PhiL, endif ! Set TI, transformation matrix from interface DOFs to TP ref point (Note: TI allocated in AllocParameters) - CALL RigidTrnsf(Init, p, Init%TP_RefPoint, p%IDI__, p%nDOFI__, p%TI, ErrStat2, ErrMsg2); if(Failed()) return - TI_transpose = TRANSPOSE(p%TI) + CALL RigidTrnsf(Init, p, Init%TP_RefPoint, p%IDI__, p%nDOFI__, p%nTP, p%TI, ErrStat2, ErrMsg2); if(Failed()) return + TI_transpose = TRANSPOSE(p%TI) + p%RBRefPt = Init%TP_RefPoint(:,1) ! Undisplaced position of the rigid-body reference point (1st dummy transition piece) + if (p%TP1IsRBRefPt) then + ! Set G, transformation matrix to reconstruct rigid-body modes to replace the first 6 Guyan modes (Note: G allocated in AllocParameters) + CALL Eye(p%GMat, ErrStat2, ErrMsg2); if(Failed()) return + do i = 2,p%nTP + dx = Init%TP_RefPoint(1,i)-Init%TP_RefPoint(1,1) + dy = Init%TP_RefPoint(2,i)-Init%TP_RefPoint(2,1) + dz = Init%TP_RefPoint(3,i)-Init%TP_RefPoint(3,1) + do j = 1,6 + CALL RigidTransformationLine(dx,dy,dz,j,p%GMat(6*(i-1)+j,1:6)) + enddo + p%rTP0(:,i-1) = (/dx,dy,dz/) + enddo + GMat_Transpose = TRANSPOSE(p%GMat) + endif ! Store Static Improvement Method constants if (p%SttcSolve /= idSIM_None) then @@ -2758,27 +2876,54 @@ SUBROUTINE SetParameters(Init, p, MBBb, MBmb, KBBb, PhiRb, nM_out, OmegaL, PhiL, !............................... p%MBB = MATMUL( MATMUL( TI_transpose, MBBb ), p%TI) != MBBt p%KBB = MATMUL( MATMUL( TI_transpose, KBBb ), p%TI) != KBBt + if (p%TP1IsRBRefPt) then + ! Transfom MBB and KBB to MGG and KGG + p%MBB = MATMUL( MATMUL( GMat_transpose, p%MBB ), p%GMat ) + p%KBB = MATMUL( MATMUL( GMat_transpose, p%KBB ), p%GMat ) + endif - ! 6x6 Guyan Damping matrix + ! Full user Guyan Damping matrix if (Init%GuyanDampMod == idGuyanDamp_None) then ! No Damping p%CBB = 0.0_ReKi elseif (Init%GuyanDampMod == idGuyanDamp_Rayleigh) then ! Rayleigh Damping - p%CBB = Init%RayleighDamp(1) * p%MBB + Init%RayleighDamp(2) * p%KBB - elseif (Init%GuyanDampMod == idGuyanDamp_66) then - ! User 6x6 matrix - if (size(p%CBB,1)/=6) then - ErrMsg='Cannot use 6x6 Guyan Damping matrix, number of interface DOFs is'//num2lstr(size(p%CBB,1)); ErrStat=ErrID_Fatal; - return + if (p%floating) then ! No damping for rigid-body motion + p%CBB = 0.0_ReKi + if (p%TP1IsRBRefPt) then + ! Rayleigh damping for elastic Guyan modes only + p%CBB(7:p%nDOFL_TP,7:p%nDOFL_TP) = Init%RayleighDamp(1) * p%MBB(7:p%nDOFL_TP,7:p%nDOFL_TP) + Init%RayleighDamp(2) * p%KBB(7:p%nDOFL_TP,7:p%nDOFL_TP) + end if + else + p%CBB = Init%RayleighDamp(1) * p%MBB + Init%RayleighDamp(2) * p%KBB endif - p%CBB = Init%GuyanDampMat + elseif (Init%GuyanDampMod == idGuyanDamp_Matrix) then + ! User full user-defined Guyan damping matrix + if (p%floating) then + ! No damping for rigid-body modes + p%CBB = 0.0_ReKi + if ( Init%GuyanDampSize /= (p%nDOFL_TP-6) ) then + ErrMsg='Guyan damping matrix should have a size of '//trim(num2lstr(p%nDOFL_TP-6))//'. '; ErrStat=ErrID_Fatal; return + end if + if (p%TP1IsRBRefPt) then + p%CBB(7:p%nDOFL_TP,7:p%nDOFL_TP) = Init%GuyanDampMat + end if + else + if ( Init%GuyanDampSize /= p%nDOFL_TP ) then + ErrMsg='Guyan damping matrix should have a size of '//trim(num2lstr(p%nDOFL_TP))//'. '; ErrStat=ErrID_Fatal; return + end if + p%CBB = Init%GuyanDampMat + end if endif !p%D1_15=-TI_transpose !this is 6x6NIN IF ( p%nDOFM > 0 ) THEN ! These values don't exist for nDOFM=0; i.e., p%nDOFM == 0 ! TODO cant use LAPACK due to type conversions FEKi->ReKi p%MBM = MATMUL( TI_transpose, MBmb ) ! NOTE: type conversion + if (p%TP1IsRBRefPt) then + ! Transform MBM to MGM + p%MBM = MATMUL( GMat_transpose, p%MBM ) + endif !CALL LAPACK_gemm( 'T', 'N', 1.0_ReKi, p%TI, MBmb, 0.0_ReKi, p%MBM, ErrStat2, ErrMsg2); if(Failed()) return p%MMB = TRANSPOSE( p%MBM ) != MMBt @@ -2789,6 +2934,13 @@ SUBROUTINE SetParameters(Init, p, MBBb, MBmb, KBBb, PhiRb, nM_out, OmegaL, PhiL, p%KMMDiag= OmegaL(1:p%nDOFM) * OmegaL(1:p%nDOFM) ! OmegaM is a one-dimensional array p%CMMDiag = 2.0_ReKi * OmegaL(1:p%nDOFM) * Init%JDampings(1:p%nDOFM) ! Init%JDampings is also a one-dimensional array + CMM = 0.0 + KMM = 0.0 + do i = 1,p%nDOFM + CMM(i,i) = p%CMMDiag(i) + KMM(i,i) = p%KMMDiag(i) + enddo + ! C1_11, C1_12 ( see eq 15 [multiply columns by diagonal matrix entries for diagonal multiply on the left]) DO I = 1, p%nDOFM ! if (p%nDOFM=p%nDOFM=nDOFM == 0), this loop is skipped p%C1_11(:, I) = -p%MBM(:, I)*p%KMMDiag(I) @@ -2820,30 +2972,6 @@ SUBROUTINE SetParameters(Init, p, MBBb, MBmb, KBBb, PhiRb, nM_out, OmegaL, PhiL, !p%D2_64 = MATMUL( p%PhiM, p%PhiM_T ) CALL LAPACK_GEMM( 'N', 'T', 1.0_ReKi, p%PhiM, p%PhiM, 0.0_ReKi, p%D2_64, ErrStat2, ErrMsg2 ); if(Failed()) return; - - !Now calculate a Jacobian used when AM2 is called and store in parameters - IF (p%IntMethod .EQ. 4) THEN ! Allocate Jacobian if AM2 is requested & if there are states (p%nDOFM > 0) - n=2*p%nDOFM - CALL AllocAry( p%AM2Jac, n, n, 'p%AM2InvJac', ErrStat2, ErrMsg2 ); if(Failed()) return - CALL AllocAry( p%AM2JacPiv, n, 'p%AM2JacPiv', ErrStat2, ErrMsg2 ); if(Failed()) return - - ! First we calculate the Jacobian: - ! (note the Jacobian is first stored as p%AM2InvJac) - p%AM2Jac=0. - DO i=1,p%nDOFM - p%AM2Jac(i+p%nDOFM,i ) =-p%SDdeltaT/2.*p%KMMDiag(i) !J21 - p%AM2Jac(i+p%nDOFM,i+p%nDOFM)=-p%SDdeltaT/2.*p%CMMDiag(i) !J22 -initialize - END DO - - DO I=1,p%nDOFM - p%AM2Jac(I,I)=-1. !J11 - p%AM2Jac(I,p%nDOFM+I)=p%SDdeltaT/2. !J12 - p%AM2Jac(p%nDOFM+I,p%nDOFM+I)=p%AM2Jac(p%nDOFM+I,p%nDOFM+I)-1 !J22 complete - ENDDO - ! Now need to factor it: - !I think it could be improved and made more efficient if we can say the matrix is positive definite - CALL LAPACK_getrf( n, n, p%AM2Jac, p%AM2JacPiv, ErrStat2, ErrMsg2); if(Failed()) return - END IF freq_max =maxval(OmegaL(1:p%nDOFM))/TwoPi dt_max = 1/(20*freq_max) @@ -2860,6 +2988,34 @@ SUBROUTINE SetParameters(Init, p, MBBb, MBmb, KBBb, PhiRb, nM_out, OmegaL, PhiL, p%D1_142 = - MATMUL(TI_transpose, TRANSPOSE(PhiRb)) END IF + if (p%TP1IsRBRefPt) then + ! Equations of motion left-hand-side matrix for rigid-body acceleration + EOM_LHS1 = p%MBB(1:6,1:6) & + + matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , matmul( p%MBB(7:p%nDOFL_TP,7:p%nDOFL_TP) , p%GMat(7:p%nDOFL_TP, 1:6) ) ) & + - matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , p%MBB(7:p%nDOFL_TP,1:6) ) & + - matmul( p%MBB(1:6,7:p%nDOFL_TP) , p%GMat(7:p%nDOFL_TP, 1:6) ) + p%EOM_RHS1_1 = matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , p%MBB(7:p%nDOFL_TP,7:p%nDOFL_TP) ) - p%MBB(1:6,7:p%nDOFL_TP) + p%EOM_RHS1_2 = matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , p%CBB(7:p%nDOFL_TP,7:p%nDOFL_TP) ) + p%EOM_RHS1_3 = matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , p%KBB(7:p%nDOFL_TP,7:p%nDOFL_TP) ) + p%EOM_RHS3_1 = p%MBB(7:p%nDOFL_TP,1:6) - matmul( p%MBB(7:p%nDOFL_TP,7:p%nDOFL_TP) , p%GMat(7:p%nDOFL_TP, 1:6) ) + if ( p%nDOFM > 0 ) then + EOM_LHS1 = EOM_LHS1 & + - matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , matmul( & + matmul( p%MBm(7:p%nDOFL_TP,:), p%MmB(:,7:p%nDOFL_TP) ) , & + p%GMat(7:p%nDOFL_TP, 1:6) ) ) & + + matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , matmul( p%MBm(7:p%nDOFL_TP,:) , p%MmB(:,1:6) ) ) & + + matmul( matmul( p%MBm(1:6,:) , p%MmB(:,7:p%nDOFL_TP) ) , p%GMat(7:p%nDOFL_TP, 1:6) ) & + - matmul( p%MBm(1:6,:) , p%MmB(:,1:6) ) + p%EOM_RHS1_1 = p%EOM_RHS1_1 + matmul(p%MBm(1:6,:),p%MmB(:,7:p%nDOFL_TP)) & + -matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , matmul( p%MBm(7:p%nDOFL_TP,:) , p%MmB(:,7:p%nDOFL_TP) ) ) + p%EOM_RHS1_4 = matmul( p%MBm(1:6,:) - matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , p%MBm(7:p%nDOFL_TP,:) ) , Cmm ) + p%EOM_RHS1_5 = matmul( p%MBm(1:6,:) - matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , p%MBm(7:p%nDOFL_TP,:) ) , Kmm ) + p%EOM_RHS1_6 = matmul( GMat_Transpose(1:6,7:p%nDOFL_TP) , p%MBm(7:p%nDOFL_TP,:) ) - p%MBm(1:6,:) + p%EOM_RHS2_1 = - p%MmB(:,1:6) + matmul( p%MmB(:,7:p%nDOFL_TP) , p%GMat(7:p%nDOFL_TP, 1:6) ) + end if + call PseudoInverse(EOM_LHS1, p%EOM_LHS1, ErrStat2, ErrMsg2); if (Failed()) return + end if + CONTAINS LOGICAL FUNCTION Failed() call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SetParameters') @@ -2882,29 +3038,43 @@ SUBROUTINE AllocParameters(p, nDOFM, ErrStat, ErrMsg) ErrStat = ErrID_None ErrMsg = "" - CALL AllocAry( p%KBB, nDOFL_TP, nDOFL_TP, 'p%KBB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%CBB, nDOFL_TP, nDOFL_TP, 'p%CBB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%MBB, nDOFL_TP, nDOFL_TP, 'p%MBB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%TI, p%nDOFI__, 6, 'p%TI', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%D1_141, nDOFL_TP, p%nDOF__L,'p%D1_141', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%D1_142, nDOFL_TP, p%nDOF__L,'p%D1_142', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%PhiRb_TI, p%nDOF__L, nDOFL_TP,'p%PhiRb_TI', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%KBB, p%nDOFL_TP, p%nDOFL_TP, 'p%KBB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%CBB, p%nDOFL_TP, p%nDOFL_TP, 'p%CBB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%MBB, p%nDOFL_TP, p%nDOFL_TP, 'p%MBB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%TI, p%nDOFI__, p%nDOFL_TP, 'p%TI', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%D1_141, p%nDOFL_TP, p%nDOF__L, 'p%D1_141', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%D1_142, p%nDOFL_TP, p%nDOF__L, 'p%D1_142', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%PhiRb_TI, p%nDOF__L, p%nDOFL_TP, 'p%PhiRb_TI', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + + if (p%TP1IsRBRefPt) then + CALL AllocAry( p%rTP0, 3, p%nTP, 'p%rTP0', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%GMat, p%nDOFL_TP, p%nDOFL_TP, 'p%GMat', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%EOM_RHS1_1, 6, p%nDOFL_TP, 'p%EOM_RHS1_1',ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%EOM_RHS1_2, 6, p%nDOFL_TP, 'p%EOM_RHS1_2',ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%EOM_RHS1_3, 6, p%nDOFL_TP, 'p%EOM_RHS1_3',ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + if (p%nDOFM>0) then + CALL AllocAry( p%EOM_RHS1_4, 6, p%nDOFL_TP, 'p%EOM_RHS1_4',ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%EOM_RHS1_5, 6, p%nDOFL_TP, 'p%EOM_RHS1_5',ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%EOM_RHS1_6, 6, p%nDOFL_TP, 'p%EOM_RHS1_6',ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%EOM_RHS2_1, p%nDOFM, 6, 'p%EOM_RHS2_1',ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%EOM_RHS3_1, p%nDOFL_TP-6, 6, 'p%EOM_RHS3_1',ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + endif + endif - -if (p%nDOFM > 0 ) THEN - CALL AllocAry( p%MBM, nDOFL_TP, nDOFM, 'p%MBM', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%MMB, nDOFM, nDOFL_TP, 'p%MMB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%KMMDiag, nDOFM, 'p%KMMDiag', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%CMMDiag, nDOFM, 'p%CMMDiag', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%C1_11, nDOFL_TP, nDOFM, 'p%C1_11', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%C1_12, nDOFL_TP, nDOFM, 'p%C1_12', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%PhiM, p%nDOF__L, nDOFM, 'p%PhiM', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%C2_61, p%nDOF__L, nDOFM, 'p%C2_61', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%C2_62, p%nDOF__L, nDOFM, 'p%C2_62', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') - CALL AllocAry( p%MBmmB, nDOFL_TP, nDOFL_TP , 'p%MBmmB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') ! is p%MBB when p%nDOFM == 0 - CALL AllocAry( p%D2_63, p%nDOF__L, nDOFL_TP, 'p%D2_63', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') ! is p%PhiRb_TI when p%nDOFM == 0 - CALL AllocAry( p%D2_64, p%nDOF__L, p%nDOF__L,'p%D2_64', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') ! is zero when p%nDOFM == 0 -end if + if (p%nDOFM > 0 ) THEN + CALL AllocAry( p%MBM, p%nDOFL_TP, nDOFM, 'p%MBM', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%MMB, nDOFM, p%nDOFL_TP, 'p%MMB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%KMMDiag, nDOFM, 'p%KMMDiag', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%CMMDiag, nDOFM, 'p%CMMDiag', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%C1_11, p%nDOFL_TP, nDOFM, 'p%C1_11', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%C1_12, p%nDOFL_TP, nDOFM, 'p%C1_12', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%PhiM, p%nDOF__L, nDOFM, 'p%PhiM', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%C2_61, p%nDOF__L, nDOFM, 'p%C2_61', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%C2_62, p%nDOF__L, nDOFM, 'p%C2_62', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') + CALL AllocAry( p%MBmmB, p%nDOFL_TP, p%nDOFL_TP, 'p%MBmmB', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') ! is p%MBB when p%nDOFM == 0 + CALL AllocAry( p%D2_63, p%nDOF__L, p%nDOFL_TP, 'p%D2_63', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') ! is p%PhiRb_TI when p%nDOFM == 0 + CALL AllocAry( p%D2_64, p%nDOF__L, p%nDOF__L, 'p%D2_64', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocParameters') ! is zero when p%nDOFM == 0 + end if END SUBROUTINE AllocParameters @@ -2923,11 +3093,17 @@ SUBROUTINE AllocMiscVars(p, Misc, ErrStat, ErrMsg) ErrMsg = "" ! for readability, we're going to keep track of the max ErrStat through SetErrStat() and not return until the end of this routine. + CALL AllocAry( Misc%u_TP, p%nDOFL_TP, 'u_TP', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%udot_TP, p%nDOFL_TP, 'udot_TP', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%udotdot_TP, p%nDOFL_TP, 'udotdot_TP', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%Y1, p%nDOFL_TP, 'Y1', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%Y1_Guy_R, p%nDOFL_TP, 'Y1_Guy_R', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%Y1_Guy_L, p%nDOFL_TP, 'Y1_Guy_L', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') CALL AllocAry( Misc%F_L, p%nDOF__L, 'F_L', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') CALL AllocAry( Misc%F_L2, p%nDOF__L, 'F_L2', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') - CALL AllocAry( Misc%UR_bar, p%nDOFI__, 'UR_bar', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') !TODO Rb - CALL AllocAry( Misc%UR_bar_dot, p%nDOFI__, 'UR_bar_dot', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') !TODO Rb - CALL AllocAry( Misc%UR_bar_dotdot,p%nDOFI__, 'UR_bar_dotdot', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') !TODO Rb + CALL AllocAry( Misc%UR_bar, p%nDOFI__, 'UR_bar', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%UR_bar_dot, p%nDOFI__, 'UR_bar_dot', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%UR_bar_dotdot,p%nDOFI__, 'UR_bar_dotdot', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') CALL AllocAry( Misc%UL, p%nDOF__L, 'UL', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') CALL AllocAry( Misc%UL_NS, p%nDOF__L, 'UL_NS', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') CALL AllocAry( Misc%UL_dot, p%nDOF__L, 'UL_dot', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') @@ -2941,11 +3117,17 @@ SUBROUTINE AllocMiscVars(p, Misc, ErrStat, ErrMsg) CALL AllocAry( Misc%U_full_dot, p%nDOF, 'U_full_dot', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') CALL AllocAry( Misc%U_full_dotdot,p%nDOF, 'U_full_dotdot', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') CALL AllocAry( Misc%U_red, p%nDOF_red, 'U_red', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%Fext, p%nDOF , 'm%Fext ', ErrStat2, ErrMsg2 );CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%Fext_red, p%nDOF_red , 'm%Fext_red', ErrStat2, ErrMsg2 );CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%FG, p%nDOF , 'm%FG ', ErrStat2, ErrMsg2 );CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%F_TP, p%nDOFL_TP , 'm%F_TP' , ErrStat2, ErrMsg2 );CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + + IF (p%IntMethod .EQ. 4) THEN + CALL AllocAry( Misc%AM2Jac, 2*(p%nDOFRB+p%nDOFM), 2*(p%nDOFRB+p%nDOFM),'AM2Jac',ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%AM2xq, 2*(p%nDOFRB+p%nDOFM), 1,'AM2xq', ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + CALL AllocAry( Misc%AM2xq2, 2*(p%nDOFRB+p%nDOFM), 1,'AM2xq2',ErrStat2, ErrMsg2); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') + END IF - CALL AllocAry( Misc%Fext, p%nDOF , 'm%Fext ', ErrStat2, ErrMsg2 );CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') - CALL AllocAry( Misc%Fext_red, p%nDOF_red , 'm%Fext_red', ErrStat2, ErrMsg2 );CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') - CALL AllocAry( Misc%FG, p%nDOF , 'm%FG ', ErrStat2, ErrMsg2 );CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'AllocMiscVars') - END SUBROUTINE AllocMiscVars !------------------------------------------------------------------------------------------------------ @@ -2983,12 +3165,12 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) ErrMsg = "" ! --- Count nodes per types p%nNodes_I = p%nNodes_I ! Number of interface nodes - nNodes_R = p%nNodes_I+p%nNodes_C ! I+C nodes + nNodes_R = p%nNodes_I+p%nNodes_C ! I+C nodes p%nNodes_L = p%nNodes - nNodes_R ! Number of Interior nodes ! NOTE: some of the interior nodes may have no DOF if they are involved in a rigid assembly.. CALL AllocAry( p%Nodes_L, p%nNodes_L, 1, 'p%Nodes_L', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'PartitionDOFNodes') - CALL AllocAry( Nodes_R , nNodes_R , 'Nodes_R' , ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'PartitionDOFNodes') + CALL AllocAry( Nodes_R, nNodes_R, 'Nodes_R', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'PartitionDOFNodes') ! -------------------------------------------------------------------------------- ! --- Partition Nodes: Nodes_L = IAll - NodesR @@ -3005,6 +3187,9 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) ! -------------------------------------------------------------------------------- ! --- Count DOFs - NOTE: we count node by node ! -------------------------------------------------------------------------------- + ! DOFs of transition pieces + p%nDOFL_TP = 6*p%nTP + ! DOFs of interface nodes p%nDOFI__ =0 ! Total p%nDOFI_Rb=0 ! Leader @@ -3012,7 +3197,7 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) do iiNode= 1,p%nNodes_I p%nDOFI__ = p%nDOFI__ + len(p%NodesDOFred( p%Nodes_I(iiNode,1) )) p%nDOFI_Rb= p%nDOFI_Rb+ count(p%Nodes_I(iiNode, 2:7)==idBC_Leader) ! assumes 6 DOFs - p%nDOFI_F = p%nDOFI_F + count(p%Nodes_I(iiNode, 2:7)==idBC_Fixed) ! assumes 6 DOFs + p%nDOFI_F = p%nDOFI_F + count(p%Nodes_I(iiNode, 2:7)==idBC_Fixed) ! assumes 6 DOFs enddo if (p%nDOFI__/=p%nDOFI_Rb+p%nDOFI_F) then call Fatal('Error in distributing interface DOFs, total number of interface DOF('//num2lstr(p%nDOFI__)//') does not equal sum of: leader ('//num2lstr(p%nDOFI_Rb)//'), fixed ('//num2lstr(p%nDOFI_F)//')'); return @@ -3066,7 +3251,7 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) CALL AllocAry( p%IDR__, p%nDOFR__, 'p%IDR__', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'PartitionDOFNodes') CALL AllocAry( p%ID__Rb,p%nDOF__Rb, 'p%ID__Rb',ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'PartitionDOFNodes') CALL AllocAry( p%ID__F, p%nDOF__F, 'p%ID__F', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'PartitionDOFNodes') - CALL AllocAry( p%ID__L, p%nDOF__L, 'p%ID__L', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'PartitionDOFNodes') ! TODO TODO + CALL AllocAry( p%ID__L, p%nDOF__L, 'p%ID__L', ErrStat2, ErrMsg2 ); CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'PartitionDOFNodes') if(Failed()) return ! -------------------------------------------------------------------------------- @@ -3083,13 +3268,13 @@ SUBROUTINE PartitionDOFNodes(Init, m, p, ErrStat, ErrMsg) if (p%Nodes_I(iiNode, J+1)==idBC_Leader) then c_B=c_B+1 p%IDI_Rb(c_B) = p%NodesDOFred(iNode)%List(J) ! DOF number - elseif (p%Nodes_I(iiNode, J+1)==idBC_Fixed) then ! c_F=c_F+1 p%IDI_F(c_F) = p%NodesDOFred(iNode)%List(J) ! DOF number endif enddo enddo + ! Indices IDI__ = [IDI_B, IDI_F], interface !call concatenate_lists(p%IDI_Rb, p%IDI_F, p%IDI__, ErrStat2, ErrMsg2); if(Failed()) return @@ -3208,11 +3393,14 @@ END SUBROUTINE PartitionDOFNodes !! This is a generic function, "x" can be used for displacements, velocities, accelerations !! m%U_red is only used as a intermediate storage SUBROUTINE ReducedToFull(p, m, xR_bar, xL, x_full) + use NWTC_LAPACK, only: LAPACK_GEMV TYPE(SD_ParameterType),target,INTENT(IN ) :: p !< Parameters TYPE(SD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables REAL(ReKi), DIMENSION(:), INTENT(IN ) :: xR_bar !< Values of "x" interface nodes (6xnI) REAL(ReKi), DIMENSION(:), INTENT(IN ) :: xL !< Values of "x" internal nodes - REAL(ReKi), DIMENSION(:), INTENT( OUT) :: x_full !< Values of "x" transferred to full vector of DOF + REAL(R8Ki), DIMENSION(:), INTENT( OUT) :: x_full !< Values of "x" transferred to full vector of DOF + integer(IntKi) :: ErrStat + character(ErrMsgLen) :: ErrMsg if (p%reduced) then ! Filling up full vector of reduced DOF m%U_red(p%IDI__) = xR_bar @@ -3220,7 +3408,9 @@ SUBROUTINE ReducedToFull(p, m, xR_bar, xL, x_full) m%U_red(p%IDC_Rb)= 0 ! NOTE: for now we don't have leader DOF at "C" (bottom) m%U_red(p%ID__F) = 0 ! Transfer to full - x_full = matmul(p%T_red, m%U_red) ! TODO use LAPACK, but T_red and U_red have different types... + ! x_full = matmul(p%T_red, m%U_red) + call LAPACK_GEMV('N', size(p%T_red, 1), size(p%T_red, 2), 1.0_R8Ki, p%T_red, & + size(p%T_red, 1), m%U_red, 1, 0.0_R8ki, x_full, 1) else ! We use U_full directly x_full(p%IDI__) = xR_bar @@ -3230,83 +3420,366 @@ SUBROUTINE ReducedToFull(p, m, xR_bar, xL, x_full) endif END SUBROUTINE ReducedToFull +!> Computes the (relative) displacement, velocity, and acceleration of the transition pieces +!! +SUBROUTINE GetUTP(u, p, x, m, ErrStat, ErrMsg, bPrime) + TYPE(SD_InputType), INTENT(IN ) :: u !< Inputs at t + TYPE(SD_ParameterType),target,INTENT(IN ) :: p !< Parameters + TYPE(SD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point + TYPE(SD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + LOGICAL, INTENT(IN ) :: bPrime !< Flag to remove the contributions from rigid-body acceleration to m%udotdot_TP (set to true when constructing the EOM RHS) (floating only) + + ! Local variables + INTEGER(IntKi) :: iTP, Idx + REAL(ReKi) :: rotations(3) ! Small rotation vector for transition pieces (fixed-bottom only) + REAL(R8Ki) :: omega(3), omega_dot(3) ! Rigid-body ! Rigid-body angular velocity and acceleration resolved in the global earth-fixed coordinate system + REAL(R8Ki) :: qRR, qRP, qRY ! Rigid-body roll, pitch, yaw Tait-Bryan angles + REAL(R8Ki) :: qRRdot, qRPdot, qRYdot ! Time derivatives of rigid-body Tait-Bryan angles + REAL(R8Ki) :: qRRdotdot, qRPdotdot, qRYdotdot ! Second time derivatives of rigid-body Tait-Bryan angles + real(ReKi), dimension(3) :: rIP ! Vector from the ith TP to the first TP + real(ReKi), dimension(3) :: rIP0 ! Vector from the ith TP to the first TP (undeflected/undisplaced) + real(R8Ki), dimension(3,3) :: Rg2b ! Rotation matrix from global earth-fixed coordinate system to rigid-body coordinate system + real(R8Ki), dimension(6,6) :: RRg2b ! 6-by-6 rotation matrix build from Rg2b + INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None + + ErrStat = ErrID_None + ErrMsg = '' + + ! If floating, + ! the outputs m%u_TP, m%udot_TP, and m%udotdot_TP contain the absolute motion of the first (possibly dummy) transition piece used to track + ! possibly large rigid-body motion. The rest of the entries contain the apparent/relative motion of the second to last transition pieces as + ! observed in the rigid-body attached frame of reference, i.e., Delta U_TP and its time derivatives. All except the displacement of the first + ! transition piece are resolved in the rigid-body frame of reference. + + ! If fixed bottom, + ! the outputs contain the absolute but small motion of all transition pieces resolved in the earth-fixed coordinate system. + + IF ( p%Floating ) THEN + ! For a floating structure, u_TP(1:6) contains the absolute displacements and the Tait-Bryan angles of the first (possibly dummy) transition piece + ! measured in the earth-fixed coordinate system used to represent the potentially large rigid-body motion of the platform. + + ! udot_TP(1:6) and udotdot_TP(1:6) contains the absolute velocity and acceleration of the first (possibly dummy) transition piece resolved in the + ! rigid-body frame of reference that rotates with the first transition piece. + + ! The rest of the entries of u_TP, udot_TP, and udotdot_TP (if more than one transition piece is present) all contains the relative/apparent motion + ! of the rest of the transition pieces relative to the rigid-body/1st-transition-piece motion. + + if (p%TP1IsRBRefPt) then + ! The first transition piece is a dummy one internal to SD and not coupled with ElastoDyn + + ! Rigid-body rotation matrices for floating only - based on the first transition piece + Rg2b(1:3,1:3) = EulerConstructZYX(x%qR(4:6)) ! global to rigid-body coordinates + RRg2b(:,:) = 0.0_R8Ki + RRg2b(1:3,1:3) = Rg2b + RRg2b(4:6,4:6) = Rg2b + + ! First transition piece used to represent the floater rigid-body motion is handled differently + m%u_TP(1:6) = x%qR + qRR = x%qR(4) ! Rigid-body roll + qRP = x%qR(5) ! Rigid-body pitch + qRY = x%qR(6) ! Rigid-body yaw + qRRdot = x%qRdot(4) + qRPdot = x%qRdot(5) + qRYdot = x%qRdot(6) + + ! Rigid-body angular velocity in the global earth-fixed system + omega = (/ cos(qRP)*cos(qRY)*qRRdot - sin(qRY)*qRPdot , & + cos(qRP)*sin(qRY)*qRRdot + cos(qRY)*qRPdot , & + -sin(qRP) *qRRdot + qRYdot /) + ! Rigid-body translational and angular velocity in the rigid-body frame of reference + m%udot_TP(1:6) = MATMUL( RRg2b , (/x%qRdot(1:3), omega/) ) + + if (bPrime) then + m%udotdot_TP(1:6) = 0.0 + else + ! Compute rigid-body angular acceleration in the global earth-fixed system + qRRdotdot = m%qRdotdot(4) + qRPdotdot = m%qRdotdot(5) + qRYdotdot = m%qRdotdot(6) + omega_dot = (/ cos(qRP)*cos(qRY)*qRRdotdot - sin(qRY)*qRPdotdot , & + cos(qRP)*sin(qRY)*qRRdotdot + cos(qRY)*qRPdotdot , & + -sin(qRP) *qRRdotdot + qRYdotdot /) & + +(/ -qRPdot*qRYdot*cos(qRY) - qRRdot*(qRPdot*sin(qRP)*cos(qRY)+qRYdot*cos(qRP)*sin(qRY)), & + -qRPdot*qRYdot*sin(qRY) - qRRdot*(qRPdot*sin(qRP)*sin(qRY)-qRYdot*cos(qRP)*cos(qRY)), & + -qRPdot*qRRdot*cos(qRP) /) + ! Rigid-body translational and angular acceleration in the rigid-body frame of reference + m%udotdot_TP(1:6) = MATMUL( RRg2b , (/m%qRdotdot(1:3), omega_dot/) ) + endif + + ! Additional transition pieces coupled to ElastoDyn instances + DO iTP = 2,p%nTP + Idx = 6*iTP-5 + ! Instantaneous vector from rigid-body reference point (dummy TP1) to the current TP in global earth-fixed system (X_TPj-XTP1) + rIP = ( u%TPMesh(iTP-1)%Position(:,1) + u%TPMesh(iTP-1)%TranslationDisp(:,1) ) - (p%RBRefPt + x%qR(1:3)) + m%u_TP(Idx:(Idx+2)) = matmul(Rg2b,rIP)-p%rTP0(:,iTP-1) + m%u_TP((Idx+3):(Idx+5)) = GetSmllRotAngs(matmul(u%TPMesh(iTP-1)%Orientation(:,:,1),transpose(Rg2b)), ErrStat2, ErrMsg2); if(Failed()) return + m%udot_TP(Idx:(Idx+2)) = matmul(Rg2b,(u%TPMesh(iTP-1)%TranslationVel(:,1)-x%qRdot(1:3))-CROSS_PRODUCT( omega, rIP )) + m%udot_TP((Idx+3):(Idx+5)) = matmul(Rg2b,u%TPMesh(iTP-1)%RotationVel(:,1)-omega) + if (bPrime) then + m%udotdot_TP(Idx:(Idx+2)) = matmul(Rg2b, & + CROSS_PRODUCT( omega, CROSS_PRODUCT( omega, rIP ) ) & + - 2.0 * CROSS_PRODUCT( omega, u%TPMesh(iTP-1)%TranslationVel(:,1)-x%qRdot(1:3) ) & + + u%TPMesh(iTP-1)%TranslationAcc(:,1) & + ) + m%udotdot_TP((Idx+3):(Idx+5)) = matmul(Rg2b,u%TPMesh(iTP-1)%RotationAcc(:,1)-CROSS_PRODUCT( omega, u%TPMesh(iTP-1)%RotationVel(:,1)) ) + else + m%udotdot_TP(Idx:(Idx+2)) = matmul(Rg2b, & + CROSS_PRODUCT( omega, CROSS_PRODUCT( omega, rIP ) ) & + - CROSS_PRODUCT( omega_dot, rIP ) & + - 2.0 * CROSS_PRODUCT( omega, u%TPMesh(iTP-1)%TranslationVel(:,1)-x%qRdot(1:3) ) & + + ( u%TPMesh(iTP-1)%TranslationAcc(:,1)-m%qRdotdot(1:3) ) & + ) + m%udotdot_TP((Idx+3):(Idx+5)) = matmul(Rg2b,u%TPMesh(iTP-1)%RotationAcc(:,1)-omega_dot-CROSS_PRODUCT( omega, u%TPMesh(iTP-1)%RotationVel(:,1)) ) + endif + ENDDO + + else ! Only one transition piece + + ! Rigid-body rotation matrices for floating only - based on the first transition piece + Rg2b(1:3,1:3) = u%TPMesh(1)%Orientation(:,:,1) ! global to rigid-body coordinates + RRg2b(:,:) = 0.0_R8Ki + RRg2b(1:3,1:3) = Rg2b + RRg2b(4:6,4:6) = Rg2b + + ! First transition piece used to represent the floater rigid-body motion is handled separately + m%u_TP(1:6) = (/u%TPMesh(1)%TranslationDisp(:,1),EulerExtractZYX(u%TPMesh(1)%Orientation(:,:,1))/) + m%udot_TP(1:6) = MATMUL( RRg2b , (/u%TPMesh(1)%TranslationVel(:,1), u%TPMesh(1)%RotationVel(:,1)/) ) + m%udotdot_TP(1:6) = MATMUL( RRg2b , (/u%TPMesh(1)%TranslationAcc(:,1), u%TPMesh(1)%RotationAcc(:,1)/) ) + + end if + + ELSE + + ! For a fixed-bottom structure, we only need the small absolute motion of all transition pieces in the earth-fixed coordinate system. + DO iTP = 1,p%nTP + Idx = 6*iTP-5 + ! Need to be small angles due to the Guyan stiffness terms + rotations = GetSmllRotAngs(u%TPMesh(iTP)%Orientation(:,:,1), ErrStat2, ErrMsg2); if(Failed()) return + m%u_TP(Idx:(Idx+5)) = (/REAL(u%TPMesh(iTP)%TranslationDisp(:,1),ReKi), rotations/) + m%udot_TP(Idx:(Idx+5)) = (/u%TPMesh(iTP)%TranslationVel(:,1), u%TPMesh(iTP)%RotationVel(:,1)/) + m%udotdot_TP(Idx:(Idx+5)) = (/u%TPMesh(iTP)%TranslationAcc(:,1), u%TPMesh(iTP)%RotationAcc(:,1)/) + ENDDO + + END IF + +Contains + LOGICAL FUNCTION Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'GetUTP') + Failed = ErrStat >= AbortErrLev + END FUNCTION Failed + +END SUBROUTINE GetUTP + +!> Compute displacements of all nodes in global system (Rigid body + elastic Guyan + rotated CB) +!! +SUBROUTINE GetUFulls(u, p, x, m, ErrStat, ErrMsg) + TYPE(SD_InputType), INTENT(IN ) :: u !< Inputs at t + TYPE(SD_ParameterType),target,INTENT(IN ) :: p !< Parameters + TYPE(SD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at operating point + TYPE(SD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables + INTEGER(IntKi), INTENT( OUT) :: ErrStat + CHARACTER(*), INTENT( OUT) :: ErrMsg + + ! Local variables + INTEGER(IntKi) :: iSDNode + INTEGER(IntKi), pointer :: DOFList(:) + REAL(R8Ki) :: DCM(3,3) ! Orientation matrix of small elastic nodal rotation + REAL(ReKi), dimension(3) :: RBVel, RBAcc ! Rigid-body translational velocity and acceleration + REAL(ReKi), dimension(3) :: Om, OmD ! Rigid-body rotational velocity and acceleration (Omega, OmegaDot) + REAL(ReKi), dimension(3) :: rIP ! Vector from TP to rotated Node + REAL(ReKi), dimension(3) :: rIP0 ! Vector from TP to Node (undeflected) + REAL(ReKi), dimension(3) :: Om_X_r ! Crossproduct of Omega and r + REAL(ReKi), dimension(3) :: duP ! Displacement of node due to rigid rotation + REAL(ReKi), dimension(3) :: vP ! Rigid-body velocity of node + REAL(ReKi), dimension(3) :: aP ! Rigid-body acceleration of node + REAL(R8Ki), dimension(3,3) :: Rg2b ! Rotation matrix global 2 body coordinates + REAL(R8Ki), dimension(3,3) :: Rb2g ! Rotation matrix body 2 global coordinates + INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None + + ErrStat = ErrID_None + ErrMsg = '' + + ! The subroutine depends on m%F_L, m%qmdotdot, m%u_TP, m%udot_TP, and m%udotdot_TP + ! Call SD_SolveEOM first before calling this subroutine to populate all necessary inputs + + ! --- CB modes contribution to motion (L-DOF only) + if ( p%nDOFM > 0) then + m%UL = matmul( p%PhiM, x%qm ) + m%UL_dot = matmul( p%PhiM, x%qmdot ) + m%UL_dotdot = matmul( p%PhiM, m%qmdotdot ) + else + m%UL = 0.0_ReKi + m%UL_dot = 0.0_ReKi + m%UL_dotdot = 0.0_ReKi + end if + + ! --- Adding elastic Guyan contribution to R and L DOFs + if (.not.p%Floating) then + ! All Guyan modes are elastic + m%UR_bar = matmul( p%TI , m%u_TP ) + m%UR_bar_dot = matmul( p%TI , m%udot_TP ) + m%UR_bar_dotdot = matmul( p%TI , m%udotdot_TP ) + m%UL = m%UL + matmul( p%PhiRb_TI, m%u_TP ) + m%UL_dot = m%UL_dot + matmul( p%PhiRb_TI, m%udot_TP ) + m%UL_dotdot = m%UL_dotdot + matmul( p%PhiRb_TI, m%udotdot_TP ) + else + ! 1st TP (dummy or not) always represents rigid-body motion. Contributions from rigid-body motion are added later. + if (p%nTP>1) then + ! Add contributions from the elastic Guyan modes associated with the second to last TPs + m%UR_bar = matmul( p%TI(:,7:p%nDOFL_TP), m%u_TP (7:p%nDOFL_TP) ) + m%UR_bar_dot = matmul( p%TI(:,7:p%nDOFL_TP), m%udot_TP (7:p%nDOFL_TP) ) + m%UR_bar_dotdot = matmul( p%TI(:,7:p%nDOFL_TP), m%udotdot_TP(7:p%nDOFL_TP) ) + m%UL = m%UL + matmul( p%PhiRb_TI(:,7:p%nDOFL_TP), m%u_TP (7:p%nDOFL_TP) ) + m%UL_dot = m%UL_dot + matmul( p%PhiRb_TI(:,7:p%nDOFL_TP), m%udot_TP (7:p%nDOFL_TP) ) + m%UL_dotdot = m%UL_dotdot + matmul( p%PhiRb_TI(:,7:p%nDOFL_TP), m%udotdot_TP(7:p%nDOFL_TP) ) + else + m%UR_bar = 0.0_ReKi + m%UR_bar_dot = 0.0_ReKi + m%UR_bar_dotdot = 0.0_ReKi + endif + endif + m%UL_NS = m%UL ! Storing deflections without SIM + + ! Static improvement (modify UL) + if (p%SttcSolve/=idSIM_None) then + m%F_L2 = MATMUL(p%PhiL_T , m%F_L) ! NOTE: Gravity in F_L + m%UL_SIM = MATMUL(p%PhiLInvOmgL2, m%F_L2) + if ( p%nDOFM > 0) then + m%UL_0m = MATMUL( p%PhiLInvOmgL2(:,1:p%nDOFM), m%F_L2(1:p%nDOFM) ) + m%UL_SIM = m%UL_SIM - m%UL_0m + end if + m%UL = m%UL + m%UL_SIM + endif + + ! --- Build original DOF vectors ("full", prior to constraints and CB) + call ReducedToFull(p, m, m%UR_bar , m%UL , m%U_full ) + call ReducedToFull(p, m, m%UR_bar_dot , m%UL_dot , m%U_full_dot ) + call ReducedToFull(p, m, m%UR_bar_dotdot, m%UL_dotdot, m%U_full_dotdot) + ! Do the same for the displacements without SIM. We'll use those for Y3 mesh + call ReducedToFull(p, m, m%UR_bar , m%UL_NS , m%U_full_NS ) + + ! Storing elastic motion (full motion for fixed bottom, elastic Guyan+CB motion+SIM for floating) + m%U_full_elast = m%U_full + + ! Add rigid-body contributions for floating cases + if (p%Floating) then + + ! For floating, we still need to add rigid body motion following the first TP + ! This introduce non-linear "rotations" effects, where the bottom node should "go up", and not just translate horizontally + Rg2b = EulerConstructZYX(m%u_TP(4:6)) + Rb2g = transpose(Rg2b) + RBVel(1:3) = matmul(Rb2g, m%udot_TP(1:3)) + RBAcc(1:3) = matmul(Rb2g, m%udotdot_TP(1:3)) + Om(1:3) = matmul(Rb2g, m%udot_TP(4:6)) + OmD(1:3) = matmul(Rb2g, m%udotdot_TP(4:6)) + + do iSDNode = 1,p%nNodes + + DOFList => p%NodesDOF(iSDNode)%List ! Alias to shorten notations + + ! --- Guyan (rigid body) motion in global coordinates + rIP0(1:3) = p%DP0(1:3, iSDNode) + rIP(1:3) = matmul(Rb2g, rIP0) + duP(1:3) = rIP - rIP0 + m%u_TP(1:3) + + ! Full displacements CB-rotated + Guyan (KEEP ME) >>> Rotate All + m%U_full_NS (DOFList(1:3)) = matmul(Rb2g, m%U_full_NS (DOFList(1:3))) + duP(1:3) + CALL SmllRotTrans('Nodal rotation',m%U_full_NS(DOFList(4)),m%U_full_NS(DOFList(5)),m%U_full_NS(DOFList(6)),DCM,'',ErrStat2,ErrMsg2); if(Failed()) return + m%U_full_NS (DOFList(4:6)) = EulerExtractZYX( matmul(DCM,Rg2b) ) + + m%U_full (DOFList(1:3)) = matmul(Rb2g, m%U_full (DOFList(1:3))) + duP(1:3) + CALL SmllRotTrans('Nodal rotation',m%U_full(DOFList(4)),m%U_full(DOFList(5)),m%U_full(DOFList(6)),DCM,'',ErrStat2,ErrMsg2); if(Failed()) return + m%U_full (DOFList(4:6)) = EulerExtractZYX( matmul(DCM,Rg2b) ) + + rIP(1:3) = m%U_full_NS(DOFList(1:3)) - m%u_TP(1:3) + rIP0 ! X_j-X_TP1 = (X_j-X_j^0) - (X_TP1-X_TP1^0) + (X_j^0-X_TP1^0) + Om_X_r(1:3) = cross_product(Om, rIP) + + vP(1:3) = RBVel + Om_X_r + m%U_full_dot (DOFList(1:3)) = matmul(Rb2g, m%U_full_dot (DOFList(1:3))) + vP(1:3) + m%U_full_dot (DOFList(4:6)) = matmul(Rb2g, m%U_full_dot (DOFList(4:6))) + Om(1:3) + + aP(1:3) = RBAcc + cross_product(OmD, rIP) - cross_product(Om, Om_X_r) + 2.0 * CROSS_PRODUCT( Om, m%U_full_dot (DOFList(1:3)) - RBVel ) + m%U_full_dotdot(DOFList(1:3)) = matmul(Rb2g, m%U_full_dotdot(DOFList(1:3))) + aP(1:3) + m%U_full_dotdot(DOFList(4:6)) = matmul(Rb2g, m%U_full_dotdot(DOFList(4:6))) + OmD(1:3) + CROSS_PRODUCT(Om, m%U_full_dot(DOFList(4:6))) + + enddo + + endif + +Contains + LOGICAL FUNCTION Failed() + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'GetUFulls') + Failed = ErrStat >= AbortErrLev + END FUNCTION Failed + +END SUBROUTINE GetUFulls + + !> Compute displacements of all nodes in global system (Guyan + Rotated CB) !! -SUBROUTINE LeverArm(u, p, x, m, DU_full, bGuyan, bElastic) +SUBROUTINE LeverArm(u, p, x, m, DU_full, bGuyan, bCB) TYPE(SD_InputType), INTENT(IN ) :: u !< Inputs at t TYPE(SD_ParameterType),target,INTENT(IN ) :: p !< Parameters TYPE(SD_ContinuousStateType), INTENT(IN ) :: x !< Continuous states at t TYPE(SD_MiscVarType), INTENT(INOUT) :: m !< Misc/optimization variables - LOGICAL, INTENT(IN ) :: bGuyan !< include Guyan Contribution - LOGICAL, INTENT(IN ) :: bElastic !< include Elastic contribution - REAL(ReKi), DIMENSION(:), INTENT( OUT) :: DU_full !< LeverArm in full system + LOGICAL, INTENT(IN ) :: bGuyan !< include Guyan contribution + LOGICAL, INTENT(IN ) :: bCB !< include Craig-Bampton contribution + REAL(R8Ki), DIMENSION(:), INTENT( OUT) :: DU_full !< LeverArm in full system !locals - INTEGER(IntKi) :: iSDNode + INTEGER(IntKi) :: iSDNode, iTP REAL(ReKi) :: rotations(3) INTEGER(IntKi), pointer :: DOFList(:) ! Variables for Guyan rigid body motion - real(ReKi), dimension(3) :: rIP ! Vector from TP to rotated Node - real(ReKi), dimension(3) :: rIP0 ! Vector from TP to Node (undeflected) - real(ReKi), dimension(3) :: duP ! Displacement of node due to rigid rotation - real(R8Ki), dimension(3,3) :: Rb2g ! Rotation matrix body 2 global coordinates - real(ReKi), dimension(3,3) :: DCM - INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) - CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None + real(ReKi), dimension(3) :: rIP ! Vector from TP to rotated Node + real(ReKi), dimension(3) :: rIP0 ! Vector from TP to Node (undeflected) + real(ReKi), dimension(3) :: duP ! Displacement of node due to rigid rotation + real(R8Ki), dimension(3,3) :: Rb2g ! Rotation matrix body 2 global coordinates + real(R8Ki), dimension(3,3) :: DCM ! Orientation matrix of small nodal elastic rotation + INTEGER(IntKi) :: ErrStat2 ! Error status of the operation (occurs after initial error) + CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat2 /= ErrID_None ! --- Convert inputs to FEM DOFs and convenient 6-vector storage ! --- CB modes contribution to motion (L-DOF only), NO STATIC IMPROVEMENT - if (bElastic .and. p%nDOFM > 0) then + if (bCB .and. p%nDOFM > 0) then m%UL = matmul( p%PhiM, x%qm ) else m%UL = 0.0_ReKi end if + ! --- Adding Guyan contribution to R and L DOFs if (bGuyan .and. .not.p%Floating) then ! Compute the small rotation angles given the input direction cosine matrix - rotations = GetSmllRotAngs(u%TPMesh%Orientation(:,:,1), ErrStat2, Errmsg2); - m%u_TP = (/REAL(u%TPMesh%TranslationDisp(:,1),ReKi), rotations/) m%UR_bar = matmul( p%TI , m%u_TP ) m%UL = m%UL + matmul( p%PhiRb_TI, m%u_TP ) else - ! Guyan modes are rigid body modes, we will add them in the "Full system" later - m%UR_bar = 0.0_ReKi + if (p%nTP>1) then + ! Add contributions from the elastic Guyan modes + m%UR_bar = matmul( p%TI , (/0.,0.,0.,0.,0.,0.,m%u_TP(7:(6*p%nTP))/) ) + m%UL = m%UL + matmul( p%PhiRb_TI, (/0.,0.,0.,0.,0.,0.,m%u_TP(7:(6*p%nTP))/) ) + else + ! Guyan modes are rigid body modes, we will add them in the "Full system" later + m%UR_bar = 0.0_ReKi + endif endif ! --- Build original DOF vectors (DOF before the CB reduction) call ReducedToFull(p, m, m%UR_bar, m%UL, DU_full) - ! --- Adding Guyan contribution for rigid body - if (bGuyan .and. p%Floating) then - ! For floating, we compute the Guyan motion directly (rigid body motion with TP as origin) - ! This introduce non-linear "rotations" effects, where the bottom node should "go up", and not just translate horizontally - Rb2g(1:3,1:3) = transpose(u%TPMesh%Orientation(:,:,1)) - do iSDNode = 1,p%nNodes - DOFList => p%NodesDOF(iSDNode)%List ! Alias to shorten notations - ! --- Guyan (rigid body) motion in global coordinates - rIP0(1:3) = p%DP0(1:3, iSDNode) - rIP(1:3) = matmul(Rb2g, rIP0) - duP(1:3) = rIP - rIP0 ! NOTE: without m%u_TP(1:3) - ! Full diplacements Guyan + rotated CB (if asked) >>> Rotate All - if (p%GuyanLoadCorrection) then - DU_full(DOFList(1:3)) = matmul(Rb2g, DU_full(DOFList(1:3))) + duP(1:3) - CALL SmllRotTrans('Nodal rotation',DU_full(DOFList(4)),DU_full(DOFList(5)),DU_full(DOFList(6)),DCM,'',ErrStat2,ErrMsg2); - DU_full(DOFList(4:6)) = EulerExtractZYX( matmul(DCM,transpose(Rb2g)) ) - else - DU_full(DOFList(1:3)) = DU_full(DOFList(1:3)) + duP(1:3) - DU_full(DOFList(4:6)) = DU_full(DOFList(4:6)) + rotations(1:3) - endif - enddo - endif + END SUBROUTINE LeverArm !------------------------------------------------------------------------------------------------------ !> Construct force vector on internal DOF (L) from the values on the input mesh !! First, the full vector of external forces/moments is built on the non-reduced DOF !! Then, the vector is reduced using the T_red matrix -SUBROUTINE GetExtForceOnInternalDOF(u, p, x, m, F_L, ErrStat, ErrMsg, GuyanLoadCorrection, RotateLoads) +SUBROUTINE GetExtForceOnInternalDOF(u, p, x, m, F_L, ErrStat, ErrMsg, ExtraMoment, RotateLoads) type(SD_InputType), intent(in ) :: u ! Inputs type(SD_ParameterType), intent(in ) :: p ! Parameters type(SD_ContinuousStateType), intent(in ) :: x !< Continuous states at t type(SD_MiscVarType), intent(inout) :: m ! Misc, for storage optimization of Fext and Fext_red - logical , intent(in ) :: GuyanLoadCorrection ! If true add extra moment + logical , intent(in ) :: ExtraMoment ! If true add extra moment logical , intent(in ) :: RotateLoads ! If true, loads are rotated to body coordinate real(ReKi) , intent(out) :: F_L(p%nDOF__L) !< External force on internal nodes "L" integer(IntKi), intent( out) :: ErrStat !< Error status of the operation @@ -3328,7 +3801,7 @@ SUBROUTINE GetExtForceOnInternalDOF(u, p, x, m, F_L, ErrStat, ErrMsg, GuyanLoadC real(ReKi), dimension(3) :: duP ! Displacement of node due to rigid rotation real(R8Ki), dimension(3,3) :: Rb2g ! Rotation matrix body 2 global real(R8Ki), dimension(3,3) :: Rg2b ! Rotation matrix global 2 body coordinates - real(ReKi), dimension(3,3) :: orientation ! Nodal orientation matrix + real(R8Ki), dimension(3,3) :: orientation ! Nodal orientation matrix INTEGER(IntKi) :: ErrStat2 ! Error status of the operation CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat /= ErrID_None @@ -3336,9 +3809,9 @@ SUBROUTINE GetExtForceOnInternalDOF(u, p, x, m, F_L, ErrStat, ErrMsg, GuyanLoadC ErrStat = ErrID_None ErrMsg = "" - if (GuyanLoadCorrection) then + if (ExtraMoment) then ! Compute node displacements "DU_full" for lever arm - call LeverArm(u, p, x, m, m%DU_full, bGuyan=.True., bElastic=.False.) + call LeverArm(u, p, x, m, m%DU_full, bGuyan=.True., bCB=.False.) endif ! TODO @@ -3352,8 +3825,12 @@ SUBROUTINE GetExtForceOnInternalDOF(u, p, x, m, F_L, ErrStat, ErrMsg, GuyanLoadC ! --- Build vector of external forces (including gravity) (Moment done below) m%Fext= 0.0_ReKi - if (RotateLoads) then ! Forces in body coordinates - Rg2b(1:3,1:3) = u%TPMesh%Orientation(:,:,1) ! global 2 body coordinates + if (RotateLoads) then ! Forces in rigid-body coordinates + if (p%TP1IsRBRefPt) then + Rg2b(1:3,1:3) = EulerConstructZYX(x%qR(4:6)) + else + Rg2b(1:3,1:3) = u%TPMesh(1)%Orientation(:,:,1) ! global 2 rigid-body coordinates + end if do iNode = 1,p%nNodes m%Fext( p%NodesDOF(iNode)%List(1:3) ) = matmul(Rg2b, u%LMesh%Force(:,iNode) + p%FG(p%NodesDOF(iNode)%List(1:3)) ) + p%FC(p%NodesDOF(iNode)%List(1:3)) enddo @@ -3374,11 +3851,11 @@ SUBROUTINE GetExtForceOnInternalDOF(u, p, x, m, F_L, ErrStat, ErrMsg, GuyanLoadC do iCC = 1, size(p%CtrlElem2Channel,1) ! Loop on controllable cables iElem = p%CtrlElem2Channel(iCC,1) iChannel = p%CtrlElem2Channel(iCC,2) - IDOF = p%ElemsDOF(1:12, iElem) + IDOF = p%ElemsDOF(1:12, iElem) ! DeltaL = DeltaL0 + DeltaL_control = - Le T0/(EA+T0) + DeltaL_control - DeltaL = - p%ElemProps(iElem)%Length * p%ElemProps(iElem)%T0 / (p%ElemProps(iElem)%YoungE*p%ElemProps(iElem)%Area + p%ElemProps(iElem)%T0) - DeltaL = DeltaL + u%CableDeltaL(iChannel) - ! T(t) = - EA * DeltaL(t) /(Le + Delta L(t)) ! NOTE DeltaL<0 + DeltaL = - p%ElemProps(iElem)%Length * p%ElemProps(iElem)%T0 / (p%ElemProps(iElem)%YoungE*p%ElemProps(iElem)%Area + p%ElemProps(iElem)%T0) + DeltaL = DeltaL + u%CableDeltaL(iChannel) + ! T(t) = - EA * DeltaL(t) /(Le + Delta L(t)) ! NOTE DeltaL<0 CableTension = -p%ElemProps(iElem)%YoungE*p%ElemProps(iElem)%Area * DeltaL / (p%ElemProps(iElem)%Length + DeltaL) if (RotateLoads) then ! in body coordinate ! We only rotate the loads, moments are rotated below @@ -3387,7 +3864,7 @@ SUBROUTINE GetExtForceOnInternalDOF(u, p, x, m, F_L, ErrStat, ErrMsg, GuyanLoadC m%Fext(IDOF(4:6)) = m%Fext(IDOF(4:6)) + m%FC_unit( IDOF(4:6) ) * (CableTension - p%ElemProps(iElem)%T0) m%Fext(IDOF(10:12)) = m%Fext(IDOF(10:12)) + m%FC_unit( IDOF(10:12) ) * (CableTension - p%ElemProps(iElem)%T0) else ! in global - m%Fext(IDOF) = m%Fext(IDOF) + m%FC_unit( IDOF ) * (CableTension - p%ElemProps(iElem)%T0) + m%Fext(IDOF) = m%Fext(IDOF) + m%FC_unit( IDOF ) * (CableTension - p%ElemProps(iElem)%T0) endif enddo endif @@ -3419,7 +3896,7 @@ SUBROUTINE GetExtForceOnInternalDOF(u, p, x, m, F_L, ErrStat, ErrMsg, GuyanLoadC end do end if - if (GuyanLoadCorrection) then ! if and only if fixed-bottom + if (ExtraMoment) then ! if and only if fixed-bottom ! Additional GuyanLoadCorrection coming from the weight of concentrated masses with CoG offset do i = 1,size(p%CMassNode) ! Loop through all concentrated masses iNode = p%CMassNode(i) @@ -3442,7 +3919,7 @@ SUBROUTINE GetExtForceOnInternalDOF(u, p, x, m, F_L, ErrStat, ErrMsg, GuyanLoadC endif ! Extra moment dm = Delta u x (fe + fg) - if (GuyanLoadCorrection) then ! if and only if fixed-bottom + if (ExtraMoment) then ! if and only if fixed-bottom du = m%DU_full(p%NodesDOF(iNode)%List(1:3)) ! Lever arm Moment(1) = Moment(1) + du(2) * Force(3) - du(3) * Force(2) Moment(2) = Moment(2) + du(3) * Force(1) - du(1) * Force(3) @@ -3572,7 +4049,7 @@ SUBROUTINE OutModes(Init, p, m, InitInput, CBparams, Modes, Omega, Omega_Gy, Err U_Gy_red = 0.0_ReKi ! nDOF_red x nGY do i = 1, size(CBparams%PhiR,2) U_Gy_red(p%ID__Rb(i),i) = 1.0_ReKi - U_Gy_red(p%ID__L, i) = CBparams%PhiR(:,i) + U_Gy_red(p%ID__L, i) = CBparams%PhiR(:,i) enddo if(p%reduced) then U_Gy = matmul(p%T_red, U_Gy_red) ! nDOF x nGY @@ -3580,9 +4057,10 @@ SUBROUTINE OutModes(Init, p, m, InitInput, CBparams, Modes, Omega, Omega_Gy, Err U_Gy = U_Gy_red ! nDOF x nGY endif ! TI - U_Intf = matmul(U_Gy, p%TI) ! nDOF x 6 (since TI is nGY x 6) - do i = 1, 6 - call WriteOneMode(U_Intf(:,i), Omega_GY(i), 'GY', i, 6, reduced=.false.) + U_Intf = matmul(U_Gy, p%TI) ! nDOF x nDOFL_TP (since TI is nGY x nDOFL_TP) + if (p%TP1IsRBRefPt) U_Intf = matmul(U_Intf, p%GMat) + do i = 1, p%nDOFL_TP + call WriteOneMode(U_Intf(:,i), Omega_GY(i), 'GY', i, p%nDOFL_TP, reduced=.false.) enddo ! --- CB Modes @@ -3730,7 +4208,13 @@ SUBROUTINE WriteJSONCommon(FileName, Init, p, m, InitInput, FileKind, UnSum, Err ! --- Elem props write(UnSum, '(A)') '"ElemProps": [' do i = 1, size(p%ElemProps) - write(UnSum, '(A,I0,A,F8.4,A)', advance='no') ' {"shape": "cylinder", "type": ',p%ElemProps(i)%eType, ', "Diam":',p%ElemProps(i)%D(1),'}' + if (p%ElemProps(i)%eType == idMemberBeamRect) then + ! Rectangular beam: MType = 1r. eType = -1 + write(UnSum, '(A,I0,A,F8.4,A,F8.4,A, F10.6,A,F10.6,A,F10.6,A)', advance='no') ' {"shape": "rectangle", "type": ',p%ElemProps(i)%eType, ', "SideA":',p%ElemProps(i)%Sa(1), ', "SideB":',p%ElemProps(i)%Sb(1), ', "SideA_dir":[',p%ElemProps(i)%DirCos(1,1), ',',p%ElemProps(i)%DirCos(2,1), ',',p%ElemProps(i)%DirCos(3,1),']}' + else + ! Cylindrical shapes (MType = 1 or 1c [cylindrical beam], 2 [cable element], 3 [rigid link]. eType = 1, 2, 3) + write(UnSum, '(A,I0,A,F8.4,A)', advance='no') ' {"shape": "cylinder", "type": ',p%ElemProps(i)%eType, ', "Diam":',p%ElemProps(i)%D(1),'}' + endif if (i0) then CC(1:nY,1:nCB ) = - p%C1_11 CC(1:nY,nCB+1:nX) = - p%C1_12 - if (p%GuyanLoadCorrection .and. p%Floating .and. present(u)) then - CC(1:3,:) = matmul(transpose(u%TPMesh%Orientation(:,:,1)), CC(1:3,:)) ! >>> Rotate All - CC(4:6,:) = matmul(transpose(u%TPMesh%Orientation(:,:,1)), CC(4:6,:)) ! >>> Rotate All - endif + ! if (p%Floating .and. present(u)) then + ! CC(1:3,:) = matmul(transpose(u%TPMesh%Orientation(:,:,1)), CC(1:3,:)) ! >>> Rotate All + ! CC(4:6,:) = matmul(transpose(u%TPMesh%Orientation(:,:,1)), CC(4:6,:)) ! >>> Rotate All + ! endif endif endif @@ -4286,7 +4772,7 @@ SUBROUTINE StateMatrices(p, ErrStat, ErrMsg, AA, BB, CC, DD, u) DD(1:nY,7:12 ) = - p%CBB DD(1:nY,13:18 ) = - p%MBB if (p%nDOFM>0) then - if (p%GuyanLoadCorrection .and. p%Floating .and. present(u)) then + if (p%Floating .and. present(u)) then ! TODO TODO rotate it A MBmmB A^t !DD(1:3,:) = DD(1:3,:) + matmul(transpose(u%TPMesh%Orientation(:,:,1)), p%MBmmB(1:3,:) ! >>> Rotate All DD(1:nY,13:18 ) = DD(1:nY,13:18 )+ p%MBmmB @@ -4360,7 +4846,8 @@ FUNCTION BeamMassC(rho1,D1,t1,rho2,D2,t2,L,method) b0=rho1 b1=(rho2-rho1)/L !Here we will need to figure out what element it is for now circular pipes - IF (method<=0) THEN + select case (method) + case (:0) ! Mid values for r, t, and potentially rho r1 = 0.25_ReKi*(D1 + D2) t = 0.50_ReKi*(t1 + t2) @@ -4375,22 +4862,25 @@ FUNCTION BeamMassC(rho1,D1,t1,rho2,D2,t2,L,method) else BeamMassC = rho1 * L * Area ! WHAT is currently used by FEM endif - ELSEIF (method==1) THEN !circular tube + + case (1) ! circular tube a0=pi * (D1*t1-t1**2.) dt=t2-t1 !thickness variation dd=D2-D1 !OD variation a1=pi * ( dd*t1 + D1*dt -2.*t1*dt)/L a2=pi * ( dd*dt-dt**2.)/L**2. BeamMassC = b0*a0*L +(a0*b1+b0*a1)*L**2/2. + (b0*a2+b1*a1)*L**3/3 + a2*b1*L**4/4.!Integral of rho*A dz - ELSEIF (method==2) THEN !linearly varying area + + case (2) ! linearly varying area a0=D1 !This is an area a1=(D2-D1)/L !Delta area a2=0. BeamMassC = b0*a0*L +(a0*b1+b0*a1)*L**2/2. + (b0*a2+b1*a1)*L**3/3 + a2*b1*L**4/4.!Integral of rho*A dz - ELSE - print*,'Wrong call to BeamMassC, method unknown',method + + case default + print*,'Wrong call to BeamMass, method unknown',method STOP - ENDIF + end select END FUNCTION BeamMassC diff --git a/modules/subdyn/src/SubDyn_Driver.f90 b/modules/subdyn/src/SubDyn_Driver.f90 index 85337d738f..5e0d127832 100644 --- a/modules/subdyn/src/SubDyn_Driver.f90 +++ b/modules/subdyn/src/SubDyn_Driver.f90 @@ -30,13 +30,14 @@ PROGRAM SubDyn_Driver IMPLICIT NONE - INTEGER(IntKi), PARAMETER :: NumInp = 1 ! Number of inputs sent to SD_UpdateStates + INTEGER(IntKi), PARAMETER :: NumInp = 2 ! Number of inputs sent to SD_UpdateStates type ALoadType integer(IntKi) :: NodeID ! Joint and then Node ID where force is applied real(ReKi) :: SteadyLoad(6) ! Steady Load (Fx, Fy, Fz, Mx, My, Mz) real(ReKi),allocatable :: UnsteadyLoad(:,:) ! Unsteady Load nx7 : (Time, Fx, Fy, Fz, Mx, My, Mz) - integer(IntKi) :: iTS ! Optimization index to find closest time stamp in user defined time series of unsteady load + integer(IntKi) :: iTS1 ! Optimization index to find closest time stamp in user defined time series of unsteady load + integer(IntKi) :: iTS2 ! Optimization index to find closest time stamp in user defined time series of unsteady load end type ALoadType TYPE SD_dvr_InitInput @@ -47,13 +48,15 @@ PROGRAM SubDyn_Driver CHARACTER(1024) :: OutRootName INTEGER :: NSteps REAL(DbKi) :: TimeInterval - REAL(ReKi) :: TP_RefPoint(3) + INTEGER :: nTP + REAL(ReKi),allocatable :: TP_RefPoint(:,:) + REAL(ReKi),allocatable :: SDin(:,:) ! Variable for storing time, forces, and body velocities, in m/s or rad/s for SubDyn inputs REAL(ReKi) :: SubRotateZ INTEGER :: InputsMod CHARACTER(1024) :: InputsFile - REAL(ReKi) :: uTPInSteady(6) - REAL(ReKi) :: uDotTPInSteady(6) - REAL(ReKi) :: uDotDotTPInSteady(6) + REAL(ReKi),allocatable :: uTPInSteady(:) + REAL(ReKi),allocatable :: uDotTPInSteady(:) + REAL(ReKi),allocatable :: uDotDotTPInSteady(:) type(ALoadType), allocatable :: AppliedLoads(:) ! 7 x nSteadyForces: JointID, Fx, Fy, Fz, Mx, My, Mz END TYPE SD_dvr_InitInput @@ -84,15 +87,16 @@ PROGRAM SubDyn_Driver CHARACTER(1024) :: ErrMsg, ErrMsg1, ErrMsg2, ErrMsg3 ! Error message if ErrStat /= ErrID_None - CHARACTER(1024) :: dvrFilename ! Filename and path for the driver input file. This is passed in as a command line argument when running the Driver exe. + CHARACTER(1024) :: dvrFilename ! Filename and path for the driver input file. This is passed in as a command line argument when running the Driver exe. TYPE(SD_dvr_InitInput), target :: drvrInitInp ! Initialization data for the driver program INTEGER :: UnIn ! Unit number for the input file - INTEGER :: UnEcho ! The local unit number for this module's echo file + INTEGER :: UnEcho ! The local unit number for this module's echo file INTEGER(IntKi) :: UnSD_Out ! Output file identifier - REAL(ReKi), ALLOCATABLE :: SDin(:,:) ! Variable for storing time, forces, and body velocities, in m/s or rad/s for SubDyn inputs - INTEGER(IntKi) :: I,J ! Generic loop counter + REAL(ReKi), ALLOCATABLE :: SDinStep(:) ! One step of user defined motion interpolated from SDin + INTEGER(IntKi) :: I,J,iTP,idx ! Generic loop counter and array entry index INTEGER(IntKi) :: iLoad ! Index on loads INTEGER(IntKi) :: iNode ! Index on nodes + INTEGER(IntKi) :: iLast1, iLast2 ! Last step counter to speed up motion input interpolation INTEGER(IntKi) :: JointID ! JointID REAL(ReKi) :: dcm (3,3) ! The resulting transformation matrix from X to x, (-). CHARACTER(10) :: AngleMsg ! For debugging, a string version of the largest rotation input @@ -107,6 +111,7 @@ PROGRAM SubDyn_Driver INTEGER :: StrtTime (8) ! Start time of simulation CHARACTER(200) :: git_commit ! String containing the current git commit hash TYPE(ProgDesc), PARAMETER :: version = ProgDesc( 'SubDyn Driver', '', '' ) ! The version number of this program. + !............................................................................................................................... ! Routines called in initialization !............................................................................................................................... @@ -142,11 +147,11 @@ PROGRAM SubDyn_Driver ! Parse the driver input file and run the simulation based on that file IF ( command_argument_count() == 1 ) THEN CALL get_command_argument(1, dvrFilename) - - CALL ReadDriverInputFile( dvrFilename, drvrInitInp); + CALL ReadDriverInputFile( dvrFilename, drvrInitInp) InitInData%g = drvrInitInp%Gravity InitInData%SDInputFile = drvrInitInp%SDInputFile InitInData%RootName = drvrInitInp%OutRootName + InitInData%nTP = drvrInitInp%nTP InitInData%TP_RefPoint = drvrInitInp%TP_RefPoint InitInData%SubRotateZ = drvrInitInp%SubRotateZ TimeInterval = drvrInitInp%TimeInterval @@ -157,6 +162,7 @@ PROGRAM SubDyn_Driver ! Initialize SubDyn module CALL SD_Init( InitInData, u(1), p, x, xd, z, OtherState, y, m, TimeInterval, InitOutData, ErrStat2, ErrMsg2 ); call AbortIfFailed() + call SD_CopyInput(u(1), u(2), MESH_NEWCOPY, ErrStat2, ErrMsg2 ); call AbortIfFailed() ! Sanity check for outputs if (p%NumOuts==0) then @@ -170,29 +176,30 @@ PROGRAM SubDyn_Driver CALL SDOUT_OpenOutput( SD_ProgDesc, drvrInitInp%OutRootName, p, InitOutData, ErrStat2, ErrMsg2 ); endif - ! Read Input time series data from a file - CALL AllocAry(SDin, drvrInitInp%NSteps, 19, 'SDinput array', ErrStat2, ErrMsg2); call AbortIfFailed() - SDin(:,:)=0.0_ReKi - IF ( drvrInitInp%InputsMod == 2 ) THEN - ! Open the inputs data file - CALL GetNewUnit( UnIn ) - CALL OpenFInpFile ( UnIn, drvrInitInp%InputsFile, ErrStat2, ErrMsg2); Call AbortIfFailed() - DO n = 1,drvrInitInp%NSteps - ! TODO Add safety for backward compatibility if only 13 columns - READ (UnIn,*,IOSTAT=ErrStat2) (SDin (n,J), J=1,19) - ErrMsg2 = ' Error reading line '//trim(Num2LStr(n))//' of file: '//trim(drvrInitInp%InputsFile) - call AbortIfFailed() - END DO - CLOSE ( UnIn ) + if ( drvrInitInp%InputsMod /= 2 ) then + ! Assign constant transition piece motion here - no further update during time loop + do iTP = 1,InitInData%nTP + idx = (iTP-1)* 6 + 1 + ! Input displacements, velocities and potentially accelerations + u(1)%TPMesh(iTP)%TranslationDisp(:,1) = drvrInitInp%uTPInSteady(idx:idx+2) + u(1)%TPMesh(iTP)%Orientation(:,:,1) = EulerConstructZYX(REAL(drvrInitInp%uTPInSteady(idx+3:idx+5),ReKi)) + u(1)%TPMesh(iTP)%TranslationVel(:,1) = drvrInitInp%uDotTPInSteady(idx:idx+2) + u(1)%TPMesh(iTP)%RotationVel(:,1) = drvrInitInp%uDotTPInSteady(idx+3:idx+5) + u(1)%TPMesh(iTP)%TranslationAcc(:,1) = drvrInitInp%uDotDotTPInSteady(idx:idx+2) + u(1)%TPMesh(iTP)%RotationAcc(:,1) = drvrInitInp%uDotDotTPInSteady(idx+3:idx+5) + u(2)%TPMesh(iTP)%TranslationDisp(:,1) = drvrInitInp%uTPInSteady(idx:idx+2) + u(2)%TPMesh(iTP)%Orientation(:,:,1) = EulerConstructZYX(REAL(drvrInitInp%uTPInSteady(idx+3:idx+5),ReKi)) + u(2)%TPMesh(iTP)%TranslationVel(:,1) = drvrInitInp%uDotTPInSteady(idx:idx+2) + u(2)%TPMesh(iTP)%RotationVel(:,1) = drvrInitInp%uDotTPInSteady(idx+3:idx+5) + u(2)%TPMesh(iTP)%TranslationAcc(:,1) = drvrInitInp%uDotDotTPInSteady(idx:idx+2) + u(2)%TPMesh(iTP)%RotationAcc(:,1) = drvrInitInp%uDotDotTPInSteady(idx+3:idx+5) + end do else - ! We fill an array with constant values - do n = 0,drvrInitInp%NSteps-1 ! Loop on time steps, starts at 0 - SDin(n+1,1) = n*TimeInterval - SDin(n+1,2:7 ) = drvrInitInp%uTPInSteady(1:6) ! Displacements - SDin(n+1,8:13) = drvrInitInp%uDotTPInSteady(1:6) ! Velocities - !SDin(n+1,14:19) = drvrInitInp%uDotDotTPInSteady(1:6) ! Accelerations - enddo + ! Allocate array for time varying transition piece motion to be populated during time loop + CALL AllocAry(SDinStep, 18*InitInData%nTP, 'SDinput array', ErrStat2, ErrMsg2); call AbortIfFailed() + iLast1 = 1 + iLast2 = 1 end if ! Setup Applied Loads @@ -205,10 +212,10 @@ PROGRAM SubDyn_Driver ErrMsg2 = 'Applied load JointID '//trim(num2lstr(JointID))//' is not found in SubDyn joint list.' call AbortIfFailed() endif - AL%iTS=1 ! important init + AL%iTS1=1 ! important init + AL%iTS2=1 ! important init enddo - ! Destroy initialization data CALL SD_DestroyInitInput( InitInData, ErrStat2, ErrMsg2 ); call AbortIfFailed() CALL SD_DestroyInitOutput( InitOutData, ErrStat2, ErrMsg2 ); call AbortIfFailed() @@ -225,28 +232,39 @@ PROGRAM SubDyn_Driver !u(1)%CableDeltaL= 0.0e7_ReKi call WrScr('') + DO n = 0,drvrInitInp%NSteps-1 ! Loop on time steps, starts at 0 Time = n*TimeInterval - InputTime(1) = Time + InputTime(1) = Time + TimeInterval + InputTime(2) = Time ! Set module inputs u (likely from the outputs of another module or a set of test conditions) here: - IF ( u(1)%TPMesh%Initialized ) THEN - ! Input displacements, velocities and potentially accelerations - u(1)%TPMesh%TranslationDisp(:,1) = SDin(n+1,2:4) - CALL SmllRotTrans( 'InputRotation', REAL(SDin(n+1,5),reki), REAL(SDin(n+1,6),reki), REAL(SDin(n+1,7),reki), dcm, 'Junk', ErrStat, ErrMsg ) - u(1)%TPMesh%Orientation(:,:,1) = dcm - u(1)%TPMesh%TranslationVel(:,1) = SDin(n+1,8:10) - u(1)%TPMesh%RotationVel(:,1) = SDin(n+1,11:13) - - IF ( drvrInitInp%InputsMod == 2 ) THEN - u(1)%TPMesh%TranslationAcc(:,1) = SDin(n+1,14:16) - u(1)%TPMesh%RotationAcc(:,1) = SDin(n+1,17:19) - ELSE ! constant inputs - u(1)%TPMesh%TranslationAcc(:,1) = drvrInitInp%uDotDotTPInSteady(1:3) - u(1)%TPMesh%RotationAcc(:,1) = drvrInitInp%uDotDotTPInSteady(4:6) - END IF - END IF + if ( drvrInitInp%InputsMod == 2 ) then + call interpTimeValue(drvrInitInp%SDin,InputTime(1), iLast1 ,SDInStep) + do iTP = 1,InitInData%nTP + idx = (iTP-1)*18 + 1 + ! Input displacements, velocities and potentially accelerations + u(1)%TPMesh(iTP)%TranslationDisp(:,1) = SDinStep(idx:idx+2) + u(1)%TPMesh(iTP)%Orientation(:,:,1) = EulerConstructZYX(REAL(SDinStep(idx+3:idx+5),ReKi)) + u(1)%TPMesh(iTP)%TranslationVel(:,1) = SDinStep(idx+6 :idx+8) + u(1)%TPMesh(iTP)%RotationVel(:,1) = SDinStep(idx+9 :idx+11) + u(1)%TPMesh(iTP)%TranslationAcc(:,1) = SDinStep(idx+12:idx+14) + u(1)%TPMesh(iTP)%RotationAcc(:,1) = SDinStep(idx+15:idx+17) + end do + call interpTimeValue(drvrInitInp%SDin,InputTime(2), iLast2 ,SDInStep) + do iTP = 1,InitInData%nTP + idx = (iTP-1)*18 + 1 + ! Input displacements, velocities and potentially accelerations + u(2)%TPMesh(iTP)%TranslationDisp(:,1) = SDinStep(idx:idx+2) + u(2)%TPMesh(iTP)%Orientation(:,:,1) = EulerConstructZYX(REAL(SDinStep(idx+3:idx+5),ReKi)) + u(2)%TPMesh(iTP)%TranslationVel(:,1) = SDinStep(idx+6 :idx+8) + u(2)%TPMesh(iTP)%RotationVel(:,1) = SDinStep(idx+9 :idx+11) + u(2)%TPMesh(iTP)%TranslationAcc(:,1) = SDinStep(idx+12:idx+14) + u(2)%TPMesh(iTP)%RotationAcc(:,1) = SDinStep(idx+15:idx+17) + end do + end if + ! Set LMesh applied loads if ( u(1)%LMesh%Initialized ) then ! Default, set all external load to 0.0 @@ -259,16 +277,30 @@ PROGRAM SubDyn_Driver u(1)%LMesh%Force(:,iNode) = u(1)%LMesh%Force(:,iNode) + AL%SteadyLoad(1:3) u(1)%LMesh%Moment(:,iNode) = u(1)%LMesh%Moment(:,iNode) + AL%SteadyLoad(4:6) if (allocated(AL%UnsteadyLoad)) then - call interpTimeValue(AL%UnsteadyLoad, Time, AL%iTS, UnsteadyLoad) + call interpTimeValue(AL%UnsteadyLoad, Time+TimeInterval, AL%iTS1, UnsteadyLoad) u(1)%LMesh%Force(:,iNode) = u(1)%LMesh%Force(:,iNode) + UnsteadyLoad(1:3) u(1)%LMesh%Moment(:,iNode) = u(1)%LMesh%Moment(:,iNode) + UnsteadyLoad(4:6) endif enddo + ! Default, set all external load to 0.0 + u(2)%LMesh%Force (:,:) = 0.0 + u(2)%LMesh%Moment (:,:) = 0.0 + ! Add applied loads + do iLoad=1, size(drvrInitInp%AppliedLoads) + AL => drvrInitInp%AppliedLoads(iLoad) + iNode = AL%NodeID + u(2)%LMesh%Force(:,iNode) = u(2)%LMesh%Force(:,iNode) + AL%SteadyLoad(1:3) + u(2)%LMesh%Moment(:,iNode) = u(2)%LMesh%Moment(:,iNode) + AL%SteadyLoad(4:6) + if (allocated(AL%UnsteadyLoad)) then + call interpTimeValue(AL%UnsteadyLoad, Time, AL%iTS2, UnsteadyLoad) + u(2)%LMesh%Force(:,iNode) = u(2)%LMesh%Force(:,iNode) + UnsteadyLoad(1:3) + u(2)%LMesh%Moment(:,iNode) = u(2)%LMesh%Moment(:,iNode) + UnsteadyLoad(4:6) + endif + enddo endif - ! Calculate outputs at n - CALL SD_CalcOutput( Time, u(1), p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2); call AbortIfFailed() + CALL SD_CalcOutput( Time, u(2), p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2); call AbortIfFailed() ! Get state variables at next step: INPUT at step n, OUTPUT at step n + 1 CALL SD_UpdateStates( Time, n, u, InputTime, p, x, xd, z, OtherState, m, ErrStat2, ErrMsg2); call AbortIfFailed() ! Display simulation status every SttsTime-seconds: @@ -280,6 +312,7 @@ PROGRAM SubDyn_Driver ! Routine to terminate program execution CALL SD_End( u(1), p, x, xd, z, OtherState, y, m, ErrStat2, ErrMsg2) + CALL SD_DestroyInput( u(2), ErrStat, ErrMsg ) IF ( ErrStat /= ErrID_None ) THEN CALL WrScr( ErrMsg ) END IF @@ -287,6 +320,8 @@ PROGRAM SubDyn_Driver ! Write simulation times and stop CALL RunTimes( StrtTime, UsrTime1, StrtTime, UsrTime1, Time ) + CALL CleanUp() + CONTAINS SUBROUTINE AbortIfFailed() call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SubDyn_Driver') @@ -311,26 +346,33 @@ SUBROUTINE CleanUp() endif if(UnEcho>0) CLOSE(UnEcho) if(UnEcho>0) CLOSE( UnIn) - if(allocated(SDin)) deallocate(SDin) + if(allocated(SDinStep)) deallocate(SDinStep) + if(allocated(drvrInitInp%SDin)) deallocate(drvrInitInp%SDin) + if(allocated(drvrInitInp%AppliedLoads)) deallocate(drvrInitInp%AppliedLoads) + if(allocated(drvrInitInp%TP_RefPoint)) deallocate(drvrInitInp%TP_RefPoint) + if(allocated(drvrInitInp%uTPInSteady)) deallocate(drvrInitInp%uTPInSteady) + if(allocated(drvrInitInp%uDotTPInSteady)) deallocate(drvrInitInp%uDotTPInSteady) + if(allocated(drvrInitInp%uDotDotTPInSteady)) deallocate(drvrInitInp%uDotDotTPInSteady) END SUBROUTINE CleanUp !------------------------------------------------------------------------------------------------------------------------------- - SUBROUTINE ReadDriverInputFile( inputFile, InitInp) + SUBROUTINE ReadDriverInputFile( inputFile, InitInp ) CHARACTER(*), INTENT( IN ) :: inputFile TYPE(SD_dvr_InitInput), INTENT( OUT ) :: InitInp + ! Local variables INTEGER :: I ! generic integer for counting INTEGER :: J ! generic integer for counting INTEGER :: iDummy ! dummy integer CHARACTER( 2) :: strI ! string version of the loop counter - CHARACTER(1024) :: EchoFile ! Name of SubDyn echo file - CHARACTER(1024) :: Line ! String to temporarially hold value of read line + CHARACTER(1024) :: EchoFile ! Name of SubDyn echo file + CHARACTER(1024) :: Line ! String to temporarially hold value of read line CHARACTER(1024) :: TmpPath ! Temporary storage for relative path name CHARACTER(1024) :: TmpFmt ! Temporary storage for format statement - CHARACTER(1024) :: FileName ! Name of SubDyn input file - CHARACTER(1024) :: PriPath ! Path Name of SubDyn input file - + CHARACTER(1024) :: FileName ! Name of SubDyn input file + CHARACTER(1024) :: PriPath ! Path Name of SubDyn input file + UnEcho=-1 UnIn =-1 @@ -343,11 +385,11 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp) call AbortIfFailed() CALL WrScr( 'Opening SubDyn Driver input file: '//FileName ) - ! Read until "echo" CALL ReadCom( UnIn, FileName, 'SubDyn Driver input file header line 1', ErrStat2, ErrMsg2); call AbortIfFailed() CALL ReadCom( UnIn, FileName, 'SubDyn Driver input file header line 2', ErrStat2, ErrMsg2); call AbortIfFailed() CALL ReadVar ( UnIn, FileName, InitInp%Echo, 'Echo', 'Echo Input', ErrStat2, ErrMsg2); call AbortIfFailed() + ! If we echo, we rewind IF ( InitInp%Echo ) THEN EchoFile = TRIM(FileName)//'.echo' @@ -358,6 +400,7 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp) CALL ReadCom( UnIn, FileName, 'SubDyn Driver input file header line 2', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() CALL ReadVar ( UnIn, FileName, InitInp%Echo, 'Echo', 'Echo the input file data', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() END IF + !---------------------- ENVIRONMENTAL CONDITIONS ------------------------------------------------- CALL ReadCom( UnIn, FileName, 'Environmental conditions header', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() CALL ReadVar( UnIn, FileName, InitInp%Gravity, 'Gravity', 'Gravity', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() @@ -368,7 +411,11 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp) CALL ReadVar( UnIn, FileName, InitInp%OutRootName, 'OutRootName', 'SubDyn output root filename', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() CALL ReadVar( UnIn, FileName, InitInp%NSteps , 'NSteps', 'Number of time steps in the SubDyn simulation', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() CALL ReadVar( UnIn, FileName, InitInp%TimeInterval, 'TimeInterval', 'Time interval for any SubDyn inputs', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() - CALL ReadAry( UnIn, FileName, InitInp%TP_RefPoint, 3, 'TP reference point', 'TP reference point', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() + CALL ReadVar( UnIn, FileName, InitInp%nTP, 'nTP', 'Number of transition pieces', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() + allocate(InitInp%TP_RefPoint(3,InitInp%nTP), stat=ErrStat2); ErrMsg2='Allocating TP reference points'; call AbortIfFailed() + CALL ReadAry( UnIn, FileName, InitInp%TP_RefPoint(1,1:InitInp%nTP), InitInp%nTP, 'TP reference point x-coordinates', 'TP reference point x-coordinates', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() + CALL ReadAry( UnIn, FileName, InitInp%TP_RefPoint(2,1:InitInp%nTP), InitInp%nTP, 'TP reference point y-coordinates', 'TP reference point y-coordinates', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() + CALL ReadAry( UnIn, FileName, InitInp%TP_RefPoint(3,1:InitInp%nTP), InitInp%nTP, 'TP reference point z-coordinates', 'TP reference point z-coordinates', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() CALL ReadVar( UnIn, FileName, InitInp%SubRotateZ, 'SubRotateZ', 'Rotation angle in degrees about Z axis.', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() !---------------------- INPUTS ------------------------------------------------------------------- CALL ReadCom( UnIn, FileName, 'INPUTS header', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() @@ -376,10 +423,13 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp) CALL ReadVar( UnIn, FileName, InitInp%InputsFile, 'InputsFile', 'Filename for the SubDyn inputs', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() !---------------------- STEADY INPUTS (for InputsMod = 1) ---------------------------------------- CALL ReadCom( UnIn, FileName, 'STEADY STATE INPUTS header', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() + allocate(InitInp%uTPInSteady( 6*InitInp%nTP), stat=ErrStat2); call AbortIfFailed() + allocate(InitInp%uDotTPInSteady( 6*InitInp%nTP), stat=ErrStat2); call AbortIfFailed() + allocate(InitInp%uDotDotTPInSteady(6*InitInp%nTP), stat=ErrStat2); call AbortIfFailed() IF ( InitInp%InputsMod == 1 ) THEN - CALL ReadAry ( UnIn, FileName, InitInp%uTPInSteady , 6, 'uInSteady', 'Steady-state TP displacements and rotations.', ErrStat2, ErrMsg2, UnEcho) - CALL ReadAry ( UnIn, FileName, InitInp%uDotTPInSteady , 6, 'uDotTPInSteady', 'Steady-state TP translational and rotational velocities.', ErrStat2, ErrMsg2, UnEcho) - CALL ReadAry ( UnIn, FileName, InitInp%uDotDotTPInSteady, 6, 'uDotDotTPInSteady', 'Steady-state TP translational and rotational accelerations.', ErrStat2, ErrMsg2, UnEcho) + CALL ReadAry ( UnIn, FileName, InitInp%uTPInSteady , 6*InitInp%nTP, 'uInSteady', 'Steady-state TP displacements and rotations.', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() + CALL ReadAry ( UnIn, FileName, InitInp%uDotTPInSteady , 6*InitInp%nTP, 'uDotTPInSteady', 'Steady-state TP translational and rotational velocities.', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() + CALL ReadAry ( UnIn, FileName, InitInp%uDotDotTPInSteady, 6*InitInp%nTP, 'uDotDotTPInSteady', 'Steady-state TP translational and rotational accelerations.', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() ELSE InitInp%uTPInSteady = 0.0 InitInp%uDotTPInSteady = 0.0 @@ -388,11 +438,12 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp) CALL ReadCom( UnIn, FileName, '0.0 0.0 0.0 0.0 0.0 0.0 uDotTPInSteady ', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() CALL ReadCom( UnIn, FileName, '0.0 0.0 0.0 0.0 0.0 0.0 uDotTPInSteady ', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() END IF - CALL AbortIfFailed() + IF ( InitInp%InputsMod == 2 ) THEN + CALL ReadDelimFile(InitInp%InputsFile, 1+18*InitInp%nTP, InitInp%SDin, ErrStat2, ErrMsg2, 0, priPath); call AbortIfFailed() + END IF !---------------------- FORCES ---------------------------------------- CALL ReadCom( UnIn, FileName, '--- FORCES INPUTS header', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() - CALL ReadVar ( UnIn, FileName, iDummy, 'nApplied Forces', 'Number of applied forces', ErrStat2, ErrMsg2, UnEcho); - !call AbortIfFailed() + CALL ReadVar( UnIn, FileName, iDummy, 'nApplied Forces', 'Number of applied forces', ErrStat2, ErrMsg2, UnEcho); call AbortIfFailed() if (ErrStat2/=ErrID_None) then ! TODO Temporary call LegacyWarning('Applied loads input missing.') @@ -408,7 +459,6 @@ SUBROUTINE ReadDriverInputFile( inputFile, InitInp) enddo endif - if(UnEcho>0) CLOSE( UnEcho ) if(UnIn>0) CLOSE( UnIn ) ! --- Perform input checks and triggers diff --git a/modules/subdyn/src/SubDyn_Output.f90 b/modules/subdyn/src/SubDyn_Output.f90 index 920c84dad9..83ac6858a2 100644 --- a/modules/subdyn/src/SubDyn_Output.f90 +++ b/modules/subdyn/src/SubDyn_Output.f90 @@ -21,11 +21,14 @@ MODULE SubDyn_Output USE NWTC_Library 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, MaxOutPts + USE SubDyn_Output_Params, only: MNfmKe, MNfmMe, MNTDss, MNRDe, MNTRAe, IntfSS, IntfTRss, IntfTRAss, IntfTRe, ReactSS, RBTRDss, RBTRVss, RBTRAss + USE SubDyn_Output_Params, only: ParamIndxAry, ParamUnitsAry, ValidParamAry, SSqm01, SSqmd01, SSqmdd01, OutStrLenM1 IMPLICIT NONE + ! The maximum number of output channels which can be output by the code. + INTEGER(IntKi),PUBLIC, PARAMETER :: MaxOutPts = 21921 + PRIVATE ! ..... Public Subroutines ................................................................................................... PUBLIC :: SDOut_CloseSum @@ -37,11 +40,6 @@ MODULE SubDyn_Output PUBLIC :: SDOut_WriteOutputUnits PUBLIC :: SDOut_WriteOutputs PUBLIC :: SDOut_Init - PUBLIC :: SD_Init_Jacobian - PUBLIC :: SD_Perturb_u - PUBLIC :: SD_Perturb_x - PUBLIC :: SD_Compute_dY - PUBLIC :: SD_Compute_dX CONTAINS @@ -190,7 +188,7 @@ SUBROUTINE SDOut_Init( Init, y, p, misc, InitOut, WtrDpth, ErrStat, ErrMsg ) ! Compute p%TIreact, rigid transf. matrix from reaction DOFs to base structure point (0,0,-WD) CALL AllocAry(p%TIreact, 6, p%nDOFC__, 'TIReact ', ErrStat2, ErrMsg2); if(Failed()) return CALL AllocAry(T_TIreact, p%nDOFC__, 6, 'TIReact_T', ErrStat2, ErrMsg2); if(Failed()) return - call RigidTrnsf(Init, p, (/0.0_Reki, 0.0_ReKi, -WtrDpth /), p%IDC__, p%nDOFC__, T_TIreact, ErrStat2, ErrMsg2); if(Failed()) return + call RigidTrnsf(Init, p, (/0.0_Reki, 0.0_ReKi, -WtrDpth /), p%IDC__, p%nDOFC__, 1_IntKi, T_TIreact, ErrStat2, ErrMsg2); if(Failed()) return p%TIreact=transpose(T_TIreact) deallocate(T_TIreact) ENDIF @@ -284,6 +282,8 @@ SUBROUTINE SDOut_MapOutputs(u,p,x, y, m, AllOuts, ErrStat, ErrMsg ) integer(IntKi), pointer :: DOFList(:) !< List of DOF indices for a given Nodes (Alias to shorten notation) real(R8Ki), dimension(3,3) :: Rg2b ! Rotation matrix global 2 body (Guyan) coordinates real(R8Ki), dimension(6,6) :: RRg2b ! Rotation matrix global 2 body (Guyan) coordinates, acts on a 6-vector + real(R8Ki), dimension(6,6) :: RRb2g ! Rotation matrix global 2 body (Guyan) coordinates, acts on a 6-vector + integer(IntKi) :: iTP, nTP INTEGER(IntKi) :: ErrStat2 ! Error status of the operation CHARACTER(ErrMsgLen) :: ErrMsg2 ! Error message if ErrStat /= ErrID_None @@ -291,15 +291,20 @@ SUBROUTINE SDOut_MapOutputs(u,p,x, y, m, AllOuts, ErrStat, ErrMsg ) ErrMsg = "" if ( p%Floating ) then - ! For floating, m%U_full_dotdot is currently in the earth-fixed frame. - ! Need to transform back to the Guyan frame when computing MαNβFMxe, MαNβFMye, MαNβFMze, MαNβMMxe, MαNβMMye, MαNβMMze. - Rg2b = u%TPMesh%Orientation(:,:,1) ! global 2 body coordinates + if ( p%TP1IsRBRefPt ) then + Rg2b = EulerConstructZYX(x%qR(4:6)) + else + ! For floating, m%U_full_dotdot is currently in the earth-fixed frame. + ! Need to transform back to the Guyan frame when computing MαNβFMxe, MαNβFMye, MαNβFMze, MαNβMMxe, MαNβMMye, MαNβMMze. + Rg2b = u%TPMesh(1)%Orientation(:,:,1) ! global 2 body coordinates + endif else call Eye(Rg2b, ErrStat2, ErrMsg2) end if RRg2b = 0.0_R8Ki RRg2b(1:3,1:3) = Rg2b RRg2b(4:6,4:6) = Rg2b + RRb2g = transpose(RRg2b) AllOuts = 0.0_ReKi ! initialize for those outputs that aren't valid (and thus aren't set in this routine) @@ -367,15 +372,60 @@ SUBROUTINE SDOut_MapOutputs(u,p,x, y, m, AllOuts, ErrStat, ErrMsg ) ! -------------------------------------------------------------------------------- ! --- Interface kinematics and loads (TP/platform reference point) ! -------------------------------------------------------------------------------- + if (p%TP1IsRBRefPt) then + nTP = p%nTP-1 + else + nTP = p%nTP + end if + ! Total interface reaction forces and moments in SS coordinate system ! "IntfFXss, IntfFYss, IntfFZss, IntfMXss, IntfMYss, IntfMZss," - AllOuts(IntfSS(1:nDOFL_TP))= - (/y%Y1Mesh%Force (:,1), y%Y1Mesh%Moment(:,1)/) !-y%Y1 !Note this is the force that the TP applies to the Jacket, opposite to what the GLue Code needs thus "-" sign + do iTP = 1,nTP + AllOuts(IntfSS(1:6,iTP)) = - (/y%Y1Mesh(iTP)%Force(:,1), y%Y1Mesh(iTP)%Moment(:,1)/) !-y%Y1 !Note this is the force that the TP applies to the Jacket, opposite to what the GLue Code needs thus "-" sign + end do + ! Interface translations and rotations in SS coordinate system ! "IntfTDXss, IntfTDYss, IntfTDZss, IntfRDXss, IntfRDYss IntfRDZss" - AllOuts(IntfTRss(1:nDOFL_TP))=m%u_TP + do iTP = 1,nTP + AllOuts(IntfTRss(1:3,iTP)) = u%TPMesh(iTP)%TranslationDisp(:,1) + AllOuts(IntfTRss(4:6,iTP)) = EulerExtractZYX(u%TPMesh(iTP)%Orientation(:,:,1)) + end do + ! Interface Translational and rotational accelerations in SS coordinate system ! "IntfTAXss, IntfTAYss, IntfTAZss, IntfRAXss, IntfRAYss IntfRAZss" - AllOuts(IntfTRAss(1:nDOFL_TP))= m%udotdot_TP + do iTP = 1,nTP + AllOuts(IntfTRAss(1:3,iTP)) = u%TPMesh(iTP)%TranslationAcc(:,1) + AllOuts(IntfTRAss(4:6,iTP)) = u%TPMesh(iTP)%RotationAcc(:,1) + end do + + ! Interface elastic translational and rotational deflection in rigid-body coordinate system relative to rigid-body configuration + ! "IntfTDXe, IntfTDYe, IntfTDZe, IntfRDXe, IntfRDYe IntfRDZe" + if (p%floating) then + if (p%TP1IsRBRefPt) then + do iTP = 1,nTP + AllOuts(IntfTRe(1:6,iTP)) = m%u_TP( iTP*6+1:iTP*6+6 ) + end do + else + AllOuts(IntfTRe(1:6,1 )) = 0.0 + endif + else + do iTP = 1,nTP + AllOuts(IntfTRe(1:6,iTP)) = m%u_TP( (iTP-1)*6+1:(iTP-1)*6+6 ) + end do + end if + + ! -------------------------------------------------------------------------------- + ! --- Interface kinematics and loads (TP/platform reference point) + ! -------------------------------------------------------------------------------- + if (p%floating) then + AllOuts(RBTRDss) = m%u_TP(1:6) + AllOuts(RBTRVss) = matmul( RRb2g, m%udot_TP(1:6) ) + AllOuts(RBTRAss) = matmul( RRb2g, m%udotdot_TP(1:6) ) + else + AllOuts(RBTRDss) = 0.0 + AllOuts(RBTRVss) = 0.0 + AllOuts(RBTRAss) = 0.0 + end if ! -------------------------------------------------------------------------------- ! --- Modal parameters "SSqmXX, SSqmdotXX, SSqmddXX" amplitude, speed and acceleration @@ -554,59 +604,67 @@ SUBROUTINE SDOut_OpenOutput( ProgVer, OutRootName, p, InitOut, ErrStat, ErrMsg CHARACTER(1024) :: OutFileName ! The name of the output file including the full path. CHARACTER(200) :: Frmt ! a string to hold a format statement INTEGER :: ErrStat2 + ErrStat = ErrID_None ErrMsg = "" - ! Open the output file, if necessary, and write the header - IF ( ALLOCATED( p%OutParam ) .AND. p%NumOuts > 0 ) THEN ! Output has been requested so let's open an output file - ! Open the file for output - OutFileName = TRIM(OutRootName)//'.out' - CALL GetNewUnit( p%UnJckF ) + + ! Initialize to -1 to indicate that the output file unit is not valid + p%UnJckF = -1 + + ! No outputs requested, so just return + if ((.not. allocated(p%OutParam)) .or. (p%NumOuts == 0)) then + call WrScr('SubDyn: no outputs were requested, so separate output file will not be generated.') + return + end if - CALL OpenFOutFile ( p%UnJckF, OutFileName, ErrStat, ErrMsg ) - IF ( ErrStat >= AbortErrLev ) THEN - ErrMsg = ' Error opening SubDyn-level output file: '//TRIM(ErrMsg) - RETURN - END IF - - ! Write the output file header - WRITE (p%UnJckF,'(/,A/)', IOSTAT=ErrStat2) 'These predictions were generated by '//TRIM(GETNVD(ProgVer))//& - ' on '//CurDate()//' at '//CurTime()//'.' - - WRITE(p%UnJckF, '(//)') ! add 3 lines to make file format consistant with FAST v8 (headers on line 7; units on line 8) [this allows easier post-processing] - - ! Write the names of the output parameters: - Frmt = '(A8,'//TRIM(Int2LStr(p%NumOuts+p%OutAllInt*p%OutAllDims))//'(:,A,'//TRIM( p%OutSFmt )//'))' - WRITE(p%UnJckF,Frmt, IOSTAT=ErrStat2) TRIM( 'Time' ), ( p%Delim, TRIM( InitOut%WriteOutputHdr(I) ), I=1,p%NumOuts+p%OutAllInt*p%OutAllDims ) + ! Open the file for output + OutFileName = TRIM(OutRootName)//'.out' + call GetNewUnit( p%UnJckF ) + + call OpenFOutFile ( p%UnJckF, OutFileName, ErrStat, ErrMsg ) + if (ErrStat >= AbortErrLev) then + ErrMsg = ' Error opening SubDyn-level output file: '//TRIM(ErrMsg) + return + end if - ! Write the units of the output parameters: - WRITE(p%UnJckF,Frmt, IOSTAT=ErrStat2) TRIM( 's'), ( p%Delim, TRIM( InitOut%WriteOutputUnt(I) ), I=1,p%NumOuts+p%OutAllInt*p%OutAllDims ) - END IF ! there are any requested outputs + ! Write the output file header + write(p%UnJckF,'(/,A/)', IOSTAT=ErrStat2) 'These predictions were generated by '//TRIM(GETNVD(ProgVer))//& + ' on '//CurDate()//' at '//CurTime()//'.' + + write(p%UnJckF, '(//)') ! add 3 lines to make file format consistant with FAST v8 (headers on line 7; units on line 8) [this allows easier post-processing] + + ! Write the names of the output parameters: + Frmt = '(A8,'//TRIM(Int2LStr(p%NumOuts+p%OutAllInt*p%OutAllDims))//'(:,A,'//TRIM( p%OutSFmt )//'))' + write(p%UnJckF,Frmt, IOSTAT=ErrStat2) TRIM( 'Time' ), ( p%Delim, TRIM( InitOut%WriteOutputHdr(I) ), I=1,p%NumOuts+p%OutAllInt*p%OutAllDims ) + + ! Write the units of the output parameters: + write(p%UnJckF,Frmt, IOSTAT=ErrStat2) TRIM( 's'), ( p%Delim, TRIM( InitOut%WriteOutputUnt(I) ), I=1,p%NumOuts+p%OutAllInt*p%OutAllDims ) END SUBROUTINE SDOut_OpenOutput !==================================================================================================== !==================================================================================================== -SUBROUTINE SDOut_CloseOutput ( p, ErrStat, ErrMsg ) -! This function cleans up after running the SubDyn output module. It closes the output file, -! releases memory, and resets the number of outputs requested to 0. +! SDOut_CloseOutput closes the output file, if open, after running the SubDyn output module. !---------------------------------------------------------------------------------------------------- - TYPE(SD_ParameterType), INTENT( INOUT ) :: p ! data for this instance of the floating platform module - INTEGER, INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred - CHARACTER(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None - LOGICAL :: Err +SUBROUTINE SDOut_CloseOutput ( p, ErrStat, ErrMsg ) + type(SD_ParameterType), INTENT( INOUT ) :: p ! data for this instance of the floating platform module + integer(IntKi), INTENT( OUT ) :: ErrStat ! a non-zero value indicates an error occurred + character(*), INTENT( OUT ) :: ErrMsg ! Error message if ErrStat /= ErrID_None + integer(IntKi) :: Stat - ErrStat = 0 + ErrStat = ErrID_None ErrMsg = "" - Err = .FALSE. + + ! If file is not open, return + if (p%UnJckF == -1) return ! Close our output file - CLOSE( p%UnJckF, IOSTAT = ErrStat ) - IF ( ErrStat /= 0 ) Err = .TRUE. - - ! Make sure ErrStat is non-zero if an error occurred - IF ( Err ) ErrStat = ErrID_Fatal - RETURN + close(p%UnJckF, iostat=Stat) + if (Stat /= 0) then + ErrStat = ErrID_Fatal + ErrMsg = ' Problem closing SubDyn output file.' + end if END SUBROUTINE SDOut_CloseOutput !==================================================================================================== @@ -662,19 +720,14 @@ SUBROUTINE SDOut_WriteOutputs( UnJckF, Time, SDWrOutput, p, ErrStat, ErrMsg ) ! Local variables INTEGER :: I ! Generic loop counter CHARACTER(200) :: Frmt ! a string to hold a format statement + ErrStat = ErrID_None ErrMsg = "" - - ! Initialize ErrStat and determine if it makes any sense to write output - IF ( .NOT. ALLOCATED( p%OutParam ) .OR. UnJckF < 0 ) THEN - ErrStat = ErrID_Fatal - ErrMsg = ' To write outputs for SubDyn there must be a valid file ID and OutParam must be allocated.' - RETURN - ELSE - ErrStat = ErrID_None - END IF - ! Write the output parameters to the file + ! If output file is not open, return + if (p%UnJckF == -1) return + + ! Write the output parameters to the file Frmt = '(F10.4,'//TRIM(Int2LStr(p%NumOuts+p%OutAllInt*p%OutAllDims))//'(:,A,'//TRIM( p%OutFmt )//'))' WRITE(UnJckF,Frmt) Time, ( p%Delim, SDWrOutput(I), I=1,p%NumOuts+p%OutAllInt*p%OutAllDims ) @@ -734,6 +787,22 @@ SUBROUTINE SDOut_ChkOutLst( OutList, p, ErrStat, ErrMsg ) InvalidOutput(MNTRAe (:,J,I)) = .true. !translational accel local ref END DO END DO + + IF (p%TP1IsRBRefPt) THEN + DO I=p%nTP,9 + InvalidOutput(IntfSS(:,I)) = .true. + InvalidOutput(IntfTRe(:,I)) = .true. + InvalidOutput(IntfTRss(:,I)) = .true. + InvalidOutput(IntfTRAss(:,I)) = .true. + END DO + ELSE + DO I=p%nTP+1,9 + InvalidOutput(IntfSS(:,I)) = .true. + InvalidOutput(IntfTRe(:,I)) = .true. + InvalidOutput(IntfTRss(:,I)) = .true. + InvalidOutput(IntfTRAss(:,I)) = .true. + END DO + END IF !------------------------------------------------------------------------------------------------- ! ALLOCATE the OutParam array @@ -760,7 +829,14 @@ SUBROUTINE SDOut_ChkOutLst( OutList, p, ErrStat, ErrMsg ) p%OutParam(I)%Name = OutList(I) OutListTmp = OutList(I) - + CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case + + ! Interface output backward compatibility + k = INDEX( OutListTmp, 'INTF' ) + IF ( k>0 .and. INDEX( '0123456789', OutListTmp(k+4:k+4) ) <= 0 ) THEN + OutListTmp = OutListTmp(1:k+3)//'1'//OutListTmp(k+4:) + END IF + ! Reverse the sign (+/-) of the output channel if the user prefixed the ! channel name with a '-', '_', 'm', or 'M' character indicating "minus". @@ -780,10 +856,7 @@ SUBROUTINE SDOut_ChkOutLst( OutList, p, ErrStat, ErrMsg ) OutListTmp = OutListTmp(1:1)//'0'//OutListTmp(2:) CheckOutListAgain = .FALSE. end if - - CALL Conv2UC( OutListTmp ) ! Convert OutListTmp to upper case - - + Indx = IndexCharAry( OutListTmp(1:OutStrLenM1), ValidParamAry ) IF ( CheckOutListAgain .AND. Indx < 1 ) THEN ! Let's assume that "M" really meant "minus" and then test again @@ -829,245 +902,5 @@ SUBROUTINE SDOut_ChkOutLst( OutList, p, ErrStat, ErrMsg ) END SUBROUTINE SDOut_ChkOutLst !==================================================================================================== -!++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -!> This routine initializes the array that maps rows/columns of the Jacobian to specific mesh fields. -!! Do not change the order of this packing without changing subroutine ! -SUBROUTINE SD_Init_Jacobian(Init, p, u, y, InitOut, ErrStat, ErrMsg) - TYPE(SD_InitType) , INTENT(IN ) :: Init !< Init - TYPE(SD_ParameterType) , INTENT(INOUT) :: p !< parameters - TYPE(SD_InputType) , INTENT(IN ) :: u !< inputs - TYPE(SD_OutputType) , INTENT(IN ) :: y !< outputs - TYPE(SD_InitOutputType) , INTENT(INOUT) :: InitOut !< Initialization output data (for Jacobian row/column names) - INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation - CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None - INTEGER(IntKi) :: ErrStat2 - CHARACTER(ErrMsgLen) :: ErrMsg2 - CHARACTER(*), PARAMETER :: RoutineName = 'SD_Init_Jacobian' - real(ReKi) :: dx, dy, dz, maxDim - ! local variables: - ErrStat = ErrID_None - ErrMsg = "" - ! --- System dimension - dx = maxval(Init%Nodes(:,2))- minval(Init%Nodes(:,2)) - dy = maxval(Init%Nodes(:,3))- minval(Init%Nodes(:,3)) - dz = maxval(Init%Nodes(:,4))- minval(Init%Nodes(:,4)) - maxDim = max(dx, dy, dz) - - ! --- System dimension - call Init_Jacobian_y(); if (Failed()) return - call Init_Jacobian_x(); if (Failed()) return - call Init_Jacobian_u(); if (Failed()) return - -contains - LOGICAL FUNCTION Failed() - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SD_Init_Jacobian') - Failed = ErrStat >= AbortErrLev - END FUNCTION Failed - !> This routine initializes the Jacobian parameters and initialization outputs for the linearized outputs. - - SUBROUTINE Init_Jacobian_y() - INTEGER(IntKi) :: index_next, i - ! Number of outputs - p%Jac_ny = y%Y1Mesh%nNodes * 6 & ! 3 forces + 3 moments at each node - + y%Y2Mesh%nNodes * 18 & ! 6 displacements + 6 velocities + 6 accelerations at each node - + y%Y3Mesh%nNodes * 18 & ! 6 displacements + 6 velocities + 6 accelerations at each node - + p%NumOuts ! WriteOutput values - ! Storage info for each output (names, rotframe) - call AllocAry(InitOut%LinNames_y, p%Jac_ny, 'LinNames_y',ErrStat2,ErrMsg2); if(ErrStat2/=ErrID_None) return - call AllocAry(InitOut%RotFrame_y, p%Jac_ny, 'RotFrame_y',ErrStat2,ErrMsg2); if(ErrStat2/=ErrID_None) return - ! Names - index_next = 1 - call PackLoadMesh_Names( y%Y1Mesh, 'Interface displacement', InitOut%LinNames_y, index_next) - call PackMotionMesh_Names(y%Y2Mesh, 'Nodes motion mixed' , InitOut%LinNames_y, index_next) - call PackMotionMesh_Names(y%Y3Mesh, 'Nodes motion full' , InitOut%LinNames_y, index_next) - do i=1,p%NumOuts - InitOut%LinNames_y(i+index_next-1) = trim(InitOut%WriteOutputHdr(i))//', '//trim(InitOut%WriteOutputUnt(i)) - end do - ! RotFrame - InitOut%RotFrame_y(:) = .false. - END SUBROUTINE Init_Jacobian_y - - !> This routine initializes the Jacobian parameters and initialization outputs for the linearized continuous states. - SUBROUTINE Init_Jacobian_x() - INTEGER(IntKi) :: i - p%Jac_nx = p%nDOFM ! qm - ! allocate space for the row/column names and for perturbation sizes - CALL AllocAry(InitOut%LinNames_x , 2*p%Jac_nx, 'LinNames_x' , ErrStat2, ErrMsg2); if(ErrStat/=ErrID_None) return - CALL AllocAry(InitOut%RotFrame_x , 2*p%Jac_nx, 'RotFrame_x' , ErrStat2, ErrMsg2); if(ErrStat/=ErrID_None) return - CALL AllocAry(InitOut%DerivOrder_x, 2*p%Jac_nx, 'DerivOrder_x', ErrStat2, ErrMsg2); if(ErrStat/=ErrID_None) return - ! default perturbations, p%dx: - p%dx(1) = 2.0_ReKi*D2R_D ! deflection states in rad and rad/s - p%dx(2) = 2.0_ReKi*D2R_D ! deflection states in rad and rad/s - InitOut%RotFrame_x = .false. - InitOut%DerivOrder_x = 2 - ! set linearization output names: - do i=1,p%Jac_nx - InitOut%LinNames_x(i) = 'Craig-Bampton mode '//trim(num2lstr(i))//' amplitude, -'; - end do - do i=1,p%Jac_nx - InitOut%LinNames_x(i+p%Jac_nx) = 'First time derivative of '//trim(InitOut%LinNames_x(i))//'/s' - InitOut%RotFrame_x(i+p%Jac_nx) = InitOut%RotFrame_x(i) - end do - END SUBROUTINE Init_Jacobian_x - - SUBROUTINE Init_Jacobian_u() - REAL(R8Ki) :: perturb - INTEGER(IntKi) :: i, j, idx, nu, i_meshField - ! Number of inputs - nu = u%TPMesh%nNodes * 18 & ! 3 Translation Displacements + 3 orientations + 6 velocities + 6 accelerations at each node - + u%LMesh%nNodes * 6 ! 3 forces + 3 moments at each node - ! --- Info of linearized inputs (Names, RotFrame, IsLoad) - call AllocAry(InitOut%LinNames_u, nu, 'LinNames_u', ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return - call AllocAry(InitOut%RotFrame_u, nu, 'RotFrame_u', ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return - call AllocAry(InitOut%IsLoad_u , nu, 'IsLoad_u' , ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return - InitOut%RotFrame_u = .false. ! every input is on a mesh, which stores values in the global (not rotating) frame - idx = 1 - call PackMotionMesh_Names(u%TPMesh, 'TPMesh', InitOut%LinNames_u, idx) ! all 6 motion fields - InitOut%IsLoad_u(1:idx-1) = .false. ! the TPMesh inputs are not loads - InitOut%IsLoad_u(idx:) = .true. ! the remaining inputs are loads - call PackLoadMesh_Names( u%LMesh, 'LMesh', InitOut%LinNames_u, idx) - - ! --- Jac_u_indx: matrix to store index to help us figure out what the ith value of the u vector really means - ! (see perturb_u ... these MUST match ) - ! column 1 indicates module's mesh and field - ! column 2 indicates the first index (x-y-z component) of the field - ! column 3 is the node - call allocAry( p%Jac_u_indx, nu, 3, 'p%Jac_u_indx', ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return - idx = 1 - !Module/Mesh/Field: u%TPMesh%TranslationDisp = 1; - !Module/Mesh/Field: u%TPMesh%Orientation = 2; - !Module/Mesh/Field: u%TPMesh%TranslationVel = 3; - !Module/Mesh/Field: u%TPMesh%RotationVel = 4; - !Module/Mesh/Field: u%TPMesh%TranslationAcc = 5; - !Module/Mesh/Field: u%TPMesh%RotationAcc = 6; - do i_meshField = 1,6 - do i=1,u%TPMesh%nNodes - do j=1,3 - p%Jac_u_indx(idx,1) = i_meshField - p%Jac_u_indx(idx,2) = j !component idx: j - p%Jac_u_indx(idx,3) = i !Node: i - idx = idx + 1 - end do !j - end do !i - end do - !Module/Mesh/Field: u%LMesh%Force = 7; - !Module/Mesh/Field: u%LMesh%Moment = 8; - do i_meshField = 7,8 - do i=1,u%LMesh%nNodes - do j=1,3 - p%Jac_u_indx(idx,1) = i_meshField - p%Jac_u_indx(idx,2) = j !component idx: j - p%Jac_u_indx(idx,3) = i !Node: i - idx = idx + 1 - end do !j - end do !i - end do - - ! --- Default perturbations, p%du: - call allocAry( p%du, 8, 'p%du', ErrStat2, ErrMsg2); if(ErrStat2/=ErrID_None) return ! 8 = number of unique values in p%Jac_u_indx(:,1) - perturb = 2.0_R8Ki*D2R_D - p%du( 1) = perturb ! u%TPMesh%TranslationDisp = 1; - p%du( 2) = perturb ! u%TPMesh%Orientation = 2; - p%du( 3) = perturb ! u%TPMesh%TranslationVel = 3; - p%du( 4) = perturb ! u%TPMesh%RotationVel = 4; - p%du( 5) = perturb ! u%TPMesh%TranslationAcc = 5; - p%du( 6) = perturb ! u%TPMesh%RotationAcc = 6; - p%du( 7) = 170*maxDim**2 ! u%LMesh%Force = 7; - p%du( 8) = 14*maxDim**3 ! u%LMesh%Moment = 8; - END SUBROUTINE Init_Jacobian_u - -END SUBROUTINE SD_Init_Jacobian -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the u array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine beamdyn::init_jacobian is consistant with this routine! -SUBROUTINE SD_Perturb_u( p, n, perturb_sign, u, du ) - TYPE(SD_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: n !< number of array element to use - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(SD_InputType) , INTENT(INOUT) :: u !< perturbed SD inputs - REAL( R8Ki ) , INTENT( OUT) :: du !< amount that specific input was perturbed - ! local variables - INTEGER :: fieldIndx - INTEGER :: node - fieldIndx = p%Jac_u_indx(n,2) - node = p%Jac_u_indx(n,3) - du = p%du( p%Jac_u_indx(n,1) ) - ! determine which mesh we're trying to perturb and perturb the input: - SELECT CASE( p%Jac_u_indx(n,1) ) - CASE ( 1) !Module/Mesh/Field: u%TPMesh%TranslationDisp = 1; - u%TPMesh%TranslationDisp( fieldIndx,node) = u%TPMesh%TranslationDisp( fieldIndx,node) + du * perturb_sign - CASE ( 2) !Module/Mesh/Field: u%TPMesh%Orientation = 2; - CALL PerturbOrientationMatrix( u%TPMesh%Orientation(:,:,node), du * perturb_sign, fieldIndx, UseSmlAngle=.false. ) - CASE ( 3) !Module/Mesh/Field: u%TPMesh%TranslationVel = 3; - u%TPMesh%TranslationVel( fieldIndx,node) = u%TPMesh%TranslationVel( fieldIndx,node) + du * perturb_sign - CASE ( 4) !Module/Mesh/Field: u%TPMesh%RotationVel = 4; - u%TPMesh%RotationVel(fieldIndx,node) = u%TPMesh%RotationVel(fieldIndx,node) + du * perturb_sign - CASE ( 5) !Module/Mesh/Field: u%TPMesh%TranslationAcc = 5; - u%TPMesh%TranslationAcc( fieldIndx,node) = u%TPMesh%TranslationAcc( fieldIndx,node) + du * perturb_sign - CASE ( 6) !Module/Mesh/Field: u%TPMesh%RotationAcc = 6; - u%TPMesh%RotationAcc(fieldIndx,node) = u%TPMesh%RotationAcc(fieldIndx,node) + du * perturb_sign - CASE ( 7) !Module/Mesh/Field: u%LMesh%Force = 7; - u%LMesh%Force(fieldIndx,node) = u%LMesh%Force(fieldIndx,node) + du * perturb_sign - CASE ( 8) !Module/Mesh/Field: u%LMesh%Moment = 8; - u%LMesh%Moment(fieldIndx,node) = u%LMesh%Moment(fieldIndx,node) + du * perturb_sign - END SELECT -END SUBROUTINE SD_Perturb_u -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine beamdyn::init_jacobian is consistant with this routine! -SUBROUTINE SD_Compute_dY(p, y_p, y_m, delta, dY) - TYPE(SD_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(SD_OutputType) , INTENT(IN ) :: y_p !< SD outputs at \f$ u + \Delta_p u \f$ or \f$ z + \Delta_p z \f$ (p=plus) - TYPE(SD_OutputType) , INTENT(IN ) :: y_m !< SD outputs at \f$ u - \Delta_m u \f$ or \f$ z - \Delta_m z \f$ (m=minus) - REAL(R8Ki) , INTENT(IN ) :: delta !< difference in inputs or states \f$ delta_p = \Delta_p u \f$ or \f$ delta_p = \Delta_p x \f$ - REAL(R8Ki) , INTENT(INOUT) :: dY(:) !< column of dYdu or dYdx: \f$ \frac{\partial Y}{\partial u_i} = \frac{y_p - y_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial Y}{\partial z_i} = \frac{y_p - y_m}{2 \, \Delta x}\f$ - ! local variables: - INTEGER(IntKi) :: i ! loop over outputs - INTEGER(IntKi) :: indx_first ! index indicating next value of dY to be filled - indx_first = 1 - call PackLoadMesh_dY( y_p%Y1Mesh, y_m%Y1Mesh, dY, indx_first) - call PackMotionMesh_dY(y_p%Y2Mesh, y_m%Y2Mesh, dY, indx_first, UseSmlAngle=.false.) ! all 6 motion fields - call PackMotionMesh_dY(y_p%Y3Mesh, y_m%Y3Mesh, dY, indx_first, UseSmlAngle=.false.) ! all 6 motion fields - do i=1,p%NumOuts - dY(i+indx_first-1) = y_p%WriteOutput(i) - y_m%WriteOutput(i) - end do - dY = dY / (2.0_R8Ki*delta) -END SUBROUTINE SD_Compute_dY -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine perturbs the nth element of the x array (and mesh/field it corresponds to) -!! Do not change this without making sure subroutine sd_init_jacobian is consistant with this routine! -SUBROUTINE SD_Perturb_x( p, fieldIndx, mode, perturb_sign, x, dx ) - TYPE(SD_ParameterType) , INTENT(IN ) :: p !< parameters - INTEGER( IntKi ) , INTENT(IN ) :: fieldIndx !< field in the state type: 1=displacements; 2=velocities - INTEGER( IntKi ) , INTENT(IN ) :: mode !< node number - INTEGER( IntKi ) , INTENT(IN ) :: perturb_sign !< +1 or -1 (value to multiply perturbation by; positive or negative difference) - TYPE(SD_ContinuousStateType), INTENT(INOUT) :: x !< perturbed SD states - REAL( R8Ki ) , INTENT( OUT) :: dx !< amount that specific state was perturbed - if (fieldIndx==1) then - dx=p%dx(1) - x%qm(mode) = x%qm(mode) + dx * perturb_sign - else - dx=p%dx(2) - x%qmdot(mode) = x%qmdot(mode) + dx * perturb_sign - end if -END SUBROUTINE SD_Perturb_x -!---------------------------------------------------------------------------------------------------------------------------------- -!> This routine uses values of two output types to compute an array of differences. -!! Do not change this packing without making sure subroutine sd_init_jacobian is consistant with this routine! -SUBROUTINE SD_Compute_dX(p, x_p, x_m, delta, dX) - TYPE(SD_ParameterType) , INTENT(IN ) :: p !< parameters - TYPE(SD_ContinuousStateType), INTENT(IN ) :: x_p !< SD continuous states at \f$ u + \Delta_p u \f$ or \f$ x + \Delta_p x \f$ (p=plus) - TYPE(SD_ContinuousStateType), INTENT(IN ) :: x_m !< SD continuous states at \f$ u - \Delta_m u \f$ or \f$ x - \Delta_m x \f$ (m=minus) - REAL(R8Ki) , INTENT(IN ) :: delta !< difference in inputs or states \f$ delta_p = \Delta_p u \f$ or \f$ delta_p = \Delta_p x \f$ - REAL(R8Ki) , INTENT(INOUT) :: dX(:) !< column of dXdu or dXdx: \f$ \frac{\partial X}{\partial u_i} = \frac{x_p - x_m}{2 \, \Delta u}\f$ or \f$ \frac{\partial X}{\partial x_i} = \frac{x_p - x_m}{2 \, \Delta x}\f$ - INTEGER(IntKi) :: i ! loop over modes - do i=1,p%Jac_nx - dX(i) = x_p%qm(i) - x_m%qm(i) - end do - do i=1,p%Jac_nx - dX(p%Jac_nx+i) = x_p%qmdot(i) - x_m%qmdot(i) - end do - dX = dX / (2.0_R8Ki*delta) -END SUBROUTINE SD_Compute_dX END MODULE SubDyn_Output diff --git a/modules/subdyn/src/SubDyn_Output_Params.f90 b/modules/subdyn/src/SubDyn_Output_Params.f90 index f789c117fc..a7c5d265c2 100644 --- a/modules/subdyn/src/SubDyn_Output_Params.f90 +++ b/modules/subdyn/src/SubDyn_Output_Params.f90 @@ -1,21766 +1,21972 @@ module SubDyn_Output_Params use NWTC_Library + ! Indices for computing output channels: + ! NOTES: + ! (1) These parameters are in the order stored in "OutListParameters.xlsx" + ! (2) Array AllOuts() must be dimensioned to the value of the largest output parameter IMPLICIT NONE PUBLIC -! =================================================================================================== -! 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 12-Jul-2022 14:06:59. + ! Time: + INTEGER, PARAMETER :: Time = 0 - ! Indices for computing output channels: - ! NOTES: - ! (1) These parameters are in the order stored in "GetSubDynOutListParameters.m" - ! (2) Array AllOuts() must be dimensioned to the value of the largest output parameter + ! Member Forces: - ! Time: + INTEGER(IntKi), PARAMETER :: M01N1FKxe = 1 + INTEGER(IntKi), PARAMETER :: M01N2FKxe = 2 + INTEGER(IntKi), PARAMETER :: M01N3FKxe = 3 + INTEGER(IntKi), PARAMETER :: M01N4FKxe = 4 + INTEGER(IntKi), PARAMETER :: M01N5FKxe = 5 + INTEGER(IntKi), PARAMETER :: M01N6FKxe = 6 + INTEGER(IntKi), PARAMETER :: M01N7FKxe = 7 + INTEGER(IntKi), PARAMETER :: M01N8FKxe = 8 + INTEGER(IntKi), PARAMETER :: M01N9FKxe = 9 + INTEGER(IntKi), PARAMETER :: M02N1FKxe = 10 + INTEGER(IntKi), PARAMETER :: M02N2FKxe = 11 + INTEGER(IntKi), PARAMETER :: M02N3FKxe = 12 + INTEGER(IntKi), PARAMETER :: M02N4FKxe = 13 + INTEGER(IntKi), PARAMETER :: M02N5FKxe = 14 + INTEGER(IntKi), PARAMETER :: M02N6FKxe = 15 + INTEGER(IntKi), PARAMETER :: M02N7FKxe = 16 + INTEGER(IntKi), PARAMETER :: M02N8FKxe = 17 + INTEGER(IntKi), PARAMETER :: M02N9FKxe = 18 + INTEGER(IntKi), PARAMETER :: M03N1FKxe = 19 + INTEGER(IntKi), PARAMETER :: M03N2FKxe = 20 + INTEGER(IntKi), PARAMETER :: M03N3FKxe = 21 + INTEGER(IntKi), PARAMETER :: M03N4FKxe = 22 + INTEGER(IntKi), PARAMETER :: M03N5FKxe = 23 + INTEGER(IntKi), PARAMETER :: M03N6FKxe = 24 + INTEGER(IntKi), PARAMETER :: M03N7FKxe = 25 + INTEGER(IntKi), PARAMETER :: M03N8FKxe = 26 + INTEGER(IntKi), PARAMETER :: M03N9FKxe = 27 + INTEGER(IntKi), PARAMETER :: M04N1FKxe = 28 + INTEGER(IntKi), PARAMETER :: M04N2FKxe = 29 + INTEGER(IntKi), PARAMETER :: M04N3FKxe = 30 + INTEGER(IntKi), PARAMETER :: M04N4FKxe = 31 + INTEGER(IntKi), PARAMETER :: M04N5FKxe = 32 + INTEGER(IntKi), PARAMETER :: M04N6FKxe = 33 + INTEGER(IntKi), PARAMETER :: M04N7FKxe = 34 + INTEGER(IntKi), PARAMETER :: M04N8FKxe = 35 + INTEGER(IntKi), PARAMETER :: M04N9FKxe = 36 + INTEGER(IntKi), PARAMETER :: M05N1FKxe = 37 + INTEGER(IntKi), PARAMETER :: M05N2FKxe = 38 + INTEGER(IntKi), PARAMETER :: M05N3FKxe = 39 + INTEGER(IntKi), PARAMETER :: M05N4FKxe = 40 + INTEGER(IntKi), PARAMETER :: M05N5FKxe = 41 + INTEGER(IntKi), PARAMETER :: M05N6FKxe = 42 + INTEGER(IntKi), PARAMETER :: M05N7FKxe = 43 + INTEGER(IntKi), PARAMETER :: M05N8FKxe = 44 + INTEGER(IntKi), PARAMETER :: M05N9FKxe = 45 + INTEGER(IntKi), PARAMETER :: M06N1FKxe = 46 + INTEGER(IntKi), PARAMETER :: M06N2FKxe = 47 + INTEGER(IntKi), PARAMETER :: M06N3FKxe = 48 + INTEGER(IntKi), PARAMETER :: M06N4FKxe = 49 + INTEGER(IntKi), PARAMETER :: M06N5FKxe = 50 + INTEGER(IntKi), PARAMETER :: M06N6FKxe = 51 + INTEGER(IntKi), PARAMETER :: M06N7FKxe = 52 + INTEGER(IntKi), PARAMETER :: M06N8FKxe = 53 + INTEGER(IntKi), PARAMETER :: M06N9FKxe = 54 + INTEGER(IntKi), PARAMETER :: M07N1FKxe = 55 + INTEGER(IntKi), PARAMETER :: M07N2FKxe = 56 + INTEGER(IntKi), PARAMETER :: M07N3FKxe = 57 + INTEGER(IntKi), PARAMETER :: M07N4FKxe = 58 + INTEGER(IntKi), PARAMETER :: M07N5FKxe = 59 + INTEGER(IntKi), PARAMETER :: M07N6FKxe = 60 + INTEGER(IntKi), PARAMETER :: M07N7FKxe = 61 + INTEGER(IntKi), PARAMETER :: M07N8FKxe = 62 + INTEGER(IntKi), PARAMETER :: M07N9FKxe = 63 + INTEGER(IntKi), PARAMETER :: M08N1FKxe = 64 + INTEGER(IntKi), PARAMETER :: M08N2FKxe = 65 + INTEGER(IntKi), PARAMETER :: M08N3FKxe = 66 + INTEGER(IntKi), PARAMETER :: M08N4FKxe = 67 + INTEGER(IntKi), PARAMETER :: M08N5FKxe = 68 + INTEGER(IntKi), PARAMETER :: M08N6FKxe = 69 + INTEGER(IntKi), PARAMETER :: M08N7FKxe = 70 + INTEGER(IntKi), PARAMETER :: M08N8FKxe = 71 + INTEGER(IntKi), PARAMETER :: M08N9FKxe = 72 + INTEGER(IntKi), PARAMETER :: M09N1FKxe = 73 + INTEGER(IntKi), PARAMETER :: M09N2FKxe = 74 + INTEGER(IntKi), PARAMETER :: M09N3FKxe = 75 + INTEGER(IntKi), PARAMETER :: M09N4FKxe = 76 + INTEGER(IntKi), PARAMETER :: M09N5FKxe = 77 + INTEGER(IntKi), PARAMETER :: M09N6FKxe = 78 + INTEGER(IntKi), PARAMETER :: M09N7FKxe = 79 + INTEGER(IntKi), PARAMETER :: M09N8FKxe = 80 + INTEGER(IntKi), PARAMETER :: M09N9FKxe = 81 + INTEGER(IntKi), PARAMETER :: M10N1FKxe = 82 + INTEGER(IntKi), PARAMETER :: M10N2FKxe = 83 + INTEGER(IntKi), PARAMETER :: M10N3FKxe = 84 + INTEGER(IntKi), PARAMETER :: M10N4FKxe = 85 + INTEGER(IntKi), PARAMETER :: M10N5FKxe = 86 + INTEGER(IntKi), PARAMETER :: M10N6FKxe = 87 + INTEGER(IntKi), PARAMETER :: M10N7FKxe = 88 + INTEGER(IntKi), PARAMETER :: M10N8FKxe = 89 + INTEGER(IntKi), PARAMETER :: M10N9FKxe = 90 + INTEGER(IntKi), PARAMETER :: M11N1FKxe = 91 + INTEGER(IntKi), PARAMETER :: M11N2FKxe = 92 + INTEGER(IntKi), PARAMETER :: M11N3FKxe = 93 + INTEGER(IntKi), PARAMETER :: M11N4FKxe = 94 + INTEGER(IntKi), PARAMETER :: M11N5FKxe = 95 + INTEGER(IntKi), PARAMETER :: M11N6FKxe = 96 + INTEGER(IntKi), PARAMETER :: M11N7FKxe = 97 + INTEGER(IntKi), PARAMETER :: M11N8FKxe = 98 + INTEGER(IntKi), PARAMETER :: M11N9FKxe = 99 + INTEGER(IntKi), PARAMETER :: M12N1FKxe = 100 + INTEGER(IntKi), PARAMETER :: M12N2FKxe = 101 + INTEGER(IntKi), PARAMETER :: M12N3FKxe = 102 + INTEGER(IntKi), PARAMETER :: M12N4FKxe = 103 + INTEGER(IntKi), PARAMETER :: M12N5FKxe = 104 + INTEGER(IntKi), PARAMETER :: M12N6FKxe = 105 + INTEGER(IntKi), PARAMETER :: M12N7FKxe = 106 + INTEGER(IntKi), PARAMETER :: M12N8FKxe = 107 + INTEGER(IntKi), PARAMETER :: M12N9FKxe = 108 + INTEGER(IntKi), PARAMETER :: M13N1FKxe = 109 + INTEGER(IntKi), PARAMETER :: M13N2FKxe = 110 + INTEGER(IntKi), PARAMETER :: M13N3FKxe = 111 + INTEGER(IntKi), PARAMETER :: M13N4FKxe = 112 + INTEGER(IntKi), PARAMETER :: M13N5FKxe = 113 + INTEGER(IntKi), PARAMETER :: M13N6FKxe = 114 + INTEGER(IntKi), PARAMETER :: M13N7FKxe = 115 + INTEGER(IntKi), PARAMETER :: M13N8FKxe = 116 + INTEGER(IntKi), PARAMETER :: M13N9FKxe = 117 + INTEGER(IntKi), PARAMETER :: M14N1FKxe = 118 + INTEGER(IntKi), PARAMETER :: M14N2FKxe = 119 + INTEGER(IntKi), PARAMETER :: M14N3FKxe = 120 + INTEGER(IntKi), PARAMETER :: M14N4FKxe = 121 + INTEGER(IntKi), PARAMETER :: M14N5FKxe = 122 + INTEGER(IntKi), PARAMETER :: M14N6FKxe = 123 + INTEGER(IntKi), PARAMETER :: M14N7FKxe = 124 + INTEGER(IntKi), PARAMETER :: M14N8FKxe = 125 + INTEGER(IntKi), PARAMETER :: M14N9FKxe = 126 + INTEGER(IntKi), PARAMETER :: M15N1FKxe = 127 + INTEGER(IntKi), PARAMETER :: M15N2FKxe = 128 + INTEGER(IntKi), PARAMETER :: M15N3FKxe = 129 + INTEGER(IntKi), PARAMETER :: M15N4FKxe = 130 + INTEGER(IntKi), PARAMETER :: M15N5FKxe = 131 + INTEGER(IntKi), PARAMETER :: M15N6FKxe = 132 + INTEGER(IntKi), PARAMETER :: M15N7FKxe = 133 + INTEGER(IntKi), PARAMETER :: M15N8FKxe = 134 + INTEGER(IntKi), PARAMETER :: M15N9FKxe = 135 + INTEGER(IntKi), PARAMETER :: M16N1FKxe = 136 + INTEGER(IntKi), PARAMETER :: M16N2FKxe = 137 + INTEGER(IntKi), PARAMETER :: M16N3FKxe = 138 + INTEGER(IntKi), PARAMETER :: M16N4FKxe = 139 + INTEGER(IntKi), PARAMETER :: M16N5FKxe = 140 + INTEGER(IntKi), PARAMETER :: M16N6FKxe = 141 + INTEGER(IntKi), PARAMETER :: M16N7FKxe = 142 + INTEGER(IntKi), PARAMETER :: M16N8FKxe = 143 + INTEGER(IntKi), PARAMETER :: M16N9FKxe = 144 + INTEGER(IntKi), PARAMETER :: M17N1FKxe = 145 + INTEGER(IntKi), PARAMETER :: M17N2FKxe = 146 + INTEGER(IntKi), PARAMETER :: M17N3FKxe = 147 + INTEGER(IntKi), PARAMETER :: M17N4FKxe = 148 + INTEGER(IntKi), PARAMETER :: M17N5FKxe = 149 + INTEGER(IntKi), PARAMETER :: M17N6FKxe = 150 + INTEGER(IntKi), PARAMETER :: M17N7FKxe = 151 + INTEGER(IntKi), PARAMETER :: M17N8FKxe = 152 + INTEGER(IntKi), PARAMETER :: M17N9FKxe = 153 + INTEGER(IntKi), PARAMETER :: M18N1FKxe = 154 + INTEGER(IntKi), PARAMETER :: M18N2FKxe = 155 + INTEGER(IntKi), PARAMETER :: M18N3FKxe = 156 + INTEGER(IntKi), PARAMETER :: M18N4FKxe = 157 + INTEGER(IntKi), PARAMETER :: M18N5FKxe = 158 + INTEGER(IntKi), PARAMETER :: M18N6FKxe = 159 + INTEGER(IntKi), PARAMETER :: M18N7FKxe = 160 + INTEGER(IntKi), PARAMETER :: M18N8FKxe = 161 + INTEGER(IntKi), PARAMETER :: M18N9FKxe = 162 + INTEGER(IntKi), PARAMETER :: M19N1FKxe = 163 + INTEGER(IntKi), PARAMETER :: M19N2FKxe = 164 + INTEGER(IntKi), PARAMETER :: M19N3FKxe = 165 + INTEGER(IntKi), PARAMETER :: M19N4FKxe = 166 + INTEGER(IntKi), PARAMETER :: M19N5FKxe = 167 + INTEGER(IntKi), PARAMETER :: M19N6FKxe = 168 + INTEGER(IntKi), PARAMETER :: M19N7FKxe = 169 + INTEGER(IntKi), PARAMETER :: M19N8FKxe = 170 + INTEGER(IntKi), PARAMETER :: M19N9FKxe = 171 + INTEGER(IntKi), PARAMETER :: M20N1FKxe = 172 + INTEGER(IntKi), PARAMETER :: M20N2FKxe = 173 + INTEGER(IntKi), PARAMETER :: M20N3FKxe = 174 + INTEGER(IntKi), PARAMETER :: M20N4FKxe = 175 + INTEGER(IntKi), PARAMETER :: M20N5FKxe = 176 + INTEGER(IntKi), PARAMETER :: M20N6FKxe = 177 + INTEGER(IntKi), PARAMETER :: M20N7FKxe = 178 + INTEGER(IntKi), PARAMETER :: M20N8FKxe = 179 + INTEGER(IntKi), PARAMETER :: M20N9FKxe = 180 + INTEGER(IntKi), PARAMETER :: M21N1FKxe = 181 + INTEGER(IntKi), PARAMETER :: M21N2FKxe = 182 + INTEGER(IntKi), PARAMETER :: M21N3FKxe = 183 + INTEGER(IntKi), PARAMETER :: M21N4FKxe = 184 + INTEGER(IntKi), PARAMETER :: M21N5FKxe = 185 + INTEGER(IntKi), PARAMETER :: M21N6FKxe = 186 + INTEGER(IntKi), PARAMETER :: M21N7FKxe = 187 + INTEGER(IntKi), PARAMETER :: M21N8FKxe = 188 + INTEGER(IntKi), PARAMETER :: M21N9FKxe = 189 + INTEGER(IntKi), PARAMETER :: M22N1FKxe = 190 + INTEGER(IntKi), PARAMETER :: M22N2FKxe = 191 + INTEGER(IntKi), PARAMETER :: M22N3FKxe = 192 + INTEGER(IntKi), PARAMETER :: M22N4FKxe = 193 + INTEGER(IntKi), PARAMETER :: M22N5FKxe = 194 + INTEGER(IntKi), PARAMETER :: M22N6FKxe = 195 + INTEGER(IntKi), PARAMETER :: M22N7FKxe = 196 + INTEGER(IntKi), PARAMETER :: M22N8FKxe = 197 + INTEGER(IntKi), PARAMETER :: M22N9FKxe = 198 + INTEGER(IntKi), PARAMETER :: M23N1FKxe = 199 + INTEGER(IntKi), PARAMETER :: M23N2FKxe = 200 + INTEGER(IntKi), PARAMETER :: M23N3FKxe = 201 + INTEGER(IntKi), PARAMETER :: M23N4FKxe = 202 + INTEGER(IntKi), PARAMETER :: M23N5FKxe = 203 + INTEGER(IntKi), PARAMETER :: M23N6FKxe = 204 + INTEGER(IntKi), PARAMETER :: M23N7FKxe = 205 + INTEGER(IntKi), PARAMETER :: M23N8FKxe = 206 + INTEGER(IntKi), PARAMETER :: M23N9FKxe = 207 + INTEGER(IntKi), PARAMETER :: M24N1FKxe = 208 + INTEGER(IntKi), PARAMETER :: M24N2FKxe = 209 + INTEGER(IntKi), PARAMETER :: M24N3FKxe = 210 + INTEGER(IntKi), PARAMETER :: M24N4FKxe = 211 + INTEGER(IntKi), PARAMETER :: M24N5FKxe = 212 + INTEGER(IntKi), PARAMETER :: M24N6FKxe = 213 + INTEGER(IntKi), PARAMETER :: M24N7FKxe = 214 + INTEGER(IntKi), PARAMETER :: M24N8FKxe = 215 + INTEGER(IntKi), PARAMETER :: M24N9FKxe = 216 + INTEGER(IntKi), PARAMETER :: M25N1FKxe = 217 + INTEGER(IntKi), PARAMETER :: M25N2FKxe = 218 + INTEGER(IntKi), PARAMETER :: M25N3FKxe = 219 + INTEGER(IntKi), PARAMETER :: M25N4FKxe = 220 + INTEGER(IntKi), PARAMETER :: M25N5FKxe = 221 + INTEGER(IntKi), PARAMETER :: M25N6FKxe = 222 + INTEGER(IntKi), PARAMETER :: M25N7FKxe = 223 + INTEGER(IntKi), PARAMETER :: M25N8FKxe = 224 + INTEGER(IntKi), PARAMETER :: M25N9FKxe = 225 + INTEGER(IntKi), PARAMETER :: M26N1FKxe = 226 + INTEGER(IntKi), PARAMETER :: M26N2FKxe = 227 + INTEGER(IntKi), PARAMETER :: M26N3FKxe = 228 + INTEGER(IntKi), PARAMETER :: M26N4FKxe = 229 + INTEGER(IntKi), PARAMETER :: M26N5FKxe = 230 + INTEGER(IntKi), PARAMETER :: M26N6FKxe = 231 + INTEGER(IntKi), PARAMETER :: M26N7FKxe = 232 + INTEGER(IntKi), PARAMETER :: M26N8FKxe = 233 + INTEGER(IntKi), PARAMETER :: M26N9FKxe = 234 + INTEGER(IntKi), PARAMETER :: M27N1FKxe = 235 + INTEGER(IntKi), PARAMETER :: M27N2FKxe = 236 + INTEGER(IntKi), PARAMETER :: M27N3FKxe = 237 + INTEGER(IntKi), PARAMETER :: M27N4FKxe = 238 + INTEGER(IntKi), PARAMETER :: M27N5FKxe = 239 + INTEGER(IntKi), PARAMETER :: M27N6FKxe = 240 + INTEGER(IntKi), PARAMETER :: M27N7FKxe = 241 + INTEGER(IntKi), PARAMETER :: M27N8FKxe = 242 + INTEGER(IntKi), PARAMETER :: M27N9FKxe = 243 + INTEGER(IntKi), PARAMETER :: M28N1FKxe = 244 + INTEGER(IntKi), PARAMETER :: M28N2FKxe = 245 + INTEGER(IntKi), PARAMETER :: M28N3FKxe = 246 + INTEGER(IntKi), PARAMETER :: M28N4FKxe = 247 + INTEGER(IntKi), PARAMETER :: M28N5FKxe = 248 + INTEGER(IntKi), PARAMETER :: M28N6FKxe = 249 + INTEGER(IntKi), PARAMETER :: M28N7FKxe = 250 + INTEGER(IntKi), PARAMETER :: M28N8FKxe = 251 + INTEGER(IntKi), PARAMETER :: M28N9FKxe = 252 + INTEGER(IntKi), PARAMETER :: M29N1FKxe = 253 + INTEGER(IntKi), PARAMETER :: M29N2FKxe = 254 + INTEGER(IntKi), PARAMETER :: M29N3FKxe = 255 + INTEGER(IntKi), PARAMETER :: M29N4FKxe = 256 + INTEGER(IntKi), PARAMETER :: M29N5FKxe = 257 + INTEGER(IntKi), PARAMETER :: M29N6FKxe = 258 + INTEGER(IntKi), PARAMETER :: M29N7FKxe = 259 + INTEGER(IntKi), PARAMETER :: M29N8FKxe = 260 + INTEGER(IntKi), PARAMETER :: M29N9FKxe = 261 + INTEGER(IntKi), PARAMETER :: M30N1FKxe = 262 + INTEGER(IntKi), PARAMETER :: M30N2FKxe = 263 + INTEGER(IntKi), PARAMETER :: M30N3FKxe = 264 + INTEGER(IntKi), PARAMETER :: M30N4FKxe = 265 + INTEGER(IntKi), PARAMETER :: M30N5FKxe = 266 + INTEGER(IntKi), PARAMETER :: M30N6FKxe = 267 + INTEGER(IntKi), PARAMETER :: M30N7FKxe = 268 + INTEGER(IntKi), PARAMETER :: M30N8FKxe = 269 + INTEGER(IntKi), PARAMETER :: M30N9FKxe = 270 + INTEGER(IntKi), PARAMETER :: M31N1FKxe = 271 + INTEGER(IntKi), PARAMETER :: M31N2FKxe = 272 + INTEGER(IntKi), PARAMETER :: M31N3FKxe = 273 + INTEGER(IntKi), PARAMETER :: M31N4FKxe = 274 + INTEGER(IntKi), PARAMETER :: M31N5FKxe = 275 + INTEGER(IntKi), PARAMETER :: M31N6FKxe = 276 + INTEGER(IntKi), PARAMETER :: M31N7FKxe = 277 + INTEGER(IntKi), PARAMETER :: M31N8FKxe = 278 + INTEGER(IntKi), PARAMETER :: M31N9FKxe = 279 + INTEGER(IntKi), PARAMETER :: M32N1FKxe = 280 + INTEGER(IntKi), PARAMETER :: M32N2FKxe = 281 + INTEGER(IntKi), PARAMETER :: M32N3FKxe = 282 + INTEGER(IntKi), PARAMETER :: M32N4FKxe = 283 + INTEGER(IntKi), PARAMETER :: M32N5FKxe = 284 + INTEGER(IntKi), PARAMETER :: M32N6FKxe = 285 + INTEGER(IntKi), PARAMETER :: M32N7FKxe = 286 + INTEGER(IntKi), PARAMETER :: M32N8FKxe = 287 + INTEGER(IntKi), PARAMETER :: M32N9FKxe = 288 + INTEGER(IntKi), PARAMETER :: M33N1FKxe = 289 + INTEGER(IntKi), PARAMETER :: M33N2FKxe = 290 + INTEGER(IntKi), PARAMETER :: M33N3FKxe = 291 + INTEGER(IntKi), PARAMETER :: M33N4FKxe = 292 + INTEGER(IntKi), PARAMETER :: M33N5FKxe = 293 + INTEGER(IntKi), PARAMETER :: M33N6FKxe = 294 + INTEGER(IntKi), PARAMETER :: M33N7FKxe = 295 + INTEGER(IntKi), PARAMETER :: M33N8FKxe = 296 + INTEGER(IntKi), PARAMETER :: M33N9FKxe = 297 + INTEGER(IntKi), PARAMETER :: M34N1FKxe = 298 + INTEGER(IntKi), PARAMETER :: M34N2FKxe = 299 + INTEGER(IntKi), PARAMETER :: M34N3FKxe = 300 + INTEGER(IntKi), PARAMETER :: M34N4FKxe = 301 + INTEGER(IntKi), PARAMETER :: M34N5FKxe = 302 + INTEGER(IntKi), PARAMETER :: M34N6FKxe = 303 + INTEGER(IntKi), PARAMETER :: M34N7FKxe = 304 + INTEGER(IntKi), PARAMETER :: M34N8FKxe = 305 + INTEGER(IntKi), PARAMETER :: M34N9FKxe = 306 + INTEGER(IntKi), PARAMETER :: M35N1FKxe = 307 + INTEGER(IntKi), PARAMETER :: M35N2FKxe = 308 + INTEGER(IntKi), PARAMETER :: M35N3FKxe = 309 + INTEGER(IntKi), PARAMETER :: M35N4FKxe = 310 + INTEGER(IntKi), PARAMETER :: M35N5FKxe = 311 + INTEGER(IntKi), PARAMETER :: M35N6FKxe = 312 + INTEGER(IntKi), PARAMETER :: M35N7FKxe = 313 + INTEGER(IntKi), PARAMETER :: M35N8FKxe = 314 + INTEGER(IntKi), PARAMETER :: M35N9FKxe = 315 + INTEGER(IntKi), PARAMETER :: M36N1FKxe = 316 + INTEGER(IntKi), PARAMETER :: M36N2FKxe = 317 + INTEGER(IntKi), PARAMETER :: M36N3FKxe = 318 + INTEGER(IntKi), PARAMETER :: M36N4FKxe = 319 + INTEGER(IntKi), PARAMETER :: M36N5FKxe = 320 + INTEGER(IntKi), PARAMETER :: M36N6FKxe = 321 + INTEGER(IntKi), PARAMETER :: M36N7FKxe = 322 + INTEGER(IntKi), PARAMETER :: M36N8FKxe = 323 + INTEGER(IntKi), PARAMETER :: M36N9FKxe = 324 + INTEGER(IntKi), PARAMETER :: M37N1FKxe = 325 + INTEGER(IntKi), PARAMETER :: M37N2FKxe = 326 + INTEGER(IntKi), PARAMETER :: M37N3FKxe = 327 + INTEGER(IntKi), PARAMETER :: M37N4FKxe = 328 + INTEGER(IntKi), PARAMETER :: M37N5FKxe = 329 + INTEGER(IntKi), PARAMETER :: M37N6FKxe = 330 + INTEGER(IntKi), PARAMETER :: M37N7FKxe = 331 + INTEGER(IntKi), PARAMETER :: M37N8FKxe = 332 + INTEGER(IntKi), PARAMETER :: M37N9FKxe = 333 + INTEGER(IntKi), PARAMETER :: M38N1FKxe = 334 + INTEGER(IntKi), PARAMETER :: M38N2FKxe = 335 + INTEGER(IntKi), PARAMETER :: M38N3FKxe = 336 + INTEGER(IntKi), PARAMETER :: M38N4FKxe = 337 + INTEGER(IntKi), PARAMETER :: M38N5FKxe = 338 + INTEGER(IntKi), PARAMETER :: M38N6FKxe = 339 + INTEGER(IntKi), PARAMETER :: M38N7FKxe = 340 + INTEGER(IntKi), PARAMETER :: M38N8FKxe = 341 + INTEGER(IntKi), PARAMETER :: M38N9FKxe = 342 + INTEGER(IntKi), PARAMETER :: M39N1FKxe = 343 + INTEGER(IntKi), PARAMETER :: M39N2FKxe = 344 + INTEGER(IntKi), PARAMETER :: M39N3FKxe = 345 + INTEGER(IntKi), PARAMETER :: M39N4FKxe = 346 + INTEGER(IntKi), PARAMETER :: M39N5FKxe = 347 + INTEGER(IntKi), PARAMETER :: M39N6FKxe = 348 + INTEGER(IntKi), PARAMETER :: M39N7FKxe = 349 + INTEGER(IntKi), PARAMETER :: M39N8FKxe = 350 + INTEGER(IntKi), PARAMETER :: M39N9FKxe = 351 + INTEGER(IntKi), PARAMETER :: M40N1FKxe = 352 + INTEGER(IntKi), PARAMETER :: M40N2FKxe = 353 + INTEGER(IntKi), PARAMETER :: M40N3FKxe = 354 + INTEGER(IntKi), PARAMETER :: M40N4FKxe = 355 + INTEGER(IntKi), PARAMETER :: M40N5FKxe = 356 + INTEGER(IntKi), PARAMETER :: M40N6FKxe = 357 + INTEGER(IntKi), PARAMETER :: M40N7FKxe = 358 + INTEGER(IntKi), PARAMETER :: M40N8FKxe = 359 + INTEGER(IntKi), PARAMETER :: M40N9FKxe = 360 + INTEGER(IntKi), PARAMETER :: M41N1FKxe = 361 + INTEGER(IntKi), PARAMETER :: M41N2FKxe = 362 + INTEGER(IntKi), PARAMETER :: M41N3FKxe = 363 + INTEGER(IntKi), PARAMETER :: M41N4FKxe = 364 + INTEGER(IntKi), PARAMETER :: M41N5FKxe = 365 + INTEGER(IntKi), PARAMETER :: M41N6FKxe = 366 + INTEGER(IntKi), PARAMETER :: M41N7FKxe = 367 + INTEGER(IntKi), PARAMETER :: M41N8FKxe = 368 + INTEGER(IntKi), PARAMETER :: M41N9FKxe = 369 + INTEGER(IntKi), PARAMETER :: M42N1FKxe = 370 + INTEGER(IntKi), PARAMETER :: M42N2FKxe = 371 + INTEGER(IntKi), PARAMETER :: M42N3FKxe = 372 + INTEGER(IntKi), PARAMETER :: M42N4FKxe = 373 + INTEGER(IntKi), PARAMETER :: M42N5FKxe = 374 + INTEGER(IntKi), PARAMETER :: M42N6FKxe = 375 + INTEGER(IntKi), PARAMETER :: M42N7FKxe = 376 + INTEGER(IntKi), PARAMETER :: M42N8FKxe = 377 + INTEGER(IntKi), PARAMETER :: M42N9FKxe = 378 + INTEGER(IntKi), PARAMETER :: M43N1FKxe = 379 + INTEGER(IntKi), PARAMETER :: M43N2FKxe = 380 + INTEGER(IntKi), PARAMETER :: M43N3FKxe = 381 + INTEGER(IntKi), PARAMETER :: M43N4FKxe = 382 + INTEGER(IntKi), PARAMETER :: M43N5FKxe = 383 + INTEGER(IntKi), PARAMETER :: M43N6FKxe = 384 + INTEGER(IntKi), PARAMETER :: M43N7FKxe = 385 + INTEGER(IntKi), PARAMETER :: M43N8FKxe = 386 + INTEGER(IntKi), PARAMETER :: M43N9FKxe = 387 + INTEGER(IntKi), PARAMETER :: M44N1FKxe = 388 + INTEGER(IntKi), PARAMETER :: M44N2FKxe = 389 + INTEGER(IntKi), PARAMETER :: M44N3FKxe = 390 + INTEGER(IntKi), PARAMETER :: M44N4FKxe = 391 + INTEGER(IntKi), PARAMETER :: M44N5FKxe = 392 + INTEGER(IntKi), PARAMETER :: M44N6FKxe = 393 + INTEGER(IntKi), PARAMETER :: M44N7FKxe = 394 + INTEGER(IntKi), PARAMETER :: M44N8FKxe = 395 + INTEGER(IntKi), PARAMETER :: M44N9FKxe = 396 + INTEGER(IntKi), PARAMETER :: M45N1FKxe = 397 + INTEGER(IntKi), PARAMETER :: M45N2FKxe = 398 + INTEGER(IntKi), PARAMETER :: M45N3FKxe = 399 + INTEGER(IntKi), PARAMETER :: M45N4FKxe = 400 + INTEGER(IntKi), PARAMETER :: M45N5FKxe = 401 + INTEGER(IntKi), PARAMETER :: M45N6FKxe = 402 + INTEGER(IntKi), PARAMETER :: M45N7FKxe = 403 + INTEGER(IntKi), PARAMETER :: M45N8FKxe = 404 + INTEGER(IntKi), PARAMETER :: M45N9FKxe = 405 + INTEGER(IntKi), PARAMETER :: M46N1FKxe = 406 + INTEGER(IntKi), PARAMETER :: M46N2FKxe = 407 + INTEGER(IntKi), PARAMETER :: M46N3FKxe = 408 + INTEGER(IntKi), PARAMETER :: M46N4FKxe = 409 + INTEGER(IntKi), PARAMETER :: M46N5FKxe = 410 + INTEGER(IntKi), PARAMETER :: M46N6FKxe = 411 + INTEGER(IntKi), PARAMETER :: M46N7FKxe = 412 + INTEGER(IntKi), PARAMETER :: M46N8FKxe = 413 + INTEGER(IntKi), PARAMETER :: M46N9FKxe = 414 + INTEGER(IntKi), PARAMETER :: M47N1FKxe = 415 + INTEGER(IntKi), PARAMETER :: M47N2FKxe = 416 + INTEGER(IntKi), PARAMETER :: M47N3FKxe = 417 + INTEGER(IntKi), PARAMETER :: M47N4FKxe = 418 + INTEGER(IntKi), PARAMETER :: M47N5FKxe = 419 + INTEGER(IntKi), PARAMETER :: M47N6FKxe = 420 + INTEGER(IntKi), PARAMETER :: M47N7FKxe = 421 + INTEGER(IntKi), PARAMETER :: M47N8FKxe = 422 + INTEGER(IntKi), PARAMETER :: M47N9FKxe = 423 + INTEGER(IntKi), PARAMETER :: M48N1FKxe = 424 + INTEGER(IntKi), PARAMETER :: M48N2FKxe = 425 + INTEGER(IntKi), PARAMETER :: M48N3FKxe = 426 + INTEGER(IntKi), PARAMETER :: M48N4FKxe = 427 + INTEGER(IntKi), PARAMETER :: M48N5FKxe = 428 + INTEGER(IntKi), PARAMETER :: M48N6FKxe = 429 + INTEGER(IntKi), PARAMETER :: M48N7FKxe = 430 + INTEGER(IntKi), PARAMETER :: M48N8FKxe = 431 + INTEGER(IntKi), PARAMETER :: M48N9FKxe = 432 + INTEGER(IntKi), PARAMETER :: M49N1FKxe = 433 + INTEGER(IntKi), PARAMETER :: M49N2FKxe = 434 + INTEGER(IntKi), PARAMETER :: M49N3FKxe = 435 + INTEGER(IntKi), PARAMETER :: M49N4FKxe = 436 + INTEGER(IntKi), PARAMETER :: M49N5FKxe = 437 + INTEGER(IntKi), PARAMETER :: M49N6FKxe = 438 + INTEGER(IntKi), PARAMETER :: M49N7FKxe = 439 + INTEGER(IntKi), PARAMETER :: M49N8FKxe = 440 + INTEGER(IntKi), PARAMETER :: M49N9FKxe = 441 + INTEGER(IntKi), PARAMETER :: M50N1FKxe = 442 + INTEGER(IntKi), PARAMETER :: M50N2FKxe = 443 + INTEGER(IntKi), PARAMETER :: M50N3FKxe = 444 + INTEGER(IntKi), PARAMETER :: M50N4FKxe = 445 + INTEGER(IntKi), PARAMETER :: M50N5FKxe = 446 + INTEGER(IntKi), PARAMETER :: M50N6FKxe = 447 + INTEGER(IntKi), PARAMETER :: M50N7FKxe = 448 + INTEGER(IntKi), PARAMETER :: M50N8FKxe = 449 + INTEGER(IntKi), PARAMETER :: M50N9FKxe = 450 + INTEGER(IntKi), PARAMETER :: M51N1FKxe = 451 + INTEGER(IntKi), PARAMETER :: M51N2FKxe = 452 + INTEGER(IntKi), PARAMETER :: M51N3FKxe = 453 + INTEGER(IntKi), PARAMETER :: M51N4FKxe = 454 + INTEGER(IntKi), PARAMETER :: M51N5FKxe = 455 + INTEGER(IntKi), PARAMETER :: M51N6FKxe = 456 + INTEGER(IntKi), PARAMETER :: M51N7FKxe = 457 + INTEGER(IntKi), PARAMETER :: M51N8FKxe = 458 + INTEGER(IntKi), PARAMETER :: M51N9FKxe = 459 + INTEGER(IntKi), PARAMETER :: M52N1FKxe = 460 + INTEGER(IntKi), PARAMETER :: M52N2FKxe = 461 + INTEGER(IntKi), PARAMETER :: M52N3FKxe = 462 + INTEGER(IntKi), PARAMETER :: M52N4FKxe = 463 + INTEGER(IntKi), PARAMETER :: M52N5FKxe = 464 + INTEGER(IntKi), PARAMETER :: M52N6FKxe = 465 + INTEGER(IntKi), PARAMETER :: M52N7FKxe = 466 + INTEGER(IntKi), PARAMETER :: M52N8FKxe = 467 + INTEGER(IntKi), PARAMETER :: M52N9FKxe = 468 + INTEGER(IntKi), PARAMETER :: M53N1FKxe = 469 + INTEGER(IntKi), PARAMETER :: M53N2FKxe = 470 + INTEGER(IntKi), PARAMETER :: M53N3FKxe = 471 + INTEGER(IntKi), PARAMETER :: M53N4FKxe = 472 + INTEGER(IntKi), PARAMETER :: M53N5FKxe = 473 + INTEGER(IntKi), PARAMETER :: M53N6FKxe = 474 + INTEGER(IntKi), PARAMETER :: M53N7FKxe = 475 + INTEGER(IntKi), PARAMETER :: M53N8FKxe = 476 + INTEGER(IntKi), PARAMETER :: M53N9FKxe = 477 + INTEGER(IntKi), PARAMETER :: M54N1FKxe = 478 + INTEGER(IntKi), PARAMETER :: M54N2FKxe = 479 + INTEGER(IntKi), PARAMETER :: M54N3FKxe = 480 + INTEGER(IntKi), PARAMETER :: M54N4FKxe = 481 + INTEGER(IntKi), PARAMETER :: M54N5FKxe = 482 + INTEGER(IntKi), PARAMETER :: M54N6FKxe = 483 + INTEGER(IntKi), PARAMETER :: M54N7FKxe = 484 + INTEGER(IntKi), PARAMETER :: M54N8FKxe = 485 + INTEGER(IntKi), PARAMETER :: M54N9FKxe = 486 + INTEGER(IntKi), PARAMETER :: M55N1FKxe = 487 + INTEGER(IntKi), PARAMETER :: M55N2FKxe = 488 + INTEGER(IntKi), PARAMETER :: M55N3FKxe = 489 + INTEGER(IntKi), PARAMETER :: M55N4FKxe = 490 + INTEGER(IntKi), PARAMETER :: M55N5FKxe = 491 + INTEGER(IntKi), PARAMETER :: M55N6FKxe = 492 + INTEGER(IntKi), PARAMETER :: M55N7FKxe = 493 + INTEGER(IntKi), PARAMETER :: M55N8FKxe = 494 + INTEGER(IntKi), PARAMETER :: M55N9FKxe = 495 + INTEGER(IntKi), PARAMETER :: M56N1FKxe = 496 + INTEGER(IntKi), PARAMETER :: M56N2FKxe = 497 + INTEGER(IntKi), PARAMETER :: M56N3FKxe = 498 + INTEGER(IntKi), PARAMETER :: M56N4FKxe = 499 + INTEGER(IntKi), PARAMETER :: M56N5FKxe = 500 + INTEGER(IntKi), PARAMETER :: M56N6FKxe = 501 + INTEGER(IntKi), PARAMETER :: M56N7FKxe = 502 + INTEGER(IntKi), PARAMETER :: M56N8FKxe = 503 + INTEGER(IntKi), PARAMETER :: M56N9FKxe = 504 + INTEGER(IntKi), PARAMETER :: M57N1FKxe = 505 + INTEGER(IntKi), PARAMETER :: M57N2FKxe = 506 + INTEGER(IntKi), PARAMETER :: M57N3FKxe = 507 + INTEGER(IntKi), PARAMETER :: M57N4FKxe = 508 + INTEGER(IntKi), PARAMETER :: M57N5FKxe = 509 + INTEGER(IntKi), PARAMETER :: M57N6FKxe = 510 + INTEGER(IntKi), PARAMETER :: M57N7FKxe = 511 + INTEGER(IntKi), PARAMETER :: M57N8FKxe = 512 + INTEGER(IntKi), PARAMETER :: M57N9FKxe = 513 + INTEGER(IntKi), PARAMETER :: M58N1FKxe = 514 + INTEGER(IntKi), PARAMETER :: M58N2FKxe = 515 + INTEGER(IntKi), PARAMETER :: M58N3FKxe = 516 + INTEGER(IntKi), PARAMETER :: M58N4FKxe = 517 + INTEGER(IntKi), PARAMETER :: M58N5FKxe = 518 + INTEGER(IntKi), PARAMETER :: M58N6FKxe = 519 + INTEGER(IntKi), PARAMETER :: M58N7FKxe = 520 + INTEGER(IntKi), PARAMETER :: M58N8FKxe = 521 + INTEGER(IntKi), PARAMETER :: M58N9FKxe = 522 + INTEGER(IntKi), PARAMETER :: M59N1FKxe = 523 + INTEGER(IntKi), PARAMETER :: M59N2FKxe = 524 + INTEGER(IntKi), PARAMETER :: M59N3FKxe = 525 + INTEGER(IntKi), PARAMETER :: M59N4FKxe = 526 + INTEGER(IntKi), PARAMETER :: M59N5FKxe = 527 + INTEGER(IntKi), PARAMETER :: M59N6FKxe = 528 + INTEGER(IntKi), PARAMETER :: M59N7FKxe = 529 + INTEGER(IntKi), PARAMETER :: M59N8FKxe = 530 + INTEGER(IntKi), PARAMETER :: M59N9FKxe = 531 + INTEGER(IntKi), PARAMETER :: M60N1FKxe = 532 + INTEGER(IntKi), PARAMETER :: M60N2FKxe = 533 + INTEGER(IntKi), PARAMETER :: M60N3FKxe = 534 + INTEGER(IntKi), PARAMETER :: M60N4FKxe = 535 + INTEGER(IntKi), PARAMETER :: M60N5FKxe = 536 + INTEGER(IntKi), PARAMETER :: M60N6FKxe = 537 + INTEGER(IntKi), PARAMETER :: M60N7FKxe = 538 + INTEGER(IntKi), PARAMETER :: M60N8FKxe = 539 + INTEGER(IntKi), PARAMETER :: M60N9FKxe = 540 + INTEGER(IntKi), PARAMETER :: M61N1FKxe = 541 + INTEGER(IntKi), PARAMETER :: M61N2FKxe = 542 + INTEGER(IntKi), PARAMETER :: M61N3FKxe = 543 + INTEGER(IntKi), PARAMETER :: M61N4FKxe = 544 + INTEGER(IntKi), PARAMETER :: M61N5FKxe = 545 + INTEGER(IntKi), PARAMETER :: M61N6FKxe = 546 + INTEGER(IntKi), PARAMETER :: M61N7FKxe = 547 + INTEGER(IntKi), PARAMETER :: M61N8FKxe = 548 + INTEGER(IntKi), PARAMETER :: M61N9FKxe = 549 + INTEGER(IntKi), PARAMETER :: M62N1FKxe = 550 + INTEGER(IntKi), PARAMETER :: M62N2FKxe = 551 + INTEGER(IntKi), PARAMETER :: M62N3FKxe = 552 + INTEGER(IntKi), PARAMETER :: M62N4FKxe = 553 + INTEGER(IntKi), PARAMETER :: M62N5FKxe = 554 + INTEGER(IntKi), PARAMETER :: M62N6FKxe = 555 + INTEGER(IntKi), PARAMETER :: M62N7FKxe = 556 + INTEGER(IntKi), PARAMETER :: M62N8FKxe = 557 + INTEGER(IntKi), PARAMETER :: M62N9FKxe = 558 + INTEGER(IntKi), PARAMETER :: M63N1FKxe = 559 + INTEGER(IntKi), PARAMETER :: M63N2FKxe = 560 + INTEGER(IntKi), PARAMETER :: M63N3FKxe = 561 + INTEGER(IntKi), PARAMETER :: M63N4FKxe = 562 + INTEGER(IntKi), PARAMETER :: M63N5FKxe = 563 + INTEGER(IntKi), PARAMETER :: M63N6FKxe = 564 + INTEGER(IntKi), PARAMETER :: M63N7FKxe = 565 + INTEGER(IntKi), PARAMETER :: M63N8FKxe = 566 + INTEGER(IntKi), PARAMETER :: M63N9FKxe = 567 + INTEGER(IntKi), PARAMETER :: M64N1FKxe = 568 + INTEGER(IntKi), PARAMETER :: M64N2FKxe = 569 + INTEGER(IntKi), PARAMETER :: M64N3FKxe = 570 + INTEGER(IntKi), PARAMETER :: M64N4FKxe = 571 + INTEGER(IntKi), PARAMETER :: M64N5FKxe = 572 + INTEGER(IntKi), PARAMETER :: M64N6FKxe = 573 + INTEGER(IntKi), PARAMETER :: M64N7FKxe = 574 + INTEGER(IntKi), PARAMETER :: M64N8FKxe = 575 + INTEGER(IntKi), PARAMETER :: M64N9FKxe = 576 + INTEGER(IntKi), PARAMETER :: M65N1FKxe = 577 + INTEGER(IntKi), PARAMETER :: M65N2FKxe = 578 + INTEGER(IntKi), PARAMETER :: M65N3FKxe = 579 + INTEGER(IntKi), PARAMETER :: M65N4FKxe = 580 + INTEGER(IntKi), PARAMETER :: M65N5FKxe = 581 + INTEGER(IntKi), PARAMETER :: M65N6FKxe = 582 + INTEGER(IntKi), PARAMETER :: M65N7FKxe = 583 + INTEGER(IntKi), PARAMETER :: M65N8FKxe = 584 + INTEGER(IntKi), PARAMETER :: M65N9FKxe = 585 + INTEGER(IntKi), PARAMETER :: M66N1FKxe = 586 + INTEGER(IntKi), PARAMETER :: M66N2FKxe = 587 + INTEGER(IntKi), PARAMETER :: M66N3FKxe = 588 + INTEGER(IntKi), PARAMETER :: M66N4FKxe = 589 + INTEGER(IntKi), PARAMETER :: M66N5FKxe = 590 + INTEGER(IntKi), PARAMETER :: M66N6FKxe = 591 + INTEGER(IntKi), PARAMETER :: M66N7FKxe = 592 + INTEGER(IntKi), PARAMETER :: M66N8FKxe = 593 + INTEGER(IntKi), PARAMETER :: M66N9FKxe = 594 + INTEGER(IntKi), PARAMETER :: M67N1FKxe = 595 + INTEGER(IntKi), PARAMETER :: M67N2FKxe = 596 + INTEGER(IntKi), PARAMETER :: M67N3FKxe = 597 + INTEGER(IntKi), PARAMETER :: M67N4FKxe = 598 + INTEGER(IntKi), PARAMETER :: M67N5FKxe = 599 + INTEGER(IntKi), PARAMETER :: M67N6FKxe = 600 + INTEGER(IntKi), PARAMETER :: M67N7FKxe = 601 + INTEGER(IntKi), PARAMETER :: M67N8FKxe = 602 + INTEGER(IntKi), PARAMETER :: M67N9FKxe = 603 + INTEGER(IntKi), PARAMETER :: M68N1FKxe = 604 + INTEGER(IntKi), PARAMETER :: M68N2FKxe = 605 + INTEGER(IntKi), PARAMETER :: M68N3FKxe = 606 + INTEGER(IntKi), PARAMETER :: M68N4FKxe = 607 + INTEGER(IntKi), PARAMETER :: M68N5FKxe = 608 + INTEGER(IntKi), PARAMETER :: M68N6FKxe = 609 + INTEGER(IntKi), PARAMETER :: M68N7FKxe = 610 + INTEGER(IntKi), PARAMETER :: M68N8FKxe = 611 + INTEGER(IntKi), PARAMETER :: M68N9FKxe = 612 + INTEGER(IntKi), PARAMETER :: M69N1FKxe = 613 + INTEGER(IntKi), PARAMETER :: M69N2FKxe = 614 + INTEGER(IntKi), PARAMETER :: M69N3FKxe = 615 + INTEGER(IntKi), PARAMETER :: M69N4FKxe = 616 + INTEGER(IntKi), PARAMETER :: M69N5FKxe = 617 + INTEGER(IntKi), PARAMETER :: M69N6FKxe = 618 + INTEGER(IntKi), PARAMETER :: M69N7FKxe = 619 + INTEGER(IntKi), PARAMETER :: M69N8FKxe = 620 + INTEGER(IntKi), PARAMETER :: M69N9FKxe = 621 + INTEGER(IntKi), PARAMETER :: M70N1FKxe = 622 + INTEGER(IntKi), PARAMETER :: M70N2FKxe = 623 + INTEGER(IntKi), PARAMETER :: M70N3FKxe = 624 + INTEGER(IntKi), PARAMETER :: M70N4FKxe = 625 + INTEGER(IntKi), PARAMETER :: M70N5FKxe = 626 + INTEGER(IntKi), PARAMETER :: M70N6FKxe = 627 + INTEGER(IntKi), PARAMETER :: M70N7FKxe = 628 + INTEGER(IntKi), PARAMETER :: M70N8FKxe = 629 + INTEGER(IntKi), PARAMETER :: M70N9FKxe = 630 + INTEGER(IntKi), PARAMETER :: M71N1FKxe = 631 + INTEGER(IntKi), PARAMETER :: M71N2FKxe = 632 + INTEGER(IntKi), PARAMETER :: M71N3FKxe = 633 + INTEGER(IntKi), PARAMETER :: M71N4FKxe = 634 + INTEGER(IntKi), PARAMETER :: M71N5FKxe = 635 + INTEGER(IntKi), PARAMETER :: M71N6FKxe = 636 + INTEGER(IntKi), PARAMETER :: M71N7FKxe = 637 + INTEGER(IntKi), PARAMETER :: M71N8FKxe = 638 + INTEGER(IntKi), PARAMETER :: M71N9FKxe = 639 + INTEGER(IntKi), PARAMETER :: M72N1FKxe = 640 + INTEGER(IntKi), PARAMETER :: M72N2FKxe = 641 + INTEGER(IntKi), PARAMETER :: M72N3FKxe = 642 + INTEGER(IntKi), PARAMETER :: M72N4FKxe = 643 + INTEGER(IntKi), PARAMETER :: M72N5FKxe = 644 + INTEGER(IntKi), PARAMETER :: M72N6FKxe = 645 + INTEGER(IntKi), PARAMETER :: M72N7FKxe = 646 + INTEGER(IntKi), PARAMETER :: M72N8FKxe = 647 + INTEGER(IntKi), PARAMETER :: M72N9FKxe = 648 + INTEGER(IntKi), PARAMETER :: M73N1FKxe = 649 + INTEGER(IntKi), PARAMETER :: M73N2FKxe = 650 + INTEGER(IntKi), PARAMETER :: M73N3FKxe = 651 + INTEGER(IntKi), PARAMETER :: M73N4FKxe = 652 + INTEGER(IntKi), PARAMETER :: M73N5FKxe = 653 + INTEGER(IntKi), PARAMETER :: M73N6FKxe = 654 + INTEGER(IntKi), PARAMETER :: M73N7FKxe = 655 + INTEGER(IntKi), PARAMETER :: M73N8FKxe = 656 + INTEGER(IntKi), PARAMETER :: M73N9FKxe = 657 + INTEGER(IntKi), PARAMETER :: M74N1FKxe = 658 + INTEGER(IntKi), PARAMETER :: M74N2FKxe = 659 + INTEGER(IntKi), PARAMETER :: M74N3FKxe = 660 + INTEGER(IntKi), PARAMETER :: M74N4FKxe = 661 + INTEGER(IntKi), PARAMETER :: M74N5FKxe = 662 + INTEGER(IntKi), PARAMETER :: M74N6FKxe = 663 + INTEGER(IntKi), PARAMETER :: M74N7FKxe = 664 + INTEGER(IntKi), PARAMETER :: M74N8FKxe = 665 + INTEGER(IntKi), PARAMETER :: M74N9FKxe = 666 + INTEGER(IntKi), PARAMETER :: M75N1FKxe = 667 + INTEGER(IntKi), PARAMETER :: M75N2FKxe = 668 + INTEGER(IntKi), PARAMETER :: M75N3FKxe = 669 + INTEGER(IntKi), PARAMETER :: M75N4FKxe = 670 + INTEGER(IntKi), PARAMETER :: M75N5FKxe = 671 + INTEGER(IntKi), PARAMETER :: M75N6FKxe = 672 + INTEGER(IntKi), PARAMETER :: M75N7FKxe = 673 + INTEGER(IntKi), PARAMETER :: M75N8FKxe = 674 + INTEGER(IntKi), PARAMETER :: M75N9FKxe = 675 + INTEGER(IntKi), PARAMETER :: M76N1FKxe = 676 + INTEGER(IntKi), PARAMETER :: M76N2FKxe = 677 + INTEGER(IntKi), PARAMETER :: M76N3FKxe = 678 + INTEGER(IntKi), PARAMETER :: M76N4FKxe = 679 + INTEGER(IntKi), PARAMETER :: M76N5FKxe = 680 + INTEGER(IntKi), PARAMETER :: M76N6FKxe = 681 + INTEGER(IntKi), PARAMETER :: M76N7FKxe = 682 + INTEGER(IntKi), PARAMETER :: M76N8FKxe = 683 + INTEGER(IntKi), PARAMETER :: M76N9FKxe = 684 + INTEGER(IntKi), PARAMETER :: M77N1FKxe = 685 + INTEGER(IntKi), PARAMETER :: M77N2FKxe = 686 + INTEGER(IntKi), PARAMETER :: M77N3FKxe = 687 + INTEGER(IntKi), PARAMETER :: M77N4FKxe = 688 + INTEGER(IntKi), PARAMETER :: M77N5FKxe = 689 + INTEGER(IntKi), PARAMETER :: M77N6FKxe = 690 + INTEGER(IntKi), PARAMETER :: M77N7FKxe = 691 + INTEGER(IntKi), PARAMETER :: M77N8FKxe = 692 + INTEGER(IntKi), PARAMETER :: M77N9FKxe = 693 + INTEGER(IntKi), PARAMETER :: M78N1FKxe = 694 + INTEGER(IntKi), PARAMETER :: M78N2FKxe = 695 + INTEGER(IntKi), PARAMETER :: M78N3FKxe = 696 + INTEGER(IntKi), PARAMETER :: M78N4FKxe = 697 + INTEGER(IntKi), PARAMETER :: M78N5FKxe = 698 + INTEGER(IntKi), PARAMETER :: M78N6FKxe = 699 + INTEGER(IntKi), PARAMETER :: M78N7FKxe = 700 + INTEGER(IntKi), PARAMETER :: M78N8FKxe = 701 + INTEGER(IntKi), PARAMETER :: M78N9FKxe = 702 + INTEGER(IntKi), PARAMETER :: M79N1FKxe = 703 + INTEGER(IntKi), PARAMETER :: M79N2FKxe = 704 + INTEGER(IntKi), PARAMETER :: M79N3FKxe = 705 + INTEGER(IntKi), PARAMETER :: M79N4FKxe = 706 + INTEGER(IntKi), PARAMETER :: M79N5FKxe = 707 + INTEGER(IntKi), PARAMETER :: M79N6FKxe = 708 + INTEGER(IntKi), PARAMETER :: M79N7FKxe = 709 + INTEGER(IntKi), PARAMETER :: M79N8FKxe = 710 + INTEGER(IntKi), PARAMETER :: M79N9FKxe = 711 + INTEGER(IntKi), PARAMETER :: M80N1FKxe = 712 + INTEGER(IntKi), PARAMETER :: M80N2FKxe = 713 + INTEGER(IntKi), PARAMETER :: M80N3FKxe = 714 + INTEGER(IntKi), PARAMETER :: M80N4FKxe = 715 + INTEGER(IntKi), PARAMETER :: M80N5FKxe = 716 + INTEGER(IntKi), PARAMETER :: M80N6FKxe = 717 + INTEGER(IntKi), PARAMETER :: M80N7FKxe = 718 + INTEGER(IntKi), PARAMETER :: M80N8FKxe = 719 + INTEGER(IntKi), PARAMETER :: M80N9FKxe = 720 + INTEGER(IntKi), PARAMETER :: M81N1FKxe = 721 + INTEGER(IntKi), PARAMETER :: M81N2FKxe = 722 + INTEGER(IntKi), PARAMETER :: M81N3FKxe = 723 + INTEGER(IntKi), PARAMETER :: M81N4FKxe = 724 + INTEGER(IntKi), PARAMETER :: M81N5FKxe = 725 + INTEGER(IntKi), PARAMETER :: M81N6FKxe = 726 + INTEGER(IntKi), PARAMETER :: M81N7FKxe = 727 + INTEGER(IntKi), PARAMETER :: M81N8FKxe = 728 + INTEGER(IntKi), PARAMETER :: M81N9FKxe = 729 + INTEGER(IntKi), PARAMETER :: M82N1FKxe = 730 + INTEGER(IntKi), PARAMETER :: M82N2FKxe = 731 + INTEGER(IntKi), PARAMETER :: M82N3FKxe = 732 + INTEGER(IntKi), PARAMETER :: M82N4FKxe = 733 + INTEGER(IntKi), PARAMETER :: M82N5FKxe = 734 + INTEGER(IntKi), PARAMETER :: M82N6FKxe = 735 + INTEGER(IntKi), PARAMETER :: M82N7FKxe = 736 + INTEGER(IntKi), PARAMETER :: M82N8FKxe = 737 + INTEGER(IntKi), PARAMETER :: M82N9FKxe = 738 + INTEGER(IntKi), PARAMETER :: M83N1FKxe = 739 + INTEGER(IntKi), PARAMETER :: M83N2FKxe = 740 + INTEGER(IntKi), PARAMETER :: M83N3FKxe = 741 + INTEGER(IntKi), PARAMETER :: M83N4FKxe = 742 + INTEGER(IntKi), PARAMETER :: M83N5FKxe = 743 + INTEGER(IntKi), PARAMETER :: M83N6FKxe = 744 + INTEGER(IntKi), PARAMETER :: M83N7FKxe = 745 + INTEGER(IntKi), PARAMETER :: M83N8FKxe = 746 + INTEGER(IntKi), PARAMETER :: M83N9FKxe = 747 + INTEGER(IntKi), PARAMETER :: M84N1FKxe = 748 + INTEGER(IntKi), PARAMETER :: M84N2FKxe = 749 + INTEGER(IntKi), PARAMETER :: M84N3FKxe = 750 + INTEGER(IntKi), PARAMETER :: M84N4FKxe = 751 + INTEGER(IntKi), PARAMETER :: M84N5FKxe = 752 + INTEGER(IntKi), PARAMETER :: M84N6FKxe = 753 + INTEGER(IntKi), PARAMETER :: M84N7FKxe = 754 + INTEGER(IntKi), PARAMETER :: M84N8FKxe = 755 + INTEGER(IntKi), PARAMETER :: M84N9FKxe = 756 + INTEGER(IntKi), PARAMETER :: M85N1FKxe = 757 + INTEGER(IntKi), PARAMETER :: M85N2FKxe = 758 + INTEGER(IntKi), PARAMETER :: M85N3FKxe = 759 + INTEGER(IntKi), PARAMETER :: M85N4FKxe = 760 + INTEGER(IntKi), PARAMETER :: M85N5FKxe = 761 + INTEGER(IntKi), PARAMETER :: M85N6FKxe = 762 + INTEGER(IntKi), PARAMETER :: M85N7FKxe = 763 + INTEGER(IntKi), PARAMETER :: M85N8FKxe = 764 + INTEGER(IntKi), PARAMETER :: M85N9FKxe = 765 + INTEGER(IntKi), PARAMETER :: M86N1FKxe = 766 + INTEGER(IntKi), PARAMETER :: M86N2FKxe = 767 + INTEGER(IntKi), PARAMETER :: M86N3FKxe = 768 + INTEGER(IntKi), PARAMETER :: M86N4FKxe = 769 + INTEGER(IntKi), PARAMETER :: M86N5FKxe = 770 + INTEGER(IntKi), PARAMETER :: M86N6FKxe = 771 + INTEGER(IntKi), PARAMETER :: M86N7FKxe = 772 + INTEGER(IntKi), PARAMETER :: M86N8FKxe = 773 + INTEGER(IntKi), PARAMETER :: M86N9FKxe = 774 + INTEGER(IntKi), PARAMETER :: M87N1FKxe = 775 + INTEGER(IntKi), PARAMETER :: M87N2FKxe = 776 + INTEGER(IntKi), PARAMETER :: M87N3FKxe = 777 + INTEGER(IntKi), PARAMETER :: M87N4FKxe = 778 + INTEGER(IntKi), PARAMETER :: M87N5FKxe = 779 + INTEGER(IntKi), PARAMETER :: M87N6FKxe = 780 + INTEGER(IntKi), PARAMETER :: M87N7FKxe = 781 + INTEGER(IntKi), PARAMETER :: M87N8FKxe = 782 + INTEGER(IntKi), PARAMETER :: M87N9FKxe = 783 + INTEGER(IntKi), PARAMETER :: M88N1FKxe = 784 + INTEGER(IntKi), PARAMETER :: M88N2FKxe = 785 + INTEGER(IntKi), PARAMETER :: M88N3FKxe = 786 + INTEGER(IntKi), PARAMETER :: M88N4FKxe = 787 + INTEGER(IntKi), PARAMETER :: M88N5FKxe = 788 + INTEGER(IntKi), PARAMETER :: M88N6FKxe = 789 + INTEGER(IntKi), PARAMETER :: M88N7FKxe = 790 + INTEGER(IntKi), PARAMETER :: M88N8FKxe = 791 + INTEGER(IntKi), PARAMETER :: M88N9FKxe = 792 + INTEGER(IntKi), PARAMETER :: M89N1FKxe = 793 + INTEGER(IntKi), PARAMETER :: M89N2FKxe = 794 + INTEGER(IntKi), PARAMETER :: M89N3FKxe = 795 + INTEGER(IntKi), PARAMETER :: M89N4FKxe = 796 + INTEGER(IntKi), PARAMETER :: M89N5FKxe = 797 + INTEGER(IntKi), PARAMETER :: M89N6FKxe = 798 + INTEGER(IntKi), PARAMETER :: M89N7FKxe = 799 + INTEGER(IntKi), PARAMETER :: M89N8FKxe = 800 + INTEGER(IntKi), PARAMETER :: M89N9FKxe = 801 + INTEGER(IntKi), PARAMETER :: M90N1FKxe = 802 + INTEGER(IntKi), PARAMETER :: M90N2FKxe = 803 + INTEGER(IntKi), PARAMETER :: M90N3FKxe = 804 + INTEGER(IntKi), PARAMETER :: M90N4FKxe = 805 + INTEGER(IntKi), PARAMETER :: M90N5FKxe = 806 + INTEGER(IntKi), PARAMETER :: M90N6FKxe = 807 + INTEGER(IntKi), PARAMETER :: M90N7FKxe = 808 + INTEGER(IntKi), PARAMETER :: M90N8FKxe = 809 + INTEGER(IntKi), PARAMETER :: M90N9FKxe = 810 + INTEGER(IntKi), PARAMETER :: M91N1FKxe = 811 + INTEGER(IntKi), PARAMETER :: M91N2FKxe = 812 + INTEGER(IntKi), PARAMETER :: M91N3FKxe = 813 + INTEGER(IntKi), PARAMETER :: M91N4FKxe = 814 + INTEGER(IntKi), PARAMETER :: M91N5FKxe = 815 + INTEGER(IntKi), PARAMETER :: M91N6FKxe = 816 + INTEGER(IntKi), PARAMETER :: M91N7FKxe = 817 + INTEGER(IntKi), PARAMETER :: M91N8FKxe = 818 + INTEGER(IntKi), PARAMETER :: M91N9FKxe = 819 + INTEGER(IntKi), PARAMETER :: M92N1FKxe = 820 + INTEGER(IntKi), PARAMETER :: M92N2FKxe = 821 + INTEGER(IntKi), PARAMETER :: M92N3FKxe = 822 + INTEGER(IntKi), PARAMETER :: M92N4FKxe = 823 + INTEGER(IntKi), PARAMETER :: M92N5FKxe = 824 + INTEGER(IntKi), PARAMETER :: M92N6FKxe = 825 + INTEGER(IntKi), PARAMETER :: M92N7FKxe = 826 + INTEGER(IntKi), PARAMETER :: M92N8FKxe = 827 + INTEGER(IntKi), PARAMETER :: M92N9FKxe = 828 + INTEGER(IntKi), PARAMETER :: M93N1FKxe = 829 + INTEGER(IntKi), PARAMETER :: M93N2FKxe = 830 + INTEGER(IntKi), PARAMETER :: M93N3FKxe = 831 + INTEGER(IntKi), PARAMETER :: M93N4FKxe = 832 + INTEGER(IntKi), PARAMETER :: M93N5FKxe = 833 + INTEGER(IntKi), PARAMETER :: M93N6FKxe = 834 + INTEGER(IntKi), PARAMETER :: M93N7FKxe = 835 + INTEGER(IntKi), PARAMETER :: M93N8FKxe = 836 + INTEGER(IntKi), PARAMETER :: M93N9FKxe = 837 + INTEGER(IntKi), PARAMETER :: M94N1FKxe = 838 + INTEGER(IntKi), PARAMETER :: M94N2FKxe = 839 + INTEGER(IntKi), PARAMETER :: M94N3FKxe = 840 + INTEGER(IntKi), PARAMETER :: M94N4FKxe = 841 + INTEGER(IntKi), PARAMETER :: M94N5FKxe = 842 + INTEGER(IntKi), PARAMETER :: M94N6FKxe = 843 + INTEGER(IntKi), PARAMETER :: M94N7FKxe = 844 + INTEGER(IntKi), PARAMETER :: M94N8FKxe = 845 + INTEGER(IntKi), PARAMETER :: M94N9FKxe = 846 + INTEGER(IntKi), PARAMETER :: M95N1FKxe = 847 + INTEGER(IntKi), PARAMETER :: M95N2FKxe = 848 + INTEGER(IntKi), PARAMETER :: M95N3FKxe = 849 + INTEGER(IntKi), PARAMETER :: M95N4FKxe = 850 + INTEGER(IntKi), PARAMETER :: M95N5FKxe = 851 + INTEGER(IntKi), PARAMETER :: M95N6FKxe = 852 + INTEGER(IntKi), PARAMETER :: M95N7FKxe = 853 + INTEGER(IntKi), PARAMETER :: M95N8FKxe = 854 + INTEGER(IntKi), PARAMETER :: M95N9FKxe = 855 + INTEGER(IntKi), PARAMETER :: M96N1FKxe = 856 + INTEGER(IntKi), PARAMETER :: M96N2FKxe = 857 + INTEGER(IntKi), PARAMETER :: M96N3FKxe = 858 + INTEGER(IntKi), PARAMETER :: M96N4FKxe = 859 + INTEGER(IntKi), PARAMETER :: M96N5FKxe = 860 + INTEGER(IntKi), PARAMETER :: M96N6FKxe = 861 + INTEGER(IntKi), PARAMETER :: M96N7FKxe = 862 + INTEGER(IntKi), PARAMETER :: M96N8FKxe = 863 + INTEGER(IntKi), PARAMETER :: M96N9FKxe = 864 + INTEGER(IntKi), PARAMETER :: M97N1FKxe = 865 + INTEGER(IntKi), PARAMETER :: M97N2FKxe = 866 + INTEGER(IntKi), PARAMETER :: M97N3FKxe = 867 + INTEGER(IntKi), PARAMETER :: M97N4FKxe = 868 + INTEGER(IntKi), PARAMETER :: M97N5FKxe = 869 + INTEGER(IntKi), PARAMETER :: M97N6FKxe = 870 + INTEGER(IntKi), PARAMETER :: M97N7FKxe = 871 + INTEGER(IntKi), PARAMETER :: M97N8FKxe = 872 + INTEGER(IntKi), PARAMETER :: M97N9FKxe = 873 + INTEGER(IntKi), PARAMETER :: M98N1FKxe = 874 + INTEGER(IntKi), PARAMETER :: M98N2FKxe = 875 + INTEGER(IntKi), PARAMETER :: M98N3FKxe = 876 + INTEGER(IntKi), PARAMETER :: M98N4FKxe = 877 + INTEGER(IntKi), PARAMETER :: M98N5FKxe = 878 + INTEGER(IntKi), PARAMETER :: M98N6FKxe = 879 + INTEGER(IntKi), PARAMETER :: M98N7FKxe = 880 + INTEGER(IntKi), PARAMETER :: M98N8FKxe = 881 + INTEGER(IntKi), PARAMETER :: M98N9FKxe = 882 + INTEGER(IntKi), PARAMETER :: M99N1FKxe = 883 + INTEGER(IntKi), PARAMETER :: M99N2FKxe = 884 + INTEGER(IntKi), PARAMETER :: M99N3FKxe = 885 + INTEGER(IntKi), PARAMETER :: M99N4FKxe = 886 + INTEGER(IntKi), PARAMETER :: M99N5FKxe = 887 + INTEGER(IntKi), PARAMETER :: M99N6FKxe = 888 + INTEGER(IntKi), PARAMETER :: M99N7FKxe = 889 + INTEGER(IntKi), PARAMETER :: M99N8FKxe = 890 + INTEGER(IntKi), PARAMETER :: M99N9FKxe = 891 + INTEGER(IntKi), PARAMETER :: M01N1FKye = 892 + INTEGER(IntKi), PARAMETER :: M01N2FKye = 893 + INTEGER(IntKi), PARAMETER :: M01N3FKye = 894 + INTEGER(IntKi), PARAMETER :: M01N4FKye = 895 + INTEGER(IntKi), PARAMETER :: M01N5FKye = 896 + INTEGER(IntKi), PARAMETER :: M01N6FKye = 897 + INTEGER(IntKi), PARAMETER :: M01N7FKye = 898 + INTEGER(IntKi), PARAMETER :: M01N8FKye = 899 + INTEGER(IntKi), PARAMETER :: M01N9FKye = 900 + INTEGER(IntKi), PARAMETER :: M02N1FKye = 901 + INTEGER(IntKi), PARAMETER :: M02N2FKye = 902 + INTEGER(IntKi), PARAMETER :: M02N3FKye = 903 + INTEGER(IntKi), PARAMETER :: M02N4FKye = 904 + INTEGER(IntKi), PARAMETER :: M02N5FKye = 905 + INTEGER(IntKi), PARAMETER :: M02N6FKye = 906 + INTEGER(IntKi), PARAMETER :: M02N7FKye = 907 + INTEGER(IntKi), PARAMETER :: M02N8FKye = 908 + INTEGER(IntKi), PARAMETER :: M02N9FKye = 909 + INTEGER(IntKi), PARAMETER :: M03N1FKye = 910 + INTEGER(IntKi), PARAMETER :: M03N2FKye = 911 + INTEGER(IntKi), PARAMETER :: M03N3FKye = 912 + INTEGER(IntKi), PARAMETER :: M03N4FKye = 913 + INTEGER(IntKi), PARAMETER :: M03N5FKye = 914 + INTEGER(IntKi), PARAMETER :: M03N6FKye = 915 + INTEGER(IntKi), PARAMETER :: M03N7FKye = 916 + INTEGER(IntKi), PARAMETER :: M03N8FKye = 917 + INTEGER(IntKi), PARAMETER :: M03N9FKye = 918 + INTEGER(IntKi), PARAMETER :: M04N1FKye = 919 + INTEGER(IntKi), PARAMETER :: M04N2FKye = 920 + INTEGER(IntKi), PARAMETER :: M04N3FKye = 921 + INTEGER(IntKi), PARAMETER :: M04N4FKye = 922 + INTEGER(IntKi), PARAMETER :: M04N5FKye = 923 + INTEGER(IntKi), PARAMETER :: M04N6FKye = 924 + INTEGER(IntKi), PARAMETER :: M04N7FKye = 925 + INTEGER(IntKi), PARAMETER :: M04N8FKye = 926 + INTEGER(IntKi), PARAMETER :: M04N9FKye = 927 + INTEGER(IntKi), PARAMETER :: M05N1FKye = 928 + INTEGER(IntKi), PARAMETER :: M05N2FKye = 929 + INTEGER(IntKi), PARAMETER :: M05N3FKye = 930 + INTEGER(IntKi), PARAMETER :: M05N4FKye = 931 + INTEGER(IntKi), PARAMETER :: M05N5FKye = 932 + INTEGER(IntKi), PARAMETER :: M05N6FKye = 933 + INTEGER(IntKi), PARAMETER :: M05N7FKye = 934 + INTEGER(IntKi), PARAMETER :: M05N8FKye = 935 + INTEGER(IntKi), PARAMETER :: M05N9FKye = 936 + INTEGER(IntKi), PARAMETER :: M06N1FKye = 937 + INTEGER(IntKi), PARAMETER :: M06N2FKye = 938 + INTEGER(IntKi), PARAMETER :: M06N3FKye = 939 + INTEGER(IntKi), PARAMETER :: M06N4FKye = 940 + INTEGER(IntKi), PARAMETER :: M06N5FKye = 941 + INTEGER(IntKi), PARAMETER :: M06N6FKye = 942 + INTEGER(IntKi), PARAMETER :: M06N7FKye = 943 + INTEGER(IntKi), PARAMETER :: M06N8FKye = 944 + INTEGER(IntKi), PARAMETER :: M06N9FKye = 945 + INTEGER(IntKi), PARAMETER :: M07N1FKye = 946 + INTEGER(IntKi), PARAMETER :: M07N2FKye = 947 + INTEGER(IntKi), PARAMETER :: M07N3FKye = 948 + INTEGER(IntKi), PARAMETER :: M07N4FKye = 949 + INTEGER(IntKi), PARAMETER :: M07N5FKye = 950 + INTEGER(IntKi), PARAMETER :: M07N6FKye = 951 + INTEGER(IntKi), PARAMETER :: M07N7FKye = 952 + INTEGER(IntKi), PARAMETER :: M07N8FKye = 953 + INTEGER(IntKi), PARAMETER :: M07N9FKye = 954 + INTEGER(IntKi), PARAMETER :: M08N1FKye = 955 + INTEGER(IntKi), PARAMETER :: M08N2FKye = 956 + INTEGER(IntKi), PARAMETER :: M08N3FKye = 957 + INTEGER(IntKi), PARAMETER :: M08N4FKye = 958 + INTEGER(IntKi), PARAMETER :: M08N5FKye = 959 + INTEGER(IntKi), PARAMETER :: M08N6FKye = 960 + INTEGER(IntKi), PARAMETER :: M08N7FKye = 961 + INTEGER(IntKi), PARAMETER :: M08N8FKye = 962 + INTEGER(IntKi), PARAMETER :: M08N9FKye = 963 + INTEGER(IntKi), PARAMETER :: M09N1FKye = 964 + INTEGER(IntKi), PARAMETER :: M09N2FKye = 965 + INTEGER(IntKi), PARAMETER :: M09N3FKye = 966 + INTEGER(IntKi), PARAMETER :: M09N4FKye = 967 + INTEGER(IntKi), PARAMETER :: M09N5FKye = 968 + INTEGER(IntKi), PARAMETER :: M09N6FKye = 969 + INTEGER(IntKi), PARAMETER :: M09N7FKye = 970 + INTEGER(IntKi), PARAMETER :: M09N8FKye = 971 + INTEGER(IntKi), PARAMETER :: M09N9FKye = 972 + INTEGER(IntKi), PARAMETER :: M10N1FKye = 973 + INTEGER(IntKi), PARAMETER :: M10N2FKye = 974 + INTEGER(IntKi), PARAMETER :: M10N3FKye = 975 + INTEGER(IntKi), PARAMETER :: M10N4FKye = 976 + INTEGER(IntKi), PARAMETER :: M10N5FKye = 977 + INTEGER(IntKi), PARAMETER :: M10N6FKye = 978 + INTEGER(IntKi), PARAMETER :: M10N7FKye = 979 + INTEGER(IntKi), PARAMETER :: M10N8FKye = 980 + INTEGER(IntKi), PARAMETER :: M10N9FKye = 981 + INTEGER(IntKi), PARAMETER :: M11N1FKye = 982 + INTEGER(IntKi), PARAMETER :: M11N2FKye = 983 + INTEGER(IntKi), PARAMETER :: M11N3FKye = 984 + INTEGER(IntKi), PARAMETER :: M11N4FKye = 985 + INTEGER(IntKi), PARAMETER :: M11N5FKye = 986 + INTEGER(IntKi), PARAMETER :: M11N6FKye = 987 + INTEGER(IntKi), PARAMETER :: M11N7FKye = 988 + INTEGER(IntKi), PARAMETER :: M11N8FKye = 989 + INTEGER(IntKi), PARAMETER :: M11N9FKye = 990 + INTEGER(IntKi), PARAMETER :: M12N1FKye = 991 + INTEGER(IntKi), PARAMETER :: M12N2FKye = 992 + INTEGER(IntKi), PARAMETER :: M12N3FKye = 993 + INTEGER(IntKi), PARAMETER :: M12N4FKye = 994 + INTEGER(IntKi), PARAMETER :: M12N5FKye = 995 + INTEGER(IntKi), PARAMETER :: M12N6FKye = 996 + INTEGER(IntKi), PARAMETER :: M12N7FKye = 997 + INTEGER(IntKi), PARAMETER :: M12N8FKye = 998 + INTEGER(IntKi), PARAMETER :: M12N9FKye = 999 + INTEGER(IntKi), PARAMETER :: M13N1FKye = 1000 + INTEGER(IntKi), PARAMETER :: M13N2FKye = 1001 + INTEGER(IntKi), PARAMETER :: M13N3FKye = 1002 + INTEGER(IntKi), PARAMETER :: M13N4FKye = 1003 + INTEGER(IntKi), PARAMETER :: M13N5FKye = 1004 + INTEGER(IntKi), PARAMETER :: M13N6FKye = 1005 + INTEGER(IntKi), PARAMETER :: M13N7FKye = 1006 + INTEGER(IntKi), PARAMETER :: M13N8FKye = 1007 + INTEGER(IntKi), PARAMETER :: M13N9FKye = 1008 + INTEGER(IntKi), PARAMETER :: M14N1FKye = 1009 + INTEGER(IntKi), PARAMETER :: M14N2FKye = 1010 + INTEGER(IntKi), PARAMETER :: M14N3FKye = 1011 + INTEGER(IntKi), PARAMETER :: M14N4FKye = 1012 + INTEGER(IntKi), PARAMETER :: M14N5FKye = 1013 + INTEGER(IntKi), PARAMETER :: M14N6FKye = 1014 + INTEGER(IntKi), PARAMETER :: M14N7FKye = 1015 + INTEGER(IntKi), PARAMETER :: M14N8FKye = 1016 + INTEGER(IntKi), PARAMETER :: M14N9FKye = 1017 + INTEGER(IntKi), PARAMETER :: M15N1FKye = 1018 + INTEGER(IntKi), PARAMETER :: M15N2FKye = 1019 + INTEGER(IntKi), PARAMETER :: M15N3FKye = 1020 + INTEGER(IntKi), PARAMETER :: M15N4FKye = 1021 + INTEGER(IntKi), PARAMETER :: M15N5FKye = 1022 + INTEGER(IntKi), PARAMETER :: M15N6FKye = 1023 + INTEGER(IntKi), PARAMETER :: M15N7FKye = 1024 + INTEGER(IntKi), PARAMETER :: M15N8FKye = 1025 + INTEGER(IntKi), PARAMETER :: M15N9FKye = 1026 + INTEGER(IntKi), PARAMETER :: M16N1FKye = 1027 + INTEGER(IntKi), PARAMETER :: M16N2FKye = 1028 + INTEGER(IntKi), PARAMETER :: M16N3FKye = 1029 + INTEGER(IntKi), PARAMETER :: M16N4FKye = 1030 + INTEGER(IntKi), PARAMETER :: M16N5FKye = 1031 + INTEGER(IntKi), PARAMETER :: M16N6FKye = 1032 + INTEGER(IntKi), PARAMETER :: M16N7FKye = 1033 + INTEGER(IntKi), PARAMETER :: M16N8FKye = 1034 + INTEGER(IntKi), PARAMETER :: M16N9FKye = 1035 + INTEGER(IntKi), PARAMETER :: M17N1FKye = 1036 + INTEGER(IntKi), PARAMETER :: M17N2FKye = 1037 + INTEGER(IntKi), PARAMETER :: M17N3FKye = 1038 + INTEGER(IntKi), PARAMETER :: M17N4FKye = 1039 + INTEGER(IntKi), PARAMETER :: M17N5FKye = 1040 + INTEGER(IntKi), PARAMETER :: M17N6FKye = 1041 + INTEGER(IntKi), PARAMETER :: M17N7FKye = 1042 + INTEGER(IntKi), PARAMETER :: M17N8FKye = 1043 + INTEGER(IntKi), PARAMETER :: M17N9FKye = 1044 + INTEGER(IntKi), PARAMETER :: M18N1FKye = 1045 + INTEGER(IntKi), PARAMETER :: M18N2FKye = 1046 + INTEGER(IntKi), PARAMETER :: M18N3FKye = 1047 + INTEGER(IntKi), PARAMETER :: M18N4FKye = 1048 + INTEGER(IntKi), PARAMETER :: M18N5FKye = 1049 + INTEGER(IntKi), PARAMETER :: M18N6FKye = 1050 + INTEGER(IntKi), PARAMETER :: M18N7FKye = 1051 + INTEGER(IntKi), PARAMETER :: M18N8FKye = 1052 + INTEGER(IntKi), PARAMETER :: M18N9FKye = 1053 + INTEGER(IntKi), PARAMETER :: M19N1FKye = 1054 + INTEGER(IntKi), PARAMETER :: M19N2FKye = 1055 + INTEGER(IntKi), PARAMETER :: M19N3FKye = 1056 + INTEGER(IntKi), PARAMETER :: M19N4FKye = 1057 + INTEGER(IntKi), PARAMETER :: M19N5FKye = 1058 + INTEGER(IntKi), PARAMETER :: M19N6FKye = 1059 + INTEGER(IntKi), PARAMETER :: M19N7FKye = 1060 + INTEGER(IntKi), PARAMETER :: M19N8FKye = 1061 + INTEGER(IntKi), PARAMETER :: M19N9FKye = 1062 + INTEGER(IntKi), PARAMETER :: M20N1FKye = 1063 + INTEGER(IntKi), PARAMETER :: M20N2FKye = 1064 + INTEGER(IntKi), PARAMETER :: M20N3FKye = 1065 + INTEGER(IntKi), PARAMETER :: M20N4FKye = 1066 + INTEGER(IntKi), PARAMETER :: M20N5FKye = 1067 + INTEGER(IntKi), PARAMETER :: M20N6FKye = 1068 + INTEGER(IntKi), PARAMETER :: M20N7FKye = 1069 + INTEGER(IntKi), PARAMETER :: M20N8FKye = 1070 + INTEGER(IntKi), PARAMETER :: M20N9FKye = 1071 + INTEGER(IntKi), PARAMETER :: M21N1FKye = 1072 + INTEGER(IntKi), PARAMETER :: M21N2FKye = 1073 + INTEGER(IntKi), PARAMETER :: M21N3FKye = 1074 + INTEGER(IntKi), PARAMETER :: M21N4FKye = 1075 + INTEGER(IntKi), PARAMETER :: M21N5FKye = 1076 + INTEGER(IntKi), PARAMETER :: M21N6FKye = 1077 + INTEGER(IntKi), PARAMETER :: M21N7FKye = 1078 + INTEGER(IntKi), PARAMETER :: M21N8FKye = 1079 + INTEGER(IntKi), PARAMETER :: M21N9FKye = 1080 + INTEGER(IntKi), PARAMETER :: M22N1FKye = 1081 + INTEGER(IntKi), PARAMETER :: M22N2FKye = 1082 + INTEGER(IntKi), PARAMETER :: M22N3FKye = 1083 + INTEGER(IntKi), PARAMETER :: M22N4FKye = 1084 + INTEGER(IntKi), PARAMETER :: M22N5FKye = 1085 + INTEGER(IntKi), PARAMETER :: M22N6FKye = 1086 + INTEGER(IntKi), PARAMETER :: M22N7FKye = 1087 + INTEGER(IntKi), PARAMETER :: M22N8FKye = 1088 + INTEGER(IntKi), PARAMETER :: M22N9FKye = 1089 + INTEGER(IntKi), PARAMETER :: M23N1FKye = 1090 + INTEGER(IntKi), PARAMETER :: M23N2FKye = 1091 + INTEGER(IntKi), PARAMETER :: M23N3FKye = 1092 + INTEGER(IntKi), PARAMETER :: M23N4FKye = 1093 + INTEGER(IntKi), PARAMETER :: M23N5FKye = 1094 + INTEGER(IntKi), PARAMETER :: M23N6FKye = 1095 + INTEGER(IntKi), PARAMETER :: M23N7FKye = 1096 + INTEGER(IntKi), PARAMETER :: M23N8FKye = 1097 + INTEGER(IntKi), PARAMETER :: M23N9FKye = 1098 + INTEGER(IntKi), PARAMETER :: M24N1FKye = 1099 + INTEGER(IntKi), PARAMETER :: M24N2FKye = 1100 + INTEGER(IntKi), PARAMETER :: M24N3FKye = 1101 + INTEGER(IntKi), PARAMETER :: M24N4FKye = 1102 + INTEGER(IntKi), PARAMETER :: M24N5FKye = 1103 + INTEGER(IntKi), PARAMETER :: M24N6FKye = 1104 + INTEGER(IntKi), PARAMETER :: M24N7FKye = 1105 + INTEGER(IntKi), PARAMETER :: M24N8FKye = 1106 + INTEGER(IntKi), PARAMETER :: M24N9FKye = 1107 + INTEGER(IntKi), PARAMETER :: M25N1FKye = 1108 + INTEGER(IntKi), PARAMETER :: M25N2FKye = 1109 + INTEGER(IntKi), PARAMETER :: M25N3FKye = 1110 + INTEGER(IntKi), PARAMETER :: M25N4FKye = 1111 + INTEGER(IntKi), PARAMETER :: M25N5FKye = 1112 + INTEGER(IntKi), PARAMETER :: M25N6FKye = 1113 + INTEGER(IntKi), PARAMETER :: M25N7FKye = 1114 + INTEGER(IntKi), PARAMETER :: M25N8FKye = 1115 + INTEGER(IntKi), PARAMETER :: M25N9FKye = 1116 + INTEGER(IntKi), PARAMETER :: M26N1FKye = 1117 + INTEGER(IntKi), PARAMETER :: M26N2FKye = 1118 + INTEGER(IntKi), PARAMETER :: M26N3FKye = 1119 + INTEGER(IntKi), PARAMETER :: M26N4FKye = 1120 + INTEGER(IntKi), PARAMETER :: M26N5FKye = 1121 + INTEGER(IntKi), PARAMETER :: M26N6FKye = 1122 + INTEGER(IntKi), PARAMETER :: M26N7FKye = 1123 + INTEGER(IntKi), PARAMETER :: M26N8FKye = 1124 + INTEGER(IntKi), PARAMETER :: M26N9FKye = 1125 + INTEGER(IntKi), PARAMETER :: M27N1FKye = 1126 + INTEGER(IntKi), PARAMETER :: M27N2FKye = 1127 + INTEGER(IntKi), PARAMETER :: M27N3FKye = 1128 + INTEGER(IntKi), PARAMETER :: M27N4FKye = 1129 + INTEGER(IntKi), PARAMETER :: M27N5FKye = 1130 + INTEGER(IntKi), PARAMETER :: M27N6FKye = 1131 + INTEGER(IntKi), PARAMETER :: M27N7FKye = 1132 + INTEGER(IntKi), PARAMETER :: M27N8FKye = 1133 + INTEGER(IntKi), PARAMETER :: M27N9FKye = 1134 + INTEGER(IntKi), PARAMETER :: M28N1FKye = 1135 + INTEGER(IntKi), PARAMETER :: M28N2FKye = 1136 + INTEGER(IntKi), PARAMETER :: M28N3FKye = 1137 + INTEGER(IntKi), PARAMETER :: M28N4FKye = 1138 + INTEGER(IntKi), PARAMETER :: M28N5FKye = 1139 + INTEGER(IntKi), PARAMETER :: M28N6FKye = 1140 + INTEGER(IntKi), PARAMETER :: M28N7FKye = 1141 + INTEGER(IntKi), PARAMETER :: M28N8FKye = 1142 + INTEGER(IntKi), PARAMETER :: M28N9FKye = 1143 + INTEGER(IntKi), PARAMETER :: M29N1FKye = 1144 + INTEGER(IntKi), PARAMETER :: M29N2FKye = 1145 + INTEGER(IntKi), PARAMETER :: M29N3FKye = 1146 + INTEGER(IntKi), PARAMETER :: M29N4FKye = 1147 + INTEGER(IntKi), PARAMETER :: M29N5FKye = 1148 + INTEGER(IntKi), PARAMETER :: M29N6FKye = 1149 + INTEGER(IntKi), PARAMETER :: M29N7FKye = 1150 + INTEGER(IntKi), PARAMETER :: M29N8FKye = 1151 + INTEGER(IntKi), PARAMETER :: M29N9FKye = 1152 + INTEGER(IntKi), PARAMETER :: M30N1FKye = 1153 + INTEGER(IntKi), PARAMETER :: M30N2FKye = 1154 + INTEGER(IntKi), PARAMETER :: M30N3FKye = 1155 + INTEGER(IntKi), PARAMETER :: M30N4FKye = 1156 + INTEGER(IntKi), PARAMETER :: M30N5FKye = 1157 + INTEGER(IntKi), PARAMETER :: M30N6FKye = 1158 + INTEGER(IntKi), PARAMETER :: M30N7FKye = 1159 + INTEGER(IntKi), PARAMETER :: M30N8FKye = 1160 + INTEGER(IntKi), PARAMETER :: M30N9FKye = 1161 + INTEGER(IntKi), PARAMETER :: M31N1FKye = 1162 + INTEGER(IntKi), PARAMETER :: M31N2FKye = 1163 + INTEGER(IntKi), PARAMETER :: M31N3FKye = 1164 + INTEGER(IntKi), PARAMETER :: M31N4FKye = 1165 + INTEGER(IntKi), PARAMETER :: M31N5FKye = 1166 + INTEGER(IntKi), PARAMETER :: M31N6FKye = 1167 + INTEGER(IntKi), PARAMETER :: M31N7FKye = 1168 + INTEGER(IntKi), PARAMETER :: M31N8FKye = 1169 + INTEGER(IntKi), PARAMETER :: M31N9FKye = 1170 + INTEGER(IntKi), PARAMETER :: M32N1FKye = 1171 + INTEGER(IntKi), PARAMETER :: M32N2FKye = 1172 + INTEGER(IntKi), PARAMETER :: M32N3FKye = 1173 + INTEGER(IntKi), PARAMETER :: M32N4FKye = 1174 + INTEGER(IntKi), PARAMETER :: M32N5FKye = 1175 + INTEGER(IntKi), PARAMETER :: M32N6FKye = 1176 + INTEGER(IntKi), PARAMETER :: M32N7FKye = 1177 + INTEGER(IntKi), PARAMETER :: M32N8FKye = 1178 + INTEGER(IntKi), PARAMETER :: M32N9FKye = 1179 + INTEGER(IntKi), PARAMETER :: M33N1FKye = 1180 + INTEGER(IntKi), PARAMETER :: M33N2FKye = 1181 + INTEGER(IntKi), PARAMETER :: M33N3FKye = 1182 + INTEGER(IntKi), PARAMETER :: M33N4FKye = 1183 + INTEGER(IntKi), PARAMETER :: M33N5FKye = 1184 + INTEGER(IntKi), PARAMETER :: M33N6FKye = 1185 + INTEGER(IntKi), PARAMETER :: M33N7FKye = 1186 + INTEGER(IntKi), PARAMETER :: M33N8FKye = 1187 + INTEGER(IntKi), PARAMETER :: M33N9FKye = 1188 + INTEGER(IntKi), PARAMETER :: M34N1FKye = 1189 + INTEGER(IntKi), PARAMETER :: M34N2FKye = 1190 + INTEGER(IntKi), PARAMETER :: M34N3FKye = 1191 + INTEGER(IntKi), PARAMETER :: M34N4FKye = 1192 + INTEGER(IntKi), PARAMETER :: M34N5FKye = 1193 + INTEGER(IntKi), PARAMETER :: M34N6FKye = 1194 + INTEGER(IntKi), PARAMETER :: M34N7FKye = 1195 + INTEGER(IntKi), PARAMETER :: M34N8FKye = 1196 + INTEGER(IntKi), PARAMETER :: M34N9FKye = 1197 + INTEGER(IntKi), PARAMETER :: M35N1FKye = 1198 + INTEGER(IntKi), PARAMETER :: M35N2FKye = 1199 + INTEGER(IntKi), PARAMETER :: M35N3FKye = 1200 + INTEGER(IntKi), PARAMETER :: M35N4FKye = 1201 + INTEGER(IntKi), PARAMETER :: M35N5FKye = 1202 + INTEGER(IntKi), PARAMETER :: M35N6FKye = 1203 + INTEGER(IntKi), PARAMETER :: M35N7FKye = 1204 + INTEGER(IntKi), PARAMETER :: M35N8FKye = 1205 + INTEGER(IntKi), PARAMETER :: M35N9FKye = 1206 + INTEGER(IntKi), PARAMETER :: M36N1FKye = 1207 + INTEGER(IntKi), PARAMETER :: M36N2FKye = 1208 + INTEGER(IntKi), PARAMETER :: M36N3FKye = 1209 + INTEGER(IntKi), PARAMETER :: M36N4FKye = 1210 + INTEGER(IntKi), PARAMETER :: M36N5FKye = 1211 + INTEGER(IntKi), PARAMETER :: M36N6FKye = 1212 + INTEGER(IntKi), PARAMETER :: M36N7FKye = 1213 + INTEGER(IntKi), PARAMETER :: M36N8FKye = 1214 + INTEGER(IntKi), PARAMETER :: M36N9FKye = 1215 + INTEGER(IntKi), PARAMETER :: M37N1FKye = 1216 + INTEGER(IntKi), PARAMETER :: M37N2FKye = 1217 + INTEGER(IntKi), PARAMETER :: M37N3FKye = 1218 + INTEGER(IntKi), PARAMETER :: M37N4FKye = 1219 + INTEGER(IntKi), PARAMETER :: M37N5FKye = 1220 + INTEGER(IntKi), PARAMETER :: M37N6FKye = 1221 + INTEGER(IntKi), PARAMETER :: M37N7FKye = 1222 + INTEGER(IntKi), PARAMETER :: M37N8FKye = 1223 + INTEGER(IntKi), PARAMETER :: M37N9FKye = 1224 + INTEGER(IntKi), PARAMETER :: M38N1FKye = 1225 + INTEGER(IntKi), PARAMETER :: M38N2FKye = 1226 + INTEGER(IntKi), PARAMETER :: M38N3FKye = 1227 + INTEGER(IntKi), PARAMETER :: M38N4FKye = 1228 + INTEGER(IntKi), PARAMETER :: M38N5FKye = 1229 + INTEGER(IntKi), PARAMETER :: M38N6FKye = 1230 + INTEGER(IntKi), PARAMETER :: M38N7FKye = 1231 + INTEGER(IntKi), PARAMETER :: M38N8FKye = 1232 + INTEGER(IntKi), PARAMETER :: M38N9FKye = 1233 + INTEGER(IntKi), PARAMETER :: M39N1FKye = 1234 + INTEGER(IntKi), PARAMETER :: M39N2FKye = 1235 + INTEGER(IntKi), PARAMETER :: M39N3FKye = 1236 + INTEGER(IntKi), PARAMETER :: M39N4FKye = 1237 + INTEGER(IntKi), PARAMETER :: M39N5FKye = 1238 + INTEGER(IntKi), PARAMETER :: M39N6FKye = 1239 + INTEGER(IntKi), PARAMETER :: M39N7FKye = 1240 + INTEGER(IntKi), PARAMETER :: M39N8FKye = 1241 + INTEGER(IntKi), PARAMETER :: M39N9FKye = 1242 + INTEGER(IntKi), PARAMETER :: M40N1FKye = 1243 + INTEGER(IntKi), PARAMETER :: M40N2FKye = 1244 + INTEGER(IntKi), PARAMETER :: M40N3FKye = 1245 + INTEGER(IntKi), PARAMETER :: M40N4FKye = 1246 + INTEGER(IntKi), PARAMETER :: M40N5FKye = 1247 + INTEGER(IntKi), PARAMETER :: M40N6FKye = 1248 + INTEGER(IntKi), PARAMETER :: M40N7FKye = 1249 + INTEGER(IntKi), PARAMETER :: M40N8FKye = 1250 + INTEGER(IntKi), PARAMETER :: M40N9FKye = 1251 + INTEGER(IntKi), PARAMETER :: M41N1FKye = 1252 + INTEGER(IntKi), PARAMETER :: M41N2FKye = 1253 + INTEGER(IntKi), PARAMETER :: M41N3FKye = 1254 + INTEGER(IntKi), PARAMETER :: M41N4FKye = 1255 + INTEGER(IntKi), PARAMETER :: M41N5FKye = 1256 + INTEGER(IntKi), PARAMETER :: M41N6FKye = 1257 + INTEGER(IntKi), PARAMETER :: M41N7FKye = 1258 + INTEGER(IntKi), PARAMETER :: M41N8FKye = 1259 + INTEGER(IntKi), PARAMETER :: M41N9FKye = 1260 + INTEGER(IntKi), PARAMETER :: M42N1FKye = 1261 + INTEGER(IntKi), PARAMETER :: M42N2FKye = 1262 + INTEGER(IntKi), PARAMETER :: M42N3FKye = 1263 + INTEGER(IntKi), PARAMETER :: M42N4FKye = 1264 + INTEGER(IntKi), PARAMETER :: M42N5FKye = 1265 + INTEGER(IntKi), PARAMETER :: M42N6FKye = 1266 + INTEGER(IntKi), PARAMETER :: M42N7FKye = 1267 + INTEGER(IntKi), PARAMETER :: M42N8FKye = 1268 + INTEGER(IntKi), PARAMETER :: M42N9FKye = 1269 + INTEGER(IntKi), PARAMETER :: M43N1FKye = 1270 + INTEGER(IntKi), PARAMETER :: M43N2FKye = 1271 + INTEGER(IntKi), PARAMETER :: M43N3FKye = 1272 + INTEGER(IntKi), PARAMETER :: M43N4FKye = 1273 + INTEGER(IntKi), PARAMETER :: M43N5FKye = 1274 + INTEGER(IntKi), PARAMETER :: M43N6FKye = 1275 + INTEGER(IntKi), PARAMETER :: M43N7FKye = 1276 + INTEGER(IntKi), PARAMETER :: M43N8FKye = 1277 + INTEGER(IntKi), PARAMETER :: M43N9FKye = 1278 + INTEGER(IntKi), PARAMETER :: M44N1FKye = 1279 + INTEGER(IntKi), PARAMETER :: M44N2FKye = 1280 + INTEGER(IntKi), PARAMETER :: M44N3FKye = 1281 + INTEGER(IntKi), PARAMETER :: M44N4FKye = 1282 + INTEGER(IntKi), PARAMETER :: M44N5FKye = 1283 + INTEGER(IntKi), PARAMETER :: M44N6FKye = 1284 + INTEGER(IntKi), PARAMETER :: M44N7FKye = 1285 + INTEGER(IntKi), PARAMETER :: M44N8FKye = 1286 + INTEGER(IntKi), PARAMETER :: M44N9FKye = 1287 + INTEGER(IntKi), PARAMETER :: M45N1FKye = 1288 + INTEGER(IntKi), PARAMETER :: M45N2FKye = 1289 + INTEGER(IntKi), PARAMETER :: M45N3FKye = 1290 + INTEGER(IntKi), PARAMETER :: M45N4FKye = 1291 + INTEGER(IntKi), PARAMETER :: M45N5FKye = 1292 + INTEGER(IntKi), PARAMETER :: M45N6FKye = 1293 + INTEGER(IntKi), PARAMETER :: M45N7FKye = 1294 + INTEGER(IntKi), PARAMETER :: M45N8FKye = 1295 + INTEGER(IntKi), PARAMETER :: M45N9FKye = 1296 + INTEGER(IntKi), PARAMETER :: M46N1FKye = 1297 + INTEGER(IntKi), PARAMETER :: M46N2FKye = 1298 + INTEGER(IntKi), PARAMETER :: M46N3FKye = 1299 + INTEGER(IntKi), PARAMETER :: M46N4FKye = 1300 + INTEGER(IntKi), PARAMETER :: M46N5FKye = 1301 + INTEGER(IntKi), PARAMETER :: M46N6FKye = 1302 + INTEGER(IntKi), PARAMETER :: M46N7FKye = 1303 + INTEGER(IntKi), PARAMETER :: M46N8FKye = 1304 + INTEGER(IntKi), PARAMETER :: M46N9FKye = 1305 + INTEGER(IntKi), PARAMETER :: M47N1FKye = 1306 + INTEGER(IntKi), PARAMETER :: M47N2FKye = 1307 + INTEGER(IntKi), PARAMETER :: M47N3FKye = 1308 + INTEGER(IntKi), PARAMETER :: M47N4FKye = 1309 + INTEGER(IntKi), PARAMETER :: M47N5FKye = 1310 + INTEGER(IntKi), PARAMETER :: M47N6FKye = 1311 + INTEGER(IntKi), PARAMETER :: M47N7FKye = 1312 + INTEGER(IntKi), PARAMETER :: M47N8FKye = 1313 + INTEGER(IntKi), PARAMETER :: M47N9FKye = 1314 + INTEGER(IntKi), PARAMETER :: M48N1FKye = 1315 + INTEGER(IntKi), PARAMETER :: M48N2FKye = 1316 + INTEGER(IntKi), PARAMETER :: M48N3FKye = 1317 + INTEGER(IntKi), PARAMETER :: M48N4FKye = 1318 + INTEGER(IntKi), PARAMETER :: M48N5FKye = 1319 + INTEGER(IntKi), PARAMETER :: M48N6FKye = 1320 + INTEGER(IntKi), PARAMETER :: M48N7FKye = 1321 + INTEGER(IntKi), PARAMETER :: M48N8FKye = 1322 + INTEGER(IntKi), PARAMETER :: M48N9FKye = 1323 + INTEGER(IntKi), PARAMETER :: M49N1FKye = 1324 + INTEGER(IntKi), PARAMETER :: M49N2FKye = 1325 + INTEGER(IntKi), PARAMETER :: M49N3FKye = 1326 + INTEGER(IntKi), PARAMETER :: M49N4FKye = 1327 + INTEGER(IntKi), PARAMETER :: M49N5FKye = 1328 + INTEGER(IntKi), PARAMETER :: M49N6FKye = 1329 + INTEGER(IntKi), PARAMETER :: M49N7FKye = 1330 + INTEGER(IntKi), PARAMETER :: M49N8FKye = 1331 + INTEGER(IntKi), PARAMETER :: M49N9FKye = 1332 + INTEGER(IntKi), PARAMETER :: M50N1FKye = 1333 + INTEGER(IntKi), PARAMETER :: M50N2FKye = 1334 + INTEGER(IntKi), PARAMETER :: M50N3FKye = 1335 + INTEGER(IntKi), PARAMETER :: M50N4FKye = 1336 + INTEGER(IntKi), PARAMETER :: M50N5FKye = 1337 + INTEGER(IntKi), PARAMETER :: M50N6FKye = 1338 + INTEGER(IntKi), PARAMETER :: M50N7FKye = 1339 + INTEGER(IntKi), PARAMETER :: M50N8FKye = 1340 + INTEGER(IntKi), PARAMETER :: M50N9FKye = 1341 + INTEGER(IntKi), PARAMETER :: M51N1FKye = 1342 + INTEGER(IntKi), PARAMETER :: M51N2FKye = 1343 + INTEGER(IntKi), PARAMETER :: M51N3FKye = 1344 + INTEGER(IntKi), PARAMETER :: M51N4FKye = 1345 + INTEGER(IntKi), PARAMETER :: M51N5FKye = 1346 + INTEGER(IntKi), PARAMETER :: M51N6FKye = 1347 + INTEGER(IntKi), PARAMETER :: M51N7FKye = 1348 + INTEGER(IntKi), PARAMETER :: M51N8FKye = 1349 + INTEGER(IntKi), PARAMETER :: M51N9FKye = 1350 + INTEGER(IntKi), PARAMETER :: M52N1FKye = 1351 + INTEGER(IntKi), PARAMETER :: M52N2FKye = 1352 + INTEGER(IntKi), PARAMETER :: M52N3FKye = 1353 + INTEGER(IntKi), PARAMETER :: M52N4FKye = 1354 + INTEGER(IntKi), PARAMETER :: M52N5FKye = 1355 + INTEGER(IntKi), PARAMETER :: M52N6FKye = 1356 + INTEGER(IntKi), PARAMETER :: M52N7FKye = 1357 + INTEGER(IntKi), PARAMETER :: M52N8FKye = 1358 + INTEGER(IntKi), PARAMETER :: M52N9FKye = 1359 + INTEGER(IntKi), PARAMETER :: M53N1FKye = 1360 + INTEGER(IntKi), PARAMETER :: M53N2FKye = 1361 + INTEGER(IntKi), PARAMETER :: M53N3FKye = 1362 + INTEGER(IntKi), PARAMETER :: M53N4FKye = 1363 + INTEGER(IntKi), PARAMETER :: M53N5FKye = 1364 + INTEGER(IntKi), PARAMETER :: M53N6FKye = 1365 + INTEGER(IntKi), PARAMETER :: M53N7FKye = 1366 + INTEGER(IntKi), PARAMETER :: M53N8FKye = 1367 + INTEGER(IntKi), PARAMETER :: M53N9FKye = 1368 + INTEGER(IntKi), PARAMETER :: M54N1FKye = 1369 + INTEGER(IntKi), PARAMETER :: M54N2FKye = 1370 + INTEGER(IntKi), PARAMETER :: M54N3FKye = 1371 + INTEGER(IntKi), PARAMETER :: M54N4FKye = 1372 + INTEGER(IntKi), PARAMETER :: M54N5FKye = 1373 + INTEGER(IntKi), PARAMETER :: M54N6FKye = 1374 + INTEGER(IntKi), PARAMETER :: M54N7FKye = 1375 + INTEGER(IntKi), PARAMETER :: M54N8FKye = 1376 + INTEGER(IntKi), PARAMETER :: M54N9FKye = 1377 + INTEGER(IntKi), PARAMETER :: M55N1FKye = 1378 + INTEGER(IntKi), PARAMETER :: M55N2FKye = 1379 + INTEGER(IntKi), PARAMETER :: M55N3FKye = 1380 + INTEGER(IntKi), PARAMETER :: M55N4FKye = 1381 + INTEGER(IntKi), PARAMETER :: M55N5FKye = 1382 + INTEGER(IntKi), PARAMETER :: M55N6FKye = 1383 + INTEGER(IntKi), PARAMETER :: M55N7FKye = 1384 + INTEGER(IntKi), PARAMETER :: M55N8FKye = 1385 + INTEGER(IntKi), PARAMETER :: M55N9FKye = 1386 + INTEGER(IntKi), PARAMETER :: M56N1FKye = 1387 + INTEGER(IntKi), PARAMETER :: M56N2FKye = 1388 + INTEGER(IntKi), PARAMETER :: M56N3FKye = 1389 + INTEGER(IntKi), PARAMETER :: M56N4FKye = 1390 + INTEGER(IntKi), PARAMETER :: M56N5FKye = 1391 + INTEGER(IntKi), PARAMETER :: M56N6FKye = 1392 + INTEGER(IntKi), PARAMETER :: M56N7FKye = 1393 + INTEGER(IntKi), PARAMETER :: M56N8FKye = 1394 + INTEGER(IntKi), PARAMETER :: M56N9FKye = 1395 + INTEGER(IntKi), PARAMETER :: M57N1FKye = 1396 + INTEGER(IntKi), PARAMETER :: M57N2FKye = 1397 + INTEGER(IntKi), PARAMETER :: M57N3FKye = 1398 + INTEGER(IntKi), PARAMETER :: M57N4FKye = 1399 + INTEGER(IntKi), PARAMETER :: M57N5FKye = 1400 + INTEGER(IntKi), PARAMETER :: M57N6FKye = 1401 + INTEGER(IntKi), PARAMETER :: M57N7FKye = 1402 + INTEGER(IntKi), PARAMETER :: M57N8FKye = 1403 + INTEGER(IntKi), PARAMETER :: M57N9FKye = 1404 + INTEGER(IntKi), PARAMETER :: M58N1FKye = 1405 + INTEGER(IntKi), PARAMETER :: M58N2FKye = 1406 + INTEGER(IntKi), PARAMETER :: M58N3FKye = 1407 + INTEGER(IntKi), PARAMETER :: M58N4FKye = 1408 + INTEGER(IntKi), PARAMETER :: M58N5FKye = 1409 + INTEGER(IntKi), PARAMETER :: M58N6FKye = 1410 + INTEGER(IntKi), PARAMETER :: M58N7FKye = 1411 + INTEGER(IntKi), PARAMETER :: M58N8FKye = 1412 + INTEGER(IntKi), PARAMETER :: M58N9FKye = 1413 + INTEGER(IntKi), PARAMETER :: M59N1FKye = 1414 + INTEGER(IntKi), PARAMETER :: M59N2FKye = 1415 + INTEGER(IntKi), PARAMETER :: M59N3FKye = 1416 + INTEGER(IntKi), PARAMETER :: M59N4FKye = 1417 + INTEGER(IntKi), PARAMETER :: M59N5FKye = 1418 + INTEGER(IntKi), PARAMETER :: M59N6FKye = 1419 + INTEGER(IntKi), PARAMETER :: M59N7FKye = 1420 + INTEGER(IntKi), PARAMETER :: M59N8FKye = 1421 + INTEGER(IntKi), PARAMETER :: M59N9FKye = 1422 + INTEGER(IntKi), PARAMETER :: M60N1FKye = 1423 + INTEGER(IntKi), PARAMETER :: M60N2FKye = 1424 + INTEGER(IntKi), PARAMETER :: M60N3FKye = 1425 + INTEGER(IntKi), PARAMETER :: M60N4FKye = 1426 + INTEGER(IntKi), PARAMETER :: M60N5FKye = 1427 + INTEGER(IntKi), PARAMETER :: M60N6FKye = 1428 + INTEGER(IntKi), PARAMETER :: M60N7FKye = 1429 + INTEGER(IntKi), PARAMETER :: M60N8FKye = 1430 + INTEGER(IntKi), PARAMETER :: M60N9FKye = 1431 + INTEGER(IntKi), PARAMETER :: M61N1FKye = 1432 + INTEGER(IntKi), PARAMETER :: M61N2FKye = 1433 + INTEGER(IntKi), PARAMETER :: M61N3FKye = 1434 + INTEGER(IntKi), PARAMETER :: M61N4FKye = 1435 + INTEGER(IntKi), PARAMETER :: M61N5FKye = 1436 + INTEGER(IntKi), PARAMETER :: M61N6FKye = 1437 + INTEGER(IntKi), PARAMETER :: M61N7FKye = 1438 + INTEGER(IntKi), PARAMETER :: M61N8FKye = 1439 + INTEGER(IntKi), PARAMETER :: M61N9FKye = 1440 + INTEGER(IntKi), PARAMETER :: M62N1FKye = 1441 + INTEGER(IntKi), PARAMETER :: M62N2FKye = 1442 + INTEGER(IntKi), PARAMETER :: M62N3FKye = 1443 + INTEGER(IntKi), PARAMETER :: M62N4FKye = 1444 + INTEGER(IntKi), PARAMETER :: M62N5FKye = 1445 + INTEGER(IntKi), PARAMETER :: M62N6FKye = 1446 + INTEGER(IntKi), PARAMETER :: M62N7FKye = 1447 + INTEGER(IntKi), PARAMETER :: M62N8FKye = 1448 + INTEGER(IntKi), PARAMETER :: M62N9FKye = 1449 + INTEGER(IntKi), PARAMETER :: M63N1FKye = 1450 + INTEGER(IntKi), PARAMETER :: M63N2FKye = 1451 + INTEGER(IntKi), PARAMETER :: M63N3FKye = 1452 + INTEGER(IntKi), PARAMETER :: M63N4FKye = 1453 + INTEGER(IntKi), PARAMETER :: M63N5FKye = 1454 + INTEGER(IntKi), PARAMETER :: M63N6FKye = 1455 + INTEGER(IntKi), PARAMETER :: M63N7FKye = 1456 + INTEGER(IntKi), PARAMETER :: M63N8FKye = 1457 + INTEGER(IntKi), PARAMETER :: M63N9FKye = 1458 + INTEGER(IntKi), PARAMETER :: M64N1FKye = 1459 + INTEGER(IntKi), PARAMETER :: M64N2FKye = 1460 + INTEGER(IntKi), PARAMETER :: M64N3FKye = 1461 + INTEGER(IntKi), PARAMETER :: M64N4FKye = 1462 + INTEGER(IntKi), PARAMETER :: M64N5FKye = 1463 + INTEGER(IntKi), PARAMETER :: M64N6FKye = 1464 + INTEGER(IntKi), PARAMETER :: M64N7FKye = 1465 + INTEGER(IntKi), PARAMETER :: M64N8FKye = 1466 + INTEGER(IntKi), PARAMETER :: M64N9FKye = 1467 + INTEGER(IntKi), PARAMETER :: M65N1FKye = 1468 + INTEGER(IntKi), PARAMETER :: M65N2FKye = 1469 + INTEGER(IntKi), PARAMETER :: M65N3FKye = 1470 + INTEGER(IntKi), PARAMETER :: M65N4FKye = 1471 + INTEGER(IntKi), PARAMETER :: M65N5FKye = 1472 + INTEGER(IntKi), PARAMETER :: M65N6FKye = 1473 + INTEGER(IntKi), PARAMETER :: M65N7FKye = 1474 + INTEGER(IntKi), PARAMETER :: M65N8FKye = 1475 + INTEGER(IntKi), PARAMETER :: M65N9FKye = 1476 + INTEGER(IntKi), PARAMETER :: M66N1FKye = 1477 + INTEGER(IntKi), PARAMETER :: M66N2FKye = 1478 + INTEGER(IntKi), PARAMETER :: M66N3FKye = 1479 + INTEGER(IntKi), PARAMETER :: M66N4FKye = 1480 + INTEGER(IntKi), PARAMETER :: M66N5FKye = 1481 + INTEGER(IntKi), PARAMETER :: M66N6FKye = 1482 + INTEGER(IntKi), PARAMETER :: M66N7FKye = 1483 + INTEGER(IntKi), PARAMETER :: M66N8FKye = 1484 + INTEGER(IntKi), PARAMETER :: M66N9FKye = 1485 + INTEGER(IntKi), PARAMETER :: M67N1FKye = 1486 + INTEGER(IntKi), PARAMETER :: M67N2FKye = 1487 + INTEGER(IntKi), PARAMETER :: M67N3FKye = 1488 + INTEGER(IntKi), PARAMETER :: M67N4FKye = 1489 + INTEGER(IntKi), PARAMETER :: M67N5FKye = 1490 + INTEGER(IntKi), PARAMETER :: M67N6FKye = 1491 + INTEGER(IntKi), PARAMETER :: M67N7FKye = 1492 + INTEGER(IntKi), PARAMETER :: M67N8FKye = 1493 + INTEGER(IntKi), PARAMETER :: M67N9FKye = 1494 + INTEGER(IntKi), PARAMETER :: M68N1FKye = 1495 + INTEGER(IntKi), PARAMETER :: M68N2FKye = 1496 + INTEGER(IntKi), PARAMETER :: M68N3FKye = 1497 + INTEGER(IntKi), PARAMETER :: M68N4FKye = 1498 + INTEGER(IntKi), PARAMETER :: M68N5FKye = 1499 + INTEGER(IntKi), PARAMETER :: M68N6FKye = 1500 + INTEGER(IntKi), PARAMETER :: M68N7FKye = 1501 + INTEGER(IntKi), PARAMETER :: M68N8FKye = 1502 + INTEGER(IntKi), PARAMETER :: M68N9FKye = 1503 + INTEGER(IntKi), PARAMETER :: M69N1FKye = 1504 + INTEGER(IntKi), PARAMETER :: M69N2FKye = 1505 + INTEGER(IntKi), PARAMETER :: M69N3FKye = 1506 + INTEGER(IntKi), PARAMETER :: M69N4FKye = 1507 + INTEGER(IntKi), PARAMETER :: M69N5FKye = 1508 + INTEGER(IntKi), PARAMETER :: M69N6FKye = 1509 + INTEGER(IntKi), PARAMETER :: M69N7FKye = 1510 + INTEGER(IntKi), PARAMETER :: M69N8FKye = 1511 + INTEGER(IntKi), PARAMETER :: M69N9FKye = 1512 + INTEGER(IntKi), PARAMETER :: M70N1FKye = 1513 + INTEGER(IntKi), PARAMETER :: M70N2FKye = 1514 + INTEGER(IntKi), PARAMETER :: M70N3FKye = 1515 + INTEGER(IntKi), PARAMETER :: M70N4FKye = 1516 + INTEGER(IntKi), PARAMETER :: M70N5FKye = 1517 + INTEGER(IntKi), PARAMETER :: M70N6FKye = 1518 + INTEGER(IntKi), PARAMETER :: M70N7FKye = 1519 + INTEGER(IntKi), PARAMETER :: M70N8FKye = 1520 + INTEGER(IntKi), PARAMETER :: M70N9FKye = 1521 + INTEGER(IntKi), PARAMETER :: M71N1FKye = 1522 + INTEGER(IntKi), PARAMETER :: M71N2FKye = 1523 + INTEGER(IntKi), PARAMETER :: M71N3FKye = 1524 + INTEGER(IntKi), PARAMETER :: M71N4FKye = 1525 + INTEGER(IntKi), PARAMETER :: M71N5FKye = 1526 + INTEGER(IntKi), PARAMETER :: M71N6FKye = 1527 + INTEGER(IntKi), PARAMETER :: M71N7FKye = 1528 + INTEGER(IntKi), PARAMETER :: M71N8FKye = 1529 + INTEGER(IntKi), PARAMETER :: M71N9FKye = 1530 + INTEGER(IntKi), PARAMETER :: M72N1FKye = 1531 + INTEGER(IntKi), PARAMETER :: M72N2FKye = 1532 + INTEGER(IntKi), PARAMETER :: M72N3FKye = 1533 + INTEGER(IntKi), PARAMETER :: M72N4FKye = 1534 + INTEGER(IntKi), PARAMETER :: M72N5FKye = 1535 + INTEGER(IntKi), PARAMETER :: M72N6FKye = 1536 + INTEGER(IntKi), PARAMETER :: M72N7FKye = 1537 + INTEGER(IntKi), PARAMETER :: M72N8FKye = 1538 + INTEGER(IntKi), PARAMETER :: M72N9FKye = 1539 + INTEGER(IntKi), PARAMETER :: M73N1FKye = 1540 + INTEGER(IntKi), PARAMETER :: M73N2FKye = 1541 + INTEGER(IntKi), PARAMETER :: M73N3FKye = 1542 + INTEGER(IntKi), PARAMETER :: M73N4FKye = 1543 + INTEGER(IntKi), PARAMETER :: M73N5FKye = 1544 + INTEGER(IntKi), PARAMETER :: M73N6FKye = 1545 + INTEGER(IntKi), PARAMETER :: M73N7FKye = 1546 + INTEGER(IntKi), PARAMETER :: M73N8FKye = 1547 + INTEGER(IntKi), PARAMETER :: M73N9FKye = 1548 + INTEGER(IntKi), PARAMETER :: M74N1FKye = 1549 + INTEGER(IntKi), PARAMETER :: M74N2FKye = 1550 + INTEGER(IntKi), PARAMETER :: M74N3FKye = 1551 + INTEGER(IntKi), PARAMETER :: M74N4FKye = 1552 + INTEGER(IntKi), PARAMETER :: M74N5FKye = 1553 + INTEGER(IntKi), PARAMETER :: M74N6FKye = 1554 + INTEGER(IntKi), PARAMETER :: M74N7FKye = 1555 + INTEGER(IntKi), PARAMETER :: M74N8FKye = 1556 + INTEGER(IntKi), PARAMETER :: M74N9FKye = 1557 + INTEGER(IntKi), PARAMETER :: M75N1FKye = 1558 + INTEGER(IntKi), PARAMETER :: M75N2FKye = 1559 + INTEGER(IntKi), PARAMETER :: M75N3FKye = 1560 + INTEGER(IntKi), PARAMETER :: M75N4FKye = 1561 + INTEGER(IntKi), PARAMETER :: M75N5FKye = 1562 + INTEGER(IntKi), PARAMETER :: M75N6FKye = 1563 + INTEGER(IntKi), PARAMETER :: M75N7FKye = 1564 + INTEGER(IntKi), PARAMETER :: M75N8FKye = 1565 + INTEGER(IntKi), PARAMETER :: M75N9FKye = 1566 + INTEGER(IntKi), PARAMETER :: M76N1FKye = 1567 + INTEGER(IntKi), PARAMETER :: M76N2FKye = 1568 + INTEGER(IntKi), PARAMETER :: M76N3FKye = 1569 + INTEGER(IntKi), PARAMETER :: M76N4FKye = 1570 + INTEGER(IntKi), PARAMETER :: M76N5FKye = 1571 + INTEGER(IntKi), PARAMETER :: M76N6FKye = 1572 + INTEGER(IntKi), PARAMETER :: M76N7FKye = 1573 + INTEGER(IntKi), PARAMETER :: M76N8FKye = 1574 + INTEGER(IntKi), PARAMETER :: M76N9FKye = 1575 + INTEGER(IntKi), PARAMETER :: M77N1FKye = 1576 + INTEGER(IntKi), PARAMETER :: M77N2FKye = 1577 + INTEGER(IntKi), PARAMETER :: M77N3FKye = 1578 + INTEGER(IntKi), PARAMETER :: M77N4FKye = 1579 + INTEGER(IntKi), PARAMETER :: M77N5FKye = 1580 + INTEGER(IntKi), PARAMETER :: M77N6FKye = 1581 + INTEGER(IntKi), PARAMETER :: M77N7FKye = 1582 + INTEGER(IntKi), PARAMETER :: M77N8FKye = 1583 + INTEGER(IntKi), PARAMETER :: M77N9FKye = 1584 + INTEGER(IntKi), PARAMETER :: M78N1FKye = 1585 + INTEGER(IntKi), PARAMETER :: M78N2FKye = 1586 + INTEGER(IntKi), PARAMETER :: M78N3FKye = 1587 + INTEGER(IntKi), PARAMETER :: M78N4FKye = 1588 + INTEGER(IntKi), PARAMETER :: M78N5FKye = 1589 + INTEGER(IntKi), PARAMETER :: M78N6FKye = 1590 + INTEGER(IntKi), PARAMETER :: M78N7FKye = 1591 + INTEGER(IntKi), PARAMETER :: M78N8FKye = 1592 + INTEGER(IntKi), PARAMETER :: M78N9FKye = 1593 + INTEGER(IntKi), PARAMETER :: M79N1FKye = 1594 + INTEGER(IntKi), PARAMETER :: M79N2FKye = 1595 + INTEGER(IntKi), PARAMETER :: M79N3FKye = 1596 + INTEGER(IntKi), PARAMETER :: M79N4FKye = 1597 + INTEGER(IntKi), PARAMETER :: M79N5FKye = 1598 + INTEGER(IntKi), PARAMETER :: M79N6FKye = 1599 + INTEGER(IntKi), PARAMETER :: M79N7FKye = 1600 + INTEGER(IntKi), PARAMETER :: M79N8FKye = 1601 + INTEGER(IntKi), PARAMETER :: M79N9FKye = 1602 + INTEGER(IntKi), PARAMETER :: M80N1FKye = 1603 + INTEGER(IntKi), PARAMETER :: M80N2FKye = 1604 + INTEGER(IntKi), PARAMETER :: M80N3FKye = 1605 + INTEGER(IntKi), PARAMETER :: M80N4FKye = 1606 + INTEGER(IntKi), PARAMETER :: M80N5FKye = 1607 + INTEGER(IntKi), PARAMETER :: M80N6FKye = 1608 + INTEGER(IntKi), PARAMETER :: M80N7FKye = 1609 + INTEGER(IntKi), PARAMETER :: M80N8FKye = 1610 + INTEGER(IntKi), PARAMETER :: M80N9FKye = 1611 + INTEGER(IntKi), PARAMETER :: M81N1FKye = 1612 + INTEGER(IntKi), PARAMETER :: M81N2FKye = 1613 + INTEGER(IntKi), PARAMETER :: M81N3FKye = 1614 + INTEGER(IntKi), PARAMETER :: M81N4FKye = 1615 + INTEGER(IntKi), PARAMETER :: M81N5FKye = 1616 + INTEGER(IntKi), PARAMETER :: M81N6FKye = 1617 + INTEGER(IntKi), PARAMETER :: M81N7FKye = 1618 + INTEGER(IntKi), PARAMETER :: M81N8FKye = 1619 + INTEGER(IntKi), PARAMETER :: M81N9FKye = 1620 + INTEGER(IntKi), PARAMETER :: M82N1FKye = 1621 + INTEGER(IntKi), PARAMETER :: M82N2FKye = 1622 + INTEGER(IntKi), PARAMETER :: M82N3FKye = 1623 + INTEGER(IntKi), PARAMETER :: M82N4FKye = 1624 + INTEGER(IntKi), PARAMETER :: M82N5FKye = 1625 + INTEGER(IntKi), PARAMETER :: M82N6FKye = 1626 + INTEGER(IntKi), PARAMETER :: M82N7FKye = 1627 + INTEGER(IntKi), PARAMETER :: M82N8FKye = 1628 + INTEGER(IntKi), PARAMETER :: M82N9FKye = 1629 + INTEGER(IntKi), PARAMETER :: M83N1FKye = 1630 + INTEGER(IntKi), PARAMETER :: M83N2FKye = 1631 + INTEGER(IntKi), PARAMETER :: M83N3FKye = 1632 + INTEGER(IntKi), PARAMETER :: M83N4FKye = 1633 + INTEGER(IntKi), PARAMETER :: M83N5FKye = 1634 + INTEGER(IntKi), PARAMETER :: M83N6FKye = 1635 + INTEGER(IntKi), PARAMETER :: M83N7FKye = 1636 + INTEGER(IntKi), PARAMETER :: M83N8FKye = 1637 + INTEGER(IntKi), PARAMETER :: M83N9FKye = 1638 + INTEGER(IntKi), PARAMETER :: M84N1FKye = 1639 + INTEGER(IntKi), PARAMETER :: M84N2FKye = 1640 + INTEGER(IntKi), PARAMETER :: M84N3FKye = 1641 + INTEGER(IntKi), PARAMETER :: M84N4FKye = 1642 + INTEGER(IntKi), PARAMETER :: M84N5FKye = 1643 + INTEGER(IntKi), PARAMETER :: M84N6FKye = 1644 + INTEGER(IntKi), PARAMETER :: M84N7FKye = 1645 + INTEGER(IntKi), PARAMETER :: M84N8FKye = 1646 + INTEGER(IntKi), PARAMETER :: M84N9FKye = 1647 + INTEGER(IntKi), PARAMETER :: M85N1FKye = 1648 + INTEGER(IntKi), PARAMETER :: M85N2FKye = 1649 + INTEGER(IntKi), PARAMETER :: M85N3FKye = 1650 + INTEGER(IntKi), PARAMETER :: M85N4FKye = 1651 + INTEGER(IntKi), PARAMETER :: M85N5FKye = 1652 + INTEGER(IntKi), PARAMETER :: M85N6FKye = 1653 + INTEGER(IntKi), PARAMETER :: M85N7FKye = 1654 + INTEGER(IntKi), PARAMETER :: M85N8FKye = 1655 + INTEGER(IntKi), PARAMETER :: M85N9FKye = 1656 + INTEGER(IntKi), PARAMETER :: M86N1FKye = 1657 + INTEGER(IntKi), PARAMETER :: M86N2FKye = 1658 + INTEGER(IntKi), PARAMETER :: M86N3FKye = 1659 + INTEGER(IntKi), PARAMETER :: M86N4FKye = 1660 + INTEGER(IntKi), PARAMETER :: M86N5FKye = 1661 + INTEGER(IntKi), PARAMETER :: M86N6FKye = 1662 + INTEGER(IntKi), PARAMETER :: M86N7FKye = 1663 + INTEGER(IntKi), PARAMETER :: M86N8FKye = 1664 + INTEGER(IntKi), PARAMETER :: M86N9FKye = 1665 + INTEGER(IntKi), PARAMETER :: M87N1FKye = 1666 + INTEGER(IntKi), PARAMETER :: M87N2FKye = 1667 + INTEGER(IntKi), PARAMETER :: M87N3FKye = 1668 + INTEGER(IntKi), PARAMETER :: M87N4FKye = 1669 + INTEGER(IntKi), PARAMETER :: M87N5FKye = 1670 + INTEGER(IntKi), PARAMETER :: M87N6FKye = 1671 + INTEGER(IntKi), PARAMETER :: M87N7FKye = 1672 + INTEGER(IntKi), PARAMETER :: M87N8FKye = 1673 + INTEGER(IntKi), PARAMETER :: M87N9FKye = 1674 + INTEGER(IntKi), PARAMETER :: M88N1FKye = 1675 + INTEGER(IntKi), PARAMETER :: M88N2FKye = 1676 + INTEGER(IntKi), PARAMETER :: M88N3FKye = 1677 + INTEGER(IntKi), PARAMETER :: M88N4FKye = 1678 + INTEGER(IntKi), PARAMETER :: M88N5FKye = 1679 + INTEGER(IntKi), PARAMETER :: M88N6FKye = 1680 + INTEGER(IntKi), PARAMETER :: M88N7FKye = 1681 + INTEGER(IntKi), PARAMETER :: M88N8FKye = 1682 + INTEGER(IntKi), PARAMETER :: M88N9FKye = 1683 + INTEGER(IntKi), PARAMETER :: M89N1FKye = 1684 + INTEGER(IntKi), PARAMETER :: M89N2FKye = 1685 + INTEGER(IntKi), PARAMETER :: M89N3FKye = 1686 + INTEGER(IntKi), PARAMETER :: M89N4FKye = 1687 + INTEGER(IntKi), PARAMETER :: M89N5FKye = 1688 + INTEGER(IntKi), PARAMETER :: M89N6FKye = 1689 + INTEGER(IntKi), PARAMETER :: M89N7FKye = 1690 + INTEGER(IntKi), PARAMETER :: M89N8FKye = 1691 + INTEGER(IntKi), PARAMETER :: M89N9FKye = 1692 + INTEGER(IntKi), PARAMETER :: M90N1FKye = 1693 + INTEGER(IntKi), PARAMETER :: M90N2FKye = 1694 + INTEGER(IntKi), PARAMETER :: M90N3FKye = 1695 + INTEGER(IntKi), PARAMETER :: M90N4FKye = 1696 + INTEGER(IntKi), PARAMETER :: M90N5FKye = 1697 + INTEGER(IntKi), PARAMETER :: M90N6FKye = 1698 + INTEGER(IntKi), PARAMETER :: M90N7FKye = 1699 + INTEGER(IntKi), PARAMETER :: M90N8FKye = 1700 + INTEGER(IntKi), PARAMETER :: M90N9FKye = 1701 + INTEGER(IntKi), PARAMETER :: M91N1FKye = 1702 + INTEGER(IntKi), PARAMETER :: M91N2FKye = 1703 + INTEGER(IntKi), PARAMETER :: M91N3FKye = 1704 + INTEGER(IntKi), PARAMETER :: M91N4FKye = 1705 + INTEGER(IntKi), PARAMETER :: M91N5FKye = 1706 + INTEGER(IntKi), PARAMETER :: M91N6FKye = 1707 + INTEGER(IntKi), PARAMETER :: M91N7FKye = 1708 + INTEGER(IntKi), PARAMETER :: M91N8FKye = 1709 + INTEGER(IntKi), PARAMETER :: M91N9FKye = 1710 + INTEGER(IntKi), PARAMETER :: M92N1FKye = 1711 + INTEGER(IntKi), PARAMETER :: M92N2FKye = 1712 + INTEGER(IntKi), PARAMETER :: M92N3FKye = 1713 + INTEGER(IntKi), PARAMETER :: M92N4FKye = 1714 + INTEGER(IntKi), PARAMETER :: M92N5FKye = 1715 + INTEGER(IntKi), PARAMETER :: M92N6FKye = 1716 + INTEGER(IntKi), PARAMETER :: M92N7FKye = 1717 + INTEGER(IntKi), PARAMETER :: M92N8FKye = 1718 + INTEGER(IntKi), PARAMETER :: M92N9FKye = 1719 + INTEGER(IntKi), PARAMETER :: M93N1FKye = 1720 + INTEGER(IntKi), PARAMETER :: M93N2FKye = 1721 + INTEGER(IntKi), PARAMETER :: M93N3FKye = 1722 + INTEGER(IntKi), PARAMETER :: M93N4FKye = 1723 + INTEGER(IntKi), PARAMETER :: M93N5FKye = 1724 + INTEGER(IntKi), PARAMETER :: M93N6FKye = 1725 + INTEGER(IntKi), PARAMETER :: M93N7FKye = 1726 + INTEGER(IntKi), PARAMETER :: M93N8FKye = 1727 + INTEGER(IntKi), PARAMETER :: M93N9FKye = 1728 + INTEGER(IntKi), PARAMETER :: M94N1FKye = 1729 + INTEGER(IntKi), PARAMETER :: M94N2FKye = 1730 + INTEGER(IntKi), PARAMETER :: M94N3FKye = 1731 + INTEGER(IntKi), PARAMETER :: M94N4FKye = 1732 + INTEGER(IntKi), PARAMETER :: M94N5FKye = 1733 + INTEGER(IntKi), PARAMETER :: M94N6FKye = 1734 + INTEGER(IntKi), PARAMETER :: M94N7FKye = 1735 + INTEGER(IntKi), PARAMETER :: M94N8FKye = 1736 + INTEGER(IntKi), PARAMETER :: M94N9FKye = 1737 + INTEGER(IntKi), PARAMETER :: M95N1FKye = 1738 + INTEGER(IntKi), PARAMETER :: M95N2FKye = 1739 + INTEGER(IntKi), PARAMETER :: M95N3FKye = 1740 + INTEGER(IntKi), PARAMETER :: M95N4FKye = 1741 + INTEGER(IntKi), PARAMETER :: M95N5FKye = 1742 + INTEGER(IntKi), PARAMETER :: M95N6FKye = 1743 + INTEGER(IntKi), PARAMETER :: M95N7FKye = 1744 + INTEGER(IntKi), PARAMETER :: M95N8FKye = 1745 + INTEGER(IntKi), PARAMETER :: M95N9FKye = 1746 + INTEGER(IntKi), PARAMETER :: M96N1FKye = 1747 + INTEGER(IntKi), PARAMETER :: M96N2FKye = 1748 + INTEGER(IntKi), PARAMETER :: M96N3FKye = 1749 + INTEGER(IntKi), PARAMETER :: M96N4FKye = 1750 + INTEGER(IntKi), PARAMETER :: M96N5FKye = 1751 + INTEGER(IntKi), PARAMETER :: M96N6FKye = 1752 + INTEGER(IntKi), PARAMETER :: M96N7FKye = 1753 + INTEGER(IntKi), PARAMETER :: M96N8FKye = 1754 + INTEGER(IntKi), PARAMETER :: M96N9FKye = 1755 + INTEGER(IntKi), PARAMETER :: M97N1FKye = 1756 + INTEGER(IntKi), PARAMETER :: M97N2FKye = 1757 + INTEGER(IntKi), PARAMETER :: M97N3FKye = 1758 + INTEGER(IntKi), PARAMETER :: M97N4FKye = 1759 + INTEGER(IntKi), PARAMETER :: M97N5FKye = 1760 + INTEGER(IntKi), PARAMETER :: M97N6FKye = 1761 + INTEGER(IntKi), PARAMETER :: M97N7FKye = 1762 + INTEGER(IntKi), PARAMETER :: M97N8FKye = 1763 + INTEGER(IntKi), PARAMETER :: M97N9FKye = 1764 + INTEGER(IntKi), PARAMETER :: M98N1FKye = 1765 + INTEGER(IntKi), PARAMETER :: M98N2FKye = 1766 + INTEGER(IntKi), PARAMETER :: M98N3FKye = 1767 + INTEGER(IntKi), PARAMETER :: M98N4FKye = 1768 + INTEGER(IntKi), PARAMETER :: M98N5FKye = 1769 + INTEGER(IntKi), PARAMETER :: M98N6FKye = 1770 + INTEGER(IntKi), PARAMETER :: M98N7FKye = 1771 + INTEGER(IntKi), PARAMETER :: M98N8FKye = 1772 + INTEGER(IntKi), PARAMETER :: M98N9FKye = 1773 + INTEGER(IntKi), PARAMETER :: M99N1FKye = 1774 + INTEGER(IntKi), PARAMETER :: M99N2FKye = 1775 + INTEGER(IntKi), PARAMETER :: M99N3FKye = 1776 + INTEGER(IntKi), PARAMETER :: M99N4FKye = 1777 + INTEGER(IntKi), PARAMETER :: M99N5FKye = 1778 + INTEGER(IntKi), PARAMETER :: M99N6FKye = 1779 + INTEGER(IntKi), PARAMETER :: M99N7FKye = 1780 + INTEGER(IntKi), PARAMETER :: M99N8FKye = 1781 + INTEGER(IntKi), PARAMETER :: M99N9FKye = 1782 + INTEGER(IntKi), PARAMETER :: M01N1FKze = 1783 + INTEGER(IntKi), PARAMETER :: M01N2FKze = 1784 + INTEGER(IntKi), PARAMETER :: M01N3FKze = 1785 + INTEGER(IntKi), PARAMETER :: M01N4FKze = 1786 + INTEGER(IntKi), PARAMETER :: M01N5FKze = 1787 + INTEGER(IntKi), PARAMETER :: M01N6FKze = 1788 + INTEGER(IntKi), PARAMETER :: M01N7FKze = 1789 + INTEGER(IntKi), PARAMETER :: M01N8FKze = 1790 + INTEGER(IntKi), PARAMETER :: M01N9FKze = 1791 + INTEGER(IntKi), PARAMETER :: M02N1FKze = 1792 + INTEGER(IntKi), PARAMETER :: M02N2FKze = 1793 + INTEGER(IntKi), PARAMETER :: M02N3FKze = 1794 + INTEGER(IntKi), PARAMETER :: M02N4FKze = 1795 + INTEGER(IntKi), PARAMETER :: M02N5FKze = 1796 + INTEGER(IntKi), PARAMETER :: M02N6FKze = 1797 + INTEGER(IntKi), PARAMETER :: M02N7FKze = 1798 + INTEGER(IntKi), PARAMETER :: M02N8FKze = 1799 + INTEGER(IntKi), PARAMETER :: M02N9FKze = 1800 + INTEGER(IntKi), PARAMETER :: M03N1FKze = 1801 + INTEGER(IntKi), PARAMETER :: M03N2FKze = 1802 + INTEGER(IntKi), PARAMETER :: M03N3FKze = 1803 + INTEGER(IntKi), PARAMETER :: M03N4FKze = 1804 + INTEGER(IntKi), PARAMETER :: M03N5FKze = 1805 + INTEGER(IntKi), PARAMETER :: M03N6FKze = 1806 + INTEGER(IntKi), PARAMETER :: M03N7FKze = 1807 + INTEGER(IntKi), PARAMETER :: M03N8FKze = 1808 + INTEGER(IntKi), PARAMETER :: M03N9FKze = 1809 + INTEGER(IntKi), PARAMETER :: M04N1FKze = 1810 + INTEGER(IntKi), PARAMETER :: M04N2FKze = 1811 + INTEGER(IntKi), PARAMETER :: M04N3FKze = 1812 + INTEGER(IntKi), PARAMETER :: M04N4FKze = 1813 + INTEGER(IntKi), PARAMETER :: M04N5FKze = 1814 + INTEGER(IntKi), PARAMETER :: M04N6FKze = 1815 + INTEGER(IntKi), PARAMETER :: M04N7FKze = 1816 + INTEGER(IntKi), PARAMETER :: M04N8FKze = 1817 + INTEGER(IntKi), PARAMETER :: M04N9FKze = 1818 + INTEGER(IntKi), PARAMETER :: M05N1FKze = 1819 + INTEGER(IntKi), PARAMETER :: M05N2FKze = 1820 + INTEGER(IntKi), PARAMETER :: M05N3FKze = 1821 + INTEGER(IntKi), PARAMETER :: M05N4FKze = 1822 + INTEGER(IntKi), PARAMETER :: M05N5FKze = 1823 + INTEGER(IntKi), PARAMETER :: M05N6FKze = 1824 + INTEGER(IntKi), PARAMETER :: M05N7FKze = 1825 + INTEGER(IntKi), PARAMETER :: M05N8FKze = 1826 + INTEGER(IntKi), PARAMETER :: M05N9FKze = 1827 + INTEGER(IntKi), PARAMETER :: M06N1FKze = 1828 + INTEGER(IntKi), PARAMETER :: M06N2FKze = 1829 + INTEGER(IntKi), PARAMETER :: M06N3FKze = 1830 + INTEGER(IntKi), PARAMETER :: M06N4FKze = 1831 + INTEGER(IntKi), PARAMETER :: M06N5FKze = 1832 + INTEGER(IntKi), PARAMETER :: M06N6FKze = 1833 + INTEGER(IntKi), PARAMETER :: M06N7FKze = 1834 + INTEGER(IntKi), PARAMETER :: M06N8FKze = 1835 + INTEGER(IntKi), PARAMETER :: M06N9FKze = 1836 + INTEGER(IntKi), PARAMETER :: M07N1FKze = 1837 + INTEGER(IntKi), PARAMETER :: M07N2FKze = 1838 + INTEGER(IntKi), PARAMETER :: M07N3FKze = 1839 + INTEGER(IntKi), PARAMETER :: M07N4FKze = 1840 + INTEGER(IntKi), PARAMETER :: M07N5FKze = 1841 + INTEGER(IntKi), PARAMETER :: M07N6FKze = 1842 + INTEGER(IntKi), PARAMETER :: M07N7FKze = 1843 + INTEGER(IntKi), PARAMETER :: M07N8FKze = 1844 + INTEGER(IntKi), PARAMETER :: M07N9FKze = 1845 + INTEGER(IntKi), PARAMETER :: M08N1FKze = 1846 + INTEGER(IntKi), PARAMETER :: M08N2FKze = 1847 + INTEGER(IntKi), PARAMETER :: M08N3FKze = 1848 + INTEGER(IntKi), PARAMETER :: M08N4FKze = 1849 + INTEGER(IntKi), PARAMETER :: M08N5FKze = 1850 + INTEGER(IntKi), PARAMETER :: M08N6FKze = 1851 + INTEGER(IntKi), PARAMETER :: M08N7FKze = 1852 + INTEGER(IntKi), PARAMETER :: M08N8FKze = 1853 + INTEGER(IntKi), PARAMETER :: M08N9FKze = 1854 + INTEGER(IntKi), PARAMETER :: M09N1FKze = 1855 + INTEGER(IntKi), PARAMETER :: M09N2FKze = 1856 + INTEGER(IntKi), PARAMETER :: M09N3FKze = 1857 + INTEGER(IntKi), PARAMETER :: M09N4FKze = 1858 + INTEGER(IntKi), PARAMETER :: M09N5FKze = 1859 + INTEGER(IntKi), PARAMETER :: M09N6FKze = 1860 + INTEGER(IntKi), PARAMETER :: M09N7FKze = 1861 + INTEGER(IntKi), PARAMETER :: M09N8FKze = 1862 + INTEGER(IntKi), PARAMETER :: M09N9FKze = 1863 + INTEGER(IntKi), PARAMETER :: M10N1FKze = 1864 + INTEGER(IntKi), PARAMETER :: M10N2FKze = 1865 + INTEGER(IntKi), PARAMETER :: M10N3FKze = 1866 + INTEGER(IntKi), PARAMETER :: M10N4FKze = 1867 + INTEGER(IntKi), PARAMETER :: M10N5FKze = 1868 + INTEGER(IntKi), PARAMETER :: M10N6FKze = 1869 + INTEGER(IntKi), PARAMETER :: M10N7FKze = 1870 + INTEGER(IntKi), PARAMETER :: M10N8FKze = 1871 + INTEGER(IntKi), PARAMETER :: M10N9FKze = 1872 + INTEGER(IntKi), PARAMETER :: M11N1FKze = 1873 + INTEGER(IntKi), PARAMETER :: M11N2FKze = 1874 + INTEGER(IntKi), PARAMETER :: M11N3FKze = 1875 + INTEGER(IntKi), PARAMETER :: M11N4FKze = 1876 + INTEGER(IntKi), PARAMETER :: M11N5FKze = 1877 + INTEGER(IntKi), PARAMETER :: M11N6FKze = 1878 + INTEGER(IntKi), PARAMETER :: M11N7FKze = 1879 + INTEGER(IntKi), PARAMETER :: M11N8FKze = 1880 + INTEGER(IntKi), PARAMETER :: M11N9FKze = 1881 + INTEGER(IntKi), PARAMETER :: M12N1FKze = 1882 + INTEGER(IntKi), PARAMETER :: M12N2FKze = 1883 + INTEGER(IntKi), PARAMETER :: M12N3FKze = 1884 + INTEGER(IntKi), PARAMETER :: M12N4FKze = 1885 + INTEGER(IntKi), PARAMETER :: M12N5FKze = 1886 + INTEGER(IntKi), PARAMETER :: M12N6FKze = 1887 + INTEGER(IntKi), PARAMETER :: M12N7FKze = 1888 + INTEGER(IntKi), PARAMETER :: M12N8FKze = 1889 + INTEGER(IntKi), PARAMETER :: M12N9FKze = 1890 + INTEGER(IntKi), PARAMETER :: M13N1FKze = 1891 + INTEGER(IntKi), PARAMETER :: M13N2FKze = 1892 + INTEGER(IntKi), PARAMETER :: M13N3FKze = 1893 + INTEGER(IntKi), PARAMETER :: M13N4FKze = 1894 + INTEGER(IntKi), PARAMETER :: M13N5FKze = 1895 + INTEGER(IntKi), PARAMETER :: M13N6FKze = 1896 + INTEGER(IntKi), PARAMETER :: M13N7FKze = 1897 + INTEGER(IntKi), PARAMETER :: M13N8FKze = 1898 + INTEGER(IntKi), PARAMETER :: M13N9FKze = 1899 + INTEGER(IntKi), PARAMETER :: M14N1FKze = 1900 + INTEGER(IntKi), PARAMETER :: M14N2FKze = 1901 + INTEGER(IntKi), PARAMETER :: M14N3FKze = 1902 + INTEGER(IntKi), PARAMETER :: M14N4FKze = 1903 + INTEGER(IntKi), PARAMETER :: M14N5FKze = 1904 + INTEGER(IntKi), PARAMETER :: M14N6FKze = 1905 + INTEGER(IntKi), PARAMETER :: M14N7FKze = 1906 + INTEGER(IntKi), PARAMETER :: M14N8FKze = 1907 + INTEGER(IntKi), PARAMETER :: M14N9FKze = 1908 + INTEGER(IntKi), PARAMETER :: M15N1FKze = 1909 + INTEGER(IntKi), PARAMETER :: M15N2FKze = 1910 + INTEGER(IntKi), PARAMETER :: M15N3FKze = 1911 + INTEGER(IntKi), PARAMETER :: M15N4FKze = 1912 + INTEGER(IntKi), PARAMETER :: M15N5FKze = 1913 + INTEGER(IntKi), PARAMETER :: M15N6FKze = 1914 + INTEGER(IntKi), PARAMETER :: M15N7FKze = 1915 + INTEGER(IntKi), PARAMETER :: M15N8FKze = 1916 + INTEGER(IntKi), PARAMETER :: M15N9FKze = 1917 + INTEGER(IntKi), PARAMETER :: M16N1FKze = 1918 + INTEGER(IntKi), PARAMETER :: M16N2FKze = 1919 + INTEGER(IntKi), PARAMETER :: M16N3FKze = 1920 + INTEGER(IntKi), PARAMETER :: M16N4FKze = 1921 + INTEGER(IntKi), PARAMETER :: M16N5FKze = 1922 + INTEGER(IntKi), PARAMETER :: M16N6FKze = 1923 + INTEGER(IntKi), PARAMETER :: M16N7FKze = 1924 + INTEGER(IntKi), PARAMETER :: M16N8FKze = 1925 + INTEGER(IntKi), PARAMETER :: M16N9FKze = 1926 + INTEGER(IntKi), PARAMETER :: M17N1FKze = 1927 + INTEGER(IntKi), PARAMETER :: M17N2FKze = 1928 + INTEGER(IntKi), PARAMETER :: M17N3FKze = 1929 + INTEGER(IntKi), PARAMETER :: M17N4FKze = 1930 + INTEGER(IntKi), PARAMETER :: M17N5FKze = 1931 + INTEGER(IntKi), PARAMETER :: M17N6FKze = 1932 + INTEGER(IntKi), PARAMETER :: M17N7FKze = 1933 + INTEGER(IntKi), PARAMETER :: M17N8FKze = 1934 + INTEGER(IntKi), PARAMETER :: M17N9FKze = 1935 + INTEGER(IntKi), PARAMETER :: M18N1FKze = 1936 + INTEGER(IntKi), PARAMETER :: M18N2FKze = 1937 + INTEGER(IntKi), PARAMETER :: M18N3FKze = 1938 + INTEGER(IntKi), PARAMETER :: M18N4FKze = 1939 + INTEGER(IntKi), PARAMETER :: M18N5FKze = 1940 + INTEGER(IntKi), PARAMETER :: M18N6FKze = 1941 + INTEGER(IntKi), PARAMETER :: M18N7FKze = 1942 + INTEGER(IntKi), PARAMETER :: M18N8FKze = 1943 + INTEGER(IntKi), PARAMETER :: M18N9FKze = 1944 + INTEGER(IntKi), PARAMETER :: M19N1FKze = 1945 + INTEGER(IntKi), PARAMETER :: M19N2FKze = 1946 + INTEGER(IntKi), PARAMETER :: M19N3FKze = 1947 + INTEGER(IntKi), PARAMETER :: M19N4FKze = 1948 + INTEGER(IntKi), PARAMETER :: M19N5FKze = 1949 + INTEGER(IntKi), PARAMETER :: M19N6FKze = 1950 + INTEGER(IntKi), PARAMETER :: M19N7FKze = 1951 + INTEGER(IntKi), PARAMETER :: M19N8FKze = 1952 + INTEGER(IntKi), PARAMETER :: M19N9FKze = 1953 + INTEGER(IntKi), PARAMETER :: M20N1FKze = 1954 + INTEGER(IntKi), PARAMETER :: M20N2FKze = 1955 + INTEGER(IntKi), PARAMETER :: M20N3FKze = 1956 + INTEGER(IntKi), PARAMETER :: M20N4FKze = 1957 + INTEGER(IntKi), PARAMETER :: M20N5FKze = 1958 + INTEGER(IntKi), PARAMETER :: M20N6FKze = 1959 + INTEGER(IntKi), PARAMETER :: M20N7FKze = 1960 + INTEGER(IntKi), PARAMETER :: M20N8FKze = 1961 + INTEGER(IntKi), PARAMETER :: M20N9FKze = 1962 + INTEGER(IntKi), PARAMETER :: M21N1FKze = 1963 + INTEGER(IntKi), PARAMETER :: M21N2FKze = 1964 + INTEGER(IntKi), PARAMETER :: M21N3FKze = 1965 + INTEGER(IntKi), PARAMETER :: M21N4FKze = 1966 + INTEGER(IntKi), PARAMETER :: M21N5FKze = 1967 + INTEGER(IntKi), PARAMETER :: M21N6FKze = 1968 + INTEGER(IntKi), PARAMETER :: M21N7FKze = 1969 + INTEGER(IntKi), PARAMETER :: M21N8FKze = 1970 + INTEGER(IntKi), PARAMETER :: M21N9FKze = 1971 + INTEGER(IntKi), PARAMETER :: M22N1FKze = 1972 + INTEGER(IntKi), PARAMETER :: M22N2FKze = 1973 + INTEGER(IntKi), PARAMETER :: M22N3FKze = 1974 + INTEGER(IntKi), PARAMETER :: M22N4FKze = 1975 + INTEGER(IntKi), PARAMETER :: M22N5FKze = 1976 + INTEGER(IntKi), PARAMETER :: M22N6FKze = 1977 + INTEGER(IntKi), PARAMETER :: M22N7FKze = 1978 + INTEGER(IntKi), PARAMETER :: M22N8FKze = 1979 + INTEGER(IntKi), PARAMETER :: M22N9FKze = 1980 + INTEGER(IntKi), PARAMETER :: M23N1FKze = 1981 + INTEGER(IntKi), PARAMETER :: M23N2FKze = 1982 + INTEGER(IntKi), PARAMETER :: M23N3FKze = 1983 + INTEGER(IntKi), PARAMETER :: M23N4FKze = 1984 + INTEGER(IntKi), PARAMETER :: M23N5FKze = 1985 + INTEGER(IntKi), PARAMETER :: M23N6FKze = 1986 + INTEGER(IntKi), PARAMETER :: M23N7FKze = 1987 + INTEGER(IntKi), PARAMETER :: M23N8FKze = 1988 + INTEGER(IntKi), PARAMETER :: M23N9FKze = 1989 + INTEGER(IntKi), PARAMETER :: M24N1FKze = 1990 + INTEGER(IntKi), PARAMETER :: M24N2FKze = 1991 + INTEGER(IntKi), PARAMETER :: M24N3FKze = 1992 + INTEGER(IntKi), PARAMETER :: M24N4FKze = 1993 + INTEGER(IntKi), PARAMETER :: M24N5FKze = 1994 + INTEGER(IntKi), PARAMETER :: M24N6FKze = 1995 + INTEGER(IntKi), PARAMETER :: M24N7FKze = 1996 + INTEGER(IntKi), PARAMETER :: M24N8FKze = 1997 + INTEGER(IntKi), PARAMETER :: M24N9FKze = 1998 + INTEGER(IntKi), PARAMETER :: M25N1FKze = 1999 + INTEGER(IntKi), PARAMETER :: M25N2FKze = 2000 + INTEGER(IntKi), PARAMETER :: M25N3FKze = 2001 + INTEGER(IntKi), PARAMETER :: M25N4FKze = 2002 + INTEGER(IntKi), PARAMETER :: M25N5FKze = 2003 + INTEGER(IntKi), PARAMETER :: M25N6FKze = 2004 + INTEGER(IntKi), PARAMETER :: M25N7FKze = 2005 + INTEGER(IntKi), PARAMETER :: M25N8FKze = 2006 + INTEGER(IntKi), PARAMETER :: M25N9FKze = 2007 + INTEGER(IntKi), PARAMETER :: M26N1FKze = 2008 + INTEGER(IntKi), PARAMETER :: M26N2FKze = 2009 + INTEGER(IntKi), PARAMETER :: M26N3FKze = 2010 + INTEGER(IntKi), PARAMETER :: M26N4FKze = 2011 + INTEGER(IntKi), PARAMETER :: M26N5FKze = 2012 + INTEGER(IntKi), PARAMETER :: M26N6FKze = 2013 + INTEGER(IntKi), PARAMETER :: M26N7FKze = 2014 + INTEGER(IntKi), PARAMETER :: M26N8FKze = 2015 + INTEGER(IntKi), PARAMETER :: M26N9FKze = 2016 + INTEGER(IntKi), PARAMETER :: M27N1FKze = 2017 + INTEGER(IntKi), PARAMETER :: M27N2FKze = 2018 + INTEGER(IntKi), PARAMETER :: M27N3FKze = 2019 + INTEGER(IntKi), PARAMETER :: M27N4FKze = 2020 + INTEGER(IntKi), PARAMETER :: M27N5FKze = 2021 + INTEGER(IntKi), PARAMETER :: M27N6FKze = 2022 + INTEGER(IntKi), PARAMETER :: M27N7FKze = 2023 + INTEGER(IntKi), PARAMETER :: M27N8FKze = 2024 + INTEGER(IntKi), PARAMETER :: M27N9FKze = 2025 + INTEGER(IntKi), PARAMETER :: M28N1FKze = 2026 + INTEGER(IntKi), PARAMETER :: M28N2FKze = 2027 + INTEGER(IntKi), PARAMETER :: M28N3FKze = 2028 + INTEGER(IntKi), PARAMETER :: M28N4FKze = 2029 + INTEGER(IntKi), PARAMETER :: M28N5FKze = 2030 + INTEGER(IntKi), PARAMETER :: M28N6FKze = 2031 + INTEGER(IntKi), PARAMETER :: M28N7FKze = 2032 + INTEGER(IntKi), PARAMETER :: M28N8FKze = 2033 + INTEGER(IntKi), PARAMETER :: M28N9FKze = 2034 + INTEGER(IntKi), PARAMETER :: M29N1FKze = 2035 + INTEGER(IntKi), PARAMETER :: M29N2FKze = 2036 + INTEGER(IntKi), PARAMETER :: M29N3FKze = 2037 + INTEGER(IntKi), PARAMETER :: M29N4FKze = 2038 + INTEGER(IntKi), PARAMETER :: M29N5FKze = 2039 + INTEGER(IntKi), PARAMETER :: M29N6FKze = 2040 + INTEGER(IntKi), PARAMETER :: M29N7FKze = 2041 + INTEGER(IntKi), PARAMETER :: M29N8FKze = 2042 + INTEGER(IntKi), PARAMETER :: M29N9FKze = 2043 + INTEGER(IntKi), PARAMETER :: M30N1FKze = 2044 + INTEGER(IntKi), PARAMETER :: M30N2FKze = 2045 + INTEGER(IntKi), PARAMETER :: M30N3FKze = 2046 + INTEGER(IntKi), PARAMETER :: M30N4FKze = 2047 + INTEGER(IntKi), PARAMETER :: M30N5FKze = 2048 + INTEGER(IntKi), PARAMETER :: M30N6FKze = 2049 + INTEGER(IntKi), PARAMETER :: M30N7FKze = 2050 + INTEGER(IntKi), PARAMETER :: M30N8FKze = 2051 + INTEGER(IntKi), PARAMETER :: M30N9FKze = 2052 + INTEGER(IntKi), PARAMETER :: M31N1FKze = 2053 + INTEGER(IntKi), PARAMETER :: M31N2FKze = 2054 + INTEGER(IntKi), PARAMETER :: M31N3FKze = 2055 + INTEGER(IntKi), PARAMETER :: M31N4FKze = 2056 + INTEGER(IntKi), PARAMETER :: M31N5FKze = 2057 + INTEGER(IntKi), PARAMETER :: M31N6FKze = 2058 + INTEGER(IntKi), PARAMETER :: M31N7FKze = 2059 + INTEGER(IntKi), PARAMETER :: M31N8FKze = 2060 + INTEGER(IntKi), PARAMETER :: M31N9FKze = 2061 + INTEGER(IntKi), PARAMETER :: M32N1FKze = 2062 + INTEGER(IntKi), PARAMETER :: M32N2FKze = 2063 + INTEGER(IntKi), PARAMETER :: M32N3FKze = 2064 + INTEGER(IntKi), PARAMETER :: M32N4FKze = 2065 + INTEGER(IntKi), PARAMETER :: M32N5FKze = 2066 + INTEGER(IntKi), PARAMETER :: M32N6FKze = 2067 + INTEGER(IntKi), PARAMETER :: M32N7FKze = 2068 + INTEGER(IntKi), PARAMETER :: M32N8FKze = 2069 + INTEGER(IntKi), PARAMETER :: M32N9FKze = 2070 + INTEGER(IntKi), PARAMETER :: M33N1FKze = 2071 + INTEGER(IntKi), PARAMETER :: M33N2FKze = 2072 + INTEGER(IntKi), PARAMETER :: M33N3FKze = 2073 + INTEGER(IntKi), PARAMETER :: M33N4FKze = 2074 + INTEGER(IntKi), PARAMETER :: M33N5FKze = 2075 + INTEGER(IntKi), PARAMETER :: M33N6FKze = 2076 + INTEGER(IntKi), PARAMETER :: M33N7FKze = 2077 + INTEGER(IntKi), PARAMETER :: M33N8FKze = 2078 + INTEGER(IntKi), PARAMETER :: M33N9FKze = 2079 + INTEGER(IntKi), PARAMETER :: M34N1FKze = 2080 + INTEGER(IntKi), PARAMETER :: M34N2FKze = 2081 + INTEGER(IntKi), PARAMETER :: M34N3FKze = 2082 + INTEGER(IntKi), PARAMETER :: M34N4FKze = 2083 + INTEGER(IntKi), PARAMETER :: M34N5FKze = 2084 + INTEGER(IntKi), PARAMETER :: M34N6FKze = 2085 + INTEGER(IntKi), PARAMETER :: M34N7FKze = 2086 + INTEGER(IntKi), PARAMETER :: M34N8FKze = 2087 + INTEGER(IntKi), PARAMETER :: M34N9FKze = 2088 + INTEGER(IntKi), PARAMETER :: M35N1FKze = 2089 + INTEGER(IntKi), PARAMETER :: M35N2FKze = 2090 + INTEGER(IntKi), PARAMETER :: M35N3FKze = 2091 + INTEGER(IntKi), PARAMETER :: M35N4FKze = 2092 + INTEGER(IntKi), PARAMETER :: M35N5FKze = 2093 + INTEGER(IntKi), PARAMETER :: M35N6FKze = 2094 + INTEGER(IntKi), PARAMETER :: M35N7FKze = 2095 + INTEGER(IntKi), PARAMETER :: M35N8FKze = 2096 + INTEGER(IntKi), PARAMETER :: M35N9FKze = 2097 + INTEGER(IntKi), PARAMETER :: M36N1FKze = 2098 + INTEGER(IntKi), PARAMETER :: M36N2FKze = 2099 + INTEGER(IntKi), PARAMETER :: M36N3FKze = 2100 + INTEGER(IntKi), PARAMETER :: M36N4FKze = 2101 + INTEGER(IntKi), PARAMETER :: M36N5FKze = 2102 + INTEGER(IntKi), PARAMETER :: M36N6FKze = 2103 + INTEGER(IntKi), PARAMETER :: M36N7FKze = 2104 + INTEGER(IntKi), PARAMETER :: M36N8FKze = 2105 + INTEGER(IntKi), PARAMETER :: M36N9FKze = 2106 + INTEGER(IntKi), PARAMETER :: M37N1FKze = 2107 + INTEGER(IntKi), PARAMETER :: M37N2FKze = 2108 + INTEGER(IntKi), PARAMETER :: M37N3FKze = 2109 + INTEGER(IntKi), PARAMETER :: M37N4FKze = 2110 + INTEGER(IntKi), PARAMETER :: M37N5FKze = 2111 + INTEGER(IntKi), PARAMETER :: M37N6FKze = 2112 + INTEGER(IntKi), PARAMETER :: M37N7FKze = 2113 + INTEGER(IntKi), PARAMETER :: M37N8FKze = 2114 + INTEGER(IntKi), PARAMETER :: M37N9FKze = 2115 + INTEGER(IntKi), PARAMETER :: M38N1FKze = 2116 + INTEGER(IntKi), PARAMETER :: M38N2FKze = 2117 + INTEGER(IntKi), PARAMETER :: M38N3FKze = 2118 + INTEGER(IntKi), PARAMETER :: M38N4FKze = 2119 + INTEGER(IntKi), PARAMETER :: M38N5FKze = 2120 + INTEGER(IntKi), PARAMETER :: M38N6FKze = 2121 + INTEGER(IntKi), PARAMETER :: M38N7FKze = 2122 + INTEGER(IntKi), PARAMETER :: M38N8FKze = 2123 + INTEGER(IntKi), PARAMETER :: M38N9FKze = 2124 + INTEGER(IntKi), PARAMETER :: M39N1FKze = 2125 + INTEGER(IntKi), PARAMETER :: M39N2FKze = 2126 + INTEGER(IntKi), PARAMETER :: M39N3FKze = 2127 + INTEGER(IntKi), PARAMETER :: M39N4FKze = 2128 + INTEGER(IntKi), PARAMETER :: M39N5FKze = 2129 + INTEGER(IntKi), PARAMETER :: M39N6FKze = 2130 + INTEGER(IntKi), PARAMETER :: M39N7FKze = 2131 + INTEGER(IntKi), PARAMETER :: M39N8FKze = 2132 + INTEGER(IntKi), PARAMETER :: M39N9FKze = 2133 + INTEGER(IntKi), PARAMETER :: M40N1FKze = 2134 + INTEGER(IntKi), PARAMETER :: M40N2FKze = 2135 + INTEGER(IntKi), PARAMETER :: M40N3FKze = 2136 + INTEGER(IntKi), PARAMETER :: M40N4FKze = 2137 + INTEGER(IntKi), PARAMETER :: M40N5FKze = 2138 + INTEGER(IntKi), PARAMETER :: M40N6FKze = 2139 + INTEGER(IntKi), PARAMETER :: M40N7FKze = 2140 + INTEGER(IntKi), PARAMETER :: M40N8FKze = 2141 + INTEGER(IntKi), PARAMETER :: M40N9FKze = 2142 + INTEGER(IntKi), PARAMETER :: M41N1FKze = 2143 + INTEGER(IntKi), PARAMETER :: M41N2FKze = 2144 + INTEGER(IntKi), PARAMETER :: M41N3FKze = 2145 + INTEGER(IntKi), PARAMETER :: M41N4FKze = 2146 + INTEGER(IntKi), PARAMETER :: M41N5FKze = 2147 + INTEGER(IntKi), PARAMETER :: M41N6FKze = 2148 + INTEGER(IntKi), PARAMETER :: M41N7FKze = 2149 + INTEGER(IntKi), PARAMETER :: M41N8FKze = 2150 + INTEGER(IntKi), PARAMETER :: M41N9FKze = 2151 + INTEGER(IntKi), PARAMETER :: M42N1FKze = 2152 + INTEGER(IntKi), PARAMETER :: M42N2FKze = 2153 + INTEGER(IntKi), PARAMETER :: M42N3FKze = 2154 + INTEGER(IntKi), PARAMETER :: M42N4FKze = 2155 + INTEGER(IntKi), PARAMETER :: M42N5FKze = 2156 + INTEGER(IntKi), PARAMETER :: M42N6FKze = 2157 + INTEGER(IntKi), PARAMETER :: M42N7FKze = 2158 + INTEGER(IntKi), PARAMETER :: M42N8FKze = 2159 + INTEGER(IntKi), PARAMETER :: M42N9FKze = 2160 + INTEGER(IntKi), PARAMETER :: M43N1FKze = 2161 + INTEGER(IntKi), PARAMETER :: M43N2FKze = 2162 + INTEGER(IntKi), PARAMETER :: M43N3FKze = 2163 + INTEGER(IntKi), PARAMETER :: M43N4FKze = 2164 + INTEGER(IntKi), PARAMETER :: M43N5FKze = 2165 + INTEGER(IntKi), PARAMETER :: M43N6FKze = 2166 + INTEGER(IntKi), PARAMETER :: M43N7FKze = 2167 + INTEGER(IntKi), PARAMETER :: M43N8FKze = 2168 + INTEGER(IntKi), PARAMETER :: M43N9FKze = 2169 + INTEGER(IntKi), PARAMETER :: M44N1FKze = 2170 + INTEGER(IntKi), PARAMETER :: M44N2FKze = 2171 + INTEGER(IntKi), PARAMETER :: M44N3FKze = 2172 + INTEGER(IntKi), PARAMETER :: M44N4FKze = 2173 + INTEGER(IntKi), PARAMETER :: M44N5FKze = 2174 + INTEGER(IntKi), PARAMETER :: M44N6FKze = 2175 + INTEGER(IntKi), PARAMETER :: M44N7FKze = 2176 + INTEGER(IntKi), PARAMETER :: M44N8FKze = 2177 + INTEGER(IntKi), PARAMETER :: M44N9FKze = 2178 + INTEGER(IntKi), PARAMETER :: M45N1FKze = 2179 + INTEGER(IntKi), PARAMETER :: M45N2FKze = 2180 + INTEGER(IntKi), PARAMETER :: M45N3FKze = 2181 + INTEGER(IntKi), PARAMETER :: M45N4FKze = 2182 + INTEGER(IntKi), PARAMETER :: M45N5FKze = 2183 + INTEGER(IntKi), PARAMETER :: M45N6FKze = 2184 + INTEGER(IntKi), PARAMETER :: M45N7FKze = 2185 + INTEGER(IntKi), PARAMETER :: M45N8FKze = 2186 + INTEGER(IntKi), PARAMETER :: M45N9FKze = 2187 + INTEGER(IntKi), PARAMETER :: M46N1FKze = 2188 + INTEGER(IntKi), PARAMETER :: M46N2FKze = 2189 + INTEGER(IntKi), PARAMETER :: M46N3FKze = 2190 + INTEGER(IntKi), PARAMETER :: M46N4FKze = 2191 + INTEGER(IntKi), PARAMETER :: M46N5FKze = 2192 + INTEGER(IntKi), PARAMETER :: M46N6FKze = 2193 + INTEGER(IntKi), PARAMETER :: M46N7FKze = 2194 + INTEGER(IntKi), PARAMETER :: M46N8FKze = 2195 + INTEGER(IntKi), PARAMETER :: M46N9FKze = 2196 + INTEGER(IntKi), PARAMETER :: M47N1FKze = 2197 + INTEGER(IntKi), PARAMETER :: M47N2FKze = 2198 + INTEGER(IntKi), PARAMETER :: M47N3FKze = 2199 + INTEGER(IntKi), PARAMETER :: M47N4FKze = 2200 + INTEGER(IntKi), PARAMETER :: M47N5FKze = 2201 + INTEGER(IntKi), PARAMETER :: M47N6FKze = 2202 + INTEGER(IntKi), PARAMETER :: M47N7FKze = 2203 + INTEGER(IntKi), PARAMETER :: M47N8FKze = 2204 + INTEGER(IntKi), PARAMETER :: M47N9FKze = 2205 + INTEGER(IntKi), PARAMETER :: M48N1FKze = 2206 + INTEGER(IntKi), PARAMETER :: M48N2FKze = 2207 + INTEGER(IntKi), PARAMETER :: M48N3FKze = 2208 + INTEGER(IntKi), PARAMETER :: M48N4FKze = 2209 + INTEGER(IntKi), PARAMETER :: M48N5FKze = 2210 + INTEGER(IntKi), PARAMETER :: M48N6FKze = 2211 + INTEGER(IntKi), PARAMETER :: M48N7FKze = 2212 + INTEGER(IntKi), PARAMETER :: M48N8FKze = 2213 + INTEGER(IntKi), PARAMETER :: M48N9FKze = 2214 + INTEGER(IntKi), PARAMETER :: M49N1FKze = 2215 + INTEGER(IntKi), PARAMETER :: M49N2FKze = 2216 + INTEGER(IntKi), PARAMETER :: M49N3FKze = 2217 + INTEGER(IntKi), PARAMETER :: M49N4FKze = 2218 + INTEGER(IntKi), PARAMETER :: M49N5FKze = 2219 + INTEGER(IntKi), PARAMETER :: M49N6FKze = 2220 + INTEGER(IntKi), PARAMETER :: M49N7FKze = 2221 + INTEGER(IntKi), PARAMETER :: M49N8FKze = 2222 + INTEGER(IntKi), PARAMETER :: M49N9FKze = 2223 + INTEGER(IntKi), PARAMETER :: M50N1FKze = 2224 + INTEGER(IntKi), PARAMETER :: M50N2FKze = 2225 + INTEGER(IntKi), PARAMETER :: M50N3FKze = 2226 + INTEGER(IntKi), PARAMETER :: M50N4FKze = 2227 + INTEGER(IntKi), PARAMETER :: M50N5FKze = 2228 + INTEGER(IntKi), PARAMETER :: M50N6FKze = 2229 + INTEGER(IntKi), PARAMETER :: M50N7FKze = 2230 + INTEGER(IntKi), PARAMETER :: M50N8FKze = 2231 + INTEGER(IntKi), PARAMETER :: M50N9FKze = 2232 + INTEGER(IntKi), PARAMETER :: M51N1FKze = 2233 + INTEGER(IntKi), PARAMETER :: M51N2FKze = 2234 + INTEGER(IntKi), PARAMETER :: M51N3FKze = 2235 + INTEGER(IntKi), PARAMETER :: M51N4FKze = 2236 + INTEGER(IntKi), PARAMETER :: M51N5FKze = 2237 + INTEGER(IntKi), PARAMETER :: M51N6FKze = 2238 + INTEGER(IntKi), PARAMETER :: M51N7FKze = 2239 + INTEGER(IntKi), PARAMETER :: M51N8FKze = 2240 + INTEGER(IntKi), PARAMETER :: M51N9FKze = 2241 + INTEGER(IntKi), PARAMETER :: M52N1FKze = 2242 + INTEGER(IntKi), PARAMETER :: M52N2FKze = 2243 + INTEGER(IntKi), PARAMETER :: M52N3FKze = 2244 + INTEGER(IntKi), PARAMETER :: M52N4FKze = 2245 + INTEGER(IntKi), PARAMETER :: M52N5FKze = 2246 + INTEGER(IntKi), PARAMETER :: M52N6FKze = 2247 + INTEGER(IntKi), PARAMETER :: M52N7FKze = 2248 + INTEGER(IntKi), PARAMETER :: M52N8FKze = 2249 + INTEGER(IntKi), PARAMETER :: M52N9FKze = 2250 + INTEGER(IntKi), PARAMETER :: M53N1FKze = 2251 + INTEGER(IntKi), PARAMETER :: M53N2FKze = 2252 + INTEGER(IntKi), PARAMETER :: M53N3FKze = 2253 + INTEGER(IntKi), PARAMETER :: M53N4FKze = 2254 + INTEGER(IntKi), PARAMETER :: M53N5FKze = 2255 + INTEGER(IntKi), PARAMETER :: M53N6FKze = 2256 + INTEGER(IntKi), PARAMETER :: M53N7FKze = 2257 + INTEGER(IntKi), PARAMETER :: M53N8FKze = 2258 + INTEGER(IntKi), PARAMETER :: M53N9FKze = 2259 + INTEGER(IntKi), PARAMETER :: M54N1FKze = 2260 + INTEGER(IntKi), PARAMETER :: M54N2FKze = 2261 + INTEGER(IntKi), PARAMETER :: M54N3FKze = 2262 + INTEGER(IntKi), PARAMETER :: M54N4FKze = 2263 + INTEGER(IntKi), PARAMETER :: M54N5FKze = 2264 + INTEGER(IntKi), PARAMETER :: M54N6FKze = 2265 + INTEGER(IntKi), PARAMETER :: M54N7FKze = 2266 + INTEGER(IntKi), PARAMETER :: M54N8FKze = 2267 + INTEGER(IntKi), PARAMETER :: M54N9FKze = 2268 + INTEGER(IntKi), PARAMETER :: M55N1FKze = 2269 + INTEGER(IntKi), PARAMETER :: M55N2FKze = 2270 + INTEGER(IntKi), PARAMETER :: M55N3FKze = 2271 + INTEGER(IntKi), PARAMETER :: M55N4FKze = 2272 + INTEGER(IntKi), PARAMETER :: M55N5FKze = 2273 + INTEGER(IntKi), PARAMETER :: M55N6FKze = 2274 + INTEGER(IntKi), PARAMETER :: M55N7FKze = 2275 + INTEGER(IntKi), PARAMETER :: M55N8FKze = 2276 + INTEGER(IntKi), PARAMETER :: M55N9FKze = 2277 + INTEGER(IntKi), PARAMETER :: M56N1FKze = 2278 + INTEGER(IntKi), PARAMETER :: M56N2FKze = 2279 + INTEGER(IntKi), PARAMETER :: M56N3FKze = 2280 + INTEGER(IntKi), PARAMETER :: M56N4FKze = 2281 + INTEGER(IntKi), PARAMETER :: M56N5FKze = 2282 + INTEGER(IntKi), PARAMETER :: M56N6FKze = 2283 + INTEGER(IntKi), PARAMETER :: M56N7FKze = 2284 + INTEGER(IntKi), PARAMETER :: M56N8FKze = 2285 + INTEGER(IntKi), PARAMETER :: M56N9FKze = 2286 + INTEGER(IntKi), PARAMETER :: M57N1FKze = 2287 + INTEGER(IntKi), PARAMETER :: M57N2FKze = 2288 + INTEGER(IntKi), PARAMETER :: M57N3FKze = 2289 + INTEGER(IntKi), PARAMETER :: M57N4FKze = 2290 + INTEGER(IntKi), PARAMETER :: M57N5FKze = 2291 + INTEGER(IntKi), PARAMETER :: M57N6FKze = 2292 + INTEGER(IntKi), PARAMETER :: M57N7FKze = 2293 + INTEGER(IntKi), PARAMETER :: M57N8FKze = 2294 + INTEGER(IntKi), PARAMETER :: M57N9FKze = 2295 + INTEGER(IntKi), PARAMETER :: M58N1FKze = 2296 + INTEGER(IntKi), PARAMETER :: M58N2FKze = 2297 + INTEGER(IntKi), PARAMETER :: M58N3FKze = 2298 + INTEGER(IntKi), PARAMETER :: M58N4FKze = 2299 + INTEGER(IntKi), PARAMETER :: M58N5FKze = 2300 + INTEGER(IntKi), PARAMETER :: M58N6FKze = 2301 + INTEGER(IntKi), PARAMETER :: M58N7FKze = 2302 + INTEGER(IntKi), PARAMETER :: M58N8FKze = 2303 + INTEGER(IntKi), PARAMETER :: M58N9FKze = 2304 + INTEGER(IntKi), PARAMETER :: M59N1FKze = 2305 + INTEGER(IntKi), PARAMETER :: M59N2FKze = 2306 + INTEGER(IntKi), PARAMETER :: M59N3FKze = 2307 + INTEGER(IntKi), PARAMETER :: M59N4FKze = 2308 + INTEGER(IntKi), PARAMETER :: M59N5FKze = 2309 + INTEGER(IntKi), PARAMETER :: M59N6FKze = 2310 + INTEGER(IntKi), PARAMETER :: M59N7FKze = 2311 + INTEGER(IntKi), PARAMETER :: M59N8FKze = 2312 + INTEGER(IntKi), PARAMETER :: M59N9FKze = 2313 + INTEGER(IntKi), PARAMETER :: M60N1FKze = 2314 + INTEGER(IntKi), PARAMETER :: M60N2FKze = 2315 + INTEGER(IntKi), PARAMETER :: M60N3FKze = 2316 + INTEGER(IntKi), PARAMETER :: M60N4FKze = 2317 + INTEGER(IntKi), PARAMETER :: M60N5FKze = 2318 + INTEGER(IntKi), PARAMETER :: M60N6FKze = 2319 + INTEGER(IntKi), PARAMETER :: M60N7FKze = 2320 + INTEGER(IntKi), PARAMETER :: M60N8FKze = 2321 + INTEGER(IntKi), PARAMETER :: M60N9FKze = 2322 + INTEGER(IntKi), PARAMETER :: M61N1FKze = 2323 + INTEGER(IntKi), PARAMETER :: M61N2FKze = 2324 + INTEGER(IntKi), PARAMETER :: M61N3FKze = 2325 + INTEGER(IntKi), PARAMETER :: M61N4FKze = 2326 + INTEGER(IntKi), PARAMETER :: M61N5FKze = 2327 + INTEGER(IntKi), PARAMETER :: M61N6FKze = 2328 + INTEGER(IntKi), PARAMETER :: M61N7FKze = 2329 + INTEGER(IntKi), PARAMETER :: M61N8FKze = 2330 + INTEGER(IntKi), PARAMETER :: M61N9FKze = 2331 + INTEGER(IntKi), PARAMETER :: M62N1FKze = 2332 + INTEGER(IntKi), PARAMETER :: M62N2FKze = 2333 + INTEGER(IntKi), PARAMETER :: M62N3FKze = 2334 + INTEGER(IntKi), PARAMETER :: M62N4FKze = 2335 + INTEGER(IntKi), PARAMETER :: M62N5FKze = 2336 + INTEGER(IntKi), PARAMETER :: M62N6FKze = 2337 + INTEGER(IntKi), PARAMETER :: M62N7FKze = 2338 + INTEGER(IntKi), PARAMETER :: M62N8FKze = 2339 + INTEGER(IntKi), PARAMETER :: M62N9FKze = 2340 + INTEGER(IntKi), PARAMETER :: M63N1FKze = 2341 + INTEGER(IntKi), PARAMETER :: M63N2FKze = 2342 + INTEGER(IntKi), PARAMETER :: M63N3FKze = 2343 + INTEGER(IntKi), PARAMETER :: M63N4FKze = 2344 + INTEGER(IntKi), PARAMETER :: M63N5FKze = 2345 + INTEGER(IntKi), PARAMETER :: M63N6FKze = 2346 + INTEGER(IntKi), PARAMETER :: M63N7FKze = 2347 + INTEGER(IntKi), PARAMETER :: M63N8FKze = 2348 + INTEGER(IntKi), PARAMETER :: M63N9FKze = 2349 + INTEGER(IntKi), PARAMETER :: M64N1FKze = 2350 + INTEGER(IntKi), PARAMETER :: M64N2FKze = 2351 + INTEGER(IntKi), PARAMETER :: M64N3FKze = 2352 + INTEGER(IntKi), PARAMETER :: M64N4FKze = 2353 + INTEGER(IntKi), PARAMETER :: M64N5FKze = 2354 + INTEGER(IntKi), PARAMETER :: M64N6FKze = 2355 + INTEGER(IntKi), PARAMETER :: M64N7FKze = 2356 + INTEGER(IntKi), PARAMETER :: M64N8FKze = 2357 + INTEGER(IntKi), PARAMETER :: M64N9FKze = 2358 + INTEGER(IntKi), PARAMETER :: M65N1FKze = 2359 + INTEGER(IntKi), PARAMETER :: M65N2FKze = 2360 + INTEGER(IntKi), PARAMETER :: M65N3FKze = 2361 + INTEGER(IntKi), PARAMETER :: M65N4FKze = 2362 + INTEGER(IntKi), PARAMETER :: M65N5FKze = 2363 + INTEGER(IntKi), PARAMETER :: M65N6FKze = 2364 + INTEGER(IntKi), PARAMETER :: M65N7FKze = 2365 + INTEGER(IntKi), PARAMETER :: M65N8FKze = 2366 + INTEGER(IntKi), PARAMETER :: M65N9FKze = 2367 + INTEGER(IntKi), PARAMETER :: M66N1FKze = 2368 + INTEGER(IntKi), PARAMETER :: M66N2FKze = 2369 + INTEGER(IntKi), PARAMETER :: M66N3FKze = 2370 + INTEGER(IntKi), PARAMETER :: M66N4FKze = 2371 + INTEGER(IntKi), PARAMETER :: M66N5FKze = 2372 + INTEGER(IntKi), PARAMETER :: M66N6FKze = 2373 + INTEGER(IntKi), PARAMETER :: M66N7FKze = 2374 + INTEGER(IntKi), PARAMETER :: M66N8FKze = 2375 + INTEGER(IntKi), PARAMETER :: M66N9FKze = 2376 + INTEGER(IntKi), PARAMETER :: M67N1FKze = 2377 + INTEGER(IntKi), PARAMETER :: M67N2FKze = 2378 + INTEGER(IntKi), PARAMETER :: M67N3FKze = 2379 + INTEGER(IntKi), PARAMETER :: M67N4FKze = 2380 + INTEGER(IntKi), PARAMETER :: M67N5FKze = 2381 + INTEGER(IntKi), PARAMETER :: M67N6FKze = 2382 + INTEGER(IntKi), PARAMETER :: M67N7FKze = 2383 + INTEGER(IntKi), PARAMETER :: M67N8FKze = 2384 + INTEGER(IntKi), PARAMETER :: M67N9FKze = 2385 + INTEGER(IntKi), PARAMETER :: M68N1FKze = 2386 + INTEGER(IntKi), PARAMETER :: M68N2FKze = 2387 + INTEGER(IntKi), PARAMETER :: M68N3FKze = 2388 + INTEGER(IntKi), PARAMETER :: M68N4FKze = 2389 + INTEGER(IntKi), PARAMETER :: M68N5FKze = 2390 + INTEGER(IntKi), PARAMETER :: M68N6FKze = 2391 + INTEGER(IntKi), PARAMETER :: M68N7FKze = 2392 + INTEGER(IntKi), PARAMETER :: M68N8FKze = 2393 + INTEGER(IntKi), PARAMETER :: M68N9FKze = 2394 + INTEGER(IntKi), PARAMETER :: M69N1FKze = 2395 + INTEGER(IntKi), PARAMETER :: M69N2FKze = 2396 + INTEGER(IntKi), PARAMETER :: M69N3FKze = 2397 + INTEGER(IntKi), PARAMETER :: M69N4FKze = 2398 + INTEGER(IntKi), PARAMETER :: M69N5FKze = 2399 + INTEGER(IntKi), PARAMETER :: M69N6FKze = 2400 + INTEGER(IntKi), PARAMETER :: M69N7FKze = 2401 + INTEGER(IntKi), PARAMETER :: M69N8FKze = 2402 + INTEGER(IntKi), PARAMETER :: M69N9FKze = 2403 + INTEGER(IntKi), PARAMETER :: M70N1FKze = 2404 + INTEGER(IntKi), PARAMETER :: M70N2FKze = 2405 + INTEGER(IntKi), PARAMETER :: M70N3FKze = 2406 + INTEGER(IntKi), PARAMETER :: M70N4FKze = 2407 + INTEGER(IntKi), PARAMETER :: M70N5FKze = 2408 + INTEGER(IntKi), PARAMETER :: M70N6FKze = 2409 + INTEGER(IntKi), PARAMETER :: M70N7FKze = 2410 + INTEGER(IntKi), PARAMETER :: M70N8FKze = 2411 + INTEGER(IntKi), PARAMETER :: M70N9FKze = 2412 + INTEGER(IntKi), PARAMETER :: M71N1FKze = 2413 + INTEGER(IntKi), PARAMETER :: M71N2FKze = 2414 + INTEGER(IntKi), PARAMETER :: M71N3FKze = 2415 + INTEGER(IntKi), PARAMETER :: M71N4FKze = 2416 + INTEGER(IntKi), PARAMETER :: M71N5FKze = 2417 + INTEGER(IntKi), PARAMETER :: M71N6FKze = 2418 + INTEGER(IntKi), PARAMETER :: M71N7FKze = 2419 + INTEGER(IntKi), PARAMETER :: M71N8FKze = 2420 + INTEGER(IntKi), PARAMETER :: M71N9FKze = 2421 + INTEGER(IntKi), PARAMETER :: M72N1FKze = 2422 + INTEGER(IntKi), PARAMETER :: M72N2FKze = 2423 + INTEGER(IntKi), PARAMETER :: M72N3FKze = 2424 + INTEGER(IntKi), PARAMETER :: M72N4FKze = 2425 + INTEGER(IntKi), PARAMETER :: M72N5FKze = 2426 + INTEGER(IntKi), PARAMETER :: M72N6FKze = 2427 + INTEGER(IntKi), PARAMETER :: M72N7FKze = 2428 + INTEGER(IntKi), PARAMETER :: M72N8FKze = 2429 + INTEGER(IntKi), PARAMETER :: M72N9FKze = 2430 + INTEGER(IntKi), PARAMETER :: M73N1FKze = 2431 + INTEGER(IntKi), PARAMETER :: M73N2FKze = 2432 + INTEGER(IntKi), PARAMETER :: M73N3FKze = 2433 + INTEGER(IntKi), PARAMETER :: M73N4FKze = 2434 + INTEGER(IntKi), PARAMETER :: M73N5FKze = 2435 + INTEGER(IntKi), PARAMETER :: M73N6FKze = 2436 + INTEGER(IntKi), PARAMETER :: M73N7FKze = 2437 + INTEGER(IntKi), PARAMETER :: M73N8FKze = 2438 + INTEGER(IntKi), PARAMETER :: M73N9FKze = 2439 + INTEGER(IntKi), PARAMETER :: M74N1FKze = 2440 + INTEGER(IntKi), PARAMETER :: M74N2FKze = 2441 + INTEGER(IntKi), PARAMETER :: M74N3FKze = 2442 + INTEGER(IntKi), PARAMETER :: M74N4FKze = 2443 + INTEGER(IntKi), PARAMETER :: M74N5FKze = 2444 + INTEGER(IntKi), PARAMETER :: M74N6FKze = 2445 + INTEGER(IntKi), PARAMETER :: M74N7FKze = 2446 + INTEGER(IntKi), PARAMETER :: M74N8FKze = 2447 + INTEGER(IntKi), PARAMETER :: M74N9FKze = 2448 + INTEGER(IntKi), PARAMETER :: M75N1FKze = 2449 + INTEGER(IntKi), PARAMETER :: M75N2FKze = 2450 + INTEGER(IntKi), PARAMETER :: M75N3FKze = 2451 + INTEGER(IntKi), PARAMETER :: M75N4FKze = 2452 + INTEGER(IntKi), PARAMETER :: M75N5FKze = 2453 + INTEGER(IntKi), PARAMETER :: M75N6FKze = 2454 + INTEGER(IntKi), PARAMETER :: M75N7FKze = 2455 + INTEGER(IntKi), PARAMETER :: M75N8FKze = 2456 + INTEGER(IntKi), PARAMETER :: M75N9FKze = 2457 + INTEGER(IntKi), PARAMETER :: M76N1FKze = 2458 + INTEGER(IntKi), PARAMETER :: M76N2FKze = 2459 + INTEGER(IntKi), PARAMETER :: M76N3FKze = 2460 + INTEGER(IntKi), PARAMETER :: M76N4FKze = 2461 + INTEGER(IntKi), PARAMETER :: M76N5FKze = 2462 + INTEGER(IntKi), PARAMETER :: M76N6FKze = 2463 + INTEGER(IntKi), PARAMETER :: M76N7FKze = 2464 + INTEGER(IntKi), PARAMETER :: M76N8FKze = 2465 + INTEGER(IntKi), PARAMETER :: M76N9FKze = 2466 + INTEGER(IntKi), PARAMETER :: M77N1FKze = 2467 + INTEGER(IntKi), PARAMETER :: M77N2FKze = 2468 + INTEGER(IntKi), PARAMETER :: M77N3FKze = 2469 + INTEGER(IntKi), PARAMETER :: M77N4FKze = 2470 + INTEGER(IntKi), PARAMETER :: M77N5FKze = 2471 + INTEGER(IntKi), PARAMETER :: M77N6FKze = 2472 + INTEGER(IntKi), PARAMETER :: M77N7FKze = 2473 + INTEGER(IntKi), PARAMETER :: M77N8FKze = 2474 + INTEGER(IntKi), PARAMETER :: M77N9FKze = 2475 + INTEGER(IntKi), PARAMETER :: M78N1FKze = 2476 + INTEGER(IntKi), PARAMETER :: M78N2FKze = 2477 + INTEGER(IntKi), PARAMETER :: M78N3FKze = 2478 + INTEGER(IntKi), PARAMETER :: M78N4FKze = 2479 + INTEGER(IntKi), PARAMETER :: M78N5FKze = 2480 + INTEGER(IntKi), PARAMETER :: M78N6FKze = 2481 + INTEGER(IntKi), PARAMETER :: M78N7FKze = 2482 + INTEGER(IntKi), PARAMETER :: M78N8FKze = 2483 + INTEGER(IntKi), PARAMETER :: M78N9FKze = 2484 + INTEGER(IntKi), PARAMETER :: M79N1FKze = 2485 + INTEGER(IntKi), PARAMETER :: M79N2FKze = 2486 + INTEGER(IntKi), PARAMETER :: M79N3FKze = 2487 + INTEGER(IntKi), PARAMETER :: M79N4FKze = 2488 + INTEGER(IntKi), PARAMETER :: M79N5FKze = 2489 + INTEGER(IntKi), PARAMETER :: M79N6FKze = 2490 + INTEGER(IntKi), PARAMETER :: M79N7FKze = 2491 + INTEGER(IntKi), PARAMETER :: M79N8FKze = 2492 + INTEGER(IntKi), PARAMETER :: M79N9FKze = 2493 + INTEGER(IntKi), PARAMETER :: M80N1FKze = 2494 + INTEGER(IntKi), PARAMETER :: M80N2FKze = 2495 + INTEGER(IntKi), PARAMETER :: M80N3FKze = 2496 + INTEGER(IntKi), PARAMETER :: M80N4FKze = 2497 + INTEGER(IntKi), PARAMETER :: M80N5FKze = 2498 + INTEGER(IntKi), PARAMETER :: M80N6FKze = 2499 + INTEGER(IntKi), PARAMETER :: M80N7FKze = 2500 + INTEGER(IntKi), PARAMETER :: M80N8FKze = 2501 + INTEGER(IntKi), PARAMETER :: M80N9FKze = 2502 + INTEGER(IntKi), PARAMETER :: M81N1FKze = 2503 + INTEGER(IntKi), PARAMETER :: M81N2FKze = 2504 + INTEGER(IntKi), PARAMETER :: M81N3FKze = 2505 + INTEGER(IntKi), PARAMETER :: M81N4FKze = 2506 + INTEGER(IntKi), PARAMETER :: M81N5FKze = 2507 + INTEGER(IntKi), PARAMETER :: M81N6FKze = 2508 + INTEGER(IntKi), PARAMETER :: M81N7FKze = 2509 + INTEGER(IntKi), PARAMETER :: M81N8FKze = 2510 + INTEGER(IntKi), PARAMETER :: M81N9FKze = 2511 + INTEGER(IntKi), PARAMETER :: M82N1FKze = 2512 + INTEGER(IntKi), PARAMETER :: M82N2FKze = 2513 + INTEGER(IntKi), PARAMETER :: M82N3FKze = 2514 + INTEGER(IntKi), PARAMETER :: M82N4FKze = 2515 + INTEGER(IntKi), PARAMETER :: M82N5FKze = 2516 + INTEGER(IntKi), PARAMETER :: M82N6FKze = 2517 + INTEGER(IntKi), PARAMETER :: M82N7FKze = 2518 + INTEGER(IntKi), PARAMETER :: M82N8FKze = 2519 + INTEGER(IntKi), PARAMETER :: M82N9FKze = 2520 + INTEGER(IntKi), PARAMETER :: M83N1FKze = 2521 + INTEGER(IntKi), PARAMETER :: M83N2FKze = 2522 + INTEGER(IntKi), PARAMETER :: M83N3FKze = 2523 + INTEGER(IntKi), PARAMETER :: M83N4FKze = 2524 + INTEGER(IntKi), PARAMETER :: M83N5FKze = 2525 + INTEGER(IntKi), PARAMETER :: M83N6FKze = 2526 + INTEGER(IntKi), PARAMETER :: M83N7FKze = 2527 + INTEGER(IntKi), PARAMETER :: M83N8FKze = 2528 + INTEGER(IntKi), PARAMETER :: M83N9FKze = 2529 + INTEGER(IntKi), PARAMETER :: M84N1FKze = 2530 + INTEGER(IntKi), PARAMETER :: M84N2FKze = 2531 + INTEGER(IntKi), PARAMETER :: M84N3FKze = 2532 + INTEGER(IntKi), PARAMETER :: M84N4FKze = 2533 + INTEGER(IntKi), PARAMETER :: M84N5FKze = 2534 + INTEGER(IntKi), PARAMETER :: M84N6FKze = 2535 + INTEGER(IntKi), PARAMETER :: M84N7FKze = 2536 + INTEGER(IntKi), PARAMETER :: M84N8FKze = 2537 + INTEGER(IntKi), PARAMETER :: M84N9FKze = 2538 + INTEGER(IntKi), PARAMETER :: M85N1FKze = 2539 + INTEGER(IntKi), PARAMETER :: M85N2FKze = 2540 + INTEGER(IntKi), PARAMETER :: M85N3FKze = 2541 + INTEGER(IntKi), PARAMETER :: M85N4FKze = 2542 + INTEGER(IntKi), PARAMETER :: M85N5FKze = 2543 + INTEGER(IntKi), PARAMETER :: M85N6FKze = 2544 + INTEGER(IntKi), PARAMETER :: M85N7FKze = 2545 + INTEGER(IntKi), PARAMETER :: M85N8FKze = 2546 + INTEGER(IntKi), PARAMETER :: M85N9FKze = 2547 + INTEGER(IntKi), PARAMETER :: M86N1FKze = 2548 + INTEGER(IntKi), PARAMETER :: M86N2FKze = 2549 + INTEGER(IntKi), PARAMETER :: M86N3FKze = 2550 + INTEGER(IntKi), PARAMETER :: M86N4FKze = 2551 + INTEGER(IntKi), PARAMETER :: M86N5FKze = 2552 + INTEGER(IntKi), PARAMETER :: M86N6FKze = 2553 + INTEGER(IntKi), PARAMETER :: M86N7FKze = 2554 + INTEGER(IntKi), PARAMETER :: M86N8FKze = 2555 + INTEGER(IntKi), PARAMETER :: M86N9FKze = 2556 + INTEGER(IntKi), PARAMETER :: M87N1FKze = 2557 + INTEGER(IntKi), PARAMETER :: M87N2FKze = 2558 + INTEGER(IntKi), PARAMETER :: M87N3FKze = 2559 + INTEGER(IntKi), PARAMETER :: M87N4FKze = 2560 + INTEGER(IntKi), PARAMETER :: M87N5FKze = 2561 + INTEGER(IntKi), PARAMETER :: M87N6FKze = 2562 + INTEGER(IntKi), PARAMETER :: M87N7FKze = 2563 + INTEGER(IntKi), PARAMETER :: M87N8FKze = 2564 + INTEGER(IntKi), PARAMETER :: M87N9FKze = 2565 + INTEGER(IntKi), PARAMETER :: M88N1FKze = 2566 + INTEGER(IntKi), PARAMETER :: M88N2FKze = 2567 + INTEGER(IntKi), PARAMETER :: M88N3FKze = 2568 + INTEGER(IntKi), PARAMETER :: M88N4FKze = 2569 + INTEGER(IntKi), PARAMETER :: M88N5FKze = 2570 + INTEGER(IntKi), PARAMETER :: M88N6FKze = 2571 + INTEGER(IntKi), PARAMETER :: M88N7FKze = 2572 + INTEGER(IntKi), PARAMETER :: M88N8FKze = 2573 + INTEGER(IntKi), PARAMETER :: M88N9FKze = 2574 + INTEGER(IntKi), PARAMETER :: M89N1FKze = 2575 + INTEGER(IntKi), PARAMETER :: M89N2FKze = 2576 + INTEGER(IntKi), PARAMETER :: M89N3FKze = 2577 + INTEGER(IntKi), PARAMETER :: M89N4FKze = 2578 + INTEGER(IntKi), PARAMETER :: M89N5FKze = 2579 + INTEGER(IntKi), PARAMETER :: M89N6FKze = 2580 + INTEGER(IntKi), PARAMETER :: M89N7FKze = 2581 + INTEGER(IntKi), PARAMETER :: M89N8FKze = 2582 + INTEGER(IntKi), PARAMETER :: M89N9FKze = 2583 + INTEGER(IntKi), PARAMETER :: M90N1FKze = 2584 + INTEGER(IntKi), PARAMETER :: M90N2FKze = 2585 + INTEGER(IntKi), PARAMETER :: M90N3FKze = 2586 + INTEGER(IntKi), PARAMETER :: M90N4FKze = 2587 + INTEGER(IntKi), PARAMETER :: M90N5FKze = 2588 + INTEGER(IntKi), PARAMETER :: M90N6FKze = 2589 + INTEGER(IntKi), PARAMETER :: M90N7FKze = 2590 + INTEGER(IntKi), PARAMETER :: M90N8FKze = 2591 + INTEGER(IntKi), PARAMETER :: M90N9FKze = 2592 + INTEGER(IntKi), PARAMETER :: M91N1FKze = 2593 + INTEGER(IntKi), PARAMETER :: M91N2FKze = 2594 + INTEGER(IntKi), PARAMETER :: M91N3FKze = 2595 + INTEGER(IntKi), PARAMETER :: M91N4FKze = 2596 + INTEGER(IntKi), PARAMETER :: M91N5FKze = 2597 + INTEGER(IntKi), PARAMETER :: M91N6FKze = 2598 + INTEGER(IntKi), PARAMETER :: M91N7FKze = 2599 + INTEGER(IntKi), PARAMETER :: M91N8FKze = 2600 + INTEGER(IntKi), PARAMETER :: M91N9FKze = 2601 + INTEGER(IntKi), PARAMETER :: M92N1FKze = 2602 + INTEGER(IntKi), PARAMETER :: M92N2FKze = 2603 + INTEGER(IntKi), PARAMETER :: M92N3FKze = 2604 + INTEGER(IntKi), PARAMETER :: M92N4FKze = 2605 + INTEGER(IntKi), PARAMETER :: M92N5FKze = 2606 + INTEGER(IntKi), PARAMETER :: M92N6FKze = 2607 + INTEGER(IntKi), PARAMETER :: M92N7FKze = 2608 + INTEGER(IntKi), PARAMETER :: M92N8FKze = 2609 + INTEGER(IntKi), PARAMETER :: M92N9FKze = 2610 + INTEGER(IntKi), PARAMETER :: M93N1FKze = 2611 + INTEGER(IntKi), PARAMETER :: M93N2FKze = 2612 + INTEGER(IntKi), PARAMETER :: M93N3FKze = 2613 + INTEGER(IntKi), PARAMETER :: M93N4FKze = 2614 + INTEGER(IntKi), PARAMETER :: M93N5FKze = 2615 + INTEGER(IntKi), PARAMETER :: M93N6FKze = 2616 + INTEGER(IntKi), PARAMETER :: M93N7FKze = 2617 + INTEGER(IntKi), PARAMETER :: M93N8FKze = 2618 + INTEGER(IntKi), PARAMETER :: M93N9FKze = 2619 + INTEGER(IntKi), PARAMETER :: M94N1FKze = 2620 + INTEGER(IntKi), PARAMETER :: M94N2FKze = 2621 + INTEGER(IntKi), PARAMETER :: M94N3FKze = 2622 + INTEGER(IntKi), PARAMETER :: M94N4FKze = 2623 + INTEGER(IntKi), PARAMETER :: M94N5FKze = 2624 + INTEGER(IntKi), PARAMETER :: M94N6FKze = 2625 + INTEGER(IntKi), PARAMETER :: M94N7FKze = 2626 + INTEGER(IntKi), PARAMETER :: M94N8FKze = 2627 + INTEGER(IntKi), PARAMETER :: M94N9FKze = 2628 + INTEGER(IntKi), PARAMETER :: M95N1FKze = 2629 + INTEGER(IntKi), PARAMETER :: M95N2FKze = 2630 + INTEGER(IntKi), PARAMETER :: M95N3FKze = 2631 + INTEGER(IntKi), PARAMETER :: M95N4FKze = 2632 + INTEGER(IntKi), PARAMETER :: M95N5FKze = 2633 + INTEGER(IntKi), PARAMETER :: M95N6FKze = 2634 + INTEGER(IntKi), PARAMETER :: M95N7FKze = 2635 + INTEGER(IntKi), PARAMETER :: M95N8FKze = 2636 + INTEGER(IntKi), PARAMETER :: M95N9FKze = 2637 + INTEGER(IntKi), PARAMETER :: M96N1FKze = 2638 + INTEGER(IntKi), PARAMETER :: M96N2FKze = 2639 + INTEGER(IntKi), PARAMETER :: M96N3FKze = 2640 + INTEGER(IntKi), PARAMETER :: M96N4FKze = 2641 + INTEGER(IntKi), PARAMETER :: M96N5FKze = 2642 + INTEGER(IntKi), PARAMETER :: M96N6FKze = 2643 + INTEGER(IntKi), PARAMETER :: M96N7FKze = 2644 + INTEGER(IntKi), PARAMETER :: M96N8FKze = 2645 + INTEGER(IntKi), PARAMETER :: M96N9FKze = 2646 + INTEGER(IntKi), PARAMETER :: M97N1FKze = 2647 + INTEGER(IntKi), PARAMETER :: M97N2FKze = 2648 + INTEGER(IntKi), PARAMETER :: M97N3FKze = 2649 + INTEGER(IntKi), PARAMETER :: M97N4FKze = 2650 + INTEGER(IntKi), PARAMETER :: M97N5FKze = 2651 + INTEGER(IntKi), PARAMETER :: M97N6FKze = 2652 + INTEGER(IntKi), PARAMETER :: M97N7FKze = 2653 + INTEGER(IntKi), PARAMETER :: M97N8FKze = 2654 + INTEGER(IntKi), PARAMETER :: M97N9FKze = 2655 + INTEGER(IntKi), PARAMETER :: M98N1FKze = 2656 + INTEGER(IntKi), PARAMETER :: M98N2FKze = 2657 + INTEGER(IntKi), PARAMETER :: M98N3FKze = 2658 + INTEGER(IntKi), PARAMETER :: M98N4FKze = 2659 + INTEGER(IntKi), PARAMETER :: M98N5FKze = 2660 + INTEGER(IntKi), PARAMETER :: M98N6FKze = 2661 + INTEGER(IntKi), PARAMETER :: M98N7FKze = 2662 + INTEGER(IntKi), PARAMETER :: M98N8FKze = 2663 + INTEGER(IntKi), PARAMETER :: M98N9FKze = 2664 + INTEGER(IntKi), PARAMETER :: M99N1FKze = 2665 + INTEGER(IntKi), PARAMETER :: M99N2FKze = 2666 + INTEGER(IntKi), PARAMETER :: M99N3FKze = 2667 + INTEGER(IntKi), PARAMETER :: M99N4FKze = 2668 + INTEGER(IntKi), PARAMETER :: M99N5FKze = 2669 + INTEGER(IntKi), PARAMETER :: M99N6FKze = 2670 + INTEGER(IntKi), PARAMETER :: M99N7FKze = 2671 + INTEGER(IntKi), PARAMETER :: M99N8FKze = 2672 + INTEGER(IntKi), PARAMETER :: M99N9FKze = 2673 + INTEGER(IntKi), PARAMETER :: M01N1FMxe = 2674 + INTEGER(IntKi), PARAMETER :: M01N2FMxe = 2675 + INTEGER(IntKi), PARAMETER :: M01N3FMxe = 2676 + INTEGER(IntKi), PARAMETER :: M01N4FMxe = 2677 + INTEGER(IntKi), PARAMETER :: M01N5FMxe = 2678 + INTEGER(IntKi), PARAMETER :: M01N6FMxe = 2679 + INTEGER(IntKi), PARAMETER :: M01N7FMxe = 2680 + INTEGER(IntKi), PARAMETER :: M01N8FMxe = 2681 + INTEGER(IntKi), PARAMETER :: M01N9FMxe = 2682 + INTEGER(IntKi), PARAMETER :: M02N1FMxe = 2683 + INTEGER(IntKi), PARAMETER :: M02N2FMxe = 2684 + INTEGER(IntKi), PARAMETER :: M02N3FMxe = 2685 + INTEGER(IntKi), PARAMETER :: M02N4FMxe = 2686 + INTEGER(IntKi), PARAMETER :: M02N5FMxe = 2687 + INTEGER(IntKi), PARAMETER :: M02N6FMxe = 2688 + INTEGER(IntKi), PARAMETER :: M02N7FMxe = 2689 + INTEGER(IntKi), PARAMETER :: M02N8FMxe = 2690 + INTEGER(IntKi), PARAMETER :: M02N9FMxe = 2691 + INTEGER(IntKi), PARAMETER :: M03N1FMxe = 2692 + INTEGER(IntKi), PARAMETER :: M03N2FMxe = 2693 + INTEGER(IntKi), PARAMETER :: M03N3FMxe = 2694 + INTEGER(IntKi), PARAMETER :: M03N4FMxe = 2695 + INTEGER(IntKi), PARAMETER :: M03N5FMxe = 2696 + INTEGER(IntKi), PARAMETER :: M03N6FMxe = 2697 + INTEGER(IntKi), PARAMETER :: M03N7FMxe = 2698 + INTEGER(IntKi), PARAMETER :: M03N8FMxe = 2699 + INTEGER(IntKi), PARAMETER :: M03N9FMxe = 2700 + INTEGER(IntKi), PARAMETER :: M04N1FMxe = 2701 + INTEGER(IntKi), PARAMETER :: M04N2FMxe = 2702 + INTEGER(IntKi), PARAMETER :: M04N3FMxe = 2703 + INTEGER(IntKi), PARAMETER :: M04N4FMxe = 2704 + INTEGER(IntKi), PARAMETER :: M04N5FMxe = 2705 + INTEGER(IntKi), PARAMETER :: M04N6FMxe = 2706 + INTEGER(IntKi), PARAMETER :: M04N7FMxe = 2707 + INTEGER(IntKi), PARAMETER :: M04N8FMxe = 2708 + INTEGER(IntKi), PARAMETER :: M04N9FMxe = 2709 + INTEGER(IntKi), PARAMETER :: M05N1FMxe = 2710 + INTEGER(IntKi), PARAMETER :: M05N2FMxe = 2711 + INTEGER(IntKi), PARAMETER :: M05N3FMxe = 2712 + INTEGER(IntKi), PARAMETER :: M05N4FMxe = 2713 + INTEGER(IntKi), PARAMETER :: M05N5FMxe = 2714 + INTEGER(IntKi), PARAMETER :: M05N6FMxe = 2715 + INTEGER(IntKi), PARAMETER :: M05N7FMxe = 2716 + INTEGER(IntKi), PARAMETER :: M05N8FMxe = 2717 + INTEGER(IntKi), PARAMETER :: M05N9FMxe = 2718 + INTEGER(IntKi), PARAMETER :: M06N1FMxe = 2719 + INTEGER(IntKi), PARAMETER :: M06N2FMxe = 2720 + INTEGER(IntKi), PARAMETER :: M06N3FMxe = 2721 + INTEGER(IntKi), PARAMETER :: M06N4FMxe = 2722 + INTEGER(IntKi), PARAMETER :: M06N5FMxe = 2723 + INTEGER(IntKi), PARAMETER :: M06N6FMxe = 2724 + INTEGER(IntKi), PARAMETER :: M06N7FMxe = 2725 + INTEGER(IntKi), PARAMETER :: M06N8FMxe = 2726 + INTEGER(IntKi), PARAMETER :: M06N9FMxe = 2727 + INTEGER(IntKi), PARAMETER :: M07N1FMxe = 2728 + INTEGER(IntKi), PARAMETER :: M07N2FMxe = 2729 + INTEGER(IntKi), PARAMETER :: M07N3FMxe = 2730 + INTEGER(IntKi), PARAMETER :: M07N4FMxe = 2731 + INTEGER(IntKi), PARAMETER :: M07N5FMxe = 2732 + INTEGER(IntKi), PARAMETER :: M07N6FMxe = 2733 + INTEGER(IntKi), PARAMETER :: M07N7FMxe = 2734 + INTEGER(IntKi), PARAMETER :: M07N8FMxe = 2735 + INTEGER(IntKi), PARAMETER :: M07N9FMxe = 2736 + INTEGER(IntKi), PARAMETER :: M08N1FMxe = 2737 + INTEGER(IntKi), PARAMETER :: M08N2FMxe = 2738 + INTEGER(IntKi), PARAMETER :: M08N3FMxe = 2739 + INTEGER(IntKi), PARAMETER :: M08N4FMxe = 2740 + INTEGER(IntKi), PARAMETER :: M08N5FMxe = 2741 + INTEGER(IntKi), PARAMETER :: M08N6FMxe = 2742 + INTEGER(IntKi), PARAMETER :: M08N7FMxe = 2743 + INTEGER(IntKi), PARAMETER :: M08N8FMxe = 2744 + INTEGER(IntKi), PARAMETER :: M08N9FMxe = 2745 + INTEGER(IntKi), PARAMETER :: M09N1FMxe = 2746 + INTEGER(IntKi), PARAMETER :: M09N2FMxe = 2747 + INTEGER(IntKi), PARAMETER :: M09N3FMxe = 2748 + INTEGER(IntKi), PARAMETER :: M09N4FMxe = 2749 + INTEGER(IntKi), PARAMETER :: M09N5FMxe = 2750 + INTEGER(IntKi), PARAMETER :: M09N6FMxe = 2751 + INTEGER(IntKi), PARAMETER :: M09N7FMxe = 2752 + INTEGER(IntKi), PARAMETER :: M09N8FMxe = 2753 + INTEGER(IntKi), PARAMETER :: M09N9FMxe = 2754 + INTEGER(IntKi), PARAMETER :: M10N1FMxe = 2755 + INTEGER(IntKi), PARAMETER :: M10N2FMxe = 2756 + INTEGER(IntKi), PARAMETER :: M10N3FMxe = 2757 + INTEGER(IntKi), PARAMETER :: M10N4FMxe = 2758 + INTEGER(IntKi), PARAMETER :: M10N5FMxe = 2759 + INTEGER(IntKi), PARAMETER :: M10N6FMxe = 2760 + INTEGER(IntKi), PARAMETER :: M10N7FMxe = 2761 + INTEGER(IntKi), PARAMETER :: M10N8FMxe = 2762 + INTEGER(IntKi), PARAMETER :: M10N9FMxe = 2763 + INTEGER(IntKi), PARAMETER :: M11N1FMxe = 2764 + INTEGER(IntKi), PARAMETER :: M11N2FMxe = 2765 + INTEGER(IntKi), PARAMETER :: M11N3FMxe = 2766 + INTEGER(IntKi), PARAMETER :: M11N4FMxe = 2767 + INTEGER(IntKi), PARAMETER :: M11N5FMxe = 2768 + INTEGER(IntKi), PARAMETER :: M11N6FMxe = 2769 + INTEGER(IntKi), PARAMETER :: M11N7FMxe = 2770 + INTEGER(IntKi), PARAMETER :: M11N8FMxe = 2771 + INTEGER(IntKi), PARAMETER :: M11N9FMxe = 2772 + INTEGER(IntKi), PARAMETER :: M12N1FMxe = 2773 + INTEGER(IntKi), PARAMETER :: M12N2FMxe = 2774 + INTEGER(IntKi), PARAMETER :: M12N3FMxe = 2775 + INTEGER(IntKi), PARAMETER :: M12N4FMxe = 2776 + INTEGER(IntKi), PARAMETER :: M12N5FMxe = 2777 + INTEGER(IntKi), PARAMETER :: M12N6FMxe = 2778 + INTEGER(IntKi), PARAMETER :: M12N7FMxe = 2779 + INTEGER(IntKi), PARAMETER :: M12N8FMxe = 2780 + INTEGER(IntKi), PARAMETER :: M12N9FMxe = 2781 + INTEGER(IntKi), PARAMETER :: M13N1FMxe = 2782 + INTEGER(IntKi), PARAMETER :: M13N2FMxe = 2783 + INTEGER(IntKi), PARAMETER :: M13N3FMxe = 2784 + INTEGER(IntKi), PARAMETER :: M13N4FMxe = 2785 + INTEGER(IntKi), PARAMETER :: M13N5FMxe = 2786 + INTEGER(IntKi), PARAMETER :: M13N6FMxe = 2787 + INTEGER(IntKi), PARAMETER :: M13N7FMxe = 2788 + INTEGER(IntKi), PARAMETER :: M13N8FMxe = 2789 + INTEGER(IntKi), PARAMETER :: M13N9FMxe = 2790 + INTEGER(IntKi), PARAMETER :: M14N1FMxe = 2791 + INTEGER(IntKi), PARAMETER :: M14N2FMxe = 2792 + INTEGER(IntKi), PARAMETER :: M14N3FMxe = 2793 + INTEGER(IntKi), PARAMETER :: M14N4FMxe = 2794 + INTEGER(IntKi), PARAMETER :: M14N5FMxe = 2795 + INTEGER(IntKi), PARAMETER :: M14N6FMxe = 2796 + INTEGER(IntKi), PARAMETER :: M14N7FMxe = 2797 + INTEGER(IntKi), PARAMETER :: M14N8FMxe = 2798 + INTEGER(IntKi), PARAMETER :: M14N9FMxe = 2799 + INTEGER(IntKi), PARAMETER :: M15N1FMxe = 2800 + INTEGER(IntKi), PARAMETER :: M15N2FMxe = 2801 + INTEGER(IntKi), PARAMETER :: M15N3FMxe = 2802 + INTEGER(IntKi), PARAMETER :: M15N4FMxe = 2803 + INTEGER(IntKi), PARAMETER :: M15N5FMxe = 2804 + INTEGER(IntKi), PARAMETER :: M15N6FMxe = 2805 + INTEGER(IntKi), PARAMETER :: M15N7FMxe = 2806 + INTEGER(IntKi), PARAMETER :: M15N8FMxe = 2807 + INTEGER(IntKi), PARAMETER :: M15N9FMxe = 2808 + INTEGER(IntKi), PARAMETER :: M16N1FMxe = 2809 + INTEGER(IntKi), PARAMETER :: M16N2FMxe = 2810 + INTEGER(IntKi), PARAMETER :: M16N3FMxe = 2811 + INTEGER(IntKi), PARAMETER :: M16N4FMxe = 2812 + INTEGER(IntKi), PARAMETER :: M16N5FMxe = 2813 + INTEGER(IntKi), PARAMETER :: M16N6FMxe = 2814 + INTEGER(IntKi), PARAMETER :: M16N7FMxe = 2815 + INTEGER(IntKi), PARAMETER :: M16N8FMxe = 2816 + INTEGER(IntKi), PARAMETER :: M16N9FMxe = 2817 + INTEGER(IntKi), PARAMETER :: M17N1FMxe = 2818 + INTEGER(IntKi), PARAMETER :: M17N2FMxe = 2819 + INTEGER(IntKi), PARAMETER :: M17N3FMxe = 2820 + INTEGER(IntKi), PARAMETER :: M17N4FMxe = 2821 + INTEGER(IntKi), PARAMETER :: M17N5FMxe = 2822 + INTEGER(IntKi), PARAMETER :: M17N6FMxe = 2823 + INTEGER(IntKi), PARAMETER :: M17N7FMxe = 2824 + INTEGER(IntKi), PARAMETER :: M17N8FMxe = 2825 + INTEGER(IntKi), PARAMETER :: M17N9FMxe = 2826 + INTEGER(IntKi), PARAMETER :: M18N1FMxe = 2827 + INTEGER(IntKi), PARAMETER :: M18N2FMxe = 2828 + INTEGER(IntKi), PARAMETER :: M18N3FMxe = 2829 + INTEGER(IntKi), PARAMETER :: M18N4FMxe = 2830 + INTEGER(IntKi), PARAMETER :: M18N5FMxe = 2831 + INTEGER(IntKi), PARAMETER :: M18N6FMxe = 2832 + INTEGER(IntKi), PARAMETER :: M18N7FMxe = 2833 + INTEGER(IntKi), PARAMETER :: M18N8FMxe = 2834 + INTEGER(IntKi), PARAMETER :: M18N9FMxe = 2835 + INTEGER(IntKi), PARAMETER :: M19N1FMxe = 2836 + INTEGER(IntKi), PARAMETER :: M19N2FMxe = 2837 + INTEGER(IntKi), PARAMETER :: M19N3FMxe = 2838 + INTEGER(IntKi), PARAMETER :: M19N4FMxe = 2839 + INTEGER(IntKi), PARAMETER :: M19N5FMxe = 2840 + INTEGER(IntKi), PARAMETER :: M19N6FMxe = 2841 + INTEGER(IntKi), PARAMETER :: M19N7FMxe = 2842 + INTEGER(IntKi), PARAMETER :: M19N8FMxe = 2843 + INTEGER(IntKi), PARAMETER :: M19N9FMxe = 2844 + INTEGER(IntKi), PARAMETER :: M20N1FMxe = 2845 + INTEGER(IntKi), PARAMETER :: M20N2FMxe = 2846 + INTEGER(IntKi), PARAMETER :: M20N3FMxe = 2847 + INTEGER(IntKi), PARAMETER :: M20N4FMxe = 2848 + INTEGER(IntKi), PARAMETER :: M20N5FMxe = 2849 + INTEGER(IntKi), PARAMETER :: M20N6FMxe = 2850 + INTEGER(IntKi), PARAMETER :: M20N7FMxe = 2851 + INTEGER(IntKi), PARAMETER :: M20N8FMxe = 2852 + INTEGER(IntKi), PARAMETER :: M20N9FMxe = 2853 + INTEGER(IntKi), PARAMETER :: M21N1FMxe = 2854 + INTEGER(IntKi), PARAMETER :: M21N2FMxe = 2855 + INTEGER(IntKi), PARAMETER :: M21N3FMxe = 2856 + INTEGER(IntKi), PARAMETER :: M21N4FMxe = 2857 + INTEGER(IntKi), PARAMETER :: M21N5FMxe = 2858 + INTEGER(IntKi), PARAMETER :: M21N6FMxe = 2859 + INTEGER(IntKi), PARAMETER :: M21N7FMxe = 2860 + INTEGER(IntKi), PARAMETER :: M21N8FMxe = 2861 + INTEGER(IntKi), PARAMETER :: M21N9FMxe = 2862 + INTEGER(IntKi), PARAMETER :: M22N1FMxe = 2863 + INTEGER(IntKi), PARAMETER :: M22N2FMxe = 2864 + INTEGER(IntKi), PARAMETER :: M22N3FMxe = 2865 + INTEGER(IntKi), PARAMETER :: M22N4FMxe = 2866 + INTEGER(IntKi), PARAMETER :: M22N5FMxe = 2867 + INTEGER(IntKi), PARAMETER :: M22N6FMxe = 2868 + INTEGER(IntKi), PARAMETER :: M22N7FMxe = 2869 + INTEGER(IntKi), PARAMETER :: M22N8FMxe = 2870 + INTEGER(IntKi), PARAMETER :: M22N9FMxe = 2871 + INTEGER(IntKi), PARAMETER :: M23N1FMxe = 2872 + INTEGER(IntKi), PARAMETER :: M23N2FMxe = 2873 + INTEGER(IntKi), PARAMETER :: M23N3FMxe = 2874 + INTEGER(IntKi), PARAMETER :: M23N4FMxe = 2875 + INTEGER(IntKi), PARAMETER :: M23N5FMxe = 2876 + INTEGER(IntKi), PARAMETER :: M23N6FMxe = 2877 + INTEGER(IntKi), PARAMETER :: M23N7FMxe = 2878 + INTEGER(IntKi), PARAMETER :: M23N8FMxe = 2879 + INTEGER(IntKi), PARAMETER :: M23N9FMxe = 2880 + INTEGER(IntKi), PARAMETER :: M24N1FMxe = 2881 + INTEGER(IntKi), PARAMETER :: M24N2FMxe = 2882 + INTEGER(IntKi), PARAMETER :: M24N3FMxe = 2883 + INTEGER(IntKi), PARAMETER :: M24N4FMxe = 2884 + INTEGER(IntKi), PARAMETER :: M24N5FMxe = 2885 + INTEGER(IntKi), PARAMETER :: M24N6FMxe = 2886 + INTEGER(IntKi), PARAMETER :: M24N7FMxe = 2887 + INTEGER(IntKi), PARAMETER :: M24N8FMxe = 2888 + INTEGER(IntKi), PARAMETER :: M24N9FMxe = 2889 + INTEGER(IntKi), PARAMETER :: M25N1FMxe = 2890 + INTEGER(IntKi), PARAMETER :: M25N2FMxe = 2891 + INTEGER(IntKi), PARAMETER :: M25N3FMxe = 2892 + INTEGER(IntKi), PARAMETER :: M25N4FMxe = 2893 + INTEGER(IntKi), PARAMETER :: M25N5FMxe = 2894 + INTEGER(IntKi), PARAMETER :: M25N6FMxe = 2895 + INTEGER(IntKi), PARAMETER :: M25N7FMxe = 2896 + INTEGER(IntKi), PARAMETER :: M25N8FMxe = 2897 + INTEGER(IntKi), PARAMETER :: M25N9FMxe = 2898 + INTEGER(IntKi), PARAMETER :: M26N1FMxe = 2899 + INTEGER(IntKi), PARAMETER :: M26N2FMxe = 2900 + INTEGER(IntKi), PARAMETER :: M26N3FMxe = 2901 + INTEGER(IntKi), PARAMETER :: M26N4FMxe = 2902 + INTEGER(IntKi), PARAMETER :: M26N5FMxe = 2903 + INTEGER(IntKi), PARAMETER :: M26N6FMxe = 2904 + INTEGER(IntKi), PARAMETER :: M26N7FMxe = 2905 + INTEGER(IntKi), PARAMETER :: M26N8FMxe = 2906 + INTEGER(IntKi), PARAMETER :: M26N9FMxe = 2907 + INTEGER(IntKi), PARAMETER :: M27N1FMxe = 2908 + INTEGER(IntKi), PARAMETER :: M27N2FMxe = 2909 + INTEGER(IntKi), PARAMETER :: M27N3FMxe = 2910 + INTEGER(IntKi), PARAMETER :: M27N4FMxe = 2911 + INTEGER(IntKi), PARAMETER :: M27N5FMxe = 2912 + INTEGER(IntKi), PARAMETER :: M27N6FMxe = 2913 + INTEGER(IntKi), PARAMETER :: M27N7FMxe = 2914 + INTEGER(IntKi), PARAMETER :: M27N8FMxe = 2915 + INTEGER(IntKi), PARAMETER :: M27N9FMxe = 2916 + INTEGER(IntKi), PARAMETER :: M28N1FMxe = 2917 + INTEGER(IntKi), PARAMETER :: M28N2FMxe = 2918 + INTEGER(IntKi), PARAMETER :: M28N3FMxe = 2919 + INTEGER(IntKi), PARAMETER :: M28N4FMxe = 2920 + INTEGER(IntKi), PARAMETER :: M28N5FMxe = 2921 + INTEGER(IntKi), PARAMETER :: M28N6FMxe = 2922 + INTEGER(IntKi), PARAMETER :: M28N7FMxe = 2923 + INTEGER(IntKi), PARAMETER :: M28N8FMxe = 2924 + INTEGER(IntKi), PARAMETER :: M28N9FMxe = 2925 + INTEGER(IntKi), PARAMETER :: M29N1FMxe = 2926 + INTEGER(IntKi), PARAMETER :: M29N2FMxe = 2927 + INTEGER(IntKi), PARAMETER :: M29N3FMxe = 2928 + INTEGER(IntKi), PARAMETER :: M29N4FMxe = 2929 + INTEGER(IntKi), PARAMETER :: M29N5FMxe = 2930 + INTEGER(IntKi), PARAMETER :: M29N6FMxe = 2931 + INTEGER(IntKi), PARAMETER :: M29N7FMxe = 2932 + INTEGER(IntKi), PARAMETER :: M29N8FMxe = 2933 + INTEGER(IntKi), PARAMETER :: M29N9FMxe = 2934 + INTEGER(IntKi), PARAMETER :: M30N1FMxe = 2935 + INTEGER(IntKi), PARAMETER :: M30N2FMxe = 2936 + INTEGER(IntKi), PARAMETER :: M30N3FMxe = 2937 + INTEGER(IntKi), PARAMETER :: M30N4FMxe = 2938 + INTEGER(IntKi), PARAMETER :: M30N5FMxe = 2939 + INTEGER(IntKi), PARAMETER :: M30N6FMxe = 2940 + INTEGER(IntKi), PARAMETER :: M30N7FMxe = 2941 + INTEGER(IntKi), PARAMETER :: M30N8FMxe = 2942 + INTEGER(IntKi), PARAMETER :: M30N9FMxe = 2943 + INTEGER(IntKi), PARAMETER :: M31N1FMxe = 2944 + INTEGER(IntKi), PARAMETER :: M31N2FMxe = 2945 + INTEGER(IntKi), PARAMETER :: M31N3FMxe = 2946 + INTEGER(IntKi), PARAMETER :: M31N4FMxe = 2947 + INTEGER(IntKi), PARAMETER :: M31N5FMxe = 2948 + INTEGER(IntKi), PARAMETER :: M31N6FMxe = 2949 + INTEGER(IntKi), PARAMETER :: M31N7FMxe = 2950 + INTEGER(IntKi), PARAMETER :: M31N8FMxe = 2951 + INTEGER(IntKi), PARAMETER :: M31N9FMxe = 2952 + INTEGER(IntKi), PARAMETER :: M32N1FMxe = 2953 + INTEGER(IntKi), PARAMETER :: M32N2FMxe = 2954 + INTEGER(IntKi), PARAMETER :: M32N3FMxe = 2955 + INTEGER(IntKi), PARAMETER :: M32N4FMxe = 2956 + INTEGER(IntKi), PARAMETER :: M32N5FMxe = 2957 + INTEGER(IntKi), PARAMETER :: M32N6FMxe = 2958 + INTEGER(IntKi), PARAMETER :: M32N7FMxe = 2959 + INTEGER(IntKi), PARAMETER :: M32N8FMxe = 2960 + INTEGER(IntKi), PARAMETER :: M32N9FMxe = 2961 + INTEGER(IntKi), PARAMETER :: M33N1FMxe = 2962 + INTEGER(IntKi), PARAMETER :: M33N2FMxe = 2963 + INTEGER(IntKi), PARAMETER :: M33N3FMxe = 2964 + INTEGER(IntKi), PARAMETER :: M33N4FMxe = 2965 + INTEGER(IntKi), PARAMETER :: M33N5FMxe = 2966 + INTEGER(IntKi), PARAMETER :: M33N6FMxe = 2967 + INTEGER(IntKi), PARAMETER :: M33N7FMxe = 2968 + INTEGER(IntKi), PARAMETER :: M33N8FMxe = 2969 + INTEGER(IntKi), PARAMETER :: M33N9FMxe = 2970 + INTEGER(IntKi), PARAMETER :: M34N1FMxe = 2971 + INTEGER(IntKi), PARAMETER :: M34N2FMxe = 2972 + INTEGER(IntKi), PARAMETER :: M34N3FMxe = 2973 + INTEGER(IntKi), PARAMETER :: M34N4FMxe = 2974 + INTEGER(IntKi), PARAMETER :: M34N5FMxe = 2975 + INTEGER(IntKi), PARAMETER :: M34N6FMxe = 2976 + INTEGER(IntKi), PARAMETER :: M34N7FMxe = 2977 + INTEGER(IntKi), PARAMETER :: M34N8FMxe = 2978 + INTEGER(IntKi), PARAMETER :: M34N9FMxe = 2979 + INTEGER(IntKi), PARAMETER :: M35N1FMxe = 2980 + INTEGER(IntKi), PARAMETER :: M35N2FMxe = 2981 + INTEGER(IntKi), PARAMETER :: M35N3FMxe = 2982 + INTEGER(IntKi), PARAMETER :: M35N4FMxe = 2983 + INTEGER(IntKi), PARAMETER :: M35N5FMxe = 2984 + INTEGER(IntKi), PARAMETER :: M35N6FMxe = 2985 + INTEGER(IntKi), PARAMETER :: M35N7FMxe = 2986 + INTEGER(IntKi), PARAMETER :: M35N8FMxe = 2987 + INTEGER(IntKi), PARAMETER :: M35N9FMxe = 2988 + INTEGER(IntKi), PARAMETER :: M36N1FMxe = 2989 + INTEGER(IntKi), PARAMETER :: M36N2FMxe = 2990 + INTEGER(IntKi), PARAMETER :: M36N3FMxe = 2991 + INTEGER(IntKi), PARAMETER :: M36N4FMxe = 2992 + INTEGER(IntKi), PARAMETER :: M36N5FMxe = 2993 + INTEGER(IntKi), PARAMETER :: M36N6FMxe = 2994 + INTEGER(IntKi), PARAMETER :: M36N7FMxe = 2995 + INTEGER(IntKi), PARAMETER :: M36N8FMxe = 2996 + INTEGER(IntKi), PARAMETER :: M36N9FMxe = 2997 + INTEGER(IntKi), PARAMETER :: M37N1FMxe = 2998 + INTEGER(IntKi), PARAMETER :: M37N2FMxe = 2999 + INTEGER(IntKi), PARAMETER :: M37N3FMxe = 3000 + INTEGER(IntKi), PARAMETER :: M37N4FMxe = 3001 + INTEGER(IntKi), PARAMETER :: M37N5FMxe = 3002 + INTEGER(IntKi), PARAMETER :: M37N6FMxe = 3003 + INTEGER(IntKi), PARAMETER :: M37N7FMxe = 3004 + INTEGER(IntKi), PARAMETER :: M37N8FMxe = 3005 + INTEGER(IntKi), PARAMETER :: M37N9FMxe = 3006 + INTEGER(IntKi), PARAMETER :: M38N1FMxe = 3007 + INTEGER(IntKi), PARAMETER :: M38N2FMxe = 3008 + INTEGER(IntKi), PARAMETER :: M38N3FMxe = 3009 + INTEGER(IntKi), PARAMETER :: M38N4FMxe = 3010 + INTEGER(IntKi), PARAMETER :: M38N5FMxe = 3011 + INTEGER(IntKi), PARAMETER :: M38N6FMxe = 3012 + INTEGER(IntKi), PARAMETER :: M38N7FMxe = 3013 + INTEGER(IntKi), PARAMETER :: M38N8FMxe = 3014 + INTEGER(IntKi), PARAMETER :: M38N9FMxe = 3015 + INTEGER(IntKi), PARAMETER :: M39N1FMxe = 3016 + INTEGER(IntKi), PARAMETER :: M39N2FMxe = 3017 + INTEGER(IntKi), PARAMETER :: M39N3FMxe = 3018 + INTEGER(IntKi), PARAMETER :: M39N4FMxe = 3019 + INTEGER(IntKi), PARAMETER :: M39N5FMxe = 3020 + INTEGER(IntKi), PARAMETER :: M39N6FMxe = 3021 + INTEGER(IntKi), PARAMETER :: M39N7FMxe = 3022 + INTEGER(IntKi), PARAMETER :: M39N8FMxe = 3023 + INTEGER(IntKi), PARAMETER :: M39N9FMxe = 3024 + INTEGER(IntKi), PARAMETER :: M40N1FMxe = 3025 + INTEGER(IntKi), PARAMETER :: M40N2FMxe = 3026 + INTEGER(IntKi), PARAMETER :: M40N3FMxe = 3027 + INTEGER(IntKi), PARAMETER :: M40N4FMxe = 3028 + INTEGER(IntKi), PARAMETER :: M40N5FMxe = 3029 + INTEGER(IntKi), PARAMETER :: M40N6FMxe = 3030 + INTEGER(IntKi), PARAMETER :: M40N7FMxe = 3031 + INTEGER(IntKi), PARAMETER :: M40N8FMxe = 3032 + INTEGER(IntKi), PARAMETER :: M40N9FMxe = 3033 + INTEGER(IntKi), PARAMETER :: M41N1FMxe = 3034 + INTEGER(IntKi), PARAMETER :: M41N2FMxe = 3035 + INTEGER(IntKi), PARAMETER :: M41N3FMxe = 3036 + INTEGER(IntKi), PARAMETER :: M41N4FMxe = 3037 + INTEGER(IntKi), PARAMETER :: M41N5FMxe = 3038 + INTEGER(IntKi), PARAMETER :: M41N6FMxe = 3039 + INTEGER(IntKi), PARAMETER :: M41N7FMxe = 3040 + INTEGER(IntKi), PARAMETER :: M41N8FMxe = 3041 + INTEGER(IntKi), PARAMETER :: M41N9FMxe = 3042 + INTEGER(IntKi), PARAMETER :: M42N1FMxe = 3043 + INTEGER(IntKi), PARAMETER :: M42N2FMxe = 3044 + INTEGER(IntKi), PARAMETER :: M42N3FMxe = 3045 + INTEGER(IntKi), PARAMETER :: M42N4FMxe = 3046 + INTEGER(IntKi), PARAMETER :: M42N5FMxe = 3047 + INTEGER(IntKi), PARAMETER :: M42N6FMxe = 3048 + INTEGER(IntKi), PARAMETER :: M42N7FMxe = 3049 + INTEGER(IntKi), PARAMETER :: M42N8FMxe = 3050 + INTEGER(IntKi), PARAMETER :: M42N9FMxe = 3051 + INTEGER(IntKi), PARAMETER :: M43N1FMxe = 3052 + INTEGER(IntKi), PARAMETER :: M43N2FMxe = 3053 + INTEGER(IntKi), PARAMETER :: M43N3FMxe = 3054 + INTEGER(IntKi), PARAMETER :: M43N4FMxe = 3055 + INTEGER(IntKi), PARAMETER :: M43N5FMxe = 3056 + INTEGER(IntKi), PARAMETER :: M43N6FMxe = 3057 + INTEGER(IntKi), PARAMETER :: M43N7FMxe = 3058 + INTEGER(IntKi), PARAMETER :: M43N8FMxe = 3059 + INTEGER(IntKi), PARAMETER :: M43N9FMxe = 3060 + INTEGER(IntKi), PARAMETER :: M44N1FMxe = 3061 + INTEGER(IntKi), PARAMETER :: M44N2FMxe = 3062 + INTEGER(IntKi), PARAMETER :: M44N3FMxe = 3063 + INTEGER(IntKi), PARAMETER :: M44N4FMxe = 3064 + INTEGER(IntKi), PARAMETER :: M44N5FMxe = 3065 + INTEGER(IntKi), PARAMETER :: M44N6FMxe = 3066 + INTEGER(IntKi), PARAMETER :: M44N7FMxe = 3067 + INTEGER(IntKi), PARAMETER :: M44N8FMxe = 3068 + INTEGER(IntKi), PARAMETER :: M44N9FMxe = 3069 + INTEGER(IntKi), PARAMETER :: M45N1FMxe = 3070 + INTEGER(IntKi), PARAMETER :: M45N2FMxe = 3071 + INTEGER(IntKi), PARAMETER :: M45N3FMxe = 3072 + INTEGER(IntKi), PARAMETER :: M45N4FMxe = 3073 + INTEGER(IntKi), PARAMETER :: M45N5FMxe = 3074 + INTEGER(IntKi), PARAMETER :: M45N6FMxe = 3075 + INTEGER(IntKi), PARAMETER :: M45N7FMxe = 3076 + INTEGER(IntKi), PARAMETER :: M45N8FMxe = 3077 + INTEGER(IntKi), PARAMETER :: M45N9FMxe = 3078 + INTEGER(IntKi), PARAMETER :: M46N1FMxe = 3079 + INTEGER(IntKi), PARAMETER :: M46N2FMxe = 3080 + INTEGER(IntKi), PARAMETER :: M46N3FMxe = 3081 + INTEGER(IntKi), PARAMETER :: M46N4FMxe = 3082 + INTEGER(IntKi), PARAMETER :: M46N5FMxe = 3083 + INTEGER(IntKi), PARAMETER :: M46N6FMxe = 3084 + INTEGER(IntKi), PARAMETER :: M46N7FMxe = 3085 + INTEGER(IntKi), PARAMETER :: M46N8FMxe = 3086 + INTEGER(IntKi), PARAMETER :: M46N9FMxe = 3087 + INTEGER(IntKi), PARAMETER :: M47N1FMxe = 3088 + INTEGER(IntKi), PARAMETER :: M47N2FMxe = 3089 + INTEGER(IntKi), PARAMETER :: M47N3FMxe = 3090 + INTEGER(IntKi), PARAMETER :: M47N4FMxe = 3091 + INTEGER(IntKi), PARAMETER :: M47N5FMxe = 3092 + INTEGER(IntKi), PARAMETER :: M47N6FMxe = 3093 + INTEGER(IntKi), PARAMETER :: M47N7FMxe = 3094 + INTEGER(IntKi), PARAMETER :: M47N8FMxe = 3095 + INTEGER(IntKi), PARAMETER :: M47N9FMxe = 3096 + INTEGER(IntKi), PARAMETER :: M48N1FMxe = 3097 + INTEGER(IntKi), PARAMETER :: M48N2FMxe = 3098 + INTEGER(IntKi), PARAMETER :: M48N3FMxe = 3099 + INTEGER(IntKi), PARAMETER :: M48N4FMxe = 3100 + INTEGER(IntKi), PARAMETER :: M48N5FMxe = 3101 + INTEGER(IntKi), PARAMETER :: M48N6FMxe = 3102 + INTEGER(IntKi), PARAMETER :: M48N7FMxe = 3103 + INTEGER(IntKi), PARAMETER :: M48N8FMxe = 3104 + INTEGER(IntKi), PARAMETER :: M48N9FMxe = 3105 + INTEGER(IntKi), PARAMETER :: M49N1FMxe = 3106 + INTEGER(IntKi), PARAMETER :: M49N2FMxe = 3107 + INTEGER(IntKi), PARAMETER :: M49N3FMxe = 3108 + INTEGER(IntKi), PARAMETER :: M49N4FMxe = 3109 + INTEGER(IntKi), PARAMETER :: M49N5FMxe = 3110 + INTEGER(IntKi), PARAMETER :: M49N6FMxe = 3111 + INTEGER(IntKi), PARAMETER :: M49N7FMxe = 3112 + INTEGER(IntKi), PARAMETER :: M49N8FMxe = 3113 + INTEGER(IntKi), PARAMETER :: M49N9FMxe = 3114 + INTEGER(IntKi), PARAMETER :: M50N1FMxe = 3115 + INTEGER(IntKi), PARAMETER :: M50N2FMxe = 3116 + INTEGER(IntKi), PARAMETER :: M50N3FMxe = 3117 + INTEGER(IntKi), PARAMETER :: M50N4FMxe = 3118 + INTEGER(IntKi), PARAMETER :: M50N5FMxe = 3119 + INTEGER(IntKi), PARAMETER :: M50N6FMxe = 3120 + INTEGER(IntKi), PARAMETER :: M50N7FMxe = 3121 + INTEGER(IntKi), PARAMETER :: M50N8FMxe = 3122 + INTEGER(IntKi), PARAMETER :: M50N9FMxe = 3123 + INTEGER(IntKi), PARAMETER :: M51N1FMxe = 3124 + INTEGER(IntKi), PARAMETER :: M51N2FMxe = 3125 + INTEGER(IntKi), PARAMETER :: M51N3FMxe = 3126 + INTEGER(IntKi), PARAMETER :: M51N4FMxe = 3127 + INTEGER(IntKi), PARAMETER :: M51N5FMxe = 3128 + INTEGER(IntKi), PARAMETER :: M51N6FMxe = 3129 + INTEGER(IntKi), PARAMETER :: M51N7FMxe = 3130 + INTEGER(IntKi), PARAMETER :: M51N8FMxe = 3131 + INTEGER(IntKi), PARAMETER :: M51N9FMxe = 3132 + INTEGER(IntKi), PARAMETER :: M52N1FMxe = 3133 + INTEGER(IntKi), PARAMETER :: M52N2FMxe = 3134 + INTEGER(IntKi), PARAMETER :: M52N3FMxe = 3135 + INTEGER(IntKi), PARAMETER :: M52N4FMxe = 3136 + INTEGER(IntKi), PARAMETER :: M52N5FMxe = 3137 + INTEGER(IntKi), PARAMETER :: M52N6FMxe = 3138 + INTEGER(IntKi), PARAMETER :: M52N7FMxe = 3139 + INTEGER(IntKi), PARAMETER :: M52N8FMxe = 3140 + INTEGER(IntKi), PARAMETER :: M52N9FMxe = 3141 + INTEGER(IntKi), PARAMETER :: M53N1FMxe = 3142 + INTEGER(IntKi), PARAMETER :: M53N2FMxe = 3143 + INTEGER(IntKi), PARAMETER :: M53N3FMxe = 3144 + INTEGER(IntKi), PARAMETER :: M53N4FMxe = 3145 + INTEGER(IntKi), PARAMETER :: M53N5FMxe = 3146 + INTEGER(IntKi), PARAMETER :: M53N6FMxe = 3147 + INTEGER(IntKi), PARAMETER :: M53N7FMxe = 3148 + INTEGER(IntKi), PARAMETER :: M53N8FMxe = 3149 + INTEGER(IntKi), PARAMETER :: M53N9FMxe = 3150 + INTEGER(IntKi), PARAMETER :: M54N1FMxe = 3151 + INTEGER(IntKi), PARAMETER :: M54N2FMxe = 3152 + INTEGER(IntKi), PARAMETER :: M54N3FMxe = 3153 + INTEGER(IntKi), PARAMETER :: M54N4FMxe = 3154 + INTEGER(IntKi), PARAMETER :: M54N5FMxe = 3155 + INTEGER(IntKi), PARAMETER :: M54N6FMxe = 3156 + INTEGER(IntKi), PARAMETER :: M54N7FMxe = 3157 + INTEGER(IntKi), PARAMETER :: M54N8FMxe = 3158 + INTEGER(IntKi), PARAMETER :: M54N9FMxe = 3159 + INTEGER(IntKi), PARAMETER :: M55N1FMxe = 3160 + INTEGER(IntKi), PARAMETER :: M55N2FMxe = 3161 + INTEGER(IntKi), PARAMETER :: M55N3FMxe = 3162 + INTEGER(IntKi), PARAMETER :: M55N4FMxe = 3163 + INTEGER(IntKi), PARAMETER :: M55N5FMxe = 3164 + INTEGER(IntKi), PARAMETER :: M55N6FMxe = 3165 + INTEGER(IntKi), PARAMETER :: M55N7FMxe = 3166 + INTEGER(IntKi), PARAMETER :: M55N8FMxe = 3167 + INTEGER(IntKi), PARAMETER :: M55N9FMxe = 3168 + INTEGER(IntKi), PARAMETER :: M56N1FMxe = 3169 + INTEGER(IntKi), PARAMETER :: M56N2FMxe = 3170 + INTEGER(IntKi), PARAMETER :: M56N3FMxe = 3171 + INTEGER(IntKi), PARAMETER :: M56N4FMxe = 3172 + INTEGER(IntKi), PARAMETER :: M56N5FMxe = 3173 + INTEGER(IntKi), PARAMETER :: M56N6FMxe = 3174 + INTEGER(IntKi), PARAMETER :: M56N7FMxe = 3175 + INTEGER(IntKi), PARAMETER :: M56N8FMxe = 3176 + INTEGER(IntKi), PARAMETER :: M56N9FMxe = 3177 + INTEGER(IntKi), PARAMETER :: M57N1FMxe = 3178 + INTEGER(IntKi), PARAMETER :: M57N2FMxe = 3179 + INTEGER(IntKi), PARAMETER :: M57N3FMxe = 3180 + INTEGER(IntKi), PARAMETER :: M57N4FMxe = 3181 + INTEGER(IntKi), PARAMETER :: M57N5FMxe = 3182 + INTEGER(IntKi), PARAMETER :: M57N6FMxe = 3183 + INTEGER(IntKi), PARAMETER :: M57N7FMxe = 3184 + INTEGER(IntKi), PARAMETER :: M57N8FMxe = 3185 + INTEGER(IntKi), PARAMETER :: M57N9FMxe = 3186 + INTEGER(IntKi), PARAMETER :: M58N1FMxe = 3187 + INTEGER(IntKi), PARAMETER :: M58N2FMxe = 3188 + INTEGER(IntKi), PARAMETER :: M58N3FMxe = 3189 + INTEGER(IntKi), PARAMETER :: M58N4FMxe = 3190 + INTEGER(IntKi), PARAMETER :: M58N5FMxe = 3191 + INTEGER(IntKi), PARAMETER :: M58N6FMxe = 3192 + INTEGER(IntKi), PARAMETER :: M58N7FMxe = 3193 + INTEGER(IntKi), PARAMETER :: M58N8FMxe = 3194 + INTEGER(IntKi), PARAMETER :: M58N9FMxe = 3195 + INTEGER(IntKi), PARAMETER :: M59N1FMxe = 3196 + INTEGER(IntKi), PARAMETER :: M59N2FMxe = 3197 + INTEGER(IntKi), PARAMETER :: M59N3FMxe = 3198 + INTEGER(IntKi), PARAMETER :: M59N4FMxe = 3199 + INTEGER(IntKi), PARAMETER :: M59N5FMxe = 3200 + INTEGER(IntKi), PARAMETER :: M59N6FMxe = 3201 + INTEGER(IntKi), PARAMETER :: M59N7FMxe = 3202 + INTEGER(IntKi), PARAMETER :: M59N8FMxe = 3203 + INTEGER(IntKi), PARAMETER :: M59N9FMxe = 3204 + INTEGER(IntKi), PARAMETER :: M60N1FMxe = 3205 + INTEGER(IntKi), PARAMETER :: M60N2FMxe = 3206 + INTEGER(IntKi), PARAMETER :: M60N3FMxe = 3207 + INTEGER(IntKi), PARAMETER :: M60N4FMxe = 3208 + INTEGER(IntKi), PARAMETER :: M60N5FMxe = 3209 + INTEGER(IntKi), PARAMETER :: M60N6FMxe = 3210 + INTEGER(IntKi), PARAMETER :: M60N7FMxe = 3211 + INTEGER(IntKi), PARAMETER :: M60N8FMxe = 3212 + INTEGER(IntKi), PARAMETER :: M60N9FMxe = 3213 + INTEGER(IntKi), PARAMETER :: M61N1FMxe = 3214 + INTEGER(IntKi), PARAMETER :: M61N2FMxe = 3215 + INTEGER(IntKi), PARAMETER :: M61N3FMxe = 3216 + INTEGER(IntKi), PARAMETER :: M61N4FMxe = 3217 + INTEGER(IntKi), PARAMETER :: M61N5FMxe = 3218 + INTEGER(IntKi), PARAMETER :: M61N6FMxe = 3219 + INTEGER(IntKi), PARAMETER :: M61N7FMxe = 3220 + INTEGER(IntKi), PARAMETER :: M61N8FMxe = 3221 + INTEGER(IntKi), PARAMETER :: M61N9FMxe = 3222 + INTEGER(IntKi), PARAMETER :: M62N1FMxe = 3223 + INTEGER(IntKi), PARAMETER :: M62N2FMxe = 3224 + INTEGER(IntKi), PARAMETER :: M62N3FMxe = 3225 + INTEGER(IntKi), PARAMETER :: M62N4FMxe = 3226 + INTEGER(IntKi), PARAMETER :: M62N5FMxe = 3227 + INTEGER(IntKi), PARAMETER :: M62N6FMxe = 3228 + INTEGER(IntKi), PARAMETER :: M62N7FMxe = 3229 + INTEGER(IntKi), PARAMETER :: M62N8FMxe = 3230 + INTEGER(IntKi), PARAMETER :: M62N9FMxe = 3231 + INTEGER(IntKi), PARAMETER :: M63N1FMxe = 3232 + INTEGER(IntKi), PARAMETER :: M63N2FMxe = 3233 + INTEGER(IntKi), PARAMETER :: M63N3FMxe = 3234 + INTEGER(IntKi), PARAMETER :: M63N4FMxe = 3235 + INTEGER(IntKi), PARAMETER :: M63N5FMxe = 3236 + INTEGER(IntKi), PARAMETER :: M63N6FMxe = 3237 + INTEGER(IntKi), PARAMETER :: M63N7FMxe = 3238 + INTEGER(IntKi), PARAMETER :: M63N8FMxe = 3239 + INTEGER(IntKi), PARAMETER :: M63N9FMxe = 3240 + INTEGER(IntKi), PARAMETER :: M64N1FMxe = 3241 + INTEGER(IntKi), PARAMETER :: M64N2FMxe = 3242 + INTEGER(IntKi), PARAMETER :: M64N3FMxe = 3243 + INTEGER(IntKi), PARAMETER :: M64N4FMxe = 3244 + INTEGER(IntKi), PARAMETER :: M64N5FMxe = 3245 + INTEGER(IntKi), PARAMETER :: M64N6FMxe = 3246 + INTEGER(IntKi), PARAMETER :: M64N7FMxe = 3247 + INTEGER(IntKi), PARAMETER :: M64N8FMxe = 3248 + INTEGER(IntKi), PARAMETER :: M64N9FMxe = 3249 + INTEGER(IntKi), PARAMETER :: M65N1FMxe = 3250 + INTEGER(IntKi), PARAMETER :: M65N2FMxe = 3251 + INTEGER(IntKi), PARAMETER :: M65N3FMxe = 3252 + INTEGER(IntKi), PARAMETER :: M65N4FMxe = 3253 + INTEGER(IntKi), PARAMETER :: M65N5FMxe = 3254 + INTEGER(IntKi), PARAMETER :: M65N6FMxe = 3255 + INTEGER(IntKi), PARAMETER :: M65N7FMxe = 3256 + INTEGER(IntKi), PARAMETER :: M65N8FMxe = 3257 + INTEGER(IntKi), PARAMETER :: M65N9FMxe = 3258 + INTEGER(IntKi), PARAMETER :: M66N1FMxe = 3259 + INTEGER(IntKi), PARAMETER :: M66N2FMxe = 3260 + INTEGER(IntKi), PARAMETER :: M66N3FMxe = 3261 + INTEGER(IntKi), PARAMETER :: M66N4FMxe = 3262 + INTEGER(IntKi), PARAMETER :: M66N5FMxe = 3263 + INTEGER(IntKi), PARAMETER :: M66N6FMxe = 3264 + INTEGER(IntKi), PARAMETER :: M66N7FMxe = 3265 + INTEGER(IntKi), PARAMETER :: M66N8FMxe = 3266 + INTEGER(IntKi), PARAMETER :: M66N9FMxe = 3267 + INTEGER(IntKi), PARAMETER :: M67N1FMxe = 3268 + INTEGER(IntKi), PARAMETER :: M67N2FMxe = 3269 + INTEGER(IntKi), PARAMETER :: M67N3FMxe = 3270 + INTEGER(IntKi), PARAMETER :: M67N4FMxe = 3271 + INTEGER(IntKi), PARAMETER :: M67N5FMxe = 3272 + INTEGER(IntKi), PARAMETER :: M67N6FMxe = 3273 + INTEGER(IntKi), PARAMETER :: M67N7FMxe = 3274 + INTEGER(IntKi), PARAMETER :: M67N8FMxe = 3275 + INTEGER(IntKi), PARAMETER :: M67N9FMxe = 3276 + INTEGER(IntKi), PARAMETER :: M68N1FMxe = 3277 + INTEGER(IntKi), PARAMETER :: M68N2FMxe = 3278 + INTEGER(IntKi), PARAMETER :: M68N3FMxe = 3279 + INTEGER(IntKi), PARAMETER :: M68N4FMxe = 3280 + INTEGER(IntKi), PARAMETER :: M68N5FMxe = 3281 + INTEGER(IntKi), PARAMETER :: M68N6FMxe = 3282 + INTEGER(IntKi), PARAMETER :: M68N7FMxe = 3283 + INTEGER(IntKi), PARAMETER :: M68N8FMxe = 3284 + INTEGER(IntKi), PARAMETER :: M68N9FMxe = 3285 + INTEGER(IntKi), PARAMETER :: M69N1FMxe = 3286 + INTEGER(IntKi), PARAMETER :: M69N2FMxe = 3287 + INTEGER(IntKi), PARAMETER :: M69N3FMxe = 3288 + INTEGER(IntKi), PARAMETER :: M69N4FMxe = 3289 + INTEGER(IntKi), PARAMETER :: M69N5FMxe = 3290 + INTEGER(IntKi), PARAMETER :: M69N6FMxe = 3291 + INTEGER(IntKi), PARAMETER :: M69N7FMxe = 3292 + INTEGER(IntKi), PARAMETER :: M69N8FMxe = 3293 + INTEGER(IntKi), PARAMETER :: M69N9FMxe = 3294 + INTEGER(IntKi), PARAMETER :: M70N1FMxe = 3295 + INTEGER(IntKi), PARAMETER :: M70N2FMxe = 3296 + INTEGER(IntKi), PARAMETER :: M70N3FMxe = 3297 + INTEGER(IntKi), PARAMETER :: M70N4FMxe = 3298 + INTEGER(IntKi), PARAMETER :: M70N5FMxe = 3299 + INTEGER(IntKi), PARAMETER :: M70N6FMxe = 3300 + INTEGER(IntKi), PARAMETER :: M70N7FMxe = 3301 + INTEGER(IntKi), PARAMETER :: M70N8FMxe = 3302 + INTEGER(IntKi), PARAMETER :: M70N9FMxe = 3303 + INTEGER(IntKi), PARAMETER :: M71N1FMxe = 3304 + INTEGER(IntKi), PARAMETER :: M71N2FMxe = 3305 + INTEGER(IntKi), PARAMETER :: M71N3FMxe = 3306 + INTEGER(IntKi), PARAMETER :: M71N4FMxe = 3307 + INTEGER(IntKi), PARAMETER :: M71N5FMxe = 3308 + INTEGER(IntKi), PARAMETER :: M71N6FMxe = 3309 + INTEGER(IntKi), PARAMETER :: M71N7FMxe = 3310 + INTEGER(IntKi), PARAMETER :: M71N8FMxe = 3311 + INTEGER(IntKi), PARAMETER :: M71N9FMxe = 3312 + INTEGER(IntKi), PARAMETER :: M72N1FMxe = 3313 + INTEGER(IntKi), PARAMETER :: M72N2FMxe = 3314 + INTEGER(IntKi), PARAMETER :: M72N3FMxe = 3315 + INTEGER(IntKi), PARAMETER :: M72N4FMxe = 3316 + INTEGER(IntKi), PARAMETER :: M72N5FMxe = 3317 + INTEGER(IntKi), PARAMETER :: M72N6FMxe = 3318 + INTEGER(IntKi), PARAMETER :: M72N7FMxe = 3319 + INTEGER(IntKi), PARAMETER :: M72N8FMxe = 3320 + INTEGER(IntKi), PARAMETER :: M72N9FMxe = 3321 + INTEGER(IntKi), PARAMETER :: M73N1FMxe = 3322 + INTEGER(IntKi), PARAMETER :: M73N2FMxe = 3323 + INTEGER(IntKi), PARAMETER :: M73N3FMxe = 3324 + INTEGER(IntKi), PARAMETER :: M73N4FMxe = 3325 + INTEGER(IntKi), PARAMETER :: M73N5FMxe = 3326 + INTEGER(IntKi), PARAMETER :: M73N6FMxe = 3327 + INTEGER(IntKi), PARAMETER :: M73N7FMxe = 3328 + INTEGER(IntKi), PARAMETER :: M73N8FMxe = 3329 + INTEGER(IntKi), PARAMETER :: M73N9FMxe = 3330 + INTEGER(IntKi), PARAMETER :: M74N1FMxe = 3331 + INTEGER(IntKi), PARAMETER :: M74N2FMxe = 3332 + INTEGER(IntKi), PARAMETER :: M74N3FMxe = 3333 + INTEGER(IntKi), PARAMETER :: M74N4FMxe = 3334 + INTEGER(IntKi), PARAMETER :: M74N5FMxe = 3335 + INTEGER(IntKi), PARAMETER :: M74N6FMxe = 3336 + INTEGER(IntKi), PARAMETER :: M74N7FMxe = 3337 + INTEGER(IntKi), PARAMETER :: M74N8FMxe = 3338 + INTEGER(IntKi), PARAMETER :: M74N9FMxe = 3339 + INTEGER(IntKi), PARAMETER :: M75N1FMxe = 3340 + INTEGER(IntKi), PARAMETER :: M75N2FMxe = 3341 + INTEGER(IntKi), PARAMETER :: M75N3FMxe = 3342 + INTEGER(IntKi), PARAMETER :: M75N4FMxe = 3343 + INTEGER(IntKi), PARAMETER :: M75N5FMxe = 3344 + INTEGER(IntKi), PARAMETER :: M75N6FMxe = 3345 + INTEGER(IntKi), PARAMETER :: M75N7FMxe = 3346 + INTEGER(IntKi), PARAMETER :: M75N8FMxe = 3347 + INTEGER(IntKi), PARAMETER :: M75N9FMxe = 3348 + INTEGER(IntKi), PARAMETER :: M76N1FMxe = 3349 + INTEGER(IntKi), PARAMETER :: M76N2FMxe = 3350 + INTEGER(IntKi), PARAMETER :: M76N3FMxe = 3351 + INTEGER(IntKi), PARAMETER :: M76N4FMxe = 3352 + INTEGER(IntKi), PARAMETER :: M76N5FMxe = 3353 + INTEGER(IntKi), PARAMETER :: M76N6FMxe = 3354 + INTEGER(IntKi), PARAMETER :: M76N7FMxe = 3355 + INTEGER(IntKi), PARAMETER :: M76N8FMxe = 3356 + INTEGER(IntKi), PARAMETER :: M76N9FMxe = 3357 + INTEGER(IntKi), PARAMETER :: M77N1FMxe = 3358 + INTEGER(IntKi), PARAMETER :: M77N2FMxe = 3359 + INTEGER(IntKi), PARAMETER :: M77N3FMxe = 3360 + INTEGER(IntKi), PARAMETER :: M77N4FMxe = 3361 + INTEGER(IntKi), PARAMETER :: M77N5FMxe = 3362 + INTEGER(IntKi), PARAMETER :: M77N6FMxe = 3363 + INTEGER(IntKi), PARAMETER :: M77N7FMxe = 3364 + INTEGER(IntKi), PARAMETER :: M77N8FMxe = 3365 + INTEGER(IntKi), PARAMETER :: M77N9FMxe = 3366 + INTEGER(IntKi), PARAMETER :: M78N1FMxe = 3367 + INTEGER(IntKi), PARAMETER :: M78N2FMxe = 3368 + INTEGER(IntKi), PARAMETER :: M78N3FMxe = 3369 + INTEGER(IntKi), PARAMETER :: M78N4FMxe = 3370 + INTEGER(IntKi), PARAMETER :: M78N5FMxe = 3371 + INTEGER(IntKi), PARAMETER :: M78N6FMxe = 3372 + INTEGER(IntKi), PARAMETER :: M78N7FMxe = 3373 + INTEGER(IntKi), PARAMETER :: M78N8FMxe = 3374 + INTEGER(IntKi), PARAMETER :: M78N9FMxe = 3375 + INTEGER(IntKi), PARAMETER :: M79N1FMxe = 3376 + INTEGER(IntKi), PARAMETER :: M79N2FMxe = 3377 + INTEGER(IntKi), PARAMETER :: M79N3FMxe = 3378 + INTEGER(IntKi), PARAMETER :: M79N4FMxe = 3379 + INTEGER(IntKi), PARAMETER :: M79N5FMxe = 3380 + INTEGER(IntKi), PARAMETER :: M79N6FMxe = 3381 + INTEGER(IntKi), PARAMETER :: M79N7FMxe = 3382 + INTEGER(IntKi), PARAMETER :: M79N8FMxe = 3383 + INTEGER(IntKi), PARAMETER :: M79N9FMxe = 3384 + INTEGER(IntKi), PARAMETER :: M80N1FMxe = 3385 + INTEGER(IntKi), PARAMETER :: M80N2FMxe = 3386 + INTEGER(IntKi), PARAMETER :: M80N3FMxe = 3387 + INTEGER(IntKi), PARAMETER :: M80N4FMxe = 3388 + INTEGER(IntKi), PARAMETER :: M80N5FMxe = 3389 + INTEGER(IntKi), PARAMETER :: M80N6FMxe = 3390 + INTEGER(IntKi), PARAMETER :: M80N7FMxe = 3391 + INTEGER(IntKi), PARAMETER :: M80N8FMxe = 3392 + INTEGER(IntKi), PARAMETER :: M80N9FMxe = 3393 + INTEGER(IntKi), PARAMETER :: M81N1FMxe = 3394 + INTEGER(IntKi), PARAMETER :: M81N2FMxe = 3395 + INTEGER(IntKi), PARAMETER :: M81N3FMxe = 3396 + INTEGER(IntKi), PARAMETER :: M81N4FMxe = 3397 + INTEGER(IntKi), PARAMETER :: M81N5FMxe = 3398 + INTEGER(IntKi), PARAMETER :: M81N6FMxe = 3399 + INTEGER(IntKi), PARAMETER :: M81N7FMxe = 3400 + INTEGER(IntKi), PARAMETER :: M81N8FMxe = 3401 + INTEGER(IntKi), PARAMETER :: M81N9FMxe = 3402 + INTEGER(IntKi), PARAMETER :: M82N1FMxe = 3403 + INTEGER(IntKi), PARAMETER :: M82N2FMxe = 3404 + INTEGER(IntKi), PARAMETER :: M82N3FMxe = 3405 + INTEGER(IntKi), PARAMETER :: M82N4FMxe = 3406 + INTEGER(IntKi), PARAMETER :: M82N5FMxe = 3407 + INTEGER(IntKi), PARAMETER :: M82N6FMxe = 3408 + INTEGER(IntKi), PARAMETER :: M82N7FMxe = 3409 + INTEGER(IntKi), PARAMETER :: M82N8FMxe = 3410 + INTEGER(IntKi), PARAMETER :: M82N9FMxe = 3411 + INTEGER(IntKi), PARAMETER :: M83N1FMxe = 3412 + INTEGER(IntKi), PARAMETER :: M83N2FMxe = 3413 + INTEGER(IntKi), PARAMETER :: M83N3FMxe = 3414 + INTEGER(IntKi), PARAMETER :: M83N4FMxe = 3415 + INTEGER(IntKi), PARAMETER :: M83N5FMxe = 3416 + INTEGER(IntKi), PARAMETER :: M83N6FMxe = 3417 + INTEGER(IntKi), PARAMETER :: M83N7FMxe = 3418 + INTEGER(IntKi), PARAMETER :: M83N8FMxe = 3419 + INTEGER(IntKi), PARAMETER :: M83N9FMxe = 3420 + INTEGER(IntKi), PARAMETER :: M84N1FMxe = 3421 + INTEGER(IntKi), PARAMETER :: M84N2FMxe = 3422 + INTEGER(IntKi), PARAMETER :: M84N3FMxe = 3423 + INTEGER(IntKi), PARAMETER :: M84N4FMxe = 3424 + INTEGER(IntKi), PARAMETER :: M84N5FMxe = 3425 + INTEGER(IntKi), PARAMETER :: M84N6FMxe = 3426 + INTEGER(IntKi), PARAMETER :: M84N7FMxe = 3427 + INTEGER(IntKi), PARAMETER :: M84N8FMxe = 3428 + INTEGER(IntKi), PARAMETER :: M84N9FMxe = 3429 + INTEGER(IntKi), PARAMETER :: M85N1FMxe = 3430 + INTEGER(IntKi), PARAMETER :: M85N2FMxe = 3431 + INTEGER(IntKi), PARAMETER :: M85N3FMxe = 3432 + INTEGER(IntKi), PARAMETER :: M85N4FMxe = 3433 + INTEGER(IntKi), PARAMETER :: M85N5FMxe = 3434 + INTEGER(IntKi), PARAMETER :: M85N6FMxe = 3435 + INTEGER(IntKi), PARAMETER :: M85N7FMxe = 3436 + INTEGER(IntKi), PARAMETER :: M85N8FMxe = 3437 + INTEGER(IntKi), PARAMETER :: M85N9FMxe = 3438 + INTEGER(IntKi), PARAMETER :: M86N1FMxe = 3439 + INTEGER(IntKi), PARAMETER :: M86N2FMxe = 3440 + INTEGER(IntKi), PARAMETER :: M86N3FMxe = 3441 + INTEGER(IntKi), PARAMETER :: M86N4FMxe = 3442 + INTEGER(IntKi), PARAMETER :: M86N5FMxe = 3443 + INTEGER(IntKi), PARAMETER :: M86N6FMxe = 3444 + INTEGER(IntKi), PARAMETER :: M86N7FMxe = 3445 + INTEGER(IntKi), PARAMETER :: M86N8FMxe = 3446 + INTEGER(IntKi), PARAMETER :: M86N9FMxe = 3447 + INTEGER(IntKi), PARAMETER :: M87N1FMxe = 3448 + INTEGER(IntKi), PARAMETER :: M87N2FMxe = 3449 + INTEGER(IntKi), PARAMETER :: M87N3FMxe = 3450 + INTEGER(IntKi), PARAMETER :: M87N4FMxe = 3451 + INTEGER(IntKi), PARAMETER :: M87N5FMxe = 3452 + INTEGER(IntKi), PARAMETER :: M87N6FMxe = 3453 + INTEGER(IntKi), PARAMETER :: M87N7FMxe = 3454 + INTEGER(IntKi), PARAMETER :: M87N8FMxe = 3455 + INTEGER(IntKi), PARAMETER :: M87N9FMxe = 3456 + INTEGER(IntKi), PARAMETER :: M88N1FMxe = 3457 + INTEGER(IntKi), PARAMETER :: M88N2FMxe = 3458 + INTEGER(IntKi), PARAMETER :: M88N3FMxe = 3459 + INTEGER(IntKi), PARAMETER :: M88N4FMxe = 3460 + INTEGER(IntKi), PARAMETER :: M88N5FMxe = 3461 + INTEGER(IntKi), PARAMETER :: M88N6FMxe = 3462 + INTEGER(IntKi), PARAMETER :: M88N7FMxe = 3463 + INTEGER(IntKi), PARAMETER :: M88N8FMxe = 3464 + INTEGER(IntKi), PARAMETER :: M88N9FMxe = 3465 + INTEGER(IntKi), PARAMETER :: M89N1FMxe = 3466 + INTEGER(IntKi), PARAMETER :: M89N2FMxe = 3467 + INTEGER(IntKi), PARAMETER :: M89N3FMxe = 3468 + INTEGER(IntKi), PARAMETER :: M89N4FMxe = 3469 + INTEGER(IntKi), PARAMETER :: M89N5FMxe = 3470 + INTEGER(IntKi), PARAMETER :: M89N6FMxe = 3471 + INTEGER(IntKi), PARAMETER :: M89N7FMxe = 3472 + INTEGER(IntKi), PARAMETER :: M89N8FMxe = 3473 + INTEGER(IntKi), PARAMETER :: M89N9FMxe = 3474 + INTEGER(IntKi), PARAMETER :: M90N1FMxe = 3475 + INTEGER(IntKi), PARAMETER :: M90N2FMxe = 3476 + INTEGER(IntKi), PARAMETER :: M90N3FMxe = 3477 + INTEGER(IntKi), PARAMETER :: M90N4FMxe = 3478 + INTEGER(IntKi), PARAMETER :: M90N5FMxe = 3479 + INTEGER(IntKi), PARAMETER :: M90N6FMxe = 3480 + INTEGER(IntKi), PARAMETER :: M90N7FMxe = 3481 + INTEGER(IntKi), PARAMETER :: M90N8FMxe = 3482 + INTEGER(IntKi), PARAMETER :: M90N9FMxe = 3483 + INTEGER(IntKi), PARAMETER :: M91N1FMxe = 3484 + INTEGER(IntKi), PARAMETER :: M91N2FMxe = 3485 + INTEGER(IntKi), PARAMETER :: M91N3FMxe = 3486 + INTEGER(IntKi), PARAMETER :: M91N4FMxe = 3487 + INTEGER(IntKi), PARAMETER :: M91N5FMxe = 3488 + INTEGER(IntKi), PARAMETER :: M91N6FMxe = 3489 + INTEGER(IntKi), PARAMETER :: M91N7FMxe = 3490 + INTEGER(IntKi), PARAMETER :: M91N8FMxe = 3491 + INTEGER(IntKi), PARAMETER :: M91N9FMxe = 3492 + INTEGER(IntKi), PARAMETER :: M92N1FMxe = 3493 + INTEGER(IntKi), PARAMETER :: M92N2FMxe = 3494 + INTEGER(IntKi), PARAMETER :: M92N3FMxe = 3495 + INTEGER(IntKi), PARAMETER :: M92N4FMxe = 3496 + INTEGER(IntKi), PARAMETER :: M92N5FMxe = 3497 + INTEGER(IntKi), PARAMETER :: M92N6FMxe = 3498 + INTEGER(IntKi), PARAMETER :: M92N7FMxe = 3499 + INTEGER(IntKi), PARAMETER :: M92N8FMxe = 3500 + INTEGER(IntKi), PARAMETER :: M92N9FMxe = 3501 + INTEGER(IntKi), PARAMETER :: M93N1FMxe = 3502 + INTEGER(IntKi), PARAMETER :: M93N2FMxe = 3503 + INTEGER(IntKi), PARAMETER :: M93N3FMxe = 3504 + INTEGER(IntKi), PARAMETER :: M93N4FMxe = 3505 + INTEGER(IntKi), PARAMETER :: M93N5FMxe = 3506 + INTEGER(IntKi), PARAMETER :: M93N6FMxe = 3507 + INTEGER(IntKi), PARAMETER :: M93N7FMxe = 3508 + INTEGER(IntKi), PARAMETER :: M93N8FMxe = 3509 + INTEGER(IntKi), PARAMETER :: M93N9FMxe = 3510 + INTEGER(IntKi), PARAMETER :: M94N1FMxe = 3511 + INTEGER(IntKi), PARAMETER :: M94N2FMxe = 3512 + INTEGER(IntKi), PARAMETER :: M94N3FMxe = 3513 + INTEGER(IntKi), PARAMETER :: M94N4FMxe = 3514 + INTEGER(IntKi), PARAMETER :: M94N5FMxe = 3515 + INTEGER(IntKi), PARAMETER :: M94N6FMxe = 3516 + INTEGER(IntKi), PARAMETER :: M94N7FMxe = 3517 + INTEGER(IntKi), PARAMETER :: M94N8FMxe = 3518 + INTEGER(IntKi), PARAMETER :: M94N9FMxe = 3519 + INTEGER(IntKi), PARAMETER :: M95N1FMxe = 3520 + INTEGER(IntKi), PARAMETER :: M95N2FMxe = 3521 + INTEGER(IntKi), PARAMETER :: M95N3FMxe = 3522 + INTEGER(IntKi), PARAMETER :: M95N4FMxe = 3523 + INTEGER(IntKi), PARAMETER :: M95N5FMxe = 3524 + INTEGER(IntKi), PARAMETER :: M95N6FMxe = 3525 + INTEGER(IntKi), PARAMETER :: M95N7FMxe = 3526 + INTEGER(IntKi), PARAMETER :: M95N8FMxe = 3527 + INTEGER(IntKi), PARAMETER :: M95N9FMxe = 3528 + INTEGER(IntKi), PARAMETER :: M96N1FMxe = 3529 + INTEGER(IntKi), PARAMETER :: M96N2FMxe = 3530 + INTEGER(IntKi), PARAMETER :: M96N3FMxe = 3531 + INTEGER(IntKi), PARAMETER :: M96N4FMxe = 3532 + INTEGER(IntKi), PARAMETER :: M96N5FMxe = 3533 + INTEGER(IntKi), PARAMETER :: M96N6FMxe = 3534 + INTEGER(IntKi), PARAMETER :: M96N7FMxe = 3535 + INTEGER(IntKi), PARAMETER :: M96N8FMxe = 3536 + INTEGER(IntKi), PARAMETER :: M96N9FMxe = 3537 + INTEGER(IntKi), PARAMETER :: M97N1FMxe = 3538 + INTEGER(IntKi), PARAMETER :: M97N2FMxe = 3539 + INTEGER(IntKi), PARAMETER :: M97N3FMxe = 3540 + INTEGER(IntKi), PARAMETER :: M97N4FMxe = 3541 + INTEGER(IntKi), PARAMETER :: M97N5FMxe = 3542 + INTEGER(IntKi), PARAMETER :: M97N6FMxe = 3543 + INTEGER(IntKi), PARAMETER :: M97N7FMxe = 3544 + INTEGER(IntKi), PARAMETER :: M97N8FMxe = 3545 + INTEGER(IntKi), PARAMETER :: M97N9FMxe = 3546 + INTEGER(IntKi), PARAMETER :: M98N1FMxe = 3547 + INTEGER(IntKi), PARAMETER :: M98N2FMxe = 3548 + INTEGER(IntKi), PARAMETER :: M98N3FMxe = 3549 + INTEGER(IntKi), PARAMETER :: M98N4FMxe = 3550 + INTEGER(IntKi), PARAMETER :: M98N5FMxe = 3551 + INTEGER(IntKi), PARAMETER :: M98N6FMxe = 3552 + INTEGER(IntKi), PARAMETER :: M98N7FMxe = 3553 + INTEGER(IntKi), PARAMETER :: M98N8FMxe = 3554 + INTEGER(IntKi), PARAMETER :: M98N9FMxe = 3555 + INTEGER(IntKi), PARAMETER :: M99N1FMxe = 3556 + INTEGER(IntKi), PARAMETER :: M99N2FMxe = 3557 + INTEGER(IntKi), PARAMETER :: M99N3FMxe = 3558 + INTEGER(IntKi), PARAMETER :: M99N4FMxe = 3559 + INTEGER(IntKi), PARAMETER :: M99N5FMxe = 3560 + INTEGER(IntKi), PARAMETER :: M99N6FMxe = 3561 + INTEGER(IntKi), PARAMETER :: M99N7FMxe = 3562 + INTEGER(IntKi), PARAMETER :: M99N8FMxe = 3563 + INTEGER(IntKi), PARAMETER :: M99N9FMxe = 3564 + INTEGER(IntKi), PARAMETER :: M01N1FMye = 3565 + INTEGER(IntKi), PARAMETER :: M01N2FMye = 3566 + INTEGER(IntKi), PARAMETER :: M01N3FMye = 3567 + INTEGER(IntKi), PARAMETER :: M01N4FMye = 3568 + INTEGER(IntKi), PARAMETER :: M01N5FMye = 3569 + INTEGER(IntKi), PARAMETER :: M01N6FMye = 3570 + INTEGER(IntKi), PARAMETER :: M01N7FMye = 3571 + INTEGER(IntKi), PARAMETER :: M01N8FMye = 3572 + INTEGER(IntKi), PARAMETER :: M01N9FMye = 3573 + INTEGER(IntKi), PARAMETER :: M02N1FMye = 3574 + INTEGER(IntKi), PARAMETER :: M02N2FMye = 3575 + INTEGER(IntKi), PARAMETER :: M02N3FMye = 3576 + INTEGER(IntKi), PARAMETER :: M02N4FMye = 3577 + INTEGER(IntKi), PARAMETER :: M02N5FMye = 3578 + INTEGER(IntKi), PARAMETER :: M02N6FMye = 3579 + INTEGER(IntKi), PARAMETER :: M02N7FMye = 3580 + INTEGER(IntKi), PARAMETER :: M02N8FMye = 3581 + INTEGER(IntKi), PARAMETER :: M02N9FMye = 3582 + INTEGER(IntKi), PARAMETER :: M03N1FMye = 3583 + INTEGER(IntKi), PARAMETER :: M03N2FMye = 3584 + INTEGER(IntKi), PARAMETER :: M03N3FMye = 3585 + INTEGER(IntKi), PARAMETER :: M03N4FMye = 3586 + INTEGER(IntKi), PARAMETER :: M03N5FMye = 3587 + INTEGER(IntKi), PARAMETER :: M03N6FMye = 3588 + INTEGER(IntKi), PARAMETER :: M03N7FMye = 3589 + INTEGER(IntKi), PARAMETER :: M03N8FMye = 3590 + INTEGER(IntKi), PARAMETER :: M03N9FMye = 3591 + INTEGER(IntKi), PARAMETER :: M04N1FMye = 3592 + INTEGER(IntKi), PARAMETER :: M04N2FMye = 3593 + INTEGER(IntKi), PARAMETER :: M04N3FMye = 3594 + INTEGER(IntKi), PARAMETER :: M04N4FMye = 3595 + INTEGER(IntKi), PARAMETER :: M04N5FMye = 3596 + INTEGER(IntKi), PARAMETER :: M04N6FMye = 3597 + INTEGER(IntKi), PARAMETER :: M04N7FMye = 3598 + INTEGER(IntKi), PARAMETER :: M04N8FMye = 3599 + INTEGER(IntKi), PARAMETER :: M04N9FMye = 3600 + INTEGER(IntKi), PARAMETER :: M05N1FMye = 3601 + INTEGER(IntKi), PARAMETER :: M05N2FMye = 3602 + INTEGER(IntKi), PARAMETER :: M05N3FMye = 3603 + INTEGER(IntKi), PARAMETER :: M05N4FMye = 3604 + INTEGER(IntKi), PARAMETER :: M05N5FMye = 3605 + INTEGER(IntKi), PARAMETER :: M05N6FMye = 3606 + INTEGER(IntKi), PARAMETER :: M05N7FMye = 3607 + INTEGER(IntKi), PARAMETER :: M05N8FMye = 3608 + INTEGER(IntKi), PARAMETER :: M05N9FMye = 3609 + INTEGER(IntKi), PARAMETER :: M06N1FMye = 3610 + INTEGER(IntKi), PARAMETER :: M06N2FMye = 3611 + INTEGER(IntKi), PARAMETER :: M06N3FMye = 3612 + INTEGER(IntKi), PARAMETER :: M06N4FMye = 3613 + INTEGER(IntKi), PARAMETER :: M06N5FMye = 3614 + INTEGER(IntKi), PARAMETER :: M06N6FMye = 3615 + INTEGER(IntKi), PARAMETER :: M06N7FMye = 3616 + INTEGER(IntKi), PARAMETER :: M06N8FMye = 3617 + INTEGER(IntKi), PARAMETER :: M06N9FMye = 3618 + INTEGER(IntKi), PARAMETER :: M07N1FMye = 3619 + INTEGER(IntKi), PARAMETER :: M07N2FMye = 3620 + INTEGER(IntKi), PARAMETER :: M07N3FMye = 3621 + INTEGER(IntKi), PARAMETER :: M07N4FMye = 3622 + INTEGER(IntKi), PARAMETER :: M07N5FMye = 3623 + INTEGER(IntKi), PARAMETER :: M07N6FMye = 3624 + INTEGER(IntKi), PARAMETER :: M07N7FMye = 3625 + INTEGER(IntKi), PARAMETER :: M07N8FMye = 3626 + INTEGER(IntKi), PARAMETER :: M07N9FMye = 3627 + INTEGER(IntKi), PARAMETER :: M08N1FMye = 3628 + INTEGER(IntKi), PARAMETER :: M08N2FMye = 3629 + INTEGER(IntKi), PARAMETER :: M08N3FMye = 3630 + INTEGER(IntKi), PARAMETER :: M08N4FMye = 3631 + INTEGER(IntKi), PARAMETER :: M08N5FMye = 3632 + INTEGER(IntKi), PARAMETER :: M08N6FMye = 3633 + INTEGER(IntKi), PARAMETER :: M08N7FMye = 3634 + INTEGER(IntKi), PARAMETER :: M08N8FMye = 3635 + INTEGER(IntKi), PARAMETER :: M08N9FMye = 3636 + INTEGER(IntKi), PARAMETER :: M09N1FMye = 3637 + INTEGER(IntKi), PARAMETER :: M09N2FMye = 3638 + INTEGER(IntKi), PARAMETER :: M09N3FMye = 3639 + INTEGER(IntKi), PARAMETER :: M09N4FMye = 3640 + INTEGER(IntKi), PARAMETER :: M09N5FMye = 3641 + INTEGER(IntKi), PARAMETER :: M09N6FMye = 3642 + INTEGER(IntKi), PARAMETER :: M09N7FMye = 3643 + INTEGER(IntKi), PARAMETER :: M09N8FMye = 3644 + INTEGER(IntKi), PARAMETER :: M09N9FMye = 3645 + INTEGER(IntKi), PARAMETER :: M10N1FMye = 3646 + INTEGER(IntKi), PARAMETER :: M10N2FMye = 3647 + INTEGER(IntKi), PARAMETER :: M10N3FMye = 3648 + INTEGER(IntKi), PARAMETER :: M10N4FMye = 3649 + INTEGER(IntKi), PARAMETER :: M10N5FMye = 3650 + INTEGER(IntKi), PARAMETER :: M10N6FMye = 3651 + INTEGER(IntKi), PARAMETER :: M10N7FMye = 3652 + INTEGER(IntKi), PARAMETER :: M10N8FMye = 3653 + INTEGER(IntKi), PARAMETER :: M10N9FMye = 3654 + INTEGER(IntKi), PARAMETER :: M11N1FMye = 3655 + INTEGER(IntKi), PARAMETER :: M11N2FMye = 3656 + INTEGER(IntKi), PARAMETER :: M11N3FMye = 3657 + INTEGER(IntKi), PARAMETER :: M11N4FMye = 3658 + INTEGER(IntKi), PARAMETER :: M11N5FMye = 3659 + INTEGER(IntKi), PARAMETER :: M11N6FMye = 3660 + INTEGER(IntKi), PARAMETER :: M11N7FMye = 3661 + INTEGER(IntKi), PARAMETER :: M11N8FMye = 3662 + INTEGER(IntKi), PARAMETER :: M11N9FMye = 3663 + INTEGER(IntKi), PARAMETER :: M12N1FMye = 3664 + INTEGER(IntKi), PARAMETER :: M12N2FMye = 3665 + INTEGER(IntKi), PARAMETER :: M12N3FMye = 3666 + INTEGER(IntKi), PARAMETER :: M12N4FMye = 3667 + INTEGER(IntKi), PARAMETER :: M12N5FMye = 3668 + INTEGER(IntKi), PARAMETER :: M12N6FMye = 3669 + INTEGER(IntKi), PARAMETER :: M12N7FMye = 3670 + INTEGER(IntKi), PARAMETER :: M12N8FMye = 3671 + INTEGER(IntKi), PARAMETER :: M12N9FMye = 3672 + INTEGER(IntKi), PARAMETER :: M13N1FMye = 3673 + INTEGER(IntKi), PARAMETER :: M13N2FMye = 3674 + INTEGER(IntKi), PARAMETER :: M13N3FMye = 3675 + INTEGER(IntKi), PARAMETER :: M13N4FMye = 3676 + INTEGER(IntKi), PARAMETER :: M13N5FMye = 3677 + INTEGER(IntKi), PARAMETER :: M13N6FMye = 3678 + INTEGER(IntKi), PARAMETER :: M13N7FMye = 3679 + INTEGER(IntKi), PARAMETER :: M13N8FMye = 3680 + INTEGER(IntKi), PARAMETER :: M13N9FMye = 3681 + INTEGER(IntKi), PARAMETER :: M14N1FMye = 3682 + INTEGER(IntKi), PARAMETER :: M14N2FMye = 3683 + INTEGER(IntKi), PARAMETER :: M14N3FMye = 3684 + INTEGER(IntKi), PARAMETER :: M14N4FMye = 3685 + INTEGER(IntKi), PARAMETER :: M14N5FMye = 3686 + INTEGER(IntKi), PARAMETER :: M14N6FMye = 3687 + INTEGER(IntKi), PARAMETER :: M14N7FMye = 3688 + INTEGER(IntKi), PARAMETER :: M14N8FMye = 3689 + INTEGER(IntKi), PARAMETER :: M14N9FMye = 3690 + INTEGER(IntKi), PARAMETER :: M15N1FMye = 3691 + INTEGER(IntKi), PARAMETER :: M15N2FMye = 3692 + INTEGER(IntKi), PARAMETER :: M15N3FMye = 3693 + INTEGER(IntKi), PARAMETER :: M15N4FMye = 3694 + INTEGER(IntKi), PARAMETER :: M15N5FMye = 3695 + INTEGER(IntKi), PARAMETER :: M15N6FMye = 3696 + INTEGER(IntKi), PARAMETER :: M15N7FMye = 3697 + INTEGER(IntKi), PARAMETER :: M15N8FMye = 3698 + INTEGER(IntKi), PARAMETER :: M15N9FMye = 3699 + INTEGER(IntKi), PARAMETER :: M16N1FMye = 3700 + INTEGER(IntKi), PARAMETER :: M16N2FMye = 3701 + INTEGER(IntKi), PARAMETER :: M16N3FMye = 3702 + INTEGER(IntKi), PARAMETER :: M16N4FMye = 3703 + INTEGER(IntKi), PARAMETER :: M16N5FMye = 3704 + INTEGER(IntKi), PARAMETER :: M16N6FMye = 3705 + INTEGER(IntKi), PARAMETER :: M16N7FMye = 3706 + INTEGER(IntKi), PARAMETER :: M16N8FMye = 3707 + INTEGER(IntKi), PARAMETER :: M16N9FMye = 3708 + INTEGER(IntKi), PARAMETER :: M17N1FMye = 3709 + INTEGER(IntKi), PARAMETER :: M17N2FMye = 3710 + INTEGER(IntKi), PARAMETER :: M17N3FMye = 3711 + INTEGER(IntKi), PARAMETER :: M17N4FMye = 3712 + INTEGER(IntKi), PARAMETER :: M17N5FMye = 3713 + INTEGER(IntKi), PARAMETER :: M17N6FMye = 3714 + INTEGER(IntKi), PARAMETER :: M17N7FMye = 3715 + INTEGER(IntKi), PARAMETER :: M17N8FMye = 3716 + INTEGER(IntKi), PARAMETER :: M17N9FMye = 3717 + INTEGER(IntKi), PARAMETER :: M18N1FMye = 3718 + INTEGER(IntKi), PARAMETER :: M18N2FMye = 3719 + INTEGER(IntKi), PARAMETER :: M18N3FMye = 3720 + INTEGER(IntKi), PARAMETER :: M18N4FMye = 3721 + INTEGER(IntKi), PARAMETER :: M18N5FMye = 3722 + INTEGER(IntKi), PARAMETER :: M18N6FMye = 3723 + INTEGER(IntKi), PARAMETER :: M18N7FMye = 3724 + INTEGER(IntKi), PARAMETER :: M18N8FMye = 3725 + INTEGER(IntKi), PARAMETER :: M18N9FMye = 3726 + INTEGER(IntKi), PARAMETER :: M19N1FMye = 3727 + INTEGER(IntKi), PARAMETER :: M19N2FMye = 3728 + INTEGER(IntKi), PARAMETER :: M19N3FMye = 3729 + INTEGER(IntKi), PARAMETER :: M19N4FMye = 3730 + INTEGER(IntKi), PARAMETER :: M19N5FMye = 3731 + INTEGER(IntKi), PARAMETER :: M19N6FMye = 3732 + INTEGER(IntKi), PARAMETER :: M19N7FMye = 3733 + INTEGER(IntKi), PARAMETER :: M19N8FMye = 3734 + INTEGER(IntKi), PARAMETER :: M19N9FMye = 3735 + INTEGER(IntKi), PARAMETER :: M20N1FMye = 3736 + INTEGER(IntKi), PARAMETER :: M20N2FMye = 3737 + INTEGER(IntKi), PARAMETER :: M20N3FMye = 3738 + INTEGER(IntKi), PARAMETER :: M20N4FMye = 3739 + INTEGER(IntKi), PARAMETER :: M20N5FMye = 3740 + INTEGER(IntKi), PARAMETER :: M20N6FMye = 3741 + INTEGER(IntKi), PARAMETER :: M20N7FMye = 3742 + INTEGER(IntKi), PARAMETER :: M20N8FMye = 3743 + INTEGER(IntKi), PARAMETER :: M20N9FMye = 3744 + INTEGER(IntKi), PARAMETER :: M21N1FMye = 3745 + INTEGER(IntKi), PARAMETER :: M21N2FMye = 3746 + INTEGER(IntKi), PARAMETER :: M21N3FMye = 3747 + INTEGER(IntKi), PARAMETER :: M21N4FMye = 3748 + INTEGER(IntKi), PARAMETER :: M21N5FMye = 3749 + INTEGER(IntKi), PARAMETER :: M21N6FMye = 3750 + INTEGER(IntKi), PARAMETER :: M21N7FMye = 3751 + INTEGER(IntKi), PARAMETER :: M21N8FMye = 3752 + INTEGER(IntKi), PARAMETER :: M21N9FMye = 3753 + INTEGER(IntKi), PARAMETER :: M22N1FMye = 3754 + INTEGER(IntKi), PARAMETER :: M22N2FMye = 3755 + INTEGER(IntKi), PARAMETER :: M22N3FMye = 3756 + INTEGER(IntKi), PARAMETER :: M22N4FMye = 3757 + INTEGER(IntKi), PARAMETER :: M22N5FMye = 3758 + INTEGER(IntKi), PARAMETER :: M22N6FMye = 3759 + INTEGER(IntKi), PARAMETER :: M22N7FMye = 3760 + INTEGER(IntKi), PARAMETER :: M22N8FMye = 3761 + INTEGER(IntKi), PARAMETER :: M22N9FMye = 3762 + INTEGER(IntKi), PARAMETER :: M23N1FMye = 3763 + INTEGER(IntKi), PARAMETER :: M23N2FMye = 3764 + INTEGER(IntKi), PARAMETER :: M23N3FMye = 3765 + INTEGER(IntKi), PARAMETER :: M23N4FMye = 3766 + INTEGER(IntKi), PARAMETER :: M23N5FMye = 3767 + INTEGER(IntKi), PARAMETER :: M23N6FMye = 3768 + INTEGER(IntKi), PARAMETER :: M23N7FMye = 3769 + INTEGER(IntKi), PARAMETER :: M23N8FMye = 3770 + INTEGER(IntKi), PARAMETER :: M23N9FMye = 3771 + INTEGER(IntKi), PARAMETER :: M24N1FMye = 3772 + INTEGER(IntKi), PARAMETER :: M24N2FMye = 3773 + INTEGER(IntKi), PARAMETER :: M24N3FMye = 3774 + INTEGER(IntKi), PARAMETER :: M24N4FMye = 3775 + INTEGER(IntKi), PARAMETER :: M24N5FMye = 3776 + INTEGER(IntKi), PARAMETER :: M24N6FMye = 3777 + INTEGER(IntKi), PARAMETER :: M24N7FMye = 3778 + INTEGER(IntKi), PARAMETER :: M24N8FMye = 3779 + INTEGER(IntKi), PARAMETER :: M24N9FMye = 3780 + INTEGER(IntKi), PARAMETER :: M25N1FMye = 3781 + INTEGER(IntKi), PARAMETER :: M25N2FMye = 3782 + INTEGER(IntKi), PARAMETER :: M25N3FMye = 3783 + INTEGER(IntKi), PARAMETER :: M25N4FMye = 3784 + INTEGER(IntKi), PARAMETER :: M25N5FMye = 3785 + INTEGER(IntKi), PARAMETER :: M25N6FMye = 3786 + INTEGER(IntKi), PARAMETER :: M25N7FMye = 3787 + INTEGER(IntKi), PARAMETER :: M25N8FMye = 3788 + INTEGER(IntKi), PARAMETER :: M25N9FMye = 3789 + INTEGER(IntKi), PARAMETER :: M26N1FMye = 3790 + INTEGER(IntKi), PARAMETER :: M26N2FMye = 3791 + INTEGER(IntKi), PARAMETER :: M26N3FMye = 3792 + INTEGER(IntKi), PARAMETER :: M26N4FMye = 3793 + INTEGER(IntKi), PARAMETER :: M26N5FMye = 3794 + INTEGER(IntKi), PARAMETER :: M26N6FMye = 3795 + INTEGER(IntKi), PARAMETER :: M26N7FMye = 3796 + INTEGER(IntKi), PARAMETER :: M26N8FMye = 3797 + INTEGER(IntKi), PARAMETER :: M26N9FMye = 3798 + INTEGER(IntKi), PARAMETER :: M27N1FMye = 3799 + INTEGER(IntKi), PARAMETER :: M27N2FMye = 3800 + INTEGER(IntKi), PARAMETER :: M27N3FMye = 3801 + INTEGER(IntKi), PARAMETER :: M27N4FMye = 3802 + INTEGER(IntKi), PARAMETER :: M27N5FMye = 3803 + INTEGER(IntKi), PARAMETER :: M27N6FMye = 3804 + INTEGER(IntKi), PARAMETER :: M27N7FMye = 3805 + INTEGER(IntKi), PARAMETER :: M27N8FMye = 3806 + INTEGER(IntKi), PARAMETER :: M27N9FMye = 3807 + INTEGER(IntKi), PARAMETER :: M28N1FMye = 3808 + INTEGER(IntKi), PARAMETER :: M28N2FMye = 3809 + INTEGER(IntKi), PARAMETER :: M28N3FMye = 3810 + INTEGER(IntKi), PARAMETER :: M28N4FMye = 3811 + INTEGER(IntKi), PARAMETER :: M28N5FMye = 3812 + INTEGER(IntKi), PARAMETER :: M28N6FMye = 3813 + INTEGER(IntKi), PARAMETER :: M28N7FMye = 3814 + INTEGER(IntKi), PARAMETER :: M28N8FMye = 3815 + INTEGER(IntKi), PARAMETER :: M28N9FMye = 3816 + INTEGER(IntKi), PARAMETER :: M29N1FMye = 3817 + INTEGER(IntKi), PARAMETER :: M29N2FMye = 3818 + INTEGER(IntKi), PARAMETER :: M29N3FMye = 3819 + INTEGER(IntKi), PARAMETER :: M29N4FMye = 3820 + INTEGER(IntKi), PARAMETER :: M29N5FMye = 3821 + INTEGER(IntKi), PARAMETER :: M29N6FMye = 3822 + INTEGER(IntKi), PARAMETER :: M29N7FMye = 3823 + INTEGER(IntKi), PARAMETER :: M29N8FMye = 3824 + INTEGER(IntKi), PARAMETER :: M29N9FMye = 3825 + INTEGER(IntKi), PARAMETER :: M30N1FMye = 3826 + INTEGER(IntKi), PARAMETER :: M30N2FMye = 3827 + INTEGER(IntKi), PARAMETER :: M30N3FMye = 3828 + INTEGER(IntKi), PARAMETER :: M30N4FMye = 3829 + INTEGER(IntKi), PARAMETER :: M30N5FMye = 3830 + INTEGER(IntKi), PARAMETER :: M30N6FMye = 3831 + INTEGER(IntKi), PARAMETER :: M30N7FMye = 3832 + INTEGER(IntKi), PARAMETER :: M30N8FMye = 3833 + INTEGER(IntKi), PARAMETER :: M30N9FMye = 3834 + INTEGER(IntKi), PARAMETER :: M31N1FMye = 3835 + INTEGER(IntKi), PARAMETER :: M31N2FMye = 3836 + INTEGER(IntKi), PARAMETER :: M31N3FMye = 3837 + INTEGER(IntKi), PARAMETER :: M31N4FMye = 3838 + INTEGER(IntKi), PARAMETER :: M31N5FMye = 3839 + INTEGER(IntKi), PARAMETER :: M31N6FMye = 3840 + INTEGER(IntKi), PARAMETER :: M31N7FMye = 3841 + INTEGER(IntKi), PARAMETER :: M31N8FMye = 3842 + INTEGER(IntKi), PARAMETER :: M31N9FMye = 3843 + INTEGER(IntKi), PARAMETER :: M32N1FMye = 3844 + INTEGER(IntKi), PARAMETER :: M32N2FMye = 3845 + INTEGER(IntKi), PARAMETER :: M32N3FMye = 3846 + INTEGER(IntKi), PARAMETER :: M32N4FMye = 3847 + INTEGER(IntKi), PARAMETER :: M32N5FMye = 3848 + INTEGER(IntKi), PARAMETER :: M32N6FMye = 3849 + INTEGER(IntKi), PARAMETER :: M32N7FMye = 3850 + INTEGER(IntKi), PARAMETER :: M32N8FMye = 3851 + INTEGER(IntKi), PARAMETER :: M32N9FMye = 3852 + INTEGER(IntKi), PARAMETER :: M33N1FMye = 3853 + INTEGER(IntKi), PARAMETER :: M33N2FMye = 3854 + INTEGER(IntKi), PARAMETER :: M33N3FMye = 3855 + INTEGER(IntKi), PARAMETER :: M33N4FMye = 3856 + INTEGER(IntKi), PARAMETER :: M33N5FMye = 3857 + INTEGER(IntKi), PARAMETER :: M33N6FMye = 3858 + INTEGER(IntKi), PARAMETER :: M33N7FMye = 3859 + INTEGER(IntKi), PARAMETER :: M33N8FMye = 3860 + INTEGER(IntKi), PARAMETER :: M33N9FMye = 3861 + INTEGER(IntKi), PARAMETER :: M34N1FMye = 3862 + INTEGER(IntKi), PARAMETER :: M34N2FMye = 3863 + INTEGER(IntKi), PARAMETER :: M34N3FMye = 3864 + INTEGER(IntKi), PARAMETER :: M34N4FMye = 3865 + INTEGER(IntKi), PARAMETER :: M34N5FMye = 3866 + INTEGER(IntKi), PARAMETER :: M34N6FMye = 3867 + INTEGER(IntKi), PARAMETER :: M34N7FMye = 3868 + INTEGER(IntKi), PARAMETER :: M34N8FMye = 3869 + INTEGER(IntKi), PARAMETER :: M34N9FMye = 3870 + INTEGER(IntKi), PARAMETER :: M35N1FMye = 3871 + INTEGER(IntKi), PARAMETER :: M35N2FMye = 3872 + INTEGER(IntKi), PARAMETER :: M35N3FMye = 3873 + INTEGER(IntKi), PARAMETER :: M35N4FMye = 3874 + INTEGER(IntKi), PARAMETER :: M35N5FMye = 3875 + INTEGER(IntKi), PARAMETER :: M35N6FMye = 3876 + INTEGER(IntKi), PARAMETER :: M35N7FMye = 3877 + INTEGER(IntKi), PARAMETER :: M35N8FMye = 3878 + INTEGER(IntKi), PARAMETER :: M35N9FMye = 3879 + INTEGER(IntKi), PARAMETER :: M36N1FMye = 3880 + INTEGER(IntKi), PARAMETER :: M36N2FMye = 3881 + INTEGER(IntKi), PARAMETER :: M36N3FMye = 3882 + INTEGER(IntKi), PARAMETER :: M36N4FMye = 3883 + INTEGER(IntKi), PARAMETER :: M36N5FMye = 3884 + INTEGER(IntKi), PARAMETER :: M36N6FMye = 3885 + INTEGER(IntKi), PARAMETER :: M36N7FMye = 3886 + INTEGER(IntKi), PARAMETER :: M36N8FMye = 3887 + INTEGER(IntKi), PARAMETER :: M36N9FMye = 3888 + INTEGER(IntKi), PARAMETER :: M37N1FMye = 3889 + INTEGER(IntKi), PARAMETER :: M37N2FMye = 3890 + INTEGER(IntKi), PARAMETER :: M37N3FMye = 3891 + INTEGER(IntKi), PARAMETER :: M37N4FMye = 3892 + INTEGER(IntKi), PARAMETER :: M37N5FMye = 3893 + INTEGER(IntKi), PARAMETER :: M37N6FMye = 3894 + INTEGER(IntKi), PARAMETER :: M37N7FMye = 3895 + INTEGER(IntKi), PARAMETER :: M37N8FMye = 3896 + INTEGER(IntKi), PARAMETER :: M37N9FMye = 3897 + INTEGER(IntKi), PARAMETER :: M38N1FMye = 3898 + INTEGER(IntKi), PARAMETER :: M38N2FMye = 3899 + INTEGER(IntKi), PARAMETER :: M38N3FMye = 3900 + INTEGER(IntKi), PARAMETER :: M38N4FMye = 3901 + INTEGER(IntKi), PARAMETER :: M38N5FMye = 3902 + INTEGER(IntKi), PARAMETER :: M38N6FMye = 3903 + INTEGER(IntKi), PARAMETER :: M38N7FMye = 3904 + INTEGER(IntKi), PARAMETER :: M38N8FMye = 3905 + INTEGER(IntKi), PARAMETER :: M38N9FMye = 3906 + INTEGER(IntKi), PARAMETER :: M39N1FMye = 3907 + INTEGER(IntKi), PARAMETER :: M39N2FMye = 3908 + INTEGER(IntKi), PARAMETER :: M39N3FMye = 3909 + INTEGER(IntKi), PARAMETER :: M39N4FMye = 3910 + INTEGER(IntKi), PARAMETER :: M39N5FMye = 3911 + INTEGER(IntKi), PARAMETER :: M39N6FMye = 3912 + INTEGER(IntKi), PARAMETER :: M39N7FMye = 3913 + INTEGER(IntKi), PARAMETER :: M39N8FMye = 3914 + INTEGER(IntKi), PARAMETER :: M39N9FMye = 3915 + INTEGER(IntKi), PARAMETER :: M40N1FMye = 3916 + INTEGER(IntKi), PARAMETER :: M40N2FMye = 3917 + INTEGER(IntKi), PARAMETER :: M40N3FMye = 3918 + INTEGER(IntKi), PARAMETER :: M40N4FMye = 3919 + INTEGER(IntKi), PARAMETER :: M40N5FMye = 3920 + INTEGER(IntKi), PARAMETER :: M40N6FMye = 3921 + INTEGER(IntKi), PARAMETER :: M40N7FMye = 3922 + INTEGER(IntKi), PARAMETER :: M40N8FMye = 3923 + INTEGER(IntKi), PARAMETER :: M40N9FMye = 3924 + INTEGER(IntKi), PARAMETER :: M41N1FMye = 3925 + INTEGER(IntKi), PARAMETER :: M41N2FMye = 3926 + INTEGER(IntKi), PARAMETER :: M41N3FMye = 3927 + INTEGER(IntKi), PARAMETER :: M41N4FMye = 3928 + INTEGER(IntKi), PARAMETER :: M41N5FMye = 3929 + INTEGER(IntKi), PARAMETER :: M41N6FMye = 3930 + INTEGER(IntKi), PARAMETER :: M41N7FMye = 3931 + INTEGER(IntKi), PARAMETER :: M41N8FMye = 3932 + INTEGER(IntKi), PARAMETER :: M41N9FMye = 3933 + INTEGER(IntKi), PARAMETER :: M42N1FMye = 3934 + INTEGER(IntKi), PARAMETER :: M42N2FMye = 3935 + INTEGER(IntKi), PARAMETER :: M42N3FMye = 3936 + INTEGER(IntKi), PARAMETER :: M42N4FMye = 3937 + INTEGER(IntKi), PARAMETER :: M42N5FMye = 3938 + INTEGER(IntKi), PARAMETER :: M42N6FMye = 3939 + INTEGER(IntKi), PARAMETER :: M42N7FMye = 3940 + INTEGER(IntKi), PARAMETER :: M42N8FMye = 3941 + INTEGER(IntKi), PARAMETER :: M42N9FMye = 3942 + INTEGER(IntKi), PARAMETER :: M43N1FMye = 3943 + INTEGER(IntKi), PARAMETER :: M43N2FMye = 3944 + INTEGER(IntKi), PARAMETER :: M43N3FMye = 3945 + INTEGER(IntKi), PARAMETER :: M43N4FMye = 3946 + INTEGER(IntKi), PARAMETER :: M43N5FMye = 3947 + INTEGER(IntKi), PARAMETER :: M43N6FMye = 3948 + INTEGER(IntKi), PARAMETER :: M43N7FMye = 3949 + INTEGER(IntKi), PARAMETER :: M43N8FMye = 3950 + INTEGER(IntKi), PARAMETER :: M43N9FMye = 3951 + INTEGER(IntKi), PARAMETER :: M44N1FMye = 3952 + INTEGER(IntKi), PARAMETER :: M44N2FMye = 3953 + INTEGER(IntKi), PARAMETER :: M44N3FMye = 3954 + INTEGER(IntKi), PARAMETER :: M44N4FMye = 3955 + INTEGER(IntKi), PARAMETER :: M44N5FMye = 3956 + INTEGER(IntKi), PARAMETER :: M44N6FMye = 3957 + INTEGER(IntKi), PARAMETER :: M44N7FMye = 3958 + INTEGER(IntKi), PARAMETER :: M44N8FMye = 3959 + INTEGER(IntKi), PARAMETER :: M44N9FMye = 3960 + INTEGER(IntKi), PARAMETER :: M45N1FMye = 3961 + INTEGER(IntKi), PARAMETER :: M45N2FMye = 3962 + INTEGER(IntKi), PARAMETER :: M45N3FMye = 3963 + INTEGER(IntKi), PARAMETER :: M45N4FMye = 3964 + INTEGER(IntKi), PARAMETER :: M45N5FMye = 3965 + INTEGER(IntKi), PARAMETER :: M45N6FMye = 3966 + INTEGER(IntKi), PARAMETER :: M45N7FMye = 3967 + INTEGER(IntKi), PARAMETER :: M45N8FMye = 3968 + INTEGER(IntKi), PARAMETER :: M45N9FMye = 3969 + INTEGER(IntKi), PARAMETER :: M46N1FMye = 3970 + INTEGER(IntKi), PARAMETER :: M46N2FMye = 3971 + INTEGER(IntKi), PARAMETER :: M46N3FMye = 3972 + INTEGER(IntKi), PARAMETER :: M46N4FMye = 3973 + INTEGER(IntKi), PARAMETER :: M46N5FMye = 3974 + INTEGER(IntKi), PARAMETER :: M46N6FMye = 3975 + INTEGER(IntKi), PARAMETER :: M46N7FMye = 3976 + INTEGER(IntKi), PARAMETER :: M46N8FMye = 3977 + INTEGER(IntKi), PARAMETER :: M46N9FMye = 3978 + INTEGER(IntKi), PARAMETER :: M47N1FMye = 3979 + INTEGER(IntKi), PARAMETER :: M47N2FMye = 3980 + INTEGER(IntKi), PARAMETER :: M47N3FMye = 3981 + INTEGER(IntKi), PARAMETER :: M47N4FMye = 3982 + INTEGER(IntKi), PARAMETER :: M47N5FMye = 3983 + INTEGER(IntKi), PARAMETER :: M47N6FMye = 3984 + INTEGER(IntKi), PARAMETER :: M47N7FMye = 3985 + INTEGER(IntKi), PARAMETER :: M47N8FMye = 3986 + INTEGER(IntKi), PARAMETER :: M47N9FMye = 3987 + INTEGER(IntKi), PARAMETER :: M48N1FMye = 3988 + INTEGER(IntKi), PARAMETER :: M48N2FMye = 3989 + INTEGER(IntKi), PARAMETER :: M48N3FMye = 3990 + INTEGER(IntKi), PARAMETER :: M48N4FMye = 3991 + INTEGER(IntKi), PARAMETER :: M48N5FMye = 3992 + INTEGER(IntKi), PARAMETER :: M48N6FMye = 3993 + INTEGER(IntKi), PARAMETER :: M48N7FMye = 3994 + INTEGER(IntKi), PARAMETER :: M48N8FMye = 3995 + INTEGER(IntKi), PARAMETER :: M48N9FMye = 3996 + INTEGER(IntKi), PARAMETER :: M49N1FMye = 3997 + INTEGER(IntKi), PARAMETER :: M49N2FMye = 3998 + INTEGER(IntKi), PARAMETER :: M49N3FMye = 3999 + INTEGER(IntKi), PARAMETER :: M49N4FMye = 4000 + INTEGER(IntKi), PARAMETER :: M49N5FMye = 4001 + INTEGER(IntKi), PARAMETER :: M49N6FMye = 4002 + INTEGER(IntKi), PARAMETER :: M49N7FMye = 4003 + INTEGER(IntKi), PARAMETER :: M49N8FMye = 4004 + INTEGER(IntKi), PARAMETER :: M49N9FMye = 4005 + INTEGER(IntKi), PARAMETER :: M50N1FMye = 4006 + INTEGER(IntKi), PARAMETER :: M50N2FMye = 4007 + INTEGER(IntKi), PARAMETER :: M50N3FMye = 4008 + INTEGER(IntKi), PARAMETER :: M50N4FMye = 4009 + INTEGER(IntKi), PARAMETER :: M50N5FMye = 4010 + INTEGER(IntKi), PARAMETER :: M50N6FMye = 4011 + INTEGER(IntKi), PARAMETER :: M50N7FMye = 4012 + INTEGER(IntKi), PARAMETER :: M50N8FMye = 4013 + INTEGER(IntKi), PARAMETER :: M50N9FMye = 4014 + INTEGER(IntKi), PARAMETER :: M51N1FMye = 4015 + INTEGER(IntKi), PARAMETER :: M51N2FMye = 4016 + INTEGER(IntKi), PARAMETER :: M51N3FMye = 4017 + INTEGER(IntKi), PARAMETER :: M51N4FMye = 4018 + INTEGER(IntKi), PARAMETER :: M51N5FMye = 4019 + INTEGER(IntKi), PARAMETER :: M51N6FMye = 4020 + INTEGER(IntKi), PARAMETER :: M51N7FMye = 4021 + INTEGER(IntKi), PARAMETER :: M51N8FMye = 4022 + INTEGER(IntKi), PARAMETER :: M51N9FMye = 4023 + INTEGER(IntKi), PARAMETER :: M52N1FMye = 4024 + INTEGER(IntKi), PARAMETER :: M52N2FMye = 4025 + INTEGER(IntKi), PARAMETER :: M52N3FMye = 4026 + INTEGER(IntKi), PARAMETER :: M52N4FMye = 4027 + INTEGER(IntKi), PARAMETER :: M52N5FMye = 4028 + INTEGER(IntKi), PARAMETER :: M52N6FMye = 4029 + INTEGER(IntKi), PARAMETER :: M52N7FMye = 4030 + INTEGER(IntKi), PARAMETER :: M52N8FMye = 4031 + INTEGER(IntKi), PARAMETER :: M52N9FMye = 4032 + INTEGER(IntKi), PARAMETER :: M53N1FMye = 4033 + INTEGER(IntKi), PARAMETER :: M53N2FMye = 4034 + INTEGER(IntKi), PARAMETER :: M53N3FMye = 4035 + INTEGER(IntKi), PARAMETER :: M53N4FMye = 4036 + INTEGER(IntKi), PARAMETER :: M53N5FMye = 4037 + INTEGER(IntKi), PARAMETER :: M53N6FMye = 4038 + INTEGER(IntKi), PARAMETER :: M53N7FMye = 4039 + INTEGER(IntKi), PARAMETER :: M53N8FMye = 4040 + INTEGER(IntKi), PARAMETER :: M53N9FMye = 4041 + INTEGER(IntKi), PARAMETER :: M54N1FMye = 4042 + INTEGER(IntKi), PARAMETER :: M54N2FMye = 4043 + INTEGER(IntKi), PARAMETER :: M54N3FMye = 4044 + INTEGER(IntKi), PARAMETER :: M54N4FMye = 4045 + INTEGER(IntKi), PARAMETER :: M54N5FMye = 4046 + INTEGER(IntKi), PARAMETER :: M54N6FMye = 4047 + INTEGER(IntKi), PARAMETER :: M54N7FMye = 4048 + INTEGER(IntKi), PARAMETER :: M54N8FMye = 4049 + INTEGER(IntKi), PARAMETER :: M54N9FMye = 4050 + INTEGER(IntKi), PARAMETER :: M55N1FMye = 4051 + INTEGER(IntKi), PARAMETER :: M55N2FMye = 4052 + INTEGER(IntKi), PARAMETER :: M55N3FMye = 4053 + INTEGER(IntKi), PARAMETER :: M55N4FMye = 4054 + INTEGER(IntKi), PARAMETER :: M55N5FMye = 4055 + INTEGER(IntKi), PARAMETER :: M55N6FMye = 4056 + INTEGER(IntKi), PARAMETER :: M55N7FMye = 4057 + INTEGER(IntKi), PARAMETER :: M55N8FMye = 4058 + INTEGER(IntKi), PARAMETER :: M55N9FMye = 4059 + INTEGER(IntKi), PARAMETER :: M56N1FMye = 4060 + INTEGER(IntKi), PARAMETER :: M56N2FMye = 4061 + INTEGER(IntKi), PARAMETER :: M56N3FMye = 4062 + INTEGER(IntKi), PARAMETER :: M56N4FMye = 4063 + INTEGER(IntKi), PARAMETER :: M56N5FMye = 4064 + INTEGER(IntKi), PARAMETER :: M56N6FMye = 4065 + INTEGER(IntKi), PARAMETER :: M56N7FMye = 4066 + INTEGER(IntKi), PARAMETER :: M56N8FMye = 4067 + INTEGER(IntKi), PARAMETER :: M56N9FMye = 4068 + INTEGER(IntKi), PARAMETER :: M57N1FMye = 4069 + INTEGER(IntKi), PARAMETER :: M57N2FMye = 4070 + INTEGER(IntKi), PARAMETER :: M57N3FMye = 4071 + INTEGER(IntKi), PARAMETER :: M57N4FMye = 4072 + INTEGER(IntKi), PARAMETER :: M57N5FMye = 4073 + INTEGER(IntKi), PARAMETER :: M57N6FMye = 4074 + INTEGER(IntKi), PARAMETER :: M57N7FMye = 4075 + INTEGER(IntKi), PARAMETER :: M57N8FMye = 4076 + INTEGER(IntKi), PARAMETER :: M57N9FMye = 4077 + INTEGER(IntKi), PARAMETER :: M58N1FMye = 4078 + INTEGER(IntKi), PARAMETER :: M58N2FMye = 4079 + INTEGER(IntKi), PARAMETER :: M58N3FMye = 4080 + INTEGER(IntKi), PARAMETER :: M58N4FMye = 4081 + INTEGER(IntKi), PARAMETER :: M58N5FMye = 4082 + INTEGER(IntKi), PARAMETER :: M58N6FMye = 4083 + INTEGER(IntKi), PARAMETER :: M58N7FMye = 4084 + INTEGER(IntKi), PARAMETER :: M58N8FMye = 4085 + INTEGER(IntKi), PARAMETER :: M58N9FMye = 4086 + INTEGER(IntKi), PARAMETER :: M59N1FMye = 4087 + INTEGER(IntKi), PARAMETER :: M59N2FMye = 4088 + INTEGER(IntKi), PARAMETER :: M59N3FMye = 4089 + INTEGER(IntKi), PARAMETER :: M59N4FMye = 4090 + INTEGER(IntKi), PARAMETER :: M59N5FMye = 4091 + INTEGER(IntKi), PARAMETER :: M59N6FMye = 4092 + INTEGER(IntKi), PARAMETER :: M59N7FMye = 4093 + INTEGER(IntKi), PARAMETER :: M59N8FMye = 4094 + INTEGER(IntKi), PARAMETER :: M59N9FMye = 4095 + INTEGER(IntKi), PARAMETER :: M60N1FMye = 4096 + INTEGER(IntKi), PARAMETER :: M60N2FMye = 4097 + INTEGER(IntKi), PARAMETER :: M60N3FMye = 4098 + INTEGER(IntKi), PARAMETER :: M60N4FMye = 4099 + INTEGER(IntKi), PARAMETER :: M60N5FMye = 4100 + INTEGER(IntKi), PARAMETER :: M60N6FMye = 4101 + INTEGER(IntKi), PARAMETER :: M60N7FMye = 4102 + INTEGER(IntKi), PARAMETER :: M60N8FMye = 4103 + INTEGER(IntKi), PARAMETER :: M60N9FMye = 4104 + INTEGER(IntKi), PARAMETER :: M61N1FMye = 4105 + INTEGER(IntKi), PARAMETER :: M61N2FMye = 4106 + INTEGER(IntKi), PARAMETER :: M61N3FMye = 4107 + INTEGER(IntKi), PARAMETER :: M61N4FMye = 4108 + INTEGER(IntKi), PARAMETER :: M61N5FMye = 4109 + INTEGER(IntKi), PARAMETER :: M61N6FMye = 4110 + INTEGER(IntKi), PARAMETER :: M61N7FMye = 4111 + INTEGER(IntKi), PARAMETER :: M61N8FMye = 4112 + INTEGER(IntKi), PARAMETER :: M61N9FMye = 4113 + INTEGER(IntKi), PARAMETER :: M62N1FMye = 4114 + INTEGER(IntKi), PARAMETER :: M62N2FMye = 4115 + INTEGER(IntKi), PARAMETER :: M62N3FMye = 4116 + INTEGER(IntKi), PARAMETER :: M62N4FMye = 4117 + INTEGER(IntKi), PARAMETER :: M62N5FMye = 4118 + INTEGER(IntKi), PARAMETER :: M62N6FMye = 4119 + INTEGER(IntKi), PARAMETER :: M62N7FMye = 4120 + INTEGER(IntKi), PARAMETER :: M62N8FMye = 4121 + INTEGER(IntKi), PARAMETER :: M62N9FMye = 4122 + INTEGER(IntKi), PARAMETER :: M63N1FMye = 4123 + INTEGER(IntKi), PARAMETER :: M63N2FMye = 4124 + INTEGER(IntKi), PARAMETER :: M63N3FMye = 4125 + INTEGER(IntKi), PARAMETER :: M63N4FMye = 4126 + INTEGER(IntKi), PARAMETER :: M63N5FMye = 4127 + INTEGER(IntKi), PARAMETER :: M63N6FMye = 4128 + INTEGER(IntKi), PARAMETER :: M63N7FMye = 4129 + INTEGER(IntKi), PARAMETER :: M63N8FMye = 4130 + INTEGER(IntKi), PARAMETER :: M63N9FMye = 4131 + INTEGER(IntKi), PARAMETER :: M64N1FMye = 4132 + INTEGER(IntKi), PARAMETER :: M64N2FMye = 4133 + INTEGER(IntKi), PARAMETER :: M64N3FMye = 4134 + INTEGER(IntKi), PARAMETER :: M64N4FMye = 4135 + INTEGER(IntKi), PARAMETER :: M64N5FMye = 4136 + INTEGER(IntKi), PARAMETER :: M64N6FMye = 4137 + INTEGER(IntKi), PARAMETER :: M64N7FMye = 4138 + INTEGER(IntKi), PARAMETER :: M64N8FMye = 4139 + INTEGER(IntKi), PARAMETER :: M64N9FMye = 4140 + INTEGER(IntKi), PARAMETER :: M65N1FMye = 4141 + INTEGER(IntKi), PARAMETER :: M65N2FMye = 4142 + INTEGER(IntKi), PARAMETER :: M65N3FMye = 4143 + INTEGER(IntKi), PARAMETER :: M65N4FMye = 4144 + INTEGER(IntKi), PARAMETER :: M65N5FMye = 4145 + INTEGER(IntKi), PARAMETER :: M65N6FMye = 4146 + INTEGER(IntKi), PARAMETER :: M65N7FMye = 4147 + INTEGER(IntKi), PARAMETER :: M65N8FMye = 4148 + INTEGER(IntKi), PARAMETER :: M65N9FMye = 4149 + INTEGER(IntKi), PARAMETER :: M66N1FMye = 4150 + INTEGER(IntKi), PARAMETER :: M66N2FMye = 4151 + INTEGER(IntKi), PARAMETER :: M66N3FMye = 4152 + INTEGER(IntKi), PARAMETER :: M66N4FMye = 4153 + INTEGER(IntKi), PARAMETER :: M66N5FMye = 4154 + INTEGER(IntKi), PARAMETER :: M66N6FMye = 4155 + INTEGER(IntKi), PARAMETER :: M66N7FMye = 4156 + INTEGER(IntKi), PARAMETER :: M66N8FMye = 4157 + INTEGER(IntKi), PARAMETER :: M66N9FMye = 4158 + INTEGER(IntKi), PARAMETER :: M67N1FMye = 4159 + INTEGER(IntKi), PARAMETER :: M67N2FMye = 4160 + INTEGER(IntKi), PARAMETER :: M67N3FMye = 4161 + INTEGER(IntKi), PARAMETER :: M67N4FMye = 4162 + INTEGER(IntKi), PARAMETER :: M67N5FMye = 4163 + INTEGER(IntKi), PARAMETER :: M67N6FMye = 4164 + INTEGER(IntKi), PARAMETER :: M67N7FMye = 4165 + INTEGER(IntKi), PARAMETER :: M67N8FMye = 4166 + INTEGER(IntKi), PARAMETER :: M67N9FMye = 4167 + INTEGER(IntKi), PARAMETER :: M68N1FMye = 4168 + INTEGER(IntKi), PARAMETER :: M68N2FMye = 4169 + INTEGER(IntKi), PARAMETER :: M68N3FMye = 4170 + INTEGER(IntKi), PARAMETER :: M68N4FMye = 4171 + INTEGER(IntKi), PARAMETER :: M68N5FMye = 4172 + INTEGER(IntKi), PARAMETER :: M68N6FMye = 4173 + INTEGER(IntKi), PARAMETER :: M68N7FMye = 4174 + INTEGER(IntKi), PARAMETER :: M68N8FMye = 4175 + INTEGER(IntKi), PARAMETER :: M68N9FMye = 4176 + INTEGER(IntKi), PARAMETER :: M69N1FMye = 4177 + INTEGER(IntKi), PARAMETER :: M69N2FMye = 4178 + INTEGER(IntKi), PARAMETER :: M69N3FMye = 4179 + INTEGER(IntKi), PARAMETER :: M69N4FMye = 4180 + INTEGER(IntKi), PARAMETER :: M69N5FMye = 4181 + INTEGER(IntKi), PARAMETER :: M69N6FMye = 4182 + INTEGER(IntKi), PARAMETER :: M69N7FMye = 4183 + INTEGER(IntKi), PARAMETER :: M69N8FMye = 4184 + INTEGER(IntKi), PARAMETER :: M69N9FMye = 4185 + INTEGER(IntKi), PARAMETER :: M70N1FMye = 4186 + INTEGER(IntKi), PARAMETER :: M70N2FMye = 4187 + INTEGER(IntKi), PARAMETER :: M70N3FMye = 4188 + INTEGER(IntKi), PARAMETER :: M70N4FMye = 4189 + INTEGER(IntKi), PARAMETER :: M70N5FMye = 4190 + INTEGER(IntKi), PARAMETER :: M70N6FMye = 4191 + INTEGER(IntKi), PARAMETER :: M70N7FMye = 4192 + INTEGER(IntKi), PARAMETER :: M70N8FMye = 4193 + INTEGER(IntKi), PARAMETER :: M70N9FMye = 4194 + INTEGER(IntKi), PARAMETER :: M71N1FMye = 4195 + INTEGER(IntKi), PARAMETER :: M71N2FMye = 4196 + INTEGER(IntKi), PARAMETER :: M71N3FMye = 4197 + INTEGER(IntKi), PARAMETER :: M71N4FMye = 4198 + INTEGER(IntKi), PARAMETER :: M71N5FMye = 4199 + INTEGER(IntKi), PARAMETER :: M71N6FMye = 4200 + INTEGER(IntKi), PARAMETER :: M71N7FMye = 4201 + INTEGER(IntKi), PARAMETER :: M71N8FMye = 4202 + INTEGER(IntKi), PARAMETER :: M71N9FMye = 4203 + INTEGER(IntKi), PARAMETER :: M72N1FMye = 4204 + INTEGER(IntKi), PARAMETER :: M72N2FMye = 4205 + INTEGER(IntKi), PARAMETER :: M72N3FMye = 4206 + INTEGER(IntKi), PARAMETER :: M72N4FMye = 4207 + INTEGER(IntKi), PARAMETER :: M72N5FMye = 4208 + INTEGER(IntKi), PARAMETER :: M72N6FMye = 4209 + INTEGER(IntKi), PARAMETER :: M72N7FMye = 4210 + INTEGER(IntKi), PARAMETER :: M72N8FMye = 4211 + INTEGER(IntKi), PARAMETER :: M72N9FMye = 4212 + INTEGER(IntKi), PARAMETER :: M73N1FMye = 4213 + INTEGER(IntKi), PARAMETER :: M73N2FMye = 4214 + INTEGER(IntKi), PARAMETER :: M73N3FMye = 4215 + INTEGER(IntKi), PARAMETER :: M73N4FMye = 4216 + INTEGER(IntKi), PARAMETER :: M73N5FMye = 4217 + INTEGER(IntKi), PARAMETER :: M73N6FMye = 4218 + INTEGER(IntKi), PARAMETER :: M73N7FMye = 4219 + INTEGER(IntKi), PARAMETER :: M73N8FMye = 4220 + INTEGER(IntKi), PARAMETER :: M73N9FMye = 4221 + INTEGER(IntKi), PARAMETER :: M74N1FMye = 4222 + INTEGER(IntKi), PARAMETER :: M74N2FMye = 4223 + INTEGER(IntKi), PARAMETER :: M74N3FMye = 4224 + INTEGER(IntKi), PARAMETER :: M74N4FMye = 4225 + INTEGER(IntKi), PARAMETER :: M74N5FMye = 4226 + INTEGER(IntKi), PARAMETER :: M74N6FMye = 4227 + INTEGER(IntKi), PARAMETER :: M74N7FMye = 4228 + INTEGER(IntKi), PARAMETER :: M74N8FMye = 4229 + INTEGER(IntKi), PARAMETER :: M74N9FMye = 4230 + INTEGER(IntKi), PARAMETER :: M75N1FMye = 4231 + INTEGER(IntKi), PARAMETER :: M75N2FMye = 4232 + INTEGER(IntKi), PARAMETER :: M75N3FMye = 4233 + INTEGER(IntKi), PARAMETER :: M75N4FMye = 4234 + INTEGER(IntKi), PARAMETER :: M75N5FMye = 4235 + INTEGER(IntKi), PARAMETER :: M75N6FMye = 4236 + INTEGER(IntKi), PARAMETER :: M75N7FMye = 4237 + INTEGER(IntKi), PARAMETER :: M75N8FMye = 4238 + INTEGER(IntKi), PARAMETER :: M75N9FMye = 4239 + INTEGER(IntKi), PARAMETER :: M76N1FMye = 4240 + INTEGER(IntKi), PARAMETER :: M76N2FMye = 4241 + INTEGER(IntKi), PARAMETER :: M76N3FMye = 4242 + INTEGER(IntKi), PARAMETER :: M76N4FMye = 4243 + INTEGER(IntKi), PARAMETER :: M76N5FMye = 4244 + INTEGER(IntKi), PARAMETER :: M76N6FMye = 4245 + INTEGER(IntKi), PARAMETER :: M76N7FMye = 4246 + INTEGER(IntKi), PARAMETER :: M76N8FMye = 4247 + INTEGER(IntKi), PARAMETER :: M76N9FMye = 4248 + INTEGER(IntKi), PARAMETER :: M77N1FMye = 4249 + INTEGER(IntKi), PARAMETER :: M77N2FMye = 4250 + INTEGER(IntKi), PARAMETER :: M77N3FMye = 4251 + INTEGER(IntKi), PARAMETER :: M77N4FMye = 4252 + INTEGER(IntKi), PARAMETER :: M77N5FMye = 4253 + INTEGER(IntKi), PARAMETER :: M77N6FMye = 4254 + INTEGER(IntKi), PARAMETER :: M77N7FMye = 4255 + INTEGER(IntKi), PARAMETER :: M77N8FMye = 4256 + INTEGER(IntKi), PARAMETER :: M77N9FMye = 4257 + INTEGER(IntKi), PARAMETER :: M78N1FMye = 4258 + INTEGER(IntKi), PARAMETER :: M78N2FMye = 4259 + INTEGER(IntKi), PARAMETER :: M78N3FMye = 4260 + INTEGER(IntKi), PARAMETER :: M78N4FMye = 4261 + INTEGER(IntKi), PARAMETER :: M78N5FMye = 4262 + INTEGER(IntKi), PARAMETER :: M78N6FMye = 4263 + INTEGER(IntKi), PARAMETER :: M78N7FMye = 4264 + INTEGER(IntKi), PARAMETER :: M78N8FMye = 4265 + INTEGER(IntKi), PARAMETER :: M78N9FMye = 4266 + INTEGER(IntKi), PARAMETER :: M79N1FMye = 4267 + INTEGER(IntKi), PARAMETER :: M79N2FMye = 4268 + INTEGER(IntKi), PARAMETER :: M79N3FMye = 4269 + INTEGER(IntKi), PARAMETER :: M79N4FMye = 4270 + INTEGER(IntKi), PARAMETER :: M79N5FMye = 4271 + INTEGER(IntKi), PARAMETER :: M79N6FMye = 4272 + INTEGER(IntKi), PARAMETER :: M79N7FMye = 4273 + INTEGER(IntKi), PARAMETER :: M79N8FMye = 4274 + INTEGER(IntKi), PARAMETER :: M79N9FMye = 4275 + INTEGER(IntKi), PARAMETER :: M80N1FMye = 4276 + INTEGER(IntKi), PARAMETER :: M80N2FMye = 4277 + INTEGER(IntKi), PARAMETER :: M80N3FMye = 4278 + INTEGER(IntKi), PARAMETER :: M80N4FMye = 4279 + INTEGER(IntKi), PARAMETER :: M80N5FMye = 4280 + INTEGER(IntKi), PARAMETER :: M80N6FMye = 4281 + INTEGER(IntKi), PARAMETER :: M80N7FMye = 4282 + INTEGER(IntKi), PARAMETER :: M80N8FMye = 4283 + INTEGER(IntKi), PARAMETER :: M80N9FMye = 4284 + INTEGER(IntKi), PARAMETER :: M81N1FMye = 4285 + INTEGER(IntKi), PARAMETER :: M81N2FMye = 4286 + INTEGER(IntKi), PARAMETER :: M81N3FMye = 4287 + INTEGER(IntKi), PARAMETER :: M81N4FMye = 4288 + INTEGER(IntKi), PARAMETER :: M81N5FMye = 4289 + INTEGER(IntKi), PARAMETER :: M81N6FMye = 4290 + INTEGER(IntKi), PARAMETER :: M81N7FMye = 4291 + INTEGER(IntKi), PARAMETER :: M81N8FMye = 4292 + INTEGER(IntKi), PARAMETER :: M81N9FMye = 4293 + INTEGER(IntKi), PARAMETER :: M82N1FMye = 4294 + INTEGER(IntKi), PARAMETER :: M82N2FMye = 4295 + INTEGER(IntKi), PARAMETER :: M82N3FMye = 4296 + INTEGER(IntKi), PARAMETER :: M82N4FMye = 4297 + INTEGER(IntKi), PARAMETER :: M82N5FMye = 4298 + INTEGER(IntKi), PARAMETER :: M82N6FMye = 4299 + INTEGER(IntKi), PARAMETER :: M82N7FMye = 4300 + INTEGER(IntKi), PARAMETER :: M82N8FMye = 4301 + INTEGER(IntKi), PARAMETER :: M82N9FMye = 4302 + INTEGER(IntKi), PARAMETER :: M83N1FMye = 4303 + INTEGER(IntKi), PARAMETER :: M83N2FMye = 4304 + INTEGER(IntKi), PARAMETER :: M83N3FMye = 4305 + INTEGER(IntKi), PARAMETER :: M83N4FMye = 4306 + INTEGER(IntKi), PARAMETER :: M83N5FMye = 4307 + INTEGER(IntKi), PARAMETER :: M83N6FMye = 4308 + INTEGER(IntKi), PARAMETER :: M83N7FMye = 4309 + INTEGER(IntKi), PARAMETER :: M83N8FMye = 4310 + INTEGER(IntKi), PARAMETER :: M83N9FMye = 4311 + INTEGER(IntKi), PARAMETER :: M84N1FMye = 4312 + INTEGER(IntKi), PARAMETER :: M84N2FMye = 4313 + INTEGER(IntKi), PARAMETER :: M84N3FMye = 4314 + INTEGER(IntKi), PARAMETER :: M84N4FMye = 4315 + INTEGER(IntKi), PARAMETER :: M84N5FMye = 4316 + INTEGER(IntKi), PARAMETER :: M84N6FMye = 4317 + INTEGER(IntKi), PARAMETER :: M84N7FMye = 4318 + INTEGER(IntKi), PARAMETER :: M84N8FMye = 4319 + INTEGER(IntKi), PARAMETER :: M84N9FMye = 4320 + INTEGER(IntKi), PARAMETER :: M85N1FMye = 4321 + INTEGER(IntKi), PARAMETER :: M85N2FMye = 4322 + INTEGER(IntKi), PARAMETER :: M85N3FMye = 4323 + INTEGER(IntKi), PARAMETER :: M85N4FMye = 4324 + INTEGER(IntKi), PARAMETER :: M85N5FMye = 4325 + INTEGER(IntKi), PARAMETER :: M85N6FMye = 4326 + INTEGER(IntKi), PARAMETER :: M85N7FMye = 4327 + INTEGER(IntKi), PARAMETER :: M85N8FMye = 4328 + INTEGER(IntKi), PARAMETER :: M85N9FMye = 4329 + INTEGER(IntKi), PARAMETER :: M86N1FMye = 4330 + INTEGER(IntKi), PARAMETER :: M86N2FMye = 4331 + INTEGER(IntKi), PARAMETER :: M86N3FMye = 4332 + INTEGER(IntKi), PARAMETER :: M86N4FMye = 4333 + INTEGER(IntKi), PARAMETER :: M86N5FMye = 4334 + INTEGER(IntKi), PARAMETER :: M86N6FMye = 4335 + INTEGER(IntKi), PARAMETER :: M86N7FMye = 4336 + INTEGER(IntKi), PARAMETER :: M86N8FMye = 4337 + INTEGER(IntKi), PARAMETER :: M86N9FMye = 4338 + INTEGER(IntKi), PARAMETER :: M87N1FMye = 4339 + INTEGER(IntKi), PARAMETER :: M87N2FMye = 4340 + INTEGER(IntKi), PARAMETER :: M87N3FMye = 4341 + INTEGER(IntKi), PARAMETER :: M87N4FMye = 4342 + INTEGER(IntKi), PARAMETER :: M87N5FMye = 4343 + INTEGER(IntKi), PARAMETER :: M87N6FMye = 4344 + INTEGER(IntKi), PARAMETER :: M87N7FMye = 4345 + INTEGER(IntKi), PARAMETER :: M87N8FMye = 4346 + INTEGER(IntKi), PARAMETER :: M87N9FMye = 4347 + INTEGER(IntKi), PARAMETER :: M88N1FMye = 4348 + INTEGER(IntKi), PARAMETER :: M88N2FMye = 4349 + INTEGER(IntKi), PARAMETER :: M88N3FMye = 4350 + INTEGER(IntKi), PARAMETER :: M88N4FMye = 4351 + INTEGER(IntKi), PARAMETER :: M88N5FMye = 4352 + INTEGER(IntKi), PARAMETER :: M88N6FMye = 4353 + INTEGER(IntKi), PARAMETER :: M88N7FMye = 4354 + INTEGER(IntKi), PARAMETER :: M88N8FMye = 4355 + INTEGER(IntKi), PARAMETER :: M88N9FMye = 4356 + INTEGER(IntKi), PARAMETER :: M89N1FMye = 4357 + INTEGER(IntKi), PARAMETER :: M89N2FMye = 4358 + INTEGER(IntKi), PARAMETER :: M89N3FMye = 4359 + INTEGER(IntKi), PARAMETER :: M89N4FMye = 4360 + INTEGER(IntKi), PARAMETER :: M89N5FMye = 4361 + INTEGER(IntKi), PARAMETER :: M89N6FMye = 4362 + INTEGER(IntKi), PARAMETER :: M89N7FMye = 4363 + INTEGER(IntKi), PARAMETER :: M89N8FMye = 4364 + INTEGER(IntKi), PARAMETER :: M89N9FMye = 4365 + INTEGER(IntKi), PARAMETER :: M90N1FMye = 4366 + INTEGER(IntKi), PARAMETER :: M90N2FMye = 4367 + INTEGER(IntKi), PARAMETER :: M90N3FMye = 4368 + INTEGER(IntKi), PARAMETER :: M90N4FMye = 4369 + INTEGER(IntKi), PARAMETER :: M90N5FMye = 4370 + INTEGER(IntKi), PARAMETER :: M90N6FMye = 4371 + INTEGER(IntKi), PARAMETER :: M90N7FMye = 4372 + INTEGER(IntKi), PARAMETER :: M90N8FMye = 4373 + INTEGER(IntKi), PARAMETER :: M90N9FMye = 4374 + INTEGER(IntKi), PARAMETER :: M91N1FMye = 4375 + INTEGER(IntKi), PARAMETER :: M91N2FMye = 4376 + INTEGER(IntKi), PARAMETER :: M91N3FMye = 4377 + INTEGER(IntKi), PARAMETER :: M91N4FMye = 4378 + INTEGER(IntKi), PARAMETER :: M91N5FMye = 4379 + INTEGER(IntKi), PARAMETER :: M91N6FMye = 4380 + INTEGER(IntKi), PARAMETER :: M91N7FMye = 4381 + INTEGER(IntKi), PARAMETER :: M91N8FMye = 4382 + INTEGER(IntKi), PARAMETER :: M91N9FMye = 4383 + INTEGER(IntKi), PARAMETER :: M92N1FMye = 4384 + INTEGER(IntKi), PARAMETER :: M92N2FMye = 4385 + INTEGER(IntKi), PARAMETER :: M92N3FMye = 4386 + INTEGER(IntKi), PARAMETER :: M92N4FMye = 4387 + INTEGER(IntKi), PARAMETER :: M92N5FMye = 4388 + INTEGER(IntKi), PARAMETER :: M92N6FMye = 4389 + INTEGER(IntKi), PARAMETER :: M92N7FMye = 4390 + INTEGER(IntKi), PARAMETER :: M92N8FMye = 4391 + INTEGER(IntKi), PARAMETER :: M92N9FMye = 4392 + INTEGER(IntKi), PARAMETER :: M93N1FMye = 4393 + INTEGER(IntKi), PARAMETER :: M93N2FMye = 4394 + INTEGER(IntKi), PARAMETER :: M93N3FMye = 4395 + INTEGER(IntKi), PARAMETER :: M93N4FMye = 4396 + INTEGER(IntKi), PARAMETER :: M93N5FMye = 4397 + INTEGER(IntKi), PARAMETER :: M93N6FMye = 4398 + INTEGER(IntKi), PARAMETER :: M93N7FMye = 4399 + INTEGER(IntKi), PARAMETER :: M93N8FMye = 4400 + INTEGER(IntKi), PARAMETER :: M93N9FMye = 4401 + INTEGER(IntKi), PARAMETER :: M94N1FMye = 4402 + INTEGER(IntKi), PARAMETER :: M94N2FMye = 4403 + INTEGER(IntKi), PARAMETER :: M94N3FMye = 4404 + INTEGER(IntKi), PARAMETER :: M94N4FMye = 4405 + INTEGER(IntKi), PARAMETER :: M94N5FMye = 4406 + INTEGER(IntKi), PARAMETER :: M94N6FMye = 4407 + INTEGER(IntKi), PARAMETER :: M94N7FMye = 4408 + INTEGER(IntKi), PARAMETER :: M94N8FMye = 4409 + INTEGER(IntKi), PARAMETER :: M94N9FMye = 4410 + INTEGER(IntKi), PARAMETER :: M95N1FMye = 4411 + INTEGER(IntKi), PARAMETER :: M95N2FMye = 4412 + INTEGER(IntKi), PARAMETER :: M95N3FMye = 4413 + INTEGER(IntKi), PARAMETER :: M95N4FMye = 4414 + INTEGER(IntKi), PARAMETER :: M95N5FMye = 4415 + INTEGER(IntKi), PARAMETER :: M95N6FMye = 4416 + INTEGER(IntKi), PARAMETER :: M95N7FMye = 4417 + INTEGER(IntKi), PARAMETER :: M95N8FMye = 4418 + INTEGER(IntKi), PARAMETER :: M95N9FMye = 4419 + INTEGER(IntKi), PARAMETER :: M96N1FMye = 4420 + INTEGER(IntKi), PARAMETER :: M96N2FMye = 4421 + INTEGER(IntKi), PARAMETER :: M96N3FMye = 4422 + INTEGER(IntKi), PARAMETER :: M96N4FMye = 4423 + INTEGER(IntKi), PARAMETER :: M96N5FMye = 4424 + INTEGER(IntKi), PARAMETER :: M96N6FMye = 4425 + INTEGER(IntKi), PARAMETER :: M96N7FMye = 4426 + INTEGER(IntKi), PARAMETER :: M96N8FMye = 4427 + INTEGER(IntKi), PARAMETER :: M96N9FMye = 4428 + INTEGER(IntKi), PARAMETER :: M97N1FMye = 4429 + INTEGER(IntKi), PARAMETER :: M97N2FMye = 4430 + INTEGER(IntKi), PARAMETER :: M97N3FMye = 4431 + INTEGER(IntKi), PARAMETER :: M97N4FMye = 4432 + INTEGER(IntKi), PARAMETER :: M97N5FMye = 4433 + INTEGER(IntKi), PARAMETER :: M97N6FMye = 4434 + INTEGER(IntKi), PARAMETER :: M97N7FMye = 4435 + INTEGER(IntKi), PARAMETER :: M97N8FMye = 4436 + INTEGER(IntKi), PARAMETER :: M97N9FMye = 4437 + INTEGER(IntKi), PARAMETER :: M98N1FMye = 4438 + INTEGER(IntKi), PARAMETER :: M98N2FMye = 4439 + INTEGER(IntKi), PARAMETER :: M98N3FMye = 4440 + INTEGER(IntKi), PARAMETER :: M98N4FMye = 4441 + INTEGER(IntKi), PARAMETER :: M98N5FMye = 4442 + INTEGER(IntKi), PARAMETER :: M98N6FMye = 4443 + INTEGER(IntKi), PARAMETER :: M98N7FMye = 4444 + INTEGER(IntKi), PARAMETER :: M98N8FMye = 4445 + INTEGER(IntKi), PARAMETER :: M98N9FMye = 4446 + INTEGER(IntKi), PARAMETER :: M99N1FMye = 4447 + INTEGER(IntKi), PARAMETER :: M99N2FMye = 4448 + INTEGER(IntKi), PARAMETER :: M99N3FMye = 4449 + INTEGER(IntKi), PARAMETER :: M99N4FMye = 4450 + INTEGER(IntKi), PARAMETER :: M99N5FMye = 4451 + INTEGER(IntKi), PARAMETER :: M99N6FMye = 4452 + INTEGER(IntKi), PARAMETER :: M99N7FMye = 4453 + INTEGER(IntKi), PARAMETER :: M99N8FMye = 4454 + INTEGER(IntKi), PARAMETER :: M99N9FMye = 4455 + INTEGER(IntKi), PARAMETER :: M01N1FMze = 4456 + INTEGER(IntKi), PARAMETER :: M01N2FMze = 4457 + INTEGER(IntKi), PARAMETER :: M01N3FMze = 4458 + INTEGER(IntKi), PARAMETER :: M01N4FMze = 4459 + INTEGER(IntKi), PARAMETER :: M01N5FMze = 4460 + INTEGER(IntKi), PARAMETER :: M01N6FMze = 4461 + INTEGER(IntKi), PARAMETER :: M01N7FMze = 4462 + INTEGER(IntKi), PARAMETER :: M01N8FMze = 4463 + INTEGER(IntKi), PARAMETER :: M01N9FMze = 4464 + INTEGER(IntKi), PARAMETER :: M02N1FMze = 4465 + INTEGER(IntKi), PARAMETER :: M02N2FMze = 4466 + INTEGER(IntKi), PARAMETER :: M02N3FMze = 4467 + INTEGER(IntKi), PARAMETER :: M02N4FMze = 4468 + INTEGER(IntKi), PARAMETER :: M02N5FMze = 4469 + INTEGER(IntKi), PARAMETER :: M02N6FMze = 4470 + INTEGER(IntKi), PARAMETER :: M02N7FMze = 4471 + INTEGER(IntKi), PARAMETER :: M02N8FMze = 4472 + INTEGER(IntKi), PARAMETER :: M02N9FMze = 4473 + INTEGER(IntKi), PARAMETER :: M03N1FMze = 4474 + INTEGER(IntKi), PARAMETER :: M03N2FMze = 4475 + INTEGER(IntKi), PARAMETER :: M03N3FMze = 4476 + INTEGER(IntKi), PARAMETER :: M03N4FMze = 4477 + INTEGER(IntKi), PARAMETER :: M03N5FMze = 4478 + INTEGER(IntKi), PARAMETER :: M03N6FMze = 4479 + INTEGER(IntKi), PARAMETER :: M03N7FMze = 4480 + INTEGER(IntKi), PARAMETER :: M03N8FMze = 4481 + INTEGER(IntKi), PARAMETER :: M03N9FMze = 4482 + INTEGER(IntKi), PARAMETER :: M04N1FMze = 4483 + INTEGER(IntKi), PARAMETER :: M04N2FMze = 4484 + INTEGER(IntKi), PARAMETER :: M04N3FMze = 4485 + INTEGER(IntKi), PARAMETER :: M04N4FMze = 4486 + INTEGER(IntKi), PARAMETER :: M04N5FMze = 4487 + INTEGER(IntKi), PARAMETER :: M04N6FMze = 4488 + INTEGER(IntKi), PARAMETER :: M04N7FMze = 4489 + INTEGER(IntKi), PARAMETER :: M04N8FMze = 4490 + INTEGER(IntKi), PARAMETER :: M04N9FMze = 4491 + INTEGER(IntKi), PARAMETER :: M05N1FMze = 4492 + INTEGER(IntKi), PARAMETER :: M05N2FMze = 4493 + INTEGER(IntKi), PARAMETER :: M05N3FMze = 4494 + INTEGER(IntKi), PARAMETER :: M05N4FMze = 4495 + INTEGER(IntKi), PARAMETER :: M05N5FMze = 4496 + INTEGER(IntKi), PARAMETER :: M05N6FMze = 4497 + INTEGER(IntKi), PARAMETER :: M05N7FMze = 4498 + INTEGER(IntKi), PARAMETER :: M05N8FMze = 4499 + INTEGER(IntKi), PARAMETER :: M05N9FMze = 4500 + INTEGER(IntKi), PARAMETER :: M06N1FMze = 4501 + INTEGER(IntKi), PARAMETER :: M06N2FMze = 4502 + INTEGER(IntKi), PARAMETER :: M06N3FMze = 4503 + INTEGER(IntKi), PARAMETER :: M06N4FMze = 4504 + INTEGER(IntKi), PARAMETER :: M06N5FMze = 4505 + INTEGER(IntKi), PARAMETER :: M06N6FMze = 4506 + INTEGER(IntKi), PARAMETER :: M06N7FMze = 4507 + INTEGER(IntKi), PARAMETER :: M06N8FMze = 4508 + INTEGER(IntKi), PARAMETER :: M06N9FMze = 4509 + INTEGER(IntKi), PARAMETER :: M07N1FMze = 4510 + INTEGER(IntKi), PARAMETER :: M07N2FMze = 4511 + INTEGER(IntKi), PARAMETER :: M07N3FMze = 4512 + INTEGER(IntKi), PARAMETER :: M07N4FMze = 4513 + INTEGER(IntKi), PARAMETER :: M07N5FMze = 4514 + INTEGER(IntKi), PARAMETER :: M07N6FMze = 4515 + INTEGER(IntKi), PARAMETER :: M07N7FMze = 4516 + INTEGER(IntKi), PARAMETER :: M07N8FMze = 4517 + INTEGER(IntKi), PARAMETER :: M07N9FMze = 4518 + INTEGER(IntKi), PARAMETER :: M08N1FMze = 4519 + INTEGER(IntKi), PARAMETER :: M08N2FMze = 4520 + INTEGER(IntKi), PARAMETER :: M08N3FMze = 4521 + INTEGER(IntKi), PARAMETER :: M08N4FMze = 4522 + INTEGER(IntKi), PARAMETER :: M08N5FMze = 4523 + INTEGER(IntKi), PARAMETER :: M08N6FMze = 4524 + INTEGER(IntKi), PARAMETER :: M08N7FMze = 4525 + INTEGER(IntKi), PARAMETER :: M08N8FMze = 4526 + INTEGER(IntKi), PARAMETER :: M08N9FMze = 4527 + INTEGER(IntKi), PARAMETER :: M09N1FMze = 4528 + INTEGER(IntKi), PARAMETER :: M09N2FMze = 4529 + INTEGER(IntKi), PARAMETER :: M09N3FMze = 4530 + INTEGER(IntKi), PARAMETER :: M09N4FMze = 4531 + INTEGER(IntKi), PARAMETER :: M09N5FMze = 4532 + INTEGER(IntKi), PARAMETER :: M09N6FMze = 4533 + INTEGER(IntKi), PARAMETER :: M09N7FMze = 4534 + INTEGER(IntKi), PARAMETER :: M09N8FMze = 4535 + INTEGER(IntKi), PARAMETER :: M09N9FMze = 4536 + INTEGER(IntKi), PARAMETER :: M10N1FMze = 4537 + INTEGER(IntKi), PARAMETER :: M10N2FMze = 4538 + INTEGER(IntKi), PARAMETER :: M10N3FMze = 4539 + INTEGER(IntKi), PARAMETER :: M10N4FMze = 4540 + INTEGER(IntKi), PARAMETER :: M10N5FMze = 4541 + INTEGER(IntKi), PARAMETER :: M10N6FMze = 4542 + INTEGER(IntKi), PARAMETER :: M10N7FMze = 4543 + INTEGER(IntKi), PARAMETER :: M10N8FMze = 4544 + INTEGER(IntKi), PARAMETER :: M10N9FMze = 4545 + INTEGER(IntKi), PARAMETER :: M11N1FMze = 4546 + INTEGER(IntKi), PARAMETER :: M11N2FMze = 4547 + INTEGER(IntKi), PARAMETER :: M11N3FMze = 4548 + INTEGER(IntKi), PARAMETER :: M11N4FMze = 4549 + INTEGER(IntKi), PARAMETER :: M11N5FMze = 4550 + INTEGER(IntKi), PARAMETER :: M11N6FMze = 4551 + INTEGER(IntKi), PARAMETER :: M11N7FMze = 4552 + INTEGER(IntKi), PARAMETER :: M11N8FMze = 4553 + INTEGER(IntKi), PARAMETER :: M11N9FMze = 4554 + INTEGER(IntKi), PARAMETER :: M12N1FMze = 4555 + INTEGER(IntKi), PARAMETER :: M12N2FMze = 4556 + INTEGER(IntKi), PARAMETER :: M12N3FMze = 4557 + INTEGER(IntKi), PARAMETER :: M12N4FMze = 4558 + INTEGER(IntKi), PARAMETER :: M12N5FMze = 4559 + INTEGER(IntKi), PARAMETER :: M12N6FMze = 4560 + INTEGER(IntKi), PARAMETER :: M12N7FMze = 4561 + INTEGER(IntKi), PARAMETER :: M12N8FMze = 4562 + INTEGER(IntKi), PARAMETER :: M12N9FMze = 4563 + INTEGER(IntKi), PARAMETER :: M13N1FMze = 4564 + INTEGER(IntKi), PARAMETER :: M13N2FMze = 4565 + INTEGER(IntKi), PARAMETER :: M13N3FMze = 4566 + INTEGER(IntKi), PARAMETER :: M13N4FMze = 4567 + INTEGER(IntKi), PARAMETER :: M13N5FMze = 4568 + INTEGER(IntKi), PARAMETER :: M13N6FMze = 4569 + INTEGER(IntKi), PARAMETER :: M13N7FMze = 4570 + INTEGER(IntKi), PARAMETER :: M13N8FMze = 4571 + INTEGER(IntKi), PARAMETER :: M13N9FMze = 4572 + INTEGER(IntKi), PARAMETER :: M14N1FMze = 4573 + INTEGER(IntKi), PARAMETER :: M14N2FMze = 4574 + INTEGER(IntKi), PARAMETER :: M14N3FMze = 4575 + INTEGER(IntKi), PARAMETER :: M14N4FMze = 4576 + INTEGER(IntKi), PARAMETER :: M14N5FMze = 4577 + INTEGER(IntKi), PARAMETER :: M14N6FMze = 4578 + INTEGER(IntKi), PARAMETER :: M14N7FMze = 4579 + INTEGER(IntKi), PARAMETER :: M14N8FMze = 4580 + INTEGER(IntKi), PARAMETER :: M14N9FMze = 4581 + INTEGER(IntKi), PARAMETER :: M15N1FMze = 4582 + INTEGER(IntKi), PARAMETER :: M15N2FMze = 4583 + INTEGER(IntKi), PARAMETER :: M15N3FMze = 4584 + INTEGER(IntKi), PARAMETER :: M15N4FMze = 4585 + INTEGER(IntKi), PARAMETER :: M15N5FMze = 4586 + INTEGER(IntKi), PARAMETER :: M15N6FMze = 4587 + INTEGER(IntKi), PARAMETER :: M15N7FMze = 4588 + INTEGER(IntKi), PARAMETER :: M15N8FMze = 4589 + INTEGER(IntKi), PARAMETER :: M15N9FMze = 4590 + INTEGER(IntKi), PARAMETER :: M16N1FMze = 4591 + INTEGER(IntKi), PARAMETER :: M16N2FMze = 4592 + INTEGER(IntKi), PARAMETER :: M16N3FMze = 4593 + INTEGER(IntKi), PARAMETER :: M16N4FMze = 4594 + INTEGER(IntKi), PARAMETER :: M16N5FMze = 4595 + INTEGER(IntKi), PARAMETER :: M16N6FMze = 4596 + INTEGER(IntKi), PARAMETER :: M16N7FMze = 4597 + INTEGER(IntKi), PARAMETER :: M16N8FMze = 4598 + INTEGER(IntKi), PARAMETER :: M16N9FMze = 4599 + INTEGER(IntKi), PARAMETER :: M17N1FMze = 4600 + INTEGER(IntKi), PARAMETER :: M17N2FMze = 4601 + INTEGER(IntKi), PARAMETER :: M17N3FMze = 4602 + INTEGER(IntKi), PARAMETER :: M17N4FMze = 4603 + INTEGER(IntKi), PARAMETER :: M17N5FMze = 4604 + INTEGER(IntKi), PARAMETER :: M17N6FMze = 4605 + INTEGER(IntKi), PARAMETER :: M17N7FMze = 4606 + INTEGER(IntKi), PARAMETER :: M17N8FMze = 4607 + INTEGER(IntKi), PARAMETER :: M17N9FMze = 4608 + INTEGER(IntKi), PARAMETER :: M18N1FMze = 4609 + INTEGER(IntKi), PARAMETER :: M18N2FMze = 4610 + INTEGER(IntKi), PARAMETER :: M18N3FMze = 4611 + INTEGER(IntKi), PARAMETER :: M18N4FMze = 4612 + INTEGER(IntKi), PARAMETER :: M18N5FMze = 4613 + INTEGER(IntKi), PARAMETER :: M18N6FMze = 4614 + INTEGER(IntKi), PARAMETER :: M18N7FMze = 4615 + INTEGER(IntKi), PARAMETER :: M18N8FMze = 4616 + INTEGER(IntKi), PARAMETER :: M18N9FMze = 4617 + INTEGER(IntKi), PARAMETER :: M19N1FMze = 4618 + INTEGER(IntKi), PARAMETER :: M19N2FMze = 4619 + INTEGER(IntKi), PARAMETER :: M19N3FMze = 4620 + INTEGER(IntKi), PARAMETER :: M19N4FMze = 4621 + INTEGER(IntKi), PARAMETER :: M19N5FMze = 4622 + INTEGER(IntKi), PARAMETER :: M19N6FMze = 4623 + INTEGER(IntKi), PARAMETER :: M19N7FMze = 4624 + INTEGER(IntKi), PARAMETER :: M19N8FMze = 4625 + INTEGER(IntKi), PARAMETER :: M19N9FMze = 4626 + INTEGER(IntKi), PARAMETER :: M20N1FMze = 4627 + INTEGER(IntKi), PARAMETER :: M20N2FMze = 4628 + INTEGER(IntKi), PARAMETER :: M20N3FMze = 4629 + INTEGER(IntKi), PARAMETER :: M20N4FMze = 4630 + INTEGER(IntKi), PARAMETER :: M20N5FMze = 4631 + INTEGER(IntKi), PARAMETER :: M20N6FMze = 4632 + INTEGER(IntKi), PARAMETER :: M20N7FMze = 4633 + INTEGER(IntKi), PARAMETER :: M20N8FMze = 4634 + INTEGER(IntKi), PARAMETER :: M20N9FMze = 4635 + INTEGER(IntKi), PARAMETER :: M21N1FMze = 4636 + INTEGER(IntKi), PARAMETER :: M21N2FMze = 4637 + INTEGER(IntKi), PARAMETER :: M21N3FMze = 4638 + INTEGER(IntKi), PARAMETER :: M21N4FMze = 4639 + INTEGER(IntKi), PARAMETER :: M21N5FMze = 4640 + INTEGER(IntKi), PARAMETER :: M21N6FMze = 4641 + INTEGER(IntKi), PARAMETER :: M21N7FMze = 4642 + INTEGER(IntKi), PARAMETER :: M21N8FMze = 4643 + INTEGER(IntKi), PARAMETER :: M21N9FMze = 4644 + INTEGER(IntKi), PARAMETER :: M22N1FMze = 4645 + INTEGER(IntKi), PARAMETER :: M22N2FMze = 4646 + INTEGER(IntKi), PARAMETER :: M22N3FMze = 4647 + INTEGER(IntKi), PARAMETER :: M22N4FMze = 4648 + INTEGER(IntKi), PARAMETER :: M22N5FMze = 4649 + INTEGER(IntKi), PARAMETER :: M22N6FMze = 4650 + INTEGER(IntKi), PARAMETER :: M22N7FMze = 4651 + INTEGER(IntKi), PARAMETER :: M22N8FMze = 4652 + INTEGER(IntKi), PARAMETER :: M22N9FMze = 4653 + INTEGER(IntKi), PARAMETER :: M23N1FMze = 4654 + INTEGER(IntKi), PARAMETER :: M23N2FMze = 4655 + INTEGER(IntKi), PARAMETER :: M23N3FMze = 4656 + INTEGER(IntKi), PARAMETER :: M23N4FMze = 4657 + INTEGER(IntKi), PARAMETER :: M23N5FMze = 4658 + INTEGER(IntKi), PARAMETER :: M23N6FMze = 4659 + INTEGER(IntKi), PARAMETER :: M23N7FMze = 4660 + INTEGER(IntKi), PARAMETER :: M23N8FMze = 4661 + INTEGER(IntKi), PARAMETER :: M23N9FMze = 4662 + INTEGER(IntKi), PARAMETER :: M24N1FMze = 4663 + INTEGER(IntKi), PARAMETER :: M24N2FMze = 4664 + INTEGER(IntKi), PARAMETER :: M24N3FMze = 4665 + INTEGER(IntKi), PARAMETER :: M24N4FMze = 4666 + INTEGER(IntKi), PARAMETER :: M24N5FMze = 4667 + INTEGER(IntKi), PARAMETER :: M24N6FMze = 4668 + INTEGER(IntKi), PARAMETER :: M24N7FMze = 4669 + INTEGER(IntKi), PARAMETER :: M24N8FMze = 4670 + INTEGER(IntKi), PARAMETER :: M24N9FMze = 4671 + INTEGER(IntKi), PARAMETER :: M25N1FMze = 4672 + INTEGER(IntKi), PARAMETER :: M25N2FMze = 4673 + INTEGER(IntKi), PARAMETER :: M25N3FMze = 4674 + INTEGER(IntKi), PARAMETER :: M25N4FMze = 4675 + INTEGER(IntKi), PARAMETER :: M25N5FMze = 4676 + INTEGER(IntKi), PARAMETER :: M25N6FMze = 4677 + INTEGER(IntKi), PARAMETER :: M25N7FMze = 4678 + INTEGER(IntKi), PARAMETER :: M25N8FMze = 4679 + INTEGER(IntKi), PARAMETER :: M25N9FMze = 4680 + INTEGER(IntKi), PARAMETER :: M26N1FMze = 4681 + INTEGER(IntKi), PARAMETER :: M26N2FMze = 4682 + INTEGER(IntKi), PARAMETER :: M26N3FMze = 4683 + INTEGER(IntKi), PARAMETER :: M26N4FMze = 4684 + INTEGER(IntKi), PARAMETER :: M26N5FMze = 4685 + INTEGER(IntKi), PARAMETER :: M26N6FMze = 4686 + INTEGER(IntKi), PARAMETER :: M26N7FMze = 4687 + INTEGER(IntKi), PARAMETER :: M26N8FMze = 4688 + INTEGER(IntKi), PARAMETER :: M26N9FMze = 4689 + INTEGER(IntKi), PARAMETER :: M27N1FMze = 4690 + INTEGER(IntKi), PARAMETER :: M27N2FMze = 4691 + INTEGER(IntKi), PARAMETER :: M27N3FMze = 4692 + INTEGER(IntKi), PARAMETER :: M27N4FMze = 4693 + INTEGER(IntKi), PARAMETER :: M27N5FMze = 4694 + INTEGER(IntKi), PARAMETER :: M27N6FMze = 4695 + INTEGER(IntKi), PARAMETER :: M27N7FMze = 4696 + INTEGER(IntKi), PARAMETER :: M27N8FMze = 4697 + INTEGER(IntKi), PARAMETER :: M27N9FMze = 4698 + INTEGER(IntKi), PARAMETER :: M28N1FMze = 4699 + INTEGER(IntKi), PARAMETER :: M28N2FMze = 4700 + INTEGER(IntKi), PARAMETER :: M28N3FMze = 4701 + INTEGER(IntKi), PARAMETER :: M28N4FMze = 4702 + INTEGER(IntKi), PARAMETER :: M28N5FMze = 4703 + INTEGER(IntKi), PARAMETER :: M28N6FMze = 4704 + INTEGER(IntKi), PARAMETER :: M28N7FMze = 4705 + INTEGER(IntKi), PARAMETER :: M28N8FMze = 4706 + INTEGER(IntKi), PARAMETER :: M28N9FMze = 4707 + INTEGER(IntKi), PARAMETER :: M29N1FMze = 4708 + INTEGER(IntKi), PARAMETER :: M29N2FMze = 4709 + INTEGER(IntKi), PARAMETER :: M29N3FMze = 4710 + INTEGER(IntKi), PARAMETER :: M29N4FMze = 4711 + INTEGER(IntKi), PARAMETER :: M29N5FMze = 4712 + INTEGER(IntKi), PARAMETER :: M29N6FMze = 4713 + INTEGER(IntKi), PARAMETER :: M29N7FMze = 4714 + INTEGER(IntKi), PARAMETER :: M29N8FMze = 4715 + INTEGER(IntKi), PARAMETER :: M29N9FMze = 4716 + INTEGER(IntKi), PARAMETER :: M30N1FMze = 4717 + INTEGER(IntKi), PARAMETER :: M30N2FMze = 4718 + INTEGER(IntKi), PARAMETER :: M30N3FMze = 4719 + INTEGER(IntKi), PARAMETER :: M30N4FMze = 4720 + INTEGER(IntKi), PARAMETER :: M30N5FMze = 4721 + INTEGER(IntKi), PARAMETER :: M30N6FMze = 4722 + INTEGER(IntKi), PARAMETER :: M30N7FMze = 4723 + INTEGER(IntKi), PARAMETER :: M30N8FMze = 4724 + INTEGER(IntKi), PARAMETER :: M30N9FMze = 4725 + INTEGER(IntKi), PARAMETER :: M31N1FMze = 4726 + INTEGER(IntKi), PARAMETER :: M31N2FMze = 4727 + INTEGER(IntKi), PARAMETER :: M31N3FMze = 4728 + INTEGER(IntKi), PARAMETER :: M31N4FMze = 4729 + INTEGER(IntKi), PARAMETER :: M31N5FMze = 4730 + INTEGER(IntKi), PARAMETER :: M31N6FMze = 4731 + INTEGER(IntKi), PARAMETER :: M31N7FMze = 4732 + INTEGER(IntKi), PARAMETER :: M31N8FMze = 4733 + INTEGER(IntKi), PARAMETER :: M31N9FMze = 4734 + INTEGER(IntKi), PARAMETER :: M32N1FMze = 4735 + INTEGER(IntKi), PARAMETER :: M32N2FMze = 4736 + INTEGER(IntKi), PARAMETER :: M32N3FMze = 4737 + INTEGER(IntKi), PARAMETER :: M32N4FMze = 4738 + INTEGER(IntKi), PARAMETER :: M32N5FMze = 4739 + INTEGER(IntKi), PARAMETER :: M32N6FMze = 4740 + INTEGER(IntKi), PARAMETER :: M32N7FMze = 4741 + INTEGER(IntKi), PARAMETER :: M32N8FMze = 4742 + INTEGER(IntKi), PARAMETER :: M32N9FMze = 4743 + INTEGER(IntKi), PARAMETER :: M33N1FMze = 4744 + INTEGER(IntKi), PARAMETER :: M33N2FMze = 4745 + INTEGER(IntKi), PARAMETER :: M33N3FMze = 4746 + INTEGER(IntKi), PARAMETER :: M33N4FMze = 4747 + INTEGER(IntKi), PARAMETER :: M33N5FMze = 4748 + INTEGER(IntKi), PARAMETER :: M33N6FMze = 4749 + INTEGER(IntKi), PARAMETER :: M33N7FMze = 4750 + INTEGER(IntKi), PARAMETER :: M33N8FMze = 4751 + INTEGER(IntKi), PARAMETER :: M33N9FMze = 4752 + INTEGER(IntKi), PARAMETER :: M34N1FMze = 4753 + INTEGER(IntKi), PARAMETER :: M34N2FMze = 4754 + INTEGER(IntKi), PARAMETER :: M34N3FMze = 4755 + INTEGER(IntKi), PARAMETER :: M34N4FMze = 4756 + INTEGER(IntKi), PARAMETER :: M34N5FMze = 4757 + INTEGER(IntKi), PARAMETER :: M34N6FMze = 4758 + INTEGER(IntKi), PARAMETER :: M34N7FMze = 4759 + INTEGER(IntKi), PARAMETER :: M34N8FMze = 4760 + INTEGER(IntKi), PARAMETER :: M34N9FMze = 4761 + INTEGER(IntKi), PARAMETER :: M35N1FMze = 4762 + INTEGER(IntKi), PARAMETER :: M35N2FMze = 4763 + INTEGER(IntKi), PARAMETER :: M35N3FMze = 4764 + INTEGER(IntKi), PARAMETER :: M35N4FMze = 4765 + INTEGER(IntKi), PARAMETER :: M35N5FMze = 4766 + INTEGER(IntKi), PARAMETER :: M35N6FMze = 4767 + INTEGER(IntKi), PARAMETER :: M35N7FMze = 4768 + INTEGER(IntKi), PARAMETER :: M35N8FMze = 4769 + INTEGER(IntKi), PARAMETER :: M35N9FMze = 4770 + INTEGER(IntKi), PARAMETER :: M36N1FMze = 4771 + INTEGER(IntKi), PARAMETER :: M36N2FMze = 4772 + INTEGER(IntKi), PARAMETER :: M36N3FMze = 4773 + INTEGER(IntKi), PARAMETER :: M36N4FMze = 4774 + INTEGER(IntKi), PARAMETER :: M36N5FMze = 4775 + INTEGER(IntKi), PARAMETER :: M36N6FMze = 4776 + INTEGER(IntKi), PARAMETER :: M36N7FMze = 4777 + INTEGER(IntKi), PARAMETER :: M36N8FMze = 4778 + INTEGER(IntKi), PARAMETER :: M36N9FMze = 4779 + INTEGER(IntKi), PARAMETER :: M37N1FMze = 4780 + INTEGER(IntKi), PARAMETER :: M37N2FMze = 4781 + INTEGER(IntKi), PARAMETER :: M37N3FMze = 4782 + INTEGER(IntKi), PARAMETER :: M37N4FMze = 4783 + INTEGER(IntKi), PARAMETER :: M37N5FMze = 4784 + INTEGER(IntKi), PARAMETER :: M37N6FMze = 4785 + INTEGER(IntKi), PARAMETER :: M37N7FMze = 4786 + INTEGER(IntKi), PARAMETER :: M37N8FMze = 4787 + INTEGER(IntKi), PARAMETER :: M37N9FMze = 4788 + INTEGER(IntKi), PARAMETER :: M38N1FMze = 4789 + INTEGER(IntKi), PARAMETER :: M38N2FMze = 4790 + INTEGER(IntKi), PARAMETER :: M38N3FMze = 4791 + INTEGER(IntKi), PARAMETER :: M38N4FMze = 4792 + INTEGER(IntKi), PARAMETER :: M38N5FMze = 4793 + INTEGER(IntKi), PARAMETER :: M38N6FMze = 4794 + INTEGER(IntKi), PARAMETER :: M38N7FMze = 4795 + INTEGER(IntKi), PARAMETER :: M38N8FMze = 4796 + INTEGER(IntKi), PARAMETER :: M38N9FMze = 4797 + INTEGER(IntKi), PARAMETER :: M39N1FMze = 4798 + INTEGER(IntKi), PARAMETER :: M39N2FMze = 4799 + INTEGER(IntKi), PARAMETER :: M39N3FMze = 4800 + INTEGER(IntKi), PARAMETER :: M39N4FMze = 4801 + INTEGER(IntKi), PARAMETER :: M39N5FMze = 4802 + INTEGER(IntKi), PARAMETER :: M39N6FMze = 4803 + INTEGER(IntKi), PARAMETER :: M39N7FMze = 4804 + INTEGER(IntKi), PARAMETER :: M39N8FMze = 4805 + INTEGER(IntKi), PARAMETER :: M39N9FMze = 4806 + INTEGER(IntKi), PARAMETER :: M40N1FMze = 4807 + INTEGER(IntKi), PARAMETER :: M40N2FMze = 4808 + INTEGER(IntKi), PARAMETER :: M40N3FMze = 4809 + INTEGER(IntKi), PARAMETER :: M40N4FMze = 4810 + INTEGER(IntKi), PARAMETER :: M40N5FMze = 4811 + INTEGER(IntKi), PARAMETER :: M40N6FMze = 4812 + INTEGER(IntKi), PARAMETER :: M40N7FMze = 4813 + INTEGER(IntKi), PARAMETER :: M40N8FMze = 4814 + INTEGER(IntKi), PARAMETER :: M40N9FMze = 4815 + INTEGER(IntKi), PARAMETER :: M41N1FMze = 4816 + INTEGER(IntKi), PARAMETER :: M41N2FMze = 4817 + INTEGER(IntKi), PARAMETER :: M41N3FMze = 4818 + INTEGER(IntKi), PARAMETER :: M41N4FMze = 4819 + INTEGER(IntKi), PARAMETER :: M41N5FMze = 4820 + INTEGER(IntKi), PARAMETER :: M41N6FMze = 4821 + INTEGER(IntKi), PARAMETER :: M41N7FMze = 4822 + INTEGER(IntKi), PARAMETER :: M41N8FMze = 4823 + INTEGER(IntKi), PARAMETER :: M41N9FMze = 4824 + INTEGER(IntKi), PARAMETER :: M42N1FMze = 4825 + INTEGER(IntKi), PARAMETER :: M42N2FMze = 4826 + INTEGER(IntKi), PARAMETER :: M42N3FMze = 4827 + INTEGER(IntKi), PARAMETER :: M42N4FMze = 4828 + INTEGER(IntKi), PARAMETER :: M42N5FMze = 4829 + INTEGER(IntKi), PARAMETER :: M42N6FMze = 4830 + INTEGER(IntKi), PARAMETER :: M42N7FMze = 4831 + INTEGER(IntKi), PARAMETER :: M42N8FMze = 4832 + INTEGER(IntKi), PARAMETER :: M42N9FMze = 4833 + INTEGER(IntKi), PARAMETER :: M43N1FMze = 4834 + INTEGER(IntKi), PARAMETER :: M43N2FMze = 4835 + INTEGER(IntKi), PARAMETER :: M43N3FMze = 4836 + INTEGER(IntKi), PARAMETER :: M43N4FMze = 4837 + INTEGER(IntKi), PARAMETER :: M43N5FMze = 4838 + INTEGER(IntKi), PARAMETER :: M43N6FMze = 4839 + INTEGER(IntKi), PARAMETER :: M43N7FMze = 4840 + INTEGER(IntKi), PARAMETER :: M43N8FMze = 4841 + INTEGER(IntKi), PARAMETER :: M43N9FMze = 4842 + INTEGER(IntKi), PARAMETER :: M44N1FMze = 4843 + INTEGER(IntKi), PARAMETER :: M44N2FMze = 4844 + INTEGER(IntKi), PARAMETER :: M44N3FMze = 4845 + INTEGER(IntKi), PARAMETER :: M44N4FMze = 4846 + INTEGER(IntKi), PARAMETER :: M44N5FMze = 4847 + INTEGER(IntKi), PARAMETER :: M44N6FMze = 4848 + INTEGER(IntKi), PARAMETER :: M44N7FMze = 4849 + INTEGER(IntKi), PARAMETER :: M44N8FMze = 4850 + INTEGER(IntKi), PARAMETER :: M44N9FMze = 4851 + INTEGER(IntKi), PARAMETER :: M45N1FMze = 4852 + INTEGER(IntKi), PARAMETER :: M45N2FMze = 4853 + INTEGER(IntKi), PARAMETER :: M45N3FMze = 4854 + INTEGER(IntKi), PARAMETER :: M45N4FMze = 4855 + INTEGER(IntKi), PARAMETER :: M45N5FMze = 4856 + INTEGER(IntKi), PARAMETER :: M45N6FMze = 4857 + INTEGER(IntKi), PARAMETER :: M45N7FMze = 4858 + INTEGER(IntKi), PARAMETER :: M45N8FMze = 4859 + INTEGER(IntKi), PARAMETER :: M45N9FMze = 4860 + INTEGER(IntKi), PARAMETER :: M46N1FMze = 4861 + INTEGER(IntKi), PARAMETER :: M46N2FMze = 4862 + INTEGER(IntKi), PARAMETER :: M46N3FMze = 4863 + INTEGER(IntKi), PARAMETER :: M46N4FMze = 4864 + INTEGER(IntKi), PARAMETER :: M46N5FMze = 4865 + INTEGER(IntKi), PARAMETER :: M46N6FMze = 4866 + INTEGER(IntKi), PARAMETER :: M46N7FMze = 4867 + INTEGER(IntKi), PARAMETER :: M46N8FMze = 4868 + INTEGER(IntKi), PARAMETER :: M46N9FMze = 4869 + INTEGER(IntKi), PARAMETER :: M47N1FMze = 4870 + INTEGER(IntKi), PARAMETER :: M47N2FMze = 4871 + INTEGER(IntKi), PARAMETER :: M47N3FMze = 4872 + INTEGER(IntKi), PARAMETER :: M47N4FMze = 4873 + INTEGER(IntKi), PARAMETER :: M47N5FMze = 4874 + INTEGER(IntKi), PARAMETER :: M47N6FMze = 4875 + INTEGER(IntKi), PARAMETER :: M47N7FMze = 4876 + INTEGER(IntKi), PARAMETER :: M47N8FMze = 4877 + INTEGER(IntKi), PARAMETER :: M47N9FMze = 4878 + INTEGER(IntKi), PARAMETER :: M48N1FMze = 4879 + INTEGER(IntKi), PARAMETER :: M48N2FMze = 4880 + INTEGER(IntKi), PARAMETER :: M48N3FMze = 4881 + INTEGER(IntKi), PARAMETER :: M48N4FMze = 4882 + INTEGER(IntKi), PARAMETER :: M48N5FMze = 4883 + INTEGER(IntKi), PARAMETER :: M48N6FMze = 4884 + INTEGER(IntKi), PARAMETER :: M48N7FMze = 4885 + INTEGER(IntKi), PARAMETER :: M48N8FMze = 4886 + INTEGER(IntKi), PARAMETER :: M48N9FMze = 4887 + INTEGER(IntKi), PARAMETER :: M49N1FMze = 4888 + INTEGER(IntKi), PARAMETER :: M49N2FMze = 4889 + INTEGER(IntKi), PARAMETER :: M49N3FMze = 4890 + INTEGER(IntKi), PARAMETER :: M49N4FMze = 4891 + INTEGER(IntKi), PARAMETER :: M49N5FMze = 4892 + INTEGER(IntKi), PARAMETER :: M49N6FMze = 4893 + INTEGER(IntKi), PARAMETER :: M49N7FMze = 4894 + INTEGER(IntKi), PARAMETER :: M49N8FMze = 4895 + INTEGER(IntKi), PARAMETER :: M49N9FMze = 4896 + INTEGER(IntKi), PARAMETER :: M50N1FMze = 4897 + INTEGER(IntKi), PARAMETER :: M50N2FMze = 4898 + INTEGER(IntKi), PARAMETER :: M50N3FMze = 4899 + INTEGER(IntKi), PARAMETER :: M50N4FMze = 4900 + INTEGER(IntKi), PARAMETER :: M50N5FMze = 4901 + INTEGER(IntKi), PARAMETER :: M50N6FMze = 4902 + INTEGER(IntKi), PARAMETER :: M50N7FMze = 4903 + INTEGER(IntKi), PARAMETER :: M50N8FMze = 4904 + INTEGER(IntKi), PARAMETER :: M50N9FMze = 4905 + INTEGER(IntKi), PARAMETER :: M51N1FMze = 4906 + INTEGER(IntKi), PARAMETER :: M51N2FMze = 4907 + INTEGER(IntKi), PARAMETER :: M51N3FMze = 4908 + INTEGER(IntKi), PARAMETER :: M51N4FMze = 4909 + INTEGER(IntKi), PARAMETER :: M51N5FMze = 4910 + INTEGER(IntKi), PARAMETER :: M51N6FMze = 4911 + INTEGER(IntKi), PARAMETER :: M51N7FMze = 4912 + INTEGER(IntKi), PARAMETER :: M51N8FMze = 4913 + INTEGER(IntKi), PARAMETER :: M51N9FMze = 4914 + INTEGER(IntKi), PARAMETER :: M52N1FMze = 4915 + INTEGER(IntKi), PARAMETER :: M52N2FMze = 4916 + INTEGER(IntKi), PARAMETER :: M52N3FMze = 4917 + INTEGER(IntKi), PARAMETER :: M52N4FMze = 4918 + INTEGER(IntKi), PARAMETER :: M52N5FMze = 4919 + INTEGER(IntKi), PARAMETER :: M52N6FMze = 4920 + INTEGER(IntKi), PARAMETER :: M52N7FMze = 4921 + INTEGER(IntKi), PARAMETER :: M52N8FMze = 4922 + INTEGER(IntKi), PARAMETER :: M52N9FMze = 4923 + INTEGER(IntKi), PARAMETER :: M53N1FMze = 4924 + INTEGER(IntKi), PARAMETER :: M53N2FMze = 4925 + INTEGER(IntKi), PARAMETER :: M53N3FMze = 4926 + INTEGER(IntKi), PARAMETER :: M53N4FMze = 4927 + INTEGER(IntKi), PARAMETER :: M53N5FMze = 4928 + INTEGER(IntKi), PARAMETER :: M53N6FMze = 4929 + INTEGER(IntKi), PARAMETER :: M53N7FMze = 4930 + INTEGER(IntKi), PARAMETER :: M53N8FMze = 4931 + INTEGER(IntKi), PARAMETER :: M53N9FMze = 4932 + INTEGER(IntKi), PARAMETER :: M54N1FMze = 4933 + INTEGER(IntKi), PARAMETER :: M54N2FMze = 4934 + INTEGER(IntKi), PARAMETER :: M54N3FMze = 4935 + INTEGER(IntKi), PARAMETER :: M54N4FMze = 4936 + INTEGER(IntKi), PARAMETER :: M54N5FMze = 4937 + INTEGER(IntKi), PARAMETER :: M54N6FMze = 4938 + INTEGER(IntKi), PARAMETER :: M54N7FMze = 4939 + INTEGER(IntKi), PARAMETER :: M54N8FMze = 4940 + INTEGER(IntKi), PARAMETER :: M54N9FMze = 4941 + INTEGER(IntKi), PARAMETER :: M55N1FMze = 4942 + INTEGER(IntKi), PARAMETER :: M55N2FMze = 4943 + INTEGER(IntKi), PARAMETER :: M55N3FMze = 4944 + INTEGER(IntKi), PARAMETER :: M55N4FMze = 4945 + INTEGER(IntKi), PARAMETER :: M55N5FMze = 4946 + INTEGER(IntKi), PARAMETER :: M55N6FMze = 4947 + INTEGER(IntKi), PARAMETER :: M55N7FMze = 4948 + INTEGER(IntKi), PARAMETER :: M55N8FMze = 4949 + INTEGER(IntKi), PARAMETER :: M55N9FMze = 4950 + INTEGER(IntKi), PARAMETER :: M56N1FMze = 4951 + INTEGER(IntKi), PARAMETER :: M56N2FMze = 4952 + INTEGER(IntKi), PARAMETER :: M56N3FMze = 4953 + INTEGER(IntKi), PARAMETER :: M56N4FMze = 4954 + INTEGER(IntKi), PARAMETER :: M56N5FMze = 4955 + INTEGER(IntKi), PARAMETER :: M56N6FMze = 4956 + INTEGER(IntKi), PARAMETER :: M56N7FMze = 4957 + INTEGER(IntKi), PARAMETER :: M56N8FMze = 4958 + INTEGER(IntKi), PARAMETER :: M56N9FMze = 4959 + INTEGER(IntKi), PARAMETER :: M57N1FMze = 4960 + INTEGER(IntKi), PARAMETER :: M57N2FMze = 4961 + INTEGER(IntKi), PARAMETER :: M57N3FMze = 4962 + INTEGER(IntKi), PARAMETER :: M57N4FMze = 4963 + INTEGER(IntKi), PARAMETER :: M57N5FMze = 4964 + INTEGER(IntKi), PARAMETER :: M57N6FMze = 4965 + INTEGER(IntKi), PARAMETER :: M57N7FMze = 4966 + INTEGER(IntKi), PARAMETER :: M57N8FMze = 4967 + INTEGER(IntKi), PARAMETER :: M57N9FMze = 4968 + INTEGER(IntKi), PARAMETER :: M58N1FMze = 4969 + INTEGER(IntKi), PARAMETER :: M58N2FMze = 4970 + INTEGER(IntKi), PARAMETER :: M58N3FMze = 4971 + INTEGER(IntKi), PARAMETER :: M58N4FMze = 4972 + INTEGER(IntKi), PARAMETER :: M58N5FMze = 4973 + INTEGER(IntKi), PARAMETER :: M58N6FMze = 4974 + INTEGER(IntKi), PARAMETER :: M58N7FMze = 4975 + INTEGER(IntKi), PARAMETER :: M58N8FMze = 4976 + INTEGER(IntKi), PARAMETER :: M58N9FMze = 4977 + INTEGER(IntKi), PARAMETER :: M59N1FMze = 4978 + INTEGER(IntKi), PARAMETER :: M59N2FMze = 4979 + INTEGER(IntKi), PARAMETER :: M59N3FMze = 4980 + INTEGER(IntKi), PARAMETER :: M59N4FMze = 4981 + INTEGER(IntKi), PARAMETER :: M59N5FMze = 4982 + INTEGER(IntKi), PARAMETER :: M59N6FMze = 4983 + INTEGER(IntKi), PARAMETER :: M59N7FMze = 4984 + INTEGER(IntKi), PARAMETER :: M59N8FMze = 4985 + INTEGER(IntKi), PARAMETER :: M59N9FMze = 4986 + INTEGER(IntKi), PARAMETER :: M60N1FMze = 4987 + INTEGER(IntKi), PARAMETER :: M60N2FMze = 4988 + INTEGER(IntKi), PARAMETER :: M60N3FMze = 4989 + INTEGER(IntKi), PARAMETER :: M60N4FMze = 4990 + INTEGER(IntKi), PARAMETER :: M60N5FMze = 4991 + INTEGER(IntKi), PARAMETER :: M60N6FMze = 4992 + INTEGER(IntKi), PARAMETER :: M60N7FMze = 4993 + INTEGER(IntKi), PARAMETER :: M60N8FMze = 4994 + INTEGER(IntKi), PARAMETER :: M60N9FMze = 4995 + INTEGER(IntKi), PARAMETER :: M61N1FMze = 4996 + INTEGER(IntKi), PARAMETER :: M61N2FMze = 4997 + INTEGER(IntKi), PARAMETER :: M61N3FMze = 4998 + INTEGER(IntKi), PARAMETER :: M61N4FMze = 4999 + INTEGER(IntKi), PARAMETER :: M61N5FMze = 5000 + INTEGER(IntKi), PARAMETER :: M61N6FMze = 5001 + INTEGER(IntKi), PARAMETER :: M61N7FMze = 5002 + INTEGER(IntKi), PARAMETER :: M61N8FMze = 5003 + INTEGER(IntKi), PARAMETER :: M61N9FMze = 5004 + INTEGER(IntKi), PARAMETER :: M62N1FMze = 5005 + INTEGER(IntKi), PARAMETER :: M62N2FMze = 5006 + INTEGER(IntKi), PARAMETER :: M62N3FMze = 5007 + INTEGER(IntKi), PARAMETER :: M62N4FMze = 5008 + INTEGER(IntKi), PARAMETER :: M62N5FMze = 5009 + INTEGER(IntKi), PARAMETER :: M62N6FMze = 5010 + INTEGER(IntKi), PARAMETER :: M62N7FMze = 5011 + INTEGER(IntKi), PARAMETER :: M62N8FMze = 5012 + INTEGER(IntKi), PARAMETER :: M62N9FMze = 5013 + INTEGER(IntKi), PARAMETER :: M63N1FMze = 5014 + INTEGER(IntKi), PARAMETER :: M63N2FMze = 5015 + INTEGER(IntKi), PARAMETER :: M63N3FMze = 5016 + INTEGER(IntKi), PARAMETER :: M63N4FMze = 5017 + INTEGER(IntKi), PARAMETER :: M63N5FMze = 5018 + INTEGER(IntKi), PARAMETER :: M63N6FMze = 5019 + INTEGER(IntKi), PARAMETER :: M63N7FMze = 5020 + INTEGER(IntKi), PARAMETER :: M63N8FMze = 5021 + INTEGER(IntKi), PARAMETER :: M63N9FMze = 5022 + INTEGER(IntKi), PARAMETER :: M64N1FMze = 5023 + INTEGER(IntKi), PARAMETER :: M64N2FMze = 5024 + INTEGER(IntKi), PARAMETER :: M64N3FMze = 5025 + INTEGER(IntKi), PARAMETER :: M64N4FMze = 5026 + INTEGER(IntKi), PARAMETER :: M64N5FMze = 5027 + INTEGER(IntKi), PARAMETER :: M64N6FMze = 5028 + INTEGER(IntKi), PARAMETER :: M64N7FMze = 5029 + INTEGER(IntKi), PARAMETER :: M64N8FMze = 5030 + INTEGER(IntKi), PARAMETER :: M64N9FMze = 5031 + INTEGER(IntKi), PARAMETER :: M65N1FMze = 5032 + INTEGER(IntKi), PARAMETER :: M65N2FMze = 5033 + INTEGER(IntKi), PARAMETER :: M65N3FMze = 5034 + INTEGER(IntKi), PARAMETER :: M65N4FMze = 5035 + INTEGER(IntKi), PARAMETER :: M65N5FMze = 5036 + INTEGER(IntKi), PARAMETER :: M65N6FMze = 5037 + INTEGER(IntKi), PARAMETER :: M65N7FMze = 5038 + INTEGER(IntKi), PARAMETER :: M65N8FMze = 5039 + INTEGER(IntKi), PARAMETER :: M65N9FMze = 5040 + INTEGER(IntKi), PARAMETER :: M66N1FMze = 5041 + INTEGER(IntKi), PARAMETER :: M66N2FMze = 5042 + INTEGER(IntKi), PARAMETER :: M66N3FMze = 5043 + INTEGER(IntKi), PARAMETER :: M66N4FMze = 5044 + INTEGER(IntKi), PARAMETER :: M66N5FMze = 5045 + INTEGER(IntKi), PARAMETER :: M66N6FMze = 5046 + INTEGER(IntKi), PARAMETER :: M66N7FMze = 5047 + INTEGER(IntKi), PARAMETER :: M66N8FMze = 5048 + INTEGER(IntKi), PARAMETER :: M66N9FMze = 5049 + INTEGER(IntKi), PARAMETER :: M67N1FMze = 5050 + INTEGER(IntKi), PARAMETER :: M67N2FMze = 5051 + INTEGER(IntKi), PARAMETER :: M67N3FMze = 5052 + INTEGER(IntKi), PARAMETER :: M67N4FMze = 5053 + INTEGER(IntKi), PARAMETER :: M67N5FMze = 5054 + INTEGER(IntKi), PARAMETER :: M67N6FMze = 5055 + INTEGER(IntKi), PARAMETER :: M67N7FMze = 5056 + INTEGER(IntKi), PARAMETER :: M67N8FMze = 5057 + INTEGER(IntKi), PARAMETER :: M67N9FMze = 5058 + INTEGER(IntKi), PARAMETER :: M68N1FMze = 5059 + INTEGER(IntKi), PARAMETER :: M68N2FMze = 5060 + INTEGER(IntKi), PARAMETER :: M68N3FMze = 5061 + INTEGER(IntKi), PARAMETER :: M68N4FMze = 5062 + INTEGER(IntKi), PARAMETER :: M68N5FMze = 5063 + INTEGER(IntKi), PARAMETER :: M68N6FMze = 5064 + INTEGER(IntKi), PARAMETER :: M68N7FMze = 5065 + INTEGER(IntKi), PARAMETER :: M68N8FMze = 5066 + INTEGER(IntKi), PARAMETER :: M68N9FMze = 5067 + INTEGER(IntKi), PARAMETER :: M69N1FMze = 5068 + INTEGER(IntKi), PARAMETER :: M69N2FMze = 5069 + INTEGER(IntKi), PARAMETER :: M69N3FMze = 5070 + INTEGER(IntKi), PARAMETER :: M69N4FMze = 5071 + INTEGER(IntKi), PARAMETER :: M69N5FMze = 5072 + INTEGER(IntKi), PARAMETER :: M69N6FMze = 5073 + INTEGER(IntKi), PARAMETER :: M69N7FMze = 5074 + INTEGER(IntKi), PARAMETER :: M69N8FMze = 5075 + INTEGER(IntKi), PARAMETER :: M69N9FMze = 5076 + INTEGER(IntKi), PARAMETER :: M70N1FMze = 5077 + INTEGER(IntKi), PARAMETER :: M70N2FMze = 5078 + INTEGER(IntKi), PARAMETER :: M70N3FMze = 5079 + INTEGER(IntKi), PARAMETER :: M70N4FMze = 5080 + INTEGER(IntKi), PARAMETER :: M70N5FMze = 5081 + INTEGER(IntKi), PARAMETER :: M70N6FMze = 5082 + INTEGER(IntKi), PARAMETER :: M70N7FMze = 5083 + INTEGER(IntKi), PARAMETER :: M70N8FMze = 5084 + INTEGER(IntKi), PARAMETER :: M70N9FMze = 5085 + INTEGER(IntKi), PARAMETER :: M71N1FMze = 5086 + INTEGER(IntKi), PARAMETER :: M71N2FMze = 5087 + INTEGER(IntKi), PARAMETER :: M71N3FMze = 5088 + INTEGER(IntKi), PARAMETER :: M71N4FMze = 5089 + INTEGER(IntKi), PARAMETER :: M71N5FMze = 5090 + INTEGER(IntKi), PARAMETER :: M71N6FMze = 5091 + INTEGER(IntKi), PARAMETER :: M71N7FMze = 5092 + INTEGER(IntKi), PARAMETER :: M71N8FMze = 5093 + INTEGER(IntKi), PARAMETER :: M71N9FMze = 5094 + INTEGER(IntKi), PARAMETER :: M72N1FMze = 5095 + INTEGER(IntKi), PARAMETER :: M72N2FMze = 5096 + INTEGER(IntKi), PARAMETER :: M72N3FMze = 5097 + INTEGER(IntKi), PARAMETER :: M72N4FMze = 5098 + INTEGER(IntKi), PARAMETER :: M72N5FMze = 5099 + INTEGER(IntKi), PARAMETER :: M72N6FMze = 5100 + INTEGER(IntKi), PARAMETER :: M72N7FMze = 5101 + INTEGER(IntKi), PARAMETER :: M72N8FMze = 5102 + INTEGER(IntKi), PARAMETER :: M72N9FMze = 5103 + INTEGER(IntKi), PARAMETER :: M73N1FMze = 5104 + INTEGER(IntKi), PARAMETER :: M73N2FMze = 5105 + INTEGER(IntKi), PARAMETER :: M73N3FMze = 5106 + INTEGER(IntKi), PARAMETER :: M73N4FMze = 5107 + INTEGER(IntKi), PARAMETER :: M73N5FMze = 5108 + INTEGER(IntKi), PARAMETER :: M73N6FMze = 5109 + INTEGER(IntKi), PARAMETER :: M73N7FMze = 5110 + INTEGER(IntKi), PARAMETER :: M73N8FMze = 5111 + INTEGER(IntKi), PARAMETER :: M73N9FMze = 5112 + INTEGER(IntKi), PARAMETER :: M74N1FMze = 5113 + INTEGER(IntKi), PARAMETER :: M74N2FMze = 5114 + INTEGER(IntKi), PARAMETER :: M74N3FMze = 5115 + INTEGER(IntKi), PARAMETER :: M74N4FMze = 5116 + INTEGER(IntKi), PARAMETER :: M74N5FMze = 5117 + INTEGER(IntKi), PARAMETER :: M74N6FMze = 5118 + INTEGER(IntKi), PARAMETER :: M74N7FMze = 5119 + INTEGER(IntKi), PARAMETER :: M74N8FMze = 5120 + INTEGER(IntKi), PARAMETER :: M74N9FMze = 5121 + INTEGER(IntKi), PARAMETER :: M75N1FMze = 5122 + INTEGER(IntKi), PARAMETER :: M75N2FMze = 5123 + INTEGER(IntKi), PARAMETER :: M75N3FMze = 5124 + INTEGER(IntKi), PARAMETER :: M75N4FMze = 5125 + INTEGER(IntKi), PARAMETER :: M75N5FMze = 5126 + INTEGER(IntKi), PARAMETER :: M75N6FMze = 5127 + INTEGER(IntKi), PARAMETER :: M75N7FMze = 5128 + INTEGER(IntKi), PARAMETER :: M75N8FMze = 5129 + INTEGER(IntKi), PARAMETER :: M75N9FMze = 5130 + INTEGER(IntKi), PARAMETER :: M76N1FMze = 5131 + INTEGER(IntKi), PARAMETER :: M76N2FMze = 5132 + INTEGER(IntKi), PARAMETER :: M76N3FMze = 5133 + INTEGER(IntKi), PARAMETER :: M76N4FMze = 5134 + INTEGER(IntKi), PARAMETER :: M76N5FMze = 5135 + INTEGER(IntKi), PARAMETER :: M76N6FMze = 5136 + INTEGER(IntKi), PARAMETER :: M76N7FMze = 5137 + INTEGER(IntKi), PARAMETER :: M76N8FMze = 5138 + INTEGER(IntKi), PARAMETER :: M76N9FMze = 5139 + INTEGER(IntKi), PARAMETER :: M77N1FMze = 5140 + INTEGER(IntKi), PARAMETER :: M77N2FMze = 5141 + INTEGER(IntKi), PARAMETER :: M77N3FMze = 5142 + INTEGER(IntKi), PARAMETER :: M77N4FMze = 5143 + INTEGER(IntKi), PARAMETER :: M77N5FMze = 5144 + INTEGER(IntKi), PARAMETER :: M77N6FMze = 5145 + INTEGER(IntKi), PARAMETER :: M77N7FMze = 5146 + INTEGER(IntKi), PARAMETER :: M77N8FMze = 5147 + INTEGER(IntKi), PARAMETER :: M77N9FMze = 5148 + INTEGER(IntKi), PARAMETER :: M78N1FMze = 5149 + INTEGER(IntKi), PARAMETER :: M78N2FMze = 5150 + INTEGER(IntKi), PARAMETER :: M78N3FMze = 5151 + INTEGER(IntKi), PARAMETER :: M78N4FMze = 5152 + INTEGER(IntKi), PARAMETER :: M78N5FMze = 5153 + INTEGER(IntKi), PARAMETER :: M78N6FMze = 5154 + INTEGER(IntKi), PARAMETER :: M78N7FMze = 5155 + INTEGER(IntKi), PARAMETER :: M78N8FMze = 5156 + INTEGER(IntKi), PARAMETER :: M78N9FMze = 5157 + INTEGER(IntKi), PARAMETER :: M79N1FMze = 5158 + INTEGER(IntKi), PARAMETER :: M79N2FMze = 5159 + INTEGER(IntKi), PARAMETER :: M79N3FMze = 5160 + INTEGER(IntKi), PARAMETER :: M79N4FMze = 5161 + INTEGER(IntKi), PARAMETER :: M79N5FMze = 5162 + INTEGER(IntKi), PARAMETER :: M79N6FMze = 5163 + INTEGER(IntKi), PARAMETER :: M79N7FMze = 5164 + INTEGER(IntKi), PARAMETER :: M79N8FMze = 5165 + INTEGER(IntKi), PARAMETER :: M79N9FMze = 5166 + INTEGER(IntKi), PARAMETER :: M80N1FMze = 5167 + INTEGER(IntKi), PARAMETER :: M80N2FMze = 5168 + INTEGER(IntKi), PARAMETER :: M80N3FMze = 5169 + INTEGER(IntKi), PARAMETER :: M80N4FMze = 5170 + INTEGER(IntKi), PARAMETER :: M80N5FMze = 5171 + INTEGER(IntKi), PARAMETER :: M80N6FMze = 5172 + INTEGER(IntKi), PARAMETER :: M80N7FMze = 5173 + INTEGER(IntKi), PARAMETER :: M80N8FMze = 5174 + INTEGER(IntKi), PARAMETER :: M80N9FMze = 5175 + INTEGER(IntKi), PARAMETER :: M81N1FMze = 5176 + INTEGER(IntKi), PARAMETER :: M81N2FMze = 5177 + INTEGER(IntKi), PARAMETER :: M81N3FMze = 5178 + INTEGER(IntKi), PARAMETER :: M81N4FMze = 5179 + INTEGER(IntKi), PARAMETER :: M81N5FMze = 5180 + INTEGER(IntKi), PARAMETER :: M81N6FMze = 5181 + INTEGER(IntKi), PARAMETER :: M81N7FMze = 5182 + INTEGER(IntKi), PARAMETER :: M81N8FMze = 5183 + INTEGER(IntKi), PARAMETER :: M81N9FMze = 5184 + INTEGER(IntKi), PARAMETER :: M82N1FMze = 5185 + INTEGER(IntKi), PARAMETER :: M82N2FMze = 5186 + INTEGER(IntKi), PARAMETER :: M82N3FMze = 5187 + INTEGER(IntKi), PARAMETER :: M82N4FMze = 5188 + INTEGER(IntKi), PARAMETER :: M82N5FMze = 5189 + INTEGER(IntKi), PARAMETER :: M82N6FMze = 5190 + INTEGER(IntKi), PARAMETER :: M82N7FMze = 5191 + INTEGER(IntKi), PARAMETER :: M82N8FMze = 5192 + INTEGER(IntKi), PARAMETER :: M82N9FMze = 5193 + INTEGER(IntKi), PARAMETER :: M83N1FMze = 5194 + INTEGER(IntKi), PARAMETER :: M83N2FMze = 5195 + INTEGER(IntKi), PARAMETER :: M83N3FMze = 5196 + INTEGER(IntKi), PARAMETER :: M83N4FMze = 5197 + INTEGER(IntKi), PARAMETER :: M83N5FMze = 5198 + INTEGER(IntKi), PARAMETER :: M83N6FMze = 5199 + INTEGER(IntKi), PARAMETER :: M83N7FMze = 5200 + INTEGER(IntKi), PARAMETER :: M83N8FMze = 5201 + INTEGER(IntKi), PARAMETER :: M83N9FMze = 5202 + INTEGER(IntKi), PARAMETER :: M84N1FMze = 5203 + INTEGER(IntKi), PARAMETER :: M84N2FMze = 5204 + INTEGER(IntKi), PARAMETER :: M84N3FMze = 5205 + INTEGER(IntKi), PARAMETER :: M84N4FMze = 5206 + INTEGER(IntKi), PARAMETER :: M84N5FMze = 5207 + INTEGER(IntKi), PARAMETER :: M84N6FMze = 5208 + INTEGER(IntKi), PARAMETER :: M84N7FMze = 5209 + INTEGER(IntKi), PARAMETER :: M84N8FMze = 5210 + INTEGER(IntKi), PARAMETER :: M84N9FMze = 5211 + INTEGER(IntKi), PARAMETER :: M85N1FMze = 5212 + INTEGER(IntKi), PARAMETER :: M85N2FMze = 5213 + INTEGER(IntKi), PARAMETER :: M85N3FMze = 5214 + INTEGER(IntKi), PARAMETER :: M85N4FMze = 5215 + INTEGER(IntKi), PARAMETER :: M85N5FMze = 5216 + INTEGER(IntKi), PARAMETER :: M85N6FMze = 5217 + INTEGER(IntKi), PARAMETER :: M85N7FMze = 5218 + INTEGER(IntKi), PARAMETER :: M85N8FMze = 5219 + INTEGER(IntKi), PARAMETER :: M85N9FMze = 5220 + INTEGER(IntKi), PARAMETER :: M86N1FMze = 5221 + INTEGER(IntKi), PARAMETER :: M86N2FMze = 5222 + INTEGER(IntKi), PARAMETER :: M86N3FMze = 5223 + INTEGER(IntKi), PARAMETER :: M86N4FMze = 5224 + INTEGER(IntKi), PARAMETER :: M86N5FMze = 5225 + INTEGER(IntKi), PARAMETER :: M86N6FMze = 5226 + INTEGER(IntKi), PARAMETER :: M86N7FMze = 5227 + INTEGER(IntKi), PARAMETER :: M86N8FMze = 5228 + INTEGER(IntKi), PARAMETER :: M86N9FMze = 5229 + INTEGER(IntKi), PARAMETER :: M87N1FMze = 5230 + INTEGER(IntKi), PARAMETER :: M87N2FMze = 5231 + INTEGER(IntKi), PARAMETER :: M87N3FMze = 5232 + INTEGER(IntKi), PARAMETER :: M87N4FMze = 5233 + INTEGER(IntKi), PARAMETER :: M87N5FMze = 5234 + INTEGER(IntKi), PARAMETER :: M87N6FMze = 5235 + INTEGER(IntKi), PARAMETER :: M87N7FMze = 5236 + INTEGER(IntKi), PARAMETER :: M87N8FMze = 5237 + INTEGER(IntKi), PARAMETER :: M87N9FMze = 5238 + INTEGER(IntKi), PARAMETER :: M88N1FMze = 5239 + INTEGER(IntKi), PARAMETER :: M88N2FMze = 5240 + INTEGER(IntKi), PARAMETER :: M88N3FMze = 5241 + INTEGER(IntKi), PARAMETER :: M88N4FMze = 5242 + INTEGER(IntKi), PARAMETER :: M88N5FMze = 5243 + INTEGER(IntKi), PARAMETER :: M88N6FMze = 5244 + INTEGER(IntKi), PARAMETER :: M88N7FMze = 5245 + INTEGER(IntKi), PARAMETER :: M88N8FMze = 5246 + INTEGER(IntKi), PARAMETER :: M88N9FMze = 5247 + INTEGER(IntKi), PARAMETER :: M89N1FMze = 5248 + INTEGER(IntKi), PARAMETER :: M89N2FMze = 5249 + INTEGER(IntKi), PARAMETER :: M89N3FMze = 5250 + INTEGER(IntKi), PARAMETER :: M89N4FMze = 5251 + INTEGER(IntKi), PARAMETER :: M89N5FMze = 5252 + INTEGER(IntKi), PARAMETER :: M89N6FMze = 5253 + INTEGER(IntKi), PARAMETER :: M89N7FMze = 5254 + INTEGER(IntKi), PARAMETER :: M89N8FMze = 5255 + INTEGER(IntKi), PARAMETER :: M89N9FMze = 5256 + INTEGER(IntKi), PARAMETER :: M90N1FMze = 5257 + INTEGER(IntKi), PARAMETER :: M90N2FMze = 5258 + INTEGER(IntKi), PARAMETER :: M90N3FMze = 5259 + INTEGER(IntKi), PARAMETER :: M90N4FMze = 5260 + INTEGER(IntKi), PARAMETER :: M90N5FMze = 5261 + INTEGER(IntKi), PARAMETER :: M90N6FMze = 5262 + INTEGER(IntKi), PARAMETER :: M90N7FMze = 5263 + INTEGER(IntKi), PARAMETER :: M90N8FMze = 5264 + INTEGER(IntKi), PARAMETER :: M90N9FMze = 5265 + INTEGER(IntKi), PARAMETER :: M91N1FMze = 5266 + INTEGER(IntKi), PARAMETER :: M91N2FMze = 5267 + INTEGER(IntKi), PARAMETER :: M91N3FMze = 5268 + INTEGER(IntKi), PARAMETER :: M91N4FMze = 5269 + INTEGER(IntKi), PARAMETER :: M91N5FMze = 5270 + INTEGER(IntKi), PARAMETER :: M91N6FMze = 5271 + INTEGER(IntKi), PARAMETER :: M91N7FMze = 5272 + INTEGER(IntKi), PARAMETER :: M91N8FMze = 5273 + INTEGER(IntKi), PARAMETER :: M91N9FMze = 5274 + INTEGER(IntKi), PARAMETER :: M92N1FMze = 5275 + INTEGER(IntKi), PARAMETER :: M92N2FMze = 5276 + INTEGER(IntKi), PARAMETER :: M92N3FMze = 5277 + INTEGER(IntKi), PARAMETER :: M92N4FMze = 5278 + INTEGER(IntKi), PARAMETER :: M92N5FMze = 5279 + INTEGER(IntKi), PARAMETER :: M92N6FMze = 5280 + INTEGER(IntKi), PARAMETER :: M92N7FMze = 5281 + INTEGER(IntKi), PARAMETER :: M92N8FMze = 5282 + INTEGER(IntKi), PARAMETER :: M92N9FMze = 5283 + INTEGER(IntKi), PARAMETER :: M93N1FMze = 5284 + INTEGER(IntKi), PARAMETER :: M93N2FMze = 5285 + INTEGER(IntKi), PARAMETER :: M93N3FMze = 5286 + INTEGER(IntKi), PARAMETER :: M93N4FMze = 5287 + INTEGER(IntKi), PARAMETER :: M93N5FMze = 5288 + INTEGER(IntKi), PARAMETER :: M93N6FMze = 5289 + INTEGER(IntKi), PARAMETER :: M93N7FMze = 5290 + INTEGER(IntKi), PARAMETER :: M93N8FMze = 5291 + INTEGER(IntKi), PARAMETER :: M93N9FMze = 5292 + INTEGER(IntKi), PARAMETER :: M94N1FMze = 5293 + INTEGER(IntKi), PARAMETER :: M94N2FMze = 5294 + INTEGER(IntKi), PARAMETER :: M94N3FMze = 5295 + INTEGER(IntKi), PARAMETER :: M94N4FMze = 5296 + INTEGER(IntKi), PARAMETER :: M94N5FMze = 5297 + INTEGER(IntKi), PARAMETER :: M94N6FMze = 5298 + INTEGER(IntKi), PARAMETER :: M94N7FMze = 5299 + INTEGER(IntKi), PARAMETER :: M94N8FMze = 5300 + INTEGER(IntKi), PARAMETER :: M94N9FMze = 5301 + INTEGER(IntKi), PARAMETER :: M95N1FMze = 5302 + INTEGER(IntKi), PARAMETER :: M95N2FMze = 5303 + INTEGER(IntKi), PARAMETER :: M95N3FMze = 5304 + INTEGER(IntKi), PARAMETER :: M95N4FMze = 5305 + INTEGER(IntKi), PARAMETER :: M95N5FMze = 5306 + INTEGER(IntKi), PARAMETER :: M95N6FMze = 5307 + INTEGER(IntKi), PARAMETER :: M95N7FMze = 5308 + INTEGER(IntKi), PARAMETER :: M95N8FMze = 5309 + INTEGER(IntKi), PARAMETER :: M95N9FMze = 5310 + INTEGER(IntKi), PARAMETER :: M96N1FMze = 5311 + INTEGER(IntKi), PARAMETER :: M96N2FMze = 5312 + INTEGER(IntKi), PARAMETER :: M96N3FMze = 5313 + INTEGER(IntKi), PARAMETER :: M96N4FMze = 5314 + INTEGER(IntKi), PARAMETER :: M96N5FMze = 5315 + INTEGER(IntKi), PARAMETER :: M96N6FMze = 5316 + INTEGER(IntKi), PARAMETER :: M96N7FMze = 5317 + INTEGER(IntKi), PARAMETER :: M96N8FMze = 5318 + INTEGER(IntKi), PARAMETER :: M96N9FMze = 5319 + INTEGER(IntKi), PARAMETER :: M97N1FMze = 5320 + INTEGER(IntKi), PARAMETER :: M97N2FMze = 5321 + INTEGER(IntKi), PARAMETER :: M97N3FMze = 5322 + INTEGER(IntKi), PARAMETER :: M97N4FMze = 5323 + INTEGER(IntKi), PARAMETER :: M97N5FMze = 5324 + INTEGER(IntKi), PARAMETER :: M97N6FMze = 5325 + INTEGER(IntKi), PARAMETER :: M97N7FMze = 5326 + INTEGER(IntKi), PARAMETER :: M97N8FMze = 5327 + INTEGER(IntKi), PARAMETER :: M97N9FMze = 5328 + INTEGER(IntKi), PARAMETER :: M98N1FMze = 5329 + INTEGER(IntKi), PARAMETER :: M98N2FMze = 5330 + INTEGER(IntKi), PARAMETER :: M98N3FMze = 5331 + INTEGER(IntKi), PARAMETER :: M98N4FMze = 5332 + INTEGER(IntKi), PARAMETER :: M98N5FMze = 5333 + INTEGER(IntKi), PARAMETER :: M98N6FMze = 5334 + INTEGER(IntKi), PARAMETER :: M98N7FMze = 5335 + INTEGER(IntKi), PARAMETER :: M98N8FMze = 5336 + INTEGER(IntKi), PARAMETER :: M98N9FMze = 5337 + INTEGER(IntKi), PARAMETER :: M99N1FMze = 5338 + INTEGER(IntKi), PARAMETER :: M99N2FMze = 5339 + INTEGER(IntKi), PARAMETER :: M99N3FMze = 5340 + INTEGER(IntKi), PARAMETER :: M99N4FMze = 5341 + INTEGER(IntKi), PARAMETER :: M99N5FMze = 5342 + INTEGER(IntKi), PARAMETER :: M99N6FMze = 5343 + INTEGER(IntKi), PARAMETER :: M99N7FMze = 5344 + INTEGER(IntKi), PARAMETER :: M99N8FMze = 5345 + INTEGER(IntKi), PARAMETER :: M99N9FMze = 5346 + INTEGER(IntKi), PARAMETER :: M01N1MKxe = 5347 + INTEGER(IntKi), PARAMETER :: M01N2MKxe = 5348 + INTEGER(IntKi), PARAMETER :: M01N3MKxe = 5349 + INTEGER(IntKi), PARAMETER :: M01N4MKxe = 5350 + INTEGER(IntKi), PARAMETER :: M01N5MKxe = 5351 + INTEGER(IntKi), PARAMETER :: M01N6MKxe = 5352 + INTEGER(IntKi), PARAMETER :: M01N7MKxe = 5353 + INTEGER(IntKi), PARAMETER :: M01N8MKxe = 5354 + INTEGER(IntKi), PARAMETER :: M01N9MKxe = 5355 + INTEGER(IntKi), PARAMETER :: M02N1MKxe = 5356 + INTEGER(IntKi), PARAMETER :: M02N2MKxe = 5357 + INTEGER(IntKi), PARAMETER :: M02N3MKxe = 5358 + INTEGER(IntKi), PARAMETER :: M02N4MKxe = 5359 + INTEGER(IntKi), PARAMETER :: M02N5MKxe = 5360 + INTEGER(IntKi), PARAMETER :: M02N6MKxe = 5361 + INTEGER(IntKi), PARAMETER :: M02N7MKxe = 5362 + INTEGER(IntKi), PARAMETER :: M02N8MKxe = 5363 + INTEGER(IntKi), PARAMETER :: M02N9MKxe = 5364 + INTEGER(IntKi), PARAMETER :: M03N1MKxe = 5365 + INTEGER(IntKi), PARAMETER :: M03N2MKxe = 5366 + INTEGER(IntKi), PARAMETER :: M03N3MKxe = 5367 + INTEGER(IntKi), PARAMETER :: M03N4MKxe = 5368 + INTEGER(IntKi), PARAMETER :: M03N5MKxe = 5369 + INTEGER(IntKi), PARAMETER :: M03N6MKxe = 5370 + INTEGER(IntKi), PARAMETER :: M03N7MKxe = 5371 + INTEGER(IntKi), PARAMETER :: M03N8MKxe = 5372 + INTEGER(IntKi), PARAMETER :: M03N9MKxe = 5373 + INTEGER(IntKi), PARAMETER :: M04N1MKxe = 5374 + INTEGER(IntKi), PARAMETER :: M04N2MKxe = 5375 + INTEGER(IntKi), PARAMETER :: M04N3MKxe = 5376 + INTEGER(IntKi), PARAMETER :: M04N4MKxe = 5377 + INTEGER(IntKi), PARAMETER :: M04N5MKxe = 5378 + INTEGER(IntKi), PARAMETER :: M04N6MKxe = 5379 + INTEGER(IntKi), PARAMETER :: M04N7MKxe = 5380 + INTEGER(IntKi), PARAMETER :: M04N8MKxe = 5381 + INTEGER(IntKi), PARAMETER :: M04N9MKxe = 5382 + INTEGER(IntKi), PARAMETER :: M05N1MKxe = 5383 + INTEGER(IntKi), PARAMETER :: M05N2MKxe = 5384 + INTEGER(IntKi), PARAMETER :: M05N3MKxe = 5385 + INTEGER(IntKi), PARAMETER :: M05N4MKxe = 5386 + INTEGER(IntKi), PARAMETER :: M05N5MKxe = 5387 + INTEGER(IntKi), PARAMETER :: M05N6MKxe = 5388 + INTEGER(IntKi), PARAMETER :: M05N7MKxe = 5389 + INTEGER(IntKi), PARAMETER :: M05N8MKxe = 5390 + INTEGER(IntKi), PARAMETER :: M05N9MKxe = 5391 + INTEGER(IntKi), PARAMETER :: M06N1MKxe = 5392 + INTEGER(IntKi), PARAMETER :: M06N2MKxe = 5393 + INTEGER(IntKi), PARAMETER :: M06N3MKxe = 5394 + INTEGER(IntKi), PARAMETER :: M06N4MKxe = 5395 + INTEGER(IntKi), PARAMETER :: M06N5MKxe = 5396 + INTEGER(IntKi), PARAMETER :: M06N6MKxe = 5397 + INTEGER(IntKi), PARAMETER :: M06N7MKxe = 5398 + INTEGER(IntKi), PARAMETER :: M06N8MKxe = 5399 + INTEGER(IntKi), PARAMETER :: M06N9MKxe = 5400 + INTEGER(IntKi), PARAMETER :: M07N1MKxe = 5401 + INTEGER(IntKi), PARAMETER :: M07N2MKxe = 5402 + INTEGER(IntKi), PARAMETER :: M07N3MKxe = 5403 + INTEGER(IntKi), PARAMETER :: M07N4MKxe = 5404 + INTEGER(IntKi), PARAMETER :: M07N5MKxe = 5405 + INTEGER(IntKi), PARAMETER :: M07N6MKxe = 5406 + INTEGER(IntKi), PARAMETER :: M07N7MKxe = 5407 + INTEGER(IntKi), PARAMETER :: M07N8MKxe = 5408 + INTEGER(IntKi), PARAMETER :: M07N9MKxe = 5409 + INTEGER(IntKi), PARAMETER :: M08N1MKxe = 5410 + INTEGER(IntKi), PARAMETER :: M08N2MKxe = 5411 + INTEGER(IntKi), PARAMETER :: M08N3MKxe = 5412 + INTEGER(IntKi), PARAMETER :: M08N4MKxe = 5413 + INTEGER(IntKi), PARAMETER :: M08N5MKxe = 5414 + INTEGER(IntKi), PARAMETER :: M08N6MKxe = 5415 + INTEGER(IntKi), PARAMETER :: M08N7MKxe = 5416 + INTEGER(IntKi), PARAMETER :: M08N8MKxe = 5417 + INTEGER(IntKi), PARAMETER :: M08N9MKxe = 5418 + INTEGER(IntKi), PARAMETER :: M09N1MKxe = 5419 + INTEGER(IntKi), PARAMETER :: M09N2MKxe = 5420 + INTEGER(IntKi), PARAMETER :: M09N3MKxe = 5421 + INTEGER(IntKi), PARAMETER :: M09N4MKxe = 5422 + INTEGER(IntKi), PARAMETER :: M09N5MKxe = 5423 + INTEGER(IntKi), PARAMETER :: M09N6MKxe = 5424 + INTEGER(IntKi), PARAMETER :: M09N7MKxe = 5425 + INTEGER(IntKi), PARAMETER :: M09N8MKxe = 5426 + INTEGER(IntKi), PARAMETER :: M09N9MKxe = 5427 + INTEGER(IntKi), PARAMETER :: M10N1MKxe = 5428 + INTEGER(IntKi), PARAMETER :: M10N2MKxe = 5429 + INTEGER(IntKi), PARAMETER :: M10N3MKxe = 5430 + INTEGER(IntKi), PARAMETER :: M10N4MKxe = 5431 + INTEGER(IntKi), PARAMETER :: M10N5MKxe = 5432 + INTEGER(IntKi), PARAMETER :: M10N6MKxe = 5433 + INTEGER(IntKi), PARAMETER :: M10N7MKxe = 5434 + INTEGER(IntKi), PARAMETER :: M10N8MKxe = 5435 + INTEGER(IntKi), PARAMETER :: M10N9MKxe = 5436 + INTEGER(IntKi), PARAMETER :: M11N1MKxe = 5437 + INTEGER(IntKi), PARAMETER :: M11N2MKxe = 5438 + INTEGER(IntKi), PARAMETER :: M11N3MKxe = 5439 + INTEGER(IntKi), PARAMETER :: M11N4MKxe = 5440 + INTEGER(IntKi), PARAMETER :: M11N5MKxe = 5441 + INTEGER(IntKi), PARAMETER :: M11N6MKxe = 5442 + INTEGER(IntKi), PARAMETER :: M11N7MKxe = 5443 + INTEGER(IntKi), PARAMETER :: M11N8MKxe = 5444 + INTEGER(IntKi), PARAMETER :: M11N9MKxe = 5445 + INTEGER(IntKi), PARAMETER :: M12N1MKxe = 5446 + INTEGER(IntKi), PARAMETER :: M12N2MKxe = 5447 + INTEGER(IntKi), PARAMETER :: M12N3MKxe = 5448 + INTEGER(IntKi), PARAMETER :: M12N4MKxe = 5449 + INTEGER(IntKi), PARAMETER :: M12N5MKxe = 5450 + INTEGER(IntKi), PARAMETER :: M12N6MKxe = 5451 + INTEGER(IntKi), PARAMETER :: M12N7MKxe = 5452 + INTEGER(IntKi), PARAMETER :: M12N8MKxe = 5453 + INTEGER(IntKi), PARAMETER :: M12N9MKxe = 5454 + INTEGER(IntKi), PARAMETER :: M13N1MKxe = 5455 + INTEGER(IntKi), PARAMETER :: M13N2MKxe = 5456 + INTEGER(IntKi), PARAMETER :: M13N3MKxe = 5457 + INTEGER(IntKi), PARAMETER :: M13N4MKxe = 5458 + INTEGER(IntKi), PARAMETER :: M13N5MKxe = 5459 + INTEGER(IntKi), PARAMETER :: M13N6MKxe = 5460 + INTEGER(IntKi), PARAMETER :: M13N7MKxe = 5461 + INTEGER(IntKi), PARAMETER :: M13N8MKxe = 5462 + INTEGER(IntKi), PARAMETER :: M13N9MKxe = 5463 + INTEGER(IntKi), PARAMETER :: M14N1MKxe = 5464 + INTEGER(IntKi), PARAMETER :: M14N2MKxe = 5465 + INTEGER(IntKi), PARAMETER :: M14N3MKxe = 5466 + INTEGER(IntKi), PARAMETER :: M14N4MKxe = 5467 + INTEGER(IntKi), PARAMETER :: M14N5MKxe = 5468 + INTEGER(IntKi), PARAMETER :: M14N6MKxe = 5469 + INTEGER(IntKi), PARAMETER :: M14N7MKxe = 5470 + INTEGER(IntKi), PARAMETER :: M14N8MKxe = 5471 + INTEGER(IntKi), PARAMETER :: M14N9MKxe = 5472 + INTEGER(IntKi), PARAMETER :: M15N1MKxe = 5473 + INTEGER(IntKi), PARAMETER :: M15N2MKxe = 5474 + INTEGER(IntKi), PARAMETER :: M15N3MKxe = 5475 + INTEGER(IntKi), PARAMETER :: M15N4MKxe = 5476 + INTEGER(IntKi), PARAMETER :: M15N5MKxe = 5477 + INTEGER(IntKi), PARAMETER :: M15N6MKxe = 5478 + INTEGER(IntKi), PARAMETER :: M15N7MKxe = 5479 + INTEGER(IntKi), PARAMETER :: M15N8MKxe = 5480 + INTEGER(IntKi), PARAMETER :: M15N9MKxe = 5481 + INTEGER(IntKi), PARAMETER :: M16N1MKxe = 5482 + INTEGER(IntKi), PARAMETER :: M16N2MKxe = 5483 + INTEGER(IntKi), PARAMETER :: M16N3MKxe = 5484 + INTEGER(IntKi), PARAMETER :: M16N4MKxe = 5485 + INTEGER(IntKi), PARAMETER :: M16N5MKxe = 5486 + INTEGER(IntKi), PARAMETER :: M16N6MKxe = 5487 + INTEGER(IntKi), PARAMETER :: M16N7MKxe = 5488 + INTEGER(IntKi), PARAMETER :: M16N8MKxe = 5489 + INTEGER(IntKi), PARAMETER :: M16N9MKxe = 5490 + INTEGER(IntKi), PARAMETER :: M17N1MKxe = 5491 + INTEGER(IntKi), PARAMETER :: M17N2MKxe = 5492 + INTEGER(IntKi), PARAMETER :: M17N3MKxe = 5493 + INTEGER(IntKi), PARAMETER :: M17N4MKxe = 5494 + INTEGER(IntKi), PARAMETER :: M17N5MKxe = 5495 + INTEGER(IntKi), PARAMETER :: M17N6MKxe = 5496 + INTEGER(IntKi), PARAMETER :: M17N7MKxe = 5497 + INTEGER(IntKi), PARAMETER :: M17N8MKxe = 5498 + INTEGER(IntKi), PARAMETER :: M17N9MKxe = 5499 + INTEGER(IntKi), PARAMETER :: M18N1MKxe = 5500 + INTEGER(IntKi), PARAMETER :: M18N2MKxe = 5501 + INTEGER(IntKi), PARAMETER :: M18N3MKxe = 5502 + INTEGER(IntKi), PARAMETER :: M18N4MKxe = 5503 + INTEGER(IntKi), PARAMETER :: M18N5MKxe = 5504 + INTEGER(IntKi), PARAMETER :: M18N6MKxe = 5505 + INTEGER(IntKi), PARAMETER :: M18N7MKxe = 5506 + INTEGER(IntKi), PARAMETER :: M18N8MKxe = 5507 + INTEGER(IntKi), PARAMETER :: M18N9MKxe = 5508 + INTEGER(IntKi), PARAMETER :: M19N1MKxe = 5509 + INTEGER(IntKi), PARAMETER :: M19N2MKxe = 5510 + INTEGER(IntKi), PARAMETER :: M19N3MKxe = 5511 + INTEGER(IntKi), PARAMETER :: M19N4MKxe = 5512 + INTEGER(IntKi), PARAMETER :: M19N5MKxe = 5513 + INTEGER(IntKi), PARAMETER :: M19N6MKxe = 5514 + INTEGER(IntKi), PARAMETER :: M19N7MKxe = 5515 + INTEGER(IntKi), PARAMETER :: M19N8MKxe = 5516 + INTEGER(IntKi), PARAMETER :: M19N9MKxe = 5517 + INTEGER(IntKi), PARAMETER :: M20N1MKxe = 5518 + INTEGER(IntKi), PARAMETER :: M20N2MKxe = 5519 + INTEGER(IntKi), PARAMETER :: M20N3MKxe = 5520 + INTEGER(IntKi), PARAMETER :: M20N4MKxe = 5521 + INTEGER(IntKi), PARAMETER :: M20N5MKxe = 5522 + INTEGER(IntKi), PARAMETER :: M20N6MKxe = 5523 + INTEGER(IntKi), PARAMETER :: M20N7MKxe = 5524 + INTEGER(IntKi), PARAMETER :: M20N8MKxe = 5525 + INTEGER(IntKi), PARAMETER :: M20N9MKxe = 5526 + INTEGER(IntKi), PARAMETER :: M21N1MKxe = 5527 + INTEGER(IntKi), PARAMETER :: M21N2MKxe = 5528 + INTEGER(IntKi), PARAMETER :: M21N3MKxe = 5529 + INTEGER(IntKi), PARAMETER :: M21N4MKxe = 5530 + INTEGER(IntKi), PARAMETER :: M21N5MKxe = 5531 + INTEGER(IntKi), PARAMETER :: M21N6MKxe = 5532 + INTEGER(IntKi), PARAMETER :: M21N7MKxe = 5533 + INTEGER(IntKi), PARAMETER :: M21N8MKxe = 5534 + INTEGER(IntKi), PARAMETER :: M21N9MKxe = 5535 + INTEGER(IntKi), PARAMETER :: M22N1MKxe = 5536 + INTEGER(IntKi), PARAMETER :: M22N2MKxe = 5537 + INTEGER(IntKi), PARAMETER :: M22N3MKxe = 5538 + INTEGER(IntKi), PARAMETER :: M22N4MKxe = 5539 + INTEGER(IntKi), PARAMETER :: M22N5MKxe = 5540 + INTEGER(IntKi), PARAMETER :: M22N6MKxe = 5541 + INTEGER(IntKi), PARAMETER :: M22N7MKxe = 5542 + INTEGER(IntKi), PARAMETER :: M22N8MKxe = 5543 + INTEGER(IntKi), PARAMETER :: M22N9MKxe = 5544 + INTEGER(IntKi), PARAMETER :: M23N1MKxe = 5545 + INTEGER(IntKi), PARAMETER :: M23N2MKxe = 5546 + INTEGER(IntKi), PARAMETER :: M23N3MKxe = 5547 + INTEGER(IntKi), PARAMETER :: M23N4MKxe = 5548 + INTEGER(IntKi), PARAMETER :: M23N5MKxe = 5549 + INTEGER(IntKi), PARAMETER :: M23N6MKxe = 5550 + INTEGER(IntKi), PARAMETER :: M23N7MKxe = 5551 + INTEGER(IntKi), PARAMETER :: M23N8MKxe = 5552 + INTEGER(IntKi), PARAMETER :: M23N9MKxe = 5553 + INTEGER(IntKi), PARAMETER :: M24N1MKxe = 5554 + INTEGER(IntKi), PARAMETER :: M24N2MKxe = 5555 + INTEGER(IntKi), PARAMETER :: M24N3MKxe = 5556 + INTEGER(IntKi), PARAMETER :: M24N4MKxe = 5557 + INTEGER(IntKi), PARAMETER :: M24N5MKxe = 5558 + INTEGER(IntKi), PARAMETER :: M24N6MKxe = 5559 + INTEGER(IntKi), PARAMETER :: M24N7MKxe = 5560 + INTEGER(IntKi), PARAMETER :: M24N8MKxe = 5561 + INTEGER(IntKi), PARAMETER :: M24N9MKxe = 5562 + INTEGER(IntKi), PARAMETER :: M25N1MKxe = 5563 + INTEGER(IntKi), PARAMETER :: M25N2MKxe = 5564 + INTEGER(IntKi), PARAMETER :: M25N3MKxe = 5565 + INTEGER(IntKi), PARAMETER :: M25N4MKxe = 5566 + INTEGER(IntKi), PARAMETER :: M25N5MKxe = 5567 + INTEGER(IntKi), PARAMETER :: M25N6MKxe = 5568 + INTEGER(IntKi), PARAMETER :: M25N7MKxe = 5569 + INTEGER(IntKi), PARAMETER :: M25N8MKxe = 5570 + INTEGER(IntKi), PARAMETER :: M25N9MKxe = 5571 + INTEGER(IntKi), PARAMETER :: M26N1MKxe = 5572 + INTEGER(IntKi), PARAMETER :: M26N2MKxe = 5573 + INTEGER(IntKi), PARAMETER :: M26N3MKxe = 5574 + INTEGER(IntKi), PARAMETER :: M26N4MKxe = 5575 + INTEGER(IntKi), PARAMETER :: M26N5MKxe = 5576 + INTEGER(IntKi), PARAMETER :: M26N6MKxe = 5577 + INTEGER(IntKi), PARAMETER :: M26N7MKxe = 5578 + INTEGER(IntKi), PARAMETER :: M26N8MKxe = 5579 + INTEGER(IntKi), PARAMETER :: M26N9MKxe = 5580 + INTEGER(IntKi), PARAMETER :: M27N1MKxe = 5581 + INTEGER(IntKi), PARAMETER :: M27N2MKxe = 5582 + INTEGER(IntKi), PARAMETER :: M27N3MKxe = 5583 + INTEGER(IntKi), PARAMETER :: M27N4MKxe = 5584 + INTEGER(IntKi), PARAMETER :: M27N5MKxe = 5585 + INTEGER(IntKi), PARAMETER :: M27N6MKxe = 5586 + INTEGER(IntKi), PARAMETER :: M27N7MKxe = 5587 + INTEGER(IntKi), PARAMETER :: M27N8MKxe = 5588 + INTEGER(IntKi), PARAMETER :: M27N9MKxe = 5589 + INTEGER(IntKi), PARAMETER :: M28N1MKxe = 5590 + INTEGER(IntKi), PARAMETER :: M28N2MKxe = 5591 + INTEGER(IntKi), PARAMETER :: M28N3MKxe = 5592 + INTEGER(IntKi), PARAMETER :: M28N4MKxe = 5593 + INTEGER(IntKi), PARAMETER :: M28N5MKxe = 5594 + INTEGER(IntKi), PARAMETER :: M28N6MKxe = 5595 + INTEGER(IntKi), PARAMETER :: M28N7MKxe = 5596 + INTEGER(IntKi), PARAMETER :: M28N8MKxe = 5597 + INTEGER(IntKi), PARAMETER :: M28N9MKxe = 5598 + INTEGER(IntKi), PARAMETER :: M29N1MKxe = 5599 + INTEGER(IntKi), PARAMETER :: M29N2MKxe = 5600 + INTEGER(IntKi), PARAMETER :: M29N3MKxe = 5601 + INTEGER(IntKi), PARAMETER :: M29N4MKxe = 5602 + INTEGER(IntKi), PARAMETER :: M29N5MKxe = 5603 + INTEGER(IntKi), PARAMETER :: M29N6MKxe = 5604 + INTEGER(IntKi), PARAMETER :: M29N7MKxe = 5605 + INTEGER(IntKi), PARAMETER :: M29N8MKxe = 5606 + INTEGER(IntKi), PARAMETER :: M29N9MKxe = 5607 + INTEGER(IntKi), PARAMETER :: M30N1MKxe = 5608 + INTEGER(IntKi), PARAMETER :: M30N2MKxe = 5609 + INTEGER(IntKi), PARAMETER :: M30N3MKxe = 5610 + INTEGER(IntKi), PARAMETER :: M30N4MKxe = 5611 + INTEGER(IntKi), PARAMETER :: M30N5MKxe = 5612 + INTEGER(IntKi), PARAMETER :: M30N6MKxe = 5613 + INTEGER(IntKi), PARAMETER :: M30N7MKxe = 5614 + INTEGER(IntKi), PARAMETER :: M30N8MKxe = 5615 + INTEGER(IntKi), PARAMETER :: M30N9MKxe = 5616 + INTEGER(IntKi), PARAMETER :: M31N1MKxe = 5617 + INTEGER(IntKi), PARAMETER :: M31N2MKxe = 5618 + INTEGER(IntKi), PARAMETER :: M31N3MKxe = 5619 + INTEGER(IntKi), PARAMETER :: M31N4MKxe = 5620 + INTEGER(IntKi), PARAMETER :: M31N5MKxe = 5621 + INTEGER(IntKi), PARAMETER :: M31N6MKxe = 5622 + INTEGER(IntKi), PARAMETER :: M31N7MKxe = 5623 + INTEGER(IntKi), PARAMETER :: M31N8MKxe = 5624 + INTEGER(IntKi), PARAMETER :: M31N9MKxe = 5625 + INTEGER(IntKi), PARAMETER :: M32N1MKxe = 5626 + INTEGER(IntKi), PARAMETER :: M32N2MKxe = 5627 + INTEGER(IntKi), PARAMETER :: M32N3MKxe = 5628 + INTEGER(IntKi), PARAMETER :: M32N4MKxe = 5629 + INTEGER(IntKi), PARAMETER :: M32N5MKxe = 5630 + INTEGER(IntKi), PARAMETER :: M32N6MKxe = 5631 + INTEGER(IntKi), PARAMETER :: M32N7MKxe = 5632 + INTEGER(IntKi), PARAMETER :: M32N8MKxe = 5633 + INTEGER(IntKi), PARAMETER :: M32N9MKxe = 5634 + INTEGER(IntKi), PARAMETER :: M33N1MKxe = 5635 + INTEGER(IntKi), PARAMETER :: M33N2MKxe = 5636 + INTEGER(IntKi), PARAMETER :: M33N3MKxe = 5637 + INTEGER(IntKi), PARAMETER :: M33N4MKxe = 5638 + INTEGER(IntKi), PARAMETER :: M33N5MKxe = 5639 + INTEGER(IntKi), PARAMETER :: M33N6MKxe = 5640 + INTEGER(IntKi), PARAMETER :: M33N7MKxe = 5641 + INTEGER(IntKi), PARAMETER :: M33N8MKxe = 5642 + INTEGER(IntKi), PARAMETER :: M33N9MKxe = 5643 + INTEGER(IntKi), PARAMETER :: M34N1MKxe = 5644 + INTEGER(IntKi), PARAMETER :: M34N2MKxe = 5645 + INTEGER(IntKi), PARAMETER :: M34N3MKxe = 5646 + INTEGER(IntKi), PARAMETER :: M34N4MKxe = 5647 + INTEGER(IntKi), PARAMETER :: M34N5MKxe = 5648 + INTEGER(IntKi), PARAMETER :: M34N6MKxe = 5649 + INTEGER(IntKi), PARAMETER :: M34N7MKxe = 5650 + INTEGER(IntKi), PARAMETER :: M34N8MKxe = 5651 + INTEGER(IntKi), PARAMETER :: M34N9MKxe = 5652 + INTEGER(IntKi), PARAMETER :: M35N1MKxe = 5653 + INTEGER(IntKi), PARAMETER :: M35N2MKxe = 5654 + INTEGER(IntKi), PARAMETER :: M35N3MKxe = 5655 + INTEGER(IntKi), PARAMETER :: M35N4MKxe = 5656 + INTEGER(IntKi), PARAMETER :: M35N5MKxe = 5657 + INTEGER(IntKi), PARAMETER :: M35N6MKxe = 5658 + INTEGER(IntKi), PARAMETER :: M35N7MKxe = 5659 + INTEGER(IntKi), PARAMETER :: M35N8MKxe = 5660 + INTEGER(IntKi), PARAMETER :: M35N9MKxe = 5661 + INTEGER(IntKi), PARAMETER :: M36N1MKxe = 5662 + INTEGER(IntKi), PARAMETER :: M36N2MKxe = 5663 + INTEGER(IntKi), PARAMETER :: M36N3MKxe = 5664 + INTEGER(IntKi), PARAMETER :: M36N4MKxe = 5665 + INTEGER(IntKi), PARAMETER :: M36N5MKxe = 5666 + INTEGER(IntKi), PARAMETER :: M36N6MKxe = 5667 + INTEGER(IntKi), PARAMETER :: M36N7MKxe = 5668 + INTEGER(IntKi), PARAMETER :: M36N8MKxe = 5669 + INTEGER(IntKi), PARAMETER :: M36N9MKxe = 5670 + INTEGER(IntKi), PARAMETER :: M37N1MKxe = 5671 + INTEGER(IntKi), PARAMETER :: M37N2MKxe = 5672 + INTEGER(IntKi), PARAMETER :: M37N3MKxe = 5673 + INTEGER(IntKi), PARAMETER :: M37N4MKxe = 5674 + INTEGER(IntKi), PARAMETER :: M37N5MKxe = 5675 + INTEGER(IntKi), PARAMETER :: M37N6MKxe = 5676 + INTEGER(IntKi), PARAMETER :: M37N7MKxe = 5677 + INTEGER(IntKi), PARAMETER :: M37N8MKxe = 5678 + INTEGER(IntKi), PARAMETER :: M37N9MKxe = 5679 + INTEGER(IntKi), PARAMETER :: M38N1MKxe = 5680 + INTEGER(IntKi), PARAMETER :: M38N2MKxe = 5681 + INTEGER(IntKi), PARAMETER :: M38N3MKxe = 5682 + INTEGER(IntKi), PARAMETER :: M38N4MKxe = 5683 + INTEGER(IntKi), PARAMETER :: M38N5MKxe = 5684 + INTEGER(IntKi), PARAMETER :: M38N6MKxe = 5685 + INTEGER(IntKi), PARAMETER :: M38N7MKxe = 5686 + INTEGER(IntKi), PARAMETER :: M38N8MKxe = 5687 + INTEGER(IntKi), PARAMETER :: M38N9MKxe = 5688 + INTEGER(IntKi), PARAMETER :: M39N1MKxe = 5689 + INTEGER(IntKi), PARAMETER :: M39N2MKxe = 5690 + INTEGER(IntKi), PARAMETER :: M39N3MKxe = 5691 + INTEGER(IntKi), PARAMETER :: M39N4MKxe = 5692 + INTEGER(IntKi), PARAMETER :: M39N5MKxe = 5693 + INTEGER(IntKi), PARAMETER :: M39N6MKxe = 5694 + INTEGER(IntKi), PARAMETER :: M39N7MKxe = 5695 + INTEGER(IntKi), PARAMETER :: M39N8MKxe = 5696 + INTEGER(IntKi), PARAMETER :: M39N9MKxe = 5697 + INTEGER(IntKi), PARAMETER :: M40N1MKxe = 5698 + INTEGER(IntKi), PARAMETER :: M40N2MKxe = 5699 + INTEGER(IntKi), PARAMETER :: M40N3MKxe = 5700 + INTEGER(IntKi), PARAMETER :: M40N4MKxe = 5701 + INTEGER(IntKi), PARAMETER :: M40N5MKxe = 5702 + INTEGER(IntKi), PARAMETER :: M40N6MKxe = 5703 + INTEGER(IntKi), PARAMETER :: M40N7MKxe = 5704 + INTEGER(IntKi), PARAMETER :: M40N8MKxe = 5705 + INTEGER(IntKi), PARAMETER :: M40N9MKxe = 5706 + INTEGER(IntKi), PARAMETER :: M41N1MKxe = 5707 + INTEGER(IntKi), PARAMETER :: M41N2MKxe = 5708 + INTEGER(IntKi), PARAMETER :: M41N3MKxe = 5709 + INTEGER(IntKi), PARAMETER :: M41N4MKxe = 5710 + INTEGER(IntKi), PARAMETER :: M41N5MKxe = 5711 + INTEGER(IntKi), PARAMETER :: M41N6MKxe = 5712 + INTEGER(IntKi), PARAMETER :: M41N7MKxe = 5713 + INTEGER(IntKi), PARAMETER :: M41N8MKxe = 5714 + INTEGER(IntKi), PARAMETER :: M41N9MKxe = 5715 + INTEGER(IntKi), PARAMETER :: M42N1MKxe = 5716 + INTEGER(IntKi), PARAMETER :: M42N2MKxe = 5717 + INTEGER(IntKi), PARAMETER :: M42N3MKxe = 5718 + INTEGER(IntKi), PARAMETER :: M42N4MKxe = 5719 + INTEGER(IntKi), PARAMETER :: M42N5MKxe = 5720 + INTEGER(IntKi), PARAMETER :: M42N6MKxe = 5721 + INTEGER(IntKi), PARAMETER :: M42N7MKxe = 5722 + INTEGER(IntKi), PARAMETER :: M42N8MKxe = 5723 + INTEGER(IntKi), PARAMETER :: M42N9MKxe = 5724 + INTEGER(IntKi), PARAMETER :: M43N1MKxe = 5725 + INTEGER(IntKi), PARAMETER :: M43N2MKxe = 5726 + INTEGER(IntKi), PARAMETER :: M43N3MKxe = 5727 + INTEGER(IntKi), PARAMETER :: M43N4MKxe = 5728 + INTEGER(IntKi), PARAMETER :: M43N5MKxe = 5729 + INTEGER(IntKi), PARAMETER :: M43N6MKxe = 5730 + INTEGER(IntKi), PARAMETER :: M43N7MKxe = 5731 + INTEGER(IntKi), PARAMETER :: M43N8MKxe = 5732 + INTEGER(IntKi), PARAMETER :: M43N9MKxe = 5733 + INTEGER(IntKi), PARAMETER :: M44N1MKxe = 5734 + INTEGER(IntKi), PARAMETER :: M44N2MKxe = 5735 + INTEGER(IntKi), PARAMETER :: M44N3MKxe = 5736 + INTEGER(IntKi), PARAMETER :: M44N4MKxe = 5737 + INTEGER(IntKi), PARAMETER :: M44N5MKxe = 5738 + INTEGER(IntKi), PARAMETER :: M44N6MKxe = 5739 + INTEGER(IntKi), PARAMETER :: M44N7MKxe = 5740 + INTEGER(IntKi), PARAMETER :: M44N8MKxe = 5741 + INTEGER(IntKi), PARAMETER :: M44N9MKxe = 5742 + INTEGER(IntKi), PARAMETER :: M45N1MKxe = 5743 + INTEGER(IntKi), PARAMETER :: M45N2MKxe = 5744 + INTEGER(IntKi), PARAMETER :: M45N3MKxe = 5745 + INTEGER(IntKi), PARAMETER :: M45N4MKxe = 5746 + INTEGER(IntKi), PARAMETER :: M45N5MKxe = 5747 + INTEGER(IntKi), PARAMETER :: M45N6MKxe = 5748 + INTEGER(IntKi), PARAMETER :: M45N7MKxe = 5749 + INTEGER(IntKi), PARAMETER :: M45N8MKxe = 5750 + INTEGER(IntKi), PARAMETER :: M45N9MKxe = 5751 + INTEGER(IntKi), PARAMETER :: M46N1MKxe = 5752 + INTEGER(IntKi), PARAMETER :: M46N2MKxe = 5753 + INTEGER(IntKi), PARAMETER :: M46N3MKxe = 5754 + INTEGER(IntKi), PARAMETER :: M46N4MKxe = 5755 + INTEGER(IntKi), PARAMETER :: M46N5MKxe = 5756 + INTEGER(IntKi), PARAMETER :: M46N6MKxe = 5757 + INTEGER(IntKi), PARAMETER :: M46N7MKxe = 5758 + INTEGER(IntKi), PARAMETER :: M46N8MKxe = 5759 + INTEGER(IntKi), PARAMETER :: M46N9MKxe = 5760 + INTEGER(IntKi), PARAMETER :: M47N1MKxe = 5761 + INTEGER(IntKi), PARAMETER :: M47N2MKxe = 5762 + INTEGER(IntKi), PARAMETER :: M47N3MKxe = 5763 + INTEGER(IntKi), PARAMETER :: M47N4MKxe = 5764 + INTEGER(IntKi), PARAMETER :: M47N5MKxe = 5765 + INTEGER(IntKi), PARAMETER :: M47N6MKxe = 5766 + INTEGER(IntKi), PARAMETER :: M47N7MKxe = 5767 + INTEGER(IntKi), PARAMETER :: M47N8MKxe = 5768 + INTEGER(IntKi), PARAMETER :: M47N9MKxe = 5769 + INTEGER(IntKi), PARAMETER :: M48N1MKxe = 5770 + INTEGER(IntKi), PARAMETER :: M48N2MKxe = 5771 + INTEGER(IntKi), PARAMETER :: M48N3MKxe = 5772 + INTEGER(IntKi), PARAMETER :: M48N4MKxe = 5773 + INTEGER(IntKi), PARAMETER :: M48N5MKxe = 5774 + INTEGER(IntKi), PARAMETER :: M48N6MKxe = 5775 + INTEGER(IntKi), PARAMETER :: M48N7MKxe = 5776 + INTEGER(IntKi), PARAMETER :: M48N8MKxe = 5777 + INTEGER(IntKi), PARAMETER :: M48N9MKxe = 5778 + INTEGER(IntKi), PARAMETER :: M49N1MKxe = 5779 + INTEGER(IntKi), PARAMETER :: M49N2MKxe = 5780 + INTEGER(IntKi), PARAMETER :: M49N3MKxe = 5781 + INTEGER(IntKi), PARAMETER :: M49N4MKxe = 5782 + INTEGER(IntKi), PARAMETER :: M49N5MKxe = 5783 + INTEGER(IntKi), PARAMETER :: M49N6MKxe = 5784 + INTEGER(IntKi), PARAMETER :: M49N7MKxe = 5785 + INTEGER(IntKi), PARAMETER :: M49N8MKxe = 5786 + INTEGER(IntKi), PARAMETER :: M49N9MKxe = 5787 + INTEGER(IntKi), PARAMETER :: M50N1MKxe = 5788 + INTEGER(IntKi), PARAMETER :: M50N2MKxe = 5789 + INTEGER(IntKi), PARAMETER :: M50N3MKxe = 5790 + INTEGER(IntKi), PARAMETER :: M50N4MKxe = 5791 + INTEGER(IntKi), PARAMETER :: M50N5MKxe = 5792 + INTEGER(IntKi), PARAMETER :: M50N6MKxe = 5793 + INTEGER(IntKi), PARAMETER :: M50N7MKxe = 5794 + INTEGER(IntKi), PARAMETER :: M50N8MKxe = 5795 + INTEGER(IntKi), PARAMETER :: M50N9MKxe = 5796 + INTEGER(IntKi), PARAMETER :: M51N1MKxe = 5797 + INTEGER(IntKi), PARAMETER :: M51N2MKxe = 5798 + INTEGER(IntKi), PARAMETER :: M51N3MKxe = 5799 + INTEGER(IntKi), PARAMETER :: M51N4MKxe = 5800 + INTEGER(IntKi), PARAMETER :: M51N5MKxe = 5801 + INTEGER(IntKi), PARAMETER :: M51N6MKxe = 5802 + INTEGER(IntKi), PARAMETER :: M51N7MKxe = 5803 + INTEGER(IntKi), PARAMETER :: M51N8MKxe = 5804 + INTEGER(IntKi), PARAMETER :: M51N9MKxe = 5805 + INTEGER(IntKi), PARAMETER :: M52N1MKxe = 5806 + INTEGER(IntKi), PARAMETER :: M52N2MKxe = 5807 + INTEGER(IntKi), PARAMETER :: M52N3MKxe = 5808 + INTEGER(IntKi), PARAMETER :: M52N4MKxe = 5809 + INTEGER(IntKi), PARAMETER :: M52N5MKxe = 5810 + INTEGER(IntKi), PARAMETER :: M52N6MKxe = 5811 + INTEGER(IntKi), PARAMETER :: M52N7MKxe = 5812 + INTEGER(IntKi), PARAMETER :: M52N8MKxe = 5813 + INTEGER(IntKi), PARAMETER :: M52N9MKxe = 5814 + INTEGER(IntKi), PARAMETER :: M53N1MKxe = 5815 + INTEGER(IntKi), PARAMETER :: M53N2MKxe = 5816 + INTEGER(IntKi), PARAMETER :: M53N3MKxe = 5817 + INTEGER(IntKi), PARAMETER :: M53N4MKxe = 5818 + INTEGER(IntKi), PARAMETER :: M53N5MKxe = 5819 + INTEGER(IntKi), PARAMETER :: M53N6MKxe = 5820 + INTEGER(IntKi), PARAMETER :: M53N7MKxe = 5821 + INTEGER(IntKi), PARAMETER :: M53N8MKxe = 5822 + INTEGER(IntKi), PARAMETER :: M53N9MKxe = 5823 + INTEGER(IntKi), PARAMETER :: M54N1MKxe = 5824 + INTEGER(IntKi), PARAMETER :: M54N2MKxe = 5825 + INTEGER(IntKi), PARAMETER :: M54N3MKxe = 5826 + INTEGER(IntKi), PARAMETER :: M54N4MKxe = 5827 + INTEGER(IntKi), PARAMETER :: M54N5MKxe = 5828 + INTEGER(IntKi), PARAMETER :: M54N6MKxe = 5829 + INTEGER(IntKi), PARAMETER :: M54N7MKxe = 5830 + INTEGER(IntKi), PARAMETER :: M54N8MKxe = 5831 + INTEGER(IntKi), PARAMETER :: M54N9MKxe = 5832 + INTEGER(IntKi), PARAMETER :: M55N1MKxe = 5833 + INTEGER(IntKi), PARAMETER :: M55N2MKxe = 5834 + INTEGER(IntKi), PARAMETER :: M55N3MKxe = 5835 + INTEGER(IntKi), PARAMETER :: M55N4MKxe = 5836 + INTEGER(IntKi), PARAMETER :: M55N5MKxe = 5837 + INTEGER(IntKi), PARAMETER :: M55N6MKxe = 5838 + INTEGER(IntKi), PARAMETER :: M55N7MKxe = 5839 + INTEGER(IntKi), PARAMETER :: M55N8MKxe = 5840 + INTEGER(IntKi), PARAMETER :: M55N9MKxe = 5841 + INTEGER(IntKi), PARAMETER :: M56N1MKxe = 5842 + INTEGER(IntKi), PARAMETER :: M56N2MKxe = 5843 + INTEGER(IntKi), PARAMETER :: M56N3MKxe = 5844 + INTEGER(IntKi), PARAMETER :: M56N4MKxe = 5845 + INTEGER(IntKi), PARAMETER :: M56N5MKxe = 5846 + INTEGER(IntKi), PARAMETER :: M56N6MKxe = 5847 + INTEGER(IntKi), PARAMETER :: M56N7MKxe = 5848 + INTEGER(IntKi), PARAMETER :: M56N8MKxe = 5849 + INTEGER(IntKi), PARAMETER :: M56N9MKxe = 5850 + INTEGER(IntKi), PARAMETER :: M57N1MKxe = 5851 + INTEGER(IntKi), PARAMETER :: M57N2MKxe = 5852 + INTEGER(IntKi), PARAMETER :: M57N3MKxe = 5853 + INTEGER(IntKi), PARAMETER :: M57N4MKxe = 5854 + INTEGER(IntKi), PARAMETER :: M57N5MKxe = 5855 + INTEGER(IntKi), PARAMETER :: M57N6MKxe = 5856 + INTEGER(IntKi), PARAMETER :: M57N7MKxe = 5857 + INTEGER(IntKi), PARAMETER :: M57N8MKxe = 5858 + INTEGER(IntKi), PARAMETER :: M57N9MKxe = 5859 + INTEGER(IntKi), PARAMETER :: M58N1MKxe = 5860 + INTEGER(IntKi), PARAMETER :: M58N2MKxe = 5861 + INTEGER(IntKi), PARAMETER :: M58N3MKxe = 5862 + INTEGER(IntKi), PARAMETER :: M58N4MKxe = 5863 + INTEGER(IntKi), PARAMETER :: M58N5MKxe = 5864 + INTEGER(IntKi), PARAMETER :: M58N6MKxe = 5865 + INTEGER(IntKi), PARAMETER :: M58N7MKxe = 5866 + INTEGER(IntKi), PARAMETER :: M58N8MKxe = 5867 + INTEGER(IntKi), PARAMETER :: M58N9MKxe = 5868 + INTEGER(IntKi), PARAMETER :: M59N1MKxe = 5869 + INTEGER(IntKi), PARAMETER :: M59N2MKxe = 5870 + INTEGER(IntKi), PARAMETER :: M59N3MKxe = 5871 + INTEGER(IntKi), PARAMETER :: M59N4MKxe = 5872 + INTEGER(IntKi), PARAMETER :: M59N5MKxe = 5873 + INTEGER(IntKi), PARAMETER :: M59N6MKxe = 5874 + INTEGER(IntKi), PARAMETER :: M59N7MKxe = 5875 + INTEGER(IntKi), PARAMETER :: M59N8MKxe = 5876 + INTEGER(IntKi), PARAMETER :: M59N9MKxe = 5877 + INTEGER(IntKi), PARAMETER :: M60N1MKxe = 5878 + INTEGER(IntKi), PARAMETER :: M60N2MKxe = 5879 + INTEGER(IntKi), PARAMETER :: M60N3MKxe = 5880 + INTEGER(IntKi), PARAMETER :: M60N4MKxe = 5881 + INTEGER(IntKi), PARAMETER :: M60N5MKxe = 5882 + INTEGER(IntKi), PARAMETER :: M60N6MKxe = 5883 + INTEGER(IntKi), PARAMETER :: M60N7MKxe = 5884 + INTEGER(IntKi), PARAMETER :: M60N8MKxe = 5885 + INTEGER(IntKi), PARAMETER :: M60N9MKxe = 5886 + INTEGER(IntKi), PARAMETER :: M61N1MKxe = 5887 + INTEGER(IntKi), PARAMETER :: M61N2MKxe = 5888 + INTEGER(IntKi), PARAMETER :: M61N3MKxe = 5889 + INTEGER(IntKi), PARAMETER :: M61N4MKxe = 5890 + INTEGER(IntKi), PARAMETER :: M61N5MKxe = 5891 + INTEGER(IntKi), PARAMETER :: M61N6MKxe = 5892 + INTEGER(IntKi), PARAMETER :: M61N7MKxe = 5893 + INTEGER(IntKi), PARAMETER :: M61N8MKxe = 5894 + INTEGER(IntKi), PARAMETER :: M61N9MKxe = 5895 + INTEGER(IntKi), PARAMETER :: M62N1MKxe = 5896 + INTEGER(IntKi), PARAMETER :: M62N2MKxe = 5897 + INTEGER(IntKi), PARAMETER :: M62N3MKxe = 5898 + INTEGER(IntKi), PARAMETER :: M62N4MKxe = 5899 + INTEGER(IntKi), PARAMETER :: M62N5MKxe = 5900 + INTEGER(IntKi), PARAMETER :: M62N6MKxe = 5901 + INTEGER(IntKi), PARAMETER :: M62N7MKxe = 5902 + INTEGER(IntKi), PARAMETER :: M62N8MKxe = 5903 + INTEGER(IntKi), PARAMETER :: M62N9MKxe = 5904 + INTEGER(IntKi), PARAMETER :: M63N1MKxe = 5905 + INTEGER(IntKi), PARAMETER :: M63N2MKxe = 5906 + INTEGER(IntKi), PARAMETER :: M63N3MKxe = 5907 + INTEGER(IntKi), PARAMETER :: M63N4MKxe = 5908 + INTEGER(IntKi), PARAMETER :: M63N5MKxe = 5909 + INTEGER(IntKi), PARAMETER :: M63N6MKxe = 5910 + INTEGER(IntKi), PARAMETER :: M63N7MKxe = 5911 + INTEGER(IntKi), PARAMETER :: M63N8MKxe = 5912 + INTEGER(IntKi), PARAMETER :: M63N9MKxe = 5913 + INTEGER(IntKi), PARAMETER :: M64N1MKxe = 5914 + INTEGER(IntKi), PARAMETER :: M64N2MKxe = 5915 + INTEGER(IntKi), PARAMETER :: M64N3MKxe = 5916 + INTEGER(IntKi), PARAMETER :: M64N4MKxe = 5917 + INTEGER(IntKi), PARAMETER :: M64N5MKxe = 5918 + INTEGER(IntKi), PARAMETER :: M64N6MKxe = 5919 + INTEGER(IntKi), PARAMETER :: M64N7MKxe = 5920 + INTEGER(IntKi), PARAMETER :: M64N8MKxe = 5921 + INTEGER(IntKi), PARAMETER :: M64N9MKxe = 5922 + INTEGER(IntKi), PARAMETER :: M65N1MKxe = 5923 + INTEGER(IntKi), PARAMETER :: M65N2MKxe = 5924 + INTEGER(IntKi), PARAMETER :: M65N3MKxe = 5925 + INTEGER(IntKi), PARAMETER :: M65N4MKxe = 5926 + INTEGER(IntKi), PARAMETER :: M65N5MKxe = 5927 + INTEGER(IntKi), PARAMETER :: M65N6MKxe = 5928 + INTEGER(IntKi), PARAMETER :: M65N7MKxe = 5929 + INTEGER(IntKi), PARAMETER :: M65N8MKxe = 5930 + INTEGER(IntKi), PARAMETER :: M65N9MKxe = 5931 + INTEGER(IntKi), PARAMETER :: M66N1MKxe = 5932 + INTEGER(IntKi), PARAMETER :: M66N2MKxe = 5933 + INTEGER(IntKi), PARAMETER :: M66N3MKxe = 5934 + INTEGER(IntKi), PARAMETER :: M66N4MKxe = 5935 + INTEGER(IntKi), PARAMETER :: M66N5MKxe = 5936 + INTEGER(IntKi), PARAMETER :: M66N6MKxe = 5937 + INTEGER(IntKi), PARAMETER :: M66N7MKxe = 5938 + INTEGER(IntKi), PARAMETER :: M66N8MKxe = 5939 + INTEGER(IntKi), PARAMETER :: M66N9MKxe = 5940 + INTEGER(IntKi), PARAMETER :: M67N1MKxe = 5941 + INTEGER(IntKi), PARAMETER :: M67N2MKxe = 5942 + INTEGER(IntKi), PARAMETER :: M67N3MKxe = 5943 + INTEGER(IntKi), PARAMETER :: M67N4MKxe = 5944 + INTEGER(IntKi), PARAMETER :: M67N5MKxe = 5945 + INTEGER(IntKi), PARAMETER :: M67N6MKxe = 5946 + INTEGER(IntKi), PARAMETER :: M67N7MKxe = 5947 + INTEGER(IntKi), PARAMETER :: M67N8MKxe = 5948 + INTEGER(IntKi), PARAMETER :: M67N9MKxe = 5949 + INTEGER(IntKi), PARAMETER :: M68N1MKxe = 5950 + INTEGER(IntKi), PARAMETER :: M68N2MKxe = 5951 + INTEGER(IntKi), PARAMETER :: M68N3MKxe = 5952 + INTEGER(IntKi), PARAMETER :: M68N4MKxe = 5953 + INTEGER(IntKi), PARAMETER :: M68N5MKxe = 5954 + INTEGER(IntKi), PARAMETER :: M68N6MKxe = 5955 + INTEGER(IntKi), PARAMETER :: M68N7MKxe = 5956 + INTEGER(IntKi), PARAMETER :: M68N8MKxe = 5957 + INTEGER(IntKi), PARAMETER :: M68N9MKxe = 5958 + INTEGER(IntKi), PARAMETER :: M69N1MKxe = 5959 + INTEGER(IntKi), PARAMETER :: M69N2MKxe = 5960 + INTEGER(IntKi), PARAMETER :: M69N3MKxe = 5961 + INTEGER(IntKi), PARAMETER :: M69N4MKxe = 5962 + INTEGER(IntKi), PARAMETER :: M69N5MKxe = 5963 + INTEGER(IntKi), PARAMETER :: M69N6MKxe = 5964 + INTEGER(IntKi), PARAMETER :: M69N7MKxe = 5965 + INTEGER(IntKi), PARAMETER :: M69N8MKxe = 5966 + INTEGER(IntKi), PARAMETER :: M69N9MKxe = 5967 + INTEGER(IntKi), PARAMETER :: M70N1MKxe = 5968 + INTEGER(IntKi), PARAMETER :: M70N2MKxe = 5969 + INTEGER(IntKi), PARAMETER :: M70N3MKxe = 5970 + INTEGER(IntKi), PARAMETER :: M70N4MKxe = 5971 + INTEGER(IntKi), PARAMETER :: M70N5MKxe = 5972 + INTEGER(IntKi), PARAMETER :: M70N6MKxe = 5973 + INTEGER(IntKi), PARAMETER :: M70N7MKxe = 5974 + INTEGER(IntKi), PARAMETER :: M70N8MKxe = 5975 + INTEGER(IntKi), PARAMETER :: M70N9MKxe = 5976 + INTEGER(IntKi), PARAMETER :: M71N1MKxe = 5977 + INTEGER(IntKi), PARAMETER :: M71N2MKxe = 5978 + INTEGER(IntKi), PARAMETER :: M71N3MKxe = 5979 + INTEGER(IntKi), PARAMETER :: M71N4MKxe = 5980 + INTEGER(IntKi), PARAMETER :: M71N5MKxe = 5981 + INTEGER(IntKi), PARAMETER :: M71N6MKxe = 5982 + INTEGER(IntKi), PARAMETER :: M71N7MKxe = 5983 + INTEGER(IntKi), PARAMETER :: M71N8MKxe = 5984 + INTEGER(IntKi), PARAMETER :: M71N9MKxe = 5985 + INTEGER(IntKi), PARAMETER :: M72N1MKxe = 5986 + INTEGER(IntKi), PARAMETER :: M72N2MKxe = 5987 + INTEGER(IntKi), PARAMETER :: M72N3MKxe = 5988 + INTEGER(IntKi), PARAMETER :: M72N4MKxe = 5989 + INTEGER(IntKi), PARAMETER :: M72N5MKxe = 5990 + INTEGER(IntKi), PARAMETER :: M72N6MKxe = 5991 + INTEGER(IntKi), PARAMETER :: M72N7MKxe = 5992 + INTEGER(IntKi), PARAMETER :: M72N8MKxe = 5993 + INTEGER(IntKi), PARAMETER :: M72N9MKxe = 5994 + INTEGER(IntKi), PARAMETER :: M73N1MKxe = 5995 + INTEGER(IntKi), PARAMETER :: M73N2MKxe = 5996 + INTEGER(IntKi), PARAMETER :: M73N3MKxe = 5997 + INTEGER(IntKi), PARAMETER :: M73N4MKxe = 5998 + INTEGER(IntKi), PARAMETER :: M73N5MKxe = 5999 + INTEGER(IntKi), PARAMETER :: M73N6MKxe = 6000 + INTEGER(IntKi), PARAMETER :: M73N7MKxe = 6001 + INTEGER(IntKi), PARAMETER :: M73N8MKxe = 6002 + INTEGER(IntKi), PARAMETER :: M73N9MKxe = 6003 + INTEGER(IntKi), PARAMETER :: M74N1MKxe = 6004 + INTEGER(IntKi), PARAMETER :: M74N2MKxe = 6005 + INTEGER(IntKi), PARAMETER :: M74N3MKxe = 6006 + INTEGER(IntKi), PARAMETER :: M74N4MKxe = 6007 + INTEGER(IntKi), PARAMETER :: M74N5MKxe = 6008 + INTEGER(IntKi), PARAMETER :: M74N6MKxe = 6009 + INTEGER(IntKi), PARAMETER :: M74N7MKxe = 6010 + INTEGER(IntKi), PARAMETER :: M74N8MKxe = 6011 + INTEGER(IntKi), PARAMETER :: M74N9MKxe = 6012 + INTEGER(IntKi), PARAMETER :: M75N1MKxe = 6013 + INTEGER(IntKi), PARAMETER :: M75N2MKxe = 6014 + INTEGER(IntKi), PARAMETER :: M75N3MKxe = 6015 + INTEGER(IntKi), PARAMETER :: M75N4MKxe = 6016 + INTEGER(IntKi), PARAMETER :: M75N5MKxe = 6017 + INTEGER(IntKi), PARAMETER :: M75N6MKxe = 6018 + INTEGER(IntKi), PARAMETER :: M75N7MKxe = 6019 + INTEGER(IntKi), PARAMETER :: M75N8MKxe = 6020 + INTEGER(IntKi), PARAMETER :: M75N9MKxe = 6021 + INTEGER(IntKi), PARAMETER :: M76N1MKxe = 6022 + INTEGER(IntKi), PARAMETER :: M76N2MKxe = 6023 + INTEGER(IntKi), PARAMETER :: M76N3MKxe = 6024 + INTEGER(IntKi), PARAMETER :: M76N4MKxe = 6025 + INTEGER(IntKi), PARAMETER :: M76N5MKxe = 6026 + INTEGER(IntKi), PARAMETER :: M76N6MKxe = 6027 + INTEGER(IntKi), PARAMETER :: M76N7MKxe = 6028 + INTEGER(IntKi), PARAMETER :: M76N8MKxe = 6029 + INTEGER(IntKi), PARAMETER :: M76N9MKxe = 6030 + INTEGER(IntKi), PARAMETER :: M77N1MKxe = 6031 + INTEGER(IntKi), PARAMETER :: M77N2MKxe = 6032 + INTEGER(IntKi), PARAMETER :: M77N3MKxe = 6033 + INTEGER(IntKi), PARAMETER :: M77N4MKxe = 6034 + INTEGER(IntKi), PARAMETER :: M77N5MKxe = 6035 + INTEGER(IntKi), PARAMETER :: M77N6MKxe = 6036 + INTEGER(IntKi), PARAMETER :: M77N7MKxe = 6037 + INTEGER(IntKi), PARAMETER :: M77N8MKxe = 6038 + INTEGER(IntKi), PARAMETER :: M77N9MKxe = 6039 + INTEGER(IntKi), PARAMETER :: M78N1MKxe = 6040 + INTEGER(IntKi), PARAMETER :: M78N2MKxe = 6041 + INTEGER(IntKi), PARAMETER :: M78N3MKxe = 6042 + INTEGER(IntKi), PARAMETER :: M78N4MKxe = 6043 + INTEGER(IntKi), PARAMETER :: M78N5MKxe = 6044 + INTEGER(IntKi), PARAMETER :: M78N6MKxe = 6045 + INTEGER(IntKi), PARAMETER :: M78N7MKxe = 6046 + INTEGER(IntKi), PARAMETER :: M78N8MKxe = 6047 + INTEGER(IntKi), PARAMETER :: M78N9MKxe = 6048 + INTEGER(IntKi), PARAMETER :: M79N1MKxe = 6049 + INTEGER(IntKi), PARAMETER :: M79N2MKxe = 6050 + INTEGER(IntKi), PARAMETER :: M79N3MKxe = 6051 + INTEGER(IntKi), PARAMETER :: M79N4MKxe = 6052 + INTEGER(IntKi), PARAMETER :: M79N5MKxe = 6053 + INTEGER(IntKi), PARAMETER :: M79N6MKxe = 6054 + INTEGER(IntKi), PARAMETER :: M79N7MKxe = 6055 + INTEGER(IntKi), PARAMETER :: M79N8MKxe = 6056 + INTEGER(IntKi), PARAMETER :: M79N9MKxe = 6057 + INTEGER(IntKi), PARAMETER :: M80N1MKxe = 6058 + INTEGER(IntKi), PARAMETER :: M80N2MKxe = 6059 + INTEGER(IntKi), PARAMETER :: M80N3MKxe = 6060 + INTEGER(IntKi), PARAMETER :: M80N4MKxe = 6061 + INTEGER(IntKi), PARAMETER :: M80N5MKxe = 6062 + INTEGER(IntKi), PARAMETER :: M80N6MKxe = 6063 + INTEGER(IntKi), PARAMETER :: M80N7MKxe = 6064 + INTEGER(IntKi), PARAMETER :: M80N8MKxe = 6065 + INTEGER(IntKi), PARAMETER :: M80N9MKxe = 6066 + INTEGER(IntKi), PARAMETER :: M81N1MKxe = 6067 + INTEGER(IntKi), PARAMETER :: M81N2MKxe = 6068 + INTEGER(IntKi), PARAMETER :: M81N3MKxe = 6069 + INTEGER(IntKi), PARAMETER :: M81N4MKxe = 6070 + INTEGER(IntKi), PARAMETER :: M81N5MKxe = 6071 + INTEGER(IntKi), PARAMETER :: M81N6MKxe = 6072 + INTEGER(IntKi), PARAMETER :: M81N7MKxe = 6073 + INTEGER(IntKi), PARAMETER :: M81N8MKxe = 6074 + INTEGER(IntKi), PARAMETER :: M81N9MKxe = 6075 + INTEGER(IntKi), PARAMETER :: M82N1MKxe = 6076 + INTEGER(IntKi), PARAMETER :: M82N2MKxe = 6077 + INTEGER(IntKi), PARAMETER :: M82N3MKxe = 6078 + INTEGER(IntKi), PARAMETER :: M82N4MKxe = 6079 + INTEGER(IntKi), PARAMETER :: M82N5MKxe = 6080 + INTEGER(IntKi), PARAMETER :: M82N6MKxe = 6081 + INTEGER(IntKi), PARAMETER :: M82N7MKxe = 6082 + INTEGER(IntKi), PARAMETER :: M82N8MKxe = 6083 + INTEGER(IntKi), PARAMETER :: M82N9MKxe = 6084 + INTEGER(IntKi), PARAMETER :: M83N1MKxe = 6085 + INTEGER(IntKi), PARAMETER :: M83N2MKxe = 6086 + INTEGER(IntKi), PARAMETER :: M83N3MKxe = 6087 + INTEGER(IntKi), PARAMETER :: M83N4MKxe = 6088 + INTEGER(IntKi), PARAMETER :: M83N5MKxe = 6089 + INTEGER(IntKi), PARAMETER :: M83N6MKxe = 6090 + INTEGER(IntKi), PARAMETER :: M83N7MKxe = 6091 + INTEGER(IntKi), PARAMETER :: M83N8MKxe = 6092 + INTEGER(IntKi), PARAMETER :: M83N9MKxe = 6093 + INTEGER(IntKi), PARAMETER :: M84N1MKxe = 6094 + INTEGER(IntKi), PARAMETER :: M84N2MKxe = 6095 + INTEGER(IntKi), PARAMETER :: M84N3MKxe = 6096 + INTEGER(IntKi), PARAMETER :: M84N4MKxe = 6097 + INTEGER(IntKi), PARAMETER :: M84N5MKxe = 6098 + INTEGER(IntKi), PARAMETER :: M84N6MKxe = 6099 + INTEGER(IntKi), PARAMETER :: M84N7MKxe = 6100 + INTEGER(IntKi), PARAMETER :: M84N8MKxe = 6101 + INTEGER(IntKi), PARAMETER :: M84N9MKxe = 6102 + INTEGER(IntKi), PARAMETER :: M85N1MKxe = 6103 + INTEGER(IntKi), PARAMETER :: M85N2MKxe = 6104 + INTEGER(IntKi), PARAMETER :: M85N3MKxe = 6105 + INTEGER(IntKi), PARAMETER :: M85N4MKxe = 6106 + INTEGER(IntKi), PARAMETER :: M85N5MKxe = 6107 + INTEGER(IntKi), PARAMETER :: M85N6MKxe = 6108 + INTEGER(IntKi), PARAMETER :: M85N7MKxe = 6109 + INTEGER(IntKi), PARAMETER :: M85N8MKxe = 6110 + INTEGER(IntKi), PARAMETER :: M85N9MKxe = 6111 + INTEGER(IntKi), PARAMETER :: M86N1MKxe = 6112 + INTEGER(IntKi), PARAMETER :: M86N2MKxe = 6113 + INTEGER(IntKi), PARAMETER :: M86N3MKxe = 6114 + INTEGER(IntKi), PARAMETER :: M86N4MKxe = 6115 + INTEGER(IntKi), PARAMETER :: M86N5MKxe = 6116 + INTEGER(IntKi), PARAMETER :: M86N6MKxe = 6117 + INTEGER(IntKi), PARAMETER :: M86N7MKxe = 6118 + INTEGER(IntKi), PARAMETER :: M86N8MKxe = 6119 + INTEGER(IntKi), PARAMETER :: M86N9MKxe = 6120 + INTEGER(IntKi), PARAMETER :: M87N1MKxe = 6121 + INTEGER(IntKi), PARAMETER :: M87N2MKxe = 6122 + INTEGER(IntKi), PARAMETER :: M87N3MKxe = 6123 + INTEGER(IntKi), PARAMETER :: M87N4MKxe = 6124 + INTEGER(IntKi), PARAMETER :: M87N5MKxe = 6125 + INTEGER(IntKi), PARAMETER :: M87N6MKxe = 6126 + INTEGER(IntKi), PARAMETER :: M87N7MKxe = 6127 + INTEGER(IntKi), PARAMETER :: M87N8MKxe = 6128 + INTEGER(IntKi), PARAMETER :: M87N9MKxe = 6129 + INTEGER(IntKi), PARAMETER :: M88N1MKxe = 6130 + INTEGER(IntKi), PARAMETER :: M88N2MKxe = 6131 + INTEGER(IntKi), PARAMETER :: M88N3MKxe = 6132 + INTEGER(IntKi), PARAMETER :: M88N4MKxe = 6133 + INTEGER(IntKi), PARAMETER :: M88N5MKxe = 6134 + INTEGER(IntKi), PARAMETER :: M88N6MKxe = 6135 + INTEGER(IntKi), PARAMETER :: M88N7MKxe = 6136 + INTEGER(IntKi), PARAMETER :: M88N8MKxe = 6137 + INTEGER(IntKi), PARAMETER :: M88N9MKxe = 6138 + INTEGER(IntKi), PARAMETER :: M89N1MKxe = 6139 + INTEGER(IntKi), PARAMETER :: M89N2MKxe = 6140 + INTEGER(IntKi), PARAMETER :: M89N3MKxe = 6141 + INTEGER(IntKi), PARAMETER :: M89N4MKxe = 6142 + INTEGER(IntKi), PARAMETER :: M89N5MKxe = 6143 + INTEGER(IntKi), PARAMETER :: M89N6MKxe = 6144 + INTEGER(IntKi), PARAMETER :: M89N7MKxe = 6145 + INTEGER(IntKi), PARAMETER :: M89N8MKxe = 6146 + INTEGER(IntKi), PARAMETER :: M89N9MKxe = 6147 + INTEGER(IntKi), PARAMETER :: M90N1MKxe = 6148 + INTEGER(IntKi), PARAMETER :: M90N2MKxe = 6149 + INTEGER(IntKi), PARAMETER :: M90N3MKxe = 6150 + INTEGER(IntKi), PARAMETER :: M90N4MKxe = 6151 + INTEGER(IntKi), PARAMETER :: M90N5MKxe = 6152 + INTEGER(IntKi), PARAMETER :: M90N6MKxe = 6153 + INTEGER(IntKi), PARAMETER :: M90N7MKxe = 6154 + INTEGER(IntKi), PARAMETER :: M90N8MKxe = 6155 + INTEGER(IntKi), PARAMETER :: M90N9MKxe = 6156 + INTEGER(IntKi), PARAMETER :: M91N1MKxe = 6157 + INTEGER(IntKi), PARAMETER :: M91N2MKxe = 6158 + INTEGER(IntKi), PARAMETER :: M91N3MKxe = 6159 + INTEGER(IntKi), PARAMETER :: M91N4MKxe = 6160 + INTEGER(IntKi), PARAMETER :: M91N5MKxe = 6161 + INTEGER(IntKi), PARAMETER :: M91N6MKxe = 6162 + INTEGER(IntKi), PARAMETER :: M91N7MKxe = 6163 + INTEGER(IntKi), PARAMETER :: M91N8MKxe = 6164 + INTEGER(IntKi), PARAMETER :: M91N9MKxe = 6165 + INTEGER(IntKi), PARAMETER :: M92N1MKxe = 6166 + INTEGER(IntKi), PARAMETER :: M92N2MKxe = 6167 + INTEGER(IntKi), PARAMETER :: M92N3MKxe = 6168 + INTEGER(IntKi), PARAMETER :: M92N4MKxe = 6169 + INTEGER(IntKi), PARAMETER :: M92N5MKxe = 6170 + INTEGER(IntKi), PARAMETER :: M92N6MKxe = 6171 + INTEGER(IntKi), PARAMETER :: M92N7MKxe = 6172 + INTEGER(IntKi), PARAMETER :: M92N8MKxe = 6173 + INTEGER(IntKi), PARAMETER :: M92N9MKxe = 6174 + INTEGER(IntKi), PARAMETER :: M93N1MKxe = 6175 + INTEGER(IntKi), PARAMETER :: M93N2MKxe = 6176 + INTEGER(IntKi), PARAMETER :: M93N3MKxe = 6177 + INTEGER(IntKi), PARAMETER :: M93N4MKxe = 6178 + INTEGER(IntKi), PARAMETER :: M93N5MKxe = 6179 + INTEGER(IntKi), PARAMETER :: M93N6MKxe = 6180 + INTEGER(IntKi), PARAMETER :: M93N7MKxe = 6181 + INTEGER(IntKi), PARAMETER :: M93N8MKxe = 6182 + INTEGER(IntKi), PARAMETER :: M93N9MKxe = 6183 + INTEGER(IntKi), PARAMETER :: M94N1MKxe = 6184 + INTEGER(IntKi), PARAMETER :: M94N2MKxe = 6185 + INTEGER(IntKi), PARAMETER :: M94N3MKxe = 6186 + INTEGER(IntKi), PARAMETER :: M94N4MKxe = 6187 + INTEGER(IntKi), PARAMETER :: M94N5MKxe = 6188 + INTEGER(IntKi), PARAMETER :: M94N6MKxe = 6189 + INTEGER(IntKi), PARAMETER :: M94N7MKxe = 6190 + INTEGER(IntKi), PARAMETER :: M94N8MKxe = 6191 + INTEGER(IntKi), PARAMETER :: M94N9MKxe = 6192 + INTEGER(IntKi), PARAMETER :: M95N1MKxe = 6193 + INTEGER(IntKi), PARAMETER :: M95N2MKxe = 6194 + INTEGER(IntKi), PARAMETER :: M95N3MKxe = 6195 + INTEGER(IntKi), PARAMETER :: M95N4MKxe = 6196 + INTEGER(IntKi), PARAMETER :: M95N5MKxe = 6197 + INTEGER(IntKi), PARAMETER :: M95N6MKxe = 6198 + INTEGER(IntKi), PARAMETER :: M95N7MKxe = 6199 + INTEGER(IntKi), PARAMETER :: M95N8MKxe = 6200 + INTEGER(IntKi), PARAMETER :: M95N9MKxe = 6201 + INTEGER(IntKi), PARAMETER :: M96N1MKxe = 6202 + INTEGER(IntKi), PARAMETER :: M96N2MKxe = 6203 + INTEGER(IntKi), PARAMETER :: M96N3MKxe = 6204 + INTEGER(IntKi), PARAMETER :: M96N4MKxe = 6205 + INTEGER(IntKi), PARAMETER :: M96N5MKxe = 6206 + INTEGER(IntKi), PARAMETER :: M96N6MKxe = 6207 + INTEGER(IntKi), PARAMETER :: M96N7MKxe = 6208 + INTEGER(IntKi), PARAMETER :: M96N8MKxe = 6209 + INTEGER(IntKi), PARAMETER :: M96N9MKxe = 6210 + INTEGER(IntKi), PARAMETER :: M97N1MKxe = 6211 + INTEGER(IntKi), PARAMETER :: M97N2MKxe = 6212 + INTEGER(IntKi), PARAMETER :: M97N3MKxe = 6213 + INTEGER(IntKi), PARAMETER :: M97N4MKxe = 6214 + INTEGER(IntKi), PARAMETER :: M97N5MKxe = 6215 + INTEGER(IntKi), PARAMETER :: M97N6MKxe = 6216 + INTEGER(IntKi), PARAMETER :: M97N7MKxe = 6217 + INTEGER(IntKi), PARAMETER :: M97N8MKxe = 6218 + INTEGER(IntKi), PARAMETER :: M97N9MKxe = 6219 + INTEGER(IntKi), PARAMETER :: M98N1MKxe = 6220 + INTEGER(IntKi), PARAMETER :: M98N2MKxe = 6221 + INTEGER(IntKi), PARAMETER :: M98N3MKxe = 6222 + INTEGER(IntKi), PARAMETER :: M98N4MKxe = 6223 + INTEGER(IntKi), PARAMETER :: M98N5MKxe = 6224 + INTEGER(IntKi), PARAMETER :: M98N6MKxe = 6225 + INTEGER(IntKi), PARAMETER :: M98N7MKxe = 6226 + INTEGER(IntKi), PARAMETER :: M98N8MKxe = 6227 + INTEGER(IntKi), PARAMETER :: M98N9MKxe = 6228 + INTEGER(IntKi), PARAMETER :: M99N1MKxe = 6229 + INTEGER(IntKi), PARAMETER :: M99N2MKxe = 6230 + INTEGER(IntKi), PARAMETER :: M99N3MKxe = 6231 + INTEGER(IntKi), PARAMETER :: M99N4MKxe = 6232 + INTEGER(IntKi), PARAMETER :: M99N5MKxe = 6233 + INTEGER(IntKi), PARAMETER :: M99N6MKxe = 6234 + INTEGER(IntKi), PARAMETER :: M99N7MKxe = 6235 + INTEGER(IntKi), PARAMETER :: M99N8MKxe = 6236 + INTEGER(IntKi), PARAMETER :: M99N9MKxe = 6237 + INTEGER(IntKi), PARAMETER :: M01N1MKye = 6238 + INTEGER(IntKi), PARAMETER :: M01N2MKye = 6239 + INTEGER(IntKi), PARAMETER :: M01N3MKye = 6240 + INTEGER(IntKi), PARAMETER :: M01N4MKye = 6241 + INTEGER(IntKi), PARAMETER :: M01N5MKye = 6242 + INTEGER(IntKi), PARAMETER :: M01N6MKye = 6243 + INTEGER(IntKi), PARAMETER :: M01N7MKye = 6244 + INTEGER(IntKi), PARAMETER :: M01N8MKye = 6245 + INTEGER(IntKi), PARAMETER :: M01N9MKye = 6246 + INTEGER(IntKi), PARAMETER :: M02N1MKye = 6247 + INTEGER(IntKi), PARAMETER :: M02N2MKye = 6248 + INTEGER(IntKi), PARAMETER :: M02N3MKye = 6249 + INTEGER(IntKi), PARAMETER :: M02N4MKye = 6250 + INTEGER(IntKi), PARAMETER :: M02N5MKye = 6251 + INTEGER(IntKi), PARAMETER :: M02N6MKye = 6252 + INTEGER(IntKi), PARAMETER :: M02N7MKye = 6253 + INTEGER(IntKi), PARAMETER :: M02N8MKye = 6254 + INTEGER(IntKi), PARAMETER :: M02N9MKye = 6255 + INTEGER(IntKi), PARAMETER :: M03N1MKye = 6256 + INTEGER(IntKi), PARAMETER :: M03N2MKye = 6257 + INTEGER(IntKi), PARAMETER :: M03N3MKye = 6258 + INTEGER(IntKi), PARAMETER :: M03N4MKye = 6259 + INTEGER(IntKi), PARAMETER :: M03N5MKye = 6260 + INTEGER(IntKi), PARAMETER :: M03N6MKye = 6261 + INTEGER(IntKi), PARAMETER :: M03N7MKye = 6262 + INTEGER(IntKi), PARAMETER :: M03N8MKye = 6263 + INTEGER(IntKi), PARAMETER :: M03N9MKye = 6264 + INTEGER(IntKi), PARAMETER :: M04N1MKye = 6265 + INTEGER(IntKi), PARAMETER :: M04N2MKye = 6266 + INTEGER(IntKi), PARAMETER :: M04N3MKye = 6267 + INTEGER(IntKi), PARAMETER :: M04N4MKye = 6268 + INTEGER(IntKi), PARAMETER :: M04N5MKye = 6269 + INTEGER(IntKi), PARAMETER :: M04N6MKye = 6270 + INTEGER(IntKi), PARAMETER :: M04N7MKye = 6271 + INTEGER(IntKi), PARAMETER :: M04N8MKye = 6272 + INTEGER(IntKi), PARAMETER :: M04N9MKye = 6273 + INTEGER(IntKi), PARAMETER :: M05N1MKye = 6274 + INTEGER(IntKi), PARAMETER :: M05N2MKye = 6275 + INTEGER(IntKi), PARAMETER :: M05N3MKye = 6276 + INTEGER(IntKi), PARAMETER :: M05N4MKye = 6277 + INTEGER(IntKi), PARAMETER :: M05N5MKye = 6278 + INTEGER(IntKi), PARAMETER :: M05N6MKye = 6279 + INTEGER(IntKi), PARAMETER :: M05N7MKye = 6280 + INTEGER(IntKi), PARAMETER :: M05N8MKye = 6281 + INTEGER(IntKi), PARAMETER :: M05N9MKye = 6282 + INTEGER(IntKi), PARAMETER :: M06N1MKye = 6283 + INTEGER(IntKi), PARAMETER :: M06N2MKye = 6284 + INTEGER(IntKi), PARAMETER :: M06N3MKye = 6285 + INTEGER(IntKi), PARAMETER :: M06N4MKye = 6286 + INTEGER(IntKi), PARAMETER :: M06N5MKye = 6287 + INTEGER(IntKi), PARAMETER :: M06N6MKye = 6288 + INTEGER(IntKi), PARAMETER :: M06N7MKye = 6289 + INTEGER(IntKi), PARAMETER :: M06N8MKye = 6290 + INTEGER(IntKi), PARAMETER :: M06N9MKye = 6291 + INTEGER(IntKi), PARAMETER :: M07N1MKye = 6292 + INTEGER(IntKi), PARAMETER :: M07N2MKye = 6293 + INTEGER(IntKi), PARAMETER :: M07N3MKye = 6294 + INTEGER(IntKi), PARAMETER :: M07N4MKye = 6295 + INTEGER(IntKi), PARAMETER :: M07N5MKye = 6296 + INTEGER(IntKi), PARAMETER :: M07N6MKye = 6297 + INTEGER(IntKi), PARAMETER :: M07N7MKye = 6298 + INTEGER(IntKi), PARAMETER :: M07N8MKye = 6299 + INTEGER(IntKi), PARAMETER :: M07N9MKye = 6300 + INTEGER(IntKi), PARAMETER :: M08N1MKye = 6301 + INTEGER(IntKi), PARAMETER :: M08N2MKye = 6302 + INTEGER(IntKi), PARAMETER :: M08N3MKye = 6303 + INTEGER(IntKi), PARAMETER :: M08N4MKye = 6304 + INTEGER(IntKi), PARAMETER :: M08N5MKye = 6305 + INTEGER(IntKi), PARAMETER :: M08N6MKye = 6306 + INTEGER(IntKi), PARAMETER :: M08N7MKye = 6307 + INTEGER(IntKi), PARAMETER :: M08N8MKye = 6308 + INTEGER(IntKi), PARAMETER :: M08N9MKye = 6309 + INTEGER(IntKi), PARAMETER :: M09N1MKye = 6310 + INTEGER(IntKi), PARAMETER :: M09N2MKye = 6311 + INTEGER(IntKi), PARAMETER :: M09N3MKye = 6312 + INTEGER(IntKi), PARAMETER :: M09N4MKye = 6313 + INTEGER(IntKi), PARAMETER :: M09N5MKye = 6314 + INTEGER(IntKi), PARAMETER :: M09N6MKye = 6315 + INTEGER(IntKi), PARAMETER :: M09N7MKye = 6316 + INTEGER(IntKi), PARAMETER :: M09N8MKye = 6317 + INTEGER(IntKi), PARAMETER :: M09N9MKye = 6318 + INTEGER(IntKi), PARAMETER :: M10N1MKye = 6319 + INTEGER(IntKi), PARAMETER :: M10N2MKye = 6320 + INTEGER(IntKi), PARAMETER :: M10N3MKye = 6321 + INTEGER(IntKi), PARAMETER :: M10N4MKye = 6322 + INTEGER(IntKi), PARAMETER :: M10N5MKye = 6323 + INTEGER(IntKi), PARAMETER :: M10N6MKye = 6324 + INTEGER(IntKi), PARAMETER :: M10N7MKye = 6325 + INTEGER(IntKi), PARAMETER :: M10N8MKye = 6326 + INTEGER(IntKi), PARAMETER :: M10N9MKye = 6327 + INTEGER(IntKi), PARAMETER :: M11N1MKye = 6328 + INTEGER(IntKi), PARAMETER :: M11N2MKye = 6329 + INTEGER(IntKi), PARAMETER :: M11N3MKye = 6330 + INTEGER(IntKi), PARAMETER :: M11N4MKye = 6331 + INTEGER(IntKi), PARAMETER :: M11N5MKye = 6332 + INTEGER(IntKi), PARAMETER :: M11N6MKye = 6333 + INTEGER(IntKi), PARAMETER :: M11N7MKye = 6334 + INTEGER(IntKi), PARAMETER :: M11N8MKye = 6335 + INTEGER(IntKi), PARAMETER :: M11N9MKye = 6336 + INTEGER(IntKi), PARAMETER :: M12N1MKye = 6337 + INTEGER(IntKi), PARAMETER :: M12N2MKye = 6338 + INTEGER(IntKi), PARAMETER :: M12N3MKye = 6339 + INTEGER(IntKi), PARAMETER :: M12N4MKye = 6340 + INTEGER(IntKi), PARAMETER :: M12N5MKye = 6341 + INTEGER(IntKi), PARAMETER :: M12N6MKye = 6342 + INTEGER(IntKi), PARAMETER :: M12N7MKye = 6343 + INTEGER(IntKi), PARAMETER :: M12N8MKye = 6344 + INTEGER(IntKi), PARAMETER :: M12N9MKye = 6345 + INTEGER(IntKi), PARAMETER :: M13N1MKye = 6346 + INTEGER(IntKi), PARAMETER :: M13N2MKye = 6347 + INTEGER(IntKi), PARAMETER :: M13N3MKye = 6348 + INTEGER(IntKi), PARAMETER :: M13N4MKye = 6349 + INTEGER(IntKi), PARAMETER :: M13N5MKye = 6350 + INTEGER(IntKi), PARAMETER :: M13N6MKye = 6351 + INTEGER(IntKi), PARAMETER :: M13N7MKye = 6352 + INTEGER(IntKi), PARAMETER :: M13N8MKye = 6353 + INTEGER(IntKi), PARAMETER :: M13N9MKye = 6354 + INTEGER(IntKi), PARAMETER :: M14N1MKye = 6355 + INTEGER(IntKi), PARAMETER :: M14N2MKye = 6356 + INTEGER(IntKi), PARAMETER :: M14N3MKye = 6357 + INTEGER(IntKi), PARAMETER :: M14N4MKye = 6358 + INTEGER(IntKi), PARAMETER :: M14N5MKye = 6359 + INTEGER(IntKi), PARAMETER :: M14N6MKye = 6360 + INTEGER(IntKi), PARAMETER :: M14N7MKye = 6361 + INTEGER(IntKi), PARAMETER :: M14N8MKye = 6362 + INTEGER(IntKi), PARAMETER :: M14N9MKye = 6363 + INTEGER(IntKi), PARAMETER :: M15N1MKye = 6364 + INTEGER(IntKi), PARAMETER :: M15N2MKye = 6365 + INTEGER(IntKi), PARAMETER :: M15N3MKye = 6366 + INTEGER(IntKi), PARAMETER :: M15N4MKye = 6367 + INTEGER(IntKi), PARAMETER :: M15N5MKye = 6368 + INTEGER(IntKi), PARAMETER :: M15N6MKye = 6369 + INTEGER(IntKi), PARAMETER :: M15N7MKye = 6370 + INTEGER(IntKi), PARAMETER :: M15N8MKye = 6371 + INTEGER(IntKi), PARAMETER :: M15N9MKye = 6372 + INTEGER(IntKi), PARAMETER :: M16N1MKye = 6373 + INTEGER(IntKi), PARAMETER :: M16N2MKye = 6374 + INTEGER(IntKi), PARAMETER :: M16N3MKye = 6375 + INTEGER(IntKi), PARAMETER :: M16N4MKye = 6376 + INTEGER(IntKi), PARAMETER :: M16N5MKye = 6377 + INTEGER(IntKi), PARAMETER :: M16N6MKye = 6378 + INTEGER(IntKi), PARAMETER :: M16N7MKye = 6379 + INTEGER(IntKi), PARAMETER :: M16N8MKye = 6380 + INTEGER(IntKi), PARAMETER :: M16N9MKye = 6381 + INTEGER(IntKi), PARAMETER :: M17N1MKye = 6382 + INTEGER(IntKi), PARAMETER :: M17N2MKye = 6383 + INTEGER(IntKi), PARAMETER :: M17N3MKye = 6384 + INTEGER(IntKi), PARAMETER :: M17N4MKye = 6385 + INTEGER(IntKi), PARAMETER :: M17N5MKye = 6386 + INTEGER(IntKi), PARAMETER :: M17N6MKye = 6387 + INTEGER(IntKi), PARAMETER :: M17N7MKye = 6388 + INTEGER(IntKi), PARAMETER :: M17N8MKye = 6389 + INTEGER(IntKi), PARAMETER :: M17N9MKye = 6390 + INTEGER(IntKi), PARAMETER :: M18N1MKye = 6391 + INTEGER(IntKi), PARAMETER :: M18N2MKye = 6392 + INTEGER(IntKi), PARAMETER :: M18N3MKye = 6393 + INTEGER(IntKi), PARAMETER :: M18N4MKye = 6394 + INTEGER(IntKi), PARAMETER :: M18N5MKye = 6395 + INTEGER(IntKi), PARAMETER :: M18N6MKye = 6396 + INTEGER(IntKi), PARAMETER :: M18N7MKye = 6397 + INTEGER(IntKi), PARAMETER :: M18N8MKye = 6398 + INTEGER(IntKi), PARAMETER :: M18N9MKye = 6399 + INTEGER(IntKi), PARAMETER :: M19N1MKye = 6400 + INTEGER(IntKi), PARAMETER :: M19N2MKye = 6401 + INTEGER(IntKi), PARAMETER :: M19N3MKye = 6402 + INTEGER(IntKi), PARAMETER :: M19N4MKye = 6403 + INTEGER(IntKi), PARAMETER :: M19N5MKye = 6404 + INTEGER(IntKi), PARAMETER :: M19N6MKye = 6405 + INTEGER(IntKi), PARAMETER :: M19N7MKye = 6406 + INTEGER(IntKi), PARAMETER :: M19N8MKye = 6407 + INTEGER(IntKi), PARAMETER :: M19N9MKye = 6408 + INTEGER(IntKi), PARAMETER :: M20N1MKye = 6409 + INTEGER(IntKi), PARAMETER :: M20N2MKye = 6410 + INTEGER(IntKi), PARAMETER :: M20N3MKye = 6411 + INTEGER(IntKi), PARAMETER :: M20N4MKye = 6412 + INTEGER(IntKi), PARAMETER :: M20N5MKye = 6413 + INTEGER(IntKi), PARAMETER :: M20N6MKye = 6414 + INTEGER(IntKi), PARAMETER :: M20N7MKye = 6415 + INTEGER(IntKi), PARAMETER :: M20N8MKye = 6416 + INTEGER(IntKi), PARAMETER :: M20N9MKye = 6417 + INTEGER(IntKi), PARAMETER :: M21N1MKye = 6418 + INTEGER(IntKi), PARAMETER :: M21N2MKye = 6419 + INTEGER(IntKi), PARAMETER :: M21N3MKye = 6420 + INTEGER(IntKi), PARAMETER :: M21N4MKye = 6421 + INTEGER(IntKi), PARAMETER :: M21N5MKye = 6422 + INTEGER(IntKi), PARAMETER :: M21N6MKye = 6423 + INTEGER(IntKi), PARAMETER :: M21N7MKye = 6424 + INTEGER(IntKi), PARAMETER :: M21N8MKye = 6425 + INTEGER(IntKi), PARAMETER :: M21N9MKye = 6426 + INTEGER(IntKi), PARAMETER :: M22N1MKye = 6427 + INTEGER(IntKi), PARAMETER :: M22N2MKye = 6428 + INTEGER(IntKi), PARAMETER :: M22N3MKye = 6429 + INTEGER(IntKi), PARAMETER :: M22N4MKye = 6430 + INTEGER(IntKi), PARAMETER :: M22N5MKye = 6431 + INTEGER(IntKi), PARAMETER :: M22N6MKye = 6432 + INTEGER(IntKi), PARAMETER :: M22N7MKye = 6433 + INTEGER(IntKi), PARAMETER :: M22N8MKye = 6434 + INTEGER(IntKi), PARAMETER :: M22N9MKye = 6435 + INTEGER(IntKi), PARAMETER :: M23N1MKye = 6436 + INTEGER(IntKi), PARAMETER :: M23N2MKye = 6437 + INTEGER(IntKi), PARAMETER :: M23N3MKye = 6438 + INTEGER(IntKi), PARAMETER :: M23N4MKye = 6439 + INTEGER(IntKi), PARAMETER :: M23N5MKye = 6440 + INTEGER(IntKi), PARAMETER :: M23N6MKye = 6441 + INTEGER(IntKi), PARAMETER :: M23N7MKye = 6442 + INTEGER(IntKi), PARAMETER :: M23N8MKye = 6443 + INTEGER(IntKi), PARAMETER :: M23N9MKye = 6444 + INTEGER(IntKi), PARAMETER :: M24N1MKye = 6445 + INTEGER(IntKi), PARAMETER :: M24N2MKye = 6446 + INTEGER(IntKi), PARAMETER :: M24N3MKye = 6447 + INTEGER(IntKi), PARAMETER :: M24N4MKye = 6448 + INTEGER(IntKi), PARAMETER :: M24N5MKye = 6449 + INTEGER(IntKi), PARAMETER :: M24N6MKye = 6450 + INTEGER(IntKi), PARAMETER :: M24N7MKye = 6451 + INTEGER(IntKi), PARAMETER :: M24N8MKye = 6452 + INTEGER(IntKi), PARAMETER :: M24N9MKye = 6453 + INTEGER(IntKi), PARAMETER :: M25N1MKye = 6454 + INTEGER(IntKi), PARAMETER :: M25N2MKye = 6455 + INTEGER(IntKi), PARAMETER :: M25N3MKye = 6456 + INTEGER(IntKi), PARAMETER :: M25N4MKye = 6457 + INTEGER(IntKi), PARAMETER :: M25N5MKye = 6458 + INTEGER(IntKi), PARAMETER :: M25N6MKye = 6459 + INTEGER(IntKi), PARAMETER :: M25N7MKye = 6460 + INTEGER(IntKi), PARAMETER :: M25N8MKye = 6461 + INTEGER(IntKi), PARAMETER :: M25N9MKye = 6462 + INTEGER(IntKi), PARAMETER :: M26N1MKye = 6463 + INTEGER(IntKi), PARAMETER :: M26N2MKye = 6464 + INTEGER(IntKi), PARAMETER :: M26N3MKye = 6465 + INTEGER(IntKi), PARAMETER :: M26N4MKye = 6466 + INTEGER(IntKi), PARAMETER :: M26N5MKye = 6467 + INTEGER(IntKi), PARAMETER :: M26N6MKye = 6468 + INTEGER(IntKi), PARAMETER :: M26N7MKye = 6469 + INTEGER(IntKi), PARAMETER :: M26N8MKye = 6470 + INTEGER(IntKi), PARAMETER :: M26N9MKye = 6471 + INTEGER(IntKi), PARAMETER :: M27N1MKye = 6472 + INTEGER(IntKi), PARAMETER :: M27N2MKye = 6473 + INTEGER(IntKi), PARAMETER :: M27N3MKye = 6474 + INTEGER(IntKi), PARAMETER :: M27N4MKye = 6475 + INTEGER(IntKi), PARAMETER :: M27N5MKye = 6476 + INTEGER(IntKi), PARAMETER :: M27N6MKye = 6477 + INTEGER(IntKi), PARAMETER :: M27N7MKye = 6478 + INTEGER(IntKi), PARAMETER :: M27N8MKye = 6479 + INTEGER(IntKi), PARAMETER :: M27N9MKye = 6480 + INTEGER(IntKi), PARAMETER :: M28N1MKye = 6481 + INTEGER(IntKi), PARAMETER :: M28N2MKye = 6482 + INTEGER(IntKi), PARAMETER :: M28N3MKye = 6483 + INTEGER(IntKi), PARAMETER :: M28N4MKye = 6484 + INTEGER(IntKi), PARAMETER :: M28N5MKye = 6485 + INTEGER(IntKi), PARAMETER :: M28N6MKye = 6486 + INTEGER(IntKi), PARAMETER :: M28N7MKye = 6487 + INTEGER(IntKi), PARAMETER :: M28N8MKye = 6488 + INTEGER(IntKi), PARAMETER :: M28N9MKye = 6489 + INTEGER(IntKi), PARAMETER :: M29N1MKye = 6490 + INTEGER(IntKi), PARAMETER :: M29N2MKye = 6491 + INTEGER(IntKi), PARAMETER :: M29N3MKye = 6492 + INTEGER(IntKi), PARAMETER :: M29N4MKye = 6493 + INTEGER(IntKi), PARAMETER :: M29N5MKye = 6494 + INTEGER(IntKi), PARAMETER :: M29N6MKye = 6495 + INTEGER(IntKi), PARAMETER :: M29N7MKye = 6496 + INTEGER(IntKi), PARAMETER :: M29N8MKye = 6497 + INTEGER(IntKi), PARAMETER :: M29N9MKye = 6498 + INTEGER(IntKi), PARAMETER :: M30N1MKye = 6499 + INTEGER(IntKi), PARAMETER :: M30N2MKye = 6500 + INTEGER(IntKi), PARAMETER :: M30N3MKye = 6501 + INTEGER(IntKi), PARAMETER :: M30N4MKye = 6502 + INTEGER(IntKi), PARAMETER :: M30N5MKye = 6503 + INTEGER(IntKi), PARAMETER :: M30N6MKye = 6504 + INTEGER(IntKi), PARAMETER :: M30N7MKye = 6505 + INTEGER(IntKi), PARAMETER :: M30N8MKye = 6506 + INTEGER(IntKi), PARAMETER :: M30N9MKye = 6507 + INTEGER(IntKi), PARAMETER :: M31N1MKye = 6508 + INTEGER(IntKi), PARAMETER :: M31N2MKye = 6509 + INTEGER(IntKi), PARAMETER :: M31N3MKye = 6510 + INTEGER(IntKi), PARAMETER :: M31N4MKye = 6511 + INTEGER(IntKi), PARAMETER :: M31N5MKye = 6512 + INTEGER(IntKi), PARAMETER :: M31N6MKye = 6513 + INTEGER(IntKi), PARAMETER :: M31N7MKye = 6514 + INTEGER(IntKi), PARAMETER :: M31N8MKye = 6515 + INTEGER(IntKi), PARAMETER :: M31N9MKye = 6516 + INTEGER(IntKi), PARAMETER :: M32N1MKye = 6517 + INTEGER(IntKi), PARAMETER :: M32N2MKye = 6518 + INTEGER(IntKi), PARAMETER :: M32N3MKye = 6519 + INTEGER(IntKi), PARAMETER :: M32N4MKye = 6520 + INTEGER(IntKi), PARAMETER :: M32N5MKye = 6521 + INTEGER(IntKi), PARAMETER :: M32N6MKye = 6522 + INTEGER(IntKi), PARAMETER :: M32N7MKye = 6523 + INTEGER(IntKi), PARAMETER :: M32N8MKye = 6524 + INTEGER(IntKi), PARAMETER :: M32N9MKye = 6525 + INTEGER(IntKi), PARAMETER :: M33N1MKye = 6526 + INTEGER(IntKi), PARAMETER :: M33N2MKye = 6527 + INTEGER(IntKi), PARAMETER :: M33N3MKye = 6528 + INTEGER(IntKi), PARAMETER :: M33N4MKye = 6529 + INTEGER(IntKi), PARAMETER :: M33N5MKye = 6530 + INTEGER(IntKi), PARAMETER :: M33N6MKye = 6531 + INTEGER(IntKi), PARAMETER :: M33N7MKye = 6532 + INTEGER(IntKi), PARAMETER :: M33N8MKye = 6533 + INTEGER(IntKi), PARAMETER :: M33N9MKye = 6534 + INTEGER(IntKi), PARAMETER :: M34N1MKye = 6535 + INTEGER(IntKi), PARAMETER :: M34N2MKye = 6536 + INTEGER(IntKi), PARAMETER :: M34N3MKye = 6537 + INTEGER(IntKi), PARAMETER :: M34N4MKye = 6538 + INTEGER(IntKi), PARAMETER :: M34N5MKye = 6539 + INTEGER(IntKi), PARAMETER :: M34N6MKye = 6540 + INTEGER(IntKi), PARAMETER :: M34N7MKye = 6541 + INTEGER(IntKi), PARAMETER :: M34N8MKye = 6542 + INTEGER(IntKi), PARAMETER :: M34N9MKye = 6543 + INTEGER(IntKi), PARAMETER :: M35N1MKye = 6544 + INTEGER(IntKi), PARAMETER :: M35N2MKye = 6545 + INTEGER(IntKi), PARAMETER :: M35N3MKye = 6546 + INTEGER(IntKi), PARAMETER :: M35N4MKye = 6547 + INTEGER(IntKi), PARAMETER :: M35N5MKye = 6548 + INTEGER(IntKi), PARAMETER :: M35N6MKye = 6549 + INTEGER(IntKi), PARAMETER :: M35N7MKye = 6550 + INTEGER(IntKi), PARAMETER :: M35N8MKye = 6551 + INTEGER(IntKi), PARAMETER :: M35N9MKye = 6552 + INTEGER(IntKi), PARAMETER :: M36N1MKye = 6553 + INTEGER(IntKi), PARAMETER :: M36N2MKye = 6554 + INTEGER(IntKi), PARAMETER :: M36N3MKye = 6555 + INTEGER(IntKi), PARAMETER :: M36N4MKye = 6556 + INTEGER(IntKi), PARAMETER :: M36N5MKye = 6557 + INTEGER(IntKi), PARAMETER :: M36N6MKye = 6558 + INTEGER(IntKi), PARAMETER :: M36N7MKye = 6559 + INTEGER(IntKi), PARAMETER :: M36N8MKye = 6560 + INTEGER(IntKi), PARAMETER :: M36N9MKye = 6561 + INTEGER(IntKi), PARAMETER :: M37N1MKye = 6562 + INTEGER(IntKi), PARAMETER :: M37N2MKye = 6563 + INTEGER(IntKi), PARAMETER :: M37N3MKye = 6564 + INTEGER(IntKi), PARAMETER :: M37N4MKye = 6565 + INTEGER(IntKi), PARAMETER :: M37N5MKye = 6566 + INTEGER(IntKi), PARAMETER :: M37N6MKye = 6567 + INTEGER(IntKi), PARAMETER :: M37N7MKye = 6568 + INTEGER(IntKi), PARAMETER :: M37N8MKye = 6569 + INTEGER(IntKi), PARAMETER :: M37N9MKye = 6570 + INTEGER(IntKi), PARAMETER :: M38N1MKye = 6571 + INTEGER(IntKi), PARAMETER :: M38N2MKye = 6572 + INTEGER(IntKi), PARAMETER :: M38N3MKye = 6573 + INTEGER(IntKi), PARAMETER :: M38N4MKye = 6574 + INTEGER(IntKi), PARAMETER :: M38N5MKye = 6575 + INTEGER(IntKi), PARAMETER :: M38N6MKye = 6576 + INTEGER(IntKi), PARAMETER :: M38N7MKye = 6577 + INTEGER(IntKi), PARAMETER :: M38N8MKye = 6578 + INTEGER(IntKi), PARAMETER :: M38N9MKye = 6579 + INTEGER(IntKi), PARAMETER :: M39N1MKye = 6580 + INTEGER(IntKi), PARAMETER :: M39N2MKye = 6581 + INTEGER(IntKi), PARAMETER :: M39N3MKye = 6582 + INTEGER(IntKi), PARAMETER :: M39N4MKye = 6583 + INTEGER(IntKi), PARAMETER :: M39N5MKye = 6584 + INTEGER(IntKi), PARAMETER :: M39N6MKye = 6585 + INTEGER(IntKi), PARAMETER :: M39N7MKye = 6586 + INTEGER(IntKi), PARAMETER :: M39N8MKye = 6587 + INTEGER(IntKi), PARAMETER :: M39N9MKye = 6588 + INTEGER(IntKi), PARAMETER :: M40N1MKye = 6589 + INTEGER(IntKi), PARAMETER :: M40N2MKye = 6590 + INTEGER(IntKi), PARAMETER :: M40N3MKye = 6591 + INTEGER(IntKi), PARAMETER :: M40N4MKye = 6592 + INTEGER(IntKi), PARAMETER :: M40N5MKye = 6593 + INTEGER(IntKi), PARAMETER :: M40N6MKye = 6594 + INTEGER(IntKi), PARAMETER :: M40N7MKye = 6595 + INTEGER(IntKi), PARAMETER :: M40N8MKye = 6596 + INTEGER(IntKi), PARAMETER :: M40N9MKye = 6597 + INTEGER(IntKi), PARAMETER :: M41N1MKye = 6598 + INTEGER(IntKi), PARAMETER :: M41N2MKye = 6599 + INTEGER(IntKi), PARAMETER :: M41N3MKye = 6600 + INTEGER(IntKi), PARAMETER :: M41N4MKye = 6601 + INTEGER(IntKi), PARAMETER :: M41N5MKye = 6602 + INTEGER(IntKi), PARAMETER :: M41N6MKye = 6603 + INTEGER(IntKi), PARAMETER :: M41N7MKye = 6604 + INTEGER(IntKi), PARAMETER :: M41N8MKye = 6605 + INTEGER(IntKi), PARAMETER :: M41N9MKye = 6606 + INTEGER(IntKi), PARAMETER :: M42N1MKye = 6607 + INTEGER(IntKi), PARAMETER :: M42N2MKye = 6608 + INTEGER(IntKi), PARAMETER :: M42N3MKye = 6609 + INTEGER(IntKi), PARAMETER :: M42N4MKye = 6610 + INTEGER(IntKi), PARAMETER :: M42N5MKye = 6611 + INTEGER(IntKi), PARAMETER :: M42N6MKye = 6612 + INTEGER(IntKi), PARAMETER :: M42N7MKye = 6613 + INTEGER(IntKi), PARAMETER :: M42N8MKye = 6614 + INTEGER(IntKi), PARAMETER :: M42N9MKye = 6615 + INTEGER(IntKi), PARAMETER :: M43N1MKye = 6616 + INTEGER(IntKi), PARAMETER :: M43N2MKye = 6617 + INTEGER(IntKi), PARAMETER :: M43N3MKye = 6618 + INTEGER(IntKi), PARAMETER :: M43N4MKye = 6619 + INTEGER(IntKi), PARAMETER :: M43N5MKye = 6620 + INTEGER(IntKi), PARAMETER :: M43N6MKye = 6621 + INTEGER(IntKi), PARAMETER :: M43N7MKye = 6622 + INTEGER(IntKi), PARAMETER :: M43N8MKye = 6623 + INTEGER(IntKi), PARAMETER :: M43N9MKye = 6624 + INTEGER(IntKi), PARAMETER :: M44N1MKye = 6625 + INTEGER(IntKi), PARAMETER :: M44N2MKye = 6626 + INTEGER(IntKi), PARAMETER :: M44N3MKye = 6627 + INTEGER(IntKi), PARAMETER :: M44N4MKye = 6628 + INTEGER(IntKi), PARAMETER :: M44N5MKye = 6629 + INTEGER(IntKi), PARAMETER :: M44N6MKye = 6630 + INTEGER(IntKi), PARAMETER :: M44N7MKye = 6631 + INTEGER(IntKi), PARAMETER :: M44N8MKye = 6632 + INTEGER(IntKi), PARAMETER :: M44N9MKye = 6633 + INTEGER(IntKi), PARAMETER :: M45N1MKye = 6634 + INTEGER(IntKi), PARAMETER :: M45N2MKye = 6635 + INTEGER(IntKi), PARAMETER :: M45N3MKye = 6636 + INTEGER(IntKi), PARAMETER :: M45N4MKye = 6637 + INTEGER(IntKi), PARAMETER :: M45N5MKye = 6638 + INTEGER(IntKi), PARAMETER :: M45N6MKye = 6639 + INTEGER(IntKi), PARAMETER :: M45N7MKye = 6640 + INTEGER(IntKi), PARAMETER :: M45N8MKye = 6641 + INTEGER(IntKi), PARAMETER :: M45N9MKye = 6642 + INTEGER(IntKi), PARAMETER :: M46N1MKye = 6643 + INTEGER(IntKi), PARAMETER :: M46N2MKye = 6644 + INTEGER(IntKi), PARAMETER :: M46N3MKye = 6645 + INTEGER(IntKi), PARAMETER :: M46N4MKye = 6646 + INTEGER(IntKi), PARAMETER :: M46N5MKye = 6647 + INTEGER(IntKi), PARAMETER :: M46N6MKye = 6648 + INTEGER(IntKi), PARAMETER :: M46N7MKye = 6649 + INTEGER(IntKi), PARAMETER :: M46N8MKye = 6650 + INTEGER(IntKi), PARAMETER :: M46N9MKye = 6651 + INTEGER(IntKi), PARAMETER :: M47N1MKye = 6652 + INTEGER(IntKi), PARAMETER :: M47N2MKye = 6653 + INTEGER(IntKi), PARAMETER :: M47N3MKye = 6654 + INTEGER(IntKi), PARAMETER :: M47N4MKye = 6655 + INTEGER(IntKi), PARAMETER :: M47N5MKye = 6656 + INTEGER(IntKi), PARAMETER :: M47N6MKye = 6657 + INTEGER(IntKi), PARAMETER :: M47N7MKye = 6658 + INTEGER(IntKi), PARAMETER :: M47N8MKye = 6659 + INTEGER(IntKi), PARAMETER :: M47N9MKye = 6660 + INTEGER(IntKi), PARAMETER :: M48N1MKye = 6661 + INTEGER(IntKi), PARAMETER :: M48N2MKye = 6662 + INTEGER(IntKi), PARAMETER :: M48N3MKye = 6663 + INTEGER(IntKi), PARAMETER :: M48N4MKye = 6664 + INTEGER(IntKi), PARAMETER :: M48N5MKye = 6665 + INTEGER(IntKi), PARAMETER :: M48N6MKye = 6666 + INTEGER(IntKi), PARAMETER :: M48N7MKye = 6667 + INTEGER(IntKi), PARAMETER :: M48N8MKye = 6668 + INTEGER(IntKi), PARAMETER :: M48N9MKye = 6669 + INTEGER(IntKi), PARAMETER :: M49N1MKye = 6670 + INTEGER(IntKi), PARAMETER :: M49N2MKye = 6671 + INTEGER(IntKi), PARAMETER :: M49N3MKye = 6672 + INTEGER(IntKi), PARAMETER :: M49N4MKye = 6673 + INTEGER(IntKi), PARAMETER :: M49N5MKye = 6674 + INTEGER(IntKi), PARAMETER :: M49N6MKye = 6675 + INTEGER(IntKi), PARAMETER :: M49N7MKye = 6676 + INTEGER(IntKi), PARAMETER :: M49N8MKye = 6677 + INTEGER(IntKi), PARAMETER :: M49N9MKye = 6678 + INTEGER(IntKi), PARAMETER :: M50N1MKye = 6679 + INTEGER(IntKi), PARAMETER :: M50N2MKye = 6680 + INTEGER(IntKi), PARAMETER :: M50N3MKye = 6681 + INTEGER(IntKi), PARAMETER :: M50N4MKye = 6682 + INTEGER(IntKi), PARAMETER :: M50N5MKye = 6683 + INTEGER(IntKi), PARAMETER :: M50N6MKye = 6684 + INTEGER(IntKi), PARAMETER :: M50N7MKye = 6685 + INTEGER(IntKi), PARAMETER :: M50N8MKye = 6686 + INTEGER(IntKi), PARAMETER :: M50N9MKye = 6687 + INTEGER(IntKi), PARAMETER :: M51N1MKye = 6688 + INTEGER(IntKi), PARAMETER :: M51N2MKye = 6689 + INTEGER(IntKi), PARAMETER :: M51N3MKye = 6690 + INTEGER(IntKi), PARAMETER :: M51N4MKye = 6691 + INTEGER(IntKi), PARAMETER :: M51N5MKye = 6692 + INTEGER(IntKi), PARAMETER :: M51N6MKye = 6693 + INTEGER(IntKi), PARAMETER :: M51N7MKye = 6694 + INTEGER(IntKi), PARAMETER :: M51N8MKye = 6695 + INTEGER(IntKi), PARAMETER :: M51N9MKye = 6696 + INTEGER(IntKi), PARAMETER :: M52N1MKye = 6697 + INTEGER(IntKi), PARAMETER :: M52N2MKye = 6698 + INTEGER(IntKi), PARAMETER :: M52N3MKye = 6699 + INTEGER(IntKi), PARAMETER :: M52N4MKye = 6700 + INTEGER(IntKi), PARAMETER :: M52N5MKye = 6701 + INTEGER(IntKi), PARAMETER :: M52N6MKye = 6702 + INTEGER(IntKi), PARAMETER :: M52N7MKye = 6703 + INTEGER(IntKi), PARAMETER :: M52N8MKye = 6704 + INTEGER(IntKi), PARAMETER :: M52N9MKye = 6705 + INTEGER(IntKi), PARAMETER :: M53N1MKye = 6706 + INTEGER(IntKi), PARAMETER :: M53N2MKye = 6707 + INTEGER(IntKi), PARAMETER :: M53N3MKye = 6708 + INTEGER(IntKi), PARAMETER :: M53N4MKye = 6709 + INTEGER(IntKi), PARAMETER :: M53N5MKye = 6710 + INTEGER(IntKi), PARAMETER :: M53N6MKye = 6711 + INTEGER(IntKi), PARAMETER :: M53N7MKye = 6712 + INTEGER(IntKi), PARAMETER :: M53N8MKye = 6713 + INTEGER(IntKi), PARAMETER :: M53N9MKye = 6714 + INTEGER(IntKi), PARAMETER :: M54N1MKye = 6715 + INTEGER(IntKi), PARAMETER :: M54N2MKye = 6716 + INTEGER(IntKi), PARAMETER :: M54N3MKye = 6717 + INTEGER(IntKi), PARAMETER :: M54N4MKye = 6718 + INTEGER(IntKi), PARAMETER :: M54N5MKye = 6719 + INTEGER(IntKi), PARAMETER :: M54N6MKye = 6720 + INTEGER(IntKi), PARAMETER :: M54N7MKye = 6721 + INTEGER(IntKi), PARAMETER :: M54N8MKye = 6722 + INTEGER(IntKi), PARAMETER :: M54N9MKye = 6723 + INTEGER(IntKi), PARAMETER :: M55N1MKye = 6724 + INTEGER(IntKi), PARAMETER :: M55N2MKye = 6725 + INTEGER(IntKi), PARAMETER :: M55N3MKye = 6726 + INTEGER(IntKi), PARAMETER :: M55N4MKye = 6727 + INTEGER(IntKi), PARAMETER :: M55N5MKye = 6728 + INTEGER(IntKi), PARAMETER :: M55N6MKye = 6729 + INTEGER(IntKi), PARAMETER :: M55N7MKye = 6730 + INTEGER(IntKi), PARAMETER :: M55N8MKye = 6731 + INTEGER(IntKi), PARAMETER :: M55N9MKye = 6732 + INTEGER(IntKi), PARAMETER :: M56N1MKye = 6733 + INTEGER(IntKi), PARAMETER :: M56N2MKye = 6734 + INTEGER(IntKi), PARAMETER :: M56N3MKye = 6735 + INTEGER(IntKi), PARAMETER :: M56N4MKye = 6736 + INTEGER(IntKi), PARAMETER :: M56N5MKye = 6737 + INTEGER(IntKi), PARAMETER :: M56N6MKye = 6738 + INTEGER(IntKi), PARAMETER :: M56N7MKye = 6739 + INTEGER(IntKi), PARAMETER :: M56N8MKye = 6740 + INTEGER(IntKi), PARAMETER :: M56N9MKye = 6741 + INTEGER(IntKi), PARAMETER :: M57N1MKye = 6742 + INTEGER(IntKi), PARAMETER :: M57N2MKye = 6743 + INTEGER(IntKi), PARAMETER :: M57N3MKye = 6744 + INTEGER(IntKi), PARAMETER :: M57N4MKye = 6745 + INTEGER(IntKi), PARAMETER :: M57N5MKye = 6746 + INTEGER(IntKi), PARAMETER :: M57N6MKye = 6747 + INTEGER(IntKi), PARAMETER :: M57N7MKye = 6748 + INTEGER(IntKi), PARAMETER :: M57N8MKye = 6749 + INTEGER(IntKi), PARAMETER :: M57N9MKye = 6750 + INTEGER(IntKi), PARAMETER :: M58N1MKye = 6751 + INTEGER(IntKi), PARAMETER :: M58N2MKye = 6752 + INTEGER(IntKi), PARAMETER :: M58N3MKye = 6753 + INTEGER(IntKi), PARAMETER :: M58N4MKye = 6754 + INTEGER(IntKi), PARAMETER :: M58N5MKye = 6755 + INTEGER(IntKi), PARAMETER :: M58N6MKye = 6756 + INTEGER(IntKi), PARAMETER :: M58N7MKye = 6757 + INTEGER(IntKi), PARAMETER :: M58N8MKye = 6758 + INTEGER(IntKi), PARAMETER :: M58N9MKye = 6759 + INTEGER(IntKi), PARAMETER :: M59N1MKye = 6760 + INTEGER(IntKi), PARAMETER :: M59N2MKye = 6761 + INTEGER(IntKi), PARAMETER :: M59N3MKye = 6762 + INTEGER(IntKi), PARAMETER :: M59N4MKye = 6763 + INTEGER(IntKi), PARAMETER :: M59N5MKye = 6764 + INTEGER(IntKi), PARAMETER :: M59N6MKye = 6765 + INTEGER(IntKi), PARAMETER :: M59N7MKye = 6766 + INTEGER(IntKi), PARAMETER :: M59N8MKye = 6767 + INTEGER(IntKi), PARAMETER :: M59N9MKye = 6768 + INTEGER(IntKi), PARAMETER :: M60N1MKye = 6769 + INTEGER(IntKi), PARAMETER :: M60N2MKye = 6770 + INTEGER(IntKi), PARAMETER :: M60N3MKye = 6771 + INTEGER(IntKi), PARAMETER :: M60N4MKye = 6772 + INTEGER(IntKi), PARAMETER :: M60N5MKye = 6773 + INTEGER(IntKi), PARAMETER :: M60N6MKye = 6774 + INTEGER(IntKi), PARAMETER :: M60N7MKye = 6775 + INTEGER(IntKi), PARAMETER :: M60N8MKye = 6776 + INTEGER(IntKi), PARAMETER :: M60N9MKye = 6777 + INTEGER(IntKi), PARAMETER :: M61N1MKye = 6778 + INTEGER(IntKi), PARAMETER :: M61N2MKye = 6779 + INTEGER(IntKi), PARAMETER :: M61N3MKye = 6780 + INTEGER(IntKi), PARAMETER :: M61N4MKye = 6781 + INTEGER(IntKi), PARAMETER :: M61N5MKye = 6782 + INTEGER(IntKi), PARAMETER :: M61N6MKye = 6783 + INTEGER(IntKi), PARAMETER :: M61N7MKye = 6784 + INTEGER(IntKi), PARAMETER :: M61N8MKye = 6785 + INTEGER(IntKi), PARAMETER :: M61N9MKye = 6786 + INTEGER(IntKi), PARAMETER :: M62N1MKye = 6787 + INTEGER(IntKi), PARAMETER :: M62N2MKye = 6788 + INTEGER(IntKi), PARAMETER :: M62N3MKye = 6789 + INTEGER(IntKi), PARAMETER :: M62N4MKye = 6790 + INTEGER(IntKi), PARAMETER :: M62N5MKye = 6791 + INTEGER(IntKi), PARAMETER :: M62N6MKye = 6792 + INTEGER(IntKi), PARAMETER :: M62N7MKye = 6793 + INTEGER(IntKi), PARAMETER :: M62N8MKye = 6794 + INTEGER(IntKi), PARAMETER :: M62N9MKye = 6795 + INTEGER(IntKi), PARAMETER :: M63N1MKye = 6796 + INTEGER(IntKi), PARAMETER :: M63N2MKye = 6797 + INTEGER(IntKi), PARAMETER :: M63N3MKye = 6798 + INTEGER(IntKi), PARAMETER :: M63N4MKye = 6799 + INTEGER(IntKi), PARAMETER :: M63N5MKye = 6800 + INTEGER(IntKi), PARAMETER :: M63N6MKye = 6801 + INTEGER(IntKi), PARAMETER :: M63N7MKye = 6802 + INTEGER(IntKi), PARAMETER :: M63N8MKye = 6803 + INTEGER(IntKi), PARAMETER :: M63N9MKye = 6804 + INTEGER(IntKi), PARAMETER :: M64N1MKye = 6805 + INTEGER(IntKi), PARAMETER :: M64N2MKye = 6806 + INTEGER(IntKi), PARAMETER :: M64N3MKye = 6807 + INTEGER(IntKi), PARAMETER :: M64N4MKye = 6808 + INTEGER(IntKi), PARAMETER :: M64N5MKye = 6809 + INTEGER(IntKi), PARAMETER :: M64N6MKye = 6810 + INTEGER(IntKi), PARAMETER :: M64N7MKye = 6811 + INTEGER(IntKi), PARAMETER :: M64N8MKye = 6812 + INTEGER(IntKi), PARAMETER :: M64N9MKye = 6813 + INTEGER(IntKi), PARAMETER :: M65N1MKye = 6814 + INTEGER(IntKi), PARAMETER :: M65N2MKye = 6815 + INTEGER(IntKi), PARAMETER :: M65N3MKye = 6816 + INTEGER(IntKi), PARAMETER :: M65N4MKye = 6817 + INTEGER(IntKi), PARAMETER :: M65N5MKye = 6818 + INTEGER(IntKi), PARAMETER :: M65N6MKye = 6819 + INTEGER(IntKi), PARAMETER :: M65N7MKye = 6820 + INTEGER(IntKi), PARAMETER :: M65N8MKye = 6821 + INTEGER(IntKi), PARAMETER :: M65N9MKye = 6822 + INTEGER(IntKi), PARAMETER :: M66N1MKye = 6823 + INTEGER(IntKi), PARAMETER :: M66N2MKye = 6824 + INTEGER(IntKi), PARAMETER :: M66N3MKye = 6825 + INTEGER(IntKi), PARAMETER :: M66N4MKye = 6826 + INTEGER(IntKi), PARAMETER :: M66N5MKye = 6827 + INTEGER(IntKi), PARAMETER :: M66N6MKye = 6828 + INTEGER(IntKi), PARAMETER :: M66N7MKye = 6829 + INTEGER(IntKi), PARAMETER :: M66N8MKye = 6830 + INTEGER(IntKi), PARAMETER :: M66N9MKye = 6831 + INTEGER(IntKi), PARAMETER :: M67N1MKye = 6832 + INTEGER(IntKi), PARAMETER :: M67N2MKye = 6833 + INTEGER(IntKi), PARAMETER :: M67N3MKye = 6834 + INTEGER(IntKi), PARAMETER :: M67N4MKye = 6835 + INTEGER(IntKi), PARAMETER :: M67N5MKye = 6836 + INTEGER(IntKi), PARAMETER :: M67N6MKye = 6837 + INTEGER(IntKi), PARAMETER :: M67N7MKye = 6838 + INTEGER(IntKi), PARAMETER :: M67N8MKye = 6839 + INTEGER(IntKi), PARAMETER :: M67N9MKye = 6840 + INTEGER(IntKi), PARAMETER :: M68N1MKye = 6841 + INTEGER(IntKi), PARAMETER :: M68N2MKye = 6842 + INTEGER(IntKi), PARAMETER :: M68N3MKye = 6843 + INTEGER(IntKi), PARAMETER :: M68N4MKye = 6844 + INTEGER(IntKi), PARAMETER :: M68N5MKye = 6845 + INTEGER(IntKi), PARAMETER :: M68N6MKye = 6846 + INTEGER(IntKi), PARAMETER :: M68N7MKye = 6847 + INTEGER(IntKi), PARAMETER :: M68N8MKye = 6848 + INTEGER(IntKi), PARAMETER :: M68N9MKye = 6849 + INTEGER(IntKi), PARAMETER :: M69N1MKye = 6850 + INTEGER(IntKi), PARAMETER :: M69N2MKye = 6851 + INTEGER(IntKi), PARAMETER :: M69N3MKye = 6852 + INTEGER(IntKi), PARAMETER :: M69N4MKye = 6853 + INTEGER(IntKi), PARAMETER :: M69N5MKye = 6854 + INTEGER(IntKi), PARAMETER :: M69N6MKye = 6855 + INTEGER(IntKi), PARAMETER :: M69N7MKye = 6856 + INTEGER(IntKi), PARAMETER :: M69N8MKye = 6857 + INTEGER(IntKi), PARAMETER :: M69N9MKye = 6858 + INTEGER(IntKi), PARAMETER :: M70N1MKye = 6859 + INTEGER(IntKi), PARAMETER :: M70N2MKye = 6860 + INTEGER(IntKi), PARAMETER :: M70N3MKye = 6861 + INTEGER(IntKi), PARAMETER :: M70N4MKye = 6862 + INTEGER(IntKi), PARAMETER :: M70N5MKye = 6863 + INTEGER(IntKi), PARAMETER :: M70N6MKye = 6864 + INTEGER(IntKi), PARAMETER :: M70N7MKye = 6865 + INTEGER(IntKi), PARAMETER :: M70N8MKye = 6866 + INTEGER(IntKi), PARAMETER :: M70N9MKye = 6867 + INTEGER(IntKi), PARAMETER :: M71N1MKye = 6868 + INTEGER(IntKi), PARAMETER :: M71N2MKye = 6869 + INTEGER(IntKi), PARAMETER :: M71N3MKye = 6870 + INTEGER(IntKi), PARAMETER :: M71N4MKye = 6871 + INTEGER(IntKi), PARAMETER :: M71N5MKye = 6872 + INTEGER(IntKi), PARAMETER :: M71N6MKye = 6873 + INTEGER(IntKi), PARAMETER :: M71N7MKye = 6874 + INTEGER(IntKi), PARAMETER :: M71N8MKye = 6875 + INTEGER(IntKi), PARAMETER :: M71N9MKye = 6876 + INTEGER(IntKi), PARAMETER :: M72N1MKye = 6877 + INTEGER(IntKi), PARAMETER :: M72N2MKye = 6878 + INTEGER(IntKi), PARAMETER :: M72N3MKye = 6879 + INTEGER(IntKi), PARAMETER :: M72N4MKye = 6880 + INTEGER(IntKi), PARAMETER :: M72N5MKye = 6881 + INTEGER(IntKi), PARAMETER :: M72N6MKye = 6882 + INTEGER(IntKi), PARAMETER :: M72N7MKye = 6883 + INTEGER(IntKi), PARAMETER :: M72N8MKye = 6884 + INTEGER(IntKi), PARAMETER :: M72N9MKye = 6885 + INTEGER(IntKi), PARAMETER :: M73N1MKye = 6886 + INTEGER(IntKi), PARAMETER :: M73N2MKye = 6887 + INTEGER(IntKi), PARAMETER :: M73N3MKye = 6888 + INTEGER(IntKi), PARAMETER :: M73N4MKye = 6889 + INTEGER(IntKi), PARAMETER :: M73N5MKye = 6890 + INTEGER(IntKi), PARAMETER :: M73N6MKye = 6891 + INTEGER(IntKi), PARAMETER :: M73N7MKye = 6892 + INTEGER(IntKi), PARAMETER :: M73N8MKye = 6893 + INTEGER(IntKi), PARAMETER :: M73N9MKye = 6894 + INTEGER(IntKi), PARAMETER :: M74N1MKye = 6895 + INTEGER(IntKi), PARAMETER :: M74N2MKye = 6896 + INTEGER(IntKi), PARAMETER :: M74N3MKye = 6897 + INTEGER(IntKi), PARAMETER :: M74N4MKye = 6898 + INTEGER(IntKi), PARAMETER :: M74N5MKye = 6899 + INTEGER(IntKi), PARAMETER :: M74N6MKye = 6900 + INTEGER(IntKi), PARAMETER :: M74N7MKye = 6901 + INTEGER(IntKi), PARAMETER :: M74N8MKye = 6902 + INTEGER(IntKi), PARAMETER :: M74N9MKye = 6903 + INTEGER(IntKi), PARAMETER :: M75N1MKye = 6904 + INTEGER(IntKi), PARAMETER :: M75N2MKye = 6905 + INTEGER(IntKi), PARAMETER :: M75N3MKye = 6906 + INTEGER(IntKi), PARAMETER :: M75N4MKye = 6907 + INTEGER(IntKi), PARAMETER :: M75N5MKye = 6908 + INTEGER(IntKi), PARAMETER :: M75N6MKye = 6909 + INTEGER(IntKi), PARAMETER :: M75N7MKye = 6910 + INTEGER(IntKi), PARAMETER :: M75N8MKye = 6911 + INTEGER(IntKi), PARAMETER :: M75N9MKye = 6912 + INTEGER(IntKi), PARAMETER :: M76N1MKye = 6913 + INTEGER(IntKi), PARAMETER :: M76N2MKye = 6914 + INTEGER(IntKi), PARAMETER :: M76N3MKye = 6915 + INTEGER(IntKi), PARAMETER :: M76N4MKye = 6916 + INTEGER(IntKi), PARAMETER :: M76N5MKye = 6917 + INTEGER(IntKi), PARAMETER :: M76N6MKye = 6918 + INTEGER(IntKi), PARAMETER :: M76N7MKye = 6919 + INTEGER(IntKi), PARAMETER :: M76N8MKye = 6920 + INTEGER(IntKi), PARAMETER :: M76N9MKye = 6921 + INTEGER(IntKi), PARAMETER :: M77N1MKye = 6922 + INTEGER(IntKi), PARAMETER :: M77N2MKye = 6923 + INTEGER(IntKi), PARAMETER :: M77N3MKye = 6924 + INTEGER(IntKi), PARAMETER :: M77N4MKye = 6925 + INTEGER(IntKi), PARAMETER :: M77N5MKye = 6926 + INTEGER(IntKi), PARAMETER :: M77N6MKye = 6927 + INTEGER(IntKi), PARAMETER :: M77N7MKye = 6928 + INTEGER(IntKi), PARAMETER :: M77N8MKye = 6929 + INTEGER(IntKi), PARAMETER :: M77N9MKye = 6930 + INTEGER(IntKi), PARAMETER :: M78N1MKye = 6931 + INTEGER(IntKi), PARAMETER :: M78N2MKye = 6932 + INTEGER(IntKi), PARAMETER :: M78N3MKye = 6933 + INTEGER(IntKi), PARAMETER :: M78N4MKye = 6934 + INTEGER(IntKi), PARAMETER :: M78N5MKye = 6935 + INTEGER(IntKi), PARAMETER :: M78N6MKye = 6936 + INTEGER(IntKi), PARAMETER :: M78N7MKye = 6937 + INTEGER(IntKi), PARAMETER :: M78N8MKye = 6938 + INTEGER(IntKi), PARAMETER :: M78N9MKye = 6939 + INTEGER(IntKi), PARAMETER :: M79N1MKye = 6940 + INTEGER(IntKi), PARAMETER :: M79N2MKye = 6941 + INTEGER(IntKi), PARAMETER :: M79N3MKye = 6942 + INTEGER(IntKi), PARAMETER :: M79N4MKye = 6943 + INTEGER(IntKi), PARAMETER :: M79N5MKye = 6944 + INTEGER(IntKi), PARAMETER :: M79N6MKye = 6945 + INTEGER(IntKi), PARAMETER :: M79N7MKye = 6946 + INTEGER(IntKi), PARAMETER :: M79N8MKye = 6947 + INTEGER(IntKi), PARAMETER :: M79N9MKye = 6948 + INTEGER(IntKi), PARAMETER :: M80N1MKye = 6949 + INTEGER(IntKi), PARAMETER :: M80N2MKye = 6950 + INTEGER(IntKi), PARAMETER :: M80N3MKye = 6951 + INTEGER(IntKi), PARAMETER :: M80N4MKye = 6952 + INTEGER(IntKi), PARAMETER :: M80N5MKye = 6953 + INTEGER(IntKi), PARAMETER :: M80N6MKye = 6954 + INTEGER(IntKi), PARAMETER :: M80N7MKye = 6955 + INTEGER(IntKi), PARAMETER :: M80N8MKye = 6956 + INTEGER(IntKi), PARAMETER :: M80N9MKye = 6957 + INTEGER(IntKi), PARAMETER :: M81N1MKye = 6958 + INTEGER(IntKi), PARAMETER :: M81N2MKye = 6959 + INTEGER(IntKi), PARAMETER :: M81N3MKye = 6960 + INTEGER(IntKi), PARAMETER :: M81N4MKye = 6961 + INTEGER(IntKi), PARAMETER :: M81N5MKye = 6962 + INTEGER(IntKi), PARAMETER :: M81N6MKye = 6963 + INTEGER(IntKi), PARAMETER :: M81N7MKye = 6964 + INTEGER(IntKi), PARAMETER :: M81N8MKye = 6965 + INTEGER(IntKi), PARAMETER :: M81N9MKye = 6966 + INTEGER(IntKi), PARAMETER :: M82N1MKye = 6967 + INTEGER(IntKi), PARAMETER :: M82N2MKye = 6968 + INTEGER(IntKi), PARAMETER :: M82N3MKye = 6969 + INTEGER(IntKi), PARAMETER :: M82N4MKye = 6970 + INTEGER(IntKi), PARAMETER :: M82N5MKye = 6971 + INTEGER(IntKi), PARAMETER :: M82N6MKye = 6972 + INTEGER(IntKi), PARAMETER :: M82N7MKye = 6973 + INTEGER(IntKi), PARAMETER :: M82N8MKye = 6974 + INTEGER(IntKi), PARAMETER :: M82N9MKye = 6975 + INTEGER(IntKi), PARAMETER :: M83N1MKye = 6976 + INTEGER(IntKi), PARAMETER :: M83N2MKye = 6977 + INTEGER(IntKi), PARAMETER :: M83N3MKye = 6978 + INTEGER(IntKi), PARAMETER :: M83N4MKye = 6979 + INTEGER(IntKi), PARAMETER :: M83N5MKye = 6980 + INTEGER(IntKi), PARAMETER :: M83N6MKye = 6981 + INTEGER(IntKi), PARAMETER :: M83N7MKye = 6982 + INTEGER(IntKi), PARAMETER :: M83N8MKye = 6983 + INTEGER(IntKi), PARAMETER :: M83N9MKye = 6984 + INTEGER(IntKi), PARAMETER :: M84N1MKye = 6985 + INTEGER(IntKi), PARAMETER :: M84N2MKye = 6986 + INTEGER(IntKi), PARAMETER :: M84N3MKye = 6987 + INTEGER(IntKi), PARAMETER :: M84N4MKye = 6988 + INTEGER(IntKi), PARAMETER :: M84N5MKye = 6989 + INTEGER(IntKi), PARAMETER :: M84N6MKye = 6990 + INTEGER(IntKi), PARAMETER :: M84N7MKye = 6991 + INTEGER(IntKi), PARAMETER :: M84N8MKye = 6992 + INTEGER(IntKi), PARAMETER :: M84N9MKye = 6993 + INTEGER(IntKi), PARAMETER :: M85N1MKye = 6994 + INTEGER(IntKi), PARAMETER :: M85N2MKye = 6995 + INTEGER(IntKi), PARAMETER :: M85N3MKye = 6996 + INTEGER(IntKi), PARAMETER :: M85N4MKye = 6997 + INTEGER(IntKi), PARAMETER :: M85N5MKye = 6998 + INTEGER(IntKi), PARAMETER :: M85N6MKye = 6999 + INTEGER(IntKi), PARAMETER :: M85N7MKye = 7000 + INTEGER(IntKi), PARAMETER :: M85N8MKye = 7001 + INTEGER(IntKi), PARAMETER :: M85N9MKye = 7002 + INTEGER(IntKi), PARAMETER :: M86N1MKye = 7003 + INTEGER(IntKi), PARAMETER :: M86N2MKye = 7004 + INTEGER(IntKi), PARAMETER :: M86N3MKye = 7005 + INTEGER(IntKi), PARAMETER :: M86N4MKye = 7006 + INTEGER(IntKi), PARAMETER :: M86N5MKye = 7007 + INTEGER(IntKi), PARAMETER :: M86N6MKye = 7008 + INTEGER(IntKi), PARAMETER :: M86N7MKye = 7009 + INTEGER(IntKi), PARAMETER :: M86N8MKye = 7010 + INTEGER(IntKi), PARAMETER :: M86N9MKye = 7011 + INTEGER(IntKi), PARAMETER :: M87N1MKye = 7012 + INTEGER(IntKi), PARAMETER :: M87N2MKye = 7013 + INTEGER(IntKi), PARAMETER :: M87N3MKye = 7014 + INTEGER(IntKi), PARAMETER :: M87N4MKye = 7015 + INTEGER(IntKi), PARAMETER :: M87N5MKye = 7016 + INTEGER(IntKi), PARAMETER :: M87N6MKye = 7017 + INTEGER(IntKi), PARAMETER :: M87N7MKye = 7018 + INTEGER(IntKi), PARAMETER :: M87N8MKye = 7019 + INTEGER(IntKi), PARAMETER :: M87N9MKye = 7020 + INTEGER(IntKi), PARAMETER :: M88N1MKye = 7021 + INTEGER(IntKi), PARAMETER :: M88N2MKye = 7022 + INTEGER(IntKi), PARAMETER :: M88N3MKye = 7023 + INTEGER(IntKi), PARAMETER :: M88N4MKye = 7024 + INTEGER(IntKi), PARAMETER :: M88N5MKye = 7025 + INTEGER(IntKi), PARAMETER :: M88N6MKye = 7026 + INTEGER(IntKi), PARAMETER :: M88N7MKye = 7027 + INTEGER(IntKi), PARAMETER :: M88N8MKye = 7028 + INTEGER(IntKi), PARAMETER :: M88N9MKye = 7029 + INTEGER(IntKi), PARAMETER :: M89N1MKye = 7030 + INTEGER(IntKi), PARAMETER :: M89N2MKye = 7031 + INTEGER(IntKi), PARAMETER :: M89N3MKye = 7032 + INTEGER(IntKi), PARAMETER :: M89N4MKye = 7033 + INTEGER(IntKi), PARAMETER :: M89N5MKye = 7034 + INTEGER(IntKi), PARAMETER :: M89N6MKye = 7035 + INTEGER(IntKi), PARAMETER :: M89N7MKye = 7036 + INTEGER(IntKi), PARAMETER :: M89N8MKye = 7037 + INTEGER(IntKi), PARAMETER :: M89N9MKye = 7038 + INTEGER(IntKi), PARAMETER :: M90N1MKye = 7039 + INTEGER(IntKi), PARAMETER :: M90N2MKye = 7040 + INTEGER(IntKi), PARAMETER :: M90N3MKye = 7041 + INTEGER(IntKi), PARAMETER :: M90N4MKye = 7042 + INTEGER(IntKi), PARAMETER :: M90N5MKye = 7043 + INTEGER(IntKi), PARAMETER :: M90N6MKye = 7044 + INTEGER(IntKi), PARAMETER :: M90N7MKye = 7045 + INTEGER(IntKi), PARAMETER :: M90N8MKye = 7046 + INTEGER(IntKi), PARAMETER :: M90N9MKye = 7047 + INTEGER(IntKi), PARAMETER :: M91N1MKye = 7048 + INTEGER(IntKi), PARAMETER :: M91N2MKye = 7049 + INTEGER(IntKi), PARAMETER :: M91N3MKye = 7050 + INTEGER(IntKi), PARAMETER :: M91N4MKye = 7051 + INTEGER(IntKi), PARAMETER :: M91N5MKye = 7052 + INTEGER(IntKi), PARAMETER :: M91N6MKye = 7053 + INTEGER(IntKi), PARAMETER :: M91N7MKye = 7054 + INTEGER(IntKi), PARAMETER :: M91N8MKye = 7055 + INTEGER(IntKi), PARAMETER :: M91N9MKye = 7056 + INTEGER(IntKi), PARAMETER :: M92N1MKye = 7057 + INTEGER(IntKi), PARAMETER :: M92N2MKye = 7058 + INTEGER(IntKi), PARAMETER :: M92N3MKye = 7059 + INTEGER(IntKi), PARAMETER :: M92N4MKye = 7060 + INTEGER(IntKi), PARAMETER :: M92N5MKye = 7061 + INTEGER(IntKi), PARAMETER :: M92N6MKye = 7062 + INTEGER(IntKi), PARAMETER :: M92N7MKye = 7063 + INTEGER(IntKi), PARAMETER :: M92N8MKye = 7064 + INTEGER(IntKi), PARAMETER :: M92N9MKye = 7065 + INTEGER(IntKi), PARAMETER :: M93N1MKye = 7066 + INTEGER(IntKi), PARAMETER :: M93N2MKye = 7067 + INTEGER(IntKi), PARAMETER :: M93N3MKye = 7068 + INTEGER(IntKi), PARAMETER :: M93N4MKye = 7069 + INTEGER(IntKi), PARAMETER :: M93N5MKye = 7070 + INTEGER(IntKi), PARAMETER :: M93N6MKye = 7071 + INTEGER(IntKi), PARAMETER :: M93N7MKye = 7072 + INTEGER(IntKi), PARAMETER :: M93N8MKye = 7073 + INTEGER(IntKi), PARAMETER :: M93N9MKye = 7074 + INTEGER(IntKi), PARAMETER :: M94N1MKye = 7075 + INTEGER(IntKi), PARAMETER :: M94N2MKye = 7076 + INTEGER(IntKi), PARAMETER :: M94N3MKye = 7077 + INTEGER(IntKi), PARAMETER :: M94N4MKye = 7078 + INTEGER(IntKi), PARAMETER :: M94N5MKye = 7079 + INTEGER(IntKi), PARAMETER :: M94N6MKye = 7080 + INTEGER(IntKi), PARAMETER :: M94N7MKye = 7081 + INTEGER(IntKi), PARAMETER :: M94N8MKye = 7082 + INTEGER(IntKi), PARAMETER :: M94N9MKye = 7083 + INTEGER(IntKi), PARAMETER :: M95N1MKye = 7084 + INTEGER(IntKi), PARAMETER :: M95N2MKye = 7085 + INTEGER(IntKi), PARAMETER :: M95N3MKye = 7086 + INTEGER(IntKi), PARAMETER :: M95N4MKye = 7087 + INTEGER(IntKi), PARAMETER :: M95N5MKye = 7088 + INTEGER(IntKi), PARAMETER :: M95N6MKye = 7089 + INTEGER(IntKi), PARAMETER :: M95N7MKye = 7090 + INTEGER(IntKi), PARAMETER :: M95N8MKye = 7091 + INTEGER(IntKi), PARAMETER :: M95N9MKye = 7092 + INTEGER(IntKi), PARAMETER :: M96N1MKye = 7093 + INTEGER(IntKi), PARAMETER :: M96N2MKye = 7094 + INTEGER(IntKi), PARAMETER :: M96N3MKye = 7095 + INTEGER(IntKi), PARAMETER :: M96N4MKye = 7096 + INTEGER(IntKi), PARAMETER :: M96N5MKye = 7097 + INTEGER(IntKi), PARAMETER :: M96N6MKye = 7098 + INTEGER(IntKi), PARAMETER :: M96N7MKye = 7099 + INTEGER(IntKi), PARAMETER :: M96N8MKye = 7100 + INTEGER(IntKi), PARAMETER :: M96N9MKye = 7101 + INTEGER(IntKi), PARAMETER :: M97N1MKye = 7102 + INTEGER(IntKi), PARAMETER :: M97N2MKye = 7103 + INTEGER(IntKi), PARAMETER :: M97N3MKye = 7104 + INTEGER(IntKi), PARAMETER :: M97N4MKye = 7105 + INTEGER(IntKi), PARAMETER :: M97N5MKye = 7106 + INTEGER(IntKi), PARAMETER :: M97N6MKye = 7107 + INTEGER(IntKi), PARAMETER :: M97N7MKye = 7108 + INTEGER(IntKi), PARAMETER :: M97N8MKye = 7109 + INTEGER(IntKi), PARAMETER :: M97N9MKye = 7110 + INTEGER(IntKi), PARAMETER :: M98N1MKye = 7111 + INTEGER(IntKi), PARAMETER :: M98N2MKye = 7112 + INTEGER(IntKi), PARAMETER :: M98N3MKye = 7113 + INTEGER(IntKi), PARAMETER :: M98N4MKye = 7114 + INTEGER(IntKi), PARAMETER :: M98N5MKye = 7115 + INTEGER(IntKi), PARAMETER :: M98N6MKye = 7116 + INTEGER(IntKi), PARAMETER :: M98N7MKye = 7117 + INTEGER(IntKi), PARAMETER :: M98N8MKye = 7118 + INTEGER(IntKi), PARAMETER :: M98N9MKye = 7119 + INTEGER(IntKi), PARAMETER :: M99N1MKye = 7120 + INTEGER(IntKi), PARAMETER :: M99N2MKye = 7121 + INTEGER(IntKi), PARAMETER :: M99N3MKye = 7122 + INTEGER(IntKi), PARAMETER :: M99N4MKye = 7123 + INTEGER(IntKi), PARAMETER :: M99N5MKye = 7124 + INTEGER(IntKi), PARAMETER :: M99N6MKye = 7125 + INTEGER(IntKi), PARAMETER :: M99N7MKye = 7126 + INTEGER(IntKi), PARAMETER :: M99N8MKye = 7127 + INTEGER(IntKi), PARAMETER :: M99N9MKye = 7128 + INTEGER(IntKi), PARAMETER :: M01N1MKze = 7129 + INTEGER(IntKi), PARAMETER :: M01N2MKze = 7130 + INTEGER(IntKi), PARAMETER :: M01N3MKze = 7131 + INTEGER(IntKi), PARAMETER :: M01N4MKze = 7132 + INTEGER(IntKi), PARAMETER :: M01N5MKze = 7133 + INTEGER(IntKi), PARAMETER :: M01N6MKze = 7134 + INTEGER(IntKi), PARAMETER :: M01N7MKze = 7135 + INTEGER(IntKi), PARAMETER :: M01N8MKze = 7136 + INTEGER(IntKi), PARAMETER :: M01N9MKze = 7137 + INTEGER(IntKi), PARAMETER :: M02N1MKze = 7138 + INTEGER(IntKi), PARAMETER :: M02N2MKze = 7139 + INTEGER(IntKi), PARAMETER :: M02N3MKze = 7140 + INTEGER(IntKi), PARAMETER :: M02N4MKze = 7141 + INTEGER(IntKi), PARAMETER :: M02N5MKze = 7142 + INTEGER(IntKi), PARAMETER :: M02N6MKze = 7143 + INTEGER(IntKi), PARAMETER :: M02N7MKze = 7144 + INTEGER(IntKi), PARAMETER :: M02N8MKze = 7145 + INTEGER(IntKi), PARAMETER :: M02N9MKze = 7146 + INTEGER(IntKi), PARAMETER :: M03N1MKze = 7147 + INTEGER(IntKi), PARAMETER :: M03N2MKze = 7148 + INTEGER(IntKi), PARAMETER :: M03N3MKze = 7149 + INTEGER(IntKi), PARAMETER :: M03N4MKze = 7150 + INTEGER(IntKi), PARAMETER :: M03N5MKze = 7151 + INTEGER(IntKi), PARAMETER :: M03N6MKze = 7152 + INTEGER(IntKi), PARAMETER :: M03N7MKze = 7153 + INTEGER(IntKi), PARAMETER :: M03N8MKze = 7154 + INTEGER(IntKi), PARAMETER :: M03N9MKze = 7155 + INTEGER(IntKi), PARAMETER :: M04N1MKze = 7156 + INTEGER(IntKi), PARAMETER :: M04N2MKze = 7157 + INTEGER(IntKi), PARAMETER :: M04N3MKze = 7158 + INTEGER(IntKi), PARAMETER :: M04N4MKze = 7159 + INTEGER(IntKi), PARAMETER :: M04N5MKze = 7160 + INTEGER(IntKi), PARAMETER :: M04N6MKze = 7161 + INTEGER(IntKi), PARAMETER :: M04N7MKze = 7162 + INTEGER(IntKi), PARAMETER :: M04N8MKze = 7163 + INTEGER(IntKi), PARAMETER :: M04N9MKze = 7164 + INTEGER(IntKi), PARAMETER :: M05N1MKze = 7165 + INTEGER(IntKi), PARAMETER :: M05N2MKze = 7166 + INTEGER(IntKi), PARAMETER :: M05N3MKze = 7167 + INTEGER(IntKi), PARAMETER :: M05N4MKze = 7168 + INTEGER(IntKi), PARAMETER :: M05N5MKze = 7169 + INTEGER(IntKi), PARAMETER :: M05N6MKze = 7170 + INTEGER(IntKi), PARAMETER :: M05N7MKze = 7171 + INTEGER(IntKi), PARAMETER :: M05N8MKze = 7172 + INTEGER(IntKi), PARAMETER :: M05N9MKze = 7173 + INTEGER(IntKi), PARAMETER :: M06N1MKze = 7174 + INTEGER(IntKi), PARAMETER :: M06N2MKze = 7175 + INTEGER(IntKi), PARAMETER :: M06N3MKze = 7176 + INTEGER(IntKi), PARAMETER :: M06N4MKze = 7177 + INTEGER(IntKi), PARAMETER :: M06N5MKze = 7178 + INTEGER(IntKi), PARAMETER :: M06N6MKze = 7179 + INTEGER(IntKi), PARAMETER :: M06N7MKze = 7180 + INTEGER(IntKi), PARAMETER :: M06N8MKze = 7181 + INTEGER(IntKi), PARAMETER :: M06N9MKze = 7182 + INTEGER(IntKi), PARAMETER :: M07N1MKze = 7183 + INTEGER(IntKi), PARAMETER :: M07N2MKze = 7184 + INTEGER(IntKi), PARAMETER :: M07N3MKze = 7185 + INTEGER(IntKi), PARAMETER :: M07N4MKze = 7186 + INTEGER(IntKi), PARAMETER :: M07N5MKze = 7187 + INTEGER(IntKi), PARAMETER :: M07N6MKze = 7188 + INTEGER(IntKi), PARAMETER :: M07N7MKze = 7189 + INTEGER(IntKi), PARAMETER :: M07N8MKze = 7190 + INTEGER(IntKi), PARAMETER :: M07N9MKze = 7191 + INTEGER(IntKi), PARAMETER :: M08N1MKze = 7192 + INTEGER(IntKi), PARAMETER :: M08N2MKze = 7193 + INTEGER(IntKi), PARAMETER :: M08N3MKze = 7194 + INTEGER(IntKi), PARAMETER :: M08N4MKze = 7195 + INTEGER(IntKi), PARAMETER :: M08N5MKze = 7196 + INTEGER(IntKi), PARAMETER :: M08N6MKze = 7197 + INTEGER(IntKi), PARAMETER :: M08N7MKze = 7198 + INTEGER(IntKi), PARAMETER :: M08N8MKze = 7199 + INTEGER(IntKi), PARAMETER :: M08N9MKze = 7200 + INTEGER(IntKi), PARAMETER :: M09N1MKze = 7201 + INTEGER(IntKi), PARAMETER :: M09N2MKze = 7202 + INTEGER(IntKi), PARAMETER :: M09N3MKze = 7203 + INTEGER(IntKi), PARAMETER :: M09N4MKze = 7204 + INTEGER(IntKi), PARAMETER :: M09N5MKze = 7205 + INTEGER(IntKi), PARAMETER :: M09N6MKze = 7206 + INTEGER(IntKi), PARAMETER :: M09N7MKze = 7207 + INTEGER(IntKi), PARAMETER :: M09N8MKze = 7208 + INTEGER(IntKi), PARAMETER :: M09N9MKze = 7209 + INTEGER(IntKi), PARAMETER :: M10N1MKze = 7210 + INTEGER(IntKi), PARAMETER :: M10N2MKze = 7211 + INTEGER(IntKi), PARAMETER :: M10N3MKze = 7212 + INTEGER(IntKi), PARAMETER :: M10N4MKze = 7213 + INTEGER(IntKi), PARAMETER :: M10N5MKze = 7214 + INTEGER(IntKi), PARAMETER :: M10N6MKze = 7215 + INTEGER(IntKi), PARAMETER :: M10N7MKze = 7216 + INTEGER(IntKi), PARAMETER :: M10N8MKze = 7217 + INTEGER(IntKi), PARAMETER :: M10N9MKze = 7218 + INTEGER(IntKi), PARAMETER :: M11N1MKze = 7219 + INTEGER(IntKi), PARAMETER :: M11N2MKze = 7220 + INTEGER(IntKi), PARAMETER :: M11N3MKze = 7221 + INTEGER(IntKi), PARAMETER :: M11N4MKze = 7222 + INTEGER(IntKi), PARAMETER :: M11N5MKze = 7223 + INTEGER(IntKi), PARAMETER :: M11N6MKze = 7224 + INTEGER(IntKi), PARAMETER :: M11N7MKze = 7225 + INTEGER(IntKi), PARAMETER :: M11N8MKze = 7226 + INTEGER(IntKi), PARAMETER :: M11N9MKze = 7227 + INTEGER(IntKi), PARAMETER :: M12N1MKze = 7228 + INTEGER(IntKi), PARAMETER :: M12N2MKze = 7229 + INTEGER(IntKi), PARAMETER :: M12N3MKze = 7230 + INTEGER(IntKi), PARAMETER :: M12N4MKze = 7231 + INTEGER(IntKi), PARAMETER :: M12N5MKze = 7232 + INTEGER(IntKi), PARAMETER :: M12N6MKze = 7233 + INTEGER(IntKi), PARAMETER :: M12N7MKze = 7234 + INTEGER(IntKi), PARAMETER :: M12N8MKze = 7235 + INTEGER(IntKi), PARAMETER :: M12N9MKze = 7236 + INTEGER(IntKi), PARAMETER :: M13N1MKze = 7237 + INTEGER(IntKi), PARAMETER :: M13N2MKze = 7238 + INTEGER(IntKi), PARAMETER :: M13N3MKze = 7239 + INTEGER(IntKi), PARAMETER :: M13N4MKze = 7240 + INTEGER(IntKi), PARAMETER :: M13N5MKze = 7241 + INTEGER(IntKi), PARAMETER :: M13N6MKze = 7242 + INTEGER(IntKi), PARAMETER :: M13N7MKze = 7243 + INTEGER(IntKi), PARAMETER :: M13N8MKze = 7244 + INTEGER(IntKi), PARAMETER :: M13N9MKze = 7245 + INTEGER(IntKi), PARAMETER :: M14N1MKze = 7246 + INTEGER(IntKi), PARAMETER :: M14N2MKze = 7247 + INTEGER(IntKi), PARAMETER :: M14N3MKze = 7248 + INTEGER(IntKi), PARAMETER :: M14N4MKze = 7249 + INTEGER(IntKi), PARAMETER :: M14N5MKze = 7250 + INTEGER(IntKi), PARAMETER :: M14N6MKze = 7251 + INTEGER(IntKi), PARAMETER :: M14N7MKze = 7252 + INTEGER(IntKi), PARAMETER :: M14N8MKze = 7253 + INTEGER(IntKi), PARAMETER :: M14N9MKze = 7254 + INTEGER(IntKi), PARAMETER :: M15N1MKze = 7255 + INTEGER(IntKi), PARAMETER :: M15N2MKze = 7256 + INTEGER(IntKi), PARAMETER :: M15N3MKze = 7257 + INTEGER(IntKi), PARAMETER :: M15N4MKze = 7258 + INTEGER(IntKi), PARAMETER :: M15N5MKze = 7259 + INTEGER(IntKi), PARAMETER :: M15N6MKze = 7260 + INTEGER(IntKi), PARAMETER :: M15N7MKze = 7261 + INTEGER(IntKi), PARAMETER :: M15N8MKze = 7262 + INTEGER(IntKi), PARAMETER :: M15N9MKze = 7263 + INTEGER(IntKi), PARAMETER :: M16N1MKze = 7264 + INTEGER(IntKi), PARAMETER :: M16N2MKze = 7265 + INTEGER(IntKi), PARAMETER :: M16N3MKze = 7266 + INTEGER(IntKi), PARAMETER :: M16N4MKze = 7267 + INTEGER(IntKi), PARAMETER :: M16N5MKze = 7268 + INTEGER(IntKi), PARAMETER :: M16N6MKze = 7269 + INTEGER(IntKi), PARAMETER :: M16N7MKze = 7270 + INTEGER(IntKi), PARAMETER :: M16N8MKze = 7271 + INTEGER(IntKi), PARAMETER :: M16N9MKze = 7272 + INTEGER(IntKi), PARAMETER :: M17N1MKze = 7273 + INTEGER(IntKi), PARAMETER :: M17N2MKze = 7274 + INTEGER(IntKi), PARAMETER :: M17N3MKze = 7275 + INTEGER(IntKi), PARAMETER :: M17N4MKze = 7276 + INTEGER(IntKi), PARAMETER :: M17N5MKze = 7277 + INTEGER(IntKi), PARAMETER :: M17N6MKze = 7278 + INTEGER(IntKi), PARAMETER :: M17N7MKze = 7279 + INTEGER(IntKi), PARAMETER :: M17N8MKze = 7280 + INTEGER(IntKi), PARAMETER :: M17N9MKze = 7281 + INTEGER(IntKi), PARAMETER :: M18N1MKze = 7282 + INTEGER(IntKi), PARAMETER :: M18N2MKze = 7283 + INTEGER(IntKi), PARAMETER :: M18N3MKze = 7284 + INTEGER(IntKi), PARAMETER :: M18N4MKze = 7285 + INTEGER(IntKi), PARAMETER :: M18N5MKze = 7286 + INTEGER(IntKi), PARAMETER :: M18N6MKze = 7287 + INTEGER(IntKi), PARAMETER :: M18N7MKze = 7288 + INTEGER(IntKi), PARAMETER :: M18N8MKze = 7289 + INTEGER(IntKi), PARAMETER :: M18N9MKze = 7290 + INTEGER(IntKi), PARAMETER :: M19N1MKze = 7291 + INTEGER(IntKi), PARAMETER :: M19N2MKze = 7292 + INTEGER(IntKi), PARAMETER :: M19N3MKze = 7293 + INTEGER(IntKi), PARAMETER :: M19N4MKze = 7294 + INTEGER(IntKi), PARAMETER :: M19N5MKze = 7295 + INTEGER(IntKi), PARAMETER :: M19N6MKze = 7296 + INTEGER(IntKi), PARAMETER :: M19N7MKze = 7297 + INTEGER(IntKi), PARAMETER :: M19N8MKze = 7298 + INTEGER(IntKi), PARAMETER :: M19N9MKze = 7299 + INTEGER(IntKi), PARAMETER :: M20N1MKze = 7300 + INTEGER(IntKi), PARAMETER :: M20N2MKze = 7301 + INTEGER(IntKi), PARAMETER :: M20N3MKze = 7302 + INTEGER(IntKi), PARAMETER :: M20N4MKze = 7303 + INTEGER(IntKi), PARAMETER :: M20N5MKze = 7304 + INTEGER(IntKi), PARAMETER :: M20N6MKze = 7305 + INTEGER(IntKi), PARAMETER :: M20N7MKze = 7306 + INTEGER(IntKi), PARAMETER :: M20N8MKze = 7307 + INTEGER(IntKi), PARAMETER :: M20N9MKze = 7308 + INTEGER(IntKi), PARAMETER :: M21N1MKze = 7309 + INTEGER(IntKi), PARAMETER :: M21N2MKze = 7310 + INTEGER(IntKi), PARAMETER :: M21N3MKze = 7311 + INTEGER(IntKi), PARAMETER :: M21N4MKze = 7312 + INTEGER(IntKi), PARAMETER :: M21N5MKze = 7313 + INTEGER(IntKi), PARAMETER :: M21N6MKze = 7314 + INTEGER(IntKi), PARAMETER :: M21N7MKze = 7315 + INTEGER(IntKi), PARAMETER :: M21N8MKze = 7316 + INTEGER(IntKi), PARAMETER :: M21N9MKze = 7317 + INTEGER(IntKi), PARAMETER :: M22N1MKze = 7318 + INTEGER(IntKi), PARAMETER :: M22N2MKze = 7319 + INTEGER(IntKi), PARAMETER :: M22N3MKze = 7320 + INTEGER(IntKi), PARAMETER :: M22N4MKze = 7321 + INTEGER(IntKi), PARAMETER :: M22N5MKze = 7322 + INTEGER(IntKi), PARAMETER :: M22N6MKze = 7323 + INTEGER(IntKi), PARAMETER :: M22N7MKze = 7324 + INTEGER(IntKi), PARAMETER :: M22N8MKze = 7325 + INTEGER(IntKi), PARAMETER :: M22N9MKze = 7326 + INTEGER(IntKi), PARAMETER :: M23N1MKze = 7327 + INTEGER(IntKi), PARAMETER :: M23N2MKze = 7328 + INTEGER(IntKi), PARAMETER :: M23N3MKze = 7329 + INTEGER(IntKi), PARAMETER :: M23N4MKze = 7330 + INTEGER(IntKi), PARAMETER :: M23N5MKze = 7331 + INTEGER(IntKi), PARAMETER :: M23N6MKze = 7332 + INTEGER(IntKi), PARAMETER :: M23N7MKze = 7333 + INTEGER(IntKi), PARAMETER :: M23N8MKze = 7334 + INTEGER(IntKi), PARAMETER :: M23N9MKze = 7335 + INTEGER(IntKi), PARAMETER :: M24N1MKze = 7336 + INTEGER(IntKi), PARAMETER :: M24N2MKze = 7337 + INTEGER(IntKi), PARAMETER :: M24N3MKze = 7338 + INTEGER(IntKi), PARAMETER :: M24N4MKze = 7339 + INTEGER(IntKi), PARAMETER :: M24N5MKze = 7340 + INTEGER(IntKi), PARAMETER :: M24N6MKze = 7341 + INTEGER(IntKi), PARAMETER :: M24N7MKze = 7342 + INTEGER(IntKi), PARAMETER :: M24N8MKze = 7343 + INTEGER(IntKi), PARAMETER :: M24N9MKze = 7344 + INTEGER(IntKi), PARAMETER :: M25N1MKze = 7345 + INTEGER(IntKi), PARAMETER :: M25N2MKze = 7346 + INTEGER(IntKi), PARAMETER :: M25N3MKze = 7347 + INTEGER(IntKi), PARAMETER :: M25N4MKze = 7348 + INTEGER(IntKi), PARAMETER :: M25N5MKze = 7349 + INTEGER(IntKi), PARAMETER :: M25N6MKze = 7350 + INTEGER(IntKi), PARAMETER :: M25N7MKze = 7351 + INTEGER(IntKi), PARAMETER :: M25N8MKze = 7352 + INTEGER(IntKi), PARAMETER :: M25N9MKze = 7353 + INTEGER(IntKi), PARAMETER :: M26N1MKze = 7354 + INTEGER(IntKi), PARAMETER :: M26N2MKze = 7355 + INTEGER(IntKi), PARAMETER :: M26N3MKze = 7356 + INTEGER(IntKi), PARAMETER :: M26N4MKze = 7357 + INTEGER(IntKi), PARAMETER :: M26N5MKze = 7358 + INTEGER(IntKi), PARAMETER :: M26N6MKze = 7359 + INTEGER(IntKi), PARAMETER :: M26N7MKze = 7360 + INTEGER(IntKi), PARAMETER :: M26N8MKze = 7361 + INTEGER(IntKi), PARAMETER :: M26N9MKze = 7362 + INTEGER(IntKi), PARAMETER :: M27N1MKze = 7363 + INTEGER(IntKi), PARAMETER :: M27N2MKze = 7364 + INTEGER(IntKi), PARAMETER :: M27N3MKze = 7365 + INTEGER(IntKi), PARAMETER :: M27N4MKze = 7366 + INTEGER(IntKi), PARAMETER :: M27N5MKze = 7367 + INTEGER(IntKi), PARAMETER :: M27N6MKze = 7368 + INTEGER(IntKi), PARAMETER :: M27N7MKze = 7369 + INTEGER(IntKi), PARAMETER :: M27N8MKze = 7370 + INTEGER(IntKi), PARAMETER :: M27N9MKze = 7371 + INTEGER(IntKi), PARAMETER :: M28N1MKze = 7372 + INTEGER(IntKi), PARAMETER :: M28N2MKze = 7373 + INTEGER(IntKi), PARAMETER :: M28N3MKze = 7374 + INTEGER(IntKi), PARAMETER :: M28N4MKze = 7375 + INTEGER(IntKi), PARAMETER :: M28N5MKze = 7376 + INTEGER(IntKi), PARAMETER :: M28N6MKze = 7377 + INTEGER(IntKi), PARAMETER :: M28N7MKze = 7378 + INTEGER(IntKi), PARAMETER :: M28N8MKze = 7379 + INTEGER(IntKi), PARAMETER :: M28N9MKze = 7380 + INTEGER(IntKi), PARAMETER :: M29N1MKze = 7381 + INTEGER(IntKi), PARAMETER :: M29N2MKze = 7382 + INTEGER(IntKi), PARAMETER :: M29N3MKze = 7383 + INTEGER(IntKi), PARAMETER :: M29N4MKze = 7384 + INTEGER(IntKi), PARAMETER :: M29N5MKze = 7385 + INTEGER(IntKi), PARAMETER :: M29N6MKze = 7386 + INTEGER(IntKi), PARAMETER :: M29N7MKze = 7387 + INTEGER(IntKi), PARAMETER :: M29N8MKze = 7388 + INTEGER(IntKi), PARAMETER :: M29N9MKze = 7389 + INTEGER(IntKi), PARAMETER :: M30N1MKze = 7390 + INTEGER(IntKi), PARAMETER :: M30N2MKze = 7391 + INTEGER(IntKi), PARAMETER :: M30N3MKze = 7392 + INTEGER(IntKi), PARAMETER :: M30N4MKze = 7393 + INTEGER(IntKi), PARAMETER :: M30N5MKze = 7394 + INTEGER(IntKi), PARAMETER :: M30N6MKze = 7395 + INTEGER(IntKi), PARAMETER :: M30N7MKze = 7396 + INTEGER(IntKi), PARAMETER :: M30N8MKze = 7397 + INTEGER(IntKi), PARAMETER :: M30N9MKze = 7398 + INTEGER(IntKi), PARAMETER :: M31N1MKze = 7399 + INTEGER(IntKi), PARAMETER :: M31N2MKze = 7400 + INTEGER(IntKi), PARAMETER :: M31N3MKze = 7401 + INTEGER(IntKi), PARAMETER :: M31N4MKze = 7402 + INTEGER(IntKi), PARAMETER :: M31N5MKze = 7403 + INTEGER(IntKi), PARAMETER :: M31N6MKze = 7404 + INTEGER(IntKi), PARAMETER :: M31N7MKze = 7405 + INTEGER(IntKi), PARAMETER :: M31N8MKze = 7406 + INTEGER(IntKi), PARAMETER :: M31N9MKze = 7407 + INTEGER(IntKi), PARAMETER :: M32N1MKze = 7408 + INTEGER(IntKi), PARAMETER :: M32N2MKze = 7409 + INTEGER(IntKi), PARAMETER :: M32N3MKze = 7410 + INTEGER(IntKi), PARAMETER :: M32N4MKze = 7411 + INTEGER(IntKi), PARAMETER :: M32N5MKze = 7412 + INTEGER(IntKi), PARAMETER :: M32N6MKze = 7413 + INTEGER(IntKi), PARAMETER :: M32N7MKze = 7414 + INTEGER(IntKi), PARAMETER :: M32N8MKze = 7415 + INTEGER(IntKi), PARAMETER :: M32N9MKze = 7416 + INTEGER(IntKi), PARAMETER :: M33N1MKze = 7417 + INTEGER(IntKi), PARAMETER :: M33N2MKze = 7418 + INTEGER(IntKi), PARAMETER :: M33N3MKze = 7419 + INTEGER(IntKi), PARAMETER :: M33N4MKze = 7420 + INTEGER(IntKi), PARAMETER :: M33N5MKze = 7421 + INTEGER(IntKi), PARAMETER :: M33N6MKze = 7422 + INTEGER(IntKi), PARAMETER :: M33N7MKze = 7423 + INTEGER(IntKi), PARAMETER :: M33N8MKze = 7424 + INTEGER(IntKi), PARAMETER :: M33N9MKze = 7425 + INTEGER(IntKi), PARAMETER :: M34N1MKze = 7426 + INTEGER(IntKi), PARAMETER :: M34N2MKze = 7427 + INTEGER(IntKi), PARAMETER :: M34N3MKze = 7428 + INTEGER(IntKi), PARAMETER :: M34N4MKze = 7429 + INTEGER(IntKi), PARAMETER :: M34N5MKze = 7430 + INTEGER(IntKi), PARAMETER :: M34N6MKze = 7431 + INTEGER(IntKi), PARAMETER :: M34N7MKze = 7432 + INTEGER(IntKi), PARAMETER :: M34N8MKze = 7433 + INTEGER(IntKi), PARAMETER :: M34N9MKze = 7434 + INTEGER(IntKi), PARAMETER :: M35N1MKze = 7435 + INTEGER(IntKi), PARAMETER :: M35N2MKze = 7436 + INTEGER(IntKi), PARAMETER :: M35N3MKze = 7437 + INTEGER(IntKi), PARAMETER :: M35N4MKze = 7438 + INTEGER(IntKi), PARAMETER :: M35N5MKze = 7439 + INTEGER(IntKi), PARAMETER :: M35N6MKze = 7440 + INTEGER(IntKi), PARAMETER :: M35N7MKze = 7441 + INTEGER(IntKi), PARAMETER :: M35N8MKze = 7442 + INTEGER(IntKi), PARAMETER :: M35N9MKze = 7443 + INTEGER(IntKi), PARAMETER :: M36N1MKze = 7444 + INTEGER(IntKi), PARAMETER :: M36N2MKze = 7445 + INTEGER(IntKi), PARAMETER :: M36N3MKze = 7446 + INTEGER(IntKi), PARAMETER :: M36N4MKze = 7447 + INTEGER(IntKi), PARAMETER :: M36N5MKze = 7448 + INTEGER(IntKi), PARAMETER :: M36N6MKze = 7449 + INTEGER(IntKi), PARAMETER :: M36N7MKze = 7450 + INTEGER(IntKi), PARAMETER :: M36N8MKze = 7451 + INTEGER(IntKi), PARAMETER :: M36N9MKze = 7452 + INTEGER(IntKi), PARAMETER :: M37N1MKze = 7453 + INTEGER(IntKi), PARAMETER :: M37N2MKze = 7454 + INTEGER(IntKi), PARAMETER :: M37N3MKze = 7455 + INTEGER(IntKi), PARAMETER :: M37N4MKze = 7456 + INTEGER(IntKi), PARAMETER :: M37N5MKze = 7457 + INTEGER(IntKi), PARAMETER :: M37N6MKze = 7458 + INTEGER(IntKi), PARAMETER :: M37N7MKze = 7459 + INTEGER(IntKi), PARAMETER :: M37N8MKze = 7460 + INTEGER(IntKi), PARAMETER :: M37N9MKze = 7461 + INTEGER(IntKi), PARAMETER :: M38N1MKze = 7462 + INTEGER(IntKi), PARAMETER :: M38N2MKze = 7463 + INTEGER(IntKi), PARAMETER :: M38N3MKze = 7464 + INTEGER(IntKi), PARAMETER :: M38N4MKze = 7465 + INTEGER(IntKi), PARAMETER :: M38N5MKze = 7466 + INTEGER(IntKi), PARAMETER :: M38N6MKze = 7467 + INTEGER(IntKi), PARAMETER :: M38N7MKze = 7468 + INTEGER(IntKi), PARAMETER :: M38N8MKze = 7469 + INTEGER(IntKi), PARAMETER :: M38N9MKze = 7470 + INTEGER(IntKi), PARAMETER :: M39N1MKze = 7471 + INTEGER(IntKi), PARAMETER :: M39N2MKze = 7472 + INTEGER(IntKi), PARAMETER :: M39N3MKze = 7473 + INTEGER(IntKi), PARAMETER :: M39N4MKze = 7474 + INTEGER(IntKi), PARAMETER :: M39N5MKze = 7475 + INTEGER(IntKi), PARAMETER :: M39N6MKze = 7476 + INTEGER(IntKi), PARAMETER :: M39N7MKze = 7477 + INTEGER(IntKi), PARAMETER :: M39N8MKze = 7478 + INTEGER(IntKi), PARAMETER :: M39N9MKze = 7479 + INTEGER(IntKi), PARAMETER :: M40N1MKze = 7480 + INTEGER(IntKi), PARAMETER :: M40N2MKze = 7481 + INTEGER(IntKi), PARAMETER :: M40N3MKze = 7482 + INTEGER(IntKi), PARAMETER :: M40N4MKze = 7483 + INTEGER(IntKi), PARAMETER :: M40N5MKze = 7484 + INTEGER(IntKi), PARAMETER :: M40N6MKze = 7485 + INTEGER(IntKi), PARAMETER :: M40N7MKze = 7486 + INTEGER(IntKi), PARAMETER :: M40N8MKze = 7487 + INTEGER(IntKi), PARAMETER :: M40N9MKze = 7488 + INTEGER(IntKi), PARAMETER :: M41N1MKze = 7489 + INTEGER(IntKi), PARAMETER :: M41N2MKze = 7490 + INTEGER(IntKi), PARAMETER :: M41N3MKze = 7491 + INTEGER(IntKi), PARAMETER :: M41N4MKze = 7492 + INTEGER(IntKi), PARAMETER :: M41N5MKze = 7493 + INTEGER(IntKi), PARAMETER :: M41N6MKze = 7494 + INTEGER(IntKi), PARAMETER :: M41N7MKze = 7495 + INTEGER(IntKi), PARAMETER :: M41N8MKze = 7496 + INTEGER(IntKi), PARAMETER :: M41N9MKze = 7497 + INTEGER(IntKi), PARAMETER :: M42N1MKze = 7498 + INTEGER(IntKi), PARAMETER :: M42N2MKze = 7499 + INTEGER(IntKi), PARAMETER :: M42N3MKze = 7500 + INTEGER(IntKi), PARAMETER :: M42N4MKze = 7501 + INTEGER(IntKi), PARAMETER :: M42N5MKze = 7502 + INTEGER(IntKi), PARAMETER :: M42N6MKze = 7503 + INTEGER(IntKi), PARAMETER :: M42N7MKze = 7504 + INTEGER(IntKi), PARAMETER :: M42N8MKze = 7505 + INTEGER(IntKi), PARAMETER :: M42N9MKze = 7506 + INTEGER(IntKi), PARAMETER :: M43N1MKze = 7507 + INTEGER(IntKi), PARAMETER :: M43N2MKze = 7508 + INTEGER(IntKi), PARAMETER :: M43N3MKze = 7509 + INTEGER(IntKi), PARAMETER :: M43N4MKze = 7510 + INTEGER(IntKi), PARAMETER :: M43N5MKze = 7511 + INTEGER(IntKi), PARAMETER :: M43N6MKze = 7512 + INTEGER(IntKi), PARAMETER :: M43N7MKze = 7513 + INTEGER(IntKi), PARAMETER :: M43N8MKze = 7514 + INTEGER(IntKi), PARAMETER :: M43N9MKze = 7515 + INTEGER(IntKi), PARAMETER :: M44N1MKze = 7516 + INTEGER(IntKi), PARAMETER :: M44N2MKze = 7517 + INTEGER(IntKi), PARAMETER :: M44N3MKze = 7518 + INTEGER(IntKi), PARAMETER :: M44N4MKze = 7519 + INTEGER(IntKi), PARAMETER :: M44N5MKze = 7520 + INTEGER(IntKi), PARAMETER :: M44N6MKze = 7521 + INTEGER(IntKi), PARAMETER :: M44N7MKze = 7522 + INTEGER(IntKi), PARAMETER :: M44N8MKze = 7523 + INTEGER(IntKi), PARAMETER :: M44N9MKze = 7524 + INTEGER(IntKi), PARAMETER :: M45N1MKze = 7525 + INTEGER(IntKi), PARAMETER :: M45N2MKze = 7526 + INTEGER(IntKi), PARAMETER :: M45N3MKze = 7527 + INTEGER(IntKi), PARAMETER :: M45N4MKze = 7528 + INTEGER(IntKi), PARAMETER :: M45N5MKze = 7529 + INTEGER(IntKi), PARAMETER :: M45N6MKze = 7530 + INTEGER(IntKi), PARAMETER :: M45N7MKze = 7531 + INTEGER(IntKi), PARAMETER :: M45N8MKze = 7532 + INTEGER(IntKi), PARAMETER :: M45N9MKze = 7533 + INTEGER(IntKi), PARAMETER :: M46N1MKze = 7534 + INTEGER(IntKi), PARAMETER :: M46N2MKze = 7535 + INTEGER(IntKi), PARAMETER :: M46N3MKze = 7536 + INTEGER(IntKi), PARAMETER :: M46N4MKze = 7537 + INTEGER(IntKi), PARAMETER :: M46N5MKze = 7538 + INTEGER(IntKi), PARAMETER :: M46N6MKze = 7539 + INTEGER(IntKi), PARAMETER :: M46N7MKze = 7540 + INTEGER(IntKi), PARAMETER :: M46N8MKze = 7541 + INTEGER(IntKi), PARAMETER :: M46N9MKze = 7542 + INTEGER(IntKi), PARAMETER :: M47N1MKze = 7543 + INTEGER(IntKi), PARAMETER :: M47N2MKze = 7544 + INTEGER(IntKi), PARAMETER :: M47N3MKze = 7545 + INTEGER(IntKi), PARAMETER :: M47N4MKze = 7546 + INTEGER(IntKi), PARAMETER :: M47N5MKze = 7547 + INTEGER(IntKi), PARAMETER :: M47N6MKze = 7548 + INTEGER(IntKi), PARAMETER :: M47N7MKze = 7549 + INTEGER(IntKi), PARAMETER :: M47N8MKze = 7550 + INTEGER(IntKi), PARAMETER :: M47N9MKze = 7551 + INTEGER(IntKi), PARAMETER :: M48N1MKze = 7552 + INTEGER(IntKi), PARAMETER :: M48N2MKze = 7553 + INTEGER(IntKi), PARAMETER :: M48N3MKze = 7554 + INTEGER(IntKi), PARAMETER :: M48N4MKze = 7555 + INTEGER(IntKi), PARAMETER :: M48N5MKze = 7556 + INTEGER(IntKi), PARAMETER :: M48N6MKze = 7557 + INTEGER(IntKi), PARAMETER :: M48N7MKze = 7558 + INTEGER(IntKi), PARAMETER :: M48N8MKze = 7559 + INTEGER(IntKi), PARAMETER :: M48N9MKze = 7560 + INTEGER(IntKi), PARAMETER :: M49N1MKze = 7561 + INTEGER(IntKi), PARAMETER :: M49N2MKze = 7562 + INTEGER(IntKi), PARAMETER :: M49N3MKze = 7563 + INTEGER(IntKi), PARAMETER :: M49N4MKze = 7564 + INTEGER(IntKi), PARAMETER :: M49N5MKze = 7565 + INTEGER(IntKi), PARAMETER :: M49N6MKze = 7566 + INTEGER(IntKi), PARAMETER :: M49N7MKze = 7567 + INTEGER(IntKi), PARAMETER :: M49N8MKze = 7568 + INTEGER(IntKi), PARAMETER :: M49N9MKze = 7569 + INTEGER(IntKi), PARAMETER :: M50N1MKze = 7570 + INTEGER(IntKi), PARAMETER :: M50N2MKze = 7571 + INTEGER(IntKi), PARAMETER :: M50N3MKze = 7572 + INTEGER(IntKi), PARAMETER :: M50N4MKze = 7573 + INTEGER(IntKi), PARAMETER :: M50N5MKze = 7574 + INTEGER(IntKi), PARAMETER :: M50N6MKze = 7575 + INTEGER(IntKi), PARAMETER :: M50N7MKze = 7576 + INTEGER(IntKi), PARAMETER :: M50N8MKze = 7577 + INTEGER(IntKi), PARAMETER :: M50N9MKze = 7578 + INTEGER(IntKi), PARAMETER :: M51N1MKze = 7579 + INTEGER(IntKi), PARAMETER :: M51N2MKze = 7580 + INTEGER(IntKi), PARAMETER :: M51N3MKze = 7581 + INTEGER(IntKi), PARAMETER :: M51N4MKze = 7582 + INTEGER(IntKi), PARAMETER :: M51N5MKze = 7583 + INTEGER(IntKi), PARAMETER :: M51N6MKze = 7584 + INTEGER(IntKi), PARAMETER :: M51N7MKze = 7585 + INTEGER(IntKi), PARAMETER :: M51N8MKze = 7586 + INTEGER(IntKi), PARAMETER :: M51N9MKze = 7587 + INTEGER(IntKi), PARAMETER :: M52N1MKze = 7588 + INTEGER(IntKi), PARAMETER :: M52N2MKze = 7589 + INTEGER(IntKi), PARAMETER :: M52N3MKze = 7590 + INTEGER(IntKi), PARAMETER :: M52N4MKze = 7591 + INTEGER(IntKi), PARAMETER :: M52N5MKze = 7592 + INTEGER(IntKi), PARAMETER :: M52N6MKze = 7593 + INTEGER(IntKi), PARAMETER :: M52N7MKze = 7594 + INTEGER(IntKi), PARAMETER :: M52N8MKze = 7595 + INTEGER(IntKi), PARAMETER :: M52N9MKze = 7596 + INTEGER(IntKi), PARAMETER :: M53N1MKze = 7597 + INTEGER(IntKi), PARAMETER :: M53N2MKze = 7598 + INTEGER(IntKi), PARAMETER :: M53N3MKze = 7599 + INTEGER(IntKi), PARAMETER :: M53N4MKze = 7600 + INTEGER(IntKi), PARAMETER :: M53N5MKze = 7601 + INTEGER(IntKi), PARAMETER :: M53N6MKze = 7602 + INTEGER(IntKi), PARAMETER :: M53N7MKze = 7603 + INTEGER(IntKi), PARAMETER :: M53N8MKze = 7604 + INTEGER(IntKi), PARAMETER :: M53N9MKze = 7605 + INTEGER(IntKi), PARAMETER :: M54N1MKze = 7606 + INTEGER(IntKi), PARAMETER :: M54N2MKze = 7607 + INTEGER(IntKi), PARAMETER :: M54N3MKze = 7608 + INTEGER(IntKi), PARAMETER :: M54N4MKze = 7609 + INTEGER(IntKi), PARAMETER :: M54N5MKze = 7610 + INTEGER(IntKi), PARAMETER :: M54N6MKze = 7611 + INTEGER(IntKi), PARAMETER :: M54N7MKze = 7612 + INTEGER(IntKi), PARAMETER :: M54N8MKze = 7613 + INTEGER(IntKi), PARAMETER :: M54N9MKze = 7614 + INTEGER(IntKi), PARAMETER :: M55N1MKze = 7615 + INTEGER(IntKi), PARAMETER :: M55N2MKze = 7616 + INTEGER(IntKi), PARAMETER :: M55N3MKze = 7617 + INTEGER(IntKi), PARAMETER :: M55N4MKze = 7618 + INTEGER(IntKi), PARAMETER :: M55N5MKze = 7619 + INTEGER(IntKi), PARAMETER :: M55N6MKze = 7620 + INTEGER(IntKi), PARAMETER :: M55N7MKze = 7621 + INTEGER(IntKi), PARAMETER :: M55N8MKze = 7622 + INTEGER(IntKi), PARAMETER :: M55N9MKze = 7623 + INTEGER(IntKi), PARAMETER :: M56N1MKze = 7624 + INTEGER(IntKi), PARAMETER :: M56N2MKze = 7625 + INTEGER(IntKi), PARAMETER :: M56N3MKze = 7626 + INTEGER(IntKi), PARAMETER :: M56N4MKze = 7627 + INTEGER(IntKi), PARAMETER :: M56N5MKze = 7628 + INTEGER(IntKi), PARAMETER :: M56N6MKze = 7629 + INTEGER(IntKi), PARAMETER :: M56N7MKze = 7630 + INTEGER(IntKi), PARAMETER :: M56N8MKze = 7631 + INTEGER(IntKi), PARAMETER :: M56N9MKze = 7632 + INTEGER(IntKi), PARAMETER :: M57N1MKze = 7633 + INTEGER(IntKi), PARAMETER :: M57N2MKze = 7634 + INTEGER(IntKi), PARAMETER :: M57N3MKze = 7635 + INTEGER(IntKi), PARAMETER :: M57N4MKze = 7636 + INTEGER(IntKi), PARAMETER :: M57N5MKze = 7637 + INTEGER(IntKi), PARAMETER :: M57N6MKze = 7638 + INTEGER(IntKi), PARAMETER :: M57N7MKze = 7639 + INTEGER(IntKi), PARAMETER :: M57N8MKze = 7640 + INTEGER(IntKi), PARAMETER :: M57N9MKze = 7641 + INTEGER(IntKi), PARAMETER :: M58N1MKze = 7642 + INTEGER(IntKi), PARAMETER :: M58N2MKze = 7643 + INTEGER(IntKi), PARAMETER :: M58N3MKze = 7644 + INTEGER(IntKi), PARAMETER :: M58N4MKze = 7645 + INTEGER(IntKi), PARAMETER :: M58N5MKze = 7646 + INTEGER(IntKi), PARAMETER :: M58N6MKze = 7647 + INTEGER(IntKi), PARAMETER :: M58N7MKze = 7648 + INTEGER(IntKi), PARAMETER :: M58N8MKze = 7649 + INTEGER(IntKi), PARAMETER :: M58N9MKze = 7650 + INTEGER(IntKi), PARAMETER :: M59N1MKze = 7651 + INTEGER(IntKi), PARAMETER :: M59N2MKze = 7652 + INTEGER(IntKi), PARAMETER :: M59N3MKze = 7653 + INTEGER(IntKi), PARAMETER :: M59N4MKze = 7654 + INTEGER(IntKi), PARAMETER :: M59N5MKze = 7655 + INTEGER(IntKi), PARAMETER :: M59N6MKze = 7656 + INTEGER(IntKi), PARAMETER :: M59N7MKze = 7657 + INTEGER(IntKi), PARAMETER :: M59N8MKze = 7658 + INTEGER(IntKi), PARAMETER :: M59N9MKze = 7659 + INTEGER(IntKi), PARAMETER :: M60N1MKze = 7660 + INTEGER(IntKi), PARAMETER :: M60N2MKze = 7661 + INTEGER(IntKi), PARAMETER :: M60N3MKze = 7662 + INTEGER(IntKi), PARAMETER :: M60N4MKze = 7663 + INTEGER(IntKi), PARAMETER :: M60N5MKze = 7664 + INTEGER(IntKi), PARAMETER :: M60N6MKze = 7665 + INTEGER(IntKi), PARAMETER :: M60N7MKze = 7666 + INTEGER(IntKi), PARAMETER :: M60N8MKze = 7667 + INTEGER(IntKi), PARAMETER :: M60N9MKze = 7668 + INTEGER(IntKi), PARAMETER :: M61N1MKze = 7669 + INTEGER(IntKi), PARAMETER :: M61N2MKze = 7670 + INTEGER(IntKi), PARAMETER :: M61N3MKze = 7671 + INTEGER(IntKi), PARAMETER :: M61N4MKze = 7672 + INTEGER(IntKi), PARAMETER :: M61N5MKze = 7673 + INTEGER(IntKi), PARAMETER :: M61N6MKze = 7674 + INTEGER(IntKi), PARAMETER :: M61N7MKze = 7675 + INTEGER(IntKi), PARAMETER :: M61N8MKze = 7676 + INTEGER(IntKi), PARAMETER :: M61N9MKze = 7677 + INTEGER(IntKi), PARAMETER :: M62N1MKze = 7678 + INTEGER(IntKi), PARAMETER :: M62N2MKze = 7679 + INTEGER(IntKi), PARAMETER :: M62N3MKze = 7680 + INTEGER(IntKi), PARAMETER :: M62N4MKze = 7681 + INTEGER(IntKi), PARAMETER :: M62N5MKze = 7682 + INTEGER(IntKi), PARAMETER :: M62N6MKze = 7683 + INTEGER(IntKi), PARAMETER :: M62N7MKze = 7684 + INTEGER(IntKi), PARAMETER :: M62N8MKze = 7685 + INTEGER(IntKi), PARAMETER :: M62N9MKze = 7686 + INTEGER(IntKi), PARAMETER :: M63N1MKze = 7687 + INTEGER(IntKi), PARAMETER :: M63N2MKze = 7688 + INTEGER(IntKi), PARAMETER :: M63N3MKze = 7689 + INTEGER(IntKi), PARAMETER :: M63N4MKze = 7690 + INTEGER(IntKi), PARAMETER :: M63N5MKze = 7691 + INTEGER(IntKi), PARAMETER :: M63N6MKze = 7692 + INTEGER(IntKi), PARAMETER :: M63N7MKze = 7693 + INTEGER(IntKi), PARAMETER :: M63N8MKze = 7694 + INTEGER(IntKi), PARAMETER :: M63N9MKze = 7695 + INTEGER(IntKi), PARAMETER :: M64N1MKze = 7696 + INTEGER(IntKi), PARAMETER :: M64N2MKze = 7697 + INTEGER(IntKi), PARAMETER :: M64N3MKze = 7698 + INTEGER(IntKi), PARAMETER :: M64N4MKze = 7699 + INTEGER(IntKi), PARAMETER :: M64N5MKze = 7700 + INTEGER(IntKi), PARAMETER :: M64N6MKze = 7701 + INTEGER(IntKi), PARAMETER :: M64N7MKze = 7702 + INTEGER(IntKi), PARAMETER :: M64N8MKze = 7703 + INTEGER(IntKi), PARAMETER :: M64N9MKze = 7704 + INTEGER(IntKi), PARAMETER :: M65N1MKze = 7705 + INTEGER(IntKi), PARAMETER :: M65N2MKze = 7706 + INTEGER(IntKi), PARAMETER :: M65N3MKze = 7707 + INTEGER(IntKi), PARAMETER :: M65N4MKze = 7708 + INTEGER(IntKi), PARAMETER :: M65N5MKze = 7709 + INTEGER(IntKi), PARAMETER :: M65N6MKze = 7710 + INTEGER(IntKi), PARAMETER :: M65N7MKze = 7711 + INTEGER(IntKi), PARAMETER :: M65N8MKze = 7712 + INTEGER(IntKi), PARAMETER :: M65N9MKze = 7713 + INTEGER(IntKi), PARAMETER :: M66N1MKze = 7714 + INTEGER(IntKi), PARAMETER :: M66N2MKze = 7715 + INTEGER(IntKi), PARAMETER :: M66N3MKze = 7716 + INTEGER(IntKi), PARAMETER :: M66N4MKze = 7717 + INTEGER(IntKi), PARAMETER :: M66N5MKze = 7718 + INTEGER(IntKi), PARAMETER :: M66N6MKze = 7719 + INTEGER(IntKi), PARAMETER :: M66N7MKze = 7720 + INTEGER(IntKi), PARAMETER :: M66N8MKze = 7721 + INTEGER(IntKi), PARAMETER :: M66N9MKze = 7722 + INTEGER(IntKi), PARAMETER :: M67N1MKze = 7723 + INTEGER(IntKi), PARAMETER :: M67N2MKze = 7724 + INTEGER(IntKi), PARAMETER :: M67N3MKze = 7725 + INTEGER(IntKi), PARAMETER :: M67N4MKze = 7726 + INTEGER(IntKi), PARAMETER :: M67N5MKze = 7727 + INTEGER(IntKi), PARAMETER :: M67N6MKze = 7728 + INTEGER(IntKi), PARAMETER :: M67N7MKze = 7729 + INTEGER(IntKi), PARAMETER :: M67N8MKze = 7730 + INTEGER(IntKi), PARAMETER :: M67N9MKze = 7731 + INTEGER(IntKi), PARAMETER :: M68N1MKze = 7732 + INTEGER(IntKi), PARAMETER :: M68N2MKze = 7733 + INTEGER(IntKi), PARAMETER :: M68N3MKze = 7734 + INTEGER(IntKi), PARAMETER :: M68N4MKze = 7735 + INTEGER(IntKi), PARAMETER :: M68N5MKze = 7736 + INTEGER(IntKi), PARAMETER :: M68N6MKze = 7737 + INTEGER(IntKi), PARAMETER :: M68N7MKze = 7738 + INTEGER(IntKi), PARAMETER :: M68N8MKze = 7739 + INTEGER(IntKi), PARAMETER :: M68N9MKze = 7740 + INTEGER(IntKi), PARAMETER :: M69N1MKze = 7741 + INTEGER(IntKi), PARAMETER :: M69N2MKze = 7742 + INTEGER(IntKi), PARAMETER :: M69N3MKze = 7743 + INTEGER(IntKi), PARAMETER :: M69N4MKze = 7744 + INTEGER(IntKi), PARAMETER :: M69N5MKze = 7745 + INTEGER(IntKi), PARAMETER :: M69N6MKze = 7746 + INTEGER(IntKi), PARAMETER :: M69N7MKze = 7747 + INTEGER(IntKi), PARAMETER :: M69N8MKze = 7748 + INTEGER(IntKi), PARAMETER :: M69N9MKze = 7749 + INTEGER(IntKi), PARAMETER :: M70N1MKze = 7750 + INTEGER(IntKi), PARAMETER :: M70N2MKze = 7751 + INTEGER(IntKi), PARAMETER :: M70N3MKze = 7752 + INTEGER(IntKi), PARAMETER :: M70N4MKze = 7753 + INTEGER(IntKi), PARAMETER :: M70N5MKze = 7754 + INTEGER(IntKi), PARAMETER :: M70N6MKze = 7755 + INTEGER(IntKi), PARAMETER :: M70N7MKze = 7756 + INTEGER(IntKi), PARAMETER :: M70N8MKze = 7757 + INTEGER(IntKi), PARAMETER :: M70N9MKze = 7758 + INTEGER(IntKi), PARAMETER :: M71N1MKze = 7759 + INTEGER(IntKi), PARAMETER :: M71N2MKze = 7760 + INTEGER(IntKi), PARAMETER :: M71N3MKze = 7761 + INTEGER(IntKi), PARAMETER :: M71N4MKze = 7762 + INTEGER(IntKi), PARAMETER :: M71N5MKze = 7763 + INTEGER(IntKi), PARAMETER :: M71N6MKze = 7764 + INTEGER(IntKi), PARAMETER :: M71N7MKze = 7765 + INTEGER(IntKi), PARAMETER :: M71N8MKze = 7766 + INTEGER(IntKi), PARAMETER :: M71N9MKze = 7767 + INTEGER(IntKi), PARAMETER :: M72N1MKze = 7768 + INTEGER(IntKi), PARAMETER :: M72N2MKze = 7769 + INTEGER(IntKi), PARAMETER :: M72N3MKze = 7770 + INTEGER(IntKi), PARAMETER :: M72N4MKze = 7771 + INTEGER(IntKi), PARAMETER :: M72N5MKze = 7772 + INTEGER(IntKi), PARAMETER :: M72N6MKze = 7773 + INTEGER(IntKi), PARAMETER :: M72N7MKze = 7774 + INTEGER(IntKi), PARAMETER :: M72N8MKze = 7775 + INTEGER(IntKi), PARAMETER :: M72N9MKze = 7776 + INTEGER(IntKi), PARAMETER :: M73N1MKze = 7777 + INTEGER(IntKi), PARAMETER :: M73N2MKze = 7778 + INTEGER(IntKi), PARAMETER :: M73N3MKze = 7779 + INTEGER(IntKi), PARAMETER :: M73N4MKze = 7780 + INTEGER(IntKi), PARAMETER :: M73N5MKze = 7781 + INTEGER(IntKi), PARAMETER :: M73N6MKze = 7782 + INTEGER(IntKi), PARAMETER :: M73N7MKze = 7783 + INTEGER(IntKi), PARAMETER :: M73N8MKze = 7784 + INTEGER(IntKi), PARAMETER :: M73N9MKze = 7785 + INTEGER(IntKi), PARAMETER :: M74N1MKze = 7786 + INTEGER(IntKi), PARAMETER :: M74N2MKze = 7787 + INTEGER(IntKi), PARAMETER :: M74N3MKze = 7788 + INTEGER(IntKi), PARAMETER :: M74N4MKze = 7789 + INTEGER(IntKi), PARAMETER :: M74N5MKze = 7790 + INTEGER(IntKi), PARAMETER :: M74N6MKze = 7791 + INTEGER(IntKi), PARAMETER :: M74N7MKze = 7792 + INTEGER(IntKi), PARAMETER :: M74N8MKze = 7793 + INTEGER(IntKi), PARAMETER :: M74N9MKze = 7794 + INTEGER(IntKi), PARAMETER :: M75N1MKze = 7795 + INTEGER(IntKi), PARAMETER :: M75N2MKze = 7796 + INTEGER(IntKi), PARAMETER :: M75N3MKze = 7797 + INTEGER(IntKi), PARAMETER :: M75N4MKze = 7798 + INTEGER(IntKi), PARAMETER :: M75N5MKze = 7799 + INTEGER(IntKi), PARAMETER :: M75N6MKze = 7800 + INTEGER(IntKi), PARAMETER :: M75N7MKze = 7801 + INTEGER(IntKi), PARAMETER :: M75N8MKze = 7802 + INTEGER(IntKi), PARAMETER :: M75N9MKze = 7803 + INTEGER(IntKi), PARAMETER :: M76N1MKze = 7804 + INTEGER(IntKi), PARAMETER :: M76N2MKze = 7805 + INTEGER(IntKi), PARAMETER :: M76N3MKze = 7806 + INTEGER(IntKi), PARAMETER :: M76N4MKze = 7807 + INTEGER(IntKi), PARAMETER :: M76N5MKze = 7808 + INTEGER(IntKi), PARAMETER :: M76N6MKze = 7809 + INTEGER(IntKi), PARAMETER :: M76N7MKze = 7810 + INTEGER(IntKi), PARAMETER :: M76N8MKze = 7811 + INTEGER(IntKi), PARAMETER :: M76N9MKze = 7812 + INTEGER(IntKi), PARAMETER :: M77N1MKze = 7813 + INTEGER(IntKi), PARAMETER :: M77N2MKze = 7814 + INTEGER(IntKi), PARAMETER :: M77N3MKze = 7815 + INTEGER(IntKi), PARAMETER :: M77N4MKze = 7816 + INTEGER(IntKi), PARAMETER :: M77N5MKze = 7817 + INTEGER(IntKi), PARAMETER :: M77N6MKze = 7818 + INTEGER(IntKi), PARAMETER :: M77N7MKze = 7819 + INTEGER(IntKi), PARAMETER :: M77N8MKze = 7820 + INTEGER(IntKi), PARAMETER :: M77N9MKze = 7821 + INTEGER(IntKi), PARAMETER :: M78N1MKze = 7822 + INTEGER(IntKi), PARAMETER :: M78N2MKze = 7823 + INTEGER(IntKi), PARAMETER :: M78N3MKze = 7824 + INTEGER(IntKi), PARAMETER :: M78N4MKze = 7825 + INTEGER(IntKi), PARAMETER :: M78N5MKze = 7826 + INTEGER(IntKi), PARAMETER :: M78N6MKze = 7827 + INTEGER(IntKi), PARAMETER :: M78N7MKze = 7828 + INTEGER(IntKi), PARAMETER :: M78N8MKze = 7829 + INTEGER(IntKi), PARAMETER :: M78N9MKze = 7830 + INTEGER(IntKi), PARAMETER :: M79N1MKze = 7831 + INTEGER(IntKi), PARAMETER :: M79N2MKze = 7832 + INTEGER(IntKi), PARAMETER :: M79N3MKze = 7833 + INTEGER(IntKi), PARAMETER :: M79N4MKze = 7834 + INTEGER(IntKi), PARAMETER :: M79N5MKze = 7835 + INTEGER(IntKi), PARAMETER :: M79N6MKze = 7836 + INTEGER(IntKi), PARAMETER :: M79N7MKze = 7837 + INTEGER(IntKi), PARAMETER :: M79N8MKze = 7838 + INTEGER(IntKi), PARAMETER :: M79N9MKze = 7839 + INTEGER(IntKi), PARAMETER :: M80N1MKze = 7840 + INTEGER(IntKi), PARAMETER :: M80N2MKze = 7841 + INTEGER(IntKi), PARAMETER :: M80N3MKze = 7842 + INTEGER(IntKi), PARAMETER :: M80N4MKze = 7843 + INTEGER(IntKi), PARAMETER :: M80N5MKze = 7844 + INTEGER(IntKi), PARAMETER :: M80N6MKze = 7845 + INTEGER(IntKi), PARAMETER :: M80N7MKze = 7846 + INTEGER(IntKi), PARAMETER :: M80N8MKze = 7847 + INTEGER(IntKi), PARAMETER :: M80N9MKze = 7848 + INTEGER(IntKi), PARAMETER :: M81N1MKze = 7849 + INTEGER(IntKi), PARAMETER :: M81N2MKze = 7850 + INTEGER(IntKi), PARAMETER :: M81N3MKze = 7851 + INTEGER(IntKi), PARAMETER :: M81N4MKze = 7852 + INTEGER(IntKi), PARAMETER :: M81N5MKze = 7853 + INTEGER(IntKi), PARAMETER :: M81N6MKze = 7854 + INTEGER(IntKi), PARAMETER :: M81N7MKze = 7855 + INTEGER(IntKi), PARAMETER :: M81N8MKze = 7856 + INTEGER(IntKi), PARAMETER :: M81N9MKze = 7857 + INTEGER(IntKi), PARAMETER :: M82N1MKze = 7858 + INTEGER(IntKi), PARAMETER :: M82N2MKze = 7859 + INTEGER(IntKi), PARAMETER :: M82N3MKze = 7860 + INTEGER(IntKi), PARAMETER :: M82N4MKze = 7861 + INTEGER(IntKi), PARAMETER :: M82N5MKze = 7862 + INTEGER(IntKi), PARAMETER :: M82N6MKze = 7863 + INTEGER(IntKi), PARAMETER :: M82N7MKze = 7864 + INTEGER(IntKi), PARAMETER :: M82N8MKze = 7865 + INTEGER(IntKi), PARAMETER :: M82N9MKze = 7866 + INTEGER(IntKi), PARAMETER :: M83N1MKze = 7867 + INTEGER(IntKi), PARAMETER :: M83N2MKze = 7868 + INTEGER(IntKi), PARAMETER :: M83N3MKze = 7869 + INTEGER(IntKi), PARAMETER :: M83N4MKze = 7870 + INTEGER(IntKi), PARAMETER :: M83N5MKze = 7871 + INTEGER(IntKi), PARAMETER :: M83N6MKze = 7872 + INTEGER(IntKi), PARAMETER :: M83N7MKze = 7873 + INTEGER(IntKi), PARAMETER :: M83N8MKze = 7874 + INTEGER(IntKi), PARAMETER :: M83N9MKze = 7875 + INTEGER(IntKi), PARAMETER :: M84N1MKze = 7876 + INTEGER(IntKi), PARAMETER :: M84N2MKze = 7877 + INTEGER(IntKi), PARAMETER :: M84N3MKze = 7878 + INTEGER(IntKi), PARAMETER :: M84N4MKze = 7879 + INTEGER(IntKi), PARAMETER :: M84N5MKze = 7880 + INTEGER(IntKi), PARAMETER :: M84N6MKze = 7881 + INTEGER(IntKi), PARAMETER :: M84N7MKze = 7882 + INTEGER(IntKi), PARAMETER :: M84N8MKze = 7883 + INTEGER(IntKi), PARAMETER :: M84N9MKze = 7884 + INTEGER(IntKi), PARAMETER :: M85N1MKze = 7885 + INTEGER(IntKi), PARAMETER :: M85N2MKze = 7886 + INTEGER(IntKi), PARAMETER :: M85N3MKze = 7887 + INTEGER(IntKi), PARAMETER :: M85N4MKze = 7888 + INTEGER(IntKi), PARAMETER :: M85N5MKze = 7889 + INTEGER(IntKi), PARAMETER :: M85N6MKze = 7890 + INTEGER(IntKi), PARAMETER :: M85N7MKze = 7891 + INTEGER(IntKi), PARAMETER :: M85N8MKze = 7892 + INTEGER(IntKi), PARAMETER :: M85N9MKze = 7893 + INTEGER(IntKi), PARAMETER :: M86N1MKze = 7894 + INTEGER(IntKi), PARAMETER :: M86N2MKze = 7895 + INTEGER(IntKi), PARAMETER :: M86N3MKze = 7896 + INTEGER(IntKi), PARAMETER :: M86N4MKze = 7897 + INTEGER(IntKi), PARAMETER :: M86N5MKze = 7898 + INTEGER(IntKi), PARAMETER :: M86N6MKze = 7899 + INTEGER(IntKi), PARAMETER :: M86N7MKze = 7900 + INTEGER(IntKi), PARAMETER :: M86N8MKze = 7901 + INTEGER(IntKi), PARAMETER :: M86N9MKze = 7902 + INTEGER(IntKi), PARAMETER :: M87N1MKze = 7903 + INTEGER(IntKi), PARAMETER :: M87N2MKze = 7904 + INTEGER(IntKi), PARAMETER :: M87N3MKze = 7905 + INTEGER(IntKi), PARAMETER :: M87N4MKze = 7906 + INTEGER(IntKi), PARAMETER :: M87N5MKze = 7907 + INTEGER(IntKi), PARAMETER :: M87N6MKze = 7908 + INTEGER(IntKi), PARAMETER :: M87N7MKze = 7909 + INTEGER(IntKi), PARAMETER :: M87N8MKze = 7910 + INTEGER(IntKi), PARAMETER :: M87N9MKze = 7911 + INTEGER(IntKi), PARAMETER :: M88N1MKze = 7912 + INTEGER(IntKi), PARAMETER :: M88N2MKze = 7913 + INTEGER(IntKi), PARAMETER :: M88N3MKze = 7914 + INTEGER(IntKi), PARAMETER :: M88N4MKze = 7915 + INTEGER(IntKi), PARAMETER :: M88N5MKze = 7916 + INTEGER(IntKi), PARAMETER :: M88N6MKze = 7917 + INTEGER(IntKi), PARAMETER :: M88N7MKze = 7918 + INTEGER(IntKi), PARAMETER :: M88N8MKze = 7919 + INTEGER(IntKi), PARAMETER :: M88N9MKze = 7920 + INTEGER(IntKi), PARAMETER :: M89N1MKze = 7921 + INTEGER(IntKi), PARAMETER :: M89N2MKze = 7922 + INTEGER(IntKi), PARAMETER :: M89N3MKze = 7923 + INTEGER(IntKi), PARAMETER :: M89N4MKze = 7924 + INTEGER(IntKi), PARAMETER :: M89N5MKze = 7925 + INTEGER(IntKi), PARAMETER :: M89N6MKze = 7926 + INTEGER(IntKi), PARAMETER :: M89N7MKze = 7927 + INTEGER(IntKi), PARAMETER :: M89N8MKze = 7928 + INTEGER(IntKi), PARAMETER :: M89N9MKze = 7929 + INTEGER(IntKi), PARAMETER :: M90N1MKze = 7930 + INTEGER(IntKi), PARAMETER :: M90N2MKze = 7931 + INTEGER(IntKi), PARAMETER :: M90N3MKze = 7932 + INTEGER(IntKi), PARAMETER :: M90N4MKze = 7933 + INTEGER(IntKi), PARAMETER :: M90N5MKze = 7934 + INTEGER(IntKi), PARAMETER :: M90N6MKze = 7935 + INTEGER(IntKi), PARAMETER :: M90N7MKze = 7936 + INTEGER(IntKi), PARAMETER :: M90N8MKze = 7937 + INTEGER(IntKi), PARAMETER :: M90N9MKze = 7938 + INTEGER(IntKi), PARAMETER :: M91N1MKze = 7939 + INTEGER(IntKi), PARAMETER :: M91N2MKze = 7940 + INTEGER(IntKi), PARAMETER :: M91N3MKze = 7941 + INTEGER(IntKi), PARAMETER :: M91N4MKze = 7942 + INTEGER(IntKi), PARAMETER :: M91N5MKze = 7943 + INTEGER(IntKi), PARAMETER :: M91N6MKze = 7944 + INTEGER(IntKi), PARAMETER :: M91N7MKze = 7945 + INTEGER(IntKi), PARAMETER :: M91N8MKze = 7946 + INTEGER(IntKi), PARAMETER :: M91N9MKze = 7947 + INTEGER(IntKi), PARAMETER :: M92N1MKze = 7948 + INTEGER(IntKi), PARAMETER :: M92N2MKze = 7949 + INTEGER(IntKi), PARAMETER :: M92N3MKze = 7950 + INTEGER(IntKi), PARAMETER :: M92N4MKze = 7951 + INTEGER(IntKi), PARAMETER :: M92N5MKze = 7952 + INTEGER(IntKi), PARAMETER :: M92N6MKze = 7953 + INTEGER(IntKi), PARAMETER :: M92N7MKze = 7954 + INTEGER(IntKi), PARAMETER :: M92N8MKze = 7955 + INTEGER(IntKi), PARAMETER :: M92N9MKze = 7956 + INTEGER(IntKi), PARAMETER :: M93N1MKze = 7957 + INTEGER(IntKi), PARAMETER :: M93N2MKze = 7958 + INTEGER(IntKi), PARAMETER :: M93N3MKze = 7959 + INTEGER(IntKi), PARAMETER :: M93N4MKze = 7960 + INTEGER(IntKi), PARAMETER :: M93N5MKze = 7961 + INTEGER(IntKi), PARAMETER :: M93N6MKze = 7962 + INTEGER(IntKi), PARAMETER :: M93N7MKze = 7963 + INTEGER(IntKi), PARAMETER :: M93N8MKze = 7964 + INTEGER(IntKi), PARAMETER :: M93N9MKze = 7965 + INTEGER(IntKi), PARAMETER :: M94N1MKze = 7966 + INTEGER(IntKi), PARAMETER :: M94N2MKze = 7967 + INTEGER(IntKi), PARAMETER :: M94N3MKze = 7968 + INTEGER(IntKi), PARAMETER :: M94N4MKze = 7969 + INTEGER(IntKi), PARAMETER :: M94N5MKze = 7970 + INTEGER(IntKi), PARAMETER :: M94N6MKze = 7971 + INTEGER(IntKi), PARAMETER :: M94N7MKze = 7972 + INTEGER(IntKi), PARAMETER :: M94N8MKze = 7973 + INTEGER(IntKi), PARAMETER :: M94N9MKze = 7974 + INTEGER(IntKi), PARAMETER :: M95N1MKze = 7975 + INTEGER(IntKi), PARAMETER :: M95N2MKze = 7976 + INTEGER(IntKi), PARAMETER :: M95N3MKze = 7977 + INTEGER(IntKi), PARAMETER :: M95N4MKze = 7978 + INTEGER(IntKi), PARAMETER :: M95N5MKze = 7979 + INTEGER(IntKi), PARAMETER :: M95N6MKze = 7980 + INTEGER(IntKi), PARAMETER :: M95N7MKze = 7981 + INTEGER(IntKi), PARAMETER :: M95N8MKze = 7982 + INTEGER(IntKi), PARAMETER :: M95N9MKze = 7983 + INTEGER(IntKi), PARAMETER :: M96N1MKze = 7984 + INTEGER(IntKi), PARAMETER :: M96N2MKze = 7985 + INTEGER(IntKi), PARAMETER :: M96N3MKze = 7986 + INTEGER(IntKi), PARAMETER :: M96N4MKze = 7987 + INTEGER(IntKi), PARAMETER :: M96N5MKze = 7988 + INTEGER(IntKi), PARAMETER :: M96N6MKze = 7989 + INTEGER(IntKi), PARAMETER :: M96N7MKze = 7990 + INTEGER(IntKi), PARAMETER :: M96N8MKze = 7991 + INTEGER(IntKi), PARAMETER :: M96N9MKze = 7992 + INTEGER(IntKi), PARAMETER :: M97N1MKze = 7993 + INTEGER(IntKi), PARAMETER :: M97N2MKze = 7994 + INTEGER(IntKi), PARAMETER :: M97N3MKze = 7995 + INTEGER(IntKi), PARAMETER :: M97N4MKze = 7996 + INTEGER(IntKi), PARAMETER :: M97N5MKze = 7997 + INTEGER(IntKi), PARAMETER :: M97N6MKze = 7998 + INTEGER(IntKi), PARAMETER :: M97N7MKze = 7999 + INTEGER(IntKi), PARAMETER :: M97N8MKze = 8000 + INTEGER(IntKi), PARAMETER :: M97N9MKze = 8001 + INTEGER(IntKi), PARAMETER :: M98N1MKze = 8002 + INTEGER(IntKi), PARAMETER :: M98N2MKze = 8003 + INTEGER(IntKi), PARAMETER :: M98N3MKze = 8004 + INTEGER(IntKi), PARAMETER :: M98N4MKze = 8005 + INTEGER(IntKi), PARAMETER :: M98N5MKze = 8006 + INTEGER(IntKi), PARAMETER :: M98N6MKze = 8007 + INTEGER(IntKi), PARAMETER :: M98N7MKze = 8008 + INTEGER(IntKi), PARAMETER :: M98N8MKze = 8009 + INTEGER(IntKi), PARAMETER :: M98N9MKze = 8010 + INTEGER(IntKi), PARAMETER :: M99N1MKze = 8011 + INTEGER(IntKi), PARAMETER :: M99N2MKze = 8012 + INTEGER(IntKi), PARAMETER :: M99N3MKze = 8013 + INTEGER(IntKi), PARAMETER :: M99N4MKze = 8014 + INTEGER(IntKi), PARAMETER :: M99N5MKze = 8015 + INTEGER(IntKi), PARAMETER :: M99N6MKze = 8016 + INTEGER(IntKi), PARAMETER :: M99N7MKze = 8017 + INTEGER(IntKi), PARAMETER :: M99N8MKze = 8018 + INTEGER(IntKi), PARAMETER :: M99N9MKze = 8019 + INTEGER(IntKi), PARAMETER :: M01N1MMxe = 8020 + INTEGER(IntKi), PARAMETER :: M01N2MMxe = 8021 + INTEGER(IntKi), PARAMETER :: M01N3MMxe = 8022 + INTEGER(IntKi), PARAMETER :: M01N4MMxe = 8023 + INTEGER(IntKi), PARAMETER :: M01N5MMxe = 8024 + INTEGER(IntKi), PARAMETER :: M01N6MMxe = 8025 + INTEGER(IntKi), PARAMETER :: M01N7MMxe = 8026 + INTEGER(IntKi), PARAMETER :: M01N8MMxe = 8027 + INTEGER(IntKi), PARAMETER :: M01N9MMxe = 8028 + INTEGER(IntKi), PARAMETER :: M02N1MMxe = 8029 + INTEGER(IntKi), PARAMETER :: M02N2MMxe = 8030 + INTEGER(IntKi), PARAMETER :: M02N3MMxe = 8031 + INTEGER(IntKi), PARAMETER :: M02N4MMxe = 8032 + INTEGER(IntKi), PARAMETER :: M02N5MMxe = 8033 + INTEGER(IntKi), PARAMETER :: M02N6MMxe = 8034 + INTEGER(IntKi), PARAMETER :: M02N7MMxe = 8035 + INTEGER(IntKi), PARAMETER :: M02N8MMxe = 8036 + INTEGER(IntKi), PARAMETER :: M02N9MMxe = 8037 + INTEGER(IntKi), PARAMETER :: M03N1MMxe = 8038 + INTEGER(IntKi), PARAMETER :: M03N2MMxe = 8039 + INTEGER(IntKi), PARAMETER :: M03N3MMxe = 8040 + INTEGER(IntKi), PARAMETER :: M03N4MMxe = 8041 + INTEGER(IntKi), PARAMETER :: M03N5MMxe = 8042 + INTEGER(IntKi), PARAMETER :: M03N6MMxe = 8043 + INTEGER(IntKi), PARAMETER :: M03N7MMxe = 8044 + INTEGER(IntKi), PARAMETER :: M03N8MMxe = 8045 + INTEGER(IntKi), PARAMETER :: M03N9MMxe = 8046 + INTEGER(IntKi), PARAMETER :: M04N1MMxe = 8047 + INTEGER(IntKi), PARAMETER :: M04N2MMxe = 8048 + INTEGER(IntKi), PARAMETER :: M04N3MMxe = 8049 + INTEGER(IntKi), PARAMETER :: M04N4MMxe = 8050 + INTEGER(IntKi), PARAMETER :: M04N5MMxe = 8051 + INTEGER(IntKi), PARAMETER :: M04N6MMxe = 8052 + INTEGER(IntKi), PARAMETER :: M04N7MMxe = 8053 + INTEGER(IntKi), PARAMETER :: M04N8MMxe = 8054 + INTEGER(IntKi), PARAMETER :: M04N9MMxe = 8055 + INTEGER(IntKi), PARAMETER :: M05N1MMxe = 8056 + INTEGER(IntKi), PARAMETER :: M05N2MMxe = 8057 + INTEGER(IntKi), PARAMETER :: M05N3MMxe = 8058 + INTEGER(IntKi), PARAMETER :: M05N4MMxe = 8059 + INTEGER(IntKi), PARAMETER :: M05N5MMxe = 8060 + INTEGER(IntKi), PARAMETER :: M05N6MMxe = 8061 + INTEGER(IntKi), PARAMETER :: M05N7MMxe = 8062 + INTEGER(IntKi), PARAMETER :: M05N8MMxe = 8063 + INTEGER(IntKi), PARAMETER :: M05N9MMxe = 8064 + INTEGER(IntKi), PARAMETER :: M06N1MMxe = 8065 + INTEGER(IntKi), PARAMETER :: M06N2MMxe = 8066 + INTEGER(IntKi), PARAMETER :: M06N3MMxe = 8067 + INTEGER(IntKi), PARAMETER :: M06N4MMxe = 8068 + INTEGER(IntKi), PARAMETER :: M06N5MMxe = 8069 + INTEGER(IntKi), PARAMETER :: M06N6MMxe = 8070 + INTEGER(IntKi), PARAMETER :: M06N7MMxe = 8071 + INTEGER(IntKi), PARAMETER :: M06N8MMxe = 8072 + INTEGER(IntKi), PARAMETER :: M06N9MMxe = 8073 + INTEGER(IntKi), PARAMETER :: M07N1MMxe = 8074 + INTEGER(IntKi), PARAMETER :: M07N2MMxe = 8075 + INTEGER(IntKi), PARAMETER :: M07N3MMxe = 8076 + INTEGER(IntKi), PARAMETER :: M07N4MMxe = 8077 + INTEGER(IntKi), PARAMETER :: M07N5MMxe = 8078 + INTEGER(IntKi), PARAMETER :: M07N6MMxe = 8079 + INTEGER(IntKi), PARAMETER :: M07N7MMxe = 8080 + INTEGER(IntKi), PARAMETER :: M07N8MMxe = 8081 + INTEGER(IntKi), PARAMETER :: M07N9MMxe = 8082 + INTEGER(IntKi), PARAMETER :: M08N1MMxe = 8083 + INTEGER(IntKi), PARAMETER :: M08N2MMxe = 8084 + INTEGER(IntKi), PARAMETER :: M08N3MMxe = 8085 + INTEGER(IntKi), PARAMETER :: M08N4MMxe = 8086 + INTEGER(IntKi), PARAMETER :: M08N5MMxe = 8087 + INTEGER(IntKi), PARAMETER :: M08N6MMxe = 8088 + INTEGER(IntKi), PARAMETER :: M08N7MMxe = 8089 + INTEGER(IntKi), PARAMETER :: M08N8MMxe = 8090 + INTEGER(IntKi), PARAMETER :: M08N9MMxe = 8091 + INTEGER(IntKi), PARAMETER :: M09N1MMxe = 8092 + INTEGER(IntKi), PARAMETER :: M09N2MMxe = 8093 + INTEGER(IntKi), PARAMETER :: M09N3MMxe = 8094 + INTEGER(IntKi), PARAMETER :: M09N4MMxe = 8095 + INTEGER(IntKi), PARAMETER :: M09N5MMxe = 8096 + INTEGER(IntKi), PARAMETER :: M09N6MMxe = 8097 + INTEGER(IntKi), PARAMETER :: M09N7MMxe = 8098 + INTEGER(IntKi), PARAMETER :: M09N8MMxe = 8099 + INTEGER(IntKi), PARAMETER :: M09N9MMxe = 8100 + INTEGER(IntKi), PARAMETER :: M10N1MMxe = 8101 + INTEGER(IntKi), PARAMETER :: M10N2MMxe = 8102 + INTEGER(IntKi), PARAMETER :: M10N3MMxe = 8103 + INTEGER(IntKi), PARAMETER :: M10N4MMxe = 8104 + INTEGER(IntKi), PARAMETER :: M10N5MMxe = 8105 + INTEGER(IntKi), PARAMETER :: M10N6MMxe = 8106 + INTEGER(IntKi), PARAMETER :: M10N7MMxe = 8107 + INTEGER(IntKi), PARAMETER :: M10N8MMxe = 8108 + INTEGER(IntKi), PARAMETER :: M10N9MMxe = 8109 + INTEGER(IntKi), PARAMETER :: M11N1MMxe = 8110 + INTEGER(IntKi), PARAMETER :: M11N2MMxe = 8111 + INTEGER(IntKi), PARAMETER :: M11N3MMxe = 8112 + INTEGER(IntKi), PARAMETER :: M11N4MMxe = 8113 + INTEGER(IntKi), PARAMETER :: M11N5MMxe = 8114 + INTEGER(IntKi), PARAMETER :: M11N6MMxe = 8115 + INTEGER(IntKi), PARAMETER :: M11N7MMxe = 8116 + INTEGER(IntKi), PARAMETER :: M11N8MMxe = 8117 + INTEGER(IntKi), PARAMETER :: M11N9MMxe = 8118 + INTEGER(IntKi), PARAMETER :: M12N1MMxe = 8119 + INTEGER(IntKi), PARAMETER :: M12N2MMxe = 8120 + INTEGER(IntKi), PARAMETER :: M12N3MMxe = 8121 + INTEGER(IntKi), PARAMETER :: M12N4MMxe = 8122 + INTEGER(IntKi), PARAMETER :: M12N5MMxe = 8123 + INTEGER(IntKi), PARAMETER :: M12N6MMxe = 8124 + INTEGER(IntKi), PARAMETER :: M12N7MMxe = 8125 + INTEGER(IntKi), PARAMETER :: M12N8MMxe = 8126 + INTEGER(IntKi), PARAMETER :: M12N9MMxe = 8127 + INTEGER(IntKi), PARAMETER :: M13N1MMxe = 8128 + INTEGER(IntKi), PARAMETER :: M13N2MMxe = 8129 + INTEGER(IntKi), PARAMETER :: M13N3MMxe = 8130 + INTEGER(IntKi), PARAMETER :: M13N4MMxe = 8131 + INTEGER(IntKi), PARAMETER :: M13N5MMxe = 8132 + INTEGER(IntKi), PARAMETER :: M13N6MMxe = 8133 + INTEGER(IntKi), PARAMETER :: M13N7MMxe = 8134 + INTEGER(IntKi), PARAMETER :: M13N8MMxe = 8135 + INTEGER(IntKi), PARAMETER :: M13N9MMxe = 8136 + INTEGER(IntKi), PARAMETER :: M14N1MMxe = 8137 + INTEGER(IntKi), PARAMETER :: M14N2MMxe = 8138 + INTEGER(IntKi), PARAMETER :: M14N3MMxe = 8139 + INTEGER(IntKi), PARAMETER :: M14N4MMxe = 8140 + INTEGER(IntKi), PARAMETER :: M14N5MMxe = 8141 + INTEGER(IntKi), PARAMETER :: M14N6MMxe = 8142 + INTEGER(IntKi), PARAMETER :: M14N7MMxe = 8143 + INTEGER(IntKi), PARAMETER :: M14N8MMxe = 8144 + INTEGER(IntKi), PARAMETER :: M14N9MMxe = 8145 + INTEGER(IntKi), PARAMETER :: M15N1MMxe = 8146 + INTEGER(IntKi), PARAMETER :: M15N2MMxe = 8147 + INTEGER(IntKi), PARAMETER :: M15N3MMxe = 8148 + INTEGER(IntKi), PARAMETER :: M15N4MMxe = 8149 + INTEGER(IntKi), PARAMETER :: M15N5MMxe = 8150 + INTEGER(IntKi), PARAMETER :: M15N6MMxe = 8151 + INTEGER(IntKi), PARAMETER :: M15N7MMxe = 8152 + INTEGER(IntKi), PARAMETER :: M15N8MMxe = 8153 + INTEGER(IntKi), PARAMETER :: M15N9MMxe = 8154 + INTEGER(IntKi), PARAMETER :: M16N1MMxe = 8155 + INTEGER(IntKi), PARAMETER :: M16N2MMxe = 8156 + INTEGER(IntKi), PARAMETER :: M16N3MMxe = 8157 + INTEGER(IntKi), PARAMETER :: M16N4MMxe = 8158 + INTEGER(IntKi), PARAMETER :: M16N5MMxe = 8159 + INTEGER(IntKi), PARAMETER :: M16N6MMxe = 8160 + INTEGER(IntKi), PARAMETER :: M16N7MMxe = 8161 + INTEGER(IntKi), PARAMETER :: M16N8MMxe = 8162 + INTEGER(IntKi), PARAMETER :: M16N9MMxe = 8163 + INTEGER(IntKi), PARAMETER :: M17N1MMxe = 8164 + INTEGER(IntKi), PARAMETER :: M17N2MMxe = 8165 + INTEGER(IntKi), PARAMETER :: M17N3MMxe = 8166 + INTEGER(IntKi), PARAMETER :: M17N4MMxe = 8167 + INTEGER(IntKi), PARAMETER :: M17N5MMxe = 8168 + INTEGER(IntKi), PARAMETER :: M17N6MMxe = 8169 + INTEGER(IntKi), PARAMETER :: M17N7MMxe = 8170 + INTEGER(IntKi), PARAMETER :: M17N8MMxe = 8171 + INTEGER(IntKi), PARAMETER :: M17N9MMxe = 8172 + INTEGER(IntKi), PARAMETER :: M18N1MMxe = 8173 + INTEGER(IntKi), PARAMETER :: M18N2MMxe = 8174 + INTEGER(IntKi), PARAMETER :: M18N3MMxe = 8175 + INTEGER(IntKi), PARAMETER :: M18N4MMxe = 8176 + INTEGER(IntKi), PARAMETER :: M18N5MMxe = 8177 + INTEGER(IntKi), PARAMETER :: M18N6MMxe = 8178 + INTEGER(IntKi), PARAMETER :: M18N7MMxe = 8179 + INTEGER(IntKi), PARAMETER :: M18N8MMxe = 8180 + INTEGER(IntKi), PARAMETER :: M18N9MMxe = 8181 + INTEGER(IntKi), PARAMETER :: M19N1MMxe = 8182 + INTEGER(IntKi), PARAMETER :: M19N2MMxe = 8183 + INTEGER(IntKi), PARAMETER :: M19N3MMxe = 8184 + INTEGER(IntKi), PARAMETER :: M19N4MMxe = 8185 + INTEGER(IntKi), PARAMETER :: M19N5MMxe = 8186 + INTEGER(IntKi), PARAMETER :: M19N6MMxe = 8187 + INTEGER(IntKi), PARAMETER :: M19N7MMxe = 8188 + INTEGER(IntKi), PARAMETER :: M19N8MMxe = 8189 + INTEGER(IntKi), PARAMETER :: M19N9MMxe = 8190 + INTEGER(IntKi), PARAMETER :: M20N1MMxe = 8191 + INTEGER(IntKi), PARAMETER :: M20N2MMxe = 8192 + INTEGER(IntKi), PARAMETER :: M20N3MMxe = 8193 + INTEGER(IntKi), PARAMETER :: M20N4MMxe = 8194 + INTEGER(IntKi), PARAMETER :: M20N5MMxe = 8195 + INTEGER(IntKi), PARAMETER :: M20N6MMxe = 8196 + INTEGER(IntKi), PARAMETER :: M20N7MMxe = 8197 + INTEGER(IntKi), PARAMETER :: M20N8MMxe = 8198 + INTEGER(IntKi), PARAMETER :: M20N9MMxe = 8199 + INTEGER(IntKi), PARAMETER :: M21N1MMxe = 8200 + INTEGER(IntKi), PARAMETER :: M21N2MMxe = 8201 + INTEGER(IntKi), PARAMETER :: M21N3MMxe = 8202 + INTEGER(IntKi), PARAMETER :: M21N4MMxe = 8203 + INTEGER(IntKi), PARAMETER :: M21N5MMxe = 8204 + INTEGER(IntKi), PARAMETER :: M21N6MMxe = 8205 + INTEGER(IntKi), PARAMETER :: M21N7MMxe = 8206 + INTEGER(IntKi), PARAMETER :: M21N8MMxe = 8207 + INTEGER(IntKi), PARAMETER :: M21N9MMxe = 8208 + INTEGER(IntKi), PARAMETER :: M22N1MMxe = 8209 + INTEGER(IntKi), PARAMETER :: M22N2MMxe = 8210 + INTEGER(IntKi), PARAMETER :: M22N3MMxe = 8211 + INTEGER(IntKi), PARAMETER :: M22N4MMxe = 8212 + INTEGER(IntKi), PARAMETER :: M22N5MMxe = 8213 + INTEGER(IntKi), PARAMETER :: M22N6MMxe = 8214 + INTEGER(IntKi), PARAMETER :: M22N7MMxe = 8215 + INTEGER(IntKi), PARAMETER :: M22N8MMxe = 8216 + INTEGER(IntKi), PARAMETER :: M22N9MMxe = 8217 + INTEGER(IntKi), PARAMETER :: M23N1MMxe = 8218 + INTEGER(IntKi), PARAMETER :: M23N2MMxe = 8219 + INTEGER(IntKi), PARAMETER :: M23N3MMxe = 8220 + INTEGER(IntKi), PARAMETER :: M23N4MMxe = 8221 + INTEGER(IntKi), PARAMETER :: M23N5MMxe = 8222 + INTEGER(IntKi), PARAMETER :: M23N6MMxe = 8223 + INTEGER(IntKi), PARAMETER :: M23N7MMxe = 8224 + INTEGER(IntKi), PARAMETER :: M23N8MMxe = 8225 + INTEGER(IntKi), PARAMETER :: M23N9MMxe = 8226 + INTEGER(IntKi), PARAMETER :: M24N1MMxe = 8227 + INTEGER(IntKi), PARAMETER :: M24N2MMxe = 8228 + INTEGER(IntKi), PARAMETER :: M24N3MMxe = 8229 + INTEGER(IntKi), PARAMETER :: M24N4MMxe = 8230 + INTEGER(IntKi), PARAMETER :: M24N5MMxe = 8231 + INTEGER(IntKi), PARAMETER :: M24N6MMxe = 8232 + INTEGER(IntKi), PARAMETER :: M24N7MMxe = 8233 + INTEGER(IntKi), PARAMETER :: M24N8MMxe = 8234 + INTEGER(IntKi), PARAMETER :: M24N9MMxe = 8235 + INTEGER(IntKi), PARAMETER :: M25N1MMxe = 8236 + INTEGER(IntKi), PARAMETER :: M25N2MMxe = 8237 + INTEGER(IntKi), PARAMETER :: M25N3MMxe = 8238 + INTEGER(IntKi), PARAMETER :: M25N4MMxe = 8239 + INTEGER(IntKi), PARAMETER :: M25N5MMxe = 8240 + INTEGER(IntKi), PARAMETER :: M25N6MMxe = 8241 + INTEGER(IntKi), PARAMETER :: M25N7MMxe = 8242 + INTEGER(IntKi), PARAMETER :: M25N8MMxe = 8243 + INTEGER(IntKi), PARAMETER :: M25N9MMxe = 8244 + INTEGER(IntKi), PARAMETER :: M26N1MMxe = 8245 + INTEGER(IntKi), PARAMETER :: M26N2MMxe = 8246 + INTEGER(IntKi), PARAMETER :: M26N3MMxe = 8247 + INTEGER(IntKi), PARAMETER :: M26N4MMxe = 8248 + INTEGER(IntKi), PARAMETER :: M26N5MMxe = 8249 + INTEGER(IntKi), PARAMETER :: M26N6MMxe = 8250 + INTEGER(IntKi), PARAMETER :: M26N7MMxe = 8251 + INTEGER(IntKi), PARAMETER :: M26N8MMxe = 8252 + INTEGER(IntKi), PARAMETER :: M26N9MMxe = 8253 + INTEGER(IntKi), PARAMETER :: M27N1MMxe = 8254 + INTEGER(IntKi), PARAMETER :: M27N2MMxe = 8255 + INTEGER(IntKi), PARAMETER :: M27N3MMxe = 8256 + INTEGER(IntKi), PARAMETER :: M27N4MMxe = 8257 + INTEGER(IntKi), PARAMETER :: M27N5MMxe = 8258 + INTEGER(IntKi), PARAMETER :: M27N6MMxe = 8259 + INTEGER(IntKi), PARAMETER :: M27N7MMxe = 8260 + INTEGER(IntKi), PARAMETER :: M27N8MMxe = 8261 + INTEGER(IntKi), PARAMETER :: M27N9MMxe = 8262 + INTEGER(IntKi), PARAMETER :: M28N1MMxe = 8263 + INTEGER(IntKi), PARAMETER :: M28N2MMxe = 8264 + INTEGER(IntKi), PARAMETER :: M28N3MMxe = 8265 + INTEGER(IntKi), PARAMETER :: M28N4MMxe = 8266 + INTEGER(IntKi), PARAMETER :: M28N5MMxe = 8267 + INTEGER(IntKi), PARAMETER :: M28N6MMxe = 8268 + INTEGER(IntKi), PARAMETER :: M28N7MMxe = 8269 + INTEGER(IntKi), PARAMETER :: M28N8MMxe = 8270 + INTEGER(IntKi), PARAMETER :: M28N9MMxe = 8271 + INTEGER(IntKi), PARAMETER :: M29N1MMxe = 8272 + INTEGER(IntKi), PARAMETER :: M29N2MMxe = 8273 + INTEGER(IntKi), PARAMETER :: M29N3MMxe = 8274 + INTEGER(IntKi), PARAMETER :: M29N4MMxe = 8275 + INTEGER(IntKi), PARAMETER :: M29N5MMxe = 8276 + INTEGER(IntKi), PARAMETER :: M29N6MMxe = 8277 + INTEGER(IntKi), PARAMETER :: M29N7MMxe = 8278 + INTEGER(IntKi), PARAMETER :: M29N8MMxe = 8279 + INTEGER(IntKi), PARAMETER :: M29N9MMxe = 8280 + INTEGER(IntKi), PARAMETER :: M30N1MMxe = 8281 + INTEGER(IntKi), PARAMETER :: M30N2MMxe = 8282 + INTEGER(IntKi), PARAMETER :: M30N3MMxe = 8283 + INTEGER(IntKi), PARAMETER :: M30N4MMxe = 8284 + INTEGER(IntKi), PARAMETER :: M30N5MMxe = 8285 + INTEGER(IntKi), PARAMETER :: M30N6MMxe = 8286 + INTEGER(IntKi), PARAMETER :: M30N7MMxe = 8287 + INTEGER(IntKi), PARAMETER :: M30N8MMxe = 8288 + INTEGER(IntKi), PARAMETER :: M30N9MMxe = 8289 + INTEGER(IntKi), PARAMETER :: M31N1MMxe = 8290 + INTEGER(IntKi), PARAMETER :: M31N2MMxe = 8291 + INTEGER(IntKi), PARAMETER :: M31N3MMxe = 8292 + INTEGER(IntKi), PARAMETER :: M31N4MMxe = 8293 + INTEGER(IntKi), PARAMETER :: M31N5MMxe = 8294 + INTEGER(IntKi), PARAMETER :: M31N6MMxe = 8295 + INTEGER(IntKi), PARAMETER :: M31N7MMxe = 8296 + INTEGER(IntKi), PARAMETER :: M31N8MMxe = 8297 + INTEGER(IntKi), PARAMETER :: M31N9MMxe = 8298 + INTEGER(IntKi), PARAMETER :: M32N1MMxe = 8299 + INTEGER(IntKi), PARAMETER :: M32N2MMxe = 8300 + INTEGER(IntKi), PARAMETER :: M32N3MMxe = 8301 + INTEGER(IntKi), PARAMETER :: M32N4MMxe = 8302 + INTEGER(IntKi), PARAMETER :: M32N5MMxe = 8303 + INTEGER(IntKi), PARAMETER :: M32N6MMxe = 8304 + INTEGER(IntKi), PARAMETER :: M32N7MMxe = 8305 + INTEGER(IntKi), PARAMETER :: M32N8MMxe = 8306 + INTEGER(IntKi), PARAMETER :: M32N9MMxe = 8307 + INTEGER(IntKi), PARAMETER :: M33N1MMxe = 8308 + INTEGER(IntKi), PARAMETER :: M33N2MMxe = 8309 + INTEGER(IntKi), PARAMETER :: M33N3MMxe = 8310 + INTEGER(IntKi), PARAMETER :: M33N4MMxe = 8311 + INTEGER(IntKi), PARAMETER :: M33N5MMxe = 8312 + INTEGER(IntKi), PARAMETER :: M33N6MMxe = 8313 + INTEGER(IntKi), PARAMETER :: M33N7MMxe = 8314 + INTEGER(IntKi), PARAMETER :: M33N8MMxe = 8315 + INTEGER(IntKi), PARAMETER :: M33N9MMxe = 8316 + INTEGER(IntKi), PARAMETER :: M34N1MMxe = 8317 + INTEGER(IntKi), PARAMETER :: M34N2MMxe = 8318 + INTEGER(IntKi), PARAMETER :: M34N3MMxe = 8319 + INTEGER(IntKi), PARAMETER :: M34N4MMxe = 8320 + INTEGER(IntKi), PARAMETER :: M34N5MMxe = 8321 + INTEGER(IntKi), PARAMETER :: M34N6MMxe = 8322 + INTEGER(IntKi), PARAMETER :: M34N7MMxe = 8323 + INTEGER(IntKi), PARAMETER :: M34N8MMxe = 8324 + INTEGER(IntKi), PARAMETER :: M34N9MMxe = 8325 + INTEGER(IntKi), PARAMETER :: M35N1MMxe = 8326 + INTEGER(IntKi), PARAMETER :: M35N2MMxe = 8327 + INTEGER(IntKi), PARAMETER :: M35N3MMxe = 8328 + INTEGER(IntKi), PARAMETER :: M35N4MMxe = 8329 + INTEGER(IntKi), PARAMETER :: M35N5MMxe = 8330 + INTEGER(IntKi), PARAMETER :: M35N6MMxe = 8331 + INTEGER(IntKi), PARAMETER :: M35N7MMxe = 8332 + INTEGER(IntKi), PARAMETER :: M35N8MMxe = 8333 + INTEGER(IntKi), PARAMETER :: M35N9MMxe = 8334 + INTEGER(IntKi), PARAMETER :: M36N1MMxe = 8335 + INTEGER(IntKi), PARAMETER :: M36N2MMxe = 8336 + INTEGER(IntKi), PARAMETER :: M36N3MMxe = 8337 + INTEGER(IntKi), PARAMETER :: M36N4MMxe = 8338 + INTEGER(IntKi), PARAMETER :: M36N5MMxe = 8339 + INTEGER(IntKi), PARAMETER :: M36N6MMxe = 8340 + INTEGER(IntKi), PARAMETER :: M36N7MMxe = 8341 + INTEGER(IntKi), PARAMETER :: M36N8MMxe = 8342 + INTEGER(IntKi), PARAMETER :: M36N9MMxe = 8343 + INTEGER(IntKi), PARAMETER :: M37N1MMxe = 8344 + INTEGER(IntKi), PARAMETER :: M37N2MMxe = 8345 + INTEGER(IntKi), PARAMETER :: M37N3MMxe = 8346 + INTEGER(IntKi), PARAMETER :: M37N4MMxe = 8347 + INTEGER(IntKi), PARAMETER :: M37N5MMxe = 8348 + INTEGER(IntKi), PARAMETER :: M37N6MMxe = 8349 + INTEGER(IntKi), PARAMETER :: M37N7MMxe = 8350 + INTEGER(IntKi), PARAMETER :: M37N8MMxe = 8351 + INTEGER(IntKi), PARAMETER :: M37N9MMxe = 8352 + INTEGER(IntKi), PARAMETER :: M38N1MMxe = 8353 + INTEGER(IntKi), PARAMETER :: M38N2MMxe = 8354 + INTEGER(IntKi), PARAMETER :: M38N3MMxe = 8355 + INTEGER(IntKi), PARAMETER :: M38N4MMxe = 8356 + INTEGER(IntKi), PARAMETER :: M38N5MMxe = 8357 + INTEGER(IntKi), PARAMETER :: M38N6MMxe = 8358 + INTEGER(IntKi), PARAMETER :: M38N7MMxe = 8359 + INTEGER(IntKi), PARAMETER :: M38N8MMxe = 8360 + INTEGER(IntKi), PARAMETER :: M38N9MMxe = 8361 + INTEGER(IntKi), PARAMETER :: M39N1MMxe = 8362 + INTEGER(IntKi), PARAMETER :: M39N2MMxe = 8363 + INTEGER(IntKi), PARAMETER :: M39N3MMxe = 8364 + INTEGER(IntKi), PARAMETER :: M39N4MMxe = 8365 + INTEGER(IntKi), PARAMETER :: M39N5MMxe = 8366 + INTEGER(IntKi), PARAMETER :: M39N6MMxe = 8367 + INTEGER(IntKi), PARAMETER :: M39N7MMxe = 8368 + INTEGER(IntKi), PARAMETER :: M39N8MMxe = 8369 + INTEGER(IntKi), PARAMETER :: M39N9MMxe = 8370 + INTEGER(IntKi), PARAMETER :: M40N1MMxe = 8371 + INTEGER(IntKi), PARAMETER :: M40N2MMxe = 8372 + INTEGER(IntKi), PARAMETER :: M40N3MMxe = 8373 + INTEGER(IntKi), PARAMETER :: M40N4MMxe = 8374 + INTEGER(IntKi), PARAMETER :: M40N5MMxe = 8375 + INTEGER(IntKi), PARAMETER :: M40N6MMxe = 8376 + INTEGER(IntKi), PARAMETER :: M40N7MMxe = 8377 + INTEGER(IntKi), PARAMETER :: M40N8MMxe = 8378 + INTEGER(IntKi), PARAMETER :: M40N9MMxe = 8379 + INTEGER(IntKi), PARAMETER :: M41N1MMxe = 8380 + INTEGER(IntKi), PARAMETER :: M41N2MMxe = 8381 + INTEGER(IntKi), PARAMETER :: M41N3MMxe = 8382 + INTEGER(IntKi), PARAMETER :: M41N4MMxe = 8383 + INTEGER(IntKi), PARAMETER :: M41N5MMxe = 8384 + INTEGER(IntKi), PARAMETER :: M41N6MMxe = 8385 + INTEGER(IntKi), PARAMETER :: M41N7MMxe = 8386 + INTEGER(IntKi), PARAMETER :: M41N8MMxe = 8387 + INTEGER(IntKi), PARAMETER :: M41N9MMxe = 8388 + INTEGER(IntKi), PARAMETER :: M42N1MMxe = 8389 + INTEGER(IntKi), PARAMETER :: M42N2MMxe = 8390 + INTEGER(IntKi), PARAMETER :: M42N3MMxe = 8391 + INTEGER(IntKi), PARAMETER :: M42N4MMxe = 8392 + INTEGER(IntKi), PARAMETER :: M42N5MMxe = 8393 + INTEGER(IntKi), PARAMETER :: M42N6MMxe = 8394 + INTEGER(IntKi), PARAMETER :: M42N7MMxe = 8395 + INTEGER(IntKi), PARAMETER :: M42N8MMxe = 8396 + INTEGER(IntKi), PARAMETER :: M42N9MMxe = 8397 + INTEGER(IntKi), PARAMETER :: M43N1MMxe = 8398 + INTEGER(IntKi), PARAMETER :: M43N2MMxe = 8399 + INTEGER(IntKi), PARAMETER :: M43N3MMxe = 8400 + INTEGER(IntKi), PARAMETER :: M43N4MMxe = 8401 + INTEGER(IntKi), PARAMETER :: M43N5MMxe = 8402 + INTEGER(IntKi), PARAMETER :: M43N6MMxe = 8403 + INTEGER(IntKi), PARAMETER :: M43N7MMxe = 8404 + INTEGER(IntKi), PARAMETER :: M43N8MMxe = 8405 + INTEGER(IntKi), PARAMETER :: M43N9MMxe = 8406 + INTEGER(IntKi), PARAMETER :: M44N1MMxe = 8407 + INTEGER(IntKi), PARAMETER :: M44N2MMxe = 8408 + INTEGER(IntKi), PARAMETER :: M44N3MMxe = 8409 + INTEGER(IntKi), PARAMETER :: M44N4MMxe = 8410 + INTEGER(IntKi), PARAMETER :: M44N5MMxe = 8411 + INTEGER(IntKi), PARAMETER :: M44N6MMxe = 8412 + INTEGER(IntKi), PARAMETER :: M44N7MMxe = 8413 + INTEGER(IntKi), PARAMETER :: M44N8MMxe = 8414 + INTEGER(IntKi), PARAMETER :: M44N9MMxe = 8415 + INTEGER(IntKi), PARAMETER :: M45N1MMxe = 8416 + INTEGER(IntKi), PARAMETER :: M45N2MMxe = 8417 + INTEGER(IntKi), PARAMETER :: M45N3MMxe = 8418 + INTEGER(IntKi), PARAMETER :: M45N4MMxe = 8419 + INTEGER(IntKi), PARAMETER :: M45N5MMxe = 8420 + INTEGER(IntKi), PARAMETER :: M45N6MMxe = 8421 + INTEGER(IntKi), PARAMETER :: M45N7MMxe = 8422 + INTEGER(IntKi), PARAMETER :: M45N8MMxe = 8423 + INTEGER(IntKi), PARAMETER :: M45N9MMxe = 8424 + INTEGER(IntKi), PARAMETER :: M46N1MMxe = 8425 + INTEGER(IntKi), PARAMETER :: M46N2MMxe = 8426 + INTEGER(IntKi), PARAMETER :: M46N3MMxe = 8427 + INTEGER(IntKi), PARAMETER :: M46N4MMxe = 8428 + INTEGER(IntKi), PARAMETER :: M46N5MMxe = 8429 + INTEGER(IntKi), PARAMETER :: M46N6MMxe = 8430 + INTEGER(IntKi), PARAMETER :: M46N7MMxe = 8431 + INTEGER(IntKi), PARAMETER :: M46N8MMxe = 8432 + INTEGER(IntKi), PARAMETER :: M46N9MMxe = 8433 + INTEGER(IntKi), PARAMETER :: M47N1MMxe = 8434 + INTEGER(IntKi), PARAMETER :: M47N2MMxe = 8435 + INTEGER(IntKi), PARAMETER :: M47N3MMxe = 8436 + INTEGER(IntKi), PARAMETER :: M47N4MMxe = 8437 + INTEGER(IntKi), PARAMETER :: M47N5MMxe = 8438 + INTEGER(IntKi), PARAMETER :: M47N6MMxe = 8439 + INTEGER(IntKi), PARAMETER :: M47N7MMxe = 8440 + INTEGER(IntKi), PARAMETER :: M47N8MMxe = 8441 + INTEGER(IntKi), PARAMETER :: M47N9MMxe = 8442 + INTEGER(IntKi), PARAMETER :: M48N1MMxe = 8443 + INTEGER(IntKi), PARAMETER :: M48N2MMxe = 8444 + INTEGER(IntKi), PARAMETER :: M48N3MMxe = 8445 + INTEGER(IntKi), PARAMETER :: M48N4MMxe = 8446 + INTEGER(IntKi), PARAMETER :: M48N5MMxe = 8447 + INTEGER(IntKi), PARAMETER :: M48N6MMxe = 8448 + INTEGER(IntKi), PARAMETER :: M48N7MMxe = 8449 + INTEGER(IntKi), PARAMETER :: M48N8MMxe = 8450 + INTEGER(IntKi), PARAMETER :: M48N9MMxe = 8451 + INTEGER(IntKi), PARAMETER :: M49N1MMxe = 8452 + INTEGER(IntKi), PARAMETER :: M49N2MMxe = 8453 + INTEGER(IntKi), PARAMETER :: M49N3MMxe = 8454 + INTEGER(IntKi), PARAMETER :: M49N4MMxe = 8455 + INTEGER(IntKi), PARAMETER :: M49N5MMxe = 8456 + INTEGER(IntKi), PARAMETER :: M49N6MMxe = 8457 + INTEGER(IntKi), PARAMETER :: M49N7MMxe = 8458 + INTEGER(IntKi), PARAMETER :: M49N8MMxe = 8459 + INTEGER(IntKi), PARAMETER :: M49N9MMxe = 8460 + INTEGER(IntKi), PARAMETER :: M50N1MMxe = 8461 + INTEGER(IntKi), PARAMETER :: M50N2MMxe = 8462 + INTEGER(IntKi), PARAMETER :: M50N3MMxe = 8463 + INTEGER(IntKi), PARAMETER :: M50N4MMxe = 8464 + INTEGER(IntKi), PARAMETER :: M50N5MMxe = 8465 + INTEGER(IntKi), PARAMETER :: M50N6MMxe = 8466 + INTEGER(IntKi), PARAMETER :: M50N7MMxe = 8467 + INTEGER(IntKi), PARAMETER :: M50N8MMxe = 8468 + INTEGER(IntKi), PARAMETER :: M50N9MMxe = 8469 + INTEGER(IntKi), PARAMETER :: M51N1MMxe = 8470 + INTEGER(IntKi), PARAMETER :: M51N2MMxe = 8471 + INTEGER(IntKi), PARAMETER :: M51N3MMxe = 8472 + INTEGER(IntKi), PARAMETER :: M51N4MMxe = 8473 + INTEGER(IntKi), PARAMETER :: M51N5MMxe = 8474 + INTEGER(IntKi), PARAMETER :: M51N6MMxe = 8475 + INTEGER(IntKi), PARAMETER :: M51N7MMxe = 8476 + INTEGER(IntKi), PARAMETER :: M51N8MMxe = 8477 + INTEGER(IntKi), PARAMETER :: M51N9MMxe = 8478 + INTEGER(IntKi), PARAMETER :: M52N1MMxe = 8479 + INTEGER(IntKi), PARAMETER :: M52N2MMxe = 8480 + INTEGER(IntKi), PARAMETER :: M52N3MMxe = 8481 + INTEGER(IntKi), PARAMETER :: M52N4MMxe = 8482 + INTEGER(IntKi), PARAMETER :: M52N5MMxe = 8483 + INTEGER(IntKi), PARAMETER :: M52N6MMxe = 8484 + INTEGER(IntKi), PARAMETER :: M52N7MMxe = 8485 + INTEGER(IntKi), PARAMETER :: M52N8MMxe = 8486 + INTEGER(IntKi), PARAMETER :: M52N9MMxe = 8487 + INTEGER(IntKi), PARAMETER :: M53N1MMxe = 8488 + INTEGER(IntKi), PARAMETER :: M53N2MMxe = 8489 + INTEGER(IntKi), PARAMETER :: M53N3MMxe = 8490 + INTEGER(IntKi), PARAMETER :: M53N4MMxe = 8491 + INTEGER(IntKi), PARAMETER :: M53N5MMxe = 8492 + INTEGER(IntKi), PARAMETER :: M53N6MMxe = 8493 + INTEGER(IntKi), PARAMETER :: M53N7MMxe = 8494 + INTEGER(IntKi), PARAMETER :: M53N8MMxe = 8495 + INTEGER(IntKi), PARAMETER :: M53N9MMxe = 8496 + INTEGER(IntKi), PARAMETER :: M54N1MMxe = 8497 + INTEGER(IntKi), PARAMETER :: M54N2MMxe = 8498 + INTEGER(IntKi), PARAMETER :: M54N3MMxe = 8499 + INTEGER(IntKi), PARAMETER :: M54N4MMxe = 8500 + INTEGER(IntKi), PARAMETER :: M54N5MMxe = 8501 + INTEGER(IntKi), PARAMETER :: M54N6MMxe = 8502 + INTEGER(IntKi), PARAMETER :: M54N7MMxe = 8503 + INTEGER(IntKi), PARAMETER :: M54N8MMxe = 8504 + INTEGER(IntKi), PARAMETER :: M54N9MMxe = 8505 + INTEGER(IntKi), PARAMETER :: M55N1MMxe = 8506 + INTEGER(IntKi), PARAMETER :: M55N2MMxe = 8507 + INTEGER(IntKi), PARAMETER :: M55N3MMxe = 8508 + INTEGER(IntKi), PARAMETER :: M55N4MMxe = 8509 + INTEGER(IntKi), PARAMETER :: M55N5MMxe = 8510 + INTEGER(IntKi), PARAMETER :: M55N6MMxe = 8511 + INTEGER(IntKi), PARAMETER :: M55N7MMxe = 8512 + INTEGER(IntKi), PARAMETER :: M55N8MMxe = 8513 + INTEGER(IntKi), PARAMETER :: M55N9MMxe = 8514 + INTEGER(IntKi), PARAMETER :: M56N1MMxe = 8515 + INTEGER(IntKi), PARAMETER :: M56N2MMxe = 8516 + INTEGER(IntKi), PARAMETER :: M56N3MMxe = 8517 + INTEGER(IntKi), PARAMETER :: M56N4MMxe = 8518 + INTEGER(IntKi), PARAMETER :: M56N5MMxe = 8519 + INTEGER(IntKi), PARAMETER :: M56N6MMxe = 8520 + INTEGER(IntKi), PARAMETER :: M56N7MMxe = 8521 + INTEGER(IntKi), PARAMETER :: M56N8MMxe = 8522 + INTEGER(IntKi), PARAMETER :: M56N9MMxe = 8523 + INTEGER(IntKi), PARAMETER :: M57N1MMxe = 8524 + INTEGER(IntKi), PARAMETER :: M57N2MMxe = 8525 + INTEGER(IntKi), PARAMETER :: M57N3MMxe = 8526 + INTEGER(IntKi), PARAMETER :: M57N4MMxe = 8527 + INTEGER(IntKi), PARAMETER :: M57N5MMxe = 8528 + INTEGER(IntKi), PARAMETER :: M57N6MMxe = 8529 + INTEGER(IntKi), PARAMETER :: M57N7MMxe = 8530 + INTEGER(IntKi), PARAMETER :: M57N8MMxe = 8531 + INTEGER(IntKi), PARAMETER :: M57N9MMxe = 8532 + INTEGER(IntKi), PARAMETER :: M58N1MMxe = 8533 + INTEGER(IntKi), PARAMETER :: M58N2MMxe = 8534 + INTEGER(IntKi), PARAMETER :: M58N3MMxe = 8535 + INTEGER(IntKi), PARAMETER :: M58N4MMxe = 8536 + INTEGER(IntKi), PARAMETER :: M58N5MMxe = 8537 + INTEGER(IntKi), PARAMETER :: M58N6MMxe = 8538 + INTEGER(IntKi), PARAMETER :: M58N7MMxe = 8539 + INTEGER(IntKi), PARAMETER :: M58N8MMxe = 8540 + INTEGER(IntKi), PARAMETER :: M58N9MMxe = 8541 + INTEGER(IntKi), PARAMETER :: M59N1MMxe = 8542 + INTEGER(IntKi), PARAMETER :: M59N2MMxe = 8543 + INTEGER(IntKi), PARAMETER :: M59N3MMxe = 8544 + INTEGER(IntKi), PARAMETER :: M59N4MMxe = 8545 + INTEGER(IntKi), PARAMETER :: M59N5MMxe = 8546 + INTEGER(IntKi), PARAMETER :: M59N6MMxe = 8547 + INTEGER(IntKi), PARAMETER :: M59N7MMxe = 8548 + INTEGER(IntKi), PARAMETER :: M59N8MMxe = 8549 + INTEGER(IntKi), PARAMETER :: M59N9MMxe = 8550 + INTEGER(IntKi), PARAMETER :: M60N1MMxe = 8551 + INTEGER(IntKi), PARAMETER :: M60N2MMxe = 8552 + INTEGER(IntKi), PARAMETER :: M60N3MMxe = 8553 + INTEGER(IntKi), PARAMETER :: M60N4MMxe = 8554 + INTEGER(IntKi), PARAMETER :: M60N5MMxe = 8555 + INTEGER(IntKi), PARAMETER :: M60N6MMxe = 8556 + INTEGER(IntKi), PARAMETER :: M60N7MMxe = 8557 + INTEGER(IntKi), PARAMETER :: M60N8MMxe = 8558 + INTEGER(IntKi), PARAMETER :: M60N9MMxe = 8559 + INTEGER(IntKi), PARAMETER :: M61N1MMxe = 8560 + INTEGER(IntKi), PARAMETER :: M61N2MMxe = 8561 + INTEGER(IntKi), PARAMETER :: M61N3MMxe = 8562 + INTEGER(IntKi), PARAMETER :: M61N4MMxe = 8563 + INTEGER(IntKi), PARAMETER :: M61N5MMxe = 8564 + INTEGER(IntKi), PARAMETER :: M61N6MMxe = 8565 + INTEGER(IntKi), PARAMETER :: M61N7MMxe = 8566 + INTEGER(IntKi), PARAMETER :: M61N8MMxe = 8567 + INTEGER(IntKi), PARAMETER :: M61N9MMxe = 8568 + INTEGER(IntKi), PARAMETER :: M62N1MMxe = 8569 + INTEGER(IntKi), PARAMETER :: M62N2MMxe = 8570 + INTEGER(IntKi), PARAMETER :: M62N3MMxe = 8571 + INTEGER(IntKi), PARAMETER :: M62N4MMxe = 8572 + INTEGER(IntKi), PARAMETER :: M62N5MMxe = 8573 + INTEGER(IntKi), PARAMETER :: M62N6MMxe = 8574 + INTEGER(IntKi), PARAMETER :: M62N7MMxe = 8575 + INTEGER(IntKi), PARAMETER :: M62N8MMxe = 8576 + INTEGER(IntKi), PARAMETER :: M62N9MMxe = 8577 + INTEGER(IntKi), PARAMETER :: M63N1MMxe = 8578 + INTEGER(IntKi), PARAMETER :: M63N2MMxe = 8579 + INTEGER(IntKi), PARAMETER :: M63N3MMxe = 8580 + INTEGER(IntKi), PARAMETER :: M63N4MMxe = 8581 + INTEGER(IntKi), PARAMETER :: M63N5MMxe = 8582 + INTEGER(IntKi), PARAMETER :: M63N6MMxe = 8583 + INTEGER(IntKi), PARAMETER :: M63N7MMxe = 8584 + INTEGER(IntKi), PARAMETER :: M63N8MMxe = 8585 + INTEGER(IntKi), PARAMETER :: M63N9MMxe = 8586 + INTEGER(IntKi), PARAMETER :: M64N1MMxe = 8587 + INTEGER(IntKi), PARAMETER :: M64N2MMxe = 8588 + INTEGER(IntKi), PARAMETER :: M64N3MMxe = 8589 + INTEGER(IntKi), PARAMETER :: M64N4MMxe = 8590 + INTEGER(IntKi), PARAMETER :: M64N5MMxe = 8591 + INTEGER(IntKi), PARAMETER :: M64N6MMxe = 8592 + INTEGER(IntKi), PARAMETER :: M64N7MMxe = 8593 + INTEGER(IntKi), PARAMETER :: M64N8MMxe = 8594 + INTEGER(IntKi), PARAMETER :: M64N9MMxe = 8595 + INTEGER(IntKi), PARAMETER :: M65N1MMxe = 8596 + INTEGER(IntKi), PARAMETER :: M65N2MMxe = 8597 + INTEGER(IntKi), PARAMETER :: M65N3MMxe = 8598 + INTEGER(IntKi), PARAMETER :: M65N4MMxe = 8599 + INTEGER(IntKi), PARAMETER :: M65N5MMxe = 8600 + INTEGER(IntKi), PARAMETER :: M65N6MMxe = 8601 + INTEGER(IntKi), PARAMETER :: M65N7MMxe = 8602 + INTEGER(IntKi), PARAMETER :: M65N8MMxe = 8603 + INTEGER(IntKi), PARAMETER :: M65N9MMxe = 8604 + INTEGER(IntKi), PARAMETER :: M66N1MMxe = 8605 + INTEGER(IntKi), PARAMETER :: M66N2MMxe = 8606 + INTEGER(IntKi), PARAMETER :: M66N3MMxe = 8607 + INTEGER(IntKi), PARAMETER :: M66N4MMxe = 8608 + INTEGER(IntKi), PARAMETER :: M66N5MMxe = 8609 + INTEGER(IntKi), PARAMETER :: M66N6MMxe = 8610 + INTEGER(IntKi), PARAMETER :: M66N7MMxe = 8611 + INTEGER(IntKi), PARAMETER :: M66N8MMxe = 8612 + INTEGER(IntKi), PARAMETER :: M66N9MMxe = 8613 + INTEGER(IntKi), PARAMETER :: M67N1MMxe = 8614 + INTEGER(IntKi), PARAMETER :: M67N2MMxe = 8615 + INTEGER(IntKi), PARAMETER :: M67N3MMxe = 8616 + INTEGER(IntKi), PARAMETER :: M67N4MMxe = 8617 + INTEGER(IntKi), PARAMETER :: M67N5MMxe = 8618 + INTEGER(IntKi), PARAMETER :: M67N6MMxe = 8619 + INTEGER(IntKi), PARAMETER :: M67N7MMxe = 8620 + INTEGER(IntKi), PARAMETER :: M67N8MMxe = 8621 + INTEGER(IntKi), PARAMETER :: M67N9MMxe = 8622 + INTEGER(IntKi), PARAMETER :: M68N1MMxe = 8623 + INTEGER(IntKi), PARAMETER :: M68N2MMxe = 8624 + INTEGER(IntKi), PARAMETER :: M68N3MMxe = 8625 + INTEGER(IntKi), PARAMETER :: M68N4MMxe = 8626 + INTEGER(IntKi), PARAMETER :: M68N5MMxe = 8627 + INTEGER(IntKi), PARAMETER :: M68N6MMxe = 8628 + INTEGER(IntKi), PARAMETER :: M68N7MMxe = 8629 + INTEGER(IntKi), PARAMETER :: M68N8MMxe = 8630 + INTEGER(IntKi), PARAMETER :: M68N9MMxe = 8631 + INTEGER(IntKi), PARAMETER :: M69N1MMxe = 8632 + INTEGER(IntKi), PARAMETER :: M69N2MMxe = 8633 + INTEGER(IntKi), PARAMETER :: M69N3MMxe = 8634 + INTEGER(IntKi), PARAMETER :: M69N4MMxe = 8635 + INTEGER(IntKi), PARAMETER :: M69N5MMxe = 8636 + INTEGER(IntKi), PARAMETER :: M69N6MMxe = 8637 + INTEGER(IntKi), PARAMETER :: M69N7MMxe = 8638 + INTEGER(IntKi), PARAMETER :: M69N8MMxe = 8639 + INTEGER(IntKi), PARAMETER :: M69N9MMxe = 8640 + INTEGER(IntKi), PARAMETER :: M70N1MMxe = 8641 + INTEGER(IntKi), PARAMETER :: M70N2MMxe = 8642 + INTEGER(IntKi), PARAMETER :: M70N3MMxe = 8643 + INTEGER(IntKi), PARAMETER :: M70N4MMxe = 8644 + INTEGER(IntKi), PARAMETER :: M70N5MMxe = 8645 + INTEGER(IntKi), PARAMETER :: M70N6MMxe = 8646 + INTEGER(IntKi), PARAMETER :: M70N7MMxe = 8647 + INTEGER(IntKi), PARAMETER :: M70N8MMxe = 8648 + INTEGER(IntKi), PARAMETER :: M70N9MMxe = 8649 + INTEGER(IntKi), PARAMETER :: M71N1MMxe = 8650 + INTEGER(IntKi), PARAMETER :: M71N2MMxe = 8651 + INTEGER(IntKi), PARAMETER :: M71N3MMxe = 8652 + INTEGER(IntKi), PARAMETER :: M71N4MMxe = 8653 + INTEGER(IntKi), PARAMETER :: M71N5MMxe = 8654 + INTEGER(IntKi), PARAMETER :: M71N6MMxe = 8655 + INTEGER(IntKi), PARAMETER :: M71N7MMxe = 8656 + INTEGER(IntKi), PARAMETER :: M71N8MMxe = 8657 + INTEGER(IntKi), PARAMETER :: M71N9MMxe = 8658 + INTEGER(IntKi), PARAMETER :: M72N1MMxe = 8659 + INTEGER(IntKi), PARAMETER :: M72N2MMxe = 8660 + INTEGER(IntKi), PARAMETER :: M72N3MMxe = 8661 + INTEGER(IntKi), PARAMETER :: M72N4MMxe = 8662 + INTEGER(IntKi), PARAMETER :: M72N5MMxe = 8663 + INTEGER(IntKi), PARAMETER :: M72N6MMxe = 8664 + INTEGER(IntKi), PARAMETER :: M72N7MMxe = 8665 + INTEGER(IntKi), PARAMETER :: M72N8MMxe = 8666 + INTEGER(IntKi), PARAMETER :: M72N9MMxe = 8667 + INTEGER(IntKi), PARAMETER :: M73N1MMxe = 8668 + INTEGER(IntKi), PARAMETER :: M73N2MMxe = 8669 + INTEGER(IntKi), PARAMETER :: M73N3MMxe = 8670 + INTEGER(IntKi), PARAMETER :: M73N4MMxe = 8671 + INTEGER(IntKi), PARAMETER :: M73N5MMxe = 8672 + INTEGER(IntKi), PARAMETER :: M73N6MMxe = 8673 + INTEGER(IntKi), PARAMETER :: M73N7MMxe = 8674 + INTEGER(IntKi), PARAMETER :: M73N8MMxe = 8675 + INTEGER(IntKi), PARAMETER :: M73N9MMxe = 8676 + INTEGER(IntKi), PARAMETER :: M74N1MMxe = 8677 + INTEGER(IntKi), PARAMETER :: M74N2MMxe = 8678 + INTEGER(IntKi), PARAMETER :: M74N3MMxe = 8679 + INTEGER(IntKi), PARAMETER :: M74N4MMxe = 8680 + INTEGER(IntKi), PARAMETER :: M74N5MMxe = 8681 + INTEGER(IntKi), PARAMETER :: M74N6MMxe = 8682 + INTEGER(IntKi), PARAMETER :: M74N7MMxe = 8683 + INTEGER(IntKi), PARAMETER :: M74N8MMxe = 8684 + INTEGER(IntKi), PARAMETER :: M74N9MMxe = 8685 + INTEGER(IntKi), PARAMETER :: M75N1MMxe = 8686 + INTEGER(IntKi), PARAMETER :: M75N2MMxe = 8687 + INTEGER(IntKi), PARAMETER :: M75N3MMxe = 8688 + INTEGER(IntKi), PARAMETER :: M75N4MMxe = 8689 + INTEGER(IntKi), PARAMETER :: M75N5MMxe = 8690 + INTEGER(IntKi), PARAMETER :: M75N6MMxe = 8691 + INTEGER(IntKi), PARAMETER :: M75N7MMxe = 8692 + INTEGER(IntKi), PARAMETER :: M75N8MMxe = 8693 + INTEGER(IntKi), PARAMETER :: M75N9MMxe = 8694 + INTEGER(IntKi), PARAMETER :: M76N1MMxe = 8695 + INTEGER(IntKi), PARAMETER :: M76N2MMxe = 8696 + INTEGER(IntKi), PARAMETER :: M76N3MMxe = 8697 + INTEGER(IntKi), PARAMETER :: M76N4MMxe = 8698 + INTEGER(IntKi), PARAMETER :: M76N5MMxe = 8699 + INTEGER(IntKi), PARAMETER :: M76N6MMxe = 8700 + INTEGER(IntKi), PARAMETER :: M76N7MMxe = 8701 + INTEGER(IntKi), PARAMETER :: M76N8MMxe = 8702 + INTEGER(IntKi), PARAMETER :: M76N9MMxe = 8703 + INTEGER(IntKi), PARAMETER :: M77N1MMxe = 8704 + INTEGER(IntKi), PARAMETER :: M77N2MMxe = 8705 + INTEGER(IntKi), PARAMETER :: M77N3MMxe = 8706 + INTEGER(IntKi), PARAMETER :: M77N4MMxe = 8707 + INTEGER(IntKi), PARAMETER :: M77N5MMxe = 8708 + INTEGER(IntKi), PARAMETER :: M77N6MMxe = 8709 + INTEGER(IntKi), PARAMETER :: M77N7MMxe = 8710 + INTEGER(IntKi), PARAMETER :: M77N8MMxe = 8711 + INTEGER(IntKi), PARAMETER :: M77N9MMxe = 8712 + INTEGER(IntKi), PARAMETER :: M78N1MMxe = 8713 + INTEGER(IntKi), PARAMETER :: M78N2MMxe = 8714 + INTEGER(IntKi), PARAMETER :: M78N3MMxe = 8715 + INTEGER(IntKi), PARAMETER :: M78N4MMxe = 8716 + INTEGER(IntKi), PARAMETER :: M78N5MMxe = 8717 + INTEGER(IntKi), PARAMETER :: M78N6MMxe = 8718 + INTEGER(IntKi), PARAMETER :: M78N7MMxe = 8719 + INTEGER(IntKi), PARAMETER :: M78N8MMxe = 8720 + INTEGER(IntKi), PARAMETER :: M78N9MMxe = 8721 + INTEGER(IntKi), PARAMETER :: M79N1MMxe = 8722 + INTEGER(IntKi), PARAMETER :: M79N2MMxe = 8723 + INTEGER(IntKi), PARAMETER :: M79N3MMxe = 8724 + INTEGER(IntKi), PARAMETER :: M79N4MMxe = 8725 + INTEGER(IntKi), PARAMETER :: M79N5MMxe = 8726 + INTEGER(IntKi), PARAMETER :: M79N6MMxe = 8727 + INTEGER(IntKi), PARAMETER :: M79N7MMxe = 8728 + INTEGER(IntKi), PARAMETER :: M79N8MMxe = 8729 + INTEGER(IntKi), PARAMETER :: M79N9MMxe = 8730 + INTEGER(IntKi), PARAMETER :: M80N1MMxe = 8731 + INTEGER(IntKi), PARAMETER :: M80N2MMxe = 8732 + INTEGER(IntKi), PARAMETER :: M80N3MMxe = 8733 + INTEGER(IntKi), PARAMETER :: M80N4MMxe = 8734 + INTEGER(IntKi), PARAMETER :: M80N5MMxe = 8735 + INTEGER(IntKi), PARAMETER :: M80N6MMxe = 8736 + INTEGER(IntKi), PARAMETER :: M80N7MMxe = 8737 + INTEGER(IntKi), PARAMETER :: M80N8MMxe = 8738 + INTEGER(IntKi), PARAMETER :: M80N9MMxe = 8739 + INTEGER(IntKi), PARAMETER :: M81N1MMxe = 8740 + INTEGER(IntKi), PARAMETER :: M81N2MMxe = 8741 + INTEGER(IntKi), PARAMETER :: M81N3MMxe = 8742 + INTEGER(IntKi), PARAMETER :: M81N4MMxe = 8743 + INTEGER(IntKi), PARAMETER :: M81N5MMxe = 8744 + INTEGER(IntKi), PARAMETER :: M81N6MMxe = 8745 + INTEGER(IntKi), PARAMETER :: M81N7MMxe = 8746 + INTEGER(IntKi), PARAMETER :: M81N8MMxe = 8747 + INTEGER(IntKi), PARAMETER :: M81N9MMxe = 8748 + INTEGER(IntKi), PARAMETER :: M82N1MMxe = 8749 + INTEGER(IntKi), PARAMETER :: M82N2MMxe = 8750 + INTEGER(IntKi), PARAMETER :: M82N3MMxe = 8751 + INTEGER(IntKi), PARAMETER :: M82N4MMxe = 8752 + INTEGER(IntKi), PARAMETER :: M82N5MMxe = 8753 + INTEGER(IntKi), PARAMETER :: M82N6MMxe = 8754 + INTEGER(IntKi), PARAMETER :: M82N7MMxe = 8755 + INTEGER(IntKi), PARAMETER :: M82N8MMxe = 8756 + INTEGER(IntKi), PARAMETER :: M82N9MMxe = 8757 + INTEGER(IntKi), PARAMETER :: M83N1MMxe = 8758 + INTEGER(IntKi), PARAMETER :: M83N2MMxe = 8759 + INTEGER(IntKi), PARAMETER :: M83N3MMxe = 8760 + INTEGER(IntKi), PARAMETER :: M83N4MMxe = 8761 + INTEGER(IntKi), PARAMETER :: M83N5MMxe = 8762 + INTEGER(IntKi), PARAMETER :: M83N6MMxe = 8763 + INTEGER(IntKi), PARAMETER :: M83N7MMxe = 8764 + INTEGER(IntKi), PARAMETER :: M83N8MMxe = 8765 + INTEGER(IntKi), PARAMETER :: M83N9MMxe = 8766 + INTEGER(IntKi), PARAMETER :: M84N1MMxe = 8767 + INTEGER(IntKi), PARAMETER :: M84N2MMxe = 8768 + INTEGER(IntKi), PARAMETER :: M84N3MMxe = 8769 + INTEGER(IntKi), PARAMETER :: M84N4MMxe = 8770 + INTEGER(IntKi), PARAMETER :: M84N5MMxe = 8771 + INTEGER(IntKi), PARAMETER :: M84N6MMxe = 8772 + INTEGER(IntKi), PARAMETER :: M84N7MMxe = 8773 + INTEGER(IntKi), PARAMETER :: M84N8MMxe = 8774 + INTEGER(IntKi), PARAMETER :: M84N9MMxe = 8775 + INTEGER(IntKi), PARAMETER :: M85N1MMxe = 8776 + INTEGER(IntKi), PARAMETER :: M85N2MMxe = 8777 + INTEGER(IntKi), PARAMETER :: M85N3MMxe = 8778 + INTEGER(IntKi), PARAMETER :: M85N4MMxe = 8779 + INTEGER(IntKi), PARAMETER :: M85N5MMxe = 8780 + INTEGER(IntKi), PARAMETER :: M85N6MMxe = 8781 + INTEGER(IntKi), PARAMETER :: M85N7MMxe = 8782 + INTEGER(IntKi), PARAMETER :: M85N8MMxe = 8783 + INTEGER(IntKi), PARAMETER :: M85N9MMxe = 8784 + INTEGER(IntKi), PARAMETER :: M86N1MMxe = 8785 + INTEGER(IntKi), PARAMETER :: M86N2MMxe = 8786 + INTEGER(IntKi), PARAMETER :: M86N3MMxe = 8787 + INTEGER(IntKi), PARAMETER :: M86N4MMxe = 8788 + INTEGER(IntKi), PARAMETER :: M86N5MMxe = 8789 + INTEGER(IntKi), PARAMETER :: M86N6MMxe = 8790 + INTEGER(IntKi), PARAMETER :: M86N7MMxe = 8791 + INTEGER(IntKi), PARAMETER :: M86N8MMxe = 8792 + INTEGER(IntKi), PARAMETER :: M86N9MMxe = 8793 + INTEGER(IntKi), PARAMETER :: M87N1MMxe = 8794 + INTEGER(IntKi), PARAMETER :: M87N2MMxe = 8795 + INTEGER(IntKi), PARAMETER :: M87N3MMxe = 8796 + INTEGER(IntKi), PARAMETER :: M87N4MMxe = 8797 + INTEGER(IntKi), PARAMETER :: M87N5MMxe = 8798 + INTEGER(IntKi), PARAMETER :: M87N6MMxe = 8799 + INTEGER(IntKi), PARAMETER :: M87N7MMxe = 8800 + INTEGER(IntKi), PARAMETER :: M87N8MMxe = 8801 + INTEGER(IntKi), PARAMETER :: M87N9MMxe = 8802 + INTEGER(IntKi), PARAMETER :: M88N1MMxe = 8803 + INTEGER(IntKi), PARAMETER :: M88N2MMxe = 8804 + INTEGER(IntKi), PARAMETER :: M88N3MMxe = 8805 + INTEGER(IntKi), PARAMETER :: M88N4MMxe = 8806 + INTEGER(IntKi), PARAMETER :: M88N5MMxe = 8807 + INTEGER(IntKi), PARAMETER :: M88N6MMxe = 8808 + INTEGER(IntKi), PARAMETER :: M88N7MMxe = 8809 + INTEGER(IntKi), PARAMETER :: M88N8MMxe = 8810 + INTEGER(IntKi), PARAMETER :: M88N9MMxe = 8811 + INTEGER(IntKi), PARAMETER :: M89N1MMxe = 8812 + INTEGER(IntKi), PARAMETER :: M89N2MMxe = 8813 + INTEGER(IntKi), PARAMETER :: M89N3MMxe = 8814 + INTEGER(IntKi), PARAMETER :: M89N4MMxe = 8815 + INTEGER(IntKi), PARAMETER :: M89N5MMxe = 8816 + INTEGER(IntKi), PARAMETER :: M89N6MMxe = 8817 + INTEGER(IntKi), PARAMETER :: M89N7MMxe = 8818 + INTEGER(IntKi), PARAMETER :: M89N8MMxe = 8819 + INTEGER(IntKi), PARAMETER :: M89N9MMxe = 8820 + INTEGER(IntKi), PARAMETER :: M90N1MMxe = 8821 + INTEGER(IntKi), PARAMETER :: M90N2MMxe = 8822 + INTEGER(IntKi), PARAMETER :: M90N3MMxe = 8823 + INTEGER(IntKi), PARAMETER :: M90N4MMxe = 8824 + INTEGER(IntKi), PARAMETER :: M90N5MMxe = 8825 + INTEGER(IntKi), PARAMETER :: M90N6MMxe = 8826 + INTEGER(IntKi), PARAMETER :: M90N7MMxe = 8827 + INTEGER(IntKi), PARAMETER :: M90N8MMxe = 8828 + INTEGER(IntKi), PARAMETER :: M90N9MMxe = 8829 + INTEGER(IntKi), PARAMETER :: M91N1MMxe = 8830 + INTEGER(IntKi), PARAMETER :: M91N2MMxe = 8831 + INTEGER(IntKi), PARAMETER :: M91N3MMxe = 8832 + INTEGER(IntKi), PARAMETER :: M91N4MMxe = 8833 + INTEGER(IntKi), PARAMETER :: M91N5MMxe = 8834 + INTEGER(IntKi), PARAMETER :: M91N6MMxe = 8835 + INTEGER(IntKi), PARAMETER :: M91N7MMxe = 8836 + INTEGER(IntKi), PARAMETER :: M91N8MMxe = 8837 + INTEGER(IntKi), PARAMETER :: M91N9MMxe = 8838 + INTEGER(IntKi), PARAMETER :: M92N1MMxe = 8839 + INTEGER(IntKi), PARAMETER :: M92N2MMxe = 8840 + INTEGER(IntKi), PARAMETER :: M92N3MMxe = 8841 + INTEGER(IntKi), PARAMETER :: M92N4MMxe = 8842 + INTEGER(IntKi), PARAMETER :: M92N5MMxe = 8843 + INTEGER(IntKi), PARAMETER :: M92N6MMxe = 8844 + INTEGER(IntKi), PARAMETER :: M92N7MMxe = 8845 + INTEGER(IntKi), PARAMETER :: M92N8MMxe = 8846 + INTEGER(IntKi), PARAMETER :: M92N9MMxe = 8847 + INTEGER(IntKi), PARAMETER :: M93N1MMxe = 8848 + INTEGER(IntKi), PARAMETER :: M93N2MMxe = 8849 + INTEGER(IntKi), PARAMETER :: M93N3MMxe = 8850 + INTEGER(IntKi), PARAMETER :: M93N4MMxe = 8851 + INTEGER(IntKi), PARAMETER :: M93N5MMxe = 8852 + INTEGER(IntKi), PARAMETER :: M93N6MMxe = 8853 + INTEGER(IntKi), PARAMETER :: M93N7MMxe = 8854 + INTEGER(IntKi), PARAMETER :: M93N8MMxe = 8855 + INTEGER(IntKi), PARAMETER :: M93N9MMxe = 8856 + INTEGER(IntKi), PARAMETER :: M94N1MMxe = 8857 + INTEGER(IntKi), PARAMETER :: M94N2MMxe = 8858 + INTEGER(IntKi), PARAMETER :: M94N3MMxe = 8859 + INTEGER(IntKi), PARAMETER :: M94N4MMxe = 8860 + INTEGER(IntKi), PARAMETER :: M94N5MMxe = 8861 + INTEGER(IntKi), PARAMETER :: M94N6MMxe = 8862 + INTEGER(IntKi), PARAMETER :: M94N7MMxe = 8863 + INTEGER(IntKi), PARAMETER :: M94N8MMxe = 8864 + INTEGER(IntKi), PARAMETER :: M94N9MMxe = 8865 + INTEGER(IntKi), PARAMETER :: M95N1MMxe = 8866 + INTEGER(IntKi), PARAMETER :: M95N2MMxe = 8867 + INTEGER(IntKi), PARAMETER :: M95N3MMxe = 8868 + INTEGER(IntKi), PARAMETER :: M95N4MMxe = 8869 + INTEGER(IntKi), PARAMETER :: M95N5MMxe = 8870 + INTEGER(IntKi), PARAMETER :: M95N6MMxe = 8871 + INTEGER(IntKi), PARAMETER :: M95N7MMxe = 8872 + INTEGER(IntKi), PARAMETER :: M95N8MMxe = 8873 + INTEGER(IntKi), PARAMETER :: M95N9MMxe = 8874 + INTEGER(IntKi), PARAMETER :: M96N1MMxe = 8875 + INTEGER(IntKi), PARAMETER :: M96N2MMxe = 8876 + INTEGER(IntKi), PARAMETER :: M96N3MMxe = 8877 + INTEGER(IntKi), PARAMETER :: M96N4MMxe = 8878 + INTEGER(IntKi), PARAMETER :: M96N5MMxe = 8879 + INTEGER(IntKi), PARAMETER :: M96N6MMxe = 8880 + INTEGER(IntKi), PARAMETER :: M96N7MMxe = 8881 + INTEGER(IntKi), PARAMETER :: M96N8MMxe = 8882 + INTEGER(IntKi), PARAMETER :: M96N9MMxe = 8883 + INTEGER(IntKi), PARAMETER :: M97N1MMxe = 8884 + INTEGER(IntKi), PARAMETER :: M97N2MMxe = 8885 + INTEGER(IntKi), PARAMETER :: M97N3MMxe = 8886 + INTEGER(IntKi), PARAMETER :: M97N4MMxe = 8887 + INTEGER(IntKi), PARAMETER :: M97N5MMxe = 8888 + INTEGER(IntKi), PARAMETER :: M97N6MMxe = 8889 + INTEGER(IntKi), PARAMETER :: M97N7MMxe = 8890 + INTEGER(IntKi), PARAMETER :: M97N8MMxe = 8891 + INTEGER(IntKi), PARAMETER :: M97N9MMxe = 8892 + INTEGER(IntKi), PARAMETER :: M98N1MMxe = 8893 + INTEGER(IntKi), PARAMETER :: M98N2MMxe = 8894 + INTEGER(IntKi), PARAMETER :: M98N3MMxe = 8895 + INTEGER(IntKi), PARAMETER :: M98N4MMxe = 8896 + INTEGER(IntKi), PARAMETER :: M98N5MMxe = 8897 + INTEGER(IntKi), PARAMETER :: M98N6MMxe = 8898 + INTEGER(IntKi), PARAMETER :: M98N7MMxe = 8899 + INTEGER(IntKi), PARAMETER :: M98N8MMxe = 8900 + INTEGER(IntKi), PARAMETER :: M98N9MMxe = 8901 + INTEGER(IntKi), PARAMETER :: M99N1MMxe = 8902 + INTEGER(IntKi), PARAMETER :: M99N2MMxe = 8903 + INTEGER(IntKi), PARAMETER :: M99N3MMxe = 8904 + INTEGER(IntKi), PARAMETER :: M99N4MMxe = 8905 + INTEGER(IntKi), PARAMETER :: M99N5MMxe = 8906 + INTEGER(IntKi), PARAMETER :: M99N6MMxe = 8907 + INTEGER(IntKi), PARAMETER :: M99N7MMxe = 8908 + INTEGER(IntKi), PARAMETER :: M99N8MMxe = 8909 + INTEGER(IntKi), PARAMETER :: M99N9MMxe = 8910 + INTEGER(IntKi), PARAMETER :: M01N1MMye = 8911 + INTEGER(IntKi), PARAMETER :: M01N2MMye = 8912 + INTEGER(IntKi), PARAMETER :: M01N3MMye = 8913 + INTEGER(IntKi), PARAMETER :: M01N4MMye = 8914 + INTEGER(IntKi), PARAMETER :: M01N5MMye = 8915 + INTEGER(IntKi), PARAMETER :: M01N6MMye = 8916 + INTEGER(IntKi), PARAMETER :: M01N7MMye = 8917 + INTEGER(IntKi), PARAMETER :: M01N8MMye = 8918 + INTEGER(IntKi), PARAMETER :: M01N9MMye = 8919 + INTEGER(IntKi), PARAMETER :: M02N1MMye = 8920 + INTEGER(IntKi), PARAMETER :: M02N2MMye = 8921 + INTEGER(IntKi), PARAMETER :: M02N3MMye = 8922 + INTEGER(IntKi), PARAMETER :: M02N4MMye = 8923 + INTEGER(IntKi), PARAMETER :: M02N5MMye = 8924 + INTEGER(IntKi), PARAMETER :: M02N6MMye = 8925 + INTEGER(IntKi), PARAMETER :: M02N7MMye = 8926 + INTEGER(IntKi), PARAMETER :: M02N8MMye = 8927 + INTEGER(IntKi), PARAMETER :: M02N9MMye = 8928 + INTEGER(IntKi), PARAMETER :: M03N1MMye = 8929 + INTEGER(IntKi), PARAMETER :: M03N2MMye = 8930 + INTEGER(IntKi), PARAMETER :: M03N3MMye = 8931 + INTEGER(IntKi), PARAMETER :: M03N4MMye = 8932 + INTEGER(IntKi), PARAMETER :: M03N5MMye = 8933 + INTEGER(IntKi), PARAMETER :: M03N6MMye = 8934 + INTEGER(IntKi), PARAMETER :: M03N7MMye = 8935 + INTEGER(IntKi), PARAMETER :: M03N8MMye = 8936 + INTEGER(IntKi), PARAMETER :: M03N9MMye = 8937 + INTEGER(IntKi), PARAMETER :: M04N1MMye = 8938 + INTEGER(IntKi), PARAMETER :: M04N2MMye = 8939 + INTEGER(IntKi), PARAMETER :: M04N3MMye = 8940 + INTEGER(IntKi), PARAMETER :: M04N4MMye = 8941 + INTEGER(IntKi), PARAMETER :: M04N5MMye = 8942 + INTEGER(IntKi), PARAMETER :: M04N6MMye = 8943 + INTEGER(IntKi), PARAMETER :: M04N7MMye = 8944 + INTEGER(IntKi), PARAMETER :: M04N8MMye = 8945 + INTEGER(IntKi), PARAMETER :: M04N9MMye = 8946 + INTEGER(IntKi), PARAMETER :: M05N1MMye = 8947 + INTEGER(IntKi), PARAMETER :: M05N2MMye = 8948 + INTEGER(IntKi), PARAMETER :: M05N3MMye = 8949 + INTEGER(IntKi), PARAMETER :: M05N4MMye = 8950 + INTEGER(IntKi), PARAMETER :: M05N5MMye = 8951 + INTEGER(IntKi), PARAMETER :: M05N6MMye = 8952 + INTEGER(IntKi), PARAMETER :: M05N7MMye = 8953 + INTEGER(IntKi), PARAMETER :: M05N8MMye = 8954 + INTEGER(IntKi), PARAMETER :: M05N9MMye = 8955 + INTEGER(IntKi), PARAMETER :: M06N1MMye = 8956 + INTEGER(IntKi), PARAMETER :: M06N2MMye = 8957 + INTEGER(IntKi), PARAMETER :: M06N3MMye = 8958 + INTEGER(IntKi), PARAMETER :: M06N4MMye = 8959 + INTEGER(IntKi), PARAMETER :: M06N5MMye = 8960 + INTEGER(IntKi), PARAMETER :: M06N6MMye = 8961 + INTEGER(IntKi), PARAMETER :: M06N7MMye = 8962 + INTEGER(IntKi), PARAMETER :: M06N8MMye = 8963 + INTEGER(IntKi), PARAMETER :: M06N9MMye = 8964 + INTEGER(IntKi), PARAMETER :: M07N1MMye = 8965 + INTEGER(IntKi), PARAMETER :: M07N2MMye = 8966 + INTEGER(IntKi), PARAMETER :: M07N3MMye = 8967 + INTEGER(IntKi), PARAMETER :: M07N4MMye = 8968 + INTEGER(IntKi), PARAMETER :: M07N5MMye = 8969 + INTEGER(IntKi), PARAMETER :: M07N6MMye = 8970 + INTEGER(IntKi), PARAMETER :: M07N7MMye = 8971 + INTEGER(IntKi), PARAMETER :: M07N8MMye = 8972 + INTEGER(IntKi), PARAMETER :: M07N9MMye = 8973 + INTEGER(IntKi), PARAMETER :: M08N1MMye = 8974 + INTEGER(IntKi), PARAMETER :: M08N2MMye = 8975 + INTEGER(IntKi), PARAMETER :: M08N3MMye = 8976 + INTEGER(IntKi), PARAMETER :: M08N4MMye = 8977 + INTEGER(IntKi), PARAMETER :: M08N5MMye = 8978 + INTEGER(IntKi), PARAMETER :: M08N6MMye = 8979 + INTEGER(IntKi), PARAMETER :: M08N7MMye = 8980 + INTEGER(IntKi), PARAMETER :: M08N8MMye = 8981 + INTEGER(IntKi), PARAMETER :: M08N9MMye = 8982 + INTEGER(IntKi), PARAMETER :: M09N1MMye = 8983 + INTEGER(IntKi), PARAMETER :: M09N2MMye = 8984 + INTEGER(IntKi), PARAMETER :: M09N3MMye = 8985 + INTEGER(IntKi), PARAMETER :: M09N4MMye = 8986 + INTEGER(IntKi), PARAMETER :: M09N5MMye = 8987 + INTEGER(IntKi), PARAMETER :: M09N6MMye = 8988 + INTEGER(IntKi), PARAMETER :: M09N7MMye = 8989 + INTEGER(IntKi), PARAMETER :: M09N8MMye = 8990 + INTEGER(IntKi), PARAMETER :: M09N9MMye = 8991 + INTEGER(IntKi), PARAMETER :: M10N1MMye = 8992 + INTEGER(IntKi), PARAMETER :: M10N2MMye = 8993 + INTEGER(IntKi), PARAMETER :: M10N3MMye = 8994 + INTEGER(IntKi), PARAMETER :: M10N4MMye = 8995 + INTEGER(IntKi), PARAMETER :: M10N5MMye = 8996 + INTEGER(IntKi), PARAMETER :: M10N6MMye = 8997 + INTEGER(IntKi), PARAMETER :: M10N7MMye = 8998 + INTEGER(IntKi), PARAMETER :: M10N8MMye = 8999 + INTEGER(IntKi), PARAMETER :: M10N9MMye = 9000 + INTEGER(IntKi), PARAMETER :: M11N1MMye = 9001 + INTEGER(IntKi), PARAMETER :: M11N2MMye = 9002 + INTEGER(IntKi), PARAMETER :: M11N3MMye = 9003 + INTEGER(IntKi), PARAMETER :: M11N4MMye = 9004 + INTEGER(IntKi), PARAMETER :: M11N5MMye = 9005 + INTEGER(IntKi), PARAMETER :: M11N6MMye = 9006 + INTEGER(IntKi), PARAMETER :: M11N7MMye = 9007 + INTEGER(IntKi), PARAMETER :: M11N8MMye = 9008 + INTEGER(IntKi), PARAMETER :: M11N9MMye = 9009 + INTEGER(IntKi), PARAMETER :: M12N1MMye = 9010 + INTEGER(IntKi), PARAMETER :: M12N2MMye = 9011 + INTEGER(IntKi), PARAMETER :: M12N3MMye = 9012 + INTEGER(IntKi), PARAMETER :: M12N4MMye = 9013 + INTEGER(IntKi), PARAMETER :: M12N5MMye = 9014 + INTEGER(IntKi), PARAMETER :: M12N6MMye = 9015 + INTEGER(IntKi), PARAMETER :: M12N7MMye = 9016 + INTEGER(IntKi), PARAMETER :: M12N8MMye = 9017 + INTEGER(IntKi), PARAMETER :: M12N9MMye = 9018 + INTEGER(IntKi), PARAMETER :: M13N1MMye = 9019 + INTEGER(IntKi), PARAMETER :: M13N2MMye = 9020 + INTEGER(IntKi), PARAMETER :: M13N3MMye = 9021 + INTEGER(IntKi), PARAMETER :: M13N4MMye = 9022 + INTEGER(IntKi), PARAMETER :: M13N5MMye = 9023 + INTEGER(IntKi), PARAMETER :: M13N6MMye = 9024 + INTEGER(IntKi), PARAMETER :: M13N7MMye = 9025 + INTEGER(IntKi), PARAMETER :: M13N8MMye = 9026 + INTEGER(IntKi), PARAMETER :: M13N9MMye = 9027 + INTEGER(IntKi), PARAMETER :: M14N1MMye = 9028 + INTEGER(IntKi), PARAMETER :: M14N2MMye = 9029 + INTEGER(IntKi), PARAMETER :: M14N3MMye = 9030 + INTEGER(IntKi), PARAMETER :: M14N4MMye = 9031 + INTEGER(IntKi), PARAMETER :: M14N5MMye = 9032 + INTEGER(IntKi), PARAMETER :: M14N6MMye = 9033 + INTEGER(IntKi), PARAMETER :: M14N7MMye = 9034 + INTEGER(IntKi), PARAMETER :: M14N8MMye = 9035 + INTEGER(IntKi), PARAMETER :: M14N9MMye = 9036 + INTEGER(IntKi), PARAMETER :: M15N1MMye = 9037 + INTEGER(IntKi), PARAMETER :: M15N2MMye = 9038 + INTEGER(IntKi), PARAMETER :: M15N3MMye = 9039 + INTEGER(IntKi), PARAMETER :: M15N4MMye = 9040 + INTEGER(IntKi), PARAMETER :: M15N5MMye = 9041 + INTEGER(IntKi), PARAMETER :: M15N6MMye = 9042 + INTEGER(IntKi), PARAMETER :: M15N7MMye = 9043 + INTEGER(IntKi), PARAMETER :: M15N8MMye = 9044 + INTEGER(IntKi), PARAMETER :: M15N9MMye = 9045 + INTEGER(IntKi), PARAMETER :: M16N1MMye = 9046 + INTEGER(IntKi), PARAMETER :: M16N2MMye = 9047 + INTEGER(IntKi), PARAMETER :: M16N3MMye = 9048 + INTEGER(IntKi), PARAMETER :: M16N4MMye = 9049 + INTEGER(IntKi), PARAMETER :: M16N5MMye = 9050 + INTEGER(IntKi), PARAMETER :: M16N6MMye = 9051 + INTEGER(IntKi), PARAMETER :: M16N7MMye = 9052 + INTEGER(IntKi), PARAMETER :: M16N8MMye = 9053 + INTEGER(IntKi), PARAMETER :: M16N9MMye = 9054 + INTEGER(IntKi), PARAMETER :: M17N1MMye = 9055 + INTEGER(IntKi), PARAMETER :: M17N2MMye = 9056 + INTEGER(IntKi), PARAMETER :: M17N3MMye = 9057 + INTEGER(IntKi), PARAMETER :: M17N4MMye = 9058 + INTEGER(IntKi), PARAMETER :: M17N5MMye = 9059 + INTEGER(IntKi), PARAMETER :: M17N6MMye = 9060 + INTEGER(IntKi), PARAMETER :: M17N7MMye = 9061 + INTEGER(IntKi), PARAMETER :: M17N8MMye = 9062 + INTEGER(IntKi), PARAMETER :: M17N9MMye = 9063 + INTEGER(IntKi), PARAMETER :: M18N1MMye = 9064 + INTEGER(IntKi), PARAMETER :: M18N2MMye = 9065 + INTEGER(IntKi), PARAMETER :: M18N3MMye = 9066 + INTEGER(IntKi), PARAMETER :: M18N4MMye = 9067 + INTEGER(IntKi), PARAMETER :: M18N5MMye = 9068 + INTEGER(IntKi), PARAMETER :: M18N6MMye = 9069 + INTEGER(IntKi), PARAMETER :: M18N7MMye = 9070 + INTEGER(IntKi), PARAMETER :: M18N8MMye = 9071 + INTEGER(IntKi), PARAMETER :: M18N9MMye = 9072 + INTEGER(IntKi), PARAMETER :: M19N1MMye = 9073 + INTEGER(IntKi), PARAMETER :: M19N2MMye = 9074 + INTEGER(IntKi), PARAMETER :: M19N3MMye = 9075 + INTEGER(IntKi), PARAMETER :: M19N4MMye = 9076 + INTEGER(IntKi), PARAMETER :: M19N5MMye = 9077 + INTEGER(IntKi), PARAMETER :: M19N6MMye = 9078 + INTEGER(IntKi), PARAMETER :: M19N7MMye = 9079 + INTEGER(IntKi), PARAMETER :: M19N8MMye = 9080 + INTEGER(IntKi), PARAMETER :: M19N9MMye = 9081 + INTEGER(IntKi), PARAMETER :: M20N1MMye = 9082 + INTEGER(IntKi), PARAMETER :: M20N2MMye = 9083 + INTEGER(IntKi), PARAMETER :: M20N3MMye = 9084 + INTEGER(IntKi), PARAMETER :: M20N4MMye = 9085 + INTEGER(IntKi), PARAMETER :: M20N5MMye = 9086 + INTEGER(IntKi), PARAMETER :: M20N6MMye = 9087 + INTEGER(IntKi), PARAMETER :: M20N7MMye = 9088 + INTEGER(IntKi), PARAMETER :: M20N8MMye = 9089 + INTEGER(IntKi), PARAMETER :: M20N9MMye = 9090 + INTEGER(IntKi), PARAMETER :: M21N1MMye = 9091 + INTEGER(IntKi), PARAMETER :: M21N2MMye = 9092 + INTEGER(IntKi), PARAMETER :: M21N3MMye = 9093 + INTEGER(IntKi), PARAMETER :: M21N4MMye = 9094 + INTEGER(IntKi), PARAMETER :: M21N5MMye = 9095 + INTEGER(IntKi), PARAMETER :: M21N6MMye = 9096 + INTEGER(IntKi), PARAMETER :: M21N7MMye = 9097 + INTEGER(IntKi), PARAMETER :: M21N8MMye = 9098 + INTEGER(IntKi), PARAMETER :: M21N9MMye = 9099 + INTEGER(IntKi), PARAMETER :: M22N1MMye = 9100 + INTEGER(IntKi), PARAMETER :: M22N2MMye = 9101 + INTEGER(IntKi), PARAMETER :: M22N3MMye = 9102 + INTEGER(IntKi), PARAMETER :: M22N4MMye = 9103 + INTEGER(IntKi), PARAMETER :: M22N5MMye = 9104 + INTEGER(IntKi), PARAMETER :: M22N6MMye = 9105 + INTEGER(IntKi), PARAMETER :: M22N7MMye = 9106 + INTEGER(IntKi), PARAMETER :: M22N8MMye = 9107 + INTEGER(IntKi), PARAMETER :: M22N9MMye = 9108 + INTEGER(IntKi), PARAMETER :: M23N1MMye = 9109 + INTEGER(IntKi), PARAMETER :: M23N2MMye = 9110 + INTEGER(IntKi), PARAMETER :: M23N3MMye = 9111 + INTEGER(IntKi), PARAMETER :: M23N4MMye = 9112 + INTEGER(IntKi), PARAMETER :: M23N5MMye = 9113 + INTEGER(IntKi), PARAMETER :: M23N6MMye = 9114 + INTEGER(IntKi), PARAMETER :: M23N7MMye = 9115 + INTEGER(IntKi), PARAMETER :: M23N8MMye = 9116 + INTEGER(IntKi), PARAMETER :: M23N9MMye = 9117 + INTEGER(IntKi), PARAMETER :: M24N1MMye = 9118 + INTEGER(IntKi), PARAMETER :: M24N2MMye = 9119 + INTEGER(IntKi), PARAMETER :: M24N3MMye = 9120 + INTEGER(IntKi), PARAMETER :: M24N4MMye = 9121 + INTEGER(IntKi), PARAMETER :: M24N5MMye = 9122 + INTEGER(IntKi), PARAMETER :: M24N6MMye = 9123 + INTEGER(IntKi), PARAMETER :: M24N7MMye = 9124 + INTEGER(IntKi), PARAMETER :: M24N8MMye = 9125 + INTEGER(IntKi), PARAMETER :: M24N9MMye = 9126 + INTEGER(IntKi), PARAMETER :: M25N1MMye = 9127 + INTEGER(IntKi), PARAMETER :: M25N2MMye = 9128 + INTEGER(IntKi), PARAMETER :: M25N3MMye = 9129 + INTEGER(IntKi), PARAMETER :: M25N4MMye = 9130 + INTEGER(IntKi), PARAMETER :: M25N5MMye = 9131 + INTEGER(IntKi), PARAMETER :: M25N6MMye = 9132 + INTEGER(IntKi), PARAMETER :: M25N7MMye = 9133 + INTEGER(IntKi), PARAMETER :: M25N8MMye = 9134 + INTEGER(IntKi), PARAMETER :: M25N9MMye = 9135 + INTEGER(IntKi), PARAMETER :: M26N1MMye = 9136 + INTEGER(IntKi), PARAMETER :: M26N2MMye = 9137 + INTEGER(IntKi), PARAMETER :: M26N3MMye = 9138 + INTEGER(IntKi), PARAMETER :: M26N4MMye = 9139 + INTEGER(IntKi), PARAMETER :: M26N5MMye = 9140 + INTEGER(IntKi), PARAMETER :: M26N6MMye = 9141 + INTEGER(IntKi), PARAMETER :: M26N7MMye = 9142 + INTEGER(IntKi), PARAMETER :: M26N8MMye = 9143 + INTEGER(IntKi), PARAMETER :: M26N9MMye = 9144 + INTEGER(IntKi), PARAMETER :: M27N1MMye = 9145 + INTEGER(IntKi), PARAMETER :: M27N2MMye = 9146 + INTEGER(IntKi), PARAMETER :: M27N3MMye = 9147 + INTEGER(IntKi), PARAMETER :: M27N4MMye = 9148 + INTEGER(IntKi), PARAMETER :: M27N5MMye = 9149 + INTEGER(IntKi), PARAMETER :: M27N6MMye = 9150 + INTEGER(IntKi), PARAMETER :: M27N7MMye = 9151 + INTEGER(IntKi), PARAMETER :: M27N8MMye = 9152 + INTEGER(IntKi), PARAMETER :: M27N9MMye = 9153 + INTEGER(IntKi), PARAMETER :: M28N1MMye = 9154 + INTEGER(IntKi), PARAMETER :: M28N2MMye = 9155 + INTEGER(IntKi), PARAMETER :: M28N3MMye = 9156 + INTEGER(IntKi), PARAMETER :: M28N4MMye = 9157 + INTEGER(IntKi), PARAMETER :: M28N5MMye = 9158 + INTEGER(IntKi), PARAMETER :: M28N6MMye = 9159 + INTEGER(IntKi), PARAMETER :: M28N7MMye = 9160 + INTEGER(IntKi), PARAMETER :: M28N8MMye = 9161 + INTEGER(IntKi), PARAMETER :: M28N9MMye = 9162 + INTEGER(IntKi), PARAMETER :: M29N1MMye = 9163 + INTEGER(IntKi), PARAMETER :: M29N2MMye = 9164 + INTEGER(IntKi), PARAMETER :: M29N3MMye = 9165 + INTEGER(IntKi), PARAMETER :: M29N4MMye = 9166 + INTEGER(IntKi), PARAMETER :: M29N5MMye = 9167 + INTEGER(IntKi), PARAMETER :: M29N6MMye = 9168 + INTEGER(IntKi), PARAMETER :: M29N7MMye = 9169 + INTEGER(IntKi), PARAMETER :: M29N8MMye = 9170 + INTEGER(IntKi), PARAMETER :: M29N9MMye = 9171 + INTEGER(IntKi), PARAMETER :: M30N1MMye = 9172 + INTEGER(IntKi), PARAMETER :: M30N2MMye = 9173 + INTEGER(IntKi), PARAMETER :: M30N3MMye = 9174 + INTEGER(IntKi), PARAMETER :: M30N4MMye = 9175 + INTEGER(IntKi), PARAMETER :: M30N5MMye = 9176 + INTEGER(IntKi), PARAMETER :: M30N6MMye = 9177 + INTEGER(IntKi), PARAMETER :: M30N7MMye = 9178 + INTEGER(IntKi), PARAMETER :: M30N8MMye = 9179 + INTEGER(IntKi), PARAMETER :: M30N9MMye = 9180 + INTEGER(IntKi), PARAMETER :: M31N1MMye = 9181 + INTEGER(IntKi), PARAMETER :: M31N2MMye = 9182 + INTEGER(IntKi), PARAMETER :: M31N3MMye = 9183 + INTEGER(IntKi), PARAMETER :: M31N4MMye = 9184 + INTEGER(IntKi), PARAMETER :: M31N5MMye = 9185 + INTEGER(IntKi), PARAMETER :: M31N6MMye = 9186 + INTEGER(IntKi), PARAMETER :: M31N7MMye = 9187 + INTEGER(IntKi), PARAMETER :: M31N8MMye = 9188 + INTEGER(IntKi), PARAMETER :: M31N9MMye = 9189 + INTEGER(IntKi), PARAMETER :: M32N1MMye = 9190 + INTEGER(IntKi), PARAMETER :: M32N2MMye = 9191 + INTEGER(IntKi), PARAMETER :: M32N3MMye = 9192 + INTEGER(IntKi), PARAMETER :: M32N4MMye = 9193 + INTEGER(IntKi), PARAMETER :: M32N5MMye = 9194 + INTEGER(IntKi), PARAMETER :: M32N6MMye = 9195 + INTEGER(IntKi), PARAMETER :: M32N7MMye = 9196 + INTEGER(IntKi), PARAMETER :: M32N8MMye = 9197 + INTEGER(IntKi), PARAMETER :: M32N9MMye = 9198 + INTEGER(IntKi), PARAMETER :: M33N1MMye = 9199 + INTEGER(IntKi), PARAMETER :: M33N2MMye = 9200 + INTEGER(IntKi), PARAMETER :: M33N3MMye = 9201 + INTEGER(IntKi), PARAMETER :: M33N4MMye = 9202 + INTEGER(IntKi), PARAMETER :: M33N5MMye = 9203 + INTEGER(IntKi), PARAMETER :: M33N6MMye = 9204 + INTEGER(IntKi), PARAMETER :: M33N7MMye = 9205 + INTEGER(IntKi), PARAMETER :: M33N8MMye = 9206 + INTEGER(IntKi), PARAMETER :: M33N9MMye = 9207 + INTEGER(IntKi), PARAMETER :: M34N1MMye = 9208 + INTEGER(IntKi), PARAMETER :: M34N2MMye = 9209 + INTEGER(IntKi), PARAMETER :: M34N3MMye = 9210 + INTEGER(IntKi), PARAMETER :: M34N4MMye = 9211 + INTEGER(IntKi), PARAMETER :: M34N5MMye = 9212 + INTEGER(IntKi), PARAMETER :: M34N6MMye = 9213 + INTEGER(IntKi), PARAMETER :: M34N7MMye = 9214 + INTEGER(IntKi), PARAMETER :: M34N8MMye = 9215 + INTEGER(IntKi), PARAMETER :: M34N9MMye = 9216 + INTEGER(IntKi), PARAMETER :: M35N1MMye = 9217 + INTEGER(IntKi), PARAMETER :: M35N2MMye = 9218 + INTEGER(IntKi), PARAMETER :: M35N3MMye = 9219 + INTEGER(IntKi), PARAMETER :: M35N4MMye = 9220 + INTEGER(IntKi), PARAMETER :: M35N5MMye = 9221 + INTEGER(IntKi), PARAMETER :: M35N6MMye = 9222 + INTEGER(IntKi), PARAMETER :: M35N7MMye = 9223 + INTEGER(IntKi), PARAMETER :: M35N8MMye = 9224 + INTEGER(IntKi), PARAMETER :: M35N9MMye = 9225 + INTEGER(IntKi), PARAMETER :: M36N1MMye = 9226 + INTEGER(IntKi), PARAMETER :: M36N2MMye = 9227 + INTEGER(IntKi), PARAMETER :: M36N3MMye = 9228 + INTEGER(IntKi), PARAMETER :: M36N4MMye = 9229 + INTEGER(IntKi), PARAMETER :: M36N5MMye = 9230 + INTEGER(IntKi), PARAMETER :: M36N6MMye = 9231 + INTEGER(IntKi), PARAMETER :: M36N7MMye = 9232 + INTEGER(IntKi), PARAMETER :: M36N8MMye = 9233 + INTEGER(IntKi), PARAMETER :: M36N9MMye = 9234 + INTEGER(IntKi), PARAMETER :: M37N1MMye = 9235 + INTEGER(IntKi), PARAMETER :: M37N2MMye = 9236 + INTEGER(IntKi), PARAMETER :: M37N3MMye = 9237 + INTEGER(IntKi), PARAMETER :: M37N4MMye = 9238 + INTEGER(IntKi), PARAMETER :: M37N5MMye = 9239 + INTEGER(IntKi), PARAMETER :: M37N6MMye = 9240 + INTEGER(IntKi), PARAMETER :: M37N7MMye = 9241 + INTEGER(IntKi), PARAMETER :: M37N8MMye = 9242 + INTEGER(IntKi), PARAMETER :: M37N9MMye = 9243 + INTEGER(IntKi), PARAMETER :: M38N1MMye = 9244 + INTEGER(IntKi), PARAMETER :: M38N2MMye = 9245 + INTEGER(IntKi), PARAMETER :: M38N3MMye = 9246 + INTEGER(IntKi), PARAMETER :: M38N4MMye = 9247 + INTEGER(IntKi), PARAMETER :: M38N5MMye = 9248 + INTEGER(IntKi), PARAMETER :: M38N6MMye = 9249 + INTEGER(IntKi), PARAMETER :: M38N7MMye = 9250 + INTEGER(IntKi), PARAMETER :: M38N8MMye = 9251 + INTEGER(IntKi), PARAMETER :: M38N9MMye = 9252 + INTEGER(IntKi), PARAMETER :: M39N1MMye = 9253 + INTEGER(IntKi), PARAMETER :: M39N2MMye = 9254 + INTEGER(IntKi), PARAMETER :: M39N3MMye = 9255 + INTEGER(IntKi), PARAMETER :: M39N4MMye = 9256 + INTEGER(IntKi), PARAMETER :: M39N5MMye = 9257 + INTEGER(IntKi), PARAMETER :: M39N6MMye = 9258 + INTEGER(IntKi), PARAMETER :: M39N7MMye = 9259 + INTEGER(IntKi), PARAMETER :: M39N8MMye = 9260 + INTEGER(IntKi), PARAMETER :: M39N9MMye = 9261 + INTEGER(IntKi), PARAMETER :: M40N1MMye = 9262 + INTEGER(IntKi), PARAMETER :: M40N2MMye = 9263 + INTEGER(IntKi), PARAMETER :: M40N3MMye = 9264 + INTEGER(IntKi), PARAMETER :: M40N4MMye = 9265 + INTEGER(IntKi), PARAMETER :: M40N5MMye = 9266 + INTEGER(IntKi), PARAMETER :: M40N6MMye = 9267 + INTEGER(IntKi), PARAMETER :: M40N7MMye = 9268 + INTEGER(IntKi), PARAMETER :: M40N8MMye = 9269 + INTEGER(IntKi), PARAMETER :: M40N9MMye = 9270 + INTEGER(IntKi), PARAMETER :: M41N1MMye = 9271 + INTEGER(IntKi), PARAMETER :: M41N2MMye = 9272 + INTEGER(IntKi), PARAMETER :: M41N3MMye = 9273 + INTEGER(IntKi), PARAMETER :: M41N4MMye = 9274 + INTEGER(IntKi), PARAMETER :: M41N5MMye = 9275 + INTEGER(IntKi), PARAMETER :: M41N6MMye = 9276 + INTEGER(IntKi), PARAMETER :: M41N7MMye = 9277 + INTEGER(IntKi), PARAMETER :: M41N8MMye = 9278 + INTEGER(IntKi), PARAMETER :: M41N9MMye = 9279 + INTEGER(IntKi), PARAMETER :: M42N1MMye = 9280 + INTEGER(IntKi), PARAMETER :: M42N2MMye = 9281 + INTEGER(IntKi), PARAMETER :: M42N3MMye = 9282 + INTEGER(IntKi), PARAMETER :: M42N4MMye = 9283 + INTEGER(IntKi), PARAMETER :: M42N5MMye = 9284 + INTEGER(IntKi), PARAMETER :: M42N6MMye = 9285 + INTEGER(IntKi), PARAMETER :: M42N7MMye = 9286 + INTEGER(IntKi), PARAMETER :: M42N8MMye = 9287 + INTEGER(IntKi), PARAMETER :: M42N9MMye = 9288 + INTEGER(IntKi), PARAMETER :: M43N1MMye = 9289 + INTEGER(IntKi), PARAMETER :: M43N2MMye = 9290 + INTEGER(IntKi), PARAMETER :: M43N3MMye = 9291 + INTEGER(IntKi), PARAMETER :: M43N4MMye = 9292 + INTEGER(IntKi), PARAMETER :: M43N5MMye = 9293 + INTEGER(IntKi), PARAMETER :: M43N6MMye = 9294 + INTEGER(IntKi), PARAMETER :: M43N7MMye = 9295 + INTEGER(IntKi), PARAMETER :: M43N8MMye = 9296 + INTEGER(IntKi), PARAMETER :: M43N9MMye = 9297 + INTEGER(IntKi), PARAMETER :: M44N1MMye = 9298 + INTEGER(IntKi), PARAMETER :: M44N2MMye = 9299 + INTEGER(IntKi), PARAMETER :: M44N3MMye = 9300 + INTEGER(IntKi), PARAMETER :: M44N4MMye = 9301 + INTEGER(IntKi), PARAMETER :: M44N5MMye = 9302 + INTEGER(IntKi), PARAMETER :: M44N6MMye = 9303 + INTEGER(IntKi), PARAMETER :: M44N7MMye = 9304 + INTEGER(IntKi), PARAMETER :: M44N8MMye = 9305 + INTEGER(IntKi), PARAMETER :: M44N9MMye = 9306 + INTEGER(IntKi), PARAMETER :: M45N1MMye = 9307 + INTEGER(IntKi), PARAMETER :: M45N2MMye = 9308 + INTEGER(IntKi), PARAMETER :: M45N3MMye = 9309 + INTEGER(IntKi), PARAMETER :: M45N4MMye = 9310 + INTEGER(IntKi), PARAMETER :: M45N5MMye = 9311 + INTEGER(IntKi), PARAMETER :: M45N6MMye = 9312 + INTEGER(IntKi), PARAMETER :: M45N7MMye = 9313 + INTEGER(IntKi), PARAMETER :: M45N8MMye = 9314 + INTEGER(IntKi), PARAMETER :: M45N9MMye = 9315 + INTEGER(IntKi), PARAMETER :: M46N1MMye = 9316 + INTEGER(IntKi), PARAMETER :: M46N2MMye = 9317 + INTEGER(IntKi), PARAMETER :: M46N3MMye = 9318 + INTEGER(IntKi), PARAMETER :: M46N4MMye = 9319 + INTEGER(IntKi), PARAMETER :: M46N5MMye = 9320 + INTEGER(IntKi), PARAMETER :: M46N6MMye = 9321 + INTEGER(IntKi), PARAMETER :: M46N7MMye = 9322 + INTEGER(IntKi), PARAMETER :: M46N8MMye = 9323 + INTEGER(IntKi), PARAMETER :: M46N9MMye = 9324 + INTEGER(IntKi), PARAMETER :: M47N1MMye = 9325 + INTEGER(IntKi), PARAMETER :: M47N2MMye = 9326 + INTEGER(IntKi), PARAMETER :: M47N3MMye = 9327 + INTEGER(IntKi), PARAMETER :: M47N4MMye = 9328 + INTEGER(IntKi), PARAMETER :: M47N5MMye = 9329 + INTEGER(IntKi), PARAMETER :: M47N6MMye = 9330 + INTEGER(IntKi), PARAMETER :: M47N7MMye = 9331 + INTEGER(IntKi), PARAMETER :: M47N8MMye = 9332 + INTEGER(IntKi), PARAMETER :: M47N9MMye = 9333 + INTEGER(IntKi), PARAMETER :: M48N1MMye = 9334 + INTEGER(IntKi), PARAMETER :: M48N2MMye = 9335 + INTEGER(IntKi), PARAMETER :: M48N3MMye = 9336 + INTEGER(IntKi), PARAMETER :: M48N4MMye = 9337 + INTEGER(IntKi), PARAMETER :: M48N5MMye = 9338 + INTEGER(IntKi), PARAMETER :: M48N6MMye = 9339 + INTEGER(IntKi), PARAMETER :: M48N7MMye = 9340 + INTEGER(IntKi), PARAMETER :: M48N8MMye = 9341 + INTEGER(IntKi), PARAMETER :: M48N9MMye = 9342 + INTEGER(IntKi), PARAMETER :: M49N1MMye = 9343 + INTEGER(IntKi), PARAMETER :: M49N2MMye = 9344 + INTEGER(IntKi), PARAMETER :: M49N3MMye = 9345 + INTEGER(IntKi), PARAMETER :: M49N4MMye = 9346 + INTEGER(IntKi), PARAMETER :: M49N5MMye = 9347 + INTEGER(IntKi), PARAMETER :: M49N6MMye = 9348 + INTEGER(IntKi), PARAMETER :: M49N7MMye = 9349 + INTEGER(IntKi), PARAMETER :: M49N8MMye = 9350 + INTEGER(IntKi), PARAMETER :: M49N9MMye = 9351 + INTEGER(IntKi), PARAMETER :: M50N1MMye = 9352 + INTEGER(IntKi), PARAMETER :: M50N2MMye = 9353 + INTEGER(IntKi), PARAMETER :: M50N3MMye = 9354 + INTEGER(IntKi), PARAMETER :: M50N4MMye = 9355 + INTEGER(IntKi), PARAMETER :: M50N5MMye = 9356 + INTEGER(IntKi), PARAMETER :: M50N6MMye = 9357 + INTEGER(IntKi), PARAMETER :: M50N7MMye = 9358 + INTEGER(IntKi), PARAMETER :: M50N8MMye = 9359 + INTEGER(IntKi), PARAMETER :: M50N9MMye = 9360 + INTEGER(IntKi), PARAMETER :: M51N1MMye = 9361 + INTEGER(IntKi), PARAMETER :: M51N2MMye = 9362 + INTEGER(IntKi), PARAMETER :: M51N3MMye = 9363 + INTEGER(IntKi), PARAMETER :: M51N4MMye = 9364 + INTEGER(IntKi), PARAMETER :: M51N5MMye = 9365 + INTEGER(IntKi), PARAMETER :: M51N6MMye = 9366 + INTEGER(IntKi), PARAMETER :: M51N7MMye = 9367 + INTEGER(IntKi), PARAMETER :: M51N8MMye = 9368 + INTEGER(IntKi), PARAMETER :: M51N9MMye = 9369 + INTEGER(IntKi), PARAMETER :: M52N1MMye = 9370 + INTEGER(IntKi), PARAMETER :: M52N2MMye = 9371 + INTEGER(IntKi), PARAMETER :: M52N3MMye = 9372 + INTEGER(IntKi), PARAMETER :: M52N4MMye = 9373 + INTEGER(IntKi), PARAMETER :: M52N5MMye = 9374 + INTEGER(IntKi), PARAMETER :: M52N6MMye = 9375 + INTEGER(IntKi), PARAMETER :: M52N7MMye = 9376 + INTEGER(IntKi), PARAMETER :: M52N8MMye = 9377 + INTEGER(IntKi), PARAMETER :: M52N9MMye = 9378 + INTEGER(IntKi), PARAMETER :: M53N1MMye = 9379 + INTEGER(IntKi), PARAMETER :: M53N2MMye = 9380 + INTEGER(IntKi), PARAMETER :: M53N3MMye = 9381 + INTEGER(IntKi), PARAMETER :: M53N4MMye = 9382 + INTEGER(IntKi), PARAMETER :: M53N5MMye = 9383 + INTEGER(IntKi), PARAMETER :: M53N6MMye = 9384 + INTEGER(IntKi), PARAMETER :: M53N7MMye = 9385 + INTEGER(IntKi), PARAMETER :: M53N8MMye = 9386 + INTEGER(IntKi), PARAMETER :: M53N9MMye = 9387 + INTEGER(IntKi), PARAMETER :: M54N1MMye = 9388 + INTEGER(IntKi), PARAMETER :: M54N2MMye = 9389 + INTEGER(IntKi), PARAMETER :: M54N3MMye = 9390 + INTEGER(IntKi), PARAMETER :: M54N4MMye = 9391 + INTEGER(IntKi), PARAMETER :: M54N5MMye = 9392 + INTEGER(IntKi), PARAMETER :: M54N6MMye = 9393 + INTEGER(IntKi), PARAMETER :: M54N7MMye = 9394 + INTEGER(IntKi), PARAMETER :: M54N8MMye = 9395 + INTEGER(IntKi), PARAMETER :: M54N9MMye = 9396 + INTEGER(IntKi), PARAMETER :: M55N1MMye = 9397 + INTEGER(IntKi), PARAMETER :: M55N2MMye = 9398 + INTEGER(IntKi), PARAMETER :: M55N3MMye = 9399 + INTEGER(IntKi), PARAMETER :: M55N4MMye = 9400 + INTEGER(IntKi), PARAMETER :: M55N5MMye = 9401 + INTEGER(IntKi), PARAMETER :: M55N6MMye = 9402 + INTEGER(IntKi), PARAMETER :: M55N7MMye = 9403 + INTEGER(IntKi), PARAMETER :: M55N8MMye = 9404 + INTEGER(IntKi), PARAMETER :: M55N9MMye = 9405 + INTEGER(IntKi), PARAMETER :: M56N1MMye = 9406 + INTEGER(IntKi), PARAMETER :: M56N2MMye = 9407 + INTEGER(IntKi), PARAMETER :: M56N3MMye = 9408 + INTEGER(IntKi), PARAMETER :: M56N4MMye = 9409 + INTEGER(IntKi), PARAMETER :: M56N5MMye = 9410 + INTEGER(IntKi), PARAMETER :: M56N6MMye = 9411 + INTEGER(IntKi), PARAMETER :: M56N7MMye = 9412 + INTEGER(IntKi), PARAMETER :: M56N8MMye = 9413 + INTEGER(IntKi), PARAMETER :: M56N9MMye = 9414 + INTEGER(IntKi), PARAMETER :: M57N1MMye = 9415 + INTEGER(IntKi), PARAMETER :: M57N2MMye = 9416 + INTEGER(IntKi), PARAMETER :: M57N3MMye = 9417 + INTEGER(IntKi), PARAMETER :: M57N4MMye = 9418 + INTEGER(IntKi), PARAMETER :: M57N5MMye = 9419 + INTEGER(IntKi), PARAMETER :: M57N6MMye = 9420 + INTEGER(IntKi), PARAMETER :: M57N7MMye = 9421 + INTEGER(IntKi), PARAMETER :: M57N8MMye = 9422 + INTEGER(IntKi), PARAMETER :: M57N9MMye = 9423 + INTEGER(IntKi), PARAMETER :: M58N1MMye = 9424 + INTEGER(IntKi), PARAMETER :: M58N2MMye = 9425 + INTEGER(IntKi), PARAMETER :: M58N3MMye = 9426 + INTEGER(IntKi), PARAMETER :: M58N4MMye = 9427 + INTEGER(IntKi), PARAMETER :: M58N5MMye = 9428 + INTEGER(IntKi), PARAMETER :: M58N6MMye = 9429 + INTEGER(IntKi), PARAMETER :: M58N7MMye = 9430 + INTEGER(IntKi), PARAMETER :: M58N8MMye = 9431 + INTEGER(IntKi), PARAMETER :: M58N9MMye = 9432 + INTEGER(IntKi), PARAMETER :: M59N1MMye = 9433 + INTEGER(IntKi), PARAMETER :: M59N2MMye = 9434 + INTEGER(IntKi), PARAMETER :: M59N3MMye = 9435 + INTEGER(IntKi), PARAMETER :: M59N4MMye = 9436 + INTEGER(IntKi), PARAMETER :: M59N5MMye = 9437 + INTEGER(IntKi), PARAMETER :: M59N6MMye = 9438 + INTEGER(IntKi), PARAMETER :: M59N7MMye = 9439 + INTEGER(IntKi), PARAMETER :: M59N8MMye = 9440 + INTEGER(IntKi), PARAMETER :: M59N9MMye = 9441 + INTEGER(IntKi), PARAMETER :: M60N1MMye = 9442 + INTEGER(IntKi), PARAMETER :: M60N2MMye = 9443 + INTEGER(IntKi), PARAMETER :: M60N3MMye = 9444 + INTEGER(IntKi), PARAMETER :: M60N4MMye = 9445 + INTEGER(IntKi), PARAMETER :: M60N5MMye = 9446 + INTEGER(IntKi), PARAMETER :: M60N6MMye = 9447 + INTEGER(IntKi), PARAMETER :: M60N7MMye = 9448 + INTEGER(IntKi), PARAMETER :: M60N8MMye = 9449 + INTEGER(IntKi), PARAMETER :: M60N9MMye = 9450 + INTEGER(IntKi), PARAMETER :: M61N1MMye = 9451 + INTEGER(IntKi), PARAMETER :: M61N2MMye = 9452 + INTEGER(IntKi), PARAMETER :: M61N3MMye = 9453 + INTEGER(IntKi), PARAMETER :: M61N4MMye = 9454 + INTEGER(IntKi), PARAMETER :: M61N5MMye = 9455 + INTEGER(IntKi), PARAMETER :: M61N6MMye = 9456 + INTEGER(IntKi), PARAMETER :: M61N7MMye = 9457 + INTEGER(IntKi), PARAMETER :: M61N8MMye = 9458 + INTEGER(IntKi), PARAMETER :: M61N9MMye = 9459 + INTEGER(IntKi), PARAMETER :: M62N1MMye = 9460 + INTEGER(IntKi), PARAMETER :: M62N2MMye = 9461 + INTEGER(IntKi), PARAMETER :: M62N3MMye = 9462 + INTEGER(IntKi), PARAMETER :: M62N4MMye = 9463 + INTEGER(IntKi), PARAMETER :: M62N5MMye = 9464 + INTEGER(IntKi), PARAMETER :: M62N6MMye = 9465 + INTEGER(IntKi), PARAMETER :: M62N7MMye = 9466 + INTEGER(IntKi), PARAMETER :: M62N8MMye = 9467 + INTEGER(IntKi), PARAMETER :: M62N9MMye = 9468 + INTEGER(IntKi), PARAMETER :: M63N1MMye = 9469 + INTEGER(IntKi), PARAMETER :: M63N2MMye = 9470 + INTEGER(IntKi), PARAMETER :: M63N3MMye = 9471 + INTEGER(IntKi), PARAMETER :: M63N4MMye = 9472 + INTEGER(IntKi), PARAMETER :: M63N5MMye = 9473 + INTEGER(IntKi), PARAMETER :: M63N6MMye = 9474 + INTEGER(IntKi), PARAMETER :: M63N7MMye = 9475 + INTEGER(IntKi), PARAMETER :: M63N8MMye = 9476 + INTEGER(IntKi), PARAMETER :: M63N9MMye = 9477 + INTEGER(IntKi), PARAMETER :: M64N1MMye = 9478 + INTEGER(IntKi), PARAMETER :: M64N2MMye = 9479 + INTEGER(IntKi), PARAMETER :: M64N3MMye = 9480 + INTEGER(IntKi), PARAMETER :: M64N4MMye = 9481 + INTEGER(IntKi), PARAMETER :: M64N5MMye = 9482 + INTEGER(IntKi), PARAMETER :: M64N6MMye = 9483 + INTEGER(IntKi), PARAMETER :: M64N7MMye = 9484 + INTEGER(IntKi), PARAMETER :: M64N8MMye = 9485 + INTEGER(IntKi), PARAMETER :: M64N9MMye = 9486 + INTEGER(IntKi), PARAMETER :: M65N1MMye = 9487 + INTEGER(IntKi), PARAMETER :: M65N2MMye = 9488 + INTEGER(IntKi), PARAMETER :: M65N3MMye = 9489 + INTEGER(IntKi), PARAMETER :: M65N4MMye = 9490 + INTEGER(IntKi), PARAMETER :: M65N5MMye = 9491 + INTEGER(IntKi), PARAMETER :: M65N6MMye = 9492 + INTEGER(IntKi), PARAMETER :: M65N7MMye = 9493 + INTEGER(IntKi), PARAMETER :: M65N8MMye = 9494 + INTEGER(IntKi), PARAMETER :: M65N9MMye = 9495 + INTEGER(IntKi), PARAMETER :: M66N1MMye = 9496 + INTEGER(IntKi), PARAMETER :: M66N2MMye = 9497 + INTEGER(IntKi), PARAMETER :: M66N3MMye = 9498 + INTEGER(IntKi), PARAMETER :: M66N4MMye = 9499 + INTEGER(IntKi), PARAMETER :: M66N5MMye = 9500 + INTEGER(IntKi), PARAMETER :: M66N6MMye = 9501 + INTEGER(IntKi), PARAMETER :: M66N7MMye = 9502 + INTEGER(IntKi), PARAMETER :: M66N8MMye = 9503 + INTEGER(IntKi), PARAMETER :: M66N9MMye = 9504 + INTEGER(IntKi), PARAMETER :: M67N1MMye = 9505 + INTEGER(IntKi), PARAMETER :: M67N2MMye = 9506 + INTEGER(IntKi), PARAMETER :: M67N3MMye = 9507 + INTEGER(IntKi), PARAMETER :: M67N4MMye = 9508 + INTEGER(IntKi), PARAMETER :: M67N5MMye = 9509 + INTEGER(IntKi), PARAMETER :: M67N6MMye = 9510 + INTEGER(IntKi), PARAMETER :: M67N7MMye = 9511 + INTEGER(IntKi), PARAMETER :: M67N8MMye = 9512 + INTEGER(IntKi), PARAMETER :: M67N9MMye = 9513 + INTEGER(IntKi), PARAMETER :: M68N1MMye = 9514 + INTEGER(IntKi), PARAMETER :: M68N2MMye = 9515 + INTEGER(IntKi), PARAMETER :: M68N3MMye = 9516 + INTEGER(IntKi), PARAMETER :: M68N4MMye = 9517 + INTEGER(IntKi), PARAMETER :: M68N5MMye = 9518 + INTEGER(IntKi), PARAMETER :: M68N6MMye = 9519 + INTEGER(IntKi), PARAMETER :: M68N7MMye = 9520 + INTEGER(IntKi), PARAMETER :: M68N8MMye = 9521 + INTEGER(IntKi), PARAMETER :: M68N9MMye = 9522 + INTEGER(IntKi), PARAMETER :: M69N1MMye = 9523 + INTEGER(IntKi), PARAMETER :: M69N2MMye = 9524 + INTEGER(IntKi), PARAMETER :: M69N3MMye = 9525 + INTEGER(IntKi), PARAMETER :: M69N4MMye = 9526 + INTEGER(IntKi), PARAMETER :: M69N5MMye = 9527 + INTEGER(IntKi), PARAMETER :: M69N6MMye = 9528 + INTEGER(IntKi), PARAMETER :: M69N7MMye = 9529 + INTEGER(IntKi), PARAMETER :: M69N8MMye = 9530 + INTEGER(IntKi), PARAMETER :: M69N9MMye = 9531 + INTEGER(IntKi), PARAMETER :: M70N1MMye = 9532 + INTEGER(IntKi), PARAMETER :: M70N2MMye = 9533 + INTEGER(IntKi), PARAMETER :: M70N3MMye = 9534 + INTEGER(IntKi), PARAMETER :: M70N4MMye = 9535 + INTEGER(IntKi), PARAMETER :: M70N5MMye = 9536 + INTEGER(IntKi), PARAMETER :: M70N6MMye = 9537 + INTEGER(IntKi), PARAMETER :: M70N7MMye = 9538 + INTEGER(IntKi), PARAMETER :: M70N8MMye = 9539 + INTEGER(IntKi), PARAMETER :: M70N9MMye = 9540 + INTEGER(IntKi), PARAMETER :: M71N1MMye = 9541 + INTEGER(IntKi), PARAMETER :: M71N2MMye = 9542 + INTEGER(IntKi), PARAMETER :: M71N3MMye = 9543 + INTEGER(IntKi), PARAMETER :: M71N4MMye = 9544 + INTEGER(IntKi), PARAMETER :: M71N5MMye = 9545 + INTEGER(IntKi), PARAMETER :: M71N6MMye = 9546 + INTEGER(IntKi), PARAMETER :: M71N7MMye = 9547 + INTEGER(IntKi), PARAMETER :: M71N8MMye = 9548 + INTEGER(IntKi), PARAMETER :: M71N9MMye = 9549 + INTEGER(IntKi), PARAMETER :: M72N1MMye = 9550 + INTEGER(IntKi), PARAMETER :: M72N2MMye = 9551 + INTEGER(IntKi), PARAMETER :: M72N3MMye = 9552 + INTEGER(IntKi), PARAMETER :: M72N4MMye = 9553 + INTEGER(IntKi), PARAMETER :: M72N5MMye = 9554 + INTEGER(IntKi), PARAMETER :: M72N6MMye = 9555 + INTEGER(IntKi), PARAMETER :: M72N7MMye = 9556 + INTEGER(IntKi), PARAMETER :: M72N8MMye = 9557 + INTEGER(IntKi), PARAMETER :: M72N9MMye = 9558 + INTEGER(IntKi), PARAMETER :: M73N1MMye = 9559 + INTEGER(IntKi), PARAMETER :: M73N2MMye = 9560 + INTEGER(IntKi), PARAMETER :: M73N3MMye = 9561 + INTEGER(IntKi), PARAMETER :: M73N4MMye = 9562 + INTEGER(IntKi), PARAMETER :: M73N5MMye = 9563 + INTEGER(IntKi), PARAMETER :: M73N6MMye = 9564 + INTEGER(IntKi), PARAMETER :: M73N7MMye = 9565 + INTEGER(IntKi), PARAMETER :: M73N8MMye = 9566 + INTEGER(IntKi), PARAMETER :: M73N9MMye = 9567 + INTEGER(IntKi), PARAMETER :: M74N1MMye = 9568 + INTEGER(IntKi), PARAMETER :: M74N2MMye = 9569 + INTEGER(IntKi), PARAMETER :: M74N3MMye = 9570 + INTEGER(IntKi), PARAMETER :: M74N4MMye = 9571 + INTEGER(IntKi), PARAMETER :: M74N5MMye = 9572 + INTEGER(IntKi), PARAMETER :: M74N6MMye = 9573 + INTEGER(IntKi), PARAMETER :: M74N7MMye = 9574 + INTEGER(IntKi), PARAMETER :: M74N8MMye = 9575 + INTEGER(IntKi), PARAMETER :: M74N9MMye = 9576 + INTEGER(IntKi), PARAMETER :: M75N1MMye = 9577 + INTEGER(IntKi), PARAMETER :: M75N2MMye = 9578 + INTEGER(IntKi), PARAMETER :: M75N3MMye = 9579 + INTEGER(IntKi), PARAMETER :: M75N4MMye = 9580 + INTEGER(IntKi), PARAMETER :: M75N5MMye = 9581 + INTEGER(IntKi), PARAMETER :: M75N6MMye = 9582 + INTEGER(IntKi), PARAMETER :: M75N7MMye = 9583 + INTEGER(IntKi), PARAMETER :: M75N8MMye = 9584 + INTEGER(IntKi), PARAMETER :: M75N9MMye = 9585 + INTEGER(IntKi), PARAMETER :: M76N1MMye = 9586 + INTEGER(IntKi), PARAMETER :: M76N2MMye = 9587 + INTEGER(IntKi), PARAMETER :: M76N3MMye = 9588 + INTEGER(IntKi), PARAMETER :: M76N4MMye = 9589 + INTEGER(IntKi), PARAMETER :: M76N5MMye = 9590 + INTEGER(IntKi), PARAMETER :: M76N6MMye = 9591 + INTEGER(IntKi), PARAMETER :: M76N7MMye = 9592 + INTEGER(IntKi), PARAMETER :: M76N8MMye = 9593 + INTEGER(IntKi), PARAMETER :: M76N9MMye = 9594 + INTEGER(IntKi), PARAMETER :: M77N1MMye = 9595 + INTEGER(IntKi), PARAMETER :: M77N2MMye = 9596 + INTEGER(IntKi), PARAMETER :: M77N3MMye = 9597 + INTEGER(IntKi), PARAMETER :: M77N4MMye = 9598 + INTEGER(IntKi), PARAMETER :: M77N5MMye = 9599 + INTEGER(IntKi), PARAMETER :: M77N6MMye = 9600 + INTEGER(IntKi), PARAMETER :: M77N7MMye = 9601 + INTEGER(IntKi), PARAMETER :: M77N8MMye = 9602 + INTEGER(IntKi), PARAMETER :: M77N9MMye = 9603 + INTEGER(IntKi), PARAMETER :: M78N1MMye = 9604 + INTEGER(IntKi), PARAMETER :: M78N2MMye = 9605 + INTEGER(IntKi), PARAMETER :: M78N3MMye = 9606 + INTEGER(IntKi), PARAMETER :: M78N4MMye = 9607 + INTEGER(IntKi), PARAMETER :: M78N5MMye = 9608 + INTEGER(IntKi), PARAMETER :: M78N6MMye = 9609 + INTEGER(IntKi), PARAMETER :: M78N7MMye = 9610 + INTEGER(IntKi), PARAMETER :: M78N8MMye = 9611 + INTEGER(IntKi), PARAMETER :: M78N9MMye = 9612 + INTEGER(IntKi), PARAMETER :: M79N1MMye = 9613 + INTEGER(IntKi), PARAMETER :: M79N2MMye = 9614 + INTEGER(IntKi), PARAMETER :: M79N3MMye = 9615 + INTEGER(IntKi), PARAMETER :: M79N4MMye = 9616 + INTEGER(IntKi), PARAMETER :: M79N5MMye = 9617 + INTEGER(IntKi), PARAMETER :: M79N6MMye = 9618 + INTEGER(IntKi), PARAMETER :: M79N7MMye = 9619 + INTEGER(IntKi), PARAMETER :: M79N8MMye = 9620 + INTEGER(IntKi), PARAMETER :: M79N9MMye = 9621 + INTEGER(IntKi), PARAMETER :: M80N1MMye = 9622 + INTEGER(IntKi), PARAMETER :: M80N2MMye = 9623 + INTEGER(IntKi), PARAMETER :: M80N3MMye = 9624 + INTEGER(IntKi), PARAMETER :: M80N4MMye = 9625 + INTEGER(IntKi), PARAMETER :: M80N5MMye = 9626 + INTEGER(IntKi), PARAMETER :: M80N6MMye = 9627 + INTEGER(IntKi), PARAMETER :: M80N7MMye = 9628 + INTEGER(IntKi), PARAMETER :: M80N8MMye = 9629 + INTEGER(IntKi), PARAMETER :: M80N9MMye = 9630 + INTEGER(IntKi), PARAMETER :: M81N1MMye = 9631 + INTEGER(IntKi), PARAMETER :: M81N2MMye = 9632 + INTEGER(IntKi), PARAMETER :: M81N3MMye = 9633 + INTEGER(IntKi), PARAMETER :: M81N4MMye = 9634 + INTEGER(IntKi), PARAMETER :: M81N5MMye = 9635 + INTEGER(IntKi), PARAMETER :: M81N6MMye = 9636 + INTEGER(IntKi), PARAMETER :: M81N7MMye = 9637 + INTEGER(IntKi), PARAMETER :: M81N8MMye = 9638 + INTEGER(IntKi), PARAMETER :: M81N9MMye = 9639 + INTEGER(IntKi), PARAMETER :: M82N1MMye = 9640 + INTEGER(IntKi), PARAMETER :: M82N2MMye = 9641 + INTEGER(IntKi), PARAMETER :: M82N3MMye = 9642 + INTEGER(IntKi), PARAMETER :: M82N4MMye = 9643 + INTEGER(IntKi), PARAMETER :: M82N5MMye = 9644 + INTEGER(IntKi), PARAMETER :: M82N6MMye = 9645 + INTEGER(IntKi), PARAMETER :: M82N7MMye = 9646 + INTEGER(IntKi), PARAMETER :: M82N8MMye = 9647 + INTEGER(IntKi), PARAMETER :: M82N9MMye = 9648 + INTEGER(IntKi), PARAMETER :: M83N1MMye = 9649 + INTEGER(IntKi), PARAMETER :: M83N2MMye = 9650 + INTEGER(IntKi), PARAMETER :: M83N3MMye = 9651 + INTEGER(IntKi), PARAMETER :: M83N4MMye = 9652 + INTEGER(IntKi), PARAMETER :: M83N5MMye = 9653 + INTEGER(IntKi), PARAMETER :: M83N6MMye = 9654 + INTEGER(IntKi), PARAMETER :: M83N7MMye = 9655 + INTEGER(IntKi), PARAMETER :: M83N8MMye = 9656 + INTEGER(IntKi), PARAMETER :: M83N9MMye = 9657 + INTEGER(IntKi), PARAMETER :: M84N1MMye = 9658 + INTEGER(IntKi), PARAMETER :: M84N2MMye = 9659 + INTEGER(IntKi), PARAMETER :: M84N3MMye = 9660 + INTEGER(IntKi), PARAMETER :: M84N4MMye = 9661 + INTEGER(IntKi), PARAMETER :: M84N5MMye = 9662 + INTEGER(IntKi), PARAMETER :: M84N6MMye = 9663 + INTEGER(IntKi), PARAMETER :: M84N7MMye = 9664 + INTEGER(IntKi), PARAMETER :: M84N8MMye = 9665 + INTEGER(IntKi), PARAMETER :: M84N9MMye = 9666 + INTEGER(IntKi), PARAMETER :: M85N1MMye = 9667 + INTEGER(IntKi), PARAMETER :: M85N2MMye = 9668 + INTEGER(IntKi), PARAMETER :: M85N3MMye = 9669 + INTEGER(IntKi), PARAMETER :: M85N4MMye = 9670 + INTEGER(IntKi), PARAMETER :: M85N5MMye = 9671 + INTEGER(IntKi), PARAMETER :: M85N6MMye = 9672 + INTEGER(IntKi), PARAMETER :: M85N7MMye = 9673 + INTEGER(IntKi), PARAMETER :: M85N8MMye = 9674 + INTEGER(IntKi), PARAMETER :: M85N9MMye = 9675 + INTEGER(IntKi), PARAMETER :: M86N1MMye = 9676 + INTEGER(IntKi), PARAMETER :: M86N2MMye = 9677 + INTEGER(IntKi), PARAMETER :: M86N3MMye = 9678 + INTEGER(IntKi), PARAMETER :: M86N4MMye = 9679 + INTEGER(IntKi), PARAMETER :: M86N5MMye = 9680 + INTEGER(IntKi), PARAMETER :: M86N6MMye = 9681 + INTEGER(IntKi), PARAMETER :: M86N7MMye = 9682 + INTEGER(IntKi), PARAMETER :: M86N8MMye = 9683 + INTEGER(IntKi), PARAMETER :: M86N9MMye = 9684 + INTEGER(IntKi), PARAMETER :: M87N1MMye = 9685 + INTEGER(IntKi), PARAMETER :: M87N2MMye = 9686 + INTEGER(IntKi), PARAMETER :: M87N3MMye = 9687 + INTEGER(IntKi), PARAMETER :: M87N4MMye = 9688 + INTEGER(IntKi), PARAMETER :: M87N5MMye = 9689 + INTEGER(IntKi), PARAMETER :: M87N6MMye = 9690 + INTEGER(IntKi), PARAMETER :: M87N7MMye = 9691 + INTEGER(IntKi), PARAMETER :: M87N8MMye = 9692 + INTEGER(IntKi), PARAMETER :: M87N9MMye = 9693 + INTEGER(IntKi), PARAMETER :: M88N1MMye = 9694 + INTEGER(IntKi), PARAMETER :: M88N2MMye = 9695 + INTEGER(IntKi), PARAMETER :: M88N3MMye = 9696 + INTEGER(IntKi), PARAMETER :: M88N4MMye = 9697 + INTEGER(IntKi), PARAMETER :: M88N5MMye = 9698 + INTEGER(IntKi), PARAMETER :: M88N6MMye = 9699 + INTEGER(IntKi), PARAMETER :: M88N7MMye = 9700 + INTEGER(IntKi), PARAMETER :: M88N8MMye = 9701 + INTEGER(IntKi), PARAMETER :: M88N9MMye = 9702 + INTEGER(IntKi), PARAMETER :: M89N1MMye = 9703 + INTEGER(IntKi), PARAMETER :: M89N2MMye = 9704 + INTEGER(IntKi), PARAMETER :: M89N3MMye = 9705 + INTEGER(IntKi), PARAMETER :: M89N4MMye = 9706 + INTEGER(IntKi), PARAMETER :: M89N5MMye = 9707 + INTEGER(IntKi), PARAMETER :: M89N6MMye = 9708 + INTEGER(IntKi), PARAMETER :: M89N7MMye = 9709 + INTEGER(IntKi), PARAMETER :: M89N8MMye = 9710 + INTEGER(IntKi), PARAMETER :: M89N9MMye = 9711 + INTEGER(IntKi), PARAMETER :: M90N1MMye = 9712 + INTEGER(IntKi), PARAMETER :: M90N2MMye = 9713 + INTEGER(IntKi), PARAMETER :: M90N3MMye = 9714 + INTEGER(IntKi), PARAMETER :: M90N4MMye = 9715 + INTEGER(IntKi), PARAMETER :: M90N5MMye = 9716 + INTEGER(IntKi), PARAMETER :: M90N6MMye = 9717 + INTEGER(IntKi), PARAMETER :: M90N7MMye = 9718 + INTEGER(IntKi), PARAMETER :: M90N8MMye = 9719 + INTEGER(IntKi), PARAMETER :: M90N9MMye = 9720 + INTEGER(IntKi), PARAMETER :: M91N1MMye = 9721 + INTEGER(IntKi), PARAMETER :: M91N2MMye = 9722 + INTEGER(IntKi), PARAMETER :: M91N3MMye = 9723 + INTEGER(IntKi), PARAMETER :: M91N4MMye = 9724 + INTEGER(IntKi), PARAMETER :: M91N5MMye = 9725 + INTEGER(IntKi), PARAMETER :: M91N6MMye = 9726 + INTEGER(IntKi), PARAMETER :: M91N7MMye = 9727 + INTEGER(IntKi), PARAMETER :: M91N8MMye = 9728 + INTEGER(IntKi), PARAMETER :: M91N9MMye = 9729 + INTEGER(IntKi), PARAMETER :: M92N1MMye = 9730 + INTEGER(IntKi), PARAMETER :: M92N2MMye = 9731 + INTEGER(IntKi), PARAMETER :: M92N3MMye = 9732 + INTEGER(IntKi), PARAMETER :: M92N4MMye = 9733 + INTEGER(IntKi), PARAMETER :: M92N5MMye = 9734 + INTEGER(IntKi), PARAMETER :: M92N6MMye = 9735 + INTEGER(IntKi), PARAMETER :: M92N7MMye = 9736 + INTEGER(IntKi), PARAMETER :: M92N8MMye = 9737 + INTEGER(IntKi), PARAMETER :: M92N9MMye = 9738 + INTEGER(IntKi), PARAMETER :: M93N1MMye = 9739 + INTEGER(IntKi), PARAMETER :: M93N2MMye = 9740 + INTEGER(IntKi), PARAMETER :: M93N3MMye = 9741 + INTEGER(IntKi), PARAMETER :: M93N4MMye = 9742 + INTEGER(IntKi), PARAMETER :: M93N5MMye = 9743 + INTEGER(IntKi), PARAMETER :: M93N6MMye = 9744 + INTEGER(IntKi), PARAMETER :: M93N7MMye = 9745 + INTEGER(IntKi), PARAMETER :: M93N8MMye = 9746 + INTEGER(IntKi), PARAMETER :: M93N9MMye = 9747 + INTEGER(IntKi), PARAMETER :: M94N1MMye = 9748 + INTEGER(IntKi), PARAMETER :: M94N2MMye = 9749 + INTEGER(IntKi), PARAMETER :: M94N3MMye = 9750 + INTEGER(IntKi), PARAMETER :: M94N4MMye = 9751 + INTEGER(IntKi), PARAMETER :: M94N5MMye = 9752 + INTEGER(IntKi), PARAMETER :: M94N6MMye = 9753 + INTEGER(IntKi), PARAMETER :: M94N7MMye = 9754 + INTEGER(IntKi), PARAMETER :: M94N8MMye = 9755 + INTEGER(IntKi), PARAMETER :: M94N9MMye = 9756 + INTEGER(IntKi), PARAMETER :: M95N1MMye = 9757 + INTEGER(IntKi), PARAMETER :: M95N2MMye = 9758 + INTEGER(IntKi), PARAMETER :: M95N3MMye = 9759 + INTEGER(IntKi), PARAMETER :: M95N4MMye = 9760 + INTEGER(IntKi), PARAMETER :: M95N5MMye = 9761 + INTEGER(IntKi), PARAMETER :: M95N6MMye = 9762 + INTEGER(IntKi), PARAMETER :: M95N7MMye = 9763 + INTEGER(IntKi), PARAMETER :: M95N8MMye = 9764 + INTEGER(IntKi), PARAMETER :: M95N9MMye = 9765 + INTEGER(IntKi), PARAMETER :: M96N1MMye = 9766 + INTEGER(IntKi), PARAMETER :: M96N2MMye = 9767 + INTEGER(IntKi), PARAMETER :: M96N3MMye = 9768 + INTEGER(IntKi), PARAMETER :: M96N4MMye = 9769 + INTEGER(IntKi), PARAMETER :: M96N5MMye = 9770 + INTEGER(IntKi), PARAMETER :: M96N6MMye = 9771 + INTEGER(IntKi), PARAMETER :: M96N7MMye = 9772 + INTEGER(IntKi), PARAMETER :: M96N8MMye = 9773 + INTEGER(IntKi), PARAMETER :: M96N9MMye = 9774 + INTEGER(IntKi), PARAMETER :: M97N1MMye = 9775 + INTEGER(IntKi), PARAMETER :: M97N2MMye = 9776 + INTEGER(IntKi), PARAMETER :: M97N3MMye = 9777 + INTEGER(IntKi), PARAMETER :: M97N4MMye = 9778 + INTEGER(IntKi), PARAMETER :: M97N5MMye = 9779 + INTEGER(IntKi), PARAMETER :: M97N6MMye = 9780 + INTEGER(IntKi), PARAMETER :: M97N7MMye = 9781 + INTEGER(IntKi), PARAMETER :: M97N8MMye = 9782 + INTEGER(IntKi), PARAMETER :: M97N9MMye = 9783 + INTEGER(IntKi), PARAMETER :: M98N1MMye = 9784 + INTEGER(IntKi), PARAMETER :: M98N2MMye = 9785 + INTEGER(IntKi), PARAMETER :: M98N3MMye = 9786 + INTEGER(IntKi), PARAMETER :: M98N4MMye = 9787 + INTEGER(IntKi), PARAMETER :: M98N5MMye = 9788 + INTEGER(IntKi), PARAMETER :: M98N6MMye = 9789 + INTEGER(IntKi), PARAMETER :: M98N7MMye = 9790 + INTEGER(IntKi), PARAMETER :: M98N8MMye = 9791 + INTEGER(IntKi), PARAMETER :: M98N9MMye = 9792 + INTEGER(IntKi), PARAMETER :: M99N1MMye = 9793 + INTEGER(IntKi), PARAMETER :: M99N2MMye = 9794 + INTEGER(IntKi), PARAMETER :: M99N3MMye = 9795 + INTEGER(IntKi), PARAMETER :: M99N4MMye = 9796 + INTEGER(IntKi), PARAMETER :: M99N5MMye = 9797 + INTEGER(IntKi), PARAMETER :: M99N6MMye = 9798 + INTEGER(IntKi), PARAMETER :: M99N7MMye = 9799 + INTEGER(IntKi), PARAMETER :: M99N8MMye = 9800 + INTEGER(IntKi), PARAMETER :: M99N9MMye = 9801 + INTEGER(IntKi), PARAMETER :: M01N1MMze = 9802 + INTEGER(IntKi), PARAMETER :: M01N2MMze = 9803 + INTEGER(IntKi), PARAMETER :: M01N3MMze = 9804 + INTEGER(IntKi), PARAMETER :: M01N4MMze = 9805 + INTEGER(IntKi), PARAMETER :: M01N5MMze = 9806 + INTEGER(IntKi), PARAMETER :: M01N6MMze = 9807 + INTEGER(IntKi), PARAMETER :: M01N7MMze = 9808 + INTEGER(IntKi), PARAMETER :: M01N8MMze = 9809 + INTEGER(IntKi), PARAMETER :: M01N9MMze = 9810 + INTEGER(IntKi), PARAMETER :: M02N1MMze = 9811 + INTEGER(IntKi), PARAMETER :: M02N2MMze = 9812 + INTEGER(IntKi), PARAMETER :: M02N3MMze = 9813 + INTEGER(IntKi), PARAMETER :: M02N4MMze = 9814 + INTEGER(IntKi), PARAMETER :: M02N5MMze = 9815 + INTEGER(IntKi), PARAMETER :: M02N6MMze = 9816 + INTEGER(IntKi), PARAMETER :: M02N7MMze = 9817 + INTEGER(IntKi), PARAMETER :: M02N8MMze = 9818 + INTEGER(IntKi), PARAMETER :: M02N9MMze = 9819 + INTEGER(IntKi), PARAMETER :: M03N1MMze = 9820 + INTEGER(IntKi), PARAMETER :: M03N2MMze = 9821 + INTEGER(IntKi), PARAMETER :: M03N3MMze = 9822 + INTEGER(IntKi), PARAMETER :: M03N4MMze = 9823 + INTEGER(IntKi), PARAMETER :: M03N5MMze = 9824 + INTEGER(IntKi), PARAMETER :: M03N6MMze = 9825 + INTEGER(IntKi), PARAMETER :: M03N7MMze = 9826 + INTEGER(IntKi), PARAMETER :: M03N8MMze = 9827 + INTEGER(IntKi), PARAMETER :: M03N9MMze = 9828 + INTEGER(IntKi), PARAMETER :: M04N1MMze = 9829 + INTEGER(IntKi), PARAMETER :: M04N2MMze = 9830 + INTEGER(IntKi), PARAMETER :: M04N3MMze = 9831 + INTEGER(IntKi), PARAMETER :: M04N4MMze = 9832 + INTEGER(IntKi), PARAMETER :: M04N5MMze = 9833 + INTEGER(IntKi), PARAMETER :: M04N6MMze = 9834 + INTEGER(IntKi), PARAMETER :: M04N7MMze = 9835 + INTEGER(IntKi), PARAMETER :: M04N8MMze = 9836 + INTEGER(IntKi), PARAMETER :: M04N9MMze = 9837 + INTEGER(IntKi), PARAMETER :: M05N1MMze = 9838 + INTEGER(IntKi), PARAMETER :: M05N2MMze = 9839 + INTEGER(IntKi), PARAMETER :: M05N3MMze = 9840 + INTEGER(IntKi), PARAMETER :: M05N4MMze = 9841 + INTEGER(IntKi), PARAMETER :: M05N5MMze = 9842 + INTEGER(IntKi), PARAMETER :: M05N6MMze = 9843 + INTEGER(IntKi), PARAMETER :: M05N7MMze = 9844 + INTEGER(IntKi), PARAMETER :: M05N8MMze = 9845 + INTEGER(IntKi), PARAMETER :: M05N9MMze = 9846 + INTEGER(IntKi), PARAMETER :: M06N1MMze = 9847 + INTEGER(IntKi), PARAMETER :: M06N2MMze = 9848 + INTEGER(IntKi), PARAMETER :: M06N3MMze = 9849 + INTEGER(IntKi), PARAMETER :: M06N4MMze = 9850 + INTEGER(IntKi), PARAMETER :: M06N5MMze = 9851 + INTEGER(IntKi), PARAMETER :: M06N6MMze = 9852 + INTEGER(IntKi), PARAMETER :: M06N7MMze = 9853 + INTEGER(IntKi), PARAMETER :: M06N8MMze = 9854 + INTEGER(IntKi), PARAMETER :: M06N9MMze = 9855 + INTEGER(IntKi), PARAMETER :: M07N1MMze = 9856 + INTEGER(IntKi), PARAMETER :: M07N2MMze = 9857 + INTEGER(IntKi), PARAMETER :: M07N3MMze = 9858 + INTEGER(IntKi), PARAMETER :: M07N4MMze = 9859 + INTEGER(IntKi), PARAMETER :: M07N5MMze = 9860 + INTEGER(IntKi), PARAMETER :: M07N6MMze = 9861 + INTEGER(IntKi), PARAMETER :: M07N7MMze = 9862 + INTEGER(IntKi), PARAMETER :: M07N8MMze = 9863 + INTEGER(IntKi), PARAMETER :: M07N9MMze = 9864 + INTEGER(IntKi), PARAMETER :: M08N1MMze = 9865 + INTEGER(IntKi), PARAMETER :: M08N2MMze = 9866 + INTEGER(IntKi), PARAMETER :: M08N3MMze = 9867 + INTEGER(IntKi), PARAMETER :: M08N4MMze = 9868 + INTEGER(IntKi), PARAMETER :: M08N5MMze = 9869 + INTEGER(IntKi), PARAMETER :: M08N6MMze = 9870 + INTEGER(IntKi), PARAMETER :: M08N7MMze = 9871 + INTEGER(IntKi), PARAMETER :: M08N8MMze = 9872 + INTEGER(IntKi), PARAMETER :: M08N9MMze = 9873 + INTEGER(IntKi), PARAMETER :: M09N1MMze = 9874 + INTEGER(IntKi), PARAMETER :: M09N2MMze = 9875 + INTEGER(IntKi), PARAMETER :: M09N3MMze = 9876 + INTEGER(IntKi), PARAMETER :: M09N4MMze = 9877 + INTEGER(IntKi), PARAMETER :: M09N5MMze = 9878 + INTEGER(IntKi), PARAMETER :: M09N6MMze = 9879 + INTEGER(IntKi), PARAMETER :: M09N7MMze = 9880 + INTEGER(IntKi), PARAMETER :: M09N8MMze = 9881 + INTEGER(IntKi), PARAMETER :: M09N9MMze = 9882 + INTEGER(IntKi), PARAMETER :: M10N1MMze = 9883 + INTEGER(IntKi), PARAMETER :: M10N2MMze = 9884 + INTEGER(IntKi), PARAMETER :: M10N3MMze = 9885 + INTEGER(IntKi), PARAMETER :: M10N4MMze = 9886 + INTEGER(IntKi), PARAMETER :: M10N5MMze = 9887 + INTEGER(IntKi), PARAMETER :: M10N6MMze = 9888 + INTEGER(IntKi), PARAMETER :: M10N7MMze = 9889 + INTEGER(IntKi), PARAMETER :: M10N8MMze = 9890 + INTEGER(IntKi), PARAMETER :: M10N9MMze = 9891 + INTEGER(IntKi), PARAMETER :: M11N1MMze = 9892 + INTEGER(IntKi), PARAMETER :: M11N2MMze = 9893 + INTEGER(IntKi), PARAMETER :: M11N3MMze = 9894 + INTEGER(IntKi), PARAMETER :: M11N4MMze = 9895 + INTEGER(IntKi), PARAMETER :: M11N5MMze = 9896 + INTEGER(IntKi), PARAMETER :: M11N6MMze = 9897 + INTEGER(IntKi), PARAMETER :: M11N7MMze = 9898 + INTEGER(IntKi), PARAMETER :: M11N8MMze = 9899 + INTEGER(IntKi), PARAMETER :: M11N9MMze = 9900 + INTEGER(IntKi), PARAMETER :: M12N1MMze = 9901 + INTEGER(IntKi), PARAMETER :: M12N2MMze = 9902 + INTEGER(IntKi), PARAMETER :: M12N3MMze = 9903 + INTEGER(IntKi), PARAMETER :: M12N4MMze = 9904 + INTEGER(IntKi), PARAMETER :: M12N5MMze = 9905 + INTEGER(IntKi), PARAMETER :: M12N6MMze = 9906 + INTEGER(IntKi), PARAMETER :: M12N7MMze = 9907 + INTEGER(IntKi), PARAMETER :: M12N8MMze = 9908 + INTEGER(IntKi), PARAMETER :: M12N9MMze = 9909 + INTEGER(IntKi), PARAMETER :: M13N1MMze = 9910 + INTEGER(IntKi), PARAMETER :: M13N2MMze = 9911 + INTEGER(IntKi), PARAMETER :: M13N3MMze = 9912 + INTEGER(IntKi), PARAMETER :: M13N4MMze = 9913 + INTEGER(IntKi), PARAMETER :: M13N5MMze = 9914 + INTEGER(IntKi), PARAMETER :: M13N6MMze = 9915 + INTEGER(IntKi), PARAMETER :: M13N7MMze = 9916 + INTEGER(IntKi), PARAMETER :: M13N8MMze = 9917 + INTEGER(IntKi), PARAMETER :: M13N9MMze = 9918 + INTEGER(IntKi), PARAMETER :: M14N1MMze = 9919 + INTEGER(IntKi), PARAMETER :: M14N2MMze = 9920 + INTEGER(IntKi), PARAMETER :: M14N3MMze = 9921 + INTEGER(IntKi), PARAMETER :: M14N4MMze = 9922 + INTEGER(IntKi), PARAMETER :: M14N5MMze = 9923 + INTEGER(IntKi), PARAMETER :: M14N6MMze = 9924 + INTEGER(IntKi), PARAMETER :: M14N7MMze = 9925 + INTEGER(IntKi), PARAMETER :: M14N8MMze = 9926 + INTEGER(IntKi), PARAMETER :: M14N9MMze = 9927 + INTEGER(IntKi), PARAMETER :: M15N1MMze = 9928 + INTEGER(IntKi), PARAMETER :: M15N2MMze = 9929 + INTEGER(IntKi), PARAMETER :: M15N3MMze = 9930 + INTEGER(IntKi), PARAMETER :: M15N4MMze = 9931 + INTEGER(IntKi), PARAMETER :: M15N5MMze = 9932 + INTEGER(IntKi), PARAMETER :: M15N6MMze = 9933 + INTEGER(IntKi), PARAMETER :: M15N7MMze = 9934 + INTEGER(IntKi), PARAMETER :: M15N8MMze = 9935 + INTEGER(IntKi), PARAMETER :: M15N9MMze = 9936 + INTEGER(IntKi), PARAMETER :: M16N1MMze = 9937 + INTEGER(IntKi), PARAMETER :: M16N2MMze = 9938 + INTEGER(IntKi), PARAMETER :: M16N3MMze = 9939 + INTEGER(IntKi), PARAMETER :: M16N4MMze = 9940 + INTEGER(IntKi), PARAMETER :: M16N5MMze = 9941 + INTEGER(IntKi), PARAMETER :: M16N6MMze = 9942 + INTEGER(IntKi), PARAMETER :: M16N7MMze = 9943 + INTEGER(IntKi), PARAMETER :: M16N8MMze = 9944 + INTEGER(IntKi), PARAMETER :: M16N9MMze = 9945 + INTEGER(IntKi), PARAMETER :: M17N1MMze = 9946 + INTEGER(IntKi), PARAMETER :: M17N2MMze = 9947 + INTEGER(IntKi), PARAMETER :: M17N3MMze = 9948 + INTEGER(IntKi), PARAMETER :: M17N4MMze = 9949 + INTEGER(IntKi), PARAMETER :: M17N5MMze = 9950 + INTEGER(IntKi), PARAMETER :: M17N6MMze = 9951 + INTEGER(IntKi), PARAMETER :: M17N7MMze = 9952 + INTEGER(IntKi), PARAMETER :: M17N8MMze = 9953 + INTEGER(IntKi), PARAMETER :: M17N9MMze = 9954 + INTEGER(IntKi), PARAMETER :: M18N1MMze = 9955 + INTEGER(IntKi), PARAMETER :: M18N2MMze = 9956 + INTEGER(IntKi), PARAMETER :: M18N3MMze = 9957 + INTEGER(IntKi), PARAMETER :: M18N4MMze = 9958 + INTEGER(IntKi), PARAMETER :: M18N5MMze = 9959 + INTEGER(IntKi), PARAMETER :: M18N6MMze = 9960 + INTEGER(IntKi), PARAMETER :: M18N7MMze = 9961 + INTEGER(IntKi), PARAMETER :: M18N8MMze = 9962 + INTEGER(IntKi), PARAMETER :: M18N9MMze = 9963 + INTEGER(IntKi), PARAMETER :: M19N1MMze = 9964 + INTEGER(IntKi), PARAMETER :: M19N2MMze = 9965 + INTEGER(IntKi), PARAMETER :: M19N3MMze = 9966 + INTEGER(IntKi), PARAMETER :: M19N4MMze = 9967 + INTEGER(IntKi), PARAMETER :: M19N5MMze = 9968 + INTEGER(IntKi), PARAMETER :: M19N6MMze = 9969 + INTEGER(IntKi), PARAMETER :: M19N7MMze = 9970 + INTEGER(IntKi), PARAMETER :: M19N8MMze = 9971 + INTEGER(IntKi), PARAMETER :: M19N9MMze = 9972 + INTEGER(IntKi), PARAMETER :: M20N1MMze = 9973 + INTEGER(IntKi), PARAMETER :: M20N2MMze = 9974 + INTEGER(IntKi), PARAMETER :: M20N3MMze = 9975 + INTEGER(IntKi), PARAMETER :: M20N4MMze = 9976 + INTEGER(IntKi), PARAMETER :: M20N5MMze = 9977 + INTEGER(IntKi), PARAMETER :: M20N6MMze = 9978 + INTEGER(IntKi), PARAMETER :: M20N7MMze = 9979 + INTEGER(IntKi), PARAMETER :: M20N8MMze = 9980 + INTEGER(IntKi), PARAMETER :: M20N9MMze = 9981 + INTEGER(IntKi), PARAMETER :: M21N1MMze = 9982 + INTEGER(IntKi), PARAMETER :: M21N2MMze = 9983 + INTEGER(IntKi), PARAMETER :: M21N3MMze = 9984 + INTEGER(IntKi), PARAMETER :: M21N4MMze = 9985 + INTEGER(IntKi), PARAMETER :: M21N5MMze = 9986 + INTEGER(IntKi), PARAMETER :: M21N6MMze = 9987 + INTEGER(IntKi), PARAMETER :: M21N7MMze = 9988 + INTEGER(IntKi), PARAMETER :: M21N8MMze = 9989 + INTEGER(IntKi), PARAMETER :: M21N9MMze = 9990 + INTEGER(IntKi), PARAMETER :: M22N1MMze = 9991 + INTEGER(IntKi), PARAMETER :: M22N2MMze = 9992 + INTEGER(IntKi), PARAMETER :: M22N3MMze = 9993 + INTEGER(IntKi), PARAMETER :: M22N4MMze = 9994 + INTEGER(IntKi), PARAMETER :: M22N5MMze = 9995 + INTEGER(IntKi), PARAMETER :: M22N6MMze = 9996 + INTEGER(IntKi), PARAMETER :: M22N7MMze = 9997 + INTEGER(IntKi), PARAMETER :: M22N8MMze = 9998 + INTEGER(IntKi), PARAMETER :: M22N9MMze = 9999 + INTEGER(IntKi), PARAMETER :: M23N1MMze = 10000 + INTEGER(IntKi), PARAMETER :: M23N2MMze = 10001 + INTEGER(IntKi), PARAMETER :: M23N3MMze = 10002 + INTEGER(IntKi), PARAMETER :: M23N4MMze = 10003 + INTEGER(IntKi), PARAMETER :: M23N5MMze = 10004 + INTEGER(IntKi), PARAMETER :: M23N6MMze = 10005 + INTEGER(IntKi), PARAMETER :: M23N7MMze = 10006 + INTEGER(IntKi), PARAMETER :: M23N8MMze = 10007 + INTEGER(IntKi), PARAMETER :: M23N9MMze = 10008 + INTEGER(IntKi), PARAMETER :: M24N1MMze = 10009 + INTEGER(IntKi), PARAMETER :: M24N2MMze = 10010 + INTEGER(IntKi), PARAMETER :: M24N3MMze = 10011 + INTEGER(IntKi), PARAMETER :: M24N4MMze = 10012 + INTEGER(IntKi), PARAMETER :: M24N5MMze = 10013 + INTEGER(IntKi), PARAMETER :: M24N6MMze = 10014 + INTEGER(IntKi), PARAMETER :: M24N7MMze = 10015 + INTEGER(IntKi), PARAMETER :: M24N8MMze = 10016 + INTEGER(IntKi), PARAMETER :: M24N9MMze = 10017 + INTEGER(IntKi), PARAMETER :: M25N1MMze = 10018 + INTEGER(IntKi), PARAMETER :: M25N2MMze = 10019 + INTEGER(IntKi), PARAMETER :: M25N3MMze = 10020 + INTEGER(IntKi), PARAMETER :: M25N4MMze = 10021 + INTEGER(IntKi), PARAMETER :: M25N5MMze = 10022 + INTEGER(IntKi), PARAMETER :: M25N6MMze = 10023 + INTEGER(IntKi), PARAMETER :: M25N7MMze = 10024 + INTEGER(IntKi), PARAMETER :: M25N8MMze = 10025 + INTEGER(IntKi), PARAMETER :: M25N9MMze = 10026 + INTEGER(IntKi), PARAMETER :: M26N1MMze = 10027 + INTEGER(IntKi), PARAMETER :: M26N2MMze = 10028 + INTEGER(IntKi), PARAMETER :: M26N3MMze = 10029 + INTEGER(IntKi), PARAMETER :: M26N4MMze = 10030 + INTEGER(IntKi), PARAMETER :: M26N5MMze = 10031 + INTEGER(IntKi), PARAMETER :: M26N6MMze = 10032 + INTEGER(IntKi), PARAMETER :: M26N7MMze = 10033 + INTEGER(IntKi), PARAMETER :: M26N8MMze = 10034 + INTEGER(IntKi), PARAMETER :: M26N9MMze = 10035 + INTEGER(IntKi), PARAMETER :: M27N1MMze = 10036 + INTEGER(IntKi), PARAMETER :: M27N2MMze = 10037 + INTEGER(IntKi), PARAMETER :: M27N3MMze = 10038 + INTEGER(IntKi), PARAMETER :: M27N4MMze = 10039 + INTEGER(IntKi), PARAMETER :: M27N5MMze = 10040 + INTEGER(IntKi), PARAMETER :: M27N6MMze = 10041 + INTEGER(IntKi), PARAMETER :: M27N7MMze = 10042 + INTEGER(IntKi), PARAMETER :: M27N8MMze = 10043 + INTEGER(IntKi), PARAMETER :: M27N9MMze = 10044 + INTEGER(IntKi), PARAMETER :: M28N1MMze = 10045 + INTEGER(IntKi), PARAMETER :: M28N2MMze = 10046 + INTEGER(IntKi), PARAMETER :: M28N3MMze = 10047 + INTEGER(IntKi), PARAMETER :: M28N4MMze = 10048 + INTEGER(IntKi), PARAMETER :: M28N5MMze = 10049 + INTEGER(IntKi), PARAMETER :: M28N6MMze = 10050 + INTEGER(IntKi), PARAMETER :: M28N7MMze = 10051 + INTEGER(IntKi), PARAMETER :: M28N8MMze = 10052 + INTEGER(IntKi), PARAMETER :: M28N9MMze = 10053 + INTEGER(IntKi), PARAMETER :: M29N1MMze = 10054 + INTEGER(IntKi), PARAMETER :: M29N2MMze = 10055 + INTEGER(IntKi), PARAMETER :: M29N3MMze = 10056 + INTEGER(IntKi), PARAMETER :: M29N4MMze = 10057 + INTEGER(IntKi), PARAMETER :: M29N5MMze = 10058 + INTEGER(IntKi), PARAMETER :: M29N6MMze = 10059 + INTEGER(IntKi), PARAMETER :: M29N7MMze = 10060 + INTEGER(IntKi), PARAMETER :: M29N8MMze = 10061 + INTEGER(IntKi), PARAMETER :: M29N9MMze = 10062 + INTEGER(IntKi), PARAMETER :: M30N1MMze = 10063 + INTEGER(IntKi), PARAMETER :: M30N2MMze = 10064 + INTEGER(IntKi), PARAMETER :: M30N3MMze = 10065 + INTEGER(IntKi), PARAMETER :: M30N4MMze = 10066 + INTEGER(IntKi), PARAMETER :: M30N5MMze = 10067 + INTEGER(IntKi), PARAMETER :: M30N6MMze = 10068 + INTEGER(IntKi), PARAMETER :: M30N7MMze = 10069 + INTEGER(IntKi), PARAMETER :: M30N8MMze = 10070 + INTEGER(IntKi), PARAMETER :: M30N9MMze = 10071 + INTEGER(IntKi), PARAMETER :: M31N1MMze = 10072 + INTEGER(IntKi), PARAMETER :: M31N2MMze = 10073 + INTEGER(IntKi), PARAMETER :: M31N3MMze = 10074 + INTEGER(IntKi), PARAMETER :: M31N4MMze = 10075 + INTEGER(IntKi), PARAMETER :: M31N5MMze = 10076 + INTEGER(IntKi), PARAMETER :: M31N6MMze = 10077 + INTEGER(IntKi), PARAMETER :: M31N7MMze = 10078 + INTEGER(IntKi), PARAMETER :: M31N8MMze = 10079 + INTEGER(IntKi), PARAMETER :: M31N9MMze = 10080 + INTEGER(IntKi), PARAMETER :: M32N1MMze = 10081 + INTEGER(IntKi), PARAMETER :: M32N2MMze = 10082 + INTEGER(IntKi), PARAMETER :: M32N3MMze = 10083 + INTEGER(IntKi), PARAMETER :: M32N4MMze = 10084 + INTEGER(IntKi), PARAMETER :: M32N5MMze = 10085 + INTEGER(IntKi), PARAMETER :: M32N6MMze = 10086 + INTEGER(IntKi), PARAMETER :: M32N7MMze = 10087 + INTEGER(IntKi), PARAMETER :: M32N8MMze = 10088 + INTEGER(IntKi), PARAMETER :: M32N9MMze = 10089 + INTEGER(IntKi), PARAMETER :: M33N1MMze = 10090 + INTEGER(IntKi), PARAMETER :: M33N2MMze = 10091 + INTEGER(IntKi), PARAMETER :: M33N3MMze = 10092 + INTEGER(IntKi), PARAMETER :: M33N4MMze = 10093 + INTEGER(IntKi), PARAMETER :: M33N5MMze = 10094 + INTEGER(IntKi), PARAMETER :: M33N6MMze = 10095 + INTEGER(IntKi), PARAMETER :: M33N7MMze = 10096 + INTEGER(IntKi), PARAMETER :: M33N8MMze = 10097 + INTEGER(IntKi), PARAMETER :: M33N9MMze = 10098 + INTEGER(IntKi), PARAMETER :: M34N1MMze = 10099 + INTEGER(IntKi), PARAMETER :: M34N2MMze = 10100 + INTEGER(IntKi), PARAMETER :: M34N3MMze = 10101 + INTEGER(IntKi), PARAMETER :: M34N4MMze = 10102 + INTEGER(IntKi), PARAMETER :: M34N5MMze = 10103 + INTEGER(IntKi), PARAMETER :: M34N6MMze = 10104 + INTEGER(IntKi), PARAMETER :: M34N7MMze = 10105 + INTEGER(IntKi), PARAMETER :: M34N8MMze = 10106 + INTEGER(IntKi), PARAMETER :: M34N9MMze = 10107 + INTEGER(IntKi), PARAMETER :: M35N1MMze = 10108 + INTEGER(IntKi), PARAMETER :: M35N2MMze = 10109 + INTEGER(IntKi), PARAMETER :: M35N3MMze = 10110 + INTEGER(IntKi), PARAMETER :: M35N4MMze = 10111 + INTEGER(IntKi), PARAMETER :: M35N5MMze = 10112 + INTEGER(IntKi), PARAMETER :: M35N6MMze = 10113 + INTEGER(IntKi), PARAMETER :: M35N7MMze = 10114 + INTEGER(IntKi), PARAMETER :: M35N8MMze = 10115 + INTEGER(IntKi), PARAMETER :: M35N9MMze = 10116 + INTEGER(IntKi), PARAMETER :: M36N1MMze = 10117 + INTEGER(IntKi), PARAMETER :: M36N2MMze = 10118 + INTEGER(IntKi), PARAMETER :: M36N3MMze = 10119 + INTEGER(IntKi), PARAMETER :: M36N4MMze = 10120 + INTEGER(IntKi), PARAMETER :: M36N5MMze = 10121 + INTEGER(IntKi), PARAMETER :: M36N6MMze = 10122 + INTEGER(IntKi), PARAMETER :: M36N7MMze = 10123 + INTEGER(IntKi), PARAMETER :: M36N8MMze = 10124 + INTEGER(IntKi), PARAMETER :: M36N9MMze = 10125 + INTEGER(IntKi), PARAMETER :: M37N1MMze = 10126 + INTEGER(IntKi), PARAMETER :: M37N2MMze = 10127 + INTEGER(IntKi), PARAMETER :: M37N3MMze = 10128 + INTEGER(IntKi), PARAMETER :: M37N4MMze = 10129 + INTEGER(IntKi), PARAMETER :: M37N5MMze = 10130 + INTEGER(IntKi), PARAMETER :: M37N6MMze = 10131 + INTEGER(IntKi), PARAMETER :: M37N7MMze = 10132 + INTEGER(IntKi), PARAMETER :: M37N8MMze = 10133 + INTEGER(IntKi), PARAMETER :: M37N9MMze = 10134 + INTEGER(IntKi), PARAMETER :: M38N1MMze = 10135 + INTEGER(IntKi), PARAMETER :: M38N2MMze = 10136 + INTEGER(IntKi), PARAMETER :: M38N3MMze = 10137 + INTEGER(IntKi), PARAMETER :: M38N4MMze = 10138 + INTEGER(IntKi), PARAMETER :: M38N5MMze = 10139 + INTEGER(IntKi), PARAMETER :: M38N6MMze = 10140 + INTEGER(IntKi), PARAMETER :: M38N7MMze = 10141 + INTEGER(IntKi), PARAMETER :: M38N8MMze = 10142 + INTEGER(IntKi), PARAMETER :: M38N9MMze = 10143 + INTEGER(IntKi), PARAMETER :: M39N1MMze = 10144 + INTEGER(IntKi), PARAMETER :: M39N2MMze = 10145 + INTEGER(IntKi), PARAMETER :: M39N3MMze = 10146 + INTEGER(IntKi), PARAMETER :: M39N4MMze = 10147 + INTEGER(IntKi), PARAMETER :: M39N5MMze = 10148 + INTEGER(IntKi), PARAMETER :: M39N6MMze = 10149 + INTEGER(IntKi), PARAMETER :: M39N7MMze = 10150 + INTEGER(IntKi), PARAMETER :: M39N8MMze = 10151 + INTEGER(IntKi), PARAMETER :: M39N9MMze = 10152 + INTEGER(IntKi), PARAMETER :: M40N1MMze = 10153 + INTEGER(IntKi), PARAMETER :: M40N2MMze = 10154 + INTEGER(IntKi), PARAMETER :: M40N3MMze = 10155 + INTEGER(IntKi), PARAMETER :: M40N4MMze = 10156 + INTEGER(IntKi), PARAMETER :: M40N5MMze = 10157 + INTEGER(IntKi), PARAMETER :: M40N6MMze = 10158 + INTEGER(IntKi), PARAMETER :: M40N7MMze = 10159 + INTEGER(IntKi), PARAMETER :: M40N8MMze = 10160 + INTEGER(IntKi), PARAMETER :: M40N9MMze = 10161 + INTEGER(IntKi), PARAMETER :: M41N1MMze = 10162 + INTEGER(IntKi), PARAMETER :: M41N2MMze = 10163 + INTEGER(IntKi), PARAMETER :: M41N3MMze = 10164 + INTEGER(IntKi), PARAMETER :: M41N4MMze = 10165 + INTEGER(IntKi), PARAMETER :: M41N5MMze = 10166 + INTEGER(IntKi), PARAMETER :: M41N6MMze = 10167 + INTEGER(IntKi), PARAMETER :: M41N7MMze = 10168 + INTEGER(IntKi), PARAMETER :: M41N8MMze = 10169 + INTEGER(IntKi), PARAMETER :: M41N9MMze = 10170 + INTEGER(IntKi), PARAMETER :: M42N1MMze = 10171 + INTEGER(IntKi), PARAMETER :: M42N2MMze = 10172 + INTEGER(IntKi), PARAMETER :: M42N3MMze = 10173 + INTEGER(IntKi), PARAMETER :: M42N4MMze = 10174 + INTEGER(IntKi), PARAMETER :: M42N5MMze = 10175 + INTEGER(IntKi), PARAMETER :: M42N6MMze = 10176 + INTEGER(IntKi), PARAMETER :: M42N7MMze = 10177 + INTEGER(IntKi), PARAMETER :: M42N8MMze = 10178 + INTEGER(IntKi), PARAMETER :: M42N9MMze = 10179 + INTEGER(IntKi), PARAMETER :: M43N1MMze = 10180 + INTEGER(IntKi), PARAMETER :: M43N2MMze = 10181 + INTEGER(IntKi), PARAMETER :: M43N3MMze = 10182 + INTEGER(IntKi), PARAMETER :: M43N4MMze = 10183 + INTEGER(IntKi), PARAMETER :: M43N5MMze = 10184 + INTEGER(IntKi), PARAMETER :: M43N6MMze = 10185 + INTEGER(IntKi), PARAMETER :: M43N7MMze = 10186 + INTEGER(IntKi), PARAMETER :: M43N8MMze = 10187 + INTEGER(IntKi), PARAMETER :: M43N9MMze = 10188 + INTEGER(IntKi), PARAMETER :: M44N1MMze = 10189 + INTEGER(IntKi), PARAMETER :: M44N2MMze = 10190 + INTEGER(IntKi), PARAMETER :: M44N3MMze = 10191 + INTEGER(IntKi), PARAMETER :: M44N4MMze = 10192 + INTEGER(IntKi), PARAMETER :: M44N5MMze = 10193 + INTEGER(IntKi), PARAMETER :: M44N6MMze = 10194 + INTEGER(IntKi), PARAMETER :: M44N7MMze = 10195 + INTEGER(IntKi), PARAMETER :: M44N8MMze = 10196 + INTEGER(IntKi), PARAMETER :: M44N9MMze = 10197 + INTEGER(IntKi), PARAMETER :: M45N1MMze = 10198 + INTEGER(IntKi), PARAMETER :: M45N2MMze = 10199 + INTEGER(IntKi), PARAMETER :: M45N3MMze = 10200 + INTEGER(IntKi), PARAMETER :: M45N4MMze = 10201 + INTEGER(IntKi), PARAMETER :: M45N5MMze = 10202 + INTEGER(IntKi), PARAMETER :: M45N6MMze = 10203 + INTEGER(IntKi), PARAMETER :: M45N7MMze = 10204 + INTEGER(IntKi), PARAMETER :: M45N8MMze = 10205 + INTEGER(IntKi), PARAMETER :: M45N9MMze = 10206 + INTEGER(IntKi), PARAMETER :: M46N1MMze = 10207 + INTEGER(IntKi), PARAMETER :: M46N2MMze = 10208 + INTEGER(IntKi), PARAMETER :: M46N3MMze = 10209 + INTEGER(IntKi), PARAMETER :: M46N4MMze = 10210 + INTEGER(IntKi), PARAMETER :: M46N5MMze = 10211 + INTEGER(IntKi), PARAMETER :: M46N6MMze = 10212 + INTEGER(IntKi), PARAMETER :: M46N7MMze = 10213 + INTEGER(IntKi), PARAMETER :: M46N8MMze = 10214 + INTEGER(IntKi), PARAMETER :: M46N9MMze = 10215 + INTEGER(IntKi), PARAMETER :: M47N1MMze = 10216 + INTEGER(IntKi), PARAMETER :: M47N2MMze = 10217 + INTEGER(IntKi), PARAMETER :: M47N3MMze = 10218 + INTEGER(IntKi), PARAMETER :: M47N4MMze = 10219 + INTEGER(IntKi), PARAMETER :: M47N5MMze = 10220 + INTEGER(IntKi), PARAMETER :: M47N6MMze = 10221 + INTEGER(IntKi), PARAMETER :: M47N7MMze = 10222 + INTEGER(IntKi), PARAMETER :: M47N8MMze = 10223 + INTEGER(IntKi), PARAMETER :: M47N9MMze = 10224 + INTEGER(IntKi), PARAMETER :: M48N1MMze = 10225 + INTEGER(IntKi), PARAMETER :: M48N2MMze = 10226 + INTEGER(IntKi), PARAMETER :: M48N3MMze = 10227 + INTEGER(IntKi), PARAMETER :: M48N4MMze = 10228 + INTEGER(IntKi), PARAMETER :: M48N5MMze = 10229 + INTEGER(IntKi), PARAMETER :: M48N6MMze = 10230 + INTEGER(IntKi), PARAMETER :: M48N7MMze = 10231 + INTEGER(IntKi), PARAMETER :: M48N8MMze = 10232 + INTEGER(IntKi), PARAMETER :: M48N9MMze = 10233 + INTEGER(IntKi), PARAMETER :: M49N1MMze = 10234 + INTEGER(IntKi), PARAMETER :: M49N2MMze = 10235 + INTEGER(IntKi), PARAMETER :: M49N3MMze = 10236 + INTEGER(IntKi), PARAMETER :: M49N4MMze = 10237 + INTEGER(IntKi), PARAMETER :: M49N5MMze = 10238 + INTEGER(IntKi), PARAMETER :: M49N6MMze = 10239 + INTEGER(IntKi), PARAMETER :: M49N7MMze = 10240 + INTEGER(IntKi), PARAMETER :: M49N8MMze = 10241 + INTEGER(IntKi), PARAMETER :: M49N9MMze = 10242 + INTEGER(IntKi), PARAMETER :: M50N1MMze = 10243 + INTEGER(IntKi), PARAMETER :: M50N2MMze = 10244 + INTEGER(IntKi), PARAMETER :: M50N3MMze = 10245 + INTEGER(IntKi), PARAMETER :: M50N4MMze = 10246 + INTEGER(IntKi), PARAMETER :: M50N5MMze = 10247 + INTEGER(IntKi), PARAMETER :: M50N6MMze = 10248 + INTEGER(IntKi), PARAMETER :: M50N7MMze = 10249 + INTEGER(IntKi), PARAMETER :: M50N8MMze = 10250 + INTEGER(IntKi), PARAMETER :: M50N9MMze = 10251 + INTEGER(IntKi), PARAMETER :: M51N1MMze = 10252 + INTEGER(IntKi), PARAMETER :: M51N2MMze = 10253 + INTEGER(IntKi), PARAMETER :: M51N3MMze = 10254 + INTEGER(IntKi), PARAMETER :: M51N4MMze = 10255 + INTEGER(IntKi), PARAMETER :: M51N5MMze = 10256 + INTEGER(IntKi), PARAMETER :: M51N6MMze = 10257 + INTEGER(IntKi), PARAMETER :: M51N7MMze = 10258 + INTEGER(IntKi), PARAMETER :: M51N8MMze = 10259 + INTEGER(IntKi), PARAMETER :: M51N9MMze = 10260 + INTEGER(IntKi), PARAMETER :: M52N1MMze = 10261 + INTEGER(IntKi), PARAMETER :: M52N2MMze = 10262 + INTEGER(IntKi), PARAMETER :: M52N3MMze = 10263 + INTEGER(IntKi), PARAMETER :: M52N4MMze = 10264 + INTEGER(IntKi), PARAMETER :: M52N5MMze = 10265 + INTEGER(IntKi), PARAMETER :: M52N6MMze = 10266 + INTEGER(IntKi), PARAMETER :: M52N7MMze = 10267 + INTEGER(IntKi), PARAMETER :: M52N8MMze = 10268 + INTEGER(IntKi), PARAMETER :: M52N9MMze = 10269 + INTEGER(IntKi), PARAMETER :: M53N1MMze = 10270 + INTEGER(IntKi), PARAMETER :: M53N2MMze = 10271 + INTEGER(IntKi), PARAMETER :: M53N3MMze = 10272 + INTEGER(IntKi), PARAMETER :: M53N4MMze = 10273 + INTEGER(IntKi), PARAMETER :: M53N5MMze = 10274 + INTEGER(IntKi), PARAMETER :: M53N6MMze = 10275 + INTEGER(IntKi), PARAMETER :: M53N7MMze = 10276 + INTEGER(IntKi), PARAMETER :: M53N8MMze = 10277 + INTEGER(IntKi), PARAMETER :: M53N9MMze = 10278 + INTEGER(IntKi), PARAMETER :: M54N1MMze = 10279 + INTEGER(IntKi), PARAMETER :: M54N2MMze = 10280 + INTEGER(IntKi), PARAMETER :: M54N3MMze = 10281 + INTEGER(IntKi), PARAMETER :: M54N4MMze = 10282 + INTEGER(IntKi), PARAMETER :: M54N5MMze = 10283 + INTEGER(IntKi), PARAMETER :: M54N6MMze = 10284 + INTEGER(IntKi), PARAMETER :: M54N7MMze = 10285 + INTEGER(IntKi), PARAMETER :: M54N8MMze = 10286 + INTEGER(IntKi), PARAMETER :: M54N9MMze = 10287 + INTEGER(IntKi), PARAMETER :: M55N1MMze = 10288 + INTEGER(IntKi), PARAMETER :: M55N2MMze = 10289 + INTEGER(IntKi), PARAMETER :: M55N3MMze = 10290 + INTEGER(IntKi), PARAMETER :: M55N4MMze = 10291 + INTEGER(IntKi), PARAMETER :: M55N5MMze = 10292 + INTEGER(IntKi), PARAMETER :: M55N6MMze = 10293 + INTEGER(IntKi), PARAMETER :: M55N7MMze = 10294 + INTEGER(IntKi), PARAMETER :: M55N8MMze = 10295 + INTEGER(IntKi), PARAMETER :: M55N9MMze = 10296 + INTEGER(IntKi), PARAMETER :: M56N1MMze = 10297 + INTEGER(IntKi), PARAMETER :: M56N2MMze = 10298 + INTEGER(IntKi), PARAMETER :: M56N3MMze = 10299 + INTEGER(IntKi), PARAMETER :: M56N4MMze = 10300 + INTEGER(IntKi), PARAMETER :: M56N5MMze = 10301 + INTEGER(IntKi), PARAMETER :: M56N6MMze = 10302 + INTEGER(IntKi), PARAMETER :: M56N7MMze = 10303 + INTEGER(IntKi), PARAMETER :: M56N8MMze = 10304 + INTEGER(IntKi), PARAMETER :: M56N9MMze = 10305 + INTEGER(IntKi), PARAMETER :: M57N1MMze = 10306 + INTEGER(IntKi), PARAMETER :: M57N2MMze = 10307 + INTEGER(IntKi), PARAMETER :: M57N3MMze = 10308 + INTEGER(IntKi), PARAMETER :: M57N4MMze = 10309 + INTEGER(IntKi), PARAMETER :: M57N5MMze = 10310 + INTEGER(IntKi), PARAMETER :: M57N6MMze = 10311 + INTEGER(IntKi), PARAMETER :: M57N7MMze = 10312 + INTEGER(IntKi), PARAMETER :: M57N8MMze = 10313 + INTEGER(IntKi), PARAMETER :: M57N9MMze = 10314 + INTEGER(IntKi), PARAMETER :: M58N1MMze = 10315 + INTEGER(IntKi), PARAMETER :: M58N2MMze = 10316 + INTEGER(IntKi), PARAMETER :: M58N3MMze = 10317 + INTEGER(IntKi), PARAMETER :: M58N4MMze = 10318 + INTEGER(IntKi), PARAMETER :: M58N5MMze = 10319 + INTEGER(IntKi), PARAMETER :: M58N6MMze = 10320 + INTEGER(IntKi), PARAMETER :: M58N7MMze = 10321 + INTEGER(IntKi), PARAMETER :: M58N8MMze = 10322 + INTEGER(IntKi), PARAMETER :: M58N9MMze = 10323 + INTEGER(IntKi), PARAMETER :: M59N1MMze = 10324 + INTEGER(IntKi), PARAMETER :: M59N2MMze = 10325 + INTEGER(IntKi), PARAMETER :: M59N3MMze = 10326 + INTEGER(IntKi), PARAMETER :: M59N4MMze = 10327 + INTEGER(IntKi), PARAMETER :: M59N5MMze = 10328 + INTEGER(IntKi), PARAMETER :: M59N6MMze = 10329 + INTEGER(IntKi), PARAMETER :: M59N7MMze = 10330 + INTEGER(IntKi), PARAMETER :: M59N8MMze = 10331 + INTEGER(IntKi), PARAMETER :: M59N9MMze = 10332 + INTEGER(IntKi), PARAMETER :: M60N1MMze = 10333 + INTEGER(IntKi), PARAMETER :: M60N2MMze = 10334 + INTEGER(IntKi), PARAMETER :: M60N3MMze = 10335 + INTEGER(IntKi), PARAMETER :: M60N4MMze = 10336 + INTEGER(IntKi), PARAMETER :: M60N5MMze = 10337 + INTEGER(IntKi), PARAMETER :: M60N6MMze = 10338 + INTEGER(IntKi), PARAMETER :: M60N7MMze = 10339 + INTEGER(IntKi), PARAMETER :: M60N8MMze = 10340 + INTEGER(IntKi), PARAMETER :: M60N9MMze = 10341 + INTEGER(IntKi), PARAMETER :: M61N1MMze = 10342 + INTEGER(IntKi), PARAMETER :: M61N2MMze = 10343 + INTEGER(IntKi), PARAMETER :: M61N3MMze = 10344 + INTEGER(IntKi), PARAMETER :: M61N4MMze = 10345 + INTEGER(IntKi), PARAMETER :: M61N5MMze = 10346 + INTEGER(IntKi), PARAMETER :: M61N6MMze = 10347 + INTEGER(IntKi), PARAMETER :: M61N7MMze = 10348 + INTEGER(IntKi), PARAMETER :: M61N8MMze = 10349 + INTEGER(IntKi), PARAMETER :: M61N9MMze = 10350 + INTEGER(IntKi), PARAMETER :: M62N1MMze = 10351 + INTEGER(IntKi), PARAMETER :: M62N2MMze = 10352 + INTEGER(IntKi), PARAMETER :: M62N3MMze = 10353 + INTEGER(IntKi), PARAMETER :: M62N4MMze = 10354 + INTEGER(IntKi), PARAMETER :: M62N5MMze = 10355 + INTEGER(IntKi), PARAMETER :: M62N6MMze = 10356 + INTEGER(IntKi), PARAMETER :: M62N7MMze = 10357 + INTEGER(IntKi), PARAMETER :: M62N8MMze = 10358 + INTEGER(IntKi), PARAMETER :: M62N9MMze = 10359 + INTEGER(IntKi), PARAMETER :: M63N1MMze = 10360 + INTEGER(IntKi), PARAMETER :: M63N2MMze = 10361 + INTEGER(IntKi), PARAMETER :: M63N3MMze = 10362 + INTEGER(IntKi), PARAMETER :: M63N4MMze = 10363 + INTEGER(IntKi), PARAMETER :: M63N5MMze = 10364 + INTEGER(IntKi), PARAMETER :: M63N6MMze = 10365 + INTEGER(IntKi), PARAMETER :: M63N7MMze = 10366 + INTEGER(IntKi), PARAMETER :: M63N8MMze = 10367 + INTEGER(IntKi), PARAMETER :: M63N9MMze = 10368 + INTEGER(IntKi), PARAMETER :: M64N1MMze = 10369 + INTEGER(IntKi), PARAMETER :: M64N2MMze = 10370 + INTEGER(IntKi), PARAMETER :: M64N3MMze = 10371 + INTEGER(IntKi), PARAMETER :: M64N4MMze = 10372 + INTEGER(IntKi), PARAMETER :: M64N5MMze = 10373 + INTEGER(IntKi), PARAMETER :: M64N6MMze = 10374 + INTEGER(IntKi), PARAMETER :: M64N7MMze = 10375 + INTEGER(IntKi), PARAMETER :: M64N8MMze = 10376 + INTEGER(IntKi), PARAMETER :: M64N9MMze = 10377 + INTEGER(IntKi), PARAMETER :: M65N1MMze = 10378 + INTEGER(IntKi), PARAMETER :: M65N2MMze = 10379 + INTEGER(IntKi), PARAMETER :: M65N3MMze = 10380 + INTEGER(IntKi), PARAMETER :: M65N4MMze = 10381 + INTEGER(IntKi), PARAMETER :: M65N5MMze = 10382 + INTEGER(IntKi), PARAMETER :: M65N6MMze = 10383 + INTEGER(IntKi), PARAMETER :: M65N7MMze = 10384 + INTEGER(IntKi), PARAMETER :: M65N8MMze = 10385 + INTEGER(IntKi), PARAMETER :: M65N9MMze = 10386 + INTEGER(IntKi), PARAMETER :: M66N1MMze = 10387 + INTEGER(IntKi), PARAMETER :: M66N2MMze = 10388 + INTEGER(IntKi), PARAMETER :: M66N3MMze = 10389 + INTEGER(IntKi), PARAMETER :: M66N4MMze = 10390 + INTEGER(IntKi), PARAMETER :: M66N5MMze = 10391 + INTEGER(IntKi), PARAMETER :: M66N6MMze = 10392 + INTEGER(IntKi), PARAMETER :: M66N7MMze = 10393 + INTEGER(IntKi), PARAMETER :: M66N8MMze = 10394 + INTEGER(IntKi), PARAMETER :: M66N9MMze = 10395 + INTEGER(IntKi), PARAMETER :: M67N1MMze = 10396 + INTEGER(IntKi), PARAMETER :: M67N2MMze = 10397 + INTEGER(IntKi), PARAMETER :: M67N3MMze = 10398 + INTEGER(IntKi), PARAMETER :: M67N4MMze = 10399 + INTEGER(IntKi), PARAMETER :: M67N5MMze = 10400 + INTEGER(IntKi), PARAMETER :: M67N6MMze = 10401 + INTEGER(IntKi), PARAMETER :: M67N7MMze = 10402 + INTEGER(IntKi), PARAMETER :: M67N8MMze = 10403 + INTEGER(IntKi), PARAMETER :: M67N9MMze = 10404 + INTEGER(IntKi), PARAMETER :: M68N1MMze = 10405 + INTEGER(IntKi), PARAMETER :: M68N2MMze = 10406 + INTEGER(IntKi), PARAMETER :: M68N3MMze = 10407 + INTEGER(IntKi), PARAMETER :: M68N4MMze = 10408 + INTEGER(IntKi), PARAMETER :: M68N5MMze = 10409 + INTEGER(IntKi), PARAMETER :: M68N6MMze = 10410 + INTEGER(IntKi), PARAMETER :: M68N7MMze = 10411 + INTEGER(IntKi), PARAMETER :: M68N8MMze = 10412 + INTEGER(IntKi), PARAMETER :: M68N9MMze = 10413 + INTEGER(IntKi), PARAMETER :: M69N1MMze = 10414 + INTEGER(IntKi), PARAMETER :: M69N2MMze = 10415 + INTEGER(IntKi), PARAMETER :: M69N3MMze = 10416 + INTEGER(IntKi), PARAMETER :: M69N4MMze = 10417 + INTEGER(IntKi), PARAMETER :: M69N5MMze = 10418 + INTEGER(IntKi), PARAMETER :: M69N6MMze = 10419 + INTEGER(IntKi), PARAMETER :: M69N7MMze = 10420 + INTEGER(IntKi), PARAMETER :: M69N8MMze = 10421 + INTEGER(IntKi), PARAMETER :: M69N9MMze = 10422 + INTEGER(IntKi), PARAMETER :: M70N1MMze = 10423 + INTEGER(IntKi), PARAMETER :: M70N2MMze = 10424 + INTEGER(IntKi), PARAMETER :: M70N3MMze = 10425 + INTEGER(IntKi), PARAMETER :: M70N4MMze = 10426 + INTEGER(IntKi), PARAMETER :: M70N5MMze = 10427 + INTEGER(IntKi), PARAMETER :: M70N6MMze = 10428 + INTEGER(IntKi), PARAMETER :: M70N7MMze = 10429 + INTEGER(IntKi), PARAMETER :: M70N8MMze = 10430 + INTEGER(IntKi), PARAMETER :: M70N9MMze = 10431 + INTEGER(IntKi), PARAMETER :: M71N1MMze = 10432 + INTEGER(IntKi), PARAMETER :: M71N2MMze = 10433 + INTEGER(IntKi), PARAMETER :: M71N3MMze = 10434 + INTEGER(IntKi), PARAMETER :: M71N4MMze = 10435 + INTEGER(IntKi), PARAMETER :: M71N5MMze = 10436 + INTEGER(IntKi), PARAMETER :: M71N6MMze = 10437 + INTEGER(IntKi), PARAMETER :: M71N7MMze = 10438 + INTEGER(IntKi), PARAMETER :: M71N8MMze = 10439 + INTEGER(IntKi), PARAMETER :: M71N9MMze = 10440 + INTEGER(IntKi), PARAMETER :: M72N1MMze = 10441 + INTEGER(IntKi), PARAMETER :: M72N2MMze = 10442 + INTEGER(IntKi), PARAMETER :: M72N3MMze = 10443 + INTEGER(IntKi), PARAMETER :: M72N4MMze = 10444 + INTEGER(IntKi), PARAMETER :: M72N5MMze = 10445 + INTEGER(IntKi), PARAMETER :: M72N6MMze = 10446 + INTEGER(IntKi), PARAMETER :: M72N7MMze = 10447 + INTEGER(IntKi), PARAMETER :: M72N8MMze = 10448 + INTEGER(IntKi), PARAMETER :: M72N9MMze = 10449 + INTEGER(IntKi), PARAMETER :: M73N1MMze = 10450 + INTEGER(IntKi), PARAMETER :: M73N2MMze = 10451 + INTEGER(IntKi), PARAMETER :: M73N3MMze = 10452 + INTEGER(IntKi), PARAMETER :: M73N4MMze = 10453 + INTEGER(IntKi), PARAMETER :: M73N5MMze = 10454 + INTEGER(IntKi), PARAMETER :: M73N6MMze = 10455 + INTEGER(IntKi), PARAMETER :: M73N7MMze = 10456 + INTEGER(IntKi), PARAMETER :: M73N8MMze = 10457 + INTEGER(IntKi), PARAMETER :: M73N9MMze = 10458 + INTEGER(IntKi), PARAMETER :: M74N1MMze = 10459 + INTEGER(IntKi), PARAMETER :: M74N2MMze = 10460 + INTEGER(IntKi), PARAMETER :: M74N3MMze = 10461 + INTEGER(IntKi), PARAMETER :: M74N4MMze = 10462 + INTEGER(IntKi), PARAMETER :: M74N5MMze = 10463 + INTEGER(IntKi), PARAMETER :: M74N6MMze = 10464 + INTEGER(IntKi), PARAMETER :: M74N7MMze = 10465 + INTEGER(IntKi), PARAMETER :: M74N8MMze = 10466 + INTEGER(IntKi), PARAMETER :: M74N9MMze = 10467 + INTEGER(IntKi), PARAMETER :: M75N1MMze = 10468 + INTEGER(IntKi), PARAMETER :: M75N2MMze = 10469 + INTEGER(IntKi), PARAMETER :: M75N3MMze = 10470 + INTEGER(IntKi), PARAMETER :: M75N4MMze = 10471 + INTEGER(IntKi), PARAMETER :: M75N5MMze = 10472 + INTEGER(IntKi), PARAMETER :: M75N6MMze = 10473 + INTEGER(IntKi), PARAMETER :: M75N7MMze = 10474 + INTEGER(IntKi), PARAMETER :: M75N8MMze = 10475 + INTEGER(IntKi), PARAMETER :: M75N9MMze = 10476 + INTEGER(IntKi), PARAMETER :: M76N1MMze = 10477 + INTEGER(IntKi), PARAMETER :: M76N2MMze = 10478 + INTEGER(IntKi), PARAMETER :: M76N3MMze = 10479 + INTEGER(IntKi), PARAMETER :: M76N4MMze = 10480 + INTEGER(IntKi), PARAMETER :: M76N5MMze = 10481 + INTEGER(IntKi), PARAMETER :: M76N6MMze = 10482 + INTEGER(IntKi), PARAMETER :: M76N7MMze = 10483 + INTEGER(IntKi), PARAMETER :: M76N8MMze = 10484 + INTEGER(IntKi), PARAMETER :: M76N9MMze = 10485 + INTEGER(IntKi), PARAMETER :: M77N1MMze = 10486 + INTEGER(IntKi), PARAMETER :: M77N2MMze = 10487 + INTEGER(IntKi), PARAMETER :: M77N3MMze = 10488 + INTEGER(IntKi), PARAMETER :: M77N4MMze = 10489 + INTEGER(IntKi), PARAMETER :: M77N5MMze = 10490 + INTEGER(IntKi), PARAMETER :: M77N6MMze = 10491 + INTEGER(IntKi), PARAMETER :: M77N7MMze = 10492 + INTEGER(IntKi), PARAMETER :: M77N8MMze = 10493 + INTEGER(IntKi), PARAMETER :: M77N9MMze = 10494 + INTEGER(IntKi), PARAMETER :: M78N1MMze = 10495 + INTEGER(IntKi), PARAMETER :: M78N2MMze = 10496 + INTEGER(IntKi), PARAMETER :: M78N3MMze = 10497 + INTEGER(IntKi), PARAMETER :: M78N4MMze = 10498 + INTEGER(IntKi), PARAMETER :: M78N5MMze = 10499 + INTEGER(IntKi), PARAMETER :: M78N6MMze = 10500 + INTEGER(IntKi), PARAMETER :: M78N7MMze = 10501 + INTEGER(IntKi), PARAMETER :: M78N8MMze = 10502 + INTEGER(IntKi), PARAMETER :: M78N9MMze = 10503 + INTEGER(IntKi), PARAMETER :: M79N1MMze = 10504 + INTEGER(IntKi), PARAMETER :: M79N2MMze = 10505 + INTEGER(IntKi), PARAMETER :: M79N3MMze = 10506 + INTEGER(IntKi), PARAMETER :: M79N4MMze = 10507 + INTEGER(IntKi), PARAMETER :: M79N5MMze = 10508 + INTEGER(IntKi), PARAMETER :: M79N6MMze = 10509 + INTEGER(IntKi), PARAMETER :: M79N7MMze = 10510 + INTEGER(IntKi), PARAMETER :: M79N8MMze = 10511 + INTEGER(IntKi), PARAMETER :: M79N9MMze = 10512 + INTEGER(IntKi), PARAMETER :: M80N1MMze = 10513 + INTEGER(IntKi), PARAMETER :: M80N2MMze = 10514 + INTEGER(IntKi), PARAMETER :: M80N3MMze = 10515 + INTEGER(IntKi), PARAMETER :: M80N4MMze = 10516 + INTEGER(IntKi), PARAMETER :: M80N5MMze = 10517 + INTEGER(IntKi), PARAMETER :: M80N6MMze = 10518 + INTEGER(IntKi), PARAMETER :: M80N7MMze = 10519 + INTEGER(IntKi), PARAMETER :: M80N8MMze = 10520 + INTEGER(IntKi), PARAMETER :: M80N9MMze = 10521 + INTEGER(IntKi), PARAMETER :: M81N1MMze = 10522 + INTEGER(IntKi), PARAMETER :: M81N2MMze = 10523 + INTEGER(IntKi), PARAMETER :: M81N3MMze = 10524 + INTEGER(IntKi), PARAMETER :: M81N4MMze = 10525 + INTEGER(IntKi), PARAMETER :: M81N5MMze = 10526 + INTEGER(IntKi), PARAMETER :: M81N6MMze = 10527 + INTEGER(IntKi), PARAMETER :: M81N7MMze = 10528 + INTEGER(IntKi), PARAMETER :: M81N8MMze = 10529 + INTEGER(IntKi), PARAMETER :: M81N9MMze = 10530 + INTEGER(IntKi), PARAMETER :: M82N1MMze = 10531 + INTEGER(IntKi), PARAMETER :: M82N2MMze = 10532 + INTEGER(IntKi), PARAMETER :: M82N3MMze = 10533 + INTEGER(IntKi), PARAMETER :: M82N4MMze = 10534 + INTEGER(IntKi), PARAMETER :: M82N5MMze = 10535 + INTEGER(IntKi), PARAMETER :: M82N6MMze = 10536 + INTEGER(IntKi), PARAMETER :: M82N7MMze = 10537 + INTEGER(IntKi), PARAMETER :: M82N8MMze = 10538 + INTEGER(IntKi), PARAMETER :: M82N9MMze = 10539 + INTEGER(IntKi), PARAMETER :: M83N1MMze = 10540 + INTEGER(IntKi), PARAMETER :: M83N2MMze = 10541 + INTEGER(IntKi), PARAMETER :: M83N3MMze = 10542 + INTEGER(IntKi), PARAMETER :: M83N4MMze = 10543 + INTEGER(IntKi), PARAMETER :: M83N5MMze = 10544 + INTEGER(IntKi), PARAMETER :: M83N6MMze = 10545 + INTEGER(IntKi), PARAMETER :: M83N7MMze = 10546 + INTEGER(IntKi), PARAMETER :: M83N8MMze = 10547 + INTEGER(IntKi), PARAMETER :: M83N9MMze = 10548 + INTEGER(IntKi), PARAMETER :: M84N1MMze = 10549 + INTEGER(IntKi), PARAMETER :: M84N2MMze = 10550 + INTEGER(IntKi), PARAMETER :: M84N3MMze = 10551 + INTEGER(IntKi), PARAMETER :: M84N4MMze = 10552 + INTEGER(IntKi), PARAMETER :: M84N5MMze = 10553 + INTEGER(IntKi), PARAMETER :: M84N6MMze = 10554 + INTEGER(IntKi), PARAMETER :: M84N7MMze = 10555 + INTEGER(IntKi), PARAMETER :: M84N8MMze = 10556 + INTEGER(IntKi), PARAMETER :: M84N9MMze = 10557 + INTEGER(IntKi), PARAMETER :: M85N1MMze = 10558 + INTEGER(IntKi), PARAMETER :: M85N2MMze = 10559 + INTEGER(IntKi), PARAMETER :: M85N3MMze = 10560 + INTEGER(IntKi), PARAMETER :: M85N4MMze = 10561 + INTEGER(IntKi), PARAMETER :: M85N5MMze = 10562 + INTEGER(IntKi), PARAMETER :: M85N6MMze = 10563 + INTEGER(IntKi), PARAMETER :: M85N7MMze = 10564 + INTEGER(IntKi), PARAMETER :: M85N8MMze = 10565 + INTEGER(IntKi), PARAMETER :: M85N9MMze = 10566 + INTEGER(IntKi), PARAMETER :: M86N1MMze = 10567 + INTEGER(IntKi), PARAMETER :: M86N2MMze = 10568 + INTEGER(IntKi), PARAMETER :: M86N3MMze = 10569 + INTEGER(IntKi), PARAMETER :: M86N4MMze = 10570 + INTEGER(IntKi), PARAMETER :: M86N5MMze = 10571 + INTEGER(IntKi), PARAMETER :: M86N6MMze = 10572 + INTEGER(IntKi), PARAMETER :: M86N7MMze = 10573 + INTEGER(IntKi), PARAMETER :: M86N8MMze = 10574 + INTEGER(IntKi), PARAMETER :: M86N9MMze = 10575 + INTEGER(IntKi), PARAMETER :: M87N1MMze = 10576 + INTEGER(IntKi), PARAMETER :: M87N2MMze = 10577 + INTEGER(IntKi), PARAMETER :: M87N3MMze = 10578 + INTEGER(IntKi), PARAMETER :: M87N4MMze = 10579 + INTEGER(IntKi), PARAMETER :: M87N5MMze = 10580 + INTEGER(IntKi), PARAMETER :: M87N6MMze = 10581 + INTEGER(IntKi), PARAMETER :: M87N7MMze = 10582 + INTEGER(IntKi), PARAMETER :: M87N8MMze = 10583 + INTEGER(IntKi), PARAMETER :: M87N9MMze = 10584 + INTEGER(IntKi), PARAMETER :: M88N1MMze = 10585 + INTEGER(IntKi), PARAMETER :: M88N2MMze = 10586 + INTEGER(IntKi), PARAMETER :: M88N3MMze = 10587 + INTEGER(IntKi), PARAMETER :: M88N4MMze = 10588 + INTEGER(IntKi), PARAMETER :: M88N5MMze = 10589 + INTEGER(IntKi), PARAMETER :: M88N6MMze = 10590 + INTEGER(IntKi), PARAMETER :: M88N7MMze = 10591 + INTEGER(IntKi), PARAMETER :: M88N8MMze = 10592 + INTEGER(IntKi), PARAMETER :: M88N9MMze = 10593 + INTEGER(IntKi), PARAMETER :: M89N1MMze = 10594 + INTEGER(IntKi), PARAMETER :: M89N2MMze = 10595 + INTEGER(IntKi), PARAMETER :: M89N3MMze = 10596 + INTEGER(IntKi), PARAMETER :: M89N4MMze = 10597 + INTEGER(IntKi), PARAMETER :: M89N5MMze = 10598 + INTEGER(IntKi), PARAMETER :: M89N6MMze = 10599 + INTEGER(IntKi), PARAMETER :: M89N7MMze = 10600 + INTEGER(IntKi), PARAMETER :: M89N8MMze = 10601 + INTEGER(IntKi), PARAMETER :: M89N9MMze = 10602 + INTEGER(IntKi), PARAMETER :: M90N1MMze = 10603 + INTEGER(IntKi), PARAMETER :: M90N2MMze = 10604 + INTEGER(IntKi), PARAMETER :: M90N3MMze = 10605 + INTEGER(IntKi), PARAMETER :: M90N4MMze = 10606 + INTEGER(IntKi), PARAMETER :: M90N5MMze = 10607 + INTEGER(IntKi), PARAMETER :: M90N6MMze = 10608 + INTEGER(IntKi), PARAMETER :: M90N7MMze = 10609 + INTEGER(IntKi), PARAMETER :: M90N8MMze = 10610 + INTEGER(IntKi), PARAMETER :: M90N9MMze = 10611 + INTEGER(IntKi), PARAMETER :: M91N1MMze = 10612 + INTEGER(IntKi), PARAMETER :: M91N2MMze = 10613 + INTEGER(IntKi), PARAMETER :: M91N3MMze = 10614 + INTEGER(IntKi), PARAMETER :: M91N4MMze = 10615 + INTEGER(IntKi), PARAMETER :: M91N5MMze = 10616 + INTEGER(IntKi), PARAMETER :: M91N6MMze = 10617 + INTEGER(IntKi), PARAMETER :: M91N7MMze = 10618 + INTEGER(IntKi), PARAMETER :: M91N8MMze = 10619 + INTEGER(IntKi), PARAMETER :: M91N9MMze = 10620 + INTEGER(IntKi), PARAMETER :: M92N1MMze = 10621 + INTEGER(IntKi), PARAMETER :: M92N2MMze = 10622 + INTEGER(IntKi), PARAMETER :: M92N3MMze = 10623 + INTEGER(IntKi), PARAMETER :: M92N4MMze = 10624 + INTEGER(IntKi), PARAMETER :: M92N5MMze = 10625 + INTEGER(IntKi), PARAMETER :: M92N6MMze = 10626 + INTEGER(IntKi), PARAMETER :: M92N7MMze = 10627 + INTEGER(IntKi), PARAMETER :: M92N8MMze = 10628 + INTEGER(IntKi), PARAMETER :: M92N9MMze = 10629 + INTEGER(IntKi), PARAMETER :: M93N1MMze = 10630 + INTEGER(IntKi), PARAMETER :: M93N2MMze = 10631 + INTEGER(IntKi), PARAMETER :: M93N3MMze = 10632 + INTEGER(IntKi), PARAMETER :: M93N4MMze = 10633 + INTEGER(IntKi), PARAMETER :: M93N5MMze = 10634 + INTEGER(IntKi), PARAMETER :: M93N6MMze = 10635 + INTEGER(IntKi), PARAMETER :: M93N7MMze = 10636 + INTEGER(IntKi), PARAMETER :: M93N8MMze = 10637 + INTEGER(IntKi), PARAMETER :: M93N9MMze = 10638 + INTEGER(IntKi), PARAMETER :: M94N1MMze = 10639 + INTEGER(IntKi), PARAMETER :: M94N2MMze = 10640 + INTEGER(IntKi), PARAMETER :: M94N3MMze = 10641 + INTEGER(IntKi), PARAMETER :: M94N4MMze = 10642 + INTEGER(IntKi), PARAMETER :: M94N5MMze = 10643 + INTEGER(IntKi), PARAMETER :: M94N6MMze = 10644 + INTEGER(IntKi), PARAMETER :: M94N7MMze = 10645 + INTEGER(IntKi), PARAMETER :: M94N8MMze = 10646 + INTEGER(IntKi), PARAMETER :: M94N9MMze = 10647 + INTEGER(IntKi), PARAMETER :: M95N1MMze = 10648 + INTEGER(IntKi), PARAMETER :: M95N2MMze = 10649 + INTEGER(IntKi), PARAMETER :: M95N3MMze = 10650 + INTEGER(IntKi), PARAMETER :: M95N4MMze = 10651 + INTEGER(IntKi), PARAMETER :: M95N5MMze = 10652 + INTEGER(IntKi), PARAMETER :: M95N6MMze = 10653 + INTEGER(IntKi), PARAMETER :: M95N7MMze = 10654 + INTEGER(IntKi), PARAMETER :: M95N8MMze = 10655 + INTEGER(IntKi), PARAMETER :: M95N9MMze = 10656 + INTEGER(IntKi), PARAMETER :: M96N1MMze = 10657 + INTEGER(IntKi), PARAMETER :: M96N2MMze = 10658 + INTEGER(IntKi), PARAMETER :: M96N3MMze = 10659 + INTEGER(IntKi), PARAMETER :: M96N4MMze = 10660 + INTEGER(IntKi), PARAMETER :: M96N5MMze = 10661 + INTEGER(IntKi), PARAMETER :: M96N6MMze = 10662 + INTEGER(IntKi), PARAMETER :: M96N7MMze = 10663 + INTEGER(IntKi), PARAMETER :: M96N8MMze = 10664 + INTEGER(IntKi), PARAMETER :: M96N9MMze = 10665 + INTEGER(IntKi), PARAMETER :: M97N1MMze = 10666 + INTEGER(IntKi), PARAMETER :: M97N2MMze = 10667 + INTEGER(IntKi), PARAMETER :: M97N3MMze = 10668 + INTEGER(IntKi), PARAMETER :: M97N4MMze = 10669 + INTEGER(IntKi), PARAMETER :: M97N5MMze = 10670 + INTEGER(IntKi), PARAMETER :: M97N6MMze = 10671 + INTEGER(IntKi), PARAMETER :: M97N7MMze = 10672 + INTEGER(IntKi), PARAMETER :: M97N8MMze = 10673 + INTEGER(IntKi), PARAMETER :: M97N9MMze = 10674 + INTEGER(IntKi), PARAMETER :: M98N1MMze = 10675 + INTEGER(IntKi), PARAMETER :: M98N2MMze = 10676 + INTEGER(IntKi), PARAMETER :: M98N3MMze = 10677 + INTEGER(IntKi), PARAMETER :: M98N4MMze = 10678 + INTEGER(IntKi), PARAMETER :: M98N5MMze = 10679 + INTEGER(IntKi), PARAMETER :: M98N6MMze = 10680 + INTEGER(IntKi), PARAMETER :: M98N7MMze = 10681 + INTEGER(IntKi), PARAMETER :: M98N8MMze = 10682 + INTEGER(IntKi), PARAMETER :: M98N9MMze = 10683 + INTEGER(IntKi), PARAMETER :: M99N1MMze = 10684 + INTEGER(IntKi), PARAMETER :: M99N2MMze = 10685 + INTEGER(IntKi), PARAMETER :: M99N3MMze = 10686 + INTEGER(IntKi), PARAMETER :: M99N4MMze = 10687 + INTEGER(IntKi), PARAMETER :: M99N5MMze = 10688 + INTEGER(IntKi), PARAMETER :: M99N6MMze = 10689 + INTEGER(IntKi), PARAMETER :: M99N7MMze = 10690 + INTEGER(IntKi), PARAMETER :: M99N8MMze = 10691 + INTEGER(IntKi), PARAMETER :: M99N9MMze = 10692 - INTEGER(IntKi), PARAMETER :: Time = 0 + ! Displacements: + INTEGER(IntKi), PARAMETER :: M01N1TDxss= 10693 + INTEGER(IntKi), PARAMETER :: M01N2TDxss= 10694 + INTEGER(IntKi), PARAMETER :: M01N3TDxss= 10695 + INTEGER(IntKi), PARAMETER :: M01N4TDxss= 10696 + INTEGER(IntKi), PARAMETER :: M01N5TDxss= 10697 + INTEGER(IntKi), PARAMETER :: M01N6TDxss= 10698 + INTEGER(IntKi), PARAMETER :: M01N7TDxss= 10699 + INTEGER(IntKi), PARAMETER :: M01N8TDxss= 10700 + INTEGER(IntKi), PARAMETER :: M01N9TDxss= 10701 + INTEGER(IntKi), PARAMETER :: M02N1TDxss= 10702 + INTEGER(IntKi), PARAMETER :: M02N2TDxss= 10703 + INTEGER(IntKi), PARAMETER :: M02N3TDxss= 10704 + INTEGER(IntKi), PARAMETER :: M02N4TDxss= 10705 + INTEGER(IntKi), PARAMETER :: M02N5TDxss= 10706 + INTEGER(IntKi), PARAMETER :: M02N6TDxss= 10707 + INTEGER(IntKi), PARAMETER :: M02N7TDxss= 10708 + INTEGER(IntKi), PARAMETER :: M02N8TDxss= 10709 + INTEGER(IntKi), PARAMETER :: M02N9TDxss= 10710 + INTEGER(IntKi), PARAMETER :: M03N1TDxss= 10711 + INTEGER(IntKi), PARAMETER :: M03N2TDxss= 10712 + INTEGER(IntKi), PARAMETER :: M03N3TDxss= 10713 + INTEGER(IntKi), PARAMETER :: M03N4TDxss= 10714 + INTEGER(IntKi), PARAMETER :: M03N5TDxss= 10715 + INTEGER(IntKi), PARAMETER :: M03N6TDxss= 10716 + INTEGER(IntKi), PARAMETER :: M03N7TDxss= 10717 + INTEGER(IntKi), PARAMETER :: M03N8TDxss= 10718 + INTEGER(IntKi), PARAMETER :: M03N9TDxss= 10719 + INTEGER(IntKi), PARAMETER :: M04N1TDxss= 10720 + INTEGER(IntKi), PARAMETER :: M04N2TDxss= 10721 + INTEGER(IntKi), PARAMETER :: M04N3TDxss= 10722 + INTEGER(IntKi), PARAMETER :: M04N4TDxss= 10723 + INTEGER(IntKi), PARAMETER :: M04N5TDxss= 10724 + INTEGER(IntKi), PARAMETER :: M04N6TDxss= 10725 + INTEGER(IntKi), PARAMETER :: M04N7TDxss= 10726 + INTEGER(IntKi), PARAMETER :: M04N8TDxss= 10727 + INTEGER(IntKi), PARAMETER :: M04N9TDxss= 10728 + INTEGER(IntKi), PARAMETER :: M05N1TDxss= 10729 + INTEGER(IntKi), PARAMETER :: M05N2TDxss= 10730 + INTEGER(IntKi), PARAMETER :: M05N3TDxss= 10731 + INTEGER(IntKi), PARAMETER :: M05N4TDxss= 10732 + INTEGER(IntKi), PARAMETER :: M05N5TDxss= 10733 + INTEGER(IntKi), PARAMETER :: M05N6TDxss= 10734 + INTEGER(IntKi), PARAMETER :: M05N7TDxss= 10735 + INTEGER(IntKi), PARAMETER :: M05N8TDxss= 10736 + INTEGER(IntKi), PARAMETER :: M05N9TDxss= 10737 + INTEGER(IntKi), PARAMETER :: M06N1TDxss= 10738 + INTEGER(IntKi), PARAMETER :: M06N2TDxss= 10739 + INTEGER(IntKi), PARAMETER :: M06N3TDxss= 10740 + INTEGER(IntKi), PARAMETER :: M06N4TDxss= 10741 + INTEGER(IntKi), PARAMETER :: M06N5TDxss= 10742 + INTEGER(IntKi), PARAMETER :: M06N6TDxss= 10743 + INTEGER(IntKi), PARAMETER :: M06N7TDxss= 10744 + INTEGER(IntKi), PARAMETER :: M06N8TDxss= 10745 + INTEGER(IntKi), PARAMETER :: M06N9TDxss= 10746 + INTEGER(IntKi), PARAMETER :: M07N1TDxss= 10747 + INTEGER(IntKi), PARAMETER :: M07N2TDxss= 10748 + INTEGER(IntKi), PARAMETER :: M07N3TDxss= 10749 + INTEGER(IntKi), PARAMETER :: M07N4TDxss= 10750 + INTEGER(IntKi), PARAMETER :: M07N5TDxss= 10751 + INTEGER(IntKi), PARAMETER :: M07N6TDxss= 10752 + INTEGER(IntKi), PARAMETER :: M07N7TDxss= 10753 + INTEGER(IntKi), PARAMETER :: M07N8TDxss= 10754 + INTEGER(IntKi), PARAMETER :: M07N9TDxss= 10755 + INTEGER(IntKi), PARAMETER :: M08N1TDxss= 10756 + INTEGER(IntKi), PARAMETER :: M08N2TDxss= 10757 + INTEGER(IntKi), PARAMETER :: M08N3TDxss= 10758 + INTEGER(IntKi), PARAMETER :: M08N4TDxss= 10759 + INTEGER(IntKi), PARAMETER :: M08N5TDxss= 10760 + INTEGER(IntKi), PARAMETER :: M08N6TDxss= 10761 + INTEGER(IntKi), PARAMETER :: M08N7TDxss= 10762 + INTEGER(IntKi), PARAMETER :: M08N8TDxss= 10763 + INTEGER(IntKi), PARAMETER :: M08N9TDxss= 10764 + INTEGER(IntKi), PARAMETER :: M09N1TDxss= 10765 + INTEGER(IntKi), PARAMETER :: M09N2TDxss= 10766 + INTEGER(IntKi), PARAMETER :: M09N3TDxss= 10767 + INTEGER(IntKi), PARAMETER :: M09N4TDxss= 10768 + INTEGER(IntKi), PARAMETER :: M09N5TDxss= 10769 + INTEGER(IntKi), PARAMETER :: M09N6TDxss= 10770 + INTEGER(IntKi), PARAMETER :: M09N7TDxss= 10771 + INTEGER(IntKi), PARAMETER :: M09N8TDxss= 10772 + INTEGER(IntKi), PARAMETER :: M09N9TDxss= 10773 + INTEGER(IntKi), PARAMETER :: M10N1TDxss= 10774 + INTEGER(IntKi), PARAMETER :: M10N2TDxss= 10775 + INTEGER(IntKi), PARAMETER :: M10N3TDxss= 10776 + INTEGER(IntKi), PARAMETER :: M10N4TDxss= 10777 + INTEGER(IntKi), PARAMETER :: M10N5TDxss= 10778 + INTEGER(IntKi), PARAMETER :: M10N6TDxss= 10779 + INTEGER(IntKi), PARAMETER :: M10N7TDxss= 10780 + INTEGER(IntKi), PARAMETER :: M10N8TDxss= 10781 + INTEGER(IntKi), PARAMETER :: M10N9TDxss= 10782 + INTEGER(IntKi), PARAMETER :: M11N1TDxss= 10783 + INTEGER(IntKi), PARAMETER :: M11N2TDxss= 10784 + INTEGER(IntKi), PARAMETER :: M11N3TDxss= 10785 + INTEGER(IntKi), PARAMETER :: M11N4TDxss= 10786 + INTEGER(IntKi), PARAMETER :: M11N5TDxss= 10787 + INTEGER(IntKi), PARAMETER :: M11N6TDxss= 10788 + INTEGER(IntKi), PARAMETER :: M11N7TDxss= 10789 + INTEGER(IntKi), PARAMETER :: M11N8TDxss= 10790 + INTEGER(IntKi), PARAMETER :: M11N9TDxss= 10791 + INTEGER(IntKi), PARAMETER :: M12N1TDxss= 10792 + INTEGER(IntKi), PARAMETER :: M12N2TDxss= 10793 + INTEGER(IntKi), PARAMETER :: M12N3TDxss= 10794 + INTEGER(IntKi), PARAMETER :: M12N4TDxss= 10795 + INTEGER(IntKi), PARAMETER :: M12N5TDxss= 10796 + INTEGER(IntKi), PARAMETER :: M12N6TDxss= 10797 + INTEGER(IntKi), PARAMETER :: M12N7TDxss= 10798 + INTEGER(IntKi), PARAMETER :: M12N8TDxss= 10799 + INTEGER(IntKi), PARAMETER :: M12N9TDxss= 10800 + INTEGER(IntKi), PARAMETER :: M13N1TDxss= 10801 + INTEGER(IntKi), PARAMETER :: M13N2TDxss= 10802 + INTEGER(IntKi), PARAMETER :: M13N3TDxss= 10803 + INTEGER(IntKi), PARAMETER :: M13N4TDxss= 10804 + INTEGER(IntKi), PARAMETER :: M13N5TDxss= 10805 + INTEGER(IntKi), PARAMETER :: M13N6TDxss= 10806 + INTEGER(IntKi), PARAMETER :: M13N7TDxss= 10807 + INTEGER(IntKi), PARAMETER :: M13N8TDxss= 10808 + INTEGER(IntKi), PARAMETER :: M13N9TDxss= 10809 + INTEGER(IntKi), PARAMETER :: M14N1TDxss= 10810 + INTEGER(IntKi), PARAMETER :: M14N2TDxss= 10811 + INTEGER(IntKi), PARAMETER :: M14N3TDxss= 10812 + INTEGER(IntKi), PARAMETER :: M14N4TDxss= 10813 + INTEGER(IntKi), PARAMETER :: M14N5TDxss= 10814 + INTEGER(IntKi), PARAMETER :: M14N6TDxss= 10815 + INTEGER(IntKi), PARAMETER :: M14N7TDxss= 10816 + INTEGER(IntKi), PARAMETER :: M14N8TDxss= 10817 + INTEGER(IntKi), PARAMETER :: M14N9TDxss= 10818 + INTEGER(IntKi), PARAMETER :: M15N1TDxss= 10819 + INTEGER(IntKi), PARAMETER :: M15N2TDxss= 10820 + INTEGER(IntKi), PARAMETER :: M15N3TDxss= 10821 + INTEGER(IntKi), PARAMETER :: M15N4TDxss= 10822 + INTEGER(IntKi), PARAMETER :: M15N5TDxss= 10823 + INTEGER(IntKi), PARAMETER :: M15N6TDxss= 10824 + INTEGER(IntKi), PARAMETER :: M15N7TDxss= 10825 + INTEGER(IntKi), PARAMETER :: M15N8TDxss= 10826 + INTEGER(IntKi), PARAMETER :: M15N9TDxss= 10827 + INTEGER(IntKi), PARAMETER :: M16N1TDxss= 10828 + INTEGER(IntKi), PARAMETER :: M16N2TDxss= 10829 + INTEGER(IntKi), PARAMETER :: M16N3TDxss= 10830 + INTEGER(IntKi), PARAMETER :: M16N4TDxss= 10831 + INTEGER(IntKi), PARAMETER :: M16N5TDxss= 10832 + INTEGER(IntKi), PARAMETER :: M16N6TDxss= 10833 + INTEGER(IntKi), PARAMETER :: M16N7TDxss= 10834 + INTEGER(IntKi), PARAMETER :: M16N8TDxss= 10835 + INTEGER(IntKi), PARAMETER :: M16N9TDxss= 10836 + INTEGER(IntKi), PARAMETER :: M17N1TDxss= 10837 + INTEGER(IntKi), PARAMETER :: M17N2TDxss= 10838 + INTEGER(IntKi), PARAMETER :: M17N3TDxss= 10839 + INTEGER(IntKi), PARAMETER :: M17N4TDxss= 10840 + INTEGER(IntKi), PARAMETER :: M17N5TDxss= 10841 + INTEGER(IntKi), PARAMETER :: M17N6TDxss= 10842 + INTEGER(IntKi), PARAMETER :: M17N7TDxss= 10843 + INTEGER(IntKi), PARAMETER :: M17N8TDxss= 10844 + INTEGER(IntKi), PARAMETER :: M17N9TDxss= 10845 + INTEGER(IntKi), PARAMETER :: M18N1TDxss= 10846 + INTEGER(IntKi), PARAMETER :: M18N2TDxss= 10847 + INTEGER(IntKi), PARAMETER :: M18N3TDxss= 10848 + INTEGER(IntKi), PARAMETER :: M18N4TDxss= 10849 + INTEGER(IntKi), PARAMETER :: M18N5TDxss= 10850 + INTEGER(IntKi), PARAMETER :: M18N6TDxss= 10851 + INTEGER(IntKi), PARAMETER :: M18N7TDxss= 10852 + INTEGER(IntKi), PARAMETER :: M18N8TDxss= 10853 + INTEGER(IntKi), PARAMETER :: M18N9TDxss= 10854 + INTEGER(IntKi), PARAMETER :: M19N1TDxss= 10855 + INTEGER(IntKi), PARAMETER :: M19N2TDxss= 10856 + INTEGER(IntKi), PARAMETER :: M19N3TDxss= 10857 + INTEGER(IntKi), PARAMETER :: M19N4TDxss= 10858 + INTEGER(IntKi), PARAMETER :: M19N5TDxss= 10859 + INTEGER(IntKi), PARAMETER :: M19N6TDxss= 10860 + INTEGER(IntKi), PARAMETER :: M19N7TDxss= 10861 + INTEGER(IntKi), PARAMETER :: M19N8TDxss= 10862 + INTEGER(IntKi), PARAMETER :: M19N9TDxss= 10863 + INTEGER(IntKi), PARAMETER :: M20N1TDxss= 10864 + INTEGER(IntKi), PARAMETER :: M20N2TDxss= 10865 + INTEGER(IntKi), PARAMETER :: M20N3TDxss= 10866 + INTEGER(IntKi), PARAMETER :: M20N4TDxss= 10867 + INTEGER(IntKi), PARAMETER :: M20N5TDxss= 10868 + INTEGER(IntKi), PARAMETER :: M20N6TDxss= 10869 + INTEGER(IntKi), PARAMETER :: M20N7TDxss= 10870 + INTEGER(IntKi), PARAMETER :: M20N8TDxss= 10871 + INTEGER(IntKi), PARAMETER :: M20N9TDxss= 10872 + INTEGER(IntKi), PARAMETER :: M21N1TDxss= 10873 + INTEGER(IntKi), PARAMETER :: M21N2TDxss= 10874 + INTEGER(IntKi), PARAMETER :: M21N3TDxss= 10875 + INTEGER(IntKi), PARAMETER :: M21N4TDxss= 10876 + INTEGER(IntKi), PARAMETER :: M21N5TDxss= 10877 + INTEGER(IntKi), PARAMETER :: M21N6TDxss= 10878 + INTEGER(IntKi), PARAMETER :: M21N7TDxss= 10879 + INTEGER(IntKi), PARAMETER :: M21N8TDxss= 10880 + INTEGER(IntKi), PARAMETER :: M21N9TDxss= 10881 + INTEGER(IntKi), PARAMETER :: M22N1TDxss= 10882 + INTEGER(IntKi), PARAMETER :: M22N2TDxss= 10883 + INTEGER(IntKi), PARAMETER :: M22N3TDxss= 10884 + INTEGER(IntKi), PARAMETER :: M22N4TDxss= 10885 + INTEGER(IntKi), PARAMETER :: M22N5TDxss= 10886 + INTEGER(IntKi), PARAMETER :: M22N6TDxss= 10887 + INTEGER(IntKi), PARAMETER :: M22N7TDxss= 10888 + INTEGER(IntKi), PARAMETER :: M22N8TDxss= 10889 + INTEGER(IntKi), PARAMETER :: M22N9TDxss= 10890 + INTEGER(IntKi), PARAMETER :: M23N1TDxss= 10891 + INTEGER(IntKi), PARAMETER :: M23N2TDxss= 10892 + INTEGER(IntKi), PARAMETER :: M23N3TDxss= 10893 + INTEGER(IntKi), PARAMETER :: M23N4TDxss= 10894 + INTEGER(IntKi), PARAMETER :: M23N5TDxss= 10895 + INTEGER(IntKi), PARAMETER :: M23N6TDxss= 10896 + INTEGER(IntKi), PARAMETER :: M23N7TDxss= 10897 + INTEGER(IntKi), PARAMETER :: M23N8TDxss= 10898 + INTEGER(IntKi), PARAMETER :: M23N9TDxss= 10899 + INTEGER(IntKi), PARAMETER :: M24N1TDxss= 10900 + INTEGER(IntKi), PARAMETER :: M24N2TDxss= 10901 + INTEGER(IntKi), PARAMETER :: M24N3TDxss= 10902 + INTEGER(IntKi), PARAMETER :: M24N4TDxss= 10903 + INTEGER(IntKi), PARAMETER :: M24N5TDxss= 10904 + INTEGER(IntKi), PARAMETER :: M24N6TDxss= 10905 + INTEGER(IntKi), PARAMETER :: M24N7TDxss= 10906 + INTEGER(IntKi), PARAMETER :: M24N8TDxss= 10907 + INTEGER(IntKi), PARAMETER :: M24N9TDxss= 10908 + INTEGER(IntKi), PARAMETER :: M25N1TDxss= 10909 + INTEGER(IntKi), PARAMETER :: M25N2TDxss= 10910 + INTEGER(IntKi), PARAMETER :: M25N3TDxss= 10911 + INTEGER(IntKi), PARAMETER :: M25N4TDxss= 10912 + INTEGER(IntKi), PARAMETER :: M25N5TDxss= 10913 + INTEGER(IntKi), PARAMETER :: M25N6TDxss= 10914 + INTEGER(IntKi), PARAMETER :: M25N7TDxss= 10915 + INTEGER(IntKi), PARAMETER :: M25N8TDxss= 10916 + INTEGER(IntKi), PARAMETER :: M25N9TDxss= 10917 + INTEGER(IntKi), PARAMETER :: M26N1TDxss= 10918 + INTEGER(IntKi), PARAMETER :: M26N2TDxss= 10919 + INTEGER(IntKi), PARAMETER :: M26N3TDxss= 10920 + INTEGER(IntKi), PARAMETER :: M26N4TDxss= 10921 + INTEGER(IntKi), PARAMETER :: M26N5TDxss= 10922 + INTEGER(IntKi), PARAMETER :: M26N6TDxss= 10923 + INTEGER(IntKi), PARAMETER :: M26N7TDxss= 10924 + INTEGER(IntKi), PARAMETER :: M26N8TDxss= 10925 + INTEGER(IntKi), PARAMETER :: M26N9TDxss= 10926 + INTEGER(IntKi), PARAMETER :: M27N1TDxss= 10927 + INTEGER(IntKi), PARAMETER :: M27N2TDxss= 10928 + INTEGER(IntKi), PARAMETER :: M27N3TDxss= 10929 + INTEGER(IntKi), PARAMETER :: M27N4TDxss= 10930 + INTEGER(IntKi), PARAMETER :: M27N5TDxss= 10931 + INTEGER(IntKi), PARAMETER :: M27N6TDxss= 10932 + INTEGER(IntKi), PARAMETER :: M27N7TDxss= 10933 + INTEGER(IntKi), PARAMETER :: M27N8TDxss= 10934 + INTEGER(IntKi), PARAMETER :: M27N9TDxss= 10935 + INTEGER(IntKi), PARAMETER :: M28N1TDxss= 10936 + INTEGER(IntKi), PARAMETER :: M28N2TDxss= 10937 + INTEGER(IntKi), PARAMETER :: M28N3TDxss= 10938 + INTEGER(IntKi), PARAMETER :: M28N4TDxss= 10939 + INTEGER(IntKi), PARAMETER :: M28N5TDxss= 10940 + INTEGER(IntKi), PARAMETER :: M28N6TDxss= 10941 + INTEGER(IntKi), PARAMETER :: M28N7TDxss= 10942 + INTEGER(IntKi), PARAMETER :: M28N8TDxss= 10943 + INTEGER(IntKi), PARAMETER :: M28N9TDxss= 10944 + INTEGER(IntKi), PARAMETER :: M29N1TDxss= 10945 + INTEGER(IntKi), PARAMETER :: M29N2TDxss= 10946 + INTEGER(IntKi), PARAMETER :: M29N3TDxss= 10947 + INTEGER(IntKi), PARAMETER :: M29N4TDxss= 10948 + INTEGER(IntKi), PARAMETER :: M29N5TDxss= 10949 + INTEGER(IntKi), PARAMETER :: M29N6TDxss= 10950 + INTEGER(IntKi), PARAMETER :: M29N7TDxss= 10951 + INTEGER(IntKi), PARAMETER :: M29N8TDxss= 10952 + INTEGER(IntKi), PARAMETER :: M29N9TDxss= 10953 + INTEGER(IntKi), PARAMETER :: M30N1TDxss= 10954 + INTEGER(IntKi), PARAMETER :: M30N2TDxss= 10955 + INTEGER(IntKi), PARAMETER :: M30N3TDxss= 10956 + INTEGER(IntKi), PARAMETER :: M30N4TDxss= 10957 + INTEGER(IntKi), PARAMETER :: M30N5TDxss= 10958 + INTEGER(IntKi), PARAMETER :: M30N6TDxss= 10959 + INTEGER(IntKi), PARAMETER :: M30N7TDxss= 10960 + INTEGER(IntKi), PARAMETER :: M30N8TDxss= 10961 + INTEGER(IntKi), PARAMETER :: M30N9TDxss= 10962 + INTEGER(IntKi), PARAMETER :: M31N1TDxss= 10963 + INTEGER(IntKi), PARAMETER :: M31N2TDxss= 10964 + INTEGER(IntKi), PARAMETER :: M31N3TDxss= 10965 + INTEGER(IntKi), PARAMETER :: M31N4TDxss= 10966 + INTEGER(IntKi), PARAMETER :: M31N5TDxss= 10967 + INTEGER(IntKi), PARAMETER :: M31N6TDxss= 10968 + INTEGER(IntKi), PARAMETER :: M31N7TDxss= 10969 + INTEGER(IntKi), PARAMETER :: M31N8TDxss= 10970 + INTEGER(IntKi), PARAMETER :: M31N9TDxss= 10971 + INTEGER(IntKi), PARAMETER :: M32N1TDxss= 10972 + INTEGER(IntKi), PARAMETER :: M32N2TDxss= 10973 + INTEGER(IntKi), PARAMETER :: M32N3TDxss= 10974 + INTEGER(IntKi), PARAMETER :: M32N4TDxss= 10975 + INTEGER(IntKi), PARAMETER :: M32N5TDxss= 10976 + INTEGER(IntKi), PARAMETER :: M32N6TDxss= 10977 + INTEGER(IntKi), PARAMETER :: M32N7TDxss= 10978 + INTEGER(IntKi), PARAMETER :: M32N8TDxss= 10979 + INTEGER(IntKi), PARAMETER :: M32N9TDxss= 10980 + INTEGER(IntKi), PARAMETER :: M33N1TDxss= 10981 + INTEGER(IntKi), PARAMETER :: M33N2TDxss= 10982 + INTEGER(IntKi), PARAMETER :: M33N3TDxss= 10983 + INTEGER(IntKi), PARAMETER :: M33N4TDxss= 10984 + INTEGER(IntKi), PARAMETER :: M33N5TDxss= 10985 + INTEGER(IntKi), PARAMETER :: M33N6TDxss= 10986 + INTEGER(IntKi), PARAMETER :: M33N7TDxss= 10987 + INTEGER(IntKi), PARAMETER :: M33N8TDxss= 10988 + INTEGER(IntKi), PARAMETER :: M33N9TDxss= 10989 + INTEGER(IntKi), PARAMETER :: M34N1TDxss= 10990 + INTEGER(IntKi), PARAMETER :: M34N2TDxss= 10991 + INTEGER(IntKi), PARAMETER :: M34N3TDxss= 10992 + INTEGER(IntKi), PARAMETER :: M34N4TDxss= 10993 + INTEGER(IntKi), PARAMETER :: M34N5TDxss= 10994 + INTEGER(IntKi), PARAMETER :: M34N6TDxss= 10995 + INTEGER(IntKi), PARAMETER :: M34N7TDxss= 10996 + INTEGER(IntKi), PARAMETER :: M34N8TDxss= 10997 + INTEGER(IntKi), PARAMETER :: M34N9TDxss= 10998 + INTEGER(IntKi), PARAMETER :: M35N1TDxss= 10999 + INTEGER(IntKi), PARAMETER :: M35N2TDxss= 11000 + INTEGER(IntKi), PARAMETER :: M35N3TDxss= 11001 + INTEGER(IntKi), PARAMETER :: M35N4TDxss= 11002 + INTEGER(IntKi), PARAMETER :: M35N5TDxss= 11003 + INTEGER(IntKi), PARAMETER :: M35N6TDxss= 11004 + INTEGER(IntKi), PARAMETER :: M35N7TDxss= 11005 + INTEGER(IntKi), PARAMETER :: M35N8TDxss= 11006 + INTEGER(IntKi), PARAMETER :: M35N9TDxss= 11007 + INTEGER(IntKi), PARAMETER :: M36N1TDxss= 11008 + INTEGER(IntKi), PARAMETER :: M36N2TDxss= 11009 + INTEGER(IntKi), PARAMETER :: M36N3TDxss= 11010 + INTEGER(IntKi), PARAMETER :: M36N4TDxss= 11011 + INTEGER(IntKi), PARAMETER :: M36N5TDxss= 11012 + INTEGER(IntKi), PARAMETER :: M36N6TDxss= 11013 + INTEGER(IntKi), PARAMETER :: M36N7TDxss= 11014 + INTEGER(IntKi), PARAMETER :: M36N8TDxss= 11015 + INTEGER(IntKi), PARAMETER :: M36N9TDxss= 11016 + INTEGER(IntKi), PARAMETER :: M37N1TDxss= 11017 + INTEGER(IntKi), PARAMETER :: M37N2TDxss= 11018 + INTEGER(IntKi), PARAMETER :: M37N3TDxss= 11019 + INTEGER(IntKi), PARAMETER :: M37N4TDxss= 11020 + INTEGER(IntKi), PARAMETER :: M37N5TDxss= 11021 + INTEGER(IntKi), PARAMETER :: M37N6TDxss= 11022 + INTEGER(IntKi), PARAMETER :: M37N7TDxss= 11023 + INTEGER(IntKi), PARAMETER :: M37N8TDxss= 11024 + INTEGER(IntKi), PARAMETER :: M37N9TDxss= 11025 + INTEGER(IntKi), PARAMETER :: M38N1TDxss= 11026 + INTEGER(IntKi), PARAMETER :: M38N2TDxss= 11027 + INTEGER(IntKi), PARAMETER :: M38N3TDxss= 11028 + INTEGER(IntKi), PARAMETER :: M38N4TDxss= 11029 + INTEGER(IntKi), PARAMETER :: M38N5TDxss= 11030 + INTEGER(IntKi), PARAMETER :: M38N6TDxss= 11031 + INTEGER(IntKi), PARAMETER :: M38N7TDxss= 11032 + INTEGER(IntKi), PARAMETER :: M38N8TDxss= 11033 + INTEGER(IntKi), PARAMETER :: M38N9TDxss= 11034 + INTEGER(IntKi), PARAMETER :: M39N1TDxss= 11035 + INTEGER(IntKi), PARAMETER :: M39N2TDxss= 11036 + INTEGER(IntKi), PARAMETER :: M39N3TDxss= 11037 + INTEGER(IntKi), PARAMETER :: M39N4TDxss= 11038 + INTEGER(IntKi), PARAMETER :: M39N5TDxss= 11039 + INTEGER(IntKi), PARAMETER :: M39N6TDxss= 11040 + INTEGER(IntKi), PARAMETER :: M39N7TDxss= 11041 + INTEGER(IntKi), PARAMETER :: M39N8TDxss= 11042 + INTEGER(IntKi), PARAMETER :: M39N9TDxss= 11043 + INTEGER(IntKi), PARAMETER :: M40N1TDxss= 11044 + INTEGER(IntKi), PARAMETER :: M40N2TDxss= 11045 + INTEGER(IntKi), PARAMETER :: M40N3TDxss= 11046 + INTEGER(IntKi), PARAMETER :: M40N4TDxss= 11047 + INTEGER(IntKi), PARAMETER :: M40N5TDxss= 11048 + INTEGER(IntKi), PARAMETER :: M40N6TDxss= 11049 + INTEGER(IntKi), PARAMETER :: M40N7TDxss= 11050 + INTEGER(IntKi), PARAMETER :: M40N8TDxss= 11051 + INTEGER(IntKi), PARAMETER :: M40N9TDxss= 11052 + INTEGER(IntKi), PARAMETER :: M41N1TDxss= 11053 + INTEGER(IntKi), PARAMETER :: M41N2TDxss= 11054 + INTEGER(IntKi), PARAMETER :: M41N3TDxss= 11055 + INTEGER(IntKi), PARAMETER :: M41N4TDxss= 11056 + INTEGER(IntKi), PARAMETER :: M41N5TDxss= 11057 + INTEGER(IntKi), PARAMETER :: M41N6TDxss= 11058 + INTEGER(IntKi), PARAMETER :: M41N7TDxss= 11059 + INTEGER(IntKi), PARAMETER :: M41N8TDxss= 11060 + INTEGER(IntKi), PARAMETER :: M41N9TDxss= 11061 + INTEGER(IntKi), PARAMETER :: M42N1TDxss= 11062 + INTEGER(IntKi), PARAMETER :: M42N2TDxss= 11063 + INTEGER(IntKi), PARAMETER :: M42N3TDxss= 11064 + INTEGER(IntKi), PARAMETER :: M42N4TDxss= 11065 + INTEGER(IntKi), PARAMETER :: M42N5TDxss= 11066 + INTEGER(IntKi), PARAMETER :: M42N6TDxss= 11067 + INTEGER(IntKi), PARAMETER :: M42N7TDxss= 11068 + INTEGER(IntKi), PARAMETER :: M42N8TDxss= 11069 + INTEGER(IntKi), PARAMETER :: M42N9TDxss= 11070 + INTEGER(IntKi), PARAMETER :: M43N1TDxss= 11071 + INTEGER(IntKi), PARAMETER :: M43N2TDxss= 11072 + INTEGER(IntKi), PARAMETER :: M43N3TDxss= 11073 + INTEGER(IntKi), PARAMETER :: M43N4TDxss= 11074 + INTEGER(IntKi), PARAMETER :: M43N5TDxss= 11075 + INTEGER(IntKi), PARAMETER :: M43N6TDxss= 11076 + INTEGER(IntKi), PARAMETER :: M43N7TDxss= 11077 + INTEGER(IntKi), PARAMETER :: M43N8TDxss= 11078 + INTEGER(IntKi), PARAMETER :: M43N9TDxss= 11079 + INTEGER(IntKi), PARAMETER :: M44N1TDxss= 11080 + INTEGER(IntKi), PARAMETER :: M44N2TDxss= 11081 + INTEGER(IntKi), PARAMETER :: M44N3TDxss= 11082 + INTEGER(IntKi), PARAMETER :: M44N4TDxss= 11083 + INTEGER(IntKi), PARAMETER :: M44N5TDxss= 11084 + INTEGER(IntKi), PARAMETER :: M44N6TDxss= 11085 + INTEGER(IntKi), PARAMETER :: M44N7TDxss= 11086 + INTEGER(IntKi), PARAMETER :: M44N8TDxss= 11087 + INTEGER(IntKi), PARAMETER :: M44N9TDxss= 11088 + INTEGER(IntKi), PARAMETER :: M45N1TDxss= 11089 + INTEGER(IntKi), PARAMETER :: M45N2TDxss= 11090 + INTEGER(IntKi), PARAMETER :: M45N3TDxss= 11091 + INTEGER(IntKi), PARAMETER :: M45N4TDxss= 11092 + INTEGER(IntKi), PARAMETER :: M45N5TDxss= 11093 + INTEGER(IntKi), PARAMETER :: M45N6TDxss= 11094 + INTEGER(IntKi), PARAMETER :: M45N7TDxss= 11095 + INTEGER(IntKi), PARAMETER :: M45N8TDxss= 11096 + INTEGER(IntKi), PARAMETER :: M45N9TDxss= 11097 + INTEGER(IntKi), PARAMETER :: M46N1TDxss= 11098 + INTEGER(IntKi), PARAMETER :: M46N2TDxss= 11099 + INTEGER(IntKi), PARAMETER :: M46N3TDxss= 11100 + INTEGER(IntKi), PARAMETER :: M46N4TDxss= 11101 + INTEGER(IntKi), PARAMETER :: M46N5TDxss= 11102 + INTEGER(IntKi), PARAMETER :: M46N6TDxss= 11103 + INTEGER(IntKi), PARAMETER :: M46N7TDxss= 11104 + INTEGER(IntKi), PARAMETER :: M46N8TDxss= 11105 + INTEGER(IntKi), PARAMETER :: M46N9TDxss= 11106 + INTEGER(IntKi), PARAMETER :: M47N1TDxss= 11107 + INTEGER(IntKi), PARAMETER :: M47N2TDxss= 11108 + INTEGER(IntKi), PARAMETER :: M47N3TDxss= 11109 + INTEGER(IntKi), PARAMETER :: M47N4TDxss= 11110 + INTEGER(IntKi), PARAMETER :: M47N5TDxss= 11111 + INTEGER(IntKi), PARAMETER :: M47N6TDxss= 11112 + INTEGER(IntKi), PARAMETER :: M47N7TDxss= 11113 + INTEGER(IntKi), PARAMETER :: M47N8TDxss= 11114 + INTEGER(IntKi), PARAMETER :: M47N9TDxss= 11115 + INTEGER(IntKi), PARAMETER :: M48N1TDxss= 11116 + INTEGER(IntKi), PARAMETER :: M48N2TDxss= 11117 + INTEGER(IntKi), PARAMETER :: M48N3TDxss= 11118 + INTEGER(IntKi), PARAMETER :: M48N4TDxss= 11119 + INTEGER(IntKi), PARAMETER :: M48N5TDxss= 11120 + INTEGER(IntKi), PARAMETER :: M48N6TDxss= 11121 + INTEGER(IntKi), PARAMETER :: M48N7TDxss= 11122 + INTEGER(IntKi), PARAMETER :: M48N8TDxss= 11123 + INTEGER(IntKi), PARAMETER :: M48N9TDxss= 11124 + INTEGER(IntKi), PARAMETER :: M49N1TDxss= 11125 + INTEGER(IntKi), PARAMETER :: M49N2TDxss= 11126 + INTEGER(IntKi), PARAMETER :: M49N3TDxss= 11127 + INTEGER(IntKi), PARAMETER :: M49N4TDxss= 11128 + INTEGER(IntKi), PARAMETER :: M49N5TDxss= 11129 + INTEGER(IntKi), PARAMETER :: M49N6TDxss= 11130 + INTEGER(IntKi), PARAMETER :: M49N7TDxss= 11131 + INTEGER(IntKi), PARAMETER :: M49N8TDxss= 11132 + INTEGER(IntKi), PARAMETER :: M49N9TDxss= 11133 + INTEGER(IntKi), PARAMETER :: M50N1TDxss= 11134 + INTEGER(IntKi), PARAMETER :: M50N2TDxss= 11135 + INTEGER(IntKi), PARAMETER :: M50N3TDxss= 11136 + INTEGER(IntKi), PARAMETER :: M50N4TDxss= 11137 + INTEGER(IntKi), PARAMETER :: M50N5TDxss= 11138 + INTEGER(IntKi), PARAMETER :: M50N6TDxss= 11139 + INTEGER(IntKi), PARAMETER :: M50N7TDxss= 11140 + INTEGER(IntKi), PARAMETER :: M50N8TDxss= 11141 + INTEGER(IntKi), PARAMETER :: M50N9TDxss= 11142 + INTEGER(IntKi), PARAMETER :: M51N1TDxss= 11143 + INTEGER(IntKi), PARAMETER :: M51N2TDxss= 11144 + INTEGER(IntKi), PARAMETER :: M51N3TDxss= 11145 + INTEGER(IntKi), PARAMETER :: M51N4TDxss= 11146 + INTEGER(IntKi), PARAMETER :: M51N5TDxss= 11147 + INTEGER(IntKi), PARAMETER :: M51N6TDxss= 11148 + INTEGER(IntKi), PARAMETER :: M51N7TDxss= 11149 + INTEGER(IntKi), PARAMETER :: M51N8TDxss= 11150 + INTEGER(IntKi), PARAMETER :: M51N9TDxss= 11151 + INTEGER(IntKi), PARAMETER :: M52N1TDxss= 11152 + INTEGER(IntKi), PARAMETER :: M52N2TDxss= 11153 + INTEGER(IntKi), PARAMETER :: M52N3TDxss= 11154 + INTEGER(IntKi), PARAMETER :: M52N4TDxss= 11155 + INTEGER(IntKi), PARAMETER :: M52N5TDxss= 11156 + INTEGER(IntKi), PARAMETER :: M52N6TDxss= 11157 + INTEGER(IntKi), PARAMETER :: M52N7TDxss= 11158 + INTEGER(IntKi), PARAMETER :: M52N8TDxss= 11159 + INTEGER(IntKi), PARAMETER :: M52N9TDxss= 11160 + INTEGER(IntKi), PARAMETER :: M53N1TDxss= 11161 + INTEGER(IntKi), PARAMETER :: M53N2TDxss= 11162 + INTEGER(IntKi), PARAMETER :: M53N3TDxss= 11163 + INTEGER(IntKi), PARAMETER :: M53N4TDxss= 11164 + INTEGER(IntKi), PARAMETER :: M53N5TDxss= 11165 + INTEGER(IntKi), PARAMETER :: M53N6TDxss= 11166 + INTEGER(IntKi), PARAMETER :: M53N7TDxss= 11167 + INTEGER(IntKi), PARAMETER :: M53N8TDxss= 11168 + INTEGER(IntKi), PARAMETER :: M53N9TDxss= 11169 + INTEGER(IntKi), PARAMETER :: M54N1TDxss= 11170 + INTEGER(IntKi), PARAMETER :: M54N2TDxss= 11171 + INTEGER(IntKi), PARAMETER :: M54N3TDxss= 11172 + INTEGER(IntKi), PARAMETER :: M54N4TDxss= 11173 + INTEGER(IntKi), PARAMETER :: M54N5TDxss= 11174 + INTEGER(IntKi), PARAMETER :: M54N6TDxss= 11175 + INTEGER(IntKi), PARAMETER :: M54N7TDxss= 11176 + INTEGER(IntKi), PARAMETER :: M54N8TDxss= 11177 + INTEGER(IntKi), PARAMETER :: M54N9TDxss= 11178 + INTEGER(IntKi), PARAMETER :: M55N1TDxss= 11179 + INTEGER(IntKi), PARAMETER :: M55N2TDxss= 11180 + INTEGER(IntKi), PARAMETER :: M55N3TDxss= 11181 + INTEGER(IntKi), PARAMETER :: M55N4TDxss= 11182 + INTEGER(IntKi), PARAMETER :: M55N5TDxss= 11183 + INTEGER(IntKi), PARAMETER :: M55N6TDxss= 11184 + INTEGER(IntKi), PARAMETER :: M55N7TDxss= 11185 + INTEGER(IntKi), PARAMETER :: M55N8TDxss= 11186 + INTEGER(IntKi), PARAMETER :: M55N9TDxss= 11187 + INTEGER(IntKi), PARAMETER :: M56N1TDxss= 11188 + INTEGER(IntKi), PARAMETER :: M56N2TDxss= 11189 + INTEGER(IntKi), PARAMETER :: M56N3TDxss= 11190 + INTEGER(IntKi), PARAMETER :: M56N4TDxss= 11191 + INTEGER(IntKi), PARAMETER :: M56N5TDxss= 11192 + INTEGER(IntKi), PARAMETER :: M56N6TDxss= 11193 + INTEGER(IntKi), PARAMETER :: M56N7TDxss= 11194 + INTEGER(IntKi), PARAMETER :: M56N8TDxss= 11195 + INTEGER(IntKi), PARAMETER :: M56N9TDxss= 11196 + INTEGER(IntKi), PARAMETER :: M57N1TDxss= 11197 + INTEGER(IntKi), PARAMETER :: M57N2TDxss= 11198 + INTEGER(IntKi), PARAMETER :: M57N3TDxss= 11199 + INTEGER(IntKi), PARAMETER :: M57N4TDxss= 11200 + INTEGER(IntKi), PARAMETER :: M57N5TDxss= 11201 + INTEGER(IntKi), PARAMETER :: M57N6TDxss= 11202 + INTEGER(IntKi), PARAMETER :: M57N7TDxss= 11203 + INTEGER(IntKi), PARAMETER :: M57N8TDxss= 11204 + INTEGER(IntKi), PARAMETER :: M57N9TDxss= 11205 + INTEGER(IntKi), PARAMETER :: M58N1TDxss= 11206 + INTEGER(IntKi), PARAMETER :: M58N2TDxss= 11207 + INTEGER(IntKi), PARAMETER :: M58N3TDxss= 11208 + INTEGER(IntKi), PARAMETER :: M58N4TDxss= 11209 + INTEGER(IntKi), PARAMETER :: M58N5TDxss= 11210 + INTEGER(IntKi), PARAMETER :: M58N6TDxss= 11211 + INTEGER(IntKi), PARAMETER :: M58N7TDxss= 11212 + INTEGER(IntKi), PARAMETER :: M58N8TDxss= 11213 + INTEGER(IntKi), PARAMETER :: M58N9TDxss= 11214 + INTEGER(IntKi), PARAMETER :: M59N1TDxss= 11215 + INTEGER(IntKi), PARAMETER :: M59N2TDxss= 11216 + INTEGER(IntKi), PARAMETER :: M59N3TDxss= 11217 + INTEGER(IntKi), PARAMETER :: M59N4TDxss= 11218 + INTEGER(IntKi), PARAMETER :: M59N5TDxss= 11219 + INTEGER(IntKi), PARAMETER :: M59N6TDxss= 11220 + INTEGER(IntKi), PARAMETER :: M59N7TDxss= 11221 + INTEGER(IntKi), PARAMETER :: M59N8TDxss= 11222 + INTEGER(IntKi), PARAMETER :: M59N9TDxss= 11223 + INTEGER(IntKi), PARAMETER :: M60N1TDxss= 11224 + INTEGER(IntKi), PARAMETER :: M60N2TDxss= 11225 + INTEGER(IntKi), PARAMETER :: M60N3TDxss= 11226 + INTEGER(IntKi), PARAMETER :: M60N4TDxss= 11227 + INTEGER(IntKi), PARAMETER :: M60N5TDxss= 11228 + INTEGER(IntKi), PARAMETER :: M60N6TDxss= 11229 + INTEGER(IntKi), PARAMETER :: M60N7TDxss= 11230 + INTEGER(IntKi), PARAMETER :: M60N8TDxss= 11231 + INTEGER(IntKi), PARAMETER :: M60N9TDxss= 11232 + INTEGER(IntKi), PARAMETER :: M61N1TDxss= 11233 + INTEGER(IntKi), PARAMETER :: M61N2TDxss= 11234 + INTEGER(IntKi), PARAMETER :: M61N3TDxss= 11235 + INTEGER(IntKi), PARAMETER :: M61N4TDxss= 11236 + INTEGER(IntKi), PARAMETER :: M61N5TDxss= 11237 + INTEGER(IntKi), PARAMETER :: M61N6TDxss= 11238 + INTEGER(IntKi), PARAMETER :: M61N7TDxss= 11239 + INTEGER(IntKi), PARAMETER :: M61N8TDxss= 11240 + INTEGER(IntKi), PARAMETER :: M61N9TDxss= 11241 + INTEGER(IntKi), PARAMETER :: M62N1TDxss= 11242 + INTEGER(IntKi), PARAMETER :: M62N2TDxss= 11243 + INTEGER(IntKi), PARAMETER :: M62N3TDxss= 11244 + INTEGER(IntKi), PARAMETER :: M62N4TDxss= 11245 + INTEGER(IntKi), PARAMETER :: M62N5TDxss= 11246 + INTEGER(IntKi), PARAMETER :: M62N6TDxss= 11247 + INTEGER(IntKi), PARAMETER :: M62N7TDxss= 11248 + INTEGER(IntKi), PARAMETER :: M62N8TDxss= 11249 + INTEGER(IntKi), PARAMETER :: M62N9TDxss= 11250 + INTEGER(IntKi), PARAMETER :: M63N1TDxss= 11251 + INTEGER(IntKi), PARAMETER :: M63N2TDxss= 11252 + INTEGER(IntKi), PARAMETER :: M63N3TDxss= 11253 + INTEGER(IntKi), PARAMETER :: M63N4TDxss= 11254 + INTEGER(IntKi), PARAMETER :: M63N5TDxss= 11255 + INTEGER(IntKi), PARAMETER :: M63N6TDxss= 11256 + INTEGER(IntKi), PARAMETER :: M63N7TDxss= 11257 + INTEGER(IntKi), PARAMETER :: M63N8TDxss= 11258 + INTEGER(IntKi), PARAMETER :: M63N9TDxss= 11259 + INTEGER(IntKi), PARAMETER :: M64N1TDxss= 11260 + INTEGER(IntKi), PARAMETER :: M64N2TDxss= 11261 + INTEGER(IntKi), PARAMETER :: M64N3TDxss= 11262 + INTEGER(IntKi), PARAMETER :: M64N4TDxss= 11263 + INTEGER(IntKi), PARAMETER :: M64N5TDxss= 11264 + INTEGER(IntKi), PARAMETER :: M64N6TDxss= 11265 + INTEGER(IntKi), PARAMETER :: M64N7TDxss= 11266 + INTEGER(IntKi), PARAMETER :: M64N8TDxss= 11267 + INTEGER(IntKi), PARAMETER :: M64N9TDxss= 11268 + INTEGER(IntKi), PARAMETER :: M65N1TDxss= 11269 + INTEGER(IntKi), PARAMETER :: M65N2TDxss= 11270 + INTEGER(IntKi), PARAMETER :: M65N3TDxss= 11271 + INTEGER(IntKi), PARAMETER :: M65N4TDxss= 11272 + INTEGER(IntKi), PARAMETER :: M65N5TDxss= 11273 + INTEGER(IntKi), PARAMETER :: M65N6TDxss= 11274 + INTEGER(IntKi), PARAMETER :: M65N7TDxss= 11275 + INTEGER(IntKi), PARAMETER :: M65N8TDxss= 11276 + INTEGER(IntKi), PARAMETER :: M65N9TDxss= 11277 + INTEGER(IntKi), PARAMETER :: M66N1TDxss= 11278 + INTEGER(IntKi), PARAMETER :: M66N2TDxss= 11279 + INTEGER(IntKi), PARAMETER :: M66N3TDxss= 11280 + INTEGER(IntKi), PARAMETER :: M66N4TDxss= 11281 + INTEGER(IntKi), PARAMETER :: M66N5TDxss= 11282 + INTEGER(IntKi), PARAMETER :: M66N6TDxss= 11283 + INTEGER(IntKi), PARAMETER :: M66N7TDxss= 11284 + INTEGER(IntKi), PARAMETER :: M66N8TDxss= 11285 + INTEGER(IntKi), PARAMETER :: M66N9TDxss= 11286 + INTEGER(IntKi), PARAMETER :: M67N1TDxss= 11287 + INTEGER(IntKi), PARAMETER :: M67N2TDxss= 11288 + INTEGER(IntKi), PARAMETER :: M67N3TDxss= 11289 + INTEGER(IntKi), PARAMETER :: M67N4TDxss= 11290 + INTEGER(IntKi), PARAMETER :: M67N5TDxss= 11291 + INTEGER(IntKi), PARAMETER :: M67N6TDxss= 11292 + INTEGER(IntKi), PARAMETER :: M67N7TDxss= 11293 + INTEGER(IntKi), PARAMETER :: M67N8TDxss= 11294 + INTEGER(IntKi), PARAMETER :: M67N9TDxss= 11295 + INTEGER(IntKi), PARAMETER :: M68N1TDxss= 11296 + INTEGER(IntKi), PARAMETER :: M68N2TDxss= 11297 + INTEGER(IntKi), PARAMETER :: M68N3TDxss= 11298 + INTEGER(IntKi), PARAMETER :: M68N4TDxss= 11299 + INTEGER(IntKi), PARAMETER :: M68N5TDxss= 11300 + INTEGER(IntKi), PARAMETER :: M68N6TDxss= 11301 + INTEGER(IntKi), PARAMETER :: M68N7TDxss= 11302 + INTEGER(IntKi), PARAMETER :: M68N8TDxss= 11303 + INTEGER(IntKi), PARAMETER :: M68N9TDxss= 11304 + INTEGER(IntKi), PARAMETER :: M69N1TDxss= 11305 + INTEGER(IntKi), PARAMETER :: M69N2TDxss= 11306 + INTEGER(IntKi), PARAMETER :: M69N3TDxss= 11307 + INTEGER(IntKi), PARAMETER :: M69N4TDxss= 11308 + INTEGER(IntKi), PARAMETER :: M69N5TDxss= 11309 + INTEGER(IntKi), PARAMETER :: M69N6TDxss= 11310 + INTEGER(IntKi), PARAMETER :: M69N7TDxss= 11311 + INTEGER(IntKi), PARAMETER :: M69N8TDxss= 11312 + INTEGER(IntKi), PARAMETER :: M69N9TDxss= 11313 + INTEGER(IntKi), PARAMETER :: M70N1TDxss= 11314 + INTEGER(IntKi), PARAMETER :: M70N2TDxss= 11315 + INTEGER(IntKi), PARAMETER :: M70N3TDxss= 11316 + INTEGER(IntKi), PARAMETER :: M70N4TDxss= 11317 + INTEGER(IntKi), PARAMETER :: M70N5TDxss= 11318 + INTEGER(IntKi), PARAMETER :: M70N6TDxss= 11319 + INTEGER(IntKi), PARAMETER :: M70N7TDxss= 11320 + INTEGER(IntKi), PARAMETER :: M70N8TDxss= 11321 + INTEGER(IntKi), PARAMETER :: M70N9TDxss= 11322 + INTEGER(IntKi), PARAMETER :: M71N1TDxss= 11323 + INTEGER(IntKi), PARAMETER :: M71N2TDxss= 11324 + INTEGER(IntKi), PARAMETER :: M71N3TDxss= 11325 + INTEGER(IntKi), PARAMETER :: M71N4TDxss= 11326 + INTEGER(IntKi), PARAMETER :: M71N5TDxss= 11327 + INTEGER(IntKi), PARAMETER :: M71N6TDxss= 11328 + INTEGER(IntKi), PARAMETER :: M71N7TDxss= 11329 + INTEGER(IntKi), PARAMETER :: M71N8TDxss= 11330 + INTEGER(IntKi), PARAMETER :: M71N9TDxss= 11331 + INTEGER(IntKi), PARAMETER :: M72N1TDxss= 11332 + INTEGER(IntKi), PARAMETER :: M72N2TDxss= 11333 + INTEGER(IntKi), PARAMETER :: M72N3TDxss= 11334 + INTEGER(IntKi), PARAMETER :: M72N4TDxss= 11335 + INTEGER(IntKi), PARAMETER :: M72N5TDxss= 11336 + INTEGER(IntKi), PARAMETER :: M72N6TDxss= 11337 + INTEGER(IntKi), PARAMETER :: M72N7TDxss= 11338 + INTEGER(IntKi), PARAMETER :: M72N8TDxss= 11339 + INTEGER(IntKi), PARAMETER :: M72N9TDxss= 11340 + INTEGER(IntKi), PARAMETER :: M73N1TDxss= 11341 + INTEGER(IntKi), PARAMETER :: M73N2TDxss= 11342 + INTEGER(IntKi), PARAMETER :: M73N3TDxss= 11343 + INTEGER(IntKi), PARAMETER :: M73N4TDxss= 11344 + INTEGER(IntKi), PARAMETER :: M73N5TDxss= 11345 + INTEGER(IntKi), PARAMETER :: M73N6TDxss= 11346 + INTEGER(IntKi), PARAMETER :: M73N7TDxss= 11347 + INTEGER(IntKi), PARAMETER :: M73N8TDxss= 11348 + INTEGER(IntKi), PARAMETER :: M73N9TDxss= 11349 + INTEGER(IntKi), PARAMETER :: M74N1TDxss= 11350 + INTEGER(IntKi), PARAMETER :: M74N2TDxss= 11351 + INTEGER(IntKi), PARAMETER :: M74N3TDxss= 11352 + INTEGER(IntKi), PARAMETER :: M74N4TDxss= 11353 + INTEGER(IntKi), PARAMETER :: M74N5TDxss= 11354 + INTEGER(IntKi), PARAMETER :: M74N6TDxss= 11355 + INTEGER(IntKi), PARAMETER :: M74N7TDxss= 11356 + INTEGER(IntKi), PARAMETER :: M74N8TDxss= 11357 + INTEGER(IntKi), PARAMETER :: M74N9TDxss= 11358 + INTEGER(IntKi), PARAMETER :: M75N1TDxss= 11359 + INTEGER(IntKi), PARAMETER :: M75N2TDxss= 11360 + INTEGER(IntKi), PARAMETER :: M75N3TDxss= 11361 + INTEGER(IntKi), PARAMETER :: M75N4TDxss= 11362 + INTEGER(IntKi), PARAMETER :: M75N5TDxss= 11363 + INTEGER(IntKi), PARAMETER :: M75N6TDxss= 11364 + INTEGER(IntKi), PARAMETER :: M75N7TDxss= 11365 + INTEGER(IntKi), PARAMETER :: M75N8TDxss= 11366 + INTEGER(IntKi), PARAMETER :: M75N9TDxss= 11367 + INTEGER(IntKi), PARAMETER :: M76N1TDxss= 11368 + INTEGER(IntKi), PARAMETER :: M76N2TDxss= 11369 + INTEGER(IntKi), PARAMETER :: M76N3TDxss= 11370 + INTEGER(IntKi), PARAMETER :: M76N4TDxss= 11371 + INTEGER(IntKi), PARAMETER :: M76N5TDxss= 11372 + INTEGER(IntKi), PARAMETER :: M76N6TDxss= 11373 + INTEGER(IntKi), PARAMETER :: M76N7TDxss= 11374 + INTEGER(IntKi), PARAMETER :: M76N8TDxss= 11375 + INTEGER(IntKi), PARAMETER :: M76N9TDxss= 11376 + INTEGER(IntKi), PARAMETER :: M77N1TDxss= 11377 + INTEGER(IntKi), PARAMETER :: M77N2TDxss= 11378 + INTEGER(IntKi), PARAMETER :: M77N3TDxss= 11379 + INTEGER(IntKi), PARAMETER :: M77N4TDxss= 11380 + INTEGER(IntKi), PARAMETER :: M77N5TDxss= 11381 + INTEGER(IntKi), PARAMETER :: M77N6TDxss= 11382 + INTEGER(IntKi), PARAMETER :: M77N7TDxss= 11383 + INTEGER(IntKi), PARAMETER :: M77N8TDxss= 11384 + INTEGER(IntKi), PARAMETER :: M77N9TDxss= 11385 + INTEGER(IntKi), PARAMETER :: M78N1TDxss= 11386 + INTEGER(IntKi), PARAMETER :: M78N2TDxss= 11387 + INTEGER(IntKi), PARAMETER :: M78N3TDxss= 11388 + INTEGER(IntKi), PARAMETER :: M78N4TDxss= 11389 + INTEGER(IntKi), PARAMETER :: M78N5TDxss= 11390 + INTEGER(IntKi), PARAMETER :: M78N6TDxss= 11391 + INTEGER(IntKi), PARAMETER :: M78N7TDxss= 11392 + INTEGER(IntKi), PARAMETER :: M78N8TDxss= 11393 + INTEGER(IntKi), PARAMETER :: M78N9TDxss= 11394 + INTEGER(IntKi), PARAMETER :: M79N1TDxss= 11395 + INTEGER(IntKi), PARAMETER :: M79N2TDxss= 11396 + INTEGER(IntKi), PARAMETER :: M79N3TDxss= 11397 + INTEGER(IntKi), PARAMETER :: M79N4TDxss= 11398 + INTEGER(IntKi), PARAMETER :: M79N5TDxss= 11399 + INTEGER(IntKi), PARAMETER :: M79N6TDxss= 11400 + INTEGER(IntKi), PARAMETER :: M79N7TDxss= 11401 + INTEGER(IntKi), PARAMETER :: M79N8TDxss= 11402 + INTEGER(IntKi), PARAMETER :: M79N9TDxss= 11403 + INTEGER(IntKi), PARAMETER :: M80N1TDxss= 11404 + INTEGER(IntKi), PARAMETER :: M80N2TDxss= 11405 + INTEGER(IntKi), PARAMETER :: M80N3TDxss= 11406 + INTEGER(IntKi), PARAMETER :: M80N4TDxss= 11407 + INTEGER(IntKi), PARAMETER :: M80N5TDxss= 11408 + INTEGER(IntKi), PARAMETER :: M80N6TDxss= 11409 + INTEGER(IntKi), PARAMETER :: M80N7TDxss= 11410 + INTEGER(IntKi), PARAMETER :: M80N8TDxss= 11411 + INTEGER(IntKi), PARAMETER :: M80N9TDxss= 11412 + INTEGER(IntKi), PARAMETER :: M81N1TDxss= 11413 + INTEGER(IntKi), PARAMETER :: M81N2TDxss= 11414 + INTEGER(IntKi), PARAMETER :: M81N3TDxss= 11415 + INTEGER(IntKi), PARAMETER :: M81N4TDxss= 11416 + INTEGER(IntKi), PARAMETER :: M81N5TDxss= 11417 + INTEGER(IntKi), PARAMETER :: M81N6TDxss= 11418 + INTEGER(IntKi), PARAMETER :: M81N7TDxss= 11419 + INTEGER(IntKi), PARAMETER :: M81N8TDxss= 11420 + INTEGER(IntKi), PARAMETER :: M81N9TDxss= 11421 + INTEGER(IntKi), PARAMETER :: M82N1TDxss= 11422 + INTEGER(IntKi), PARAMETER :: M82N2TDxss= 11423 + INTEGER(IntKi), PARAMETER :: M82N3TDxss= 11424 + INTEGER(IntKi), PARAMETER :: M82N4TDxss= 11425 + INTEGER(IntKi), PARAMETER :: M82N5TDxss= 11426 + INTEGER(IntKi), PARAMETER :: M82N6TDxss= 11427 + INTEGER(IntKi), PARAMETER :: M82N7TDxss= 11428 + INTEGER(IntKi), PARAMETER :: M82N8TDxss= 11429 + INTEGER(IntKi), PARAMETER :: M82N9TDxss= 11430 + INTEGER(IntKi), PARAMETER :: M83N1TDxss= 11431 + INTEGER(IntKi), PARAMETER :: M83N2TDxss= 11432 + INTEGER(IntKi), PARAMETER :: M83N3TDxss= 11433 + INTEGER(IntKi), PARAMETER :: M83N4TDxss= 11434 + INTEGER(IntKi), PARAMETER :: M83N5TDxss= 11435 + INTEGER(IntKi), PARAMETER :: M83N6TDxss= 11436 + INTEGER(IntKi), PARAMETER :: M83N7TDxss= 11437 + INTEGER(IntKi), PARAMETER :: M83N8TDxss= 11438 + INTEGER(IntKi), PARAMETER :: M83N9TDxss= 11439 + INTEGER(IntKi), PARAMETER :: M84N1TDxss= 11440 + INTEGER(IntKi), PARAMETER :: M84N2TDxss= 11441 + INTEGER(IntKi), PARAMETER :: M84N3TDxss= 11442 + INTEGER(IntKi), PARAMETER :: M84N4TDxss= 11443 + INTEGER(IntKi), PARAMETER :: M84N5TDxss= 11444 + INTEGER(IntKi), PARAMETER :: M84N6TDxss= 11445 + INTEGER(IntKi), PARAMETER :: M84N7TDxss= 11446 + INTEGER(IntKi), PARAMETER :: M84N8TDxss= 11447 + INTEGER(IntKi), PARAMETER :: M84N9TDxss= 11448 + INTEGER(IntKi), PARAMETER :: M85N1TDxss= 11449 + INTEGER(IntKi), PARAMETER :: M85N2TDxss= 11450 + INTEGER(IntKi), PARAMETER :: M85N3TDxss= 11451 + INTEGER(IntKi), PARAMETER :: M85N4TDxss= 11452 + INTEGER(IntKi), PARAMETER :: M85N5TDxss= 11453 + INTEGER(IntKi), PARAMETER :: M85N6TDxss= 11454 + INTEGER(IntKi), PARAMETER :: M85N7TDxss= 11455 + INTEGER(IntKi), PARAMETER :: M85N8TDxss= 11456 + INTEGER(IntKi), PARAMETER :: M85N9TDxss= 11457 + INTEGER(IntKi), PARAMETER :: M86N1TDxss= 11458 + INTEGER(IntKi), PARAMETER :: M86N2TDxss= 11459 + INTEGER(IntKi), PARAMETER :: M86N3TDxss= 11460 + INTEGER(IntKi), PARAMETER :: M86N4TDxss= 11461 + INTEGER(IntKi), PARAMETER :: M86N5TDxss= 11462 + INTEGER(IntKi), PARAMETER :: M86N6TDxss= 11463 + INTEGER(IntKi), PARAMETER :: M86N7TDxss= 11464 + INTEGER(IntKi), PARAMETER :: M86N8TDxss= 11465 + INTEGER(IntKi), PARAMETER :: M86N9TDxss= 11466 + INTEGER(IntKi), PARAMETER :: M87N1TDxss= 11467 + INTEGER(IntKi), PARAMETER :: M87N2TDxss= 11468 + INTEGER(IntKi), PARAMETER :: M87N3TDxss= 11469 + INTEGER(IntKi), PARAMETER :: M87N4TDxss= 11470 + INTEGER(IntKi), PARAMETER :: M87N5TDxss= 11471 + INTEGER(IntKi), PARAMETER :: M87N6TDxss= 11472 + INTEGER(IntKi), PARAMETER :: M87N7TDxss= 11473 + INTEGER(IntKi), PARAMETER :: M87N8TDxss= 11474 + INTEGER(IntKi), PARAMETER :: M87N9TDxss= 11475 + INTEGER(IntKi), PARAMETER :: M88N1TDxss= 11476 + INTEGER(IntKi), PARAMETER :: M88N2TDxss= 11477 + INTEGER(IntKi), PARAMETER :: M88N3TDxss= 11478 + INTEGER(IntKi), PARAMETER :: M88N4TDxss= 11479 + INTEGER(IntKi), PARAMETER :: M88N5TDxss= 11480 + INTEGER(IntKi), PARAMETER :: M88N6TDxss= 11481 + INTEGER(IntKi), PARAMETER :: M88N7TDxss= 11482 + INTEGER(IntKi), PARAMETER :: M88N8TDxss= 11483 + INTEGER(IntKi), PARAMETER :: M88N9TDxss= 11484 + INTEGER(IntKi), PARAMETER :: M89N1TDxss= 11485 + INTEGER(IntKi), PARAMETER :: M89N2TDxss= 11486 + INTEGER(IntKi), PARAMETER :: M89N3TDxss= 11487 + INTEGER(IntKi), PARAMETER :: M89N4TDxss= 11488 + INTEGER(IntKi), PARAMETER :: M89N5TDxss= 11489 + INTEGER(IntKi), PARAMETER :: M89N6TDxss= 11490 + INTEGER(IntKi), PARAMETER :: M89N7TDxss= 11491 + INTEGER(IntKi), PARAMETER :: M89N8TDxss= 11492 + INTEGER(IntKi), PARAMETER :: M89N9TDxss= 11493 + INTEGER(IntKi), PARAMETER :: M90N1TDxss= 11494 + INTEGER(IntKi), PARAMETER :: M90N2TDxss= 11495 + INTEGER(IntKi), PARAMETER :: M90N3TDxss= 11496 + INTEGER(IntKi), PARAMETER :: M90N4TDxss= 11497 + INTEGER(IntKi), PARAMETER :: M90N5TDxss= 11498 + INTEGER(IntKi), PARAMETER :: M90N6TDxss= 11499 + INTEGER(IntKi), PARAMETER :: M90N7TDxss= 11500 + INTEGER(IntKi), PARAMETER :: M90N8TDxss= 11501 + INTEGER(IntKi), PARAMETER :: M90N9TDxss= 11502 + INTEGER(IntKi), PARAMETER :: M91N1TDxss= 11503 + INTEGER(IntKi), PARAMETER :: M91N2TDxss= 11504 + INTEGER(IntKi), PARAMETER :: M91N3TDxss= 11505 + INTEGER(IntKi), PARAMETER :: M91N4TDxss= 11506 + INTEGER(IntKi), PARAMETER :: M91N5TDxss= 11507 + INTEGER(IntKi), PARAMETER :: M91N6TDxss= 11508 + INTEGER(IntKi), PARAMETER :: M91N7TDxss= 11509 + INTEGER(IntKi), PARAMETER :: M91N8TDxss= 11510 + INTEGER(IntKi), PARAMETER :: M91N9TDxss= 11511 + INTEGER(IntKi), PARAMETER :: M92N1TDxss= 11512 + INTEGER(IntKi), PARAMETER :: M92N2TDxss= 11513 + INTEGER(IntKi), PARAMETER :: M92N3TDxss= 11514 + INTEGER(IntKi), PARAMETER :: M92N4TDxss= 11515 + INTEGER(IntKi), PARAMETER :: M92N5TDxss= 11516 + INTEGER(IntKi), PARAMETER :: M92N6TDxss= 11517 + INTEGER(IntKi), PARAMETER :: M92N7TDxss= 11518 + INTEGER(IntKi), PARAMETER :: M92N8TDxss= 11519 + INTEGER(IntKi), PARAMETER :: M92N9TDxss= 11520 + INTEGER(IntKi), PARAMETER :: M93N1TDxss= 11521 + INTEGER(IntKi), PARAMETER :: M93N2TDxss= 11522 + INTEGER(IntKi), PARAMETER :: M93N3TDxss= 11523 + INTEGER(IntKi), PARAMETER :: M93N4TDxss= 11524 + INTEGER(IntKi), PARAMETER :: M93N5TDxss= 11525 + INTEGER(IntKi), PARAMETER :: M93N6TDxss= 11526 + INTEGER(IntKi), PARAMETER :: M93N7TDxss= 11527 + INTEGER(IntKi), PARAMETER :: M93N8TDxss= 11528 + INTEGER(IntKi), PARAMETER :: M93N9TDxss= 11529 + INTEGER(IntKi), PARAMETER :: M94N1TDxss= 11530 + INTEGER(IntKi), PARAMETER :: M94N2TDxss= 11531 + INTEGER(IntKi), PARAMETER :: M94N3TDxss= 11532 + INTEGER(IntKi), PARAMETER :: M94N4TDxss= 11533 + INTEGER(IntKi), PARAMETER :: M94N5TDxss= 11534 + INTEGER(IntKi), PARAMETER :: M94N6TDxss= 11535 + INTEGER(IntKi), PARAMETER :: M94N7TDxss= 11536 + INTEGER(IntKi), PARAMETER :: M94N8TDxss= 11537 + INTEGER(IntKi), PARAMETER :: M94N9TDxss= 11538 + INTEGER(IntKi), PARAMETER :: M95N1TDxss= 11539 + INTEGER(IntKi), PARAMETER :: M95N2TDxss= 11540 + INTEGER(IntKi), PARAMETER :: M95N3TDxss= 11541 + INTEGER(IntKi), PARAMETER :: M95N4TDxss= 11542 + INTEGER(IntKi), PARAMETER :: M95N5TDxss= 11543 + INTEGER(IntKi), PARAMETER :: M95N6TDxss= 11544 + INTEGER(IntKi), PARAMETER :: M95N7TDxss= 11545 + INTEGER(IntKi), PARAMETER :: M95N8TDxss= 11546 + INTEGER(IntKi), PARAMETER :: M95N9TDxss= 11547 + INTEGER(IntKi), PARAMETER :: M96N1TDxss= 11548 + INTEGER(IntKi), PARAMETER :: M96N2TDxss= 11549 + INTEGER(IntKi), PARAMETER :: M96N3TDxss= 11550 + INTEGER(IntKi), PARAMETER :: M96N4TDxss= 11551 + INTEGER(IntKi), PARAMETER :: M96N5TDxss= 11552 + INTEGER(IntKi), PARAMETER :: M96N6TDxss= 11553 + INTEGER(IntKi), PARAMETER :: M96N7TDxss= 11554 + INTEGER(IntKi), PARAMETER :: M96N8TDxss= 11555 + INTEGER(IntKi), PARAMETER :: M96N9TDxss= 11556 + INTEGER(IntKi), PARAMETER :: M97N1TDxss= 11557 + INTEGER(IntKi), PARAMETER :: M97N2TDxss= 11558 + INTEGER(IntKi), PARAMETER :: M97N3TDxss= 11559 + INTEGER(IntKi), PARAMETER :: M97N4TDxss= 11560 + INTEGER(IntKi), PARAMETER :: M97N5TDxss= 11561 + INTEGER(IntKi), PARAMETER :: M97N6TDxss= 11562 + INTEGER(IntKi), PARAMETER :: M97N7TDxss= 11563 + INTEGER(IntKi), PARAMETER :: M97N8TDxss= 11564 + INTEGER(IntKi), PARAMETER :: M97N9TDxss= 11565 + INTEGER(IntKi), PARAMETER :: M98N1TDxss= 11566 + INTEGER(IntKi), PARAMETER :: M98N2TDxss= 11567 + INTEGER(IntKi), PARAMETER :: M98N3TDxss= 11568 + INTEGER(IntKi), PARAMETER :: M98N4TDxss= 11569 + INTEGER(IntKi), PARAMETER :: M98N5TDxss= 11570 + INTEGER(IntKi), PARAMETER :: M98N6TDxss= 11571 + INTEGER(IntKi), PARAMETER :: M98N7TDxss= 11572 + INTEGER(IntKi), PARAMETER :: M98N8TDxss= 11573 + INTEGER(IntKi), PARAMETER :: M98N9TDxss= 11574 + INTEGER(IntKi), PARAMETER :: M99N1TDxss= 11575 + INTEGER(IntKi), PARAMETER :: M99N2TDxss= 11576 + INTEGER(IntKi), PARAMETER :: M99N3TDxss= 11577 + INTEGER(IntKi), PARAMETER :: M99N4TDxss= 11578 + INTEGER(IntKi), PARAMETER :: M99N5TDxss= 11579 + INTEGER(IntKi), PARAMETER :: M99N6TDxss= 11580 + INTEGER(IntKi), PARAMETER :: M99N7TDxss= 11581 + INTEGER(IntKi), PARAMETER :: M99N8TDxss= 11582 + INTEGER(IntKi), PARAMETER :: M99N9TDxss= 11583 + INTEGER(IntKi), PARAMETER :: M01N1TDyss= 11584 + INTEGER(IntKi), PARAMETER :: M01N2TDyss= 11585 + INTEGER(IntKi), PARAMETER :: M01N3TDyss= 11586 + INTEGER(IntKi), PARAMETER :: M01N4TDyss= 11587 + INTEGER(IntKi), PARAMETER :: M01N5TDyss= 11588 + INTEGER(IntKi), PARAMETER :: M01N6TDyss= 11589 + INTEGER(IntKi), PARAMETER :: M01N7TDyss= 11590 + INTEGER(IntKi), PARAMETER :: M01N8TDyss= 11591 + INTEGER(IntKi), PARAMETER :: M01N9TDyss= 11592 + INTEGER(IntKi), PARAMETER :: M02N1TDyss= 11593 + INTEGER(IntKi), PARAMETER :: M02N2TDyss= 11594 + INTEGER(IntKi), PARAMETER :: M02N3TDyss= 11595 + INTEGER(IntKi), PARAMETER :: M02N4TDyss= 11596 + INTEGER(IntKi), PARAMETER :: M02N5TDyss= 11597 + INTEGER(IntKi), PARAMETER :: M02N6TDyss= 11598 + INTEGER(IntKi), PARAMETER :: M02N7TDyss= 11599 + INTEGER(IntKi), PARAMETER :: M02N8TDyss= 11600 + INTEGER(IntKi), PARAMETER :: M02N9TDyss= 11601 + INTEGER(IntKi), PARAMETER :: M03N1TDyss= 11602 + INTEGER(IntKi), PARAMETER :: M03N2TDyss= 11603 + INTEGER(IntKi), PARAMETER :: M03N3TDyss= 11604 + INTEGER(IntKi), PARAMETER :: M03N4TDyss= 11605 + INTEGER(IntKi), PARAMETER :: M03N5TDyss= 11606 + INTEGER(IntKi), PARAMETER :: M03N6TDyss= 11607 + INTEGER(IntKi), PARAMETER :: M03N7TDyss= 11608 + INTEGER(IntKi), PARAMETER :: M03N8TDyss= 11609 + INTEGER(IntKi), PARAMETER :: M03N9TDyss= 11610 + INTEGER(IntKi), PARAMETER :: M04N1TDyss= 11611 + INTEGER(IntKi), PARAMETER :: M04N2TDyss= 11612 + INTEGER(IntKi), PARAMETER :: M04N3TDyss= 11613 + INTEGER(IntKi), PARAMETER :: M04N4TDyss= 11614 + INTEGER(IntKi), PARAMETER :: M04N5TDyss= 11615 + INTEGER(IntKi), PARAMETER :: M04N6TDyss= 11616 + INTEGER(IntKi), PARAMETER :: M04N7TDyss= 11617 + INTEGER(IntKi), PARAMETER :: M04N8TDyss= 11618 + INTEGER(IntKi), PARAMETER :: M04N9TDyss= 11619 + INTEGER(IntKi), PARAMETER :: M05N1TDyss= 11620 + INTEGER(IntKi), PARAMETER :: M05N2TDyss= 11621 + INTEGER(IntKi), PARAMETER :: M05N3TDyss= 11622 + INTEGER(IntKi), PARAMETER :: M05N4TDyss= 11623 + INTEGER(IntKi), PARAMETER :: M05N5TDyss= 11624 + INTEGER(IntKi), PARAMETER :: M05N6TDyss= 11625 + INTEGER(IntKi), PARAMETER :: M05N7TDyss= 11626 + INTEGER(IntKi), PARAMETER :: M05N8TDyss= 11627 + INTEGER(IntKi), PARAMETER :: M05N9TDyss= 11628 + INTEGER(IntKi), PARAMETER :: M06N1TDyss= 11629 + INTEGER(IntKi), PARAMETER :: M06N2TDyss= 11630 + INTEGER(IntKi), PARAMETER :: M06N3TDyss= 11631 + INTEGER(IntKi), PARAMETER :: M06N4TDyss= 11632 + INTEGER(IntKi), PARAMETER :: M06N5TDyss= 11633 + INTEGER(IntKi), PARAMETER :: M06N6TDyss= 11634 + INTEGER(IntKi), PARAMETER :: M06N7TDyss= 11635 + INTEGER(IntKi), PARAMETER :: M06N8TDyss= 11636 + INTEGER(IntKi), PARAMETER :: M06N9TDyss= 11637 + INTEGER(IntKi), PARAMETER :: M07N1TDyss= 11638 + INTEGER(IntKi), PARAMETER :: M07N2TDyss= 11639 + INTEGER(IntKi), PARAMETER :: M07N3TDyss= 11640 + INTEGER(IntKi), PARAMETER :: M07N4TDyss= 11641 + INTEGER(IntKi), PARAMETER :: M07N5TDyss= 11642 + INTEGER(IntKi), PARAMETER :: M07N6TDyss= 11643 + INTEGER(IntKi), PARAMETER :: M07N7TDyss= 11644 + INTEGER(IntKi), PARAMETER :: M07N8TDyss= 11645 + INTEGER(IntKi), PARAMETER :: M07N9TDyss= 11646 + INTEGER(IntKi), PARAMETER :: M08N1TDyss= 11647 + INTEGER(IntKi), PARAMETER :: M08N2TDyss= 11648 + INTEGER(IntKi), PARAMETER :: M08N3TDyss= 11649 + INTEGER(IntKi), PARAMETER :: M08N4TDyss= 11650 + INTEGER(IntKi), PARAMETER :: M08N5TDyss= 11651 + INTEGER(IntKi), PARAMETER :: M08N6TDyss= 11652 + INTEGER(IntKi), PARAMETER :: M08N7TDyss= 11653 + INTEGER(IntKi), PARAMETER :: M08N8TDyss= 11654 + INTEGER(IntKi), PARAMETER :: M08N9TDyss= 11655 + INTEGER(IntKi), PARAMETER :: M09N1TDyss= 11656 + INTEGER(IntKi), PARAMETER :: M09N2TDyss= 11657 + INTEGER(IntKi), PARAMETER :: M09N3TDyss= 11658 + INTEGER(IntKi), PARAMETER :: M09N4TDyss= 11659 + INTEGER(IntKi), PARAMETER :: M09N5TDyss= 11660 + INTEGER(IntKi), PARAMETER :: M09N6TDyss= 11661 + INTEGER(IntKi), PARAMETER :: M09N7TDyss= 11662 + INTEGER(IntKi), PARAMETER :: M09N8TDyss= 11663 + INTEGER(IntKi), PARAMETER :: M09N9TDyss= 11664 + INTEGER(IntKi), PARAMETER :: M10N1TDyss= 11665 + INTEGER(IntKi), PARAMETER :: M10N2TDyss= 11666 + INTEGER(IntKi), PARAMETER :: M10N3TDyss= 11667 + INTEGER(IntKi), PARAMETER :: M10N4TDyss= 11668 + INTEGER(IntKi), PARAMETER :: M10N5TDyss= 11669 + INTEGER(IntKi), PARAMETER :: M10N6TDyss= 11670 + INTEGER(IntKi), PARAMETER :: M10N7TDyss= 11671 + INTEGER(IntKi), PARAMETER :: M10N8TDyss= 11672 + INTEGER(IntKi), PARAMETER :: M10N9TDyss= 11673 + INTEGER(IntKi), PARAMETER :: M11N1TDyss= 11674 + INTEGER(IntKi), PARAMETER :: M11N2TDyss= 11675 + INTEGER(IntKi), PARAMETER :: M11N3TDyss= 11676 + INTEGER(IntKi), PARAMETER :: M11N4TDyss= 11677 + INTEGER(IntKi), PARAMETER :: M11N5TDyss= 11678 + INTEGER(IntKi), PARAMETER :: M11N6TDyss= 11679 + INTEGER(IntKi), PARAMETER :: M11N7TDyss= 11680 + INTEGER(IntKi), PARAMETER :: M11N8TDyss= 11681 + INTEGER(IntKi), PARAMETER :: M11N9TDyss= 11682 + INTEGER(IntKi), PARAMETER :: M12N1TDyss= 11683 + INTEGER(IntKi), PARAMETER :: M12N2TDyss= 11684 + INTEGER(IntKi), PARAMETER :: M12N3TDyss= 11685 + INTEGER(IntKi), PARAMETER :: M12N4TDyss= 11686 + INTEGER(IntKi), PARAMETER :: M12N5TDyss= 11687 + INTEGER(IntKi), PARAMETER :: M12N6TDyss= 11688 + INTEGER(IntKi), PARAMETER :: M12N7TDyss= 11689 + INTEGER(IntKi), PARAMETER :: M12N8TDyss= 11690 + INTEGER(IntKi), PARAMETER :: M12N9TDyss= 11691 + INTEGER(IntKi), PARAMETER :: M13N1TDyss= 11692 + INTEGER(IntKi), PARAMETER :: M13N2TDyss= 11693 + INTEGER(IntKi), PARAMETER :: M13N3TDyss= 11694 + INTEGER(IntKi), PARAMETER :: M13N4TDyss= 11695 + INTEGER(IntKi), PARAMETER :: M13N5TDyss= 11696 + INTEGER(IntKi), PARAMETER :: M13N6TDyss= 11697 + INTEGER(IntKi), PARAMETER :: M13N7TDyss= 11698 + INTEGER(IntKi), PARAMETER :: M13N8TDyss= 11699 + INTEGER(IntKi), PARAMETER :: M13N9TDyss= 11700 + INTEGER(IntKi), PARAMETER :: M14N1TDyss= 11701 + INTEGER(IntKi), PARAMETER :: M14N2TDyss= 11702 + INTEGER(IntKi), PARAMETER :: M14N3TDyss= 11703 + INTEGER(IntKi), PARAMETER :: M14N4TDyss= 11704 + INTEGER(IntKi), PARAMETER :: M14N5TDyss= 11705 + INTEGER(IntKi), PARAMETER :: M14N6TDyss= 11706 + INTEGER(IntKi), PARAMETER :: M14N7TDyss= 11707 + INTEGER(IntKi), PARAMETER :: M14N8TDyss= 11708 + INTEGER(IntKi), PARAMETER :: M14N9TDyss= 11709 + INTEGER(IntKi), PARAMETER :: M15N1TDyss= 11710 + INTEGER(IntKi), PARAMETER :: M15N2TDyss= 11711 + INTEGER(IntKi), PARAMETER :: M15N3TDyss= 11712 + INTEGER(IntKi), PARAMETER :: M15N4TDyss= 11713 + INTEGER(IntKi), PARAMETER :: M15N5TDyss= 11714 + INTEGER(IntKi), PARAMETER :: M15N6TDyss= 11715 + INTEGER(IntKi), PARAMETER :: M15N7TDyss= 11716 + INTEGER(IntKi), PARAMETER :: M15N8TDyss= 11717 + INTEGER(IntKi), PARAMETER :: M15N9TDyss= 11718 + INTEGER(IntKi), PARAMETER :: M16N1TDyss= 11719 + INTEGER(IntKi), PARAMETER :: M16N2TDyss= 11720 + INTEGER(IntKi), PARAMETER :: M16N3TDyss= 11721 + INTEGER(IntKi), PARAMETER :: M16N4TDyss= 11722 + INTEGER(IntKi), PARAMETER :: M16N5TDyss= 11723 + INTEGER(IntKi), PARAMETER :: M16N6TDyss= 11724 + INTEGER(IntKi), PARAMETER :: M16N7TDyss= 11725 + INTEGER(IntKi), PARAMETER :: M16N8TDyss= 11726 + INTEGER(IntKi), PARAMETER :: M16N9TDyss= 11727 + INTEGER(IntKi), PARAMETER :: M17N1TDyss= 11728 + INTEGER(IntKi), PARAMETER :: M17N2TDyss= 11729 + INTEGER(IntKi), PARAMETER :: M17N3TDyss= 11730 + INTEGER(IntKi), PARAMETER :: M17N4TDyss= 11731 + INTEGER(IntKi), PARAMETER :: M17N5TDyss= 11732 + INTEGER(IntKi), PARAMETER :: M17N6TDyss= 11733 + INTEGER(IntKi), PARAMETER :: M17N7TDyss= 11734 + INTEGER(IntKi), PARAMETER :: M17N8TDyss= 11735 + INTEGER(IntKi), PARAMETER :: M17N9TDyss= 11736 + INTEGER(IntKi), PARAMETER :: M18N1TDyss= 11737 + INTEGER(IntKi), PARAMETER :: M18N2TDyss= 11738 + INTEGER(IntKi), PARAMETER :: M18N3TDyss= 11739 + INTEGER(IntKi), PARAMETER :: M18N4TDyss= 11740 + INTEGER(IntKi), PARAMETER :: M18N5TDyss= 11741 + INTEGER(IntKi), PARAMETER :: M18N6TDyss= 11742 + INTEGER(IntKi), PARAMETER :: M18N7TDyss= 11743 + INTEGER(IntKi), PARAMETER :: M18N8TDyss= 11744 + INTEGER(IntKi), PARAMETER :: M18N9TDyss= 11745 + INTEGER(IntKi), PARAMETER :: M19N1TDyss= 11746 + INTEGER(IntKi), PARAMETER :: M19N2TDyss= 11747 + INTEGER(IntKi), PARAMETER :: M19N3TDyss= 11748 + INTEGER(IntKi), PARAMETER :: M19N4TDyss= 11749 + INTEGER(IntKi), PARAMETER :: M19N5TDyss= 11750 + INTEGER(IntKi), PARAMETER :: M19N6TDyss= 11751 + INTEGER(IntKi), PARAMETER :: M19N7TDyss= 11752 + INTEGER(IntKi), PARAMETER :: M19N8TDyss= 11753 + INTEGER(IntKi), PARAMETER :: M19N9TDyss= 11754 + INTEGER(IntKi), PARAMETER :: M20N1TDyss= 11755 + INTEGER(IntKi), PARAMETER :: M20N2TDyss= 11756 + INTEGER(IntKi), PARAMETER :: M20N3TDyss= 11757 + INTEGER(IntKi), PARAMETER :: M20N4TDyss= 11758 + INTEGER(IntKi), PARAMETER :: M20N5TDyss= 11759 + INTEGER(IntKi), PARAMETER :: M20N6TDyss= 11760 + INTEGER(IntKi), PARAMETER :: M20N7TDyss= 11761 + INTEGER(IntKi), PARAMETER :: M20N8TDyss= 11762 + INTEGER(IntKi), PARAMETER :: M20N9TDyss= 11763 + INTEGER(IntKi), PARAMETER :: M21N1TDyss= 11764 + INTEGER(IntKi), PARAMETER :: M21N2TDyss= 11765 + INTEGER(IntKi), PARAMETER :: M21N3TDyss= 11766 + INTEGER(IntKi), PARAMETER :: M21N4TDyss= 11767 + INTEGER(IntKi), PARAMETER :: M21N5TDyss= 11768 + INTEGER(IntKi), PARAMETER :: M21N6TDyss= 11769 + INTEGER(IntKi), PARAMETER :: M21N7TDyss= 11770 + INTEGER(IntKi), PARAMETER :: M21N8TDyss= 11771 + INTEGER(IntKi), PARAMETER :: M21N9TDyss= 11772 + INTEGER(IntKi), PARAMETER :: M22N1TDyss= 11773 + INTEGER(IntKi), PARAMETER :: M22N2TDyss= 11774 + INTEGER(IntKi), PARAMETER :: M22N3TDyss= 11775 + INTEGER(IntKi), PARAMETER :: M22N4TDyss= 11776 + INTEGER(IntKi), PARAMETER :: M22N5TDyss= 11777 + INTEGER(IntKi), PARAMETER :: M22N6TDyss= 11778 + INTEGER(IntKi), PARAMETER :: M22N7TDyss= 11779 + INTEGER(IntKi), PARAMETER :: M22N8TDyss= 11780 + INTEGER(IntKi), PARAMETER :: M22N9TDyss= 11781 + INTEGER(IntKi), PARAMETER :: M23N1TDyss= 11782 + INTEGER(IntKi), PARAMETER :: M23N2TDyss= 11783 + INTEGER(IntKi), PARAMETER :: M23N3TDyss= 11784 + INTEGER(IntKi), PARAMETER :: M23N4TDyss= 11785 + INTEGER(IntKi), PARAMETER :: M23N5TDyss= 11786 + INTEGER(IntKi), PARAMETER :: M23N6TDyss= 11787 + INTEGER(IntKi), PARAMETER :: M23N7TDyss= 11788 + INTEGER(IntKi), PARAMETER :: M23N8TDyss= 11789 + INTEGER(IntKi), PARAMETER :: M23N9TDyss= 11790 + INTEGER(IntKi), PARAMETER :: M24N1TDyss= 11791 + INTEGER(IntKi), PARAMETER :: M24N2TDyss= 11792 + INTEGER(IntKi), PARAMETER :: M24N3TDyss= 11793 + INTEGER(IntKi), PARAMETER :: M24N4TDyss= 11794 + INTEGER(IntKi), PARAMETER :: M24N5TDyss= 11795 + INTEGER(IntKi), PARAMETER :: M24N6TDyss= 11796 + INTEGER(IntKi), PARAMETER :: M24N7TDyss= 11797 + INTEGER(IntKi), PARAMETER :: M24N8TDyss= 11798 + INTEGER(IntKi), PARAMETER :: M24N9TDyss= 11799 + INTEGER(IntKi), PARAMETER :: M25N1TDyss= 11800 + INTEGER(IntKi), PARAMETER :: M25N2TDyss= 11801 + INTEGER(IntKi), PARAMETER :: M25N3TDyss= 11802 + INTEGER(IntKi), PARAMETER :: M25N4TDyss= 11803 + INTEGER(IntKi), PARAMETER :: M25N5TDyss= 11804 + INTEGER(IntKi), PARAMETER :: M25N6TDyss= 11805 + INTEGER(IntKi), PARAMETER :: M25N7TDyss= 11806 + INTEGER(IntKi), PARAMETER :: M25N8TDyss= 11807 + INTEGER(IntKi), PARAMETER :: M25N9TDyss= 11808 + INTEGER(IntKi), PARAMETER :: M26N1TDyss= 11809 + INTEGER(IntKi), PARAMETER :: M26N2TDyss= 11810 + INTEGER(IntKi), PARAMETER :: M26N3TDyss= 11811 + INTEGER(IntKi), PARAMETER :: M26N4TDyss= 11812 + INTEGER(IntKi), PARAMETER :: M26N5TDyss= 11813 + INTEGER(IntKi), PARAMETER :: M26N6TDyss= 11814 + INTEGER(IntKi), PARAMETER :: M26N7TDyss= 11815 + INTEGER(IntKi), PARAMETER :: M26N8TDyss= 11816 + INTEGER(IntKi), PARAMETER :: M26N9TDyss= 11817 + INTEGER(IntKi), PARAMETER :: M27N1TDyss= 11818 + INTEGER(IntKi), PARAMETER :: M27N2TDyss= 11819 + INTEGER(IntKi), PARAMETER :: M27N3TDyss= 11820 + INTEGER(IntKi), PARAMETER :: M27N4TDyss= 11821 + INTEGER(IntKi), PARAMETER :: M27N5TDyss= 11822 + INTEGER(IntKi), PARAMETER :: M27N6TDyss= 11823 + INTEGER(IntKi), PARAMETER :: M27N7TDyss= 11824 + INTEGER(IntKi), PARAMETER :: M27N8TDyss= 11825 + INTEGER(IntKi), PARAMETER :: M27N9TDyss= 11826 + INTEGER(IntKi), PARAMETER :: M28N1TDyss= 11827 + INTEGER(IntKi), PARAMETER :: M28N2TDyss= 11828 + INTEGER(IntKi), PARAMETER :: M28N3TDyss= 11829 + INTEGER(IntKi), PARAMETER :: M28N4TDyss= 11830 + INTEGER(IntKi), PARAMETER :: M28N5TDyss= 11831 + INTEGER(IntKi), PARAMETER :: M28N6TDyss= 11832 + INTEGER(IntKi), PARAMETER :: M28N7TDyss= 11833 + INTEGER(IntKi), PARAMETER :: M28N8TDyss= 11834 + INTEGER(IntKi), PARAMETER :: M28N9TDyss= 11835 + INTEGER(IntKi), PARAMETER :: M29N1TDyss= 11836 + INTEGER(IntKi), PARAMETER :: M29N2TDyss= 11837 + INTEGER(IntKi), PARAMETER :: M29N3TDyss= 11838 + INTEGER(IntKi), PARAMETER :: M29N4TDyss= 11839 + INTEGER(IntKi), PARAMETER :: M29N5TDyss= 11840 + INTEGER(IntKi), PARAMETER :: M29N6TDyss= 11841 + INTEGER(IntKi), PARAMETER :: M29N7TDyss= 11842 + INTEGER(IntKi), PARAMETER :: M29N8TDyss= 11843 + INTEGER(IntKi), PARAMETER :: M29N9TDyss= 11844 + INTEGER(IntKi), PARAMETER :: M30N1TDyss= 11845 + INTEGER(IntKi), PARAMETER :: M30N2TDyss= 11846 + INTEGER(IntKi), PARAMETER :: M30N3TDyss= 11847 + INTEGER(IntKi), PARAMETER :: M30N4TDyss= 11848 + INTEGER(IntKi), PARAMETER :: M30N5TDyss= 11849 + INTEGER(IntKi), PARAMETER :: M30N6TDyss= 11850 + INTEGER(IntKi), PARAMETER :: M30N7TDyss= 11851 + INTEGER(IntKi), PARAMETER :: M30N8TDyss= 11852 + INTEGER(IntKi), PARAMETER :: M30N9TDyss= 11853 + INTEGER(IntKi), PARAMETER :: M31N1TDyss= 11854 + INTEGER(IntKi), PARAMETER :: M31N2TDyss= 11855 + INTEGER(IntKi), PARAMETER :: M31N3TDyss= 11856 + INTEGER(IntKi), PARAMETER :: M31N4TDyss= 11857 + INTEGER(IntKi), PARAMETER :: M31N5TDyss= 11858 + INTEGER(IntKi), PARAMETER :: M31N6TDyss= 11859 + INTEGER(IntKi), PARAMETER :: M31N7TDyss= 11860 + INTEGER(IntKi), PARAMETER :: M31N8TDyss= 11861 + INTEGER(IntKi), PARAMETER :: M31N9TDyss= 11862 + INTEGER(IntKi), PARAMETER :: M32N1TDyss= 11863 + INTEGER(IntKi), PARAMETER :: M32N2TDyss= 11864 + INTEGER(IntKi), PARAMETER :: M32N3TDyss= 11865 + INTEGER(IntKi), PARAMETER :: M32N4TDyss= 11866 + INTEGER(IntKi), PARAMETER :: M32N5TDyss= 11867 + INTEGER(IntKi), PARAMETER :: M32N6TDyss= 11868 + INTEGER(IntKi), PARAMETER :: M32N7TDyss= 11869 + INTEGER(IntKi), PARAMETER :: M32N8TDyss= 11870 + INTEGER(IntKi), PARAMETER :: M32N9TDyss= 11871 + INTEGER(IntKi), PARAMETER :: M33N1TDyss= 11872 + INTEGER(IntKi), PARAMETER :: M33N2TDyss= 11873 + INTEGER(IntKi), PARAMETER :: M33N3TDyss= 11874 + INTEGER(IntKi), PARAMETER :: M33N4TDyss= 11875 + INTEGER(IntKi), PARAMETER :: M33N5TDyss= 11876 + INTEGER(IntKi), PARAMETER :: M33N6TDyss= 11877 + INTEGER(IntKi), PARAMETER :: M33N7TDyss= 11878 + INTEGER(IntKi), PARAMETER :: M33N8TDyss= 11879 + INTEGER(IntKi), PARAMETER :: M33N9TDyss= 11880 + INTEGER(IntKi), PARAMETER :: M34N1TDyss= 11881 + INTEGER(IntKi), PARAMETER :: M34N2TDyss= 11882 + INTEGER(IntKi), PARAMETER :: M34N3TDyss= 11883 + INTEGER(IntKi), PARAMETER :: M34N4TDyss= 11884 + INTEGER(IntKi), PARAMETER :: M34N5TDyss= 11885 + INTEGER(IntKi), PARAMETER :: M34N6TDyss= 11886 + INTEGER(IntKi), PARAMETER :: M34N7TDyss= 11887 + INTEGER(IntKi), PARAMETER :: M34N8TDyss= 11888 + INTEGER(IntKi), PARAMETER :: M34N9TDyss= 11889 + INTEGER(IntKi), PARAMETER :: M35N1TDyss= 11890 + INTEGER(IntKi), PARAMETER :: M35N2TDyss= 11891 + INTEGER(IntKi), PARAMETER :: M35N3TDyss= 11892 + INTEGER(IntKi), PARAMETER :: M35N4TDyss= 11893 + INTEGER(IntKi), PARAMETER :: M35N5TDyss= 11894 + INTEGER(IntKi), PARAMETER :: M35N6TDyss= 11895 + INTEGER(IntKi), PARAMETER :: M35N7TDyss= 11896 + INTEGER(IntKi), PARAMETER :: M35N8TDyss= 11897 + INTEGER(IntKi), PARAMETER :: M35N9TDyss= 11898 + INTEGER(IntKi), PARAMETER :: M36N1TDyss= 11899 + INTEGER(IntKi), PARAMETER :: M36N2TDyss= 11900 + INTEGER(IntKi), PARAMETER :: M36N3TDyss= 11901 + INTEGER(IntKi), PARAMETER :: M36N4TDyss= 11902 + INTEGER(IntKi), PARAMETER :: M36N5TDyss= 11903 + INTEGER(IntKi), PARAMETER :: M36N6TDyss= 11904 + INTEGER(IntKi), PARAMETER :: M36N7TDyss= 11905 + INTEGER(IntKi), PARAMETER :: M36N8TDyss= 11906 + INTEGER(IntKi), PARAMETER :: M36N9TDyss= 11907 + INTEGER(IntKi), PARAMETER :: M37N1TDyss= 11908 + INTEGER(IntKi), PARAMETER :: M37N2TDyss= 11909 + INTEGER(IntKi), PARAMETER :: M37N3TDyss= 11910 + INTEGER(IntKi), PARAMETER :: M37N4TDyss= 11911 + INTEGER(IntKi), PARAMETER :: M37N5TDyss= 11912 + INTEGER(IntKi), PARAMETER :: M37N6TDyss= 11913 + INTEGER(IntKi), PARAMETER :: M37N7TDyss= 11914 + INTEGER(IntKi), PARAMETER :: M37N8TDyss= 11915 + INTEGER(IntKi), PARAMETER :: M37N9TDyss= 11916 + INTEGER(IntKi), PARAMETER :: M38N1TDyss= 11917 + INTEGER(IntKi), PARAMETER :: M38N2TDyss= 11918 + INTEGER(IntKi), PARAMETER :: M38N3TDyss= 11919 + INTEGER(IntKi), PARAMETER :: M38N4TDyss= 11920 + INTEGER(IntKi), PARAMETER :: M38N5TDyss= 11921 + INTEGER(IntKi), PARAMETER :: M38N6TDyss= 11922 + INTEGER(IntKi), PARAMETER :: M38N7TDyss= 11923 + INTEGER(IntKi), PARAMETER :: M38N8TDyss= 11924 + INTEGER(IntKi), PARAMETER :: M38N9TDyss= 11925 + INTEGER(IntKi), PARAMETER :: M39N1TDyss= 11926 + INTEGER(IntKi), PARAMETER :: M39N2TDyss= 11927 + INTEGER(IntKi), PARAMETER :: M39N3TDyss= 11928 + INTEGER(IntKi), PARAMETER :: M39N4TDyss= 11929 + INTEGER(IntKi), PARAMETER :: M39N5TDyss= 11930 + INTEGER(IntKi), PARAMETER :: M39N6TDyss= 11931 + INTEGER(IntKi), PARAMETER :: M39N7TDyss= 11932 + INTEGER(IntKi), PARAMETER :: M39N8TDyss= 11933 + INTEGER(IntKi), PARAMETER :: M39N9TDyss= 11934 + INTEGER(IntKi), PARAMETER :: M40N1TDyss= 11935 + INTEGER(IntKi), PARAMETER :: M40N2TDyss= 11936 + INTEGER(IntKi), PARAMETER :: M40N3TDyss= 11937 + INTEGER(IntKi), PARAMETER :: M40N4TDyss= 11938 + INTEGER(IntKi), PARAMETER :: M40N5TDyss= 11939 + INTEGER(IntKi), PARAMETER :: M40N6TDyss= 11940 + INTEGER(IntKi), PARAMETER :: M40N7TDyss= 11941 + INTEGER(IntKi), PARAMETER :: M40N8TDyss= 11942 + INTEGER(IntKi), PARAMETER :: M40N9TDyss= 11943 + INTEGER(IntKi), PARAMETER :: M41N1TDyss= 11944 + INTEGER(IntKi), PARAMETER :: M41N2TDyss= 11945 + INTEGER(IntKi), PARAMETER :: M41N3TDyss= 11946 + INTEGER(IntKi), PARAMETER :: M41N4TDyss= 11947 + INTEGER(IntKi), PARAMETER :: M41N5TDyss= 11948 + INTEGER(IntKi), PARAMETER :: M41N6TDyss= 11949 + INTEGER(IntKi), PARAMETER :: M41N7TDyss= 11950 + INTEGER(IntKi), PARAMETER :: M41N8TDyss= 11951 + INTEGER(IntKi), PARAMETER :: M41N9TDyss= 11952 + INTEGER(IntKi), PARAMETER :: M42N1TDyss= 11953 + INTEGER(IntKi), PARAMETER :: M42N2TDyss= 11954 + INTEGER(IntKi), PARAMETER :: M42N3TDyss= 11955 + INTEGER(IntKi), PARAMETER :: M42N4TDyss= 11956 + INTEGER(IntKi), PARAMETER :: M42N5TDyss= 11957 + INTEGER(IntKi), PARAMETER :: M42N6TDyss= 11958 + INTEGER(IntKi), PARAMETER :: M42N7TDyss= 11959 + INTEGER(IntKi), PARAMETER :: M42N8TDyss= 11960 + INTEGER(IntKi), PARAMETER :: M42N9TDyss= 11961 + INTEGER(IntKi), PARAMETER :: M43N1TDyss= 11962 + INTEGER(IntKi), PARAMETER :: M43N2TDyss= 11963 + INTEGER(IntKi), PARAMETER :: M43N3TDyss= 11964 + INTEGER(IntKi), PARAMETER :: M43N4TDyss= 11965 + INTEGER(IntKi), PARAMETER :: M43N5TDyss= 11966 + INTEGER(IntKi), PARAMETER :: M43N6TDyss= 11967 + INTEGER(IntKi), PARAMETER :: M43N7TDyss= 11968 + INTEGER(IntKi), PARAMETER :: M43N8TDyss= 11969 + INTEGER(IntKi), PARAMETER :: M43N9TDyss= 11970 + INTEGER(IntKi), PARAMETER :: M44N1TDyss= 11971 + INTEGER(IntKi), PARAMETER :: M44N2TDyss= 11972 + INTEGER(IntKi), PARAMETER :: M44N3TDyss= 11973 + INTEGER(IntKi), PARAMETER :: M44N4TDyss= 11974 + INTEGER(IntKi), PARAMETER :: M44N5TDyss= 11975 + INTEGER(IntKi), PARAMETER :: M44N6TDyss= 11976 + INTEGER(IntKi), PARAMETER :: M44N7TDyss= 11977 + INTEGER(IntKi), PARAMETER :: M44N8TDyss= 11978 + INTEGER(IntKi), PARAMETER :: M44N9TDyss= 11979 + INTEGER(IntKi), PARAMETER :: M45N1TDyss= 11980 + INTEGER(IntKi), PARAMETER :: M45N2TDyss= 11981 + INTEGER(IntKi), PARAMETER :: M45N3TDyss= 11982 + INTEGER(IntKi), PARAMETER :: M45N4TDyss= 11983 + INTEGER(IntKi), PARAMETER :: M45N5TDyss= 11984 + INTEGER(IntKi), PARAMETER :: M45N6TDyss= 11985 + INTEGER(IntKi), PARAMETER :: M45N7TDyss= 11986 + INTEGER(IntKi), PARAMETER :: M45N8TDyss= 11987 + INTEGER(IntKi), PARAMETER :: M45N9TDyss= 11988 + INTEGER(IntKi), PARAMETER :: M46N1TDyss= 11989 + INTEGER(IntKi), PARAMETER :: M46N2TDyss= 11990 + INTEGER(IntKi), PARAMETER :: M46N3TDyss= 11991 + INTEGER(IntKi), PARAMETER :: M46N4TDyss= 11992 + INTEGER(IntKi), PARAMETER :: M46N5TDyss= 11993 + INTEGER(IntKi), PARAMETER :: M46N6TDyss= 11994 + INTEGER(IntKi), PARAMETER :: M46N7TDyss= 11995 + INTEGER(IntKi), PARAMETER :: M46N8TDyss= 11996 + INTEGER(IntKi), PARAMETER :: M46N9TDyss= 11997 + INTEGER(IntKi), PARAMETER :: M47N1TDyss= 11998 + INTEGER(IntKi), PARAMETER :: M47N2TDyss= 11999 + INTEGER(IntKi), PARAMETER :: M47N3TDyss= 12000 + INTEGER(IntKi), PARAMETER :: M47N4TDyss= 12001 + INTEGER(IntKi), PARAMETER :: M47N5TDyss= 12002 + INTEGER(IntKi), PARAMETER :: M47N6TDyss= 12003 + INTEGER(IntKi), PARAMETER :: M47N7TDyss= 12004 + INTEGER(IntKi), PARAMETER :: M47N8TDyss= 12005 + INTEGER(IntKi), PARAMETER :: M47N9TDyss= 12006 + INTEGER(IntKi), PARAMETER :: M48N1TDyss= 12007 + INTEGER(IntKi), PARAMETER :: M48N2TDyss= 12008 + INTEGER(IntKi), PARAMETER :: M48N3TDyss= 12009 + INTEGER(IntKi), PARAMETER :: M48N4TDyss= 12010 + INTEGER(IntKi), PARAMETER :: M48N5TDyss= 12011 + INTEGER(IntKi), PARAMETER :: M48N6TDyss= 12012 + INTEGER(IntKi), PARAMETER :: M48N7TDyss= 12013 + INTEGER(IntKi), PARAMETER :: M48N8TDyss= 12014 + INTEGER(IntKi), PARAMETER :: M48N9TDyss= 12015 + INTEGER(IntKi), PARAMETER :: M49N1TDyss= 12016 + INTEGER(IntKi), PARAMETER :: M49N2TDyss= 12017 + INTEGER(IntKi), PARAMETER :: M49N3TDyss= 12018 + INTEGER(IntKi), PARAMETER :: M49N4TDyss= 12019 + INTEGER(IntKi), PARAMETER :: M49N5TDyss= 12020 + INTEGER(IntKi), PARAMETER :: M49N6TDyss= 12021 + INTEGER(IntKi), PARAMETER :: M49N7TDyss= 12022 + INTEGER(IntKi), PARAMETER :: M49N8TDyss= 12023 + INTEGER(IntKi), PARAMETER :: M49N9TDyss= 12024 + INTEGER(IntKi), PARAMETER :: M50N1TDyss= 12025 + INTEGER(IntKi), PARAMETER :: M50N2TDyss= 12026 + INTEGER(IntKi), PARAMETER :: M50N3TDyss= 12027 + INTEGER(IntKi), PARAMETER :: M50N4TDyss= 12028 + INTEGER(IntKi), PARAMETER :: M50N5TDyss= 12029 + INTEGER(IntKi), PARAMETER :: M50N6TDyss= 12030 + INTEGER(IntKi), PARAMETER :: M50N7TDyss= 12031 + INTEGER(IntKi), PARAMETER :: M50N8TDyss= 12032 + INTEGER(IntKi), PARAMETER :: M50N9TDyss= 12033 + INTEGER(IntKi), PARAMETER :: M51N1TDyss= 12034 + INTEGER(IntKi), PARAMETER :: M51N2TDyss= 12035 + INTEGER(IntKi), PARAMETER :: M51N3TDyss= 12036 + INTEGER(IntKi), PARAMETER :: M51N4TDyss= 12037 + INTEGER(IntKi), PARAMETER :: M51N5TDyss= 12038 + INTEGER(IntKi), PARAMETER :: M51N6TDyss= 12039 + INTEGER(IntKi), PARAMETER :: M51N7TDyss= 12040 + INTEGER(IntKi), PARAMETER :: M51N8TDyss= 12041 + INTEGER(IntKi), PARAMETER :: M51N9TDyss= 12042 + INTEGER(IntKi), PARAMETER :: M52N1TDyss= 12043 + INTEGER(IntKi), PARAMETER :: M52N2TDyss= 12044 + INTEGER(IntKi), PARAMETER :: M52N3TDyss= 12045 + INTEGER(IntKi), PARAMETER :: M52N4TDyss= 12046 + INTEGER(IntKi), PARAMETER :: M52N5TDyss= 12047 + INTEGER(IntKi), PARAMETER :: M52N6TDyss= 12048 + INTEGER(IntKi), PARAMETER :: M52N7TDyss= 12049 + INTEGER(IntKi), PARAMETER :: M52N8TDyss= 12050 + INTEGER(IntKi), PARAMETER :: M52N9TDyss= 12051 + INTEGER(IntKi), PARAMETER :: M53N1TDyss= 12052 + INTEGER(IntKi), PARAMETER :: M53N2TDyss= 12053 + INTEGER(IntKi), PARAMETER :: M53N3TDyss= 12054 + INTEGER(IntKi), PARAMETER :: M53N4TDyss= 12055 + INTEGER(IntKi), PARAMETER :: M53N5TDyss= 12056 + INTEGER(IntKi), PARAMETER :: M53N6TDyss= 12057 + INTEGER(IntKi), PARAMETER :: M53N7TDyss= 12058 + INTEGER(IntKi), PARAMETER :: M53N8TDyss= 12059 + INTEGER(IntKi), PARAMETER :: M53N9TDyss= 12060 + INTEGER(IntKi), PARAMETER :: M54N1TDyss= 12061 + INTEGER(IntKi), PARAMETER :: M54N2TDyss= 12062 + INTEGER(IntKi), PARAMETER :: M54N3TDyss= 12063 + INTEGER(IntKi), PARAMETER :: M54N4TDyss= 12064 + INTEGER(IntKi), PARAMETER :: M54N5TDyss= 12065 + INTEGER(IntKi), PARAMETER :: M54N6TDyss= 12066 + INTEGER(IntKi), PARAMETER :: M54N7TDyss= 12067 + INTEGER(IntKi), PARAMETER :: M54N8TDyss= 12068 + INTEGER(IntKi), PARAMETER :: M54N9TDyss= 12069 + INTEGER(IntKi), PARAMETER :: M55N1TDyss= 12070 + INTEGER(IntKi), PARAMETER :: M55N2TDyss= 12071 + INTEGER(IntKi), PARAMETER :: M55N3TDyss= 12072 + INTEGER(IntKi), PARAMETER :: M55N4TDyss= 12073 + INTEGER(IntKi), PARAMETER :: M55N5TDyss= 12074 + INTEGER(IntKi), PARAMETER :: M55N6TDyss= 12075 + INTEGER(IntKi), PARAMETER :: M55N7TDyss= 12076 + INTEGER(IntKi), PARAMETER :: M55N8TDyss= 12077 + INTEGER(IntKi), PARAMETER :: M55N9TDyss= 12078 + INTEGER(IntKi), PARAMETER :: M56N1TDyss= 12079 + INTEGER(IntKi), PARAMETER :: M56N2TDyss= 12080 + INTEGER(IntKi), PARAMETER :: M56N3TDyss= 12081 + INTEGER(IntKi), PARAMETER :: M56N4TDyss= 12082 + INTEGER(IntKi), PARAMETER :: M56N5TDyss= 12083 + INTEGER(IntKi), PARAMETER :: M56N6TDyss= 12084 + INTEGER(IntKi), PARAMETER :: M56N7TDyss= 12085 + INTEGER(IntKi), PARAMETER :: M56N8TDyss= 12086 + INTEGER(IntKi), PARAMETER :: M56N9TDyss= 12087 + INTEGER(IntKi), PARAMETER :: M57N1TDyss= 12088 + INTEGER(IntKi), PARAMETER :: M57N2TDyss= 12089 + INTEGER(IntKi), PARAMETER :: M57N3TDyss= 12090 + INTEGER(IntKi), PARAMETER :: M57N4TDyss= 12091 + INTEGER(IntKi), PARAMETER :: M57N5TDyss= 12092 + INTEGER(IntKi), PARAMETER :: M57N6TDyss= 12093 + INTEGER(IntKi), PARAMETER :: M57N7TDyss= 12094 + INTEGER(IntKi), PARAMETER :: M57N8TDyss= 12095 + INTEGER(IntKi), PARAMETER :: M57N9TDyss= 12096 + INTEGER(IntKi), PARAMETER :: M58N1TDyss= 12097 + INTEGER(IntKi), PARAMETER :: M58N2TDyss= 12098 + INTEGER(IntKi), PARAMETER :: M58N3TDyss= 12099 + INTEGER(IntKi), PARAMETER :: M58N4TDyss= 12100 + INTEGER(IntKi), PARAMETER :: M58N5TDyss= 12101 + INTEGER(IntKi), PARAMETER :: M58N6TDyss= 12102 + INTEGER(IntKi), PARAMETER :: M58N7TDyss= 12103 + INTEGER(IntKi), PARAMETER :: M58N8TDyss= 12104 + INTEGER(IntKi), PARAMETER :: M58N9TDyss= 12105 + INTEGER(IntKi), PARAMETER :: M59N1TDyss= 12106 + INTEGER(IntKi), PARAMETER :: M59N2TDyss= 12107 + INTEGER(IntKi), PARAMETER :: M59N3TDyss= 12108 + INTEGER(IntKi), PARAMETER :: M59N4TDyss= 12109 + INTEGER(IntKi), PARAMETER :: M59N5TDyss= 12110 + INTEGER(IntKi), PARAMETER :: M59N6TDyss= 12111 + INTEGER(IntKi), PARAMETER :: M59N7TDyss= 12112 + INTEGER(IntKi), PARAMETER :: M59N8TDyss= 12113 + INTEGER(IntKi), PARAMETER :: M59N9TDyss= 12114 + INTEGER(IntKi), PARAMETER :: M60N1TDyss= 12115 + INTEGER(IntKi), PARAMETER :: M60N2TDyss= 12116 + INTEGER(IntKi), PARAMETER :: M60N3TDyss= 12117 + INTEGER(IntKi), PARAMETER :: M60N4TDyss= 12118 + INTEGER(IntKi), PARAMETER :: M60N5TDyss= 12119 + INTEGER(IntKi), PARAMETER :: M60N6TDyss= 12120 + INTEGER(IntKi), PARAMETER :: M60N7TDyss= 12121 + INTEGER(IntKi), PARAMETER :: M60N8TDyss= 12122 + INTEGER(IntKi), PARAMETER :: M60N9TDyss= 12123 + INTEGER(IntKi), PARAMETER :: M61N1TDyss= 12124 + INTEGER(IntKi), PARAMETER :: M61N2TDyss= 12125 + INTEGER(IntKi), PARAMETER :: M61N3TDyss= 12126 + INTEGER(IntKi), PARAMETER :: M61N4TDyss= 12127 + INTEGER(IntKi), PARAMETER :: M61N5TDyss= 12128 + INTEGER(IntKi), PARAMETER :: M61N6TDyss= 12129 + INTEGER(IntKi), PARAMETER :: M61N7TDyss= 12130 + INTEGER(IntKi), PARAMETER :: M61N8TDyss= 12131 + INTEGER(IntKi), PARAMETER :: M61N9TDyss= 12132 + INTEGER(IntKi), PARAMETER :: M62N1TDyss= 12133 + INTEGER(IntKi), PARAMETER :: M62N2TDyss= 12134 + INTEGER(IntKi), PARAMETER :: M62N3TDyss= 12135 + INTEGER(IntKi), PARAMETER :: M62N4TDyss= 12136 + INTEGER(IntKi), PARAMETER :: M62N5TDyss= 12137 + INTEGER(IntKi), PARAMETER :: M62N6TDyss= 12138 + INTEGER(IntKi), PARAMETER :: M62N7TDyss= 12139 + INTEGER(IntKi), PARAMETER :: M62N8TDyss= 12140 + INTEGER(IntKi), PARAMETER :: M62N9TDyss= 12141 + INTEGER(IntKi), PARAMETER :: M63N1TDyss= 12142 + INTEGER(IntKi), PARAMETER :: M63N2TDyss= 12143 + INTEGER(IntKi), PARAMETER :: M63N3TDyss= 12144 + INTEGER(IntKi), PARAMETER :: M63N4TDyss= 12145 + INTEGER(IntKi), PARAMETER :: M63N5TDyss= 12146 + INTEGER(IntKi), PARAMETER :: M63N6TDyss= 12147 + INTEGER(IntKi), PARAMETER :: M63N7TDyss= 12148 + INTEGER(IntKi), PARAMETER :: M63N8TDyss= 12149 + INTEGER(IntKi), PARAMETER :: M63N9TDyss= 12150 + INTEGER(IntKi), PARAMETER :: M64N1TDyss= 12151 + INTEGER(IntKi), PARAMETER :: M64N2TDyss= 12152 + INTEGER(IntKi), PARAMETER :: M64N3TDyss= 12153 + INTEGER(IntKi), PARAMETER :: M64N4TDyss= 12154 + INTEGER(IntKi), PARAMETER :: M64N5TDyss= 12155 + INTEGER(IntKi), PARAMETER :: M64N6TDyss= 12156 + INTEGER(IntKi), PARAMETER :: M64N7TDyss= 12157 + INTEGER(IntKi), PARAMETER :: M64N8TDyss= 12158 + INTEGER(IntKi), PARAMETER :: M64N9TDyss= 12159 + INTEGER(IntKi), PARAMETER :: M65N1TDyss= 12160 + INTEGER(IntKi), PARAMETER :: M65N2TDyss= 12161 + INTEGER(IntKi), PARAMETER :: M65N3TDyss= 12162 + INTEGER(IntKi), PARAMETER :: M65N4TDyss= 12163 + INTEGER(IntKi), PARAMETER :: M65N5TDyss= 12164 + INTEGER(IntKi), PARAMETER :: M65N6TDyss= 12165 + INTEGER(IntKi), PARAMETER :: M65N7TDyss= 12166 + INTEGER(IntKi), PARAMETER :: M65N8TDyss= 12167 + INTEGER(IntKi), PARAMETER :: M65N9TDyss= 12168 + INTEGER(IntKi), PARAMETER :: M66N1TDyss= 12169 + INTEGER(IntKi), PARAMETER :: M66N2TDyss= 12170 + INTEGER(IntKi), PARAMETER :: M66N3TDyss= 12171 + INTEGER(IntKi), PARAMETER :: M66N4TDyss= 12172 + INTEGER(IntKi), PARAMETER :: M66N5TDyss= 12173 + INTEGER(IntKi), PARAMETER :: M66N6TDyss= 12174 + INTEGER(IntKi), PARAMETER :: M66N7TDyss= 12175 + INTEGER(IntKi), PARAMETER :: M66N8TDyss= 12176 + INTEGER(IntKi), PARAMETER :: M66N9TDyss= 12177 + INTEGER(IntKi), PARAMETER :: M67N1TDyss= 12178 + INTEGER(IntKi), PARAMETER :: M67N2TDyss= 12179 + INTEGER(IntKi), PARAMETER :: M67N3TDyss= 12180 + INTEGER(IntKi), PARAMETER :: M67N4TDyss= 12181 + INTEGER(IntKi), PARAMETER :: M67N5TDyss= 12182 + INTEGER(IntKi), PARAMETER :: M67N6TDyss= 12183 + INTEGER(IntKi), PARAMETER :: M67N7TDyss= 12184 + INTEGER(IntKi), PARAMETER :: M67N8TDyss= 12185 + INTEGER(IntKi), PARAMETER :: M67N9TDyss= 12186 + INTEGER(IntKi), PARAMETER :: M68N1TDyss= 12187 + INTEGER(IntKi), PARAMETER :: M68N2TDyss= 12188 + INTEGER(IntKi), PARAMETER :: M68N3TDyss= 12189 + INTEGER(IntKi), PARAMETER :: M68N4TDyss= 12190 + INTEGER(IntKi), PARAMETER :: M68N5TDyss= 12191 + INTEGER(IntKi), PARAMETER :: M68N6TDyss= 12192 + INTEGER(IntKi), PARAMETER :: M68N7TDyss= 12193 + INTEGER(IntKi), PARAMETER :: M68N8TDyss= 12194 + INTEGER(IntKi), PARAMETER :: M68N9TDyss= 12195 + INTEGER(IntKi), PARAMETER :: M69N1TDyss= 12196 + INTEGER(IntKi), PARAMETER :: M69N2TDyss= 12197 + INTEGER(IntKi), PARAMETER :: M69N3TDyss= 12198 + INTEGER(IntKi), PARAMETER :: M69N4TDyss= 12199 + INTEGER(IntKi), PARAMETER :: M69N5TDyss= 12200 + INTEGER(IntKi), PARAMETER :: M69N6TDyss= 12201 + INTEGER(IntKi), PARAMETER :: M69N7TDyss= 12202 + INTEGER(IntKi), PARAMETER :: M69N8TDyss= 12203 + INTEGER(IntKi), PARAMETER :: M69N9TDyss= 12204 + INTEGER(IntKi), PARAMETER :: M70N1TDyss= 12205 + INTEGER(IntKi), PARAMETER :: M70N2TDyss= 12206 + INTEGER(IntKi), PARAMETER :: M70N3TDyss= 12207 + INTEGER(IntKi), PARAMETER :: M70N4TDyss= 12208 + INTEGER(IntKi), PARAMETER :: M70N5TDyss= 12209 + INTEGER(IntKi), PARAMETER :: M70N6TDyss= 12210 + INTEGER(IntKi), PARAMETER :: M70N7TDyss= 12211 + INTEGER(IntKi), PARAMETER :: M70N8TDyss= 12212 + INTEGER(IntKi), PARAMETER :: M70N9TDyss= 12213 + INTEGER(IntKi), PARAMETER :: M71N1TDyss= 12214 + INTEGER(IntKi), PARAMETER :: M71N2TDyss= 12215 + INTEGER(IntKi), PARAMETER :: M71N3TDyss= 12216 + INTEGER(IntKi), PARAMETER :: M71N4TDyss= 12217 + INTEGER(IntKi), PARAMETER :: M71N5TDyss= 12218 + INTEGER(IntKi), PARAMETER :: M71N6TDyss= 12219 + INTEGER(IntKi), PARAMETER :: M71N7TDyss= 12220 + INTEGER(IntKi), PARAMETER :: M71N8TDyss= 12221 + INTEGER(IntKi), PARAMETER :: M71N9TDyss= 12222 + INTEGER(IntKi), PARAMETER :: M72N1TDyss= 12223 + INTEGER(IntKi), PARAMETER :: M72N2TDyss= 12224 + INTEGER(IntKi), PARAMETER :: M72N3TDyss= 12225 + INTEGER(IntKi), PARAMETER :: M72N4TDyss= 12226 + INTEGER(IntKi), PARAMETER :: M72N5TDyss= 12227 + INTEGER(IntKi), PARAMETER :: M72N6TDyss= 12228 + INTEGER(IntKi), PARAMETER :: M72N7TDyss= 12229 + INTEGER(IntKi), PARAMETER :: M72N8TDyss= 12230 + INTEGER(IntKi), PARAMETER :: M72N9TDyss= 12231 + INTEGER(IntKi), PARAMETER :: M73N1TDyss= 12232 + INTEGER(IntKi), PARAMETER :: M73N2TDyss= 12233 + INTEGER(IntKi), PARAMETER :: M73N3TDyss= 12234 + INTEGER(IntKi), PARAMETER :: M73N4TDyss= 12235 + INTEGER(IntKi), PARAMETER :: M73N5TDyss= 12236 + INTEGER(IntKi), PARAMETER :: M73N6TDyss= 12237 + INTEGER(IntKi), PARAMETER :: M73N7TDyss= 12238 + INTEGER(IntKi), PARAMETER :: M73N8TDyss= 12239 + INTEGER(IntKi), PARAMETER :: M73N9TDyss= 12240 + INTEGER(IntKi), PARAMETER :: M74N1TDyss= 12241 + INTEGER(IntKi), PARAMETER :: M74N2TDyss= 12242 + INTEGER(IntKi), PARAMETER :: M74N3TDyss= 12243 + INTEGER(IntKi), PARAMETER :: M74N4TDyss= 12244 + INTEGER(IntKi), PARAMETER :: M74N5TDyss= 12245 + INTEGER(IntKi), PARAMETER :: M74N6TDyss= 12246 + INTEGER(IntKi), PARAMETER :: M74N7TDyss= 12247 + INTEGER(IntKi), PARAMETER :: M74N8TDyss= 12248 + INTEGER(IntKi), PARAMETER :: M74N9TDyss= 12249 + INTEGER(IntKi), PARAMETER :: M75N1TDyss= 12250 + INTEGER(IntKi), PARAMETER :: M75N2TDyss= 12251 + INTEGER(IntKi), PARAMETER :: M75N3TDyss= 12252 + INTEGER(IntKi), PARAMETER :: M75N4TDyss= 12253 + INTEGER(IntKi), PARAMETER :: M75N5TDyss= 12254 + INTEGER(IntKi), PARAMETER :: M75N6TDyss= 12255 + INTEGER(IntKi), PARAMETER :: M75N7TDyss= 12256 + INTEGER(IntKi), PARAMETER :: M75N8TDyss= 12257 + INTEGER(IntKi), PARAMETER :: M75N9TDyss= 12258 + INTEGER(IntKi), PARAMETER :: M76N1TDyss= 12259 + INTEGER(IntKi), PARAMETER :: M76N2TDyss= 12260 + INTEGER(IntKi), PARAMETER :: M76N3TDyss= 12261 + INTEGER(IntKi), PARAMETER :: M76N4TDyss= 12262 + INTEGER(IntKi), PARAMETER :: M76N5TDyss= 12263 + INTEGER(IntKi), PARAMETER :: M76N6TDyss= 12264 + INTEGER(IntKi), PARAMETER :: M76N7TDyss= 12265 + INTEGER(IntKi), PARAMETER :: M76N8TDyss= 12266 + INTEGER(IntKi), PARAMETER :: M76N9TDyss= 12267 + INTEGER(IntKi), PARAMETER :: M77N1TDyss= 12268 + INTEGER(IntKi), PARAMETER :: M77N2TDyss= 12269 + INTEGER(IntKi), PARAMETER :: M77N3TDyss= 12270 + INTEGER(IntKi), PARAMETER :: M77N4TDyss= 12271 + INTEGER(IntKi), PARAMETER :: M77N5TDyss= 12272 + INTEGER(IntKi), PARAMETER :: M77N6TDyss= 12273 + INTEGER(IntKi), PARAMETER :: M77N7TDyss= 12274 + INTEGER(IntKi), PARAMETER :: M77N8TDyss= 12275 + INTEGER(IntKi), PARAMETER :: M77N9TDyss= 12276 + INTEGER(IntKi), PARAMETER :: M78N1TDyss= 12277 + INTEGER(IntKi), PARAMETER :: M78N2TDyss= 12278 + INTEGER(IntKi), PARAMETER :: M78N3TDyss= 12279 + INTEGER(IntKi), PARAMETER :: M78N4TDyss= 12280 + INTEGER(IntKi), PARAMETER :: M78N5TDyss= 12281 + INTEGER(IntKi), PARAMETER :: M78N6TDyss= 12282 + INTEGER(IntKi), PARAMETER :: M78N7TDyss= 12283 + INTEGER(IntKi), PARAMETER :: M78N8TDyss= 12284 + INTEGER(IntKi), PARAMETER :: M78N9TDyss= 12285 + INTEGER(IntKi), PARAMETER :: M79N1TDyss= 12286 + INTEGER(IntKi), PARAMETER :: M79N2TDyss= 12287 + INTEGER(IntKi), PARAMETER :: M79N3TDyss= 12288 + INTEGER(IntKi), PARAMETER :: M79N4TDyss= 12289 + INTEGER(IntKi), PARAMETER :: M79N5TDyss= 12290 + INTEGER(IntKi), PARAMETER :: M79N6TDyss= 12291 + INTEGER(IntKi), PARAMETER :: M79N7TDyss= 12292 + INTEGER(IntKi), PARAMETER :: M79N8TDyss= 12293 + INTEGER(IntKi), PARAMETER :: M79N9TDyss= 12294 + INTEGER(IntKi), PARAMETER :: M80N1TDyss= 12295 + INTEGER(IntKi), PARAMETER :: M80N2TDyss= 12296 + INTEGER(IntKi), PARAMETER :: M80N3TDyss= 12297 + INTEGER(IntKi), PARAMETER :: M80N4TDyss= 12298 + INTEGER(IntKi), PARAMETER :: M80N5TDyss= 12299 + INTEGER(IntKi), PARAMETER :: M80N6TDyss= 12300 + INTEGER(IntKi), PARAMETER :: M80N7TDyss= 12301 + INTEGER(IntKi), PARAMETER :: M80N8TDyss= 12302 + INTEGER(IntKi), PARAMETER :: M80N9TDyss= 12303 + INTEGER(IntKi), PARAMETER :: M81N1TDyss= 12304 + INTEGER(IntKi), PARAMETER :: M81N2TDyss= 12305 + INTEGER(IntKi), PARAMETER :: M81N3TDyss= 12306 + INTEGER(IntKi), PARAMETER :: M81N4TDyss= 12307 + INTEGER(IntKi), PARAMETER :: M81N5TDyss= 12308 + INTEGER(IntKi), PARAMETER :: M81N6TDyss= 12309 + INTEGER(IntKi), PARAMETER :: M81N7TDyss= 12310 + INTEGER(IntKi), PARAMETER :: M81N8TDyss= 12311 + INTEGER(IntKi), PARAMETER :: M81N9TDyss= 12312 + INTEGER(IntKi), PARAMETER :: M82N1TDyss= 12313 + INTEGER(IntKi), PARAMETER :: M82N2TDyss= 12314 + INTEGER(IntKi), PARAMETER :: M82N3TDyss= 12315 + INTEGER(IntKi), PARAMETER :: M82N4TDyss= 12316 + INTEGER(IntKi), PARAMETER :: M82N5TDyss= 12317 + INTEGER(IntKi), PARAMETER :: M82N6TDyss= 12318 + INTEGER(IntKi), PARAMETER :: M82N7TDyss= 12319 + INTEGER(IntKi), PARAMETER :: M82N8TDyss= 12320 + INTEGER(IntKi), PARAMETER :: M82N9TDyss= 12321 + INTEGER(IntKi), PARAMETER :: M83N1TDyss= 12322 + INTEGER(IntKi), PARAMETER :: M83N2TDyss= 12323 + INTEGER(IntKi), PARAMETER :: M83N3TDyss= 12324 + INTEGER(IntKi), PARAMETER :: M83N4TDyss= 12325 + INTEGER(IntKi), PARAMETER :: M83N5TDyss= 12326 + INTEGER(IntKi), PARAMETER :: M83N6TDyss= 12327 + INTEGER(IntKi), PARAMETER :: M83N7TDyss= 12328 + INTEGER(IntKi), PARAMETER :: M83N8TDyss= 12329 + INTEGER(IntKi), PARAMETER :: M83N9TDyss= 12330 + INTEGER(IntKi), PARAMETER :: M84N1TDyss= 12331 + INTEGER(IntKi), PARAMETER :: M84N2TDyss= 12332 + INTEGER(IntKi), PARAMETER :: M84N3TDyss= 12333 + INTEGER(IntKi), PARAMETER :: M84N4TDyss= 12334 + INTEGER(IntKi), PARAMETER :: M84N5TDyss= 12335 + INTEGER(IntKi), PARAMETER :: M84N6TDyss= 12336 + INTEGER(IntKi), PARAMETER :: M84N7TDyss= 12337 + INTEGER(IntKi), PARAMETER :: M84N8TDyss= 12338 + INTEGER(IntKi), PARAMETER :: M84N9TDyss= 12339 + INTEGER(IntKi), PARAMETER :: M85N1TDyss= 12340 + INTEGER(IntKi), PARAMETER :: M85N2TDyss= 12341 + INTEGER(IntKi), PARAMETER :: M85N3TDyss= 12342 + INTEGER(IntKi), PARAMETER :: M85N4TDyss= 12343 + INTEGER(IntKi), PARAMETER :: M85N5TDyss= 12344 + INTEGER(IntKi), PARAMETER :: M85N6TDyss= 12345 + INTEGER(IntKi), PARAMETER :: M85N7TDyss= 12346 + INTEGER(IntKi), PARAMETER :: M85N8TDyss= 12347 + INTEGER(IntKi), PARAMETER :: M85N9TDyss= 12348 + INTEGER(IntKi), PARAMETER :: M86N1TDyss= 12349 + INTEGER(IntKi), PARAMETER :: M86N2TDyss= 12350 + INTEGER(IntKi), PARAMETER :: M86N3TDyss= 12351 + INTEGER(IntKi), PARAMETER :: M86N4TDyss= 12352 + INTEGER(IntKi), PARAMETER :: M86N5TDyss= 12353 + INTEGER(IntKi), PARAMETER :: M86N6TDyss= 12354 + INTEGER(IntKi), PARAMETER :: M86N7TDyss= 12355 + INTEGER(IntKi), PARAMETER :: M86N8TDyss= 12356 + INTEGER(IntKi), PARAMETER :: M86N9TDyss= 12357 + INTEGER(IntKi), PARAMETER :: M87N1TDyss= 12358 + INTEGER(IntKi), PARAMETER :: M87N2TDyss= 12359 + INTEGER(IntKi), PARAMETER :: M87N3TDyss= 12360 + INTEGER(IntKi), PARAMETER :: M87N4TDyss= 12361 + INTEGER(IntKi), PARAMETER :: M87N5TDyss= 12362 + INTEGER(IntKi), PARAMETER :: M87N6TDyss= 12363 + INTEGER(IntKi), PARAMETER :: M87N7TDyss= 12364 + INTEGER(IntKi), PARAMETER :: M87N8TDyss= 12365 + INTEGER(IntKi), PARAMETER :: M87N9TDyss= 12366 + INTEGER(IntKi), PARAMETER :: M88N1TDyss= 12367 + INTEGER(IntKi), PARAMETER :: M88N2TDyss= 12368 + INTEGER(IntKi), PARAMETER :: M88N3TDyss= 12369 + INTEGER(IntKi), PARAMETER :: M88N4TDyss= 12370 + INTEGER(IntKi), PARAMETER :: M88N5TDyss= 12371 + INTEGER(IntKi), PARAMETER :: M88N6TDyss= 12372 + INTEGER(IntKi), PARAMETER :: M88N7TDyss= 12373 + INTEGER(IntKi), PARAMETER :: M88N8TDyss= 12374 + INTEGER(IntKi), PARAMETER :: M88N9TDyss= 12375 + INTEGER(IntKi), PARAMETER :: M89N1TDyss= 12376 + INTEGER(IntKi), PARAMETER :: M89N2TDyss= 12377 + INTEGER(IntKi), PARAMETER :: M89N3TDyss= 12378 + INTEGER(IntKi), PARAMETER :: M89N4TDyss= 12379 + INTEGER(IntKi), PARAMETER :: M89N5TDyss= 12380 + INTEGER(IntKi), PARAMETER :: M89N6TDyss= 12381 + INTEGER(IntKi), PARAMETER :: M89N7TDyss= 12382 + INTEGER(IntKi), PARAMETER :: M89N8TDyss= 12383 + INTEGER(IntKi), PARAMETER :: M89N9TDyss= 12384 + INTEGER(IntKi), PARAMETER :: M90N1TDyss= 12385 + INTEGER(IntKi), PARAMETER :: M90N2TDyss= 12386 + INTEGER(IntKi), PARAMETER :: M90N3TDyss= 12387 + INTEGER(IntKi), PARAMETER :: M90N4TDyss= 12388 + INTEGER(IntKi), PARAMETER :: M90N5TDyss= 12389 + INTEGER(IntKi), PARAMETER :: M90N6TDyss= 12390 + INTEGER(IntKi), PARAMETER :: M90N7TDyss= 12391 + INTEGER(IntKi), PARAMETER :: M90N8TDyss= 12392 + INTEGER(IntKi), PARAMETER :: M90N9TDyss= 12393 + INTEGER(IntKi), PARAMETER :: M91N1TDyss= 12394 + INTEGER(IntKi), PARAMETER :: M91N2TDyss= 12395 + INTEGER(IntKi), PARAMETER :: M91N3TDyss= 12396 + INTEGER(IntKi), PARAMETER :: M91N4TDyss= 12397 + INTEGER(IntKi), PARAMETER :: M91N5TDyss= 12398 + INTEGER(IntKi), PARAMETER :: M91N6TDyss= 12399 + INTEGER(IntKi), PARAMETER :: M91N7TDyss= 12400 + INTEGER(IntKi), PARAMETER :: M91N8TDyss= 12401 + INTEGER(IntKi), PARAMETER :: M91N9TDyss= 12402 + INTEGER(IntKi), PARAMETER :: M92N1TDyss= 12403 + INTEGER(IntKi), PARAMETER :: M92N2TDyss= 12404 + INTEGER(IntKi), PARAMETER :: M92N3TDyss= 12405 + INTEGER(IntKi), PARAMETER :: M92N4TDyss= 12406 + INTEGER(IntKi), PARAMETER :: M92N5TDyss= 12407 + INTEGER(IntKi), PARAMETER :: M92N6TDyss= 12408 + INTEGER(IntKi), PARAMETER :: M92N7TDyss= 12409 + INTEGER(IntKi), PARAMETER :: M92N8TDyss= 12410 + INTEGER(IntKi), PARAMETER :: M92N9TDyss= 12411 + INTEGER(IntKi), PARAMETER :: M93N1TDyss= 12412 + INTEGER(IntKi), PARAMETER :: M93N2TDyss= 12413 + INTEGER(IntKi), PARAMETER :: M93N3TDyss= 12414 + INTEGER(IntKi), PARAMETER :: M93N4TDyss= 12415 + INTEGER(IntKi), PARAMETER :: M93N5TDyss= 12416 + INTEGER(IntKi), PARAMETER :: M93N6TDyss= 12417 + INTEGER(IntKi), PARAMETER :: M93N7TDyss= 12418 + INTEGER(IntKi), PARAMETER :: M93N8TDyss= 12419 + INTEGER(IntKi), PARAMETER :: M93N9TDyss= 12420 + INTEGER(IntKi), PARAMETER :: M94N1TDyss= 12421 + INTEGER(IntKi), PARAMETER :: M94N2TDyss= 12422 + INTEGER(IntKi), PARAMETER :: M94N3TDyss= 12423 + INTEGER(IntKi), PARAMETER :: M94N4TDyss= 12424 + INTEGER(IntKi), PARAMETER :: M94N5TDyss= 12425 + INTEGER(IntKi), PARAMETER :: M94N6TDyss= 12426 + INTEGER(IntKi), PARAMETER :: M94N7TDyss= 12427 + INTEGER(IntKi), PARAMETER :: M94N8TDyss= 12428 + INTEGER(IntKi), PARAMETER :: M94N9TDyss= 12429 + INTEGER(IntKi), PARAMETER :: M95N1TDyss= 12430 + INTEGER(IntKi), PARAMETER :: M95N2TDyss= 12431 + INTEGER(IntKi), PARAMETER :: M95N3TDyss= 12432 + INTEGER(IntKi), PARAMETER :: M95N4TDyss= 12433 + INTEGER(IntKi), PARAMETER :: M95N5TDyss= 12434 + INTEGER(IntKi), PARAMETER :: M95N6TDyss= 12435 + INTEGER(IntKi), PARAMETER :: M95N7TDyss= 12436 + INTEGER(IntKi), PARAMETER :: M95N8TDyss= 12437 + INTEGER(IntKi), PARAMETER :: M95N9TDyss= 12438 + INTEGER(IntKi), PARAMETER :: M96N1TDyss= 12439 + INTEGER(IntKi), PARAMETER :: M96N2TDyss= 12440 + INTEGER(IntKi), PARAMETER :: M96N3TDyss= 12441 + INTEGER(IntKi), PARAMETER :: M96N4TDyss= 12442 + INTEGER(IntKi), PARAMETER :: M96N5TDyss= 12443 + INTEGER(IntKi), PARAMETER :: M96N6TDyss= 12444 + INTEGER(IntKi), PARAMETER :: M96N7TDyss= 12445 + INTEGER(IntKi), PARAMETER :: M96N8TDyss= 12446 + INTEGER(IntKi), PARAMETER :: M96N9TDyss= 12447 + INTEGER(IntKi), PARAMETER :: M97N1TDyss= 12448 + INTEGER(IntKi), PARAMETER :: M97N2TDyss= 12449 + INTEGER(IntKi), PARAMETER :: M97N3TDyss= 12450 + INTEGER(IntKi), PARAMETER :: M97N4TDyss= 12451 + INTEGER(IntKi), PARAMETER :: M97N5TDyss= 12452 + INTEGER(IntKi), PARAMETER :: M97N6TDyss= 12453 + INTEGER(IntKi), PARAMETER :: M97N7TDyss= 12454 + INTEGER(IntKi), PARAMETER :: M97N8TDyss= 12455 + INTEGER(IntKi), PARAMETER :: M97N9TDyss= 12456 + INTEGER(IntKi), PARAMETER :: M98N1TDyss= 12457 + INTEGER(IntKi), PARAMETER :: M98N2TDyss= 12458 + INTEGER(IntKi), PARAMETER :: M98N3TDyss= 12459 + INTEGER(IntKi), PARAMETER :: M98N4TDyss= 12460 + INTEGER(IntKi), PARAMETER :: M98N5TDyss= 12461 + INTEGER(IntKi), PARAMETER :: M98N6TDyss= 12462 + INTEGER(IntKi), PARAMETER :: M98N7TDyss= 12463 + INTEGER(IntKi), PARAMETER :: M98N8TDyss= 12464 + INTEGER(IntKi), PARAMETER :: M98N9TDyss= 12465 + INTEGER(IntKi), PARAMETER :: M99N1TDyss= 12466 + INTEGER(IntKi), PARAMETER :: M99N2TDyss= 12467 + INTEGER(IntKi), PARAMETER :: M99N3TDyss= 12468 + INTEGER(IntKi), PARAMETER :: M99N4TDyss= 12469 + INTEGER(IntKi), PARAMETER :: M99N5TDyss= 12470 + INTEGER(IntKi), PARAMETER :: M99N6TDyss= 12471 + INTEGER(IntKi), PARAMETER :: M99N7TDyss= 12472 + INTEGER(IntKi), PARAMETER :: M99N8TDyss= 12473 + INTEGER(IntKi), PARAMETER :: M99N9TDyss= 12474 + INTEGER(IntKi), PARAMETER :: M01N1TDzss= 12475 + INTEGER(IntKi), PARAMETER :: M01N2TDzss= 12476 + INTEGER(IntKi), PARAMETER :: M01N3TDzss= 12477 + INTEGER(IntKi), PARAMETER :: M01N4TDzss= 12478 + INTEGER(IntKi), PARAMETER :: M01N5TDzss= 12479 + INTEGER(IntKi), PARAMETER :: M01N6TDzss= 12480 + INTEGER(IntKi), PARAMETER :: M01N7TDzss= 12481 + INTEGER(IntKi), PARAMETER :: M01N8TDzss= 12482 + INTEGER(IntKi), PARAMETER :: M01N9TDzss= 12483 + INTEGER(IntKi), PARAMETER :: M02N1TDzss= 12484 + INTEGER(IntKi), PARAMETER :: M02N2TDzss= 12485 + INTEGER(IntKi), PARAMETER :: M02N3TDzss= 12486 + INTEGER(IntKi), PARAMETER :: M02N4TDzss= 12487 + INTEGER(IntKi), PARAMETER :: M02N5TDzss= 12488 + INTEGER(IntKi), PARAMETER :: M02N6TDzss= 12489 + INTEGER(IntKi), PARAMETER :: M02N7TDzss= 12490 + INTEGER(IntKi), PARAMETER :: M02N8TDzss= 12491 + INTEGER(IntKi), PARAMETER :: M02N9TDzss= 12492 + INTEGER(IntKi), PARAMETER :: M03N1TDzss= 12493 + INTEGER(IntKi), PARAMETER :: M03N2TDzss= 12494 + INTEGER(IntKi), PARAMETER :: M03N3TDzss= 12495 + INTEGER(IntKi), PARAMETER :: M03N4TDzss= 12496 + INTEGER(IntKi), PARAMETER :: M03N5TDzss= 12497 + INTEGER(IntKi), PARAMETER :: M03N6TDzss= 12498 + INTEGER(IntKi), PARAMETER :: M03N7TDzss= 12499 + INTEGER(IntKi), PARAMETER :: M03N8TDzss= 12500 + INTEGER(IntKi), PARAMETER :: M03N9TDzss= 12501 + INTEGER(IntKi), PARAMETER :: M04N1TDzss= 12502 + INTEGER(IntKi), PARAMETER :: M04N2TDzss= 12503 + INTEGER(IntKi), PARAMETER :: M04N3TDzss= 12504 + INTEGER(IntKi), PARAMETER :: M04N4TDzss= 12505 + INTEGER(IntKi), PARAMETER :: M04N5TDzss= 12506 + INTEGER(IntKi), PARAMETER :: M04N6TDzss= 12507 + INTEGER(IntKi), PARAMETER :: M04N7TDzss= 12508 + INTEGER(IntKi), PARAMETER :: M04N8TDzss= 12509 + INTEGER(IntKi), PARAMETER :: M04N9TDzss= 12510 + INTEGER(IntKi), PARAMETER :: M05N1TDzss= 12511 + INTEGER(IntKi), PARAMETER :: M05N2TDzss= 12512 + INTEGER(IntKi), PARAMETER :: M05N3TDzss= 12513 + INTEGER(IntKi), PARAMETER :: M05N4TDzss= 12514 + INTEGER(IntKi), PARAMETER :: M05N5TDzss= 12515 + INTEGER(IntKi), PARAMETER :: M05N6TDzss= 12516 + INTEGER(IntKi), PARAMETER :: M05N7TDzss= 12517 + INTEGER(IntKi), PARAMETER :: M05N8TDzss= 12518 + INTEGER(IntKi), PARAMETER :: M05N9TDzss= 12519 + INTEGER(IntKi), PARAMETER :: M06N1TDzss= 12520 + INTEGER(IntKi), PARAMETER :: M06N2TDzss= 12521 + INTEGER(IntKi), PARAMETER :: M06N3TDzss= 12522 + INTEGER(IntKi), PARAMETER :: M06N4TDzss= 12523 + INTEGER(IntKi), PARAMETER :: M06N5TDzss= 12524 + INTEGER(IntKi), PARAMETER :: M06N6TDzss= 12525 + INTEGER(IntKi), PARAMETER :: M06N7TDzss= 12526 + INTEGER(IntKi), PARAMETER :: M06N8TDzss= 12527 + INTEGER(IntKi), PARAMETER :: M06N9TDzss= 12528 + INTEGER(IntKi), PARAMETER :: M07N1TDzss= 12529 + INTEGER(IntKi), PARAMETER :: M07N2TDzss= 12530 + INTEGER(IntKi), PARAMETER :: M07N3TDzss= 12531 + INTEGER(IntKi), PARAMETER :: M07N4TDzss= 12532 + INTEGER(IntKi), PARAMETER :: M07N5TDzss= 12533 + INTEGER(IntKi), PARAMETER :: M07N6TDzss= 12534 + INTEGER(IntKi), PARAMETER :: M07N7TDzss= 12535 + INTEGER(IntKi), PARAMETER :: M07N8TDzss= 12536 + INTEGER(IntKi), PARAMETER :: M07N9TDzss= 12537 + INTEGER(IntKi), PARAMETER :: M08N1TDzss= 12538 + INTEGER(IntKi), PARAMETER :: M08N2TDzss= 12539 + INTEGER(IntKi), PARAMETER :: M08N3TDzss= 12540 + INTEGER(IntKi), PARAMETER :: M08N4TDzss= 12541 + INTEGER(IntKi), PARAMETER :: M08N5TDzss= 12542 + INTEGER(IntKi), PARAMETER :: M08N6TDzss= 12543 + INTEGER(IntKi), PARAMETER :: M08N7TDzss= 12544 + INTEGER(IntKi), PARAMETER :: M08N8TDzss= 12545 + INTEGER(IntKi), PARAMETER :: M08N9TDzss= 12546 + INTEGER(IntKi), PARAMETER :: M09N1TDzss= 12547 + INTEGER(IntKi), PARAMETER :: M09N2TDzss= 12548 + INTEGER(IntKi), PARAMETER :: M09N3TDzss= 12549 + INTEGER(IntKi), PARAMETER :: M09N4TDzss= 12550 + INTEGER(IntKi), PARAMETER :: M09N5TDzss= 12551 + INTEGER(IntKi), PARAMETER :: M09N6TDzss= 12552 + INTEGER(IntKi), PARAMETER :: M09N7TDzss= 12553 + INTEGER(IntKi), PARAMETER :: M09N8TDzss= 12554 + INTEGER(IntKi), PARAMETER :: M09N9TDzss= 12555 + INTEGER(IntKi), PARAMETER :: M10N1TDzss= 12556 + INTEGER(IntKi), PARAMETER :: M10N2TDzss= 12557 + INTEGER(IntKi), PARAMETER :: M10N3TDzss= 12558 + INTEGER(IntKi), PARAMETER :: M10N4TDzss= 12559 + INTEGER(IntKi), PARAMETER :: M10N5TDzss= 12560 + INTEGER(IntKi), PARAMETER :: M10N6TDzss= 12561 + INTEGER(IntKi), PARAMETER :: M10N7TDzss= 12562 + INTEGER(IntKi), PARAMETER :: M10N8TDzss= 12563 + INTEGER(IntKi), PARAMETER :: M10N9TDzss= 12564 + INTEGER(IntKi), PARAMETER :: M11N1TDzss= 12565 + INTEGER(IntKi), PARAMETER :: M11N2TDzss= 12566 + INTEGER(IntKi), PARAMETER :: M11N3TDzss= 12567 + INTEGER(IntKi), PARAMETER :: M11N4TDzss= 12568 + INTEGER(IntKi), PARAMETER :: M11N5TDzss= 12569 + INTEGER(IntKi), PARAMETER :: M11N6TDzss= 12570 + INTEGER(IntKi), PARAMETER :: M11N7TDzss= 12571 + INTEGER(IntKi), PARAMETER :: M11N8TDzss= 12572 + INTEGER(IntKi), PARAMETER :: M11N9TDzss= 12573 + INTEGER(IntKi), PARAMETER :: M12N1TDzss= 12574 + INTEGER(IntKi), PARAMETER :: M12N2TDzss= 12575 + INTEGER(IntKi), PARAMETER :: M12N3TDzss= 12576 + INTEGER(IntKi), PARAMETER :: M12N4TDzss= 12577 + INTEGER(IntKi), PARAMETER :: M12N5TDzss= 12578 + INTEGER(IntKi), PARAMETER :: M12N6TDzss= 12579 + INTEGER(IntKi), PARAMETER :: M12N7TDzss= 12580 + INTEGER(IntKi), PARAMETER :: M12N8TDzss= 12581 + INTEGER(IntKi), PARAMETER :: M12N9TDzss= 12582 + INTEGER(IntKi), PARAMETER :: M13N1TDzss= 12583 + INTEGER(IntKi), PARAMETER :: M13N2TDzss= 12584 + INTEGER(IntKi), PARAMETER :: M13N3TDzss= 12585 + INTEGER(IntKi), PARAMETER :: M13N4TDzss= 12586 + INTEGER(IntKi), PARAMETER :: M13N5TDzss= 12587 + INTEGER(IntKi), PARAMETER :: M13N6TDzss= 12588 + INTEGER(IntKi), PARAMETER :: M13N7TDzss= 12589 + INTEGER(IntKi), PARAMETER :: M13N8TDzss= 12590 + INTEGER(IntKi), PARAMETER :: M13N9TDzss= 12591 + INTEGER(IntKi), PARAMETER :: M14N1TDzss= 12592 + INTEGER(IntKi), PARAMETER :: M14N2TDzss= 12593 + INTEGER(IntKi), PARAMETER :: M14N3TDzss= 12594 + INTEGER(IntKi), PARAMETER :: M14N4TDzss= 12595 + INTEGER(IntKi), PARAMETER :: M14N5TDzss= 12596 + INTEGER(IntKi), PARAMETER :: M14N6TDzss= 12597 + INTEGER(IntKi), PARAMETER :: M14N7TDzss= 12598 + INTEGER(IntKi), PARAMETER :: M14N8TDzss= 12599 + INTEGER(IntKi), PARAMETER :: M14N9TDzss= 12600 + INTEGER(IntKi), PARAMETER :: M15N1TDzss= 12601 + INTEGER(IntKi), PARAMETER :: M15N2TDzss= 12602 + INTEGER(IntKi), PARAMETER :: M15N3TDzss= 12603 + INTEGER(IntKi), PARAMETER :: M15N4TDzss= 12604 + INTEGER(IntKi), PARAMETER :: M15N5TDzss= 12605 + INTEGER(IntKi), PARAMETER :: M15N6TDzss= 12606 + INTEGER(IntKi), PARAMETER :: M15N7TDzss= 12607 + INTEGER(IntKi), PARAMETER :: M15N8TDzss= 12608 + INTEGER(IntKi), PARAMETER :: M15N9TDzss= 12609 + INTEGER(IntKi), PARAMETER :: M16N1TDzss= 12610 + INTEGER(IntKi), PARAMETER :: M16N2TDzss= 12611 + INTEGER(IntKi), PARAMETER :: M16N3TDzss= 12612 + INTEGER(IntKi), PARAMETER :: M16N4TDzss= 12613 + INTEGER(IntKi), PARAMETER :: M16N5TDzss= 12614 + INTEGER(IntKi), PARAMETER :: M16N6TDzss= 12615 + INTEGER(IntKi), PARAMETER :: M16N7TDzss= 12616 + INTEGER(IntKi), PARAMETER :: M16N8TDzss= 12617 + INTEGER(IntKi), PARAMETER :: M16N9TDzss= 12618 + INTEGER(IntKi), PARAMETER :: M17N1TDzss= 12619 + INTEGER(IntKi), PARAMETER :: M17N2TDzss= 12620 + INTEGER(IntKi), PARAMETER :: M17N3TDzss= 12621 + INTEGER(IntKi), PARAMETER :: M17N4TDzss= 12622 + INTEGER(IntKi), PARAMETER :: M17N5TDzss= 12623 + INTEGER(IntKi), PARAMETER :: M17N6TDzss= 12624 + INTEGER(IntKi), PARAMETER :: M17N7TDzss= 12625 + INTEGER(IntKi), PARAMETER :: M17N8TDzss= 12626 + INTEGER(IntKi), PARAMETER :: M17N9TDzss= 12627 + INTEGER(IntKi), PARAMETER :: M18N1TDzss= 12628 + INTEGER(IntKi), PARAMETER :: M18N2TDzss= 12629 + INTEGER(IntKi), PARAMETER :: M18N3TDzss= 12630 + INTEGER(IntKi), PARAMETER :: M18N4TDzss= 12631 + INTEGER(IntKi), PARAMETER :: M18N5TDzss= 12632 + INTEGER(IntKi), PARAMETER :: M18N6TDzss= 12633 + INTEGER(IntKi), PARAMETER :: M18N7TDzss= 12634 + INTEGER(IntKi), PARAMETER :: M18N8TDzss= 12635 + INTEGER(IntKi), PARAMETER :: M18N9TDzss= 12636 + INTEGER(IntKi), PARAMETER :: M19N1TDzss= 12637 + INTEGER(IntKi), PARAMETER :: M19N2TDzss= 12638 + INTEGER(IntKi), PARAMETER :: M19N3TDzss= 12639 + INTEGER(IntKi), PARAMETER :: M19N4TDzss= 12640 + INTEGER(IntKi), PARAMETER :: M19N5TDzss= 12641 + INTEGER(IntKi), PARAMETER :: M19N6TDzss= 12642 + INTEGER(IntKi), PARAMETER :: M19N7TDzss= 12643 + INTEGER(IntKi), PARAMETER :: M19N8TDzss= 12644 + INTEGER(IntKi), PARAMETER :: M19N9TDzss= 12645 + INTEGER(IntKi), PARAMETER :: M20N1TDzss= 12646 + INTEGER(IntKi), PARAMETER :: M20N2TDzss= 12647 + INTEGER(IntKi), PARAMETER :: M20N3TDzss= 12648 + INTEGER(IntKi), PARAMETER :: M20N4TDzss= 12649 + INTEGER(IntKi), PARAMETER :: M20N5TDzss= 12650 + INTEGER(IntKi), PARAMETER :: M20N6TDzss= 12651 + INTEGER(IntKi), PARAMETER :: M20N7TDzss= 12652 + INTEGER(IntKi), PARAMETER :: M20N8TDzss= 12653 + INTEGER(IntKi), PARAMETER :: M20N9TDzss= 12654 + INTEGER(IntKi), PARAMETER :: M21N1TDzss= 12655 + INTEGER(IntKi), PARAMETER :: M21N2TDzss= 12656 + INTEGER(IntKi), PARAMETER :: M21N3TDzss= 12657 + INTEGER(IntKi), PARAMETER :: M21N4TDzss= 12658 + INTEGER(IntKi), PARAMETER :: M21N5TDzss= 12659 + INTEGER(IntKi), PARAMETER :: M21N6TDzss= 12660 + INTEGER(IntKi), PARAMETER :: M21N7TDzss= 12661 + INTEGER(IntKi), PARAMETER :: M21N8TDzss= 12662 + INTEGER(IntKi), PARAMETER :: M21N9TDzss= 12663 + INTEGER(IntKi), PARAMETER :: M22N1TDzss= 12664 + INTEGER(IntKi), PARAMETER :: M22N2TDzss= 12665 + INTEGER(IntKi), PARAMETER :: M22N3TDzss= 12666 + INTEGER(IntKi), PARAMETER :: M22N4TDzss= 12667 + INTEGER(IntKi), PARAMETER :: M22N5TDzss= 12668 + INTEGER(IntKi), PARAMETER :: M22N6TDzss= 12669 + INTEGER(IntKi), PARAMETER :: M22N7TDzss= 12670 + INTEGER(IntKi), PARAMETER :: M22N8TDzss= 12671 + INTEGER(IntKi), PARAMETER :: M22N9TDzss= 12672 + INTEGER(IntKi), PARAMETER :: M23N1TDzss= 12673 + INTEGER(IntKi), PARAMETER :: M23N2TDzss= 12674 + INTEGER(IntKi), PARAMETER :: M23N3TDzss= 12675 + INTEGER(IntKi), PARAMETER :: M23N4TDzss= 12676 + INTEGER(IntKi), PARAMETER :: M23N5TDzss= 12677 + INTEGER(IntKi), PARAMETER :: M23N6TDzss= 12678 + INTEGER(IntKi), PARAMETER :: M23N7TDzss= 12679 + INTEGER(IntKi), PARAMETER :: M23N8TDzss= 12680 + INTEGER(IntKi), PARAMETER :: M23N9TDzss= 12681 + INTEGER(IntKi), PARAMETER :: M24N1TDzss= 12682 + INTEGER(IntKi), PARAMETER :: M24N2TDzss= 12683 + INTEGER(IntKi), PARAMETER :: M24N3TDzss= 12684 + INTEGER(IntKi), PARAMETER :: M24N4TDzss= 12685 + INTEGER(IntKi), PARAMETER :: M24N5TDzss= 12686 + INTEGER(IntKi), PARAMETER :: M24N6TDzss= 12687 + INTEGER(IntKi), PARAMETER :: M24N7TDzss= 12688 + INTEGER(IntKi), PARAMETER :: M24N8TDzss= 12689 + INTEGER(IntKi), PARAMETER :: M24N9TDzss= 12690 + INTEGER(IntKi), PARAMETER :: M25N1TDzss= 12691 + INTEGER(IntKi), PARAMETER :: M25N2TDzss= 12692 + INTEGER(IntKi), PARAMETER :: M25N3TDzss= 12693 + INTEGER(IntKi), PARAMETER :: M25N4TDzss= 12694 + INTEGER(IntKi), PARAMETER :: M25N5TDzss= 12695 + INTEGER(IntKi), PARAMETER :: M25N6TDzss= 12696 + INTEGER(IntKi), PARAMETER :: M25N7TDzss= 12697 + INTEGER(IntKi), PARAMETER :: M25N8TDzss= 12698 + INTEGER(IntKi), PARAMETER :: M25N9TDzss= 12699 + INTEGER(IntKi), PARAMETER :: M26N1TDzss= 12700 + INTEGER(IntKi), PARAMETER :: M26N2TDzss= 12701 + INTEGER(IntKi), PARAMETER :: M26N3TDzss= 12702 + INTEGER(IntKi), PARAMETER :: M26N4TDzss= 12703 + INTEGER(IntKi), PARAMETER :: M26N5TDzss= 12704 + INTEGER(IntKi), PARAMETER :: M26N6TDzss= 12705 + INTEGER(IntKi), PARAMETER :: M26N7TDzss= 12706 + INTEGER(IntKi), PARAMETER :: M26N8TDzss= 12707 + INTEGER(IntKi), PARAMETER :: M26N9TDzss= 12708 + INTEGER(IntKi), PARAMETER :: M27N1TDzss= 12709 + INTEGER(IntKi), PARAMETER :: M27N2TDzss= 12710 + INTEGER(IntKi), PARAMETER :: M27N3TDzss= 12711 + INTEGER(IntKi), PARAMETER :: M27N4TDzss= 12712 + INTEGER(IntKi), PARAMETER :: M27N5TDzss= 12713 + INTEGER(IntKi), PARAMETER :: M27N6TDzss= 12714 + INTEGER(IntKi), PARAMETER :: M27N7TDzss= 12715 + INTEGER(IntKi), PARAMETER :: M27N8TDzss= 12716 + INTEGER(IntKi), PARAMETER :: M27N9TDzss= 12717 + INTEGER(IntKi), PARAMETER :: M28N1TDzss= 12718 + INTEGER(IntKi), PARAMETER :: M28N2TDzss= 12719 + INTEGER(IntKi), PARAMETER :: M28N3TDzss= 12720 + INTEGER(IntKi), PARAMETER :: M28N4TDzss= 12721 + INTEGER(IntKi), PARAMETER :: M28N5TDzss= 12722 + INTEGER(IntKi), PARAMETER :: M28N6TDzss= 12723 + INTEGER(IntKi), PARAMETER :: M28N7TDzss= 12724 + INTEGER(IntKi), PARAMETER :: M28N8TDzss= 12725 + INTEGER(IntKi), PARAMETER :: M28N9TDzss= 12726 + INTEGER(IntKi), PARAMETER :: M29N1TDzss= 12727 + INTEGER(IntKi), PARAMETER :: M29N2TDzss= 12728 + INTEGER(IntKi), PARAMETER :: M29N3TDzss= 12729 + INTEGER(IntKi), PARAMETER :: M29N4TDzss= 12730 + INTEGER(IntKi), PARAMETER :: M29N5TDzss= 12731 + INTEGER(IntKi), PARAMETER :: M29N6TDzss= 12732 + INTEGER(IntKi), PARAMETER :: M29N7TDzss= 12733 + INTEGER(IntKi), PARAMETER :: M29N8TDzss= 12734 + INTEGER(IntKi), PARAMETER :: M29N9TDzss= 12735 + INTEGER(IntKi), PARAMETER :: M30N1TDzss= 12736 + INTEGER(IntKi), PARAMETER :: M30N2TDzss= 12737 + INTEGER(IntKi), PARAMETER :: M30N3TDzss= 12738 + INTEGER(IntKi), PARAMETER :: M30N4TDzss= 12739 + INTEGER(IntKi), PARAMETER :: M30N5TDzss= 12740 + INTEGER(IntKi), PARAMETER :: M30N6TDzss= 12741 + INTEGER(IntKi), PARAMETER :: M30N7TDzss= 12742 + INTEGER(IntKi), PARAMETER :: M30N8TDzss= 12743 + INTEGER(IntKi), PARAMETER :: M30N9TDzss= 12744 + INTEGER(IntKi), PARAMETER :: M31N1TDzss= 12745 + INTEGER(IntKi), PARAMETER :: M31N2TDzss= 12746 + INTEGER(IntKi), PARAMETER :: M31N3TDzss= 12747 + INTEGER(IntKi), PARAMETER :: M31N4TDzss= 12748 + INTEGER(IntKi), PARAMETER :: M31N5TDzss= 12749 + INTEGER(IntKi), PARAMETER :: M31N6TDzss= 12750 + INTEGER(IntKi), PARAMETER :: M31N7TDzss= 12751 + INTEGER(IntKi), PARAMETER :: M31N8TDzss= 12752 + INTEGER(IntKi), PARAMETER :: M31N9TDzss= 12753 + INTEGER(IntKi), PARAMETER :: M32N1TDzss= 12754 + INTEGER(IntKi), PARAMETER :: M32N2TDzss= 12755 + INTEGER(IntKi), PARAMETER :: M32N3TDzss= 12756 + INTEGER(IntKi), PARAMETER :: M32N4TDzss= 12757 + INTEGER(IntKi), PARAMETER :: M32N5TDzss= 12758 + INTEGER(IntKi), PARAMETER :: M32N6TDzss= 12759 + INTEGER(IntKi), PARAMETER :: M32N7TDzss= 12760 + INTEGER(IntKi), PARAMETER :: M32N8TDzss= 12761 + INTEGER(IntKi), PARAMETER :: M32N9TDzss= 12762 + INTEGER(IntKi), PARAMETER :: M33N1TDzss= 12763 + INTEGER(IntKi), PARAMETER :: M33N2TDzss= 12764 + INTEGER(IntKi), PARAMETER :: M33N3TDzss= 12765 + INTEGER(IntKi), PARAMETER :: M33N4TDzss= 12766 + INTEGER(IntKi), PARAMETER :: M33N5TDzss= 12767 + INTEGER(IntKi), PARAMETER :: M33N6TDzss= 12768 + INTEGER(IntKi), PARAMETER :: M33N7TDzss= 12769 + INTEGER(IntKi), PARAMETER :: M33N8TDzss= 12770 + INTEGER(IntKi), PARAMETER :: M33N9TDzss= 12771 + INTEGER(IntKi), PARAMETER :: M34N1TDzss= 12772 + INTEGER(IntKi), PARAMETER :: M34N2TDzss= 12773 + INTEGER(IntKi), PARAMETER :: M34N3TDzss= 12774 + INTEGER(IntKi), PARAMETER :: M34N4TDzss= 12775 + INTEGER(IntKi), PARAMETER :: M34N5TDzss= 12776 + INTEGER(IntKi), PARAMETER :: M34N6TDzss= 12777 + INTEGER(IntKi), PARAMETER :: M34N7TDzss= 12778 + INTEGER(IntKi), PARAMETER :: M34N8TDzss= 12779 + INTEGER(IntKi), PARAMETER :: M34N9TDzss= 12780 + INTEGER(IntKi), PARAMETER :: M35N1TDzss= 12781 + INTEGER(IntKi), PARAMETER :: M35N2TDzss= 12782 + INTEGER(IntKi), PARAMETER :: M35N3TDzss= 12783 + INTEGER(IntKi), PARAMETER :: M35N4TDzss= 12784 + INTEGER(IntKi), PARAMETER :: M35N5TDzss= 12785 + INTEGER(IntKi), PARAMETER :: M35N6TDzss= 12786 + INTEGER(IntKi), PARAMETER :: M35N7TDzss= 12787 + INTEGER(IntKi), PARAMETER :: M35N8TDzss= 12788 + INTEGER(IntKi), PARAMETER :: M35N9TDzss= 12789 + INTEGER(IntKi), PARAMETER :: M36N1TDzss= 12790 + INTEGER(IntKi), PARAMETER :: M36N2TDzss= 12791 + INTEGER(IntKi), PARAMETER :: M36N3TDzss= 12792 + INTEGER(IntKi), PARAMETER :: M36N4TDzss= 12793 + INTEGER(IntKi), PARAMETER :: M36N5TDzss= 12794 + INTEGER(IntKi), PARAMETER :: M36N6TDzss= 12795 + INTEGER(IntKi), PARAMETER :: M36N7TDzss= 12796 + INTEGER(IntKi), PARAMETER :: M36N8TDzss= 12797 + INTEGER(IntKi), PARAMETER :: M36N9TDzss= 12798 + INTEGER(IntKi), PARAMETER :: M37N1TDzss= 12799 + INTEGER(IntKi), PARAMETER :: M37N2TDzss= 12800 + INTEGER(IntKi), PARAMETER :: M37N3TDzss= 12801 + INTEGER(IntKi), PARAMETER :: M37N4TDzss= 12802 + INTEGER(IntKi), PARAMETER :: M37N5TDzss= 12803 + INTEGER(IntKi), PARAMETER :: M37N6TDzss= 12804 + INTEGER(IntKi), PARAMETER :: M37N7TDzss= 12805 + INTEGER(IntKi), PARAMETER :: M37N8TDzss= 12806 + INTEGER(IntKi), PARAMETER :: M37N9TDzss= 12807 + INTEGER(IntKi), PARAMETER :: M38N1TDzss= 12808 + INTEGER(IntKi), PARAMETER :: M38N2TDzss= 12809 + INTEGER(IntKi), PARAMETER :: M38N3TDzss= 12810 + INTEGER(IntKi), PARAMETER :: M38N4TDzss= 12811 + INTEGER(IntKi), PARAMETER :: M38N5TDzss= 12812 + INTEGER(IntKi), PARAMETER :: M38N6TDzss= 12813 + INTEGER(IntKi), PARAMETER :: M38N7TDzss= 12814 + INTEGER(IntKi), PARAMETER :: M38N8TDzss= 12815 + INTEGER(IntKi), PARAMETER :: M38N9TDzss= 12816 + INTEGER(IntKi), PARAMETER :: M39N1TDzss= 12817 + INTEGER(IntKi), PARAMETER :: M39N2TDzss= 12818 + INTEGER(IntKi), PARAMETER :: M39N3TDzss= 12819 + INTEGER(IntKi), PARAMETER :: M39N4TDzss= 12820 + INTEGER(IntKi), PARAMETER :: M39N5TDzss= 12821 + INTEGER(IntKi), PARAMETER :: M39N6TDzss= 12822 + INTEGER(IntKi), PARAMETER :: M39N7TDzss= 12823 + INTEGER(IntKi), PARAMETER :: M39N8TDzss= 12824 + INTEGER(IntKi), PARAMETER :: M39N9TDzss= 12825 + INTEGER(IntKi), PARAMETER :: M40N1TDzss= 12826 + INTEGER(IntKi), PARAMETER :: M40N2TDzss= 12827 + INTEGER(IntKi), PARAMETER :: M40N3TDzss= 12828 + INTEGER(IntKi), PARAMETER :: M40N4TDzss= 12829 + INTEGER(IntKi), PARAMETER :: M40N5TDzss= 12830 + INTEGER(IntKi), PARAMETER :: M40N6TDzss= 12831 + INTEGER(IntKi), PARAMETER :: M40N7TDzss= 12832 + INTEGER(IntKi), PARAMETER :: M40N8TDzss= 12833 + INTEGER(IntKi), PARAMETER :: M40N9TDzss= 12834 + INTEGER(IntKi), PARAMETER :: M41N1TDzss= 12835 + INTEGER(IntKi), PARAMETER :: M41N2TDzss= 12836 + INTEGER(IntKi), PARAMETER :: M41N3TDzss= 12837 + INTEGER(IntKi), PARAMETER :: M41N4TDzss= 12838 + INTEGER(IntKi), PARAMETER :: M41N5TDzss= 12839 + INTEGER(IntKi), PARAMETER :: M41N6TDzss= 12840 + INTEGER(IntKi), PARAMETER :: M41N7TDzss= 12841 + INTEGER(IntKi), PARAMETER :: M41N8TDzss= 12842 + INTEGER(IntKi), PARAMETER :: M41N9TDzss= 12843 + INTEGER(IntKi), PARAMETER :: M42N1TDzss= 12844 + INTEGER(IntKi), PARAMETER :: M42N2TDzss= 12845 + INTEGER(IntKi), PARAMETER :: M42N3TDzss= 12846 + INTEGER(IntKi), PARAMETER :: M42N4TDzss= 12847 + INTEGER(IntKi), PARAMETER :: M42N5TDzss= 12848 + INTEGER(IntKi), PARAMETER :: M42N6TDzss= 12849 + INTEGER(IntKi), PARAMETER :: M42N7TDzss= 12850 + INTEGER(IntKi), PARAMETER :: M42N8TDzss= 12851 + INTEGER(IntKi), PARAMETER :: M42N9TDzss= 12852 + INTEGER(IntKi), PARAMETER :: M43N1TDzss= 12853 + INTEGER(IntKi), PARAMETER :: M43N2TDzss= 12854 + INTEGER(IntKi), PARAMETER :: M43N3TDzss= 12855 + INTEGER(IntKi), PARAMETER :: M43N4TDzss= 12856 + INTEGER(IntKi), PARAMETER :: M43N5TDzss= 12857 + INTEGER(IntKi), PARAMETER :: M43N6TDzss= 12858 + INTEGER(IntKi), PARAMETER :: M43N7TDzss= 12859 + INTEGER(IntKi), PARAMETER :: M43N8TDzss= 12860 + INTEGER(IntKi), PARAMETER :: M43N9TDzss= 12861 + INTEGER(IntKi), PARAMETER :: M44N1TDzss= 12862 + INTEGER(IntKi), PARAMETER :: M44N2TDzss= 12863 + INTEGER(IntKi), PARAMETER :: M44N3TDzss= 12864 + INTEGER(IntKi), PARAMETER :: M44N4TDzss= 12865 + INTEGER(IntKi), PARAMETER :: M44N5TDzss= 12866 + INTEGER(IntKi), PARAMETER :: M44N6TDzss= 12867 + INTEGER(IntKi), PARAMETER :: M44N7TDzss= 12868 + INTEGER(IntKi), PARAMETER :: M44N8TDzss= 12869 + INTEGER(IntKi), PARAMETER :: M44N9TDzss= 12870 + INTEGER(IntKi), PARAMETER :: M45N1TDzss= 12871 + INTEGER(IntKi), PARAMETER :: M45N2TDzss= 12872 + INTEGER(IntKi), PARAMETER :: M45N3TDzss= 12873 + INTEGER(IntKi), PARAMETER :: M45N4TDzss= 12874 + INTEGER(IntKi), PARAMETER :: M45N5TDzss= 12875 + INTEGER(IntKi), PARAMETER :: M45N6TDzss= 12876 + INTEGER(IntKi), PARAMETER :: M45N7TDzss= 12877 + INTEGER(IntKi), PARAMETER :: M45N8TDzss= 12878 + INTEGER(IntKi), PARAMETER :: M45N9TDzss= 12879 + INTEGER(IntKi), PARAMETER :: M46N1TDzss= 12880 + INTEGER(IntKi), PARAMETER :: M46N2TDzss= 12881 + INTEGER(IntKi), PARAMETER :: M46N3TDzss= 12882 + INTEGER(IntKi), PARAMETER :: M46N4TDzss= 12883 + INTEGER(IntKi), PARAMETER :: M46N5TDzss= 12884 + INTEGER(IntKi), PARAMETER :: M46N6TDzss= 12885 + INTEGER(IntKi), PARAMETER :: M46N7TDzss= 12886 + INTEGER(IntKi), PARAMETER :: M46N8TDzss= 12887 + INTEGER(IntKi), PARAMETER :: M46N9TDzss= 12888 + INTEGER(IntKi), PARAMETER :: M47N1TDzss= 12889 + INTEGER(IntKi), PARAMETER :: M47N2TDzss= 12890 + INTEGER(IntKi), PARAMETER :: M47N3TDzss= 12891 + INTEGER(IntKi), PARAMETER :: M47N4TDzss= 12892 + INTEGER(IntKi), PARAMETER :: M47N5TDzss= 12893 + INTEGER(IntKi), PARAMETER :: M47N6TDzss= 12894 + INTEGER(IntKi), PARAMETER :: M47N7TDzss= 12895 + INTEGER(IntKi), PARAMETER :: M47N8TDzss= 12896 + INTEGER(IntKi), PARAMETER :: M47N9TDzss= 12897 + INTEGER(IntKi), PARAMETER :: M48N1TDzss= 12898 + INTEGER(IntKi), PARAMETER :: M48N2TDzss= 12899 + INTEGER(IntKi), PARAMETER :: M48N3TDzss= 12900 + INTEGER(IntKi), PARAMETER :: M48N4TDzss= 12901 + INTEGER(IntKi), PARAMETER :: M48N5TDzss= 12902 + INTEGER(IntKi), PARAMETER :: M48N6TDzss= 12903 + INTEGER(IntKi), PARAMETER :: M48N7TDzss= 12904 + INTEGER(IntKi), PARAMETER :: M48N8TDzss= 12905 + INTEGER(IntKi), PARAMETER :: M48N9TDzss= 12906 + INTEGER(IntKi), PARAMETER :: M49N1TDzss= 12907 + INTEGER(IntKi), PARAMETER :: M49N2TDzss= 12908 + INTEGER(IntKi), PARAMETER :: M49N3TDzss= 12909 + INTEGER(IntKi), PARAMETER :: M49N4TDzss= 12910 + INTEGER(IntKi), PARAMETER :: M49N5TDzss= 12911 + INTEGER(IntKi), PARAMETER :: M49N6TDzss= 12912 + INTEGER(IntKi), PARAMETER :: M49N7TDzss= 12913 + INTEGER(IntKi), PARAMETER :: M49N8TDzss= 12914 + INTEGER(IntKi), PARAMETER :: M49N9TDzss= 12915 + INTEGER(IntKi), PARAMETER :: M50N1TDzss= 12916 + INTEGER(IntKi), PARAMETER :: M50N2TDzss= 12917 + INTEGER(IntKi), PARAMETER :: M50N3TDzss= 12918 + INTEGER(IntKi), PARAMETER :: M50N4TDzss= 12919 + INTEGER(IntKi), PARAMETER :: M50N5TDzss= 12920 + INTEGER(IntKi), PARAMETER :: M50N6TDzss= 12921 + INTEGER(IntKi), PARAMETER :: M50N7TDzss= 12922 + INTEGER(IntKi), PARAMETER :: M50N8TDzss= 12923 + INTEGER(IntKi), PARAMETER :: M50N9TDzss= 12924 + INTEGER(IntKi), PARAMETER :: M51N1TDzss= 12925 + INTEGER(IntKi), PARAMETER :: M51N2TDzss= 12926 + INTEGER(IntKi), PARAMETER :: M51N3TDzss= 12927 + INTEGER(IntKi), PARAMETER :: M51N4TDzss= 12928 + INTEGER(IntKi), PARAMETER :: M51N5TDzss= 12929 + INTEGER(IntKi), PARAMETER :: M51N6TDzss= 12930 + INTEGER(IntKi), PARAMETER :: M51N7TDzss= 12931 + INTEGER(IntKi), PARAMETER :: M51N8TDzss= 12932 + INTEGER(IntKi), PARAMETER :: M51N9TDzss= 12933 + INTEGER(IntKi), PARAMETER :: M52N1TDzss= 12934 + INTEGER(IntKi), PARAMETER :: M52N2TDzss= 12935 + INTEGER(IntKi), PARAMETER :: M52N3TDzss= 12936 + INTEGER(IntKi), PARAMETER :: M52N4TDzss= 12937 + INTEGER(IntKi), PARAMETER :: M52N5TDzss= 12938 + INTEGER(IntKi), PARAMETER :: M52N6TDzss= 12939 + INTEGER(IntKi), PARAMETER :: M52N7TDzss= 12940 + INTEGER(IntKi), PARAMETER :: M52N8TDzss= 12941 + INTEGER(IntKi), PARAMETER :: M52N9TDzss= 12942 + INTEGER(IntKi), PARAMETER :: M53N1TDzss= 12943 + INTEGER(IntKi), PARAMETER :: M53N2TDzss= 12944 + INTEGER(IntKi), PARAMETER :: M53N3TDzss= 12945 + INTEGER(IntKi), PARAMETER :: M53N4TDzss= 12946 + INTEGER(IntKi), PARAMETER :: M53N5TDzss= 12947 + INTEGER(IntKi), PARAMETER :: M53N6TDzss= 12948 + INTEGER(IntKi), PARAMETER :: M53N7TDzss= 12949 + INTEGER(IntKi), PARAMETER :: M53N8TDzss= 12950 + INTEGER(IntKi), PARAMETER :: M53N9TDzss= 12951 + INTEGER(IntKi), PARAMETER :: M54N1TDzss= 12952 + INTEGER(IntKi), PARAMETER :: M54N2TDzss= 12953 + INTEGER(IntKi), PARAMETER :: M54N3TDzss= 12954 + INTEGER(IntKi), PARAMETER :: M54N4TDzss= 12955 + INTEGER(IntKi), PARAMETER :: M54N5TDzss= 12956 + INTEGER(IntKi), PARAMETER :: M54N6TDzss= 12957 + INTEGER(IntKi), PARAMETER :: M54N7TDzss= 12958 + INTEGER(IntKi), PARAMETER :: M54N8TDzss= 12959 + INTEGER(IntKi), PARAMETER :: M54N9TDzss= 12960 + INTEGER(IntKi), PARAMETER :: M55N1TDzss= 12961 + INTEGER(IntKi), PARAMETER :: M55N2TDzss= 12962 + INTEGER(IntKi), PARAMETER :: M55N3TDzss= 12963 + INTEGER(IntKi), PARAMETER :: M55N4TDzss= 12964 + INTEGER(IntKi), PARAMETER :: M55N5TDzss= 12965 + INTEGER(IntKi), PARAMETER :: M55N6TDzss= 12966 + INTEGER(IntKi), PARAMETER :: M55N7TDzss= 12967 + INTEGER(IntKi), PARAMETER :: M55N8TDzss= 12968 + INTEGER(IntKi), PARAMETER :: M55N9TDzss= 12969 + INTEGER(IntKi), PARAMETER :: M56N1TDzss= 12970 + INTEGER(IntKi), PARAMETER :: M56N2TDzss= 12971 + INTEGER(IntKi), PARAMETER :: M56N3TDzss= 12972 + INTEGER(IntKi), PARAMETER :: M56N4TDzss= 12973 + INTEGER(IntKi), PARAMETER :: M56N5TDzss= 12974 + INTEGER(IntKi), PARAMETER :: M56N6TDzss= 12975 + INTEGER(IntKi), PARAMETER :: M56N7TDzss= 12976 + INTEGER(IntKi), PARAMETER :: M56N8TDzss= 12977 + INTEGER(IntKi), PARAMETER :: M56N9TDzss= 12978 + INTEGER(IntKi), PARAMETER :: M57N1TDzss= 12979 + INTEGER(IntKi), PARAMETER :: M57N2TDzss= 12980 + INTEGER(IntKi), PARAMETER :: M57N3TDzss= 12981 + INTEGER(IntKi), PARAMETER :: M57N4TDzss= 12982 + INTEGER(IntKi), PARAMETER :: M57N5TDzss= 12983 + INTEGER(IntKi), PARAMETER :: M57N6TDzss= 12984 + INTEGER(IntKi), PARAMETER :: M57N7TDzss= 12985 + INTEGER(IntKi), PARAMETER :: M57N8TDzss= 12986 + INTEGER(IntKi), PARAMETER :: M57N9TDzss= 12987 + INTEGER(IntKi), PARAMETER :: M58N1TDzss= 12988 + INTEGER(IntKi), PARAMETER :: M58N2TDzss= 12989 + INTEGER(IntKi), PARAMETER :: M58N3TDzss= 12990 + INTEGER(IntKi), PARAMETER :: M58N4TDzss= 12991 + INTEGER(IntKi), PARAMETER :: M58N5TDzss= 12992 + INTEGER(IntKi), PARAMETER :: M58N6TDzss= 12993 + INTEGER(IntKi), PARAMETER :: M58N7TDzss= 12994 + INTEGER(IntKi), PARAMETER :: M58N8TDzss= 12995 + INTEGER(IntKi), PARAMETER :: M58N9TDzss= 12996 + INTEGER(IntKi), PARAMETER :: M59N1TDzss= 12997 + INTEGER(IntKi), PARAMETER :: M59N2TDzss= 12998 + INTEGER(IntKi), PARAMETER :: M59N3TDzss= 12999 + INTEGER(IntKi), PARAMETER :: M59N4TDzss= 13000 + INTEGER(IntKi), PARAMETER :: M59N5TDzss= 13001 + INTEGER(IntKi), PARAMETER :: M59N6TDzss= 13002 + INTEGER(IntKi), PARAMETER :: M59N7TDzss= 13003 + INTEGER(IntKi), PARAMETER :: M59N8TDzss= 13004 + INTEGER(IntKi), PARAMETER :: M59N9TDzss= 13005 + INTEGER(IntKi), PARAMETER :: M60N1TDzss= 13006 + INTEGER(IntKi), PARAMETER :: M60N2TDzss= 13007 + INTEGER(IntKi), PARAMETER :: M60N3TDzss= 13008 + INTEGER(IntKi), PARAMETER :: M60N4TDzss= 13009 + INTEGER(IntKi), PARAMETER :: M60N5TDzss= 13010 + INTEGER(IntKi), PARAMETER :: M60N6TDzss= 13011 + INTEGER(IntKi), PARAMETER :: M60N7TDzss= 13012 + INTEGER(IntKi), PARAMETER :: M60N8TDzss= 13013 + INTEGER(IntKi), PARAMETER :: M60N9TDzss= 13014 + INTEGER(IntKi), PARAMETER :: M61N1TDzss= 13015 + INTEGER(IntKi), PARAMETER :: M61N2TDzss= 13016 + INTEGER(IntKi), PARAMETER :: M61N3TDzss= 13017 + INTEGER(IntKi), PARAMETER :: M61N4TDzss= 13018 + INTEGER(IntKi), PARAMETER :: M61N5TDzss= 13019 + INTEGER(IntKi), PARAMETER :: M61N6TDzss= 13020 + INTEGER(IntKi), PARAMETER :: M61N7TDzss= 13021 + INTEGER(IntKi), PARAMETER :: M61N8TDzss= 13022 + INTEGER(IntKi), PARAMETER :: M61N9TDzss= 13023 + INTEGER(IntKi), PARAMETER :: M62N1TDzss= 13024 + INTEGER(IntKi), PARAMETER :: M62N2TDzss= 13025 + INTEGER(IntKi), PARAMETER :: M62N3TDzss= 13026 + INTEGER(IntKi), PARAMETER :: M62N4TDzss= 13027 + INTEGER(IntKi), PARAMETER :: M62N5TDzss= 13028 + INTEGER(IntKi), PARAMETER :: M62N6TDzss= 13029 + INTEGER(IntKi), PARAMETER :: M62N7TDzss= 13030 + INTEGER(IntKi), PARAMETER :: M62N8TDzss= 13031 + INTEGER(IntKi), PARAMETER :: M62N9TDzss= 13032 + INTEGER(IntKi), PARAMETER :: M63N1TDzss= 13033 + INTEGER(IntKi), PARAMETER :: M63N2TDzss= 13034 + INTEGER(IntKi), PARAMETER :: M63N3TDzss= 13035 + INTEGER(IntKi), PARAMETER :: M63N4TDzss= 13036 + INTEGER(IntKi), PARAMETER :: M63N5TDzss= 13037 + INTEGER(IntKi), PARAMETER :: M63N6TDzss= 13038 + INTEGER(IntKi), PARAMETER :: M63N7TDzss= 13039 + INTEGER(IntKi), PARAMETER :: M63N8TDzss= 13040 + INTEGER(IntKi), PARAMETER :: M63N9TDzss= 13041 + INTEGER(IntKi), PARAMETER :: M64N1TDzss= 13042 + INTEGER(IntKi), PARAMETER :: M64N2TDzss= 13043 + INTEGER(IntKi), PARAMETER :: M64N3TDzss= 13044 + INTEGER(IntKi), PARAMETER :: M64N4TDzss= 13045 + INTEGER(IntKi), PARAMETER :: M64N5TDzss= 13046 + INTEGER(IntKi), PARAMETER :: M64N6TDzss= 13047 + INTEGER(IntKi), PARAMETER :: M64N7TDzss= 13048 + INTEGER(IntKi), PARAMETER :: M64N8TDzss= 13049 + INTEGER(IntKi), PARAMETER :: M64N9TDzss= 13050 + INTEGER(IntKi), PARAMETER :: M65N1TDzss= 13051 + INTEGER(IntKi), PARAMETER :: M65N2TDzss= 13052 + INTEGER(IntKi), PARAMETER :: M65N3TDzss= 13053 + INTEGER(IntKi), PARAMETER :: M65N4TDzss= 13054 + INTEGER(IntKi), PARAMETER :: M65N5TDzss= 13055 + INTEGER(IntKi), PARAMETER :: M65N6TDzss= 13056 + INTEGER(IntKi), PARAMETER :: M65N7TDzss= 13057 + INTEGER(IntKi), PARAMETER :: M65N8TDzss= 13058 + INTEGER(IntKi), PARAMETER :: M65N9TDzss= 13059 + INTEGER(IntKi), PARAMETER :: M66N1TDzss= 13060 + INTEGER(IntKi), PARAMETER :: M66N2TDzss= 13061 + INTEGER(IntKi), PARAMETER :: M66N3TDzss= 13062 + INTEGER(IntKi), PARAMETER :: M66N4TDzss= 13063 + INTEGER(IntKi), PARAMETER :: M66N5TDzss= 13064 + INTEGER(IntKi), PARAMETER :: M66N6TDzss= 13065 + INTEGER(IntKi), PARAMETER :: M66N7TDzss= 13066 + INTEGER(IntKi), PARAMETER :: M66N8TDzss= 13067 + INTEGER(IntKi), PARAMETER :: M66N9TDzss= 13068 + INTEGER(IntKi), PARAMETER :: M67N1TDzss= 13069 + INTEGER(IntKi), PARAMETER :: M67N2TDzss= 13070 + INTEGER(IntKi), PARAMETER :: M67N3TDzss= 13071 + INTEGER(IntKi), PARAMETER :: M67N4TDzss= 13072 + INTEGER(IntKi), PARAMETER :: M67N5TDzss= 13073 + INTEGER(IntKi), PARAMETER :: M67N6TDzss= 13074 + INTEGER(IntKi), PARAMETER :: M67N7TDzss= 13075 + INTEGER(IntKi), PARAMETER :: M67N8TDzss= 13076 + INTEGER(IntKi), PARAMETER :: M67N9TDzss= 13077 + INTEGER(IntKi), PARAMETER :: M68N1TDzss= 13078 + INTEGER(IntKi), PARAMETER :: M68N2TDzss= 13079 + INTEGER(IntKi), PARAMETER :: M68N3TDzss= 13080 + INTEGER(IntKi), PARAMETER :: M68N4TDzss= 13081 + INTEGER(IntKi), PARAMETER :: M68N5TDzss= 13082 + INTEGER(IntKi), PARAMETER :: M68N6TDzss= 13083 + INTEGER(IntKi), PARAMETER :: M68N7TDzss= 13084 + INTEGER(IntKi), PARAMETER :: M68N8TDzss= 13085 + INTEGER(IntKi), PARAMETER :: M68N9TDzss= 13086 + INTEGER(IntKi), PARAMETER :: M69N1TDzss= 13087 + INTEGER(IntKi), PARAMETER :: M69N2TDzss= 13088 + INTEGER(IntKi), PARAMETER :: M69N3TDzss= 13089 + INTEGER(IntKi), PARAMETER :: M69N4TDzss= 13090 + INTEGER(IntKi), PARAMETER :: M69N5TDzss= 13091 + INTEGER(IntKi), PARAMETER :: M69N6TDzss= 13092 + INTEGER(IntKi), PARAMETER :: M69N7TDzss= 13093 + INTEGER(IntKi), PARAMETER :: M69N8TDzss= 13094 + INTEGER(IntKi), PARAMETER :: M69N9TDzss= 13095 + INTEGER(IntKi), PARAMETER :: M70N1TDzss= 13096 + INTEGER(IntKi), PARAMETER :: M70N2TDzss= 13097 + INTEGER(IntKi), PARAMETER :: M70N3TDzss= 13098 + INTEGER(IntKi), PARAMETER :: M70N4TDzss= 13099 + INTEGER(IntKi), PARAMETER :: M70N5TDzss= 13100 + INTEGER(IntKi), PARAMETER :: M70N6TDzss= 13101 + INTEGER(IntKi), PARAMETER :: M70N7TDzss= 13102 + INTEGER(IntKi), PARAMETER :: M70N8TDzss= 13103 + INTEGER(IntKi), PARAMETER :: M70N9TDzss= 13104 + INTEGER(IntKi), PARAMETER :: M71N1TDzss= 13105 + INTEGER(IntKi), PARAMETER :: M71N2TDzss= 13106 + INTEGER(IntKi), PARAMETER :: M71N3TDzss= 13107 + INTEGER(IntKi), PARAMETER :: M71N4TDzss= 13108 + INTEGER(IntKi), PARAMETER :: M71N5TDzss= 13109 + INTEGER(IntKi), PARAMETER :: M71N6TDzss= 13110 + INTEGER(IntKi), PARAMETER :: M71N7TDzss= 13111 + INTEGER(IntKi), PARAMETER :: M71N8TDzss= 13112 + INTEGER(IntKi), PARAMETER :: M71N9TDzss= 13113 + INTEGER(IntKi), PARAMETER :: M72N1TDzss= 13114 + INTEGER(IntKi), PARAMETER :: M72N2TDzss= 13115 + INTEGER(IntKi), PARAMETER :: M72N3TDzss= 13116 + INTEGER(IntKi), PARAMETER :: M72N4TDzss= 13117 + INTEGER(IntKi), PARAMETER :: M72N5TDzss= 13118 + INTEGER(IntKi), PARAMETER :: M72N6TDzss= 13119 + INTEGER(IntKi), PARAMETER :: M72N7TDzss= 13120 + INTEGER(IntKi), PARAMETER :: M72N8TDzss= 13121 + INTEGER(IntKi), PARAMETER :: M72N9TDzss= 13122 + INTEGER(IntKi), PARAMETER :: M73N1TDzss= 13123 + INTEGER(IntKi), PARAMETER :: M73N2TDzss= 13124 + INTEGER(IntKi), PARAMETER :: M73N3TDzss= 13125 + INTEGER(IntKi), PARAMETER :: M73N4TDzss= 13126 + INTEGER(IntKi), PARAMETER :: M73N5TDzss= 13127 + INTEGER(IntKi), PARAMETER :: M73N6TDzss= 13128 + INTEGER(IntKi), PARAMETER :: M73N7TDzss= 13129 + INTEGER(IntKi), PARAMETER :: M73N8TDzss= 13130 + INTEGER(IntKi), PARAMETER :: M73N9TDzss= 13131 + INTEGER(IntKi), PARAMETER :: M74N1TDzss= 13132 + INTEGER(IntKi), PARAMETER :: M74N2TDzss= 13133 + INTEGER(IntKi), PARAMETER :: M74N3TDzss= 13134 + INTEGER(IntKi), PARAMETER :: M74N4TDzss= 13135 + INTEGER(IntKi), PARAMETER :: M74N5TDzss= 13136 + INTEGER(IntKi), PARAMETER :: M74N6TDzss= 13137 + INTEGER(IntKi), PARAMETER :: M74N7TDzss= 13138 + INTEGER(IntKi), PARAMETER :: M74N8TDzss= 13139 + INTEGER(IntKi), PARAMETER :: M74N9TDzss= 13140 + INTEGER(IntKi), PARAMETER :: M75N1TDzss= 13141 + INTEGER(IntKi), PARAMETER :: M75N2TDzss= 13142 + INTEGER(IntKi), PARAMETER :: M75N3TDzss= 13143 + INTEGER(IntKi), PARAMETER :: M75N4TDzss= 13144 + INTEGER(IntKi), PARAMETER :: M75N5TDzss= 13145 + INTEGER(IntKi), PARAMETER :: M75N6TDzss= 13146 + INTEGER(IntKi), PARAMETER :: M75N7TDzss= 13147 + INTEGER(IntKi), PARAMETER :: M75N8TDzss= 13148 + INTEGER(IntKi), PARAMETER :: M75N9TDzss= 13149 + INTEGER(IntKi), PARAMETER :: M76N1TDzss= 13150 + INTEGER(IntKi), PARAMETER :: M76N2TDzss= 13151 + INTEGER(IntKi), PARAMETER :: M76N3TDzss= 13152 + INTEGER(IntKi), PARAMETER :: M76N4TDzss= 13153 + INTEGER(IntKi), PARAMETER :: M76N5TDzss= 13154 + INTEGER(IntKi), PARAMETER :: M76N6TDzss= 13155 + INTEGER(IntKi), PARAMETER :: M76N7TDzss= 13156 + INTEGER(IntKi), PARAMETER :: M76N8TDzss= 13157 + INTEGER(IntKi), PARAMETER :: M76N9TDzss= 13158 + INTEGER(IntKi), PARAMETER :: M77N1TDzss= 13159 + INTEGER(IntKi), PARAMETER :: M77N2TDzss= 13160 + INTEGER(IntKi), PARAMETER :: M77N3TDzss= 13161 + INTEGER(IntKi), PARAMETER :: M77N4TDzss= 13162 + INTEGER(IntKi), PARAMETER :: M77N5TDzss= 13163 + INTEGER(IntKi), PARAMETER :: M77N6TDzss= 13164 + INTEGER(IntKi), PARAMETER :: M77N7TDzss= 13165 + INTEGER(IntKi), PARAMETER :: M77N8TDzss= 13166 + INTEGER(IntKi), PARAMETER :: M77N9TDzss= 13167 + INTEGER(IntKi), PARAMETER :: M78N1TDzss= 13168 + INTEGER(IntKi), PARAMETER :: M78N2TDzss= 13169 + INTEGER(IntKi), PARAMETER :: M78N3TDzss= 13170 + INTEGER(IntKi), PARAMETER :: M78N4TDzss= 13171 + INTEGER(IntKi), PARAMETER :: M78N5TDzss= 13172 + INTEGER(IntKi), PARAMETER :: M78N6TDzss= 13173 + INTEGER(IntKi), PARAMETER :: M78N7TDzss= 13174 + INTEGER(IntKi), PARAMETER :: M78N8TDzss= 13175 + INTEGER(IntKi), PARAMETER :: M78N9TDzss= 13176 + INTEGER(IntKi), PARAMETER :: M79N1TDzss= 13177 + INTEGER(IntKi), PARAMETER :: M79N2TDzss= 13178 + INTEGER(IntKi), PARAMETER :: M79N3TDzss= 13179 + INTEGER(IntKi), PARAMETER :: M79N4TDzss= 13180 + INTEGER(IntKi), PARAMETER :: M79N5TDzss= 13181 + INTEGER(IntKi), PARAMETER :: M79N6TDzss= 13182 + INTEGER(IntKi), PARAMETER :: M79N7TDzss= 13183 + INTEGER(IntKi), PARAMETER :: M79N8TDzss= 13184 + INTEGER(IntKi), PARAMETER :: M79N9TDzss= 13185 + INTEGER(IntKi), PARAMETER :: M80N1TDzss= 13186 + INTEGER(IntKi), PARAMETER :: M80N2TDzss= 13187 + INTEGER(IntKi), PARAMETER :: M80N3TDzss= 13188 + INTEGER(IntKi), PARAMETER :: M80N4TDzss= 13189 + INTEGER(IntKi), PARAMETER :: M80N5TDzss= 13190 + INTEGER(IntKi), PARAMETER :: M80N6TDzss= 13191 + INTEGER(IntKi), PARAMETER :: M80N7TDzss= 13192 + INTEGER(IntKi), PARAMETER :: M80N8TDzss= 13193 + INTEGER(IntKi), PARAMETER :: M80N9TDzss= 13194 + INTEGER(IntKi), PARAMETER :: M81N1TDzss= 13195 + INTEGER(IntKi), PARAMETER :: M81N2TDzss= 13196 + INTEGER(IntKi), PARAMETER :: M81N3TDzss= 13197 + INTEGER(IntKi), PARAMETER :: M81N4TDzss= 13198 + INTEGER(IntKi), PARAMETER :: M81N5TDzss= 13199 + INTEGER(IntKi), PARAMETER :: M81N6TDzss= 13200 + INTEGER(IntKi), PARAMETER :: M81N7TDzss= 13201 + INTEGER(IntKi), PARAMETER :: M81N8TDzss= 13202 + INTEGER(IntKi), PARAMETER :: M81N9TDzss= 13203 + INTEGER(IntKi), PARAMETER :: M82N1TDzss= 13204 + INTEGER(IntKi), PARAMETER :: M82N2TDzss= 13205 + INTEGER(IntKi), PARAMETER :: M82N3TDzss= 13206 + INTEGER(IntKi), PARAMETER :: M82N4TDzss= 13207 + INTEGER(IntKi), PARAMETER :: M82N5TDzss= 13208 + INTEGER(IntKi), PARAMETER :: M82N6TDzss= 13209 + INTEGER(IntKi), PARAMETER :: M82N7TDzss= 13210 + INTEGER(IntKi), PARAMETER :: M82N8TDzss= 13211 + INTEGER(IntKi), PARAMETER :: M82N9TDzss= 13212 + INTEGER(IntKi), PARAMETER :: M83N1TDzss= 13213 + INTEGER(IntKi), PARAMETER :: M83N2TDzss= 13214 + INTEGER(IntKi), PARAMETER :: M83N3TDzss= 13215 + INTEGER(IntKi), PARAMETER :: M83N4TDzss= 13216 + INTEGER(IntKi), PARAMETER :: M83N5TDzss= 13217 + INTEGER(IntKi), PARAMETER :: M83N6TDzss= 13218 + INTEGER(IntKi), PARAMETER :: M83N7TDzss= 13219 + INTEGER(IntKi), PARAMETER :: M83N8TDzss= 13220 + INTEGER(IntKi), PARAMETER :: M83N9TDzss= 13221 + INTEGER(IntKi), PARAMETER :: M84N1TDzss= 13222 + INTEGER(IntKi), PARAMETER :: M84N2TDzss= 13223 + INTEGER(IntKi), PARAMETER :: M84N3TDzss= 13224 + INTEGER(IntKi), PARAMETER :: M84N4TDzss= 13225 + INTEGER(IntKi), PARAMETER :: M84N5TDzss= 13226 + INTEGER(IntKi), PARAMETER :: M84N6TDzss= 13227 + INTEGER(IntKi), PARAMETER :: M84N7TDzss= 13228 + INTEGER(IntKi), PARAMETER :: M84N8TDzss= 13229 + INTEGER(IntKi), PARAMETER :: M84N9TDzss= 13230 + INTEGER(IntKi), PARAMETER :: M85N1TDzss= 13231 + INTEGER(IntKi), PARAMETER :: M85N2TDzss= 13232 + INTEGER(IntKi), PARAMETER :: M85N3TDzss= 13233 + INTEGER(IntKi), PARAMETER :: M85N4TDzss= 13234 + INTEGER(IntKi), PARAMETER :: M85N5TDzss= 13235 + INTEGER(IntKi), PARAMETER :: M85N6TDzss= 13236 + INTEGER(IntKi), PARAMETER :: M85N7TDzss= 13237 + INTEGER(IntKi), PARAMETER :: M85N8TDzss= 13238 + INTEGER(IntKi), PARAMETER :: M85N9TDzss= 13239 + INTEGER(IntKi), PARAMETER :: M86N1TDzss= 13240 + INTEGER(IntKi), PARAMETER :: M86N2TDzss= 13241 + INTEGER(IntKi), PARAMETER :: M86N3TDzss= 13242 + INTEGER(IntKi), PARAMETER :: M86N4TDzss= 13243 + INTEGER(IntKi), PARAMETER :: M86N5TDzss= 13244 + INTEGER(IntKi), PARAMETER :: M86N6TDzss= 13245 + INTEGER(IntKi), PARAMETER :: M86N7TDzss= 13246 + INTEGER(IntKi), PARAMETER :: M86N8TDzss= 13247 + INTEGER(IntKi), PARAMETER :: M86N9TDzss= 13248 + INTEGER(IntKi), PARAMETER :: M87N1TDzss= 13249 + INTEGER(IntKi), PARAMETER :: M87N2TDzss= 13250 + INTEGER(IntKi), PARAMETER :: M87N3TDzss= 13251 + INTEGER(IntKi), PARAMETER :: M87N4TDzss= 13252 + INTEGER(IntKi), PARAMETER :: M87N5TDzss= 13253 + INTEGER(IntKi), PARAMETER :: M87N6TDzss= 13254 + INTEGER(IntKi), PARAMETER :: M87N7TDzss= 13255 + INTEGER(IntKi), PARAMETER :: M87N8TDzss= 13256 + INTEGER(IntKi), PARAMETER :: M87N9TDzss= 13257 + INTEGER(IntKi), PARAMETER :: M88N1TDzss= 13258 + INTEGER(IntKi), PARAMETER :: M88N2TDzss= 13259 + INTEGER(IntKi), PARAMETER :: M88N3TDzss= 13260 + INTEGER(IntKi), PARAMETER :: M88N4TDzss= 13261 + INTEGER(IntKi), PARAMETER :: M88N5TDzss= 13262 + INTEGER(IntKi), PARAMETER :: M88N6TDzss= 13263 + INTEGER(IntKi), PARAMETER :: M88N7TDzss= 13264 + INTEGER(IntKi), PARAMETER :: M88N8TDzss= 13265 + INTEGER(IntKi), PARAMETER :: M88N9TDzss= 13266 + INTEGER(IntKi), PARAMETER :: M89N1TDzss= 13267 + INTEGER(IntKi), PARAMETER :: M89N2TDzss= 13268 + INTEGER(IntKi), PARAMETER :: M89N3TDzss= 13269 + INTEGER(IntKi), PARAMETER :: M89N4TDzss= 13270 + INTEGER(IntKi), PARAMETER :: M89N5TDzss= 13271 + INTEGER(IntKi), PARAMETER :: M89N6TDzss= 13272 + INTEGER(IntKi), PARAMETER :: M89N7TDzss= 13273 + INTEGER(IntKi), PARAMETER :: M89N8TDzss= 13274 + INTEGER(IntKi), PARAMETER :: M89N9TDzss= 13275 + INTEGER(IntKi), PARAMETER :: M90N1TDzss= 13276 + INTEGER(IntKi), PARAMETER :: M90N2TDzss= 13277 + INTEGER(IntKi), PARAMETER :: M90N3TDzss= 13278 + INTEGER(IntKi), PARAMETER :: M90N4TDzss= 13279 + INTEGER(IntKi), PARAMETER :: M90N5TDzss= 13280 + INTEGER(IntKi), PARAMETER :: M90N6TDzss= 13281 + INTEGER(IntKi), PARAMETER :: M90N7TDzss= 13282 + INTEGER(IntKi), PARAMETER :: M90N8TDzss= 13283 + INTEGER(IntKi), PARAMETER :: M90N9TDzss= 13284 + INTEGER(IntKi), PARAMETER :: M91N1TDzss= 13285 + INTEGER(IntKi), PARAMETER :: M91N2TDzss= 13286 + INTEGER(IntKi), PARAMETER :: M91N3TDzss= 13287 + INTEGER(IntKi), PARAMETER :: M91N4TDzss= 13288 + INTEGER(IntKi), PARAMETER :: M91N5TDzss= 13289 + INTEGER(IntKi), PARAMETER :: M91N6TDzss= 13290 + INTEGER(IntKi), PARAMETER :: M91N7TDzss= 13291 + INTEGER(IntKi), PARAMETER :: M91N8TDzss= 13292 + INTEGER(IntKi), PARAMETER :: M91N9TDzss= 13293 + INTEGER(IntKi), PARAMETER :: M92N1TDzss= 13294 + INTEGER(IntKi), PARAMETER :: M92N2TDzss= 13295 + INTEGER(IntKi), PARAMETER :: M92N3TDzss= 13296 + INTEGER(IntKi), PARAMETER :: M92N4TDzss= 13297 + INTEGER(IntKi), PARAMETER :: M92N5TDzss= 13298 + INTEGER(IntKi), PARAMETER :: M92N6TDzss= 13299 + INTEGER(IntKi), PARAMETER :: M92N7TDzss= 13300 + INTEGER(IntKi), PARAMETER :: M92N8TDzss= 13301 + INTEGER(IntKi), PARAMETER :: M92N9TDzss= 13302 + INTEGER(IntKi), PARAMETER :: M93N1TDzss= 13303 + INTEGER(IntKi), PARAMETER :: M93N2TDzss= 13304 + INTEGER(IntKi), PARAMETER :: M93N3TDzss= 13305 + INTEGER(IntKi), PARAMETER :: M93N4TDzss= 13306 + INTEGER(IntKi), PARAMETER :: M93N5TDzss= 13307 + INTEGER(IntKi), PARAMETER :: M93N6TDzss= 13308 + INTEGER(IntKi), PARAMETER :: M93N7TDzss= 13309 + INTEGER(IntKi), PARAMETER :: M93N8TDzss= 13310 + INTEGER(IntKi), PARAMETER :: M93N9TDzss= 13311 + INTEGER(IntKi), PARAMETER :: M94N1TDzss= 13312 + INTEGER(IntKi), PARAMETER :: M94N2TDzss= 13313 + INTEGER(IntKi), PARAMETER :: M94N3TDzss= 13314 + INTEGER(IntKi), PARAMETER :: M94N4TDzss= 13315 + INTEGER(IntKi), PARAMETER :: M94N5TDzss= 13316 + INTEGER(IntKi), PARAMETER :: M94N6TDzss= 13317 + INTEGER(IntKi), PARAMETER :: M94N7TDzss= 13318 + INTEGER(IntKi), PARAMETER :: M94N8TDzss= 13319 + INTEGER(IntKi), PARAMETER :: M94N9TDzss= 13320 + INTEGER(IntKi), PARAMETER :: M95N1TDzss= 13321 + INTEGER(IntKi), PARAMETER :: M95N2TDzss= 13322 + INTEGER(IntKi), PARAMETER :: M95N3TDzss= 13323 + INTEGER(IntKi), PARAMETER :: M95N4TDzss= 13324 + INTEGER(IntKi), PARAMETER :: M95N5TDzss= 13325 + INTEGER(IntKi), PARAMETER :: M95N6TDzss= 13326 + INTEGER(IntKi), PARAMETER :: M95N7TDzss= 13327 + INTEGER(IntKi), PARAMETER :: M95N8TDzss= 13328 + INTEGER(IntKi), PARAMETER :: M95N9TDzss= 13329 + INTEGER(IntKi), PARAMETER :: M96N1TDzss= 13330 + INTEGER(IntKi), PARAMETER :: M96N2TDzss= 13331 + INTEGER(IntKi), PARAMETER :: M96N3TDzss= 13332 + INTEGER(IntKi), PARAMETER :: M96N4TDzss= 13333 + INTEGER(IntKi), PARAMETER :: M96N5TDzss= 13334 + INTEGER(IntKi), PARAMETER :: M96N6TDzss= 13335 + INTEGER(IntKi), PARAMETER :: M96N7TDzss= 13336 + INTEGER(IntKi), PARAMETER :: M96N8TDzss= 13337 + INTEGER(IntKi), PARAMETER :: M96N9TDzss= 13338 + INTEGER(IntKi), PARAMETER :: M97N1TDzss= 13339 + INTEGER(IntKi), PARAMETER :: M97N2TDzss= 13340 + INTEGER(IntKi), PARAMETER :: M97N3TDzss= 13341 + INTEGER(IntKi), PARAMETER :: M97N4TDzss= 13342 + INTEGER(IntKi), PARAMETER :: M97N5TDzss= 13343 + INTEGER(IntKi), PARAMETER :: M97N6TDzss= 13344 + INTEGER(IntKi), PARAMETER :: M97N7TDzss= 13345 + INTEGER(IntKi), PARAMETER :: M97N8TDzss= 13346 + INTEGER(IntKi), PARAMETER :: M97N9TDzss= 13347 + INTEGER(IntKi), PARAMETER :: M98N1TDzss= 13348 + INTEGER(IntKi), PARAMETER :: M98N2TDzss= 13349 + INTEGER(IntKi), PARAMETER :: M98N3TDzss= 13350 + INTEGER(IntKi), PARAMETER :: M98N4TDzss= 13351 + INTEGER(IntKi), PARAMETER :: M98N5TDzss= 13352 + INTEGER(IntKi), PARAMETER :: M98N6TDzss= 13353 + INTEGER(IntKi), PARAMETER :: M98N7TDzss= 13354 + INTEGER(IntKi), PARAMETER :: M98N8TDzss= 13355 + INTEGER(IntKi), PARAMETER :: M98N9TDzss= 13356 + INTEGER(IntKi), PARAMETER :: M99N1TDzss= 13357 + INTEGER(IntKi), PARAMETER :: M99N2TDzss= 13358 + INTEGER(IntKi), PARAMETER :: M99N3TDzss= 13359 + INTEGER(IntKi), PARAMETER :: M99N4TDzss= 13360 + INTEGER(IntKi), PARAMETER :: M99N5TDzss= 13361 + INTEGER(IntKi), PARAMETER :: M99N6TDzss= 13362 + INTEGER(IntKi), PARAMETER :: M99N7TDzss= 13363 + INTEGER(IntKi), PARAMETER :: M99N8TDzss= 13364 + INTEGER(IntKi), PARAMETER :: M99N9TDzss= 13365 + INTEGER(IntKi), PARAMETER :: M01N1RDxe = 13366 + INTEGER(IntKi), PARAMETER :: M01N2RDxe = 13367 + INTEGER(IntKi), PARAMETER :: M01N3RDxe = 13368 + INTEGER(IntKi), PARAMETER :: M01N4RDxe = 13369 + INTEGER(IntKi), PARAMETER :: M01N5RDxe = 13370 + INTEGER(IntKi), PARAMETER :: M01N6RDxe = 13371 + INTEGER(IntKi), PARAMETER :: M01N7RDxe = 13372 + INTEGER(IntKi), PARAMETER :: M01N8RDxe = 13373 + INTEGER(IntKi), PARAMETER :: M01N9RDxe = 13374 + INTEGER(IntKi), PARAMETER :: M02N1RDxe = 13375 + INTEGER(IntKi), PARAMETER :: M02N2RDxe = 13376 + INTEGER(IntKi), PARAMETER :: M02N3RDxe = 13377 + INTEGER(IntKi), PARAMETER :: M02N4RDxe = 13378 + INTEGER(IntKi), PARAMETER :: M02N5RDxe = 13379 + INTEGER(IntKi), PARAMETER :: M02N6RDxe = 13380 + INTEGER(IntKi), PARAMETER :: M02N7RDxe = 13381 + INTEGER(IntKi), PARAMETER :: M02N8RDxe = 13382 + INTEGER(IntKi), PARAMETER :: M02N9RDxe = 13383 + INTEGER(IntKi), PARAMETER :: M03N1RDxe = 13384 + INTEGER(IntKi), PARAMETER :: M03N2RDxe = 13385 + INTEGER(IntKi), PARAMETER :: M03N3RDxe = 13386 + INTEGER(IntKi), PARAMETER :: M03N4RDxe = 13387 + INTEGER(IntKi), PARAMETER :: M03N5RDxe = 13388 + INTEGER(IntKi), PARAMETER :: M03N6RDxe = 13389 + INTEGER(IntKi), PARAMETER :: M03N7RDxe = 13390 + INTEGER(IntKi), PARAMETER :: M03N8RDxe = 13391 + INTEGER(IntKi), PARAMETER :: M03N9RDxe = 13392 + INTEGER(IntKi), PARAMETER :: M04N1RDxe = 13393 + INTEGER(IntKi), PARAMETER :: M04N2RDxe = 13394 + INTEGER(IntKi), PARAMETER :: M04N3RDxe = 13395 + INTEGER(IntKi), PARAMETER :: M04N4RDxe = 13396 + INTEGER(IntKi), PARAMETER :: M04N5RDxe = 13397 + INTEGER(IntKi), PARAMETER :: M04N6RDxe = 13398 + INTEGER(IntKi), PARAMETER :: M04N7RDxe = 13399 + INTEGER(IntKi), PARAMETER :: M04N8RDxe = 13400 + INTEGER(IntKi), PARAMETER :: M04N9RDxe = 13401 + INTEGER(IntKi), PARAMETER :: M05N1RDxe = 13402 + INTEGER(IntKi), PARAMETER :: M05N2RDxe = 13403 + INTEGER(IntKi), PARAMETER :: M05N3RDxe = 13404 + INTEGER(IntKi), PARAMETER :: M05N4RDxe = 13405 + INTEGER(IntKi), PARAMETER :: M05N5RDxe = 13406 + INTEGER(IntKi), PARAMETER :: M05N6RDxe = 13407 + INTEGER(IntKi), PARAMETER :: M05N7RDxe = 13408 + INTEGER(IntKi), PARAMETER :: M05N8RDxe = 13409 + INTEGER(IntKi), PARAMETER :: M05N9RDxe = 13410 + INTEGER(IntKi), PARAMETER :: M06N1RDxe = 13411 + INTEGER(IntKi), PARAMETER :: M06N2RDxe = 13412 + INTEGER(IntKi), PARAMETER :: M06N3RDxe = 13413 + INTEGER(IntKi), PARAMETER :: M06N4RDxe = 13414 + INTEGER(IntKi), PARAMETER :: M06N5RDxe = 13415 + INTEGER(IntKi), PARAMETER :: M06N6RDxe = 13416 + INTEGER(IntKi), PARAMETER :: M06N7RDxe = 13417 + INTEGER(IntKi), PARAMETER :: M06N8RDxe = 13418 + INTEGER(IntKi), PARAMETER :: M06N9RDxe = 13419 + INTEGER(IntKi), PARAMETER :: M07N1RDxe = 13420 + INTEGER(IntKi), PARAMETER :: M07N2RDxe = 13421 + INTEGER(IntKi), PARAMETER :: M07N3RDxe = 13422 + INTEGER(IntKi), PARAMETER :: M07N4RDxe = 13423 + INTEGER(IntKi), PARAMETER :: M07N5RDxe = 13424 + INTEGER(IntKi), PARAMETER :: M07N6RDxe = 13425 + INTEGER(IntKi), PARAMETER :: M07N7RDxe = 13426 + INTEGER(IntKi), PARAMETER :: M07N8RDxe = 13427 + INTEGER(IntKi), PARAMETER :: M07N9RDxe = 13428 + INTEGER(IntKi), PARAMETER :: M08N1RDxe = 13429 + INTEGER(IntKi), PARAMETER :: M08N2RDxe = 13430 + INTEGER(IntKi), PARAMETER :: M08N3RDxe = 13431 + INTEGER(IntKi), PARAMETER :: M08N4RDxe = 13432 + INTEGER(IntKi), PARAMETER :: M08N5RDxe = 13433 + INTEGER(IntKi), PARAMETER :: M08N6RDxe = 13434 + INTEGER(IntKi), PARAMETER :: M08N7RDxe = 13435 + INTEGER(IntKi), PARAMETER :: M08N8RDxe = 13436 + INTEGER(IntKi), PARAMETER :: M08N9RDxe = 13437 + INTEGER(IntKi), PARAMETER :: M09N1RDxe = 13438 + INTEGER(IntKi), PARAMETER :: M09N2RDxe = 13439 + INTEGER(IntKi), PARAMETER :: M09N3RDxe = 13440 + INTEGER(IntKi), PARAMETER :: M09N4RDxe = 13441 + INTEGER(IntKi), PARAMETER :: M09N5RDxe = 13442 + INTEGER(IntKi), PARAMETER :: M09N6RDxe = 13443 + INTEGER(IntKi), PARAMETER :: M09N7RDxe = 13444 + INTEGER(IntKi), PARAMETER :: M09N8RDxe = 13445 + INTEGER(IntKi), PARAMETER :: M09N9RDxe = 13446 + INTEGER(IntKi), PARAMETER :: M10N1RDxe = 13447 + INTEGER(IntKi), PARAMETER :: M10N2RDxe = 13448 + INTEGER(IntKi), PARAMETER :: M10N3RDxe = 13449 + INTEGER(IntKi), PARAMETER :: M10N4RDxe = 13450 + INTEGER(IntKi), PARAMETER :: M10N5RDxe = 13451 + INTEGER(IntKi), PARAMETER :: M10N6RDxe = 13452 + INTEGER(IntKi), PARAMETER :: M10N7RDxe = 13453 + INTEGER(IntKi), PARAMETER :: M10N8RDxe = 13454 + INTEGER(IntKi), PARAMETER :: M10N9RDxe = 13455 + INTEGER(IntKi), PARAMETER :: M11N1RDxe = 13456 + INTEGER(IntKi), PARAMETER :: M11N2RDxe = 13457 + INTEGER(IntKi), PARAMETER :: M11N3RDxe = 13458 + INTEGER(IntKi), PARAMETER :: M11N4RDxe = 13459 + INTEGER(IntKi), PARAMETER :: M11N5RDxe = 13460 + INTEGER(IntKi), PARAMETER :: M11N6RDxe = 13461 + INTEGER(IntKi), PARAMETER :: M11N7RDxe = 13462 + INTEGER(IntKi), PARAMETER :: M11N8RDxe = 13463 + INTEGER(IntKi), PARAMETER :: M11N9RDxe = 13464 + INTEGER(IntKi), PARAMETER :: M12N1RDxe = 13465 + INTEGER(IntKi), PARAMETER :: M12N2RDxe = 13466 + INTEGER(IntKi), PARAMETER :: M12N3RDxe = 13467 + INTEGER(IntKi), PARAMETER :: M12N4RDxe = 13468 + INTEGER(IntKi), PARAMETER :: M12N5RDxe = 13469 + INTEGER(IntKi), PARAMETER :: M12N6RDxe = 13470 + INTEGER(IntKi), PARAMETER :: M12N7RDxe = 13471 + INTEGER(IntKi), PARAMETER :: M12N8RDxe = 13472 + INTEGER(IntKi), PARAMETER :: M12N9RDxe = 13473 + INTEGER(IntKi), PARAMETER :: M13N1RDxe = 13474 + INTEGER(IntKi), PARAMETER :: M13N2RDxe = 13475 + INTEGER(IntKi), PARAMETER :: M13N3RDxe = 13476 + INTEGER(IntKi), PARAMETER :: M13N4RDxe = 13477 + INTEGER(IntKi), PARAMETER :: M13N5RDxe = 13478 + INTEGER(IntKi), PARAMETER :: M13N6RDxe = 13479 + INTEGER(IntKi), PARAMETER :: M13N7RDxe = 13480 + INTEGER(IntKi), PARAMETER :: M13N8RDxe = 13481 + INTEGER(IntKi), PARAMETER :: M13N9RDxe = 13482 + INTEGER(IntKi), PARAMETER :: M14N1RDxe = 13483 + INTEGER(IntKi), PARAMETER :: M14N2RDxe = 13484 + INTEGER(IntKi), PARAMETER :: M14N3RDxe = 13485 + INTEGER(IntKi), PARAMETER :: M14N4RDxe = 13486 + INTEGER(IntKi), PARAMETER :: M14N5RDxe = 13487 + INTEGER(IntKi), PARAMETER :: M14N6RDxe = 13488 + INTEGER(IntKi), PARAMETER :: M14N7RDxe = 13489 + INTEGER(IntKi), PARAMETER :: M14N8RDxe = 13490 + INTEGER(IntKi), PARAMETER :: M14N9RDxe = 13491 + INTEGER(IntKi), PARAMETER :: M15N1RDxe = 13492 + INTEGER(IntKi), PARAMETER :: M15N2RDxe = 13493 + INTEGER(IntKi), PARAMETER :: M15N3RDxe = 13494 + INTEGER(IntKi), PARAMETER :: M15N4RDxe = 13495 + INTEGER(IntKi), PARAMETER :: M15N5RDxe = 13496 + INTEGER(IntKi), PARAMETER :: M15N6RDxe = 13497 + INTEGER(IntKi), PARAMETER :: M15N7RDxe = 13498 + INTEGER(IntKi), PARAMETER :: M15N8RDxe = 13499 + INTEGER(IntKi), PARAMETER :: M15N9RDxe = 13500 + INTEGER(IntKi), PARAMETER :: M16N1RDxe = 13501 + INTEGER(IntKi), PARAMETER :: M16N2RDxe = 13502 + INTEGER(IntKi), PARAMETER :: M16N3RDxe = 13503 + INTEGER(IntKi), PARAMETER :: M16N4RDxe = 13504 + INTEGER(IntKi), PARAMETER :: M16N5RDxe = 13505 + INTEGER(IntKi), PARAMETER :: M16N6RDxe = 13506 + INTEGER(IntKi), PARAMETER :: M16N7RDxe = 13507 + INTEGER(IntKi), PARAMETER :: M16N8RDxe = 13508 + INTEGER(IntKi), PARAMETER :: M16N9RDxe = 13509 + INTEGER(IntKi), PARAMETER :: M17N1RDxe = 13510 + INTEGER(IntKi), PARAMETER :: M17N2RDxe = 13511 + INTEGER(IntKi), PARAMETER :: M17N3RDxe = 13512 + INTEGER(IntKi), PARAMETER :: M17N4RDxe = 13513 + INTEGER(IntKi), PARAMETER :: M17N5RDxe = 13514 + INTEGER(IntKi), PARAMETER :: M17N6RDxe = 13515 + INTEGER(IntKi), PARAMETER :: M17N7RDxe = 13516 + INTEGER(IntKi), PARAMETER :: M17N8RDxe = 13517 + INTEGER(IntKi), PARAMETER :: M17N9RDxe = 13518 + INTEGER(IntKi), PARAMETER :: M18N1RDxe = 13519 + INTEGER(IntKi), PARAMETER :: M18N2RDxe = 13520 + INTEGER(IntKi), PARAMETER :: M18N3RDxe = 13521 + INTEGER(IntKi), PARAMETER :: M18N4RDxe = 13522 + INTEGER(IntKi), PARAMETER :: M18N5RDxe = 13523 + INTEGER(IntKi), PARAMETER :: M18N6RDxe = 13524 + INTEGER(IntKi), PARAMETER :: M18N7RDxe = 13525 + INTEGER(IntKi), PARAMETER :: M18N8RDxe = 13526 + INTEGER(IntKi), PARAMETER :: M18N9RDxe = 13527 + INTEGER(IntKi), PARAMETER :: M19N1RDxe = 13528 + INTEGER(IntKi), PARAMETER :: M19N2RDxe = 13529 + INTEGER(IntKi), PARAMETER :: M19N3RDxe = 13530 + INTEGER(IntKi), PARAMETER :: M19N4RDxe = 13531 + INTEGER(IntKi), PARAMETER :: M19N5RDxe = 13532 + INTEGER(IntKi), PARAMETER :: M19N6RDxe = 13533 + INTEGER(IntKi), PARAMETER :: M19N7RDxe = 13534 + INTEGER(IntKi), PARAMETER :: M19N8RDxe = 13535 + INTEGER(IntKi), PARAMETER :: M19N9RDxe = 13536 + INTEGER(IntKi), PARAMETER :: M20N1RDxe = 13537 + INTEGER(IntKi), PARAMETER :: M20N2RDxe = 13538 + INTEGER(IntKi), PARAMETER :: M20N3RDxe = 13539 + INTEGER(IntKi), PARAMETER :: M20N4RDxe = 13540 + INTEGER(IntKi), PARAMETER :: M20N5RDxe = 13541 + INTEGER(IntKi), PARAMETER :: M20N6RDxe = 13542 + INTEGER(IntKi), PARAMETER :: M20N7RDxe = 13543 + INTEGER(IntKi), PARAMETER :: M20N8RDxe = 13544 + INTEGER(IntKi), PARAMETER :: M20N9RDxe = 13545 + INTEGER(IntKi), PARAMETER :: M21N1RDxe = 13546 + INTEGER(IntKi), PARAMETER :: M21N2RDxe = 13547 + INTEGER(IntKi), PARAMETER :: M21N3RDxe = 13548 + INTEGER(IntKi), PARAMETER :: M21N4RDxe = 13549 + INTEGER(IntKi), PARAMETER :: M21N5RDxe = 13550 + INTEGER(IntKi), PARAMETER :: M21N6RDxe = 13551 + INTEGER(IntKi), PARAMETER :: M21N7RDxe = 13552 + INTEGER(IntKi), PARAMETER :: M21N8RDxe = 13553 + INTEGER(IntKi), PARAMETER :: M21N9RDxe = 13554 + INTEGER(IntKi), PARAMETER :: M22N1RDxe = 13555 + INTEGER(IntKi), PARAMETER :: M22N2RDxe = 13556 + INTEGER(IntKi), PARAMETER :: M22N3RDxe = 13557 + INTEGER(IntKi), PARAMETER :: M22N4RDxe = 13558 + INTEGER(IntKi), PARAMETER :: M22N5RDxe = 13559 + INTEGER(IntKi), PARAMETER :: M22N6RDxe = 13560 + INTEGER(IntKi), PARAMETER :: M22N7RDxe = 13561 + INTEGER(IntKi), PARAMETER :: M22N8RDxe = 13562 + INTEGER(IntKi), PARAMETER :: M22N9RDxe = 13563 + INTEGER(IntKi), PARAMETER :: M23N1RDxe = 13564 + INTEGER(IntKi), PARAMETER :: M23N2RDxe = 13565 + INTEGER(IntKi), PARAMETER :: M23N3RDxe = 13566 + INTEGER(IntKi), PARAMETER :: M23N4RDxe = 13567 + INTEGER(IntKi), PARAMETER :: M23N5RDxe = 13568 + INTEGER(IntKi), PARAMETER :: M23N6RDxe = 13569 + INTEGER(IntKi), PARAMETER :: M23N7RDxe = 13570 + INTEGER(IntKi), PARAMETER :: M23N8RDxe = 13571 + INTEGER(IntKi), PARAMETER :: M23N9RDxe = 13572 + INTEGER(IntKi), PARAMETER :: M24N1RDxe = 13573 + INTEGER(IntKi), PARAMETER :: M24N2RDxe = 13574 + INTEGER(IntKi), PARAMETER :: M24N3RDxe = 13575 + INTEGER(IntKi), PARAMETER :: M24N4RDxe = 13576 + INTEGER(IntKi), PARAMETER :: M24N5RDxe = 13577 + INTEGER(IntKi), PARAMETER :: M24N6RDxe = 13578 + INTEGER(IntKi), PARAMETER :: M24N7RDxe = 13579 + INTEGER(IntKi), PARAMETER :: M24N8RDxe = 13580 + INTEGER(IntKi), PARAMETER :: M24N9RDxe = 13581 + INTEGER(IntKi), PARAMETER :: M25N1RDxe = 13582 + INTEGER(IntKi), PARAMETER :: M25N2RDxe = 13583 + INTEGER(IntKi), PARAMETER :: M25N3RDxe = 13584 + INTEGER(IntKi), PARAMETER :: M25N4RDxe = 13585 + INTEGER(IntKi), PARAMETER :: M25N5RDxe = 13586 + INTEGER(IntKi), PARAMETER :: M25N6RDxe = 13587 + INTEGER(IntKi), PARAMETER :: M25N7RDxe = 13588 + INTEGER(IntKi), PARAMETER :: M25N8RDxe = 13589 + INTEGER(IntKi), PARAMETER :: M25N9RDxe = 13590 + INTEGER(IntKi), PARAMETER :: M26N1RDxe = 13591 + INTEGER(IntKi), PARAMETER :: M26N2RDxe = 13592 + INTEGER(IntKi), PARAMETER :: M26N3RDxe = 13593 + INTEGER(IntKi), PARAMETER :: M26N4RDxe = 13594 + INTEGER(IntKi), PARAMETER :: M26N5RDxe = 13595 + INTEGER(IntKi), PARAMETER :: M26N6RDxe = 13596 + INTEGER(IntKi), PARAMETER :: M26N7RDxe = 13597 + INTEGER(IntKi), PARAMETER :: M26N8RDxe = 13598 + INTEGER(IntKi), PARAMETER :: M26N9RDxe = 13599 + INTEGER(IntKi), PARAMETER :: M27N1RDxe = 13600 + INTEGER(IntKi), PARAMETER :: M27N2RDxe = 13601 + INTEGER(IntKi), PARAMETER :: M27N3RDxe = 13602 + INTEGER(IntKi), PARAMETER :: M27N4RDxe = 13603 + INTEGER(IntKi), PARAMETER :: M27N5RDxe = 13604 + INTEGER(IntKi), PARAMETER :: M27N6RDxe = 13605 + INTEGER(IntKi), PARAMETER :: M27N7RDxe = 13606 + INTEGER(IntKi), PARAMETER :: M27N8RDxe = 13607 + INTEGER(IntKi), PARAMETER :: M27N9RDxe = 13608 + INTEGER(IntKi), PARAMETER :: M28N1RDxe = 13609 + INTEGER(IntKi), PARAMETER :: M28N2RDxe = 13610 + INTEGER(IntKi), PARAMETER :: M28N3RDxe = 13611 + INTEGER(IntKi), PARAMETER :: M28N4RDxe = 13612 + INTEGER(IntKi), PARAMETER :: M28N5RDxe = 13613 + INTEGER(IntKi), PARAMETER :: M28N6RDxe = 13614 + INTEGER(IntKi), PARAMETER :: M28N7RDxe = 13615 + INTEGER(IntKi), PARAMETER :: M28N8RDxe = 13616 + INTEGER(IntKi), PARAMETER :: M28N9RDxe = 13617 + INTEGER(IntKi), PARAMETER :: M29N1RDxe = 13618 + INTEGER(IntKi), PARAMETER :: M29N2RDxe = 13619 + INTEGER(IntKi), PARAMETER :: M29N3RDxe = 13620 + INTEGER(IntKi), PARAMETER :: M29N4RDxe = 13621 + INTEGER(IntKi), PARAMETER :: M29N5RDxe = 13622 + INTEGER(IntKi), PARAMETER :: M29N6RDxe = 13623 + INTEGER(IntKi), PARAMETER :: M29N7RDxe = 13624 + INTEGER(IntKi), PARAMETER :: M29N8RDxe = 13625 + INTEGER(IntKi), PARAMETER :: M29N9RDxe = 13626 + INTEGER(IntKi), PARAMETER :: M30N1RDxe = 13627 + INTEGER(IntKi), PARAMETER :: M30N2RDxe = 13628 + INTEGER(IntKi), PARAMETER :: M30N3RDxe = 13629 + INTEGER(IntKi), PARAMETER :: M30N4RDxe = 13630 + INTEGER(IntKi), PARAMETER :: M30N5RDxe = 13631 + INTEGER(IntKi), PARAMETER :: M30N6RDxe = 13632 + INTEGER(IntKi), PARAMETER :: M30N7RDxe = 13633 + INTEGER(IntKi), PARAMETER :: M30N8RDxe = 13634 + INTEGER(IntKi), PARAMETER :: M30N9RDxe = 13635 + INTEGER(IntKi), PARAMETER :: M31N1RDxe = 13636 + INTEGER(IntKi), PARAMETER :: M31N2RDxe = 13637 + INTEGER(IntKi), PARAMETER :: M31N3RDxe = 13638 + INTEGER(IntKi), PARAMETER :: M31N4RDxe = 13639 + INTEGER(IntKi), PARAMETER :: M31N5RDxe = 13640 + INTEGER(IntKi), PARAMETER :: M31N6RDxe = 13641 + INTEGER(IntKi), PARAMETER :: M31N7RDxe = 13642 + INTEGER(IntKi), PARAMETER :: M31N8RDxe = 13643 + INTEGER(IntKi), PARAMETER :: M31N9RDxe = 13644 + INTEGER(IntKi), PARAMETER :: M32N1RDxe = 13645 + INTEGER(IntKi), PARAMETER :: M32N2RDxe = 13646 + INTEGER(IntKi), PARAMETER :: M32N3RDxe = 13647 + INTEGER(IntKi), PARAMETER :: M32N4RDxe = 13648 + INTEGER(IntKi), PARAMETER :: M32N5RDxe = 13649 + INTEGER(IntKi), PARAMETER :: M32N6RDxe = 13650 + INTEGER(IntKi), PARAMETER :: M32N7RDxe = 13651 + INTEGER(IntKi), PARAMETER :: M32N8RDxe = 13652 + INTEGER(IntKi), PARAMETER :: M32N9RDxe = 13653 + INTEGER(IntKi), PARAMETER :: M33N1RDxe = 13654 + INTEGER(IntKi), PARAMETER :: M33N2RDxe = 13655 + INTEGER(IntKi), PARAMETER :: M33N3RDxe = 13656 + INTEGER(IntKi), PARAMETER :: M33N4RDxe = 13657 + INTEGER(IntKi), PARAMETER :: M33N5RDxe = 13658 + INTEGER(IntKi), PARAMETER :: M33N6RDxe = 13659 + INTEGER(IntKi), PARAMETER :: M33N7RDxe = 13660 + INTEGER(IntKi), PARAMETER :: M33N8RDxe = 13661 + INTEGER(IntKi), PARAMETER :: M33N9RDxe = 13662 + INTEGER(IntKi), PARAMETER :: M34N1RDxe = 13663 + INTEGER(IntKi), PARAMETER :: M34N2RDxe = 13664 + INTEGER(IntKi), PARAMETER :: M34N3RDxe = 13665 + INTEGER(IntKi), PARAMETER :: M34N4RDxe = 13666 + INTEGER(IntKi), PARAMETER :: M34N5RDxe = 13667 + INTEGER(IntKi), PARAMETER :: M34N6RDxe = 13668 + INTEGER(IntKi), PARAMETER :: M34N7RDxe = 13669 + INTEGER(IntKi), PARAMETER :: M34N8RDxe = 13670 + INTEGER(IntKi), PARAMETER :: M34N9RDxe = 13671 + INTEGER(IntKi), PARAMETER :: M35N1RDxe = 13672 + INTEGER(IntKi), PARAMETER :: M35N2RDxe = 13673 + INTEGER(IntKi), PARAMETER :: M35N3RDxe = 13674 + INTEGER(IntKi), PARAMETER :: M35N4RDxe = 13675 + INTEGER(IntKi), PARAMETER :: M35N5RDxe = 13676 + INTEGER(IntKi), PARAMETER :: M35N6RDxe = 13677 + INTEGER(IntKi), PARAMETER :: M35N7RDxe = 13678 + INTEGER(IntKi), PARAMETER :: M35N8RDxe = 13679 + INTEGER(IntKi), PARAMETER :: M35N9RDxe = 13680 + INTEGER(IntKi), PARAMETER :: M36N1RDxe = 13681 + INTEGER(IntKi), PARAMETER :: M36N2RDxe = 13682 + INTEGER(IntKi), PARAMETER :: M36N3RDxe = 13683 + INTEGER(IntKi), PARAMETER :: M36N4RDxe = 13684 + INTEGER(IntKi), PARAMETER :: M36N5RDxe = 13685 + INTEGER(IntKi), PARAMETER :: M36N6RDxe = 13686 + INTEGER(IntKi), PARAMETER :: M36N7RDxe = 13687 + INTEGER(IntKi), PARAMETER :: M36N8RDxe = 13688 + INTEGER(IntKi), PARAMETER :: M36N9RDxe = 13689 + INTEGER(IntKi), PARAMETER :: M37N1RDxe = 13690 + INTEGER(IntKi), PARAMETER :: M37N2RDxe = 13691 + INTEGER(IntKi), PARAMETER :: M37N3RDxe = 13692 + INTEGER(IntKi), PARAMETER :: M37N4RDxe = 13693 + INTEGER(IntKi), PARAMETER :: M37N5RDxe = 13694 + INTEGER(IntKi), PARAMETER :: M37N6RDxe = 13695 + INTEGER(IntKi), PARAMETER :: M37N7RDxe = 13696 + INTEGER(IntKi), PARAMETER :: M37N8RDxe = 13697 + INTEGER(IntKi), PARAMETER :: M37N9RDxe = 13698 + INTEGER(IntKi), PARAMETER :: M38N1RDxe = 13699 + INTEGER(IntKi), PARAMETER :: M38N2RDxe = 13700 + INTEGER(IntKi), PARAMETER :: M38N3RDxe = 13701 + INTEGER(IntKi), PARAMETER :: M38N4RDxe = 13702 + INTEGER(IntKi), PARAMETER :: M38N5RDxe = 13703 + INTEGER(IntKi), PARAMETER :: M38N6RDxe = 13704 + INTEGER(IntKi), PARAMETER :: M38N7RDxe = 13705 + INTEGER(IntKi), PARAMETER :: M38N8RDxe = 13706 + INTEGER(IntKi), PARAMETER :: M38N9RDxe = 13707 + INTEGER(IntKi), PARAMETER :: M39N1RDxe = 13708 + INTEGER(IntKi), PARAMETER :: M39N2RDxe = 13709 + INTEGER(IntKi), PARAMETER :: M39N3RDxe = 13710 + INTEGER(IntKi), PARAMETER :: M39N4RDxe = 13711 + INTEGER(IntKi), PARAMETER :: M39N5RDxe = 13712 + INTEGER(IntKi), PARAMETER :: M39N6RDxe = 13713 + INTEGER(IntKi), PARAMETER :: M39N7RDxe = 13714 + INTEGER(IntKi), PARAMETER :: M39N8RDxe = 13715 + INTEGER(IntKi), PARAMETER :: M39N9RDxe = 13716 + INTEGER(IntKi), PARAMETER :: M40N1RDxe = 13717 + INTEGER(IntKi), PARAMETER :: M40N2RDxe = 13718 + INTEGER(IntKi), PARAMETER :: M40N3RDxe = 13719 + INTEGER(IntKi), PARAMETER :: M40N4RDxe = 13720 + INTEGER(IntKi), PARAMETER :: M40N5RDxe = 13721 + INTEGER(IntKi), PARAMETER :: M40N6RDxe = 13722 + INTEGER(IntKi), PARAMETER :: M40N7RDxe = 13723 + INTEGER(IntKi), PARAMETER :: M40N8RDxe = 13724 + INTEGER(IntKi), PARAMETER :: M40N9RDxe = 13725 + INTEGER(IntKi), PARAMETER :: M41N1RDxe = 13726 + INTEGER(IntKi), PARAMETER :: M41N2RDxe = 13727 + INTEGER(IntKi), PARAMETER :: M41N3RDxe = 13728 + INTEGER(IntKi), PARAMETER :: M41N4RDxe = 13729 + INTEGER(IntKi), PARAMETER :: M41N5RDxe = 13730 + INTEGER(IntKi), PARAMETER :: M41N6RDxe = 13731 + INTEGER(IntKi), PARAMETER :: M41N7RDxe = 13732 + INTEGER(IntKi), PARAMETER :: M41N8RDxe = 13733 + INTEGER(IntKi), PARAMETER :: M41N9RDxe = 13734 + INTEGER(IntKi), PARAMETER :: M42N1RDxe = 13735 + INTEGER(IntKi), PARAMETER :: M42N2RDxe = 13736 + INTEGER(IntKi), PARAMETER :: M42N3RDxe = 13737 + INTEGER(IntKi), PARAMETER :: M42N4RDxe = 13738 + INTEGER(IntKi), PARAMETER :: M42N5RDxe = 13739 + INTEGER(IntKi), PARAMETER :: M42N6RDxe = 13740 + INTEGER(IntKi), PARAMETER :: M42N7RDxe = 13741 + INTEGER(IntKi), PARAMETER :: M42N8RDxe = 13742 + INTEGER(IntKi), PARAMETER :: M42N9RDxe = 13743 + INTEGER(IntKi), PARAMETER :: M43N1RDxe = 13744 + INTEGER(IntKi), PARAMETER :: M43N2RDxe = 13745 + INTEGER(IntKi), PARAMETER :: M43N3RDxe = 13746 + INTEGER(IntKi), PARAMETER :: M43N4RDxe = 13747 + INTEGER(IntKi), PARAMETER :: M43N5RDxe = 13748 + INTEGER(IntKi), PARAMETER :: M43N6RDxe = 13749 + INTEGER(IntKi), PARAMETER :: M43N7RDxe = 13750 + INTEGER(IntKi), PARAMETER :: M43N8RDxe = 13751 + INTEGER(IntKi), PARAMETER :: M43N9RDxe = 13752 + INTEGER(IntKi), PARAMETER :: M44N1RDxe = 13753 + INTEGER(IntKi), PARAMETER :: M44N2RDxe = 13754 + INTEGER(IntKi), PARAMETER :: M44N3RDxe = 13755 + INTEGER(IntKi), PARAMETER :: M44N4RDxe = 13756 + INTEGER(IntKi), PARAMETER :: M44N5RDxe = 13757 + INTEGER(IntKi), PARAMETER :: M44N6RDxe = 13758 + INTEGER(IntKi), PARAMETER :: M44N7RDxe = 13759 + INTEGER(IntKi), PARAMETER :: M44N8RDxe = 13760 + INTEGER(IntKi), PARAMETER :: M44N9RDxe = 13761 + INTEGER(IntKi), PARAMETER :: M45N1RDxe = 13762 + INTEGER(IntKi), PARAMETER :: M45N2RDxe = 13763 + INTEGER(IntKi), PARAMETER :: M45N3RDxe = 13764 + INTEGER(IntKi), PARAMETER :: M45N4RDxe = 13765 + INTEGER(IntKi), PARAMETER :: M45N5RDxe = 13766 + INTEGER(IntKi), PARAMETER :: M45N6RDxe = 13767 + INTEGER(IntKi), PARAMETER :: M45N7RDxe = 13768 + INTEGER(IntKi), PARAMETER :: M45N8RDxe = 13769 + INTEGER(IntKi), PARAMETER :: M45N9RDxe = 13770 + INTEGER(IntKi), PARAMETER :: M46N1RDxe = 13771 + INTEGER(IntKi), PARAMETER :: M46N2RDxe = 13772 + INTEGER(IntKi), PARAMETER :: M46N3RDxe = 13773 + INTEGER(IntKi), PARAMETER :: M46N4RDxe = 13774 + INTEGER(IntKi), PARAMETER :: M46N5RDxe = 13775 + INTEGER(IntKi), PARAMETER :: M46N6RDxe = 13776 + INTEGER(IntKi), PARAMETER :: M46N7RDxe = 13777 + INTEGER(IntKi), PARAMETER :: M46N8RDxe = 13778 + INTEGER(IntKi), PARAMETER :: M46N9RDxe = 13779 + INTEGER(IntKi), PARAMETER :: M47N1RDxe = 13780 + INTEGER(IntKi), PARAMETER :: M47N2RDxe = 13781 + INTEGER(IntKi), PARAMETER :: M47N3RDxe = 13782 + INTEGER(IntKi), PARAMETER :: M47N4RDxe = 13783 + INTEGER(IntKi), PARAMETER :: M47N5RDxe = 13784 + INTEGER(IntKi), PARAMETER :: M47N6RDxe = 13785 + INTEGER(IntKi), PARAMETER :: M47N7RDxe = 13786 + INTEGER(IntKi), PARAMETER :: M47N8RDxe = 13787 + INTEGER(IntKi), PARAMETER :: M47N9RDxe = 13788 + INTEGER(IntKi), PARAMETER :: M48N1RDxe = 13789 + INTEGER(IntKi), PARAMETER :: M48N2RDxe = 13790 + INTEGER(IntKi), PARAMETER :: M48N3RDxe = 13791 + INTEGER(IntKi), PARAMETER :: M48N4RDxe = 13792 + INTEGER(IntKi), PARAMETER :: M48N5RDxe = 13793 + INTEGER(IntKi), PARAMETER :: M48N6RDxe = 13794 + INTEGER(IntKi), PARAMETER :: M48N7RDxe = 13795 + INTEGER(IntKi), PARAMETER :: M48N8RDxe = 13796 + INTEGER(IntKi), PARAMETER :: M48N9RDxe = 13797 + INTEGER(IntKi), PARAMETER :: M49N1RDxe = 13798 + INTEGER(IntKi), PARAMETER :: M49N2RDxe = 13799 + INTEGER(IntKi), PARAMETER :: M49N3RDxe = 13800 + INTEGER(IntKi), PARAMETER :: M49N4RDxe = 13801 + INTEGER(IntKi), PARAMETER :: M49N5RDxe = 13802 + INTEGER(IntKi), PARAMETER :: M49N6RDxe = 13803 + INTEGER(IntKi), PARAMETER :: M49N7RDxe = 13804 + INTEGER(IntKi), PARAMETER :: M49N8RDxe = 13805 + INTEGER(IntKi), PARAMETER :: M49N9RDxe = 13806 + INTEGER(IntKi), PARAMETER :: M50N1RDxe = 13807 + INTEGER(IntKi), PARAMETER :: M50N2RDxe = 13808 + INTEGER(IntKi), PARAMETER :: M50N3RDxe = 13809 + INTEGER(IntKi), PARAMETER :: M50N4RDxe = 13810 + INTEGER(IntKi), PARAMETER :: M50N5RDxe = 13811 + INTEGER(IntKi), PARAMETER :: M50N6RDxe = 13812 + INTEGER(IntKi), PARAMETER :: M50N7RDxe = 13813 + INTEGER(IntKi), PARAMETER :: M50N8RDxe = 13814 + INTEGER(IntKi), PARAMETER :: M50N9RDxe = 13815 + INTEGER(IntKi), PARAMETER :: M51N1RDxe = 13816 + INTEGER(IntKi), PARAMETER :: M51N2RDxe = 13817 + INTEGER(IntKi), PARAMETER :: M51N3RDxe = 13818 + INTEGER(IntKi), PARAMETER :: M51N4RDxe = 13819 + INTEGER(IntKi), PARAMETER :: M51N5RDxe = 13820 + INTEGER(IntKi), PARAMETER :: M51N6RDxe = 13821 + INTEGER(IntKi), PARAMETER :: M51N7RDxe = 13822 + INTEGER(IntKi), PARAMETER :: M51N8RDxe = 13823 + INTEGER(IntKi), PARAMETER :: M51N9RDxe = 13824 + INTEGER(IntKi), PARAMETER :: M52N1RDxe = 13825 + INTEGER(IntKi), PARAMETER :: M52N2RDxe = 13826 + INTEGER(IntKi), PARAMETER :: M52N3RDxe = 13827 + INTEGER(IntKi), PARAMETER :: M52N4RDxe = 13828 + INTEGER(IntKi), PARAMETER :: M52N5RDxe = 13829 + INTEGER(IntKi), PARAMETER :: M52N6RDxe = 13830 + INTEGER(IntKi), PARAMETER :: M52N7RDxe = 13831 + INTEGER(IntKi), PARAMETER :: M52N8RDxe = 13832 + INTEGER(IntKi), PARAMETER :: M52N9RDxe = 13833 + INTEGER(IntKi), PARAMETER :: M53N1RDxe = 13834 + INTEGER(IntKi), PARAMETER :: M53N2RDxe = 13835 + INTEGER(IntKi), PARAMETER :: M53N3RDxe = 13836 + INTEGER(IntKi), PARAMETER :: M53N4RDxe = 13837 + INTEGER(IntKi), PARAMETER :: M53N5RDxe = 13838 + INTEGER(IntKi), PARAMETER :: M53N6RDxe = 13839 + INTEGER(IntKi), PARAMETER :: M53N7RDxe = 13840 + INTEGER(IntKi), PARAMETER :: M53N8RDxe = 13841 + INTEGER(IntKi), PARAMETER :: M53N9RDxe = 13842 + INTEGER(IntKi), PARAMETER :: M54N1RDxe = 13843 + INTEGER(IntKi), PARAMETER :: M54N2RDxe = 13844 + INTEGER(IntKi), PARAMETER :: M54N3RDxe = 13845 + INTEGER(IntKi), PARAMETER :: M54N4RDxe = 13846 + INTEGER(IntKi), PARAMETER :: M54N5RDxe = 13847 + INTEGER(IntKi), PARAMETER :: M54N6RDxe = 13848 + INTEGER(IntKi), PARAMETER :: M54N7RDxe = 13849 + INTEGER(IntKi), PARAMETER :: M54N8RDxe = 13850 + INTEGER(IntKi), PARAMETER :: M54N9RDxe = 13851 + INTEGER(IntKi), PARAMETER :: M55N1RDxe = 13852 + INTEGER(IntKi), PARAMETER :: M55N2RDxe = 13853 + INTEGER(IntKi), PARAMETER :: M55N3RDxe = 13854 + INTEGER(IntKi), PARAMETER :: M55N4RDxe = 13855 + INTEGER(IntKi), PARAMETER :: M55N5RDxe = 13856 + INTEGER(IntKi), PARAMETER :: M55N6RDxe = 13857 + INTEGER(IntKi), PARAMETER :: M55N7RDxe = 13858 + INTEGER(IntKi), PARAMETER :: M55N8RDxe = 13859 + INTEGER(IntKi), PARAMETER :: M55N9RDxe = 13860 + INTEGER(IntKi), PARAMETER :: M56N1RDxe = 13861 + INTEGER(IntKi), PARAMETER :: M56N2RDxe = 13862 + INTEGER(IntKi), PARAMETER :: M56N3RDxe = 13863 + INTEGER(IntKi), PARAMETER :: M56N4RDxe = 13864 + INTEGER(IntKi), PARAMETER :: M56N5RDxe = 13865 + INTEGER(IntKi), PARAMETER :: M56N6RDxe = 13866 + INTEGER(IntKi), PARAMETER :: M56N7RDxe = 13867 + INTEGER(IntKi), PARAMETER :: M56N8RDxe = 13868 + INTEGER(IntKi), PARAMETER :: M56N9RDxe = 13869 + INTEGER(IntKi), PARAMETER :: M57N1RDxe = 13870 + INTEGER(IntKi), PARAMETER :: M57N2RDxe = 13871 + INTEGER(IntKi), PARAMETER :: M57N3RDxe = 13872 + INTEGER(IntKi), PARAMETER :: M57N4RDxe = 13873 + INTEGER(IntKi), PARAMETER :: M57N5RDxe = 13874 + INTEGER(IntKi), PARAMETER :: M57N6RDxe = 13875 + INTEGER(IntKi), PARAMETER :: M57N7RDxe = 13876 + INTEGER(IntKi), PARAMETER :: M57N8RDxe = 13877 + INTEGER(IntKi), PARAMETER :: M57N9RDxe = 13878 + INTEGER(IntKi), PARAMETER :: M58N1RDxe = 13879 + INTEGER(IntKi), PARAMETER :: M58N2RDxe = 13880 + INTEGER(IntKi), PARAMETER :: M58N3RDxe = 13881 + INTEGER(IntKi), PARAMETER :: M58N4RDxe = 13882 + INTEGER(IntKi), PARAMETER :: M58N5RDxe = 13883 + INTEGER(IntKi), PARAMETER :: M58N6RDxe = 13884 + INTEGER(IntKi), PARAMETER :: M58N7RDxe = 13885 + INTEGER(IntKi), PARAMETER :: M58N8RDxe = 13886 + INTEGER(IntKi), PARAMETER :: M58N9RDxe = 13887 + INTEGER(IntKi), PARAMETER :: M59N1RDxe = 13888 + INTEGER(IntKi), PARAMETER :: M59N2RDxe = 13889 + INTEGER(IntKi), PARAMETER :: M59N3RDxe = 13890 + INTEGER(IntKi), PARAMETER :: M59N4RDxe = 13891 + INTEGER(IntKi), PARAMETER :: M59N5RDxe = 13892 + INTEGER(IntKi), PARAMETER :: M59N6RDxe = 13893 + INTEGER(IntKi), PARAMETER :: M59N7RDxe = 13894 + INTEGER(IntKi), PARAMETER :: M59N8RDxe = 13895 + INTEGER(IntKi), PARAMETER :: M59N9RDxe = 13896 + INTEGER(IntKi), PARAMETER :: M60N1RDxe = 13897 + INTEGER(IntKi), PARAMETER :: M60N2RDxe = 13898 + INTEGER(IntKi), PARAMETER :: M60N3RDxe = 13899 + INTEGER(IntKi), PARAMETER :: M60N4RDxe = 13900 + INTEGER(IntKi), PARAMETER :: M60N5RDxe = 13901 + INTEGER(IntKi), PARAMETER :: M60N6RDxe = 13902 + INTEGER(IntKi), PARAMETER :: M60N7RDxe = 13903 + INTEGER(IntKi), PARAMETER :: M60N8RDxe = 13904 + INTEGER(IntKi), PARAMETER :: M60N9RDxe = 13905 + INTEGER(IntKi), PARAMETER :: M61N1RDxe = 13906 + INTEGER(IntKi), PARAMETER :: M61N2RDxe = 13907 + INTEGER(IntKi), PARAMETER :: M61N3RDxe = 13908 + INTEGER(IntKi), PARAMETER :: M61N4RDxe = 13909 + INTEGER(IntKi), PARAMETER :: M61N5RDxe = 13910 + INTEGER(IntKi), PARAMETER :: M61N6RDxe = 13911 + INTEGER(IntKi), PARAMETER :: M61N7RDxe = 13912 + INTEGER(IntKi), PARAMETER :: M61N8RDxe = 13913 + INTEGER(IntKi), PARAMETER :: M61N9RDxe = 13914 + INTEGER(IntKi), PARAMETER :: M62N1RDxe = 13915 + INTEGER(IntKi), PARAMETER :: M62N2RDxe = 13916 + INTEGER(IntKi), PARAMETER :: M62N3RDxe = 13917 + INTEGER(IntKi), PARAMETER :: M62N4RDxe = 13918 + INTEGER(IntKi), PARAMETER :: M62N5RDxe = 13919 + INTEGER(IntKi), PARAMETER :: M62N6RDxe = 13920 + INTEGER(IntKi), PARAMETER :: M62N7RDxe = 13921 + INTEGER(IntKi), PARAMETER :: M62N8RDxe = 13922 + INTEGER(IntKi), PARAMETER :: M62N9RDxe = 13923 + INTEGER(IntKi), PARAMETER :: M63N1RDxe = 13924 + INTEGER(IntKi), PARAMETER :: M63N2RDxe = 13925 + INTEGER(IntKi), PARAMETER :: M63N3RDxe = 13926 + INTEGER(IntKi), PARAMETER :: M63N4RDxe = 13927 + INTEGER(IntKi), PARAMETER :: M63N5RDxe = 13928 + INTEGER(IntKi), PARAMETER :: M63N6RDxe = 13929 + INTEGER(IntKi), PARAMETER :: M63N7RDxe = 13930 + INTEGER(IntKi), PARAMETER :: M63N8RDxe = 13931 + INTEGER(IntKi), PARAMETER :: M63N9RDxe = 13932 + INTEGER(IntKi), PARAMETER :: M64N1RDxe = 13933 + INTEGER(IntKi), PARAMETER :: M64N2RDxe = 13934 + INTEGER(IntKi), PARAMETER :: M64N3RDxe = 13935 + INTEGER(IntKi), PARAMETER :: M64N4RDxe = 13936 + INTEGER(IntKi), PARAMETER :: M64N5RDxe = 13937 + INTEGER(IntKi), PARAMETER :: M64N6RDxe = 13938 + INTEGER(IntKi), PARAMETER :: M64N7RDxe = 13939 + INTEGER(IntKi), PARAMETER :: M64N8RDxe = 13940 + INTEGER(IntKi), PARAMETER :: M64N9RDxe = 13941 + INTEGER(IntKi), PARAMETER :: M65N1RDxe = 13942 + INTEGER(IntKi), PARAMETER :: M65N2RDxe = 13943 + INTEGER(IntKi), PARAMETER :: M65N3RDxe = 13944 + INTEGER(IntKi), PARAMETER :: M65N4RDxe = 13945 + INTEGER(IntKi), PARAMETER :: M65N5RDxe = 13946 + INTEGER(IntKi), PARAMETER :: M65N6RDxe = 13947 + INTEGER(IntKi), PARAMETER :: M65N7RDxe = 13948 + INTEGER(IntKi), PARAMETER :: M65N8RDxe = 13949 + INTEGER(IntKi), PARAMETER :: M65N9RDxe = 13950 + INTEGER(IntKi), PARAMETER :: M66N1RDxe = 13951 + INTEGER(IntKi), PARAMETER :: M66N2RDxe = 13952 + INTEGER(IntKi), PARAMETER :: M66N3RDxe = 13953 + INTEGER(IntKi), PARAMETER :: M66N4RDxe = 13954 + INTEGER(IntKi), PARAMETER :: M66N5RDxe = 13955 + INTEGER(IntKi), PARAMETER :: M66N6RDxe = 13956 + INTEGER(IntKi), PARAMETER :: M66N7RDxe = 13957 + INTEGER(IntKi), PARAMETER :: M66N8RDxe = 13958 + INTEGER(IntKi), PARAMETER :: M66N9RDxe = 13959 + INTEGER(IntKi), PARAMETER :: M67N1RDxe = 13960 + INTEGER(IntKi), PARAMETER :: M67N2RDxe = 13961 + INTEGER(IntKi), PARAMETER :: M67N3RDxe = 13962 + INTEGER(IntKi), PARAMETER :: M67N4RDxe = 13963 + INTEGER(IntKi), PARAMETER :: M67N5RDxe = 13964 + INTEGER(IntKi), PARAMETER :: M67N6RDxe = 13965 + INTEGER(IntKi), PARAMETER :: M67N7RDxe = 13966 + INTEGER(IntKi), PARAMETER :: M67N8RDxe = 13967 + INTEGER(IntKi), PARAMETER :: M67N9RDxe = 13968 + INTEGER(IntKi), PARAMETER :: M68N1RDxe = 13969 + INTEGER(IntKi), PARAMETER :: M68N2RDxe = 13970 + INTEGER(IntKi), PARAMETER :: M68N3RDxe = 13971 + INTEGER(IntKi), PARAMETER :: M68N4RDxe = 13972 + INTEGER(IntKi), PARAMETER :: M68N5RDxe = 13973 + INTEGER(IntKi), PARAMETER :: M68N6RDxe = 13974 + INTEGER(IntKi), PARAMETER :: M68N7RDxe = 13975 + INTEGER(IntKi), PARAMETER :: M68N8RDxe = 13976 + INTEGER(IntKi), PARAMETER :: M68N9RDxe = 13977 + INTEGER(IntKi), PARAMETER :: M69N1RDxe = 13978 + INTEGER(IntKi), PARAMETER :: M69N2RDxe = 13979 + INTEGER(IntKi), PARAMETER :: M69N3RDxe = 13980 + INTEGER(IntKi), PARAMETER :: M69N4RDxe = 13981 + INTEGER(IntKi), PARAMETER :: M69N5RDxe = 13982 + INTEGER(IntKi), PARAMETER :: M69N6RDxe = 13983 + INTEGER(IntKi), PARAMETER :: M69N7RDxe = 13984 + INTEGER(IntKi), PARAMETER :: M69N8RDxe = 13985 + INTEGER(IntKi), PARAMETER :: M69N9RDxe = 13986 + INTEGER(IntKi), PARAMETER :: M70N1RDxe = 13987 + INTEGER(IntKi), PARAMETER :: M70N2RDxe = 13988 + INTEGER(IntKi), PARAMETER :: M70N3RDxe = 13989 + INTEGER(IntKi), PARAMETER :: M70N4RDxe = 13990 + INTEGER(IntKi), PARAMETER :: M70N5RDxe = 13991 + INTEGER(IntKi), PARAMETER :: M70N6RDxe = 13992 + INTEGER(IntKi), PARAMETER :: M70N7RDxe = 13993 + INTEGER(IntKi), PARAMETER :: M70N8RDxe = 13994 + INTEGER(IntKi), PARAMETER :: M70N9RDxe = 13995 + INTEGER(IntKi), PARAMETER :: M71N1RDxe = 13996 + INTEGER(IntKi), PARAMETER :: M71N2RDxe = 13997 + INTEGER(IntKi), PARAMETER :: M71N3RDxe = 13998 + INTEGER(IntKi), PARAMETER :: M71N4RDxe = 13999 + INTEGER(IntKi), PARAMETER :: M71N5RDxe = 14000 + INTEGER(IntKi), PARAMETER :: M71N6RDxe = 14001 + INTEGER(IntKi), PARAMETER :: M71N7RDxe = 14002 + INTEGER(IntKi), PARAMETER :: M71N8RDxe = 14003 + INTEGER(IntKi), PARAMETER :: M71N9RDxe = 14004 + INTEGER(IntKi), PARAMETER :: M72N1RDxe = 14005 + INTEGER(IntKi), PARAMETER :: M72N2RDxe = 14006 + INTEGER(IntKi), PARAMETER :: M72N3RDxe = 14007 + INTEGER(IntKi), PARAMETER :: M72N4RDxe = 14008 + INTEGER(IntKi), PARAMETER :: M72N5RDxe = 14009 + INTEGER(IntKi), PARAMETER :: M72N6RDxe = 14010 + INTEGER(IntKi), PARAMETER :: M72N7RDxe = 14011 + INTEGER(IntKi), PARAMETER :: M72N8RDxe = 14012 + INTEGER(IntKi), PARAMETER :: M72N9RDxe = 14013 + INTEGER(IntKi), PARAMETER :: M73N1RDxe = 14014 + INTEGER(IntKi), PARAMETER :: M73N2RDxe = 14015 + INTEGER(IntKi), PARAMETER :: M73N3RDxe = 14016 + INTEGER(IntKi), PARAMETER :: M73N4RDxe = 14017 + INTEGER(IntKi), PARAMETER :: M73N5RDxe = 14018 + INTEGER(IntKi), PARAMETER :: M73N6RDxe = 14019 + INTEGER(IntKi), PARAMETER :: M73N7RDxe = 14020 + INTEGER(IntKi), PARAMETER :: M73N8RDxe = 14021 + INTEGER(IntKi), PARAMETER :: M73N9RDxe = 14022 + INTEGER(IntKi), PARAMETER :: M74N1RDxe = 14023 + INTEGER(IntKi), PARAMETER :: M74N2RDxe = 14024 + INTEGER(IntKi), PARAMETER :: M74N3RDxe = 14025 + INTEGER(IntKi), PARAMETER :: M74N4RDxe = 14026 + INTEGER(IntKi), PARAMETER :: M74N5RDxe = 14027 + INTEGER(IntKi), PARAMETER :: M74N6RDxe = 14028 + INTEGER(IntKi), PARAMETER :: M74N7RDxe = 14029 + INTEGER(IntKi), PARAMETER :: M74N8RDxe = 14030 + INTEGER(IntKi), PARAMETER :: M74N9RDxe = 14031 + INTEGER(IntKi), PARAMETER :: M75N1RDxe = 14032 + INTEGER(IntKi), PARAMETER :: M75N2RDxe = 14033 + INTEGER(IntKi), PARAMETER :: M75N3RDxe = 14034 + INTEGER(IntKi), PARAMETER :: M75N4RDxe = 14035 + INTEGER(IntKi), PARAMETER :: M75N5RDxe = 14036 + INTEGER(IntKi), PARAMETER :: M75N6RDxe = 14037 + INTEGER(IntKi), PARAMETER :: M75N7RDxe = 14038 + INTEGER(IntKi), PARAMETER :: M75N8RDxe = 14039 + INTEGER(IntKi), PARAMETER :: M75N9RDxe = 14040 + INTEGER(IntKi), PARAMETER :: M76N1RDxe = 14041 + INTEGER(IntKi), PARAMETER :: M76N2RDxe = 14042 + INTEGER(IntKi), PARAMETER :: M76N3RDxe = 14043 + INTEGER(IntKi), PARAMETER :: M76N4RDxe = 14044 + INTEGER(IntKi), PARAMETER :: M76N5RDxe = 14045 + INTEGER(IntKi), PARAMETER :: M76N6RDxe = 14046 + INTEGER(IntKi), PARAMETER :: M76N7RDxe = 14047 + INTEGER(IntKi), PARAMETER :: M76N8RDxe = 14048 + INTEGER(IntKi), PARAMETER :: M76N9RDxe = 14049 + INTEGER(IntKi), PARAMETER :: M77N1RDxe = 14050 + INTEGER(IntKi), PARAMETER :: M77N2RDxe = 14051 + INTEGER(IntKi), PARAMETER :: M77N3RDxe = 14052 + INTEGER(IntKi), PARAMETER :: M77N4RDxe = 14053 + INTEGER(IntKi), PARAMETER :: M77N5RDxe = 14054 + INTEGER(IntKi), PARAMETER :: M77N6RDxe = 14055 + INTEGER(IntKi), PARAMETER :: M77N7RDxe = 14056 + INTEGER(IntKi), PARAMETER :: M77N8RDxe = 14057 + INTEGER(IntKi), PARAMETER :: M77N9RDxe = 14058 + INTEGER(IntKi), PARAMETER :: M78N1RDxe = 14059 + INTEGER(IntKi), PARAMETER :: M78N2RDxe = 14060 + INTEGER(IntKi), PARAMETER :: M78N3RDxe = 14061 + INTEGER(IntKi), PARAMETER :: M78N4RDxe = 14062 + INTEGER(IntKi), PARAMETER :: M78N5RDxe = 14063 + INTEGER(IntKi), PARAMETER :: M78N6RDxe = 14064 + INTEGER(IntKi), PARAMETER :: M78N7RDxe = 14065 + INTEGER(IntKi), PARAMETER :: M78N8RDxe = 14066 + INTEGER(IntKi), PARAMETER :: M78N9RDxe = 14067 + INTEGER(IntKi), PARAMETER :: M79N1RDxe = 14068 + INTEGER(IntKi), PARAMETER :: M79N2RDxe = 14069 + INTEGER(IntKi), PARAMETER :: M79N3RDxe = 14070 + INTEGER(IntKi), PARAMETER :: M79N4RDxe = 14071 + INTEGER(IntKi), PARAMETER :: M79N5RDxe = 14072 + INTEGER(IntKi), PARAMETER :: M79N6RDxe = 14073 + INTEGER(IntKi), PARAMETER :: M79N7RDxe = 14074 + INTEGER(IntKi), PARAMETER :: M79N8RDxe = 14075 + INTEGER(IntKi), PARAMETER :: M79N9RDxe = 14076 + INTEGER(IntKi), PARAMETER :: M80N1RDxe = 14077 + INTEGER(IntKi), PARAMETER :: M80N2RDxe = 14078 + INTEGER(IntKi), PARAMETER :: M80N3RDxe = 14079 + INTEGER(IntKi), PARAMETER :: M80N4RDxe = 14080 + INTEGER(IntKi), PARAMETER :: M80N5RDxe = 14081 + INTEGER(IntKi), PARAMETER :: M80N6RDxe = 14082 + INTEGER(IntKi), PARAMETER :: M80N7RDxe = 14083 + INTEGER(IntKi), PARAMETER :: M80N8RDxe = 14084 + INTEGER(IntKi), PARAMETER :: M80N9RDxe = 14085 + INTEGER(IntKi), PARAMETER :: M81N1RDxe = 14086 + INTEGER(IntKi), PARAMETER :: M81N2RDxe = 14087 + INTEGER(IntKi), PARAMETER :: M81N3RDxe = 14088 + INTEGER(IntKi), PARAMETER :: M81N4RDxe = 14089 + INTEGER(IntKi), PARAMETER :: M81N5RDxe = 14090 + INTEGER(IntKi), PARAMETER :: M81N6RDxe = 14091 + INTEGER(IntKi), PARAMETER :: M81N7RDxe = 14092 + INTEGER(IntKi), PARAMETER :: M81N8RDxe = 14093 + INTEGER(IntKi), PARAMETER :: M81N9RDxe = 14094 + INTEGER(IntKi), PARAMETER :: M82N1RDxe = 14095 + INTEGER(IntKi), PARAMETER :: M82N2RDxe = 14096 + INTEGER(IntKi), PARAMETER :: M82N3RDxe = 14097 + INTEGER(IntKi), PARAMETER :: M82N4RDxe = 14098 + INTEGER(IntKi), PARAMETER :: M82N5RDxe = 14099 + INTEGER(IntKi), PARAMETER :: M82N6RDxe = 14100 + INTEGER(IntKi), PARAMETER :: M82N7RDxe = 14101 + INTEGER(IntKi), PARAMETER :: M82N8RDxe = 14102 + INTEGER(IntKi), PARAMETER :: M82N9RDxe = 14103 + INTEGER(IntKi), PARAMETER :: M83N1RDxe = 14104 + INTEGER(IntKi), PARAMETER :: M83N2RDxe = 14105 + INTEGER(IntKi), PARAMETER :: M83N3RDxe = 14106 + INTEGER(IntKi), PARAMETER :: M83N4RDxe = 14107 + INTEGER(IntKi), PARAMETER :: M83N5RDxe = 14108 + INTEGER(IntKi), PARAMETER :: M83N6RDxe = 14109 + INTEGER(IntKi), PARAMETER :: M83N7RDxe = 14110 + INTEGER(IntKi), PARAMETER :: M83N8RDxe = 14111 + INTEGER(IntKi), PARAMETER :: M83N9RDxe = 14112 + INTEGER(IntKi), PARAMETER :: M84N1RDxe = 14113 + INTEGER(IntKi), PARAMETER :: M84N2RDxe = 14114 + INTEGER(IntKi), PARAMETER :: M84N3RDxe = 14115 + INTEGER(IntKi), PARAMETER :: M84N4RDxe = 14116 + INTEGER(IntKi), PARAMETER :: M84N5RDxe = 14117 + INTEGER(IntKi), PARAMETER :: M84N6RDxe = 14118 + INTEGER(IntKi), PARAMETER :: M84N7RDxe = 14119 + INTEGER(IntKi), PARAMETER :: M84N8RDxe = 14120 + INTEGER(IntKi), PARAMETER :: M84N9RDxe = 14121 + INTEGER(IntKi), PARAMETER :: M85N1RDxe = 14122 + INTEGER(IntKi), PARAMETER :: M85N2RDxe = 14123 + INTEGER(IntKi), PARAMETER :: M85N3RDxe = 14124 + INTEGER(IntKi), PARAMETER :: M85N4RDxe = 14125 + INTEGER(IntKi), PARAMETER :: M85N5RDxe = 14126 + INTEGER(IntKi), PARAMETER :: M85N6RDxe = 14127 + INTEGER(IntKi), PARAMETER :: M85N7RDxe = 14128 + INTEGER(IntKi), PARAMETER :: M85N8RDxe = 14129 + INTEGER(IntKi), PARAMETER :: M85N9RDxe = 14130 + INTEGER(IntKi), PARAMETER :: M86N1RDxe = 14131 + INTEGER(IntKi), PARAMETER :: M86N2RDxe = 14132 + INTEGER(IntKi), PARAMETER :: M86N3RDxe = 14133 + INTEGER(IntKi), PARAMETER :: M86N4RDxe = 14134 + INTEGER(IntKi), PARAMETER :: M86N5RDxe = 14135 + INTEGER(IntKi), PARAMETER :: M86N6RDxe = 14136 + INTEGER(IntKi), PARAMETER :: M86N7RDxe = 14137 + INTEGER(IntKi), PARAMETER :: M86N8RDxe = 14138 + INTEGER(IntKi), PARAMETER :: M86N9RDxe = 14139 + INTEGER(IntKi), PARAMETER :: M87N1RDxe = 14140 + INTEGER(IntKi), PARAMETER :: M87N2RDxe = 14141 + INTEGER(IntKi), PARAMETER :: M87N3RDxe = 14142 + INTEGER(IntKi), PARAMETER :: M87N4RDxe = 14143 + INTEGER(IntKi), PARAMETER :: M87N5RDxe = 14144 + INTEGER(IntKi), PARAMETER :: M87N6RDxe = 14145 + INTEGER(IntKi), PARAMETER :: M87N7RDxe = 14146 + INTEGER(IntKi), PARAMETER :: M87N8RDxe = 14147 + INTEGER(IntKi), PARAMETER :: M87N9RDxe = 14148 + INTEGER(IntKi), PARAMETER :: M88N1RDxe = 14149 + INTEGER(IntKi), PARAMETER :: M88N2RDxe = 14150 + INTEGER(IntKi), PARAMETER :: M88N3RDxe = 14151 + INTEGER(IntKi), PARAMETER :: M88N4RDxe = 14152 + INTEGER(IntKi), PARAMETER :: M88N5RDxe = 14153 + INTEGER(IntKi), PARAMETER :: M88N6RDxe = 14154 + INTEGER(IntKi), PARAMETER :: M88N7RDxe = 14155 + INTEGER(IntKi), PARAMETER :: M88N8RDxe = 14156 + INTEGER(IntKi), PARAMETER :: M88N9RDxe = 14157 + INTEGER(IntKi), PARAMETER :: M89N1RDxe = 14158 + INTEGER(IntKi), PARAMETER :: M89N2RDxe = 14159 + INTEGER(IntKi), PARAMETER :: M89N3RDxe = 14160 + INTEGER(IntKi), PARAMETER :: M89N4RDxe = 14161 + INTEGER(IntKi), PARAMETER :: M89N5RDxe = 14162 + INTEGER(IntKi), PARAMETER :: M89N6RDxe = 14163 + INTEGER(IntKi), PARAMETER :: M89N7RDxe = 14164 + INTEGER(IntKi), PARAMETER :: M89N8RDxe = 14165 + INTEGER(IntKi), PARAMETER :: M89N9RDxe = 14166 + INTEGER(IntKi), PARAMETER :: M90N1RDxe = 14167 + INTEGER(IntKi), PARAMETER :: M90N2RDxe = 14168 + INTEGER(IntKi), PARAMETER :: M90N3RDxe = 14169 + INTEGER(IntKi), PARAMETER :: M90N4RDxe = 14170 + INTEGER(IntKi), PARAMETER :: M90N5RDxe = 14171 + INTEGER(IntKi), PARAMETER :: M90N6RDxe = 14172 + INTEGER(IntKi), PARAMETER :: M90N7RDxe = 14173 + INTEGER(IntKi), PARAMETER :: M90N8RDxe = 14174 + INTEGER(IntKi), PARAMETER :: M90N9RDxe = 14175 + INTEGER(IntKi), PARAMETER :: M91N1RDxe = 14176 + INTEGER(IntKi), PARAMETER :: M91N2RDxe = 14177 + INTEGER(IntKi), PARAMETER :: M91N3RDxe = 14178 + INTEGER(IntKi), PARAMETER :: M91N4RDxe = 14179 + INTEGER(IntKi), PARAMETER :: M91N5RDxe = 14180 + INTEGER(IntKi), PARAMETER :: M91N6RDxe = 14181 + INTEGER(IntKi), PARAMETER :: M91N7RDxe = 14182 + INTEGER(IntKi), PARAMETER :: M91N8RDxe = 14183 + INTEGER(IntKi), PARAMETER :: M91N9RDxe = 14184 + INTEGER(IntKi), PARAMETER :: M92N1RDxe = 14185 + INTEGER(IntKi), PARAMETER :: M92N2RDxe = 14186 + INTEGER(IntKi), PARAMETER :: M92N3RDxe = 14187 + INTEGER(IntKi), PARAMETER :: M92N4RDxe = 14188 + INTEGER(IntKi), PARAMETER :: M92N5RDxe = 14189 + INTEGER(IntKi), PARAMETER :: M92N6RDxe = 14190 + INTEGER(IntKi), PARAMETER :: M92N7RDxe = 14191 + INTEGER(IntKi), PARAMETER :: M92N8RDxe = 14192 + INTEGER(IntKi), PARAMETER :: M92N9RDxe = 14193 + INTEGER(IntKi), PARAMETER :: M93N1RDxe = 14194 + INTEGER(IntKi), PARAMETER :: M93N2RDxe = 14195 + INTEGER(IntKi), PARAMETER :: M93N3RDxe = 14196 + INTEGER(IntKi), PARAMETER :: M93N4RDxe = 14197 + INTEGER(IntKi), PARAMETER :: M93N5RDxe = 14198 + INTEGER(IntKi), PARAMETER :: M93N6RDxe = 14199 + INTEGER(IntKi), PARAMETER :: M93N7RDxe = 14200 + INTEGER(IntKi), PARAMETER :: M93N8RDxe = 14201 + INTEGER(IntKi), PARAMETER :: M93N9RDxe = 14202 + INTEGER(IntKi), PARAMETER :: M94N1RDxe = 14203 + INTEGER(IntKi), PARAMETER :: M94N2RDxe = 14204 + INTEGER(IntKi), PARAMETER :: M94N3RDxe = 14205 + INTEGER(IntKi), PARAMETER :: M94N4RDxe = 14206 + INTEGER(IntKi), PARAMETER :: M94N5RDxe = 14207 + INTEGER(IntKi), PARAMETER :: M94N6RDxe = 14208 + INTEGER(IntKi), PARAMETER :: M94N7RDxe = 14209 + INTEGER(IntKi), PARAMETER :: M94N8RDxe = 14210 + INTEGER(IntKi), PARAMETER :: M94N9RDxe = 14211 + INTEGER(IntKi), PARAMETER :: M95N1RDxe = 14212 + INTEGER(IntKi), PARAMETER :: M95N2RDxe = 14213 + INTEGER(IntKi), PARAMETER :: M95N3RDxe = 14214 + INTEGER(IntKi), PARAMETER :: M95N4RDxe = 14215 + INTEGER(IntKi), PARAMETER :: M95N5RDxe = 14216 + INTEGER(IntKi), PARAMETER :: M95N6RDxe = 14217 + INTEGER(IntKi), PARAMETER :: M95N7RDxe = 14218 + INTEGER(IntKi), PARAMETER :: M95N8RDxe = 14219 + INTEGER(IntKi), PARAMETER :: M95N9RDxe = 14220 + INTEGER(IntKi), PARAMETER :: M96N1RDxe = 14221 + INTEGER(IntKi), PARAMETER :: M96N2RDxe = 14222 + INTEGER(IntKi), PARAMETER :: M96N3RDxe = 14223 + INTEGER(IntKi), PARAMETER :: M96N4RDxe = 14224 + INTEGER(IntKi), PARAMETER :: M96N5RDxe = 14225 + INTEGER(IntKi), PARAMETER :: M96N6RDxe = 14226 + INTEGER(IntKi), PARAMETER :: M96N7RDxe = 14227 + INTEGER(IntKi), PARAMETER :: M96N8RDxe = 14228 + INTEGER(IntKi), PARAMETER :: M96N9RDxe = 14229 + INTEGER(IntKi), PARAMETER :: M97N1RDxe = 14230 + INTEGER(IntKi), PARAMETER :: M97N2RDxe = 14231 + INTEGER(IntKi), PARAMETER :: M97N3RDxe = 14232 + INTEGER(IntKi), PARAMETER :: M97N4RDxe = 14233 + INTEGER(IntKi), PARAMETER :: M97N5RDxe = 14234 + INTEGER(IntKi), PARAMETER :: M97N6RDxe = 14235 + INTEGER(IntKi), PARAMETER :: M97N7RDxe = 14236 + INTEGER(IntKi), PARAMETER :: M97N8RDxe = 14237 + INTEGER(IntKi), PARAMETER :: M97N9RDxe = 14238 + INTEGER(IntKi), PARAMETER :: M98N1RDxe = 14239 + INTEGER(IntKi), PARAMETER :: M98N2RDxe = 14240 + INTEGER(IntKi), PARAMETER :: M98N3RDxe = 14241 + INTEGER(IntKi), PARAMETER :: M98N4RDxe = 14242 + INTEGER(IntKi), PARAMETER :: M98N5RDxe = 14243 + INTEGER(IntKi), PARAMETER :: M98N6RDxe = 14244 + INTEGER(IntKi), PARAMETER :: M98N7RDxe = 14245 + INTEGER(IntKi), PARAMETER :: M98N8RDxe = 14246 + INTEGER(IntKi), PARAMETER :: M98N9RDxe = 14247 + INTEGER(IntKi), PARAMETER :: M99N1RDxe = 14248 + INTEGER(IntKi), PARAMETER :: M99N2RDxe = 14249 + INTEGER(IntKi), PARAMETER :: M99N3RDxe = 14250 + INTEGER(IntKi), PARAMETER :: M99N4RDxe = 14251 + INTEGER(IntKi), PARAMETER :: M99N5RDxe = 14252 + INTEGER(IntKi), PARAMETER :: M99N6RDxe = 14253 + INTEGER(IntKi), PARAMETER :: M99N7RDxe = 14254 + INTEGER(IntKi), PARAMETER :: M99N8RDxe = 14255 + INTEGER(IntKi), PARAMETER :: M99N9RDxe = 14256 + INTEGER(IntKi), PARAMETER :: M01N1RDye = 14257 + INTEGER(IntKi), PARAMETER :: M01N2RDye = 14258 + INTEGER(IntKi), PARAMETER :: M01N3RDye = 14259 + INTEGER(IntKi), PARAMETER :: M01N4RDye = 14260 + INTEGER(IntKi), PARAMETER :: M01N5RDye = 14261 + INTEGER(IntKi), PARAMETER :: M01N6RDye = 14262 + INTEGER(IntKi), PARAMETER :: M01N7RDye = 14263 + INTEGER(IntKi), PARAMETER :: M01N8RDye = 14264 + INTEGER(IntKi), PARAMETER :: M01N9RDye = 14265 + INTEGER(IntKi), PARAMETER :: M02N1RDye = 14266 + INTEGER(IntKi), PARAMETER :: M02N2RDye = 14267 + INTEGER(IntKi), PARAMETER :: M02N3RDye = 14268 + INTEGER(IntKi), PARAMETER :: M02N4RDye = 14269 + INTEGER(IntKi), PARAMETER :: M02N5RDye = 14270 + INTEGER(IntKi), PARAMETER :: M02N6RDye = 14271 + INTEGER(IntKi), PARAMETER :: M02N7RDye = 14272 + INTEGER(IntKi), PARAMETER :: M02N8RDye = 14273 + INTEGER(IntKi), PARAMETER :: M02N9RDye = 14274 + INTEGER(IntKi), PARAMETER :: M03N1RDye = 14275 + INTEGER(IntKi), PARAMETER :: M03N2RDye = 14276 + INTEGER(IntKi), PARAMETER :: M03N3RDye = 14277 + INTEGER(IntKi), PARAMETER :: M03N4RDye = 14278 + INTEGER(IntKi), PARAMETER :: M03N5RDye = 14279 + INTEGER(IntKi), PARAMETER :: M03N6RDye = 14280 + INTEGER(IntKi), PARAMETER :: M03N7RDye = 14281 + INTEGER(IntKi), PARAMETER :: M03N8RDye = 14282 + INTEGER(IntKi), PARAMETER :: M03N9RDye = 14283 + INTEGER(IntKi), PARAMETER :: M04N1RDye = 14284 + INTEGER(IntKi), PARAMETER :: M04N2RDye = 14285 + INTEGER(IntKi), PARAMETER :: M04N3RDye = 14286 + INTEGER(IntKi), PARAMETER :: M04N4RDye = 14287 + INTEGER(IntKi), PARAMETER :: M04N5RDye = 14288 + INTEGER(IntKi), PARAMETER :: M04N6RDye = 14289 + INTEGER(IntKi), PARAMETER :: M04N7RDye = 14290 + INTEGER(IntKi), PARAMETER :: M04N8RDye = 14291 + INTEGER(IntKi), PARAMETER :: M04N9RDye = 14292 + INTEGER(IntKi), PARAMETER :: M05N1RDye = 14293 + INTEGER(IntKi), PARAMETER :: M05N2RDye = 14294 + INTEGER(IntKi), PARAMETER :: M05N3RDye = 14295 + INTEGER(IntKi), PARAMETER :: M05N4RDye = 14296 + INTEGER(IntKi), PARAMETER :: M05N5RDye = 14297 + INTEGER(IntKi), PARAMETER :: M05N6RDye = 14298 + INTEGER(IntKi), PARAMETER :: M05N7RDye = 14299 + INTEGER(IntKi), PARAMETER :: M05N8RDye = 14300 + INTEGER(IntKi), PARAMETER :: M05N9RDye = 14301 + INTEGER(IntKi), PARAMETER :: M06N1RDye = 14302 + INTEGER(IntKi), PARAMETER :: M06N2RDye = 14303 + INTEGER(IntKi), PARAMETER :: M06N3RDye = 14304 + INTEGER(IntKi), PARAMETER :: M06N4RDye = 14305 + INTEGER(IntKi), PARAMETER :: M06N5RDye = 14306 + INTEGER(IntKi), PARAMETER :: M06N6RDye = 14307 + INTEGER(IntKi), PARAMETER :: M06N7RDye = 14308 + INTEGER(IntKi), PARAMETER :: M06N8RDye = 14309 + INTEGER(IntKi), PARAMETER :: M06N9RDye = 14310 + INTEGER(IntKi), PARAMETER :: M07N1RDye = 14311 + INTEGER(IntKi), PARAMETER :: M07N2RDye = 14312 + INTEGER(IntKi), PARAMETER :: M07N3RDye = 14313 + INTEGER(IntKi), PARAMETER :: M07N4RDye = 14314 + INTEGER(IntKi), PARAMETER :: M07N5RDye = 14315 + INTEGER(IntKi), PARAMETER :: M07N6RDye = 14316 + INTEGER(IntKi), PARAMETER :: M07N7RDye = 14317 + INTEGER(IntKi), PARAMETER :: M07N8RDye = 14318 + INTEGER(IntKi), PARAMETER :: M07N9RDye = 14319 + INTEGER(IntKi), PARAMETER :: M08N1RDye = 14320 + INTEGER(IntKi), PARAMETER :: M08N2RDye = 14321 + INTEGER(IntKi), PARAMETER :: M08N3RDye = 14322 + INTEGER(IntKi), PARAMETER :: M08N4RDye = 14323 + INTEGER(IntKi), PARAMETER :: M08N5RDye = 14324 + INTEGER(IntKi), PARAMETER :: M08N6RDye = 14325 + INTEGER(IntKi), PARAMETER :: M08N7RDye = 14326 + INTEGER(IntKi), PARAMETER :: M08N8RDye = 14327 + INTEGER(IntKi), PARAMETER :: M08N9RDye = 14328 + INTEGER(IntKi), PARAMETER :: M09N1RDye = 14329 + INTEGER(IntKi), PARAMETER :: M09N2RDye = 14330 + INTEGER(IntKi), PARAMETER :: M09N3RDye = 14331 + INTEGER(IntKi), PARAMETER :: M09N4RDye = 14332 + INTEGER(IntKi), PARAMETER :: M09N5RDye = 14333 + INTEGER(IntKi), PARAMETER :: M09N6RDye = 14334 + INTEGER(IntKi), PARAMETER :: M09N7RDye = 14335 + INTEGER(IntKi), PARAMETER :: M09N8RDye = 14336 + INTEGER(IntKi), PARAMETER :: M09N9RDye = 14337 + INTEGER(IntKi), PARAMETER :: M10N1RDye = 14338 + INTEGER(IntKi), PARAMETER :: M10N2RDye = 14339 + INTEGER(IntKi), PARAMETER :: M10N3RDye = 14340 + INTEGER(IntKi), PARAMETER :: M10N4RDye = 14341 + INTEGER(IntKi), PARAMETER :: M10N5RDye = 14342 + INTEGER(IntKi), PARAMETER :: M10N6RDye = 14343 + INTEGER(IntKi), PARAMETER :: M10N7RDye = 14344 + INTEGER(IntKi), PARAMETER :: M10N8RDye = 14345 + INTEGER(IntKi), PARAMETER :: M10N9RDye = 14346 + INTEGER(IntKi), PARAMETER :: M11N1RDye = 14347 + INTEGER(IntKi), PARAMETER :: M11N2RDye = 14348 + INTEGER(IntKi), PARAMETER :: M11N3RDye = 14349 + INTEGER(IntKi), PARAMETER :: M11N4RDye = 14350 + INTEGER(IntKi), PARAMETER :: M11N5RDye = 14351 + INTEGER(IntKi), PARAMETER :: M11N6RDye = 14352 + INTEGER(IntKi), PARAMETER :: M11N7RDye = 14353 + INTEGER(IntKi), PARAMETER :: M11N8RDye = 14354 + INTEGER(IntKi), PARAMETER :: M11N9RDye = 14355 + INTEGER(IntKi), PARAMETER :: M12N1RDye = 14356 + INTEGER(IntKi), PARAMETER :: M12N2RDye = 14357 + INTEGER(IntKi), PARAMETER :: M12N3RDye = 14358 + INTEGER(IntKi), PARAMETER :: M12N4RDye = 14359 + INTEGER(IntKi), PARAMETER :: M12N5RDye = 14360 + INTEGER(IntKi), PARAMETER :: M12N6RDye = 14361 + INTEGER(IntKi), PARAMETER :: M12N7RDye = 14362 + INTEGER(IntKi), PARAMETER :: M12N8RDye = 14363 + INTEGER(IntKi), PARAMETER :: M12N9RDye = 14364 + INTEGER(IntKi), PARAMETER :: M13N1RDye = 14365 + INTEGER(IntKi), PARAMETER :: M13N2RDye = 14366 + INTEGER(IntKi), PARAMETER :: M13N3RDye = 14367 + INTEGER(IntKi), PARAMETER :: M13N4RDye = 14368 + INTEGER(IntKi), PARAMETER :: M13N5RDye = 14369 + INTEGER(IntKi), PARAMETER :: M13N6RDye = 14370 + INTEGER(IntKi), PARAMETER :: M13N7RDye = 14371 + INTEGER(IntKi), PARAMETER :: M13N8RDye = 14372 + INTEGER(IntKi), PARAMETER :: M13N9RDye = 14373 + INTEGER(IntKi), PARAMETER :: M14N1RDye = 14374 + INTEGER(IntKi), PARAMETER :: M14N2RDye = 14375 + INTEGER(IntKi), PARAMETER :: M14N3RDye = 14376 + INTEGER(IntKi), PARAMETER :: M14N4RDye = 14377 + INTEGER(IntKi), PARAMETER :: M14N5RDye = 14378 + INTEGER(IntKi), PARAMETER :: M14N6RDye = 14379 + INTEGER(IntKi), PARAMETER :: M14N7RDye = 14380 + INTEGER(IntKi), PARAMETER :: M14N8RDye = 14381 + INTEGER(IntKi), PARAMETER :: M14N9RDye = 14382 + INTEGER(IntKi), PARAMETER :: M15N1RDye = 14383 + INTEGER(IntKi), PARAMETER :: M15N2RDye = 14384 + INTEGER(IntKi), PARAMETER :: M15N3RDye = 14385 + INTEGER(IntKi), PARAMETER :: M15N4RDye = 14386 + INTEGER(IntKi), PARAMETER :: M15N5RDye = 14387 + INTEGER(IntKi), PARAMETER :: M15N6RDye = 14388 + INTEGER(IntKi), PARAMETER :: M15N7RDye = 14389 + INTEGER(IntKi), PARAMETER :: M15N8RDye = 14390 + INTEGER(IntKi), PARAMETER :: M15N9RDye = 14391 + INTEGER(IntKi), PARAMETER :: M16N1RDye = 14392 + INTEGER(IntKi), PARAMETER :: M16N2RDye = 14393 + INTEGER(IntKi), PARAMETER :: M16N3RDye = 14394 + INTEGER(IntKi), PARAMETER :: M16N4RDye = 14395 + INTEGER(IntKi), PARAMETER :: M16N5RDye = 14396 + INTEGER(IntKi), PARAMETER :: M16N6RDye = 14397 + INTEGER(IntKi), PARAMETER :: M16N7RDye = 14398 + INTEGER(IntKi), PARAMETER :: M16N8RDye = 14399 + INTEGER(IntKi), PARAMETER :: M16N9RDye = 14400 + INTEGER(IntKi), PARAMETER :: M17N1RDye = 14401 + INTEGER(IntKi), PARAMETER :: M17N2RDye = 14402 + INTEGER(IntKi), PARAMETER :: M17N3RDye = 14403 + INTEGER(IntKi), PARAMETER :: M17N4RDye = 14404 + INTEGER(IntKi), PARAMETER :: M17N5RDye = 14405 + INTEGER(IntKi), PARAMETER :: M17N6RDye = 14406 + INTEGER(IntKi), PARAMETER :: M17N7RDye = 14407 + INTEGER(IntKi), PARAMETER :: M17N8RDye = 14408 + INTEGER(IntKi), PARAMETER :: M17N9RDye = 14409 + INTEGER(IntKi), PARAMETER :: M18N1RDye = 14410 + INTEGER(IntKi), PARAMETER :: M18N2RDye = 14411 + INTEGER(IntKi), PARAMETER :: M18N3RDye = 14412 + INTEGER(IntKi), PARAMETER :: M18N4RDye = 14413 + INTEGER(IntKi), PARAMETER :: M18N5RDye = 14414 + INTEGER(IntKi), PARAMETER :: M18N6RDye = 14415 + INTEGER(IntKi), PARAMETER :: M18N7RDye = 14416 + INTEGER(IntKi), PARAMETER :: M18N8RDye = 14417 + INTEGER(IntKi), PARAMETER :: M18N9RDye = 14418 + INTEGER(IntKi), PARAMETER :: M19N1RDye = 14419 + INTEGER(IntKi), PARAMETER :: M19N2RDye = 14420 + INTEGER(IntKi), PARAMETER :: M19N3RDye = 14421 + INTEGER(IntKi), PARAMETER :: M19N4RDye = 14422 + INTEGER(IntKi), PARAMETER :: M19N5RDye = 14423 + INTEGER(IntKi), PARAMETER :: M19N6RDye = 14424 + INTEGER(IntKi), PARAMETER :: M19N7RDye = 14425 + INTEGER(IntKi), PARAMETER :: M19N8RDye = 14426 + INTEGER(IntKi), PARAMETER :: M19N9RDye = 14427 + INTEGER(IntKi), PARAMETER :: M20N1RDye = 14428 + INTEGER(IntKi), PARAMETER :: M20N2RDye = 14429 + INTEGER(IntKi), PARAMETER :: M20N3RDye = 14430 + INTEGER(IntKi), PARAMETER :: M20N4RDye = 14431 + INTEGER(IntKi), PARAMETER :: M20N5RDye = 14432 + INTEGER(IntKi), PARAMETER :: M20N6RDye = 14433 + INTEGER(IntKi), PARAMETER :: M20N7RDye = 14434 + INTEGER(IntKi), PARAMETER :: M20N8RDye = 14435 + INTEGER(IntKi), PARAMETER :: M20N9RDye = 14436 + INTEGER(IntKi), PARAMETER :: M21N1RDye = 14437 + INTEGER(IntKi), PARAMETER :: M21N2RDye = 14438 + INTEGER(IntKi), PARAMETER :: M21N3RDye = 14439 + INTEGER(IntKi), PARAMETER :: M21N4RDye = 14440 + INTEGER(IntKi), PARAMETER :: M21N5RDye = 14441 + INTEGER(IntKi), PARAMETER :: M21N6RDye = 14442 + INTEGER(IntKi), PARAMETER :: M21N7RDye = 14443 + INTEGER(IntKi), PARAMETER :: M21N8RDye = 14444 + INTEGER(IntKi), PARAMETER :: M21N9RDye = 14445 + INTEGER(IntKi), PARAMETER :: M22N1RDye = 14446 + INTEGER(IntKi), PARAMETER :: M22N2RDye = 14447 + INTEGER(IntKi), PARAMETER :: M22N3RDye = 14448 + INTEGER(IntKi), PARAMETER :: M22N4RDye = 14449 + INTEGER(IntKi), PARAMETER :: M22N5RDye = 14450 + INTEGER(IntKi), PARAMETER :: M22N6RDye = 14451 + INTEGER(IntKi), PARAMETER :: M22N7RDye = 14452 + INTEGER(IntKi), PARAMETER :: M22N8RDye = 14453 + INTEGER(IntKi), PARAMETER :: M22N9RDye = 14454 + INTEGER(IntKi), PARAMETER :: M23N1RDye = 14455 + INTEGER(IntKi), PARAMETER :: M23N2RDye = 14456 + INTEGER(IntKi), PARAMETER :: M23N3RDye = 14457 + INTEGER(IntKi), PARAMETER :: M23N4RDye = 14458 + INTEGER(IntKi), PARAMETER :: M23N5RDye = 14459 + INTEGER(IntKi), PARAMETER :: M23N6RDye = 14460 + INTEGER(IntKi), PARAMETER :: M23N7RDye = 14461 + INTEGER(IntKi), PARAMETER :: M23N8RDye = 14462 + INTEGER(IntKi), PARAMETER :: M23N9RDye = 14463 + INTEGER(IntKi), PARAMETER :: M24N1RDye = 14464 + INTEGER(IntKi), PARAMETER :: M24N2RDye = 14465 + INTEGER(IntKi), PARAMETER :: M24N3RDye = 14466 + INTEGER(IntKi), PARAMETER :: M24N4RDye = 14467 + INTEGER(IntKi), PARAMETER :: M24N5RDye = 14468 + INTEGER(IntKi), PARAMETER :: M24N6RDye = 14469 + INTEGER(IntKi), PARAMETER :: M24N7RDye = 14470 + INTEGER(IntKi), PARAMETER :: M24N8RDye = 14471 + INTEGER(IntKi), PARAMETER :: M24N9RDye = 14472 + INTEGER(IntKi), PARAMETER :: M25N1RDye = 14473 + INTEGER(IntKi), PARAMETER :: M25N2RDye = 14474 + INTEGER(IntKi), PARAMETER :: M25N3RDye = 14475 + INTEGER(IntKi), PARAMETER :: M25N4RDye = 14476 + INTEGER(IntKi), PARAMETER :: M25N5RDye = 14477 + INTEGER(IntKi), PARAMETER :: M25N6RDye = 14478 + INTEGER(IntKi), PARAMETER :: M25N7RDye = 14479 + INTEGER(IntKi), PARAMETER :: M25N8RDye = 14480 + INTEGER(IntKi), PARAMETER :: M25N9RDye = 14481 + INTEGER(IntKi), PARAMETER :: M26N1RDye = 14482 + INTEGER(IntKi), PARAMETER :: M26N2RDye = 14483 + INTEGER(IntKi), PARAMETER :: M26N3RDye = 14484 + INTEGER(IntKi), PARAMETER :: M26N4RDye = 14485 + INTEGER(IntKi), PARAMETER :: M26N5RDye = 14486 + INTEGER(IntKi), PARAMETER :: M26N6RDye = 14487 + INTEGER(IntKi), PARAMETER :: M26N7RDye = 14488 + INTEGER(IntKi), PARAMETER :: M26N8RDye = 14489 + INTEGER(IntKi), PARAMETER :: M26N9RDye = 14490 + INTEGER(IntKi), PARAMETER :: M27N1RDye = 14491 + INTEGER(IntKi), PARAMETER :: M27N2RDye = 14492 + INTEGER(IntKi), PARAMETER :: M27N3RDye = 14493 + INTEGER(IntKi), PARAMETER :: M27N4RDye = 14494 + INTEGER(IntKi), PARAMETER :: M27N5RDye = 14495 + INTEGER(IntKi), PARAMETER :: M27N6RDye = 14496 + INTEGER(IntKi), PARAMETER :: M27N7RDye = 14497 + INTEGER(IntKi), PARAMETER :: M27N8RDye = 14498 + INTEGER(IntKi), PARAMETER :: M27N9RDye = 14499 + INTEGER(IntKi), PARAMETER :: M28N1RDye = 14500 + INTEGER(IntKi), PARAMETER :: M28N2RDye = 14501 + INTEGER(IntKi), PARAMETER :: M28N3RDye = 14502 + INTEGER(IntKi), PARAMETER :: M28N4RDye = 14503 + INTEGER(IntKi), PARAMETER :: M28N5RDye = 14504 + INTEGER(IntKi), PARAMETER :: M28N6RDye = 14505 + INTEGER(IntKi), PARAMETER :: M28N7RDye = 14506 + INTEGER(IntKi), PARAMETER :: M28N8RDye = 14507 + INTEGER(IntKi), PARAMETER :: M28N9RDye = 14508 + INTEGER(IntKi), PARAMETER :: M29N1RDye = 14509 + INTEGER(IntKi), PARAMETER :: M29N2RDye = 14510 + INTEGER(IntKi), PARAMETER :: M29N3RDye = 14511 + INTEGER(IntKi), PARAMETER :: M29N4RDye = 14512 + INTEGER(IntKi), PARAMETER :: M29N5RDye = 14513 + INTEGER(IntKi), PARAMETER :: M29N6RDye = 14514 + INTEGER(IntKi), PARAMETER :: M29N7RDye = 14515 + INTEGER(IntKi), PARAMETER :: M29N8RDye = 14516 + INTEGER(IntKi), PARAMETER :: M29N9RDye = 14517 + INTEGER(IntKi), PARAMETER :: M30N1RDye = 14518 + INTEGER(IntKi), PARAMETER :: M30N2RDye = 14519 + INTEGER(IntKi), PARAMETER :: M30N3RDye = 14520 + INTEGER(IntKi), PARAMETER :: M30N4RDye = 14521 + INTEGER(IntKi), PARAMETER :: M30N5RDye = 14522 + INTEGER(IntKi), PARAMETER :: M30N6RDye = 14523 + INTEGER(IntKi), PARAMETER :: M30N7RDye = 14524 + INTEGER(IntKi), PARAMETER :: M30N8RDye = 14525 + INTEGER(IntKi), PARAMETER :: M30N9RDye = 14526 + INTEGER(IntKi), PARAMETER :: M31N1RDye = 14527 + INTEGER(IntKi), PARAMETER :: M31N2RDye = 14528 + INTEGER(IntKi), PARAMETER :: M31N3RDye = 14529 + INTEGER(IntKi), PARAMETER :: M31N4RDye = 14530 + INTEGER(IntKi), PARAMETER :: M31N5RDye = 14531 + INTEGER(IntKi), PARAMETER :: M31N6RDye = 14532 + INTEGER(IntKi), PARAMETER :: M31N7RDye = 14533 + INTEGER(IntKi), PARAMETER :: M31N8RDye = 14534 + INTEGER(IntKi), PARAMETER :: M31N9RDye = 14535 + INTEGER(IntKi), PARAMETER :: M32N1RDye = 14536 + INTEGER(IntKi), PARAMETER :: M32N2RDye = 14537 + INTEGER(IntKi), PARAMETER :: M32N3RDye = 14538 + INTEGER(IntKi), PARAMETER :: M32N4RDye = 14539 + INTEGER(IntKi), PARAMETER :: M32N5RDye = 14540 + INTEGER(IntKi), PARAMETER :: M32N6RDye = 14541 + INTEGER(IntKi), PARAMETER :: M32N7RDye = 14542 + INTEGER(IntKi), PARAMETER :: M32N8RDye = 14543 + INTEGER(IntKi), PARAMETER :: M32N9RDye = 14544 + INTEGER(IntKi), PARAMETER :: M33N1RDye = 14545 + INTEGER(IntKi), PARAMETER :: M33N2RDye = 14546 + INTEGER(IntKi), PARAMETER :: M33N3RDye = 14547 + INTEGER(IntKi), PARAMETER :: M33N4RDye = 14548 + INTEGER(IntKi), PARAMETER :: M33N5RDye = 14549 + INTEGER(IntKi), PARAMETER :: M33N6RDye = 14550 + INTEGER(IntKi), PARAMETER :: M33N7RDye = 14551 + INTEGER(IntKi), PARAMETER :: M33N8RDye = 14552 + INTEGER(IntKi), PARAMETER :: M33N9RDye = 14553 + INTEGER(IntKi), PARAMETER :: M34N1RDye = 14554 + INTEGER(IntKi), PARAMETER :: M34N2RDye = 14555 + INTEGER(IntKi), PARAMETER :: M34N3RDye = 14556 + INTEGER(IntKi), PARAMETER :: M34N4RDye = 14557 + INTEGER(IntKi), PARAMETER :: M34N5RDye = 14558 + INTEGER(IntKi), PARAMETER :: M34N6RDye = 14559 + INTEGER(IntKi), PARAMETER :: M34N7RDye = 14560 + INTEGER(IntKi), PARAMETER :: M34N8RDye = 14561 + INTEGER(IntKi), PARAMETER :: M34N9RDye = 14562 + INTEGER(IntKi), PARAMETER :: M35N1RDye = 14563 + INTEGER(IntKi), PARAMETER :: M35N2RDye = 14564 + INTEGER(IntKi), PARAMETER :: M35N3RDye = 14565 + INTEGER(IntKi), PARAMETER :: M35N4RDye = 14566 + INTEGER(IntKi), PARAMETER :: M35N5RDye = 14567 + INTEGER(IntKi), PARAMETER :: M35N6RDye = 14568 + INTEGER(IntKi), PARAMETER :: M35N7RDye = 14569 + INTEGER(IntKi), PARAMETER :: M35N8RDye = 14570 + INTEGER(IntKi), PARAMETER :: M35N9RDye = 14571 + INTEGER(IntKi), PARAMETER :: M36N1RDye = 14572 + INTEGER(IntKi), PARAMETER :: M36N2RDye = 14573 + INTEGER(IntKi), PARAMETER :: M36N3RDye = 14574 + INTEGER(IntKi), PARAMETER :: M36N4RDye = 14575 + INTEGER(IntKi), PARAMETER :: M36N5RDye = 14576 + INTEGER(IntKi), PARAMETER :: M36N6RDye = 14577 + INTEGER(IntKi), PARAMETER :: M36N7RDye = 14578 + INTEGER(IntKi), PARAMETER :: M36N8RDye = 14579 + INTEGER(IntKi), PARAMETER :: M36N9RDye = 14580 + INTEGER(IntKi), PARAMETER :: M37N1RDye = 14581 + INTEGER(IntKi), PARAMETER :: M37N2RDye = 14582 + INTEGER(IntKi), PARAMETER :: M37N3RDye = 14583 + INTEGER(IntKi), PARAMETER :: M37N4RDye = 14584 + INTEGER(IntKi), PARAMETER :: M37N5RDye = 14585 + INTEGER(IntKi), PARAMETER :: M37N6RDye = 14586 + INTEGER(IntKi), PARAMETER :: M37N7RDye = 14587 + INTEGER(IntKi), PARAMETER :: M37N8RDye = 14588 + INTEGER(IntKi), PARAMETER :: M37N9RDye = 14589 + INTEGER(IntKi), PARAMETER :: M38N1RDye = 14590 + INTEGER(IntKi), PARAMETER :: M38N2RDye = 14591 + INTEGER(IntKi), PARAMETER :: M38N3RDye = 14592 + INTEGER(IntKi), PARAMETER :: M38N4RDye = 14593 + INTEGER(IntKi), PARAMETER :: M38N5RDye = 14594 + INTEGER(IntKi), PARAMETER :: M38N6RDye = 14595 + INTEGER(IntKi), PARAMETER :: M38N7RDye = 14596 + INTEGER(IntKi), PARAMETER :: M38N8RDye = 14597 + INTEGER(IntKi), PARAMETER :: M38N9RDye = 14598 + INTEGER(IntKi), PARAMETER :: M39N1RDye = 14599 + INTEGER(IntKi), PARAMETER :: M39N2RDye = 14600 + INTEGER(IntKi), PARAMETER :: M39N3RDye = 14601 + INTEGER(IntKi), PARAMETER :: M39N4RDye = 14602 + INTEGER(IntKi), PARAMETER :: M39N5RDye = 14603 + INTEGER(IntKi), PARAMETER :: M39N6RDye = 14604 + INTEGER(IntKi), PARAMETER :: M39N7RDye = 14605 + INTEGER(IntKi), PARAMETER :: M39N8RDye = 14606 + INTEGER(IntKi), PARAMETER :: M39N9RDye = 14607 + INTEGER(IntKi), PARAMETER :: M40N1RDye = 14608 + INTEGER(IntKi), PARAMETER :: M40N2RDye = 14609 + INTEGER(IntKi), PARAMETER :: M40N3RDye = 14610 + INTEGER(IntKi), PARAMETER :: M40N4RDye = 14611 + INTEGER(IntKi), PARAMETER :: M40N5RDye = 14612 + INTEGER(IntKi), PARAMETER :: M40N6RDye = 14613 + INTEGER(IntKi), PARAMETER :: M40N7RDye = 14614 + INTEGER(IntKi), PARAMETER :: M40N8RDye = 14615 + INTEGER(IntKi), PARAMETER :: M40N9RDye = 14616 + INTEGER(IntKi), PARAMETER :: M41N1RDye = 14617 + INTEGER(IntKi), PARAMETER :: M41N2RDye = 14618 + INTEGER(IntKi), PARAMETER :: M41N3RDye = 14619 + INTEGER(IntKi), PARAMETER :: M41N4RDye = 14620 + INTEGER(IntKi), PARAMETER :: M41N5RDye = 14621 + INTEGER(IntKi), PARAMETER :: M41N6RDye = 14622 + INTEGER(IntKi), PARAMETER :: M41N7RDye = 14623 + INTEGER(IntKi), PARAMETER :: M41N8RDye = 14624 + INTEGER(IntKi), PARAMETER :: M41N9RDye = 14625 + INTEGER(IntKi), PARAMETER :: M42N1RDye = 14626 + INTEGER(IntKi), PARAMETER :: M42N2RDye = 14627 + INTEGER(IntKi), PARAMETER :: M42N3RDye = 14628 + INTEGER(IntKi), PARAMETER :: M42N4RDye = 14629 + INTEGER(IntKi), PARAMETER :: M42N5RDye = 14630 + INTEGER(IntKi), PARAMETER :: M42N6RDye = 14631 + INTEGER(IntKi), PARAMETER :: M42N7RDye = 14632 + INTEGER(IntKi), PARAMETER :: M42N8RDye = 14633 + INTEGER(IntKi), PARAMETER :: M42N9RDye = 14634 + INTEGER(IntKi), PARAMETER :: M43N1RDye = 14635 + INTEGER(IntKi), PARAMETER :: M43N2RDye = 14636 + INTEGER(IntKi), PARAMETER :: M43N3RDye = 14637 + INTEGER(IntKi), PARAMETER :: M43N4RDye = 14638 + INTEGER(IntKi), PARAMETER :: M43N5RDye = 14639 + INTEGER(IntKi), PARAMETER :: M43N6RDye = 14640 + INTEGER(IntKi), PARAMETER :: M43N7RDye = 14641 + INTEGER(IntKi), PARAMETER :: M43N8RDye = 14642 + INTEGER(IntKi), PARAMETER :: M43N9RDye = 14643 + INTEGER(IntKi), PARAMETER :: M44N1RDye = 14644 + INTEGER(IntKi), PARAMETER :: M44N2RDye = 14645 + INTEGER(IntKi), PARAMETER :: M44N3RDye = 14646 + INTEGER(IntKi), PARAMETER :: M44N4RDye = 14647 + INTEGER(IntKi), PARAMETER :: M44N5RDye = 14648 + INTEGER(IntKi), PARAMETER :: M44N6RDye = 14649 + INTEGER(IntKi), PARAMETER :: M44N7RDye = 14650 + INTEGER(IntKi), PARAMETER :: M44N8RDye = 14651 + INTEGER(IntKi), PARAMETER :: M44N9RDye = 14652 + INTEGER(IntKi), PARAMETER :: M45N1RDye = 14653 + INTEGER(IntKi), PARAMETER :: M45N2RDye = 14654 + INTEGER(IntKi), PARAMETER :: M45N3RDye = 14655 + INTEGER(IntKi), PARAMETER :: M45N4RDye = 14656 + INTEGER(IntKi), PARAMETER :: M45N5RDye = 14657 + INTEGER(IntKi), PARAMETER :: M45N6RDye = 14658 + INTEGER(IntKi), PARAMETER :: M45N7RDye = 14659 + INTEGER(IntKi), PARAMETER :: M45N8RDye = 14660 + INTEGER(IntKi), PARAMETER :: M45N9RDye = 14661 + INTEGER(IntKi), PARAMETER :: M46N1RDye = 14662 + INTEGER(IntKi), PARAMETER :: M46N2RDye = 14663 + INTEGER(IntKi), PARAMETER :: M46N3RDye = 14664 + INTEGER(IntKi), PARAMETER :: M46N4RDye = 14665 + INTEGER(IntKi), PARAMETER :: M46N5RDye = 14666 + INTEGER(IntKi), PARAMETER :: M46N6RDye = 14667 + INTEGER(IntKi), PARAMETER :: M46N7RDye = 14668 + INTEGER(IntKi), PARAMETER :: M46N8RDye = 14669 + INTEGER(IntKi), PARAMETER :: M46N9RDye = 14670 + INTEGER(IntKi), PARAMETER :: M47N1RDye = 14671 + INTEGER(IntKi), PARAMETER :: M47N2RDye = 14672 + INTEGER(IntKi), PARAMETER :: M47N3RDye = 14673 + INTEGER(IntKi), PARAMETER :: M47N4RDye = 14674 + INTEGER(IntKi), PARAMETER :: M47N5RDye = 14675 + INTEGER(IntKi), PARAMETER :: M47N6RDye = 14676 + INTEGER(IntKi), PARAMETER :: M47N7RDye = 14677 + INTEGER(IntKi), PARAMETER :: M47N8RDye = 14678 + INTEGER(IntKi), PARAMETER :: M47N9RDye = 14679 + INTEGER(IntKi), PARAMETER :: M48N1RDye = 14680 + INTEGER(IntKi), PARAMETER :: M48N2RDye = 14681 + INTEGER(IntKi), PARAMETER :: M48N3RDye = 14682 + INTEGER(IntKi), PARAMETER :: M48N4RDye = 14683 + INTEGER(IntKi), PARAMETER :: M48N5RDye = 14684 + INTEGER(IntKi), PARAMETER :: M48N6RDye = 14685 + INTEGER(IntKi), PARAMETER :: M48N7RDye = 14686 + INTEGER(IntKi), PARAMETER :: M48N8RDye = 14687 + INTEGER(IntKi), PARAMETER :: M48N9RDye = 14688 + INTEGER(IntKi), PARAMETER :: M49N1RDye = 14689 + INTEGER(IntKi), PARAMETER :: M49N2RDye = 14690 + INTEGER(IntKi), PARAMETER :: M49N3RDye = 14691 + INTEGER(IntKi), PARAMETER :: M49N4RDye = 14692 + INTEGER(IntKi), PARAMETER :: M49N5RDye = 14693 + INTEGER(IntKi), PARAMETER :: M49N6RDye = 14694 + INTEGER(IntKi), PARAMETER :: M49N7RDye = 14695 + INTEGER(IntKi), PARAMETER :: M49N8RDye = 14696 + INTEGER(IntKi), PARAMETER :: M49N9RDye = 14697 + INTEGER(IntKi), PARAMETER :: M50N1RDye = 14698 + INTEGER(IntKi), PARAMETER :: M50N2RDye = 14699 + INTEGER(IntKi), PARAMETER :: M50N3RDye = 14700 + INTEGER(IntKi), PARAMETER :: M50N4RDye = 14701 + INTEGER(IntKi), PARAMETER :: M50N5RDye = 14702 + INTEGER(IntKi), PARAMETER :: M50N6RDye = 14703 + INTEGER(IntKi), PARAMETER :: M50N7RDye = 14704 + INTEGER(IntKi), PARAMETER :: M50N8RDye = 14705 + INTEGER(IntKi), PARAMETER :: M50N9RDye = 14706 + INTEGER(IntKi), PARAMETER :: M51N1RDye = 14707 + INTEGER(IntKi), PARAMETER :: M51N2RDye = 14708 + INTEGER(IntKi), PARAMETER :: M51N3RDye = 14709 + INTEGER(IntKi), PARAMETER :: M51N4RDye = 14710 + INTEGER(IntKi), PARAMETER :: M51N5RDye = 14711 + INTEGER(IntKi), PARAMETER :: M51N6RDye = 14712 + INTEGER(IntKi), PARAMETER :: M51N7RDye = 14713 + INTEGER(IntKi), PARAMETER :: M51N8RDye = 14714 + INTEGER(IntKi), PARAMETER :: M51N9RDye = 14715 + INTEGER(IntKi), PARAMETER :: M52N1RDye = 14716 + INTEGER(IntKi), PARAMETER :: M52N2RDye = 14717 + INTEGER(IntKi), PARAMETER :: M52N3RDye = 14718 + INTEGER(IntKi), PARAMETER :: M52N4RDye = 14719 + INTEGER(IntKi), PARAMETER :: M52N5RDye = 14720 + INTEGER(IntKi), PARAMETER :: M52N6RDye = 14721 + INTEGER(IntKi), PARAMETER :: M52N7RDye = 14722 + INTEGER(IntKi), PARAMETER :: M52N8RDye = 14723 + INTEGER(IntKi), PARAMETER :: M52N9RDye = 14724 + INTEGER(IntKi), PARAMETER :: M53N1RDye = 14725 + INTEGER(IntKi), PARAMETER :: M53N2RDye = 14726 + INTEGER(IntKi), PARAMETER :: M53N3RDye = 14727 + INTEGER(IntKi), PARAMETER :: M53N4RDye = 14728 + INTEGER(IntKi), PARAMETER :: M53N5RDye = 14729 + INTEGER(IntKi), PARAMETER :: M53N6RDye = 14730 + INTEGER(IntKi), PARAMETER :: M53N7RDye = 14731 + INTEGER(IntKi), PARAMETER :: M53N8RDye = 14732 + INTEGER(IntKi), PARAMETER :: M53N9RDye = 14733 + INTEGER(IntKi), PARAMETER :: M54N1RDye = 14734 + INTEGER(IntKi), PARAMETER :: M54N2RDye = 14735 + INTEGER(IntKi), PARAMETER :: M54N3RDye = 14736 + INTEGER(IntKi), PARAMETER :: M54N4RDye = 14737 + INTEGER(IntKi), PARAMETER :: M54N5RDye = 14738 + INTEGER(IntKi), PARAMETER :: M54N6RDye = 14739 + INTEGER(IntKi), PARAMETER :: M54N7RDye = 14740 + INTEGER(IntKi), PARAMETER :: M54N8RDye = 14741 + INTEGER(IntKi), PARAMETER :: M54N9RDye = 14742 + INTEGER(IntKi), PARAMETER :: M55N1RDye = 14743 + INTEGER(IntKi), PARAMETER :: M55N2RDye = 14744 + INTEGER(IntKi), PARAMETER :: M55N3RDye = 14745 + INTEGER(IntKi), PARAMETER :: M55N4RDye = 14746 + INTEGER(IntKi), PARAMETER :: M55N5RDye = 14747 + INTEGER(IntKi), PARAMETER :: M55N6RDye = 14748 + INTEGER(IntKi), PARAMETER :: M55N7RDye = 14749 + INTEGER(IntKi), PARAMETER :: M55N8RDye = 14750 + INTEGER(IntKi), PARAMETER :: M55N9RDye = 14751 + INTEGER(IntKi), PARAMETER :: M56N1RDye = 14752 + INTEGER(IntKi), PARAMETER :: M56N2RDye = 14753 + INTEGER(IntKi), PARAMETER :: M56N3RDye = 14754 + INTEGER(IntKi), PARAMETER :: M56N4RDye = 14755 + INTEGER(IntKi), PARAMETER :: M56N5RDye = 14756 + INTEGER(IntKi), PARAMETER :: M56N6RDye = 14757 + INTEGER(IntKi), PARAMETER :: M56N7RDye = 14758 + INTEGER(IntKi), PARAMETER :: M56N8RDye = 14759 + INTEGER(IntKi), PARAMETER :: M56N9RDye = 14760 + INTEGER(IntKi), PARAMETER :: M57N1RDye = 14761 + INTEGER(IntKi), PARAMETER :: M57N2RDye = 14762 + INTEGER(IntKi), PARAMETER :: M57N3RDye = 14763 + INTEGER(IntKi), PARAMETER :: M57N4RDye = 14764 + INTEGER(IntKi), PARAMETER :: M57N5RDye = 14765 + INTEGER(IntKi), PARAMETER :: M57N6RDye = 14766 + INTEGER(IntKi), PARAMETER :: M57N7RDye = 14767 + INTEGER(IntKi), PARAMETER :: M57N8RDye = 14768 + INTEGER(IntKi), PARAMETER :: M57N9RDye = 14769 + INTEGER(IntKi), PARAMETER :: M58N1RDye = 14770 + INTEGER(IntKi), PARAMETER :: M58N2RDye = 14771 + INTEGER(IntKi), PARAMETER :: M58N3RDye = 14772 + INTEGER(IntKi), PARAMETER :: M58N4RDye = 14773 + INTEGER(IntKi), PARAMETER :: M58N5RDye = 14774 + INTEGER(IntKi), PARAMETER :: M58N6RDye = 14775 + INTEGER(IntKi), PARAMETER :: M58N7RDye = 14776 + INTEGER(IntKi), PARAMETER :: M58N8RDye = 14777 + INTEGER(IntKi), PARAMETER :: M58N9RDye = 14778 + INTEGER(IntKi), PARAMETER :: M59N1RDye = 14779 + INTEGER(IntKi), PARAMETER :: M59N2RDye = 14780 + INTEGER(IntKi), PARAMETER :: M59N3RDye = 14781 + INTEGER(IntKi), PARAMETER :: M59N4RDye = 14782 + INTEGER(IntKi), PARAMETER :: M59N5RDye = 14783 + INTEGER(IntKi), PARAMETER :: M59N6RDye = 14784 + INTEGER(IntKi), PARAMETER :: M59N7RDye = 14785 + INTEGER(IntKi), PARAMETER :: M59N8RDye = 14786 + INTEGER(IntKi), PARAMETER :: M59N9RDye = 14787 + INTEGER(IntKi), PARAMETER :: M60N1RDye = 14788 + INTEGER(IntKi), PARAMETER :: M60N2RDye = 14789 + INTEGER(IntKi), PARAMETER :: M60N3RDye = 14790 + INTEGER(IntKi), PARAMETER :: M60N4RDye = 14791 + INTEGER(IntKi), PARAMETER :: M60N5RDye = 14792 + INTEGER(IntKi), PARAMETER :: M60N6RDye = 14793 + INTEGER(IntKi), PARAMETER :: M60N7RDye = 14794 + INTEGER(IntKi), PARAMETER :: M60N8RDye = 14795 + INTEGER(IntKi), PARAMETER :: M60N9RDye = 14796 + INTEGER(IntKi), PARAMETER :: M61N1RDye = 14797 + INTEGER(IntKi), PARAMETER :: M61N2RDye = 14798 + INTEGER(IntKi), PARAMETER :: M61N3RDye = 14799 + INTEGER(IntKi), PARAMETER :: M61N4RDye = 14800 + INTEGER(IntKi), PARAMETER :: M61N5RDye = 14801 + INTEGER(IntKi), PARAMETER :: M61N6RDye = 14802 + INTEGER(IntKi), PARAMETER :: M61N7RDye = 14803 + INTEGER(IntKi), PARAMETER :: M61N8RDye = 14804 + INTEGER(IntKi), PARAMETER :: M61N9RDye = 14805 + INTEGER(IntKi), PARAMETER :: M62N1RDye = 14806 + INTEGER(IntKi), PARAMETER :: M62N2RDye = 14807 + INTEGER(IntKi), PARAMETER :: M62N3RDye = 14808 + INTEGER(IntKi), PARAMETER :: M62N4RDye = 14809 + INTEGER(IntKi), PARAMETER :: M62N5RDye = 14810 + INTEGER(IntKi), PARAMETER :: M62N6RDye = 14811 + INTEGER(IntKi), PARAMETER :: M62N7RDye = 14812 + INTEGER(IntKi), PARAMETER :: M62N8RDye = 14813 + INTEGER(IntKi), PARAMETER :: M62N9RDye = 14814 + INTEGER(IntKi), PARAMETER :: M63N1RDye = 14815 + INTEGER(IntKi), PARAMETER :: M63N2RDye = 14816 + INTEGER(IntKi), PARAMETER :: M63N3RDye = 14817 + INTEGER(IntKi), PARAMETER :: M63N4RDye = 14818 + INTEGER(IntKi), PARAMETER :: M63N5RDye = 14819 + INTEGER(IntKi), PARAMETER :: M63N6RDye = 14820 + INTEGER(IntKi), PARAMETER :: M63N7RDye = 14821 + INTEGER(IntKi), PARAMETER :: M63N8RDye = 14822 + INTEGER(IntKi), PARAMETER :: M63N9RDye = 14823 + INTEGER(IntKi), PARAMETER :: M64N1RDye = 14824 + INTEGER(IntKi), PARAMETER :: M64N2RDye = 14825 + INTEGER(IntKi), PARAMETER :: M64N3RDye = 14826 + INTEGER(IntKi), PARAMETER :: M64N4RDye = 14827 + INTEGER(IntKi), PARAMETER :: M64N5RDye = 14828 + INTEGER(IntKi), PARAMETER :: M64N6RDye = 14829 + INTEGER(IntKi), PARAMETER :: M64N7RDye = 14830 + INTEGER(IntKi), PARAMETER :: M64N8RDye = 14831 + INTEGER(IntKi), PARAMETER :: M64N9RDye = 14832 + INTEGER(IntKi), PARAMETER :: M65N1RDye = 14833 + INTEGER(IntKi), PARAMETER :: M65N2RDye = 14834 + INTEGER(IntKi), PARAMETER :: M65N3RDye = 14835 + INTEGER(IntKi), PARAMETER :: M65N4RDye = 14836 + INTEGER(IntKi), PARAMETER :: M65N5RDye = 14837 + INTEGER(IntKi), PARAMETER :: M65N6RDye = 14838 + INTEGER(IntKi), PARAMETER :: M65N7RDye = 14839 + INTEGER(IntKi), PARAMETER :: M65N8RDye = 14840 + INTEGER(IntKi), PARAMETER :: M65N9RDye = 14841 + INTEGER(IntKi), PARAMETER :: M66N1RDye = 14842 + INTEGER(IntKi), PARAMETER :: M66N2RDye = 14843 + INTEGER(IntKi), PARAMETER :: M66N3RDye = 14844 + INTEGER(IntKi), PARAMETER :: M66N4RDye = 14845 + INTEGER(IntKi), PARAMETER :: M66N5RDye = 14846 + INTEGER(IntKi), PARAMETER :: M66N6RDye = 14847 + INTEGER(IntKi), PARAMETER :: M66N7RDye = 14848 + INTEGER(IntKi), PARAMETER :: M66N8RDye = 14849 + INTEGER(IntKi), PARAMETER :: M66N9RDye = 14850 + INTEGER(IntKi), PARAMETER :: M67N1RDye = 14851 + INTEGER(IntKi), PARAMETER :: M67N2RDye = 14852 + INTEGER(IntKi), PARAMETER :: M67N3RDye = 14853 + INTEGER(IntKi), PARAMETER :: M67N4RDye = 14854 + INTEGER(IntKi), PARAMETER :: M67N5RDye = 14855 + INTEGER(IntKi), PARAMETER :: M67N6RDye = 14856 + INTEGER(IntKi), PARAMETER :: M67N7RDye = 14857 + INTEGER(IntKi), PARAMETER :: M67N8RDye = 14858 + INTEGER(IntKi), PARAMETER :: M67N9RDye = 14859 + INTEGER(IntKi), PARAMETER :: M68N1RDye = 14860 + INTEGER(IntKi), PARAMETER :: M68N2RDye = 14861 + INTEGER(IntKi), PARAMETER :: M68N3RDye = 14862 + INTEGER(IntKi), PARAMETER :: M68N4RDye = 14863 + INTEGER(IntKi), PARAMETER :: M68N5RDye = 14864 + INTEGER(IntKi), PARAMETER :: M68N6RDye = 14865 + INTEGER(IntKi), PARAMETER :: M68N7RDye = 14866 + INTEGER(IntKi), PARAMETER :: M68N8RDye = 14867 + INTEGER(IntKi), PARAMETER :: M68N9RDye = 14868 + INTEGER(IntKi), PARAMETER :: M69N1RDye = 14869 + INTEGER(IntKi), PARAMETER :: M69N2RDye = 14870 + INTEGER(IntKi), PARAMETER :: M69N3RDye = 14871 + INTEGER(IntKi), PARAMETER :: M69N4RDye = 14872 + INTEGER(IntKi), PARAMETER :: M69N5RDye = 14873 + INTEGER(IntKi), PARAMETER :: M69N6RDye = 14874 + INTEGER(IntKi), PARAMETER :: M69N7RDye = 14875 + INTEGER(IntKi), PARAMETER :: M69N8RDye = 14876 + INTEGER(IntKi), PARAMETER :: M69N9RDye = 14877 + INTEGER(IntKi), PARAMETER :: M70N1RDye = 14878 + INTEGER(IntKi), PARAMETER :: M70N2RDye = 14879 + INTEGER(IntKi), PARAMETER :: M70N3RDye = 14880 + INTEGER(IntKi), PARAMETER :: M70N4RDye = 14881 + INTEGER(IntKi), PARAMETER :: M70N5RDye = 14882 + INTEGER(IntKi), PARAMETER :: M70N6RDye = 14883 + INTEGER(IntKi), PARAMETER :: M70N7RDye = 14884 + INTEGER(IntKi), PARAMETER :: M70N8RDye = 14885 + INTEGER(IntKi), PARAMETER :: M70N9RDye = 14886 + INTEGER(IntKi), PARAMETER :: M71N1RDye = 14887 + INTEGER(IntKi), PARAMETER :: M71N2RDye = 14888 + INTEGER(IntKi), PARAMETER :: M71N3RDye = 14889 + INTEGER(IntKi), PARAMETER :: M71N4RDye = 14890 + INTEGER(IntKi), PARAMETER :: M71N5RDye = 14891 + INTEGER(IntKi), PARAMETER :: M71N6RDye = 14892 + INTEGER(IntKi), PARAMETER :: M71N7RDye = 14893 + INTEGER(IntKi), PARAMETER :: M71N8RDye = 14894 + INTEGER(IntKi), PARAMETER :: M71N9RDye = 14895 + INTEGER(IntKi), PARAMETER :: M72N1RDye = 14896 + INTEGER(IntKi), PARAMETER :: M72N2RDye = 14897 + INTEGER(IntKi), PARAMETER :: M72N3RDye = 14898 + INTEGER(IntKi), PARAMETER :: M72N4RDye = 14899 + INTEGER(IntKi), PARAMETER :: M72N5RDye = 14900 + INTEGER(IntKi), PARAMETER :: M72N6RDye = 14901 + INTEGER(IntKi), PARAMETER :: M72N7RDye = 14902 + INTEGER(IntKi), PARAMETER :: M72N8RDye = 14903 + INTEGER(IntKi), PARAMETER :: M72N9RDye = 14904 + INTEGER(IntKi), PARAMETER :: M73N1RDye = 14905 + INTEGER(IntKi), PARAMETER :: M73N2RDye = 14906 + INTEGER(IntKi), PARAMETER :: M73N3RDye = 14907 + INTEGER(IntKi), PARAMETER :: M73N4RDye = 14908 + INTEGER(IntKi), PARAMETER :: M73N5RDye = 14909 + INTEGER(IntKi), PARAMETER :: M73N6RDye = 14910 + INTEGER(IntKi), PARAMETER :: M73N7RDye = 14911 + INTEGER(IntKi), PARAMETER :: M73N8RDye = 14912 + INTEGER(IntKi), PARAMETER :: M73N9RDye = 14913 + INTEGER(IntKi), PARAMETER :: M74N1RDye = 14914 + INTEGER(IntKi), PARAMETER :: M74N2RDye = 14915 + INTEGER(IntKi), PARAMETER :: M74N3RDye = 14916 + INTEGER(IntKi), PARAMETER :: M74N4RDye = 14917 + INTEGER(IntKi), PARAMETER :: M74N5RDye = 14918 + INTEGER(IntKi), PARAMETER :: M74N6RDye = 14919 + INTEGER(IntKi), PARAMETER :: M74N7RDye = 14920 + INTEGER(IntKi), PARAMETER :: M74N8RDye = 14921 + INTEGER(IntKi), PARAMETER :: M74N9RDye = 14922 + INTEGER(IntKi), PARAMETER :: M75N1RDye = 14923 + INTEGER(IntKi), PARAMETER :: M75N2RDye = 14924 + INTEGER(IntKi), PARAMETER :: M75N3RDye = 14925 + INTEGER(IntKi), PARAMETER :: M75N4RDye = 14926 + INTEGER(IntKi), PARAMETER :: M75N5RDye = 14927 + INTEGER(IntKi), PARAMETER :: M75N6RDye = 14928 + INTEGER(IntKi), PARAMETER :: M75N7RDye = 14929 + INTEGER(IntKi), PARAMETER :: M75N8RDye = 14930 + INTEGER(IntKi), PARAMETER :: M75N9RDye = 14931 + INTEGER(IntKi), PARAMETER :: M76N1RDye = 14932 + INTEGER(IntKi), PARAMETER :: M76N2RDye = 14933 + INTEGER(IntKi), PARAMETER :: M76N3RDye = 14934 + INTEGER(IntKi), PARAMETER :: M76N4RDye = 14935 + INTEGER(IntKi), PARAMETER :: M76N5RDye = 14936 + INTEGER(IntKi), PARAMETER :: M76N6RDye = 14937 + INTEGER(IntKi), PARAMETER :: M76N7RDye = 14938 + INTEGER(IntKi), PARAMETER :: M76N8RDye = 14939 + INTEGER(IntKi), PARAMETER :: M76N9RDye = 14940 + INTEGER(IntKi), PARAMETER :: M77N1RDye = 14941 + INTEGER(IntKi), PARAMETER :: M77N2RDye = 14942 + INTEGER(IntKi), PARAMETER :: M77N3RDye = 14943 + INTEGER(IntKi), PARAMETER :: M77N4RDye = 14944 + INTEGER(IntKi), PARAMETER :: M77N5RDye = 14945 + INTEGER(IntKi), PARAMETER :: M77N6RDye = 14946 + INTEGER(IntKi), PARAMETER :: M77N7RDye = 14947 + INTEGER(IntKi), PARAMETER :: M77N8RDye = 14948 + INTEGER(IntKi), PARAMETER :: M77N9RDye = 14949 + INTEGER(IntKi), PARAMETER :: M78N1RDye = 14950 + INTEGER(IntKi), PARAMETER :: M78N2RDye = 14951 + INTEGER(IntKi), PARAMETER :: M78N3RDye = 14952 + INTEGER(IntKi), PARAMETER :: M78N4RDye = 14953 + INTEGER(IntKi), PARAMETER :: M78N5RDye = 14954 + INTEGER(IntKi), PARAMETER :: M78N6RDye = 14955 + INTEGER(IntKi), PARAMETER :: M78N7RDye = 14956 + INTEGER(IntKi), PARAMETER :: M78N8RDye = 14957 + INTEGER(IntKi), PARAMETER :: M78N9RDye = 14958 + INTEGER(IntKi), PARAMETER :: M79N1RDye = 14959 + INTEGER(IntKi), PARAMETER :: M79N2RDye = 14960 + INTEGER(IntKi), PARAMETER :: M79N3RDye = 14961 + INTEGER(IntKi), PARAMETER :: M79N4RDye = 14962 + INTEGER(IntKi), PARAMETER :: M79N5RDye = 14963 + INTEGER(IntKi), PARAMETER :: M79N6RDye = 14964 + INTEGER(IntKi), PARAMETER :: M79N7RDye = 14965 + INTEGER(IntKi), PARAMETER :: M79N8RDye = 14966 + INTEGER(IntKi), PARAMETER :: M79N9RDye = 14967 + INTEGER(IntKi), PARAMETER :: M80N1RDye = 14968 + INTEGER(IntKi), PARAMETER :: M80N2RDye = 14969 + INTEGER(IntKi), PARAMETER :: M80N3RDye = 14970 + INTEGER(IntKi), PARAMETER :: M80N4RDye = 14971 + INTEGER(IntKi), PARAMETER :: M80N5RDye = 14972 + INTEGER(IntKi), PARAMETER :: M80N6RDye = 14973 + INTEGER(IntKi), PARAMETER :: M80N7RDye = 14974 + INTEGER(IntKi), PARAMETER :: M80N8RDye = 14975 + INTEGER(IntKi), PARAMETER :: M80N9RDye = 14976 + INTEGER(IntKi), PARAMETER :: M81N1RDye = 14977 + INTEGER(IntKi), PARAMETER :: M81N2RDye = 14978 + INTEGER(IntKi), PARAMETER :: M81N3RDye = 14979 + INTEGER(IntKi), PARAMETER :: M81N4RDye = 14980 + INTEGER(IntKi), PARAMETER :: M81N5RDye = 14981 + INTEGER(IntKi), PARAMETER :: M81N6RDye = 14982 + INTEGER(IntKi), PARAMETER :: M81N7RDye = 14983 + INTEGER(IntKi), PARAMETER :: M81N8RDye = 14984 + INTEGER(IntKi), PARAMETER :: M81N9RDye = 14985 + INTEGER(IntKi), PARAMETER :: M82N1RDye = 14986 + INTEGER(IntKi), PARAMETER :: M82N2RDye = 14987 + INTEGER(IntKi), PARAMETER :: M82N3RDye = 14988 + INTEGER(IntKi), PARAMETER :: M82N4RDye = 14989 + INTEGER(IntKi), PARAMETER :: M82N5RDye = 14990 + INTEGER(IntKi), PARAMETER :: M82N6RDye = 14991 + INTEGER(IntKi), PARAMETER :: M82N7RDye = 14992 + INTEGER(IntKi), PARAMETER :: M82N8RDye = 14993 + INTEGER(IntKi), PARAMETER :: M82N9RDye = 14994 + INTEGER(IntKi), PARAMETER :: M83N1RDye = 14995 + INTEGER(IntKi), PARAMETER :: M83N2RDye = 14996 + INTEGER(IntKi), PARAMETER :: M83N3RDye = 14997 + INTEGER(IntKi), PARAMETER :: M83N4RDye = 14998 + INTEGER(IntKi), PARAMETER :: M83N5RDye = 14999 + INTEGER(IntKi), PARAMETER :: M83N6RDye = 15000 + INTEGER(IntKi), PARAMETER :: M83N7RDye = 15001 + INTEGER(IntKi), PARAMETER :: M83N8RDye = 15002 + INTEGER(IntKi), PARAMETER :: M83N9RDye = 15003 + INTEGER(IntKi), PARAMETER :: M84N1RDye = 15004 + INTEGER(IntKi), PARAMETER :: M84N2RDye = 15005 + INTEGER(IntKi), PARAMETER :: M84N3RDye = 15006 + INTEGER(IntKi), PARAMETER :: M84N4RDye = 15007 + INTEGER(IntKi), PARAMETER :: M84N5RDye = 15008 + INTEGER(IntKi), PARAMETER :: M84N6RDye = 15009 + INTEGER(IntKi), PARAMETER :: M84N7RDye = 15010 + INTEGER(IntKi), PARAMETER :: M84N8RDye = 15011 + INTEGER(IntKi), PARAMETER :: M84N9RDye = 15012 + INTEGER(IntKi), PARAMETER :: M85N1RDye = 15013 + INTEGER(IntKi), PARAMETER :: M85N2RDye = 15014 + INTEGER(IntKi), PARAMETER :: M85N3RDye = 15015 + INTEGER(IntKi), PARAMETER :: M85N4RDye = 15016 + INTEGER(IntKi), PARAMETER :: M85N5RDye = 15017 + INTEGER(IntKi), PARAMETER :: M85N6RDye = 15018 + INTEGER(IntKi), PARAMETER :: M85N7RDye = 15019 + INTEGER(IntKi), PARAMETER :: M85N8RDye = 15020 + INTEGER(IntKi), PARAMETER :: M85N9RDye = 15021 + INTEGER(IntKi), PARAMETER :: M86N1RDye = 15022 + INTEGER(IntKi), PARAMETER :: M86N2RDye = 15023 + INTEGER(IntKi), PARAMETER :: M86N3RDye = 15024 + INTEGER(IntKi), PARAMETER :: M86N4RDye = 15025 + INTEGER(IntKi), PARAMETER :: M86N5RDye = 15026 + INTEGER(IntKi), PARAMETER :: M86N6RDye = 15027 + INTEGER(IntKi), PARAMETER :: M86N7RDye = 15028 + INTEGER(IntKi), PARAMETER :: M86N8RDye = 15029 + INTEGER(IntKi), PARAMETER :: M86N9RDye = 15030 + INTEGER(IntKi), PARAMETER :: M87N1RDye = 15031 + INTEGER(IntKi), PARAMETER :: M87N2RDye = 15032 + INTEGER(IntKi), PARAMETER :: M87N3RDye = 15033 + INTEGER(IntKi), PARAMETER :: M87N4RDye = 15034 + INTEGER(IntKi), PARAMETER :: M87N5RDye = 15035 + INTEGER(IntKi), PARAMETER :: M87N6RDye = 15036 + INTEGER(IntKi), PARAMETER :: M87N7RDye = 15037 + INTEGER(IntKi), PARAMETER :: M87N8RDye = 15038 + INTEGER(IntKi), PARAMETER :: M87N9RDye = 15039 + INTEGER(IntKi), PARAMETER :: M88N1RDye = 15040 + INTEGER(IntKi), PARAMETER :: M88N2RDye = 15041 + INTEGER(IntKi), PARAMETER :: M88N3RDye = 15042 + INTEGER(IntKi), PARAMETER :: M88N4RDye = 15043 + INTEGER(IntKi), PARAMETER :: M88N5RDye = 15044 + INTEGER(IntKi), PARAMETER :: M88N6RDye = 15045 + INTEGER(IntKi), PARAMETER :: M88N7RDye = 15046 + INTEGER(IntKi), PARAMETER :: M88N8RDye = 15047 + INTEGER(IntKi), PARAMETER :: M88N9RDye = 15048 + INTEGER(IntKi), PARAMETER :: M89N1RDye = 15049 + INTEGER(IntKi), PARAMETER :: M89N2RDye = 15050 + INTEGER(IntKi), PARAMETER :: M89N3RDye = 15051 + INTEGER(IntKi), PARAMETER :: M89N4RDye = 15052 + INTEGER(IntKi), PARAMETER :: M89N5RDye = 15053 + INTEGER(IntKi), PARAMETER :: M89N6RDye = 15054 + INTEGER(IntKi), PARAMETER :: M89N7RDye = 15055 + INTEGER(IntKi), PARAMETER :: M89N8RDye = 15056 + INTEGER(IntKi), PARAMETER :: M89N9RDye = 15057 + INTEGER(IntKi), PARAMETER :: M90N1RDye = 15058 + INTEGER(IntKi), PARAMETER :: M90N2RDye = 15059 + INTEGER(IntKi), PARAMETER :: M90N3RDye = 15060 + INTEGER(IntKi), PARAMETER :: M90N4RDye = 15061 + INTEGER(IntKi), PARAMETER :: M90N5RDye = 15062 + INTEGER(IntKi), PARAMETER :: M90N6RDye = 15063 + INTEGER(IntKi), PARAMETER :: M90N7RDye = 15064 + INTEGER(IntKi), PARAMETER :: M90N8RDye = 15065 + INTEGER(IntKi), PARAMETER :: M90N9RDye = 15066 + INTEGER(IntKi), PARAMETER :: M91N1RDye = 15067 + INTEGER(IntKi), PARAMETER :: M91N2RDye = 15068 + INTEGER(IntKi), PARAMETER :: M91N3RDye = 15069 + INTEGER(IntKi), PARAMETER :: M91N4RDye = 15070 + INTEGER(IntKi), PARAMETER :: M91N5RDye = 15071 + INTEGER(IntKi), PARAMETER :: M91N6RDye = 15072 + INTEGER(IntKi), PARAMETER :: M91N7RDye = 15073 + INTEGER(IntKi), PARAMETER :: M91N8RDye = 15074 + INTEGER(IntKi), PARAMETER :: M91N9RDye = 15075 + INTEGER(IntKi), PARAMETER :: M92N1RDye = 15076 + INTEGER(IntKi), PARAMETER :: M92N2RDye = 15077 + INTEGER(IntKi), PARAMETER :: M92N3RDye = 15078 + INTEGER(IntKi), PARAMETER :: M92N4RDye = 15079 + INTEGER(IntKi), PARAMETER :: M92N5RDye = 15080 + INTEGER(IntKi), PARAMETER :: M92N6RDye = 15081 + INTEGER(IntKi), PARAMETER :: M92N7RDye = 15082 + INTEGER(IntKi), PARAMETER :: M92N8RDye = 15083 + INTEGER(IntKi), PARAMETER :: M92N9RDye = 15084 + INTEGER(IntKi), PARAMETER :: M93N1RDye = 15085 + INTEGER(IntKi), PARAMETER :: M93N2RDye = 15086 + INTEGER(IntKi), PARAMETER :: M93N3RDye = 15087 + INTEGER(IntKi), PARAMETER :: M93N4RDye = 15088 + INTEGER(IntKi), PARAMETER :: M93N5RDye = 15089 + INTEGER(IntKi), PARAMETER :: M93N6RDye = 15090 + INTEGER(IntKi), PARAMETER :: M93N7RDye = 15091 + INTEGER(IntKi), PARAMETER :: M93N8RDye = 15092 + INTEGER(IntKi), PARAMETER :: M93N9RDye = 15093 + INTEGER(IntKi), PARAMETER :: M94N1RDye = 15094 + INTEGER(IntKi), PARAMETER :: M94N2RDye = 15095 + INTEGER(IntKi), PARAMETER :: M94N3RDye = 15096 + INTEGER(IntKi), PARAMETER :: M94N4RDye = 15097 + INTEGER(IntKi), PARAMETER :: M94N5RDye = 15098 + INTEGER(IntKi), PARAMETER :: M94N6RDye = 15099 + INTEGER(IntKi), PARAMETER :: M94N7RDye = 15100 + INTEGER(IntKi), PARAMETER :: M94N8RDye = 15101 + INTEGER(IntKi), PARAMETER :: M94N9RDye = 15102 + INTEGER(IntKi), PARAMETER :: M95N1RDye = 15103 + INTEGER(IntKi), PARAMETER :: M95N2RDye = 15104 + INTEGER(IntKi), PARAMETER :: M95N3RDye = 15105 + INTEGER(IntKi), PARAMETER :: M95N4RDye = 15106 + INTEGER(IntKi), PARAMETER :: M95N5RDye = 15107 + INTEGER(IntKi), PARAMETER :: M95N6RDye = 15108 + INTEGER(IntKi), PARAMETER :: M95N7RDye = 15109 + INTEGER(IntKi), PARAMETER :: M95N8RDye = 15110 + INTEGER(IntKi), PARAMETER :: M95N9RDye = 15111 + INTEGER(IntKi), PARAMETER :: M96N1RDye = 15112 + INTEGER(IntKi), PARAMETER :: M96N2RDye = 15113 + INTEGER(IntKi), PARAMETER :: M96N3RDye = 15114 + INTEGER(IntKi), PARAMETER :: M96N4RDye = 15115 + INTEGER(IntKi), PARAMETER :: M96N5RDye = 15116 + INTEGER(IntKi), PARAMETER :: M96N6RDye = 15117 + INTEGER(IntKi), PARAMETER :: M96N7RDye = 15118 + INTEGER(IntKi), PARAMETER :: M96N8RDye = 15119 + INTEGER(IntKi), PARAMETER :: M96N9RDye = 15120 + INTEGER(IntKi), PARAMETER :: M97N1RDye = 15121 + INTEGER(IntKi), PARAMETER :: M97N2RDye = 15122 + INTEGER(IntKi), PARAMETER :: M97N3RDye = 15123 + INTEGER(IntKi), PARAMETER :: M97N4RDye = 15124 + INTEGER(IntKi), PARAMETER :: M97N5RDye = 15125 + INTEGER(IntKi), PARAMETER :: M97N6RDye = 15126 + INTEGER(IntKi), PARAMETER :: M97N7RDye = 15127 + INTEGER(IntKi), PARAMETER :: M97N8RDye = 15128 + INTEGER(IntKi), PARAMETER :: M97N9RDye = 15129 + INTEGER(IntKi), PARAMETER :: M98N1RDye = 15130 + INTEGER(IntKi), PARAMETER :: M98N2RDye = 15131 + INTEGER(IntKi), PARAMETER :: M98N3RDye = 15132 + INTEGER(IntKi), PARAMETER :: M98N4RDye = 15133 + INTEGER(IntKi), PARAMETER :: M98N5RDye = 15134 + INTEGER(IntKi), PARAMETER :: M98N6RDye = 15135 + INTEGER(IntKi), PARAMETER :: M98N7RDye = 15136 + INTEGER(IntKi), PARAMETER :: M98N8RDye = 15137 + INTEGER(IntKi), PARAMETER :: M98N9RDye = 15138 + INTEGER(IntKi), PARAMETER :: M99N1RDye = 15139 + INTEGER(IntKi), PARAMETER :: M99N2RDye = 15140 + INTEGER(IntKi), PARAMETER :: M99N3RDye = 15141 + INTEGER(IntKi), PARAMETER :: M99N4RDye = 15142 + INTEGER(IntKi), PARAMETER :: M99N5RDye = 15143 + INTEGER(IntKi), PARAMETER :: M99N6RDye = 15144 + INTEGER(IntKi), PARAMETER :: M99N7RDye = 15145 + INTEGER(IntKi), PARAMETER :: M99N8RDye = 15146 + INTEGER(IntKi), PARAMETER :: M99N9RDye = 15147 + INTEGER(IntKi), PARAMETER :: M01N1RDze = 15148 + INTEGER(IntKi), PARAMETER :: M01N2RDze = 15149 + INTEGER(IntKi), PARAMETER :: M01N3RDze = 15150 + INTEGER(IntKi), PARAMETER :: M01N4RDze = 15151 + INTEGER(IntKi), PARAMETER :: M01N5RDze = 15152 + INTEGER(IntKi), PARAMETER :: M01N6RDze = 15153 + INTEGER(IntKi), PARAMETER :: M01N7RDze = 15154 + INTEGER(IntKi), PARAMETER :: M01N8RDze = 15155 + INTEGER(IntKi), PARAMETER :: M01N9RDze = 15156 + INTEGER(IntKi), PARAMETER :: M02N1RDze = 15157 + INTEGER(IntKi), PARAMETER :: M02N2RDze = 15158 + INTEGER(IntKi), PARAMETER :: M02N3RDze = 15159 + INTEGER(IntKi), PARAMETER :: M02N4RDze = 15160 + INTEGER(IntKi), PARAMETER :: M02N5RDze = 15161 + INTEGER(IntKi), PARAMETER :: M02N6RDze = 15162 + INTEGER(IntKi), PARAMETER :: M02N7RDze = 15163 + INTEGER(IntKi), PARAMETER :: M02N8RDze = 15164 + INTEGER(IntKi), PARAMETER :: M02N9RDze = 15165 + INTEGER(IntKi), PARAMETER :: M03N1RDze = 15166 + INTEGER(IntKi), PARAMETER :: M03N2RDze = 15167 + INTEGER(IntKi), PARAMETER :: M03N3RDze = 15168 + INTEGER(IntKi), PARAMETER :: M03N4RDze = 15169 + INTEGER(IntKi), PARAMETER :: M03N5RDze = 15170 + INTEGER(IntKi), PARAMETER :: M03N6RDze = 15171 + INTEGER(IntKi), PARAMETER :: M03N7RDze = 15172 + INTEGER(IntKi), PARAMETER :: M03N8RDze = 15173 + INTEGER(IntKi), PARAMETER :: M03N9RDze = 15174 + INTEGER(IntKi), PARAMETER :: M04N1RDze = 15175 + INTEGER(IntKi), PARAMETER :: M04N2RDze = 15176 + INTEGER(IntKi), PARAMETER :: M04N3RDze = 15177 + INTEGER(IntKi), PARAMETER :: M04N4RDze = 15178 + INTEGER(IntKi), PARAMETER :: M04N5RDze = 15179 + INTEGER(IntKi), PARAMETER :: M04N6RDze = 15180 + INTEGER(IntKi), PARAMETER :: M04N7RDze = 15181 + INTEGER(IntKi), PARAMETER :: M04N8RDze = 15182 + INTEGER(IntKi), PARAMETER :: M04N9RDze = 15183 + INTEGER(IntKi), PARAMETER :: M05N1RDze = 15184 + INTEGER(IntKi), PARAMETER :: M05N2RDze = 15185 + INTEGER(IntKi), PARAMETER :: M05N3RDze = 15186 + INTEGER(IntKi), PARAMETER :: M05N4RDze = 15187 + INTEGER(IntKi), PARAMETER :: M05N5RDze = 15188 + INTEGER(IntKi), PARAMETER :: M05N6RDze = 15189 + INTEGER(IntKi), PARAMETER :: M05N7RDze = 15190 + INTEGER(IntKi), PARAMETER :: M05N8RDze = 15191 + INTEGER(IntKi), PARAMETER :: M05N9RDze = 15192 + INTEGER(IntKi), PARAMETER :: M06N1RDze = 15193 + INTEGER(IntKi), PARAMETER :: M06N2RDze = 15194 + INTEGER(IntKi), PARAMETER :: M06N3RDze = 15195 + INTEGER(IntKi), PARAMETER :: M06N4RDze = 15196 + INTEGER(IntKi), PARAMETER :: M06N5RDze = 15197 + INTEGER(IntKi), PARAMETER :: M06N6RDze = 15198 + INTEGER(IntKi), PARAMETER :: M06N7RDze = 15199 + INTEGER(IntKi), PARAMETER :: M06N8RDze = 15200 + INTEGER(IntKi), PARAMETER :: M06N9RDze = 15201 + INTEGER(IntKi), PARAMETER :: M07N1RDze = 15202 + INTEGER(IntKi), PARAMETER :: M07N2RDze = 15203 + INTEGER(IntKi), PARAMETER :: M07N3RDze = 15204 + INTEGER(IntKi), PARAMETER :: M07N4RDze = 15205 + INTEGER(IntKi), PARAMETER :: M07N5RDze = 15206 + INTEGER(IntKi), PARAMETER :: M07N6RDze = 15207 + INTEGER(IntKi), PARAMETER :: M07N7RDze = 15208 + INTEGER(IntKi), PARAMETER :: M07N8RDze = 15209 + INTEGER(IntKi), PARAMETER :: M07N9RDze = 15210 + INTEGER(IntKi), PARAMETER :: M08N1RDze = 15211 + INTEGER(IntKi), PARAMETER :: M08N2RDze = 15212 + INTEGER(IntKi), PARAMETER :: M08N3RDze = 15213 + INTEGER(IntKi), PARAMETER :: M08N4RDze = 15214 + INTEGER(IntKi), PARAMETER :: M08N5RDze = 15215 + INTEGER(IntKi), PARAMETER :: M08N6RDze = 15216 + INTEGER(IntKi), PARAMETER :: M08N7RDze = 15217 + INTEGER(IntKi), PARAMETER :: M08N8RDze = 15218 + INTEGER(IntKi), PARAMETER :: M08N9RDze = 15219 + INTEGER(IntKi), PARAMETER :: M09N1RDze = 15220 + INTEGER(IntKi), PARAMETER :: M09N2RDze = 15221 + INTEGER(IntKi), PARAMETER :: M09N3RDze = 15222 + INTEGER(IntKi), PARAMETER :: M09N4RDze = 15223 + INTEGER(IntKi), PARAMETER :: M09N5RDze = 15224 + INTEGER(IntKi), PARAMETER :: M09N6RDze = 15225 + INTEGER(IntKi), PARAMETER :: M09N7RDze = 15226 + INTEGER(IntKi), PARAMETER :: M09N8RDze = 15227 + INTEGER(IntKi), PARAMETER :: M09N9RDze = 15228 + INTEGER(IntKi), PARAMETER :: M10N1RDze = 15229 + INTEGER(IntKi), PARAMETER :: M10N2RDze = 15230 + INTEGER(IntKi), PARAMETER :: M10N3RDze = 15231 + INTEGER(IntKi), PARAMETER :: M10N4RDze = 15232 + INTEGER(IntKi), PARAMETER :: M10N5RDze = 15233 + INTEGER(IntKi), PARAMETER :: M10N6RDze = 15234 + INTEGER(IntKi), PARAMETER :: M10N7RDze = 15235 + INTEGER(IntKi), PARAMETER :: M10N8RDze = 15236 + INTEGER(IntKi), PARAMETER :: M10N9RDze = 15237 + INTEGER(IntKi), PARAMETER :: M11N1RDze = 15238 + INTEGER(IntKi), PARAMETER :: M11N2RDze = 15239 + INTEGER(IntKi), PARAMETER :: M11N3RDze = 15240 + INTEGER(IntKi), PARAMETER :: M11N4RDze = 15241 + INTEGER(IntKi), PARAMETER :: M11N5RDze = 15242 + INTEGER(IntKi), PARAMETER :: M11N6RDze = 15243 + INTEGER(IntKi), PARAMETER :: M11N7RDze = 15244 + INTEGER(IntKi), PARAMETER :: M11N8RDze = 15245 + INTEGER(IntKi), PARAMETER :: M11N9RDze = 15246 + INTEGER(IntKi), PARAMETER :: M12N1RDze = 15247 + INTEGER(IntKi), PARAMETER :: M12N2RDze = 15248 + INTEGER(IntKi), PARAMETER :: M12N3RDze = 15249 + INTEGER(IntKi), PARAMETER :: M12N4RDze = 15250 + INTEGER(IntKi), PARAMETER :: M12N5RDze = 15251 + INTEGER(IntKi), PARAMETER :: M12N6RDze = 15252 + INTEGER(IntKi), PARAMETER :: M12N7RDze = 15253 + INTEGER(IntKi), PARAMETER :: M12N8RDze = 15254 + INTEGER(IntKi), PARAMETER :: M12N9RDze = 15255 + INTEGER(IntKi), PARAMETER :: M13N1RDze = 15256 + INTEGER(IntKi), PARAMETER :: M13N2RDze = 15257 + INTEGER(IntKi), PARAMETER :: M13N3RDze = 15258 + INTEGER(IntKi), PARAMETER :: M13N4RDze = 15259 + INTEGER(IntKi), PARAMETER :: M13N5RDze = 15260 + INTEGER(IntKi), PARAMETER :: M13N6RDze = 15261 + INTEGER(IntKi), PARAMETER :: M13N7RDze = 15262 + INTEGER(IntKi), PARAMETER :: M13N8RDze = 15263 + INTEGER(IntKi), PARAMETER :: M13N9RDze = 15264 + INTEGER(IntKi), PARAMETER :: M14N1RDze = 15265 + INTEGER(IntKi), PARAMETER :: M14N2RDze = 15266 + INTEGER(IntKi), PARAMETER :: M14N3RDze = 15267 + INTEGER(IntKi), PARAMETER :: M14N4RDze = 15268 + INTEGER(IntKi), PARAMETER :: M14N5RDze = 15269 + INTEGER(IntKi), PARAMETER :: M14N6RDze = 15270 + INTEGER(IntKi), PARAMETER :: M14N7RDze = 15271 + INTEGER(IntKi), PARAMETER :: M14N8RDze = 15272 + INTEGER(IntKi), PARAMETER :: M14N9RDze = 15273 + INTEGER(IntKi), PARAMETER :: M15N1RDze = 15274 + INTEGER(IntKi), PARAMETER :: M15N2RDze = 15275 + INTEGER(IntKi), PARAMETER :: M15N3RDze = 15276 + INTEGER(IntKi), PARAMETER :: M15N4RDze = 15277 + INTEGER(IntKi), PARAMETER :: M15N5RDze = 15278 + INTEGER(IntKi), PARAMETER :: M15N6RDze = 15279 + INTEGER(IntKi), PARAMETER :: M15N7RDze = 15280 + INTEGER(IntKi), PARAMETER :: M15N8RDze = 15281 + INTEGER(IntKi), PARAMETER :: M15N9RDze = 15282 + INTEGER(IntKi), PARAMETER :: M16N1RDze = 15283 + INTEGER(IntKi), PARAMETER :: M16N2RDze = 15284 + INTEGER(IntKi), PARAMETER :: M16N3RDze = 15285 + INTEGER(IntKi), PARAMETER :: M16N4RDze = 15286 + INTEGER(IntKi), PARAMETER :: M16N5RDze = 15287 + INTEGER(IntKi), PARAMETER :: M16N6RDze = 15288 + INTEGER(IntKi), PARAMETER :: M16N7RDze = 15289 + INTEGER(IntKi), PARAMETER :: M16N8RDze = 15290 + INTEGER(IntKi), PARAMETER :: M16N9RDze = 15291 + INTEGER(IntKi), PARAMETER :: M17N1RDze = 15292 + INTEGER(IntKi), PARAMETER :: M17N2RDze = 15293 + INTEGER(IntKi), PARAMETER :: M17N3RDze = 15294 + INTEGER(IntKi), PARAMETER :: M17N4RDze = 15295 + INTEGER(IntKi), PARAMETER :: M17N5RDze = 15296 + INTEGER(IntKi), PARAMETER :: M17N6RDze = 15297 + INTEGER(IntKi), PARAMETER :: M17N7RDze = 15298 + INTEGER(IntKi), PARAMETER :: M17N8RDze = 15299 + INTEGER(IntKi), PARAMETER :: M17N9RDze = 15300 + INTEGER(IntKi), PARAMETER :: M18N1RDze = 15301 + INTEGER(IntKi), PARAMETER :: M18N2RDze = 15302 + INTEGER(IntKi), PARAMETER :: M18N3RDze = 15303 + INTEGER(IntKi), PARAMETER :: M18N4RDze = 15304 + INTEGER(IntKi), PARAMETER :: M18N5RDze = 15305 + INTEGER(IntKi), PARAMETER :: M18N6RDze = 15306 + INTEGER(IntKi), PARAMETER :: M18N7RDze = 15307 + INTEGER(IntKi), PARAMETER :: M18N8RDze = 15308 + INTEGER(IntKi), PARAMETER :: M18N9RDze = 15309 + INTEGER(IntKi), PARAMETER :: M19N1RDze = 15310 + INTEGER(IntKi), PARAMETER :: M19N2RDze = 15311 + INTEGER(IntKi), PARAMETER :: M19N3RDze = 15312 + INTEGER(IntKi), PARAMETER :: M19N4RDze = 15313 + INTEGER(IntKi), PARAMETER :: M19N5RDze = 15314 + INTEGER(IntKi), PARAMETER :: M19N6RDze = 15315 + INTEGER(IntKi), PARAMETER :: M19N7RDze = 15316 + INTEGER(IntKi), PARAMETER :: M19N8RDze = 15317 + INTEGER(IntKi), PARAMETER :: M19N9RDze = 15318 + INTEGER(IntKi), PARAMETER :: M20N1RDze = 15319 + INTEGER(IntKi), PARAMETER :: M20N2RDze = 15320 + INTEGER(IntKi), PARAMETER :: M20N3RDze = 15321 + INTEGER(IntKi), PARAMETER :: M20N4RDze = 15322 + INTEGER(IntKi), PARAMETER :: M20N5RDze = 15323 + INTEGER(IntKi), PARAMETER :: M20N6RDze = 15324 + INTEGER(IntKi), PARAMETER :: M20N7RDze = 15325 + INTEGER(IntKi), PARAMETER :: M20N8RDze = 15326 + INTEGER(IntKi), PARAMETER :: M20N9RDze = 15327 + INTEGER(IntKi), PARAMETER :: M21N1RDze = 15328 + INTEGER(IntKi), PARAMETER :: M21N2RDze = 15329 + INTEGER(IntKi), PARAMETER :: M21N3RDze = 15330 + INTEGER(IntKi), PARAMETER :: M21N4RDze = 15331 + INTEGER(IntKi), PARAMETER :: M21N5RDze = 15332 + INTEGER(IntKi), PARAMETER :: M21N6RDze = 15333 + INTEGER(IntKi), PARAMETER :: M21N7RDze = 15334 + INTEGER(IntKi), PARAMETER :: M21N8RDze = 15335 + INTEGER(IntKi), PARAMETER :: M21N9RDze = 15336 + INTEGER(IntKi), PARAMETER :: M22N1RDze = 15337 + INTEGER(IntKi), PARAMETER :: M22N2RDze = 15338 + INTEGER(IntKi), PARAMETER :: M22N3RDze = 15339 + INTEGER(IntKi), PARAMETER :: M22N4RDze = 15340 + INTEGER(IntKi), PARAMETER :: M22N5RDze = 15341 + INTEGER(IntKi), PARAMETER :: M22N6RDze = 15342 + INTEGER(IntKi), PARAMETER :: M22N7RDze = 15343 + INTEGER(IntKi), PARAMETER :: M22N8RDze = 15344 + INTEGER(IntKi), PARAMETER :: M22N9RDze = 15345 + INTEGER(IntKi), PARAMETER :: M23N1RDze = 15346 + INTEGER(IntKi), PARAMETER :: M23N2RDze = 15347 + INTEGER(IntKi), PARAMETER :: M23N3RDze = 15348 + INTEGER(IntKi), PARAMETER :: M23N4RDze = 15349 + INTEGER(IntKi), PARAMETER :: M23N5RDze = 15350 + INTEGER(IntKi), PARAMETER :: M23N6RDze = 15351 + INTEGER(IntKi), PARAMETER :: M23N7RDze = 15352 + INTEGER(IntKi), PARAMETER :: M23N8RDze = 15353 + INTEGER(IntKi), PARAMETER :: M23N9RDze = 15354 + INTEGER(IntKi), PARAMETER :: M24N1RDze = 15355 + INTEGER(IntKi), PARAMETER :: M24N2RDze = 15356 + INTEGER(IntKi), PARAMETER :: M24N3RDze = 15357 + INTEGER(IntKi), PARAMETER :: M24N4RDze = 15358 + INTEGER(IntKi), PARAMETER :: M24N5RDze = 15359 + INTEGER(IntKi), PARAMETER :: M24N6RDze = 15360 + INTEGER(IntKi), PARAMETER :: M24N7RDze = 15361 + INTEGER(IntKi), PARAMETER :: M24N8RDze = 15362 + INTEGER(IntKi), PARAMETER :: M24N9RDze = 15363 + INTEGER(IntKi), PARAMETER :: M25N1RDze = 15364 + INTEGER(IntKi), PARAMETER :: M25N2RDze = 15365 + INTEGER(IntKi), PARAMETER :: M25N3RDze = 15366 + INTEGER(IntKi), PARAMETER :: M25N4RDze = 15367 + INTEGER(IntKi), PARAMETER :: M25N5RDze = 15368 + INTEGER(IntKi), PARAMETER :: M25N6RDze = 15369 + INTEGER(IntKi), PARAMETER :: M25N7RDze = 15370 + INTEGER(IntKi), PARAMETER :: M25N8RDze = 15371 + INTEGER(IntKi), PARAMETER :: M25N9RDze = 15372 + INTEGER(IntKi), PARAMETER :: M26N1RDze = 15373 + INTEGER(IntKi), PARAMETER :: M26N2RDze = 15374 + INTEGER(IntKi), PARAMETER :: M26N3RDze = 15375 + INTEGER(IntKi), PARAMETER :: M26N4RDze = 15376 + INTEGER(IntKi), PARAMETER :: M26N5RDze = 15377 + INTEGER(IntKi), PARAMETER :: M26N6RDze = 15378 + INTEGER(IntKi), PARAMETER :: M26N7RDze = 15379 + INTEGER(IntKi), PARAMETER :: M26N8RDze = 15380 + INTEGER(IntKi), PARAMETER :: M26N9RDze = 15381 + INTEGER(IntKi), PARAMETER :: M27N1RDze = 15382 + INTEGER(IntKi), PARAMETER :: M27N2RDze = 15383 + INTEGER(IntKi), PARAMETER :: M27N3RDze = 15384 + INTEGER(IntKi), PARAMETER :: M27N4RDze = 15385 + INTEGER(IntKi), PARAMETER :: M27N5RDze = 15386 + INTEGER(IntKi), PARAMETER :: M27N6RDze = 15387 + INTEGER(IntKi), PARAMETER :: M27N7RDze = 15388 + INTEGER(IntKi), PARAMETER :: M27N8RDze = 15389 + INTEGER(IntKi), PARAMETER :: M27N9RDze = 15390 + INTEGER(IntKi), PARAMETER :: M28N1RDze = 15391 + INTEGER(IntKi), PARAMETER :: M28N2RDze = 15392 + INTEGER(IntKi), PARAMETER :: M28N3RDze = 15393 + INTEGER(IntKi), PARAMETER :: M28N4RDze = 15394 + INTEGER(IntKi), PARAMETER :: M28N5RDze = 15395 + INTEGER(IntKi), PARAMETER :: M28N6RDze = 15396 + INTEGER(IntKi), PARAMETER :: M28N7RDze = 15397 + INTEGER(IntKi), PARAMETER :: M28N8RDze = 15398 + INTEGER(IntKi), PARAMETER :: M28N9RDze = 15399 + INTEGER(IntKi), PARAMETER :: M29N1RDze = 15400 + INTEGER(IntKi), PARAMETER :: M29N2RDze = 15401 + INTEGER(IntKi), PARAMETER :: M29N3RDze = 15402 + INTEGER(IntKi), PARAMETER :: M29N4RDze = 15403 + INTEGER(IntKi), PARAMETER :: M29N5RDze = 15404 + INTEGER(IntKi), PARAMETER :: M29N6RDze = 15405 + INTEGER(IntKi), PARAMETER :: M29N7RDze = 15406 + INTEGER(IntKi), PARAMETER :: M29N8RDze = 15407 + INTEGER(IntKi), PARAMETER :: M29N9RDze = 15408 + INTEGER(IntKi), PARAMETER :: M30N1RDze = 15409 + INTEGER(IntKi), PARAMETER :: M30N2RDze = 15410 + INTEGER(IntKi), PARAMETER :: M30N3RDze = 15411 + INTEGER(IntKi), PARAMETER :: M30N4RDze = 15412 + INTEGER(IntKi), PARAMETER :: M30N5RDze = 15413 + INTEGER(IntKi), PARAMETER :: M30N6RDze = 15414 + INTEGER(IntKi), PARAMETER :: M30N7RDze = 15415 + INTEGER(IntKi), PARAMETER :: M30N8RDze = 15416 + INTEGER(IntKi), PARAMETER :: M30N9RDze = 15417 + INTEGER(IntKi), PARAMETER :: M31N1RDze = 15418 + INTEGER(IntKi), PARAMETER :: M31N2RDze = 15419 + INTEGER(IntKi), PARAMETER :: M31N3RDze = 15420 + INTEGER(IntKi), PARAMETER :: M31N4RDze = 15421 + INTEGER(IntKi), PARAMETER :: M31N5RDze = 15422 + INTEGER(IntKi), PARAMETER :: M31N6RDze = 15423 + INTEGER(IntKi), PARAMETER :: M31N7RDze = 15424 + INTEGER(IntKi), PARAMETER :: M31N8RDze = 15425 + INTEGER(IntKi), PARAMETER :: M31N9RDze = 15426 + INTEGER(IntKi), PARAMETER :: M32N1RDze = 15427 + INTEGER(IntKi), PARAMETER :: M32N2RDze = 15428 + INTEGER(IntKi), PARAMETER :: M32N3RDze = 15429 + INTEGER(IntKi), PARAMETER :: M32N4RDze = 15430 + INTEGER(IntKi), PARAMETER :: M32N5RDze = 15431 + INTEGER(IntKi), PARAMETER :: M32N6RDze = 15432 + INTEGER(IntKi), PARAMETER :: M32N7RDze = 15433 + INTEGER(IntKi), PARAMETER :: M32N8RDze = 15434 + INTEGER(IntKi), PARAMETER :: M32N9RDze = 15435 + INTEGER(IntKi), PARAMETER :: M33N1RDze = 15436 + INTEGER(IntKi), PARAMETER :: M33N2RDze = 15437 + INTEGER(IntKi), PARAMETER :: M33N3RDze = 15438 + INTEGER(IntKi), PARAMETER :: M33N4RDze = 15439 + INTEGER(IntKi), PARAMETER :: M33N5RDze = 15440 + INTEGER(IntKi), PARAMETER :: M33N6RDze = 15441 + INTEGER(IntKi), PARAMETER :: M33N7RDze = 15442 + INTEGER(IntKi), PARAMETER :: M33N8RDze = 15443 + INTEGER(IntKi), PARAMETER :: M33N9RDze = 15444 + INTEGER(IntKi), PARAMETER :: M34N1RDze = 15445 + INTEGER(IntKi), PARAMETER :: M34N2RDze = 15446 + INTEGER(IntKi), PARAMETER :: M34N3RDze = 15447 + INTEGER(IntKi), PARAMETER :: M34N4RDze = 15448 + INTEGER(IntKi), PARAMETER :: M34N5RDze = 15449 + INTEGER(IntKi), PARAMETER :: M34N6RDze = 15450 + INTEGER(IntKi), PARAMETER :: M34N7RDze = 15451 + INTEGER(IntKi), PARAMETER :: M34N8RDze = 15452 + INTEGER(IntKi), PARAMETER :: M34N9RDze = 15453 + INTEGER(IntKi), PARAMETER :: M35N1RDze = 15454 + INTEGER(IntKi), PARAMETER :: M35N2RDze = 15455 + INTEGER(IntKi), PARAMETER :: M35N3RDze = 15456 + INTEGER(IntKi), PARAMETER :: M35N4RDze = 15457 + INTEGER(IntKi), PARAMETER :: M35N5RDze = 15458 + INTEGER(IntKi), PARAMETER :: M35N6RDze = 15459 + INTEGER(IntKi), PARAMETER :: M35N7RDze = 15460 + INTEGER(IntKi), PARAMETER :: M35N8RDze = 15461 + INTEGER(IntKi), PARAMETER :: M35N9RDze = 15462 + INTEGER(IntKi), PARAMETER :: M36N1RDze = 15463 + INTEGER(IntKi), PARAMETER :: M36N2RDze = 15464 + INTEGER(IntKi), PARAMETER :: M36N3RDze = 15465 + INTEGER(IntKi), PARAMETER :: M36N4RDze = 15466 + INTEGER(IntKi), PARAMETER :: M36N5RDze = 15467 + INTEGER(IntKi), PARAMETER :: M36N6RDze = 15468 + INTEGER(IntKi), PARAMETER :: M36N7RDze = 15469 + INTEGER(IntKi), PARAMETER :: M36N8RDze = 15470 + INTEGER(IntKi), PARAMETER :: M36N9RDze = 15471 + INTEGER(IntKi), PARAMETER :: M37N1RDze = 15472 + INTEGER(IntKi), PARAMETER :: M37N2RDze = 15473 + INTEGER(IntKi), PARAMETER :: M37N3RDze = 15474 + INTEGER(IntKi), PARAMETER :: M37N4RDze = 15475 + INTEGER(IntKi), PARAMETER :: M37N5RDze = 15476 + INTEGER(IntKi), PARAMETER :: M37N6RDze = 15477 + INTEGER(IntKi), PARAMETER :: M37N7RDze = 15478 + INTEGER(IntKi), PARAMETER :: M37N8RDze = 15479 + INTEGER(IntKi), PARAMETER :: M37N9RDze = 15480 + INTEGER(IntKi), PARAMETER :: M38N1RDze = 15481 + INTEGER(IntKi), PARAMETER :: M38N2RDze = 15482 + INTEGER(IntKi), PARAMETER :: M38N3RDze = 15483 + INTEGER(IntKi), PARAMETER :: M38N4RDze = 15484 + INTEGER(IntKi), PARAMETER :: M38N5RDze = 15485 + INTEGER(IntKi), PARAMETER :: M38N6RDze = 15486 + INTEGER(IntKi), PARAMETER :: M38N7RDze = 15487 + INTEGER(IntKi), PARAMETER :: M38N8RDze = 15488 + INTEGER(IntKi), PARAMETER :: M38N9RDze = 15489 + INTEGER(IntKi), PARAMETER :: M39N1RDze = 15490 + INTEGER(IntKi), PARAMETER :: M39N2RDze = 15491 + INTEGER(IntKi), PARAMETER :: M39N3RDze = 15492 + INTEGER(IntKi), PARAMETER :: M39N4RDze = 15493 + INTEGER(IntKi), PARAMETER :: M39N5RDze = 15494 + INTEGER(IntKi), PARAMETER :: M39N6RDze = 15495 + INTEGER(IntKi), PARAMETER :: M39N7RDze = 15496 + INTEGER(IntKi), PARAMETER :: M39N8RDze = 15497 + INTEGER(IntKi), PARAMETER :: M39N9RDze = 15498 + INTEGER(IntKi), PARAMETER :: M40N1RDze = 15499 + INTEGER(IntKi), PARAMETER :: M40N2RDze = 15500 + INTEGER(IntKi), PARAMETER :: M40N3RDze = 15501 + INTEGER(IntKi), PARAMETER :: M40N4RDze = 15502 + INTEGER(IntKi), PARAMETER :: M40N5RDze = 15503 + INTEGER(IntKi), PARAMETER :: M40N6RDze = 15504 + INTEGER(IntKi), PARAMETER :: M40N7RDze = 15505 + INTEGER(IntKi), PARAMETER :: M40N8RDze = 15506 + INTEGER(IntKi), PARAMETER :: M40N9RDze = 15507 + INTEGER(IntKi), PARAMETER :: M41N1RDze = 15508 + INTEGER(IntKi), PARAMETER :: M41N2RDze = 15509 + INTEGER(IntKi), PARAMETER :: M41N3RDze = 15510 + INTEGER(IntKi), PARAMETER :: M41N4RDze = 15511 + INTEGER(IntKi), PARAMETER :: M41N5RDze = 15512 + INTEGER(IntKi), PARAMETER :: M41N6RDze = 15513 + INTEGER(IntKi), PARAMETER :: M41N7RDze = 15514 + INTEGER(IntKi), PARAMETER :: M41N8RDze = 15515 + INTEGER(IntKi), PARAMETER :: M41N9RDze = 15516 + INTEGER(IntKi), PARAMETER :: M42N1RDze = 15517 + INTEGER(IntKi), PARAMETER :: M42N2RDze = 15518 + INTEGER(IntKi), PARAMETER :: M42N3RDze = 15519 + INTEGER(IntKi), PARAMETER :: M42N4RDze = 15520 + INTEGER(IntKi), PARAMETER :: M42N5RDze = 15521 + INTEGER(IntKi), PARAMETER :: M42N6RDze = 15522 + INTEGER(IntKi), PARAMETER :: M42N7RDze = 15523 + INTEGER(IntKi), PARAMETER :: M42N8RDze = 15524 + INTEGER(IntKi), PARAMETER :: M42N9RDze = 15525 + INTEGER(IntKi), PARAMETER :: M43N1RDze = 15526 + INTEGER(IntKi), PARAMETER :: M43N2RDze = 15527 + INTEGER(IntKi), PARAMETER :: M43N3RDze = 15528 + INTEGER(IntKi), PARAMETER :: M43N4RDze = 15529 + INTEGER(IntKi), PARAMETER :: M43N5RDze = 15530 + INTEGER(IntKi), PARAMETER :: M43N6RDze = 15531 + INTEGER(IntKi), PARAMETER :: M43N7RDze = 15532 + INTEGER(IntKi), PARAMETER :: M43N8RDze = 15533 + INTEGER(IntKi), PARAMETER :: M43N9RDze = 15534 + INTEGER(IntKi), PARAMETER :: M44N1RDze = 15535 + INTEGER(IntKi), PARAMETER :: M44N2RDze = 15536 + INTEGER(IntKi), PARAMETER :: M44N3RDze = 15537 + INTEGER(IntKi), PARAMETER :: M44N4RDze = 15538 + INTEGER(IntKi), PARAMETER :: M44N5RDze = 15539 + INTEGER(IntKi), PARAMETER :: M44N6RDze = 15540 + INTEGER(IntKi), PARAMETER :: M44N7RDze = 15541 + INTEGER(IntKi), PARAMETER :: M44N8RDze = 15542 + INTEGER(IntKi), PARAMETER :: M44N9RDze = 15543 + INTEGER(IntKi), PARAMETER :: M45N1RDze = 15544 + INTEGER(IntKi), PARAMETER :: M45N2RDze = 15545 + INTEGER(IntKi), PARAMETER :: M45N3RDze = 15546 + INTEGER(IntKi), PARAMETER :: M45N4RDze = 15547 + INTEGER(IntKi), PARAMETER :: M45N5RDze = 15548 + INTEGER(IntKi), PARAMETER :: M45N6RDze = 15549 + INTEGER(IntKi), PARAMETER :: M45N7RDze = 15550 + INTEGER(IntKi), PARAMETER :: M45N8RDze = 15551 + INTEGER(IntKi), PARAMETER :: M45N9RDze = 15552 + INTEGER(IntKi), PARAMETER :: M46N1RDze = 15553 + INTEGER(IntKi), PARAMETER :: M46N2RDze = 15554 + INTEGER(IntKi), PARAMETER :: M46N3RDze = 15555 + INTEGER(IntKi), PARAMETER :: M46N4RDze = 15556 + INTEGER(IntKi), PARAMETER :: M46N5RDze = 15557 + INTEGER(IntKi), PARAMETER :: M46N6RDze = 15558 + INTEGER(IntKi), PARAMETER :: M46N7RDze = 15559 + INTEGER(IntKi), PARAMETER :: M46N8RDze = 15560 + INTEGER(IntKi), PARAMETER :: M46N9RDze = 15561 + INTEGER(IntKi), PARAMETER :: M47N1RDze = 15562 + INTEGER(IntKi), PARAMETER :: M47N2RDze = 15563 + INTEGER(IntKi), PARAMETER :: M47N3RDze = 15564 + INTEGER(IntKi), PARAMETER :: M47N4RDze = 15565 + INTEGER(IntKi), PARAMETER :: M47N5RDze = 15566 + INTEGER(IntKi), PARAMETER :: M47N6RDze = 15567 + INTEGER(IntKi), PARAMETER :: M47N7RDze = 15568 + INTEGER(IntKi), PARAMETER :: M47N8RDze = 15569 + INTEGER(IntKi), PARAMETER :: M47N9RDze = 15570 + INTEGER(IntKi), PARAMETER :: M48N1RDze = 15571 + INTEGER(IntKi), PARAMETER :: M48N2RDze = 15572 + INTEGER(IntKi), PARAMETER :: M48N3RDze = 15573 + INTEGER(IntKi), PARAMETER :: M48N4RDze = 15574 + INTEGER(IntKi), PARAMETER :: M48N5RDze = 15575 + INTEGER(IntKi), PARAMETER :: M48N6RDze = 15576 + INTEGER(IntKi), PARAMETER :: M48N7RDze = 15577 + INTEGER(IntKi), PARAMETER :: M48N8RDze = 15578 + INTEGER(IntKi), PARAMETER :: M48N9RDze = 15579 + INTEGER(IntKi), PARAMETER :: M49N1RDze = 15580 + INTEGER(IntKi), PARAMETER :: M49N2RDze = 15581 + INTEGER(IntKi), PARAMETER :: M49N3RDze = 15582 + INTEGER(IntKi), PARAMETER :: M49N4RDze = 15583 + INTEGER(IntKi), PARAMETER :: M49N5RDze = 15584 + INTEGER(IntKi), PARAMETER :: M49N6RDze = 15585 + INTEGER(IntKi), PARAMETER :: M49N7RDze = 15586 + INTEGER(IntKi), PARAMETER :: M49N8RDze = 15587 + INTEGER(IntKi), PARAMETER :: M49N9RDze = 15588 + INTEGER(IntKi), PARAMETER :: M50N1RDze = 15589 + INTEGER(IntKi), PARAMETER :: M50N2RDze = 15590 + INTEGER(IntKi), PARAMETER :: M50N3RDze = 15591 + INTEGER(IntKi), PARAMETER :: M50N4RDze = 15592 + INTEGER(IntKi), PARAMETER :: M50N5RDze = 15593 + INTEGER(IntKi), PARAMETER :: M50N6RDze = 15594 + INTEGER(IntKi), PARAMETER :: M50N7RDze = 15595 + INTEGER(IntKi), PARAMETER :: M50N8RDze = 15596 + INTEGER(IntKi), PARAMETER :: M50N9RDze = 15597 + INTEGER(IntKi), PARAMETER :: M51N1RDze = 15598 + INTEGER(IntKi), PARAMETER :: M51N2RDze = 15599 + INTEGER(IntKi), PARAMETER :: M51N3RDze = 15600 + INTEGER(IntKi), PARAMETER :: M51N4RDze = 15601 + INTEGER(IntKi), PARAMETER :: M51N5RDze = 15602 + INTEGER(IntKi), PARAMETER :: M51N6RDze = 15603 + INTEGER(IntKi), PARAMETER :: M51N7RDze = 15604 + INTEGER(IntKi), PARAMETER :: M51N8RDze = 15605 + INTEGER(IntKi), PARAMETER :: M51N9RDze = 15606 + INTEGER(IntKi), PARAMETER :: M52N1RDze = 15607 + INTEGER(IntKi), PARAMETER :: M52N2RDze = 15608 + INTEGER(IntKi), PARAMETER :: M52N3RDze = 15609 + INTEGER(IntKi), PARAMETER :: M52N4RDze = 15610 + INTEGER(IntKi), PARAMETER :: M52N5RDze = 15611 + INTEGER(IntKi), PARAMETER :: M52N6RDze = 15612 + INTEGER(IntKi), PARAMETER :: M52N7RDze = 15613 + INTEGER(IntKi), PARAMETER :: M52N8RDze = 15614 + INTEGER(IntKi), PARAMETER :: M52N9RDze = 15615 + INTEGER(IntKi), PARAMETER :: M53N1RDze = 15616 + INTEGER(IntKi), PARAMETER :: M53N2RDze = 15617 + INTEGER(IntKi), PARAMETER :: M53N3RDze = 15618 + INTEGER(IntKi), PARAMETER :: M53N4RDze = 15619 + INTEGER(IntKi), PARAMETER :: M53N5RDze = 15620 + INTEGER(IntKi), PARAMETER :: M53N6RDze = 15621 + INTEGER(IntKi), PARAMETER :: M53N7RDze = 15622 + INTEGER(IntKi), PARAMETER :: M53N8RDze = 15623 + INTEGER(IntKi), PARAMETER :: M53N9RDze = 15624 + INTEGER(IntKi), PARAMETER :: M54N1RDze = 15625 + INTEGER(IntKi), PARAMETER :: M54N2RDze = 15626 + INTEGER(IntKi), PARAMETER :: M54N3RDze = 15627 + INTEGER(IntKi), PARAMETER :: M54N4RDze = 15628 + INTEGER(IntKi), PARAMETER :: M54N5RDze = 15629 + INTEGER(IntKi), PARAMETER :: M54N6RDze = 15630 + INTEGER(IntKi), PARAMETER :: M54N7RDze = 15631 + INTEGER(IntKi), PARAMETER :: M54N8RDze = 15632 + INTEGER(IntKi), PARAMETER :: M54N9RDze = 15633 + INTEGER(IntKi), PARAMETER :: M55N1RDze = 15634 + INTEGER(IntKi), PARAMETER :: M55N2RDze = 15635 + INTEGER(IntKi), PARAMETER :: M55N3RDze = 15636 + INTEGER(IntKi), PARAMETER :: M55N4RDze = 15637 + INTEGER(IntKi), PARAMETER :: M55N5RDze = 15638 + INTEGER(IntKi), PARAMETER :: M55N6RDze = 15639 + INTEGER(IntKi), PARAMETER :: M55N7RDze = 15640 + INTEGER(IntKi), PARAMETER :: M55N8RDze = 15641 + INTEGER(IntKi), PARAMETER :: M55N9RDze = 15642 + INTEGER(IntKi), PARAMETER :: M56N1RDze = 15643 + INTEGER(IntKi), PARAMETER :: M56N2RDze = 15644 + INTEGER(IntKi), PARAMETER :: M56N3RDze = 15645 + INTEGER(IntKi), PARAMETER :: M56N4RDze = 15646 + INTEGER(IntKi), PARAMETER :: M56N5RDze = 15647 + INTEGER(IntKi), PARAMETER :: M56N6RDze = 15648 + INTEGER(IntKi), PARAMETER :: M56N7RDze = 15649 + INTEGER(IntKi), PARAMETER :: M56N8RDze = 15650 + INTEGER(IntKi), PARAMETER :: M56N9RDze = 15651 + INTEGER(IntKi), PARAMETER :: M57N1RDze = 15652 + INTEGER(IntKi), PARAMETER :: M57N2RDze = 15653 + INTEGER(IntKi), PARAMETER :: M57N3RDze = 15654 + INTEGER(IntKi), PARAMETER :: M57N4RDze = 15655 + INTEGER(IntKi), PARAMETER :: M57N5RDze = 15656 + INTEGER(IntKi), PARAMETER :: M57N6RDze = 15657 + INTEGER(IntKi), PARAMETER :: M57N7RDze = 15658 + INTEGER(IntKi), PARAMETER :: M57N8RDze = 15659 + INTEGER(IntKi), PARAMETER :: M57N9RDze = 15660 + INTEGER(IntKi), PARAMETER :: M58N1RDze = 15661 + INTEGER(IntKi), PARAMETER :: M58N2RDze = 15662 + INTEGER(IntKi), PARAMETER :: M58N3RDze = 15663 + INTEGER(IntKi), PARAMETER :: M58N4RDze = 15664 + INTEGER(IntKi), PARAMETER :: M58N5RDze = 15665 + INTEGER(IntKi), PARAMETER :: M58N6RDze = 15666 + INTEGER(IntKi), PARAMETER :: M58N7RDze = 15667 + INTEGER(IntKi), PARAMETER :: M58N8RDze = 15668 + INTEGER(IntKi), PARAMETER :: M58N9RDze = 15669 + INTEGER(IntKi), PARAMETER :: M59N1RDze = 15670 + INTEGER(IntKi), PARAMETER :: M59N2RDze = 15671 + INTEGER(IntKi), PARAMETER :: M59N3RDze = 15672 + INTEGER(IntKi), PARAMETER :: M59N4RDze = 15673 + INTEGER(IntKi), PARAMETER :: M59N5RDze = 15674 + INTEGER(IntKi), PARAMETER :: M59N6RDze = 15675 + INTEGER(IntKi), PARAMETER :: M59N7RDze = 15676 + INTEGER(IntKi), PARAMETER :: M59N8RDze = 15677 + INTEGER(IntKi), PARAMETER :: M59N9RDze = 15678 + INTEGER(IntKi), PARAMETER :: M60N1RDze = 15679 + INTEGER(IntKi), PARAMETER :: M60N2RDze = 15680 + INTEGER(IntKi), PARAMETER :: M60N3RDze = 15681 + INTEGER(IntKi), PARAMETER :: M60N4RDze = 15682 + INTEGER(IntKi), PARAMETER :: M60N5RDze = 15683 + INTEGER(IntKi), PARAMETER :: M60N6RDze = 15684 + INTEGER(IntKi), PARAMETER :: M60N7RDze = 15685 + INTEGER(IntKi), PARAMETER :: M60N8RDze = 15686 + INTEGER(IntKi), PARAMETER :: M60N9RDze = 15687 + INTEGER(IntKi), PARAMETER :: M61N1RDze = 15688 + INTEGER(IntKi), PARAMETER :: M61N2RDze = 15689 + INTEGER(IntKi), PARAMETER :: M61N3RDze = 15690 + INTEGER(IntKi), PARAMETER :: M61N4RDze = 15691 + INTEGER(IntKi), PARAMETER :: M61N5RDze = 15692 + INTEGER(IntKi), PARAMETER :: M61N6RDze = 15693 + INTEGER(IntKi), PARAMETER :: M61N7RDze = 15694 + INTEGER(IntKi), PARAMETER :: M61N8RDze = 15695 + INTEGER(IntKi), PARAMETER :: M61N9RDze = 15696 + INTEGER(IntKi), PARAMETER :: M62N1RDze = 15697 + INTEGER(IntKi), PARAMETER :: M62N2RDze = 15698 + INTEGER(IntKi), PARAMETER :: M62N3RDze = 15699 + INTEGER(IntKi), PARAMETER :: M62N4RDze = 15700 + INTEGER(IntKi), PARAMETER :: M62N5RDze = 15701 + INTEGER(IntKi), PARAMETER :: M62N6RDze = 15702 + INTEGER(IntKi), PARAMETER :: M62N7RDze = 15703 + INTEGER(IntKi), PARAMETER :: M62N8RDze = 15704 + INTEGER(IntKi), PARAMETER :: M62N9RDze = 15705 + INTEGER(IntKi), PARAMETER :: M63N1RDze = 15706 + INTEGER(IntKi), PARAMETER :: M63N2RDze = 15707 + INTEGER(IntKi), PARAMETER :: M63N3RDze = 15708 + INTEGER(IntKi), PARAMETER :: M63N4RDze = 15709 + INTEGER(IntKi), PARAMETER :: M63N5RDze = 15710 + INTEGER(IntKi), PARAMETER :: M63N6RDze = 15711 + INTEGER(IntKi), PARAMETER :: M63N7RDze = 15712 + INTEGER(IntKi), PARAMETER :: M63N8RDze = 15713 + INTEGER(IntKi), PARAMETER :: M63N9RDze = 15714 + INTEGER(IntKi), PARAMETER :: M64N1RDze = 15715 + INTEGER(IntKi), PARAMETER :: M64N2RDze = 15716 + INTEGER(IntKi), PARAMETER :: M64N3RDze = 15717 + INTEGER(IntKi), PARAMETER :: M64N4RDze = 15718 + INTEGER(IntKi), PARAMETER :: M64N5RDze = 15719 + INTEGER(IntKi), PARAMETER :: M64N6RDze = 15720 + INTEGER(IntKi), PARAMETER :: M64N7RDze = 15721 + INTEGER(IntKi), PARAMETER :: M64N8RDze = 15722 + INTEGER(IntKi), PARAMETER :: M64N9RDze = 15723 + INTEGER(IntKi), PARAMETER :: M65N1RDze = 15724 + INTEGER(IntKi), PARAMETER :: M65N2RDze = 15725 + INTEGER(IntKi), PARAMETER :: M65N3RDze = 15726 + INTEGER(IntKi), PARAMETER :: M65N4RDze = 15727 + INTEGER(IntKi), PARAMETER :: M65N5RDze = 15728 + INTEGER(IntKi), PARAMETER :: M65N6RDze = 15729 + INTEGER(IntKi), PARAMETER :: M65N7RDze = 15730 + INTEGER(IntKi), PARAMETER :: M65N8RDze = 15731 + INTEGER(IntKi), PARAMETER :: M65N9RDze = 15732 + INTEGER(IntKi), PARAMETER :: M66N1RDze = 15733 + INTEGER(IntKi), PARAMETER :: M66N2RDze = 15734 + INTEGER(IntKi), PARAMETER :: M66N3RDze = 15735 + INTEGER(IntKi), PARAMETER :: M66N4RDze = 15736 + INTEGER(IntKi), PARAMETER :: M66N5RDze = 15737 + INTEGER(IntKi), PARAMETER :: M66N6RDze = 15738 + INTEGER(IntKi), PARAMETER :: M66N7RDze = 15739 + INTEGER(IntKi), PARAMETER :: M66N8RDze = 15740 + INTEGER(IntKi), PARAMETER :: M66N9RDze = 15741 + INTEGER(IntKi), PARAMETER :: M67N1RDze = 15742 + INTEGER(IntKi), PARAMETER :: M67N2RDze = 15743 + INTEGER(IntKi), PARAMETER :: M67N3RDze = 15744 + INTEGER(IntKi), PARAMETER :: M67N4RDze = 15745 + INTEGER(IntKi), PARAMETER :: M67N5RDze = 15746 + INTEGER(IntKi), PARAMETER :: M67N6RDze = 15747 + INTEGER(IntKi), PARAMETER :: M67N7RDze = 15748 + INTEGER(IntKi), PARAMETER :: M67N8RDze = 15749 + INTEGER(IntKi), PARAMETER :: M67N9RDze = 15750 + INTEGER(IntKi), PARAMETER :: M68N1RDze = 15751 + INTEGER(IntKi), PARAMETER :: M68N2RDze = 15752 + INTEGER(IntKi), PARAMETER :: M68N3RDze = 15753 + INTEGER(IntKi), PARAMETER :: M68N4RDze = 15754 + INTEGER(IntKi), PARAMETER :: M68N5RDze = 15755 + INTEGER(IntKi), PARAMETER :: M68N6RDze = 15756 + INTEGER(IntKi), PARAMETER :: M68N7RDze = 15757 + INTEGER(IntKi), PARAMETER :: M68N8RDze = 15758 + INTEGER(IntKi), PARAMETER :: M68N9RDze = 15759 + INTEGER(IntKi), PARAMETER :: M69N1RDze = 15760 + INTEGER(IntKi), PARAMETER :: M69N2RDze = 15761 + INTEGER(IntKi), PARAMETER :: M69N3RDze = 15762 + INTEGER(IntKi), PARAMETER :: M69N4RDze = 15763 + INTEGER(IntKi), PARAMETER :: M69N5RDze = 15764 + INTEGER(IntKi), PARAMETER :: M69N6RDze = 15765 + INTEGER(IntKi), PARAMETER :: M69N7RDze = 15766 + INTEGER(IntKi), PARAMETER :: M69N8RDze = 15767 + INTEGER(IntKi), PARAMETER :: M69N9RDze = 15768 + INTEGER(IntKi), PARAMETER :: M70N1RDze = 15769 + INTEGER(IntKi), PARAMETER :: M70N2RDze = 15770 + INTEGER(IntKi), PARAMETER :: M70N3RDze = 15771 + INTEGER(IntKi), PARAMETER :: M70N4RDze = 15772 + INTEGER(IntKi), PARAMETER :: M70N5RDze = 15773 + INTEGER(IntKi), PARAMETER :: M70N6RDze = 15774 + INTEGER(IntKi), PARAMETER :: M70N7RDze = 15775 + INTEGER(IntKi), PARAMETER :: M70N8RDze = 15776 + INTEGER(IntKi), PARAMETER :: M70N9RDze = 15777 + INTEGER(IntKi), PARAMETER :: M71N1RDze = 15778 + INTEGER(IntKi), PARAMETER :: M71N2RDze = 15779 + INTEGER(IntKi), PARAMETER :: M71N3RDze = 15780 + INTEGER(IntKi), PARAMETER :: M71N4RDze = 15781 + INTEGER(IntKi), PARAMETER :: M71N5RDze = 15782 + INTEGER(IntKi), PARAMETER :: M71N6RDze = 15783 + INTEGER(IntKi), PARAMETER :: M71N7RDze = 15784 + INTEGER(IntKi), PARAMETER :: M71N8RDze = 15785 + INTEGER(IntKi), PARAMETER :: M71N9RDze = 15786 + INTEGER(IntKi), PARAMETER :: M72N1RDze = 15787 + INTEGER(IntKi), PARAMETER :: M72N2RDze = 15788 + INTEGER(IntKi), PARAMETER :: M72N3RDze = 15789 + INTEGER(IntKi), PARAMETER :: M72N4RDze = 15790 + INTEGER(IntKi), PARAMETER :: M72N5RDze = 15791 + INTEGER(IntKi), PARAMETER :: M72N6RDze = 15792 + INTEGER(IntKi), PARAMETER :: M72N7RDze = 15793 + INTEGER(IntKi), PARAMETER :: M72N8RDze = 15794 + INTEGER(IntKi), PARAMETER :: M72N9RDze = 15795 + INTEGER(IntKi), PARAMETER :: M73N1RDze = 15796 + INTEGER(IntKi), PARAMETER :: M73N2RDze = 15797 + INTEGER(IntKi), PARAMETER :: M73N3RDze = 15798 + INTEGER(IntKi), PARAMETER :: M73N4RDze = 15799 + INTEGER(IntKi), PARAMETER :: M73N5RDze = 15800 + INTEGER(IntKi), PARAMETER :: M73N6RDze = 15801 + INTEGER(IntKi), PARAMETER :: M73N7RDze = 15802 + INTEGER(IntKi), PARAMETER :: M73N8RDze = 15803 + INTEGER(IntKi), PARAMETER :: M73N9RDze = 15804 + INTEGER(IntKi), PARAMETER :: M74N1RDze = 15805 + INTEGER(IntKi), PARAMETER :: M74N2RDze = 15806 + INTEGER(IntKi), PARAMETER :: M74N3RDze = 15807 + INTEGER(IntKi), PARAMETER :: M74N4RDze = 15808 + INTEGER(IntKi), PARAMETER :: M74N5RDze = 15809 + INTEGER(IntKi), PARAMETER :: M74N6RDze = 15810 + INTEGER(IntKi), PARAMETER :: M74N7RDze = 15811 + INTEGER(IntKi), PARAMETER :: M74N8RDze = 15812 + INTEGER(IntKi), PARAMETER :: M74N9RDze = 15813 + INTEGER(IntKi), PARAMETER :: M75N1RDze = 15814 + INTEGER(IntKi), PARAMETER :: M75N2RDze = 15815 + INTEGER(IntKi), PARAMETER :: M75N3RDze = 15816 + INTEGER(IntKi), PARAMETER :: M75N4RDze = 15817 + INTEGER(IntKi), PARAMETER :: M75N5RDze = 15818 + INTEGER(IntKi), PARAMETER :: M75N6RDze = 15819 + INTEGER(IntKi), PARAMETER :: M75N7RDze = 15820 + INTEGER(IntKi), PARAMETER :: M75N8RDze = 15821 + INTEGER(IntKi), PARAMETER :: M75N9RDze = 15822 + INTEGER(IntKi), PARAMETER :: M76N1RDze = 15823 + INTEGER(IntKi), PARAMETER :: M76N2RDze = 15824 + INTEGER(IntKi), PARAMETER :: M76N3RDze = 15825 + INTEGER(IntKi), PARAMETER :: M76N4RDze = 15826 + INTEGER(IntKi), PARAMETER :: M76N5RDze = 15827 + INTEGER(IntKi), PARAMETER :: M76N6RDze = 15828 + INTEGER(IntKi), PARAMETER :: M76N7RDze = 15829 + INTEGER(IntKi), PARAMETER :: M76N8RDze = 15830 + INTEGER(IntKi), PARAMETER :: M76N9RDze = 15831 + INTEGER(IntKi), PARAMETER :: M77N1RDze = 15832 + INTEGER(IntKi), PARAMETER :: M77N2RDze = 15833 + INTEGER(IntKi), PARAMETER :: M77N3RDze = 15834 + INTEGER(IntKi), PARAMETER :: M77N4RDze = 15835 + INTEGER(IntKi), PARAMETER :: M77N5RDze = 15836 + INTEGER(IntKi), PARAMETER :: M77N6RDze = 15837 + INTEGER(IntKi), PARAMETER :: M77N7RDze = 15838 + INTEGER(IntKi), PARAMETER :: M77N8RDze = 15839 + INTEGER(IntKi), PARAMETER :: M77N9RDze = 15840 + INTEGER(IntKi), PARAMETER :: M78N1RDze = 15841 + INTEGER(IntKi), PARAMETER :: M78N2RDze = 15842 + INTEGER(IntKi), PARAMETER :: M78N3RDze = 15843 + INTEGER(IntKi), PARAMETER :: M78N4RDze = 15844 + INTEGER(IntKi), PARAMETER :: M78N5RDze = 15845 + INTEGER(IntKi), PARAMETER :: M78N6RDze = 15846 + INTEGER(IntKi), PARAMETER :: M78N7RDze = 15847 + INTEGER(IntKi), PARAMETER :: M78N8RDze = 15848 + INTEGER(IntKi), PARAMETER :: M78N9RDze = 15849 + INTEGER(IntKi), PARAMETER :: M79N1RDze = 15850 + INTEGER(IntKi), PARAMETER :: M79N2RDze = 15851 + INTEGER(IntKi), PARAMETER :: M79N3RDze = 15852 + INTEGER(IntKi), PARAMETER :: M79N4RDze = 15853 + INTEGER(IntKi), PARAMETER :: M79N5RDze = 15854 + INTEGER(IntKi), PARAMETER :: M79N6RDze = 15855 + INTEGER(IntKi), PARAMETER :: M79N7RDze = 15856 + INTEGER(IntKi), PARAMETER :: M79N8RDze = 15857 + INTEGER(IntKi), PARAMETER :: M79N9RDze = 15858 + INTEGER(IntKi), PARAMETER :: M80N1RDze = 15859 + INTEGER(IntKi), PARAMETER :: M80N2RDze = 15860 + INTEGER(IntKi), PARAMETER :: M80N3RDze = 15861 + INTEGER(IntKi), PARAMETER :: M80N4RDze = 15862 + INTEGER(IntKi), PARAMETER :: M80N5RDze = 15863 + INTEGER(IntKi), PARAMETER :: M80N6RDze = 15864 + INTEGER(IntKi), PARAMETER :: M80N7RDze = 15865 + INTEGER(IntKi), PARAMETER :: M80N8RDze = 15866 + INTEGER(IntKi), PARAMETER :: M80N9RDze = 15867 + INTEGER(IntKi), PARAMETER :: M81N1RDze = 15868 + INTEGER(IntKi), PARAMETER :: M81N2RDze = 15869 + INTEGER(IntKi), PARAMETER :: M81N3RDze = 15870 + INTEGER(IntKi), PARAMETER :: M81N4RDze = 15871 + INTEGER(IntKi), PARAMETER :: M81N5RDze = 15872 + INTEGER(IntKi), PARAMETER :: M81N6RDze = 15873 + INTEGER(IntKi), PARAMETER :: M81N7RDze = 15874 + INTEGER(IntKi), PARAMETER :: M81N8RDze = 15875 + INTEGER(IntKi), PARAMETER :: M81N9RDze = 15876 + INTEGER(IntKi), PARAMETER :: M82N1RDze = 15877 + INTEGER(IntKi), PARAMETER :: M82N2RDze = 15878 + INTEGER(IntKi), PARAMETER :: M82N3RDze = 15879 + INTEGER(IntKi), PARAMETER :: M82N4RDze = 15880 + INTEGER(IntKi), PARAMETER :: M82N5RDze = 15881 + INTEGER(IntKi), PARAMETER :: M82N6RDze = 15882 + INTEGER(IntKi), PARAMETER :: M82N7RDze = 15883 + INTEGER(IntKi), PARAMETER :: M82N8RDze = 15884 + INTEGER(IntKi), PARAMETER :: M82N9RDze = 15885 + INTEGER(IntKi), PARAMETER :: M83N1RDze = 15886 + INTEGER(IntKi), PARAMETER :: M83N2RDze = 15887 + INTEGER(IntKi), PARAMETER :: M83N3RDze = 15888 + INTEGER(IntKi), PARAMETER :: M83N4RDze = 15889 + INTEGER(IntKi), PARAMETER :: M83N5RDze = 15890 + INTEGER(IntKi), PARAMETER :: M83N6RDze = 15891 + INTEGER(IntKi), PARAMETER :: M83N7RDze = 15892 + INTEGER(IntKi), PARAMETER :: M83N8RDze = 15893 + INTEGER(IntKi), PARAMETER :: M83N9RDze = 15894 + INTEGER(IntKi), PARAMETER :: M84N1RDze = 15895 + INTEGER(IntKi), PARAMETER :: M84N2RDze = 15896 + INTEGER(IntKi), PARAMETER :: M84N3RDze = 15897 + INTEGER(IntKi), PARAMETER :: M84N4RDze = 15898 + INTEGER(IntKi), PARAMETER :: M84N5RDze = 15899 + INTEGER(IntKi), PARAMETER :: M84N6RDze = 15900 + INTEGER(IntKi), PARAMETER :: M84N7RDze = 15901 + INTEGER(IntKi), PARAMETER :: M84N8RDze = 15902 + INTEGER(IntKi), PARAMETER :: M84N9RDze = 15903 + INTEGER(IntKi), PARAMETER :: M85N1RDze = 15904 + INTEGER(IntKi), PARAMETER :: M85N2RDze = 15905 + INTEGER(IntKi), PARAMETER :: M85N3RDze = 15906 + INTEGER(IntKi), PARAMETER :: M85N4RDze = 15907 + INTEGER(IntKi), PARAMETER :: M85N5RDze = 15908 + INTEGER(IntKi), PARAMETER :: M85N6RDze = 15909 + INTEGER(IntKi), PARAMETER :: M85N7RDze = 15910 + INTEGER(IntKi), PARAMETER :: M85N8RDze = 15911 + INTEGER(IntKi), PARAMETER :: M85N9RDze = 15912 + INTEGER(IntKi), PARAMETER :: M86N1RDze = 15913 + INTEGER(IntKi), PARAMETER :: M86N2RDze = 15914 + INTEGER(IntKi), PARAMETER :: M86N3RDze = 15915 + INTEGER(IntKi), PARAMETER :: M86N4RDze = 15916 + INTEGER(IntKi), PARAMETER :: M86N5RDze = 15917 + INTEGER(IntKi), PARAMETER :: M86N6RDze = 15918 + INTEGER(IntKi), PARAMETER :: M86N7RDze = 15919 + INTEGER(IntKi), PARAMETER :: M86N8RDze = 15920 + INTEGER(IntKi), PARAMETER :: M86N9RDze = 15921 + INTEGER(IntKi), PARAMETER :: M87N1RDze = 15922 + INTEGER(IntKi), PARAMETER :: M87N2RDze = 15923 + INTEGER(IntKi), PARAMETER :: M87N3RDze = 15924 + INTEGER(IntKi), PARAMETER :: M87N4RDze = 15925 + INTEGER(IntKi), PARAMETER :: M87N5RDze = 15926 + INTEGER(IntKi), PARAMETER :: M87N6RDze = 15927 + INTEGER(IntKi), PARAMETER :: M87N7RDze = 15928 + INTEGER(IntKi), PARAMETER :: M87N8RDze = 15929 + INTEGER(IntKi), PARAMETER :: M87N9RDze = 15930 + INTEGER(IntKi), PARAMETER :: M88N1RDze = 15931 + INTEGER(IntKi), PARAMETER :: M88N2RDze = 15932 + INTEGER(IntKi), PARAMETER :: M88N3RDze = 15933 + INTEGER(IntKi), PARAMETER :: M88N4RDze = 15934 + INTEGER(IntKi), PARAMETER :: M88N5RDze = 15935 + INTEGER(IntKi), PARAMETER :: M88N6RDze = 15936 + INTEGER(IntKi), PARAMETER :: M88N7RDze = 15937 + INTEGER(IntKi), PARAMETER :: M88N8RDze = 15938 + INTEGER(IntKi), PARAMETER :: M88N9RDze = 15939 + INTEGER(IntKi), PARAMETER :: M89N1RDze = 15940 + INTEGER(IntKi), PARAMETER :: M89N2RDze = 15941 + INTEGER(IntKi), PARAMETER :: M89N3RDze = 15942 + INTEGER(IntKi), PARAMETER :: M89N4RDze = 15943 + INTEGER(IntKi), PARAMETER :: M89N5RDze = 15944 + INTEGER(IntKi), PARAMETER :: M89N6RDze = 15945 + INTEGER(IntKi), PARAMETER :: M89N7RDze = 15946 + INTEGER(IntKi), PARAMETER :: M89N8RDze = 15947 + INTEGER(IntKi), PARAMETER :: M89N9RDze = 15948 + INTEGER(IntKi), PARAMETER :: M90N1RDze = 15949 + INTEGER(IntKi), PARAMETER :: M90N2RDze = 15950 + INTEGER(IntKi), PARAMETER :: M90N3RDze = 15951 + INTEGER(IntKi), PARAMETER :: M90N4RDze = 15952 + INTEGER(IntKi), PARAMETER :: M90N5RDze = 15953 + INTEGER(IntKi), PARAMETER :: M90N6RDze = 15954 + INTEGER(IntKi), PARAMETER :: M90N7RDze = 15955 + INTEGER(IntKi), PARAMETER :: M90N8RDze = 15956 + INTEGER(IntKi), PARAMETER :: M90N9RDze = 15957 + INTEGER(IntKi), PARAMETER :: M91N1RDze = 15958 + INTEGER(IntKi), PARAMETER :: M91N2RDze = 15959 + INTEGER(IntKi), PARAMETER :: M91N3RDze = 15960 + INTEGER(IntKi), PARAMETER :: M91N4RDze = 15961 + INTEGER(IntKi), PARAMETER :: M91N5RDze = 15962 + INTEGER(IntKi), PARAMETER :: M91N6RDze = 15963 + INTEGER(IntKi), PARAMETER :: M91N7RDze = 15964 + INTEGER(IntKi), PARAMETER :: M91N8RDze = 15965 + INTEGER(IntKi), PARAMETER :: M91N9RDze = 15966 + INTEGER(IntKi), PARAMETER :: M92N1RDze = 15967 + INTEGER(IntKi), PARAMETER :: M92N2RDze = 15968 + INTEGER(IntKi), PARAMETER :: M92N3RDze = 15969 + INTEGER(IntKi), PARAMETER :: M92N4RDze = 15970 + INTEGER(IntKi), PARAMETER :: M92N5RDze = 15971 + INTEGER(IntKi), PARAMETER :: M92N6RDze = 15972 + INTEGER(IntKi), PARAMETER :: M92N7RDze = 15973 + INTEGER(IntKi), PARAMETER :: M92N8RDze = 15974 + INTEGER(IntKi), PARAMETER :: M92N9RDze = 15975 + INTEGER(IntKi), PARAMETER :: M93N1RDze = 15976 + INTEGER(IntKi), PARAMETER :: M93N2RDze = 15977 + INTEGER(IntKi), PARAMETER :: M93N3RDze = 15978 + INTEGER(IntKi), PARAMETER :: M93N4RDze = 15979 + INTEGER(IntKi), PARAMETER :: M93N5RDze = 15980 + INTEGER(IntKi), PARAMETER :: M93N6RDze = 15981 + INTEGER(IntKi), PARAMETER :: M93N7RDze = 15982 + INTEGER(IntKi), PARAMETER :: M93N8RDze = 15983 + INTEGER(IntKi), PARAMETER :: M93N9RDze = 15984 + INTEGER(IntKi), PARAMETER :: M94N1RDze = 15985 + INTEGER(IntKi), PARAMETER :: M94N2RDze = 15986 + INTEGER(IntKi), PARAMETER :: M94N3RDze = 15987 + INTEGER(IntKi), PARAMETER :: M94N4RDze = 15988 + INTEGER(IntKi), PARAMETER :: M94N5RDze = 15989 + INTEGER(IntKi), PARAMETER :: M94N6RDze = 15990 + INTEGER(IntKi), PARAMETER :: M94N7RDze = 15991 + INTEGER(IntKi), PARAMETER :: M94N8RDze = 15992 + INTEGER(IntKi), PARAMETER :: M94N9RDze = 15993 + INTEGER(IntKi), PARAMETER :: M95N1RDze = 15994 + INTEGER(IntKi), PARAMETER :: M95N2RDze = 15995 + INTEGER(IntKi), PARAMETER :: M95N3RDze = 15996 + INTEGER(IntKi), PARAMETER :: M95N4RDze = 15997 + INTEGER(IntKi), PARAMETER :: M95N5RDze = 15998 + INTEGER(IntKi), PARAMETER :: M95N6RDze = 15999 + INTEGER(IntKi), PARAMETER :: M95N7RDze = 16000 + INTEGER(IntKi), PARAMETER :: M95N8RDze = 16001 + INTEGER(IntKi), PARAMETER :: M95N9RDze = 16002 + INTEGER(IntKi), PARAMETER :: M96N1RDze = 16003 + INTEGER(IntKi), PARAMETER :: M96N2RDze = 16004 + INTEGER(IntKi), PARAMETER :: M96N3RDze = 16005 + INTEGER(IntKi), PARAMETER :: M96N4RDze = 16006 + INTEGER(IntKi), PARAMETER :: M96N5RDze = 16007 + INTEGER(IntKi), PARAMETER :: M96N6RDze = 16008 + INTEGER(IntKi), PARAMETER :: M96N7RDze = 16009 + INTEGER(IntKi), PARAMETER :: M96N8RDze = 16010 + INTEGER(IntKi), PARAMETER :: M96N9RDze = 16011 + INTEGER(IntKi), PARAMETER :: M97N1RDze = 16012 + INTEGER(IntKi), PARAMETER :: M97N2RDze = 16013 + INTEGER(IntKi), PARAMETER :: M97N3RDze = 16014 + INTEGER(IntKi), PARAMETER :: M97N4RDze = 16015 + INTEGER(IntKi), PARAMETER :: M97N5RDze = 16016 + INTEGER(IntKi), PARAMETER :: M97N6RDze = 16017 + INTEGER(IntKi), PARAMETER :: M97N7RDze = 16018 + INTEGER(IntKi), PARAMETER :: M97N8RDze = 16019 + INTEGER(IntKi), PARAMETER :: M97N9RDze = 16020 + INTEGER(IntKi), PARAMETER :: M98N1RDze = 16021 + INTEGER(IntKi), PARAMETER :: M98N2RDze = 16022 + INTEGER(IntKi), PARAMETER :: M98N3RDze = 16023 + INTEGER(IntKi), PARAMETER :: M98N4RDze = 16024 + INTEGER(IntKi), PARAMETER :: M98N5RDze = 16025 + INTEGER(IntKi), PARAMETER :: M98N6RDze = 16026 + INTEGER(IntKi), PARAMETER :: M98N7RDze = 16027 + INTEGER(IntKi), PARAMETER :: M98N8RDze = 16028 + INTEGER(IntKi), PARAMETER :: M98N9RDze = 16029 + INTEGER(IntKi), PARAMETER :: M99N1RDze = 16030 + INTEGER(IntKi), PARAMETER :: M99N2RDze = 16031 + INTEGER(IntKi), PARAMETER :: M99N3RDze = 16032 + INTEGER(IntKi), PARAMETER :: M99N4RDze = 16033 + INTEGER(IntKi), PARAMETER :: M99N5RDze = 16034 + INTEGER(IntKi), PARAMETER :: M99N6RDze = 16035 + INTEGER(IntKi), PARAMETER :: M99N7RDze = 16036 + INTEGER(IntKi), PARAMETER :: M99N8RDze = 16037 + INTEGER(IntKi), PARAMETER :: M99N9RDze = 16038 - ! Member Forces: + ! Accelerations: - INTEGER(IntKi), PARAMETER :: M01N1FKxe = 1 - INTEGER(IntKi), PARAMETER :: M01N2FKxe = 2 - INTEGER(IntKi), PARAMETER :: M01N3FKxe = 3 - INTEGER(IntKi), PARAMETER :: M01N4FKxe = 4 - INTEGER(IntKi), PARAMETER :: M01N5FKxe = 5 - INTEGER(IntKi), PARAMETER :: M01N6FKxe = 6 - INTEGER(IntKi), PARAMETER :: M01N7FKxe = 7 - INTEGER(IntKi), PARAMETER :: M01N8FKxe = 8 - INTEGER(IntKi), PARAMETER :: M01N9FKxe = 9 - INTEGER(IntKi), PARAMETER :: M02N1FKxe = 10 - INTEGER(IntKi), PARAMETER :: M02N2FKxe = 11 - INTEGER(IntKi), PARAMETER :: M02N3FKxe = 12 - INTEGER(IntKi), PARAMETER :: M02N4FKxe = 13 - INTEGER(IntKi), PARAMETER :: M02N5FKxe = 14 - INTEGER(IntKi), PARAMETER :: M02N6FKxe = 15 - INTEGER(IntKi), PARAMETER :: M02N7FKxe = 16 - INTEGER(IntKi), PARAMETER :: M02N8FKxe = 17 - INTEGER(IntKi), PARAMETER :: M02N9FKxe = 18 - INTEGER(IntKi), PARAMETER :: M03N1FKxe = 19 - INTEGER(IntKi), PARAMETER :: M03N2FKxe = 20 - INTEGER(IntKi), PARAMETER :: M03N3FKxe = 21 - INTEGER(IntKi), PARAMETER :: M03N4FKxe = 22 - INTEGER(IntKi), PARAMETER :: M03N5FKxe = 23 - INTEGER(IntKi), PARAMETER :: M03N6FKxe = 24 - INTEGER(IntKi), PARAMETER :: M03N7FKxe = 25 - INTEGER(IntKi), PARAMETER :: M03N8FKxe = 26 - INTEGER(IntKi), PARAMETER :: M03N9FKxe = 27 - INTEGER(IntKi), PARAMETER :: M04N1FKxe = 28 - INTEGER(IntKi), PARAMETER :: M04N2FKxe = 29 - INTEGER(IntKi), PARAMETER :: M04N3FKxe = 30 - INTEGER(IntKi), PARAMETER :: M04N4FKxe = 31 - INTEGER(IntKi), PARAMETER :: M04N5FKxe = 32 - INTEGER(IntKi), PARAMETER :: M04N6FKxe = 33 - INTEGER(IntKi), PARAMETER :: M04N7FKxe = 34 - INTEGER(IntKi), PARAMETER :: M04N8FKxe = 35 - INTEGER(IntKi), PARAMETER :: M04N9FKxe = 36 - INTEGER(IntKi), PARAMETER :: M05N1FKxe = 37 - INTEGER(IntKi), PARAMETER :: M05N2FKxe = 38 - INTEGER(IntKi), PARAMETER :: M05N3FKxe = 39 - INTEGER(IntKi), PARAMETER :: M05N4FKxe = 40 - INTEGER(IntKi), PARAMETER :: M05N5FKxe = 41 - INTEGER(IntKi), PARAMETER :: M05N6FKxe = 42 - INTEGER(IntKi), PARAMETER :: M05N7FKxe = 43 - INTEGER(IntKi), PARAMETER :: M05N8FKxe = 44 - INTEGER(IntKi), PARAMETER :: M05N9FKxe = 45 - INTEGER(IntKi), PARAMETER :: M06N1FKxe = 46 - INTEGER(IntKi), PARAMETER :: M06N2FKxe = 47 - INTEGER(IntKi), PARAMETER :: M06N3FKxe = 48 - INTEGER(IntKi), PARAMETER :: M06N4FKxe = 49 - INTEGER(IntKi), PARAMETER :: M06N5FKxe = 50 - INTEGER(IntKi), PARAMETER :: M06N6FKxe = 51 - INTEGER(IntKi), PARAMETER :: M06N7FKxe = 52 - INTEGER(IntKi), PARAMETER :: M06N8FKxe = 53 - INTEGER(IntKi), PARAMETER :: M06N9FKxe = 54 - INTEGER(IntKi), PARAMETER :: M07N1FKxe = 55 - INTEGER(IntKi), PARAMETER :: M07N2FKxe = 56 - INTEGER(IntKi), PARAMETER :: M07N3FKxe = 57 - INTEGER(IntKi), PARAMETER :: M07N4FKxe = 58 - INTEGER(IntKi), PARAMETER :: M07N5FKxe = 59 - INTEGER(IntKi), PARAMETER :: M07N6FKxe = 60 - INTEGER(IntKi), PARAMETER :: M07N7FKxe = 61 - INTEGER(IntKi), PARAMETER :: M07N8FKxe = 62 - INTEGER(IntKi), PARAMETER :: M07N9FKxe = 63 - INTEGER(IntKi), PARAMETER :: M08N1FKxe = 64 - INTEGER(IntKi), PARAMETER :: M08N2FKxe = 65 - INTEGER(IntKi), PARAMETER :: M08N3FKxe = 66 - INTEGER(IntKi), PARAMETER :: M08N4FKxe = 67 - INTEGER(IntKi), PARAMETER :: M08N5FKxe = 68 - INTEGER(IntKi), PARAMETER :: M08N6FKxe = 69 - INTEGER(IntKi), PARAMETER :: M08N7FKxe = 70 - INTEGER(IntKi), PARAMETER :: M08N8FKxe = 71 - INTEGER(IntKi), PARAMETER :: M08N9FKxe = 72 - INTEGER(IntKi), PARAMETER :: M09N1FKxe = 73 - INTEGER(IntKi), PARAMETER :: M09N2FKxe = 74 - INTEGER(IntKi), PARAMETER :: M09N3FKxe = 75 - INTEGER(IntKi), PARAMETER :: M09N4FKxe = 76 - INTEGER(IntKi), PARAMETER :: M09N5FKxe = 77 - INTEGER(IntKi), PARAMETER :: M09N6FKxe = 78 - INTEGER(IntKi), PARAMETER :: M09N7FKxe = 79 - INTEGER(IntKi), PARAMETER :: M09N8FKxe = 80 - INTEGER(IntKi), PARAMETER :: M09N9FKxe = 81 - INTEGER(IntKi), PARAMETER :: M10N1FKxe = 82 - INTEGER(IntKi), PARAMETER :: M10N2FKxe = 83 - INTEGER(IntKi), PARAMETER :: M10N3FKxe = 84 - INTEGER(IntKi), PARAMETER :: M10N4FKxe = 85 - INTEGER(IntKi), PARAMETER :: M10N5FKxe = 86 - INTEGER(IntKi), PARAMETER :: M10N6FKxe = 87 - INTEGER(IntKi), PARAMETER :: M10N7FKxe = 88 - INTEGER(IntKi), PARAMETER :: M10N8FKxe = 89 - INTEGER(IntKi), PARAMETER :: M10N9FKxe = 90 - INTEGER(IntKi), PARAMETER :: M11N1FKxe = 91 - INTEGER(IntKi), PARAMETER :: M11N2FKxe = 92 - INTEGER(IntKi), PARAMETER :: M11N3FKxe = 93 - INTEGER(IntKi), PARAMETER :: M11N4FKxe = 94 - INTEGER(IntKi), PARAMETER :: M11N5FKxe = 95 - INTEGER(IntKi), PARAMETER :: M11N6FKxe = 96 - INTEGER(IntKi), PARAMETER :: M11N7FKxe = 97 - INTEGER(IntKi), PARAMETER :: M11N8FKxe = 98 - INTEGER(IntKi), PARAMETER :: M11N9FKxe = 99 - INTEGER(IntKi), PARAMETER :: M12N1FKxe = 100 - INTEGER(IntKi), PARAMETER :: M12N2FKxe = 101 - INTEGER(IntKi), PARAMETER :: M12N3FKxe = 102 - INTEGER(IntKi), PARAMETER :: M12N4FKxe = 103 - INTEGER(IntKi), PARAMETER :: M12N5FKxe = 104 - INTEGER(IntKi), PARAMETER :: M12N6FKxe = 105 - INTEGER(IntKi), PARAMETER :: M12N7FKxe = 106 - INTEGER(IntKi), PARAMETER :: M12N8FKxe = 107 - INTEGER(IntKi), PARAMETER :: M12N9FKxe = 108 - INTEGER(IntKi), PARAMETER :: M13N1FKxe = 109 - INTEGER(IntKi), PARAMETER :: M13N2FKxe = 110 - INTEGER(IntKi), PARAMETER :: M13N3FKxe = 111 - INTEGER(IntKi), PARAMETER :: M13N4FKxe = 112 - INTEGER(IntKi), PARAMETER :: M13N5FKxe = 113 - INTEGER(IntKi), PARAMETER :: M13N6FKxe = 114 - INTEGER(IntKi), PARAMETER :: M13N7FKxe = 115 - INTEGER(IntKi), PARAMETER :: M13N8FKxe = 116 - INTEGER(IntKi), PARAMETER :: M13N9FKxe = 117 - INTEGER(IntKi), PARAMETER :: M14N1FKxe = 118 - INTEGER(IntKi), PARAMETER :: M14N2FKxe = 119 - INTEGER(IntKi), PARAMETER :: M14N3FKxe = 120 - INTEGER(IntKi), PARAMETER :: M14N4FKxe = 121 - INTEGER(IntKi), PARAMETER :: M14N5FKxe = 122 - INTEGER(IntKi), PARAMETER :: M14N6FKxe = 123 - INTEGER(IntKi), PARAMETER :: M14N7FKxe = 124 - INTEGER(IntKi), PARAMETER :: M14N8FKxe = 125 - INTEGER(IntKi), PARAMETER :: M14N9FKxe = 126 - INTEGER(IntKi), PARAMETER :: M15N1FKxe = 127 - INTEGER(IntKi), PARAMETER :: M15N2FKxe = 128 - INTEGER(IntKi), PARAMETER :: M15N3FKxe = 129 - INTEGER(IntKi), PARAMETER :: M15N4FKxe = 130 - INTEGER(IntKi), PARAMETER :: M15N5FKxe = 131 - INTEGER(IntKi), PARAMETER :: M15N6FKxe = 132 - INTEGER(IntKi), PARAMETER :: M15N7FKxe = 133 - INTEGER(IntKi), PARAMETER :: M15N8FKxe = 134 - INTEGER(IntKi), PARAMETER :: M15N9FKxe = 135 - INTEGER(IntKi), PARAMETER :: M16N1FKxe = 136 - INTEGER(IntKi), PARAMETER :: M16N2FKxe = 137 - INTEGER(IntKi), PARAMETER :: M16N3FKxe = 138 - INTEGER(IntKi), PARAMETER :: M16N4FKxe = 139 - INTEGER(IntKi), PARAMETER :: M16N5FKxe = 140 - INTEGER(IntKi), PARAMETER :: M16N6FKxe = 141 - INTEGER(IntKi), PARAMETER :: M16N7FKxe = 142 - INTEGER(IntKi), PARAMETER :: M16N8FKxe = 143 - INTEGER(IntKi), PARAMETER :: M16N9FKxe = 144 - INTEGER(IntKi), PARAMETER :: M17N1FKxe = 145 - INTEGER(IntKi), PARAMETER :: M17N2FKxe = 146 - INTEGER(IntKi), PARAMETER :: M17N3FKxe = 147 - INTEGER(IntKi), PARAMETER :: M17N4FKxe = 148 - INTEGER(IntKi), PARAMETER :: M17N5FKxe = 149 - INTEGER(IntKi), PARAMETER :: M17N6FKxe = 150 - INTEGER(IntKi), PARAMETER :: M17N7FKxe = 151 - INTEGER(IntKi), PARAMETER :: M17N8FKxe = 152 - INTEGER(IntKi), PARAMETER :: M17N9FKxe = 153 - INTEGER(IntKi), PARAMETER :: M18N1FKxe = 154 - INTEGER(IntKi), PARAMETER :: M18N2FKxe = 155 - INTEGER(IntKi), PARAMETER :: M18N3FKxe = 156 - INTEGER(IntKi), PARAMETER :: M18N4FKxe = 157 - INTEGER(IntKi), PARAMETER :: M18N5FKxe = 158 - INTEGER(IntKi), PARAMETER :: M18N6FKxe = 159 - INTEGER(IntKi), PARAMETER :: M18N7FKxe = 160 - INTEGER(IntKi), PARAMETER :: M18N8FKxe = 161 - INTEGER(IntKi), PARAMETER :: M18N9FKxe = 162 - INTEGER(IntKi), PARAMETER :: M19N1FKxe = 163 - INTEGER(IntKi), PARAMETER :: M19N2FKxe = 164 - INTEGER(IntKi), PARAMETER :: M19N3FKxe = 165 - INTEGER(IntKi), PARAMETER :: M19N4FKxe = 166 - INTEGER(IntKi), PARAMETER :: M19N5FKxe = 167 - INTEGER(IntKi), PARAMETER :: M19N6FKxe = 168 - INTEGER(IntKi), PARAMETER :: M19N7FKxe = 169 - INTEGER(IntKi), PARAMETER :: M19N8FKxe = 170 - INTEGER(IntKi), PARAMETER :: M19N9FKxe = 171 - INTEGER(IntKi), PARAMETER :: M20N1FKxe = 172 - INTEGER(IntKi), PARAMETER :: M20N2FKxe = 173 - INTEGER(IntKi), PARAMETER :: M20N3FKxe = 174 - INTEGER(IntKi), PARAMETER :: M20N4FKxe = 175 - INTEGER(IntKi), PARAMETER :: M20N5FKxe = 176 - INTEGER(IntKi), PARAMETER :: M20N6FKxe = 177 - INTEGER(IntKi), PARAMETER :: M20N7FKxe = 178 - INTEGER(IntKi), PARAMETER :: M20N8FKxe = 179 - INTEGER(IntKi), PARAMETER :: M20N9FKxe = 180 - INTEGER(IntKi), PARAMETER :: M21N1FKxe = 181 - INTEGER(IntKi), PARAMETER :: M21N2FKxe = 182 - INTEGER(IntKi), PARAMETER :: M21N3FKxe = 183 - INTEGER(IntKi), PARAMETER :: M21N4FKxe = 184 - INTEGER(IntKi), PARAMETER :: M21N5FKxe = 185 - INTEGER(IntKi), PARAMETER :: M21N6FKxe = 186 - INTEGER(IntKi), PARAMETER :: M21N7FKxe = 187 - INTEGER(IntKi), PARAMETER :: M21N8FKxe = 188 - INTEGER(IntKi), PARAMETER :: M21N9FKxe = 189 - INTEGER(IntKi), PARAMETER :: M22N1FKxe = 190 - INTEGER(IntKi), PARAMETER :: M22N2FKxe = 191 - INTEGER(IntKi), PARAMETER :: M22N3FKxe = 192 - INTEGER(IntKi), PARAMETER :: M22N4FKxe = 193 - INTEGER(IntKi), PARAMETER :: M22N5FKxe = 194 - INTEGER(IntKi), PARAMETER :: M22N6FKxe = 195 - INTEGER(IntKi), PARAMETER :: M22N7FKxe = 196 - INTEGER(IntKi), PARAMETER :: M22N8FKxe = 197 - INTEGER(IntKi), PARAMETER :: M22N9FKxe = 198 - INTEGER(IntKi), PARAMETER :: M23N1FKxe = 199 - INTEGER(IntKi), PARAMETER :: M23N2FKxe = 200 - INTEGER(IntKi), PARAMETER :: M23N3FKxe = 201 - INTEGER(IntKi), PARAMETER :: M23N4FKxe = 202 - INTEGER(IntKi), PARAMETER :: M23N5FKxe = 203 - INTEGER(IntKi), PARAMETER :: M23N6FKxe = 204 - INTEGER(IntKi), PARAMETER :: M23N7FKxe = 205 - INTEGER(IntKi), PARAMETER :: M23N8FKxe = 206 - INTEGER(IntKi), PARAMETER :: M23N9FKxe = 207 - INTEGER(IntKi), PARAMETER :: M24N1FKxe = 208 - INTEGER(IntKi), PARAMETER :: M24N2FKxe = 209 - INTEGER(IntKi), PARAMETER :: M24N3FKxe = 210 - INTEGER(IntKi), PARAMETER :: M24N4FKxe = 211 - INTEGER(IntKi), PARAMETER :: M24N5FKxe = 212 - INTEGER(IntKi), PARAMETER :: M24N6FKxe = 213 - INTEGER(IntKi), PARAMETER :: M24N7FKxe = 214 - INTEGER(IntKi), PARAMETER :: M24N8FKxe = 215 - INTEGER(IntKi), PARAMETER :: M24N9FKxe = 216 - INTEGER(IntKi), PARAMETER :: M25N1FKxe = 217 - INTEGER(IntKi), PARAMETER :: M25N2FKxe = 218 - INTEGER(IntKi), PARAMETER :: M25N3FKxe = 219 - INTEGER(IntKi), PARAMETER :: M25N4FKxe = 220 - INTEGER(IntKi), PARAMETER :: M25N5FKxe = 221 - INTEGER(IntKi), PARAMETER :: M25N6FKxe = 222 - INTEGER(IntKi), PARAMETER :: M25N7FKxe = 223 - INTEGER(IntKi), PARAMETER :: M25N8FKxe = 224 - INTEGER(IntKi), PARAMETER :: M25N9FKxe = 225 - INTEGER(IntKi), PARAMETER :: M26N1FKxe = 226 - INTEGER(IntKi), PARAMETER :: M26N2FKxe = 227 - INTEGER(IntKi), PARAMETER :: M26N3FKxe = 228 - INTEGER(IntKi), PARAMETER :: M26N4FKxe = 229 - INTEGER(IntKi), PARAMETER :: M26N5FKxe = 230 - INTEGER(IntKi), PARAMETER :: M26N6FKxe = 231 - INTEGER(IntKi), PARAMETER :: M26N7FKxe = 232 - INTEGER(IntKi), PARAMETER :: M26N8FKxe = 233 - INTEGER(IntKi), PARAMETER :: M26N9FKxe = 234 - INTEGER(IntKi), PARAMETER :: M27N1FKxe = 235 - INTEGER(IntKi), PARAMETER :: M27N2FKxe = 236 - INTEGER(IntKi), PARAMETER :: M27N3FKxe = 237 - INTEGER(IntKi), PARAMETER :: M27N4FKxe = 238 - INTEGER(IntKi), PARAMETER :: M27N5FKxe = 239 - INTEGER(IntKi), PARAMETER :: M27N6FKxe = 240 - INTEGER(IntKi), PARAMETER :: M27N7FKxe = 241 - INTEGER(IntKi), PARAMETER :: M27N8FKxe = 242 - INTEGER(IntKi), PARAMETER :: M27N9FKxe = 243 - INTEGER(IntKi), PARAMETER :: M28N1FKxe = 244 - INTEGER(IntKi), PARAMETER :: M28N2FKxe = 245 - INTEGER(IntKi), PARAMETER :: M28N3FKxe = 246 - INTEGER(IntKi), PARAMETER :: M28N4FKxe = 247 - INTEGER(IntKi), PARAMETER :: M28N5FKxe = 248 - INTEGER(IntKi), PARAMETER :: M28N6FKxe = 249 - INTEGER(IntKi), PARAMETER :: M28N7FKxe = 250 - INTEGER(IntKi), PARAMETER :: M28N8FKxe = 251 - INTEGER(IntKi), PARAMETER :: M28N9FKxe = 252 - INTEGER(IntKi), PARAMETER :: M29N1FKxe = 253 - INTEGER(IntKi), PARAMETER :: M29N2FKxe = 254 - INTEGER(IntKi), PARAMETER :: M29N3FKxe = 255 - INTEGER(IntKi), PARAMETER :: M29N4FKxe = 256 - INTEGER(IntKi), PARAMETER :: M29N5FKxe = 257 - INTEGER(IntKi), PARAMETER :: M29N6FKxe = 258 - INTEGER(IntKi), PARAMETER :: M29N7FKxe = 259 - INTEGER(IntKi), PARAMETER :: M29N8FKxe = 260 - INTEGER(IntKi), PARAMETER :: M29N9FKxe = 261 - INTEGER(IntKi), PARAMETER :: M30N1FKxe = 262 - INTEGER(IntKi), PARAMETER :: M30N2FKxe = 263 - INTEGER(IntKi), PARAMETER :: M30N3FKxe = 264 - INTEGER(IntKi), PARAMETER :: M30N4FKxe = 265 - INTEGER(IntKi), PARAMETER :: M30N5FKxe = 266 - INTEGER(IntKi), PARAMETER :: M30N6FKxe = 267 - INTEGER(IntKi), PARAMETER :: M30N7FKxe = 268 - INTEGER(IntKi), PARAMETER :: M30N8FKxe = 269 - INTEGER(IntKi), PARAMETER :: M30N9FKxe = 270 - INTEGER(IntKi), PARAMETER :: M31N1FKxe = 271 - INTEGER(IntKi), PARAMETER :: M31N2FKxe = 272 - INTEGER(IntKi), PARAMETER :: M31N3FKxe = 273 - INTEGER(IntKi), PARAMETER :: M31N4FKxe = 274 - INTEGER(IntKi), PARAMETER :: M31N5FKxe = 275 - INTEGER(IntKi), PARAMETER :: M31N6FKxe = 276 - INTEGER(IntKi), PARAMETER :: M31N7FKxe = 277 - INTEGER(IntKi), PARAMETER :: M31N8FKxe = 278 - INTEGER(IntKi), PARAMETER :: M31N9FKxe = 279 - INTEGER(IntKi), PARAMETER :: M32N1FKxe = 280 - INTEGER(IntKi), PARAMETER :: M32N2FKxe = 281 - INTEGER(IntKi), PARAMETER :: M32N3FKxe = 282 - INTEGER(IntKi), PARAMETER :: M32N4FKxe = 283 - INTEGER(IntKi), PARAMETER :: M32N5FKxe = 284 - INTEGER(IntKi), PARAMETER :: M32N6FKxe = 285 - INTEGER(IntKi), PARAMETER :: M32N7FKxe = 286 - INTEGER(IntKi), PARAMETER :: M32N8FKxe = 287 - INTEGER(IntKi), PARAMETER :: M32N9FKxe = 288 - INTEGER(IntKi), PARAMETER :: M33N1FKxe = 289 - INTEGER(IntKi), PARAMETER :: M33N2FKxe = 290 - INTEGER(IntKi), PARAMETER :: M33N3FKxe = 291 - INTEGER(IntKi), PARAMETER :: M33N4FKxe = 292 - INTEGER(IntKi), PARAMETER :: M33N5FKxe = 293 - INTEGER(IntKi), PARAMETER :: M33N6FKxe = 294 - INTEGER(IntKi), PARAMETER :: M33N7FKxe = 295 - INTEGER(IntKi), PARAMETER :: M33N8FKxe = 296 - INTEGER(IntKi), PARAMETER :: M33N9FKxe = 297 - INTEGER(IntKi), PARAMETER :: M34N1FKxe = 298 - INTEGER(IntKi), PARAMETER :: M34N2FKxe = 299 - INTEGER(IntKi), PARAMETER :: M34N3FKxe = 300 - INTEGER(IntKi), PARAMETER :: M34N4FKxe = 301 - INTEGER(IntKi), PARAMETER :: M34N5FKxe = 302 - INTEGER(IntKi), PARAMETER :: M34N6FKxe = 303 - INTEGER(IntKi), PARAMETER :: M34N7FKxe = 304 - INTEGER(IntKi), PARAMETER :: M34N8FKxe = 305 - INTEGER(IntKi), PARAMETER :: M34N9FKxe = 306 - INTEGER(IntKi), PARAMETER :: M35N1FKxe = 307 - INTEGER(IntKi), PARAMETER :: M35N2FKxe = 308 - INTEGER(IntKi), PARAMETER :: M35N3FKxe = 309 - INTEGER(IntKi), PARAMETER :: M35N4FKxe = 310 - INTEGER(IntKi), PARAMETER :: M35N5FKxe = 311 - INTEGER(IntKi), PARAMETER :: M35N6FKxe = 312 - INTEGER(IntKi), PARAMETER :: M35N7FKxe = 313 - INTEGER(IntKi), PARAMETER :: M35N8FKxe = 314 - INTEGER(IntKi), PARAMETER :: M35N9FKxe = 315 - INTEGER(IntKi), PARAMETER :: M36N1FKxe = 316 - INTEGER(IntKi), PARAMETER :: M36N2FKxe = 317 - INTEGER(IntKi), PARAMETER :: M36N3FKxe = 318 - INTEGER(IntKi), PARAMETER :: M36N4FKxe = 319 - INTEGER(IntKi), PARAMETER :: M36N5FKxe = 320 - INTEGER(IntKi), PARAMETER :: M36N6FKxe = 321 - INTEGER(IntKi), PARAMETER :: M36N7FKxe = 322 - INTEGER(IntKi), PARAMETER :: M36N8FKxe = 323 - INTEGER(IntKi), PARAMETER :: M36N9FKxe = 324 - INTEGER(IntKi), PARAMETER :: M37N1FKxe = 325 - INTEGER(IntKi), PARAMETER :: M37N2FKxe = 326 - INTEGER(IntKi), PARAMETER :: M37N3FKxe = 327 - INTEGER(IntKi), PARAMETER :: M37N4FKxe = 328 - INTEGER(IntKi), PARAMETER :: M37N5FKxe = 329 - INTEGER(IntKi), PARAMETER :: M37N6FKxe = 330 - INTEGER(IntKi), PARAMETER :: M37N7FKxe = 331 - INTEGER(IntKi), PARAMETER :: M37N8FKxe = 332 - INTEGER(IntKi), PARAMETER :: M37N9FKxe = 333 - INTEGER(IntKi), PARAMETER :: M38N1FKxe = 334 - INTEGER(IntKi), PARAMETER :: M38N2FKxe = 335 - INTEGER(IntKi), PARAMETER :: M38N3FKxe = 336 - INTEGER(IntKi), PARAMETER :: M38N4FKxe = 337 - INTEGER(IntKi), PARAMETER :: M38N5FKxe = 338 - INTEGER(IntKi), PARAMETER :: M38N6FKxe = 339 - INTEGER(IntKi), PARAMETER :: M38N7FKxe = 340 - INTEGER(IntKi), PARAMETER :: M38N8FKxe = 341 - INTEGER(IntKi), PARAMETER :: M38N9FKxe = 342 - INTEGER(IntKi), PARAMETER :: M39N1FKxe = 343 - INTEGER(IntKi), PARAMETER :: M39N2FKxe = 344 - INTEGER(IntKi), PARAMETER :: M39N3FKxe = 345 - INTEGER(IntKi), PARAMETER :: M39N4FKxe = 346 - INTEGER(IntKi), PARAMETER :: M39N5FKxe = 347 - INTEGER(IntKi), PARAMETER :: M39N6FKxe = 348 - INTEGER(IntKi), PARAMETER :: M39N7FKxe = 349 - INTEGER(IntKi), PARAMETER :: M39N8FKxe = 350 - INTEGER(IntKi), PARAMETER :: M39N9FKxe = 351 - INTEGER(IntKi), PARAMETER :: M40N1FKxe = 352 - INTEGER(IntKi), PARAMETER :: M40N2FKxe = 353 - INTEGER(IntKi), PARAMETER :: M40N3FKxe = 354 - INTEGER(IntKi), PARAMETER :: M40N4FKxe = 355 - INTEGER(IntKi), PARAMETER :: M40N5FKxe = 356 - INTEGER(IntKi), PARAMETER :: M40N6FKxe = 357 - INTEGER(IntKi), PARAMETER :: M40N7FKxe = 358 - INTEGER(IntKi), PARAMETER :: M40N8FKxe = 359 - INTEGER(IntKi), PARAMETER :: M40N9FKxe = 360 - INTEGER(IntKi), PARAMETER :: M41N1FKxe = 361 - INTEGER(IntKi), PARAMETER :: M41N2FKxe = 362 - INTEGER(IntKi), PARAMETER :: M41N3FKxe = 363 - INTEGER(IntKi), PARAMETER :: M41N4FKxe = 364 - INTEGER(IntKi), PARAMETER :: M41N5FKxe = 365 - INTEGER(IntKi), PARAMETER :: M41N6FKxe = 366 - INTEGER(IntKi), PARAMETER :: M41N7FKxe = 367 - INTEGER(IntKi), PARAMETER :: M41N8FKxe = 368 - INTEGER(IntKi), PARAMETER :: M41N9FKxe = 369 - INTEGER(IntKi), PARAMETER :: M42N1FKxe = 370 - INTEGER(IntKi), PARAMETER :: M42N2FKxe = 371 - INTEGER(IntKi), PARAMETER :: M42N3FKxe = 372 - INTEGER(IntKi), PARAMETER :: M42N4FKxe = 373 - INTEGER(IntKi), PARAMETER :: M42N5FKxe = 374 - INTEGER(IntKi), PARAMETER :: M42N6FKxe = 375 - INTEGER(IntKi), PARAMETER :: M42N7FKxe = 376 - INTEGER(IntKi), PARAMETER :: M42N8FKxe = 377 - INTEGER(IntKi), PARAMETER :: M42N9FKxe = 378 - INTEGER(IntKi), PARAMETER :: M43N1FKxe = 379 - INTEGER(IntKi), PARAMETER :: M43N2FKxe = 380 - INTEGER(IntKi), PARAMETER :: M43N3FKxe = 381 - INTEGER(IntKi), PARAMETER :: M43N4FKxe = 382 - INTEGER(IntKi), PARAMETER :: M43N5FKxe = 383 - INTEGER(IntKi), PARAMETER :: M43N6FKxe = 384 - INTEGER(IntKi), PARAMETER :: M43N7FKxe = 385 - INTEGER(IntKi), PARAMETER :: M43N8FKxe = 386 - INTEGER(IntKi), PARAMETER :: M43N9FKxe = 387 - INTEGER(IntKi), PARAMETER :: M44N1FKxe = 388 - INTEGER(IntKi), PARAMETER :: M44N2FKxe = 389 - INTEGER(IntKi), PARAMETER :: M44N3FKxe = 390 - INTEGER(IntKi), PARAMETER :: M44N4FKxe = 391 - INTEGER(IntKi), PARAMETER :: M44N5FKxe = 392 - INTEGER(IntKi), PARAMETER :: M44N6FKxe = 393 - INTEGER(IntKi), PARAMETER :: M44N7FKxe = 394 - INTEGER(IntKi), PARAMETER :: M44N8FKxe = 395 - INTEGER(IntKi), PARAMETER :: M44N9FKxe = 396 - INTEGER(IntKi), PARAMETER :: M45N1FKxe = 397 - INTEGER(IntKi), PARAMETER :: M45N2FKxe = 398 - INTEGER(IntKi), PARAMETER :: M45N3FKxe = 399 - INTEGER(IntKi), PARAMETER :: M45N4FKxe = 400 - INTEGER(IntKi), PARAMETER :: M45N5FKxe = 401 - INTEGER(IntKi), PARAMETER :: M45N6FKxe = 402 - INTEGER(IntKi), PARAMETER :: M45N7FKxe = 403 - INTEGER(IntKi), PARAMETER :: M45N8FKxe = 404 - INTEGER(IntKi), PARAMETER :: M45N9FKxe = 405 - INTEGER(IntKi), PARAMETER :: M46N1FKxe = 406 - INTEGER(IntKi), PARAMETER :: M46N2FKxe = 407 - INTEGER(IntKi), PARAMETER :: M46N3FKxe = 408 - INTEGER(IntKi), PARAMETER :: M46N4FKxe = 409 - INTEGER(IntKi), PARAMETER :: M46N5FKxe = 410 - INTEGER(IntKi), PARAMETER :: M46N6FKxe = 411 - INTEGER(IntKi), PARAMETER :: M46N7FKxe = 412 - INTEGER(IntKi), PARAMETER :: M46N8FKxe = 413 - INTEGER(IntKi), PARAMETER :: M46N9FKxe = 414 - INTEGER(IntKi), PARAMETER :: M47N1FKxe = 415 - INTEGER(IntKi), PARAMETER :: M47N2FKxe = 416 - INTEGER(IntKi), PARAMETER :: M47N3FKxe = 417 - INTEGER(IntKi), PARAMETER :: M47N4FKxe = 418 - INTEGER(IntKi), PARAMETER :: M47N5FKxe = 419 - INTEGER(IntKi), PARAMETER :: M47N6FKxe = 420 - INTEGER(IntKi), PARAMETER :: M47N7FKxe = 421 - INTEGER(IntKi), PARAMETER :: M47N8FKxe = 422 - INTEGER(IntKi), PARAMETER :: M47N9FKxe = 423 - INTEGER(IntKi), PARAMETER :: M48N1FKxe = 424 - INTEGER(IntKi), PARAMETER :: M48N2FKxe = 425 - INTEGER(IntKi), PARAMETER :: M48N3FKxe = 426 - INTEGER(IntKi), PARAMETER :: M48N4FKxe = 427 - INTEGER(IntKi), PARAMETER :: M48N5FKxe = 428 - INTEGER(IntKi), PARAMETER :: M48N6FKxe = 429 - INTEGER(IntKi), PARAMETER :: M48N7FKxe = 430 - INTEGER(IntKi), PARAMETER :: M48N8FKxe = 431 - INTEGER(IntKi), PARAMETER :: M48N9FKxe = 432 - INTEGER(IntKi), PARAMETER :: M49N1FKxe = 433 - INTEGER(IntKi), PARAMETER :: M49N2FKxe = 434 - INTEGER(IntKi), PARAMETER :: M49N3FKxe = 435 - INTEGER(IntKi), PARAMETER :: M49N4FKxe = 436 - INTEGER(IntKi), PARAMETER :: M49N5FKxe = 437 - INTEGER(IntKi), PARAMETER :: M49N6FKxe = 438 - INTEGER(IntKi), PARAMETER :: M49N7FKxe = 439 - INTEGER(IntKi), PARAMETER :: M49N8FKxe = 440 - INTEGER(IntKi), PARAMETER :: M49N9FKxe = 441 - INTEGER(IntKi), PARAMETER :: M50N1FKxe = 442 - INTEGER(IntKi), PARAMETER :: M50N2FKxe = 443 - INTEGER(IntKi), PARAMETER :: M50N3FKxe = 444 - INTEGER(IntKi), PARAMETER :: M50N4FKxe = 445 - INTEGER(IntKi), PARAMETER :: M50N5FKxe = 446 - INTEGER(IntKi), PARAMETER :: M50N6FKxe = 447 - INTEGER(IntKi), PARAMETER :: M50N7FKxe = 448 - INTEGER(IntKi), PARAMETER :: M50N8FKxe = 449 - INTEGER(IntKi), PARAMETER :: M50N9FKxe = 450 - INTEGER(IntKi), PARAMETER :: M51N1FKxe = 451 - INTEGER(IntKi), PARAMETER :: M51N2FKxe = 452 - INTEGER(IntKi), PARAMETER :: M51N3FKxe = 453 - INTEGER(IntKi), PARAMETER :: M51N4FKxe = 454 - INTEGER(IntKi), PARAMETER :: M51N5FKxe = 455 - INTEGER(IntKi), PARAMETER :: M51N6FKxe = 456 - INTEGER(IntKi), PARAMETER :: M51N7FKxe = 457 - INTEGER(IntKi), PARAMETER :: M51N8FKxe = 458 - INTEGER(IntKi), PARAMETER :: M51N9FKxe = 459 - INTEGER(IntKi), PARAMETER :: M52N1FKxe = 460 - INTEGER(IntKi), PARAMETER :: M52N2FKxe = 461 - INTEGER(IntKi), PARAMETER :: M52N3FKxe = 462 - INTEGER(IntKi), PARAMETER :: M52N4FKxe = 463 - INTEGER(IntKi), PARAMETER :: M52N5FKxe = 464 - INTEGER(IntKi), PARAMETER :: M52N6FKxe = 465 - INTEGER(IntKi), PARAMETER :: M52N7FKxe = 466 - INTEGER(IntKi), PARAMETER :: M52N8FKxe = 467 - INTEGER(IntKi), PARAMETER :: M52N9FKxe = 468 - INTEGER(IntKi), PARAMETER :: M53N1FKxe = 469 - INTEGER(IntKi), PARAMETER :: M53N2FKxe = 470 - INTEGER(IntKi), PARAMETER :: M53N3FKxe = 471 - INTEGER(IntKi), PARAMETER :: M53N4FKxe = 472 - INTEGER(IntKi), PARAMETER :: M53N5FKxe = 473 - INTEGER(IntKi), PARAMETER :: M53N6FKxe = 474 - INTEGER(IntKi), PARAMETER :: M53N7FKxe = 475 - INTEGER(IntKi), PARAMETER :: M53N8FKxe = 476 - INTEGER(IntKi), PARAMETER :: M53N9FKxe = 477 - INTEGER(IntKi), PARAMETER :: M54N1FKxe = 478 - INTEGER(IntKi), PARAMETER :: M54N2FKxe = 479 - INTEGER(IntKi), PARAMETER :: M54N3FKxe = 480 - INTEGER(IntKi), PARAMETER :: M54N4FKxe = 481 - INTEGER(IntKi), PARAMETER :: M54N5FKxe = 482 - INTEGER(IntKi), PARAMETER :: M54N6FKxe = 483 - INTEGER(IntKi), PARAMETER :: M54N7FKxe = 484 - INTEGER(IntKi), PARAMETER :: M54N8FKxe = 485 - INTEGER(IntKi), PARAMETER :: M54N9FKxe = 486 - INTEGER(IntKi), PARAMETER :: M55N1FKxe = 487 - INTEGER(IntKi), PARAMETER :: M55N2FKxe = 488 - INTEGER(IntKi), PARAMETER :: M55N3FKxe = 489 - INTEGER(IntKi), PARAMETER :: M55N4FKxe = 490 - INTEGER(IntKi), PARAMETER :: M55N5FKxe = 491 - INTEGER(IntKi), PARAMETER :: M55N6FKxe = 492 - INTEGER(IntKi), PARAMETER :: M55N7FKxe = 493 - INTEGER(IntKi), PARAMETER :: M55N8FKxe = 494 - INTEGER(IntKi), PARAMETER :: M55N9FKxe = 495 - INTEGER(IntKi), PARAMETER :: M56N1FKxe = 496 - INTEGER(IntKi), PARAMETER :: M56N2FKxe = 497 - INTEGER(IntKi), PARAMETER :: M56N3FKxe = 498 - INTEGER(IntKi), PARAMETER :: M56N4FKxe = 499 - INTEGER(IntKi), PARAMETER :: M56N5FKxe = 500 - INTEGER(IntKi), PARAMETER :: M56N6FKxe = 501 - INTEGER(IntKi), PARAMETER :: M56N7FKxe = 502 - INTEGER(IntKi), PARAMETER :: M56N8FKxe = 503 - INTEGER(IntKi), PARAMETER :: M56N9FKxe = 504 - INTEGER(IntKi), PARAMETER :: M57N1FKxe = 505 - INTEGER(IntKi), PARAMETER :: M57N2FKxe = 506 - INTEGER(IntKi), PARAMETER :: M57N3FKxe = 507 - INTEGER(IntKi), PARAMETER :: M57N4FKxe = 508 - INTEGER(IntKi), PARAMETER :: M57N5FKxe = 509 - INTEGER(IntKi), PARAMETER :: M57N6FKxe = 510 - INTEGER(IntKi), PARAMETER :: M57N7FKxe = 511 - INTEGER(IntKi), PARAMETER :: M57N8FKxe = 512 - INTEGER(IntKi), PARAMETER :: M57N9FKxe = 513 - INTEGER(IntKi), PARAMETER :: M58N1FKxe = 514 - INTEGER(IntKi), PARAMETER :: M58N2FKxe = 515 - INTEGER(IntKi), PARAMETER :: M58N3FKxe = 516 - INTEGER(IntKi), PARAMETER :: M58N4FKxe = 517 - INTEGER(IntKi), PARAMETER :: M58N5FKxe = 518 - INTEGER(IntKi), PARAMETER :: M58N6FKxe = 519 - INTEGER(IntKi), PARAMETER :: M58N7FKxe = 520 - INTEGER(IntKi), PARAMETER :: M58N8FKxe = 521 - INTEGER(IntKi), PARAMETER :: M58N9FKxe = 522 - INTEGER(IntKi), PARAMETER :: M59N1FKxe = 523 - INTEGER(IntKi), PARAMETER :: M59N2FKxe = 524 - INTEGER(IntKi), PARAMETER :: M59N3FKxe = 525 - INTEGER(IntKi), PARAMETER :: M59N4FKxe = 526 - INTEGER(IntKi), PARAMETER :: M59N5FKxe = 527 - INTEGER(IntKi), PARAMETER :: M59N6FKxe = 528 - INTEGER(IntKi), PARAMETER :: M59N7FKxe = 529 - INTEGER(IntKi), PARAMETER :: M59N8FKxe = 530 - INTEGER(IntKi), PARAMETER :: M59N9FKxe = 531 - INTEGER(IntKi), PARAMETER :: M60N1FKxe = 532 - INTEGER(IntKi), PARAMETER :: M60N2FKxe = 533 - INTEGER(IntKi), PARAMETER :: M60N3FKxe = 534 - INTEGER(IntKi), PARAMETER :: M60N4FKxe = 535 - INTEGER(IntKi), PARAMETER :: M60N5FKxe = 536 - INTEGER(IntKi), PARAMETER :: M60N6FKxe = 537 - INTEGER(IntKi), PARAMETER :: M60N7FKxe = 538 - INTEGER(IntKi), PARAMETER :: M60N8FKxe = 539 - INTEGER(IntKi), PARAMETER :: M60N9FKxe = 540 - INTEGER(IntKi), PARAMETER :: M61N1FKxe = 541 - INTEGER(IntKi), PARAMETER :: M61N2FKxe = 542 - INTEGER(IntKi), PARAMETER :: M61N3FKxe = 543 - INTEGER(IntKi), PARAMETER :: M61N4FKxe = 544 - INTEGER(IntKi), PARAMETER :: M61N5FKxe = 545 - INTEGER(IntKi), PARAMETER :: M61N6FKxe = 546 - INTEGER(IntKi), PARAMETER :: M61N7FKxe = 547 - INTEGER(IntKi), PARAMETER :: M61N8FKxe = 548 - INTEGER(IntKi), PARAMETER :: M61N9FKxe = 549 - INTEGER(IntKi), PARAMETER :: M62N1FKxe = 550 - INTEGER(IntKi), PARAMETER :: M62N2FKxe = 551 - INTEGER(IntKi), PARAMETER :: M62N3FKxe = 552 - INTEGER(IntKi), PARAMETER :: M62N4FKxe = 553 - INTEGER(IntKi), PARAMETER :: M62N5FKxe = 554 - INTEGER(IntKi), PARAMETER :: M62N6FKxe = 555 - INTEGER(IntKi), PARAMETER :: M62N7FKxe = 556 - INTEGER(IntKi), PARAMETER :: M62N8FKxe = 557 - INTEGER(IntKi), PARAMETER :: M62N9FKxe = 558 - INTEGER(IntKi), PARAMETER :: M63N1FKxe = 559 - INTEGER(IntKi), PARAMETER :: M63N2FKxe = 560 - INTEGER(IntKi), PARAMETER :: M63N3FKxe = 561 - INTEGER(IntKi), PARAMETER :: M63N4FKxe = 562 - INTEGER(IntKi), PARAMETER :: M63N5FKxe = 563 - INTEGER(IntKi), PARAMETER :: M63N6FKxe = 564 - INTEGER(IntKi), PARAMETER :: M63N7FKxe = 565 - INTEGER(IntKi), PARAMETER :: M63N8FKxe = 566 - INTEGER(IntKi), PARAMETER :: M63N9FKxe = 567 - INTEGER(IntKi), PARAMETER :: M64N1FKxe = 568 - INTEGER(IntKi), PARAMETER :: M64N2FKxe = 569 - INTEGER(IntKi), PARAMETER :: M64N3FKxe = 570 - INTEGER(IntKi), PARAMETER :: M64N4FKxe = 571 - INTEGER(IntKi), PARAMETER :: M64N5FKxe = 572 - INTEGER(IntKi), PARAMETER :: M64N6FKxe = 573 - INTEGER(IntKi), PARAMETER :: M64N7FKxe = 574 - INTEGER(IntKi), PARAMETER :: M64N8FKxe = 575 - INTEGER(IntKi), PARAMETER :: M64N9FKxe = 576 - INTEGER(IntKi), PARAMETER :: M65N1FKxe = 577 - INTEGER(IntKi), PARAMETER :: M65N2FKxe = 578 - INTEGER(IntKi), PARAMETER :: M65N3FKxe = 579 - INTEGER(IntKi), PARAMETER :: M65N4FKxe = 580 - INTEGER(IntKi), PARAMETER :: M65N5FKxe = 581 - INTEGER(IntKi), PARAMETER :: M65N6FKxe = 582 - INTEGER(IntKi), PARAMETER :: M65N7FKxe = 583 - INTEGER(IntKi), PARAMETER :: M65N8FKxe = 584 - INTEGER(IntKi), PARAMETER :: M65N9FKxe = 585 - INTEGER(IntKi), PARAMETER :: M66N1FKxe = 586 - INTEGER(IntKi), PARAMETER :: M66N2FKxe = 587 - INTEGER(IntKi), PARAMETER :: M66N3FKxe = 588 - INTEGER(IntKi), PARAMETER :: M66N4FKxe = 589 - INTEGER(IntKi), PARAMETER :: M66N5FKxe = 590 - INTEGER(IntKi), PARAMETER :: M66N6FKxe = 591 - INTEGER(IntKi), PARAMETER :: M66N7FKxe = 592 - INTEGER(IntKi), PARAMETER :: M66N8FKxe = 593 - INTEGER(IntKi), PARAMETER :: M66N9FKxe = 594 - INTEGER(IntKi), PARAMETER :: M67N1FKxe = 595 - INTEGER(IntKi), PARAMETER :: M67N2FKxe = 596 - INTEGER(IntKi), PARAMETER :: M67N3FKxe = 597 - INTEGER(IntKi), PARAMETER :: M67N4FKxe = 598 - INTEGER(IntKi), PARAMETER :: M67N5FKxe = 599 - INTEGER(IntKi), PARAMETER :: M67N6FKxe = 600 - INTEGER(IntKi), PARAMETER :: M67N7FKxe = 601 - INTEGER(IntKi), PARAMETER :: M67N8FKxe = 602 - INTEGER(IntKi), PARAMETER :: M67N9FKxe = 603 - INTEGER(IntKi), PARAMETER :: M68N1FKxe = 604 - INTEGER(IntKi), PARAMETER :: M68N2FKxe = 605 - INTEGER(IntKi), PARAMETER :: M68N3FKxe = 606 - INTEGER(IntKi), PARAMETER :: M68N4FKxe = 607 - INTEGER(IntKi), PARAMETER :: M68N5FKxe = 608 - INTEGER(IntKi), PARAMETER :: M68N6FKxe = 609 - INTEGER(IntKi), PARAMETER :: M68N7FKxe = 610 - INTEGER(IntKi), PARAMETER :: M68N8FKxe = 611 - INTEGER(IntKi), PARAMETER :: M68N9FKxe = 612 - INTEGER(IntKi), PARAMETER :: M69N1FKxe = 613 - INTEGER(IntKi), PARAMETER :: M69N2FKxe = 614 - INTEGER(IntKi), PARAMETER :: M69N3FKxe = 615 - INTEGER(IntKi), PARAMETER :: M69N4FKxe = 616 - INTEGER(IntKi), PARAMETER :: M69N5FKxe = 617 - INTEGER(IntKi), PARAMETER :: M69N6FKxe = 618 - INTEGER(IntKi), PARAMETER :: M69N7FKxe = 619 - INTEGER(IntKi), PARAMETER :: M69N8FKxe = 620 - INTEGER(IntKi), PARAMETER :: M69N9FKxe = 621 - INTEGER(IntKi), PARAMETER :: M70N1FKxe = 622 - INTEGER(IntKi), PARAMETER :: M70N2FKxe = 623 - INTEGER(IntKi), PARAMETER :: M70N3FKxe = 624 - INTEGER(IntKi), PARAMETER :: M70N4FKxe = 625 - INTEGER(IntKi), PARAMETER :: M70N5FKxe = 626 - INTEGER(IntKi), PARAMETER :: M70N6FKxe = 627 - INTEGER(IntKi), PARAMETER :: M70N7FKxe = 628 - INTEGER(IntKi), PARAMETER :: M70N8FKxe = 629 - INTEGER(IntKi), PARAMETER :: M70N9FKxe = 630 - INTEGER(IntKi), PARAMETER :: M71N1FKxe = 631 - INTEGER(IntKi), PARAMETER :: M71N2FKxe = 632 - INTEGER(IntKi), PARAMETER :: M71N3FKxe = 633 - INTEGER(IntKi), PARAMETER :: M71N4FKxe = 634 - INTEGER(IntKi), PARAMETER :: M71N5FKxe = 635 - INTEGER(IntKi), PARAMETER :: M71N6FKxe = 636 - INTEGER(IntKi), PARAMETER :: M71N7FKxe = 637 - INTEGER(IntKi), PARAMETER :: M71N8FKxe = 638 - INTEGER(IntKi), PARAMETER :: M71N9FKxe = 639 - INTEGER(IntKi), PARAMETER :: M72N1FKxe = 640 - INTEGER(IntKi), PARAMETER :: M72N2FKxe = 641 - INTEGER(IntKi), PARAMETER :: M72N3FKxe = 642 - INTEGER(IntKi), PARAMETER :: M72N4FKxe = 643 - INTEGER(IntKi), PARAMETER :: M72N5FKxe = 644 - INTEGER(IntKi), PARAMETER :: M72N6FKxe = 645 - INTEGER(IntKi), PARAMETER :: M72N7FKxe = 646 - INTEGER(IntKi), PARAMETER :: M72N8FKxe = 647 - INTEGER(IntKi), PARAMETER :: M72N9FKxe = 648 - INTEGER(IntKi), PARAMETER :: M73N1FKxe = 649 - INTEGER(IntKi), PARAMETER :: M73N2FKxe = 650 - INTEGER(IntKi), PARAMETER :: M73N3FKxe = 651 - INTEGER(IntKi), PARAMETER :: M73N4FKxe = 652 - INTEGER(IntKi), PARAMETER :: M73N5FKxe = 653 - INTEGER(IntKi), PARAMETER :: M73N6FKxe = 654 - INTEGER(IntKi), PARAMETER :: M73N7FKxe = 655 - INTEGER(IntKi), PARAMETER :: M73N8FKxe = 656 - INTEGER(IntKi), PARAMETER :: M73N9FKxe = 657 - INTEGER(IntKi), PARAMETER :: M74N1FKxe = 658 - INTEGER(IntKi), PARAMETER :: M74N2FKxe = 659 - INTEGER(IntKi), PARAMETER :: M74N3FKxe = 660 - INTEGER(IntKi), PARAMETER :: M74N4FKxe = 661 - INTEGER(IntKi), PARAMETER :: M74N5FKxe = 662 - INTEGER(IntKi), PARAMETER :: M74N6FKxe = 663 - INTEGER(IntKi), PARAMETER :: M74N7FKxe = 664 - INTEGER(IntKi), PARAMETER :: M74N8FKxe = 665 - INTEGER(IntKi), PARAMETER :: M74N9FKxe = 666 - INTEGER(IntKi), PARAMETER :: M75N1FKxe = 667 - INTEGER(IntKi), PARAMETER :: M75N2FKxe = 668 - INTEGER(IntKi), PARAMETER :: M75N3FKxe = 669 - INTEGER(IntKi), PARAMETER :: M75N4FKxe = 670 - INTEGER(IntKi), PARAMETER :: M75N5FKxe = 671 - INTEGER(IntKi), PARAMETER :: M75N6FKxe = 672 - INTEGER(IntKi), PARAMETER :: M75N7FKxe = 673 - INTEGER(IntKi), PARAMETER :: M75N8FKxe = 674 - INTEGER(IntKi), PARAMETER :: M75N9FKxe = 675 - INTEGER(IntKi), PARAMETER :: M76N1FKxe = 676 - INTEGER(IntKi), PARAMETER :: M76N2FKxe = 677 - INTEGER(IntKi), PARAMETER :: M76N3FKxe = 678 - INTEGER(IntKi), PARAMETER :: M76N4FKxe = 679 - INTEGER(IntKi), PARAMETER :: M76N5FKxe = 680 - INTEGER(IntKi), PARAMETER :: M76N6FKxe = 681 - INTEGER(IntKi), PARAMETER :: M76N7FKxe = 682 - INTEGER(IntKi), PARAMETER :: M76N8FKxe = 683 - INTEGER(IntKi), PARAMETER :: M76N9FKxe = 684 - INTEGER(IntKi), PARAMETER :: M77N1FKxe = 685 - INTEGER(IntKi), PARAMETER :: M77N2FKxe = 686 - INTEGER(IntKi), PARAMETER :: M77N3FKxe = 687 - INTEGER(IntKi), PARAMETER :: M77N4FKxe = 688 - INTEGER(IntKi), PARAMETER :: M77N5FKxe = 689 - INTEGER(IntKi), PARAMETER :: M77N6FKxe = 690 - INTEGER(IntKi), PARAMETER :: M77N7FKxe = 691 - INTEGER(IntKi), PARAMETER :: M77N8FKxe = 692 - INTEGER(IntKi), PARAMETER :: M77N9FKxe = 693 - INTEGER(IntKi), PARAMETER :: M78N1FKxe = 694 - INTEGER(IntKi), PARAMETER :: M78N2FKxe = 695 - INTEGER(IntKi), PARAMETER :: M78N3FKxe = 696 - INTEGER(IntKi), PARAMETER :: M78N4FKxe = 697 - INTEGER(IntKi), PARAMETER :: M78N5FKxe = 698 - INTEGER(IntKi), PARAMETER :: M78N6FKxe = 699 - INTEGER(IntKi), PARAMETER :: M78N7FKxe = 700 - INTEGER(IntKi), PARAMETER :: M78N8FKxe = 701 - INTEGER(IntKi), PARAMETER :: M78N9FKxe = 702 - INTEGER(IntKi), PARAMETER :: M79N1FKxe = 703 - INTEGER(IntKi), PARAMETER :: M79N2FKxe = 704 - INTEGER(IntKi), PARAMETER :: M79N3FKxe = 705 - INTEGER(IntKi), PARAMETER :: M79N4FKxe = 706 - INTEGER(IntKi), PARAMETER :: M79N5FKxe = 707 - INTEGER(IntKi), PARAMETER :: M79N6FKxe = 708 - INTEGER(IntKi), PARAMETER :: M79N7FKxe = 709 - INTEGER(IntKi), PARAMETER :: M79N8FKxe = 710 - INTEGER(IntKi), PARAMETER :: M79N9FKxe = 711 - INTEGER(IntKi), PARAMETER :: M80N1FKxe = 712 - INTEGER(IntKi), PARAMETER :: M80N2FKxe = 713 - INTEGER(IntKi), PARAMETER :: M80N3FKxe = 714 - INTEGER(IntKi), PARAMETER :: M80N4FKxe = 715 - INTEGER(IntKi), PARAMETER :: M80N5FKxe = 716 - INTEGER(IntKi), PARAMETER :: M80N6FKxe = 717 - INTEGER(IntKi), PARAMETER :: M80N7FKxe = 718 - INTEGER(IntKi), PARAMETER :: M80N8FKxe = 719 - INTEGER(IntKi), PARAMETER :: M80N9FKxe = 720 - INTEGER(IntKi), PARAMETER :: M81N1FKxe = 721 - INTEGER(IntKi), PARAMETER :: M81N2FKxe = 722 - INTEGER(IntKi), PARAMETER :: M81N3FKxe = 723 - INTEGER(IntKi), PARAMETER :: M81N4FKxe = 724 - INTEGER(IntKi), PARAMETER :: M81N5FKxe = 725 - INTEGER(IntKi), PARAMETER :: M81N6FKxe = 726 - INTEGER(IntKi), PARAMETER :: M81N7FKxe = 727 - INTEGER(IntKi), PARAMETER :: M81N8FKxe = 728 - INTEGER(IntKi), PARAMETER :: M81N9FKxe = 729 - INTEGER(IntKi), PARAMETER :: M82N1FKxe = 730 - INTEGER(IntKi), PARAMETER :: M82N2FKxe = 731 - INTEGER(IntKi), PARAMETER :: M82N3FKxe = 732 - INTEGER(IntKi), PARAMETER :: M82N4FKxe = 733 - INTEGER(IntKi), PARAMETER :: M82N5FKxe = 734 - INTEGER(IntKi), PARAMETER :: M82N6FKxe = 735 - INTEGER(IntKi), PARAMETER :: M82N7FKxe = 736 - INTEGER(IntKi), PARAMETER :: M82N8FKxe = 737 - INTEGER(IntKi), PARAMETER :: M82N9FKxe = 738 - INTEGER(IntKi), PARAMETER :: M83N1FKxe = 739 - INTEGER(IntKi), PARAMETER :: M83N2FKxe = 740 - INTEGER(IntKi), PARAMETER :: M83N3FKxe = 741 - INTEGER(IntKi), PARAMETER :: M83N4FKxe = 742 - INTEGER(IntKi), PARAMETER :: M83N5FKxe = 743 - INTEGER(IntKi), PARAMETER :: M83N6FKxe = 744 - INTEGER(IntKi), PARAMETER :: M83N7FKxe = 745 - INTEGER(IntKi), PARAMETER :: M83N8FKxe = 746 - INTEGER(IntKi), PARAMETER :: M83N9FKxe = 747 - INTEGER(IntKi), PARAMETER :: M84N1FKxe = 748 - INTEGER(IntKi), PARAMETER :: M84N2FKxe = 749 - INTEGER(IntKi), PARAMETER :: M84N3FKxe = 750 - INTEGER(IntKi), PARAMETER :: M84N4FKxe = 751 - INTEGER(IntKi), PARAMETER :: M84N5FKxe = 752 - INTEGER(IntKi), PARAMETER :: M84N6FKxe = 753 - INTEGER(IntKi), PARAMETER :: M84N7FKxe = 754 - INTEGER(IntKi), PARAMETER :: M84N8FKxe = 755 - INTEGER(IntKi), PARAMETER :: M84N9FKxe = 756 - INTEGER(IntKi), PARAMETER :: M85N1FKxe = 757 - INTEGER(IntKi), PARAMETER :: M85N2FKxe = 758 - INTEGER(IntKi), PARAMETER :: M85N3FKxe = 759 - INTEGER(IntKi), PARAMETER :: M85N4FKxe = 760 - INTEGER(IntKi), PARAMETER :: M85N5FKxe = 761 - INTEGER(IntKi), PARAMETER :: M85N6FKxe = 762 - INTEGER(IntKi), PARAMETER :: M85N7FKxe = 763 - INTEGER(IntKi), PARAMETER :: M85N8FKxe = 764 - INTEGER(IntKi), PARAMETER :: M85N9FKxe = 765 - INTEGER(IntKi), PARAMETER :: M86N1FKxe = 766 - INTEGER(IntKi), PARAMETER :: M86N2FKxe = 767 - INTEGER(IntKi), PARAMETER :: M86N3FKxe = 768 - INTEGER(IntKi), PARAMETER :: M86N4FKxe = 769 - INTEGER(IntKi), PARAMETER :: M86N5FKxe = 770 - INTEGER(IntKi), PARAMETER :: M86N6FKxe = 771 - INTEGER(IntKi), PARAMETER :: M86N7FKxe = 772 - INTEGER(IntKi), PARAMETER :: M86N8FKxe = 773 - INTEGER(IntKi), PARAMETER :: M86N9FKxe = 774 - INTEGER(IntKi), PARAMETER :: M87N1FKxe = 775 - INTEGER(IntKi), PARAMETER :: M87N2FKxe = 776 - INTEGER(IntKi), PARAMETER :: M87N3FKxe = 777 - INTEGER(IntKi), PARAMETER :: M87N4FKxe = 778 - INTEGER(IntKi), PARAMETER :: M87N5FKxe = 779 - INTEGER(IntKi), PARAMETER :: M87N6FKxe = 780 - INTEGER(IntKi), PARAMETER :: M87N7FKxe = 781 - INTEGER(IntKi), PARAMETER :: M87N8FKxe = 782 - INTEGER(IntKi), PARAMETER :: M87N9FKxe = 783 - INTEGER(IntKi), PARAMETER :: M88N1FKxe = 784 - INTEGER(IntKi), PARAMETER :: M88N2FKxe = 785 - INTEGER(IntKi), PARAMETER :: M88N3FKxe = 786 - INTEGER(IntKi), PARAMETER :: M88N4FKxe = 787 - INTEGER(IntKi), PARAMETER :: M88N5FKxe = 788 - INTEGER(IntKi), PARAMETER :: M88N6FKxe = 789 - INTEGER(IntKi), PARAMETER :: M88N7FKxe = 790 - INTEGER(IntKi), PARAMETER :: M88N8FKxe = 791 - INTEGER(IntKi), PARAMETER :: M88N9FKxe = 792 - INTEGER(IntKi), PARAMETER :: M89N1FKxe = 793 - INTEGER(IntKi), PARAMETER :: M89N2FKxe = 794 - INTEGER(IntKi), PARAMETER :: M89N3FKxe = 795 - INTEGER(IntKi), PARAMETER :: M89N4FKxe = 796 - INTEGER(IntKi), PARAMETER :: M89N5FKxe = 797 - INTEGER(IntKi), PARAMETER :: M89N6FKxe = 798 - INTEGER(IntKi), PARAMETER :: M89N7FKxe = 799 - INTEGER(IntKi), PARAMETER :: M89N8FKxe = 800 - INTEGER(IntKi), PARAMETER :: M89N9FKxe = 801 - INTEGER(IntKi), PARAMETER :: M90N1FKxe = 802 - INTEGER(IntKi), PARAMETER :: M90N2FKxe = 803 - INTEGER(IntKi), PARAMETER :: M90N3FKxe = 804 - INTEGER(IntKi), PARAMETER :: M90N4FKxe = 805 - INTEGER(IntKi), PARAMETER :: M90N5FKxe = 806 - INTEGER(IntKi), PARAMETER :: M90N6FKxe = 807 - INTEGER(IntKi), PARAMETER :: M90N7FKxe = 808 - INTEGER(IntKi), PARAMETER :: M90N8FKxe = 809 - INTEGER(IntKi), PARAMETER :: M90N9FKxe = 810 - INTEGER(IntKi), PARAMETER :: M91N1FKxe = 811 - INTEGER(IntKi), PARAMETER :: M91N2FKxe = 812 - INTEGER(IntKi), PARAMETER :: M91N3FKxe = 813 - INTEGER(IntKi), PARAMETER :: M91N4FKxe = 814 - INTEGER(IntKi), PARAMETER :: M91N5FKxe = 815 - INTEGER(IntKi), PARAMETER :: M91N6FKxe = 816 - INTEGER(IntKi), PARAMETER :: M91N7FKxe = 817 - INTEGER(IntKi), PARAMETER :: M91N8FKxe = 818 - INTEGER(IntKi), PARAMETER :: M91N9FKxe = 819 - INTEGER(IntKi), PARAMETER :: M92N1FKxe = 820 - INTEGER(IntKi), PARAMETER :: M92N2FKxe = 821 - INTEGER(IntKi), PARAMETER :: M92N3FKxe = 822 - INTEGER(IntKi), PARAMETER :: M92N4FKxe = 823 - INTEGER(IntKi), PARAMETER :: M92N5FKxe = 824 - INTEGER(IntKi), PARAMETER :: M92N6FKxe = 825 - INTEGER(IntKi), PARAMETER :: M92N7FKxe = 826 - INTEGER(IntKi), PARAMETER :: M92N8FKxe = 827 - INTEGER(IntKi), PARAMETER :: M92N9FKxe = 828 - INTEGER(IntKi), PARAMETER :: M93N1FKxe = 829 - INTEGER(IntKi), PARAMETER :: M93N2FKxe = 830 - INTEGER(IntKi), PARAMETER :: M93N3FKxe = 831 - INTEGER(IntKi), PARAMETER :: M93N4FKxe = 832 - INTEGER(IntKi), PARAMETER :: M93N5FKxe = 833 - INTEGER(IntKi), PARAMETER :: M93N6FKxe = 834 - INTEGER(IntKi), PARAMETER :: M93N7FKxe = 835 - INTEGER(IntKi), PARAMETER :: M93N8FKxe = 836 - INTEGER(IntKi), PARAMETER :: M93N9FKxe = 837 - INTEGER(IntKi), PARAMETER :: M94N1FKxe = 838 - INTEGER(IntKi), PARAMETER :: M94N2FKxe = 839 - INTEGER(IntKi), PARAMETER :: M94N3FKxe = 840 - INTEGER(IntKi), PARAMETER :: M94N4FKxe = 841 - INTEGER(IntKi), PARAMETER :: M94N5FKxe = 842 - INTEGER(IntKi), PARAMETER :: M94N6FKxe = 843 - INTEGER(IntKi), PARAMETER :: M94N7FKxe = 844 - INTEGER(IntKi), PARAMETER :: M94N8FKxe = 845 - INTEGER(IntKi), PARAMETER :: M94N9FKxe = 846 - INTEGER(IntKi), PARAMETER :: M95N1FKxe = 847 - INTEGER(IntKi), PARAMETER :: M95N2FKxe = 848 - INTEGER(IntKi), PARAMETER :: M95N3FKxe = 849 - INTEGER(IntKi), PARAMETER :: M95N4FKxe = 850 - INTEGER(IntKi), PARAMETER :: M95N5FKxe = 851 - INTEGER(IntKi), PARAMETER :: M95N6FKxe = 852 - INTEGER(IntKi), PARAMETER :: M95N7FKxe = 853 - INTEGER(IntKi), PARAMETER :: M95N8FKxe = 854 - INTEGER(IntKi), PARAMETER :: M95N9FKxe = 855 - INTEGER(IntKi), PARAMETER :: M96N1FKxe = 856 - INTEGER(IntKi), PARAMETER :: M96N2FKxe = 857 - INTEGER(IntKi), PARAMETER :: M96N3FKxe = 858 - INTEGER(IntKi), PARAMETER :: M96N4FKxe = 859 - INTEGER(IntKi), PARAMETER :: M96N5FKxe = 860 - INTEGER(IntKi), PARAMETER :: M96N6FKxe = 861 - INTEGER(IntKi), PARAMETER :: M96N7FKxe = 862 - INTEGER(IntKi), PARAMETER :: M96N8FKxe = 863 - INTEGER(IntKi), PARAMETER :: M96N9FKxe = 864 - INTEGER(IntKi), PARAMETER :: M97N1FKxe = 865 - INTEGER(IntKi), PARAMETER :: M97N2FKxe = 866 - INTEGER(IntKi), PARAMETER :: M97N3FKxe = 867 - INTEGER(IntKi), PARAMETER :: M97N4FKxe = 868 - INTEGER(IntKi), PARAMETER :: M97N5FKxe = 869 - INTEGER(IntKi), PARAMETER :: M97N6FKxe = 870 - INTEGER(IntKi), PARAMETER :: M97N7FKxe = 871 - INTEGER(IntKi), PARAMETER :: M97N8FKxe = 872 - INTEGER(IntKi), PARAMETER :: M97N9FKxe = 873 - INTEGER(IntKi), PARAMETER :: M98N1FKxe = 874 - INTEGER(IntKi), PARAMETER :: M98N2FKxe = 875 - INTEGER(IntKi), PARAMETER :: M98N3FKxe = 876 - INTEGER(IntKi), PARAMETER :: M98N4FKxe = 877 - INTEGER(IntKi), PARAMETER :: M98N5FKxe = 878 - INTEGER(IntKi), PARAMETER :: M98N6FKxe = 879 - INTEGER(IntKi), PARAMETER :: M98N7FKxe = 880 - INTEGER(IntKi), PARAMETER :: M98N8FKxe = 881 - INTEGER(IntKi), PARAMETER :: M98N9FKxe = 882 - INTEGER(IntKi), PARAMETER :: M99N1FKxe = 883 - INTEGER(IntKi), PARAMETER :: M99N2FKxe = 884 - INTEGER(IntKi), PARAMETER :: M99N3FKxe = 885 - INTEGER(IntKi), PARAMETER :: M99N4FKxe = 886 - INTEGER(IntKi), PARAMETER :: M99N5FKxe = 887 - INTEGER(IntKi), PARAMETER :: M99N6FKxe = 888 - INTEGER(IntKi), PARAMETER :: M99N7FKxe = 889 - INTEGER(IntKi), PARAMETER :: M99N8FKxe = 890 - INTEGER(IntKi), PARAMETER :: M99N9FKxe = 891 - INTEGER(IntKi), PARAMETER :: M01N1FKye = 892 - INTEGER(IntKi), PARAMETER :: M01N2FKye = 893 - INTEGER(IntKi), PARAMETER :: M01N3FKye = 894 - INTEGER(IntKi), PARAMETER :: M01N4FKye = 895 - INTEGER(IntKi), PARAMETER :: M01N5FKye = 896 - INTEGER(IntKi), PARAMETER :: M01N6FKye = 897 - INTEGER(IntKi), PARAMETER :: M01N7FKye = 898 - INTEGER(IntKi), PARAMETER :: M01N8FKye = 899 - INTEGER(IntKi), PARAMETER :: M01N9FKye = 900 - INTEGER(IntKi), PARAMETER :: M02N1FKye = 901 - INTEGER(IntKi), PARAMETER :: M02N2FKye = 902 - INTEGER(IntKi), PARAMETER :: M02N3FKye = 903 - INTEGER(IntKi), PARAMETER :: M02N4FKye = 904 - INTEGER(IntKi), PARAMETER :: M02N5FKye = 905 - INTEGER(IntKi), PARAMETER :: M02N6FKye = 906 - INTEGER(IntKi), PARAMETER :: M02N7FKye = 907 - INTEGER(IntKi), PARAMETER :: M02N8FKye = 908 - INTEGER(IntKi), PARAMETER :: M02N9FKye = 909 - INTEGER(IntKi), PARAMETER :: M03N1FKye = 910 - INTEGER(IntKi), PARAMETER :: M03N2FKye = 911 - INTEGER(IntKi), PARAMETER :: M03N3FKye = 912 - INTEGER(IntKi), PARAMETER :: M03N4FKye = 913 - INTEGER(IntKi), PARAMETER :: M03N5FKye = 914 - INTEGER(IntKi), PARAMETER :: M03N6FKye = 915 - INTEGER(IntKi), PARAMETER :: M03N7FKye = 916 - INTEGER(IntKi), PARAMETER :: M03N8FKye = 917 - INTEGER(IntKi), PARAMETER :: M03N9FKye = 918 - INTEGER(IntKi), PARAMETER :: M04N1FKye = 919 - INTEGER(IntKi), PARAMETER :: M04N2FKye = 920 - INTEGER(IntKi), PARAMETER :: M04N3FKye = 921 - INTEGER(IntKi), PARAMETER :: M04N4FKye = 922 - INTEGER(IntKi), PARAMETER :: M04N5FKye = 923 - INTEGER(IntKi), PARAMETER :: M04N6FKye = 924 - INTEGER(IntKi), PARAMETER :: M04N7FKye = 925 - INTEGER(IntKi), PARAMETER :: M04N8FKye = 926 - INTEGER(IntKi), PARAMETER :: M04N9FKye = 927 - INTEGER(IntKi), PARAMETER :: M05N1FKye = 928 - INTEGER(IntKi), PARAMETER :: M05N2FKye = 929 - INTEGER(IntKi), PARAMETER :: M05N3FKye = 930 - INTEGER(IntKi), PARAMETER :: M05N4FKye = 931 - INTEGER(IntKi), PARAMETER :: M05N5FKye = 932 - INTEGER(IntKi), PARAMETER :: M05N6FKye = 933 - INTEGER(IntKi), PARAMETER :: M05N7FKye = 934 - INTEGER(IntKi), PARAMETER :: M05N8FKye = 935 - INTEGER(IntKi), PARAMETER :: M05N9FKye = 936 - INTEGER(IntKi), PARAMETER :: M06N1FKye = 937 - INTEGER(IntKi), PARAMETER :: M06N2FKye = 938 - INTEGER(IntKi), PARAMETER :: M06N3FKye = 939 - INTEGER(IntKi), PARAMETER :: M06N4FKye = 940 - INTEGER(IntKi), PARAMETER :: M06N5FKye = 941 - INTEGER(IntKi), PARAMETER :: M06N6FKye = 942 - INTEGER(IntKi), PARAMETER :: M06N7FKye = 943 - INTEGER(IntKi), PARAMETER :: M06N8FKye = 944 - INTEGER(IntKi), PARAMETER :: M06N9FKye = 945 - INTEGER(IntKi), PARAMETER :: M07N1FKye = 946 - INTEGER(IntKi), PARAMETER :: M07N2FKye = 947 - INTEGER(IntKi), PARAMETER :: M07N3FKye = 948 - INTEGER(IntKi), PARAMETER :: M07N4FKye = 949 - INTEGER(IntKi), PARAMETER :: M07N5FKye = 950 - INTEGER(IntKi), PARAMETER :: M07N6FKye = 951 - INTEGER(IntKi), PARAMETER :: M07N7FKye = 952 - INTEGER(IntKi), PARAMETER :: M07N8FKye = 953 - INTEGER(IntKi), PARAMETER :: M07N9FKye = 954 - INTEGER(IntKi), PARAMETER :: M08N1FKye = 955 - INTEGER(IntKi), PARAMETER :: M08N2FKye = 956 - INTEGER(IntKi), PARAMETER :: M08N3FKye = 957 - INTEGER(IntKi), PARAMETER :: M08N4FKye = 958 - INTEGER(IntKi), PARAMETER :: M08N5FKye = 959 - INTEGER(IntKi), PARAMETER :: M08N6FKye = 960 - INTEGER(IntKi), PARAMETER :: M08N7FKye = 961 - INTEGER(IntKi), PARAMETER :: M08N8FKye = 962 - INTEGER(IntKi), PARAMETER :: M08N9FKye = 963 - INTEGER(IntKi), PARAMETER :: M09N1FKye = 964 - INTEGER(IntKi), PARAMETER :: M09N2FKye = 965 - INTEGER(IntKi), PARAMETER :: M09N3FKye = 966 - INTEGER(IntKi), PARAMETER :: M09N4FKye = 967 - INTEGER(IntKi), PARAMETER :: M09N5FKye = 968 - INTEGER(IntKi), PARAMETER :: M09N6FKye = 969 - INTEGER(IntKi), PARAMETER :: M09N7FKye = 970 - INTEGER(IntKi), PARAMETER :: M09N8FKye = 971 - INTEGER(IntKi), PARAMETER :: M09N9FKye = 972 - INTEGER(IntKi), PARAMETER :: M10N1FKye = 973 - INTEGER(IntKi), PARAMETER :: M10N2FKye = 974 - INTEGER(IntKi), PARAMETER :: M10N3FKye = 975 - INTEGER(IntKi), PARAMETER :: M10N4FKye = 976 - INTEGER(IntKi), PARAMETER :: M10N5FKye = 977 - INTEGER(IntKi), PARAMETER :: M10N6FKye = 978 - INTEGER(IntKi), PARAMETER :: M10N7FKye = 979 - INTEGER(IntKi), PARAMETER :: M10N8FKye = 980 - INTEGER(IntKi), PARAMETER :: M10N9FKye = 981 - INTEGER(IntKi), PARAMETER :: M11N1FKye = 982 - INTEGER(IntKi), PARAMETER :: M11N2FKye = 983 - INTEGER(IntKi), PARAMETER :: M11N3FKye = 984 - INTEGER(IntKi), PARAMETER :: M11N4FKye = 985 - INTEGER(IntKi), PARAMETER :: M11N5FKye = 986 - INTEGER(IntKi), PARAMETER :: M11N6FKye = 987 - INTEGER(IntKi), PARAMETER :: M11N7FKye = 988 - INTEGER(IntKi), PARAMETER :: M11N8FKye = 989 - INTEGER(IntKi), PARAMETER :: M11N9FKye = 990 - INTEGER(IntKi), PARAMETER :: M12N1FKye = 991 - INTEGER(IntKi), PARAMETER :: M12N2FKye = 992 - INTEGER(IntKi), PARAMETER :: M12N3FKye = 993 - INTEGER(IntKi), PARAMETER :: M12N4FKye = 994 - INTEGER(IntKi), PARAMETER :: M12N5FKye = 995 - INTEGER(IntKi), PARAMETER :: M12N6FKye = 996 - INTEGER(IntKi), PARAMETER :: M12N7FKye = 997 - INTEGER(IntKi), PARAMETER :: M12N8FKye = 998 - INTEGER(IntKi), PARAMETER :: M12N9FKye = 999 - INTEGER(IntKi), PARAMETER :: M13N1FKye = 1000 - INTEGER(IntKi), PARAMETER :: M13N2FKye = 1001 - INTEGER(IntKi), PARAMETER :: M13N3FKye = 1002 - INTEGER(IntKi), PARAMETER :: M13N4FKye = 1003 - INTEGER(IntKi), PARAMETER :: M13N5FKye = 1004 - INTEGER(IntKi), PARAMETER :: M13N6FKye = 1005 - INTEGER(IntKi), PARAMETER :: M13N7FKye = 1006 - INTEGER(IntKi), PARAMETER :: M13N8FKye = 1007 - INTEGER(IntKi), PARAMETER :: M13N9FKye = 1008 - INTEGER(IntKi), PARAMETER :: M14N1FKye = 1009 - INTEGER(IntKi), PARAMETER :: M14N2FKye = 1010 - INTEGER(IntKi), PARAMETER :: M14N3FKye = 1011 - INTEGER(IntKi), PARAMETER :: M14N4FKye = 1012 - INTEGER(IntKi), PARAMETER :: M14N5FKye = 1013 - INTEGER(IntKi), PARAMETER :: M14N6FKye = 1014 - INTEGER(IntKi), PARAMETER :: M14N7FKye = 1015 - INTEGER(IntKi), PARAMETER :: M14N8FKye = 1016 - INTEGER(IntKi), PARAMETER :: M14N9FKye = 1017 - INTEGER(IntKi), PARAMETER :: M15N1FKye = 1018 - INTEGER(IntKi), PARAMETER :: M15N2FKye = 1019 - INTEGER(IntKi), PARAMETER :: M15N3FKye = 1020 - INTEGER(IntKi), PARAMETER :: M15N4FKye = 1021 - INTEGER(IntKi), PARAMETER :: M15N5FKye = 1022 - INTEGER(IntKi), PARAMETER :: M15N6FKye = 1023 - INTEGER(IntKi), PARAMETER :: M15N7FKye = 1024 - INTEGER(IntKi), PARAMETER :: M15N8FKye = 1025 - INTEGER(IntKi), PARAMETER :: M15N9FKye = 1026 - INTEGER(IntKi), PARAMETER :: M16N1FKye = 1027 - INTEGER(IntKi), PARAMETER :: M16N2FKye = 1028 - INTEGER(IntKi), PARAMETER :: M16N3FKye = 1029 - INTEGER(IntKi), PARAMETER :: M16N4FKye = 1030 - INTEGER(IntKi), PARAMETER :: M16N5FKye = 1031 - INTEGER(IntKi), PARAMETER :: M16N6FKye = 1032 - INTEGER(IntKi), PARAMETER :: M16N7FKye = 1033 - INTEGER(IntKi), PARAMETER :: M16N8FKye = 1034 - INTEGER(IntKi), PARAMETER :: M16N9FKye = 1035 - INTEGER(IntKi), PARAMETER :: M17N1FKye = 1036 - INTEGER(IntKi), PARAMETER :: M17N2FKye = 1037 - INTEGER(IntKi), PARAMETER :: M17N3FKye = 1038 - INTEGER(IntKi), PARAMETER :: M17N4FKye = 1039 - INTEGER(IntKi), PARAMETER :: M17N5FKye = 1040 - INTEGER(IntKi), PARAMETER :: M17N6FKye = 1041 - INTEGER(IntKi), PARAMETER :: M17N7FKye = 1042 - INTEGER(IntKi), PARAMETER :: M17N8FKye = 1043 - INTEGER(IntKi), PARAMETER :: M17N9FKye = 1044 - INTEGER(IntKi), PARAMETER :: M18N1FKye = 1045 - INTEGER(IntKi), PARAMETER :: M18N2FKye = 1046 - INTEGER(IntKi), PARAMETER :: M18N3FKye = 1047 - INTEGER(IntKi), PARAMETER :: M18N4FKye = 1048 - INTEGER(IntKi), PARAMETER :: M18N5FKye = 1049 - INTEGER(IntKi), PARAMETER :: M18N6FKye = 1050 - INTEGER(IntKi), PARAMETER :: M18N7FKye = 1051 - INTEGER(IntKi), PARAMETER :: M18N8FKye = 1052 - INTEGER(IntKi), PARAMETER :: M18N9FKye = 1053 - INTEGER(IntKi), PARAMETER :: M19N1FKye = 1054 - INTEGER(IntKi), PARAMETER :: M19N2FKye = 1055 - INTEGER(IntKi), PARAMETER :: M19N3FKye = 1056 - INTEGER(IntKi), PARAMETER :: M19N4FKye = 1057 - INTEGER(IntKi), PARAMETER :: M19N5FKye = 1058 - INTEGER(IntKi), PARAMETER :: M19N6FKye = 1059 - INTEGER(IntKi), PARAMETER :: M19N7FKye = 1060 - INTEGER(IntKi), PARAMETER :: M19N8FKye = 1061 - INTEGER(IntKi), PARAMETER :: M19N9FKye = 1062 - INTEGER(IntKi), PARAMETER :: M20N1FKye = 1063 - INTEGER(IntKi), PARAMETER :: M20N2FKye = 1064 - INTEGER(IntKi), PARAMETER :: M20N3FKye = 1065 - INTEGER(IntKi), PARAMETER :: M20N4FKye = 1066 - INTEGER(IntKi), PARAMETER :: M20N5FKye = 1067 - INTEGER(IntKi), PARAMETER :: M20N6FKye = 1068 - INTEGER(IntKi), PARAMETER :: M20N7FKye = 1069 - INTEGER(IntKi), PARAMETER :: M20N8FKye = 1070 - INTEGER(IntKi), PARAMETER :: M20N9FKye = 1071 - INTEGER(IntKi), PARAMETER :: M21N1FKye = 1072 - INTEGER(IntKi), PARAMETER :: M21N2FKye = 1073 - INTEGER(IntKi), PARAMETER :: M21N3FKye = 1074 - INTEGER(IntKi), PARAMETER :: M21N4FKye = 1075 - INTEGER(IntKi), PARAMETER :: M21N5FKye = 1076 - INTEGER(IntKi), PARAMETER :: M21N6FKye = 1077 - INTEGER(IntKi), PARAMETER :: M21N7FKye = 1078 - INTEGER(IntKi), PARAMETER :: M21N8FKye = 1079 - INTEGER(IntKi), PARAMETER :: M21N9FKye = 1080 - INTEGER(IntKi), PARAMETER :: M22N1FKye = 1081 - INTEGER(IntKi), PARAMETER :: M22N2FKye = 1082 - INTEGER(IntKi), PARAMETER :: M22N3FKye = 1083 - INTEGER(IntKi), PARAMETER :: M22N4FKye = 1084 - INTEGER(IntKi), PARAMETER :: M22N5FKye = 1085 - INTEGER(IntKi), PARAMETER :: M22N6FKye = 1086 - INTEGER(IntKi), PARAMETER :: M22N7FKye = 1087 - INTEGER(IntKi), PARAMETER :: M22N8FKye = 1088 - INTEGER(IntKi), PARAMETER :: M22N9FKye = 1089 - INTEGER(IntKi), PARAMETER :: M23N1FKye = 1090 - INTEGER(IntKi), PARAMETER :: M23N2FKye = 1091 - INTEGER(IntKi), PARAMETER :: M23N3FKye = 1092 - INTEGER(IntKi), PARAMETER :: M23N4FKye = 1093 - INTEGER(IntKi), PARAMETER :: M23N5FKye = 1094 - INTEGER(IntKi), PARAMETER :: M23N6FKye = 1095 - INTEGER(IntKi), PARAMETER :: M23N7FKye = 1096 - INTEGER(IntKi), PARAMETER :: M23N8FKye = 1097 - INTEGER(IntKi), PARAMETER :: M23N9FKye = 1098 - INTEGER(IntKi), PARAMETER :: M24N1FKye = 1099 - INTEGER(IntKi), PARAMETER :: M24N2FKye = 1100 - INTEGER(IntKi), PARAMETER :: M24N3FKye = 1101 - INTEGER(IntKi), PARAMETER :: M24N4FKye = 1102 - INTEGER(IntKi), PARAMETER :: M24N5FKye = 1103 - INTEGER(IntKi), PARAMETER :: M24N6FKye = 1104 - INTEGER(IntKi), PARAMETER :: M24N7FKye = 1105 - INTEGER(IntKi), PARAMETER :: M24N8FKye = 1106 - INTEGER(IntKi), PARAMETER :: M24N9FKye = 1107 - INTEGER(IntKi), PARAMETER :: M25N1FKye = 1108 - INTEGER(IntKi), PARAMETER :: M25N2FKye = 1109 - INTEGER(IntKi), PARAMETER :: M25N3FKye = 1110 - INTEGER(IntKi), PARAMETER :: M25N4FKye = 1111 - INTEGER(IntKi), PARAMETER :: M25N5FKye = 1112 - INTEGER(IntKi), PARAMETER :: M25N6FKye = 1113 - INTEGER(IntKi), PARAMETER :: M25N7FKye = 1114 - INTEGER(IntKi), PARAMETER :: M25N8FKye = 1115 - INTEGER(IntKi), PARAMETER :: M25N9FKye = 1116 - INTEGER(IntKi), PARAMETER :: M26N1FKye = 1117 - INTEGER(IntKi), PARAMETER :: M26N2FKye = 1118 - INTEGER(IntKi), PARAMETER :: M26N3FKye = 1119 - INTEGER(IntKi), PARAMETER :: M26N4FKye = 1120 - INTEGER(IntKi), PARAMETER :: M26N5FKye = 1121 - INTEGER(IntKi), PARAMETER :: M26N6FKye = 1122 - INTEGER(IntKi), PARAMETER :: M26N7FKye = 1123 - INTEGER(IntKi), PARAMETER :: M26N8FKye = 1124 - INTEGER(IntKi), PARAMETER :: M26N9FKye = 1125 - INTEGER(IntKi), PARAMETER :: M27N1FKye = 1126 - INTEGER(IntKi), PARAMETER :: M27N2FKye = 1127 - INTEGER(IntKi), PARAMETER :: M27N3FKye = 1128 - INTEGER(IntKi), PARAMETER :: M27N4FKye = 1129 - INTEGER(IntKi), PARAMETER :: M27N5FKye = 1130 - INTEGER(IntKi), PARAMETER :: M27N6FKye = 1131 - INTEGER(IntKi), PARAMETER :: M27N7FKye = 1132 - INTEGER(IntKi), PARAMETER :: M27N8FKye = 1133 - INTEGER(IntKi), PARAMETER :: M27N9FKye = 1134 - INTEGER(IntKi), PARAMETER :: M28N1FKye = 1135 - INTEGER(IntKi), PARAMETER :: M28N2FKye = 1136 - INTEGER(IntKi), PARAMETER :: M28N3FKye = 1137 - INTEGER(IntKi), PARAMETER :: M28N4FKye = 1138 - INTEGER(IntKi), PARAMETER :: M28N5FKye = 1139 - INTEGER(IntKi), PARAMETER :: M28N6FKye = 1140 - INTEGER(IntKi), PARAMETER :: M28N7FKye = 1141 - INTEGER(IntKi), PARAMETER :: M28N8FKye = 1142 - INTEGER(IntKi), PARAMETER :: M28N9FKye = 1143 - INTEGER(IntKi), PARAMETER :: M29N1FKye = 1144 - INTEGER(IntKi), PARAMETER :: M29N2FKye = 1145 - INTEGER(IntKi), PARAMETER :: M29N3FKye = 1146 - INTEGER(IntKi), PARAMETER :: M29N4FKye = 1147 - INTEGER(IntKi), PARAMETER :: M29N5FKye = 1148 - INTEGER(IntKi), PARAMETER :: M29N6FKye = 1149 - INTEGER(IntKi), PARAMETER :: M29N7FKye = 1150 - INTEGER(IntKi), PARAMETER :: M29N8FKye = 1151 - INTEGER(IntKi), PARAMETER :: M29N9FKye = 1152 - INTEGER(IntKi), PARAMETER :: M30N1FKye = 1153 - INTEGER(IntKi), PARAMETER :: M30N2FKye = 1154 - INTEGER(IntKi), PARAMETER :: M30N3FKye = 1155 - INTEGER(IntKi), PARAMETER :: M30N4FKye = 1156 - INTEGER(IntKi), PARAMETER :: M30N5FKye = 1157 - INTEGER(IntKi), PARAMETER :: M30N6FKye = 1158 - INTEGER(IntKi), PARAMETER :: M30N7FKye = 1159 - INTEGER(IntKi), PARAMETER :: M30N8FKye = 1160 - INTEGER(IntKi), PARAMETER :: M30N9FKye = 1161 - INTEGER(IntKi), PARAMETER :: M31N1FKye = 1162 - INTEGER(IntKi), PARAMETER :: M31N2FKye = 1163 - INTEGER(IntKi), PARAMETER :: M31N3FKye = 1164 - INTEGER(IntKi), PARAMETER :: M31N4FKye = 1165 - INTEGER(IntKi), PARAMETER :: M31N5FKye = 1166 - INTEGER(IntKi), PARAMETER :: M31N6FKye = 1167 - INTEGER(IntKi), PARAMETER :: M31N7FKye = 1168 - INTEGER(IntKi), PARAMETER :: M31N8FKye = 1169 - INTEGER(IntKi), PARAMETER :: M31N9FKye = 1170 - INTEGER(IntKi), PARAMETER :: M32N1FKye = 1171 - INTEGER(IntKi), PARAMETER :: M32N2FKye = 1172 - INTEGER(IntKi), PARAMETER :: M32N3FKye = 1173 - INTEGER(IntKi), PARAMETER :: M32N4FKye = 1174 - INTEGER(IntKi), PARAMETER :: M32N5FKye = 1175 - INTEGER(IntKi), PARAMETER :: M32N6FKye = 1176 - INTEGER(IntKi), PARAMETER :: M32N7FKye = 1177 - INTEGER(IntKi), PARAMETER :: M32N8FKye = 1178 - INTEGER(IntKi), PARAMETER :: M32N9FKye = 1179 - INTEGER(IntKi), PARAMETER :: M33N1FKye = 1180 - INTEGER(IntKi), PARAMETER :: M33N2FKye = 1181 - INTEGER(IntKi), PARAMETER :: M33N3FKye = 1182 - INTEGER(IntKi), PARAMETER :: M33N4FKye = 1183 - INTEGER(IntKi), PARAMETER :: M33N5FKye = 1184 - INTEGER(IntKi), PARAMETER :: M33N6FKye = 1185 - INTEGER(IntKi), PARAMETER :: M33N7FKye = 1186 - INTEGER(IntKi), PARAMETER :: M33N8FKye = 1187 - INTEGER(IntKi), PARAMETER :: M33N9FKye = 1188 - INTEGER(IntKi), PARAMETER :: M34N1FKye = 1189 - INTEGER(IntKi), PARAMETER :: M34N2FKye = 1190 - INTEGER(IntKi), PARAMETER :: M34N3FKye = 1191 - INTEGER(IntKi), PARAMETER :: M34N4FKye = 1192 - INTEGER(IntKi), PARAMETER :: M34N5FKye = 1193 - INTEGER(IntKi), PARAMETER :: M34N6FKye = 1194 - INTEGER(IntKi), PARAMETER :: M34N7FKye = 1195 - INTEGER(IntKi), PARAMETER :: M34N8FKye = 1196 - INTEGER(IntKi), PARAMETER :: M34N9FKye = 1197 - INTEGER(IntKi), PARAMETER :: M35N1FKye = 1198 - INTEGER(IntKi), PARAMETER :: M35N2FKye = 1199 - INTEGER(IntKi), PARAMETER :: M35N3FKye = 1200 - INTEGER(IntKi), PARAMETER :: M35N4FKye = 1201 - INTEGER(IntKi), PARAMETER :: M35N5FKye = 1202 - INTEGER(IntKi), PARAMETER :: M35N6FKye = 1203 - INTEGER(IntKi), PARAMETER :: M35N7FKye = 1204 - INTEGER(IntKi), PARAMETER :: M35N8FKye = 1205 - INTEGER(IntKi), PARAMETER :: M35N9FKye = 1206 - INTEGER(IntKi), PARAMETER :: M36N1FKye = 1207 - INTEGER(IntKi), PARAMETER :: M36N2FKye = 1208 - INTEGER(IntKi), PARAMETER :: M36N3FKye = 1209 - INTEGER(IntKi), PARAMETER :: M36N4FKye = 1210 - INTEGER(IntKi), PARAMETER :: M36N5FKye = 1211 - INTEGER(IntKi), PARAMETER :: M36N6FKye = 1212 - INTEGER(IntKi), PARAMETER :: M36N7FKye = 1213 - INTEGER(IntKi), PARAMETER :: M36N8FKye = 1214 - INTEGER(IntKi), PARAMETER :: M36N9FKye = 1215 - INTEGER(IntKi), PARAMETER :: M37N1FKye = 1216 - INTEGER(IntKi), PARAMETER :: M37N2FKye = 1217 - INTEGER(IntKi), PARAMETER :: M37N3FKye = 1218 - INTEGER(IntKi), PARAMETER :: M37N4FKye = 1219 - INTEGER(IntKi), PARAMETER :: M37N5FKye = 1220 - INTEGER(IntKi), PARAMETER :: M37N6FKye = 1221 - INTEGER(IntKi), PARAMETER :: M37N7FKye = 1222 - INTEGER(IntKi), PARAMETER :: M37N8FKye = 1223 - INTEGER(IntKi), PARAMETER :: M37N9FKye = 1224 - INTEGER(IntKi), PARAMETER :: M38N1FKye = 1225 - INTEGER(IntKi), PARAMETER :: M38N2FKye = 1226 - INTEGER(IntKi), PARAMETER :: M38N3FKye = 1227 - INTEGER(IntKi), PARAMETER :: M38N4FKye = 1228 - INTEGER(IntKi), PARAMETER :: M38N5FKye = 1229 - INTEGER(IntKi), PARAMETER :: M38N6FKye = 1230 - INTEGER(IntKi), PARAMETER :: M38N7FKye = 1231 - INTEGER(IntKi), PARAMETER :: M38N8FKye = 1232 - INTEGER(IntKi), PARAMETER :: M38N9FKye = 1233 - INTEGER(IntKi), PARAMETER :: M39N1FKye = 1234 - INTEGER(IntKi), PARAMETER :: M39N2FKye = 1235 - INTEGER(IntKi), PARAMETER :: M39N3FKye = 1236 - INTEGER(IntKi), PARAMETER :: M39N4FKye = 1237 - INTEGER(IntKi), PARAMETER :: M39N5FKye = 1238 - INTEGER(IntKi), PARAMETER :: M39N6FKye = 1239 - INTEGER(IntKi), PARAMETER :: M39N7FKye = 1240 - INTEGER(IntKi), PARAMETER :: M39N8FKye = 1241 - INTEGER(IntKi), PARAMETER :: M39N9FKye = 1242 - INTEGER(IntKi), PARAMETER :: M40N1FKye = 1243 - INTEGER(IntKi), PARAMETER :: M40N2FKye = 1244 - INTEGER(IntKi), PARAMETER :: M40N3FKye = 1245 - INTEGER(IntKi), PARAMETER :: M40N4FKye = 1246 - INTEGER(IntKi), PARAMETER :: M40N5FKye = 1247 - INTEGER(IntKi), PARAMETER :: M40N6FKye = 1248 - INTEGER(IntKi), PARAMETER :: M40N7FKye = 1249 - INTEGER(IntKi), PARAMETER :: M40N8FKye = 1250 - INTEGER(IntKi), PARAMETER :: M40N9FKye = 1251 - INTEGER(IntKi), PARAMETER :: M41N1FKye = 1252 - INTEGER(IntKi), PARAMETER :: M41N2FKye = 1253 - INTEGER(IntKi), PARAMETER :: M41N3FKye = 1254 - INTEGER(IntKi), PARAMETER :: M41N4FKye = 1255 - INTEGER(IntKi), PARAMETER :: M41N5FKye = 1256 - INTEGER(IntKi), PARAMETER :: M41N6FKye = 1257 - INTEGER(IntKi), PARAMETER :: M41N7FKye = 1258 - INTEGER(IntKi), PARAMETER :: M41N8FKye = 1259 - INTEGER(IntKi), PARAMETER :: M41N9FKye = 1260 - INTEGER(IntKi), PARAMETER :: M42N1FKye = 1261 - INTEGER(IntKi), PARAMETER :: M42N2FKye = 1262 - INTEGER(IntKi), PARAMETER :: M42N3FKye = 1263 - INTEGER(IntKi), PARAMETER :: M42N4FKye = 1264 - INTEGER(IntKi), PARAMETER :: M42N5FKye = 1265 - INTEGER(IntKi), PARAMETER :: M42N6FKye = 1266 - INTEGER(IntKi), PARAMETER :: M42N7FKye = 1267 - INTEGER(IntKi), PARAMETER :: M42N8FKye = 1268 - INTEGER(IntKi), PARAMETER :: M42N9FKye = 1269 - INTEGER(IntKi), PARAMETER :: M43N1FKye = 1270 - INTEGER(IntKi), PARAMETER :: M43N2FKye = 1271 - INTEGER(IntKi), PARAMETER :: M43N3FKye = 1272 - INTEGER(IntKi), PARAMETER :: M43N4FKye = 1273 - INTEGER(IntKi), PARAMETER :: M43N5FKye = 1274 - INTEGER(IntKi), PARAMETER :: M43N6FKye = 1275 - INTEGER(IntKi), PARAMETER :: M43N7FKye = 1276 - INTEGER(IntKi), PARAMETER :: M43N8FKye = 1277 - INTEGER(IntKi), PARAMETER :: M43N9FKye = 1278 - INTEGER(IntKi), PARAMETER :: M44N1FKye = 1279 - INTEGER(IntKi), PARAMETER :: M44N2FKye = 1280 - INTEGER(IntKi), PARAMETER :: M44N3FKye = 1281 - INTEGER(IntKi), PARAMETER :: M44N4FKye = 1282 - INTEGER(IntKi), PARAMETER :: M44N5FKye = 1283 - INTEGER(IntKi), PARAMETER :: M44N6FKye = 1284 - INTEGER(IntKi), PARAMETER :: M44N7FKye = 1285 - INTEGER(IntKi), PARAMETER :: M44N8FKye = 1286 - INTEGER(IntKi), PARAMETER :: M44N9FKye = 1287 - INTEGER(IntKi), PARAMETER :: M45N1FKye = 1288 - INTEGER(IntKi), PARAMETER :: M45N2FKye = 1289 - INTEGER(IntKi), PARAMETER :: M45N3FKye = 1290 - INTEGER(IntKi), PARAMETER :: M45N4FKye = 1291 - INTEGER(IntKi), PARAMETER :: M45N5FKye = 1292 - INTEGER(IntKi), PARAMETER :: M45N6FKye = 1293 - INTEGER(IntKi), PARAMETER :: M45N7FKye = 1294 - INTEGER(IntKi), PARAMETER :: M45N8FKye = 1295 - INTEGER(IntKi), PARAMETER :: M45N9FKye = 1296 - INTEGER(IntKi), PARAMETER :: M46N1FKye = 1297 - INTEGER(IntKi), PARAMETER :: M46N2FKye = 1298 - INTEGER(IntKi), PARAMETER :: M46N3FKye = 1299 - INTEGER(IntKi), PARAMETER :: M46N4FKye = 1300 - INTEGER(IntKi), PARAMETER :: M46N5FKye = 1301 - INTEGER(IntKi), PARAMETER :: M46N6FKye = 1302 - INTEGER(IntKi), PARAMETER :: M46N7FKye = 1303 - INTEGER(IntKi), PARAMETER :: M46N8FKye = 1304 - INTEGER(IntKi), PARAMETER :: M46N9FKye = 1305 - INTEGER(IntKi), PARAMETER :: M47N1FKye = 1306 - INTEGER(IntKi), PARAMETER :: M47N2FKye = 1307 - INTEGER(IntKi), PARAMETER :: M47N3FKye = 1308 - INTEGER(IntKi), PARAMETER :: M47N4FKye = 1309 - INTEGER(IntKi), PARAMETER :: M47N5FKye = 1310 - INTEGER(IntKi), PARAMETER :: M47N6FKye = 1311 - INTEGER(IntKi), PARAMETER :: M47N7FKye = 1312 - INTEGER(IntKi), PARAMETER :: M47N8FKye = 1313 - INTEGER(IntKi), PARAMETER :: M47N9FKye = 1314 - INTEGER(IntKi), PARAMETER :: M48N1FKye = 1315 - INTEGER(IntKi), PARAMETER :: M48N2FKye = 1316 - INTEGER(IntKi), PARAMETER :: M48N3FKye = 1317 - INTEGER(IntKi), PARAMETER :: M48N4FKye = 1318 - INTEGER(IntKi), PARAMETER :: M48N5FKye = 1319 - INTEGER(IntKi), PARAMETER :: M48N6FKye = 1320 - INTEGER(IntKi), PARAMETER :: M48N7FKye = 1321 - INTEGER(IntKi), PARAMETER :: M48N8FKye = 1322 - INTEGER(IntKi), PARAMETER :: M48N9FKye = 1323 - INTEGER(IntKi), PARAMETER :: M49N1FKye = 1324 - INTEGER(IntKi), PARAMETER :: M49N2FKye = 1325 - INTEGER(IntKi), PARAMETER :: M49N3FKye = 1326 - INTEGER(IntKi), PARAMETER :: M49N4FKye = 1327 - INTEGER(IntKi), PARAMETER :: M49N5FKye = 1328 - INTEGER(IntKi), PARAMETER :: M49N6FKye = 1329 - INTEGER(IntKi), PARAMETER :: M49N7FKye = 1330 - INTEGER(IntKi), PARAMETER :: M49N8FKye = 1331 - INTEGER(IntKi), PARAMETER :: M49N9FKye = 1332 - INTEGER(IntKi), PARAMETER :: M50N1FKye = 1333 - INTEGER(IntKi), PARAMETER :: M50N2FKye = 1334 - INTEGER(IntKi), PARAMETER :: M50N3FKye = 1335 - INTEGER(IntKi), PARAMETER :: M50N4FKye = 1336 - INTEGER(IntKi), PARAMETER :: M50N5FKye = 1337 - INTEGER(IntKi), PARAMETER :: M50N6FKye = 1338 - INTEGER(IntKi), PARAMETER :: M50N7FKye = 1339 - INTEGER(IntKi), PARAMETER :: M50N8FKye = 1340 - INTEGER(IntKi), PARAMETER :: M50N9FKye = 1341 - INTEGER(IntKi), PARAMETER :: M51N1FKye = 1342 - INTEGER(IntKi), PARAMETER :: M51N2FKye = 1343 - INTEGER(IntKi), PARAMETER :: M51N3FKye = 1344 - INTEGER(IntKi), PARAMETER :: M51N4FKye = 1345 - INTEGER(IntKi), PARAMETER :: M51N5FKye = 1346 - INTEGER(IntKi), PARAMETER :: M51N6FKye = 1347 - INTEGER(IntKi), PARAMETER :: M51N7FKye = 1348 - INTEGER(IntKi), PARAMETER :: M51N8FKye = 1349 - INTEGER(IntKi), PARAMETER :: M51N9FKye = 1350 - INTEGER(IntKi), PARAMETER :: M52N1FKye = 1351 - INTEGER(IntKi), PARAMETER :: M52N2FKye = 1352 - INTEGER(IntKi), PARAMETER :: M52N3FKye = 1353 - INTEGER(IntKi), PARAMETER :: M52N4FKye = 1354 - INTEGER(IntKi), PARAMETER :: M52N5FKye = 1355 - INTEGER(IntKi), PARAMETER :: M52N6FKye = 1356 - INTEGER(IntKi), PARAMETER :: M52N7FKye = 1357 - INTEGER(IntKi), PARAMETER :: M52N8FKye = 1358 - INTEGER(IntKi), PARAMETER :: M52N9FKye = 1359 - INTEGER(IntKi), PARAMETER :: M53N1FKye = 1360 - INTEGER(IntKi), PARAMETER :: M53N2FKye = 1361 - INTEGER(IntKi), PARAMETER :: M53N3FKye = 1362 - INTEGER(IntKi), PARAMETER :: M53N4FKye = 1363 - INTEGER(IntKi), PARAMETER :: M53N5FKye = 1364 - INTEGER(IntKi), PARAMETER :: M53N6FKye = 1365 - INTEGER(IntKi), PARAMETER :: M53N7FKye = 1366 - INTEGER(IntKi), PARAMETER :: M53N8FKye = 1367 - INTEGER(IntKi), PARAMETER :: M53N9FKye = 1368 - INTEGER(IntKi), PARAMETER :: M54N1FKye = 1369 - INTEGER(IntKi), PARAMETER :: M54N2FKye = 1370 - INTEGER(IntKi), PARAMETER :: M54N3FKye = 1371 - INTEGER(IntKi), PARAMETER :: M54N4FKye = 1372 - INTEGER(IntKi), PARAMETER :: M54N5FKye = 1373 - INTEGER(IntKi), PARAMETER :: M54N6FKye = 1374 - INTEGER(IntKi), PARAMETER :: M54N7FKye = 1375 - INTEGER(IntKi), PARAMETER :: M54N8FKye = 1376 - INTEGER(IntKi), PARAMETER :: M54N9FKye = 1377 - INTEGER(IntKi), PARAMETER :: M55N1FKye = 1378 - INTEGER(IntKi), PARAMETER :: M55N2FKye = 1379 - INTEGER(IntKi), PARAMETER :: M55N3FKye = 1380 - INTEGER(IntKi), PARAMETER :: M55N4FKye = 1381 - INTEGER(IntKi), PARAMETER :: M55N5FKye = 1382 - INTEGER(IntKi), PARAMETER :: M55N6FKye = 1383 - INTEGER(IntKi), PARAMETER :: M55N7FKye = 1384 - INTEGER(IntKi), PARAMETER :: M55N8FKye = 1385 - INTEGER(IntKi), PARAMETER :: M55N9FKye = 1386 - INTEGER(IntKi), PARAMETER :: M56N1FKye = 1387 - INTEGER(IntKi), PARAMETER :: M56N2FKye = 1388 - INTEGER(IntKi), PARAMETER :: M56N3FKye = 1389 - INTEGER(IntKi), PARAMETER :: M56N4FKye = 1390 - INTEGER(IntKi), PARAMETER :: M56N5FKye = 1391 - INTEGER(IntKi), PARAMETER :: M56N6FKye = 1392 - INTEGER(IntKi), PARAMETER :: M56N7FKye = 1393 - INTEGER(IntKi), PARAMETER :: M56N8FKye = 1394 - INTEGER(IntKi), PARAMETER :: M56N9FKye = 1395 - INTEGER(IntKi), PARAMETER :: M57N1FKye = 1396 - INTEGER(IntKi), PARAMETER :: M57N2FKye = 1397 - INTEGER(IntKi), PARAMETER :: M57N3FKye = 1398 - INTEGER(IntKi), PARAMETER :: M57N4FKye = 1399 - INTEGER(IntKi), PARAMETER :: M57N5FKye = 1400 - INTEGER(IntKi), PARAMETER :: M57N6FKye = 1401 - INTEGER(IntKi), PARAMETER :: M57N7FKye = 1402 - INTEGER(IntKi), PARAMETER :: M57N8FKye = 1403 - INTEGER(IntKi), PARAMETER :: M57N9FKye = 1404 - INTEGER(IntKi), PARAMETER :: M58N1FKye = 1405 - INTEGER(IntKi), PARAMETER :: M58N2FKye = 1406 - INTEGER(IntKi), PARAMETER :: M58N3FKye = 1407 - INTEGER(IntKi), PARAMETER :: M58N4FKye = 1408 - INTEGER(IntKi), PARAMETER :: M58N5FKye = 1409 - INTEGER(IntKi), PARAMETER :: M58N6FKye = 1410 - INTEGER(IntKi), PARAMETER :: M58N7FKye = 1411 - INTEGER(IntKi), PARAMETER :: M58N8FKye = 1412 - INTEGER(IntKi), PARAMETER :: M58N9FKye = 1413 - INTEGER(IntKi), PARAMETER :: M59N1FKye = 1414 - INTEGER(IntKi), PARAMETER :: M59N2FKye = 1415 - INTEGER(IntKi), PARAMETER :: M59N3FKye = 1416 - INTEGER(IntKi), PARAMETER :: M59N4FKye = 1417 - INTEGER(IntKi), PARAMETER :: M59N5FKye = 1418 - INTEGER(IntKi), PARAMETER :: M59N6FKye = 1419 - INTEGER(IntKi), PARAMETER :: M59N7FKye = 1420 - INTEGER(IntKi), PARAMETER :: M59N8FKye = 1421 - INTEGER(IntKi), PARAMETER :: M59N9FKye = 1422 - INTEGER(IntKi), PARAMETER :: M60N1FKye = 1423 - INTEGER(IntKi), PARAMETER :: M60N2FKye = 1424 - INTEGER(IntKi), PARAMETER :: M60N3FKye = 1425 - INTEGER(IntKi), PARAMETER :: M60N4FKye = 1426 - INTEGER(IntKi), PARAMETER :: M60N5FKye = 1427 - INTEGER(IntKi), PARAMETER :: M60N6FKye = 1428 - INTEGER(IntKi), PARAMETER :: M60N7FKye = 1429 - INTEGER(IntKi), PARAMETER :: M60N8FKye = 1430 - INTEGER(IntKi), PARAMETER :: M60N9FKye = 1431 - INTEGER(IntKi), PARAMETER :: M61N1FKye = 1432 - INTEGER(IntKi), PARAMETER :: M61N2FKye = 1433 - INTEGER(IntKi), PARAMETER :: M61N3FKye = 1434 - INTEGER(IntKi), PARAMETER :: M61N4FKye = 1435 - INTEGER(IntKi), PARAMETER :: M61N5FKye = 1436 - INTEGER(IntKi), PARAMETER :: M61N6FKye = 1437 - INTEGER(IntKi), PARAMETER :: M61N7FKye = 1438 - INTEGER(IntKi), PARAMETER :: M61N8FKye = 1439 - INTEGER(IntKi), PARAMETER :: M61N9FKye = 1440 - INTEGER(IntKi), PARAMETER :: M62N1FKye = 1441 - INTEGER(IntKi), PARAMETER :: M62N2FKye = 1442 - INTEGER(IntKi), PARAMETER :: M62N3FKye = 1443 - INTEGER(IntKi), PARAMETER :: M62N4FKye = 1444 - INTEGER(IntKi), PARAMETER :: M62N5FKye = 1445 - INTEGER(IntKi), PARAMETER :: M62N6FKye = 1446 - INTEGER(IntKi), PARAMETER :: M62N7FKye = 1447 - INTEGER(IntKi), PARAMETER :: M62N8FKye = 1448 - INTEGER(IntKi), PARAMETER :: M62N9FKye = 1449 - INTEGER(IntKi), PARAMETER :: M63N1FKye = 1450 - INTEGER(IntKi), PARAMETER :: M63N2FKye = 1451 - INTEGER(IntKi), PARAMETER :: M63N3FKye = 1452 - INTEGER(IntKi), PARAMETER :: M63N4FKye = 1453 - INTEGER(IntKi), PARAMETER :: M63N5FKye = 1454 - INTEGER(IntKi), PARAMETER :: M63N6FKye = 1455 - INTEGER(IntKi), PARAMETER :: M63N7FKye = 1456 - INTEGER(IntKi), PARAMETER :: M63N8FKye = 1457 - INTEGER(IntKi), PARAMETER :: M63N9FKye = 1458 - INTEGER(IntKi), PARAMETER :: M64N1FKye = 1459 - INTEGER(IntKi), PARAMETER :: M64N2FKye = 1460 - INTEGER(IntKi), PARAMETER :: M64N3FKye = 1461 - INTEGER(IntKi), PARAMETER :: M64N4FKye = 1462 - INTEGER(IntKi), PARAMETER :: M64N5FKye = 1463 - INTEGER(IntKi), PARAMETER :: M64N6FKye = 1464 - INTEGER(IntKi), PARAMETER :: M64N7FKye = 1465 - INTEGER(IntKi), PARAMETER :: M64N8FKye = 1466 - INTEGER(IntKi), PARAMETER :: M64N9FKye = 1467 - INTEGER(IntKi), PARAMETER :: M65N1FKye = 1468 - INTEGER(IntKi), PARAMETER :: M65N2FKye = 1469 - INTEGER(IntKi), PARAMETER :: M65N3FKye = 1470 - INTEGER(IntKi), PARAMETER :: M65N4FKye = 1471 - INTEGER(IntKi), PARAMETER :: M65N5FKye = 1472 - INTEGER(IntKi), PARAMETER :: M65N6FKye = 1473 - INTEGER(IntKi), PARAMETER :: M65N7FKye = 1474 - INTEGER(IntKi), PARAMETER :: M65N8FKye = 1475 - INTEGER(IntKi), PARAMETER :: M65N9FKye = 1476 - INTEGER(IntKi), PARAMETER :: M66N1FKye = 1477 - INTEGER(IntKi), PARAMETER :: M66N2FKye = 1478 - INTEGER(IntKi), PARAMETER :: M66N3FKye = 1479 - INTEGER(IntKi), PARAMETER :: M66N4FKye = 1480 - INTEGER(IntKi), PARAMETER :: M66N5FKye = 1481 - INTEGER(IntKi), PARAMETER :: M66N6FKye = 1482 - INTEGER(IntKi), PARAMETER :: M66N7FKye = 1483 - INTEGER(IntKi), PARAMETER :: M66N8FKye = 1484 - INTEGER(IntKi), PARAMETER :: M66N9FKye = 1485 - INTEGER(IntKi), PARAMETER :: M67N1FKye = 1486 - INTEGER(IntKi), PARAMETER :: M67N2FKye = 1487 - INTEGER(IntKi), PARAMETER :: M67N3FKye = 1488 - INTEGER(IntKi), PARAMETER :: M67N4FKye = 1489 - INTEGER(IntKi), PARAMETER :: M67N5FKye = 1490 - INTEGER(IntKi), PARAMETER :: M67N6FKye = 1491 - INTEGER(IntKi), PARAMETER :: M67N7FKye = 1492 - INTEGER(IntKi), PARAMETER :: M67N8FKye = 1493 - INTEGER(IntKi), PARAMETER :: M67N9FKye = 1494 - INTEGER(IntKi), PARAMETER :: M68N1FKye = 1495 - INTEGER(IntKi), PARAMETER :: M68N2FKye = 1496 - INTEGER(IntKi), PARAMETER :: M68N3FKye = 1497 - INTEGER(IntKi), PARAMETER :: M68N4FKye = 1498 - INTEGER(IntKi), PARAMETER :: M68N5FKye = 1499 - INTEGER(IntKi), PARAMETER :: M68N6FKye = 1500 - INTEGER(IntKi), PARAMETER :: M68N7FKye = 1501 - INTEGER(IntKi), PARAMETER :: M68N8FKye = 1502 - INTEGER(IntKi), PARAMETER :: M68N9FKye = 1503 - INTEGER(IntKi), PARAMETER :: M69N1FKye = 1504 - INTEGER(IntKi), PARAMETER :: M69N2FKye = 1505 - INTEGER(IntKi), PARAMETER :: M69N3FKye = 1506 - INTEGER(IntKi), PARAMETER :: M69N4FKye = 1507 - INTEGER(IntKi), PARAMETER :: M69N5FKye = 1508 - INTEGER(IntKi), PARAMETER :: M69N6FKye = 1509 - INTEGER(IntKi), PARAMETER :: M69N7FKye = 1510 - INTEGER(IntKi), PARAMETER :: M69N8FKye = 1511 - INTEGER(IntKi), PARAMETER :: M69N9FKye = 1512 - INTEGER(IntKi), PARAMETER :: M70N1FKye = 1513 - INTEGER(IntKi), PARAMETER :: M70N2FKye = 1514 - INTEGER(IntKi), PARAMETER :: M70N3FKye = 1515 - INTEGER(IntKi), PARAMETER :: M70N4FKye = 1516 - INTEGER(IntKi), PARAMETER :: M70N5FKye = 1517 - INTEGER(IntKi), PARAMETER :: M70N6FKye = 1518 - INTEGER(IntKi), PARAMETER :: M70N7FKye = 1519 - INTEGER(IntKi), PARAMETER :: M70N8FKye = 1520 - INTEGER(IntKi), PARAMETER :: M70N9FKye = 1521 - INTEGER(IntKi), PARAMETER :: M71N1FKye = 1522 - INTEGER(IntKi), PARAMETER :: M71N2FKye = 1523 - INTEGER(IntKi), PARAMETER :: M71N3FKye = 1524 - INTEGER(IntKi), PARAMETER :: M71N4FKye = 1525 - INTEGER(IntKi), PARAMETER :: M71N5FKye = 1526 - INTEGER(IntKi), PARAMETER :: M71N6FKye = 1527 - INTEGER(IntKi), PARAMETER :: M71N7FKye = 1528 - INTEGER(IntKi), PARAMETER :: M71N8FKye = 1529 - INTEGER(IntKi), PARAMETER :: M71N9FKye = 1530 - INTEGER(IntKi), PARAMETER :: M72N1FKye = 1531 - INTEGER(IntKi), PARAMETER :: M72N2FKye = 1532 - INTEGER(IntKi), PARAMETER :: M72N3FKye = 1533 - INTEGER(IntKi), PARAMETER :: M72N4FKye = 1534 - INTEGER(IntKi), PARAMETER :: M72N5FKye = 1535 - INTEGER(IntKi), PARAMETER :: M72N6FKye = 1536 - INTEGER(IntKi), PARAMETER :: M72N7FKye = 1537 - INTEGER(IntKi), PARAMETER :: M72N8FKye = 1538 - INTEGER(IntKi), PARAMETER :: M72N9FKye = 1539 - INTEGER(IntKi), PARAMETER :: M73N1FKye = 1540 - INTEGER(IntKi), PARAMETER :: M73N2FKye = 1541 - INTEGER(IntKi), PARAMETER :: M73N3FKye = 1542 - INTEGER(IntKi), PARAMETER :: M73N4FKye = 1543 - INTEGER(IntKi), PARAMETER :: M73N5FKye = 1544 - INTEGER(IntKi), PARAMETER :: M73N6FKye = 1545 - INTEGER(IntKi), PARAMETER :: M73N7FKye = 1546 - INTEGER(IntKi), PARAMETER :: M73N8FKye = 1547 - INTEGER(IntKi), PARAMETER :: M73N9FKye = 1548 - INTEGER(IntKi), PARAMETER :: M74N1FKye = 1549 - INTEGER(IntKi), PARAMETER :: M74N2FKye = 1550 - INTEGER(IntKi), PARAMETER :: M74N3FKye = 1551 - INTEGER(IntKi), PARAMETER :: M74N4FKye = 1552 - INTEGER(IntKi), PARAMETER :: M74N5FKye = 1553 - INTEGER(IntKi), PARAMETER :: M74N6FKye = 1554 - INTEGER(IntKi), PARAMETER :: M74N7FKye = 1555 - INTEGER(IntKi), PARAMETER :: M74N8FKye = 1556 - INTEGER(IntKi), PARAMETER :: M74N9FKye = 1557 - INTEGER(IntKi), PARAMETER :: M75N1FKye = 1558 - INTEGER(IntKi), PARAMETER :: M75N2FKye = 1559 - INTEGER(IntKi), PARAMETER :: M75N3FKye = 1560 - INTEGER(IntKi), PARAMETER :: M75N4FKye = 1561 - INTEGER(IntKi), PARAMETER :: M75N5FKye = 1562 - INTEGER(IntKi), PARAMETER :: M75N6FKye = 1563 - INTEGER(IntKi), PARAMETER :: M75N7FKye = 1564 - INTEGER(IntKi), PARAMETER :: M75N8FKye = 1565 - INTEGER(IntKi), PARAMETER :: M75N9FKye = 1566 - INTEGER(IntKi), PARAMETER :: M76N1FKye = 1567 - INTEGER(IntKi), PARAMETER :: M76N2FKye = 1568 - INTEGER(IntKi), PARAMETER :: M76N3FKye = 1569 - INTEGER(IntKi), PARAMETER :: M76N4FKye = 1570 - INTEGER(IntKi), PARAMETER :: M76N5FKye = 1571 - INTEGER(IntKi), PARAMETER :: M76N6FKye = 1572 - INTEGER(IntKi), PARAMETER :: M76N7FKye = 1573 - INTEGER(IntKi), PARAMETER :: M76N8FKye = 1574 - INTEGER(IntKi), PARAMETER :: M76N9FKye = 1575 - INTEGER(IntKi), PARAMETER :: M77N1FKye = 1576 - INTEGER(IntKi), PARAMETER :: M77N2FKye = 1577 - INTEGER(IntKi), PARAMETER :: M77N3FKye = 1578 - INTEGER(IntKi), PARAMETER :: M77N4FKye = 1579 - INTEGER(IntKi), PARAMETER :: M77N5FKye = 1580 - INTEGER(IntKi), PARAMETER :: M77N6FKye = 1581 - INTEGER(IntKi), PARAMETER :: M77N7FKye = 1582 - INTEGER(IntKi), PARAMETER :: M77N8FKye = 1583 - INTEGER(IntKi), PARAMETER :: M77N9FKye = 1584 - INTEGER(IntKi), PARAMETER :: M78N1FKye = 1585 - INTEGER(IntKi), PARAMETER :: M78N2FKye = 1586 - INTEGER(IntKi), PARAMETER :: M78N3FKye = 1587 - INTEGER(IntKi), PARAMETER :: M78N4FKye = 1588 - INTEGER(IntKi), PARAMETER :: M78N5FKye = 1589 - INTEGER(IntKi), PARAMETER :: M78N6FKye = 1590 - INTEGER(IntKi), PARAMETER :: M78N7FKye = 1591 - INTEGER(IntKi), PARAMETER :: M78N8FKye = 1592 - INTEGER(IntKi), PARAMETER :: M78N9FKye = 1593 - INTEGER(IntKi), PARAMETER :: M79N1FKye = 1594 - INTEGER(IntKi), PARAMETER :: M79N2FKye = 1595 - INTEGER(IntKi), PARAMETER :: M79N3FKye = 1596 - INTEGER(IntKi), PARAMETER :: M79N4FKye = 1597 - INTEGER(IntKi), PARAMETER :: M79N5FKye = 1598 - INTEGER(IntKi), PARAMETER :: M79N6FKye = 1599 - INTEGER(IntKi), PARAMETER :: M79N7FKye = 1600 - INTEGER(IntKi), PARAMETER :: M79N8FKye = 1601 - INTEGER(IntKi), PARAMETER :: M79N9FKye = 1602 - INTEGER(IntKi), PARAMETER :: M80N1FKye = 1603 - INTEGER(IntKi), PARAMETER :: M80N2FKye = 1604 - INTEGER(IntKi), PARAMETER :: M80N3FKye = 1605 - INTEGER(IntKi), PARAMETER :: M80N4FKye = 1606 - INTEGER(IntKi), PARAMETER :: M80N5FKye = 1607 - INTEGER(IntKi), PARAMETER :: M80N6FKye = 1608 - INTEGER(IntKi), PARAMETER :: M80N7FKye = 1609 - INTEGER(IntKi), PARAMETER :: M80N8FKye = 1610 - INTEGER(IntKi), PARAMETER :: M80N9FKye = 1611 - INTEGER(IntKi), PARAMETER :: M81N1FKye = 1612 - INTEGER(IntKi), PARAMETER :: M81N2FKye = 1613 - INTEGER(IntKi), PARAMETER :: M81N3FKye = 1614 - INTEGER(IntKi), PARAMETER :: M81N4FKye = 1615 - INTEGER(IntKi), PARAMETER :: M81N5FKye = 1616 - INTEGER(IntKi), PARAMETER :: M81N6FKye = 1617 - INTEGER(IntKi), PARAMETER :: M81N7FKye = 1618 - INTEGER(IntKi), PARAMETER :: M81N8FKye = 1619 - INTEGER(IntKi), PARAMETER :: M81N9FKye = 1620 - INTEGER(IntKi), PARAMETER :: M82N1FKye = 1621 - INTEGER(IntKi), PARAMETER :: M82N2FKye = 1622 - INTEGER(IntKi), PARAMETER :: M82N3FKye = 1623 - INTEGER(IntKi), PARAMETER :: M82N4FKye = 1624 - INTEGER(IntKi), PARAMETER :: M82N5FKye = 1625 - INTEGER(IntKi), PARAMETER :: M82N6FKye = 1626 - INTEGER(IntKi), PARAMETER :: M82N7FKye = 1627 - INTEGER(IntKi), PARAMETER :: M82N8FKye = 1628 - INTEGER(IntKi), PARAMETER :: M82N9FKye = 1629 - INTEGER(IntKi), PARAMETER :: M83N1FKye = 1630 - INTEGER(IntKi), PARAMETER :: M83N2FKye = 1631 - INTEGER(IntKi), PARAMETER :: M83N3FKye = 1632 - INTEGER(IntKi), PARAMETER :: M83N4FKye = 1633 - INTEGER(IntKi), PARAMETER :: M83N5FKye = 1634 - INTEGER(IntKi), PARAMETER :: M83N6FKye = 1635 - INTEGER(IntKi), PARAMETER :: M83N7FKye = 1636 - INTEGER(IntKi), PARAMETER :: M83N8FKye = 1637 - INTEGER(IntKi), PARAMETER :: M83N9FKye = 1638 - INTEGER(IntKi), PARAMETER :: M84N1FKye = 1639 - INTEGER(IntKi), PARAMETER :: M84N2FKye = 1640 - INTEGER(IntKi), PARAMETER :: M84N3FKye = 1641 - INTEGER(IntKi), PARAMETER :: M84N4FKye = 1642 - INTEGER(IntKi), PARAMETER :: M84N5FKye = 1643 - INTEGER(IntKi), PARAMETER :: M84N6FKye = 1644 - INTEGER(IntKi), PARAMETER :: M84N7FKye = 1645 - INTEGER(IntKi), PARAMETER :: M84N8FKye = 1646 - INTEGER(IntKi), PARAMETER :: M84N9FKye = 1647 - INTEGER(IntKi), PARAMETER :: M85N1FKye = 1648 - INTEGER(IntKi), PARAMETER :: M85N2FKye = 1649 - INTEGER(IntKi), PARAMETER :: M85N3FKye = 1650 - INTEGER(IntKi), PARAMETER :: M85N4FKye = 1651 - INTEGER(IntKi), PARAMETER :: M85N5FKye = 1652 - INTEGER(IntKi), PARAMETER :: M85N6FKye = 1653 - INTEGER(IntKi), PARAMETER :: M85N7FKye = 1654 - INTEGER(IntKi), PARAMETER :: M85N8FKye = 1655 - INTEGER(IntKi), PARAMETER :: M85N9FKye = 1656 - INTEGER(IntKi), PARAMETER :: M86N1FKye = 1657 - INTEGER(IntKi), PARAMETER :: M86N2FKye = 1658 - INTEGER(IntKi), PARAMETER :: M86N3FKye = 1659 - INTEGER(IntKi), PARAMETER :: M86N4FKye = 1660 - INTEGER(IntKi), PARAMETER :: M86N5FKye = 1661 - INTEGER(IntKi), PARAMETER :: M86N6FKye = 1662 - INTEGER(IntKi), PARAMETER :: M86N7FKye = 1663 - INTEGER(IntKi), PARAMETER :: M86N8FKye = 1664 - INTEGER(IntKi), PARAMETER :: M86N9FKye = 1665 - INTEGER(IntKi), PARAMETER :: M87N1FKye = 1666 - INTEGER(IntKi), PARAMETER :: M87N2FKye = 1667 - INTEGER(IntKi), PARAMETER :: M87N3FKye = 1668 - INTEGER(IntKi), PARAMETER :: M87N4FKye = 1669 - INTEGER(IntKi), PARAMETER :: M87N5FKye = 1670 - INTEGER(IntKi), PARAMETER :: M87N6FKye = 1671 - INTEGER(IntKi), PARAMETER :: M87N7FKye = 1672 - INTEGER(IntKi), PARAMETER :: M87N8FKye = 1673 - INTEGER(IntKi), PARAMETER :: M87N9FKye = 1674 - INTEGER(IntKi), PARAMETER :: M88N1FKye = 1675 - INTEGER(IntKi), PARAMETER :: M88N2FKye = 1676 - INTEGER(IntKi), PARAMETER :: M88N3FKye = 1677 - INTEGER(IntKi), PARAMETER :: M88N4FKye = 1678 - INTEGER(IntKi), PARAMETER :: M88N5FKye = 1679 - INTEGER(IntKi), PARAMETER :: M88N6FKye = 1680 - INTEGER(IntKi), PARAMETER :: M88N7FKye = 1681 - INTEGER(IntKi), PARAMETER :: M88N8FKye = 1682 - INTEGER(IntKi), PARAMETER :: M88N9FKye = 1683 - INTEGER(IntKi), PARAMETER :: M89N1FKye = 1684 - INTEGER(IntKi), PARAMETER :: M89N2FKye = 1685 - INTEGER(IntKi), PARAMETER :: M89N3FKye = 1686 - INTEGER(IntKi), PARAMETER :: M89N4FKye = 1687 - INTEGER(IntKi), PARAMETER :: M89N5FKye = 1688 - INTEGER(IntKi), PARAMETER :: M89N6FKye = 1689 - INTEGER(IntKi), PARAMETER :: M89N7FKye = 1690 - INTEGER(IntKi), PARAMETER :: M89N8FKye = 1691 - INTEGER(IntKi), PARAMETER :: M89N9FKye = 1692 - INTEGER(IntKi), PARAMETER :: M90N1FKye = 1693 - INTEGER(IntKi), PARAMETER :: M90N2FKye = 1694 - INTEGER(IntKi), PARAMETER :: M90N3FKye = 1695 - INTEGER(IntKi), PARAMETER :: M90N4FKye = 1696 - INTEGER(IntKi), PARAMETER :: M90N5FKye = 1697 - INTEGER(IntKi), PARAMETER :: M90N6FKye = 1698 - INTEGER(IntKi), PARAMETER :: M90N7FKye = 1699 - INTEGER(IntKi), PARAMETER :: M90N8FKye = 1700 - INTEGER(IntKi), PARAMETER :: M90N9FKye = 1701 - INTEGER(IntKi), PARAMETER :: M91N1FKye = 1702 - INTEGER(IntKi), PARAMETER :: M91N2FKye = 1703 - INTEGER(IntKi), PARAMETER :: M91N3FKye = 1704 - INTEGER(IntKi), PARAMETER :: M91N4FKye = 1705 - INTEGER(IntKi), PARAMETER :: M91N5FKye = 1706 - INTEGER(IntKi), PARAMETER :: M91N6FKye = 1707 - INTEGER(IntKi), PARAMETER :: M91N7FKye = 1708 - INTEGER(IntKi), PARAMETER :: M91N8FKye = 1709 - INTEGER(IntKi), PARAMETER :: M91N9FKye = 1710 - INTEGER(IntKi), PARAMETER :: M92N1FKye = 1711 - INTEGER(IntKi), PARAMETER :: M92N2FKye = 1712 - INTEGER(IntKi), PARAMETER :: M92N3FKye = 1713 - INTEGER(IntKi), PARAMETER :: M92N4FKye = 1714 - INTEGER(IntKi), PARAMETER :: M92N5FKye = 1715 - INTEGER(IntKi), PARAMETER :: M92N6FKye = 1716 - INTEGER(IntKi), PARAMETER :: M92N7FKye = 1717 - INTEGER(IntKi), PARAMETER :: M92N8FKye = 1718 - INTEGER(IntKi), PARAMETER :: M92N9FKye = 1719 - INTEGER(IntKi), PARAMETER :: M93N1FKye = 1720 - INTEGER(IntKi), PARAMETER :: M93N2FKye = 1721 - INTEGER(IntKi), PARAMETER :: M93N3FKye = 1722 - INTEGER(IntKi), PARAMETER :: M93N4FKye = 1723 - INTEGER(IntKi), PARAMETER :: M93N5FKye = 1724 - INTEGER(IntKi), PARAMETER :: M93N6FKye = 1725 - INTEGER(IntKi), PARAMETER :: M93N7FKye = 1726 - INTEGER(IntKi), PARAMETER :: M93N8FKye = 1727 - INTEGER(IntKi), PARAMETER :: M93N9FKye = 1728 - INTEGER(IntKi), PARAMETER :: M94N1FKye = 1729 - INTEGER(IntKi), PARAMETER :: M94N2FKye = 1730 - INTEGER(IntKi), PARAMETER :: M94N3FKye = 1731 - INTEGER(IntKi), PARAMETER :: M94N4FKye = 1732 - INTEGER(IntKi), PARAMETER :: M94N5FKye = 1733 - INTEGER(IntKi), PARAMETER :: M94N6FKye = 1734 - INTEGER(IntKi), PARAMETER :: M94N7FKye = 1735 - INTEGER(IntKi), PARAMETER :: M94N8FKye = 1736 - INTEGER(IntKi), PARAMETER :: M94N9FKye = 1737 - INTEGER(IntKi), PARAMETER :: M95N1FKye = 1738 - INTEGER(IntKi), PARAMETER :: M95N2FKye = 1739 - INTEGER(IntKi), PARAMETER :: M95N3FKye = 1740 - INTEGER(IntKi), PARAMETER :: M95N4FKye = 1741 - INTEGER(IntKi), PARAMETER :: M95N5FKye = 1742 - INTEGER(IntKi), PARAMETER :: M95N6FKye = 1743 - INTEGER(IntKi), PARAMETER :: M95N7FKye = 1744 - INTEGER(IntKi), PARAMETER :: M95N8FKye = 1745 - INTEGER(IntKi), PARAMETER :: M95N9FKye = 1746 - INTEGER(IntKi), PARAMETER :: M96N1FKye = 1747 - INTEGER(IntKi), PARAMETER :: M96N2FKye = 1748 - INTEGER(IntKi), PARAMETER :: M96N3FKye = 1749 - INTEGER(IntKi), PARAMETER :: M96N4FKye = 1750 - INTEGER(IntKi), PARAMETER :: M96N5FKye = 1751 - INTEGER(IntKi), PARAMETER :: M96N6FKye = 1752 - INTEGER(IntKi), PARAMETER :: M96N7FKye = 1753 - INTEGER(IntKi), PARAMETER :: M96N8FKye = 1754 - INTEGER(IntKi), PARAMETER :: M96N9FKye = 1755 - INTEGER(IntKi), PARAMETER :: M97N1FKye = 1756 - INTEGER(IntKi), PARAMETER :: M97N2FKye = 1757 - INTEGER(IntKi), PARAMETER :: M97N3FKye = 1758 - INTEGER(IntKi), PARAMETER :: M97N4FKye = 1759 - INTEGER(IntKi), PARAMETER :: M97N5FKye = 1760 - INTEGER(IntKi), PARAMETER :: M97N6FKye = 1761 - INTEGER(IntKi), PARAMETER :: M97N7FKye = 1762 - INTEGER(IntKi), PARAMETER :: M97N8FKye = 1763 - INTEGER(IntKi), PARAMETER :: M97N9FKye = 1764 - INTEGER(IntKi), PARAMETER :: M98N1FKye = 1765 - INTEGER(IntKi), PARAMETER :: M98N2FKye = 1766 - INTEGER(IntKi), PARAMETER :: M98N3FKye = 1767 - INTEGER(IntKi), PARAMETER :: M98N4FKye = 1768 - INTEGER(IntKi), PARAMETER :: M98N5FKye = 1769 - INTEGER(IntKi), PARAMETER :: M98N6FKye = 1770 - INTEGER(IntKi), PARAMETER :: M98N7FKye = 1771 - INTEGER(IntKi), PARAMETER :: M98N8FKye = 1772 - INTEGER(IntKi), PARAMETER :: M98N9FKye = 1773 - INTEGER(IntKi), PARAMETER :: M99N1FKye = 1774 - INTEGER(IntKi), PARAMETER :: M99N2FKye = 1775 - INTEGER(IntKi), PARAMETER :: M99N3FKye = 1776 - INTEGER(IntKi), PARAMETER :: M99N4FKye = 1777 - INTEGER(IntKi), PARAMETER :: M99N5FKye = 1778 - INTEGER(IntKi), PARAMETER :: M99N6FKye = 1779 - INTEGER(IntKi), PARAMETER :: M99N7FKye = 1780 - INTEGER(IntKi), PARAMETER :: M99N8FKye = 1781 - INTEGER(IntKi), PARAMETER :: M99N9FKye = 1782 - INTEGER(IntKi), PARAMETER :: M01N1FKze = 1783 - INTEGER(IntKi), PARAMETER :: M01N2FKze = 1784 - INTEGER(IntKi), PARAMETER :: M01N3FKze = 1785 - INTEGER(IntKi), PARAMETER :: M01N4FKze = 1786 - INTEGER(IntKi), PARAMETER :: M01N5FKze = 1787 - INTEGER(IntKi), PARAMETER :: M01N6FKze = 1788 - INTEGER(IntKi), PARAMETER :: M01N7FKze = 1789 - INTEGER(IntKi), PARAMETER :: M01N8FKze = 1790 - INTEGER(IntKi), PARAMETER :: M01N9FKze = 1791 - INTEGER(IntKi), PARAMETER :: M02N1FKze = 1792 - INTEGER(IntKi), PARAMETER :: M02N2FKze = 1793 - INTEGER(IntKi), PARAMETER :: M02N3FKze = 1794 - INTEGER(IntKi), PARAMETER :: M02N4FKze = 1795 - INTEGER(IntKi), PARAMETER :: M02N5FKze = 1796 - INTEGER(IntKi), PARAMETER :: M02N6FKze = 1797 - INTEGER(IntKi), PARAMETER :: M02N7FKze = 1798 - INTEGER(IntKi), PARAMETER :: M02N8FKze = 1799 - INTEGER(IntKi), PARAMETER :: M02N9FKze = 1800 - INTEGER(IntKi), PARAMETER :: M03N1FKze = 1801 - INTEGER(IntKi), PARAMETER :: M03N2FKze = 1802 - INTEGER(IntKi), PARAMETER :: M03N3FKze = 1803 - INTEGER(IntKi), PARAMETER :: M03N4FKze = 1804 - INTEGER(IntKi), PARAMETER :: M03N5FKze = 1805 - INTEGER(IntKi), PARAMETER :: M03N6FKze = 1806 - INTEGER(IntKi), PARAMETER :: M03N7FKze = 1807 - INTEGER(IntKi), PARAMETER :: M03N8FKze = 1808 - INTEGER(IntKi), PARAMETER :: M03N9FKze = 1809 - INTEGER(IntKi), PARAMETER :: M04N1FKze = 1810 - INTEGER(IntKi), PARAMETER :: M04N2FKze = 1811 - INTEGER(IntKi), PARAMETER :: M04N3FKze = 1812 - INTEGER(IntKi), PARAMETER :: M04N4FKze = 1813 - INTEGER(IntKi), PARAMETER :: M04N5FKze = 1814 - INTEGER(IntKi), PARAMETER :: M04N6FKze = 1815 - INTEGER(IntKi), PARAMETER :: M04N7FKze = 1816 - INTEGER(IntKi), PARAMETER :: M04N8FKze = 1817 - INTEGER(IntKi), PARAMETER :: M04N9FKze = 1818 - INTEGER(IntKi), PARAMETER :: M05N1FKze = 1819 - INTEGER(IntKi), PARAMETER :: M05N2FKze = 1820 - INTEGER(IntKi), PARAMETER :: M05N3FKze = 1821 - INTEGER(IntKi), PARAMETER :: M05N4FKze = 1822 - INTEGER(IntKi), PARAMETER :: M05N5FKze = 1823 - INTEGER(IntKi), PARAMETER :: M05N6FKze = 1824 - INTEGER(IntKi), PARAMETER :: M05N7FKze = 1825 - INTEGER(IntKi), PARAMETER :: M05N8FKze = 1826 - INTEGER(IntKi), PARAMETER :: M05N9FKze = 1827 - INTEGER(IntKi), PARAMETER :: M06N1FKze = 1828 - INTEGER(IntKi), PARAMETER :: M06N2FKze = 1829 - INTEGER(IntKi), PARAMETER :: M06N3FKze = 1830 - INTEGER(IntKi), PARAMETER :: M06N4FKze = 1831 - INTEGER(IntKi), PARAMETER :: M06N5FKze = 1832 - INTEGER(IntKi), PARAMETER :: M06N6FKze = 1833 - INTEGER(IntKi), PARAMETER :: M06N7FKze = 1834 - INTEGER(IntKi), PARAMETER :: M06N8FKze = 1835 - INTEGER(IntKi), PARAMETER :: M06N9FKze = 1836 - INTEGER(IntKi), PARAMETER :: M07N1FKze = 1837 - INTEGER(IntKi), PARAMETER :: M07N2FKze = 1838 - INTEGER(IntKi), PARAMETER :: M07N3FKze = 1839 - INTEGER(IntKi), PARAMETER :: M07N4FKze = 1840 - INTEGER(IntKi), PARAMETER :: M07N5FKze = 1841 - INTEGER(IntKi), PARAMETER :: M07N6FKze = 1842 - INTEGER(IntKi), PARAMETER :: M07N7FKze = 1843 - INTEGER(IntKi), PARAMETER :: M07N8FKze = 1844 - INTEGER(IntKi), PARAMETER :: M07N9FKze = 1845 - INTEGER(IntKi), PARAMETER :: M08N1FKze = 1846 - INTEGER(IntKi), PARAMETER :: M08N2FKze = 1847 - INTEGER(IntKi), PARAMETER :: M08N3FKze = 1848 - INTEGER(IntKi), PARAMETER :: M08N4FKze = 1849 - INTEGER(IntKi), PARAMETER :: M08N5FKze = 1850 - INTEGER(IntKi), PARAMETER :: M08N6FKze = 1851 - INTEGER(IntKi), PARAMETER :: M08N7FKze = 1852 - INTEGER(IntKi), PARAMETER :: M08N8FKze = 1853 - INTEGER(IntKi), PARAMETER :: M08N9FKze = 1854 - INTEGER(IntKi), PARAMETER :: M09N1FKze = 1855 - INTEGER(IntKi), PARAMETER :: M09N2FKze = 1856 - INTEGER(IntKi), PARAMETER :: M09N3FKze = 1857 - INTEGER(IntKi), PARAMETER :: M09N4FKze = 1858 - INTEGER(IntKi), PARAMETER :: M09N5FKze = 1859 - INTEGER(IntKi), PARAMETER :: M09N6FKze = 1860 - INTEGER(IntKi), PARAMETER :: M09N7FKze = 1861 - INTEGER(IntKi), PARAMETER :: M09N8FKze = 1862 - INTEGER(IntKi), PARAMETER :: M09N9FKze = 1863 - INTEGER(IntKi), PARAMETER :: M10N1FKze = 1864 - INTEGER(IntKi), PARAMETER :: M10N2FKze = 1865 - INTEGER(IntKi), PARAMETER :: M10N3FKze = 1866 - INTEGER(IntKi), PARAMETER :: M10N4FKze = 1867 - INTEGER(IntKi), PARAMETER :: M10N5FKze = 1868 - INTEGER(IntKi), PARAMETER :: M10N6FKze = 1869 - INTEGER(IntKi), PARAMETER :: M10N7FKze = 1870 - INTEGER(IntKi), PARAMETER :: M10N8FKze = 1871 - INTEGER(IntKi), PARAMETER :: M10N9FKze = 1872 - INTEGER(IntKi), PARAMETER :: M11N1FKze = 1873 - INTEGER(IntKi), PARAMETER :: M11N2FKze = 1874 - INTEGER(IntKi), PARAMETER :: M11N3FKze = 1875 - INTEGER(IntKi), PARAMETER :: M11N4FKze = 1876 - INTEGER(IntKi), PARAMETER :: M11N5FKze = 1877 - INTEGER(IntKi), PARAMETER :: M11N6FKze = 1878 - INTEGER(IntKi), PARAMETER :: M11N7FKze = 1879 - INTEGER(IntKi), PARAMETER :: M11N8FKze = 1880 - INTEGER(IntKi), PARAMETER :: M11N9FKze = 1881 - INTEGER(IntKi), PARAMETER :: M12N1FKze = 1882 - INTEGER(IntKi), PARAMETER :: M12N2FKze = 1883 - INTEGER(IntKi), PARAMETER :: M12N3FKze = 1884 - INTEGER(IntKi), PARAMETER :: M12N4FKze = 1885 - INTEGER(IntKi), PARAMETER :: M12N5FKze = 1886 - INTEGER(IntKi), PARAMETER :: M12N6FKze = 1887 - INTEGER(IntKi), PARAMETER :: M12N7FKze = 1888 - INTEGER(IntKi), PARAMETER :: M12N8FKze = 1889 - INTEGER(IntKi), PARAMETER :: M12N9FKze = 1890 - INTEGER(IntKi), PARAMETER :: M13N1FKze = 1891 - INTEGER(IntKi), PARAMETER :: M13N2FKze = 1892 - INTEGER(IntKi), PARAMETER :: M13N3FKze = 1893 - INTEGER(IntKi), PARAMETER :: M13N4FKze = 1894 - INTEGER(IntKi), PARAMETER :: M13N5FKze = 1895 - INTEGER(IntKi), PARAMETER :: M13N6FKze = 1896 - INTEGER(IntKi), PARAMETER :: M13N7FKze = 1897 - INTEGER(IntKi), PARAMETER :: M13N8FKze = 1898 - INTEGER(IntKi), PARAMETER :: M13N9FKze = 1899 - INTEGER(IntKi), PARAMETER :: M14N1FKze = 1900 - INTEGER(IntKi), PARAMETER :: M14N2FKze = 1901 - INTEGER(IntKi), PARAMETER :: M14N3FKze = 1902 - INTEGER(IntKi), PARAMETER :: M14N4FKze = 1903 - INTEGER(IntKi), PARAMETER :: M14N5FKze = 1904 - INTEGER(IntKi), PARAMETER :: M14N6FKze = 1905 - INTEGER(IntKi), PARAMETER :: M14N7FKze = 1906 - INTEGER(IntKi), PARAMETER :: M14N8FKze = 1907 - INTEGER(IntKi), PARAMETER :: M14N9FKze = 1908 - INTEGER(IntKi), PARAMETER :: M15N1FKze = 1909 - INTEGER(IntKi), PARAMETER :: M15N2FKze = 1910 - INTEGER(IntKi), PARAMETER :: M15N3FKze = 1911 - INTEGER(IntKi), PARAMETER :: M15N4FKze = 1912 - INTEGER(IntKi), PARAMETER :: M15N5FKze = 1913 - INTEGER(IntKi), PARAMETER :: M15N6FKze = 1914 - INTEGER(IntKi), PARAMETER :: M15N7FKze = 1915 - INTEGER(IntKi), PARAMETER :: M15N8FKze = 1916 - INTEGER(IntKi), PARAMETER :: M15N9FKze = 1917 - INTEGER(IntKi), PARAMETER :: M16N1FKze = 1918 - INTEGER(IntKi), PARAMETER :: M16N2FKze = 1919 - INTEGER(IntKi), PARAMETER :: M16N3FKze = 1920 - INTEGER(IntKi), PARAMETER :: M16N4FKze = 1921 - INTEGER(IntKi), PARAMETER :: M16N5FKze = 1922 - INTEGER(IntKi), PARAMETER :: M16N6FKze = 1923 - INTEGER(IntKi), PARAMETER :: M16N7FKze = 1924 - INTEGER(IntKi), PARAMETER :: M16N8FKze = 1925 - INTEGER(IntKi), PARAMETER :: M16N9FKze = 1926 - INTEGER(IntKi), PARAMETER :: M17N1FKze = 1927 - INTEGER(IntKi), PARAMETER :: M17N2FKze = 1928 - INTEGER(IntKi), PARAMETER :: M17N3FKze = 1929 - INTEGER(IntKi), PARAMETER :: M17N4FKze = 1930 - INTEGER(IntKi), PARAMETER :: M17N5FKze = 1931 - INTEGER(IntKi), PARAMETER :: M17N6FKze = 1932 - INTEGER(IntKi), PARAMETER :: M17N7FKze = 1933 - INTEGER(IntKi), PARAMETER :: M17N8FKze = 1934 - INTEGER(IntKi), PARAMETER :: M17N9FKze = 1935 - INTEGER(IntKi), PARAMETER :: M18N1FKze = 1936 - INTEGER(IntKi), PARAMETER :: M18N2FKze = 1937 - INTEGER(IntKi), PARAMETER :: M18N3FKze = 1938 - INTEGER(IntKi), PARAMETER :: M18N4FKze = 1939 - INTEGER(IntKi), PARAMETER :: M18N5FKze = 1940 - INTEGER(IntKi), PARAMETER :: M18N6FKze = 1941 - INTEGER(IntKi), PARAMETER :: M18N7FKze = 1942 - INTEGER(IntKi), PARAMETER :: M18N8FKze = 1943 - INTEGER(IntKi), PARAMETER :: M18N9FKze = 1944 - INTEGER(IntKi), PARAMETER :: M19N1FKze = 1945 - INTEGER(IntKi), PARAMETER :: M19N2FKze = 1946 - INTEGER(IntKi), PARAMETER :: M19N3FKze = 1947 - INTEGER(IntKi), PARAMETER :: M19N4FKze = 1948 - INTEGER(IntKi), PARAMETER :: M19N5FKze = 1949 - INTEGER(IntKi), PARAMETER :: M19N6FKze = 1950 - INTEGER(IntKi), PARAMETER :: M19N7FKze = 1951 - INTEGER(IntKi), PARAMETER :: M19N8FKze = 1952 - INTEGER(IntKi), PARAMETER :: M19N9FKze = 1953 - INTEGER(IntKi), PARAMETER :: M20N1FKze = 1954 - INTEGER(IntKi), PARAMETER :: M20N2FKze = 1955 - INTEGER(IntKi), PARAMETER :: M20N3FKze = 1956 - INTEGER(IntKi), PARAMETER :: M20N4FKze = 1957 - INTEGER(IntKi), PARAMETER :: M20N5FKze = 1958 - INTEGER(IntKi), PARAMETER :: M20N6FKze = 1959 - INTEGER(IntKi), PARAMETER :: M20N7FKze = 1960 - INTEGER(IntKi), PARAMETER :: M20N8FKze = 1961 - INTEGER(IntKi), PARAMETER :: M20N9FKze = 1962 - INTEGER(IntKi), PARAMETER :: M21N1FKze = 1963 - INTEGER(IntKi), PARAMETER :: M21N2FKze = 1964 - INTEGER(IntKi), PARAMETER :: M21N3FKze = 1965 - INTEGER(IntKi), PARAMETER :: M21N4FKze = 1966 - INTEGER(IntKi), PARAMETER :: M21N5FKze = 1967 - INTEGER(IntKi), PARAMETER :: M21N6FKze = 1968 - INTEGER(IntKi), PARAMETER :: M21N7FKze = 1969 - INTEGER(IntKi), PARAMETER :: M21N8FKze = 1970 - INTEGER(IntKi), PARAMETER :: M21N9FKze = 1971 - INTEGER(IntKi), PARAMETER :: M22N1FKze = 1972 - INTEGER(IntKi), PARAMETER :: M22N2FKze = 1973 - INTEGER(IntKi), PARAMETER :: M22N3FKze = 1974 - INTEGER(IntKi), PARAMETER :: M22N4FKze = 1975 - INTEGER(IntKi), PARAMETER :: M22N5FKze = 1976 - INTEGER(IntKi), PARAMETER :: M22N6FKze = 1977 - INTEGER(IntKi), PARAMETER :: M22N7FKze = 1978 - INTEGER(IntKi), PARAMETER :: M22N8FKze = 1979 - INTEGER(IntKi), PARAMETER :: M22N9FKze = 1980 - INTEGER(IntKi), PARAMETER :: M23N1FKze = 1981 - INTEGER(IntKi), PARAMETER :: M23N2FKze = 1982 - INTEGER(IntKi), PARAMETER :: M23N3FKze = 1983 - INTEGER(IntKi), PARAMETER :: M23N4FKze = 1984 - INTEGER(IntKi), PARAMETER :: M23N5FKze = 1985 - INTEGER(IntKi), PARAMETER :: M23N6FKze = 1986 - INTEGER(IntKi), PARAMETER :: M23N7FKze = 1987 - INTEGER(IntKi), PARAMETER :: M23N8FKze = 1988 - INTEGER(IntKi), PARAMETER :: M23N9FKze = 1989 - INTEGER(IntKi), PARAMETER :: M24N1FKze = 1990 - INTEGER(IntKi), PARAMETER :: M24N2FKze = 1991 - INTEGER(IntKi), PARAMETER :: M24N3FKze = 1992 - INTEGER(IntKi), PARAMETER :: M24N4FKze = 1993 - INTEGER(IntKi), PARAMETER :: M24N5FKze = 1994 - INTEGER(IntKi), PARAMETER :: M24N6FKze = 1995 - INTEGER(IntKi), PARAMETER :: M24N7FKze = 1996 - INTEGER(IntKi), PARAMETER :: M24N8FKze = 1997 - INTEGER(IntKi), PARAMETER :: M24N9FKze = 1998 - INTEGER(IntKi), PARAMETER :: M25N1FKze = 1999 - INTEGER(IntKi), PARAMETER :: M25N2FKze = 2000 - INTEGER(IntKi), PARAMETER :: M25N3FKze = 2001 - INTEGER(IntKi), PARAMETER :: M25N4FKze = 2002 - INTEGER(IntKi), PARAMETER :: M25N5FKze = 2003 - INTEGER(IntKi), PARAMETER :: M25N6FKze = 2004 - INTEGER(IntKi), PARAMETER :: M25N7FKze = 2005 - INTEGER(IntKi), PARAMETER :: M25N8FKze = 2006 - INTEGER(IntKi), PARAMETER :: M25N9FKze = 2007 - INTEGER(IntKi), PARAMETER :: M26N1FKze = 2008 - INTEGER(IntKi), PARAMETER :: M26N2FKze = 2009 - INTEGER(IntKi), PARAMETER :: M26N3FKze = 2010 - INTEGER(IntKi), PARAMETER :: M26N4FKze = 2011 - INTEGER(IntKi), PARAMETER :: M26N5FKze = 2012 - INTEGER(IntKi), PARAMETER :: M26N6FKze = 2013 - INTEGER(IntKi), PARAMETER :: M26N7FKze = 2014 - INTEGER(IntKi), PARAMETER :: M26N8FKze = 2015 - INTEGER(IntKi), PARAMETER :: M26N9FKze = 2016 - INTEGER(IntKi), PARAMETER :: M27N1FKze = 2017 - INTEGER(IntKi), PARAMETER :: M27N2FKze = 2018 - INTEGER(IntKi), PARAMETER :: M27N3FKze = 2019 - INTEGER(IntKi), PARAMETER :: M27N4FKze = 2020 - INTEGER(IntKi), PARAMETER :: M27N5FKze = 2021 - INTEGER(IntKi), PARAMETER :: M27N6FKze = 2022 - INTEGER(IntKi), PARAMETER :: M27N7FKze = 2023 - INTEGER(IntKi), PARAMETER :: M27N8FKze = 2024 - INTEGER(IntKi), PARAMETER :: M27N9FKze = 2025 - INTEGER(IntKi), PARAMETER :: M28N1FKze = 2026 - INTEGER(IntKi), PARAMETER :: M28N2FKze = 2027 - INTEGER(IntKi), PARAMETER :: M28N3FKze = 2028 - INTEGER(IntKi), PARAMETER :: M28N4FKze = 2029 - INTEGER(IntKi), PARAMETER :: M28N5FKze = 2030 - INTEGER(IntKi), PARAMETER :: M28N6FKze = 2031 - INTEGER(IntKi), PARAMETER :: M28N7FKze = 2032 - INTEGER(IntKi), PARAMETER :: M28N8FKze = 2033 - INTEGER(IntKi), PARAMETER :: M28N9FKze = 2034 - INTEGER(IntKi), PARAMETER :: M29N1FKze = 2035 - INTEGER(IntKi), PARAMETER :: M29N2FKze = 2036 - INTEGER(IntKi), PARAMETER :: M29N3FKze = 2037 - INTEGER(IntKi), PARAMETER :: M29N4FKze = 2038 - INTEGER(IntKi), PARAMETER :: M29N5FKze = 2039 - INTEGER(IntKi), PARAMETER :: M29N6FKze = 2040 - INTEGER(IntKi), PARAMETER :: M29N7FKze = 2041 - INTEGER(IntKi), PARAMETER :: M29N8FKze = 2042 - INTEGER(IntKi), PARAMETER :: M29N9FKze = 2043 - INTEGER(IntKi), PARAMETER :: M30N1FKze = 2044 - INTEGER(IntKi), PARAMETER :: M30N2FKze = 2045 - INTEGER(IntKi), PARAMETER :: M30N3FKze = 2046 - INTEGER(IntKi), PARAMETER :: M30N4FKze = 2047 - INTEGER(IntKi), PARAMETER :: M30N5FKze = 2048 - INTEGER(IntKi), PARAMETER :: M30N6FKze = 2049 - INTEGER(IntKi), PARAMETER :: M30N7FKze = 2050 - INTEGER(IntKi), PARAMETER :: M30N8FKze = 2051 - INTEGER(IntKi), PARAMETER :: M30N9FKze = 2052 - INTEGER(IntKi), PARAMETER :: M31N1FKze = 2053 - INTEGER(IntKi), PARAMETER :: M31N2FKze = 2054 - INTEGER(IntKi), PARAMETER :: M31N3FKze = 2055 - INTEGER(IntKi), PARAMETER :: M31N4FKze = 2056 - INTEGER(IntKi), PARAMETER :: M31N5FKze = 2057 - INTEGER(IntKi), PARAMETER :: M31N6FKze = 2058 - INTEGER(IntKi), PARAMETER :: M31N7FKze = 2059 - INTEGER(IntKi), PARAMETER :: M31N8FKze = 2060 - INTEGER(IntKi), PARAMETER :: M31N9FKze = 2061 - INTEGER(IntKi), PARAMETER :: M32N1FKze = 2062 - INTEGER(IntKi), PARAMETER :: M32N2FKze = 2063 - INTEGER(IntKi), PARAMETER :: M32N3FKze = 2064 - INTEGER(IntKi), PARAMETER :: M32N4FKze = 2065 - INTEGER(IntKi), PARAMETER :: M32N5FKze = 2066 - INTEGER(IntKi), PARAMETER :: M32N6FKze = 2067 - INTEGER(IntKi), PARAMETER :: M32N7FKze = 2068 - INTEGER(IntKi), PARAMETER :: M32N8FKze = 2069 - INTEGER(IntKi), PARAMETER :: M32N9FKze = 2070 - INTEGER(IntKi), PARAMETER :: M33N1FKze = 2071 - INTEGER(IntKi), PARAMETER :: M33N2FKze = 2072 - INTEGER(IntKi), PARAMETER :: M33N3FKze = 2073 - INTEGER(IntKi), PARAMETER :: M33N4FKze = 2074 - INTEGER(IntKi), PARAMETER :: M33N5FKze = 2075 - INTEGER(IntKi), PARAMETER :: M33N6FKze = 2076 - INTEGER(IntKi), PARAMETER :: M33N7FKze = 2077 - INTEGER(IntKi), PARAMETER :: M33N8FKze = 2078 - INTEGER(IntKi), PARAMETER :: M33N9FKze = 2079 - INTEGER(IntKi), PARAMETER :: M34N1FKze = 2080 - INTEGER(IntKi), PARAMETER :: M34N2FKze = 2081 - INTEGER(IntKi), PARAMETER :: M34N3FKze = 2082 - INTEGER(IntKi), PARAMETER :: M34N4FKze = 2083 - INTEGER(IntKi), PARAMETER :: M34N5FKze = 2084 - INTEGER(IntKi), PARAMETER :: M34N6FKze = 2085 - INTEGER(IntKi), PARAMETER :: M34N7FKze = 2086 - INTEGER(IntKi), PARAMETER :: M34N8FKze = 2087 - INTEGER(IntKi), PARAMETER :: M34N9FKze = 2088 - INTEGER(IntKi), PARAMETER :: M35N1FKze = 2089 - INTEGER(IntKi), PARAMETER :: M35N2FKze = 2090 - INTEGER(IntKi), PARAMETER :: M35N3FKze = 2091 - INTEGER(IntKi), PARAMETER :: M35N4FKze = 2092 - INTEGER(IntKi), PARAMETER :: M35N5FKze = 2093 - INTEGER(IntKi), PARAMETER :: M35N6FKze = 2094 - INTEGER(IntKi), PARAMETER :: M35N7FKze = 2095 - INTEGER(IntKi), PARAMETER :: M35N8FKze = 2096 - INTEGER(IntKi), PARAMETER :: M35N9FKze = 2097 - INTEGER(IntKi), PARAMETER :: M36N1FKze = 2098 - INTEGER(IntKi), PARAMETER :: M36N2FKze = 2099 - INTEGER(IntKi), PARAMETER :: M36N3FKze = 2100 - INTEGER(IntKi), PARAMETER :: M36N4FKze = 2101 - INTEGER(IntKi), PARAMETER :: M36N5FKze = 2102 - INTEGER(IntKi), PARAMETER :: M36N6FKze = 2103 - INTEGER(IntKi), PARAMETER :: M36N7FKze = 2104 - INTEGER(IntKi), PARAMETER :: M36N8FKze = 2105 - INTEGER(IntKi), PARAMETER :: M36N9FKze = 2106 - INTEGER(IntKi), PARAMETER :: M37N1FKze = 2107 - INTEGER(IntKi), PARAMETER :: M37N2FKze = 2108 - INTEGER(IntKi), PARAMETER :: M37N3FKze = 2109 - INTEGER(IntKi), PARAMETER :: M37N4FKze = 2110 - INTEGER(IntKi), PARAMETER :: M37N5FKze = 2111 - INTEGER(IntKi), PARAMETER :: M37N6FKze = 2112 - INTEGER(IntKi), PARAMETER :: M37N7FKze = 2113 - INTEGER(IntKi), PARAMETER :: M37N8FKze = 2114 - INTEGER(IntKi), PARAMETER :: M37N9FKze = 2115 - INTEGER(IntKi), PARAMETER :: M38N1FKze = 2116 - INTEGER(IntKi), PARAMETER :: M38N2FKze = 2117 - INTEGER(IntKi), PARAMETER :: M38N3FKze = 2118 - INTEGER(IntKi), PARAMETER :: M38N4FKze = 2119 - INTEGER(IntKi), PARAMETER :: M38N5FKze = 2120 - INTEGER(IntKi), PARAMETER :: M38N6FKze = 2121 - INTEGER(IntKi), PARAMETER :: M38N7FKze = 2122 - INTEGER(IntKi), PARAMETER :: M38N8FKze = 2123 - INTEGER(IntKi), PARAMETER :: M38N9FKze = 2124 - INTEGER(IntKi), PARAMETER :: M39N1FKze = 2125 - INTEGER(IntKi), PARAMETER :: M39N2FKze = 2126 - INTEGER(IntKi), PARAMETER :: M39N3FKze = 2127 - INTEGER(IntKi), PARAMETER :: M39N4FKze = 2128 - INTEGER(IntKi), PARAMETER :: M39N5FKze = 2129 - INTEGER(IntKi), PARAMETER :: M39N6FKze = 2130 - INTEGER(IntKi), PARAMETER :: M39N7FKze = 2131 - INTEGER(IntKi), PARAMETER :: M39N8FKze = 2132 - INTEGER(IntKi), PARAMETER :: M39N9FKze = 2133 - INTEGER(IntKi), PARAMETER :: M40N1FKze = 2134 - INTEGER(IntKi), PARAMETER :: M40N2FKze = 2135 - INTEGER(IntKi), PARAMETER :: M40N3FKze = 2136 - INTEGER(IntKi), PARAMETER :: M40N4FKze = 2137 - INTEGER(IntKi), PARAMETER :: M40N5FKze = 2138 - INTEGER(IntKi), PARAMETER :: M40N6FKze = 2139 - INTEGER(IntKi), PARAMETER :: M40N7FKze = 2140 - INTEGER(IntKi), PARAMETER :: M40N8FKze = 2141 - INTEGER(IntKi), PARAMETER :: M40N9FKze = 2142 - INTEGER(IntKi), PARAMETER :: M41N1FKze = 2143 - INTEGER(IntKi), PARAMETER :: M41N2FKze = 2144 - INTEGER(IntKi), PARAMETER :: M41N3FKze = 2145 - INTEGER(IntKi), PARAMETER :: M41N4FKze = 2146 - INTEGER(IntKi), PARAMETER :: M41N5FKze = 2147 - INTEGER(IntKi), PARAMETER :: M41N6FKze = 2148 - INTEGER(IntKi), PARAMETER :: M41N7FKze = 2149 - INTEGER(IntKi), PARAMETER :: M41N8FKze = 2150 - INTEGER(IntKi), PARAMETER :: M41N9FKze = 2151 - INTEGER(IntKi), PARAMETER :: M42N1FKze = 2152 - INTEGER(IntKi), PARAMETER :: M42N2FKze = 2153 - INTEGER(IntKi), PARAMETER :: M42N3FKze = 2154 - INTEGER(IntKi), PARAMETER :: M42N4FKze = 2155 - INTEGER(IntKi), PARAMETER :: M42N5FKze = 2156 - INTEGER(IntKi), PARAMETER :: M42N6FKze = 2157 - INTEGER(IntKi), PARAMETER :: M42N7FKze = 2158 - INTEGER(IntKi), PARAMETER :: M42N8FKze = 2159 - INTEGER(IntKi), PARAMETER :: M42N9FKze = 2160 - INTEGER(IntKi), PARAMETER :: M43N1FKze = 2161 - INTEGER(IntKi), PARAMETER :: M43N2FKze = 2162 - INTEGER(IntKi), PARAMETER :: M43N3FKze = 2163 - INTEGER(IntKi), PARAMETER :: M43N4FKze = 2164 - INTEGER(IntKi), PARAMETER :: M43N5FKze = 2165 - INTEGER(IntKi), PARAMETER :: M43N6FKze = 2166 - INTEGER(IntKi), PARAMETER :: M43N7FKze = 2167 - INTEGER(IntKi), PARAMETER :: M43N8FKze = 2168 - INTEGER(IntKi), PARAMETER :: M43N9FKze = 2169 - INTEGER(IntKi), PARAMETER :: M44N1FKze = 2170 - INTEGER(IntKi), PARAMETER :: M44N2FKze = 2171 - INTEGER(IntKi), PARAMETER :: M44N3FKze = 2172 - INTEGER(IntKi), PARAMETER :: M44N4FKze = 2173 - INTEGER(IntKi), PARAMETER :: M44N5FKze = 2174 - INTEGER(IntKi), PARAMETER :: M44N6FKze = 2175 - INTEGER(IntKi), PARAMETER :: M44N7FKze = 2176 - INTEGER(IntKi), PARAMETER :: M44N8FKze = 2177 - INTEGER(IntKi), PARAMETER :: M44N9FKze = 2178 - INTEGER(IntKi), PARAMETER :: M45N1FKze = 2179 - INTEGER(IntKi), PARAMETER :: M45N2FKze = 2180 - INTEGER(IntKi), PARAMETER :: M45N3FKze = 2181 - INTEGER(IntKi), PARAMETER :: M45N4FKze = 2182 - INTEGER(IntKi), PARAMETER :: M45N5FKze = 2183 - INTEGER(IntKi), PARAMETER :: M45N6FKze = 2184 - INTEGER(IntKi), PARAMETER :: M45N7FKze = 2185 - INTEGER(IntKi), PARAMETER :: M45N8FKze = 2186 - INTEGER(IntKi), PARAMETER :: M45N9FKze = 2187 - INTEGER(IntKi), PARAMETER :: M46N1FKze = 2188 - INTEGER(IntKi), PARAMETER :: M46N2FKze = 2189 - INTEGER(IntKi), PARAMETER :: M46N3FKze = 2190 - INTEGER(IntKi), PARAMETER :: M46N4FKze = 2191 - INTEGER(IntKi), PARAMETER :: M46N5FKze = 2192 - INTEGER(IntKi), PARAMETER :: M46N6FKze = 2193 - INTEGER(IntKi), PARAMETER :: M46N7FKze = 2194 - INTEGER(IntKi), PARAMETER :: M46N8FKze = 2195 - INTEGER(IntKi), PARAMETER :: M46N9FKze = 2196 - INTEGER(IntKi), PARAMETER :: M47N1FKze = 2197 - INTEGER(IntKi), PARAMETER :: M47N2FKze = 2198 - INTEGER(IntKi), PARAMETER :: M47N3FKze = 2199 - INTEGER(IntKi), PARAMETER :: M47N4FKze = 2200 - INTEGER(IntKi), PARAMETER :: M47N5FKze = 2201 - INTEGER(IntKi), PARAMETER :: M47N6FKze = 2202 - INTEGER(IntKi), PARAMETER :: M47N7FKze = 2203 - INTEGER(IntKi), PARAMETER :: M47N8FKze = 2204 - INTEGER(IntKi), PARAMETER :: M47N9FKze = 2205 - INTEGER(IntKi), PARAMETER :: M48N1FKze = 2206 - INTEGER(IntKi), PARAMETER :: M48N2FKze = 2207 - INTEGER(IntKi), PARAMETER :: M48N3FKze = 2208 - INTEGER(IntKi), PARAMETER :: M48N4FKze = 2209 - INTEGER(IntKi), PARAMETER :: M48N5FKze = 2210 - INTEGER(IntKi), PARAMETER :: M48N6FKze = 2211 - INTEGER(IntKi), PARAMETER :: M48N7FKze = 2212 - INTEGER(IntKi), PARAMETER :: M48N8FKze = 2213 - INTEGER(IntKi), PARAMETER :: M48N9FKze = 2214 - INTEGER(IntKi), PARAMETER :: M49N1FKze = 2215 - INTEGER(IntKi), PARAMETER :: M49N2FKze = 2216 - INTEGER(IntKi), PARAMETER :: M49N3FKze = 2217 - INTEGER(IntKi), PARAMETER :: M49N4FKze = 2218 - INTEGER(IntKi), PARAMETER :: M49N5FKze = 2219 - INTEGER(IntKi), PARAMETER :: M49N6FKze = 2220 - INTEGER(IntKi), PARAMETER :: M49N7FKze = 2221 - INTEGER(IntKi), PARAMETER :: M49N8FKze = 2222 - INTEGER(IntKi), PARAMETER :: M49N9FKze = 2223 - INTEGER(IntKi), PARAMETER :: M50N1FKze = 2224 - INTEGER(IntKi), PARAMETER :: M50N2FKze = 2225 - INTEGER(IntKi), PARAMETER :: M50N3FKze = 2226 - INTEGER(IntKi), PARAMETER :: M50N4FKze = 2227 - INTEGER(IntKi), PARAMETER :: M50N5FKze = 2228 - INTEGER(IntKi), PARAMETER :: M50N6FKze = 2229 - INTEGER(IntKi), PARAMETER :: M50N7FKze = 2230 - INTEGER(IntKi), PARAMETER :: M50N8FKze = 2231 - INTEGER(IntKi), PARAMETER :: M50N9FKze = 2232 - INTEGER(IntKi), PARAMETER :: M51N1FKze = 2233 - INTEGER(IntKi), PARAMETER :: M51N2FKze = 2234 - INTEGER(IntKi), PARAMETER :: M51N3FKze = 2235 - INTEGER(IntKi), PARAMETER :: M51N4FKze = 2236 - INTEGER(IntKi), PARAMETER :: M51N5FKze = 2237 - INTEGER(IntKi), PARAMETER :: M51N6FKze = 2238 - INTEGER(IntKi), PARAMETER :: M51N7FKze = 2239 - INTEGER(IntKi), PARAMETER :: M51N8FKze = 2240 - INTEGER(IntKi), PARAMETER :: M51N9FKze = 2241 - INTEGER(IntKi), PARAMETER :: M52N1FKze = 2242 - INTEGER(IntKi), PARAMETER :: M52N2FKze = 2243 - INTEGER(IntKi), PARAMETER :: M52N3FKze = 2244 - INTEGER(IntKi), PARAMETER :: M52N4FKze = 2245 - INTEGER(IntKi), PARAMETER :: M52N5FKze = 2246 - INTEGER(IntKi), PARAMETER :: M52N6FKze = 2247 - INTEGER(IntKi), PARAMETER :: M52N7FKze = 2248 - INTEGER(IntKi), PARAMETER :: M52N8FKze = 2249 - INTEGER(IntKi), PARAMETER :: M52N9FKze = 2250 - INTEGER(IntKi), PARAMETER :: M53N1FKze = 2251 - INTEGER(IntKi), PARAMETER :: M53N2FKze = 2252 - INTEGER(IntKi), PARAMETER :: M53N3FKze = 2253 - INTEGER(IntKi), PARAMETER :: M53N4FKze = 2254 - INTEGER(IntKi), PARAMETER :: M53N5FKze = 2255 - INTEGER(IntKi), PARAMETER :: M53N6FKze = 2256 - INTEGER(IntKi), PARAMETER :: M53N7FKze = 2257 - INTEGER(IntKi), PARAMETER :: M53N8FKze = 2258 - INTEGER(IntKi), PARAMETER :: M53N9FKze = 2259 - INTEGER(IntKi), PARAMETER :: M54N1FKze = 2260 - INTEGER(IntKi), PARAMETER :: M54N2FKze = 2261 - INTEGER(IntKi), PARAMETER :: M54N3FKze = 2262 - INTEGER(IntKi), PARAMETER :: M54N4FKze = 2263 - INTEGER(IntKi), PARAMETER :: M54N5FKze = 2264 - INTEGER(IntKi), PARAMETER :: M54N6FKze = 2265 - INTEGER(IntKi), PARAMETER :: M54N7FKze = 2266 - INTEGER(IntKi), PARAMETER :: M54N8FKze = 2267 - INTEGER(IntKi), PARAMETER :: M54N9FKze = 2268 - INTEGER(IntKi), PARAMETER :: M55N1FKze = 2269 - INTEGER(IntKi), PARAMETER :: M55N2FKze = 2270 - INTEGER(IntKi), PARAMETER :: M55N3FKze = 2271 - INTEGER(IntKi), PARAMETER :: M55N4FKze = 2272 - INTEGER(IntKi), PARAMETER :: M55N5FKze = 2273 - INTEGER(IntKi), PARAMETER :: M55N6FKze = 2274 - INTEGER(IntKi), PARAMETER :: M55N7FKze = 2275 - INTEGER(IntKi), PARAMETER :: M55N8FKze = 2276 - INTEGER(IntKi), PARAMETER :: M55N9FKze = 2277 - INTEGER(IntKi), PARAMETER :: M56N1FKze = 2278 - INTEGER(IntKi), PARAMETER :: M56N2FKze = 2279 - INTEGER(IntKi), PARAMETER :: M56N3FKze = 2280 - INTEGER(IntKi), PARAMETER :: M56N4FKze = 2281 - INTEGER(IntKi), PARAMETER :: M56N5FKze = 2282 - INTEGER(IntKi), PARAMETER :: M56N6FKze = 2283 - INTEGER(IntKi), PARAMETER :: M56N7FKze = 2284 - INTEGER(IntKi), PARAMETER :: M56N8FKze = 2285 - INTEGER(IntKi), PARAMETER :: M56N9FKze = 2286 - INTEGER(IntKi), PARAMETER :: M57N1FKze = 2287 - INTEGER(IntKi), PARAMETER :: M57N2FKze = 2288 - INTEGER(IntKi), PARAMETER :: M57N3FKze = 2289 - INTEGER(IntKi), PARAMETER :: M57N4FKze = 2290 - INTEGER(IntKi), PARAMETER :: M57N5FKze = 2291 - INTEGER(IntKi), PARAMETER :: M57N6FKze = 2292 - INTEGER(IntKi), PARAMETER :: M57N7FKze = 2293 - INTEGER(IntKi), PARAMETER :: M57N8FKze = 2294 - INTEGER(IntKi), PARAMETER :: M57N9FKze = 2295 - INTEGER(IntKi), PARAMETER :: M58N1FKze = 2296 - INTEGER(IntKi), PARAMETER :: M58N2FKze = 2297 - INTEGER(IntKi), PARAMETER :: M58N3FKze = 2298 - INTEGER(IntKi), PARAMETER :: M58N4FKze = 2299 - INTEGER(IntKi), PARAMETER :: M58N5FKze = 2300 - INTEGER(IntKi), PARAMETER :: M58N6FKze = 2301 - INTEGER(IntKi), PARAMETER :: M58N7FKze = 2302 - INTEGER(IntKi), PARAMETER :: M58N8FKze = 2303 - INTEGER(IntKi), PARAMETER :: M58N9FKze = 2304 - INTEGER(IntKi), PARAMETER :: M59N1FKze = 2305 - INTEGER(IntKi), PARAMETER :: M59N2FKze = 2306 - INTEGER(IntKi), PARAMETER :: M59N3FKze = 2307 - INTEGER(IntKi), PARAMETER :: M59N4FKze = 2308 - INTEGER(IntKi), PARAMETER :: M59N5FKze = 2309 - INTEGER(IntKi), PARAMETER :: M59N6FKze = 2310 - INTEGER(IntKi), PARAMETER :: M59N7FKze = 2311 - INTEGER(IntKi), PARAMETER :: M59N8FKze = 2312 - INTEGER(IntKi), PARAMETER :: M59N9FKze = 2313 - INTEGER(IntKi), PARAMETER :: M60N1FKze = 2314 - INTEGER(IntKi), PARAMETER :: M60N2FKze = 2315 - INTEGER(IntKi), PARAMETER :: M60N3FKze = 2316 - INTEGER(IntKi), PARAMETER :: M60N4FKze = 2317 - INTEGER(IntKi), PARAMETER :: M60N5FKze = 2318 - INTEGER(IntKi), PARAMETER :: M60N6FKze = 2319 - INTEGER(IntKi), PARAMETER :: M60N7FKze = 2320 - INTEGER(IntKi), PARAMETER :: M60N8FKze = 2321 - INTEGER(IntKi), PARAMETER :: M60N9FKze = 2322 - INTEGER(IntKi), PARAMETER :: M61N1FKze = 2323 - INTEGER(IntKi), PARAMETER :: M61N2FKze = 2324 - INTEGER(IntKi), PARAMETER :: M61N3FKze = 2325 - INTEGER(IntKi), PARAMETER :: M61N4FKze = 2326 - INTEGER(IntKi), PARAMETER :: M61N5FKze = 2327 - INTEGER(IntKi), PARAMETER :: M61N6FKze = 2328 - INTEGER(IntKi), PARAMETER :: M61N7FKze = 2329 - INTEGER(IntKi), PARAMETER :: M61N8FKze = 2330 - INTEGER(IntKi), PARAMETER :: M61N9FKze = 2331 - INTEGER(IntKi), PARAMETER :: M62N1FKze = 2332 - INTEGER(IntKi), PARAMETER :: M62N2FKze = 2333 - INTEGER(IntKi), PARAMETER :: M62N3FKze = 2334 - INTEGER(IntKi), PARAMETER :: M62N4FKze = 2335 - INTEGER(IntKi), PARAMETER :: M62N5FKze = 2336 - INTEGER(IntKi), PARAMETER :: M62N6FKze = 2337 - INTEGER(IntKi), PARAMETER :: M62N7FKze = 2338 - INTEGER(IntKi), PARAMETER :: M62N8FKze = 2339 - INTEGER(IntKi), PARAMETER :: M62N9FKze = 2340 - INTEGER(IntKi), PARAMETER :: M63N1FKze = 2341 - INTEGER(IntKi), PARAMETER :: M63N2FKze = 2342 - INTEGER(IntKi), PARAMETER :: M63N3FKze = 2343 - INTEGER(IntKi), PARAMETER :: M63N4FKze = 2344 - INTEGER(IntKi), PARAMETER :: M63N5FKze = 2345 - INTEGER(IntKi), PARAMETER :: M63N6FKze = 2346 - INTEGER(IntKi), PARAMETER :: M63N7FKze = 2347 - INTEGER(IntKi), PARAMETER :: M63N8FKze = 2348 - INTEGER(IntKi), PARAMETER :: M63N9FKze = 2349 - INTEGER(IntKi), PARAMETER :: M64N1FKze = 2350 - INTEGER(IntKi), PARAMETER :: M64N2FKze = 2351 - INTEGER(IntKi), PARAMETER :: M64N3FKze = 2352 - INTEGER(IntKi), PARAMETER :: M64N4FKze = 2353 - INTEGER(IntKi), PARAMETER :: M64N5FKze = 2354 - INTEGER(IntKi), PARAMETER :: M64N6FKze = 2355 - INTEGER(IntKi), PARAMETER :: M64N7FKze = 2356 - INTEGER(IntKi), PARAMETER :: M64N8FKze = 2357 - INTEGER(IntKi), PARAMETER :: M64N9FKze = 2358 - INTEGER(IntKi), PARAMETER :: M65N1FKze = 2359 - INTEGER(IntKi), PARAMETER :: M65N2FKze = 2360 - INTEGER(IntKi), PARAMETER :: M65N3FKze = 2361 - INTEGER(IntKi), PARAMETER :: M65N4FKze = 2362 - INTEGER(IntKi), PARAMETER :: M65N5FKze = 2363 - INTEGER(IntKi), PARAMETER :: M65N6FKze = 2364 - INTEGER(IntKi), PARAMETER :: M65N7FKze = 2365 - INTEGER(IntKi), PARAMETER :: M65N8FKze = 2366 - INTEGER(IntKi), PARAMETER :: M65N9FKze = 2367 - INTEGER(IntKi), PARAMETER :: M66N1FKze = 2368 - INTEGER(IntKi), PARAMETER :: M66N2FKze = 2369 - INTEGER(IntKi), PARAMETER :: M66N3FKze = 2370 - INTEGER(IntKi), PARAMETER :: M66N4FKze = 2371 - INTEGER(IntKi), PARAMETER :: M66N5FKze = 2372 - INTEGER(IntKi), PARAMETER :: M66N6FKze = 2373 - INTEGER(IntKi), PARAMETER :: M66N7FKze = 2374 - INTEGER(IntKi), PARAMETER :: M66N8FKze = 2375 - INTEGER(IntKi), PARAMETER :: M66N9FKze = 2376 - INTEGER(IntKi), PARAMETER :: M67N1FKze = 2377 - INTEGER(IntKi), PARAMETER :: M67N2FKze = 2378 - INTEGER(IntKi), PARAMETER :: M67N3FKze = 2379 - INTEGER(IntKi), PARAMETER :: M67N4FKze = 2380 - INTEGER(IntKi), PARAMETER :: M67N5FKze = 2381 - INTEGER(IntKi), PARAMETER :: M67N6FKze = 2382 - INTEGER(IntKi), PARAMETER :: M67N7FKze = 2383 - INTEGER(IntKi), PARAMETER :: M67N8FKze = 2384 - INTEGER(IntKi), PARAMETER :: M67N9FKze = 2385 - INTEGER(IntKi), PARAMETER :: M68N1FKze = 2386 - INTEGER(IntKi), PARAMETER :: M68N2FKze = 2387 - INTEGER(IntKi), PARAMETER :: M68N3FKze = 2388 - INTEGER(IntKi), PARAMETER :: M68N4FKze = 2389 - INTEGER(IntKi), PARAMETER :: M68N5FKze = 2390 - INTEGER(IntKi), PARAMETER :: M68N6FKze = 2391 - INTEGER(IntKi), PARAMETER :: M68N7FKze = 2392 - INTEGER(IntKi), PARAMETER :: M68N8FKze = 2393 - INTEGER(IntKi), PARAMETER :: M68N9FKze = 2394 - INTEGER(IntKi), PARAMETER :: M69N1FKze = 2395 - INTEGER(IntKi), PARAMETER :: M69N2FKze = 2396 - INTEGER(IntKi), PARAMETER :: M69N3FKze = 2397 - INTEGER(IntKi), PARAMETER :: M69N4FKze = 2398 - INTEGER(IntKi), PARAMETER :: M69N5FKze = 2399 - INTEGER(IntKi), PARAMETER :: M69N6FKze = 2400 - INTEGER(IntKi), PARAMETER :: M69N7FKze = 2401 - INTEGER(IntKi), PARAMETER :: M69N8FKze = 2402 - INTEGER(IntKi), PARAMETER :: M69N9FKze = 2403 - INTEGER(IntKi), PARAMETER :: M70N1FKze = 2404 - INTEGER(IntKi), PARAMETER :: M70N2FKze = 2405 - INTEGER(IntKi), PARAMETER :: M70N3FKze = 2406 - INTEGER(IntKi), PARAMETER :: M70N4FKze = 2407 - INTEGER(IntKi), PARAMETER :: M70N5FKze = 2408 - INTEGER(IntKi), PARAMETER :: M70N6FKze = 2409 - INTEGER(IntKi), PARAMETER :: M70N7FKze = 2410 - INTEGER(IntKi), PARAMETER :: M70N8FKze = 2411 - INTEGER(IntKi), PARAMETER :: M70N9FKze = 2412 - INTEGER(IntKi), PARAMETER :: M71N1FKze = 2413 - INTEGER(IntKi), PARAMETER :: M71N2FKze = 2414 - INTEGER(IntKi), PARAMETER :: M71N3FKze = 2415 - INTEGER(IntKi), PARAMETER :: M71N4FKze = 2416 - INTEGER(IntKi), PARAMETER :: M71N5FKze = 2417 - INTEGER(IntKi), PARAMETER :: M71N6FKze = 2418 - INTEGER(IntKi), PARAMETER :: M71N7FKze = 2419 - INTEGER(IntKi), PARAMETER :: M71N8FKze = 2420 - INTEGER(IntKi), PARAMETER :: M71N9FKze = 2421 - INTEGER(IntKi), PARAMETER :: M72N1FKze = 2422 - INTEGER(IntKi), PARAMETER :: M72N2FKze = 2423 - INTEGER(IntKi), PARAMETER :: M72N3FKze = 2424 - INTEGER(IntKi), PARAMETER :: M72N4FKze = 2425 - INTEGER(IntKi), PARAMETER :: M72N5FKze = 2426 - INTEGER(IntKi), PARAMETER :: M72N6FKze = 2427 - INTEGER(IntKi), PARAMETER :: M72N7FKze = 2428 - INTEGER(IntKi), PARAMETER :: M72N8FKze = 2429 - INTEGER(IntKi), PARAMETER :: M72N9FKze = 2430 - INTEGER(IntKi), PARAMETER :: M73N1FKze = 2431 - INTEGER(IntKi), PARAMETER :: M73N2FKze = 2432 - INTEGER(IntKi), PARAMETER :: M73N3FKze = 2433 - INTEGER(IntKi), PARAMETER :: M73N4FKze = 2434 - INTEGER(IntKi), PARAMETER :: M73N5FKze = 2435 - INTEGER(IntKi), PARAMETER :: M73N6FKze = 2436 - INTEGER(IntKi), PARAMETER :: M73N7FKze = 2437 - INTEGER(IntKi), PARAMETER :: M73N8FKze = 2438 - INTEGER(IntKi), PARAMETER :: M73N9FKze = 2439 - INTEGER(IntKi), PARAMETER :: M74N1FKze = 2440 - INTEGER(IntKi), PARAMETER :: M74N2FKze = 2441 - INTEGER(IntKi), PARAMETER :: M74N3FKze = 2442 - INTEGER(IntKi), PARAMETER :: M74N4FKze = 2443 - INTEGER(IntKi), PARAMETER :: M74N5FKze = 2444 - INTEGER(IntKi), PARAMETER :: M74N6FKze = 2445 - INTEGER(IntKi), PARAMETER :: M74N7FKze = 2446 - INTEGER(IntKi), PARAMETER :: M74N8FKze = 2447 - INTEGER(IntKi), PARAMETER :: M74N9FKze = 2448 - INTEGER(IntKi), PARAMETER :: M75N1FKze = 2449 - INTEGER(IntKi), PARAMETER :: M75N2FKze = 2450 - INTEGER(IntKi), PARAMETER :: M75N3FKze = 2451 - INTEGER(IntKi), PARAMETER :: M75N4FKze = 2452 - INTEGER(IntKi), PARAMETER :: M75N5FKze = 2453 - INTEGER(IntKi), PARAMETER :: M75N6FKze = 2454 - INTEGER(IntKi), PARAMETER :: M75N7FKze = 2455 - INTEGER(IntKi), PARAMETER :: M75N8FKze = 2456 - INTEGER(IntKi), PARAMETER :: M75N9FKze = 2457 - INTEGER(IntKi), PARAMETER :: M76N1FKze = 2458 - INTEGER(IntKi), PARAMETER :: M76N2FKze = 2459 - INTEGER(IntKi), PARAMETER :: M76N3FKze = 2460 - INTEGER(IntKi), PARAMETER :: M76N4FKze = 2461 - INTEGER(IntKi), PARAMETER :: M76N5FKze = 2462 - INTEGER(IntKi), PARAMETER :: M76N6FKze = 2463 - INTEGER(IntKi), PARAMETER :: M76N7FKze = 2464 - INTEGER(IntKi), PARAMETER :: M76N8FKze = 2465 - INTEGER(IntKi), PARAMETER :: M76N9FKze = 2466 - INTEGER(IntKi), PARAMETER :: M77N1FKze = 2467 - INTEGER(IntKi), PARAMETER :: M77N2FKze = 2468 - INTEGER(IntKi), PARAMETER :: M77N3FKze = 2469 - INTEGER(IntKi), PARAMETER :: M77N4FKze = 2470 - INTEGER(IntKi), PARAMETER :: M77N5FKze = 2471 - INTEGER(IntKi), PARAMETER :: M77N6FKze = 2472 - INTEGER(IntKi), PARAMETER :: M77N7FKze = 2473 - INTEGER(IntKi), PARAMETER :: M77N8FKze = 2474 - INTEGER(IntKi), PARAMETER :: M77N9FKze = 2475 - INTEGER(IntKi), PARAMETER :: M78N1FKze = 2476 - INTEGER(IntKi), PARAMETER :: M78N2FKze = 2477 - INTEGER(IntKi), PARAMETER :: M78N3FKze = 2478 - INTEGER(IntKi), PARAMETER :: M78N4FKze = 2479 - INTEGER(IntKi), PARAMETER :: M78N5FKze = 2480 - INTEGER(IntKi), PARAMETER :: M78N6FKze = 2481 - INTEGER(IntKi), PARAMETER :: M78N7FKze = 2482 - INTEGER(IntKi), PARAMETER :: M78N8FKze = 2483 - INTEGER(IntKi), PARAMETER :: M78N9FKze = 2484 - INTEGER(IntKi), PARAMETER :: M79N1FKze = 2485 - INTEGER(IntKi), PARAMETER :: M79N2FKze = 2486 - INTEGER(IntKi), PARAMETER :: M79N3FKze = 2487 - INTEGER(IntKi), PARAMETER :: M79N4FKze = 2488 - INTEGER(IntKi), PARAMETER :: M79N5FKze = 2489 - INTEGER(IntKi), PARAMETER :: M79N6FKze = 2490 - INTEGER(IntKi), PARAMETER :: M79N7FKze = 2491 - INTEGER(IntKi), PARAMETER :: M79N8FKze = 2492 - INTEGER(IntKi), PARAMETER :: M79N9FKze = 2493 - INTEGER(IntKi), PARAMETER :: M80N1FKze = 2494 - INTEGER(IntKi), PARAMETER :: M80N2FKze = 2495 - INTEGER(IntKi), PARAMETER :: M80N3FKze = 2496 - INTEGER(IntKi), PARAMETER :: M80N4FKze = 2497 - INTEGER(IntKi), PARAMETER :: M80N5FKze = 2498 - INTEGER(IntKi), PARAMETER :: M80N6FKze = 2499 - INTEGER(IntKi), PARAMETER :: M80N7FKze = 2500 - INTEGER(IntKi), PARAMETER :: M80N8FKze = 2501 - INTEGER(IntKi), PARAMETER :: M80N9FKze = 2502 - INTEGER(IntKi), PARAMETER :: M81N1FKze = 2503 - INTEGER(IntKi), PARAMETER :: M81N2FKze = 2504 - INTEGER(IntKi), PARAMETER :: M81N3FKze = 2505 - INTEGER(IntKi), PARAMETER :: M81N4FKze = 2506 - INTEGER(IntKi), PARAMETER :: M81N5FKze = 2507 - INTEGER(IntKi), PARAMETER :: M81N6FKze = 2508 - INTEGER(IntKi), PARAMETER :: M81N7FKze = 2509 - INTEGER(IntKi), PARAMETER :: M81N8FKze = 2510 - INTEGER(IntKi), PARAMETER :: M81N9FKze = 2511 - INTEGER(IntKi), PARAMETER :: M82N1FKze = 2512 - INTEGER(IntKi), PARAMETER :: M82N2FKze = 2513 - INTEGER(IntKi), PARAMETER :: M82N3FKze = 2514 - INTEGER(IntKi), PARAMETER :: M82N4FKze = 2515 - INTEGER(IntKi), PARAMETER :: M82N5FKze = 2516 - INTEGER(IntKi), PARAMETER :: M82N6FKze = 2517 - INTEGER(IntKi), PARAMETER :: M82N7FKze = 2518 - INTEGER(IntKi), PARAMETER :: M82N8FKze = 2519 - INTEGER(IntKi), PARAMETER :: M82N9FKze = 2520 - INTEGER(IntKi), PARAMETER :: M83N1FKze = 2521 - INTEGER(IntKi), PARAMETER :: M83N2FKze = 2522 - INTEGER(IntKi), PARAMETER :: M83N3FKze = 2523 - INTEGER(IntKi), PARAMETER :: M83N4FKze = 2524 - INTEGER(IntKi), PARAMETER :: M83N5FKze = 2525 - INTEGER(IntKi), PARAMETER :: M83N6FKze = 2526 - INTEGER(IntKi), PARAMETER :: M83N7FKze = 2527 - INTEGER(IntKi), PARAMETER :: M83N8FKze = 2528 - INTEGER(IntKi), PARAMETER :: M83N9FKze = 2529 - INTEGER(IntKi), PARAMETER :: M84N1FKze = 2530 - INTEGER(IntKi), PARAMETER :: M84N2FKze = 2531 - INTEGER(IntKi), PARAMETER :: M84N3FKze = 2532 - INTEGER(IntKi), PARAMETER :: M84N4FKze = 2533 - INTEGER(IntKi), PARAMETER :: M84N5FKze = 2534 - INTEGER(IntKi), PARAMETER :: M84N6FKze = 2535 - INTEGER(IntKi), PARAMETER :: M84N7FKze = 2536 - INTEGER(IntKi), PARAMETER :: M84N8FKze = 2537 - INTEGER(IntKi), PARAMETER :: M84N9FKze = 2538 - INTEGER(IntKi), PARAMETER :: M85N1FKze = 2539 - INTEGER(IntKi), PARAMETER :: M85N2FKze = 2540 - INTEGER(IntKi), PARAMETER :: M85N3FKze = 2541 - INTEGER(IntKi), PARAMETER :: M85N4FKze = 2542 - INTEGER(IntKi), PARAMETER :: M85N5FKze = 2543 - INTEGER(IntKi), PARAMETER :: M85N6FKze = 2544 - INTEGER(IntKi), PARAMETER :: M85N7FKze = 2545 - INTEGER(IntKi), PARAMETER :: M85N8FKze = 2546 - INTEGER(IntKi), PARAMETER :: M85N9FKze = 2547 - INTEGER(IntKi), PARAMETER :: M86N1FKze = 2548 - INTEGER(IntKi), PARAMETER :: M86N2FKze = 2549 - INTEGER(IntKi), PARAMETER :: M86N3FKze = 2550 - INTEGER(IntKi), PARAMETER :: M86N4FKze = 2551 - INTEGER(IntKi), PARAMETER :: M86N5FKze = 2552 - INTEGER(IntKi), PARAMETER :: M86N6FKze = 2553 - INTEGER(IntKi), PARAMETER :: M86N7FKze = 2554 - INTEGER(IntKi), PARAMETER :: M86N8FKze = 2555 - INTEGER(IntKi), PARAMETER :: M86N9FKze = 2556 - INTEGER(IntKi), PARAMETER :: M87N1FKze = 2557 - INTEGER(IntKi), PARAMETER :: M87N2FKze = 2558 - INTEGER(IntKi), PARAMETER :: M87N3FKze = 2559 - INTEGER(IntKi), PARAMETER :: M87N4FKze = 2560 - INTEGER(IntKi), PARAMETER :: M87N5FKze = 2561 - INTEGER(IntKi), PARAMETER :: M87N6FKze = 2562 - INTEGER(IntKi), PARAMETER :: M87N7FKze = 2563 - INTEGER(IntKi), PARAMETER :: M87N8FKze = 2564 - INTEGER(IntKi), PARAMETER :: M87N9FKze = 2565 - INTEGER(IntKi), PARAMETER :: M88N1FKze = 2566 - INTEGER(IntKi), PARAMETER :: M88N2FKze = 2567 - INTEGER(IntKi), PARAMETER :: M88N3FKze = 2568 - INTEGER(IntKi), PARAMETER :: M88N4FKze = 2569 - INTEGER(IntKi), PARAMETER :: M88N5FKze = 2570 - INTEGER(IntKi), PARAMETER :: M88N6FKze = 2571 - INTEGER(IntKi), PARAMETER :: M88N7FKze = 2572 - INTEGER(IntKi), PARAMETER :: M88N8FKze = 2573 - INTEGER(IntKi), PARAMETER :: M88N9FKze = 2574 - INTEGER(IntKi), PARAMETER :: M89N1FKze = 2575 - INTEGER(IntKi), PARAMETER :: M89N2FKze = 2576 - INTEGER(IntKi), PARAMETER :: M89N3FKze = 2577 - INTEGER(IntKi), PARAMETER :: M89N4FKze = 2578 - INTEGER(IntKi), PARAMETER :: M89N5FKze = 2579 - INTEGER(IntKi), PARAMETER :: M89N6FKze = 2580 - INTEGER(IntKi), PARAMETER :: M89N7FKze = 2581 - INTEGER(IntKi), PARAMETER :: M89N8FKze = 2582 - INTEGER(IntKi), PARAMETER :: M89N9FKze = 2583 - INTEGER(IntKi), PARAMETER :: M90N1FKze = 2584 - INTEGER(IntKi), PARAMETER :: M90N2FKze = 2585 - INTEGER(IntKi), PARAMETER :: M90N3FKze = 2586 - INTEGER(IntKi), PARAMETER :: M90N4FKze = 2587 - INTEGER(IntKi), PARAMETER :: M90N5FKze = 2588 - INTEGER(IntKi), PARAMETER :: M90N6FKze = 2589 - INTEGER(IntKi), PARAMETER :: M90N7FKze = 2590 - INTEGER(IntKi), PARAMETER :: M90N8FKze = 2591 - INTEGER(IntKi), PARAMETER :: M90N9FKze = 2592 - INTEGER(IntKi), PARAMETER :: M91N1FKze = 2593 - INTEGER(IntKi), PARAMETER :: M91N2FKze = 2594 - INTEGER(IntKi), PARAMETER :: M91N3FKze = 2595 - INTEGER(IntKi), PARAMETER :: M91N4FKze = 2596 - INTEGER(IntKi), PARAMETER :: M91N5FKze = 2597 - INTEGER(IntKi), PARAMETER :: M91N6FKze = 2598 - INTEGER(IntKi), PARAMETER :: M91N7FKze = 2599 - INTEGER(IntKi), PARAMETER :: M91N8FKze = 2600 - INTEGER(IntKi), PARAMETER :: M91N9FKze = 2601 - INTEGER(IntKi), PARAMETER :: M92N1FKze = 2602 - INTEGER(IntKi), PARAMETER :: M92N2FKze = 2603 - INTEGER(IntKi), PARAMETER :: M92N3FKze = 2604 - INTEGER(IntKi), PARAMETER :: M92N4FKze = 2605 - INTEGER(IntKi), PARAMETER :: M92N5FKze = 2606 - INTEGER(IntKi), PARAMETER :: M92N6FKze = 2607 - INTEGER(IntKi), PARAMETER :: M92N7FKze = 2608 - INTEGER(IntKi), PARAMETER :: M92N8FKze = 2609 - INTEGER(IntKi), PARAMETER :: M92N9FKze = 2610 - INTEGER(IntKi), PARAMETER :: M93N1FKze = 2611 - INTEGER(IntKi), PARAMETER :: M93N2FKze = 2612 - INTEGER(IntKi), PARAMETER :: M93N3FKze = 2613 - INTEGER(IntKi), PARAMETER :: M93N4FKze = 2614 - INTEGER(IntKi), PARAMETER :: M93N5FKze = 2615 - INTEGER(IntKi), PARAMETER :: M93N6FKze = 2616 - INTEGER(IntKi), PARAMETER :: M93N7FKze = 2617 - INTEGER(IntKi), PARAMETER :: M93N8FKze = 2618 - INTEGER(IntKi), PARAMETER :: M93N9FKze = 2619 - INTEGER(IntKi), PARAMETER :: M94N1FKze = 2620 - INTEGER(IntKi), PARAMETER :: M94N2FKze = 2621 - INTEGER(IntKi), PARAMETER :: M94N3FKze = 2622 - INTEGER(IntKi), PARAMETER :: M94N4FKze = 2623 - INTEGER(IntKi), PARAMETER :: M94N5FKze = 2624 - INTEGER(IntKi), PARAMETER :: M94N6FKze = 2625 - INTEGER(IntKi), PARAMETER :: M94N7FKze = 2626 - INTEGER(IntKi), PARAMETER :: M94N8FKze = 2627 - INTEGER(IntKi), PARAMETER :: M94N9FKze = 2628 - INTEGER(IntKi), PARAMETER :: M95N1FKze = 2629 - INTEGER(IntKi), PARAMETER :: M95N2FKze = 2630 - INTEGER(IntKi), PARAMETER :: M95N3FKze = 2631 - INTEGER(IntKi), PARAMETER :: M95N4FKze = 2632 - INTEGER(IntKi), PARAMETER :: M95N5FKze = 2633 - INTEGER(IntKi), PARAMETER :: M95N6FKze = 2634 - INTEGER(IntKi), PARAMETER :: M95N7FKze = 2635 - INTEGER(IntKi), PARAMETER :: M95N8FKze = 2636 - INTEGER(IntKi), PARAMETER :: M95N9FKze = 2637 - INTEGER(IntKi), PARAMETER :: M96N1FKze = 2638 - INTEGER(IntKi), PARAMETER :: M96N2FKze = 2639 - INTEGER(IntKi), PARAMETER :: M96N3FKze = 2640 - INTEGER(IntKi), PARAMETER :: M96N4FKze = 2641 - INTEGER(IntKi), PARAMETER :: M96N5FKze = 2642 - INTEGER(IntKi), PARAMETER :: M96N6FKze = 2643 - INTEGER(IntKi), PARAMETER :: M96N7FKze = 2644 - INTEGER(IntKi), PARAMETER :: M96N8FKze = 2645 - INTEGER(IntKi), PARAMETER :: M96N9FKze = 2646 - INTEGER(IntKi), PARAMETER :: M97N1FKze = 2647 - INTEGER(IntKi), PARAMETER :: M97N2FKze = 2648 - INTEGER(IntKi), PARAMETER :: M97N3FKze = 2649 - INTEGER(IntKi), PARAMETER :: M97N4FKze = 2650 - INTEGER(IntKi), PARAMETER :: M97N5FKze = 2651 - INTEGER(IntKi), PARAMETER :: M97N6FKze = 2652 - INTEGER(IntKi), PARAMETER :: M97N7FKze = 2653 - INTEGER(IntKi), PARAMETER :: M97N8FKze = 2654 - INTEGER(IntKi), PARAMETER :: M97N9FKze = 2655 - INTEGER(IntKi), PARAMETER :: M98N1FKze = 2656 - INTEGER(IntKi), PARAMETER :: M98N2FKze = 2657 - INTEGER(IntKi), PARAMETER :: M98N3FKze = 2658 - INTEGER(IntKi), PARAMETER :: M98N4FKze = 2659 - INTEGER(IntKi), PARAMETER :: M98N5FKze = 2660 - INTEGER(IntKi), PARAMETER :: M98N6FKze = 2661 - INTEGER(IntKi), PARAMETER :: M98N7FKze = 2662 - INTEGER(IntKi), PARAMETER :: M98N8FKze = 2663 - INTEGER(IntKi), PARAMETER :: M98N9FKze = 2664 - INTEGER(IntKi), PARAMETER :: M99N1FKze = 2665 - INTEGER(IntKi), PARAMETER :: M99N2FKze = 2666 - INTEGER(IntKi), PARAMETER :: M99N3FKze = 2667 - INTEGER(IntKi), PARAMETER :: M99N4FKze = 2668 - INTEGER(IntKi), PARAMETER :: M99N5FKze = 2669 - INTEGER(IntKi), PARAMETER :: M99N6FKze = 2670 - INTEGER(IntKi), PARAMETER :: M99N7FKze = 2671 - INTEGER(IntKi), PARAMETER :: M99N8FKze = 2672 - INTEGER(IntKi), PARAMETER :: M99N9FKze = 2673 - INTEGER(IntKi), PARAMETER :: M01N1FMxe = 2674 - INTEGER(IntKi), PARAMETER :: M01N2FMxe = 2675 - INTEGER(IntKi), PARAMETER :: M01N3FMxe = 2676 - INTEGER(IntKi), PARAMETER :: M01N4FMxe = 2677 - INTEGER(IntKi), PARAMETER :: M01N5FMxe = 2678 - INTEGER(IntKi), PARAMETER :: M01N6FMxe = 2679 - INTEGER(IntKi), PARAMETER :: M01N7FMxe = 2680 - INTEGER(IntKi), PARAMETER :: M01N8FMxe = 2681 - INTEGER(IntKi), PARAMETER :: M01N9FMxe = 2682 - INTEGER(IntKi), PARAMETER :: M02N1FMxe = 2683 - INTEGER(IntKi), PARAMETER :: M02N2FMxe = 2684 - INTEGER(IntKi), PARAMETER :: M02N3FMxe = 2685 - INTEGER(IntKi), PARAMETER :: M02N4FMxe = 2686 - INTEGER(IntKi), PARAMETER :: M02N5FMxe = 2687 - INTEGER(IntKi), PARAMETER :: M02N6FMxe = 2688 - INTEGER(IntKi), PARAMETER :: M02N7FMxe = 2689 - INTEGER(IntKi), PARAMETER :: M02N8FMxe = 2690 - INTEGER(IntKi), PARAMETER :: M02N9FMxe = 2691 - INTEGER(IntKi), PARAMETER :: M03N1FMxe = 2692 - INTEGER(IntKi), PARAMETER :: M03N2FMxe = 2693 - INTEGER(IntKi), PARAMETER :: M03N3FMxe = 2694 - INTEGER(IntKi), PARAMETER :: M03N4FMxe = 2695 - INTEGER(IntKi), PARAMETER :: M03N5FMxe = 2696 - INTEGER(IntKi), PARAMETER :: M03N6FMxe = 2697 - INTEGER(IntKi), PARAMETER :: M03N7FMxe = 2698 - INTEGER(IntKi), PARAMETER :: M03N8FMxe = 2699 - INTEGER(IntKi), PARAMETER :: M03N9FMxe = 2700 - INTEGER(IntKi), PARAMETER :: M04N1FMxe = 2701 - INTEGER(IntKi), PARAMETER :: M04N2FMxe = 2702 - INTEGER(IntKi), PARAMETER :: M04N3FMxe = 2703 - INTEGER(IntKi), PARAMETER :: M04N4FMxe = 2704 - INTEGER(IntKi), PARAMETER :: M04N5FMxe = 2705 - INTEGER(IntKi), PARAMETER :: M04N6FMxe = 2706 - INTEGER(IntKi), PARAMETER :: M04N7FMxe = 2707 - INTEGER(IntKi), PARAMETER :: M04N8FMxe = 2708 - INTEGER(IntKi), PARAMETER :: M04N9FMxe = 2709 - INTEGER(IntKi), PARAMETER :: M05N1FMxe = 2710 - INTEGER(IntKi), PARAMETER :: M05N2FMxe = 2711 - INTEGER(IntKi), PARAMETER :: M05N3FMxe = 2712 - INTEGER(IntKi), PARAMETER :: M05N4FMxe = 2713 - INTEGER(IntKi), PARAMETER :: M05N5FMxe = 2714 - INTEGER(IntKi), PARAMETER :: M05N6FMxe = 2715 - INTEGER(IntKi), PARAMETER :: M05N7FMxe = 2716 - INTEGER(IntKi), PARAMETER :: M05N8FMxe = 2717 - INTEGER(IntKi), PARAMETER :: M05N9FMxe = 2718 - INTEGER(IntKi), PARAMETER :: M06N1FMxe = 2719 - INTEGER(IntKi), PARAMETER :: M06N2FMxe = 2720 - INTEGER(IntKi), PARAMETER :: M06N3FMxe = 2721 - INTEGER(IntKi), PARAMETER :: M06N4FMxe = 2722 - INTEGER(IntKi), PARAMETER :: M06N5FMxe = 2723 - INTEGER(IntKi), PARAMETER :: M06N6FMxe = 2724 - INTEGER(IntKi), PARAMETER :: M06N7FMxe = 2725 - INTEGER(IntKi), PARAMETER :: M06N8FMxe = 2726 - INTEGER(IntKi), PARAMETER :: M06N9FMxe = 2727 - INTEGER(IntKi), PARAMETER :: M07N1FMxe = 2728 - INTEGER(IntKi), PARAMETER :: M07N2FMxe = 2729 - INTEGER(IntKi), PARAMETER :: M07N3FMxe = 2730 - INTEGER(IntKi), PARAMETER :: M07N4FMxe = 2731 - INTEGER(IntKi), PARAMETER :: M07N5FMxe = 2732 - INTEGER(IntKi), PARAMETER :: M07N6FMxe = 2733 - INTEGER(IntKi), PARAMETER :: M07N7FMxe = 2734 - INTEGER(IntKi), PARAMETER :: M07N8FMxe = 2735 - INTEGER(IntKi), PARAMETER :: M07N9FMxe = 2736 - INTEGER(IntKi), PARAMETER :: M08N1FMxe = 2737 - INTEGER(IntKi), PARAMETER :: M08N2FMxe = 2738 - INTEGER(IntKi), PARAMETER :: M08N3FMxe = 2739 - INTEGER(IntKi), PARAMETER :: M08N4FMxe = 2740 - INTEGER(IntKi), PARAMETER :: M08N5FMxe = 2741 - INTEGER(IntKi), PARAMETER :: M08N6FMxe = 2742 - INTEGER(IntKi), PARAMETER :: M08N7FMxe = 2743 - INTEGER(IntKi), PARAMETER :: M08N8FMxe = 2744 - INTEGER(IntKi), PARAMETER :: M08N9FMxe = 2745 - INTEGER(IntKi), PARAMETER :: M09N1FMxe = 2746 - INTEGER(IntKi), PARAMETER :: M09N2FMxe = 2747 - INTEGER(IntKi), PARAMETER :: M09N3FMxe = 2748 - INTEGER(IntKi), PARAMETER :: M09N4FMxe = 2749 - INTEGER(IntKi), PARAMETER :: M09N5FMxe = 2750 - INTEGER(IntKi), PARAMETER :: M09N6FMxe = 2751 - INTEGER(IntKi), PARAMETER :: M09N7FMxe = 2752 - INTEGER(IntKi), PARAMETER :: M09N8FMxe = 2753 - INTEGER(IntKi), PARAMETER :: M09N9FMxe = 2754 - INTEGER(IntKi), PARAMETER :: M10N1FMxe = 2755 - INTEGER(IntKi), PARAMETER :: M10N2FMxe = 2756 - INTEGER(IntKi), PARAMETER :: M10N3FMxe = 2757 - INTEGER(IntKi), PARAMETER :: M10N4FMxe = 2758 - INTEGER(IntKi), PARAMETER :: M10N5FMxe = 2759 - INTEGER(IntKi), PARAMETER :: M10N6FMxe = 2760 - INTEGER(IntKi), PARAMETER :: M10N7FMxe = 2761 - INTEGER(IntKi), PARAMETER :: M10N8FMxe = 2762 - INTEGER(IntKi), PARAMETER :: M10N9FMxe = 2763 - INTEGER(IntKi), PARAMETER :: M11N1FMxe = 2764 - INTEGER(IntKi), PARAMETER :: M11N2FMxe = 2765 - INTEGER(IntKi), PARAMETER :: M11N3FMxe = 2766 - INTEGER(IntKi), PARAMETER :: M11N4FMxe = 2767 - INTEGER(IntKi), PARAMETER :: M11N5FMxe = 2768 - INTEGER(IntKi), PARAMETER :: M11N6FMxe = 2769 - INTEGER(IntKi), PARAMETER :: M11N7FMxe = 2770 - INTEGER(IntKi), PARAMETER :: M11N8FMxe = 2771 - INTEGER(IntKi), PARAMETER :: M11N9FMxe = 2772 - INTEGER(IntKi), PARAMETER :: M12N1FMxe = 2773 - INTEGER(IntKi), PARAMETER :: M12N2FMxe = 2774 - INTEGER(IntKi), PARAMETER :: M12N3FMxe = 2775 - INTEGER(IntKi), PARAMETER :: M12N4FMxe = 2776 - INTEGER(IntKi), PARAMETER :: M12N5FMxe = 2777 - INTEGER(IntKi), PARAMETER :: M12N6FMxe = 2778 - INTEGER(IntKi), PARAMETER :: M12N7FMxe = 2779 - INTEGER(IntKi), PARAMETER :: M12N8FMxe = 2780 - INTEGER(IntKi), PARAMETER :: M12N9FMxe = 2781 - INTEGER(IntKi), PARAMETER :: M13N1FMxe = 2782 - INTEGER(IntKi), PARAMETER :: M13N2FMxe = 2783 - INTEGER(IntKi), PARAMETER :: M13N3FMxe = 2784 - INTEGER(IntKi), PARAMETER :: M13N4FMxe = 2785 - INTEGER(IntKi), PARAMETER :: M13N5FMxe = 2786 - INTEGER(IntKi), PARAMETER :: M13N6FMxe = 2787 - INTEGER(IntKi), PARAMETER :: M13N7FMxe = 2788 - INTEGER(IntKi), PARAMETER :: M13N8FMxe = 2789 - INTEGER(IntKi), PARAMETER :: M13N9FMxe = 2790 - INTEGER(IntKi), PARAMETER :: M14N1FMxe = 2791 - INTEGER(IntKi), PARAMETER :: M14N2FMxe = 2792 - INTEGER(IntKi), PARAMETER :: M14N3FMxe = 2793 - INTEGER(IntKi), PARAMETER :: M14N4FMxe = 2794 - INTEGER(IntKi), PARAMETER :: M14N5FMxe = 2795 - INTEGER(IntKi), PARAMETER :: M14N6FMxe = 2796 - INTEGER(IntKi), PARAMETER :: M14N7FMxe = 2797 - INTEGER(IntKi), PARAMETER :: M14N8FMxe = 2798 - INTEGER(IntKi), PARAMETER :: M14N9FMxe = 2799 - INTEGER(IntKi), PARAMETER :: M15N1FMxe = 2800 - INTEGER(IntKi), PARAMETER :: M15N2FMxe = 2801 - INTEGER(IntKi), PARAMETER :: M15N3FMxe = 2802 - INTEGER(IntKi), PARAMETER :: M15N4FMxe = 2803 - INTEGER(IntKi), PARAMETER :: M15N5FMxe = 2804 - INTEGER(IntKi), PARAMETER :: M15N6FMxe = 2805 - INTEGER(IntKi), PARAMETER :: M15N7FMxe = 2806 - INTEGER(IntKi), PARAMETER :: M15N8FMxe = 2807 - INTEGER(IntKi), PARAMETER :: M15N9FMxe = 2808 - INTEGER(IntKi), PARAMETER :: M16N1FMxe = 2809 - INTEGER(IntKi), PARAMETER :: M16N2FMxe = 2810 - INTEGER(IntKi), PARAMETER :: M16N3FMxe = 2811 - INTEGER(IntKi), PARAMETER :: M16N4FMxe = 2812 - INTEGER(IntKi), PARAMETER :: M16N5FMxe = 2813 - INTEGER(IntKi), PARAMETER :: M16N6FMxe = 2814 - INTEGER(IntKi), PARAMETER :: M16N7FMxe = 2815 - INTEGER(IntKi), PARAMETER :: M16N8FMxe = 2816 - INTEGER(IntKi), PARAMETER :: M16N9FMxe = 2817 - INTEGER(IntKi), PARAMETER :: M17N1FMxe = 2818 - INTEGER(IntKi), PARAMETER :: M17N2FMxe = 2819 - INTEGER(IntKi), PARAMETER :: M17N3FMxe = 2820 - INTEGER(IntKi), PARAMETER :: M17N4FMxe = 2821 - INTEGER(IntKi), PARAMETER :: M17N5FMxe = 2822 - INTEGER(IntKi), PARAMETER :: M17N6FMxe = 2823 - INTEGER(IntKi), PARAMETER :: M17N7FMxe = 2824 - INTEGER(IntKi), PARAMETER :: M17N8FMxe = 2825 - INTEGER(IntKi), PARAMETER :: M17N9FMxe = 2826 - INTEGER(IntKi), PARAMETER :: M18N1FMxe = 2827 - INTEGER(IntKi), PARAMETER :: M18N2FMxe = 2828 - INTEGER(IntKi), PARAMETER :: M18N3FMxe = 2829 - INTEGER(IntKi), PARAMETER :: M18N4FMxe = 2830 - INTEGER(IntKi), PARAMETER :: M18N5FMxe = 2831 - INTEGER(IntKi), PARAMETER :: M18N6FMxe = 2832 - INTEGER(IntKi), PARAMETER :: M18N7FMxe = 2833 - INTEGER(IntKi), PARAMETER :: M18N8FMxe = 2834 - INTEGER(IntKi), PARAMETER :: M18N9FMxe = 2835 - INTEGER(IntKi), PARAMETER :: M19N1FMxe = 2836 - INTEGER(IntKi), PARAMETER :: M19N2FMxe = 2837 - INTEGER(IntKi), PARAMETER :: M19N3FMxe = 2838 - INTEGER(IntKi), PARAMETER :: M19N4FMxe = 2839 - INTEGER(IntKi), PARAMETER :: M19N5FMxe = 2840 - INTEGER(IntKi), PARAMETER :: M19N6FMxe = 2841 - INTEGER(IntKi), PARAMETER :: M19N7FMxe = 2842 - INTEGER(IntKi), PARAMETER :: M19N8FMxe = 2843 - INTEGER(IntKi), PARAMETER :: M19N9FMxe = 2844 - INTEGER(IntKi), PARAMETER :: M20N1FMxe = 2845 - INTEGER(IntKi), PARAMETER :: M20N2FMxe = 2846 - INTEGER(IntKi), PARAMETER :: M20N3FMxe = 2847 - INTEGER(IntKi), PARAMETER :: M20N4FMxe = 2848 - INTEGER(IntKi), PARAMETER :: M20N5FMxe = 2849 - INTEGER(IntKi), PARAMETER :: M20N6FMxe = 2850 - INTEGER(IntKi), PARAMETER :: M20N7FMxe = 2851 - INTEGER(IntKi), PARAMETER :: M20N8FMxe = 2852 - INTEGER(IntKi), PARAMETER :: M20N9FMxe = 2853 - INTEGER(IntKi), PARAMETER :: M21N1FMxe = 2854 - INTEGER(IntKi), PARAMETER :: M21N2FMxe = 2855 - INTEGER(IntKi), PARAMETER :: M21N3FMxe = 2856 - INTEGER(IntKi), PARAMETER :: M21N4FMxe = 2857 - INTEGER(IntKi), PARAMETER :: M21N5FMxe = 2858 - INTEGER(IntKi), PARAMETER :: M21N6FMxe = 2859 - INTEGER(IntKi), PARAMETER :: M21N7FMxe = 2860 - INTEGER(IntKi), PARAMETER :: M21N8FMxe = 2861 - INTEGER(IntKi), PARAMETER :: M21N9FMxe = 2862 - INTEGER(IntKi), PARAMETER :: M22N1FMxe = 2863 - INTEGER(IntKi), PARAMETER :: M22N2FMxe = 2864 - INTEGER(IntKi), PARAMETER :: M22N3FMxe = 2865 - INTEGER(IntKi), PARAMETER :: M22N4FMxe = 2866 - INTEGER(IntKi), PARAMETER :: M22N5FMxe = 2867 - INTEGER(IntKi), PARAMETER :: M22N6FMxe = 2868 - INTEGER(IntKi), PARAMETER :: M22N7FMxe = 2869 - INTEGER(IntKi), PARAMETER :: M22N8FMxe = 2870 - INTEGER(IntKi), PARAMETER :: M22N9FMxe = 2871 - INTEGER(IntKi), PARAMETER :: M23N1FMxe = 2872 - INTEGER(IntKi), PARAMETER :: M23N2FMxe = 2873 - INTEGER(IntKi), PARAMETER :: M23N3FMxe = 2874 - INTEGER(IntKi), PARAMETER :: M23N4FMxe = 2875 - INTEGER(IntKi), PARAMETER :: M23N5FMxe = 2876 - INTEGER(IntKi), PARAMETER :: M23N6FMxe = 2877 - INTEGER(IntKi), PARAMETER :: M23N7FMxe = 2878 - INTEGER(IntKi), PARAMETER :: M23N8FMxe = 2879 - INTEGER(IntKi), PARAMETER :: M23N9FMxe = 2880 - INTEGER(IntKi), PARAMETER :: M24N1FMxe = 2881 - INTEGER(IntKi), PARAMETER :: M24N2FMxe = 2882 - INTEGER(IntKi), PARAMETER :: M24N3FMxe = 2883 - INTEGER(IntKi), PARAMETER :: M24N4FMxe = 2884 - INTEGER(IntKi), PARAMETER :: M24N5FMxe = 2885 - INTEGER(IntKi), PARAMETER :: M24N6FMxe = 2886 - INTEGER(IntKi), PARAMETER :: M24N7FMxe = 2887 - INTEGER(IntKi), PARAMETER :: M24N8FMxe = 2888 - INTEGER(IntKi), PARAMETER :: M24N9FMxe = 2889 - INTEGER(IntKi), PARAMETER :: M25N1FMxe = 2890 - INTEGER(IntKi), PARAMETER :: M25N2FMxe = 2891 - INTEGER(IntKi), PARAMETER :: M25N3FMxe = 2892 - INTEGER(IntKi), PARAMETER :: M25N4FMxe = 2893 - INTEGER(IntKi), PARAMETER :: M25N5FMxe = 2894 - INTEGER(IntKi), PARAMETER :: M25N6FMxe = 2895 - INTEGER(IntKi), PARAMETER :: M25N7FMxe = 2896 - INTEGER(IntKi), PARAMETER :: M25N8FMxe = 2897 - INTEGER(IntKi), PARAMETER :: M25N9FMxe = 2898 - INTEGER(IntKi), PARAMETER :: M26N1FMxe = 2899 - INTEGER(IntKi), PARAMETER :: M26N2FMxe = 2900 - INTEGER(IntKi), PARAMETER :: M26N3FMxe = 2901 - INTEGER(IntKi), PARAMETER :: M26N4FMxe = 2902 - INTEGER(IntKi), PARAMETER :: M26N5FMxe = 2903 - INTEGER(IntKi), PARAMETER :: M26N6FMxe = 2904 - INTEGER(IntKi), PARAMETER :: M26N7FMxe = 2905 - INTEGER(IntKi), PARAMETER :: M26N8FMxe = 2906 - INTEGER(IntKi), PARAMETER :: M26N9FMxe = 2907 - INTEGER(IntKi), PARAMETER :: M27N1FMxe = 2908 - INTEGER(IntKi), PARAMETER :: M27N2FMxe = 2909 - INTEGER(IntKi), PARAMETER :: M27N3FMxe = 2910 - INTEGER(IntKi), PARAMETER :: M27N4FMxe = 2911 - INTEGER(IntKi), PARAMETER :: M27N5FMxe = 2912 - INTEGER(IntKi), PARAMETER :: M27N6FMxe = 2913 - INTEGER(IntKi), PARAMETER :: M27N7FMxe = 2914 - INTEGER(IntKi), PARAMETER :: M27N8FMxe = 2915 - INTEGER(IntKi), PARAMETER :: M27N9FMxe = 2916 - INTEGER(IntKi), PARAMETER :: M28N1FMxe = 2917 - INTEGER(IntKi), PARAMETER :: M28N2FMxe = 2918 - INTEGER(IntKi), PARAMETER :: M28N3FMxe = 2919 - INTEGER(IntKi), PARAMETER :: M28N4FMxe = 2920 - INTEGER(IntKi), PARAMETER :: M28N5FMxe = 2921 - INTEGER(IntKi), PARAMETER :: M28N6FMxe = 2922 - INTEGER(IntKi), PARAMETER :: M28N7FMxe = 2923 - INTEGER(IntKi), PARAMETER :: M28N8FMxe = 2924 - INTEGER(IntKi), PARAMETER :: M28N9FMxe = 2925 - INTEGER(IntKi), PARAMETER :: M29N1FMxe = 2926 - INTEGER(IntKi), PARAMETER :: M29N2FMxe = 2927 - INTEGER(IntKi), PARAMETER :: M29N3FMxe = 2928 - INTEGER(IntKi), PARAMETER :: M29N4FMxe = 2929 - INTEGER(IntKi), PARAMETER :: M29N5FMxe = 2930 - INTEGER(IntKi), PARAMETER :: M29N6FMxe = 2931 - INTEGER(IntKi), PARAMETER :: M29N7FMxe = 2932 - INTEGER(IntKi), PARAMETER :: M29N8FMxe = 2933 - INTEGER(IntKi), PARAMETER :: M29N9FMxe = 2934 - INTEGER(IntKi), PARAMETER :: M30N1FMxe = 2935 - INTEGER(IntKi), PARAMETER :: M30N2FMxe = 2936 - INTEGER(IntKi), PARAMETER :: M30N3FMxe = 2937 - INTEGER(IntKi), PARAMETER :: M30N4FMxe = 2938 - INTEGER(IntKi), PARAMETER :: M30N5FMxe = 2939 - INTEGER(IntKi), PARAMETER :: M30N6FMxe = 2940 - INTEGER(IntKi), PARAMETER :: M30N7FMxe = 2941 - INTEGER(IntKi), PARAMETER :: M30N8FMxe = 2942 - INTEGER(IntKi), PARAMETER :: M30N9FMxe = 2943 - INTEGER(IntKi), PARAMETER :: M31N1FMxe = 2944 - INTEGER(IntKi), PARAMETER :: M31N2FMxe = 2945 - INTEGER(IntKi), PARAMETER :: M31N3FMxe = 2946 - INTEGER(IntKi), PARAMETER :: M31N4FMxe = 2947 - INTEGER(IntKi), PARAMETER :: M31N5FMxe = 2948 - INTEGER(IntKi), PARAMETER :: M31N6FMxe = 2949 - INTEGER(IntKi), PARAMETER :: M31N7FMxe = 2950 - INTEGER(IntKi), PARAMETER :: M31N8FMxe = 2951 - INTEGER(IntKi), PARAMETER :: M31N9FMxe = 2952 - INTEGER(IntKi), PARAMETER :: M32N1FMxe = 2953 - INTEGER(IntKi), PARAMETER :: M32N2FMxe = 2954 - INTEGER(IntKi), PARAMETER :: M32N3FMxe = 2955 - INTEGER(IntKi), PARAMETER :: M32N4FMxe = 2956 - INTEGER(IntKi), PARAMETER :: M32N5FMxe = 2957 - INTEGER(IntKi), PARAMETER :: M32N6FMxe = 2958 - INTEGER(IntKi), PARAMETER :: M32N7FMxe = 2959 - INTEGER(IntKi), PARAMETER :: M32N8FMxe = 2960 - INTEGER(IntKi), PARAMETER :: M32N9FMxe = 2961 - INTEGER(IntKi), PARAMETER :: M33N1FMxe = 2962 - INTEGER(IntKi), PARAMETER :: M33N2FMxe = 2963 - INTEGER(IntKi), PARAMETER :: M33N3FMxe = 2964 - INTEGER(IntKi), PARAMETER :: M33N4FMxe = 2965 - INTEGER(IntKi), PARAMETER :: M33N5FMxe = 2966 - INTEGER(IntKi), PARAMETER :: M33N6FMxe = 2967 - INTEGER(IntKi), PARAMETER :: M33N7FMxe = 2968 - INTEGER(IntKi), PARAMETER :: M33N8FMxe = 2969 - INTEGER(IntKi), PARAMETER :: M33N9FMxe = 2970 - INTEGER(IntKi), PARAMETER :: M34N1FMxe = 2971 - INTEGER(IntKi), PARAMETER :: M34N2FMxe = 2972 - INTEGER(IntKi), PARAMETER :: M34N3FMxe = 2973 - INTEGER(IntKi), PARAMETER :: M34N4FMxe = 2974 - INTEGER(IntKi), PARAMETER :: M34N5FMxe = 2975 - INTEGER(IntKi), PARAMETER :: M34N6FMxe = 2976 - INTEGER(IntKi), PARAMETER :: M34N7FMxe = 2977 - INTEGER(IntKi), PARAMETER :: M34N8FMxe = 2978 - INTEGER(IntKi), PARAMETER :: M34N9FMxe = 2979 - INTEGER(IntKi), PARAMETER :: M35N1FMxe = 2980 - INTEGER(IntKi), PARAMETER :: M35N2FMxe = 2981 - INTEGER(IntKi), PARAMETER :: M35N3FMxe = 2982 - INTEGER(IntKi), PARAMETER :: M35N4FMxe = 2983 - INTEGER(IntKi), PARAMETER :: M35N5FMxe = 2984 - INTEGER(IntKi), PARAMETER :: M35N6FMxe = 2985 - INTEGER(IntKi), PARAMETER :: M35N7FMxe = 2986 - INTEGER(IntKi), PARAMETER :: M35N8FMxe = 2987 - INTEGER(IntKi), PARAMETER :: M35N9FMxe = 2988 - INTEGER(IntKi), PARAMETER :: M36N1FMxe = 2989 - INTEGER(IntKi), PARAMETER :: M36N2FMxe = 2990 - INTEGER(IntKi), PARAMETER :: M36N3FMxe = 2991 - INTEGER(IntKi), PARAMETER :: M36N4FMxe = 2992 - INTEGER(IntKi), PARAMETER :: M36N5FMxe = 2993 - INTEGER(IntKi), PARAMETER :: M36N6FMxe = 2994 - INTEGER(IntKi), PARAMETER :: M36N7FMxe = 2995 - INTEGER(IntKi), PARAMETER :: M36N8FMxe = 2996 - INTEGER(IntKi), PARAMETER :: M36N9FMxe = 2997 - INTEGER(IntKi), PARAMETER :: M37N1FMxe = 2998 - INTEGER(IntKi), PARAMETER :: M37N2FMxe = 2999 - INTEGER(IntKi), PARAMETER :: M37N3FMxe = 3000 - INTEGER(IntKi), PARAMETER :: M37N4FMxe = 3001 - INTEGER(IntKi), PARAMETER :: M37N5FMxe = 3002 - INTEGER(IntKi), PARAMETER :: M37N6FMxe = 3003 - INTEGER(IntKi), PARAMETER :: M37N7FMxe = 3004 - INTEGER(IntKi), PARAMETER :: M37N8FMxe = 3005 - INTEGER(IntKi), PARAMETER :: M37N9FMxe = 3006 - INTEGER(IntKi), PARAMETER :: M38N1FMxe = 3007 - INTEGER(IntKi), PARAMETER :: M38N2FMxe = 3008 - INTEGER(IntKi), PARAMETER :: M38N3FMxe = 3009 - INTEGER(IntKi), PARAMETER :: M38N4FMxe = 3010 - INTEGER(IntKi), PARAMETER :: M38N5FMxe = 3011 - INTEGER(IntKi), PARAMETER :: M38N6FMxe = 3012 - INTEGER(IntKi), PARAMETER :: M38N7FMxe = 3013 - INTEGER(IntKi), PARAMETER :: M38N8FMxe = 3014 - INTEGER(IntKi), PARAMETER :: M38N9FMxe = 3015 - INTEGER(IntKi), PARAMETER :: M39N1FMxe = 3016 - INTEGER(IntKi), PARAMETER :: M39N2FMxe = 3017 - INTEGER(IntKi), PARAMETER :: M39N3FMxe = 3018 - INTEGER(IntKi), PARAMETER :: M39N4FMxe = 3019 - INTEGER(IntKi), PARAMETER :: M39N5FMxe = 3020 - INTEGER(IntKi), PARAMETER :: M39N6FMxe = 3021 - INTEGER(IntKi), PARAMETER :: M39N7FMxe = 3022 - INTEGER(IntKi), PARAMETER :: M39N8FMxe = 3023 - INTEGER(IntKi), PARAMETER :: M39N9FMxe = 3024 - INTEGER(IntKi), PARAMETER :: M40N1FMxe = 3025 - INTEGER(IntKi), PARAMETER :: M40N2FMxe = 3026 - INTEGER(IntKi), PARAMETER :: M40N3FMxe = 3027 - INTEGER(IntKi), PARAMETER :: M40N4FMxe = 3028 - INTEGER(IntKi), PARAMETER :: M40N5FMxe = 3029 - INTEGER(IntKi), PARAMETER :: M40N6FMxe = 3030 - INTEGER(IntKi), PARAMETER :: M40N7FMxe = 3031 - INTEGER(IntKi), PARAMETER :: M40N8FMxe = 3032 - INTEGER(IntKi), PARAMETER :: M40N9FMxe = 3033 - INTEGER(IntKi), PARAMETER :: M41N1FMxe = 3034 - INTEGER(IntKi), PARAMETER :: M41N2FMxe = 3035 - INTEGER(IntKi), PARAMETER :: M41N3FMxe = 3036 - INTEGER(IntKi), PARAMETER :: M41N4FMxe = 3037 - INTEGER(IntKi), PARAMETER :: M41N5FMxe = 3038 - INTEGER(IntKi), PARAMETER :: M41N6FMxe = 3039 - INTEGER(IntKi), PARAMETER :: M41N7FMxe = 3040 - INTEGER(IntKi), PARAMETER :: M41N8FMxe = 3041 - INTEGER(IntKi), PARAMETER :: M41N9FMxe = 3042 - INTEGER(IntKi), PARAMETER :: M42N1FMxe = 3043 - INTEGER(IntKi), PARAMETER :: M42N2FMxe = 3044 - INTEGER(IntKi), PARAMETER :: M42N3FMxe = 3045 - INTEGER(IntKi), PARAMETER :: M42N4FMxe = 3046 - INTEGER(IntKi), PARAMETER :: M42N5FMxe = 3047 - INTEGER(IntKi), PARAMETER :: M42N6FMxe = 3048 - INTEGER(IntKi), PARAMETER :: M42N7FMxe = 3049 - INTEGER(IntKi), PARAMETER :: M42N8FMxe = 3050 - INTEGER(IntKi), PARAMETER :: M42N9FMxe = 3051 - INTEGER(IntKi), PARAMETER :: M43N1FMxe = 3052 - INTEGER(IntKi), PARAMETER :: M43N2FMxe = 3053 - INTEGER(IntKi), PARAMETER :: M43N3FMxe = 3054 - INTEGER(IntKi), PARAMETER :: M43N4FMxe = 3055 - INTEGER(IntKi), PARAMETER :: M43N5FMxe = 3056 - INTEGER(IntKi), PARAMETER :: M43N6FMxe = 3057 - INTEGER(IntKi), PARAMETER :: M43N7FMxe = 3058 - INTEGER(IntKi), PARAMETER :: M43N8FMxe = 3059 - INTEGER(IntKi), PARAMETER :: M43N9FMxe = 3060 - INTEGER(IntKi), PARAMETER :: M44N1FMxe = 3061 - INTEGER(IntKi), PARAMETER :: M44N2FMxe = 3062 - INTEGER(IntKi), PARAMETER :: M44N3FMxe = 3063 - INTEGER(IntKi), PARAMETER :: M44N4FMxe = 3064 - INTEGER(IntKi), PARAMETER :: M44N5FMxe = 3065 - INTEGER(IntKi), PARAMETER :: M44N6FMxe = 3066 - INTEGER(IntKi), PARAMETER :: M44N7FMxe = 3067 - INTEGER(IntKi), PARAMETER :: M44N8FMxe = 3068 - INTEGER(IntKi), PARAMETER :: M44N9FMxe = 3069 - INTEGER(IntKi), PARAMETER :: M45N1FMxe = 3070 - INTEGER(IntKi), PARAMETER :: M45N2FMxe = 3071 - INTEGER(IntKi), PARAMETER :: M45N3FMxe = 3072 - INTEGER(IntKi), PARAMETER :: M45N4FMxe = 3073 - INTEGER(IntKi), PARAMETER :: M45N5FMxe = 3074 - INTEGER(IntKi), PARAMETER :: M45N6FMxe = 3075 - INTEGER(IntKi), PARAMETER :: M45N7FMxe = 3076 - INTEGER(IntKi), PARAMETER :: M45N8FMxe = 3077 - INTEGER(IntKi), PARAMETER :: M45N9FMxe = 3078 - INTEGER(IntKi), PARAMETER :: M46N1FMxe = 3079 - INTEGER(IntKi), PARAMETER :: M46N2FMxe = 3080 - INTEGER(IntKi), PARAMETER :: M46N3FMxe = 3081 - INTEGER(IntKi), PARAMETER :: M46N4FMxe = 3082 - INTEGER(IntKi), PARAMETER :: M46N5FMxe = 3083 - INTEGER(IntKi), PARAMETER :: M46N6FMxe = 3084 - INTEGER(IntKi), PARAMETER :: M46N7FMxe = 3085 - INTEGER(IntKi), PARAMETER :: M46N8FMxe = 3086 - INTEGER(IntKi), PARAMETER :: M46N9FMxe = 3087 - INTEGER(IntKi), PARAMETER :: M47N1FMxe = 3088 - INTEGER(IntKi), PARAMETER :: M47N2FMxe = 3089 - INTEGER(IntKi), PARAMETER :: M47N3FMxe = 3090 - INTEGER(IntKi), PARAMETER :: M47N4FMxe = 3091 - INTEGER(IntKi), PARAMETER :: M47N5FMxe = 3092 - INTEGER(IntKi), PARAMETER :: M47N6FMxe = 3093 - INTEGER(IntKi), PARAMETER :: M47N7FMxe = 3094 - INTEGER(IntKi), PARAMETER :: M47N8FMxe = 3095 - INTEGER(IntKi), PARAMETER :: M47N9FMxe = 3096 - INTEGER(IntKi), PARAMETER :: M48N1FMxe = 3097 - INTEGER(IntKi), PARAMETER :: M48N2FMxe = 3098 - INTEGER(IntKi), PARAMETER :: M48N3FMxe = 3099 - INTEGER(IntKi), PARAMETER :: M48N4FMxe = 3100 - INTEGER(IntKi), PARAMETER :: M48N5FMxe = 3101 - INTEGER(IntKi), PARAMETER :: M48N6FMxe = 3102 - INTEGER(IntKi), PARAMETER :: M48N7FMxe = 3103 - INTEGER(IntKi), PARAMETER :: M48N8FMxe = 3104 - INTEGER(IntKi), PARAMETER :: M48N9FMxe = 3105 - INTEGER(IntKi), PARAMETER :: M49N1FMxe = 3106 - INTEGER(IntKi), PARAMETER :: M49N2FMxe = 3107 - INTEGER(IntKi), PARAMETER :: M49N3FMxe = 3108 - INTEGER(IntKi), PARAMETER :: M49N4FMxe = 3109 - INTEGER(IntKi), PARAMETER :: M49N5FMxe = 3110 - INTEGER(IntKi), PARAMETER :: M49N6FMxe = 3111 - INTEGER(IntKi), PARAMETER :: M49N7FMxe = 3112 - INTEGER(IntKi), PARAMETER :: M49N8FMxe = 3113 - INTEGER(IntKi), PARAMETER :: M49N9FMxe = 3114 - INTEGER(IntKi), PARAMETER :: M50N1FMxe = 3115 - INTEGER(IntKi), PARAMETER :: M50N2FMxe = 3116 - INTEGER(IntKi), PARAMETER :: M50N3FMxe = 3117 - INTEGER(IntKi), PARAMETER :: M50N4FMxe = 3118 - INTEGER(IntKi), PARAMETER :: M50N5FMxe = 3119 - INTEGER(IntKi), PARAMETER :: M50N6FMxe = 3120 - INTEGER(IntKi), PARAMETER :: M50N7FMxe = 3121 - INTEGER(IntKi), PARAMETER :: M50N8FMxe = 3122 - INTEGER(IntKi), PARAMETER :: M50N9FMxe = 3123 - INTEGER(IntKi), PARAMETER :: M51N1FMxe = 3124 - INTEGER(IntKi), PARAMETER :: M51N2FMxe = 3125 - INTEGER(IntKi), PARAMETER :: M51N3FMxe = 3126 - INTEGER(IntKi), PARAMETER :: M51N4FMxe = 3127 - INTEGER(IntKi), PARAMETER :: M51N5FMxe = 3128 - INTEGER(IntKi), PARAMETER :: M51N6FMxe = 3129 - INTEGER(IntKi), PARAMETER :: M51N7FMxe = 3130 - INTEGER(IntKi), PARAMETER :: M51N8FMxe = 3131 - INTEGER(IntKi), PARAMETER :: M51N9FMxe = 3132 - INTEGER(IntKi), PARAMETER :: M52N1FMxe = 3133 - INTEGER(IntKi), PARAMETER :: M52N2FMxe = 3134 - INTEGER(IntKi), PARAMETER :: M52N3FMxe = 3135 - INTEGER(IntKi), PARAMETER :: M52N4FMxe = 3136 - INTEGER(IntKi), PARAMETER :: M52N5FMxe = 3137 - INTEGER(IntKi), PARAMETER :: M52N6FMxe = 3138 - INTEGER(IntKi), PARAMETER :: M52N7FMxe = 3139 - INTEGER(IntKi), PARAMETER :: M52N8FMxe = 3140 - INTEGER(IntKi), PARAMETER :: M52N9FMxe = 3141 - INTEGER(IntKi), PARAMETER :: M53N1FMxe = 3142 - INTEGER(IntKi), PARAMETER :: M53N2FMxe = 3143 - INTEGER(IntKi), PARAMETER :: M53N3FMxe = 3144 - INTEGER(IntKi), PARAMETER :: M53N4FMxe = 3145 - INTEGER(IntKi), PARAMETER :: M53N5FMxe = 3146 - INTEGER(IntKi), PARAMETER :: M53N6FMxe = 3147 - INTEGER(IntKi), PARAMETER :: M53N7FMxe = 3148 - INTEGER(IntKi), PARAMETER :: M53N8FMxe = 3149 - INTEGER(IntKi), PARAMETER :: M53N9FMxe = 3150 - INTEGER(IntKi), PARAMETER :: M54N1FMxe = 3151 - INTEGER(IntKi), PARAMETER :: M54N2FMxe = 3152 - INTEGER(IntKi), PARAMETER :: M54N3FMxe = 3153 - INTEGER(IntKi), PARAMETER :: M54N4FMxe = 3154 - INTEGER(IntKi), PARAMETER :: M54N5FMxe = 3155 - INTEGER(IntKi), PARAMETER :: M54N6FMxe = 3156 - INTEGER(IntKi), PARAMETER :: M54N7FMxe = 3157 - INTEGER(IntKi), PARAMETER :: M54N8FMxe = 3158 - INTEGER(IntKi), PARAMETER :: M54N9FMxe = 3159 - INTEGER(IntKi), PARAMETER :: M55N1FMxe = 3160 - INTEGER(IntKi), PARAMETER :: M55N2FMxe = 3161 - INTEGER(IntKi), PARAMETER :: M55N3FMxe = 3162 - INTEGER(IntKi), PARAMETER :: M55N4FMxe = 3163 - INTEGER(IntKi), PARAMETER :: M55N5FMxe = 3164 - INTEGER(IntKi), PARAMETER :: M55N6FMxe = 3165 - INTEGER(IntKi), PARAMETER :: M55N7FMxe = 3166 - INTEGER(IntKi), PARAMETER :: M55N8FMxe = 3167 - INTEGER(IntKi), PARAMETER :: M55N9FMxe = 3168 - INTEGER(IntKi), PARAMETER :: M56N1FMxe = 3169 - INTEGER(IntKi), PARAMETER :: M56N2FMxe = 3170 - INTEGER(IntKi), PARAMETER :: M56N3FMxe = 3171 - INTEGER(IntKi), PARAMETER :: M56N4FMxe = 3172 - INTEGER(IntKi), PARAMETER :: M56N5FMxe = 3173 - INTEGER(IntKi), PARAMETER :: M56N6FMxe = 3174 - INTEGER(IntKi), PARAMETER :: M56N7FMxe = 3175 - INTEGER(IntKi), PARAMETER :: M56N8FMxe = 3176 - INTEGER(IntKi), PARAMETER :: M56N9FMxe = 3177 - INTEGER(IntKi), PARAMETER :: M57N1FMxe = 3178 - INTEGER(IntKi), PARAMETER :: M57N2FMxe = 3179 - INTEGER(IntKi), PARAMETER :: M57N3FMxe = 3180 - INTEGER(IntKi), PARAMETER :: M57N4FMxe = 3181 - INTEGER(IntKi), PARAMETER :: M57N5FMxe = 3182 - INTEGER(IntKi), PARAMETER :: M57N6FMxe = 3183 - INTEGER(IntKi), PARAMETER :: M57N7FMxe = 3184 - INTEGER(IntKi), PARAMETER :: M57N8FMxe = 3185 - INTEGER(IntKi), PARAMETER :: M57N9FMxe = 3186 - INTEGER(IntKi), PARAMETER :: M58N1FMxe = 3187 - INTEGER(IntKi), PARAMETER :: M58N2FMxe = 3188 - INTEGER(IntKi), PARAMETER :: M58N3FMxe = 3189 - INTEGER(IntKi), PARAMETER :: M58N4FMxe = 3190 - INTEGER(IntKi), PARAMETER :: M58N5FMxe = 3191 - INTEGER(IntKi), PARAMETER :: M58N6FMxe = 3192 - INTEGER(IntKi), PARAMETER :: M58N7FMxe = 3193 - INTEGER(IntKi), PARAMETER :: M58N8FMxe = 3194 - INTEGER(IntKi), PARAMETER :: M58N9FMxe = 3195 - INTEGER(IntKi), PARAMETER :: M59N1FMxe = 3196 - INTEGER(IntKi), PARAMETER :: M59N2FMxe = 3197 - INTEGER(IntKi), PARAMETER :: M59N3FMxe = 3198 - INTEGER(IntKi), PARAMETER :: M59N4FMxe = 3199 - INTEGER(IntKi), PARAMETER :: M59N5FMxe = 3200 - INTEGER(IntKi), PARAMETER :: M59N6FMxe = 3201 - INTEGER(IntKi), PARAMETER :: M59N7FMxe = 3202 - INTEGER(IntKi), PARAMETER :: M59N8FMxe = 3203 - INTEGER(IntKi), PARAMETER :: M59N9FMxe = 3204 - INTEGER(IntKi), PARAMETER :: M60N1FMxe = 3205 - INTEGER(IntKi), PARAMETER :: M60N2FMxe = 3206 - INTEGER(IntKi), PARAMETER :: M60N3FMxe = 3207 - INTEGER(IntKi), PARAMETER :: M60N4FMxe = 3208 - INTEGER(IntKi), PARAMETER :: M60N5FMxe = 3209 - INTEGER(IntKi), PARAMETER :: M60N6FMxe = 3210 - INTEGER(IntKi), PARAMETER :: M60N7FMxe = 3211 - INTEGER(IntKi), PARAMETER :: M60N8FMxe = 3212 - INTEGER(IntKi), PARAMETER :: M60N9FMxe = 3213 - INTEGER(IntKi), PARAMETER :: M61N1FMxe = 3214 - INTEGER(IntKi), PARAMETER :: M61N2FMxe = 3215 - INTEGER(IntKi), PARAMETER :: M61N3FMxe = 3216 - INTEGER(IntKi), PARAMETER :: M61N4FMxe = 3217 - INTEGER(IntKi), PARAMETER :: M61N5FMxe = 3218 - INTEGER(IntKi), PARAMETER :: M61N6FMxe = 3219 - INTEGER(IntKi), PARAMETER :: M61N7FMxe = 3220 - INTEGER(IntKi), PARAMETER :: M61N8FMxe = 3221 - INTEGER(IntKi), PARAMETER :: M61N9FMxe = 3222 - INTEGER(IntKi), PARAMETER :: M62N1FMxe = 3223 - INTEGER(IntKi), PARAMETER :: M62N2FMxe = 3224 - INTEGER(IntKi), PARAMETER :: M62N3FMxe = 3225 - INTEGER(IntKi), PARAMETER :: M62N4FMxe = 3226 - INTEGER(IntKi), PARAMETER :: M62N5FMxe = 3227 - INTEGER(IntKi), PARAMETER :: M62N6FMxe = 3228 - INTEGER(IntKi), PARAMETER :: M62N7FMxe = 3229 - INTEGER(IntKi), PARAMETER :: M62N8FMxe = 3230 - INTEGER(IntKi), PARAMETER :: M62N9FMxe = 3231 - INTEGER(IntKi), PARAMETER :: M63N1FMxe = 3232 - INTEGER(IntKi), PARAMETER :: M63N2FMxe = 3233 - INTEGER(IntKi), PARAMETER :: M63N3FMxe = 3234 - INTEGER(IntKi), PARAMETER :: M63N4FMxe = 3235 - INTEGER(IntKi), PARAMETER :: M63N5FMxe = 3236 - INTEGER(IntKi), PARAMETER :: M63N6FMxe = 3237 - INTEGER(IntKi), PARAMETER :: M63N7FMxe = 3238 - INTEGER(IntKi), PARAMETER :: M63N8FMxe = 3239 - INTEGER(IntKi), PARAMETER :: M63N9FMxe = 3240 - INTEGER(IntKi), PARAMETER :: M64N1FMxe = 3241 - INTEGER(IntKi), PARAMETER :: M64N2FMxe = 3242 - INTEGER(IntKi), PARAMETER :: M64N3FMxe = 3243 - INTEGER(IntKi), PARAMETER :: M64N4FMxe = 3244 - INTEGER(IntKi), PARAMETER :: M64N5FMxe = 3245 - INTEGER(IntKi), PARAMETER :: M64N6FMxe = 3246 - INTEGER(IntKi), PARAMETER :: M64N7FMxe = 3247 - INTEGER(IntKi), PARAMETER :: M64N8FMxe = 3248 - INTEGER(IntKi), PARAMETER :: M64N9FMxe = 3249 - INTEGER(IntKi), PARAMETER :: M65N1FMxe = 3250 - INTEGER(IntKi), PARAMETER :: M65N2FMxe = 3251 - INTEGER(IntKi), PARAMETER :: M65N3FMxe = 3252 - INTEGER(IntKi), PARAMETER :: M65N4FMxe = 3253 - INTEGER(IntKi), PARAMETER :: M65N5FMxe = 3254 - INTEGER(IntKi), PARAMETER :: M65N6FMxe = 3255 - INTEGER(IntKi), PARAMETER :: M65N7FMxe = 3256 - INTEGER(IntKi), PARAMETER :: M65N8FMxe = 3257 - INTEGER(IntKi), PARAMETER :: M65N9FMxe = 3258 - INTEGER(IntKi), PARAMETER :: M66N1FMxe = 3259 - INTEGER(IntKi), PARAMETER :: M66N2FMxe = 3260 - INTEGER(IntKi), PARAMETER :: M66N3FMxe = 3261 - INTEGER(IntKi), PARAMETER :: M66N4FMxe = 3262 - INTEGER(IntKi), PARAMETER :: M66N5FMxe = 3263 - INTEGER(IntKi), PARAMETER :: M66N6FMxe = 3264 - INTEGER(IntKi), PARAMETER :: M66N7FMxe = 3265 - INTEGER(IntKi), PARAMETER :: M66N8FMxe = 3266 - INTEGER(IntKi), PARAMETER :: M66N9FMxe = 3267 - INTEGER(IntKi), PARAMETER :: M67N1FMxe = 3268 - INTEGER(IntKi), PARAMETER :: M67N2FMxe = 3269 - INTEGER(IntKi), PARAMETER :: M67N3FMxe = 3270 - INTEGER(IntKi), PARAMETER :: M67N4FMxe = 3271 - INTEGER(IntKi), PARAMETER :: M67N5FMxe = 3272 - INTEGER(IntKi), PARAMETER :: M67N6FMxe = 3273 - INTEGER(IntKi), PARAMETER :: M67N7FMxe = 3274 - INTEGER(IntKi), PARAMETER :: M67N8FMxe = 3275 - INTEGER(IntKi), PARAMETER :: M67N9FMxe = 3276 - INTEGER(IntKi), PARAMETER :: M68N1FMxe = 3277 - INTEGER(IntKi), PARAMETER :: M68N2FMxe = 3278 - INTEGER(IntKi), PARAMETER :: M68N3FMxe = 3279 - INTEGER(IntKi), PARAMETER :: M68N4FMxe = 3280 - INTEGER(IntKi), PARAMETER :: M68N5FMxe = 3281 - INTEGER(IntKi), PARAMETER :: M68N6FMxe = 3282 - INTEGER(IntKi), PARAMETER :: M68N7FMxe = 3283 - INTEGER(IntKi), PARAMETER :: M68N8FMxe = 3284 - INTEGER(IntKi), PARAMETER :: M68N9FMxe = 3285 - INTEGER(IntKi), PARAMETER :: M69N1FMxe = 3286 - INTEGER(IntKi), PARAMETER :: M69N2FMxe = 3287 - INTEGER(IntKi), PARAMETER :: M69N3FMxe = 3288 - INTEGER(IntKi), PARAMETER :: M69N4FMxe = 3289 - INTEGER(IntKi), PARAMETER :: M69N5FMxe = 3290 - INTEGER(IntKi), PARAMETER :: M69N6FMxe = 3291 - INTEGER(IntKi), PARAMETER :: M69N7FMxe = 3292 - INTEGER(IntKi), PARAMETER :: M69N8FMxe = 3293 - INTEGER(IntKi), PARAMETER :: M69N9FMxe = 3294 - INTEGER(IntKi), PARAMETER :: M70N1FMxe = 3295 - INTEGER(IntKi), PARAMETER :: M70N2FMxe = 3296 - INTEGER(IntKi), PARAMETER :: M70N3FMxe = 3297 - INTEGER(IntKi), PARAMETER :: M70N4FMxe = 3298 - INTEGER(IntKi), PARAMETER :: M70N5FMxe = 3299 - INTEGER(IntKi), PARAMETER :: M70N6FMxe = 3300 - INTEGER(IntKi), PARAMETER :: M70N7FMxe = 3301 - INTEGER(IntKi), PARAMETER :: M70N8FMxe = 3302 - INTEGER(IntKi), PARAMETER :: M70N9FMxe = 3303 - INTEGER(IntKi), PARAMETER :: M71N1FMxe = 3304 - INTEGER(IntKi), PARAMETER :: M71N2FMxe = 3305 - INTEGER(IntKi), PARAMETER :: M71N3FMxe = 3306 - INTEGER(IntKi), PARAMETER :: M71N4FMxe = 3307 - INTEGER(IntKi), PARAMETER :: M71N5FMxe = 3308 - INTEGER(IntKi), PARAMETER :: M71N6FMxe = 3309 - INTEGER(IntKi), PARAMETER :: M71N7FMxe = 3310 - INTEGER(IntKi), PARAMETER :: M71N8FMxe = 3311 - INTEGER(IntKi), PARAMETER :: M71N9FMxe = 3312 - INTEGER(IntKi), PARAMETER :: M72N1FMxe = 3313 - INTEGER(IntKi), PARAMETER :: M72N2FMxe = 3314 - INTEGER(IntKi), PARAMETER :: M72N3FMxe = 3315 - INTEGER(IntKi), PARAMETER :: M72N4FMxe = 3316 - INTEGER(IntKi), PARAMETER :: M72N5FMxe = 3317 - INTEGER(IntKi), PARAMETER :: M72N6FMxe = 3318 - INTEGER(IntKi), PARAMETER :: M72N7FMxe = 3319 - INTEGER(IntKi), PARAMETER :: M72N8FMxe = 3320 - INTEGER(IntKi), PARAMETER :: M72N9FMxe = 3321 - INTEGER(IntKi), PARAMETER :: M73N1FMxe = 3322 - INTEGER(IntKi), PARAMETER :: M73N2FMxe = 3323 - INTEGER(IntKi), PARAMETER :: M73N3FMxe = 3324 - INTEGER(IntKi), PARAMETER :: M73N4FMxe = 3325 - INTEGER(IntKi), PARAMETER :: M73N5FMxe = 3326 - INTEGER(IntKi), PARAMETER :: M73N6FMxe = 3327 - INTEGER(IntKi), PARAMETER :: M73N7FMxe = 3328 - INTEGER(IntKi), PARAMETER :: M73N8FMxe = 3329 - INTEGER(IntKi), PARAMETER :: M73N9FMxe = 3330 - INTEGER(IntKi), PARAMETER :: M74N1FMxe = 3331 - INTEGER(IntKi), PARAMETER :: M74N2FMxe = 3332 - INTEGER(IntKi), PARAMETER :: M74N3FMxe = 3333 - INTEGER(IntKi), PARAMETER :: M74N4FMxe = 3334 - INTEGER(IntKi), PARAMETER :: M74N5FMxe = 3335 - INTEGER(IntKi), PARAMETER :: M74N6FMxe = 3336 - INTEGER(IntKi), PARAMETER :: M74N7FMxe = 3337 - INTEGER(IntKi), PARAMETER :: M74N8FMxe = 3338 - INTEGER(IntKi), PARAMETER :: M74N9FMxe = 3339 - INTEGER(IntKi), PARAMETER :: M75N1FMxe = 3340 - INTEGER(IntKi), PARAMETER :: M75N2FMxe = 3341 - INTEGER(IntKi), PARAMETER :: M75N3FMxe = 3342 - INTEGER(IntKi), PARAMETER :: M75N4FMxe = 3343 - INTEGER(IntKi), PARAMETER :: M75N5FMxe = 3344 - INTEGER(IntKi), PARAMETER :: M75N6FMxe = 3345 - INTEGER(IntKi), PARAMETER :: M75N7FMxe = 3346 - INTEGER(IntKi), PARAMETER :: M75N8FMxe = 3347 - INTEGER(IntKi), PARAMETER :: M75N9FMxe = 3348 - INTEGER(IntKi), PARAMETER :: M76N1FMxe = 3349 - INTEGER(IntKi), PARAMETER :: M76N2FMxe = 3350 - INTEGER(IntKi), PARAMETER :: M76N3FMxe = 3351 - INTEGER(IntKi), PARAMETER :: M76N4FMxe = 3352 - INTEGER(IntKi), PARAMETER :: M76N5FMxe = 3353 - INTEGER(IntKi), PARAMETER :: M76N6FMxe = 3354 - INTEGER(IntKi), PARAMETER :: M76N7FMxe = 3355 - INTEGER(IntKi), PARAMETER :: M76N8FMxe = 3356 - INTEGER(IntKi), PARAMETER :: M76N9FMxe = 3357 - INTEGER(IntKi), PARAMETER :: M77N1FMxe = 3358 - INTEGER(IntKi), PARAMETER :: M77N2FMxe = 3359 - INTEGER(IntKi), PARAMETER :: M77N3FMxe = 3360 - INTEGER(IntKi), PARAMETER :: M77N4FMxe = 3361 - INTEGER(IntKi), PARAMETER :: M77N5FMxe = 3362 - INTEGER(IntKi), PARAMETER :: M77N6FMxe = 3363 - INTEGER(IntKi), PARAMETER :: M77N7FMxe = 3364 - INTEGER(IntKi), PARAMETER :: M77N8FMxe = 3365 - INTEGER(IntKi), PARAMETER :: M77N9FMxe = 3366 - INTEGER(IntKi), PARAMETER :: M78N1FMxe = 3367 - INTEGER(IntKi), PARAMETER :: M78N2FMxe = 3368 - INTEGER(IntKi), PARAMETER :: M78N3FMxe = 3369 - INTEGER(IntKi), PARAMETER :: M78N4FMxe = 3370 - INTEGER(IntKi), PARAMETER :: M78N5FMxe = 3371 - INTEGER(IntKi), PARAMETER :: M78N6FMxe = 3372 - INTEGER(IntKi), PARAMETER :: M78N7FMxe = 3373 - INTEGER(IntKi), PARAMETER :: M78N8FMxe = 3374 - INTEGER(IntKi), PARAMETER :: M78N9FMxe = 3375 - INTEGER(IntKi), PARAMETER :: M79N1FMxe = 3376 - INTEGER(IntKi), PARAMETER :: M79N2FMxe = 3377 - INTEGER(IntKi), PARAMETER :: M79N3FMxe = 3378 - INTEGER(IntKi), PARAMETER :: M79N4FMxe = 3379 - INTEGER(IntKi), PARAMETER :: M79N5FMxe = 3380 - INTEGER(IntKi), PARAMETER :: M79N6FMxe = 3381 - INTEGER(IntKi), PARAMETER :: M79N7FMxe = 3382 - INTEGER(IntKi), PARAMETER :: M79N8FMxe = 3383 - INTEGER(IntKi), PARAMETER :: M79N9FMxe = 3384 - INTEGER(IntKi), PARAMETER :: M80N1FMxe = 3385 - INTEGER(IntKi), PARAMETER :: M80N2FMxe = 3386 - INTEGER(IntKi), PARAMETER :: M80N3FMxe = 3387 - INTEGER(IntKi), PARAMETER :: M80N4FMxe = 3388 - INTEGER(IntKi), PARAMETER :: M80N5FMxe = 3389 - INTEGER(IntKi), PARAMETER :: M80N6FMxe = 3390 - INTEGER(IntKi), PARAMETER :: M80N7FMxe = 3391 - INTEGER(IntKi), PARAMETER :: M80N8FMxe = 3392 - INTEGER(IntKi), PARAMETER :: M80N9FMxe = 3393 - INTEGER(IntKi), PARAMETER :: M81N1FMxe = 3394 - INTEGER(IntKi), PARAMETER :: M81N2FMxe = 3395 - INTEGER(IntKi), PARAMETER :: M81N3FMxe = 3396 - INTEGER(IntKi), PARAMETER :: M81N4FMxe = 3397 - INTEGER(IntKi), PARAMETER :: M81N5FMxe = 3398 - INTEGER(IntKi), PARAMETER :: M81N6FMxe = 3399 - INTEGER(IntKi), PARAMETER :: M81N7FMxe = 3400 - INTEGER(IntKi), PARAMETER :: M81N8FMxe = 3401 - INTEGER(IntKi), PARAMETER :: M81N9FMxe = 3402 - INTEGER(IntKi), PARAMETER :: M82N1FMxe = 3403 - INTEGER(IntKi), PARAMETER :: M82N2FMxe = 3404 - INTEGER(IntKi), PARAMETER :: M82N3FMxe = 3405 - INTEGER(IntKi), PARAMETER :: M82N4FMxe = 3406 - INTEGER(IntKi), PARAMETER :: M82N5FMxe = 3407 - INTEGER(IntKi), PARAMETER :: M82N6FMxe = 3408 - INTEGER(IntKi), PARAMETER :: M82N7FMxe = 3409 - INTEGER(IntKi), PARAMETER :: M82N8FMxe = 3410 - INTEGER(IntKi), PARAMETER :: M82N9FMxe = 3411 - INTEGER(IntKi), PARAMETER :: M83N1FMxe = 3412 - INTEGER(IntKi), PARAMETER :: M83N2FMxe = 3413 - INTEGER(IntKi), PARAMETER :: M83N3FMxe = 3414 - INTEGER(IntKi), PARAMETER :: M83N4FMxe = 3415 - INTEGER(IntKi), PARAMETER :: M83N5FMxe = 3416 - INTEGER(IntKi), PARAMETER :: M83N6FMxe = 3417 - INTEGER(IntKi), PARAMETER :: M83N7FMxe = 3418 - INTEGER(IntKi), PARAMETER :: M83N8FMxe = 3419 - INTEGER(IntKi), PARAMETER :: M83N9FMxe = 3420 - INTEGER(IntKi), PARAMETER :: M84N1FMxe = 3421 - INTEGER(IntKi), PARAMETER :: M84N2FMxe = 3422 - INTEGER(IntKi), PARAMETER :: M84N3FMxe = 3423 - INTEGER(IntKi), PARAMETER :: M84N4FMxe = 3424 - INTEGER(IntKi), PARAMETER :: M84N5FMxe = 3425 - INTEGER(IntKi), PARAMETER :: M84N6FMxe = 3426 - INTEGER(IntKi), PARAMETER :: M84N7FMxe = 3427 - INTEGER(IntKi), PARAMETER :: M84N8FMxe = 3428 - INTEGER(IntKi), PARAMETER :: M84N9FMxe = 3429 - INTEGER(IntKi), PARAMETER :: M85N1FMxe = 3430 - INTEGER(IntKi), PARAMETER :: M85N2FMxe = 3431 - INTEGER(IntKi), PARAMETER :: M85N3FMxe = 3432 - INTEGER(IntKi), PARAMETER :: M85N4FMxe = 3433 - INTEGER(IntKi), PARAMETER :: M85N5FMxe = 3434 - INTEGER(IntKi), PARAMETER :: M85N6FMxe = 3435 - INTEGER(IntKi), PARAMETER :: M85N7FMxe = 3436 - INTEGER(IntKi), PARAMETER :: M85N8FMxe = 3437 - INTEGER(IntKi), PARAMETER :: M85N9FMxe = 3438 - INTEGER(IntKi), PARAMETER :: M86N1FMxe = 3439 - INTEGER(IntKi), PARAMETER :: M86N2FMxe = 3440 - INTEGER(IntKi), PARAMETER :: M86N3FMxe = 3441 - INTEGER(IntKi), PARAMETER :: M86N4FMxe = 3442 - INTEGER(IntKi), PARAMETER :: M86N5FMxe = 3443 - INTEGER(IntKi), PARAMETER :: M86N6FMxe = 3444 - INTEGER(IntKi), PARAMETER :: M86N7FMxe = 3445 - INTEGER(IntKi), PARAMETER :: M86N8FMxe = 3446 - INTEGER(IntKi), PARAMETER :: M86N9FMxe = 3447 - INTEGER(IntKi), PARAMETER :: M87N1FMxe = 3448 - INTEGER(IntKi), PARAMETER :: M87N2FMxe = 3449 - INTEGER(IntKi), PARAMETER :: M87N3FMxe = 3450 - INTEGER(IntKi), PARAMETER :: M87N4FMxe = 3451 - INTEGER(IntKi), PARAMETER :: M87N5FMxe = 3452 - INTEGER(IntKi), PARAMETER :: M87N6FMxe = 3453 - INTEGER(IntKi), PARAMETER :: M87N7FMxe = 3454 - INTEGER(IntKi), PARAMETER :: M87N8FMxe = 3455 - INTEGER(IntKi), PARAMETER :: M87N9FMxe = 3456 - INTEGER(IntKi), PARAMETER :: M88N1FMxe = 3457 - INTEGER(IntKi), PARAMETER :: M88N2FMxe = 3458 - INTEGER(IntKi), PARAMETER :: M88N3FMxe = 3459 - INTEGER(IntKi), PARAMETER :: M88N4FMxe = 3460 - INTEGER(IntKi), PARAMETER :: M88N5FMxe = 3461 - INTEGER(IntKi), PARAMETER :: M88N6FMxe = 3462 - INTEGER(IntKi), PARAMETER :: M88N7FMxe = 3463 - INTEGER(IntKi), PARAMETER :: M88N8FMxe = 3464 - INTEGER(IntKi), PARAMETER :: M88N9FMxe = 3465 - INTEGER(IntKi), PARAMETER :: M89N1FMxe = 3466 - INTEGER(IntKi), PARAMETER :: M89N2FMxe = 3467 - INTEGER(IntKi), PARAMETER :: M89N3FMxe = 3468 - INTEGER(IntKi), PARAMETER :: M89N4FMxe = 3469 - INTEGER(IntKi), PARAMETER :: M89N5FMxe = 3470 - INTEGER(IntKi), PARAMETER :: M89N6FMxe = 3471 - INTEGER(IntKi), PARAMETER :: M89N7FMxe = 3472 - INTEGER(IntKi), PARAMETER :: M89N8FMxe = 3473 - INTEGER(IntKi), PARAMETER :: M89N9FMxe = 3474 - INTEGER(IntKi), PARAMETER :: M90N1FMxe = 3475 - INTEGER(IntKi), PARAMETER :: M90N2FMxe = 3476 - INTEGER(IntKi), PARAMETER :: M90N3FMxe = 3477 - INTEGER(IntKi), PARAMETER :: M90N4FMxe = 3478 - INTEGER(IntKi), PARAMETER :: M90N5FMxe = 3479 - INTEGER(IntKi), PARAMETER :: M90N6FMxe = 3480 - INTEGER(IntKi), PARAMETER :: M90N7FMxe = 3481 - INTEGER(IntKi), PARAMETER :: M90N8FMxe = 3482 - INTEGER(IntKi), PARAMETER :: M90N9FMxe = 3483 - INTEGER(IntKi), PARAMETER :: M91N1FMxe = 3484 - INTEGER(IntKi), PARAMETER :: M91N2FMxe = 3485 - INTEGER(IntKi), PARAMETER :: M91N3FMxe = 3486 - INTEGER(IntKi), PARAMETER :: M91N4FMxe = 3487 - INTEGER(IntKi), PARAMETER :: M91N5FMxe = 3488 - INTEGER(IntKi), PARAMETER :: M91N6FMxe = 3489 - INTEGER(IntKi), PARAMETER :: M91N7FMxe = 3490 - INTEGER(IntKi), PARAMETER :: M91N8FMxe = 3491 - INTEGER(IntKi), PARAMETER :: M91N9FMxe = 3492 - INTEGER(IntKi), PARAMETER :: M92N1FMxe = 3493 - INTEGER(IntKi), PARAMETER :: M92N2FMxe = 3494 - INTEGER(IntKi), PARAMETER :: M92N3FMxe = 3495 - INTEGER(IntKi), PARAMETER :: M92N4FMxe = 3496 - INTEGER(IntKi), PARAMETER :: M92N5FMxe = 3497 - INTEGER(IntKi), PARAMETER :: M92N6FMxe = 3498 - INTEGER(IntKi), PARAMETER :: M92N7FMxe = 3499 - INTEGER(IntKi), PARAMETER :: M92N8FMxe = 3500 - INTEGER(IntKi), PARAMETER :: M92N9FMxe = 3501 - INTEGER(IntKi), PARAMETER :: M93N1FMxe = 3502 - INTEGER(IntKi), PARAMETER :: M93N2FMxe = 3503 - INTEGER(IntKi), PARAMETER :: M93N3FMxe = 3504 - INTEGER(IntKi), PARAMETER :: M93N4FMxe = 3505 - INTEGER(IntKi), PARAMETER :: M93N5FMxe = 3506 - INTEGER(IntKi), PARAMETER :: M93N6FMxe = 3507 - INTEGER(IntKi), PARAMETER :: M93N7FMxe = 3508 - INTEGER(IntKi), PARAMETER :: M93N8FMxe = 3509 - INTEGER(IntKi), PARAMETER :: M93N9FMxe = 3510 - INTEGER(IntKi), PARAMETER :: M94N1FMxe = 3511 - INTEGER(IntKi), PARAMETER :: M94N2FMxe = 3512 - INTEGER(IntKi), PARAMETER :: M94N3FMxe = 3513 - INTEGER(IntKi), PARAMETER :: M94N4FMxe = 3514 - INTEGER(IntKi), PARAMETER :: M94N5FMxe = 3515 - INTEGER(IntKi), PARAMETER :: M94N6FMxe = 3516 - INTEGER(IntKi), PARAMETER :: M94N7FMxe = 3517 - INTEGER(IntKi), PARAMETER :: M94N8FMxe = 3518 - INTEGER(IntKi), PARAMETER :: M94N9FMxe = 3519 - INTEGER(IntKi), PARAMETER :: M95N1FMxe = 3520 - INTEGER(IntKi), PARAMETER :: M95N2FMxe = 3521 - INTEGER(IntKi), PARAMETER :: M95N3FMxe = 3522 - INTEGER(IntKi), PARAMETER :: M95N4FMxe = 3523 - INTEGER(IntKi), PARAMETER :: M95N5FMxe = 3524 - INTEGER(IntKi), PARAMETER :: M95N6FMxe = 3525 - INTEGER(IntKi), PARAMETER :: M95N7FMxe = 3526 - INTEGER(IntKi), PARAMETER :: M95N8FMxe = 3527 - INTEGER(IntKi), PARAMETER :: M95N9FMxe = 3528 - INTEGER(IntKi), PARAMETER :: M96N1FMxe = 3529 - INTEGER(IntKi), PARAMETER :: M96N2FMxe = 3530 - INTEGER(IntKi), PARAMETER :: M96N3FMxe = 3531 - INTEGER(IntKi), PARAMETER :: M96N4FMxe = 3532 - INTEGER(IntKi), PARAMETER :: M96N5FMxe = 3533 - INTEGER(IntKi), PARAMETER :: M96N6FMxe = 3534 - INTEGER(IntKi), PARAMETER :: M96N7FMxe = 3535 - INTEGER(IntKi), PARAMETER :: M96N8FMxe = 3536 - INTEGER(IntKi), PARAMETER :: M96N9FMxe = 3537 - INTEGER(IntKi), PARAMETER :: M97N1FMxe = 3538 - INTEGER(IntKi), PARAMETER :: M97N2FMxe = 3539 - INTEGER(IntKi), PARAMETER :: M97N3FMxe = 3540 - INTEGER(IntKi), PARAMETER :: M97N4FMxe = 3541 - INTEGER(IntKi), PARAMETER :: M97N5FMxe = 3542 - INTEGER(IntKi), PARAMETER :: M97N6FMxe = 3543 - INTEGER(IntKi), PARAMETER :: M97N7FMxe = 3544 - INTEGER(IntKi), PARAMETER :: M97N8FMxe = 3545 - INTEGER(IntKi), PARAMETER :: M97N9FMxe = 3546 - INTEGER(IntKi), PARAMETER :: M98N1FMxe = 3547 - INTEGER(IntKi), PARAMETER :: M98N2FMxe = 3548 - INTEGER(IntKi), PARAMETER :: M98N3FMxe = 3549 - INTEGER(IntKi), PARAMETER :: M98N4FMxe = 3550 - INTEGER(IntKi), PARAMETER :: M98N5FMxe = 3551 - INTEGER(IntKi), PARAMETER :: M98N6FMxe = 3552 - INTEGER(IntKi), PARAMETER :: M98N7FMxe = 3553 - INTEGER(IntKi), PARAMETER :: M98N8FMxe = 3554 - INTEGER(IntKi), PARAMETER :: M98N9FMxe = 3555 - INTEGER(IntKi), PARAMETER :: M99N1FMxe = 3556 - INTEGER(IntKi), PARAMETER :: M99N2FMxe = 3557 - INTEGER(IntKi), PARAMETER :: M99N3FMxe = 3558 - INTEGER(IntKi), PARAMETER :: M99N4FMxe = 3559 - INTEGER(IntKi), PARAMETER :: M99N5FMxe = 3560 - INTEGER(IntKi), PARAMETER :: M99N6FMxe = 3561 - INTEGER(IntKi), PARAMETER :: M99N7FMxe = 3562 - INTEGER(IntKi), PARAMETER :: M99N8FMxe = 3563 - INTEGER(IntKi), PARAMETER :: M99N9FMxe = 3564 - INTEGER(IntKi), PARAMETER :: M01N1FMye = 3565 - INTEGER(IntKi), PARAMETER :: M01N2FMye = 3566 - INTEGER(IntKi), PARAMETER :: M01N3FMye = 3567 - INTEGER(IntKi), PARAMETER :: M01N4FMye = 3568 - INTEGER(IntKi), PARAMETER :: M01N5FMye = 3569 - INTEGER(IntKi), PARAMETER :: M01N6FMye = 3570 - INTEGER(IntKi), PARAMETER :: M01N7FMye = 3571 - INTEGER(IntKi), PARAMETER :: M01N8FMye = 3572 - INTEGER(IntKi), PARAMETER :: M01N9FMye = 3573 - INTEGER(IntKi), PARAMETER :: M02N1FMye = 3574 - INTEGER(IntKi), PARAMETER :: M02N2FMye = 3575 - INTEGER(IntKi), PARAMETER :: M02N3FMye = 3576 - INTEGER(IntKi), PARAMETER :: M02N4FMye = 3577 - INTEGER(IntKi), PARAMETER :: M02N5FMye = 3578 - INTEGER(IntKi), PARAMETER :: M02N6FMye = 3579 - INTEGER(IntKi), PARAMETER :: M02N7FMye = 3580 - INTEGER(IntKi), PARAMETER :: M02N8FMye = 3581 - INTEGER(IntKi), PARAMETER :: M02N9FMye = 3582 - INTEGER(IntKi), PARAMETER :: M03N1FMye = 3583 - INTEGER(IntKi), PARAMETER :: M03N2FMye = 3584 - INTEGER(IntKi), PARAMETER :: M03N3FMye = 3585 - INTEGER(IntKi), PARAMETER :: M03N4FMye = 3586 - INTEGER(IntKi), PARAMETER :: M03N5FMye = 3587 - INTEGER(IntKi), PARAMETER :: M03N6FMye = 3588 - INTEGER(IntKi), PARAMETER :: M03N7FMye = 3589 - INTEGER(IntKi), PARAMETER :: M03N8FMye = 3590 - INTEGER(IntKi), PARAMETER :: M03N9FMye = 3591 - INTEGER(IntKi), PARAMETER :: M04N1FMye = 3592 - INTEGER(IntKi), PARAMETER :: M04N2FMye = 3593 - INTEGER(IntKi), PARAMETER :: M04N3FMye = 3594 - INTEGER(IntKi), PARAMETER :: M04N4FMye = 3595 - INTEGER(IntKi), PARAMETER :: M04N5FMye = 3596 - INTEGER(IntKi), PARAMETER :: M04N6FMye = 3597 - INTEGER(IntKi), PARAMETER :: M04N7FMye = 3598 - INTEGER(IntKi), PARAMETER :: M04N8FMye = 3599 - INTEGER(IntKi), PARAMETER :: M04N9FMye = 3600 - INTEGER(IntKi), PARAMETER :: M05N1FMye = 3601 - INTEGER(IntKi), PARAMETER :: M05N2FMye = 3602 - INTEGER(IntKi), PARAMETER :: M05N3FMye = 3603 - INTEGER(IntKi), PARAMETER :: M05N4FMye = 3604 - INTEGER(IntKi), PARAMETER :: M05N5FMye = 3605 - INTEGER(IntKi), PARAMETER :: M05N6FMye = 3606 - INTEGER(IntKi), PARAMETER :: M05N7FMye = 3607 - INTEGER(IntKi), PARAMETER :: M05N8FMye = 3608 - INTEGER(IntKi), PARAMETER :: M05N9FMye = 3609 - INTEGER(IntKi), PARAMETER :: M06N1FMye = 3610 - INTEGER(IntKi), PARAMETER :: M06N2FMye = 3611 - INTEGER(IntKi), PARAMETER :: M06N3FMye = 3612 - INTEGER(IntKi), PARAMETER :: M06N4FMye = 3613 - INTEGER(IntKi), PARAMETER :: M06N5FMye = 3614 - INTEGER(IntKi), PARAMETER :: M06N6FMye = 3615 - INTEGER(IntKi), PARAMETER :: M06N7FMye = 3616 - INTEGER(IntKi), PARAMETER :: M06N8FMye = 3617 - INTEGER(IntKi), PARAMETER :: M06N9FMye = 3618 - INTEGER(IntKi), PARAMETER :: M07N1FMye = 3619 - INTEGER(IntKi), PARAMETER :: M07N2FMye = 3620 - INTEGER(IntKi), PARAMETER :: M07N3FMye = 3621 - INTEGER(IntKi), PARAMETER :: M07N4FMye = 3622 - INTEGER(IntKi), PARAMETER :: M07N5FMye = 3623 - INTEGER(IntKi), PARAMETER :: M07N6FMye = 3624 - INTEGER(IntKi), PARAMETER :: M07N7FMye = 3625 - INTEGER(IntKi), PARAMETER :: M07N8FMye = 3626 - INTEGER(IntKi), PARAMETER :: M07N9FMye = 3627 - INTEGER(IntKi), PARAMETER :: M08N1FMye = 3628 - INTEGER(IntKi), PARAMETER :: M08N2FMye = 3629 - INTEGER(IntKi), PARAMETER :: M08N3FMye = 3630 - INTEGER(IntKi), PARAMETER :: M08N4FMye = 3631 - INTEGER(IntKi), PARAMETER :: M08N5FMye = 3632 - INTEGER(IntKi), PARAMETER :: M08N6FMye = 3633 - INTEGER(IntKi), PARAMETER :: M08N7FMye = 3634 - INTEGER(IntKi), PARAMETER :: M08N8FMye = 3635 - INTEGER(IntKi), PARAMETER :: M08N9FMye = 3636 - INTEGER(IntKi), PARAMETER :: M09N1FMye = 3637 - INTEGER(IntKi), PARAMETER :: M09N2FMye = 3638 - INTEGER(IntKi), PARAMETER :: M09N3FMye = 3639 - INTEGER(IntKi), PARAMETER :: M09N4FMye = 3640 - INTEGER(IntKi), PARAMETER :: M09N5FMye = 3641 - INTEGER(IntKi), PARAMETER :: M09N6FMye = 3642 - INTEGER(IntKi), PARAMETER :: M09N7FMye = 3643 - INTEGER(IntKi), PARAMETER :: M09N8FMye = 3644 - INTEGER(IntKi), PARAMETER :: M09N9FMye = 3645 - INTEGER(IntKi), PARAMETER :: M10N1FMye = 3646 - INTEGER(IntKi), PARAMETER :: M10N2FMye = 3647 - INTEGER(IntKi), PARAMETER :: M10N3FMye = 3648 - INTEGER(IntKi), PARAMETER :: M10N4FMye = 3649 - INTEGER(IntKi), PARAMETER :: M10N5FMye = 3650 - INTEGER(IntKi), PARAMETER :: M10N6FMye = 3651 - INTEGER(IntKi), PARAMETER :: M10N7FMye = 3652 - INTEGER(IntKi), PARAMETER :: M10N8FMye = 3653 - INTEGER(IntKi), PARAMETER :: M10N9FMye = 3654 - INTEGER(IntKi), PARAMETER :: M11N1FMye = 3655 - INTEGER(IntKi), PARAMETER :: M11N2FMye = 3656 - INTEGER(IntKi), PARAMETER :: M11N3FMye = 3657 - INTEGER(IntKi), PARAMETER :: M11N4FMye = 3658 - INTEGER(IntKi), PARAMETER :: M11N5FMye = 3659 - INTEGER(IntKi), PARAMETER :: M11N6FMye = 3660 - INTEGER(IntKi), PARAMETER :: M11N7FMye = 3661 - INTEGER(IntKi), PARAMETER :: M11N8FMye = 3662 - INTEGER(IntKi), PARAMETER :: M11N9FMye = 3663 - INTEGER(IntKi), PARAMETER :: M12N1FMye = 3664 - INTEGER(IntKi), PARAMETER :: M12N2FMye = 3665 - INTEGER(IntKi), PARAMETER :: M12N3FMye = 3666 - INTEGER(IntKi), PARAMETER :: M12N4FMye = 3667 - INTEGER(IntKi), PARAMETER :: M12N5FMye = 3668 - INTEGER(IntKi), PARAMETER :: M12N6FMye = 3669 - INTEGER(IntKi), PARAMETER :: M12N7FMye = 3670 - INTEGER(IntKi), PARAMETER :: M12N8FMye = 3671 - INTEGER(IntKi), PARAMETER :: M12N9FMye = 3672 - INTEGER(IntKi), PARAMETER :: M13N1FMye = 3673 - INTEGER(IntKi), PARAMETER :: M13N2FMye = 3674 - INTEGER(IntKi), PARAMETER :: M13N3FMye = 3675 - INTEGER(IntKi), PARAMETER :: M13N4FMye = 3676 - INTEGER(IntKi), PARAMETER :: M13N5FMye = 3677 - INTEGER(IntKi), PARAMETER :: M13N6FMye = 3678 - INTEGER(IntKi), PARAMETER :: M13N7FMye = 3679 - INTEGER(IntKi), PARAMETER :: M13N8FMye = 3680 - INTEGER(IntKi), PARAMETER :: M13N9FMye = 3681 - INTEGER(IntKi), PARAMETER :: M14N1FMye = 3682 - INTEGER(IntKi), PARAMETER :: M14N2FMye = 3683 - INTEGER(IntKi), PARAMETER :: M14N3FMye = 3684 - INTEGER(IntKi), PARAMETER :: M14N4FMye = 3685 - INTEGER(IntKi), PARAMETER :: M14N5FMye = 3686 - INTEGER(IntKi), PARAMETER :: M14N6FMye = 3687 - INTEGER(IntKi), PARAMETER :: M14N7FMye = 3688 - INTEGER(IntKi), PARAMETER :: M14N8FMye = 3689 - INTEGER(IntKi), PARAMETER :: M14N9FMye = 3690 - INTEGER(IntKi), PARAMETER :: M15N1FMye = 3691 - INTEGER(IntKi), PARAMETER :: M15N2FMye = 3692 - INTEGER(IntKi), PARAMETER :: M15N3FMye = 3693 - INTEGER(IntKi), PARAMETER :: M15N4FMye = 3694 - INTEGER(IntKi), PARAMETER :: M15N5FMye = 3695 - INTEGER(IntKi), PARAMETER :: M15N6FMye = 3696 - INTEGER(IntKi), PARAMETER :: M15N7FMye = 3697 - INTEGER(IntKi), PARAMETER :: M15N8FMye = 3698 - INTEGER(IntKi), PARAMETER :: M15N9FMye = 3699 - INTEGER(IntKi), PARAMETER :: M16N1FMye = 3700 - INTEGER(IntKi), PARAMETER :: M16N2FMye = 3701 - INTEGER(IntKi), PARAMETER :: M16N3FMye = 3702 - INTEGER(IntKi), PARAMETER :: M16N4FMye = 3703 - INTEGER(IntKi), PARAMETER :: M16N5FMye = 3704 - INTEGER(IntKi), PARAMETER :: M16N6FMye = 3705 - INTEGER(IntKi), PARAMETER :: M16N7FMye = 3706 - INTEGER(IntKi), PARAMETER :: M16N8FMye = 3707 - INTEGER(IntKi), PARAMETER :: M16N9FMye = 3708 - INTEGER(IntKi), PARAMETER :: M17N1FMye = 3709 - INTEGER(IntKi), PARAMETER :: M17N2FMye = 3710 - INTEGER(IntKi), PARAMETER :: M17N3FMye = 3711 - INTEGER(IntKi), PARAMETER :: M17N4FMye = 3712 - INTEGER(IntKi), PARAMETER :: M17N5FMye = 3713 - INTEGER(IntKi), PARAMETER :: M17N6FMye = 3714 - INTEGER(IntKi), PARAMETER :: M17N7FMye = 3715 - INTEGER(IntKi), PARAMETER :: M17N8FMye = 3716 - INTEGER(IntKi), PARAMETER :: M17N9FMye = 3717 - INTEGER(IntKi), PARAMETER :: M18N1FMye = 3718 - INTEGER(IntKi), PARAMETER :: M18N2FMye = 3719 - INTEGER(IntKi), PARAMETER :: M18N3FMye = 3720 - INTEGER(IntKi), PARAMETER :: M18N4FMye = 3721 - INTEGER(IntKi), PARAMETER :: M18N5FMye = 3722 - INTEGER(IntKi), PARAMETER :: M18N6FMye = 3723 - INTEGER(IntKi), PARAMETER :: M18N7FMye = 3724 - INTEGER(IntKi), PARAMETER :: M18N8FMye = 3725 - INTEGER(IntKi), PARAMETER :: M18N9FMye = 3726 - INTEGER(IntKi), PARAMETER :: M19N1FMye = 3727 - INTEGER(IntKi), PARAMETER :: M19N2FMye = 3728 - INTEGER(IntKi), PARAMETER :: M19N3FMye = 3729 - INTEGER(IntKi), PARAMETER :: M19N4FMye = 3730 - INTEGER(IntKi), PARAMETER :: M19N5FMye = 3731 - INTEGER(IntKi), PARAMETER :: M19N6FMye = 3732 - INTEGER(IntKi), PARAMETER :: M19N7FMye = 3733 - INTEGER(IntKi), PARAMETER :: M19N8FMye = 3734 - INTEGER(IntKi), PARAMETER :: M19N9FMye = 3735 - INTEGER(IntKi), PARAMETER :: M20N1FMye = 3736 - INTEGER(IntKi), PARAMETER :: M20N2FMye = 3737 - INTEGER(IntKi), PARAMETER :: M20N3FMye = 3738 - INTEGER(IntKi), PARAMETER :: M20N4FMye = 3739 - INTEGER(IntKi), PARAMETER :: M20N5FMye = 3740 - INTEGER(IntKi), PARAMETER :: M20N6FMye = 3741 - INTEGER(IntKi), PARAMETER :: M20N7FMye = 3742 - INTEGER(IntKi), PARAMETER :: M20N8FMye = 3743 - INTEGER(IntKi), PARAMETER :: M20N9FMye = 3744 - INTEGER(IntKi), PARAMETER :: M21N1FMye = 3745 - INTEGER(IntKi), PARAMETER :: M21N2FMye = 3746 - INTEGER(IntKi), PARAMETER :: M21N3FMye = 3747 - INTEGER(IntKi), PARAMETER :: M21N4FMye = 3748 - INTEGER(IntKi), PARAMETER :: M21N5FMye = 3749 - INTEGER(IntKi), PARAMETER :: M21N6FMye = 3750 - INTEGER(IntKi), PARAMETER :: M21N7FMye = 3751 - INTEGER(IntKi), PARAMETER :: M21N8FMye = 3752 - INTEGER(IntKi), PARAMETER :: M21N9FMye = 3753 - INTEGER(IntKi), PARAMETER :: M22N1FMye = 3754 - INTEGER(IntKi), PARAMETER :: M22N2FMye = 3755 - INTEGER(IntKi), PARAMETER :: M22N3FMye = 3756 - INTEGER(IntKi), PARAMETER :: M22N4FMye = 3757 - INTEGER(IntKi), PARAMETER :: M22N5FMye = 3758 - INTEGER(IntKi), PARAMETER :: M22N6FMye = 3759 - INTEGER(IntKi), PARAMETER :: M22N7FMye = 3760 - INTEGER(IntKi), PARAMETER :: M22N8FMye = 3761 - INTEGER(IntKi), PARAMETER :: M22N9FMye = 3762 - INTEGER(IntKi), PARAMETER :: M23N1FMye = 3763 - INTEGER(IntKi), PARAMETER :: M23N2FMye = 3764 - INTEGER(IntKi), PARAMETER :: M23N3FMye = 3765 - INTEGER(IntKi), PARAMETER :: M23N4FMye = 3766 - INTEGER(IntKi), PARAMETER :: M23N5FMye = 3767 - INTEGER(IntKi), PARAMETER :: M23N6FMye = 3768 - INTEGER(IntKi), PARAMETER :: M23N7FMye = 3769 - INTEGER(IntKi), PARAMETER :: M23N8FMye = 3770 - INTEGER(IntKi), PARAMETER :: M23N9FMye = 3771 - INTEGER(IntKi), PARAMETER :: M24N1FMye = 3772 - INTEGER(IntKi), PARAMETER :: M24N2FMye = 3773 - INTEGER(IntKi), PARAMETER :: M24N3FMye = 3774 - INTEGER(IntKi), PARAMETER :: M24N4FMye = 3775 - INTEGER(IntKi), PARAMETER :: M24N5FMye = 3776 - INTEGER(IntKi), PARAMETER :: M24N6FMye = 3777 - INTEGER(IntKi), PARAMETER :: M24N7FMye = 3778 - INTEGER(IntKi), PARAMETER :: M24N8FMye = 3779 - INTEGER(IntKi), PARAMETER :: M24N9FMye = 3780 - INTEGER(IntKi), PARAMETER :: M25N1FMye = 3781 - INTEGER(IntKi), PARAMETER :: M25N2FMye = 3782 - INTEGER(IntKi), PARAMETER :: M25N3FMye = 3783 - INTEGER(IntKi), PARAMETER :: M25N4FMye = 3784 - INTEGER(IntKi), PARAMETER :: M25N5FMye = 3785 - INTEGER(IntKi), PARAMETER :: M25N6FMye = 3786 - INTEGER(IntKi), PARAMETER :: M25N7FMye = 3787 - INTEGER(IntKi), PARAMETER :: M25N8FMye = 3788 - INTEGER(IntKi), PARAMETER :: M25N9FMye = 3789 - INTEGER(IntKi), PARAMETER :: M26N1FMye = 3790 - INTEGER(IntKi), PARAMETER :: M26N2FMye = 3791 - INTEGER(IntKi), PARAMETER :: M26N3FMye = 3792 - INTEGER(IntKi), PARAMETER :: M26N4FMye = 3793 - INTEGER(IntKi), PARAMETER :: M26N5FMye = 3794 - INTEGER(IntKi), PARAMETER :: M26N6FMye = 3795 - INTEGER(IntKi), PARAMETER :: M26N7FMye = 3796 - INTEGER(IntKi), PARAMETER :: M26N8FMye = 3797 - INTEGER(IntKi), PARAMETER :: M26N9FMye = 3798 - INTEGER(IntKi), PARAMETER :: M27N1FMye = 3799 - INTEGER(IntKi), PARAMETER :: M27N2FMye = 3800 - INTEGER(IntKi), PARAMETER :: M27N3FMye = 3801 - INTEGER(IntKi), PARAMETER :: M27N4FMye = 3802 - INTEGER(IntKi), PARAMETER :: M27N5FMye = 3803 - INTEGER(IntKi), PARAMETER :: M27N6FMye = 3804 - INTEGER(IntKi), PARAMETER :: M27N7FMye = 3805 - INTEGER(IntKi), PARAMETER :: M27N8FMye = 3806 - INTEGER(IntKi), PARAMETER :: M27N9FMye = 3807 - INTEGER(IntKi), PARAMETER :: M28N1FMye = 3808 - INTEGER(IntKi), PARAMETER :: M28N2FMye = 3809 - INTEGER(IntKi), PARAMETER :: M28N3FMye = 3810 - INTEGER(IntKi), PARAMETER :: M28N4FMye = 3811 - INTEGER(IntKi), PARAMETER :: M28N5FMye = 3812 - INTEGER(IntKi), PARAMETER :: M28N6FMye = 3813 - INTEGER(IntKi), PARAMETER :: M28N7FMye = 3814 - INTEGER(IntKi), PARAMETER :: M28N8FMye = 3815 - INTEGER(IntKi), PARAMETER :: M28N9FMye = 3816 - INTEGER(IntKi), PARAMETER :: M29N1FMye = 3817 - INTEGER(IntKi), PARAMETER :: M29N2FMye = 3818 - INTEGER(IntKi), PARAMETER :: M29N3FMye = 3819 - INTEGER(IntKi), PARAMETER :: M29N4FMye = 3820 - INTEGER(IntKi), PARAMETER :: M29N5FMye = 3821 - INTEGER(IntKi), PARAMETER :: M29N6FMye = 3822 - INTEGER(IntKi), PARAMETER :: M29N7FMye = 3823 - INTEGER(IntKi), PARAMETER :: M29N8FMye = 3824 - INTEGER(IntKi), PARAMETER :: M29N9FMye = 3825 - INTEGER(IntKi), PARAMETER :: M30N1FMye = 3826 - INTEGER(IntKi), PARAMETER :: M30N2FMye = 3827 - INTEGER(IntKi), PARAMETER :: M30N3FMye = 3828 - INTEGER(IntKi), PARAMETER :: M30N4FMye = 3829 - INTEGER(IntKi), PARAMETER :: M30N5FMye = 3830 - INTEGER(IntKi), PARAMETER :: M30N6FMye = 3831 - INTEGER(IntKi), PARAMETER :: M30N7FMye = 3832 - INTEGER(IntKi), PARAMETER :: M30N8FMye = 3833 - INTEGER(IntKi), PARAMETER :: M30N9FMye = 3834 - INTEGER(IntKi), PARAMETER :: M31N1FMye = 3835 - INTEGER(IntKi), PARAMETER :: M31N2FMye = 3836 - INTEGER(IntKi), PARAMETER :: M31N3FMye = 3837 - INTEGER(IntKi), PARAMETER :: M31N4FMye = 3838 - INTEGER(IntKi), PARAMETER :: M31N5FMye = 3839 - INTEGER(IntKi), PARAMETER :: M31N6FMye = 3840 - INTEGER(IntKi), PARAMETER :: M31N7FMye = 3841 - INTEGER(IntKi), PARAMETER :: M31N8FMye = 3842 - INTEGER(IntKi), PARAMETER :: M31N9FMye = 3843 - INTEGER(IntKi), PARAMETER :: M32N1FMye = 3844 - INTEGER(IntKi), PARAMETER :: M32N2FMye = 3845 - INTEGER(IntKi), PARAMETER :: M32N3FMye = 3846 - INTEGER(IntKi), PARAMETER :: M32N4FMye = 3847 - INTEGER(IntKi), PARAMETER :: M32N5FMye = 3848 - INTEGER(IntKi), PARAMETER :: M32N6FMye = 3849 - INTEGER(IntKi), PARAMETER :: M32N7FMye = 3850 - INTEGER(IntKi), PARAMETER :: M32N8FMye = 3851 - INTEGER(IntKi), PARAMETER :: M32N9FMye = 3852 - INTEGER(IntKi), PARAMETER :: M33N1FMye = 3853 - INTEGER(IntKi), PARAMETER :: M33N2FMye = 3854 - INTEGER(IntKi), PARAMETER :: M33N3FMye = 3855 - INTEGER(IntKi), PARAMETER :: M33N4FMye = 3856 - INTEGER(IntKi), PARAMETER :: M33N5FMye = 3857 - INTEGER(IntKi), PARAMETER :: M33N6FMye = 3858 - INTEGER(IntKi), PARAMETER :: M33N7FMye = 3859 - INTEGER(IntKi), PARAMETER :: M33N8FMye = 3860 - INTEGER(IntKi), PARAMETER :: M33N9FMye = 3861 - INTEGER(IntKi), PARAMETER :: M34N1FMye = 3862 - INTEGER(IntKi), PARAMETER :: M34N2FMye = 3863 - INTEGER(IntKi), PARAMETER :: M34N3FMye = 3864 - INTEGER(IntKi), PARAMETER :: M34N4FMye = 3865 - INTEGER(IntKi), PARAMETER :: M34N5FMye = 3866 - INTEGER(IntKi), PARAMETER :: M34N6FMye = 3867 - INTEGER(IntKi), PARAMETER :: M34N7FMye = 3868 - INTEGER(IntKi), PARAMETER :: M34N8FMye = 3869 - INTEGER(IntKi), PARAMETER :: M34N9FMye = 3870 - INTEGER(IntKi), PARAMETER :: M35N1FMye = 3871 - INTEGER(IntKi), PARAMETER :: M35N2FMye = 3872 - INTEGER(IntKi), PARAMETER :: M35N3FMye = 3873 - INTEGER(IntKi), PARAMETER :: M35N4FMye = 3874 - INTEGER(IntKi), PARAMETER :: M35N5FMye = 3875 - INTEGER(IntKi), PARAMETER :: M35N6FMye = 3876 - INTEGER(IntKi), PARAMETER :: M35N7FMye = 3877 - INTEGER(IntKi), PARAMETER :: M35N8FMye = 3878 - INTEGER(IntKi), PARAMETER :: M35N9FMye = 3879 - INTEGER(IntKi), PARAMETER :: M36N1FMye = 3880 - INTEGER(IntKi), PARAMETER :: M36N2FMye = 3881 - INTEGER(IntKi), PARAMETER :: M36N3FMye = 3882 - INTEGER(IntKi), PARAMETER :: M36N4FMye = 3883 - INTEGER(IntKi), PARAMETER :: M36N5FMye = 3884 - INTEGER(IntKi), PARAMETER :: M36N6FMye = 3885 - INTEGER(IntKi), PARAMETER :: M36N7FMye = 3886 - INTEGER(IntKi), PARAMETER :: M36N8FMye = 3887 - INTEGER(IntKi), PARAMETER :: M36N9FMye = 3888 - INTEGER(IntKi), PARAMETER :: M37N1FMye = 3889 - INTEGER(IntKi), PARAMETER :: M37N2FMye = 3890 - INTEGER(IntKi), PARAMETER :: M37N3FMye = 3891 - INTEGER(IntKi), PARAMETER :: M37N4FMye = 3892 - INTEGER(IntKi), PARAMETER :: M37N5FMye = 3893 - INTEGER(IntKi), PARAMETER :: M37N6FMye = 3894 - INTEGER(IntKi), PARAMETER :: M37N7FMye = 3895 - INTEGER(IntKi), PARAMETER :: M37N8FMye = 3896 - INTEGER(IntKi), PARAMETER :: M37N9FMye = 3897 - INTEGER(IntKi), PARAMETER :: M38N1FMye = 3898 - INTEGER(IntKi), PARAMETER :: M38N2FMye = 3899 - INTEGER(IntKi), PARAMETER :: M38N3FMye = 3900 - INTEGER(IntKi), PARAMETER :: M38N4FMye = 3901 - INTEGER(IntKi), PARAMETER :: M38N5FMye = 3902 - INTEGER(IntKi), PARAMETER :: M38N6FMye = 3903 - INTEGER(IntKi), PARAMETER :: M38N7FMye = 3904 - INTEGER(IntKi), PARAMETER :: M38N8FMye = 3905 - INTEGER(IntKi), PARAMETER :: M38N9FMye = 3906 - INTEGER(IntKi), PARAMETER :: M39N1FMye = 3907 - INTEGER(IntKi), PARAMETER :: M39N2FMye = 3908 - INTEGER(IntKi), PARAMETER :: M39N3FMye = 3909 - INTEGER(IntKi), PARAMETER :: M39N4FMye = 3910 - INTEGER(IntKi), PARAMETER :: M39N5FMye = 3911 - INTEGER(IntKi), PARAMETER :: M39N6FMye = 3912 - INTEGER(IntKi), PARAMETER :: M39N7FMye = 3913 - INTEGER(IntKi), PARAMETER :: M39N8FMye = 3914 - INTEGER(IntKi), PARAMETER :: M39N9FMye = 3915 - INTEGER(IntKi), PARAMETER :: M40N1FMye = 3916 - INTEGER(IntKi), PARAMETER :: M40N2FMye = 3917 - INTEGER(IntKi), PARAMETER :: M40N3FMye = 3918 - INTEGER(IntKi), PARAMETER :: M40N4FMye = 3919 - INTEGER(IntKi), PARAMETER :: M40N5FMye = 3920 - INTEGER(IntKi), PARAMETER :: M40N6FMye = 3921 - INTEGER(IntKi), PARAMETER :: M40N7FMye = 3922 - INTEGER(IntKi), PARAMETER :: M40N8FMye = 3923 - INTEGER(IntKi), PARAMETER :: M40N9FMye = 3924 - INTEGER(IntKi), PARAMETER :: M41N1FMye = 3925 - INTEGER(IntKi), PARAMETER :: M41N2FMye = 3926 - INTEGER(IntKi), PARAMETER :: M41N3FMye = 3927 - INTEGER(IntKi), PARAMETER :: M41N4FMye = 3928 - INTEGER(IntKi), PARAMETER :: M41N5FMye = 3929 - INTEGER(IntKi), PARAMETER :: M41N6FMye = 3930 - INTEGER(IntKi), PARAMETER :: M41N7FMye = 3931 - INTEGER(IntKi), PARAMETER :: M41N8FMye = 3932 - INTEGER(IntKi), PARAMETER :: M41N9FMye = 3933 - INTEGER(IntKi), PARAMETER :: M42N1FMye = 3934 - INTEGER(IntKi), PARAMETER :: M42N2FMye = 3935 - INTEGER(IntKi), PARAMETER :: M42N3FMye = 3936 - INTEGER(IntKi), PARAMETER :: M42N4FMye = 3937 - INTEGER(IntKi), PARAMETER :: M42N5FMye = 3938 - INTEGER(IntKi), PARAMETER :: M42N6FMye = 3939 - INTEGER(IntKi), PARAMETER :: M42N7FMye = 3940 - INTEGER(IntKi), PARAMETER :: M42N8FMye = 3941 - INTEGER(IntKi), PARAMETER :: M42N9FMye = 3942 - INTEGER(IntKi), PARAMETER :: M43N1FMye = 3943 - INTEGER(IntKi), PARAMETER :: M43N2FMye = 3944 - INTEGER(IntKi), PARAMETER :: M43N3FMye = 3945 - INTEGER(IntKi), PARAMETER :: M43N4FMye = 3946 - INTEGER(IntKi), PARAMETER :: M43N5FMye = 3947 - INTEGER(IntKi), PARAMETER :: M43N6FMye = 3948 - INTEGER(IntKi), PARAMETER :: M43N7FMye = 3949 - INTEGER(IntKi), PARAMETER :: M43N8FMye = 3950 - INTEGER(IntKi), PARAMETER :: M43N9FMye = 3951 - INTEGER(IntKi), PARAMETER :: M44N1FMye = 3952 - INTEGER(IntKi), PARAMETER :: M44N2FMye = 3953 - INTEGER(IntKi), PARAMETER :: M44N3FMye = 3954 - INTEGER(IntKi), PARAMETER :: M44N4FMye = 3955 - INTEGER(IntKi), PARAMETER :: M44N5FMye = 3956 - INTEGER(IntKi), PARAMETER :: M44N6FMye = 3957 - INTEGER(IntKi), PARAMETER :: M44N7FMye = 3958 - INTEGER(IntKi), PARAMETER :: M44N8FMye = 3959 - INTEGER(IntKi), PARAMETER :: M44N9FMye = 3960 - INTEGER(IntKi), PARAMETER :: M45N1FMye = 3961 - INTEGER(IntKi), PARAMETER :: M45N2FMye = 3962 - INTEGER(IntKi), PARAMETER :: M45N3FMye = 3963 - INTEGER(IntKi), PARAMETER :: M45N4FMye = 3964 - INTEGER(IntKi), PARAMETER :: M45N5FMye = 3965 - INTEGER(IntKi), PARAMETER :: M45N6FMye = 3966 - INTEGER(IntKi), PARAMETER :: M45N7FMye = 3967 - INTEGER(IntKi), PARAMETER :: M45N8FMye = 3968 - INTEGER(IntKi), PARAMETER :: M45N9FMye = 3969 - INTEGER(IntKi), PARAMETER :: M46N1FMye = 3970 - INTEGER(IntKi), PARAMETER :: M46N2FMye = 3971 - INTEGER(IntKi), PARAMETER :: M46N3FMye = 3972 - INTEGER(IntKi), PARAMETER :: M46N4FMye = 3973 - INTEGER(IntKi), PARAMETER :: M46N5FMye = 3974 - INTEGER(IntKi), PARAMETER :: M46N6FMye = 3975 - INTEGER(IntKi), PARAMETER :: M46N7FMye = 3976 - INTEGER(IntKi), PARAMETER :: M46N8FMye = 3977 - INTEGER(IntKi), PARAMETER :: M46N9FMye = 3978 - INTEGER(IntKi), PARAMETER :: M47N1FMye = 3979 - INTEGER(IntKi), PARAMETER :: M47N2FMye = 3980 - INTEGER(IntKi), PARAMETER :: M47N3FMye = 3981 - INTEGER(IntKi), PARAMETER :: M47N4FMye = 3982 - INTEGER(IntKi), PARAMETER :: M47N5FMye = 3983 - INTEGER(IntKi), PARAMETER :: M47N6FMye = 3984 - INTEGER(IntKi), PARAMETER :: M47N7FMye = 3985 - INTEGER(IntKi), PARAMETER :: M47N8FMye = 3986 - INTEGER(IntKi), PARAMETER :: M47N9FMye = 3987 - INTEGER(IntKi), PARAMETER :: M48N1FMye = 3988 - INTEGER(IntKi), PARAMETER :: M48N2FMye = 3989 - INTEGER(IntKi), PARAMETER :: M48N3FMye = 3990 - INTEGER(IntKi), PARAMETER :: M48N4FMye = 3991 - INTEGER(IntKi), PARAMETER :: M48N5FMye = 3992 - INTEGER(IntKi), PARAMETER :: M48N6FMye = 3993 - INTEGER(IntKi), PARAMETER :: M48N7FMye = 3994 - INTEGER(IntKi), PARAMETER :: M48N8FMye = 3995 - INTEGER(IntKi), PARAMETER :: M48N9FMye = 3996 - INTEGER(IntKi), PARAMETER :: M49N1FMye = 3997 - INTEGER(IntKi), PARAMETER :: M49N2FMye = 3998 - INTEGER(IntKi), PARAMETER :: M49N3FMye = 3999 - INTEGER(IntKi), PARAMETER :: M49N4FMye = 4000 - INTEGER(IntKi), PARAMETER :: M49N5FMye = 4001 - INTEGER(IntKi), PARAMETER :: M49N6FMye = 4002 - INTEGER(IntKi), PARAMETER :: M49N7FMye = 4003 - INTEGER(IntKi), PARAMETER :: M49N8FMye = 4004 - INTEGER(IntKi), PARAMETER :: M49N9FMye = 4005 - INTEGER(IntKi), PARAMETER :: M50N1FMye = 4006 - INTEGER(IntKi), PARAMETER :: M50N2FMye = 4007 - INTEGER(IntKi), PARAMETER :: M50N3FMye = 4008 - INTEGER(IntKi), PARAMETER :: M50N4FMye = 4009 - INTEGER(IntKi), PARAMETER :: M50N5FMye = 4010 - INTEGER(IntKi), PARAMETER :: M50N6FMye = 4011 - INTEGER(IntKi), PARAMETER :: M50N7FMye = 4012 - INTEGER(IntKi), PARAMETER :: M50N8FMye = 4013 - INTEGER(IntKi), PARAMETER :: M50N9FMye = 4014 - INTEGER(IntKi), PARAMETER :: M51N1FMye = 4015 - INTEGER(IntKi), PARAMETER :: M51N2FMye = 4016 - INTEGER(IntKi), PARAMETER :: M51N3FMye = 4017 - INTEGER(IntKi), PARAMETER :: M51N4FMye = 4018 - INTEGER(IntKi), PARAMETER :: M51N5FMye = 4019 - INTEGER(IntKi), PARAMETER :: M51N6FMye = 4020 - INTEGER(IntKi), PARAMETER :: M51N7FMye = 4021 - INTEGER(IntKi), PARAMETER :: M51N8FMye = 4022 - INTEGER(IntKi), PARAMETER :: M51N9FMye = 4023 - INTEGER(IntKi), PARAMETER :: M52N1FMye = 4024 - INTEGER(IntKi), PARAMETER :: M52N2FMye = 4025 - INTEGER(IntKi), PARAMETER :: M52N3FMye = 4026 - INTEGER(IntKi), PARAMETER :: M52N4FMye = 4027 - INTEGER(IntKi), PARAMETER :: M52N5FMye = 4028 - INTEGER(IntKi), PARAMETER :: M52N6FMye = 4029 - INTEGER(IntKi), PARAMETER :: M52N7FMye = 4030 - INTEGER(IntKi), PARAMETER :: M52N8FMye = 4031 - INTEGER(IntKi), PARAMETER :: M52N9FMye = 4032 - INTEGER(IntKi), PARAMETER :: M53N1FMye = 4033 - INTEGER(IntKi), PARAMETER :: M53N2FMye = 4034 - INTEGER(IntKi), PARAMETER :: M53N3FMye = 4035 - INTEGER(IntKi), PARAMETER :: M53N4FMye = 4036 - INTEGER(IntKi), PARAMETER :: M53N5FMye = 4037 - INTEGER(IntKi), PARAMETER :: M53N6FMye = 4038 - INTEGER(IntKi), PARAMETER :: M53N7FMye = 4039 - INTEGER(IntKi), PARAMETER :: M53N8FMye = 4040 - INTEGER(IntKi), PARAMETER :: M53N9FMye = 4041 - INTEGER(IntKi), PARAMETER :: M54N1FMye = 4042 - INTEGER(IntKi), PARAMETER :: M54N2FMye = 4043 - INTEGER(IntKi), PARAMETER :: M54N3FMye = 4044 - INTEGER(IntKi), PARAMETER :: M54N4FMye = 4045 - INTEGER(IntKi), PARAMETER :: M54N5FMye = 4046 - INTEGER(IntKi), PARAMETER :: M54N6FMye = 4047 - INTEGER(IntKi), PARAMETER :: M54N7FMye = 4048 - INTEGER(IntKi), PARAMETER :: M54N8FMye = 4049 - INTEGER(IntKi), PARAMETER :: M54N9FMye = 4050 - INTEGER(IntKi), PARAMETER :: M55N1FMye = 4051 - INTEGER(IntKi), PARAMETER :: M55N2FMye = 4052 - INTEGER(IntKi), PARAMETER :: M55N3FMye = 4053 - INTEGER(IntKi), PARAMETER :: M55N4FMye = 4054 - INTEGER(IntKi), PARAMETER :: M55N5FMye = 4055 - INTEGER(IntKi), PARAMETER :: M55N6FMye = 4056 - INTEGER(IntKi), PARAMETER :: M55N7FMye = 4057 - INTEGER(IntKi), PARAMETER :: M55N8FMye = 4058 - INTEGER(IntKi), PARAMETER :: M55N9FMye = 4059 - INTEGER(IntKi), PARAMETER :: M56N1FMye = 4060 - INTEGER(IntKi), PARAMETER :: M56N2FMye = 4061 - INTEGER(IntKi), PARAMETER :: M56N3FMye = 4062 - INTEGER(IntKi), PARAMETER :: M56N4FMye = 4063 - INTEGER(IntKi), PARAMETER :: M56N5FMye = 4064 - INTEGER(IntKi), PARAMETER :: M56N6FMye = 4065 - INTEGER(IntKi), PARAMETER :: M56N7FMye = 4066 - INTEGER(IntKi), PARAMETER :: M56N8FMye = 4067 - INTEGER(IntKi), PARAMETER :: M56N9FMye = 4068 - INTEGER(IntKi), PARAMETER :: M57N1FMye = 4069 - INTEGER(IntKi), PARAMETER :: M57N2FMye = 4070 - INTEGER(IntKi), PARAMETER :: M57N3FMye = 4071 - INTEGER(IntKi), PARAMETER :: M57N4FMye = 4072 - INTEGER(IntKi), PARAMETER :: M57N5FMye = 4073 - INTEGER(IntKi), PARAMETER :: M57N6FMye = 4074 - INTEGER(IntKi), PARAMETER :: M57N7FMye = 4075 - INTEGER(IntKi), PARAMETER :: M57N8FMye = 4076 - INTEGER(IntKi), PARAMETER :: M57N9FMye = 4077 - INTEGER(IntKi), PARAMETER :: M58N1FMye = 4078 - INTEGER(IntKi), PARAMETER :: M58N2FMye = 4079 - INTEGER(IntKi), PARAMETER :: M58N3FMye = 4080 - INTEGER(IntKi), PARAMETER :: M58N4FMye = 4081 - INTEGER(IntKi), PARAMETER :: M58N5FMye = 4082 - INTEGER(IntKi), PARAMETER :: M58N6FMye = 4083 - INTEGER(IntKi), PARAMETER :: M58N7FMye = 4084 - INTEGER(IntKi), PARAMETER :: M58N8FMye = 4085 - INTEGER(IntKi), PARAMETER :: M58N9FMye = 4086 - INTEGER(IntKi), PARAMETER :: M59N1FMye = 4087 - INTEGER(IntKi), PARAMETER :: M59N2FMye = 4088 - INTEGER(IntKi), PARAMETER :: M59N3FMye = 4089 - INTEGER(IntKi), PARAMETER :: M59N4FMye = 4090 - INTEGER(IntKi), PARAMETER :: M59N5FMye = 4091 - INTEGER(IntKi), PARAMETER :: M59N6FMye = 4092 - INTEGER(IntKi), PARAMETER :: M59N7FMye = 4093 - INTEGER(IntKi), PARAMETER :: M59N8FMye = 4094 - INTEGER(IntKi), PARAMETER :: M59N9FMye = 4095 - INTEGER(IntKi), PARAMETER :: M60N1FMye = 4096 - INTEGER(IntKi), PARAMETER :: M60N2FMye = 4097 - INTEGER(IntKi), PARAMETER :: M60N3FMye = 4098 - INTEGER(IntKi), PARAMETER :: M60N4FMye = 4099 - INTEGER(IntKi), PARAMETER :: M60N5FMye = 4100 - INTEGER(IntKi), PARAMETER :: M60N6FMye = 4101 - INTEGER(IntKi), PARAMETER :: M60N7FMye = 4102 - INTEGER(IntKi), PARAMETER :: M60N8FMye = 4103 - INTEGER(IntKi), PARAMETER :: M60N9FMye = 4104 - INTEGER(IntKi), PARAMETER :: M61N1FMye = 4105 - INTEGER(IntKi), PARAMETER :: M61N2FMye = 4106 - INTEGER(IntKi), PARAMETER :: M61N3FMye = 4107 - INTEGER(IntKi), PARAMETER :: M61N4FMye = 4108 - INTEGER(IntKi), PARAMETER :: M61N5FMye = 4109 - INTEGER(IntKi), PARAMETER :: M61N6FMye = 4110 - INTEGER(IntKi), PARAMETER :: M61N7FMye = 4111 - INTEGER(IntKi), PARAMETER :: M61N8FMye = 4112 - INTEGER(IntKi), PARAMETER :: M61N9FMye = 4113 - INTEGER(IntKi), PARAMETER :: M62N1FMye = 4114 - INTEGER(IntKi), PARAMETER :: M62N2FMye = 4115 - INTEGER(IntKi), PARAMETER :: M62N3FMye = 4116 - INTEGER(IntKi), PARAMETER :: M62N4FMye = 4117 - INTEGER(IntKi), PARAMETER :: M62N5FMye = 4118 - INTEGER(IntKi), PARAMETER :: M62N6FMye = 4119 - INTEGER(IntKi), PARAMETER :: M62N7FMye = 4120 - INTEGER(IntKi), PARAMETER :: M62N8FMye = 4121 - INTEGER(IntKi), PARAMETER :: M62N9FMye = 4122 - INTEGER(IntKi), PARAMETER :: M63N1FMye = 4123 - INTEGER(IntKi), PARAMETER :: M63N2FMye = 4124 - INTEGER(IntKi), PARAMETER :: M63N3FMye = 4125 - INTEGER(IntKi), PARAMETER :: M63N4FMye = 4126 - INTEGER(IntKi), PARAMETER :: M63N5FMye = 4127 - INTEGER(IntKi), PARAMETER :: M63N6FMye = 4128 - INTEGER(IntKi), PARAMETER :: M63N7FMye = 4129 - INTEGER(IntKi), PARAMETER :: M63N8FMye = 4130 - INTEGER(IntKi), PARAMETER :: M63N9FMye = 4131 - INTEGER(IntKi), PARAMETER :: M64N1FMye = 4132 - INTEGER(IntKi), PARAMETER :: M64N2FMye = 4133 - INTEGER(IntKi), PARAMETER :: M64N3FMye = 4134 - INTEGER(IntKi), PARAMETER :: M64N4FMye = 4135 - INTEGER(IntKi), PARAMETER :: M64N5FMye = 4136 - INTEGER(IntKi), PARAMETER :: M64N6FMye = 4137 - INTEGER(IntKi), PARAMETER :: M64N7FMye = 4138 - INTEGER(IntKi), PARAMETER :: M64N8FMye = 4139 - INTEGER(IntKi), PARAMETER :: M64N9FMye = 4140 - INTEGER(IntKi), PARAMETER :: M65N1FMye = 4141 - INTEGER(IntKi), PARAMETER :: M65N2FMye = 4142 - INTEGER(IntKi), PARAMETER :: M65N3FMye = 4143 - INTEGER(IntKi), PARAMETER :: M65N4FMye = 4144 - INTEGER(IntKi), PARAMETER :: M65N5FMye = 4145 - INTEGER(IntKi), PARAMETER :: M65N6FMye = 4146 - INTEGER(IntKi), PARAMETER :: M65N7FMye = 4147 - INTEGER(IntKi), PARAMETER :: M65N8FMye = 4148 - INTEGER(IntKi), PARAMETER :: M65N9FMye = 4149 - INTEGER(IntKi), PARAMETER :: M66N1FMye = 4150 - INTEGER(IntKi), PARAMETER :: M66N2FMye = 4151 - INTEGER(IntKi), PARAMETER :: M66N3FMye = 4152 - INTEGER(IntKi), PARAMETER :: M66N4FMye = 4153 - INTEGER(IntKi), PARAMETER :: M66N5FMye = 4154 - INTEGER(IntKi), PARAMETER :: M66N6FMye = 4155 - INTEGER(IntKi), PARAMETER :: M66N7FMye = 4156 - INTEGER(IntKi), PARAMETER :: M66N8FMye = 4157 - INTEGER(IntKi), PARAMETER :: M66N9FMye = 4158 - INTEGER(IntKi), PARAMETER :: M67N1FMye = 4159 - INTEGER(IntKi), PARAMETER :: M67N2FMye = 4160 - INTEGER(IntKi), PARAMETER :: M67N3FMye = 4161 - INTEGER(IntKi), PARAMETER :: M67N4FMye = 4162 - INTEGER(IntKi), PARAMETER :: M67N5FMye = 4163 - INTEGER(IntKi), PARAMETER :: M67N6FMye = 4164 - INTEGER(IntKi), PARAMETER :: M67N7FMye = 4165 - INTEGER(IntKi), PARAMETER :: M67N8FMye = 4166 - INTEGER(IntKi), PARAMETER :: M67N9FMye = 4167 - INTEGER(IntKi), PARAMETER :: M68N1FMye = 4168 - INTEGER(IntKi), PARAMETER :: M68N2FMye = 4169 - INTEGER(IntKi), PARAMETER :: M68N3FMye = 4170 - INTEGER(IntKi), PARAMETER :: M68N4FMye = 4171 - INTEGER(IntKi), PARAMETER :: M68N5FMye = 4172 - INTEGER(IntKi), PARAMETER :: M68N6FMye = 4173 - INTEGER(IntKi), PARAMETER :: M68N7FMye = 4174 - INTEGER(IntKi), PARAMETER :: M68N8FMye = 4175 - INTEGER(IntKi), PARAMETER :: M68N9FMye = 4176 - INTEGER(IntKi), PARAMETER :: M69N1FMye = 4177 - INTEGER(IntKi), PARAMETER :: M69N2FMye = 4178 - INTEGER(IntKi), PARAMETER :: M69N3FMye = 4179 - INTEGER(IntKi), PARAMETER :: M69N4FMye = 4180 - INTEGER(IntKi), PARAMETER :: M69N5FMye = 4181 - INTEGER(IntKi), PARAMETER :: M69N6FMye = 4182 - INTEGER(IntKi), PARAMETER :: M69N7FMye = 4183 - INTEGER(IntKi), PARAMETER :: M69N8FMye = 4184 - INTEGER(IntKi), PARAMETER :: M69N9FMye = 4185 - INTEGER(IntKi), PARAMETER :: M70N1FMye = 4186 - INTEGER(IntKi), PARAMETER :: M70N2FMye = 4187 - INTEGER(IntKi), PARAMETER :: M70N3FMye = 4188 - INTEGER(IntKi), PARAMETER :: M70N4FMye = 4189 - INTEGER(IntKi), PARAMETER :: M70N5FMye = 4190 - INTEGER(IntKi), PARAMETER :: M70N6FMye = 4191 - INTEGER(IntKi), PARAMETER :: M70N7FMye = 4192 - INTEGER(IntKi), PARAMETER :: M70N8FMye = 4193 - INTEGER(IntKi), PARAMETER :: M70N9FMye = 4194 - INTEGER(IntKi), PARAMETER :: M71N1FMye = 4195 - INTEGER(IntKi), PARAMETER :: M71N2FMye = 4196 - INTEGER(IntKi), PARAMETER :: M71N3FMye = 4197 - INTEGER(IntKi), PARAMETER :: M71N4FMye = 4198 - INTEGER(IntKi), PARAMETER :: M71N5FMye = 4199 - INTEGER(IntKi), PARAMETER :: M71N6FMye = 4200 - INTEGER(IntKi), PARAMETER :: M71N7FMye = 4201 - INTEGER(IntKi), PARAMETER :: M71N8FMye = 4202 - INTEGER(IntKi), PARAMETER :: M71N9FMye = 4203 - INTEGER(IntKi), PARAMETER :: M72N1FMye = 4204 - INTEGER(IntKi), PARAMETER :: M72N2FMye = 4205 - INTEGER(IntKi), PARAMETER :: M72N3FMye = 4206 - INTEGER(IntKi), PARAMETER :: M72N4FMye = 4207 - INTEGER(IntKi), PARAMETER :: M72N5FMye = 4208 - INTEGER(IntKi), PARAMETER :: M72N6FMye = 4209 - INTEGER(IntKi), PARAMETER :: M72N7FMye = 4210 - INTEGER(IntKi), PARAMETER :: M72N8FMye = 4211 - INTEGER(IntKi), PARAMETER :: M72N9FMye = 4212 - INTEGER(IntKi), PARAMETER :: M73N1FMye = 4213 - INTEGER(IntKi), PARAMETER :: M73N2FMye = 4214 - INTEGER(IntKi), PARAMETER :: M73N3FMye = 4215 - INTEGER(IntKi), PARAMETER :: M73N4FMye = 4216 - INTEGER(IntKi), PARAMETER :: M73N5FMye = 4217 - INTEGER(IntKi), PARAMETER :: M73N6FMye = 4218 - INTEGER(IntKi), PARAMETER :: M73N7FMye = 4219 - INTEGER(IntKi), PARAMETER :: M73N8FMye = 4220 - INTEGER(IntKi), PARAMETER :: M73N9FMye = 4221 - INTEGER(IntKi), PARAMETER :: M74N1FMye = 4222 - INTEGER(IntKi), PARAMETER :: M74N2FMye = 4223 - INTEGER(IntKi), PARAMETER :: M74N3FMye = 4224 - INTEGER(IntKi), PARAMETER :: M74N4FMye = 4225 - INTEGER(IntKi), PARAMETER :: M74N5FMye = 4226 - INTEGER(IntKi), PARAMETER :: M74N6FMye = 4227 - INTEGER(IntKi), PARAMETER :: M74N7FMye = 4228 - INTEGER(IntKi), PARAMETER :: M74N8FMye = 4229 - INTEGER(IntKi), PARAMETER :: M74N9FMye = 4230 - INTEGER(IntKi), PARAMETER :: M75N1FMye = 4231 - INTEGER(IntKi), PARAMETER :: M75N2FMye = 4232 - INTEGER(IntKi), PARAMETER :: M75N3FMye = 4233 - INTEGER(IntKi), PARAMETER :: M75N4FMye = 4234 - INTEGER(IntKi), PARAMETER :: M75N5FMye = 4235 - INTEGER(IntKi), PARAMETER :: M75N6FMye = 4236 - INTEGER(IntKi), PARAMETER :: M75N7FMye = 4237 - INTEGER(IntKi), PARAMETER :: M75N8FMye = 4238 - INTEGER(IntKi), PARAMETER :: M75N9FMye = 4239 - INTEGER(IntKi), PARAMETER :: M76N1FMye = 4240 - INTEGER(IntKi), PARAMETER :: M76N2FMye = 4241 - INTEGER(IntKi), PARAMETER :: M76N3FMye = 4242 - INTEGER(IntKi), PARAMETER :: M76N4FMye = 4243 - INTEGER(IntKi), PARAMETER :: M76N5FMye = 4244 - INTEGER(IntKi), PARAMETER :: M76N6FMye = 4245 - INTEGER(IntKi), PARAMETER :: M76N7FMye = 4246 - INTEGER(IntKi), PARAMETER :: M76N8FMye = 4247 - INTEGER(IntKi), PARAMETER :: M76N9FMye = 4248 - INTEGER(IntKi), PARAMETER :: M77N1FMye = 4249 - INTEGER(IntKi), PARAMETER :: M77N2FMye = 4250 - INTEGER(IntKi), PARAMETER :: M77N3FMye = 4251 - INTEGER(IntKi), PARAMETER :: M77N4FMye = 4252 - INTEGER(IntKi), PARAMETER :: M77N5FMye = 4253 - INTEGER(IntKi), PARAMETER :: M77N6FMye = 4254 - INTEGER(IntKi), PARAMETER :: M77N7FMye = 4255 - INTEGER(IntKi), PARAMETER :: M77N8FMye = 4256 - INTEGER(IntKi), PARAMETER :: M77N9FMye = 4257 - INTEGER(IntKi), PARAMETER :: M78N1FMye = 4258 - INTEGER(IntKi), PARAMETER :: M78N2FMye = 4259 - INTEGER(IntKi), PARAMETER :: M78N3FMye = 4260 - INTEGER(IntKi), PARAMETER :: M78N4FMye = 4261 - INTEGER(IntKi), PARAMETER :: M78N5FMye = 4262 - INTEGER(IntKi), PARAMETER :: M78N6FMye = 4263 - INTEGER(IntKi), PARAMETER :: M78N7FMye = 4264 - INTEGER(IntKi), PARAMETER :: M78N8FMye = 4265 - INTEGER(IntKi), PARAMETER :: M78N9FMye = 4266 - INTEGER(IntKi), PARAMETER :: M79N1FMye = 4267 - INTEGER(IntKi), PARAMETER :: M79N2FMye = 4268 - INTEGER(IntKi), PARAMETER :: M79N3FMye = 4269 - INTEGER(IntKi), PARAMETER :: M79N4FMye = 4270 - INTEGER(IntKi), PARAMETER :: M79N5FMye = 4271 - INTEGER(IntKi), PARAMETER :: M79N6FMye = 4272 - INTEGER(IntKi), PARAMETER :: M79N7FMye = 4273 - INTEGER(IntKi), PARAMETER :: M79N8FMye = 4274 - INTEGER(IntKi), PARAMETER :: M79N9FMye = 4275 - INTEGER(IntKi), PARAMETER :: M80N1FMye = 4276 - INTEGER(IntKi), PARAMETER :: M80N2FMye = 4277 - INTEGER(IntKi), PARAMETER :: M80N3FMye = 4278 - INTEGER(IntKi), PARAMETER :: M80N4FMye = 4279 - INTEGER(IntKi), PARAMETER :: M80N5FMye = 4280 - INTEGER(IntKi), PARAMETER :: M80N6FMye = 4281 - INTEGER(IntKi), PARAMETER :: M80N7FMye = 4282 - INTEGER(IntKi), PARAMETER :: M80N8FMye = 4283 - INTEGER(IntKi), PARAMETER :: M80N9FMye = 4284 - INTEGER(IntKi), PARAMETER :: M81N1FMye = 4285 - INTEGER(IntKi), PARAMETER :: M81N2FMye = 4286 - INTEGER(IntKi), PARAMETER :: M81N3FMye = 4287 - INTEGER(IntKi), PARAMETER :: M81N4FMye = 4288 - INTEGER(IntKi), PARAMETER :: M81N5FMye = 4289 - INTEGER(IntKi), PARAMETER :: M81N6FMye = 4290 - INTEGER(IntKi), PARAMETER :: M81N7FMye = 4291 - INTEGER(IntKi), PARAMETER :: M81N8FMye = 4292 - INTEGER(IntKi), PARAMETER :: M81N9FMye = 4293 - INTEGER(IntKi), PARAMETER :: M82N1FMye = 4294 - INTEGER(IntKi), PARAMETER :: M82N2FMye = 4295 - INTEGER(IntKi), PARAMETER :: M82N3FMye = 4296 - INTEGER(IntKi), PARAMETER :: M82N4FMye = 4297 - INTEGER(IntKi), PARAMETER :: M82N5FMye = 4298 - INTEGER(IntKi), PARAMETER :: M82N6FMye = 4299 - INTEGER(IntKi), PARAMETER :: M82N7FMye = 4300 - INTEGER(IntKi), PARAMETER :: M82N8FMye = 4301 - INTEGER(IntKi), PARAMETER :: M82N9FMye = 4302 - INTEGER(IntKi), PARAMETER :: M83N1FMye = 4303 - INTEGER(IntKi), PARAMETER :: M83N2FMye = 4304 - INTEGER(IntKi), PARAMETER :: M83N3FMye = 4305 - INTEGER(IntKi), PARAMETER :: M83N4FMye = 4306 - INTEGER(IntKi), PARAMETER :: M83N5FMye = 4307 - INTEGER(IntKi), PARAMETER :: M83N6FMye = 4308 - INTEGER(IntKi), PARAMETER :: M83N7FMye = 4309 - INTEGER(IntKi), PARAMETER :: M83N8FMye = 4310 - INTEGER(IntKi), PARAMETER :: M83N9FMye = 4311 - INTEGER(IntKi), PARAMETER :: M84N1FMye = 4312 - INTEGER(IntKi), PARAMETER :: M84N2FMye = 4313 - INTEGER(IntKi), PARAMETER :: M84N3FMye = 4314 - INTEGER(IntKi), PARAMETER :: M84N4FMye = 4315 - INTEGER(IntKi), PARAMETER :: M84N5FMye = 4316 - INTEGER(IntKi), PARAMETER :: M84N6FMye = 4317 - INTEGER(IntKi), PARAMETER :: M84N7FMye = 4318 - INTEGER(IntKi), PARAMETER :: M84N8FMye = 4319 - INTEGER(IntKi), PARAMETER :: M84N9FMye = 4320 - INTEGER(IntKi), PARAMETER :: M85N1FMye = 4321 - INTEGER(IntKi), PARAMETER :: M85N2FMye = 4322 - INTEGER(IntKi), PARAMETER :: M85N3FMye = 4323 - INTEGER(IntKi), PARAMETER :: M85N4FMye = 4324 - INTEGER(IntKi), PARAMETER :: M85N5FMye = 4325 - INTEGER(IntKi), PARAMETER :: M85N6FMye = 4326 - INTEGER(IntKi), PARAMETER :: M85N7FMye = 4327 - INTEGER(IntKi), PARAMETER :: M85N8FMye = 4328 - INTEGER(IntKi), PARAMETER :: M85N9FMye = 4329 - INTEGER(IntKi), PARAMETER :: M86N1FMye = 4330 - INTEGER(IntKi), PARAMETER :: M86N2FMye = 4331 - INTEGER(IntKi), PARAMETER :: M86N3FMye = 4332 - INTEGER(IntKi), PARAMETER :: M86N4FMye = 4333 - INTEGER(IntKi), PARAMETER :: M86N5FMye = 4334 - INTEGER(IntKi), PARAMETER :: M86N6FMye = 4335 - INTEGER(IntKi), PARAMETER :: M86N7FMye = 4336 - INTEGER(IntKi), PARAMETER :: M86N8FMye = 4337 - INTEGER(IntKi), PARAMETER :: M86N9FMye = 4338 - INTEGER(IntKi), PARAMETER :: M87N1FMye = 4339 - INTEGER(IntKi), PARAMETER :: M87N2FMye = 4340 - INTEGER(IntKi), PARAMETER :: M87N3FMye = 4341 - INTEGER(IntKi), PARAMETER :: M87N4FMye = 4342 - INTEGER(IntKi), PARAMETER :: M87N5FMye = 4343 - INTEGER(IntKi), PARAMETER :: M87N6FMye = 4344 - INTEGER(IntKi), PARAMETER :: M87N7FMye = 4345 - INTEGER(IntKi), PARAMETER :: M87N8FMye = 4346 - INTEGER(IntKi), PARAMETER :: M87N9FMye = 4347 - INTEGER(IntKi), PARAMETER :: M88N1FMye = 4348 - INTEGER(IntKi), PARAMETER :: M88N2FMye = 4349 - INTEGER(IntKi), PARAMETER :: M88N3FMye = 4350 - INTEGER(IntKi), PARAMETER :: M88N4FMye = 4351 - INTEGER(IntKi), PARAMETER :: M88N5FMye = 4352 - INTEGER(IntKi), PARAMETER :: M88N6FMye = 4353 - INTEGER(IntKi), PARAMETER :: M88N7FMye = 4354 - INTEGER(IntKi), PARAMETER :: M88N8FMye = 4355 - INTEGER(IntKi), PARAMETER :: M88N9FMye = 4356 - INTEGER(IntKi), PARAMETER :: M89N1FMye = 4357 - INTEGER(IntKi), PARAMETER :: M89N2FMye = 4358 - INTEGER(IntKi), PARAMETER :: M89N3FMye = 4359 - INTEGER(IntKi), PARAMETER :: M89N4FMye = 4360 - INTEGER(IntKi), PARAMETER :: M89N5FMye = 4361 - INTEGER(IntKi), PARAMETER :: M89N6FMye = 4362 - INTEGER(IntKi), PARAMETER :: M89N7FMye = 4363 - INTEGER(IntKi), PARAMETER :: M89N8FMye = 4364 - INTEGER(IntKi), PARAMETER :: M89N9FMye = 4365 - INTEGER(IntKi), PARAMETER :: M90N1FMye = 4366 - INTEGER(IntKi), PARAMETER :: M90N2FMye = 4367 - INTEGER(IntKi), PARAMETER :: M90N3FMye = 4368 - INTEGER(IntKi), PARAMETER :: M90N4FMye = 4369 - INTEGER(IntKi), PARAMETER :: M90N5FMye = 4370 - INTEGER(IntKi), PARAMETER :: M90N6FMye = 4371 - INTEGER(IntKi), PARAMETER :: M90N7FMye = 4372 - INTEGER(IntKi), PARAMETER :: M90N8FMye = 4373 - INTEGER(IntKi), PARAMETER :: M90N9FMye = 4374 - INTEGER(IntKi), PARAMETER :: M91N1FMye = 4375 - INTEGER(IntKi), PARAMETER :: M91N2FMye = 4376 - INTEGER(IntKi), PARAMETER :: M91N3FMye = 4377 - INTEGER(IntKi), PARAMETER :: M91N4FMye = 4378 - INTEGER(IntKi), PARAMETER :: M91N5FMye = 4379 - INTEGER(IntKi), PARAMETER :: M91N6FMye = 4380 - INTEGER(IntKi), PARAMETER :: M91N7FMye = 4381 - INTEGER(IntKi), PARAMETER :: M91N8FMye = 4382 - INTEGER(IntKi), PARAMETER :: M91N9FMye = 4383 - INTEGER(IntKi), PARAMETER :: M92N1FMye = 4384 - INTEGER(IntKi), PARAMETER :: M92N2FMye = 4385 - INTEGER(IntKi), PARAMETER :: M92N3FMye = 4386 - INTEGER(IntKi), PARAMETER :: M92N4FMye = 4387 - INTEGER(IntKi), PARAMETER :: M92N5FMye = 4388 - INTEGER(IntKi), PARAMETER :: M92N6FMye = 4389 - INTEGER(IntKi), PARAMETER :: M92N7FMye = 4390 - INTEGER(IntKi), PARAMETER :: M92N8FMye = 4391 - INTEGER(IntKi), PARAMETER :: M92N9FMye = 4392 - INTEGER(IntKi), PARAMETER :: M93N1FMye = 4393 - INTEGER(IntKi), PARAMETER :: M93N2FMye = 4394 - INTEGER(IntKi), PARAMETER :: M93N3FMye = 4395 - INTEGER(IntKi), PARAMETER :: M93N4FMye = 4396 - INTEGER(IntKi), PARAMETER :: M93N5FMye = 4397 - INTEGER(IntKi), PARAMETER :: M93N6FMye = 4398 - INTEGER(IntKi), PARAMETER :: M93N7FMye = 4399 - INTEGER(IntKi), PARAMETER :: M93N8FMye = 4400 - INTEGER(IntKi), PARAMETER :: M93N9FMye = 4401 - INTEGER(IntKi), PARAMETER :: M94N1FMye = 4402 - INTEGER(IntKi), PARAMETER :: M94N2FMye = 4403 - INTEGER(IntKi), PARAMETER :: M94N3FMye = 4404 - INTEGER(IntKi), PARAMETER :: M94N4FMye = 4405 - INTEGER(IntKi), PARAMETER :: M94N5FMye = 4406 - INTEGER(IntKi), PARAMETER :: M94N6FMye = 4407 - INTEGER(IntKi), PARAMETER :: M94N7FMye = 4408 - INTEGER(IntKi), PARAMETER :: M94N8FMye = 4409 - INTEGER(IntKi), PARAMETER :: M94N9FMye = 4410 - INTEGER(IntKi), PARAMETER :: M95N1FMye = 4411 - INTEGER(IntKi), PARAMETER :: M95N2FMye = 4412 - INTEGER(IntKi), PARAMETER :: M95N3FMye = 4413 - INTEGER(IntKi), PARAMETER :: M95N4FMye = 4414 - INTEGER(IntKi), PARAMETER :: M95N5FMye = 4415 - INTEGER(IntKi), PARAMETER :: M95N6FMye = 4416 - INTEGER(IntKi), PARAMETER :: M95N7FMye = 4417 - INTEGER(IntKi), PARAMETER :: M95N8FMye = 4418 - INTEGER(IntKi), PARAMETER :: M95N9FMye = 4419 - INTEGER(IntKi), PARAMETER :: M96N1FMye = 4420 - INTEGER(IntKi), PARAMETER :: M96N2FMye = 4421 - INTEGER(IntKi), PARAMETER :: M96N3FMye = 4422 - INTEGER(IntKi), PARAMETER :: M96N4FMye = 4423 - INTEGER(IntKi), PARAMETER :: M96N5FMye = 4424 - INTEGER(IntKi), PARAMETER :: M96N6FMye = 4425 - INTEGER(IntKi), PARAMETER :: M96N7FMye = 4426 - INTEGER(IntKi), PARAMETER :: M96N8FMye = 4427 - INTEGER(IntKi), PARAMETER :: M96N9FMye = 4428 - INTEGER(IntKi), PARAMETER :: M97N1FMye = 4429 - INTEGER(IntKi), PARAMETER :: M97N2FMye = 4430 - INTEGER(IntKi), PARAMETER :: M97N3FMye = 4431 - INTEGER(IntKi), PARAMETER :: M97N4FMye = 4432 - INTEGER(IntKi), PARAMETER :: M97N5FMye = 4433 - INTEGER(IntKi), PARAMETER :: M97N6FMye = 4434 - INTEGER(IntKi), PARAMETER :: M97N7FMye = 4435 - INTEGER(IntKi), PARAMETER :: M97N8FMye = 4436 - INTEGER(IntKi), PARAMETER :: M97N9FMye = 4437 - INTEGER(IntKi), PARAMETER :: M98N1FMye = 4438 - INTEGER(IntKi), PARAMETER :: M98N2FMye = 4439 - INTEGER(IntKi), PARAMETER :: M98N3FMye = 4440 - INTEGER(IntKi), PARAMETER :: M98N4FMye = 4441 - INTEGER(IntKi), PARAMETER :: M98N5FMye = 4442 - INTEGER(IntKi), PARAMETER :: M98N6FMye = 4443 - INTEGER(IntKi), PARAMETER :: M98N7FMye = 4444 - INTEGER(IntKi), PARAMETER :: M98N8FMye = 4445 - INTEGER(IntKi), PARAMETER :: M98N9FMye = 4446 - INTEGER(IntKi), PARAMETER :: M99N1FMye = 4447 - INTEGER(IntKi), PARAMETER :: M99N2FMye = 4448 - INTEGER(IntKi), PARAMETER :: M99N3FMye = 4449 - INTEGER(IntKi), PARAMETER :: M99N4FMye = 4450 - INTEGER(IntKi), PARAMETER :: M99N5FMye = 4451 - INTEGER(IntKi), PARAMETER :: M99N6FMye = 4452 - INTEGER(IntKi), PARAMETER :: M99N7FMye = 4453 - INTEGER(IntKi), PARAMETER :: M99N8FMye = 4454 - INTEGER(IntKi), PARAMETER :: M99N9FMye = 4455 - INTEGER(IntKi), PARAMETER :: M01N1FMze = 4456 - INTEGER(IntKi), PARAMETER :: M01N2FMze = 4457 - INTEGER(IntKi), PARAMETER :: M01N3FMze = 4458 - INTEGER(IntKi), PARAMETER :: M01N4FMze = 4459 - INTEGER(IntKi), PARAMETER :: M01N5FMze = 4460 - INTEGER(IntKi), PARAMETER :: M01N6FMze = 4461 - INTEGER(IntKi), PARAMETER :: M01N7FMze = 4462 - INTEGER(IntKi), PARAMETER :: M01N8FMze = 4463 - INTEGER(IntKi), PARAMETER :: M01N9FMze = 4464 - INTEGER(IntKi), PARAMETER :: M02N1FMze = 4465 - INTEGER(IntKi), PARAMETER :: M02N2FMze = 4466 - INTEGER(IntKi), PARAMETER :: M02N3FMze = 4467 - INTEGER(IntKi), PARAMETER :: M02N4FMze = 4468 - INTEGER(IntKi), PARAMETER :: M02N5FMze = 4469 - INTEGER(IntKi), PARAMETER :: M02N6FMze = 4470 - INTEGER(IntKi), PARAMETER :: M02N7FMze = 4471 - INTEGER(IntKi), PARAMETER :: M02N8FMze = 4472 - INTEGER(IntKi), PARAMETER :: M02N9FMze = 4473 - INTEGER(IntKi), PARAMETER :: M03N1FMze = 4474 - INTEGER(IntKi), PARAMETER :: M03N2FMze = 4475 - INTEGER(IntKi), PARAMETER :: M03N3FMze = 4476 - INTEGER(IntKi), PARAMETER :: M03N4FMze = 4477 - INTEGER(IntKi), PARAMETER :: M03N5FMze = 4478 - INTEGER(IntKi), PARAMETER :: M03N6FMze = 4479 - INTEGER(IntKi), PARAMETER :: M03N7FMze = 4480 - INTEGER(IntKi), PARAMETER :: M03N8FMze = 4481 - INTEGER(IntKi), PARAMETER :: M03N9FMze = 4482 - INTEGER(IntKi), PARAMETER :: M04N1FMze = 4483 - INTEGER(IntKi), PARAMETER :: M04N2FMze = 4484 - INTEGER(IntKi), PARAMETER :: M04N3FMze = 4485 - INTEGER(IntKi), PARAMETER :: M04N4FMze = 4486 - INTEGER(IntKi), PARAMETER :: M04N5FMze = 4487 - INTEGER(IntKi), PARAMETER :: M04N6FMze = 4488 - INTEGER(IntKi), PARAMETER :: M04N7FMze = 4489 - INTEGER(IntKi), PARAMETER :: M04N8FMze = 4490 - INTEGER(IntKi), PARAMETER :: M04N9FMze = 4491 - INTEGER(IntKi), PARAMETER :: M05N1FMze = 4492 - INTEGER(IntKi), PARAMETER :: M05N2FMze = 4493 - INTEGER(IntKi), PARAMETER :: M05N3FMze = 4494 - INTEGER(IntKi), PARAMETER :: M05N4FMze = 4495 - INTEGER(IntKi), PARAMETER :: M05N5FMze = 4496 - INTEGER(IntKi), PARAMETER :: M05N6FMze = 4497 - INTEGER(IntKi), PARAMETER :: M05N7FMze = 4498 - INTEGER(IntKi), PARAMETER :: M05N8FMze = 4499 - INTEGER(IntKi), PARAMETER :: M05N9FMze = 4500 - INTEGER(IntKi), PARAMETER :: M06N1FMze = 4501 - INTEGER(IntKi), PARAMETER :: M06N2FMze = 4502 - INTEGER(IntKi), PARAMETER :: M06N3FMze = 4503 - INTEGER(IntKi), PARAMETER :: M06N4FMze = 4504 - INTEGER(IntKi), PARAMETER :: M06N5FMze = 4505 - INTEGER(IntKi), PARAMETER :: M06N6FMze = 4506 - INTEGER(IntKi), PARAMETER :: M06N7FMze = 4507 - INTEGER(IntKi), PARAMETER :: M06N8FMze = 4508 - INTEGER(IntKi), PARAMETER :: M06N9FMze = 4509 - INTEGER(IntKi), PARAMETER :: M07N1FMze = 4510 - INTEGER(IntKi), PARAMETER :: M07N2FMze = 4511 - INTEGER(IntKi), PARAMETER :: M07N3FMze = 4512 - INTEGER(IntKi), PARAMETER :: M07N4FMze = 4513 - INTEGER(IntKi), PARAMETER :: M07N5FMze = 4514 - INTEGER(IntKi), PARAMETER :: M07N6FMze = 4515 - INTEGER(IntKi), PARAMETER :: M07N7FMze = 4516 - INTEGER(IntKi), PARAMETER :: M07N8FMze = 4517 - INTEGER(IntKi), PARAMETER :: M07N9FMze = 4518 - INTEGER(IntKi), PARAMETER :: M08N1FMze = 4519 - INTEGER(IntKi), PARAMETER :: M08N2FMze = 4520 - INTEGER(IntKi), PARAMETER :: M08N3FMze = 4521 - INTEGER(IntKi), PARAMETER :: M08N4FMze = 4522 - INTEGER(IntKi), PARAMETER :: M08N5FMze = 4523 - INTEGER(IntKi), PARAMETER :: M08N6FMze = 4524 - INTEGER(IntKi), PARAMETER :: M08N7FMze = 4525 - INTEGER(IntKi), PARAMETER :: M08N8FMze = 4526 - INTEGER(IntKi), PARAMETER :: M08N9FMze = 4527 - INTEGER(IntKi), PARAMETER :: M09N1FMze = 4528 - INTEGER(IntKi), PARAMETER :: M09N2FMze = 4529 - INTEGER(IntKi), PARAMETER :: M09N3FMze = 4530 - INTEGER(IntKi), PARAMETER :: M09N4FMze = 4531 - INTEGER(IntKi), PARAMETER :: M09N5FMze = 4532 - INTEGER(IntKi), PARAMETER :: M09N6FMze = 4533 - INTEGER(IntKi), PARAMETER :: M09N7FMze = 4534 - INTEGER(IntKi), PARAMETER :: M09N8FMze = 4535 - INTEGER(IntKi), PARAMETER :: M09N9FMze = 4536 - INTEGER(IntKi), PARAMETER :: M10N1FMze = 4537 - INTEGER(IntKi), PARAMETER :: M10N2FMze = 4538 - INTEGER(IntKi), PARAMETER :: M10N3FMze = 4539 - INTEGER(IntKi), PARAMETER :: M10N4FMze = 4540 - INTEGER(IntKi), PARAMETER :: M10N5FMze = 4541 - INTEGER(IntKi), PARAMETER :: M10N6FMze = 4542 - INTEGER(IntKi), PARAMETER :: M10N7FMze = 4543 - INTEGER(IntKi), PARAMETER :: M10N8FMze = 4544 - INTEGER(IntKi), PARAMETER :: M10N9FMze = 4545 - INTEGER(IntKi), PARAMETER :: M11N1FMze = 4546 - INTEGER(IntKi), PARAMETER :: M11N2FMze = 4547 - INTEGER(IntKi), PARAMETER :: M11N3FMze = 4548 - INTEGER(IntKi), PARAMETER :: M11N4FMze = 4549 - INTEGER(IntKi), PARAMETER :: M11N5FMze = 4550 - INTEGER(IntKi), PARAMETER :: M11N6FMze = 4551 - INTEGER(IntKi), PARAMETER :: M11N7FMze = 4552 - INTEGER(IntKi), PARAMETER :: M11N8FMze = 4553 - INTEGER(IntKi), PARAMETER :: M11N9FMze = 4554 - INTEGER(IntKi), PARAMETER :: M12N1FMze = 4555 - INTEGER(IntKi), PARAMETER :: M12N2FMze = 4556 - INTEGER(IntKi), PARAMETER :: M12N3FMze = 4557 - INTEGER(IntKi), PARAMETER :: M12N4FMze = 4558 - INTEGER(IntKi), PARAMETER :: M12N5FMze = 4559 - INTEGER(IntKi), PARAMETER :: M12N6FMze = 4560 - INTEGER(IntKi), PARAMETER :: M12N7FMze = 4561 - INTEGER(IntKi), PARAMETER :: M12N8FMze = 4562 - INTEGER(IntKi), PARAMETER :: M12N9FMze = 4563 - INTEGER(IntKi), PARAMETER :: M13N1FMze = 4564 - INTEGER(IntKi), PARAMETER :: M13N2FMze = 4565 - INTEGER(IntKi), PARAMETER :: M13N3FMze = 4566 - INTEGER(IntKi), PARAMETER :: M13N4FMze = 4567 - INTEGER(IntKi), PARAMETER :: M13N5FMze = 4568 - INTEGER(IntKi), PARAMETER :: M13N6FMze = 4569 - INTEGER(IntKi), PARAMETER :: M13N7FMze = 4570 - INTEGER(IntKi), PARAMETER :: M13N8FMze = 4571 - INTEGER(IntKi), PARAMETER :: M13N9FMze = 4572 - INTEGER(IntKi), PARAMETER :: M14N1FMze = 4573 - INTEGER(IntKi), PARAMETER :: M14N2FMze = 4574 - INTEGER(IntKi), PARAMETER :: M14N3FMze = 4575 - INTEGER(IntKi), PARAMETER :: M14N4FMze = 4576 - INTEGER(IntKi), PARAMETER :: M14N5FMze = 4577 - INTEGER(IntKi), PARAMETER :: M14N6FMze = 4578 - INTEGER(IntKi), PARAMETER :: M14N7FMze = 4579 - INTEGER(IntKi), PARAMETER :: M14N8FMze = 4580 - INTEGER(IntKi), PARAMETER :: M14N9FMze = 4581 - INTEGER(IntKi), PARAMETER :: M15N1FMze = 4582 - INTEGER(IntKi), PARAMETER :: M15N2FMze = 4583 - INTEGER(IntKi), PARAMETER :: M15N3FMze = 4584 - INTEGER(IntKi), PARAMETER :: M15N4FMze = 4585 - INTEGER(IntKi), PARAMETER :: M15N5FMze = 4586 - INTEGER(IntKi), PARAMETER :: M15N6FMze = 4587 - INTEGER(IntKi), PARAMETER :: M15N7FMze = 4588 - INTEGER(IntKi), PARAMETER :: M15N8FMze = 4589 - INTEGER(IntKi), PARAMETER :: M15N9FMze = 4590 - INTEGER(IntKi), PARAMETER :: M16N1FMze = 4591 - INTEGER(IntKi), PARAMETER :: M16N2FMze = 4592 - INTEGER(IntKi), PARAMETER :: M16N3FMze = 4593 - INTEGER(IntKi), PARAMETER :: M16N4FMze = 4594 - INTEGER(IntKi), PARAMETER :: M16N5FMze = 4595 - INTEGER(IntKi), PARAMETER :: M16N6FMze = 4596 - INTEGER(IntKi), PARAMETER :: M16N7FMze = 4597 - INTEGER(IntKi), PARAMETER :: M16N8FMze = 4598 - INTEGER(IntKi), PARAMETER :: M16N9FMze = 4599 - INTEGER(IntKi), PARAMETER :: M17N1FMze = 4600 - INTEGER(IntKi), PARAMETER :: M17N2FMze = 4601 - INTEGER(IntKi), PARAMETER :: M17N3FMze = 4602 - INTEGER(IntKi), PARAMETER :: M17N4FMze = 4603 - INTEGER(IntKi), PARAMETER :: M17N5FMze = 4604 - INTEGER(IntKi), PARAMETER :: M17N6FMze = 4605 - INTEGER(IntKi), PARAMETER :: M17N7FMze = 4606 - INTEGER(IntKi), PARAMETER :: M17N8FMze = 4607 - INTEGER(IntKi), PARAMETER :: M17N9FMze = 4608 - INTEGER(IntKi), PARAMETER :: M18N1FMze = 4609 - INTEGER(IntKi), PARAMETER :: M18N2FMze = 4610 - INTEGER(IntKi), PARAMETER :: M18N3FMze = 4611 - INTEGER(IntKi), PARAMETER :: M18N4FMze = 4612 - INTEGER(IntKi), PARAMETER :: M18N5FMze = 4613 - INTEGER(IntKi), PARAMETER :: M18N6FMze = 4614 - INTEGER(IntKi), PARAMETER :: M18N7FMze = 4615 - INTEGER(IntKi), PARAMETER :: M18N8FMze = 4616 - INTEGER(IntKi), PARAMETER :: M18N9FMze = 4617 - INTEGER(IntKi), PARAMETER :: M19N1FMze = 4618 - INTEGER(IntKi), PARAMETER :: M19N2FMze = 4619 - INTEGER(IntKi), PARAMETER :: M19N3FMze = 4620 - INTEGER(IntKi), PARAMETER :: M19N4FMze = 4621 - INTEGER(IntKi), PARAMETER :: M19N5FMze = 4622 - INTEGER(IntKi), PARAMETER :: M19N6FMze = 4623 - INTEGER(IntKi), PARAMETER :: M19N7FMze = 4624 - INTEGER(IntKi), PARAMETER :: M19N8FMze = 4625 - INTEGER(IntKi), PARAMETER :: M19N9FMze = 4626 - INTEGER(IntKi), PARAMETER :: M20N1FMze = 4627 - INTEGER(IntKi), PARAMETER :: M20N2FMze = 4628 - INTEGER(IntKi), PARAMETER :: M20N3FMze = 4629 - INTEGER(IntKi), PARAMETER :: M20N4FMze = 4630 - INTEGER(IntKi), PARAMETER :: M20N5FMze = 4631 - INTEGER(IntKi), PARAMETER :: M20N6FMze = 4632 - INTEGER(IntKi), PARAMETER :: M20N7FMze = 4633 - INTEGER(IntKi), PARAMETER :: M20N8FMze = 4634 - INTEGER(IntKi), PARAMETER :: M20N9FMze = 4635 - INTEGER(IntKi), PARAMETER :: M21N1FMze = 4636 - INTEGER(IntKi), PARAMETER :: M21N2FMze = 4637 - INTEGER(IntKi), PARAMETER :: M21N3FMze = 4638 - INTEGER(IntKi), PARAMETER :: M21N4FMze = 4639 - INTEGER(IntKi), PARAMETER :: M21N5FMze = 4640 - INTEGER(IntKi), PARAMETER :: M21N6FMze = 4641 - INTEGER(IntKi), PARAMETER :: M21N7FMze = 4642 - INTEGER(IntKi), PARAMETER :: M21N8FMze = 4643 - INTEGER(IntKi), PARAMETER :: M21N9FMze = 4644 - INTEGER(IntKi), PARAMETER :: M22N1FMze = 4645 - INTEGER(IntKi), PARAMETER :: M22N2FMze = 4646 - INTEGER(IntKi), PARAMETER :: M22N3FMze = 4647 - INTEGER(IntKi), PARAMETER :: M22N4FMze = 4648 - INTEGER(IntKi), PARAMETER :: M22N5FMze = 4649 - INTEGER(IntKi), PARAMETER :: M22N6FMze = 4650 - INTEGER(IntKi), PARAMETER :: M22N7FMze = 4651 - INTEGER(IntKi), PARAMETER :: M22N8FMze = 4652 - INTEGER(IntKi), PARAMETER :: M22N9FMze = 4653 - INTEGER(IntKi), PARAMETER :: M23N1FMze = 4654 - INTEGER(IntKi), PARAMETER :: M23N2FMze = 4655 - INTEGER(IntKi), PARAMETER :: M23N3FMze = 4656 - INTEGER(IntKi), PARAMETER :: M23N4FMze = 4657 - INTEGER(IntKi), PARAMETER :: M23N5FMze = 4658 - INTEGER(IntKi), PARAMETER :: M23N6FMze = 4659 - INTEGER(IntKi), PARAMETER :: M23N7FMze = 4660 - INTEGER(IntKi), PARAMETER :: M23N8FMze = 4661 - INTEGER(IntKi), PARAMETER :: M23N9FMze = 4662 - INTEGER(IntKi), PARAMETER :: M24N1FMze = 4663 - INTEGER(IntKi), PARAMETER :: M24N2FMze = 4664 - INTEGER(IntKi), PARAMETER :: M24N3FMze = 4665 - INTEGER(IntKi), PARAMETER :: M24N4FMze = 4666 - INTEGER(IntKi), PARAMETER :: M24N5FMze = 4667 - INTEGER(IntKi), PARAMETER :: M24N6FMze = 4668 - INTEGER(IntKi), PARAMETER :: M24N7FMze = 4669 - INTEGER(IntKi), PARAMETER :: M24N8FMze = 4670 - INTEGER(IntKi), PARAMETER :: M24N9FMze = 4671 - INTEGER(IntKi), PARAMETER :: M25N1FMze = 4672 - INTEGER(IntKi), PARAMETER :: M25N2FMze = 4673 - INTEGER(IntKi), PARAMETER :: M25N3FMze = 4674 - INTEGER(IntKi), PARAMETER :: M25N4FMze = 4675 - INTEGER(IntKi), PARAMETER :: M25N5FMze = 4676 - INTEGER(IntKi), PARAMETER :: M25N6FMze = 4677 - INTEGER(IntKi), PARAMETER :: M25N7FMze = 4678 - INTEGER(IntKi), PARAMETER :: M25N8FMze = 4679 - INTEGER(IntKi), PARAMETER :: M25N9FMze = 4680 - INTEGER(IntKi), PARAMETER :: M26N1FMze = 4681 - INTEGER(IntKi), PARAMETER :: M26N2FMze = 4682 - INTEGER(IntKi), PARAMETER :: M26N3FMze = 4683 - INTEGER(IntKi), PARAMETER :: M26N4FMze = 4684 - INTEGER(IntKi), PARAMETER :: M26N5FMze = 4685 - INTEGER(IntKi), PARAMETER :: M26N6FMze = 4686 - INTEGER(IntKi), PARAMETER :: M26N7FMze = 4687 - INTEGER(IntKi), PARAMETER :: M26N8FMze = 4688 - INTEGER(IntKi), PARAMETER :: M26N9FMze = 4689 - INTEGER(IntKi), PARAMETER :: M27N1FMze = 4690 - INTEGER(IntKi), PARAMETER :: M27N2FMze = 4691 - INTEGER(IntKi), PARAMETER :: M27N3FMze = 4692 - INTEGER(IntKi), PARAMETER :: M27N4FMze = 4693 - INTEGER(IntKi), PARAMETER :: M27N5FMze = 4694 - INTEGER(IntKi), PARAMETER :: M27N6FMze = 4695 - INTEGER(IntKi), PARAMETER :: M27N7FMze = 4696 - INTEGER(IntKi), PARAMETER :: M27N8FMze = 4697 - INTEGER(IntKi), PARAMETER :: M27N9FMze = 4698 - INTEGER(IntKi), PARAMETER :: M28N1FMze = 4699 - INTEGER(IntKi), PARAMETER :: M28N2FMze = 4700 - INTEGER(IntKi), PARAMETER :: M28N3FMze = 4701 - INTEGER(IntKi), PARAMETER :: M28N4FMze = 4702 - INTEGER(IntKi), PARAMETER :: M28N5FMze = 4703 - INTEGER(IntKi), PARAMETER :: M28N6FMze = 4704 - INTEGER(IntKi), PARAMETER :: M28N7FMze = 4705 - INTEGER(IntKi), PARAMETER :: M28N8FMze = 4706 - INTEGER(IntKi), PARAMETER :: M28N9FMze = 4707 - INTEGER(IntKi), PARAMETER :: M29N1FMze = 4708 - INTEGER(IntKi), PARAMETER :: M29N2FMze = 4709 - INTEGER(IntKi), PARAMETER :: M29N3FMze = 4710 - INTEGER(IntKi), PARAMETER :: M29N4FMze = 4711 - INTEGER(IntKi), PARAMETER :: M29N5FMze = 4712 - INTEGER(IntKi), PARAMETER :: M29N6FMze = 4713 - INTEGER(IntKi), PARAMETER :: M29N7FMze = 4714 - INTEGER(IntKi), PARAMETER :: M29N8FMze = 4715 - INTEGER(IntKi), PARAMETER :: M29N9FMze = 4716 - INTEGER(IntKi), PARAMETER :: M30N1FMze = 4717 - INTEGER(IntKi), PARAMETER :: M30N2FMze = 4718 - INTEGER(IntKi), PARAMETER :: M30N3FMze = 4719 - INTEGER(IntKi), PARAMETER :: M30N4FMze = 4720 - INTEGER(IntKi), PARAMETER :: M30N5FMze = 4721 - INTEGER(IntKi), PARAMETER :: M30N6FMze = 4722 - INTEGER(IntKi), PARAMETER :: M30N7FMze = 4723 - INTEGER(IntKi), PARAMETER :: M30N8FMze = 4724 - INTEGER(IntKi), PARAMETER :: M30N9FMze = 4725 - INTEGER(IntKi), PARAMETER :: M31N1FMze = 4726 - INTEGER(IntKi), PARAMETER :: M31N2FMze = 4727 - INTEGER(IntKi), PARAMETER :: M31N3FMze = 4728 - INTEGER(IntKi), PARAMETER :: M31N4FMze = 4729 - INTEGER(IntKi), PARAMETER :: M31N5FMze = 4730 - INTEGER(IntKi), PARAMETER :: M31N6FMze = 4731 - INTEGER(IntKi), PARAMETER :: M31N7FMze = 4732 - INTEGER(IntKi), PARAMETER :: M31N8FMze = 4733 - INTEGER(IntKi), PARAMETER :: M31N9FMze = 4734 - INTEGER(IntKi), PARAMETER :: M32N1FMze = 4735 - INTEGER(IntKi), PARAMETER :: M32N2FMze = 4736 - INTEGER(IntKi), PARAMETER :: M32N3FMze = 4737 - INTEGER(IntKi), PARAMETER :: M32N4FMze = 4738 - INTEGER(IntKi), PARAMETER :: M32N5FMze = 4739 - INTEGER(IntKi), PARAMETER :: M32N6FMze = 4740 - INTEGER(IntKi), PARAMETER :: M32N7FMze = 4741 - INTEGER(IntKi), PARAMETER :: M32N8FMze = 4742 - INTEGER(IntKi), PARAMETER :: M32N9FMze = 4743 - INTEGER(IntKi), PARAMETER :: M33N1FMze = 4744 - INTEGER(IntKi), PARAMETER :: M33N2FMze = 4745 - INTEGER(IntKi), PARAMETER :: M33N3FMze = 4746 - INTEGER(IntKi), PARAMETER :: M33N4FMze = 4747 - INTEGER(IntKi), PARAMETER :: M33N5FMze = 4748 - INTEGER(IntKi), PARAMETER :: M33N6FMze = 4749 - INTEGER(IntKi), PARAMETER :: M33N7FMze = 4750 - INTEGER(IntKi), PARAMETER :: M33N8FMze = 4751 - INTEGER(IntKi), PARAMETER :: M33N9FMze = 4752 - INTEGER(IntKi), PARAMETER :: M34N1FMze = 4753 - INTEGER(IntKi), PARAMETER :: M34N2FMze = 4754 - INTEGER(IntKi), PARAMETER :: M34N3FMze = 4755 - INTEGER(IntKi), PARAMETER :: M34N4FMze = 4756 - INTEGER(IntKi), PARAMETER :: M34N5FMze = 4757 - INTEGER(IntKi), PARAMETER :: M34N6FMze = 4758 - INTEGER(IntKi), PARAMETER :: M34N7FMze = 4759 - INTEGER(IntKi), PARAMETER :: M34N8FMze = 4760 - INTEGER(IntKi), PARAMETER :: M34N9FMze = 4761 - INTEGER(IntKi), PARAMETER :: M35N1FMze = 4762 - INTEGER(IntKi), PARAMETER :: M35N2FMze = 4763 - INTEGER(IntKi), PARAMETER :: M35N3FMze = 4764 - INTEGER(IntKi), PARAMETER :: M35N4FMze = 4765 - INTEGER(IntKi), PARAMETER :: M35N5FMze = 4766 - INTEGER(IntKi), PARAMETER :: M35N6FMze = 4767 - INTEGER(IntKi), PARAMETER :: M35N7FMze = 4768 - INTEGER(IntKi), PARAMETER :: M35N8FMze = 4769 - INTEGER(IntKi), PARAMETER :: M35N9FMze = 4770 - INTEGER(IntKi), PARAMETER :: M36N1FMze = 4771 - INTEGER(IntKi), PARAMETER :: M36N2FMze = 4772 - INTEGER(IntKi), PARAMETER :: M36N3FMze = 4773 - INTEGER(IntKi), PARAMETER :: M36N4FMze = 4774 - INTEGER(IntKi), PARAMETER :: M36N5FMze = 4775 - INTEGER(IntKi), PARAMETER :: M36N6FMze = 4776 - INTEGER(IntKi), PARAMETER :: M36N7FMze = 4777 - INTEGER(IntKi), PARAMETER :: M36N8FMze = 4778 - INTEGER(IntKi), PARAMETER :: M36N9FMze = 4779 - INTEGER(IntKi), PARAMETER :: M37N1FMze = 4780 - INTEGER(IntKi), PARAMETER :: M37N2FMze = 4781 - INTEGER(IntKi), PARAMETER :: M37N3FMze = 4782 - INTEGER(IntKi), PARAMETER :: M37N4FMze = 4783 - INTEGER(IntKi), PARAMETER :: M37N5FMze = 4784 - INTEGER(IntKi), PARAMETER :: M37N6FMze = 4785 - INTEGER(IntKi), PARAMETER :: M37N7FMze = 4786 - INTEGER(IntKi), PARAMETER :: M37N8FMze = 4787 - INTEGER(IntKi), PARAMETER :: M37N9FMze = 4788 - INTEGER(IntKi), PARAMETER :: M38N1FMze = 4789 - INTEGER(IntKi), PARAMETER :: M38N2FMze = 4790 - INTEGER(IntKi), PARAMETER :: M38N3FMze = 4791 - INTEGER(IntKi), PARAMETER :: M38N4FMze = 4792 - INTEGER(IntKi), PARAMETER :: M38N5FMze = 4793 - INTEGER(IntKi), PARAMETER :: M38N6FMze = 4794 - INTEGER(IntKi), PARAMETER :: M38N7FMze = 4795 - INTEGER(IntKi), PARAMETER :: M38N8FMze = 4796 - INTEGER(IntKi), PARAMETER :: M38N9FMze = 4797 - INTEGER(IntKi), PARAMETER :: M39N1FMze = 4798 - INTEGER(IntKi), PARAMETER :: M39N2FMze = 4799 - INTEGER(IntKi), PARAMETER :: M39N3FMze = 4800 - INTEGER(IntKi), PARAMETER :: M39N4FMze = 4801 - INTEGER(IntKi), PARAMETER :: M39N5FMze = 4802 - INTEGER(IntKi), PARAMETER :: M39N6FMze = 4803 - INTEGER(IntKi), PARAMETER :: M39N7FMze = 4804 - INTEGER(IntKi), PARAMETER :: M39N8FMze = 4805 - INTEGER(IntKi), PARAMETER :: M39N9FMze = 4806 - INTEGER(IntKi), PARAMETER :: M40N1FMze = 4807 - INTEGER(IntKi), PARAMETER :: M40N2FMze = 4808 - INTEGER(IntKi), PARAMETER :: M40N3FMze = 4809 - INTEGER(IntKi), PARAMETER :: M40N4FMze = 4810 - INTEGER(IntKi), PARAMETER :: M40N5FMze = 4811 - INTEGER(IntKi), PARAMETER :: M40N6FMze = 4812 - INTEGER(IntKi), PARAMETER :: M40N7FMze = 4813 - INTEGER(IntKi), PARAMETER :: M40N8FMze = 4814 - INTEGER(IntKi), PARAMETER :: M40N9FMze = 4815 - INTEGER(IntKi), PARAMETER :: M41N1FMze = 4816 - INTEGER(IntKi), PARAMETER :: M41N2FMze = 4817 - INTEGER(IntKi), PARAMETER :: M41N3FMze = 4818 - INTEGER(IntKi), PARAMETER :: M41N4FMze = 4819 - INTEGER(IntKi), PARAMETER :: M41N5FMze = 4820 - INTEGER(IntKi), PARAMETER :: M41N6FMze = 4821 - INTEGER(IntKi), PARAMETER :: M41N7FMze = 4822 - INTEGER(IntKi), PARAMETER :: M41N8FMze = 4823 - INTEGER(IntKi), PARAMETER :: M41N9FMze = 4824 - INTEGER(IntKi), PARAMETER :: M42N1FMze = 4825 - INTEGER(IntKi), PARAMETER :: M42N2FMze = 4826 - INTEGER(IntKi), PARAMETER :: M42N3FMze = 4827 - INTEGER(IntKi), PARAMETER :: M42N4FMze = 4828 - INTEGER(IntKi), PARAMETER :: M42N5FMze = 4829 - INTEGER(IntKi), PARAMETER :: M42N6FMze = 4830 - INTEGER(IntKi), PARAMETER :: M42N7FMze = 4831 - INTEGER(IntKi), PARAMETER :: M42N8FMze = 4832 - INTEGER(IntKi), PARAMETER :: M42N9FMze = 4833 - INTEGER(IntKi), PARAMETER :: M43N1FMze = 4834 - INTEGER(IntKi), PARAMETER :: M43N2FMze = 4835 - INTEGER(IntKi), PARAMETER :: M43N3FMze = 4836 - INTEGER(IntKi), PARAMETER :: M43N4FMze = 4837 - INTEGER(IntKi), PARAMETER :: M43N5FMze = 4838 - INTEGER(IntKi), PARAMETER :: M43N6FMze = 4839 - INTEGER(IntKi), PARAMETER :: M43N7FMze = 4840 - INTEGER(IntKi), PARAMETER :: M43N8FMze = 4841 - INTEGER(IntKi), PARAMETER :: M43N9FMze = 4842 - INTEGER(IntKi), PARAMETER :: M44N1FMze = 4843 - INTEGER(IntKi), PARAMETER :: M44N2FMze = 4844 - INTEGER(IntKi), PARAMETER :: M44N3FMze = 4845 - INTEGER(IntKi), PARAMETER :: M44N4FMze = 4846 - INTEGER(IntKi), PARAMETER :: M44N5FMze = 4847 - INTEGER(IntKi), PARAMETER :: M44N6FMze = 4848 - INTEGER(IntKi), PARAMETER :: M44N7FMze = 4849 - INTEGER(IntKi), PARAMETER :: M44N8FMze = 4850 - INTEGER(IntKi), PARAMETER :: M44N9FMze = 4851 - INTEGER(IntKi), PARAMETER :: M45N1FMze = 4852 - INTEGER(IntKi), PARAMETER :: M45N2FMze = 4853 - INTEGER(IntKi), PARAMETER :: M45N3FMze = 4854 - INTEGER(IntKi), PARAMETER :: M45N4FMze = 4855 - INTEGER(IntKi), PARAMETER :: M45N5FMze = 4856 - INTEGER(IntKi), PARAMETER :: M45N6FMze = 4857 - INTEGER(IntKi), PARAMETER :: M45N7FMze = 4858 - INTEGER(IntKi), PARAMETER :: M45N8FMze = 4859 - INTEGER(IntKi), PARAMETER :: M45N9FMze = 4860 - INTEGER(IntKi), PARAMETER :: M46N1FMze = 4861 - INTEGER(IntKi), PARAMETER :: M46N2FMze = 4862 - INTEGER(IntKi), PARAMETER :: M46N3FMze = 4863 - INTEGER(IntKi), PARAMETER :: M46N4FMze = 4864 - INTEGER(IntKi), PARAMETER :: M46N5FMze = 4865 - INTEGER(IntKi), PARAMETER :: M46N6FMze = 4866 - INTEGER(IntKi), PARAMETER :: M46N7FMze = 4867 - INTEGER(IntKi), PARAMETER :: M46N8FMze = 4868 - INTEGER(IntKi), PARAMETER :: M46N9FMze = 4869 - INTEGER(IntKi), PARAMETER :: M47N1FMze = 4870 - INTEGER(IntKi), PARAMETER :: M47N2FMze = 4871 - INTEGER(IntKi), PARAMETER :: M47N3FMze = 4872 - INTEGER(IntKi), PARAMETER :: M47N4FMze = 4873 - INTEGER(IntKi), PARAMETER :: M47N5FMze = 4874 - INTEGER(IntKi), PARAMETER :: M47N6FMze = 4875 - INTEGER(IntKi), PARAMETER :: M47N7FMze = 4876 - INTEGER(IntKi), PARAMETER :: M47N8FMze = 4877 - INTEGER(IntKi), PARAMETER :: M47N9FMze = 4878 - INTEGER(IntKi), PARAMETER :: M48N1FMze = 4879 - INTEGER(IntKi), PARAMETER :: M48N2FMze = 4880 - INTEGER(IntKi), PARAMETER :: M48N3FMze = 4881 - INTEGER(IntKi), PARAMETER :: M48N4FMze = 4882 - INTEGER(IntKi), PARAMETER :: M48N5FMze = 4883 - INTEGER(IntKi), PARAMETER :: M48N6FMze = 4884 - INTEGER(IntKi), PARAMETER :: M48N7FMze = 4885 - INTEGER(IntKi), PARAMETER :: M48N8FMze = 4886 - INTEGER(IntKi), PARAMETER :: M48N9FMze = 4887 - INTEGER(IntKi), PARAMETER :: M49N1FMze = 4888 - INTEGER(IntKi), PARAMETER :: M49N2FMze = 4889 - INTEGER(IntKi), PARAMETER :: M49N3FMze = 4890 - INTEGER(IntKi), PARAMETER :: M49N4FMze = 4891 - INTEGER(IntKi), PARAMETER :: M49N5FMze = 4892 - INTEGER(IntKi), PARAMETER :: M49N6FMze = 4893 - INTEGER(IntKi), PARAMETER :: M49N7FMze = 4894 - INTEGER(IntKi), PARAMETER :: M49N8FMze = 4895 - INTEGER(IntKi), PARAMETER :: M49N9FMze = 4896 - INTEGER(IntKi), PARAMETER :: M50N1FMze = 4897 - INTEGER(IntKi), PARAMETER :: M50N2FMze = 4898 - INTEGER(IntKi), PARAMETER :: M50N3FMze = 4899 - INTEGER(IntKi), PARAMETER :: M50N4FMze = 4900 - INTEGER(IntKi), PARAMETER :: M50N5FMze = 4901 - INTEGER(IntKi), PARAMETER :: M50N6FMze = 4902 - INTEGER(IntKi), PARAMETER :: M50N7FMze = 4903 - INTEGER(IntKi), PARAMETER :: M50N8FMze = 4904 - INTEGER(IntKi), PARAMETER :: M50N9FMze = 4905 - INTEGER(IntKi), PARAMETER :: M51N1FMze = 4906 - INTEGER(IntKi), PARAMETER :: M51N2FMze = 4907 - INTEGER(IntKi), PARAMETER :: M51N3FMze = 4908 - INTEGER(IntKi), PARAMETER :: M51N4FMze = 4909 - INTEGER(IntKi), PARAMETER :: M51N5FMze = 4910 - INTEGER(IntKi), PARAMETER :: M51N6FMze = 4911 - INTEGER(IntKi), PARAMETER :: M51N7FMze = 4912 - INTEGER(IntKi), PARAMETER :: M51N8FMze = 4913 - INTEGER(IntKi), PARAMETER :: M51N9FMze = 4914 - INTEGER(IntKi), PARAMETER :: M52N1FMze = 4915 - INTEGER(IntKi), PARAMETER :: M52N2FMze = 4916 - INTEGER(IntKi), PARAMETER :: M52N3FMze = 4917 - INTEGER(IntKi), PARAMETER :: M52N4FMze = 4918 - INTEGER(IntKi), PARAMETER :: M52N5FMze = 4919 - INTEGER(IntKi), PARAMETER :: M52N6FMze = 4920 - INTEGER(IntKi), PARAMETER :: M52N7FMze = 4921 - INTEGER(IntKi), PARAMETER :: M52N8FMze = 4922 - INTEGER(IntKi), PARAMETER :: M52N9FMze = 4923 - INTEGER(IntKi), PARAMETER :: M53N1FMze = 4924 - INTEGER(IntKi), PARAMETER :: M53N2FMze = 4925 - INTEGER(IntKi), PARAMETER :: M53N3FMze = 4926 - INTEGER(IntKi), PARAMETER :: M53N4FMze = 4927 - INTEGER(IntKi), PARAMETER :: M53N5FMze = 4928 - INTEGER(IntKi), PARAMETER :: M53N6FMze = 4929 - INTEGER(IntKi), PARAMETER :: M53N7FMze = 4930 - INTEGER(IntKi), PARAMETER :: M53N8FMze = 4931 - INTEGER(IntKi), PARAMETER :: M53N9FMze = 4932 - INTEGER(IntKi), PARAMETER :: M54N1FMze = 4933 - INTEGER(IntKi), PARAMETER :: M54N2FMze = 4934 - INTEGER(IntKi), PARAMETER :: M54N3FMze = 4935 - INTEGER(IntKi), PARAMETER :: M54N4FMze = 4936 - INTEGER(IntKi), PARAMETER :: M54N5FMze = 4937 - INTEGER(IntKi), PARAMETER :: M54N6FMze = 4938 - INTEGER(IntKi), PARAMETER :: M54N7FMze = 4939 - INTEGER(IntKi), PARAMETER :: M54N8FMze = 4940 - INTEGER(IntKi), PARAMETER :: M54N9FMze = 4941 - INTEGER(IntKi), PARAMETER :: M55N1FMze = 4942 - INTEGER(IntKi), PARAMETER :: M55N2FMze = 4943 - INTEGER(IntKi), PARAMETER :: M55N3FMze = 4944 - INTEGER(IntKi), PARAMETER :: M55N4FMze = 4945 - INTEGER(IntKi), PARAMETER :: M55N5FMze = 4946 - INTEGER(IntKi), PARAMETER :: M55N6FMze = 4947 - INTEGER(IntKi), PARAMETER :: M55N7FMze = 4948 - INTEGER(IntKi), PARAMETER :: M55N8FMze = 4949 - INTEGER(IntKi), PARAMETER :: M55N9FMze = 4950 - INTEGER(IntKi), PARAMETER :: M56N1FMze = 4951 - INTEGER(IntKi), PARAMETER :: M56N2FMze = 4952 - INTEGER(IntKi), PARAMETER :: M56N3FMze = 4953 - INTEGER(IntKi), PARAMETER :: M56N4FMze = 4954 - INTEGER(IntKi), PARAMETER :: M56N5FMze = 4955 - INTEGER(IntKi), PARAMETER :: M56N6FMze = 4956 - INTEGER(IntKi), PARAMETER :: M56N7FMze = 4957 - INTEGER(IntKi), PARAMETER :: M56N8FMze = 4958 - INTEGER(IntKi), PARAMETER :: M56N9FMze = 4959 - INTEGER(IntKi), PARAMETER :: M57N1FMze = 4960 - INTEGER(IntKi), PARAMETER :: M57N2FMze = 4961 - INTEGER(IntKi), PARAMETER :: M57N3FMze = 4962 - INTEGER(IntKi), PARAMETER :: M57N4FMze = 4963 - INTEGER(IntKi), PARAMETER :: M57N5FMze = 4964 - INTEGER(IntKi), PARAMETER :: M57N6FMze = 4965 - INTEGER(IntKi), PARAMETER :: M57N7FMze = 4966 - INTEGER(IntKi), PARAMETER :: M57N8FMze = 4967 - INTEGER(IntKi), PARAMETER :: M57N9FMze = 4968 - INTEGER(IntKi), PARAMETER :: M58N1FMze = 4969 - INTEGER(IntKi), PARAMETER :: M58N2FMze = 4970 - INTEGER(IntKi), PARAMETER :: M58N3FMze = 4971 - INTEGER(IntKi), PARAMETER :: M58N4FMze = 4972 - INTEGER(IntKi), PARAMETER :: M58N5FMze = 4973 - INTEGER(IntKi), PARAMETER :: M58N6FMze = 4974 - INTEGER(IntKi), PARAMETER :: M58N7FMze = 4975 - INTEGER(IntKi), PARAMETER :: M58N8FMze = 4976 - INTEGER(IntKi), PARAMETER :: M58N9FMze = 4977 - INTEGER(IntKi), PARAMETER :: M59N1FMze = 4978 - INTEGER(IntKi), PARAMETER :: M59N2FMze = 4979 - INTEGER(IntKi), PARAMETER :: M59N3FMze = 4980 - INTEGER(IntKi), PARAMETER :: M59N4FMze = 4981 - INTEGER(IntKi), PARAMETER :: M59N5FMze = 4982 - INTEGER(IntKi), PARAMETER :: M59N6FMze = 4983 - INTEGER(IntKi), PARAMETER :: M59N7FMze = 4984 - INTEGER(IntKi), PARAMETER :: M59N8FMze = 4985 - INTEGER(IntKi), PARAMETER :: M59N9FMze = 4986 - INTEGER(IntKi), PARAMETER :: M60N1FMze = 4987 - INTEGER(IntKi), PARAMETER :: M60N2FMze = 4988 - INTEGER(IntKi), PARAMETER :: M60N3FMze = 4989 - INTEGER(IntKi), PARAMETER :: M60N4FMze = 4990 - INTEGER(IntKi), PARAMETER :: M60N5FMze = 4991 - INTEGER(IntKi), PARAMETER :: M60N6FMze = 4992 - INTEGER(IntKi), PARAMETER :: M60N7FMze = 4993 - INTEGER(IntKi), PARAMETER :: M60N8FMze = 4994 - INTEGER(IntKi), PARAMETER :: M60N9FMze = 4995 - INTEGER(IntKi), PARAMETER :: M61N1FMze = 4996 - INTEGER(IntKi), PARAMETER :: M61N2FMze = 4997 - INTEGER(IntKi), PARAMETER :: M61N3FMze = 4998 - INTEGER(IntKi), PARAMETER :: M61N4FMze = 4999 - INTEGER(IntKi), PARAMETER :: M61N5FMze = 5000 - INTEGER(IntKi), PARAMETER :: M61N6FMze = 5001 - INTEGER(IntKi), PARAMETER :: M61N7FMze = 5002 - INTEGER(IntKi), PARAMETER :: M61N8FMze = 5003 - INTEGER(IntKi), PARAMETER :: M61N9FMze = 5004 - INTEGER(IntKi), PARAMETER :: M62N1FMze = 5005 - INTEGER(IntKi), PARAMETER :: M62N2FMze = 5006 - INTEGER(IntKi), PARAMETER :: M62N3FMze = 5007 - INTEGER(IntKi), PARAMETER :: M62N4FMze = 5008 - INTEGER(IntKi), PARAMETER :: M62N5FMze = 5009 - INTEGER(IntKi), PARAMETER :: M62N6FMze = 5010 - INTEGER(IntKi), PARAMETER :: M62N7FMze = 5011 - INTEGER(IntKi), PARAMETER :: M62N8FMze = 5012 - INTEGER(IntKi), PARAMETER :: M62N9FMze = 5013 - INTEGER(IntKi), PARAMETER :: M63N1FMze = 5014 - INTEGER(IntKi), PARAMETER :: M63N2FMze = 5015 - INTEGER(IntKi), PARAMETER :: M63N3FMze = 5016 - INTEGER(IntKi), PARAMETER :: M63N4FMze = 5017 - INTEGER(IntKi), PARAMETER :: M63N5FMze = 5018 - INTEGER(IntKi), PARAMETER :: M63N6FMze = 5019 - INTEGER(IntKi), PARAMETER :: M63N7FMze = 5020 - INTEGER(IntKi), PARAMETER :: M63N8FMze = 5021 - INTEGER(IntKi), PARAMETER :: M63N9FMze = 5022 - INTEGER(IntKi), PARAMETER :: M64N1FMze = 5023 - INTEGER(IntKi), PARAMETER :: M64N2FMze = 5024 - INTEGER(IntKi), PARAMETER :: M64N3FMze = 5025 - INTEGER(IntKi), PARAMETER :: M64N4FMze = 5026 - INTEGER(IntKi), PARAMETER :: M64N5FMze = 5027 - INTEGER(IntKi), PARAMETER :: M64N6FMze = 5028 - INTEGER(IntKi), PARAMETER :: M64N7FMze = 5029 - INTEGER(IntKi), PARAMETER :: M64N8FMze = 5030 - INTEGER(IntKi), PARAMETER :: M64N9FMze = 5031 - INTEGER(IntKi), PARAMETER :: M65N1FMze = 5032 - INTEGER(IntKi), PARAMETER :: M65N2FMze = 5033 - INTEGER(IntKi), PARAMETER :: M65N3FMze = 5034 - INTEGER(IntKi), PARAMETER :: M65N4FMze = 5035 - INTEGER(IntKi), PARAMETER :: M65N5FMze = 5036 - INTEGER(IntKi), PARAMETER :: M65N6FMze = 5037 - INTEGER(IntKi), PARAMETER :: M65N7FMze = 5038 - INTEGER(IntKi), PARAMETER :: M65N8FMze = 5039 - INTEGER(IntKi), PARAMETER :: M65N9FMze = 5040 - INTEGER(IntKi), PARAMETER :: M66N1FMze = 5041 - INTEGER(IntKi), PARAMETER :: M66N2FMze = 5042 - INTEGER(IntKi), PARAMETER :: M66N3FMze = 5043 - INTEGER(IntKi), PARAMETER :: M66N4FMze = 5044 - INTEGER(IntKi), PARAMETER :: M66N5FMze = 5045 - INTEGER(IntKi), PARAMETER :: M66N6FMze = 5046 - INTEGER(IntKi), PARAMETER :: M66N7FMze = 5047 - INTEGER(IntKi), PARAMETER :: M66N8FMze = 5048 - INTEGER(IntKi), PARAMETER :: M66N9FMze = 5049 - INTEGER(IntKi), PARAMETER :: M67N1FMze = 5050 - INTEGER(IntKi), PARAMETER :: M67N2FMze = 5051 - INTEGER(IntKi), PARAMETER :: M67N3FMze = 5052 - INTEGER(IntKi), PARAMETER :: M67N4FMze = 5053 - INTEGER(IntKi), PARAMETER :: M67N5FMze = 5054 - INTEGER(IntKi), PARAMETER :: M67N6FMze = 5055 - INTEGER(IntKi), PARAMETER :: M67N7FMze = 5056 - INTEGER(IntKi), PARAMETER :: M67N8FMze = 5057 - INTEGER(IntKi), PARAMETER :: M67N9FMze = 5058 - INTEGER(IntKi), PARAMETER :: M68N1FMze = 5059 - INTEGER(IntKi), PARAMETER :: M68N2FMze = 5060 - INTEGER(IntKi), PARAMETER :: M68N3FMze = 5061 - INTEGER(IntKi), PARAMETER :: M68N4FMze = 5062 - INTEGER(IntKi), PARAMETER :: M68N5FMze = 5063 - INTEGER(IntKi), PARAMETER :: M68N6FMze = 5064 - INTEGER(IntKi), PARAMETER :: M68N7FMze = 5065 - INTEGER(IntKi), PARAMETER :: M68N8FMze = 5066 - INTEGER(IntKi), PARAMETER :: M68N9FMze = 5067 - INTEGER(IntKi), PARAMETER :: M69N1FMze = 5068 - INTEGER(IntKi), PARAMETER :: M69N2FMze = 5069 - INTEGER(IntKi), PARAMETER :: M69N3FMze = 5070 - INTEGER(IntKi), PARAMETER :: M69N4FMze = 5071 - INTEGER(IntKi), PARAMETER :: M69N5FMze = 5072 - INTEGER(IntKi), PARAMETER :: M69N6FMze = 5073 - INTEGER(IntKi), PARAMETER :: M69N7FMze = 5074 - INTEGER(IntKi), PARAMETER :: M69N8FMze = 5075 - INTEGER(IntKi), PARAMETER :: M69N9FMze = 5076 - INTEGER(IntKi), PARAMETER :: M70N1FMze = 5077 - INTEGER(IntKi), PARAMETER :: M70N2FMze = 5078 - INTEGER(IntKi), PARAMETER :: M70N3FMze = 5079 - INTEGER(IntKi), PARAMETER :: M70N4FMze = 5080 - INTEGER(IntKi), PARAMETER :: M70N5FMze = 5081 - INTEGER(IntKi), PARAMETER :: M70N6FMze = 5082 - INTEGER(IntKi), PARAMETER :: M70N7FMze = 5083 - INTEGER(IntKi), PARAMETER :: M70N8FMze = 5084 - INTEGER(IntKi), PARAMETER :: M70N9FMze = 5085 - INTEGER(IntKi), PARAMETER :: M71N1FMze = 5086 - INTEGER(IntKi), PARAMETER :: M71N2FMze = 5087 - INTEGER(IntKi), PARAMETER :: M71N3FMze = 5088 - INTEGER(IntKi), PARAMETER :: M71N4FMze = 5089 - INTEGER(IntKi), PARAMETER :: M71N5FMze = 5090 - INTEGER(IntKi), PARAMETER :: M71N6FMze = 5091 - INTEGER(IntKi), PARAMETER :: M71N7FMze = 5092 - INTEGER(IntKi), PARAMETER :: M71N8FMze = 5093 - INTEGER(IntKi), PARAMETER :: M71N9FMze = 5094 - INTEGER(IntKi), PARAMETER :: M72N1FMze = 5095 - INTEGER(IntKi), PARAMETER :: M72N2FMze = 5096 - INTEGER(IntKi), PARAMETER :: M72N3FMze = 5097 - INTEGER(IntKi), PARAMETER :: M72N4FMze = 5098 - INTEGER(IntKi), PARAMETER :: M72N5FMze = 5099 - INTEGER(IntKi), PARAMETER :: M72N6FMze = 5100 - INTEGER(IntKi), PARAMETER :: M72N7FMze = 5101 - INTEGER(IntKi), PARAMETER :: M72N8FMze = 5102 - INTEGER(IntKi), PARAMETER :: M72N9FMze = 5103 - INTEGER(IntKi), PARAMETER :: M73N1FMze = 5104 - INTEGER(IntKi), PARAMETER :: M73N2FMze = 5105 - INTEGER(IntKi), PARAMETER :: M73N3FMze = 5106 - INTEGER(IntKi), PARAMETER :: M73N4FMze = 5107 - INTEGER(IntKi), PARAMETER :: M73N5FMze = 5108 - INTEGER(IntKi), PARAMETER :: M73N6FMze = 5109 - INTEGER(IntKi), PARAMETER :: M73N7FMze = 5110 - INTEGER(IntKi), PARAMETER :: M73N8FMze = 5111 - INTEGER(IntKi), PARAMETER :: M73N9FMze = 5112 - INTEGER(IntKi), PARAMETER :: M74N1FMze = 5113 - INTEGER(IntKi), PARAMETER :: M74N2FMze = 5114 - INTEGER(IntKi), PARAMETER :: M74N3FMze = 5115 - INTEGER(IntKi), PARAMETER :: M74N4FMze = 5116 - INTEGER(IntKi), PARAMETER :: M74N5FMze = 5117 - INTEGER(IntKi), PARAMETER :: M74N6FMze = 5118 - INTEGER(IntKi), PARAMETER :: M74N7FMze = 5119 - INTEGER(IntKi), PARAMETER :: M74N8FMze = 5120 - INTEGER(IntKi), PARAMETER :: M74N9FMze = 5121 - INTEGER(IntKi), PARAMETER :: M75N1FMze = 5122 - INTEGER(IntKi), PARAMETER :: M75N2FMze = 5123 - INTEGER(IntKi), PARAMETER :: M75N3FMze = 5124 - INTEGER(IntKi), PARAMETER :: M75N4FMze = 5125 - INTEGER(IntKi), PARAMETER :: M75N5FMze = 5126 - INTEGER(IntKi), PARAMETER :: M75N6FMze = 5127 - INTEGER(IntKi), PARAMETER :: M75N7FMze = 5128 - INTEGER(IntKi), PARAMETER :: M75N8FMze = 5129 - INTEGER(IntKi), PARAMETER :: M75N9FMze = 5130 - INTEGER(IntKi), PARAMETER :: M76N1FMze = 5131 - INTEGER(IntKi), PARAMETER :: M76N2FMze = 5132 - INTEGER(IntKi), PARAMETER :: M76N3FMze = 5133 - INTEGER(IntKi), PARAMETER :: M76N4FMze = 5134 - INTEGER(IntKi), PARAMETER :: M76N5FMze = 5135 - INTEGER(IntKi), PARAMETER :: M76N6FMze = 5136 - INTEGER(IntKi), PARAMETER :: M76N7FMze = 5137 - INTEGER(IntKi), PARAMETER :: M76N8FMze = 5138 - INTEGER(IntKi), PARAMETER :: M76N9FMze = 5139 - INTEGER(IntKi), PARAMETER :: M77N1FMze = 5140 - INTEGER(IntKi), PARAMETER :: M77N2FMze = 5141 - INTEGER(IntKi), PARAMETER :: M77N3FMze = 5142 - INTEGER(IntKi), PARAMETER :: M77N4FMze = 5143 - INTEGER(IntKi), PARAMETER :: M77N5FMze = 5144 - INTEGER(IntKi), PARAMETER :: M77N6FMze = 5145 - INTEGER(IntKi), PARAMETER :: M77N7FMze = 5146 - INTEGER(IntKi), PARAMETER :: M77N8FMze = 5147 - INTEGER(IntKi), PARAMETER :: M77N9FMze = 5148 - INTEGER(IntKi), PARAMETER :: M78N1FMze = 5149 - INTEGER(IntKi), PARAMETER :: M78N2FMze = 5150 - INTEGER(IntKi), PARAMETER :: M78N3FMze = 5151 - INTEGER(IntKi), PARAMETER :: M78N4FMze = 5152 - INTEGER(IntKi), PARAMETER :: M78N5FMze = 5153 - INTEGER(IntKi), PARAMETER :: M78N6FMze = 5154 - INTEGER(IntKi), PARAMETER :: M78N7FMze = 5155 - INTEGER(IntKi), PARAMETER :: M78N8FMze = 5156 - INTEGER(IntKi), PARAMETER :: M78N9FMze = 5157 - INTEGER(IntKi), PARAMETER :: M79N1FMze = 5158 - INTEGER(IntKi), PARAMETER :: M79N2FMze = 5159 - INTEGER(IntKi), PARAMETER :: M79N3FMze = 5160 - INTEGER(IntKi), PARAMETER :: M79N4FMze = 5161 - INTEGER(IntKi), PARAMETER :: M79N5FMze = 5162 - INTEGER(IntKi), PARAMETER :: M79N6FMze = 5163 - INTEGER(IntKi), PARAMETER :: M79N7FMze = 5164 - INTEGER(IntKi), PARAMETER :: M79N8FMze = 5165 - INTEGER(IntKi), PARAMETER :: M79N9FMze = 5166 - INTEGER(IntKi), PARAMETER :: M80N1FMze = 5167 - INTEGER(IntKi), PARAMETER :: M80N2FMze = 5168 - INTEGER(IntKi), PARAMETER :: M80N3FMze = 5169 - INTEGER(IntKi), PARAMETER :: M80N4FMze = 5170 - INTEGER(IntKi), PARAMETER :: M80N5FMze = 5171 - INTEGER(IntKi), PARAMETER :: M80N6FMze = 5172 - INTEGER(IntKi), PARAMETER :: M80N7FMze = 5173 - INTEGER(IntKi), PARAMETER :: M80N8FMze = 5174 - INTEGER(IntKi), PARAMETER :: M80N9FMze = 5175 - INTEGER(IntKi), PARAMETER :: M81N1FMze = 5176 - INTEGER(IntKi), PARAMETER :: M81N2FMze = 5177 - INTEGER(IntKi), PARAMETER :: M81N3FMze = 5178 - INTEGER(IntKi), PARAMETER :: M81N4FMze = 5179 - INTEGER(IntKi), PARAMETER :: M81N5FMze = 5180 - INTEGER(IntKi), PARAMETER :: M81N6FMze = 5181 - INTEGER(IntKi), PARAMETER :: M81N7FMze = 5182 - INTEGER(IntKi), PARAMETER :: M81N8FMze = 5183 - INTEGER(IntKi), PARAMETER :: M81N9FMze = 5184 - INTEGER(IntKi), PARAMETER :: M82N1FMze = 5185 - INTEGER(IntKi), PARAMETER :: M82N2FMze = 5186 - INTEGER(IntKi), PARAMETER :: M82N3FMze = 5187 - INTEGER(IntKi), PARAMETER :: M82N4FMze = 5188 - INTEGER(IntKi), PARAMETER :: M82N5FMze = 5189 - INTEGER(IntKi), PARAMETER :: M82N6FMze = 5190 - INTEGER(IntKi), PARAMETER :: M82N7FMze = 5191 - INTEGER(IntKi), PARAMETER :: M82N8FMze = 5192 - INTEGER(IntKi), PARAMETER :: M82N9FMze = 5193 - INTEGER(IntKi), PARAMETER :: M83N1FMze = 5194 - INTEGER(IntKi), PARAMETER :: M83N2FMze = 5195 - INTEGER(IntKi), PARAMETER :: M83N3FMze = 5196 - INTEGER(IntKi), PARAMETER :: M83N4FMze = 5197 - INTEGER(IntKi), PARAMETER :: M83N5FMze = 5198 - INTEGER(IntKi), PARAMETER :: M83N6FMze = 5199 - INTEGER(IntKi), PARAMETER :: M83N7FMze = 5200 - INTEGER(IntKi), PARAMETER :: M83N8FMze = 5201 - INTEGER(IntKi), PARAMETER :: M83N9FMze = 5202 - INTEGER(IntKi), PARAMETER :: M84N1FMze = 5203 - INTEGER(IntKi), PARAMETER :: M84N2FMze = 5204 - INTEGER(IntKi), PARAMETER :: M84N3FMze = 5205 - INTEGER(IntKi), PARAMETER :: M84N4FMze = 5206 - INTEGER(IntKi), PARAMETER :: M84N5FMze = 5207 - INTEGER(IntKi), PARAMETER :: M84N6FMze = 5208 - INTEGER(IntKi), PARAMETER :: M84N7FMze = 5209 - INTEGER(IntKi), PARAMETER :: M84N8FMze = 5210 - INTEGER(IntKi), PARAMETER :: M84N9FMze = 5211 - INTEGER(IntKi), PARAMETER :: M85N1FMze = 5212 - INTEGER(IntKi), PARAMETER :: M85N2FMze = 5213 - INTEGER(IntKi), PARAMETER :: M85N3FMze = 5214 - INTEGER(IntKi), PARAMETER :: M85N4FMze = 5215 - INTEGER(IntKi), PARAMETER :: M85N5FMze = 5216 - INTEGER(IntKi), PARAMETER :: M85N6FMze = 5217 - INTEGER(IntKi), PARAMETER :: M85N7FMze = 5218 - INTEGER(IntKi), PARAMETER :: M85N8FMze = 5219 - INTEGER(IntKi), PARAMETER :: M85N9FMze = 5220 - INTEGER(IntKi), PARAMETER :: M86N1FMze = 5221 - INTEGER(IntKi), PARAMETER :: M86N2FMze = 5222 - INTEGER(IntKi), PARAMETER :: M86N3FMze = 5223 - INTEGER(IntKi), PARAMETER :: M86N4FMze = 5224 - INTEGER(IntKi), PARAMETER :: M86N5FMze = 5225 - INTEGER(IntKi), PARAMETER :: M86N6FMze = 5226 - INTEGER(IntKi), PARAMETER :: M86N7FMze = 5227 - INTEGER(IntKi), PARAMETER :: M86N8FMze = 5228 - INTEGER(IntKi), PARAMETER :: M86N9FMze = 5229 - INTEGER(IntKi), PARAMETER :: M87N1FMze = 5230 - INTEGER(IntKi), PARAMETER :: M87N2FMze = 5231 - INTEGER(IntKi), PARAMETER :: M87N3FMze = 5232 - INTEGER(IntKi), PARAMETER :: M87N4FMze = 5233 - INTEGER(IntKi), PARAMETER :: M87N5FMze = 5234 - INTEGER(IntKi), PARAMETER :: M87N6FMze = 5235 - INTEGER(IntKi), PARAMETER :: M87N7FMze = 5236 - INTEGER(IntKi), PARAMETER :: M87N8FMze = 5237 - INTEGER(IntKi), PARAMETER :: M87N9FMze = 5238 - INTEGER(IntKi), PARAMETER :: M88N1FMze = 5239 - INTEGER(IntKi), PARAMETER :: M88N2FMze = 5240 - INTEGER(IntKi), PARAMETER :: M88N3FMze = 5241 - INTEGER(IntKi), PARAMETER :: M88N4FMze = 5242 - INTEGER(IntKi), PARAMETER :: M88N5FMze = 5243 - INTEGER(IntKi), PARAMETER :: M88N6FMze = 5244 - INTEGER(IntKi), PARAMETER :: M88N7FMze = 5245 - INTEGER(IntKi), PARAMETER :: M88N8FMze = 5246 - INTEGER(IntKi), PARAMETER :: M88N9FMze = 5247 - INTEGER(IntKi), PARAMETER :: M89N1FMze = 5248 - INTEGER(IntKi), PARAMETER :: M89N2FMze = 5249 - INTEGER(IntKi), PARAMETER :: M89N3FMze = 5250 - INTEGER(IntKi), PARAMETER :: M89N4FMze = 5251 - INTEGER(IntKi), PARAMETER :: M89N5FMze = 5252 - INTEGER(IntKi), PARAMETER :: M89N6FMze = 5253 - INTEGER(IntKi), PARAMETER :: M89N7FMze = 5254 - INTEGER(IntKi), PARAMETER :: M89N8FMze = 5255 - INTEGER(IntKi), PARAMETER :: M89N9FMze = 5256 - INTEGER(IntKi), PARAMETER :: M90N1FMze = 5257 - INTEGER(IntKi), PARAMETER :: M90N2FMze = 5258 - INTEGER(IntKi), PARAMETER :: M90N3FMze = 5259 - INTEGER(IntKi), PARAMETER :: M90N4FMze = 5260 - INTEGER(IntKi), PARAMETER :: M90N5FMze = 5261 - INTEGER(IntKi), PARAMETER :: M90N6FMze = 5262 - INTEGER(IntKi), PARAMETER :: M90N7FMze = 5263 - INTEGER(IntKi), PARAMETER :: M90N8FMze = 5264 - INTEGER(IntKi), PARAMETER :: M90N9FMze = 5265 - INTEGER(IntKi), PARAMETER :: M91N1FMze = 5266 - INTEGER(IntKi), PARAMETER :: M91N2FMze = 5267 - INTEGER(IntKi), PARAMETER :: M91N3FMze = 5268 - INTEGER(IntKi), PARAMETER :: M91N4FMze = 5269 - INTEGER(IntKi), PARAMETER :: M91N5FMze = 5270 - INTEGER(IntKi), PARAMETER :: M91N6FMze = 5271 - INTEGER(IntKi), PARAMETER :: M91N7FMze = 5272 - INTEGER(IntKi), PARAMETER :: M91N8FMze = 5273 - INTEGER(IntKi), PARAMETER :: M91N9FMze = 5274 - INTEGER(IntKi), PARAMETER :: M92N1FMze = 5275 - INTEGER(IntKi), PARAMETER :: M92N2FMze = 5276 - INTEGER(IntKi), PARAMETER :: M92N3FMze = 5277 - INTEGER(IntKi), PARAMETER :: M92N4FMze = 5278 - INTEGER(IntKi), PARAMETER :: M92N5FMze = 5279 - INTEGER(IntKi), PARAMETER :: M92N6FMze = 5280 - INTEGER(IntKi), PARAMETER :: M92N7FMze = 5281 - INTEGER(IntKi), PARAMETER :: M92N8FMze = 5282 - INTEGER(IntKi), PARAMETER :: M92N9FMze = 5283 - INTEGER(IntKi), PARAMETER :: M93N1FMze = 5284 - INTEGER(IntKi), PARAMETER :: M93N2FMze = 5285 - INTEGER(IntKi), PARAMETER :: M93N3FMze = 5286 - INTEGER(IntKi), PARAMETER :: M93N4FMze = 5287 - INTEGER(IntKi), PARAMETER :: M93N5FMze = 5288 - INTEGER(IntKi), PARAMETER :: M93N6FMze = 5289 - INTEGER(IntKi), PARAMETER :: M93N7FMze = 5290 - INTEGER(IntKi), PARAMETER :: M93N8FMze = 5291 - INTEGER(IntKi), PARAMETER :: M93N9FMze = 5292 - INTEGER(IntKi), PARAMETER :: M94N1FMze = 5293 - INTEGER(IntKi), PARAMETER :: M94N2FMze = 5294 - INTEGER(IntKi), PARAMETER :: M94N3FMze = 5295 - INTEGER(IntKi), PARAMETER :: M94N4FMze = 5296 - INTEGER(IntKi), PARAMETER :: M94N5FMze = 5297 - INTEGER(IntKi), PARAMETER :: M94N6FMze = 5298 - INTEGER(IntKi), PARAMETER :: M94N7FMze = 5299 - INTEGER(IntKi), PARAMETER :: M94N8FMze = 5300 - INTEGER(IntKi), PARAMETER :: M94N9FMze = 5301 - INTEGER(IntKi), PARAMETER :: M95N1FMze = 5302 - INTEGER(IntKi), PARAMETER :: M95N2FMze = 5303 - INTEGER(IntKi), PARAMETER :: M95N3FMze = 5304 - INTEGER(IntKi), PARAMETER :: M95N4FMze = 5305 - INTEGER(IntKi), PARAMETER :: M95N5FMze = 5306 - INTEGER(IntKi), PARAMETER :: M95N6FMze = 5307 - INTEGER(IntKi), PARAMETER :: M95N7FMze = 5308 - INTEGER(IntKi), PARAMETER :: M95N8FMze = 5309 - INTEGER(IntKi), PARAMETER :: M95N9FMze = 5310 - INTEGER(IntKi), PARAMETER :: M96N1FMze = 5311 - INTEGER(IntKi), PARAMETER :: M96N2FMze = 5312 - INTEGER(IntKi), PARAMETER :: M96N3FMze = 5313 - INTEGER(IntKi), PARAMETER :: M96N4FMze = 5314 - INTEGER(IntKi), PARAMETER :: M96N5FMze = 5315 - INTEGER(IntKi), PARAMETER :: M96N6FMze = 5316 - INTEGER(IntKi), PARAMETER :: M96N7FMze = 5317 - INTEGER(IntKi), PARAMETER :: M96N8FMze = 5318 - INTEGER(IntKi), PARAMETER :: M96N9FMze = 5319 - INTEGER(IntKi), PARAMETER :: M97N1FMze = 5320 - INTEGER(IntKi), PARAMETER :: M97N2FMze = 5321 - INTEGER(IntKi), PARAMETER :: M97N3FMze = 5322 - INTEGER(IntKi), PARAMETER :: M97N4FMze = 5323 - INTEGER(IntKi), PARAMETER :: M97N5FMze = 5324 - INTEGER(IntKi), PARAMETER :: M97N6FMze = 5325 - INTEGER(IntKi), PARAMETER :: M97N7FMze = 5326 - INTEGER(IntKi), PARAMETER :: M97N8FMze = 5327 - INTEGER(IntKi), PARAMETER :: M97N9FMze = 5328 - INTEGER(IntKi), PARAMETER :: M98N1FMze = 5329 - INTEGER(IntKi), PARAMETER :: M98N2FMze = 5330 - INTEGER(IntKi), PARAMETER :: M98N3FMze = 5331 - INTEGER(IntKi), PARAMETER :: M98N4FMze = 5332 - INTEGER(IntKi), PARAMETER :: M98N5FMze = 5333 - INTEGER(IntKi), PARAMETER :: M98N6FMze = 5334 - INTEGER(IntKi), PARAMETER :: M98N7FMze = 5335 - INTEGER(IntKi), PARAMETER :: M98N8FMze = 5336 - INTEGER(IntKi), PARAMETER :: M98N9FMze = 5337 - INTEGER(IntKi), PARAMETER :: M99N1FMze = 5338 - INTEGER(IntKi), PARAMETER :: M99N2FMze = 5339 - INTEGER(IntKi), PARAMETER :: M99N3FMze = 5340 - INTEGER(IntKi), PARAMETER :: M99N4FMze = 5341 - INTEGER(IntKi), PARAMETER :: M99N5FMze = 5342 - INTEGER(IntKi), PARAMETER :: M99N6FMze = 5343 - INTEGER(IntKi), PARAMETER :: M99N7FMze = 5344 - INTEGER(IntKi), PARAMETER :: M99N8FMze = 5345 - INTEGER(IntKi), PARAMETER :: M99N9FMze = 5346 - INTEGER(IntKi), PARAMETER :: M01N1MKxe = 5347 - INTEGER(IntKi), PARAMETER :: M01N2MKxe = 5348 - INTEGER(IntKi), PARAMETER :: M01N3MKxe = 5349 - INTEGER(IntKi), PARAMETER :: M01N4MKxe = 5350 - INTEGER(IntKi), PARAMETER :: M01N5MKxe = 5351 - INTEGER(IntKi), PARAMETER :: M01N6MKxe = 5352 - INTEGER(IntKi), PARAMETER :: M01N7MKxe = 5353 - INTEGER(IntKi), PARAMETER :: M01N8MKxe = 5354 - INTEGER(IntKi), PARAMETER :: M01N9MKxe = 5355 - INTEGER(IntKi), PARAMETER :: M02N1MKxe = 5356 - INTEGER(IntKi), PARAMETER :: M02N2MKxe = 5357 - INTEGER(IntKi), PARAMETER :: M02N3MKxe = 5358 - INTEGER(IntKi), PARAMETER :: M02N4MKxe = 5359 - INTEGER(IntKi), PARAMETER :: M02N5MKxe = 5360 - INTEGER(IntKi), PARAMETER :: M02N6MKxe = 5361 - INTEGER(IntKi), PARAMETER :: M02N7MKxe = 5362 - INTEGER(IntKi), PARAMETER :: M02N8MKxe = 5363 - INTEGER(IntKi), PARAMETER :: M02N9MKxe = 5364 - INTEGER(IntKi), PARAMETER :: M03N1MKxe = 5365 - INTEGER(IntKi), PARAMETER :: M03N2MKxe = 5366 - INTEGER(IntKi), PARAMETER :: M03N3MKxe = 5367 - INTEGER(IntKi), PARAMETER :: M03N4MKxe = 5368 - INTEGER(IntKi), PARAMETER :: M03N5MKxe = 5369 - INTEGER(IntKi), PARAMETER :: M03N6MKxe = 5370 - INTEGER(IntKi), PARAMETER :: M03N7MKxe = 5371 - INTEGER(IntKi), PARAMETER :: M03N8MKxe = 5372 - INTEGER(IntKi), PARAMETER :: M03N9MKxe = 5373 - INTEGER(IntKi), PARAMETER :: M04N1MKxe = 5374 - INTEGER(IntKi), PARAMETER :: M04N2MKxe = 5375 - INTEGER(IntKi), PARAMETER :: M04N3MKxe = 5376 - INTEGER(IntKi), PARAMETER :: M04N4MKxe = 5377 - INTEGER(IntKi), PARAMETER :: M04N5MKxe = 5378 - INTEGER(IntKi), PARAMETER :: M04N6MKxe = 5379 - INTEGER(IntKi), PARAMETER :: M04N7MKxe = 5380 - INTEGER(IntKi), PARAMETER :: M04N8MKxe = 5381 - INTEGER(IntKi), PARAMETER :: M04N9MKxe = 5382 - INTEGER(IntKi), PARAMETER :: M05N1MKxe = 5383 - INTEGER(IntKi), PARAMETER :: M05N2MKxe = 5384 - INTEGER(IntKi), PARAMETER :: M05N3MKxe = 5385 - INTEGER(IntKi), PARAMETER :: M05N4MKxe = 5386 - INTEGER(IntKi), PARAMETER :: M05N5MKxe = 5387 - INTEGER(IntKi), PARAMETER :: M05N6MKxe = 5388 - INTEGER(IntKi), PARAMETER :: M05N7MKxe = 5389 - INTEGER(IntKi), PARAMETER :: M05N8MKxe = 5390 - INTEGER(IntKi), PARAMETER :: M05N9MKxe = 5391 - INTEGER(IntKi), PARAMETER :: M06N1MKxe = 5392 - INTEGER(IntKi), PARAMETER :: M06N2MKxe = 5393 - INTEGER(IntKi), PARAMETER :: M06N3MKxe = 5394 - INTEGER(IntKi), PARAMETER :: M06N4MKxe = 5395 - INTEGER(IntKi), PARAMETER :: M06N5MKxe = 5396 - INTEGER(IntKi), PARAMETER :: M06N6MKxe = 5397 - INTEGER(IntKi), PARAMETER :: M06N7MKxe = 5398 - INTEGER(IntKi), PARAMETER :: M06N8MKxe = 5399 - INTEGER(IntKi), PARAMETER :: M06N9MKxe = 5400 - INTEGER(IntKi), PARAMETER :: M07N1MKxe = 5401 - INTEGER(IntKi), PARAMETER :: M07N2MKxe = 5402 - INTEGER(IntKi), PARAMETER :: M07N3MKxe = 5403 - INTEGER(IntKi), PARAMETER :: M07N4MKxe = 5404 - INTEGER(IntKi), PARAMETER :: M07N5MKxe = 5405 - INTEGER(IntKi), PARAMETER :: M07N6MKxe = 5406 - INTEGER(IntKi), PARAMETER :: M07N7MKxe = 5407 - INTEGER(IntKi), PARAMETER :: M07N8MKxe = 5408 - INTEGER(IntKi), PARAMETER :: M07N9MKxe = 5409 - INTEGER(IntKi), PARAMETER :: M08N1MKxe = 5410 - INTEGER(IntKi), PARAMETER :: M08N2MKxe = 5411 - INTEGER(IntKi), PARAMETER :: M08N3MKxe = 5412 - INTEGER(IntKi), PARAMETER :: M08N4MKxe = 5413 - INTEGER(IntKi), PARAMETER :: M08N5MKxe = 5414 - INTEGER(IntKi), PARAMETER :: M08N6MKxe = 5415 - INTEGER(IntKi), PARAMETER :: M08N7MKxe = 5416 - INTEGER(IntKi), PARAMETER :: M08N8MKxe = 5417 - INTEGER(IntKi), PARAMETER :: M08N9MKxe = 5418 - INTEGER(IntKi), PARAMETER :: M09N1MKxe = 5419 - INTEGER(IntKi), PARAMETER :: M09N2MKxe = 5420 - INTEGER(IntKi), PARAMETER :: M09N3MKxe = 5421 - INTEGER(IntKi), PARAMETER :: M09N4MKxe = 5422 - INTEGER(IntKi), PARAMETER :: M09N5MKxe = 5423 - INTEGER(IntKi), PARAMETER :: M09N6MKxe = 5424 - INTEGER(IntKi), PARAMETER :: M09N7MKxe = 5425 - INTEGER(IntKi), PARAMETER :: M09N8MKxe = 5426 - INTEGER(IntKi), PARAMETER :: M09N9MKxe = 5427 - INTEGER(IntKi), PARAMETER :: M10N1MKxe = 5428 - INTEGER(IntKi), PARAMETER :: M10N2MKxe = 5429 - INTEGER(IntKi), PARAMETER :: M10N3MKxe = 5430 - INTEGER(IntKi), PARAMETER :: M10N4MKxe = 5431 - INTEGER(IntKi), PARAMETER :: M10N5MKxe = 5432 - INTEGER(IntKi), PARAMETER :: M10N6MKxe = 5433 - INTEGER(IntKi), PARAMETER :: M10N7MKxe = 5434 - INTEGER(IntKi), PARAMETER :: M10N8MKxe = 5435 - INTEGER(IntKi), PARAMETER :: M10N9MKxe = 5436 - INTEGER(IntKi), PARAMETER :: M11N1MKxe = 5437 - INTEGER(IntKi), PARAMETER :: M11N2MKxe = 5438 - INTEGER(IntKi), PARAMETER :: M11N3MKxe = 5439 - INTEGER(IntKi), PARAMETER :: M11N4MKxe = 5440 - INTEGER(IntKi), PARAMETER :: M11N5MKxe = 5441 - INTEGER(IntKi), PARAMETER :: M11N6MKxe = 5442 - INTEGER(IntKi), PARAMETER :: M11N7MKxe = 5443 - INTEGER(IntKi), PARAMETER :: M11N8MKxe = 5444 - INTEGER(IntKi), PARAMETER :: M11N9MKxe = 5445 - INTEGER(IntKi), PARAMETER :: M12N1MKxe = 5446 - INTEGER(IntKi), PARAMETER :: M12N2MKxe = 5447 - INTEGER(IntKi), PARAMETER :: M12N3MKxe = 5448 - INTEGER(IntKi), PARAMETER :: M12N4MKxe = 5449 - INTEGER(IntKi), PARAMETER :: M12N5MKxe = 5450 - INTEGER(IntKi), PARAMETER :: M12N6MKxe = 5451 - INTEGER(IntKi), PARAMETER :: M12N7MKxe = 5452 - INTEGER(IntKi), PARAMETER :: M12N8MKxe = 5453 - INTEGER(IntKi), PARAMETER :: M12N9MKxe = 5454 - INTEGER(IntKi), PARAMETER :: M13N1MKxe = 5455 - INTEGER(IntKi), PARAMETER :: M13N2MKxe = 5456 - INTEGER(IntKi), PARAMETER :: M13N3MKxe = 5457 - INTEGER(IntKi), PARAMETER :: M13N4MKxe = 5458 - INTEGER(IntKi), PARAMETER :: M13N5MKxe = 5459 - INTEGER(IntKi), PARAMETER :: M13N6MKxe = 5460 - INTEGER(IntKi), PARAMETER :: M13N7MKxe = 5461 - INTEGER(IntKi), PARAMETER :: M13N8MKxe = 5462 - INTEGER(IntKi), PARAMETER :: M13N9MKxe = 5463 - INTEGER(IntKi), PARAMETER :: M14N1MKxe = 5464 - INTEGER(IntKi), PARAMETER :: M14N2MKxe = 5465 - INTEGER(IntKi), PARAMETER :: M14N3MKxe = 5466 - INTEGER(IntKi), PARAMETER :: M14N4MKxe = 5467 - INTEGER(IntKi), PARAMETER :: M14N5MKxe = 5468 - INTEGER(IntKi), PARAMETER :: M14N6MKxe = 5469 - INTEGER(IntKi), PARAMETER :: M14N7MKxe = 5470 - INTEGER(IntKi), PARAMETER :: M14N8MKxe = 5471 - INTEGER(IntKi), PARAMETER :: M14N9MKxe = 5472 - INTEGER(IntKi), PARAMETER :: M15N1MKxe = 5473 - INTEGER(IntKi), PARAMETER :: M15N2MKxe = 5474 - INTEGER(IntKi), PARAMETER :: M15N3MKxe = 5475 - INTEGER(IntKi), PARAMETER :: M15N4MKxe = 5476 - INTEGER(IntKi), PARAMETER :: M15N5MKxe = 5477 - INTEGER(IntKi), PARAMETER :: M15N6MKxe = 5478 - INTEGER(IntKi), PARAMETER :: M15N7MKxe = 5479 - INTEGER(IntKi), PARAMETER :: M15N8MKxe = 5480 - INTEGER(IntKi), PARAMETER :: M15N9MKxe = 5481 - INTEGER(IntKi), PARAMETER :: M16N1MKxe = 5482 - INTEGER(IntKi), PARAMETER :: M16N2MKxe = 5483 - INTEGER(IntKi), PARAMETER :: M16N3MKxe = 5484 - INTEGER(IntKi), PARAMETER :: M16N4MKxe = 5485 - INTEGER(IntKi), PARAMETER :: M16N5MKxe = 5486 - INTEGER(IntKi), PARAMETER :: M16N6MKxe = 5487 - INTEGER(IntKi), PARAMETER :: M16N7MKxe = 5488 - INTEGER(IntKi), PARAMETER :: M16N8MKxe = 5489 - INTEGER(IntKi), PARAMETER :: M16N9MKxe = 5490 - INTEGER(IntKi), PARAMETER :: M17N1MKxe = 5491 - INTEGER(IntKi), PARAMETER :: M17N2MKxe = 5492 - INTEGER(IntKi), PARAMETER :: M17N3MKxe = 5493 - INTEGER(IntKi), PARAMETER :: M17N4MKxe = 5494 - INTEGER(IntKi), PARAMETER :: M17N5MKxe = 5495 - INTEGER(IntKi), PARAMETER :: M17N6MKxe = 5496 - INTEGER(IntKi), PARAMETER :: M17N7MKxe = 5497 - INTEGER(IntKi), PARAMETER :: M17N8MKxe = 5498 - INTEGER(IntKi), PARAMETER :: M17N9MKxe = 5499 - INTEGER(IntKi), PARAMETER :: M18N1MKxe = 5500 - INTEGER(IntKi), PARAMETER :: M18N2MKxe = 5501 - INTEGER(IntKi), PARAMETER :: M18N3MKxe = 5502 - INTEGER(IntKi), PARAMETER :: M18N4MKxe = 5503 - INTEGER(IntKi), PARAMETER :: M18N5MKxe = 5504 - INTEGER(IntKi), PARAMETER :: M18N6MKxe = 5505 - INTEGER(IntKi), PARAMETER :: M18N7MKxe = 5506 - INTEGER(IntKi), PARAMETER :: M18N8MKxe = 5507 - INTEGER(IntKi), PARAMETER :: M18N9MKxe = 5508 - INTEGER(IntKi), PARAMETER :: M19N1MKxe = 5509 - INTEGER(IntKi), PARAMETER :: M19N2MKxe = 5510 - INTEGER(IntKi), PARAMETER :: M19N3MKxe = 5511 - INTEGER(IntKi), PARAMETER :: M19N4MKxe = 5512 - INTEGER(IntKi), PARAMETER :: M19N5MKxe = 5513 - INTEGER(IntKi), PARAMETER :: M19N6MKxe = 5514 - INTEGER(IntKi), PARAMETER :: M19N7MKxe = 5515 - INTEGER(IntKi), PARAMETER :: M19N8MKxe = 5516 - INTEGER(IntKi), PARAMETER :: M19N9MKxe = 5517 - INTEGER(IntKi), PARAMETER :: M20N1MKxe = 5518 - INTEGER(IntKi), PARAMETER :: M20N2MKxe = 5519 - INTEGER(IntKi), PARAMETER :: M20N3MKxe = 5520 - INTEGER(IntKi), PARAMETER :: M20N4MKxe = 5521 - INTEGER(IntKi), PARAMETER :: M20N5MKxe = 5522 - INTEGER(IntKi), PARAMETER :: M20N6MKxe = 5523 - INTEGER(IntKi), PARAMETER :: M20N7MKxe = 5524 - INTEGER(IntKi), PARAMETER :: M20N8MKxe = 5525 - INTEGER(IntKi), PARAMETER :: M20N9MKxe = 5526 - INTEGER(IntKi), PARAMETER :: M21N1MKxe = 5527 - INTEGER(IntKi), PARAMETER :: M21N2MKxe = 5528 - INTEGER(IntKi), PARAMETER :: M21N3MKxe = 5529 - INTEGER(IntKi), PARAMETER :: M21N4MKxe = 5530 - INTEGER(IntKi), PARAMETER :: M21N5MKxe = 5531 - INTEGER(IntKi), PARAMETER :: M21N6MKxe = 5532 - INTEGER(IntKi), PARAMETER :: M21N7MKxe = 5533 - INTEGER(IntKi), PARAMETER :: M21N8MKxe = 5534 - INTEGER(IntKi), PARAMETER :: M21N9MKxe = 5535 - INTEGER(IntKi), PARAMETER :: M22N1MKxe = 5536 - INTEGER(IntKi), PARAMETER :: M22N2MKxe = 5537 - INTEGER(IntKi), PARAMETER :: M22N3MKxe = 5538 - INTEGER(IntKi), PARAMETER :: M22N4MKxe = 5539 - INTEGER(IntKi), PARAMETER :: M22N5MKxe = 5540 - INTEGER(IntKi), PARAMETER :: M22N6MKxe = 5541 - INTEGER(IntKi), PARAMETER :: M22N7MKxe = 5542 - INTEGER(IntKi), PARAMETER :: M22N8MKxe = 5543 - INTEGER(IntKi), PARAMETER :: M22N9MKxe = 5544 - INTEGER(IntKi), PARAMETER :: M23N1MKxe = 5545 - INTEGER(IntKi), PARAMETER :: M23N2MKxe = 5546 - INTEGER(IntKi), PARAMETER :: M23N3MKxe = 5547 - INTEGER(IntKi), PARAMETER :: M23N4MKxe = 5548 - INTEGER(IntKi), PARAMETER :: M23N5MKxe = 5549 - INTEGER(IntKi), PARAMETER :: M23N6MKxe = 5550 - INTEGER(IntKi), PARAMETER :: M23N7MKxe = 5551 - INTEGER(IntKi), PARAMETER :: M23N8MKxe = 5552 - INTEGER(IntKi), PARAMETER :: M23N9MKxe = 5553 - INTEGER(IntKi), PARAMETER :: M24N1MKxe = 5554 - INTEGER(IntKi), PARAMETER :: M24N2MKxe = 5555 - INTEGER(IntKi), PARAMETER :: M24N3MKxe = 5556 - INTEGER(IntKi), PARAMETER :: M24N4MKxe = 5557 - INTEGER(IntKi), PARAMETER :: M24N5MKxe = 5558 - INTEGER(IntKi), PARAMETER :: M24N6MKxe = 5559 - INTEGER(IntKi), PARAMETER :: M24N7MKxe = 5560 - INTEGER(IntKi), PARAMETER :: M24N8MKxe = 5561 - INTEGER(IntKi), PARAMETER :: M24N9MKxe = 5562 - INTEGER(IntKi), PARAMETER :: M25N1MKxe = 5563 - INTEGER(IntKi), PARAMETER :: M25N2MKxe = 5564 - INTEGER(IntKi), PARAMETER :: M25N3MKxe = 5565 - INTEGER(IntKi), PARAMETER :: M25N4MKxe = 5566 - INTEGER(IntKi), PARAMETER :: M25N5MKxe = 5567 - INTEGER(IntKi), PARAMETER :: M25N6MKxe = 5568 - INTEGER(IntKi), PARAMETER :: M25N7MKxe = 5569 - INTEGER(IntKi), PARAMETER :: M25N8MKxe = 5570 - INTEGER(IntKi), PARAMETER :: M25N9MKxe = 5571 - INTEGER(IntKi), PARAMETER :: M26N1MKxe = 5572 - INTEGER(IntKi), PARAMETER :: M26N2MKxe = 5573 - INTEGER(IntKi), PARAMETER :: M26N3MKxe = 5574 - INTEGER(IntKi), PARAMETER :: M26N4MKxe = 5575 - INTEGER(IntKi), PARAMETER :: M26N5MKxe = 5576 - INTEGER(IntKi), PARAMETER :: M26N6MKxe = 5577 - INTEGER(IntKi), PARAMETER :: M26N7MKxe = 5578 - INTEGER(IntKi), PARAMETER :: M26N8MKxe = 5579 - INTEGER(IntKi), PARAMETER :: M26N9MKxe = 5580 - INTEGER(IntKi), PARAMETER :: M27N1MKxe = 5581 - INTEGER(IntKi), PARAMETER :: M27N2MKxe = 5582 - INTEGER(IntKi), PARAMETER :: M27N3MKxe = 5583 - INTEGER(IntKi), PARAMETER :: M27N4MKxe = 5584 - INTEGER(IntKi), PARAMETER :: M27N5MKxe = 5585 - INTEGER(IntKi), PARAMETER :: M27N6MKxe = 5586 - INTEGER(IntKi), PARAMETER :: M27N7MKxe = 5587 - INTEGER(IntKi), PARAMETER :: M27N8MKxe = 5588 - INTEGER(IntKi), PARAMETER :: M27N9MKxe = 5589 - INTEGER(IntKi), PARAMETER :: M28N1MKxe = 5590 - INTEGER(IntKi), PARAMETER :: M28N2MKxe = 5591 - INTEGER(IntKi), PARAMETER :: M28N3MKxe = 5592 - INTEGER(IntKi), PARAMETER :: M28N4MKxe = 5593 - INTEGER(IntKi), PARAMETER :: M28N5MKxe = 5594 - INTEGER(IntKi), PARAMETER :: M28N6MKxe = 5595 - INTEGER(IntKi), PARAMETER :: M28N7MKxe = 5596 - INTEGER(IntKi), PARAMETER :: M28N8MKxe = 5597 - INTEGER(IntKi), PARAMETER :: M28N9MKxe = 5598 - INTEGER(IntKi), PARAMETER :: M29N1MKxe = 5599 - INTEGER(IntKi), PARAMETER :: M29N2MKxe = 5600 - INTEGER(IntKi), PARAMETER :: M29N3MKxe = 5601 - INTEGER(IntKi), PARAMETER :: M29N4MKxe = 5602 - INTEGER(IntKi), PARAMETER :: M29N5MKxe = 5603 - INTEGER(IntKi), PARAMETER :: M29N6MKxe = 5604 - INTEGER(IntKi), PARAMETER :: M29N7MKxe = 5605 - INTEGER(IntKi), PARAMETER :: M29N8MKxe = 5606 - INTEGER(IntKi), PARAMETER :: M29N9MKxe = 5607 - INTEGER(IntKi), PARAMETER :: M30N1MKxe = 5608 - INTEGER(IntKi), PARAMETER :: M30N2MKxe = 5609 - INTEGER(IntKi), PARAMETER :: M30N3MKxe = 5610 - INTEGER(IntKi), PARAMETER :: M30N4MKxe = 5611 - INTEGER(IntKi), PARAMETER :: M30N5MKxe = 5612 - INTEGER(IntKi), PARAMETER :: M30N6MKxe = 5613 - INTEGER(IntKi), PARAMETER :: M30N7MKxe = 5614 - INTEGER(IntKi), PARAMETER :: M30N8MKxe = 5615 - INTEGER(IntKi), PARAMETER :: M30N9MKxe = 5616 - INTEGER(IntKi), PARAMETER :: M31N1MKxe = 5617 - INTEGER(IntKi), PARAMETER :: M31N2MKxe = 5618 - INTEGER(IntKi), PARAMETER :: M31N3MKxe = 5619 - INTEGER(IntKi), PARAMETER :: M31N4MKxe = 5620 - INTEGER(IntKi), PARAMETER :: M31N5MKxe = 5621 - INTEGER(IntKi), PARAMETER :: M31N6MKxe = 5622 - INTEGER(IntKi), PARAMETER :: M31N7MKxe = 5623 - INTEGER(IntKi), PARAMETER :: M31N8MKxe = 5624 - INTEGER(IntKi), PARAMETER :: M31N9MKxe = 5625 - INTEGER(IntKi), PARAMETER :: M32N1MKxe = 5626 - INTEGER(IntKi), PARAMETER :: M32N2MKxe = 5627 - INTEGER(IntKi), PARAMETER :: M32N3MKxe = 5628 - INTEGER(IntKi), PARAMETER :: M32N4MKxe = 5629 - INTEGER(IntKi), PARAMETER :: M32N5MKxe = 5630 - INTEGER(IntKi), PARAMETER :: M32N6MKxe = 5631 - INTEGER(IntKi), PARAMETER :: M32N7MKxe = 5632 - INTEGER(IntKi), PARAMETER :: M32N8MKxe = 5633 - INTEGER(IntKi), PARAMETER :: M32N9MKxe = 5634 - INTEGER(IntKi), PARAMETER :: M33N1MKxe = 5635 - INTEGER(IntKi), PARAMETER :: M33N2MKxe = 5636 - INTEGER(IntKi), PARAMETER :: M33N3MKxe = 5637 - INTEGER(IntKi), PARAMETER :: M33N4MKxe = 5638 - INTEGER(IntKi), PARAMETER :: M33N5MKxe = 5639 - INTEGER(IntKi), PARAMETER :: M33N6MKxe = 5640 - INTEGER(IntKi), PARAMETER :: M33N7MKxe = 5641 - INTEGER(IntKi), PARAMETER :: M33N8MKxe = 5642 - INTEGER(IntKi), PARAMETER :: M33N9MKxe = 5643 - INTEGER(IntKi), PARAMETER :: M34N1MKxe = 5644 - INTEGER(IntKi), PARAMETER :: M34N2MKxe = 5645 - INTEGER(IntKi), PARAMETER :: M34N3MKxe = 5646 - INTEGER(IntKi), PARAMETER :: M34N4MKxe = 5647 - INTEGER(IntKi), PARAMETER :: M34N5MKxe = 5648 - INTEGER(IntKi), PARAMETER :: M34N6MKxe = 5649 - INTEGER(IntKi), PARAMETER :: M34N7MKxe = 5650 - INTEGER(IntKi), PARAMETER :: M34N8MKxe = 5651 - INTEGER(IntKi), PARAMETER :: M34N9MKxe = 5652 - INTEGER(IntKi), PARAMETER :: M35N1MKxe = 5653 - INTEGER(IntKi), PARAMETER :: M35N2MKxe = 5654 - INTEGER(IntKi), PARAMETER :: M35N3MKxe = 5655 - INTEGER(IntKi), PARAMETER :: M35N4MKxe = 5656 - INTEGER(IntKi), PARAMETER :: M35N5MKxe = 5657 - INTEGER(IntKi), PARAMETER :: M35N6MKxe = 5658 - INTEGER(IntKi), PARAMETER :: M35N7MKxe = 5659 - INTEGER(IntKi), PARAMETER :: M35N8MKxe = 5660 - INTEGER(IntKi), PARAMETER :: M35N9MKxe = 5661 - INTEGER(IntKi), PARAMETER :: M36N1MKxe = 5662 - INTEGER(IntKi), PARAMETER :: M36N2MKxe = 5663 - INTEGER(IntKi), PARAMETER :: M36N3MKxe = 5664 - INTEGER(IntKi), PARAMETER :: M36N4MKxe = 5665 - INTEGER(IntKi), PARAMETER :: M36N5MKxe = 5666 - INTEGER(IntKi), PARAMETER :: M36N6MKxe = 5667 - INTEGER(IntKi), PARAMETER :: M36N7MKxe = 5668 - INTEGER(IntKi), PARAMETER :: M36N8MKxe = 5669 - INTEGER(IntKi), PARAMETER :: M36N9MKxe = 5670 - INTEGER(IntKi), PARAMETER :: M37N1MKxe = 5671 - INTEGER(IntKi), PARAMETER :: M37N2MKxe = 5672 - INTEGER(IntKi), PARAMETER :: M37N3MKxe = 5673 - INTEGER(IntKi), PARAMETER :: M37N4MKxe = 5674 - INTEGER(IntKi), PARAMETER :: M37N5MKxe = 5675 - INTEGER(IntKi), PARAMETER :: M37N6MKxe = 5676 - INTEGER(IntKi), PARAMETER :: M37N7MKxe = 5677 - INTEGER(IntKi), PARAMETER :: M37N8MKxe = 5678 - INTEGER(IntKi), PARAMETER :: M37N9MKxe = 5679 - INTEGER(IntKi), PARAMETER :: M38N1MKxe = 5680 - INTEGER(IntKi), PARAMETER :: M38N2MKxe = 5681 - INTEGER(IntKi), PARAMETER :: M38N3MKxe = 5682 - INTEGER(IntKi), PARAMETER :: M38N4MKxe = 5683 - INTEGER(IntKi), PARAMETER :: M38N5MKxe = 5684 - INTEGER(IntKi), PARAMETER :: M38N6MKxe = 5685 - INTEGER(IntKi), PARAMETER :: M38N7MKxe = 5686 - INTEGER(IntKi), PARAMETER :: M38N8MKxe = 5687 - INTEGER(IntKi), PARAMETER :: M38N9MKxe = 5688 - INTEGER(IntKi), PARAMETER :: M39N1MKxe = 5689 - INTEGER(IntKi), PARAMETER :: M39N2MKxe = 5690 - INTEGER(IntKi), PARAMETER :: M39N3MKxe = 5691 - INTEGER(IntKi), PARAMETER :: M39N4MKxe = 5692 - INTEGER(IntKi), PARAMETER :: M39N5MKxe = 5693 - INTEGER(IntKi), PARAMETER :: M39N6MKxe = 5694 - INTEGER(IntKi), PARAMETER :: M39N7MKxe = 5695 - INTEGER(IntKi), PARAMETER :: M39N8MKxe = 5696 - INTEGER(IntKi), PARAMETER :: M39N9MKxe = 5697 - INTEGER(IntKi), PARAMETER :: M40N1MKxe = 5698 - INTEGER(IntKi), PARAMETER :: M40N2MKxe = 5699 - INTEGER(IntKi), PARAMETER :: M40N3MKxe = 5700 - INTEGER(IntKi), PARAMETER :: M40N4MKxe = 5701 - INTEGER(IntKi), PARAMETER :: M40N5MKxe = 5702 - INTEGER(IntKi), PARAMETER :: M40N6MKxe = 5703 - INTEGER(IntKi), PARAMETER :: M40N7MKxe = 5704 - INTEGER(IntKi), PARAMETER :: M40N8MKxe = 5705 - INTEGER(IntKi), PARAMETER :: M40N9MKxe = 5706 - INTEGER(IntKi), PARAMETER :: M41N1MKxe = 5707 - INTEGER(IntKi), PARAMETER :: M41N2MKxe = 5708 - INTEGER(IntKi), PARAMETER :: M41N3MKxe = 5709 - INTEGER(IntKi), PARAMETER :: M41N4MKxe = 5710 - INTEGER(IntKi), PARAMETER :: M41N5MKxe = 5711 - INTEGER(IntKi), PARAMETER :: M41N6MKxe = 5712 - INTEGER(IntKi), PARAMETER :: M41N7MKxe = 5713 - INTEGER(IntKi), PARAMETER :: M41N8MKxe = 5714 - INTEGER(IntKi), PARAMETER :: M41N9MKxe = 5715 - INTEGER(IntKi), PARAMETER :: M42N1MKxe = 5716 - INTEGER(IntKi), PARAMETER :: M42N2MKxe = 5717 - INTEGER(IntKi), PARAMETER :: M42N3MKxe = 5718 - INTEGER(IntKi), PARAMETER :: M42N4MKxe = 5719 - INTEGER(IntKi), PARAMETER :: M42N5MKxe = 5720 - INTEGER(IntKi), PARAMETER :: M42N6MKxe = 5721 - INTEGER(IntKi), PARAMETER :: M42N7MKxe = 5722 - INTEGER(IntKi), PARAMETER :: M42N8MKxe = 5723 - INTEGER(IntKi), PARAMETER :: M42N9MKxe = 5724 - INTEGER(IntKi), PARAMETER :: M43N1MKxe = 5725 - INTEGER(IntKi), PARAMETER :: M43N2MKxe = 5726 - INTEGER(IntKi), PARAMETER :: M43N3MKxe = 5727 - INTEGER(IntKi), PARAMETER :: M43N4MKxe = 5728 - INTEGER(IntKi), PARAMETER :: M43N5MKxe = 5729 - INTEGER(IntKi), PARAMETER :: M43N6MKxe = 5730 - INTEGER(IntKi), PARAMETER :: M43N7MKxe = 5731 - INTEGER(IntKi), PARAMETER :: M43N8MKxe = 5732 - INTEGER(IntKi), PARAMETER :: M43N9MKxe = 5733 - INTEGER(IntKi), PARAMETER :: M44N1MKxe = 5734 - INTEGER(IntKi), PARAMETER :: M44N2MKxe = 5735 - INTEGER(IntKi), PARAMETER :: M44N3MKxe = 5736 - INTEGER(IntKi), PARAMETER :: M44N4MKxe = 5737 - INTEGER(IntKi), PARAMETER :: M44N5MKxe = 5738 - INTEGER(IntKi), PARAMETER :: M44N6MKxe = 5739 - INTEGER(IntKi), PARAMETER :: M44N7MKxe = 5740 - INTEGER(IntKi), PARAMETER :: M44N8MKxe = 5741 - INTEGER(IntKi), PARAMETER :: M44N9MKxe = 5742 - INTEGER(IntKi), PARAMETER :: M45N1MKxe = 5743 - INTEGER(IntKi), PARAMETER :: M45N2MKxe = 5744 - INTEGER(IntKi), PARAMETER :: M45N3MKxe = 5745 - INTEGER(IntKi), PARAMETER :: M45N4MKxe = 5746 - INTEGER(IntKi), PARAMETER :: M45N5MKxe = 5747 - INTEGER(IntKi), PARAMETER :: M45N6MKxe = 5748 - INTEGER(IntKi), PARAMETER :: M45N7MKxe = 5749 - INTEGER(IntKi), PARAMETER :: M45N8MKxe = 5750 - INTEGER(IntKi), PARAMETER :: M45N9MKxe = 5751 - INTEGER(IntKi), PARAMETER :: M46N1MKxe = 5752 - INTEGER(IntKi), PARAMETER :: M46N2MKxe = 5753 - INTEGER(IntKi), PARAMETER :: M46N3MKxe = 5754 - INTEGER(IntKi), PARAMETER :: M46N4MKxe = 5755 - INTEGER(IntKi), PARAMETER :: M46N5MKxe = 5756 - INTEGER(IntKi), PARAMETER :: M46N6MKxe = 5757 - INTEGER(IntKi), PARAMETER :: M46N7MKxe = 5758 - INTEGER(IntKi), PARAMETER :: M46N8MKxe = 5759 - INTEGER(IntKi), PARAMETER :: M46N9MKxe = 5760 - INTEGER(IntKi), PARAMETER :: M47N1MKxe = 5761 - INTEGER(IntKi), PARAMETER :: M47N2MKxe = 5762 - INTEGER(IntKi), PARAMETER :: M47N3MKxe = 5763 - INTEGER(IntKi), PARAMETER :: M47N4MKxe = 5764 - INTEGER(IntKi), PARAMETER :: M47N5MKxe = 5765 - INTEGER(IntKi), PARAMETER :: M47N6MKxe = 5766 - INTEGER(IntKi), PARAMETER :: M47N7MKxe = 5767 - INTEGER(IntKi), PARAMETER :: M47N8MKxe = 5768 - INTEGER(IntKi), PARAMETER :: M47N9MKxe = 5769 - INTEGER(IntKi), PARAMETER :: M48N1MKxe = 5770 - INTEGER(IntKi), PARAMETER :: M48N2MKxe = 5771 - INTEGER(IntKi), PARAMETER :: M48N3MKxe = 5772 - INTEGER(IntKi), PARAMETER :: M48N4MKxe = 5773 - INTEGER(IntKi), PARAMETER :: M48N5MKxe = 5774 - INTEGER(IntKi), PARAMETER :: M48N6MKxe = 5775 - INTEGER(IntKi), PARAMETER :: M48N7MKxe = 5776 - INTEGER(IntKi), PARAMETER :: M48N8MKxe = 5777 - INTEGER(IntKi), PARAMETER :: M48N9MKxe = 5778 - INTEGER(IntKi), PARAMETER :: M49N1MKxe = 5779 - INTEGER(IntKi), PARAMETER :: M49N2MKxe = 5780 - INTEGER(IntKi), PARAMETER :: M49N3MKxe = 5781 - INTEGER(IntKi), PARAMETER :: M49N4MKxe = 5782 - INTEGER(IntKi), PARAMETER :: M49N5MKxe = 5783 - INTEGER(IntKi), PARAMETER :: M49N6MKxe = 5784 - INTEGER(IntKi), PARAMETER :: M49N7MKxe = 5785 - INTEGER(IntKi), PARAMETER :: M49N8MKxe = 5786 - INTEGER(IntKi), PARAMETER :: M49N9MKxe = 5787 - INTEGER(IntKi), PARAMETER :: M50N1MKxe = 5788 - INTEGER(IntKi), PARAMETER :: M50N2MKxe = 5789 - INTEGER(IntKi), PARAMETER :: M50N3MKxe = 5790 - INTEGER(IntKi), PARAMETER :: M50N4MKxe = 5791 - INTEGER(IntKi), PARAMETER :: M50N5MKxe = 5792 - INTEGER(IntKi), PARAMETER :: M50N6MKxe = 5793 - INTEGER(IntKi), PARAMETER :: M50N7MKxe = 5794 - INTEGER(IntKi), PARAMETER :: M50N8MKxe = 5795 - INTEGER(IntKi), PARAMETER :: M50N9MKxe = 5796 - INTEGER(IntKi), PARAMETER :: M51N1MKxe = 5797 - INTEGER(IntKi), PARAMETER :: M51N2MKxe = 5798 - INTEGER(IntKi), PARAMETER :: M51N3MKxe = 5799 - INTEGER(IntKi), PARAMETER :: M51N4MKxe = 5800 - INTEGER(IntKi), PARAMETER :: M51N5MKxe = 5801 - INTEGER(IntKi), PARAMETER :: M51N6MKxe = 5802 - INTEGER(IntKi), PARAMETER :: M51N7MKxe = 5803 - INTEGER(IntKi), PARAMETER :: M51N8MKxe = 5804 - INTEGER(IntKi), PARAMETER :: M51N9MKxe = 5805 - INTEGER(IntKi), PARAMETER :: M52N1MKxe = 5806 - INTEGER(IntKi), PARAMETER :: M52N2MKxe = 5807 - INTEGER(IntKi), PARAMETER :: M52N3MKxe = 5808 - INTEGER(IntKi), PARAMETER :: M52N4MKxe = 5809 - INTEGER(IntKi), PARAMETER :: M52N5MKxe = 5810 - INTEGER(IntKi), PARAMETER :: M52N6MKxe = 5811 - INTEGER(IntKi), PARAMETER :: M52N7MKxe = 5812 - INTEGER(IntKi), PARAMETER :: M52N8MKxe = 5813 - INTEGER(IntKi), PARAMETER :: M52N9MKxe = 5814 - INTEGER(IntKi), PARAMETER :: M53N1MKxe = 5815 - INTEGER(IntKi), PARAMETER :: M53N2MKxe = 5816 - INTEGER(IntKi), PARAMETER :: M53N3MKxe = 5817 - INTEGER(IntKi), PARAMETER :: M53N4MKxe = 5818 - INTEGER(IntKi), PARAMETER :: M53N5MKxe = 5819 - INTEGER(IntKi), PARAMETER :: M53N6MKxe = 5820 - INTEGER(IntKi), PARAMETER :: M53N7MKxe = 5821 - INTEGER(IntKi), PARAMETER :: M53N8MKxe = 5822 - INTEGER(IntKi), PARAMETER :: M53N9MKxe = 5823 - INTEGER(IntKi), PARAMETER :: M54N1MKxe = 5824 - INTEGER(IntKi), PARAMETER :: M54N2MKxe = 5825 - INTEGER(IntKi), PARAMETER :: M54N3MKxe = 5826 - INTEGER(IntKi), PARAMETER :: M54N4MKxe = 5827 - INTEGER(IntKi), PARAMETER :: M54N5MKxe = 5828 - INTEGER(IntKi), PARAMETER :: M54N6MKxe = 5829 - INTEGER(IntKi), PARAMETER :: M54N7MKxe = 5830 - INTEGER(IntKi), PARAMETER :: M54N8MKxe = 5831 - INTEGER(IntKi), PARAMETER :: M54N9MKxe = 5832 - INTEGER(IntKi), PARAMETER :: M55N1MKxe = 5833 - INTEGER(IntKi), PARAMETER :: M55N2MKxe = 5834 - INTEGER(IntKi), PARAMETER :: M55N3MKxe = 5835 - INTEGER(IntKi), PARAMETER :: M55N4MKxe = 5836 - INTEGER(IntKi), PARAMETER :: M55N5MKxe = 5837 - INTEGER(IntKi), PARAMETER :: M55N6MKxe = 5838 - INTEGER(IntKi), PARAMETER :: M55N7MKxe = 5839 - INTEGER(IntKi), PARAMETER :: M55N8MKxe = 5840 - INTEGER(IntKi), PARAMETER :: M55N9MKxe = 5841 - INTEGER(IntKi), PARAMETER :: M56N1MKxe = 5842 - INTEGER(IntKi), PARAMETER :: M56N2MKxe = 5843 - INTEGER(IntKi), PARAMETER :: M56N3MKxe = 5844 - INTEGER(IntKi), PARAMETER :: M56N4MKxe = 5845 - INTEGER(IntKi), PARAMETER :: M56N5MKxe = 5846 - INTEGER(IntKi), PARAMETER :: M56N6MKxe = 5847 - INTEGER(IntKi), PARAMETER :: M56N7MKxe = 5848 - INTEGER(IntKi), PARAMETER :: M56N8MKxe = 5849 - INTEGER(IntKi), PARAMETER :: M56N9MKxe = 5850 - INTEGER(IntKi), PARAMETER :: M57N1MKxe = 5851 - INTEGER(IntKi), PARAMETER :: M57N2MKxe = 5852 - INTEGER(IntKi), PARAMETER :: M57N3MKxe = 5853 - INTEGER(IntKi), PARAMETER :: M57N4MKxe = 5854 - INTEGER(IntKi), PARAMETER :: M57N5MKxe = 5855 - INTEGER(IntKi), PARAMETER :: M57N6MKxe = 5856 - INTEGER(IntKi), PARAMETER :: M57N7MKxe = 5857 - INTEGER(IntKi), PARAMETER :: M57N8MKxe = 5858 - INTEGER(IntKi), PARAMETER :: M57N9MKxe = 5859 - INTEGER(IntKi), PARAMETER :: M58N1MKxe = 5860 - INTEGER(IntKi), PARAMETER :: M58N2MKxe = 5861 - INTEGER(IntKi), PARAMETER :: M58N3MKxe = 5862 - INTEGER(IntKi), PARAMETER :: M58N4MKxe = 5863 - INTEGER(IntKi), PARAMETER :: M58N5MKxe = 5864 - INTEGER(IntKi), PARAMETER :: M58N6MKxe = 5865 - INTEGER(IntKi), PARAMETER :: M58N7MKxe = 5866 - INTEGER(IntKi), PARAMETER :: M58N8MKxe = 5867 - INTEGER(IntKi), PARAMETER :: M58N9MKxe = 5868 - INTEGER(IntKi), PARAMETER :: M59N1MKxe = 5869 - INTEGER(IntKi), PARAMETER :: M59N2MKxe = 5870 - INTEGER(IntKi), PARAMETER :: M59N3MKxe = 5871 - INTEGER(IntKi), PARAMETER :: M59N4MKxe = 5872 - INTEGER(IntKi), PARAMETER :: M59N5MKxe = 5873 - INTEGER(IntKi), PARAMETER :: M59N6MKxe = 5874 - INTEGER(IntKi), PARAMETER :: M59N7MKxe = 5875 - INTEGER(IntKi), PARAMETER :: M59N8MKxe = 5876 - INTEGER(IntKi), PARAMETER :: M59N9MKxe = 5877 - INTEGER(IntKi), PARAMETER :: M60N1MKxe = 5878 - INTEGER(IntKi), PARAMETER :: M60N2MKxe = 5879 - INTEGER(IntKi), PARAMETER :: M60N3MKxe = 5880 - INTEGER(IntKi), PARAMETER :: M60N4MKxe = 5881 - INTEGER(IntKi), PARAMETER :: M60N5MKxe = 5882 - INTEGER(IntKi), PARAMETER :: M60N6MKxe = 5883 - INTEGER(IntKi), PARAMETER :: M60N7MKxe = 5884 - INTEGER(IntKi), PARAMETER :: M60N8MKxe = 5885 - INTEGER(IntKi), PARAMETER :: M60N9MKxe = 5886 - INTEGER(IntKi), PARAMETER :: M61N1MKxe = 5887 - INTEGER(IntKi), PARAMETER :: M61N2MKxe = 5888 - INTEGER(IntKi), PARAMETER :: M61N3MKxe = 5889 - INTEGER(IntKi), PARAMETER :: M61N4MKxe = 5890 - INTEGER(IntKi), PARAMETER :: M61N5MKxe = 5891 - INTEGER(IntKi), PARAMETER :: M61N6MKxe = 5892 - INTEGER(IntKi), PARAMETER :: M61N7MKxe = 5893 - INTEGER(IntKi), PARAMETER :: M61N8MKxe = 5894 - INTEGER(IntKi), PARAMETER :: M61N9MKxe = 5895 - INTEGER(IntKi), PARAMETER :: M62N1MKxe = 5896 - INTEGER(IntKi), PARAMETER :: M62N2MKxe = 5897 - INTEGER(IntKi), PARAMETER :: M62N3MKxe = 5898 - INTEGER(IntKi), PARAMETER :: M62N4MKxe = 5899 - INTEGER(IntKi), PARAMETER :: M62N5MKxe = 5900 - INTEGER(IntKi), PARAMETER :: M62N6MKxe = 5901 - INTEGER(IntKi), PARAMETER :: M62N7MKxe = 5902 - INTEGER(IntKi), PARAMETER :: M62N8MKxe = 5903 - INTEGER(IntKi), PARAMETER :: M62N9MKxe = 5904 - INTEGER(IntKi), PARAMETER :: M63N1MKxe = 5905 - INTEGER(IntKi), PARAMETER :: M63N2MKxe = 5906 - INTEGER(IntKi), PARAMETER :: M63N3MKxe = 5907 - INTEGER(IntKi), PARAMETER :: M63N4MKxe = 5908 - INTEGER(IntKi), PARAMETER :: M63N5MKxe = 5909 - INTEGER(IntKi), PARAMETER :: M63N6MKxe = 5910 - INTEGER(IntKi), PARAMETER :: M63N7MKxe = 5911 - INTEGER(IntKi), PARAMETER :: M63N8MKxe = 5912 - INTEGER(IntKi), PARAMETER :: M63N9MKxe = 5913 - INTEGER(IntKi), PARAMETER :: M64N1MKxe = 5914 - INTEGER(IntKi), PARAMETER :: M64N2MKxe = 5915 - INTEGER(IntKi), PARAMETER :: M64N3MKxe = 5916 - INTEGER(IntKi), PARAMETER :: M64N4MKxe = 5917 - INTEGER(IntKi), PARAMETER :: M64N5MKxe = 5918 - INTEGER(IntKi), PARAMETER :: M64N6MKxe = 5919 - INTEGER(IntKi), PARAMETER :: M64N7MKxe = 5920 - INTEGER(IntKi), PARAMETER :: M64N8MKxe = 5921 - INTEGER(IntKi), PARAMETER :: M64N9MKxe = 5922 - INTEGER(IntKi), PARAMETER :: M65N1MKxe = 5923 - INTEGER(IntKi), PARAMETER :: M65N2MKxe = 5924 - INTEGER(IntKi), PARAMETER :: M65N3MKxe = 5925 - INTEGER(IntKi), PARAMETER :: M65N4MKxe = 5926 - INTEGER(IntKi), PARAMETER :: M65N5MKxe = 5927 - INTEGER(IntKi), PARAMETER :: M65N6MKxe = 5928 - INTEGER(IntKi), PARAMETER :: M65N7MKxe = 5929 - INTEGER(IntKi), PARAMETER :: M65N8MKxe = 5930 - INTEGER(IntKi), PARAMETER :: M65N9MKxe = 5931 - INTEGER(IntKi), PARAMETER :: M66N1MKxe = 5932 - INTEGER(IntKi), PARAMETER :: M66N2MKxe = 5933 - INTEGER(IntKi), PARAMETER :: M66N3MKxe = 5934 - INTEGER(IntKi), PARAMETER :: M66N4MKxe = 5935 - INTEGER(IntKi), PARAMETER :: M66N5MKxe = 5936 - INTEGER(IntKi), PARAMETER :: M66N6MKxe = 5937 - INTEGER(IntKi), PARAMETER :: M66N7MKxe = 5938 - INTEGER(IntKi), PARAMETER :: M66N8MKxe = 5939 - INTEGER(IntKi), PARAMETER :: M66N9MKxe = 5940 - INTEGER(IntKi), PARAMETER :: M67N1MKxe = 5941 - INTEGER(IntKi), PARAMETER :: M67N2MKxe = 5942 - INTEGER(IntKi), PARAMETER :: M67N3MKxe = 5943 - INTEGER(IntKi), PARAMETER :: M67N4MKxe = 5944 - INTEGER(IntKi), PARAMETER :: M67N5MKxe = 5945 - INTEGER(IntKi), PARAMETER :: M67N6MKxe = 5946 - INTEGER(IntKi), PARAMETER :: M67N7MKxe = 5947 - INTEGER(IntKi), PARAMETER :: M67N8MKxe = 5948 - INTEGER(IntKi), PARAMETER :: M67N9MKxe = 5949 - INTEGER(IntKi), PARAMETER :: M68N1MKxe = 5950 - INTEGER(IntKi), PARAMETER :: M68N2MKxe = 5951 - INTEGER(IntKi), PARAMETER :: M68N3MKxe = 5952 - INTEGER(IntKi), PARAMETER :: M68N4MKxe = 5953 - INTEGER(IntKi), PARAMETER :: M68N5MKxe = 5954 - INTEGER(IntKi), PARAMETER :: M68N6MKxe = 5955 - INTEGER(IntKi), PARAMETER :: M68N7MKxe = 5956 - INTEGER(IntKi), PARAMETER :: M68N8MKxe = 5957 - INTEGER(IntKi), PARAMETER :: M68N9MKxe = 5958 - INTEGER(IntKi), PARAMETER :: M69N1MKxe = 5959 - INTEGER(IntKi), PARAMETER :: M69N2MKxe = 5960 - INTEGER(IntKi), PARAMETER :: M69N3MKxe = 5961 - INTEGER(IntKi), PARAMETER :: M69N4MKxe = 5962 - INTEGER(IntKi), PARAMETER :: M69N5MKxe = 5963 - INTEGER(IntKi), PARAMETER :: M69N6MKxe = 5964 - INTEGER(IntKi), PARAMETER :: M69N7MKxe = 5965 - INTEGER(IntKi), PARAMETER :: M69N8MKxe = 5966 - INTEGER(IntKi), PARAMETER :: M69N9MKxe = 5967 - INTEGER(IntKi), PARAMETER :: M70N1MKxe = 5968 - INTEGER(IntKi), PARAMETER :: M70N2MKxe = 5969 - INTEGER(IntKi), PARAMETER :: M70N3MKxe = 5970 - INTEGER(IntKi), PARAMETER :: M70N4MKxe = 5971 - INTEGER(IntKi), PARAMETER :: M70N5MKxe = 5972 - INTEGER(IntKi), PARAMETER :: M70N6MKxe = 5973 - INTEGER(IntKi), PARAMETER :: M70N7MKxe = 5974 - INTEGER(IntKi), PARAMETER :: M70N8MKxe = 5975 - INTEGER(IntKi), PARAMETER :: M70N9MKxe = 5976 - INTEGER(IntKi), PARAMETER :: M71N1MKxe = 5977 - INTEGER(IntKi), PARAMETER :: M71N2MKxe = 5978 - INTEGER(IntKi), PARAMETER :: M71N3MKxe = 5979 - INTEGER(IntKi), PARAMETER :: M71N4MKxe = 5980 - INTEGER(IntKi), PARAMETER :: M71N5MKxe = 5981 - INTEGER(IntKi), PARAMETER :: M71N6MKxe = 5982 - INTEGER(IntKi), PARAMETER :: M71N7MKxe = 5983 - INTEGER(IntKi), PARAMETER :: M71N8MKxe = 5984 - INTEGER(IntKi), PARAMETER :: M71N9MKxe = 5985 - INTEGER(IntKi), PARAMETER :: M72N1MKxe = 5986 - INTEGER(IntKi), PARAMETER :: M72N2MKxe = 5987 - INTEGER(IntKi), PARAMETER :: M72N3MKxe = 5988 - INTEGER(IntKi), PARAMETER :: M72N4MKxe = 5989 - INTEGER(IntKi), PARAMETER :: M72N5MKxe = 5990 - INTEGER(IntKi), PARAMETER :: M72N6MKxe = 5991 - INTEGER(IntKi), PARAMETER :: M72N7MKxe = 5992 - INTEGER(IntKi), PARAMETER :: M72N8MKxe = 5993 - INTEGER(IntKi), PARAMETER :: M72N9MKxe = 5994 - INTEGER(IntKi), PARAMETER :: M73N1MKxe = 5995 - INTEGER(IntKi), PARAMETER :: M73N2MKxe = 5996 - INTEGER(IntKi), PARAMETER :: M73N3MKxe = 5997 - INTEGER(IntKi), PARAMETER :: M73N4MKxe = 5998 - INTEGER(IntKi), PARAMETER :: M73N5MKxe = 5999 - INTEGER(IntKi), PARAMETER :: M73N6MKxe = 6000 - INTEGER(IntKi), PARAMETER :: M73N7MKxe = 6001 - INTEGER(IntKi), PARAMETER :: M73N8MKxe = 6002 - INTEGER(IntKi), PARAMETER :: M73N9MKxe = 6003 - INTEGER(IntKi), PARAMETER :: M74N1MKxe = 6004 - INTEGER(IntKi), PARAMETER :: M74N2MKxe = 6005 - INTEGER(IntKi), PARAMETER :: M74N3MKxe = 6006 - INTEGER(IntKi), PARAMETER :: M74N4MKxe = 6007 - INTEGER(IntKi), PARAMETER :: M74N5MKxe = 6008 - INTEGER(IntKi), PARAMETER :: M74N6MKxe = 6009 - INTEGER(IntKi), PARAMETER :: M74N7MKxe = 6010 - INTEGER(IntKi), PARAMETER :: M74N8MKxe = 6011 - INTEGER(IntKi), PARAMETER :: M74N9MKxe = 6012 - INTEGER(IntKi), PARAMETER :: M75N1MKxe = 6013 - INTEGER(IntKi), PARAMETER :: M75N2MKxe = 6014 - INTEGER(IntKi), PARAMETER :: M75N3MKxe = 6015 - INTEGER(IntKi), PARAMETER :: M75N4MKxe = 6016 - INTEGER(IntKi), PARAMETER :: M75N5MKxe = 6017 - INTEGER(IntKi), PARAMETER :: M75N6MKxe = 6018 - INTEGER(IntKi), PARAMETER :: M75N7MKxe = 6019 - INTEGER(IntKi), PARAMETER :: M75N8MKxe = 6020 - INTEGER(IntKi), PARAMETER :: M75N9MKxe = 6021 - INTEGER(IntKi), PARAMETER :: M76N1MKxe = 6022 - INTEGER(IntKi), PARAMETER :: M76N2MKxe = 6023 - INTEGER(IntKi), PARAMETER :: M76N3MKxe = 6024 - INTEGER(IntKi), PARAMETER :: M76N4MKxe = 6025 - INTEGER(IntKi), PARAMETER :: M76N5MKxe = 6026 - INTEGER(IntKi), PARAMETER :: M76N6MKxe = 6027 - INTEGER(IntKi), PARAMETER :: M76N7MKxe = 6028 - INTEGER(IntKi), PARAMETER :: M76N8MKxe = 6029 - INTEGER(IntKi), PARAMETER :: M76N9MKxe = 6030 - INTEGER(IntKi), PARAMETER :: M77N1MKxe = 6031 - INTEGER(IntKi), PARAMETER :: M77N2MKxe = 6032 - INTEGER(IntKi), PARAMETER :: M77N3MKxe = 6033 - INTEGER(IntKi), PARAMETER :: M77N4MKxe = 6034 - INTEGER(IntKi), PARAMETER :: M77N5MKxe = 6035 - INTEGER(IntKi), PARAMETER :: M77N6MKxe = 6036 - INTEGER(IntKi), PARAMETER :: M77N7MKxe = 6037 - INTEGER(IntKi), PARAMETER :: M77N8MKxe = 6038 - INTEGER(IntKi), PARAMETER :: M77N9MKxe = 6039 - INTEGER(IntKi), PARAMETER :: M78N1MKxe = 6040 - INTEGER(IntKi), PARAMETER :: M78N2MKxe = 6041 - INTEGER(IntKi), PARAMETER :: M78N3MKxe = 6042 - INTEGER(IntKi), PARAMETER :: M78N4MKxe = 6043 - INTEGER(IntKi), PARAMETER :: M78N5MKxe = 6044 - INTEGER(IntKi), PARAMETER :: M78N6MKxe = 6045 - INTEGER(IntKi), PARAMETER :: M78N7MKxe = 6046 - INTEGER(IntKi), PARAMETER :: M78N8MKxe = 6047 - INTEGER(IntKi), PARAMETER :: M78N9MKxe = 6048 - INTEGER(IntKi), PARAMETER :: M79N1MKxe = 6049 - INTEGER(IntKi), PARAMETER :: M79N2MKxe = 6050 - INTEGER(IntKi), PARAMETER :: M79N3MKxe = 6051 - INTEGER(IntKi), PARAMETER :: M79N4MKxe = 6052 - INTEGER(IntKi), PARAMETER :: M79N5MKxe = 6053 - INTEGER(IntKi), PARAMETER :: M79N6MKxe = 6054 - INTEGER(IntKi), PARAMETER :: M79N7MKxe = 6055 - INTEGER(IntKi), PARAMETER :: M79N8MKxe = 6056 - INTEGER(IntKi), PARAMETER :: M79N9MKxe = 6057 - INTEGER(IntKi), PARAMETER :: M80N1MKxe = 6058 - INTEGER(IntKi), PARAMETER :: M80N2MKxe = 6059 - INTEGER(IntKi), PARAMETER :: M80N3MKxe = 6060 - INTEGER(IntKi), PARAMETER :: M80N4MKxe = 6061 - INTEGER(IntKi), PARAMETER :: M80N5MKxe = 6062 - INTEGER(IntKi), PARAMETER :: M80N6MKxe = 6063 - INTEGER(IntKi), PARAMETER :: M80N7MKxe = 6064 - INTEGER(IntKi), PARAMETER :: M80N8MKxe = 6065 - INTEGER(IntKi), PARAMETER :: M80N9MKxe = 6066 - INTEGER(IntKi), PARAMETER :: M81N1MKxe = 6067 - INTEGER(IntKi), PARAMETER :: M81N2MKxe = 6068 - INTEGER(IntKi), PARAMETER :: M81N3MKxe = 6069 - INTEGER(IntKi), PARAMETER :: M81N4MKxe = 6070 - INTEGER(IntKi), PARAMETER :: M81N5MKxe = 6071 - INTEGER(IntKi), PARAMETER :: M81N6MKxe = 6072 - INTEGER(IntKi), PARAMETER :: M81N7MKxe = 6073 - INTEGER(IntKi), PARAMETER :: M81N8MKxe = 6074 - INTEGER(IntKi), PARAMETER :: M81N9MKxe = 6075 - INTEGER(IntKi), PARAMETER :: M82N1MKxe = 6076 - INTEGER(IntKi), PARAMETER :: M82N2MKxe = 6077 - INTEGER(IntKi), PARAMETER :: M82N3MKxe = 6078 - INTEGER(IntKi), PARAMETER :: M82N4MKxe = 6079 - INTEGER(IntKi), PARAMETER :: M82N5MKxe = 6080 - INTEGER(IntKi), PARAMETER :: M82N6MKxe = 6081 - INTEGER(IntKi), PARAMETER :: M82N7MKxe = 6082 - INTEGER(IntKi), PARAMETER :: M82N8MKxe = 6083 - INTEGER(IntKi), PARAMETER :: M82N9MKxe = 6084 - INTEGER(IntKi), PARAMETER :: M83N1MKxe = 6085 - INTEGER(IntKi), PARAMETER :: M83N2MKxe = 6086 - INTEGER(IntKi), PARAMETER :: M83N3MKxe = 6087 - INTEGER(IntKi), PARAMETER :: M83N4MKxe = 6088 - INTEGER(IntKi), PARAMETER :: M83N5MKxe = 6089 - INTEGER(IntKi), PARAMETER :: M83N6MKxe = 6090 - INTEGER(IntKi), PARAMETER :: M83N7MKxe = 6091 - INTEGER(IntKi), PARAMETER :: M83N8MKxe = 6092 - INTEGER(IntKi), PARAMETER :: M83N9MKxe = 6093 - INTEGER(IntKi), PARAMETER :: M84N1MKxe = 6094 - INTEGER(IntKi), PARAMETER :: M84N2MKxe = 6095 - INTEGER(IntKi), PARAMETER :: M84N3MKxe = 6096 - INTEGER(IntKi), PARAMETER :: M84N4MKxe = 6097 - INTEGER(IntKi), PARAMETER :: M84N5MKxe = 6098 - INTEGER(IntKi), PARAMETER :: M84N6MKxe = 6099 - INTEGER(IntKi), PARAMETER :: M84N7MKxe = 6100 - INTEGER(IntKi), PARAMETER :: M84N8MKxe = 6101 - INTEGER(IntKi), PARAMETER :: M84N9MKxe = 6102 - INTEGER(IntKi), PARAMETER :: M85N1MKxe = 6103 - INTEGER(IntKi), PARAMETER :: M85N2MKxe = 6104 - INTEGER(IntKi), PARAMETER :: M85N3MKxe = 6105 - INTEGER(IntKi), PARAMETER :: M85N4MKxe = 6106 - INTEGER(IntKi), PARAMETER :: M85N5MKxe = 6107 - INTEGER(IntKi), PARAMETER :: M85N6MKxe = 6108 - INTEGER(IntKi), PARAMETER :: M85N7MKxe = 6109 - INTEGER(IntKi), PARAMETER :: M85N8MKxe = 6110 - INTEGER(IntKi), PARAMETER :: M85N9MKxe = 6111 - INTEGER(IntKi), PARAMETER :: M86N1MKxe = 6112 - INTEGER(IntKi), PARAMETER :: M86N2MKxe = 6113 - INTEGER(IntKi), PARAMETER :: M86N3MKxe = 6114 - INTEGER(IntKi), PARAMETER :: M86N4MKxe = 6115 - INTEGER(IntKi), PARAMETER :: M86N5MKxe = 6116 - INTEGER(IntKi), PARAMETER :: M86N6MKxe = 6117 - INTEGER(IntKi), PARAMETER :: M86N7MKxe = 6118 - INTEGER(IntKi), PARAMETER :: M86N8MKxe = 6119 - INTEGER(IntKi), PARAMETER :: M86N9MKxe = 6120 - INTEGER(IntKi), PARAMETER :: M87N1MKxe = 6121 - INTEGER(IntKi), PARAMETER :: M87N2MKxe = 6122 - INTEGER(IntKi), PARAMETER :: M87N3MKxe = 6123 - INTEGER(IntKi), PARAMETER :: M87N4MKxe = 6124 - INTEGER(IntKi), PARAMETER :: M87N5MKxe = 6125 - INTEGER(IntKi), PARAMETER :: M87N6MKxe = 6126 - INTEGER(IntKi), PARAMETER :: M87N7MKxe = 6127 - INTEGER(IntKi), PARAMETER :: M87N8MKxe = 6128 - INTEGER(IntKi), PARAMETER :: M87N9MKxe = 6129 - INTEGER(IntKi), PARAMETER :: M88N1MKxe = 6130 - INTEGER(IntKi), PARAMETER :: M88N2MKxe = 6131 - INTEGER(IntKi), PARAMETER :: M88N3MKxe = 6132 - INTEGER(IntKi), PARAMETER :: M88N4MKxe = 6133 - INTEGER(IntKi), PARAMETER :: M88N5MKxe = 6134 - INTEGER(IntKi), PARAMETER :: M88N6MKxe = 6135 - INTEGER(IntKi), PARAMETER :: M88N7MKxe = 6136 - INTEGER(IntKi), PARAMETER :: M88N8MKxe = 6137 - INTEGER(IntKi), PARAMETER :: M88N9MKxe = 6138 - INTEGER(IntKi), PARAMETER :: M89N1MKxe = 6139 - INTEGER(IntKi), PARAMETER :: M89N2MKxe = 6140 - INTEGER(IntKi), PARAMETER :: M89N3MKxe = 6141 - INTEGER(IntKi), PARAMETER :: M89N4MKxe = 6142 - INTEGER(IntKi), PARAMETER :: M89N5MKxe = 6143 - INTEGER(IntKi), PARAMETER :: M89N6MKxe = 6144 - INTEGER(IntKi), PARAMETER :: M89N7MKxe = 6145 - INTEGER(IntKi), PARAMETER :: M89N8MKxe = 6146 - INTEGER(IntKi), PARAMETER :: M89N9MKxe = 6147 - INTEGER(IntKi), PARAMETER :: M90N1MKxe = 6148 - INTEGER(IntKi), PARAMETER :: M90N2MKxe = 6149 - INTEGER(IntKi), PARAMETER :: M90N3MKxe = 6150 - INTEGER(IntKi), PARAMETER :: M90N4MKxe = 6151 - INTEGER(IntKi), PARAMETER :: M90N5MKxe = 6152 - INTEGER(IntKi), PARAMETER :: M90N6MKxe = 6153 - INTEGER(IntKi), PARAMETER :: M90N7MKxe = 6154 - INTEGER(IntKi), PARAMETER :: M90N8MKxe = 6155 - INTEGER(IntKi), PARAMETER :: M90N9MKxe = 6156 - INTEGER(IntKi), PARAMETER :: M91N1MKxe = 6157 - INTEGER(IntKi), PARAMETER :: M91N2MKxe = 6158 - INTEGER(IntKi), PARAMETER :: M91N3MKxe = 6159 - INTEGER(IntKi), PARAMETER :: M91N4MKxe = 6160 - INTEGER(IntKi), PARAMETER :: M91N5MKxe = 6161 - INTEGER(IntKi), PARAMETER :: M91N6MKxe = 6162 - INTEGER(IntKi), PARAMETER :: M91N7MKxe = 6163 - INTEGER(IntKi), PARAMETER :: M91N8MKxe = 6164 - INTEGER(IntKi), PARAMETER :: M91N9MKxe = 6165 - INTEGER(IntKi), PARAMETER :: M92N1MKxe = 6166 - INTEGER(IntKi), PARAMETER :: M92N2MKxe = 6167 - INTEGER(IntKi), PARAMETER :: M92N3MKxe = 6168 - INTEGER(IntKi), PARAMETER :: M92N4MKxe = 6169 - INTEGER(IntKi), PARAMETER :: M92N5MKxe = 6170 - INTEGER(IntKi), PARAMETER :: M92N6MKxe = 6171 - INTEGER(IntKi), PARAMETER :: M92N7MKxe = 6172 - INTEGER(IntKi), PARAMETER :: M92N8MKxe = 6173 - INTEGER(IntKi), PARAMETER :: M92N9MKxe = 6174 - INTEGER(IntKi), PARAMETER :: M93N1MKxe = 6175 - INTEGER(IntKi), PARAMETER :: M93N2MKxe = 6176 - INTEGER(IntKi), PARAMETER :: M93N3MKxe = 6177 - INTEGER(IntKi), PARAMETER :: M93N4MKxe = 6178 - INTEGER(IntKi), PARAMETER :: M93N5MKxe = 6179 - INTEGER(IntKi), PARAMETER :: M93N6MKxe = 6180 - INTEGER(IntKi), PARAMETER :: M93N7MKxe = 6181 - INTEGER(IntKi), PARAMETER :: M93N8MKxe = 6182 - INTEGER(IntKi), PARAMETER :: M93N9MKxe = 6183 - INTEGER(IntKi), PARAMETER :: M94N1MKxe = 6184 - INTEGER(IntKi), PARAMETER :: M94N2MKxe = 6185 - INTEGER(IntKi), PARAMETER :: M94N3MKxe = 6186 - INTEGER(IntKi), PARAMETER :: M94N4MKxe = 6187 - INTEGER(IntKi), PARAMETER :: M94N5MKxe = 6188 - INTEGER(IntKi), PARAMETER :: M94N6MKxe = 6189 - INTEGER(IntKi), PARAMETER :: M94N7MKxe = 6190 - INTEGER(IntKi), PARAMETER :: M94N8MKxe = 6191 - INTEGER(IntKi), PARAMETER :: M94N9MKxe = 6192 - INTEGER(IntKi), PARAMETER :: M95N1MKxe = 6193 - INTEGER(IntKi), PARAMETER :: M95N2MKxe = 6194 - INTEGER(IntKi), PARAMETER :: M95N3MKxe = 6195 - INTEGER(IntKi), PARAMETER :: M95N4MKxe = 6196 - INTEGER(IntKi), PARAMETER :: M95N5MKxe = 6197 - INTEGER(IntKi), PARAMETER :: M95N6MKxe = 6198 - INTEGER(IntKi), PARAMETER :: M95N7MKxe = 6199 - INTEGER(IntKi), PARAMETER :: M95N8MKxe = 6200 - INTEGER(IntKi), PARAMETER :: M95N9MKxe = 6201 - INTEGER(IntKi), PARAMETER :: M96N1MKxe = 6202 - INTEGER(IntKi), PARAMETER :: M96N2MKxe = 6203 - INTEGER(IntKi), PARAMETER :: M96N3MKxe = 6204 - INTEGER(IntKi), PARAMETER :: M96N4MKxe = 6205 - INTEGER(IntKi), PARAMETER :: M96N5MKxe = 6206 - INTEGER(IntKi), PARAMETER :: M96N6MKxe = 6207 - INTEGER(IntKi), PARAMETER :: M96N7MKxe = 6208 - INTEGER(IntKi), PARAMETER :: M96N8MKxe = 6209 - INTEGER(IntKi), PARAMETER :: M96N9MKxe = 6210 - INTEGER(IntKi), PARAMETER :: M97N1MKxe = 6211 - INTEGER(IntKi), PARAMETER :: M97N2MKxe = 6212 - INTEGER(IntKi), PARAMETER :: M97N3MKxe = 6213 - INTEGER(IntKi), PARAMETER :: M97N4MKxe = 6214 - INTEGER(IntKi), PARAMETER :: M97N5MKxe = 6215 - INTEGER(IntKi), PARAMETER :: M97N6MKxe = 6216 - INTEGER(IntKi), PARAMETER :: M97N7MKxe = 6217 - INTEGER(IntKi), PARAMETER :: M97N8MKxe = 6218 - INTEGER(IntKi), PARAMETER :: M97N9MKxe = 6219 - INTEGER(IntKi), PARAMETER :: M98N1MKxe = 6220 - INTEGER(IntKi), PARAMETER :: M98N2MKxe = 6221 - INTEGER(IntKi), PARAMETER :: M98N3MKxe = 6222 - INTEGER(IntKi), PARAMETER :: M98N4MKxe = 6223 - INTEGER(IntKi), PARAMETER :: M98N5MKxe = 6224 - INTEGER(IntKi), PARAMETER :: M98N6MKxe = 6225 - INTEGER(IntKi), PARAMETER :: M98N7MKxe = 6226 - INTEGER(IntKi), PARAMETER :: M98N8MKxe = 6227 - INTEGER(IntKi), PARAMETER :: M98N9MKxe = 6228 - INTEGER(IntKi), PARAMETER :: M99N1MKxe = 6229 - INTEGER(IntKi), PARAMETER :: M99N2MKxe = 6230 - INTEGER(IntKi), PARAMETER :: M99N3MKxe = 6231 - INTEGER(IntKi), PARAMETER :: M99N4MKxe = 6232 - INTEGER(IntKi), PARAMETER :: M99N5MKxe = 6233 - INTEGER(IntKi), PARAMETER :: M99N6MKxe = 6234 - INTEGER(IntKi), PARAMETER :: M99N7MKxe = 6235 - INTEGER(IntKi), PARAMETER :: M99N8MKxe = 6236 - INTEGER(IntKi), PARAMETER :: M99N9MKxe = 6237 - INTEGER(IntKi), PARAMETER :: M01N1MKye = 6238 - INTEGER(IntKi), PARAMETER :: M01N2MKye = 6239 - INTEGER(IntKi), PARAMETER :: M01N3MKye = 6240 - INTEGER(IntKi), PARAMETER :: M01N4MKye = 6241 - INTEGER(IntKi), PARAMETER :: M01N5MKye = 6242 - INTEGER(IntKi), PARAMETER :: M01N6MKye = 6243 - INTEGER(IntKi), PARAMETER :: M01N7MKye = 6244 - INTEGER(IntKi), PARAMETER :: M01N8MKye = 6245 - INTEGER(IntKi), PARAMETER :: M01N9MKye = 6246 - INTEGER(IntKi), PARAMETER :: M02N1MKye = 6247 - INTEGER(IntKi), PARAMETER :: M02N2MKye = 6248 - INTEGER(IntKi), PARAMETER :: M02N3MKye = 6249 - INTEGER(IntKi), PARAMETER :: M02N4MKye = 6250 - INTEGER(IntKi), PARAMETER :: M02N5MKye = 6251 - INTEGER(IntKi), PARAMETER :: M02N6MKye = 6252 - INTEGER(IntKi), PARAMETER :: M02N7MKye = 6253 - INTEGER(IntKi), PARAMETER :: M02N8MKye = 6254 - INTEGER(IntKi), PARAMETER :: M02N9MKye = 6255 - INTEGER(IntKi), PARAMETER :: M03N1MKye = 6256 - INTEGER(IntKi), PARAMETER :: M03N2MKye = 6257 - INTEGER(IntKi), PARAMETER :: M03N3MKye = 6258 - INTEGER(IntKi), PARAMETER :: M03N4MKye = 6259 - INTEGER(IntKi), PARAMETER :: M03N5MKye = 6260 - INTEGER(IntKi), PARAMETER :: M03N6MKye = 6261 - INTEGER(IntKi), PARAMETER :: M03N7MKye = 6262 - INTEGER(IntKi), PARAMETER :: M03N8MKye = 6263 - INTEGER(IntKi), PARAMETER :: M03N9MKye = 6264 - INTEGER(IntKi), PARAMETER :: M04N1MKye = 6265 - INTEGER(IntKi), PARAMETER :: M04N2MKye = 6266 - INTEGER(IntKi), PARAMETER :: M04N3MKye = 6267 - INTEGER(IntKi), PARAMETER :: M04N4MKye = 6268 - INTEGER(IntKi), PARAMETER :: M04N5MKye = 6269 - INTEGER(IntKi), PARAMETER :: M04N6MKye = 6270 - INTEGER(IntKi), PARAMETER :: M04N7MKye = 6271 - INTEGER(IntKi), PARAMETER :: M04N8MKye = 6272 - INTEGER(IntKi), PARAMETER :: M04N9MKye = 6273 - INTEGER(IntKi), PARAMETER :: M05N1MKye = 6274 - INTEGER(IntKi), PARAMETER :: M05N2MKye = 6275 - INTEGER(IntKi), PARAMETER :: M05N3MKye = 6276 - INTEGER(IntKi), PARAMETER :: M05N4MKye = 6277 - INTEGER(IntKi), PARAMETER :: M05N5MKye = 6278 - INTEGER(IntKi), PARAMETER :: M05N6MKye = 6279 - INTEGER(IntKi), PARAMETER :: M05N7MKye = 6280 - INTEGER(IntKi), PARAMETER :: M05N8MKye = 6281 - INTEGER(IntKi), PARAMETER :: M05N9MKye = 6282 - INTEGER(IntKi), PARAMETER :: M06N1MKye = 6283 - INTEGER(IntKi), PARAMETER :: M06N2MKye = 6284 - INTEGER(IntKi), PARAMETER :: M06N3MKye = 6285 - INTEGER(IntKi), PARAMETER :: M06N4MKye = 6286 - INTEGER(IntKi), PARAMETER :: M06N5MKye = 6287 - INTEGER(IntKi), PARAMETER :: M06N6MKye = 6288 - INTEGER(IntKi), PARAMETER :: M06N7MKye = 6289 - INTEGER(IntKi), PARAMETER :: M06N8MKye = 6290 - INTEGER(IntKi), PARAMETER :: M06N9MKye = 6291 - INTEGER(IntKi), PARAMETER :: M07N1MKye = 6292 - INTEGER(IntKi), PARAMETER :: M07N2MKye = 6293 - INTEGER(IntKi), PARAMETER :: M07N3MKye = 6294 - INTEGER(IntKi), PARAMETER :: M07N4MKye = 6295 - INTEGER(IntKi), PARAMETER :: M07N5MKye = 6296 - INTEGER(IntKi), PARAMETER :: M07N6MKye = 6297 - INTEGER(IntKi), PARAMETER :: M07N7MKye = 6298 - INTEGER(IntKi), PARAMETER :: M07N8MKye = 6299 - INTEGER(IntKi), PARAMETER :: M07N9MKye = 6300 - INTEGER(IntKi), PARAMETER :: M08N1MKye = 6301 - INTEGER(IntKi), PARAMETER :: M08N2MKye = 6302 - INTEGER(IntKi), PARAMETER :: M08N3MKye = 6303 - INTEGER(IntKi), PARAMETER :: M08N4MKye = 6304 - INTEGER(IntKi), PARAMETER :: M08N5MKye = 6305 - INTEGER(IntKi), PARAMETER :: M08N6MKye = 6306 - INTEGER(IntKi), PARAMETER :: M08N7MKye = 6307 - INTEGER(IntKi), PARAMETER :: M08N8MKye = 6308 - INTEGER(IntKi), PARAMETER :: M08N9MKye = 6309 - INTEGER(IntKi), PARAMETER :: M09N1MKye = 6310 - INTEGER(IntKi), PARAMETER :: M09N2MKye = 6311 - INTEGER(IntKi), PARAMETER :: M09N3MKye = 6312 - INTEGER(IntKi), PARAMETER :: M09N4MKye = 6313 - INTEGER(IntKi), PARAMETER :: M09N5MKye = 6314 - INTEGER(IntKi), PARAMETER :: M09N6MKye = 6315 - INTEGER(IntKi), PARAMETER :: M09N7MKye = 6316 - INTEGER(IntKi), PARAMETER :: M09N8MKye = 6317 - INTEGER(IntKi), PARAMETER :: M09N9MKye = 6318 - INTEGER(IntKi), PARAMETER :: M10N1MKye = 6319 - INTEGER(IntKi), PARAMETER :: M10N2MKye = 6320 - INTEGER(IntKi), PARAMETER :: M10N3MKye = 6321 - INTEGER(IntKi), PARAMETER :: M10N4MKye = 6322 - INTEGER(IntKi), PARAMETER :: M10N5MKye = 6323 - INTEGER(IntKi), PARAMETER :: M10N6MKye = 6324 - INTEGER(IntKi), PARAMETER :: M10N7MKye = 6325 - INTEGER(IntKi), PARAMETER :: M10N8MKye = 6326 - INTEGER(IntKi), PARAMETER :: M10N9MKye = 6327 - INTEGER(IntKi), PARAMETER :: M11N1MKye = 6328 - INTEGER(IntKi), PARAMETER :: M11N2MKye = 6329 - INTEGER(IntKi), PARAMETER :: M11N3MKye = 6330 - INTEGER(IntKi), PARAMETER :: M11N4MKye = 6331 - INTEGER(IntKi), PARAMETER :: M11N5MKye = 6332 - INTEGER(IntKi), PARAMETER :: M11N6MKye = 6333 - INTEGER(IntKi), PARAMETER :: M11N7MKye = 6334 - INTEGER(IntKi), PARAMETER :: M11N8MKye = 6335 - INTEGER(IntKi), PARAMETER :: M11N9MKye = 6336 - INTEGER(IntKi), PARAMETER :: M12N1MKye = 6337 - INTEGER(IntKi), PARAMETER :: M12N2MKye = 6338 - INTEGER(IntKi), PARAMETER :: M12N3MKye = 6339 - INTEGER(IntKi), PARAMETER :: M12N4MKye = 6340 - INTEGER(IntKi), PARAMETER :: M12N5MKye = 6341 - INTEGER(IntKi), PARAMETER :: M12N6MKye = 6342 - INTEGER(IntKi), PARAMETER :: M12N7MKye = 6343 - INTEGER(IntKi), PARAMETER :: M12N8MKye = 6344 - INTEGER(IntKi), PARAMETER :: M12N9MKye = 6345 - INTEGER(IntKi), PARAMETER :: M13N1MKye = 6346 - INTEGER(IntKi), PARAMETER :: M13N2MKye = 6347 - INTEGER(IntKi), PARAMETER :: M13N3MKye = 6348 - INTEGER(IntKi), PARAMETER :: M13N4MKye = 6349 - INTEGER(IntKi), PARAMETER :: M13N5MKye = 6350 - INTEGER(IntKi), PARAMETER :: M13N6MKye = 6351 - INTEGER(IntKi), PARAMETER :: M13N7MKye = 6352 - INTEGER(IntKi), PARAMETER :: M13N8MKye = 6353 - INTEGER(IntKi), PARAMETER :: M13N9MKye = 6354 - INTEGER(IntKi), PARAMETER :: M14N1MKye = 6355 - INTEGER(IntKi), PARAMETER :: M14N2MKye = 6356 - INTEGER(IntKi), PARAMETER :: M14N3MKye = 6357 - INTEGER(IntKi), PARAMETER :: M14N4MKye = 6358 - INTEGER(IntKi), PARAMETER :: M14N5MKye = 6359 - INTEGER(IntKi), PARAMETER :: M14N6MKye = 6360 - INTEGER(IntKi), PARAMETER :: M14N7MKye = 6361 - INTEGER(IntKi), PARAMETER :: M14N8MKye = 6362 - INTEGER(IntKi), PARAMETER :: M14N9MKye = 6363 - INTEGER(IntKi), PARAMETER :: M15N1MKye = 6364 - INTEGER(IntKi), PARAMETER :: M15N2MKye = 6365 - INTEGER(IntKi), PARAMETER :: M15N3MKye = 6366 - INTEGER(IntKi), PARAMETER :: M15N4MKye = 6367 - INTEGER(IntKi), PARAMETER :: M15N5MKye = 6368 - INTEGER(IntKi), PARAMETER :: M15N6MKye = 6369 - INTEGER(IntKi), PARAMETER :: M15N7MKye = 6370 - INTEGER(IntKi), PARAMETER :: M15N8MKye = 6371 - INTEGER(IntKi), PARAMETER :: M15N9MKye = 6372 - INTEGER(IntKi), PARAMETER :: M16N1MKye = 6373 - INTEGER(IntKi), PARAMETER :: M16N2MKye = 6374 - INTEGER(IntKi), PARAMETER :: M16N3MKye = 6375 - INTEGER(IntKi), PARAMETER :: M16N4MKye = 6376 - INTEGER(IntKi), PARAMETER :: M16N5MKye = 6377 - INTEGER(IntKi), PARAMETER :: M16N6MKye = 6378 - INTEGER(IntKi), PARAMETER :: M16N7MKye = 6379 - INTEGER(IntKi), PARAMETER :: M16N8MKye = 6380 - INTEGER(IntKi), PARAMETER :: M16N9MKye = 6381 - INTEGER(IntKi), PARAMETER :: M17N1MKye = 6382 - INTEGER(IntKi), PARAMETER :: M17N2MKye = 6383 - INTEGER(IntKi), PARAMETER :: M17N3MKye = 6384 - INTEGER(IntKi), PARAMETER :: M17N4MKye = 6385 - INTEGER(IntKi), PARAMETER :: M17N5MKye = 6386 - INTEGER(IntKi), PARAMETER :: M17N6MKye = 6387 - INTEGER(IntKi), PARAMETER :: M17N7MKye = 6388 - INTEGER(IntKi), PARAMETER :: M17N8MKye = 6389 - INTEGER(IntKi), PARAMETER :: M17N9MKye = 6390 - INTEGER(IntKi), PARAMETER :: M18N1MKye = 6391 - INTEGER(IntKi), PARAMETER :: M18N2MKye = 6392 - INTEGER(IntKi), PARAMETER :: M18N3MKye = 6393 - INTEGER(IntKi), PARAMETER :: M18N4MKye = 6394 - INTEGER(IntKi), PARAMETER :: M18N5MKye = 6395 - INTEGER(IntKi), PARAMETER :: M18N6MKye = 6396 - INTEGER(IntKi), PARAMETER :: M18N7MKye = 6397 - INTEGER(IntKi), PARAMETER :: M18N8MKye = 6398 - INTEGER(IntKi), PARAMETER :: M18N9MKye = 6399 - INTEGER(IntKi), PARAMETER :: M19N1MKye = 6400 - INTEGER(IntKi), PARAMETER :: M19N2MKye = 6401 - INTEGER(IntKi), PARAMETER :: M19N3MKye = 6402 - INTEGER(IntKi), PARAMETER :: M19N4MKye = 6403 - INTEGER(IntKi), PARAMETER :: M19N5MKye = 6404 - INTEGER(IntKi), PARAMETER :: M19N6MKye = 6405 - INTEGER(IntKi), PARAMETER :: M19N7MKye = 6406 - INTEGER(IntKi), PARAMETER :: M19N8MKye = 6407 - INTEGER(IntKi), PARAMETER :: M19N9MKye = 6408 - INTEGER(IntKi), PARAMETER :: M20N1MKye = 6409 - INTEGER(IntKi), PARAMETER :: M20N2MKye = 6410 - INTEGER(IntKi), PARAMETER :: M20N3MKye = 6411 - INTEGER(IntKi), PARAMETER :: M20N4MKye = 6412 - INTEGER(IntKi), PARAMETER :: M20N5MKye = 6413 - INTEGER(IntKi), PARAMETER :: M20N6MKye = 6414 - INTEGER(IntKi), PARAMETER :: M20N7MKye = 6415 - INTEGER(IntKi), PARAMETER :: M20N8MKye = 6416 - INTEGER(IntKi), PARAMETER :: M20N9MKye = 6417 - INTEGER(IntKi), PARAMETER :: M21N1MKye = 6418 - INTEGER(IntKi), PARAMETER :: M21N2MKye = 6419 - INTEGER(IntKi), PARAMETER :: M21N3MKye = 6420 - INTEGER(IntKi), PARAMETER :: M21N4MKye = 6421 - INTEGER(IntKi), PARAMETER :: M21N5MKye = 6422 - INTEGER(IntKi), PARAMETER :: M21N6MKye = 6423 - INTEGER(IntKi), PARAMETER :: M21N7MKye = 6424 - INTEGER(IntKi), PARAMETER :: M21N8MKye = 6425 - INTEGER(IntKi), PARAMETER :: M21N9MKye = 6426 - INTEGER(IntKi), PARAMETER :: M22N1MKye = 6427 - INTEGER(IntKi), PARAMETER :: M22N2MKye = 6428 - INTEGER(IntKi), PARAMETER :: M22N3MKye = 6429 - INTEGER(IntKi), PARAMETER :: M22N4MKye = 6430 - INTEGER(IntKi), PARAMETER :: M22N5MKye = 6431 - INTEGER(IntKi), PARAMETER :: M22N6MKye = 6432 - INTEGER(IntKi), PARAMETER :: M22N7MKye = 6433 - INTEGER(IntKi), PARAMETER :: M22N8MKye = 6434 - INTEGER(IntKi), PARAMETER :: M22N9MKye = 6435 - INTEGER(IntKi), PARAMETER :: M23N1MKye = 6436 - INTEGER(IntKi), PARAMETER :: M23N2MKye = 6437 - INTEGER(IntKi), PARAMETER :: M23N3MKye = 6438 - INTEGER(IntKi), PARAMETER :: M23N4MKye = 6439 - INTEGER(IntKi), PARAMETER :: M23N5MKye = 6440 - INTEGER(IntKi), PARAMETER :: M23N6MKye = 6441 - INTEGER(IntKi), PARAMETER :: M23N7MKye = 6442 - INTEGER(IntKi), PARAMETER :: M23N8MKye = 6443 - INTEGER(IntKi), PARAMETER :: M23N9MKye = 6444 - INTEGER(IntKi), PARAMETER :: M24N1MKye = 6445 - INTEGER(IntKi), PARAMETER :: M24N2MKye = 6446 - INTEGER(IntKi), PARAMETER :: M24N3MKye = 6447 - INTEGER(IntKi), PARAMETER :: M24N4MKye = 6448 - INTEGER(IntKi), PARAMETER :: M24N5MKye = 6449 - INTEGER(IntKi), PARAMETER :: M24N6MKye = 6450 - INTEGER(IntKi), PARAMETER :: M24N7MKye = 6451 - INTEGER(IntKi), PARAMETER :: M24N8MKye = 6452 - INTEGER(IntKi), PARAMETER :: M24N9MKye = 6453 - INTEGER(IntKi), PARAMETER :: M25N1MKye = 6454 - INTEGER(IntKi), PARAMETER :: M25N2MKye = 6455 - INTEGER(IntKi), PARAMETER :: M25N3MKye = 6456 - INTEGER(IntKi), PARAMETER :: M25N4MKye = 6457 - INTEGER(IntKi), PARAMETER :: M25N5MKye = 6458 - INTEGER(IntKi), PARAMETER :: M25N6MKye = 6459 - INTEGER(IntKi), PARAMETER :: M25N7MKye = 6460 - INTEGER(IntKi), PARAMETER :: M25N8MKye = 6461 - INTEGER(IntKi), PARAMETER :: M25N9MKye = 6462 - INTEGER(IntKi), PARAMETER :: M26N1MKye = 6463 - INTEGER(IntKi), PARAMETER :: M26N2MKye = 6464 - INTEGER(IntKi), PARAMETER :: M26N3MKye = 6465 - INTEGER(IntKi), PARAMETER :: M26N4MKye = 6466 - INTEGER(IntKi), PARAMETER :: M26N5MKye = 6467 - INTEGER(IntKi), PARAMETER :: M26N6MKye = 6468 - INTEGER(IntKi), PARAMETER :: M26N7MKye = 6469 - INTEGER(IntKi), PARAMETER :: M26N8MKye = 6470 - INTEGER(IntKi), PARAMETER :: M26N9MKye = 6471 - INTEGER(IntKi), PARAMETER :: M27N1MKye = 6472 - INTEGER(IntKi), PARAMETER :: M27N2MKye = 6473 - INTEGER(IntKi), PARAMETER :: M27N3MKye = 6474 - INTEGER(IntKi), PARAMETER :: M27N4MKye = 6475 - INTEGER(IntKi), PARAMETER :: M27N5MKye = 6476 - INTEGER(IntKi), PARAMETER :: M27N6MKye = 6477 - INTEGER(IntKi), PARAMETER :: M27N7MKye = 6478 - INTEGER(IntKi), PARAMETER :: M27N8MKye = 6479 - INTEGER(IntKi), PARAMETER :: M27N9MKye = 6480 - INTEGER(IntKi), PARAMETER :: M28N1MKye = 6481 - INTEGER(IntKi), PARAMETER :: M28N2MKye = 6482 - INTEGER(IntKi), PARAMETER :: M28N3MKye = 6483 - INTEGER(IntKi), PARAMETER :: M28N4MKye = 6484 - INTEGER(IntKi), PARAMETER :: M28N5MKye = 6485 - INTEGER(IntKi), PARAMETER :: M28N6MKye = 6486 - INTEGER(IntKi), PARAMETER :: M28N7MKye = 6487 - INTEGER(IntKi), PARAMETER :: M28N8MKye = 6488 - INTEGER(IntKi), PARAMETER :: M28N9MKye = 6489 - INTEGER(IntKi), PARAMETER :: M29N1MKye = 6490 - INTEGER(IntKi), PARAMETER :: M29N2MKye = 6491 - INTEGER(IntKi), PARAMETER :: M29N3MKye = 6492 - INTEGER(IntKi), PARAMETER :: M29N4MKye = 6493 - INTEGER(IntKi), PARAMETER :: M29N5MKye = 6494 - INTEGER(IntKi), PARAMETER :: M29N6MKye = 6495 - INTEGER(IntKi), PARAMETER :: M29N7MKye = 6496 - INTEGER(IntKi), PARAMETER :: M29N8MKye = 6497 - INTEGER(IntKi), PARAMETER :: M29N9MKye = 6498 - INTEGER(IntKi), PARAMETER :: M30N1MKye = 6499 - INTEGER(IntKi), PARAMETER :: M30N2MKye = 6500 - INTEGER(IntKi), PARAMETER :: M30N3MKye = 6501 - INTEGER(IntKi), PARAMETER :: M30N4MKye = 6502 - INTEGER(IntKi), PARAMETER :: M30N5MKye = 6503 - INTEGER(IntKi), PARAMETER :: M30N6MKye = 6504 - INTEGER(IntKi), PARAMETER :: M30N7MKye = 6505 - INTEGER(IntKi), PARAMETER :: M30N8MKye = 6506 - INTEGER(IntKi), PARAMETER :: M30N9MKye = 6507 - INTEGER(IntKi), PARAMETER :: M31N1MKye = 6508 - INTEGER(IntKi), PARAMETER :: M31N2MKye = 6509 - INTEGER(IntKi), PARAMETER :: M31N3MKye = 6510 - INTEGER(IntKi), PARAMETER :: M31N4MKye = 6511 - INTEGER(IntKi), PARAMETER :: M31N5MKye = 6512 - INTEGER(IntKi), PARAMETER :: M31N6MKye = 6513 - INTEGER(IntKi), PARAMETER :: M31N7MKye = 6514 - INTEGER(IntKi), PARAMETER :: M31N8MKye = 6515 - INTEGER(IntKi), PARAMETER :: M31N9MKye = 6516 - INTEGER(IntKi), PARAMETER :: M32N1MKye = 6517 - INTEGER(IntKi), PARAMETER :: M32N2MKye = 6518 - INTEGER(IntKi), PARAMETER :: M32N3MKye = 6519 - INTEGER(IntKi), PARAMETER :: M32N4MKye = 6520 - INTEGER(IntKi), PARAMETER :: M32N5MKye = 6521 - INTEGER(IntKi), PARAMETER :: M32N6MKye = 6522 - INTEGER(IntKi), PARAMETER :: M32N7MKye = 6523 - INTEGER(IntKi), PARAMETER :: M32N8MKye = 6524 - INTEGER(IntKi), PARAMETER :: M32N9MKye = 6525 - INTEGER(IntKi), PARAMETER :: M33N1MKye = 6526 - INTEGER(IntKi), PARAMETER :: M33N2MKye = 6527 - INTEGER(IntKi), PARAMETER :: M33N3MKye = 6528 - INTEGER(IntKi), PARAMETER :: M33N4MKye = 6529 - INTEGER(IntKi), PARAMETER :: M33N5MKye = 6530 - INTEGER(IntKi), PARAMETER :: M33N6MKye = 6531 - INTEGER(IntKi), PARAMETER :: M33N7MKye = 6532 - INTEGER(IntKi), PARAMETER :: M33N8MKye = 6533 - INTEGER(IntKi), PARAMETER :: M33N9MKye = 6534 - INTEGER(IntKi), PARAMETER :: M34N1MKye = 6535 - INTEGER(IntKi), PARAMETER :: M34N2MKye = 6536 - INTEGER(IntKi), PARAMETER :: M34N3MKye = 6537 - INTEGER(IntKi), PARAMETER :: M34N4MKye = 6538 - INTEGER(IntKi), PARAMETER :: M34N5MKye = 6539 - INTEGER(IntKi), PARAMETER :: M34N6MKye = 6540 - INTEGER(IntKi), PARAMETER :: M34N7MKye = 6541 - INTEGER(IntKi), PARAMETER :: M34N8MKye = 6542 - INTEGER(IntKi), PARAMETER :: M34N9MKye = 6543 - INTEGER(IntKi), PARAMETER :: M35N1MKye = 6544 - INTEGER(IntKi), PARAMETER :: M35N2MKye = 6545 - INTEGER(IntKi), PARAMETER :: M35N3MKye = 6546 - INTEGER(IntKi), PARAMETER :: M35N4MKye = 6547 - INTEGER(IntKi), PARAMETER :: M35N5MKye = 6548 - INTEGER(IntKi), PARAMETER :: M35N6MKye = 6549 - INTEGER(IntKi), PARAMETER :: M35N7MKye = 6550 - INTEGER(IntKi), PARAMETER :: M35N8MKye = 6551 - INTEGER(IntKi), PARAMETER :: M35N9MKye = 6552 - INTEGER(IntKi), PARAMETER :: M36N1MKye = 6553 - INTEGER(IntKi), PARAMETER :: M36N2MKye = 6554 - INTEGER(IntKi), PARAMETER :: M36N3MKye = 6555 - INTEGER(IntKi), PARAMETER :: M36N4MKye = 6556 - INTEGER(IntKi), PARAMETER :: M36N5MKye = 6557 - INTEGER(IntKi), PARAMETER :: M36N6MKye = 6558 - INTEGER(IntKi), PARAMETER :: M36N7MKye = 6559 - INTEGER(IntKi), PARAMETER :: M36N8MKye = 6560 - INTEGER(IntKi), PARAMETER :: M36N9MKye = 6561 - INTEGER(IntKi), PARAMETER :: M37N1MKye = 6562 - INTEGER(IntKi), PARAMETER :: M37N2MKye = 6563 - INTEGER(IntKi), PARAMETER :: M37N3MKye = 6564 - INTEGER(IntKi), PARAMETER :: M37N4MKye = 6565 - INTEGER(IntKi), PARAMETER :: M37N5MKye = 6566 - INTEGER(IntKi), PARAMETER :: M37N6MKye = 6567 - INTEGER(IntKi), PARAMETER :: M37N7MKye = 6568 - INTEGER(IntKi), PARAMETER :: M37N8MKye = 6569 - INTEGER(IntKi), PARAMETER :: M37N9MKye = 6570 - INTEGER(IntKi), PARAMETER :: M38N1MKye = 6571 - INTEGER(IntKi), PARAMETER :: M38N2MKye = 6572 - INTEGER(IntKi), PARAMETER :: M38N3MKye = 6573 - INTEGER(IntKi), PARAMETER :: M38N4MKye = 6574 - INTEGER(IntKi), PARAMETER :: M38N5MKye = 6575 - INTEGER(IntKi), PARAMETER :: M38N6MKye = 6576 - INTEGER(IntKi), PARAMETER :: M38N7MKye = 6577 - INTEGER(IntKi), PARAMETER :: M38N8MKye = 6578 - INTEGER(IntKi), PARAMETER :: M38N9MKye = 6579 - INTEGER(IntKi), PARAMETER :: M39N1MKye = 6580 - INTEGER(IntKi), PARAMETER :: M39N2MKye = 6581 - INTEGER(IntKi), PARAMETER :: M39N3MKye = 6582 - INTEGER(IntKi), PARAMETER :: M39N4MKye = 6583 - INTEGER(IntKi), PARAMETER :: M39N5MKye = 6584 - INTEGER(IntKi), PARAMETER :: M39N6MKye = 6585 - INTEGER(IntKi), PARAMETER :: M39N7MKye = 6586 - INTEGER(IntKi), PARAMETER :: M39N8MKye = 6587 - INTEGER(IntKi), PARAMETER :: M39N9MKye = 6588 - INTEGER(IntKi), PARAMETER :: M40N1MKye = 6589 - INTEGER(IntKi), PARAMETER :: M40N2MKye = 6590 - INTEGER(IntKi), PARAMETER :: M40N3MKye = 6591 - INTEGER(IntKi), PARAMETER :: M40N4MKye = 6592 - INTEGER(IntKi), PARAMETER :: M40N5MKye = 6593 - INTEGER(IntKi), PARAMETER :: M40N6MKye = 6594 - INTEGER(IntKi), PARAMETER :: M40N7MKye = 6595 - INTEGER(IntKi), PARAMETER :: M40N8MKye = 6596 - INTEGER(IntKi), PARAMETER :: M40N9MKye = 6597 - INTEGER(IntKi), PARAMETER :: M41N1MKye = 6598 - INTEGER(IntKi), PARAMETER :: M41N2MKye = 6599 - INTEGER(IntKi), PARAMETER :: M41N3MKye = 6600 - INTEGER(IntKi), PARAMETER :: M41N4MKye = 6601 - INTEGER(IntKi), PARAMETER :: M41N5MKye = 6602 - INTEGER(IntKi), PARAMETER :: M41N6MKye = 6603 - INTEGER(IntKi), PARAMETER :: M41N7MKye = 6604 - INTEGER(IntKi), PARAMETER :: M41N8MKye = 6605 - INTEGER(IntKi), PARAMETER :: M41N9MKye = 6606 - INTEGER(IntKi), PARAMETER :: M42N1MKye = 6607 - INTEGER(IntKi), PARAMETER :: M42N2MKye = 6608 - INTEGER(IntKi), PARAMETER :: M42N3MKye = 6609 - INTEGER(IntKi), PARAMETER :: M42N4MKye = 6610 - INTEGER(IntKi), PARAMETER :: M42N5MKye = 6611 - INTEGER(IntKi), PARAMETER :: M42N6MKye = 6612 - INTEGER(IntKi), PARAMETER :: M42N7MKye = 6613 - INTEGER(IntKi), PARAMETER :: M42N8MKye = 6614 - INTEGER(IntKi), PARAMETER :: M42N9MKye = 6615 - INTEGER(IntKi), PARAMETER :: M43N1MKye = 6616 - INTEGER(IntKi), PARAMETER :: M43N2MKye = 6617 - INTEGER(IntKi), PARAMETER :: M43N3MKye = 6618 - INTEGER(IntKi), PARAMETER :: M43N4MKye = 6619 - INTEGER(IntKi), PARAMETER :: M43N5MKye = 6620 - INTEGER(IntKi), PARAMETER :: M43N6MKye = 6621 - INTEGER(IntKi), PARAMETER :: M43N7MKye = 6622 - INTEGER(IntKi), PARAMETER :: M43N8MKye = 6623 - INTEGER(IntKi), PARAMETER :: M43N9MKye = 6624 - INTEGER(IntKi), PARAMETER :: M44N1MKye = 6625 - INTEGER(IntKi), PARAMETER :: M44N2MKye = 6626 - INTEGER(IntKi), PARAMETER :: M44N3MKye = 6627 - INTEGER(IntKi), PARAMETER :: M44N4MKye = 6628 - INTEGER(IntKi), PARAMETER :: M44N5MKye = 6629 - INTEGER(IntKi), PARAMETER :: M44N6MKye = 6630 - INTEGER(IntKi), PARAMETER :: M44N7MKye = 6631 - INTEGER(IntKi), PARAMETER :: M44N8MKye = 6632 - INTEGER(IntKi), PARAMETER :: M44N9MKye = 6633 - INTEGER(IntKi), PARAMETER :: M45N1MKye = 6634 - INTEGER(IntKi), PARAMETER :: M45N2MKye = 6635 - INTEGER(IntKi), PARAMETER :: M45N3MKye = 6636 - INTEGER(IntKi), PARAMETER :: M45N4MKye = 6637 - INTEGER(IntKi), PARAMETER :: M45N5MKye = 6638 - INTEGER(IntKi), PARAMETER :: M45N6MKye = 6639 - INTEGER(IntKi), PARAMETER :: M45N7MKye = 6640 - INTEGER(IntKi), PARAMETER :: M45N8MKye = 6641 - INTEGER(IntKi), PARAMETER :: M45N9MKye = 6642 - INTEGER(IntKi), PARAMETER :: M46N1MKye = 6643 - INTEGER(IntKi), PARAMETER :: M46N2MKye = 6644 - INTEGER(IntKi), PARAMETER :: M46N3MKye = 6645 - INTEGER(IntKi), PARAMETER :: M46N4MKye = 6646 - INTEGER(IntKi), PARAMETER :: M46N5MKye = 6647 - INTEGER(IntKi), PARAMETER :: M46N6MKye = 6648 - INTEGER(IntKi), PARAMETER :: M46N7MKye = 6649 - INTEGER(IntKi), PARAMETER :: M46N8MKye = 6650 - INTEGER(IntKi), PARAMETER :: M46N9MKye = 6651 - INTEGER(IntKi), PARAMETER :: M47N1MKye = 6652 - INTEGER(IntKi), PARAMETER :: M47N2MKye = 6653 - INTEGER(IntKi), PARAMETER :: M47N3MKye = 6654 - INTEGER(IntKi), PARAMETER :: M47N4MKye = 6655 - INTEGER(IntKi), PARAMETER :: M47N5MKye = 6656 - INTEGER(IntKi), PARAMETER :: M47N6MKye = 6657 - INTEGER(IntKi), PARAMETER :: M47N7MKye = 6658 - INTEGER(IntKi), PARAMETER :: M47N8MKye = 6659 - INTEGER(IntKi), PARAMETER :: M47N9MKye = 6660 - INTEGER(IntKi), PARAMETER :: M48N1MKye = 6661 - INTEGER(IntKi), PARAMETER :: M48N2MKye = 6662 - INTEGER(IntKi), PARAMETER :: M48N3MKye = 6663 - INTEGER(IntKi), PARAMETER :: M48N4MKye = 6664 - INTEGER(IntKi), PARAMETER :: M48N5MKye = 6665 - INTEGER(IntKi), PARAMETER :: M48N6MKye = 6666 - INTEGER(IntKi), PARAMETER :: M48N7MKye = 6667 - INTEGER(IntKi), PARAMETER :: M48N8MKye = 6668 - INTEGER(IntKi), PARAMETER :: M48N9MKye = 6669 - INTEGER(IntKi), PARAMETER :: M49N1MKye = 6670 - INTEGER(IntKi), PARAMETER :: M49N2MKye = 6671 - INTEGER(IntKi), PARAMETER :: M49N3MKye = 6672 - INTEGER(IntKi), PARAMETER :: M49N4MKye = 6673 - INTEGER(IntKi), PARAMETER :: M49N5MKye = 6674 - INTEGER(IntKi), PARAMETER :: M49N6MKye = 6675 - INTEGER(IntKi), PARAMETER :: M49N7MKye = 6676 - INTEGER(IntKi), PARAMETER :: M49N8MKye = 6677 - INTEGER(IntKi), PARAMETER :: M49N9MKye = 6678 - INTEGER(IntKi), PARAMETER :: M50N1MKye = 6679 - INTEGER(IntKi), PARAMETER :: M50N2MKye = 6680 - INTEGER(IntKi), PARAMETER :: M50N3MKye = 6681 - INTEGER(IntKi), PARAMETER :: M50N4MKye = 6682 - INTEGER(IntKi), PARAMETER :: M50N5MKye = 6683 - INTEGER(IntKi), PARAMETER :: M50N6MKye = 6684 - INTEGER(IntKi), PARAMETER :: M50N7MKye = 6685 - INTEGER(IntKi), PARAMETER :: M50N8MKye = 6686 - INTEGER(IntKi), PARAMETER :: M50N9MKye = 6687 - INTEGER(IntKi), PARAMETER :: M51N1MKye = 6688 - INTEGER(IntKi), PARAMETER :: M51N2MKye = 6689 - INTEGER(IntKi), PARAMETER :: M51N3MKye = 6690 - INTEGER(IntKi), PARAMETER :: M51N4MKye = 6691 - INTEGER(IntKi), PARAMETER :: M51N5MKye = 6692 - INTEGER(IntKi), PARAMETER :: M51N6MKye = 6693 - INTEGER(IntKi), PARAMETER :: M51N7MKye = 6694 - INTEGER(IntKi), PARAMETER :: M51N8MKye = 6695 - INTEGER(IntKi), PARAMETER :: M51N9MKye = 6696 - INTEGER(IntKi), PARAMETER :: M52N1MKye = 6697 - INTEGER(IntKi), PARAMETER :: M52N2MKye = 6698 - INTEGER(IntKi), PARAMETER :: M52N3MKye = 6699 - INTEGER(IntKi), PARAMETER :: M52N4MKye = 6700 - INTEGER(IntKi), PARAMETER :: M52N5MKye = 6701 - INTEGER(IntKi), PARAMETER :: M52N6MKye = 6702 - INTEGER(IntKi), PARAMETER :: M52N7MKye = 6703 - INTEGER(IntKi), PARAMETER :: M52N8MKye = 6704 - INTEGER(IntKi), PARAMETER :: M52N9MKye = 6705 - INTEGER(IntKi), PARAMETER :: M53N1MKye = 6706 - INTEGER(IntKi), PARAMETER :: M53N2MKye = 6707 - INTEGER(IntKi), PARAMETER :: M53N3MKye = 6708 - INTEGER(IntKi), PARAMETER :: M53N4MKye = 6709 - INTEGER(IntKi), PARAMETER :: M53N5MKye = 6710 - INTEGER(IntKi), PARAMETER :: M53N6MKye = 6711 - INTEGER(IntKi), PARAMETER :: M53N7MKye = 6712 - INTEGER(IntKi), PARAMETER :: M53N8MKye = 6713 - INTEGER(IntKi), PARAMETER :: M53N9MKye = 6714 - INTEGER(IntKi), PARAMETER :: M54N1MKye = 6715 - INTEGER(IntKi), PARAMETER :: M54N2MKye = 6716 - INTEGER(IntKi), PARAMETER :: M54N3MKye = 6717 - INTEGER(IntKi), PARAMETER :: M54N4MKye = 6718 - INTEGER(IntKi), PARAMETER :: M54N5MKye = 6719 - INTEGER(IntKi), PARAMETER :: M54N6MKye = 6720 - INTEGER(IntKi), PARAMETER :: M54N7MKye = 6721 - INTEGER(IntKi), PARAMETER :: M54N8MKye = 6722 - INTEGER(IntKi), PARAMETER :: M54N9MKye = 6723 - INTEGER(IntKi), PARAMETER :: M55N1MKye = 6724 - INTEGER(IntKi), PARAMETER :: M55N2MKye = 6725 - INTEGER(IntKi), PARAMETER :: M55N3MKye = 6726 - INTEGER(IntKi), PARAMETER :: M55N4MKye = 6727 - INTEGER(IntKi), PARAMETER :: M55N5MKye = 6728 - INTEGER(IntKi), PARAMETER :: M55N6MKye = 6729 - INTEGER(IntKi), PARAMETER :: M55N7MKye = 6730 - INTEGER(IntKi), PARAMETER :: M55N8MKye = 6731 - INTEGER(IntKi), PARAMETER :: M55N9MKye = 6732 - INTEGER(IntKi), PARAMETER :: M56N1MKye = 6733 - INTEGER(IntKi), PARAMETER :: M56N2MKye = 6734 - INTEGER(IntKi), PARAMETER :: M56N3MKye = 6735 - INTEGER(IntKi), PARAMETER :: M56N4MKye = 6736 - INTEGER(IntKi), PARAMETER :: M56N5MKye = 6737 - INTEGER(IntKi), PARAMETER :: M56N6MKye = 6738 - INTEGER(IntKi), PARAMETER :: M56N7MKye = 6739 - INTEGER(IntKi), PARAMETER :: M56N8MKye = 6740 - INTEGER(IntKi), PARAMETER :: M56N9MKye = 6741 - INTEGER(IntKi), PARAMETER :: M57N1MKye = 6742 - INTEGER(IntKi), PARAMETER :: M57N2MKye = 6743 - INTEGER(IntKi), PARAMETER :: M57N3MKye = 6744 - INTEGER(IntKi), PARAMETER :: M57N4MKye = 6745 - INTEGER(IntKi), PARAMETER :: M57N5MKye = 6746 - INTEGER(IntKi), PARAMETER :: M57N6MKye = 6747 - INTEGER(IntKi), PARAMETER :: M57N7MKye = 6748 - INTEGER(IntKi), PARAMETER :: M57N8MKye = 6749 - INTEGER(IntKi), PARAMETER :: M57N9MKye = 6750 - INTEGER(IntKi), PARAMETER :: M58N1MKye = 6751 - INTEGER(IntKi), PARAMETER :: M58N2MKye = 6752 - INTEGER(IntKi), PARAMETER :: M58N3MKye = 6753 - INTEGER(IntKi), PARAMETER :: M58N4MKye = 6754 - INTEGER(IntKi), PARAMETER :: M58N5MKye = 6755 - INTEGER(IntKi), PARAMETER :: M58N6MKye = 6756 - INTEGER(IntKi), PARAMETER :: M58N7MKye = 6757 - INTEGER(IntKi), PARAMETER :: M58N8MKye = 6758 - INTEGER(IntKi), PARAMETER :: M58N9MKye = 6759 - INTEGER(IntKi), PARAMETER :: M59N1MKye = 6760 - INTEGER(IntKi), PARAMETER :: M59N2MKye = 6761 - INTEGER(IntKi), PARAMETER :: M59N3MKye = 6762 - INTEGER(IntKi), PARAMETER :: M59N4MKye = 6763 - INTEGER(IntKi), PARAMETER :: M59N5MKye = 6764 - INTEGER(IntKi), PARAMETER :: M59N6MKye = 6765 - INTEGER(IntKi), PARAMETER :: M59N7MKye = 6766 - INTEGER(IntKi), PARAMETER :: M59N8MKye = 6767 - INTEGER(IntKi), PARAMETER :: M59N9MKye = 6768 - INTEGER(IntKi), PARAMETER :: M60N1MKye = 6769 - INTEGER(IntKi), PARAMETER :: M60N2MKye = 6770 - INTEGER(IntKi), PARAMETER :: M60N3MKye = 6771 - INTEGER(IntKi), PARAMETER :: M60N4MKye = 6772 - INTEGER(IntKi), PARAMETER :: M60N5MKye = 6773 - INTEGER(IntKi), PARAMETER :: M60N6MKye = 6774 - INTEGER(IntKi), PARAMETER :: M60N7MKye = 6775 - INTEGER(IntKi), PARAMETER :: M60N8MKye = 6776 - INTEGER(IntKi), PARAMETER :: M60N9MKye = 6777 - INTEGER(IntKi), PARAMETER :: M61N1MKye = 6778 - INTEGER(IntKi), PARAMETER :: M61N2MKye = 6779 - INTEGER(IntKi), PARAMETER :: M61N3MKye = 6780 - INTEGER(IntKi), PARAMETER :: M61N4MKye = 6781 - INTEGER(IntKi), PARAMETER :: M61N5MKye = 6782 - INTEGER(IntKi), PARAMETER :: M61N6MKye = 6783 - INTEGER(IntKi), PARAMETER :: M61N7MKye = 6784 - INTEGER(IntKi), PARAMETER :: M61N8MKye = 6785 - INTEGER(IntKi), PARAMETER :: M61N9MKye = 6786 - INTEGER(IntKi), PARAMETER :: M62N1MKye = 6787 - INTEGER(IntKi), PARAMETER :: M62N2MKye = 6788 - INTEGER(IntKi), PARAMETER :: M62N3MKye = 6789 - INTEGER(IntKi), PARAMETER :: M62N4MKye = 6790 - INTEGER(IntKi), PARAMETER :: M62N5MKye = 6791 - INTEGER(IntKi), PARAMETER :: M62N6MKye = 6792 - INTEGER(IntKi), PARAMETER :: M62N7MKye = 6793 - INTEGER(IntKi), PARAMETER :: M62N8MKye = 6794 - INTEGER(IntKi), PARAMETER :: M62N9MKye = 6795 - INTEGER(IntKi), PARAMETER :: M63N1MKye = 6796 - INTEGER(IntKi), PARAMETER :: M63N2MKye = 6797 - INTEGER(IntKi), PARAMETER :: M63N3MKye = 6798 - INTEGER(IntKi), PARAMETER :: M63N4MKye = 6799 - INTEGER(IntKi), PARAMETER :: M63N5MKye = 6800 - INTEGER(IntKi), PARAMETER :: M63N6MKye = 6801 - INTEGER(IntKi), PARAMETER :: M63N7MKye = 6802 - INTEGER(IntKi), PARAMETER :: M63N8MKye = 6803 - INTEGER(IntKi), PARAMETER :: M63N9MKye = 6804 - INTEGER(IntKi), PARAMETER :: M64N1MKye = 6805 - INTEGER(IntKi), PARAMETER :: M64N2MKye = 6806 - INTEGER(IntKi), PARAMETER :: M64N3MKye = 6807 - INTEGER(IntKi), PARAMETER :: M64N4MKye = 6808 - INTEGER(IntKi), PARAMETER :: M64N5MKye = 6809 - INTEGER(IntKi), PARAMETER :: M64N6MKye = 6810 - INTEGER(IntKi), PARAMETER :: M64N7MKye = 6811 - INTEGER(IntKi), PARAMETER :: M64N8MKye = 6812 - INTEGER(IntKi), PARAMETER :: M64N9MKye = 6813 - INTEGER(IntKi), PARAMETER :: M65N1MKye = 6814 - INTEGER(IntKi), PARAMETER :: M65N2MKye = 6815 - INTEGER(IntKi), PARAMETER :: M65N3MKye = 6816 - INTEGER(IntKi), PARAMETER :: M65N4MKye = 6817 - INTEGER(IntKi), PARAMETER :: M65N5MKye = 6818 - INTEGER(IntKi), PARAMETER :: M65N6MKye = 6819 - INTEGER(IntKi), PARAMETER :: M65N7MKye = 6820 - INTEGER(IntKi), PARAMETER :: M65N8MKye = 6821 - INTEGER(IntKi), PARAMETER :: M65N9MKye = 6822 - INTEGER(IntKi), PARAMETER :: M66N1MKye = 6823 - INTEGER(IntKi), PARAMETER :: M66N2MKye = 6824 - INTEGER(IntKi), PARAMETER :: M66N3MKye = 6825 - INTEGER(IntKi), PARAMETER :: M66N4MKye = 6826 - INTEGER(IntKi), PARAMETER :: M66N5MKye = 6827 - INTEGER(IntKi), PARAMETER :: M66N6MKye = 6828 - INTEGER(IntKi), PARAMETER :: M66N7MKye = 6829 - INTEGER(IntKi), PARAMETER :: M66N8MKye = 6830 - INTEGER(IntKi), PARAMETER :: M66N9MKye = 6831 - INTEGER(IntKi), PARAMETER :: M67N1MKye = 6832 - INTEGER(IntKi), PARAMETER :: M67N2MKye = 6833 - INTEGER(IntKi), PARAMETER :: M67N3MKye = 6834 - INTEGER(IntKi), PARAMETER :: M67N4MKye = 6835 - INTEGER(IntKi), PARAMETER :: M67N5MKye = 6836 - INTEGER(IntKi), PARAMETER :: M67N6MKye = 6837 - INTEGER(IntKi), PARAMETER :: M67N7MKye = 6838 - INTEGER(IntKi), PARAMETER :: M67N8MKye = 6839 - INTEGER(IntKi), PARAMETER :: M67N9MKye = 6840 - INTEGER(IntKi), PARAMETER :: M68N1MKye = 6841 - INTEGER(IntKi), PARAMETER :: M68N2MKye = 6842 - INTEGER(IntKi), PARAMETER :: M68N3MKye = 6843 - INTEGER(IntKi), PARAMETER :: M68N4MKye = 6844 - INTEGER(IntKi), PARAMETER :: M68N5MKye = 6845 - INTEGER(IntKi), PARAMETER :: M68N6MKye = 6846 - INTEGER(IntKi), PARAMETER :: M68N7MKye = 6847 - INTEGER(IntKi), PARAMETER :: M68N8MKye = 6848 - INTEGER(IntKi), PARAMETER :: M68N9MKye = 6849 - INTEGER(IntKi), PARAMETER :: M69N1MKye = 6850 - INTEGER(IntKi), PARAMETER :: M69N2MKye = 6851 - INTEGER(IntKi), PARAMETER :: M69N3MKye = 6852 - INTEGER(IntKi), PARAMETER :: M69N4MKye = 6853 - INTEGER(IntKi), PARAMETER :: M69N5MKye = 6854 - INTEGER(IntKi), PARAMETER :: M69N6MKye = 6855 - INTEGER(IntKi), PARAMETER :: M69N7MKye = 6856 - INTEGER(IntKi), PARAMETER :: M69N8MKye = 6857 - INTEGER(IntKi), PARAMETER :: M69N9MKye = 6858 - INTEGER(IntKi), PARAMETER :: M70N1MKye = 6859 - INTEGER(IntKi), PARAMETER :: M70N2MKye = 6860 - INTEGER(IntKi), PARAMETER :: M70N3MKye = 6861 - INTEGER(IntKi), PARAMETER :: M70N4MKye = 6862 - INTEGER(IntKi), PARAMETER :: M70N5MKye = 6863 - INTEGER(IntKi), PARAMETER :: M70N6MKye = 6864 - INTEGER(IntKi), PARAMETER :: M70N7MKye = 6865 - INTEGER(IntKi), PARAMETER :: M70N8MKye = 6866 - INTEGER(IntKi), PARAMETER :: M70N9MKye = 6867 - INTEGER(IntKi), PARAMETER :: M71N1MKye = 6868 - INTEGER(IntKi), PARAMETER :: M71N2MKye = 6869 - INTEGER(IntKi), PARAMETER :: M71N3MKye = 6870 - INTEGER(IntKi), PARAMETER :: M71N4MKye = 6871 - INTEGER(IntKi), PARAMETER :: M71N5MKye = 6872 - INTEGER(IntKi), PARAMETER :: M71N6MKye = 6873 - INTEGER(IntKi), PARAMETER :: M71N7MKye = 6874 - INTEGER(IntKi), PARAMETER :: M71N8MKye = 6875 - INTEGER(IntKi), PARAMETER :: M71N9MKye = 6876 - INTEGER(IntKi), PARAMETER :: M72N1MKye = 6877 - INTEGER(IntKi), PARAMETER :: M72N2MKye = 6878 - INTEGER(IntKi), PARAMETER :: M72N3MKye = 6879 - INTEGER(IntKi), PARAMETER :: M72N4MKye = 6880 - INTEGER(IntKi), PARAMETER :: M72N5MKye = 6881 - INTEGER(IntKi), PARAMETER :: M72N6MKye = 6882 - INTEGER(IntKi), PARAMETER :: M72N7MKye = 6883 - INTEGER(IntKi), PARAMETER :: M72N8MKye = 6884 - INTEGER(IntKi), PARAMETER :: M72N9MKye = 6885 - INTEGER(IntKi), PARAMETER :: M73N1MKye = 6886 - INTEGER(IntKi), PARAMETER :: M73N2MKye = 6887 - INTEGER(IntKi), PARAMETER :: M73N3MKye = 6888 - INTEGER(IntKi), PARAMETER :: M73N4MKye = 6889 - INTEGER(IntKi), PARAMETER :: M73N5MKye = 6890 - INTEGER(IntKi), PARAMETER :: M73N6MKye = 6891 - INTEGER(IntKi), PARAMETER :: M73N7MKye = 6892 - INTEGER(IntKi), PARAMETER :: M73N8MKye = 6893 - INTEGER(IntKi), PARAMETER :: M73N9MKye = 6894 - INTEGER(IntKi), PARAMETER :: M74N1MKye = 6895 - INTEGER(IntKi), PARAMETER :: M74N2MKye = 6896 - INTEGER(IntKi), PARAMETER :: M74N3MKye = 6897 - INTEGER(IntKi), PARAMETER :: M74N4MKye = 6898 - INTEGER(IntKi), PARAMETER :: M74N5MKye = 6899 - INTEGER(IntKi), PARAMETER :: M74N6MKye = 6900 - INTEGER(IntKi), PARAMETER :: M74N7MKye = 6901 - INTEGER(IntKi), PARAMETER :: M74N8MKye = 6902 - INTEGER(IntKi), PARAMETER :: M74N9MKye = 6903 - INTEGER(IntKi), PARAMETER :: M75N1MKye = 6904 - INTEGER(IntKi), PARAMETER :: M75N2MKye = 6905 - INTEGER(IntKi), PARAMETER :: M75N3MKye = 6906 - INTEGER(IntKi), PARAMETER :: M75N4MKye = 6907 - INTEGER(IntKi), PARAMETER :: M75N5MKye = 6908 - INTEGER(IntKi), PARAMETER :: M75N6MKye = 6909 - INTEGER(IntKi), PARAMETER :: M75N7MKye = 6910 - INTEGER(IntKi), PARAMETER :: M75N8MKye = 6911 - INTEGER(IntKi), PARAMETER :: M75N9MKye = 6912 - INTEGER(IntKi), PARAMETER :: M76N1MKye = 6913 - INTEGER(IntKi), PARAMETER :: M76N2MKye = 6914 - INTEGER(IntKi), PARAMETER :: M76N3MKye = 6915 - INTEGER(IntKi), PARAMETER :: M76N4MKye = 6916 - INTEGER(IntKi), PARAMETER :: M76N5MKye = 6917 - INTEGER(IntKi), PARAMETER :: M76N6MKye = 6918 - INTEGER(IntKi), PARAMETER :: M76N7MKye = 6919 - INTEGER(IntKi), PARAMETER :: M76N8MKye = 6920 - INTEGER(IntKi), PARAMETER :: M76N9MKye = 6921 - INTEGER(IntKi), PARAMETER :: M77N1MKye = 6922 - INTEGER(IntKi), PARAMETER :: M77N2MKye = 6923 - INTEGER(IntKi), PARAMETER :: M77N3MKye = 6924 - INTEGER(IntKi), PARAMETER :: M77N4MKye = 6925 - INTEGER(IntKi), PARAMETER :: M77N5MKye = 6926 - INTEGER(IntKi), PARAMETER :: M77N6MKye = 6927 - INTEGER(IntKi), PARAMETER :: M77N7MKye = 6928 - INTEGER(IntKi), PARAMETER :: M77N8MKye = 6929 - INTEGER(IntKi), PARAMETER :: M77N9MKye = 6930 - INTEGER(IntKi), PARAMETER :: M78N1MKye = 6931 - INTEGER(IntKi), PARAMETER :: M78N2MKye = 6932 - INTEGER(IntKi), PARAMETER :: M78N3MKye = 6933 - INTEGER(IntKi), PARAMETER :: M78N4MKye = 6934 - INTEGER(IntKi), PARAMETER :: M78N5MKye = 6935 - INTEGER(IntKi), PARAMETER :: M78N6MKye = 6936 - INTEGER(IntKi), PARAMETER :: M78N7MKye = 6937 - INTEGER(IntKi), PARAMETER :: M78N8MKye = 6938 - INTEGER(IntKi), PARAMETER :: M78N9MKye = 6939 - INTEGER(IntKi), PARAMETER :: M79N1MKye = 6940 - INTEGER(IntKi), PARAMETER :: M79N2MKye = 6941 - INTEGER(IntKi), PARAMETER :: M79N3MKye = 6942 - INTEGER(IntKi), PARAMETER :: M79N4MKye = 6943 - INTEGER(IntKi), PARAMETER :: M79N5MKye = 6944 - INTEGER(IntKi), PARAMETER :: M79N6MKye = 6945 - INTEGER(IntKi), PARAMETER :: M79N7MKye = 6946 - INTEGER(IntKi), PARAMETER :: M79N8MKye = 6947 - INTEGER(IntKi), PARAMETER :: M79N9MKye = 6948 - INTEGER(IntKi), PARAMETER :: M80N1MKye = 6949 - INTEGER(IntKi), PARAMETER :: M80N2MKye = 6950 - INTEGER(IntKi), PARAMETER :: M80N3MKye = 6951 - INTEGER(IntKi), PARAMETER :: M80N4MKye = 6952 - INTEGER(IntKi), PARAMETER :: M80N5MKye = 6953 - INTEGER(IntKi), PARAMETER :: M80N6MKye = 6954 - INTEGER(IntKi), PARAMETER :: M80N7MKye = 6955 - INTEGER(IntKi), PARAMETER :: M80N8MKye = 6956 - INTEGER(IntKi), PARAMETER :: M80N9MKye = 6957 - INTEGER(IntKi), PARAMETER :: M81N1MKye = 6958 - INTEGER(IntKi), PARAMETER :: M81N2MKye = 6959 - INTEGER(IntKi), PARAMETER :: M81N3MKye = 6960 - INTEGER(IntKi), PARAMETER :: M81N4MKye = 6961 - INTEGER(IntKi), PARAMETER :: M81N5MKye = 6962 - INTEGER(IntKi), PARAMETER :: M81N6MKye = 6963 - INTEGER(IntKi), PARAMETER :: M81N7MKye = 6964 - INTEGER(IntKi), PARAMETER :: M81N8MKye = 6965 - INTEGER(IntKi), PARAMETER :: M81N9MKye = 6966 - INTEGER(IntKi), PARAMETER :: M82N1MKye = 6967 - INTEGER(IntKi), PARAMETER :: M82N2MKye = 6968 - INTEGER(IntKi), PARAMETER :: M82N3MKye = 6969 - INTEGER(IntKi), PARAMETER :: M82N4MKye = 6970 - INTEGER(IntKi), PARAMETER :: M82N5MKye = 6971 - INTEGER(IntKi), PARAMETER :: M82N6MKye = 6972 - INTEGER(IntKi), PARAMETER :: M82N7MKye = 6973 - INTEGER(IntKi), PARAMETER :: M82N8MKye = 6974 - INTEGER(IntKi), PARAMETER :: M82N9MKye = 6975 - INTEGER(IntKi), PARAMETER :: M83N1MKye = 6976 - INTEGER(IntKi), PARAMETER :: M83N2MKye = 6977 - INTEGER(IntKi), PARAMETER :: M83N3MKye = 6978 - INTEGER(IntKi), PARAMETER :: M83N4MKye = 6979 - INTEGER(IntKi), PARAMETER :: M83N5MKye = 6980 - INTEGER(IntKi), PARAMETER :: M83N6MKye = 6981 - INTEGER(IntKi), PARAMETER :: M83N7MKye = 6982 - INTEGER(IntKi), PARAMETER :: M83N8MKye = 6983 - INTEGER(IntKi), PARAMETER :: M83N9MKye = 6984 - INTEGER(IntKi), PARAMETER :: M84N1MKye = 6985 - INTEGER(IntKi), PARAMETER :: M84N2MKye = 6986 - INTEGER(IntKi), PARAMETER :: M84N3MKye = 6987 - INTEGER(IntKi), PARAMETER :: M84N4MKye = 6988 - INTEGER(IntKi), PARAMETER :: M84N5MKye = 6989 - INTEGER(IntKi), PARAMETER :: M84N6MKye = 6990 - INTEGER(IntKi), PARAMETER :: M84N7MKye = 6991 - INTEGER(IntKi), PARAMETER :: M84N8MKye = 6992 - INTEGER(IntKi), PARAMETER :: M84N9MKye = 6993 - INTEGER(IntKi), PARAMETER :: M85N1MKye = 6994 - INTEGER(IntKi), PARAMETER :: M85N2MKye = 6995 - INTEGER(IntKi), PARAMETER :: M85N3MKye = 6996 - INTEGER(IntKi), PARAMETER :: M85N4MKye = 6997 - INTEGER(IntKi), PARAMETER :: M85N5MKye = 6998 - INTEGER(IntKi), PARAMETER :: M85N6MKye = 6999 - INTEGER(IntKi), PARAMETER :: M85N7MKye = 7000 - INTEGER(IntKi), PARAMETER :: M85N8MKye = 7001 - INTEGER(IntKi), PARAMETER :: M85N9MKye = 7002 - INTEGER(IntKi), PARAMETER :: M86N1MKye = 7003 - INTEGER(IntKi), PARAMETER :: M86N2MKye = 7004 - INTEGER(IntKi), PARAMETER :: M86N3MKye = 7005 - INTEGER(IntKi), PARAMETER :: M86N4MKye = 7006 - INTEGER(IntKi), PARAMETER :: M86N5MKye = 7007 - INTEGER(IntKi), PARAMETER :: M86N6MKye = 7008 - INTEGER(IntKi), PARAMETER :: M86N7MKye = 7009 - INTEGER(IntKi), PARAMETER :: M86N8MKye = 7010 - INTEGER(IntKi), PARAMETER :: M86N9MKye = 7011 - INTEGER(IntKi), PARAMETER :: M87N1MKye = 7012 - INTEGER(IntKi), PARAMETER :: M87N2MKye = 7013 - INTEGER(IntKi), PARAMETER :: M87N3MKye = 7014 - INTEGER(IntKi), PARAMETER :: M87N4MKye = 7015 - INTEGER(IntKi), PARAMETER :: M87N5MKye = 7016 - INTEGER(IntKi), PARAMETER :: M87N6MKye = 7017 - INTEGER(IntKi), PARAMETER :: M87N7MKye = 7018 - INTEGER(IntKi), PARAMETER :: M87N8MKye = 7019 - INTEGER(IntKi), PARAMETER :: M87N9MKye = 7020 - INTEGER(IntKi), PARAMETER :: M88N1MKye = 7021 - INTEGER(IntKi), PARAMETER :: M88N2MKye = 7022 - INTEGER(IntKi), PARAMETER :: M88N3MKye = 7023 - INTEGER(IntKi), PARAMETER :: M88N4MKye = 7024 - INTEGER(IntKi), PARAMETER :: M88N5MKye = 7025 - INTEGER(IntKi), PARAMETER :: M88N6MKye = 7026 - INTEGER(IntKi), PARAMETER :: M88N7MKye = 7027 - INTEGER(IntKi), PARAMETER :: M88N8MKye = 7028 - INTEGER(IntKi), PARAMETER :: M88N9MKye = 7029 - INTEGER(IntKi), PARAMETER :: M89N1MKye = 7030 - INTEGER(IntKi), PARAMETER :: M89N2MKye = 7031 - INTEGER(IntKi), PARAMETER :: M89N3MKye = 7032 - INTEGER(IntKi), PARAMETER :: M89N4MKye = 7033 - INTEGER(IntKi), PARAMETER :: M89N5MKye = 7034 - INTEGER(IntKi), PARAMETER :: M89N6MKye = 7035 - INTEGER(IntKi), PARAMETER :: M89N7MKye = 7036 - INTEGER(IntKi), PARAMETER :: M89N8MKye = 7037 - INTEGER(IntKi), PARAMETER :: M89N9MKye = 7038 - INTEGER(IntKi), PARAMETER :: M90N1MKye = 7039 - INTEGER(IntKi), PARAMETER :: M90N2MKye = 7040 - INTEGER(IntKi), PARAMETER :: M90N3MKye = 7041 - INTEGER(IntKi), PARAMETER :: M90N4MKye = 7042 - INTEGER(IntKi), PARAMETER :: M90N5MKye = 7043 - INTEGER(IntKi), PARAMETER :: M90N6MKye = 7044 - INTEGER(IntKi), PARAMETER :: M90N7MKye = 7045 - INTEGER(IntKi), PARAMETER :: M90N8MKye = 7046 - INTEGER(IntKi), PARAMETER :: M90N9MKye = 7047 - INTEGER(IntKi), PARAMETER :: M91N1MKye = 7048 - INTEGER(IntKi), PARAMETER :: M91N2MKye = 7049 - INTEGER(IntKi), PARAMETER :: M91N3MKye = 7050 - INTEGER(IntKi), PARAMETER :: M91N4MKye = 7051 - INTEGER(IntKi), PARAMETER :: M91N5MKye = 7052 - INTEGER(IntKi), PARAMETER :: M91N6MKye = 7053 - INTEGER(IntKi), PARAMETER :: M91N7MKye = 7054 - INTEGER(IntKi), PARAMETER :: M91N8MKye = 7055 - INTEGER(IntKi), PARAMETER :: M91N9MKye = 7056 - INTEGER(IntKi), PARAMETER :: M92N1MKye = 7057 - INTEGER(IntKi), PARAMETER :: M92N2MKye = 7058 - INTEGER(IntKi), PARAMETER :: M92N3MKye = 7059 - INTEGER(IntKi), PARAMETER :: M92N4MKye = 7060 - INTEGER(IntKi), PARAMETER :: M92N5MKye = 7061 - INTEGER(IntKi), PARAMETER :: M92N6MKye = 7062 - INTEGER(IntKi), PARAMETER :: M92N7MKye = 7063 - INTEGER(IntKi), PARAMETER :: M92N8MKye = 7064 - INTEGER(IntKi), PARAMETER :: M92N9MKye = 7065 - INTEGER(IntKi), PARAMETER :: M93N1MKye = 7066 - INTEGER(IntKi), PARAMETER :: M93N2MKye = 7067 - INTEGER(IntKi), PARAMETER :: M93N3MKye = 7068 - INTEGER(IntKi), PARAMETER :: M93N4MKye = 7069 - INTEGER(IntKi), PARAMETER :: M93N5MKye = 7070 - INTEGER(IntKi), PARAMETER :: M93N6MKye = 7071 - INTEGER(IntKi), PARAMETER :: M93N7MKye = 7072 - INTEGER(IntKi), PARAMETER :: M93N8MKye = 7073 - INTEGER(IntKi), PARAMETER :: M93N9MKye = 7074 - INTEGER(IntKi), PARAMETER :: M94N1MKye = 7075 - INTEGER(IntKi), PARAMETER :: M94N2MKye = 7076 - INTEGER(IntKi), PARAMETER :: M94N3MKye = 7077 - INTEGER(IntKi), PARAMETER :: M94N4MKye = 7078 - INTEGER(IntKi), PARAMETER :: M94N5MKye = 7079 - INTEGER(IntKi), PARAMETER :: M94N6MKye = 7080 - INTEGER(IntKi), PARAMETER :: M94N7MKye = 7081 - INTEGER(IntKi), PARAMETER :: M94N8MKye = 7082 - INTEGER(IntKi), PARAMETER :: M94N9MKye = 7083 - INTEGER(IntKi), PARAMETER :: M95N1MKye = 7084 - INTEGER(IntKi), PARAMETER :: M95N2MKye = 7085 - INTEGER(IntKi), PARAMETER :: M95N3MKye = 7086 - INTEGER(IntKi), PARAMETER :: M95N4MKye = 7087 - INTEGER(IntKi), PARAMETER :: M95N5MKye = 7088 - INTEGER(IntKi), PARAMETER :: M95N6MKye = 7089 - INTEGER(IntKi), PARAMETER :: M95N7MKye = 7090 - INTEGER(IntKi), PARAMETER :: M95N8MKye = 7091 - INTEGER(IntKi), PARAMETER :: M95N9MKye = 7092 - INTEGER(IntKi), PARAMETER :: M96N1MKye = 7093 - INTEGER(IntKi), PARAMETER :: M96N2MKye = 7094 - INTEGER(IntKi), PARAMETER :: M96N3MKye = 7095 - INTEGER(IntKi), PARAMETER :: M96N4MKye = 7096 - INTEGER(IntKi), PARAMETER :: M96N5MKye = 7097 - INTEGER(IntKi), PARAMETER :: M96N6MKye = 7098 - INTEGER(IntKi), PARAMETER :: M96N7MKye = 7099 - INTEGER(IntKi), PARAMETER :: M96N8MKye = 7100 - INTEGER(IntKi), PARAMETER :: M96N9MKye = 7101 - INTEGER(IntKi), PARAMETER :: M97N1MKye = 7102 - INTEGER(IntKi), PARAMETER :: M97N2MKye = 7103 - INTEGER(IntKi), PARAMETER :: M97N3MKye = 7104 - INTEGER(IntKi), PARAMETER :: M97N4MKye = 7105 - INTEGER(IntKi), PARAMETER :: M97N5MKye = 7106 - INTEGER(IntKi), PARAMETER :: M97N6MKye = 7107 - INTEGER(IntKi), PARAMETER :: M97N7MKye = 7108 - INTEGER(IntKi), PARAMETER :: M97N8MKye = 7109 - INTEGER(IntKi), PARAMETER :: M97N9MKye = 7110 - INTEGER(IntKi), PARAMETER :: M98N1MKye = 7111 - INTEGER(IntKi), PARAMETER :: M98N2MKye = 7112 - INTEGER(IntKi), PARAMETER :: M98N3MKye = 7113 - INTEGER(IntKi), PARAMETER :: M98N4MKye = 7114 - INTEGER(IntKi), PARAMETER :: M98N5MKye = 7115 - INTEGER(IntKi), PARAMETER :: M98N6MKye = 7116 - INTEGER(IntKi), PARAMETER :: M98N7MKye = 7117 - INTEGER(IntKi), PARAMETER :: M98N8MKye = 7118 - INTEGER(IntKi), PARAMETER :: M98N9MKye = 7119 - INTEGER(IntKi), PARAMETER :: M99N1MKye = 7120 - INTEGER(IntKi), PARAMETER :: M99N2MKye = 7121 - INTEGER(IntKi), PARAMETER :: M99N3MKye = 7122 - INTEGER(IntKi), PARAMETER :: M99N4MKye = 7123 - INTEGER(IntKi), PARAMETER :: M99N5MKye = 7124 - INTEGER(IntKi), PARAMETER :: M99N6MKye = 7125 - INTEGER(IntKi), PARAMETER :: M99N7MKye = 7126 - INTEGER(IntKi), PARAMETER :: M99N8MKye = 7127 - INTEGER(IntKi), PARAMETER :: M99N9MKye = 7128 - INTEGER(IntKi), PARAMETER :: M01N1MKze = 7129 - INTEGER(IntKi), PARAMETER :: M01N2MKze = 7130 - INTEGER(IntKi), PARAMETER :: M01N3MKze = 7131 - INTEGER(IntKi), PARAMETER :: M01N4MKze = 7132 - INTEGER(IntKi), PARAMETER :: M01N5MKze = 7133 - INTEGER(IntKi), PARAMETER :: M01N6MKze = 7134 - INTEGER(IntKi), PARAMETER :: M01N7MKze = 7135 - INTEGER(IntKi), PARAMETER :: M01N8MKze = 7136 - INTEGER(IntKi), PARAMETER :: M01N9MKze = 7137 - INTEGER(IntKi), PARAMETER :: M02N1MKze = 7138 - INTEGER(IntKi), PARAMETER :: M02N2MKze = 7139 - INTEGER(IntKi), PARAMETER :: M02N3MKze = 7140 - INTEGER(IntKi), PARAMETER :: M02N4MKze = 7141 - INTEGER(IntKi), PARAMETER :: M02N5MKze = 7142 - INTEGER(IntKi), PARAMETER :: M02N6MKze = 7143 - INTEGER(IntKi), PARAMETER :: M02N7MKze = 7144 - INTEGER(IntKi), PARAMETER :: M02N8MKze = 7145 - INTEGER(IntKi), PARAMETER :: M02N9MKze = 7146 - INTEGER(IntKi), PARAMETER :: M03N1MKze = 7147 - INTEGER(IntKi), PARAMETER :: M03N2MKze = 7148 - INTEGER(IntKi), PARAMETER :: M03N3MKze = 7149 - INTEGER(IntKi), PARAMETER :: M03N4MKze = 7150 - INTEGER(IntKi), PARAMETER :: M03N5MKze = 7151 - INTEGER(IntKi), PARAMETER :: M03N6MKze = 7152 - INTEGER(IntKi), PARAMETER :: M03N7MKze = 7153 - INTEGER(IntKi), PARAMETER :: M03N8MKze = 7154 - INTEGER(IntKi), PARAMETER :: M03N9MKze = 7155 - INTEGER(IntKi), PARAMETER :: M04N1MKze = 7156 - INTEGER(IntKi), PARAMETER :: M04N2MKze = 7157 - INTEGER(IntKi), PARAMETER :: M04N3MKze = 7158 - INTEGER(IntKi), PARAMETER :: M04N4MKze = 7159 - INTEGER(IntKi), PARAMETER :: M04N5MKze = 7160 - INTEGER(IntKi), PARAMETER :: M04N6MKze = 7161 - INTEGER(IntKi), PARAMETER :: M04N7MKze = 7162 - INTEGER(IntKi), PARAMETER :: M04N8MKze = 7163 - INTEGER(IntKi), PARAMETER :: M04N9MKze = 7164 - INTEGER(IntKi), PARAMETER :: M05N1MKze = 7165 - INTEGER(IntKi), PARAMETER :: M05N2MKze = 7166 - INTEGER(IntKi), PARAMETER :: M05N3MKze = 7167 - INTEGER(IntKi), PARAMETER :: M05N4MKze = 7168 - INTEGER(IntKi), PARAMETER :: M05N5MKze = 7169 - INTEGER(IntKi), PARAMETER :: M05N6MKze = 7170 - INTEGER(IntKi), PARAMETER :: M05N7MKze = 7171 - INTEGER(IntKi), PARAMETER :: M05N8MKze = 7172 - INTEGER(IntKi), PARAMETER :: M05N9MKze = 7173 - INTEGER(IntKi), PARAMETER :: M06N1MKze = 7174 - INTEGER(IntKi), PARAMETER :: M06N2MKze = 7175 - INTEGER(IntKi), PARAMETER :: M06N3MKze = 7176 - INTEGER(IntKi), PARAMETER :: M06N4MKze = 7177 - INTEGER(IntKi), PARAMETER :: M06N5MKze = 7178 - INTEGER(IntKi), PARAMETER :: M06N6MKze = 7179 - INTEGER(IntKi), PARAMETER :: M06N7MKze = 7180 - INTEGER(IntKi), PARAMETER :: M06N8MKze = 7181 - INTEGER(IntKi), PARAMETER :: M06N9MKze = 7182 - INTEGER(IntKi), PARAMETER :: M07N1MKze = 7183 - INTEGER(IntKi), PARAMETER :: M07N2MKze = 7184 - INTEGER(IntKi), PARAMETER :: M07N3MKze = 7185 - INTEGER(IntKi), PARAMETER :: M07N4MKze = 7186 - INTEGER(IntKi), PARAMETER :: M07N5MKze = 7187 - INTEGER(IntKi), PARAMETER :: M07N6MKze = 7188 - INTEGER(IntKi), PARAMETER :: M07N7MKze = 7189 - INTEGER(IntKi), PARAMETER :: M07N8MKze = 7190 - INTEGER(IntKi), PARAMETER :: M07N9MKze = 7191 - INTEGER(IntKi), PARAMETER :: M08N1MKze = 7192 - INTEGER(IntKi), PARAMETER :: M08N2MKze = 7193 - INTEGER(IntKi), PARAMETER :: M08N3MKze = 7194 - INTEGER(IntKi), PARAMETER :: M08N4MKze = 7195 - INTEGER(IntKi), PARAMETER :: M08N5MKze = 7196 - INTEGER(IntKi), PARAMETER :: M08N6MKze = 7197 - INTEGER(IntKi), PARAMETER :: M08N7MKze = 7198 - INTEGER(IntKi), PARAMETER :: M08N8MKze = 7199 - INTEGER(IntKi), PARAMETER :: M08N9MKze = 7200 - INTEGER(IntKi), PARAMETER :: M09N1MKze = 7201 - INTEGER(IntKi), PARAMETER :: M09N2MKze = 7202 - INTEGER(IntKi), PARAMETER :: M09N3MKze = 7203 - INTEGER(IntKi), PARAMETER :: M09N4MKze = 7204 - INTEGER(IntKi), PARAMETER :: M09N5MKze = 7205 - INTEGER(IntKi), PARAMETER :: M09N6MKze = 7206 - INTEGER(IntKi), PARAMETER :: M09N7MKze = 7207 - INTEGER(IntKi), PARAMETER :: M09N8MKze = 7208 - INTEGER(IntKi), PARAMETER :: M09N9MKze = 7209 - INTEGER(IntKi), PARAMETER :: M10N1MKze = 7210 - INTEGER(IntKi), PARAMETER :: M10N2MKze = 7211 - INTEGER(IntKi), PARAMETER :: M10N3MKze = 7212 - INTEGER(IntKi), PARAMETER :: M10N4MKze = 7213 - INTEGER(IntKi), PARAMETER :: M10N5MKze = 7214 - INTEGER(IntKi), PARAMETER :: M10N6MKze = 7215 - INTEGER(IntKi), PARAMETER :: M10N7MKze = 7216 - INTEGER(IntKi), PARAMETER :: M10N8MKze = 7217 - INTEGER(IntKi), PARAMETER :: M10N9MKze = 7218 - INTEGER(IntKi), PARAMETER :: M11N1MKze = 7219 - INTEGER(IntKi), PARAMETER :: M11N2MKze = 7220 - INTEGER(IntKi), PARAMETER :: M11N3MKze = 7221 - INTEGER(IntKi), PARAMETER :: M11N4MKze = 7222 - INTEGER(IntKi), PARAMETER :: M11N5MKze = 7223 - INTEGER(IntKi), PARAMETER :: M11N6MKze = 7224 - INTEGER(IntKi), PARAMETER :: M11N7MKze = 7225 - INTEGER(IntKi), PARAMETER :: M11N8MKze = 7226 - INTEGER(IntKi), PARAMETER :: M11N9MKze = 7227 - INTEGER(IntKi), PARAMETER :: M12N1MKze = 7228 - INTEGER(IntKi), PARAMETER :: M12N2MKze = 7229 - INTEGER(IntKi), PARAMETER :: M12N3MKze = 7230 - INTEGER(IntKi), PARAMETER :: M12N4MKze = 7231 - INTEGER(IntKi), PARAMETER :: M12N5MKze = 7232 - INTEGER(IntKi), PARAMETER :: M12N6MKze = 7233 - INTEGER(IntKi), PARAMETER :: M12N7MKze = 7234 - INTEGER(IntKi), PARAMETER :: M12N8MKze = 7235 - INTEGER(IntKi), PARAMETER :: M12N9MKze = 7236 - INTEGER(IntKi), PARAMETER :: M13N1MKze = 7237 - INTEGER(IntKi), PARAMETER :: M13N2MKze = 7238 - INTEGER(IntKi), PARAMETER :: M13N3MKze = 7239 - INTEGER(IntKi), PARAMETER :: M13N4MKze = 7240 - INTEGER(IntKi), PARAMETER :: M13N5MKze = 7241 - INTEGER(IntKi), PARAMETER :: M13N6MKze = 7242 - INTEGER(IntKi), PARAMETER :: M13N7MKze = 7243 - INTEGER(IntKi), PARAMETER :: M13N8MKze = 7244 - INTEGER(IntKi), PARAMETER :: M13N9MKze = 7245 - INTEGER(IntKi), PARAMETER :: M14N1MKze = 7246 - INTEGER(IntKi), PARAMETER :: M14N2MKze = 7247 - INTEGER(IntKi), PARAMETER :: M14N3MKze = 7248 - INTEGER(IntKi), PARAMETER :: M14N4MKze = 7249 - INTEGER(IntKi), PARAMETER :: M14N5MKze = 7250 - INTEGER(IntKi), PARAMETER :: M14N6MKze = 7251 - INTEGER(IntKi), PARAMETER :: M14N7MKze = 7252 - INTEGER(IntKi), PARAMETER :: M14N8MKze = 7253 - INTEGER(IntKi), PARAMETER :: M14N9MKze = 7254 - INTEGER(IntKi), PARAMETER :: M15N1MKze = 7255 - INTEGER(IntKi), PARAMETER :: M15N2MKze = 7256 - INTEGER(IntKi), PARAMETER :: M15N3MKze = 7257 - INTEGER(IntKi), PARAMETER :: M15N4MKze = 7258 - INTEGER(IntKi), PARAMETER :: M15N5MKze = 7259 - INTEGER(IntKi), PARAMETER :: M15N6MKze = 7260 - INTEGER(IntKi), PARAMETER :: M15N7MKze = 7261 - INTEGER(IntKi), PARAMETER :: M15N8MKze = 7262 - INTEGER(IntKi), PARAMETER :: M15N9MKze = 7263 - INTEGER(IntKi), PARAMETER :: M16N1MKze = 7264 - INTEGER(IntKi), PARAMETER :: M16N2MKze = 7265 - INTEGER(IntKi), PARAMETER :: M16N3MKze = 7266 - INTEGER(IntKi), PARAMETER :: M16N4MKze = 7267 - INTEGER(IntKi), PARAMETER :: M16N5MKze = 7268 - INTEGER(IntKi), PARAMETER :: M16N6MKze = 7269 - INTEGER(IntKi), PARAMETER :: M16N7MKze = 7270 - INTEGER(IntKi), PARAMETER :: M16N8MKze = 7271 - INTEGER(IntKi), PARAMETER :: M16N9MKze = 7272 - INTEGER(IntKi), PARAMETER :: M17N1MKze = 7273 - INTEGER(IntKi), PARAMETER :: M17N2MKze = 7274 - INTEGER(IntKi), PARAMETER :: M17N3MKze = 7275 - INTEGER(IntKi), PARAMETER :: M17N4MKze = 7276 - INTEGER(IntKi), PARAMETER :: M17N5MKze = 7277 - INTEGER(IntKi), PARAMETER :: M17N6MKze = 7278 - INTEGER(IntKi), PARAMETER :: M17N7MKze = 7279 - INTEGER(IntKi), PARAMETER :: M17N8MKze = 7280 - INTEGER(IntKi), PARAMETER :: M17N9MKze = 7281 - INTEGER(IntKi), PARAMETER :: M18N1MKze = 7282 - INTEGER(IntKi), PARAMETER :: M18N2MKze = 7283 - INTEGER(IntKi), PARAMETER :: M18N3MKze = 7284 - INTEGER(IntKi), PARAMETER :: M18N4MKze = 7285 - INTEGER(IntKi), PARAMETER :: M18N5MKze = 7286 - INTEGER(IntKi), PARAMETER :: M18N6MKze = 7287 - INTEGER(IntKi), PARAMETER :: M18N7MKze = 7288 - INTEGER(IntKi), PARAMETER :: M18N8MKze = 7289 - INTEGER(IntKi), PARAMETER :: M18N9MKze = 7290 - INTEGER(IntKi), PARAMETER :: M19N1MKze = 7291 - INTEGER(IntKi), PARAMETER :: M19N2MKze = 7292 - INTEGER(IntKi), PARAMETER :: M19N3MKze = 7293 - INTEGER(IntKi), PARAMETER :: M19N4MKze = 7294 - INTEGER(IntKi), PARAMETER :: M19N5MKze = 7295 - INTEGER(IntKi), PARAMETER :: M19N6MKze = 7296 - INTEGER(IntKi), PARAMETER :: M19N7MKze = 7297 - INTEGER(IntKi), PARAMETER :: M19N8MKze = 7298 - INTEGER(IntKi), PARAMETER :: M19N9MKze = 7299 - INTEGER(IntKi), PARAMETER :: M20N1MKze = 7300 - INTEGER(IntKi), PARAMETER :: M20N2MKze = 7301 - INTEGER(IntKi), PARAMETER :: M20N3MKze = 7302 - INTEGER(IntKi), PARAMETER :: M20N4MKze = 7303 - INTEGER(IntKi), PARAMETER :: M20N5MKze = 7304 - INTEGER(IntKi), PARAMETER :: M20N6MKze = 7305 - INTEGER(IntKi), PARAMETER :: M20N7MKze = 7306 - INTEGER(IntKi), PARAMETER :: M20N8MKze = 7307 - INTEGER(IntKi), PARAMETER :: M20N9MKze = 7308 - INTEGER(IntKi), PARAMETER :: M21N1MKze = 7309 - INTEGER(IntKi), PARAMETER :: M21N2MKze = 7310 - INTEGER(IntKi), PARAMETER :: M21N3MKze = 7311 - INTEGER(IntKi), PARAMETER :: M21N4MKze = 7312 - INTEGER(IntKi), PARAMETER :: M21N5MKze = 7313 - INTEGER(IntKi), PARAMETER :: M21N6MKze = 7314 - INTEGER(IntKi), PARAMETER :: M21N7MKze = 7315 - INTEGER(IntKi), PARAMETER :: M21N8MKze = 7316 - INTEGER(IntKi), PARAMETER :: M21N9MKze = 7317 - INTEGER(IntKi), PARAMETER :: M22N1MKze = 7318 - INTEGER(IntKi), PARAMETER :: M22N2MKze = 7319 - INTEGER(IntKi), PARAMETER :: M22N3MKze = 7320 - INTEGER(IntKi), PARAMETER :: M22N4MKze = 7321 - INTEGER(IntKi), PARAMETER :: M22N5MKze = 7322 - INTEGER(IntKi), PARAMETER :: M22N6MKze = 7323 - INTEGER(IntKi), PARAMETER :: M22N7MKze = 7324 - INTEGER(IntKi), PARAMETER :: M22N8MKze = 7325 - INTEGER(IntKi), PARAMETER :: M22N9MKze = 7326 - INTEGER(IntKi), PARAMETER :: M23N1MKze = 7327 - INTEGER(IntKi), PARAMETER :: M23N2MKze = 7328 - INTEGER(IntKi), PARAMETER :: M23N3MKze = 7329 - INTEGER(IntKi), PARAMETER :: M23N4MKze = 7330 - INTEGER(IntKi), PARAMETER :: M23N5MKze = 7331 - INTEGER(IntKi), PARAMETER :: M23N6MKze = 7332 - INTEGER(IntKi), PARAMETER :: M23N7MKze = 7333 - INTEGER(IntKi), PARAMETER :: M23N8MKze = 7334 - INTEGER(IntKi), PARAMETER :: M23N9MKze = 7335 - INTEGER(IntKi), PARAMETER :: M24N1MKze = 7336 - INTEGER(IntKi), PARAMETER :: M24N2MKze = 7337 - INTEGER(IntKi), PARAMETER :: M24N3MKze = 7338 - INTEGER(IntKi), PARAMETER :: M24N4MKze = 7339 - INTEGER(IntKi), PARAMETER :: M24N5MKze = 7340 - INTEGER(IntKi), PARAMETER :: M24N6MKze = 7341 - INTEGER(IntKi), PARAMETER :: M24N7MKze = 7342 - INTEGER(IntKi), PARAMETER :: M24N8MKze = 7343 - INTEGER(IntKi), PARAMETER :: M24N9MKze = 7344 - INTEGER(IntKi), PARAMETER :: M25N1MKze = 7345 - INTEGER(IntKi), PARAMETER :: M25N2MKze = 7346 - INTEGER(IntKi), PARAMETER :: M25N3MKze = 7347 - INTEGER(IntKi), PARAMETER :: M25N4MKze = 7348 - INTEGER(IntKi), PARAMETER :: M25N5MKze = 7349 - INTEGER(IntKi), PARAMETER :: M25N6MKze = 7350 - INTEGER(IntKi), PARAMETER :: M25N7MKze = 7351 - INTEGER(IntKi), PARAMETER :: M25N8MKze = 7352 - INTEGER(IntKi), PARAMETER :: M25N9MKze = 7353 - INTEGER(IntKi), PARAMETER :: M26N1MKze = 7354 - INTEGER(IntKi), PARAMETER :: M26N2MKze = 7355 - INTEGER(IntKi), PARAMETER :: M26N3MKze = 7356 - INTEGER(IntKi), PARAMETER :: M26N4MKze = 7357 - INTEGER(IntKi), PARAMETER :: M26N5MKze = 7358 - INTEGER(IntKi), PARAMETER :: M26N6MKze = 7359 - INTEGER(IntKi), PARAMETER :: M26N7MKze = 7360 - INTEGER(IntKi), PARAMETER :: M26N8MKze = 7361 - INTEGER(IntKi), PARAMETER :: M26N9MKze = 7362 - INTEGER(IntKi), PARAMETER :: M27N1MKze = 7363 - INTEGER(IntKi), PARAMETER :: M27N2MKze = 7364 - INTEGER(IntKi), PARAMETER :: M27N3MKze = 7365 - INTEGER(IntKi), PARAMETER :: M27N4MKze = 7366 - INTEGER(IntKi), PARAMETER :: M27N5MKze = 7367 - INTEGER(IntKi), PARAMETER :: M27N6MKze = 7368 - INTEGER(IntKi), PARAMETER :: M27N7MKze = 7369 - INTEGER(IntKi), PARAMETER :: M27N8MKze = 7370 - INTEGER(IntKi), PARAMETER :: M27N9MKze = 7371 - INTEGER(IntKi), PARAMETER :: M28N1MKze = 7372 - INTEGER(IntKi), PARAMETER :: M28N2MKze = 7373 - INTEGER(IntKi), PARAMETER :: M28N3MKze = 7374 - INTEGER(IntKi), PARAMETER :: M28N4MKze = 7375 - INTEGER(IntKi), PARAMETER :: M28N5MKze = 7376 - INTEGER(IntKi), PARAMETER :: M28N6MKze = 7377 - INTEGER(IntKi), PARAMETER :: M28N7MKze = 7378 - INTEGER(IntKi), PARAMETER :: M28N8MKze = 7379 - INTEGER(IntKi), PARAMETER :: M28N9MKze = 7380 - INTEGER(IntKi), PARAMETER :: M29N1MKze = 7381 - INTEGER(IntKi), PARAMETER :: M29N2MKze = 7382 - INTEGER(IntKi), PARAMETER :: M29N3MKze = 7383 - INTEGER(IntKi), PARAMETER :: M29N4MKze = 7384 - INTEGER(IntKi), PARAMETER :: M29N5MKze = 7385 - INTEGER(IntKi), PARAMETER :: M29N6MKze = 7386 - INTEGER(IntKi), PARAMETER :: M29N7MKze = 7387 - INTEGER(IntKi), PARAMETER :: M29N8MKze = 7388 - INTEGER(IntKi), PARAMETER :: M29N9MKze = 7389 - INTEGER(IntKi), PARAMETER :: M30N1MKze = 7390 - INTEGER(IntKi), PARAMETER :: M30N2MKze = 7391 - INTEGER(IntKi), PARAMETER :: M30N3MKze = 7392 - INTEGER(IntKi), PARAMETER :: M30N4MKze = 7393 - INTEGER(IntKi), PARAMETER :: M30N5MKze = 7394 - INTEGER(IntKi), PARAMETER :: M30N6MKze = 7395 - INTEGER(IntKi), PARAMETER :: M30N7MKze = 7396 - INTEGER(IntKi), PARAMETER :: M30N8MKze = 7397 - INTEGER(IntKi), PARAMETER :: M30N9MKze = 7398 - INTEGER(IntKi), PARAMETER :: M31N1MKze = 7399 - INTEGER(IntKi), PARAMETER :: M31N2MKze = 7400 - INTEGER(IntKi), PARAMETER :: M31N3MKze = 7401 - INTEGER(IntKi), PARAMETER :: M31N4MKze = 7402 - INTEGER(IntKi), PARAMETER :: M31N5MKze = 7403 - INTEGER(IntKi), PARAMETER :: M31N6MKze = 7404 - INTEGER(IntKi), PARAMETER :: M31N7MKze = 7405 - INTEGER(IntKi), PARAMETER :: M31N8MKze = 7406 - INTEGER(IntKi), PARAMETER :: M31N9MKze = 7407 - INTEGER(IntKi), PARAMETER :: M32N1MKze = 7408 - INTEGER(IntKi), PARAMETER :: M32N2MKze = 7409 - INTEGER(IntKi), PARAMETER :: M32N3MKze = 7410 - INTEGER(IntKi), PARAMETER :: M32N4MKze = 7411 - INTEGER(IntKi), PARAMETER :: M32N5MKze = 7412 - INTEGER(IntKi), PARAMETER :: M32N6MKze = 7413 - INTEGER(IntKi), PARAMETER :: M32N7MKze = 7414 - INTEGER(IntKi), PARAMETER :: M32N8MKze = 7415 - INTEGER(IntKi), PARAMETER :: M32N9MKze = 7416 - INTEGER(IntKi), PARAMETER :: M33N1MKze = 7417 - INTEGER(IntKi), PARAMETER :: M33N2MKze = 7418 - INTEGER(IntKi), PARAMETER :: M33N3MKze = 7419 - INTEGER(IntKi), PARAMETER :: M33N4MKze = 7420 - INTEGER(IntKi), PARAMETER :: M33N5MKze = 7421 - INTEGER(IntKi), PARAMETER :: M33N6MKze = 7422 - INTEGER(IntKi), PARAMETER :: M33N7MKze = 7423 - INTEGER(IntKi), PARAMETER :: M33N8MKze = 7424 - INTEGER(IntKi), PARAMETER :: M33N9MKze = 7425 - INTEGER(IntKi), PARAMETER :: M34N1MKze = 7426 - INTEGER(IntKi), PARAMETER :: M34N2MKze = 7427 - INTEGER(IntKi), PARAMETER :: M34N3MKze = 7428 - INTEGER(IntKi), PARAMETER :: M34N4MKze = 7429 - INTEGER(IntKi), PARAMETER :: M34N5MKze = 7430 - INTEGER(IntKi), PARAMETER :: M34N6MKze = 7431 - INTEGER(IntKi), PARAMETER :: M34N7MKze = 7432 - INTEGER(IntKi), PARAMETER :: M34N8MKze = 7433 - INTEGER(IntKi), PARAMETER :: M34N9MKze = 7434 - INTEGER(IntKi), PARAMETER :: M35N1MKze = 7435 - INTEGER(IntKi), PARAMETER :: M35N2MKze = 7436 - INTEGER(IntKi), PARAMETER :: M35N3MKze = 7437 - INTEGER(IntKi), PARAMETER :: M35N4MKze = 7438 - INTEGER(IntKi), PARAMETER :: M35N5MKze = 7439 - INTEGER(IntKi), PARAMETER :: M35N6MKze = 7440 - INTEGER(IntKi), PARAMETER :: M35N7MKze = 7441 - INTEGER(IntKi), PARAMETER :: M35N8MKze = 7442 - INTEGER(IntKi), PARAMETER :: M35N9MKze = 7443 - INTEGER(IntKi), PARAMETER :: M36N1MKze = 7444 - INTEGER(IntKi), PARAMETER :: M36N2MKze = 7445 - INTEGER(IntKi), PARAMETER :: M36N3MKze = 7446 - INTEGER(IntKi), PARAMETER :: M36N4MKze = 7447 - INTEGER(IntKi), PARAMETER :: M36N5MKze = 7448 - INTEGER(IntKi), PARAMETER :: M36N6MKze = 7449 - INTEGER(IntKi), PARAMETER :: M36N7MKze = 7450 - INTEGER(IntKi), PARAMETER :: M36N8MKze = 7451 - INTEGER(IntKi), PARAMETER :: M36N9MKze = 7452 - INTEGER(IntKi), PARAMETER :: M37N1MKze = 7453 - INTEGER(IntKi), PARAMETER :: M37N2MKze = 7454 - INTEGER(IntKi), PARAMETER :: M37N3MKze = 7455 - INTEGER(IntKi), PARAMETER :: M37N4MKze = 7456 - INTEGER(IntKi), PARAMETER :: M37N5MKze = 7457 - INTEGER(IntKi), PARAMETER :: M37N6MKze = 7458 - INTEGER(IntKi), PARAMETER :: M37N7MKze = 7459 - INTEGER(IntKi), PARAMETER :: M37N8MKze = 7460 - INTEGER(IntKi), PARAMETER :: M37N9MKze = 7461 - INTEGER(IntKi), PARAMETER :: M38N1MKze = 7462 - INTEGER(IntKi), PARAMETER :: M38N2MKze = 7463 - INTEGER(IntKi), PARAMETER :: M38N3MKze = 7464 - INTEGER(IntKi), PARAMETER :: M38N4MKze = 7465 - INTEGER(IntKi), PARAMETER :: M38N5MKze = 7466 - INTEGER(IntKi), PARAMETER :: M38N6MKze = 7467 - INTEGER(IntKi), PARAMETER :: M38N7MKze = 7468 - INTEGER(IntKi), PARAMETER :: M38N8MKze = 7469 - INTEGER(IntKi), PARAMETER :: M38N9MKze = 7470 - INTEGER(IntKi), PARAMETER :: M39N1MKze = 7471 - INTEGER(IntKi), PARAMETER :: M39N2MKze = 7472 - INTEGER(IntKi), PARAMETER :: M39N3MKze = 7473 - INTEGER(IntKi), PARAMETER :: M39N4MKze = 7474 - INTEGER(IntKi), PARAMETER :: M39N5MKze = 7475 - INTEGER(IntKi), PARAMETER :: M39N6MKze = 7476 - INTEGER(IntKi), PARAMETER :: M39N7MKze = 7477 - INTEGER(IntKi), PARAMETER :: M39N8MKze = 7478 - INTEGER(IntKi), PARAMETER :: M39N9MKze = 7479 - INTEGER(IntKi), PARAMETER :: M40N1MKze = 7480 - INTEGER(IntKi), PARAMETER :: M40N2MKze = 7481 - INTEGER(IntKi), PARAMETER :: M40N3MKze = 7482 - INTEGER(IntKi), PARAMETER :: M40N4MKze = 7483 - INTEGER(IntKi), PARAMETER :: M40N5MKze = 7484 - INTEGER(IntKi), PARAMETER :: M40N6MKze = 7485 - INTEGER(IntKi), PARAMETER :: M40N7MKze = 7486 - INTEGER(IntKi), PARAMETER :: M40N8MKze = 7487 - INTEGER(IntKi), PARAMETER :: M40N9MKze = 7488 - INTEGER(IntKi), PARAMETER :: M41N1MKze = 7489 - INTEGER(IntKi), PARAMETER :: M41N2MKze = 7490 - INTEGER(IntKi), PARAMETER :: M41N3MKze = 7491 - INTEGER(IntKi), PARAMETER :: M41N4MKze = 7492 - INTEGER(IntKi), PARAMETER :: M41N5MKze = 7493 - INTEGER(IntKi), PARAMETER :: M41N6MKze = 7494 - INTEGER(IntKi), PARAMETER :: M41N7MKze = 7495 - INTEGER(IntKi), PARAMETER :: M41N8MKze = 7496 - INTEGER(IntKi), PARAMETER :: M41N9MKze = 7497 - INTEGER(IntKi), PARAMETER :: M42N1MKze = 7498 - INTEGER(IntKi), PARAMETER :: M42N2MKze = 7499 - INTEGER(IntKi), PARAMETER :: M42N3MKze = 7500 - INTEGER(IntKi), PARAMETER :: M42N4MKze = 7501 - INTEGER(IntKi), PARAMETER :: M42N5MKze = 7502 - INTEGER(IntKi), PARAMETER :: M42N6MKze = 7503 - INTEGER(IntKi), PARAMETER :: M42N7MKze = 7504 - INTEGER(IntKi), PARAMETER :: M42N8MKze = 7505 - INTEGER(IntKi), PARAMETER :: M42N9MKze = 7506 - INTEGER(IntKi), PARAMETER :: M43N1MKze = 7507 - INTEGER(IntKi), PARAMETER :: M43N2MKze = 7508 - INTEGER(IntKi), PARAMETER :: M43N3MKze = 7509 - INTEGER(IntKi), PARAMETER :: M43N4MKze = 7510 - INTEGER(IntKi), PARAMETER :: M43N5MKze = 7511 - INTEGER(IntKi), PARAMETER :: M43N6MKze = 7512 - INTEGER(IntKi), PARAMETER :: M43N7MKze = 7513 - INTEGER(IntKi), PARAMETER :: M43N8MKze = 7514 - INTEGER(IntKi), PARAMETER :: M43N9MKze = 7515 - INTEGER(IntKi), PARAMETER :: M44N1MKze = 7516 - INTEGER(IntKi), PARAMETER :: M44N2MKze = 7517 - INTEGER(IntKi), PARAMETER :: M44N3MKze = 7518 - INTEGER(IntKi), PARAMETER :: M44N4MKze = 7519 - INTEGER(IntKi), PARAMETER :: M44N5MKze = 7520 - INTEGER(IntKi), PARAMETER :: M44N6MKze = 7521 - INTEGER(IntKi), PARAMETER :: M44N7MKze = 7522 - INTEGER(IntKi), PARAMETER :: M44N8MKze = 7523 - INTEGER(IntKi), PARAMETER :: M44N9MKze = 7524 - INTEGER(IntKi), PARAMETER :: M45N1MKze = 7525 - INTEGER(IntKi), PARAMETER :: M45N2MKze = 7526 - INTEGER(IntKi), PARAMETER :: M45N3MKze = 7527 - INTEGER(IntKi), PARAMETER :: M45N4MKze = 7528 - INTEGER(IntKi), PARAMETER :: M45N5MKze = 7529 - INTEGER(IntKi), PARAMETER :: M45N6MKze = 7530 - INTEGER(IntKi), PARAMETER :: M45N7MKze = 7531 - INTEGER(IntKi), PARAMETER :: M45N8MKze = 7532 - INTEGER(IntKi), PARAMETER :: M45N9MKze = 7533 - INTEGER(IntKi), PARAMETER :: M46N1MKze = 7534 - INTEGER(IntKi), PARAMETER :: M46N2MKze = 7535 - INTEGER(IntKi), PARAMETER :: M46N3MKze = 7536 - INTEGER(IntKi), PARAMETER :: M46N4MKze = 7537 - INTEGER(IntKi), PARAMETER :: M46N5MKze = 7538 - INTEGER(IntKi), PARAMETER :: M46N6MKze = 7539 - INTEGER(IntKi), PARAMETER :: M46N7MKze = 7540 - INTEGER(IntKi), PARAMETER :: M46N8MKze = 7541 - INTEGER(IntKi), PARAMETER :: M46N9MKze = 7542 - INTEGER(IntKi), PARAMETER :: M47N1MKze = 7543 - INTEGER(IntKi), PARAMETER :: M47N2MKze = 7544 - INTEGER(IntKi), PARAMETER :: M47N3MKze = 7545 - INTEGER(IntKi), PARAMETER :: M47N4MKze = 7546 - INTEGER(IntKi), PARAMETER :: M47N5MKze = 7547 - INTEGER(IntKi), PARAMETER :: M47N6MKze = 7548 - INTEGER(IntKi), PARAMETER :: M47N7MKze = 7549 - INTEGER(IntKi), PARAMETER :: M47N8MKze = 7550 - INTEGER(IntKi), PARAMETER :: M47N9MKze = 7551 - INTEGER(IntKi), PARAMETER :: M48N1MKze = 7552 - INTEGER(IntKi), PARAMETER :: M48N2MKze = 7553 - INTEGER(IntKi), PARAMETER :: M48N3MKze = 7554 - INTEGER(IntKi), PARAMETER :: M48N4MKze = 7555 - INTEGER(IntKi), PARAMETER :: M48N5MKze = 7556 - INTEGER(IntKi), PARAMETER :: M48N6MKze = 7557 - INTEGER(IntKi), PARAMETER :: M48N7MKze = 7558 - INTEGER(IntKi), PARAMETER :: M48N8MKze = 7559 - INTEGER(IntKi), PARAMETER :: M48N9MKze = 7560 - INTEGER(IntKi), PARAMETER :: M49N1MKze = 7561 - INTEGER(IntKi), PARAMETER :: M49N2MKze = 7562 - INTEGER(IntKi), PARAMETER :: M49N3MKze = 7563 - INTEGER(IntKi), PARAMETER :: M49N4MKze = 7564 - INTEGER(IntKi), PARAMETER :: M49N5MKze = 7565 - INTEGER(IntKi), PARAMETER :: M49N6MKze = 7566 - INTEGER(IntKi), PARAMETER :: M49N7MKze = 7567 - INTEGER(IntKi), PARAMETER :: M49N8MKze = 7568 - INTEGER(IntKi), PARAMETER :: M49N9MKze = 7569 - INTEGER(IntKi), PARAMETER :: M50N1MKze = 7570 - INTEGER(IntKi), PARAMETER :: M50N2MKze = 7571 - INTEGER(IntKi), PARAMETER :: M50N3MKze = 7572 - INTEGER(IntKi), PARAMETER :: M50N4MKze = 7573 - INTEGER(IntKi), PARAMETER :: M50N5MKze = 7574 - INTEGER(IntKi), PARAMETER :: M50N6MKze = 7575 - INTEGER(IntKi), PARAMETER :: M50N7MKze = 7576 - INTEGER(IntKi), PARAMETER :: M50N8MKze = 7577 - INTEGER(IntKi), PARAMETER :: M50N9MKze = 7578 - INTEGER(IntKi), PARAMETER :: M51N1MKze = 7579 - INTEGER(IntKi), PARAMETER :: M51N2MKze = 7580 - INTEGER(IntKi), PARAMETER :: M51N3MKze = 7581 - INTEGER(IntKi), PARAMETER :: M51N4MKze = 7582 - INTEGER(IntKi), PARAMETER :: M51N5MKze = 7583 - INTEGER(IntKi), PARAMETER :: M51N6MKze = 7584 - INTEGER(IntKi), PARAMETER :: M51N7MKze = 7585 - INTEGER(IntKi), PARAMETER :: M51N8MKze = 7586 - INTEGER(IntKi), PARAMETER :: M51N9MKze = 7587 - INTEGER(IntKi), PARAMETER :: M52N1MKze = 7588 - INTEGER(IntKi), PARAMETER :: M52N2MKze = 7589 - INTEGER(IntKi), PARAMETER :: M52N3MKze = 7590 - INTEGER(IntKi), PARAMETER :: M52N4MKze = 7591 - INTEGER(IntKi), PARAMETER :: M52N5MKze = 7592 - INTEGER(IntKi), PARAMETER :: M52N6MKze = 7593 - INTEGER(IntKi), PARAMETER :: M52N7MKze = 7594 - INTEGER(IntKi), PARAMETER :: M52N8MKze = 7595 - INTEGER(IntKi), PARAMETER :: M52N9MKze = 7596 - INTEGER(IntKi), PARAMETER :: M53N1MKze = 7597 - INTEGER(IntKi), PARAMETER :: M53N2MKze = 7598 - INTEGER(IntKi), PARAMETER :: M53N3MKze = 7599 - INTEGER(IntKi), PARAMETER :: M53N4MKze = 7600 - INTEGER(IntKi), PARAMETER :: M53N5MKze = 7601 - INTEGER(IntKi), PARAMETER :: M53N6MKze = 7602 - INTEGER(IntKi), PARAMETER :: M53N7MKze = 7603 - INTEGER(IntKi), PARAMETER :: M53N8MKze = 7604 - INTEGER(IntKi), PARAMETER :: M53N9MKze = 7605 - INTEGER(IntKi), PARAMETER :: M54N1MKze = 7606 - INTEGER(IntKi), PARAMETER :: M54N2MKze = 7607 - INTEGER(IntKi), PARAMETER :: M54N3MKze = 7608 - INTEGER(IntKi), PARAMETER :: M54N4MKze = 7609 - INTEGER(IntKi), PARAMETER :: M54N5MKze = 7610 - INTEGER(IntKi), PARAMETER :: M54N6MKze = 7611 - INTEGER(IntKi), PARAMETER :: M54N7MKze = 7612 - INTEGER(IntKi), PARAMETER :: M54N8MKze = 7613 - INTEGER(IntKi), PARAMETER :: M54N9MKze = 7614 - INTEGER(IntKi), PARAMETER :: M55N1MKze = 7615 - INTEGER(IntKi), PARAMETER :: M55N2MKze = 7616 - INTEGER(IntKi), PARAMETER :: M55N3MKze = 7617 - INTEGER(IntKi), PARAMETER :: M55N4MKze = 7618 - INTEGER(IntKi), PARAMETER :: M55N5MKze = 7619 - INTEGER(IntKi), PARAMETER :: M55N6MKze = 7620 - INTEGER(IntKi), PARAMETER :: M55N7MKze = 7621 - INTEGER(IntKi), PARAMETER :: M55N8MKze = 7622 - INTEGER(IntKi), PARAMETER :: M55N9MKze = 7623 - INTEGER(IntKi), PARAMETER :: M56N1MKze = 7624 - INTEGER(IntKi), PARAMETER :: M56N2MKze = 7625 - INTEGER(IntKi), PARAMETER :: M56N3MKze = 7626 - INTEGER(IntKi), PARAMETER :: M56N4MKze = 7627 - INTEGER(IntKi), PARAMETER :: M56N5MKze = 7628 - INTEGER(IntKi), PARAMETER :: M56N6MKze = 7629 - INTEGER(IntKi), PARAMETER :: M56N7MKze = 7630 - INTEGER(IntKi), PARAMETER :: M56N8MKze = 7631 - INTEGER(IntKi), PARAMETER :: M56N9MKze = 7632 - INTEGER(IntKi), PARAMETER :: M57N1MKze = 7633 - INTEGER(IntKi), PARAMETER :: M57N2MKze = 7634 - INTEGER(IntKi), PARAMETER :: M57N3MKze = 7635 - INTEGER(IntKi), PARAMETER :: M57N4MKze = 7636 - INTEGER(IntKi), PARAMETER :: M57N5MKze = 7637 - INTEGER(IntKi), PARAMETER :: M57N6MKze = 7638 - INTEGER(IntKi), PARAMETER :: M57N7MKze = 7639 - INTEGER(IntKi), PARAMETER :: M57N8MKze = 7640 - INTEGER(IntKi), PARAMETER :: M57N9MKze = 7641 - INTEGER(IntKi), PARAMETER :: M58N1MKze = 7642 - INTEGER(IntKi), PARAMETER :: M58N2MKze = 7643 - INTEGER(IntKi), PARAMETER :: M58N3MKze = 7644 - INTEGER(IntKi), PARAMETER :: M58N4MKze = 7645 - INTEGER(IntKi), PARAMETER :: M58N5MKze = 7646 - INTEGER(IntKi), PARAMETER :: M58N6MKze = 7647 - INTEGER(IntKi), PARAMETER :: M58N7MKze = 7648 - INTEGER(IntKi), PARAMETER :: M58N8MKze = 7649 - INTEGER(IntKi), PARAMETER :: M58N9MKze = 7650 - INTEGER(IntKi), PARAMETER :: M59N1MKze = 7651 - INTEGER(IntKi), PARAMETER :: M59N2MKze = 7652 - INTEGER(IntKi), PARAMETER :: M59N3MKze = 7653 - INTEGER(IntKi), PARAMETER :: M59N4MKze = 7654 - INTEGER(IntKi), PARAMETER :: M59N5MKze = 7655 - INTEGER(IntKi), PARAMETER :: M59N6MKze = 7656 - INTEGER(IntKi), PARAMETER :: M59N7MKze = 7657 - INTEGER(IntKi), PARAMETER :: M59N8MKze = 7658 - INTEGER(IntKi), PARAMETER :: M59N9MKze = 7659 - INTEGER(IntKi), PARAMETER :: M60N1MKze = 7660 - INTEGER(IntKi), PARAMETER :: M60N2MKze = 7661 - INTEGER(IntKi), PARAMETER :: M60N3MKze = 7662 - INTEGER(IntKi), PARAMETER :: M60N4MKze = 7663 - INTEGER(IntKi), PARAMETER :: M60N5MKze = 7664 - INTEGER(IntKi), PARAMETER :: M60N6MKze = 7665 - INTEGER(IntKi), PARAMETER :: M60N7MKze = 7666 - INTEGER(IntKi), PARAMETER :: M60N8MKze = 7667 - INTEGER(IntKi), PARAMETER :: M60N9MKze = 7668 - INTEGER(IntKi), PARAMETER :: M61N1MKze = 7669 - INTEGER(IntKi), PARAMETER :: M61N2MKze = 7670 - INTEGER(IntKi), PARAMETER :: M61N3MKze = 7671 - INTEGER(IntKi), PARAMETER :: M61N4MKze = 7672 - INTEGER(IntKi), PARAMETER :: M61N5MKze = 7673 - INTEGER(IntKi), PARAMETER :: M61N6MKze = 7674 - INTEGER(IntKi), PARAMETER :: M61N7MKze = 7675 - INTEGER(IntKi), PARAMETER :: M61N8MKze = 7676 - INTEGER(IntKi), PARAMETER :: M61N9MKze = 7677 - INTEGER(IntKi), PARAMETER :: M62N1MKze = 7678 - INTEGER(IntKi), PARAMETER :: M62N2MKze = 7679 - INTEGER(IntKi), PARAMETER :: M62N3MKze = 7680 - INTEGER(IntKi), PARAMETER :: M62N4MKze = 7681 - INTEGER(IntKi), PARAMETER :: M62N5MKze = 7682 - INTEGER(IntKi), PARAMETER :: M62N6MKze = 7683 - INTEGER(IntKi), PARAMETER :: M62N7MKze = 7684 - INTEGER(IntKi), PARAMETER :: M62N8MKze = 7685 - INTEGER(IntKi), PARAMETER :: M62N9MKze = 7686 - INTEGER(IntKi), PARAMETER :: M63N1MKze = 7687 - INTEGER(IntKi), PARAMETER :: M63N2MKze = 7688 - INTEGER(IntKi), PARAMETER :: M63N3MKze = 7689 - INTEGER(IntKi), PARAMETER :: M63N4MKze = 7690 - INTEGER(IntKi), PARAMETER :: M63N5MKze = 7691 - INTEGER(IntKi), PARAMETER :: M63N6MKze = 7692 - INTEGER(IntKi), PARAMETER :: M63N7MKze = 7693 - INTEGER(IntKi), PARAMETER :: M63N8MKze = 7694 - INTEGER(IntKi), PARAMETER :: M63N9MKze = 7695 - INTEGER(IntKi), PARAMETER :: M64N1MKze = 7696 - INTEGER(IntKi), PARAMETER :: M64N2MKze = 7697 - INTEGER(IntKi), PARAMETER :: M64N3MKze = 7698 - INTEGER(IntKi), PARAMETER :: M64N4MKze = 7699 - INTEGER(IntKi), PARAMETER :: M64N5MKze = 7700 - INTEGER(IntKi), PARAMETER :: M64N6MKze = 7701 - INTEGER(IntKi), PARAMETER :: M64N7MKze = 7702 - INTEGER(IntKi), PARAMETER :: M64N8MKze = 7703 - INTEGER(IntKi), PARAMETER :: M64N9MKze = 7704 - INTEGER(IntKi), PARAMETER :: M65N1MKze = 7705 - INTEGER(IntKi), PARAMETER :: M65N2MKze = 7706 - INTEGER(IntKi), PARAMETER :: M65N3MKze = 7707 - INTEGER(IntKi), PARAMETER :: M65N4MKze = 7708 - INTEGER(IntKi), PARAMETER :: M65N5MKze = 7709 - INTEGER(IntKi), PARAMETER :: M65N6MKze = 7710 - INTEGER(IntKi), PARAMETER :: M65N7MKze = 7711 - INTEGER(IntKi), PARAMETER :: M65N8MKze = 7712 - INTEGER(IntKi), PARAMETER :: M65N9MKze = 7713 - INTEGER(IntKi), PARAMETER :: M66N1MKze = 7714 - INTEGER(IntKi), PARAMETER :: M66N2MKze = 7715 - INTEGER(IntKi), PARAMETER :: M66N3MKze = 7716 - INTEGER(IntKi), PARAMETER :: M66N4MKze = 7717 - INTEGER(IntKi), PARAMETER :: M66N5MKze = 7718 - INTEGER(IntKi), PARAMETER :: M66N6MKze = 7719 - INTEGER(IntKi), PARAMETER :: M66N7MKze = 7720 - INTEGER(IntKi), PARAMETER :: M66N8MKze = 7721 - INTEGER(IntKi), PARAMETER :: M66N9MKze = 7722 - INTEGER(IntKi), PARAMETER :: M67N1MKze = 7723 - INTEGER(IntKi), PARAMETER :: M67N2MKze = 7724 - INTEGER(IntKi), PARAMETER :: M67N3MKze = 7725 - INTEGER(IntKi), PARAMETER :: M67N4MKze = 7726 - INTEGER(IntKi), PARAMETER :: M67N5MKze = 7727 - INTEGER(IntKi), PARAMETER :: M67N6MKze = 7728 - INTEGER(IntKi), PARAMETER :: M67N7MKze = 7729 - INTEGER(IntKi), PARAMETER :: M67N8MKze = 7730 - INTEGER(IntKi), PARAMETER :: M67N9MKze = 7731 - INTEGER(IntKi), PARAMETER :: M68N1MKze = 7732 - INTEGER(IntKi), PARAMETER :: M68N2MKze = 7733 - INTEGER(IntKi), PARAMETER :: M68N3MKze = 7734 - INTEGER(IntKi), PARAMETER :: M68N4MKze = 7735 - INTEGER(IntKi), PARAMETER :: M68N5MKze = 7736 - INTEGER(IntKi), PARAMETER :: M68N6MKze = 7737 - INTEGER(IntKi), PARAMETER :: M68N7MKze = 7738 - INTEGER(IntKi), PARAMETER :: M68N8MKze = 7739 - INTEGER(IntKi), PARAMETER :: M68N9MKze = 7740 - INTEGER(IntKi), PARAMETER :: M69N1MKze = 7741 - INTEGER(IntKi), PARAMETER :: M69N2MKze = 7742 - INTEGER(IntKi), PARAMETER :: M69N3MKze = 7743 - INTEGER(IntKi), PARAMETER :: M69N4MKze = 7744 - INTEGER(IntKi), PARAMETER :: M69N5MKze = 7745 - INTEGER(IntKi), PARAMETER :: M69N6MKze = 7746 - INTEGER(IntKi), PARAMETER :: M69N7MKze = 7747 - INTEGER(IntKi), PARAMETER :: M69N8MKze = 7748 - INTEGER(IntKi), PARAMETER :: M69N9MKze = 7749 - INTEGER(IntKi), PARAMETER :: M70N1MKze = 7750 - INTEGER(IntKi), PARAMETER :: M70N2MKze = 7751 - INTEGER(IntKi), PARAMETER :: M70N3MKze = 7752 - INTEGER(IntKi), PARAMETER :: M70N4MKze = 7753 - INTEGER(IntKi), PARAMETER :: M70N5MKze = 7754 - INTEGER(IntKi), PARAMETER :: M70N6MKze = 7755 - INTEGER(IntKi), PARAMETER :: M70N7MKze = 7756 - INTEGER(IntKi), PARAMETER :: M70N8MKze = 7757 - INTEGER(IntKi), PARAMETER :: M70N9MKze = 7758 - INTEGER(IntKi), PARAMETER :: M71N1MKze = 7759 - INTEGER(IntKi), PARAMETER :: M71N2MKze = 7760 - INTEGER(IntKi), PARAMETER :: M71N3MKze = 7761 - INTEGER(IntKi), PARAMETER :: M71N4MKze = 7762 - INTEGER(IntKi), PARAMETER :: M71N5MKze = 7763 - INTEGER(IntKi), PARAMETER :: M71N6MKze = 7764 - INTEGER(IntKi), PARAMETER :: M71N7MKze = 7765 - INTEGER(IntKi), PARAMETER :: M71N8MKze = 7766 - INTEGER(IntKi), PARAMETER :: M71N9MKze = 7767 - INTEGER(IntKi), PARAMETER :: M72N1MKze = 7768 - INTEGER(IntKi), PARAMETER :: M72N2MKze = 7769 - INTEGER(IntKi), PARAMETER :: M72N3MKze = 7770 - INTEGER(IntKi), PARAMETER :: M72N4MKze = 7771 - INTEGER(IntKi), PARAMETER :: M72N5MKze = 7772 - INTEGER(IntKi), PARAMETER :: M72N6MKze = 7773 - INTEGER(IntKi), PARAMETER :: M72N7MKze = 7774 - INTEGER(IntKi), PARAMETER :: M72N8MKze = 7775 - INTEGER(IntKi), PARAMETER :: M72N9MKze = 7776 - INTEGER(IntKi), PARAMETER :: M73N1MKze = 7777 - INTEGER(IntKi), PARAMETER :: M73N2MKze = 7778 - INTEGER(IntKi), PARAMETER :: M73N3MKze = 7779 - INTEGER(IntKi), PARAMETER :: M73N4MKze = 7780 - INTEGER(IntKi), PARAMETER :: M73N5MKze = 7781 - INTEGER(IntKi), PARAMETER :: M73N6MKze = 7782 - INTEGER(IntKi), PARAMETER :: M73N7MKze = 7783 - INTEGER(IntKi), PARAMETER :: M73N8MKze = 7784 - INTEGER(IntKi), PARAMETER :: M73N9MKze = 7785 - INTEGER(IntKi), PARAMETER :: M74N1MKze = 7786 - INTEGER(IntKi), PARAMETER :: M74N2MKze = 7787 - INTEGER(IntKi), PARAMETER :: M74N3MKze = 7788 - INTEGER(IntKi), PARAMETER :: M74N4MKze = 7789 - INTEGER(IntKi), PARAMETER :: M74N5MKze = 7790 - INTEGER(IntKi), PARAMETER :: M74N6MKze = 7791 - INTEGER(IntKi), PARAMETER :: M74N7MKze = 7792 - INTEGER(IntKi), PARAMETER :: M74N8MKze = 7793 - INTEGER(IntKi), PARAMETER :: M74N9MKze = 7794 - INTEGER(IntKi), PARAMETER :: M75N1MKze = 7795 - INTEGER(IntKi), PARAMETER :: M75N2MKze = 7796 - INTEGER(IntKi), PARAMETER :: M75N3MKze = 7797 - INTEGER(IntKi), PARAMETER :: M75N4MKze = 7798 - INTEGER(IntKi), PARAMETER :: M75N5MKze = 7799 - INTEGER(IntKi), PARAMETER :: M75N6MKze = 7800 - INTEGER(IntKi), PARAMETER :: M75N7MKze = 7801 - INTEGER(IntKi), PARAMETER :: M75N8MKze = 7802 - INTEGER(IntKi), PARAMETER :: M75N9MKze = 7803 - INTEGER(IntKi), PARAMETER :: M76N1MKze = 7804 - INTEGER(IntKi), PARAMETER :: M76N2MKze = 7805 - INTEGER(IntKi), PARAMETER :: M76N3MKze = 7806 - INTEGER(IntKi), PARAMETER :: M76N4MKze = 7807 - INTEGER(IntKi), PARAMETER :: M76N5MKze = 7808 - INTEGER(IntKi), PARAMETER :: M76N6MKze = 7809 - INTEGER(IntKi), PARAMETER :: M76N7MKze = 7810 - INTEGER(IntKi), PARAMETER :: M76N8MKze = 7811 - INTEGER(IntKi), PARAMETER :: M76N9MKze = 7812 - INTEGER(IntKi), PARAMETER :: M77N1MKze = 7813 - INTEGER(IntKi), PARAMETER :: M77N2MKze = 7814 - INTEGER(IntKi), PARAMETER :: M77N3MKze = 7815 - INTEGER(IntKi), PARAMETER :: M77N4MKze = 7816 - INTEGER(IntKi), PARAMETER :: M77N5MKze = 7817 - INTEGER(IntKi), PARAMETER :: M77N6MKze = 7818 - INTEGER(IntKi), PARAMETER :: M77N7MKze = 7819 - INTEGER(IntKi), PARAMETER :: M77N8MKze = 7820 - INTEGER(IntKi), PARAMETER :: M77N9MKze = 7821 - INTEGER(IntKi), PARAMETER :: M78N1MKze = 7822 - INTEGER(IntKi), PARAMETER :: M78N2MKze = 7823 - INTEGER(IntKi), PARAMETER :: M78N3MKze = 7824 - INTEGER(IntKi), PARAMETER :: M78N4MKze = 7825 - INTEGER(IntKi), PARAMETER :: M78N5MKze = 7826 - INTEGER(IntKi), PARAMETER :: M78N6MKze = 7827 - INTEGER(IntKi), PARAMETER :: M78N7MKze = 7828 - INTEGER(IntKi), PARAMETER :: M78N8MKze = 7829 - INTEGER(IntKi), PARAMETER :: M78N9MKze = 7830 - INTEGER(IntKi), PARAMETER :: M79N1MKze = 7831 - INTEGER(IntKi), PARAMETER :: M79N2MKze = 7832 - INTEGER(IntKi), PARAMETER :: M79N3MKze = 7833 - INTEGER(IntKi), PARAMETER :: M79N4MKze = 7834 - INTEGER(IntKi), PARAMETER :: M79N5MKze = 7835 - INTEGER(IntKi), PARAMETER :: M79N6MKze = 7836 - INTEGER(IntKi), PARAMETER :: M79N7MKze = 7837 - INTEGER(IntKi), PARAMETER :: M79N8MKze = 7838 - INTEGER(IntKi), PARAMETER :: M79N9MKze = 7839 - INTEGER(IntKi), PARAMETER :: M80N1MKze = 7840 - INTEGER(IntKi), PARAMETER :: M80N2MKze = 7841 - INTEGER(IntKi), PARAMETER :: M80N3MKze = 7842 - INTEGER(IntKi), PARAMETER :: M80N4MKze = 7843 - INTEGER(IntKi), PARAMETER :: M80N5MKze = 7844 - INTEGER(IntKi), PARAMETER :: M80N6MKze = 7845 - INTEGER(IntKi), PARAMETER :: M80N7MKze = 7846 - INTEGER(IntKi), PARAMETER :: M80N8MKze = 7847 - INTEGER(IntKi), PARAMETER :: M80N9MKze = 7848 - INTEGER(IntKi), PARAMETER :: M81N1MKze = 7849 - INTEGER(IntKi), PARAMETER :: M81N2MKze = 7850 - INTEGER(IntKi), PARAMETER :: M81N3MKze = 7851 - INTEGER(IntKi), PARAMETER :: M81N4MKze = 7852 - INTEGER(IntKi), PARAMETER :: M81N5MKze = 7853 - INTEGER(IntKi), PARAMETER :: M81N6MKze = 7854 - INTEGER(IntKi), PARAMETER :: M81N7MKze = 7855 - INTEGER(IntKi), PARAMETER :: M81N8MKze = 7856 - INTEGER(IntKi), PARAMETER :: M81N9MKze = 7857 - INTEGER(IntKi), PARAMETER :: M82N1MKze = 7858 - INTEGER(IntKi), PARAMETER :: M82N2MKze = 7859 - INTEGER(IntKi), PARAMETER :: M82N3MKze = 7860 - INTEGER(IntKi), PARAMETER :: M82N4MKze = 7861 - INTEGER(IntKi), PARAMETER :: M82N5MKze = 7862 - INTEGER(IntKi), PARAMETER :: M82N6MKze = 7863 - INTEGER(IntKi), PARAMETER :: M82N7MKze = 7864 - INTEGER(IntKi), PARAMETER :: M82N8MKze = 7865 - INTEGER(IntKi), PARAMETER :: M82N9MKze = 7866 - INTEGER(IntKi), PARAMETER :: M83N1MKze = 7867 - INTEGER(IntKi), PARAMETER :: M83N2MKze = 7868 - INTEGER(IntKi), PARAMETER :: M83N3MKze = 7869 - INTEGER(IntKi), PARAMETER :: M83N4MKze = 7870 - INTEGER(IntKi), PARAMETER :: M83N5MKze = 7871 - INTEGER(IntKi), PARAMETER :: M83N6MKze = 7872 - INTEGER(IntKi), PARAMETER :: M83N7MKze = 7873 - INTEGER(IntKi), PARAMETER :: M83N8MKze = 7874 - INTEGER(IntKi), PARAMETER :: M83N9MKze = 7875 - INTEGER(IntKi), PARAMETER :: M84N1MKze = 7876 - INTEGER(IntKi), PARAMETER :: M84N2MKze = 7877 - INTEGER(IntKi), PARAMETER :: M84N3MKze = 7878 - INTEGER(IntKi), PARAMETER :: M84N4MKze = 7879 - INTEGER(IntKi), PARAMETER :: M84N5MKze = 7880 - INTEGER(IntKi), PARAMETER :: M84N6MKze = 7881 - INTEGER(IntKi), PARAMETER :: M84N7MKze = 7882 - INTEGER(IntKi), PARAMETER :: M84N8MKze = 7883 - INTEGER(IntKi), PARAMETER :: M84N9MKze = 7884 - INTEGER(IntKi), PARAMETER :: M85N1MKze = 7885 - INTEGER(IntKi), PARAMETER :: M85N2MKze = 7886 - INTEGER(IntKi), PARAMETER :: M85N3MKze = 7887 - INTEGER(IntKi), PARAMETER :: M85N4MKze = 7888 - INTEGER(IntKi), PARAMETER :: M85N5MKze = 7889 - INTEGER(IntKi), PARAMETER :: M85N6MKze = 7890 - INTEGER(IntKi), PARAMETER :: M85N7MKze = 7891 - INTEGER(IntKi), PARAMETER :: M85N8MKze = 7892 - INTEGER(IntKi), PARAMETER :: M85N9MKze = 7893 - INTEGER(IntKi), PARAMETER :: M86N1MKze = 7894 - INTEGER(IntKi), PARAMETER :: M86N2MKze = 7895 - INTEGER(IntKi), PARAMETER :: M86N3MKze = 7896 - INTEGER(IntKi), PARAMETER :: M86N4MKze = 7897 - INTEGER(IntKi), PARAMETER :: M86N5MKze = 7898 - INTEGER(IntKi), PARAMETER :: M86N6MKze = 7899 - INTEGER(IntKi), PARAMETER :: M86N7MKze = 7900 - INTEGER(IntKi), PARAMETER :: M86N8MKze = 7901 - INTEGER(IntKi), PARAMETER :: M86N9MKze = 7902 - INTEGER(IntKi), PARAMETER :: M87N1MKze = 7903 - INTEGER(IntKi), PARAMETER :: M87N2MKze = 7904 - INTEGER(IntKi), PARAMETER :: M87N3MKze = 7905 - INTEGER(IntKi), PARAMETER :: M87N4MKze = 7906 - INTEGER(IntKi), PARAMETER :: M87N5MKze = 7907 - INTEGER(IntKi), PARAMETER :: M87N6MKze = 7908 - INTEGER(IntKi), PARAMETER :: M87N7MKze = 7909 - INTEGER(IntKi), PARAMETER :: M87N8MKze = 7910 - INTEGER(IntKi), PARAMETER :: M87N9MKze = 7911 - INTEGER(IntKi), PARAMETER :: M88N1MKze = 7912 - INTEGER(IntKi), PARAMETER :: M88N2MKze = 7913 - INTEGER(IntKi), PARAMETER :: M88N3MKze = 7914 - INTEGER(IntKi), PARAMETER :: M88N4MKze = 7915 - INTEGER(IntKi), PARAMETER :: M88N5MKze = 7916 - INTEGER(IntKi), PARAMETER :: M88N6MKze = 7917 - INTEGER(IntKi), PARAMETER :: M88N7MKze = 7918 - INTEGER(IntKi), PARAMETER :: M88N8MKze = 7919 - INTEGER(IntKi), PARAMETER :: M88N9MKze = 7920 - INTEGER(IntKi), PARAMETER :: M89N1MKze = 7921 - INTEGER(IntKi), PARAMETER :: M89N2MKze = 7922 - INTEGER(IntKi), PARAMETER :: M89N3MKze = 7923 - INTEGER(IntKi), PARAMETER :: M89N4MKze = 7924 - INTEGER(IntKi), PARAMETER :: M89N5MKze = 7925 - INTEGER(IntKi), PARAMETER :: M89N6MKze = 7926 - INTEGER(IntKi), PARAMETER :: M89N7MKze = 7927 - INTEGER(IntKi), PARAMETER :: M89N8MKze = 7928 - INTEGER(IntKi), PARAMETER :: M89N9MKze = 7929 - INTEGER(IntKi), PARAMETER :: M90N1MKze = 7930 - INTEGER(IntKi), PARAMETER :: M90N2MKze = 7931 - INTEGER(IntKi), PARAMETER :: M90N3MKze = 7932 - INTEGER(IntKi), PARAMETER :: M90N4MKze = 7933 - INTEGER(IntKi), PARAMETER :: M90N5MKze = 7934 - INTEGER(IntKi), PARAMETER :: M90N6MKze = 7935 - INTEGER(IntKi), PARAMETER :: M90N7MKze = 7936 - INTEGER(IntKi), PARAMETER :: M90N8MKze = 7937 - INTEGER(IntKi), PARAMETER :: M90N9MKze = 7938 - INTEGER(IntKi), PARAMETER :: M91N1MKze = 7939 - INTEGER(IntKi), PARAMETER :: M91N2MKze = 7940 - INTEGER(IntKi), PARAMETER :: M91N3MKze = 7941 - INTEGER(IntKi), PARAMETER :: M91N4MKze = 7942 - INTEGER(IntKi), PARAMETER :: M91N5MKze = 7943 - INTEGER(IntKi), PARAMETER :: M91N6MKze = 7944 - INTEGER(IntKi), PARAMETER :: M91N7MKze = 7945 - INTEGER(IntKi), PARAMETER :: M91N8MKze = 7946 - INTEGER(IntKi), PARAMETER :: M91N9MKze = 7947 - INTEGER(IntKi), PARAMETER :: M92N1MKze = 7948 - INTEGER(IntKi), PARAMETER :: M92N2MKze = 7949 - INTEGER(IntKi), PARAMETER :: M92N3MKze = 7950 - INTEGER(IntKi), PARAMETER :: M92N4MKze = 7951 - INTEGER(IntKi), PARAMETER :: M92N5MKze = 7952 - INTEGER(IntKi), PARAMETER :: M92N6MKze = 7953 - INTEGER(IntKi), PARAMETER :: M92N7MKze = 7954 - INTEGER(IntKi), PARAMETER :: M92N8MKze = 7955 - INTEGER(IntKi), PARAMETER :: M92N9MKze = 7956 - INTEGER(IntKi), PARAMETER :: M93N1MKze = 7957 - INTEGER(IntKi), PARAMETER :: M93N2MKze = 7958 - INTEGER(IntKi), PARAMETER :: M93N3MKze = 7959 - INTEGER(IntKi), PARAMETER :: M93N4MKze = 7960 - INTEGER(IntKi), PARAMETER :: M93N5MKze = 7961 - INTEGER(IntKi), PARAMETER :: M93N6MKze = 7962 - INTEGER(IntKi), PARAMETER :: M93N7MKze = 7963 - INTEGER(IntKi), PARAMETER :: M93N8MKze = 7964 - INTEGER(IntKi), PARAMETER :: M93N9MKze = 7965 - INTEGER(IntKi), PARAMETER :: M94N1MKze = 7966 - INTEGER(IntKi), PARAMETER :: M94N2MKze = 7967 - INTEGER(IntKi), PARAMETER :: M94N3MKze = 7968 - INTEGER(IntKi), PARAMETER :: M94N4MKze = 7969 - INTEGER(IntKi), PARAMETER :: M94N5MKze = 7970 - INTEGER(IntKi), PARAMETER :: M94N6MKze = 7971 - INTEGER(IntKi), PARAMETER :: M94N7MKze = 7972 - INTEGER(IntKi), PARAMETER :: M94N8MKze = 7973 - INTEGER(IntKi), PARAMETER :: M94N9MKze = 7974 - INTEGER(IntKi), PARAMETER :: M95N1MKze = 7975 - INTEGER(IntKi), PARAMETER :: M95N2MKze = 7976 - INTEGER(IntKi), PARAMETER :: M95N3MKze = 7977 - INTEGER(IntKi), PARAMETER :: M95N4MKze = 7978 - INTEGER(IntKi), PARAMETER :: M95N5MKze = 7979 - INTEGER(IntKi), PARAMETER :: M95N6MKze = 7980 - INTEGER(IntKi), PARAMETER :: M95N7MKze = 7981 - INTEGER(IntKi), PARAMETER :: M95N8MKze = 7982 - INTEGER(IntKi), PARAMETER :: M95N9MKze = 7983 - INTEGER(IntKi), PARAMETER :: M96N1MKze = 7984 - INTEGER(IntKi), PARAMETER :: M96N2MKze = 7985 - INTEGER(IntKi), PARAMETER :: M96N3MKze = 7986 - INTEGER(IntKi), PARAMETER :: M96N4MKze = 7987 - INTEGER(IntKi), PARAMETER :: M96N5MKze = 7988 - INTEGER(IntKi), PARAMETER :: M96N6MKze = 7989 - INTEGER(IntKi), PARAMETER :: M96N7MKze = 7990 - INTEGER(IntKi), PARAMETER :: M96N8MKze = 7991 - INTEGER(IntKi), PARAMETER :: M96N9MKze = 7992 - INTEGER(IntKi), PARAMETER :: M97N1MKze = 7993 - INTEGER(IntKi), PARAMETER :: M97N2MKze = 7994 - INTEGER(IntKi), PARAMETER :: M97N3MKze = 7995 - INTEGER(IntKi), PARAMETER :: M97N4MKze = 7996 - INTEGER(IntKi), PARAMETER :: M97N5MKze = 7997 - INTEGER(IntKi), PARAMETER :: M97N6MKze = 7998 - INTEGER(IntKi), PARAMETER :: M97N7MKze = 7999 - INTEGER(IntKi), PARAMETER :: M97N8MKze = 8000 - INTEGER(IntKi), PARAMETER :: M97N9MKze = 8001 - INTEGER(IntKi), PARAMETER :: M98N1MKze = 8002 - INTEGER(IntKi), PARAMETER :: M98N2MKze = 8003 - INTEGER(IntKi), PARAMETER :: M98N3MKze = 8004 - INTEGER(IntKi), PARAMETER :: M98N4MKze = 8005 - INTEGER(IntKi), PARAMETER :: M98N5MKze = 8006 - INTEGER(IntKi), PARAMETER :: M98N6MKze = 8007 - INTEGER(IntKi), PARAMETER :: M98N7MKze = 8008 - INTEGER(IntKi), PARAMETER :: M98N8MKze = 8009 - INTEGER(IntKi), PARAMETER :: M98N9MKze = 8010 - INTEGER(IntKi), PARAMETER :: M99N1MKze = 8011 - INTEGER(IntKi), PARAMETER :: M99N2MKze = 8012 - INTEGER(IntKi), PARAMETER :: M99N3MKze = 8013 - INTEGER(IntKi), PARAMETER :: M99N4MKze = 8014 - INTEGER(IntKi), PARAMETER :: M99N5MKze = 8015 - INTEGER(IntKi), PARAMETER :: M99N6MKze = 8016 - INTEGER(IntKi), PARAMETER :: M99N7MKze = 8017 - INTEGER(IntKi), PARAMETER :: M99N8MKze = 8018 - INTEGER(IntKi), PARAMETER :: M99N9MKze = 8019 - INTEGER(IntKi), PARAMETER :: M01N1MMxe = 8020 - INTEGER(IntKi), PARAMETER :: M01N2MMxe = 8021 - INTEGER(IntKi), PARAMETER :: M01N3MMxe = 8022 - INTEGER(IntKi), PARAMETER :: M01N4MMxe = 8023 - INTEGER(IntKi), PARAMETER :: M01N5MMxe = 8024 - INTEGER(IntKi), PARAMETER :: M01N6MMxe = 8025 - INTEGER(IntKi), PARAMETER :: M01N7MMxe = 8026 - INTEGER(IntKi), PARAMETER :: M01N8MMxe = 8027 - INTEGER(IntKi), PARAMETER :: M01N9MMxe = 8028 - INTEGER(IntKi), PARAMETER :: M02N1MMxe = 8029 - INTEGER(IntKi), PARAMETER :: M02N2MMxe = 8030 - INTEGER(IntKi), PARAMETER :: M02N3MMxe = 8031 - INTEGER(IntKi), PARAMETER :: M02N4MMxe = 8032 - INTEGER(IntKi), PARAMETER :: M02N5MMxe = 8033 - INTEGER(IntKi), PARAMETER :: M02N6MMxe = 8034 - INTEGER(IntKi), PARAMETER :: M02N7MMxe = 8035 - INTEGER(IntKi), PARAMETER :: M02N8MMxe = 8036 - INTEGER(IntKi), PARAMETER :: M02N9MMxe = 8037 - INTEGER(IntKi), PARAMETER :: M03N1MMxe = 8038 - INTEGER(IntKi), PARAMETER :: M03N2MMxe = 8039 - INTEGER(IntKi), PARAMETER :: M03N3MMxe = 8040 - INTEGER(IntKi), PARAMETER :: M03N4MMxe = 8041 - INTEGER(IntKi), PARAMETER :: M03N5MMxe = 8042 - INTEGER(IntKi), PARAMETER :: M03N6MMxe = 8043 - INTEGER(IntKi), PARAMETER :: M03N7MMxe = 8044 - INTEGER(IntKi), PARAMETER :: M03N8MMxe = 8045 - INTEGER(IntKi), PARAMETER :: M03N9MMxe = 8046 - INTEGER(IntKi), PARAMETER :: M04N1MMxe = 8047 - INTEGER(IntKi), PARAMETER :: M04N2MMxe = 8048 - INTEGER(IntKi), PARAMETER :: M04N3MMxe = 8049 - INTEGER(IntKi), PARAMETER :: M04N4MMxe = 8050 - INTEGER(IntKi), PARAMETER :: M04N5MMxe = 8051 - INTEGER(IntKi), PARAMETER :: M04N6MMxe = 8052 - INTEGER(IntKi), PARAMETER :: M04N7MMxe = 8053 - INTEGER(IntKi), PARAMETER :: M04N8MMxe = 8054 - INTEGER(IntKi), PARAMETER :: M04N9MMxe = 8055 - INTEGER(IntKi), PARAMETER :: M05N1MMxe = 8056 - INTEGER(IntKi), PARAMETER :: M05N2MMxe = 8057 - INTEGER(IntKi), PARAMETER :: M05N3MMxe = 8058 - INTEGER(IntKi), PARAMETER :: M05N4MMxe = 8059 - INTEGER(IntKi), PARAMETER :: M05N5MMxe = 8060 - INTEGER(IntKi), PARAMETER :: M05N6MMxe = 8061 - INTEGER(IntKi), PARAMETER :: M05N7MMxe = 8062 - INTEGER(IntKi), PARAMETER :: M05N8MMxe = 8063 - INTEGER(IntKi), PARAMETER :: M05N9MMxe = 8064 - INTEGER(IntKi), PARAMETER :: M06N1MMxe = 8065 - INTEGER(IntKi), PARAMETER :: M06N2MMxe = 8066 - INTEGER(IntKi), PARAMETER :: M06N3MMxe = 8067 - INTEGER(IntKi), PARAMETER :: M06N4MMxe = 8068 - INTEGER(IntKi), PARAMETER :: M06N5MMxe = 8069 - INTEGER(IntKi), PARAMETER :: M06N6MMxe = 8070 - INTEGER(IntKi), PARAMETER :: M06N7MMxe = 8071 - INTEGER(IntKi), PARAMETER :: M06N8MMxe = 8072 - INTEGER(IntKi), PARAMETER :: M06N9MMxe = 8073 - INTEGER(IntKi), PARAMETER :: M07N1MMxe = 8074 - INTEGER(IntKi), PARAMETER :: M07N2MMxe = 8075 - INTEGER(IntKi), PARAMETER :: M07N3MMxe = 8076 - INTEGER(IntKi), PARAMETER :: M07N4MMxe = 8077 - INTEGER(IntKi), PARAMETER :: M07N5MMxe = 8078 - INTEGER(IntKi), PARAMETER :: M07N6MMxe = 8079 - INTEGER(IntKi), PARAMETER :: M07N7MMxe = 8080 - INTEGER(IntKi), PARAMETER :: M07N8MMxe = 8081 - INTEGER(IntKi), PARAMETER :: M07N9MMxe = 8082 - INTEGER(IntKi), PARAMETER :: M08N1MMxe = 8083 - INTEGER(IntKi), PARAMETER :: M08N2MMxe = 8084 - INTEGER(IntKi), PARAMETER :: M08N3MMxe = 8085 - INTEGER(IntKi), PARAMETER :: M08N4MMxe = 8086 - INTEGER(IntKi), PARAMETER :: M08N5MMxe = 8087 - INTEGER(IntKi), PARAMETER :: M08N6MMxe = 8088 - INTEGER(IntKi), PARAMETER :: M08N7MMxe = 8089 - INTEGER(IntKi), PARAMETER :: M08N8MMxe = 8090 - INTEGER(IntKi), PARAMETER :: M08N9MMxe = 8091 - INTEGER(IntKi), PARAMETER :: M09N1MMxe = 8092 - INTEGER(IntKi), PARAMETER :: M09N2MMxe = 8093 - INTEGER(IntKi), PARAMETER :: M09N3MMxe = 8094 - INTEGER(IntKi), PARAMETER :: M09N4MMxe = 8095 - INTEGER(IntKi), PARAMETER :: M09N5MMxe = 8096 - INTEGER(IntKi), PARAMETER :: M09N6MMxe = 8097 - INTEGER(IntKi), PARAMETER :: M09N7MMxe = 8098 - INTEGER(IntKi), PARAMETER :: M09N8MMxe = 8099 - INTEGER(IntKi), PARAMETER :: M09N9MMxe = 8100 - INTEGER(IntKi), PARAMETER :: M10N1MMxe = 8101 - INTEGER(IntKi), PARAMETER :: M10N2MMxe = 8102 - INTEGER(IntKi), PARAMETER :: M10N3MMxe = 8103 - INTEGER(IntKi), PARAMETER :: M10N4MMxe = 8104 - INTEGER(IntKi), PARAMETER :: M10N5MMxe = 8105 - INTEGER(IntKi), PARAMETER :: M10N6MMxe = 8106 - INTEGER(IntKi), PARAMETER :: M10N7MMxe = 8107 - INTEGER(IntKi), PARAMETER :: M10N8MMxe = 8108 - INTEGER(IntKi), PARAMETER :: M10N9MMxe = 8109 - INTEGER(IntKi), PARAMETER :: M11N1MMxe = 8110 - INTEGER(IntKi), PARAMETER :: M11N2MMxe = 8111 - INTEGER(IntKi), PARAMETER :: M11N3MMxe = 8112 - INTEGER(IntKi), PARAMETER :: M11N4MMxe = 8113 - INTEGER(IntKi), PARAMETER :: M11N5MMxe = 8114 - INTEGER(IntKi), PARAMETER :: M11N6MMxe = 8115 - INTEGER(IntKi), PARAMETER :: M11N7MMxe = 8116 - INTEGER(IntKi), PARAMETER :: M11N8MMxe = 8117 - INTEGER(IntKi), PARAMETER :: M11N9MMxe = 8118 - INTEGER(IntKi), PARAMETER :: M12N1MMxe = 8119 - INTEGER(IntKi), PARAMETER :: M12N2MMxe = 8120 - INTEGER(IntKi), PARAMETER :: M12N3MMxe = 8121 - INTEGER(IntKi), PARAMETER :: M12N4MMxe = 8122 - INTEGER(IntKi), PARAMETER :: M12N5MMxe = 8123 - INTEGER(IntKi), PARAMETER :: M12N6MMxe = 8124 - INTEGER(IntKi), PARAMETER :: M12N7MMxe = 8125 - INTEGER(IntKi), PARAMETER :: M12N8MMxe = 8126 - INTEGER(IntKi), PARAMETER :: M12N9MMxe = 8127 - INTEGER(IntKi), PARAMETER :: M13N1MMxe = 8128 - INTEGER(IntKi), PARAMETER :: M13N2MMxe = 8129 - INTEGER(IntKi), PARAMETER :: M13N3MMxe = 8130 - INTEGER(IntKi), PARAMETER :: M13N4MMxe = 8131 - INTEGER(IntKi), PARAMETER :: M13N5MMxe = 8132 - INTEGER(IntKi), PARAMETER :: M13N6MMxe = 8133 - INTEGER(IntKi), PARAMETER :: M13N7MMxe = 8134 - INTEGER(IntKi), PARAMETER :: M13N8MMxe = 8135 - INTEGER(IntKi), PARAMETER :: M13N9MMxe = 8136 - INTEGER(IntKi), PARAMETER :: M14N1MMxe = 8137 - INTEGER(IntKi), PARAMETER :: M14N2MMxe = 8138 - INTEGER(IntKi), PARAMETER :: M14N3MMxe = 8139 - INTEGER(IntKi), PARAMETER :: M14N4MMxe = 8140 - INTEGER(IntKi), PARAMETER :: M14N5MMxe = 8141 - INTEGER(IntKi), PARAMETER :: M14N6MMxe = 8142 - INTEGER(IntKi), PARAMETER :: M14N7MMxe = 8143 - INTEGER(IntKi), PARAMETER :: M14N8MMxe = 8144 - INTEGER(IntKi), PARAMETER :: M14N9MMxe = 8145 - INTEGER(IntKi), PARAMETER :: M15N1MMxe = 8146 - INTEGER(IntKi), PARAMETER :: M15N2MMxe = 8147 - INTEGER(IntKi), PARAMETER :: M15N3MMxe = 8148 - INTEGER(IntKi), PARAMETER :: M15N4MMxe = 8149 - INTEGER(IntKi), PARAMETER :: M15N5MMxe = 8150 - INTEGER(IntKi), PARAMETER :: M15N6MMxe = 8151 - INTEGER(IntKi), PARAMETER :: M15N7MMxe = 8152 - INTEGER(IntKi), PARAMETER :: M15N8MMxe = 8153 - INTEGER(IntKi), PARAMETER :: M15N9MMxe = 8154 - INTEGER(IntKi), PARAMETER :: M16N1MMxe = 8155 - INTEGER(IntKi), PARAMETER :: M16N2MMxe = 8156 - INTEGER(IntKi), PARAMETER :: M16N3MMxe = 8157 - INTEGER(IntKi), PARAMETER :: M16N4MMxe = 8158 - INTEGER(IntKi), PARAMETER :: M16N5MMxe = 8159 - INTEGER(IntKi), PARAMETER :: M16N6MMxe = 8160 - INTEGER(IntKi), PARAMETER :: M16N7MMxe = 8161 - INTEGER(IntKi), PARAMETER :: M16N8MMxe = 8162 - INTEGER(IntKi), PARAMETER :: M16N9MMxe = 8163 - INTEGER(IntKi), PARAMETER :: M17N1MMxe = 8164 - INTEGER(IntKi), PARAMETER :: M17N2MMxe = 8165 - INTEGER(IntKi), PARAMETER :: M17N3MMxe = 8166 - INTEGER(IntKi), PARAMETER :: M17N4MMxe = 8167 - INTEGER(IntKi), PARAMETER :: M17N5MMxe = 8168 - INTEGER(IntKi), PARAMETER :: M17N6MMxe = 8169 - INTEGER(IntKi), PARAMETER :: M17N7MMxe = 8170 - INTEGER(IntKi), PARAMETER :: M17N8MMxe = 8171 - INTEGER(IntKi), PARAMETER :: M17N9MMxe = 8172 - INTEGER(IntKi), PARAMETER :: M18N1MMxe = 8173 - INTEGER(IntKi), PARAMETER :: M18N2MMxe = 8174 - INTEGER(IntKi), PARAMETER :: M18N3MMxe = 8175 - INTEGER(IntKi), PARAMETER :: M18N4MMxe = 8176 - INTEGER(IntKi), PARAMETER :: M18N5MMxe = 8177 - INTEGER(IntKi), PARAMETER :: M18N6MMxe = 8178 - INTEGER(IntKi), PARAMETER :: M18N7MMxe = 8179 - INTEGER(IntKi), PARAMETER :: M18N8MMxe = 8180 - INTEGER(IntKi), PARAMETER :: M18N9MMxe = 8181 - INTEGER(IntKi), PARAMETER :: M19N1MMxe = 8182 - INTEGER(IntKi), PARAMETER :: M19N2MMxe = 8183 - INTEGER(IntKi), PARAMETER :: M19N3MMxe = 8184 - INTEGER(IntKi), PARAMETER :: M19N4MMxe = 8185 - INTEGER(IntKi), PARAMETER :: M19N5MMxe = 8186 - INTEGER(IntKi), PARAMETER :: M19N6MMxe = 8187 - INTEGER(IntKi), PARAMETER :: M19N7MMxe = 8188 - INTEGER(IntKi), PARAMETER :: M19N8MMxe = 8189 - INTEGER(IntKi), PARAMETER :: M19N9MMxe = 8190 - INTEGER(IntKi), PARAMETER :: M20N1MMxe = 8191 - INTEGER(IntKi), PARAMETER :: M20N2MMxe = 8192 - INTEGER(IntKi), PARAMETER :: M20N3MMxe = 8193 - INTEGER(IntKi), PARAMETER :: M20N4MMxe = 8194 - INTEGER(IntKi), PARAMETER :: M20N5MMxe = 8195 - INTEGER(IntKi), PARAMETER :: M20N6MMxe = 8196 - INTEGER(IntKi), PARAMETER :: M20N7MMxe = 8197 - INTEGER(IntKi), PARAMETER :: M20N8MMxe = 8198 - INTEGER(IntKi), PARAMETER :: M20N9MMxe = 8199 - INTEGER(IntKi), PARAMETER :: M21N1MMxe = 8200 - INTEGER(IntKi), PARAMETER :: M21N2MMxe = 8201 - INTEGER(IntKi), PARAMETER :: M21N3MMxe = 8202 - INTEGER(IntKi), PARAMETER :: M21N4MMxe = 8203 - INTEGER(IntKi), PARAMETER :: M21N5MMxe = 8204 - INTEGER(IntKi), PARAMETER :: M21N6MMxe = 8205 - INTEGER(IntKi), PARAMETER :: M21N7MMxe = 8206 - INTEGER(IntKi), PARAMETER :: M21N8MMxe = 8207 - INTEGER(IntKi), PARAMETER :: M21N9MMxe = 8208 - INTEGER(IntKi), PARAMETER :: M22N1MMxe = 8209 - INTEGER(IntKi), PARAMETER :: M22N2MMxe = 8210 - INTEGER(IntKi), PARAMETER :: M22N3MMxe = 8211 - INTEGER(IntKi), PARAMETER :: M22N4MMxe = 8212 - INTEGER(IntKi), PARAMETER :: M22N5MMxe = 8213 - INTEGER(IntKi), PARAMETER :: M22N6MMxe = 8214 - INTEGER(IntKi), PARAMETER :: M22N7MMxe = 8215 - INTEGER(IntKi), PARAMETER :: M22N8MMxe = 8216 - INTEGER(IntKi), PARAMETER :: M22N9MMxe = 8217 - INTEGER(IntKi), PARAMETER :: M23N1MMxe = 8218 - INTEGER(IntKi), PARAMETER :: M23N2MMxe = 8219 - INTEGER(IntKi), PARAMETER :: M23N3MMxe = 8220 - INTEGER(IntKi), PARAMETER :: M23N4MMxe = 8221 - INTEGER(IntKi), PARAMETER :: M23N5MMxe = 8222 - INTEGER(IntKi), PARAMETER :: M23N6MMxe = 8223 - INTEGER(IntKi), PARAMETER :: M23N7MMxe = 8224 - INTEGER(IntKi), PARAMETER :: M23N8MMxe = 8225 - INTEGER(IntKi), PARAMETER :: M23N9MMxe = 8226 - INTEGER(IntKi), PARAMETER :: M24N1MMxe = 8227 - INTEGER(IntKi), PARAMETER :: M24N2MMxe = 8228 - INTEGER(IntKi), PARAMETER :: M24N3MMxe = 8229 - INTEGER(IntKi), PARAMETER :: M24N4MMxe = 8230 - INTEGER(IntKi), PARAMETER :: M24N5MMxe = 8231 - INTEGER(IntKi), PARAMETER :: M24N6MMxe = 8232 - INTEGER(IntKi), PARAMETER :: M24N7MMxe = 8233 - INTEGER(IntKi), PARAMETER :: M24N8MMxe = 8234 - INTEGER(IntKi), PARAMETER :: M24N9MMxe = 8235 - INTEGER(IntKi), PARAMETER :: M25N1MMxe = 8236 - INTEGER(IntKi), PARAMETER :: M25N2MMxe = 8237 - INTEGER(IntKi), PARAMETER :: M25N3MMxe = 8238 - INTEGER(IntKi), PARAMETER :: M25N4MMxe = 8239 - INTEGER(IntKi), PARAMETER :: M25N5MMxe = 8240 - INTEGER(IntKi), PARAMETER :: M25N6MMxe = 8241 - INTEGER(IntKi), PARAMETER :: M25N7MMxe = 8242 - INTEGER(IntKi), PARAMETER :: M25N8MMxe = 8243 - INTEGER(IntKi), PARAMETER :: M25N9MMxe = 8244 - INTEGER(IntKi), PARAMETER :: M26N1MMxe = 8245 - INTEGER(IntKi), PARAMETER :: M26N2MMxe = 8246 - INTEGER(IntKi), PARAMETER :: M26N3MMxe = 8247 - INTEGER(IntKi), PARAMETER :: M26N4MMxe = 8248 - INTEGER(IntKi), PARAMETER :: M26N5MMxe = 8249 - INTEGER(IntKi), PARAMETER :: M26N6MMxe = 8250 - INTEGER(IntKi), PARAMETER :: M26N7MMxe = 8251 - INTEGER(IntKi), PARAMETER :: M26N8MMxe = 8252 - INTEGER(IntKi), PARAMETER :: M26N9MMxe = 8253 - INTEGER(IntKi), PARAMETER :: M27N1MMxe = 8254 - INTEGER(IntKi), PARAMETER :: M27N2MMxe = 8255 - INTEGER(IntKi), PARAMETER :: M27N3MMxe = 8256 - INTEGER(IntKi), PARAMETER :: M27N4MMxe = 8257 - INTEGER(IntKi), PARAMETER :: M27N5MMxe = 8258 - INTEGER(IntKi), PARAMETER :: M27N6MMxe = 8259 - INTEGER(IntKi), PARAMETER :: M27N7MMxe = 8260 - INTEGER(IntKi), PARAMETER :: M27N8MMxe = 8261 - INTEGER(IntKi), PARAMETER :: M27N9MMxe = 8262 - INTEGER(IntKi), PARAMETER :: M28N1MMxe = 8263 - INTEGER(IntKi), PARAMETER :: M28N2MMxe = 8264 - INTEGER(IntKi), PARAMETER :: M28N3MMxe = 8265 - INTEGER(IntKi), PARAMETER :: M28N4MMxe = 8266 - INTEGER(IntKi), PARAMETER :: M28N5MMxe = 8267 - INTEGER(IntKi), PARAMETER :: M28N6MMxe = 8268 - INTEGER(IntKi), PARAMETER :: M28N7MMxe = 8269 - INTEGER(IntKi), PARAMETER :: M28N8MMxe = 8270 - INTEGER(IntKi), PARAMETER :: M28N9MMxe = 8271 - INTEGER(IntKi), PARAMETER :: M29N1MMxe = 8272 - INTEGER(IntKi), PARAMETER :: M29N2MMxe = 8273 - INTEGER(IntKi), PARAMETER :: M29N3MMxe = 8274 - INTEGER(IntKi), PARAMETER :: M29N4MMxe = 8275 - INTEGER(IntKi), PARAMETER :: M29N5MMxe = 8276 - INTEGER(IntKi), PARAMETER :: M29N6MMxe = 8277 - INTEGER(IntKi), PARAMETER :: M29N7MMxe = 8278 - INTEGER(IntKi), PARAMETER :: M29N8MMxe = 8279 - INTEGER(IntKi), PARAMETER :: M29N9MMxe = 8280 - INTEGER(IntKi), PARAMETER :: M30N1MMxe = 8281 - INTEGER(IntKi), PARAMETER :: M30N2MMxe = 8282 - INTEGER(IntKi), PARAMETER :: M30N3MMxe = 8283 - INTEGER(IntKi), PARAMETER :: M30N4MMxe = 8284 - INTEGER(IntKi), PARAMETER :: M30N5MMxe = 8285 - INTEGER(IntKi), PARAMETER :: M30N6MMxe = 8286 - INTEGER(IntKi), PARAMETER :: M30N7MMxe = 8287 - INTEGER(IntKi), PARAMETER :: M30N8MMxe = 8288 - INTEGER(IntKi), PARAMETER :: M30N9MMxe = 8289 - INTEGER(IntKi), PARAMETER :: M31N1MMxe = 8290 - INTEGER(IntKi), PARAMETER :: M31N2MMxe = 8291 - INTEGER(IntKi), PARAMETER :: M31N3MMxe = 8292 - INTEGER(IntKi), PARAMETER :: M31N4MMxe = 8293 - INTEGER(IntKi), PARAMETER :: M31N5MMxe = 8294 - INTEGER(IntKi), PARAMETER :: M31N6MMxe = 8295 - INTEGER(IntKi), PARAMETER :: M31N7MMxe = 8296 - INTEGER(IntKi), PARAMETER :: M31N8MMxe = 8297 - INTEGER(IntKi), PARAMETER :: M31N9MMxe = 8298 - INTEGER(IntKi), PARAMETER :: M32N1MMxe = 8299 - INTEGER(IntKi), PARAMETER :: M32N2MMxe = 8300 - INTEGER(IntKi), PARAMETER :: M32N3MMxe = 8301 - INTEGER(IntKi), PARAMETER :: M32N4MMxe = 8302 - INTEGER(IntKi), PARAMETER :: M32N5MMxe = 8303 - INTEGER(IntKi), PARAMETER :: M32N6MMxe = 8304 - INTEGER(IntKi), PARAMETER :: M32N7MMxe = 8305 - INTEGER(IntKi), PARAMETER :: M32N8MMxe = 8306 - INTEGER(IntKi), PARAMETER :: M32N9MMxe = 8307 - INTEGER(IntKi), PARAMETER :: M33N1MMxe = 8308 - INTEGER(IntKi), PARAMETER :: M33N2MMxe = 8309 - INTEGER(IntKi), PARAMETER :: M33N3MMxe = 8310 - INTEGER(IntKi), PARAMETER :: M33N4MMxe = 8311 - INTEGER(IntKi), PARAMETER :: M33N5MMxe = 8312 - INTEGER(IntKi), PARAMETER :: M33N6MMxe = 8313 - INTEGER(IntKi), PARAMETER :: M33N7MMxe = 8314 - INTEGER(IntKi), PARAMETER :: M33N8MMxe = 8315 - INTEGER(IntKi), PARAMETER :: M33N9MMxe = 8316 - INTEGER(IntKi), PARAMETER :: M34N1MMxe = 8317 - INTEGER(IntKi), PARAMETER :: M34N2MMxe = 8318 - INTEGER(IntKi), PARAMETER :: M34N3MMxe = 8319 - INTEGER(IntKi), PARAMETER :: M34N4MMxe = 8320 - INTEGER(IntKi), PARAMETER :: M34N5MMxe = 8321 - INTEGER(IntKi), PARAMETER :: M34N6MMxe = 8322 - INTEGER(IntKi), PARAMETER :: M34N7MMxe = 8323 - INTEGER(IntKi), PARAMETER :: M34N8MMxe = 8324 - INTEGER(IntKi), PARAMETER :: M34N9MMxe = 8325 - INTEGER(IntKi), PARAMETER :: M35N1MMxe = 8326 - INTEGER(IntKi), PARAMETER :: M35N2MMxe = 8327 - INTEGER(IntKi), PARAMETER :: M35N3MMxe = 8328 - INTEGER(IntKi), PARAMETER :: M35N4MMxe = 8329 - INTEGER(IntKi), PARAMETER :: M35N5MMxe = 8330 - INTEGER(IntKi), PARAMETER :: M35N6MMxe = 8331 - INTEGER(IntKi), PARAMETER :: M35N7MMxe = 8332 - INTEGER(IntKi), PARAMETER :: M35N8MMxe = 8333 - INTEGER(IntKi), PARAMETER :: M35N9MMxe = 8334 - INTEGER(IntKi), PARAMETER :: M36N1MMxe = 8335 - INTEGER(IntKi), PARAMETER :: M36N2MMxe = 8336 - INTEGER(IntKi), PARAMETER :: M36N3MMxe = 8337 - INTEGER(IntKi), PARAMETER :: M36N4MMxe = 8338 - INTEGER(IntKi), PARAMETER :: M36N5MMxe = 8339 - INTEGER(IntKi), PARAMETER :: M36N6MMxe = 8340 - INTEGER(IntKi), PARAMETER :: M36N7MMxe = 8341 - INTEGER(IntKi), PARAMETER :: M36N8MMxe = 8342 - INTEGER(IntKi), PARAMETER :: M36N9MMxe = 8343 - INTEGER(IntKi), PARAMETER :: M37N1MMxe = 8344 - INTEGER(IntKi), PARAMETER :: M37N2MMxe = 8345 - INTEGER(IntKi), PARAMETER :: M37N3MMxe = 8346 - INTEGER(IntKi), PARAMETER :: M37N4MMxe = 8347 - INTEGER(IntKi), PARAMETER :: M37N5MMxe = 8348 - INTEGER(IntKi), PARAMETER :: M37N6MMxe = 8349 - INTEGER(IntKi), PARAMETER :: M37N7MMxe = 8350 - INTEGER(IntKi), PARAMETER :: M37N8MMxe = 8351 - INTEGER(IntKi), PARAMETER :: M37N9MMxe = 8352 - INTEGER(IntKi), PARAMETER :: M38N1MMxe = 8353 - INTEGER(IntKi), PARAMETER :: M38N2MMxe = 8354 - INTEGER(IntKi), PARAMETER :: M38N3MMxe = 8355 - INTEGER(IntKi), PARAMETER :: M38N4MMxe = 8356 - INTEGER(IntKi), PARAMETER :: M38N5MMxe = 8357 - INTEGER(IntKi), PARAMETER :: M38N6MMxe = 8358 - INTEGER(IntKi), PARAMETER :: M38N7MMxe = 8359 - INTEGER(IntKi), PARAMETER :: M38N8MMxe = 8360 - INTEGER(IntKi), PARAMETER :: M38N9MMxe = 8361 - INTEGER(IntKi), PARAMETER :: M39N1MMxe = 8362 - INTEGER(IntKi), PARAMETER :: M39N2MMxe = 8363 - INTEGER(IntKi), PARAMETER :: M39N3MMxe = 8364 - INTEGER(IntKi), PARAMETER :: M39N4MMxe = 8365 - INTEGER(IntKi), PARAMETER :: M39N5MMxe = 8366 - INTEGER(IntKi), PARAMETER :: M39N6MMxe = 8367 - INTEGER(IntKi), PARAMETER :: M39N7MMxe = 8368 - INTEGER(IntKi), PARAMETER :: M39N8MMxe = 8369 - INTEGER(IntKi), PARAMETER :: M39N9MMxe = 8370 - INTEGER(IntKi), PARAMETER :: M40N1MMxe = 8371 - INTEGER(IntKi), PARAMETER :: M40N2MMxe = 8372 - INTEGER(IntKi), PARAMETER :: M40N3MMxe = 8373 - INTEGER(IntKi), PARAMETER :: M40N4MMxe = 8374 - INTEGER(IntKi), PARAMETER :: M40N5MMxe = 8375 - INTEGER(IntKi), PARAMETER :: M40N6MMxe = 8376 - INTEGER(IntKi), PARAMETER :: M40N7MMxe = 8377 - INTEGER(IntKi), PARAMETER :: M40N8MMxe = 8378 - INTEGER(IntKi), PARAMETER :: M40N9MMxe = 8379 - INTEGER(IntKi), PARAMETER :: M41N1MMxe = 8380 - INTEGER(IntKi), PARAMETER :: M41N2MMxe = 8381 - INTEGER(IntKi), PARAMETER :: M41N3MMxe = 8382 - INTEGER(IntKi), PARAMETER :: M41N4MMxe = 8383 - INTEGER(IntKi), PARAMETER :: M41N5MMxe = 8384 - INTEGER(IntKi), PARAMETER :: M41N6MMxe = 8385 - INTEGER(IntKi), PARAMETER :: M41N7MMxe = 8386 - INTEGER(IntKi), PARAMETER :: M41N8MMxe = 8387 - INTEGER(IntKi), PARAMETER :: M41N9MMxe = 8388 - INTEGER(IntKi), PARAMETER :: M42N1MMxe = 8389 - INTEGER(IntKi), PARAMETER :: M42N2MMxe = 8390 - INTEGER(IntKi), PARAMETER :: M42N3MMxe = 8391 - INTEGER(IntKi), PARAMETER :: M42N4MMxe = 8392 - INTEGER(IntKi), PARAMETER :: M42N5MMxe = 8393 - INTEGER(IntKi), PARAMETER :: M42N6MMxe = 8394 - INTEGER(IntKi), PARAMETER :: M42N7MMxe = 8395 - INTEGER(IntKi), PARAMETER :: M42N8MMxe = 8396 - INTEGER(IntKi), PARAMETER :: M42N9MMxe = 8397 - INTEGER(IntKi), PARAMETER :: M43N1MMxe = 8398 - INTEGER(IntKi), PARAMETER :: M43N2MMxe = 8399 - INTEGER(IntKi), PARAMETER :: M43N3MMxe = 8400 - INTEGER(IntKi), PARAMETER :: M43N4MMxe = 8401 - INTEGER(IntKi), PARAMETER :: M43N5MMxe = 8402 - INTEGER(IntKi), PARAMETER :: M43N6MMxe = 8403 - INTEGER(IntKi), PARAMETER :: M43N7MMxe = 8404 - INTEGER(IntKi), PARAMETER :: M43N8MMxe = 8405 - INTEGER(IntKi), PARAMETER :: M43N9MMxe = 8406 - INTEGER(IntKi), PARAMETER :: M44N1MMxe = 8407 - INTEGER(IntKi), PARAMETER :: M44N2MMxe = 8408 - INTEGER(IntKi), PARAMETER :: M44N3MMxe = 8409 - INTEGER(IntKi), PARAMETER :: M44N4MMxe = 8410 - INTEGER(IntKi), PARAMETER :: M44N5MMxe = 8411 - INTEGER(IntKi), PARAMETER :: M44N6MMxe = 8412 - INTEGER(IntKi), PARAMETER :: M44N7MMxe = 8413 - INTEGER(IntKi), PARAMETER :: M44N8MMxe = 8414 - INTEGER(IntKi), PARAMETER :: M44N9MMxe = 8415 - INTEGER(IntKi), PARAMETER :: M45N1MMxe = 8416 - INTEGER(IntKi), PARAMETER :: M45N2MMxe = 8417 - INTEGER(IntKi), PARAMETER :: M45N3MMxe = 8418 - INTEGER(IntKi), PARAMETER :: M45N4MMxe = 8419 - INTEGER(IntKi), PARAMETER :: M45N5MMxe = 8420 - INTEGER(IntKi), PARAMETER :: M45N6MMxe = 8421 - INTEGER(IntKi), PARAMETER :: M45N7MMxe = 8422 - INTEGER(IntKi), PARAMETER :: M45N8MMxe = 8423 - INTEGER(IntKi), PARAMETER :: M45N9MMxe = 8424 - INTEGER(IntKi), PARAMETER :: M46N1MMxe = 8425 - INTEGER(IntKi), PARAMETER :: M46N2MMxe = 8426 - INTEGER(IntKi), PARAMETER :: M46N3MMxe = 8427 - INTEGER(IntKi), PARAMETER :: M46N4MMxe = 8428 - INTEGER(IntKi), PARAMETER :: M46N5MMxe = 8429 - INTEGER(IntKi), PARAMETER :: M46N6MMxe = 8430 - INTEGER(IntKi), PARAMETER :: M46N7MMxe = 8431 - INTEGER(IntKi), PARAMETER :: M46N8MMxe = 8432 - INTEGER(IntKi), PARAMETER :: M46N9MMxe = 8433 - INTEGER(IntKi), PARAMETER :: M47N1MMxe = 8434 - INTEGER(IntKi), PARAMETER :: M47N2MMxe = 8435 - INTEGER(IntKi), PARAMETER :: M47N3MMxe = 8436 - INTEGER(IntKi), PARAMETER :: M47N4MMxe = 8437 - INTEGER(IntKi), PARAMETER :: M47N5MMxe = 8438 - INTEGER(IntKi), PARAMETER :: M47N6MMxe = 8439 - INTEGER(IntKi), PARAMETER :: M47N7MMxe = 8440 - INTEGER(IntKi), PARAMETER :: M47N8MMxe = 8441 - INTEGER(IntKi), PARAMETER :: M47N9MMxe = 8442 - INTEGER(IntKi), PARAMETER :: M48N1MMxe = 8443 - INTEGER(IntKi), PARAMETER :: M48N2MMxe = 8444 - INTEGER(IntKi), PARAMETER :: M48N3MMxe = 8445 - INTEGER(IntKi), PARAMETER :: M48N4MMxe = 8446 - INTEGER(IntKi), PARAMETER :: M48N5MMxe = 8447 - INTEGER(IntKi), PARAMETER :: M48N6MMxe = 8448 - INTEGER(IntKi), PARAMETER :: M48N7MMxe = 8449 - INTEGER(IntKi), PARAMETER :: M48N8MMxe = 8450 - INTEGER(IntKi), PARAMETER :: M48N9MMxe = 8451 - INTEGER(IntKi), PARAMETER :: M49N1MMxe = 8452 - INTEGER(IntKi), PARAMETER :: M49N2MMxe = 8453 - INTEGER(IntKi), PARAMETER :: M49N3MMxe = 8454 - INTEGER(IntKi), PARAMETER :: M49N4MMxe = 8455 - INTEGER(IntKi), PARAMETER :: M49N5MMxe = 8456 - INTEGER(IntKi), PARAMETER :: M49N6MMxe = 8457 - INTEGER(IntKi), PARAMETER :: M49N7MMxe = 8458 - INTEGER(IntKi), PARAMETER :: M49N8MMxe = 8459 - INTEGER(IntKi), PARAMETER :: M49N9MMxe = 8460 - INTEGER(IntKi), PARAMETER :: M50N1MMxe = 8461 - INTEGER(IntKi), PARAMETER :: M50N2MMxe = 8462 - INTEGER(IntKi), PARAMETER :: M50N3MMxe = 8463 - INTEGER(IntKi), PARAMETER :: M50N4MMxe = 8464 - INTEGER(IntKi), PARAMETER :: M50N5MMxe = 8465 - INTEGER(IntKi), PARAMETER :: M50N6MMxe = 8466 - INTEGER(IntKi), PARAMETER :: M50N7MMxe = 8467 - INTEGER(IntKi), PARAMETER :: M50N8MMxe = 8468 - INTEGER(IntKi), PARAMETER :: M50N9MMxe = 8469 - INTEGER(IntKi), PARAMETER :: M51N1MMxe = 8470 - INTEGER(IntKi), PARAMETER :: M51N2MMxe = 8471 - INTEGER(IntKi), PARAMETER :: M51N3MMxe = 8472 - INTEGER(IntKi), PARAMETER :: M51N4MMxe = 8473 - INTEGER(IntKi), PARAMETER :: M51N5MMxe = 8474 - INTEGER(IntKi), PARAMETER :: M51N6MMxe = 8475 - INTEGER(IntKi), PARAMETER :: M51N7MMxe = 8476 - INTEGER(IntKi), PARAMETER :: M51N8MMxe = 8477 - INTEGER(IntKi), PARAMETER :: M51N9MMxe = 8478 - INTEGER(IntKi), PARAMETER :: M52N1MMxe = 8479 - INTEGER(IntKi), PARAMETER :: M52N2MMxe = 8480 - INTEGER(IntKi), PARAMETER :: M52N3MMxe = 8481 - INTEGER(IntKi), PARAMETER :: M52N4MMxe = 8482 - INTEGER(IntKi), PARAMETER :: M52N5MMxe = 8483 - INTEGER(IntKi), PARAMETER :: M52N6MMxe = 8484 - INTEGER(IntKi), PARAMETER :: M52N7MMxe = 8485 - INTEGER(IntKi), PARAMETER :: M52N8MMxe = 8486 - INTEGER(IntKi), PARAMETER :: M52N9MMxe = 8487 - INTEGER(IntKi), PARAMETER :: M53N1MMxe = 8488 - INTEGER(IntKi), PARAMETER :: M53N2MMxe = 8489 - INTEGER(IntKi), PARAMETER :: M53N3MMxe = 8490 - INTEGER(IntKi), PARAMETER :: M53N4MMxe = 8491 - INTEGER(IntKi), PARAMETER :: M53N5MMxe = 8492 - INTEGER(IntKi), PARAMETER :: M53N6MMxe = 8493 - INTEGER(IntKi), PARAMETER :: M53N7MMxe = 8494 - INTEGER(IntKi), PARAMETER :: M53N8MMxe = 8495 - INTEGER(IntKi), PARAMETER :: M53N9MMxe = 8496 - INTEGER(IntKi), PARAMETER :: M54N1MMxe = 8497 - INTEGER(IntKi), PARAMETER :: M54N2MMxe = 8498 - INTEGER(IntKi), PARAMETER :: M54N3MMxe = 8499 - INTEGER(IntKi), PARAMETER :: M54N4MMxe = 8500 - INTEGER(IntKi), PARAMETER :: M54N5MMxe = 8501 - INTEGER(IntKi), PARAMETER :: M54N6MMxe = 8502 - INTEGER(IntKi), PARAMETER :: M54N7MMxe = 8503 - INTEGER(IntKi), PARAMETER :: M54N8MMxe = 8504 - INTEGER(IntKi), PARAMETER :: M54N9MMxe = 8505 - INTEGER(IntKi), PARAMETER :: M55N1MMxe = 8506 - INTEGER(IntKi), PARAMETER :: M55N2MMxe = 8507 - INTEGER(IntKi), PARAMETER :: M55N3MMxe = 8508 - INTEGER(IntKi), PARAMETER :: M55N4MMxe = 8509 - INTEGER(IntKi), PARAMETER :: M55N5MMxe = 8510 - INTEGER(IntKi), PARAMETER :: M55N6MMxe = 8511 - INTEGER(IntKi), PARAMETER :: M55N7MMxe = 8512 - INTEGER(IntKi), PARAMETER :: M55N8MMxe = 8513 - INTEGER(IntKi), PARAMETER :: M55N9MMxe = 8514 - INTEGER(IntKi), PARAMETER :: M56N1MMxe = 8515 - INTEGER(IntKi), PARAMETER :: M56N2MMxe = 8516 - INTEGER(IntKi), PARAMETER :: M56N3MMxe = 8517 - INTEGER(IntKi), PARAMETER :: M56N4MMxe = 8518 - INTEGER(IntKi), PARAMETER :: M56N5MMxe = 8519 - INTEGER(IntKi), PARAMETER :: M56N6MMxe = 8520 - INTEGER(IntKi), PARAMETER :: M56N7MMxe = 8521 - INTEGER(IntKi), PARAMETER :: M56N8MMxe = 8522 - INTEGER(IntKi), PARAMETER :: M56N9MMxe = 8523 - INTEGER(IntKi), PARAMETER :: M57N1MMxe = 8524 - INTEGER(IntKi), PARAMETER :: M57N2MMxe = 8525 - INTEGER(IntKi), PARAMETER :: M57N3MMxe = 8526 - INTEGER(IntKi), PARAMETER :: M57N4MMxe = 8527 - INTEGER(IntKi), PARAMETER :: M57N5MMxe = 8528 - INTEGER(IntKi), PARAMETER :: M57N6MMxe = 8529 - INTEGER(IntKi), PARAMETER :: M57N7MMxe = 8530 - INTEGER(IntKi), PARAMETER :: M57N8MMxe = 8531 - INTEGER(IntKi), PARAMETER :: M57N9MMxe = 8532 - INTEGER(IntKi), PARAMETER :: M58N1MMxe = 8533 - INTEGER(IntKi), PARAMETER :: M58N2MMxe = 8534 - INTEGER(IntKi), PARAMETER :: M58N3MMxe = 8535 - INTEGER(IntKi), PARAMETER :: M58N4MMxe = 8536 - INTEGER(IntKi), PARAMETER :: M58N5MMxe = 8537 - INTEGER(IntKi), PARAMETER :: M58N6MMxe = 8538 - INTEGER(IntKi), PARAMETER :: M58N7MMxe = 8539 - INTEGER(IntKi), PARAMETER :: M58N8MMxe = 8540 - INTEGER(IntKi), PARAMETER :: M58N9MMxe = 8541 - INTEGER(IntKi), PARAMETER :: M59N1MMxe = 8542 - INTEGER(IntKi), PARAMETER :: M59N2MMxe = 8543 - INTEGER(IntKi), PARAMETER :: M59N3MMxe = 8544 - INTEGER(IntKi), PARAMETER :: M59N4MMxe = 8545 - INTEGER(IntKi), PARAMETER :: M59N5MMxe = 8546 - INTEGER(IntKi), PARAMETER :: M59N6MMxe = 8547 - INTEGER(IntKi), PARAMETER :: M59N7MMxe = 8548 - INTEGER(IntKi), PARAMETER :: M59N8MMxe = 8549 - INTEGER(IntKi), PARAMETER :: M59N9MMxe = 8550 - INTEGER(IntKi), PARAMETER :: M60N1MMxe = 8551 - INTEGER(IntKi), PARAMETER :: M60N2MMxe = 8552 - INTEGER(IntKi), PARAMETER :: M60N3MMxe = 8553 - INTEGER(IntKi), PARAMETER :: M60N4MMxe = 8554 - INTEGER(IntKi), PARAMETER :: M60N5MMxe = 8555 - INTEGER(IntKi), PARAMETER :: M60N6MMxe = 8556 - INTEGER(IntKi), PARAMETER :: M60N7MMxe = 8557 - INTEGER(IntKi), PARAMETER :: M60N8MMxe = 8558 - INTEGER(IntKi), PARAMETER :: M60N9MMxe = 8559 - INTEGER(IntKi), PARAMETER :: M61N1MMxe = 8560 - INTEGER(IntKi), PARAMETER :: M61N2MMxe = 8561 - INTEGER(IntKi), PARAMETER :: M61N3MMxe = 8562 - INTEGER(IntKi), PARAMETER :: M61N4MMxe = 8563 - INTEGER(IntKi), PARAMETER :: M61N5MMxe = 8564 - INTEGER(IntKi), PARAMETER :: M61N6MMxe = 8565 - INTEGER(IntKi), PARAMETER :: M61N7MMxe = 8566 - INTEGER(IntKi), PARAMETER :: M61N8MMxe = 8567 - INTEGER(IntKi), PARAMETER :: M61N9MMxe = 8568 - INTEGER(IntKi), PARAMETER :: M62N1MMxe = 8569 - INTEGER(IntKi), PARAMETER :: M62N2MMxe = 8570 - INTEGER(IntKi), PARAMETER :: M62N3MMxe = 8571 - INTEGER(IntKi), PARAMETER :: M62N4MMxe = 8572 - INTEGER(IntKi), PARAMETER :: M62N5MMxe = 8573 - INTEGER(IntKi), PARAMETER :: M62N6MMxe = 8574 - INTEGER(IntKi), PARAMETER :: M62N7MMxe = 8575 - INTEGER(IntKi), PARAMETER :: M62N8MMxe = 8576 - INTEGER(IntKi), PARAMETER :: M62N9MMxe = 8577 - INTEGER(IntKi), PARAMETER :: M63N1MMxe = 8578 - INTEGER(IntKi), PARAMETER :: M63N2MMxe = 8579 - INTEGER(IntKi), PARAMETER :: M63N3MMxe = 8580 - INTEGER(IntKi), PARAMETER :: M63N4MMxe = 8581 - INTEGER(IntKi), PARAMETER :: M63N5MMxe = 8582 - INTEGER(IntKi), PARAMETER :: M63N6MMxe = 8583 - INTEGER(IntKi), PARAMETER :: M63N7MMxe = 8584 - INTEGER(IntKi), PARAMETER :: M63N8MMxe = 8585 - INTEGER(IntKi), PARAMETER :: M63N9MMxe = 8586 - INTEGER(IntKi), PARAMETER :: M64N1MMxe = 8587 - INTEGER(IntKi), PARAMETER :: M64N2MMxe = 8588 - INTEGER(IntKi), PARAMETER :: M64N3MMxe = 8589 - INTEGER(IntKi), PARAMETER :: M64N4MMxe = 8590 - INTEGER(IntKi), PARAMETER :: M64N5MMxe = 8591 - INTEGER(IntKi), PARAMETER :: M64N6MMxe = 8592 - INTEGER(IntKi), PARAMETER :: M64N7MMxe = 8593 - INTEGER(IntKi), PARAMETER :: M64N8MMxe = 8594 - INTEGER(IntKi), PARAMETER :: M64N9MMxe = 8595 - INTEGER(IntKi), PARAMETER :: M65N1MMxe = 8596 - INTEGER(IntKi), PARAMETER :: M65N2MMxe = 8597 - INTEGER(IntKi), PARAMETER :: M65N3MMxe = 8598 - INTEGER(IntKi), PARAMETER :: M65N4MMxe = 8599 - INTEGER(IntKi), PARAMETER :: M65N5MMxe = 8600 - INTEGER(IntKi), PARAMETER :: M65N6MMxe = 8601 - INTEGER(IntKi), PARAMETER :: M65N7MMxe = 8602 - INTEGER(IntKi), PARAMETER :: M65N8MMxe = 8603 - INTEGER(IntKi), PARAMETER :: M65N9MMxe = 8604 - INTEGER(IntKi), PARAMETER :: M66N1MMxe = 8605 - INTEGER(IntKi), PARAMETER :: M66N2MMxe = 8606 - INTEGER(IntKi), PARAMETER :: M66N3MMxe = 8607 - INTEGER(IntKi), PARAMETER :: M66N4MMxe = 8608 - INTEGER(IntKi), PARAMETER :: M66N5MMxe = 8609 - INTEGER(IntKi), PARAMETER :: M66N6MMxe = 8610 - INTEGER(IntKi), PARAMETER :: M66N7MMxe = 8611 - INTEGER(IntKi), PARAMETER :: M66N8MMxe = 8612 - INTEGER(IntKi), PARAMETER :: M66N9MMxe = 8613 - INTEGER(IntKi), PARAMETER :: M67N1MMxe = 8614 - INTEGER(IntKi), PARAMETER :: M67N2MMxe = 8615 - INTEGER(IntKi), PARAMETER :: M67N3MMxe = 8616 - INTEGER(IntKi), PARAMETER :: M67N4MMxe = 8617 - INTEGER(IntKi), PARAMETER :: M67N5MMxe = 8618 - INTEGER(IntKi), PARAMETER :: M67N6MMxe = 8619 - INTEGER(IntKi), PARAMETER :: M67N7MMxe = 8620 - INTEGER(IntKi), PARAMETER :: M67N8MMxe = 8621 - INTEGER(IntKi), PARAMETER :: M67N9MMxe = 8622 - INTEGER(IntKi), PARAMETER :: M68N1MMxe = 8623 - INTEGER(IntKi), PARAMETER :: M68N2MMxe = 8624 - INTEGER(IntKi), PARAMETER :: M68N3MMxe = 8625 - INTEGER(IntKi), PARAMETER :: M68N4MMxe = 8626 - INTEGER(IntKi), PARAMETER :: M68N5MMxe = 8627 - INTEGER(IntKi), PARAMETER :: M68N6MMxe = 8628 - INTEGER(IntKi), PARAMETER :: M68N7MMxe = 8629 - INTEGER(IntKi), PARAMETER :: M68N8MMxe = 8630 - INTEGER(IntKi), PARAMETER :: M68N9MMxe = 8631 - INTEGER(IntKi), PARAMETER :: M69N1MMxe = 8632 - INTEGER(IntKi), PARAMETER :: M69N2MMxe = 8633 - INTEGER(IntKi), PARAMETER :: M69N3MMxe = 8634 - INTEGER(IntKi), PARAMETER :: M69N4MMxe = 8635 - INTEGER(IntKi), PARAMETER :: M69N5MMxe = 8636 - INTEGER(IntKi), PARAMETER :: M69N6MMxe = 8637 - INTEGER(IntKi), PARAMETER :: M69N7MMxe = 8638 - INTEGER(IntKi), PARAMETER :: M69N8MMxe = 8639 - INTEGER(IntKi), PARAMETER :: M69N9MMxe = 8640 - INTEGER(IntKi), PARAMETER :: M70N1MMxe = 8641 - INTEGER(IntKi), PARAMETER :: M70N2MMxe = 8642 - INTEGER(IntKi), PARAMETER :: M70N3MMxe = 8643 - INTEGER(IntKi), PARAMETER :: M70N4MMxe = 8644 - INTEGER(IntKi), PARAMETER :: M70N5MMxe = 8645 - INTEGER(IntKi), PARAMETER :: M70N6MMxe = 8646 - INTEGER(IntKi), PARAMETER :: M70N7MMxe = 8647 - INTEGER(IntKi), PARAMETER :: M70N8MMxe = 8648 - INTEGER(IntKi), PARAMETER :: M70N9MMxe = 8649 - INTEGER(IntKi), PARAMETER :: M71N1MMxe = 8650 - INTEGER(IntKi), PARAMETER :: M71N2MMxe = 8651 - INTEGER(IntKi), PARAMETER :: M71N3MMxe = 8652 - INTEGER(IntKi), PARAMETER :: M71N4MMxe = 8653 - INTEGER(IntKi), PARAMETER :: M71N5MMxe = 8654 - INTEGER(IntKi), PARAMETER :: M71N6MMxe = 8655 - INTEGER(IntKi), PARAMETER :: M71N7MMxe = 8656 - INTEGER(IntKi), PARAMETER :: M71N8MMxe = 8657 - INTEGER(IntKi), PARAMETER :: M71N9MMxe = 8658 - INTEGER(IntKi), PARAMETER :: M72N1MMxe = 8659 - INTEGER(IntKi), PARAMETER :: M72N2MMxe = 8660 - INTEGER(IntKi), PARAMETER :: M72N3MMxe = 8661 - INTEGER(IntKi), PARAMETER :: M72N4MMxe = 8662 - INTEGER(IntKi), PARAMETER :: M72N5MMxe = 8663 - INTEGER(IntKi), PARAMETER :: M72N6MMxe = 8664 - INTEGER(IntKi), PARAMETER :: M72N7MMxe = 8665 - INTEGER(IntKi), PARAMETER :: M72N8MMxe = 8666 - INTEGER(IntKi), PARAMETER :: M72N9MMxe = 8667 - INTEGER(IntKi), PARAMETER :: M73N1MMxe = 8668 - INTEGER(IntKi), PARAMETER :: M73N2MMxe = 8669 - INTEGER(IntKi), PARAMETER :: M73N3MMxe = 8670 - INTEGER(IntKi), PARAMETER :: M73N4MMxe = 8671 - INTEGER(IntKi), PARAMETER :: M73N5MMxe = 8672 - INTEGER(IntKi), PARAMETER :: M73N6MMxe = 8673 - INTEGER(IntKi), PARAMETER :: M73N7MMxe = 8674 - INTEGER(IntKi), PARAMETER :: M73N8MMxe = 8675 - INTEGER(IntKi), PARAMETER :: M73N9MMxe = 8676 - INTEGER(IntKi), PARAMETER :: M74N1MMxe = 8677 - INTEGER(IntKi), PARAMETER :: M74N2MMxe = 8678 - INTEGER(IntKi), PARAMETER :: M74N3MMxe = 8679 - INTEGER(IntKi), PARAMETER :: M74N4MMxe = 8680 - INTEGER(IntKi), PARAMETER :: M74N5MMxe = 8681 - INTEGER(IntKi), PARAMETER :: M74N6MMxe = 8682 - INTEGER(IntKi), PARAMETER :: M74N7MMxe = 8683 - INTEGER(IntKi), PARAMETER :: M74N8MMxe = 8684 - INTEGER(IntKi), PARAMETER :: M74N9MMxe = 8685 - INTEGER(IntKi), PARAMETER :: M75N1MMxe = 8686 - INTEGER(IntKi), PARAMETER :: M75N2MMxe = 8687 - INTEGER(IntKi), PARAMETER :: M75N3MMxe = 8688 - INTEGER(IntKi), PARAMETER :: M75N4MMxe = 8689 - INTEGER(IntKi), PARAMETER :: M75N5MMxe = 8690 - INTEGER(IntKi), PARAMETER :: M75N6MMxe = 8691 - INTEGER(IntKi), PARAMETER :: M75N7MMxe = 8692 - INTEGER(IntKi), PARAMETER :: M75N8MMxe = 8693 - INTEGER(IntKi), PARAMETER :: M75N9MMxe = 8694 - INTEGER(IntKi), PARAMETER :: M76N1MMxe = 8695 - INTEGER(IntKi), PARAMETER :: M76N2MMxe = 8696 - INTEGER(IntKi), PARAMETER :: M76N3MMxe = 8697 - INTEGER(IntKi), PARAMETER :: M76N4MMxe = 8698 - INTEGER(IntKi), PARAMETER :: M76N5MMxe = 8699 - INTEGER(IntKi), PARAMETER :: M76N6MMxe = 8700 - INTEGER(IntKi), PARAMETER :: M76N7MMxe = 8701 - INTEGER(IntKi), PARAMETER :: M76N8MMxe = 8702 - INTEGER(IntKi), PARAMETER :: M76N9MMxe = 8703 - INTEGER(IntKi), PARAMETER :: M77N1MMxe = 8704 - INTEGER(IntKi), PARAMETER :: M77N2MMxe = 8705 - INTEGER(IntKi), PARAMETER :: M77N3MMxe = 8706 - INTEGER(IntKi), PARAMETER :: M77N4MMxe = 8707 - INTEGER(IntKi), PARAMETER :: M77N5MMxe = 8708 - INTEGER(IntKi), PARAMETER :: M77N6MMxe = 8709 - INTEGER(IntKi), PARAMETER :: M77N7MMxe = 8710 - INTEGER(IntKi), PARAMETER :: M77N8MMxe = 8711 - INTEGER(IntKi), PARAMETER :: M77N9MMxe = 8712 - INTEGER(IntKi), PARAMETER :: M78N1MMxe = 8713 - INTEGER(IntKi), PARAMETER :: M78N2MMxe = 8714 - INTEGER(IntKi), PARAMETER :: M78N3MMxe = 8715 - INTEGER(IntKi), PARAMETER :: M78N4MMxe = 8716 - INTEGER(IntKi), PARAMETER :: M78N5MMxe = 8717 - INTEGER(IntKi), PARAMETER :: M78N6MMxe = 8718 - INTEGER(IntKi), PARAMETER :: M78N7MMxe = 8719 - INTEGER(IntKi), PARAMETER :: M78N8MMxe = 8720 - INTEGER(IntKi), PARAMETER :: M78N9MMxe = 8721 - INTEGER(IntKi), PARAMETER :: M79N1MMxe = 8722 - INTEGER(IntKi), PARAMETER :: M79N2MMxe = 8723 - INTEGER(IntKi), PARAMETER :: M79N3MMxe = 8724 - INTEGER(IntKi), PARAMETER :: M79N4MMxe = 8725 - INTEGER(IntKi), PARAMETER :: M79N5MMxe = 8726 - INTEGER(IntKi), PARAMETER :: M79N6MMxe = 8727 - INTEGER(IntKi), PARAMETER :: M79N7MMxe = 8728 - INTEGER(IntKi), PARAMETER :: M79N8MMxe = 8729 - INTEGER(IntKi), PARAMETER :: M79N9MMxe = 8730 - INTEGER(IntKi), PARAMETER :: M80N1MMxe = 8731 - INTEGER(IntKi), PARAMETER :: M80N2MMxe = 8732 - INTEGER(IntKi), PARAMETER :: M80N3MMxe = 8733 - INTEGER(IntKi), PARAMETER :: M80N4MMxe = 8734 - INTEGER(IntKi), PARAMETER :: M80N5MMxe = 8735 - INTEGER(IntKi), PARAMETER :: M80N6MMxe = 8736 - INTEGER(IntKi), PARAMETER :: M80N7MMxe = 8737 - INTEGER(IntKi), PARAMETER :: M80N8MMxe = 8738 - INTEGER(IntKi), PARAMETER :: M80N9MMxe = 8739 - INTEGER(IntKi), PARAMETER :: M81N1MMxe = 8740 - INTEGER(IntKi), PARAMETER :: M81N2MMxe = 8741 - INTEGER(IntKi), PARAMETER :: M81N3MMxe = 8742 - INTEGER(IntKi), PARAMETER :: M81N4MMxe = 8743 - INTEGER(IntKi), PARAMETER :: M81N5MMxe = 8744 - INTEGER(IntKi), PARAMETER :: M81N6MMxe = 8745 - INTEGER(IntKi), PARAMETER :: M81N7MMxe = 8746 - INTEGER(IntKi), PARAMETER :: M81N8MMxe = 8747 - INTEGER(IntKi), PARAMETER :: M81N9MMxe = 8748 - INTEGER(IntKi), PARAMETER :: M82N1MMxe = 8749 - INTEGER(IntKi), PARAMETER :: M82N2MMxe = 8750 - INTEGER(IntKi), PARAMETER :: M82N3MMxe = 8751 - INTEGER(IntKi), PARAMETER :: M82N4MMxe = 8752 - INTEGER(IntKi), PARAMETER :: M82N5MMxe = 8753 - INTEGER(IntKi), PARAMETER :: M82N6MMxe = 8754 - INTEGER(IntKi), PARAMETER :: M82N7MMxe = 8755 - INTEGER(IntKi), PARAMETER :: M82N8MMxe = 8756 - INTEGER(IntKi), PARAMETER :: M82N9MMxe = 8757 - INTEGER(IntKi), PARAMETER :: M83N1MMxe = 8758 - INTEGER(IntKi), PARAMETER :: M83N2MMxe = 8759 - INTEGER(IntKi), PARAMETER :: M83N3MMxe = 8760 - INTEGER(IntKi), PARAMETER :: M83N4MMxe = 8761 - INTEGER(IntKi), PARAMETER :: M83N5MMxe = 8762 - INTEGER(IntKi), PARAMETER :: M83N6MMxe = 8763 - INTEGER(IntKi), PARAMETER :: M83N7MMxe = 8764 - INTEGER(IntKi), PARAMETER :: M83N8MMxe = 8765 - INTEGER(IntKi), PARAMETER :: M83N9MMxe = 8766 - INTEGER(IntKi), PARAMETER :: M84N1MMxe = 8767 - INTEGER(IntKi), PARAMETER :: M84N2MMxe = 8768 - INTEGER(IntKi), PARAMETER :: M84N3MMxe = 8769 - INTEGER(IntKi), PARAMETER :: M84N4MMxe = 8770 - INTEGER(IntKi), PARAMETER :: M84N5MMxe = 8771 - INTEGER(IntKi), PARAMETER :: M84N6MMxe = 8772 - INTEGER(IntKi), PARAMETER :: M84N7MMxe = 8773 - INTEGER(IntKi), PARAMETER :: M84N8MMxe = 8774 - INTEGER(IntKi), PARAMETER :: M84N9MMxe = 8775 - INTEGER(IntKi), PARAMETER :: M85N1MMxe = 8776 - INTEGER(IntKi), PARAMETER :: M85N2MMxe = 8777 - INTEGER(IntKi), PARAMETER :: M85N3MMxe = 8778 - INTEGER(IntKi), PARAMETER :: M85N4MMxe = 8779 - INTEGER(IntKi), PARAMETER :: M85N5MMxe = 8780 - INTEGER(IntKi), PARAMETER :: M85N6MMxe = 8781 - INTEGER(IntKi), PARAMETER :: M85N7MMxe = 8782 - INTEGER(IntKi), PARAMETER :: M85N8MMxe = 8783 - INTEGER(IntKi), PARAMETER :: M85N9MMxe = 8784 - INTEGER(IntKi), PARAMETER :: M86N1MMxe = 8785 - INTEGER(IntKi), PARAMETER :: M86N2MMxe = 8786 - INTEGER(IntKi), PARAMETER :: M86N3MMxe = 8787 - INTEGER(IntKi), PARAMETER :: M86N4MMxe = 8788 - INTEGER(IntKi), PARAMETER :: M86N5MMxe = 8789 - INTEGER(IntKi), PARAMETER :: M86N6MMxe = 8790 - INTEGER(IntKi), PARAMETER :: M86N7MMxe = 8791 - INTEGER(IntKi), PARAMETER :: M86N8MMxe = 8792 - INTEGER(IntKi), PARAMETER :: M86N9MMxe = 8793 - INTEGER(IntKi), PARAMETER :: M87N1MMxe = 8794 - INTEGER(IntKi), PARAMETER :: M87N2MMxe = 8795 - INTEGER(IntKi), PARAMETER :: M87N3MMxe = 8796 - INTEGER(IntKi), PARAMETER :: M87N4MMxe = 8797 - INTEGER(IntKi), PARAMETER :: M87N5MMxe = 8798 - INTEGER(IntKi), PARAMETER :: M87N6MMxe = 8799 - INTEGER(IntKi), PARAMETER :: M87N7MMxe = 8800 - INTEGER(IntKi), PARAMETER :: M87N8MMxe = 8801 - INTEGER(IntKi), PARAMETER :: M87N9MMxe = 8802 - INTEGER(IntKi), PARAMETER :: M88N1MMxe = 8803 - INTEGER(IntKi), PARAMETER :: M88N2MMxe = 8804 - INTEGER(IntKi), PARAMETER :: M88N3MMxe = 8805 - INTEGER(IntKi), PARAMETER :: M88N4MMxe = 8806 - INTEGER(IntKi), PARAMETER :: M88N5MMxe = 8807 - INTEGER(IntKi), PARAMETER :: M88N6MMxe = 8808 - INTEGER(IntKi), PARAMETER :: M88N7MMxe = 8809 - INTEGER(IntKi), PARAMETER :: M88N8MMxe = 8810 - INTEGER(IntKi), PARAMETER :: M88N9MMxe = 8811 - INTEGER(IntKi), PARAMETER :: M89N1MMxe = 8812 - INTEGER(IntKi), PARAMETER :: M89N2MMxe = 8813 - INTEGER(IntKi), PARAMETER :: M89N3MMxe = 8814 - INTEGER(IntKi), PARAMETER :: M89N4MMxe = 8815 - INTEGER(IntKi), PARAMETER :: M89N5MMxe = 8816 - INTEGER(IntKi), PARAMETER :: M89N6MMxe = 8817 - INTEGER(IntKi), PARAMETER :: M89N7MMxe = 8818 - INTEGER(IntKi), PARAMETER :: M89N8MMxe = 8819 - INTEGER(IntKi), PARAMETER :: M89N9MMxe = 8820 - INTEGER(IntKi), PARAMETER :: M90N1MMxe = 8821 - INTEGER(IntKi), PARAMETER :: M90N2MMxe = 8822 - INTEGER(IntKi), PARAMETER :: M90N3MMxe = 8823 - INTEGER(IntKi), PARAMETER :: M90N4MMxe = 8824 - INTEGER(IntKi), PARAMETER :: M90N5MMxe = 8825 - INTEGER(IntKi), PARAMETER :: M90N6MMxe = 8826 - INTEGER(IntKi), PARAMETER :: M90N7MMxe = 8827 - INTEGER(IntKi), PARAMETER :: M90N8MMxe = 8828 - INTEGER(IntKi), PARAMETER :: M90N9MMxe = 8829 - INTEGER(IntKi), PARAMETER :: M91N1MMxe = 8830 - INTEGER(IntKi), PARAMETER :: M91N2MMxe = 8831 - INTEGER(IntKi), PARAMETER :: M91N3MMxe = 8832 - INTEGER(IntKi), PARAMETER :: M91N4MMxe = 8833 - INTEGER(IntKi), PARAMETER :: M91N5MMxe = 8834 - INTEGER(IntKi), PARAMETER :: M91N6MMxe = 8835 - INTEGER(IntKi), PARAMETER :: M91N7MMxe = 8836 - INTEGER(IntKi), PARAMETER :: M91N8MMxe = 8837 - INTEGER(IntKi), PARAMETER :: M91N9MMxe = 8838 - INTEGER(IntKi), PARAMETER :: M92N1MMxe = 8839 - INTEGER(IntKi), PARAMETER :: M92N2MMxe = 8840 - INTEGER(IntKi), PARAMETER :: M92N3MMxe = 8841 - INTEGER(IntKi), PARAMETER :: M92N4MMxe = 8842 - INTEGER(IntKi), PARAMETER :: M92N5MMxe = 8843 - INTEGER(IntKi), PARAMETER :: M92N6MMxe = 8844 - INTEGER(IntKi), PARAMETER :: M92N7MMxe = 8845 - INTEGER(IntKi), PARAMETER :: M92N8MMxe = 8846 - INTEGER(IntKi), PARAMETER :: M92N9MMxe = 8847 - INTEGER(IntKi), PARAMETER :: M93N1MMxe = 8848 - INTEGER(IntKi), PARAMETER :: M93N2MMxe = 8849 - INTEGER(IntKi), PARAMETER :: M93N3MMxe = 8850 - INTEGER(IntKi), PARAMETER :: M93N4MMxe = 8851 - INTEGER(IntKi), PARAMETER :: M93N5MMxe = 8852 - INTEGER(IntKi), PARAMETER :: M93N6MMxe = 8853 - INTEGER(IntKi), PARAMETER :: M93N7MMxe = 8854 - INTEGER(IntKi), PARAMETER :: M93N8MMxe = 8855 - INTEGER(IntKi), PARAMETER :: M93N9MMxe = 8856 - INTEGER(IntKi), PARAMETER :: M94N1MMxe = 8857 - INTEGER(IntKi), PARAMETER :: M94N2MMxe = 8858 - INTEGER(IntKi), PARAMETER :: M94N3MMxe = 8859 - INTEGER(IntKi), PARAMETER :: M94N4MMxe = 8860 - INTEGER(IntKi), PARAMETER :: M94N5MMxe = 8861 - INTEGER(IntKi), PARAMETER :: M94N6MMxe = 8862 - INTEGER(IntKi), PARAMETER :: M94N7MMxe = 8863 - INTEGER(IntKi), PARAMETER :: M94N8MMxe = 8864 - INTEGER(IntKi), PARAMETER :: M94N9MMxe = 8865 - INTEGER(IntKi), PARAMETER :: M95N1MMxe = 8866 - INTEGER(IntKi), PARAMETER :: M95N2MMxe = 8867 - INTEGER(IntKi), PARAMETER :: M95N3MMxe = 8868 - INTEGER(IntKi), PARAMETER :: M95N4MMxe = 8869 - INTEGER(IntKi), PARAMETER :: M95N5MMxe = 8870 - INTEGER(IntKi), PARAMETER :: M95N6MMxe = 8871 - INTEGER(IntKi), PARAMETER :: M95N7MMxe = 8872 - INTEGER(IntKi), PARAMETER :: M95N8MMxe = 8873 - INTEGER(IntKi), PARAMETER :: M95N9MMxe = 8874 - INTEGER(IntKi), PARAMETER :: M96N1MMxe = 8875 - INTEGER(IntKi), PARAMETER :: M96N2MMxe = 8876 - INTEGER(IntKi), PARAMETER :: M96N3MMxe = 8877 - INTEGER(IntKi), PARAMETER :: M96N4MMxe = 8878 - INTEGER(IntKi), PARAMETER :: M96N5MMxe = 8879 - INTEGER(IntKi), PARAMETER :: M96N6MMxe = 8880 - INTEGER(IntKi), PARAMETER :: M96N7MMxe = 8881 - INTEGER(IntKi), PARAMETER :: M96N8MMxe = 8882 - INTEGER(IntKi), PARAMETER :: M96N9MMxe = 8883 - INTEGER(IntKi), PARAMETER :: M97N1MMxe = 8884 - INTEGER(IntKi), PARAMETER :: M97N2MMxe = 8885 - INTEGER(IntKi), PARAMETER :: M97N3MMxe = 8886 - INTEGER(IntKi), PARAMETER :: M97N4MMxe = 8887 - INTEGER(IntKi), PARAMETER :: M97N5MMxe = 8888 - INTEGER(IntKi), PARAMETER :: M97N6MMxe = 8889 - INTEGER(IntKi), PARAMETER :: M97N7MMxe = 8890 - INTEGER(IntKi), PARAMETER :: M97N8MMxe = 8891 - INTEGER(IntKi), PARAMETER :: M97N9MMxe = 8892 - INTEGER(IntKi), PARAMETER :: M98N1MMxe = 8893 - INTEGER(IntKi), PARAMETER :: M98N2MMxe = 8894 - INTEGER(IntKi), PARAMETER :: M98N3MMxe = 8895 - INTEGER(IntKi), PARAMETER :: M98N4MMxe = 8896 - INTEGER(IntKi), PARAMETER :: M98N5MMxe = 8897 - INTEGER(IntKi), PARAMETER :: M98N6MMxe = 8898 - INTEGER(IntKi), PARAMETER :: M98N7MMxe = 8899 - INTEGER(IntKi), PARAMETER :: M98N8MMxe = 8900 - INTEGER(IntKi), PARAMETER :: M98N9MMxe = 8901 - INTEGER(IntKi), PARAMETER :: M99N1MMxe = 8902 - INTEGER(IntKi), PARAMETER :: M99N2MMxe = 8903 - INTEGER(IntKi), PARAMETER :: M99N3MMxe = 8904 - INTEGER(IntKi), PARAMETER :: M99N4MMxe = 8905 - INTEGER(IntKi), PARAMETER :: M99N5MMxe = 8906 - INTEGER(IntKi), PARAMETER :: M99N6MMxe = 8907 - INTEGER(IntKi), PARAMETER :: M99N7MMxe = 8908 - INTEGER(IntKi), PARAMETER :: M99N8MMxe = 8909 - INTEGER(IntKi), PARAMETER :: M99N9MMxe = 8910 - INTEGER(IntKi), PARAMETER :: M01N1MMye = 8911 - INTEGER(IntKi), PARAMETER :: M01N2MMye = 8912 - INTEGER(IntKi), PARAMETER :: M01N3MMye = 8913 - INTEGER(IntKi), PARAMETER :: M01N4MMye = 8914 - INTEGER(IntKi), PARAMETER :: M01N5MMye = 8915 - INTEGER(IntKi), PARAMETER :: M01N6MMye = 8916 - INTEGER(IntKi), PARAMETER :: M01N7MMye = 8917 - INTEGER(IntKi), PARAMETER :: M01N8MMye = 8918 - INTEGER(IntKi), PARAMETER :: M01N9MMye = 8919 - INTEGER(IntKi), PARAMETER :: M02N1MMye = 8920 - INTEGER(IntKi), PARAMETER :: M02N2MMye = 8921 - INTEGER(IntKi), PARAMETER :: M02N3MMye = 8922 - INTEGER(IntKi), PARAMETER :: M02N4MMye = 8923 - INTEGER(IntKi), PARAMETER :: M02N5MMye = 8924 - INTEGER(IntKi), PARAMETER :: M02N6MMye = 8925 - INTEGER(IntKi), PARAMETER :: M02N7MMye = 8926 - INTEGER(IntKi), PARAMETER :: M02N8MMye = 8927 - INTEGER(IntKi), PARAMETER :: M02N9MMye = 8928 - INTEGER(IntKi), PARAMETER :: M03N1MMye = 8929 - INTEGER(IntKi), PARAMETER :: M03N2MMye = 8930 - INTEGER(IntKi), PARAMETER :: M03N3MMye = 8931 - INTEGER(IntKi), PARAMETER :: M03N4MMye = 8932 - INTEGER(IntKi), PARAMETER :: M03N5MMye = 8933 - INTEGER(IntKi), PARAMETER :: M03N6MMye = 8934 - INTEGER(IntKi), PARAMETER :: M03N7MMye = 8935 - INTEGER(IntKi), PARAMETER :: M03N8MMye = 8936 - INTEGER(IntKi), PARAMETER :: M03N9MMye = 8937 - INTEGER(IntKi), PARAMETER :: M04N1MMye = 8938 - INTEGER(IntKi), PARAMETER :: M04N2MMye = 8939 - INTEGER(IntKi), PARAMETER :: M04N3MMye = 8940 - INTEGER(IntKi), PARAMETER :: M04N4MMye = 8941 - INTEGER(IntKi), PARAMETER :: M04N5MMye = 8942 - INTEGER(IntKi), PARAMETER :: M04N6MMye = 8943 - INTEGER(IntKi), PARAMETER :: M04N7MMye = 8944 - INTEGER(IntKi), PARAMETER :: M04N8MMye = 8945 - INTEGER(IntKi), PARAMETER :: M04N9MMye = 8946 - INTEGER(IntKi), PARAMETER :: M05N1MMye = 8947 - INTEGER(IntKi), PARAMETER :: M05N2MMye = 8948 - INTEGER(IntKi), PARAMETER :: M05N3MMye = 8949 - INTEGER(IntKi), PARAMETER :: M05N4MMye = 8950 - INTEGER(IntKi), PARAMETER :: M05N5MMye = 8951 - INTEGER(IntKi), PARAMETER :: M05N6MMye = 8952 - INTEGER(IntKi), PARAMETER :: M05N7MMye = 8953 - INTEGER(IntKi), PARAMETER :: M05N8MMye = 8954 - INTEGER(IntKi), PARAMETER :: M05N9MMye = 8955 - INTEGER(IntKi), PARAMETER :: M06N1MMye = 8956 - INTEGER(IntKi), PARAMETER :: M06N2MMye = 8957 - INTEGER(IntKi), PARAMETER :: M06N3MMye = 8958 - INTEGER(IntKi), PARAMETER :: M06N4MMye = 8959 - INTEGER(IntKi), PARAMETER :: M06N5MMye = 8960 - INTEGER(IntKi), PARAMETER :: M06N6MMye = 8961 - INTEGER(IntKi), PARAMETER :: M06N7MMye = 8962 - INTEGER(IntKi), PARAMETER :: M06N8MMye = 8963 - INTEGER(IntKi), PARAMETER :: M06N9MMye = 8964 - INTEGER(IntKi), PARAMETER :: M07N1MMye = 8965 - INTEGER(IntKi), PARAMETER :: M07N2MMye = 8966 - INTEGER(IntKi), PARAMETER :: M07N3MMye = 8967 - INTEGER(IntKi), PARAMETER :: M07N4MMye = 8968 - INTEGER(IntKi), PARAMETER :: M07N5MMye = 8969 - INTEGER(IntKi), PARAMETER :: M07N6MMye = 8970 - INTEGER(IntKi), PARAMETER :: M07N7MMye = 8971 - INTEGER(IntKi), PARAMETER :: M07N8MMye = 8972 - INTEGER(IntKi), PARAMETER :: M07N9MMye = 8973 - INTEGER(IntKi), PARAMETER :: M08N1MMye = 8974 - INTEGER(IntKi), PARAMETER :: M08N2MMye = 8975 - INTEGER(IntKi), PARAMETER :: M08N3MMye = 8976 - INTEGER(IntKi), PARAMETER :: M08N4MMye = 8977 - INTEGER(IntKi), PARAMETER :: M08N5MMye = 8978 - INTEGER(IntKi), PARAMETER :: M08N6MMye = 8979 - INTEGER(IntKi), PARAMETER :: M08N7MMye = 8980 - INTEGER(IntKi), PARAMETER :: M08N8MMye = 8981 - INTEGER(IntKi), PARAMETER :: M08N9MMye = 8982 - INTEGER(IntKi), PARAMETER :: M09N1MMye = 8983 - INTEGER(IntKi), PARAMETER :: M09N2MMye = 8984 - INTEGER(IntKi), PARAMETER :: M09N3MMye = 8985 - INTEGER(IntKi), PARAMETER :: M09N4MMye = 8986 - INTEGER(IntKi), PARAMETER :: M09N5MMye = 8987 - INTEGER(IntKi), PARAMETER :: M09N6MMye = 8988 - INTEGER(IntKi), PARAMETER :: M09N7MMye = 8989 - INTEGER(IntKi), PARAMETER :: M09N8MMye = 8990 - INTEGER(IntKi), PARAMETER :: M09N9MMye = 8991 - INTEGER(IntKi), PARAMETER :: M10N1MMye = 8992 - INTEGER(IntKi), PARAMETER :: M10N2MMye = 8993 - INTEGER(IntKi), PARAMETER :: M10N3MMye = 8994 - INTEGER(IntKi), PARAMETER :: M10N4MMye = 8995 - INTEGER(IntKi), PARAMETER :: M10N5MMye = 8996 - INTEGER(IntKi), PARAMETER :: M10N6MMye = 8997 - INTEGER(IntKi), PARAMETER :: M10N7MMye = 8998 - INTEGER(IntKi), PARAMETER :: M10N8MMye = 8999 - INTEGER(IntKi), PARAMETER :: M10N9MMye = 9000 - INTEGER(IntKi), PARAMETER :: M11N1MMye = 9001 - INTEGER(IntKi), PARAMETER :: M11N2MMye = 9002 - INTEGER(IntKi), PARAMETER :: M11N3MMye = 9003 - INTEGER(IntKi), PARAMETER :: M11N4MMye = 9004 - INTEGER(IntKi), PARAMETER :: M11N5MMye = 9005 - INTEGER(IntKi), PARAMETER :: M11N6MMye = 9006 - INTEGER(IntKi), PARAMETER :: M11N7MMye = 9007 - INTEGER(IntKi), PARAMETER :: M11N8MMye = 9008 - INTEGER(IntKi), PARAMETER :: M11N9MMye = 9009 - INTEGER(IntKi), PARAMETER :: M12N1MMye = 9010 - INTEGER(IntKi), PARAMETER :: M12N2MMye = 9011 - INTEGER(IntKi), PARAMETER :: M12N3MMye = 9012 - INTEGER(IntKi), PARAMETER :: M12N4MMye = 9013 - INTEGER(IntKi), PARAMETER :: M12N5MMye = 9014 - INTEGER(IntKi), PARAMETER :: M12N6MMye = 9015 - INTEGER(IntKi), PARAMETER :: M12N7MMye = 9016 - INTEGER(IntKi), PARAMETER :: M12N8MMye = 9017 - INTEGER(IntKi), PARAMETER :: M12N9MMye = 9018 - INTEGER(IntKi), PARAMETER :: M13N1MMye = 9019 - INTEGER(IntKi), PARAMETER :: M13N2MMye = 9020 - INTEGER(IntKi), PARAMETER :: M13N3MMye = 9021 - INTEGER(IntKi), PARAMETER :: M13N4MMye = 9022 - INTEGER(IntKi), PARAMETER :: M13N5MMye = 9023 - INTEGER(IntKi), PARAMETER :: M13N6MMye = 9024 - INTEGER(IntKi), PARAMETER :: M13N7MMye = 9025 - INTEGER(IntKi), PARAMETER :: M13N8MMye = 9026 - INTEGER(IntKi), PARAMETER :: M13N9MMye = 9027 - INTEGER(IntKi), PARAMETER :: M14N1MMye = 9028 - INTEGER(IntKi), PARAMETER :: M14N2MMye = 9029 - INTEGER(IntKi), PARAMETER :: M14N3MMye = 9030 - INTEGER(IntKi), PARAMETER :: M14N4MMye = 9031 - INTEGER(IntKi), PARAMETER :: M14N5MMye = 9032 - INTEGER(IntKi), PARAMETER :: M14N6MMye = 9033 - INTEGER(IntKi), PARAMETER :: M14N7MMye = 9034 - INTEGER(IntKi), PARAMETER :: M14N8MMye = 9035 - INTEGER(IntKi), PARAMETER :: M14N9MMye = 9036 - INTEGER(IntKi), PARAMETER :: M15N1MMye = 9037 - INTEGER(IntKi), PARAMETER :: M15N2MMye = 9038 - INTEGER(IntKi), PARAMETER :: M15N3MMye = 9039 - INTEGER(IntKi), PARAMETER :: M15N4MMye = 9040 - INTEGER(IntKi), PARAMETER :: M15N5MMye = 9041 - INTEGER(IntKi), PARAMETER :: M15N6MMye = 9042 - INTEGER(IntKi), PARAMETER :: M15N7MMye = 9043 - INTEGER(IntKi), PARAMETER :: M15N8MMye = 9044 - INTEGER(IntKi), PARAMETER :: M15N9MMye = 9045 - INTEGER(IntKi), PARAMETER :: M16N1MMye = 9046 - INTEGER(IntKi), PARAMETER :: M16N2MMye = 9047 - INTEGER(IntKi), PARAMETER :: M16N3MMye = 9048 - INTEGER(IntKi), PARAMETER :: M16N4MMye = 9049 - INTEGER(IntKi), PARAMETER :: M16N5MMye = 9050 - INTEGER(IntKi), PARAMETER :: M16N6MMye = 9051 - INTEGER(IntKi), PARAMETER :: M16N7MMye = 9052 - INTEGER(IntKi), PARAMETER :: M16N8MMye = 9053 - INTEGER(IntKi), PARAMETER :: M16N9MMye = 9054 - INTEGER(IntKi), PARAMETER :: M17N1MMye = 9055 - INTEGER(IntKi), PARAMETER :: M17N2MMye = 9056 - INTEGER(IntKi), PARAMETER :: M17N3MMye = 9057 - INTEGER(IntKi), PARAMETER :: M17N4MMye = 9058 - INTEGER(IntKi), PARAMETER :: M17N5MMye = 9059 - INTEGER(IntKi), PARAMETER :: M17N6MMye = 9060 - INTEGER(IntKi), PARAMETER :: M17N7MMye = 9061 - INTEGER(IntKi), PARAMETER :: M17N8MMye = 9062 - INTEGER(IntKi), PARAMETER :: M17N9MMye = 9063 - INTEGER(IntKi), PARAMETER :: M18N1MMye = 9064 - INTEGER(IntKi), PARAMETER :: M18N2MMye = 9065 - INTEGER(IntKi), PARAMETER :: M18N3MMye = 9066 - INTEGER(IntKi), PARAMETER :: M18N4MMye = 9067 - INTEGER(IntKi), PARAMETER :: M18N5MMye = 9068 - INTEGER(IntKi), PARAMETER :: M18N6MMye = 9069 - INTEGER(IntKi), PARAMETER :: M18N7MMye = 9070 - INTEGER(IntKi), PARAMETER :: M18N8MMye = 9071 - INTEGER(IntKi), PARAMETER :: M18N9MMye = 9072 - INTEGER(IntKi), PARAMETER :: M19N1MMye = 9073 - INTEGER(IntKi), PARAMETER :: M19N2MMye = 9074 - INTEGER(IntKi), PARAMETER :: M19N3MMye = 9075 - INTEGER(IntKi), PARAMETER :: M19N4MMye = 9076 - INTEGER(IntKi), PARAMETER :: M19N5MMye = 9077 - INTEGER(IntKi), PARAMETER :: M19N6MMye = 9078 - INTEGER(IntKi), PARAMETER :: M19N7MMye = 9079 - INTEGER(IntKi), PARAMETER :: M19N8MMye = 9080 - INTEGER(IntKi), PARAMETER :: M19N9MMye = 9081 - INTEGER(IntKi), PARAMETER :: M20N1MMye = 9082 - INTEGER(IntKi), PARAMETER :: M20N2MMye = 9083 - INTEGER(IntKi), PARAMETER :: M20N3MMye = 9084 - INTEGER(IntKi), PARAMETER :: M20N4MMye = 9085 - INTEGER(IntKi), PARAMETER :: M20N5MMye = 9086 - INTEGER(IntKi), PARAMETER :: M20N6MMye = 9087 - INTEGER(IntKi), PARAMETER :: M20N7MMye = 9088 - INTEGER(IntKi), PARAMETER :: M20N8MMye = 9089 - INTEGER(IntKi), PARAMETER :: M20N9MMye = 9090 - INTEGER(IntKi), PARAMETER :: M21N1MMye = 9091 - INTEGER(IntKi), PARAMETER :: M21N2MMye = 9092 - INTEGER(IntKi), PARAMETER :: M21N3MMye = 9093 - INTEGER(IntKi), PARAMETER :: M21N4MMye = 9094 - INTEGER(IntKi), PARAMETER :: M21N5MMye = 9095 - INTEGER(IntKi), PARAMETER :: M21N6MMye = 9096 - INTEGER(IntKi), PARAMETER :: M21N7MMye = 9097 - INTEGER(IntKi), PARAMETER :: M21N8MMye = 9098 - INTEGER(IntKi), PARAMETER :: M21N9MMye = 9099 - INTEGER(IntKi), PARAMETER :: M22N1MMye = 9100 - INTEGER(IntKi), PARAMETER :: M22N2MMye = 9101 - INTEGER(IntKi), PARAMETER :: M22N3MMye = 9102 - INTEGER(IntKi), PARAMETER :: M22N4MMye = 9103 - INTEGER(IntKi), PARAMETER :: M22N5MMye = 9104 - INTEGER(IntKi), PARAMETER :: M22N6MMye = 9105 - INTEGER(IntKi), PARAMETER :: M22N7MMye = 9106 - INTEGER(IntKi), PARAMETER :: M22N8MMye = 9107 - INTEGER(IntKi), PARAMETER :: M22N9MMye = 9108 - INTEGER(IntKi), PARAMETER :: M23N1MMye = 9109 - INTEGER(IntKi), PARAMETER :: M23N2MMye = 9110 - INTEGER(IntKi), PARAMETER :: M23N3MMye = 9111 - INTEGER(IntKi), PARAMETER :: M23N4MMye = 9112 - INTEGER(IntKi), PARAMETER :: M23N5MMye = 9113 - INTEGER(IntKi), PARAMETER :: M23N6MMye = 9114 - INTEGER(IntKi), PARAMETER :: M23N7MMye = 9115 - INTEGER(IntKi), PARAMETER :: M23N8MMye = 9116 - INTEGER(IntKi), PARAMETER :: M23N9MMye = 9117 - INTEGER(IntKi), PARAMETER :: M24N1MMye = 9118 - INTEGER(IntKi), PARAMETER :: M24N2MMye = 9119 - INTEGER(IntKi), PARAMETER :: M24N3MMye = 9120 - INTEGER(IntKi), PARAMETER :: M24N4MMye = 9121 - INTEGER(IntKi), PARAMETER :: M24N5MMye = 9122 - INTEGER(IntKi), PARAMETER :: M24N6MMye = 9123 - INTEGER(IntKi), PARAMETER :: M24N7MMye = 9124 - INTEGER(IntKi), PARAMETER :: M24N8MMye = 9125 - INTEGER(IntKi), PARAMETER :: M24N9MMye = 9126 - INTEGER(IntKi), PARAMETER :: M25N1MMye = 9127 - INTEGER(IntKi), PARAMETER :: M25N2MMye = 9128 - INTEGER(IntKi), PARAMETER :: M25N3MMye = 9129 - INTEGER(IntKi), PARAMETER :: M25N4MMye = 9130 - INTEGER(IntKi), PARAMETER :: M25N5MMye = 9131 - INTEGER(IntKi), PARAMETER :: M25N6MMye = 9132 - INTEGER(IntKi), PARAMETER :: M25N7MMye = 9133 - INTEGER(IntKi), PARAMETER :: M25N8MMye = 9134 - INTEGER(IntKi), PARAMETER :: M25N9MMye = 9135 - INTEGER(IntKi), PARAMETER :: M26N1MMye = 9136 - INTEGER(IntKi), PARAMETER :: M26N2MMye = 9137 - INTEGER(IntKi), PARAMETER :: M26N3MMye = 9138 - INTEGER(IntKi), PARAMETER :: M26N4MMye = 9139 - INTEGER(IntKi), PARAMETER :: M26N5MMye = 9140 - INTEGER(IntKi), PARAMETER :: M26N6MMye = 9141 - INTEGER(IntKi), PARAMETER :: M26N7MMye = 9142 - INTEGER(IntKi), PARAMETER :: M26N8MMye = 9143 - INTEGER(IntKi), PARAMETER :: M26N9MMye = 9144 - INTEGER(IntKi), PARAMETER :: M27N1MMye = 9145 - INTEGER(IntKi), PARAMETER :: M27N2MMye = 9146 - INTEGER(IntKi), PARAMETER :: M27N3MMye = 9147 - INTEGER(IntKi), PARAMETER :: M27N4MMye = 9148 - INTEGER(IntKi), PARAMETER :: M27N5MMye = 9149 - INTEGER(IntKi), PARAMETER :: M27N6MMye = 9150 - INTEGER(IntKi), PARAMETER :: M27N7MMye = 9151 - INTEGER(IntKi), PARAMETER :: M27N8MMye = 9152 - INTEGER(IntKi), PARAMETER :: M27N9MMye = 9153 - INTEGER(IntKi), PARAMETER :: M28N1MMye = 9154 - INTEGER(IntKi), PARAMETER :: M28N2MMye = 9155 - INTEGER(IntKi), PARAMETER :: M28N3MMye = 9156 - INTEGER(IntKi), PARAMETER :: M28N4MMye = 9157 - INTEGER(IntKi), PARAMETER :: M28N5MMye = 9158 - INTEGER(IntKi), PARAMETER :: M28N6MMye = 9159 - INTEGER(IntKi), PARAMETER :: M28N7MMye = 9160 - INTEGER(IntKi), PARAMETER :: M28N8MMye = 9161 - INTEGER(IntKi), PARAMETER :: M28N9MMye = 9162 - INTEGER(IntKi), PARAMETER :: M29N1MMye = 9163 - INTEGER(IntKi), PARAMETER :: M29N2MMye = 9164 - INTEGER(IntKi), PARAMETER :: M29N3MMye = 9165 - INTEGER(IntKi), PARAMETER :: M29N4MMye = 9166 - INTEGER(IntKi), PARAMETER :: M29N5MMye = 9167 - INTEGER(IntKi), PARAMETER :: M29N6MMye = 9168 - INTEGER(IntKi), PARAMETER :: M29N7MMye = 9169 - INTEGER(IntKi), PARAMETER :: M29N8MMye = 9170 - INTEGER(IntKi), PARAMETER :: M29N9MMye = 9171 - INTEGER(IntKi), PARAMETER :: M30N1MMye = 9172 - INTEGER(IntKi), PARAMETER :: M30N2MMye = 9173 - INTEGER(IntKi), PARAMETER :: M30N3MMye = 9174 - INTEGER(IntKi), PARAMETER :: M30N4MMye = 9175 - INTEGER(IntKi), PARAMETER :: M30N5MMye = 9176 - INTEGER(IntKi), PARAMETER :: M30N6MMye = 9177 - INTEGER(IntKi), PARAMETER :: M30N7MMye = 9178 - INTEGER(IntKi), PARAMETER :: M30N8MMye = 9179 - INTEGER(IntKi), PARAMETER :: M30N9MMye = 9180 - INTEGER(IntKi), PARAMETER :: M31N1MMye = 9181 - INTEGER(IntKi), PARAMETER :: M31N2MMye = 9182 - INTEGER(IntKi), PARAMETER :: M31N3MMye = 9183 - INTEGER(IntKi), PARAMETER :: M31N4MMye = 9184 - INTEGER(IntKi), PARAMETER :: M31N5MMye = 9185 - INTEGER(IntKi), PARAMETER :: M31N6MMye = 9186 - INTEGER(IntKi), PARAMETER :: M31N7MMye = 9187 - INTEGER(IntKi), PARAMETER :: M31N8MMye = 9188 - INTEGER(IntKi), PARAMETER :: M31N9MMye = 9189 - INTEGER(IntKi), PARAMETER :: M32N1MMye = 9190 - INTEGER(IntKi), PARAMETER :: M32N2MMye = 9191 - INTEGER(IntKi), PARAMETER :: M32N3MMye = 9192 - INTEGER(IntKi), PARAMETER :: M32N4MMye = 9193 - INTEGER(IntKi), PARAMETER :: M32N5MMye = 9194 - INTEGER(IntKi), PARAMETER :: M32N6MMye = 9195 - INTEGER(IntKi), PARAMETER :: M32N7MMye = 9196 - INTEGER(IntKi), PARAMETER :: M32N8MMye = 9197 - INTEGER(IntKi), PARAMETER :: M32N9MMye = 9198 - INTEGER(IntKi), PARAMETER :: M33N1MMye = 9199 - INTEGER(IntKi), PARAMETER :: M33N2MMye = 9200 - INTEGER(IntKi), PARAMETER :: M33N3MMye = 9201 - INTEGER(IntKi), PARAMETER :: M33N4MMye = 9202 - INTEGER(IntKi), PARAMETER :: M33N5MMye = 9203 - INTEGER(IntKi), PARAMETER :: M33N6MMye = 9204 - INTEGER(IntKi), PARAMETER :: M33N7MMye = 9205 - INTEGER(IntKi), PARAMETER :: M33N8MMye = 9206 - INTEGER(IntKi), PARAMETER :: M33N9MMye = 9207 - INTEGER(IntKi), PARAMETER :: M34N1MMye = 9208 - INTEGER(IntKi), PARAMETER :: M34N2MMye = 9209 - INTEGER(IntKi), PARAMETER :: M34N3MMye = 9210 - INTEGER(IntKi), PARAMETER :: M34N4MMye = 9211 - INTEGER(IntKi), PARAMETER :: M34N5MMye = 9212 - INTEGER(IntKi), PARAMETER :: M34N6MMye = 9213 - INTEGER(IntKi), PARAMETER :: M34N7MMye = 9214 - INTEGER(IntKi), PARAMETER :: M34N8MMye = 9215 - INTEGER(IntKi), PARAMETER :: M34N9MMye = 9216 - INTEGER(IntKi), PARAMETER :: M35N1MMye = 9217 - INTEGER(IntKi), PARAMETER :: M35N2MMye = 9218 - INTEGER(IntKi), PARAMETER :: M35N3MMye = 9219 - INTEGER(IntKi), PARAMETER :: M35N4MMye = 9220 - INTEGER(IntKi), PARAMETER :: M35N5MMye = 9221 - INTEGER(IntKi), PARAMETER :: M35N6MMye = 9222 - INTEGER(IntKi), PARAMETER :: M35N7MMye = 9223 - INTEGER(IntKi), PARAMETER :: M35N8MMye = 9224 - INTEGER(IntKi), PARAMETER :: M35N9MMye = 9225 - INTEGER(IntKi), PARAMETER :: M36N1MMye = 9226 - INTEGER(IntKi), PARAMETER :: M36N2MMye = 9227 - INTEGER(IntKi), PARAMETER :: M36N3MMye = 9228 - INTEGER(IntKi), PARAMETER :: M36N4MMye = 9229 - INTEGER(IntKi), PARAMETER :: M36N5MMye = 9230 - INTEGER(IntKi), PARAMETER :: M36N6MMye = 9231 - INTEGER(IntKi), PARAMETER :: M36N7MMye = 9232 - INTEGER(IntKi), PARAMETER :: M36N8MMye = 9233 - INTEGER(IntKi), PARAMETER :: M36N9MMye = 9234 - INTEGER(IntKi), PARAMETER :: M37N1MMye = 9235 - INTEGER(IntKi), PARAMETER :: M37N2MMye = 9236 - INTEGER(IntKi), PARAMETER :: M37N3MMye = 9237 - INTEGER(IntKi), PARAMETER :: M37N4MMye = 9238 - INTEGER(IntKi), PARAMETER :: M37N5MMye = 9239 - INTEGER(IntKi), PARAMETER :: M37N6MMye = 9240 - INTEGER(IntKi), PARAMETER :: M37N7MMye = 9241 - INTEGER(IntKi), PARAMETER :: M37N8MMye = 9242 - INTEGER(IntKi), PARAMETER :: M37N9MMye = 9243 - INTEGER(IntKi), PARAMETER :: M38N1MMye = 9244 - INTEGER(IntKi), PARAMETER :: M38N2MMye = 9245 - INTEGER(IntKi), PARAMETER :: M38N3MMye = 9246 - INTEGER(IntKi), PARAMETER :: M38N4MMye = 9247 - INTEGER(IntKi), PARAMETER :: M38N5MMye = 9248 - INTEGER(IntKi), PARAMETER :: M38N6MMye = 9249 - INTEGER(IntKi), PARAMETER :: M38N7MMye = 9250 - INTEGER(IntKi), PARAMETER :: M38N8MMye = 9251 - INTEGER(IntKi), PARAMETER :: M38N9MMye = 9252 - INTEGER(IntKi), PARAMETER :: M39N1MMye = 9253 - INTEGER(IntKi), PARAMETER :: M39N2MMye = 9254 - INTEGER(IntKi), PARAMETER :: M39N3MMye = 9255 - INTEGER(IntKi), PARAMETER :: M39N4MMye = 9256 - INTEGER(IntKi), PARAMETER :: M39N5MMye = 9257 - INTEGER(IntKi), PARAMETER :: M39N6MMye = 9258 - INTEGER(IntKi), PARAMETER :: M39N7MMye = 9259 - INTEGER(IntKi), PARAMETER :: M39N8MMye = 9260 - INTEGER(IntKi), PARAMETER :: M39N9MMye = 9261 - INTEGER(IntKi), PARAMETER :: M40N1MMye = 9262 - INTEGER(IntKi), PARAMETER :: M40N2MMye = 9263 - INTEGER(IntKi), PARAMETER :: M40N3MMye = 9264 - INTEGER(IntKi), PARAMETER :: M40N4MMye = 9265 - INTEGER(IntKi), PARAMETER :: M40N5MMye = 9266 - INTEGER(IntKi), PARAMETER :: M40N6MMye = 9267 - INTEGER(IntKi), PARAMETER :: M40N7MMye = 9268 - INTEGER(IntKi), PARAMETER :: M40N8MMye = 9269 - INTEGER(IntKi), PARAMETER :: M40N9MMye = 9270 - INTEGER(IntKi), PARAMETER :: M41N1MMye = 9271 - INTEGER(IntKi), PARAMETER :: M41N2MMye = 9272 - INTEGER(IntKi), PARAMETER :: M41N3MMye = 9273 - INTEGER(IntKi), PARAMETER :: M41N4MMye = 9274 - INTEGER(IntKi), PARAMETER :: M41N5MMye = 9275 - INTEGER(IntKi), PARAMETER :: M41N6MMye = 9276 - INTEGER(IntKi), PARAMETER :: M41N7MMye = 9277 - INTEGER(IntKi), PARAMETER :: M41N8MMye = 9278 - INTEGER(IntKi), PARAMETER :: M41N9MMye = 9279 - INTEGER(IntKi), PARAMETER :: M42N1MMye = 9280 - INTEGER(IntKi), PARAMETER :: M42N2MMye = 9281 - INTEGER(IntKi), PARAMETER :: M42N3MMye = 9282 - INTEGER(IntKi), PARAMETER :: M42N4MMye = 9283 - INTEGER(IntKi), PARAMETER :: M42N5MMye = 9284 - INTEGER(IntKi), PARAMETER :: M42N6MMye = 9285 - INTEGER(IntKi), PARAMETER :: M42N7MMye = 9286 - INTEGER(IntKi), PARAMETER :: M42N8MMye = 9287 - INTEGER(IntKi), PARAMETER :: M42N9MMye = 9288 - INTEGER(IntKi), PARAMETER :: M43N1MMye = 9289 - INTEGER(IntKi), PARAMETER :: M43N2MMye = 9290 - INTEGER(IntKi), PARAMETER :: M43N3MMye = 9291 - INTEGER(IntKi), PARAMETER :: M43N4MMye = 9292 - INTEGER(IntKi), PARAMETER :: M43N5MMye = 9293 - INTEGER(IntKi), PARAMETER :: M43N6MMye = 9294 - INTEGER(IntKi), PARAMETER :: M43N7MMye = 9295 - INTEGER(IntKi), PARAMETER :: M43N8MMye = 9296 - INTEGER(IntKi), PARAMETER :: M43N9MMye = 9297 - INTEGER(IntKi), PARAMETER :: M44N1MMye = 9298 - INTEGER(IntKi), PARAMETER :: M44N2MMye = 9299 - INTEGER(IntKi), PARAMETER :: M44N3MMye = 9300 - INTEGER(IntKi), PARAMETER :: M44N4MMye = 9301 - INTEGER(IntKi), PARAMETER :: M44N5MMye = 9302 - INTEGER(IntKi), PARAMETER :: M44N6MMye = 9303 - INTEGER(IntKi), PARAMETER :: M44N7MMye = 9304 - INTEGER(IntKi), PARAMETER :: M44N8MMye = 9305 - INTEGER(IntKi), PARAMETER :: M44N9MMye = 9306 - INTEGER(IntKi), PARAMETER :: M45N1MMye = 9307 - INTEGER(IntKi), PARAMETER :: M45N2MMye = 9308 - INTEGER(IntKi), PARAMETER :: M45N3MMye = 9309 - INTEGER(IntKi), PARAMETER :: M45N4MMye = 9310 - INTEGER(IntKi), PARAMETER :: M45N5MMye = 9311 - INTEGER(IntKi), PARAMETER :: M45N6MMye = 9312 - INTEGER(IntKi), PARAMETER :: M45N7MMye = 9313 - INTEGER(IntKi), PARAMETER :: M45N8MMye = 9314 - INTEGER(IntKi), PARAMETER :: M45N9MMye = 9315 - INTEGER(IntKi), PARAMETER :: M46N1MMye = 9316 - INTEGER(IntKi), PARAMETER :: M46N2MMye = 9317 - INTEGER(IntKi), PARAMETER :: M46N3MMye = 9318 - INTEGER(IntKi), PARAMETER :: M46N4MMye = 9319 - INTEGER(IntKi), PARAMETER :: M46N5MMye = 9320 - INTEGER(IntKi), PARAMETER :: M46N6MMye = 9321 - INTEGER(IntKi), PARAMETER :: M46N7MMye = 9322 - INTEGER(IntKi), PARAMETER :: M46N8MMye = 9323 - INTEGER(IntKi), PARAMETER :: M46N9MMye = 9324 - INTEGER(IntKi), PARAMETER :: M47N1MMye = 9325 - INTEGER(IntKi), PARAMETER :: M47N2MMye = 9326 - INTEGER(IntKi), PARAMETER :: M47N3MMye = 9327 - INTEGER(IntKi), PARAMETER :: M47N4MMye = 9328 - INTEGER(IntKi), PARAMETER :: M47N5MMye = 9329 - INTEGER(IntKi), PARAMETER :: M47N6MMye = 9330 - INTEGER(IntKi), PARAMETER :: M47N7MMye = 9331 - INTEGER(IntKi), PARAMETER :: M47N8MMye = 9332 - INTEGER(IntKi), PARAMETER :: M47N9MMye = 9333 - INTEGER(IntKi), PARAMETER :: M48N1MMye = 9334 - INTEGER(IntKi), PARAMETER :: M48N2MMye = 9335 - INTEGER(IntKi), PARAMETER :: M48N3MMye = 9336 - INTEGER(IntKi), PARAMETER :: M48N4MMye = 9337 - INTEGER(IntKi), PARAMETER :: M48N5MMye = 9338 - INTEGER(IntKi), PARAMETER :: M48N6MMye = 9339 - INTEGER(IntKi), PARAMETER :: M48N7MMye = 9340 - INTEGER(IntKi), PARAMETER :: M48N8MMye = 9341 - INTEGER(IntKi), PARAMETER :: M48N9MMye = 9342 - INTEGER(IntKi), PARAMETER :: M49N1MMye = 9343 - INTEGER(IntKi), PARAMETER :: M49N2MMye = 9344 - INTEGER(IntKi), PARAMETER :: M49N3MMye = 9345 - INTEGER(IntKi), PARAMETER :: M49N4MMye = 9346 - INTEGER(IntKi), PARAMETER :: M49N5MMye = 9347 - INTEGER(IntKi), PARAMETER :: M49N6MMye = 9348 - INTEGER(IntKi), PARAMETER :: M49N7MMye = 9349 - INTEGER(IntKi), PARAMETER :: M49N8MMye = 9350 - INTEGER(IntKi), PARAMETER :: M49N9MMye = 9351 - INTEGER(IntKi), PARAMETER :: M50N1MMye = 9352 - INTEGER(IntKi), PARAMETER :: M50N2MMye = 9353 - INTEGER(IntKi), PARAMETER :: M50N3MMye = 9354 - INTEGER(IntKi), PARAMETER :: M50N4MMye = 9355 - INTEGER(IntKi), PARAMETER :: M50N5MMye = 9356 - INTEGER(IntKi), PARAMETER :: M50N6MMye = 9357 - INTEGER(IntKi), PARAMETER :: M50N7MMye = 9358 - INTEGER(IntKi), PARAMETER :: M50N8MMye = 9359 - INTEGER(IntKi), PARAMETER :: M50N9MMye = 9360 - INTEGER(IntKi), PARAMETER :: M51N1MMye = 9361 - INTEGER(IntKi), PARAMETER :: M51N2MMye = 9362 - INTEGER(IntKi), PARAMETER :: M51N3MMye = 9363 - INTEGER(IntKi), PARAMETER :: M51N4MMye = 9364 - INTEGER(IntKi), PARAMETER :: M51N5MMye = 9365 - INTEGER(IntKi), PARAMETER :: M51N6MMye = 9366 - INTEGER(IntKi), PARAMETER :: M51N7MMye = 9367 - INTEGER(IntKi), PARAMETER :: M51N8MMye = 9368 - INTEGER(IntKi), PARAMETER :: M51N9MMye = 9369 - INTEGER(IntKi), PARAMETER :: M52N1MMye = 9370 - INTEGER(IntKi), PARAMETER :: M52N2MMye = 9371 - INTEGER(IntKi), PARAMETER :: M52N3MMye = 9372 - INTEGER(IntKi), PARAMETER :: M52N4MMye = 9373 - INTEGER(IntKi), PARAMETER :: M52N5MMye = 9374 - INTEGER(IntKi), PARAMETER :: M52N6MMye = 9375 - INTEGER(IntKi), PARAMETER :: M52N7MMye = 9376 - INTEGER(IntKi), PARAMETER :: M52N8MMye = 9377 - INTEGER(IntKi), PARAMETER :: M52N9MMye = 9378 - INTEGER(IntKi), PARAMETER :: M53N1MMye = 9379 - INTEGER(IntKi), PARAMETER :: M53N2MMye = 9380 - INTEGER(IntKi), PARAMETER :: M53N3MMye = 9381 - INTEGER(IntKi), PARAMETER :: M53N4MMye = 9382 - INTEGER(IntKi), PARAMETER :: M53N5MMye = 9383 - INTEGER(IntKi), PARAMETER :: M53N6MMye = 9384 - INTEGER(IntKi), PARAMETER :: M53N7MMye = 9385 - INTEGER(IntKi), PARAMETER :: M53N8MMye = 9386 - INTEGER(IntKi), PARAMETER :: M53N9MMye = 9387 - INTEGER(IntKi), PARAMETER :: M54N1MMye = 9388 - INTEGER(IntKi), PARAMETER :: M54N2MMye = 9389 - INTEGER(IntKi), PARAMETER :: M54N3MMye = 9390 - INTEGER(IntKi), PARAMETER :: M54N4MMye = 9391 - INTEGER(IntKi), PARAMETER :: M54N5MMye = 9392 - INTEGER(IntKi), PARAMETER :: M54N6MMye = 9393 - INTEGER(IntKi), PARAMETER :: M54N7MMye = 9394 - INTEGER(IntKi), PARAMETER :: M54N8MMye = 9395 - INTEGER(IntKi), PARAMETER :: M54N9MMye = 9396 - INTEGER(IntKi), PARAMETER :: M55N1MMye = 9397 - INTEGER(IntKi), PARAMETER :: M55N2MMye = 9398 - INTEGER(IntKi), PARAMETER :: M55N3MMye = 9399 - INTEGER(IntKi), PARAMETER :: M55N4MMye = 9400 - INTEGER(IntKi), PARAMETER :: M55N5MMye = 9401 - INTEGER(IntKi), PARAMETER :: M55N6MMye = 9402 - INTEGER(IntKi), PARAMETER :: M55N7MMye = 9403 - INTEGER(IntKi), PARAMETER :: M55N8MMye = 9404 - INTEGER(IntKi), PARAMETER :: M55N9MMye = 9405 - INTEGER(IntKi), PARAMETER :: M56N1MMye = 9406 - INTEGER(IntKi), PARAMETER :: M56N2MMye = 9407 - INTEGER(IntKi), PARAMETER :: M56N3MMye = 9408 - INTEGER(IntKi), PARAMETER :: M56N4MMye = 9409 - INTEGER(IntKi), PARAMETER :: M56N5MMye = 9410 - INTEGER(IntKi), PARAMETER :: M56N6MMye = 9411 - INTEGER(IntKi), PARAMETER :: M56N7MMye = 9412 - INTEGER(IntKi), PARAMETER :: M56N8MMye = 9413 - INTEGER(IntKi), PARAMETER :: M56N9MMye = 9414 - INTEGER(IntKi), PARAMETER :: M57N1MMye = 9415 - INTEGER(IntKi), PARAMETER :: M57N2MMye = 9416 - INTEGER(IntKi), PARAMETER :: M57N3MMye = 9417 - INTEGER(IntKi), PARAMETER :: M57N4MMye = 9418 - INTEGER(IntKi), PARAMETER :: M57N5MMye = 9419 - INTEGER(IntKi), PARAMETER :: M57N6MMye = 9420 - INTEGER(IntKi), PARAMETER :: M57N7MMye = 9421 - INTEGER(IntKi), PARAMETER :: M57N8MMye = 9422 - INTEGER(IntKi), PARAMETER :: M57N9MMye = 9423 - INTEGER(IntKi), PARAMETER :: M58N1MMye = 9424 - INTEGER(IntKi), PARAMETER :: M58N2MMye = 9425 - INTEGER(IntKi), PARAMETER :: M58N3MMye = 9426 - INTEGER(IntKi), PARAMETER :: M58N4MMye = 9427 - INTEGER(IntKi), PARAMETER :: M58N5MMye = 9428 - INTEGER(IntKi), PARAMETER :: M58N6MMye = 9429 - INTEGER(IntKi), PARAMETER :: M58N7MMye = 9430 - INTEGER(IntKi), PARAMETER :: M58N8MMye = 9431 - INTEGER(IntKi), PARAMETER :: M58N9MMye = 9432 - INTEGER(IntKi), PARAMETER :: M59N1MMye = 9433 - INTEGER(IntKi), PARAMETER :: M59N2MMye = 9434 - INTEGER(IntKi), PARAMETER :: M59N3MMye = 9435 - INTEGER(IntKi), PARAMETER :: M59N4MMye = 9436 - INTEGER(IntKi), PARAMETER :: M59N5MMye = 9437 - INTEGER(IntKi), PARAMETER :: M59N6MMye = 9438 - INTEGER(IntKi), PARAMETER :: M59N7MMye = 9439 - INTEGER(IntKi), PARAMETER :: M59N8MMye = 9440 - INTEGER(IntKi), PARAMETER :: M59N9MMye = 9441 - INTEGER(IntKi), PARAMETER :: M60N1MMye = 9442 - INTEGER(IntKi), PARAMETER :: M60N2MMye = 9443 - INTEGER(IntKi), PARAMETER :: M60N3MMye = 9444 - INTEGER(IntKi), PARAMETER :: M60N4MMye = 9445 - INTEGER(IntKi), PARAMETER :: M60N5MMye = 9446 - INTEGER(IntKi), PARAMETER :: M60N6MMye = 9447 - INTEGER(IntKi), PARAMETER :: M60N7MMye = 9448 - INTEGER(IntKi), PARAMETER :: M60N8MMye = 9449 - INTEGER(IntKi), PARAMETER :: M60N9MMye = 9450 - INTEGER(IntKi), PARAMETER :: M61N1MMye = 9451 - INTEGER(IntKi), PARAMETER :: M61N2MMye = 9452 - INTEGER(IntKi), PARAMETER :: M61N3MMye = 9453 - INTEGER(IntKi), PARAMETER :: M61N4MMye = 9454 - INTEGER(IntKi), PARAMETER :: M61N5MMye = 9455 - INTEGER(IntKi), PARAMETER :: M61N6MMye = 9456 - INTEGER(IntKi), PARAMETER :: M61N7MMye = 9457 - INTEGER(IntKi), PARAMETER :: M61N8MMye = 9458 - INTEGER(IntKi), PARAMETER :: M61N9MMye = 9459 - INTEGER(IntKi), PARAMETER :: M62N1MMye = 9460 - INTEGER(IntKi), PARAMETER :: M62N2MMye = 9461 - INTEGER(IntKi), PARAMETER :: M62N3MMye = 9462 - INTEGER(IntKi), PARAMETER :: M62N4MMye = 9463 - INTEGER(IntKi), PARAMETER :: M62N5MMye = 9464 - INTEGER(IntKi), PARAMETER :: M62N6MMye = 9465 - INTEGER(IntKi), PARAMETER :: M62N7MMye = 9466 - INTEGER(IntKi), PARAMETER :: M62N8MMye = 9467 - INTEGER(IntKi), PARAMETER :: M62N9MMye = 9468 - INTEGER(IntKi), PARAMETER :: M63N1MMye = 9469 - INTEGER(IntKi), PARAMETER :: M63N2MMye = 9470 - INTEGER(IntKi), PARAMETER :: M63N3MMye = 9471 - INTEGER(IntKi), PARAMETER :: M63N4MMye = 9472 - INTEGER(IntKi), PARAMETER :: M63N5MMye = 9473 - INTEGER(IntKi), PARAMETER :: M63N6MMye = 9474 - INTEGER(IntKi), PARAMETER :: M63N7MMye = 9475 - INTEGER(IntKi), PARAMETER :: M63N8MMye = 9476 - INTEGER(IntKi), PARAMETER :: M63N9MMye = 9477 - INTEGER(IntKi), PARAMETER :: M64N1MMye = 9478 - INTEGER(IntKi), PARAMETER :: M64N2MMye = 9479 - INTEGER(IntKi), PARAMETER :: M64N3MMye = 9480 - INTEGER(IntKi), PARAMETER :: M64N4MMye = 9481 - INTEGER(IntKi), PARAMETER :: M64N5MMye = 9482 - INTEGER(IntKi), PARAMETER :: M64N6MMye = 9483 - INTEGER(IntKi), PARAMETER :: M64N7MMye = 9484 - INTEGER(IntKi), PARAMETER :: M64N8MMye = 9485 - INTEGER(IntKi), PARAMETER :: M64N9MMye = 9486 - INTEGER(IntKi), PARAMETER :: M65N1MMye = 9487 - INTEGER(IntKi), PARAMETER :: M65N2MMye = 9488 - INTEGER(IntKi), PARAMETER :: M65N3MMye = 9489 - INTEGER(IntKi), PARAMETER :: M65N4MMye = 9490 - INTEGER(IntKi), PARAMETER :: M65N5MMye = 9491 - INTEGER(IntKi), PARAMETER :: M65N6MMye = 9492 - INTEGER(IntKi), PARAMETER :: M65N7MMye = 9493 - INTEGER(IntKi), PARAMETER :: M65N8MMye = 9494 - INTEGER(IntKi), PARAMETER :: M65N9MMye = 9495 - INTEGER(IntKi), PARAMETER :: M66N1MMye = 9496 - INTEGER(IntKi), PARAMETER :: M66N2MMye = 9497 - INTEGER(IntKi), PARAMETER :: M66N3MMye = 9498 - INTEGER(IntKi), PARAMETER :: M66N4MMye = 9499 - INTEGER(IntKi), PARAMETER :: M66N5MMye = 9500 - INTEGER(IntKi), PARAMETER :: M66N6MMye = 9501 - INTEGER(IntKi), PARAMETER :: M66N7MMye = 9502 - INTEGER(IntKi), PARAMETER :: M66N8MMye = 9503 - INTEGER(IntKi), PARAMETER :: M66N9MMye = 9504 - INTEGER(IntKi), PARAMETER :: M67N1MMye = 9505 - INTEGER(IntKi), PARAMETER :: M67N2MMye = 9506 - INTEGER(IntKi), PARAMETER :: M67N3MMye = 9507 - INTEGER(IntKi), PARAMETER :: M67N4MMye = 9508 - INTEGER(IntKi), PARAMETER :: M67N5MMye = 9509 - INTEGER(IntKi), PARAMETER :: M67N6MMye = 9510 - INTEGER(IntKi), PARAMETER :: M67N7MMye = 9511 - INTEGER(IntKi), PARAMETER :: M67N8MMye = 9512 - INTEGER(IntKi), PARAMETER :: M67N9MMye = 9513 - INTEGER(IntKi), PARAMETER :: M68N1MMye = 9514 - INTEGER(IntKi), PARAMETER :: M68N2MMye = 9515 - INTEGER(IntKi), PARAMETER :: M68N3MMye = 9516 - INTEGER(IntKi), PARAMETER :: M68N4MMye = 9517 - INTEGER(IntKi), PARAMETER :: M68N5MMye = 9518 - INTEGER(IntKi), PARAMETER :: M68N6MMye = 9519 - INTEGER(IntKi), PARAMETER :: M68N7MMye = 9520 - INTEGER(IntKi), PARAMETER :: M68N8MMye = 9521 - INTEGER(IntKi), PARAMETER :: M68N9MMye = 9522 - INTEGER(IntKi), PARAMETER :: M69N1MMye = 9523 - INTEGER(IntKi), PARAMETER :: M69N2MMye = 9524 - INTEGER(IntKi), PARAMETER :: M69N3MMye = 9525 - INTEGER(IntKi), PARAMETER :: M69N4MMye = 9526 - INTEGER(IntKi), PARAMETER :: M69N5MMye = 9527 - INTEGER(IntKi), PARAMETER :: M69N6MMye = 9528 - INTEGER(IntKi), PARAMETER :: M69N7MMye = 9529 - INTEGER(IntKi), PARAMETER :: M69N8MMye = 9530 - INTEGER(IntKi), PARAMETER :: M69N9MMye = 9531 - INTEGER(IntKi), PARAMETER :: M70N1MMye = 9532 - INTEGER(IntKi), PARAMETER :: M70N2MMye = 9533 - INTEGER(IntKi), PARAMETER :: M70N3MMye = 9534 - INTEGER(IntKi), PARAMETER :: M70N4MMye = 9535 - INTEGER(IntKi), PARAMETER :: M70N5MMye = 9536 - INTEGER(IntKi), PARAMETER :: M70N6MMye = 9537 - INTEGER(IntKi), PARAMETER :: M70N7MMye = 9538 - INTEGER(IntKi), PARAMETER :: M70N8MMye = 9539 - INTEGER(IntKi), PARAMETER :: M70N9MMye = 9540 - INTEGER(IntKi), PARAMETER :: M71N1MMye = 9541 - INTEGER(IntKi), PARAMETER :: M71N2MMye = 9542 - INTEGER(IntKi), PARAMETER :: M71N3MMye = 9543 - INTEGER(IntKi), PARAMETER :: M71N4MMye = 9544 - INTEGER(IntKi), PARAMETER :: M71N5MMye = 9545 - INTEGER(IntKi), PARAMETER :: M71N6MMye = 9546 - INTEGER(IntKi), PARAMETER :: M71N7MMye = 9547 - INTEGER(IntKi), PARAMETER :: M71N8MMye = 9548 - INTEGER(IntKi), PARAMETER :: M71N9MMye = 9549 - INTEGER(IntKi), PARAMETER :: M72N1MMye = 9550 - INTEGER(IntKi), PARAMETER :: M72N2MMye = 9551 - INTEGER(IntKi), PARAMETER :: M72N3MMye = 9552 - INTEGER(IntKi), PARAMETER :: M72N4MMye = 9553 - INTEGER(IntKi), PARAMETER :: M72N5MMye = 9554 - INTEGER(IntKi), PARAMETER :: M72N6MMye = 9555 - INTEGER(IntKi), PARAMETER :: M72N7MMye = 9556 - INTEGER(IntKi), PARAMETER :: M72N8MMye = 9557 - INTEGER(IntKi), PARAMETER :: M72N9MMye = 9558 - INTEGER(IntKi), PARAMETER :: M73N1MMye = 9559 - INTEGER(IntKi), PARAMETER :: M73N2MMye = 9560 - INTEGER(IntKi), PARAMETER :: M73N3MMye = 9561 - INTEGER(IntKi), PARAMETER :: M73N4MMye = 9562 - INTEGER(IntKi), PARAMETER :: M73N5MMye = 9563 - INTEGER(IntKi), PARAMETER :: M73N6MMye = 9564 - INTEGER(IntKi), PARAMETER :: M73N7MMye = 9565 - INTEGER(IntKi), PARAMETER :: M73N8MMye = 9566 - INTEGER(IntKi), PARAMETER :: M73N9MMye = 9567 - INTEGER(IntKi), PARAMETER :: M74N1MMye = 9568 - INTEGER(IntKi), PARAMETER :: M74N2MMye = 9569 - INTEGER(IntKi), PARAMETER :: M74N3MMye = 9570 - INTEGER(IntKi), PARAMETER :: M74N4MMye = 9571 - INTEGER(IntKi), PARAMETER :: M74N5MMye = 9572 - INTEGER(IntKi), PARAMETER :: M74N6MMye = 9573 - INTEGER(IntKi), PARAMETER :: M74N7MMye = 9574 - INTEGER(IntKi), PARAMETER :: M74N8MMye = 9575 - INTEGER(IntKi), PARAMETER :: M74N9MMye = 9576 - INTEGER(IntKi), PARAMETER :: M75N1MMye = 9577 - INTEGER(IntKi), PARAMETER :: M75N2MMye = 9578 - INTEGER(IntKi), PARAMETER :: M75N3MMye = 9579 - INTEGER(IntKi), PARAMETER :: M75N4MMye = 9580 - INTEGER(IntKi), PARAMETER :: M75N5MMye = 9581 - INTEGER(IntKi), PARAMETER :: M75N6MMye = 9582 - INTEGER(IntKi), PARAMETER :: M75N7MMye = 9583 - INTEGER(IntKi), PARAMETER :: M75N8MMye = 9584 - INTEGER(IntKi), PARAMETER :: M75N9MMye = 9585 - INTEGER(IntKi), PARAMETER :: M76N1MMye = 9586 - INTEGER(IntKi), PARAMETER :: M76N2MMye = 9587 - INTEGER(IntKi), PARAMETER :: M76N3MMye = 9588 - INTEGER(IntKi), PARAMETER :: M76N4MMye = 9589 - INTEGER(IntKi), PARAMETER :: M76N5MMye = 9590 - INTEGER(IntKi), PARAMETER :: M76N6MMye = 9591 - INTEGER(IntKi), PARAMETER :: M76N7MMye = 9592 - INTEGER(IntKi), PARAMETER :: M76N8MMye = 9593 - INTEGER(IntKi), PARAMETER :: M76N9MMye = 9594 - INTEGER(IntKi), PARAMETER :: M77N1MMye = 9595 - INTEGER(IntKi), PARAMETER :: M77N2MMye = 9596 - INTEGER(IntKi), PARAMETER :: M77N3MMye = 9597 - INTEGER(IntKi), PARAMETER :: M77N4MMye = 9598 - INTEGER(IntKi), PARAMETER :: M77N5MMye = 9599 - INTEGER(IntKi), PARAMETER :: M77N6MMye = 9600 - INTEGER(IntKi), PARAMETER :: M77N7MMye = 9601 - INTEGER(IntKi), PARAMETER :: M77N8MMye = 9602 - INTEGER(IntKi), PARAMETER :: M77N9MMye = 9603 - INTEGER(IntKi), PARAMETER :: M78N1MMye = 9604 - INTEGER(IntKi), PARAMETER :: M78N2MMye = 9605 - INTEGER(IntKi), PARAMETER :: M78N3MMye = 9606 - INTEGER(IntKi), PARAMETER :: M78N4MMye = 9607 - INTEGER(IntKi), PARAMETER :: M78N5MMye = 9608 - INTEGER(IntKi), PARAMETER :: M78N6MMye = 9609 - INTEGER(IntKi), PARAMETER :: M78N7MMye = 9610 - INTEGER(IntKi), PARAMETER :: M78N8MMye = 9611 - INTEGER(IntKi), PARAMETER :: M78N9MMye = 9612 - INTEGER(IntKi), PARAMETER :: M79N1MMye = 9613 - INTEGER(IntKi), PARAMETER :: M79N2MMye = 9614 - INTEGER(IntKi), PARAMETER :: M79N3MMye = 9615 - INTEGER(IntKi), PARAMETER :: M79N4MMye = 9616 - INTEGER(IntKi), PARAMETER :: M79N5MMye = 9617 - INTEGER(IntKi), PARAMETER :: M79N6MMye = 9618 - INTEGER(IntKi), PARAMETER :: M79N7MMye = 9619 - INTEGER(IntKi), PARAMETER :: M79N8MMye = 9620 - INTEGER(IntKi), PARAMETER :: M79N9MMye = 9621 - INTEGER(IntKi), PARAMETER :: M80N1MMye = 9622 - INTEGER(IntKi), PARAMETER :: M80N2MMye = 9623 - INTEGER(IntKi), PARAMETER :: M80N3MMye = 9624 - INTEGER(IntKi), PARAMETER :: M80N4MMye = 9625 - INTEGER(IntKi), PARAMETER :: M80N5MMye = 9626 - INTEGER(IntKi), PARAMETER :: M80N6MMye = 9627 - INTEGER(IntKi), PARAMETER :: M80N7MMye = 9628 - INTEGER(IntKi), PARAMETER :: M80N8MMye = 9629 - INTEGER(IntKi), PARAMETER :: M80N9MMye = 9630 - INTEGER(IntKi), PARAMETER :: M81N1MMye = 9631 - INTEGER(IntKi), PARAMETER :: M81N2MMye = 9632 - INTEGER(IntKi), PARAMETER :: M81N3MMye = 9633 - INTEGER(IntKi), PARAMETER :: M81N4MMye = 9634 - INTEGER(IntKi), PARAMETER :: M81N5MMye = 9635 - INTEGER(IntKi), PARAMETER :: M81N6MMye = 9636 - INTEGER(IntKi), PARAMETER :: M81N7MMye = 9637 - INTEGER(IntKi), PARAMETER :: M81N8MMye = 9638 - INTEGER(IntKi), PARAMETER :: M81N9MMye = 9639 - INTEGER(IntKi), PARAMETER :: M82N1MMye = 9640 - INTEGER(IntKi), PARAMETER :: M82N2MMye = 9641 - INTEGER(IntKi), PARAMETER :: M82N3MMye = 9642 - INTEGER(IntKi), PARAMETER :: M82N4MMye = 9643 - INTEGER(IntKi), PARAMETER :: M82N5MMye = 9644 - INTEGER(IntKi), PARAMETER :: M82N6MMye = 9645 - INTEGER(IntKi), PARAMETER :: M82N7MMye = 9646 - INTEGER(IntKi), PARAMETER :: M82N8MMye = 9647 - INTEGER(IntKi), PARAMETER :: M82N9MMye = 9648 - INTEGER(IntKi), PARAMETER :: M83N1MMye = 9649 - INTEGER(IntKi), PARAMETER :: M83N2MMye = 9650 - INTEGER(IntKi), PARAMETER :: M83N3MMye = 9651 - INTEGER(IntKi), PARAMETER :: M83N4MMye = 9652 - INTEGER(IntKi), PARAMETER :: M83N5MMye = 9653 - INTEGER(IntKi), PARAMETER :: M83N6MMye = 9654 - INTEGER(IntKi), PARAMETER :: M83N7MMye = 9655 - INTEGER(IntKi), PARAMETER :: M83N8MMye = 9656 - INTEGER(IntKi), PARAMETER :: M83N9MMye = 9657 - INTEGER(IntKi), PARAMETER :: M84N1MMye = 9658 - INTEGER(IntKi), PARAMETER :: M84N2MMye = 9659 - INTEGER(IntKi), PARAMETER :: M84N3MMye = 9660 - INTEGER(IntKi), PARAMETER :: M84N4MMye = 9661 - INTEGER(IntKi), PARAMETER :: M84N5MMye = 9662 - INTEGER(IntKi), PARAMETER :: M84N6MMye = 9663 - INTEGER(IntKi), PARAMETER :: M84N7MMye = 9664 - INTEGER(IntKi), PARAMETER :: M84N8MMye = 9665 - INTEGER(IntKi), PARAMETER :: M84N9MMye = 9666 - INTEGER(IntKi), PARAMETER :: M85N1MMye = 9667 - INTEGER(IntKi), PARAMETER :: M85N2MMye = 9668 - INTEGER(IntKi), PARAMETER :: M85N3MMye = 9669 - INTEGER(IntKi), PARAMETER :: M85N4MMye = 9670 - INTEGER(IntKi), PARAMETER :: M85N5MMye = 9671 - INTEGER(IntKi), PARAMETER :: M85N6MMye = 9672 - INTEGER(IntKi), PARAMETER :: M85N7MMye = 9673 - INTEGER(IntKi), PARAMETER :: M85N8MMye = 9674 - INTEGER(IntKi), PARAMETER :: M85N9MMye = 9675 - INTEGER(IntKi), PARAMETER :: M86N1MMye = 9676 - INTEGER(IntKi), PARAMETER :: M86N2MMye = 9677 - INTEGER(IntKi), PARAMETER :: M86N3MMye = 9678 - INTEGER(IntKi), PARAMETER :: M86N4MMye = 9679 - INTEGER(IntKi), PARAMETER :: M86N5MMye = 9680 - INTEGER(IntKi), PARAMETER :: M86N6MMye = 9681 - INTEGER(IntKi), PARAMETER :: M86N7MMye = 9682 - INTEGER(IntKi), PARAMETER :: M86N8MMye = 9683 - INTEGER(IntKi), PARAMETER :: M86N9MMye = 9684 - INTEGER(IntKi), PARAMETER :: M87N1MMye = 9685 - INTEGER(IntKi), PARAMETER :: M87N2MMye = 9686 - INTEGER(IntKi), PARAMETER :: M87N3MMye = 9687 - INTEGER(IntKi), PARAMETER :: M87N4MMye = 9688 - INTEGER(IntKi), PARAMETER :: M87N5MMye = 9689 - INTEGER(IntKi), PARAMETER :: M87N6MMye = 9690 - INTEGER(IntKi), PARAMETER :: M87N7MMye = 9691 - INTEGER(IntKi), PARAMETER :: M87N8MMye = 9692 - INTEGER(IntKi), PARAMETER :: M87N9MMye = 9693 - INTEGER(IntKi), PARAMETER :: M88N1MMye = 9694 - INTEGER(IntKi), PARAMETER :: M88N2MMye = 9695 - INTEGER(IntKi), PARAMETER :: M88N3MMye = 9696 - INTEGER(IntKi), PARAMETER :: M88N4MMye = 9697 - INTEGER(IntKi), PARAMETER :: M88N5MMye = 9698 - INTEGER(IntKi), PARAMETER :: M88N6MMye = 9699 - INTEGER(IntKi), PARAMETER :: M88N7MMye = 9700 - INTEGER(IntKi), PARAMETER :: M88N8MMye = 9701 - INTEGER(IntKi), PARAMETER :: M88N9MMye = 9702 - INTEGER(IntKi), PARAMETER :: M89N1MMye = 9703 - INTEGER(IntKi), PARAMETER :: M89N2MMye = 9704 - INTEGER(IntKi), PARAMETER :: M89N3MMye = 9705 - INTEGER(IntKi), PARAMETER :: M89N4MMye = 9706 - INTEGER(IntKi), PARAMETER :: M89N5MMye = 9707 - INTEGER(IntKi), PARAMETER :: M89N6MMye = 9708 - INTEGER(IntKi), PARAMETER :: M89N7MMye = 9709 - INTEGER(IntKi), PARAMETER :: M89N8MMye = 9710 - INTEGER(IntKi), PARAMETER :: M89N9MMye = 9711 - INTEGER(IntKi), PARAMETER :: M90N1MMye = 9712 - INTEGER(IntKi), PARAMETER :: M90N2MMye = 9713 - INTEGER(IntKi), PARAMETER :: M90N3MMye = 9714 - INTEGER(IntKi), PARAMETER :: M90N4MMye = 9715 - INTEGER(IntKi), PARAMETER :: M90N5MMye = 9716 - INTEGER(IntKi), PARAMETER :: M90N6MMye = 9717 - INTEGER(IntKi), PARAMETER :: M90N7MMye = 9718 - INTEGER(IntKi), PARAMETER :: M90N8MMye = 9719 - INTEGER(IntKi), PARAMETER :: M90N9MMye = 9720 - INTEGER(IntKi), PARAMETER :: M91N1MMye = 9721 - INTEGER(IntKi), PARAMETER :: M91N2MMye = 9722 - INTEGER(IntKi), PARAMETER :: M91N3MMye = 9723 - INTEGER(IntKi), PARAMETER :: M91N4MMye = 9724 - INTEGER(IntKi), PARAMETER :: M91N5MMye = 9725 - INTEGER(IntKi), PARAMETER :: M91N6MMye = 9726 - INTEGER(IntKi), PARAMETER :: M91N7MMye = 9727 - INTEGER(IntKi), PARAMETER :: M91N8MMye = 9728 - INTEGER(IntKi), PARAMETER :: M91N9MMye = 9729 - INTEGER(IntKi), PARAMETER :: M92N1MMye = 9730 - INTEGER(IntKi), PARAMETER :: M92N2MMye = 9731 - INTEGER(IntKi), PARAMETER :: M92N3MMye = 9732 - INTEGER(IntKi), PARAMETER :: M92N4MMye = 9733 - INTEGER(IntKi), PARAMETER :: M92N5MMye = 9734 - INTEGER(IntKi), PARAMETER :: M92N6MMye = 9735 - INTEGER(IntKi), PARAMETER :: M92N7MMye = 9736 - INTEGER(IntKi), PARAMETER :: M92N8MMye = 9737 - INTEGER(IntKi), PARAMETER :: M92N9MMye = 9738 - INTEGER(IntKi), PARAMETER :: M93N1MMye = 9739 - INTEGER(IntKi), PARAMETER :: M93N2MMye = 9740 - INTEGER(IntKi), PARAMETER :: M93N3MMye = 9741 - INTEGER(IntKi), PARAMETER :: M93N4MMye = 9742 - INTEGER(IntKi), PARAMETER :: M93N5MMye = 9743 - INTEGER(IntKi), PARAMETER :: M93N6MMye = 9744 - INTEGER(IntKi), PARAMETER :: M93N7MMye = 9745 - INTEGER(IntKi), PARAMETER :: M93N8MMye = 9746 - INTEGER(IntKi), PARAMETER :: M93N9MMye = 9747 - INTEGER(IntKi), PARAMETER :: M94N1MMye = 9748 - INTEGER(IntKi), PARAMETER :: M94N2MMye = 9749 - INTEGER(IntKi), PARAMETER :: M94N3MMye = 9750 - INTEGER(IntKi), PARAMETER :: M94N4MMye = 9751 - INTEGER(IntKi), PARAMETER :: M94N5MMye = 9752 - INTEGER(IntKi), PARAMETER :: M94N6MMye = 9753 - INTEGER(IntKi), PARAMETER :: M94N7MMye = 9754 - INTEGER(IntKi), PARAMETER :: M94N8MMye = 9755 - INTEGER(IntKi), PARAMETER :: M94N9MMye = 9756 - INTEGER(IntKi), PARAMETER :: M95N1MMye = 9757 - INTEGER(IntKi), PARAMETER :: M95N2MMye = 9758 - INTEGER(IntKi), PARAMETER :: M95N3MMye = 9759 - INTEGER(IntKi), PARAMETER :: M95N4MMye = 9760 - INTEGER(IntKi), PARAMETER :: M95N5MMye = 9761 - INTEGER(IntKi), PARAMETER :: M95N6MMye = 9762 - INTEGER(IntKi), PARAMETER :: M95N7MMye = 9763 - INTEGER(IntKi), PARAMETER :: M95N8MMye = 9764 - INTEGER(IntKi), PARAMETER :: M95N9MMye = 9765 - INTEGER(IntKi), PARAMETER :: M96N1MMye = 9766 - INTEGER(IntKi), PARAMETER :: M96N2MMye = 9767 - INTEGER(IntKi), PARAMETER :: M96N3MMye = 9768 - INTEGER(IntKi), PARAMETER :: M96N4MMye = 9769 - INTEGER(IntKi), PARAMETER :: M96N5MMye = 9770 - INTEGER(IntKi), PARAMETER :: M96N6MMye = 9771 - INTEGER(IntKi), PARAMETER :: M96N7MMye = 9772 - INTEGER(IntKi), PARAMETER :: M96N8MMye = 9773 - INTEGER(IntKi), PARAMETER :: M96N9MMye = 9774 - INTEGER(IntKi), PARAMETER :: M97N1MMye = 9775 - INTEGER(IntKi), PARAMETER :: M97N2MMye = 9776 - INTEGER(IntKi), PARAMETER :: M97N3MMye = 9777 - INTEGER(IntKi), PARAMETER :: M97N4MMye = 9778 - INTEGER(IntKi), PARAMETER :: M97N5MMye = 9779 - INTEGER(IntKi), PARAMETER :: M97N6MMye = 9780 - INTEGER(IntKi), PARAMETER :: M97N7MMye = 9781 - INTEGER(IntKi), PARAMETER :: M97N8MMye = 9782 - INTEGER(IntKi), PARAMETER :: M97N9MMye = 9783 - INTEGER(IntKi), PARAMETER :: M98N1MMye = 9784 - INTEGER(IntKi), PARAMETER :: M98N2MMye = 9785 - INTEGER(IntKi), PARAMETER :: M98N3MMye = 9786 - INTEGER(IntKi), PARAMETER :: M98N4MMye = 9787 - INTEGER(IntKi), PARAMETER :: M98N5MMye = 9788 - INTEGER(IntKi), PARAMETER :: M98N6MMye = 9789 - INTEGER(IntKi), PARAMETER :: M98N7MMye = 9790 - INTEGER(IntKi), PARAMETER :: M98N8MMye = 9791 - INTEGER(IntKi), PARAMETER :: M98N9MMye = 9792 - INTEGER(IntKi), PARAMETER :: M99N1MMye = 9793 - INTEGER(IntKi), PARAMETER :: M99N2MMye = 9794 - INTEGER(IntKi), PARAMETER :: M99N3MMye = 9795 - INTEGER(IntKi), PARAMETER :: M99N4MMye = 9796 - INTEGER(IntKi), PARAMETER :: M99N5MMye = 9797 - INTEGER(IntKi), PARAMETER :: M99N6MMye = 9798 - INTEGER(IntKi), PARAMETER :: M99N7MMye = 9799 - INTEGER(IntKi), PARAMETER :: M99N8MMye = 9800 - INTEGER(IntKi), PARAMETER :: M99N9MMye = 9801 - INTEGER(IntKi), PARAMETER :: M01N1MMze = 9802 - INTEGER(IntKi), PARAMETER :: M01N2MMze = 9803 - INTEGER(IntKi), PARAMETER :: M01N3MMze = 9804 - INTEGER(IntKi), PARAMETER :: M01N4MMze = 9805 - INTEGER(IntKi), PARAMETER :: M01N5MMze = 9806 - INTEGER(IntKi), PARAMETER :: M01N6MMze = 9807 - INTEGER(IntKi), PARAMETER :: M01N7MMze = 9808 - INTEGER(IntKi), PARAMETER :: M01N8MMze = 9809 - INTEGER(IntKi), PARAMETER :: M01N9MMze = 9810 - INTEGER(IntKi), PARAMETER :: M02N1MMze = 9811 - INTEGER(IntKi), PARAMETER :: M02N2MMze = 9812 - INTEGER(IntKi), PARAMETER :: M02N3MMze = 9813 - INTEGER(IntKi), PARAMETER :: M02N4MMze = 9814 - INTEGER(IntKi), PARAMETER :: M02N5MMze = 9815 - INTEGER(IntKi), PARAMETER :: M02N6MMze = 9816 - INTEGER(IntKi), PARAMETER :: M02N7MMze = 9817 - INTEGER(IntKi), PARAMETER :: M02N8MMze = 9818 - INTEGER(IntKi), PARAMETER :: M02N9MMze = 9819 - INTEGER(IntKi), PARAMETER :: M03N1MMze = 9820 - INTEGER(IntKi), PARAMETER :: M03N2MMze = 9821 - INTEGER(IntKi), PARAMETER :: M03N3MMze = 9822 - INTEGER(IntKi), PARAMETER :: M03N4MMze = 9823 - INTEGER(IntKi), PARAMETER :: M03N5MMze = 9824 - INTEGER(IntKi), PARAMETER :: M03N6MMze = 9825 - INTEGER(IntKi), PARAMETER :: M03N7MMze = 9826 - INTEGER(IntKi), PARAMETER :: M03N8MMze = 9827 - INTEGER(IntKi), PARAMETER :: M03N9MMze = 9828 - INTEGER(IntKi), PARAMETER :: M04N1MMze = 9829 - INTEGER(IntKi), PARAMETER :: M04N2MMze = 9830 - INTEGER(IntKi), PARAMETER :: M04N3MMze = 9831 - INTEGER(IntKi), PARAMETER :: M04N4MMze = 9832 - INTEGER(IntKi), PARAMETER :: M04N5MMze = 9833 - INTEGER(IntKi), PARAMETER :: M04N6MMze = 9834 - INTEGER(IntKi), PARAMETER :: M04N7MMze = 9835 - INTEGER(IntKi), PARAMETER :: M04N8MMze = 9836 - INTEGER(IntKi), PARAMETER :: M04N9MMze = 9837 - INTEGER(IntKi), PARAMETER :: M05N1MMze = 9838 - INTEGER(IntKi), PARAMETER :: M05N2MMze = 9839 - INTEGER(IntKi), PARAMETER :: M05N3MMze = 9840 - INTEGER(IntKi), PARAMETER :: M05N4MMze = 9841 - INTEGER(IntKi), PARAMETER :: M05N5MMze = 9842 - INTEGER(IntKi), PARAMETER :: M05N6MMze = 9843 - INTEGER(IntKi), PARAMETER :: M05N7MMze = 9844 - INTEGER(IntKi), PARAMETER :: M05N8MMze = 9845 - INTEGER(IntKi), PARAMETER :: M05N9MMze = 9846 - INTEGER(IntKi), PARAMETER :: M06N1MMze = 9847 - INTEGER(IntKi), PARAMETER :: M06N2MMze = 9848 - INTEGER(IntKi), PARAMETER :: M06N3MMze = 9849 - INTEGER(IntKi), PARAMETER :: M06N4MMze = 9850 - INTEGER(IntKi), PARAMETER :: M06N5MMze = 9851 - INTEGER(IntKi), PARAMETER :: M06N6MMze = 9852 - INTEGER(IntKi), PARAMETER :: M06N7MMze = 9853 - INTEGER(IntKi), PARAMETER :: M06N8MMze = 9854 - INTEGER(IntKi), PARAMETER :: M06N9MMze = 9855 - INTEGER(IntKi), PARAMETER :: M07N1MMze = 9856 - INTEGER(IntKi), PARAMETER :: M07N2MMze = 9857 - INTEGER(IntKi), PARAMETER :: M07N3MMze = 9858 - INTEGER(IntKi), PARAMETER :: M07N4MMze = 9859 - INTEGER(IntKi), PARAMETER :: M07N5MMze = 9860 - INTEGER(IntKi), PARAMETER :: M07N6MMze = 9861 - INTEGER(IntKi), PARAMETER :: M07N7MMze = 9862 - INTEGER(IntKi), PARAMETER :: M07N8MMze = 9863 - INTEGER(IntKi), PARAMETER :: M07N9MMze = 9864 - INTEGER(IntKi), PARAMETER :: M08N1MMze = 9865 - INTEGER(IntKi), PARAMETER :: M08N2MMze = 9866 - INTEGER(IntKi), PARAMETER :: M08N3MMze = 9867 - INTEGER(IntKi), PARAMETER :: M08N4MMze = 9868 - INTEGER(IntKi), PARAMETER :: M08N5MMze = 9869 - INTEGER(IntKi), PARAMETER :: M08N6MMze = 9870 - INTEGER(IntKi), PARAMETER :: M08N7MMze = 9871 - INTEGER(IntKi), PARAMETER :: M08N8MMze = 9872 - INTEGER(IntKi), PARAMETER :: M08N9MMze = 9873 - INTEGER(IntKi), PARAMETER :: M09N1MMze = 9874 - INTEGER(IntKi), PARAMETER :: M09N2MMze = 9875 - INTEGER(IntKi), PARAMETER :: M09N3MMze = 9876 - INTEGER(IntKi), PARAMETER :: M09N4MMze = 9877 - INTEGER(IntKi), PARAMETER :: M09N5MMze = 9878 - INTEGER(IntKi), PARAMETER :: M09N6MMze = 9879 - INTEGER(IntKi), PARAMETER :: M09N7MMze = 9880 - INTEGER(IntKi), PARAMETER :: M09N8MMze = 9881 - INTEGER(IntKi), PARAMETER :: M09N9MMze = 9882 - INTEGER(IntKi), PARAMETER :: M10N1MMze = 9883 - INTEGER(IntKi), PARAMETER :: M10N2MMze = 9884 - INTEGER(IntKi), PARAMETER :: M10N3MMze = 9885 - INTEGER(IntKi), PARAMETER :: M10N4MMze = 9886 - INTEGER(IntKi), PARAMETER :: M10N5MMze = 9887 - INTEGER(IntKi), PARAMETER :: M10N6MMze = 9888 - INTEGER(IntKi), PARAMETER :: M10N7MMze = 9889 - INTEGER(IntKi), PARAMETER :: M10N8MMze = 9890 - INTEGER(IntKi), PARAMETER :: M10N9MMze = 9891 - INTEGER(IntKi), PARAMETER :: M11N1MMze = 9892 - INTEGER(IntKi), PARAMETER :: M11N2MMze = 9893 - INTEGER(IntKi), PARAMETER :: M11N3MMze = 9894 - INTEGER(IntKi), PARAMETER :: M11N4MMze = 9895 - INTEGER(IntKi), PARAMETER :: M11N5MMze = 9896 - INTEGER(IntKi), PARAMETER :: M11N6MMze = 9897 - INTEGER(IntKi), PARAMETER :: M11N7MMze = 9898 - INTEGER(IntKi), PARAMETER :: M11N8MMze = 9899 - INTEGER(IntKi), PARAMETER :: M11N9MMze = 9900 - INTEGER(IntKi), PARAMETER :: M12N1MMze = 9901 - INTEGER(IntKi), PARAMETER :: M12N2MMze = 9902 - INTEGER(IntKi), PARAMETER :: M12N3MMze = 9903 - INTEGER(IntKi), PARAMETER :: M12N4MMze = 9904 - INTEGER(IntKi), PARAMETER :: M12N5MMze = 9905 - INTEGER(IntKi), PARAMETER :: M12N6MMze = 9906 - INTEGER(IntKi), PARAMETER :: M12N7MMze = 9907 - INTEGER(IntKi), PARAMETER :: M12N8MMze = 9908 - INTEGER(IntKi), PARAMETER :: M12N9MMze = 9909 - INTEGER(IntKi), PARAMETER :: M13N1MMze = 9910 - INTEGER(IntKi), PARAMETER :: M13N2MMze = 9911 - INTEGER(IntKi), PARAMETER :: M13N3MMze = 9912 - INTEGER(IntKi), PARAMETER :: M13N4MMze = 9913 - INTEGER(IntKi), PARAMETER :: M13N5MMze = 9914 - INTEGER(IntKi), PARAMETER :: M13N6MMze = 9915 - INTEGER(IntKi), PARAMETER :: M13N7MMze = 9916 - INTEGER(IntKi), PARAMETER :: M13N8MMze = 9917 - INTEGER(IntKi), PARAMETER :: M13N9MMze = 9918 - INTEGER(IntKi), PARAMETER :: M14N1MMze = 9919 - INTEGER(IntKi), PARAMETER :: M14N2MMze = 9920 - INTEGER(IntKi), PARAMETER :: M14N3MMze = 9921 - INTEGER(IntKi), PARAMETER :: M14N4MMze = 9922 - INTEGER(IntKi), PARAMETER :: M14N5MMze = 9923 - INTEGER(IntKi), PARAMETER :: M14N6MMze = 9924 - INTEGER(IntKi), PARAMETER :: M14N7MMze = 9925 - INTEGER(IntKi), PARAMETER :: M14N8MMze = 9926 - INTEGER(IntKi), PARAMETER :: M14N9MMze = 9927 - INTEGER(IntKi), PARAMETER :: M15N1MMze = 9928 - INTEGER(IntKi), PARAMETER :: M15N2MMze = 9929 - INTEGER(IntKi), PARAMETER :: M15N3MMze = 9930 - INTEGER(IntKi), PARAMETER :: M15N4MMze = 9931 - INTEGER(IntKi), PARAMETER :: M15N5MMze = 9932 - INTEGER(IntKi), PARAMETER :: M15N6MMze = 9933 - INTEGER(IntKi), PARAMETER :: M15N7MMze = 9934 - INTEGER(IntKi), PARAMETER :: M15N8MMze = 9935 - INTEGER(IntKi), PARAMETER :: M15N9MMze = 9936 - INTEGER(IntKi), PARAMETER :: M16N1MMze = 9937 - INTEGER(IntKi), PARAMETER :: M16N2MMze = 9938 - INTEGER(IntKi), PARAMETER :: M16N3MMze = 9939 - INTEGER(IntKi), PARAMETER :: M16N4MMze = 9940 - INTEGER(IntKi), PARAMETER :: M16N5MMze = 9941 - INTEGER(IntKi), PARAMETER :: M16N6MMze = 9942 - INTEGER(IntKi), PARAMETER :: M16N7MMze = 9943 - INTEGER(IntKi), PARAMETER :: M16N8MMze = 9944 - INTEGER(IntKi), PARAMETER :: M16N9MMze = 9945 - INTEGER(IntKi), PARAMETER :: M17N1MMze = 9946 - INTEGER(IntKi), PARAMETER :: M17N2MMze = 9947 - INTEGER(IntKi), PARAMETER :: M17N3MMze = 9948 - INTEGER(IntKi), PARAMETER :: M17N4MMze = 9949 - INTEGER(IntKi), PARAMETER :: M17N5MMze = 9950 - INTEGER(IntKi), PARAMETER :: M17N6MMze = 9951 - INTEGER(IntKi), PARAMETER :: M17N7MMze = 9952 - INTEGER(IntKi), PARAMETER :: M17N8MMze = 9953 - INTEGER(IntKi), PARAMETER :: M17N9MMze = 9954 - INTEGER(IntKi), PARAMETER :: M18N1MMze = 9955 - INTEGER(IntKi), PARAMETER :: M18N2MMze = 9956 - INTEGER(IntKi), PARAMETER :: M18N3MMze = 9957 - INTEGER(IntKi), PARAMETER :: M18N4MMze = 9958 - INTEGER(IntKi), PARAMETER :: M18N5MMze = 9959 - INTEGER(IntKi), PARAMETER :: M18N6MMze = 9960 - INTEGER(IntKi), PARAMETER :: M18N7MMze = 9961 - INTEGER(IntKi), PARAMETER :: M18N8MMze = 9962 - INTEGER(IntKi), PARAMETER :: M18N9MMze = 9963 - INTEGER(IntKi), PARAMETER :: M19N1MMze = 9964 - INTEGER(IntKi), PARAMETER :: M19N2MMze = 9965 - INTEGER(IntKi), PARAMETER :: M19N3MMze = 9966 - INTEGER(IntKi), PARAMETER :: M19N4MMze = 9967 - INTEGER(IntKi), PARAMETER :: M19N5MMze = 9968 - INTEGER(IntKi), PARAMETER :: M19N6MMze = 9969 - INTEGER(IntKi), PARAMETER :: M19N7MMze = 9970 - INTEGER(IntKi), PARAMETER :: M19N8MMze = 9971 - INTEGER(IntKi), PARAMETER :: M19N9MMze = 9972 - INTEGER(IntKi), PARAMETER :: M20N1MMze = 9973 - INTEGER(IntKi), PARAMETER :: M20N2MMze = 9974 - INTEGER(IntKi), PARAMETER :: M20N3MMze = 9975 - INTEGER(IntKi), PARAMETER :: M20N4MMze = 9976 - INTEGER(IntKi), PARAMETER :: M20N5MMze = 9977 - INTEGER(IntKi), PARAMETER :: M20N6MMze = 9978 - INTEGER(IntKi), PARAMETER :: M20N7MMze = 9979 - INTEGER(IntKi), PARAMETER :: M20N8MMze = 9980 - INTEGER(IntKi), PARAMETER :: M20N9MMze = 9981 - INTEGER(IntKi), PARAMETER :: M21N1MMze = 9982 - INTEGER(IntKi), PARAMETER :: M21N2MMze = 9983 - INTEGER(IntKi), PARAMETER :: M21N3MMze = 9984 - INTEGER(IntKi), PARAMETER :: M21N4MMze = 9985 - INTEGER(IntKi), PARAMETER :: M21N5MMze = 9986 - INTEGER(IntKi), PARAMETER :: M21N6MMze = 9987 - INTEGER(IntKi), PARAMETER :: M21N7MMze = 9988 - INTEGER(IntKi), PARAMETER :: M21N8MMze = 9989 - INTEGER(IntKi), PARAMETER :: M21N9MMze = 9990 - INTEGER(IntKi), PARAMETER :: M22N1MMze = 9991 - INTEGER(IntKi), PARAMETER :: M22N2MMze = 9992 - INTEGER(IntKi), PARAMETER :: M22N3MMze = 9993 - INTEGER(IntKi), PARAMETER :: M22N4MMze = 9994 - INTEGER(IntKi), PARAMETER :: M22N5MMze = 9995 - INTEGER(IntKi), PARAMETER :: M22N6MMze = 9996 - INTEGER(IntKi), PARAMETER :: M22N7MMze = 9997 - INTEGER(IntKi), PARAMETER :: M22N8MMze = 9998 - INTEGER(IntKi), PARAMETER :: M22N9MMze = 9999 - INTEGER(IntKi), PARAMETER :: M23N1MMze = 10000 - INTEGER(IntKi), PARAMETER :: M23N2MMze = 10001 - INTEGER(IntKi), PARAMETER :: M23N3MMze = 10002 - INTEGER(IntKi), PARAMETER :: M23N4MMze = 10003 - INTEGER(IntKi), PARAMETER :: M23N5MMze = 10004 - INTEGER(IntKi), PARAMETER :: M23N6MMze = 10005 - INTEGER(IntKi), PARAMETER :: M23N7MMze = 10006 - INTEGER(IntKi), PARAMETER :: M23N8MMze = 10007 - INTEGER(IntKi), PARAMETER :: M23N9MMze = 10008 - INTEGER(IntKi), PARAMETER :: M24N1MMze = 10009 - INTEGER(IntKi), PARAMETER :: M24N2MMze = 10010 - INTEGER(IntKi), PARAMETER :: M24N3MMze = 10011 - INTEGER(IntKi), PARAMETER :: M24N4MMze = 10012 - INTEGER(IntKi), PARAMETER :: M24N5MMze = 10013 - INTEGER(IntKi), PARAMETER :: M24N6MMze = 10014 - INTEGER(IntKi), PARAMETER :: M24N7MMze = 10015 - INTEGER(IntKi), PARAMETER :: M24N8MMze = 10016 - INTEGER(IntKi), PARAMETER :: M24N9MMze = 10017 - INTEGER(IntKi), PARAMETER :: M25N1MMze = 10018 - INTEGER(IntKi), PARAMETER :: M25N2MMze = 10019 - INTEGER(IntKi), PARAMETER :: M25N3MMze = 10020 - INTEGER(IntKi), PARAMETER :: M25N4MMze = 10021 - INTEGER(IntKi), PARAMETER :: M25N5MMze = 10022 - INTEGER(IntKi), PARAMETER :: M25N6MMze = 10023 - INTEGER(IntKi), PARAMETER :: M25N7MMze = 10024 - INTEGER(IntKi), PARAMETER :: M25N8MMze = 10025 - INTEGER(IntKi), PARAMETER :: M25N9MMze = 10026 - INTEGER(IntKi), PARAMETER :: M26N1MMze = 10027 - INTEGER(IntKi), PARAMETER :: M26N2MMze = 10028 - INTEGER(IntKi), PARAMETER :: M26N3MMze = 10029 - INTEGER(IntKi), PARAMETER :: M26N4MMze = 10030 - INTEGER(IntKi), PARAMETER :: M26N5MMze = 10031 - INTEGER(IntKi), PARAMETER :: M26N6MMze = 10032 - INTEGER(IntKi), PARAMETER :: M26N7MMze = 10033 - INTEGER(IntKi), PARAMETER :: M26N8MMze = 10034 - INTEGER(IntKi), PARAMETER :: M26N9MMze = 10035 - INTEGER(IntKi), PARAMETER :: M27N1MMze = 10036 - INTEGER(IntKi), PARAMETER :: M27N2MMze = 10037 - INTEGER(IntKi), PARAMETER :: M27N3MMze = 10038 - INTEGER(IntKi), PARAMETER :: M27N4MMze = 10039 - INTEGER(IntKi), PARAMETER :: M27N5MMze = 10040 - INTEGER(IntKi), PARAMETER :: M27N6MMze = 10041 - INTEGER(IntKi), PARAMETER :: M27N7MMze = 10042 - INTEGER(IntKi), PARAMETER :: M27N8MMze = 10043 - INTEGER(IntKi), PARAMETER :: M27N9MMze = 10044 - INTEGER(IntKi), PARAMETER :: M28N1MMze = 10045 - INTEGER(IntKi), PARAMETER :: M28N2MMze = 10046 - INTEGER(IntKi), PARAMETER :: M28N3MMze = 10047 - INTEGER(IntKi), PARAMETER :: M28N4MMze = 10048 - INTEGER(IntKi), PARAMETER :: M28N5MMze = 10049 - INTEGER(IntKi), PARAMETER :: M28N6MMze = 10050 - INTEGER(IntKi), PARAMETER :: M28N7MMze = 10051 - INTEGER(IntKi), PARAMETER :: M28N8MMze = 10052 - INTEGER(IntKi), PARAMETER :: M28N9MMze = 10053 - INTEGER(IntKi), PARAMETER :: M29N1MMze = 10054 - INTEGER(IntKi), PARAMETER :: M29N2MMze = 10055 - INTEGER(IntKi), PARAMETER :: M29N3MMze = 10056 - INTEGER(IntKi), PARAMETER :: M29N4MMze = 10057 - INTEGER(IntKi), PARAMETER :: M29N5MMze = 10058 - INTEGER(IntKi), PARAMETER :: M29N6MMze = 10059 - INTEGER(IntKi), PARAMETER :: M29N7MMze = 10060 - INTEGER(IntKi), PARAMETER :: M29N8MMze = 10061 - INTEGER(IntKi), PARAMETER :: M29N9MMze = 10062 - INTEGER(IntKi), PARAMETER :: M30N1MMze = 10063 - INTEGER(IntKi), PARAMETER :: M30N2MMze = 10064 - INTEGER(IntKi), PARAMETER :: M30N3MMze = 10065 - INTEGER(IntKi), PARAMETER :: M30N4MMze = 10066 - INTEGER(IntKi), PARAMETER :: M30N5MMze = 10067 - INTEGER(IntKi), PARAMETER :: M30N6MMze = 10068 - INTEGER(IntKi), PARAMETER :: M30N7MMze = 10069 - INTEGER(IntKi), PARAMETER :: M30N8MMze = 10070 - INTEGER(IntKi), PARAMETER :: M30N9MMze = 10071 - INTEGER(IntKi), PARAMETER :: M31N1MMze = 10072 - INTEGER(IntKi), PARAMETER :: M31N2MMze = 10073 - INTEGER(IntKi), PARAMETER :: M31N3MMze = 10074 - INTEGER(IntKi), PARAMETER :: M31N4MMze = 10075 - INTEGER(IntKi), PARAMETER :: M31N5MMze = 10076 - INTEGER(IntKi), PARAMETER :: M31N6MMze = 10077 - INTEGER(IntKi), PARAMETER :: M31N7MMze = 10078 - INTEGER(IntKi), PARAMETER :: M31N8MMze = 10079 - INTEGER(IntKi), PARAMETER :: M31N9MMze = 10080 - INTEGER(IntKi), PARAMETER :: M32N1MMze = 10081 - INTEGER(IntKi), PARAMETER :: M32N2MMze = 10082 - INTEGER(IntKi), PARAMETER :: M32N3MMze = 10083 - INTEGER(IntKi), PARAMETER :: M32N4MMze = 10084 - INTEGER(IntKi), PARAMETER :: M32N5MMze = 10085 - INTEGER(IntKi), PARAMETER :: M32N6MMze = 10086 - INTEGER(IntKi), PARAMETER :: M32N7MMze = 10087 - INTEGER(IntKi), PARAMETER :: M32N8MMze = 10088 - INTEGER(IntKi), PARAMETER :: M32N9MMze = 10089 - INTEGER(IntKi), PARAMETER :: M33N1MMze = 10090 - INTEGER(IntKi), PARAMETER :: M33N2MMze = 10091 - INTEGER(IntKi), PARAMETER :: M33N3MMze = 10092 - INTEGER(IntKi), PARAMETER :: M33N4MMze = 10093 - INTEGER(IntKi), PARAMETER :: M33N5MMze = 10094 - INTEGER(IntKi), PARAMETER :: M33N6MMze = 10095 - INTEGER(IntKi), PARAMETER :: M33N7MMze = 10096 - INTEGER(IntKi), PARAMETER :: M33N8MMze = 10097 - INTEGER(IntKi), PARAMETER :: M33N9MMze = 10098 - INTEGER(IntKi), PARAMETER :: M34N1MMze = 10099 - INTEGER(IntKi), PARAMETER :: M34N2MMze = 10100 - INTEGER(IntKi), PARAMETER :: M34N3MMze = 10101 - INTEGER(IntKi), PARAMETER :: M34N4MMze = 10102 - INTEGER(IntKi), PARAMETER :: M34N5MMze = 10103 - INTEGER(IntKi), PARAMETER :: M34N6MMze = 10104 - INTEGER(IntKi), PARAMETER :: M34N7MMze = 10105 - INTEGER(IntKi), PARAMETER :: M34N8MMze = 10106 - INTEGER(IntKi), PARAMETER :: M34N9MMze = 10107 - INTEGER(IntKi), PARAMETER :: M35N1MMze = 10108 - INTEGER(IntKi), PARAMETER :: M35N2MMze = 10109 - INTEGER(IntKi), PARAMETER :: M35N3MMze = 10110 - INTEGER(IntKi), PARAMETER :: M35N4MMze = 10111 - INTEGER(IntKi), PARAMETER :: M35N5MMze = 10112 - INTEGER(IntKi), PARAMETER :: M35N6MMze = 10113 - INTEGER(IntKi), PARAMETER :: M35N7MMze = 10114 - INTEGER(IntKi), PARAMETER :: M35N8MMze = 10115 - INTEGER(IntKi), PARAMETER :: M35N9MMze = 10116 - INTEGER(IntKi), PARAMETER :: M36N1MMze = 10117 - INTEGER(IntKi), PARAMETER :: M36N2MMze = 10118 - INTEGER(IntKi), PARAMETER :: M36N3MMze = 10119 - INTEGER(IntKi), PARAMETER :: M36N4MMze = 10120 - INTEGER(IntKi), PARAMETER :: M36N5MMze = 10121 - INTEGER(IntKi), PARAMETER :: M36N6MMze = 10122 - INTEGER(IntKi), PARAMETER :: M36N7MMze = 10123 - INTEGER(IntKi), PARAMETER :: M36N8MMze = 10124 - INTEGER(IntKi), PARAMETER :: M36N9MMze = 10125 - INTEGER(IntKi), PARAMETER :: M37N1MMze = 10126 - INTEGER(IntKi), PARAMETER :: M37N2MMze = 10127 - INTEGER(IntKi), PARAMETER :: M37N3MMze = 10128 - INTEGER(IntKi), PARAMETER :: M37N4MMze = 10129 - INTEGER(IntKi), PARAMETER :: M37N5MMze = 10130 - INTEGER(IntKi), PARAMETER :: M37N6MMze = 10131 - INTEGER(IntKi), PARAMETER :: M37N7MMze = 10132 - INTEGER(IntKi), PARAMETER :: M37N8MMze = 10133 - INTEGER(IntKi), PARAMETER :: M37N9MMze = 10134 - INTEGER(IntKi), PARAMETER :: M38N1MMze = 10135 - INTEGER(IntKi), PARAMETER :: M38N2MMze = 10136 - INTEGER(IntKi), PARAMETER :: M38N3MMze = 10137 - INTEGER(IntKi), PARAMETER :: M38N4MMze = 10138 - INTEGER(IntKi), PARAMETER :: M38N5MMze = 10139 - INTEGER(IntKi), PARAMETER :: M38N6MMze = 10140 - INTEGER(IntKi), PARAMETER :: M38N7MMze = 10141 - INTEGER(IntKi), PARAMETER :: M38N8MMze = 10142 - INTEGER(IntKi), PARAMETER :: M38N9MMze = 10143 - INTEGER(IntKi), PARAMETER :: M39N1MMze = 10144 - INTEGER(IntKi), PARAMETER :: M39N2MMze = 10145 - INTEGER(IntKi), PARAMETER :: M39N3MMze = 10146 - INTEGER(IntKi), PARAMETER :: M39N4MMze = 10147 - INTEGER(IntKi), PARAMETER :: M39N5MMze = 10148 - INTEGER(IntKi), PARAMETER :: M39N6MMze = 10149 - INTEGER(IntKi), PARAMETER :: M39N7MMze = 10150 - INTEGER(IntKi), PARAMETER :: M39N8MMze = 10151 - INTEGER(IntKi), PARAMETER :: M39N9MMze = 10152 - INTEGER(IntKi), PARAMETER :: M40N1MMze = 10153 - INTEGER(IntKi), PARAMETER :: M40N2MMze = 10154 - INTEGER(IntKi), PARAMETER :: M40N3MMze = 10155 - INTEGER(IntKi), PARAMETER :: M40N4MMze = 10156 - INTEGER(IntKi), PARAMETER :: M40N5MMze = 10157 - INTEGER(IntKi), PARAMETER :: M40N6MMze = 10158 - INTEGER(IntKi), PARAMETER :: M40N7MMze = 10159 - INTEGER(IntKi), PARAMETER :: M40N8MMze = 10160 - INTEGER(IntKi), PARAMETER :: M40N9MMze = 10161 - INTEGER(IntKi), PARAMETER :: M41N1MMze = 10162 - INTEGER(IntKi), PARAMETER :: M41N2MMze = 10163 - INTEGER(IntKi), PARAMETER :: M41N3MMze = 10164 - INTEGER(IntKi), PARAMETER :: M41N4MMze = 10165 - INTEGER(IntKi), PARAMETER :: M41N5MMze = 10166 - INTEGER(IntKi), PARAMETER :: M41N6MMze = 10167 - INTEGER(IntKi), PARAMETER :: M41N7MMze = 10168 - INTEGER(IntKi), PARAMETER :: M41N8MMze = 10169 - INTEGER(IntKi), PARAMETER :: M41N9MMze = 10170 - INTEGER(IntKi), PARAMETER :: M42N1MMze = 10171 - INTEGER(IntKi), PARAMETER :: M42N2MMze = 10172 - INTEGER(IntKi), PARAMETER :: M42N3MMze = 10173 - INTEGER(IntKi), PARAMETER :: M42N4MMze = 10174 - INTEGER(IntKi), PARAMETER :: M42N5MMze = 10175 - INTEGER(IntKi), PARAMETER :: M42N6MMze = 10176 - INTEGER(IntKi), PARAMETER :: M42N7MMze = 10177 - INTEGER(IntKi), PARAMETER :: M42N8MMze = 10178 - INTEGER(IntKi), PARAMETER :: M42N9MMze = 10179 - INTEGER(IntKi), PARAMETER :: M43N1MMze = 10180 - INTEGER(IntKi), PARAMETER :: M43N2MMze = 10181 - INTEGER(IntKi), PARAMETER :: M43N3MMze = 10182 - INTEGER(IntKi), PARAMETER :: M43N4MMze = 10183 - INTEGER(IntKi), PARAMETER :: M43N5MMze = 10184 - INTEGER(IntKi), PARAMETER :: M43N6MMze = 10185 - INTEGER(IntKi), PARAMETER :: M43N7MMze = 10186 - INTEGER(IntKi), PARAMETER :: M43N8MMze = 10187 - INTEGER(IntKi), PARAMETER :: M43N9MMze = 10188 - INTEGER(IntKi), PARAMETER :: M44N1MMze = 10189 - INTEGER(IntKi), PARAMETER :: M44N2MMze = 10190 - INTEGER(IntKi), PARAMETER :: M44N3MMze = 10191 - INTEGER(IntKi), PARAMETER :: M44N4MMze = 10192 - INTEGER(IntKi), PARAMETER :: M44N5MMze = 10193 - INTEGER(IntKi), PARAMETER :: M44N6MMze = 10194 - INTEGER(IntKi), PARAMETER :: M44N7MMze = 10195 - INTEGER(IntKi), PARAMETER :: M44N8MMze = 10196 - INTEGER(IntKi), PARAMETER :: M44N9MMze = 10197 - INTEGER(IntKi), PARAMETER :: M45N1MMze = 10198 - INTEGER(IntKi), PARAMETER :: M45N2MMze = 10199 - INTEGER(IntKi), PARAMETER :: M45N3MMze = 10200 - INTEGER(IntKi), PARAMETER :: M45N4MMze = 10201 - INTEGER(IntKi), PARAMETER :: M45N5MMze = 10202 - INTEGER(IntKi), PARAMETER :: M45N6MMze = 10203 - INTEGER(IntKi), PARAMETER :: M45N7MMze = 10204 - INTEGER(IntKi), PARAMETER :: M45N8MMze = 10205 - INTEGER(IntKi), PARAMETER :: M45N9MMze = 10206 - INTEGER(IntKi), PARAMETER :: M46N1MMze = 10207 - INTEGER(IntKi), PARAMETER :: M46N2MMze = 10208 - INTEGER(IntKi), PARAMETER :: M46N3MMze = 10209 - INTEGER(IntKi), PARAMETER :: M46N4MMze = 10210 - INTEGER(IntKi), PARAMETER :: M46N5MMze = 10211 - INTEGER(IntKi), PARAMETER :: M46N6MMze = 10212 - INTEGER(IntKi), PARAMETER :: M46N7MMze = 10213 - INTEGER(IntKi), PARAMETER :: M46N8MMze = 10214 - INTEGER(IntKi), PARAMETER :: M46N9MMze = 10215 - INTEGER(IntKi), PARAMETER :: M47N1MMze = 10216 - INTEGER(IntKi), PARAMETER :: M47N2MMze = 10217 - INTEGER(IntKi), PARAMETER :: M47N3MMze = 10218 - INTEGER(IntKi), PARAMETER :: M47N4MMze = 10219 - INTEGER(IntKi), PARAMETER :: M47N5MMze = 10220 - INTEGER(IntKi), PARAMETER :: M47N6MMze = 10221 - INTEGER(IntKi), PARAMETER :: M47N7MMze = 10222 - INTEGER(IntKi), PARAMETER :: M47N8MMze = 10223 - INTEGER(IntKi), PARAMETER :: M47N9MMze = 10224 - INTEGER(IntKi), PARAMETER :: M48N1MMze = 10225 - INTEGER(IntKi), PARAMETER :: M48N2MMze = 10226 - INTEGER(IntKi), PARAMETER :: M48N3MMze = 10227 - INTEGER(IntKi), PARAMETER :: M48N4MMze = 10228 - INTEGER(IntKi), PARAMETER :: M48N5MMze = 10229 - INTEGER(IntKi), PARAMETER :: M48N6MMze = 10230 - INTEGER(IntKi), PARAMETER :: M48N7MMze = 10231 - INTEGER(IntKi), PARAMETER :: M48N8MMze = 10232 - INTEGER(IntKi), PARAMETER :: M48N9MMze = 10233 - INTEGER(IntKi), PARAMETER :: M49N1MMze = 10234 - INTEGER(IntKi), PARAMETER :: M49N2MMze = 10235 - INTEGER(IntKi), PARAMETER :: M49N3MMze = 10236 - INTEGER(IntKi), PARAMETER :: M49N4MMze = 10237 - INTEGER(IntKi), PARAMETER :: M49N5MMze = 10238 - INTEGER(IntKi), PARAMETER :: M49N6MMze = 10239 - INTEGER(IntKi), PARAMETER :: M49N7MMze = 10240 - INTEGER(IntKi), PARAMETER :: M49N8MMze = 10241 - INTEGER(IntKi), PARAMETER :: M49N9MMze = 10242 - INTEGER(IntKi), PARAMETER :: M50N1MMze = 10243 - INTEGER(IntKi), PARAMETER :: M50N2MMze = 10244 - INTEGER(IntKi), PARAMETER :: M50N3MMze = 10245 - INTEGER(IntKi), PARAMETER :: M50N4MMze = 10246 - INTEGER(IntKi), PARAMETER :: M50N5MMze = 10247 - INTEGER(IntKi), PARAMETER :: M50N6MMze = 10248 - INTEGER(IntKi), PARAMETER :: M50N7MMze = 10249 - INTEGER(IntKi), PARAMETER :: M50N8MMze = 10250 - INTEGER(IntKi), PARAMETER :: M50N9MMze = 10251 - INTEGER(IntKi), PARAMETER :: M51N1MMze = 10252 - INTEGER(IntKi), PARAMETER :: M51N2MMze = 10253 - INTEGER(IntKi), PARAMETER :: M51N3MMze = 10254 - INTEGER(IntKi), PARAMETER :: M51N4MMze = 10255 - INTEGER(IntKi), PARAMETER :: M51N5MMze = 10256 - INTEGER(IntKi), PARAMETER :: M51N6MMze = 10257 - INTEGER(IntKi), PARAMETER :: M51N7MMze = 10258 - INTEGER(IntKi), PARAMETER :: M51N8MMze = 10259 - INTEGER(IntKi), PARAMETER :: M51N9MMze = 10260 - INTEGER(IntKi), PARAMETER :: M52N1MMze = 10261 - INTEGER(IntKi), PARAMETER :: M52N2MMze = 10262 - INTEGER(IntKi), PARAMETER :: M52N3MMze = 10263 - INTEGER(IntKi), PARAMETER :: M52N4MMze = 10264 - INTEGER(IntKi), PARAMETER :: M52N5MMze = 10265 - INTEGER(IntKi), PARAMETER :: M52N6MMze = 10266 - INTEGER(IntKi), PARAMETER :: M52N7MMze = 10267 - INTEGER(IntKi), PARAMETER :: M52N8MMze = 10268 - INTEGER(IntKi), PARAMETER :: M52N9MMze = 10269 - INTEGER(IntKi), PARAMETER :: M53N1MMze = 10270 - INTEGER(IntKi), PARAMETER :: M53N2MMze = 10271 - INTEGER(IntKi), PARAMETER :: M53N3MMze = 10272 - INTEGER(IntKi), PARAMETER :: M53N4MMze = 10273 - INTEGER(IntKi), PARAMETER :: M53N5MMze = 10274 - INTEGER(IntKi), PARAMETER :: M53N6MMze = 10275 - INTEGER(IntKi), PARAMETER :: M53N7MMze = 10276 - INTEGER(IntKi), PARAMETER :: M53N8MMze = 10277 - INTEGER(IntKi), PARAMETER :: M53N9MMze = 10278 - INTEGER(IntKi), PARAMETER :: M54N1MMze = 10279 - INTEGER(IntKi), PARAMETER :: M54N2MMze = 10280 - INTEGER(IntKi), PARAMETER :: M54N3MMze = 10281 - INTEGER(IntKi), PARAMETER :: M54N4MMze = 10282 - INTEGER(IntKi), PARAMETER :: M54N5MMze = 10283 - INTEGER(IntKi), PARAMETER :: M54N6MMze = 10284 - INTEGER(IntKi), PARAMETER :: M54N7MMze = 10285 - INTEGER(IntKi), PARAMETER :: M54N8MMze = 10286 - INTEGER(IntKi), PARAMETER :: M54N9MMze = 10287 - INTEGER(IntKi), PARAMETER :: M55N1MMze = 10288 - INTEGER(IntKi), PARAMETER :: M55N2MMze = 10289 - INTEGER(IntKi), PARAMETER :: M55N3MMze = 10290 - INTEGER(IntKi), PARAMETER :: M55N4MMze = 10291 - INTEGER(IntKi), PARAMETER :: M55N5MMze = 10292 - INTEGER(IntKi), PARAMETER :: M55N6MMze = 10293 - INTEGER(IntKi), PARAMETER :: M55N7MMze = 10294 - INTEGER(IntKi), PARAMETER :: M55N8MMze = 10295 - INTEGER(IntKi), PARAMETER :: M55N9MMze = 10296 - INTEGER(IntKi), PARAMETER :: M56N1MMze = 10297 - INTEGER(IntKi), PARAMETER :: M56N2MMze = 10298 - INTEGER(IntKi), PARAMETER :: M56N3MMze = 10299 - INTEGER(IntKi), PARAMETER :: M56N4MMze = 10300 - INTEGER(IntKi), PARAMETER :: M56N5MMze = 10301 - INTEGER(IntKi), PARAMETER :: M56N6MMze = 10302 - INTEGER(IntKi), PARAMETER :: M56N7MMze = 10303 - INTEGER(IntKi), PARAMETER :: M56N8MMze = 10304 - INTEGER(IntKi), PARAMETER :: M56N9MMze = 10305 - INTEGER(IntKi), PARAMETER :: M57N1MMze = 10306 - INTEGER(IntKi), PARAMETER :: M57N2MMze = 10307 - INTEGER(IntKi), PARAMETER :: M57N3MMze = 10308 - INTEGER(IntKi), PARAMETER :: M57N4MMze = 10309 - INTEGER(IntKi), PARAMETER :: M57N5MMze = 10310 - INTEGER(IntKi), PARAMETER :: M57N6MMze = 10311 - INTEGER(IntKi), PARAMETER :: M57N7MMze = 10312 - INTEGER(IntKi), PARAMETER :: M57N8MMze = 10313 - INTEGER(IntKi), PARAMETER :: M57N9MMze = 10314 - INTEGER(IntKi), PARAMETER :: M58N1MMze = 10315 - INTEGER(IntKi), PARAMETER :: M58N2MMze = 10316 - INTEGER(IntKi), PARAMETER :: M58N3MMze = 10317 - INTEGER(IntKi), PARAMETER :: M58N4MMze = 10318 - INTEGER(IntKi), PARAMETER :: M58N5MMze = 10319 - INTEGER(IntKi), PARAMETER :: M58N6MMze = 10320 - INTEGER(IntKi), PARAMETER :: M58N7MMze = 10321 - INTEGER(IntKi), PARAMETER :: M58N8MMze = 10322 - INTEGER(IntKi), PARAMETER :: M58N9MMze = 10323 - INTEGER(IntKi), PARAMETER :: M59N1MMze = 10324 - INTEGER(IntKi), PARAMETER :: M59N2MMze = 10325 - INTEGER(IntKi), PARAMETER :: M59N3MMze = 10326 - INTEGER(IntKi), PARAMETER :: M59N4MMze = 10327 - INTEGER(IntKi), PARAMETER :: M59N5MMze = 10328 - INTEGER(IntKi), PARAMETER :: M59N6MMze = 10329 - INTEGER(IntKi), PARAMETER :: M59N7MMze = 10330 - INTEGER(IntKi), PARAMETER :: M59N8MMze = 10331 - INTEGER(IntKi), PARAMETER :: M59N9MMze = 10332 - INTEGER(IntKi), PARAMETER :: M60N1MMze = 10333 - INTEGER(IntKi), PARAMETER :: M60N2MMze = 10334 - INTEGER(IntKi), PARAMETER :: M60N3MMze = 10335 - INTEGER(IntKi), PARAMETER :: M60N4MMze = 10336 - INTEGER(IntKi), PARAMETER :: M60N5MMze = 10337 - INTEGER(IntKi), PARAMETER :: M60N6MMze = 10338 - INTEGER(IntKi), PARAMETER :: M60N7MMze = 10339 - INTEGER(IntKi), PARAMETER :: M60N8MMze = 10340 - INTEGER(IntKi), PARAMETER :: M60N9MMze = 10341 - INTEGER(IntKi), PARAMETER :: M61N1MMze = 10342 - INTEGER(IntKi), PARAMETER :: M61N2MMze = 10343 - INTEGER(IntKi), PARAMETER :: M61N3MMze = 10344 - INTEGER(IntKi), PARAMETER :: M61N4MMze = 10345 - INTEGER(IntKi), PARAMETER :: M61N5MMze = 10346 - INTEGER(IntKi), PARAMETER :: M61N6MMze = 10347 - INTEGER(IntKi), PARAMETER :: M61N7MMze = 10348 - INTEGER(IntKi), PARAMETER :: M61N8MMze = 10349 - INTEGER(IntKi), PARAMETER :: M61N9MMze = 10350 - INTEGER(IntKi), PARAMETER :: M62N1MMze = 10351 - INTEGER(IntKi), PARAMETER :: M62N2MMze = 10352 - INTEGER(IntKi), PARAMETER :: M62N3MMze = 10353 - INTEGER(IntKi), PARAMETER :: M62N4MMze = 10354 - INTEGER(IntKi), PARAMETER :: M62N5MMze = 10355 - INTEGER(IntKi), PARAMETER :: M62N6MMze = 10356 - INTEGER(IntKi), PARAMETER :: M62N7MMze = 10357 - INTEGER(IntKi), PARAMETER :: M62N8MMze = 10358 - INTEGER(IntKi), PARAMETER :: M62N9MMze = 10359 - INTEGER(IntKi), PARAMETER :: M63N1MMze = 10360 - INTEGER(IntKi), PARAMETER :: M63N2MMze = 10361 - INTEGER(IntKi), PARAMETER :: M63N3MMze = 10362 - INTEGER(IntKi), PARAMETER :: M63N4MMze = 10363 - INTEGER(IntKi), PARAMETER :: M63N5MMze = 10364 - INTEGER(IntKi), PARAMETER :: M63N6MMze = 10365 - INTEGER(IntKi), PARAMETER :: M63N7MMze = 10366 - INTEGER(IntKi), PARAMETER :: M63N8MMze = 10367 - INTEGER(IntKi), PARAMETER :: M63N9MMze = 10368 - INTEGER(IntKi), PARAMETER :: M64N1MMze = 10369 - INTEGER(IntKi), PARAMETER :: M64N2MMze = 10370 - INTEGER(IntKi), PARAMETER :: M64N3MMze = 10371 - INTEGER(IntKi), PARAMETER :: M64N4MMze = 10372 - INTEGER(IntKi), PARAMETER :: M64N5MMze = 10373 - INTEGER(IntKi), PARAMETER :: M64N6MMze = 10374 - INTEGER(IntKi), PARAMETER :: M64N7MMze = 10375 - INTEGER(IntKi), PARAMETER :: M64N8MMze = 10376 - INTEGER(IntKi), PARAMETER :: M64N9MMze = 10377 - INTEGER(IntKi), PARAMETER :: M65N1MMze = 10378 - INTEGER(IntKi), PARAMETER :: M65N2MMze = 10379 - INTEGER(IntKi), PARAMETER :: M65N3MMze = 10380 - INTEGER(IntKi), PARAMETER :: M65N4MMze = 10381 - INTEGER(IntKi), PARAMETER :: M65N5MMze = 10382 - INTEGER(IntKi), PARAMETER :: M65N6MMze = 10383 - INTEGER(IntKi), PARAMETER :: M65N7MMze = 10384 - INTEGER(IntKi), PARAMETER :: M65N8MMze = 10385 - INTEGER(IntKi), PARAMETER :: M65N9MMze = 10386 - INTEGER(IntKi), PARAMETER :: M66N1MMze = 10387 - INTEGER(IntKi), PARAMETER :: M66N2MMze = 10388 - INTEGER(IntKi), PARAMETER :: M66N3MMze = 10389 - INTEGER(IntKi), PARAMETER :: M66N4MMze = 10390 - INTEGER(IntKi), PARAMETER :: M66N5MMze = 10391 - INTEGER(IntKi), PARAMETER :: M66N6MMze = 10392 - INTEGER(IntKi), PARAMETER :: M66N7MMze = 10393 - INTEGER(IntKi), PARAMETER :: M66N8MMze = 10394 - INTEGER(IntKi), PARAMETER :: M66N9MMze = 10395 - INTEGER(IntKi), PARAMETER :: M67N1MMze = 10396 - INTEGER(IntKi), PARAMETER :: M67N2MMze = 10397 - INTEGER(IntKi), PARAMETER :: M67N3MMze = 10398 - INTEGER(IntKi), PARAMETER :: M67N4MMze = 10399 - INTEGER(IntKi), PARAMETER :: M67N5MMze = 10400 - INTEGER(IntKi), PARAMETER :: M67N6MMze = 10401 - INTEGER(IntKi), PARAMETER :: M67N7MMze = 10402 - INTEGER(IntKi), PARAMETER :: M67N8MMze = 10403 - INTEGER(IntKi), PARAMETER :: M67N9MMze = 10404 - INTEGER(IntKi), PARAMETER :: M68N1MMze = 10405 - INTEGER(IntKi), PARAMETER :: M68N2MMze = 10406 - INTEGER(IntKi), PARAMETER :: M68N3MMze = 10407 - INTEGER(IntKi), PARAMETER :: M68N4MMze = 10408 - INTEGER(IntKi), PARAMETER :: M68N5MMze = 10409 - INTEGER(IntKi), PARAMETER :: M68N6MMze = 10410 - INTEGER(IntKi), PARAMETER :: M68N7MMze = 10411 - INTEGER(IntKi), PARAMETER :: M68N8MMze = 10412 - INTEGER(IntKi), PARAMETER :: M68N9MMze = 10413 - INTEGER(IntKi), PARAMETER :: M69N1MMze = 10414 - INTEGER(IntKi), PARAMETER :: M69N2MMze = 10415 - INTEGER(IntKi), PARAMETER :: M69N3MMze = 10416 - INTEGER(IntKi), PARAMETER :: M69N4MMze = 10417 - INTEGER(IntKi), PARAMETER :: M69N5MMze = 10418 - INTEGER(IntKi), PARAMETER :: M69N6MMze = 10419 - INTEGER(IntKi), PARAMETER :: M69N7MMze = 10420 - INTEGER(IntKi), PARAMETER :: M69N8MMze = 10421 - INTEGER(IntKi), PARAMETER :: M69N9MMze = 10422 - INTEGER(IntKi), PARAMETER :: M70N1MMze = 10423 - INTEGER(IntKi), PARAMETER :: M70N2MMze = 10424 - INTEGER(IntKi), PARAMETER :: M70N3MMze = 10425 - INTEGER(IntKi), PARAMETER :: M70N4MMze = 10426 - INTEGER(IntKi), PARAMETER :: M70N5MMze = 10427 - INTEGER(IntKi), PARAMETER :: M70N6MMze = 10428 - INTEGER(IntKi), PARAMETER :: M70N7MMze = 10429 - INTEGER(IntKi), PARAMETER :: M70N8MMze = 10430 - INTEGER(IntKi), PARAMETER :: M70N9MMze = 10431 - INTEGER(IntKi), PARAMETER :: M71N1MMze = 10432 - INTEGER(IntKi), PARAMETER :: M71N2MMze = 10433 - INTEGER(IntKi), PARAMETER :: M71N3MMze = 10434 - INTEGER(IntKi), PARAMETER :: M71N4MMze = 10435 - INTEGER(IntKi), PARAMETER :: M71N5MMze = 10436 - INTEGER(IntKi), PARAMETER :: M71N6MMze = 10437 - INTEGER(IntKi), PARAMETER :: M71N7MMze = 10438 - INTEGER(IntKi), PARAMETER :: M71N8MMze = 10439 - INTEGER(IntKi), PARAMETER :: M71N9MMze = 10440 - INTEGER(IntKi), PARAMETER :: M72N1MMze = 10441 - INTEGER(IntKi), PARAMETER :: M72N2MMze = 10442 - INTEGER(IntKi), PARAMETER :: M72N3MMze = 10443 - INTEGER(IntKi), PARAMETER :: M72N4MMze = 10444 - INTEGER(IntKi), PARAMETER :: M72N5MMze = 10445 - INTEGER(IntKi), PARAMETER :: M72N6MMze = 10446 - INTEGER(IntKi), PARAMETER :: M72N7MMze = 10447 - INTEGER(IntKi), PARAMETER :: M72N8MMze = 10448 - INTEGER(IntKi), PARAMETER :: M72N9MMze = 10449 - INTEGER(IntKi), PARAMETER :: M73N1MMze = 10450 - INTEGER(IntKi), PARAMETER :: M73N2MMze = 10451 - INTEGER(IntKi), PARAMETER :: M73N3MMze = 10452 - INTEGER(IntKi), PARAMETER :: M73N4MMze = 10453 - INTEGER(IntKi), PARAMETER :: M73N5MMze = 10454 - INTEGER(IntKi), PARAMETER :: M73N6MMze = 10455 - INTEGER(IntKi), PARAMETER :: M73N7MMze = 10456 - INTEGER(IntKi), PARAMETER :: M73N8MMze = 10457 - INTEGER(IntKi), PARAMETER :: M73N9MMze = 10458 - INTEGER(IntKi), PARAMETER :: M74N1MMze = 10459 - INTEGER(IntKi), PARAMETER :: M74N2MMze = 10460 - INTEGER(IntKi), PARAMETER :: M74N3MMze = 10461 - INTEGER(IntKi), PARAMETER :: M74N4MMze = 10462 - INTEGER(IntKi), PARAMETER :: M74N5MMze = 10463 - INTEGER(IntKi), PARAMETER :: M74N6MMze = 10464 - INTEGER(IntKi), PARAMETER :: M74N7MMze = 10465 - INTEGER(IntKi), PARAMETER :: M74N8MMze = 10466 - INTEGER(IntKi), PARAMETER :: M74N9MMze = 10467 - INTEGER(IntKi), PARAMETER :: M75N1MMze = 10468 - INTEGER(IntKi), PARAMETER :: M75N2MMze = 10469 - INTEGER(IntKi), PARAMETER :: M75N3MMze = 10470 - INTEGER(IntKi), PARAMETER :: M75N4MMze = 10471 - INTEGER(IntKi), PARAMETER :: M75N5MMze = 10472 - INTEGER(IntKi), PARAMETER :: M75N6MMze = 10473 - INTEGER(IntKi), PARAMETER :: M75N7MMze = 10474 - INTEGER(IntKi), PARAMETER :: M75N8MMze = 10475 - INTEGER(IntKi), PARAMETER :: M75N9MMze = 10476 - INTEGER(IntKi), PARAMETER :: M76N1MMze = 10477 - INTEGER(IntKi), PARAMETER :: M76N2MMze = 10478 - INTEGER(IntKi), PARAMETER :: M76N3MMze = 10479 - INTEGER(IntKi), PARAMETER :: M76N4MMze = 10480 - INTEGER(IntKi), PARAMETER :: M76N5MMze = 10481 - INTEGER(IntKi), PARAMETER :: M76N6MMze = 10482 - INTEGER(IntKi), PARAMETER :: M76N7MMze = 10483 - INTEGER(IntKi), PARAMETER :: M76N8MMze = 10484 - INTEGER(IntKi), PARAMETER :: M76N9MMze = 10485 - INTEGER(IntKi), PARAMETER :: M77N1MMze = 10486 - INTEGER(IntKi), PARAMETER :: M77N2MMze = 10487 - INTEGER(IntKi), PARAMETER :: M77N3MMze = 10488 - INTEGER(IntKi), PARAMETER :: M77N4MMze = 10489 - INTEGER(IntKi), PARAMETER :: M77N5MMze = 10490 - INTEGER(IntKi), PARAMETER :: M77N6MMze = 10491 - INTEGER(IntKi), PARAMETER :: M77N7MMze = 10492 - INTEGER(IntKi), PARAMETER :: M77N8MMze = 10493 - INTEGER(IntKi), PARAMETER :: M77N9MMze = 10494 - INTEGER(IntKi), PARAMETER :: M78N1MMze = 10495 - INTEGER(IntKi), PARAMETER :: M78N2MMze = 10496 - INTEGER(IntKi), PARAMETER :: M78N3MMze = 10497 - INTEGER(IntKi), PARAMETER :: M78N4MMze = 10498 - INTEGER(IntKi), PARAMETER :: M78N5MMze = 10499 - INTEGER(IntKi), PARAMETER :: M78N6MMze = 10500 - INTEGER(IntKi), PARAMETER :: M78N7MMze = 10501 - INTEGER(IntKi), PARAMETER :: M78N8MMze = 10502 - INTEGER(IntKi), PARAMETER :: M78N9MMze = 10503 - INTEGER(IntKi), PARAMETER :: M79N1MMze = 10504 - INTEGER(IntKi), PARAMETER :: M79N2MMze = 10505 - INTEGER(IntKi), PARAMETER :: M79N3MMze = 10506 - INTEGER(IntKi), PARAMETER :: M79N4MMze = 10507 - INTEGER(IntKi), PARAMETER :: M79N5MMze = 10508 - INTEGER(IntKi), PARAMETER :: M79N6MMze = 10509 - INTEGER(IntKi), PARAMETER :: M79N7MMze = 10510 - INTEGER(IntKi), PARAMETER :: M79N8MMze = 10511 - INTEGER(IntKi), PARAMETER :: M79N9MMze = 10512 - INTEGER(IntKi), PARAMETER :: M80N1MMze = 10513 - INTEGER(IntKi), PARAMETER :: M80N2MMze = 10514 - INTEGER(IntKi), PARAMETER :: M80N3MMze = 10515 - INTEGER(IntKi), PARAMETER :: M80N4MMze = 10516 - INTEGER(IntKi), PARAMETER :: M80N5MMze = 10517 - INTEGER(IntKi), PARAMETER :: M80N6MMze = 10518 - INTEGER(IntKi), PARAMETER :: M80N7MMze = 10519 - INTEGER(IntKi), PARAMETER :: M80N8MMze = 10520 - INTEGER(IntKi), PARAMETER :: M80N9MMze = 10521 - INTEGER(IntKi), PARAMETER :: M81N1MMze = 10522 - INTEGER(IntKi), PARAMETER :: M81N2MMze = 10523 - INTEGER(IntKi), PARAMETER :: M81N3MMze = 10524 - INTEGER(IntKi), PARAMETER :: M81N4MMze = 10525 - INTEGER(IntKi), PARAMETER :: M81N5MMze = 10526 - INTEGER(IntKi), PARAMETER :: M81N6MMze = 10527 - INTEGER(IntKi), PARAMETER :: M81N7MMze = 10528 - INTEGER(IntKi), PARAMETER :: M81N8MMze = 10529 - INTEGER(IntKi), PARAMETER :: M81N9MMze = 10530 - INTEGER(IntKi), PARAMETER :: M82N1MMze = 10531 - INTEGER(IntKi), PARAMETER :: M82N2MMze = 10532 - INTEGER(IntKi), PARAMETER :: M82N3MMze = 10533 - INTEGER(IntKi), PARAMETER :: M82N4MMze = 10534 - INTEGER(IntKi), PARAMETER :: M82N5MMze = 10535 - INTEGER(IntKi), PARAMETER :: M82N6MMze = 10536 - INTEGER(IntKi), PARAMETER :: M82N7MMze = 10537 - INTEGER(IntKi), PARAMETER :: M82N8MMze = 10538 - INTEGER(IntKi), PARAMETER :: M82N9MMze = 10539 - INTEGER(IntKi), PARAMETER :: M83N1MMze = 10540 - INTEGER(IntKi), PARAMETER :: M83N2MMze = 10541 - INTEGER(IntKi), PARAMETER :: M83N3MMze = 10542 - INTEGER(IntKi), PARAMETER :: M83N4MMze = 10543 - INTEGER(IntKi), PARAMETER :: M83N5MMze = 10544 - INTEGER(IntKi), PARAMETER :: M83N6MMze = 10545 - INTEGER(IntKi), PARAMETER :: M83N7MMze = 10546 - INTEGER(IntKi), PARAMETER :: M83N8MMze = 10547 - INTEGER(IntKi), PARAMETER :: M83N9MMze = 10548 - INTEGER(IntKi), PARAMETER :: M84N1MMze = 10549 - INTEGER(IntKi), PARAMETER :: M84N2MMze = 10550 - INTEGER(IntKi), PARAMETER :: M84N3MMze = 10551 - INTEGER(IntKi), PARAMETER :: M84N4MMze = 10552 - INTEGER(IntKi), PARAMETER :: M84N5MMze = 10553 - INTEGER(IntKi), PARAMETER :: M84N6MMze = 10554 - INTEGER(IntKi), PARAMETER :: M84N7MMze = 10555 - INTEGER(IntKi), PARAMETER :: M84N8MMze = 10556 - INTEGER(IntKi), PARAMETER :: M84N9MMze = 10557 - INTEGER(IntKi), PARAMETER :: M85N1MMze = 10558 - INTEGER(IntKi), PARAMETER :: M85N2MMze = 10559 - INTEGER(IntKi), PARAMETER :: M85N3MMze = 10560 - INTEGER(IntKi), PARAMETER :: M85N4MMze = 10561 - INTEGER(IntKi), PARAMETER :: M85N5MMze = 10562 - INTEGER(IntKi), PARAMETER :: M85N6MMze = 10563 - INTEGER(IntKi), PARAMETER :: M85N7MMze = 10564 - INTEGER(IntKi), PARAMETER :: M85N8MMze = 10565 - INTEGER(IntKi), PARAMETER :: M85N9MMze = 10566 - INTEGER(IntKi), PARAMETER :: M86N1MMze = 10567 - INTEGER(IntKi), PARAMETER :: M86N2MMze = 10568 - INTEGER(IntKi), PARAMETER :: M86N3MMze = 10569 - INTEGER(IntKi), PARAMETER :: M86N4MMze = 10570 - INTEGER(IntKi), PARAMETER :: M86N5MMze = 10571 - INTEGER(IntKi), PARAMETER :: M86N6MMze = 10572 - INTEGER(IntKi), PARAMETER :: M86N7MMze = 10573 - INTEGER(IntKi), PARAMETER :: M86N8MMze = 10574 - INTEGER(IntKi), PARAMETER :: M86N9MMze = 10575 - INTEGER(IntKi), PARAMETER :: M87N1MMze = 10576 - INTEGER(IntKi), PARAMETER :: M87N2MMze = 10577 - INTEGER(IntKi), PARAMETER :: M87N3MMze = 10578 - INTEGER(IntKi), PARAMETER :: M87N4MMze = 10579 - INTEGER(IntKi), PARAMETER :: M87N5MMze = 10580 - INTEGER(IntKi), PARAMETER :: M87N6MMze = 10581 - INTEGER(IntKi), PARAMETER :: M87N7MMze = 10582 - INTEGER(IntKi), PARAMETER :: M87N8MMze = 10583 - INTEGER(IntKi), PARAMETER :: M87N9MMze = 10584 - INTEGER(IntKi), PARAMETER :: M88N1MMze = 10585 - INTEGER(IntKi), PARAMETER :: M88N2MMze = 10586 - INTEGER(IntKi), PARAMETER :: M88N3MMze = 10587 - INTEGER(IntKi), PARAMETER :: M88N4MMze = 10588 - INTEGER(IntKi), PARAMETER :: M88N5MMze = 10589 - INTEGER(IntKi), PARAMETER :: M88N6MMze = 10590 - INTEGER(IntKi), PARAMETER :: M88N7MMze = 10591 - INTEGER(IntKi), PARAMETER :: M88N8MMze = 10592 - INTEGER(IntKi), PARAMETER :: M88N9MMze = 10593 - INTEGER(IntKi), PARAMETER :: M89N1MMze = 10594 - INTEGER(IntKi), PARAMETER :: M89N2MMze = 10595 - INTEGER(IntKi), PARAMETER :: M89N3MMze = 10596 - INTEGER(IntKi), PARAMETER :: M89N4MMze = 10597 - INTEGER(IntKi), PARAMETER :: M89N5MMze = 10598 - INTEGER(IntKi), PARAMETER :: M89N6MMze = 10599 - INTEGER(IntKi), PARAMETER :: M89N7MMze = 10600 - INTEGER(IntKi), PARAMETER :: M89N8MMze = 10601 - INTEGER(IntKi), PARAMETER :: M89N9MMze = 10602 - INTEGER(IntKi), PARAMETER :: M90N1MMze = 10603 - INTEGER(IntKi), PARAMETER :: M90N2MMze = 10604 - INTEGER(IntKi), PARAMETER :: M90N3MMze = 10605 - INTEGER(IntKi), PARAMETER :: M90N4MMze = 10606 - INTEGER(IntKi), PARAMETER :: M90N5MMze = 10607 - INTEGER(IntKi), PARAMETER :: M90N6MMze = 10608 - INTEGER(IntKi), PARAMETER :: M90N7MMze = 10609 - INTEGER(IntKi), PARAMETER :: M90N8MMze = 10610 - INTEGER(IntKi), PARAMETER :: M90N9MMze = 10611 - INTEGER(IntKi), PARAMETER :: M91N1MMze = 10612 - INTEGER(IntKi), PARAMETER :: M91N2MMze = 10613 - INTEGER(IntKi), PARAMETER :: M91N3MMze = 10614 - INTEGER(IntKi), PARAMETER :: M91N4MMze = 10615 - INTEGER(IntKi), PARAMETER :: M91N5MMze = 10616 - INTEGER(IntKi), PARAMETER :: M91N6MMze = 10617 - INTEGER(IntKi), PARAMETER :: M91N7MMze = 10618 - INTEGER(IntKi), PARAMETER :: M91N8MMze = 10619 - INTEGER(IntKi), PARAMETER :: M91N9MMze = 10620 - INTEGER(IntKi), PARAMETER :: M92N1MMze = 10621 - INTEGER(IntKi), PARAMETER :: M92N2MMze = 10622 - INTEGER(IntKi), PARAMETER :: M92N3MMze = 10623 - INTEGER(IntKi), PARAMETER :: M92N4MMze = 10624 - INTEGER(IntKi), PARAMETER :: M92N5MMze = 10625 - INTEGER(IntKi), PARAMETER :: M92N6MMze = 10626 - INTEGER(IntKi), PARAMETER :: M92N7MMze = 10627 - INTEGER(IntKi), PARAMETER :: M92N8MMze = 10628 - INTEGER(IntKi), PARAMETER :: M92N9MMze = 10629 - INTEGER(IntKi), PARAMETER :: M93N1MMze = 10630 - INTEGER(IntKi), PARAMETER :: M93N2MMze = 10631 - INTEGER(IntKi), PARAMETER :: M93N3MMze = 10632 - INTEGER(IntKi), PARAMETER :: M93N4MMze = 10633 - INTEGER(IntKi), PARAMETER :: M93N5MMze = 10634 - INTEGER(IntKi), PARAMETER :: M93N6MMze = 10635 - INTEGER(IntKi), PARAMETER :: M93N7MMze = 10636 - INTEGER(IntKi), PARAMETER :: M93N8MMze = 10637 - INTEGER(IntKi), PARAMETER :: M93N9MMze = 10638 - INTEGER(IntKi), PARAMETER :: M94N1MMze = 10639 - INTEGER(IntKi), PARAMETER :: M94N2MMze = 10640 - INTEGER(IntKi), PARAMETER :: M94N3MMze = 10641 - INTEGER(IntKi), PARAMETER :: M94N4MMze = 10642 - INTEGER(IntKi), PARAMETER :: M94N5MMze = 10643 - INTEGER(IntKi), PARAMETER :: M94N6MMze = 10644 - INTEGER(IntKi), PARAMETER :: M94N7MMze = 10645 - INTEGER(IntKi), PARAMETER :: M94N8MMze = 10646 - INTEGER(IntKi), PARAMETER :: M94N9MMze = 10647 - INTEGER(IntKi), PARAMETER :: M95N1MMze = 10648 - INTEGER(IntKi), PARAMETER :: M95N2MMze = 10649 - INTEGER(IntKi), PARAMETER :: M95N3MMze = 10650 - INTEGER(IntKi), PARAMETER :: M95N4MMze = 10651 - INTEGER(IntKi), PARAMETER :: M95N5MMze = 10652 - INTEGER(IntKi), PARAMETER :: M95N6MMze = 10653 - INTEGER(IntKi), PARAMETER :: M95N7MMze = 10654 - INTEGER(IntKi), PARAMETER :: M95N8MMze = 10655 - INTEGER(IntKi), PARAMETER :: M95N9MMze = 10656 - INTEGER(IntKi), PARAMETER :: M96N1MMze = 10657 - INTEGER(IntKi), PARAMETER :: M96N2MMze = 10658 - INTEGER(IntKi), PARAMETER :: M96N3MMze = 10659 - INTEGER(IntKi), PARAMETER :: M96N4MMze = 10660 - INTEGER(IntKi), PARAMETER :: M96N5MMze = 10661 - INTEGER(IntKi), PARAMETER :: M96N6MMze = 10662 - INTEGER(IntKi), PARAMETER :: M96N7MMze = 10663 - INTEGER(IntKi), PARAMETER :: M96N8MMze = 10664 - INTEGER(IntKi), PARAMETER :: M96N9MMze = 10665 - INTEGER(IntKi), PARAMETER :: M97N1MMze = 10666 - INTEGER(IntKi), PARAMETER :: M97N2MMze = 10667 - INTEGER(IntKi), PARAMETER :: M97N3MMze = 10668 - INTEGER(IntKi), PARAMETER :: M97N4MMze = 10669 - INTEGER(IntKi), PARAMETER :: M97N5MMze = 10670 - INTEGER(IntKi), PARAMETER :: M97N6MMze = 10671 - INTEGER(IntKi), PARAMETER :: M97N7MMze = 10672 - INTEGER(IntKi), PARAMETER :: M97N8MMze = 10673 - INTEGER(IntKi), PARAMETER :: M97N9MMze = 10674 - INTEGER(IntKi), PARAMETER :: M98N1MMze = 10675 - INTEGER(IntKi), PARAMETER :: M98N2MMze = 10676 - INTEGER(IntKi), PARAMETER :: M98N3MMze = 10677 - INTEGER(IntKi), PARAMETER :: M98N4MMze = 10678 - INTEGER(IntKi), PARAMETER :: M98N5MMze = 10679 - INTEGER(IntKi), PARAMETER :: M98N6MMze = 10680 - INTEGER(IntKi), PARAMETER :: M98N7MMze = 10681 - INTEGER(IntKi), PARAMETER :: M98N8MMze = 10682 - INTEGER(IntKi), PARAMETER :: M98N9MMze = 10683 - INTEGER(IntKi), PARAMETER :: M99N1MMze = 10684 - INTEGER(IntKi), PARAMETER :: M99N2MMze = 10685 - INTEGER(IntKi), PARAMETER :: M99N3MMze = 10686 - INTEGER(IntKi), PARAMETER :: M99N4MMze = 10687 - INTEGER(IntKi), PARAMETER :: M99N5MMze = 10688 - INTEGER(IntKi), PARAMETER :: M99N6MMze = 10689 - INTEGER(IntKi), PARAMETER :: M99N7MMze = 10690 - INTEGER(IntKi), PARAMETER :: M99N8MMze = 10691 - INTEGER(IntKi), PARAMETER :: M99N9MMze = 10692 + INTEGER(IntKi), PARAMETER :: M01N1TAxe = 16039 + INTEGER(IntKi), PARAMETER :: M01N2TAxe = 16040 + INTEGER(IntKi), PARAMETER :: M01N3TAxe = 16041 + INTEGER(IntKi), PARAMETER :: M01N4TAxe = 16042 + INTEGER(IntKi), PARAMETER :: M01N5TAxe = 16043 + INTEGER(IntKi), PARAMETER :: M01N6TAxe = 16044 + INTEGER(IntKi), PARAMETER :: M01N7TAxe = 16045 + INTEGER(IntKi), PARAMETER :: M01N8TAxe = 16046 + INTEGER(IntKi), PARAMETER :: M01N9TAxe = 16047 + INTEGER(IntKi), PARAMETER :: M02N1TAxe = 16048 + INTEGER(IntKi), PARAMETER :: M02N2TAxe = 16049 + INTEGER(IntKi), PARAMETER :: M02N3TAxe = 16050 + INTEGER(IntKi), PARAMETER :: M02N4TAxe = 16051 + INTEGER(IntKi), PARAMETER :: M02N5TAxe = 16052 + INTEGER(IntKi), PARAMETER :: M02N6TAxe = 16053 + INTEGER(IntKi), PARAMETER :: M02N7TAxe = 16054 + INTEGER(IntKi), PARAMETER :: M02N8TAxe = 16055 + INTEGER(IntKi), PARAMETER :: M02N9TAxe = 16056 + INTEGER(IntKi), PARAMETER :: M03N1TAxe = 16057 + INTEGER(IntKi), PARAMETER :: M03N2TAxe = 16058 + INTEGER(IntKi), PARAMETER :: M03N3TAxe = 16059 + INTEGER(IntKi), PARAMETER :: M03N4TAxe = 16060 + INTEGER(IntKi), PARAMETER :: M03N5TAxe = 16061 + INTEGER(IntKi), PARAMETER :: M03N6TAxe = 16062 + INTEGER(IntKi), PARAMETER :: M03N7TAxe = 16063 + INTEGER(IntKi), PARAMETER :: M03N8TAxe = 16064 + INTEGER(IntKi), PARAMETER :: M03N9TAxe = 16065 + INTEGER(IntKi), PARAMETER :: M04N1TAxe = 16066 + INTEGER(IntKi), PARAMETER :: M04N2TAxe = 16067 + INTEGER(IntKi), PARAMETER :: M04N3TAxe = 16068 + INTEGER(IntKi), PARAMETER :: M04N4TAxe = 16069 + INTEGER(IntKi), PARAMETER :: M04N5TAxe = 16070 + INTEGER(IntKi), PARAMETER :: M04N6TAxe = 16071 + INTEGER(IntKi), PARAMETER :: M04N7TAxe = 16072 + INTEGER(IntKi), PARAMETER :: M04N8TAxe = 16073 + INTEGER(IntKi), PARAMETER :: M04N9TAxe = 16074 + INTEGER(IntKi), PARAMETER :: M05N1TAxe = 16075 + INTEGER(IntKi), PARAMETER :: M05N2TAxe = 16076 + INTEGER(IntKi), PARAMETER :: M05N3TAxe = 16077 + INTEGER(IntKi), PARAMETER :: M05N4TAxe = 16078 + INTEGER(IntKi), PARAMETER :: M05N5TAxe = 16079 + INTEGER(IntKi), PARAMETER :: M05N6TAxe = 16080 + INTEGER(IntKi), PARAMETER :: M05N7TAxe = 16081 + INTEGER(IntKi), PARAMETER :: M05N8TAxe = 16082 + INTEGER(IntKi), PARAMETER :: M05N9TAxe = 16083 + INTEGER(IntKi), PARAMETER :: M06N1TAxe = 16084 + INTEGER(IntKi), PARAMETER :: M06N2TAxe = 16085 + INTEGER(IntKi), PARAMETER :: M06N3TAxe = 16086 + INTEGER(IntKi), PARAMETER :: M06N4TAxe = 16087 + INTEGER(IntKi), PARAMETER :: M06N5TAxe = 16088 + INTEGER(IntKi), PARAMETER :: M06N6TAxe = 16089 + INTEGER(IntKi), PARAMETER :: M06N7TAxe = 16090 + INTEGER(IntKi), PARAMETER :: M06N8TAxe = 16091 + INTEGER(IntKi), PARAMETER :: M06N9TAxe = 16092 + INTEGER(IntKi), PARAMETER :: M07N1TAxe = 16093 + INTEGER(IntKi), PARAMETER :: M07N2TAxe = 16094 + INTEGER(IntKi), PARAMETER :: M07N3TAxe = 16095 + INTEGER(IntKi), PARAMETER :: M07N4TAxe = 16096 + INTEGER(IntKi), PARAMETER :: M07N5TAxe = 16097 + INTEGER(IntKi), PARAMETER :: M07N6TAxe = 16098 + INTEGER(IntKi), PARAMETER :: M07N7TAxe = 16099 + INTEGER(IntKi), PARAMETER :: M07N8TAxe = 16100 + INTEGER(IntKi), PARAMETER :: M07N9TAxe = 16101 + INTEGER(IntKi), PARAMETER :: M08N1TAxe = 16102 + INTEGER(IntKi), PARAMETER :: M08N2TAxe = 16103 + INTEGER(IntKi), PARAMETER :: M08N3TAxe = 16104 + INTEGER(IntKi), PARAMETER :: M08N4TAxe = 16105 + INTEGER(IntKi), PARAMETER :: M08N5TAxe = 16106 + INTEGER(IntKi), PARAMETER :: M08N6TAxe = 16107 + INTEGER(IntKi), PARAMETER :: M08N7TAxe = 16108 + INTEGER(IntKi), PARAMETER :: M08N8TAxe = 16109 + INTEGER(IntKi), PARAMETER :: M08N9TAxe = 16110 + INTEGER(IntKi), PARAMETER :: M09N1TAxe = 16111 + INTEGER(IntKi), PARAMETER :: M09N2TAxe = 16112 + INTEGER(IntKi), PARAMETER :: M09N3TAxe = 16113 + INTEGER(IntKi), PARAMETER :: M09N4TAxe = 16114 + INTEGER(IntKi), PARAMETER :: M09N5TAxe = 16115 + INTEGER(IntKi), PARAMETER :: M09N6TAxe = 16116 + INTEGER(IntKi), PARAMETER :: M09N7TAxe = 16117 + INTEGER(IntKi), PARAMETER :: M09N8TAxe = 16118 + INTEGER(IntKi), PARAMETER :: M09N9TAxe = 16119 + INTEGER(IntKi), PARAMETER :: M10N1TAxe = 16120 + INTEGER(IntKi), PARAMETER :: M10N2TAxe = 16121 + INTEGER(IntKi), PARAMETER :: M10N3TAxe = 16122 + INTEGER(IntKi), PARAMETER :: M10N4TAxe = 16123 + INTEGER(IntKi), PARAMETER :: M10N5TAxe = 16124 + INTEGER(IntKi), PARAMETER :: M10N6TAxe = 16125 + INTEGER(IntKi), PARAMETER :: M10N7TAxe = 16126 + INTEGER(IntKi), PARAMETER :: M10N8TAxe = 16127 + INTEGER(IntKi), PARAMETER :: M10N9TAxe = 16128 + INTEGER(IntKi), PARAMETER :: M11N1TAxe = 16129 + INTEGER(IntKi), PARAMETER :: M11N2TAxe = 16130 + INTEGER(IntKi), PARAMETER :: M11N3TAxe = 16131 + INTEGER(IntKi), PARAMETER :: M11N4TAxe = 16132 + INTEGER(IntKi), PARAMETER :: M11N5TAxe = 16133 + INTEGER(IntKi), PARAMETER :: M11N6TAxe = 16134 + INTEGER(IntKi), PARAMETER :: M11N7TAxe = 16135 + INTEGER(IntKi), PARAMETER :: M11N8TAxe = 16136 + INTEGER(IntKi), PARAMETER :: M11N9TAxe = 16137 + INTEGER(IntKi), PARAMETER :: M12N1TAxe = 16138 + INTEGER(IntKi), PARAMETER :: M12N2TAxe = 16139 + INTEGER(IntKi), PARAMETER :: M12N3TAxe = 16140 + INTEGER(IntKi), PARAMETER :: M12N4TAxe = 16141 + INTEGER(IntKi), PARAMETER :: M12N5TAxe = 16142 + INTEGER(IntKi), PARAMETER :: M12N6TAxe = 16143 + INTEGER(IntKi), PARAMETER :: M12N7TAxe = 16144 + INTEGER(IntKi), PARAMETER :: M12N8TAxe = 16145 + INTEGER(IntKi), PARAMETER :: M12N9TAxe = 16146 + INTEGER(IntKi), PARAMETER :: M13N1TAxe = 16147 + INTEGER(IntKi), PARAMETER :: M13N2TAxe = 16148 + INTEGER(IntKi), PARAMETER :: M13N3TAxe = 16149 + INTEGER(IntKi), PARAMETER :: M13N4TAxe = 16150 + INTEGER(IntKi), PARAMETER :: M13N5TAxe = 16151 + INTEGER(IntKi), PARAMETER :: M13N6TAxe = 16152 + INTEGER(IntKi), PARAMETER :: M13N7TAxe = 16153 + INTEGER(IntKi), PARAMETER :: M13N8TAxe = 16154 + INTEGER(IntKi), PARAMETER :: M13N9TAxe = 16155 + INTEGER(IntKi), PARAMETER :: M14N1TAxe = 16156 + INTEGER(IntKi), PARAMETER :: M14N2TAxe = 16157 + INTEGER(IntKi), PARAMETER :: M14N3TAxe = 16158 + INTEGER(IntKi), PARAMETER :: M14N4TAxe = 16159 + INTEGER(IntKi), PARAMETER :: M14N5TAxe = 16160 + INTEGER(IntKi), PARAMETER :: M14N6TAxe = 16161 + INTEGER(IntKi), PARAMETER :: M14N7TAxe = 16162 + INTEGER(IntKi), PARAMETER :: M14N8TAxe = 16163 + INTEGER(IntKi), PARAMETER :: M14N9TAxe = 16164 + INTEGER(IntKi), PARAMETER :: M15N1TAxe = 16165 + INTEGER(IntKi), PARAMETER :: M15N2TAxe = 16166 + INTEGER(IntKi), PARAMETER :: M15N3TAxe = 16167 + INTEGER(IntKi), PARAMETER :: M15N4TAxe = 16168 + INTEGER(IntKi), PARAMETER :: M15N5TAxe = 16169 + INTEGER(IntKi), PARAMETER :: M15N6TAxe = 16170 + INTEGER(IntKi), PARAMETER :: M15N7TAxe = 16171 + INTEGER(IntKi), PARAMETER :: M15N8TAxe = 16172 + INTEGER(IntKi), PARAMETER :: M15N9TAxe = 16173 + INTEGER(IntKi), PARAMETER :: M16N1TAxe = 16174 + INTEGER(IntKi), PARAMETER :: M16N2TAxe = 16175 + INTEGER(IntKi), PARAMETER :: M16N3TAxe = 16176 + INTEGER(IntKi), PARAMETER :: M16N4TAxe = 16177 + INTEGER(IntKi), PARAMETER :: M16N5TAxe = 16178 + INTEGER(IntKi), PARAMETER :: M16N6TAxe = 16179 + INTEGER(IntKi), PARAMETER :: M16N7TAxe = 16180 + INTEGER(IntKi), PARAMETER :: M16N8TAxe = 16181 + INTEGER(IntKi), PARAMETER :: M16N9TAxe = 16182 + INTEGER(IntKi), PARAMETER :: M17N1TAxe = 16183 + INTEGER(IntKi), PARAMETER :: M17N2TAxe = 16184 + INTEGER(IntKi), PARAMETER :: M17N3TAxe = 16185 + INTEGER(IntKi), PARAMETER :: M17N4TAxe = 16186 + INTEGER(IntKi), PARAMETER :: M17N5TAxe = 16187 + INTEGER(IntKi), PARAMETER :: M17N6TAxe = 16188 + INTEGER(IntKi), PARAMETER :: M17N7TAxe = 16189 + INTEGER(IntKi), PARAMETER :: M17N8TAxe = 16190 + INTEGER(IntKi), PARAMETER :: M17N9TAxe = 16191 + INTEGER(IntKi), PARAMETER :: M18N1TAxe = 16192 + INTEGER(IntKi), PARAMETER :: M18N2TAxe = 16193 + INTEGER(IntKi), PARAMETER :: M18N3TAxe = 16194 + INTEGER(IntKi), PARAMETER :: M18N4TAxe = 16195 + INTEGER(IntKi), PARAMETER :: M18N5TAxe = 16196 + INTEGER(IntKi), PARAMETER :: M18N6TAxe = 16197 + INTEGER(IntKi), PARAMETER :: M18N7TAxe = 16198 + INTEGER(IntKi), PARAMETER :: M18N8TAxe = 16199 + INTEGER(IntKi), PARAMETER :: M18N9TAxe = 16200 + INTEGER(IntKi), PARAMETER :: M19N1TAxe = 16201 + INTEGER(IntKi), PARAMETER :: M19N2TAxe = 16202 + INTEGER(IntKi), PARAMETER :: M19N3TAxe = 16203 + INTEGER(IntKi), PARAMETER :: M19N4TAxe = 16204 + INTEGER(IntKi), PARAMETER :: M19N5TAxe = 16205 + INTEGER(IntKi), PARAMETER :: M19N6TAxe = 16206 + INTEGER(IntKi), PARAMETER :: M19N7TAxe = 16207 + INTEGER(IntKi), PARAMETER :: M19N8TAxe = 16208 + INTEGER(IntKi), PARAMETER :: M19N9TAxe = 16209 + INTEGER(IntKi), PARAMETER :: M20N1TAxe = 16210 + INTEGER(IntKi), PARAMETER :: M20N2TAxe = 16211 + INTEGER(IntKi), PARAMETER :: M20N3TAxe = 16212 + INTEGER(IntKi), PARAMETER :: M20N4TAxe = 16213 + INTEGER(IntKi), PARAMETER :: M20N5TAxe = 16214 + INTEGER(IntKi), PARAMETER :: M20N6TAxe = 16215 + INTEGER(IntKi), PARAMETER :: M20N7TAxe = 16216 + INTEGER(IntKi), PARAMETER :: M20N8TAxe = 16217 + INTEGER(IntKi), PARAMETER :: M20N9TAxe = 16218 + INTEGER(IntKi), PARAMETER :: M21N1TAxe = 16219 + INTEGER(IntKi), PARAMETER :: M21N2TAxe = 16220 + INTEGER(IntKi), PARAMETER :: M21N3TAxe = 16221 + INTEGER(IntKi), PARAMETER :: M21N4TAxe = 16222 + INTEGER(IntKi), PARAMETER :: M21N5TAxe = 16223 + INTEGER(IntKi), PARAMETER :: M21N6TAxe = 16224 + INTEGER(IntKi), PARAMETER :: M21N7TAxe = 16225 + INTEGER(IntKi), PARAMETER :: M21N8TAxe = 16226 + INTEGER(IntKi), PARAMETER :: M21N9TAxe = 16227 + INTEGER(IntKi), PARAMETER :: M22N1TAxe = 16228 + INTEGER(IntKi), PARAMETER :: M22N2TAxe = 16229 + INTEGER(IntKi), PARAMETER :: M22N3TAxe = 16230 + INTEGER(IntKi), PARAMETER :: M22N4TAxe = 16231 + INTEGER(IntKi), PARAMETER :: M22N5TAxe = 16232 + INTEGER(IntKi), PARAMETER :: M22N6TAxe = 16233 + INTEGER(IntKi), PARAMETER :: M22N7TAxe = 16234 + INTEGER(IntKi), PARAMETER :: M22N8TAxe = 16235 + INTEGER(IntKi), PARAMETER :: M22N9TAxe = 16236 + INTEGER(IntKi), PARAMETER :: M23N1TAxe = 16237 + INTEGER(IntKi), PARAMETER :: M23N2TAxe = 16238 + INTEGER(IntKi), PARAMETER :: M23N3TAxe = 16239 + INTEGER(IntKi), PARAMETER :: M23N4TAxe = 16240 + INTEGER(IntKi), PARAMETER :: M23N5TAxe = 16241 + INTEGER(IntKi), PARAMETER :: M23N6TAxe = 16242 + INTEGER(IntKi), PARAMETER :: M23N7TAxe = 16243 + INTEGER(IntKi), PARAMETER :: M23N8TAxe = 16244 + INTEGER(IntKi), PARAMETER :: M23N9TAxe = 16245 + INTEGER(IntKi), PARAMETER :: M24N1TAxe = 16246 + INTEGER(IntKi), PARAMETER :: M24N2TAxe = 16247 + INTEGER(IntKi), PARAMETER :: M24N3TAxe = 16248 + INTEGER(IntKi), PARAMETER :: M24N4TAxe = 16249 + INTEGER(IntKi), PARAMETER :: M24N5TAxe = 16250 + INTEGER(IntKi), PARAMETER :: M24N6TAxe = 16251 + INTEGER(IntKi), PARAMETER :: M24N7TAxe = 16252 + INTEGER(IntKi), PARAMETER :: M24N8TAxe = 16253 + INTEGER(IntKi), PARAMETER :: M24N9TAxe = 16254 + INTEGER(IntKi), PARAMETER :: M25N1TAxe = 16255 + INTEGER(IntKi), PARAMETER :: M25N2TAxe = 16256 + INTEGER(IntKi), PARAMETER :: M25N3TAxe = 16257 + INTEGER(IntKi), PARAMETER :: M25N4TAxe = 16258 + INTEGER(IntKi), PARAMETER :: M25N5TAxe = 16259 + INTEGER(IntKi), PARAMETER :: M25N6TAxe = 16260 + INTEGER(IntKi), PARAMETER :: M25N7TAxe = 16261 + INTEGER(IntKi), PARAMETER :: M25N8TAxe = 16262 + INTEGER(IntKi), PARAMETER :: M25N9TAxe = 16263 + INTEGER(IntKi), PARAMETER :: M26N1TAxe = 16264 + INTEGER(IntKi), PARAMETER :: M26N2TAxe = 16265 + INTEGER(IntKi), PARAMETER :: M26N3TAxe = 16266 + INTEGER(IntKi), PARAMETER :: M26N4TAxe = 16267 + INTEGER(IntKi), PARAMETER :: M26N5TAxe = 16268 + INTEGER(IntKi), PARAMETER :: M26N6TAxe = 16269 + INTEGER(IntKi), PARAMETER :: M26N7TAxe = 16270 + INTEGER(IntKi), PARAMETER :: M26N8TAxe = 16271 + INTEGER(IntKi), PARAMETER :: M26N9TAxe = 16272 + INTEGER(IntKi), PARAMETER :: M27N1TAxe = 16273 + INTEGER(IntKi), PARAMETER :: M27N2TAxe = 16274 + INTEGER(IntKi), PARAMETER :: M27N3TAxe = 16275 + INTEGER(IntKi), PARAMETER :: M27N4TAxe = 16276 + INTEGER(IntKi), PARAMETER :: M27N5TAxe = 16277 + INTEGER(IntKi), PARAMETER :: M27N6TAxe = 16278 + INTEGER(IntKi), PARAMETER :: M27N7TAxe = 16279 + INTEGER(IntKi), PARAMETER :: M27N8TAxe = 16280 + INTEGER(IntKi), PARAMETER :: M27N9TAxe = 16281 + INTEGER(IntKi), PARAMETER :: M28N1TAxe = 16282 + INTEGER(IntKi), PARAMETER :: M28N2TAxe = 16283 + INTEGER(IntKi), PARAMETER :: M28N3TAxe = 16284 + INTEGER(IntKi), PARAMETER :: M28N4TAxe = 16285 + INTEGER(IntKi), PARAMETER :: M28N5TAxe = 16286 + INTEGER(IntKi), PARAMETER :: M28N6TAxe = 16287 + INTEGER(IntKi), PARAMETER :: M28N7TAxe = 16288 + INTEGER(IntKi), PARAMETER :: M28N8TAxe = 16289 + INTEGER(IntKi), PARAMETER :: M28N9TAxe = 16290 + INTEGER(IntKi), PARAMETER :: M29N1TAxe = 16291 + INTEGER(IntKi), PARAMETER :: M29N2TAxe = 16292 + INTEGER(IntKi), PARAMETER :: M29N3TAxe = 16293 + INTEGER(IntKi), PARAMETER :: M29N4TAxe = 16294 + INTEGER(IntKi), PARAMETER :: M29N5TAxe = 16295 + INTEGER(IntKi), PARAMETER :: M29N6TAxe = 16296 + INTEGER(IntKi), PARAMETER :: M29N7TAxe = 16297 + INTEGER(IntKi), PARAMETER :: M29N8TAxe = 16298 + INTEGER(IntKi), PARAMETER :: M29N9TAxe = 16299 + INTEGER(IntKi), PARAMETER :: M30N1TAxe = 16300 + INTEGER(IntKi), PARAMETER :: M30N2TAxe = 16301 + INTEGER(IntKi), PARAMETER :: M30N3TAxe = 16302 + INTEGER(IntKi), PARAMETER :: M30N4TAxe = 16303 + INTEGER(IntKi), PARAMETER :: M30N5TAxe = 16304 + INTEGER(IntKi), PARAMETER :: M30N6TAxe = 16305 + INTEGER(IntKi), PARAMETER :: M30N7TAxe = 16306 + INTEGER(IntKi), PARAMETER :: M30N8TAxe = 16307 + INTEGER(IntKi), PARAMETER :: M30N9TAxe = 16308 + INTEGER(IntKi), PARAMETER :: M31N1TAxe = 16309 + INTEGER(IntKi), PARAMETER :: M31N2TAxe = 16310 + INTEGER(IntKi), PARAMETER :: M31N3TAxe = 16311 + INTEGER(IntKi), PARAMETER :: M31N4TAxe = 16312 + INTEGER(IntKi), PARAMETER :: M31N5TAxe = 16313 + INTEGER(IntKi), PARAMETER :: M31N6TAxe = 16314 + INTEGER(IntKi), PARAMETER :: M31N7TAxe = 16315 + INTEGER(IntKi), PARAMETER :: M31N8TAxe = 16316 + INTEGER(IntKi), PARAMETER :: M31N9TAxe = 16317 + INTEGER(IntKi), PARAMETER :: M32N1TAxe = 16318 + INTEGER(IntKi), PARAMETER :: M32N2TAxe = 16319 + INTEGER(IntKi), PARAMETER :: M32N3TAxe = 16320 + INTEGER(IntKi), PARAMETER :: M32N4TAxe = 16321 + INTEGER(IntKi), PARAMETER :: M32N5TAxe = 16322 + INTEGER(IntKi), PARAMETER :: M32N6TAxe = 16323 + INTEGER(IntKi), PARAMETER :: M32N7TAxe = 16324 + INTEGER(IntKi), PARAMETER :: M32N8TAxe = 16325 + INTEGER(IntKi), PARAMETER :: M32N9TAxe = 16326 + INTEGER(IntKi), PARAMETER :: M33N1TAxe = 16327 + INTEGER(IntKi), PARAMETER :: M33N2TAxe = 16328 + INTEGER(IntKi), PARAMETER :: M33N3TAxe = 16329 + INTEGER(IntKi), PARAMETER :: M33N4TAxe = 16330 + INTEGER(IntKi), PARAMETER :: M33N5TAxe = 16331 + INTEGER(IntKi), PARAMETER :: M33N6TAxe = 16332 + INTEGER(IntKi), PARAMETER :: M33N7TAxe = 16333 + INTEGER(IntKi), PARAMETER :: M33N8TAxe = 16334 + INTEGER(IntKi), PARAMETER :: M33N9TAxe = 16335 + INTEGER(IntKi), PARAMETER :: M34N1TAxe = 16336 + INTEGER(IntKi), PARAMETER :: M34N2TAxe = 16337 + INTEGER(IntKi), PARAMETER :: M34N3TAxe = 16338 + INTEGER(IntKi), PARAMETER :: M34N4TAxe = 16339 + INTEGER(IntKi), PARAMETER :: M34N5TAxe = 16340 + INTEGER(IntKi), PARAMETER :: M34N6TAxe = 16341 + INTEGER(IntKi), PARAMETER :: M34N7TAxe = 16342 + INTEGER(IntKi), PARAMETER :: M34N8TAxe = 16343 + INTEGER(IntKi), PARAMETER :: M34N9TAxe = 16344 + INTEGER(IntKi), PARAMETER :: M35N1TAxe = 16345 + INTEGER(IntKi), PARAMETER :: M35N2TAxe = 16346 + INTEGER(IntKi), PARAMETER :: M35N3TAxe = 16347 + INTEGER(IntKi), PARAMETER :: M35N4TAxe = 16348 + INTEGER(IntKi), PARAMETER :: M35N5TAxe = 16349 + INTEGER(IntKi), PARAMETER :: M35N6TAxe = 16350 + INTEGER(IntKi), PARAMETER :: M35N7TAxe = 16351 + INTEGER(IntKi), PARAMETER :: M35N8TAxe = 16352 + INTEGER(IntKi), PARAMETER :: M35N9TAxe = 16353 + INTEGER(IntKi), PARAMETER :: M36N1TAxe = 16354 + INTEGER(IntKi), PARAMETER :: M36N2TAxe = 16355 + INTEGER(IntKi), PARAMETER :: M36N3TAxe = 16356 + INTEGER(IntKi), PARAMETER :: M36N4TAxe = 16357 + INTEGER(IntKi), PARAMETER :: M36N5TAxe = 16358 + INTEGER(IntKi), PARAMETER :: M36N6TAxe = 16359 + INTEGER(IntKi), PARAMETER :: M36N7TAxe = 16360 + INTEGER(IntKi), PARAMETER :: M36N8TAxe = 16361 + INTEGER(IntKi), PARAMETER :: M36N9TAxe = 16362 + INTEGER(IntKi), PARAMETER :: M37N1TAxe = 16363 + INTEGER(IntKi), PARAMETER :: M37N2TAxe = 16364 + INTEGER(IntKi), PARAMETER :: M37N3TAxe = 16365 + INTEGER(IntKi), PARAMETER :: M37N4TAxe = 16366 + INTEGER(IntKi), PARAMETER :: M37N5TAxe = 16367 + INTEGER(IntKi), PARAMETER :: M37N6TAxe = 16368 + INTEGER(IntKi), PARAMETER :: M37N7TAxe = 16369 + INTEGER(IntKi), PARAMETER :: M37N8TAxe = 16370 + INTEGER(IntKi), PARAMETER :: M37N9TAxe = 16371 + INTEGER(IntKi), PARAMETER :: M38N1TAxe = 16372 + INTEGER(IntKi), PARAMETER :: M38N2TAxe = 16373 + INTEGER(IntKi), PARAMETER :: M38N3TAxe = 16374 + INTEGER(IntKi), PARAMETER :: M38N4TAxe = 16375 + INTEGER(IntKi), PARAMETER :: M38N5TAxe = 16376 + INTEGER(IntKi), PARAMETER :: M38N6TAxe = 16377 + INTEGER(IntKi), PARAMETER :: M38N7TAxe = 16378 + INTEGER(IntKi), PARAMETER :: M38N8TAxe = 16379 + INTEGER(IntKi), PARAMETER :: M38N9TAxe = 16380 + INTEGER(IntKi), PARAMETER :: M39N1TAxe = 16381 + INTEGER(IntKi), PARAMETER :: M39N2TAxe = 16382 + INTEGER(IntKi), PARAMETER :: M39N3TAxe = 16383 + INTEGER(IntKi), PARAMETER :: M39N4TAxe = 16384 + INTEGER(IntKi), PARAMETER :: M39N5TAxe = 16385 + INTEGER(IntKi), PARAMETER :: M39N6TAxe = 16386 + INTEGER(IntKi), PARAMETER :: M39N7TAxe = 16387 + INTEGER(IntKi), PARAMETER :: M39N8TAxe = 16388 + INTEGER(IntKi), PARAMETER :: M39N9TAxe = 16389 + INTEGER(IntKi), PARAMETER :: M40N1TAxe = 16390 + INTEGER(IntKi), PARAMETER :: M40N2TAxe = 16391 + INTEGER(IntKi), PARAMETER :: M40N3TAxe = 16392 + INTEGER(IntKi), PARAMETER :: M40N4TAxe = 16393 + INTEGER(IntKi), PARAMETER :: M40N5TAxe = 16394 + INTEGER(IntKi), PARAMETER :: M40N6TAxe = 16395 + INTEGER(IntKi), PARAMETER :: M40N7TAxe = 16396 + INTEGER(IntKi), PARAMETER :: M40N8TAxe = 16397 + INTEGER(IntKi), PARAMETER :: M40N9TAxe = 16398 + INTEGER(IntKi), PARAMETER :: M41N1TAxe = 16399 + INTEGER(IntKi), PARAMETER :: M41N2TAxe = 16400 + INTEGER(IntKi), PARAMETER :: M41N3TAxe = 16401 + INTEGER(IntKi), PARAMETER :: M41N4TAxe = 16402 + INTEGER(IntKi), PARAMETER :: M41N5TAxe = 16403 + INTEGER(IntKi), PARAMETER :: M41N6TAxe = 16404 + INTEGER(IntKi), PARAMETER :: M41N7TAxe = 16405 + INTEGER(IntKi), PARAMETER :: M41N8TAxe = 16406 + INTEGER(IntKi), PARAMETER :: M41N9TAxe = 16407 + INTEGER(IntKi), PARAMETER :: M42N1TAxe = 16408 + INTEGER(IntKi), PARAMETER :: M42N2TAxe = 16409 + INTEGER(IntKi), PARAMETER :: M42N3TAxe = 16410 + INTEGER(IntKi), PARAMETER :: M42N4TAxe = 16411 + INTEGER(IntKi), PARAMETER :: M42N5TAxe = 16412 + INTEGER(IntKi), PARAMETER :: M42N6TAxe = 16413 + INTEGER(IntKi), PARAMETER :: M42N7TAxe = 16414 + INTEGER(IntKi), PARAMETER :: M42N8TAxe = 16415 + INTEGER(IntKi), PARAMETER :: M42N9TAxe = 16416 + INTEGER(IntKi), PARAMETER :: M43N1TAxe = 16417 + INTEGER(IntKi), PARAMETER :: M43N2TAxe = 16418 + INTEGER(IntKi), PARAMETER :: M43N3TAxe = 16419 + INTEGER(IntKi), PARAMETER :: M43N4TAxe = 16420 + INTEGER(IntKi), PARAMETER :: M43N5TAxe = 16421 + INTEGER(IntKi), PARAMETER :: M43N6TAxe = 16422 + INTEGER(IntKi), PARAMETER :: M43N7TAxe = 16423 + INTEGER(IntKi), PARAMETER :: M43N8TAxe = 16424 + INTEGER(IntKi), PARAMETER :: M43N9TAxe = 16425 + INTEGER(IntKi), PARAMETER :: M44N1TAxe = 16426 + INTEGER(IntKi), PARAMETER :: M44N2TAxe = 16427 + INTEGER(IntKi), PARAMETER :: M44N3TAxe = 16428 + INTEGER(IntKi), PARAMETER :: M44N4TAxe = 16429 + INTEGER(IntKi), PARAMETER :: M44N5TAxe = 16430 + INTEGER(IntKi), PARAMETER :: M44N6TAxe = 16431 + INTEGER(IntKi), PARAMETER :: M44N7TAxe = 16432 + INTEGER(IntKi), PARAMETER :: M44N8TAxe = 16433 + INTEGER(IntKi), PARAMETER :: M44N9TAxe = 16434 + INTEGER(IntKi), PARAMETER :: M45N1TAxe = 16435 + INTEGER(IntKi), PARAMETER :: M45N2TAxe = 16436 + INTEGER(IntKi), PARAMETER :: M45N3TAxe = 16437 + INTEGER(IntKi), PARAMETER :: M45N4TAxe = 16438 + INTEGER(IntKi), PARAMETER :: M45N5TAxe = 16439 + INTEGER(IntKi), PARAMETER :: M45N6TAxe = 16440 + INTEGER(IntKi), PARAMETER :: M45N7TAxe = 16441 + INTEGER(IntKi), PARAMETER :: M45N8TAxe = 16442 + INTEGER(IntKi), PARAMETER :: M45N9TAxe = 16443 + INTEGER(IntKi), PARAMETER :: M46N1TAxe = 16444 + INTEGER(IntKi), PARAMETER :: M46N2TAxe = 16445 + INTEGER(IntKi), PARAMETER :: M46N3TAxe = 16446 + INTEGER(IntKi), PARAMETER :: M46N4TAxe = 16447 + INTEGER(IntKi), PARAMETER :: M46N5TAxe = 16448 + INTEGER(IntKi), PARAMETER :: M46N6TAxe = 16449 + INTEGER(IntKi), PARAMETER :: M46N7TAxe = 16450 + INTEGER(IntKi), PARAMETER :: M46N8TAxe = 16451 + INTEGER(IntKi), PARAMETER :: M46N9TAxe = 16452 + INTEGER(IntKi), PARAMETER :: M47N1TAxe = 16453 + INTEGER(IntKi), PARAMETER :: M47N2TAxe = 16454 + INTEGER(IntKi), PARAMETER :: M47N3TAxe = 16455 + INTEGER(IntKi), PARAMETER :: M47N4TAxe = 16456 + INTEGER(IntKi), PARAMETER :: M47N5TAxe = 16457 + INTEGER(IntKi), PARAMETER :: M47N6TAxe = 16458 + INTEGER(IntKi), PARAMETER :: M47N7TAxe = 16459 + INTEGER(IntKi), PARAMETER :: M47N8TAxe = 16460 + INTEGER(IntKi), PARAMETER :: M47N9TAxe = 16461 + INTEGER(IntKi), PARAMETER :: M48N1TAxe = 16462 + INTEGER(IntKi), PARAMETER :: M48N2TAxe = 16463 + INTEGER(IntKi), PARAMETER :: M48N3TAxe = 16464 + INTEGER(IntKi), PARAMETER :: M48N4TAxe = 16465 + INTEGER(IntKi), PARAMETER :: M48N5TAxe = 16466 + INTEGER(IntKi), PARAMETER :: M48N6TAxe = 16467 + INTEGER(IntKi), PARAMETER :: M48N7TAxe = 16468 + INTEGER(IntKi), PARAMETER :: M48N8TAxe = 16469 + INTEGER(IntKi), PARAMETER :: M48N9TAxe = 16470 + INTEGER(IntKi), PARAMETER :: M49N1TAxe = 16471 + INTEGER(IntKi), PARAMETER :: M49N2TAxe = 16472 + INTEGER(IntKi), PARAMETER :: M49N3TAxe = 16473 + INTEGER(IntKi), PARAMETER :: M49N4TAxe = 16474 + INTEGER(IntKi), PARAMETER :: M49N5TAxe = 16475 + INTEGER(IntKi), PARAMETER :: M49N6TAxe = 16476 + INTEGER(IntKi), PARAMETER :: M49N7TAxe = 16477 + INTEGER(IntKi), PARAMETER :: M49N8TAxe = 16478 + INTEGER(IntKi), PARAMETER :: M49N9TAxe = 16479 + INTEGER(IntKi), PARAMETER :: M50N1TAxe = 16480 + INTEGER(IntKi), PARAMETER :: M50N2TAxe = 16481 + INTEGER(IntKi), PARAMETER :: M50N3TAxe = 16482 + INTEGER(IntKi), PARAMETER :: M50N4TAxe = 16483 + INTEGER(IntKi), PARAMETER :: M50N5TAxe = 16484 + INTEGER(IntKi), PARAMETER :: M50N6TAxe = 16485 + INTEGER(IntKi), PARAMETER :: M50N7TAxe = 16486 + INTEGER(IntKi), PARAMETER :: M50N8TAxe = 16487 + INTEGER(IntKi), PARAMETER :: M50N9TAxe = 16488 + INTEGER(IntKi), PARAMETER :: M51N1TAxe = 16489 + INTEGER(IntKi), PARAMETER :: M51N2TAxe = 16490 + INTEGER(IntKi), PARAMETER :: M51N3TAxe = 16491 + INTEGER(IntKi), PARAMETER :: M51N4TAxe = 16492 + INTEGER(IntKi), PARAMETER :: M51N5TAxe = 16493 + INTEGER(IntKi), PARAMETER :: M51N6TAxe = 16494 + INTEGER(IntKi), PARAMETER :: M51N7TAxe = 16495 + INTEGER(IntKi), PARAMETER :: M51N8TAxe = 16496 + INTEGER(IntKi), PARAMETER :: M51N9TAxe = 16497 + INTEGER(IntKi), PARAMETER :: M52N1TAxe = 16498 + INTEGER(IntKi), PARAMETER :: M52N2TAxe = 16499 + INTEGER(IntKi), PARAMETER :: M52N3TAxe = 16500 + INTEGER(IntKi), PARAMETER :: M52N4TAxe = 16501 + INTEGER(IntKi), PARAMETER :: M52N5TAxe = 16502 + INTEGER(IntKi), PARAMETER :: M52N6TAxe = 16503 + INTEGER(IntKi), PARAMETER :: M52N7TAxe = 16504 + INTEGER(IntKi), PARAMETER :: M52N8TAxe = 16505 + INTEGER(IntKi), PARAMETER :: M52N9TAxe = 16506 + INTEGER(IntKi), PARAMETER :: M53N1TAxe = 16507 + INTEGER(IntKi), PARAMETER :: M53N2TAxe = 16508 + INTEGER(IntKi), PARAMETER :: M53N3TAxe = 16509 + INTEGER(IntKi), PARAMETER :: M53N4TAxe = 16510 + INTEGER(IntKi), PARAMETER :: M53N5TAxe = 16511 + INTEGER(IntKi), PARAMETER :: M53N6TAxe = 16512 + INTEGER(IntKi), PARAMETER :: M53N7TAxe = 16513 + INTEGER(IntKi), PARAMETER :: M53N8TAxe = 16514 + INTEGER(IntKi), PARAMETER :: M53N9TAxe = 16515 + INTEGER(IntKi), PARAMETER :: M54N1TAxe = 16516 + INTEGER(IntKi), PARAMETER :: M54N2TAxe = 16517 + INTEGER(IntKi), PARAMETER :: M54N3TAxe = 16518 + INTEGER(IntKi), PARAMETER :: M54N4TAxe = 16519 + INTEGER(IntKi), PARAMETER :: M54N5TAxe = 16520 + INTEGER(IntKi), PARAMETER :: M54N6TAxe = 16521 + INTEGER(IntKi), PARAMETER :: M54N7TAxe = 16522 + INTEGER(IntKi), PARAMETER :: M54N8TAxe = 16523 + INTEGER(IntKi), PARAMETER :: M54N9TAxe = 16524 + INTEGER(IntKi), PARAMETER :: M55N1TAxe = 16525 + INTEGER(IntKi), PARAMETER :: M55N2TAxe = 16526 + INTEGER(IntKi), PARAMETER :: M55N3TAxe = 16527 + INTEGER(IntKi), PARAMETER :: M55N4TAxe = 16528 + INTEGER(IntKi), PARAMETER :: M55N5TAxe = 16529 + INTEGER(IntKi), PARAMETER :: M55N6TAxe = 16530 + INTEGER(IntKi), PARAMETER :: M55N7TAxe = 16531 + INTEGER(IntKi), PARAMETER :: M55N8TAxe = 16532 + INTEGER(IntKi), PARAMETER :: M55N9TAxe = 16533 + INTEGER(IntKi), PARAMETER :: M56N1TAxe = 16534 + INTEGER(IntKi), PARAMETER :: M56N2TAxe = 16535 + INTEGER(IntKi), PARAMETER :: M56N3TAxe = 16536 + INTEGER(IntKi), PARAMETER :: M56N4TAxe = 16537 + INTEGER(IntKi), PARAMETER :: M56N5TAxe = 16538 + INTEGER(IntKi), PARAMETER :: M56N6TAxe = 16539 + INTEGER(IntKi), PARAMETER :: M56N7TAxe = 16540 + INTEGER(IntKi), PARAMETER :: M56N8TAxe = 16541 + INTEGER(IntKi), PARAMETER :: M56N9TAxe = 16542 + INTEGER(IntKi), PARAMETER :: M57N1TAxe = 16543 + INTEGER(IntKi), PARAMETER :: M57N2TAxe = 16544 + INTEGER(IntKi), PARAMETER :: M57N3TAxe = 16545 + INTEGER(IntKi), PARAMETER :: M57N4TAxe = 16546 + INTEGER(IntKi), PARAMETER :: M57N5TAxe = 16547 + INTEGER(IntKi), PARAMETER :: M57N6TAxe = 16548 + INTEGER(IntKi), PARAMETER :: M57N7TAxe = 16549 + INTEGER(IntKi), PARAMETER :: M57N8TAxe = 16550 + INTEGER(IntKi), PARAMETER :: M57N9TAxe = 16551 + INTEGER(IntKi), PARAMETER :: M58N1TAxe = 16552 + INTEGER(IntKi), PARAMETER :: M58N2TAxe = 16553 + INTEGER(IntKi), PARAMETER :: M58N3TAxe = 16554 + INTEGER(IntKi), PARAMETER :: M58N4TAxe = 16555 + INTEGER(IntKi), PARAMETER :: M58N5TAxe = 16556 + INTEGER(IntKi), PARAMETER :: M58N6TAxe = 16557 + INTEGER(IntKi), PARAMETER :: M58N7TAxe = 16558 + INTEGER(IntKi), PARAMETER :: M58N8TAxe = 16559 + INTEGER(IntKi), PARAMETER :: M58N9TAxe = 16560 + INTEGER(IntKi), PARAMETER :: M59N1TAxe = 16561 + INTEGER(IntKi), PARAMETER :: M59N2TAxe = 16562 + INTEGER(IntKi), PARAMETER :: M59N3TAxe = 16563 + INTEGER(IntKi), PARAMETER :: M59N4TAxe = 16564 + INTEGER(IntKi), PARAMETER :: M59N5TAxe = 16565 + INTEGER(IntKi), PARAMETER :: M59N6TAxe = 16566 + INTEGER(IntKi), PARAMETER :: M59N7TAxe = 16567 + INTEGER(IntKi), PARAMETER :: M59N8TAxe = 16568 + INTEGER(IntKi), PARAMETER :: M59N9TAxe = 16569 + INTEGER(IntKi), PARAMETER :: M60N1TAxe = 16570 + INTEGER(IntKi), PARAMETER :: M60N2TAxe = 16571 + INTEGER(IntKi), PARAMETER :: M60N3TAxe = 16572 + INTEGER(IntKi), PARAMETER :: M60N4TAxe = 16573 + INTEGER(IntKi), PARAMETER :: M60N5TAxe = 16574 + INTEGER(IntKi), PARAMETER :: M60N6TAxe = 16575 + INTEGER(IntKi), PARAMETER :: M60N7TAxe = 16576 + INTEGER(IntKi), PARAMETER :: M60N8TAxe = 16577 + INTEGER(IntKi), PARAMETER :: M60N9TAxe = 16578 + INTEGER(IntKi), PARAMETER :: M61N1TAxe = 16579 + INTEGER(IntKi), PARAMETER :: M61N2TAxe = 16580 + INTEGER(IntKi), PARAMETER :: M61N3TAxe = 16581 + INTEGER(IntKi), PARAMETER :: M61N4TAxe = 16582 + INTEGER(IntKi), PARAMETER :: M61N5TAxe = 16583 + INTEGER(IntKi), PARAMETER :: M61N6TAxe = 16584 + INTEGER(IntKi), PARAMETER :: M61N7TAxe = 16585 + INTEGER(IntKi), PARAMETER :: M61N8TAxe = 16586 + INTEGER(IntKi), PARAMETER :: M61N9TAxe = 16587 + INTEGER(IntKi), PARAMETER :: M62N1TAxe = 16588 + INTEGER(IntKi), PARAMETER :: M62N2TAxe = 16589 + INTEGER(IntKi), PARAMETER :: M62N3TAxe = 16590 + INTEGER(IntKi), PARAMETER :: M62N4TAxe = 16591 + INTEGER(IntKi), PARAMETER :: M62N5TAxe = 16592 + INTEGER(IntKi), PARAMETER :: M62N6TAxe = 16593 + INTEGER(IntKi), PARAMETER :: M62N7TAxe = 16594 + INTEGER(IntKi), PARAMETER :: M62N8TAxe = 16595 + INTEGER(IntKi), PARAMETER :: M62N9TAxe = 16596 + INTEGER(IntKi), PARAMETER :: M63N1TAxe = 16597 + INTEGER(IntKi), PARAMETER :: M63N2TAxe = 16598 + INTEGER(IntKi), PARAMETER :: M63N3TAxe = 16599 + INTEGER(IntKi), PARAMETER :: M63N4TAxe = 16600 + INTEGER(IntKi), PARAMETER :: M63N5TAxe = 16601 + INTEGER(IntKi), PARAMETER :: M63N6TAxe = 16602 + INTEGER(IntKi), PARAMETER :: M63N7TAxe = 16603 + INTEGER(IntKi), PARAMETER :: M63N8TAxe = 16604 + INTEGER(IntKi), PARAMETER :: M63N9TAxe = 16605 + INTEGER(IntKi), PARAMETER :: M64N1TAxe = 16606 + INTEGER(IntKi), PARAMETER :: M64N2TAxe = 16607 + INTEGER(IntKi), PARAMETER :: M64N3TAxe = 16608 + INTEGER(IntKi), PARAMETER :: M64N4TAxe = 16609 + INTEGER(IntKi), PARAMETER :: M64N5TAxe = 16610 + INTEGER(IntKi), PARAMETER :: M64N6TAxe = 16611 + INTEGER(IntKi), PARAMETER :: M64N7TAxe = 16612 + INTEGER(IntKi), PARAMETER :: M64N8TAxe = 16613 + INTEGER(IntKi), PARAMETER :: M64N9TAxe = 16614 + INTEGER(IntKi), PARAMETER :: M65N1TAxe = 16615 + INTEGER(IntKi), PARAMETER :: M65N2TAxe = 16616 + INTEGER(IntKi), PARAMETER :: M65N3TAxe = 16617 + INTEGER(IntKi), PARAMETER :: M65N4TAxe = 16618 + INTEGER(IntKi), PARAMETER :: M65N5TAxe = 16619 + INTEGER(IntKi), PARAMETER :: M65N6TAxe = 16620 + INTEGER(IntKi), PARAMETER :: M65N7TAxe = 16621 + INTEGER(IntKi), PARAMETER :: M65N8TAxe = 16622 + INTEGER(IntKi), PARAMETER :: M65N9TAxe = 16623 + INTEGER(IntKi), PARAMETER :: M66N1TAxe = 16624 + INTEGER(IntKi), PARAMETER :: M66N2TAxe = 16625 + INTEGER(IntKi), PARAMETER :: M66N3TAxe = 16626 + INTEGER(IntKi), PARAMETER :: M66N4TAxe = 16627 + INTEGER(IntKi), PARAMETER :: M66N5TAxe = 16628 + INTEGER(IntKi), PARAMETER :: M66N6TAxe = 16629 + INTEGER(IntKi), PARAMETER :: M66N7TAxe = 16630 + INTEGER(IntKi), PARAMETER :: M66N8TAxe = 16631 + INTEGER(IntKi), PARAMETER :: M66N9TAxe = 16632 + INTEGER(IntKi), PARAMETER :: M67N1TAxe = 16633 + INTEGER(IntKi), PARAMETER :: M67N2TAxe = 16634 + INTEGER(IntKi), PARAMETER :: M67N3TAxe = 16635 + INTEGER(IntKi), PARAMETER :: M67N4TAxe = 16636 + INTEGER(IntKi), PARAMETER :: M67N5TAxe = 16637 + INTEGER(IntKi), PARAMETER :: M67N6TAxe = 16638 + INTEGER(IntKi), PARAMETER :: M67N7TAxe = 16639 + INTEGER(IntKi), PARAMETER :: M67N8TAxe = 16640 + INTEGER(IntKi), PARAMETER :: M67N9TAxe = 16641 + INTEGER(IntKi), PARAMETER :: M68N1TAxe = 16642 + INTEGER(IntKi), PARAMETER :: M68N2TAxe = 16643 + INTEGER(IntKi), PARAMETER :: M68N3TAxe = 16644 + INTEGER(IntKi), PARAMETER :: M68N4TAxe = 16645 + INTEGER(IntKi), PARAMETER :: M68N5TAxe = 16646 + INTEGER(IntKi), PARAMETER :: M68N6TAxe = 16647 + INTEGER(IntKi), PARAMETER :: M68N7TAxe = 16648 + INTEGER(IntKi), PARAMETER :: M68N8TAxe = 16649 + INTEGER(IntKi), PARAMETER :: M68N9TAxe = 16650 + INTEGER(IntKi), PARAMETER :: M69N1TAxe = 16651 + INTEGER(IntKi), PARAMETER :: M69N2TAxe = 16652 + INTEGER(IntKi), PARAMETER :: M69N3TAxe = 16653 + INTEGER(IntKi), PARAMETER :: M69N4TAxe = 16654 + INTEGER(IntKi), PARAMETER :: M69N5TAxe = 16655 + INTEGER(IntKi), PARAMETER :: M69N6TAxe = 16656 + INTEGER(IntKi), PARAMETER :: M69N7TAxe = 16657 + INTEGER(IntKi), PARAMETER :: M69N8TAxe = 16658 + INTEGER(IntKi), PARAMETER :: M69N9TAxe = 16659 + INTEGER(IntKi), PARAMETER :: M70N1TAxe = 16660 + INTEGER(IntKi), PARAMETER :: M70N2TAxe = 16661 + INTEGER(IntKi), PARAMETER :: M70N3TAxe = 16662 + INTEGER(IntKi), PARAMETER :: M70N4TAxe = 16663 + INTEGER(IntKi), PARAMETER :: M70N5TAxe = 16664 + INTEGER(IntKi), PARAMETER :: M70N6TAxe = 16665 + INTEGER(IntKi), PARAMETER :: M70N7TAxe = 16666 + INTEGER(IntKi), PARAMETER :: M70N8TAxe = 16667 + INTEGER(IntKi), PARAMETER :: M70N9TAxe = 16668 + INTEGER(IntKi), PARAMETER :: M71N1TAxe = 16669 + INTEGER(IntKi), PARAMETER :: M71N2TAxe = 16670 + INTEGER(IntKi), PARAMETER :: M71N3TAxe = 16671 + INTEGER(IntKi), PARAMETER :: M71N4TAxe = 16672 + INTEGER(IntKi), PARAMETER :: M71N5TAxe = 16673 + INTEGER(IntKi), PARAMETER :: M71N6TAxe = 16674 + INTEGER(IntKi), PARAMETER :: M71N7TAxe = 16675 + INTEGER(IntKi), PARAMETER :: M71N8TAxe = 16676 + INTEGER(IntKi), PARAMETER :: M71N9TAxe = 16677 + INTEGER(IntKi), PARAMETER :: M72N1TAxe = 16678 + INTEGER(IntKi), PARAMETER :: M72N2TAxe = 16679 + INTEGER(IntKi), PARAMETER :: M72N3TAxe = 16680 + INTEGER(IntKi), PARAMETER :: M72N4TAxe = 16681 + INTEGER(IntKi), PARAMETER :: M72N5TAxe = 16682 + INTEGER(IntKi), PARAMETER :: M72N6TAxe = 16683 + INTEGER(IntKi), PARAMETER :: M72N7TAxe = 16684 + INTEGER(IntKi), PARAMETER :: M72N8TAxe = 16685 + INTEGER(IntKi), PARAMETER :: M72N9TAxe = 16686 + INTEGER(IntKi), PARAMETER :: M73N1TAxe = 16687 + INTEGER(IntKi), PARAMETER :: M73N2TAxe = 16688 + INTEGER(IntKi), PARAMETER :: M73N3TAxe = 16689 + INTEGER(IntKi), PARAMETER :: M73N4TAxe = 16690 + INTEGER(IntKi), PARAMETER :: M73N5TAxe = 16691 + INTEGER(IntKi), PARAMETER :: M73N6TAxe = 16692 + INTEGER(IntKi), PARAMETER :: M73N7TAxe = 16693 + INTEGER(IntKi), PARAMETER :: M73N8TAxe = 16694 + INTEGER(IntKi), PARAMETER :: M73N9TAxe = 16695 + INTEGER(IntKi), PARAMETER :: M74N1TAxe = 16696 + INTEGER(IntKi), PARAMETER :: M74N2TAxe = 16697 + INTEGER(IntKi), PARAMETER :: M74N3TAxe = 16698 + INTEGER(IntKi), PARAMETER :: M74N4TAxe = 16699 + INTEGER(IntKi), PARAMETER :: M74N5TAxe = 16700 + INTEGER(IntKi), PARAMETER :: M74N6TAxe = 16701 + INTEGER(IntKi), PARAMETER :: M74N7TAxe = 16702 + INTEGER(IntKi), PARAMETER :: M74N8TAxe = 16703 + INTEGER(IntKi), PARAMETER :: M74N9TAxe = 16704 + INTEGER(IntKi), PARAMETER :: M75N1TAxe = 16705 + INTEGER(IntKi), PARAMETER :: M75N2TAxe = 16706 + INTEGER(IntKi), PARAMETER :: M75N3TAxe = 16707 + INTEGER(IntKi), PARAMETER :: M75N4TAxe = 16708 + INTEGER(IntKi), PARAMETER :: M75N5TAxe = 16709 + INTEGER(IntKi), PARAMETER :: M75N6TAxe = 16710 + INTEGER(IntKi), PARAMETER :: M75N7TAxe = 16711 + INTEGER(IntKi), PARAMETER :: M75N8TAxe = 16712 + INTEGER(IntKi), PARAMETER :: M75N9TAxe = 16713 + INTEGER(IntKi), PARAMETER :: M76N1TAxe = 16714 + INTEGER(IntKi), PARAMETER :: M76N2TAxe = 16715 + INTEGER(IntKi), PARAMETER :: M76N3TAxe = 16716 + INTEGER(IntKi), PARAMETER :: M76N4TAxe = 16717 + INTEGER(IntKi), PARAMETER :: M76N5TAxe = 16718 + INTEGER(IntKi), PARAMETER :: M76N6TAxe = 16719 + INTEGER(IntKi), PARAMETER :: M76N7TAxe = 16720 + INTEGER(IntKi), PARAMETER :: M76N8TAxe = 16721 + INTEGER(IntKi), PARAMETER :: M76N9TAxe = 16722 + INTEGER(IntKi), PARAMETER :: M77N1TAxe = 16723 + INTEGER(IntKi), PARAMETER :: M77N2TAxe = 16724 + INTEGER(IntKi), PARAMETER :: M77N3TAxe = 16725 + INTEGER(IntKi), PARAMETER :: M77N4TAxe = 16726 + INTEGER(IntKi), PARAMETER :: M77N5TAxe = 16727 + INTEGER(IntKi), PARAMETER :: M77N6TAxe = 16728 + INTEGER(IntKi), PARAMETER :: M77N7TAxe = 16729 + INTEGER(IntKi), PARAMETER :: M77N8TAxe = 16730 + INTEGER(IntKi), PARAMETER :: M77N9TAxe = 16731 + INTEGER(IntKi), PARAMETER :: M78N1TAxe = 16732 + INTEGER(IntKi), PARAMETER :: M78N2TAxe = 16733 + INTEGER(IntKi), PARAMETER :: M78N3TAxe = 16734 + INTEGER(IntKi), PARAMETER :: M78N4TAxe = 16735 + INTEGER(IntKi), PARAMETER :: M78N5TAxe = 16736 + INTEGER(IntKi), PARAMETER :: M78N6TAxe = 16737 + INTEGER(IntKi), PARAMETER :: M78N7TAxe = 16738 + INTEGER(IntKi), PARAMETER :: M78N8TAxe = 16739 + INTEGER(IntKi), PARAMETER :: M78N9TAxe = 16740 + INTEGER(IntKi), PARAMETER :: M79N1TAxe = 16741 + INTEGER(IntKi), PARAMETER :: M79N2TAxe = 16742 + INTEGER(IntKi), PARAMETER :: M79N3TAxe = 16743 + INTEGER(IntKi), PARAMETER :: M79N4TAxe = 16744 + INTEGER(IntKi), PARAMETER :: M79N5TAxe = 16745 + INTEGER(IntKi), PARAMETER :: M79N6TAxe = 16746 + INTEGER(IntKi), PARAMETER :: M79N7TAxe = 16747 + INTEGER(IntKi), PARAMETER :: M79N8TAxe = 16748 + INTEGER(IntKi), PARAMETER :: M79N9TAxe = 16749 + INTEGER(IntKi), PARAMETER :: M80N1TAxe = 16750 + INTEGER(IntKi), PARAMETER :: M80N2TAxe = 16751 + INTEGER(IntKi), PARAMETER :: M80N3TAxe = 16752 + INTEGER(IntKi), PARAMETER :: M80N4TAxe = 16753 + INTEGER(IntKi), PARAMETER :: M80N5TAxe = 16754 + INTEGER(IntKi), PARAMETER :: M80N6TAxe = 16755 + INTEGER(IntKi), PARAMETER :: M80N7TAxe = 16756 + INTEGER(IntKi), PARAMETER :: M80N8TAxe = 16757 + INTEGER(IntKi), PARAMETER :: M80N9TAxe = 16758 + INTEGER(IntKi), PARAMETER :: M81N1TAxe = 16759 + INTEGER(IntKi), PARAMETER :: M81N2TAxe = 16760 + INTEGER(IntKi), PARAMETER :: M81N3TAxe = 16761 + INTEGER(IntKi), PARAMETER :: M81N4TAxe = 16762 + INTEGER(IntKi), PARAMETER :: M81N5TAxe = 16763 + INTEGER(IntKi), PARAMETER :: M81N6TAxe = 16764 + INTEGER(IntKi), PARAMETER :: M81N7TAxe = 16765 + INTEGER(IntKi), PARAMETER :: M81N8TAxe = 16766 + INTEGER(IntKi), PARAMETER :: M81N9TAxe = 16767 + INTEGER(IntKi), PARAMETER :: M82N1TAxe = 16768 + INTEGER(IntKi), PARAMETER :: M82N2TAxe = 16769 + INTEGER(IntKi), PARAMETER :: M82N3TAxe = 16770 + INTEGER(IntKi), PARAMETER :: M82N4TAxe = 16771 + INTEGER(IntKi), PARAMETER :: M82N5TAxe = 16772 + INTEGER(IntKi), PARAMETER :: M82N6TAxe = 16773 + INTEGER(IntKi), PARAMETER :: M82N7TAxe = 16774 + INTEGER(IntKi), PARAMETER :: M82N8TAxe = 16775 + INTEGER(IntKi), PARAMETER :: M82N9TAxe = 16776 + INTEGER(IntKi), PARAMETER :: M83N1TAxe = 16777 + INTEGER(IntKi), PARAMETER :: M83N2TAxe = 16778 + INTEGER(IntKi), PARAMETER :: M83N3TAxe = 16779 + INTEGER(IntKi), PARAMETER :: M83N4TAxe = 16780 + INTEGER(IntKi), PARAMETER :: M83N5TAxe = 16781 + INTEGER(IntKi), PARAMETER :: M83N6TAxe = 16782 + INTEGER(IntKi), PARAMETER :: M83N7TAxe = 16783 + INTEGER(IntKi), PARAMETER :: M83N8TAxe = 16784 + INTEGER(IntKi), PARAMETER :: M83N9TAxe = 16785 + INTEGER(IntKi), PARAMETER :: M84N1TAxe = 16786 + INTEGER(IntKi), PARAMETER :: M84N2TAxe = 16787 + INTEGER(IntKi), PARAMETER :: M84N3TAxe = 16788 + INTEGER(IntKi), PARAMETER :: M84N4TAxe = 16789 + INTEGER(IntKi), PARAMETER :: M84N5TAxe = 16790 + INTEGER(IntKi), PARAMETER :: M84N6TAxe = 16791 + INTEGER(IntKi), PARAMETER :: M84N7TAxe = 16792 + INTEGER(IntKi), PARAMETER :: M84N8TAxe = 16793 + INTEGER(IntKi), PARAMETER :: M84N9TAxe = 16794 + INTEGER(IntKi), PARAMETER :: M85N1TAxe = 16795 + INTEGER(IntKi), PARAMETER :: M85N2TAxe = 16796 + INTEGER(IntKi), PARAMETER :: M85N3TAxe = 16797 + INTEGER(IntKi), PARAMETER :: M85N4TAxe = 16798 + INTEGER(IntKi), PARAMETER :: M85N5TAxe = 16799 + INTEGER(IntKi), PARAMETER :: M85N6TAxe = 16800 + INTEGER(IntKi), PARAMETER :: M85N7TAxe = 16801 + INTEGER(IntKi), PARAMETER :: M85N8TAxe = 16802 + INTEGER(IntKi), PARAMETER :: M85N9TAxe = 16803 + INTEGER(IntKi), PARAMETER :: M86N1TAxe = 16804 + INTEGER(IntKi), PARAMETER :: M86N2TAxe = 16805 + INTEGER(IntKi), PARAMETER :: M86N3TAxe = 16806 + INTEGER(IntKi), PARAMETER :: M86N4TAxe = 16807 + INTEGER(IntKi), PARAMETER :: M86N5TAxe = 16808 + INTEGER(IntKi), PARAMETER :: M86N6TAxe = 16809 + INTEGER(IntKi), PARAMETER :: M86N7TAxe = 16810 + INTEGER(IntKi), PARAMETER :: M86N8TAxe = 16811 + INTEGER(IntKi), PARAMETER :: M86N9TAxe = 16812 + INTEGER(IntKi), PARAMETER :: M87N1TAxe = 16813 + INTEGER(IntKi), PARAMETER :: M87N2TAxe = 16814 + INTEGER(IntKi), PARAMETER :: M87N3TAxe = 16815 + INTEGER(IntKi), PARAMETER :: M87N4TAxe = 16816 + INTEGER(IntKi), PARAMETER :: M87N5TAxe = 16817 + INTEGER(IntKi), PARAMETER :: M87N6TAxe = 16818 + INTEGER(IntKi), PARAMETER :: M87N7TAxe = 16819 + INTEGER(IntKi), PARAMETER :: M87N8TAxe = 16820 + INTEGER(IntKi), PARAMETER :: M87N9TAxe = 16821 + INTEGER(IntKi), PARAMETER :: M88N1TAxe = 16822 + INTEGER(IntKi), PARAMETER :: M88N2TAxe = 16823 + INTEGER(IntKi), PARAMETER :: M88N3TAxe = 16824 + INTEGER(IntKi), PARAMETER :: M88N4TAxe = 16825 + INTEGER(IntKi), PARAMETER :: M88N5TAxe = 16826 + INTEGER(IntKi), PARAMETER :: M88N6TAxe = 16827 + INTEGER(IntKi), PARAMETER :: M88N7TAxe = 16828 + INTEGER(IntKi), PARAMETER :: M88N8TAxe = 16829 + INTEGER(IntKi), PARAMETER :: M88N9TAxe = 16830 + INTEGER(IntKi), PARAMETER :: M89N1TAxe = 16831 + INTEGER(IntKi), PARAMETER :: M89N2TAxe = 16832 + INTEGER(IntKi), PARAMETER :: M89N3TAxe = 16833 + INTEGER(IntKi), PARAMETER :: M89N4TAxe = 16834 + INTEGER(IntKi), PARAMETER :: M89N5TAxe = 16835 + INTEGER(IntKi), PARAMETER :: M89N6TAxe = 16836 + INTEGER(IntKi), PARAMETER :: M89N7TAxe = 16837 + INTEGER(IntKi), PARAMETER :: M89N8TAxe = 16838 + INTEGER(IntKi), PARAMETER :: M89N9TAxe = 16839 + INTEGER(IntKi), PARAMETER :: M90N1TAxe = 16840 + INTEGER(IntKi), PARAMETER :: M90N2TAxe = 16841 + INTEGER(IntKi), PARAMETER :: M90N3TAxe = 16842 + INTEGER(IntKi), PARAMETER :: M90N4TAxe = 16843 + INTEGER(IntKi), PARAMETER :: M90N5TAxe = 16844 + INTEGER(IntKi), PARAMETER :: M90N6TAxe = 16845 + INTEGER(IntKi), PARAMETER :: M90N7TAxe = 16846 + INTEGER(IntKi), PARAMETER :: M90N8TAxe = 16847 + INTEGER(IntKi), PARAMETER :: M90N9TAxe = 16848 + INTEGER(IntKi), PARAMETER :: M91N1TAxe = 16849 + INTEGER(IntKi), PARAMETER :: M91N2TAxe = 16850 + INTEGER(IntKi), PARAMETER :: M91N3TAxe = 16851 + INTEGER(IntKi), PARAMETER :: M91N4TAxe = 16852 + INTEGER(IntKi), PARAMETER :: M91N5TAxe = 16853 + INTEGER(IntKi), PARAMETER :: M91N6TAxe = 16854 + INTEGER(IntKi), PARAMETER :: M91N7TAxe = 16855 + INTEGER(IntKi), PARAMETER :: M91N8TAxe = 16856 + INTEGER(IntKi), PARAMETER :: M91N9TAxe = 16857 + INTEGER(IntKi), PARAMETER :: M92N1TAxe = 16858 + INTEGER(IntKi), PARAMETER :: M92N2TAxe = 16859 + INTEGER(IntKi), PARAMETER :: M92N3TAxe = 16860 + INTEGER(IntKi), PARAMETER :: M92N4TAxe = 16861 + INTEGER(IntKi), PARAMETER :: M92N5TAxe = 16862 + INTEGER(IntKi), PARAMETER :: M92N6TAxe = 16863 + INTEGER(IntKi), PARAMETER :: M92N7TAxe = 16864 + INTEGER(IntKi), PARAMETER :: M92N8TAxe = 16865 + INTEGER(IntKi), PARAMETER :: M92N9TAxe = 16866 + INTEGER(IntKi), PARAMETER :: M93N1TAxe = 16867 + INTEGER(IntKi), PARAMETER :: M93N2TAxe = 16868 + INTEGER(IntKi), PARAMETER :: M93N3TAxe = 16869 + INTEGER(IntKi), PARAMETER :: M93N4TAxe = 16870 + INTEGER(IntKi), PARAMETER :: M93N5TAxe = 16871 + INTEGER(IntKi), PARAMETER :: M93N6TAxe = 16872 + INTEGER(IntKi), PARAMETER :: M93N7TAxe = 16873 + INTEGER(IntKi), PARAMETER :: M93N8TAxe = 16874 + INTEGER(IntKi), PARAMETER :: M93N9TAxe = 16875 + INTEGER(IntKi), PARAMETER :: M94N1TAxe = 16876 + INTEGER(IntKi), PARAMETER :: M94N2TAxe = 16877 + INTEGER(IntKi), PARAMETER :: M94N3TAxe = 16878 + INTEGER(IntKi), PARAMETER :: M94N4TAxe = 16879 + INTEGER(IntKi), PARAMETER :: M94N5TAxe = 16880 + INTEGER(IntKi), PARAMETER :: M94N6TAxe = 16881 + INTEGER(IntKi), PARAMETER :: M94N7TAxe = 16882 + INTEGER(IntKi), PARAMETER :: M94N8TAxe = 16883 + INTEGER(IntKi), PARAMETER :: M94N9TAxe = 16884 + INTEGER(IntKi), PARAMETER :: M95N1TAxe = 16885 + INTEGER(IntKi), PARAMETER :: M95N2TAxe = 16886 + INTEGER(IntKi), PARAMETER :: M95N3TAxe = 16887 + INTEGER(IntKi), PARAMETER :: M95N4TAxe = 16888 + INTEGER(IntKi), PARAMETER :: M95N5TAxe = 16889 + INTEGER(IntKi), PARAMETER :: M95N6TAxe = 16890 + INTEGER(IntKi), PARAMETER :: M95N7TAxe = 16891 + INTEGER(IntKi), PARAMETER :: M95N8TAxe = 16892 + INTEGER(IntKi), PARAMETER :: M95N9TAxe = 16893 + INTEGER(IntKi), PARAMETER :: M96N1TAxe = 16894 + INTEGER(IntKi), PARAMETER :: M96N2TAxe = 16895 + INTEGER(IntKi), PARAMETER :: M96N3TAxe = 16896 + INTEGER(IntKi), PARAMETER :: M96N4TAxe = 16897 + INTEGER(IntKi), PARAMETER :: M96N5TAxe = 16898 + INTEGER(IntKi), PARAMETER :: M96N6TAxe = 16899 + INTEGER(IntKi), PARAMETER :: M96N7TAxe = 16900 + INTEGER(IntKi), PARAMETER :: M96N8TAxe = 16901 + INTEGER(IntKi), PARAMETER :: M96N9TAxe = 16902 + INTEGER(IntKi), PARAMETER :: M97N1TAxe = 16903 + INTEGER(IntKi), PARAMETER :: M97N2TAxe = 16904 + INTEGER(IntKi), PARAMETER :: M97N3TAxe = 16905 + INTEGER(IntKi), PARAMETER :: M97N4TAxe = 16906 + INTEGER(IntKi), PARAMETER :: M97N5TAxe = 16907 + INTEGER(IntKi), PARAMETER :: M97N6TAxe = 16908 + INTEGER(IntKi), PARAMETER :: M97N7TAxe = 16909 + INTEGER(IntKi), PARAMETER :: M97N8TAxe = 16910 + INTEGER(IntKi), PARAMETER :: M97N9TAxe = 16911 + INTEGER(IntKi), PARAMETER :: M98N1TAxe = 16912 + INTEGER(IntKi), PARAMETER :: M98N2TAxe = 16913 + INTEGER(IntKi), PARAMETER :: M98N3TAxe = 16914 + INTEGER(IntKi), PARAMETER :: M98N4TAxe = 16915 + INTEGER(IntKi), PARAMETER :: M98N5TAxe = 16916 + INTEGER(IntKi), PARAMETER :: M98N6TAxe = 16917 + INTEGER(IntKi), PARAMETER :: M98N7TAxe = 16918 + INTEGER(IntKi), PARAMETER :: M98N8TAxe = 16919 + INTEGER(IntKi), PARAMETER :: M98N9TAxe = 16920 + INTEGER(IntKi), PARAMETER :: M99N1TAxe = 16921 + INTEGER(IntKi), PARAMETER :: M99N2TAxe = 16922 + INTEGER(IntKi), PARAMETER :: M99N3TAxe = 16923 + INTEGER(IntKi), PARAMETER :: M99N4TAxe = 16924 + INTEGER(IntKi), PARAMETER :: M99N5TAxe = 16925 + INTEGER(IntKi), PARAMETER :: M99N6TAxe = 16926 + INTEGER(IntKi), PARAMETER :: M99N7TAxe = 16927 + INTEGER(IntKi), PARAMETER :: M99N8TAxe = 16928 + INTEGER(IntKi), PARAMETER :: M99N9TAxe = 16929 + INTEGER(IntKi), PARAMETER :: M01N1TAye = 16930 + INTEGER(IntKi), PARAMETER :: M01N2TAye = 16931 + INTEGER(IntKi), PARAMETER :: M01N3TAye = 16932 + INTEGER(IntKi), PARAMETER :: M01N4TAye = 16933 + INTEGER(IntKi), PARAMETER :: M01N5TAye = 16934 + INTEGER(IntKi), PARAMETER :: M01N6TAye = 16935 + INTEGER(IntKi), PARAMETER :: M01N7TAye = 16936 + INTEGER(IntKi), PARAMETER :: M01N8TAye = 16937 + INTEGER(IntKi), PARAMETER :: M01N9TAye = 16938 + INTEGER(IntKi), PARAMETER :: M02N1TAye = 16939 + INTEGER(IntKi), PARAMETER :: M02N2TAye = 16940 + INTEGER(IntKi), PARAMETER :: M02N3TAye = 16941 + INTEGER(IntKi), PARAMETER :: M02N4TAye = 16942 + INTEGER(IntKi), PARAMETER :: M02N5TAye = 16943 + INTEGER(IntKi), PARAMETER :: M02N6TAye = 16944 + INTEGER(IntKi), PARAMETER :: M02N7TAye = 16945 + INTEGER(IntKi), PARAMETER :: M02N8TAye = 16946 + INTEGER(IntKi), PARAMETER :: M02N9TAye = 16947 + INTEGER(IntKi), PARAMETER :: M03N1TAye = 16948 + INTEGER(IntKi), PARAMETER :: M03N2TAye = 16949 + INTEGER(IntKi), PARAMETER :: M03N3TAye = 16950 + INTEGER(IntKi), PARAMETER :: M03N4TAye = 16951 + INTEGER(IntKi), PARAMETER :: M03N5TAye = 16952 + INTEGER(IntKi), PARAMETER :: M03N6TAye = 16953 + INTEGER(IntKi), PARAMETER :: M03N7TAye = 16954 + INTEGER(IntKi), PARAMETER :: M03N8TAye = 16955 + INTEGER(IntKi), PARAMETER :: M03N9TAye = 16956 + INTEGER(IntKi), PARAMETER :: M04N1TAye = 16957 + INTEGER(IntKi), PARAMETER :: M04N2TAye = 16958 + INTEGER(IntKi), PARAMETER :: M04N3TAye = 16959 + INTEGER(IntKi), PARAMETER :: M04N4TAye = 16960 + INTEGER(IntKi), PARAMETER :: M04N5TAye = 16961 + INTEGER(IntKi), PARAMETER :: M04N6TAye = 16962 + INTEGER(IntKi), PARAMETER :: M04N7TAye = 16963 + INTEGER(IntKi), PARAMETER :: M04N8TAye = 16964 + INTEGER(IntKi), PARAMETER :: M04N9TAye = 16965 + INTEGER(IntKi), PARAMETER :: M05N1TAye = 16966 + INTEGER(IntKi), PARAMETER :: M05N2TAye = 16967 + INTEGER(IntKi), PARAMETER :: M05N3TAye = 16968 + INTEGER(IntKi), PARAMETER :: M05N4TAye = 16969 + INTEGER(IntKi), PARAMETER :: M05N5TAye = 16970 + INTEGER(IntKi), PARAMETER :: M05N6TAye = 16971 + INTEGER(IntKi), PARAMETER :: M05N7TAye = 16972 + INTEGER(IntKi), PARAMETER :: M05N8TAye = 16973 + INTEGER(IntKi), PARAMETER :: M05N9TAye = 16974 + INTEGER(IntKi), PARAMETER :: M06N1TAye = 16975 + INTEGER(IntKi), PARAMETER :: M06N2TAye = 16976 + INTEGER(IntKi), PARAMETER :: M06N3TAye = 16977 + INTEGER(IntKi), PARAMETER :: M06N4TAye = 16978 + INTEGER(IntKi), PARAMETER :: M06N5TAye = 16979 + INTEGER(IntKi), PARAMETER :: M06N6TAye = 16980 + INTEGER(IntKi), PARAMETER :: M06N7TAye = 16981 + INTEGER(IntKi), PARAMETER :: M06N8TAye = 16982 + INTEGER(IntKi), PARAMETER :: M06N9TAye = 16983 + INTEGER(IntKi), PARAMETER :: M07N1TAye = 16984 + INTEGER(IntKi), PARAMETER :: M07N2TAye = 16985 + INTEGER(IntKi), PARAMETER :: M07N3TAye = 16986 + INTEGER(IntKi), PARAMETER :: M07N4TAye = 16987 + INTEGER(IntKi), PARAMETER :: M07N5TAye = 16988 + INTEGER(IntKi), PARAMETER :: M07N6TAye = 16989 + INTEGER(IntKi), PARAMETER :: M07N7TAye = 16990 + INTEGER(IntKi), PARAMETER :: M07N8TAye = 16991 + INTEGER(IntKi), PARAMETER :: M07N9TAye = 16992 + INTEGER(IntKi), PARAMETER :: M08N1TAye = 16993 + INTEGER(IntKi), PARAMETER :: M08N2TAye = 16994 + INTEGER(IntKi), PARAMETER :: M08N3TAye = 16995 + INTEGER(IntKi), PARAMETER :: M08N4TAye = 16996 + INTEGER(IntKi), PARAMETER :: M08N5TAye = 16997 + INTEGER(IntKi), PARAMETER :: M08N6TAye = 16998 + INTEGER(IntKi), PARAMETER :: M08N7TAye = 16999 + INTEGER(IntKi), PARAMETER :: M08N8TAye = 17000 + INTEGER(IntKi), PARAMETER :: M08N9TAye = 17001 + INTEGER(IntKi), PARAMETER :: M09N1TAye = 17002 + INTEGER(IntKi), PARAMETER :: M09N2TAye = 17003 + INTEGER(IntKi), PARAMETER :: M09N3TAye = 17004 + INTEGER(IntKi), PARAMETER :: M09N4TAye = 17005 + INTEGER(IntKi), PARAMETER :: M09N5TAye = 17006 + INTEGER(IntKi), PARAMETER :: M09N6TAye = 17007 + INTEGER(IntKi), PARAMETER :: M09N7TAye = 17008 + INTEGER(IntKi), PARAMETER :: M09N8TAye = 17009 + INTEGER(IntKi), PARAMETER :: M09N9TAye = 17010 + INTEGER(IntKi), PARAMETER :: M10N1TAye = 17011 + INTEGER(IntKi), PARAMETER :: M10N2TAye = 17012 + INTEGER(IntKi), PARAMETER :: M10N3TAye = 17013 + INTEGER(IntKi), PARAMETER :: M10N4TAye = 17014 + INTEGER(IntKi), PARAMETER :: M10N5TAye = 17015 + INTEGER(IntKi), PARAMETER :: M10N6TAye = 17016 + INTEGER(IntKi), PARAMETER :: M10N7TAye = 17017 + INTEGER(IntKi), PARAMETER :: M10N8TAye = 17018 + INTEGER(IntKi), PARAMETER :: M10N9TAye = 17019 + INTEGER(IntKi), PARAMETER :: M11N1TAye = 17020 + INTEGER(IntKi), PARAMETER :: M11N2TAye = 17021 + INTEGER(IntKi), PARAMETER :: M11N3TAye = 17022 + INTEGER(IntKi), PARAMETER :: M11N4TAye = 17023 + INTEGER(IntKi), PARAMETER :: M11N5TAye = 17024 + INTEGER(IntKi), PARAMETER :: M11N6TAye = 17025 + INTEGER(IntKi), PARAMETER :: M11N7TAye = 17026 + INTEGER(IntKi), PARAMETER :: M11N8TAye = 17027 + INTEGER(IntKi), PARAMETER :: M11N9TAye = 17028 + INTEGER(IntKi), PARAMETER :: M12N1TAye = 17029 + INTEGER(IntKi), PARAMETER :: M12N2TAye = 17030 + INTEGER(IntKi), PARAMETER :: M12N3TAye = 17031 + INTEGER(IntKi), PARAMETER :: M12N4TAye = 17032 + INTEGER(IntKi), PARAMETER :: M12N5TAye = 17033 + INTEGER(IntKi), PARAMETER :: M12N6TAye = 17034 + INTEGER(IntKi), PARAMETER :: M12N7TAye = 17035 + INTEGER(IntKi), PARAMETER :: M12N8TAye = 17036 + INTEGER(IntKi), PARAMETER :: M12N9TAye = 17037 + INTEGER(IntKi), PARAMETER :: M13N1TAye = 17038 + INTEGER(IntKi), PARAMETER :: M13N2TAye = 17039 + INTEGER(IntKi), PARAMETER :: M13N3TAye = 17040 + INTEGER(IntKi), PARAMETER :: M13N4TAye = 17041 + INTEGER(IntKi), PARAMETER :: M13N5TAye = 17042 + INTEGER(IntKi), PARAMETER :: M13N6TAye = 17043 + INTEGER(IntKi), PARAMETER :: M13N7TAye = 17044 + INTEGER(IntKi), PARAMETER :: M13N8TAye = 17045 + INTEGER(IntKi), PARAMETER :: M13N9TAye = 17046 + INTEGER(IntKi), PARAMETER :: M14N1TAye = 17047 + INTEGER(IntKi), PARAMETER :: M14N2TAye = 17048 + INTEGER(IntKi), PARAMETER :: M14N3TAye = 17049 + INTEGER(IntKi), PARAMETER :: M14N4TAye = 17050 + INTEGER(IntKi), PARAMETER :: M14N5TAye = 17051 + INTEGER(IntKi), PARAMETER :: M14N6TAye = 17052 + INTEGER(IntKi), PARAMETER :: M14N7TAye = 17053 + INTEGER(IntKi), PARAMETER :: M14N8TAye = 17054 + INTEGER(IntKi), PARAMETER :: M14N9TAye = 17055 + INTEGER(IntKi), PARAMETER :: M15N1TAye = 17056 + INTEGER(IntKi), PARAMETER :: M15N2TAye = 17057 + INTEGER(IntKi), PARAMETER :: M15N3TAye = 17058 + INTEGER(IntKi), PARAMETER :: M15N4TAye = 17059 + INTEGER(IntKi), PARAMETER :: M15N5TAye = 17060 + INTEGER(IntKi), PARAMETER :: M15N6TAye = 17061 + INTEGER(IntKi), PARAMETER :: M15N7TAye = 17062 + INTEGER(IntKi), PARAMETER :: M15N8TAye = 17063 + INTEGER(IntKi), PARAMETER :: M15N9TAye = 17064 + INTEGER(IntKi), PARAMETER :: M16N1TAye = 17065 + INTEGER(IntKi), PARAMETER :: M16N2TAye = 17066 + INTEGER(IntKi), PARAMETER :: M16N3TAye = 17067 + INTEGER(IntKi), PARAMETER :: M16N4TAye = 17068 + INTEGER(IntKi), PARAMETER :: M16N5TAye = 17069 + INTEGER(IntKi), PARAMETER :: M16N6TAye = 17070 + INTEGER(IntKi), PARAMETER :: M16N7TAye = 17071 + INTEGER(IntKi), PARAMETER :: M16N8TAye = 17072 + INTEGER(IntKi), PARAMETER :: M16N9TAye = 17073 + INTEGER(IntKi), PARAMETER :: M17N1TAye = 17074 + INTEGER(IntKi), PARAMETER :: M17N2TAye = 17075 + INTEGER(IntKi), PARAMETER :: M17N3TAye = 17076 + INTEGER(IntKi), PARAMETER :: M17N4TAye = 17077 + INTEGER(IntKi), PARAMETER :: M17N5TAye = 17078 + INTEGER(IntKi), PARAMETER :: M17N6TAye = 17079 + INTEGER(IntKi), PARAMETER :: M17N7TAye = 17080 + INTEGER(IntKi), PARAMETER :: M17N8TAye = 17081 + INTEGER(IntKi), PARAMETER :: M17N9TAye = 17082 + INTEGER(IntKi), PARAMETER :: M18N1TAye = 17083 + INTEGER(IntKi), PARAMETER :: M18N2TAye = 17084 + INTEGER(IntKi), PARAMETER :: M18N3TAye = 17085 + INTEGER(IntKi), PARAMETER :: M18N4TAye = 17086 + INTEGER(IntKi), PARAMETER :: M18N5TAye = 17087 + INTEGER(IntKi), PARAMETER :: M18N6TAye = 17088 + INTEGER(IntKi), PARAMETER :: M18N7TAye = 17089 + INTEGER(IntKi), PARAMETER :: M18N8TAye = 17090 + INTEGER(IntKi), PARAMETER :: M18N9TAye = 17091 + INTEGER(IntKi), PARAMETER :: M19N1TAye = 17092 + INTEGER(IntKi), PARAMETER :: M19N2TAye = 17093 + INTEGER(IntKi), PARAMETER :: M19N3TAye = 17094 + INTEGER(IntKi), PARAMETER :: M19N4TAye = 17095 + INTEGER(IntKi), PARAMETER :: M19N5TAye = 17096 + INTEGER(IntKi), PARAMETER :: M19N6TAye = 17097 + INTEGER(IntKi), PARAMETER :: M19N7TAye = 17098 + INTEGER(IntKi), PARAMETER :: M19N8TAye = 17099 + INTEGER(IntKi), PARAMETER :: M19N9TAye = 17100 + INTEGER(IntKi), PARAMETER :: M20N1TAye = 17101 + INTEGER(IntKi), PARAMETER :: M20N2TAye = 17102 + INTEGER(IntKi), PARAMETER :: M20N3TAye = 17103 + INTEGER(IntKi), PARAMETER :: M20N4TAye = 17104 + INTEGER(IntKi), PARAMETER :: M20N5TAye = 17105 + INTEGER(IntKi), PARAMETER :: M20N6TAye = 17106 + INTEGER(IntKi), PARAMETER :: M20N7TAye = 17107 + INTEGER(IntKi), PARAMETER :: M20N8TAye = 17108 + INTEGER(IntKi), PARAMETER :: M20N9TAye = 17109 + INTEGER(IntKi), PARAMETER :: M21N1TAye = 17110 + INTEGER(IntKi), PARAMETER :: M21N2TAye = 17111 + INTEGER(IntKi), PARAMETER :: M21N3TAye = 17112 + INTEGER(IntKi), PARAMETER :: M21N4TAye = 17113 + INTEGER(IntKi), PARAMETER :: M21N5TAye = 17114 + INTEGER(IntKi), PARAMETER :: M21N6TAye = 17115 + INTEGER(IntKi), PARAMETER :: M21N7TAye = 17116 + INTEGER(IntKi), PARAMETER :: M21N8TAye = 17117 + INTEGER(IntKi), PARAMETER :: M21N9TAye = 17118 + INTEGER(IntKi), PARAMETER :: M22N1TAye = 17119 + INTEGER(IntKi), PARAMETER :: M22N2TAye = 17120 + INTEGER(IntKi), PARAMETER :: M22N3TAye = 17121 + INTEGER(IntKi), PARAMETER :: M22N4TAye = 17122 + INTEGER(IntKi), PARAMETER :: M22N5TAye = 17123 + INTEGER(IntKi), PARAMETER :: M22N6TAye = 17124 + INTEGER(IntKi), PARAMETER :: M22N7TAye = 17125 + INTEGER(IntKi), PARAMETER :: M22N8TAye = 17126 + INTEGER(IntKi), PARAMETER :: M22N9TAye = 17127 + INTEGER(IntKi), PARAMETER :: M23N1TAye = 17128 + INTEGER(IntKi), PARAMETER :: M23N2TAye = 17129 + INTEGER(IntKi), PARAMETER :: M23N3TAye = 17130 + INTEGER(IntKi), PARAMETER :: M23N4TAye = 17131 + INTEGER(IntKi), PARAMETER :: M23N5TAye = 17132 + INTEGER(IntKi), PARAMETER :: M23N6TAye = 17133 + INTEGER(IntKi), PARAMETER :: M23N7TAye = 17134 + INTEGER(IntKi), PARAMETER :: M23N8TAye = 17135 + INTEGER(IntKi), PARAMETER :: M23N9TAye = 17136 + INTEGER(IntKi), PARAMETER :: M24N1TAye = 17137 + INTEGER(IntKi), PARAMETER :: M24N2TAye = 17138 + INTEGER(IntKi), PARAMETER :: M24N3TAye = 17139 + INTEGER(IntKi), PARAMETER :: M24N4TAye = 17140 + INTEGER(IntKi), PARAMETER :: M24N5TAye = 17141 + INTEGER(IntKi), PARAMETER :: M24N6TAye = 17142 + INTEGER(IntKi), PARAMETER :: M24N7TAye = 17143 + INTEGER(IntKi), PARAMETER :: M24N8TAye = 17144 + INTEGER(IntKi), PARAMETER :: M24N9TAye = 17145 + INTEGER(IntKi), PARAMETER :: M25N1TAye = 17146 + INTEGER(IntKi), PARAMETER :: M25N2TAye = 17147 + INTEGER(IntKi), PARAMETER :: M25N3TAye = 17148 + INTEGER(IntKi), PARAMETER :: M25N4TAye = 17149 + INTEGER(IntKi), PARAMETER :: M25N5TAye = 17150 + INTEGER(IntKi), PARAMETER :: M25N6TAye = 17151 + INTEGER(IntKi), PARAMETER :: M25N7TAye = 17152 + INTEGER(IntKi), PARAMETER :: M25N8TAye = 17153 + INTEGER(IntKi), PARAMETER :: M25N9TAye = 17154 + INTEGER(IntKi), PARAMETER :: M26N1TAye = 17155 + INTEGER(IntKi), PARAMETER :: M26N2TAye = 17156 + INTEGER(IntKi), PARAMETER :: M26N3TAye = 17157 + INTEGER(IntKi), PARAMETER :: M26N4TAye = 17158 + INTEGER(IntKi), PARAMETER :: M26N5TAye = 17159 + INTEGER(IntKi), PARAMETER :: M26N6TAye = 17160 + INTEGER(IntKi), PARAMETER :: M26N7TAye = 17161 + INTEGER(IntKi), PARAMETER :: M26N8TAye = 17162 + INTEGER(IntKi), PARAMETER :: M26N9TAye = 17163 + INTEGER(IntKi), PARAMETER :: M27N1TAye = 17164 + INTEGER(IntKi), PARAMETER :: M27N2TAye = 17165 + INTEGER(IntKi), PARAMETER :: M27N3TAye = 17166 + INTEGER(IntKi), PARAMETER :: M27N4TAye = 17167 + INTEGER(IntKi), PARAMETER :: M27N5TAye = 17168 + INTEGER(IntKi), PARAMETER :: M27N6TAye = 17169 + INTEGER(IntKi), PARAMETER :: M27N7TAye = 17170 + INTEGER(IntKi), PARAMETER :: M27N8TAye = 17171 + INTEGER(IntKi), PARAMETER :: M27N9TAye = 17172 + INTEGER(IntKi), PARAMETER :: M28N1TAye = 17173 + INTEGER(IntKi), PARAMETER :: M28N2TAye = 17174 + INTEGER(IntKi), PARAMETER :: M28N3TAye = 17175 + INTEGER(IntKi), PARAMETER :: M28N4TAye = 17176 + INTEGER(IntKi), PARAMETER :: M28N5TAye = 17177 + INTEGER(IntKi), PARAMETER :: M28N6TAye = 17178 + INTEGER(IntKi), PARAMETER :: M28N7TAye = 17179 + INTEGER(IntKi), PARAMETER :: M28N8TAye = 17180 + INTEGER(IntKi), PARAMETER :: M28N9TAye = 17181 + INTEGER(IntKi), PARAMETER :: M29N1TAye = 17182 + INTEGER(IntKi), PARAMETER :: M29N2TAye = 17183 + INTEGER(IntKi), PARAMETER :: M29N3TAye = 17184 + INTEGER(IntKi), PARAMETER :: M29N4TAye = 17185 + INTEGER(IntKi), PARAMETER :: M29N5TAye = 17186 + INTEGER(IntKi), PARAMETER :: M29N6TAye = 17187 + INTEGER(IntKi), PARAMETER :: M29N7TAye = 17188 + INTEGER(IntKi), PARAMETER :: M29N8TAye = 17189 + INTEGER(IntKi), PARAMETER :: M29N9TAye = 17190 + INTEGER(IntKi), PARAMETER :: M30N1TAye = 17191 + INTEGER(IntKi), PARAMETER :: M30N2TAye = 17192 + INTEGER(IntKi), PARAMETER :: M30N3TAye = 17193 + INTEGER(IntKi), PARAMETER :: M30N4TAye = 17194 + INTEGER(IntKi), PARAMETER :: M30N5TAye = 17195 + INTEGER(IntKi), PARAMETER :: M30N6TAye = 17196 + INTEGER(IntKi), PARAMETER :: M30N7TAye = 17197 + INTEGER(IntKi), PARAMETER :: M30N8TAye = 17198 + INTEGER(IntKi), PARAMETER :: M30N9TAye = 17199 + INTEGER(IntKi), PARAMETER :: M31N1TAye = 17200 + INTEGER(IntKi), PARAMETER :: M31N2TAye = 17201 + INTEGER(IntKi), PARAMETER :: M31N3TAye = 17202 + INTEGER(IntKi), PARAMETER :: M31N4TAye = 17203 + INTEGER(IntKi), PARAMETER :: M31N5TAye = 17204 + INTEGER(IntKi), PARAMETER :: M31N6TAye = 17205 + INTEGER(IntKi), PARAMETER :: M31N7TAye = 17206 + INTEGER(IntKi), PARAMETER :: M31N8TAye = 17207 + INTEGER(IntKi), PARAMETER :: M31N9TAye = 17208 + INTEGER(IntKi), PARAMETER :: M32N1TAye = 17209 + INTEGER(IntKi), PARAMETER :: M32N2TAye = 17210 + INTEGER(IntKi), PARAMETER :: M32N3TAye = 17211 + INTEGER(IntKi), PARAMETER :: M32N4TAye = 17212 + INTEGER(IntKi), PARAMETER :: M32N5TAye = 17213 + INTEGER(IntKi), PARAMETER :: M32N6TAye = 17214 + INTEGER(IntKi), PARAMETER :: M32N7TAye = 17215 + INTEGER(IntKi), PARAMETER :: M32N8TAye = 17216 + INTEGER(IntKi), PARAMETER :: M32N9TAye = 17217 + INTEGER(IntKi), PARAMETER :: M33N1TAye = 17218 + INTEGER(IntKi), PARAMETER :: M33N2TAye = 17219 + INTEGER(IntKi), PARAMETER :: M33N3TAye = 17220 + INTEGER(IntKi), PARAMETER :: M33N4TAye = 17221 + INTEGER(IntKi), PARAMETER :: M33N5TAye = 17222 + INTEGER(IntKi), PARAMETER :: M33N6TAye = 17223 + INTEGER(IntKi), PARAMETER :: M33N7TAye = 17224 + INTEGER(IntKi), PARAMETER :: M33N8TAye = 17225 + INTEGER(IntKi), PARAMETER :: M33N9TAye = 17226 + INTEGER(IntKi), PARAMETER :: M34N1TAye = 17227 + INTEGER(IntKi), PARAMETER :: M34N2TAye = 17228 + INTEGER(IntKi), PARAMETER :: M34N3TAye = 17229 + INTEGER(IntKi), PARAMETER :: M34N4TAye = 17230 + INTEGER(IntKi), PARAMETER :: M34N5TAye = 17231 + INTEGER(IntKi), PARAMETER :: M34N6TAye = 17232 + INTEGER(IntKi), PARAMETER :: M34N7TAye = 17233 + INTEGER(IntKi), PARAMETER :: M34N8TAye = 17234 + INTEGER(IntKi), PARAMETER :: M34N9TAye = 17235 + INTEGER(IntKi), PARAMETER :: M35N1TAye = 17236 + INTEGER(IntKi), PARAMETER :: M35N2TAye = 17237 + INTEGER(IntKi), PARAMETER :: M35N3TAye = 17238 + INTEGER(IntKi), PARAMETER :: M35N4TAye = 17239 + INTEGER(IntKi), PARAMETER :: M35N5TAye = 17240 + INTEGER(IntKi), PARAMETER :: M35N6TAye = 17241 + INTEGER(IntKi), PARAMETER :: M35N7TAye = 17242 + INTEGER(IntKi), PARAMETER :: M35N8TAye = 17243 + INTEGER(IntKi), PARAMETER :: M35N9TAye = 17244 + INTEGER(IntKi), PARAMETER :: M36N1TAye = 17245 + INTEGER(IntKi), PARAMETER :: M36N2TAye = 17246 + INTEGER(IntKi), PARAMETER :: M36N3TAye = 17247 + INTEGER(IntKi), PARAMETER :: M36N4TAye = 17248 + INTEGER(IntKi), PARAMETER :: M36N5TAye = 17249 + INTEGER(IntKi), PARAMETER :: M36N6TAye = 17250 + INTEGER(IntKi), PARAMETER :: M36N7TAye = 17251 + INTEGER(IntKi), PARAMETER :: M36N8TAye = 17252 + INTEGER(IntKi), PARAMETER :: M36N9TAye = 17253 + INTEGER(IntKi), PARAMETER :: M37N1TAye = 17254 + INTEGER(IntKi), PARAMETER :: M37N2TAye = 17255 + INTEGER(IntKi), PARAMETER :: M37N3TAye = 17256 + INTEGER(IntKi), PARAMETER :: M37N4TAye = 17257 + INTEGER(IntKi), PARAMETER :: M37N5TAye = 17258 + INTEGER(IntKi), PARAMETER :: M37N6TAye = 17259 + INTEGER(IntKi), PARAMETER :: M37N7TAye = 17260 + INTEGER(IntKi), PARAMETER :: M37N8TAye = 17261 + INTEGER(IntKi), PARAMETER :: M37N9TAye = 17262 + INTEGER(IntKi), PARAMETER :: M38N1TAye = 17263 + INTEGER(IntKi), PARAMETER :: M38N2TAye = 17264 + INTEGER(IntKi), PARAMETER :: M38N3TAye = 17265 + INTEGER(IntKi), PARAMETER :: M38N4TAye = 17266 + INTEGER(IntKi), PARAMETER :: M38N5TAye = 17267 + INTEGER(IntKi), PARAMETER :: M38N6TAye = 17268 + INTEGER(IntKi), PARAMETER :: M38N7TAye = 17269 + INTEGER(IntKi), PARAMETER :: M38N8TAye = 17270 + INTEGER(IntKi), PARAMETER :: M38N9TAye = 17271 + INTEGER(IntKi), PARAMETER :: M39N1TAye = 17272 + INTEGER(IntKi), PARAMETER :: M39N2TAye = 17273 + INTEGER(IntKi), PARAMETER :: M39N3TAye = 17274 + INTEGER(IntKi), PARAMETER :: M39N4TAye = 17275 + INTEGER(IntKi), PARAMETER :: M39N5TAye = 17276 + INTEGER(IntKi), PARAMETER :: M39N6TAye = 17277 + INTEGER(IntKi), PARAMETER :: M39N7TAye = 17278 + INTEGER(IntKi), PARAMETER :: M39N8TAye = 17279 + INTEGER(IntKi), PARAMETER :: M39N9TAye = 17280 + INTEGER(IntKi), PARAMETER :: M40N1TAye = 17281 + INTEGER(IntKi), PARAMETER :: M40N2TAye = 17282 + INTEGER(IntKi), PARAMETER :: M40N3TAye = 17283 + INTEGER(IntKi), PARAMETER :: M40N4TAye = 17284 + INTEGER(IntKi), PARAMETER :: M40N5TAye = 17285 + INTEGER(IntKi), PARAMETER :: M40N6TAye = 17286 + INTEGER(IntKi), PARAMETER :: M40N7TAye = 17287 + INTEGER(IntKi), PARAMETER :: M40N8TAye = 17288 + INTEGER(IntKi), PARAMETER :: M40N9TAye = 17289 + INTEGER(IntKi), PARAMETER :: M41N1TAye = 17290 + INTEGER(IntKi), PARAMETER :: M41N2TAye = 17291 + INTEGER(IntKi), PARAMETER :: M41N3TAye = 17292 + INTEGER(IntKi), PARAMETER :: M41N4TAye = 17293 + INTEGER(IntKi), PARAMETER :: M41N5TAye = 17294 + INTEGER(IntKi), PARAMETER :: M41N6TAye = 17295 + INTEGER(IntKi), PARAMETER :: M41N7TAye = 17296 + INTEGER(IntKi), PARAMETER :: M41N8TAye = 17297 + INTEGER(IntKi), PARAMETER :: M41N9TAye = 17298 + INTEGER(IntKi), PARAMETER :: M42N1TAye = 17299 + INTEGER(IntKi), PARAMETER :: M42N2TAye = 17300 + INTEGER(IntKi), PARAMETER :: M42N3TAye = 17301 + INTEGER(IntKi), PARAMETER :: M42N4TAye = 17302 + INTEGER(IntKi), PARAMETER :: M42N5TAye = 17303 + INTEGER(IntKi), PARAMETER :: M42N6TAye = 17304 + INTEGER(IntKi), PARAMETER :: M42N7TAye = 17305 + INTEGER(IntKi), PARAMETER :: M42N8TAye = 17306 + INTEGER(IntKi), PARAMETER :: M42N9TAye = 17307 + INTEGER(IntKi), PARAMETER :: M43N1TAye = 17308 + INTEGER(IntKi), PARAMETER :: M43N2TAye = 17309 + INTEGER(IntKi), PARAMETER :: M43N3TAye = 17310 + INTEGER(IntKi), PARAMETER :: M43N4TAye = 17311 + INTEGER(IntKi), PARAMETER :: M43N5TAye = 17312 + INTEGER(IntKi), PARAMETER :: M43N6TAye = 17313 + INTEGER(IntKi), PARAMETER :: M43N7TAye = 17314 + INTEGER(IntKi), PARAMETER :: M43N8TAye = 17315 + INTEGER(IntKi), PARAMETER :: M43N9TAye = 17316 + INTEGER(IntKi), PARAMETER :: M44N1TAye = 17317 + INTEGER(IntKi), PARAMETER :: M44N2TAye = 17318 + INTEGER(IntKi), PARAMETER :: M44N3TAye = 17319 + INTEGER(IntKi), PARAMETER :: M44N4TAye = 17320 + INTEGER(IntKi), PARAMETER :: M44N5TAye = 17321 + INTEGER(IntKi), PARAMETER :: M44N6TAye = 17322 + INTEGER(IntKi), PARAMETER :: M44N7TAye = 17323 + INTEGER(IntKi), PARAMETER :: M44N8TAye = 17324 + INTEGER(IntKi), PARAMETER :: M44N9TAye = 17325 + INTEGER(IntKi), PARAMETER :: M45N1TAye = 17326 + INTEGER(IntKi), PARAMETER :: M45N2TAye = 17327 + INTEGER(IntKi), PARAMETER :: M45N3TAye = 17328 + INTEGER(IntKi), PARAMETER :: M45N4TAye = 17329 + INTEGER(IntKi), PARAMETER :: M45N5TAye = 17330 + INTEGER(IntKi), PARAMETER :: M45N6TAye = 17331 + INTEGER(IntKi), PARAMETER :: M45N7TAye = 17332 + INTEGER(IntKi), PARAMETER :: M45N8TAye = 17333 + INTEGER(IntKi), PARAMETER :: M45N9TAye = 17334 + INTEGER(IntKi), PARAMETER :: M46N1TAye = 17335 + INTEGER(IntKi), PARAMETER :: M46N2TAye = 17336 + INTEGER(IntKi), PARAMETER :: M46N3TAye = 17337 + INTEGER(IntKi), PARAMETER :: M46N4TAye = 17338 + INTEGER(IntKi), PARAMETER :: M46N5TAye = 17339 + INTEGER(IntKi), PARAMETER :: M46N6TAye = 17340 + INTEGER(IntKi), PARAMETER :: M46N7TAye = 17341 + INTEGER(IntKi), PARAMETER :: M46N8TAye = 17342 + INTEGER(IntKi), PARAMETER :: M46N9TAye = 17343 + INTEGER(IntKi), PARAMETER :: M47N1TAye = 17344 + INTEGER(IntKi), PARAMETER :: M47N2TAye = 17345 + INTEGER(IntKi), PARAMETER :: M47N3TAye = 17346 + INTEGER(IntKi), PARAMETER :: M47N4TAye = 17347 + INTEGER(IntKi), PARAMETER :: M47N5TAye = 17348 + INTEGER(IntKi), PARAMETER :: M47N6TAye = 17349 + INTEGER(IntKi), PARAMETER :: M47N7TAye = 17350 + INTEGER(IntKi), PARAMETER :: M47N8TAye = 17351 + INTEGER(IntKi), PARAMETER :: M47N9TAye = 17352 + INTEGER(IntKi), PARAMETER :: M48N1TAye = 17353 + INTEGER(IntKi), PARAMETER :: M48N2TAye = 17354 + INTEGER(IntKi), PARAMETER :: M48N3TAye = 17355 + INTEGER(IntKi), PARAMETER :: M48N4TAye = 17356 + INTEGER(IntKi), PARAMETER :: M48N5TAye = 17357 + INTEGER(IntKi), PARAMETER :: M48N6TAye = 17358 + INTEGER(IntKi), PARAMETER :: M48N7TAye = 17359 + INTEGER(IntKi), PARAMETER :: M48N8TAye = 17360 + INTEGER(IntKi), PARAMETER :: M48N9TAye = 17361 + INTEGER(IntKi), PARAMETER :: M49N1TAye = 17362 + INTEGER(IntKi), PARAMETER :: M49N2TAye = 17363 + INTEGER(IntKi), PARAMETER :: M49N3TAye = 17364 + INTEGER(IntKi), PARAMETER :: M49N4TAye = 17365 + INTEGER(IntKi), PARAMETER :: M49N5TAye = 17366 + INTEGER(IntKi), PARAMETER :: M49N6TAye = 17367 + INTEGER(IntKi), PARAMETER :: M49N7TAye = 17368 + INTEGER(IntKi), PARAMETER :: M49N8TAye = 17369 + INTEGER(IntKi), PARAMETER :: M49N9TAye = 17370 + INTEGER(IntKi), PARAMETER :: M50N1TAye = 17371 + INTEGER(IntKi), PARAMETER :: M50N2TAye = 17372 + INTEGER(IntKi), PARAMETER :: M50N3TAye = 17373 + INTEGER(IntKi), PARAMETER :: M50N4TAye = 17374 + INTEGER(IntKi), PARAMETER :: M50N5TAye = 17375 + INTEGER(IntKi), PARAMETER :: M50N6TAye = 17376 + INTEGER(IntKi), PARAMETER :: M50N7TAye = 17377 + INTEGER(IntKi), PARAMETER :: M50N8TAye = 17378 + INTEGER(IntKi), PARAMETER :: M50N9TAye = 17379 + INTEGER(IntKi), PARAMETER :: M51N1TAye = 17380 + INTEGER(IntKi), PARAMETER :: M51N2TAye = 17381 + INTEGER(IntKi), PARAMETER :: M51N3TAye = 17382 + INTEGER(IntKi), PARAMETER :: M51N4TAye = 17383 + INTEGER(IntKi), PARAMETER :: M51N5TAye = 17384 + INTEGER(IntKi), PARAMETER :: M51N6TAye = 17385 + INTEGER(IntKi), PARAMETER :: M51N7TAye = 17386 + INTEGER(IntKi), PARAMETER :: M51N8TAye = 17387 + INTEGER(IntKi), PARAMETER :: M51N9TAye = 17388 + INTEGER(IntKi), PARAMETER :: M52N1TAye = 17389 + INTEGER(IntKi), PARAMETER :: M52N2TAye = 17390 + INTEGER(IntKi), PARAMETER :: M52N3TAye = 17391 + INTEGER(IntKi), PARAMETER :: M52N4TAye = 17392 + INTEGER(IntKi), PARAMETER :: M52N5TAye = 17393 + INTEGER(IntKi), PARAMETER :: M52N6TAye = 17394 + INTEGER(IntKi), PARAMETER :: M52N7TAye = 17395 + INTEGER(IntKi), PARAMETER :: M52N8TAye = 17396 + INTEGER(IntKi), PARAMETER :: M52N9TAye = 17397 + INTEGER(IntKi), PARAMETER :: M53N1TAye = 17398 + INTEGER(IntKi), PARAMETER :: M53N2TAye = 17399 + INTEGER(IntKi), PARAMETER :: M53N3TAye = 17400 + INTEGER(IntKi), PARAMETER :: M53N4TAye = 17401 + INTEGER(IntKi), PARAMETER :: M53N5TAye = 17402 + INTEGER(IntKi), PARAMETER :: M53N6TAye = 17403 + INTEGER(IntKi), PARAMETER :: M53N7TAye = 17404 + INTEGER(IntKi), PARAMETER :: M53N8TAye = 17405 + INTEGER(IntKi), PARAMETER :: M53N9TAye = 17406 + INTEGER(IntKi), PARAMETER :: M54N1TAye = 17407 + INTEGER(IntKi), PARAMETER :: M54N2TAye = 17408 + INTEGER(IntKi), PARAMETER :: M54N3TAye = 17409 + INTEGER(IntKi), PARAMETER :: M54N4TAye = 17410 + INTEGER(IntKi), PARAMETER :: M54N5TAye = 17411 + INTEGER(IntKi), PARAMETER :: M54N6TAye = 17412 + INTEGER(IntKi), PARAMETER :: M54N7TAye = 17413 + INTEGER(IntKi), PARAMETER :: M54N8TAye = 17414 + INTEGER(IntKi), PARAMETER :: M54N9TAye = 17415 + INTEGER(IntKi), PARAMETER :: M55N1TAye = 17416 + INTEGER(IntKi), PARAMETER :: M55N2TAye = 17417 + INTEGER(IntKi), PARAMETER :: M55N3TAye = 17418 + INTEGER(IntKi), PARAMETER :: M55N4TAye = 17419 + INTEGER(IntKi), PARAMETER :: M55N5TAye = 17420 + INTEGER(IntKi), PARAMETER :: M55N6TAye = 17421 + INTEGER(IntKi), PARAMETER :: M55N7TAye = 17422 + INTEGER(IntKi), PARAMETER :: M55N8TAye = 17423 + INTEGER(IntKi), PARAMETER :: M55N9TAye = 17424 + INTEGER(IntKi), PARAMETER :: M56N1TAye = 17425 + INTEGER(IntKi), PARAMETER :: M56N2TAye = 17426 + INTEGER(IntKi), PARAMETER :: M56N3TAye = 17427 + INTEGER(IntKi), PARAMETER :: M56N4TAye = 17428 + INTEGER(IntKi), PARAMETER :: M56N5TAye = 17429 + INTEGER(IntKi), PARAMETER :: M56N6TAye = 17430 + INTEGER(IntKi), PARAMETER :: M56N7TAye = 17431 + INTEGER(IntKi), PARAMETER :: M56N8TAye = 17432 + INTEGER(IntKi), PARAMETER :: M56N9TAye = 17433 + INTEGER(IntKi), PARAMETER :: M57N1TAye = 17434 + INTEGER(IntKi), PARAMETER :: M57N2TAye = 17435 + INTEGER(IntKi), PARAMETER :: M57N3TAye = 17436 + INTEGER(IntKi), PARAMETER :: M57N4TAye = 17437 + INTEGER(IntKi), PARAMETER :: M57N5TAye = 17438 + INTEGER(IntKi), PARAMETER :: M57N6TAye = 17439 + INTEGER(IntKi), PARAMETER :: M57N7TAye = 17440 + INTEGER(IntKi), PARAMETER :: M57N8TAye = 17441 + INTEGER(IntKi), PARAMETER :: M57N9TAye = 17442 + INTEGER(IntKi), PARAMETER :: M58N1TAye = 17443 + INTEGER(IntKi), PARAMETER :: M58N2TAye = 17444 + INTEGER(IntKi), PARAMETER :: M58N3TAye = 17445 + INTEGER(IntKi), PARAMETER :: M58N4TAye = 17446 + INTEGER(IntKi), PARAMETER :: M58N5TAye = 17447 + INTEGER(IntKi), PARAMETER :: M58N6TAye = 17448 + INTEGER(IntKi), PARAMETER :: M58N7TAye = 17449 + INTEGER(IntKi), PARAMETER :: M58N8TAye = 17450 + INTEGER(IntKi), PARAMETER :: M58N9TAye = 17451 + INTEGER(IntKi), PARAMETER :: M59N1TAye = 17452 + INTEGER(IntKi), PARAMETER :: M59N2TAye = 17453 + INTEGER(IntKi), PARAMETER :: M59N3TAye = 17454 + INTEGER(IntKi), PARAMETER :: M59N4TAye = 17455 + INTEGER(IntKi), PARAMETER :: M59N5TAye = 17456 + INTEGER(IntKi), PARAMETER :: M59N6TAye = 17457 + INTEGER(IntKi), PARAMETER :: M59N7TAye = 17458 + INTEGER(IntKi), PARAMETER :: M59N8TAye = 17459 + INTEGER(IntKi), PARAMETER :: M59N9TAye = 17460 + INTEGER(IntKi), PARAMETER :: M60N1TAye = 17461 + INTEGER(IntKi), PARAMETER :: M60N2TAye = 17462 + INTEGER(IntKi), PARAMETER :: M60N3TAye = 17463 + INTEGER(IntKi), PARAMETER :: M60N4TAye = 17464 + INTEGER(IntKi), PARAMETER :: M60N5TAye = 17465 + INTEGER(IntKi), PARAMETER :: M60N6TAye = 17466 + INTEGER(IntKi), PARAMETER :: M60N7TAye = 17467 + INTEGER(IntKi), PARAMETER :: M60N8TAye = 17468 + INTEGER(IntKi), PARAMETER :: M60N9TAye = 17469 + INTEGER(IntKi), PARAMETER :: M61N1TAye = 17470 + INTEGER(IntKi), PARAMETER :: M61N2TAye = 17471 + INTEGER(IntKi), PARAMETER :: M61N3TAye = 17472 + INTEGER(IntKi), PARAMETER :: M61N4TAye = 17473 + INTEGER(IntKi), PARAMETER :: M61N5TAye = 17474 + INTEGER(IntKi), PARAMETER :: M61N6TAye = 17475 + INTEGER(IntKi), PARAMETER :: M61N7TAye = 17476 + INTEGER(IntKi), PARAMETER :: M61N8TAye = 17477 + INTEGER(IntKi), PARAMETER :: M61N9TAye = 17478 + INTEGER(IntKi), PARAMETER :: M62N1TAye = 17479 + INTEGER(IntKi), PARAMETER :: M62N2TAye = 17480 + INTEGER(IntKi), PARAMETER :: M62N3TAye = 17481 + INTEGER(IntKi), PARAMETER :: M62N4TAye = 17482 + INTEGER(IntKi), PARAMETER :: M62N5TAye = 17483 + INTEGER(IntKi), PARAMETER :: M62N6TAye = 17484 + INTEGER(IntKi), PARAMETER :: M62N7TAye = 17485 + INTEGER(IntKi), PARAMETER :: M62N8TAye = 17486 + INTEGER(IntKi), PARAMETER :: M62N9TAye = 17487 + INTEGER(IntKi), PARAMETER :: M63N1TAye = 17488 + INTEGER(IntKi), PARAMETER :: M63N2TAye = 17489 + INTEGER(IntKi), PARAMETER :: M63N3TAye = 17490 + INTEGER(IntKi), PARAMETER :: M63N4TAye = 17491 + INTEGER(IntKi), PARAMETER :: M63N5TAye = 17492 + INTEGER(IntKi), PARAMETER :: M63N6TAye = 17493 + INTEGER(IntKi), PARAMETER :: M63N7TAye = 17494 + INTEGER(IntKi), PARAMETER :: M63N8TAye = 17495 + INTEGER(IntKi), PARAMETER :: M63N9TAye = 17496 + INTEGER(IntKi), PARAMETER :: M64N1TAye = 17497 + INTEGER(IntKi), PARAMETER :: M64N2TAye = 17498 + INTEGER(IntKi), PARAMETER :: M64N3TAye = 17499 + INTEGER(IntKi), PARAMETER :: M64N4TAye = 17500 + INTEGER(IntKi), PARAMETER :: M64N5TAye = 17501 + INTEGER(IntKi), PARAMETER :: M64N6TAye = 17502 + INTEGER(IntKi), PARAMETER :: M64N7TAye = 17503 + INTEGER(IntKi), PARAMETER :: M64N8TAye = 17504 + INTEGER(IntKi), PARAMETER :: M64N9TAye = 17505 + INTEGER(IntKi), PARAMETER :: M65N1TAye = 17506 + INTEGER(IntKi), PARAMETER :: M65N2TAye = 17507 + INTEGER(IntKi), PARAMETER :: M65N3TAye = 17508 + INTEGER(IntKi), PARAMETER :: M65N4TAye = 17509 + INTEGER(IntKi), PARAMETER :: M65N5TAye = 17510 + INTEGER(IntKi), PARAMETER :: M65N6TAye = 17511 + INTEGER(IntKi), PARAMETER :: M65N7TAye = 17512 + INTEGER(IntKi), PARAMETER :: M65N8TAye = 17513 + INTEGER(IntKi), PARAMETER :: M65N9TAye = 17514 + INTEGER(IntKi), PARAMETER :: M66N1TAye = 17515 + INTEGER(IntKi), PARAMETER :: M66N2TAye = 17516 + INTEGER(IntKi), PARAMETER :: M66N3TAye = 17517 + INTEGER(IntKi), PARAMETER :: M66N4TAye = 17518 + INTEGER(IntKi), PARAMETER :: M66N5TAye = 17519 + INTEGER(IntKi), PARAMETER :: M66N6TAye = 17520 + INTEGER(IntKi), PARAMETER :: M66N7TAye = 17521 + INTEGER(IntKi), PARAMETER :: M66N8TAye = 17522 + INTEGER(IntKi), PARAMETER :: M66N9TAye = 17523 + INTEGER(IntKi), PARAMETER :: M67N1TAye = 17524 + INTEGER(IntKi), PARAMETER :: M67N2TAye = 17525 + INTEGER(IntKi), PARAMETER :: M67N3TAye = 17526 + INTEGER(IntKi), PARAMETER :: M67N4TAye = 17527 + INTEGER(IntKi), PARAMETER :: M67N5TAye = 17528 + INTEGER(IntKi), PARAMETER :: M67N6TAye = 17529 + INTEGER(IntKi), PARAMETER :: M67N7TAye = 17530 + INTEGER(IntKi), PARAMETER :: M67N8TAye = 17531 + INTEGER(IntKi), PARAMETER :: M67N9TAye = 17532 + INTEGER(IntKi), PARAMETER :: M68N1TAye = 17533 + INTEGER(IntKi), PARAMETER :: M68N2TAye = 17534 + INTEGER(IntKi), PARAMETER :: M68N3TAye = 17535 + INTEGER(IntKi), PARAMETER :: M68N4TAye = 17536 + INTEGER(IntKi), PARAMETER :: M68N5TAye = 17537 + INTEGER(IntKi), PARAMETER :: M68N6TAye = 17538 + INTEGER(IntKi), PARAMETER :: M68N7TAye = 17539 + INTEGER(IntKi), PARAMETER :: M68N8TAye = 17540 + INTEGER(IntKi), PARAMETER :: M68N9TAye = 17541 + INTEGER(IntKi), PARAMETER :: M69N1TAye = 17542 + INTEGER(IntKi), PARAMETER :: M69N2TAye = 17543 + INTEGER(IntKi), PARAMETER :: M69N3TAye = 17544 + INTEGER(IntKi), PARAMETER :: M69N4TAye = 17545 + INTEGER(IntKi), PARAMETER :: M69N5TAye = 17546 + INTEGER(IntKi), PARAMETER :: M69N6TAye = 17547 + INTEGER(IntKi), PARAMETER :: M69N7TAye = 17548 + INTEGER(IntKi), PARAMETER :: M69N8TAye = 17549 + INTEGER(IntKi), PARAMETER :: M69N9TAye = 17550 + INTEGER(IntKi), PARAMETER :: M70N1TAye = 17551 + INTEGER(IntKi), PARAMETER :: M70N2TAye = 17552 + INTEGER(IntKi), PARAMETER :: M70N3TAye = 17553 + INTEGER(IntKi), PARAMETER :: M70N4TAye = 17554 + INTEGER(IntKi), PARAMETER :: M70N5TAye = 17555 + INTEGER(IntKi), PARAMETER :: M70N6TAye = 17556 + INTEGER(IntKi), PARAMETER :: M70N7TAye = 17557 + INTEGER(IntKi), PARAMETER :: M70N8TAye = 17558 + INTEGER(IntKi), PARAMETER :: M70N9TAye = 17559 + INTEGER(IntKi), PARAMETER :: M71N1TAye = 17560 + INTEGER(IntKi), PARAMETER :: M71N2TAye = 17561 + INTEGER(IntKi), PARAMETER :: M71N3TAye = 17562 + INTEGER(IntKi), PARAMETER :: M71N4TAye = 17563 + INTEGER(IntKi), PARAMETER :: M71N5TAye = 17564 + INTEGER(IntKi), PARAMETER :: M71N6TAye = 17565 + INTEGER(IntKi), PARAMETER :: M71N7TAye = 17566 + INTEGER(IntKi), PARAMETER :: M71N8TAye = 17567 + INTEGER(IntKi), PARAMETER :: M71N9TAye = 17568 + INTEGER(IntKi), PARAMETER :: M72N1TAye = 17569 + INTEGER(IntKi), PARAMETER :: M72N2TAye = 17570 + INTEGER(IntKi), PARAMETER :: M72N3TAye = 17571 + INTEGER(IntKi), PARAMETER :: M72N4TAye = 17572 + INTEGER(IntKi), PARAMETER :: M72N5TAye = 17573 + INTEGER(IntKi), PARAMETER :: M72N6TAye = 17574 + INTEGER(IntKi), PARAMETER :: M72N7TAye = 17575 + INTEGER(IntKi), PARAMETER :: M72N8TAye = 17576 + INTEGER(IntKi), PARAMETER :: M72N9TAye = 17577 + INTEGER(IntKi), PARAMETER :: M73N1TAye = 17578 + INTEGER(IntKi), PARAMETER :: M73N2TAye = 17579 + INTEGER(IntKi), PARAMETER :: M73N3TAye = 17580 + INTEGER(IntKi), PARAMETER :: M73N4TAye = 17581 + INTEGER(IntKi), PARAMETER :: M73N5TAye = 17582 + INTEGER(IntKi), PARAMETER :: M73N6TAye = 17583 + INTEGER(IntKi), PARAMETER :: M73N7TAye = 17584 + INTEGER(IntKi), PARAMETER :: M73N8TAye = 17585 + INTEGER(IntKi), PARAMETER :: M73N9TAye = 17586 + INTEGER(IntKi), PARAMETER :: M74N1TAye = 17587 + INTEGER(IntKi), PARAMETER :: M74N2TAye = 17588 + INTEGER(IntKi), PARAMETER :: M74N3TAye = 17589 + INTEGER(IntKi), PARAMETER :: M74N4TAye = 17590 + INTEGER(IntKi), PARAMETER :: M74N5TAye = 17591 + INTEGER(IntKi), PARAMETER :: M74N6TAye = 17592 + INTEGER(IntKi), PARAMETER :: M74N7TAye = 17593 + INTEGER(IntKi), PARAMETER :: M74N8TAye = 17594 + INTEGER(IntKi), PARAMETER :: M74N9TAye = 17595 + INTEGER(IntKi), PARAMETER :: M75N1TAye = 17596 + INTEGER(IntKi), PARAMETER :: M75N2TAye = 17597 + INTEGER(IntKi), PARAMETER :: M75N3TAye = 17598 + INTEGER(IntKi), PARAMETER :: M75N4TAye = 17599 + INTEGER(IntKi), PARAMETER :: M75N5TAye = 17600 + INTEGER(IntKi), PARAMETER :: M75N6TAye = 17601 + INTEGER(IntKi), PARAMETER :: M75N7TAye = 17602 + INTEGER(IntKi), PARAMETER :: M75N8TAye = 17603 + INTEGER(IntKi), PARAMETER :: M75N9TAye = 17604 + INTEGER(IntKi), PARAMETER :: M76N1TAye = 17605 + INTEGER(IntKi), PARAMETER :: M76N2TAye = 17606 + INTEGER(IntKi), PARAMETER :: M76N3TAye = 17607 + INTEGER(IntKi), PARAMETER :: M76N4TAye = 17608 + INTEGER(IntKi), PARAMETER :: M76N5TAye = 17609 + INTEGER(IntKi), PARAMETER :: M76N6TAye = 17610 + INTEGER(IntKi), PARAMETER :: M76N7TAye = 17611 + INTEGER(IntKi), PARAMETER :: M76N8TAye = 17612 + INTEGER(IntKi), PARAMETER :: M76N9TAye = 17613 + INTEGER(IntKi), PARAMETER :: M77N1TAye = 17614 + INTEGER(IntKi), PARAMETER :: M77N2TAye = 17615 + INTEGER(IntKi), PARAMETER :: M77N3TAye = 17616 + INTEGER(IntKi), PARAMETER :: M77N4TAye = 17617 + INTEGER(IntKi), PARAMETER :: M77N5TAye = 17618 + INTEGER(IntKi), PARAMETER :: M77N6TAye = 17619 + INTEGER(IntKi), PARAMETER :: M77N7TAye = 17620 + INTEGER(IntKi), PARAMETER :: M77N8TAye = 17621 + INTEGER(IntKi), PARAMETER :: M77N9TAye = 17622 + INTEGER(IntKi), PARAMETER :: M78N1TAye = 17623 + INTEGER(IntKi), PARAMETER :: M78N2TAye = 17624 + INTEGER(IntKi), PARAMETER :: M78N3TAye = 17625 + INTEGER(IntKi), PARAMETER :: M78N4TAye = 17626 + INTEGER(IntKi), PARAMETER :: M78N5TAye = 17627 + INTEGER(IntKi), PARAMETER :: M78N6TAye = 17628 + INTEGER(IntKi), PARAMETER :: M78N7TAye = 17629 + INTEGER(IntKi), PARAMETER :: M78N8TAye = 17630 + INTEGER(IntKi), PARAMETER :: M78N9TAye = 17631 + INTEGER(IntKi), PARAMETER :: M79N1TAye = 17632 + INTEGER(IntKi), PARAMETER :: M79N2TAye = 17633 + INTEGER(IntKi), PARAMETER :: M79N3TAye = 17634 + INTEGER(IntKi), PARAMETER :: M79N4TAye = 17635 + INTEGER(IntKi), PARAMETER :: M79N5TAye = 17636 + INTEGER(IntKi), PARAMETER :: M79N6TAye = 17637 + INTEGER(IntKi), PARAMETER :: M79N7TAye = 17638 + INTEGER(IntKi), PARAMETER :: M79N8TAye = 17639 + INTEGER(IntKi), PARAMETER :: M79N9TAye = 17640 + INTEGER(IntKi), PARAMETER :: M80N1TAye = 17641 + INTEGER(IntKi), PARAMETER :: M80N2TAye = 17642 + INTEGER(IntKi), PARAMETER :: M80N3TAye = 17643 + INTEGER(IntKi), PARAMETER :: M80N4TAye = 17644 + INTEGER(IntKi), PARAMETER :: M80N5TAye = 17645 + INTEGER(IntKi), PARAMETER :: M80N6TAye = 17646 + INTEGER(IntKi), PARAMETER :: M80N7TAye = 17647 + INTEGER(IntKi), PARAMETER :: M80N8TAye = 17648 + INTEGER(IntKi), PARAMETER :: M80N9TAye = 17649 + INTEGER(IntKi), PARAMETER :: M81N1TAye = 17650 + INTEGER(IntKi), PARAMETER :: M81N2TAye = 17651 + INTEGER(IntKi), PARAMETER :: M81N3TAye = 17652 + INTEGER(IntKi), PARAMETER :: M81N4TAye = 17653 + INTEGER(IntKi), PARAMETER :: M81N5TAye = 17654 + INTEGER(IntKi), PARAMETER :: M81N6TAye = 17655 + INTEGER(IntKi), PARAMETER :: M81N7TAye = 17656 + INTEGER(IntKi), PARAMETER :: M81N8TAye = 17657 + INTEGER(IntKi), PARAMETER :: M81N9TAye = 17658 + INTEGER(IntKi), PARAMETER :: M82N1TAye = 17659 + INTEGER(IntKi), PARAMETER :: M82N2TAye = 17660 + INTEGER(IntKi), PARAMETER :: M82N3TAye = 17661 + INTEGER(IntKi), PARAMETER :: M82N4TAye = 17662 + INTEGER(IntKi), PARAMETER :: M82N5TAye = 17663 + INTEGER(IntKi), PARAMETER :: M82N6TAye = 17664 + INTEGER(IntKi), PARAMETER :: M82N7TAye = 17665 + INTEGER(IntKi), PARAMETER :: M82N8TAye = 17666 + INTEGER(IntKi), PARAMETER :: M82N9TAye = 17667 + INTEGER(IntKi), PARAMETER :: M83N1TAye = 17668 + INTEGER(IntKi), PARAMETER :: M83N2TAye = 17669 + INTEGER(IntKi), PARAMETER :: M83N3TAye = 17670 + INTEGER(IntKi), PARAMETER :: M83N4TAye = 17671 + INTEGER(IntKi), PARAMETER :: M83N5TAye = 17672 + INTEGER(IntKi), PARAMETER :: M83N6TAye = 17673 + INTEGER(IntKi), PARAMETER :: M83N7TAye = 17674 + INTEGER(IntKi), PARAMETER :: M83N8TAye = 17675 + INTEGER(IntKi), PARAMETER :: M83N9TAye = 17676 + INTEGER(IntKi), PARAMETER :: M84N1TAye = 17677 + INTEGER(IntKi), PARAMETER :: M84N2TAye = 17678 + INTEGER(IntKi), PARAMETER :: M84N3TAye = 17679 + INTEGER(IntKi), PARAMETER :: M84N4TAye = 17680 + INTEGER(IntKi), PARAMETER :: M84N5TAye = 17681 + INTEGER(IntKi), PARAMETER :: M84N6TAye = 17682 + INTEGER(IntKi), PARAMETER :: M84N7TAye = 17683 + INTEGER(IntKi), PARAMETER :: M84N8TAye = 17684 + INTEGER(IntKi), PARAMETER :: M84N9TAye = 17685 + INTEGER(IntKi), PARAMETER :: M85N1TAye = 17686 + INTEGER(IntKi), PARAMETER :: M85N2TAye = 17687 + INTEGER(IntKi), PARAMETER :: M85N3TAye = 17688 + INTEGER(IntKi), PARAMETER :: M85N4TAye = 17689 + INTEGER(IntKi), PARAMETER :: M85N5TAye = 17690 + INTEGER(IntKi), PARAMETER :: M85N6TAye = 17691 + INTEGER(IntKi), PARAMETER :: M85N7TAye = 17692 + INTEGER(IntKi), PARAMETER :: M85N8TAye = 17693 + INTEGER(IntKi), PARAMETER :: M85N9TAye = 17694 + INTEGER(IntKi), PARAMETER :: M86N1TAye = 17695 + INTEGER(IntKi), PARAMETER :: M86N2TAye = 17696 + INTEGER(IntKi), PARAMETER :: M86N3TAye = 17697 + INTEGER(IntKi), PARAMETER :: M86N4TAye = 17698 + INTEGER(IntKi), PARAMETER :: M86N5TAye = 17699 + INTEGER(IntKi), PARAMETER :: M86N6TAye = 17700 + INTEGER(IntKi), PARAMETER :: M86N7TAye = 17701 + INTEGER(IntKi), PARAMETER :: M86N8TAye = 17702 + INTEGER(IntKi), PARAMETER :: M86N9TAye = 17703 + INTEGER(IntKi), PARAMETER :: M87N1TAye = 17704 + INTEGER(IntKi), PARAMETER :: M87N2TAye = 17705 + INTEGER(IntKi), PARAMETER :: M87N3TAye = 17706 + INTEGER(IntKi), PARAMETER :: M87N4TAye = 17707 + INTEGER(IntKi), PARAMETER :: M87N5TAye = 17708 + INTEGER(IntKi), PARAMETER :: M87N6TAye = 17709 + INTEGER(IntKi), PARAMETER :: M87N7TAye = 17710 + INTEGER(IntKi), PARAMETER :: M87N8TAye = 17711 + INTEGER(IntKi), PARAMETER :: M87N9TAye = 17712 + INTEGER(IntKi), PARAMETER :: M88N1TAye = 17713 + INTEGER(IntKi), PARAMETER :: M88N2TAye = 17714 + INTEGER(IntKi), PARAMETER :: M88N3TAye = 17715 + INTEGER(IntKi), PARAMETER :: M88N4TAye = 17716 + INTEGER(IntKi), PARAMETER :: M88N5TAye = 17717 + INTEGER(IntKi), PARAMETER :: M88N6TAye = 17718 + INTEGER(IntKi), PARAMETER :: M88N7TAye = 17719 + INTEGER(IntKi), PARAMETER :: M88N8TAye = 17720 + INTEGER(IntKi), PARAMETER :: M88N9TAye = 17721 + INTEGER(IntKi), PARAMETER :: M89N1TAye = 17722 + INTEGER(IntKi), PARAMETER :: M89N2TAye = 17723 + INTEGER(IntKi), PARAMETER :: M89N3TAye = 17724 + INTEGER(IntKi), PARAMETER :: M89N4TAye = 17725 + INTEGER(IntKi), PARAMETER :: M89N5TAye = 17726 + INTEGER(IntKi), PARAMETER :: M89N6TAye = 17727 + INTEGER(IntKi), PARAMETER :: M89N7TAye = 17728 + INTEGER(IntKi), PARAMETER :: M89N8TAye = 17729 + INTEGER(IntKi), PARAMETER :: M89N9TAye = 17730 + INTEGER(IntKi), PARAMETER :: M90N1TAye = 17731 + INTEGER(IntKi), PARAMETER :: M90N2TAye = 17732 + INTEGER(IntKi), PARAMETER :: M90N3TAye = 17733 + INTEGER(IntKi), PARAMETER :: M90N4TAye = 17734 + INTEGER(IntKi), PARAMETER :: M90N5TAye = 17735 + INTEGER(IntKi), PARAMETER :: M90N6TAye = 17736 + INTEGER(IntKi), PARAMETER :: M90N7TAye = 17737 + INTEGER(IntKi), PARAMETER :: M90N8TAye = 17738 + INTEGER(IntKi), PARAMETER :: M90N9TAye = 17739 + INTEGER(IntKi), PARAMETER :: M91N1TAye = 17740 + INTEGER(IntKi), PARAMETER :: M91N2TAye = 17741 + INTEGER(IntKi), PARAMETER :: M91N3TAye = 17742 + INTEGER(IntKi), PARAMETER :: M91N4TAye = 17743 + INTEGER(IntKi), PARAMETER :: M91N5TAye = 17744 + INTEGER(IntKi), PARAMETER :: M91N6TAye = 17745 + INTEGER(IntKi), PARAMETER :: M91N7TAye = 17746 + INTEGER(IntKi), PARAMETER :: M91N8TAye = 17747 + INTEGER(IntKi), PARAMETER :: M91N9TAye = 17748 + INTEGER(IntKi), PARAMETER :: M92N1TAye = 17749 + INTEGER(IntKi), PARAMETER :: M92N2TAye = 17750 + INTEGER(IntKi), PARAMETER :: M92N3TAye = 17751 + INTEGER(IntKi), PARAMETER :: M92N4TAye = 17752 + INTEGER(IntKi), PARAMETER :: M92N5TAye = 17753 + INTEGER(IntKi), PARAMETER :: M92N6TAye = 17754 + INTEGER(IntKi), PARAMETER :: M92N7TAye = 17755 + INTEGER(IntKi), PARAMETER :: M92N8TAye = 17756 + INTEGER(IntKi), PARAMETER :: M92N9TAye = 17757 + INTEGER(IntKi), PARAMETER :: M93N1TAye = 17758 + INTEGER(IntKi), PARAMETER :: M93N2TAye = 17759 + INTEGER(IntKi), PARAMETER :: M93N3TAye = 17760 + INTEGER(IntKi), PARAMETER :: M93N4TAye = 17761 + INTEGER(IntKi), PARAMETER :: M93N5TAye = 17762 + INTEGER(IntKi), PARAMETER :: M93N6TAye = 17763 + INTEGER(IntKi), PARAMETER :: M93N7TAye = 17764 + INTEGER(IntKi), PARAMETER :: M93N8TAye = 17765 + INTEGER(IntKi), PARAMETER :: M93N9TAye = 17766 + INTEGER(IntKi), PARAMETER :: M94N1TAye = 17767 + INTEGER(IntKi), PARAMETER :: M94N2TAye = 17768 + INTEGER(IntKi), PARAMETER :: M94N3TAye = 17769 + INTEGER(IntKi), PARAMETER :: M94N4TAye = 17770 + INTEGER(IntKi), PARAMETER :: M94N5TAye = 17771 + INTEGER(IntKi), PARAMETER :: M94N6TAye = 17772 + INTEGER(IntKi), PARAMETER :: M94N7TAye = 17773 + INTEGER(IntKi), PARAMETER :: M94N8TAye = 17774 + INTEGER(IntKi), PARAMETER :: M94N9TAye = 17775 + INTEGER(IntKi), PARAMETER :: M95N1TAye = 17776 + INTEGER(IntKi), PARAMETER :: M95N2TAye = 17777 + INTEGER(IntKi), PARAMETER :: M95N3TAye = 17778 + INTEGER(IntKi), PARAMETER :: M95N4TAye = 17779 + INTEGER(IntKi), PARAMETER :: M95N5TAye = 17780 + INTEGER(IntKi), PARAMETER :: M95N6TAye = 17781 + INTEGER(IntKi), PARAMETER :: M95N7TAye = 17782 + INTEGER(IntKi), PARAMETER :: M95N8TAye = 17783 + INTEGER(IntKi), PARAMETER :: M95N9TAye = 17784 + INTEGER(IntKi), PARAMETER :: M96N1TAye = 17785 + INTEGER(IntKi), PARAMETER :: M96N2TAye = 17786 + INTEGER(IntKi), PARAMETER :: M96N3TAye = 17787 + INTEGER(IntKi), PARAMETER :: M96N4TAye = 17788 + INTEGER(IntKi), PARAMETER :: M96N5TAye = 17789 + INTEGER(IntKi), PARAMETER :: M96N6TAye = 17790 + INTEGER(IntKi), PARAMETER :: M96N7TAye = 17791 + INTEGER(IntKi), PARAMETER :: M96N8TAye = 17792 + INTEGER(IntKi), PARAMETER :: M96N9TAye = 17793 + INTEGER(IntKi), PARAMETER :: M97N1TAye = 17794 + INTEGER(IntKi), PARAMETER :: M97N2TAye = 17795 + INTEGER(IntKi), PARAMETER :: M97N3TAye = 17796 + INTEGER(IntKi), PARAMETER :: M97N4TAye = 17797 + INTEGER(IntKi), PARAMETER :: M97N5TAye = 17798 + INTEGER(IntKi), PARAMETER :: M97N6TAye = 17799 + INTEGER(IntKi), PARAMETER :: M97N7TAye = 17800 + INTEGER(IntKi), PARAMETER :: M97N8TAye = 17801 + INTEGER(IntKi), PARAMETER :: M97N9TAye = 17802 + INTEGER(IntKi), PARAMETER :: M98N1TAye = 17803 + INTEGER(IntKi), PARAMETER :: M98N2TAye = 17804 + INTEGER(IntKi), PARAMETER :: M98N3TAye = 17805 + INTEGER(IntKi), PARAMETER :: M98N4TAye = 17806 + INTEGER(IntKi), PARAMETER :: M98N5TAye = 17807 + INTEGER(IntKi), PARAMETER :: M98N6TAye = 17808 + INTEGER(IntKi), PARAMETER :: M98N7TAye = 17809 + INTEGER(IntKi), PARAMETER :: M98N8TAye = 17810 + INTEGER(IntKi), PARAMETER :: M98N9TAye = 17811 + INTEGER(IntKi), PARAMETER :: M99N1TAye = 17812 + INTEGER(IntKi), PARAMETER :: M99N2TAye = 17813 + INTEGER(IntKi), PARAMETER :: M99N3TAye = 17814 + INTEGER(IntKi), PARAMETER :: M99N4TAye = 17815 + INTEGER(IntKi), PARAMETER :: M99N5TAye = 17816 + INTEGER(IntKi), PARAMETER :: M99N6TAye = 17817 + INTEGER(IntKi), PARAMETER :: M99N7TAye = 17818 + INTEGER(IntKi), PARAMETER :: M99N8TAye = 17819 + INTEGER(IntKi), PARAMETER :: M99N9TAye = 17820 + INTEGER(IntKi), PARAMETER :: M01N1TAze = 17821 + INTEGER(IntKi), PARAMETER :: M01N2TAze = 17822 + INTEGER(IntKi), PARAMETER :: M01N3TAze = 17823 + INTEGER(IntKi), PARAMETER :: M01N4TAze = 17824 + INTEGER(IntKi), PARAMETER :: M01N5TAze = 17825 + INTEGER(IntKi), PARAMETER :: M01N6TAze = 17826 + INTEGER(IntKi), PARAMETER :: M01N7TAze = 17827 + INTEGER(IntKi), PARAMETER :: M01N8TAze = 17828 + INTEGER(IntKi), PARAMETER :: M01N9TAze = 17829 + INTEGER(IntKi), PARAMETER :: M02N1TAze = 17830 + INTEGER(IntKi), PARAMETER :: M02N2TAze = 17831 + INTEGER(IntKi), PARAMETER :: M02N3TAze = 17832 + INTEGER(IntKi), PARAMETER :: M02N4TAze = 17833 + INTEGER(IntKi), PARAMETER :: M02N5TAze = 17834 + INTEGER(IntKi), PARAMETER :: M02N6TAze = 17835 + INTEGER(IntKi), PARAMETER :: M02N7TAze = 17836 + INTEGER(IntKi), PARAMETER :: M02N8TAze = 17837 + INTEGER(IntKi), PARAMETER :: M02N9TAze = 17838 + INTEGER(IntKi), PARAMETER :: M03N1TAze = 17839 + INTEGER(IntKi), PARAMETER :: M03N2TAze = 17840 + INTEGER(IntKi), PARAMETER :: M03N3TAze = 17841 + INTEGER(IntKi), PARAMETER :: M03N4TAze = 17842 + INTEGER(IntKi), PARAMETER :: M03N5TAze = 17843 + INTEGER(IntKi), PARAMETER :: M03N6TAze = 17844 + INTEGER(IntKi), PARAMETER :: M03N7TAze = 17845 + INTEGER(IntKi), PARAMETER :: M03N8TAze = 17846 + INTEGER(IntKi), PARAMETER :: M03N9TAze = 17847 + INTEGER(IntKi), PARAMETER :: M04N1TAze = 17848 + INTEGER(IntKi), PARAMETER :: M04N2TAze = 17849 + INTEGER(IntKi), PARAMETER :: M04N3TAze = 17850 + INTEGER(IntKi), PARAMETER :: M04N4TAze = 17851 + INTEGER(IntKi), PARAMETER :: M04N5TAze = 17852 + INTEGER(IntKi), PARAMETER :: M04N6TAze = 17853 + INTEGER(IntKi), PARAMETER :: M04N7TAze = 17854 + INTEGER(IntKi), PARAMETER :: M04N8TAze = 17855 + INTEGER(IntKi), PARAMETER :: M04N9TAze = 17856 + INTEGER(IntKi), PARAMETER :: M05N1TAze = 17857 + INTEGER(IntKi), PARAMETER :: M05N2TAze = 17858 + INTEGER(IntKi), PARAMETER :: M05N3TAze = 17859 + INTEGER(IntKi), PARAMETER :: M05N4TAze = 17860 + INTEGER(IntKi), PARAMETER :: M05N5TAze = 17861 + INTEGER(IntKi), PARAMETER :: M05N6TAze = 17862 + INTEGER(IntKi), PARAMETER :: M05N7TAze = 17863 + INTEGER(IntKi), PARAMETER :: M05N8TAze = 17864 + INTEGER(IntKi), PARAMETER :: M05N9TAze = 17865 + INTEGER(IntKi), PARAMETER :: M06N1TAze = 17866 + INTEGER(IntKi), PARAMETER :: M06N2TAze = 17867 + INTEGER(IntKi), PARAMETER :: M06N3TAze = 17868 + INTEGER(IntKi), PARAMETER :: M06N4TAze = 17869 + INTEGER(IntKi), PARAMETER :: M06N5TAze = 17870 + INTEGER(IntKi), PARAMETER :: M06N6TAze = 17871 + INTEGER(IntKi), PARAMETER :: M06N7TAze = 17872 + INTEGER(IntKi), PARAMETER :: M06N8TAze = 17873 + INTEGER(IntKi), PARAMETER :: M06N9TAze = 17874 + INTEGER(IntKi), PARAMETER :: M07N1TAze = 17875 + INTEGER(IntKi), PARAMETER :: M07N2TAze = 17876 + INTEGER(IntKi), PARAMETER :: M07N3TAze = 17877 + INTEGER(IntKi), PARAMETER :: M07N4TAze = 17878 + INTEGER(IntKi), PARAMETER :: M07N5TAze = 17879 + INTEGER(IntKi), PARAMETER :: M07N6TAze = 17880 + INTEGER(IntKi), PARAMETER :: M07N7TAze = 17881 + INTEGER(IntKi), PARAMETER :: M07N8TAze = 17882 + INTEGER(IntKi), PARAMETER :: M07N9TAze = 17883 + INTEGER(IntKi), PARAMETER :: M08N1TAze = 17884 + INTEGER(IntKi), PARAMETER :: M08N2TAze = 17885 + INTEGER(IntKi), PARAMETER :: M08N3TAze = 17886 + INTEGER(IntKi), PARAMETER :: M08N4TAze = 17887 + INTEGER(IntKi), PARAMETER :: M08N5TAze = 17888 + INTEGER(IntKi), PARAMETER :: M08N6TAze = 17889 + INTEGER(IntKi), PARAMETER :: M08N7TAze = 17890 + INTEGER(IntKi), PARAMETER :: M08N8TAze = 17891 + INTEGER(IntKi), PARAMETER :: M08N9TAze = 17892 + INTEGER(IntKi), PARAMETER :: M09N1TAze = 17893 + INTEGER(IntKi), PARAMETER :: M09N2TAze = 17894 + INTEGER(IntKi), PARAMETER :: M09N3TAze = 17895 + INTEGER(IntKi), PARAMETER :: M09N4TAze = 17896 + INTEGER(IntKi), PARAMETER :: M09N5TAze = 17897 + INTEGER(IntKi), PARAMETER :: M09N6TAze = 17898 + INTEGER(IntKi), PARAMETER :: M09N7TAze = 17899 + INTEGER(IntKi), PARAMETER :: M09N8TAze = 17900 + INTEGER(IntKi), PARAMETER :: M09N9TAze = 17901 + INTEGER(IntKi), PARAMETER :: M10N1TAze = 17902 + INTEGER(IntKi), PARAMETER :: M10N2TAze = 17903 + INTEGER(IntKi), PARAMETER :: M10N3TAze = 17904 + INTEGER(IntKi), PARAMETER :: M10N4TAze = 17905 + INTEGER(IntKi), PARAMETER :: M10N5TAze = 17906 + INTEGER(IntKi), PARAMETER :: M10N6TAze = 17907 + INTEGER(IntKi), PARAMETER :: M10N7TAze = 17908 + INTEGER(IntKi), PARAMETER :: M10N8TAze = 17909 + INTEGER(IntKi), PARAMETER :: M10N9TAze = 17910 + INTEGER(IntKi), PARAMETER :: M11N1TAze = 17911 + INTEGER(IntKi), PARAMETER :: M11N2TAze = 17912 + INTEGER(IntKi), PARAMETER :: M11N3TAze = 17913 + INTEGER(IntKi), PARAMETER :: M11N4TAze = 17914 + INTEGER(IntKi), PARAMETER :: M11N5TAze = 17915 + INTEGER(IntKi), PARAMETER :: M11N6TAze = 17916 + INTEGER(IntKi), PARAMETER :: M11N7TAze = 17917 + INTEGER(IntKi), PARAMETER :: M11N8TAze = 17918 + INTEGER(IntKi), PARAMETER :: M11N9TAze = 17919 + INTEGER(IntKi), PARAMETER :: M12N1TAze = 17920 + INTEGER(IntKi), PARAMETER :: M12N2TAze = 17921 + INTEGER(IntKi), PARAMETER :: M12N3TAze = 17922 + INTEGER(IntKi), PARAMETER :: M12N4TAze = 17923 + INTEGER(IntKi), PARAMETER :: M12N5TAze = 17924 + INTEGER(IntKi), PARAMETER :: M12N6TAze = 17925 + INTEGER(IntKi), PARAMETER :: M12N7TAze = 17926 + INTEGER(IntKi), PARAMETER :: M12N8TAze = 17927 + INTEGER(IntKi), PARAMETER :: M12N9TAze = 17928 + INTEGER(IntKi), PARAMETER :: M13N1TAze = 17929 + INTEGER(IntKi), PARAMETER :: M13N2TAze = 17930 + INTEGER(IntKi), PARAMETER :: M13N3TAze = 17931 + INTEGER(IntKi), PARAMETER :: M13N4TAze = 17932 + INTEGER(IntKi), PARAMETER :: M13N5TAze = 17933 + INTEGER(IntKi), PARAMETER :: M13N6TAze = 17934 + INTEGER(IntKi), PARAMETER :: M13N7TAze = 17935 + INTEGER(IntKi), PARAMETER :: M13N8TAze = 17936 + INTEGER(IntKi), PARAMETER :: M13N9TAze = 17937 + INTEGER(IntKi), PARAMETER :: M14N1TAze = 17938 + INTEGER(IntKi), PARAMETER :: M14N2TAze = 17939 + INTEGER(IntKi), PARAMETER :: M14N3TAze = 17940 + INTEGER(IntKi), PARAMETER :: M14N4TAze = 17941 + INTEGER(IntKi), PARAMETER :: M14N5TAze = 17942 + INTEGER(IntKi), PARAMETER :: M14N6TAze = 17943 + INTEGER(IntKi), PARAMETER :: M14N7TAze = 17944 + INTEGER(IntKi), PARAMETER :: M14N8TAze = 17945 + INTEGER(IntKi), PARAMETER :: M14N9TAze = 17946 + INTEGER(IntKi), PARAMETER :: M15N1TAze = 17947 + INTEGER(IntKi), PARAMETER :: M15N2TAze = 17948 + INTEGER(IntKi), PARAMETER :: M15N3TAze = 17949 + INTEGER(IntKi), PARAMETER :: M15N4TAze = 17950 + INTEGER(IntKi), PARAMETER :: M15N5TAze = 17951 + INTEGER(IntKi), PARAMETER :: M15N6TAze = 17952 + INTEGER(IntKi), PARAMETER :: M15N7TAze = 17953 + INTEGER(IntKi), PARAMETER :: M15N8TAze = 17954 + INTEGER(IntKi), PARAMETER :: M15N9TAze = 17955 + INTEGER(IntKi), PARAMETER :: M16N1TAze = 17956 + INTEGER(IntKi), PARAMETER :: M16N2TAze = 17957 + INTEGER(IntKi), PARAMETER :: M16N3TAze = 17958 + INTEGER(IntKi), PARAMETER :: M16N4TAze = 17959 + INTEGER(IntKi), PARAMETER :: M16N5TAze = 17960 + INTEGER(IntKi), PARAMETER :: M16N6TAze = 17961 + INTEGER(IntKi), PARAMETER :: M16N7TAze = 17962 + INTEGER(IntKi), PARAMETER :: M16N8TAze = 17963 + INTEGER(IntKi), PARAMETER :: M16N9TAze = 17964 + INTEGER(IntKi), PARAMETER :: M17N1TAze = 17965 + INTEGER(IntKi), PARAMETER :: M17N2TAze = 17966 + INTEGER(IntKi), PARAMETER :: M17N3TAze = 17967 + INTEGER(IntKi), PARAMETER :: M17N4TAze = 17968 + INTEGER(IntKi), PARAMETER :: M17N5TAze = 17969 + INTEGER(IntKi), PARAMETER :: M17N6TAze = 17970 + INTEGER(IntKi), PARAMETER :: M17N7TAze = 17971 + INTEGER(IntKi), PARAMETER :: M17N8TAze = 17972 + INTEGER(IntKi), PARAMETER :: M17N9TAze = 17973 + INTEGER(IntKi), PARAMETER :: M18N1TAze = 17974 + INTEGER(IntKi), PARAMETER :: M18N2TAze = 17975 + INTEGER(IntKi), PARAMETER :: M18N3TAze = 17976 + INTEGER(IntKi), PARAMETER :: M18N4TAze = 17977 + INTEGER(IntKi), PARAMETER :: M18N5TAze = 17978 + INTEGER(IntKi), PARAMETER :: M18N6TAze = 17979 + INTEGER(IntKi), PARAMETER :: M18N7TAze = 17980 + INTEGER(IntKi), PARAMETER :: M18N8TAze = 17981 + INTEGER(IntKi), PARAMETER :: M18N9TAze = 17982 + INTEGER(IntKi), PARAMETER :: M19N1TAze = 17983 + INTEGER(IntKi), PARAMETER :: M19N2TAze = 17984 + INTEGER(IntKi), PARAMETER :: M19N3TAze = 17985 + INTEGER(IntKi), PARAMETER :: M19N4TAze = 17986 + INTEGER(IntKi), PARAMETER :: M19N5TAze = 17987 + INTEGER(IntKi), PARAMETER :: M19N6TAze = 17988 + INTEGER(IntKi), PARAMETER :: M19N7TAze = 17989 + INTEGER(IntKi), PARAMETER :: M19N8TAze = 17990 + INTEGER(IntKi), PARAMETER :: M19N9TAze = 17991 + INTEGER(IntKi), PARAMETER :: M20N1TAze = 17992 + INTEGER(IntKi), PARAMETER :: M20N2TAze = 17993 + INTEGER(IntKi), PARAMETER :: M20N3TAze = 17994 + INTEGER(IntKi), PARAMETER :: M20N4TAze = 17995 + INTEGER(IntKi), PARAMETER :: M20N5TAze = 17996 + INTEGER(IntKi), PARAMETER :: M20N6TAze = 17997 + INTEGER(IntKi), PARAMETER :: M20N7TAze = 17998 + INTEGER(IntKi), PARAMETER :: M20N8TAze = 17999 + INTEGER(IntKi), PARAMETER :: M20N9TAze = 18000 + INTEGER(IntKi), PARAMETER :: M21N1TAze = 18001 + INTEGER(IntKi), PARAMETER :: M21N2TAze = 18002 + INTEGER(IntKi), PARAMETER :: M21N3TAze = 18003 + INTEGER(IntKi), PARAMETER :: M21N4TAze = 18004 + INTEGER(IntKi), PARAMETER :: M21N5TAze = 18005 + INTEGER(IntKi), PARAMETER :: M21N6TAze = 18006 + INTEGER(IntKi), PARAMETER :: M21N7TAze = 18007 + INTEGER(IntKi), PARAMETER :: M21N8TAze = 18008 + INTEGER(IntKi), PARAMETER :: M21N9TAze = 18009 + INTEGER(IntKi), PARAMETER :: M22N1TAze = 18010 + INTEGER(IntKi), PARAMETER :: M22N2TAze = 18011 + INTEGER(IntKi), PARAMETER :: M22N3TAze = 18012 + INTEGER(IntKi), PARAMETER :: M22N4TAze = 18013 + INTEGER(IntKi), PARAMETER :: M22N5TAze = 18014 + INTEGER(IntKi), PARAMETER :: M22N6TAze = 18015 + INTEGER(IntKi), PARAMETER :: M22N7TAze = 18016 + INTEGER(IntKi), PARAMETER :: M22N8TAze = 18017 + INTEGER(IntKi), PARAMETER :: M22N9TAze = 18018 + INTEGER(IntKi), PARAMETER :: M23N1TAze = 18019 + INTEGER(IntKi), PARAMETER :: M23N2TAze = 18020 + INTEGER(IntKi), PARAMETER :: M23N3TAze = 18021 + INTEGER(IntKi), PARAMETER :: M23N4TAze = 18022 + INTEGER(IntKi), PARAMETER :: M23N5TAze = 18023 + INTEGER(IntKi), PARAMETER :: M23N6TAze = 18024 + INTEGER(IntKi), PARAMETER :: M23N7TAze = 18025 + INTEGER(IntKi), PARAMETER :: M23N8TAze = 18026 + INTEGER(IntKi), PARAMETER :: M23N9TAze = 18027 + INTEGER(IntKi), PARAMETER :: M24N1TAze = 18028 + INTEGER(IntKi), PARAMETER :: M24N2TAze = 18029 + INTEGER(IntKi), PARAMETER :: M24N3TAze = 18030 + INTEGER(IntKi), PARAMETER :: M24N4TAze = 18031 + INTEGER(IntKi), PARAMETER :: M24N5TAze = 18032 + INTEGER(IntKi), PARAMETER :: M24N6TAze = 18033 + INTEGER(IntKi), PARAMETER :: M24N7TAze = 18034 + INTEGER(IntKi), PARAMETER :: M24N8TAze = 18035 + INTEGER(IntKi), PARAMETER :: M24N9TAze = 18036 + INTEGER(IntKi), PARAMETER :: M25N1TAze = 18037 + INTEGER(IntKi), PARAMETER :: M25N2TAze = 18038 + INTEGER(IntKi), PARAMETER :: M25N3TAze = 18039 + INTEGER(IntKi), PARAMETER :: M25N4TAze = 18040 + INTEGER(IntKi), PARAMETER :: M25N5TAze = 18041 + INTEGER(IntKi), PARAMETER :: M25N6TAze = 18042 + INTEGER(IntKi), PARAMETER :: M25N7TAze = 18043 + INTEGER(IntKi), PARAMETER :: M25N8TAze = 18044 + INTEGER(IntKi), PARAMETER :: M25N9TAze = 18045 + INTEGER(IntKi), PARAMETER :: M26N1TAze = 18046 + INTEGER(IntKi), PARAMETER :: M26N2TAze = 18047 + INTEGER(IntKi), PARAMETER :: M26N3TAze = 18048 + INTEGER(IntKi), PARAMETER :: M26N4TAze = 18049 + INTEGER(IntKi), PARAMETER :: M26N5TAze = 18050 + INTEGER(IntKi), PARAMETER :: M26N6TAze = 18051 + INTEGER(IntKi), PARAMETER :: M26N7TAze = 18052 + INTEGER(IntKi), PARAMETER :: M26N8TAze = 18053 + INTEGER(IntKi), PARAMETER :: M26N9TAze = 18054 + INTEGER(IntKi), PARAMETER :: M27N1TAze = 18055 + INTEGER(IntKi), PARAMETER :: M27N2TAze = 18056 + INTEGER(IntKi), PARAMETER :: M27N3TAze = 18057 + INTEGER(IntKi), PARAMETER :: M27N4TAze = 18058 + INTEGER(IntKi), PARAMETER :: M27N5TAze = 18059 + INTEGER(IntKi), PARAMETER :: M27N6TAze = 18060 + INTEGER(IntKi), PARAMETER :: M27N7TAze = 18061 + INTEGER(IntKi), PARAMETER :: M27N8TAze = 18062 + INTEGER(IntKi), PARAMETER :: M27N9TAze = 18063 + INTEGER(IntKi), PARAMETER :: M28N1TAze = 18064 + INTEGER(IntKi), PARAMETER :: M28N2TAze = 18065 + INTEGER(IntKi), PARAMETER :: M28N3TAze = 18066 + INTEGER(IntKi), PARAMETER :: M28N4TAze = 18067 + INTEGER(IntKi), PARAMETER :: M28N5TAze = 18068 + INTEGER(IntKi), PARAMETER :: M28N6TAze = 18069 + INTEGER(IntKi), PARAMETER :: M28N7TAze = 18070 + INTEGER(IntKi), PARAMETER :: M28N8TAze = 18071 + INTEGER(IntKi), PARAMETER :: M28N9TAze = 18072 + INTEGER(IntKi), PARAMETER :: M29N1TAze = 18073 + INTEGER(IntKi), PARAMETER :: M29N2TAze = 18074 + INTEGER(IntKi), PARAMETER :: M29N3TAze = 18075 + INTEGER(IntKi), PARAMETER :: M29N4TAze = 18076 + INTEGER(IntKi), PARAMETER :: M29N5TAze = 18077 + INTEGER(IntKi), PARAMETER :: M29N6TAze = 18078 + INTEGER(IntKi), PARAMETER :: M29N7TAze = 18079 + INTEGER(IntKi), PARAMETER :: M29N8TAze = 18080 + INTEGER(IntKi), PARAMETER :: M29N9TAze = 18081 + INTEGER(IntKi), PARAMETER :: M30N1TAze = 18082 + INTEGER(IntKi), PARAMETER :: M30N2TAze = 18083 + INTEGER(IntKi), PARAMETER :: M30N3TAze = 18084 + INTEGER(IntKi), PARAMETER :: M30N4TAze = 18085 + INTEGER(IntKi), PARAMETER :: M30N5TAze = 18086 + INTEGER(IntKi), PARAMETER :: M30N6TAze = 18087 + INTEGER(IntKi), PARAMETER :: M30N7TAze = 18088 + INTEGER(IntKi), PARAMETER :: M30N8TAze = 18089 + INTEGER(IntKi), PARAMETER :: M30N9TAze = 18090 + INTEGER(IntKi), PARAMETER :: M31N1TAze = 18091 + INTEGER(IntKi), PARAMETER :: M31N2TAze = 18092 + INTEGER(IntKi), PARAMETER :: M31N3TAze = 18093 + INTEGER(IntKi), PARAMETER :: M31N4TAze = 18094 + INTEGER(IntKi), PARAMETER :: M31N5TAze = 18095 + INTEGER(IntKi), PARAMETER :: M31N6TAze = 18096 + INTEGER(IntKi), PARAMETER :: M31N7TAze = 18097 + INTEGER(IntKi), PARAMETER :: M31N8TAze = 18098 + INTEGER(IntKi), PARAMETER :: M31N9TAze = 18099 + INTEGER(IntKi), PARAMETER :: M32N1TAze = 18100 + INTEGER(IntKi), PARAMETER :: M32N2TAze = 18101 + INTEGER(IntKi), PARAMETER :: M32N3TAze = 18102 + INTEGER(IntKi), PARAMETER :: M32N4TAze = 18103 + INTEGER(IntKi), PARAMETER :: M32N5TAze = 18104 + INTEGER(IntKi), PARAMETER :: M32N6TAze = 18105 + INTEGER(IntKi), PARAMETER :: M32N7TAze = 18106 + INTEGER(IntKi), PARAMETER :: M32N8TAze = 18107 + INTEGER(IntKi), PARAMETER :: M32N9TAze = 18108 + INTEGER(IntKi), PARAMETER :: M33N1TAze = 18109 + INTEGER(IntKi), PARAMETER :: M33N2TAze = 18110 + INTEGER(IntKi), PARAMETER :: M33N3TAze = 18111 + INTEGER(IntKi), PARAMETER :: M33N4TAze = 18112 + INTEGER(IntKi), PARAMETER :: M33N5TAze = 18113 + INTEGER(IntKi), PARAMETER :: M33N6TAze = 18114 + INTEGER(IntKi), PARAMETER :: M33N7TAze = 18115 + INTEGER(IntKi), PARAMETER :: M33N8TAze = 18116 + INTEGER(IntKi), PARAMETER :: M33N9TAze = 18117 + INTEGER(IntKi), PARAMETER :: M34N1TAze = 18118 + INTEGER(IntKi), PARAMETER :: M34N2TAze = 18119 + INTEGER(IntKi), PARAMETER :: M34N3TAze = 18120 + INTEGER(IntKi), PARAMETER :: M34N4TAze = 18121 + INTEGER(IntKi), PARAMETER :: M34N5TAze = 18122 + INTEGER(IntKi), PARAMETER :: M34N6TAze = 18123 + INTEGER(IntKi), PARAMETER :: M34N7TAze = 18124 + INTEGER(IntKi), PARAMETER :: M34N8TAze = 18125 + INTEGER(IntKi), PARAMETER :: M34N9TAze = 18126 + INTEGER(IntKi), PARAMETER :: M35N1TAze = 18127 + INTEGER(IntKi), PARAMETER :: M35N2TAze = 18128 + INTEGER(IntKi), PARAMETER :: M35N3TAze = 18129 + INTEGER(IntKi), PARAMETER :: M35N4TAze = 18130 + INTEGER(IntKi), PARAMETER :: M35N5TAze = 18131 + INTEGER(IntKi), PARAMETER :: M35N6TAze = 18132 + INTEGER(IntKi), PARAMETER :: M35N7TAze = 18133 + INTEGER(IntKi), PARAMETER :: M35N8TAze = 18134 + INTEGER(IntKi), PARAMETER :: M35N9TAze = 18135 + INTEGER(IntKi), PARAMETER :: M36N1TAze = 18136 + INTEGER(IntKi), PARAMETER :: M36N2TAze = 18137 + INTEGER(IntKi), PARAMETER :: M36N3TAze = 18138 + INTEGER(IntKi), PARAMETER :: M36N4TAze = 18139 + INTEGER(IntKi), PARAMETER :: M36N5TAze = 18140 + INTEGER(IntKi), PARAMETER :: M36N6TAze = 18141 + INTEGER(IntKi), PARAMETER :: M36N7TAze = 18142 + INTEGER(IntKi), PARAMETER :: M36N8TAze = 18143 + INTEGER(IntKi), PARAMETER :: M36N9TAze = 18144 + INTEGER(IntKi), PARAMETER :: M37N1TAze = 18145 + INTEGER(IntKi), PARAMETER :: M37N2TAze = 18146 + INTEGER(IntKi), PARAMETER :: M37N3TAze = 18147 + INTEGER(IntKi), PARAMETER :: M37N4TAze = 18148 + INTEGER(IntKi), PARAMETER :: M37N5TAze = 18149 + INTEGER(IntKi), PARAMETER :: M37N6TAze = 18150 + INTEGER(IntKi), PARAMETER :: M37N7TAze = 18151 + INTEGER(IntKi), PARAMETER :: M37N8TAze = 18152 + INTEGER(IntKi), PARAMETER :: M37N9TAze = 18153 + INTEGER(IntKi), PARAMETER :: M38N1TAze = 18154 + INTEGER(IntKi), PARAMETER :: M38N2TAze = 18155 + INTEGER(IntKi), PARAMETER :: M38N3TAze = 18156 + INTEGER(IntKi), PARAMETER :: M38N4TAze = 18157 + INTEGER(IntKi), PARAMETER :: M38N5TAze = 18158 + INTEGER(IntKi), PARAMETER :: M38N6TAze = 18159 + INTEGER(IntKi), PARAMETER :: M38N7TAze = 18160 + INTEGER(IntKi), PARAMETER :: M38N8TAze = 18161 + INTEGER(IntKi), PARAMETER :: M38N9TAze = 18162 + INTEGER(IntKi), PARAMETER :: M39N1TAze = 18163 + INTEGER(IntKi), PARAMETER :: M39N2TAze = 18164 + INTEGER(IntKi), PARAMETER :: M39N3TAze = 18165 + INTEGER(IntKi), PARAMETER :: M39N4TAze = 18166 + INTEGER(IntKi), PARAMETER :: M39N5TAze = 18167 + INTEGER(IntKi), PARAMETER :: M39N6TAze = 18168 + INTEGER(IntKi), PARAMETER :: M39N7TAze = 18169 + INTEGER(IntKi), PARAMETER :: M39N8TAze = 18170 + INTEGER(IntKi), PARAMETER :: M39N9TAze = 18171 + INTEGER(IntKi), PARAMETER :: M40N1TAze = 18172 + INTEGER(IntKi), PARAMETER :: M40N2TAze = 18173 + INTEGER(IntKi), PARAMETER :: M40N3TAze = 18174 + INTEGER(IntKi), PARAMETER :: M40N4TAze = 18175 + INTEGER(IntKi), PARAMETER :: M40N5TAze = 18176 + INTEGER(IntKi), PARAMETER :: M40N6TAze = 18177 + INTEGER(IntKi), PARAMETER :: M40N7TAze = 18178 + INTEGER(IntKi), PARAMETER :: M40N8TAze = 18179 + INTEGER(IntKi), PARAMETER :: M40N9TAze = 18180 + INTEGER(IntKi), PARAMETER :: M41N1TAze = 18181 + INTEGER(IntKi), PARAMETER :: M41N2TAze = 18182 + INTEGER(IntKi), PARAMETER :: M41N3TAze = 18183 + INTEGER(IntKi), PARAMETER :: M41N4TAze = 18184 + INTEGER(IntKi), PARAMETER :: M41N5TAze = 18185 + INTEGER(IntKi), PARAMETER :: M41N6TAze = 18186 + INTEGER(IntKi), PARAMETER :: M41N7TAze = 18187 + INTEGER(IntKi), PARAMETER :: M41N8TAze = 18188 + INTEGER(IntKi), PARAMETER :: M41N9TAze = 18189 + INTEGER(IntKi), PARAMETER :: M42N1TAze = 18190 + INTEGER(IntKi), PARAMETER :: M42N2TAze = 18191 + INTEGER(IntKi), PARAMETER :: M42N3TAze = 18192 + INTEGER(IntKi), PARAMETER :: M42N4TAze = 18193 + INTEGER(IntKi), PARAMETER :: M42N5TAze = 18194 + INTEGER(IntKi), PARAMETER :: M42N6TAze = 18195 + INTEGER(IntKi), PARAMETER :: M42N7TAze = 18196 + INTEGER(IntKi), PARAMETER :: M42N8TAze = 18197 + INTEGER(IntKi), PARAMETER :: M42N9TAze = 18198 + INTEGER(IntKi), PARAMETER :: M43N1TAze = 18199 + INTEGER(IntKi), PARAMETER :: M43N2TAze = 18200 + INTEGER(IntKi), PARAMETER :: M43N3TAze = 18201 + INTEGER(IntKi), PARAMETER :: M43N4TAze = 18202 + INTEGER(IntKi), PARAMETER :: M43N5TAze = 18203 + INTEGER(IntKi), PARAMETER :: M43N6TAze = 18204 + INTEGER(IntKi), PARAMETER :: M43N7TAze = 18205 + INTEGER(IntKi), PARAMETER :: M43N8TAze = 18206 + INTEGER(IntKi), PARAMETER :: M43N9TAze = 18207 + INTEGER(IntKi), PARAMETER :: M44N1TAze = 18208 + INTEGER(IntKi), PARAMETER :: M44N2TAze = 18209 + INTEGER(IntKi), PARAMETER :: M44N3TAze = 18210 + INTEGER(IntKi), PARAMETER :: M44N4TAze = 18211 + INTEGER(IntKi), PARAMETER :: M44N5TAze = 18212 + INTEGER(IntKi), PARAMETER :: M44N6TAze = 18213 + INTEGER(IntKi), PARAMETER :: M44N7TAze = 18214 + INTEGER(IntKi), PARAMETER :: M44N8TAze = 18215 + INTEGER(IntKi), PARAMETER :: M44N9TAze = 18216 + INTEGER(IntKi), PARAMETER :: M45N1TAze = 18217 + INTEGER(IntKi), PARAMETER :: M45N2TAze = 18218 + INTEGER(IntKi), PARAMETER :: M45N3TAze = 18219 + INTEGER(IntKi), PARAMETER :: M45N4TAze = 18220 + INTEGER(IntKi), PARAMETER :: M45N5TAze = 18221 + INTEGER(IntKi), PARAMETER :: M45N6TAze = 18222 + INTEGER(IntKi), PARAMETER :: M45N7TAze = 18223 + INTEGER(IntKi), PARAMETER :: M45N8TAze = 18224 + INTEGER(IntKi), PARAMETER :: M45N9TAze = 18225 + INTEGER(IntKi), PARAMETER :: M46N1TAze = 18226 + INTEGER(IntKi), PARAMETER :: M46N2TAze = 18227 + INTEGER(IntKi), PARAMETER :: M46N3TAze = 18228 + INTEGER(IntKi), PARAMETER :: M46N4TAze = 18229 + INTEGER(IntKi), PARAMETER :: M46N5TAze = 18230 + INTEGER(IntKi), PARAMETER :: M46N6TAze = 18231 + INTEGER(IntKi), PARAMETER :: M46N7TAze = 18232 + INTEGER(IntKi), PARAMETER :: M46N8TAze = 18233 + INTEGER(IntKi), PARAMETER :: M46N9TAze = 18234 + INTEGER(IntKi), PARAMETER :: M47N1TAze = 18235 + INTEGER(IntKi), PARAMETER :: M47N2TAze = 18236 + INTEGER(IntKi), PARAMETER :: M47N3TAze = 18237 + INTEGER(IntKi), PARAMETER :: M47N4TAze = 18238 + INTEGER(IntKi), PARAMETER :: M47N5TAze = 18239 + INTEGER(IntKi), PARAMETER :: M47N6TAze = 18240 + INTEGER(IntKi), PARAMETER :: M47N7TAze = 18241 + INTEGER(IntKi), PARAMETER :: M47N8TAze = 18242 + INTEGER(IntKi), PARAMETER :: M47N9TAze = 18243 + INTEGER(IntKi), PARAMETER :: M48N1TAze = 18244 + INTEGER(IntKi), PARAMETER :: M48N2TAze = 18245 + INTEGER(IntKi), PARAMETER :: M48N3TAze = 18246 + INTEGER(IntKi), PARAMETER :: M48N4TAze = 18247 + INTEGER(IntKi), PARAMETER :: M48N5TAze = 18248 + INTEGER(IntKi), PARAMETER :: M48N6TAze = 18249 + INTEGER(IntKi), PARAMETER :: M48N7TAze = 18250 + INTEGER(IntKi), PARAMETER :: M48N8TAze = 18251 + INTEGER(IntKi), PARAMETER :: M48N9TAze = 18252 + INTEGER(IntKi), PARAMETER :: M49N1TAze = 18253 + INTEGER(IntKi), PARAMETER :: M49N2TAze = 18254 + INTEGER(IntKi), PARAMETER :: M49N3TAze = 18255 + INTEGER(IntKi), PARAMETER :: M49N4TAze = 18256 + INTEGER(IntKi), PARAMETER :: M49N5TAze = 18257 + INTEGER(IntKi), PARAMETER :: M49N6TAze = 18258 + INTEGER(IntKi), PARAMETER :: M49N7TAze = 18259 + INTEGER(IntKi), PARAMETER :: M49N8TAze = 18260 + INTEGER(IntKi), PARAMETER :: M49N9TAze = 18261 + INTEGER(IntKi), PARAMETER :: M50N1TAze = 18262 + INTEGER(IntKi), PARAMETER :: M50N2TAze = 18263 + INTEGER(IntKi), PARAMETER :: M50N3TAze = 18264 + INTEGER(IntKi), PARAMETER :: M50N4TAze = 18265 + INTEGER(IntKi), PARAMETER :: M50N5TAze = 18266 + INTEGER(IntKi), PARAMETER :: M50N6TAze = 18267 + INTEGER(IntKi), PARAMETER :: M50N7TAze = 18268 + INTEGER(IntKi), PARAMETER :: M50N8TAze = 18269 + INTEGER(IntKi), PARAMETER :: M50N9TAze = 18270 + INTEGER(IntKi), PARAMETER :: M51N1TAze = 18271 + INTEGER(IntKi), PARAMETER :: M51N2TAze = 18272 + INTEGER(IntKi), PARAMETER :: M51N3TAze = 18273 + INTEGER(IntKi), PARAMETER :: M51N4TAze = 18274 + INTEGER(IntKi), PARAMETER :: M51N5TAze = 18275 + INTEGER(IntKi), PARAMETER :: M51N6TAze = 18276 + INTEGER(IntKi), PARAMETER :: M51N7TAze = 18277 + INTEGER(IntKi), PARAMETER :: M51N8TAze = 18278 + INTEGER(IntKi), PARAMETER :: M51N9TAze = 18279 + INTEGER(IntKi), PARAMETER :: M52N1TAze = 18280 + INTEGER(IntKi), PARAMETER :: M52N2TAze = 18281 + INTEGER(IntKi), PARAMETER :: M52N3TAze = 18282 + INTEGER(IntKi), PARAMETER :: M52N4TAze = 18283 + INTEGER(IntKi), PARAMETER :: M52N5TAze = 18284 + INTEGER(IntKi), PARAMETER :: M52N6TAze = 18285 + INTEGER(IntKi), PARAMETER :: M52N7TAze = 18286 + INTEGER(IntKi), PARAMETER :: M52N8TAze = 18287 + INTEGER(IntKi), PARAMETER :: M52N9TAze = 18288 + INTEGER(IntKi), PARAMETER :: M53N1TAze = 18289 + INTEGER(IntKi), PARAMETER :: M53N2TAze = 18290 + INTEGER(IntKi), PARAMETER :: M53N3TAze = 18291 + INTEGER(IntKi), PARAMETER :: M53N4TAze = 18292 + INTEGER(IntKi), PARAMETER :: M53N5TAze = 18293 + INTEGER(IntKi), PARAMETER :: M53N6TAze = 18294 + INTEGER(IntKi), PARAMETER :: M53N7TAze = 18295 + INTEGER(IntKi), PARAMETER :: M53N8TAze = 18296 + INTEGER(IntKi), PARAMETER :: M53N9TAze = 18297 + INTEGER(IntKi), PARAMETER :: M54N1TAze = 18298 + INTEGER(IntKi), PARAMETER :: M54N2TAze = 18299 + INTEGER(IntKi), PARAMETER :: M54N3TAze = 18300 + INTEGER(IntKi), PARAMETER :: M54N4TAze = 18301 + INTEGER(IntKi), PARAMETER :: M54N5TAze = 18302 + INTEGER(IntKi), PARAMETER :: M54N6TAze = 18303 + INTEGER(IntKi), PARAMETER :: M54N7TAze = 18304 + INTEGER(IntKi), PARAMETER :: M54N8TAze = 18305 + INTEGER(IntKi), PARAMETER :: M54N9TAze = 18306 + INTEGER(IntKi), PARAMETER :: M55N1TAze = 18307 + INTEGER(IntKi), PARAMETER :: M55N2TAze = 18308 + INTEGER(IntKi), PARAMETER :: M55N3TAze = 18309 + INTEGER(IntKi), PARAMETER :: M55N4TAze = 18310 + INTEGER(IntKi), PARAMETER :: M55N5TAze = 18311 + INTEGER(IntKi), PARAMETER :: M55N6TAze = 18312 + INTEGER(IntKi), PARAMETER :: M55N7TAze = 18313 + INTEGER(IntKi), PARAMETER :: M55N8TAze = 18314 + INTEGER(IntKi), PARAMETER :: M55N9TAze = 18315 + INTEGER(IntKi), PARAMETER :: M56N1TAze = 18316 + INTEGER(IntKi), PARAMETER :: M56N2TAze = 18317 + INTEGER(IntKi), PARAMETER :: M56N3TAze = 18318 + INTEGER(IntKi), PARAMETER :: M56N4TAze = 18319 + INTEGER(IntKi), PARAMETER :: M56N5TAze = 18320 + INTEGER(IntKi), PARAMETER :: M56N6TAze = 18321 + INTEGER(IntKi), PARAMETER :: M56N7TAze = 18322 + INTEGER(IntKi), PARAMETER :: M56N8TAze = 18323 + INTEGER(IntKi), PARAMETER :: M56N9TAze = 18324 + INTEGER(IntKi), PARAMETER :: M57N1TAze = 18325 + INTEGER(IntKi), PARAMETER :: M57N2TAze = 18326 + INTEGER(IntKi), PARAMETER :: M57N3TAze = 18327 + INTEGER(IntKi), PARAMETER :: M57N4TAze = 18328 + INTEGER(IntKi), PARAMETER :: M57N5TAze = 18329 + INTEGER(IntKi), PARAMETER :: M57N6TAze = 18330 + INTEGER(IntKi), PARAMETER :: M57N7TAze = 18331 + INTEGER(IntKi), PARAMETER :: M57N8TAze = 18332 + INTEGER(IntKi), PARAMETER :: M57N9TAze = 18333 + INTEGER(IntKi), PARAMETER :: M58N1TAze = 18334 + INTEGER(IntKi), PARAMETER :: M58N2TAze = 18335 + INTEGER(IntKi), PARAMETER :: M58N3TAze = 18336 + INTEGER(IntKi), PARAMETER :: M58N4TAze = 18337 + INTEGER(IntKi), PARAMETER :: M58N5TAze = 18338 + INTEGER(IntKi), PARAMETER :: M58N6TAze = 18339 + INTEGER(IntKi), PARAMETER :: M58N7TAze = 18340 + INTEGER(IntKi), PARAMETER :: M58N8TAze = 18341 + INTEGER(IntKi), PARAMETER :: M58N9TAze = 18342 + INTEGER(IntKi), PARAMETER :: M59N1TAze = 18343 + INTEGER(IntKi), PARAMETER :: M59N2TAze = 18344 + INTEGER(IntKi), PARAMETER :: M59N3TAze = 18345 + INTEGER(IntKi), PARAMETER :: M59N4TAze = 18346 + INTEGER(IntKi), PARAMETER :: M59N5TAze = 18347 + INTEGER(IntKi), PARAMETER :: M59N6TAze = 18348 + INTEGER(IntKi), PARAMETER :: M59N7TAze = 18349 + INTEGER(IntKi), PARAMETER :: M59N8TAze = 18350 + INTEGER(IntKi), PARAMETER :: M59N9TAze = 18351 + INTEGER(IntKi), PARAMETER :: M60N1TAze = 18352 + INTEGER(IntKi), PARAMETER :: M60N2TAze = 18353 + INTEGER(IntKi), PARAMETER :: M60N3TAze = 18354 + INTEGER(IntKi), PARAMETER :: M60N4TAze = 18355 + INTEGER(IntKi), PARAMETER :: M60N5TAze = 18356 + INTEGER(IntKi), PARAMETER :: M60N6TAze = 18357 + INTEGER(IntKi), PARAMETER :: M60N7TAze = 18358 + INTEGER(IntKi), PARAMETER :: M60N8TAze = 18359 + INTEGER(IntKi), PARAMETER :: M60N9TAze = 18360 + INTEGER(IntKi), PARAMETER :: M61N1TAze = 18361 + INTEGER(IntKi), PARAMETER :: M61N2TAze = 18362 + INTEGER(IntKi), PARAMETER :: M61N3TAze = 18363 + INTEGER(IntKi), PARAMETER :: M61N4TAze = 18364 + INTEGER(IntKi), PARAMETER :: M61N5TAze = 18365 + INTEGER(IntKi), PARAMETER :: M61N6TAze = 18366 + INTEGER(IntKi), PARAMETER :: M61N7TAze = 18367 + INTEGER(IntKi), PARAMETER :: M61N8TAze = 18368 + INTEGER(IntKi), PARAMETER :: M61N9TAze = 18369 + INTEGER(IntKi), PARAMETER :: M62N1TAze = 18370 + INTEGER(IntKi), PARAMETER :: M62N2TAze = 18371 + INTEGER(IntKi), PARAMETER :: M62N3TAze = 18372 + INTEGER(IntKi), PARAMETER :: M62N4TAze = 18373 + INTEGER(IntKi), PARAMETER :: M62N5TAze = 18374 + INTEGER(IntKi), PARAMETER :: M62N6TAze = 18375 + INTEGER(IntKi), PARAMETER :: M62N7TAze = 18376 + INTEGER(IntKi), PARAMETER :: M62N8TAze = 18377 + INTEGER(IntKi), PARAMETER :: M62N9TAze = 18378 + INTEGER(IntKi), PARAMETER :: M63N1TAze = 18379 + INTEGER(IntKi), PARAMETER :: M63N2TAze = 18380 + INTEGER(IntKi), PARAMETER :: M63N3TAze = 18381 + INTEGER(IntKi), PARAMETER :: M63N4TAze = 18382 + INTEGER(IntKi), PARAMETER :: M63N5TAze = 18383 + INTEGER(IntKi), PARAMETER :: M63N6TAze = 18384 + INTEGER(IntKi), PARAMETER :: M63N7TAze = 18385 + INTEGER(IntKi), PARAMETER :: M63N8TAze = 18386 + INTEGER(IntKi), PARAMETER :: M63N9TAze = 18387 + INTEGER(IntKi), PARAMETER :: M64N1TAze = 18388 + INTEGER(IntKi), PARAMETER :: M64N2TAze = 18389 + INTEGER(IntKi), PARAMETER :: M64N3TAze = 18390 + INTEGER(IntKi), PARAMETER :: M64N4TAze = 18391 + INTEGER(IntKi), PARAMETER :: M64N5TAze = 18392 + INTEGER(IntKi), PARAMETER :: M64N6TAze = 18393 + INTEGER(IntKi), PARAMETER :: M64N7TAze = 18394 + INTEGER(IntKi), PARAMETER :: M64N8TAze = 18395 + INTEGER(IntKi), PARAMETER :: M64N9TAze = 18396 + INTEGER(IntKi), PARAMETER :: M65N1TAze = 18397 + INTEGER(IntKi), PARAMETER :: M65N2TAze = 18398 + INTEGER(IntKi), PARAMETER :: M65N3TAze = 18399 + INTEGER(IntKi), PARAMETER :: M65N4TAze = 18400 + INTEGER(IntKi), PARAMETER :: M65N5TAze = 18401 + INTEGER(IntKi), PARAMETER :: M65N6TAze = 18402 + INTEGER(IntKi), PARAMETER :: M65N7TAze = 18403 + INTEGER(IntKi), PARAMETER :: M65N8TAze = 18404 + INTEGER(IntKi), PARAMETER :: M65N9TAze = 18405 + INTEGER(IntKi), PARAMETER :: M66N1TAze = 18406 + INTEGER(IntKi), PARAMETER :: M66N2TAze = 18407 + INTEGER(IntKi), PARAMETER :: M66N3TAze = 18408 + INTEGER(IntKi), PARAMETER :: M66N4TAze = 18409 + INTEGER(IntKi), PARAMETER :: M66N5TAze = 18410 + INTEGER(IntKi), PARAMETER :: M66N6TAze = 18411 + INTEGER(IntKi), PARAMETER :: M66N7TAze = 18412 + INTEGER(IntKi), PARAMETER :: M66N8TAze = 18413 + INTEGER(IntKi), PARAMETER :: M66N9TAze = 18414 + INTEGER(IntKi), PARAMETER :: M67N1TAze = 18415 + INTEGER(IntKi), PARAMETER :: M67N2TAze = 18416 + INTEGER(IntKi), PARAMETER :: M67N3TAze = 18417 + INTEGER(IntKi), PARAMETER :: M67N4TAze = 18418 + INTEGER(IntKi), PARAMETER :: M67N5TAze = 18419 + INTEGER(IntKi), PARAMETER :: M67N6TAze = 18420 + INTEGER(IntKi), PARAMETER :: M67N7TAze = 18421 + INTEGER(IntKi), PARAMETER :: M67N8TAze = 18422 + INTEGER(IntKi), PARAMETER :: M67N9TAze = 18423 + INTEGER(IntKi), PARAMETER :: M68N1TAze = 18424 + INTEGER(IntKi), PARAMETER :: M68N2TAze = 18425 + INTEGER(IntKi), PARAMETER :: M68N3TAze = 18426 + INTEGER(IntKi), PARAMETER :: M68N4TAze = 18427 + INTEGER(IntKi), PARAMETER :: M68N5TAze = 18428 + INTEGER(IntKi), PARAMETER :: M68N6TAze = 18429 + INTEGER(IntKi), PARAMETER :: M68N7TAze = 18430 + INTEGER(IntKi), PARAMETER :: M68N8TAze = 18431 + INTEGER(IntKi), PARAMETER :: M68N9TAze = 18432 + INTEGER(IntKi), PARAMETER :: M69N1TAze = 18433 + INTEGER(IntKi), PARAMETER :: M69N2TAze = 18434 + INTEGER(IntKi), PARAMETER :: M69N3TAze = 18435 + INTEGER(IntKi), PARAMETER :: M69N4TAze = 18436 + INTEGER(IntKi), PARAMETER :: M69N5TAze = 18437 + INTEGER(IntKi), PARAMETER :: M69N6TAze = 18438 + INTEGER(IntKi), PARAMETER :: M69N7TAze = 18439 + INTEGER(IntKi), PARAMETER :: M69N8TAze = 18440 + INTEGER(IntKi), PARAMETER :: M69N9TAze = 18441 + INTEGER(IntKi), PARAMETER :: M70N1TAze = 18442 + INTEGER(IntKi), PARAMETER :: M70N2TAze = 18443 + INTEGER(IntKi), PARAMETER :: M70N3TAze = 18444 + INTEGER(IntKi), PARAMETER :: M70N4TAze = 18445 + INTEGER(IntKi), PARAMETER :: M70N5TAze = 18446 + INTEGER(IntKi), PARAMETER :: M70N6TAze = 18447 + INTEGER(IntKi), PARAMETER :: M70N7TAze = 18448 + INTEGER(IntKi), PARAMETER :: M70N8TAze = 18449 + INTEGER(IntKi), PARAMETER :: M70N9TAze = 18450 + INTEGER(IntKi), PARAMETER :: M71N1TAze = 18451 + INTEGER(IntKi), PARAMETER :: M71N2TAze = 18452 + INTEGER(IntKi), PARAMETER :: M71N3TAze = 18453 + INTEGER(IntKi), PARAMETER :: M71N4TAze = 18454 + INTEGER(IntKi), PARAMETER :: M71N5TAze = 18455 + INTEGER(IntKi), PARAMETER :: M71N6TAze = 18456 + INTEGER(IntKi), PARAMETER :: M71N7TAze = 18457 + INTEGER(IntKi), PARAMETER :: M71N8TAze = 18458 + INTEGER(IntKi), PARAMETER :: M71N9TAze = 18459 + INTEGER(IntKi), PARAMETER :: M72N1TAze = 18460 + INTEGER(IntKi), PARAMETER :: M72N2TAze = 18461 + INTEGER(IntKi), PARAMETER :: M72N3TAze = 18462 + INTEGER(IntKi), PARAMETER :: M72N4TAze = 18463 + INTEGER(IntKi), PARAMETER :: M72N5TAze = 18464 + INTEGER(IntKi), PARAMETER :: M72N6TAze = 18465 + INTEGER(IntKi), PARAMETER :: M72N7TAze = 18466 + INTEGER(IntKi), PARAMETER :: M72N8TAze = 18467 + INTEGER(IntKi), PARAMETER :: M72N9TAze = 18468 + INTEGER(IntKi), PARAMETER :: M73N1TAze = 18469 + INTEGER(IntKi), PARAMETER :: M73N2TAze = 18470 + INTEGER(IntKi), PARAMETER :: M73N3TAze = 18471 + INTEGER(IntKi), PARAMETER :: M73N4TAze = 18472 + INTEGER(IntKi), PARAMETER :: M73N5TAze = 18473 + INTEGER(IntKi), PARAMETER :: M73N6TAze = 18474 + INTEGER(IntKi), PARAMETER :: M73N7TAze = 18475 + INTEGER(IntKi), PARAMETER :: M73N8TAze = 18476 + INTEGER(IntKi), PARAMETER :: M73N9TAze = 18477 + INTEGER(IntKi), PARAMETER :: M74N1TAze = 18478 + INTEGER(IntKi), PARAMETER :: M74N2TAze = 18479 + INTEGER(IntKi), PARAMETER :: M74N3TAze = 18480 + INTEGER(IntKi), PARAMETER :: M74N4TAze = 18481 + INTEGER(IntKi), PARAMETER :: M74N5TAze = 18482 + INTEGER(IntKi), PARAMETER :: M74N6TAze = 18483 + INTEGER(IntKi), PARAMETER :: M74N7TAze = 18484 + INTEGER(IntKi), PARAMETER :: M74N8TAze = 18485 + INTEGER(IntKi), PARAMETER :: M74N9TAze = 18486 + INTEGER(IntKi), PARAMETER :: M75N1TAze = 18487 + INTEGER(IntKi), PARAMETER :: M75N2TAze = 18488 + INTEGER(IntKi), PARAMETER :: M75N3TAze = 18489 + INTEGER(IntKi), PARAMETER :: M75N4TAze = 18490 + INTEGER(IntKi), PARAMETER :: M75N5TAze = 18491 + INTEGER(IntKi), PARAMETER :: M75N6TAze = 18492 + INTEGER(IntKi), PARAMETER :: M75N7TAze = 18493 + INTEGER(IntKi), PARAMETER :: M75N8TAze = 18494 + INTEGER(IntKi), PARAMETER :: M75N9TAze = 18495 + INTEGER(IntKi), PARAMETER :: M76N1TAze = 18496 + INTEGER(IntKi), PARAMETER :: M76N2TAze = 18497 + INTEGER(IntKi), PARAMETER :: M76N3TAze = 18498 + INTEGER(IntKi), PARAMETER :: M76N4TAze = 18499 + INTEGER(IntKi), PARAMETER :: M76N5TAze = 18500 + INTEGER(IntKi), PARAMETER :: M76N6TAze = 18501 + INTEGER(IntKi), PARAMETER :: M76N7TAze = 18502 + INTEGER(IntKi), PARAMETER :: M76N8TAze = 18503 + INTEGER(IntKi), PARAMETER :: M76N9TAze = 18504 + INTEGER(IntKi), PARAMETER :: M77N1TAze = 18505 + INTEGER(IntKi), PARAMETER :: M77N2TAze = 18506 + INTEGER(IntKi), PARAMETER :: M77N3TAze = 18507 + INTEGER(IntKi), PARAMETER :: M77N4TAze = 18508 + INTEGER(IntKi), PARAMETER :: M77N5TAze = 18509 + INTEGER(IntKi), PARAMETER :: M77N6TAze = 18510 + INTEGER(IntKi), PARAMETER :: M77N7TAze = 18511 + INTEGER(IntKi), PARAMETER :: M77N8TAze = 18512 + INTEGER(IntKi), PARAMETER :: M77N9TAze = 18513 + INTEGER(IntKi), PARAMETER :: M78N1TAze = 18514 + INTEGER(IntKi), PARAMETER :: M78N2TAze = 18515 + INTEGER(IntKi), PARAMETER :: M78N3TAze = 18516 + INTEGER(IntKi), PARAMETER :: M78N4TAze = 18517 + INTEGER(IntKi), PARAMETER :: M78N5TAze = 18518 + INTEGER(IntKi), PARAMETER :: M78N6TAze = 18519 + INTEGER(IntKi), PARAMETER :: M78N7TAze = 18520 + INTEGER(IntKi), PARAMETER :: M78N8TAze = 18521 + INTEGER(IntKi), PARAMETER :: M78N9TAze = 18522 + INTEGER(IntKi), PARAMETER :: M79N1TAze = 18523 + INTEGER(IntKi), PARAMETER :: M79N2TAze = 18524 + INTEGER(IntKi), PARAMETER :: M79N3TAze = 18525 + INTEGER(IntKi), PARAMETER :: M79N4TAze = 18526 + INTEGER(IntKi), PARAMETER :: M79N5TAze = 18527 + INTEGER(IntKi), PARAMETER :: M79N6TAze = 18528 + INTEGER(IntKi), PARAMETER :: M79N7TAze = 18529 + INTEGER(IntKi), PARAMETER :: M79N8TAze = 18530 + INTEGER(IntKi), PARAMETER :: M79N9TAze = 18531 + INTEGER(IntKi), PARAMETER :: M80N1TAze = 18532 + INTEGER(IntKi), PARAMETER :: M80N2TAze = 18533 + INTEGER(IntKi), PARAMETER :: M80N3TAze = 18534 + INTEGER(IntKi), PARAMETER :: M80N4TAze = 18535 + INTEGER(IntKi), PARAMETER :: M80N5TAze = 18536 + INTEGER(IntKi), PARAMETER :: M80N6TAze = 18537 + INTEGER(IntKi), PARAMETER :: M80N7TAze = 18538 + INTEGER(IntKi), PARAMETER :: M80N8TAze = 18539 + INTEGER(IntKi), PARAMETER :: M80N9TAze = 18540 + INTEGER(IntKi), PARAMETER :: M81N1TAze = 18541 + INTEGER(IntKi), PARAMETER :: M81N2TAze = 18542 + INTEGER(IntKi), PARAMETER :: M81N3TAze = 18543 + INTEGER(IntKi), PARAMETER :: M81N4TAze = 18544 + INTEGER(IntKi), PARAMETER :: M81N5TAze = 18545 + INTEGER(IntKi), PARAMETER :: M81N6TAze = 18546 + INTEGER(IntKi), PARAMETER :: M81N7TAze = 18547 + INTEGER(IntKi), PARAMETER :: M81N8TAze = 18548 + INTEGER(IntKi), PARAMETER :: M81N9TAze = 18549 + INTEGER(IntKi), PARAMETER :: M82N1TAze = 18550 + INTEGER(IntKi), PARAMETER :: M82N2TAze = 18551 + INTEGER(IntKi), PARAMETER :: M82N3TAze = 18552 + INTEGER(IntKi), PARAMETER :: M82N4TAze = 18553 + INTEGER(IntKi), PARAMETER :: M82N5TAze = 18554 + INTEGER(IntKi), PARAMETER :: M82N6TAze = 18555 + INTEGER(IntKi), PARAMETER :: M82N7TAze = 18556 + INTEGER(IntKi), PARAMETER :: M82N8TAze = 18557 + INTEGER(IntKi), PARAMETER :: M82N9TAze = 18558 + INTEGER(IntKi), PARAMETER :: M83N1TAze = 18559 + INTEGER(IntKi), PARAMETER :: M83N2TAze = 18560 + INTEGER(IntKi), PARAMETER :: M83N3TAze = 18561 + INTEGER(IntKi), PARAMETER :: M83N4TAze = 18562 + INTEGER(IntKi), PARAMETER :: M83N5TAze = 18563 + INTEGER(IntKi), PARAMETER :: M83N6TAze = 18564 + INTEGER(IntKi), PARAMETER :: M83N7TAze = 18565 + INTEGER(IntKi), PARAMETER :: M83N8TAze = 18566 + INTEGER(IntKi), PARAMETER :: M83N9TAze = 18567 + INTEGER(IntKi), PARAMETER :: M84N1TAze = 18568 + INTEGER(IntKi), PARAMETER :: M84N2TAze = 18569 + INTEGER(IntKi), PARAMETER :: M84N3TAze = 18570 + INTEGER(IntKi), PARAMETER :: M84N4TAze = 18571 + INTEGER(IntKi), PARAMETER :: M84N5TAze = 18572 + INTEGER(IntKi), PARAMETER :: M84N6TAze = 18573 + INTEGER(IntKi), PARAMETER :: M84N7TAze = 18574 + INTEGER(IntKi), PARAMETER :: M84N8TAze = 18575 + INTEGER(IntKi), PARAMETER :: M84N9TAze = 18576 + INTEGER(IntKi), PARAMETER :: M85N1TAze = 18577 + INTEGER(IntKi), PARAMETER :: M85N2TAze = 18578 + INTEGER(IntKi), PARAMETER :: M85N3TAze = 18579 + INTEGER(IntKi), PARAMETER :: M85N4TAze = 18580 + INTEGER(IntKi), PARAMETER :: M85N5TAze = 18581 + INTEGER(IntKi), PARAMETER :: M85N6TAze = 18582 + INTEGER(IntKi), PARAMETER :: M85N7TAze = 18583 + INTEGER(IntKi), PARAMETER :: M85N8TAze = 18584 + INTEGER(IntKi), PARAMETER :: M85N9TAze = 18585 + INTEGER(IntKi), PARAMETER :: M86N1TAze = 18586 + INTEGER(IntKi), PARAMETER :: M86N2TAze = 18587 + INTEGER(IntKi), PARAMETER :: M86N3TAze = 18588 + INTEGER(IntKi), PARAMETER :: M86N4TAze = 18589 + INTEGER(IntKi), PARAMETER :: M86N5TAze = 18590 + INTEGER(IntKi), PARAMETER :: M86N6TAze = 18591 + INTEGER(IntKi), PARAMETER :: M86N7TAze = 18592 + INTEGER(IntKi), PARAMETER :: M86N8TAze = 18593 + INTEGER(IntKi), PARAMETER :: M86N9TAze = 18594 + INTEGER(IntKi), PARAMETER :: M87N1TAze = 18595 + INTEGER(IntKi), PARAMETER :: M87N2TAze = 18596 + INTEGER(IntKi), PARAMETER :: M87N3TAze = 18597 + INTEGER(IntKi), PARAMETER :: M87N4TAze = 18598 + INTEGER(IntKi), PARAMETER :: M87N5TAze = 18599 + INTEGER(IntKi), PARAMETER :: M87N6TAze = 18600 + INTEGER(IntKi), PARAMETER :: M87N7TAze = 18601 + INTEGER(IntKi), PARAMETER :: M87N8TAze = 18602 + INTEGER(IntKi), PARAMETER :: M87N9TAze = 18603 + INTEGER(IntKi), PARAMETER :: M88N1TAze = 18604 + INTEGER(IntKi), PARAMETER :: M88N2TAze = 18605 + INTEGER(IntKi), PARAMETER :: M88N3TAze = 18606 + INTEGER(IntKi), PARAMETER :: M88N4TAze = 18607 + INTEGER(IntKi), PARAMETER :: M88N5TAze = 18608 + INTEGER(IntKi), PARAMETER :: M88N6TAze = 18609 + INTEGER(IntKi), PARAMETER :: M88N7TAze = 18610 + INTEGER(IntKi), PARAMETER :: M88N8TAze = 18611 + INTEGER(IntKi), PARAMETER :: M88N9TAze = 18612 + INTEGER(IntKi), PARAMETER :: M89N1TAze = 18613 + INTEGER(IntKi), PARAMETER :: M89N2TAze = 18614 + INTEGER(IntKi), PARAMETER :: M89N3TAze = 18615 + INTEGER(IntKi), PARAMETER :: M89N4TAze = 18616 + INTEGER(IntKi), PARAMETER :: M89N5TAze = 18617 + INTEGER(IntKi), PARAMETER :: M89N6TAze = 18618 + INTEGER(IntKi), PARAMETER :: M89N7TAze = 18619 + INTEGER(IntKi), PARAMETER :: M89N8TAze = 18620 + INTEGER(IntKi), PARAMETER :: M89N9TAze = 18621 + INTEGER(IntKi), PARAMETER :: M90N1TAze = 18622 + INTEGER(IntKi), PARAMETER :: M90N2TAze = 18623 + INTEGER(IntKi), PARAMETER :: M90N3TAze = 18624 + INTEGER(IntKi), PARAMETER :: M90N4TAze = 18625 + INTEGER(IntKi), PARAMETER :: M90N5TAze = 18626 + INTEGER(IntKi), PARAMETER :: M90N6TAze = 18627 + INTEGER(IntKi), PARAMETER :: M90N7TAze = 18628 + INTEGER(IntKi), PARAMETER :: M90N8TAze = 18629 + INTEGER(IntKi), PARAMETER :: M90N9TAze = 18630 + INTEGER(IntKi), PARAMETER :: M91N1TAze = 18631 + INTEGER(IntKi), PARAMETER :: M91N2TAze = 18632 + INTEGER(IntKi), PARAMETER :: M91N3TAze = 18633 + INTEGER(IntKi), PARAMETER :: M91N4TAze = 18634 + INTEGER(IntKi), PARAMETER :: M91N5TAze = 18635 + INTEGER(IntKi), PARAMETER :: M91N6TAze = 18636 + INTEGER(IntKi), PARAMETER :: M91N7TAze = 18637 + INTEGER(IntKi), PARAMETER :: M91N8TAze = 18638 + INTEGER(IntKi), PARAMETER :: M91N9TAze = 18639 + INTEGER(IntKi), PARAMETER :: M92N1TAze = 18640 + INTEGER(IntKi), PARAMETER :: M92N2TAze = 18641 + INTEGER(IntKi), PARAMETER :: M92N3TAze = 18642 + INTEGER(IntKi), PARAMETER :: M92N4TAze = 18643 + INTEGER(IntKi), PARAMETER :: M92N5TAze = 18644 + INTEGER(IntKi), PARAMETER :: M92N6TAze = 18645 + INTEGER(IntKi), PARAMETER :: M92N7TAze = 18646 + INTEGER(IntKi), PARAMETER :: M92N8TAze = 18647 + INTEGER(IntKi), PARAMETER :: M92N9TAze = 18648 + INTEGER(IntKi), PARAMETER :: M93N1TAze = 18649 + INTEGER(IntKi), PARAMETER :: M93N2TAze = 18650 + INTEGER(IntKi), PARAMETER :: M93N3TAze = 18651 + INTEGER(IntKi), PARAMETER :: M93N4TAze = 18652 + INTEGER(IntKi), PARAMETER :: M93N5TAze = 18653 + INTEGER(IntKi), PARAMETER :: M93N6TAze = 18654 + INTEGER(IntKi), PARAMETER :: M93N7TAze = 18655 + INTEGER(IntKi), PARAMETER :: M93N8TAze = 18656 + INTEGER(IntKi), PARAMETER :: M93N9TAze = 18657 + INTEGER(IntKi), PARAMETER :: M94N1TAze = 18658 + INTEGER(IntKi), PARAMETER :: M94N2TAze = 18659 + INTEGER(IntKi), PARAMETER :: M94N3TAze = 18660 + INTEGER(IntKi), PARAMETER :: M94N4TAze = 18661 + INTEGER(IntKi), PARAMETER :: M94N5TAze = 18662 + INTEGER(IntKi), PARAMETER :: M94N6TAze = 18663 + INTEGER(IntKi), PARAMETER :: M94N7TAze = 18664 + INTEGER(IntKi), PARAMETER :: M94N8TAze = 18665 + INTEGER(IntKi), PARAMETER :: M94N9TAze = 18666 + INTEGER(IntKi), PARAMETER :: M95N1TAze = 18667 + INTEGER(IntKi), PARAMETER :: M95N2TAze = 18668 + INTEGER(IntKi), PARAMETER :: M95N3TAze = 18669 + INTEGER(IntKi), PARAMETER :: M95N4TAze = 18670 + INTEGER(IntKi), PARAMETER :: M95N5TAze = 18671 + INTEGER(IntKi), PARAMETER :: M95N6TAze = 18672 + INTEGER(IntKi), PARAMETER :: M95N7TAze = 18673 + INTEGER(IntKi), PARAMETER :: M95N8TAze = 18674 + INTEGER(IntKi), PARAMETER :: M95N9TAze = 18675 + INTEGER(IntKi), PARAMETER :: M96N1TAze = 18676 + INTEGER(IntKi), PARAMETER :: M96N2TAze = 18677 + INTEGER(IntKi), PARAMETER :: M96N3TAze = 18678 + INTEGER(IntKi), PARAMETER :: M96N4TAze = 18679 + INTEGER(IntKi), PARAMETER :: M96N5TAze = 18680 + INTEGER(IntKi), PARAMETER :: M96N6TAze = 18681 + INTEGER(IntKi), PARAMETER :: M96N7TAze = 18682 + INTEGER(IntKi), PARAMETER :: M96N8TAze = 18683 + INTEGER(IntKi), PARAMETER :: M96N9TAze = 18684 + INTEGER(IntKi), PARAMETER :: M97N1TAze = 18685 + INTEGER(IntKi), PARAMETER :: M97N2TAze = 18686 + INTEGER(IntKi), PARAMETER :: M97N3TAze = 18687 + INTEGER(IntKi), PARAMETER :: M97N4TAze = 18688 + INTEGER(IntKi), PARAMETER :: M97N5TAze = 18689 + INTEGER(IntKi), PARAMETER :: M97N6TAze = 18690 + INTEGER(IntKi), PARAMETER :: M97N7TAze = 18691 + INTEGER(IntKi), PARAMETER :: M97N8TAze = 18692 + INTEGER(IntKi), PARAMETER :: M97N9TAze = 18693 + INTEGER(IntKi), PARAMETER :: M98N1TAze = 18694 + INTEGER(IntKi), PARAMETER :: M98N2TAze = 18695 + INTEGER(IntKi), PARAMETER :: M98N3TAze = 18696 + INTEGER(IntKi), PARAMETER :: M98N4TAze = 18697 + INTEGER(IntKi), PARAMETER :: M98N5TAze = 18698 + INTEGER(IntKi), PARAMETER :: M98N6TAze = 18699 + INTEGER(IntKi), PARAMETER :: M98N7TAze = 18700 + INTEGER(IntKi), PARAMETER :: M98N8TAze = 18701 + INTEGER(IntKi), PARAMETER :: M98N9TAze = 18702 + INTEGER(IntKi), PARAMETER :: M99N1TAze = 18703 + INTEGER(IntKi), PARAMETER :: M99N2TAze = 18704 + INTEGER(IntKi), PARAMETER :: M99N3TAze = 18705 + INTEGER(IntKi), PARAMETER :: M99N4TAze = 18706 + INTEGER(IntKi), PARAMETER :: M99N5TAze = 18707 + INTEGER(IntKi), PARAMETER :: M99N6TAze = 18708 + INTEGER(IntKi), PARAMETER :: M99N7TAze = 18709 + INTEGER(IntKi), PARAMETER :: M99N8TAze = 18710 + INTEGER(IntKi), PARAMETER :: M99N9TAze = 18711 + INTEGER(IntKi), PARAMETER :: M01N1RAxe = 18712 + INTEGER(IntKi), PARAMETER :: M01N2RAxe = 18713 + INTEGER(IntKi), PARAMETER :: M01N3RAxe = 18714 + INTEGER(IntKi), PARAMETER :: M01N4RAxe = 18715 + INTEGER(IntKi), PARAMETER :: M01N5RAxe = 18716 + INTEGER(IntKi), PARAMETER :: M01N6RAxe = 18717 + INTEGER(IntKi), PARAMETER :: M01N7RAxe = 18718 + INTEGER(IntKi), PARAMETER :: M01N8RAxe = 18719 + INTEGER(IntKi), PARAMETER :: M01N9RAxe = 18720 + INTEGER(IntKi), PARAMETER :: M02N1RAxe = 18721 + INTEGER(IntKi), PARAMETER :: M02N2RAxe = 18722 + INTEGER(IntKi), PARAMETER :: M02N3RAxe = 18723 + INTEGER(IntKi), PARAMETER :: M02N4RAxe = 18724 + INTEGER(IntKi), PARAMETER :: M02N5RAxe = 18725 + INTEGER(IntKi), PARAMETER :: M02N6RAxe = 18726 + INTEGER(IntKi), PARAMETER :: M02N7RAxe = 18727 + INTEGER(IntKi), PARAMETER :: M02N8RAxe = 18728 + INTEGER(IntKi), PARAMETER :: M02N9RAxe = 18729 + INTEGER(IntKi), PARAMETER :: M03N1RAxe = 18730 + INTEGER(IntKi), PARAMETER :: M03N2RAxe = 18731 + INTEGER(IntKi), PARAMETER :: M03N3RAxe = 18732 + INTEGER(IntKi), PARAMETER :: M03N4RAxe = 18733 + INTEGER(IntKi), PARAMETER :: M03N5RAxe = 18734 + INTEGER(IntKi), PARAMETER :: M03N6RAxe = 18735 + INTEGER(IntKi), PARAMETER :: M03N7RAxe = 18736 + INTEGER(IntKi), PARAMETER :: M03N8RAxe = 18737 + INTEGER(IntKi), PARAMETER :: M03N9RAxe = 18738 + INTEGER(IntKi), PARAMETER :: M04N1RAxe = 18739 + INTEGER(IntKi), PARAMETER :: M04N2RAxe = 18740 + INTEGER(IntKi), PARAMETER :: M04N3RAxe = 18741 + INTEGER(IntKi), PARAMETER :: M04N4RAxe = 18742 + INTEGER(IntKi), PARAMETER :: M04N5RAxe = 18743 + INTEGER(IntKi), PARAMETER :: M04N6RAxe = 18744 + INTEGER(IntKi), PARAMETER :: M04N7RAxe = 18745 + INTEGER(IntKi), PARAMETER :: M04N8RAxe = 18746 + INTEGER(IntKi), PARAMETER :: M04N9RAxe = 18747 + INTEGER(IntKi), PARAMETER :: M05N1RAxe = 18748 + INTEGER(IntKi), PARAMETER :: M05N2RAxe = 18749 + INTEGER(IntKi), PARAMETER :: M05N3RAxe = 18750 + INTEGER(IntKi), PARAMETER :: M05N4RAxe = 18751 + INTEGER(IntKi), PARAMETER :: M05N5RAxe = 18752 + INTEGER(IntKi), PARAMETER :: M05N6RAxe = 18753 + INTEGER(IntKi), PARAMETER :: M05N7RAxe = 18754 + INTEGER(IntKi), PARAMETER :: M05N8RAxe = 18755 + INTEGER(IntKi), PARAMETER :: M05N9RAxe = 18756 + INTEGER(IntKi), PARAMETER :: M06N1RAxe = 18757 + INTEGER(IntKi), PARAMETER :: M06N2RAxe = 18758 + INTEGER(IntKi), PARAMETER :: M06N3RAxe = 18759 + INTEGER(IntKi), PARAMETER :: M06N4RAxe = 18760 + INTEGER(IntKi), PARAMETER :: M06N5RAxe = 18761 + INTEGER(IntKi), PARAMETER :: M06N6RAxe = 18762 + INTEGER(IntKi), PARAMETER :: M06N7RAxe = 18763 + INTEGER(IntKi), PARAMETER :: M06N8RAxe = 18764 + INTEGER(IntKi), PARAMETER :: M06N9RAxe = 18765 + INTEGER(IntKi), PARAMETER :: M07N1RAxe = 18766 + INTEGER(IntKi), PARAMETER :: M07N2RAxe = 18767 + INTEGER(IntKi), PARAMETER :: M07N3RAxe = 18768 + INTEGER(IntKi), PARAMETER :: M07N4RAxe = 18769 + INTEGER(IntKi), PARAMETER :: M07N5RAxe = 18770 + INTEGER(IntKi), PARAMETER :: M07N6RAxe = 18771 + INTEGER(IntKi), PARAMETER :: M07N7RAxe = 18772 + INTEGER(IntKi), PARAMETER :: M07N8RAxe = 18773 + INTEGER(IntKi), PARAMETER :: M07N9RAxe = 18774 + INTEGER(IntKi), PARAMETER :: M08N1RAxe = 18775 + INTEGER(IntKi), PARAMETER :: M08N2RAxe = 18776 + INTEGER(IntKi), PARAMETER :: M08N3RAxe = 18777 + INTEGER(IntKi), PARAMETER :: M08N4RAxe = 18778 + INTEGER(IntKi), PARAMETER :: M08N5RAxe = 18779 + INTEGER(IntKi), PARAMETER :: M08N6RAxe = 18780 + INTEGER(IntKi), PARAMETER :: M08N7RAxe = 18781 + INTEGER(IntKi), PARAMETER :: M08N8RAxe = 18782 + INTEGER(IntKi), PARAMETER :: M08N9RAxe = 18783 + INTEGER(IntKi), PARAMETER :: M09N1RAxe = 18784 + INTEGER(IntKi), PARAMETER :: M09N2RAxe = 18785 + INTEGER(IntKi), PARAMETER :: M09N3RAxe = 18786 + INTEGER(IntKi), PARAMETER :: M09N4RAxe = 18787 + INTEGER(IntKi), PARAMETER :: M09N5RAxe = 18788 + INTEGER(IntKi), PARAMETER :: M09N6RAxe = 18789 + INTEGER(IntKi), PARAMETER :: M09N7RAxe = 18790 + INTEGER(IntKi), PARAMETER :: M09N8RAxe = 18791 + INTEGER(IntKi), PARAMETER :: M09N9RAxe = 18792 + INTEGER(IntKi), PARAMETER :: M10N1RAxe = 18793 + INTEGER(IntKi), PARAMETER :: M10N2RAxe = 18794 + INTEGER(IntKi), PARAMETER :: M10N3RAxe = 18795 + INTEGER(IntKi), PARAMETER :: M10N4RAxe = 18796 + INTEGER(IntKi), PARAMETER :: M10N5RAxe = 18797 + INTEGER(IntKi), PARAMETER :: M10N6RAxe = 18798 + INTEGER(IntKi), PARAMETER :: M10N7RAxe = 18799 + INTEGER(IntKi), PARAMETER :: M10N8RAxe = 18800 + INTEGER(IntKi), PARAMETER :: M10N9RAxe = 18801 + INTEGER(IntKi), PARAMETER :: M11N1RAxe = 18802 + INTEGER(IntKi), PARAMETER :: M11N2RAxe = 18803 + INTEGER(IntKi), PARAMETER :: M11N3RAxe = 18804 + INTEGER(IntKi), PARAMETER :: M11N4RAxe = 18805 + INTEGER(IntKi), PARAMETER :: M11N5RAxe = 18806 + INTEGER(IntKi), PARAMETER :: M11N6RAxe = 18807 + INTEGER(IntKi), PARAMETER :: M11N7RAxe = 18808 + INTEGER(IntKi), PARAMETER :: M11N8RAxe = 18809 + INTEGER(IntKi), PARAMETER :: M11N9RAxe = 18810 + INTEGER(IntKi), PARAMETER :: M12N1RAxe = 18811 + INTEGER(IntKi), PARAMETER :: M12N2RAxe = 18812 + INTEGER(IntKi), PARAMETER :: M12N3RAxe = 18813 + INTEGER(IntKi), PARAMETER :: M12N4RAxe = 18814 + INTEGER(IntKi), PARAMETER :: M12N5RAxe = 18815 + INTEGER(IntKi), PARAMETER :: M12N6RAxe = 18816 + INTEGER(IntKi), PARAMETER :: M12N7RAxe = 18817 + INTEGER(IntKi), PARAMETER :: M12N8RAxe = 18818 + INTEGER(IntKi), PARAMETER :: M12N9RAxe = 18819 + INTEGER(IntKi), PARAMETER :: M13N1RAxe = 18820 + INTEGER(IntKi), PARAMETER :: M13N2RAxe = 18821 + INTEGER(IntKi), PARAMETER :: M13N3RAxe = 18822 + INTEGER(IntKi), PARAMETER :: M13N4RAxe = 18823 + INTEGER(IntKi), PARAMETER :: M13N5RAxe = 18824 + INTEGER(IntKi), PARAMETER :: M13N6RAxe = 18825 + INTEGER(IntKi), PARAMETER :: M13N7RAxe = 18826 + INTEGER(IntKi), PARAMETER :: M13N8RAxe = 18827 + INTEGER(IntKi), PARAMETER :: M13N9RAxe = 18828 + INTEGER(IntKi), PARAMETER :: M14N1RAxe = 18829 + INTEGER(IntKi), PARAMETER :: M14N2RAxe = 18830 + INTEGER(IntKi), PARAMETER :: M14N3RAxe = 18831 + INTEGER(IntKi), PARAMETER :: M14N4RAxe = 18832 + INTEGER(IntKi), PARAMETER :: M14N5RAxe = 18833 + INTEGER(IntKi), PARAMETER :: M14N6RAxe = 18834 + INTEGER(IntKi), PARAMETER :: M14N7RAxe = 18835 + INTEGER(IntKi), PARAMETER :: M14N8RAxe = 18836 + INTEGER(IntKi), PARAMETER :: M14N9RAxe = 18837 + INTEGER(IntKi), PARAMETER :: M15N1RAxe = 18838 + INTEGER(IntKi), PARAMETER :: M15N2RAxe = 18839 + INTEGER(IntKi), PARAMETER :: M15N3RAxe = 18840 + INTEGER(IntKi), PARAMETER :: M15N4RAxe = 18841 + INTEGER(IntKi), PARAMETER :: M15N5RAxe = 18842 + INTEGER(IntKi), PARAMETER :: M15N6RAxe = 18843 + INTEGER(IntKi), PARAMETER :: M15N7RAxe = 18844 + INTEGER(IntKi), PARAMETER :: M15N8RAxe = 18845 + INTEGER(IntKi), PARAMETER :: M15N9RAxe = 18846 + INTEGER(IntKi), PARAMETER :: M16N1RAxe = 18847 + INTEGER(IntKi), PARAMETER :: M16N2RAxe = 18848 + INTEGER(IntKi), PARAMETER :: M16N3RAxe = 18849 + INTEGER(IntKi), PARAMETER :: M16N4RAxe = 18850 + INTEGER(IntKi), PARAMETER :: M16N5RAxe = 18851 + INTEGER(IntKi), PARAMETER :: M16N6RAxe = 18852 + INTEGER(IntKi), PARAMETER :: M16N7RAxe = 18853 + INTEGER(IntKi), PARAMETER :: M16N8RAxe = 18854 + INTEGER(IntKi), PARAMETER :: M16N9RAxe = 18855 + INTEGER(IntKi), PARAMETER :: M17N1RAxe = 18856 + INTEGER(IntKi), PARAMETER :: M17N2RAxe = 18857 + INTEGER(IntKi), PARAMETER :: M17N3RAxe = 18858 + INTEGER(IntKi), PARAMETER :: M17N4RAxe = 18859 + INTEGER(IntKi), PARAMETER :: M17N5RAxe = 18860 + INTEGER(IntKi), PARAMETER :: M17N6RAxe = 18861 + INTEGER(IntKi), PARAMETER :: M17N7RAxe = 18862 + INTEGER(IntKi), PARAMETER :: M17N8RAxe = 18863 + INTEGER(IntKi), PARAMETER :: M17N9RAxe = 18864 + INTEGER(IntKi), PARAMETER :: M18N1RAxe = 18865 + INTEGER(IntKi), PARAMETER :: M18N2RAxe = 18866 + INTEGER(IntKi), PARAMETER :: M18N3RAxe = 18867 + INTEGER(IntKi), PARAMETER :: M18N4RAxe = 18868 + INTEGER(IntKi), PARAMETER :: M18N5RAxe = 18869 + INTEGER(IntKi), PARAMETER :: M18N6RAxe = 18870 + INTEGER(IntKi), PARAMETER :: M18N7RAxe = 18871 + INTEGER(IntKi), PARAMETER :: M18N8RAxe = 18872 + INTEGER(IntKi), PARAMETER :: M18N9RAxe = 18873 + INTEGER(IntKi), PARAMETER :: M19N1RAxe = 18874 + INTEGER(IntKi), PARAMETER :: M19N2RAxe = 18875 + INTEGER(IntKi), PARAMETER :: M19N3RAxe = 18876 + INTEGER(IntKi), PARAMETER :: M19N4RAxe = 18877 + INTEGER(IntKi), PARAMETER :: M19N5RAxe = 18878 + INTEGER(IntKi), PARAMETER :: M19N6RAxe = 18879 + INTEGER(IntKi), PARAMETER :: M19N7RAxe = 18880 + INTEGER(IntKi), PARAMETER :: M19N8RAxe = 18881 + INTEGER(IntKi), PARAMETER :: M19N9RAxe = 18882 + INTEGER(IntKi), PARAMETER :: M20N1RAxe = 18883 + INTEGER(IntKi), PARAMETER :: M20N2RAxe = 18884 + INTEGER(IntKi), PARAMETER :: M20N3RAxe = 18885 + INTEGER(IntKi), PARAMETER :: M20N4RAxe = 18886 + INTEGER(IntKi), PARAMETER :: M20N5RAxe = 18887 + INTEGER(IntKi), PARAMETER :: M20N6RAxe = 18888 + INTEGER(IntKi), PARAMETER :: M20N7RAxe = 18889 + INTEGER(IntKi), PARAMETER :: M20N8RAxe = 18890 + INTEGER(IntKi), PARAMETER :: M20N9RAxe = 18891 + INTEGER(IntKi), PARAMETER :: M21N1RAxe = 18892 + INTEGER(IntKi), PARAMETER :: M21N2RAxe = 18893 + INTEGER(IntKi), PARAMETER :: M21N3RAxe = 18894 + INTEGER(IntKi), PARAMETER :: M21N4RAxe = 18895 + INTEGER(IntKi), PARAMETER :: M21N5RAxe = 18896 + INTEGER(IntKi), PARAMETER :: M21N6RAxe = 18897 + INTEGER(IntKi), PARAMETER :: M21N7RAxe = 18898 + INTEGER(IntKi), PARAMETER :: M21N8RAxe = 18899 + INTEGER(IntKi), PARAMETER :: M21N9RAxe = 18900 + INTEGER(IntKi), PARAMETER :: M22N1RAxe = 18901 + INTEGER(IntKi), PARAMETER :: M22N2RAxe = 18902 + INTEGER(IntKi), PARAMETER :: M22N3RAxe = 18903 + INTEGER(IntKi), PARAMETER :: M22N4RAxe = 18904 + INTEGER(IntKi), PARAMETER :: M22N5RAxe = 18905 + INTEGER(IntKi), PARAMETER :: M22N6RAxe = 18906 + INTEGER(IntKi), PARAMETER :: M22N7RAxe = 18907 + INTEGER(IntKi), PARAMETER :: M22N8RAxe = 18908 + INTEGER(IntKi), PARAMETER :: M22N9RAxe = 18909 + INTEGER(IntKi), PARAMETER :: M23N1RAxe = 18910 + INTEGER(IntKi), PARAMETER :: M23N2RAxe = 18911 + INTEGER(IntKi), PARAMETER :: M23N3RAxe = 18912 + INTEGER(IntKi), PARAMETER :: M23N4RAxe = 18913 + INTEGER(IntKi), PARAMETER :: M23N5RAxe = 18914 + INTEGER(IntKi), PARAMETER :: M23N6RAxe = 18915 + INTEGER(IntKi), PARAMETER :: M23N7RAxe = 18916 + INTEGER(IntKi), PARAMETER :: M23N8RAxe = 18917 + INTEGER(IntKi), PARAMETER :: M23N9RAxe = 18918 + INTEGER(IntKi), PARAMETER :: M24N1RAxe = 18919 + INTEGER(IntKi), PARAMETER :: M24N2RAxe = 18920 + INTEGER(IntKi), PARAMETER :: M24N3RAxe = 18921 + INTEGER(IntKi), PARAMETER :: M24N4RAxe = 18922 + INTEGER(IntKi), PARAMETER :: M24N5RAxe = 18923 + INTEGER(IntKi), PARAMETER :: M24N6RAxe = 18924 + INTEGER(IntKi), PARAMETER :: M24N7RAxe = 18925 + INTEGER(IntKi), PARAMETER :: M24N8RAxe = 18926 + INTEGER(IntKi), PARAMETER :: M24N9RAxe = 18927 + INTEGER(IntKi), PARAMETER :: M25N1RAxe = 18928 + INTEGER(IntKi), PARAMETER :: M25N2RAxe = 18929 + INTEGER(IntKi), PARAMETER :: M25N3RAxe = 18930 + INTEGER(IntKi), PARAMETER :: M25N4RAxe = 18931 + INTEGER(IntKi), PARAMETER :: M25N5RAxe = 18932 + INTEGER(IntKi), PARAMETER :: M25N6RAxe = 18933 + INTEGER(IntKi), PARAMETER :: M25N7RAxe = 18934 + INTEGER(IntKi), PARAMETER :: M25N8RAxe = 18935 + INTEGER(IntKi), PARAMETER :: M25N9RAxe = 18936 + INTEGER(IntKi), PARAMETER :: M26N1RAxe = 18937 + INTEGER(IntKi), PARAMETER :: M26N2RAxe = 18938 + INTEGER(IntKi), PARAMETER :: M26N3RAxe = 18939 + INTEGER(IntKi), PARAMETER :: M26N4RAxe = 18940 + INTEGER(IntKi), PARAMETER :: M26N5RAxe = 18941 + INTEGER(IntKi), PARAMETER :: M26N6RAxe = 18942 + INTEGER(IntKi), PARAMETER :: M26N7RAxe = 18943 + INTEGER(IntKi), PARAMETER :: M26N8RAxe = 18944 + INTEGER(IntKi), PARAMETER :: M26N9RAxe = 18945 + INTEGER(IntKi), PARAMETER :: M27N1RAxe = 18946 + INTEGER(IntKi), PARAMETER :: M27N2RAxe = 18947 + INTEGER(IntKi), PARAMETER :: M27N3RAxe = 18948 + INTEGER(IntKi), PARAMETER :: M27N4RAxe = 18949 + INTEGER(IntKi), PARAMETER :: M27N5RAxe = 18950 + INTEGER(IntKi), PARAMETER :: M27N6RAxe = 18951 + INTEGER(IntKi), PARAMETER :: M27N7RAxe = 18952 + INTEGER(IntKi), PARAMETER :: M27N8RAxe = 18953 + INTEGER(IntKi), PARAMETER :: M27N9RAxe = 18954 + INTEGER(IntKi), PARAMETER :: M28N1RAxe = 18955 + INTEGER(IntKi), PARAMETER :: M28N2RAxe = 18956 + INTEGER(IntKi), PARAMETER :: M28N3RAxe = 18957 + INTEGER(IntKi), PARAMETER :: M28N4RAxe = 18958 + INTEGER(IntKi), PARAMETER :: M28N5RAxe = 18959 + INTEGER(IntKi), PARAMETER :: M28N6RAxe = 18960 + INTEGER(IntKi), PARAMETER :: M28N7RAxe = 18961 + INTEGER(IntKi), PARAMETER :: M28N8RAxe = 18962 + INTEGER(IntKi), PARAMETER :: M28N9RAxe = 18963 + INTEGER(IntKi), PARAMETER :: M29N1RAxe = 18964 + INTEGER(IntKi), PARAMETER :: M29N2RAxe = 18965 + INTEGER(IntKi), PARAMETER :: M29N3RAxe = 18966 + INTEGER(IntKi), PARAMETER :: M29N4RAxe = 18967 + INTEGER(IntKi), PARAMETER :: M29N5RAxe = 18968 + INTEGER(IntKi), PARAMETER :: M29N6RAxe = 18969 + INTEGER(IntKi), PARAMETER :: M29N7RAxe = 18970 + INTEGER(IntKi), PARAMETER :: M29N8RAxe = 18971 + INTEGER(IntKi), PARAMETER :: M29N9RAxe = 18972 + INTEGER(IntKi), PARAMETER :: M30N1RAxe = 18973 + INTEGER(IntKi), PARAMETER :: M30N2RAxe = 18974 + INTEGER(IntKi), PARAMETER :: M30N3RAxe = 18975 + INTEGER(IntKi), PARAMETER :: M30N4RAxe = 18976 + INTEGER(IntKi), PARAMETER :: M30N5RAxe = 18977 + INTEGER(IntKi), PARAMETER :: M30N6RAxe = 18978 + INTEGER(IntKi), PARAMETER :: M30N7RAxe = 18979 + INTEGER(IntKi), PARAMETER :: M30N8RAxe = 18980 + INTEGER(IntKi), PARAMETER :: M30N9RAxe = 18981 + INTEGER(IntKi), PARAMETER :: M31N1RAxe = 18982 + INTEGER(IntKi), PARAMETER :: M31N2RAxe = 18983 + INTEGER(IntKi), PARAMETER :: M31N3RAxe = 18984 + INTEGER(IntKi), PARAMETER :: M31N4RAxe = 18985 + INTEGER(IntKi), PARAMETER :: M31N5RAxe = 18986 + INTEGER(IntKi), PARAMETER :: M31N6RAxe = 18987 + INTEGER(IntKi), PARAMETER :: M31N7RAxe = 18988 + INTEGER(IntKi), PARAMETER :: M31N8RAxe = 18989 + INTEGER(IntKi), PARAMETER :: M31N9RAxe = 18990 + INTEGER(IntKi), PARAMETER :: M32N1RAxe = 18991 + INTEGER(IntKi), PARAMETER :: M32N2RAxe = 18992 + INTEGER(IntKi), PARAMETER :: M32N3RAxe = 18993 + INTEGER(IntKi), PARAMETER :: M32N4RAxe = 18994 + INTEGER(IntKi), PARAMETER :: M32N5RAxe = 18995 + INTEGER(IntKi), PARAMETER :: M32N6RAxe = 18996 + INTEGER(IntKi), PARAMETER :: M32N7RAxe = 18997 + INTEGER(IntKi), PARAMETER :: M32N8RAxe = 18998 + INTEGER(IntKi), PARAMETER :: M32N9RAxe = 18999 + INTEGER(IntKi), PARAMETER :: M33N1RAxe = 19000 + INTEGER(IntKi), PARAMETER :: M33N2RAxe = 19001 + INTEGER(IntKi), PARAMETER :: M33N3RAxe = 19002 + INTEGER(IntKi), PARAMETER :: M33N4RAxe = 19003 + INTEGER(IntKi), PARAMETER :: M33N5RAxe = 19004 + INTEGER(IntKi), PARAMETER :: M33N6RAxe = 19005 + INTEGER(IntKi), PARAMETER :: M33N7RAxe = 19006 + INTEGER(IntKi), PARAMETER :: M33N8RAxe = 19007 + INTEGER(IntKi), PARAMETER :: M33N9RAxe = 19008 + INTEGER(IntKi), PARAMETER :: M34N1RAxe = 19009 + INTEGER(IntKi), PARAMETER :: M34N2RAxe = 19010 + INTEGER(IntKi), PARAMETER :: M34N3RAxe = 19011 + INTEGER(IntKi), PARAMETER :: M34N4RAxe = 19012 + INTEGER(IntKi), PARAMETER :: M34N5RAxe = 19013 + INTEGER(IntKi), PARAMETER :: M34N6RAxe = 19014 + INTEGER(IntKi), PARAMETER :: M34N7RAxe = 19015 + INTEGER(IntKi), PARAMETER :: M34N8RAxe = 19016 + INTEGER(IntKi), PARAMETER :: M34N9RAxe = 19017 + INTEGER(IntKi), PARAMETER :: M35N1RAxe = 19018 + INTEGER(IntKi), PARAMETER :: M35N2RAxe = 19019 + INTEGER(IntKi), PARAMETER :: M35N3RAxe = 19020 + INTEGER(IntKi), PARAMETER :: M35N4RAxe = 19021 + INTEGER(IntKi), PARAMETER :: M35N5RAxe = 19022 + INTEGER(IntKi), PARAMETER :: M35N6RAxe = 19023 + INTEGER(IntKi), PARAMETER :: M35N7RAxe = 19024 + INTEGER(IntKi), PARAMETER :: M35N8RAxe = 19025 + INTEGER(IntKi), PARAMETER :: M35N9RAxe = 19026 + INTEGER(IntKi), PARAMETER :: M36N1RAxe = 19027 + INTEGER(IntKi), PARAMETER :: M36N2RAxe = 19028 + INTEGER(IntKi), PARAMETER :: M36N3RAxe = 19029 + INTEGER(IntKi), PARAMETER :: M36N4RAxe = 19030 + INTEGER(IntKi), PARAMETER :: M36N5RAxe = 19031 + INTEGER(IntKi), PARAMETER :: M36N6RAxe = 19032 + INTEGER(IntKi), PARAMETER :: M36N7RAxe = 19033 + INTEGER(IntKi), PARAMETER :: M36N8RAxe = 19034 + INTEGER(IntKi), PARAMETER :: M36N9RAxe = 19035 + INTEGER(IntKi), PARAMETER :: M37N1RAxe = 19036 + INTEGER(IntKi), PARAMETER :: M37N2RAxe = 19037 + INTEGER(IntKi), PARAMETER :: M37N3RAxe = 19038 + INTEGER(IntKi), PARAMETER :: M37N4RAxe = 19039 + INTEGER(IntKi), PARAMETER :: M37N5RAxe = 19040 + INTEGER(IntKi), PARAMETER :: M37N6RAxe = 19041 + INTEGER(IntKi), PARAMETER :: M37N7RAxe = 19042 + INTEGER(IntKi), PARAMETER :: M37N8RAxe = 19043 + INTEGER(IntKi), PARAMETER :: M37N9RAxe = 19044 + INTEGER(IntKi), PARAMETER :: M38N1RAxe = 19045 + INTEGER(IntKi), PARAMETER :: M38N2RAxe = 19046 + INTEGER(IntKi), PARAMETER :: M38N3RAxe = 19047 + INTEGER(IntKi), PARAMETER :: M38N4RAxe = 19048 + INTEGER(IntKi), PARAMETER :: M38N5RAxe = 19049 + INTEGER(IntKi), PARAMETER :: M38N6RAxe = 19050 + INTEGER(IntKi), PARAMETER :: M38N7RAxe = 19051 + INTEGER(IntKi), PARAMETER :: M38N8RAxe = 19052 + INTEGER(IntKi), PARAMETER :: M38N9RAxe = 19053 + INTEGER(IntKi), PARAMETER :: M39N1RAxe = 19054 + INTEGER(IntKi), PARAMETER :: M39N2RAxe = 19055 + INTEGER(IntKi), PARAMETER :: M39N3RAxe = 19056 + INTEGER(IntKi), PARAMETER :: M39N4RAxe = 19057 + INTEGER(IntKi), PARAMETER :: M39N5RAxe = 19058 + INTEGER(IntKi), PARAMETER :: M39N6RAxe = 19059 + INTEGER(IntKi), PARAMETER :: M39N7RAxe = 19060 + INTEGER(IntKi), PARAMETER :: M39N8RAxe = 19061 + INTEGER(IntKi), PARAMETER :: M39N9RAxe = 19062 + INTEGER(IntKi), PARAMETER :: M40N1RAxe = 19063 + INTEGER(IntKi), PARAMETER :: M40N2RAxe = 19064 + INTEGER(IntKi), PARAMETER :: M40N3RAxe = 19065 + INTEGER(IntKi), PARAMETER :: M40N4RAxe = 19066 + INTEGER(IntKi), PARAMETER :: M40N5RAxe = 19067 + INTEGER(IntKi), PARAMETER :: M40N6RAxe = 19068 + INTEGER(IntKi), PARAMETER :: M40N7RAxe = 19069 + INTEGER(IntKi), PARAMETER :: M40N8RAxe = 19070 + INTEGER(IntKi), PARAMETER :: M40N9RAxe = 19071 + INTEGER(IntKi), PARAMETER :: M41N1RAxe = 19072 + INTEGER(IntKi), PARAMETER :: M41N2RAxe = 19073 + INTEGER(IntKi), PARAMETER :: M41N3RAxe = 19074 + INTEGER(IntKi), PARAMETER :: M41N4RAxe = 19075 + INTEGER(IntKi), PARAMETER :: M41N5RAxe = 19076 + INTEGER(IntKi), PARAMETER :: M41N6RAxe = 19077 + INTEGER(IntKi), PARAMETER :: M41N7RAxe = 19078 + INTEGER(IntKi), PARAMETER :: M41N8RAxe = 19079 + INTEGER(IntKi), PARAMETER :: M41N9RAxe = 19080 + INTEGER(IntKi), PARAMETER :: M42N1RAxe = 19081 + INTEGER(IntKi), PARAMETER :: M42N2RAxe = 19082 + INTEGER(IntKi), PARAMETER :: M42N3RAxe = 19083 + INTEGER(IntKi), PARAMETER :: M42N4RAxe = 19084 + INTEGER(IntKi), PARAMETER :: M42N5RAxe = 19085 + INTEGER(IntKi), PARAMETER :: M42N6RAxe = 19086 + INTEGER(IntKi), PARAMETER :: M42N7RAxe = 19087 + INTEGER(IntKi), PARAMETER :: M42N8RAxe = 19088 + INTEGER(IntKi), PARAMETER :: M42N9RAxe = 19089 + INTEGER(IntKi), PARAMETER :: M43N1RAxe = 19090 + INTEGER(IntKi), PARAMETER :: M43N2RAxe = 19091 + INTEGER(IntKi), PARAMETER :: M43N3RAxe = 19092 + INTEGER(IntKi), PARAMETER :: M43N4RAxe = 19093 + INTEGER(IntKi), PARAMETER :: M43N5RAxe = 19094 + INTEGER(IntKi), PARAMETER :: M43N6RAxe = 19095 + INTEGER(IntKi), PARAMETER :: M43N7RAxe = 19096 + INTEGER(IntKi), PARAMETER :: M43N8RAxe = 19097 + INTEGER(IntKi), PARAMETER :: M43N9RAxe = 19098 + INTEGER(IntKi), PARAMETER :: M44N1RAxe = 19099 + INTEGER(IntKi), PARAMETER :: M44N2RAxe = 19100 + INTEGER(IntKi), PARAMETER :: M44N3RAxe = 19101 + INTEGER(IntKi), PARAMETER :: M44N4RAxe = 19102 + INTEGER(IntKi), PARAMETER :: M44N5RAxe = 19103 + INTEGER(IntKi), PARAMETER :: M44N6RAxe = 19104 + INTEGER(IntKi), PARAMETER :: M44N7RAxe = 19105 + INTEGER(IntKi), PARAMETER :: M44N8RAxe = 19106 + INTEGER(IntKi), PARAMETER :: M44N9RAxe = 19107 + INTEGER(IntKi), PARAMETER :: M45N1RAxe = 19108 + INTEGER(IntKi), PARAMETER :: M45N2RAxe = 19109 + INTEGER(IntKi), PARAMETER :: M45N3RAxe = 19110 + INTEGER(IntKi), PARAMETER :: M45N4RAxe = 19111 + INTEGER(IntKi), PARAMETER :: M45N5RAxe = 19112 + INTEGER(IntKi), PARAMETER :: M45N6RAxe = 19113 + INTEGER(IntKi), PARAMETER :: M45N7RAxe = 19114 + INTEGER(IntKi), PARAMETER :: M45N8RAxe = 19115 + INTEGER(IntKi), PARAMETER :: M45N9RAxe = 19116 + INTEGER(IntKi), PARAMETER :: M46N1RAxe = 19117 + INTEGER(IntKi), PARAMETER :: M46N2RAxe = 19118 + INTEGER(IntKi), PARAMETER :: M46N3RAxe = 19119 + INTEGER(IntKi), PARAMETER :: M46N4RAxe = 19120 + INTEGER(IntKi), PARAMETER :: M46N5RAxe = 19121 + INTEGER(IntKi), PARAMETER :: M46N6RAxe = 19122 + INTEGER(IntKi), PARAMETER :: M46N7RAxe = 19123 + INTEGER(IntKi), PARAMETER :: M46N8RAxe = 19124 + INTEGER(IntKi), PARAMETER :: M46N9RAxe = 19125 + INTEGER(IntKi), PARAMETER :: M47N1RAxe = 19126 + INTEGER(IntKi), PARAMETER :: M47N2RAxe = 19127 + INTEGER(IntKi), PARAMETER :: M47N3RAxe = 19128 + INTEGER(IntKi), PARAMETER :: M47N4RAxe = 19129 + INTEGER(IntKi), PARAMETER :: M47N5RAxe = 19130 + INTEGER(IntKi), PARAMETER :: M47N6RAxe = 19131 + INTEGER(IntKi), PARAMETER :: M47N7RAxe = 19132 + INTEGER(IntKi), PARAMETER :: M47N8RAxe = 19133 + INTEGER(IntKi), PARAMETER :: M47N9RAxe = 19134 + INTEGER(IntKi), PARAMETER :: M48N1RAxe = 19135 + INTEGER(IntKi), PARAMETER :: M48N2RAxe = 19136 + INTEGER(IntKi), PARAMETER :: M48N3RAxe = 19137 + INTEGER(IntKi), PARAMETER :: M48N4RAxe = 19138 + INTEGER(IntKi), PARAMETER :: M48N5RAxe = 19139 + INTEGER(IntKi), PARAMETER :: M48N6RAxe = 19140 + INTEGER(IntKi), PARAMETER :: M48N7RAxe = 19141 + INTEGER(IntKi), PARAMETER :: M48N8RAxe = 19142 + INTEGER(IntKi), PARAMETER :: M48N9RAxe = 19143 + INTEGER(IntKi), PARAMETER :: M49N1RAxe = 19144 + INTEGER(IntKi), PARAMETER :: M49N2RAxe = 19145 + INTEGER(IntKi), PARAMETER :: M49N3RAxe = 19146 + INTEGER(IntKi), PARAMETER :: M49N4RAxe = 19147 + INTEGER(IntKi), PARAMETER :: M49N5RAxe = 19148 + INTEGER(IntKi), PARAMETER :: M49N6RAxe = 19149 + INTEGER(IntKi), PARAMETER :: M49N7RAxe = 19150 + INTEGER(IntKi), PARAMETER :: M49N8RAxe = 19151 + INTEGER(IntKi), PARAMETER :: M49N9RAxe = 19152 + INTEGER(IntKi), PARAMETER :: M50N1RAxe = 19153 + INTEGER(IntKi), PARAMETER :: M50N2RAxe = 19154 + INTEGER(IntKi), PARAMETER :: M50N3RAxe = 19155 + INTEGER(IntKi), PARAMETER :: M50N4RAxe = 19156 + INTEGER(IntKi), PARAMETER :: M50N5RAxe = 19157 + INTEGER(IntKi), PARAMETER :: M50N6RAxe = 19158 + INTEGER(IntKi), PARAMETER :: M50N7RAxe = 19159 + INTEGER(IntKi), PARAMETER :: M50N8RAxe = 19160 + INTEGER(IntKi), PARAMETER :: M50N9RAxe = 19161 + INTEGER(IntKi), PARAMETER :: M51N1RAxe = 19162 + INTEGER(IntKi), PARAMETER :: M51N2RAxe = 19163 + INTEGER(IntKi), PARAMETER :: M51N3RAxe = 19164 + INTEGER(IntKi), PARAMETER :: M51N4RAxe = 19165 + INTEGER(IntKi), PARAMETER :: M51N5RAxe = 19166 + INTEGER(IntKi), PARAMETER :: M51N6RAxe = 19167 + INTEGER(IntKi), PARAMETER :: M51N7RAxe = 19168 + INTEGER(IntKi), PARAMETER :: M51N8RAxe = 19169 + INTEGER(IntKi), PARAMETER :: M51N9RAxe = 19170 + INTEGER(IntKi), PARAMETER :: M52N1RAxe = 19171 + INTEGER(IntKi), PARAMETER :: M52N2RAxe = 19172 + INTEGER(IntKi), PARAMETER :: M52N3RAxe = 19173 + INTEGER(IntKi), PARAMETER :: M52N4RAxe = 19174 + INTEGER(IntKi), PARAMETER :: M52N5RAxe = 19175 + INTEGER(IntKi), PARAMETER :: M52N6RAxe = 19176 + INTEGER(IntKi), PARAMETER :: M52N7RAxe = 19177 + INTEGER(IntKi), PARAMETER :: M52N8RAxe = 19178 + INTEGER(IntKi), PARAMETER :: M52N9RAxe = 19179 + INTEGER(IntKi), PARAMETER :: M53N1RAxe = 19180 + INTEGER(IntKi), PARAMETER :: M53N2RAxe = 19181 + INTEGER(IntKi), PARAMETER :: M53N3RAxe = 19182 + INTEGER(IntKi), PARAMETER :: M53N4RAxe = 19183 + INTEGER(IntKi), PARAMETER :: M53N5RAxe = 19184 + INTEGER(IntKi), PARAMETER :: M53N6RAxe = 19185 + INTEGER(IntKi), PARAMETER :: M53N7RAxe = 19186 + INTEGER(IntKi), PARAMETER :: M53N8RAxe = 19187 + INTEGER(IntKi), PARAMETER :: M53N9RAxe = 19188 + INTEGER(IntKi), PARAMETER :: M54N1RAxe = 19189 + INTEGER(IntKi), PARAMETER :: M54N2RAxe = 19190 + INTEGER(IntKi), PARAMETER :: M54N3RAxe = 19191 + INTEGER(IntKi), PARAMETER :: M54N4RAxe = 19192 + INTEGER(IntKi), PARAMETER :: M54N5RAxe = 19193 + INTEGER(IntKi), PARAMETER :: M54N6RAxe = 19194 + INTEGER(IntKi), PARAMETER :: M54N7RAxe = 19195 + INTEGER(IntKi), PARAMETER :: M54N8RAxe = 19196 + INTEGER(IntKi), PARAMETER :: M54N9RAxe = 19197 + INTEGER(IntKi), PARAMETER :: M55N1RAxe = 19198 + INTEGER(IntKi), PARAMETER :: M55N2RAxe = 19199 + INTEGER(IntKi), PARAMETER :: M55N3RAxe = 19200 + INTEGER(IntKi), PARAMETER :: M55N4RAxe = 19201 + INTEGER(IntKi), PARAMETER :: M55N5RAxe = 19202 + INTEGER(IntKi), PARAMETER :: M55N6RAxe = 19203 + INTEGER(IntKi), PARAMETER :: M55N7RAxe = 19204 + INTEGER(IntKi), PARAMETER :: M55N8RAxe = 19205 + INTEGER(IntKi), PARAMETER :: M55N9RAxe = 19206 + INTEGER(IntKi), PARAMETER :: M56N1RAxe = 19207 + INTEGER(IntKi), PARAMETER :: M56N2RAxe = 19208 + INTEGER(IntKi), PARAMETER :: M56N3RAxe = 19209 + INTEGER(IntKi), PARAMETER :: M56N4RAxe = 19210 + INTEGER(IntKi), PARAMETER :: M56N5RAxe = 19211 + INTEGER(IntKi), PARAMETER :: M56N6RAxe = 19212 + INTEGER(IntKi), PARAMETER :: M56N7RAxe = 19213 + INTEGER(IntKi), PARAMETER :: M56N8RAxe = 19214 + INTEGER(IntKi), PARAMETER :: M56N9RAxe = 19215 + INTEGER(IntKi), PARAMETER :: M57N1RAxe = 19216 + INTEGER(IntKi), PARAMETER :: M57N2RAxe = 19217 + INTEGER(IntKi), PARAMETER :: M57N3RAxe = 19218 + INTEGER(IntKi), PARAMETER :: M57N4RAxe = 19219 + INTEGER(IntKi), PARAMETER :: M57N5RAxe = 19220 + INTEGER(IntKi), PARAMETER :: M57N6RAxe = 19221 + INTEGER(IntKi), PARAMETER :: M57N7RAxe = 19222 + INTEGER(IntKi), PARAMETER :: M57N8RAxe = 19223 + INTEGER(IntKi), PARAMETER :: M57N9RAxe = 19224 + INTEGER(IntKi), PARAMETER :: M58N1RAxe = 19225 + INTEGER(IntKi), PARAMETER :: M58N2RAxe = 19226 + INTEGER(IntKi), PARAMETER :: M58N3RAxe = 19227 + INTEGER(IntKi), PARAMETER :: M58N4RAxe = 19228 + INTEGER(IntKi), PARAMETER :: M58N5RAxe = 19229 + INTEGER(IntKi), PARAMETER :: M58N6RAxe = 19230 + INTEGER(IntKi), PARAMETER :: M58N7RAxe = 19231 + INTEGER(IntKi), PARAMETER :: M58N8RAxe = 19232 + INTEGER(IntKi), PARAMETER :: M58N9RAxe = 19233 + INTEGER(IntKi), PARAMETER :: M59N1RAxe = 19234 + INTEGER(IntKi), PARAMETER :: M59N2RAxe = 19235 + INTEGER(IntKi), PARAMETER :: M59N3RAxe = 19236 + INTEGER(IntKi), PARAMETER :: M59N4RAxe = 19237 + INTEGER(IntKi), PARAMETER :: M59N5RAxe = 19238 + INTEGER(IntKi), PARAMETER :: M59N6RAxe = 19239 + INTEGER(IntKi), PARAMETER :: M59N7RAxe = 19240 + INTEGER(IntKi), PARAMETER :: M59N8RAxe = 19241 + INTEGER(IntKi), PARAMETER :: M59N9RAxe = 19242 + INTEGER(IntKi), PARAMETER :: M60N1RAxe = 19243 + INTEGER(IntKi), PARAMETER :: M60N2RAxe = 19244 + INTEGER(IntKi), PARAMETER :: M60N3RAxe = 19245 + INTEGER(IntKi), PARAMETER :: M60N4RAxe = 19246 + INTEGER(IntKi), PARAMETER :: M60N5RAxe = 19247 + INTEGER(IntKi), PARAMETER :: M60N6RAxe = 19248 + INTEGER(IntKi), PARAMETER :: M60N7RAxe = 19249 + INTEGER(IntKi), PARAMETER :: M60N8RAxe = 19250 + INTEGER(IntKi), PARAMETER :: M60N9RAxe = 19251 + INTEGER(IntKi), PARAMETER :: M61N1RAxe = 19252 + INTEGER(IntKi), PARAMETER :: M61N2RAxe = 19253 + INTEGER(IntKi), PARAMETER :: M61N3RAxe = 19254 + INTEGER(IntKi), PARAMETER :: M61N4RAxe = 19255 + INTEGER(IntKi), PARAMETER :: M61N5RAxe = 19256 + INTEGER(IntKi), PARAMETER :: M61N6RAxe = 19257 + INTEGER(IntKi), PARAMETER :: M61N7RAxe = 19258 + INTEGER(IntKi), PARAMETER :: M61N8RAxe = 19259 + INTEGER(IntKi), PARAMETER :: M61N9RAxe = 19260 + INTEGER(IntKi), PARAMETER :: M62N1RAxe = 19261 + INTEGER(IntKi), PARAMETER :: M62N2RAxe = 19262 + INTEGER(IntKi), PARAMETER :: M62N3RAxe = 19263 + INTEGER(IntKi), PARAMETER :: M62N4RAxe = 19264 + INTEGER(IntKi), PARAMETER :: M62N5RAxe = 19265 + INTEGER(IntKi), PARAMETER :: M62N6RAxe = 19266 + INTEGER(IntKi), PARAMETER :: M62N7RAxe = 19267 + INTEGER(IntKi), PARAMETER :: M62N8RAxe = 19268 + INTEGER(IntKi), PARAMETER :: M62N9RAxe = 19269 + INTEGER(IntKi), PARAMETER :: M63N1RAxe = 19270 + INTEGER(IntKi), PARAMETER :: M63N2RAxe = 19271 + INTEGER(IntKi), PARAMETER :: M63N3RAxe = 19272 + INTEGER(IntKi), PARAMETER :: M63N4RAxe = 19273 + INTEGER(IntKi), PARAMETER :: M63N5RAxe = 19274 + INTEGER(IntKi), PARAMETER :: M63N6RAxe = 19275 + INTEGER(IntKi), PARAMETER :: M63N7RAxe = 19276 + INTEGER(IntKi), PARAMETER :: M63N8RAxe = 19277 + INTEGER(IntKi), PARAMETER :: M63N9RAxe = 19278 + INTEGER(IntKi), PARAMETER :: M64N1RAxe = 19279 + INTEGER(IntKi), PARAMETER :: M64N2RAxe = 19280 + INTEGER(IntKi), PARAMETER :: M64N3RAxe = 19281 + INTEGER(IntKi), PARAMETER :: M64N4RAxe = 19282 + INTEGER(IntKi), PARAMETER :: M64N5RAxe = 19283 + INTEGER(IntKi), PARAMETER :: M64N6RAxe = 19284 + INTEGER(IntKi), PARAMETER :: M64N7RAxe = 19285 + INTEGER(IntKi), PARAMETER :: M64N8RAxe = 19286 + INTEGER(IntKi), PARAMETER :: M64N9RAxe = 19287 + INTEGER(IntKi), PARAMETER :: M65N1RAxe = 19288 + INTEGER(IntKi), PARAMETER :: M65N2RAxe = 19289 + INTEGER(IntKi), PARAMETER :: M65N3RAxe = 19290 + INTEGER(IntKi), PARAMETER :: M65N4RAxe = 19291 + INTEGER(IntKi), PARAMETER :: M65N5RAxe = 19292 + INTEGER(IntKi), PARAMETER :: M65N6RAxe = 19293 + INTEGER(IntKi), PARAMETER :: M65N7RAxe = 19294 + INTEGER(IntKi), PARAMETER :: M65N8RAxe = 19295 + INTEGER(IntKi), PARAMETER :: M65N9RAxe = 19296 + INTEGER(IntKi), PARAMETER :: M66N1RAxe = 19297 + INTEGER(IntKi), PARAMETER :: M66N2RAxe = 19298 + INTEGER(IntKi), PARAMETER :: M66N3RAxe = 19299 + INTEGER(IntKi), PARAMETER :: M66N4RAxe = 19300 + INTEGER(IntKi), PARAMETER :: M66N5RAxe = 19301 + INTEGER(IntKi), PARAMETER :: M66N6RAxe = 19302 + INTEGER(IntKi), PARAMETER :: M66N7RAxe = 19303 + INTEGER(IntKi), PARAMETER :: M66N8RAxe = 19304 + INTEGER(IntKi), PARAMETER :: M66N9RAxe = 19305 + INTEGER(IntKi), PARAMETER :: M67N1RAxe = 19306 + INTEGER(IntKi), PARAMETER :: M67N2RAxe = 19307 + INTEGER(IntKi), PARAMETER :: M67N3RAxe = 19308 + INTEGER(IntKi), PARAMETER :: M67N4RAxe = 19309 + INTEGER(IntKi), PARAMETER :: M67N5RAxe = 19310 + INTEGER(IntKi), PARAMETER :: M67N6RAxe = 19311 + INTEGER(IntKi), PARAMETER :: M67N7RAxe = 19312 + INTEGER(IntKi), PARAMETER :: M67N8RAxe = 19313 + INTEGER(IntKi), PARAMETER :: M67N9RAxe = 19314 + INTEGER(IntKi), PARAMETER :: M68N1RAxe = 19315 + INTEGER(IntKi), PARAMETER :: M68N2RAxe = 19316 + INTEGER(IntKi), PARAMETER :: M68N3RAxe = 19317 + INTEGER(IntKi), PARAMETER :: M68N4RAxe = 19318 + INTEGER(IntKi), PARAMETER :: M68N5RAxe = 19319 + INTEGER(IntKi), PARAMETER :: M68N6RAxe = 19320 + INTEGER(IntKi), PARAMETER :: M68N7RAxe = 19321 + INTEGER(IntKi), PARAMETER :: M68N8RAxe = 19322 + INTEGER(IntKi), PARAMETER :: M68N9RAxe = 19323 + INTEGER(IntKi), PARAMETER :: M69N1RAxe = 19324 + INTEGER(IntKi), PARAMETER :: M69N2RAxe = 19325 + INTEGER(IntKi), PARAMETER :: M69N3RAxe = 19326 + INTEGER(IntKi), PARAMETER :: M69N4RAxe = 19327 + INTEGER(IntKi), PARAMETER :: M69N5RAxe = 19328 + INTEGER(IntKi), PARAMETER :: M69N6RAxe = 19329 + INTEGER(IntKi), PARAMETER :: M69N7RAxe = 19330 + INTEGER(IntKi), PARAMETER :: M69N8RAxe = 19331 + INTEGER(IntKi), PARAMETER :: M69N9RAxe = 19332 + INTEGER(IntKi), PARAMETER :: M70N1RAxe = 19333 + INTEGER(IntKi), PARAMETER :: M70N2RAxe = 19334 + INTEGER(IntKi), PARAMETER :: M70N3RAxe = 19335 + INTEGER(IntKi), PARAMETER :: M70N4RAxe = 19336 + INTEGER(IntKi), PARAMETER :: M70N5RAxe = 19337 + INTEGER(IntKi), PARAMETER :: M70N6RAxe = 19338 + INTEGER(IntKi), PARAMETER :: M70N7RAxe = 19339 + INTEGER(IntKi), PARAMETER :: M70N8RAxe = 19340 + INTEGER(IntKi), PARAMETER :: M70N9RAxe = 19341 + INTEGER(IntKi), PARAMETER :: M71N1RAxe = 19342 + INTEGER(IntKi), PARAMETER :: M71N2RAxe = 19343 + INTEGER(IntKi), PARAMETER :: M71N3RAxe = 19344 + INTEGER(IntKi), PARAMETER :: M71N4RAxe = 19345 + INTEGER(IntKi), PARAMETER :: M71N5RAxe = 19346 + INTEGER(IntKi), PARAMETER :: M71N6RAxe = 19347 + INTEGER(IntKi), PARAMETER :: M71N7RAxe = 19348 + INTEGER(IntKi), PARAMETER :: M71N8RAxe = 19349 + INTEGER(IntKi), PARAMETER :: M71N9RAxe = 19350 + INTEGER(IntKi), PARAMETER :: M72N1RAxe = 19351 + INTEGER(IntKi), PARAMETER :: M72N2RAxe = 19352 + INTEGER(IntKi), PARAMETER :: M72N3RAxe = 19353 + INTEGER(IntKi), PARAMETER :: M72N4RAxe = 19354 + INTEGER(IntKi), PARAMETER :: M72N5RAxe = 19355 + INTEGER(IntKi), PARAMETER :: M72N6RAxe = 19356 + INTEGER(IntKi), PARAMETER :: M72N7RAxe = 19357 + INTEGER(IntKi), PARAMETER :: M72N8RAxe = 19358 + INTEGER(IntKi), PARAMETER :: M72N9RAxe = 19359 + INTEGER(IntKi), PARAMETER :: M73N1RAxe = 19360 + INTEGER(IntKi), PARAMETER :: M73N2RAxe = 19361 + INTEGER(IntKi), PARAMETER :: M73N3RAxe = 19362 + INTEGER(IntKi), PARAMETER :: M73N4RAxe = 19363 + INTEGER(IntKi), PARAMETER :: M73N5RAxe = 19364 + INTEGER(IntKi), PARAMETER :: M73N6RAxe = 19365 + INTEGER(IntKi), PARAMETER :: M73N7RAxe = 19366 + INTEGER(IntKi), PARAMETER :: M73N8RAxe = 19367 + INTEGER(IntKi), PARAMETER :: M73N9RAxe = 19368 + INTEGER(IntKi), PARAMETER :: M74N1RAxe = 19369 + INTEGER(IntKi), PARAMETER :: M74N2RAxe = 19370 + INTEGER(IntKi), PARAMETER :: M74N3RAxe = 19371 + INTEGER(IntKi), PARAMETER :: M74N4RAxe = 19372 + INTEGER(IntKi), PARAMETER :: M74N5RAxe = 19373 + INTEGER(IntKi), PARAMETER :: M74N6RAxe = 19374 + INTEGER(IntKi), PARAMETER :: M74N7RAxe = 19375 + INTEGER(IntKi), PARAMETER :: M74N8RAxe = 19376 + INTEGER(IntKi), PARAMETER :: M74N9RAxe = 19377 + INTEGER(IntKi), PARAMETER :: M75N1RAxe = 19378 + INTEGER(IntKi), PARAMETER :: M75N2RAxe = 19379 + INTEGER(IntKi), PARAMETER :: M75N3RAxe = 19380 + INTEGER(IntKi), PARAMETER :: M75N4RAxe = 19381 + INTEGER(IntKi), PARAMETER :: M75N5RAxe = 19382 + INTEGER(IntKi), PARAMETER :: M75N6RAxe = 19383 + INTEGER(IntKi), PARAMETER :: M75N7RAxe = 19384 + INTEGER(IntKi), PARAMETER :: M75N8RAxe = 19385 + INTEGER(IntKi), PARAMETER :: M75N9RAxe = 19386 + INTEGER(IntKi), PARAMETER :: M76N1RAxe = 19387 + INTEGER(IntKi), PARAMETER :: M76N2RAxe = 19388 + INTEGER(IntKi), PARAMETER :: M76N3RAxe = 19389 + INTEGER(IntKi), PARAMETER :: M76N4RAxe = 19390 + INTEGER(IntKi), PARAMETER :: M76N5RAxe = 19391 + INTEGER(IntKi), PARAMETER :: M76N6RAxe = 19392 + INTEGER(IntKi), PARAMETER :: M76N7RAxe = 19393 + INTEGER(IntKi), PARAMETER :: M76N8RAxe = 19394 + INTEGER(IntKi), PARAMETER :: M76N9RAxe = 19395 + INTEGER(IntKi), PARAMETER :: M77N1RAxe = 19396 + INTEGER(IntKi), PARAMETER :: M77N2RAxe = 19397 + INTEGER(IntKi), PARAMETER :: M77N3RAxe = 19398 + INTEGER(IntKi), PARAMETER :: M77N4RAxe = 19399 + INTEGER(IntKi), PARAMETER :: M77N5RAxe = 19400 + INTEGER(IntKi), PARAMETER :: M77N6RAxe = 19401 + INTEGER(IntKi), PARAMETER :: M77N7RAxe = 19402 + INTEGER(IntKi), PARAMETER :: M77N8RAxe = 19403 + INTEGER(IntKi), PARAMETER :: M77N9RAxe = 19404 + INTEGER(IntKi), PARAMETER :: M78N1RAxe = 19405 + INTEGER(IntKi), PARAMETER :: M78N2RAxe = 19406 + INTEGER(IntKi), PARAMETER :: M78N3RAxe = 19407 + INTEGER(IntKi), PARAMETER :: M78N4RAxe = 19408 + INTEGER(IntKi), PARAMETER :: M78N5RAxe = 19409 + INTEGER(IntKi), PARAMETER :: M78N6RAxe = 19410 + INTEGER(IntKi), PARAMETER :: M78N7RAxe = 19411 + INTEGER(IntKi), PARAMETER :: M78N8RAxe = 19412 + INTEGER(IntKi), PARAMETER :: M78N9RAxe = 19413 + INTEGER(IntKi), PARAMETER :: M79N1RAxe = 19414 + INTEGER(IntKi), PARAMETER :: M79N2RAxe = 19415 + INTEGER(IntKi), PARAMETER :: M79N3RAxe = 19416 + INTEGER(IntKi), PARAMETER :: M79N4RAxe = 19417 + INTEGER(IntKi), PARAMETER :: M79N5RAxe = 19418 + INTEGER(IntKi), PARAMETER :: M79N6RAxe = 19419 + INTEGER(IntKi), PARAMETER :: M79N7RAxe = 19420 + INTEGER(IntKi), PARAMETER :: M79N8RAxe = 19421 + INTEGER(IntKi), PARAMETER :: M79N9RAxe = 19422 + INTEGER(IntKi), PARAMETER :: M80N1RAxe = 19423 + INTEGER(IntKi), PARAMETER :: M80N2RAxe = 19424 + INTEGER(IntKi), PARAMETER :: M80N3RAxe = 19425 + INTEGER(IntKi), PARAMETER :: M80N4RAxe = 19426 + INTEGER(IntKi), PARAMETER :: M80N5RAxe = 19427 + INTEGER(IntKi), PARAMETER :: M80N6RAxe = 19428 + INTEGER(IntKi), PARAMETER :: M80N7RAxe = 19429 + INTEGER(IntKi), PARAMETER :: M80N8RAxe = 19430 + INTEGER(IntKi), PARAMETER :: M80N9RAxe = 19431 + INTEGER(IntKi), PARAMETER :: M81N1RAxe = 19432 + INTEGER(IntKi), PARAMETER :: M81N2RAxe = 19433 + INTEGER(IntKi), PARAMETER :: M81N3RAxe = 19434 + INTEGER(IntKi), PARAMETER :: M81N4RAxe = 19435 + INTEGER(IntKi), PARAMETER :: M81N5RAxe = 19436 + INTEGER(IntKi), PARAMETER :: M81N6RAxe = 19437 + INTEGER(IntKi), PARAMETER :: M81N7RAxe = 19438 + INTEGER(IntKi), PARAMETER :: M81N8RAxe = 19439 + INTEGER(IntKi), PARAMETER :: M81N9RAxe = 19440 + INTEGER(IntKi), PARAMETER :: M82N1RAxe = 19441 + INTEGER(IntKi), PARAMETER :: M82N2RAxe = 19442 + INTEGER(IntKi), PARAMETER :: M82N3RAxe = 19443 + INTEGER(IntKi), PARAMETER :: M82N4RAxe = 19444 + INTEGER(IntKi), PARAMETER :: M82N5RAxe = 19445 + INTEGER(IntKi), PARAMETER :: M82N6RAxe = 19446 + INTEGER(IntKi), PARAMETER :: M82N7RAxe = 19447 + INTEGER(IntKi), PARAMETER :: M82N8RAxe = 19448 + INTEGER(IntKi), PARAMETER :: M82N9RAxe = 19449 + INTEGER(IntKi), PARAMETER :: M83N1RAxe = 19450 + INTEGER(IntKi), PARAMETER :: M83N2RAxe = 19451 + INTEGER(IntKi), PARAMETER :: M83N3RAxe = 19452 + INTEGER(IntKi), PARAMETER :: M83N4RAxe = 19453 + INTEGER(IntKi), PARAMETER :: M83N5RAxe = 19454 + INTEGER(IntKi), PARAMETER :: M83N6RAxe = 19455 + INTEGER(IntKi), PARAMETER :: M83N7RAxe = 19456 + INTEGER(IntKi), PARAMETER :: M83N8RAxe = 19457 + INTEGER(IntKi), PARAMETER :: M83N9RAxe = 19458 + INTEGER(IntKi), PARAMETER :: M84N1RAxe = 19459 + INTEGER(IntKi), PARAMETER :: M84N2RAxe = 19460 + INTEGER(IntKi), PARAMETER :: M84N3RAxe = 19461 + INTEGER(IntKi), PARAMETER :: M84N4RAxe = 19462 + INTEGER(IntKi), PARAMETER :: M84N5RAxe = 19463 + INTEGER(IntKi), PARAMETER :: M84N6RAxe = 19464 + INTEGER(IntKi), PARAMETER :: M84N7RAxe = 19465 + INTEGER(IntKi), PARAMETER :: M84N8RAxe = 19466 + INTEGER(IntKi), PARAMETER :: M84N9RAxe = 19467 + INTEGER(IntKi), PARAMETER :: M85N1RAxe = 19468 + INTEGER(IntKi), PARAMETER :: M85N2RAxe = 19469 + INTEGER(IntKi), PARAMETER :: M85N3RAxe = 19470 + INTEGER(IntKi), PARAMETER :: M85N4RAxe = 19471 + INTEGER(IntKi), PARAMETER :: M85N5RAxe = 19472 + INTEGER(IntKi), PARAMETER :: M85N6RAxe = 19473 + INTEGER(IntKi), PARAMETER :: M85N7RAxe = 19474 + INTEGER(IntKi), PARAMETER :: M85N8RAxe = 19475 + INTEGER(IntKi), PARAMETER :: M85N9RAxe = 19476 + INTEGER(IntKi), PARAMETER :: M86N1RAxe = 19477 + INTEGER(IntKi), PARAMETER :: M86N2RAxe = 19478 + INTEGER(IntKi), PARAMETER :: M86N3RAxe = 19479 + INTEGER(IntKi), PARAMETER :: M86N4RAxe = 19480 + INTEGER(IntKi), PARAMETER :: M86N5RAxe = 19481 + INTEGER(IntKi), PARAMETER :: M86N6RAxe = 19482 + INTEGER(IntKi), PARAMETER :: M86N7RAxe = 19483 + INTEGER(IntKi), PARAMETER :: M86N8RAxe = 19484 + INTEGER(IntKi), PARAMETER :: M86N9RAxe = 19485 + INTEGER(IntKi), PARAMETER :: M87N1RAxe = 19486 + INTEGER(IntKi), PARAMETER :: M87N2RAxe = 19487 + INTEGER(IntKi), PARAMETER :: M87N3RAxe = 19488 + INTEGER(IntKi), PARAMETER :: M87N4RAxe = 19489 + INTEGER(IntKi), PARAMETER :: M87N5RAxe = 19490 + INTEGER(IntKi), PARAMETER :: M87N6RAxe = 19491 + INTEGER(IntKi), PARAMETER :: M87N7RAxe = 19492 + INTEGER(IntKi), PARAMETER :: M87N8RAxe = 19493 + INTEGER(IntKi), PARAMETER :: M87N9RAxe = 19494 + INTEGER(IntKi), PARAMETER :: M88N1RAxe = 19495 + INTEGER(IntKi), PARAMETER :: M88N2RAxe = 19496 + INTEGER(IntKi), PARAMETER :: M88N3RAxe = 19497 + INTEGER(IntKi), PARAMETER :: M88N4RAxe = 19498 + INTEGER(IntKi), PARAMETER :: M88N5RAxe = 19499 + INTEGER(IntKi), PARAMETER :: M88N6RAxe = 19500 + INTEGER(IntKi), PARAMETER :: M88N7RAxe = 19501 + INTEGER(IntKi), PARAMETER :: M88N8RAxe = 19502 + INTEGER(IntKi), PARAMETER :: M88N9RAxe = 19503 + INTEGER(IntKi), PARAMETER :: M89N1RAxe = 19504 + INTEGER(IntKi), PARAMETER :: M89N2RAxe = 19505 + INTEGER(IntKi), PARAMETER :: M89N3RAxe = 19506 + INTEGER(IntKi), PARAMETER :: M89N4RAxe = 19507 + INTEGER(IntKi), PARAMETER :: M89N5RAxe = 19508 + INTEGER(IntKi), PARAMETER :: M89N6RAxe = 19509 + INTEGER(IntKi), PARAMETER :: M89N7RAxe = 19510 + INTEGER(IntKi), PARAMETER :: M89N8RAxe = 19511 + INTEGER(IntKi), PARAMETER :: M89N9RAxe = 19512 + INTEGER(IntKi), PARAMETER :: M90N1RAxe = 19513 + INTEGER(IntKi), PARAMETER :: M90N2RAxe = 19514 + INTEGER(IntKi), PARAMETER :: M90N3RAxe = 19515 + INTEGER(IntKi), PARAMETER :: M90N4RAxe = 19516 + INTEGER(IntKi), PARAMETER :: M90N5RAxe = 19517 + INTEGER(IntKi), PARAMETER :: M90N6RAxe = 19518 + INTEGER(IntKi), PARAMETER :: M90N7RAxe = 19519 + INTEGER(IntKi), PARAMETER :: M90N8RAxe = 19520 + INTEGER(IntKi), PARAMETER :: M90N9RAxe = 19521 + INTEGER(IntKi), PARAMETER :: M91N1RAxe = 19522 + INTEGER(IntKi), PARAMETER :: M91N2RAxe = 19523 + INTEGER(IntKi), PARAMETER :: M91N3RAxe = 19524 + INTEGER(IntKi), PARAMETER :: M91N4RAxe = 19525 + INTEGER(IntKi), PARAMETER :: M91N5RAxe = 19526 + INTEGER(IntKi), PARAMETER :: M91N6RAxe = 19527 + INTEGER(IntKi), PARAMETER :: M91N7RAxe = 19528 + INTEGER(IntKi), PARAMETER :: M91N8RAxe = 19529 + INTEGER(IntKi), PARAMETER :: M91N9RAxe = 19530 + INTEGER(IntKi), PARAMETER :: M92N1RAxe = 19531 + INTEGER(IntKi), PARAMETER :: M92N2RAxe = 19532 + INTEGER(IntKi), PARAMETER :: M92N3RAxe = 19533 + INTEGER(IntKi), PARAMETER :: M92N4RAxe = 19534 + INTEGER(IntKi), PARAMETER :: M92N5RAxe = 19535 + INTEGER(IntKi), PARAMETER :: M92N6RAxe = 19536 + INTEGER(IntKi), PARAMETER :: M92N7RAxe = 19537 + INTEGER(IntKi), PARAMETER :: M92N8RAxe = 19538 + INTEGER(IntKi), PARAMETER :: M92N9RAxe = 19539 + INTEGER(IntKi), PARAMETER :: M93N1RAxe = 19540 + INTEGER(IntKi), PARAMETER :: M93N2RAxe = 19541 + INTEGER(IntKi), PARAMETER :: M93N3RAxe = 19542 + INTEGER(IntKi), PARAMETER :: M93N4RAxe = 19543 + INTEGER(IntKi), PARAMETER :: M93N5RAxe = 19544 + INTEGER(IntKi), PARAMETER :: M93N6RAxe = 19545 + INTEGER(IntKi), PARAMETER :: M93N7RAxe = 19546 + INTEGER(IntKi), PARAMETER :: M93N8RAxe = 19547 + INTEGER(IntKi), PARAMETER :: M93N9RAxe = 19548 + INTEGER(IntKi), PARAMETER :: M94N1RAxe = 19549 + INTEGER(IntKi), PARAMETER :: M94N2RAxe = 19550 + INTEGER(IntKi), PARAMETER :: M94N3RAxe = 19551 + INTEGER(IntKi), PARAMETER :: M94N4RAxe = 19552 + INTEGER(IntKi), PARAMETER :: M94N5RAxe = 19553 + INTEGER(IntKi), PARAMETER :: M94N6RAxe = 19554 + INTEGER(IntKi), PARAMETER :: M94N7RAxe = 19555 + INTEGER(IntKi), PARAMETER :: M94N8RAxe = 19556 + INTEGER(IntKi), PARAMETER :: M94N9RAxe = 19557 + INTEGER(IntKi), PARAMETER :: M95N1RAxe = 19558 + INTEGER(IntKi), PARAMETER :: M95N2RAxe = 19559 + INTEGER(IntKi), PARAMETER :: M95N3RAxe = 19560 + INTEGER(IntKi), PARAMETER :: M95N4RAxe = 19561 + INTEGER(IntKi), PARAMETER :: M95N5RAxe = 19562 + INTEGER(IntKi), PARAMETER :: M95N6RAxe = 19563 + INTEGER(IntKi), PARAMETER :: M95N7RAxe = 19564 + INTEGER(IntKi), PARAMETER :: M95N8RAxe = 19565 + INTEGER(IntKi), PARAMETER :: M95N9RAxe = 19566 + INTEGER(IntKi), PARAMETER :: M96N1RAxe = 19567 + INTEGER(IntKi), PARAMETER :: M96N2RAxe = 19568 + INTEGER(IntKi), PARAMETER :: M96N3RAxe = 19569 + INTEGER(IntKi), PARAMETER :: M96N4RAxe = 19570 + INTEGER(IntKi), PARAMETER :: M96N5RAxe = 19571 + INTEGER(IntKi), PARAMETER :: M96N6RAxe = 19572 + INTEGER(IntKi), PARAMETER :: M96N7RAxe = 19573 + INTEGER(IntKi), PARAMETER :: M96N8RAxe = 19574 + INTEGER(IntKi), PARAMETER :: M96N9RAxe = 19575 + INTEGER(IntKi), PARAMETER :: M97N1RAxe = 19576 + INTEGER(IntKi), PARAMETER :: M97N2RAxe = 19577 + INTEGER(IntKi), PARAMETER :: M97N3RAxe = 19578 + INTEGER(IntKi), PARAMETER :: M97N4RAxe = 19579 + INTEGER(IntKi), PARAMETER :: M97N5RAxe = 19580 + INTEGER(IntKi), PARAMETER :: M97N6RAxe = 19581 + INTEGER(IntKi), PARAMETER :: M97N7RAxe = 19582 + INTEGER(IntKi), PARAMETER :: M97N8RAxe = 19583 + INTEGER(IntKi), PARAMETER :: M97N9RAxe = 19584 + INTEGER(IntKi), PARAMETER :: M98N1RAxe = 19585 + INTEGER(IntKi), PARAMETER :: M98N2RAxe = 19586 + INTEGER(IntKi), PARAMETER :: M98N3RAxe = 19587 + INTEGER(IntKi), PARAMETER :: M98N4RAxe = 19588 + INTEGER(IntKi), PARAMETER :: M98N5RAxe = 19589 + INTEGER(IntKi), PARAMETER :: M98N6RAxe = 19590 + INTEGER(IntKi), PARAMETER :: M98N7RAxe = 19591 + INTEGER(IntKi), PARAMETER :: M98N8RAxe = 19592 + INTEGER(IntKi), PARAMETER :: M98N9RAxe = 19593 + INTEGER(IntKi), PARAMETER :: M99N1RAxe = 19594 + INTEGER(IntKi), PARAMETER :: M99N2RAxe = 19595 + INTEGER(IntKi), PARAMETER :: M99N3RAxe = 19596 + INTEGER(IntKi), PARAMETER :: M99N4RAxe = 19597 + INTEGER(IntKi), PARAMETER :: M99N5RAxe = 19598 + INTEGER(IntKi), PARAMETER :: M99N6RAxe = 19599 + INTEGER(IntKi), PARAMETER :: M99N7RAxe = 19600 + INTEGER(IntKi), PARAMETER :: M99N8RAxe = 19601 + INTEGER(IntKi), PARAMETER :: M99N9RAxe = 19602 + INTEGER(IntKi), PARAMETER :: M01N1RAye = 19603 + INTEGER(IntKi), PARAMETER :: M01N2RAye = 19604 + INTEGER(IntKi), PARAMETER :: M01N3RAye = 19605 + INTEGER(IntKi), PARAMETER :: M01N4RAye = 19606 + INTEGER(IntKi), PARAMETER :: M01N5RAye = 19607 + INTEGER(IntKi), PARAMETER :: M01N6RAye = 19608 + INTEGER(IntKi), PARAMETER :: M01N7RAye = 19609 + INTEGER(IntKi), PARAMETER :: M01N8RAye = 19610 + INTEGER(IntKi), PARAMETER :: M01N9RAye = 19611 + INTEGER(IntKi), PARAMETER :: M02N1RAye = 19612 + INTEGER(IntKi), PARAMETER :: M02N2RAye = 19613 + INTEGER(IntKi), PARAMETER :: M02N3RAye = 19614 + INTEGER(IntKi), PARAMETER :: M02N4RAye = 19615 + INTEGER(IntKi), PARAMETER :: M02N5RAye = 19616 + INTEGER(IntKi), PARAMETER :: M02N6RAye = 19617 + INTEGER(IntKi), PARAMETER :: M02N7RAye = 19618 + INTEGER(IntKi), PARAMETER :: M02N8RAye = 19619 + INTEGER(IntKi), PARAMETER :: M02N9RAye = 19620 + INTEGER(IntKi), PARAMETER :: M03N1RAye = 19621 + INTEGER(IntKi), PARAMETER :: M03N2RAye = 19622 + INTEGER(IntKi), PARAMETER :: M03N3RAye = 19623 + INTEGER(IntKi), PARAMETER :: M03N4RAye = 19624 + INTEGER(IntKi), PARAMETER :: M03N5RAye = 19625 + INTEGER(IntKi), PARAMETER :: M03N6RAye = 19626 + INTEGER(IntKi), PARAMETER :: M03N7RAye = 19627 + INTEGER(IntKi), PARAMETER :: M03N8RAye = 19628 + INTEGER(IntKi), PARAMETER :: M03N9RAye = 19629 + INTEGER(IntKi), PARAMETER :: M04N1RAye = 19630 + INTEGER(IntKi), PARAMETER :: M04N2RAye = 19631 + INTEGER(IntKi), PARAMETER :: M04N3RAye = 19632 + INTEGER(IntKi), PARAMETER :: M04N4RAye = 19633 + INTEGER(IntKi), PARAMETER :: M04N5RAye = 19634 + INTEGER(IntKi), PARAMETER :: M04N6RAye = 19635 + INTEGER(IntKi), PARAMETER :: M04N7RAye = 19636 + INTEGER(IntKi), PARAMETER :: M04N8RAye = 19637 + INTEGER(IntKi), PARAMETER :: M04N9RAye = 19638 + INTEGER(IntKi), PARAMETER :: M05N1RAye = 19639 + INTEGER(IntKi), PARAMETER :: M05N2RAye = 19640 + INTEGER(IntKi), PARAMETER :: M05N3RAye = 19641 + INTEGER(IntKi), PARAMETER :: M05N4RAye = 19642 + INTEGER(IntKi), PARAMETER :: M05N5RAye = 19643 + INTEGER(IntKi), PARAMETER :: M05N6RAye = 19644 + INTEGER(IntKi), PARAMETER :: M05N7RAye = 19645 + INTEGER(IntKi), PARAMETER :: M05N8RAye = 19646 + INTEGER(IntKi), PARAMETER :: M05N9RAye = 19647 + INTEGER(IntKi), PARAMETER :: M06N1RAye = 19648 + INTEGER(IntKi), PARAMETER :: M06N2RAye = 19649 + INTEGER(IntKi), PARAMETER :: M06N3RAye = 19650 + INTEGER(IntKi), PARAMETER :: M06N4RAye = 19651 + INTEGER(IntKi), PARAMETER :: M06N5RAye = 19652 + INTEGER(IntKi), PARAMETER :: M06N6RAye = 19653 + INTEGER(IntKi), PARAMETER :: M06N7RAye = 19654 + INTEGER(IntKi), PARAMETER :: M06N8RAye = 19655 + INTEGER(IntKi), PARAMETER :: M06N9RAye = 19656 + INTEGER(IntKi), PARAMETER :: M07N1RAye = 19657 + INTEGER(IntKi), PARAMETER :: M07N2RAye = 19658 + INTEGER(IntKi), PARAMETER :: M07N3RAye = 19659 + INTEGER(IntKi), PARAMETER :: M07N4RAye = 19660 + INTEGER(IntKi), PARAMETER :: M07N5RAye = 19661 + INTEGER(IntKi), PARAMETER :: M07N6RAye = 19662 + INTEGER(IntKi), PARAMETER :: M07N7RAye = 19663 + INTEGER(IntKi), PARAMETER :: M07N8RAye = 19664 + INTEGER(IntKi), PARAMETER :: M07N9RAye = 19665 + INTEGER(IntKi), PARAMETER :: M08N1RAye = 19666 + INTEGER(IntKi), PARAMETER :: M08N2RAye = 19667 + INTEGER(IntKi), PARAMETER :: M08N3RAye = 19668 + INTEGER(IntKi), PARAMETER :: M08N4RAye = 19669 + INTEGER(IntKi), PARAMETER :: M08N5RAye = 19670 + INTEGER(IntKi), PARAMETER :: M08N6RAye = 19671 + INTEGER(IntKi), PARAMETER :: M08N7RAye = 19672 + INTEGER(IntKi), PARAMETER :: M08N8RAye = 19673 + INTEGER(IntKi), PARAMETER :: M08N9RAye = 19674 + INTEGER(IntKi), PARAMETER :: M09N1RAye = 19675 + INTEGER(IntKi), PARAMETER :: M09N2RAye = 19676 + INTEGER(IntKi), PARAMETER :: M09N3RAye = 19677 + INTEGER(IntKi), PARAMETER :: M09N4RAye = 19678 + INTEGER(IntKi), PARAMETER :: M09N5RAye = 19679 + INTEGER(IntKi), PARAMETER :: M09N6RAye = 19680 + INTEGER(IntKi), PARAMETER :: M09N7RAye = 19681 + INTEGER(IntKi), PARAMETER :: M09N8RAye = 19682 + INTEGER(IntKi), PARAMETER :: M09N9RAye = 19683 + INTEGER(IntKi), PARAMETER :: M10N1RAye = 19684 + INTEGER(IntKi), PARAMETER :: M10N2RAye = 19685 + INTEGER(IntKi), PARAMETER :: M10N3RAye = 19686 + INTEGER(IntKi), PARAMETER :: M10N4RAye = 19687 + INTEGER(IntKi), PARAMETER :: M10N5RAye = 19688 + INTEGER(IntKi), PARAMETER :: M10N6RAye = 19689 + INTEGER(IntKi), PARAMETER :: M10N7RAye = 19690 + INTEGER(IntKi), PARAMETER :: M10N8RAye = 19691 + INTEGER(IntKi), PARAMETER :: M10N9RAye = 19692 + INTEGER(IntKi), PARAMETER :: M11N1RAye = 19693 + INTEGER(IntKi), PARAMETER :: M11N2RAye = 19694 + INTEGER(IntKi), PARAMETER :: M11N3RAye = 19695 + INTEGER(IntKi), PARAMETER :: M11N4RAye = 19696 + INTEGER(IntKi), PARAMETER :: M11N5RAye = 19697 + INTEGER(IntKi), PARAMETER :: M11N6RAye = 19698 + INTEGER(IntKi), PARAMETER :: M11N7RAye = 19699 + INTEGER(IntKi), PARAMETER :: M11N8RAye = 19700 + INTEGER(IntKi), PARAMETER :: M11N9RAye = 19701 + INTEGER(IntKi), PARAMETER :: M12N1RAye = 19702 + INTEGER(IntKi), PARAMETER :: M12N2RAye = 19703 + INTEGER(IntKi), PARAMETER :: M12N3RAye = 19704 + INTEGER(IntKi), PARAMETER :: M12N4RAye = 19705 + INTEGER(IntKi), PARAMETER :: M12N5RAye = 19706 + INTEGER(IntKi), PARAMETER :: M12N6RAye = 19707 + INTEGER(IntKi), PARAMETER :: M12N7RAye = 19708 + INTEGER(IntKi), PARAMETER :: M12N8RAye = 19709 + INTEGER(IntKi), PARAMETER :: M12N9RAye = 19710 + INTEGER(IntKi), PARAMETER :: M13N1RAye = 19711 + INTEGER(IntKi), PARAMETER :: M13N2RAye = 19712 + INTEGER(IntKi), PARAMETER :: M13N3RAye = 19713 + INTEGER(IntKi), PARAMETER :: M13N4RAye = 19714 + INTEGER(IntKi), PARAMETER :: M13N5RAye = 19715 + INTEGER(IntKi), PARAMETER :: M13N6RAye = 19716 + INTEGER(IntKi), PARAMETER :: M13N7RAye = 19717 + INTEGER(IntKi), PARAMETER :: M13N8RAye = 19718 + INTEGER(IntKi), PARAMETER :: M13N9RAye = 19719 + INTEGER(IntKi), PARAMETER :: M14N1RAye = 19720 + INTEGER(IntKi), PARAMETER :: M14N2RAye = 19721 + INTEGER(IntKi), PARAMETER :: M14N3RAye = 19722 + INTEGER(IntKi), PARAMETER :: M14N4RAye = 19723 + INTEGER(IntKi), PARAMETER :: M14N5RAye = 19724 + INTEGER(IntKi), PARAMETER :: M14N6RAye = 19725 + INTEGER(IntKi), PARAMETER :: M14N7RAye = 19726 + INTEGER(IntKi), PARAMETER :: M14N8RAye = 19727 + INTEGER(IntKi), PARAMETER :: M14N9RAye = 19728 + INTEGER(IntKi), PARAMETER :: M15N1RAye = 19729 + INTEGER(IntKi), PARAMETER :: M15N2RAye = 19730 + INTEGER(IntKi), PARAMETER :: M15N3RAye = 19731 + INTEGER(IntKi), PARAMETER :: M15N4RAye = 19732 + INTEGER(IntKi), PARAMETER :: M15N5RAye = 19733 + INTEGER(IntKi), PARAMETER :: M15N6RAye = 19734 + INTEGER(IntKi), PARAMETER :: M15N7RAye = 19735 + INTEGER(IntKi), PARAMETER :: M15N8RAye = 19736 + INTEGER(IntKi), PARAMETER :: M15N9RAye = 19737 + INTEGER(IntKi), PARAMETER :: M16N1RAye = 19738 + INTEGER(IntKi), PARAMETER :: M16N2RAye = 19739 + INTEGER(IntKi), PARAMETER :: M16N3RAye = 19740 + INTEGER(IntKi), PARAMETER :: M16N4RAye = 19741 + INTEGER(IntKi), PARAMETER :: M16N5RAye = 19742 + INTEGER(IntKi), PARAMETER :: M16N6RAye = 19743 + INTEGER(IntKi), PARAMETER :: M16N7RAye = 19744 + INTEGER(IntKi), PARAMETER :: M16N8RAye = 19745 + INTEGER(IntKi), PARAMETER :: M16N9RAye = 19746 + INTEGER(IntKi), PARAMETER :: M17N1RAye = 19747 + INTEGER(IntKi), PARAMETER :: M17N2RAye = 19748 + INTEGER(IntKi), PARAMETER :: M17N3RAye = 19749 + INTEGER(IntKi), PARAMETER :: M17N4RAye = 19750 + INTEGER(IntKi), PARAMETER :: M17N5RAye = 19751 + INTEGER(IntKi), PARAMETER :: M17N6RAye = 19752 + INTEGER(IntKi), PARAMETER :: M17N7RAye = 19753 + INTEGER(IntKi), PARAMETER :: M17N8RAye = 19754 + INTEGER(IntKi), PARAMETER :: M17N9RAye = 19755 + INTEGER(IntKi), PARAMETER :: M18N1RAye = 19756 + INTEGER(IntKi), PARAMETER :: M18N2RAye = 19757 + INTEGER(IntKi), PARAMETER :: M18N3RAye = 19758 + INTEGER(IntKi), PARAMETER :: M18N4RAye = 19759 + INTEGER(IntKi), PARAMETER :: M18N5RAye = 19760 + INTEGER(IntKi), PARAMETER :: M18N6RAye = 19761 + INTEGER(IntKi), PARAMETER :: M18N7RAye = 19762 + INTEGER(IntKi), PARAMETER :: M18N8RAye = 19763 + INTEGER(IntKi), PARAMETER :: M18N9RAye = 19764 + INTEGER(IntKi), PARAMETER :: M19N1RAye = 19765 + INTEGER(IntKi), PARAMETER :: M19N2RAye = 19766 + INTEGER(IntKi), PARAMETER :: M19N3RAye = 19767 + INTEGER(IntKi), PARAMETER :: M19N4RAye = 19768 + INTEGER(IntKi), PARAMETER :: M19N5RAye = 19769 + INTEGER(IntKi), PARAMETER :: M19N6RAye = 19770 + INTEGER(IntKi), PARAMETER :: M19N7RAye = 19771 + INTEGER(IntKi), PARAMETER :: M19N8RAye = 19772 + INTEGER(IntKi), PARAMETER :: M19N9RAye = 19773 + INTEGER(IntKi), PARAMETER :: M20N1RAye = 19774 + INTEGER(IntKi), PARAMETER :: M20N2RAye = 19775 + INTEGER(IntKi), PARAMETER :: M20N3RAye = 19776 + INTEGER(IntKi), PARAMETER :: M20N4RAye = 19777 + INTEGER(IntKi), PARAMETER :: M20N5RAye = 19778 + INTEGER(IntKi), PARAMETER :: M20N6RAye = 19779 + INTEGER(IntKi), PARAMETER :: M20N7RAye = 19780 + INTEGER(IntKi), PARAMETER :: M20N8RAye = 19781 + INTEGER(IntKi), PARAMETER :: M20N9RAye = 19782 + INTEGER(IntKi), PARAMETER :: M21N1RAye = 19783 + INTEGER(IntKi), PARAMETER :: M21N2RAye = 19784 + INTEGER(IntKi), PARAMETER :: M21N3RAye = 19785 + INTEGER(IntKi), PARAMETER :: M21N4RAye = 19786 + INTEGER(IntKi), PARAMETER :: M21N5RAye = 19787 + INTEGER(IntKi), PARAMETER :: M21N6RAye = 19788 + INTEGER(IntKi), PARAMETER :: M21N7RAye = 19789 + INTEGER(IntKi), PARAMETER :: M21N8RAye = 19790 + INTEGER(IntKi), PARAMETER :: M21N9RAye = 19791 + INTEGER(IntKi), PARAMETER :: M22N1RAye = 19792 + INTEGER(IntKi), PARAMETER :: M22N2RAye = 19793 + INTEGER(IntKi), PARAMETER :: M22N3RAye = 19794 + INTEGER(IntKi), PARAMETER :: M22N4RAye = 19795 + INTEGER(IntKi), PARAMETER :: M22N5RAye = 19796 + INTEGER(IntKi), PARAMETER :: M22N6RAye = 19797 + INTEGER(IntKi), PARAMETER :: M22N7RAye = 19798 + INTEGER(IntKi), PARAMETER :: M22N8RAye = 19799 + INTEGER(IntKi), PARAMETER :: M22N9RAye = 19800 + INTEGER(IntKi), PARAMETER :: M23N1RAye = 19801 + INTEGER(IntKi), PARAMETER :: M23N2RAye = 19802 + INTEGER(IntKi), PARAMETER :: M23N3RAye = 19803 + INTEGER(IntKi), PARAMETER :: M23N4RAye = 19804 + INTEGER(IntKi), PARAMETER :: M23N5RAye = 19805 + INTEGER(IntKi), PARAMETER :: M23N6RAye = 19806 + INTEGER(IntKi), PARAMETER :: M23N7RAye = 19807 + INTEGER(IntKi), PARAMETER :: M23N8RAye = 19808 + INTEGER(IntKi), PARAMETER :: M23N9RAye = 19809 + INTEGER(IntKi), PARAMETER :: M24N1RAye = 19810 + INTEGER(IntKi), PARAMETER :: M24N2RAye = 19811 + INTEGER(IntKi), PARAMETER :: M24N3RAye = 19812 + INTEGER(IntKi), PARAMETER :: M24N4RAye = 19813 + INTEGER(IntKi), PARAMETER :: M24N5RAye = 19814 + INTEGER(IntKi), PARAMETER :: M24N6RAye = 19815 + INTEGER(IntKi), PARAMETER :: M24N7RAye = 19816 + INTEGER(IntKi), PARAMETER :: M24N8RAye = 19817 + INTEGER(IntKi), PARAMETER :: M24N9RAye = 19818 + INTEGER(IntKi), PARAMETER :: M25N1RAye = 19819 + INTEGER(IntKi), PARAMETER :: M25N2RAye = 19820 + INTEGER(IntKi), PARAMETER :: M25N3RAye = 19821 + INTEGER(IntKi), PARAMETER :: M25N4RAye = 19822 + INTEGER(IntKi), PARAMETER :: M25N5RAye = 19823 + INTEGER(IntKi), PARAMETER :: M25N6RAye = 19824 + INTEGER(IntKi), PARAMETER :: M25N7RAye = 19825 + INTEGER(IntKi), PARAMETER :: M25N8RAye = 19826 + INTEGER(IntKi), PARAMETER :: M25N9RAye = 19827 + INTEGER(IntKi), PARAMETER :: M26N1RAye = 19828 + INTEGER(IntKi), PARAMETER :: M26N2RAye = 19829 + INTEGER(IntKi), PARAMETER :: M26N3RAye = 19830 + INTEGER(IntKi), PARAMETER :: M26N4RAye = 19831 + INTEGER(IntKi), PARAMETER :: M26N5RAye = 19832 + INTEGER(IntKi), PARAMETER :: M26N6RAye = 19833 + INTEGER(IntKi), PARAMETER :: M26N7RAye = 19834 + INTEGER(IntKi), PARAMETER :: M26N8RAye = 19835 + INTEGER(IntKi), PARAMETER :: M26N9RAye = 19836 + INTEGER(IntKi), PARAMETER :: M27N1RAye = 19837 + INTEGER(IntKi), PARAMETER :: M27N2RAye = 19838 + INTEGER(IntKi), PARAMETER :: M27N3RAye = 19839 + INTEGER(IntKi), PARAMETER :: M27N4RAye = 19840 + INTEGER(IntKi), PARAMETER :: M27N5RAye = 19841 + INTEGER(IntKi), PARAMETER :: M27N6RAye = 19842 + INTEGER(IntKi), PARAMETER :: M27N7RAye = 19843 + INTEGER(IntKi), PARAMETER :: M27N8RAye = 19844 + INTEGER(IntKi), PARAMETER :: M27N9RAye = 19845 + INTEGER(IntKi), PARAMETER :: M28N1RAye = 19846 + INTEGER(IntKi), PARAMETER :: M28N2RAye = 19847 + INTEGER(IntKi), PARAMETER :: M28N3RAye = 19848 + INTEGER(IntKi), PARAMETER :: M28N4RAye = 19849 + INTEGER(IntKi), PARAMETER :: M28N5RAye = 19850 + INTEGER(IntKi), PARAMETER :: M28N6RAye = 19851 + INTEGER(IntKi), PARAMETER :: M28N7RAye = 19852 + INTEGER(IntKi), PARAMETER :: M28N8RAye = 19853 + INTEGER(IntKi), PARAMETER :: M28N9RAye = 19854 + INTEGER(IntKi), PARAMETER :: M29N1RAye = 19855 + INTEGER(IntKi), PARAMETER :: M29N2RAye = 19856 + INTEGER(IntKi), PARAMETER :: M29N3RAye = 19857 + INTEGER(IntKi), PARAMETER :: M29N4RAye = 19858 + INTEGER(IntKi), PARAMETER :: M29N5RAye = 19859 + INTEGER(IntKi), PARAMETER :: M29N6RAye = 19860 + INTEGER(IntKi), PARAMETER :: M29N7RAye = 19861 + INTEGER(IntKi), PARAMETER :: M29N8RAye = 19862 + INTEGER(IntKi), PARAMETER :: M29N9RAye = 19863 + INTEGER(IntKi), PARAMETER :: M30N1RAye = 19864 + INTEGER(IntKi), PARAMETER :: M30N2RAye = 19865 + INTEGER(IntKi), PARAMETER :: M30N3RAye = 19866 + INTEGER(IntKi), PARAMETER :: M30N4RAye = 19867 + INTEGER(IntKi), PARAMETER :: M30N5RAye = 19868 + INTEGER(IntKi), PARAMETER :: M30N6RAye = 19869 + INTEGER(IntKi), PARAMETER :: M30N7RAye = 19870 + INTEGER(IntKi), PARAMETER :: M30N8RAye = 19871 + INTEGER(IntKi), PARAMETER :: M30N9RAye = 19872 + INTEGER(IntKi), PARAMETER :: M31N1RAye = 19873 + INTEGER(IntKi), PARAMETER :: M31N2RAye = 19874 + INTEGER(IntKi), PARAMETER :: M31N3RAye = 19875 + INTEGER(IntKi), PARAMETER :: M31N4RAye = 19876 + INTEGER(IntKi), PARAMETER :: M31N5RAye = 19877 + INTEGER(IntKi), PARAMETER :: M31N6RAye = 19878 + INTEGER(IntKi), PARAMETER :: M31N7RAye = 19879 + INTEGER(IntKi), PARAMETER :: M31N8RAye = 19880 + INTEGER(IntKi), PARAMETER :: M31N9RAye = 19881 + INTEGER(IntKi), PARAMETER :: M32N1RAye = 19882 + INTEGER(IntKi), PARAMETER :: M32N2RAye = 19883 + INTEGER(IntKi), PARAMETER :: M32N3RAye = 19884 + INTEGER(IntKi), PARAMETER :: M32N4RAye = 19885 + INTEGER(IntKi), PARAMETER :: M32N5RAye = 19886 + INTEGER(IntKi), PARAMETER :: M32N6RAye = 19887 + INTEGER(IntKi), PARAMETER :: M32N7RAye = 19888 + INTEGER(IntKi), PARAMETER :: M32N8RAye = 19889 + INTEGER(IntKi), PARAMETER :: M32N9RAye = 19890 + INTEGER(IntKi), PARAMETER :: M33N1RAye = 19891 + INTEGER(IntKi), PARAMETER :: M33N2RAye = 19892 + INTEGER(IntKi), PARAMETER :: M33N3RAye = 19893 + INTEGER(IntKi), PARAMETER :: M33N4RAye = 19894 + INTEGER(IntKi), PARAMETER :: M33N5RAye = 19895 + INTEGER(IntKi), PARAMETER :: M33N6RAye = 19896 + INTEGER(IntKi), PARAMETER :: M33N7RAye = 19897 + INTEGER(IntKi), PARAMETER :: M33N8RAye = 19898 + INTEGER(IntKi), PARAMETER :: M33N9RAye = 19899 + INTEGER(IntKi), PARAMETER :: M34N1RAye = 19900 + INTEGER(IntKi), PARAMETER :: M34N2RAye = 19901 + INTEGER(IntKi), PARAMETER :: M34N3RAye = 19902 + INTEGER(IntKi), PARAMETER :: M34N4RAye = 19903 + INTEGER(IntKi), PARAMETER :: M34N5RAye = 19904 + INTEGER(IntKi), PARAMETER :: M34N6RAye = 19905 + INTEGER(IntKi), PARAMETER :: M34N7RAye = 19906 + INTEGER(IntKi), PARAMETER :: M34N8RAye = 19907 + INTEGER(IntKi), PARAMETER :: M34N9RAye = 19908 + INTEGER(IntKi), PARAMETER :: M35N1RAye = 19909 + INTEGER(IntKi), PARAMETER :: M35N2RAye = 19910 + INTEGER(IntKi), PARAMETER :: M35N3RAye = 19911 + INTEGER(IntKi), PARAMETER :: M35N4RAye = 19912 + INTEGER(IntKi), PARAMETER :: M35N5RAye = 19913 + INTEGER(IntKi), PARAMETER :: M35N6RAye = 19914 + INTEGER(IntKi), PARAMETER :: M35N7RAye = 19915 + INTEGER(IntKi), PARAMETER :: M35N8RAye = 19916 + INTEGER(IntKi), PARAMETER :: M35N9RAye = 19917 + INTEGER(IntKi), PARAMETER :: M36N1RAye = 19918 + INTEGER(IntKi), PARAMETER :: M36N2RAye = 19919 + INTEGER(IntKi), PARAMETER :: M36N3RAye = 19920 + INTEGER(IntKi), PARAMETER :: M36N4RAye = 19921 + INTEGER(IntKi), PARAMETER :: M36N5RAye = 19922 + INTEGER(IntKi), PARAMETER :: M36N6RAye = 19923 + INTEGER(IntKi), PARAMETER :: M36N7RAye = 19924 + INTEGER(IntKi), PARAMETER :: M36N8RAye = 19925 + INTEGER(IntKi), PARAMETER :: M36N9RAye = 19926 + INTEGER(IntKi), PARAMETER :: M37N1RAye = 19927 + INTEGER(IntKi), PARAMETER :: M37N2RAye = 19928 + INTEGER(IntKi), PARAMETER :: M37N3RAye = 19929 + INTEGER(IntKi), PARAMETER :: M37N4RAye = 19930 + INTEGER(IntKi), PARAMETER :: M37N5RAye = 19931 + INTEGER(IntKi), PARAMETER :: M37N6RAye = 19932 + INTEGER(IntKi), PARAMETER :: M37N7RAye = 19933 + INTEGER(IntKi), PARAMETER :: M37N8RAye = 19934 + INTEGER(IntKi), PARAMETER :: M37N9RAye = 19935 + INTEGER(IntKi), PARAMETER :: M38N1RAye = 19936 + INTEGER(IntKi), PARAMETER :: M38N2RAye = 19937 + INTEGER(IntKi), PARAMETER :: M38N3RAye = 19938 + INTEGER(IntKi), PARAMETER :: M38N4RAye = 19939 + INTEGER(IntKi), PARAMETER :: M38N5RAye = 19940 + INTEGER(IntKi), PARAMETER :: M38N6RAye = 19941 + INTEGER(IntKi), PARAMETER :: M38N7RAye = 19942 + INTEGER(IntKi), PARAMETER :: M38N8RAye = 19943 + INTEGER(IntKi), PARAMETER :: M38N9RAye = 19944 + INTEGER(IntKi), PARAMETER :: M39N1RAye = 19945 + INTEGER(IntKi), PARAMETER :: M39N2RAye = 19946 + INTEGER(IntKi), PARAMETER :: M39N3RAye = 19947 + INTEGER(IntKi), PARAMETER :: M39N4RAye = 19948 + INTEGER(IntKi), PARAMETER :: M39N5RAye = 19949 + INTEGER(IntKi), PARAMETER :: M39N6RAye = 19950 + INTEGER(IntKi), PARAMETER :: M39N7RAye = 19951 + INTEGER(IntKi), PARAMETER :: M39N8RAye = 19952 + INTEGER(IntKi), PARAMETER :: M39N9RAye = 19953 + INTEGER(IntKi), PARAMETER :: M40N1RAye = 19954 + INTEGER(IntKi), PARAMETER :: M40N2RAye = 19955 + INTEGER(IntKi), PARAMETER :: M40N3RAye = 19956 + INTEGER(IntKi), PARAMETER :: M40N4RAye = 19957 + INTEGER(IntKi), PARAMETER :: M40N5RAye = 19958 + INTEGER(IntKi), PARAMETER :: M40N6RAye = 19959 + INTEGER(IntKi), PARAMETER :: M40N7RAye = 19960 + INTEGER(IntKi), PARAMETER :: M40N8RAye = 19961 + INTEGER(IntKi), PARAMETER :: M40N9RAye = 19962 + INTEGER(IntKi), PARAMETER :: M41N1RAye = 19963 + INTEGER(IntKi), PARAMETER :: M41N2RAye = 19964 + INTEGER(IntKi), PARAMETER :: M41N3RAye = 19965 + INTEGER(IntKi), PARAMETER :: M41N4RAye = 19966 + INTEGER(IntKi), PARAMETER :: M41N5RAye = 19967 + INTEGER(IntKi), PARAMETER :: M41N6RAye = 19968 + INTEGER(IntKi), PARAMETER :: M41N7RAye = 19969 + INTEGER(IntKi), PARAMETER :: M41N8RAye = 19970 + INTEGER(IntKi), PARAMETER :: M41N9RAye = 19971 + INTEGER(IntKi), PARAMETER :: M42N1RAye = 19972 + INTEGER(IntKi), PARAMETER :: M42N2RAye = 19973 + INTEGER(IntKi), PARAMETER :: M42N3RAye = 19974 + INTEGER(IntKi), PARAMETER :: M42N4RAye = 19975 + INTEGER(IntKi), PARAMETER :: M42N5RAye = 19976 + INTEGER(IntKi), PARAMETER :: M42N6RAye = 19977 + INTEGER(IntKi), PARAMETER :: M42N7RAye = 19978 + INTEGER(IntKi), PARAMETER :: M42N8RAye = 19979 + INTEGER(IntKi), PARAMETER :: M42N9RAye = 19980 + INTEGER(IntKi), PARAMETER :: M43N1RAye = 19981 + INTEGER(IntKi), PARAMETER :: M43N2RAye = 19982 + INTEGER(IntKi), PARAMETER :: M43N3RAye = 19983 + INTEGER(IntKi), PARAMETER :: M43N4RAye = 19984 + INTEGER(IntKi), PARAMETER :: M43N5RAye = 19985 + INTEGER(IntKi), PARAMETER :: M43N6RAye = 19986 + INTEGER(IntKi), PARAMETER :: M43N7RAye = 19987 + INTEGER(IntKi), PARAMETER :: M43N8RAye = 19988 + INTEGER(IntKi), PARAMETER :: M43N9RAye = 19989 + INTEGER(IntKi), PARAMETER :: M44N1RAye = 19990 + INTEGER(IntKi), PARAMETER :: M44N2RAye = 19991 + INTEGER(IntKi), PARAMETER :: M44N3RAye = 19992 + INTEGER(IntKi), PARAMETER :: M44N4RAye = 19993 + INTEGER(IntKi), PARAMETER :: M44N5RAye = 19994 + INTEGER(IntKi), PARAMETER :: M44N6RAye = 19995 + INTEGER(IntKi), PARAMETER :: M44N7RAye = 19996 + INTEGER(IntKi), PARAMETER :: M44N8RAye = 19997 + INTEGER(IntKi), PARAMETER :: M44N9RAye = 19998 + INTEGER(IntKi), PARAMETER :: M45N1RAye = 19999 + INTEGER(IntKi), PARAMETER :: M45N2RAye = 20000 + INTEGER(IntKi), PARAMETER :: M45N3RAye = 20001 + INTEGER(IntKi), PARAMETER :: M45N4RAye = 20002 + INTEGER(IntKi), PARAMETER :: M45N5RAye = 20003 + INTEGER(IntKi), PARAMETER :: M45N6RAye = 20004 + INTEGER(IntKi), PARAMETER :: M45N7RAye = 20005 + INTEGER(IntKi), PARAMETER :: M45N8RAye = 20006 + INTEGER(IntKi), PARAMETER :: M45N9RAye = 20007 + INTEGER(IntKi), PARAMETER :: M46N1RAye = 20008 + INTEGER(IntKi), PARAMETER :: M46N2RAye = 20009 + INTEGER(IntKi), PARAMETER :: M46N3RAye = 20010 + INTEGER(IntKi), PARAMETER :: M46N4RAye = 20011 + INTEGER(IntKi), PARAMETER :: M46N5RAye = 20012 + INTEGER(IntKi), PARAMETER :: M46N6RAye = 20013 + INTEGER(IntKi), PARAMETER :: M46N7RAye = 20014 + INTEGER(IntKi), PARAMETER :: M46N8RAye = 20015 + INTEGER(IntKi), PARAMETER :: M46N9RAye = 20016 + INTEGER(IntKi), PARAMETER :: M47N1RAye = 20017 + INTEGER(IntKi), PARAMETER :: M47N2RAye = 20018 + INTEGER(IntKi), PARAMETER :: M47N3RAye = 20019 + INTEGER(IntKi), PARAMETER :: M47N4RAye = 20020 + INTEGER(IntKi), PARAMETER :: M47N5RAye = 20021 + INTEGER(IntKi), PARAMETER :: M47N6RAye = 20022 + INTEGER(IntKi), PARAMETER :: M47N7RAye = 20023 + INTEGER(IntKi), PARAMETER :: M47N8RAye = 20024 + INTEGER(IntKi), PARAMETER :: M47N9RAye = 20025 + INTEGER(IntKi), PARAMETER :: M48N1RAye = 20026 + INTEGER(IntKi), PARAMETER :: M48N2RAye = 20027 + INTEGER(IntKi), PARAMETER :: M48N3RAye = 20028 + INTEGER(IntKi), PARAMETER :: M48N4RAye = 20029 + INTEGER(IntKi), PARAMETER :: M48N5RAye = 20030 + INTEGER(IntKi), PARAMETER :: M48N6RAye = 20031 + INTEGER(IntKi), PARAMETER :: M48N7RAye = 20032 + INTEGER(IntKi), PARAMETER :: M48N8RAye = 20033 + INTEGER(IntKi), PARAMETER :: M48N9RAye = 20034 + INTEGER(IntKi), PARAMETER :: M49N1RAye = 20035 + INTEGER(IntKi), PARAMETER :: M49N2RAye = 20036 + INTEGER(IntKi), PARAMETER :: M49N3RAye = 20037 + INTEGER(IntKi), PARAMETER :: M49N4RAye = 20038 + INTEGER(IntKi), PARAMETER :: M49N5RAye = 20039 + INTEGER(IntKi), PARAMETER :: M49N6RAye = 20040 + INTEGER(IntKi), PARAMETER :: M49N7RAye = 20041 + INTEGER(IntKi), PARAMETER :: M49N8RAye = 20042 + INTEGER(IntKi), PARAMETER :: M49N9RAye = 20043 + INTEGER(IntKi), PARAMETER :: M50N1RAye = 20044 + INTEGER(IntKi), PARAMETER :: M50N2RAye = 20045 + INTEGER(IntKi), PARAMETER :: M50N3RAye = 20046 + INTEGER(IntKi), PARAMETER :: M50N4RAye = 20047 + INTEGER(IntKi), PARAMETER :: M50N5RAye = 20048 + INTEGER(IntKi), PARAMETER :: M50N6RAye = 20049 + INTEGER(IntKi), PARAMETER :: M50N7RAye = 20050 + INTEGER(IntKi), PARAMETER :: M50N8RAye = 20051 + INTEGER(IntKi), PARAMETER :: M50N9RAye = 20052 + INTEGER(IntKi), PARAMETER :: M51N1RAye = 20053 + INTEGER(IntKi), PARAMETER :: M51N2RAye = 20054 + INTEGER(IntKi), PARAMETER :: M51N3RAye = 20055 + INTEGER(IntKi), PARAMETER :: M51N4RAye = 20056 + INTEGER(IntKi), PARAMETER :: M51N5RAye = 20057 + INTEGER(IntKi), PARAMETER :: M51N6RAye = 20058 + INTEGER(IntKi), PARAMETER :: M51N7RAye = 20059 + INTEGER(IntKi), PARAMETER :: M51N8RAye = 20060 + INTEGER(IntKi), PARAMETER :: M51N9RAye = 20061 + INTEGER(IntKi), PARAMETER :: M52N1RAye = 20062 + INTEGER(IntKi), PARAMETER :: M52N2RAye = 20063 + INTEGER(IntKi), PARAMETER :: M52N3RAye = 20064 + INTEGER(IntKi), PARAMETER :: M52N4RAye = 20065 + INTEGER(IntKi), PARAMETER :: M52N5RAye = 20066 + INTEGER(IntKi), PARAMETER :: M52N6RAye = 20067 + INTEGER(IntKi), PARAMETER :: M52N7RAye = 20068 + INTEGER(IntKi), PARAMETER :: M52N8RAye = 20069 + INTEGER(IntKi), PARAMETER :: M52N9RAye = 20070 + INTEGER(IntKi), PARAMETER :: M53N1RAye = 20071 + INTEGER(IntKi), PARAMETER :: M53N2RAye = 20072 + INTEGER(IntKi), PARAMETER :: M53N3RAye = 20073 + INTEGER(IntKi), PARAMETER :: M53N4RAye = 20074 + INTEGER(IntKi), PARAMETER :: M53N5RAye = 20075 + INTEGER(IntKi), PARAMETER :: M53N6RAye = 20076 + INTEGER(IntKi), PARAMETER :: M53N7RAye = 20077 + INTEGER(IntKi), PARAMETER :: M53N8RAye = 20078 + INTEGER(IntKi), PARAMETER :: M53N9RAye = 20079 + INTEGER(IntKi), PARAMETER :: M54N1RAye = 20080 + INTEGER(IntKi), PARAMETER :: M54N2RAye = 20081 + INTEGER(IntKi), PARAMETER :: M54N3RAye = 20082 + INTEGER(IntKi), PARAMETER :: M54N4RAye = 20083 + INTEGER(IntKi), PARAMETER :: M54N5RAye = 20084 + INTEGER(IntKi), PARAMETER :: M54N6RAye = 20085 + INTEGER(IntKi), PARAMETER :: M54N7RAye = 20086 + INTEGER(IntKi), PARAMETER :: M54N8RAye = 20087 + INTEGER(IntKi), PARAMETER :: M54N9RAye = 20088 + INTEGER(IntKi), PARAMETER :: M55N1RAye = 20089 + INTEGER(IntKi), PARAMETER :: M55N2RAye = 20090 + INTEGER(IntKi), PARAMETER :: M55N3RAye = 20091 + INTEGER(IntKi), PARAMETER :: M55N4RAye = 20092 + INTEGER(IntKi), PARAMETER :: M55N5RAye = 20093 + INTEGER(IntKi), PARAMETER :: M55N6RAye = 20094 + INTEGER(IntKi), PARAMETER :: M55N7RAye = 20095 + INTEGER(IntKi), PARAMETER :: M55N8RAye = 20096 + INTEGER(IntKi), PARAMETER :: M55N9RAye = 20097 + INTEGER(IntKi), PARAMETER :: M56N1RAye = 20098 + INTEGER(IntKi), PARAMETER :: M56N2RAye = 20099 + INTEGER(IntKi), PARAMETER :: M56N3RAye = 20100 + INTEGER(IntKi), PARAMETER :: M56N4RAye = 20101 + INTEGER(IntKi), PARAMETER :: M56N5RAye = 20102 + INTEGER(IntKi), PARAMETER :: M56N6RAye = 20103 + INTEGER(IntKi), PARAMETER :: M56N7RAye = 20104 + INTEGER(IntKi), PARAMETER :: M56N8RAye = 20105 + INTEGER(IntKi), PARAMETER :: M56N9RAye = 20106 + INTEGER(IntKi), PARAMETER :: M57N1RAye = 20107 + INTEGER(IntKi), PARAMETER :: M57N2RAye = 20108 + INTEGER(IntKi), PARAMETER :: M57N3RAye = 20109 + INTEGER(IntKi), PARAMETER :: M57N4RAye = 20110 + INTEGER(IntKi), PARAMETER :: M57N5RAye = 20111 + INTEGER(IntKi), PARAMETER :: M57N6RAye = 20112 + INTEGER(IntKi), PARAMETER :: M57N7RAye = 20113 + INTEGER(IntKi), PARAMETER :: M57N8RAye = 20114 + INTEGER(IntKi), PARAMETER :: M57N9RAye = 20115 + INTEGER(IntKi), PARAMETER :: M58N1RAye = 20116 + INTEGER(IntKi), PARAMETER :: M58N2RAye = 20117 + INTEGER(IntKi), PARAMETER :: M58N3RAye = 20118 + INTEGER(IntKi), PARAMETER :: M58N4RAye = 20119 + INTEGER(IntKi), PARAMETER :: M58N5RAye = 20120 + INTEGER(IntKi), PARAMETER :: M58N6RAye = 20121 + INTEGER(IntKi), PARAMETER :: M58N7RAye = 20122 + INTEGER(IntKi), PARAMETER :: M58N8RAye = 20123 + INTEGER(IntKi), PARAMETER :: M58N9RAye = 20124 + INTEGER(IntKi), PARAMETER :: M59N1RAye = 20125 + INTEGER(IntKi), PARAMETER :: M59N2RAye = 20126 + INTEGER(IntKi), PARAMETER :: M59N3RAye = 20127 + INTEGER(IntKi), PARAMETER :: M59N4RAye = 20128 + INTEGER(IntKi), PARAMETER :: M59N5RAye = 20129 + INTEGER(IntKi), PARAMETER :: M59N6RAye = 20130 + INTEGER(IntKi), PARAMETER :: M59N7RAye = 20131 + INTEGER(IntKi), PARAMETER :: M59N8RAye = 20132 + INTEGER(IntKi), PARAMETER :: M59N9RAye = 20133 + INTEGER(IntKi), PARAMETER :: M60N1RAye = 20134 + INTEGER(IntKi), PARAMETER :: M60N2RAye = 20135 + INTEGER(IntKi), PARAMETER :: M60N3RAye = 20136 + INTEGER(IntKi), PARAMETER :: M60N4RAye = 20137 + INTEGER(IntKi), PARAMETER :: M60N5RAye = 20138 + INTEGER(IntKi), PARAMETER :: M60N6RAye = 20139 + INTEGER(IntKi), PARAMETER :: M60N7RAye = 20140 + INTEGER(IntKi), PARAMETER :: M60N8RAye = 20141 + INTEGER(IntKi), PARAMETER :: M60N9RAye = 20142 + INTEGER(IntKi), PARAMETER :: M61N1RAye = 20143 + INTEGER(IntKi), PARAMETER :: M61N2RAye = 20144 + INTEGER(IntKi), PARAMETER :: M61N3RAye = 20145 + INTEGER(IntKi), PARAMETER :: M61N4RAye = 20146 + INTEGER(IntKi), PARAMETER :: M61N5RAye = 20147 + INTEGER(IntKi), PARAMETER :: M61N6RAye = 20148 + INTEGER(IntKi), PARAMETER :: M61N7RAye = 20149 + INTEGER(IntKi), PARAMETER :: M61N8RAye = 20150 + INTEGER(IntKi), PARAMETER :: M61N9RAye = 20151 + INTEGER(IntKi), PARAMETER :: M62N1RAye = 20152 + INTEGER(IntKi), PARAMETER :: M62N2RAye = 20153 + INTEGER(IntKi), PARAMETER :: M62N3RAye = 20154 + INTEGER(IntKi), PARAMETER :: M62N4RAye = 20155 + INTEGER(IntKi), PARAMETER :: M62N5RAye = 20156 + INTEGER(IntKi), PARAMETER :: M62N6RAye = 20157 + INTEGER(IntKi), PARAMETER :: M62N7RAye = 20158 + INTEGER(IntKi), PARAMETER :: M62N8RAye = 20159 + INTEGER(IntKi), PARAMETER :: M62N9RAye = 20160 + INTEGER(IntKi), PARAMETER :: M63N1RAye = 20161 + INTEGER(IntKi), PARAMETER :: M63N2RAye = 20162 + INTEGER(IntKi), PARAMETER :: M63N3RAye = 20163 + INTEGER(IntKi), PARAMETER :: M63N4RAye = 20164 + INTEGER(IntKi), PARAMETER :: M63N5RAye = 20165 + INTEGER(IntKi), PARAMETER :: M63N6RAye = 20166 + INTEGER(IntKi), PARAMETER :: M63N7RAye = 20167 + INTEGER(IntKi), PARAMETER :: M63N8RAye = 20168 + INTEGER(IntKi), PARAMETER :: M63N9RAye = 20169 + INTEGER(IntKi), PARAMETER :: M64N1RAye = 20170 + INTEGER(IntKi), PARAMETER :: M64N2RAye = 20171 + INTEGER(IntKi), PARAMETER :: M64N3RAye = 20172 + INTEGER(IntKi), PARAMETER :: M64N4RAye = 20173 + INTEGER(IntKi), PARAMETER :: M64N5RAye = 20174 + INTEGER(IntKi), PARAMETER :: M64N6RAye = 20175 + INTEGER(IntKi), PARAMETER :: M64N7RAye = 20176 + INTEGER(IntKi), PARAMETER :: M64N8RAye = 20177 + INTEGER(IntKi), PARAMETER :: M64N9RAye = 20178 + INTEGER(IntKi), PARAMETER :: M65N1RAye = 20179 + INTEGER(IntKi), PARAMETER :: M65N2RAye = 20180 + INTEGER(IntKi), PARAMETER :: M65N3RAye = 20181 + INTEGER(IntKi), PARAMETER :: M65N4RAye = 20182 + INTEGER(IntKi), PARAMETER :: M65N5RAye = 20183 + INTEGER(IntKi), PARAMETER :: M65N6RAye = 20184 + INTEGER(IntKi), PARAMETER :: M65N7RAye = 20185 + INTEGER(IntKi), PARAMETER :: M65N8RAye = 20186 + INTEGER(IntKi), PARAMETER :: M65N9RAye = 20187 + INTEGER(IntKi), PARAMETER :: M66N1RAye = 20188 + INTEGER(IntKi), PARAMETER :: M66N2RAye = 20189 + INTEGER(IntKi), PARAMETER :: M66N3RAye = 20190 + INTEGER(IntKi), PARAMETER :: M66N4RAye = 20191 + INTEGER(IntKi), PARAMETER :: M66N5RAye = 20192 + INTEGER(IntKi), PARAMETER :: M66N6RAye = 20193 + INTEGER(IntKi), PARAMETER :: M66N7RAye = 20194 + INTEGER(IntKi), PARAMETER :: M66N8RAye = 20195 + INTEGER(IntKi), PARAMETER :: M66N9RAye = 20196 + INTEGER(IntKi), PARAMETER :: M67N1RAye = 20197 + INTEGER(IntKi), PARAMETER :: M67N2RAye = 20198 + INTEGER(IntKi), PARAMETER :: M67N3RAye = 20199 + INTEGER(IntKi), PARAMETER :: M67N4RAye = 20200 + INTEGER(IntKi), PARAMETER :: M67N5RAye = 20201 + INTEGER(IntKi), PARAMETER :: M67N6RAye = 20202 + INTEGER(IntKi), PARAMETER :: M67N7RAye = 20203 + INTEGER(IntKi), PARAMETER :: M67N8RAye = 20204 + INTEGER(IntKi), PARAMETER :: M67N9RAye = 20205 + INTEGER(IntKi), PARAMETER :: M68N1RAye = 20206 + INTEGER(IntKi), PARAMETER :: M68N2RAye = 20207 + INTEGER(IntKi), PARAMETER :: M68N3RAye = 20208 + INTEGER(IntKi), PARAMETER :: M68N4RAye = 20209 + INTEGER(IntKi), PARAMETER :: M68N5RAye = 20210 + INTEGER(IntKi), PARAMETER :: M68N6RAye = 20211 + INTEGER(IntKi), PARAMETER :: M68N7RAye = 20212 + INTEGER(IntKi), PARAMETER :: M68N8RAye = 20213 + INTEGER(IntKi), PARAMETER :: M68N9RAye = 20214 + INTEGER(IntKi), PARAMETER :: M69N1RAye = 20215 + INTEGER(IntKi), PARAMETER :: M69N2RAye = 20216 + INTEGER(IntKi), PARAMETER :: M69N3RAye = 20217 + INTEGER(IntKi), PARAMETER :: M69N4RAye = 20218 + INTEGER(IntKi), PARAMETER :: M69N5RAye = 20219 + INTEGER(IntKi), PARAMETER :: M69N6RAye = 20220 + INTEGER(IntKi), PARAMETER :: M69N7RAye = 20221 + INTEGER(IntKi), PARAMETER :: M69N8RAye = 20222 + INTEGER(IntKi), PARAMETER :: M69N9RAye = 20223 + INTEGER(IntKi), PARAMETER :: M70N1RAye = 20224 + INTEGER(IntKi), PARAMETER :: M70N2RAye = 20225 + INTEGER(IntKi), PARAMETER :: M70N3RAye = 20226 + INTEGER(IntKi), PARAMETER :: M70N4RAye = 20227 + INTEGER(IntKi), PARAMETER :: M70N5RAye = 20228 + INTEGER(IntKi), PARAMETER :: M70N6RAye = 20229 + INTEGER(IntKi), PARAMETER :: M70N7RAye = 20230 + INTEGER(IntKi), PARAMETER :: M70N8RAye = 20231 + INTEGER(IntKi), PARAMETER :: M70N9RAye = 20232 + INTEGER(IntKi), PARAMETER :: M71N1RAye = 20233 + INTEGER(IntKi), PARAMETER :: M71N2RAye = 20234 + INTEGER(IntKi), PARAMETER :: M71N3RAye = 20235 + INTEGER(IntKi), PARAMETER :: M71N4RAye = 20236 + INTEGER(IntKi), PARAMETER :: M71N5RAye = 20237 + INTEGER(IntKi), PARAMETER :: M71N6RAye = 20238 + INTEGER(IntKi), PARAMETER :: M71N7RAye = 20239 + INTEGER(IntKi), PARAMETER :: M71N8RAye = 20240 + INTEGER(IntKi), PARAMETER :: M71N9RAye = 20241 + INTEGER(IntKi), PARAMETER :: M72N1RAye = 20242 + INTEGER(IntKi), PARAMETER :: M72N2RAye = 20243 + INTEGER(IntKi), PARAMETER :: M72N3RAye = 20244 + INTEGER(IntKi), PARAMETER :: M72N4RAye = 20245 + INTEGER(IntKi), PARAMETER :: M72N5RAye = 20246 + INTEGER(IntKi), PARAMETER :: M72N6RAye = 20247 + INTEGER(IntKi), PARAMETER :: M72N7RAye = 20248 + INTEGER(IntKi), PARAMETER :: M72N8RAye = 20249 + INTEGER(IntKi), PARAMETER :: M72N9RAye = 20250 + INTEGER(IntKi), PARAMETER :: M73N1RAye = 20251 + INTEGER(IntKi), PARAMETER :: M73N2RAye = 20252 + INTEGER(IntKi), PARAMETER :: M73N3RAye = 20253 + INTEGER(IntKi), PARAMETER :: M73N4RAye = 20254 + INTEGER(IntKi), PARAMETER :: M73N5RAye = 20255 + INTEGER(IntKi), PARAMETER :: M73N6RAye = 20256 + INTEGER(IntKi), PARAMETER :: M73N7RAye = 20257 + INTEGER(IntKi), PARAMETER :: M73N8RAye = 20258 + INTEGER(IntKi), PARAMETER :: M73N9RAye = 20259 + INTEGER(IntKi), PARAMETER :: M74N1RAye = 20260 + INTEGER(IntKi), PARAMETER :: M74N2RAye = 20261 + INTEGER(IntKi), PARAMETER :: M74N3RAye = 20262 + INTEGER(IntKi), PARAMETER :: M74N4RAye = 20263 + INTEGER(IntKi), PARAMETER :: M74N5RAye = 20264 + INTEGER(IntKi), PARAMETER :: M74N6RAye = 20265 + INTEGER(IntKi), PARAMETER :: M74N7RAye = 20266 + INTEGER(IntKi), PARAMETER :: M74N8RAye = 20267 + INTEGER(IntKi), PARAMETER :: M74N9RAye = 20268 + INTEGER(IntKi), PARAMETER :: M75N1RAye = 20269 + INTEGER(IntKi), PARAMETER :: M75N2RAye = 20270 + INTEGER(IntKi), PARAMETER :: M75N3RAye = 20271 + INTEGER(IntKi), PARAMETER :: M75N4RAye = 20272 + INTEGER(IntKi), PARAMETER :: M75N5RAye = 20273 + INTEGER(IntKi), PARAMETER :: M75N6RAye = 20274 + INTEGER(IntKi), PARAMETER :: M75N7RAye = 20275 + INTEGER(IntKi), PARAMETER :: M75N8RAye = 20276 + INTEGER(IntKi), PARAMETER :: M75N9RAye = 20277 + INTEGER(IntKi), PARAMETER :: M76N1RAye = 20278 + INTEGER(IntKi), PARAMETER :: M76N2RAye = 20279 + INTEGER(IntKi), PARAMETER :: M76N3RAye = 20280 + INTEGER(IntKi), PARAMETER :: M76N4RAye = 20281 + INTEGER(IntKi), PARAMETER :: M76N5RAye = 20282 + INTEGER(IntKi), PARAMETER :: M76N6RAye = 20283 + INTEGER(IntKi), PARAMETER :: M76N7RAye = 20284 + INTEGER(IntKi), PARAMETER :: M76N8RAye = 20285 + INTEGER(IntKi), PARAMETER :: M76N9RAye = 20286 + INTEGER(IntKi), PARAMETER :: M77N1RAye = 20287 + INTEGER(IntKi), PARAMETER :: M77N2RAye = 20288 + INTEGER(IntKi), PARAMETER :: M77N3RAye = 20289 + INTEGER(IntKi), PARAMETER :: M77N4RAye = 20290 + INTEGER(IntKi), PARAMETER :: M77N5RAye = 20291 + INTEGER(IntKi), PARAMETER :: M77N6RAye = 20292 + INTEGER(IntKi), PARAMETER :: M77N7RAye = 20293 + INTEGER(IntKi), PARAMETER :: M77N8RAye = 20294 + INTEGER(IntKi), PARAMETER :: M77N9RAye = 20295 + INTEGER(IntKi), PARAMETER :: M78N1RAye = 20296 + INTEGER(IntKi), PARAMETER :: M78N2RAye = 20297 + INTEGER(IntKi), PARAMETER :: M78N3RAye = 20298 + INTEGER(IntKi), PARAMETER :: M78N4RAye = 20299 + INTEGER(IntKi), PARAMETER :: M78N5RAye = 20300 + INTEGER(IntKi), PARAMETER :: M78N6RAye = 20301 + INTEGER(IntKi), PARAMETER :: M78N7RAye = 20302 + INTEGER(IntKi), PARAMETER :: M78N8RAye = 20303 + INTEGER(IntKi), PARAMETER :: M78N9RAye = 20304 + INTEGER(IntKi), PARAMETER :: M79N1RAye = 20305 + INTEGER(IntKi), PARAMETER :: M79N2RAye = 20306 + INTEGER(IntKi), PARAMETER :: M79N3RAye = 20307 + INTEGER(IntKi), PARAMETER :: M79N4RAye = 20308 + INTEGER(IntKi), PARAMETER :: M79N5RAye = 20309 + INTEGER(IntKi), PARAMETER :: M79N6RAye = 20310 + INTEGER(IntKi), PARAMETER :: M79N7RAye = 20311 + INTEGER(IntKi), PARAMETER :: M79N8RAye = 20312 + INTEGER(IntKi), PARAMETER :: M79N9RAye = 20313 + INTEGER(IntKi), PARAMETER :: M80N1RAye = 20314 + INTEGER(IntKi), PARAMETER :: M80N2RAye = 20315 + INTEGER(IntKi), PARAMETER :: M80N3RAye = 20316 + INTEGER(IntKi), PARAMETER :: M80N4RAye = 20317 + INTEGER(IntKi), PARAMETER :: M80N5RAye = 20318 + INTEGER(IntKi), PARAMETER :: M80N6RAye = 20319 + INTEGER(IntKi), PARAMETER :: M80N7RAye = 20320 + INTEGER(IntKi), PARAMETER :: M80N8RAye = 20321 + INTEGER(IntKi), PARAMETER :: M80N9RAye = 20322 + INTEGER(IntKi), PARAMETER :: M81N1RAye = 20323 + INTEGER(IntKi), PARAMETER :: M81N2RAye = 20324 + INTEGER(IntKi), PARAMETER :: M81N3RAye = 20325 + INTEGER(IntKi), PARAMETER :: M81N4RAye = 20326 + INTEGER(IntKi), PARAMETER :: M81N5RAye = 20327 + INTEGER(IntKi), PARAMETER :: M81N6RAye = 20328 + INTEGER(IntKi), PARAMETER :: M81N7RAye = 20329 + INTEGER(IntKi), PARAMETER :: M81N8RAye = 20330 + INTEGER(IntKi), PARAMETER :: M81N9RAye = 20331 + INTEGER(IntKi), PARAMETER :: M82N1RAye = 20332 + INTEGER(IntKi), PARAMETER :: M82N2RAye = 20333 + INTEGER(IntKi), PARAMETER :: M82N3RAye = 20334 + INTEGER(IntKi), PARAMETER :: M82N4RAye = 20335 + INTEGER(IntKi), PARAMETER :: M82N5RAye = 20336 + INTEGER(IntKi), PARAMETER :: M82N6RAye = 20337 + INTEGER(IntKi), PARAMETER :: M82N7RAye = 20338 + INTEGER(IntKi), PARAMETER :: M82N8RAye = 20339 + INTEGER(IntKi), PARAMETER :: M82N9RAye = 20340 + INTEGER(IntKi), PARAMETER :: M83N1RAye = 20341 + INTEGER(IntKi), PARAMETER :: M83N2RAye = 20342 + INTEGER(IntKi), PARAMETER :: M83N3RAye = 20343 + INTEGER(IntKi), PARAMETER :: M83N4RAye = 20344 + INTEGER(IntKi), PARAMETER :: M83N5RAye = 20345 + INTEGER(IntKi), PARAMETER :: M83N6RAye = 20346 + INTEGER(IntKi), PARAMETER :: M83N7RAye = 20347 + INTEGER(IntKi), PARAMETER :: M83N8RAye = 20348 + INTEGER(IntKi), PARAMETER :: M83N9RAye = 20349 + INTEGER(IntKi), PARAMETER :: M84N1RAye = 20350 + INTEGER(IntKi), PARAMETER :: M84N2RAye = 20351 + INTEGER(IntKi), PARAMETER :: M84N3RAye = 20352 + INTEGER(IntKi), PARAMETER :: M84N4RAye = 20353 + INTEGER(IntKi), PARAMETER :: M84N5RAye = 20354 + INTEGER(IntKi), PARAMETER :: M84N6RAye = 20355 + INTEGER(IntKi), PARAMETER :: M84N7RAye = 20356 + INTEGER(IntKi), PARAMETER :: M84N8RAye = 20357 + INTEGER(IntKi), PARAMETER :: M84N9RAye = 20358 + INTEGER(IntKi), PARAMETER :: M85N1RAye = 20359 + INTEGER(IntKi), PARAMETER :: M85N2RAye = 20360 + INTEGER(IntKi), PARAMETER :: M85N3RAye = 20361 + INTEGER(IntKi), PARAMETER :: M85N4RAye = 20362 + INTEGER(IntKi), PARAMETER :: M85N5RAye = 20363 + INTEGER(IntKi), PARAMETER :: M85N6RAye = 20364 + INTEGER(IntKi), PARAMETER :: M85N7RAye = 20365 + INTEGER(IntKi), PARAMETER :: M85N8RAye = 20366 + INTEGER(IntKi), PARAMETER :: M85N9RAye = 20367 + INTEGER(IntKi), PARAMETER :: M86N1RAye = 20368 + INTEGER(IntKi), PARAMETER :: M86N2RAye = 20369 + INTEGER(IntKi), PARAMETER :: M86N3RAye = 20370 + INTEGER(IntKi), PARAMETER :: M86N4RAye = 20371 + INTEGER(IntKi), PARAMETER :: M86N5RAye = 20372 + INTEGER(IntKi), PARAMETER :: M86N6RAye = 20373 + INTEGER(IntKi), PARAMETER :: M86N7RAye = 20374 + INTEGER(IntKi), PARAMETER :: M86N8RAye = 20375 + INTEGER(IntKi), PARAMETER :: M86N9RAye = 20376 + INTEGER(IntKi), PARAMETER :: M87N1RAye = 20377 + INTEGER(IntKi), PARAMETER :: M87N2RAye = 20378 + INTEGER(IntKi), PARAMETER :: M87N3RAye = 20379 + INTEGER(IntKi), PARAMETER :: M87N4RAye = 20380 + INTEGER(IntKi), PARAMETER :: M87N5RAye = 20381 + INTEGER(IntKi), PARAMETER :: M87N6RAye = 20382 + INTEGER(IntKi), PARAMETER :: M87N7RAye = 20383 + INTEGER(IntKi), PARAMETER :: M87N8RAye = 20384 + INTEGER(IntKi), PARAMETER :: M87N9RAye = 20385 + INTEGER(IntKi), PARAMETER :: M88N1RAye = 20386 + INTEGER(IntKi), PARAMETER :: M88N2RAye = 20387 + INTEGER(IntKi), PARAMETER :: M88N3RAye = 20388 + INTEGER(IntKi), PARAMETER :: M88N4RAye = 20389 + INTEGER(IntKi), PARAMETER :: M88N5RAye = 20390 + INTEGER(IntKi), PARAMETER :: M88N6RAye = 20391 + INTEGER(IntKi), PARAMETER :: M88N7RAye = 20392 + INTEGER(IntKi), PARAMETER :: M88N8RAye = 20393 + INTEGER(IntKi), PARAMETER :: M88N9RAye = 20394 + INTEGER(IntKi), PARAMETER :: M89N1RAye = 20395 + INTEGER(IntKi), PARAMETER :: M89N2RAye = 20396 + INTEGER(IntKi), PARAMETER :: M89N3RAye = 20397 + INTEGER(IntKi), PARAMETER :: M89N4RAye = 20398 + INTEGER(IntKi), PARAMETER :: M89N5RAye = 20399 + INTEGER(IntKi), PARAMETER :: M89N6RAye = 20400 + INTEGER(IntKi), PARAMETER :: M89N7RAye = 20401 + INTEGER(IntKi), PARAMETER :: M89N8RAye = 20402 + INTEGER(IntKi), PARAMETER :: M89N9RAye = 20403 + INTEGER(IntKi), PARAMETER :: M90N1RAye = 20404 + INTEGER(IntKi), PARAMETER :: M90N2RAye = 20405 + INTEGER(IntKi), PARAMETER :: M90N3RAye = 20406 + INTEGER(IntKi), PARAMETER :: M90N4RAye = 20407 + INTEGER(IntKi), PARAMETER :: M90N5RAye = 20408 + INTEGER(IntKi), PARAMETER :: M90N6RAye = 20409 + INTEGER(IntKi), PARAMETER :: M90N7RAye = 20410 + INTEGER(IntKi), PARAMETER :: M90N8RAye = 20411 + INTEGER(IntKi), PARAMETER :: M90N9RAye = 20412 + INTEGER(IntKi), PARAMETER :: M91N1RAye = 20413 + INTEGER(IntKi), PARAMETER :: M91N2RAye = 20414 + INTEGER(IntKi), PARAMETER :: M91N3RAye = 20415 + INTEGER(IntKi), PARAMETER :: M91N4RAye = 20416 + INTEGER(IntKi), PARAMETER :: M91N5RAye = 20417 + INTEGER(IntKi), PARAMETER :: M91N6RAye = 20418 + INTEGER(IntKi), PARAMETER :: M91N7RAye = 20419 + INTEGER(IntKi), PARAMETER :: M91N8RAye = 20420 + INTEGER(IntKi), PARAMETER :: M91N9RAye = 20421 + INTEGER(IntKi), PARAMETER :: M92N1RAye = 20422 + INTEGER(IntKi), PARAMETER :: M92N2RAye = 20423 + INTEGER(IntKi), PARAMETER :: M92N3RAye = 20424 + INTEGER(IntKi), PARAMETER :: M92N4RAye = 20425 + INTEGER(IntKi), PARAMETER :: M92N5RAye = 20426 + INTEGER(IntKi), PARAMETER :: M92N6RAye = 20427 + INTEGER(IntKi), PARAMETER :: M92N7RAye = 20428 + INTEGER(IntKi), PARAMETER :: M92N8RAye = 20429 + INTEGER(IntKi), PARAMETER :: M92N9RAye = 20430 + INTEGER(IntKi), PARAMETER :: M93N1RAye = 20431 + INTEGER(IntKi), PARAMETER :: M93N2RAye = 20432 + INTEGER(IntKi), PARAMETER :: M93N3RAye = 20433 + INTEGER(IntKi), PARAMETER :: M93N4RAye = 20434 + INTEGER(IntKi), PARAMETER :: M93N5RAye = 20435 + INTEGER(IntKi), PARAMETER :: M93N6RAye = 20436 + INTEGER(IntKi), PARAMETER :: M93N7RAye = 20437 + INTEGER(IntKi), PARAMETER :: M93N8RAye = 20438 + INTEGER(IntKi), PARAMETER :: M93N9RAye = 20439 + INTEGER(IntKi), PARAMETER :: M94N1RAye = 20440 + INTEGER(IntKi), PARAMETER :: M94N2RAye = 20441 + INTEGER(IntKi), PARAMETER :: M94N3RAye = 20442 + INTEGER(IntKi), PARAMETER :: M94N4RAye = 20443 + INTEGER(IntKi), PARAMETER :: M94N5RAye = 20444 + INTEGER(IntKi), PARAMETER :: M94N6RAye = 20445 + INTEGER(IntKi), PARAMETER :: M94N7RAye = 20446 + INTEGER(IntKi), PARAMETER :: M94N8RAye = 20447 + INTEGER(IntKi), PARAMETER :: M94N9RAye = 20448 + INTEGER(IntKi), PARAMETER :: M95N1RAye = 20449 + INTEGER(IntKi), PARAMETER :: M95N2RAye = 20450 + INTEGER(IntKi), PARAMETER :: M95N3RAye = 20451 + INTEGER(IntKi), PARAMETER :: M95N4RAye = 20452 + INTEGER(IntKi), PARAMETER :: M95N5RAye = 20453 + INTEGER(IntKi), PARAMETER :: M95N6RAye = 20454 + INTEGER(IntKi), PARAMETER :: M95N7RAye = 20455 + INTEGER(IntKi), PARAMETER :: M95N8RAye = 20456 + INTEGER(IntKi), PARAMETER :: M95N9RAye = 20457 + INTEGER(IntKi), PARAMETER :: M96N1RAye = 20458 + INTEGER(IntKi), PARAMETER :: M96N2RAye = 20459 + INTEGER(IntKi), PARAMETER :: M96N3RAye = 20460 + INTEGER(IntKi), PARAMETER :: M96N4RAye = 20461 + INTEGER(IntKi), PARAMETER :: M96N5RAye = 20462 + INTEGER(IntKi), PARAMETER :: M96N6RAye = 20463 + INTEGER(IntKi), PARAMETER :: M96N7RAye = 20464 + INTEGER(IntKi), PARAMETER :: M96N8RAye = 20465 + INTEGER(IntKi), PARAMETER :: M96N9RAye = 20466 + INTEGER(IntKi), PARAMETER :: M97N1RAye = 20467 + INTEGER(IntKi), PARAMETER :: M97N2RAye = 20468 + INTEGER(IntKi), PARAMETER :: M97N3RAye = 20469 + INTEGER(IntKi), PARAMETER :: M97N4RAye = 20470 + INTEGER(IntKi), PARAMETER :: M97N5RAye = 20471 + INTEGER(IntKi), PARAMETER :: M97N6RAye = 20472 + INTEGER(IntKi), PARAMETER :: M97N7RAye = 20473 + INTEGER(IntKi), PARAMETER :: M97N8RAye = 20474 + INTEGER(IntKi), PARAMETER :: M97N9RAye = 20475 + INTEGER(IntKi), PARAMETER :: M98N1RAye = 20476 + INTEGER(IntKi), PARAMETER :: M98N2RAye = 20477 + INTEGER(IntKi), PARAMETER :: M98N3RAye = 20478 + INTEGER(IntKi), PARAMETER :: M98N4RAye = 20479 + INTEGER(IntKi), PARAMETER :: M98N5RAye = 20480 + INTEGER(IntKi), PARAMETER :: M98N6RAye = 20481 + INTEGER(IntKi), PARAMETER :: M98N7RAye = 20482 + INTEGER(IntKi), PARAMETER :: M98N8RAye = 20483 + INTEGER(IntKi), PARAMETER :: M98N9RAye = 20484 + INTEGER(IntKi), PARAMETER :: M99N1RAye = 20485 + INTEGER(IntKi), PARAMETER :: M99N2RAye = 20486 + INTEGER(IntKi), PARAMETER :: M99N3RAye = 20487 + INTEGER(IntKi), PARAMETER :: M99N4RAye = 20488 + INTEGER(IntKi), PARAMETER :: M99N5RAye = 20489 + INTEGER(IntKi), PARAMETER :: M99N6RAye = 20490 + INTEGER(IntKi), PARAMETER :: M99N7RAye = 20491 + INTEGER(IntKi), PARAMETER :: M99N8RAye = 20492 + INTEGER(IntKi), PARAMETER :: M99N9RAye = 20493 + INTEGER(IntKi), PARAMETER :: M01N1RAze = 20494 + INTEGER(IntKi), PARAMETER :: M01N2RAze = 20495 + INTEGER(IntKi), PARAMETER :: M01N3RAze = 20496 + INTEGER(IntKi), PARAMETER :: M01N4RAze = 20497 + INTEGER(IntKi), PARAMETER :: M01N5RAze = 20498 + INTEGER(IntKi), PARAMETER :: M01N6RAze = 20499 + INTEGER(IntKi), PARAMETER :: M01N7RAze = 20500 + INTEGER(IntKi), PARAMETER :: M01N8RAze = 20501 + INTEGER(IntKi), PARAMETER :: M01N9RAze = 20502 + INTEGER(IntKi), PARAMETER :: M02N1RAze = 20503 + INTEGER(IntKi), PARAMETER :: M02N2RAze = 20504 + INTEGER(IntKi), PARAMETER :: M02N3RAze = 20505 + INTEGER(IntKi), PARAMETER :: M02N4RAze = 20506 + INTEGER(IntKi), PARAMETER :: M02N5RAze = 20507 + INTEGER(IntKi), PARAMETER :: M02N6RAze = 20508 + INTEGER(IntKi), PARAMETER :: M02N7RAze = 20509 + INTEGER(IntKi), PARAMETER :: M02N8RAze = 20510 + INTEGER(IntKi), PARAMETER :: M02N9RAze = 20511 + INTEGER(IntKi), PARAMETER :: M03N1RAze = 20512 + INTEGER(IntKi), PARAMETER :: M03N2RAze = 20513 + INTEGER(IntKi), PARAMETER :: M03N3RAze = 20514 + INTEGER(IntKi), PARAMETER :: M03N4RAze = 20515 + INTEGER(IntKi), PARAMETER :: M03N5RAze = 20516 + INTEGER(IntKi), PARAMETER :: M03N6RAze = 20517 + INTEGER(IntKi), PARAMETER :: M03N7RAze = 20518 + INTEGER(IntKi), PARAMETER :: M03N8RAze = 20519 + INTEGER(IntKi), PARAMETER :: M03N9RAze = 20520 + INTEGER(IntKi), PARAMETER :: M04N1RAze = 20521 + INTEGER(IntKi), PARAMETER :: M04N2RAze = 20522 + INTEGER(IntKi), PARAMETER :: M04N3RAze = 20523 + INTEGER(IntKi), PARAMETER :: M04N4RAze = 20524 + INTEGER(IntKi), PARAMETER :: M04N5RAze = 20525 + INTEGER(IntKi), PARAMETER :: M04N6RAze = 20526 + INTEGER(IntKi), PARAMETER :: M04N7RAze = 20527 + INTEGER(IntKi), PARAMETER :: M04N8RAze = 20528 + INTEGER(IntKi), PARAMETER :: M04N9RAze = 20529 + INTEGER(IntKi), PARAMETER :: M05N1RAze = 20530 + INTEGER(IntKi), PARAMETER :: M05N2RAze = 20531 + INTEGER(IntKi), PARAMETER :: M05N3RAze = 20532 + INTEGER(IntKi), PARAMETER :: M05N4RAze = 20533 + INTEGER(IntKi), PARAMETER :: M05N5RAze = 20534 + INTEGER(IntKi), PARAMETER :: M05N6RAze = 20535 + INTEGER(IntKi), PARAMETER :: M05N7RAze = 20536 + INTEGER(IntKi), PARAMETER :: M05N8RAze = 20537 + INTEGER(IntKi), PARAMETER :: M05N9RAze = 20538 + INTEGER(IntKi), PARAMETER :: M06N1RAze = 20539 + INTEGER(IntKi), PARAMETER :: M06N2RAze = 20540 + INTEGER(IntKi), PARAMETER :: M06N3RAze = 20541 + INTEGER(IntKi), PARAMETER :: M06N4RAze = 20542 + INTEGER(IntKi), PARAMETER :: M06N5RAze = 20543 + INTEGER(IntKi), PARAMETER :: M06N6RAze = 20544 + INTEGER(IntKi), PARAMETER :: M06N7RAze = 20545 + INTEGER(IntKi), PARAMETER :: M06N8RAze = 20546 + INTEGER(IntKi), PARAMETER :: M06N9RAze = 20547 + INTEGER(IntKi), PARAMETER :: M07N1RAze = 20548 + INTEGER(IntKi), PARAMETER :: M07N2RAze = 20549 + INTEGER(IntKi), PARAMETER :: M07N3RAze = 20550 + INTEGER(IntKi), PARAMETER :: M07N4RAze = 20551 + INTEGER(IntKi), PARAMETER :: M07N5RAze = 20552 + INTEGER(IntKi), PARAMETER :: M07N6RAze = 20553 + INTEGER(IntKi), PARAMETER :: M07N7RAze = 20554 + INTEGER(IntKi), PARAMETER :: M07N8RAze = 20555 + INTEGER(IntKi), PARAMETER :: M07N9RAze = 20556 + INTEGER(IntKi), PARAMETER :: M08N1RAze = 20557 + INTEGER(IntKi), PARAMETER :: M08N2RAze = 20558 + INTEGER(IntKi), PARAMETER :: M08N3RAze = 20559 + INTEGER(IntKi), PARAMETER :: M08N4RAze = 20560 + INTEGER(IntKi), PARAMETER :: M08N5RAze = 20561 + INTEGER(IntKi), PARAMETER :: M08N6RAze = 20562 + INTEGER(IntKi), PARAMETER :: M08N7RAze = 20563 + INTEGER(IntKi), PARAMETER :: M08N8RAze = 20564 + INTEGER(IntKi), PARAMETER :: M08N9RAze = 20565 + INTEGER(IntKi), PARAMETER :: M09N1RAze = 20566 + INTEGER(IntKi), PARAMETER :: M09N2RAze = 20567 + INTEGER(IntKi), PARAMETER :: M09N3RAze = 20568 + INTEGER(IntKi), PARAMETER :: M09N4RAze = 20569 + INTEGER(IntKi), PARAMETER :: M09N5RAze = 20570 + INTEGER(IntKi), PARAMETER :: M09N6RAze = 20571 + INTEGER(IntKi), PARAMETER :: M09N7RAze = 20572 + INTEGER(IntKi), PARAMETER :: M09N8RAze = 20573 + INTEGER(IntKi), PARAMETER :: M09N9RAze = 20574 + INTEGER(IntKi), PARAMETER :: M10N1RAze = 20575 + INTEGER(IntKi), PARAMETER :: M10N2RAze = 20576 + INTEGER(IntKi), PARAMETER :: M10N3RAze = 20577 + INTEGER(IntKi), PARAMETER :: M10N4RAze = 20578 + INTEGER(IntKi), PARAMETER :: M10N5RAze = 20579 + INTEGER(IntKi), PARAMETER :: M10N6RAze = 20580 + INTEGER(IntKi), PARAMETER :: M10N7RAze = 20581 + INTEGER(IntKi), PARAMETER :: M10N8RAze = 20582 + INTEGER(IntKi), PARAMETER :: M10N9RAze = 20583 + INTEGER(IntKi), PARAMETER :: M11N1RAze = 20584 + INTEGER(IntKi), PARAMETER :: M11N2RAze = 20585 + INTEGER(IntKi), PARAMETER :: M11N3RAze = 20586 + INTEGER(IntKi), PARAMETER :: M11N4RAze = 20587 + INTEGER(IntKi), PARAMETER :: M11N5RAze = 20588 + INTEGER(IntKi), PARAMETER :: M11N6RAze = 20589 + INTEGER(IntKi), PARAMETER :: M11N7RAze = 20590 + INTEGER(IntKi), PARAMETER :: M11N8RAze = 20591 + INTEGER(IntKi), PARAMETER :: M11N9RAze = 20592 + INTEGER(IntKi), PARAMETER :: M12N1RAze = 20593 + INTEGER(IntKi), PARAMETER :: M12N2RAze = 20594 + INTEGER(IntKi), PARAMETER :: M12N3RAze = 20595 + INTEGER(IntKi), PARAMETER :: M12N4RAze = 20596 + INTEGER(IntKi), PARAMETER :: M12N5RAze = 20597 + INTEGER(IntKi), PARAMETER :: M12N6RAze = 20598 + INTEGER(IntKi), PARAMETER :: M12N7RAze = 20599 + INTEGER(IntKi), PARAMETER :: M12N8RAze = 20600 + INTEGER(IntKi), PARAMETER :: M12N9RAze = 20601 + INTEGER(IntKi), PARAMETER :: M13N1RAze = 20602 + INTEGER(IntKi), PARAMETER :: M13N2RAze = 20603 + INTEGER(IntKi), PARAMETER :: M13N3RAze = 20604 + INTEGER(IntKi), PARAMETER :: M13N4RAze = 20605 + INTEGER(IntKi), PARAMETER :: M13N5RAze = 20606 + INTEGER(IntKi), PARAMETER :: M13N6RAze = 20607 + INTEGER(IntKi), PARAMETER :: M13N7RAze = 20608 + INTEGER(IntKi), PARAMETER :: M13N8RAze = 20609 + INTEGER(IntKi), PARAMETER :: M13N9RAze = 20610 + INTEGER(IntKi), PARAMETER :: M14N1RAze = 20611 + INTEGER(IntKi), PARAMETER :: M14N2RAze = 20612 + INTEGER(IntKi), PARAMETER :: M14N3RAze = 20613 + INTEGER(IntKi), PARAMETER :: M14N4RAze = 20614 + INTEGER(IntKi), PARAMETER :: M14N5RAze = 20615 + INTEGER(IntKi), PARAMETER :: M14N6RAze = 20616 + INTEGER(IntKi), PARAMETER :: M14N7RAze = 20617 + INTEGER(IntKi), PARAMETER :: M14N8RAze = 20618 + INTEGER(IntKi), PARAMETER :: M14N9RAze = 20619 + INTEGER(IntKi), PARAMETER :: M15N1RAze = 20620 + INTEGER(IntKi), PARAMETER :: M15N2RAze = 20621 + INTEGER(IntKi), PARAMETER :: M15N3RAze = 20622 + INTEGER(IntKi), PARAMETER :: M15N4RAze = 20623 + INTEGER(IntKi), PARAMETER :: M15N5RAze = 20624 + INTEGER(IntKi), PARAMETER :: M15N6RAze = 20625 + INTEGER(IntKi), PARAMETER :: M15N7RAze = 20626 + INTEGER(IntKi), PARAMETER :: M15N8RAze = 20627 + INTEGER(IntKi), PARAMETER :: M15N9RAze = 20628 + INTEGER(IntKi), PARAMETER :: M16N1RAze = 20629 + INTEGER(IntKi), PARAMETER :: M16N2RAze = 20630 + INTEGER(IntKi), PARAMETER :: M16N3RAze = 20631 + INTEGER(IntKi), PARAMETER :: M16N4RAze = 20632 + INTEGER(IntKi), PARAMETER :: M16N5RAze = 20633 + INTEGER(IntKi), PARAMETER :: M16N6RAze = 20634 + INTEGER(IntKi), PARAMETER :: M16N7RAze = 20635 + INTEGER(IntKi), PARAMETER :: M16N8RAze = 20636 + INTEGER(IntKi), PARAMETER :: M16N9RAze = 20637 + INTEGER(IntKi), PARAMETER :: M17N1RAze = 20638 + INTEGER(IntKi), PARAMETER :: M17N2RAze = 20639 + INTEGER(IntKi), PARAMETER :: M17N3RAze = 20640 + INTEGER(IntKi), PARAMETER :: M17N4RAze = 20641 + INTEGER(IntKi), PARAMETER :: M17N5RAze = 20642 + INTEGER(IntKi), PARAMETER :: M17N6RAze = 20643 + INTEGER(IntKi), PARAMETER :: M17N7RAze = 20644 + INTEGER(IntKi), PARAMETER :: M17N8RAze = 20645 + INTEGER(IntKi), PARAMETER :: M17N9RAze = 20646 + INTEGER(IntKi), PARAMETER :: M18N1RAze = 20647 + INTEGER(IntKi), PARAMETER :: M18N2RAze = 20648 + INTEGER(IntKi), PARAMETER :: M18N3RAze = 20649 + INTEGER(IntKi), PARAMETER :: M18N4RAze = 20650 + INTEGER(IntKi), PARAMETER :: M18N5RAze = 20651 + INTEGER(IntKi), PARAMETER :: M18N6RAze = 20652 + INTEGER(IntKi), PARAMETER :: M18N7RAze = 20653 + INTEGER(IntKi), PARAMETER :: M18N8RAze = 20654 + INTEGER(IntKi), PARAMETER :: M18N9RAze = 20655 + INTEGER(IntKi), PARAMETER :: M19N1RAze = 20656 + INTEGER(IntKi), PARAMETER :: M19N2RAze = 20657 + INTEGER(IntKi), PARAMETER :: M19N3RAze = 20658 + INTEGER(IntKi), PARAMETER :: M19N4RAze = 20659 + INTEGER(IntKi), PARAMETER :: M19N5RAze = 20660 + INTEGER(IntKi), PARAMETER :: M19N6RAze = 20661 + INTEGER(IntKi), PARAMETER :: M19N7RAze = 20662 + INTEGER(IntKi), PARAMETER :: M19N8RAze = 20663 + INTEGER(IntKi), PARAMETER :: M19N9RAze = 20664 + INTEGER(IntKi), PARAMETER :: M20N1RAze = 20665 + INTEGER(IntKi), PARAMETER :: M20N2RAze = 20666 + INTEGER(IntKi), PARAMETER :: M20N3RAze = 20667 + INTEGER(IntKi), PARAMETER :: M20N4RAze = 20668 + INTEGER(IntKi), PARAMETER :: M20N5RAze = 20669 + INTEGER(IntKi), PARAMETER :: M20N6RAze = 20670 + INTEGER(IntKi), PARAMETER :: M20N7RAze = 20671 + INTEGER(IntKi), PARAMETER :: M20N8RAze = 20672 + INTEGER(IntKi), PARAMETER :: M20N9RAze = 20673 + INTEGER(IntKi), PARAMETER :: M21N1RAze = 20674 + INTEGER(IntKi), PARAMETER :: M21N2RAze = 20675 + INTEGER(IntKi), PARAMETER :: M21N3RAze = 20676 + INTEGER(IntKi), PARAMETER :: M21N4RAze = 20677 + INTEGER(IntKi), PARAMETER :: M21N5RAze = 20678 + INTEGER(IntKi), PARAMETER :: M21N6RAze = 20679 + INTEGER(IntKi), PARAMETER :: M21N7RAze = 20680 + INTEGER(IntKi), PARAMETER :: M21N8RAze = 20681 + INTEGER(IntKi), PARAMETER :: M21N9RAze = 20682 + INTEGER(IntKi), PARAMETER :: M22N1RAze = 20683 + INTEGER(IntKi), PARAMETER :: M22N2RAze = 20684 + INTEGER(IntKi), PARAMETER :: M22N3RAze = 20685 + INTEGER(IntKi), PARAMETER :: M22N4RAze = 20686 + INTEGER(IntKi), PARAMETER :: M22N5RAze = 20687 + INTEGER(IntKi), PARAMETER :: M22N6RAze = 20688 + INTEGER(IntKi), PARAMETER :: M22N7RAze = 20689 + INTEGER(IntKi), PARAMETER :: M22N8RAze = 20690 + INTEGER(IntKi), PARAMETER :: M22N9RAze = 20691 + INTEGER(IntKi), PARAMETER :: M23N1RAze = 20692 + INTEGER(IntKi), PARAMETER :: M23N2RAze = 20693 + INTEGER(IntKi), PARAMETER :: M23N3RAze = 20694 + INTEGER(IntKi), PARAMETER :: M23N4RAze = 20695 + INTEGER(IntKi), PARAMETER :: M23N5RAze = 20696 + INTEGER(IntKi), PARAMETER :: M23N6RAze = 20697 + INTEGER(IntKi), PARAMETER :: M23N7RAze = 20698 + INTEGER(IntKi), PARAMETER :: M23N8RAze = 20699 + INTEGER(IntKi), PARAMETER :: M23N9RAze = 20700 + INTEGER(IntKi), PARAMETER :: M24N1RAze = 20701 + INTEGER(IntKi), PARAMETER :: M24N2RAze = 20702 + INTEGER(IntKi), PARAMETER :: M24N3RAze = 20703 + INTEGER(IntKi), PARAMETER :: M24N4RAze = 20704 + INTEGER(IntKi), PARAMETER :: M24N5RAze = 20705 + INTEGER(IntKi), PARAMETER :: M24N6RAze = 20706 + INTEGER(IntKi), PARAMETER :: M24N7RAze = 20707 + INTEGER(IntKi), PARAMETER :: M24N8RAze = 20708 + INTEGER(IntKi), PARAMETER :: M24N9RAze = 20709 + INTEGER(IntKi), PARAMETER :: M25N1RAze = 20710 + INTEGER(IntKi), PARAMETER :: M25N2RAze = 20711 + INTEGER(IntKi), PARAMETER :: M25N3RAze = 20712 + INTEGER(IntKi), PARAMETER :: M25N4RAze = 20713 + INTEGER(IntKi), PARAMETER :: M25N5RAze = 20714 + INTEGER(IntKi), PARAMETER :: M25N6RAze = 20715 + INTEGER(IntKi), PARAMETER :: M25N7RAze = 20716 + INTEGER(IntKi), PARAMETER :: M25N8RAze = 20717 + INTEGER(IntKi), PARAMETER :: M25N9RAze = 20718 + INTEGER(IntKi), PARAMETER :: M26N1RAze = 20719 + INTEGER(IntKi), PARAMETER :: M26N2RAze = 20720 + INTEGER(IntKi), PARAMETER :: M26N3RAze = 20721 + INTEGER(IntKi), PARAMETER :: M26N4RAze = 20722 + INTEGER(IntKi), PARAMETER :: M26N5RAze = 20723 + INTEGER(IntKi), PARAMETER :: M26N6RAze = 20724 + INTEGER(IntKi), PARAMETER :: M26N7RAze = 20725 + INTEGER(IntKi), PARAMETER :: M26N8RAze = 20726 + INTEGER(IntKi), PARAMETER :: M26N9RAze = 20727 + INTEGER(IntKi), PARAMETER :: M27N1RAze = 20728 + INTEGER(IntKi), PARAMETER :: M27N2RAze = 20729 + INTEGER(IntKi), PARAMETER :: M27N3RAze = 20730 + INTEGER(IntKi), PARAMETER :: M27N4RAze = 20731 + INTEGER(IntKi), PARAMETER :: M27N5RAze = 20732 + INTEGER(IntKi), PARAMETER :: M27N6RAze = 20733 + INTEGER(IntKi), PARAMETER :: M27N7RAze = 20734 + INTEGER(IntKi), PARAMETER :: M27N8RAze = 20735 + INTEGER(IntKi), PARAMETER :: M27N9RAze = 20736 + INTEGER(IntKi), PARAMETER :: M28N1RAze = 20737 + INTEGER(IntKi), PARAMETER :: M28N2RAze = 20738 + INTEGER(IntKi), PARAMETER :: M28N3RAze = 20739 + INTEGER(IntKi), PARAMETER :: M28N4RAze = 20740 + INTEGER(IntKi), PARAMETER :: M28N5RAze = 20741 + INTEGER(IntKi), PARAMETER :: M28N6RAze = 20742 + INTEGER(IntKi), PARAMETER :: M28N7RAze = 20743 + INTEGER(IntKi), PARAMETER :: M28N8RAze = 20744 + INTEGER(IntKi), PARAMETER :: M28N9RAze = 20745 + INTEGER(IntKi), PARAMETER :: M29N1RAze = 20746 + INTEGER(IntKi), PARAMETER :: M29N2RAze = 20747 + INTEGER(IntKi), PARAMETER :: M29N3RAze = 20748 + INTEGER(IntKi), PARAMETER :: M29N4RAze = 20749 + INTEGER(IntKi), PARAMETER :: M29N5RAze = 20750 + INTEGER(IntKi), PARAMETER :: M29N6RAze = 20751 + INTEGER(IntKi), PARAMETER :: M29N7RAze = 20752 + INTEGER(IntKi), PARAMETER :: M29N8RAze = 20753 + INTEGER(IntKi), PARAMETER :: M29N9RAze = 20754 + INTEGER(IntKi), PARAMETER :: M30N1RAze = 20755 + INTEGER(IntKi), PARAMETER :: M30N2RAze = 20756 + INTEGER(IntKi), PARAMETER :: M30N3RAze = 20757 + INTEGER(IntKi), PARAMETER :: M30N4RAze = 20758 + INTEGER(IntKi), PARAMETER :: M30N5RAze = 20759 + INTEGER(IntKi), PARAMETER :: M30N6RAze = 20760 + INTEGER(IntKi), PARAMETER :: M30N7RAze = 20761 + INTEGER(IntKi), PARAMETER :: M30N8RAze = 20762 + INTEGER(IntKi), PARAMETER :: M30N9RAze = 20763 + INTEGER(IntKi), PARAMETER :: M31N1RAze = 20764 + INTEGER(IntKi), PARAMETER :: M31N2RAze = 20765 + INTEGER(IntKi), PARAMETER :: M31N3RAze = 20766 + INTEGER(IntKi), PARAMETER :: M31N4RAze = 20767 + INTEGER(IntKi), PARAMETER :: M31N5RAze = 20768 + INTEGER(IntKi), PARAMETER :: M31N6RAze = 20769 + INTEGER(IntKi), PARAMETER :: M31N7RAze = 20770 + INTEGER(IntKi), PARAMETER :: M31N8RAze = 20771 + INTEGER(IntKi), PARAMETER :: M31N9RAze = 20772 + INTEGER(IntKi), PARAMETER :: M32N1RAze = 20773 + INTEGER(IntKi), PARAMETER :: M32N2RAze = 20774 + INTEGER(IntKi), PARAMETER :: M32N3RAze = 20775 + INTEGER(IntKi), PARAMETER :: M32N4RAze = 20776 + INTEGER(IntKi), PARAMETER :: M32N5RAze = 20777 + INTEGER(IntKi), PARAMETER :: M32N6RAze = 20778 + INTEGER(IntKi), PARAMETER :: M32N7RAze = 20779 + INTEGER(IntKi), PARAMETER :: M32N8RAze = 20780 + INTEGER(IntKi), PARAMETER :: M32N9RAze = 20781 + INTEGER(IntKi), PARAMETER :: M33N1RAze = 20782 + INTEGER(IntKi), PARAMETER :: M33N2RAze = 20783 + INTEGER(IntKi), PARAMETER :: M33N3RAze = 20784 + INTEGER(IntKi), PARAMETER :: M33N4RAze = 20785 + INTEGER(IntKi), PARAMETER :: M33N5RAze = 20786 + INTEGER(IntKi), PARAMETER :: M33N6RAze = 20787 + INTEGER(IntKi), PARAMETER :: M33N7RAze = 20788 + INTEGER(IntKi), PARAMETER :: M33N8RAze = 20789 + INTEGER(IntKi), PARAMETER :: M33N9RAze = 20790 + INTEGER(IntKi), PARAMETER :: M34N1RAze = 20791 + INTEGER(IntKi), PARAMETER :: M34N2RAze = 20792 + INTEGER(IntKi), PARAMETER :: M34N3RAze = 20793 + INTEGER(IntKi), PARAMETER :: M34N4RAze = 20794 + INTEGER(IntKi), PARAMETER :: M34N5RAze = 20795 + INTEGER(IntKi), PARAMETER :: M34N6RAze = 20796 + INTEGER(IntKi), PARAMETER :: M34N7RAze = 20797 + INTEGER(IntKi), PARAMETER :: M34N8RAze = 20798 + INTEGER(IntKi), PARAMETER :: M34N9RAze = 20799 + INTEGER(IntKi), PARAMETER :: M35N1RAze = 20800 + INTEGER(IntKi), PARAMETER :: M35N2RAze = 20801 + INTEGER(IntKi), PARAMETER :: M35N3RAze = 20802 + INTEGER(IntKi), PARAMETER :: M35N4RAze = 20803 + INTEGER(IntKi), PARAMETER :: M35N5RAze = 20804 + INTEGER(IntKi), PARAMETER :: M35N6RAze = 20805 + INTEGER(IntKi), PARAMETER :: M35N7RAze = 20806 + INTEGER(IntKi), PARAMETER :: M35N8RAze = 20807 + INTEGER(IntKi), PARAMETER :: M35N9RAze = 20808 + INTEGER(IntKi), PARAMETER :: M36N1RAze = 20809 + INTEGER(IntKi), PARAMETER :: M36N2RAze = 20810 + INTEGER(IntKi), PARAMETER :: M36N3RAze = 20811 + INTEGER(IntKi), PARAMETER :: M36N4RAze = 20812 + INTEGER(IntKi), PARAMETER :: M36N5RAze = 20813 + INTEGER(IntKi), PARAMETER :: M36N6RAze = 20814 + INTEGER(IntKi), PARAMETER :: M36N7RAze = 20815 + INTEGER(IntKi), PARAMETER :: M36N8RAze = 20816 + INTEGER(IntKi), PARAMETER :: M36N9RAze = 20817 + INTEGER(IntKi), PARAMETER :: M37N1RAze = 20818 + INTEGER(IntKi), PARAMETER :: M37N2RAze = 20819 + INTEGER(IntKi), PARAMETER :: M37N3RAze = 20820 + INTEGER(IntKi), PARAMETER :: M37N4RAze = 20821 + INTEGER(IntKi), PARAMETER :: M37N5RAze = 20822 + INTEGER(IntKi), PARAMETER :: M37N6RAze = 20823 + INTEGER(IntKi), PARAMETER :: M37N7RAze = 20824 + INTEGER(IntKi), PARAMETER :: M37N8RAze = 20825 + INTEGER(IntKi), PARAMETER :: M37N9RAze = 20826 + INTEGER(IntKi), PARAMETER :: M38N1RAze = 20827 + INTEGER(IntKi), PARAMETER :: M38N2RAze = 20828 + INTEGER(IntKi), PARAMETER :: M38N3RAze = 20829 + INTEGER(IntKi), PARAMETER :: M38N4RAze = 20830 + INTEGER(IntKi), PARAMETER :: M38N5RAze = 20831 + INTEGER(IntKi), PARAMETER :: M38N6RAze = 20832 + INTEGER(IntKi), PARAMETER :: M38N7RAze = 20833 + INTEGER(IntKi), PARAMETER :: M38N8RAze = 20834 + INTEGER(IntKi), PARAMETER :: M38N9RAze = 20835 + INTEGER(IntKi), PARAMETER :: M39N1RAze = 20836 + INTEGER(IntKi), PARAMETER :: M39N2RAze = 20837 + INTEGER(IntKi), PARAMETER :: M39N3RAze = 20838 + INTEGER(IntKi), PARAMETER :: M39N4RAze = 20839 + INTEGER(IntKi), PARAMETER :: M39N5RAze = 20840 + INTEGER(IntKi), PARAMETER :: M39N6RAze = 20841 + INTEGER(IntKi), PARAMETER :: M39N7RAze = 20842 + INTEGER(IntKi), PARAMETER :: M39N8RAze = 20843 + INTEGER(IntKi), PARAMETER :: M39N9RAze = 20844 + INTEGER(IntKi), PARAMETER :: M40N1RAze = 20845 + INTEGER(IntKi), PARAMETER :: M40N2RAze = 20846 + INTEGER(IntKi), PARAMETER :: M40N3RAze = 20847 + INTEGER(IntKi), PARAMETER :: M40N4RAze = 20848 + INTEGER(IntKi), PARAMETER :: M40N5RAze = 20849 + INTEGER(IntKi), PARAMETER :: M40N6RAze = 20850 + INTEGER(IntKi), PARAMETER :: M40N7RAze = 20851 + INTEGER(IntKi), PARAMETER :: M40N8RAze = 20852 + INTEGER(IntKi), PARAMETER :: M40N9RAze = 20853 + INTEGER(IntKi), PARAMETER :: M41N1RAze = 20854 + INTEGER(IntKi), PARAMETER :: M41N2RAze = 20855 + INTEGER(IntKi), PARAMETER :: M41N3RAze = 20856 + INTEGER(IntKi), PARAMETER :: M41N4RAze = 20857 + INTEGER(IntKi), PARAMETER :: M41N5RAze = 20858 + INTEGER(IntKi), PARAMETER :: M41N6RAze = 20859 + INTEGER(IntKi), PARAMETER :: M41N7RAze = 20860 + INTEGER(IntKi), PARAMETER :: M41N8RAze = 20861 + INTEGER(IntKi), PARAMETER :: M41N9RAze = 20862 + INTEGER(IntKi), PARAMETER :: M42N1RAze = 20863 + INTEGER(IntKi), PARAMETER :: M42N2RAze = 20864 + INTEGER(IntKi), PARAMETER :: M42N3RAze = 20865 + INTEGER(IntKi), PARAMETER :: M42N4RAze = 20866 + INTEGER(IntKi), PARAMETER :: M42N5RAze = 20867 + INTEGER(IntKi), PARAMETER :: M42N6RAze = 20868 + INTEGER(IntKi), PARAMETER :: M42N7RAze = 20869 + INTEGER(IntKi), PARAMETER :: M42N8RAze = 20870 + INTEGER(IntKi), PARAMETER :: M42N9RAze = 20871 + INTEGER(IntKi), PARAMETER :: M43N1RAze = 20872 + INTEGER(IntKi), PARAMETER :: M43N2RAze = 20873 + INTEGER(IntKi), PARAMETER :: M43N3RAze = 20874 + INTEGER(IntKi), PARAMETER :: M43N4RAze = 20875 + INTEGER(IntKi), PARAMETER :: M43N5RAze = 20876 + INTEGER(IntKi), PARAMETER :: M43N6RAze = 20877 + INTEGER(IntKi), PARAMETER :: M43N7RAze = 20878 + INTEGER(IntKi), PARAMETER :: M43N8RAze = 20879 + INTEGER(IntKi), PARAMETER :: M43N9RAze = 20880 + INTEGER(IntKi), PARAMETER :: M44N1RAze = 20881 + INTEGER(IntKi), PARAMETER :: M44N2RAze = 20882 + INTEGER(IntKi), PARAMETER :: M44N3RAze = 20883 + INTEGER(IntKi), PARAMETER :: M44N4RAze = 20884 + INTEGER(IntKi), PARAMETER :: M44N5RAze = 20885 + INTEGER(IntKi), PARAMETER :: M44N6RAze = 20886 + INTEGER(IntKi), PARAMETER :: M44N7RAze = 20887 + INTEGER(IntKi), PARAMETER :: M44N8RAze = 20888 + INTEGER(IntKi), PARAMETER :: M44N9RAze = 20889 + INTEGER(IntKi), PARAMETER :: M45N1RAze = 20890 + INTEGER(IntKi), PARAMETER :: M45N2RAze = 20891 + INTEGER(IntKi), PARAMETER :: M45N3RAze = 20892 + INTEGER(IntKi), PARAMETER :: M45N4RAze = 20893 + INTEGER(IntKi), PARAMETER :: M45N5RAze = 20894 + INTEGER(IntKi), PARAMETER :: M45N6RAze = 20895 + INTEGER(IntKi), PARAMETER :: M45N7RAze = 20896 + INTEGER(IntKi), PARAMETER :: M45N8RAze = 20897 + INTEGER(IntKi), PARAMETER :: M45N9RAze = 20898 + INTEGER(IntKi), PARAMETER :: M46N1RAze = 20899 + INTEGER(IntKi), PARAMETER :: M46N2RAze = 20900 + INTEGER(IntKi), PARAMETER :: M46N3RAze = 20901 + INTEGER(IntKi), PARAMETER :: M46N4RAze = 20902 + INTEGER(IntKi), PARAMETER :: M46N5RAze = 20903 + INTEGER(IntKi), PARAMETER :: M46N6RAze = 20904 + INTEGER(IntKi), PARAMETER :: M46N7RAze = 20905 + INTEGER(IntKi), PARAMETER :: M46N8RAze = 20906 + INTEGER(IntKi), PARAMETER :: M46N9RAze = 20907 + INTEGER(IntKi), PARAMETER :: M47N1RAze = 20908 + INTEGER(IntKi), PARAMETER :: M47N2RAze = 20909 + INTEGER(IntKi), PARAMETER :: M47N3RAze = 20910 + INTEGER(IntKi), PARAMETER :: M47N4RAze = 20911 + INTEGER(IntKi), PARAMETER :: M47N5RAze = 20912 + INTEGER(IntKi), PARAMETER :: M47N6RAze = 20913 + INTEGER(IntKi), PARAMETER :: M47N7RAze = 20914 + INTEGER(IntKi), PARAMETER :: M47N8RAze = 20915 + INTEGER(IntKi), PARAMETER :: M47N9RAze = 20916 + INTEGER(IntKi), PARAMETER :: M48N1RAze = 20917 + INTEGER(IntKi), PARAMETER :: M48N2RAze = 20918 + INTEGER(IntKi), PARAMETER :: M48N3RAze = 20919 + INTEGER(IntKi), PARAMETER :: M48N4RAze = 20920 + INTEGER(IntKi), PARAMETER :: M48N5RAze = 20921 + INTEGER(IntKi), PARAMETER :: M48N6RAze = 20922 + INTEGER(IntKi), PARAMETER :: M48N7RAze = 20923 + INTEGER(IntKi), PARAMETER :: M48N8RAze = 20924 + INTEGER(IntKi), PARAMETER :: M48N9RAze = 20925 + INTEGER(IntKi), PARAMETER :: M49N1RAze = 20926 + INTEGER(IntKi), PARAMETER :: M49N2RAze = 20927 + INTEGER(IntKi), PARAMETER :: M49N3RAze = 20928 + INTEGER(IntKi), PARAMETER :: M49N4RAze = 20929 + INTEGER(IntKi), PARAMETER :: M49N5RAze = 20930 + INTEGER(IntKi), PARAMETER :: M49N6RAze = 20931 + INTEGER(IntKi), PARAMETER :: M49N7RAze = 20932 + INTEGER(IntKi), PARAMETER :: M49N8RAze = 20933 + INTEGER(IntKi), PARAMETER :: M49N9RAze = 20934 + INTEGER(IntKi), PARAMETER :: M50N1RAze = 20935 + INTEGER(IntKi), PARAMETER :: M50N2RAze = 20936 + INTEGER(IntKi), PARAMETER :: M50N3RAze = 20937 + INTEGER(IntKi), PARAMETER :: M50N4RAze = 20938 + INTEGER(IntKi), PARAMETER :: M50N5RAze = 20939 + INTEGER(IntKi), PARAMETER :: M50N6RAze = 20940 + INTEGER(IntKi), PARAMETER :: M50N7RAze = 20941 + INTEGER(IntKi), PARAMETER :: M50N8RAze = 20942 + INTEGER(IntKi), PARAMETER :: M50N9RAze = 20943 + INTEGER(IntKi), PARAMETER :: M51N1RAze = 20944 + INTEGER(IntKi), PARAMETER :: M51N2RAze = 20945 + INTEGER(IntKi), PARAMETER :: M51N3RAze = 20946 + INTEGER(IntKi), PARAMETER :: M51N4RAze = 20947 + INTEGER(IntKi), PARAMETER :: M51N5RAze = 20948 + INTEGER(IntKi), PARAMETER :: M51N6RAze = 20949 + INTEGER(IntKi), PARAMETER :: M51N7RAze = 20950 + INTEGER(IntKi), PARAMETER :: M51N8RAze = 20951 + INTEGER(IntKi), PARAMETER :: M51N9RAze = 20952 + INTEGER(IntKi), PARAMETER :: M52N1RAze = 20953 + INTEGER(IntKi), PARAMETER :: M52N2RAze = 20954 + INTEGER(IntKi), PARAMETER :: M52N3RAze = 20955 + INTEGER(IntKi), PARAMETER :: M52N4RAze = 20956 + INTEGER(IntKi), PARAMETER :: M52N5RAze = 20957 + INTEGER(IntKi), PARAMETER :: M52N6RAze = 20958 + INTEGER(IntKi), PARAMETER :: M52N7RAze = 20959 + INTEGER(IntKi), PARAMETER :: M52N8RAze = 20960 + INTEGER(IntKi), PARAMETER :: M52N9RAze = 20961 + INTEGER(IntKi), PARAMETER :: M53N1RAze = 20962 + INTEGER(IntKi), PARAMETER :: M53N2RAze = 20963 + INTEGER(IntKi), PARAMETER :: M53N3RAze = 20964 + INTEGER(IntKi), PARAMETER :: M53N4RAze = 20965 + INTEGER(IntKi), PARAMETER :: M53N5RAze = 20966 + INTEGER(IntKi), PARAMETER :: M53N6RAze = 20967 + INTEGER(IntKi), PARAMETER :: M53N7RAze = 20968 + INTEGER(IntKi), PARAMETER :: M53N8RAze = 20969 + INTEGER(IntKi), PARAMETER :: M53N9RAze = 20970 + INTEGER(IntKi), PARAMETER :: M54N1RAze = 20971 + INTEGER(IntKi), PARAMETER :: M54N2RAze = 20972 + INTEGER(IntKi), PARAMETER :: M54N3RAze = 20973 + INTEGER(IntKi), PARAMETER :: M54N4RAze = 20974 + INTEGER(IntKi), PARAMETER :: M54N5RAze = 20975 + INTEGER(IntKi), PARAMETER :: M54N6RAze = 20976 + INTEGER(IntKi), PARAMETER :: M54N7RAze = 20977 + INTEGER(IntKi), PARAMETER :: M54N8RAze = 20978 + INTEGER(IntKi), PARAMETER :: M54N9RAze = 20979 + INTEGER(IntKi), PARAMETER :: M55N1RAze = 20980 + INTEGER(IntKi), PARAMETER :: M55N2RAze = 20981 + INTEGER(IntKi), PARAMETER :: M55N3RAze = 20982 + INTEGER(IntKi), PARAMETER :: M55N4RAze = 20983 + INTEGER(IntKi), PARAMETER :: M55N5RAze = 20984 + INTEGER(IntKi), PARAMETER :: M55N6RAze = 20985 + INTEGER(IntKi), PARAMETER :: M55N7RAze = 20986 + INTEGER(IntKi), PARAMETER :: M55N8RAze = 20987 + INTEGER(IntKi), PARAMETER :: M55N9RAze = 20988 + INTEGER(IntKi), PARAMETER :: M56N1RAze = 20989 + INTEGER(IntKi), PARAMETER :: M56N2RAze = 20990 + INTEGER(IntKi), PARAMETER :: M56N3RAze = 20991 + INTEGER(IntKi), PARAMETER :: M56N4RAze = 20992 + INTEGER(IntKi), PARAMETER :: M56N5RAze = 20993 + INTEGER(IntKi), PARAMETER :: M56N6RAze = 20994 + INTEGER(IntKi), PARAMETER :: M56N7RAze = 20995 + INTEGER(IntKi), PARAMETER :: M56N8RAze = 20996 + INTEGER(IntKi), PARAMETER :: M56N9RAze = 20997 + INTEGER(IntKi), PARAMETER :: M57N1RAze = 20998 + INTEGER(IntKi), PARAMETER :: M57N2RAze = 20999 + INTEGER(IntKi), PARAMETER :: M57N3RAze = 21000 + INTEGER(IntKi), PARAMETER :: M57N4RAze = 21001 + INTEGER(IntKi), PARAMETER :: M57N5RAze = 21002 + INTEGER(IntKi), PARAMETER :: M57N6RAze = 21003 + INTEGER(IntKi), PARAMETER :: M57N7RAze = 21004 + INTEGER(IntKi), PARAMETER :: M57N8RAze = 21005 + INTEGER(IntKi), PARAMETER :: M57N9RAze = 21006 + INTEGER(IntKi), PARAMETER :: M58N1RAze = 21007 + INTEGER(IntKi), PARAMETER :: M58N2RAze = 21008 + INTEGER(IntKi), PARAMETER :: M58N3RAze = 21009 + INTEGER(IntKi), PARAMETER :: M58N4RAze = 21010 + INTEGER(IntKi), PARAMETER :: M58N5RAze = 21011 + INTEGER(IntKi), PARAMETER :: M58N6RAze = 21012 + INTEGER(IntKi), PARAMETER :: M58N7RAze = 21013 + INTEGER(IntKi), PARAMETER :: M58N8RAze = 21014 + INTEGER(IntKi), PARAMETER :: M58N9RAze = 21015 + INTEGER(IntKi), PARAMETER :: M59N1RAze = 21016 + INTEGER(IntKi), PARAMETER :: M59N2RAze = 21017 + INTEGER(IntKi), PARAMETER :: M59N3RAze = 21018 + INTEGER(IntKi), PARAMETER :: M59N4RAze = 21019 + INTEGER(IntKi), PARAMETER :: M59N5RAze = 21020 + INTEGER(IntKi), PARAMETER :: M59N6RAze = 21021 + INTEGER(IntKi), PARAMETER :: M59N7RAze = 21022 + INTEGER(IntKi), PARAMETER :: M59N8RAze = 21023 + INTEGER(IntKi), PARAMETER :: M59N9RAze = 21024 + INTEGER(IntKi), PARAMETER :: M60N1RAze = 21025 + INTEGER(IntKi), PARAMETER :: M60N2RAze = 21026 + INTEGER(IntKi), PARAMETER :: M60N3RAze = 21027 + INTEGER(IntKi), PARAMETER :: M60N4RAze = 21028 + INTEGER(IntKi), PARAMETER :: M60N5RAze = 21029 + INTEGER(IntKi), PARAMETER :: M60N6RAze = 21030 + INTEGER(IntKi), PARAMETER :: M60N7RAze = 21031 + INTEGER(IntKi), PARAMETER :: M60N8RAze = 21032 + INTEGER(IntKi), PARAMETER :: M60N9RAze = 21033 + INTEGER(IntKi), PARAMETER :: M61N1RAze = 21034 + INTEGER(IntKi), PARAMETER :: M61N2RAze = 21035 + INTEGER(IntKi), PARAMETER :: M61N3RAze = 21036 + INTEGER(IntKi), PARAMETER :: M61N4RAze = 21037 + INTEGER(IntKi), PARAMETER :: M61N5RAze = 21038 + INTEGER(IntKi), PARAMETER :: M61N6RAze = 21039 + INTEGER(IntKi), PARAMETER :: M61N7RAze = 21040 + INTEGER(IntKi), PARAMETER :: M61N8RAze = 21041 + INTEGER(IntKi), PARAMETER :: M61N9RAze = 21042 + INTEGER(IntKi), PARAMETER :: M62N1RAze = 21043 + INTEGER(IntKi), PARAMETER :: M62N2RAze = 21044 + INTEGER(IntKi), PARAMETER :: M62N3RAze = 21045 + INTEGER(IntKi), PARAMETER :: M62N4RAze = 21046 + INTEGER(IntKi), PARAMETER :: M62N5RAze = 21047 + INTEGER(IntKi), PARAMETER :: M62N6RAze = 21048 + INTEGER(IntKi), PARAMETER :: M62N7RAze = 21049 + INTEGER(IntKi), PARAMETER :: M62N8RAze = 21050 + INTEGER(IntKi), PARAMETER :: M62N9RAze = 21051 + INTEGER(IntKi), PARAMETER :: M63N1RAze = 21052 + INTEGER(IntKi), PARAMETER :: M63N2RAze = 21053 + INTEGER(IntKi), PARAMETER :: M63N3RAze = 21054 + INTEGER(IntKi), PARAMETER :: M63N4RAze = 21055 + INTEGER(IntKi), PARAMETER :: M63N5RAze = 21056 + INTEGER(IntKi), PARAMETER :: M63N6RAze = 21057 + INTEGER(IntKi), PARAMETER :: M63N7RAze = 21058 + INTEGER(IntKi), PARAMETER :: M63N8RAze = 21059 + INTEGER(IntKi), PARAMETER :: M63N9RAze = 21060 + INTEGER(IntKi), PARAMETER :: M64N1RAze = 21061 + INTEGER(IntKi), PARAMETER :: M64N2RAze = 21062 + INTEGER(IntKi), PARAMETER :: M64N3RAze = 21063 + INTEGER(IntKi), PARAMETER :: M64N4RAze = 21064 + INTEGER(IntKi), PARAMETER :: M64N5RAze = 21065 + INTEGER(IntKi), PARAMETER :: M64N6RAze = 21066 + INTEGER(IntKi), PARAMETER :: M64N7RAze = 21067 + INTEGER(IntKi), PARAMETER :: M64N8RAze = 21068 + INTEGER(IntKi), PARAMETER :: M64N9RAze = 21069 + INTEGER(IntKi), PARAMETER :: M65N1RAze = 21070 + INTEGER(IntKi), PARAMETER :: M65N2RAze = 21071 + INTEGER(IntKi), PARAMETER :: M65N3RAze = 21072 + INTEGER(IntKi), PARAMETER :: M65N4RAze = 21073 + INTEGER(IntKi), PARAMETER :: M65N5RAze = 21074 + INTEGER(IntKi), PARAMETER :: M65N6RAze = 21075 + INTEGER(IntKi), PARAMETER :: M65N7RAze = 21076 + INTEGER(IntKi), PARAMETER :: M65N8RAze = 21077 + INTEGER(IntKi), PARAMETER :: M65N9RAze = 21078 + INTEGER(IntKi), PARAMETER :: M66N1RAze = 21079 + INTEGER(IntKi), PARAMETER :: M66N2RAze = 21080 + INTEGER(IntKi), PARAMETER :: M66N3RAze = 21081 + INTEGER(IntKi), PARAMETER :: M66N4RAze = 21082 + INTEGER(IntKi), PARAMETER :: M66N5RAze = 21083 + INTEGER(IntKi), PARAMETER :: M66N6RAze = 21084 + INTEGER(IntKi), PARAMETER :: M66N7RAze = 21085 + INTEGER(IntKi), PARAMETER :: M66N8RAze = 21086 + INTEGER(IntKi), PARAMETER :: M66N9RAze = 21087 + INTEGER(IntKi), PARAMETER :: M67N1RAze = 21088 + INTEGER(IntKi), PARAMETER :: M67N2RAze = 21089 + INTEGER(IntKi), PARAMETER :: M67N3RAze = 21090 + INTEGER(IntKi), PARAMETER :: M67N4RAze = 21091 + INTEGER(IntKi), PARAMETER :: M67N5RAze = 21092 + INTEGER(IntKi), PARAMETER :: M67N6RAze = 21093 + INTEGER(IntKi), PARAMETER :: M67N7RAze = 21094 + INTEGER(IntKi), PARAMETER :: M67N8RAze = 21095 + INTEGER(IntKi), PARAMETER :: M67N9RAze = 21096 + INTEGER(IntKi), PARAMETER :: M68N1RAze = 21097 + INTEGER(IntKi), PARAMETER :: M68N2RAze = 21098 + INTEGER(IntKi), PARAMETER :: M68N3RAze = 21099 + INTEGER(IntKi), PARAMETER :: M68N4RAze = 21100 + INTEGER(IntKi), PARAMETER :: M68N5RAze = 21101 + INTEGER(IntKi), PARAMETER :: M68N6RAze = 21102 + INTEGER(IntKi), PARAMETER :: M68N7RAze = 21103 + INTEGER(IntKi), PARAMETER :: M68N8RAze = 21104 + INTEGER(IntKi), PARAMETER :: M68N9RAze = 21105 + INTEGER(IntKi), PARAMETER :: M69N1RAze = 21106 + INTEGER(IntKi), PARAMETER :: M69N2RAze = 21107 + INTEGER(IntKi), PARAMETER :: M69N3RAze = 21108 + INTEGER(IntKi), PARAMETER :: M69N4RAze = 21109 + INTEGER(IntKi), PARAMETER :: M69N5RAze = 21110 + INTEGER(IntKi), PARAMETER :: M69N6RAze = 21111 + INTEGER(IntKi), PARAMETER :: M69N7RAze = 21112 + INTEGER(IntKi), PARAMETER :: M69N8RAze = 21113 + INTEGER(IntKi), PARAMETER :: M69N9RAze = 21114 + INTEGER(IntKi), PARAMETER :: M70N1RAze = 21115 + INTEGER(IntKi), PARAMETER :: M70N2RAze = 21116 + INTEGER(IntKi), PARAMETER :: M70N3RAze = 21117 + INTEGER(IntKi), PARAMETER :: M70N4RAze = 21118 + INTEGER(IntKi), PARAMETER :: M70N5RAze = 21119 + INTEGER(IntKi), PARAMETER :: M70N6RAze = 21120 + INTEGER(IntKi), PARAMETER :: M70N7RAze = 21121 + INTEGER(IntKi), PARAMETER :: M70N8RAze = 21122 + INTEGER(IntKi), PARAMETER :: M70N9RAze = 21123 + INTEGER(IntKi), PARAMETER :: M71N1RAze = 21124 + INTEGER(IntKi), PARAMETER :: M71N2RAze = 21125 + INTEGER(IntKi), PARAMETER :: M71N3RAze = 21126 + INTEGER(IntKi), PARAMETER :: M71N4RAze = 21127 + INTEGER(IntKi), PARAMETER :: M71N5RAze = 21128 + INTEGER(IntKi), PARAMETER :: M71N6RAze = 21129 + INTEGER(IntKi), PARAMETER :: M71N7RAze = 21130 + INTEGER(IntKi), PARAMETER :: M71N8RAze = 21131 + INTEGER(IntKi), PARAMETER :: M71N9RAze = 21132 + INTEGER(IntKi), PARAMETER :: M72N1RAze = 21133 + INTEGER(IntKi), PARAMETER :: M72N2RAze = 21134 + INTEGER(IntKi), PARAMETER :: M72N3RAze = 21135 + INTEGER(IntKi), PARAMETER :: M72N4RAze = 21136 + INTEGER(IntKi), PARAMETER :: M72N5RAze = 21137 + INTEGER(IntKi), PARAMETER :: M72N6RAze = 21138 + INTEGER(IntKi), PARAMETER :: M72N7RAze = 21139 + INTEGER(IntKi), PARAMETER :: M72N8RAze = 21140 + INTEGER(IntKi), PARAMETER :: M72N9RAze = 21141 + INTEGER(IntKi), PARAMETER :: M73N1RAze = 21142 + INTEGER(IntKi), PARAMETER :: M73N2RAze = 21143 + INTEGER(IntKi), PARAMETER :: M73N3RAze = 21144 + INTEGER(IntKi), PARAMETER :: M73N4RAze = 21145 + INTEGER(IntKi), PARAMETER :: M73N5RAze = 21146 + INTEGER(IntKi), PARAMETER :: M73N6RAze = 21147 + INTEGER(IntKi), PARAMETER :: M73N7RAze = 21148 + INTEGER(IntKi), PARAMETER :: M73N8RAze = 21149 + INTEGER(IntKi), PARAMETER :: M73N9RAze = 21150 + INTEGER(IntKi), PARAMETER :: M74N1RAze = 21151 + INTEGER(IntKi), PARAMETER :: M74N2RAze = 21152 + INTEGER(IntKi), PARAMETER :: M74N3RAze = 21153 + INTEGER(IntKi), PARAMETER :: M74N4RAze = 21154 + INTEGER(IntKi), PARAMETER :: M74N5RAze = 21155 + INTEGER(IntKi), PARAMETER :: M74N6RAze = 21156 + INTEGER(IntKi), PARAMETER :: M74N7RAze = 21157 + INTEGER(IntKi), PARAMETER :: M74N8RAze = 21158 + INTEGER(IntKi), PARAMETER :: M74N9RAze = 21159 + INTEGER(IntKi), PARAMETER :: M75N1RAze = 21160 + INTEGER(IntKi), PARAMETER :: M75N2RAze = 21161 + INTEGER(IntKi), PARAMETER :: M75N3RAze = 21162 + INTEGER(IntKi), PARAMETER :: M75N4RAze = 21163 + INTEGER(IntKi), PARAMETER :: M75N5RAze = 21164 + INTEGER(IntKi), PARAMETER :: M75N6RAze = 21165 + INTEGER(IntKi), PARAMETER :: M75N7RAze = 21166 + INTEGER(IntKi), PARAMETER :: M75N8RAze = 21167 + INTEGER(IntKi), PARAMETER :: M75N9RAze = 21168 + INTEGER(IntKi), PARAMETER :: M76N1RAze = 21169 + INTEGER(IntKi), PARAMETER :: M76N2RAze = 21170 + INTEGER(IntKi), PARAMETER :: M76N3RAze = 21171 + INTEGER(IntKi), PARAMETER :: M76N4RAze = 21172 + INTEGER(IntKi), PARAMETER :: M76N5RAze = 21173 + INTEGER(IntKi), PARAMETER :: M76N6RAze = 21174 + INTEGER(IntKi), PARAMETER :: M76N7RAze = 21175 + INTEGER(IntKi), PARAMETER :: M76N8RAze = 21176 + INTEGER(IntKi), PARAMETER :: M76N9RAze = 21177 + INTEGER(IntKi), PARAMETER :: M77N1RAze = 21178 + INTEGER(IntKi), PARAMETER :: M77N2RAze = 21179 + INTEGER(IntKi), PARAMETER :: M77N3RAze = 21180 + INTEGER(IntKi), PARAMETER :: M77N4RAze = 21181 + INTEGER(IntKi), PARAMETER :: M77N5RAze = 21182 + INTEGER(IntKi), PARAMETER :: M77N6RAze = 21183 + INTEGER(IntKi), PARAMETER :: M77N7RAze = 21184 + INTEGER(IntKi), PARAMETER :: M77N8RAze = 21185 + INTEGER(IntKi), PARAMETER :: M77N9RAze = 21186 + INTEGER(IntKi), PARAMETER :: M78N1RAze = 21187 + INTEGER(IntKi), PARAMETER :: M78N2RAze = 21188 + INTEGER(IntKi), PARAMETER :: M78N3RAze = 21189 + INTEGER(IntKi), PARAMETER :: M78N4RAze = 21190 + INTEGER(IntKi), PARAMETER :: M78N5RAze = 21191 + INTEGER(IntKi), PARAMETER :: M78N6RAze = 21192 + INTEGER(IntKi), PARAMETER :: M78N7RAze = 21193 + INTEGER(IntKi), PARAMETER :: M78N8RAze = 21194 + INTEGER(IntKi), PARAMETER :: M78N9RAze = 21195 + INTEGER(IntKi), PARAMETER :: M79N1RAze = 21196 + INTEGER(IntKi), PARAMETER :: M79N2RAze = 21197 + INTEGER(IntKi), PARAMETER :: M79N3RAze = 21198 + INTEGER(IntKi), PARAMETER :: M79N4RAze = 21199 + INTEGER(IntKi), PARAMETER :: M79N5RAze = 21200 + INTEGER(IntKi), PARAMETER :: M79N6RAze = 21201 + INTEGER(IntKi), PARAMETER :: M79N7RAze = 21202 + INTEGER(IntKi), PARAMETER :: M79N8RAze = 21203 + INTEGER(IntKi), PARAMETER :: M79N9RAze = 21204 + INTEGER(IntKi), PARAMETER :: M80N1RAze = 21205 + INTEGER(IntKi), PARAMETER :: M80N2RAze = 21206 + INTEGER(IntKi), PARAMETER :: M80N3RAze = 21207 + INTEGER(IntKi), PARAMETER :: M80N4RAze = 21208 + INTEGER(IntKi), PARAMETER :: M80N5RAze = 21209 + INTEGER(IntKi), PARAMETER :: M80N6RAze = 21210 + INTEGER(IntKi), PARAMETER :: M80N7RAze = 21211 + INTEGER(IntKi), PARAMETER :: M80N8RAze = 21212 + INTEGER(IntKi), PARAMETER :: M80N9RAze = 21213 + INTEGER(IntKi), PARAMETER :: M81N1RAze = 21214 + INTEGER(IntKi), PARAMETER :: M81N2RAze = 21215 + INTEGER(IntKi), PARAMETER :: M81N3RAze = 21216 + INTEGER(IntKi), PARAMETER :: M81N4RAze = 21217 + INTEGER(IntKi), PARAMETER :: M81N5RAze = 21218 + INTEGER(IntKi), PARAMETER :: M81N6RAze = 21219 + INTEGER(IntKi), PARAMETER :: M81N7RAze = 21220 + INTEGER(IntKi), PARAMETER :: M81N8RAze = 21221 + INTEGER(IntKi), PARAMETER :: M81N9RAze = 21222 + INTEGER(IntKi), PARAMETER :: M82N1RAze = 21223 + INTEGER(IntKi), PARAMETER :: M82N2RAze = 21224 + INTEGER(IntKi), PARAMETER :: M82N3RAze = 21225 + INTEGER(IntKi), PARAMETER :: M82N4RAze = 21226 + INTEGER(IntKi), PARAMETER :: M82N5RAze = 21227 + INTEGER(IntKi), PARAMETER :: M82N6RAze = 21228 + INTEGER(IntKi), PARAMETER :: M82N7RAze = 21229 + INTEGER(IntKi), PARAMETER :: M82N8RAze = 21230 + INTEGER(IntKi), PARAMETER :: M82N9RAze = 21231 + INTEGER(IntKi), PARAMETER :: M83N1RAze = 21232 + INTEGER(IntKi), PARAMETER :: M83N2RAze = 21233 + INTEGER(IntKi), PARAMETER :: M83N3RAze = 21234 + INTEGER(IntKi), PARAMETER :: M83N4RAze = 21235 + INTEGER(IntKi), PARAMETER :: M83N5RAze = 21236 + INTEGER(IntKi), PARAMETER :: M83N6RAze = 21237 + INTEGER(IntKi), PARAMETER :: M83N7RAze = 21238 + INTEGER(IntKi), PARAMETER :: M83N8RAze = 21239 + INTEGER(IntKi), PARAMETER :: M83N9RAze = 21240 + INTEGER(IntKi), PARAMETER :: M84N1RAze = 21241 + INTEGER(IntKi), PARAMETER :: M84N2RAze = 21242 + INTEGER(IntKi), PARAMETER :: M84N3RAze = 21243 + INTEGER(IntKi), PARAMETER :: M84N4RAze = 21244 + INTEGER(IntKi), PARAMETER :: M84N5RAze = 21245 + INTEGER(IntKi), PARAMETER :: M84N6RAze = 21246 + INTEGER(IntKi), PARAMETER :: M84N7RAze = 21247 + INTEGER(IntKi), PARAMETER :: M84N8RAze = 21248 + INTEGER(IntKi), PARAMETER :: M84N9RAze = 21249 + INTEGER(IntKi), PARAMETER :: M85N1RAze = 21250 + INTEGER(IntKi), PARAMETER :: M85N2RAze = 21251 + INTEGER(IntKi), PARAMETER :: M85N3RAze = 21252 + INTEGER(IntKi), PARAMETER :: M85N4RAze = 21253 + INTEGER(IntKi), PARAMETER :: M85N5RAze = 21254 + INTEGER(IntKi), PARAMETER :: M85N6RAze = 21255 + INTEGER(IntKi), PARAMETER :: M85N7RAze = 21256 + INTEGER(IntKi), PARAMETER :: M85N8RAze = 21257 + INTEGER(IntKi), PARAMETER :: M85N9RAze = 21258 + INTEGER(IntKi), PARAMETER :: M86N1RAze = 21259 + INTEGER(IntKi), PARAMETER :: M86N2RAze = 21260 + INTEGER(IntKi), PARAMETER :: M86N3RAze = 21261 + INTEGER(IntKi), PARAMETER :: M86N4RAze = 21262 + INTEGER(IntKi), PARAMETER :: M86N5RAze = 21263 + INTEGER(IntKi), PARAMETER :: M86N6RAze = 21264 + INTEGER(IntKi), PARAMETER :: M86N7RAze = 21265 + INTEGER(IntKi), PARAMETER :: M86N8RAze = 21266 + INTEGER(IntKi), PARAMETER :: M86N9RAze = 21267 + INTEGER(IntKi), PARAMETER :: M87N1RAze = 21268 + INTEGER(IntKi), PARAMETER :: M87N2RAze = 21269 + INTEGER(IntKi), PARAMETER :: M87N3RAze = 21270 + INTEGER(IntKi), PARAMETER :: M87N4RAze = 21271 + INTEGER(IntKi), PARAMETER :: M87N5RAze = 21272 + INTEGER(IntKi), PARAMETER :: M87N6RAze = 21273 + INTEGER(IntKi), PARAMETER :: M87N7RAze = 21274 + INTEGER(IntKi), PARAMETER :: M87N8RAze = 21275 + INTEGER(IntKi), PARAMETER :: M87N9RAze = 21276 + INTEGER(IntKi), PARAMETER :: M88N1RAze = 21277 + INTEGER(IntKi), PARAMETER :: M88N2RAze = 21278 + INTEGER(IntKi), PARAMETER :: M88N3RAze = 21279 + INTEGER(IntKi), PARAMETER :: M88N4RAze = 21280 + INTEGER(IntKi), PARAMETER :: M88N5RAze = 21281 + INTEGER(IntKi), PARAMETER :: M88N6RAze = 21282 + INTEGER(IntKi), PARAMETER :: M88N7RAze = 21283 + INTEGER(IntKi), PARAMETER :: M88N8RAze = 21284 + INTEGER(IntKi), PARAMETER :: M88N9RAze = 21285 + INTEGER(IntKi), PARAMETER :: M89N1RAze = 21286 + INTEGER(IntKi), PARAMETER :: M89N2RAze = 21287 + INTEGER(IntKi), PARAMETER :: M89N3RAze = 21288 + INTEGER(IntKi), PARAMETER :: M89N4RAze = 21289 + INTEGER(IntKi), PARAMETER :: M89N5RAze = 21290 + INTEGER(IntKi), PARAMETER :: M89N6RAze = 21291 + INTEGER(IntKi), PARAMETER :: M89N7RAze = 21292 + INTEGER(IntKi), PARAMETER :: M89N8RAze = 21293 + INTEGER(IntKi), PARAMETER :: M89N9RAze = 21294 + INTEGER(IntKi), PARAMETER :: M90N1RAze = 21295 + INTEGER(IntKi), PARAMETER :: M90N2RAze = 21296 + INTEGER(IntKi), PARAMETER :: M90N3RAze = 21297 + INTEGER(IntKi), PARAMETER :: M90N4RAze = 21298 + INTEGER(IntKi), PARAMETER :: M90N5RAze = 21299 + INTEGER(IntKi), PARAMETER :: M90N6RAze = 21300 + INTEGER(IntKi), PARAMETER :: M90N7RAze = 21301 + INTEGER(IntKi), PARAMETER :: M90N8RAze = 21302 + INTEGER(IntKi), PARAMETER :: M90N9RAze = 21303 + INTEGER(IntKi), PARAMETER :: M91N1RAze = 21304 + INTEGER(IntKi), PARAMETER :: M91N2RAze = 21305 + INTEGER(IntKi), PARAMETER :: M91N3RAze = 21306 + INTEGER(IntKi), PARAMETER :: M91N4RAze = 21307 + INTEGER(IntKi), PARAMETER :: M91N5RAze = 21308 + INTEGER(IntKi), PARAMETER :: M91N6RAze = 21309 + INTEGER(IntKi), PARAMETER :: M91N7RAze = 21310 + INTEGER(IntKi), PARAMETER :: M91N8RAze = 21311 + INTEGER(IntKi), PARAMETER :: M91N9RAze = 21312 + INTEGER(IntKi), PARAMETER :: M92N1RAze = 21313 + INTEGER(IntKi), PARAMETER :: M92N2RAze = 21314 + INTEGER(IntKi), PARAMETER :: M92N3RAze = 21315 + INTEGER(IntKi), PARAMETER :: M92N4RAze = 21316 + INTEGER(IntKi), PARAMETER :: M92N5RAze = 21317 + INTEGER(IntKi), PARAMETER :: M92N6RAze = 21318 + INTEGER(IntKi), PARAMETER :: M92N7RAze = 21319 + INTEGER(IntKi), PARAMETER :: M92N8RAze = 21320 + INTEGER(IntKi), PARAMETER :: M92N9RAze = 21321 + INTEGER(IntKi), PARAMETER :: M93N1RAze = 21322 + INTEGER(IntKi), PARAMETER :: M93N2RAze = 21323 + INTEGER(IntKi), PARAMETER :: M93N3RAze = 21324 + INTEGER(IntKi), PARAMETER :: M93N4RAze = 21325 + INTEGER(IntKi), PARAMETER :: M93N5RAze = 21326 + INTEGER(IntKi), PARAMETER :: M93N6RAze = 21327 + INTEGER(IntKi), PARAMETER :: M93N7RAze = 21328 + INTEGER(IntKi), PARAMETER :: M93N8RAze = 21329 + INTEGER(IntKi), PARAMETER :: M93N9RAze = 21330 + INTEGER(IntKi), PARAMETER :: M94N1RAze = 21331 + INTEGER(IntKi), PARAMETER :: M94N2RAze = 21332 + INTEGER(IntKi), PARAMETER :: M94N3RAze = 21333 + INTEGER(IntKi), PARAMETER :: M94N4RAze = 21334 + INTEGER(IntKi), PARAMETER :: M94N5RAze = 21335 + INTEGER(IntKi), PARAMETER :: M94N6RAze = 21336 + INTEGER(IntKi), PARAMETER :: M94N7RAze = 21337 + INTEGER(IntKi), PARAMETER :: M94N8RAze = 21338 + INTEGER(IntKi), PARAMETER :: M94N9RAze = 21339 + INTEGER(IntKi), PARAMETER :: M95N1RAze = 21340 + INTEGER(IntKi), PARAMETER :: M95N2RAze = 21341 + INTEGER(IntKi), PARAMETER :: M95N3RAze = 21342 + INTEGER(IntKi), PARAMETER :: M95N4RAze = 21343 + INTEGER(IntKi), PARAMETER :: M95N5RAze = 21344 + INTEGER(IntKi), PARAMETER :: M95N6RAze = 21345 + INTEGER(IntKi), PARAMETER :: M95N7RAze = 21346 + INTEGER(IntKi), PARAMETER :: M95N8RAze = 21347 + INTEGER(IntKi), PARAMETER :: M95N9RAze = 21348 + INTEGER(IntKi), PARAMETER :: M96N1RAze = 21349 + INTEGER(IntKi), PARAMETER :: M96N2RAze = 21350 + INTEGER(IntKi), PARAMETER :: M96N3RAze = 21351 + INTEGER(IntKi), PARAMETER :: M96N4RAze = 21352 + INTEGER(IntKi), PARAMETER :: M96N5RAze = 21353 + INTEGER(IntKi), PARAMETER :: M96N6RAze = 21354 + INTEGER(IntKi), PARAMETER :: M96N7RAze = 21355 + INTEGER(IntKi), PARAMETER :: M96N8RAze = 21356 + INTEGER(IntKi), PARAMETER :: M96N9RAze = 21357 + INTEGER(IntKi), PARAMETER :: M97N1RAze = 21358 + INTEGER(IntKi), PARAMETER :: M97N2RAze = 21359 + INTEGER(IntKi), PARAMETER :: M97N3RAze = 21360 + INTEGER(IntKi), PARAMETER :: M97N4RAze = 21361 + INTEGER(IntKi), PARAMETER :: M97N5RAze = 21362 + INTEGER(IntKi), PARAMETER :: M97N6RAze = 21363 + INTEGER(IntKi), PARAMETER :: M97N7RAze = 21364 + INTEGER(IntKi), PARAMETER :: M97N8RAze = 21365 + INTEGER(IntKi), PARAMETER :: M97N9RAze = 21366 + INTEGER(IntKi), PARAMETER :: M98N1RAze = 21367 + INTEGER(IntKi), PARAMETER :: M98N2RAze = 21368 + INTEGER(IntKi), PARAMETER :: M98N3RAze = 21369 + INTEGER(IntKi), PARAMETER :: M98N4RAze = 21370 + INTEGER(IntKi), PARAMETER :: M98N5RAze = 21371 + INTEGER(IntKi), PARAMETER :: M98N6RAze = 21372 + INTEGER(IntKi), PARAMETER :: M98N7RAze = 21373 + INTEGER(IntKi), PARAMETER :: M98N8RAze = 21374 + INTEGER(IntKi), PARAMETER :: M98N9RAze = 21375 + INTEGER(IntKi), PARAMETER :: M99N1RAze = 21376 + INTEGER(IntKi), PARAMETER :: M99N2RAze = 21377 + INTEGER(IntKi), PARAMETER :: M99N3RAze = 21378 + INTEGER(IntKi), PARAMETER :: M99N4RAze = 21379 + INTEGER(IntKi), PARAMETER :: M99N5RAze = 21380 + INTEGER(IntKi), PARAMETER :: M99N6RAze = 21381 + INTEGER(IntKi), PARAMETER :: M99N7RAze = 21382 + INTEGER(IntKi), PARAMETER :: M99N8RAze = 21383 + INTEGER(IntKi), PARAMETER :: M99N9RAze = 21384 + ! Reactions: - ! Displacements: + INTEGER(IntKi), PARAMETER :: ReactFXss = 21385 + INTEGER(IntKi), PARAMETER :: ReactFYss = 21386 + INTEGER(IntKi), PARAMETER :: ReactFZss = 21387 + INTEGER(IntKi), PARAMETER :: ReactMXss = 21388 + INTEGER(IntKi), PARAMETER :: ReactMYss = 21389 + INTEGER(IntKi), PARAMETER :: ReactMZss = 21390 + INTEGER(IntKi), PARAMETER :: Intf1FXss = 21391 + INTEGER(IntKi), PARAMETER :: Intf1FYss = 21392 + INTEGER(IntKi), PARAMETER :: Intf1FZss = 21393 + INTEGER(IntKi), PARAMETER :: Intf1MXss = 21394 + INTEGER(IntKi), PARAMETER :: Intf1MYss = 21395 + INTEGER(IntKi), PARAMETER :: Intf1MZss = 21396 + INTEGER(IntKi), PARAMETER :: Intf2FXss = 21397 + INTEGER(IntKi), PARAMETER :: Intf2FYss = 21398 + INTEGER(IntKi), PARAMETER :: Intf2FZss = 21399 + INTEGER(IntKi), PARAMETER :: Intf2MXss = 21400 + INTEGER(IntKi), PARAMETER :: Intf2MYss = 21401 + INTEGER(IntKi), PARAMETER :: Intf2MZss = 21402 + INTEGER(IntKi), PARAMETER :: Intf3FXss = 21403 + INTEGER(IntKi), PARAMETER :: Intf3FYss = 21404 + INTEGER(IntKi), PARAMETER :: Intf3FZss = 21405 + INTEGER(IntKi), PARAMETER :: Intf3MXss = 21406 + INTEGER(IntKi), PARAMETER :: Intf3MYss = 21407 + INTEGER(IntKi), PARAMETER :: Intf3MZss = 21408 + INTEGER(IntKi), PARAMETER :: Intf4FXss = 21409 + INTEGER(IntKi), PARAMETER :: Intf4FYss = 21410 + INTEGER(IntKi), PARAMETER :: Intf4FZss = 21411 + INTEGER(IntKi), PARAMETER :: Intf4MXss = 21412 + INTEGER(IntKi), PARAMETER :: Intf4MYss = 21413 + INTEGER(IntKi), PARAMETER :: Intf4MZss = 21414 + INTEGER(IntKi), PARAMETER :: Intf5FXss = 21415 + INTEGER(IntKi), PARAMETER :: Intf5FYss = 21416 + INTEGER(IntKi), PARAMETER :: Intf5FZss = 21417 + INTEGER(IntKi), PARAMETER :: Intf5MXss = 21418 + INTEGER(IntKi), PARAMETER :: Intf5MYss = 21419 + INTEGER(IntKi), PARAMETER :: Intf5MZss = 21420 + INTEGER(IntKi), PARAMETER :: Intf6FXss = 21421 + INTEGER(IntKi), PARAMETER :: Intf6FYss = 21422 + INTEGER(IntKi), PARAMETER :: Intf6FZss = 21423 + INTEGER(IntKi), PARAMETER :: Intf6MXss = 21424 + INTEGER(IntKi), PARAMETER :: Intf6MYss = 21425 + INTEGER(IntKi), PARAMETER :: Intf6MZss = 21426 + INTEGER(IntKi), PARAMETER :: Intf7FXss = 21427 + INTEGER(IntKi), PARAMETER :: Intf7FYss = 21428 + INTEGER(IntKi), PARAMETER :: Intf7FZss = 21429 + INTEGER(IntKi), PARAMETER :: Intf7MXss = 21430 + INTEGER(IntKi), PARAMETER :: Intf7MYss = 21431 + INTEGER(IntKi), PARAMETER :: Intf7MZss = 21432 + INTEGER(IntKi), PARAMETER :: Intf8FXss = 21433 + INTEGER(IntKi), PARAMETER :: Intf8FYss = 21434 + INTEGER(IntKi), PARAMETER :: Intf8FZss = 21435 + INTEGER(IntKi), PARAMETER :: Intf8MXss = 21436 + INTEGER(IntKi), PARAMETER :: Intf8MYss = 21437 + INTEGER(IntKi), PARAMETER :: Intf8MZss = 21438 + INTEGER(IntKi), PARAMETER :: Intf9FXss = 21439 + INTEGER(IntKi), PARAMETER :: Intf9FYss = 21440 + INTEGER(IntKi), PARAMETER :: Intf9FZss = 21441 + INTEGER(IntKi), PARAMETER :: Intf9MXss = 21442 + INTEGER(IntKi), PARAMETER :: Intf9MYss = 21443 + INTEGER(IntKi), PARAMETER :: Intf9MZss = 21444 - INTEGER(IntKi), PARAMETER :: M01N1TDxss = 10693 - INTEGER(IntKi), PARAMETER :: M01N2TDxss = 10694 - INTEGER(IntKi), PARAMETER :: M01N3TDxss = 10695 - INTEGER(IntKi), PARAMETER :: M01N4TDxss = 10696 - INTEGER(IntKi), PARAMETER :: M01N5TDxss = 10697 - INTEGER(IntKi), PARAMETER :: M01N6TDxss = 10698 - INTEGER(IntKi), PARAMETER :: M01N7TDxss = 10699 - INTEGER(IntKi), PARAMETER :: M01N8TDxss = 10700 - INTEGER(IntKi), PARAMETER :: M01N9TDxss = 10701 - INTEGER(IntKi), PARAMETER :: M02N1TDxss = 10702 - INTEGER(IntKi), PARAMETER :: M02N2TDxss = 10703 - INTEGER(IntKi), PARAMETER :: M02N3TDxss = 10704 - INTEGER(IntKi), PARAMETER :: M02N4TDxss = 10705 - INTEGER(IntKi), PARAMETER :: M02N5TDxss = 10706 - INTEGER(IntKi), PARAMETER :: M02N6TDxss = 10707 - INTEGER(IntKi), PARAMETER :: M02N7TDxss = 10708 - INTEGER(IntKi), PARAMETER :: M02N8TDxss = 10709 - INTEGER(IntKi), PARAMETER :: M02N9TDxss = 10710 - INTEGER(IntKi), PARAMETER :: M03N1TDxss = 10711 - INTEGER(IntKi), PARAMETER :: M03N2TDxss = 10712 - INTEGER(IntKi), PARAMETER :: M03N3TDxss = 10713 - INTEGER(IntKi), PARAMETER :: M03N4TDxss = 10714 - INTEGER(IntKi), PARAMETER :: M03N5TDxss = 10715 - INTEGER(IntKi), PARAMETER :: M03N6TDxss = 10716 - INTEGER(IntKi), PARAMETER :: M03N7TDxss = 10717 - INTEGER(IntKi), PARAMETER :: M03N8TDxss = 10718 - INTEGER(IntKi), PARAMETER :: M03N9TDxss = 10719 - INTEGER(IntKi), PARAMETER :: M04N1TDxss = 10720 - INTEGER(IntKi), PARAMETER :: M04N2TDxss = 10721 - INTEGER(IntKi), PARAMETER :: M04N3TDxss = 10722 - INTEGER(IntKi), PARAMETER :: M04N4TDxss = 10723 - INTEGER(IntKi), PARAMETER :: M04N5TDxss = 10724 - INTEGER(IntKi), PARAMETER :: M04N6TDxss = 10725 - INTEGER(IntKi), PARAMETER :: M04N7TDxss = 10726 - INTEGER(IntKi), PARAMETER :: M04N8TDxss = 10727 - INTEGER(IntKi), PARAMETER :: M04N9TDxss = 10728 - INTEGER(IntKi), PARAMETER :: M05N1TDxss = 10729 - INTEGER(IntKi), PARAMETER :: M05N2TDxss = 10730 - INTEGER(IntKi), PARAMETER :: M05N3TDxss = 10731 - INTEGER(IntKi), PARAMETER :: M05N4TDxss = 10732 - INTEGER(IntKi), PARAMETER :: M05N5TDxss = 10733 - INTEGER(IntKi), PARAMETER :: M05N6TDxss = 10734 - INTEGER(IntKi), PARAMETER :: M05N7TDxss = 10735 - INTEGER(IntKi), PARAMETER :: M05N8TDxss = 10736 - INTEGER(IntKi), PARAMETER :: M05N9TDxss = 10737 - INTEGER(IntKi), PARAMETER :: M06N1TDxss = 10738 - INTEGER(IntKi), PARAMETER :: M06N2TDxss = 10739 - INTEGER(IntKi), PARAMETER :: M06N3TDxss = 10740 - INTEGER(IntKi), PARAMETER :: M06N4TDxss = 10741 - INTEGER(IntKi), PARAMETER :: M06N5TDxss = 10742 - INTEGER(IntKi), PARAMETER :: M06N6TDxss = 10743 - INTEGER(IntKi), PARAMETER :: M06N7TDxss = 10744 - INTEGER(IntKi), PARAMETER :: M06N8TDxss = 10745 - INTEGER(IntKi), PARAMETER :: M06N9TDxss = 10746 - INTEGER(IntKi), PARAMETER :: M07N1TDxss = 10747 - INTEGER(IntKi), PARAMETER :: M07N2TDxss = 10748 - INTEGER(IntKi), PARAMETER :: M07N3TDxss = 10749 - INTEGER(IntKi), PARAMETER :: M07N4TDxss = 10750 - INTEGER(IntKi), PARAMETER :: M07N5TDxss = 10751 - INTEGER(IntKi), PARAMETER :: M07N6TDxss = 10752 - INTEGER(IntKi), PARAMETER :: M07N7TDxss = 10753 - INTEGER(IntKi), PARAMETER :: M07N8TDxss = 10754 - INTEGER(IntKi), PARAMETER :: M07N9TDxss = 10755 - INTEGER(IntKi), PARAMETER :: M08N1TDxss = 10756 - INTEGER(IntKi), PARAMETER :: M08N2TDxss = 10757 - INTEGER(IntKi), PARAMETER :: M08N3TDxss = 10758 - INTEGER(IntKi), PARAMETER :: M08N4TDxss = 10759 - INTEGER(IntKi), PARAMETER :: M08N5TDxss = 10760 - INTEGER(IntKi), PARAMETER :: M08N6TDxss = 10761 - INTEGER(IntKi), PARAMETER :: M08N7TDxss = 10762 - INTEGER(IntKi), PARAMETER :: M08N8TDxss = 10763 - INTEGER(IntKi), PARAMETER :: M08N9TDxss = 10764 - INTEGER(IntKi), PARAMETER :: M09N1TDxss = 10765 - INTEGER(IntKi), PARAMETER :: M09N2TDxss = 10766 - INTEGER(IntKi), PARAMETER :: M09N3TDxss = 10767 - INTEGER(IntKi), PARAMETER :: M09N4TDxss = 10768 - INTEGER(IntKi), PARAMETER :: M09N5TDxss = 10769 - INTEGER(IntKi), PARAMETER :: M09N6TDxss = 10770 - INTEGER(IntKi), PARAMETER :: M09N7TDxss = 10771 - INTEGER(IntKi), PARAMETER :: M09N8TDxss = 10772 - INTEGER(IntKi), PARAMETER :: M09N9TDxss = 10773 - INTEGER(IntKi), PARAMETER :: M10N1TDxss = 10774 - INTEGER(IntKi), PARAMETER :: M10N2TDxss = 10775 - INTEGER(IntKi), PARAMETER :: M10N3TDxss = 10776 - INTEGER(IntKi), PARAMETER :: M10N4TDxss = 10777 - INTEGER(IntKi), PARAMETER :: M10N5TDxss = 10778 - INTEGER(IntKi), PARAMETER :: M10N6TDxss = 10779 - INTEGER(IntKi), PARAMETER :: M10N7TDxss = 10780 - INTEGER(IntKi), PARAMETER :: M10N8TDxss = 10781 - INTEGER(IntKi), PARAMETER :: M10N9TDxss = 10782 - INTEGER(IntKi), PARAMETER :: M11N1TDxss = 10783 - INTEGER(IntKi), PARAMETER :: M11N2TDxss = 10784 - INTEGER(IntKi), PARAMETER :: M11N3TDxss = 10785 - INTEGER(IntKi), PARAMETER :: M11N4TDxss = 10786 - INTEGER(IntKi), PARAMETER :: M11N5TDxss = 10787 - INTEGER(IntKi), PARAMETER :: M11N6TDxss = 10788 - INTEGER(IntKi), PARAMETER :: M11N7TDxss = 10789 - INTEGER(IntKi), PARAMETER :: M11N8TDxss = 10790 - INTEGER(IntKi), PARAMETER :: M11N9TDxss = 10791 - INTEGER(IntKi), PARAMETER :: M12N1TDxss = 10792 - INTEGER(IntKi), PARAMETER :: M12N2TDxss = 10793 - INTEGER(IntKi), PARAMETER :: M12N3TDxss = 10794 - INTEGER(IntKi), PARAMETER :: M12N4TDxss = 10795 - INTEGER(IntKi), PARAMETER :: M12N5TDxss = 10796 - INTEGER(IntKi), PARAMETER :: M12N6TDxss = 10797 - INTEGER(IntKi), PARAMETER :: M12N7TDxss = 10798 - INTEGER(IntKi), PARAMETER :: M12N8TDxss = 10799 - INTEGER(IntKi), PARAMETER :: M12N9TDxss = 10800 - INTEGER(IntKi), PARAMETER :: M13N1TDxss = 10801 - INTEGER(IntKi), PARAMETER :: M13N2TDxss = 10802 - INTEGER(IntKi), PARAMETER :: M13N3TDxss = 10803 - INTEGER(IntKi), PARAMETER :: M13N4TDxss = 10804 - INTEGER(IntKi), PARAMETER :: M13N5TDxss = 10805 - INTEGER(IntKi), PARAMETER :: M13N6TDxss = 10806 - INTEGER(IntKi), PARAMETER :: M13N7TDxss = 10807 - INTEGER(IntKi), PARAMETER :: M13N8TDxss = 10808 - INTEGER(IntKi), PARAMETER :: M13N9TDxss = 10809 - INTEGER(IntKi), PARAMETER :: M14N1TDxss = 10810 - INTEGER(IntKi), PARAMETER :: M14N2TDxss = 10811 - INTEGER(IntKi), PARAMETER :: M14N3TDxss = 10812 - INTEGER(IntKi), PARAMETER :: M14N4TDxss = 10813 - INTEGER(IntKi), PARAMETER :: M14N5TDxss = 10814 - INTEGER(IntKi), PARAMETER :: M14N6TDxss = 10815 - INTEGER(IntKi), PARAMETER :: M14N7TDxss = 10816 - INTEGER(IntKi), PARAMETER :: M14N8TDxss = 10817 - INTEGER(IntKi), PARAMETER :: M14N9TDxss = 10818 - INTEGER(IntKi), PARAMETER :: M15N1TDxss = 10819 - INTEGER(IntKi), PARAMETER :: M15N2TDxss = 10820 - INTEGER(IntKi), PARAMETER :: M15N3TDxss = 10821 - INTEGER(IntKi), PARAMETER :: M15N4TDxss = 10822 - INTEGER(IntKi), PARAMETER :: M15N5TDxss = 10823 - INTEGER(IntKi), PARAMETER :: M15N6TDxss = 10824 - INTEGER(IntKi), PARAMETER :: M15N7TDxss = 10825 - INTEGER(IntKi), PARAMETER :: M15N8TDxss = 10826 - INTEGER(IntKi), PARAMETER :: M15N9TDxss = 10827 - INTEGER(IntKi), PARAMETER :: M16N1TDxss = 10828 - INTEGER(IntKi), PARAMETER :: M16N2TDxss = 10829 - INTEGER(IntKi), PARAMETER :: M16N3TDxss = 10830 - INTEGER(IntKi), PARAMETER :: M16N4TDxss = 10831 - INTEGER(IntKi), PARAMETER :: M16N5TDxss = 10832 - INTEGER(IntKi), PARAMETER :: M16N6TDxss = 10833 - INTEGER(IntKi), PARAMETER :: M16N7TDxss = 10834 - INTEGER(IntKi), PARAMETER :: M16N8TDxss = 10835 - INTEGER(IntKi), PARAMETER :: M16N9TDxss = 10836 - INTEGER(IntKi), PARAMETER :: M17N1TDxss = 10837 - INTEGER(IntKi), PARAMETER :: M17N2TDxss = 10838 - INTEGER(IntKi), PARAMETER :: M17N3TDxss = 10839 - INTEGER(IntKi), PARAMETER :: M17N4TDxss = 10840 - INTEGER(IntKi), PARAMETER :: M17N5TDxss = 10841 - INTEGER(IntKi), PARAMETER :: M17N6TDxss = 10842 - INTEGER(IntKi), PARAMETER :: M17N7TDxss = 10843 - INTEGER(IntKi), PARAMETER :: M17N8TDxss = 10844 - INTEGER(IntKi), PARAMETER :: M17N9TDxss = 10845 - INTEGER(IntKi), PARAMETER :: M18N1TDxss = 10846 - INTEGER(IntKi), PARAMETER :: M18N2TDxss = 10847 - INTEGER(IntKi), PARAMETER :: M18N3TDxss = 10848 - INTEGER(IntKi), PARAMETER :: M18N4TDxss = 10849 - INTEGER(IntKi), PARAMETER :: M18N5TDxss = 10850 - INTEGER(IntKi), PARAMETER :: M18N6TDxss = 10851 - INTEGER(IntKi), PARAMETER :: M18N7TDxss = 10852 - INTEGER(IntKi), PARAMETER :: M18N8TDxss = 10853 - INTEGER(IntKi), PARAMETER :: M18N9TDxss = 10854 - INTEGER(IntKi), PARAMETER :: M19N1TDxss = 10855 - INTEGER(IntKi), PARAMETER :: M19N2TDxss = 10856 - INTEGER(IntKi), PARAMETER :: M19N3TDxss = 10857 - INTEGER(IntKi), PARAMETER :: M19N4TDxss = 10858 - INTEGER(IntKi), PARAMETER :: M19N5TDxss = 10859 - INTEGER(IntKi), PARAMETER :: M19N6TDxss = 10860 - INTEGER(IntKi), PARAMETER :: M19N7TDxss = 10861 - INTEGER(IntKi), PARAMETER :: M19N8TDxss = 10862 - INTEGER(IntKi), PARAMETER :: M19N9TDxss = 10863 - INTEGER(IntKi), PARAMETER :: M20N1TDxss = 10864 - INTEGER(IntKi), PARAMETER :: M20N2TDxss = 10865 - INTEGER(IntKi), PARAMETER :: M20N3TDxss = 10866 - INTEGER(IntKi), PARAMETER :: M20N4TDxss = 10867 - INTEGER(IntKi), PARAMETER :: M20N5TDxss = 10868 - INTEGER(IntKi), PARAMETER :: M20N6TDxss = 10869 - INTEGER(IntKi), PARAMETER :: M20N7TDxss = 10870 - INTEGER(IntKi), PARAMETER :: M20N8TDxss = 10871 - INTEGER(IntKi), PARAMETER :: M20N9TDxss = 10872 - INTEGER(IntKi), PARAMETER :: M21N1TDxss = 10873 - INTEGER(IntKi), PARAMETER :: M21N2TDxss = 10874 - INTEGER(IntKi), PARAMETER :: M21N3TDxss = 10875 - INTEGER(IntKi), PARAMETER :: M21N4TDxss = 10876 - INTEGER(IntKi), PARAMETER :: M21N5TDxss = 10877 - INTEGER(IntKi), PARAMETER :: M21N6TDxss = 10878 - INTEGER(IntKi), PARAMETER :: M21N7TDxss = 10879 - INTEGER(IntKi), PARAMETER :: M21N8TDxss = 10880 - INTEGER(IntKi), PARAMETER :: M21N9TDxss = 10881 - INTEGER(IntKi), PARAMETER :: M22N1TDxss = 10882 - INTEGER(IntKi), PARAMETER :: M22N2TDxss = 10883 - INTEGER(IntKi), PARAMETER :: M22N3TDxss = 10884 - INTEGER(IntKi), PARAMETER :: M22N4TDxss = 10885 - INTEGER(IntKi), PARAMETER :: M22N5TDxss = 10886 - INTEGER(IntKi), PARAMETER :: M22N6TDxss = 10887 - INTEGER(IntKi), PARAMETER :: M22N7TDxss = 10888 - INTEGER(IntKi), PARAMETER :: M22N8TDxss = 10889 - INTEGER(IntKi), PARAMETER :: M22N9TDxss = 10890 - INTEGER(IntKi), PARAMETER :: M23N1TDxss = 10891 - INTEGER(IntKi), PARAMETER :: M23N2TDxss = 10892 - INTEGER(IntKi), PARAMETER :: M23N3TDxss = 10893 - INTEGER(IntKi), PARAMETER :: M23N4TDxss = 10894 - INTEGER(IntKi), PARAMETER :: M23N5TDxss = 10895 - INTEGER(IntKi), PARAMETER :: M23N6TDxss = 10896 - INTEGER(IntKi), PARAMETER :: M23N7TDxss = 10897 - INTEGER(IntKi), PARAMETER :: M23N8TDxss = 10898 - INTEGER(IntKi), PARAMETER :: M23N9TDxss = 10899 - INTEGER(IntKi), PARAMETER :: M24N1TDxss = 10900 - INTEGER(IntKi), PARAMETER :: M24N2TDxss = 10901 - INTEGER(IntKi), PARAMETER :: M24N3TDxss = 10902 - INTEGER(IntKi), PARAMETER :: M24N4TDxss = 10903 - INTEGER(IntKi), PARAMETER :: M24N5TDxss = 10904 - INTEGER(IntKi), PARAMETER :: M24N6TDxss = 10905 - INTEGER(IntKi), PARAMETER :: M24N7TDxss = 10906 - INTEGER(IntKi), PARAMETER :: M24N8TDxss = 10907 - INTEGER(IntKi), PARAMETER :: M24N9TDxss = 10908 - INTEGER(IntKi), PARAMETER :: M25N1TDxss = 10909 - INTEGER(IntKi), PARAMETER :: M25N2TDxss = 10910 - INTEGER(IntKi), PARAMETER :: M25N3TDxss = 10911 - INTEGER(IntKi), PARAMETER :: M25N4TDxss = 10912 - INTEGER(IntKi), PARAMETER :: M25N5TDxss = 10913 - INTEGER(IntKi), PARAMETER :: M25N6TDxss = 10914 - INTEGER(IntKi), PARAMETER :: M25N7TDxss = 10915 - INTEGER(IntKi), PARAMETER :: M25N8TDxss = 10916 - INTEGER(IntKi), PARAMETER :: M25N9TDxss = 10917 - INTEGER(IntKi), PARAMETER :: M26N1TDxss = 10918 - INTEGER(IntKi), PARAMETER :: M26N2TDxss = 10919 - INTEGER(IntKi), PARAMETER :: M26N3TDxss = 10920 - INTEGER(IntKi), PARAMETER :: M26N4TDxss = 10921 - INTEGER(IntKi), PARAMETER :: M26N5TDxss = 10922 - INTEGER(IntKi), PARAMETER :: M26N6TDxss = 10923 - INTEGER(IntKi), PARAMETER :: M26N7TDxss = 10924 - INTEGER(IntKi), PARAMETER :: M26N8TDxss = 10925 - INTEGER(IntKi), PARAMETER :: M26N9TDxss = 10926 - INTEGER(IntKi), PARAMETER :: M27N1TDxss = 10927 - INTEGER(IntKi), PARAMETER :: M27N2TDxss = 10928 - INTEGER(IntKi), PARAMETER :: M27N3TDxss = 10929 - INTEGER(IntKi), PARAMETER :: M27N4TDxss = 10930 - INTEGER(IntKi), PARAMETER :: M27N5TDxss = 10931 - INTEGER(IntKi), PARAMETER :: M27N6TDxss = 10932 - INTEGER(IntKi), PARAMETER :: M27N7TDxss = 10933 - INTEGER(IntKi), PARAMETER :: M27N8TDxss = 10934 - INTEGER(IntKi), PARAMETER :: M27N9TDxss = 10935 - INTEGER(IntKi), PARAMETER :: M28N1TDxss = 10936 - INTEGER(IntKi), PARAMETER :: M28N2TDxss = 10937 - INTEGER(IntKi), PARAMETER :: M28N3TDxss = 10938 - INTEGER(IntKi), PARAMETER :: M28N4TDxss = 10939 - INTEGER(IntKi), PARAMETER :: M28N5TDxss = 10940 - INTEGER(IntKi), PARAMETER :: M28N6TDxss = 10941 - INTEGER(IntKi), PARAMETER :: M28N7TDxss = 10942 - INTEGER(IntKi), PARAMETER :: M28N8TDxss = 10943 - INTEGER(IntKi), PARAMETER :: M28N9TDxss = 10944 - INTEGER(IntKi), PARAMETER :: M29N1TDxss = 10945 - INTEGER(IntKi), PARAMETER :: M29N2TDxss = 10946 - INTEGER(IntKi), PARAMETER :: M29N3TDxss = 10947 - INTEGER(IntKi), PARAMETER :: M29N4TDxss = 10948 - INTEGER(IntKi), PARAMETER :: M29N5TDxss = 10949 - INTEGER(IntKi), PARAMETER :: M29N6TDxss = 10950 - INTEGER(IntKi), PARAMETER :: M29N7TDxss = 10951 - INTEGER(IntKi), PARAMETER :: M29N8TDxss = 10952 - INTEGER(IntKi), PARAMETER :: M29N9TDxss = 10953 - INTEGER(IntKi), PARAMETER :: M30N1TDxss = 10954 - INTEGER(IntKi), PARAMETER :: M30N2TDxss = 10955 - INTEGER(IntKi), PARAMETER :: M30N3TDxss = 10956 - INTEGER(IntKi), PARAMETER :: M30N4TDxss = 10957 - INTEGER(IntKi), PARAMETER :: M30N5TDxss = 10958 - INTEGER(IntKi), PARAMETER :: M30N6TDxss = 10959 - INTEGER(IntKi), PARAMETER :: M30N7TDxss = 10960 - INTEGER(IntKi), PARAMETER :: M30N8TDxss = 10961 - INTEGER(IntKi), PARAMETER :: M30N9TDxss = 10962 - INTEGER(IntKi), PARAMETER :: M31N1TDxss = 10963 - INTEGER(IntKi), PARAMETER :: M31N2TDxss = 10964 - INTEGER(IntKi), PARAMETER :: M31N3TDxss = 10965 - INTEGER(IntKi), PARAMETER :: M31N4TDxss = 10966 - INTEGER(IntKi), PARAMETER :: M31N5TDxss = 10967 - INTEGER(IntKi), PARAMETER :: M31N6TDxss = 10968 - INTEGER(IntKi), PARAMETER :: M31N7TDxss = 10969 - INTEGER(IntKi), PARAMETER :: M31N8TDxss = 10970 - INTEGER(IntKi), PARAMETER :: M31N9TDxss = 10971 - INTEGER(IntKi), PARAMETER :: M32N1TDxss = 10972 - INTEGER(IntKi), PARAMETER :: M32N2TDxss = 10973 - INTEGER(IntKi), PARAMETER :: M32N3TDxss = 10974 - INTEGER(IntKi), PARAMETER :: M32N4TDxss = 10975 - INTEGER(IntKi), PARAMETER :: M32N5TDxss = 10976 - INTEGER(IntKi), PARAMETER :: M32N6TDxss = 10977 - INTEGER(IntKi), PARAMETER :: M32N7TDxss = 10978 - INTEGER(IntKi), PARAMETER :: M32N8TDxss = 10979 - INTEGER(IntKi), PARAMETER :: M32N9TDxss = 10980 - INTEGER(IntKi), PARAMETER :: M33N1TDxss = 10981 - INTEGER(IntKi), PARAMETER :: M33N2TDxss = 10982 - INTEGER(IntKi), PARAMETER :: M33N3TDxss = 10983 - INTEGER(IntKi), PARAMETER :: M33N4TDxss = 10984 - INTEGER(IntKi), PARAMETER :: M33N5TDxss = 10985 - INTEGER(IntKi), PARAMETER :: M33N6TDxss = 10986 - INTEGER(IntKi), PARAMETER :: M33N7TDxss = 10987 - INTEGER(IntKi), PARAMETER :: M33N8TDxss = 10988 - INTEGER(IntKi), PARAMETER :: M33N9TDxss = 10989 - INTEGER(IntKi), PARAMETER :: M34N1TDxss = 10990 - INTEGER(IntKi), PARAMETER :: M34N2TDxss = 10991 - INTEGER(IntKi), PARAMETER :: M34N3TDxss = 10992 - INTEGER(IntKi), PARAMETER :: M34N4TDxss = 10993 - INTEGER(IntKi), PARAMETER :: M34N5TDxss = 10994 - INTEGER(IntKi), PARAMETER :: M34N6TDxss = 10995 - INTEGER(IntKi), PARAMETER :: M34N7TDxss = 10996 - INTEGER(IntKi), PARAMETER :: M34N8TDxss = 10997 - INTEGER(IntKi), PARAMETER :: M34N9TDxss = 10998 - INTEGER(IntKi), PARAMETER :: M35N1TDxss = 10999 - INTEGER(IntKi), PARAMETER :: M35N2TDxss = 11000 - INTEGER(IntKi), PARAMETER :: M35N3TDxss = 11001 - INTEGER(IntKi), PARAMETER :: M35N4TDxss = 11002 - INTEGER(IntKi), PARAMETER :: M35N5TDxss = 11003 - INTEGER(IntKi), PARAMETER :: M35N6TDxss = 11004 - INTEGER(IntKi), PARAMETER :: M35N7TDxss = 11005 - INTEGER(IntKi), PARAMETER :: M35N8TDxss = 11006 - INTEGER(IntKi), PARAMETER :: M35N9TDxss = 11007 - INTEGER(IntKi), PARAMETER :: M36N1TDxss = 11008 - INTEGER(IntKi), PARAMETER :: M36N2TDxss = 11009 - INTEGER(IntKi), PARAMETER :: M36N3TDxss = 11010 - INTEGER(IntKi), PARAMETER :: M36N4TDxss = 11011 - INTEGER(IntKi), PARAMETER :: M36N5TDxss = 11012 - INTEGER(IntKi), PARAMETER :: M36N6TDxss = 11013 - INTEGER(IntKi), PARAMETER :: M36N7TDxss = 11014 - INTEGER(IntKi), PARAMETER :: M36N8TDxss = 11015 - INTEGER(IntKi), PARAMETER :: M36N9TDxss = 11016 - INTEGER(IntKi), PARAMETER :: M37N1TDxss = 11017 - INTEGER(IntKi), PARAMETER :: M37N2TDxss = 11018 - INTEGER(IntKi), PARAMETER :: M37N3TDxss = 11019 - INTEGER(IntKi), PARAMETER :: M37N4TDxss = 11020 - INTEGER(IntKi), PARAMETER :: M37N5TDxss = 11021 - INTEGER(IntKi), PARAMETER :: M37N6TDxss = 11022 - INTEGER(IntKi), PARAMETER :: M37N7TDxss = 11023 - INTEGER(IntKi), PARAMETER :: M37N8TDxss = 11024 - INTEGER(IntKi), PARAMETER :: M37N9TDxss = 11025 - INTEGER(IntKi), PARAMETER :: M38N1TDxss = 11026 - INTEGER(IntKi), PARAMETER :: M38N2TDxss = 11027 - INTEGER(IntKi), PARAMETER :: M38N3TDxss = 11028 - INTEGER(IntKi), PARAMETER :: M38N4TDxss = 11029 - INTEGER(IntKi), PARAMETER :: M38N5TDxss = 11030 - INTEGER(IntKi), PARAMETER :: M38N6TDxss = 11031 - INTEGER(IntKi), PARAMETER :: M38N7TDxss = 11032 - INTEGER(IntKi), PARAMETER :: M38N8TDxss = 11033 - INTEGER(IntKi), PARAMETER :: M38N9TDxss = 11034 - INTEGER(IntKi), PARAMETER :: M39N1TDxss = 11035 - INTEGER(IntKi), PARAMETER :: M39N2TDxss = 11036 - INTEGER(IntKi), PARAMETER :: M39N3TDxss = 11037 - INTEGER(IntKi), PARAMETER :: M39N4TDxss = 11038 - INTEGER(IntKi), PARAMETER :: M39N5TDxss = 11039 - INTEGER(IntKi), PARAMETER :: M39N6TDxss = 11040 - INTEGER(IntKi), PARAMETER :: M39N7TDxss = 11041 - INTEGER(IntKi), PARAMETER :: M39N8TDxss = 11042 - INTEGER(IntKi), PARAMETER :: M39N9TDxss = 11043 - INTEGER(IntKi), PARAMETER :: M40N1TDxss = 11044 - INTEGER(IntKi), PARAMETER :: M40N2TDxss = 11045 - INTEGER(IntKi), PARAMETER :: M40N3TDxss = 11046 - INTEGER(IntKi), PARAMETER :: M40N4TDxss = 11047 - INTEGER(IntKi), PARAMETER :: M40N5TDxss = 11048 - INTEGER(IntKi), PARAMETER :: M40N6TDxss = 11049 - INTEGER(IntKi), PARAMETER :: M40N7TDxss = 11050 - INTEGER(IntKi), PARAMETER :: M40N8TDxss = 11051 - INTEGER(IntKi), PARAMETER :: M40N9TDxss = 11052 - INTEGER(IntKi), PARAMETER :: M41N1TDxss = 11053 - INTEGER(IntKi), PARAMETER :: M41N2TDxss = 11054 - INTEGER(IntKi), PARAMETER :: M41N3TDxss = 11055 - INTEGER(IntKi), PARAMETER :: M41N4TDxss = 11056 - INTEGER(IntKi), PARAMETER :: M41N5TDxss = 11057 - INTEGER(IntKi), PARAMETER :: M41N6TDxss = 11058 - INTEGER(IntKi), PARAMETER :: M41N7TDxss = 11059 - INTEGER(IntKi), PARAMETER :: M41N8TDxss = 11060 - INTEGER(IntKi), PARAMETER :: M41N9TDxss = 11061 - INTEGER(IntKi), PARAMETER :: M42N1TDxss = 11062 - INTEGER(IntKi), PARAMETER :: M42N2TDxss = 11063 - INTEGER(IntKi), PARAMETER :: M42N3TDxss = 11064 - INTEGER(IntKi), PARAMETER :: M42N4TDxss = 11065 - INTEGER(IntKi), PARAMETER :: M42N5TDxss = 11066 - INTEGER(IntKi), PARAMETER :: M42N6TDxss = 11067 - INTEGER(IntKi), PARAMETER :: M42N7TDxss = 11068 - INTEGER(IntKi), PARAMETER :: M42N8TDxss = 11069 - INTEGER(IntKi), PARAMETER :: M42N9TDxss = 11070 - INTEGER(IntKi), PARAMETER :: M43N1TDxss = 11071 - INTEGER(IntKi), PARAMETER :: M43N2TDxss = 11072 - INTEGER(IntKi), PARAMETER :: M43N3TDxss = 11073 - INTEGER(IntKi), PARAMETER :: M43N4TDxss = 11074 - INTEGER(IntKi), PARAMETER :: M43N5TDxss = 11075 - INTEGER(IntKi), PARAMETER :: M43N6TDxss = 11076 - INTEGER(IntKi), PARAMETER :: M43N7TDxss = 11077 - INTEGER(IntKi), PARAMETER :: M43N8TDxss = 11078 - INTEGER(IntKi), PARAMETER :: M43N9TDxss = 11079 - INTEGER(IntKi), PARAMETER :: M44N1TDxss = 11080 - INTEGER(IntKi), PARAMETER :: M44N2TDxss = 11081 - INTEGER(IntKi), PARAMETER :: M44N3TDxss = 11082 - INTEGER(IntKi), PARAMETER :: M44N4TDxss = 11083 - INTEGER(IntKi), PARAMETER :: M44N5TDxss = 11084 - INTEGER(IntKi), PARAMETER :: M44N6TDxss = 11085 - INTEGER(IntKi), PARAMETER :: M44N7TDxss = 11086 - INTEGER(IntKi), PARAMETER :: M44N8TDxss = 11087 - INTEGER(IntKi), PARAMETER :: M44N9TDxss = 11088 - INTEGER(IntKi), PARAMETER :: M45N1TDxss = 11089 - INTEGER(IntKi), PARAMETER :: M45N2TDxss = 11090 - INTEGER(IntKi), PARAMETER :: M45N3TDxss = 11091 - INTEGER(IntKi), PARAMETER :: M45N4TDxss = 11092 - INTEGER(IntKi), PARAMETER :: M45N5TDxss = 11093 - INTEGER(IntKi), PARAMETER :: M45N6TDxss = 11094 - INTEGER(IntKi), PARAMETER :: M45N7TDxss = 11095 - INTEGER(IntKi), PARAMETER :: M45N8TDxss = 11096 - INTEGER(IntKi), PARAMETER :: M45N9TDxss = 11097 - INTEGER(IntKi), PARAMETER :: M46N1TDxss = 11098 - INTEGER(IntKi), PARAMETER :: M46N2TDxss = 11099 - INTEGER(IntKi), PARAMETER :: M46N3TDxss = 11100 - INTEGER(IntKi), PARAMETER :: M46N4TDxss = 11101 - INTEGER(IntKi), PARAMETER :: M46N5TDxss = 11102 - INTEGER(IntKi), PARAMETER :: M46N6TDxss = 11103 - INTEGER(IntKi), PARAMETER :: M46N7TDxss = 11104 - INTEGER(IntKi), PARAMETER :: M46N8TDxss = 11105 - INTEGER(IntKi), PARAMETER :: M46N9TDxss = 11106 - INTEGER(IntKi), PARAMETER :: M47N1TDxss = 11107 - INTEGER(IntKi), PARAMETER :: M47N2TDxss = 11108 - INTEGER(IntKi), PARAMETER :: M47N3TDxss = 11109 - INTEGER(IntKi), PARAMETER :: M47N4TDxss = 11110 - INTEGER(IntKi), PARAMETER :: M47N5TDxss = 11111 - INTEGER(IntKi), PARAMETER :: M47N6TDxss = 11112 - INTEGER(IntKi), PARAMETER :: M47N7TDxss = 11113 - INTEGER(IntKi), PARAMETER :: M47N8TDxss = 11114 - INTEGER(IntKi), PARAMETER :: M47N9TDxss = 11115 - INTEGER(IntKi), PARAMETER :: M48N1TDxss = 11116 - INTEGER(IntKi), PARAMETER :: M48N2TDxss = 11117 - INTEGER(IntKi), PARAMETER :: M48N3TDxss = 11118 - INTEGER(IntKi), PARAMETER :: M48N4TDxss = 11119 - INTEGER(IntKi), PARAMETER :: M48N5TDxss = 11120 - INTEGER(IntKi), PARAMETER :: M48N6TDxss = 11121 - INTEGER(IntKi), PARAMETER :: M48N7TDxss = 11122 - INTEGER(IntKi), PARAMETER :: M48N8TDxss = 11123 - INTEGER(IntKi), PARAMETER :: M48N9TDxss = 11124 - INTEGER(IntKi), PARAMETER :: M49N1TDxss = 11125 - INTEGER(IntKi), PARAMETER :: M49N2TDxss = 11126 - INTEGER(IntKi), PARAMETER :: M49N3TDxss = 11127 - INTEGER(IntKi), PARAMETER :: M49N4TDxss = 11128 - INTEGER(IntKi), PARAMETER :: M49N5TDxss = 11129 - INTEGER(IntKi), PARAMETER :: M49N6TDxss = 11130 - INTEGER(IntKi), PARAMETER :: M49N7TDxss = 11131 - INTEGER(IntKi), PARAMETER :: M49N8TDxss = 11132 - INTEGER(IntKi), PARAMETER :: M49N9TDxss = 11133 - INTEGER(IntKi), PARAMETER :: M50N1TDxss = 11134 - INTEGER(IntKi), PARAMETER :: M50N2TDxss = 11135 - INTEGER(IntKi), PARAMETER :: M50N3TDxss = 11136 - INTEGER(IntKi), PARAMETER :: M50N4TDxss = 11137 - INTEGER(IntKi), PARAMETER :: M50N5TDxss = 11138 - INTEGER(IntKi), PARAMETER :: M50N6TDxss = 11139 - INTEGER(IntKi), PARAMETER :: M50N7TDxss = 11140 - INTEGER(IntKi), PARAMETER :: M50N8TDxss = 11141 - INTEGER(IntKi), PARAMETER :: M50N9TDxss = 11142 - INTEGER(IntKi), PARAMETER :: M51N1TDxss = 11143 - INTEGER(IntKi), PARAMETER :: M51N2TDxss = 11144 - INTEGER(IntKi), PARAMETER :: M51N3TDxss = 11145 - INTEGER(IntKi), PARAMETER :: M51N4TDxss = 11146 - INTEGER(IntKi), PARAMETER :: M51N5TDxss = 11147 - INTEGER(IntKi), PARAMETER :: M51N6TDxss = 11148 - INTEGER(IntKi), PARAMETER :: M51N7TDxss = 11149 - INTEGER(IntKi), PARAMETER :: M51N8TDxss = 11150 - INTEGER(IntKi), PARAMETER :: M51N9TDxss = 11151 - INTEGER(IntKi), PARAMETER :: M52N1TDxss = 11152 - INTEGER(IntKi), PARAMETER :: M52N2TDxss = 11153 - INTEGER(IntKi), PARAMETER :: M52N3TDxss = 11154 - INTEGER(IntKi), PARAMETER :: M52N4TDxss = 11155 - INTEGER(IntKi), PARAMETER :: M52N5TDxss = 11156 - INTEGER(IntKi), PARAMETER :: M52N6TDxss = 11157 - INTEGER(IntKi), PARAMETER :: M52N7TDxss = 11158 - INTEGER(IntKi), PARAMETER :: M52N8TDxss = 11159 - INTEGER(IntKi), PARAMETER :: M52N9TDxss = 11160 - INTEGER(IntKi), PARAMETER :: M53N1TDxss = 11161 - INTEGER(IntKi), PARAMETER :: M53N2TDxss = 11162 - INTEGER(IntKi), PARAMETER :: M53N3TDxss = 11163 - INTEGER(IntKi), PARAMETER :: M53N4TDxss = 11164 - INTEGER(IntKi), PARAMETER :: M53N5TDxss = 11165 - INTEGER(IntKi), PARAMETER :: M53N6TDxss = 11166 - INTEGER(IntKi), PARAMETER :: M53N7TDxss = 11167 - INTEGER(IntKi), PARAMETER :: M53N8TDxss = 11168 - INTEGER(IntKi), PARAMETER :: M53N9TDxss = 11169 - INTEGER(IntKi), PARAMETER :: M54N1TDxss = 11170 - INTEGER(IntKi), PARAMETER :: M54N2TDxss = 11171 - INTEGER(IntKi), PARAMETER :: M54N3TDxss = 11172 - INTEGER(IntKi), PARAMETER :: M54N4TDxss = 11173 - INTEGER(IntKi), PARAMETER :: M54N5TDxss = 11174 - INTEGER(IntKi), PARAMETER :: M54N6TDxss = 11175 - INTEGER(IntKi), PARAMETER :: M54N7TDxss = 11176 - INTEGER(IntKi), PARAMETER :: M54N8TDxss = 11177 - INTEGER(IntKi), PARAMETER :: M54N9TDxss = 11178 - INTEGER(IntKi), PARAMETER :: M55N1TDxss = 11179 - INTEGER(IntKi), PARAMETER :: M55N2TDxss = 11180 - INTEGER(IntKi), PARAMETER :: M55N3TDxss = 11181 - INTEGER(IntKi), PARAMETER :: M55N4TDxss = 11182 - INTEGER(IntKi), PARAMETER :: M55N5TDxss = 11183 - INTEGER(IntKi), PARAMETER :: M55N6TDxss = 11184 - INTEGER(IntKi), PARAMETER :: M55N7TDxss = 11185 - INTEGER(IntKi), PARAMETER :: M55N8TDxss = 11186 - INTEGER(IntKi), PARAMETER :: M55N9TDxss = 11187 - INTEGER(IntKi), PARAMETER :: M56N1TDxss = 11188 - INTEGER(IntKi), PARAMETER :: M56N2TDxss = 11189 - INTEGER(IntKi), PARAMETER :: M56N3TDxss = 11190 - INTEGER(IntKi), PARAMETER :: M56N4TDxss = 11191 - INTEGER(IntKi), PARAMETER :: M56N5TDxss = 11192 - INTEGER(IntKi), PARAMETER :: M56N6TDxss = 11193 - INTEGER(IntKi), PARAMETER :: M56N7TDxss = 11194 - INTEGER(IntKi), PARAMETER :: M56N8TDxss = 11195 - INTEGER(IntKi), PARAMETER :: M56N9TDxss = 11196 - INTEGER(IntKi), PARAMETER :: M57N1TDxss = 11197 - INTEGER(IntKi), PARAMETER :: M57N2TDxss = 11198 - INTEGER(IntKi), PARAMETER :: M57N3TDxss = 11199 - INTEGER(IntKi), PARAMETER :: M57N4TDxss = 11200 - INTEGER(IntKi), PARAMETER :: M57N5TDxss = 11201 - INTEGER(IntKi), PARAMETER :: M57N6TDxss = 11202 - INTEGER(IntKi), PARAMETER :: M57N7TDxss = 11203 - INTEGER(IntKi), PARAMETER :: M57N8TDxss = 11204 - INTEGER(IntKi), PARAMETER :: M57N9TDxss = 11205 - INTEGER(IntKi), PARAMETER :: M58N1TDxss = 11206 - INTEGER(IntKi), PARAMETER :: M58N2TDxss = 11207 - INTEGER(IntKi), PARAMETER :: M58N3TDxss = 11208 - INTEGER(IntKi), PARAMETER :: M58N4TDxss = 11209 - INTEGER(IntKi), PARAMETER :: M58N5TDxss = 11210 - INTEGER(IntKi), PARAMETER :: M58N6TDxss = 11211 - INTEGER(IntKi), PARAMETER :: M58N7TDxss = 11212 - INTEGER(IntKi), PARAMETER :: M58N8TDxss = 11213 - INTEGER(IntKi), PARAMETER :: M58N9TDxss = 11214 - INTEGER(IntKi), PARAMETER :: M59N1TDxss = 11215 - INTEGER(IntKi), PARAMETER :: M59N2TDxss = 11216 - INTEGER(IntKi), PARAMETER :: M59N3TDxss = 11217 - INTEGER(IntKi), PARAMETER :: M59N4TDxss = 11218 - INTEGER(IntKi), PARAMETER :: M59N5TDxss = 11219 - INTEGER(IntKi), PARAMETER :: M59N6TDxss = 11220 - INTEGER(IntKi), PARAMETER :: M59N7TDxss = 11221 - INTEGER(IntKi), PARAMETER :: M59N8TDxss = 11222 - INTEGER(IntKi), PARAMETER :: M59N9TDxss = 11223 - INTEGER(IntKi), PARAMETER :: M60N1TDxss = 11224 - INTEGER(IntKi), PARAMETER :: M60N2TDxss = 11225 - INTEGER(IntKi), PARAMETER :: M60N3TDxss = 11226 - INTEGER(IntKi), PARAMETER :: M60N4TDxss = 11227 - INTEGER(IntKi), PARAMETER :: M60N5TDxss = 11228 - INTEGER(IntKi), PARAMETER :: M60N6TDxss = 11229 - INTEGER(IntKi), PARAMETER :: M60N7TDxss = 11230 - INTEGER(IntKi), PARAMETER :: M60N8TDxss = 11231 - INTEGER(IntKi), PARAMETER :: M60N9TDxss = 11232 - INTEGER(IntKi), PARAMETER :: M61N1TDxss = 11233 - INTEGER(IntKi), PARAMETER :: M61N2TDxss = 11234 - INTEGER(IntKi), PARAMETER :: M61N3TDxss = 11235 - INTEGER(IntKi), PARAMETER :: M61N4TDxss = 11236 - INTEGER(IntKi), PARAMETER :: M61N5TDxss = 11237 - INTEGER(IntKi), PARAMETER :: M61N6TDxss = 11238 - INTEGER(IntKi), PARAMETER :: M61N7TDxss = 11239 - INTEGER(IntKi), PARAMETER :: M61N8TDxss = 11240 - INTEGER(IntKi), PARAMETER :: M61N9TDxss = 11241 - INTEGER(IntKi), PARAMETER :: M62N1TDxss = 11242 - INTEGER(IntKi), PARAMETER :: M62N2TDxss = 11243 - INTEGER(IntKi), PARAMETER :: M62N3TDxss = 11244 - INTEGER(IntKi), PARAMETER :: M62N4TDxss = 11245 - INTEGER(IntKi), PARAMETER :: M62N5TDxss = 11246 - INTEGER(IntKi), PARAMETER :: M62N6TDxss = 11247 - INTEGER(IntKi), PARAMETER :: M62N7TDxss = 11248 - INTEGER(IntKi), PARAMETER :: M62N8TDxss = 11249 - INTEGER(IntKi), PARAMETER :: M62N9TDxss = 11250 - INTEGER(IntKi), PARAMETER :: M63N1TDxss = 11251 - INTEGER(IntKi), PARAMETER :: M63N2TDxss = 11252 - INTEGER(IntKi), PARAMETER :: M63N3TDxss = 11253 - INTEGER(IntKi), PARAMETER :: M63N4TDxss = 11254 - INTEGER(IntKi), PARAMETER :: M63N5TDxss = 11255 - INTEGER(IntKi), PARAMETER :: M63N6TDxss = 11256 - INTEGER(IntKi), PARAMETER :: M63N7TDxss = 11257 - INTEGER(IntKi), PARAMETER :: M63N8TDxss = 11258 - INTEGER(IntKi), PARAMETER :: M63N9TDxss = 11259 - INTEGER(IntKi), PARAMETER :: M64N1TDxss = 11260 - INTEGER(IntKi), PARAMETER :: M64N2TDxss = 11261 - INTEGER(IntKi), PARAMETER :: M64N3TDxss = 11262 - INTEGER(IntKi), PARAMETER :: M64N4TDxss = 11263 - INTEGER(IntKi), PARAMETER :: M64N5TDxss = 11264 - INTEGER(IntKi), PARAMETER :: M64N6TDxss = 11265 - INTEGER(IntKi), PARAMETER :: M64N7TDxss = 11266 - INTEGER(IntKi), PARAMETER :: M64N8TDxss = 11267 - INTEGER(IntKi), PARAMETER :: M64N9TDxss = 11268 - INTEGER(IntKi), PARAMETER :: M65N1TDxss = 11269 - INTEGER(IntKi), PARAMETER :: M65N2TDxss = 11270 - INTEGER(IntKi), PARAMETER :: M65N3TDxss = 11271 - INTEGER(IntKi), PARAMETER :: M65N4TDxss = 11272 - INTEGER(IntKi), PARAMETER :: M65N5TDxss = 11273 - INTEGER(IntKi), PARAMETER :: M65N6TDxss = 11274 - INTEGER(IntKi), PARAMETER :: M65N7TDxss = 11275 - INTEGER(IntKi), PARAMETER :: M65N8TDxss = 11276 - INTEGER(IntKi), PARAMETER :: M65N9TDxss = 11277 - INTEGER(IntKi), PARAMETER :: M66N1TDxss = 11278 - INTEGER(IntKi), PARAMETER :: M66N2TDxss = 11279 - INTEGER(IntKi), PARAMETER :: M66N3TDxss = 11280 - INTEGER(IntKi), PARAMETER :: M66N4TDxss = 11281 - INTEGER(IntKi), PARAMETER :: M66N5TDxss = 11282 - INTEGER(IntKi), PARAMETER :: M66N6TDxss = 11283 - INTEGER(IntKi), PARAMETER :: M66N7TDxss = 11284 - INTEGER(IntKi), PARAMETER :: M66N8TDxss = 11285 - INTEGER(IntKi), PARAMETER :: M66N9TDxss = 11286 - INTEGER(IntKi), PARAMETER :: M67N1TDxss = 11287 - INTEGER(IntKi), PARAMETER :: M67N2TDxss = 11288 - INTEGER(IntKi), PARAMETER :: M67N3TDxss = 11289 - INTEGER(IntKi), PARAMETER :: M67N4TDxss = 11290 - INTEGER(IntKi), PARAMETER :: M67N5TDxss = 11291 - INTEGER(IntKi), PARAMETER :: M67N6TDxss = 11292 - INTEGER(IntKi), PARAMETER :: M67N7TDxss = 11293 - INTEGER(IntKi), PARAMETER :: M67N8TDxss = 11294 - INTEGER(IntKi), PARAMETER :: M67N9TDxss = 11295 - INTEGER(IntKi), PARAMETER :: M68N1TDxss = 11296 - INTEGER(IntKi), PARAMETER :: M68N2TDxss = 11297 - INTEGER(IntKi), PARAMETER :: M68N3TDxss = 11298 - INTEGER(IntKi), PARAMETER :: M68N4TDxss = 11299 - INTEGER(IntKi), PARAMETER :: M68N5TDxss = 11300 - INTEGER(IntKi), PARAMETER :: M68N6TDxss = 11301 - INTEGER(IntKi), PARAMETER :: M68N7TDxss = 11302 - INTEGER(IntKi), PARAMETER :: M68N8TDxss = 11303 - INTEGER(IntKi), PARAMETER :: M68N9TDxss = 11304 - INTEGER(IntKi), PARAMETER :: M69N1TDxss = 11305 - INTEGER(IntKi), PARAMETER :: M69N2TDxss = 11306 - INTEGER(IntKi), PARAMETER :: M69N3TDxss = 11307 - INTEGER(IntKi), PARAMETER :: M69N4TDxss = 11308 - INTEGER(IntKi), PARAMETER :: M69N5TDxss = 11309 - INTEGER(IntKi), PARAMETER :: M69N6TDxss = 11310 - INTEGER(IntKi), PARAMETER :: M69N7TDxss = 11311 - INTEGER(IntKi), PARAMETER :: M69N8TDxss = 11312 - INTEGER(IntKi), PARAMETER :: M69N9TDxss = 11313 - INTEGER(IntKi), PARAMETER :: M70N1TDxss = 11314 - INTEGER(IntKi), PARAMETER :: M70N2TDxss = 11315 - INTEGER(IntKi), PARAMETER :: M70N3TDxss = 11316 - INTEGER(IntKi), PARAMETER :: M70N4TDxss = 11317 - INTEGER(IntKi), PARAMETER :: M70N5TDxss = 11318 - INTEGER(IntKi), PARAMETER :: M70N6TDxss = 11319 - INTEGER(IntKi), PARAMETER :: M70N7TDxss = 11320 - INTEGER(IntKi), PARAMETER :: M70N8TDxss = 11321 - INTEGER(IntKi), PARAMETER :: M70N9TDxss = 11322 - INTEGER(IntKi), PARAMETER :: M71N1TDxss = 11323 - INTEGER(IntKi), PARAMETER :: M71N2TDxss = 11324 - INTEGER(IntKi), PARAMETER :: M71N3TDxss = 11325 - INTEGER(IntKi), PARAMETER :: M71N4TDxss = 11326 - INTEGER(IntKi), PARAMETER :: M71N5TDxss = 11327 - INTEGER(IntKi), PARAMETER :: M71N6TDxss = 11328 - INTEGER(IntKi), PARAMETER :: M71N7TDxss = 11329 - INTEGER(IntKi), PARAMETER :: M71N8TDxss = 11330 - INTEGER(IntKi), PARAMETER :: M71N9TDxss = 11331 - INTEGER(IntKi), PARAMETER :: M72N1TDxss = 11332 - INTEGER(IntKi), PARAMETER :: M72N2TDxss = 11333 - INTEGER(IntKi), PARAMETER :: M72N3TDxss = 11334 - INTEGER(IntKi), PARAMETER :: M72N4TDxss = 11335 - INTEGER(IntKi), PARAMETER :: M72N5TDxss = 11336 - INTEGER(IntKi), PARAMETER :: M72N6TDxss = 11337 - INTEGER(IntKi), PARAMETER :: M72N7TDxss = 11338 - INTEGER(IntKi), PARAMETER :: M72N8TDxss = 11339 - INTEGER(IntKi), PARAMETER :: M72N9TDxss = 11340 - INTEGER(IntKi), PARAMETER :: M73N1TDxss = 11341 - INTEGER(IntKi), PARAMETER :: M73N2TDxss = 11342 - INTEGER(IntKi), PARAMETER :: M73N3TDxss = 11343 - INTEGER(IntKi), PARAMETER :: M73N4TDxss = 11344 - INTEGER(IntKi), PARAMETER :: M73N5TDxss = 11345 - INTEGER(IntKi), PARAMETER :: M73N6TDxss = 11346 - INTEGER(IntKi), PARAMETER :: M73N7TDxss = 11347 - INTEGER(IntKi), PARAMETER :: M73N8TDxss = 11348 - INTEGER(IntKi), PARAMETER :: M73N9TDxss = 11349 - INTEGER(IntKi), PARAMETER :: M74N1TDxss = 11350 - INTEGER(IntKi), PARAMETER :: M74N2TDxss = 11351 - INTEGER(IntKi), PARAMETER :: M74N3TDxss = 11352 - INTEGER(IntKi), PARAMETER :: M74N4TDxss = 11353 - INTEGER(IntKi), PARAMETER :: M74N5TDxss = 11354 - INTEGER(IntKi), PARAMETER :: M74N6TDxss = 11355 - INTEGER(IntKi), PARAMETER :: M74N7TDxss = 11356 - INTEGER(IntKi), PARAMETER :: M74N8TDxss = 11357 - INTEGER(IntKi), PARAMETER :: M74N9TDxss = 11358 - INTEGER(IntKi), PARAMETER :: M75N1TDxss = 11359 - INTEGER(IntKi), PARAMETER :: M75N2TDxss = 11360 - INTEGER(IntKi), PARAMETER :: M75N3TDxss = 11361 - INTEGER(IntKi), PARAMETER :: M75N4TDxss = 11362 - INTEGER(IntKi), PARAMETER :: M75N5TDxss = 11363 - INTEGER(IntKi), PARAMETER :: M75N6TDxss = 11364 - INTEGER(IntKi), PARAMETER :: M75N7TDxss = 11365 - INTEGER(IntKi), PARAMETER :: M75N8TDxss = 11366 - INTEGER(IntKi), PARAMETER :: M75N9TDxss = 11367 - INTEGER(IntKi), PARAMETER :: M76N1TDxss = 11368 - INTEGER(IntKi), PARAMETER :: M76N2TDxss = 11369 - INTEGER(IntKi), PARAMETER :: M76N3TDxss = 11370 - INTEGER(IntKi), PARAMETER :: M76N4TDxss = 11371 - INTEGER(IntKi), PARAMETER :: M76N5TDxss = 11372 - INTEGER(IntKi), PARAMETER :: M76N6TDxss = 11373 - INTEGER(IntKi), PARAMETER :: M76N7TDxss = 11374 - INTEGER(IntKi), PARAMETER :: M76N8TDxss = 11375 - INTEGER(IntKi), PARAMETER :: M76N9TDxss = 11376 - INTEGER(IntKi), PARAMETER :: M77N1TDxss = 11377 - INTEGER(IntKi), PARAMETER :: M77N2TDxss = 11378 - INTEGER(IntKi), PARAMETER :: M77N3TDxss = 11379 - INTEGER(IntKi), PARAMETER :: M77N4TDxss = 11380 - INTEGER(IntKi), PARAMETER :: M77N5TDxss = 11381 - INTEGER(IntKi), PARAMETER :: M77N6TDxss = 11382 - INTEGER(IntKi), PARAMETER :: M77N7TDxss = 11383 - INTEGER(IntKi), PARAMETER :: M77N8TDxss = 11384 - INTEGER(IntKi), PARAMETER :: M77N9TDxss = 11385 - INTEGER(IntKi), PARAMETER :: M78N1TDxss = 11386 - INTEGER(IntKi), PARAMETER :: M78N2TDxss = 11387 - INTEGER(IntKi), PARAMETER :: M78N3TDxss = 11388 - INTEGER(IntKi), PARAMETER :: M78N4TDxss = 11389 - INTEGER(IntKi), PARAMETER :: M78N5TDxss = 11390 - INTEGER(IntKi), PARAMETER :: M78N6TDxss = 11391 - INTEGER(IntKi), PARAMETER :: M78N7TDxss = 11392 - INTEGER(IntKi), PARAMETER :: M78N8TDxss = 11393 - INTEGER(IntKi), PARAMETER :: M78N9TDxss = 11394 - INTEGER(IntKi), PARAMETER :: M79N1TDxss = 11395 - INTEGER(IntKi), PARAMETER :: M79N2TDxss = 11396 - INTEGER(IntKi), PARAMETER :: M79N3TDxss = 11397 - INTEGER(IntKi), PARAMETER :: M79N4TDxss = 11398 - INTEGER(IntKi), PARAMETER :: M79N5TDxss = 11399 - INTEGER(IntKi), PARAMETER :: M79N6TDxss = 11400 - INTEGER(IntKi), PARAMETER :: M79N7TDxss = 11401 - INTEGER(IntKi), PARAMETER :: M79N8TDxss = 11402 - INTEGER(IntKi), PARAMETER :: M79N9TDxss = 11403 - INTEGER(IntKi), PARAMETER :: M80N1TDxss = 11404 - INTEGER(IntKi), PARAMETER :: M80N2TDxss = 11405 - INTEGER(IntKi), PARAMETER :: M80N3TDxss = 11406 - INTEGER(IntKi), PARAMETER :: M80N4TDxss = 11407 - INTEGER(IntKi), PARAMETER :: M80N5TDxss = 11408 - INTEGER(IntKi), PARAMETER :: M80N6TDxss = 11409 - INTEGER(IntKi), PARAMETER :: M80N7TDxss = 11410 - INTEGER(IntKi), PARAMETER :: M80N8TDxss = 11411 - INTEGER(IntKi), PARAMETER :: M80N9TDxss = 11412 - INTEGER(IntKi), PARAMETER :: M81N1TDxss = 11413 - INTEGER(IntKi), PARAMETER :: M81N2TDxss = 11414 - INTEGER(IntKi), PARAMETER :: M81N3TDxss = 11415 - INTEGER(IntKi), PARAMETER :: M81N4TDxss = 11416 - INTEGER(IntKi), PARAMETER :: M81N5TDxss = 11417 - INTEGER(IntKi), PARAMETER :: M81N6TDxss = 11418 - INTEGER(IntKi), PARAMETER :: M81N7TDxss = 11419 - INTEGER(IntKi), PARAMETER :: M81N8TDxss = 11420 - INTEGER(IntKi), PARAMETER :: M81N9TDxss = 11421 - INTEGER(IntKi), PARAMETER :: M82N1TDxss = 11422 - INTEGER(IntKi), PARAMETER :: M82N2TDxss = 11423 - INTEGER(IntKi), PARAMETER :: M82N3TDxss = 11424 - INTEGER(IntKi), PARAMETER :: M82N4TDxss = 11425 - INTEGER(IntKi), PARAMETER :: M82N5TDxss = 11426 - INTEGER(IntKi), PARAMETER :: M82N6TDxss = 11427 - INTEGER(IntKi), PARAMETER :: M82N7TDxss = 11428 - INTEGER(IntKi), PARAMETER :: M82N8TDxss = 11429 - INTEGER(IntKi), PARAMETER :: M82N9TDxss = 11430 - INTEGER(IntKi), PARAMETER :: M83N1TDxss = 11431 - INTEGER(IntKi), PARAMETER :: M83N2TDxss = 11432 - INTEGER(IntKi), PARAMETER :: M83N3TDxss = 11433 - INTEGER(IntKi), PARAMETER :: M83N4TDxss = 11434 - INTEGER(IntKi), PARAMETER :: M83N5TDxss = 11435 - INTEGER(IntKi), PARAMETER :: M83N6TDxss = 11436 - INTEGER(IntKi), PARAMETER :: M83N7TDxss = 11437 - INTEGER(IntKi), PARAMETER :: M83N8TDxss = 11438 - INTEGER(IntKi), PARAMETER :: M83N9TDxss = 11439 - INTEGER(IntKi), PARAMETER :: M84N1TDxss = 11440 - INTEGER(IntKi), PARAMETER :: M84N2TDxss = 11441 - INTEGER(IntKi), PARAMETER :: M84N3TDxss = 11442 - INTEGER(IntKi), PARAMETER :: M84N4TDxss = 11443 - INTEGER(IntKi), PARAMETER :: M84N5TDxss = 11444 - INTEGER(IntKi), PARAMETER :: M84N6TDxss = 11445 - INTEGER(IntKi), PARAMETER :: M84N7TDxss = 11446 - INTEGER(IntKi), PARAMETER :: M84N8TDxss = 11447 - INTEGER(IntKi), PARAMETER :: M84N9TDxss = 11448 - INTEGER(IntKi), PARAMETER :: M85N1TDxss = 11449 - INTEGER(IntKi), PARAMETER :: M85N2TDxss = 11450 - INTEGER(IntKi), PARAMETER :: M85N3TDxss = 11451 - INTEGER(IntKi), PARAMETER :: M85N4TDxss = 11452 - INTEGER(IntKi), PARAMETER :: M85N5TDxss = 11453 - INTEGER(IntKi), PARAMETER :: M85N6TDxss = 11454 - INTEGER(IntKi), PARAMETER :: M85N7TDxss = 11455 - INTEGER(IntKi), PARAMETER :: M85N8TDxss = 11456 - INTEGER(IntKi), PARAMETER :: M85N9TDxss = 11457 - INTEGER(IntKi), PARAMETER :: M86N1TDxss = 11458 - INTEGER(IntKi), PARAMETER :: M86N2TDxss = 11459 - INTEGER(IntKi), PARAMETER :: M86N3TDxss = 11460 - INTEGER(IntKi), PARAMETER :: M86N4TDxss = 11461 - INTEGER(IntKi), PARAMETER :: M86N5TDxss = 11462 - INTEGER(IntKi), PARAMETER :: M86N6TDxss = 11463 - INTEGER(IntKi), PARAMETER :: M86N7TDxss = 11464 - INTEGER(IntKi), PARAMETER :: M86N8TDxss = 11465 - INTEGER(IntKi), PARAMETER :: M86N9TDxss = 11466 - INTEGER(IntKi), PARAMETER :: M87N1TDxss = 11467 - INTEGER(IntKi), PARAMETER :: M87N2TDxss = 11468 - INTEGER(IntKi), PARAMETER :: M87N3TDxss = 11469 - INTEGER(IntKi), PARAMETER :: M87N4TDxss = 11470 - INTEGER(IntKi), PARAMETER :: M87N5TDxss = 11471 - INTEGER(IntKi), PARAMETER :: M87N6TDxss = 11472 - INTEGER(IntKi), PARAMETER :: M87N7TDxss = 11473 - INTEGER(IntKi), PARAMETER :: M87N8TDxss = 11474 - INTEGER(IntKi), PARAMETER :: M87N9TDxss = 11475 - INTEGER(IntKi), PARAMETER :: M88N1TDxss = 11476 - INTEGER(IntKi), PARAMETER :: M88N2TDxss = 11477 - INTEGER(IntKi), PARAMETER :: M88N3TDxss = 11478 - INTEGER(IntKi), PARAMETER :: M88N4TDxss = 11479 - INTEGER(IntKi), PARAMETER :: M88N5TDxss = 11480 - INTEGER(IntKi), PARAMETER :: M88N6TDxss = 11481 - INTEGER(IntKi), PARAMETER :: M88N7TDxss = 11482 - INTEGER(IntKi), PARAMETER :: M88N8TDxss = 11483 - INTEGER(IntKi), PARAMETER :: M88N9TDxss = 11484 - INTEGER(IntKi), PARAMETER :: M89N1TDxss = 11485 - INTEGER(IntKi), PARAMETER :: M89N2TDxss = 11486 - INTEGER(IntKi), PARAMETER :: M89N3TDxss = 11487 - INTEGER(IntKi), PARAMETER :: M89N4TDxss = 11488 - INTEGER(IntKi), PARAMETER :: M89N5TDxss = 11489 - INTEGER(IntKi), PARAMETER :: M89N6TDxss = 11490 - INTEGER(IntKi), PARAMETER :: M89N7TDxss = 11491 - INTEGER(IntKi), PARAMETER :: M89N8TDxss = 11492 - INTEGER(IntKi), PARAMETER :: M89N9TDxss = 11493 - INTEGER(IntKi), PARAMETER :: M90N1TDxss = 11494 - INTEGER(IntKi), PARAMETER :: M90N2TDxss = 11495 - INTEGER(IntKi), PARAMETER :: M90N3TDxss = 11496 - INTEGER(IntKi), PARAMETER :: M90N4TDxss = 11497 - INTEGER(IntKi), PARAMETER :: M90N5TDxss = 11498 - INTEGER(IntKi), PARAMETER :: M90N6TDxss = 11499 - INTEGER(IntKi), PARAMETER :: M90N7TDxss = 11500 - INTEGER(IntKi), PARAMETER :: M90N8TDxss = 11501 - INTEGER(IntKi), PARAMETER :: M90N9TDxss = 11502 - INTEGER(IntKi), PARAMETER :: M91N1TDxss = 11503 - INTEGER(IntKi), PARAMETER :: M91N2TDxss = 11504 - INTEGER(IntKi), PARAMETER :: M91N3TDxss = 11505 - INTEGER(IntKi), PARAMETER :: M91N4TDxss = 11506 - INTEGER(IntKi), PARAMETER :: M91N5TDxss = 11507 - INTEGER(IntKi), PARAMETER :: M91N6TDxss = 11508 - INTEGER(IntKi), PARAMETER :: M91N7TDxss = 11509 - INTEGER(IntKi), PARAMETER :: M91N8TDxss = 11510 - INTEGER(IntKi), PARAMETER :: M91N9TDxss = 11511 - INTEGER(IntKi), PARAMETER :: M92N1TDxss = 11512 - INTEGER(IntKi), PARAMETER :: M92N2TDxss = 11513 - INTEGER(IntKi), PARAMETER :: M92N3TDxss = 11514 - INTEGER(IntKi), PARAMETER :: M92N4TDxss = 11515 - INTEGER(IntKi), PARAMETER :: M92N5TDxss = 11516 - INTEGER(IntKi), PARAMETER :: M92N6TDxss = 11517 - INTEGER(IntKi), PARAMETER :: M92N7TDxss = 11518 - INTEGER(IntKi), PARAMETER :: M92N8TDxss = 11519 - INTEGER(IntKi), PARAMETER :: M92N9TDxss = 11520 - INTEGER(IntKi), PARAMETER :: M93N1TDxss = 11521 - INTEGER(IntKi), PARAMETER :: M93N2TDxss = 11522 - INTEGER(IntKi), PARAMETER :: M93N3TDxss = 11523 - INTEGER(IntKi), PARAMETER :: M93N4TDxss = 11524 - INTEGER(IntKi), PARAMETER :: M93N5TDxss = 11525 - INTEGER(IntKi), PARAMETER :: M93N6TDxss = 11526 - INTEGER(IntKi), PARAMETER :: M93N7TDxss = 11527 - INTEGER(IntKi), PARAMETER :: M93N8TDxss = 11528 - INTEGER(IntKi), PARAMETER :: M93N9TDxss = 11529 - INTEGER(IntKi), PARAMETER :: M94N1TDxss = 11530 - INTEGER(IntKi), PARAMETER :: M94N2TDxss = 11531 - INTEGER(IntKi), PARAMETER :: M94N3TDxss = 11532 - INTEGER(IntKi), PARAMETER :: M94N4TDxss = 11533 - INTEGER(IntKi), PARAMETER :: M94N5TDxss = 11534 - INTEGER(IntKi), PARAMETER :: M94N6TDxss = 11535 - INTEGER(IntKi), PARAMETER :: M94N7TDxss = 11536 - INTEGER(IntKi), PARAMETER :: M94N8TDxss = 11537 - INTEGER(IntKi), PARAMETER :: M94N9TDxss = 11538 - INTEGER(IntKi), PARAMETER :: M95N1TDxss = 11539 - INTEGER(IntKi), PARAMETER :: M95N2TDxss = 11540 - INTEGER(IntKi), PARAMETER :: M95N3TDxss = 11541 - INTEGER(IntKi), PARAMETER :: M95N4TDxss = 11542 - INTEGER(IntKi), PARAMETER :: M95N5TDxss = 11543 - INTEGER(IntKi), PARAMETER :: M95N6TDxss = 11544 - INTEGER(IntKi), PARAMETER :: M95N7TDxss = 11545 - INTEGER(IntKi), PARAMETER :: M95N8TDxss = 11546 - INTEGER(IntKi), PARAMETER :: M95N9TDxss = 11547 - INTEGER(IntKi), PARAMETER :: M96N1TDxss = 11548 - INTEGER(IntKi), PARAMETER :: M96N2TDxss = 11549 - INTEGER(IntKi), PARAMETER :: M96N3TDxss = 11550 - INTEGER(IntKi), PARAMETER :: M96N4TDxss = 11551 - INTEGER(IntKi), PARAMETER :: M96N5TDxss = 11552 - INTEGER(IntKi), PARAMETER :: M96N6TDxss = 11553 - INTEGER(IntKi), PARAMETER :: M96N7TDxss = 11554 - INTEGER(IntKi), PARAMETER :: M96N8TDxss = 11555 - INTEGER(IntKi), PARAMETER :: M96N9TDxss = 11556 - INTEGER(IntKi), PARAMETER :: M97N1TDxss = 11557 - INTEGER(IntKi), PARAMETER :: M97N2TDxss = 11558 - INTEGER(IntKi), PARAMETER :: M97N3TDxss = 11559 - INTEGER(IntKi), PARAMETER :: M97N4TDxss = 11560 - INTEGER(IntKi), PARAMETER :: M97N5TDxss = 11561 - INTEGER(IntKi), PARAMETER :: M97N6TDxss = 11562 - INTEGER(IntKi), PARAMETER :: M97N7TDxss = 11563 - INTEGER(IntKi), PARAMETER :: M97N8TDxss = 11564 - INTEGER(IntKi), PARAMETER :: M97N9TDxss = 11565 - INTEGER(IntKi), PARAMETER :: M98N1TDxss = 11566 - INTEGER(IntKi), PARAMETER :: M98N2TDxss = 11567 - INTEGER(IntKi), PARAMETER :: M98N3TDxss = 11568 - INTEGER(IntKi), PARAMETER :: M98N4TDxss = 11569 - INTEGER(IntKi), PARAMETER :: M98N5TDxss = 11570 - INTEGER(IntKi), PARAMETER :: M98N6TDxss = 11571 - INTEGER(IntKi), PARAMETER :: M98N7TDxss = 11572 - INTEGER(IntKi), PARAMETER :: M98N8TDxss = 11573 - INTEGER(IntKi), PARAMETER :: M98N9TDxss = 11574 - INTEGER(IntKi), PARAMETER :: M99N1TDxss = 11575 - INTEGER(IntKi), PARAMETER :: M99N2TDxss = 11576 - INTEGER(IntKi), PARAMETER :: M99N3TDxss = 11577 - INTEGER(IntKi), PARAMETER :: M99N4TDxss = 11578 - INTEGER(IntKi), PARAMETER :: M99N5TDxss = 11579 - INTEGER(IntKi), PARAMETER :: M99N6TDxss = 11580 - INTEGER(IntKi), PARAMETER :: M99N7TDxss = 11581 - INTEGER(IntKi), PARAMETER :: M99N8TDxss = 11582 - INTEGER(IntKi), PARAMETER :: M99N9TDxss = 11583 - INTEGER(IntKi), PARAMETER :: M01N1TDyss = 11584 - INTEGER(IntKi), PARAMETER :: M01N2TDyss = 11585 - INTEGER(IntKi), PARAMETER :: M01N3TDyss = 11586 - INTEGER(IntKi), PARAMETER :: M01N4TDyss = 11587 - INTEGER(IntKi), PARAMETER :: M01N5TDyss = 11588 - INTEGER(IntKi), PARAMETER :: M01N6TDyss = 11589 - INTEGER(IntKi), PARAMETER :: M01N7TDyss = 11590 - INTEGER(IntKi), PARAMETER :: M01N8TDyss = 11591 - INTEGER(IntKi), PARAMETER :: M01N9TDyss = 11592 - INTEGER(IntKi), PARAMETER :: M02N1TDyss = 11593 - INTEGER(IntKi), PARAMETER :: M02N2TDyss = 11594 - INTEGER(IntKi), PARAMETER :: M02N3TDyss = 11595 - INTEGER(IntKi), PARAMETER :: M02N4TDyss = 11596 - INTEGER(IntKi), PARAMETER :: M02N5TDyss = 11597 - INTEGER(IntKi), PARAMETER :: M02N6TDyss = 11598 - INTEGER(IntKi), PARAMETER :: M02N7TDyss = 11599 - INTEGER(IntKi), PARAMETER :: M02N8TDyss = 11600 - INTEGER(IntKi), PARAMETER :: M02N9TDyss = 11601 - INTEGER(IntKi), PARAMETER :: M03N1TDyss = 11602 - INTEGER(IntKi), PARAMETER :: M03N2TDyss = 11603 - INTEGER(IntKi), PARAMETER :: M03N3TDyss = 11604 - INTEGER(IntKi), PARAMETER :: M03N4TDyss = 11605 - INTEGER(IntKi), PARAMETER :: M03N5TDyss = 11606 - INTEGER(IntKi), PARAMETER :: M03N6TDyss = 11607 - INTEGER(IntKi), PARAMETER :: M03N7TDyss = 11608 - INTEGER(IntKi), PARAMETER :: M03N8TDyss = 11609 - INTEGER(IntKi), PARAMETER :: M03N9TDyss = 11610 - INTEGER(IntKi), PARAMETER :: M04N1TDyss = 11611 - INTEGER(IntKi), PARAMETER :: M04N2TDyss = 11612 - INTEGER(IntKi), PARAMETER :: M04N3TDyss = 11613 - INTEGER(IntKi), PARAMETER :: M04N4TDyss = 11614 - INTEGER(IntKi), PARAMETER :: M04N5TDyss = 11615 - INTEGER(IntKi), PARAMETER :: M04N6TDyss = 11616 - INTEGER(IntKi), PARAMETER :: M04N7TDyss = 11617 - INTEGER(IntKi), PARAMETER :: M04N8TDyss = 11618 - INTEGER(IntKi), PARAMETER :: M04N9TDyss = 11619 - INTEGER(IntKi), PARAMETER :: M05N1TDyss = 11620 - INTEGER(IntKi), PARAMETER :: M05N2TDyss = 11621 - INTEGER(IntKi), PARAMETER :: M05N3TDyss = 11622 - INTEGER(IntKi), PARAMETER :: M05N4TDyss = 11623 - INTEGER(IntKi), PARAMETER :: M05N5TDyss = 11624 - INTEGER(IntKi), PARAMETER :: M05N6TDyss = 11625 - INTEGER(IntKi), PARAMETER :: M05N7TDyss = 11626 - INTEGER(IntKi), PARAMETER :: M05N8TDyss = 11627 - INTEGER(IntKi), PARAMETER :: M05N9TDyss = 11628 - INTEGER(IntKi), PARAMETER :: M06N1TDyss = 11629 - INTEGER(IntKi), PARAMETER :: M06N2TDyss = 11630 - INTEGER(IntKi), PARAMETER :: M06N3TDyss = 11631 - INTEGER(IntKi), PARAMETER :: M06N4TDyss = 11632 - INTEGER(IntKi), PARAMETER :: M06N5TDyss = 11633 - INTEGER(IntKi), PARAMETER :: M06N6TDyss = 11634 - INTEGER(IntKi), PARAMETER :: M06N7TDyss = 11635 - INTEGER(IntKi), PARAMETER :: M06N8TDyss = 11636 - INTEGER(IntKi), PARAMETER :: M06N9TDyss = 11637 - INTEGER(IntKi), PARAMETER :: M07N1TDyss = 11638 - INTEGER(IntKi), PARAMETER :: M07N2TDyss = 11639 - INTEGER(IntKi), PARAMETER :: M07N3TDyss = 11640 - INTEGER(IntKi), PARAMETER :: M07N4TDyss = 11641 - INTEGER(IntKi), PARAMETER :: M07N5TDyss = 11642 - INTEGER(IntKi), PARAMETER :: M07N6TDyss = 11643 - INTEGER(IntKi), PARAMETER :: M07N7TDyss = 11644 - INTEGER(IntKi), PARAMETER :: M07N8TDyss = 11645 - INTEGER(IntKi), PARAMETER :: M07N9TDyss = 11646 - INTEGER(IntKi), PARAMETER :: M08N1TDyss = 11647 - INTEGER(IntKi), PARAMETER :: M08N2TDyss = 11648 - INTEGER(IntKi), PARAMETER :: M08N3TDyss = 11649 - INTEGER(IntKi), PARAMETER :: M08N4TDyss = 11650 - INTEGER(IntKi), PARAMETER :: M08N5TDyss = 11651 - INTEGER(IntKi), PARAMETER :: M08N6TDyss = 11652 - INTEGER(IntKi), PARAMETER :: M08N7TDyss = 11653 - INTEGER(IntKi), PARAMETER :: M08N8TDyss = 11654 - INTEGER(IntKi), PARAMETER :: M08N9TDyss = 11655 - INTEGER(IntKi), PARAMETER :: M09N1TDyss = 11656 - INTEGER(IntKi), PARAMETER :: M09N2TDyss = 11657 - INTEGER(IntKi), PARAMETER :: M09N3TDyss = 11658 - INTEGER(IntKi), PARAMETER :: M09N4TDyss = 11659 - INTEGER(IntKi), PARAMETER :: M09N5TDyss = 11660 - INTEGER(IntKi), PARAMETER :: M09N6TDyss = 11661 - INTEGER(IntKi), PARAMETER :: M09N7TDyss = 11662 - INTEGER(IntKi), PARAMETER :: M09N8TDyss = 11663 - INTEGER(IntKi), PARAMETER :: M09N9TDyss = 11664 - INTEGER(IntKi), PARAMETER :: M10N1TDyss = 11665 - INTEGER(IntKi), PARAMETER :: M10N2TDyss = 11666 - INTEGER(IntKi), PARAMETER :: M10N3TDyss = 11667 - INTEGER(IntKi), PARAMETER :: M10N4TDyss = 11668 - INTEGER(IntKi), PARAMETER :: M10N5TDyss = 11669 - INTEGER(IntKi), PARAMETER :: M10N6TDyss = 11670 - INTEGER(IntKi), PARAMETER :: M10N7TDyss = 11671 - INTEGER(IntKi), PARAMETER :: M10N8TDyss = 11672 - INTEGER(IntKi), PARAMETER :: M10N9TDyss = 11673 - INTEGER(IntKi), PARAMETER :: M11N1TDyss = 11674 - INTEGER(IntKi), PARAMETER :: M11N2TDyss = 11675 - INTEGER(IntKi), PARAMETER :: M11N3TDyss = 11676 - INTEGER(IntKi), PARAMETER :: M11N4TDyss = 11677 - INTEGER(IntKi), PARAMETER :: M11N5TDyss = 11678 - INTEGER(IntKi), PARAMETER :: M11N6TDyss = 11679 - INTEGER(IntKi), PARAMETER :: M11N7TDyss = 11680 - INTEGER(IntKi), PARAMETER :: M11N8TDyss = 11681 - INTEGER(IntKi), PARAMETER :: M11N9TDyss = 11682 - INTEGER(IntKi), PARAMETER :: M12N1TDyss = 11683 - INTEGER(IntKi), PARAMETER :: M12N2TDyss = 11684 - INTEGER(IntKi), PARAMETER :: M12N3TDyss = 11685 - INTEGER(IntKi), PARAMETER :: M12N4TDyss = 11686 - INTEGER(IntKi), PARAMETER :: M12N5TDyss = 11687 - INTEGER(IntKi), PARAMETER :: M12N6TDyss = 11688 - INTEGER(IntKi), PARAMETER :: M12N7TDyss = 11689 - INTEGER(IntKi), PARAMETER :: M12N8TDyss = 11690 - INTEGER(IntKi), PARAMETER :: M12N9TDyss = 11691 - INTEGER(IntKi), PARAMETER :: M13N1TDyss = 11692 - INTEGER(IntKi), PARAMETER :: M13N2TDyss = 11693 - INTEGER(IntKi), PARAMETER :: M13N3TDyss = 11694 - INTEGER(IntKi), PARAMETER :: M13N4TDyss = 11695 - INTEGER(IntKi), PARAMETER :: M13N5TDyss = 11696 - INTEGER(IntKi), PARAMETER :: M13N6TDyss = 11697 - INTEGER(IntKi), PARAMETER :: M13N7TDyss = 11698 - INTEGER(IntKi), PARAMETER :: M13N8TDyss = 11699 - INTEGER(IntKi), PARAMETER :: M13N9TDyss = 11700 - INTEGER(IntKi), PARAMETER :: M14N1TDyss = 11701 - INTEGER(IntKi), PARAMETER :: M14N2TDyss = 11702 - INTEGER(IntKi), PARAMETER :: M14N3TDyss = 11703 - INTEGER(IntKi), PARAMETER :: M14N4TDyss = 11704 - INTEGER(IntKi), PARAMETER :: M14N5TDyss = 11705 - INTEGER(IntKi), PARAMETER :: M14N6TDyss = 11706 - INTEGER(IntKi), PARAMETER :: M14N7TDyss = 11707 - INTEGER(IntKi), PARAMETER :: M14N8TDyss = 11708 - INTEGER(IntKi), PARAMETER :: M14N9TDyss = 11709 - INTEGER(IntKi), PARAMETER :: M15N1TDyss = 11710 - INTEGER(IntKi), PARAMETER :: M15N2TDyss = 11711 - INTEGER(IntKi), PARAMETER :: M15N3TDyss = 11712 - INTEGER(IntKi), PARAMETER :: M15N4TDyss = 11713 - INTEGER(IntKi), PARAMETER :: M15N5TDyss = 11714 - INTEGER(IntKi), PARAMETER :: M15N6TDyss = 11715 - INTEGER(IntKi), PARAMETER :: M15N7TDyss = 11716 - INTEGER(IntKi), PARAMETER :: M15N8TDyss = 11717 - INTEGER(IntKi), PARAMETER :: M15N9TDyss = 11718 - INTEGER(IntKi), PARAMETER :: M16N1TDyss = 11719 - INTEGER(IntKi), PARAMETER :: M16N2TDyss = 11720 - INTEGER(IntKi), PARAMETER :: M16N3TDyss = 11721 - INTEGER(IntKi), PARAMETER :: M16N4TDyss = 11722 - INTEGER(IntKi), PARAMETER :: M16N5TDyss = 11723 - INTEGER(IntKi), PARAMETER :: M16N6TDyss = 11724 - INTEGER(IntKi), PARAMETER :: M16N7TDyss = 11725 - INTEGER(IntKi), PARAMETER :: M16N8TDyss = 11726 - INTEGER(IntKi), PARAMETER :: M16N9TDyss = 11727 - INTEGER(IntKi), PARAMETER :: M17N1TDyss = 11728 - INTEGER(IntKi), PARAMETER :: M17N2TDyss = 11729 - INTEGER(IntKi), PARAMETER :: M17N3TDyss = 11730 - INTEGER(IntKi), PARAMETER :: M17N4TDyss = 11731 - INTEGER(IntKi), PARAMETER :: M17N5TDyss = 11732 - INTEGER(IntKi), PARAMETER :: M17N6TDyss = 11733 - INTEGER(IntKi), PARAMETER :: M17N7TDyss = 11734 - INTEGER(IntKi), PARAMETER :: M17N8TDyss = 11735 - INTEGER(IntKi), PARAMETER :: M17N9TDyss = 11736 - INTEGER(IntKi), PARAMETER :: M18N1TDyss = 11737 - INTEGER(IntKi), PARAMETER :: M18N2TDyss = 11738 - INTEGER(IntKi), PARAMETER :: M18N3TDyss = 11739 - INTEGER(IntKi), PARAMETER :: M18N4TDyss = 11740 - INTEGER(IntKi), PARAMETER :: M18N5TDyss = 11741 - INTEGER(IntKi), PARAMETER :: M18N6TDyss = 11742 - INTEGER(IntKi), PARAMETER :: M18N7TDyss = 11743 - INTEGER(IntKi), PARAMETER :: M18N8TDyss = 11744 - INTEGER(IntKi), PARAMETER :: M18N9TDyss = 11745 - INTEGER(IntKi), PARAMETER :: M19N1TDyss = 11746 - INTEGER(IntKi), PARAMETER :: M19N2TDyss = 11747 - INTEGER(IntKi), PARAMETER :: M19N3TDyss = 11748 - INTEGER(IntKi), PARAMETER :: M19N4TDyss = 11749 - INTEGER(IntKi), PARAMETER :: M19N5TDyss = 11750 - INTEGER(IntKi), PARAMETER :: M19N6TDyss = 11751 - INTEGER(IntKi), PARAMETER :: M19N7TDyss = 11752 - INTEGER(IntKi), PARAMETER :: M19N8TDyss = 11753 - INTEGER(IntKi), PARAMETER :: M19N9TDyss = 11754 - INTEGER(IntKi), PARAMETER :: M20N1TDyss = 11755 - INTEGER(IntKi), PARAMETER :: M20N2TDyss = 11756 - INTEGER(IntKi), PARAMETER :: M20N3TDyss = 11757 - INTEGER(IntKi), PARAMETER :: M20N4TDyss = 11758 - INTEGER(IntKi), PARAMETER :: M20N5TDyss = 11759 - INTEGER(IntKi), PARAMETER :: M20N6TDyss = 11760 - INTEGER(IntKi), PARAMETER :: M20N7TDyss = 11761 - INTEGER(IntKi), PARAMETER :: M20N8TDyss = 11762 - INTEGER(IntKi), PARAMETER :: M20N9TDyss = 11763 - INTEGER(IntKi), PARAMETER :: M21N1TDyss = 11764 - INTEGER(IntKi), PARAMETER :: M21N2TDyss = 11765 - INTEGER(IntKi), PARAMETER :: M21N3TDyss = 11766 - INTEGER(IntKi), PARAMETER :: M21N4TDyss = 11767 - INTEGER(IntKi), PARAMETER :: M21N5TDyss = 11768 - INTEGER(IntKi), PARAMETER :: M21N6TDyss = 11769 - INTEGER(IntKi), PARAMETER :: M21N7TDyss = 11770 - INTEGER(IntKi), PARAMETER :: M21N8TDyss = 11771 - INTEGER(IntKi), PARAMETER :: M21N9TDyss = 11772 - INTEGER(IntKi), PARAMETER :: M22N1TDyss = 11773 - INTEGER(IntKi), PARAMETER :: M22N2TDyss = 11774 - INTEGER(IntKi), PARAMETER :: M22N3TDyss = 11775 - INTEGER(IntKi), PARAMETER :: M22N4TDyss = 11776 - INTEGER(IntKi), PARAMETER :: M22N5TDyss = 11777 - INTEGER(IntKi), PARAMETER :: M22N6TDyss = 11778 - INTEGER(IntKi), PARAMETER :: M22N7TDyss = 11779 - INTEGER(IntKi), PARAMETER :: M22N8TDyss = 11780 - INTEGER(IntKi), PARAMETER :: M22N9TDyss = 11781 - INTEGER(IntKi), PARAMETER :: M23N1TDyss = 11782 - INTEGER(IntKi), PARAMETER :: M23N2TDyss = 11783 - INTEGER(IntKi), PARAMETER :: M23N3TDyss = 11784 - INTEGER(IntKi), PARAMETER :: M23N4TDyss = 11785 - INTEGER(IntKi), PARAMETER :: M23N5TDyss = 11786 - INTEGER(IntKi), PARAMETER :: M23N6TDyss = 11787 - INTEGER(IntKi), PARAMETER :: M23N7TDyss = 11788 - INTEGER(IntKi), PARAMETER :: M23N8TDyss = 11789 - INTEGER(IntKi), PARAMETER :: M23N9TDyss = 11790 - INTEGER(IntKi), PARAMETER :: M24N1TDyss = 11791 - INTEGER(IntKi), PARAMETER :: M24N2TDyss = 11792 - INTEGER(IntKi), PARAMETER :: M24N3TDyss = 11793 - INTEGER(IntKi), PARAMETER :: M24N4TDyss = 11794 - INTEGER(IntKi), PARAMETER :: M24N5TDyss = 11795 - INTEGER(IntKi), PARAMETER :: M24N6TDyss = 11796 - INTEGER(IntKi), PARAMETER :: M24N7TDyss = 11797 - INTEGER(IntKi), PARAMETER :: M24N8TDyss = 11798 - INTEGER(IntKi), PARAMETER :: M24N9TDyss = 11799 - INTEGER(IntKi), PARAMETER :: M25N1TDyss = 11800 - INTEGER(IntKi), PARAMETER :: M25N2TDyss = 11801 - INTEGER(IntKi), PARAMETER :: M25N3TDyss = 11802 - INTEGER(IntKi), PARAMETER :: M25N4TDyss = 11803 - INTEGER(IntKi), PARAMETER :: M25N5TDyss = 11804 - INTEGER(IntKi), PARAMETER :: M25N6TDyss = 11805 - INTEGER(IntKi), PARAMETER :: M25N7TDyss = 11806 - INTEGER(IntKi), PARAMETER :: M25N8TDyss = 11807 - INTEGER(IntKi), PARAMETER :: M25N9TDyss = 11808 - INTEGER(IntKi), PARAMETER :: M26N1TDyss = 11809 - INTEGER(IntKi), PARAMETER :: M26N2TDyss = 11810 - INTEGER(IntKi), PARAMETER :: M26N3TDyss = 11811 - INTEGER(IntKi), PARAMETER :: M26N4TDyss = 11812 - INTEGER(IntKi), PARAMETER :: M26N5TDyss = 11813 - INTEGER(IntKi), PARAMETER :: M26N6TDyss = 11814 - INTEGER(IntKi), PARAMETER :: M26N7TDyss = 11815 - INTEGER(IntKi), PARAMETER :: M26N8TDyss = 11816 - INTEGER(IntKi), PARAMETER :: M26N9TDyss = 11817 - INTEGER(IntKi), PARAMETER :: M27N1TDyss = 11818 - INTEGER(IntKi), PARAMETER :: M27N2TDyss = 11819 - INTEGER(IntKi), PARAMETER :: M27N3TDyss = 11820 - INTEGER(IntKi), PARAMETER :: M27N4TDyss = 11821 - INTEGER(IntKi), PARAMETER :: M27N5TDyss = 11822 - INTEGER(IntKi), PARAMETER :: M27N6TDyss = 11823 - INTEGER(IntKi), PARAMETER :: M27N7TDyss = 11824 - INTEGER(IntKi), PARAMETER :: M27N8TDyss = 11825 - INTEGER(IntKi), PARAMETER :: M27N9TDyss = 11826 - INTEGER(IntKi), PARAMETER :: M28N1TDyss = 11827 - INTEGER(IntKi), PARAMETER :: M28N2TDyss = 11828 - INTEGER(IntKi), PARAMETER :: M28N3TDyss = 11829 - INTEGER(IntKi), PARAMETER :: M28N4TDyss = 11830 - INTEGER(IntKi), PARAMETER :: M28N5TDyss = 11831 - INTEGER(IntKi), PARAMETER :: M28N6TDyss = 11832 - INTEGER(IntKi), PARAMETER :: M28N7TDyss = 11833 - INTEGER(IntKi), PARAMETER :: M28N8TDyss = 11834 - INTEGER(IntKi), PARAMETER :: M28N9TDyss = 11835 - INTEGER(IntKi), PARAMETER :: M29N1TDyss = 11836 - INTEGER(IntKi), PARAMETER :: M29N2TDyss = 11837 - INTEGER(IntKi), PARAMETER :: M29N3TDyss = 11838 - INTEGER(IntKi), PARAMETER :: M29N4TDyss = 11839 - INTEGER(IntKi), PARAMETER :: M29N5TDyss = 11840 - INTEGER(IntKi), PARAMETER :: M29N6TDyss = 11841 - INTEGER(IntKi), PARAMETER :: M29N7TDyss = 11842 - INTEGER(IntKi), PARAMETER :: M29N8TDyss = 11843 - INTEGER(IntKi), PARAMETER :: M29N9TDyss = 11844 - INTEGER(IntKi), PARAMETER :: M30N1TDyss = 11845 - INTEGER(IntKi), PARAMETER :: M30N2TDyss = 11846 - INTEGER(IntKi), PARAMETER :: M30N3TDyss = 11847 - INTEGER(IntKi), PARAMETER :: M30N4TDyss = 11848 - INTEGER(IntKi), PARAMETER :: M30N5TDyss = 11849 - INTEGER(IntKi), PARAMETER :: M30N6TDyss = 11850 - INTEGER(IntKi), PARAMETER :: M30N7TDyss = 11851 - INTEGER(IntKi), PARAMETER :: M30N8TDyss = 11852 - INTEGER(IntKi), PARAMETER :: M30N9TDyss = 11853 - INTEGER(IntKi), PARAMETER :: M31N1TDyss = 11854 - INTEGER(IntKi), PARAMETER :: M31N2TDyss = 11855 - INTEGER(IntKi), PARAMETER :: M31N3TDyss = 11856 - INTEGER(IntKi), PARAMETER :: M31N4TDyss = 11857 - INTEGER(IntKi), PARAMETER :: M31N5TDyss = 11858 - INTEGER(IntKi), PARAMETER :: M31N6TDyss = 11859 - INTEGER(IntKi), PARAMETER :: M31N7TDyss = 11860 - INTEGER(IntKi), PARAMETER :: M31N8TDyss = 11861 - INTEGER(IntKi), PARAMETER :: M31N9TDyss = 11862 - INTEGER(IntKi), PARAMETER :: M32N1TDyss = 11863 - INTEGER(IntKi), PARAMETER :: M32N2TDyss = 11864 - INTEGER(IntKi), PARAMETER :: M32N3TDyss = 11865 - INTEGER(IntKi), PARAMETER :: M32N4TDyss = 11866 - INTEGER(IntKi), PARAMETER :: M32N5TDyss = 11867 - INTEGER(IntKi), PARAMETER :: M32N6TDyss = 11868 - INTEGER(IntKi), PARAMETER :: M32N7TDyss = 11869 - INTEGER(IntKi), PARAMETER :: M32N8TDyss = 11870 - INTEGER(IntKi), PARAMETER :: M32N9TDyss = 11871 - INTEGER(IntKi), PARAMETER :: M33N1TDyss = 11872 - INTEGER(IntKi), PARAMETER :: M33N2TDyss = 11873 - INTEGER(IntKi), PARAMETER :: M33N3TDyss = 11874 - INTEGER(IntKi), PARAMETER :: M33N4TDyss = 11875 - INTEGER(IntKi), PARAMETER :: M33N5TDyss = 11876 - INTEGER(IntKi), PARAMETER :: M33N6TDyss = 11877 - INTEGER(IntKi), PARAMETER :: M33N7TDyss = 11878 - INTEGER(IntKi), PARAMETER :: M33N8TDyss = 11879 - INTEGER(IntKi), PARAMETER :: M33N9TDyss = 11880 - INTEGER(IntKi), PARAMETER :: M34N1TDyss = 11881 - INTEGER(IntKi), PARAMETER :: M34N2TDyss = 11882 - INTEGER(IntKi), PARAMETER :: M34N3TDyss = 11883 - INTEGER(IntKi), PARAMETER :: M34N4TDyss = 11884 - INTEGER(IntKi), PARAMETER :: M34N5TDyss = 11885 - INTEGER(IntKi), PARAMETER :: M34N6TDyss = 11886 - INTEGER(IntKi), PARAMETER :: M34N7TDyss = 11887 - INTEGER(IntKi), PARAMETER :: M34N8TDyss = 11888 - INTEGER(IntKi), PARAMETER :: M34N9TDyss = 11889 - INTEGER(IntKi), PARAMETER :: M35N1TDyss = 11890 - INTEGER(IntKi), PARAMETER :: M35N2TDyss = 11891 - INTEGER(IntKi), PARAMETER :: M35N3TDyss = 11892 - INTEGER(IntKi), PARAMETER :: M35N4TDyss = 11893 - INTEGER(IntKi), PARAMETER :: M35N5TDyss = 11894 - INTEGER(IntKi), PARAMETER :: M35N6TDyss = 11895 - INTEGER(IntKi), PARAMETER :: M35N7TDyss = 11896 - INTEGER(IntKi), PARAMETER :: M35N8TDyss = 11897 - INTEGER(IntKi), PARAMETER :: M35N9TDyss = 11898 - INTEGER(IntKi), PARAMETER :: M36N1TDyss = 11899 - INTEGER(IntKi), PARAMETER :: M36N2TDyss = 11900 - INTEGER(IntKi), PARAMETER :: M36N3TDyss = 11901 - INTEGER(IntKi), PARAMETER :: M36N4TDyss = 11902 - INTEGER(IntKi), PARAMETER :: M36N5TDyss = 11903 - INTEGER(IntKi), PARAMETER :: M36N6TDyss = 11904 - INTEGER(IntKi), PARAMETER :: M36N7TDyss = 11905 - INTEGER(IntKi), PARAMETER :: M36N8TDyss = 11906 - INTEGER(IntKi), PARAMETER :: M36N9TDyss = 11907 - INTEGER(IntKi), PARAMETER :: M37N1TDyss = 11908 - INTEGER(IntKi), PARAMETER :: M37N2TDyss = 11909 - INTEGER(IntKi), PARAMETER :: M37N3TDyss = 11910 - INTEGER(IntKi), PARAMETER :: M37N4TDyss = 11911 - INTEGER(IntKi), PARAMETER :: M37N5TDyss = 11912 - INTEGER(IntKi), PARAMETER :: M37N6TDyss = 11913 - INTEGER(IntKi), PARAMETER :: M37N7TDyss = 11914 - INTEGER(IntKi), PARAMETER :: M37N8TDyss = 11915 - INTEGER(IntKi), PARAMETER :: M37N9TDyss = 11916 - INTEGER(IntKi), PARAMETER :: M38N1TDyss = 11917 - INTEGER(IntKi), PARAMETER :: M38N2TDyss = 11918 - INTEGER(IntKi), PARAMETER :: M38N3TDyss = 11919 - INTEGER(IntKi), PARAMETER :: M38N4TDyss = 11920 - INTEGER(IntKi), PARAMETER :: M38N5TDyss = 11921 - INTEGER(IntKi), PARAMETER :: M38N6TDyss = 11922 - INTEGER(IntKi), PARAMETER :: M38N7TDyss = 11923 - INTEGER(IntKi), PARAMETER :: M38N8TDyss = 11924 - INTEGER(IntKi), PARAMETER :: M38N9TDyss = 11925 - INTEGER(IntKi), PARAMETER :: M39N1TDyss = 11926 - INTEGER(IntKi), PARAMETER :: M39N2TDyss = 11927 - INTEGER(IntKi), PARAMETER :: M39N3TDyss = 11928 - INTEGER(IntKi), PARAMETER :: M39N4TDyss = 11929 - INTEGER(IntKi), PARAMETER :: M39N5TDyss = 11930 - INTEGER(IntKi), PARAMETER :: M39N6TDyss = 11931 - INTEGER(IntKi), PARAMETER :: M39N7TDyss = 11932 - INTEGER(IntKi), PARAMETER :: M39N8TDyss = 11933 - INTEGER(IntKi), PARAMETER :: M39N9TDyss = 11934 - INTEGER(IntKi), PARAMETER :: M40N1TDyss = 11935 - INTEGER(IntKi), PARAMETER :: M40N2TDyss = 11936 - INTEGER(IntKi), PARAMETER :: M40N3TDyss = 11937 - INTEGER(IntKi), PARAMETER :: M40N4TDyss = 11938 - INTEGER(IntKi), PARAMETER :: M40N5TDyss = 11939 - INTEGER(IntKi), PARAMETER :: M40N6TDyss = 11940 - INTEGER(IntKi), PARAMETER :: M40N7TDyss = 11941 - INTEGER(IntKi), PARAMETER :: M40N8TDyss = 11942 - INTEGER(IntKi), PARAMETER :: M40N9TDyss = 11943 - INTEGER(IntKi), PARAMETER :: M41N1TDyss = 11944 - INTEGER(IntKi), PARAMETER :: M41N2TDyss = 11945 - INTEGER(IntKi), PARAMETER :: M41N3TDyss = 11946 - INTEGER(IntKi), PARAMETER :: M41N4TDyss = 11947 - INTEGER(IntKi), PARAMETER :: M41N5TDyss = 11948 - INTEGER(IntKi), PARAMETER :: M41N6TDyss = 11949 - INTEGER(IntKi), PARAMETER :: M41N7TDyss = 11950 - INTEGER(IntKi), PARAMETER :: M41N8TDyss = 11951 - INTEGER(IntKi), PARAMETER :: M41N9TDyss = 11952 - INTEGER(IntKi), PARAMETER :: M42N1TDyss = 11953 - INTEGER(IntKi), PARAMETER :: M42N2TDyss = 11954 - INTEGER(IntKi), PARAMETER :: M42N3TDyss = 11955 - INTEGER(IntKi), PARAMETER :: M42N4TDyss = 11956 - INTEGER(IntKi), PARAMETER :: M42N5TDyss = 11957 - INTEGER(IntKi), PARAMETER :: M42N6TDyss = 11958 - INTEGER(IntKi), PARAMETER :: M42N7TDyss = 11959 - INTEGER(IntKi), PARAMETER :: M42N8TDyss = 11960 - INTEGER(IntKi), PARAMETER :: M42N9TDyss = 11961 - INTEGER(IntKi), PARAMETER :: M43N1TDyss = 11962 - INTEGER(IntKi), PARAMETER :: M43N2TDyss = 11963 - INTEGER(IntKi), PARAMETER :: M43N3TDyss = 11964 - INTEGER(IntKi), PARAMETER :: M43N4TDyss = 11965 - INTEGER(IntKi), PARAMETER :: M43N5TDyss = 11966 - INTEGER(IntKi), PARAMETER :: M43N6TDyss = 11967 - INTEGER(IntKi), PARAMETER :: M43N7TDyss = 11968 - INTEGER(IntKi), PARAMETER :: M43N8TDyss = 11969 - INTEGER(IntKi), PARAMETER :: M43N9TDyss = 11970 - INTEGER(IntKi), PARAMETER :: M44N1TDyss = 11971 - INTEGER(IntKi), PARAMETER :: M44N2TDyss = 11972 - INTEGER(IntKi), PARAMETER :: M44N3TDyss = 11973 - INTEGER(IntKi), PARAMETER :: M44N4TDyss = 11974 - INTEGER(IntKi), PARAMETER :: M44N5TDyss = 11975 - INTEGER(IntKi), PARAMETER :: M44N6TDyss = 11976 - INTEGER(IntKi), PARAMETER :: M44N7TDyss = 11977 - INTEGER(IntKi), PARAMETER :: M44N8TDyss = 11978 - INTEGER(IntKi), PARAMETER :: M44N9TDyss = 11979 - INTEGER(IntKi), PARAMETER :: M45N1TDyss = 11980 - INTEGER(IntKi), PARAMETER :: M45N2TDyss = 11981 - INTEGER(IntKi), PARAMETER :: M45N3TDyss = 11982 - INTEGER(IntKi), PARAMETER :: M45N4TDyss = 11983 - INTEGER(IntKi), PARAMETER :: M45N5TDyss = 11984 - INTEGER(IntKi), PARAMETER :: M45N6TDyss = 11985 - INTEGER(IntKi), PARAMETER :: M45N7TDyss = 11986 - INTEGER(IntKi), PARAMETER :: M45N8TDyss = 11987 - INTEGER(IntKi), PARAMETER :: M45N9TDyss = 11988 - INTEGER(IntKi), PARAMETER :: M46N1TDyss = 11989 - INTEGER(IntKi), PARAMETER :: M46N2TDyss = 11990 - INTEGER(IntKi), PARAMETER :: M46N3TDyss = 11991 - INTEGER(IntKi), PARAMETER :: M46N4TDyss = 11992 - INTEGER(IntKi), PARAMETER :: M46N5TDyss = 11993 - INTEGER(IntKi), PARAMETER :: M46N6TDyss = 11994 - INTEGER(IntKi), PARAMETER :: M46N7TDyss = 11995 - INTEGER(IntKi), PARAMETER :: M46N8TDyss = 11996 - INTEGER(IntKi), PARAMETER :: M46N9TDyss = 11997 - INTEGER(IntKi), PARAMETER :: M47N1TDyss = 11998 - INTEGER(IntKi), PARAMETER :: M47N2TDyss = 11999 - INTEGER(IntKi), PARAMETER :: M47N3TDyss = 12000 - INTEGER(IntKi), PARAMETER :: M47N4TDyss = 12001 - INTEGER(IntKi), PARAMETER :: M47N5TDyss = 12002 - INTEGER(IntKi), PARAMETER :: M47N6TDyss = 12003 - INTEGER(IntKi), PARAMETER :: M47N7TDyss = 12004 - INTEGER(IntKi), PARAMETER :: M47N8TDyss = 12005 - INTEGER(IntKi), PARAMETER :: M47N9TDyss = 12006 - INTEGER(IntKi), PARAMETER :: M48N1TDyss = 12007 - INTEGER(IntKi), PARAMETER :: M48N2TDyss = 12008 - INTEGER(IntKi), PARAMETER :: M48N3TDyss = 12009 - INTEGER(IntKi), PARAMETER :: M48N4TDyss = 12010 - INTEGER(IntKi), PARAMETER :: M48N5TDyss = 12011 - INTEGER(IntKi), PARAMETER :: M48N6TDyss = 12012 - INTEGER(IntKi), PARAMETER :: M48N7TDyss = 12013 - INTEGER(IntKi), PARAMETER :: M48N8TDyss = 12014 - INTEGER(IntKi), PARAMETER :: M48N9TDyss = 12015 - INTEGER(IntKi), PARAMETER :: M49N1TDyss = 12016 - INTEGER(IntKi), PARAMETER :: M49N2TDyss = 12017 - INTEGER(IntKi), PARAMETER :: M49N3TDyss = 12018 - INTEGER(IntKi), PARAMETER :: M49N4TDyss = 12019 - INTEGER(IntKi), PARAMETER :: M49N5TDyss = 12020 - INTEGER(IntKi), PARAMETER :: M49N6TDyss = 12021 - INTEGER(IntKi), PARAMETER :: M49N7TDyss = 12022 - INTEGER(IntKi), PARAMETER :: M49N8TDyss = 12023 - INTEGER(IntKi), PARAMETER :: M49N9TDyss = 12024 - INTEGER(IntKi), PARAMETER :: M50N1TDyss = 12025 - INTEGER(IntKi), PARAMETER :: M50N2TDyss = 12026 - INTEGER(IntKi), PARAMETER :: M50N3TDyss = 12027 - INTEGER(IntKi), PARAMETER :: M50N4TDyss = 12028 - INTEGER(IntKi), PARAMETER :: M50N5TDyss = 12029 - INTEGER(IntKi), PARAMETER :: M50N6TDyss = 12030 - INTEGER(IntKi), PARAMETER :: M50N7TDyss = 12031 - INTEGER(IntKi), PARAMETER :: M50N8TDyss = 12032 - INTEGER(IntKi), PARAMETER :: M50N9TDyss = 12033 - INTEGER(IntKi), PARAMETER :: M51N1TDyss = 12034 - INTEGER(IntKi), PARAMETER :: M51N2TDyss = 12035 - INTEGER(IntKi), PARAMETER :: M51N3TDyss = 12036 - INTEGER(IntKi), PARAMETER :: M51N4TDyss = 12037 - INTEGER(IntKi), PARAMETER :: M51N5TDyss = 12038 - INTEGER(IntKi), PARAMETER :: M51N6TDyss = 12039 - INTEGER(IntKi), PARAMETER :: M51N7TDyss = 12040 - INTEGER(IntKi), PARAMETER :: M51N8TDyss = 12041 - INTEGER(IntKi), PARAMETER :: M51N9TDyss = 12042 - INTEGER(IntKi), PARAMETER :: M52N1TDyss = 12043 - INTEGER(IntKi), PARAMETER :: M52N2TDyss = 12044 - INTEGER(IntKi), PARAMETER :: M52N3TDyss = 12045 - INTEGER(IntKi), PARAMETER :: M52N4TDyss = 12046 - INTEGER(IntKi), PARAMETER :: M52N5TDyss = 12047 - INTEGER(IntKi), PARAMETER :: M52N6TDyss = 12048 - INTEGER(IntKi), PARAMETER :: M52N7TDyss = 12049 - INTEGER(IntKi), PARAMETER :: M52N8TDyss = 12050 - INTEGER(IntKi), PARAMETER :: M52N9TDyss = 12051 - INTEGER(IntKi), PARAMETER :: M53N1TDyss = 12052 - INTEGER(IntKi), PARAMETER :: M53N2TDyss = 12053 - INTEGER(IntKi), PARAMETER :: M53N3TDyss = 12054 - INTEGER(IntKi), PARAMETER :: M53N4TDyss = 12055 - INTEGER(IntKi), PARAMETER :: M53N5TDyss = 12056 - INTEGER(IntKi), PARAMETER :: M53N6TDyss = 12057 - INTEGER(IntKi), PARAMETER :: M53N7TDyss = 12058 - INTEGER(IntKi), PARAMETER :: M53N8TDyss = 12059 - INTEGER(IntKi), PARAMETER :: M53N9TDyss = 12060 - INTEGER(IntKi), PARAMETER :: M54N1TDyss = 12061 - INTEGER(IntKi), PARAMETER :: M54N2TDyss = 12062 - INTEGER(IntKi), PARAMETER :: M54N3TDyss = 12063 - INTEGER(IntKi), PARAMETER :: M54N4TDyss = 12064 - INTEGER(IntKi), PARAMETER :: M54N5TDyss = 12065 - INTEGER(IntKi), PARAMETER :: M54N6TDyss = 12066 - INTEGER(IntKi), PARAMETER :: M54N7TDyss = 12067 - INTEGER(IntKi), PARAMETER :: M54N8TDyss = 12068 - INTEGER(IntKi), PARAMETER :: M54N9TDyss = 12069 - INTEGER(IntKi), PARAMETER :: M55N1TDyss = 12070 - INTEGER(IntKi), PARAMETER :: M55N2TDyss = 12071 - INTEGER(IntKi), PARAMETER :: M55N3TDyss = 12072 - INTEGER(IntKi), PARAMETER :: M55N4TDyss = 12073 - INTEGER(IntKi), PARAMETER :: M55N5TDyss = 12074 - INTEGER(IntKi), PARAMETER :: M55N6TDyss = 12075 - INTEGER(IntKi), PARAMETER :: M55N7TDyss = 12076 - INTEGER(IntKi), PARAMETER :: M55N8TDyss = 12077 - INTEGER(IntKi), PARAMETER :: M55N9TDyss = 12078 - INTEGER(IntKi), PARAMETER :: M56N1TDyss = 12079 - INTEGER(IntKi), PARAMETER :: M56N2TDyss = 12080 - INTEGER(IntKi), PARAMETER :: M56N3TDyss = 12081 - INTEGER(IntKi), PARAMETER :: M56N4TDyss = 12082 - INTEGER(IntKi), PARAMETER :: M56N5TDyss = 12083 - INTEGER(IntKi), PARAMETER :: M56N6TDyss = 12084 - INTEGER(IntKi), PARAMETER :: M56N7TDyss = 12085 - INTEGER(IntKi), PARAMETER :: M56N8TDyss = 12086 - INTEGER(IntKi), PARAMETER :: M56N9TDyss = 12087 - INTEGER(IntKi), PARAMETER :: M57N1TDyss = 12088 - INTEGER(IntKi), PARAMETER :: M57N2TDyss = 12089 - INTEGER(IntKi), PARAMETER :: M57N3TDyss = 12090 - INTEGER(IntKi), PARAMETER :: M57N4TDyss = 12091 - INTEGER(IntKi), PARAMETER :: M57N5TDyss = 12092 - INTEGER(IntKi), PARAMETER :: M57N6TDyss = 12093 - INTEGER(IntKi), PARAMETER :: M57N7TDyss = 12094 - INTEGER(IntKi), PARAMETER :: M57N8TDyss = 12095 - INTEGER(IntKi), PARAMETER :: M57N9TDyss = 12096 - INTEGER(IntKi), PARAMETER :: M58N1TDyss = 12097 - INTEGER(IntKi), PARAMETER :: M58N2TDyss = 12098 - INTEGER(IntKi), PARAMETER :: M58N3TDyss = 12099 - INTEGER(IntKi), PARAMETER :: M58N4TDyss = 12100 - INTEGER(IntKi), PARAMETER :: M58N5TDyss = 12101 - INTEGER(IntKi), PARAMETER :: M58N6TDyss = 12102 - INTEGER(IntKi), PARAMETER :: M58N7TDyss = 12103 - INTEGER(IntKi), PARAMETER :: M58N8TDyss = 12104 - INTEGER(IntKi), PARAMETER :: M58N9TDyss = 12105 - INTEGER(IntKi), PARAMETER :: M59N1TDyss = 12106 - INTEGER(IntKi), PARAMETER :: M59N2TDyss = 12107 - INTEGER(IntKi), PARAMETER :: M59N3TDyss = 12108 - INTEGER(IntKi), PARAMETER :: M59N4TDyss = 12109 - INTEGER(IntKi), PARAMETER :: M59N5TDyss = 12110 - INTEGER(IntKi), PARAMETER :: M59N6TDyss = 12111 - INTEGER(IntKi), PARAMETER :: M59N7TDyss = 12112 - INTEGER(IntKi), PARAMETER :: M59N8TDyss = 12113 - INTEGER(IntKi), PARAMETER :: M59N9TDyss = 12114 - INTEGER(IntKi), PARAMETER :: M60N1TDyss = 12115 - INTEGER(IntKi), PARAMETER :: M60N2TDyss = 12116 - INTEGER(IntKi), PARAMETER :: M60N3TDyss = 12117 - INTEGER(IntKi), PARAMETER :: M60N4TDyss = 12118 - INTEGER(IntKi), PARAMETER :: M60N5TDyss = 12119 - INTEGER(IntKi), PARAMETER :: M60N6TDyss = 12120 - INTEGER(IntKi), PARAMETER :: M60N7TDyss = 12121 - INTEGER(IntKi), PARAMETER :: M60N8TDyss = 12122 - INTEGER(IntKi), PARAMETER :: M60N9TDyss = 12123 - INTEGER(IntKi), PARAMETER :: M61N1TDyss = 12124 - INTEGER(IntKi), PARAMETER :: M61N2TDyss = 12125 - INTEGER(IntKi), PARAMETER :: M61N3TDyss = 12126 - INTEGER(IntKi), PARAMETER :: M61N4TDyss = 12127 - INTEGER(IntKi), PARAMETER :: M61N5TDyss = 12128 - INTEGER(IntKi), PARAMETER :: M61N6TDyss = 12129 - INTEGER(IntKi), PARAMETER :: M61N7TDyss = 12130 - INTEGER(IntKi), PARAMETER :: M61N8TDyss = 12131 - INTEGER(IntKi), PARAMETER :: M61N9TDyss = 12132 - INTEGER(IntKi), PARAMETER :: M62N1TDyss = 12133 - INTEGER(IntKi), PARAMETER :: M62N2TDyss = 12134 - INTEGER(IntKi), PARAMETER :: M62N3TDyss = 12135 - INTEGER(IntKi), PARAMETER :: M62N4TDyss = 12136 - INTEGER(IntKi), PARAMETER :: M62N5TDyss = 12137 - INTEGER(IntKi), PARAMETER :: M62N6TDyss = 12138 - INTEGER(IntKi), PARAMETER :: M62N7TDyss = 12139 - INTEGER(IntKi), PARAMETER :: M62N8TDyss = 12140 - INTEGER(IntKi), PARAMETER :: M62N9TDyss = 12141 - INTEGER(IntKi), PARAMETER :: M63N1TDyss = 12142 - INTEGER(IntKi), PARAMETER :: M63N2TDyss = 12143 - INTEGER(IntKi), PARAMETER :: M63N3TDyss = 12144 - INTEGER(IntKi), PARAMETER :: M63N4TDyss = 12145 - INTEGER(IntKi), PARAMETER :: M63N5TDyss = 12146 - INTEGER(IntKi), PARAMETER :: M63N6TDyss = 12147 - INTEGER(IntKi), PARAMETER :: M63N7TDyss = 12148 - INTEGER(IntKi), PARAMETER :: M63N8TDyss = 12149 - INTEGER(IntKi), PARAMETER :: M63N9TDyss = 12150 - INTEGER(IntKi), PARAMETER :: M64N1TDyss = 12151 - INTEGER(IntKi), PARAMETER :: M64N2TDyss = 12152 - INTEGER(IntKi), PARAMETER :: M64N3TDyss = 12153 - INTEGER(IntKi), PARAMETER :: M64N4TDyss = 12154 - INTEGER(IntKi), PARAMETER :: M64N5TDyss = 12155 - INTEGER(IntKi), PARAMETER :: M64N6TDyss = 12156 - INTEGER(IntKi), PARAMETER :: M64N7TDyss = 12157 - INTEGER(IntKi), PARAMETER :: M64N8TDyss = 12158 - INTEGER(IntKi), PARAMETER :: M64N9TDyss = 12159 - INTEGER(IntKi), PARAMETER :: M65N1TDyss = 12160 - INTEGER(IntKi), PARAMETER :: M65N2TDyss = 12161 - INTEGER(IntKi), PARAMETER :: M65N3TDyss = 12162 - INTEGER(IntKi), PARAMETER :: M65N4TDyss = 12163 - INTEGER(IntKi), PARAMETER :: M65N5TDyss = 12164 - INTEGER(IntKi), PARAMETER :: M65N6TDyss = 12165 - INTEGER(IntKi), PARAMETER :: M65N7TDyss = 12166 - INTEGER(IntKi), PARAMETER :: M65N8TDyss = 12167 - INTEGER(IntKi), PARAMETER :: M65N9TDyss = 12168 - INTEGER(IntKi), PARAMETER :: M66N1TDyss = 12169 - INTEGER(IntKi), PARAMETER :: M66N2TDyss = 12170 - INTEGER(IntKi), PARAMETER :: M66N3TDyss = 12171 - INTEGER(IntKi), PARAMETER :: M66N4TDyss = 12172 - INTEGER(IntKi), PARAMETER :: M66N5TDyss = 12173 - INTEGER(IntKi), PARAMETER :: M66N6TDyss = 12174 - INTEGER(IntKi), PARAMETER :: M66N7TDyss = 12175 - INTEGER(IntKi), PARAMETER :: M66N8TDyss = 12176 - INTEGER(IntKi), PARAMETER :: M66N9TDyss = 12177 - INTEGER(IntKi), PARAMETER :: M67N1TDyss = 12178 - INTEGER(IntKi), PARAMETER :: M67N2TDyss = 12179 - INTEGER(IntKi), PARAMETER :: M67N3TDyss = 12180 - INTEGER(IntKi), PARAMETER :: M67N4TDyss = 12181 - INTEGER(IntKi), PARAMETER :: M67N5TDyss = 12182 - INTEGER(IntKi), PARAMETER :: M67N6TDyss = 12183 - INTEGER(IntKi), PARAMETER :: M67N7TDyss = 12184 - INTEGER(IntKi), PARAMETER :: M67N8TDyss = 12185 - INTEGER(IntKi), PARAMETER :: M67N9TDyss = 12186 - INTEGER(IntKi), PARAMETER :: M68N1TDyss = 12187 - INTEGER(IntKi), PARAMETER :: M68N2TDyss = 12188 - INTEGER(IntKi), PARAMETER :: M68N3TDyss = 12189 - INTEGER(IntKi), PARAMETER :: M68N4TDyss = 12190 - INTEGER(IntKi), PARAMETER :: M68N5TDyss = 12191 - INTEGER(IntKi), PARAMETER :: M68N6TDyss = 12192 - INTEGER(IntKi), PARAMETER :: M68N7TDyss = 12193 - INTEGER(IntKi), PARAMETER :: M68N8TDyss = 12194 - INTEGER(IntKi), PARAMETER :: M68N9TDyss = 12195 - INTEGER(IntKi), PARAMETER :: M69N1TDyss = 12196 - INTEGER(IntKi), PARAMETER :: M69N2TDyss = 12197 - INTEGER(IntKi), PARAMETER :: M69N3TDyss = 12198 - INTEGER(IntKi), PARAMETER :: M69N4TDyss = 12199 - INTEGER(IntKi), PARAMETER :: M69N5TDyss = 12200 - INTEGER(IntKi), PARAMETER :: M69N6TDyss = 12201 - INTEGER(IntKi), PARAMETER :: M69N7TDyss = 12202 - INTEGER(IntKi), PARAMETER :: M69N8TDyss = 12203 - INTEGER(IntKi), PARAMETER :: M69N9TDyss = 12204 - INTEGER(IntKi), PARAMETER :: M70N1TDyss = 12205 - INTEGER(IntKi), PARAMETER :: M70N2TDyss = 12206 - INTEGER(IntKi), PARAMETER :: M70N3TDyss = 12207 - INTEGER(IntKi), PARAMETER :: M70N4TDyss = 12208 - INTEGER(IntKi), PARAMETER :: M70N5TDyss = 12209 - INTEGER(IntKi), PARAMETER :: M70N6TDyss = 12210 - INTEGER(IntKi), PARAMETER :: M70N7TDyss = 12211 - INTEGER(IntKi), PARAMETER :: M70N8TDyss = 12212 - INTEGER(IntKi), PARAMETER :: M70N9TDyss = 12213 - INTEGER(IntKi), PARAMETER :: M71N1TDyss = 12214 - INTEGER(IntKi), PARAMETER :: M71N2TDyss = 12215 - INTEGER(IntKi), PARAMETER :: M71N3TDyss = 12216 - INTEGER(IntKi), PARAMETER :: M71N4TDyss = 12217 - INTEGER(IntKi), PARAMETER :: M71N5TDyss = 12218 - INTEGER(IntKi), PARAMETER :: M71N6TDyss = 12219 - INTEGER(IntKi), PARAMETER :: M71N7TDyss = 12220 - INTEGER(IntKi), PARAMETER :: M71N8TDyss = 12221 - INTEGER(IntKi), PARAMETER :: M71N9TDyss = 12222 - INTEGER(IntKi), PARAMETER :: M72N1TDyss = 12223 - INTEGER(IntKi), PARAMETER :: M72N2TDyss = 12224 - INTEGER(IntKi), PARAMETER :: M72N3TDyss = 12225 - INTEGER(IntKi), PARAMETER :: M72N4TDyss = 12226 - INTEGER(IntKi), PARAMETER :: M72N5TDyss = 12227 - INTEGER(IntKi), PARAMETER :: M72N6TDyss = 12228 - INTEGER(IntKi), PARAMETER :: M72N7TDyss = 12229 - INTEGER(IntKi), PARAMETER :: M72N8TDyss = 12230 - INTEGER(IntKi), PARAMETER :: M72N9TDyss = 12231 - INTEGER(IntKi), PARAMETER :: M73N1TDyss = 12232 - INTEGER(IntKi), PARAMETER :: M73N2TDyss = 12233 - INTEGER(IntKi), PARAMETER :: M73N3TDyss = 12234 - INTEGER(IntKi), PARAMETER :: M73N4TDyss = 12235 - INTEGER(IntKi), PARAMETER :: M73N5TDyss = 12236 - INTEGER(IntKi), PARAMETER :: M73N6TDyss = 12237 - INTEGER(IntKi), PARAMETER :: M73N7TDyss = 12238 - INTEGER(IntKi), PARAMETER :: M73N8TDyss = 12239 - INTEGER(IntKi), PARAMETER :: M73N9TDyss = 12240 - INTEGER(IntKi), PARAMETER :: M74N1TDyss = 12241 - INTEGER(IntKi), PARAMETER :: M74N2TDyss = 12242 - INTEGER(IntKi), PARAMETER :: M74N3TDyss = 12243 - INTEGER(IntKi), PARAMETER :: M74N4TDyss = 12244 - INTEGER(IntKi), PARAMETER :: M74N5TDyss = 12245 - INTEGER(IntKi), PARAMETER :: M74N6TDyss = 12246 - INTEGER(IntKi), PARAMETER :: M74N7TDyss = 12247 - INTEGER(IntKi), PARAMETER :: M74N8TDyss = 12248 - INTEGER(IntKi), PARAMETER :: M74N9TDyss = 12249 - INTEGER(IntKi), PARAMETER :: M75N1TDyss = 12250 - INTEGER(IntKi), PARAMETER :: M75N2TDyss = 12251 - INTEGER(IntKi), PARAMETER :: M75N3TDyss = 12252 - INTEGER(IntKi), PARAMETER :: M75N4TDyss = 12253 - INTEGER(IntKi), PARAMETER :: M75N5TDyss = 12254 - INTEGER(IntKi), PARAMETER :: M75N6TDyss = 12255 - INTEGER(IntKi), PARAMETER :: M75N7TDyss = 12256 - INTEGER(IntKi), PARAMETER :: M75N8TDyss = 12257 - INTEGER(IntKi), PARAMETER :: M75N9TDyss = 12258 - INTEGER(IntKi), PARAMETER :: M76N1TDyss = 12259 - INTEGER(IntKi), PARAMETER :: M76N2TDyss = 12260 - INTEGER(IntKi), PARAMETER :: M76N3TDyss = 12261 - INTEGER(IntKi), PARAMETER :: M76N4TDyss = 12262 - INTEGER(IntKi), PARAMETER :: M76N5TDyss = 12263 - INTEGER(IntKi), PARAMETER :: M76N6TDyss = 12264 - INTEGER(IntKi), PARAMETER :: M76N7TDyss = 12265 - INTEGER(IntKi), PARAMETER :: M76N8TDyss = 12266 - INTEGER(IntKi), PARAMETER :: M76N9TDyss = 12267 - INTEGER(IntKi), PARAMETER :: M77N1TDyss = 12268 - INTEGER(IntKi), PARAMETER :: M77N2TDyss = 12269 - INTEGER(IntKi), PARAMETER :: M77N3TDyss = 12270 - INTEGER(IntKi), PARAMETER :: M77N4TDyss = 12271 - INTEGER(IntKi), PARAMETER :: M77N5TDyss = 12272 - INTEGER(IntKi), PARAMETER :: M77N6TDyss = 12273 - INTEGER(IntKi), PARAMETER :: M77N7TDyss = 12274 - INTEGER(IntKi), PARAMETER :: M77N8TDyss = 12275 - INTEGER(IntKi), PARAMETER :: M77N9TDyss = 12276 - INTEGER(IntKi), PARAMETER :: M78N1TDyss = 12277 - INTEGER(IntKi), PARAMETER :: M78N2TDyss = 12278 - INTEGER(IntKi), PARAMETER :: M78N3TDyss = 12279 - INTEGER(IntKi), PARAMETER :: M78N4TDyss = 12280 - INTEGER(IntKi), PARAMETER :: M78N5TDyss = 12281 - INTEGER(IntKi), PARAMETER :: M78N6TDyss = 12282 - INTEGER(IntKi), PARAMETER :: M78N7TDyss = 12283 - INTEGER(IntKi), PARAMETER :: M78N8TDyss = 12284 - INTEGER(IntKi), PARAMETER :: M78N9TDyss = 12285 - INTEGER(IntKi), PARAMETER :: M79N1TDyss = 12286 - INTEGER(IntKi), PARAMETER :: M79N2TDyss = 12287 - INTEGER(IntKi), PARAMETER :: M79N3TDyss = 12288 - INTEGER(IntKi), PARAMETER :: M79N4TDyss = 12289 - INTEGER(IntKi), PARAMETER :: M79N5TDyss = 12290 - INTEGER(IntKi), PARAMETER :: M79N6TDyss = 12291 - INTEGER(IntKi), PARAMETER :: M79N7TDyss = 12292 - INTEGER(IntKi), PARAMETER :: M79N8TDyss = 12293 - INTEGER(IntKi), PARAMETER :: M79N9TDyss = 12294 - INTEGER(IntKi), PARAMETER :: M80N1TDyss = 12295 - INTEGER(IntKi), PARAMETER :: M80N2TDyss = 12296 - INTEGER(IntKi), PARAMETER :: M80N3TDyss = 12297 - INTEGER(IntKi), PARAMETER :: M80N4TDyss = 12298 - INTEGER(IntKi), PARAMETER :: M80N5TDyss = 12299 - INTEGER(IntKi), PARAMETER :: M80N6TDyss = 12300 - INTEGER(IntKi), PARAMETER :: M80N7TDyss = 12301 - INTEGER(IntKi), PARAMETER :: M80N8TDyss = 12302 - INTEGER(IntKi), PARAMETER :: M80N9TDyss = 12303 - INTEGER(IntKi), PARAMETER :: M81N1TDyss = 12304 - INTEGER(IntKi), PARAMETER :: M81N2TDyss = 12305 - INTEGER(IntKi), PARAMETER :: M81N3TDyss = 12306 - INTEGER(IntKi), PARAMETER :: M81N4TDyss = 12307 - INTEGER(IntKi), PARAMETER :: M81N5TDyss = 12308 - INTEGER(IntKi), PARAMETER :: M81N6TDyss = 12309 - INTEGER(IntKi), PARAMETER :: M81N7TDyss = 12310 - INTEGER(IntKi), PARAMETER :: M81N8TDyss = 12311 - INTEGER(IntKi), PARAMETER :: M81N9TDyss = 12312 - INTEGER(IntKi), PARAMETER :: M82N1TDyss = 12313 - INTEGER(IntKi), PARAMETER :: M82N2TDyss = 12314 - INTEGER(IntKi), PARAMETER :: M82N3TDyss = 12315 - INTEGER(IntKi), PARAMETER :: M82N4TDyss = 12316 - INTEGER(IntKi), PARAMETER :: M82N5TDyss = 12317 - INTEGER(IntKi), PARAMETER :: M82N6TDyss = 12318 - INTEGER(IntKi), PARAMETER :: M82N7TDyss = 12319 - INTEGER(IntKi), PARAMETER :: M82N8TDyss = 12320 - INTEGER(IntKi), PARAMETER :: M82N9TDyss = 12321 - INTEGER(IntKi), PARAMETER :: M83N1TDyss = 12322 - INTEGER(IntKi), PARAMETER :: M83N2TDyss = 12323 - INTEGER(IntKi), PARAMETER :: M83N3TDyss = 12324 - INTEGER(IntKi), PARAMETER :: M83N4TDyss = 12325 - INTEGER(IntKi), PARAMETER :: M83N5TDyss = 12326 - INTEGER(IntKi), PARAMETER :: M83N6TDyss = 12327 - INTEGER(IntKi), PARAMETER :: M83N7TDyss = 12328 - INTEGER(IntKi), PARAMETER :: M83N8TDyss = 12329 - INTEGER(IntKi), PARAMETER :: M83N9TDyss = 12330 - INTEGER(IntKi), PARAMETER :: M84N1TDyss = 12331 - INTEGER(IntKi), PARAMETER :: M84N2TDyss = 12332 - INTEGER(IntKi), PARAMETER :: M84N3TDyss = 12333 - INTEGER(IntKi), PARAMETER :: M84N4TDyss = 12334 - INTEGER(IntKi), PARAMETER :: M84N5TDyss = 12335 - INTEGER(IntKi), PARAMETER :: M84N6TDyss = 12336 - INTEGER(IntKi), PARAMETER :: M84N7TDyss = 12337 - INTEGER(IntKi), PARAMETER :: M84N8TDyss = 12338 - INTEGER(IntKi), PARAMETER :: M84N9TDyss = 12339 - INTEGER(IntKi), PARAMETER :: M85N1TDyss = 12340 - INTEGER(IntKi), PARAMETER :: M85N2TDyss = 12341 - INTEGER(IntKi), PARAMETER :: M85N3TDyss = 12342 - INTEGER(IntKi), PARAMETER :: M85N4TDyss = 12343 - INTEGER(IntKi), PARAMETER :: M85N5TDyss = 12344 - INTEGER(IntKi), PARAMETER :: M85N6TDyss = 12345 - INTEGER(IntKi), PARAMETER :: M85N7TDyss = 12346 - INTEGER(IntKi), PARAMETER :: M85N8TDyss = 12347 - INTEGER(IntKi), PARAMETER :: M85N9TDyss = 12348 - INTEGER(IntKi), PARAMETER :: M86N1TDyss = 12349 - INTEGER(IntKi), PARAMETER :: M86N2TDyss = 12350 - INTEGER(IntKi), PARAMETER :: M86N3TDyss = 12351 - INTEGER(IntKi), PARAMETER :: M86N4TDyss = 12352 - INTEGER(IntKi), PARAMETER :: M86N5TDyss = 12353 - INTEGER(IntKi), PARAMETER :: M86N6TDyss = 12354 - INTEGER(IntKi), PARAMETER :: M86N7TDyss = 12355 - INTEGER(IntKi), PARAMETER :: M86N8TDyss = 12356 - INTEGER(IntKi), PARAMETER :: M86N9TDyss = 12357 - INTEGER(IntKi), PARAMETER :: M87N1TDyss = 12358 - INTEGER(IntKi), PARAMETER :: M87N2TDyss = 12359 - INTEGER(IntKi), PARAMETER :: M87N3TDyss = 12360 - INTEGER(IntKi), PARAMETER :: M87N4TDyss = 12361 - INTEGER(IntKi), PARAMETER :: M87N5TDyss = 12362 - INTEGER(IntKi), PARAMETER :: M87N6TDyss = 12363 - INTEGER(IntKi), PARAMETER :: M87N7TDyss = 12364 - INTEGER(IntKi), PARAMETER :: M87N8TDyss = 12365 - INTEGER(IntKi), PARAMETER :: M87N9TDyss = 12366 - INTEGER(IntKi), PARAMETER :: M88N1TDyss = 12367 - INTEGER(IntKi), PARAMETER :: M88N2TDyss = 12368 - INTEGER(IntKi), PARAMETER :: M88N3TDyss = 12369 - INTEGER(IntKi), PARAMETER :: M88N4TDyss = 12370 - INTEGER(IntKi), PARAMETER :: M88N5TDyss = 12371 - INTEGER(IntKi), PARAMETER :: M88N6TDyss = 12372 - INTEGER(IntKi), PARAMETER :: M88N7TDyss = 12373 - INTEGER(IntKi), PARAMETER :: M88N8TDyss = 12374 - INTEGER(IntKi), PARAMETER :: M88N9TDyss = 12375 - INTEGER(IntKi), PARAMETER :: M89N1TDyss = 12376 - INTEGER(IntKi), PARAMETER :: M89N2TDyss = 12377 - INTEGER(IntKi), PARAMETER :: M89N3TDyss = 12378 - INTEGER(IntKi), PARAMETER :: M89N4TDyss = 12379 - INTEGER(IntKi), PARAMETER :: M89N5TDyss = 12380 - INTEGER(IntKi), PARAMETER :: M89N6TDyss = 12381 - INTEGER(IntKi), PARAMETER :: M89N7TDyss = 12382 - INTEGER(IntKi), PARAMETER :: M89N8TDyss = 12383 - INTEGER(IntKi), PARAMETER :: M89N9TDyss = 12384 - INTEGER(IntKi), PARAMETER :: M90N1TDyss = 12385 - INTEGER(IntKi), PARAMETER :: M90N2TDyss = 12386 - INTEGER(IntKi), PARAMETER :: M90N3TDyss = 12387 - INTEGER(IntKi), PARAMETER :: M90N4TDyss = 12388 - INTEGER(IntKi), PARAMETER :: M90N5TDyss = 12389 - INTEGER(IntKi), PARAMETER :: M90N6TDyss = 12390 - INTEGER(IntKi), PARAMETER :: M90N7TDyss = 12391 - INTEGER(IntKi), PARAMETER :: M90N8TDyss = 12392 - INTEGER(IntKi), PARAMETER :: M90N9TDyss = 12393 - INTEGER(IntKi), PARAMETER :: M91N1TDyss = 12394 - INTEGER(IntKi), PARAMETER :: M91N2TDyss = 12395 - INTEGER(IntKi), PARAMETER :: M91N3TDyss = 12396 - INTEGER(IntKi), PARAMETER :: M91N4TDyss = 12397 - INTEGER(IntKi), PARAMETER :: M91N5TDyss = 12398 - INTEGER(IntKi), PARAMETER :: M91N6TDyss = 12399 - INTEGER(IntKi), PARAMETER :: M91N7TDyss = 12400 - INTEGER(IntKi), PARAMETER :: M91N8TDyss = 12401 - INTEGER(IntKi), PARAMETER :: M91N9TDyss = 12402 - INTEGER(IntKi), PARAMETER :: M92N1TDyss = 12403 - INTEGER(IntKi), PARAMETER :: M92N2TDyss = 12404 - INTEGER(IntKi), PARAMETER :: M92N3TDyss = 12405 - INTEGER(IntKi), PARAMETER :: M92N4TDyss = 12406 - INTEGER(IntKi), PARAMETER :: M92N5TDyss = 12407 - INTEGER(IntKi), PARAMETER :: M92N6TDyss = 12408 - INTEGER(IntKi), PARAMETER :: M92N7TDyss = 12409 - INTEGER(IntKi), PARAMETER :: M92N8TDyss = 12410 - INTEGER(IntKi), PARAMETER :: M92N9TDyss = 12411 - INTEGER(IntKi), PARAMETER :: M93N1TDyss = 12412 - INTEGER(IntKi), PARAMETER :: M93N2TDyss = 12413 - INTEGER(IntKi), PARAMETER :: M93N3TDyss = 12414 - INTEGER(IntKi), PARAMETER :: M93N4TDyss = 12415 - INTEGER(IntKi), PARAMETER :: M93N5TDyss = 12416 - INTEGER(IntKi), PARAMETER :: M93N6TDyss = 12417 - INTEGER(IntKi), PARAMETER :: M93N7TDyss = 12418 - INTEGER(IntKi), PARAMETER :: M93N8TDyss = 12419 - INTEGER(IntKi), PARAMETER :: M93N9TDyss = 12420 - INTEGER(IntKi), PARAMETER :: M94N1TDyss = 12421 - INTEGER(IntKi), PARAMETER :: M94N2TDyss = 12422 - INTEGER(IntKi), PARAMETER :: M94N3TDyss = 12423 - INTEGER(IntKi), PARAMETER :: M94N4TDyss = 12424 - INTEGER(IntKi), PARAMETER :: M94N5TDyss = 12425 - INTEGER(IntKi), PARAMETER :: M94N6TDyss = 12426 - INTEGER(IntKi), PARAMETER :: M94N7TDyss = 12427 - INTEGER(IntKi), PARAMETER :: M94N8TDyss = 12428 - INTEGER(IntKi), PARAMETER :: M94N9TDyss = 12429 - INTEGER(IntKi), PARAMETER :: M95N1TDyss = 12430 - INTEGER(IntKi), PARAMETER :: M95N2TDyss = 12431 - INTEGER(IntKi), PARAMETER :: M95N3TDyss = 12432 - INTEGER(IntKi), PARAMETER :: M95N4TDyss = 12433 - INTEGER(IntKi), PARAMETER :: M95N5TDyss = 12434 - INTEGER(IntKi), PARAMETER :: M95N6TDyss = 12435 - INTEGER(IntKi), PARAMETER :: M95N7TDyss = 12436 - INTEGER(IntKi), PARAMETER :: M95N8TDyss = 12437 - INTEGER(IntKi), PARAMETER :: M95N9TDyss = 12438 - INTEGER(IntKi), PARAMETER :: M96N1TDyss = 12439 - INTEGER(IntKi), PARAMETER :: M96N2TDyss = 12440 - INTEGER(IntKi), PARAMETER :: M96N3TDyss = 12441 - INTEGER(IntKi), PARAMETER :: M96N4TDyss = 12442 - INTEGER(IntKi), PARAMETER :: M96N5TDyss = 12443 - INTEGER(IntKi), PARAMETER :: M96N6TDyss = 12444 - INTEGER(IntKi), PARAMETER :: M96N7TDyss = 12445 - INTEGER(IntKi), PARAMETER :: M96N8TDyss = 12446 - INTEGER(IntKi), PARAMETER :: M96N9TDyss = 12447 - INTEGER(IntKi), PARAMETER :: M97N1TDyss = 12448 - INTEGER(IntKi), PARAMETER :: M97N2TDyss = 12449 - INTEGER(IntKi), PARAMETER :: M97N3TDyss = 12450 - INTEGER(IntKi), PARAMETER :: M97N4TDyss = 12451 - INTEGER(IntKi), PARAMETER :: M97N5TDyss = 12452 - INTEGER(IntKi), PARAMETER :: M97N6TDyss = 12453 - INTEGER(IntKi), PARAMETER :: M97N7TDyss = 12454 - INTEGER(IntKi), PARAMETER :: M97N8TDyss = 12455 - INTEGER(IntKi), PARAMETER :: M97N9TDyss = 12456 - INTEGER(IntKi), PARAMETER :: M98N1TDyss = 12457 - INTEGER(IntKi), PARAMETER :: M98N2TDyss = 12458 - INTEGER(IntKi), PARAMETER :: M98N3TDyss = 12459 - INTEGER(IntKi), PARAMETER :: M98N4TDyss = 12460 - INTEGER(IntKi), PARAMETER :: M98N5TDyss = 12461 - INTEGER(IntKi), PARAMETER :: M98N6TDyss = 12462 - INTEGER(IntKi), PARAMETER :: M98N7TDyss = 12463 - INTEGER(IntKi), PARAMETER :: M98N8TDyss = 12464 - INTEGER(IntKi), PARAMETER :: M98N9TDyss = 12465 - INTEGER(IntKi), PARAMETER :: M99N1TDyss = 12466 - INTEGER(IntKi), PARAMETER :: M99N2TDyss = 12467 - INTEGER(IntKi), PARAMETER :: M99N3TDyss = 12468 - INTEGER(IntKi), PARAMETER :: M99N4TDyss = 12469 - INTEGER(IntKi), PARAMETER :: M99N5TDyss = 12470 - INTEGER(IntKi), PARAMETER :: M99N6TDyss = 12471 - INTEGER(IntKi), PARAMETER :: M99N7TDyss = 12472 - INTEGER(IntKi), PARAMETER :: M99N8TDyss = 12473 - INTEGER(IntKi), PARAMETER :: M99N9TDyss = 12474 - INTEGER(IntKi), PARAMETER :: M01N1TDzss = 12475 - INTEGER(IntKi), PARAMETER :: M01N2TDzss = 12476 - INTEGER(IntKi), PARAMETER :: M01N3TDzss = 12477 - INTEGER(IntKi), PARAMETER :: M01N4TDzss = 12478 - INTEGER(IntKi), PARAMETER :: M01N5TDzss = 12479 - INTEGER(IntKi), PARAMETER :: M01N6TDzss = 12480 - INTEGER(IntKi), PARAMETER :: M01N7TDzss = 12481 - INTEGER(IntKi), PARAMETER :: M01N8TDzss = 12482 - INTEGER(IntKi), PARAMETER :: M01N9TDzss = 12483 - INTEGER(IntKi), PARAMETER :: M02N1TDzss = 12484 - INTEGER(IntKi), PARAMETER :: M02N2TDzss = 12485 - INTEGER(IntKi), PARAMETER :: M02N3TDzss = 12486 - INTEGER(IntKi), PARAMETER :: M02N4TDzss = 12487 - INTEGER(IntKi), PARAMETER :: M02N5TDzss = 12488 - INTEGER(IntKi), PARAMETER :: M02N6TDzss = 12489 - INTEGER(IntKi), PARAMETER :: M02N7TDzss = 12490 - INTEGER(IntKi), PARAMETER :: M02N8TDzss = 12491 - INTEGER(IntKi), PARAMETER :: M02N9TDzss = 12492 - INTEGER(IntKi), PARAMETER :: M03N1TDzss = 12493 - INTEGER(IntKi), PARAMETER :: M03N2TDzss = 12494 - INTEGER(IntKi), PARAMETER :: M03N3TDzss = 12495 - INTEGER(IntKi), PARAMETER :: M03N4TDzss = 12496 - INTEGER(IntKi), PARAMETER :: M03N5TDzss = 12497 - INTEGER(IntKi), PARAMETER :: M03N6TDzss = 12498 - INTEGER(IntKi), PARAMETER :: M03N7TDzss = 12499 - INTEGER(IntKi), PARAMETER :: M03N8TDzss = 12500 - INTEGER(IntKi), PARAMETER :: M03N9TDzss = 12501 - INTEGER(IntKi), PARAMETER :: M04N1TDzss = 12502 - INTEGER(IntKi), PARAMETER :: M04N2TDzss = 12503 - INTEGER(IntKi), PARAMETER :: M04N3TDzss = 12504 - INTEGER(IntKi), PARAMETER :: M04N4TDzss = 12505 - INTEGER(IntKi), PARAMETER :: M04N5TDzss = 12506 - INTEGER(IntKi), PARAMETER :: M04N6TDzss = 12507 - INTEGER(IntKi), PARAMETER :: M04N7TDzss = 12508 - INTEGER(IntKi), PARAMETER :: M04N8TDzss = 12509 - INTEGER(IntKi), PARAMETER :: M04N9TDzss = 12510 - INTEGER(IntKi), PARAMETER :: M05N1TDzss = 12511 - INTEGER(IntKi), PARAMETER :: M05N2TDzss = 12512 - INTEGER(IntKi), PARAMETER :: M05N3TDzss = 12513 - INTEGER(IntKi), PARAMETER :: M05N4TDzss = 12514 - INTEGER(IntKi), PARAMETER :: M05N5TDzss = 12515 - INTEGER(IntKi), PARAMETER :: M05N6TDzss = 12516 - INTEGER(IntKi), PARAMETER :: M05N7TDzss = 12517 - INTEGER(IntKi), PARAMETER :: M05N8TDzss = 12518 - INTEGER(IntKi), PARAMETER :: M05N9TDzss = 12519 - INTEGER(IntKi), PARAMETER :: M06N1TDzss = 12520 - INTEGER(IntKi), PARAMETER :: M06N2TDzss = 12521 - INTEGER(IntKi), PARAMETER :: M06N3TDzss = 12522 - INTEGER(IntKi), PARAMETER :: M06N4TDzss = 12523 - INTEGER(IntKi), PARAMETER :: M06N5TDzss = 12524 - INTEGER(IntKi), PARAMETER :: M06N6TDzss = 12525 - INTEGER(IntKi), PARAMETER :: M06N7TDzss = 12526 - INTEGER(IntKi), PARAMETER :: M06N8TDzss = 12527 - INTEGER(IntKi), PARAMETER :: M06N9TDzss = 12528 - INTEGER(IntKi), PARAMETER :: M07N1TDzss = 12529 - INTEGER(IntKi), PARAMETER :: M07N2TDzss = 12530 - INTEGER(IntKi), PARAMETER :: M07N3TDzss = 12531 - INTEGER(IntKi), PARAMETER :: M07N4TDzss = 12532 - INTEGER(IntKi), PARAMETER :: M07N5TDzss = 12533 - INTEGER(IntKi), PARAMETER :: M07N6TDzss = 12534 - INTEGER(IntKi), PARAMETER :: M07N7TDzss = 12535 - INTEGER(IntKi), PARAMETER :: M07N8TDzss = 12536 - INTEGER(IntKi), PARAMETER :: M07N9TDzss = 12537 - INTEGER(IntKi), PARAMETER :: M08N1TDzss = 12538 - INTEGER(IntKi), PARAMETER :: M08N2TDzss = 12539 - INTEGER(IntKi), PARAMETER :: M08N3TDzss = 12540 - INTEGER(IntKi), PARAMETER :: M08N4TDzss = 12541 - INTEGER(IntKi), PARAMETER :: M08N5TDzss = 12542 - INTEGER(IntKi), PARAMETER :: M08N6TDzss = 12543 - INTEGER(IntKi), PARAMETER :: M08N7TDzss = 12544 - INTEGER(IntKi), PARAMETER :: M08N8TDzss = 12545 - INTEGER(IntKi), PARAMETER :: M08N9TDzss = 12546 - INTEGER(IntKi), PARAMETER :: M09N1TDzss = 12547 - INTEGER(IntKi), PARAMETER :: M09N2TDzss = 12548 - INTEGER(IntKi), PARAMETER :: M09N3TDzss = 12549 - INTEGER(IntKi), PARAMETER :: M09N4TDzss = 12550 - INTEGER(IntKi), PARAMETER :: M09N5TDzss = 12551 - INTEGER(IntKi), PARAMETER :: M09N6TDzss = 12552 - INTEGER(IntKi), PARAMETER :: M09N7TDzss = 12553 - INTEGER(IntKi), PARAMETER :: M09N8TDzss = 12554 - INTEGER(IntKi), PARAMETER :: M09N9TDzss = 12555 - INTEGER(IntKi), PARAMETER :: M10N1TDzss = 12556 - INTEGER(IntKi), PARAMETER :: M10N2TDzss = 12557 - INTEGER(IntKi), PARAMETER :: M10N3TDzss = 12558 - INTEGER(IntKi), PARAMETER :: M10N4TDzss = 12559 - INTEGER(IntKi), PARAMETER :: M10N5TDzss = 12560 - INTEGER(IntKi), PARAMETER :: M10N6TDzss = 12561 - INTEGER(IntKi), PARAMETER :: M10N7TDzss = 12562 - INTEGER(IntKi), PARAMETER :: M10N8TDzss = 12563 - INTEGER(IntKi), PARAMETER :: M10N9TDzss = 12564 - INTEGER(IntKi), PARAMETER :: M11N1TDzss = 12565 - INTEGER(IntKi), PARAMETER :: M11N2TDzss = 12566 - INTEGER(IntKi), PARAMETER :: M11N3TDzss = 12567 - INTEGER(IntKi), PARAMETER :: M11N4TDzss = 12568 - INTEGER(IntKi), PARAMETER :: M11N5TDzss = 12569 - INTEGER(IntKi), PARAMETER :: M11N6TDzss = 12570 - INTEGER(IntKi), PARAMETER :: M11N7TDzss = 12571 - INTEGER(IntKi), PARAMETER :: M11N8TDzss = 12572 - INTEGER(IntKi), PARAMETER :: M11N9TDzss = 12573 - INTEGER(IntKi), PARAMETER :: M12N1TDzss = 12574 - INTEGER(IntKi), PARAMETER :: M12N2TDzss = 12575 - INTEGER(IntKi), PARAMETER :: M12N3TDzss = 12576 - INTEGER(IntKi), PARAMETER :: M12N4TDzss = 12577 - INTEGER(IntKi), PARAMETER :: M12N5TDzss = 12578 - INTEGER(IntKi), PARAMETER :: M12N6TDzss = 12579 - INTEGER(IntKi), PARAMETER :: M12N7TDzss = 12580 - INTEGER(IntKi), PARAMETER :: M12N8TDzss = 12581 - INTEGER(IntKi), PARAMETER :: M12N9TDzss = 12582 - INTEGER(IntKi), PARAMETER :: M13N1TDzss = 12583 - INTEGER(IntKi), PARAMETER :: M13N2TDzss = 12584 - INTEGER(IntKi), PARAMETER :: M13N3TDzss = 12585 - INTEGER(IntKi), PARAMETER :: M13N4TDzss = 12586 - INTEGER(IntKi), PARAMETER :: M13N5TDzss = 12587 - INTEGER(IntKi), PARAMETER :: M13N6TDzss = 12588 - INTEGER(IntKi), PARAMETER :: M13N7TDzss = 12589 - INTEGER(IntKi), PARAMETER :: M13N8TDzss = 12590 - INTEGER(IntKi), PARAMETER :: M13N9TDzss = 12591 - INTEGER(IntKi), PARAMETER :: M14N1TDzss = 12592 - INTEGER(IntKi), PARAMETER :: M14N2TDzss = 12593 - INTEGER(IntKi), PARAMETER :: M14N3TDzss = 12594 - INTEGER(IntKi), PARAMETER :: M14N4TDzss = 12595 - INTEGER(IntKi), PARAMETER :: M14N5TDzss = 12596 - INTEGER(IntKi), PARAMETER :: M14N6TDzss = 12597 - INTEGER(IntKi), PARAMETER :: M14N7TDzss = 12598 - INTEGER(IntKi), PARAMETER :: M14N8TDzss = 12599 - INTEGER(IntKi), PARAMETER :: M14N9TDzss = 12600 - INTEGER(IntKi), PARAMETER :: M15N1TDzss = 12601 - INTEGER(IntKi), PARAMETER :: M15N2TDzss = 12602 - INTEGER(IntKi), PARAMETER :: M15N3TDzss = 12603 - INTEGER(IntKi), PARAMETER :: M15N4TDzss = 12604 - INTEGER(IntKi), PARAMETER :: M15N5TDzss = 12605 - INTEGER(IntKi), PARAMETER :: M15N6TDzss = 12606 - INTEGER(IntKi), PARAMETER :: M15N7TDzss = 12607 - INTEGER(IntKi), PARAMETER :: M15N8TDzss = 12608 - INTEGER(IntKi), PARAMETER :: M15N9TDzss = 12609 - INTEGER(IntKi), PARAMETER :: M16N1TDzss = 12610 - INTEGER(IntKi), PARAMETER :: M16N2TDzss = 12611 - INTEGER(IntKi), PARAMETER :: M16N3TDzss = 12612 - INTEGER(IntKi), PARAMETER :: M16N4TDzss = 12613 - INTEGER(IntKi), PARAMETER :: M16N5TDzss = 12614 - INTEGER(IntKi), PARAMETER :: M16N6TDzss = 12615 - INTEGER(IntKi), PARAMETER :: M16N7TDzss = 12616 - INTEGER(IntKi), PARAMETER :: M16N8TDzss = 12617 - INTEGER(IntKi), PARAMETER :: M16N9TDzss = 12618 - INTEGER(IntKi), PARAMETER :: M17N1TDzss = 12619 - INTEGER(IntKi), PARAMETER :: M17N2TDzss = 12620 - INTEGER(IntKi), PARAMETER :: M17N3TDzss = 12621 - INTEGER(IntKi), PARAMETER :: M17N4TDzss = 12622 - INTEGER(IntKi), PARAMETER :: M17N5TDzss = 12623 - INTEGER(IntKi), PARAMETER :: M17N6TDzss = 12624 - INTEGER(IntKi), PARAMETER :: M17N7TDzss = 12625 - INTEGER(IntKi), PARAMETER :: M17N8TDzss = 12626 - INTEGER(IntKi), PARAMETER :: M17N9TDzss = 12627 - INTEGER(IntKi), PARAMETER :: M18N1TDzss = 12628 - INTEGER(IntKi), PARAMETER :: M18N2TDzss = 12629 - INTEGER(IntKi), PARAMETER :: M18N3TDzss = 12630 - INTEGER(IntKi), PARAMETER :: M18N4TDzss = 12631 - INTEGER(IntKi), PARAMETER :: M18N5TDzss = 12632 - INTEGER(IntKi), PARAMETER :: M18N6TDzss = 12633 - INTEGER(IntKi), PARAMETER :: M18N7TDzss = 12634 - INTEGER(IntKi), PARAMETER :: M18N8TDzss = 12635 - INTEGER(IntKi), PARAMETER :: M18N9TDzss = 12636 - INTEGER(IntKi), PARAMETER :: M19N1TDzss = 12637 - INTEGER(IntKi), PARAMETER :: M19N2TDzss = 12638 - INTEGER(IntKi), PARAMETER :: M19N3TDzss = 12639 - INTEGER(IntKi), PARAMETER :: M19N4TDzss = 12640 - INTEGER(IntKi), PARAMETER :: M19N5TDzss = 12641 - INTEGER(IntKi), PARAMETER :: M19N6TDzss = 12642 - INTEGER(IntKi), PARAMETER :: M19N7TDzss = 12643 - INTEGER(IntKi), PARAMETER :: M19N8TDzss = 12644 - INTEGER(IntKi), PARAMETER :: M19N9TDzss = 12645 - INTEGER(IntKi), PARAMETER :: M20N1TDzss = 12646 - INTEGER(IntKi), PARAMETER :: M20N2TDzss = 12647 - INTEGER(IntKi), PARAMETER :: M20N3TDzss = 12648 - INTEGER(IntKi), PARAMETER :: M20N4TDzss = 12649 - INTEGER(IntKi), PARAMETER :: M20N5TDzss = 12650 - INTEGER(IntKi), PARAMETER :: M20N6TDzss = 12651 - INTEGER(IntKi), PARAMETER :: M20N7TDzss = 12652 - INTEGER(IntKi), PARAMETER :: M20N8TDzss = 12653 - INTEGER(IntKi), PARAMETER :: M20N9TDzss = 12654 - INTEGER(IntKi), PARAMETER :: M21N1TDzss = 12655 - INTEGER(IntKi), PARAMETER :: M21N2TDzss = 12656 - INTEGER(IntKi), PARAMETER :: M21N3TDzss = 12657 - INTEGER(IntKi), PARAMETER :: M21N4TDzss = 12658 - INTEGER(IntKi), PARAMETER :: M21N5TDzss = 12659 - INTEGER(IntKi), PARAMETER :: M21N6TDzss = 12660 - INTEGER(IntKi), PARAMETER :: M21N7TDzss = 12661 - INTEGER(IntKi), PARAMETER :: M21N8TDzss = 12662 - INTEGER(IntKi), PARAMETER :: M21N9TDzss = 12663 - INTEGER(IntKi), PARAMETER :: M22N1TDzss = 12664 - INTEGER(IntKi), PARAMETER :: M22N2TDzss = 12665 - INTEGER(IntKi), PARAMETER :: M22N3TDzss = 12666 - INTEGER(IntKi), PARAMETER :: M22N4TDzss = 12667 - INTEGER(IntKi), PARAMETER :: M22N5TDzss = 12668 - INTEGER(IntKi), PARAMETER :: M22N6TDzss = 12669 - INTEGER(IntKi), PARAMETER :: M22N7TDzss = 12670 - INTEGER(IntKi), PARAMETER :: M22N8TDzss = 12671 - INTEGER(IntKi), PARAMETER :: M22N9TDzss = 12672 - INTEGER(IntKi), PARAMETER :: M23N1TDzss = 12673 - INTEGER(IntKi), PARAMETER :: M23N2TDzss = 12674 - INTEGER(IntKi), PARAMETER :: M23N3TDzss = 12675 - INTEGER(IntKi), PARAMETER :: M23N4TDzss = 12676 - INTEGER(IntKi), PARAMETER :: M23N5TDzss = 12677 - INTEGER(IntKi), PARAMETER :: M23N6TDzss = 12678 - INTEGER(IntKi), PARAMETER :: M23N7TDzss = 12679 - INTEGER(IntKi), PARAMETER :: M23N8TDzss = 12680 - INTEGER(IntKi), PARAMETER :: M23N9TDzss = 12681 - INTEGER(IntKi), PARAMETER :: M24N1TDzss = 12682 - INTEGER(IntKi), PARAMETER :: M24N2TDzss = 12683 - INTEGER(IntKi), PARAMETER :: M24N3TDzss = 12684 - INTEGER(IntKi), PARAMETER :: M24N4TDzss = 12685 - INTEGER(IntKi), PARAMETER :: M24N5TDzss = 12686 - INTEGER(IntKi), PARAMETER :: M24N6TDzss = 12687 - INTEGER(IntKi), PARAMETER :: M24N7TDzss = 12688 - INTEGER(IntKi), PARAMETER :: M24N8TDzss = 12689 - INTEGER(IntKi), PARAMETER :: M24N9TDzss = 12690 - INTEGER(IntKi), PARAMETER :: M25N1TDzss = 12691 - INTEGER(IntKi), PARAMETER :: M25N2TDzss = 12692 - INTEGER(IntKi), PARAMETER :: M25N3TDzss = 12693 - INTEGER(IntKi), PARAMETER :: M25N4TDzss = 12694 - INTEGER(IntKi), PARAMETER :: M25N5TDzss = 12695 - INTEGER(IntKi), PARAMETER :: M25N6TDzss = 12696 - INTEGER(IntKi), PARAMETER :: M25N7TDzss = 12697 - INTEGER(IntKi), PARAMETER :: M25N8TDzss = 12698 - INTEGER(IntKi), PARAMETER :: M25N9TDzss = 12699 - INTEGER(IntKi), PARAMETER :: M26N1TDzss = 12700 - INTEGER(IntKi), PARAMETER :: M26N2TDzss = 12701 - INTEGER(IntKi), PARAMETER :: M26N3TDzss = 12702 - INTEGER(IntKi), PARAMETER :: M26N4TDzss = 12703 - INTEGER(IntKi), PARAMETER :: M26N5TDzss = 12704 - INTEGER(IntKi), PARAMETER :: M26N6TDzss = 12705 - INTEGER(IntKi), PARAMETER :: M26N7TDzss = 12706 - INTEGER(IntKi), PARAMETER :: M26N8TDzss = 12707 - INTEGER(IntKi), PARAMETER :: M26N9TDzss = 12708 - INTEGER(IntKi), PARAMETER :: M27N1TDzss = 12709 - INTEGER(IntKi), PARAMETER :: M27N2TDzss = 12710 - INTEGER(IntKi), PARAMETER :: M27N3TDzss = 12711 - INTEGER(IntKi), PARAMETER :: M27N4TDzss = 12712 - INTEGER(IntKi), PARAMETER :: M27N5TDzss = 12713 - INTEGER(IntKi), PARAMETER :: M27N6TDzss = 12714 - INTEGER(IntKi), PARAMETER :: M27N7TDzss = 12715 - INTEGER(IntKi), PARAMETER :: M27N8TDzss = 12716 - INTEGER(IntKi), PARAMETER :: M27N9TDzss = 12717 - INTEGER(IntKi), PARAMETER :: M28N1TDzss = 12718 - INTEGER(IntKi), PARAMETER :: M28N2TDzss = 12719 - INTEGER(IntKi), PARAMETER :: M28N3TDzss = 12720 - INTEGER(IntKi), PARAMETER :: M28N4TDzss = 12721 - INTEGER(IntKi), PARAMETER :: M28N5TDzss = 12722 - INTEGER(IntKi), PARAMETER :: M28N6TDzss = 12723 - INTEGER(IntKi), PARAMETER :: M28N7TDzss = 12724 - INTEGER(IntKi), PARAMETER :: M28N8TDzss = 12725 - INTEGER(IntKi), PARAMETER :: M28N9TDzss = 12726 - INTEGER(IntKi), PARAMETER :: M29N1TDzss = 12727 - INTEGER(IntKi), PARAMETER :: M29N2TDzss = 12728 - INTEGER(IntKi), PARAMETER :: M29N3TDzss = 12729 - INTEGER(IntKi), PARAMETER :: M29N4TDzss = 12730 - INTEGER(IntKi), PARAMETER :: M29N5TDzss = 12731 - INTEGER(IntKi), PARAMETER :: M29N6TDzss = 12732 - INTEGER(IntKi), PARAMETER :: M29N7TDzss = 12733 - INTEGER(IntKi), PARAMETER :: M29N8TDzss = 12734 - INTEGER(IntKi), PARAMETER :: M29N9TDzss = 12735 - INTEGER(IntKi), PARAMETER :: M30N1TDzss = 12736 - INTEGER(IntKi), PARAMETER :: M30N2TDzss = 12737 - INTEGER(IntKi), PARAMETER :: M30N3TDzss = 12738 - INTEGER(IntKi), PARAMETER :: M30N4TDzss = 12739 - INTEGER(IntKi), PARAMETER :: M30N5TDzss = 12740 - INTEGER(IntKi), PARAMETER :: M30N6TDzss = 12741 - INTEGER(IntKi), PARAMETER :: M30N7TDzss = 12742 - INTEGER(IntKi), PARAMETER :: M30N8TDzss = 12743 - INTEGER(IntKi), PARAMETER :: M30N9TDzss = 12744 - INTEGER(IntKi), PARAMETER :: M31N1TDzss = 12745 - INTEGER(IntKi), PARAMETER :: M31N2TDzss = 12746 - INTEGER(IntKi), PARAMETER :: M31N3TDzss = 12747 - INTEGER(IntKi), PARAMETER :: M31N4TDzss = 12748 - INTEGER(IntKi), PARAMETER :: M31N5TDzss = 12749 - INTEGER(IntKi), PARAMETER :: M31N6TDzss = 12750 - INTEGER(IntKi), PARAMETER :: M31N7TDzss = 12751 - INTEGER(IntKi), PARAMETER :: M31N8TDzss = 12752 - INTEGER(IntKi), PARAMETER :: M31N9TDzss = 12753 - INTEGER(IntKi), PARAMETER :: M32N1TDzss = 12754 - INTEGER(IntKi), PARAMETER :: M32N2TDzss = 12755 - INTEGER(IntKi), PARAMETER :: M32N3TDzss = 12756 - INTEGER(IntKi), PARAMETER :: M32N4TDzss = 12757 - INTEGER(IntKi), PARAMETER :: M32N5TDzss = 12758 - INTEGER(IntKi), PARAMETER :: M32N6TDzss = 12759 - INTEGER(IntKi), PARAMETER :: M32N7TDzss = 12760 - INTEGER(IntKi), PARAMETER :: M32N8TDzss = 12761 - INTEGER(IntKi), PARAMETER :: M32N9TDzss = 12762 - INTEGER(IntKi), PARAMETER :: M33N1TDzss = 12763 - INTEGER(IntKi), PARAMETER :: M33N2TDzss = 12764 - INTEGER(IntKi), PARAMETER :: M33N3TDzss = 12765 - INTEGER(IntKi), PARAMETER :: M33N4TDzss = 12766 - INTEGER(IntKi), PARAMETER :: M33N5TDzss = 12767 - INTEGER(IntKi), PARAMETER :: M33N6TDzss = 12768 - INTEGER(IntKi), PARAMETER :: M33N7TDzss = 12769 - INTEGER(IntKi), PARAMETER :: M33N8TDzss = 12770 - INTEGER(IntKi), PARAMETER :: M33N9TDzss = 12771 - INTEGER(IntKi), PARAMETER :: M34N1TDzss = 12772 - INTEGER(IntKi), PARAMETER :: M34N2TDzss = 12773 - INTEGER(IntKi), PARAMETER :: M34N3TDzss = 12774 - INTEGER(IntKi), PARAMETER :: M34N4TDzss = 12775 - INTEGER(IntKi), PARAMETER :: M34N5TDzss = 12776 - INTEGER(IntKi), PARAMETER :: M34N6TDzss = 12777 - INTEGER(IntKi), PARAMETER :: M34N7TDzss = 12778 - INTEGER(IntKi), PARAMETER :: M34N8TDzss = 12779 - INTEGER(IntKi), PARAMETER :: M34N9TDzss = 12780 - INTEGER(IntKi), PARAMETER :: M35N1TDzss = 12781 - INTEGER(IntKi), PARAMETER :: M35N2TDzss = 12782 - INTEGER(IntKi), PARAMETER :: M35N3TDzss = 12783 - INTEGER(IntKi), PARAMETER :: M35N4TDzss = 12784 - INTEGER(IntKi), PARAMETER :: M35N5TDzss = 12785 - INTEGER(IntKi), PARAMETER :: M35N6TDzss = 12786 - INTEGER(IntKi), PARAMETER :: M35N7TDzss = 12787 - INTEGER(IntKi), PARAMETER :: M35N8TDzss = 12788 - INTEGER(IntKi), PARAMETER :: M35N9TDzss = 12789 - INTEGER(IntKi), PARAMETER :: M36N1TDzss = 12790 - INTEGER(IntKi), PARAMETER :: M36N2TDzss = 12791 - INTEGER(IntKi), PARAMETER :: M36N3TDzss = 12792 - INTEGER(IntKi), PARAMETER :: M36N4TDzss = 12793 - INTEGER(IntKi), PARAMETER :: M36N5TDzss = 12794 - INTEGER(IntKi), PARAMETER :: M36N6TDzss = 12795 - INTEGER(IntKi), PARAMETER :: M36N7TDzss = 12796 - INTEGER(IntKi), PARAMETER :: M36N8TDzss = 12797 - INTEGER(IntKi), PARAMETER :: M36N9TDzss = 12798 - INTEGER(IntKi), PARAMETER :: M37N1TDzss = 12799 - INTEGER(IntKi), PARAMETER :: M37N2TDzss = 12800 - INTEGER(IntKi), PARAMETER :: M37N3TDzss = 12801 - INTEGER(IntKi), PARAMETER :: M37N4TDzss = 12802 - INTEGER(IntKi), PARAMETER :: M37N5TDzss = 12803 - INTEGER(IntKi), PARAMETER :: M37N6TDzss = 12804 - INTEGER(IntKi), PARAMETER :: M37N7TDzss = 12805 - INTEGER(IntKi), PARAMETER :: M37N8TDzss = 12806 - INTEGER(IntKi), PARAMETER :: M37N9TDzss = 12807 - INTEGER(IntKi), PARAMETER :: M38N1TDzss = 12808 - INTEGER(IntKi), PARAMETER :: M38N2TDzss = 12809 - INTEGER(IntKi), PARAMETER :: M38N3TDzss = 12810 - INTEGER(IntKi), PARAMETER :: M38N4TDzss = 12811 - INTEGER(IntKi), PARAMETER :: M38N5TDzss = 12812 - INTEGER(IntKi), PARAMETER :: M38N6TDzss = 12813 - INTEGER(IntKi), PARAMETER :: M38N7TDzss = 12814 - INTEGER(IntKi), PARAMETER :: M38N8TDzss = 12815 - INTEGER(IntKi), PARAMETER :: M38N9TDzss = 12816 - INTEGER(IntKi), PARAMETER :: M39N1TDzss = 12817 - INTEGER(IntKi), PARAMETER :: M39N2TDzss = 12818 - INTEGER(IntKi), PARAMETER :: M39N3TDzss = 12819 - INTEGER(IntKi), PARAMETER :: M39N4TDzss = 12820 - INTEGER(IntKi), PARAMETER :: M39N5TDzss = 12821 - INTEGER(IntKi), PARAMETER :: M39N6TDzss = 12822 - INTEGER(IntKi), PARAMETER :: M39N7TDzss = 12823 - INTEGER(IntKi), PARAMETER :: M39N8TDzss = 12824 - INTEGER(IntKi), PARAMETER :: M39N9TDzss = 12825 - INTEGER(IntKi), PARAMETER :: M40N1TDzss = 12826 - INTEGER(IntKi), PARAMETER :: M40N2TDzss = 12827 - INTEGER(IntKi), PARAMETER :: M40N3TDzss = 12828 - INTEGER(IntKi), PARAMETER :: M40N4TDzss = 12829 - INTEGER(IntKi), PARAMETER :: M40N5TDzss = 12830 - INTEGER(IntKi), PARAMETER :: M40N6TDzss = 12831 - INTEGER(IntKi), PARAMETER :: M40N7TDzss = 12832 - INTEGER(IntKi), PARAMETER :: M40N8TDzss = 12833 - INTEGER(IntKi), PARAMETER :: M40N9TDzss = 12834 - INTEGER(IntKi), PARAMETER :: M41N1TDzss = 12835 - INTEGER(IntKi), PARAMETER :: M41N2TDzss = 12836 - INTEGER(IntKi), PARAMETER :: M41N3TDzss = 12837 - INTEGER(IntKi), PARAMETER :: M41N4TDzss = 12838 - INTEGER(IntKi), PARAMETER :: M41N5TDzss = 12839 - INTEGER(IntKi), PARAMETER :: M41N6TDzss = 12840 - INTEGER(IntKi), PARAMETER :: M41N7TDzss = 12841 - INTEGER(IntKi), PARAMETER :: M41N8TDzss = 12842 - INTEGER(IntKi), PARAMETER :: M41N9TDzss = 12843 - INTEGER(IntKi), PARAMETER :: M42N1TDzss = 12844 - INTEGER(IntKi), PARAMETER :: M42N2TDzss = 12845 - INTEGER(IntKi), PARAMETER :: M42N3TDzss = 12846 - INTEGER(IntKi), PARAMETER :: M42N4TDzss = 12847 - INTEGER(IntKi), PARAMETER :: M42N5TDzss = 12848 - INTEGER(IntKi), PARAMETER :: M42N6TDzss = 12849 - INTEGER(IntKi), PARAMETER :: M42N7TDzss = 12850 - INTEGER(IntKi), PARAMETER :: M42N8TDzss = 12851 - INTEGER(IntKi), PARAMETER :: M42N9TDzss = 12852 - INTEGER(IntKi), PARAMETER :: M43N1TDzss = 12853 - INTEGER(IntKi), PARAMETER :: M43N2TDzss = 12854 - INTEGER(IntKi), PARAMETER :: M43N3TDzss = 12855 - INTEGER(IntKi), PARAMETER :: M43N4TDzss = 12856 - INTEGER(IntKi), PARAMETER :: M43N5TDzss = 12857 - INTEGER(IntKi), PARAMETER :: M43N6TDzss = 12858 - INTEGER(IntKi), PARAMETER :: M43N7TDzss = 12859 - INTEGER(IntKi), PARAMETER :: M43N8TDzss = 12860 - INTEGER(IntKi), PARAMETER :: M43N9TDzss = 12861 - INTEGER(IntKi), PARAMETER :: M44N1TDzss = 12862 - INTEGER(IntKi), PARAMETER :: M44N2TDzss = 12863 - INTEGER(IntKi), PARAMETER :: M44N3TDzss = 12864 - INTEGER(IntKi), PARAMETER :: M44N4TDzss = 12865 - INTEGER(IntKi), PARAMETER :: M44N5TDzss = 12866 - INTEGER(IntKi), PARAMETER :: M44N6TDzss = 12867 - INTEGER(IntKi), PARAMETER :: M44N7TDzss = 12868 - INTEGER(IntKi), PARAMETER :: M44N8TDzss = 12869 - INTEGER(IntKi), PARAMETER :: M44N9TDzss = 12870 - INTEGER(IntKi), PARAMETER :: M45N1TDzss = 12871 - INTEGER(IntKi), PARAMETER :: M45N2TDzss = 12872 - INTEGER(IntKi), PARAMETER :: M45N3TDzss = 12873 - INTEGER(IntKi), PARAMETER :: M45N4TDzss = 12874 - INTEGER(IntKi), PARAMETER :: M45N5TDzss = 12875 - INTEGER(IntKi), PARAMETER :: M45N6TDzss = 12876 - INTEGER(IntKi), PARAMETER :: M45N7TDzss = 12877 - INTEGER(IntKi), PARAMETER :: M45N8TDzss = 12878 - INTEGER(IntKi), PARAMETER :: M45N9TDzss = 12879 - INTEGER(IntKi), PARAMETER :: M46N1TDzss = 12880 - INTEGER(IntKi), PARAMETER :: M46N2TDzss = 12881 - INTEGER(IntKi), PARAMETER :: M46N3TDzss = 12882 - INTEGER(IntKi), PARAMETER :: M46N4TDzss = 12883 - INTEGER(IntKi), PARAMETER :: M46N5TDzss = 12884 - INTEGER(IntKi), PARAMETER :: M46N6TDzss = 12885 - INTEGER(IntKi), PARAMETER :: M46N7TDzss = 12886 - INTEGER(IntKi), PARAMETER :: M46N8TDzss = 12887 - INTEGER(IntKi), PARAMETER :: M46N9TDzss = 12888 - INTEGER(IntKi), PARAMETER :: M47N1TDzss = 12889 - INTEGER(IntKi), PARAMETER :: M47N2TDzss = 12890 - INTEGER(IntKi), PARAMETER :: M47N3TDzss = 12891 - INTEGER(IntKi), PARAMETER :: M47N4TDzss = 12892 - INTEGER(IntKi), PARAMETER :: M47N5TDzss = 12893 - INTEGER(IntKi), PARAMETER :: M47N6TDzss = 12894 - INTEGER(IntKi), PARAMETER :: M47N7TDzss = 12895 - INTEGER(IntKi), PARAMETER :: M47N8TDzss = 12896 - INTEGER(IntKi), PARAMETER :: M47N9TDzss = 12897 - INTEGER(IntKi), PARAMETER :: M48N1TDzss = 12898 - INTEGER(IntKi), PARAMETER :: M48N2TDzss = 12899 - INTEGER(IntKi), PARAMETER :: M48N3TDzss = 12900 - INTEGER(IntKi), PARAMETER :: M48N4TDzss = 12901 - INTEGER(IntKi), PARAMETER :: M48N5TDzss = 12902 - INTEGER(IntKi), PARAMETER :: M48N6TDzss = 12903 - INTEGER(IntKi), PARAMETER :: M48N7TDzss = 12904 - INTEGER(IntKi), PARAMETER :: M48N8TDzss = 12905 - INTEGER(IntKi), PARAMETER :: M48N9TDzss = 12906 - INTEGER(IntKi), PARAMETER :: M49N1TDzss = 12907 - INTEGER(IntKi), PARAMETER :: M49N2TDzss = 12908 - INTEGER(IntKi), PARAMETER :: M49N3TDzss = 12909 - INTEGER(IntKi), PARAMETER :: M49N4TDzss = 12910 - INTEGER(IntKi), PARAMETER :: M49N5TDzss = 12911 - INTEGER(IntKi), PARAMETER :: M49N6TDzss = 12912 - INTEGER(IntKi), PARAMETER :: M49N7TDzss = 12913 - INTEGER(IntKi), PARAMETER :: M49N8TDzss = 12914 - INTEGER(IntKi), PARAMETER :: M49N9TDzss = 12915 - INTEGER(IntKi), PARAMETER :: M50N1TDzss = 12916 - INTEGER(IntKi), PARAMETER :: M50N2TDzss = 12917 - INTEGER(IntKi), PARAMETER :: M50N3TDzss = 12918 - INTEGER(IntKi), PARAMETER :: M50N4TDzss = 12919 - INTEGER(IntKi), PARAMETER :: M50N5TDzss = 12920 - INTEGER(IntKi), PARAMETER :: M50N6TDzss = 12921 - INTEGER(IntKi), PARAMETER :: M50N7TDzss = 12922 - INTEGER(IntKi), PARAMETER :: M50N8TDzss = 12923 - INTEGER(IntKi), PARAMETER :: M50N9TDzss = 12924 - INTEGER(IntKi), PARAMETER :: M51N1TDzss = 12925 - INTEGER(IntKi), PARAMETER :: M51N2TDzss = 12926 - INTEGER(IntKi), PARAMETER :: M51N3TDzss = 12927 - INTEGER(IntKi), PARAMETER :: M51N4TDzss = 12928 - INTEGER(IntKi), PARAMETER :: M51N5TDzss = 12929 - INTEGER(IntKi), PARAMETER :: M51N6TDzss = 12930 - INTEGER(IntKi), PARAMETER :: M51N7TDzss = 12931 - INTEGER(IntKi), PARAMETER :: M51N8TDzss = 12932 - INTEGER(IntKi), PARAMETER :: M51N9TDzss = 12933 - INTEGER(IntKi), PARAMETER :: M52N1TDzss = 12934 - INTEGER(IntKi), PARAMETER :: M52N2TDzss = 12935 - INTEGER(IntKi), PARAMETER :: M52N3TDzss = 12936 - INTEGER(IntKi), PARAMETER :: M52N4TDzss = 12937 - INTEGER(IntKi), PARAMETER :: M52N5TDzss = 12938 - INTEGER(IntKi), PARAMETER :: M52N6TDzss = 12939 - INTEGER(IntKi), PARAMETER :: M52N7TDzss = 12940 - INTEGER(IntKi), PARAMETER :: M52N8TDzss = 12941 - INTEGER(IntKi), PARAMETER :: M52N9TDzss = 12942 - INTEGER(IntKi), PARAMETER :: M53N1TDzss = 12943 - INTEGER(IntKi), PARAMETER :: M53N2TDzss = 12944 - INTEGER(IntKi), PARAMETER :: M53N3TDzss = 12945 - INTEGER(IntKi), PARAMETER :: M53N4TDzss = 12946 - INTEGER(IntKi), PARAMETER :: M53N5TDzss = 12947 - INTEGER(IntKi), PARAMETER :: M53N6TDzss = 12948 - INTEGER(IntKi), PARAMETER :: M53N7TDzss = 12949 - INTEGER(IntKi), PARAMETER :: M53N8TDzss = 12950 - INTEGER(IntKi), PARAMETER :: M53N9TDzss = 12951 - INTEGER(IntKi), PARAMETER :: M54N1TDzss = 12952 - INTEGER(IntKi), PARAMETER :: M54N2TDzss = 12953 - INTEGER(IntKi), PARAMETER :: M54N3TDzss = 12954 - INTEGER(IntKi), PARAMETER :: M54N4TDzss = 12955 - INTEGER(IntKi), PARAMETER :: M54N5TDzss = 12956 - INTEGER(IntKi), PARAMETER :: M54N6TDzss = 12957 - INTEGER(IntKi), PARAMETER :: M54N7TDzss = 12958 - INTEGER(IntKi), PARAMETER :: M54N8TDzss = 12959 - INTEGER(IntKi), PARAMETER :: M54N9TDzss = 12960 - INTEGER(IntKi), PARAMETER :: M55N1TDzss = 12961 - INTEGER(IntKi), PARAMETER :: M55N2TDzss = 12962 - INTEGER(IntKi), PARAMETER :: M55N3TDzss = 12963 - INTEGER(IntKi), PARAMETER :: M55N4TDzss = 12964 - INTEGER(IntKi), PARAMETER :: M55N5TDzss = 12965 - INTEGER(IntKi), PARAMETER :: M55N6TDzss = 12966 - INTEGER(IntKi), PARAMETER :: M55N7TDzss = 12967 - INTEGER(IntKi), PARAMETER :: M55N8TDzss = 12968 - INTEGER(IntKi), PARAMETER :: M55N9TDzss = 12969 - INTEGER(IntKi), PARAMETER :: M56N1TDzss = 12970 - INTEGER(IntKi), PARAMETER :: M56N2TDzss = 12971 - INTEGER(IntKi), PARAMETER :: M56N3TDzss = 12972 - INTEGER(IntKi), PARAMETER :: M56N4TDzss = 12973 - INTEGER(IntKi), PARAMETER :: M56N5TDzss = 12974 - INTEGER(IntKi), PARAMETER :: M56N6TDzss = 12975 - INTEGER(IntKi), PARAMETER :: M56N7TDzss = 12976 - INTEGER(IntKi), PARAMETER :: M56N8TDzss = 12977 - INTEGER(IntKi), PARAMETER :: M56N9TDzss = 12978 - INTEGER(IntKi), PARAMETER :: M57N1TDzss = 12979 - INTEGER(IntKi), PARAMETER :: M57N2TDzss = 12980 - INTEGER(IntKi), PARAMETER :: M57N3TDzss = 12981 - INTEGER(IntKi), PARAMETER :: M57N4TDzss = 12982 - INTEGER(IntKi), PARAMETER :: M57N5TDzss = 12983 - INTEGER(IntKi), PARAMETER :: M57N6TDzss = 12984 - INTEGER(IntKi), PARAMETER :: M57N7TDzss = 12985 - INTEGER(IntKi), PARAMETER :: M57N8TDzss = 12986 - INTEGER(IntKi), PARAMETER :: M57N9TDzss = 12987 - INTEGER(IntKi), PARAMETER :: M58N1TDzss = 12988 - INTEGER(IntKi), PARAMETER :: M58N2TDzss = 12989 - INTEGER(IntKi), PARAMETER :: M58N3TDzss = 12990 - INTEGER(IntKi), PARAMETER :: M58N4TDzss = 12991 - INTEGER(IntKi), PARAMETER :: M58N5TDzss = 12992 - INTEGER(IntKi), PARAMETER :: M58N6TDzss = 12993 - INTEGER(IntKi), PARAMETER :: M58N7TDzss = 12994 - INTEGER(IntKi), PARAMETER :: M58N8TDzss = 12995 - INTEGER(IntKi), PARAMETER :: M58N9TDzss = 12996 - INTEGER(IntKi), PARAMETER :: M59N1TDzss = 12997 - INTEGER(IntKi), PARAMETER :: M59N2TDzss = 12998 - INTEGER(IntKi), PARAMETER :: M59N3TDzss = 12999 - INTEGER(IntKi), PARAMETER :: M59N4TDzss = 13000 - INTEGER(IntKi), PARAMETER :: M59N5TDzss = 13001 - INTEGER(IntKi), PARAMETER :: M59N6TDzss = 13002 - INTEGER(IntKi), PARAMETER :: M59N7TDzss = 13003 - INTEGER(IntKi), PARAMETER :: M59N8TDzss = 13004 - INTEGER(IntKi), PARAMETER :: M59N9TDzss = 13005 - INTEGER(IntKi), PARAMETER :: M60N1TDzss = 13006 - INTEGER(IntKi), PARAMETER :: M60N2TDzss = 13007 - INTEGER(IntKi), PARAMETER :: M60N3TDzss = 13008 - INTEGER(IntKi), PARAMETER :: M60N4TDzss = 13009 - INTEGER(IntKi), PARAMETER :: M60N5TDzss = 13010 - INTEGER(IntKi), PARAMETER :: M60N6TDzss = 13011 - INTEGER(IntKi), PARAMETER :: M60N7TDzss = 13012 - INTEGER(IntKi), PARAMETER :: M60N8TDzss = 13013 - INTEGER(IntKi), PARAMETER :: M60N9TDzss = 13014 - INTEGER(IntKi), PARAMETER :: M61N1TDzss = 13015 - INTEGER(IntKi), PARAMETER :: M61N2TDzss = 13016 - INTEGER(IntKi), PARAMETER :: M61N3TDzss = 13017 - INTEGER(IntKi), PARAMETER :: M61N4TDzss = 13018 - INTEGER(IntKi), PARAMETER :: M61N5TDzss = 13019 - INTEGER(IntKi), PARAMETER :: M61N6TDzss = 13020 - INTEGER(IntKi), PARAMETER :: M61N7TDzss = 13021 - INTEGER(IntKi), PARAMETER :: M61N8TDzss = 13022 - INTEGER(IntKi), PARAMETER :: M61N9TDzss = 13023 - INTEGER(IntKi), PARAMETER :: M62N1TDzss = 13024 - INTEGER(IntKi), PARAMETER :: M62N2TDzss = 13025 - INTEGER(IntKi), PARAMETER :: M62N3TDzss = 13026 - INTEGER(IntKi), PARAMETER :: M62N4TDzss = 13027 - INTEGER(IntKi), PARAMETER :: M62N5TDzss = 13028 - INTEGER(IntKi), PARAMETER :: M62N6TDzss = 13029 - INTEGER(IntKi), PARAMETER :: M62N7TDzss = 13030 - INTEGER(IntKi), PARAMETER :: M62N8TDzss = 13031 - INTEGER(IntKi), PARAMETER :: M62N9TDzss = 13032 - INTEGER(IntKi), PARAMETER :: M63N1TDzss = 13033 - INTEGER(IntKi), PARAMETER :: M63N2TDzss = 13034 - INTEGER(IntKi), PARAMETER :: M63N3TDzss = 13035 - INTEGER(IntKi), PARAMETER :: M63N4TDzss = 13036 - INTEGER(IntKi), PARAMETER :: M63N5TDzss = 13037 - INTEGER(IntKi), PARAMETER :: M63N6TDzss = 13038 - INTEGER(IntKi), PARAMETER :: M63N7TDzss = 13039 - INTEGER(IntKi), PARAMETER :: M63N8TDzss = 13040 - INTEGER(IntKi), PARAMETER :: M63N9TDzss = 13041 - INTEGER(IntKi), PARAMETER :: M64N1TDzss = 13042 - INTEGER(IntKi), PARAMETER :: M64N2TDzss = 13043 - INTEGER(IntKi), PARAMETER :: M64N3TDzss = 13044 - INTEGER(IntKi), PARAMETER :: M64N4TDzss = 13045 - INTEGER(IntKi), PARAMETER :: M64N5TDzss = 13046 - INTEGER(IntKi), PARAMETER :: M64N6TDzss = 13047 - INTEGER(IntKi), PARAMETER :: M64N7TDzss = 13048 - INTEGER(IntKi), PARAMETER :: M64N8TDzss = 13049 - INTEGER(IntKi), PARAMETER :: M64N9TDzss = 13050 - INTEGER(IntKi), PARAMETER :: M65N1TDzss = 13051 - INTEGER(IntKi), PARAMETER :: M65N2TDzss = 13052 - INTEGER(IntKi), PARAMETER :: M65N3TDzss = 13053 - INTEGER(IntKi), PARAMETER :: M65N4TDzss = 13054 - INTEGER(IntKi), PARAMETER :: M65N5TDzss = 13055 - INTEGER(IntKi), PARAMETER :: M65N6TDzss = 13056 - INTEGER(IntKi), PARAMETER :: M65N7TDzss = 13057 - INTEGER(IntKi), PARAMETER :: M65N8TDzss = 13058 - INTEGER(IntKi), PARAMETER :: M65N9TDzss = 13059 - INTEGER(IntKi), PARAMETER :: M66N1TDzss = 13060 - INTEGER(IntKi), PARAMETER :: M66N2TDzss = 13061 - INTEGER(IntKi), PARAMETER :: M66N3TDzss = 13062 - INTEGER(IntKi), PARAMETER :: M66N4TDzss = 13063 - INTEGER(IntKi), PARAMETER :: M66N5TDzss = 13064 - INTEGER(IntKi), PARAMETER :: M66N6TDzss = 13065 - INTEGER(IntKi), PARAMETER :: M66N7TDzss = 13066 - INTEGER(IntKi), PARAMETER :: M66N8TDzss = 13067 - INTEGER(IntKi), PARAMETER :: M66N9TDzss = 13068 - INTEGER(IntKi), PARAMETER :: M67N1TDzss = 13069 - INTEGER(IntKi), PARAMETER :: M67N2TDzss = 13070 - INTEGER(IntKi), PARAMETER :: M67N3TDzss = 13071 - INTEGER(IntKi), PARAMETER :: M67N4TDzss = 13072 - INTEGER(IntKi), PARAMETER :: M67N5TDzss = 13073 - INTEGER(IntKi), PARAMETER :: M67N6TDzss = 13074 - INTEGER(IntKi), PARAMETER :: M67N7TDzss = 13075 - INTEGER(IntKi), PARAMETER :: M67N8TDzss = 13076 - INTEGER(IntKi), PARAMETER :: M67N9TDzss = 13077 - INTEGER(IntKi), PARAMETER :: M68N1TDzss = 13078 - INTEGER(IntKi), PARAMETER :: M68N2TDzss = 13079 - INTEGER(IntKi), PARAMETER :: M68N3TDzss = 13080 - INTEGER(IntKi), PARAMETER :: M68N4TDzss = 13081 - INTEGER(IntKi), PARAMETER :: M68N5TDzss = 13082 - INTEGER(IntKi), PARAMETER :: M68N6TDzss = 13083 - INTEGER(IntKi), PARAMETER :: M68N7TDzss = 13084 - INTEGER(IntKi), PARAMETER :: M68N8TDzss = 13085 - INTEGER(IntKi), PARAMETER :: M68N9TDzss = 13086 - INTEGER(IntKi), PARAMETER :: M69N1TDzss = 13087 - INTEGER(IntKi), PARAMETER :: M69N2TDzss = 13088 - INTEGER(IntKi), PARAMETER :: M69N3TDzss = 13089 - INTEGER(IntKi), PARAMETER :: M69N4TDzss = 13090 - INTEGER(IntKi), PARAMETER :: M69N5TDzss = 13091 - INTEGER(IntKi), PARAMETER :: M69N6TDzss = 13092 - INTEGER(IntKi), PARAMETER :: M69N7TDzss = 13093 - INTEGER(IntKi), PARAMETER :: M69N8TDzss = 13094 - INTEGER(IntKi), PARAMETER :: M69N9TDzss = 13095 - INTEGER(IntKi), PARAMETER :: M70N1TDzss = 13096 - INTEGER(IntKi), PARAMETER :: M70N2TDzss = 13097 - INTEGER(IntKi), PARAMETER :: M70N3TDzss = 13098 - INTEGER(IntKi), PARAMETER :: M70N4TDzss = 13099 - INTEGER(IntKi), PARAMETER :: M70N5TDzss = 13100 - INTEGER(IntKi), PARAMETER :: M70N6TDzss = 13101 - INTEGER(IntKi), PARAMETER :: M70N7TDzss = 13102 - INTEGER(IntKi), PARAMETER :: M70N8TDzss = 13103 - INTEGER(IntKi), PARAMETER :: M70N9TDzss = 13104 - INTEGER(IntKi), PARAMETER :: M71N1TDzss = 13105 - INTEGER(IntKi), PARAMETER :: M71N2TDzss = 13106 - INTEGER(IntKi), PARAMETER :: M71N3TDzss = 13107 - INTEGER(IntKi), PARAMETER :: M71N4TDzss = 13108 - INTEGER(IntKi), PARAMETER :: M71N5TDzss = 13109 - INTEGER(IntKi), PARAMETER :: M71N6TDzss = 13110 - INTEGER(IntKi), PARAMETER :: M71N7TDzss = 13111 - INTEGER(IntKi), PARAMETER :: M71N8TDzss = 13112 - INTEGER(IntKi), PARAMETER :: M71N9TDzss = 13113 - INTEGER(IntKi), PARAMETER :: M72N1TDzss = 13114 - INTEGER(IntKi), PARAMETER :: M72N2TDzss = 13115 - INTEGER(IntKi), PARAMETER :: M72N3TDzss = 13116 - INTEGER(IntKi), PARAMETER :: M72N4TDzss = 13117 - INTEGER(IntKi), PARAMETER :: M72N5TDzss = 13118 - INTEGER(IntKi), PARAMETER :: M72N6TDzss = 13119 - INTEGER(IntKi), PARAMETER :: M72N7TDzss = 13120 - INTEGER(IntKi), PARAMETER :: M72N8TDzss = 13121 - INTEGER(IntKi), PARAMETER :: M72N9TDzss = 13122 - INTEGER(IntKi), PARAMETER :: M73N1TDzss = 13123 - INTEGER(IntKi), PARAMETER :: M73N2TDzss = 13124 - INTEGER(IntKi), PARAMETER :: M73N3TDzss = 13125 - INTEGER(IntKi), PARAMETER :: M73N4TDzss = 13126 - INTEGER(IntKi), PARAMETER :: M73N5TDzss = 13127 - INTEGER(IntKi), PARAMETER :: M73N6TDzss = 13128 - INTEGER(IntKi), PARAMETER :: M73N7TDzss = 13129 - INTEGER(IntKi), PARAMETER :: M73N8TDzss = 13130 - INTEGER(IntKi), PARAMETER :: M73N9TDzss = 13131 - INTEGER(IntKi), PARAMETER :: M74N1TDzss = 13132 - INTEGER(IntKi), PARAMETER :: M74N2TDzss = 13133 - INTEGER(IntKi), PARAMETER :: M74N3TDzss = 13134 - INTEGER(IntKi), PARAMETER :: M74N4TDzss = 13135 - INTEGER(IntKi), PARAMETER :: M74N5TDzss = 13136 - INTEGER(IntKi), PARAMETER :: M74N6TDzss = 13137 - INTEGER(IntKi), PARAMETER :: M74N7TDzss = 13138 - INTEGER(IntKi), PARAMETER :: M74N8TDzss = 13139 - INTEGER(IntKi), PARAMETER :: M74N9TDzss = 13140 - INTEGER(IntKi), PARAMETER :: M75N1TDzss = 13141 - INTEGER(IntKi), PARAMETER :: M75N2TDzss = 13142 - INTEGER(IntKi), PARAMETER :: M75N3TDzss = 13143 - INTEGER(IntKi), PARAMETER :: M75N4TDzss = 13144 - INTEGER(IntKi), PARAMETER :: M75N5TDzss = 13145 - INTEGER(IntKi), PARAMETER :: M75N6TDzss = 13146 - INTEGER(IntKi), PARAMETER :: M75N7TDzss = 13147 - INTEGER(IntKi), PARAMETER :: M75N8TDzss = 13148 - INTEGER(IntKi), PARAMETER :: M75N9TDzss = 13149 - INTEGER(IntKi), PARAMETER :: M76N1TDzss = 13150 - INTEGER(IntKi), PARAMETER :: M76N2TDzss = 13151 - INTEGER(IntKi), PARAMETER :: M76N3TDzss = 13152 - INTEGER(IntKi), PARAMETER :: M76N4TDzss = 13153 - INTEGER(IntKi), PARAMETER :: M76N5TDzss = 13154 - INTEGER(IntKi), PARAMETER :: M76N6TDzss = 13155 - INTEGER(IntKi), PARAMETER :: M76N7TDzss = 13156 - INTEGER(IntKi), PARAMETER :: M76N8TDzss = 13157 - INTEGER(IntKi), PARAMETER :: M76N9TDzss = 13158 - INTEGER(IntKi), PARAMETER :: M77N1TDzss = 13159 - INTEGER(IntKi), PARAMETER :: M77N2TDzss = 13160 - INTEGER(IntKi), PARAMETER :: M77N3TDzss = 13161 - INTEGER(IntKi), PARAMETER :: M77N4TDzss = 13162 - INTEGER(IntKi), PARAMETER :: M77N5TDzss = 13163 - INTEGER(IntKi), PARAMETER :: M77N6TDzss = 13164 - INTEGER(IntKi), PARAMETER :: M77N7TDzss = 13165 - INTEGER(IntKi), PARAMETER :: M77N8TDzss = 13166 - INTEGER(IntKi), PARAMETER :: M77N9TDzss = 13167 - INTEGER(IntKi), PARAMETER :: M78N1TDzss = 13168 - INTEGER(IntKi), PARAMETER :: M78N2TDzss = 13169 - INTEGER(IntKi), PARAMETER :: M78N3TDzss = 13170 - INTEGER(IntKi), PARAMETER :: M78N4TDzss = 13171 - INTEGER(IntKi), PARAMETER :: M78N5TDzss = 13172 - INTEGER(IntKi), PARAMETER :: M78N6TDzss = 13173 - INTEGER(IntKi), PARAMETER :: M78N7TDzss = 13174 - INTEGER(IntKi), PARAMETER :: M78N8TDzss = 13175 - INTEGER(IntKi), PARAMETER :: M78N9TDzss = 13176 - INTEGER(IntKi), PARAMETER :: M79N1TDzss = 13177 - INTEGER(IntKi), PARAMETER :: M79N2TDzss = 13178 - INTEGER(IntKi), PARAMETER :: M79N3TDzss = 13179 - INTEGER(IntKi), PARAMETER :: M79N4TDzss = 13180 - INTEGER(IntKi), PARAMETER :: M79N5TDzss = 13181 - INTEGER(IntKi), PARAMETER :: M79N6TDzss = 13182 - INTEGER(IntKi), PARAMETER :: M79N7TDzss = 13183 - INTEGER(IntKi), PARAMETER :: M79N8TDzss = 13184 - INTEGER(IntKi), PARAMETER :: M79N9TDzss = 13185 - INTEGER(IntKi), PARAMETER :: M80N1TDzss = 13186 - INTEGER(IntKi), PARAMETER :: M80N2TDzss = 13187 - INTEGER(IntKi), PARAMETER :: M80N3TDzss = 13188 - INTEGER(IntKi), PARAMETER :: M80N4TDzss = 13189 - INTEGER(IntKi), PARAMETER :: M80N5TDzss = 13190 - INTEGER(IntKi), PARAMETER :: M80N6TDzss = 13191 - INTEGER(IntKi), PARAMETER :: M80N7TDzss = 13192 - INTEGER(IntKi), PARAMETER :: M80N8TDzss = 13193 - INTEGER(IntKi), PARAMETER :: M80N9TDzss = 13194 - INTEGER(IntKi), PARAMETER :: M81N1TDzss = 13195 - INTEGER(IntKi), PARAMETER :: M81N2TDzss = 13196 - INTEGER(IntKi), PARAMETER :: M81N3TDzss = 13197 - INTEGER(IntKi), PARAMETER :: M81N4TDzss = 13198 - INTEGER(IntKi), PARAMETER :: M81N5TDzss = 13199 - INTEGER(IntKi), PARAMETER :: M81N6TDzss = 13200 - INTEGER(IntKi), PARAMETER :: M81N7TDzss = 13201 - INTEGER(IntKi), PARAMETER :: M81N8TDzss = 13202 - INTEGER(IntKi), PARAMETER :: M81N9TDzss = 13203 - INTEGER(IntKi), PARAMETER :: M82N1TDzss = 13204 - INTEGER(IntKi), PARAMETER :: M82N2TDzss = 13205 - INTEGER(IntKi), PARAMETER :: M82N3TDzss = 13206 - INTEGER(IntKi), PARAMETER :: M82N4TDzss = 13207 - INTEGER(IntKi), PARAMETER :: M82N5TDzss = 13208 - INTEGER(IntKi), PARAMETER :: M82N6TDzss = 13209 - INTEGER(IntKi), PARAMETER :: M82N7TDzss = 13210 - INTEGER(IntKi), PARAMETER :: M82N8TDzss = 13211 - INTEGER(IntKi), PARAMETER :: M82N9TDzss = 13212 - INTEGER(IntKi), PARAMETER :: M83N1TDzss = 13213 - INTEGER(IntKi), PARAMETER :: M83N2TDzss = 13214 - INTEGER(IntKi), PARAMETER :: M83N3TDzss = 13215 - INTEGER(IntKi), PARAMETER :: M83N4TDzss = 13216 - INTEGER(IntKi), PARAMETER :: M83N5TDzss = 13217 - INTEGER(IntKi), PARAMETER :: M83N6TDzss = 13218 - INTEGER(IntKi), PARAMETER :: M83N7TDzss = 13219 - INTEGER(IntKi), PARAMETER :: M83N8TDzss = 13220 - INTEGER(IntKi), PARAMETER :: M83N9TDzss = 13221 - INTEGER(IntKi), PARAMETER :: M84N1TDzss = 13222 - INTEGER(IntKi), PARAMETER :: M84N2TDzss = 13223 - INTEGER(IntKi), PARAMETER :: M84N3TDzss = 13224 - INTEGER(IntKi), PARAMETER :: M84N4TDzss = 13225 - INTEGER(IntKi), PARAMETER :: M84N5TDzss = 13226 - INTEGER(IntKi), PARAMETER :: M84N6TDzss = 13227 - INTEGER(IntKi), PARAMETER :: M84N7TDzss = 13228 - INTEGER(IntKi), PARAMETER :: M84N8TDzss = 13229 - INTEGER(IntKi), PARAMETER :: M84N9TDzss = 13230 - INTEGER(IntKi), PARAMETER :: M85N1TDzss = 13231 - INTEGER(IntKi), PARAMETER :: M85N2TDzss = 13232 - INTEGER(IntKi), PARAMETER :: M85N3TDzss = 13233 - INTEGER(IntKi), PARAMETER :: M85N4TDzss = 13234 - INTEGER(IntKi), PARAMETER :: M85N5TDzss = 13235 - INTEGER(IntKi), PARAMETER :: M85N6TDzss = 13236 - INTEGER(IntKi), PARAMETER :: M85N7TDzss = 13237 - INTEGER(IntKi), PARAMETER :: M85N8TDzss = 13238 - INTEGER(IntKi), PARAMETER :: M85N9TDzss = 13239 - INTEGER(IntKi), PARAMETER :: M86N1TDzss = 13240 - INTEGER(IntKi), PARAMETER :: M86N2TDzss = 13241 - INTEGER(IntKi), PARAMETER :: M86N3TDzss = 13242 - INTEGER(IntKi), PARAMETER :: M86N4TDzss = 13243 - INTEGER(IntKi), PARAMETER :: M86N5TDzss = 13244 - INTEGER(IntKi), PARAMETER :: M86N6TDzss = 13245 - INTEGER(IntKi), PARAMETER :: M86N7TDzss = 13246 - INTEGER(IntKi), PARAMETER :: M86N8TDzss = 13247 - INTEGER(IntKi), PARAMETER :: M86N9TDzss = 13248 - INTEGER(IntKi), PARAMETER :: M87N1TDzss = 13249 - INTEGER(IntKi), PARAMETER :: M87N2TDzss = 13250 - INTEGER(IntKi), PARAMETER :: M87N3TDzss = 13251 - INTEGER(IntKi), PARAMETER :: M87N4TDzss = 13252 - INTEGER(IntKi), PARAMETER :: M87N5TDzss = 13253 - INTEGER(IntKi), PARAMETER :: M87N6TDzss = 13254 - INTEGER(IntKi), PARAMETER :: M87N7TDzss = 13255 - INTEGER(IntKi), PARAMETER :: M87N8TDzss = 13256 - INTEGER(IntKi), PARAMETER :: M87N9TDzss = 13257 - INTEGER(IntKi), PARAMETER :: M88N1TDzss = 13258 - INTEGER(IntKi), PARAMETER :: M88N2TDzss = 13259 - INTEGER(IntKi), PARAMETER :: M88N3TDzss = 13260 - INTEGER(IntKi), PARAMETER :: M88N4TDzss = 13261 - INTEGER(IntKi), PARAMETER :: M88N5TDzss = 13262 - INTEGER(IntKi), PARAMETER :: M88N6TDzss = 13263 - INTEGER(IntKi), PARAMETER :: M88N7TDzss = 13264 - INTEGER(IntKi), PARAMETER :: M88N8TDzss = 13265 - INTEGER(IntKi), PARAMETER :: M88N9TDzss = 13266 - INTEGER(IntKi), PARAMETER :: M89N1TDzss = 13267 - INTEGER(IntKi), PARAMETER :: M89N2TDzss = 13268 - INTEGER(IntKi), PARAMETER :: M89N3TDzss = 13269 - INTEGER(IntKi), PARAMETER :: M89N4TDzss = 13270 - INTEGER(IntKi), PARAMETER :: M89N5TDzss = 13271 - INTEGER(IntKi), PARAMETER :: M89N6TDzss = 13272 - INTEGER(IntKi), PARAMETER :: M89N7TDzss = 13273 - INTEGER(IntKi), PARAMETER :: M89N8TDzss = 13274 - INTEGER(IntKi), PARAMETER :: M89N9TDzss = 13275 - INTEGER(IntKi), PARAMETER :: M90N1TDzss = 13276 - INTEGER(IntKi), PARAMETER :: M90N2TDzss = 13277 - INTEGER(IntKi), PARAMETER :: M90N3TDzss = 13278 - INTEGER(IntKi), PARAMETER :: M90N4TDzss = 13279 - INTEGER(IntKi), PARAMETER :: M90N5TDzss = 13280 - INTEGER(IntKi), PARAMETER :: M90N6TDzss = 13281 - INTEGER(IntKi), PARAMETER :: M90N7TDzss = 13282 - INTEGER(IntKi), PARAMETER :: M90N8TDzss = 13283 - INTEGER(IntKi), PARAMETER :: M90N9TDzss = 13284 - INTEGER(IntKi), PARAMETER :: M91N1TDzss = 13285 - INTEGER(IntKi), PARAMETER :: M91N2TDzss = 13286 - INTEGER(IntKi), PARAMETER :: M91N3TDzss = 13287 - INTEGER(IntKi), PARAMETER :: M91N4TDzss = 13288 - INTEGER(IntKi), PARAMETER :: M91N5TDzss = 13289 - INTEGER(IntKi), PARAMETER :: M91N6TDzss = 13290 - INTEGER(IntKi), PARAMETER :: M91N7TDzss = 13291 - INTEGER(IntKi), PARAMETER :: M91N8TDzss = 13292 - INTEGER(IntKi), PARAMETER :: M91N9TDzss = 13293 - INTEGER(IntKi), PARAMETER :: M92N1TDzss = 13294 - INTEGER(IntKi), PARAMETER :: M92N2TDzss = 13295 - INTEGER(IntKi), PARAMETER :: M92N3TDzss = 13296 - INTEGER(IntKi), PARAMETER :: M92N4TDzss = 13297 - INTEGER(IntKi), PARAMETER :: M92N5TDzss = 13298 - INTEGER(IntKi), PARAMETER :: M92N6TDzss = 13299 - INTEGER(IntKi), PARAMETER :: M92N7TDzss = 13300 - INTEGER(IntKi), PARAMETER :: M92N8TDzss = 13301 - INTEGER(IntKi), PARAMETER :: M92N9TDzss = 13302 - INTEGER(IntKi), PARAMETER :: M93N1TDzss = 13303 - INTEGER(IntKi), PARAMETER :: M93N2TDzss = 13304 - INTEGER(IntKi), PARAMETER :: M93N3TDzss = 13305 - INTEGER(IntKi), PARAMETER :: M93N4TDzss = 13306 - INTEGER(IntKi), PARAMETER :: M93N5TDzss = 13307 - INTEGER(IntKi), PARAMETER :: M93N6TDzss = 13308 - INTEGER(IntKi), PARAMETER :: M93N7TDzss = 13309 - INTEGER(IntKi), PARAMETER :: M93N8TDzss = 13310 - INTEGER(IntKi), PARAMETER :: M93N9TDzss = 13311 - INTEGER(IntKi), PARAMETER :: M94N1TDzss = 13312 - INTEGER(IntKi), PARAMETER :: M94N2TDzss = 13313 - INTEGER(IntKi), PARAMETER :: M94N3TDzss = 13314 - INTEGER(IntKi), PARAMETER :: M94N4TDzss = 13315 - INTEGER(IntKi), PARAMETER :: M94N5TDzss = 13316 - INTEGER(IntKi), PARAMETER :: M94N6TDzss = 13317 - INTEGER(IntKi), PARAMETER :: M94N7TDzss = 13318 - INTEGER(IntKi), PARAMETER :: M94N8TDzss = 13319 - INTEGER(IntKi), PARAMETER :: M94N9TDzss = 13320 - INTEGER(IntKi), PARAMETER :: M95N1TDzss = 13321 - INTEGER(IntKi), PARAMETER :: M95N2TDzss = 13322 - INTEGER(IntKi), PARAMETER :: M95N3TDzss = 13323 - INTEGER(IntKi), PARAMETER :: M95N4TDzss = 13324 - INTEGER(IntKi), PARAMETER :: M95N5TDzss = 13325 - INTEGER(IntKi), PARAMETER :: M95N6TDzss = 13326 - INTEGER(IntKi), PARAMETER :: M95N7TDzss = 13327 - INTEGER(IntKi), PARAMETER :: M95N8TDzss = 13328 - INTEGER(IntKi), PARAMETER :: M95N9TDzss = 13329 - INTEGER(IntKi), PARAMETER :: M96N1TDzss = 13330 - INTEGER(IntKi), PARAMETER :: M96N2TDzss = 13331 - INTEGER(IntKi), PARAMETER :: M96N3TDzss = 13332 - INTEGER(IntKi), PARAMETER :: M96N4TDzss = 13333 - INTEGER(IntKi), PARAMETER :: M96N5TDzss = 13334 - INTEGER(IntKi), PARAMETER :: M96N6TDzss = 13335 - INTEGER(IntKi), PARAMETER :: M96N7TDzss = 13336 - INTEGER(IntKi), PARAMETER :: M96N8TDzss = 13337 - INTEGER(IntKi), PARAMETER :: M96N9TDzss = 13338 - INTEGER(IntKi), PARAMETER :: M97N1TDzss = 13339 - INTEGER(IntKi), PARAMETER :: M97N2TDzss = 13340 - INTEGER(IntKi), PARAMETER :: M97N3TDzss = 13341 - INTEGER(IntKi), PARAMETER :: M97N4TDzss = 13342 - INTEGER(IntKi), PARAMETER :: M97N5TDzss = 13343 - INTEGER(IntKi), PARAMETER :: M97N6TDzss = 13344 - INTEGER(IntKi), PARAMETER :: M97N7TDzss = 13345 - INTEGER(IntKi), PARAMETER :: M97N8TDzss = 13346 - INTEGER(IntKi), PARAMETER :: M97N9TDzss = 13347 - INTEGER(IntKi), PARAMETER :: M98N1TDzss = 13348 - INTEGER(IntKi), PARAMETER :: M98N2TDzss = 13349 - INTEGER(IntKi), PARAMETER :: M98N3TDzss = 13350 - INTEGER(IntKi), PARAMETER :: M98N4TDzss = 13351 - INTEGER(IntKi), PARAMETER :: M98N5TDzss = 13352 - INTEGER(IntKi), PARAMETER :: M98N6TDzss = 13353 - INTEGER(IntKi), PARAMETER :: M98N7TDzss = 13354 - INTEGER(IntKi), PARAMETER :: M98N8TDzss = 13355 - INTEGER(IntKi), PARAMETER :: M98N9TDzss = 13356 - INTEGER(IntKi), PARAMETER :: M99N1TDzss = 13357 - INTEGER(IntKi), PARAMETER :: M99N2TDzss = 13358 - INTEGER(IntKi), PARAMETER :: M99N3TDzss = 13359 - INTEGER(IntKi), PARAMETER :: M99N4TDzss = 13360 - INTEGER(IntKi), PARAMETER :: M99N5TDzss = 13361 - INTEGER(IntKi), PARAMETER :: M99N6TDzss = 13362 - INTEGER(IntKi), PARAMETER :: M99N7TDzss = 13363 - INTEGER(IntKi), PARAMETER :: M99N8TDzss = 13364 - INTEGER(IntKi), PARAMETER :: M99N9TDzss = 13365 - INTEGER(IntKi), PARAMETER :: M01N1RDxe = 13366 - INTEGER(IntKi), PARAMETER :: M01N2RDxe = 13367 - INTEGER(IntKi), PARAMETER :: M01N3RDxe = 13368 - INTEGER(IntKi), PARAMETER :: M01N4RDxe = 13369 - INTEGER(IntKi), PARAMETER :: M01N5RDxe = 13370 - INTEGER(IntKi), PARAMETER :: M01N6RDxe = 13371 - INTEGER(IntKi), PARAMETER :: M01N7RDxe = 13372 - INTEGER(IntKi), PARAMETER :: M01N8RDxe = 13373 - INTEGER(IntKi), PARAMETER :: M01N9RDxe = 13374 - INTEGER(IntKi), PARAMETER :: M02N1RDxe = 13375 - INTEGER(IntKi), PARAMETER :: M02N2RDxe = 13376 - INTEGER(IntKi), PARAMETER :: M02N3RDxe = 13377 - INTEGER(IntKi), PARAMETER :: M02N4RDxe = 13378 - INTEGER(IntKi), PARAMETER :: M02N5RDxe = 13379 - INTEGER(IntKi), PARAMETER :: M02N6RDxe = 13380 - INTEGER(IntKi), PARAMETER :: M02N7RDxe = 13381 - INTEGER(IntKi), PARAMETER :: M02N8RDxe = 13382 - INTEGER(IntKi), PARAMETER :: M02N9RDxe = 13383 - INTEGER(IntKi), PARAMETER :: M03N1RDxe = 13384 - INTEGER(IntKi), PARAMETER :: M03N2RDxe = 13385 - INTEGER(IntKi), PARAMETER :: M03N3RDxe = 13386 - INTEGER(IntKi), PARAMETER :: M03N4RDxe = 13387 - INTEGER(IntKi), PARAMETER :: M03N5RDxe = 13388 - INTEGER(IntKi), PARAMETER :: M03N6RDxe = 13389 - INTEGER(IntKi), PARAMETER :: M03N7RDxe = 13390 - INTEGER(IntKi), PARAMETER :: M03N8RDxe = 13391 - INTEGER(IntKi), PARAMETER :: M03N9RDxe = 13392 - INTEGER(IntKi), PARAMETER :: M04N1RDxe = 13393 - INTEGER(IntKi), PARAMETER :: M04N2RDxe = 13394 - INTEGER(IntKi), PARAMETER :: M04N3RDxe = 13395 - INTEGER(IntKi), PARAMETER :: M04N4RDxe = 13396 - INTEGER(IntKi), PARAMETER :: M04N5RDxe = 13397 - INTEGER(IntKi), PARAMETER :: M04N6RDxe = 13398 - INTEGER(IntKi), PARAMETER :: M04N7RDxe = 13399 - INTEGER(IntKi), PARAMETER :: M04N8RDxe = 13400 - INTEGER(IntKi), PARAMETER :: M04N9RDxe = 13401 - INTEGER(IntKi), PARAMETER :: M05N1RDxe = 13402 - INTEGER(IntKi), PARAMETER :: M05N2RDxe = 13403 - INTEGER(IntKi), PARAMETER :: M05N3RDxe = 13404 - INTEGER(IntKi), PARAMETER :: M05N4RDxe = 13405 - INTEGER(IntKi), PARAMETER :: M05N5RDxe = 13406 - INTEGER(IntKi), PARAMETER :: M05N6RDxe = 13407 - INTEGER(IntKi), PARAMETER :: M05N7RDxe = 13408 - INTEGER(IntKi), PARAMETER :: M05N8RDxe = 13409 - INTEGER(IntKi), PARAMETER :: M05N9RDxe = 13410 - INTEGER(IntKi), PARAMETER :: M06N1RDxe = 13411 - INTEGER(IntKi), PARAMETER :: M06N2RDxe = 13412 - INTEGER(IntKi), PARAMETER :: M06N3RDxe = 13413 - INTEGER(IntKi), PARAMETER :: M06N4RDxe = 13414 - INTEGER(IntKi), PARAMETER :: M06N5RDxe = 13415 - INTEGER(IntKi), PARAMETER :: M06N6RDxe = 13416 - INTEGER(IntKi), PARAMETER :: M06N7RDxe = 13417 - INTEGER(IntKi), PARAMETER :: M06N8RDxe = 13418 - INTEGER(IntKi), PARAMETER :: M06N9RDxe = 13419 - INTEGER(IntKi), PARAMETER :: M07N1RDxe = 13420 - INTEGER(IntKi), PARAMETER :: M07N2RDxe = 13421 - INTEGER(IntKi), PARAMETER :: M07N3RDxe = 13422 - INTEGER(IntKi), PARAMETER :: M07N4RDxe = 13423 - INTEGER(IntKi), PARAMETER :: M07N5RDxe = 13424 - INTEGER(IntKi), PARAMETER :: M07N6RDxe = 13425 - INTEGER(IntKi), PARAMETER :: M07N7RDxe = 13426 - INTEGER(IntKi), PARAMETER :: M07N8RDxe = 13427 - INTEGER(IntKi), PARAMETER :: M07N9RDxe = 13428 - INTEGER(IntKi), PARAMETER :: M08N1RDxe = 13429 - INTEGER(IntKi), PARAMETER :: M08N2RDxe = 13430 - INTEGER(IntKi), PARAMETER :: M08N3RDxe = 13431 - INTEGER(IntKi), PARAMETER :: M08N4RDxe = 13432 - INTEGER(IntKi), PARAMETER :: M08N5RDxe = 13433 - INTEGER(IntKi), PARAMETER :: M08N6RDxe = 13434 - INTEGER(IntKi), PARAMETER :: M08N7RDxe = 13435 - INTEGER(IntKi), PARAMETER :: M08N8RDxe = 13436 - INTEGER(IntKi), PARAMETER :: M08N9RDxe = 13437 - INTEGER(IntKi), PARAMETER :: M09N1RDxe = 13438 - INTEGER(IntKi), PARAMETER :: M09N2RDxe = 13439 - INTEGER(IntKi), PARAMETER :: M09N3RDxe = 13440 - INTEGER(IntKi), PARAMETER :: M09N4RDxe = 13441 - INTEGER(IntKi), PARAMETER :: M09N5RDxe = 13442 - INTEGER(IntKi), PARAMETER :: M09N6RDxe = 13443 - INTEGER(IntKi), PARAMETER :: M09N7RDxe = 13444 - INTEGER(IntKi), PARAMETER :: M09N8RDxe = 13445 - INTEGER(IntKi), PARAMETER :: M09N9RDxe = 13446 - INTEGER(IntKi), PARAMETER :: M10N1RDxe = 13447 - INTEGER(IntKi), PARAMETER :: M10N2RDxe = 13448 - INTEGER(IntKi), PARAMETER :: M10N3RDxe = 13449 - INTEGER(IntKi), PARAMETER :: M10N4RDxe = 13450 - INTEGER(IntKi), PARAMETER :: M10N5RDxe = 13451 - INTEGER(IntKi), PARAMETER :: M10N6RDxe = 13452 - INTEGER(IntKi), PARAMETER :: M10N7RDxe = 13453 - INTEGER(IntKi), PARAMETER :: M10N8RDxe = 13454 - INTEGER(IntKi), PARAMETER :: M10N9RDxe = 13455 - INTEGER(IntKi), PARAMETER :: M11N1RDxe = 13456 - INTEGER(IntKi), PARAMETER :: M11N2RDxe = 13457 - INTEGER(IntKi), PARAMETER :: M11N3RDxe = 13458 - INTEGER(IntKi), PARAMETER :: M11N4RDxe = 13459 - INTEGER(IntKi), PARAMETER :: M11N5RDxe = 13460 - INTEGER(IntKi), PARAMETER :: M11N6RDxe = 13461 - INTEGER(IntKi), PARAMETER :: M11N7RDxe = 13462 - INTEGER(IntKi), PARAMETER :: M11N8RDxe = 13463 - INTEGER(IntKi), PARAMETER :: M11N9RDxe = 13464 - INTEGER(IntKi), PARAMETER :: M12N1RDxe = 13465 - INTEGER(IntKi), PARAMETER :: M12N2RDxe = 13466 - INTEGER(IntKi), PARAMETER :: M12N3RDxe = 13467 - INTEGER(IntKi), PARAMETER :: M12N4RDxe = 13468 - INTEGER(IntKi), PARAMETER :: M12N5RDxe = 13469 - INTEGER(IntKi), PARAMETER :: M12N6RDxe = 13470 - INTEGER(IntKi), PARAMETER :: M12N7RDxe = 13471 - INTEGER(IntKi), PARAMETER :: M12N8RDxe = 13472 - INTEGER(IntKi), PARAMETER :: M12N9RDxe = 13473 - INTEGER(IntKi), PARAMETER :: M13N1RDxe = 13474 - INTEGER(IntKi), PARAMETER :: M13N2RDxe = 13475 - INTEGER(IntKi), PARAMETER :: M13N3RDxe = 13476 - INTEGER(IntKi), PARAMETER :: M13N4RDxe = 13477 - INTEGER(IntKi), PARAMETER :: M13N5RDxe = 13478 - INTEGER(IntKi), PARAMETER :: M13N6RDxe = 13479 - INTEGER(IntKi), PARAMETER :: M13N7RDxe = 13480 - INTEGER(IntKi), PARAMETER :: M13N8RDxe = 13481 - INTEGER(IntKi), PARAMETER :: M13N9RDxe = 13482 - INTEGER(IntKi), PARAMETER :: M14N1RDxe = 13483 - INTEGER(IntKi), PARAMETER :: M14N2RDxe = 13484 - INTEGER(IntKi), PARAMETER :: M14N3RDxe = 13485 - INTEGER(IntKi), PARAMETER :: M14N4RDxe = 13486 - INTEGER(IntKi), PARAMETER :: M14N5RDxe = 13487 - INTEGER(IntKi), PARAMETER :: M14N6RDxe = 13488 - INTEGER(IntKi), PARAMETER :: M14N7RDxe = 13489 - INTEGER(IntKi), PARAMETER :: M14N8RDxe = 13490 - INTEGER(IntKi), PARAMETER :: M14N9RDxe = 13491 - INTEGER(IntKi), PARAMETER :: M15N1RDxe = 13492 - INTEGER(IntKi), PARAMETER :: M15N2RDxe = 13493 - INTEGER(IntKi), PARAMETER :: M15N3RDxe = 13494 - INTEGER(IntKi), PARAMETER :: M15N4RDxe = 13495 - INTEGER(IntKi), PARAMETER :: M15N5RDxe = 13496 - INTEGER(IntKi), PARAMETER :: M15N6RDxe = 13497 - INTEGER(IntKi), PARAMETER :: M15N7RDxe = 13498 - INTEGER(IntKi), PARAMETER :: M15N8RDxe = 13499 - INTEGER(IntKi), PARAMETER :: M15N9RDxe = 13500 - INTEGER(IntKi), PARAMETER :: M16N1RDxe = 13501 - INTEGER(IntKi), PARAMETER :: M16N2RDxe = 13502 - INTEGER(IntKi), PARAMETER :: M16N3RDxe = 13503 - INTEGER(IntKi), PARAMETER :: M16N4RDxe = 13504 - INTEGER(IntKi), PARAMETER :: M16N5RDxe = 13505 - INTEGER(IntKi), PARAMETER :: M16N6RDxe = 13506 - INTEGER(IntKi), PARAMETER :: M16N7RDxe = 13507 - INTEGER(IntKi), PARAMETER :: M16N8RDxe = 13508 - INTEGER(IntKi), PARAMETER :: M16N9RDxe = 13509 - INTEGER(IntKi), PARAMETER :: M17N1RDxe = 13510 - INTEGER(IntKi), PARAMETER :: M17N2RDxe = 13511 - INTEGER(IntKi), PARAMETER :: M17N3RDxe = 13512 - INTEGER(IntKi), PARAMETER :: M17N4RDxe = 13513 - INTEGER(IntKi), PARAMETER :: M17N5RDxe = 13514 - INTEGER(IntKi), PARAMETER :: M17N6RDxe = 13515 - INTEGER(IntKi), PARAMETER :: M17N7RDxe = 13516 - INTEGER(IntKi), PARAMETER :: M17N8RDxe = 13517 - INTEGER(IntKi), PARAMETER :: M17N9RDxe = 13518 - INTEGER(IntKi), PARAMETER :: M18N1RDxe = 13519 - INTEGER(IntKi), PARAMETER :: M18N2RDxe = 13520 - INTEGER(IntKi), PARAMETER :: M18N3RDxe = 13521 - INTEGER(IntKi), PARAMETER :: M18N4RDxe = 13522 - INTEGER(IntKi), PARAMETER :: M18N5RDxe = 13523 - INTEGER(IntKi), PARAMETER :: M18N6RDxe = 13524 - INTEGER(IntKi), PARAMETER :: M18N7RDxe = 13525 - INTEGER(IntKi), PARAMETER :: M18N8RDxe = 13526 - INTEGER(IntKi), PARAMETER :: M18N9RDxe = 13527 - INTEGER(IntKi), PARAMETER :: M19N1RDxe = 13528 - INTEGER(IntKi), PARAMETER :: M19N2RDxe = 13529 - INTEGER(IntKi), PARAMETER :: M19N3RDxe = 13530 - INTEGER(IntKi), PARAMETER :: M19N4RDxe = 13531 - INTEGER(IntKi), PARAMETER :: M19N5RDxe = 13532 - INTEGER(IntKi), PARAMETER :: M19N6RDxe = 13533 - INTEGER(IntKi), PARAMETER :: M19N7RDxe = 13534 - INTEGER(IntKi), PARAMETER :: M19N8RDxe = 13535 - INTEGER(IntKi), PARAMETER :: M19N9RDxe = 13536 - INTEGER(IntKi), PARAMETER :: M20N1RDxe = 13537 - INTEGER(IntKi), PARAMETER :: M20N2RDxe = 13538 - INTEGER(IntKi), PARAMETER :: M20N3RDxe = 13539 - INTEGER(IntKi), PARAMETER :: M20N4RDxe = 13540 - INTEGER(IntKi), PARAMETER :: M20N5RDxe = 13541 - INTEGER(IntKi), PARAMETER :: M20N6RDxe = 13542 - INTEGER(IntKi), PARAMETER :: M20N7RDxe = 13543 - INTEGER(IntKi), PARAMETER :: M20N8RDxe = 13544 - INTEGER(IntKi), PARAMETER :: M20N9RDxe = 13545 - INTEGER(IntKi), PARAMETER :: M21N1RDxe = 13546 - INTEGER(IntKi), PARAMETER :: M21N2RDxe = 13547 - INTEGER(IntKi), PARAMETER :: M21N3RDxe = 13548 - INTEGER(IntKi), PARAMETER :: M21N4RDxe = 13549 - INTEGER(IntKi), PARAMETER :: M21N5RDxe = 13550 - INTEGER(IntKi), PARAMETER :: M21N6RDxe = 13551 - INTEGER(IntKi), PARAMETER :: M21N7RDxe = 13552 - INTEGER(IntKi), PARAMETER :: M21N8RDxe = 13553 - INTEGER(IntKi), PARAMETER :: M21N9RDxe = 13554 - INTEGER(IntKi), PARAMETER :: M22N1RDxe = 13555 - INTEGER(IntKi), PARAMETER :: M22N2RDxe = 13556 - INTEGER(IntKi), PARAMETER :: M22N3RDxe = 13557 - INTEGER(IntKi), PARAMETER :: M22N4RDxe = 13558 - INTEGER(IntKi), PARAMETER :: M22N5RDxe = 13559 - INTEGER(IntKi), PARAMETER :: M22N6RDxe = 13560 - INTEGER(IntKi), PARAMETER :: M22N7RDxe = 13561 - INTEGER(IntKi), PARAMETER :: M22N8RDxe = 13562 - INTEGER(IntKi), PARAMETER :: M22N9RDxe = 13563 - INTEGER(IntKi), PARAMETER :: M23N1RDxe = 13564 - INTEGER(IntKi), PARAMETER :: M23N2RDxe = 13565 - INTEGER(IntKi), PARAMETER :: M23N3RDxe = 13566 - INTEGER(IntKi), PARAMETER :: M23N4RDxe = 13567 - INTEGER(IntKi), PARAMETER :: M23N5RDxe = 13568 - INTEGER(IntKi), PARAMETER :: M23N6RDxe = 13569 - INTEGER(IntKi), PARAMETER :: M23N7RDxe = 13570 - INTEGER(IntKi), PARAMETER :: M23N8RDxe = 13571 - INTEGER(IntKi), PARAMETER :: M23N9RDxe = 13572 - INTEGER(IntKi), PARAMETER :: M24N1RDxe = 13573 - INTEGER(IntKi), PARAMETER :: M24N2RDxe = 13574 - INTEGER(IntKi), PARAMETER :: M24N3RDxe = 13575 - INTEGER(IntKi), PARAMETER :: M24N4RDxe = 13576 - INTEGER(IntKi), PARAMETER :: M24N5RDxe = 13577 - INTEGER(IntKi), PARAMETER :: M24N6RDxe = 13578 - INTEGER(IntKi), PARAMETER :: M24N7RDxe = 13579 - INTEGER(IntKi), PARAMETER :: M24N8RDxe = 13580 - INTEGER(IntKi), PARAMETER :: M24N9RDxe = 13581 - INTEGER(IntKi), PARAMETER :: M25N1RDxe = 13582 - INTEGER(IntKi), PARAMETER :: M25N2RDxe = 13583 - INTEGER(IntKi), PARAMETER :: M25N3RDxe = 13584 - INTEGER(IntKi), PARAMETER :: M25N4RDxe = 13585 - INTEGER(IntKi), PARAMETER :: M25N5RDxe = 13586 - INTEGER(IntKi), PARAMETER :: M25N6RDxe = 13587 - INTEGER(IntKi), PARAMETER :: M25N7RDxe = 13588 - INTEGER(IntKi), PARAMETER :: M25N8RDxe = 13589 - INTEGER(IntKi), PARAMETER :: M25N9RDxe = 13590 - INTEGER(IntKi), PARAMETER :: M26N1RDxe = 13591 - INTEGER(IntKi), PARAMETER :: M26N2RDxe = 13592 - INTEGER(IntKi), PARAMETER :: M26N3RDxe = 13593 - INTEGER(IntKi), PARAMETER :: M26N4RDxe = 13594 - INTEGER(IntKi), PARAMETER :: M26N5RDxe = 13595 - INTEGER(IntKi), PARAMETER :: M26N6RDxe = 13596 - INTEGER(IntKi), PARAMETER :: M26N7RDxe = 13597 - INTEGER(IntKi), PARAMETER :: M26N8RDxe = 13598 - INTEGER(IntKi), PARAMETER :: M26N9RDxe = 13599 - INTEGER(IntKi), PARAMETER :: M27N1RDxe = 13600 - INTEGER(IntKi), PARAMETER :: M27N2RDxe = 13601 - INTEGER(IntKi), PARAMETER :: M27N3RDxe = 13602 - INTEGER(IntKi), PARAMETER :: M27N4RDxe = 13603 - INTEGER(IntKi), PARAMETER :: M27N5RDxe = 13604 - INTEGER(IntKi), PARAMETER :: M27N6RDxe = 13605 - INTEGER(IntKi), PARAMETER :: M27N7RDxe = 13606 - INTEGER(IntKi), PARAMETER :: M27N8RDxe = 13607 - INTEGER(IntKi), PARAMETER :: M27N9RDxe = 13608 - INTEGER(IntKi), PARAMETER :: M28N1RDxe = 13609 - INTEGER(IntKi), PARAMETER :: M28N2RDxe = 13610 - INTEGER(IntKi), PARAMETER :: M28N3RDxe = 13611 - INTEGER(IntKi), PARAMETER :: M28N4RDxe = 13612 - INTEGER(IntKi), PARAMETER :: M28N5RDxe = 13613 - INTEGER(IntKi), PARAMETER :: M28N6RDxe = 13614 - INTEGER(IntKi), PARAMETER :: M28N7RDxe = 13615 - INTEGER(IntKi), PARAMETER :: M28N8RDxe = 13616 - INTEGER(IntKi), PARAMETER :: M28N9RDxe = 13617 - INTEGER(IntKi), PARAMETER :: M29N1RDxe = 13618 - INTEGER(IntKi), PARAMETER :: M29N2RDxe = 13619 - INTEGER(IntKi), PARAMETER :: M29N3RDxe = 13620 - INTEGER(IntKi), PARAMETER :: M29N4RDxe = 13621 - INTEGER(IntKi), PARAMETER :: M29N5RDxe = 13622 - INTEGER(IntKi), PARAMETER :: M29N6RDxe = 13623 - INTEGER(IntKi), PARAMETER :: M29N7RDxe = 13624 - INTEGER(IntKi), PARAMETER :: M29N8RDxe = 13625 - INTEGER(IntKi), PARAMETER :: M29N9RDxe = 13626 - INTEGER(IntKi), PARAMETER :: M30N1RDxe = 13627 - INTEGER(IntKi), PARAMETER :: M30N2RDxe = 13628 - INTEGER(IntKi), PARAMETER :: M30N3RDxe = 13629 - INTEGER(IntKi), PARAMETER :: M30N4RDxe = 13630 - INTEGER(IntKi), PARAMETER :: M30N5RDxe = 13631 - INTEGER(IntKi), PARAMETER :: M30N6RDxe = 13632 - INTEGER(IntKi), PARAMETER :: M30N7RDxe = 13633 - INTEGER(IntKi), PARAMETER :: M30N8RDxe = 13634 - INTEGER(IntKi), PARAMETER :: M30N9RDxe = 13635 - INTEGER(IntKi), PARAMETER :: M31N1RDxe = 13636 - INTEGER(IntKi), PARAMETER :: M31N2RDxe = 13637 - INTEGER(IntKi), PARAMETER :: M31N3RDxe = 13638 - INTEGER(IntKi), PARAMETER :: M31N4RDxe = 13639 - INTEGER(IntKi), PARAMETER :: M31N5RDxe = 13640 - INTEGER(IntKi), PARAMETER :: M31N6RDxe = 13641 - INTEGER(IntKi), PARAMETER :: M31N7RDxe = 13642 - INTEGER(IntKi), PARAMETER :: M31N8RDxe = 13643 - INTEGER(IntKi), PARAMETER :: M31N9RDxe = 13644 - INTEGER(IntKi), PARAMETER :: M32N1RDxe = 13645 - INTEGER(IntKi), PARAMETER :: M32N2RDxe = 13646 - INTEGER(IntKi), PARAMETER :: M32N3RDxe = 13647 - INTEGER(IntKi), PARAMETER :: M32N4RDxe = 13648 - INTEGER(IntKi), PARAMETER :: M32N5RDxe = 13649 - INTEGER(IntKi), PARAMETER :: M32N6RDxe = 13650 - INTEGER(IntKi), PARAMETER :: M32N7RDxe = 13651 - INTEGER(IntKi), PARAMETER :: M32N8RDxe = 13652 - INTEGER(IntKi), PARAMETER :: M32N9RDxe = 13653 - INTEGER(IntKi), PARAMETER :: M33N1RDxe = 13654 - INTEGER(IntKi), PARAMETER :: M33N2RDxe = 13655 - INTEGER(IntKi), PARAMETER :: M33N3RDxe = 13656 - INTEGER(IntKi), PARAMETER :: M33N4RDxe = 13657 - INTEGER(IntKi), PARAMETER :: M33N5RDxe = 13658 - INTEGER(IntKi), PARAMETER :: M33N6RDxe = 13659 - INTEGER(IntKi), PARAMETER :: M33N7RDxe = 13660 - INTEGER(IntKi), PARAMETER :: M33N8RDxe = 13661 - INTEGER(IntKi), PARAMETER :: M33N9RDxe = 13662 - INTEGER(IntKi), PARAMETER :: M34N1RDxe = 13663 - INTEGER(IntKi), PARAMETER :: M34N2RDxe = 13664 - INTEGER(IntKi), PARAMETER :: M34N3RDxe = 13665 - INTEGER(IntKi), PARAMETER :: M34N4RDxe = 13666 - INTEGER(IntKi), PARAMETER :: M34N5RDxe = 13667 - INTEGER(IntKi), PARAMETER :: M34N6RDxe = 13668 - INTEGER(IntKi), PARAMETER :: M34N7RDxe = 13669 - INTEGER(IntKi), PARAMETER :: M34N8RDxe = 13670 - INTEGER(IntKi), PARAMETER :: M34N9RDxe = 13671 - INTEGER(IntKi), PARAMETER :: M35N1RDxe = 13672 - INTEGER(IntKi), PARAMETER :: M35N2RDxe = 13673 - INTEGER(IntKi), PARAMETER :: M35N3RDxe = 13674 - INTEGER(IntKi), PARAMETER :: M35N4RDxe = 13675 - INTEGER(IntKi), PARAMETER :: M35N5RDxe = 13676 - INTEGER(IntKi), PARAMETER :: M35N6RDxe = 13677 - INTEGER(IntKi), PARAMETER :: M35N7RDxe = 13678 - INTEGER(IntKi), PARAMETER :: M35N8RDxe = 13679 - INTEGER(IntKi), PARAMETER :: M35N9RDxe = 13680 - INTEGER(IntKi), PARAMETER :: M36N1RDxe = 13681 - INTEGER(IntKi), PARAMETER :: M36N2RDxe = 13682 - INTEGER(IntKi), PARAMETER :: M36N3RDxe = 13683 - INTEGER(IntKi), PARAMETER :: M36N4RDxe = 13684 - INTEGER(IntKi), PARAMETER :: M36N5RDxe = 13685 - INTEGER(IntKi), PARAMETER :: M36N6RDxe = 13686 - INTEGER(IntKi), PARAMETER :: M36N7RDxe = 13687 - INTEGER(IntKi), PARAMETER :: M36N8RDxe = 13688 - INTEGER(IntKi), PARAMETER :: M36N9RDxe = 13689 - INTEGER(IntKi), PARAMETER :: M37N1RDxe = 13690 - INTEGER(IntKi), PARAMETER :: M37N2RDxe = 13691 - INTEGER(IntKi), PARAMETER :: M37N3RDxe = 13692 - INTEGER(IntKi), PARAMETER :: M37N4RDxe = 13693 - INTEGER(IntKi), PARAMETER :: M37N5RDxe = 13694 - INTEGER(IntKi), PARAMETER :: M37N6RDxe = 13695 - INTEGER(IntKi), PARAMETER :: M37N7RDxe = 13696 - INTEGER(IntKi), PARAMETER :: M37N8RDxe = 13697 - INTEGER(IntKi), PARAMETER :: M37N9RDxe = 13698 - INTEGER(IntKi), PARAMETER :: M38N1RDxe = 13699 - INTEGER(IntKi), PARAMETER :: M38N2RDxe = 13700 - INTEGER(IntKi), PARAMETER :: M38N3RDxe = 13701 - INTEGER(IntKi), PARAMETER :: M38N4RDxe = 13702 - INTEGER(IntKi), PARAMETER :: M38N5RDxe = 13703 - INTEGER(IntKi), PARAMETER :: M38N6RDxe = 13704 - INTEGER(IntKi), PARAMETER :: M38N7RDxe = 13705 - INTEGER(IntKi), PARAMETER :: M38N8RDxe = 13706 - INTEGER(IntKi), PARAMETER :: M38N9RDxe = 13707 - INTEGER(IntKi), PARAMETER :: M39N1RDxe = 13708 - INTEGER(IntKi), PARAMETER :: M39N2RDxe = 13709 - INTEGER(IntKi), PARAMETER :: M39N3RDxe = 13710 - INTEGER(IntKi), PARAMETER :: M39N4RDxe = 13711 - INTEGER(IntKi), PARAMETER :: M39N5RDxe = 13712 - INTEGER(IntKi), PARAMETER :: M39N6RDxe = 13713 - INTEGER(IntKi), PARAMETER :: M39N7RDxe = 13714 - INTEGER(IntKi), PARAMETER :: M39N8RDxe = 13715 - INTEGER(IntKi), PARAMETER :: M39N9RDxe = 13716 - INTEGER(IntKi), PARAMETER :: M40N1RDxe = 13717 - INTEGER(IntKi), PARAMETER :: M40N2RDxe = 13718 - INTEGER(IntKi), PARAMETER :: M40N3RDxe = 13719 - INTEGER(IntKi), PARAMETER :: M40N4RDxe = 13720 - INTEGER(IntKi), PARAMETER :: M40N5RDxe = 13721 - INTEGER(IntKi), PARAMETER :: M40N6RDxe = 13722 - INTEGER(IntKi), PARAMETER :: M40N7RDxe = 13723 - INTEGER(IntKi), PARAMETER :: M40N8RDxe = 13724 - INTEGER(IntKi), PARAMETER :: M40N9RDxe = 13725 - INTEGER(IntKi), PARAMETER :: M41N1RDxe = 13726 - INTEGER(IntKi), PARAMETER :: M41N2RDxe = 13727 - INTEGER(IntKi), PARAMETER :: M41N3RDxe = 13728 - INTEGER(IntKi), PARAMETER :: M41N4RDxe = 13729 - INTEGER(IntKi), PARAMETER :: M41N5RDxe = 13730 - INTEGER(IntKi), PARAMETER :: M41N6RDxe = 13731 - INTEGER(IntKi), PARAMETER :: M41N7RDxe = 13732 - INTEGER(IntKi), PARAMETER :: M41N8RDxe = 13733 - INTEGER(IntKi), PARAMETER :: M41N9RDxe = 13734 - INTEGER(IntKi), PARAMETER :: M42N1RDxe = 13735 - INTEGER(IntKi), PARAMETER :: M42N2RDxe = 13736 - INTEGER(IntKi), PARAMETER :: M42N3RDxe = 13737 - INTEGER(IntKi), PARAMETER :: M42N4RDxe = 13738 - INTEGER(IntKi), PARAMETER :: M42N5RDxe = 13739 - INTEGER(IntKi), PARAMETER :: M42N6RDxe = 13740 - INTEGER(IntKi), PARAMETER :: M42N7RDxe = 13741 - INTEGER(IntKi), PARAMETER :: M42N8RDxe = 13742 - INTEGER(IntKi), PARAMETER :: M42N9RDxe = 13743 - INTEGER(IntKi), PARAMETER :: M43N1RDxe = 13744 - INTEGER(IntKi), PARAMETER :: M43N2RDxe = 13745 - INTEGER(IntKi), PARAMETER :: M43N3RDxe = 13746 - INTEGER(IntKi), PARAMETER :: M43N4RDxe = 13747 - INTEGER(IntKi), PARAMETER :: M43N5RDxe = 13748 - INTEGER(IntKi), PARAMETER :: M43N6RDxe = 13749 - INTEGER(IntKi), PARAMETER :: M43N7RDxe = 13750 - INTEGER(IntKi), PARAMETER :: M43N8RDxe = 13751 - INTEGER(IntKi), PARAMETER :: M43N9RDxe = 13752 - INTEGER(IntKi), PARAMETER :: M44N1RDxe = 13753 - INTEGER(IntKi), PARAMETER :: M44N2RDxe = 13754 - INTEGER(IntKi), PARAMETER :: M44N3RDxe = 13755 - INTEGER(IntKi), PARAMETER :: M44N4RDxe = 13756 - INTEGER(IntKi), PARAMETER :: M44N5RDxe = 13757 - INTEGER(IntKi), PARAMETER :: M44N6RDxe = 13758 - INTEGER(IntKi), PARAMETER :: M44N7RDxe = 13759 - INTEGER(IntKi), PARAMETER :: M44N8RDxe = 13760 - INTEGER(IntKi), PARAMETER :: M44N9RDxe = 13761 - INTEGER(IntKi), PARAMETER :: M45N1RDxe = 13762 - INTEGER(IntKi), PARAMETER :: M45N2RDxe = 13763 - INTEGER(IntKi), PARAMETER :: M45N3RDxe = 13764 - INTEGER(IntKi), PARAMETER :: M45N4RDxe = 13765 - INTEGER(IntKi), PARAMETER :: M45N5RDxe = 13766 - INTEGER(IntKi), PARAMETER :: M45N6RDxe = 13767 - INTEGER(IntKi), PARAMETER :: M45N7RDxe = 13768 - INTEGER(IntKi), PARAMETER :: M45N8RDxe = 13769 - INTEGER(IntKi), PARAMETER :: M45N9RDxe = 13770 - INTEGER(IntKi), PARAMETER :: M46N1RDxe = 13771 - INTEGER(IntKi), PARAMETER :: M46N2RDxe = 13772 - INTEGER(IntKi), PARAMETER :: M46N3RDxe = 13773 - INTEGER(IntKi), PARAMETER :: M46N4RDxe = 13774 - INTEGER(IntKi), PARAMETER :: M46N5RDxe = 13775 - INTEGER(IntKi), PARAMETER :: M46N6RDxe = 13776 - INTEGER(IntKi), PARAMETER :: M46N7RDxe = 13777 - INTEGER(IntKi), PARAMETER :: M46N8RDxe = 13778 - INTEGER(IntKi), PARAMETER :: M46N9RDxe = 13779 - INTEGER(IntKi), PARAMETER :: M47N1RDxe = 13780 - INTEGER(IntKi), PARAMETER :: M47N2RDxe = 13781 - INTEGER(IntKi), PARAMETER :: M47N3RDxe = 13782 - INTEGER(IntKi), PARAMETER :: M47N4RDxe = 13783 - INTEGER(IntKi), PARAMETER :: M47N5RDxe = 13784 - INTEGER(IntKi), PARAMETER :: M47N6RDxe = 13785 - INTEGER(IntKi), PARAMETER :: M47N7RDxe = 13786 - INTEGER(IntKi), PARAMETER :: M47N8RDxe = 13787 - INTEGER(IntKi), PARAMETER :: M47N9RDxe = 13788 - INTEGER(IntKi), PARAMETER :: M48N1RDxe = 13789 - INTEGER(IntKi), PARAMETER :: M48N2RDxe = 13790 - INTEGER(IntKi), PARAMETER :: M48N3RDxe = 13791 - INTEGER(IntKi), PARAMETER :: M48N4RDxe = 13792 - INTEGER(IntKi), PARAMETER :: M48N5RDxe = 13793 - INTEGER(IntKi), PARAMETER :: M48N6RDxe = 13794 - INTEGER(IntKi), PARAMETER :: M48N7RDxe = 13795 - INTEGER(IntKi), PARAMETER :: M48N8RDxe = 13796 - INTEGER(IntKi), PARAMETER :: M48N9RDxe = 13797 - INTEGER(IntKi), PARAMETER :: M49N1RDxe = 13798 - INTEGER(IntKi), PARAMETER :: M49N2RDxe = 13799 - INTEGER(IntKi), PARAMETER :: M49N3RDxe = 13800 - INTEGER(IntKi), PARAMETER :: M49N4RDxe = 13801 - INTEGER(IntKi), PARAMETER :: M49N5RDxe = 13802 - INTEGER(IntKi), PARAMETER :: M49N6RDxe = 13803 - INTEGER(IntKi), PARAMETER :: M49N7RDxe = 13804 - INTEGER(IntKi), PARAMETER :: M49N8RDxe = 13805 - INTEGER(IntKi), PARAMETER :: M49N9RDxe = 13806 - INTEGER(IntKi), PARAMETER :: M50N1RDxe = 13807 - INTEGER(IntKi), PARAMETER :: M50N2RDxe = 13808 - INTEGER(IntKi), PARAMETER :: M50N3RDxe = 13809 - INTEGER(IntKi), PARAMETER :: M50N4RDxe = 13810 - INTEGER(IntKi), PARAMETER :: M50N5RDxe = 13811 - INTEGER(IntKi), PARAMETER :: M50N6RDxe = 13812 - INTEGER(IntKi), PARAMETER :: M50N7RDxe = 13813 - INTEGER(IntKi), PARAMETER :: M50N8RDxe = 13814 - INTEGER(IntKi), PARAMETER :: M50N9RDxe = 13815 - INTEGER(IntKi), PARAMETER :: M51N1RDxe = 13816 - INTEGER(IntKi), PARAMETER :: M51N2RDxe = 13817 - INTEGER(IntKi), PARAMETER :: M51N3RDxe = 13818 - INTEGER(IntKi), PARAMETER :: M51N4RDxe = 13819 - INTEGER(IntKi), PARAMETER :: M51N5RDxe = 13820 - INTEGER(IntKi), PARAMETER :: M51N6RDxe = 13821 - INTEGER(IntKi), PARAMETER :: M51N7RDxe = 13822 - INTEGER(IntKi), PARAMETER :: M51N8RDxe = 13823 - INTEGER(IntKi), PARAMETER :: M51N9RDxe = 13824 - INTEGER(IntKi), PARAMETER :: M52N1RDxe = 13825 - INTEGER(IntKi), PARAMETER :: M52N2RDxe = 13826 - INTEGER(IntKi), PARAMETER :: M52N3RDxe = 13827 - INTEGER(IntKi), PARAMETER :: M52N4RDxe = 13828 - INTEGER(IntKi), PARAMETER :: M52N5RDxe = 13829 - INTEGER(IntKi), PARAMETER :: M52N6RDxe = 13830 - INTEGER(IntKi), PARAMETER :: M52N7RDxe = 13831 - INTEGER(IntKi), PARAMETER :: M52N8RDxe = 13832 - INTEGER(IntKi), PARAMETER :: M52N9RDxe = 13833 - INTEGER(IntKi), PARAMETER :: M53N1RDxe = 13834 - INTEGER(IntKi), PARAMETER :: M53N2RDxe = 13835 - INTEGER(IntKi), PARAMETER :: M53N3RDxe = 13836 - INTEGER(IntKi), PARAMETER :: M53N4RDxe = 13837 - INTEGER(IntKi), PARAMETER :: M53N5RDxe = 13838 - INTEGER(IntKi), PARAMETER :: M53N6RDxe = 13839 - INTEGER(IntKi), PARAMETER :: M53N7RDxe = 13840 - INTEGER(IntKi), PARAMETER :: M53N8RDxe = 13841 - INTEGER(IntKi), PARAMETER :: M53N9RDxe = 13842 - INTEGER(IntKi), PARAMETER :: M54N1RDxe = 13843 - INTEGER(IntKi), PARAMETER :: M54N2RDxe = 13844 - INTEGER(IntKi), PARAMETER :: M54N3RDxe = 13845 - INTEGER(IntKi), PARAMETER :: M54N4RDxe = 13846 - INTEGER(IntKi), PARAMETER :: M54N5RDxe = 13847 - INTEGER(IntKi), PARAMETER :: M54N6RDxe = 13848 - INTEGER(IntKi), PARAMETER :: M54N7RDxe = 13849 - INTEGER(IntKi), PARAMETER :: M54N8RDxe = 13850 - INTEGER(IntKi), PARAMETER :: M54N9RDxe = 13851 - INTEGER(IntKi), PARAMETER :: M55N1RDxe = 13852 - INTEGER(IntKi), PARAMETER :: M55N2RDxe = 13853 - INTEGER(IntKi), PARAMETER :: M55N3RDxe = 13854 - INTEGER(IntKi), PARAMETER :: M55N4RDxe = 13855 - INTEGER(IntKi), PARAMETER :: M55N5RDxe = 13856 - INTEGER(IntKi), PARAMETER :: M55N6RDxe = 13857 - INTEGER(IntKi), PARAMETER :: M55N7RDxe = 13858 - INTEGER(IntKi), PARAMETER :: M55N8RDxe = 13859 - INTEGER(IntKi), PARAMETER :: M55N9RDxe = 13860 - INTEGER(IntKi), PARAMETER :: M56N1RDxe = 13861 - INTEGER(IntKi), PARAMETER :: M56N2RDxe = 13862 - INTEGER(IntKi), PARAMETER :: M56N3RDxe = 13863 - INTEGER(IntKi), PARAMETER :: M56N4RDxe = 13864 - INTEGER(IntKi), PARAMETER :: M56N5RDxe = 13865 - INTEGER(IntKi), PARAMETER :: M56N6RDxe = 13866 - INTEGER(IntKi), PARAMETER :: M56N7RDxe = 13867 - INTEGER(IntKi), PARAMETER :: M56N8RDxe = 13868 - INTEGER(IntKi), PARAMETER :: M56N9RDxe = 13869 - INTEGER(IntKi), PARAMETER :: M57N1RDxe = 13870 - INTEGER(IntKi), PARAMETER :: M57N2RDxe = 13871 - INTEGER(IntKi), PARAMETER :: M57N3RDxe = 13872 - INTEGER(IntKi), PARAMETER :: M57N4RDxe = 13873 - INTEGER(IntKi), PARAMETER :: M57N5RDxe = 13874 - INTEGER(IntKi), PARAMETER :: M57N6RDxe = 13875 - INTEGER(IntKi), PARAMETER :: M57N7RDxe = 13876 - INTEGER(IntKi), PARAMETER :: M57N8RDxe = 13877 - INTEGER(IntKi), PARAMETER :: M57N9RDxe = 13878 - INTEGER(IntKi), PARAMETER :: M58N1RDxe = 13879 - INTEGER(IntKi), PARAMETER :: M58N2RDxe = 13880 - INTEGER(IntKi), PARAMETER :: M58N3RDxe = 13881 - INTEGER(IntKi), PARAMETER :: M58N4RDxe = 13882 - INTEGER(IntKi), PARAMETER :: M58N5RDxe = 13883 - INTEGER(IntKi), PARAMETER :: M58N6RDxe = 13884 - INTEGER(IntKi), PARAMETER :: M58N7RDxe = 13885 - INTEGER(IntKi), PARAMETER :: M58N8RDxe = 13886 - INTEGER(IntKi), PARAMETER :: M58N9RDxe = 13887 - INTEGER(IntKi), PARAMETER :: M59N1RDxe = 13888 - INTEGER(IntKi), PARAMETER :: M59N2RDxe = 13889 - INTEGER(IntKi), PARAMETER :: M59N3RDxe = 13890 - INTEGER(IntKi), PARAMETER :: M59N4RDxe = 13891 - INTEGER(IntKi), PARAMETER :: M59N5RDxe = 13892 - INTEGER(IntKi), PARAMETER :: M59N6RDxe = 13893 - INTEGER(IntKi), PARAMETER :: M59N7RDxe = 13894 - INTEGER(IntKi), PARAMETER :: M59N8RDxe = 13895 - INTEGER(IntKi), PARAMETER :: M59N9RDxe = 13896 - INTEGER(IntKi), PARAMETER :: M60N1RDxe = 13897 - INTEGER(IntKi), PARAMETER :: M60N2RDxe = 13898 - INTEGER(IntKi), PARAMETER :: M60N3RDxe = 13899 - INTEGER(IntKi), PARAMETER :: M60N4RDxe = 13900 - INTEGER(IntKi), PARAMETER :: M60N5RDxe = 13901 - INTEGER(IntKi), PARAMETER :: M60N6RDxe = 13902 - INTEGER(IntKi), PARAMETER :: M60N7RDxe = 13903 - INTEGER(IntKi), PARAMETER :: M60N8RDxe = 13904 - INTEGER(IntKi), PARAMETER :: M60N9RDxe = 13905 - INTEGER(IntKi), PARAMETER :: M61N1RDxe = 13906 - INTEGER(IntKi), PARAMETER :: M61N2RDxe = 13907 - INTEGER(IntKi), PARAMETER :: M61N3RDxe = 13908 - INTEGER(IntKi), PARAMETER :: M61N4RDxe = 13909 - INTEGER(IntKi), PARAMETER :: M61N5RDxe = 13910 - INTEGER(IntKi), PARAMETER :: M61N6RDxe = 13911 - INTEGER(IntKi), PARAMETER :: M61N7RDxe = 13912 - INTEGER(IntKi), PARAMETER :: M61N8RDxe = 13913 - INTEGER(IntKi), PARAMETER :: M61N9RDxe = 13914 - INTEGER(IntKi), PARAMETER :: M62N1RDxe = 13915 - INTEGER(IntKi), PARAMETER :: M62N2RDxe = 13916 - INTEGER(IntKi), PARAMETER :: M62N3RDxe = 13917 - INTEGER(IntKi), PARAMETER :: M62N4RDxe = 13918 - INTEGER(IntKi), PARAMETER :: M62N5RDxe = 13919 - INTEGER(IntKi), PARAMETER :: M62N6RDxe = 13920 - INTEGER(IntKi), PARAMETER :: M62N7RDxe = 13921 - INTEGER(IntKi), PARAMETER :: M62N8RDxe = 13922 - INTEGER(IntKi), PARAMETER :: M62N9RDxe = 13923 - INTEGER(IntKi), PARAMETER :: M63N1RDxe = 13924 - INTEGER(IntKi), PARAMETER :: M63N2RDxe = 13925 - INTEGER(IntKi), PARAMETER :: M63N3RDxe = 13926 - INTEGER(IntKi), PARAMETER :: M63N4RDxe = 13927 - INTEGER(IntKi), PARAMETER :: M63N5RDxe = 13928 - INTEGER(IntKi), PARAMETER :: M63N6RDxe = 13929 - INTEGER(IntKi), PARAMETER :: M63N7RDxe = 13930 - INTEGER(IntKi), PARAMETER :: M63N8RDxe = 13931 - INTEGER(IntKi), PARAMETER :: M63N9RDxe = 13932 - INTEGER(IntKi), PARAMETER :: M64N1RDxe = 13933 - INTEGER(IntKi), PARAMETER :: M64N2RDxe = 13934 - INTEGER(IntKi), PARAMETER :: M64N3RDxe = 13935 - INTEGER(IntKi), PARAMETER :: M64N4RDxe = 13936 - INTEGER(IntKi), PARAMETER :: M64N5RDxe = 13937 - INTEGER(IntKi), PARAMETER :: M64N6RDxe = 13938 - INTEGER(IntKi), PARAMETER :: M64N7RDxe = 13939 - INTEGER(IntKi), PARAMETER :: M64N8RDxe = 13940 - INTEGER(IntKi), PARAMETER :: M64N9RDxe = 13941 - INTEGER(IntKi), PARAMETER :: M65N1RDxe = 13942 - INTEGER(IntKi), PARAMETER :: M65N2RDxe = 13943 - INTEGER(IntKi), PARAMETER :: M65N3RDxe = 13944 - INTEGER(IntKi), PARAMETER :: M65N4RDxe = 13945 - INTEGER(IntKi), PARAMETER :: M65N5RDxe = 13946 - INTEGER(IntKi), PARAMETER :: M65N6RDxe = 13947 - INTEGER(IntKi), PARAMETER :: M65N7RDxe = 13948 - INTEGER(IntKi), PARAMETER :: M65N8RDxe = 13949 - INTEGER(IntKi), PARAMETER :: M65N9RDxe = 13950 - INTEGER(IntKi), PARAMETER :: M66N1RDxe = 13951 - INTEGER(IntKi), PARAMETER :: M66N2RDxe = 13952 - INTEGER(IntKi), PARAMETER :: M66N3RDxe = 13953 - INTEGER(IntKi), PARAMETER :: M66N4RDxe = 13954 - INTEGER(IntKi), PARAMETER :: M66N5RDxe = 13955 - INTEGER(IntKi), PARAMETER :: M66N6RDxe = 13956 - INTEGER(IntKi), PARAMETER :: M66N7RDxe = 13957 - INTEGER(IntKi), PARAMETER :: M66N8RDxe = 13958 - INTEGER(IntKi), PARAMETER :: M66N9RDxe = 13959 - INTEGER(IntKi), PARAMETER :: M67N1RDxe = 13960 - INTEGER(IntKi), PARAMETER :: M67N2RDxe = 13961 - INTEGER(IntKi), PARAMETER :: M67N3RDxe = 13962 - INTEGER(IntKi), PARAMETER :: M67N4RDxe = 13963 - INTEGER(IntKi), PARAMETER :: M67N5RDxe = 13964 - INTEGER(IntKi), PARAMETER :: M67N6RDxe = 13965 - INTEGER(IntKi), PARAMETER :: M67N7RDxe = 13966 - INTEGER(IntKi), PARAMETER :: M67N8RDxe = 13967 - INTEGER(IntKi), PARAMETER :: M67N9RDxe = 13968 - INTEGER(IntKi), PARAMETER :: M68N1RDxe = 13969 - INTEGER(IntKi), PARAMETER :: M68N2RDxe = 13970 - INTEGER(IntKi), PARAMETER :: M68N3RDxe = 13971 - INTEGER(IntKi), PARAMETER :: M68N4RDxe = 13972 - INTEGER(IntKi), PARAMETER :: M68N5RDxe = 13973 - INTEGER(IntKi), PARAMETER :: M68N6RDxe = 13974 - INTEGER(IntKi), PARAMETER :: M68N7RDxe = 13975 - INTEGER(IntKi), PARAMETER :: M68N8RDxe = 13976 - INTEGER(IntKi), PARAMETER :: M68N9RDxe = 13977 - INTEGER(IntKi), PARAMETER :: M69N1RDxe = 13978 - INTEGER(IntKi), PARAMETER :: M69N2RDxe = 13979 - INTEGER(IntKi), PARAMETER :: M69N3RDxe = 13980 - INTEGER(IntKi), PARAMETER :: M69N4RDxe = 13981 - INTEGER(IntKi), PARAMETER :: M69N5RDxe = 13982 - INTEGER(IntKi), PARAMETER :: M69N6RDxe = 13983 - INTEGER(IntKi), PARAMETER :: M69N7RDxe = 13984 - INTEGER(IntKi), PARAMETER :: M69N8RDxe = 13985 - INTEGER(IntKi), PARAMETER :: M69N9RDxe = 13986 - INTEGER(IntKi), PARAMETER :: M70N1RDxe = 13987 - INTEGER(IntKi), PARAMETER :: M70N2RDxe = 13988 - INTEGER(IntKi), PARAMETER :: M70N3RDxe = 13989 - INTEGER(IntKi), PARAMETER :: M70N4RDxe = 13990 - INTEGER(IntKi), PARAMETER :: M70N5RDxe = 13991 - INTEGER(IntKi), PARAMETER :: M70N6RDxe = 13992 - INTEGER(IntKi), PARAMETER :: M70N7RDxe = 13993 - INTEGER(IntKi), PARAMETER :: M70N8RDxe = 13994 - INTEGER(IntKi), PARAMETER :: M70N9RDxe = 13995 - INTEGER(IntKi), PARAMETER :: M71N1RDxe = 13996 - INTEGER(IntKi), PARAMETER :: M71N2RDxe = 13997 - INTEGER(IntKi), PARAMETER :: M71N3RDxe = 13998 - INTEGER(IntKi), PARAMETER :: M71N4RDxe = 13999 - INTEGER(IntKi), PARAMETER :: M71N5RDxe = 14000 - INTEGER(IntKi), PARAMETER :: M71N6RDxe = 14001 - INTEGER(IntKi), PARAMETER :: M71N7RDxe = 14002 - INTEGER(IntKi), PARAMETER :: M71N8RDxe = 14003 - INTEGER(IntKi), PARAMETER :: M71N9RDxe = 14004 - INTEGER(IntKi), PARAMETER :: M72N1RDxe = 14005 - INTEGER(IntKi), PARAMETER :: M72N2RDxe = 14006 - INTEGER(IntKi), PARAMETER :: M72N3RDxe = 14007 - INTEGER(IntKi), PARAMETER :: M72N4RDxe = 14008 - INTEGER(IntKi), PARAMETER :: M72N5RDxe = 14009 - INTEGER(IntKi), PARAMETER :: M72N6RDxe = 14010 - INTEGER(IntKi), PARAMETER :: M72N7RDxe = 14011 - INTEGER(IntKi), PARAMETER :: M72N8RDxe = 14012 - INTEGER(IntKi), PARAMETER :: M72N9RDxe = 14013 - INTEGER(IntKi), PARAMETER :: M73N1RDxe = 14014 - INTEGER(IntKi), PARAMETER :: M73N2RDxe = 14015 - INTEGER(IntKi), PARAMETER :: M73N3RDxe = 14016 - INTEGER(IntKi), PARAMETER :: M73N4RDxe = 14017 - INTEGER(IntKi), PARAMETER :: M73N5RDxe = 14018 - INTEGER(IntKi), PARAMETER :: M73N6RDxe = 14019 - INTEGER(IntKi), PARAMETER :: M73N7RDxe = 14020 - INTEGER(IntKi), PARAMETER :: M73N8RDxe = 14021 - INTEGER(IntKi), PARAMETER :: M73N9RDxe = 14022 - INTEGER(IntKi), PARAMETER :: M74N1RDxe = 14023 - INTEGER(IntKi), PARAMETER :: M74N2RDxe = 14024 - INTEGER(IntKi), PARAMETER :: M74N3RDxe = 14025 - INTEGER(IntKi), PARAMETER :: M74N4RDxe = 14026 - INTEGER(IntKi), PARAMETER :: M74N5RDxe = 14027 - INTEGER(IntKi), PARAMETER :: M74N6RDxe = 14028 - INTEGER(IntKi), PARAMETER :: M74N7RDxe = 14029 - INTEGER(IntKi), PARAMETER :: M74N8RDxe = 14030 - INTEGER(IntKi), PARAMETER :: M74N9RDxe = 14031 - INTEGER(IntKi), PARAMETER :: M75N1RDxe = 14032 - INTEGER(IntKi), PARAMETER :: M75N2RDxe = 14033 - INTEGER(IntKi), PARAMETER :: M75N3RDxe = 14034 - INTEGER(IntKi), PARAMETER :: M75N4RDxe = 14035 - INTEGER(IntKi), PARAMETER :: M75N5RDxe = 14036 - INTEGER(IntKi), PARAMETER :: M75N6RDxe = 14037 - INTEGER(IntKi), PARAMETER :: M75N7RDxe = 14038 - INTEGER(IntKi), PARAMETER :: M75N8RDxe = 14039 - INTEGER(IntKi), PARAMETER :: M75N9RDxe = 14040 - INTEGER(IntKi), PARAMETER :: M76N1RDxe = 14041 - INTEGER(IntKi), PARAMETER :: M76N2RDxe = 14042 - INTEGER(IntKi), PARAMETER :: M76N3RDxe = 14043 - INTEGER(IntKi), PARAMETER :: M76N4RDxe = 14044 - INTEGER(IntKi), PARAMETER :: M76N5RDxe = 14045 - INTEGER(IntKi), PARAMETER :: M76N6RDxe = 14046 - INTEGER(IntKi), PARAMETER :: M76N7RDxe = 14047 - INTEGER(IntKi), PARAMETER :: M76N8RDxe = 14048 - INTEGER(IntKi), PARAMETER :: M76N9RDxe = 14049 - INTEGER(IntKi), PARAMETER :: M77N1RDxe = 14050 - INTEGER(IntKi), PARAMETER :: M77N2RDxe = 14051 - INTEGER(IntKi), PARAMETER :: M77N3RDxe = 14052 - INTEGER(IntKi), PARAMETER :: M77N4RDxe = 14053 - INTEGER(IntKi), PARAMETER :: M77N5RDxe = 14054 - INTEGER(IntKi), PARAMETER :: M77N6RDxe = 14055 - INTEGER(IntKi), PARAMETER :: M77N7RDxe = 14056 - INTEGER(IntKi), PARAMETER :: M77N8RDxe = 14057 - INTEGER(IntKi), PARAMETER :: M77N9RDxe = 14058 - INTEGER(IntKi), PARAMETER :: M78N1RDxe = 14059 - INTEGER(IntKi), PARAMETER :: M78N2RDxe = 14060 - INTEGER(IntKi), PARAMETER :: M78N3RDxe = 14061 - INTEGER(IntKi), PARAMETER :: M78N4RDxe = 14062 - INTEGER(IntKi), PARAMETER :: M78N5RDxe = 14063 - INTEGER(IntKi), PARAMETER :: M78N6RDxe = 14064 - INTEGER(IntKi), PARAMETER :: M78N7RDxe = 14065 - INTEGER(IntKi), PARAMETER :: M78N8RDxe = 14066 - INTEGER(IntKi), PARAMETER :: M78N9RDxe = 14067 - INTEGER(IntKi), PARAMETER :: M79N1RDxe = 14068 - INTEGER(IntKi), PARAMETER :: M79N2RDxe = 14069 - INTEGER(IntKi), PARAMETER :: M79N3RDxe = 14070 - INTEGER(IntKi), PARAMETER :: M79N4RDxe = 14071 - INTEGER(IntKi), PARAMETER :: M79N5RDxe = 14072 - INTEGER(IntKi), PARAMETER :: M79N6RDxe = 14073 - INTEGER(IntKi), PARAMETER :: M79N7RDxe = 14074 - INTEGER(IntKi), PARAMETER :: M79N8RDxe = 14075 - INTEGER(IntKi), PARAMETER :: M79N9RDxe = 14076 - INTEGER(IntKi), PARAMETER :: M80N1RDxe = 14077 - INTEGER(IntKi), PARAMETER :: M80N2RDxe = 14078 - INTEGER(IntKi), PARAMETER :: M80N3RDxe = 14079 - INTEGER(IntKi), PARAMETER :: M80N4RDxe = 14080 - INTEGER(IntKi), PARAMETER :: M80N5RDxe = 14081 - INTEGER(IntKi), PARAMETER :: M80N6RDxe = 14082 - INTEGER(IntKi), PARAMETER :: M80N7RDxe = 14083 - INTEGER(IntKi), PARAMETER :: M80N8RDxe = 14084 - INTEGER(IntKi), PARAMETER :: M80N9RDxe = 14085 - INTEGER(IntKi), PARAMETER :: M81N1RDxe = 14086 - INTEGER(IntKi), PARAMETER :: M81N2RDxe = 14087 - INTEGER(IntKi), PARAMETER :: M81N3RDxe = 14088 - INTEGER(IntKi), PARAMETER :: M81N4RDxe = 14089 - INTEGER(IntKi), PARAMETER :: M81N5RDxe = 14090 - INTEGER(IntKi), PARAMETER :: M81N6RDxe = 14091 - INTEGER(IntKi), PARAMETER :: M81N7RDxe = 14092 - INTEGER(IntKi), PARAMETER :: M81N8RDxe = 14093 - INTEGER(IntKi), PARAMETER :: M81N9RDxe = 14094 - INTEGER(IntKi), PARAMETER :: M82N1RDxe = 14095 - INTEGER(IntKi), PARAMETER :: M82N2RDxe = 14096 - INTEGER(IntKi), PARAMETER :: M82N3RDxe = 14097 - INTEGER(IntKi), PARAMETER :: M82N4RDxe = 14098 - INTEGER(IntKi), PARAMETER :: M82N5RDxe = 14099 - INTEGER(IntKi), PARAMETER :: M82N6RDxe = 14100 - INTEGER(IntKi), PARAMETER :: M82N7RDxe = 14101 - INTEGER(IntKi), PARAMETER :: M82N8RDxe = 14102 - INTEGER(IntKi), PARAMETER :: M82N9RDxe = 14103 - INTEGER(IntKi), PARAMETER :: M83N1RDxe = 14104 - INTEGER(IntKi), PARAMETER :: M83N2RDxe = 14105 - INTEGER(IntKi), PARAMETER :: M83N3RDxe = 14106 - INTEGER(IntKi), PARAMETER :: M83N4RDxe = 14107 - INTEGER(IntKi), PARAMETER :: M83N5RDxe = 14108 - INTEGER(IntKi), PARAMETER :: M83N6RDxe = 14109 - INTEGER(IntKi), PARAMETER :: M83N7RDxe = 14110 - INTEGER(IntKi), PARAMETER :: M83N8RDxe = 14111 - INTEGER(IntKi), PARAMETER :: M83N9RDxe = 14112 - INTEGER(IntKi), PARAMETER :: M84N1RDxe = 14113 - INTEGER(IntKi), PARAMETER :: M84N2RDxe = 14114 - INTEGER(IntKi), PARAMETER :: M84N3RDxe = 14115 - INTEGER(IntKi), PARAMETER :: M84N4RDxe = 14116 - INTEGER(IntKi), PARAMETER :: M84N5RDxe = 14117 - INTEGER(IntKi), PARAMETER :: M84N6RDxe = 14118 - INTEGER(IntKi), PARAMETER :: M84N7RDxe = 14119 - INTEGER(IntKi), PARAMETER :: M84N8RDxe = 14120 - INTEGER(IntKi), PARAMETER :: M84N9RDxe = 14121 - INTEGER(IntKi), PARAMETER :: M85N1RDxe = 14122 - INTEGER(IntKi), PARAMETER :: M85N2RDxe = 14123 - INTEGER(IntKi), PARAMETER :: M85N3RDxe = 14124 - INTEGER(IntKi), PARAMETER :: M85N4RDxe = 14125 - INTEGER(IntKi), PARAMETER :: M85N5RDxe = 14126 - INTEGER(IntKi), PARAMETER :: M85N6RDxe = 14127 - INTEGER(IntKi), PARAMETER :: M85N7RDxe = 14128 - INTEGER(IntKi), PARAMETER :: M85N8RDxe = 14129 - INTEGER(IntKi), PARAMETER :: M85N9RDxe = 14130 - INTEGER(IntKi), PARAMETER :: M86N1RDxe = 14131 - INTEGER(IntKi), PARAMETER :: M86N2RDxe = 14132 - INTEGER(IntKi), PARAMETER :: M86N3RDxe = 14133 - INTEGER(IntKi), PARAMETER :: M86N4RDxe = 14134 - INTEGER(IntKi), PARAMETER :: M86N5RDxe = 14135 - INTEGER(IntKi), PARAMETER :: M86N6RDxe = 14136 - INTEGER(IntKi), PARAMETER :: M86N7RDxe = 14137 - INTEGER(IntKi), PARAMETER :: M86N8RDxe = 14138 - INTEGER(IntKi), PARAMETER :: M86N9RDxe = 14139 - INTEGER(IntKi), PARAMETER :: M87N1RDxe = 14140 - INTEGER(IntKi), PARAMETER :: M87N2RDxe = 14141 - INTEGER(IntKi), PARAMETER :: M87N3RDxe = 14142 - INTEGER(IntKi), PARAMETER :: M87N4RDxe = 14143 - INTEGER(IntKi), PARAMETER :: M87N5RDxe = 14144 - INTEGER(IntKi), PARAMETER :: M87N6RDxe = 14145 - INTEGER(IntKi), PARAMETER :: M87N7RDxe = 14146 - INTEGER(IntKi), PARAMETER :: M87N8RDxe = 14147 - INTEGER(IntKi), PARAMETER :: M87N9RDxe = 14148 - INTEGER(IntKi), PARAMETER :: M88N1RDxe = 14149 - INTEGER(IntKi), PARAMETER :: M88N2RDxe = 14150 - INTEGER(IntKi), PARAMETER :: M88N3RDxe = 14151 - INTEGER(IntKi), PARAMETER :: M88N4RDxe = 14152 - INTEGER(IntKi), PARAMETER :: M88N5RDxe = 14153 - INTEGER(IntKi), PARAMETER :: M88N6RDxe = 14154 - INTEGER(IntKi), PARAMETER :: M88N7RDxe = 14155 - INTEGER(IntKi), PARAMETER :: M88N8RDxe = 14156 - INTEGER(IntKi), PARAMETER :: M88N9RDxe = 14157 - INTEGER(IntKi), PARAMETER :: M89N1RDxe = 14158 - INTEGER(IntKi), PARAMETER :: M89N2RDxe = 14159 - INTEGER(IntKi), PARAMETER :: M89N3RDxe = 14160 - INTEGER(IntKi), PARAMETER :: M89N4RDxe = 14161 - INTEGER(IntKi), PARAMETER :: M89N5RDxe = 14162 - INTEGER(IntKi), PARAMETER :: M89N6RDxe = 14163 - INTEGER(IntKi), PARAMETER :: M89N7RDxe = 14164 - INTEGER(IntKi), PARAMETER :: M89N8RDxe = 14165 - INTEGER(IntKi), PARAMETER :: M89N9RDxe = 14166 - INTEGER(IntKi), PARAMETER :: M90N1RDxe = 14167 - INTEGER(IntKi), PARAMETER :: M90N2RDxe = 14168 - INTEGER(IntKi), PARAMETER :: M90N3RDxe = 14169 - INTEGER(IntKi), PARAMETER :: M90N4RDxe = 14170 - INTEGER(IntKi), PARAMETER :: M90N5RDxe = 14171 - INTEGER(IntKi), PARAMETER :: M90N6RDxe = 14172 - INTEGER(IntKi), PARAMETER :: M90N7RDxe = 14173 - INTEGER(IntKi), PARAMETER :: M90N8RDxe = 14174 - INTEGER(IntKi), PARAMETER :: M90N9RDxe = 14175 - INTEGER(IntKi), PARAMETER :: M91N1RDxe = 14176 - INTEGER(IntKi), PARAMETER :: M91N2RDxe = 14177 - INTEGER(IntKi), PARAMETER :: M91N3RDxe = 14178 - INTEGER(IntKi), PARAMETER :: M91N4RDxe = 14179 - INTEGER(IntKi), PARAMETER :: M91N5RDxe = 14180 - INTEGER(IntKi), PARAMETER :: M91N6RDxe = 14181 - INTEGER(IntKi), PARAMETER :: M91N7RDxe = 14182 - INTEGER(IntKi), PARAMETER :: M91N8RDxe = 14183 - INTEGER(IntKi), PARAMETER :: M91N9RDxe = 14184 - INTEGER(IntKi), PARAMETER :: M92N1RDxe = 14185 - INTEGER(IntKi), PARAMETER :: M92N2RDxe = 14186 - INTEGER(IntKi), PARAMETER :: M92N3RDxe = 14187 - INTEGER(IntKi), PARAMETER :: M92N4RDxe = 14188 - INTEGER(IntKi), PARAMETER :: M92N5RDxe = 14189 - INTEGER(IntKi), PARAMETER :: M92N6RDxe = 14190 - INTEGER(IntKi), PARAMETER :: M92N7RDxe = 14191 - INTEGER(IntKi), PARAMETER :: M92N8RDxe = 14192 - INTEGER(IntKi), PARAMETER :: M92N9RDxe = 14193 - INTEGER(IntKi), PARAMETER :: M93N1RDxe = 14194 - INTEGER(IntKi), PARAMETER :: M93N2RDxe = 14195 - INTEGER(IntKi), PARAMETER :: M93N3RDxe = 14196 - INTEGER(IntKi), PARAMETER :: M93N4RDxe = 14197 - INTEGER(IntKi), PARAMETER :: M93N5RDxe = 14198 - INTEGER(IntKi), PARAMETER :: M93N6RDxe = 14199 - INTEGER(IntKi), PARAMETER :: M93N7RDxe = 14200 - INTEGER(IntKi), PARAMETER :: M93N8RDxe = 14201 - INTEGER(IntKi), PARAMETER :: M93N9RDxe = 14202 - INTEGER(IntKi), PARAMETER :: M94N1RDxe = 14203 - INTEGER(IntKi), PARAMETER :: M94N2RDxe = 14204 - INTEGER(IntKi), PARAMETER :: M94N3RDxe = 14205 - INTEGER(IntKi), PARAMETER :: M94N4RDxe = 14206 - INTEGER(IntKi), PARAMETER :: M94N5RDxe = 14207 - INTEGER(IntKi), PARAMETER :: M94N6RDxe = 14208 - INTEGER(IntKi), PARAMETER :: M94N7RDxe = 14209 - INTEGER(IntKi), PARAMETER :: M94N8RDxe = 14210 - INTEGER(IntKi), PARAMETER :: M94N9RDxe = 14211 - INTEGER(IntKi), PARAMETER :: M95N1RDxe = 14212 - INTEGER(IntKi), PARAMETER :: M95N2RDxe = 14213 - INTEGER(IntKi), PARAMETER :: M95N3RDxe = 14214 - INTEGER(IntKi), PARAMETER :: M95N4RDxe = 14215 - INTEGER(IntKi), PARAMETER :: M95N5RDxe = 14216 - INTEGER(IntKi), PARAMETER :: M95N6RDxe = 14217 - INTEGER(IntKi), PARAMETER :: M95N7RDxe = 14218 - INTEGER(IntKi), PARAMETER :: M95N8RDxe = 14219 - INTEGER(IntKi), PARAMETER :: M95N9RDxe = 14220 - INTEGER(IntKi), PARAMETER :: M96N1RDxe = 14221 - INTEGER(IntKi), PARAMETER :: M96N2RDxe = 14222 - INTEGER(IntKi), PARAMETER :: M96N3RDxe = 14223 - INTEGER(IntKi), PARAMETER :: M96N4RDxe = 14224 - INTEGER(IntKi), PARAMETER :: M96N5RDxe = 14225 - INTEGER(IntKi), PARAMETER :: M96N6RDxe = 14226 - INTEGER(IntKi), PARAMETER :: M96N7RDxe = 14227 - INTEGER(IntKi), PARAMETER :: M96N8RDxe = 14228 - INTEGER(IntKi), PARAMETER :: M96N9RDxe = 14229 - INTEGER(IntKi), PARAMETER :: M97N1RDxe = 14230 - INTEGER(IntKi), PARAMETER :: M97N2RDxe = 14231 - INTEGER(IntKi), PARAMETER :: M97N3RDxe = 14232 - INTEGER(IntKi), PARAMETER :: M97N4RDxe = 14233 - INTEGER(IntKi), PARAMETER :: M97N5RDxe = 14234 - INTEGER(IntKi), PARAMETER :: M97N6RDxe = 14235 - INTEGER(IntKi), PARAMETER :: M97N7RDxe = 14236 - INTEGER(IntKi), PARAMETER :: M97N8RDxe = 14237 - INTEGER(IntKi), PARAMETER :: M97N9RDxe = 14238 - INTEGER(IntKi), PARAMETER :: M98N1RDxe = 14239 - INTEGER(IntKi), PARAMETER :: M98N2RDxe = 14240 - INTEGER(IntKi), PARAMETER :: M98N3RDxe = 14241 - INTEGER(IntKi), PARAMETER :: M98N4RDxe = 14242 - INTEGER(IntKi), PARAMETER :: M98N5RDxe = 14243 - INTEGER(IntKi), PARAMETER :: M98N6RDxe = 14244 - INTEGER(IntKi), PARAMETER :: M98N7RDxe = 14245 - INTEGER(IntKi), PARAMETER :: M98N8RDxe = 14246 - INTEGER(IntKi), PARAMETER :: M98N9RDxe = 14247 - INTEGER(IntKi), PARAMETER :: M99N1RDxe = 14248 - INTEGER(IntKi), PARAMETER :: M99N2RDxe = 14249 - INTEGER(IntKi), PARAMETER :: M99N3RDxe = 14250 - INTEGER(IntKi), PARAMETER :: M99N4RDxe = 14251 - INTEGER(IntKi), PARAMETER :: M99N5RDxe = 14252 - INTEGER(IntKi), PARAMETER :: M99N6RDxe = 14253 - INTEGER(IntKi), PARAMETER :: M99N7RDxe = 14254 - INTEGER(IntKi), PARAMETER :: M99N8RDxe = 14255 - INTEGER(IntKi), PARAMETER :: M99N9RDxe = 14256 - INTEGER(IntKi), PARAMETER :: M01N1RDye = 14257 - INTEGER(IntKi), PARAMETER :: M01N2RDye = 14258 - INTEGER(IntKi), PARAMETER :: M01N3RDye = 14259 - INTEGER(IntKi), PARAMETER :: M01N4RDye = 14260 - INTEGER(IntKi), PARAMETER :: M01N5RDye = 14261 - INTEGER(IntKi), PARAMETER :: M01N6RDye = 14262 - INTEGER(IntKi), PARAMETER :: M01N7RDye = 14263 - INTEGER(IntKi), PARAMETER :: M01N8RDye = 14264 - INTEGER(IntKi), PARAMETER :: M01N9RDye = 14265 - INTEGER(IntKi), PARAMETER :: M02N1RDye = 14266 - INTEGER(IntKi), PARAMETER :: M02N2RDye = 14267 - INTEGER(IntKi), PARAMETER :: M02N3RDye = 14268 - INTEGER(IntKi), PARAMETER :: M02N4RDye = 14269 - INTEGER(IntKi), PARAMETER :: M02N5RDye = 14270 - INTEGER(IntKi), PARAMETER :: M02N6RDye = 14271 - INTEGER(IntKi), PARAMETER :: M02N7RDye = 14272 - INTEGER(IntKi), PARAMETER :: M02N8RDye = 14273 - INTEGER(IntKi), PARAMETER :: M02N9RDye = 14274 - INTEGER(IntKi), PARAMETER :: M03N1RDye = 14275 - INTEGER(IntKi), PARAMETER :: M03N2RDye = 14276 - INTEGER(IntKi), PARAMETER :: M03N3RDye = 14277 - INTEGER(IntKi), PARAMETER :: M03N4RDye = 14278 - INTEGER(IntKi), PARAMETER :: M03N5RDye = 14279 - INTEGER(IntKi), PARAMETER :: M03N6RDye = 14280 - INTEGER(IntKi), PARAMETER :: M03N7RDye = 14281 - INTEGER(IntKi), PARAMETER :: M03N8RDye = 14282 - INTEGER(IntKi), PARAMETER :: M03N9RDye = 14283 - INTEGER(IntKi), PARAMETER :: M04N1RDye = 14284 - INTEGER(IntKi), PARAMETER :: M04N2RDye = 14285 - INTEGER(IntKi), PARAMETER :: M04N3RDye = 14286 - INTEGER(IntKi), PARAMETER :: M04N4RDye = 14287 - INTEGER(IntKi), PARAMETER :: M04N5RDye = 14288 - INTEGER(IntKi), PARAMETER :: M04N6RDye = 14289 - INTEGER(IntKi), PARAMETER :: M04N7RDye = 14290 - INTEGER(IntKi), PARAMETER :: M04N8RDye = 14291 - INTEGER(IntKi), PARAMETER :: M04N9RDye = 14292 - INTEGER(IntKi), PARAMETER :: M05N1RDye = 14293 - INTEGER(IntKi), PARAMETER :: M05N2RDye = 14294 - INTEGER(IntKi), PARAMETER :: M05N3RDye = 14295 - INTEGER(IntKi), PARAMETER :: M05N4RDye = 14296 - INTEGER(IntKi), PARAMETER :: M05N5RDye = 14297 - INTEGER(IntKi), PARAMETER :: M05N6RDye = 14298 - INTEGER(IntKi), PARAMETER :: M05N7RDye = 14299 - INTEGER(IntKi), PARAMETER :: M05N8RDye = 14300 - INTEGER(IntKi), PARAMETER :: M05N9RDye = 14301 - INTEGER(IntKi), PARAMETER :: M06N1RDye = 14302 - INTEGER(IntKi), PARAMETER :: M06N2RDye = 14303 - INTEGER(IntKi), PARAMETER :: M06N3RDye = 14304 - INTEGER(IntKi), PARAMETER :: M06N4RDye = 14305 - INTEGER(IntKi), PARAMETER :: M06N5RDye = 14306 - INTEGER(IntKi), PARAMETER :: M06N6RDye = 14307 - INTEGER(IntKi), PARAMETER :: M06N7RDye = 14308 - INTEGER(IntKi), PARAMETER :: M06N8RDye = 14309 - INTEGER(IntKi), PARAMETER :: M06N9RDye = 14310 - INTEGER(IntKi), PARAMETER :: M07N1RDye = 14311 - INTEGER(IntKi), PARAMETER :: M07N2RDye = 14312 - INTEGER(IntKi), PARAMETER :: M07N3RDye = 14313 - INTEGER(IntKi), PARAMETER :: M07N4RDye = 14314 - INTEGER(IntKi), PARAMETER :: M07N5RDye = 14315 - INTEGER(IntKi), PARAMETER :: M07N6RDye = 14316 - INTEGER(IntKi), PARAMETER :: M07N7RDye = 14317 - INTEGER(IntKi), PARAMETER :: M07N8RDye = 14318 - INTEGER(IntKi), PARAMETER :: M07N9RDye = 14319 - INTEGER(IntKi), PARAMETER :: M08N1RDye = 14320 - INTEGER(IntKi), PARAMETER :: M08N2RDye = 14321 - INTEGER(IntKi), PARAMETER :: M08N3RDye = 14322 - INTEGER(IntKi), PARAMETER :: M08N4RDye = 14323 - INTEGER(IntKi), PARAMETER :: M08N5RDye = 14324 - INTEGER(IntKi), PARAMETER :: M08N6RDye = 14325 - INTEGER(IntKi), PARAMETER :: M08N7RDye = 14326 - INTEGER(IntKi), PARAMETER :: M08N8RDye = 14327 - INTEGER(IntKi), PARAMETER :: M08N9RDye = 14328 - INTEGER(IntKi), PARAMETER :: M09N1RDye = 14329 - INTEGER(IntKi), PARAMETER :: M09N2RDye = 14330 - INTEGER(IntKi), PARAMETER :: M09N3RDye = 14331 - INTEGER(IntKi), PARAMETER :: M09N4RDye = 14332 - INTEGER(IntKi), PARAMETER :: M09N5RDye = 14333 - INTEGER(IntKi), PARAMETER :: M09N6RDye = 14334 - INTEGER(IntKi), PARAMETER :: M09N7RDye = 14335 - INTEGER(IntKi), PARAMETER :: M09N8RDye = 14336 - INTEGER(IntKi), PARAMETER :: M09N9RDye = 14337 - INTEGER(IntKi), PARAMETER :: M10N1RDye = 14338 - INTEGER(IntKi), PARAMETER :: M10N2RDye = 14339 - INTEGER(IntKi), PARAMETER :: M10N3RDye = 14340 - INTEGER(IntKi), PARAMETER :: M10N4RDye = 14341 - INTEGER(IntKi), PARAMETER :: M10N5RDye = 14342 - INTEGER(IntKi), PARAMETER :: M10N6RDye = 14343 - INTEGER(IntKi), PARAMETER :: M10N7RDye = 14344 - INTEGER(IntKi), PARAMETER :: M10N8RDye = 14345 - INTEGER(IntKi), PARAMETER :: M10N9RDye = 14346 - INTEGER(IntKi), PARAMETER :: M11N1RDye = 14347 - INTEGER(IntKi), PARAMETER :: M11N2RDye = 14348 - INTEGER(IntKi), PARAMETER :: M11N3RDye = 14349 - INTEGER(IntKi), PARAMETER :: M11N4RDye = 14350 - INTEGER(IntKi), PARAMETER :: M11N5RDye = 14351 - INTEGER(IntKi), PARAMETER :: M11N6RDye = 14352 - INTEGER(IntKi), PARAMETER :: M11N7RDye = 14353 - INTEGER(IntKi), PARAMETER :: M11N8RDye = 14354 - INTEGER(IntKi), PARAMETER :: M11N9RDye = 14355 - INTEGER(IntKi), PARAMETER :: M12N1RDye = 14356 - INTEGER(IntKi), PARAMETER :: M12N2RDye = 14357 - INTEGER(IntKi), PARAMETER :: M12N3RDye = 14358 - INTEGER(IntKi), PARAMETER :: M12N4RDye = 14359 - INTEGER(IntKi), PARAMETER :: M12N5RDye = 14360 - INTEGER(IntKi), PARAMETER :: M12N6RDye = 14361 - INTEGER(IntKi), PARAMETER :: M12N7RDye = 14362 - INTEGER(IntKi), PARAMETER :: M12N8RDye = 14363 - INTEGER(IntKi), PARAMETER :: M12N9RDye = 14364 - INTEGER(IntKi), PARAMETER :: M13N1RDye = 14365 - INTEGER(IntKi), PARAMETER :: M13N2RDye = 14366 - INTEGER(IntKi), PARAMETER :: M13N3RDye = 14367 - INTEGER(IntKi), PARAMETER :: M13N4RDye = 14368 - INTEGER(IntKi), PARAMETER :: M13N5RDye = 14369 - INTEGER(IntKi), PARAMETER :: M13N6RDye = 14370 - INTEGER(IntKi), PARAMETER :: M13N7RDye = 14371 - INTEGER(IntKi), PARAMETER :: M13N8RDye = 14372 - INTEGER(IntKi), PARAMETER :: M13N9RDye = 14373 - INTEGER(IntKi), PARAMETER :: M14N1RDye = 14374 - INTEGER(IntKi), PARAMETER :: M14N2RDye = 14375 - INTEGER(IntKi), PARAMETER :: M14N3RDye = 14376 - INTEGER(IntKi), PARAMETER :: M14N4RDye = 14377 - INTEGER(IntKi), PARAMETER :: M14N5RDye = 14378 - INTEGER(IntKi), PARAMETER :: M14N6RDye = 14379 - INTEGER(IntKi), PARAMETER :: M14N7RDye = 14380 - INTEGER(IntKi), PARAMETER :: M14N8RDye = 14381 - INTEGER(IntKi), PARAMETER :: M14N9RDye = 14382 - INTEGER(IntKi), PARAMETER :: M15N1RDye = 14383 - INTEGER(IntKi), PARAMETER :: M15N2RDye = 14384 - INTEGER(IntKi), PARAMETER :: M15N3RDye = 14385 - INTEGER(IntKi), PARAMETER :: M15N4RDye = 14386 - INTEGER(IntKi), PARAMETER :: M15N5RDye = 14387 - INTEGER(IntKi), PARAMETER :: M15N6RDye = 14388 - INTEGER(IntKi), PARAMETER :: M15N7RDye = 14389 - INTEGER(IntKi), PARAMETER :: M15N8RDye = 14390 - INTEGER(IntKi), PARAMETER :: M15N9RDye = 14391 - INTEGER(IntKi), PARAMETER :: M16N1RDye = 14392 - INTEGER(IntKi), PARAMETER :: M16N2RDye = 14393 - INTEGER(IntKi), PARAMETER :: M16N3RDye = 14394 - INTEGER(IntKi), PARAMETER :: M16N4RDye = 14395 - INTEGER(IntKi), PARAMETER :: M16N5RDye = 14396 - INTEGER(IntKi), PARAMETER :: M16N6RDye = 14397 - INTEGER(IntKi), PARAMETER :: M16N7RDye = 14398 - INTEGER(IntKi), PARAMETER :: M16N8RDye = 14399 - INTEGER(IntKi), PARAMETER :: M16N9RDye = 14400 - INTEGER(IntKi), PARAMETER :: M17N1RDye = 14401 - INTEGER(IntKi), PARAMETER :: M17N2RDye = 14402 - INTEGER(IntKi), PARAMETER :: M17N3RDye = 14403 - INTEGER(IntKi), PARAMETER :: M17N4RDye = 14404 - INTEGER(IntKi), PARAMETER :: M17N5RDye = 14405 - INTEGER(IntKi), PARAMETER :: M17N6RDye = 14406 - INTEGER(IntKi), PARAMETER :: M17N7RDye = 14407 - INTEGER(IntKi), PARAMETER :: M17N8RDye = 14408 - INTEGER(IntKi), PARAMETER :: M17N9RDye = 14409 - INTEGER(IntKi), PARAMETER :: M18N1RDye = 14410 - INTEGER(IntKi), PARAMETER :: M18N2RDye = 14411 - INTEGER(IntKi), PARAMETER :: M18N3RDye = 14412 - INTEGER(IntKi), PARAMETER :: M18N4RDye = 14413 - INTEGER(IntKi), PARAMETER :: M18N5RDye = 14414 - INTEGER(IntKi), PARAMETER :: M18N6RDye = 14415 - INTEGER(IntKi), PARAMETER :: M18N7RDye = 14416 - INTEGER(IntKi), PARAMETER :: M18N8RDye = 14417 - INTEGER(IntKi), PARAMETER :: M18N9RDye = 14418 - INTEGER(IntKi), PARAMETER :: M19N1RDye = 14419 - INTEGER(IntKi), PARAMETER :: M19N2RDye = 14420 - INTEGER(IntKi), PARAMETER :: M19N3RDye = 14421 - INTEGER(IntKi), PARAMETER :: M19N4RDye = 14422 - INTEGER(IntKi), PARAMETER :: M19N5RDye = 14423 - INTEGER(IntKi), PARAMETER :: M19N6RDye = 14424 - INTEGER(IntKi), PARAMETER :: M19N7RDye = 14425 - INTEGER(IntKi), PARAMETER :: M19N8RDye = 14426 - INTEGER(IntKi), PARAMETER :: M19N9RDye = 14427 - INTEGER(IntKi), PARAMETER :: M20N1RDye = 14428 - INTEGER(IntKi), PARAMETER :: M20N2RDye = 14429 - INTEGER(IntKi), PARAMETER :: M20N3RDye = 14430 - INTEGER(IntKi), PARAMETER :: M20N4RDye = 14431 - INTEGER(IntKi), PARAMETER :: M20N5RDye = 14432 - INTEGER(IntKi), PARAMETER :: M20N6RDye = 14433 - INTEGER(IntKi), PARAMETER :: M20N7RDye = 14434 - INTEGER(IntKi), PARAMETER :: M20N8RDye = 14435 - INTEGER(IntKi), PARAMETER :: M20N9RDye = 14436 - INTEGER(IntKi), PARAMETER :: M21N1RDye = 14437 - INTEGER(IntKi), PARAMETER :: M21N2RDye = 14438 - INTEGER(IntKi), PARAMETER :: M21N3RDye = 14439 - INTEGER(IntKi), PARAMETER :: M21N4RDye = 14440 - INTEGER(IntKi), PARAMETER :: M21N5RDye = 14441 - INTEGER(IntKi), PARAMETER :: M21N6RDye = 14442 - INTEGER(IntKi), PARAMETER :: M21N7RDye = 14443 - INTEGER(IntKi), PARAMETER :: M21N8RDye = 14444 - INTEGER(IntKi), PARAMETER :: M21N9RDye = 14445 - INTEGER(IntKi), PARAMETER :: M22N1RDye = 14446 - INTEGER(IntKi), PARAMETER :: M22N2RDye = 14447 - INTEGER(IntKi), PARAMETER :: M22N3RDye = 14448 - INTEGER(IntKi), PARAMETER :: M22N4RDye = 14449 - INTEGER(IntKi), PARAMETER :: M22N5RDye = 14450 - INTEGER(IntKi), PARAMETER :: M22N6RDye = 14451 - INTEGER(IntKi), PARAMETER :: M22N7RDye = 14452 - INTEGER(IntKi), PARAMETER :: M22N8RDye = 14453 - INTEGER(IntKi), PARAMETER :: M22N9RDye = 14454 - INTEGER(IntKi), PARAMETER :: M23N1RDye = 14455 - INTEGER(IntKi), PARAMETER :: M23N2RDye = 14456 - INTEGER(IntKi), PARAMETER :: M23N3RDye = 14457 - INTEGER(IntKi), PARAMETER :: M23N4RDye = 14458 - INTEGER(IntKi), PARAMETER :: M23N5RDye = 14459 - INTEGER(IntKi), PARAMETER :: M23N6RDye = 14460 - INTEGER(IntKi), PARAMETER :: M23N7RDye = 14461 - INTEGER(IntKi), PARAMETER :: M23N8RDye = 14462 - INTEGER(IntKi), PARAMETER :: M23N9RDye = 14463 - INTEGER(IntKi), PARAMETER :: M24N1RDye = 14464 - INTEGER(IntKi), PARAMETER :: M24N2RDye = 14465 - INTEGER(IntKi), PARAMETER :: M24N3RDye = 14466 - INTEGER(IntKi), PARAMETER :: M24N4RDye = 14467 - INTEGER(IntKi), PARAMETER :: M24N5RDye = 14468 - INTEGER(IntKi), PARAMETER :: M24N6RDye = 14469 - INTEGER(IntKi), PARAMETER :: M24N7RDye = 14470 - INTEGER(IntKi), PARAMETER :: M24N8RDye = 14471 - INTEGER(IntKi), PARAMETER :: M24N9RDye = 14472 - INTEGER(IntKi), PARAMETER :: M25N1RDye = 14473 - INTEGER(IntKi), PARAMETER :: M25N2RDye = 14474 - INTEGER(IntKi), PARAMETER :: M25N3RDye = 14475 - INTEGER(IntKi), PARAMETER :: M25N4RDye = 14476 - INTEGER(IntKi), PARAMETER :: M25N5RDye = 14477 - INTEGER(IntKi), PARAMETER :: M25N6RDye = 14478 - INTEGER(IntKi), PARAMETER :: M25N7RDye = 14479 - INTEGER(IntKi), PARAMETER :: M25N8RDye = 14480 - INTEGER(IntKi), PARAMETER :: M25N9RDye = 14481 - INTEGER(IntKi), PARAMETER :: M26N1RDye = 14482 - INTEGER(IntKi), PARAMETER :: M26N2RDye = 14483 - INTEGER(IntKi), PARAMETER :: M26N3RDye = 14484 - INTEGER(IntKi), PARAMETER :: M26N4RDye = 14485 - INTEGER(IntKi), PARAMETER :: M26N5RDye = 14486 - INTEGER(IntKi), PARAMETER :: M26N6RDye = 14487 - INTEGER(IntKi), PARAMETER :: M26N7RDye = 14488 - INTEGER(IntKi), PARAMETER :: M26N8RDye = 14489 - INTEGER(IntKi), PARAMETER :: M26N9RDye = 14490 - INTEGER(IntKi), PARAMETER :: M27N1RDye = 14491 - INTEGER(IntKi), PARAMETER :: M27N2RDye = 14492 - INTEGER(IntKi), PARAMETER :: M27N3RDye = 14493 - INTEGER(IntKi), PARAMETER :: M27N4RDye = 14494 - INTEGER(IntKi), PARAMETER :: M27N5RDye = 14495 - INTEGER(IntKi), PARAMETER :: M27N6RDye = 14496 - INTEGER(IntKi), PARAMETER :: M27N7RDye = 14497 - INTEGER(IntKi), PARAMETER :: M27N8RDye = 14498 - INTEGER(IntKi), PARAMETER :: M27N9RDye = 14499 - INTEGER(IntKi), PARAMETER :: M28N1RDye = 14500 - INTEGER(IntKi), PARAMETER :: M28N2RDye = 14501 - INTEGER(IntKi), PARAMETER :: M28N3RDye = 14502 - INTEGER(IntKi), PARAMETER :: M28N4RDye = 14503 - INTEGER(IntKi), PARAMETER :: M28N5RDye = 14504 - INTEGER(IntKi), PARAMETER :: M28N6RDye = 14505 - INTEGER(IntKi), PARAMETER :: M28N7RDye = 14506 - INTEGER(IntKi), PARAMETER :: M28N8RDye = 14507 - INTEGER(IntKi), PARAMETER :: M28N9RDye = 14508 - INTEGER(IntKi), PARAMETER :: M29N1RDye = 14509 - INTEGER(IntKi), PARAMETER :: M29N2RDye = 14510 - INTEGER(IntKi), PARAMETER :: M29N3RDye = 14511 - INTEGER(IntKi), PARAMETER :: M29N4RDye = 14512 - INTEGER(IntKi), PARAMETER :: M29N5RDye = 14513 - INTEGER(IntKi), PARAMETER :: M29N6RDye = 14514 - INTEGER(IntKi), PARAMETER :: M29N7RDye = 14515 - INTEGER(IntKi), PARAMETER :: M29N8RDye = 14516 - INTEGER(IntKi), PARAMETER :: M29N9RDye = 14517 - INTEGER(IntKi), PARAMETER :: M30N1RDye = 14518 - INTEGER(IntKi), PARAMETER :: M30N2RDye = 14519 - INTEGER(IntKi), PARAMETER :: M30N3RDye = 14520 - INTEGER(IntKi), PARAMETER :: M30N4RDye = 14521 - INTEGER(IntKi), PARAMETER :: M30N5RDye = 14522 - INTEGER(IntKi), PARAMETER :: M30N6RDye = 14523 - INTEGER(IntKi), PARAMETER :: M30N7RDye = 14524 - INTEGER(IntKi), PARAMETER :: M30N8RDye = 14525 - INTEGER(IntKi), PARAMETER :: M30N9RDye = 14526 - INTEGER(IntKi), PARAMETER :: M31N1RDye = 14527 - INTEGER(IntKi), PARAMETER :: M31N2RDye = 14528 - INTEGER(IntKi), PARAMETER :: M31N3RDye = 14529 - INTEGER(IntKi), PARAMETER :: M31N4RDye = 14530 - INTEGER(IntKi), PARAMETER :: M31N5RDye = 14531 - INTEGER(IntKi), PARAMETER :: M31N6RDye = 14532 - INTEGER(IntKi), PARAMETER :: M31N7RDye = 14533 - INTEGER(IntKi), PARAMETER :: M31N8RDye = 14534 - INTEGER(IntKi), PARAMETER :: M31N9RDye = 14535 - INTEGER(IntKi), PARAMETER :: M32N1RDye = 14536 - INTEGER(IntKi), PARAMETER :: M32N2RDye = 14537 - INTEGER(IntKi), PARAMETER :: M32N3RDye = 14538 - INTEGER(IntKi), PARAMETER :: M32N4RDye = 14539 - INTEGER(IntKi), PARAMETER :: M32N5RDye = 14540 - INTEGER(IntKi), PARAMETER :: M32N6RDye = 14541 - INTEGER(IntKi), PARAMETER :: M32N7RDye = 14542 - INTEGER(IntKi), PARAMETER :: M32N8RDye = 14543 - INTEGER(IntKi), PARAMETER :: M32N9RDye = 14544 - INTEGER(IntKi), PARAMETER :: M33N1RDye = 14545 - INTEGER(IntKi), PARAMETER :: M33N2RDye = 14546 - INTEGER(IntKi), PARAMETER :: M33N3RDye = 14547 - INTEGER(IntKi), PARAMETER :: M33N4RDye = 14548 - INTEGER(IntKi), PARAMETER :: M33N5RDye = 14549 - INTEGER(IntKi), PARAMETER :: M33N6RDye = 14550 - INTEGER(IntKi), PARAMETER :: M33N7RDye = 14551 - INTEGER(IntKi), PARAMETER :: M33N8RDye = 14552 - INTEGER(IntKi), PARAMETER :: M33N9RDye = 14553 - INTEGER(IntKi), PARAMETER :: M34N1RDye = 14554 - INTEGER(IntKi), PARAMETER :: M34N2RDye = 14555 - INTEGER(IntKi), PARAMETER :: M34N3RDye = 14556 - INTEGER(IntKi), PARAMETER :: M34N4RDye = 14557 - INTEGER(IntKi), PARAMETER :: M34N5RDye = 14558 - INTEGER(IntKi), PARAMETER :: M34N6RDye = 14559 - INTEGER(IntKi), PARAMETER :: M34N7RDye = 14560 - INTEGER(IntKi), PARAMETER :: M34N8RDye = 14561 - INTEGER(IntKi), PARAMETER :: M34N9RDye = 14562 - INTEGER(IntKi), PARAMETER :: M35N1RDye = 14563 - INTEGER(IntKi), PARAMETER :: M35N2RDye = 14564 - INTEGER(IntKi), PARAMETER :: M35N3RDye = 14565 - INTEGER(IntKi), PARAMETER :: M35N4RDye = 14566 - INTEGER(IntKi), PARAMETER :: M35N5RDye = 14567 - INTEGER(IntKi), PARAMETER :: M35N6RDye = 14568 - INTEGER(IntKi), PARAMETER :: M35N7RDye = 14569 - INTEGER(IntKi), PARAMETER :: M35N8RDye = 14570 - INTEGER(IntKi), PARAMETER :: M35N9RDye = 14571 - INTEGER(IntKi), PARAMETER :: M36N1RDye = 14572 - INTEGER(IntKi), PARAMETER :: M36N2RDye = 14573 - INTEGER(IntKi), PARAMETER :: M36N3RDye = 14574 - INTEGER(IntKi), PARAMETER :: M36N4RDye = 14575 - INTEGER(IntKi), PARAMETER :: M36N5RDye = 14576 - INTEGER(IntKi), PARAMETER :: M36N6RDye = 14577 - INTEGER(IntKi), PARAMETER :: M36N7RDye = 14578 - INTEGER(IntKi), PARAMETER :: M36N8RDye = 14579 - INTEGER(IntKi), PARAMETER :: M36N9RDye = 14580 - INTEGER(IntKi), PARAMETER :: M37N1RDye = 14581 - INTEGER(IntKi), PARAMETER :: M37N2RDye = 14582 - INTEGER(IntKi), PARAMETER :: M37N3RDye = 14583 - INTEGER(IntKi), PARAMETER :: M37N4RDye = 14584 - INTEGER(IntKi), PARAMETER :: M37N5RDye = 14585 - INTEGER(IntKi), PARAMETER :: M37N6RDye = 14586 - INTEGER(IntKi), PARAMETER :: M37N7RDye = 14587 - INTEGER(IntKi), PARAMETER :: M37N8RDye = 14588 - INTEGER(IntKi), PARAMETER :: M37N9RDye = 14589 - INTEGER(IntKi), PARAMETER :: M38N1RDye = 14590 - INTEGER(IntKi), PARAMETER :: M38N2RDye = 14591 - INTEGER(IntKi), PARAMETER :: M38N3RDye = 14592 - INTEGER(IntKi), PARAMETER :: M38N4RDye = 14593 - INTEGER(IntKi), PARAMETER :: M38N5RDye = 14594 - INTEGER(IntKi), PARAMETER :: M38N6RDye = 14595 - INTEGER(IntKi), PARAMETER :: M38N7RDye = 14596 - INTEGER(IntKi), PARAMETER :: M38N8RDye = 14597 - INTEGER(IntKi), PARAMETER :: M38N9RDye = 14598 - INTEGER(IntKi), PARAMETER :: M39N1RDye = 14599 - INTEGER(IntKi), PARAMETER :: M39N2RDye = 14600 - INTEGER(IntKi), PARAMETER :: M39N3RDye = 14601 - INTEGER(IntKi), PARAMETER :: M39N4RDye = 14602 - INTEGER(IntKi), PARAMETER :: M39N5RDye = 14603 - INTEGER(IntKi), PARAMETER :: M39N6RDye = 14604 - INTEGER(IntKi), PARAMETER :: M39N7RDye = 14605 - INTEGER(IntKi), PARAMETER :: M39N8RDye = 14606 - INTEGER(IntKi), PARAMETER :: M39N9RDye = 14607 - INTEGER(IntKi), PARAMETER :: M40N1RDye = 14608 - INTEGER(IntKi), PARAMETER :: M40N2RDye = 14609 - INTEGER(IntKi), PARAMETER :: M40N3RDye = 14610 - INTEGER(IntKi), PARAMETER :: M40N4RDye = 14611 - INTEGER(IntKi), PARAMETER :: M40N5RDye = 14612 - INTEGER(IntKi), PARAMETER :: M40N6RDye = 14613 - INTEGER(IntKi), PARAMETER :: M40N7RDye = 14614 - INTEGER(IntKi), PARAMETER :: M40N8RDye = 14615 - INTEGER(IntKi), PARAMETER :: M40N9RDye = 14616 - INTEGER(IntKi), PARAMETER :: M41N1RDye = 14617 - INTEGER(IntKi), PARAMETER :: M41N2RDye = 14618 - INTEGER(IntKi), PARAMETER :: M41N3RDye = 14619 - INTEGER(IntKi), PARAMETER :: M41N4RDye = 14620 - INTEGER(IntKi), PARAMETER :: M41N5RDye = 14621 - INTEGER(IntKi), PARAMETER :: M41N6RDye = 14622 - INTEGER(IntKi), PARAMETER :: M41N7RDye = 14623 - INTEGER(IntKi), PARAMETER :: M41N8RDye = 14624 - INTEGER(IntKi), PARAMETER :: M41N9RDye = 14625 - INTEGER(IntKi), PARAMETER :: M42N1RDye = 14626 - INTEGER(IntKi), PARAMETER :: M42N2RDye = 14627 - INTEGER(IntKi), PARAMETER :: M42N3RDye = 14628 - INTEGER(IntKi), PARAMETER :: M42N4RDye = 14629 - INTEGER(IntKi), PARAMETER :: M42N5RDye = 14630 - INTEGER(IntKi), PARAMETER :: M42N6RDye = 14631 - INTEGER(IntKi), PARAMETER :: M42N7RDye = 14632 - INTEGER(IntKi), PARAMETER :: M42N8RDye = 14633 - INTEGER(IntKi), PARAMETER :: M42N9RDye = 14634 - INTEGER(IntKi), PARAMETER :: M43N1RDye = 14635 - INTEGER(IntKi), PARAMETER :: M43N2RDye = 14636 - INTEGER(IntKi), PARAMETER :: M43N3RDye = 14637 - INTEGER(IntKi), PARAMETER :: M43N4RDye = 14638 - INTEGER(IntKi), PARAMETER :: M43N5RDye = 14639 - INTEGER(IntKi), PARAMETER :: M43N6RDye = 14640 - INTEGER(IntKi), PARAMETER :: M43N7RDye = 14641 - INTEGER(IntKi), PARAMETER :: M43N8RDye = 14642 - INTEGER(IntKi), PARAMETER :: M43N9RDye = 14643 - INTEGER(IntKi), PARAMETER :: M44N1RDye = 14644 - INTEGER(IntKi), PARAMETER :: M44N2RDye = 14645 - INTEGER(IntKi), PARAMETER :: M44N3RDye = 14646 - INTEGER(IntKi), PARAMETER :: M44N4RDye = 14647 - INTEGER(IntKi), PARAMETER :: M44N5RDye = 14648 - INTEGER(IntKi), PARAMETER :: M44N6RDye = 14649 - INTEGER(IntKi), PARAMETER :: M44N7RDye = 14650 - INTEGER(IntKi), PARAMETER :: M44N8RDye = 14651 - INTEGER(IntKi), PARAMETER :: M44N9RDye = 14652 - INTEGER(IntKi), PARAMETER :: M45N1RDye = 14653 - INTEGER(IntKi), PARAMETER :: M45N2RDye = 14654 - INTEGER(IntKi), PARAMETER :: M45N3RDye = 14655 - INTEGER(IntKi), PARAMETER :: M45N4RDye = 14656 - INTEGER(IntKi), PARAMETER :: M45N5RDye = 14657 - INTEGER(IntKi), PARAMETER :: M45N6RDye = 14658 - INTEGER(IntKi), PARAMETER :: M45N7RDye = 14659 - INTEGER(IntKi), PARAMETER :: M45N8RDye = 14660 - INTEGER(IntKi), PARAMETER :: M45N9RDye = 14661 - INTEGER(IntKi), PARAMETER :: M46N1RDye = 14662 - INTEGER(IntKi), PARAMETER :: M46N2RDye = 14663 - INTEGER(IntKi), PARAMETER :: M46N3RDye = 14664 - INTEGER(IntKi), PARAMETER :: M46N4RDye = 14665 - INTEGER(IntKi), PARAMETER :: M46N5RDye = 14666 - INTEGER(IntKi), PARAMETER :: M46N6RDye = 14667 - INTEGER(IntKi), PARAMETER :: M46N7RDye = 14668 - INTEGER(IntKi), PARAMETER :: M46N8RDye = 14669 - INTEGER(IntKi), PARAMETER :: M46N9RDye = 14670 - INTEGER(IntKi), PARAMETER :: M47N1RDye = 14671 - INTEGER(IntKi), PARAMETER :: M47N2RDye = 14672 - INTEGER(IntKi), PARAMETER :: M47N3RDye = 14673 - INTEGER(IntKi), PARAMETER :: M47N4RDye = 14674 - INTEGER(IntKi), PARAMETER :: M47N5RDye = 14675 - INTEGER(IntKi), PARAMETER :: M47N6RDye = 14676 - INTEGER(IntKi), PARAMETER :: M47N7RDye = 14677 - INTEGER(IntKi), PARAMETER :: M47N8RDye = 14678 - INTEGER(IntKi), PARAMETER :: M47N9RDye = 14679 - INTEGER(IntKi), PARAMETER :: M48N1RDye = 14680 - INTEGER(IntKi), PARAMETER :: M48N2RDye = 14681 - INTEGER(IntKi), PARAMETER :: M48N3RDye = 14682 - INTEGER(IntKi), PARAMETER :: M48N4RDye = 14683 - INTEGER(IntKi), PARAMETER :: M48N5RDye = 14684 - INTEGER(IntKi), PARAMETER :: M48N6RDye = 14685 - INTEGER(IntKi), PARAMETER :: M48N7RDye = 14686 - INTEGER(IntKi), PARAMETER :: M48N8RDye = 14687 - INTEGER(IntKi), PARAMETER :: M48N9RDye = 14688 - INTEGER(IntKi), PARAMETER :: M49N1RDye = 14689 - INTEGER(IntKi), PARAMETER :: M49N2RDye = 14690 - INTEGER(IntKi), PARAMETER :: M49N3RDye = 14691 - INTEGER(IntKi), PARAMETER :: M49N4RDye = 14692 - INTEGER(IntKi), PARAMETER :: M49N5RDye = 14693 - INTEGER(IntKi), PARAMETER :: M49N6RDye = 14694 - INTEGER(IntKi), PARAMETER :: M49N7RDye = 14695 - INTEGER(IntKi), PARAMETER :: M49N8RDye = 14696 - INTEGER(IntKi), PARAMETER :: M49N9RDye = 14697 - INTEGER(IntKi), PARAMETER :: M50N1RDye = 14698 - INTEGER(IntKi), PARAMETER :: M50N2RDye = 14699 - INTEGER(IntKi), PARAMETER :: M50N3RDye = 14700 - INTEGER(IntKi), PARAMETER :: M50N4RDye = 14701 - INTEGER(IntKi), PARAMETER :: M50N5RDye = 14702 - INTEGER(IntKi), PARAMETER :: M50N6RDye = 14703 - INTEGER(IntKi), PARAMETER :: M50N7RDye = 14704 - INTEGER(IntKi), PARAMETER :: M50N8RDye = 14705 - INTEGER(IntKi), PARAMETER :: M50N9RDye = 14706 - INTEGER(IntKi), PARAMETER :: M51N1RDye = 14707 - INTEGER(IntKi), PARAMETER :: M51N2RDye = 14708 - INTEGER(IntKi), PARAMETER :: M51N3RDye = 14709 - INTEGER(IntKi), PARAMETER :: M51N4RDye = 14710 - INTEGER(IntKi), PARAMETER :: M51N5RDye = 14711 - INTEGER(IntKi), PARAMETER :: M51N6RDye = 14712 - INTEGER(IntKi), PARAMETER :: M51N7RDye = 14713 - INTEGER(IntKi), PARAMETER :: M51N8RDye = 14714 - INTEGER(IntKi), PARAMETER :: M51N9RDye = 14715 - INTEGER(IntKi), PARAMETER :: M52N1RDye = 14716 - INTEGER(IntKi), PARAMETER :: M52N2RDye = 14717 - INTEGER(IntKi), PARAMETER :: M52N3RDye = 14718 - INTEGER(IntKi), PARAMETER :: M52N4RDye = 14719 - INTEGER(IntKi), PARAMETER :: M52N5RDye = 14720 - INTEGER(IntKi), PARAMETER :: M52N6RDye = 14721 - INTEGER(IntKi), PARAMETER :: M52N7RDye = 14722 - INTEGER(IntKi), PARAMETER :: M52N8RDye = 14723 - INTEGER(IntKi), PARAMETER :: M52N9RDye = 14724 - INTEGER(IntKi), PARAMETER :: M53N1RDye = 14725 - INTEGER(IntKi), PARAMETER :: M53N2RDye = 14726 - INTEGER(IntKi), PARAMETER :: M53N3RDye = 14727 - INTEGER(IntKi), PARAMETER :: M53N4RDye = 14728 - INTEGER(IntKi), PARAMETER :: M53N5RDye = 14729 - INTEGER(IntKi), PARAMETER :: M53N6RDye = 14730 - INTEGER(IntKi), PARAMETER :: M53N7RDye = 14731 - INTEGER(IntKi), PARAMETER :: M53N8RDye = 14732 - INTEGER(IntKi), PARAMETER :: M53N9RDye = 14733 - INTEGER(IntKi), PARAMETER :: M54N1RDye = 14734 - INTEGER(IntKi), PARAMETER :: M54N2RDye = 14735 - INTEGER(IntKi), PARAMETER :: M54N3RDye = 14736 - INTEGER(IntKi), PARAMETER :: M54N4RDye = 14737 - INTEGER(IntKi), PARAMETER :: M54N5RDye = 14738 - INTEGER(IntKi), PARAMETER :: M54N6RDye = 14739 - INTEGER(IntKi), PARAMETER :: M54N7RDye = 14740 - INTEGER(IntKi), PARAMETER :: M54N8RDye = 14741 - INTEGER(IntKi), PARAMETER :: M54N9RDye = 14742 - INTEGER(IntKi), PARAMETER :: M55N1RDye = 14743 - INTEGER(IntKi), PARAMETER :: M55N2RDye = 14744 - INTEGER(IntKi), PARAMETER :: M55N3RDye = 14745 - INTEGER(IntKi), PARAMETER :: M55N4RDye = 14746 - INTEGER(IntKi), PARAMETER :: M55N5RDye = 14747 - INTEGER(IntKi), PARAMETER :: M55N6RDye = 14748 - INTEGER(IntKi), PARAMETER :: M55N7RDye = 14749 - INTEGER(IntKi), PARAMETER :: M55N8RDye = 14750 - INTEGER(IntKi), PARAMETER :: M55N9RDye = 14751 - INTEGER(IntKi), PARAMETER :: M56N1RDye = 14752 - INTEGER(IntKi), PARAMETER :: M56N2RDye = 14753 - INTEGER(IntKi), PARAMETER :: M56N3RDye = 14754 - INTEGER(IntKi), PARAMETER :: M56N4RDye = 14755 - INTEGER(IntKi), PARAMETER :: M56N5RDye = 14756 - INTEGER(IntKi), PARAMETER :: M56N6RDye = 14757 - INTEGER(IntKi), PARAMETER :: M56N7RDye = 14758 - INTEGER(IntKi), PARAMETER :: M56N8RDye = 14759 - INTEGER(IntKi), PARAMETER :: M56N9RDye = 14760 - INTEGER(IntKi), PARAMETER :: M57N1RDye = 14761 - INTEGER(IntKi), PARAMETER :: M57N2RDye = 14762 - INTEGER(IntKi), PARAMETER :: M57N3RDye = 14763 - INTEGER(IntKi), PARAMETER :: M57N4RDye = 14764 - INTEGER(IntKi), PARAMETER :: M57N5RDye = 14765 - INTEGER(IntKi), PARAMETER :: M57N6RDye = 14766 - INTEGER(IntKi), PARAMETER :: M57N7RDye = 14767 - INTEGER(IntKi), PARAMETER :: M57N8RDye = 14768 - INTEGER(IntKi), PARAMETER :: M57N9RDye = 14769 - INTEGER(IntKi), PARAMETER :: M58N1RDye = 14770 - INTEGER(IntKi), PARAMETER :: M58N2RDye = 14771 - INTEGER(IntKi), PARAMETER :: M58N3RDye = 14772 - INTEGER(IntKi), PARAMETER :: M58N4RDye = 14773 - INTEGER(IntKi), PARAMETER :: M58N5RDye = 14774 - INTEGER(IntKi), PARAMETER :: M58N6RDye = 14775 - INTEGER(IntKi), PARAMETER :: M58N7RDye = 14776 - INTEGER(IntKi), PARAMETER :: M58N8RDye = 14777 - INTEGER(IntKi), PARAMETER :: M58N9RDye = 14778 - INTEGER(IntKi), PARAMETER :: M59N1RDye = 14779 - INTEGER(IntKi), PARAMETER :: M59N2RDye = 14780 - INTEGER(IntKi), PARAMETER :: M59N3RDye = 14781 - INTEGER(IntKi), PARAMETER :: M59N4RDye = 14782 - INTEGER(IntKi), PARAMETER :: M59N5RDye = 14783 - INTEGER(IntKi), PARAMETER :: M59N6RDye = 14784 - INTEGER(IntKi), PARAMETER :: M59N7RDye = 14785 - INTEGER(IntKi), PARAMETER :: M59N8RDye = 14786 - INTEGER(IntKi), PARAMETER :: M59N9RDye = 14787 - INTEGER(IntKi), PARAMETER :: M60N1RDye = 14788 - INTEGER(IntKi), PARAMETER :: M60N2RDye = 14789 - INTEGER(IntKi), PARAMETER :: M60N3RDye = 14790 - INTEGER(IntKi), PARAMETER :: M60N4RDye = 14791 - INTEGER(IntKi), PARAMETER :: M60N5RDye = 14792 - INTEGER(IntKi), PARAMETER :: M60N6RDye = 14793 - INTEGER(IntKi), PARAMETER :: M60N7RDye = 14794 - INTEGER(IntKi), PARAMETER :: M60N8RDye = 14795 - INTEGER(IntKi), PARAMETER :: M60N9RDye = 14796 - INTEGER(IntKi), PARAMETER :: M61N1RDye = 14797 - INTEGER(IntKi), PARAMETER :: M61N2RDye = 14798 - INTEGER(IntKi), PARAMETER :: M61N3RDye = 14799 - INTEGER(IntKi), PARAMETER :: M61N4RDye = 14800 - INTEGER(IntKi), PARAMETER :: M61N5RDye = 14801 - INTEGER(IntKi), PARAMETER :: M61N6RDye = 14802 - INTEGER(IntKi), PARAMETER :: M61N7RDye = 14803 - INTEGER(IntKi), PARAMETER :: M61N8RDye = 14804 - INTEGER(IntKi), PARAMETER :: M61N9RDye = 14805 - INTEGER(IntKi), PARAMETER :: M62N1RDye = 14806 - INTEGER(IntKi), PARAMETER :: M62N2RDye = 14807 - INTEGER(IntKi), PARAMETER :: M62N3RDye = 14808 - INTEGER(IntKi), PARAMETER :: M62N4RDye = 14809 - INTEGER(IntKi), PARAMETER :: M62N5RDye = 14810 - INTEGER(IntKi), PARAMETER :: M62N6RDye = 14811 - INTEGER(IntKi), PARAMETER :: M62N7RDye = 14812 - INTEGER(IntKi), PARAMETER :: M62N8RDye = 14813 - INTEGER(IntKi), PARAMETER :: M62N9RDye = 14814 - INTEGER(IntKi), PARAMETER :: M63N1RDye = 14815 - INTEGER(IntKi), PARAMETER :: M63N2RDye = 14816 - INTEGER(IntKi), PARAMETER :: M63N3RDye = 14817 - INTEGER(IntKi), PARAMETER :: M63N4RDye = 14818 - INTEGER(IntKi), PARAMETER :: M63N5RDye = 14819 - INTEGER(IntKi), PARAMETER :: M63N6RDye = 14820 - INTEGER(IntKi), PARAMETER :: M63N7RDye = 14821 - INTEGER(IntKi), PARAMETER :: M63N8RDye = 14822 - INTEGER(IntKi), PARAMETER :: M63N9RDye = 14823 - INTEGER(IntKi), PARAMETER :: M64N1RDye = 14824 - INTEGER(IntKi), PARAMETER :: M64N2RDye = 14825 - INTEGER(IntKi), PARAMETER :: M64N3RDye = 14826 - INTEGER(IntKi), PARAMETER :: M64N4RDye = 14827 - INTEGER(IntKi), PARAMETER :: M64N5RDye = 14828 - INTEGER(IntKi), PARAMETER :: M64N6RDye = 14829 - INTEGER(IntKi), PARAMETER :: M64N7RDye = 14830 - INTEGER(IntKi), PARAMETER :: M64N8RDye = 14831 - INTEGER(IntKi), PARAMETER :: M64N9RDye = 14832 - INTEGER(IntKi), PARAMETER :: M65N1RDye = 14833 - INTEGER(IntKi), PARAMETER :: M65N2RDye = 14834 - INTEGER(IntKi), PARAMETER :: M65N3RDye = 14835 - INTEGER(IntKi), PARAMETER :: M65N4RDye = 14836 - INTEGER(IntKi), PARAMETER :: M65N5RDye = 14837 - INTEGER(IntKi), PARAMETER :: M65N6RDye = 14838 - INTEGER(IntKi), PARAMETER :: M65N7RDye = 14839 - INTEGER(IntKi), PARAMETER :: M65N8RDye = 14840 - INTEGER(IntKi), PARAMETER :: M65N9RDye = 14841 - INTEGER(IntKi), PARAMETER :: M66N1RDye = 14842 - INTEGER(IntKi), PARAMETER :: M66N2RDye = 14843 - INTEGER(IntKi), PARAMETER :: M66N3RDye = 14844 - INTEGER(IntKi), PARAMETER :: M66N4RDye = 14845 - INTEGER(IntKi), PARAMETER :: M66N5RDye = 14846 - INTEGER(IntKi), PARAMETER :: M66N6RDye = 14847 - INTEGER(IntKi), PARAMETER :: M66N7RDye = 14848 - INTEGER(IntKi), PARAMETER :: M66N8RDye = 14849 - INTEGER(IntKi), PARAMETER :: M66N9RDye = 14850 - INTEGER(IntKi), PARAMETER :: M67N1RDye = 14851 - INTEGER(IntKi), PARAMETER :: M67N2RDye = 14852 - INTEGER(IntKi), PARAMETER :: M67N3RDye = 14853 - INTEGER(IntKi), PARAMETER :: M67N4RDye = 14854 - INTEGER(IntKi), PARAMETER :: M67N5RDye = 14855 - INTEGER(IntKi), PARAMETER :: M67N6RDye = 14856 - INTEGER(IntKi), PARAMETER :: M67N7RDye = 14857 - INTEGER(IntKi), PARAMETER :: M67N8RDye = 14858 - INTEGER(IntKi), PARAMETER :: M67N9RDye = 14859 - INTEGER(IntKi), PARAMETER :: M68N1RDye = 14860 - INTEGER(IntKi), PARAMETER :: M68N2RDye = 14861 - INTEGER(IntKi), PARAMETER :: M68N3RDye = 14862 - INTEGER(IntKi), PARAMETER :: M68N4RDye = 14863 - INTEGER(IntKi), PARAMETER :: M68N5RDye = 14864 - INTEGER(IntKi), PARAMETER :: M68N6RDye = 14865 - INTEGER(IntKi), PARAMETER :: M68N7RDye = 14866 - INTEGER(IntKi), PARAMETER :: M68N8RDye = 14867 - INTEGER(IntKi), PARAMETER :: M68N9RDye = 14868 - INTEGER(IntKi), PARAMETER :: M69N1RDye = 14869 - INTEGER(IntKi), PARAMETER :: M69N2RDye = 14870 - INTEGER(IntKi), PARAMETER :: M69N3RDye = 14871 - INTEGER(IntKi), PARAMETER :: M69N4RDye = 14872 - INTEGER(IntKi), PARAMETER :: M69N5RDye = 14873 - INTEGER(IntKi), PARAMETER :: M69N6RDye = 14874 - INTEGER(IntKi), PARAMETER :: M69N7RDye = 14875 - INTEGER(IntKi), PARAMETER :: M69N8RDye = 14876 - INTEGER(IntKi), PARAMETER :: M69N9RDye = 14877 - INTEGER(IntKi), PARAMETER :: M70N1RDye = 14878 - INTEGER(IntKi), PARAMETER :: M70N2RDye = 14879 - INTEGER(IntKi), PARAMETER :: M70N3RDye = 14880 - INTEGER(IntKi), PARAMETER :: M70N4RDye = 14881 - INTEGER(IntKi), PARAMETER :: M70N5RDye = 14882 - INTEGER(IntKi), PARAMETER :: M70N6RDye = 14883 - INTEGER(IntKi), PARAMETER :: M70N7RDye = 14884 - INTEGER(IntKi), PARAMETER :: M70N8RDye = 14885 - INTEGER(IntKi), PARAMETER :: M70N9RDye = 14886 - INTEGER(IntKi), PARAMETER :: M71N1RDye = 14887 - INTEGER(IntKi), PARAMETER :: M71N2RDye = 14888 - INTEGER(IntKi), PARAMETER :: M71N3RDye = 14889 - INTEGER(IntKi), PARAMETER :: M71N4RDye = 14890 - INTEGER(IntKi), PARAMETER :: M71N5RDye = 14891 - INTEGER(IntKi), PARAMETER :: M71N6RDye = 14892 - INTEGER(IntKi), PARAMETER :: M71N7RDye = 14893 - INTEGER(IntKi), PARAMETER :: M71N8RDye = 14894 - INTEGER(IntKi), PARAMETER :: M71N9RDye = 14895 - INTEGER(IntKi), PARAMETER :: M72N1RDye = 14896 - INTEGER(IntKi), PARAMETER :: M72N2RDye = 14897 - INTEGER(IntKi), PARAMETER :: M72N3RDye = 14898 - INTEGER(IntKi), PARAMETER :: M72N4RDye = 14899 - INTEGER(IntKi), PARAMETER :: M72N5RDye = 14900 - INTEGER(IntKi), PARAMETER :: M72N6RDye = 14901 - INTEGER(IntKi), PARAMETER :: M72N7RDye = 14902 - INTEGER(IntKi), PARAMETER :: M72N8RDye = 14903 - INTEGER(IntKi), PARAMETER :: M72N9RDye = 14904 - INTEGER(IntKi), PARAMETER :: M73N1RDye = 14905 - INTEGER(IntKi), PARAMETER :: M73N2RDye = 14906 - INTEGER(IntKi), PARAMETER :: M73N3RDye = 14907 - INTEGER(IntKi), PARAMETER :: M73N4RDye = 14908 - INTEGER(IntKi), PARAMETER :: M73N5RDye = 14909 - INTEGER(IntKi), PARAMETER :: M73N6RDye = 14910 - INTEGER(IntKi), PARAMETER :: M73N7RDye = 14911 - INTEGER(IntKi), PARAMETER :: M73N8RDye = 14912 - INTEGER(IntKi), PARAMETER :: M73N9RDye = 14913 - INTEGER(IntKi), PARAMETER :: M74N1RDye = 14914 - INTEGER(IntKi), PARAMETER :: M74N2RDye = 14915 - INTEGER(IntKi), PARAMETER :: M74N3RDye = 14916 - INTEGER(IntKi), PARAMETER :: M74N4RDye = 14917 - INTEGER(IntKi), PARAMETER :: M74N5RDye = 14918 - INTEGER(IntKi), PARAMETER :: M74N6RDye = 14919 - INTEGER(IntKi), PARAMETER :: M74N7RDye = 14920 - INTEGER(IntKi), PARAMETER :: M74N8RDye = 14921 - INTEGER(IntKi), PARAMETER :: M74N9RDye = 14922 - INTEGER(IntKi), PARAMETER :: M75N1RDye = 14923 - INTEGER(IntKi), PARAMETER :: M75N2RDye = 14924 - INTEGER(IntKi), PARAMETER :: M75N3RDye = 14925 - INTEGER(IntKi), PARAMETER :: M75N4RDye = 14926 - INTEGER(IntKi), PARAMETER :: M75N5RDye = 14927 - INTEGER(IntKi), PARAMETER :: M75N6RDye = 14928 - INTEGER(IntKi), PARAMETER :: M75N7RDye = 14929 - INTEGER(IntKi), PARAMETER :: M75N8RDye = 14930 - INTEGER(IntKi), PARAMETER :: M75N9RDye = 14931 - INTEGER(IntKi), PARAMETER :: M76N1RDye = 14932 - INTEGER(IntKi), PARAMETER :: M76N2RDye = 14933 - INTEGER(IntKi), PARAMETER :: M76N3RDye = 14934 - INTEGER(IntKi), PARAMETER :: M76N4RDye = 14935 - INTEGER(IntKi), PARAMETER :: M76N5RDye = 14936 - INTEGER(IntKi), PARAMETER :: M76N6RDye = 14937 - INTEGER(IntKi), PARAMETER :: M76N7RDye = 14938 - INTEGER(IntKi), PARAMETER :: M76N8RDye = 14939 - INTEGER(IntKi), PARAMETER :: M76N9RDye = 14940 - INTEGER(IntKi), PARAMETER :: M77N1RDye = 14941 - INTEGER(IntKi), PARAMETER :: M77N2RDye = 14942 - INTEGER(IntKi), PARAMETER :: M77N3RDye = 14943 - INTEGER(IntKi), PARAMETER :: M77N4RDye = 14944 - INTEGER(IntKi), PARAMETER :: M77N5RDye = 14945 - INTEGER(IntKi), PARAMETER :: M77N6RDye = 14946 - INTEGER(IntKi), PARAMETER :: M77N7RDye = 14947 - INTEGER(IntKi), PARAMETER :: M77N8RDye = 14948 - INTEGER(IntKi), PARAMETER :: M77N9RDye = 14949 - INTEGER(IntKi), PARAMETER :: M78N1RDye = 14950 - INTEGER(IntKi), PARAMETER :: M78N2RDye = 14951 - INTEGER(IntKi), PARAMETER :: M78N3RDye = 14952 - INTEGER(IntKi), PARAMETER :: M78N4RDye = 14953 - INTEGER(IntKi), PARAMETER :: M78N5RDye = 14954 - INTEGER(IntKi), PARAMETER :: M78N6RDye = 14955 - INTEGER(IntKi), PARAMETER :: M78N7RDye = 14956 - INTEGER(IntKi), PARAMETER :: M78N8RDye = 14957 - INTEGER(IntKi), PARAMETER :: M78N9RDye = 14958 - INTEGER(IntKi), PARAMETER :: M79N1RDye = 14959 - INTEGER(IntKi), PARAMETER :: M79N2RDye = 14960 - INTEGER(IntKi), PARAMETER :: M79N3RDye = 14961 - INTEGER(IntKi), PARAMETER :: M79N4RDye = 14962 - INTEGER(IntKi), PARAMETER :: M79N5RDye = 14963 - INTEGER(IntKi), PARAMETER :: M79N6RDye = 14964 - INTEGER(IntKi), PARAMETER :: M79N7RDye = 14965 - INTEGER(IntKi), PARAMETER :: M79N8RDye = 14966 - INTEGER(IntKi), PARAMETER :: M79N9RDye = 14967 - INTEGER(IntKi), PARAMETER :: M80N1RDye = 14968 - INTEGER(IntKi), PARAMETER :: M80N2RDye = 14969 - INTEGER(IntKi), PARAMETER :: M80N3RDye = 14970 - INTEGER(IntKi), PARAMETER :: M80N4RDye = 14971 - INTEGER(IntKi), PARAMETER :: M80N5RDye = 14972 - INTEGER(IntKi), PARAMETER :: M80N6RDye = 14973 - INTEGER(IntKi), PARAMETER :: M80N7RDye = 14974 - INTEGER(IntKi), PARAMETER :: M80N8RDye = 14975 - INTEGER(IntKi), PARAMETER :: M80N9RDye = 14976 - INTEGER(IntKi), PARAMETER :: M81N1RDye = 14977 - INTEGER(IntKi), PARAMETER :: M81N2RDye = 14978 - INTEGER(IntKi), PARAMETER :: M81N3RDye = 14979 - INTEGER(IntKi), PARAMETER :: M81N4RDye = 14980 - INTEGER(IntKi), PARAMETER :: M81N5RDye = 14981 - INTEGER(IntKi), PARAMETER :: M81N6RDye = 14982 - INTEGER(IntKi), PARAMETER :: M81N7RDye = 14983 - INTEGER(IntKi), PARAMETER :: M81N8RDye = 14984 - INTEGER(IntKi), PARAMETER :: M81N9RDye = 14985 - INTEGER(IntKi), PARAMETER :: M82N1RDye = 14986 - INTEGER(IntKi), PARAMETER :: M82N2RDye = 14987 - INTEGER(IntKi), PARAMETER :: M82N3RDye = 14988 - INTEGER(IntKi), PARAMETER :: M82N4RDye = 14989 - INTEGER(IntKi), PARAMETER :: M82N5RDye = 14990 - INTEGER(IntKi), PARAMETER :: M82N6RDye = 14991 - INTEGER(IntKi), PARAMETER :: M82N7RDye = 14992 - INTEGER(IntKi), PARAMETER :: M82N8RDye = 14993 - INTEGER(IntKi), PARAMETER :: M82N9RDye = 14994 - INTEGER(IntKi), PARAMETER :: M83N1RDye = 14995 - INTEGER(IntKi), PARAMETER :: M83N2RDye = 14996 - INTEGER(IntKi), PARAMETER :: M83N3RDye = 14997 - INTEGER(IntKi), PARAMETER :: M83N4RDye = 14998 - INTEGER(IntKi), PARAMETER :: M83N5RDye = 14999 - INTEGER(IntKi), PARAMETER :: M83N6RDye = 15000 - INTEGER(IntKi), PARAMETER :: M83N7RDye = 15001 - INTEGER(IntKi), PARAMETER :: M83N8RDye = 15002 - INTEGER(IntKi), PARAMETER :: M83N9RDye = 15003 - INTEGER(IntKi), PARAMETER :: M84N1RDye = 15004 - INTEGER(IntKi), PARAMETER :: M84N2RDye = 15005 - INTEGER(IntKi), PARAMETER :: M84N3RDye = 15006 - INTEGER(IntKi), PARAMETER :: M84N4RDye = 15007 - INTEGER(IntKi), PARAMETER :: M84N5RDye = 15008 - INTEGER(IntKi), PARAMETER :: M84N6RDye = 15009 - INTEGER(IntKi), PARAMETER :: M84N7RDye = 15010 - INTEGER(IntKi), PARAMETER :: M84N8RDye = 15011 - INTEGER(IntKi), PARAMETER :: M84N9RDye = 15012 - INTEGER(IntKi), PARAMETER :: M85N1RDye = 15013 - INTEGER(IntKi), PARAMETER :: M85N2RDye = 15014 - INTEGER(IntKi), PARAMETER :: M85N3RDye = 15015 - INTEGER(IntKi), PARAMETER :: M85N4RDye = 15016 - INTEGER(IntKi), PARAMETER :: M85N5RDye = 15017 - INTEGER(IntKi), PARAMETER :: M85N6RDye = 15018 - INTEGER(IntKi), PARAMETER :: M85N7RDye = 15019 - INTEGER(IntKi), PARAMETER :: M85N8RDye = 15020 - INTEGER(IntKi), PARAMETER :: M85N9RDye = 15021 - INTEGER(IntKi), PARAMETER :: M86N1RDye = 15022 - INTEGER(IntKi), PARAMETER :: M86N2RDye = 15023 - INTEGER(IntKi), PARAMETER :: M86N3RDye = 15024 - INTEGER(IntKi), PARAMETER :: M86N4RDye = 15025 - INTEGER(IntKi), PARAMETER :: M86N5RDye = 15026 - INTEGER(IntKi), PARAMETER :: M86N6RDye = 15027 - INTEGER(IntKi), PARAMETER :: M86N7RDye = 15028 - INTEGER(IntKi), PARAMETER :: M86N8RDye = 15029 - INTEGER(IntKi), PARAMETER :: M86N9RDye = 15030 - INTEGER(IntKi), PARAMETER :: M87N1RDye = 15031 - INTEGER(IntKi), PARAMETER :: M87N2RDye = 15032 - INTEGER(IntKi), PARAMETER :: M87N3RDye = 15033 - INTEGER(IntKi), PARAMETER :: M87N4RDye = 15034 - INTEGER(IntKi), PARAMETER :: M87N5RDye = 15035 - INTEGER(IntKi), PARAMETER :: M87N6RDye = 15036 - INTEGER(IntKi), PARAMETER :: M87N7RDye = 15037 - INTEGER(IntKi), PARAMETER :: M87N8RDye = 15038 - INTEGER(IntKi), PARAMETER :: M87N9RDye = 15039 - INTEGER(IntKi), PARAMETER :: M88N1RDye = 15040 - INTEGER(IntKi), PARAMETER :: M88N2RDye = 15041 - INTEGER(IntKi), PARAMETER :: M88N3RDye = 15042 - INTEGER(IntKi), PARAMETER :: M88N4RDye = 15043 - INTEGER(IntKi), PARAMETER :: M88N5RDye = 15044 - INTEGER(IntKi), PARAMETER :: M88N6RDye = 15045 - INTEGER(IntKi), PARAMETER :: M88N7RDye = 15046 - INTEGER(IntKi), PARAMETER :: M88N8RDye = 15047 - INTEGER(IntKi), PARAMETER :: M88N9RDye = 15048 - INTEGER(IntKi), PARAMETER :: M89N1RDye = 15049 - INTEGER(IntKi), PARAMETER :: M89N2RDye = 15050 - INTEGER(IntKi), PARAMETER :: M89N3RDye = 15051 - INTEGER(IntKi), PARAMETER :: M89N4RDye = 15052 - INTEGER(IntKi), PARAMETER :: M89N5RDye = 15053 - INTEGER(IntKi), PARAMETER :: M89N6RDye = 15054 - INTEGER(IntKi), PARAMETER :: M89N7RDye = 15055 - INTEGER(IntKi), PARAMETER :: M89N8RDye = 15056 - INTEGER(IntKi), PARAMETER :: M89N9RDye = 15057 - INTEGER(IntKi), PARAMETER :: M90N1RDye = 15058 - INTEGER(IntKi), PARAMETER :: M90N2RDye = 15059 - INTEGER(IntKi), PARAMETER :: M90N3RDye = 15060 - INTEGER(IntKi), PARAMETER :: M90N4RDye = 15061 - INTEGER(IntKi), PARAMETER :: M90N5RDye = 15062 - INTEGER(IntKi), PARAMETER :: M90N6RDye = 15063 - INTEGER(IntKi), PARAMETER :: M90N7RDye = 15064 - INTEGER(IntKi), PARAMETER :: M90N8RDye = 15065 - INTEGER(IntKi), PARAMETER :: M90N9RDye = 15066 - INTEGER(IntKi), PARAMETER :: M91N1RDye = 15067 - INTEGER(IntKi), PARAMETER :: M91N2RDye = 15068 - INTEGER(IntKi), PARAMETER :: M91N3RDye = 15069 - INTEGER(IntKi), PARAMETER :: M91N4RDye = 15070 - INTEGER(IntKi), PARAMETER :: M91N5RDye = 15071 - INTEGER(IntKi), PARAMETER :: M91N6RDye = 15072 - INTEGER(IntKi), PARAMETER :: M91N7RDye = 15073 - INTEGER(IntKi), PARAMETER :: M91N8RDye = 15074 - INTEGER(IntKi), PARAMETER :: M91N9RDye = 15075 - INTEGER(IntKi), PARAMETER :: M92N1RDye = 15076 - INTEGER(IntKi), PARAMETER :: M92N2RDye = 15077 - INTEGER(IntKi), PARAMETER :: M92N3RDye = 15078 - INTEGER(IntKi), PARAMETER :: M92N4RDye = 15079 - INTEGER(IntKi), PARAMETER :: M92N5RDye = 15080 - INTEGER(IntKi), PARAMETER :: M92N6RDye = 15081 - INTEGER(IntKi), PARAMETER :: M92N7RDye = 15082 - INTEGER(IntKi), PARAMETER :: M92N8RDye = 15083 - INTEGER(IntKi), PARAMETER :: M92N9RDye = 15084 - INTEGER(IntKi), PARAMETER :: M93N1RDye = 15085 - INTEGER(IntKi), PARAMETER :: M93N2RDye = 15086 - INTEGER(IntKi), PARAMETER :: M93N3RDye = 15087 - INTEGER(IntKi), PARAMETER :: M93N4RDye = 15088 - INTEGER(IntKi), PARAMETER :: M93N5RDye = 15089 - INTEGER(IntKi), PARAMETER :: M93N6RDye = 15090 - INTEGER(IntKi), PARAMETER :: M93N7RDye = 15091 - INTEGER(IntKi), PARAMETER :: M93N8RDye = 15092 - INTEGER(IntKi), PARAMETER :: M93N9RDye = 15093 - INTEGER(IntKi), PARAMETER :: M94N1RDye = 15094 - INTEGER(IntKi), PARAMETER :: M94N2RDye = 15095 - INTEGER(IntKi), PARAMETER :: M94N3RDye = 15096 - INTEGER(IntKi), PARAMETER :: M94N4RDye = 15097 - INTEGER(IntKi), PARAMETER :: M94N5RDye = 15098 - INTEGER(IntKi), PARAMETER :: M94N6RDye = 15099 - INTEGER(IntKi), PARAMETER :: M94N7RDye = 15100 - INTEGER(IntKi), PARAMETER :: M94N8RDye = 15101 - INTEGER(IntKi), PARAMETER :: M94N9RDye = 15102 - INTEGER(IntKi), PARAMETER :: M95N1RDye = 15103 - INTEGER(IntKi), PARAMETER :: M95N2RDye = 15104 - INTEGER(IntKi), PARAMETER :: M95N3RDye = 15105 - INTEGER(IntKi), PARAMETER :: M95N4RDye = 15106 - INTEGER(IntKi), PARAMETER :: M95N5RDye = 15107 - INTEGER(IntKi), PARAMETER :: M95N6RDye = 15108 - INTEGER(IntKi), PARAMETER :: M95N7RDye = 15109 - INTEGER(IntKi), PARAMETER :: M95N8RDye = 15110 - INTEGER(IntKi), PARAMETER :: M95N9RDye = 15111 - INTEGER(IntKi), PARAMETER :: M96N1RDye = 15112 - INTEGER(IntKi), PARAMETER :: M96N2RDye = 15113 - INTEGER(IntKi), PARAMETER :: M96N3RDye = 15114 - INTEGER(IntKi), PARAMETER :: M96N4RDye = 15115 - INTEGER(IntKi), PARAMETER :: M96N5RDye = 15116 - INTEGER(IntKi), PARAMETER :: M96N6RDye = 15117 - INTEGER(IntKi), PARAMETER :: M96N7RDye = 15118 - INTEGER(IntKi), PARAMETER :: M96N8RDye = 15119 - INTEGER(IntKi), PARAMETER :: M96N9RDye = 15120 - INTEGER(IntKi), PARAMETER :: M97N1RDye = 15121 - INTEGER(IntKi), PARAMETER :: M97N2RDye = 15122 - INTEGER(IntKi), PARAMETER :: M97N3RDye = 15123 - INTEGER(IntKi), PARAMETER :: M97N4RDye = 15124 - INTEGER(IntKi), PARAMETER :: M97N5RDye = 15125 - INTEGER(IntKi), PARAMETER :: M97N6RDye = 15126 - INTEGER(IntKi), PARAMETER :: M97N7RDye = 15127 - INTEGER(IntKi), PARAMETER :: M97N8RDye = 15128 - INTEGER(IntKi), PARAMETER :: M97N9RDye = 15129 - INTEGER(IntKi), PARAMETER :: M98N1RDye = 15130 - INTEGER(IntKi), PARAMETER :: M98N2RDye = 15131 - INTEGER(IntKi), PARAMETER :: M98N3RDye = 15132 - INTEGER(IntKi), PARAMETER :: M98N4RDye = 15133 - INTEGER(IntKi), PARAMETER :: M98N5RDye = 15134 - INTEGER(IntKi), PARAMETER :: M98N6RDye = 15135 - INTEGER(IntKi), PARAMETER :: M98N7RDye = 15136 - INTEGER(IntKi), PARAMETER :: M98N8RDye = 15137 - INTEGER(IntKi), PARAMETER :: M98N9RDye = 15138 - INTEGER(IntKi), PARAMETER :: M99N1RDye = 15139 - INTEGER(IntKi), PARAMETER :: M99N2RDye = 15140 - INTEGER(IntKi), PARAMETER :: M99N3RDye = 15141 - INTEGER(IntKi), PARAMETER :: M99N4RDye = 15142 - INTEGER(IntKi), PARAMETER :: M99N5RDye = 15143 - INTEGER(IntKi), PARAMETER :: M99N6RDye = 15144 - INTEGER(IntKi), PARAMETER :: M99N7RDye = 15145 - INTEGER(IntKi), PARAMETER :: M99N8RDye = 15146 - INTEGER(IntKi), PARAMETER :: M99N9RDye = 15147 - INTEGER(IntKi), PARAMETER :: M01N1RDze = 15148 - INTEGER(IntKi), PARAMETER :: M01N2RDze = 15149 - INTEGER(IntKi), PARAMETER :: M01N3RDze = 15150 - INTEGER(IntKi), PARAMETER :: M01N4RDze = 15151 - INTEGER(IntKi), PARAMETER :: M01N5RDze = 15152 - INTEGER(IntKi), PARAMETER :: M01N6RDze = 15153 - INTEGER(IntKi), PARAMETER :: M01N7RDze = 15154 - INTEGER(IntKi), PARAMETER :: M01N8RDze = 15155 - INTEGER(IntKi), PARAMETER :: M01N9RDze = 15156 - INTEGER(IntKi), PARAMETER :: M02N1RDze = 15157 - INTEGER(IntKi), PARAMETER :: M02N2RDze = 15158 - INTEGER(IntKi), PARAMETER :: M02N3RDze = 15159 - INTEGER(IntKi), PARAMETER :: M02N4RDze = 15160 - INTEGER(IntKi), PARAMETER :: M02N5RDze = 15161 - INTEGER(IntKi), PARAMETER :: M02N6RDze = 15162 - INTEGER(IntKi), PARAMETER :: M02N7RDze = 15163 - INTEGER(IntKi), PARAMETER :: M02N8RDze = 15164 - INTEGER(IntKi), PARAMETER :: M02N9RDze = 15165 - INTEGER(IntKi), PARAMETER :: M03N1RDze = 15166 - INTEGER(IntKi), PARAMETER :: M03N2RDze = 15167 - INTEGER(IntKi), PARAMETER :: M03N3RDze = 15168 - INTEGER(IntKi), PARAMETER :: M03N4RDze = 15169 - INTEGER(IntKi), PARAMETER :: M03N5RDze = 15170 - INTEGER(IntKi), PARAMETER :: M03N6RDze = 15171 - INTEGER(IntKi), PARAMETER :: M03N7RDze = 15172 - INTEGER(IntKi), PARAMETER :: M03N8RDze = 15173 - INTEGER(IntKi), PARAMETER :: M03N9RDze = 15174 - INTEGER(IntKi), PARAMETER :: M04N1RDze = 15175 - INTEGER(IntKi), PARAMETER :: M04N2RDze = 15176 - INTEGER(IntKi), PARAMETER :: M04N3RDze = 15177 - INTEGER(IntKi), PARAMETER :: M04N4RDze = 15178 - INTEGER(IntKi), PARAMETER :: M04N5RDze = 15179 - INTEGER(IntKi), PARAMETER :: M04N6RDze = 15180 - INTEGER(IntKi), PARAMETER :: M04N7RDze = 15181 - INTEGER(IntKi), PARAMETER :: M04N8RDze = 15182 - INTEGER(IntKi), PARAMETER :: M04N9RDze = 15183 - INTEGER(IntKi), PARAMETER :: M05N1RDze = 15184 - INTEGER(IntKi), PARAMETER :: M05N2RDze = 15185 - INTEGER(IntKi), PARAMETER :: M05N3RDze = 15186 - INTEGER(IntKi), PARAMETER :: M05N4RDze = 15187 - INTEGER(IntKi), PARAMETER :: M05N5RDze = 15188 - INTEGER(IntKi), PARAMETER :: M05N6RDze = 15189 - INTEGER(IntKi), PARAMETER :: M05N7RDze = 15190 - INTEGER(IntKi), PARAMETER :: M05N8RDze = 15191 - INTEGER(IntKi), PARAMETER :: M05N9RDze = 15192 - INTEGER(IntKi), PARAMETER :: M06N1RDze = 15193 - INTEGER(IntKi), PARAMETER :: M06N2RDze = 15194 - INTEGER(IntKi), PARAMETER :: M06N3RDze = 15195 - INTEGER(IntKi), PARAMETER :: M06N4RDze = 15196 - INTEGER(IntKi), PARAMETER :: M06N5RDze = 15197 - INTEGER(IntKi), PARAMETER :: M06N6RDze = 15198 - INTEGER(IntKi), PARAMETER :: M06N7RDze = 15199 - INTEGER(IntKi), PARAMETER :: M06N8RDze = 15200 - INTEGER(IntKi), PARAMETER :: M06N9RDze = 15201 - INTEGER(IntKi), PARAMETER :: M07N1RDze = 15202 - INTEGER(IntKi), PARAMETER :: M07N2RDze = 15203 - INTEGER(IntKi), PARAMETER :: M07N3RDze = 15204 - INTEGER(IntKi), PARAMETER :: M07N4RDze = 15205 - INTEGER(IntKi), PARAMETER :: M07N5RDze = 15206 - INTEGER(IntKi), PARAMETER :: M07N6RDze = 15207 - INTEGER(IntKi), PARAMETER :: M07N7RDze = 15208 - INTEGER(IntKi), PARAMETER :: M07N8RDze = 15209 - INTEGER(IntKi), PARAMETER :: M07N9RDze = 15210 - INTEGER(IntKi), PARAMETER :: M08N1RDze = 15211 - INTEGER(IntKi), PARAMETER :: M08N2RDze = 15212 - INTEGER(IntKi), PARAMETER :: M08N3RDze = 15213 - INTEGER(IntKi), PARAMETER :: M08N4RDze = 15214 - INTEGER(IntKi), PARAMETER :: M08N5RDze = 15215 - INTEGER(IntKi), PARAMETER :: M08N6RDze = 15216 - INTEGER(IntKi), PARAMETER :: M08N7RDze = 15217 - INTEGER(IntKi), PARAMETER :: M08N8RDze = 15218 - INTEGER(IntKi), PARAMETER :: M08N9RDze = 15219 - INTEGER(IntKi), PARAMETER :: M09N1RDze = 15220 - INTEGER(IntKi), PARAMETER :: M09N2RDze = 15221 - INTEGER(IntKi), PARAMETER :: M09N3RDze = 15222 - INTEGER(IntKi), PARAMETER :: M09N4RDze = 15223 - INTEGER(IntKi), PARAMETER :: M09N5RDze = 15224 - INTEGER(IntKi), PARAMETER :: M09N6RDze = 15225 - INTEGER(IntKi), PARAMETER :: M09N7RDze = 15226 - INTEGER(IntKi), PARAMETER :: M09N8RDze = 15227 - INTEGER(IntKi), PARAMETER :: M09N9RDze = 15228 - INTEGER(IntKi), PARAMETER :: M10N1RDze = 15229 - INTEGER(IntKi), PARAMETER :: M10N2RDze = 15230 - INTEGER(IntKi), PARAMETER :: M10N3RDze = 15231 - INTEGER(IntKi), PARAMETER :: M10N4RDze = 15232 - INTEGER(IntKi), PARAMETER :: M10N5RDze = 15233 - INTEGER(IntKi), PARAMETER :: M10N6RDze = 15234 - INTEGER(IntKi), PARAMETER :: M10N7RDze = 15235 - INTEGER(IntKi), PARAMETER :: M10N8RDze = 15236 - INTEGER(IntKi), PARAMETER :: M10N9RDze = 15237 - INTEGER(IntKi), PARAMETER :: M11N1RDze = 15238 - INTEGER(IntKi), PARAMETER :: M11N2RDze = 15239 - INTEGER(IntKi), PARAMETER :: M11N3RDze = 15240 - INTEGER(IntKi), PARAMETER :: M11N4RDze = 15241 - INTEGER(IntKi), PARAMETER :: M11N5RDze = 15242 - INTEGER(IntKi), PARAMETER :: M11N6RDze = 15243 - INTEGER(IntKi), PARAMETER :: M11N7RDze = 15244 - INTEGER(IntKi), PARAMETER :: M11N8RDze = 15245 - INTEGER(IntKi), PARAMETER :: M11N9RDze = 15246 - INTEGER(IntKi), PARAMETER :: M12N1RDze = 15247 - INTEGER(IntKi), PARAMETER :: M12N2RDze = 15248 - INTEGER(IntKi), PARAMETER :: M12N3RDze = 15249 - INTEGER(IntKi), PARAMETER :: M12N4RDze = 15250 - INTEGER(IntKi), PARAMETER :: M12N5RDze = 15251 - INTEGER(IntKi), PARAMETER :: M12N6RDze = 15252 - INTEGER(IntKi), PARAMETER :: M12N7RDze = 15253 - INTEGER(IntKi), PARAMETER :: M12N8RDze = 15254 - INTEGER(IntKi), PARAMETER :: M12N9RDze = 15255 - INTEGER(IntKi), PARAMETER :: M13N1RDze = 15256 - INTEGER(IntKi), PARAMETER :: M13N2RDze = 15257 - INTEGER(IntKi), PARAMETER :: M13N3RDze = 15258 - INTEGER(IntKi), PARAMETER :: M13N4RDze = 15259 - INTEGER(IntKi), PARAMETER :: M13N5RDze = 15260 - INTEGER(IntKi), PARAMETER :: M13N6RDze = 15261 - INTEGER(IntKi), PARAMETER :: M13N7RDze = 15262 - INTEGER(IntKi), PARAMETER :: M13N8RDze = 15263 - INTEGER(IntKi), PARAMETER :: M13N9RDze = 15264 - INTEGER(IntKi), PARAMETER :: M14N1RDze = 15265 - INTEGER(IntKi), PARAMETER :: M14N2RDze = 15266 - INTEGER(IntKi), PARAMETER :: M14N3RDze = 15267 - INTEGER(IntKi), PARAMETER :: M14N4RDze = 15268 - INTEGER(IntKi), PARAMETER :: M14N5RDze = 15269 - INTEGER(IntKi), PARAMETER :: M14N6RDze = 15270 - INTEGER(IntKi), PARAMETER :: M14N7RDze = 15271 - INTEGER(IntKi), PARAMETER :: M14N8RDze = 15272 - INTEGER(IntKi), PARAMETER :: M14N9RDze = 15273 - INTEGER(IntKi), PARAMETER :: M15N1RDze = 15274 - INTEGER(IntKi), PARAMETER :: M15N2RDze = 15275 - INTEGER(IntKi), PARAMETER :: M15N3RDze = 15276 - INTEGER(IntKi), PARAMETER :: M15N4RDze = 15277 - INTEGER(IntKi), PARAMETER :: M15N5RDze = 15278 - INTEGER(IntKi), PARAMETER :: M15N6RDze = 15279 - INTEGER(IntKi), PARAMETER :: M15N7RDze = 15280 - INTEGER(IntKi), PARAMETER :: M15N8RDze = 15281 - INTEGER(IntKi), PARAMETER :: M15N9RDze = 15282 - INTEGER(IntKi), PARAMETER :: M16N1RDze = 15283 - INTEGER(IntKi), PARAMETER :: M16N2RDze = 15284 - INTEGER(IntKi), PARAMETER :: M16N3RDze = 15285 - INTEGER(IntKi), PARAMETER :: M16N4RDze = 15286 - INTEGER(IntKi), PARAMETER :: M16N5RDze = 15287 - INTEGER(IntKi), PARAMETER :: M16N6RDze = 15288 - INTEGER(IntKi), PARAMETER :: M16N7RDze = 15289 - INTEGER(IntKi), PARAMETER :: M16N8RDze = 15290 - INTEGER(IntKi), PARAMETER :: M16N9RDze = 15291 - INTEGER(IntKi), PARAMETER :: M17N1RDze = 15292 - INTEGER(IntKi), PARAMETER :: M17N2RDze = 15293 - INTEGER(IntKi), PARAMETER :: M17N3RDze = 15294 - INTEGER(IntKi), PARAMETER :: M17N4RDze = 15295 - INTEGER(IntKi), PARAMETER :: M17N5RDze = 15296 - INTEGER(IntKi), PARAMETER :: M17N6RDze = 15297 - INTEGER(IntKi), PARAMETER :: M17N7RDze = 15298 - INTEGER(IntKi), PARAMETER :: M17N8RDze = 15299 - INTEGER(IntKi), PARAMETER :: M17N9RDze = 15300 - INTEGER(IntKi), PARAMETER :: M18N1RDze = 15301 - INTEGER(IntKi), PARAMETER :: M18N2RDze = 15302 - INTEGER(IntKi), PARAMETER :: M18N3RDze = 15303 - INTEGER(IntKi), PARAMETER :: M18N4RDze = 15304 - INTEGER(IntKi), PARAMETER :: M18N5RDze = 15305 - INTEGER(IntKi), PARAMETER :: M18N6RDze = 15306 - INTEGER(IntKi), PARAMETER :: M18N7RDze = 15307 - INTEGER(IntKi), PARAMETER :: M18N8RDze = 15308 - INTEGER(IntKi), PARAMETER :: M18N9RDze = 15309 - INTEGER(IntKi), PARAMETER :: M19N1RDze = 15310 - INTEGER(IntKi), PARAMETER :: M19N2RDze = 15311 - INTEGER(IntKi), PARAMETER :: M19N3RDze = 15312 - INTEGER(IntKi), PARAMETER :: M19N4RDze = 15313 - INTEGER(IntKi), PARAMETER :: M19N5RDze = 15314 - INTEGER(IntKi), PARAMETER :: M19N6RDze = 15315 - INTEGER(IntKi), PARAMETER :: M19N7RDze = 15316 - INTEGER(IntKi), PARAMETER :: M19N8RDze = 15317 - INTEGER(IntKi), PARAMETER :: M19N9RDze = 15318 - INTEGER(IntKi), PARAMETER :: M20N1RDze = 15319 - INTEGER(IntKi), PARAMETER :: M20N2RDze = 15320 - INTEGER(IntKi), PARAMETER :: M20N3RDze = 15321 - INTEGER(IntKi), PARAMETER :: M20N4RDze = 15322 - INTEGER(IntKi), PARAMETER :: M20N5RDze = 15323 - INTEGER(IntKi), PARAMETER :: M20N6RDze = 15324 - INTEGER(IntKi), PARAMETER :: M20N7RDze = 15325 - INTEGER(IntKi), PARAMETER :: M20N8RDze = 15326 - INTEGER(IntKi), PARAMETER :: M20N9RDze = 15327 - INTEGER(IntKi), PARAMETER :: M21N1RDze = 15328 - INTEGER(IntKi), PARAMETER :: M21N2RDze = 15329 - INTEGER(IntKi), PARAMETER :: M21N3RDze = 15330 - INTEGER(IntKi), PARAMETER :: M21N4RDze = 15331 - INTEGER(IntKi), PARAMETER :: M21N5RDze = 15332 - INTEGER(IntKi), PARAMETER :: M21N6RDze = 15333 - INTEGER(IntKi), PARAMETER :: M21N7RDze = 15334 - INTEGER(IntKi), PARAMETER :: M21N8RDze = 15335 - INTEGER(IntKi), PARAMETER :: M21N9RDze = 15336 - INTEGER(IntKi), PARAMETER :: M22N1RDze = 15337 - INTEGER(IntKi), PARAMETER :: M22N2RDze = 15338 - INTEGER(IntKi), PARAMETER :: M22N3RDze = 15339 - INTEGER(IntKi), PARAMETER :: M22N4RDze = 15340 - INTEGER(IntKi), PARAMETER :: M22N5RDze = 15341 - INTEGER(IntKi), PARAMETER :: M22N6RDze = 15342 - INTEGER(IntKi), PARAMETER :: M22N7RDze = 15343 - INTEGER(IntKi), PARAMETER :: M22N8RDze = 15344 - INTEGER(IntKi), PARAMETER :: M22N9RDze = 15345 - INTEGER(IntKi), PARAMETER :: M23N1RDze = 15346 - INTEGER(IntKi), PARAMETER :: M23N2RDze = 15347 - INTEGER(IntKi), PARAMETER :: M23N3RDze = 15348 - INTEGER(IntKi), PARAMETER :: M23N4RDze = 15349 - INTEGER(IntKi), PARAMETER :: M23N5RDze = 15350 - INTEGER(IntKi), PARAMETER :: M23N6RDze = 15351 - INTEGER(IntKi), PARAMETER :: M23N7RDze = 15352 - INTEGER(IntKi), PARAMETER :: M23N8RDze = 15353 - INTEGER(IntKi), PARAMETER :: M23N9RDze = 15354 - INTEGER(IntKi), PARAMETER :: M24N1RDze = 15355 - INTEGER(IntKi), PARAMETER :: M24N2RDze = 15356 - INTEGER(IntKi), PARAMETER :: M24N3RDze = 15357 - INTEGER(IntKi), PARAMETER :: M24N4RDze = 15358 - INTEGER(IntKi), PARAMETER :: M24N5RDze = 15359 - INTEGER(IntKi), PARAMETER :: M24N6RDze = 15360 - INTEGER(IntKi), PARAMETER :: M24N7RDze = 15361 - INTEGER(IntKi), PARAMETER :: M24N8RDze = 15362 - INTEGER(IntKi), PARAMETER :: M24N9RDze = 15363 - INTEGER(IntKi), PARAMETER :: M25N1RDze = 15364 - INTEGER(IntKi), PARAMETER :: M25N2RDze = 15365 - INTEGER(IntKi), PARAMETER :: M25N3RDze = 15366 - INTEGER(IntKi), PARAMETER :: M25N4RDze = 15367 - INTEGER(IntKi), PARAMETER :: M25N5RDze = 15368 - INTEGER(IntKi), PARAMETER :: M25N6RDze = 15369 - INTEGER(IntKi), PARAMETER :: M25N7RDze = 15370 - INTEGER(IntKi), PARAMETER :: M25N8RDze = 15371 - INTEGER(IntKi), PARAMETER :: M25N9RDze = 15372 - INTEGER(IntKi), PARAMETER :: M26N1RDze = 15373 - INTEGER(IntKi), PARAMETER :: M26N2RDze = 15374 - INTEGER(IntKi), PARAMETER :: M26N3RDze = 15375 - INTEGER(IntKi), PARAMETER :: M26N4RDze = 15376 - INTEGER(IntKi), PARAMETER :: M26N5RDze = 15377 - INTEGER(IntKi), PARAMETER :: M26N6RDze = 15378 - INTEGER(IntKi), PARAMETER :: M26N7RDze = 15379 - INTEGER(IntKi), PARAMETER :: M26N8RDze = 15380 - INTEGER(IntKi), PARAMETER :: M26N9RDze = 15381 - INTEGER(IntKi), PARAMETER :: M27N1RDze = 15382 - INTEGER(IntKi), PARAMETER :: M27N2RDze = 15383 - INTEGER(IntKi), PARAMETER :: M27N3RDze = 15384 - INTEGER(IntKi), PARAMETER :: M27N4RDze = 15385 - INTEGER(IntKi), PARAMETER :: M27N5RDze = 15386 - INTEGER(IntKi), PARAMETER :: M27N6RDze = 15387 - INTEGER(IntKi), PARAMETER :: M27N7RDze = 15388 - INTEGER(IntKi), PARAMETER :: M27N8RDze = 15389 - INTEGER(IntKi), PARAMETER :: M27N9RDze = 15390 - INTEGER(IntKi), PARAMETER :: M28N1RDze = 15391 - INTEGER(IntKi), PARAMETER :: M28N2RDze = 15392 - INTEGER(IntKi), PARAMETER :: M28N3RDze = 15393 - INTEGER(IntKi), PARAMETER :: M28N4RDze = 15394 - INTEGER(IntKi), PARAMETER :: M28N5RDze = 15395 - INTEGER(IntKi), PARAMETER :: M28N6RDze = 15396 - INTEGER(IntKi), PARAMETER :: M28N7RDze = 15397 - INTEGER(IntKi), PARAMETER :: M28N8RDze = 15398 - INTEGER(IntKi), PARAMETER :: M28N9RDze = 15399 - INTEGER(IntKi), PARAMETER :: M29N1RDze = 15400 - INTEGER(IntKi), PARAMETER :: M29N2RDze = 15401 - INTEGER(IntKi), PARAMETER :: M29N3RDze = 15402 - INTEGER(IntKi), PARAMETER :: M29N4RDze = 15403 - INTEGER(IntKi), PARAMETER :: M29N5RDze = 15404 - INTEGER(IntKi), PARAMETER :: M29N6RDze = 15405 - INTEGER(IntKi), PARAMETER :: M29N7RDze = 15406 - INTEGER(IntKi), PARAMETER :: M29N8RDze = 15407 - INTEGER(IntKi), PARAMETER :: M29N9RDze = 15408 - INTEGER(IntKi), PARAMETER :: M30N1RDze = 15409 - INTEGER(IntKi), PARAMETER :: M30N2RDze = 15410 - INTEGER(IntKi), PARAMETER :: M30N3RDze = 15411 - INTEGER(IntKi), PARAMETER :: M30N4RDze = 15412 - INTEGER(IntKi), PARAMETER :: M30N5RDze = 15413 - INTEGER(IntKi), PARAMETER :: M30N6RDze = 15414 - INTEGER(IntKi), PARAMETER :: M30N7RDze = 15415 - INTEGER(IntKi), PARAMETER :: M30N8RDze = 15416 - INTEGER(IntKi), PARAMETER :: M30N9RDze = 15417 - INTEGER(IntKi), PARAMETER :: M31N1RDze = 15418 - INTEGER(IntKi), PARAMETER :: M31N2RDze = 15419 - INTEGER(IntKi), PARAMETER :: M31N3RDze = 15420 - INTEGER(IntKi), PARAMETER :: M31N4RDze = 15421 - INTEGER(IntKi), PARAMETER :: M31N5RDze = 15422 - INTEGER(IntKi), PARAMETER :: M31N6RDze = 15423 - INTEGER(IntKi), PARAMETER :: M31N7RDze = 15424 - INTEGER(IntKi), PARAMETER :: M31N8RDze = 15425 - INTEGER(IntKi), PARAMETER :: M31N9RDze = 15426 - INTEGER(IntKi), PARAMETER :: M32N1RDze = 15427 - INTEGER(IntKi), PARAMETER :: M32N2RDze = 15428 - INTEGER(IntKi), PARAMETER :: M32N3RDze = 15429 - INTEGER(IntKi), PARAMETER :: M32N4RDze = 15430 - INTEGER(IntKi), PARAMETER :: M32N5RDze = 15431 - INTEGER(IntKi), PARAMETER :: M32N6RDze = 15432 - INTEGER(IntKi), PARAMETER :: M32N7RDze = 15433 - INTEGER(IntKi), PARAMETER :: M32N8RDze = 15434 - INTEGER(IntKi), PARAMETER :: M32N9RDze = 15435 - INTEGER(IntKi), PARAMETER :: M33N1RDze = 15436 - INTEGER(IntKi), PARAMETER :: M33N2RDze = 15437 - INTEGER(IntKi), PARAMETER :: M33N3RDze = 15438 - INTEGER(IntKi), PARAMETER :: M33N4RDze = 15439 - INTEGER(IntKi), PARAMETER :: M33N5RDze = 15440 - INTEGER(IntKi), PARAMETER :: M33N6RDze = 15441 - INTEGER(IntKi), PARAMETER :: M33N7RDze = 15442 - INTEGER(IntKi), PARAMETER :: M33N8RDze = 15443 - INTEGER(IntKi), PARAMETER :: M33N9RDze = 15444 - INTEGER(IntKi), PARAMETER :: M34N1RDze = 15445 - INTEGER(IntKi), PARAMETER :: M34N2RDze = 15446 - INTEGER(IntKi), PARAMETER :: M34N3RDze = 15447 - INTEGER(IntKi), PARAMETER :: M34N4RDze = 15448 - INTEGER(IntKi), PARAMETER :: M34N5RDze = 15449 - INTEGER(IntKi), PARAMETER :: M34N6RDze = 15450 - INTEGER(IntKi), PARAMETER :: M34N7RDze = 15451 - INTEGER(IntKi), PARAMETER :: M34N8RDze = 15452 - INTEGER(IntKi), PARAMETER :: M34N9RDze = 15453 - INTEGER(IntKi), PARAMETER :: M35N1RDze = 15454 - INTEGER(IntKi), PARAMETER :: M35N2RDze = 15455 - INTEGER(IntKi), PARAMETER :: M35N3RDze = 15456 - INTEGER(IntKi), PARAMETER :: M35N4RDze = 15457 - INTEGER(IntKi), PARAMETER :: M35N5RDze = 15458 - INTEGER(IntKi), PARAMETER :: M35N6RDze = 15459 - INTEGER(IntKi), PARAMETER :: M35N7RDze = 15460 - INTEGER(IntKi), PARAMETER :: M35N8RDze = 15461 - INTEGER(IntKi), PARAMETER :: M35N9RDze = 15462 - INTEGER(IntKi), PARAMETER :: M36N1RDze = 15463 - INTEGER(IntKi), PARAMETER :: M36N2RDze = 15464 - INTEGER(IntKi), PARAMETER :: M36N3RDze = 15465 - INTEGER(IntKi), PARAMETER :: M36N4RDze = 15466 - INTEGER(IntKi), PARAMETER :: M36N5RDze = 15467 - INTEGER(IntKi), PARAMETER :: M36N6RDze = 15468 - INTEGER(IntKi), PARAMETER :: M36N7RDze = 15469 - INTEGER(IntKi), PARAMETER :: M36N8RDze = 15470 - INTEGER(IntKi), PARAMETER :: M36N9RDze = 15471 - INTEGER(IntKi), PARAMETER :: M37N1RDze = 15472 - INTEGER(IntKi), PARAMETER :: M37N2RDze = 15473 - INTEGER(IntKi), PARAMETER :: M37N3RDze = 15474 - INTEGER(IntKi), PARAMETER :: M37N4RDze = 15475 - INTEGER(IntKi), PARAMETER :: M37N5RDze = 15476 - INTEGER(IntKi), PARAMETER :: M37N6RDze = 15477 - INTEGER(IntKi), PARAMETER :: M37N7RDze = 15478 - INTEGER(IntKi), PARAMETER :: M37N8RDze = 15479 - INTEGER(IntKi), PARAMETER :: M37N9RDze = 15480 - INTEGER(IntKi), PARAMETER :: M38N1RDze = 15481 - INTEGER(IntKi), PARAMETER :: M38N2RDze = 15482 - INTEGER(IntKi), PARAMETER :: M38N3RDze = 15483 - INTEGER(IntKi), PARAMETER :: M38N4RDze = 15484 - INTEGER(IntKi), PARAMETER :: M38N5RDze = 15485 - INTEGER(IntKi), PARAMETER :: M38N6RDze = 15486 - INTEGER(IntKi), PARAMETER :: M38N7RDze = 15487 - INTEGER(IntKi), PARAMETER :: M38N8RDze = 15488 - INTEGER(IntKi), PARAMETER :: M38N9RDze = 15489 - INTEGER(IntKi), PARAMETER :: M39N1RDze = 15490 - INTEGER(IntKi), PARAMETER :: M39N2RDze = 15491 - INTEGER(IntKi), PARAMETER :: M39N3RDze = 15492 - INTEGER(IntKi), PARAMETER :: M39N4RDze = 15493 - INTEGER(IntKi), PARAMETER :: M39N5RDze = 15494 - INTEGER(IntKi), PARAMETER :: M39N6RDze = 15495 - INTEGER(IntKi), PARAMETER :: M39N7RDze = 15496 - INTEGER(IntKi), PARAMETER :: M39N8RDze = 15497 - INTEGER(IntKi), PARAMETER :: M39N9RDze = 15498 - INTEGER(IntKi), PARAMETER :: M40N1RDze = 15499 - INTEGER(IntKi), PARAMETER :: M40N2RDze = 15500 - INTEGER(IntKi), PARAMETER :: M40N3RDze = 15501 - INTEGER(IntKi), PARAMETER :: M40N4RDze = 15502 - INTEGER(IntKi), PARAMETER :: M40N5RDze = 15503 - INTEGER(IntKi), PARAMETER :: M40N6RDze = 15504 - INTEGER(IntKi), PARAMETER :: M40N7RDze = 15505 - INTEGER(IntKi), PARAMETER :: M40N8RDze = 15506 - INTEGER(IntKi), PARAMETER :: M40N9RDze = 15507 - INTEGER(IntKi), PARAMETER :: M41N1RDze = 15508 - INTEGER(IntKi), PARAMETER :: M41N2RDze = 15509 - INTEGER(IntKi), PARAMETER :: M41N3RDze = 15510 - INTEGER(IntKi), PARAMETER :: M41N4RDze = 15511 - INTEGER(IntKi), PARAMETER :: M41N5RDze = 15512 - INTEGER(IntKi), PARAMETER :: M41N6RDze = 15513 - INTEGER(IntKi), PARAMETER :: M41N7RDze = 15514 - INTEGER(IntKi), PARAMETER :: M41N8RDze = 15515 - INTEGER(IntKi), PARAMETER :: M41N9RDze = 15516 - INTEGER(IntKi), PARAMETER :: M42N1RDze = 15517 - INTEGER(IntKi), PARAMETER :: M42N2RDze = 15518 - INTEGER(IntKi), PARAMETER :: M42N3RDze = 15519 - INTEGER(IntKi), PARAMETER :: M42N4RDze = 15520 - INTEGER(IntKi), PARAMETER :: M42N5RDze = 15521 - INTEGER(IntKi), PARAMETER :: M42N6RDze = 15522 - INTEGER(IntKi), PARAMETER :: M42N7RDze = 15523 - INTEGER(IntKi), PARAMETER :: M42N8RDze = 15524 - INTEGER(IntKi), PARAMETER :: M42N9RDze = 15525 - INTEGER(IntKi), PARAMETER :: M43N1RDze = 15526 - INTEGER(IntKi), PARAMETER :: M43N2RDze = 15527 - INTEGER(IntKi), PARAMETER :: M43N3RDze = 15528 - INTEGER(IntKi), PARAMETER :: M43N4RDze = 15529 - INTEGER(IntKi), PARAMETER :: M43N5RDze = 15530 - INTEGER(IntKi), PARAMETER :: M43N6RDze = 15531 - INTEGER(IntKi), PARAMETER :: M43N7RDze = 15532 - INTEGER(IntKi), PARAMETER :: M43N8RDze = 15533 - INTEGER(IntKi), PARAMETER :: M43N9RDze = 15534 - INTEGER(IntKi), PARAMETER :: M44N1RDze = 15535 - INTEGER(IntKi), PARAMETER :: M44N2RDze = 15536 - INTEGER(IntKi), PARAMETER :: M44N3RDze = 15537 - INTEGER(IntKi), PARAMETER :: M44N4RDze = 15538 - INTEGER(IntKi), PARAMETER :: M44N5RDze = 15539 - INTEGER(IntKi), PARAMETER :: M44N6RDze = 15540 - INTEGER(IntKi), PARAMETER :: M44N7RDze = 15541 - INTEGER(IntKi), PARAMETER :: M44N8RDze = 15542 - INTEGER(IntKi), PARAMETER :: M44N9RDze = 15543 - INTEGER(IntKi), PARAMETER :: M45N1RDze = 15544 - INTEGER(IntKi), PARAMETER :: M45N2RDze = 15545 - INTEGER(IntKi), PARAMETER :: M45N3RDze = 15546 - INTEGER(IntKi), PARAMETER :: M45N4RDze = 15547 - INTEGER(IntKi), PARAMETER :: M45N5RDze = 15548 - INTEGER(IntKi), PARAMETER :: M45N6RDze = 15549 - INTEGER(IntKi), PARAMETER :: M45N7RDze = 15550 - INTEGER(IntKi), PARAMETER :: M45N8RDze = 15551 - INTEGER(IntKi), PARAMETER :: M45N9RDze = 15552 - INTEGER(IntKi), PARAMETER :: M46N1RDze = 15553 - INTEGER(IntKi), PARAMETER :: M46N2RDze = 15554 - INTEGER(IntKi), PARAMETER :: M46N3RDze = 15555 - INTEGER(IntKi), PARAMETER :: M46N4RDze = 15556 - INTEGER(IntKi), PARAMETER :: M46N5RDze = 15557 - INTEGER(IntKi), PARAMETER :: M46N6RDze = 15558 - INTEGER(IntKi), PARAMETER :: M46N7RDze = 15559 - INTEGER(IntKi), PARAMETER :: M46N8RDze = 15560 - INTEGER(IntKi), PARAMETER :: M46N9RDze = 15561 - INTEGER(IntKi), PARAMETER :: M47N1RDze = 15562 - INTEGER(IntKi), PARAMETER :: M47N2RDze = 15563 - INTEGER(IntKi), PARAMETER :: M47N3RDze = 15564 - INTEGER(IntKi), PARAMETER :: M47N4RDze = 15565 - INTEGER(IntKi), PARAMETER :: M47N5RDze = 15566 - INTEGER(IntKi), PARAMETER :: M47N6RDze = 15567 - INTEGER(IntKi), PARAMETER :: M47N7RDze = 15568 - INTEGER(IntKi), PARAMETER :: M47N8RDze = 15569 - INTEGER(IntKi), PARAMETER :: M47N9RDze = 15570 - INTEGER(IntKi), PARAMETER :: M48N1RDze = 15571 - INTEGER(IntKi), PARAMETER :: M48N2RDze = 15572 - INTEGER(IntKi), PARAMETER :: M48N3RDze = 15573 - INTEGER(IntKi), PARAMETER :: M48N4RDze = 15574 - INTEGER(IntKi), PARAMETER :: M48N5RDze = 15575 - INTEGER(IntKi), PARAMETER :: M48N6RDze = 15576 - INTEGER(IntKi), PARAMETER :: M48N7RDze = 15577 - INTEGER(IntKi), PARAMETER :: M48N8RDze = 15578 - INTEGER(IntKi), PARAMETER :: M48N9RDze = 15579 - INTEGER(IntKi), PARAMETER :: M49N1RDze = 15580 - INTEGER(IntKi), PARAMETER :: M49N2RDze = 15581 - INTEGER(IntKi), PARAMETER :: M49N3RDze = 15582 - INTEGER(IntKi), PARAMETER :: M49N4RDze = 15583 - INTEGER(IntKi), PARAMETER :: M49N5RDze = 15584 - INTEGER(IntKi), PARAMETER :: M49N6RDze = 15585 - INTEGER(IntKi), PARAMETER :: M49N7RDze = 15586 - INTEGER(IntKi), PARAMETER :: M49N8RDze = 15587 - INTEGER(IntKi), PARAMETER :: M49N9RDze = 15588 - INTEGER(IntKi), PARAMETER :: M50N1RDze = 15589 - INTEGER(IntKi), PARAMETER :: M50N2RDze = 15590 - INTEGER(IntKi), PARAMETER :: M50N3RDze = 15591 - INTEGER(IntKi), PARAMETER :: M50N4RDze = 15592 - INTEGER(IntKi), PARAMETER :: M50N5RDze = 15593 - INTEGER(IntKi), PARAMETER :: M50N6RDze = 15594 - INTEGER(IntKi), PARAMETER :: M50N7RDze = 15595 - INTEGER(IntKi), PARAMETER :: M50N8RDze = 15596 - INTEGER(IntKi), PARAMETER :: M50N9RDze = 15597 - INTEGER(IntKi), PARAMETER :: M51N1RDze = 15598 - INTEGER(IntKi), PARAMETER :: M51N2RDze = 15599 - INTEGER(IntKi), PARAMETER :: M51N3RDze = 15600 - INTEGER(IntKi), PARAMETER :: M51N4RDze = 15601 - INTEGER(IntKi), PARAMETER :: M51N5RDze = 15602 - INTEGER(IntKi), PARAMETER :: M51N6RDze = 15603 - INTEGER(IntKi), PARAMETER :: M51N7RDze = 15604 - INTEGER(IntKi), PARAMETER :: M51N8RDze = 15605 - INTEGER(IntKi), PARAMETER :: M51N9RDze = 15606 - INTEGER(IntKi), PARAMETER :: M52N1RDze = 15607 - INTEGER(IntKi), PARAMETER :: M52N2RDze = 15608 - INTEGER(IntKi), PARAMETER :: M52N3RDze = 15609 - INTEGER(IntKi), PARAMETER :: M52N4RDze = 15610 - INTEGER(IntKi), PARAMETER :: M52N5RDze = 15611 - INTEGER(IntKi), PARAMETER :: M52N6RDze = 15612 - INTEGER(IntKi), PARAMETER :: M52N7RDze = 15613 - INTEGER(IntKi), PARAMETER :: M52N8RDze = 15614 - INTEGER(IntKi), PARAMETER :: M52N9RDze = 15615 - INTEGER(IntKi), PARAMETER :: M53N1RDze = 15616 - INTEGER(IntKi), PARAMETER :: M53N2RDze = 15617 - INTEGER(IntKi), PARAMETER :: M53N3RDze = 15618 - INTEGER(IntKi), PARAMETER :: M53N4RDze = 15619 - INTEGER(IntKi), PARAMETER :: M53N5RDze = 15620 - INTEGER(IntKi), PARAMETER :: M53N6RDze = 15621 - INTEGER(IntKi), PARAMETER :: M53N7RDze = 15622 - INTEGER(IntKi), PARAMETER :: M53N8RDze = 15623 - INTEGER(IntKi), PARAMETER :: M53N9RDze = 15624 - INTEGER(IntKi), PARAMETER :: M54N1RDze = 15625 - INTEGER(IntKi), PARAMETER :: M54N2RDze = 15626 - INTEGER(IntKi), PARAMETER :: M54N3RDze = 15627 - INTEGER(IntKi), PARAMETER :: M54N4RDze = 15628 - INTEGER(IntKi), PARAMETER :: M54N5RDze = 15629 - INTEGER(IntKi), PARAMETER :: M54N6RDze = 15630 - INTEGER(IntKi), PARAMETER :: M54N7RDze = 15631 - INTEGER(IntKi), PARAMETER :: M54N8RDze = 15632 - INTEGER(IntKi), PARAMETER :: M54N9RDze = 15633 - INTEGER(IntKi), PARAMETER :: M55N1RDze = 15634 - INTEGER(IntKi), PARAMETER :: M55N2RDze = 15635 - INTEGER(IntKi), PARAMETER :: M55N3RDze = 15636 - INTEGER(IntKi), PARAMETER :: M55N4RDze = 15637 - INTEGER(IntKi), PARAMETER :: M55N5RDze = 15638 - INTEGER(IntKi), PARAMETER :: M55N6RDze = 15639 - INTEGER(IntKi), PARAMETER :: M55N7RDze = 15640 - INTEGER(IntKi), PARAMETER :: M55N8RDze = 15641 - INTEGER(IntKi), PARAMETER :: M55N9RDze = 15642 - INTEGER(IntKi), PARAMETER :: M56N1RDze = 15643 - INTEGER(IntKi), PARAMETER :: M56N2RDze = 15644 - INTEGER(IntKi), PARAMETER :: M56N3RDze = 15645 - INTEGER(IntKi), PARAMETER :: M56N4RDze = 15646 - INTEGER(IntKi), PARAMETER :: M56N5RDze = 15647 - INTEGER(IntKi), PARAMETER :: M56N6RDze = 15648 - INTEGER(IntKi), PARAMETER :: M56N7RDze = 15649 - INTEGER(IntKi), PARAMETER :: M56N8RDze = 15650 - INTEGER(IntKi), PARAMETER :: M56N9RDze = 15651 - INTEGER(IntKi), PARAMETER :: M57N1RDze = 15652 - INTEGER(IntKi), PARAMETER :: M57N2RDze = 15653 - INTEGER(IntKi), PARAMETER :: M57N3RDze = 15654 - INTEGER(IntKi), PARAMETER :: M57N4RDze = 15655 - INTEGER(IntKi), PARAMETER :: M57N5RDze = 15656 - INTEGER(IntKi), PARAMETER :: M57N6RDze = 15657 - INTEGER(IntKi), PARAMETER :: M57N7RDze = 15658 - INTEGER(IntKi), PARAMETER :: M57N8RDze = 15659 - INTEGER(IntKi), PARAMETER :: M57N9RDze = 15660 - INTEGER(IntKi), PARAMETER :: M58N1RDze = 15661 - INTEGER(IntKi), PARAMETER :: M58N2RDze = 15662 - INTEGER(IntKi), PARAMETER :: M58N3RDze = 15663 - INTEGER(IntKi), PARAMETER :: M58N4RDze = 15664 - INTEGER(IntKi), PARAMETER :: M58N5RDze = 15665 - INTEGER(IntKi), PARAMETER :: M58N6RDze = 15666 - INTEGER(IntKi), PARAMETER :: M58N7RDze = 15667 - INTEGER(IntKi), PARAMETER :: M58N8RDze = 15668 - INTEGER(IntKi), PARAMETER :: M58N9RDze = 15669 - INTEGER(IntKi), PARAMETER :: M59N1RDze = 15670 - INTEGER(IntKi), PARAMETER :: M59N2RDze = 15671 - INTEGER(IntKi), PARAMETER :: M59N3RDze = 15672 - INTEGER(IntKi), PARAMETER :: M59N4RDze = 15673 - INTEGER(IntKi), PARAMETER :: M59N5RDze = 15674 - INTEGER(IntKi), PARAMETER :: M59N6RDze = 15675 - INTEGER(IntKi), PARAMETER :: M59N7RDze = 15676 - INTEGER(IntKi), PARAMETER :: M59N8RDze = 15677 - INTEGER(IntKi), PARAMETER :: M59N9RDze = 15678 - INTEGER(IntKi), PARAMETER :: M60N1RDze = 15679 - INTEGER(IntKi), PARAMETER :: M60N2RDze = 15680 - INTEGER(IntKi), PARAMETER :: M60N3RDze = 15681 - INTEGER(IntKi), PARAMETER :: M60N4RDze = 15682 - INTEGER(IntKi), PARAMETER :: M60N5RDze = 15683 - INTEGER(IntKi), PARAMETER :: M60N6RDze = 15684 - INTEGER(IntKi), PARAMETER :: M60N7RDze = 15685 - INTEGER(IntKi), PARAMETER :: M60N8RDze = 15686 - INTEGER(IntKi), PARAMETER :: M60N9RDze = 15687 - INTEGER(IntKi), PARAMETER :: M61N1RDze = 15688 - INTEGER(IntKi), PARAMETER :: M61N2RDze = 15689 - INTEGER(IntKi), PARAMETER :: M61N3RDze = 15690 - INTEGER(IntKi), PARAMETER :: M61N4RDze = 15691 - INTEGER(IntKi), PARAMETER :: M61N5RDze = 15692 - INTEGER(IntKi), PARAMETER :: M61N6RDze = 15693 - INTEGER(IntKi), PARAMETER :: M61N7RDze = 15694 - INTEGER(IntKi), PARAMETER :: M61N8RDze = 15695 - INTEGER(IntKi), PARAMETER :: M61N9RDze = 15696 - INTEGER(IntKi), PARAMETER :: M62N1RDze = 15697 - INTEGER(IntKi), PARAMETER :: M62N2RDze = 15698 - INTEGER(IntKi), PARAMETER :: M62N3RDze = 15699 - INTEGER(IntKi), PARAMETER :: M62N4RDze = 15700 - INTEGER(IntKi), PARAMETER :: M62N5RDze = 15701 - INTEGER(IntKi), PARAMETER :: M62N6RDze = 15702 - INTEGER(IntKi), PARAMETER :: M62N7RDze = 15703 - INTEGER(IntKi), PARAMETER :: M62N8RDze = 15704 - INTEGER(IntKi), PARAMETER :: M62N9RDze = 15705 - INTEGER(IntKi), PARAMETER :: M63N1RDze = 15706 - INTEGER(IntKi), PARAMETER :: M63N2RDze = 15707 - INTEGER(IntKi), PARAMETER :: M63N3RDze = 15708 - INTEGER(IntKi), PARAMETER :: M63N4RDze = 15709 - INTEGER(IntKi), PARAMETER :: M63N5RDze = 15710 - INTEGER(IntKi), PARAMETER :: M63N6RDze = 15711 - INTEGER(IntKi), PARAMETER :: M63N7RDze = 15712 - INTEGER(IntKi), PARAMETER :: M63N8RDze = 15713 - INTEGER(IntKi), PARAMETER :: M63N9RDze = 15714 - INTEGER(IntKi), PARAMETER :: M64N1RDze = 15715 - INTEGER(IntKi), PARAMETER :: M64N2RDze = 15716 - INTEGER(IntKi), PARAMETER :: M64N3RDze = 15717 - INTEGER(IntKi), PARAMETER :: M64N4RDze = 15718 - INTEGER(IntKi), PARAMETER :: M64N5RDze = 15719 - INTEGER(IntKi), PARAMETER :: M64N6RDze = 15720 - INTEGER(IntKi), PARAMETER :: M64N7RDze = 15721 - INTEGER(IntKi), PARAMETER :: M64N8RDze = 15722 - INTEGER(IntKi), PARAMETER :: M64N9RDze = 15723 - INTEGER(IntKi), PARAMETER :: M65N1RDze = 15724 - INTEGER(IntKi), PARAMETER :: M65N2RDze = 15725 - INTEGER(IntKi), PARAMETER :: M65N3RDze = 15726 - INTEGER(IntKi), PARAMETER :: M65N4RDze = 15727 - INTEGER(IntKi), PARAMETER :: M65N5RDze = 15728 - INTEGER(IntKi), PARAMETER :: M65N6RDze = 15729 - INTEGER(IntKi), PARAMETER :: M65N7RDze = 15730 - INTEGER(IntKi), PARAMETER :: M65N8RDze = 15731 - INTEGER(IntKi), PARAMETER :: M65N9RDze = 15732 - INTEGER(IntKi), PARAMETER :: M66N1RDze = 15733 - INTEGER(IntKi), PARAMETER :: M66N2RDze = 15734 - INTEGER(IntKi), PARAMETER :: M66N3RDze = 15735 - INTEGER(IntKi), PARAMETER :: M66N4RDze = 15736 - INTEGER(IntKi), PARAMETER :: M66N5RDze = 15737 - INTEGER(IntKi), PARAMETER :: M66N6RDze = 15738 - INTEGER(IntKi), PARAMETER :: M66N7RDze = 15739 - INTEGER(IntKi), PARAMETER :: M66N8RDze = 15740 - INTEGER(IntKi), PARAMETER :: M66N9RDze = 15741 - INTEGER(IntKi), PARAMETER :: M67N1RDze = 15742 - INTEGER(IntKi), PARAMETER :: M67N2RDze = 15743 - INTEGER(IntKi), PARAMETER :: M67N3RDze = 15744 - INTEGER(IntKi), PARAMETER :: M67N4RDze = 15745 - INTEGER(IntKi), PARAMETER :: M67N5RDze = 15746 - INTEGER(IntKi), PARAMETER :: M67N6RDze = 15747 - INTEGER(IntKi), PARAMETER :: M67N7RDze = 15748 - INTEGER(IntKi), PARAMETER :: M67N8RDze = 15749 - INTEGER(IntKi), PARAMETER :: M67N9RDze = 15750 - INTEGER(IntKi), PARAMETER :: M68N1RDze = 15751 - INTEGER(IntKi), PARAMETER :: M68N2RDze = 15752 - INTEGER(IntKi), PARAMETER :: M68N3RDze = 15753 - INTEGER(IntKi), PARAMETER :: M68N4RDze = 15754 - INTEGER(IntKi), PARAMETER :: M68N5RDze = 15755 - INTEGER(IntKi), PARAMETER :: M68N6RDze = 15756 - INTEGER(IntKi), PARAMETER :: M68N7RDze = 15757 - INTEGER(IntKi), PARAMETER :: M68N8RDze = 15758 - INTEGER(IntKi), PARAMETER :: M68N9RDze = 15759 - INTEGER(IntKi), PARAMETER :: M69N1RDze = 15760 - INTEGER(IntKi), PARAMETER :: M69N2RDze = 15761 - INTEGER(IntKi), PARAMETER :: M69N3RDze = 15762 - INTEGER(IntKi), PARAMETER :: M69N4RDze = 15763 - INTEGER(IntKi), PARAMETER :: M69N5RDze = 15764 - INTEGER(IntKi), PARAMETER :: M69N6RDze = 15765 - INTEGER(IntKi), PARAMETER :: M69N7RDze = 15766 - INTEGER(IntKi), PARAMETER :: M69N8RDze = 15767 - INTEGER(IntKi), PARAMETER :: M69N9RDze = 15768 - INTEGER(IntKi), PARAMETER :: M70N1RDze = 15769 - INTEGER(IntKi), PARAMETER :: M70N2RDze = 15770 - INTEGER(IntKi), PARAMETER :: M70N3RDze = 15771 - INTEGER(IntKi), PARAMETER :: M70N4RDze = 15772 - INTEGER(IntKi), PARAMETER :: M70N5RDze = 15773 - INTEGER(IntKi), PARAMETER :: M70N6RDze = 15774 - INTEGER(IntKi), PARAMETER :: M70N7RDze = 15775 - INTEGER(IntKi), PARAMETER :: M70N8RDze = 15776 - INTEGER(IntKi), PARAMETER :: M70N9RDze = 15777 - INTEGER(IntKi), PARAMETER :: M71N1RDze = 15778 - INTEGER(IntKi), PARAMETER :: M71N2RDze = 15779 - INTEGER(IntKi), PARAMETER :: M71N3RDze = 15780 - INTEGER(IntKi), PARAMETER :: M71N4RDze = 15781 - INTEGER(IntKi), PARAMETER :: M71N5RDze = 15782 - INTEGER(IntKi), PARAMETER :: M71N6RDze = 15783 - INTEGER(IntKi), PARAMETER :: M71N7RDze = 15784 - INTEGER(IntKi), PARAMETER :: M71N8RDze = 15785 - INTEGER(IntKi), PARAMETER :: M71N9RDze = 15786 - INTEGER(IntKi), PARAMETER :: M72N1RDze = 15787 - INTEGER(IntKi), PARAMETER :: M72N2RDze = 15788 - INTEGER(IntKi), PARAMETER :: M72N3RDze = 15789 - INTEGER(IntKi), PARAMETER :: M72N4RDze = 15790 - INTEGER(IntKi), PARAMETER :: M72N5RDze = 15791 - INTEGER(IntKi), PARAMETER :: M72N6RDze = 15792 - INTEGER(IntKi), PARAMETER :: M72N7RDze = 15793 - INTEGER(IntKi), PARAMETER :: M72N8RDze = 15794 - INTEGER(IntKi), PARAMETER :: M72N9RDze = 15795 - INTEGER(IntKi), PARAMETER :: M73N1RDze = 15796 - INTEGER(IntKi), PARAMETER :: M73N2RDze = 15797 - INTEGER(IntKi), PARAMETER :: M73N3RDze = 15798 - INTEGER(IntKi), PARAMETER :: M73N4RDze = 15799 - INTEGER(IntKi), PARAMETER :: M73N5RDze = 15800 - INTEGER(IntKi), PARAMETER :: M73N6RDze = 15801 - INTEGER(IntKi), PARAMETER :: M73N7RDze = 15802 - INTEGER(IntKi), PARAMETER :: M73N8RDze = 15803 - INTEGER(IntKi), PARAMETER :: M73N9RDze = 15804 - INTEGER(IntKi), PARAMETER :: M74N1RDze = 15805 - INTEGER(IntKi), PARAMETER :: M74N2RDze = 15806 - INTEGER(IntKi), PARAMETER :: M74N3RDze = 15807 - INTEGER(IntKi), PARAMETER :: M74N4RDze = 15808 - INTEGER(IntKi), PARAMETER :: M74N5RDze = 15809 - INTEGER(IntKi), PARAMETER :: M74N6RDze = 15810 - INTEGER(IntKi), PARAMETER :: M74N7RDze = 15811 - INTEGER(IntKi), PARAMETER :: M74N8RDze = 15812 - INTEGER(IntKi), PARAMETER :: M74N9RDze = 15813 - INTEGER(IntKi), PARAMETER :: M75N1RDze = 15814 - INTEGER(IntKi), PARAMETER :: M75N2RDze = 15815 - INTEGER(IntKi), PARAMETER :: M75N3RDze = 15816 - INTEGER(IntKi), PARAMETER :: M75N4RDze = 15817 - INTEGER(IntKi), PARAMETER :: M75N5RDze = 15818 - INTEGER(IntKi), PARAMETER :: M75N6RDze = 15819 - INTEGER(IntKi), PARAMETER :: M75N7RDze = 15820 - INTEGER(IntKi), PARAMETER :: M75N8RDze = 15821 - INTEGER(IntKi), PARAMETER :: M75N9RDze = 15822 - INTEGER(IntKi), PARAMETER :: M76N1RDze = 15823 - INTEGER(IntKi), PARAMETER :: M76N2RDze = 15824 - INTEGER(IntKi), PARAMETER :: M76N3RDze = 15825 - INTEGER(IntKi), PARAMETER :: M76N4RDze = 15826 - INTEGER(IntKi), PARAMETER :: M76N5RDze = 15827 - INTEGER(IntKi), PARAMETER :: M76N6RDze = 15828 - INTEGER(IntKi), PARAMETER :: M76N7RDze = 15829 - INTEGER(IntKi), PARAMETER :: M76N8RDze = 15830 - INTEGER(IntKi), PARAMETER :: M76N9RDze = 15831 - INTEGER(IntKi), PARAMETER :: M77N1RDze = 15832 - INTEGER(IntKi), PARAMETER :: M77N2RDze = 15833 - INTEGER(IntKi), PARAMETER :: M77N3RDze = 15834 - INTEGER(IntKi), PARAMETER :: M77N4RDze = 15835 - INTEGER(IntKi), PARAMETER :: M77N5RDze = 15836 - INTEGER(IntKi), PARAMETER :: M77N6RDze = 15837 - INTEGER(IntKi), PARAMETER :: M77N7RDze = 15838 - INTEGER(IntKi), PARAMETER :: M77N8RDze = 15839 - INTEGER(IntKi), PARAMETER :: M77N9RDze = 15840 - INTEGER(IntKi), PARAMETER :: M78N1RDze = 15841 - INTEGER(IntKi), PARAMETER :: M78N2RDze = 15842 - INTEGER(IntKi), PARAMETER :: M78N3RDze = 15843 - INTEGER(IntKi), PARAMETER :: M78N4RDze = 15844 - INTEGER(IntKi), PARAMETER :: M78N5RDze = 15845 - INTEGER(IntKi), PARAMETER :: M78N6RDze = 15846 - INTEGER(IntKi), PARAMETER :: M78N7RDze = 15847 - INTEGER(IntKi), PARAMETER :: M78N8RDze = 15848 - INTEGER(IntKi), PARAMETER :: M78N9RDze = 15849 - INTEGER(IntKi), PARAMETER :: M79N1RDze = 15850 - INTEGER(IntKi), PARAMETER :: M79N2RDze = 15851 - INTEGER(IntKi), PARAMETER :: M79N3RDze = 15852 - INTEGER(IntKi), PARAMETER :: M79N4RDze = 15853 - INTEGER(IntKi), PARAMETER :: M79N5RDze = 15854 - INTEGER(IntKi), PARAMETER :: M79N6RDze = 15855 - INTEGER(IntKi), PARAMETER :: M79N7RDze = 15856 - INTEGER(IntKi), PARAMETER :: M79N8RDze = 15857 - INTEGER(IntKi), PARAMETER :: M79N9RDze = 15858 - INTEGER(IntKi), PARAMETER :: M80N1RDze = 15859 - INTEGER(IntKi), PARAMETER :: M80N2RDze = 15860 - INTEGER(IntKi), PARAMETER :: M80N3RDze = 15861 - INTEGER(IntKi), PARAMETER :: M80N4RDze = 15862 - INTEGER(IntKi), PARAMETER :: M80N5RDze = 15863 - INTEGER(IntKi), PARAMETER :: M80N6RDze = 15864 - INTEGER(IntKi), PARAMETER :: M80N7RDze = 15865 - INTEGER(IntKi), PARAMETER :: M80N8RDze = 15866 - INTEGER(IntKi), PARAMETER :: M80N9RDze = 15867 - INTEGER(IntKi), PARAMETER :: M81N1RDze = 15868 - INTEGER(IntKi), PARAMETER :: M81N2RDze = 15869 - INTEGER(IntKi), PARAMETER :: M81N3RDze = 15870 - INTEGER(IntKi), PARAMETER :: M81N4RDze = 15871 - INTEGER(IntKi), PARAMETER :: M81N5RDze = 15872 - INTEGER(IntKi), PARAMETER :: M81N6RDze = 15873 - INTEGER(IntKi), PARAMETER :: M81N7RDze = 15874 - INTEGER(IntKi), PARAMETER :: M81N8RDze = 15875 - INTEGER(IntKi), PARAMETER :: M81N9RDze = 15876 - INTEGER(IntKi), PARAMETER :: M82N1RDze = 15877 - INTEGER(IntKi), PARAMETER :: M82N2RDze = 15878 - INTEGER(IntKi), PARAMETER :: M82N3RDze = 15879 - INTEGER(IntKi), PARAMETER :: M82N4RDze = 15880 - INTEGER(IntKi), PARAMETER :: M82N5RDze = 15881 - INTEGER(IntKi), PARAMETER :: M82N6RDze = 15882 - INTEGER(IntKi), PARAMETER :: M82N7RDze = 15883 - INTEGER(IntKi), PARAMETER :: M82N8RDze = 15884 - INTEGER(IntKi), PARAMETER :: M82N9RDze = 15885 - INTEGER(IntKi), PARAMETER :: M83N1RDze = 15886 - INTEGER(IntKi), PARAMETER :: M83N2RDze = 15887 - INTEGER(IntKi), PARAMETER :: M83N3RDze = 15888 - INTEGER(IntKi), PARAMETER :: M83N4RDze = 15889 - INTEGER(IntKi), PARAMETER :: M83N5RDze = 15890 - INTEGER(IntKi), PARAMETER :: M83N6RDze = 15891 - INTEGER(IntKi), PARAMETER :: M83N7RDze = 15892 - INTEGER(IntKi), PARAMETER :: M83N8RDze = 15893 - INTEGER(IntKi), PARAMETER :: M83N9RDze = 15894 - INTEGER(IntKi), PARAMETER :: M84N1RDze = 15895 - INTEGER(IntKi), PARAMETER :: M84N2RDze = 15896 - INTEGER(IntKi), PARAMETER :: M84N3RDze = 15897 - INTEGER(IntKi), PARAMETER :: M84N4RDze = 15898 - INTEGER(IntKi), PARAMETER :: M84N5RDze = 15899 - INTEGER(IntKi), PARAMETER :: M84N6RDze = 15900 - INTEGER(IntKi), PARAMETER :: M84N7RDze = 15901 - INTEGER(IntKi), PARAMETER :: M84N8RDze = 15902 - INTEGER(IntKi), PARAMETER :: M84N9RDze = 15903 - INTEGER(IntKi), PARAMETER :: M85N1RDze = 15904 - INTEGER(IntKi), PARAMETER :: M85N2RDze = 15905 - INTEGER(IntKi), PARAMETER :: M85N3RDze = 15906 - INTEGER(IntKi), PARAMETER :: M85N4RDze = 15907 - INTEGER(IntKi), PARAMETER :: M85N5RDze = 15908 - INTEGER(IntKi), PARAMETER :: M85N6RDze = 15909 - INTEGER(IntKi), PARAMETER :: M85N7RDze = 15910 - INTEGER(IntKi), PARAMETER :: M85N8RDze = 15911 - INTEGER(IntKi), PARAMETER :: M85N9RDze = 15912 - INTEGER(IntKi), PARAMETER :: M86N1RDze = 15913 - INTEGER(IntKi), PARAMETER :: M86N2RDze = 15914 - INTEGER(IntKi), PARAMETER :: M86N3RDze = 15915 - INTEGER(IntKi), PARAMETER :: M86N4RDze = 15916 - INTEGER(IntKi), PARAMETER :: M86N5RDze = 15917 - INTEGER(IntKi), PARAMETER :: M86N6RDze = 15918 - INTEGER(IntKi), PARAMETER :: M86N7RDze = 15919 - INTEGER(IntKi), PARAMETER :: M86N8RDze = 15920 - INTEGER(IntKi), PARAMETER :: M86N9RDze = 15921 - INTEGER(IntKi), PARAMETER :: M87N1RDze = 15922 - INTEGER(IntKi), PARAMETER :: M87N2RDze = 15923 - INTEGER(IntKi), PARAMETER :: M87N3RDze = 15924 - INTEGER(IntKi), PARAMETER :: M87N4RDze = 15925 - INTEGER(IntKi), PARAMETER :: M87N5RDze = 15926 - INTEGER(IntKi), PARAMETER :: M87N6RDze = 15927 - INTEGER(IntKi), PARAMETER :: M87N7RDze = 15928 - INTEGER(IntKi), PARAMETER :: M87N8RDze = 15929 - INTEGER(IntKi), PARAMETER :: M87N9RDze = 15930 - INTEGER(IntKi), PARAMETER :: M88N1RDze = 15931 - INTEGER(IntKi), PARAMETER :: M88N2RDze = 15932 - INTEGER(IntKi), PARAMETER :: M88N3RDze = 15933 - INTEGER(IntKi), PARAMETER :: M88N4RDze = 15934 - INTEGER(IntKi), PARAMETER :: M88N5RDze = 15935 - INTEGER(IntKi), PARAMETER :: M88N6RDze = 15936 - INTEGER(IntKi), PARAMETER :: M88N7RDze = 15937 - INTEGER(IntKi), PARAMETER :: M88N8RDze = 15938 - INTEGER(IntKi), PARAMETER :: M88N9RDze = 15939 - INTEGER(IntKi), PARAMETER :: M89N1RDze = 15940 - INTEGER(IntKi), PARAMETER :: M89N2RDze = 15941 - INTEGER(IntKi), PARAMETER :: M89N3RDze = 15942 - INTEGER(IntKi), PARAMETER :: M89N4RDze = 15943 - INTEGER(IntKi), PARAMETER :: M89N5RDze = 15944 - INTEGER(IntKi), PARAMETER :: M89N6RDze = 15945 - INTEGER(IntKi), PARAMETER :: M89N7RDze = 15946 - INTEGER(IntKi), PARAMETER :: M89N8RDze = 15947 - INTEGER(IntKi), PARAMETER :: M89N9RDze = 15948 - INTEGER(IntKi), PARAMETER :: M90N1RDze = 15949 - INTEGER(IntKi), PARAMETER :: M90N2RDze = 15950 - INTEGER(IntKi), PARAMETER :: M90N3RDze = 15951 - INTEGER(IntKi), PARAMETER :: M90N4RDze = 15952 - INTEGER(IntKi), PARAMETER :: M90N5RDze = 15953 - INTEGER(IntKi), PARAMETER :: M90N6RDze = 15954 - INTEGER(IntKi), PARAMETER :: M90N7RDze = 15955 - INTEGER(IntKi), PARAMETER :: M90N8RDze = 15956 - INTEGER(IntKi), PARAMETER :: M90N9RDze = 15957 - INTEGER(IntKi), PARAMETER :: M91N1RDze = 15958 - INTEGER(IntKi), PARAMETER :: M91N2RDze = 15959 - INTEGER(IntKi), PARAMETER :: M91N3RDze = 15960 - INTEGER(IntKi), PARAMETER :: M91N4RDze = 15961 - INTEGER(IntKi), PARAMETER :: M91N5RDze = 15962 - INTEGER(IntKi), PARAMETER :: M91N6RDze = 15963 - INTEGER(IntKi), PARAMETER :: M91N7RDze = 15964 - INTEGER(IntKi), PARAMETER :: M91N8RDze = 15965 - INTEGER(IntKi), PARAMETER :: M91N9RDze = 15966 - INTEGER(IntKi), PARAMETER :: M92N1RDze = 15967 - INTEGER(IntKi), PARAMETER :: M92N2RDze = 15968 - INTEGER(IntKi), PARAMETER :: M92N3RDze = 15969 - INTEGER(IntKi), PARAMETER :: M92N4RDze = 15970 - INTEGER(IntKi), PARAMETER :: M92N5RDze = 15971 - INTEGER(IntKi), PARAMETER :: M92N6RDze = 15972 - INTEGER(IntKi), PARAMETER :: M92N7RDze = 15973 - INTEGER(IntKi), PARAMETER :: M92N8RDze = 15974 - INTEGER(IntKi), PARAMETER :: M92N9RDze = 15975 - INTEGER(IntKi), PARAMETER :: M93N1RDze = 15976 - INTEGER(IntKi), PARAMETER :: M93N2RDze = 15977 - INTEGER(IntKi), PARAMETER :: M93N3RDze = 15978 - INTEGER(IntKi), PARAMETER :: M93N4RDze = 15979 - INTEGER(IntKi), PARAMETER :: M93N5RDze = 15980 - INTEGER(IntKi), PARAMETER :: M93N6RDze = 15981 - INTEGER(IntKi), PARAMETER :: M93N7RDze = 15982 - INTEGER(IntKi), PARAMETER :: M93N8RDze = 15983 - INTEGER(IntKi), PARAMETER :: M93N9RDze = 15984 - INTEGER(IntKi), PARAMETER :: M94N1RDze = 15985 - INTEGER(IntKi), PARAMETER :: M94N2RDze = 15986 - INTEGER(IntKi), PARAMETER :: M94N3RDze = 15987 - INTEGER(IntKi), PARAMETER :: M94N4RDze = 15988 - INTEGER(IntKi), PARAMETER :: M94N5RDze = 15989 - INTEGER(IntKi), PARAMETER :: M94N6RDze = 15990 - INTEGER(IntKi), PARAMETER :: M94N7RDze = 15991 - INTEGER(IntKi), PARAMETER :: M94N8RDze = 15992 - INTEGER(IntKi), PARAMETER :: M94N9RDze = 15993 - INTEGER(IntKi), PARAMETER :: M95N1RDze = 15994 - INTEGER(IntKi), PARAMETER :: M95N2RDze = 15995 - INTEGER(IntKi), PARAMETER :: M95N3RDze = 15996 - INTEGER(IntKi), PARAMETER :: M95N4RDze = 15997 - INTEGER(IntKi), PARAMETER :: M95N5RDze = 15998 - INTEGER(IntKi), PARAMETER :: M95N6RDze = 15999 - INTEGER(IntKi), PARAMETER :: M95N7RDze = 16000 - INTEGER(IntKi), PARAMETER :: M95N8RDze = 16001 - INTEGER(IntKi), PARAMETER :: M95N9RDze = 16002 - INTEGER(IntKi), PARAMETER :: M96N1RDze = 16003 - INTEGER(IntKi), PARAMETER :: M96N2RDze = 16004 - INTEGER(IntKi), PARAMETER :: M96N3RDze = 16005 - INTEGER(IntKi), PARAMETER :: M96N4RDze = 16006 - INTEGER(IntKi), PARAMETER :: M96N5RDze = 16007 - INTEGER(IntKi), PARAMETER :: M96N6RDze = 16008 - INTEGER(IntKi), PARAMETER :: M96N7RDze = 16009 - INTEGER(IntKi), PARAMETER :: M96N8RDze = 16010 - INTEGER(IntKi), PARAMETER :: M96N9RDze = 16011 - INTEGER(IntKi), PARAMETER :: M97N1RDze = 16012 - INTEGER(IntKi), PARAMETER :: M97N2RDze = 16013 - INTEGER(IntKi), PARAMETER :: M97N3RDze = 16014 - INTEGER(IntKi), PARAMETER :: M97N4RDze = 16015 - INTEGER(IntKi), PARAMETER :: M97N5RDze = 16016 - INTEGER(IntKi), PARAMETER :: M97N6RDze = 16017 - INTEGER(IntKi), PARAMETER :: M97N7RDze = 16018 - INTEGER(IntKi), PARAMETER :: M97N8RDze = 16019 - INTEGER(IntKi), PARAMETER :: M97N9RDze = 16020 - INTEGER(IntKi), PARAMETER :: M98N1RDze = 16021 - INTEGER(IntKi), PARAMETER :: M98N2RDze = 16022 - INTEGER(IntKi), PARAMETER :: M98N3RDze = 16023 - INTEGER(IntKi), PARAMETER :: M98N4RDze = 16024 - INTEGER(IntKi), PARAMETER :: M98N5RDze = 16025 - INTEGER(IntKi), PARAMETER :: M98N6RDze = 16026 - INTEGER(IntKi), PARAMETER :: M98N7RDze = 16027 - INTEGER(IntKi), PARAMETER :: M98N8RDze = 16028 - INTEGER(IntKi), PARAMETER :: M98N9RDze = 16029 - INTEGER(IntKi), PARAMETER :: M99N1RDze = 16030 - INTEGER(IntKi), PARAMETER :: M99N2RDze = 16031 - INTEGER(IntKi), PARAMETER :: M99N3RDze = 16032 - INTEGER(IntKi), PARAMETER :: M99N4RDze = 16033 - INTEGER(IntKi), PARAMETER :: M99N5RDze = 16034 - INTEGER(IntKi), PARAMETER :: M99N6RDze = 16035 - INTEGER(IntKi), PARAMETER :: M99N7RDze = 16036 - INTEGER(IntKi), PARAMETER :: M99N8RDze = 16037 - INTEGER(IntKi), PARAMETER :: M99N9RDze = 16038 + ! Interface Motions: + INTEGER(IntKi), PARAMETER :: Intf1TDXss= 21445 + INTEGER(IntKi), PARAMETER :: Intf1TDYss= 21446 + INTEGER(IntKi), PARAMETER :: Intf1TDZss= 21447 + INTEGER(IntKi), PARAMETER :: Intf1RDXss= 21448 + INTEGER(IntKi), PARAMETER :: Intf1RDYss= 21449 + INTEGER(IntKi), PARAMETER :: Intf1RDZss= 21450 + INTEGER(IntKi), PARAMETER :: Intf2TDXss= 21451 + INTEGER(IntKi), PARAMETER :: Intf2TDYss= 21452 + INTEGER(IntKi), PARAMETER :: Intf2TDZss= 21453 + INTEGER(IntKi), PARAMETER :: Intf2RDXss= 21454 + INTEGER(IntKi), PARAMETER :: Intf2RDYss= 21455 + INTEGER(IntKi), PARAMETER :: Intf2RDZss= 21456 + INTEGER(IntKi), PARAMETER :: Intf3TDXss= 21457 + INTEGER(IntKi), PARAMETER :: Intf3TDYss= 21458 + INTEGER(IntKi), PARAMETER :: Intf3TDZss= 21459 + INTEGER(IntKi), PARAMETER :: Intf3RDXss= 21460 + INTEGER(IntKi), PARAMETER :: Intf3RDYss= 21461 + INTEGER(IntKi), PARAMETER :: Intf3RDZss= 21462 + INTEGER(IntKi), PARAMETER :: Intf4TDXss= 21463 + INTEGER(IntKi), PARAMETER :: Intf4TDYss= 21464 + INTEGER(IntKi), PARAMETER :: Intf4TDZss= 21465 + INTEGER(IntKi), PARAMETER :: Intf4RDXss= 21466 + INTEGER(IntKi), PARAMETER :: Intf4RDYss= 21467 + INTEGER(IntKi), PARAMETER :: Intf4RDZss= 21468 + INTEGER(IntKi), PARAMETER :: Intf5TDXss= 21469 + INTEGER(IntKi), PARAMETER :: Intf5TDYss= 21470 + INTEGER(IntKi), PARAMETER :: Intf5TDZss= 21471 + INTEGER(IntKi), PARAMETER :: Intf5RDXss= 21472 + INTEGER(IntKi), PARAMETER :: Intf5RDYss= 21473 + INTEGER(IntKi), PARAMETER :: Intf5RDZss= 21474 + INTEGER(IntKi), PARAMETER :: Intf6TDXss= 21475 + INTEGER(IntKi), PARAMETER :: Intf6TDYss= 21476 + INTEGER(IntKi), PARAMETER :: Intf6TDZss= 21477 + INTEGER(IntKi), PARAMETER :: Intf6RDXss= 21478 + INTEGER(IntKi), PARAMETER :: Intf6RDYss= 21479 + INTEGER(IntKi), PARAMETER :: Intf6RDZss= 21480 + INTEGER(IntKi), PARAMETER :: Intf7TDXss= 21481 + INTEGER(IntKi), PARAMETER :: Intf7TDYss= 21482 + INTEGER(IntKi), PARAMETER :: Intf7TDZss= 21483 + INTEGER(IntKi), PARAMETER :: Intf7RDXss= 21484 + INTEGER(IntKi), PARAMETER :: Intf7RDYss= 21485 + INTEGER(IntKi), PARAMETER :: Intf7RDZss= 21486 + INTEGER(IntKi), PARAMETER :: Intf8TDXss= 21487 + INTEGER(IntKi), PARAMETER :: Intf8TDYss= 21488 + INTEGER(IntKi), PARAMETER :: Intf8TDZss= 21489 + INTEGER(IntKi), PARAMETER :: Intf8RDXss= 21490 + INTEGER(IntKi), PARAMETER :: Intf8RDYss= 21491 + INTEGER(IntKi), PARAMETER :: Intf8RDZss= 21492 + INTEGER(IntKi), PARAMETER :: Intf9TDXss= 21493 + INTEGER(IntKi), PARAMETER :: Intf9TDYss= 21494 + INTEGER(IntKi), PARAMETER :: Intf9TDZss= 21495 + INTEGER(IntKi), PARAMETER :: Intf9RDXss= 21496 + INTEGER(IntKi), PARAMETER :: Intf9RDYss= 21497 + INTEGER(IntKi), PARAMETER :: Intf9RDZss= 21498 - ! Accelerations: + ! Interface Accelerations: - INTEGER(IntKi), PARAMETER :: M01N1TAxe = 16039 - INTEGER(IntKi), PARAMETER :: M01N2TAxe = 16040 - INTEGER(IntKi), PARAMETER :: M01N3TAxe = 16041 - INTEGER(IntKi), PARAMETER :: M01N4TAxe = 16042 - INTEGER(IntKi), PARAMETER :: M01N5TAxe = 16043 - INTEGER(IntKi), PARAMETER :: M01N6TAxe = 16044 - INTEGER(IntKi), PARAMETER :: M01N7TAxe = 16045 - INTEGER(IntKi), PARAMETER :: M01N8TAxe = 16046 - INTEGER(IntKi), PARAMETER :: M01N9TAxe = 16047 - INTEGER(IntKi), PARAMETER :: M02N1TAxe = 16048 - INTEGER(IntKi), PARAMETER :: M02N2TAxe = 16049 - INTEGER(IntKi), PARAMETER :: M02N3TAxe = 16050 - INTEGER(IntKi), PARAMETER :: M02N4TAxe = 16051 - INTEGER(IntKi), PARAMETER :: M02N5TAxe = 16052 - INTEGER(IntKi), PARAMETER :: M02N6TAxe = 16053 - INTEGER(IntKi), PARAMETER :: M02N7TAxe = 16054 - INTEGER(IntKi), PARAMETER :: M02N8TAxe = 16055 - INTEGER(IntKi), PARAMETER :: M02N9TAxe = 16056 - INTEGER(IntKi), PARAMETER :: M03N1TAxe = 16057 - INTEGER(IntKi), PARAMETER :: M03N2TAxe = 16058 - INTEGER(IntKi), PARAMETER :: M03N3TAxe = 16059 - INTEGER(IntKi), PARAMETER :: M03N4TAxe = 16060 - INTEGER(IntKi), PARAMETER :: M03N5TAxe = 16061 - INTEGER(IntKi), PARAMETER :: M03N6TAxe = 16062 - INTEGER(IntKi), PARAMETER :: M03N7TAxe = 16063 - INTEGER(IntKi), PARAMETER :: M03N8TAxe = 16064 - INTEGER(IntKi), PARAMETER :: M03N9TAxe = 16065 - INTEGER(IntKi), PARAMETER :: M04N1TAxe = 16066 - INTEGER(IntKi), PARAMETER :: M04N2TAxe = 16067 - INTEGER(IntKi), PARAMETER :: M04N3TAxe = 16068 - INTEGER(IntKi), PARAMETER :: M04N4TAxe = 16069 - INTEGER(IntKi), PARAMETER :: M04N5TAxe = 16070 - INTEGER(IntKi), PARAMETER :: M04N6TAxe = 16071 - INTEGER(IntKi), PARAMETER :: M04N7TAxe = 16072 - INTEGER(IntKi), PARAMETER :: M04N8TAxe = 16073 - INTEGER(IntKi), PARAMETER :: M04N9TAxe = 16074 - INTEGER(IntKi), PARAMETER :: M05N1TAxe = 16075 - INTEGER(IntKi), PARAMETER :: M05N2TAxe = 16076 - INTEGER(IntKi), PARAMETER :: M05N3TAxe = 16077 - INTEGER(IntKi), PARAMETER :: M05N4TAxe = 16078 - INTEGER(IntKi), PARAMETER :: M05N5TAxe = 16079 - INTEGER(IntKi), PARAMETER :: M05N6TAxe = 16080 - INTEGER(IntKi), PARAMETER :: M05N7TAxe = 16081 - INTEGER(IntKi), PARAMETER :: M05N8TAxe = 16082 - INTEGER(IntKi), PARAMETER :: M05N9TAxe = 16083 - INTEGER(IntKi), PARAMETER :: M06N1TAxe = 16084 - INTEGER(IntKi), PARAMETER :: M06N2TAxe = 16085 - INTEGER(IntKi), PARAMETER :: M06N3TAxe = 16086 - INTEGER(IntKi), PARAMETER :: M06N4TAxe = 16087 - INTEGER(IntKi), PARAMETER :: M06N5TAxe = 16088 - INTEGER(IntKi), PARAMETER :: M06N6TAxe = 16089 - INTEGER(IntKi), PARAMETER :: M06N7TAxe = 16090 - INTEGER(IntKi), PARAMETER :: M06N8TAxe = 16091 - INTEGER(IntKi), PARAMETER :: M06N9TAxe = 16092 - INTEGER(IntKi), PARAMETER :: M07N1TAxe = 16093 - INTEGER(IntKi), PARAMETER :: M07N2TAxe = 16094 - INTEGER(IntKi), PARAMETER :: M07N3TAxe = 16095 - INTEGER(IntKi), PARAMETER :: M07N4TAxe = 16096 - INTEGER(IntKi), PARAMETER :: M07N5TAxe = 16097 - INTEGER(IntKi), PARAMETER :: M07N6TAxe = 16098 - INTEGER(IntKi), PARAMETER :: M07N7TAxe = 16099 - INTEGER(IntKi), PARAMETER :: M07N8TAxe = 16100 - INTEGER(IntKi), PARAMETER :: M07N9TAxe = 16101 - INTEGER(IntKi), PARAMETER :: M08N1TAxe = 16102 - INTEGER(IntKi), PARAMETER :: M08N2TAxe = 16103 - INTEGER(IntKi), PARAMETER :: M08N3TAxe = 16104 - INTEGER(IntKi), PARAMETER :: M08N4TAxe = 16105 - INTEGER(IntKi), PARAMETER :: M08N5TAxe = 16106 - INTEGER(IntKi), PARAMETER :: M08N6TAxe = 16107 - INTEGER(IntKi), PARAMETER :: M08N7TAxe = 16108 - INTEGER(IntKi), PARAMETER :: M08N8TAxe = 16109 - INTEGER(IntKi), PARAMETER :: M08N9TAxe = 16110 - INTEGER(IntKi), PARAMETER :: M09N1TAxe = 16111 - INTEGER(IntKi), PARAMETER :: M09N2TAxe = 16112 - INTEGER(IntKi), PARAMETER :: M09N3TAxe = 16113 - INTEGER(IntKi), PARAMETER :: M09N4TAxe = 16114 - INTEGER(IntKi), PARAMETER :: M09N5TAxe = 16115 - INTEGER(IntKi), PARAMETER :: M09N6TAxe = 16116 - INTEGER(IntKi), PARAMETER :: M09N7TAxe = 16117 - INTEGER(IntKi), PARAMETER :: M09N8TAxe = 16118 - INTEGER(IntKi), PARAMETER :: M09N9TAxe = 16119 - INTEGER(IntKi), PARAMETER :: M10N1TAxe = 16120 - INTEGER(IntKi), PARAMETER :: M10N2TAxe = 16121 - INTEGER(IntKi), PARAMETER :: M10N3TAxe = 16122 - INTEGER(IntKi), PARAMETER :: M10N4TAxe = 16123 - INTEGER(IntKi), PARAMETER :: M10N5TAxe = 16124 - INTEGER(IntKi), PARAMETER :: M10N6TAxe = 16125 - INTEGER(IntKi), PARAMETER :: M10N7TAxe = 16126 - INTEGER(IntKi), PARAMETER :: M10N8TAxe = 16127 - INTEGER(IntKi), PARAMETER :: M10N9TAxe = 16128 - INTEGER(IntKi), PARAMETER :: M11N1TAxe = 16129 - INTEGER(IntKi), PARAMETER :: M11N2TAxe = 16130 - INTEGER(IntKi), PARAMETER :: M11N3TAxe = 16131 - INTEGER(IntKi), PARAMETER :: M11N4TAxe = 16132 - INTEGER(IntKi), PARAMETER :: M11N5TAxe = 16133 - INTEGER(IntKi), PARAMETER :: M11N6TAxe = 16134 - INTEGER(IntKi), PARAMETER :: M11N7TAxe = 16135 - INTEGER(IntKi), PARAMETER :: M11N8TAxe = 16136 - INTEGER(IntKi), PARAMETER :: M11N9TAxe = 16137 - INTEGER(IntKi), PARAMETER :: M12N1TAxe = 16138 - INTEGER(IntKi), PARAMETER :: M12N2TAxe = 16139 - INTEGER(IntKi), PARAMETER :: M12N3TAxe = 16140 - INTEGER(IntKi), PARAMETER :: M12N4TAxe = 16141 - INTEGER(IntKi), PARAMETER :: M12N5TAxe = 16142 - INTEGER(IntKi), PARAMETER :: M12N6TAxe = 16143 - INTEGER(IntKi), PARAMETER :: M12N7TAxe = 16144 - INTEGER(IntKi), PARAMETER :: M12N8TAxe = 16145 - INTEGER(IntKi), PARAMETER :: M12N9TAxe = 16146 - INTEGER(IntKi), PARAMETER :: M13N1TAxe = 16147 - INTEGER(IntKi), PARAMETER :: M13N2TAxe = 16148 - INTEGER(IntKi), PARAMETER :: M13N3TAxe = 16149 - INTEGER(IntKi), PARAMETER :: M13N4TAxe = 16150 - INTEGER(IntKi), PARAMETER :: M13N5TAxe = 16151 - INTEGER(IntKi), PARAMETER :: M13N6TAxe = 16152 - INTEGER(IntKi), PARAMETER :: M13N7TAxe = 16153 - INTEGER(IntKi), PARAMETER :: M13N8TAxe = 16154 - INTEGER(IntKi), PARAMETER :: M13N9TAxe = 16155 - INTEGER(IntKi), PARAMETER :: M14N1TAxe = 16156 - INTEGER(IntKi), PARAMETER :: M14N2TAxe = 16157 - INTEGER(IntKi), PARAMETER :: M14N3TAxe = 16158 - INTEGER(IntKi), PARAMETER :: M14N4TAxe = 16159 - INTEGER(IntKi), PARAMETER :: M14N5TAxe = 16160 - INTEGER(IntKi), PARAMETER :: M14N6TAxe = 16161 - INTEGER(IntKi), PARAMETER :: M14N7TAxe = 16162 - INTEGER(IntKi), PARAMETER :: M14N8TAxe = 16163 - INTEGER(IntKi), PARAMETER :: M14N9TAxe = 16164 - INTEGER(IntKi), PARAMETER :: M15N1TAxe = 16165 - INTEGER(IntKi), PARAMETER :: M15N2TAxe = 16166 - INTEGER(IntKi), PARAMETER :: M15N3TAxe = 16167 - INTEGER(IntKi), PARAMETER :: M15N4TAxe = 16168 - INTEGER(IntKi), PARAMETER :: M15N5TAxe = 16169 - INTEGER(IntKi), PARAMETER :: M15N6TAxe = 16170 - INTEGER(IntKi), PARAMETER :: M15N7TAxe = 16171 - INTEGER(IntKi), PARAMETER :: M15N8TAxe = 16172 - INTEGER(IntKi), PARAMETER :: M15N9TAxe = 16173 - INTEGER(IntKi), PARAMETER :: M16N1TAxe = 16174 - INTEGER(IntKi), PARAMETER :: M16N2TAxe = 16175 - INTEGER(IntKi), PARAMETER :: M16N3TAxe = 16176 - INTEGER(IntKi), PARAMETER :: M16N4TAxe = 16177 - INTEGER(IntKi), PARAMETER :: M16N5TAxe = 16178 - INTEGER(IntKi), PARAMETER :: M16N6TAxe = 16179 - INTEGER(IntKi), PARAMETER :: M16N7TAxe = 16180 - INTEGER(IntKi), PARAMETER :: M16N8TAxe = 16181 - INTEGER(IntKi), PARAMETER :: M16N9TAxe = 16182 - INTEGER(IntKi), PARAMETER :: M17N1TAxe = 16183 - INTEGER(IntKi), PARAMETER :: M17N2TAxe = 16184 - INTEGER(IntKi), PARAMETER :: M17N3TAxe = 16185 - INTEGER(IntKi), PARAMETER :: M17N4TAxe = 16186 - INTEGER(IntKi), PARAMETER :: M17N5TAxe = 16187 - INTEGER(IntKi), PARAMETER :: M17N6TAxe = 16188 - INTEGER(IntKi), PARAMETER :: M17N7TAxe = 16189 - INTEGER(IntKi), PARAMETER :: M17N8TAxe = 16190 - INTEGER(IntKi), PARAMETER :: M17N9TAxe = 16191 - INTEGER(IntKi), PARAMETER :: M18N1TAxe = 16192 - INTEGER(IntKi), PARAMETER :: M18N2TAxe = 16193 - INTEGER(IntKi), PARAMETER :: M18N3TAxe = 16194 - INTEGER(IntKi), PARAMETER :: M18N4TAxe = 16195 - INTEGER(IntKi), PARAMETER :: M18N5TAxe = 16196 - INTEGER(IntKi), PARAMETER :: M18N6TAxe = 16197 - INTEGER(IntKi), PARAMETER :: M18N7TAxe = 16198 - INTEGER(IntKi), PARAMETER :: M18N8TAxe = 16199 - INTEGER(IntKi), PARAMETER :: M18N9TAxe = 16200 - INTEGER(IntKi), PARAMETER :: M19N1TAxe = 16201 - INTEGER(IntKi), PARAMETER :: M19N2TAxe = 16202 - INTEGER(IntKi), PARAMETER :: M19N3TAxe = 16203 - INTEGER(IntKi), PARAMETER :: M19N4TAxe = 16204 - INTEGER(IntKi), PARAMETER :: M19N5TAxe = 16205 - INTEGER(IntKi), PARAMETER :: M19N6TAxe = 16206 - INTEGER(IntKi), PARAMETER :: M19N7TAxe = 16207 - INTEGER(IntKi), PARAMETER :: M19N8TAxe = 16208 - INTEGER(IntKi), PARAMETER :: M19N9TAxe = 16209 - INTEGER(IntKi), PARAMETER :: M20N1TAxe = 16210 - INTEGER(IntKi), PARAMETER :: M20N2TAxe = 16211 - INTEGER(IntKi), PARAMETER :: M20N3TAxe = 16212 - INTEGER(IntKi), PARAMETER :: M20N4TAxe = 16213 - INTEGER(IntKi), PARAMETER :: M20N5TAxe = 16214 - INTEGER(IntKi), PARAMETER :: M20N6TAxe = 16215 - INTEGER(IntKi), PARAMETER :: M20N7TAxe = 16216 - INTEGER(IntKi), PARAMETER :: M20N8TAxe = 16217 - INTEGER(IntKi), PARAMETER :: M20N9TAxe = 16218 - INTEGER(IntKi), PARAMETER :: M21N1TAxe = 16219 - INTEGER(IntKi), PARAMETER :: M21N2TAxe = 16220 - INTEGER(IntKi), PARAMETER :: M21N3TAxe = 16221 - INTEGER(IntKi), PARAMETER :: M21N4TAxe = 16222 - INTEGER(IntKi), PARAMETER :: M21N5TAxe = 16223 - INTEGER(IntKi), PARAMETER :: M21N6TAxe = 16224 - INTEGER(IntKi), PARAMETER :: M21N7TAxe = 16225 - INTEGER(IntKi), PARAMETER :: M21N8TAxe = 16226 - INTEGER(IntKi), PARAMETER :: M21N9TAxe = 16227 - INTEGER(IntKi), PARAMETER :: M22N1TAxe = 16228 - INTEGER(IntKi), PARAMETER :: M22N2TAxe = 16229 - INTEGER(IntKi), PARAMETER :: M22N3TAxe = 16230 - INTEGER(IntKi), PARAMETER :: M22N4TAxe = 16231 - INTEGER(IntKi), PARAMETER :: M22N5TAxe = 16232 - INTEGER(IntKi), PARAMETER :: M22N6TAxe = 16233 - INTEGER(IntKi), PARAMETER :: M22N7TAxe = 16234 - INTEGER(IntKi), PARAMETER :: M22N8TAxe = 16235 - INTEGER(IntKi), PARAMETER :: M22N9TAxe = 16236 - INTEGER(IntKi), PARAMETER :: M23N1TAxe = 16237 - INTEGER(IntKi), PARAMETER :: M23N2TAxe = 16238 - INTEGER(IntKi), PARAMETER :: M23N3TAxe = 16239 - INTEGER(IntKi), PARAMETER :: M23N4TAxe = 16240 - INTEGER(IntKi), PARAMETER :: M23N5TAxe = 16241 - INTEGER(IntKi), PARAMETER :: M23N6TAxe = 16242 - INTEGER(IntKi), PARAMETER :: M23N7TAxe = 16243 - INTEGER(IntKi), PARAMETER :: M23N8TAxe = 16244 - INTEGER(IntKi), PARAMETER :: M23N9TAxe = 16245 - INTEGER(IntKi), PARAMETER :: M24N1TAxe = 16246 - INTEGER(IntKi), PARAMETER :: M24N2TAxe = 16247 - INTEGER(IntKi), PARAMETER :: M24N3TAxe = 16248 - INTEGER(IntKi), PARAMETER :: M24N4TAxe = 16249 - INTEGER(IntKi), PARAMETER :: M24N5TAxe = 16250 - INTEGER(IntKi), PARAMETER :: M24N6TAxe = 16251 - INTEGER(IntKi), PARAMETER :: M24N7TAxe = 16252 - INTEGER(IntKi), PARAMETER :: M24N8TAxe = 16253 - INTEGER(IntKi), PARAMETER :: M24N9TAxe = 16254 - INTEGER(IntKi), PARAMETER :: M25N1TAxe = 16255 - INTEGER(IntKi), PARAMETER :: M25N2TAxe = 16256 - INTEGER(IntKi), PARAMETER :: M25N3TAxe = 16257 - INTEGER(IntKi), PARAMETER :: M25N4TAxe = 16258 - INTEGER(IntKi), PARAMETER :: M25N5TAxe = 16259 - INTEGER(IntKi), PARAMETER :: M25N6TAxe = 16260 - INTEGER(IntKi), PARAMETER :: M25N7TAxe = 16261 - INTEGER(IntKi), PARAMETER :: M25N8TAxe = 16262 - INTEGER(IntKi), PARAMETER :: M25N9TAxe = 16263 - INTEGER(IntKi), PARAMETER :: M26N1TAxe = 16264 - INTEGER(IntKi), PARAMETER :: M26N2TAxe = 16265 - INTEGER(IntKi), PARAMETER :: M26N3TAxe = 16266 - INTEGER(IntKi), PARAMETER :: M26N4TAxe = 16267 - INTEGER(IntKi), PARAMETER :: M26N5TAxe = 16268 - INTEGER(IntKi), PARAMETER :: M26N6TAxe = 16269 - INTEGER(IntKi), PARAMETER :: M26N7TAxe = 16270 - INTEGER(IntKi), PARAMETER :: M26N8TAxe = 16271 - INTEGER(IntKi), PARAMETER :: M26N9TAxe = 16272 - INTEGER(IntKi), PARAMETER :: M27N1TAxe = 16273 - INTEGER(IntKi), PARAMETER :: M27N2TAxe = 16274 - INTEGER(IntKi), PARAMETER :: M27N3TAxe = 16275 - INTEGER(IntKi), PARAMETER :: M27N4TAxe = 16276 - INTEGER(IntKi), PARAMETER :: M27N5TAxe = 16277 - INTEGER(IntKi), PARAMETER :: M27N6TAxe = 16278 - INTEGER(IntKi), PARAMETER :: M27N7TAxe = 16279 - INTEGER(IntKi), PARAMETER :: M27N8TAxe = 16280 - INTEGER(IntKi), PARAMETER :: M27N9TAxe = 16281 - INTEGER(IntKi), PARAMETER :: M28N1TAxe = 16282 - INTEGER(IntKi), PARAMETER :: M28N2TAxe = 16283 - INTEGER(IntKi), PARAMETER :: M28N3TAxe = 16284 - INTEGER(IntKi), PARAMETER :: M28N4TAxe = 16285 - INTEGER(IntKi), PARAMETER :: M28N5TAxe = 16286 - INTEGER(IntKi), PARAMETER :: M28N6TAxe = 16287 - INTEGER(IntKi), PARAMETER :: M28N7TAxe = 16288 - INTEGER(IntKi), PARAMETER :: M28N8TAxe = 16289 - INTEGER(IntKi), PARAMETER :: M28N9TAxe = 16290 - INTEGER(IntKi), PARAMETER :: M29N1TAxe = 16291 - INTEGER(IntKi), PARAMETER :: M29N2TAxe = 16292 - INTEGER(IntKi), PARAMETER :: M29N3TAxe = 16293 - INTEGER(IntKi), PARAMETER :: M29N4TAxe = 16294 - INTEGER(IntKi), PARAMETER :: M29N5TAxe = 16295 - INTEGER(IntKi), PARAMETER :: M29N6TAxe = 16296 - INTEGER(IntKi), PARAMETER :: M29N7TAxe = 16297 - INTEGER(IntKi), PARAMETER :: M29N8TAxe = 16298 - INTEGER(IntKi), PARAMETER :: M29N9TAxe = 16299 - INTEGER(IntKi), PARAMETER :: M30N1TAxe = 16300 - INTEGER(IntKi), PARAMETER :: M30N2TAxe = 16301 - INTEGER(IntKi), PARAMETER :: M30N3TAxe = 16302 - INTEGER(IntKi), PARAMETER :: M30N4TAxe = 16303 - INTEGER(IntKi), PARAMETER :: M30N5TAxe = 16304 - INTEGER(IntKi), PARAMETER :: M30N6TAxe = 16305 - INTEGER(IntKi), PARAMETER :: M30N7TAxe = 16306 - INTEGER(IntKi), PARAMETER :: M30N8TAxe = 16307 - INTEGER(IntKi), PARAMETER :: M30N9TAxe = 16308 - INTEGER(IntKi), PARAMETER :: M31N1TAxe = 16309 - INTEGER(IntKi), PARAMETER :: M31N2TAxe = 16310 - INTEGER(IntKi), PARAMETER :: M31N3TAxe = 16311 - INTEGER(IntKi), PARAMETER :: M31N4TAxe = 16312 - INTEGER(IntKi), PARAMETER :: M31N5TAxe = 16313 - INTEGER(IntKi), PARAMETER :: M31N6TAxe = 16314 - INTEGER(IntKi), PARAMETER :: M31N7TAxe = 16315 - INTEGER(IntKi), PARAMETER :: M31N8TAxe = 16316 - INTEGER(IntKi), PARAMETER :: M31N9TAxe = 16317 - INTEGER(IntKi), PARAMETER :: M32N1TAxe = 16318 - INTEGER(IntKi), PARAMETER :: M32N2TAxe = 16319 - INTEGER(IntKi), PARAMETER :: M32N3TAxe = 16320 - INTEGER(IntKi), PARAMETER :: M32N4TAxe = 16321 - INTEGER(IntKi), PARAMETER :: M32N5TAxe = 16322 - INTEGER(IntKi), PARAMETER :: M32N6TAxe = 16323 - INTEGER(IntKi), PARAMETER :: M32N7TAxe = 16324 - INTEGER(IntKi), PARAMETER :: M32N8TAxe = 16325 - INTEGER(IntKi), PARAMETER :: M32N9TAxe = 16326 - INTEGER(IntKi), PARAMETER :: M33N1TAxe = 16327 - INTEGER(IntKi), PARAMETER :: M33N2TAxe = 16328 - INTEGER(IntKi), PARAMETER :: M33N3TAxe = 16329 - INTEGER(IntKi), PARAMETER :: M33N4TAxe = 16330 - INTEGER(IntKi), PARAMETER :: M33N5TAxe = 16331 - INTEGER(IntKi), PARAMETER :: M33N6TAxe = 16332 - INTEGER(IntKi), PARAMETER :: M33N7TAxe = 16333 - INTEGER(IntKi), PARAMETER :: M33N8TAxe = 16334 - INTEGER(IntKi), PARAMETER :: M33N9TAxe = 16335 - INTEGER(IntKi), PARAMETER :: M34N1TAxe = 16336 - INTEGER(IntKi), PARAMETER :: M34N2TAxe = 16337 - INTEGER(IntKi), PARAMETER :: M34N3TAxe = 16338 - INTEGER(IntKi), PARAMETER :: M34N4TAxe = 16339 - INTEGER(IntKi), PARAMETER :: M34N5TAxe = 16340 - INTEGER(IntKi), PARAMETER :: M34N6TAxe = 16341 - INTEGER(IntKi), PARAMETER :: M34N7TAxe = 16342 - INTEGER(IntKi), PARAMETER :: M34N8TAxe = 16343 - INTEGER(IntKi), PARAMETER :: M34N9TAxe = 16344 - INTEGER(IntKi), PARAMETER :: M35N1TAxe = 16345 - INTEGER(IntKi), PARAMETER :: M35N2TAxe = 16346 - INTEGER(IntKi), PARAMETER :: M35N3TAxe = 16347 - INTEGER(IntKi), PARAMETER :: M35N4TAxe = 16348 - INTEGER(IntKi), PARAMETER :: M35N5TAxe = 16349 - INTEGER(IntKi), PARAMETER :: M35N6TAxe = 16350 - INTEGER(IntKi), PARAMETER :: M35N7TAxe = 16351 - INTEGER(IntKi), PARAMETER :: M35N8TAxe = 16352 - INTEGER(IntKi), PARAMETER :: M35N9TAxe = 16353 - INTEGER(IntKi), PARAMETER :: M36N1TAxe = 16354 - INTEGER(IntKi), PARAMETER :: M36N2TAxe = 16355 - INTEGER(IntKi), PARAMETER :: M36N3TAxe = 16356 - INTEGER(IntKi), PARAMETER :: M36N4TAxe = 16357 - INTEGER(IntKi), PARAMETER :: M36N5TAxe = 16358 - INTEGER(IntKi), PARAMETER :: M36N6TAxe = 16359 - INTEGER(IntKi), PARAMETER :: M36N7TAxe = 16360 - INTEGER(IntKi), PARAMETER :: M36N8TAxe = 16361 - INTEGER(IntKi), PARAMETER :: M36N9TAxe = 16362 - INTEGER(IntKi), PARAMETER :: M37N1TAxe = 16363 - INTEGER(IntKi), PARAMETER :: M37N2TAxe = 16364 - INTEGER(IntKi), PARAMETER :: M37N3TAxe = 16365 - INTEGER(IntKi), PARAMETER :: M37N4TAxe = 16366 - INTEGER(IntKi), PARAMETER :: M37N5TAxe = 16367 - INTEGER(IntKi), PARAMETER :: M37N6TAxe = 16368 - INTEGER(IntKi), PARAMETER :: M37N7TAxe = 16369 - INTEGER(IntKi), PARAMETER :: M37N8TAxe = 16370 - INTEGER(IntKi), PARAMETER :: M37N9TAxe = 16371 - INTEGER(IntKi), PARAMETER :: M38N1TAxe = 16372 - INTEGER(IntKi), PARAMETER :: M38N2TAxe = 16373 - INTEGER(IntKi), PARAMETER :: M38N3TAxe = 16374 - INTEGER(IntKi), PARAMETER :: M38N4TAxe = 16375 - INTEGER(IntKi), PARAMETER :: M38N5TAxe = 16376 - INTEGER(IntKi), PARAMETER :: M38N6TAxe = 16377 - INTEGER(IntKi), PARAMETER :: M38N7TAxe = 16378 - INTEGER(IntKi), PARAMETER :: M38N8TAxe = 16379 - INTEGER(IntKi), PARAMETER :: M38N9TAxe = 16380 - INTEGER(IntKi), PARAMETER :: M39N1TAxe = 16381 - INTEGER(IntKi), PARAMETER :: M39N2TAxe = 16382 - INTEGER(IntKi), PARAMETER :: M39N3TAxe = 16383 - INTEGER(IntKi), PARAMETER :: M39N4TAxe = 16384 - INTEGER(IntKi), PARAMETER :: M39N5TAxe = 16385 - INTEGER(IntKi), PARAMETER :: M39N6TAxe = 16386 - INTEGER(IntKi), PARAMETER :: M39N7TAxe = 16387 - INTEGER(IntKi), PARAMETER :: M39N8TAxe = 16388 - INTEGER(IntKi), PARAMETER :: M39N9TAxe = 16389 - INTEGER(IntKi), PARAMETER :: M40N1TAxe = 16390 - INTEGER(IntKi), PARAMETER :: M40N2TAxe = 16391 - INTEGER(IntKi), PARAMETER :: M40N3TAxe = 16392 - INTEGER(IntKi), PARAMETER :: M40N4TAxe = 16393 - INTEGER(IntKi), PARAMETER :: M40N5TAxe = 16394 - INTEGER(IntKi), PARAMETER :: M40N6TAxe = 16395 - INTEGER(IntKi), PARAMETER :: M40N7TAxe = 16396 - INTEGER(IntKi), PARAMETER :: M40N8TAxe = 16397 - INTEGER(IntKi), PARAMETER :: M40N9TAxe = 16398 - INTEGER(IntKi), PARAMETER :: M41N1TAxe = 16399 - INTEGER(IntKi), PARAMETER :: M41N2TAxe = 16400 - INTEGER(IntKi), PARAMETER :: M41N3TAxe = 16401 - INTEGER(IntKi), PARAMETER :: M41N4TAxe = 16402 - INTEGER(IntKi), PARAMETER :: M41N5TAxe = 16403 - INTEGER(IntKi), PARAMETER :: M41N6TAxe = 16404 - INTEGER(IntKi), PARAMETER :: M41N7TAxe = 16405 - INTEGER(IntKi), PARAMETER :: M41N8TAxe = 16406 - INTEGER(IntKi), PARAMETER :: M41N9TAxe = 16407 - INTEGER(IntKi), PARAMETER :: M42N1TAxe = 16408 - INTEGER(IntKi), PARAMETER :: M42N2TAxe = 16409 - INTEGER(IntKi), PARAMETER :: M42N3TAxe = 16410 - INTEGER(IntKi), PARAMETER :: M42N4TAxe = 16411 - INTEGER(IntKi), PARAMETER :: M42N5TAxe = 16412 - INTEGER(IntKi), PARAMETER :: M42N6TAxe = 16413 - INTEGER(IntKi), PARAMETER :: M42N7TAxe = 16414 - INTEGER(IntKi), PARAMETER :: M42N8TAxe = 16415 - INTEGER(IntKi), PARAMETER :: M42N9TAxe = 16416 - INTEGER(IntKi), PARAMETER :: M43N1TAxe = 16417 - INTEGER(IntKi), PARAMETER :: M43N2TAxe = 16418 - INTEGER(IntKi), PARAMETER :: M43N3TAxe = 16419 - INTEGER(IntKi), PARAMETER :: M43N4TAxe = 16420 - INTEGER(IntKi), PARAMETER :: M43N5TAxe = 16421 - INTEGER(IntKi), PARAMETER :: M43N6TAxe = 16422 - INTEGER(IntKi), PARAMETER :: M43N7TAxe = 16423 - INTEGER(IntKi), PARAMETER :: M43N8TAxe = 16424 - INTEGER(IntKi), PARAMETER :: M43N9TAxe = 16425 - INTEGER(IntKi), PARAMETER :: M44N1TAxe = 16426 - INTEGER(IntKi), PARAMETER :: M44N2TAxe = 16427 - INTEGER(IntKi), PARAMETER :: M44N3TAxe = 16428 - INTEGER(IntKi), PARAMETER :: M44N4TAxe = 16429 - INTEGER(IntKi), PARAMETER :: M44N5TAxe = 16430 - INTEGER(IntKi), PARAMETER :: M44N6TAxe = 16431 - INTEGER(IntKi), PARAMETER :: M44N7TAxe = 16432 - INTEGER(IntKi), PARAMETER :: M44N8TAxe = 16433 - INTEGER(IntKi), PARAMETER :: M44N9TAxe = 16434 - INTEGER(IntKi), PARAMETER :: M45N1TAxe = 16435 - INTEGER(IntKi), PARAMETER :: M45N2TAxe = 16436 - INTEGER(IntKi), PARAMETER :: M45N3TAxe = 16437 - INTEGER(IntKi), PARAMETER :: M45N4TAxe = 16438 - INTEGER(IntKi), PARAMETER :: M45N5TAxe = 16439 - INTEGER(IntKi), PARAMETER :: M45N6TAxe = 16440 - INTEGER(IntKi), PARAMETER :: M45N7TAxe = 16441 - INTEGER(IntKi), PARAMETER :: M45N8TAxe = 16442 - INTEGER(IntKi), PARAMETER :: M45N9TAxe = 16443 - INTEGER(IntKi), PARAMETER :: M46N1TAxe = 16444 - INTEGER(IntKi), PARAMETER :: M46N2TAxe = 16445 - INTEGER(IntKi), PARAMETER :: M46N3TAxe = 16446 - INTEGER(IntKi), PARAMETER :: M46N4TAxe = 16447 - INTEGER(IntKi), PARAMETER :: M46N5TAxe = 16448 - INTEGER(IntKi), PARAMETER :: M46N6TAxe = 16449 - INTEGER(IntKi), PARAMETER :: M46N7TAxe = 16450 - INTEGER(IntKi), PARAMETER :: M46N8TAxe = 16451 - INTEGER(IntKi), PARAMETER :: M46N9TAxe = 16452 - INTEGER(IntKi), PARAMETER :: M47N1TAxe = 16453 - INTEGER(IntKi), PARAMETER :: M47N2TAxe = 16454 - INTEGER(IntKi), PARAMETER :: M47N3TAxe = 16455 - INTEGER(IntKi), PARAMETER :: M47N4TAxe = 16456 - INTEGER(IntKi), PARAMETER :: M47N5TAxe = 16457 - INTEGER(IntKi), PARAMETER :: M47N6TAxe = 16458 - INTEGER(IntKi), PARAMETER :: M47N7TAxe = 16459 - INTEGER(IntKi), PARAMETER :: M47N8TAxe = 16460 - INTEGER(IntKi), PARAMETER :: M47N9TAxe = 16461 - INTEGER(IntKi), PARAMETER :: M48N1TAxe = 16462 - INTEGER(IntKi), PARAMETER :: M48N2TAxe = 16463 - INTEGER(IntKi), PARAMETER :: M48N3TAxe = 16464 - INTEGER(IntKi), PARAMETER :: M48N4TAxe = 16465 - INTEGER(IntKi), PARAMETER :: M48N5TAxe = 16466 - INTEGER(IntKi), PARAMETER :: M48N6TAxe = 16467 - INTEGER(IntKi), PARAMETER :: M48N7TAxe = 16468 - INTEGER(IntKi), PARAMETER :: M48N8TAxe = 16469 - INTEGER(IntKi), PARAMETER :: M48N9TAxe = 16470 - INTEGER(IntKi), PARAMETER :: M49N1TAxe = 16471 - INTEGER(IntKi), PARAMETER :: M49N2TAxe = 16472 - INTEGER(IntKi), PARAMETER :: M49N3TAxe = 16473 - INTEGER(IntKi), PARAMETER :: M49N4TAxe = 16474 - INTEGER(IntKi), PARAMETER :: M49N5TAxe = 16475 - INTEGER(IntKi), PARAMETER :: M49N6TAxe = 16476 - INTEGER(IntKi), PARAMETER :: M49N7TAxe = 16477 - INTEGER(IntKi), PARAMETER :: M49N8TAxe = 16478 - INTEGER(IntKi), PARAMETER :: M49N9TAxe = 16479 - INTEGER(IntKi), PARAMETER :: M50N1TAxe = 16480 - INTEGER(IntKi), PARAMETER :: M50N2TAxe = 16481 - INTEGER(IntKi), PARAMETER :: M50N3TAxe = 16482 - INTEGER(IntKi), PARAMETER :: M50N4TAxe = 16483 - INTEGER(IntKi), PARAMETER :: M50N5TAxe = 16484 - INTEGER(IntKi), PARAMETER :: M50N6TAxe = 16485 - INTEGER(IntKi), PARAMETER :: M50N7TAxe = 16486 - INTEGER(IntKi), PARAMETER :: M50N8TAxe = 16487 - INTEGER(IntKi), PARAMETER :: M50N9TAxe = 16488 - INTEGER(IntKi), PARAMETER :: M51N1TAxe = 16489 - INTEGER(IntKi), PARAMETER :: M51N2TAxe = 16490 - INTEGER(IntKi), PARAMETER :: M51N3TAxe = 16491 - INTEGER(IntKi), PARAMETER :: M51N4TAxe = 16492 - INTEGER(IntKi), PARAMETER :: M51N5TAxe = 16493 - INTEGER(IntKi), PARAMETER :: M51N6TAxe = 16494 - INTEGER(IntKi), PARAMETER :: M51N7TAxe = 16495 - INTEGER(IntKi), PARAMETER :: M51N8TAxe = 16496 - INTEGER(IntKi), PARAMETER :: M51N9TAxe = 16497 - INTEGER(IntKi), PARAMETER :: M52N1TAxe = 16498 - INTEGER(IntKi), PARAMETER :: M52N2TAxe = 16499 - INTEGER(IntKi), PARAMETER :: M52N3TAxe = 16500 - INTEGER(IntKi), PARAMETER :: M52N4TAxe = 16501 - INTEGER(IntKi), PARAMETER :: M52N5TAxe = 16502 - INTEGER(IntKi), PARAMETER :: M52N6TAxe = 16503 - INTEGER(IntKi), PARAMETER :: M52N7TAxe = 16504 - INTEGER(IntKi), PARAMETER :: M52N8TAxe = 16505 - INTEGER(IntKi), PARAMETER :: M52N9TAxe = 16506 - INTEGER(IntKi), PARAMETER :: M53N1TAxe = 16507 - INTEGER(IntKi), PARAMETER :: M53N2TAxe = 16508 - INTEGER(IntKi), PARAMETER :: M53N3TAxe = 16509 - INTEGER(IntKi), PARAMETER :: M53N4TAxe = 16510 - INTEGER(IntKi), PARAMETER :: M53N5TAxe = 16511 - INTEGER(IntKi), PARAMETER :: M53N6TAxe = 16512 - INTEGER(IntKi), PARAMETER :: M53N7TAxe = 16513 - INTEGER(IntKi), PARAMETER :: M53N8TAxe = 16514 - INTEGER(IntKi), PARAMETER :: M53N9TAxe = 16515 - INTEGER(IntKi), PARAMETER :: M54N1TAxe = 16516 - INTEGER(IntKi), PARAMETER :: M54N2TAxe = 16517 - INTEGER(IntKi), PARAMETER :: M54N3TAxe = 16518 - INTEGER(IntKi), PARAMETER :: M54N4TAxe = 16519 - INTEGER(IntKi), PARAMETER :: M54N5TAxe = 16520 - INTEGER(IntKi), PARAMETER :: M54N6TAxe = 16521 - INTEGER(IntKi), PARAMETER :: M54N7TAxe = 16522 - INTEGER(IntKi), PARAMETER :: M54N8TAxe = 16523 - INTEGER(IntKi), PARAMETER :: M54N9TAxe = 16524 - INTEGER(IntKi), PARAMETER :: M55N1TAxe = 16525 - INTEGER(IntKi), PARAMETER :: M55N2TAxe = 16526 - INTEGER(IntKi), PARAMETER :: M55N3TAxe = 16527 - INTEGER(IntKi), PARAMETER :: M55N4TAxe = 16528 - INTEGER(IntKi), PARAMETER :: M55N5TAxe = 16529 - INTEGER(IntKi), PARAMETER :: M55N6TAxe = 16530 - INTEGER(IntKi), PARAMETER :: M55N7TAxe = 16531 - INTEGER(IntKi), PARAMETER :: M55N8TAxe = 16532 - INTEGER(IntKi), PARAMETER :: M55N9TAxe = 16533 - INTEGER(IntKi), PARAMETER :: M56N1TAxe = 16534 - INTEGER(IntKi), PARAMETER :: M56N2TAxe = 16535 - INTEGER(IntKi), PARAMETER :: M56N3TAxe = 16536 - INTEGER(IntKi), PARAMETER :: M56N4TAxe = 16537 - INTEGER(IntKi), PARAMETER :: M56N5TAxe = 16538 - INTEGER(IntKi), PARAMETER :: M56N6TAxe = 16539 - INTEGER(IntKi), PARAMETER :: M56N7TAxe = 16540 - INTEGER(IntKi), PARAMETER :: M56N8TAxe = 16541 - INTEGER(IntKi), PARAMETER :: M56N9TAxe = 16542 - INTEGER(IntKi), PARAMETER :: M57N1TAxe = 16543 - INTEGER(IntKi), PARAMETER :: M57N2TAxe = 16544 - INTEGER(IntKi), PARAMETER :: M57N3TAxe = 16545 - INTEGER(IntKi), PARAMETER :: M57N4TAxe = 16546 - INTEGER(IntKi), PARAMETER :: M57N5TAxe = 16547 - INTEGER(IntKi), PARAMETER :: M57N6TAxe = 16548 - INTEGER(IntKi), PARAMETER :: M57N7TAxe = 16549 - INTEGER(IntKi), PARAMETER :: M57N8TAxe = 16550 - INTEGER(IntKi), PARAMETER :: M57N9TAxe = 16551 - INTEGER(IntKi), PARAMETER :: M58N1TAxe = 16552 - INTEGER(IntKi), PARAMETER :: M58N2TAxe = 16553 - INTEGER(IntKi), PARAMETER :: M58N3TAxe = 16554 - INTEGER(IntKi), PARAMETER :: M58N4TAxe = 16555 - INTEGER(IntKi), PARAMETER :: M58N5TAxe = 16556 - INTEGER(IntKi), PARAMETER :: M58N6TAxe = 16557 - INTEGER(IntKi), PARAMETER :: M58N7TAxe = 16558 - INTEGER(IntKi), PARAMETER :: M58N8TAxe = 16559 - INTEGER(IntKi), PARAMETER :: M58N9TAxe = 16560 - INTEGER(IntKi), PARAMETER :: M59N1TAxe = 16561 - INTEGER(IntKi), PARAMETER :: M59N2TAxe = 16562 - INTEGER(IntKi), PARAMETER :: M59N3TAxe = 16563 - INTEGER(IntKi), PARAMETER :: M59N4TAxe = 16564 - INTEGER(IntKi), PARAMETER :: M59N5TAxe = 16565 - INTEGER(IntKi), PARAMETER :: M59N6TAxe = 16566 - INTEGER(IntKi), PARAMETER :: M59N7TAxe = 16567 - INTEGER(IntKi), PARAMETER :: M59N8TAxe = 16568 - INTEGER(IntKi), PARAMETER :: M59N9TAxe = 16569 - INTEGER(IntKi), PARAMETER :: M60N1TAxe = 16570 - INTEGER(IntKi), PARAMETER :: M60N2TAxe = 16571 - INTEGER(IntKi), PARAMETER :: M60N3TAxe = 16572 - INTEGER(IntKi), PARAMETER :: M60N4TAxe = 16573 - INTEGER(IntKi), PARAMETER :: M60N5TAxe = 16574 - INTEGER(IntKi), PARAMETER :: M60N6TAxe = 16575 - INTEGER(IntKi), PARAMETER :: M60N7TAxe = 16576 - INTEGER(IntKi), PARAMETER :: M60N8TAxe = 16577 - INTEGER(IntKi), PARAMETER :: M60N9TAxe = 16578 - INTEGER(IntKi), PARAMETER :: M61N1TAxe = 16579 - INTEGER(IntKi), PARAMETER :: M61N2TAxe = 16580 - INTEGER(IntKi), PARAMETER :: M61N3TAxe = 16581 - INTEGER(IntKi), PARAMETER :: M61N4TAxe = 16582 - INTEGER(IntKi), PARAMETER :: M61N5TAxe = 16583 - INTEGER(IntKi), PARAMETER :: M61N6TAxe = 16584 - INTEGER(IntKi), PARAMETER :: M61N7TAxe = 16585 - INTEGER(IntKi), PARAMETER :: M61N8TAxe = 16586 - INTEGER(IntKi), PARAMETER :: M61N9TAxe = 16587 - INTEGER(IntKi), PARAMETER :: M62N1TAxe = 16588 - INTEGER(IntKi), PARAMETER :: M62N2TAxe = 16589 - INTEGER(IntKi), PARAMETER :: M62N3TAxe = 16590 - INTEGER(IntKi), PARAMETER :: M62N4TAxe = 16591 - INTEGER(IntKi), PARAMETER :: M62N5TAxe = 16592 - INTEGER(IntKi), PARAMETER :: M62N6TAxe = 16593 - INTEGER(IntKi), PARAMETER :: M62N7TAxe = 16594 - INTEGER(IntKi), PARAMETER :: M62N8TAxe = 16595 - INTEGER(IntKi), PARAMETER :: M62N9TAxe = 16596 - INTEGER(IntKi), PARAMETER :: M63N1TAxe = 16597 - INTEGER(IntKi), PARAMETER :: M63N2TAxe = 16598 - INTEGER(IntKi), PARAMETER :: M63N3TAxe = 16599 - INTEGER(IntKi), PARAMETER :: M63N4TAxe = 16600 - INTEGER(IntKi), PARAMETER :: M63N5TAxe = 16601 - INTEGER(IntKi), PARAMETER :: M63N6TAxe = 16602 - INTEGER(IntKi), PARAMETER :: M63N7TAxe = 16603 - INTEGER(IntKi), PARAMETER :: M63N8TAxe = 16604 - INTEGER(IntKi), PARAMETER :: M63N9TAxe = 16605 - INTEGER(IntKi), PARAMETER :: M64N1TAxe = 16606 - INTEGER(IntKi), PARAMETER :: M64N2TAxe = 16607 - INTEGER(IntKi), PARAMETER :: M64N3TAxe = 16608 - INTEGER(IntKi), PARAMETER :: M64N4TAxe = 16609 - INTEGER(IntKi), PARAMETER :: M64N5TAxe = 16610 - INTEGER(IntKi), PARAMETER :: M64N6TAxe = 16611 - INTEGER(IntKi), PARAMETER :: M64N7TAxe = 16612 - INTEGER(IntKi), PARAMETER :: M64N8TAxe = 16613 - INTEGER(IntKi), PARAMETER :: M64N9TAxe = 16614 - INTEGER(IntKi), PARAMETER :: M65N1TAxe = 16615 - INTEGER(IntKi), PARAMETER :: M65N2TAxe = 16616 - INTEGER(IntKi), PARAMETER :: M65N3TAxe = 16617 - INTEGER(IntKi), PARAMETER :: M65N4TAxe = 16618 - INTEGER(IntKi), PARAMETER :: M65N5TAxe = 16619 - INTEGER(IntKi), PARAMETER :: M65N6TAxe = 16620 - INTEGER(IntKi), PARAMETER :: M65N7TAxe = 16621 - INTEGER(IntKi), PARAMETER :: M65N8TAxe = 16622 - INTEGER(IntKi), PARAMETER :: M65N9TAxe = 16623 - INTEGER(IntKi), PARAMETER :: M66N1TAxe = 16624 - INTEGER(IntKi), PARAMETER :: M66N2TAxe = 16625 - INTEGER(IntKi), PARAMETER :: M66N3TAxe = 16626 - INTEGER(IntKi), PARAMETER :: M66N4TAxe = 16627 - INTEGER(IntKi), PARAMETER :: M66N5TAxe = 16628 - INTEGER(IntKi), PARAMETER :: M66N6TAxe = 16629 - INTEGER(IntKi), PARAMETER :: M66N7TAxe = 16630 - INTEGER(IntKi), PARAMETER :: M66N8TAxe = 16631 - INTEGER(IntKi), PARAMETER :: M66N9TAxe = 16632 - INTEGER(IntKi), PARAMETER :: M67N1TAxe = 16633 - INTEGER(IntKi), PARAMETER :: M67N2TAxe = 16634 - INTEGER(IntKi), PARAMETER :: M67N3TAxe = 16635 - INTEGER(IntKi), PARAMETER :: M67N4TAxe = 16636 - INTEGER(IntKi), PARAMETER :: M67N5TAxe = 16637 - INTEGER(IntKi), PARAMETER :: M67N6TAxe = 16638 - INTEGER(IntKi), PARAMETER :: M67N7TAxe = 16639 - INTEGER(IntKi), PARAMETER :: M67N8TAxe = 16640 - INTEGER(IntKi), PARAMETER :: M67N9TAxe = 16641 - INTEGER(IntKi), PARAMETER :: M68N1TAxe = 16642 - INTEGER(IntKi), PARAMETER :: M68N2TAxe = 16643 - INTEGER(IntKi), PARAMETER :: M68N3TAxe = 16644 - INTEGER(IntKi), PARAMETER :: M68N4TAxe = 16645 - INTEGER(IntKi), PARAMETER :: M68N5TAxe = 16646 - INTEGER(IntKi), PARAMETER :: M68N6TAxe = 16647 - INTEGER(IntKi), PARAMETER :: M68N7TAxe = 16648 - INTEGER(IntKi), PARAMETER :: M68N8TAxe = 16649 - INTEGER(IntKi), PARAMETER :: M68N9TAxe = 16650 - INTEGER(IntKi), PARAMETER :: M69N1TAxe = 16651 - INTEGER(IntKi), PARAMETER :: M69N2TAxe = 16652 - INTEGER(IntKi), PARAMETER :: M69N3TAxe = 16653 - INTEGER(IntKi), PARAMETER :: M69N4TAxe = 16654 - INTEGER(IntKi), PARAMETER :: M69N5TAxe = 16655 - INTEGER(IntKi), PARAMETER :: M69N6TAxe = 16656 - INTEGER(IntKi), PARAMETER :: M69N7TAxe = 16657 - INTEGER(IntKi), PARAMETER :: M69N8TAxe = 16658 - INTEGER(IntKi), PARAMETER :: M69N9TAxe = 16659 - INTEGER(IntKi), PARAMETER :: M70N1TAxe = 16660 - INTEGER(IntKi), PARAMETER :: M70N2TAxe = 16661 - INTEGER(IntKi), PARAMETER :: M70N3TAxe = 16662 - INTEGER(IntKi), PARAMETER :: M70N4TAxe = 16663 - INTEGER(IntKi), PARAMETER :: M70N5TAxe = 16664 - INTEGER(IntKi), PARAMETER :: M70N6TAxe = 16665 - INTEGER(IntKi), PARAMETER :: M70N7TAxe = 16666 - INTEGER(IntKi), PARAMETER :: M70N8TAxe = 16667 - INTEGER(IntKi), PARAMETER :: M70N9TAxe = 16668 - INTEGER(IntKi), PARAMETER :: M71N1TAxe = 16669 - INTEGER(IntKi), PARAMETER :: M71N2TAxe = 16670 - INTEGER(IntKi), PARAMETER :: M71N3TAxe = 16671 - INTEGER(IntKi), PARAMETER :: M71N4TAxe = 16672 - INTEGER(IntKi), PARAMETER :: M71N5TAxe = 16673 - INTEGER(IntKi), PARAMETER :: M71N6TAxe = 16674 - INTEGER(IntKi), PARAMETER :: M71N7TAxe = 16675 - INTEGER(IntKi), PARAMETER :: M71N8TAxe = 16676 - INTEGER(IntKi), PARAMETER :: M71N9TAxe = 16677 - INTEGER(IntKi), PARAMETER :: M72N1TAxe = 16678 - INTEGER(IntKi), PARAMETER :: M72N2TAxe = 16679 - INTEGER(IntKi), PARAMETER :: M72N3TAxe = 16680 - INTEGER(IntKi), PARAMETER :: M72N4TAxe = 16681 - INTEGER(IntKi), PARAMETER :: M72N5TAxe = 16682 - INTEGER(IntKi), PARAMETER :: M72N6TAxe = 16683 - INTEGER(IntKi), PARAMETER :: M72N7TAxe = 16684 - INTEGER(IntKi), PARAMETER :: M72N8TAxe = 16685 - INTEGER(IntKi), PARAMETER :: M72N9TAxe = 16686 - INTEGER(IntKi), PARAMETER :: M73N1TAxe = 16687 - INTEGER(IntKi), PARAMETER :: M73N2TAxe = 16688 - INTEGER(IntKi), PARAMETER :: M73N3TAxe = 16689 - INTEGER(IntKi), PARAMETER :: M73N4TAxe = 16690 - INTEGER(IntKi), PARAMETER :: M73N5TAxe = 16691 - INTEGER(IntKi), PARAMETER :: M73N6TAxe = 16692 - INTEGER(IntKi), PARAMETER :: M73N7TAxe = 16693 - INTEGER(IntKi), PARAMETER :: M73N8TAxe = 16694 - INTEGER(IntKi), PARAMETER :: M73N9TAxe = 16695 - INTEGER(IntKi), PARAMETER :: M74N1TAxe = 16696 - INTEGER(IntKi), PARAMETER :: M74N2TAxe = 16697 - INTEGER(IntKi), PARAMETER :: M74N3TAxe = 16698 - INTEGER(IntKi), PARAMETER :: M74N4TAxe = 16699 - INTEGER(IntKi), PARAMETER :: M74N5TAxe = 16700 - INTEGER(IntKi), PARAMETER :: M74N6TAxe = 16701 - INTEGER(IntKi), PARAMETER :: M74N7TAxe = 16702 - INTEGER(IntKi), PARAMETER :: M74N8TAxe = 16703 - INTEGER(IntKi), PARAMETER :: M74N9TAxe = 16704 - INTEGER(IntKi), PARAMETER :: M75N1TAxe = 16705 - INTEGER(IntKi), PARAMETER :: M75N2TAxe = 16706 - INTEGER(IntKi), PARAMETER :: M75N3TAxe = 16707 - INTEGER(IntKi), PARAMETER :: M75N4TAxe = 16708 - INTEGER(IntKi), PARAMETER :: M75N5TAxe = 16709 - INTEGER(IntKi), PARAMETER :: M75N6TAxe = 16710 - INTEGER(IntKi), PARAMETER :: M75N7TAxe = 16711 - INTEGER(IntKi), PARAMETER :: M75N8TAxe = 16712 - INTEGER(IntKi), PARAMETER :: M75N9TAxe = 16713 - INTEGER(IntKi), PARAMETER :: M76N1TAxe = 16714 - INTEGER(IntKi), PARAMETER :: M76N2TAxe = 16715 - INTEGER(IntKi), PARAMETER :: M76N3TAxe = 16716 - INTEGER(IntKi), PARAMETER :: M76N4TAxe = 16717 - INTEGER(IntKi), PARAMETER :: M76N5TAxe = 16718 - INTEGER(IntKi), PARAMETER :: M76N6TAxe = 16719 - INTEGER(IntKi), PARAMETER :: M76N7TAxe = 16720 - INTEGER(IntKi), PARAMETER :: M76N8TAxe = 16721 - INTEGER(IntKi), PARAMETER :: M76N9TAxe = 16722 - INTEGER(IntKi), PARAMETER :: M77N1TAxe = 16723 - INTEGER(IntKi), PARAMETER :: M77N2TAxe = 16724 - INTEGER(IntKi), PARAMETER :: M77N3TAxe = 16725 - INTEGER(IntKi), PARAMETER :: M77N4TAxe = 16726 - INTEGER(IntKi), PARAMETER :: M77N5TAxe = 16727 - INTEGER(IntKi), PARAMETER :: M77N6TAxe = 16728 - INTEGER(IntKi), PARAMETER :: M77N7TAxe = 16729 - INTEGER(IntKi), PARAMETER :: M77N8TAxe = 16730 - INTEGER(IntKi), PARAMETER :: M77N9TAxe = 16731 - INTEGER(IntKi), PARAMETER :: M78N1TAxe = 16732 - INTEGER(IntKi), PARAMETER :: M78N2TAxe = 16733 - INTEGER(IntKi), PARAMETER :: M78N3TAxe = 16734 - INTEGER(IntKi), PARAMETER :: M78N4TAxe = 16735 - INTEGER(IntKi), PARAMETER :: M78N5TAxe = 16736 - INTEGER(IntKi), PARAMETER :: M78N6TAxe = 16737 - INTEGER(IntKi), PARAMETER :: M78N7TAxe = 16738 - INTEGER(IntKi), PARAMETER :: M78N8TAxe = 16739 - INTEGER(IntKi), PARAMETER :: M78N9TAxe = 16740 - INTEGER(IntKi), PARAMETER :: M79N1TAxe = 16741 - INTEGER(IntKi), PARAMETER :: M79N2TAxe = 16742 - INTEGER(IntKi), PARAMETER :: M79N3TAxe = 16743 - INTEGER(IntKi), PARAMETER :: M79N4TAxe = 16744 - INTEGER(IntKi), PARAMETER :: M79N5TAxe = 16745 - INTEGER(IntKi), PARAMETER :: M79N6TAxe = 16746 - INTEGER(IntKi), PARAMETER :: M79N7TAxe = 16747 - INTEGER(IntKi), PARAMETER :: M79N8TAxe = 16748 - INTEGER(IntKi), PARAMETER :: M79N9TAxe = 16749 - INTEGER(IntKi), PARAMETER :: M80N1TAxe = 16750 - INTEGER(IntKi), PARAMETER :: M80N2TAxe = 16751 - INTEGER(IntKi), PARAMETER :: M80N3TAxe = 16752 - INTEGER(IntKi), PARAMETER :: M80N4TAxe = 16753 - INTEGER(IntKi), PARAMETER :: M80N5TAxe = 16754 - INTEGER(IntKi), PARAMETER :: M80N6TAxe = 16755 - INTEGER(IntKi), PARAMETER :: M80N7TAxe = 16756 - INTEGER(IntKi), PARAMETER :: M80N8TAxe = 16757 - INTEGER(IntKi), PARAMETER :: M80N9TAxe = 16758 - INTEGER(IntKi), PARAMETER :: M81N1TAxe = 16759 - INTEGER(IntKi), PARAMETER :: M81N2TAxe = 16760 - INTEGER(IntKi), PARAMETER :: M81N3TAxe = 16761 - INTEGER(IntKi), PARAMETER :: M81N4TAxe = 16762 - INTEGER(IntKi), PARAMETER :: M81N5TAxe = 16763 - INTEGER(IntKi), PARAMETER :: M81N6TAxe = 16764 - INTEGER(IntKi), PARAMETER :: M81N7TAxe = 16765 - INTEGER(IntKi), PARAMETER :: M81N8TAxe = 16766 - INTEGER(IntKi), PARAMETER :: M81N9TAxe = 16767 - INTEGER(IntKi), PARAMETER :: M82N1TAxe = 16768 - INTEGER(IntKi), PARAMETER :: M82N2TAxe = 16769 - INTEGER(IntKi), PARAMETER :: M82N3TAxe = 16770 - INTEGER(IntKi), PARAMETER :: M82N4TAxe = 16771 - INTEGER(IntKi), PARAMETER :: M82N5TAxe = 16772 - INTEGER(IntKi), PARAMETER :: M82N6TAxe = 16773 - INTEGER(IntKi), PARAMETER :: M82N7TAxe = 16774 - INTEGER(IntKi), PARAMETER :: M82N8TAxe = 16775 - INTEGER(IntKi), PARAMETER :: M82N9TAxe = 16776 - INTEGER(IntKi), PARAMETER :: M83N1TAxe = 16777 - INTEGER(IntKi), PARAMETER :: M83N2TAxe = 16778 - INTEGER(IntKi), PARAMETER :: M83N3TAxe = 16779 - INTEGER(IntKi), PARAMETER :: M83N4TAxe = 16780 - INTEGER(IntKi), PARAMETER :: M83N5TAxe = 16781 - INTEGER(IntKi), PARAMETER :: M83N6TAxe = 16782 - INTEGER(IntKi), PARAMETER :: M83N7TAxe = 16783 - INTEGER(IntKi), PARAMETER :: M83N8TAxe = 16784 - INTEGER(IntKi), PARAMETER :: M83N9TAxe = 16785 - INTEGER(IntKi), PARAMETER :: M84N1TAxe = 16786 - INTEGER(IntKi), PARAMETER :: M84N2TAxe = 16787 - INTEGER(IntKi), PARAMETER :: M84N3TAxe = 16788 - INTEGER(IntKi), PARAMETER :: M84N4TAxe = 16789 - INTEGER(IntKi), PARAMETER :: M84N5TAxe = 16790 - INTEGER(IntKi), PARAMETER :: M84N6TAxe = 16791 - INTEGER(IntKi), PARAMETER :: M84N7TAxe = 16792 - INTEGER(IntKi), PARAMETER :: M84N8TAxe = 16793 - INTEGER(IntKi), PARAMETER :: M84N9TAxe = 16794 - INTEGER(IntKi), PARAMETER :: M85N1TAxe = 16795 - INTEGER(IntKi), PARAMETER :: M85N2TAxe = 16796 - INTEGER(IntKi), PARAMETER :: M85N3TAxe = 16797 - INTEGER(IntKi), PARAMETER :: M85N4TAxe = 16798 - INTEGER(IntKi), PARAMETER :: M85N5TAxe = 16799 - INTEGER(IntKi), PARAMETER :: M85N6TAxe = 16800 - INTEGER(IntKi), PARAMETER :: M85N7TAxe = 16801 - INTEGER(IntKi), PARAMETER :: M85N8TAxe = 16802 - INTEGER(IntKi), PARAMETER :: M85N9TAxe = 16803 - INTEGER(IntKi), PARAMETER :: M86N1TAxe = 16804 - INTEGER(IntKi), PARAMETER :: M86N2TAxe = 16805 - INTEGER(IntKi), PARAMETER :: M86N3TAxe = 16806 - INTEGER(IntKi), PARAMETER :: M86N4TAxe = 16807 - INTEGER(IntKi), PARAMETER :: M86N5TAxe = 16808 - INTEGER(IntKi), PARAMETER :: M86N6TAxe = 16809 - INTEGER(IntKi), PARAMETER :: M86N7TAxe = 16810 - INTEGER(IntKi), PARAMETER :: M86N8TAxe = 16811 - INTEGER(IntKi), PARAMETER :: M86N9TAxe = 16812 - INTEGER(IntKi), PARAMETER :: M87N1TAxe = 16813 - INTEGER(IntKi), PARAMETER :: M87N2TAxe = 16814 - INTEGER(IntKi), PARAMETER :: M87N3TAxe = 16815 - INTEGER(IntKi), PARAMETER :: M87N4TAxe = 16816 - INTEGER(IntKi), PARAMETER :: M87N5TAxe = 16817 - INTEGER(IntKi), PARAMETER :: M87N6TAxe = 16818 - INTEGER(IntKi), PARAMETER :: M87N7TAxe = 16819 - INTEGER(IntKi), PARAMETER :: M87N8TAxe = 16820 - INTEGER(IntKi), PARAMETER :: M87N9TAxe = 16821 - INTEGER(IntKi), PARAMETER :: M88N1TAxe = 16822 - INTEGER(IntKi), PARAMETER :: M88N2TAxe = 16823 - INTEGER(IntKi), PARAMETER :: M88N3TAxe = 16824 - INTEGER(IntKi), PARAMETER :: M88N4TAxe = 16825 - INTEGER(IntKi), PARAMETER :: M88N5TAxe = 16826 - INTEGER(IntKi), PARAMETER :: M88N6TAxe = 16827 - INTEGER(IntKi), PARAMETER :: M88N7TAxe = 16828 - INTEGER(IntKi), PARAMETER :: M88N8TAxe = 16829 - INTEGER(IntKi), PARAMETER :: M88N9TAxe = 16830 - INTEGER(IntKi), PARAMETER :: M89N1TAxe = 16831 - INTEGER(IntKi), PARAMETER :: M89N2TAxe = 16832 - INTEGER(IntKi), PARAMETER :: M89N3TAxe = 16833 - INTEGER(IntKi), PARAMETER :: M89N4TAxe = 16834 - INTEGER(IntKi), PARAMETER :: M89N5TAxe = 16835 - INTEGER(IntKi), PARAMETER :: M89N6TAxe = 16836 - INTEGER(IntKi), PARAMETER :: M89N7TAxe = 16837 - INTEGER(IntKi), PARAMETER :: M89N8TAxe = 16838 - INTEGER(IntKi), PARAMETER :: M89N9TAxe = 16839 - INTEGER(IntKi), PARAMETER :: M90N1TAxe = 16840 - INTEGER(IntKi), PARAMETER :: M90N2TAxe = 16841 - INTEGER(IntKi), PARAMETER :: M90N3TAxe = 16842 - INTEGER(IntKi), PARAMETER :: M90N4TAxe = 16843 - INTEGER(IntKi), PARAMETER :: M90N5TAxe = 16844 - INTEGER(IntKi), PARAMETER :: M90N6TAxe = 16845 - INTEGER(IntKi), PARAMETER :: M90N7TAxe = 16846 - INTEGER(IntKi), PARAMETER :: M90N8TAxe = 16847 - INTEGER(IntKi), PARAMETER :: M90N9TAxe = 16848 - INTEGER(IntKi), PARAMETER :: M91N1TAxe = 16849 - INTEGER(IntKi), PARAMETER :: M91N2TAxe = 16850 - INTEGER(IntKi), PARAMETER :: M91N3TAxe = 16851 - INTEGER(IntKi), PARAMETER :: M91N4TAxe = 16852 - INTEGER(IntKi), PARAMETER :: M91N5TAxe = 16853 - INTEGER(IntKi), PARAMETER :: M91N6TAxe = 16854 - INTEGER(IntKi), PARAMETER :: M91N7TAxe = 16855 - INTEGER(IntKi), PARAMETER :: M91N8TAxe = 16856 - INTEGER(IntKi), PARAMETER :: M91N9TAxe = 16857 - INTEGER(IntKi), PARAMETER :: M92N1TAxe = 16858 - INTEGER(IntKi), PARAMETER :: M92N2TAxe = 16859 - INTEGER(IntKi), PARAMETER :: M92N3TAxe = 16860 - INTEGER(IntKi), PARAMETER :: M92N4TAxe = 16861 - INTEGER(IntKi), PARAMETER :: M92N5TAxe = 16862 - INTEGER(IntKi), PARAMETER :: M92N6TAxe = 16863 - INTEGER(IntKi), PARAMETER :: M92N7TAxe = 16864 - INTEGER(IntKi), PARAMETER :: M92N8TAxe = 16865 - INTEGER(IntKi), PARAMETER :: M92N9TAxe = 16866 - INTEGER(IntKi), PARAMETER :: M93N1TAxe = 16867 - INTEGER(IntKi), PARAMETER :: M93N2TAxe = 16868 - INTEGER(IntKi), PARAMETER :: M93N3TAxe = 16869 - INTEGER(IntKi), PARAMETER :: M93N4TAxe = 16870 - INTEGER(IntKi), PARAMETER :: M93N5TAxe = 16871 - INTEGER(IntKi), PARAMETER :: M93N6TAxe = 16872 - INTEGER(IntKi), PARAMETER :: M93N7TAxe = 16873 - INTEGER(IntKi), PARAMETER :: M93N8TAxe = 16874 - INTEGER(IntKi), PARAMETER :: M93N9TAxe = 16875 - INTEGER(IntKi), PARAMETER :: M94N1TAxe = 16876 - INTEGER(IntKi), PARAMETER :: M94N2TAxe = 16877 - INTEGER(IntKi), PARAMETER :: M94N3TAxe = 16878 - INTEGER(IntKi), PARAMETER :: M94N4TAxe = 16879 - INTEGER(IntKi), PARAMETER :: M94N5TAxe = 16880 - INTEGER(IntKi), PARAMETER :: M94N6TAxe = 16881 - INTEGER(IntKi), PARAMETER :: M94N7TAxe = 16882 - INTEGER(IntKi), PARAMETER :: M94N8TAxe = 16883 - INTEGER(IntKi), PARAMETER :: M94N9TAxe = 16884 - INTEGER(IntKi), PARAMETER :: M95N1TAxe = 16885 - INTEGER(IntKi), PARAMETER :: M95N2TAxe = 16886 - INTEGER(IntKi), PARAMETER :: M95N3TAxe = 16887 - INTEGER(IntKi), PARAMETER :: M95N4TAxe = 16888 - INTEGER(IntKi), PARAMETER :: M95N5TAxe = 16889 - INTEGER(IntKi), PARAMETER :: M95N6TAxe = 16890 - INTEGER(IntKi), PARAMETER :: M95N7TAxe = 16891 - INTEGER(IntKi), PARAMETER :: M95N8TAxe = 16892 - INTEGER(IntKi), PARAMETER :: M95N9TAxe = 16893 - INTEGER(IntKi), PARAMETER :: M96N1TAxe = 16894 - INTEGER(IntKi), PARAMETER :: M96N2TAxe = 16895 - INTEGER(IntKi), PARAMETER :: M96N3TAxe = 16896 - INTEGER(IntKi), PARAMETER :: M96N4TAxe = 16897 - INTEGER(IntKi), PARAMETER :: M96N5TAxe = 16898 - INTEGER(IntKi), PARAMETER :: M96N6TAxe = 16899 - INTEGER(IntKi), PARAMETER :: M96N7TAxe = 16900 - INTEGER(IntKi), PARAMETER :: M96N8TAxe = 16901 - INTEGER(IntKi), PARAMETER :: M96N9TAxe = 16902 - INTEGER(IntKi), PARAMETER :: M97N1TAxe = 16903 - INTEGER(IntKi), PARAMETER :: M97N2TAxe = 16904 - INTEGER(IntKi), PARAMETER :: M97N3TAxe = 16905 - INTEGER(IntKi), PARAMETER :: M97N4TAxe = 16906 - INTEGER(IntKi), PARAMETER :: M97N5TAxe = 16907 - INTEGER(IntKi), PARAMETER :: M97N6TAxe = 16908 - INTEGER(IntKi), PARAMETER :: M97N7TAxe = 16909 - INTEGER(IntKi), PARAMETER :: M97N8TAxe = 16910 - INTEGER(IntKi), PARAMETER :: M97N9TAxe = 16911 - INTEGER(IntKi), PARAMETER :: M98N1TAxe = 16912 - INTEGER(IntKi), PARAMETER :: M98N2TAxe = 16913 - INTEGER(IntKi), PARAMETER :: M98N3TAxe = 16914 - INTEGER(IntKi), PARAMETER :: M98N4TAxe = 16915 - INTEGER(IntKi), PARAMETER :: M98N5TAxe = 16916 - INTEGER(IntKi), PARAMETER :: M98N6TAxe = 16917 - INTEGER(IntKi), PARAMETER :: M98N7TAxe = 16918 - INTEGER(IntKi), PARAMETER :: M98N8TAxe = 16919 - INTEGER(IntKi), PARAMETER :: M98N9TAxe = 16920 - INTEGER(IntKi), PARAMETER :: M99N1TAxe = 16921 - INTEGER(IntKi), PARAMETER :: M99N2TAxe = 16922 - INTEGER(IntKi), PARAMETER :: M99N3TAxe = 16923 - INTEGER(IntKi), PARAMETER :: M99N4TAxe = 16924 - INTEGER(IntKi), PARAMETER :: M99N5TAxe = 16925 - INTEGER(IntKi), PARAMETER :: M99N6TAxe = 16926 - INTEGER(IntKi), PARAMETER :: M99N7TAxe = 16927 - INTEGER(IntKi), PARAMETER :: M99N8TAxe = 16928 - INTEGER(IntKi), PARAMETER :: M99N9TAxe = 16929 - INTEGER(IntKi), PARAMETER :: M01N1TAye = 16930 - INTEGER(IntKi), PARAMETER :: M01N2TAye = 16931 - INTEGER(IntKi), PARAMETER :: M01N3TAye = 16932 - INTEGER(IntKi), PARAMETER :: M01N4TAye = 16933 - INTEGER(IntKi), PARAMETER :: M01N5TAye = 16934 - INTEGER(IntKi), PARAMETER :: M01N6TAye = 16935 - INTEGER(IntKi), PARAMETER :: M01N7TAye = 16936 - INTEGER(IntKi), PARAMETER :: M01N8TAye = 16937 - INTEGER(IntKi), PARAMETER :: M01N9TAye = 16938 - INTEGER(IntKi), PARAMETER :: M02N1TAye = 16939 - INTEGER(IntKi), PARAMETER :: M02N2TAye = 16940 - INTEGER(IntKi), PARAMETER :: M02N3TAye = 16941 - INTEGER(IntKi), PARAMETER :: M02N4TAye = 16942 - INTEGER(IntKi), PARAMETER :: M02N5TAye = 16943 - INTEGER(IntKi), PARAMETER :: M02N6TAye = 16944 - INTEGER(IntKi), PARAMETER :: M02N7TAye = 16945 - INTEGER(IntKi), PARAMETER :: M02N8TAye = 16946 - INTEGER(IntKi), PARAMETER :: M02N9TAye = 16947 - INTEGER(IntKi), PARAMETER :: M03N1TAye = 16948 - INTEGER(IntKi), PARAMETER :: M03N2TAye = 16949 - INTEGER(IntKi), PARAMETER :: M03N3TAye = 16950 - INTEGER(IntKi), PARAMETER :: M03N4TAye = 16951 - INTEGER(IntKi), PARAMETER :: M03N5TAye = 16952 - INTEGER(IntKi), PARAMETER :: M03N6TAye = 16953 - INTEGER(IntKi), PARAMETER :: M03N7TAye = 16954 - INTEGER(IntKi), PARAMETER :: M03N8TAye = 16955 - INTEGER(IntKi), PARAMETER :: M03N9TAye = 16956 - INTEGER(IntKi), PARAMETER :: M04N1TAye = 16957 - INTEGER(IntKi), PARAMETER :: M04N2TAye = 16958 - INTEGER(IntKi), PARAMETER :: M04N3TAye = 16959 - INTEGER(IntKi), PARAMETER :: M04N4TAye = 16960 - INTEGER(IntKi), PARAMETER :: M04N5TAye = 16961 - INTEGER(IntKi), PARAMETER :: M04N6TAye = 16962 - INTEGER(IntKi), PARAMETER :: M04N7TAye = 16963 - INTEGER(IntKi), PARAMETER :: M04N8TAye = 16964 - INTEGER(IntKi), PARAMETER :: M04N9TAye = 16965 - INTEGER(IntKi), PARAMETER :: M05N1TAye = 16966 - INTEGER(IntKi), PARAMETER :: M05N2TAye = 16967 - INTEGER(IntKi), PARAMETER :: M05N3TAye = 16968 - INTEGER(IntKi), PARAMETER :: M05N4TAye = 16969 - INTEGER(IntKi), PARAMETER :: M05N5TAye = 16970 - INTEGER(IntKi), PARAMETER :: M05N6TAye = 16971 - INTEGER(IntKi), PARAMETER :: M05N7TAye = 16972 - INTEGER(IntKi), PARAMETER :: M05N8TAye = 16973 - INTEGER(IntKi), PARAMETER :: M05N9TAye = 16974 - INTEGER(IntKi), PARAMETER :: M06N1TAye = 16975 - INTEGER(IntKi), PARAMETER :: M06N2TAye = 16976 - INTEGER(IntKi), PARAMETER :: M06N3TAye = 16977 - INTEGER(IntKi), PARAMETER :: M06N4TAye = 16978 - INTEGER(IntKi), PARAMETER :: M06N5TAye = 16979 - INTEGER(IntKi), PARAMETER :: M06N6TAye = 16980 - INTEGER(IntKi), PARAMETER :: M06N7TAye = 16981 - INTEGER(IntKi), PARAMETER :: M06N8TAye = 16982 - INTEGER(IntKi), PARAMETER :: M06N9TAye = 16983 - INTEGER(IntKi), PARAMETER :: M07N1TAye = 16984 - INTEGER(IntKi), PARAMETER :: M07N2TAye = 16985 - INTEGER(IntKi), PARAMETER :: M07N3TAye = 16986 - INTEGER(IntKi), PARAMETER :: M07N4TAye = 16987 - INTEGER(IntKi), PARAMETER :: M07N5TAye = 16988 - INTEGER(IntKi), PARAMETER :: M07N6TAye = 16989 - INTEGER(IntKi), PARAMETER :: M07N7TAye = 16990 - INTEGER(IntKi), PARAMETER :: M07N8TAye = 16991 - INTEGER(IntKi), PARAMETER :: M07N9TAye = 16992 - INTEGER(IntKi), PARAMETER :: M08N1TAye = 16993 - INTEGER(IntKi), PARAMETER :: M08N2TAye = 16994 - INTEGER(IntKi), PARAMETER :: M08N3TAye = 16995 - INTEGER(IntKi), PARAMETER :: M08N4TAye = 16996 - INTEGER(IntKi), PARAMETER :: M08N5TAye = 16997 - INTEGER(IntKi), PARAMETER :: M08N6TAye = 16998 - INTEGER(IntKi), PARAMETER :: M08N7TAye = 16999 - INTEGER(IntKi), PARAMETER :: M08N8TAye = 17000 - INTEGER(IntKi), PARAMETER :: M08N9TAye = 17001 - INTEGER(IntKi), PARAMETER :: M09N1TAye = 17002 - INTEGER(IntKi), PARAMETER :: M09N2TAye = 17003 - INTEGER(IntKi), PARAMETER :: M09N3TAye = 17004 - INTEGER(IntKi), PARAMETER :: M09N4TAye = 17005 - INTEGER(IntKi), PARAMETER :: M09N5TAye = 17006 - INTEGER(IntKi), PARAMETER :: M09N6TAye = 17007 - INTEGER(IntKi), PARAMETER :: M09N7TAye = 17008 - INTEGER(IntKi), PARAMETER :: M09N8TAye = 17009 - INTEGER(IntKi), PARAMETER :: M09N9TAye = 17010 - INTEGER(IntKi), PARAMETER :: M10N1TAye = 17011 - INTEGER(IntKi), PARAMETER :: M10N2TAye = 17012 - INTEGER(IntKi), PARAMETER :: M10N3TAye = 17013 - INTEGER(IntKi), PARAMETER :: M10N4TAye = 17014 - INTEGER(IntKi), PARAMETER :: M10N5TAye = 17015 - INTEGER(IntKi), PARAMETER :: M10N6TAye = 17016 - INTEGER(IntKi), PARAMETER :: M10N7TAye = 17017 - INTEGER(IntKi), PARAMETER :: M10N8TAye = 17018 - INTEGER(IntKi), PARAMETER :: M10N9TAye = 17019 - INTEGER(IntKi), PARAMETER :: M11N1TAye = 17020 - INTEGER(IntKi), PARAMETER :: M11N2TAye = 17021 - INTEGER(IntKi), PARAMETER :: M11N3TAye = 17022 - INTEGER(IntKi), PARAMETER :: M11N4TAye = 17023 - INTEGER(IntKi), PARAMETER :: M11N5TAye = 17024 - INTEGER(IntKi), PARAMETER :: M11N6TAye = 17025 - INTEGER(IntKi), PARAMETER :: M11N7TAye = 17026 - INTEGER(IntKi), PARAMETER :: M11N8TAye = 17027 - INTEGER(IntKi), PARAMETER :: M11N9TAye = 17028 - INTEGER(IntKi), PARAMETER :: M12N1TAye = 17029 - INTEGER(IntKi), PARAMETER :: M12N2TAye = 17030 - INTEGER(IntKi), PARAMETER :: M12N3TAye = 17031 - INTEGER(IntKi), PARAMETER :: M12N4TAye = 17032 - INTEGER(IntKi), PARAMETER :: M12N5TAye = 17033 - INTEGER(IntKi), PARAMETER :: M12N6TAye = 17034 - INTEGER(IntKi), PARAMETER :: M12N7TAye = 17035 - INTEGER(IntKi), PARAMETER :: M12N8TAye = 17036 - INTEGER(IntKi), PARAMETER :: M12N9TAye = 17037 - INTEGER(IntKi), PARAMETER :: M13N1TAye = 17038 - INTEGER(IntKi), PARAMETER :: M13N2TAye = 17039 - INTEGER(IntKi), PARAMETER :: M13N3TAye = 17040 - INTEGER(IntKi), PARAMETER :: M13N4TAye = 17041 - INTEGER(IntKi), PARAMETER :: M13N5TAye = 17042 - INTEGER(IntKi), PARAMETER :: M13N6TAye = 17043 - INTEGER(IntKi), PARAMETER :: M13N7TAye = 17044 - INTEGER(IntKi), PARAMETER :: M13N8TAye = 17045 - INTEGER(IntKi), PARAMETER :: M13N9TAye = 17046 - INTEGER(IntKi), PARAMETER :: M14N1TAye = 17047 - INTEGER(IntKi), PARAMETER :: M14N2TAye = 17048 - INTEGER(IntKi), PARAMETER :: M14N3TAye = 17049 - INTEGER(IntKi), PARAMETER :: M14N4TAye = 17050 - INTEGER(IntKi), PARAMETER :: M14N5TAye = 17051 - INTEGER(IntKi), PARAMETER :: M14N6TAye = 17052 - INTEGER(IntKi), PARAMETER :: M14N7TAye = 17053 - INTEGER(IntKi), PARAMETER :: M14N8TAye = 17054 - INTEGER(IntKi), PARAMETER :: M14N9TAye = 17055 - INTEGER(IntKi), PARAMETER :: M15N1TAye = 17056 - INTEGER(IntKi), PARAMETER :: M15N2TAye = 17057 - INTEGER(IntKi), PARAMETER :: M15N3TAye = 17058 - INTEGER(IntKi), PARAMETER :: M15N4TAye = 17059 - INTEGER(IntKi), PARAMETER :: M15N5TAye = 17060 - INTEGER(IntKi), PARAMETER :: M15N6TAye = 17061 - INTEGER(IntKi), PARAMETER :: M15N7TAye = 17062 - INTEGER(IntKi), PARAMETER :: M15N8TAye = 17063 - INTEGER(IntKi), PARAMETER :: M15N9TAye = 17064 - INTEGER(IntKi), PARAMETER :: M16N1TAye = 17065 - INTEGER(IntKi), PARAMETER :: M16N2TAye = 17066 - INTEGER(IntKi), PARAMETER :: M16N3TAye = 17067 - INTEGER(IntKi), PARAMETER :: M16N4TAye = 17068 - INTEGER(IntKi), PARAMETER :: M16N5TAye = 17069 - INTEGER(IntKi), PARAMETER :: M16N6TAye = 17070 - INTEGER(IntKi), PARAMETER :: M16N7TAye = 17071 - INTEGER(IntKi), PARAMETER :: M16N8TAye = 17072 - INTEGER(IntKi), PARAMETER :: M16N9TAye = 17073 - INTEGER(IntKi), PARAMETER :: M17N1TAye = 17074 - INTEGER(IntKi), PARAMETER :: M17N2TAye = 17075 - INTEGER(IntKi), PARAMETER :: M17N3TAye = 17076 - INTEGER(IntKi), PARAMETER :: M17N4TAye = 17077 - INTEGER(IntKi), PARAMETER :: M17N5TAye = 17078 - INTEGER(IntKi), PARAMETER :: M17N6TAye = 17079 - INTEGER(IntKi), PARAMETER :: M17N7TAye = 17080 - INTEGER(IntKi), PARAMETER :: M17N8TAye = 17081 - INTEGER(IntKi), PARAMETER :: M17N9TAye = 17082 - INTEGER(IntKi), PARAMETER :: M18N1TAye = 17083 - INTEGER(IntKi), PARAMETER :: M18N2TAye = 17084 - INTEGER(IntKi), PARAMETER :: M18N3TAye = 17085 - INTEGER(IntKi), PARAMETER :: M18N4TAye = 17086 - INTEGER(IntKi), PARAMETER :: M18N5TAye = 17087 - INTEGER(IntKi), PARAMETER :: M18N6TAye = 17088 - INTEGER(IntKi), PARAMETER :: M18N7TAye = 17089 - INTEGER(IntKi), PARAMETER :: M18N8TAye = 17090 - INTEGER(IntKi), PARAMETER :: M18N9TAye = 17091 - INTEGER(IntKi), PARAMETER :: M19N1TAye = 17092 - INTEGER(IntKi), PARAMETER :: M19N2TAye = 17093 - INTEGER(IntKi), PARAMETER :: M19N3TAye = 17094 - INTEGER(IntKi), PARAMETER :: M19N4TAye = 17095 - INTEGER(IntKi), PARAMETER :: M19N5TAye = 17096 - INTEGER(IntKi), PARAMETER :: M19N6TAye = 17097 - INTEGER(IntKi), PARAMETER :: M19N7TAye = 17098 - INTEGER(IntKi), PARAMETER :: M19N8TAye = 17099 - INTEGER(IntKi), PARAMETER :: M19N9TAye = 17100 - INTEGER(IntKi), PARAMETER :: M20N1TAye = 17101 - INTEGER(IntKi), PARAMETER :: M20N2TAye = 17102 - INTEGER(IntKi), PARAMETER :: M20N3TAye = 17103 - INTEGER(IntKi), PARAMETER :: M20N4TAye = 17104 - INTEGER(IntKi), PARAMETER :: M20N5TAye = 17105 - INTEGER(IntKi), PARAMETER :: M20N6TAye = 17106 - INTEGER(IntKi), PARAMETER :: M20N7TAye = 17107 - INTEGER(IntKi), PARAMETER :: M20N8TAye = 17108 - INTEGER(IntKi), PARAMETER :: M20N9TAye = 17109 - INTEGER(IntKi), PARAMETER :: M21N1TAye = 17110 - INTEGER(IntKi), PARAMETER :: M21N2TAye = 17111 - INTEGER(IntKi), PARAMETER :: M21N3TAye = 17112 - INTEGER(IntKi), PARAMETER :: M21N4TAye = 17113 - INTEGER(IntKi), PARAMETER :: M21N5TAye = 17114 - INTEGER(IntKi), PARAMETER :: M21N6TAye = 17115 - INTEGER(IntKi), PARAMETER :: M21N7TAye = 17116 - INTEGER(IntKi), PARAMETER :: M21N8TAye = 17117 - INTEGER(IntKi), PARAMETER :: M21N9TAye = 17118 - INTEGER(IntKi), PARAMETER :: M22N1TAye = 17119 - INTEGER(IntKi), PARAMETER :: M22N2TAye = 17120 - INTEGER(IntKi), PARAMETER :: M22N3TAye = 17121 - INTEGER(IntKi), PARAMETER :: M22N4TAye = 17122 - INTEGER(IntKi), PARAMETER :: M22N5TAye = 17123 - INTEGER(IntKi), PARAMETER :: M22N6TAye = 17124 - INTEGER(IntKi), PARAMETER :: M22N7TAye = 17125 - INTEGER(IntKi), PARAMETER :: M22N8TAye = 17126 - INTEGER(IntKi), PARAMETER :: M22N9TAye = 17127 - INTEGER(IntKi), PARAMETER :: M23N1TAye = 17128 - INTEGER(IntKi), PARAMETER :: M23N2TAye = 17129 - INTEGER(IntKi), PARAMETER :: M23N3TAye = 17130 - INTEGER(IntKi), PARAMETER :: M23N4TAye = 17131 - INTEGER(IntKi), PARAMETER :: M23N5TAye = 17132 - INTEGER(IntKi), PARAMETER :: M23N6TAye = 17133 - INTEGER(IntKi), PARAMETER :: M23N7TAye = 17134 - INTEGER(IntKi), PARAMETER :: M23N8TAye = 17135 - INTEGER(IntKi), PARAMETER :: M23N9TAye = 17136 - INTEGER(IntKi), PARAMETER :: M24N1TAye = 17137 - INTEGER(IntKi), PARAMETER :: M24N2TAye = 17138 - INTEGER(IntKi), PARAMETER :: M24N3TAye = 17139 - INTEGER(IntKi), PARAMETER :: M24N4TAye = 17140 - INTEGER(IntKi), PARAMETER :: M24N5TAye = 17141 - INTEGER(IntKi), PARAMETER :: M24N6TAye = 17142 - INTEGER(IntKi), PARAMETER :: M24N7TAye = 17143 - INTEGER(IntKi), PARAMETER :: M24N8TAye = 17144 - INTEGER(IntKi), PARAMETER :: M24N9TAye = 17145 - INTEGER(IntKi), PARAMETER :: M25N1TAye = 17146 - INTEGER(IntKi), PARAMETER :: M25N2TAye = 17147 - INTEGER(IntKi), PARAMETER :: M25N3TAye = 17148 - INTEGER(IntKi), PARAMETER :: M25N4TAye = 17149 - INTEGER(IntKi), PARAMETER :: M25N5TAye = 17150 - INTEGER(IntKi), PARAMETER :: M25N6TAye = 17151 - INTEGER(IntKi), PARAMETER :: M25N7TAye = 17152 - INTEGER(IntKi), PARAMETER :: M25N8TAye = 17153 - INTEGER(IntKi), PARAMETER :: M25N9TAye = 17154 - INTEGER(IntKi), PARAMETER :: M26N1TAye = 17155 - INTEGER(IntKi), PARAMETER :: M26N2TAye = 17156 - INTEGER(IntKi), PARAMETER :: M26N3TAye = 17157 - INTEGER(IntKi), PARAMETER :: M26N4TAye = 17158 - INTEGER(IntKi), PARAMETER :: M26N5TAye = 17159 - INTEGER(IntKi), PARAMETER :: M26N6TAye = 17160 - INTEGER(IntKi), PARAMETER :: M26N7TAye = 17161 - INTEGER(IntKi), PARAMETER :: M26N8TAye = 17162 - INTEGER(IntKi), PARAMETER :: M26N9TAye = 17163 - INTEGER(IntKi), PARAMETER :: M27N1TAye = 17164 - INTEGER(IntKi), PARAMETER :: M27N2TAye = 17165 - INTEGER(IntKi), PARAMETER :: M27N3TAye = 17166 - INTEGER(IntKi), PARAMETER :: M27N4TAye = 17167 - INTEGER(IntKi), PARAMETER :: M27N5TAye = 17168 - INTEGER(IntKi), PARAMETER :: M27N6TAye = 17169 - INTEGER(IntKi), PARAMETER :: M27N7TAye = 17170 - INTEGER(IntKi), PARAMETER :: M27N8TAye = 17171 - INTEGER(IntKi), PARAMETER :: M27N9TAye = 17172 - INTEGER(IntKi), PARAMETER :: M28N1TAye = 17173 - INTEGER(IntKi), PARAMETER :: M28N2TAye = 17174 - INTEGER(IntKi), PARAMETER :: M28N3TAye = 17175 - INTEGER(IntKi), PARAMETER :: M28N4TAye = 17176 - INTEGER(IntKi), PARAMETER :: M28N5TAye = 17177 - INTEGER(IntKi), PARAMETER :: M28N6TAye = 17178 - INTEGER(IntKi), PARAMETER :: M28N7TAye = 17179 - INTEGER(IntKi), PARAMETER :: M28N8TAye = 17180 - INTEGER(IntKi), PARAMETER :: M28N9TAye = 17181 - INTEGER(IntKi), PARAMETER :: M29N1TAye = 17182 - INTEGER(IntKi), PARAMETER :: M29N2TAye = 17183 - INTEGER(IntKi), PARAMETER :: M29N3TAye = 17184 - INTEGER(IntKi), PARAMETER :: M29N4TAye = 17185 - INTEGER(IntKi), PARAMETER :: M29N5TAye = 17186 - INTEGER(IntKi), PARAMETER :: M29N6TAye = 17187 - INTEGER(IntKi), PARAMETER :: M29N7TAye = 17188 - INTEGER(IntKi), PARAMETER :: M29N8TAye = 17189 - INTEGER(IntKi), PARAMETER :: M29N9TAye = 17190 - INTEGER(IntKi), PARAMETER :: M30N1TAye = 17191 - INTEGER(IntKi), PARAMETER :: M30N2TAye = 17192 - INTEGER(IntKi), PARAMETER :: M30N3TAye = 17193 - INTEGER(IntKi), PARAMETER :: M30N4TAye = 17194 - INTEGER(IntKi), PARAMETER :: M30N5TAye = 17195 - INTEGER(IntKi), PARAMETER :: M30N6TAye = 17196 - INTEGER(IntKi), PARAMETER :: M30N7TAye = 17197 - INTEGER(IntKi), PARAMETER :: M30N8TAye = 17198 - INTEGER(IntKi), PARAMETER :: M30N9TAye = 17199 - INTEGER(IntKi), PARAMETER :: M31N1TAye = 17200 - INTEGER(IntKi), PARAMETER :: M31N2TAye = 17201 - INTEGER(IntKi), PARAMETER :: M31N3TAye = 17202 - INTEGER(IntKi), PARAMETER :: M31N4TAye = 17203 - INTEGER(IntKi), PARAMETER :: M31N5TAye = 17204 - INTEGER(IntKi), PARAMETER :: M31N6TAye = 17205 - INTEGER(IntKi), PARAMETER :: M31N7TAye = 17206 - INTEGER(IntKi), PARAMETER :: M31N8TAye = 17207 - INTEGER(IntKi), PARAMETER :: M31N9TAye = 17208 - INTEGER(IntKi), PARAMETER :: M32N1TAye = 17209 - INTEGER(IntKi), PARAMETER :: M32N2TAye = 17210 - INTEGER(IntKi), PARAMETER :: M32N3TAye = 17211 - INTEGER(IntKi), PARAMETER :: M32N4TAye = 17212 - INTEGER(IntKi), PARAMETER :: M32N5TAye = 17213 - INTEGER(IntKi), PARAMETER :: M32N6TAye = 17214 - INTEGER(IntKi), PARAMETER :: M32N7TAye = 17215 - INTEGER(IntKi), PARAMETER :: M32N8TAye = 17216 - INTEGER(IntKi), PARAMETER :: M32N9TAye = 17217 - INTEGER(IntKi), PARAMETER :: M33N1TAye = 17218 - INTEGER(IntKi), PARAMETER :: M33N2TAye = 17219 - INTEGER(IntKi), PARAMETER :: M33N3TAye = 17220 - INTEGER(IntKi), PARAMETER :: M33N4TAye = 17221 - INTEGER(IntKi), PARAMETER :: M33N5TAye = 17222 - INTEGER(IntKi), PARAMETER :: M33N6TAye = 17223 - INTEGER(IntKi), PARAMETER :: M33N7TAye = 17224 - INTEGER(IntKi), PARAMETER :: M33N8TAye = 17225 - INTEGER(IntKi), PARAMETER :: M33N9TAye = 17226 - INTEGER(IntKi), PARAMETER :: M34N1TAye = 17227 - INTEGER(IntKi), PARAMETER :: M34N2TAye = 17228 - INTEGER(IntKi), PARAMETER :: M34N3TAye = 17229 - INTEGER(IntKi), PARAMETER :: M34N4TAye = 17230 - INTEGER(IntKi), PARAMETER :: M34N5TAye = 17231 - INTEGER(IntKi), PARAMETER :: M34N6TAye = 17232 - INTEGER(IntKi), PARAMETER :: M34N7TAye = 17233 - INTEGER(IntKi), PARAMETER :: M34N8TAye = 17234 - INTEGER(IntKi), PARAMETER :: M34N9TAye = 17235 - INTEGER(IntKi), PARAMETER :: M35N1TAye = 17236 - INTEGER(IntKi), PARAMETER :: M35N2TAye = 17237 - INTEGER(IntKi), PARAMETER :: M35N3TAye = 17238 - INTEGER(IntKi), PARAMETER :: M35N4TAye = 17239 - INTEGER(IntKi), PARAMETER :: M35N5TAye = 17240 - INTEGER(IntKi), PARAMETER :: M35N6TAye = 17241 - INTEGER(IntKi), PARAMETER :: M35N7TAye = 17242 - INTEGER(IntKi), PARAMETER :: M35N8TAye = 17243 - INTEGER(IntKi), PARAMETER :: M35N9TAye = 17244 - INTEGER(IntKi), PARAMETER :: M36N1TAye = 17245 - INTEGER(IntKi), PARAMETER :: M36N2TAye = 17246 - INTEGER(IntKi), PARAMETER :: M36N3TAye = 17247 - INTEGER(IntKi), PARAMETER :: M36N4TAye = 17248 - INTEGER(IntKi), PARAMETER :: M36N5TAye = 17249 - INTEGER(IntKi), PARAMETER :: M36N6TAye = 17250 - INTEGER(IntKi), PARAMETER :: M36N7TAye = 17251 - INTEGER(IntKi), PARAMETER :: M36N8TAye = 17252 - INTEGER(IntKi), PARAMETER :: M36N9TAye = 17253 - INTEGER(IntKi), PARAMETER :: M37N1TAye = 17254 - INTEGER(IntKi), PARAMETER :: M37N2TAye = 17255 - INTEGER(IntKi), PARAMETER :: M37N3TAye = 17256 - INTEGER(IntKi), PARAMETER :: M37N4TAye = 17257 - INTEGER(IntKi), PARAMETER :: M37N5TAye = 17258 - INTEGER(IntKi), PARAMETER :: M37N6TAye = 17259 - INTEGER(IntKi), PARAMETER :: M37N7TAye = 17260 - INTEGER(IntKi), PARAMETER :: M37N8TAye = 17261 - INTEGER(IntKi), PARAMETER :: M37N9TAye = 17262 - INTEGER(IntKi), PARAMETER :: M38N1TAye = 17263 - INTEGER(IntKi), PARAMETER :: M38N2TAye = 17264 - INTEGER(IntKi), PARAMETER :: M38N3TAye = 17265 - INTEGER(IntKi), PARAMETER :: M38N4TAye = 17266 - INTEGER(IntKi), PARAMETER :: M38N5TAye = 17267 - INTEGER(IntKi), PARAMETER :: M38N6TAye = 17268 - INTEGER(IntKi), PARAMETER :: M38N7TAye = 17269 - INTEGER(IntKi), PARAMETER :: M38N8TAye = 17270 - INTEGER(IntKi), PARAMETER :: M38N9TAye = 17271 - INTEGER(IntKi), PARAMETER :: M39N1TAye = 17272 - INTEGER(IntKi), PARAMETER :: M39N2TAye = 17273 - INTEGER(IntKi), PARAMETER :: M39N3TAye = 17274 - INTEGER(IntKi), PARAMETER :: M39N4TAye = 17275 - INTEGER(IntKi), PARAMETER :: M39N5TAye = 17276 - INTEGER(IntKi), PARAMETER :: M39N6TAye = 17277 - INTEGER(IntKi), PARAMETER :: M39N7TAye = 17278 - INTEGER(IntKi), PARAMETER :: M39N8TAye = 17279 - INTEGER(IntKi), PARAMETER :: M39N9TAye = 17280 - INTEGER(IntKi), PARAMETER :: M40N1TAye = 17281 - INTEGER(IntKi), PARAMETER :: M40N2TAye = 17282 - INTEGER(IntKi), PARAMETER :: M40N3TAye = 17283 - INTEGER(IntKi), PARAMETER :: M40N4TAye = 17284 - INTEGER(IntKi), PARAMETER :: M40N5TAye = 17285 - INTEGER(IntKi), PARAMETER :: M40N6TAye = 17286 - INTEGER(IntKi), PARAMETER :: M40N7TAye = 17287 - INTEGER(IntKi), PARAMETER :: M40N8TAye = 17288 - INTEGER(IntKi), PARAMETER :: M40N9TAye = 17289 - INTEGER(IntKi), PARAMETER :: M41N1TAye = 17290 - INTEGER(IntKi), PARAMETER :: M41N2TAye = 17291 - INTEGER(IntKi), PARAMETER :: M41N3TAye = 17292 - INTEGER(IntKi), PARAMETER :: M41N4TAye = 17293 - INTEGER(IntKi), PARAMETER :: M41N5TAye = 17294 - INTEGER(IntKi), PARAMETER :: M41N6TAye = 17295 - INTEGER(IntKi), PARAMETER :: M41N7TAye = 17296 - INTEGER(IntKi), PARAMETER :: M41N8TAye = 17297 - INTEGER(IntKi), PARAMETER :: M41N9TAye = 17298 - INTEGER(IntKi), PARAMETER :: M42N1TAye = 17299 - INTEGER(IntKi), PARAMETER :: M42N2TAye = 17300 - INTEGER(IntKi), PARAMETER :: M42N3TAye = 17301 - INTEGER(IntKi), PARAMETER :: M42N4TAye = 17302 - INTEGER(IntKi), PARAMETER :: M42N5TAye = 17303 - INTEGER(IntKi), PARAMETER :: M42N6TAye = 17304 - INTEGER(IntKi), PARAMETER :: M42N7TAye = 17305 - INTEGER(IntKi), PARAMETER :: M42N8TAye = 17306 - INTEGER(IntKi), PARAMETER :: M42N9TAye = 17307 - INTEGER(IntKi), PARAMETER :: M43N1TAye = 17308 - INTEGER(IntKi), PARAMETER :: M43N2TAye = 17309 - INTEGER(IntKi), PARAMETER :: M43N3TAye = 17310 - INTEGER(IntKi), PARAMETER :: M43N4TAye = 17311 - INTEGER(IntKi), PARAMETER :: M43N5TAye = 17312 - INTEGER(IntKi), PARAMETER :: M43N6TAye = 17313 - INTEGER(IntKi), PARAMETER :: M43N7TAye = 17314 - INTEGER(IntKi), PARAMETER :: M43N8TAye = 17315 - INTEGER(IntKi), PARAMETER :: M43N9TAye = 17316 - INTEGER(IntKi), PARAMETER :: M44N1TAye = 17317 - INTEGER(IntKi), PARAMETER :: M44N2TAye = 17318 - INTEGER(IntKi), PARAMETER :: M44N3TAye = 17319 - INTEGER(IntKi), PARAMETER :: M44N4TAye = 17320 - INTEGER(IntKi), PARAMETER :: M44N5TAye = 17321 - INTEGER(IntKi), PARAMETER :: M44N6TAye = 17322 - INTEGER(IntKi), PARAMETER :: M44N7TAye = 17323 - INTEGER(IntKi), PARAMETER :: M44N8TAye = 17324 - INTEGER(IntKi), PARAMETER :: M44N9TAye = 17325 - INTEGER(IntKi), PARAMETER :: M45N1TAye = 17326 - INTEGER(IntKi), PARAMETER :: M45N2TAye = 17327 - INTEGER(IntKi), PARAMETER :: M45N3TAye = 17328 - INTEGER(IntKi), PARAMETER :: M45N4TAye = 17329 - INTEGER(IntKi), PARAMETER :: M45N5TAye = 17330 - INTEGER(IntKi), PARAMETER :: M45N6TAye = 17331 - INTEGER(IntKi), PARAMETER :: M45N7TAye = 17332 - INTEGER(IntKi), PARAMETER :: M45N8TAye = 17333 - INTEGER(IntKi), PARAMETER :: M45N9TAye = 17334 - INTEGER(IntKi), PARAMETER :: M46N1TAye = 17335 - INTEGER(IntKi), PARAMETER :: M46N2TAye = 17336 - INTEGER(IntKi), PARAMETER :: M46N3TAye = 17337 - INTEGER(IntKi), PARAMETER :: M46N4TAye = 17338 - INTEGER(IntKi), PARAMETER :: M46N5TAye = 17339 - INTEGER(IntKi), PARAMETER :: M46N6TAye = 17340 - INTEGER(IntKi), PARAMETER :: M46N7TAye = 17341 - INTEGER(IntKi), PARAMETER :: M46N8TAye = 17342 - INTEGER(IntKi), PARAMETER :: M46N9TAye = 17343 - INTEGER(IntKi), PARAMETER :: M47N1TAye = 17344 - INTEGER(IntKi), PARAMETER :: M47N2TAye = 17345 - INTEGER(IntKi), PARAMETER :: M47N3TAye = 17346 - INTEGER(IntKi), PARAMETER :: M47N4TAye = 17347 - INTEGER(IntKi), PARAMETER :: M47N5TAye = 17348 - INTEGER(IntKi), PARAMETER :: M47N6TAye = 17349 - INTEGER(IntKi), PARAMETER :: M47N7TAye = 17350 - INTEGER(IntKi), PARAMETER :: M47N8TAye = 17351 - INTEGER(IntKi), PARAMETER :: M47N9TAye = 17352 - INTEGER(IntKi), PARAMETER :: M48N1TAye = 17353 - INTEGER(IntKi), PARAMETER :: M48N2TAye = 17354 - INTEGER(IntKi), PARAMETER :: M48N3TAye = 17355 - INTEGER(IntKi), PARAMETER :: M48N4TAye = 17356 - INTEGER(IntKi), PARAMETER :: M48N5TAye = 17357 - INTEGER(IntKi), PARAMETER :: M48N6TAye = 17358 - INTEGER(IntKi), PARAMETER :: M48N7TAye = 17359 - INTEGER(IntKi), PARAMETER :: M48N8TAye = 17360 - INTEGER(IntKi), PARAMETER :: M48N9TAye = 17361 - INTEGER(IntKi), PARAMETER :: M49N1TAye = 17362 - INTEGER(IntKi), PARAMETER :: M49N2TAye = 17363 - INTEGER(IntKi), PARAMETER :: M49N3TAye = 17364 - INTEGER(IntKi), PARAMETER :: M49N4TAye = 17365 - INTEGER(IntKi), PARAMETER :: M49N5TAye = 17366 - INTEGER(IntKi), PARAMETER :: M49N6TAye = 17367 - INTEGER(IntKi), PARAMETER :: M49N7TAye = 17368 - INTEGER(IntKi), PARAMETER :: M49N8TAye = 17369 - INTEGER(IntKi), PARAMETER :: M49N9TAye = 17370 - INTEGER(IntKi), PARAMETER :: M50N1TAye = 17371 - INTEGER(IntKi), PARAMETER :: M50N2TAye = 17372 - INTEGER(IntKi), PARAMETER :: M50N3TAye = 17373 - INTEGER(IntKi), PARAMETER :: M50N4TAye = 17374 - INTEGER(IntKi), PARAMETER :: M50N5TAye = 17375 - INTEGER(IntKi), PARAMETER :: M50N6TAye = 17376 - INTEGER(IntKi), PARAMETER :: M50N7TAye = 17377 - INTEGER(IntKi), PARAMETER :: M50N8TAye = 17378 - INTEGER(IntKi), PARAMETER :: M50N9TAye = 17379 - INTEGER(IntKi), PARAMETER :: M51N1TAye = 17380 - INTEGER(IntKi), PARAMETER :: M51N2TAye = 17381 - INTEGER(IntKi), PARAMETER :: M51N3TAye = 17382 - INTEGER(IntKi), PARAMETER :: M51N4TAye = 17383 - INTEGER(IntKi), PARAMETER :: M51N5TAye = 17384 - INTEGER(IntKi), PARAMETER :: M51N6TAye = 17385 - INTEGER(IntKi), PARAMETER :: M51N7TAye = 17386 - INTEGER(IntKi), PARAMETER :: M51N8TAye = 17387 - INTEGER(IntKi), PARAMETER :: M51N9TAye = 17388 - INTEGER(IntKi), PARAMETER :: M52N1TAye = 17389 - INTEGER(IntKi), PARAMETER :: M52N2TAye = 17390 - INTEGER(IntKi), PARAMETER :: M52N3TAye = 17391 - INTEGER(IntKi), PARAMETER :: M52N4TAye = 17392 - INTEGER(IntKi), PARAMETER :: M52N5TAye = 17393 - INTEGER(IntKi), PARAMETER :: M52N6TAye = 17394 - INTEGER(IntKi), PARAMETER :: M52N7TAye = 17395 - INTEGER(IntKi), PARAMETER :: M52N8TAye = 17396 - INTEGER(IntKi), PARAMETER :: M52N9TAye = 17397 - INTEGER(IntKi), PARAMETER :: M53N1TAye = 17398 - INTEGER(IntKi), PARAMETER :: M53N2TAye = 17399 - INTEGER(IntKi), PARAMETER :: M53N3TAye = 17400 - INTEGER(IntKi), PARAMETER :: M53N4TAye = 17401 - INTEGER(IntKi), PARAMETER :: M53N5TAye = 17402 - INTEGER(IntKi), PARAMETER :: M53N6TAye = 17403 - INTEGER(IntKi), PARAMETER :: M53N7TAye = 17404 - INTEGER(IntKi), PARAMETER :: M53N8TAye = 17405 - INTEGER(IntKi), PARAMETER :: M53N9TAye = 17406 - INTEGER(IntKi), PARAMETER :: M54N1TAye = 17407 - INTEGER(IntKi), PARAMETER :: M54N2TAye = 17408 - INTEGER(IntKi), PARAMETER :: M54N3TAye = 17409 - INTEGER(IntKi), PARAMETER :: M54N4TAye = 17410 - INTEGER(IntKi), PARAMETER :: M54N5TAye = 17411 - INTEGER(IntKi), PARAMETER :: M54N6TAye = 17412 - INTEGER(IntKi), PARAMETER :: M54N7TAye = 17413 - INTEGER(IntKi), PARAMETER :: M54N8TAye = 17414 - INTEGER(IntKi), PARAMETER :: M54N9TAye = 17415 - INTEGER(IntKi), PARAMETER :: M55N1TAye = 17416 - INTEGER(IntKi), PARAMETER :: M55N2TAye = 17417 - INTEGER(IntKi), PARAMETER :: M55N3TAye = 17418 - INTEGER(IntKi), PARAMETER :: M55N4TAye = 17419 - INTEGER(IntKi), PARAMETER :: M55N5TAye = 17420 - INTEGER(IntKi), PARAMETER :: M55N6TAye = 17421 - INTEGER(IntKi), PARAMETER :: M55N7TAye = 17422 - INTEGER(IntKi), PARAMETER :: M55N8TAye = 17423 - INTEGER(IntKi), PARAMETER :: M55N9TAye = 17424 - INTEGER(IntKi), PARAMETER :: M56N1TAye = 17425 - INTEGER(IntKi), PARAMETER :: M56N2TAye = 17426 - INTEGER(IntKi), PARAMETER :: M56N3TAye = 17427 - INTEGER(IntKi), PARAMETER :: M56N4TAye = 17428 - INTEGER(IntKi), PARAMETER :: M56N5TAye = 17429 - INTEGER(IntKi), PARAMETER :: M56N6TAye = 17430 - INTEGER(IntKi), PARAMETER :: M56N7TAye = 17431 - INTEGER(IntKi), PARAMETER :: M56N8TAye = 17432 - INTEGER(IntKi), PARAMETER :: M56N9TAye = 17433 - INTEGER(IntKi), PARAMETER :: M57N1TAye = 17434 - INTEGER(IntKi), PARAMETER :: M57N2TAye = 17435 - INTEGER(IntKi), PARAMETER :: M57N3TAye = 17436 - INTEGER(IntKi), PARAMETER :: M57N4TAye = 17437 - INTEGER(IntKi), PARAMETER :: M57N5TAye = 17438 - INTEGER(IntKi), PARAMETER :: M57N6TAye = 17439 - INTEGER(IntKi), PARAMETER :: M57N7TAye = 17440 - INTEGER(IntKi), PARAMETER :: M57N8TAye = 17441 - INTEGER(IntKi), PARAMETER :: M57N9TAye = 17442 - INTEGER(IntKi), PARAMETER :: M58N1TAye = 17443 - INTEGER(IntKi), PARAMETER :: M58N2TAye = 17444 - INTEGER(IntKi), PARAMETER :: M58N3TAye = 17445 - INTEGER(IntKi), PARAMETER :: M58N4TAye = 17446 - INTEGER(IntKi), PARAMETER :: M58N5TAye = 17447 - INTEGER(IntKi), PARAMETER :: M58N6TAye = 17448 - INTEGER(IntKi), PARAMETER :: M58N7TAye = 17449 - INTEGER(IntKi), PARAMETER :: M58N8TAye = 17450 - INTEGER(IntKi), PARAMETER :: M58N9TAye = 17451 - INTEGER(IntKi), PARAMETER :: M59N1TAye = 17452 - INTEGER(IntKi), PARAMETER :: M59N2TAye = 17453 - INTEGER(IntKi), PARAMETER :: M59N3TAye = 17454 - INTEGER(IntKi), PARAMETER :: M59N4TAye = 17455 - INTEGER(IntKi), PARAMETER :: M59N5TAye = 17456 - INTEGER(IntKi), PARAMETER :: M59N6TAye = 17457 - INTEGER(IntKi), PARAMETER :: M59N7TAye = 17458 - INTEGER(IntKi), PARAMETER :: M59N8TAye = 17459 - INTEGER(IntKi), PARAMETER :: M59N9TAye = 17460 - INTEGER(IntKi), PARAMETER :: M60N1TAye = 17461 - INTEGER(IntKi), PARAMETER :: M60N2TAye = 17462 - INTEGER(IntKi), PARAMETER :: M60N3TAye = 17463 - INTEGER(IntKi), PARAMETER :: M60N4TAye = 17464 - INTEGER(IntKi), PARAMETER :: M60N5TAye = 17465 - INTEGER(IntKi), PARAMETER :: M60N6TAye = 17466 - INTEGER(IntKi), PARAMETER :: M60N7TAye = 17467 - INTEGER(IntKi), PARAMETER :: M60N8TAye = 17468 - INTEGER(IntKi), PARAMETER :: M60N9TAye = 17469 - INTEGER(IntKi), PARAMETER :: M61N1TAye = 17470 - INTEGER(IntKi), PARAMETER :: M61N2TAye = 17471 - INTEGER(IntKi), PARAMETER :: M61N3TAye = 17472 - INTEGER(IntKi), PARAMETER :: M61N4TAye = 17473 - INTEGER(IntKi), PARAMETER :: M61N5TAye = 17474 - INTEGER(IntKi), PARAMETER :: M61N6TAye = 17475 - INTEGER(IntKi), PARAMETER :: M61N7TAye = 17476 - INTEGER(IntKi), PARAMETER :: M61N8TAye = 17477 - INTEGER(IntKi), PARAMETER :: M61N9TAye = 17478 - INTEGER(IntKi), PARAMETER :: M62N1TAye = 17479 - INTEGER(IntKi), PARAMETER :: M62N2TAye = 17480 - INTEGER(IntKi), PARAMETER :: M62N3TAye = 17481 - INTEGER(IntKi), PARAMETER :: M62N4TAye = 17482 - INTEGER(IntKi), PARAMETER :: M62N5TAye = 17483 - INTEGER(IntKi), PARAMETER :: M62N6TAye = 17484 - INTEGER(IntKi), PARAMETER :: M62N7TAye = 17485 - INTEGER(IntKi), PARAMETER :: M62N8TAye = 17486 - INTEGER(IntKi), PARAMETER :: M62N9TAye = 17487 - INTEGER(IntKi), PARAMETER :: M63N1TAye = 17488 - INTEGER(IntKi), PARAMETER :: M63N2TAye = 17489 - INTEGER(IntKi), PARAMETER :: M63N3TAye = 17490 - INTEGER(IntKi), PARAMETER :: M63N4TAye = 17491 - INTEGER(IntKi), PARAMETER :: M63N5TAye = 17492 - INTEGER(IntKi), PARAMETER :: M63N6TAye = 17493 - INTEGER(IntKi), PARAMETER :: M63N7TAye = 17494 - INTEGER(IntKi), PARAMETER :: M63N8TAye = 17495 - INTEGER(IntKi), PARAMETER :: M63N9TAye = 17496 - INTEGER(IntKi), PARAMETER :: M64N1TAye = 17497 - INTEGER(IntKi), PARAMETER :: M64N2TAye = 17498 - INTEGER(IntKi), PARAMETER :: M64N3TAye = 17499 - INTEGER(IntKi), PARAMETER :: M64N4TAye = 17500 - INTEGER(IntKi), PARAMETER :: M64N5TAye = 17501 - INTEGER(IntKi), PARAMETER :: M64N6TAye = 17502 - INTEGER(IntKi), PARAMETER :: M64N7TAye = 17503 - INTEGER(IntKi), PARAMETER :: M64N8TAye = 17504 - INTEGER(IntKi), PARAMETER :: M64N9TAye = 17505 - INTEGER(IntKi), PARAMETER :: M65N1TAye = 17506 - INTEGER(IntKi), PARAMETER :: M65N2TAye = 17507 - INTEGER(IntKi), PARAMETER :: M65N3TAye = 17508 - INTEGER(IntKi), PARAMETER :: M65N4TAye = 17509 - INTEGER(IntKi), PARAMETER :: M65N5TAye = 17510 - INTEGER(IntKi), PARAMETER :: M65N6TAye = 17511 - INTEGER(IntKi), PARAMETER :: M65N7TAye = 17512 - INTEGER(IntKi), PARAMETER :: M65N8TAye = 17513 - INTEGER(IntKi), PARAMETER :: M65N9TAye = 17514 - INTEGER(IntKi), PARAMETER :: M66N1TAye = 17515 - INTEGER(IntKi), PARAMETER :: M66N2TAye = 17516 - INTEGER(IntKi), PARAMETER :: M66N3TAye = 17517 - INTEGER(IntKi), PARAMETER :: M66N4TAye = 17518 - INTEGER(IntKi), PARAMETER :: M66N5TAye = 17519 - INTEGER(IntKi), PARAMETER :: M66N6TAye = 17520 - INTEGER(IntKi), PARAMETER :: M66N7TAye = 17521 - INTEGER(IntKi), PARAMETER :: M66N8TAye = 17522 - INTEGER(IntKi), PARAMETER :: M66N9TAye = 17523 - INTEGER(IntKi), PARAMETER :: M67N1TAye = 17524 - INTEGER(IntKi), PARAMETER :: M67N2TAye = 17525 - INTEGER(IntKi), PARAMETER :: M67N3TAye = 17526 - INTEGER(IntKi), PARAMETER :: M67N4TAye = 17527 - INTEGER(IntKi), PARAMETER :: M67N5TAye = 17528 - INTEGER(IntKi), PARAMETER :: M67N6TAye = 17529 - INTEGER(IntKi), PARAMETER :: M67N7TAye = 17530 - INTEGER(IntKi), PARAMETER :: M67N8TAye = 17531 - INTEGER(IntKi), PARAMETER :: M67N9TAye = 17532 - INTEGER(IntKi), PARAMETER :: M68N1TAye = 17533 - INTEGER(IntKi), PARAMETER :: M68N2TAye = 17534 - INTEGER(IntKi), PARAMETER :: M68N3TAye = 17535 - INTEGER(IntKi), PARAMETER :: M68N4TAye = 17536 - INTEGER(IntKi), PARAMETER :: M68N5TAye = 17537 - INTEGER(IntKi), PARAMETER :: M68N6TAye = 17538 - INTEGER(IntKi), PARAMETER :: M68N7TAye = 17539 - INTEGER(IntKi), PARAMETER :: M68N8TAye = 17540 - INTEGER(IntKi), PARAMETER :: M68N9TAye = 17541 - INTEGER(IntKi), PARAMETER :: M69N1TAye = 17542 - INTEGER(IntKi), PARAMETER :: M69N2TAye = 17543 - INTEGER(IntKi), PARAMETER :: M69N3TAye = 17544 - INTEGER(IntKi), PARAMETER :: M69N4TAye = 17545 - INTEGER(IntKi), PARAMETER :: M69N5TAye = 17546 - INTEGER(IntKi), PARAMETER :: M69N6TAye = 17547 - INTEGER(IntKi), PARAMETER :: M69N7TAye = 17548 - INTEGER(IntKi), PARAMETER :: M69N8TAye = 17549 - INTEGER(IntKi), PARAMETER :: M69N9TAye = 17550 - INTEGER(IntKi), PARAMETER :: M70N1TAye = 17551 - INTEGER(IntKi), PARAMETER :: M70N2TAye = 17552 - INTEGER(IntKi), PARAMETER :: M70N3TAye = 17553 - INTEGER(IntKi), PARAMETER :: M70N4TAye = 17554 - INTEGER(IntKi), PARAMETER :: M70N5TAye = 17555 - INTEGER(IntKi), PARAMETER :: M70N6TAye = 17556 - INTEGER(IntKi), PARAMETER :: M70N7TAye = 17557 - INTEGER(IntKi), PARAMETER :: M70N8TAye = 17558 - INTEGER(IntKi), PARAMETER :: M70N9TAye = 17559 - INTEGER(IntKi), PARAMETER :: M71N1TAye = 17560 - INTEGER(IntKi), PARAMETER :: M71N2TAye = 17561 - INTEGER(IntKi), PARAMETER :: M71N3TAye = 17562 - INTEGER(IntKi), PARAMETER :: M71N4TAye = 17563 - INTEGER(IntKi), PARAMETER :: M71N5TAye = 17564 - INTEGER(IntKi), PARAMETER :: M71N6TAye = 17565 - INTEGER(IntKi), PARAMETER :: M71N7TAye = 17566 - INTEGER(IntKi), PARAMETER :: M71N8TAye = 17567 - INTEGER(IntKi), PARAMETER :: M71N9TAye = 17568 - INTEGER(IntKi), PARAMETER :: M72N1TAye = 17569 - INTEGER(IntKi), PARAMETER :: M72N2TAye = 17570 - INTEGER(IntKi), PARAMETER :: M72N3TAye = 17571 - INTEGER(IntKi), PARAMETER :: M72N4TAye = 17572 - INTEGER(IntKi), PARAMETER :: M72N5TAye = 17573 - INTEGER(IntKi), PARAMETER :: M72N6TAye = 17574 - INTEGER(IntKi), PARAMETER :: M72N7TAye = 17575 - INTEGER(IntKi), PARAMETER :: M72N8TAye = 17576 - INTEGER(IntKi), PARAMETER :: M72N9TAye = 17577 - INTEGER(IntKi), PARAMETER :: M73N1TAye = 17578 - INTEGER(IntKi), PARAMETER :: M73N2TAye = 17579 - INTEGER(IntKi), PARAMETER :: M73N3TAye = 17580 - INTEGER(IntKi), PARAMETER :: M73N4TAye = 17581 - INTEGER(IntKi), PARAMETER :: M73N5TAye = 17582 - INTEGER(IntKi), PARAMETER :: M73N6TAye = 17583 - INTEGER(IntKi), PARAMETER :: M73N7TAye = 17584 - INTEGER(IntKi), PARAMETER :: M73N8TAye = 17585 - INTEGER(IntKi), PARAMETER :: M73N9TAye = 17586 - INTEGER(IntKi), PARAMETER :: M74N1TAye = 17587 - INTEGER(IntKi), PARAMETER :: M74N2TAye = 17588 - INTEGER(IntKi), PARAMETER :: M74N3TAye = 17589 - INTEGER(IntKi), PARAMETER :: M74N4TAye = 17590 - INTEGER(IntKi), PARAMETER :: M74N5TAye = 17591 - INTEGER(IntKi), PARAMETER :: M74N6TAye = 17592 - INTEGER(IntKi), PARAMETER :: M74N7TAye = 17593 - INTEGER(IntKi), PARAMETER :: M74N8TAye = 17594 - INTEGER(IntKi), PARAMETER :: M74N9TAye = 17595 - INTEGER(IntKi), PARAMETER :: M75N1TAye = 17596 - INTEGER(IntKi), PARAMETER :: M75N2TAye = 17597 - INTEGER(IntKi), PARAMETER :: M75N3TAye = 17598 - INTEGER(IntKi), PARAMETER :: M75N4TAye = 17599 - INTEGER(IntKi), PARAMETER :: M75N5TAye = 17600 - INTEGER(IntKi), PARAMETER :: M75N6TAye = 17601 - INTEGER(IntKi), PARAMETER :: M75N7TAye = 17602 - INTEGER(IntKi), PARAMETER :: M75N8TAye = 17603 - INTEGER(IntKi), PARAMETER :: M75N9TAye = 17604 - INTEGER(IntKi), PARAMETER :: M76N1TAye = 17605 - INTEGER(IntKi), PARAMETER :: M76N2TAye = 17606 - INTEGER(IntKi), PARAMETER :: M76N3TAye = 17607 - INTEGER(IntKi), PARAMETER :: M76N4TAye = 17608 - INTEGER(IntKi), PARAMETER :: M76N5TAye = 17609 - INTEGER(IntKi), PARAMETER :: M76N6TAye = 17610 - INTEGER(IntKi), PARAMETER :: M76N7TAye = 17611 - INTEGER(IntKi), PARAMETER :: M76N8TAye = 17612 - INTEGER(IntKi), PARAMETER :: M76N9TAye = 17613 - INTEGER(IntKi), PARAMETER :: M77N1TAye = 17614 - INTEGER(IntKi), PARAMETER :: M77N2TAye = 17615 - INTEGER(IntKi), PARAMETER :: M77N3TAye = 17616 - INTEGER(IntKi), PARAMETER :: M77N4TAye = 17617 - INTEGER(IntKi), PARAMETER :: M77N5TAye = 17618 - INTEGER(IntKi), PARAMETER :: M77N6TAye = 17619 - INTEGER(IntKi), PARAMETER :: M77N7TAye = 17620 - INTEGER(IntKi), PARAMETER :: M77N8TAye = 17621 - INTEGER(IntKi), PARAMETER :: M77N9TAye = 17622 - INTEGER(IntKi), PARAMETER :: M78N1TAye = 17623 - INTEGER(IntKi), PARAMETER :: M78N2TAye = 17624 - INTEGER(IntKi), PARAMETER :: M78N3TAye = 17625 - INTEGER(IntKi), PARAMETER :: M78N4TAye = 17626 - INTEGER(IntKi), PARAMETER :: M78N5TAye = 17627 - INTEGER(IntKi), PARAMETER :: M78N6TAye = 17628 - INTEGER(IntKi), PARAMETER :: M78N7TAye = 17629 - INTEGER(IntKi), PARAMETER :: M78N8TAye = 17630 - INTEGER(IntKi), PARAMETER :: M78N9TAye = 17631 - INTEGER(IntKi), PARAMETER :: M79N1TAye = 17632 - INTEGER(IntKi), PARAMETER :: M79N2TAye = 17633 - INTEGER(IntKi), PARAMETER :: M79N3TAye = 17634 - INTEGER(IntKi), PARAMETER :: M79N4TAye = 17635 - INTEGER(IntKi), PARAMETER :: M79N5TAye = 17636 - INTEGER(IntKi), PARAMETER :: M79N6TAye = 17637 - INTEGER(IntKi), PARAMETER :: M79N7TAye = 17638 - INTEGER(IntKi), PARAMETER :: M79N8TAye = 17639 - INTEGER(IntKi), PARAMETER :: M79N9TAye = 17640 - INTEGER(IntKi), PARAMETER :: M80N1TAye = 17641 - INTEGER(IntKi), PARAMETER :: M80N2TAye = 17642 - INTEGER(IntKi), PARAMETER :: M80N3TAye = 17643 - INTEGER(IntKi), PARAMETER :: M80N4TAye = 17644 - INTEGER(IntKi), PARAMETER :: M80N5TAye = 17645 - INTEGER(IntKi), PARAMETER :: M80N6TAye = 17646 - INTEGER(IntKi), PARAMETER :: M80N7TAye = 17647 - INTEGER(IntKi), PARAMETER :: M80N8TAye = 17648 - INTEGER(IntKi), PARAMETER :: M80N9TAye = 17649 - INTEGER(IntKi), PARAMETER :: M81N1TAye = 17650 - INTEGER(IntKi), PARAMETER :: M81N2TAye = 17651 - INTEGER(IntKi), PARAMETER :: M81N3TAye = 17652 - INTEGER(IntKi), PARAMETER :: M81N4TAye = 17653 - INTEGER(IntKi), PARAMETER :: M81N5TAye = 17654 - INTEGER(IntKi), PARAMETER :: M81N6TAye = 17655 - INTEGER(IntKi), PARAMETER :: M81N7TAye = 17656 - INTEGER(IntKi), PARAMETER :: M81N8TAye = 17657 - INTEGER(IntKi), PARAMETER :: M81N9TAye = 17658 - INTEGER(IntKi), PARAMETER :: M82N1TAye = 17659 - INTEGER(IntKi), PARAMETER :: M82N2TAye = 17660 - INTEGER(IntKi), PARAMETER :: M82N3TAye = 17661 - INTEGER(IntKi), PARAMETER :: M82N4TAye = 17662 - INTEGER(IntKi), PARAMETER :: M82N5TAye = 17663 - INTEGER(IntKi), PARAMETER :: M82N6TAye = 17664 - INTEGER(IntKi), PARAMETER :: M82N7TAye = 17665 - INTEGER(IntKi), PARAMETER :: M82N8TAye = 17666 - INTEGER(IntKi), PARAMETER :: M82N9TAye = 17667 - INTEGER(IntKi), PARAMETER :: M83N1TAye = 17668 - INTEGER(IntKi), PARAMETER :: M83N2TAye = 17669 - INTEGER(IntKi), PARAMETER :: M83N3TAye = 17670 - INTEGER(IntKi), PARAMETER :: M83N4TAye = 17671 - INTEGER(IntKi), PARAMETER :: M83N5TAye = 17672 - INTEGER(IntKi), PARAMETER :: M83N6TAye = 17673 - INTEGER(IntKi), PARAMETER :: M83N7TAye = 17674 - INTEGER(IntKi), PARAMETER :: M83N8TAye = 17675 - INTEGER(IntKi), PARAMETER :: M83N9TAye = 17676 - INTEGER(IntKi), PARAMETER :: M84N1TAye = 17677 - INTEGER(IntKi), PARAMETER :: M84N2TAye = 17678 - INTEGER(IntKi), PARAMETER :: M84N3TAye = 17679 - INTEGER(IntKi), PARAMETER :: M84N4TAye = 17680 - INTEGER(IntKi), PARAMETER :: M84N5TAye = 17681 - INTEGER(IntKi), PARAMETER :: M84N6TAye = 17682 - INTEGER(IntKi), PARAMETER :: M84N7TAye = 17683 - INTEGER(IntKi), PARAMETER :: M84N8TAye = 17684 - INTEGER(IntKi), PARAMETER :: M84N9TAye = 17685 - INTEGER(IntKi), PARAMETER :: M85N1TAye = 17686 - INTEGER(IntKi), PARAMETER :: M85N2TAye = 17687 - INTEGER(IntKi), PARAMETER :: M85N3TAye = 17688 - INTEGER(IntKi), PARAMETER :: M85N4TAye = 17689 - INTEGER(IntKi), PARAMETER :: M85N5TAye = 17690 - INTEGER(IntKi), PARAMETER :: M85N6TAye = 17691 - INTEGER(IntKi), PARAMETER :: M85N7TAye = 17692 - INTEGER(IntKi), PARAMETER :: M85N8TAye = 17693 - INTEGER(IntKi), PARAMETER :: M85N9TAye = 17694 - INTEGER(IntKi), PARAMETER :: M86N1TAye = 17695 - INTEGER(IntKi), PARAMETER :: M86N2TAye = 17696 - INTEGER(IntKi), PARAMETER :: M86N3TAye = 17697 - INTEGER(IntKi), PARAMETER :: M86N4TAye = 17698 - INTEGER(IntKi), PARAMETER :: M86N5TAye = 17699 - INTEGER(IntKi), PARAMETER :: M86N6TAye = 17700 - INTEGER(IntKi), PARAMETER :: M86N7TAye = 17701 - INTEGER(IntKi), PARAMETER :: M86N8TAye = 17702 - INTEGER(IntKi), PARAMETER :: M86N9TAye = 17703 - INTEGER(IntKi), PARAMETER :: M87N1TAye = 17704 - INTEGER(IntKi), PARAMETER :: M87N2TAye = 17705 - INTEGER(IntKi), PARAMETER :: M87N3TAye = 17706 - INTEGER(IntKi), PARAMETER :: M87N4TAye = 17707 - INTEGER(IntKi), PARAMETER :: M87N5TAye = 17708 - INTEGER(IntKi), PARAMETER :: M87N6TAye = 17709 - INTEGER(IntKi), PARAMETER :: M87N7TAye = 17710 - INTEGER(IntKi), PARAMETER :: M87N8TAye = 17711 - INTEGER(IntKi), PARAMETER :: M87N9TAye = 17712 - INTEGER(IntKi), PARAMETER :: M88N1TAye = 17713 - INTEGER(IntKi), PARAMETER :: M88N2TAye = 17714 - INTEGER(IntKi), PARAMETER :: M88N3TAye = 17715 - INTEGER(IntKi), PARAMETER :: M88N4TAye = 17716 - INTEGER(IntKi), PARAMETER :: M88N5TAye = 17717 - INTEGER(IntKi), PARAMETER :: M88N6TAye = 17718 - INTEGER(IntKi), PARAMETER :: M88N7TAye = 17719 - INTEGER(IntKi), PARAMETER :: M88N8TAye = 17720 - INTEGER(IntKi), PARAMETER :: M88N9TAye = 17721 - INTEGER(IntKi), PARAMETER :: M89N1TAye = 17722 - INTEGER(IntKi), PARAMETER :: M89N2TAye = 17723 - INTEGER(IntKi), PARAMETER :: M89N3TAye = 17724 - INTEGER(IntKi), PARAMETER :: M89N4TAye = 17725 - INTEGER(IntKi), PARAMETER :: M89N5TAye = 17726 - INTEGER(IntKi), PARAMETER :: M89N6TAye = 17727 - INTEGER(IntKi), PARAMETER :: M89N7TAye = 17728 - INTEGER(IntKi), PARAMETER :: M89N8TAye = 17729 - INTEGER(IntKi), PARAMETER :: M89N9TAye = 17730 - INTEGER(IntKi), PARAMETER :: M90N1TAye = 17731 - INTEGER(IntKi), PARAMETER :: M90N2TAye = 17732 - INTEGER(IntKi), PARAMETER :: M90N3TAye = 17733 - INTEGER(IntKi), PARAMETER :: M90N4TAye = 17734 - INTEGER(IntKi), PARAMETER :: M90N5TAye = 17735 - INTEGER(IntKi), PARAMETER :: M90N6TAye = 17736 - INTEGER(IntKi), PARAMETER :: M90N7TAye = 17737 - INTEGER(IntKi), PARAMETER :: M90N8TAye = 17738 - INTEGER(IntKi), PARAMETER :: M90N9TAye = 17739 - INTEGER(IntKi), PARAMETER :: M91N1TAye = 17740 - INTEGER(IntKi), PARAMETER :: M91N2TAye = 17741 - INTEGER(IntKi), PARAMETER :: M91N3TAye = 17742 - INTEGER(IntKi), PARAMETER :: M91N4TAye = 17743 - INTEGER(IntKi), PARAMETER :: M91N5TAye = 17744 - INTEGER(IntKi), PARAMETER :: M91N6TAye = 17745 - INTEGER(IntKi), PARAMETER :: M91N7TAye = 17746 - INTEGER(IntKi), PARAMETER :: M91N8TAye = 17747 - INTEGER(IntKi), PARAMETER :: M91N9TAye = 17748 - INTEGER(IntKi), PARAMETER :: M92N1TAye = 17749 - INTEGER(IntKi), PARAMETER :: M92N2TAye = 17750 - INTEGER(IntKi), PARAMETER :: M92N3TAye = 17751 - INTEGER(IntKi), PARAMETER :: M92N4TAye = 17752 - INTEGER(IntKi), PARAMETER :: M92N5TAye = 17753 - INTEGER(IntKi), PARAMETER :: M92N6TAye = 17754 - INTEGER(IntKi), PARAMETER :: M92N7TAye = 17755 - INTEGER(IntKi), PARAMETER :: M92N8TAye = 17756 - INTEGER(IntKi), PARAMETER :: M92N9TAye = 17757 - INTEGER(IntKi), PARAMETER :: M93N1TAye = 17758 - INTEGER(IntKi), PARAMETER :: M93N2TAye = 17759 - INTEGER(IntKi), PARAMETER :: M93N3TAye = 17760 - INTEGER(IntKi), PARAMETER :: M93N4TAye = 17761 - INTEGER(IntKi), PARAMETER :: M93N5TAye = 17762 - INTEGER(IntKi), PARAMETER :: M93N6TAye = 17763 - INTEGER(IntKi), PARAMETER :: M93N7TAye = 17764 - INTEGER(IntKi), PARAMETER :: M93N8TAye = 17765 - INTEGER(IntKi), PARAMETER :: M93N9TAye = 17766 - INTEGER(IntKi), PARAMETER :: M94N1TAye = 17767 - INTEGER(IntKi), PARAMETER :: M94N2TAye = 17768 - INTEGER(IntKi), PARAMETER :: M94N3TAye = 17769 - INTEGER(IntKi), PARAMETER :: M94N4TAye = 17770 - INTEGER(IntKi), PARAMETER :: M94N5TAye = 17771 - INTEGER(IntKi), PARAMETER :: M94N6TAye = 17772 - INTEGER(IntKi), PARAMETER :: M94N7TAye = 17773 - INTEGER(IntKi), PARAMETER :: M94N8TAye = 17774 - INTEGER(IntKi), PARAMETER :: M94N9TAye = 17775 - INTEGER(IntKi), PARAMETER :: M95N1TAye = 17776 - INTEGER(IntKi), PARAMETER :: M95N2TAye = 17777 - INTEGER(IntKi), PARAMETER :: M95N3TAye = 17778 - INTEGER(IntKi), PARAMETER :: M95N4TAye = 17779 - INTEGER(IntKi), PARAMETER :: M95N5TAye = 17780 - INTEGER(IntKi), PARAMETER :: M95N6TAye = 17781 - INTEGER(IntKi), PARAMETER :: M95N7TAye = 17782 - INTEGER(IntKi), PARAMETER :: M95N8TAye = 17783 - INTEGER(IntKi), PARAMETER :: M95N9TAye = 17784 - INTEGER(IntKi), PARAMETER :: M96N1TAye = 17785 - INTEGER(IntKi), PARAMETER :: M96N2TAye = 17786 - INTEGER(IntKi), PARAMETER :: M96N3TAye = 17787 - INTEGER(IntKi), PARAMETER :: M96N4TAye = 17788 - INTEGER(IntKi), PARAMETER :: M96N5TAye = 17789 - INTEGER(IntKi), PARAMETER :: M96N6TAye = 17790 - INTEGER(IntKi), PARAMETER :: M96N7TAye = 17791 - INTEGER(IntKi), PARAMETER :: M96N8TAye = 17792 - INTEGER(IntKi), PARAMETER :: M96N9TAye = 17793 - INTEGER(IntKi), PARAMETER :: M97N1TAye = 17794 - INTEGER(IntKi), PARAMETER :: M97N2TAye = 17795 - INTEGER(IntKi), PARAMETER :: M97N3TAye = 17796 - INTEGER(IntKi), PARAMETER :: M97N4TAye = 17797 - INTEGER(IntKi), PARAMETER :: M97N5TAye = 17798 - INTEGER(IntKi), PARAMETER :: M97N6TAye = 17799 - INTEGER(IntKi), PARAMETER :: M97N7TAye = 17800 - INTEGER(IntKi), PARAMETER :: M97N8TAye = 17801 - INTEGER(IntKi), PARAMETER :: M97N9TAye = 17802 - INTEGER(IntKi), PARAMETER :: M98N1TAye = 17803 - INTEGER(IntKi), PARAMETER :: M98N2TAye = 17804 - INTEGER(IntKi), PARAMETER :: M98N3TAye = 17805 - INTEGER(IntKi), PARAMETER :: M98N4TAye = 17806 - INTEGER(IntKi), PARAMETER :: M98N5TAye = 17807 - INTEGER(IntKi), PARAMETER :: M98N6TAye = 17808 - INTEGER(IntKi), PARAMETER :: M98N7TAye = 17809 - INTEGER(IntKi), PARAMETER :: M98N8TAye = 17810 - INTEGER(IntKi), PARAMETER :: M98N9TAye = 17811 - INTEGER(IntKi), PARAMETER :: M99N1TAye = 17812 - INTEGER(IntKi), PARAMETER :: M99N2TAye = 17813 - INTEGER(IntKi), PARAMETER :: M99N3TAye = 17814 - INTEGER(IntKi), PARAMETER :: M99N4TAye = 17815 - INTEGER(IntKi), PARAMETER :: M99N5TAye = 17816 - INTEGER(IntKi), PARAMETER :: M99N6TAye = 17817 - INTEGER(IntKi), PARAMETER :: M99N7TAye = 17818 - INTEGER(IntKi), PARAMETER :: M99N8TAye = 17819 - INTEGER(IntKi), PARAMETER :: M99N9TAye = 17820 - INTEGER(IntKi), PARAMETER :: M01N1TAze = 17821 - INTEGER(IntKi), PARAMETER :: M01N2TAze = 17822 - INTEGER(IntKi), PARAMETER :: M01N3TAze = 17823 - INTEGER(IntKi), PARAMETER :: M01N4TAze = 17824 - INTEGER(IntKi), PARAMETER :: M01N5TAze = 17825 - INTEGER(IntKi), PARAMETER :: M01N6TAze = 17826 - INTEGER(IntKi), PARAMETER :: M01N7TAze = 17827 - INTEGER(IntKi), PARAMETER :: M01N8TAze = 17828 - INTEGER(IntKi), PARAMETER :: M01N9TAze = 17829 - INTEGER(IntKi), PARAMETER :: M02N1TAze = 17830 - INTEGER(IntKi), PARAMETER :: M02N2TAze = 17831 - INTEGER(IntKi), PARAMETER :: M02N3TAze = 17832 - INTEGER(IntKi), PARAMETER :: M02N4TAze = 17833 - INTEGER(IntKi), PARAMETER :: M02N5TAze = 17834 - INTEGER(IntKi), PARAMETER :: M02N6TAze = 17835 - INTEGER(IntKi), PARAMETER :: M02N7TAze = 17836 - INTEGER(IntKi), PARAMETER :: M02N8TAze = 17837 - INTEGER(IntKi), PARAMETER :: M02N9TAze = 17838 - INTEGER(IntKi), PARAMETER :: M03N1TAze = 17839 - INTEGER(IntKi), PARAMETER :: M03N2TAze = 17840 - INTEGER(IntKi), PARAMETER :: M03N3TAze = 17841 - INTEGER(IntKi), PARAMETER :: M03N4TAze = 17842 - INTEGER(IntKi), PARAMETER :: M03N5TAze = 17843 - INTEGER(IntKi), PARAMETER :: M03N6TAze = 17844 - INTEGER(IntKi), PARAMETER :: M03N7TAze = 17845 - INTEGER(IntKi), PARAMETER :: M03N8TAze = 17846 - INTEGER(IntKi), PARAMETER :: M03N9TAze = 17847 - INTEGER(IntKi), PARAMETER :: M04N1TAze = 17848 - INTEGER(IntKi), PARAMETER :: M04N2TAze = 17849 - INTEGER(IntKi), PARAMETER :: M04N3TAze = 17850 - INTEGER(IntKi), PARAMETER :: M04N4TAze = 17851 - INTEGER(IntKi), PARAMETER :: M04N5TAze = 17852 - INTEGER(IntKi), PARAMETER :: M04N6TAze = 17853 - INTEGER(IntKi), PARAMETER :: M04N7TAze = 17854 - INTEGER(IntKi), PARAMETER :: M04N8TAze = 17855 - INTEGER(IntKi), PARAMETER :: M04N9TAze = 17856 - INTEGER(IntKi), PARAMETER :: M05N1TAze = 17857 - INTEGER(IntKi), PARAMETER :: M05N2TAze = 17858 - INTEGER(IntKi), PARAMETER :: M05N3TAze = 17859 - INTEGER(IntKi), PARAMETER :: M05N4TAze = 17860 - INTEGER(IntKi), PARAMETER :: M05N5TAze = 17861 - INTEGER(IntKi), PARAMETER :: M05N6TAze = 17862 - INTEGER(IntKi), PARAMETER :: M05N7TAze = 17863 - INTEGER(IntKi), PARAMETER :: M05N8TAze = 17864 - INTEGER(IntKi), PARAMETER :: M05N9TAze = 17865 - INTEGER(IntKi), PARAMETER :: M06N1TAze = 17866 - INTEGER(IntKi), PARAMETER :: M06N2TAze = 17867 - INTEGER(IntKi), PARAMETER :: M06N3TAze = 17868 - INTEGER(IntKi), PARAMETER :: M06N4TAze = 17869 - INTEGER(IntKi), PARAMETER :: M06N5TAze = 17870 - INTEGER(IntKi), PARAMETER :: M06N6TAze = 17871 - INTEGER(IntKi), PARAMETER :: M06N7TAze = 17872 - INTEGER(IntKi), PARAMETER :: M06N8TAze = 17873 - INTEGER(IntKi), PARAMETER :: M06N9TAze = 17874 - INTEGER(IntKi), PARAMETER :: M07N1TAze = 17875 - INTEGER(IntKi), PARAMETER :: M07N2TAze = 17876 - INTEGER(IntKi), PARAMETER :: M07N3TAze = 17877 - INTEGER(IntKi), PARAMETER :: M07N4TAze = 17878 - INTEGER(IntKi), PARAMETER :: M07N5TAze = 17879 - INTEGER(IntKi), PARAMETER :: M07N6TAze = 17880 - INTEGER(IntKi), PARAMETER :: M07N7TAze = 17881 - INTEGER(IntKi), PARAMETER :: M07N8TAze = 17882 - INTEGER(IntKi), PARAMETER :: M07N9TAze = 17883 - INTEGER(IntKi), PARAMETER :: M08N1TAze = 17884 - INTEGER(IntKi), PARAMETER :: M08N2TAze = 17885 - INTEGER(IntKi), PARAMETER :: M08N3TAze = 17886 - INTEGER(IntKi), PARAMETER :: M08N4TAze = 17887 - INTEGER(IntKi), PARAMETER :: M08N5TAze = 17888 - INTEGER(IntKi), PARAMETER :: M08N6TAze = 17889 - INTEGER(IntKi), PARAMETER :: M08N7TAze = 17890 - INTEGER(IntKi), PARAMETER :: M08N8TAze = 17891 - INTEGER(IntKi), PARAMETER :: M08N9TAze = 17892 - INTEGER(IntKi), PARAMETER :: M09N1TAze = 17893 - INTEGER(IntKi), PARAMETER :: M09N2TAze = 17894 - INTEGER(IntKi), PARAMETER :: M09N3TAze = 17895 - INTEGER(IntKi), PARAMETER :: M09N4TAze = 17896 - INTEGER(IntKi), PARAMETER :: M09N5TAze = 17897 - INTEGER(IntKi), PARAMETER :: M09N6TAze = 17898 - INTEGER(IntKi), PARAMETER :: M09N7TAze = 17899 - INTEGER(IntKi), PARAMETER :: M09N8TAze = 17900 - INTEGER(IntKi), PARAMETER :: M09N9TAze = 17901 - INTEGER(IntKi), PARAMETER :: M10N1TAze = 17902 - INTEGER(IntKi), PARAMETER :: M10N2TAze = 17903 - INTEGER(IntKi), PARAMETER :: M10N3TAze = 17904 - INTEGER(IntKi), PARAMETER :: M10N4TAze = 17905 - INTEGER(IntKi), PARAMETER :: M10N5TAze = 17906 - INTEGER(IntKi), PARAMETER :: M10N6TAze = 17907 - INTEGER(IntKi), PARAMETER :: M10N7TAze = 17908 - INTEGER(IntKi), PARAMETER :: M10N8TAze = 17909 - INTEGER(IntKi), PARAMETER :: M10N9TAze = 17910 - INTEGER(IntKi), PARAMETER :: M11N1TAze = 17911 - INTEGER(IntKi), PARAMETER :: M11N2TAze = 17912 - INTEGER(IntKi), PARAMETER :: M11N3TAze = 17913 - INTEGER(IntKi), PARAMETER :: M11N4TAze = 17914 - INTEGER(IntKi), PARAMETER :: M11N5TAze = 17915 - INTEGER(IntKi), PARAMETER :: M11N6TAze = 17916 - INTEGER(IntKi), PARAMETER :: M11N7TAze = 17917 - INTEGER(IntKi), PARAMETER :: M11N8TAze = 17918 - INTEGER(IntKi), PARAMETER :: M11N9TAze = 17919 - INTEGER(IntKi), PARAMETER :: M12N1TAze = 17920 - INTEGER(IntKi), PARAMETER :: M12N2TAze = 17921 - INTEGER(IntKi), PARAMETER :: M12N3TAze = 17922 - INTEGER(IntKi), PARAMETER :: M12N4TAze = 17923 - INTEGER(IntKi), PARAMETER :: M12N5TAze = 17924 - INTEGER(IntKi), PARAMETER :: M12N6TAze = 17925 - INTEGER(IntKi), PARAMETER :: M12N7TAze = 17926 - INTEGER(IntKi), PARAMETER :: M12N8TAze = 17927 - INTEGER(IntKi), PARAMETER :: M12N9TAze = 17928 - INTEGER(IntKi), PARAMETER :: M13N1TAze = 17929 - INTEGER(IntKi), PARAMETER :: M13N2TAze = 17930 - INTEGER(IntKi), PARAMETER :: M13N3TAze = 17931 - INTEGER(IntKi), PARAMETER :: M13N4TAze = 17932 - INTEGER(IntKi), PARAMETER :: M13N5TAze = 17933 - INTEGER(IntKi), PARAMETER :: M13N6TAze = 17934 - INTEGER(IntKi), PARAMETER :: M13N7TAze = 17935 - INTEGER(IntKi), PARAMETER :: M13N8TAze = 17936 - INTEGER(IntKi), PARAMETER :: M13N9TAze = 17937 - INTEGER(IntKi), PARAMETER :: M14N1TAze = 17938 - INTEGER(IntKi), PARAMETER :: M14N2TAze = 17939 - INTEGER(IntKi), PARAMETER :: M14N3TAze = 17940 - INTEGER(IntKi), PARAMETER :: M14N4TAze = 17941 - INTEGER(IntKi), PARAMETER :: M14N5TAze = 17942 - INTEGER(IntKi), PARAMETER :: M14N6TAze = 17943 - INTEGER(IntKi), PARAMETER :: M14N7TAze = 17944 - INTEGER(IntKi), PARAMETER :: M14N8TAze = 17945 - INTEGER(IntKi), PARAMETER :: M14N9TAze = 17946 - INTEGER(IntKi), PARAMETER :: M15N1TAze = 17947 - INTEGER(IntKi), PARAMETER :: M15N2TAze = 17948 - INTEGER(IntKi), PARAMETER :: M15N3TAze = 17949 - INTEGER(IntKi), PARAMETER :: M15N4TAze = 17950 - INTEGER(IntKi), PARAMETER :: M15N5TAze = 17951 - INTEGER(IntKi), PARAMETER :: M15N6TAze = 17952 - INTEGER(IntKi), PARAMETER :: M15N7TAze = 17953 - INTEGER(IntKi), PARAMETER :: M15N8TAze = 17954 - INTEGER(IntKi), PARAMETER :: M15N9TAze = 17955 - INTEGER(IntKi), PARAMETER :: M16N1TAze = 17956 - INTEGER(IntKi), PARAMETER :: M16N2TAze = 17957 - INTEGER(IntKi), PARAMETER :: M16N3TAze = 17958 - INTEGER(IntKi), PARAMETER :: M16N4TAze = 17959 - INTEGER(IntKi), PARAMETER :: M16N5TAze = 17960 - INTEGER(IntKi), PARAMETER :: M16N6TAze = 17961 - INTEGER(IntKi), PARAMETER :: M16N7TAze = 17962 - INTEGER(IntKi), PARAMETER :: M16N8TAze = 17963 - INTEGER(IntKi), PARAMETER :: M16N9TAze = 17964 - INTEGER(IntKi), PARAMETER :: M17N1TAze = 17965 - INTEGER(IntKi), PARAMETER :: M17N2TAze = 17966 - INTEGER(IntKi), PARAMETER :: M17N3TAze = 17967 - INTEGER(IntKi), PARAMETER :: M17N4TAze = 17968 - INTEGER(IntKi), PARAMETER :: M17N5TAze = 17969 - INTEGER(IntKi), PARAMETER :: M17N6TAze = 17970 - INTEGER(IntKi), PARAMETER :: M17N7TAze = 17971 - INTEGER(IntKi), PARAMETER :: M17N8TAze = 17972 - INTEGER(IntKi), PARAMETER :: M17N9TAze = 17973 - INTEGER(IntKi), PARAMETER :: M18N1TAze = 17974 - INTEGER(IntKi), PARAMETER :: M18N2TAze = 17975 - INTEGER(IntKi), PARAMETER :: M18N3TAze = 17976 - INTEGER(IntKi), PARAMETER :: M18N4TAze = 17977 - INTEGER(IntKi), PARAMETER :: M18N5TAze = 17978 - INTEGER(IntKi), PARAMETER :: M18N6TAze = 17979 - INTEGER(IntKi), PARAMETER :: M18N7TAze = 17980 - INTEGER(IntKi), PARAMETER :: M18N8TAze = 17981 - INTEGER(IntKi), PARAMETER :: M18N9TAze = 17982 - INTEGER(IntKi), PARAMETER :: M19N1TAze = 17983 - INTEGER(IntKi), PARAMETER :: M19N2TAze = 17984 - INTEGER(IntKi), PARAMETER :: M19N3TAze = 17985 - INTEGER(IntKi), PARAMETER :: M19N4TAze = 17986 - INTEGER(IntKi), PARAMETER :: M19N5TAze = 17987 - INTEGER(IntKi), PARAMETER :: M19N6TAze = 17988 - INTEGER(IntKi), PARAMETER :: M19N7TAze = 17989 - INTEGER(IntKi), PARAMETER :: M19N8TAze = 17990 - INTEGER(IntKi), PARAMETER :: M19N9TAze = 17991 - INTEGER(IntKi), PARAMETER :: M20N1TAze = 17992 - INTEGER(IntKi), PARAMETER :: M20N2TAze = 17993 - INTEGER(IntKi), PARAMETER :: M20N3TAze = 17994 - INTEGER(IntKi), PARAMETER :: M20N4TAze = 17995 - INTEGER(IntKi), PARAMETER :: M20N5TAze = 17996 - INTEGER(IntKi), PARAMETER :: M20N6TAze = 17997 - INTEGER(IntKi), PARAMETER :: M20N7TAze = 17998 - INTEGER(IntKi), PARAMETER :: M20N8TAze = 17999 - INTEGER(IntKi), PARAMETER :: M20N9TAze = 18000 - INTEGER(IntKi), PARAMETER :: M21N1TAze = 18001 - INTEGER(IntKi), PARAMETER :: M21N2TAze = 18002 - INTEGER(IntKi), PARAMETER :: M21N3TAze = 18003 - INTEGER(IntKi), PARAMETER :: M21N4TAze = 18004 - INTEGER(IntKi), PARAMETER :: M21N5TAze = 18005 - INTEGER(IntKi), PARAMETER :: M21N6TAze = 18006 - INTEGER(IntKi), PARAMETER :: M21N7TAze = 18007 - INTEGER(IntKi), PARAMETER :: M21N8TAze = 18008 - INTEGER(IntKi), PARAMETER :: M21N9TAze = 18009 - INTEGER(IntKi), PARAMETER :: M22N1TAze = 18010 - INTEGER(IntKi), PARAMETER :: M22N2TAze = 18011 - INTEGER(IntKi), PARAMETER :: M22N3TAze = 18012 - INTEGER(IntKi), PARAMETER :: M22N4TAze = 18013 - INTEGER(IntKi), PARAMETER :: M22N5TAze = 18014 - INTEGER(IntKi), PARAMETER :: M22N6TAze = 18015 - INTEGER(IntKi), PARAMETER :: M22N7TAze = 18016 - INTEGER(IntKi), PARAMETER :: M22N8TAze = 18017 - INTEGER(IntKi), PARAMETER :: M22N9TAze = 18018 - INTEGER(IntKi), PARAMETER :: M23N1TAze = 18019 - INTEGER(IntKi), PARAMETER :: M23N2TAze = 18020 - INTEGER(IntKi), PARAMETER :: M23N3TAze = 18021 - INTEGER(IntKi), PARAMETER :: M23N4TAze = 18022 - INTEGER(IntKi), PARAMETER :: M23N5TAze = 18023 - INTEGER(IntKi), PARAMETER :: M23N6TAze = 18024 - INTEGER(IntKi), PARAMETER :: M23N7TAze = 18025 - INTEGER(IntKi), PARAMETER :: M23N8TAze = 18026 - INTEGER(IntKi), PARAMETER :: M23N9TAze = 18027 - INTEGER(IntKi), PARAMETER :: M24N1TAze = 18028 - INTEGER(IntKi), PARAMETER :: M24N2TAze = 18029 - INTEGER(IntKi), PARAMETER :: M24N3TAze = 18030 - INTEGER(IntKi), PARAMETER :: M24N4TAze = 18031 - INTEGER(IntKi), PARAMETER :: M24N5TAze = 18032 - INTEGER(IntKi), PARAMETER :: M24N6TAze = 18033 - INTEGER(IntKi), PARAMETER :: M24N7TAze = 18034 - INTEGER(IntKi), PARAMETER :: M24N8TAze = 18035 - INTEGER(IntKi), PARAMETER :: M24N9TAze = 18036 - INTEGER(IntKi), PARAMETER :: M25N1TAze = 18037 - INTEGER(IntKi), PARAMETER :: M25N2TAze = 18038 - INTEGER(IntKi), PARAMETER :: M25N3TAze = 18039 - INTEGER(IntKi), PARAMETER :: M25N4TAze = 18040 - INTEGER(IntKi), PARAMETER :: M25N5TAze = 18041 - INTEGER(IntKi), PARAMETER :: M25N6TAze = 18042 - INTEGER(IntKi), PARAMETER :: M25N7TAze = 18043 - INTEGER(IntKi), PARAMETER :: M25N8TAze = 18044 - INTEGER(IntKi), PARAMETER :: M25N9TAze = 18045 - INTEGER(IntKi), PARAMETER :: M26N1TAze = 18046 - INTEGER(IntKi), PARAMETER :: M26N2TAze = 18047 - INTEGER(IntKi), PARAMETER :: M26N3TAze = 18048 - INTEGER(IntKi), PARAMETER :: M26N4TAze = 18049 - INTEGER(IntKi), PARAMETER :: M26N5TAze = 18050 - INTEGER(IntKi), PARAMETER :: M26N6TAze = 18051 - INTEGER(IntKi), PARAMETER :: M26N7TAze = 18052 - INTEGER(IntKi), PARAMETER :: M26N8TAze = 18053 - INTEGER(IntKi), PARAMETER :: M26N9TAze = 18054 - INTEGER(IntKi), PARAMETER :: M27N1TAze = 18055 - INTEGER(IntKi), PARAMETER :: M27N2TAze = 18056 - INTEGER(IntKi), PARAMETER :: M27N3TAze = 18057 - INTEGER(IntKi), PARAMETER :: M27N4TAze = 18058 - INTEGER(IntKi), PARAMETER :: M27N5TAze = 18059 - INTEGER(IntKi), PARAMETER :: M27N6TAze = 18060 - INTEGER(IntKi), PARAMETER :: M27N7TAze = 18061 - INTEGER(IntKi), PARAMETER :: M27N8TAze = 18062 - INTEGER(IntKi), PARAMETER :: M27N9TAze = 18063 - INTEGER(IntKi), PARAMETER :: M28N1TAze = 18064 - INTEGER(IntKi), PARAMETER :: M28N2TAze = 18065 - INTEGER(IntKi), PARAMETER :: M28N3TAze = 18066 - INTEGER(IntKi), PARAMETER :: M28N4TAze = 18067 - INTEGER(IntKi), PARAMETER :: M28N5TAze = 18068 - INTEGER(IntKi), PARAMETER :: M28N6TAze = 18069 - INTEGER(IntKi), PARAMETER :: M28N7TAze = 18070 - INTEGER(IntKi), PARAMETER :: M28N8TAze = 18071 - INTEGER(IntKi), PARAMETER :: M28N9TAze = 18072 - INTEGER(IntKi), PARAMETER :: M29N1TAze = 18073 - INTEGER(IntKi), PARAMETER :: M29N2TAze = 18074 - INTEGER(IntKi), PARAMETER :: M29N3TAze = 18075 - INTEGER(IntKi), PARAMETER :: M29N4TAze = 18076 - INTEGER(IntKi), PARAMETER :: M29N5TAze = 18077 - INTEGER(IntKi), PARAMETER :: M29N6TAze = 18078 - INTEGER(IntKi), PARAMETER :: M29N7TAze = 18079 - INTEGER(IntKi), PARAMETER :: M29N8TAze = 18080 - INTEGER(IntKi), PARAMETER :: M29N9TAze = 18081 - INTEGER(IntKi), PARAMETER :: M30N1TAze = 18082 - INTEGER(IntKi), PARAMETER :: M30N2TAze = 18083 - INTEGER(IntKi), PARAMETER :: M30N3TAze = 18084 - INTEGER(IntKi), PARAMETER :: M30N4TAze = 18085 - INTEGER(IntKi), PARAMETER :: M30N5TAze = 18086 - INTEGER(IntKi), PARAMETER :: M30N6TAze = 18087 - INTEGER(IntKi), PARAMETER :: M30N7TAze = 18088 - INTEGER(IntKi), PARAMETER :: M30N8TAze = 18089 - INTEGER(IntKi), PARAMETER :: M30N9TAze = 18090 - INTEGER(IntKi), PARAMETER :: M31N1TAze = 18091 - INTEGER(IntKi), PARAMETER :: M31N2TAze = 18092 - INTEGER(IntKi), PARAMETER :: M31N3TAze = 18093 - INTEGER(IntKi), PARAMETER :: M31N4TAze = 18094 - INTEGER(IntKi), PARAMETER :: M31N5TAze = 18095 - INTEGER(IntKi), PARAMETER :: M31N6TAze = 18096 - INTEGER(IntKi), PARAMETER :: M31N7TAze = 18097 - INTEGER(IntKi), PARAMETER :: M31N8TAze = 18098 - INTEGER(IntKi), PARAMETER :: M31N9TAze = 18099 - INTEGER(IntKi), PARAMETER :: M32N1TAze = 18100 - INTEGER(IntKi), PARAMETER :: M32N2TAze = 18101 - INTEGER(IntKi), PARAMETER :: M32N3TAze = 18102 - INTEGER(IntKi), PARAMETER :: M32N4TAze = 18103 - INTEGER(IntKi), PARAMETER :: M32N5TAze = 18104 - INTEGER(IntKi), PARAMETER :: M32N6TAze = 18105 - INTEGER(IntKi), PARAMETER :: M32N7TAze = 18106 - INTEGER(IntKi), PARAMETER :: M32N8TAze = 18107 - INTEGER(IntKi), PARAMETER :: M32N9TAze = 18108 - INTEGER(IntKi), PARAMETER :: M33N1TAze = 18109 - INTEGER(IntKi), PARAMETER :: M33N2TAze = 18110 - INTEGER(IntKi), PARAMETER :: M33N3TAze = 18111 - INTEGER(IntKi), PARAMETER :: M33N4TAze = 18112 - INTEGER(IntKi), PARAMETER :: M33N5TAze = 18113 - INTEGER(IntKi), PARAMETER :: M33N6TAze = 18114 - INTEGER(IntKi), PARAMETER :: M33N7TAze = 18115 - INTEGER(IntKi), PARAMETER :: M33N8TAze = 18116 - INTEGER(IntKi), PARAMETER :: M33N9TAze = 18117 - INTEGER(IntKi), PARAMETER :: M34N1TAze = 18118 - INTEGER(IntKi), PARAMETER :: M34N2TAze = 18119 - INTEGER(IntKi), PARAMETER :: M34N3TAze = 18120 - INTEGER(IntKi), PARAMETER :: M34N4TAze = 18121 - INTEGER(IntKi), PARAMETER :: M34N5TAze = 18122 - INTEGER(IntKi), PARAMETER :: M34N6TAze = 18123 - INTEGER(IntKi), PARAMETER :: M34N7TAze = 18124 - INTEGER(IntKi), PARAMETER :: M34N8TAze = 18125 - INTEGER(IntKi), PARAMETER :: M34N9TAze = 18126 - INTEGER(IntKi), PARAMETER :: M35N1TAze = 18127 - INTEGER(IntKi), PARAMETER :: M35N2TAze = 18128 - INTEGER(IntKi), PARAMETER :: M35N3TAze = 18129 - INTEGER(IntKi), PARAMETER :: M35N4TAze = 18130 - INTEGER(IntKi), PARAMETER :: M35N5TAze = 18131 - INTEGER(IntKi), PARAMETER :: M35N6TAze = 18132 - INTEGER(IntKi), PARAMETER :: M35N7TAze = 18133 - INTEGER(IntKi), PARAMETER :: M35N8TAze = 18134 - INTEGER(IntKi), PARAMETER :: M35N9TAze = 18135 - INTEGER(IntKi), PARAMETER :: M36N1TAze = 18136 - INTEGER(IntKi), PARAMETER :: M36N2TAze = 18137 - INTEGER(IntKi), PARAMETER :: M36N3TAze = 18138 - INTEGER(IntKi), PARAMETER :: M36N4TAze = 18139 - INTEGER(IntKi), PARAMETER :: M36N5TAze = 18140 - INTEGER(IntKi), PARAMETER :: M36N6TAze = 18141 - INTEGER(IntKi), PARAMETER :: M36N7TAze = 18142 - INTEGER(IntKi), PARAMETER :: M36N8TAze = 18143 - INTEGER(IntKi), PARAMETER :: M36N9TAze = 18144 - INTEGER(IntKi), PARAMETER :: M37N1TAze = 18145 - INTEGER(IntKi), PARAMETER :: M37N2TAze = 18146 - INTEGER(IntKi), PARAMETER :: M37N3TAze = 18147 - INTEGER(IntKi), PARAMETER :: M37N4TAze = 18148 - INTEGER(IntKi), PARAMETER :: M37N5TAze = 18149 - INTEGER(IntKi), PARAMETER :: M37N6TAze = 18150 - INTEGER(IntKi), PARAMETER :: M37N7TAze = 18151 - INTEGER(IntKi), PARAMETER :: M37N8TAze = 18152 - INTEGER(IntKi), PARAMETER :: M37N9TAze = 18153 - INTEGER(IntKi), PARAMETER :: M38N1TAze = 18154 - INTEGER(IntKi), PARAMETER :: M38N2TAze = 18155 - INTEGER(IntKi), PARAMETER :: M38N3TAze = 18156 - INTEGER(IntKi), PARAMETER :: M38N4TAze = 18157 - INTEGER(IntKi), PARAMETER :: M38N5TAze = 18158 - INTEGER(IntKi), PARAMETER :: M38N6TAze = 18159 - INTEGER(IntKi), PARAMETER :: M38N7TAze = 18160 - INTEGER(IntKi), PARAMETER :: M38N8TAze = 18161 - INTEGER(IntKi), PARAMETER :: M38N9TAze = 18162 - INTEGER(IntKi), PARAMETER :: M39N1TAze = 18163 - INTEGER(IntKi), PARAMETER :: M39N2TAze = 18164 - INTEGER(IntKi), PARAMETER :: M39N3TAze = 18165 - INTEGER(IntKi), PARAMETER :: M39N4TAze = 18166 - INTEGER(IntKi), PARAMETER :: M39N5TAze = 18167 - INTEGER(IntKi), PARAMETER :: M39N6TAze = 18168 - INTEGER(IntKi), PARAMETER :: M39N7TAze = 18169 - INTEGER(IntKi), PARAMETER :: M39N8TAze = 18170 - INTEGER(IntKi), PARAMETER :: M39N9TAze = 18171 - INTEGER(IntKi), PARAMETER :: M40N1TAze = 18172 - INTEGER(IntKi), PARAMETER :: M40N2TAze = 18173 - INTEGER(IntKi), PARAMETER :: M40N3TAze = 18174 - INTEGER(IntKi), PARAMETER :: M40N4TAze = 18175 - INTEGER(IntKi), PARAMETER :: M40N5TAze = 18176 - INTEGER(IntKi), PARAMETER :: M40N6TAze = 18177 - INTEGER(IntKi), PARAMETER :: M40N7TAze = 18178 - INTEGER(IntKi), PARAMETER :: M40N8TAze = 18179 - INTEGER(IntKi), PARAMETER :: M40N9TAze = 18180 - INTEGER(IntKi), PARAMETER :: M41N1TAze = 18181 - INTEGER(IntKi), PARAMETER :: M41N2TAze = 18182 - INTEGER(IntKi), PARAMETER :: M41N3TAze = 18183 - INTEGER(IntKi), PARAMETER :: M41N4TAze = 18184 - INTEGER(IntKi), PARAMETER :: M41N5TAze = 18185 - INTEGER(IntKi), PARAMETER :: M41N6TAze = 18186 - INTEGER(IntKi), PARAMETER :: M41N7TAze = 18187 - INTEGER(IntKi), PARAMETER :: M41N8TAze = 18188 - INTEGER(IntKi), PARAMETER :: M41N9TAze = 18189 - INTEGER(IntKi), PARAMETER :: M42N1TAze = 18190 - INTEGER(IntKi), PARAMETER :: M42N2TAze = 18191 - INTEGER(IntKi), PARAMETER :: M42N3TAze = 18192 - INTEGER(IntKi), PARAMETER :: M42N4TAze = 18193 - INTEGER(IntKi), PARAMETER :: M42N5TAze = 18194 - INTEGER(IntKi), PARAMETER :: M42N6TAze = 18195 - INTEGER(IntKi), PARAMETER :: M42N7TAze = 18196 - INTEGER(IntKi), PARAMETER :: M42N8TAze = 18197 - INTEGER(IntKi), PARAMETER :: M42N9TAze = 18198 - INTEGER(IntKi), PARAMETER :: M43N1TAze = 18199 - INTEGER(IntKi), PARAMETER :: M43N2TAze = 18200 - INTEGER(IntKi), PARAMETER :: M43N3TAze = 18201 - INTEGER(IntKi), PARAMETER :: M43N4TAze = 18202 - INTEGER(IntKi), PARAMETER :: M43N5TAze = 18203 - INTEGER(IntKi), PARAMETER :: M43N6TAze = 18204 - INTEGER(IntKi), PARAMETER :: M43N7TAze = 18205 - INTEGER(IntKi), PARAMETER :: M43N8TAze = 18206 - INTEGER(IntKi), PARAMETER :: M43N9TAze = 18207 - INTEGER(IntKi), PARAMETER :: M44N1TAze = 18208 - INTEGER(IntKi), PARAMETER :: M44N2TAze = 18209 - INTEGER(IntKi), PARAMETER :: M44N3TAze = 18210 - INTEGER(IntKi), PARAMETER :: M44N4TAze = 18211 - INTEGER(IntKi), PARAMETER :: M44N5TAze = 18212 - INTEGER(IntKi), PARAMETER :: M44N6TAze = 18213 - INTEGER(IntKi), PARAMETER :: M44N7TAze = 18214 - INTEGER(IntKi), PARAMETER :: M44N8TAze = 18215 - INTEGER(IntKi), PARAMETER :: M44N9TAze = 18216 - INTEGER(IntKi), PARAMETER :: M45N1TAze = 18217 - INTEGER(IntKi), PARAMETER :: M45N2TAze = 18218 - INTEGER(IntKi), PARAMETER :: M45N3TAze = 18219 - INTEGER(IntKi), PARAMETER :: M45N4TAze = 18220 - INTEGER(IntKi), PARAMETER :: M45N5TAze = 18221 - INTEGER(IntKi), PARAMETER :: M45N6TAze = 18222 - INTEGER(IntKi), PARAMETER :: M45N7TAze = 18223 - INTEGER(IntKi), PARAMETER :: M45N8TAze = 18224 - INTEGER(IntKi), PARAMETER :: M45N9TAze = 18225 - INTEGER(IntKi), PARAMETER :: M46N1TAze = 18226 - INTEGER(IntKi), PARAMETER :: M46N2TAze = 18227 - INTEGER(IntKi), PARAMETER :: M46N3TAze = 18228 - INTEGER(IntKi), PARAMETER :: M46N4TAze = 18229 - INTEGER(IntKi), PARAMETER :: M46N5TAze = 18230 - INTEGER(IntKi), PARAMETER :: M46N6TAze = 18231 - INTEGER(IntKi), PARAMETER :: M46N7TAze = 18232 - INTEGER(IntKi), PARAMETER :: M46N8TAze = 18233 - INTEGER(IntKi), PARAMETER :: M46N9TAze = 18234 - INTEGER(IntKi), PARAMETER :: M47N1TAze = 18235 - INTEGER(IntKi), PARAMETER :: M47N2TAze = 18236 - INTEGER(IntKi), PARAMETER :: M47N3TAze = 18237 - INTEGER(IntKi), PARAMETER :: M47N4TAze = 18238 - INTEGER(IntKi), PARAMETER :: M47N5TAze = 18239 - INTEGER(IntKi), PARAMETER :: M47N6TAze = 18240 - INTEGER(IntKi), PARAMETER :: M47N7TAze = 18241 - INTEGER(IntKi), PARAMETER :: M47N8TAze = 18242 - INTEGER(IntKi), PARAMETER :: M47N9TAze = 18243 - INTEGER(IntKi), PARAMETER :: M48N1TAze = 18244 - INTEGER(IntKi), PARAMETER :: M48N2TAze = 18245 - INTEGER(IntKi), PARAMETER :: M48N3TAze = 18246 - INTEGER(IntKi), PARAMETER :: M48N4TAze = 18247 - INTEGER(IntKi), PARAMETER :: M48N5TAze = 18248 - INTEGER(IntKi), PARAMETER :: M48N6TAze = 18249 - INTEGER(IntKi), PARAMETER :: M48N7TAze = 18250 - INTEGER(IntKi), PARAMETER :: M48N8TAze = 18251 - INTEGER(IntKi), PARAMETER :: M48N9TAze = 18252 - INTEGER(IntKi), PARAMETER :: M49N1TAze = 18253 - INTEGER(IntKi), PARAMETER :: M49N2TAze = 18254 - INTEGER(IntKi), PARAMETER :: M49N3TAze = 18255 - INTEGER(IntKi), PARAMETER :: M49N4TAze = 18256 - INTEGER(IntKi), PARAMETER :: M49N5TAze = 18257 - INTEGER(IntKi), PARAMETER :: M49N6TAze = 18258 - INTEGER(IntKi), PARAMETER :: M49N7TAze = 18259 - INTEGER(IntKi), PARAMETER :: M49N8TAze = 18260 - INTEGER(IntKi), PARAMETER :: M49N9TAze = 18261 - INTEGER(IntKi), PARAMETER :: M50N1TAze = 18262 - INTEGER(IntKi), PARAMETER :: M50N2TAze = 18263 - INTEGER(IntKi), PARAMETER :: M50N3TAze = 18264 - INTEGER(IntKi), PARAMETER :: M50N4TAze = 18265 - INTEGER(IntKi), PARAMETER :: M50N5TAze = 18266 - INTEGER(IntKi), PARAMETER :: M50N6TAze = 18267 - INTEGER(IntKi), PARAMETER :: M50N7TAze = 18268 - INTEGER(IntKi), PARAMETER :: M50N8TAze = 18269 - INTEGER(IntKi), PARAMETER :: M50N9TAze = 18270 - INTEGER(IntKi), PARAMETER :: M51N1TAze = 18271 - INTEGER(IntKi), PARAMETER :: M51N2TAze = 18272 - INTEGER(IntKi), PARAMETER :: M51N3TAze = 18273 - INTEGER(IntKi), PARAMETER :: M51N4TAze = 18274 - INTEGER(IntKi), PARAMETER :: M51N5TAze = 18275 - INTEGER(IntKi), PARAMETER :: M51N6TAze = 18276 - INTEGER(IntKi), PARAMETER :: M51N7TAze = 18277 - INTEGER(IntKi), PARAMETER :: M51N8TAze = 18278 - INTEGER(IntKi), PARAMETER :: M51N9TAze = 18279 - INTEGER(IntKi), PARAMETER :: M52N1TAze = 18280 - INTEGER(IntKi), PARAMETER :: M52N2TAze = 18281 - INTEGER(IntKi), PARAMETER :: M52N3TAze = 18282 - INTEGER(IntKi), PARAMETER :: M52N4TAze = 18283 - INTEGER(IntKi), PARAMETER :: M52N5TAze = 18284 - INTEGER(IntKi), PARAMETER :: M52N6TAze = 18285 - INTEGER(IntKi), PARAMETER :: M52N7TAze = 18286 - INTEGER(IntKi), PARAMETER :: M52N8TAze = 18287 - INTEGER(IntKi), PARAMETER :: M52N9TAze = 18288 - INTEGER(IntKi), PARAMETER :: M53N1TAze = 18289 - INTEGER(IntKi), PARAMETER :: M53N2TAze = 18290 - INTEGER(IntKi), PARAMETER :: M53N3TAze = 18291 - INTEGER(IntKi), PARAMETER :: M53N4TAze = 18292 - INTEGER(IntKi), PARAMETER :: M53N5TAze = 18293 - INTEGER(IntKi), PARAMETER :: M53N6TAze = 18294 - INTEGER(IntKi), PARAMETER :: M53N7TAze = 18295 - INTEGER(IntKi), PARAMETER :: M53N8TAze = 18296 - INTEGER(IntKi), PARAMETER :: M53N9TAze = 18297 - INTEGER(IntKi), PARAMETER :: M54N1TAze = 18298 - INTEGER(IntKi), PARAMETER :: M54N2TAze = 18299 - INTEGER(IntKi), PARAMETER :: M54N3TAze = 18300 - INTEGER(IntKi), PARAMETER :: M54N4TAze = 18301 - INTEGER(IntKi), PARAMETER :: M54N5TAze = 18302 - INTEGER(IntKi), PARAMETER :: M54N6TAze = 18303 - INTEGER(IntKi), PARAMETER :: M54N7TAze = 18304 - INTEGER(IntKi), PARAMETER :: M54N8TAze = 18305 - INTEGER(IntKi), PARAMETER :: M54N9TAze = 18306 - INTEGER(IntKi), PARAMETER :: M55N1TAze = 18307 - INTEGER(IntKi), PARAMETER :: M55N2TAze = 18308 - INTEGER(IntKi), PARAMETER :: M55N3TAze = 18309 - INTEGER(IntKi), PARAMETER :: M55N4TAze = 18310 - INTEGER(IntKi), PARAMETER :: M55N5TAze = 18311 - INTEGER(IntKi), PARAMETER :: M55N6TAze = 18312 - INTEGER(IntKi), PARAMETER :: M55N7TAze = 18313 - INTEGER(IntKi), PARAMETER :: M55N8TAze = 18314 - INTEGER(IntKi), PARAMETER :: M55N9TAze = 18315 - INTEGER(IntKi), PARAMETER :: M56N1TAze = 18316 - INTEGER(IntKi), PARAMETER :: M56N2TAze = 18317 - INTEGER(IntKi), PARAMETER :: M56N3TAze = 18318 - INTEGER(IntKi), PARAMETER :: M56N4TAze = 18319 - INTEGER(IntKi), PARAMETER :: M56N5TAze = 18320 - INTEGER(IntKi), PARAMETER :: M56N6TAze = 18321 - INTEGER(IntKi), PARAMETER :: M56N7TAze = 18322 - INTEGER(IntKi), PARAMETER :: M56N8TAze = 18323 - INTEGER(IntKi), PARAMETER :: M56N9TAze = 18324 - INTEGER(IntKi), PARAMETER :: M57N1TAze = 18325 - INTEGER(IntKi), PARAMETER :: M57N2TAze = 18326 - INTEGER(IntKi), PARAMETER :: M57N3TAze = 18327 - INTEGER(IntKi), PARAMETER :: M57N4TAze = 18328 - INTEGER(IntKi), PARAMETER :: M57N5TAze = 18329 - INTEGER(IntKi), PARAMETER :: M57N6TAze = 18330 - INTEGER(IntKi), PARAMETER :: M57N7TAze = 18331 - INTEGER(IntKi), PARAMETER :: M57N8TAze = 18332 - INTEGER(IntKi), PARAMETER :: M57N9TAze = 18333 - INTEGER(IntKi), PARAMETER :: M58N1TAze = 18334 - INTEGER(IntKi), PARAMETER :: M58N2TAze = 18335 - INTEGER(IntKi), PARAMETER :: M58N3TAze = 18336 - INTEGER(IntKi), PARAMETER :: M58N4TAze = 18337 - INTEGER(IntKi), PARAMETER :: M58N5TAze = 18338 - INTEGER(IntKi), PARAMETER :: M58N6TAze = 18339 - INTEGER(IntKi), PARAMETER :: M58N7TAze = 18340 - INTEGER(IntKi), PARAMETER :: M58N8TAze = 18341 - INTEGER(IntKi), PARAMETER :: M58N9TAze = 18342 - INTEGER(IntKi), PARAMETER :: M59N1TAze = 18343 - INTEGER(IntKi), PARAMETER :: M59N2TAze = 18344 - INTEGER(IntKi), PARAMETER :: M59N3TAze = 18345 - INTEGER(IntKi), PARAMETER :: M59N4TAze = 18346 - INTEGER(IntKi), PARAMETER :: M59N5TAze = 18347 - INTEGER(IntKi), PARAMETER :: M59N6TAze = 18348 - INTEGER(IntKi), PARAMETER :: M59N7TAze = 18349 - INTEGER(IntKi), PARAMETER :: M59N8TAze = 18350 - INTEGER(IntKi), PARAMETER :: M59N9TAze = 18351 - INTEGER(IntKi), PARAMETER :: M60N1TAze = 18352 - INTEGER(IntKi), PARAMETER :: M60N2TAze = 18353 - INTEGER(IntKi), PARAMETER :: M60N3TAze = 18354 - INTEGER(IntKi), PARAMETER :: M60N4TAze = 18355 - INTEGER(IntKi), PARAMETER :: M60N5TAze = 18356 - INTEGER(IntKi), PARAMETER :: M60N6TAze = 18357 - INTEGER(IntKi), PARAMETER :: M60N7TAze = 18358 - INTEGER(IntKi), PARAMETER :: M60N8TAze = 18359 - INTEGER(IntKi), PARAMETER :: M60N9TAze = 18360 - INTEGER(IntKi), PARAMETER :: M61N1TAze = 18361 - INTEGER(IntKi), PARAMETER :: M61N2TAze = 18362 - INTEGER(IntKi), PARAMETER :: M61N3TAze = 18363 - INTEGER(IntKi), PARAMETER :: M61N4TAze = 18364 - INTEGER(IntKi), PARAMETER :: M61N5TAze = 18365 - INTEGER(IntKi), PARAMETER :: M61N6TAze = 18366 - INTEGER(IntKi), PARAMETER :: M61N7TAze = 18367 - INTEGER(IntKi), PARAMETER :: M61N8TAze = 18368 - INTEGER(IntKi), PARAMETER :: M61N9TAze = 18369 - INTEGER(IntKi), PARAMETER :: M62N1TAze = 18370 - INTEGER(IntKi), PARAMETER :: M62N2TAze = 18371 - INTEGER(IntKi), PARAMETER :: M62N3TAze = 18372 - INTEGER(IntKi), PARAMETER :: M62N4TAze = 18373 - INTEGER(IntKi), PARAMETER :: M62N5TAze = 18374 - INTEGER(IntKi), PARAMETER :: M62N6TAze = 18375 - INTEGER(IntKi), PARAMETER :: M62N7TAze = 18376 - INTEGER(IntKi), PARAMETER :: M62N8TAze = 18377 - INTEGER(IntKi), PARAMETER :: M62N9TAze = 18378 - INTEGER(IntKi), PARAMETER :: M63N1TAze = 18379 - INTEGER(IntKi), PARAMETER :: M63N2TAze = 18380 - INTEGER(IntKi), PARAMETER :: M63N3TAze = 18381 - INTEGER(IntKi), PARAMETER :: M63N4TAze = 18382 - INTEGER(IntKi), PARAMETER :: M63N5TAze = 18383 - INTEGER(IntKi), PARAMETER :: M63N6TAze = 18384 - INTEGER(IntKi), PARAMETER :: M63N7TAze = 18385 - INTEGER(IntKi), PARAMETER :: M63N8TAze = 18386 - INTEGER(IntKi), PARAMETER :: M63N9TAze = 18387 - INTEGER(IntKi), PARAMETER :: M64N1TAze = 18388 - INTEGER(IntKi), PARAMETER :: M64N2TAze = 18389 - INTEGER(IntKi), PARAMETER :: M64N3TAze = 18390 - INTEGER(IntKi), PARAMETER :: M64N4TAze = 18391 - INTEGER(IntKi), PARAMETER :: M64N5TAze = 18392 - INTEGER(IntKi), PARAMETER :: M64N6TAze = 18393 - INTEGER(IntKi), PARAMETER :: M64N7TAze = 18394 - INTEGER(IntKi), PARAMETER :: M64N8TAze = 18395 - INTEGER(IntKi), PARAMETER :: M64N9TAze = 18396 - INTEGER(IntKi), PARAMETER :: M65N1TAze = 18397 - INTEGER(IntKi), PARAMETER :: M65N2TAze = 18398 - INTEGER(IntKi), PARAMETER :: M65N3TAze = 18399 - INTEGER(IntKi), PARAMETER :: M65N4TAze = 18400 - INTEGER(IntKi), PARAMETER :: M65N5TAze = 18401 - INTEGER(IntKi), PARAMETER :: M65N6TAze = 18402 - INTEGER(IntKi), PARAMETER :: M65N7TAze = 18403 - INTEGER(IntKi), PARAMETER :: M65N8TAze = 18404 - INTEGER(IntKi), PARAMETER :: M65N9TAze = 18405 - INTEGER(IntKi), PARAMETER :: M66N1TAze = 18406 - INTEGER(IntKi), PARAMETER :: M66N2TAze = 18407 - INTEGER(IntKi), PARAMETER :: M66N3TAze = 18408 - INTEGER(IntKi), PARAMETER :: M66N4TAze = 18409 - INTEGER(IntKi), PARAMETER :: M66N5TAze = 18410 - INTEGER(IntKi), PARAMETER :: M66N6TAze = 18411 - INTEGER(IntKi), PARAMETER :: M66N7TAze = 18412 - INTEGER(IntKi), PARAMETER :: M66N8TAze = 18413 - INTEGER(IntKi), PARAMETER :: M66N9TAze = 18414 - INTEGER(IntKi), PARAMETER :: M67N1TAze = 18415 - INTEGER(IntKi), PARAMETER :: M67N2TAze = 18416 - INTEGER(IntKi), PARAMETER :: M67N3TAze = 18417 - INTEGER(IntKi), PARAMETER :: M67N4TAze = 18418 - INTEGER(IntKi), PARAMETER :: M67N5TAze = 18419 - INTEGER(IntKi), PARAMETER :: M67N6TAze = 18420 - INTEGER(IntKi), PARAMETER :: M67N7TAze = 18421 - INTEGER(IntKi), PARAMETER :: M67N8TAze = 18422 - INTEGER(IntKi), PARAMETER :: M67N9TAze = 18423 - INTEGER(IntKi), PARAMETER :: M68N1TAze = 18424 - INTEGER(IntKi), PARAMETER :: M68N2TAze = 18425 - INTEGER(IntKi), PARAMETER :: M68N3TAze = 18426 - INTEGER(IntKi), PARAMETER :: M68N4TAze = 18427 - INTEGER(IntKi), PARAMETER :: M68N5TAze = 18428 - INTEGER(IntKi), PARAMETER :: M68N6TAze = 18429 - INTEGER(IntKi), PARAMETER :: M68N7TAze = 18430 - INTEGER(IntKi), PARAMETER :: M68N8TAze = 18431 - INTEGER(IntKi), PARAMETER :: M68N9TAze = 18432 - INTEGER(IntKi), PARAMETER :: M69N1TAze = 18433 - INTEGER(IntKi), PARAMETER :: M69N2TAze = 18434 - INTEGER(IntKi), PARAMETER :: M69N3TAze = 18435 - INTEGER(IntKi), PARAMETER :: M69N4TAze = 18436 - INTEGER(IntKi), PARAMETER :: M69N5TAze = 18437 - INTEGER(IntKi), PARAMETER :: M69N6TAze = 18438 - INTEGER(IntKi), PARAMETER :: M69N7TAze = 18439 - INTEGER(IntKi), PARAMETER :: M69N8TAze = 18440 - INTEGER(IntKi), PARAMETER :: M69N9TAze = 18441 - INTEGER(IntKi), PARAMETER :: M70N1TAze = 18442 - INTEGER(IntKi), PARAMETER :: M70N2TAze = 18443 - INTEGER(IntKi), PARAMETER :: M70N3TAze = 18444 - INTEGER(IntKi), PARAMETER :: M70N4TAze = 18445 - INTEGER(IntKi), PARAMETER :: M70N5TAze = 18446 - INTEGER(IntKi), PARAMETER :: M70N6TAze = 18447 - INTEGER(IntKi), PARAMETER :: M70N7TAze = 18448 - INTEGER(IntKi), PARAMETER :: M70N8TAze = 18449 - INTEGER(IntKi), PARAMETER :: M70N9TAze = 18450 - INTEGER(IntKi), PARAMETER :: M71N1TAze = 18451 - INTEGER(IntKi), PARAMETER :: M71N2TAze = 18452 - INTEGER(IntKi), PARAMETER :: M71N3TAze = 18453 - INTEGER(IntKi), PARAMETER :: M71N4TAze = 18454 - INTEGER(IntKi), PARAMETER :: M71N5TAze = 18455 - INTEGER(IntKi), PARAMETER :: M71N6TAze = 18456 - INTEGER(IntKi), PARAMETER :: M71N7TAze = 18457 - INTEGER(IntKi), PARAMETER :: M71N8TAze = 18458 - INTEGER(IntKi), PARAMETER :: M71N9TAze = 18459 - INTEGER(IntKi), PARAMETER :: M72N1TAze = 18460 - INTEGER(IntKi), PARAMETER :: M72N2TAze = 18461 - INTEGER(IntKi), PARAMETER :: M72N3TAze = 18462 - INTEGER(IntKi), PARAMETER :: M72N4TAze = 18463 - INTEGER(IntKi), PARAMETER :: M72N5TAze = 18464 - INTEGER(IntKi), PARAMETER :: M72N6TAze = 18465 - INTEGER(IntKi), PARAMETER :: M72N7TAze = 18466 - INTEGER(IntKi), PARAMETER :: M72N8TAze = 18467 - INTEGER(IntKi), PARAMETER :: M72N9TAze = 18468 - INTEGER(IntKi), PARAMETER :: M73N1TAze = 18469 - INTEGER(IntKi), PARAMETER :: M73N2TAze = 18470 - INTEGER(IntKi), PARAMETER :: M73N3TAze = 18471 - INTEGER(IntKi), PARAMETER :: M73N4TAze = 18472 - INTEGER(IntKi), PARAMETER :: M73N5TAze = 18473 - INTEGER(IntKi), PARAMETER :: M73N6TAze = 18474 - INTEGER(IntKi), PARAMETER :: M73N7TAze = 18475 - INTEGER(IntKi), PARAMETER :: M73N8TAze = 18476 - INTEGER(IntKi), PARAMETER :: M73N9TAze = 18477 - INTEGER(IntKi), PARAMETER :: M74N1TAze = 18478 - INTEGER(IntKi), PARAMETER :: M74N2TAze = 18479 - INTEGER(IntKi), PARAMETER :: M74N3TAze = 18480 - INTEGER(IntKi), PARAMETER :: M74N4TAze = 18481 - INTEGER(IntKi), PARAMETER :: M74N5TAze = 18482 - INTEGER(IntKi), PARAMETER :: M74N6TAze = 18483 - INTEGER(IntKi), PARAMETER :: M74N7TAze = 18484 - INTEGER(IntKi), PARAMETER :: M74N8TAze = 18485 - INTEGER(IntKi), PARAMETER :: M74N9TAze = 18486 - INTEGER(IntKi), PARAMETER :: M75N1TAze = 18487 - INTEGER(IntKi), PARAMETER :: M75N2TAze = 18488 - INTEGER(IntKi), PARAMETER :: M75N3TAze = 18489 - INTEGER(IntKi), PARAMETER :: M75N4TAze = 18490 - INTEGER(IntKi), PARAMETER :: M75N5TAze = 18491 - INTEGER(IntKi), PARAMETER :: M75N6TAze = 18492 - INTEGER(IntKi), PARAMETER :: M75N7TAze = 18493 - INTEGER(IntKi), PARAMETER :: M75N8TAze = 18494 - INTEGER(IntKi), PARAMETER :: M75N9TAze = 18495 - INTEGER(IntKi), PARAMETER :: M76N1TAze = 18496 - INTEGER(IntKi), PARAMETER :: M76N2TAze = 18497 - INTEGER(IntKi), PARAMETER :: M76N3TAze = 18498 - INTEGER(IntKi), PARAMETER :: M76N4TAze = 18499 - INTEGER(IntKi), PARAMETER :: M76N5TAze = 18500 - INTEGER(IntKi), PARAMETER :: M76N6TAze = 18501 - INTEGER(IntKi), PARAMETER :: M76N7TAze = 18502 - INTEGER(IntKi), PARAMETER :: M76N8TAze = 18503 - INTEGER(IntKi), PARAMETER :: M76N9TAze = 18504 - INTEGER(IntKi), PARAMETER :: M77N1TAze = 18505 - INTEGER(IntKi), PARAMETER :: M77N2TAze = 18506 - INTEGER(IntKi), PARAMETER :: M77N3TAze = 18507 - INTEGER(IntKi), PARAMETER :: M77N4TAze = 18508 - INTEGER(IntKi), PARAMETER :: M77N5TAze = 18509 - INTEGER(IntKi), PARAMETER :: M77N6TAze = 18510 - INTEGER(IntKi), PARAMETER :: M77N7TAze = 18511 - INTEGER(IntKi), PARAMETER :: M77N8TAze = 18512 - INTEGER(IntKi), PARAMETER :: M77N9TAze = 18513 - INTEGER(IntKi), PARAMETER :: M78N1TAze = 18514 - INTEGER(IntKi), PARAMETER :: M78N2TAze = 18515 - INTEGER(IntKi), PARAMETER :: M78N3TAze = 18516 - INTEGER(IntKi), PARAMETER :: M78N4TAze = 18517 - INTEGER(IntKi), PARAMETER :: M78N5TAze = 18518 - INTEGER(IntKi), PARAMETER :: M78N6TAze = 18519 - INTEGER(IntKi), PARAMETER :: M78N7TAze = 18520 - INTEGER(IntKi), PARAMETER :: M78N8TAze = 18521 - INTEGER(IntKi), PARAMETER :: M78N9TAze = 18522 - INTEGER(IntKi), PARAMETER :: M79N1TAze = 18523 - INTEGER(IntKi), PARAMETER :: M79N2TAze = 18524 - INTEGER(IntKi), PARAMETER :: M79N3TAze = 18525 - INTEGER(IntKi), PARAMETER :: M79N4TAze = 18526 - INTEGER(IntKi), PARAMETER :: M79N5TAze = 18527 - INTEGER(IntKi), PARAMETER :: M79N6TAze = 18528 - INTEGER(IntKi), PARAMETER :: M79N7TAze = 18529 - INTEGER(IntKi), PARAMETER :: M79N8TAze = 18530 - INTEGER(IntKi), PARAMETER :: M79N9TAze = 18531 - INTEGER(IntKi), PARAMETER :: M80N1TAze = 18532 - INTEGER(IntKi), PARAMETER :: M80N2TAze = 18533 - INTEGER(IntKi), PARAMETER :: M80N3TAze = 18534 - INTEGER(IntKi), PARAMETER :: M80N4TAze = 18535 - INTEGER(IntKi), PARAMETER :: M80N5TAze = 18536 - INTEGER(IntKi), PARAMETER :: M80N6TAze = 18537 - INTEGER(IntKi), PARAMETER :: M80N7TAze = 18538 - INTEGER(IntKi), PARAMETER :: M80N8TAze = 18539 - INTEGER(IntKi), PARAMETER :: M80N9TAze = 18540 - INTEGER(IntKi), PARAMETER :: M81N1TAze = 18541 - INTEGER(IntKi), PARAMETER :: M81N2TAze = 18542 - INTEGER(IntKi), PARAMETER :: M81N3TAze = 18543 - INTEGER(IntKi), PARAMETER :: M81N4TAze = 18544 - INTEGER(IntKi), PARAMETER :: M81N5TAze = 18545 - INTEGER(IntKi), PARAMETER :: M81N6TAze = 18546 - INTEGER(IntKi), PARAMETER :: M81N7TAze = 18547 - INTEGER(IntKi), PARAMETER :: M81N8TAze = 18548 - INTEGER(IntKi), PARAMETER :: M81N9TAze = 18549 - INTEGER(IntKi), PARAMETER :: M82N1TAze = 18550 - INTEGER(IntKi), PARAMETER :: M82N2TAze = 18551 - INTEGER(IntKi), PARAMETER :: M82N3TAze = 18552 - INTEGER(IntKi), PARAMETER :: M82N4TAze = 18553 - INTEGER(IntKi), PARAMETER :: M82N5TAze = 18554 - INTEGER(IntKi), PARAMETER :: M82N6TAze = 18555 - INTEGER(IntKi), PARAMETER :: M82N7TAze = 18556 - INTEGER(IntKi), PARAMETER :: M82N8TAze = 18557 - INTEGER(IntKi), PARAMETER :: M82N9TAze = 18558 - INTEGER(IntKi), PARAMETER :: M83N1TAze = 18559 - INTEGER(IntKi), PARAMETER :: M83N2TAze = 18560 - INTEGER(IntKi), PARAMETER :: M83N3TAze = 18561 - INTEGER(IntKi), PARAMETER :: M83N4TAze = 18562 - INTEGER(IntKi), PARAMETER :: M83N5TAze = 18563 - INTEGER(IntKi), PARAMETER :: M83N6TAze = 18564 - INTEGER(IntKi), PARAMETER :: M83N7TAze = 18565 - INTEGER(IntKi), PARAMETER :: M83N8TAze = 18566 - INTEGER(IntKi), PARAMETER :: M83N9TAze = 18567 - INTEGER(IntKi), PARAMETER :: M84N1TAze = 18568 - INTEGER(IntKi), PARAMETER :: M84N2TAze = 18569 - INTEGER(IntKi), PARAMETER :: M84N3TAze = 18570 - INTEGER(IntKi), PARAMETER :: M84N4TAze = 18571 - INTEGER(IntKi), PARAMETER :: M84N5TAze = 18572 - INTEGER(IntKi), PARAMETER :: M84N6TAze = 18573 - INTEGER(IntKi), PARAMETER :: M84N7TAze = 18574 - INTEGER(IntKi), PARAMETER :: M84N8TAze = 18575 - INTEGER(IntKi), PARAMETER :: M84N9TAze = 18576 - INTEGER(IntKi), PARAMETER :: M85N1TAze = 18577 - INTEGER(IntKi), PARAMETER :: M85N2TAze = 18578 - INTEGER(IntKi), PARAMETER :: M85N3TAze = 18579 - INTEGER(IntKi), PARAMETER :: M85N4TAze = 18580 - INTEGER(IntKi), PARAMETER :: M85N5TAze = 18581 - INTEGER(IntKi), PARAMETER :: M85N6TAze = 18582 - INTEGER(IntKi), PARAMETER :: M85N7TAze = 18583 - INTEGER(IntKi), PARAMETER :: M85N8TAze = 18584 - INTEGER(IntKi), PARAMETER :: M85N9TAze = 18585 - INTEGER(IntKi), PARAMETER :: M86N1TAze = 18586 - INTEGER(IntKi), PARAMETER :: M86N2TAze = 18587 - INTEGER(IntKi), PARAMETER :: M86N3TAze = 18588 - INTEGER(IntKi), PARAMETER :: M86N4TAze = 18589 - INTEGER(IntKi), PARAMETER :: M86N5TAze = 18590 - INTEGER(IntKi), PARAMETER :: M86N6TAze = 18591 - INTEGER(IntKi), PARAMETER :: M86N7TAze = 18592 - INTEGER(IntKi), PARAMETER :: M86N8TAze = 18593 - INTEGER(IntKi), PARAMETER :: M86N9TAze = 18594 - INTEGER(IntKi), PARAMETER :: M87N1TAze = 18595 - INTEGER(IntKi), PARAMETER :: M87N2TAze = 18596 - INTEGER(IntKi), PARAMETER :: M87N3TAze = 18597 - INTEGER(IntKi), PARAMETER :: M87N4TAze = 18598 - INTEGER(IntKi), PARAMETER :: M87N5TAze = 18599 - INTEGER(IntKi), PARAMETER :: M87N6TAze = 18600 - INTEGER(IntKi), PARAMETER :: M87N7TAze = 18601 - INTEGER(IntKi), PARAMETER :: M87N8TAze = 18602 - INTEGER(IntKi), PARAMETER :: M87N9TAze = 18603 - INTEGER(IntKi), PARAMETER :: M88N1TAze = 18604 - INTEGER(IntKi), PARAMETER :: M88N2TAze = 18605 - INTEGER(IntKi), PARAMETER :: M88N3TAze = 18606 - INTEGER(IntKi), PARAMETER :: M88N4TAze = 18607 - INTEGER(IntKi), PARAMETER :: M88N5TAze = 18608 - INTEGER(IntKi), PARAMETER :: M88N6TAze = 18609 - INTEGER(IntKi), PARAMETER :: M88N7TAze = 18610 - INTEGER(IntKi), PARAMETER :: M88N8TAze = 18611 - INTEGER(IntKi), PARAMETER :: M88N9TAze = 18612 - INTEGER(IntKi), PARAMETER :: M89N1TAze = 18613 - INTEGER(IntKi), PARAMETER :: M89N2TAze = 18614 - INTEGER(IntKi), PARAMETER :: M89N3TAze = 18615 - INTEGER(IntKi), PARAMETER :: M89N4TAze = 18616 - INTEGER(IntKi), PARAMETER :: M89N5TAze = 18617 - INTEGER(IntKi), PARAMETER :: M89N6TAze = 18618 - INTEGER(IntKi), PARAMETER :: M89N7TAze = 18619 - INTEGER(IntKi), PARAMETER :: M89N8TAze = 18620 - INTEGER(IntKi), PARAMETER :: M89N9TAze = 18621 - INTEGER(IntKi), PARAMETER :: M90N1TAze = 18622 - INTEGER(IntKi), PARAMETER :: M90N2TAze = 18623 - INTEGER(IntKi), PARAMETER :: M90N3TAze = 18624 - INTEGER(IntKi), PARAMETER :: M90N4TAze = 18625 - INTEGER(IntKi), PARAMETER :: M90N5TAze = 18626 - INTEGER(IntKi), PARAMETER :: M90N6TAze = 18627 - INTEGER(IntKi), PARAMETER :: M90N7TAze = 18628 - INTEGER(IntKi), PARAMETER :: M90N8TAze = 18629 - INTEGER(IntKi), PARAMETER :: M90N9TAze = 18630 - INTEGER(IntKi), PARAMETER :: M91N1TAze = 18631 - INTEGER(IntKi), PARAMETER :: M91N2TAze = 18632 - INTEGER(IntKi), PARAMETER :: M91N3TAze = 18633 - INTEGER(IntKi), PARAMETER :: M91N4TAze = 18634 - INTEGER(IntKi), PARAMETER :: M91N5TAze = 18635 - INTEGER(IntKi), PARAMETER :: M91N6TAze = 18636 - INTEGER(IntKi), PARAMETER :: M91N7TAze = 18637 - INTEGER(IntKi), PARAMETER :: M91N8TAze = 18638 - INTEGER(IntKi), PARAMETER :: M91N9TAze = 18639 - INTEGER(IntKi), PARAMETER :: M92N1TAze = 18640 - INTEGER(IntKi), PARAMETER :: M92N2TAze = 18641 - INTEGER(IntKi), PARAMETER :: M92N3TAze = 18642 - INTEGER(IntKi), PARAMETER :: M92N4TAze = 18643 - INTEGER(IntKi), PARAMETER :: M92N5TAze = 18644 - INTEGER(IntKi), PARAMETER :: M92N6TAze = 18645 - INTEGER(IntKi), PARAMETER :: M92N7TAze = 18646 - INTEGER(IntKi), PARAMETER :: M92N8TAze = 18647 - INTEGER(IntKi), PARAMETER :: M92N9TAze = 18648 - INTEGER(IntKi), PARAMETER :: M93N1TAze = 18649 - INTEGER(IntKi), PARAMETER :: M93N2TAze = 18650 - INTEGER(IntKi), PARAMETER :: M93N3TAze = 18651 - INTEGER(IntKi), PARAMETER :: M93N4TAze = 18652 - INTEGER(IntKi), PARAMETER :: M93N5TAze = 18653 - INTEGER(IntKi), PARAMETER :: M93N6TAze = 18654 - INTEGER(IntKi), PARAMETER :: M93N7TAze = 18655 - INTEGER(IntKi), PARAMETER :: M93N8TAze = 18656 - INTEGER(IntKi), PARAMETER :: M93N9TAze = 18657 - INTEGER(IntKi), PARAMETER :: M94N1TAze = 18658 - INTEGER(IntKi), PARAMETER :: M94N2TAze = 18659 - INTEGER(IntKi), PARAMETER :: M94N3TAze = 18660 - INTEGER(IntKi), PARAMETER :: M94N4TAze = 18661 - INTEGER(IntKi), PARAMETER :: M94N5TAze = 18662 - INTEGER(IntKi), PARAMETER :: M94N6TAze = 18663 - INTEGER(IntKi), PARAMETER :: M94N7TAze = 18664 - INTEGER(IntKi), PARAMETER :: M94N8TAze = 18665 - INTEGER(IntKi), PARAMETER :: M94N9TAze = 18666 - INTEGER(IntKi), PARAMETER :: M95N1TAze = 18667 - INTEGER(IntKi), PARAMETER :: M95N2TAze = 18668 - INTEGER(IntKi), PARAMETER :: M95N3TAze = 18669 - INTEGER(IntKi), PARAMETER :: M95N4TAze = 18670 - INTEGER(IntKi), PARAMETER :: M95N5TAze = 18671 - INTEGER(IntKi), PARAMETER :: M95N6TAze = 18672 - INTEGER(IntKi), PARAMETER :: M95N7TAze = 18673 - INTEGER(IntKi), PARAMETER :: M95N8TAze = 18674 - INTEGER(IntKi), PARAMETER :: M95N9TAze = 18675 - INTEGER(IntKi), PARAMETER :: M96N1TAze = 18676 - INTEGER(IntKi), PARAMETER :: M96N2TAze = 18677 - INTEGER(IntKi), PARAMETER :: M96N3TAze = 18678 - INTEGER(IntKi), PARAMETER :: M96N4TAze = 18679 - INTEGER(IntKi), PARAMETER :: M96N5TAze = 18680 - INTEGER(IntKi), PARAMETER :: M96N6TAze = 18681 - INTEGER(IntKi), PARAMETER :: M96N7TAze = 18682 - INTEGER(IntKi), PARAMETER :: M96N8TAze = 18683 - INTEGER(IntKi), PARAMETER :: M96N9TAze = 18684 - INTEGER(IntKi), PARAMETER :: M97N1TAze = 18685 - INTEGER(IntKi), PARAMETER :: M97N2TAze = 18686 - INTEGER(IntKi), PARAMETER :: M97N3TAze = 18687 - INTEGER(IntKi), PARAMETER :: M97N4TAze = 18688 - INTEGER(IntKi), PARAMETER :: M97N5TAze = 18689 - INTEGER(IntKi), PARAMETER :: M97N6TAze = 18690 - INTEGER(IntKi), PARAMETER :: M97N7TAze = 18691 - INTEGER(IntKi), PARAMETER :: M97N8TAze = 18692 - INTEGER(IntKi), PARAMETER :: M97N9TAze = 18693 - INTEGER(IntKi), PARAMETER :: M98N1TAze = 18694 - INTEGER(IntKi), PARAMETER :: M98N2TAze = 18695 - INTEGER(IntKi), PARAMETER :: M98N3TAze = 18696 - INTEGER(IntKi), PARAMETER :: M98N4TAze = 18697 - INTEGER(IntKi), PARAMETER :: M98N5TAze = 18698 - INTEGER(IntKi), PARAMETER :: M98N6TAze = 18699 - INTEGER(IntKi), PARAMETER :: M98N7TAze = 18700 - INTEGER(IntKi), PARAMETER :: M98N8TAze = 18701 - INTEGER(IntKi), PARAMETER :: M98N9TAze = 18702 - INTEGER(IntKi), PARAMETER :: M99N1TAze = 18703 - INTEGER(IntKi), PARAMETER :: M99N2TAze = 18704 - INTEGER(IntKi), PARAMETER :: M99N3TAze = 18705 - INTEGER(IntKi), PARAMETER :: M99N4TAze = 18706 - INTEGER(IntKi), PARAMETER :: M99N5TAze = 18707 - INTEGER(IntKi), PARAMETER :: M99N6TAze = 18708 - INTEGER(IntKi), PARAMETER :: M99N7TAze = 18709 - INTEGER(IntKi), PARAMETER :: M99N8TAze = 18710 - INTEGER(IntKi), PARAMETER :: M99N9TAze = 18711 - INTEGER(IntKi), PARAMETER :: M01N1RAxe = 18712 - INTEGER(IntKi), PARAMETER :: M01N2RAxe = 18713 - INTEGER(IntKi), PARAMETER :: M01N3RAxe = 18714 - INTEGER(IntKi), PARAMETER :: M01N4RAxe = 18715 - INTEGER(IntKi), PARAMETER :: M01N5RAxe = 18716 - INTEGER(IntKi), PARAMETER :: M01N6RAxe = 18717 - INTEGER(IntKi), PARAMETER :: M01N7RAxe = 18718 - INTEGER(IntKi), PARAMETER :: M01N8RAxe = 18719 - INTEGER(IntKi), PARAMETER :: M01N9RAxe = 18720 - INTEGER(IntKi), PARAMETER :: M02N1RAxe = 18721 - INTEGER(IntKi), PARAMETER :: M02N2RAxe = 18722 - INTEGER(IntKi), PARAMETER :: M02N3RAxe = 18723 - INTEGER(IntKi), PARAMETER :: M02N4RAxe = 18724 - INTEGER(IntKi), PARAMETER :: M02N5RAxe = 18725 - INTEGER(IntKi), PARAMETER :: M02N6RAxe = 18726 - INTEGER(IntKi), PARAMETER :: M02N7RAxe = 18727 - INTEGER(IntKi), PARAMETER :: M02N8RAxe = 18728 - INTEGER(IntKi), PARAMETER :: M02N9RAxe = 18729 - INTEGER(IntKi), PARAMETER :: M03N1RAxe = 18730 - INTEGER(IntKi), PARAMETER :: M03N2RAxe = 18731 - INTEGER(IntKi), PARAMETER :: M03N3RAxe = 18732 - INTEGER(IntKi), PARAMETER :: M03N4RAxe = 18733 - INTEGER(IntKi), PARAMETER :: M03N5RAxe = 18734 - INTEGER(IntKi), PARAMETER :: M03N6RAxe = 18735 - INTEGER(IntKi), PARAMETER :: M03N7RAxe = 18736 - INTEGER(IntKi), PARAMETER :: M03N8RAxe = 18737 - INTEGER(IntKi), PARAMETER :: M03N9RAxe = 18738 - INTEGER(IntKi), PARAMETER :: M04N1RAxe = 18739 - INTEGER(IntKi), PARAMETER :: M04N2RAxe = 18740 - INTEGER(IntKi), PARAMETER :: M04N3RAxe = 18741 - INTEGER(IntKi), PARAMETER :: M04N4RAxe = 18742 - INTEGER(IntKi), PARAMETER :: M04N5RAxe = 18743 - INTEGER(IntKi), PARAMETER :: M04N6RAxe = 18744 - INTEGER(IntKi), PARAMETER :: M04N7RAxe = 18745 - INTEGER(IntKi), PARAMETER :: M04N8RAxe = 18746 - INTEGER(IntKi), PARAMETER :: M04N9RAxe = 18747 - INTEGER(IntKi), PARAMETER :: M05N1RAxe = 18748 - INTEGER(IntKi), PARAMETER :: M05N2RAxe = 18749 - INTEGER(IntKi), PARAMETER :: M05N3RAxe = 18750 - INTEGER(IntKi), PARAMETER :: M05N4RAxe = 18751 - INTEGER(IntKi), PARAMETER :: M05N5RAxe = 18752 - INTEGER(IntKi), PARAMETER :: M05N6RAxe = 18753 - INTEGER(IntKi), PARAMETER :: M05N7RAxe = 18754 - INTEGER(IntKi), PARAMETER :: M05N8RAxe = 18755 - INTEGER(IntKi), PARAMETER :: M05N9RAxe = 18756 - INTEGER(IntKi), PARAMETER :: M06N1RAxe = 18757 - INTEGER(IntKi), PARAMETER :: M06N2RAxe = 18758 - INTEGER(IntKi), PARAMETER :: M06N3RAxe = 18759 - INTEGER(IntKi), PARAMETER :: M06N4RAxe = 18760 - INTEGER(IntKi), PARAMETER :: M06N5RAxe = 18761 - INTEGER(IntKi), PARAMETER :: M06N6RAxe = 18762 - INTEGER(IntKi), PARAMETER :: M06N7RAxe = 18763 - INTEGER(IntKi), PARAMETER :: M06N8RAxe = 18764 - INTEGER(IntKi), PARAMETER :: M06N9RAxe = 18765 - INTEGER(IntKi), PARAMETER :: M07N1RAxe = 18766 - INTEGER(IntKi), PARAMETER :: M07N2RAxe = 18767 - INTEGER(IntKi), PARAMETER :: M07N3RAxe = 18768 - INTEGER(IntKi), PARAMETER :: M07N4RAxe = 18769 - INTEGER(IntKi), PARAMETER :: M07N5RAxe = 18770 - INTEGER(IntKi), PARAMETER :: M07N6RAxe = 18771 - INTEGER(IntKi), PARAMETER :: M07N7RAxe = 18772 - INTEGER(IntKi), PARAMETER :: M07N8RAxe = 18773 - INTEGER(IntKi), PARAMETER :: M07N9RAxe = 18774 - INTEGER(IntKi), PARAMETER :: M08N1RAxe = 18775 - INTEGER(IntKi), PARAMETER :: M08N2RAxe = 18776 - INTEGER(IntKi), PARAMETER :: M08N3RAxe = 18777 - INTEGER(IntKi), PARAMETER :: M08N4RAxe = 18778 - INTEGER(IntKi), PARAMETER :: M08N5RAxe = 18779 - INTEGER(IntKi), PARAMETER :: M08N6RAxe = 18780 - INTEGER(IntKi), PARAMETER :: M08N7RAxe = 18781 - INTEGER(IntKi), PARAMETER :: M08N8RAxe = 18782 - INTEGER(IntKi), PARAMETER :: M08N9RAxe = 18783 - INTEGER(IntKi), PARAMETER :: M09N1RAxe = 18784 - INTEGER(IntKi), PARAMETER :: M09N2RAxe = 18785 - INTEGER(IntKi), PARAMETER :: M09N3RAxe = 18786 - INTEGER(IntKi), PARAMETER :: M09N4RAxe = 18787 - INTEGER(IntKi), PARAMETER :: M09N5RAxe = 18788 - INTEGER(IntKi), PARAMETER :: M09N6RAxe = 18789 - INTEGER(IntKi), PARAMETER :: M09N7RAxe = 18790 - INTEGER(IntKi), PARAMETER :: M09N8RAxe = 18791 - INTEGER(IntKi), PARAMETER :: M09N9RAxe = 18792 - INTEGER(IntKi), PARAMETER :: M10N1RAxe = 18793 - INTEGER(IntKi), PARAMETER :: M10N2RAxe = 18794 - INTEGER(IntKi), PARAMETER :: M10N3RAxe = 18795 - INTEGER(IntKi), PARAMETER :: M10N4RAxe = 18796 - INTEGER(IntKi), PARAMETER :: M10N5RAxe = 18797 - INTEGER(IntKi), PARAMETER :: M10N6RAxe = 18798 - INTEGER(IntKi), PARAMETER :: M10N7RAxe = 18799 - INTEGER(IntKi), PARAMETER :: M10N8RAxe = 18800 - INTEGER(IntKi), PARAMETER :: M10N9RAxe = 18801 - INTEGER(IntKi), PARAMETER :: M11N1RAxe = 18802 - INTEGER(IntKi), PARAMETER :: M11N2RAxe = 18803 - INTEGER(IntKi), PARAMETER :: M11N3RAxe = 18804 - INTEGER(IntKi), PARAMETER :: M11N4RAxe = 18805 - INTEGER(IntKi), PARAMETER :: M11N5RAxe = 18806 - INTEGER(IntKi), PARAMETER :: M11N6RAxe = 18807 - INTEGER(IntKi), PARAMETER :: M11N7RAxe = 18808 - INTEGER(IntKi), PARAMETER :: M11N8RAxe = 18809 - INTEGER(IntKi), PARAMETER :: M11N9RAxe = 18810 - INTEGER(IntKi), PARAMETER :: M12N1RAxe = 18811 - INTEGER(IntKi), PARAMETER :: M12N2RAxe = 18812 - INTEGER(IntKi), PARAMETER :: M12N3RAxe = 18813 - INTEGER(IntKi), PARAMETER :: M12N4RAxe = 18814 - INTEGER(IntKi), PARAMETER :: M12N5RAxe = 18815 - INTEGER(IntKi), PARAMETER :: M12N6RAxe = 18816 - INTEGER(IntKi), PARAMETER :: M12N7RAxe = 18817 - INTEGER(IntKi), PARAMETER :: M12N8RAxe = 18818 - INTEGER(IntKi), PARAMETER :: M12N9RAxe = 18819 - INTEGER(IntKi), PARAMETER :: M13N1RAxe = 18820 - INTEGER(IntKi), PARAMETER :: M13N2RAxe = 18821 - INTEGER(IntKi), PARAMETER :: M13N3RAxe = 18822 - INTEGER(IntKi), PARAMETER :: M13N4RAxe = 18823 - INTEGER(IntKi), PARAMETER :: M13N5RAxe = 18824 - INTEGER(IntKi), PARAMETER :: M13N6RAxe = 18825 - INTEGER(IntKi), PARAMETER :: M13N7RAxe = 18826 - INTEGER(IntKi), PARAMETER :: M13N8RAxe = 18827 - INTEGER(IntKi), PARAMETER :: M13N9RAxe = 18828 - INTEGER(IntKi), PARAMETER :: M14N1RAxe = 18829 - INTEGER(IntKi), PARAMETER :: M14N2RAxe = 18830 - INTEGER(IntKi), PARAMETER :: M14N3RAxe = 18831 - INTEGER(IntKi), PARAMETER :: M14N4RAxe = 18832 - INTEGER(IntKi), PARAMETER :: M14N5RAxe = 18833 - INTEGER(IntKi), PARAMETER :: M14N6RAxe = 18834 - INTEGER(IntKi), PARAMETER :: M14N7RAxe = 18835 - INTEGER(IntKi), PARAMETER :: M14N8RAxe = 18836 - INTEGER(IntKi), PARAMETER :: M14N9RAxe = 18837 - INTEGER(IntKi), PARAMETER :: M15N1RAxe = 18838 - INTEGER(IntKi), PARAMETER :: M15N2RAxe = 18839 - INTEGER(IntKi), PARAMETER :: M15N3RAxe = 18840 - INTEGER(IntKi), PARAMETER :: M15N4RAxe = 18841 - INTEGER(IntKi), PARAMETER :: M15N5RAxe = 18842 - INTEGER(IntKi), PARAMETER :: M15N6RAxe = 18843 - INTEGER(IntKi), PARAMETER :: M15N7RAxe = 18844 - INTEGER(IntKi), PARAMETER :: M15N8RAxe = 18845 - INTEGER(IntKi), PARAMETER :: M15N9RAxe = 18846 - INTEGER(IntKi), PARAMETER :: M16N1RAxe = 18847 - INTEGER(IntKi), PARAMETER :: M16N2RAxe = 18848 - INTEGER(IntKi), PARAMETER :: M16N3RAxe = 18849 - INTEGER(IntKi), PARAMETER :: M16N4RAxe = 18850 - INTEGER(IntKi), PARAMETER :: M16N5RAxe = 18851 - INTEGER(IntKi), PARAMETER :: M16N6RAxe = 18852 - INTEGER(IntKi), PARAMETER :: M16N7RAxe = 18853 - INTEGER(IntKi), PARAMETER :: M16N8RAxe = 18854 - INTEGER(IntKi), PARAMETER :: M16N9RAxe = 18855 - INTEGER(IntKi), PARAMETER :: M17N1RAxe = 18856 - INTEGER(IntKi), PARAMETER :: M17N2RAxe = 18857 - INTEGER(IntKi), PARAMETER :: M17N3RAxe = 18858 - INTEGER(IntKi), PARAMETER :: M17N4RAxe = 18859 - INTEGER(IntKi), PARAMETER :: M17N5RAxe = 18860 - INTEGER(IntKi), PARAMETER :: M17N6RAxe = 18861 - INTEGER(IntKi), PARAMETER :: M17N7RAxe = 18862 - INTEGER(IntKi), PARAMETER :: M17N8RAxe = 18863 - INTEGER(IntKi), PARAMETER :: M17N9RAxe = 18864 - INTEGER(IntKi), PARAMETER :: M18N1RAxe = 18865 - INTEGER(IntKi), PARAMETER :: M18N2RAxe = 18866 - INTEGER(IntKi), PARAMETER :: M18N3RAxe = 18867 - INTEGER(IntKi), PARAMETER :: M18N4RAxe = 18868 - INTEGER(IntKi), PARAMETER :: M18N5RAxe = 18869 - INTEGER(IntKi), PARAMETER :: M18N6RAxe = 18870 - INTEGER(IntKi), PARAMETER :: M18N7RAxe = 18871 - INTEGER(IntKi), PARAMETER :: M18N8RAxe = 18872 - INTEGER(IntKi), PARAMETER :: M18N9RAxe = 18873 - INTEGER(IntKi), PARAMETER :: M19N1RAxe = 18874 - INTEGER(IntKi), PARAMETER :: M19N2RAxe = 18875 - INTEGER(IntKi), PARAMETER :: M19N3RAxe = 18876 - INTEGER(IntKi), PARAMETER :: M19N4RAxe = 18877 - INTEGER(IntKi), PARAMETER :: M19N5RAxe = 18878 - INTEGER(IntKi), PARAMETER :: M19N6RAxe = 18879 - INTEGER(IntKi), PARAMETER :: M19N7RAxe = 18880 - INTEGER(IntKi), PARAMETER :: M19N8RAxe = 18881 - INTEGER(IntKi), PARAMETER :: M19N9RAxe = 18882 - INTEGER(IntKi), PARAMETER :: M20N1RAxe = 18883 - INTEGER(IntKi), PARAMETER :: M20N2RAxe = 18884 - INTEGER(IntKi), PARAMETER :: M20N3RAxe = 18885 - INTEGER(IntKi), PARAMETER :: M20N4RAxe = 18886 - INTEGER(IntKi), PARAMETER :: M20N5RAxe = 18887 - INTEGER(IntKi), PARAMETER :: M20N6RAxe = 18888 - INTEGER(IntKi), PARAMETER :: M20N7RAxe = 18889 - INTEGER(IntKi), PARAMETER :: M20N8RAxe = 18890 - INTEGER(IntKi), PARAMETER :: M20N9RAxe = 18891 - INTEGER(IntKi), PARAMETER :: M21N1RAxe = 18892 - INTEGER(IntKi), PARAMETER :: M21N2RAxe = 18893 - INTEGER(IntKi), PARAMETER :: M21N3RAxe = 18894 - INTEGER(IntKi), PARAMETER :: M21N4RAxe = 18895 - INTEGER(IntKi), PARAMETER :: M21N5RAxe = 18896 - INTEGER(IntKi), PARAMETER :: M21N6RAxe = 18897 - INTEGER(IntKi), PARAMETER :: M21N7RAxe = 18898 - INTEGER(IntKi), PARAMETER :: M21N8RAxe = 18899 - INTEGER(IntKi), PARAMETER :: M21N9RAxe = 18900 - INTEGER(IntKi), PARAMETER :: M22N1RAxe = 18901 - INTEGER(IntKi), PARAMETER :: M22N2RAxe = 18902 - INTEGER(IntKi), PARAMETER :: M22N3RAxe = 18903 - INTEGER(IntKi), PARAMETER :: M22N4RAxe = 18904 - INTEGER(IntKi), PARAMETER :: M22N5RAxe = 18905 - INTEGER(IntKi), PARAMETER :: M22N6RAxe = 18906 - INTEGER(IntKi), PARAMETER :: M22N7RAxe = 18907 - INTEGER(IntKi), PARAMETER :: M22N8RAxe = 18908 - INTEGER(IntKi), PARAMETER :: M22N9RAxe = 18909 - INTEGER(IntKi), PARAMETER :: M23N1RAxe = 18910 - INTEGER(IntKi), PARAMETER :: M23N2RAxe = 18911 - INTEGER(IntKi), PARAMETER :: M23N3RAxe = 18912 - INTEGER(IntKi), PARAMETER :: M23N4RAxe = 18913 - INTEGER(IntKi), PARAMETER :: M23N5RAxe = 18914 - INTEGER(IntKi), PARAMETER :: M23N6RAxe = 18915 - INTEGER(IntKi), PARAMETER :: M23N7RAxe = 18916 - INTEGER(IntKi), PARAMETER :: M23N8RAxe = 18917 - INTEGER(IntKi), PARAMETER :: M23N9RAxe = 18918 - INTEGER(IntKi), PARAMETER :: M24N1RAxe = 18919 - INTEGER(IntKi), PARAMETER :: M24N2RAxe = 18920 - INTEGER(IntKi), PARAMETER :: M24N3RAxe = 18921 - INTEGER(IntKi), PARAMETER :: M24N4RAxe = 18922 - INTEGER(IntKi), PARAMETER :: M24N5RAxe = 18923 - INTEGER(IntKi), PARAMETER :: M24N6RAxe = 18924 - INTEGER(IntKi), PARAMETER :: M24N7RAxe = 18925 - INTEGER(IntKi), PARAMETER :: M24N8RAxe = 18926 - INTEGER(IntKi), PARAMETER :: M24N9RAxe = 18927 - INTEGER(IntKi), PARAMETER :: M25N1RAxe = 18928 - INTEGER(IntKi), PARAMETER :: M25N2RAxe = 18929 - INTEGER(IntKi), PARAMETER :: M25N3RAxe = 18930 - INTEGER(IntKi), PARAMETER :: M25N4RAxe = 18931 - INTEGER(IntKi), PARAMETER :: M25N5RAxe = 18932 - INTEGER(IntKi), PARAMETER :: M25N6RAxe = 18933 - INTEGER(IntKi), PARAMETER :: M25N7RAxe = 18934 - INTEGER(IntKi), PARAMETER :: M25N8RAxe = 18935 - INTEGER(IntKi), PARAMETER :: M25N9RAxe = 18936 - INTEGER(IntKi), PARAMETER :: M26N1RAxe = 18937 - INTEGER(IntKi), PARAMETER :: M26N2RAxe = 18938 - INTEGER(IntKi), PARAMETER :: M26N3RAxe = 18939 - INTEGER(IntKi), PARAMETER :: M26N4RAxe = 18940 - INTEGER(IntKi), PARAMETER :: M26N5RAxe = 18941 - INTEGER(IntKi), PARAMETER :: M26N6RAxe = 18942 - INTEGER(IntKi), PARAMETER :: M26N7RAxe = 18943 - INTEGER(IntKi), PARAMETER :: M26N8RAxe = 18944 - INTEGER(IntKi), PARAMETER :: M26N9RAxe = 18945 - INTEGER(IntKi), PARAMETER :: M27N1RAxe = 18946 - INTEGER(IntKi), PARAMETER :: M27N2RAxe = 18947 - INTEGER(IntKi), PARAMETER :: M27N3RAxe = 18948 - INTEGER(IntKi), PARAMETER :: M27N4RAxe = 18949 - INTEGER(IntKi), PARAMETER :: M27N5RAxe = 18950 - INTEGER(IntKi), PARAMETER :: M27N6RAxe = 18951 - INTEGER(IntKi), PARAMETER :: M27N7RAxe = 18952 - INTEGER(IntKi), PARAMETER :: M27N8RAxe = 18953 - INTEGER(IntKi), PARAMETER :: M27N9RAxe = 18954 - INTEGER(IntKi), PARAMETER :: M28N1RAxe = 18955 - INTEGER(IntKi), PARAMETER :: M28N2RAxe = 18956 - INTEGER(IntKi), PARAMETER :: M28N3RAxe = 18957 - INTEGER(IntKi), PARAMETER :: M28N4RAxe = 18958 - INTEGER(IntKi), PARAMETER :: M28N5RAxe = 18959 - INTEGER(IntKi), PARAMETER :: M28N6RAxe = 18960 - INTEGER(IntKi), PARAMETER :: M28N7RAxe = 18961 - INTEGER(IntKi), PARAMETER :: M28N8RAxe = 18962 - INTEGER(IntKi), PARAMETER :: M28N9RAxe = 18963 - INTEGER(IntKi), PARAMETER :: M29N1RAxe = 18964 - INTEGER(IntKi), PARAMETER :: M29N2RAxe = 18965 - INTEGER(IntKi), PARAMETER :: M29N3RAxe = 18966 - INTEGER(IntKi), PARAMETER :: M29N4RAxe = 18967 - INTEGER(IntKi), PARAMETER :: M29N5RAxe = 18968 - INTEGER(IntKi), PARAMETER :: M29N6RAxe = 18969 - INTEGER(IntKi), PARAMETER :: M29N7RAxe = 18970 - INTEGER(IntKi), PARAMETER :: M29N8RAxe = 18971 - INTEGER(IntKi), PARAMETER :: M29N9RAxe = 18972 - INTEGER(IntKi), PARAMETER :: M30N1RAxe = 18973 - INTEGER(IntKi), PARAMETER :: M30N2RAxe = 18974 - INTEGER(IntKi), PARAMETER :: M30N3RAxe = 18975 - INTEGER(IntKi), PARAMETER :: M30N4RAxe = 18976 - INTEGER(IntKi), PARAMETER :: M30N5RAxe = 18977 - INTEGER(IntKi), PARAMETER :: M30N6RAxe = 18978 - INTEGER(IntKi), PARAMETER :: M30N7RAxe = 18979 - INTEGER(IntKi), PARAMETER :: M30N8RAxe = 18980 - INTEGER(IntKi), PARAMETER :: M30N9RAxe = 18981 - INTEGER(IntKi), PARAMETER :: M31N1RAxe = 18982 - INTEGER(IntKi), PARAMETER :: M31N2RAxe = 18983 - INTEGER(IntKi), PARAMETER :: M31N3RAxe = 18984 - INTEGER(IntKi), PARAMETER :: M31N4RAxe = 18985 - INTEGER(IntKi), PARAMETER :: M31N5RAxe = 18986 - INTEGER(IntKi), PARAMETER :: M31N6RAxe = 18987 - INTEGER(IntKi), PARAMETER :: M31N7RAxe = 18988 - INTEGER(IntKi), PARAMETER :: M31N8RAxe = 18989 - INTEGER(IntKi), PARAMETER :: M31N9RAxe = 18990 - INTEGER(IntKi), PARAMETER :: M32N1RAxe = 18991 - INTEGER(IntKi), PARAMETER :: M32N2RAxe = 18992 - INTEGER(IntKi), PARAMETER :: M32N3RAxe = 18993 - INTEGER(IntKi), PARAMETER :: M32N4RAxe = 18994 - INTEGER(IntKi), PARAMETER :: M32N5RAxe = 18995 - INTEGER(IntKi), PARAMETER :: M32N6RAxe = 18996 - INTEGER(IntKi), PARAMETER :: M32N7RAxe = 18997 - INTEGER(IntKi), PARAMETER :: M32N8RAxe = 18998 - INTEGER(IntKi), PARAMETER :: M32N9RAxe = 18999 - INTEGER(IntKi), PARAMETER :: M33N1RAxe = 19000 - INTEGER(IntKi), PARAMETER :: M33N2RAxe = 19001 - INTEGER(IntKi), PARAMETER :: M33N3RAxe = 19002 - INTEGER(IntKi), PARAMETER :: M33N4RAxe = 19003 - INTEGER(IntKi), PARAMETER :: M33N5RAxe = 19004 - INTEGER(IntKi), PARAMETER :: M33N6RAxe = 19005 - INTEGER(IntKi), PARAMETER :: M33N7RAxe = 19006 - INTEGER(IntKi), PARAMETER :: M33N8RAxe = 19007 - INTEGER(IntKi), PARAMETER :: M33N9RAxe = 19008 - INTEGER(IntKi), PARAMETER :: M34N1RAxe = 19009 - INTEGER(IntKi), PARAMETER :: M34N2RAxe = 19010 - INTEGER(IntKi), PARAMETER :: M34N3RAxe = 19011 - INTEGER(IntKi), PARAMETER :: M34N4RAxe = 19012 - INTEGER(IntKi), PARAMETER :: M34N5RAxe = 19013 - INTEGER(IntKi), PARAMETER :: M34N6RAxe = 19014 - INTEGER(IntKi), PARAMETER :: M34N7RAxe = 19015 - INTEGER(IntKi), PARAMETER :: M34N8RAxe = 19016 - INTEGER(IntKi), PARAMETER :: M34N9RAxe = 19017 - INTEGER(IntKi), PARAMETER :: M35N1RAxe = 19018 - INTEGER(IntKi), PARAMETER :: M35N2RAxe = 19019 - INTEGER(IntKi), PARAMETER :: M35N3RAxe = 19020 - INTEGER(IntKi), PARAMETER :: M35N4RAxe = 19021 - INTEGER(IntKi), PARAMETER :: M35N5RAxe = 19022 - INTEGER(IntKi), PARAMETER :: M35N6RAxe = 19023 - INTEGER(IntKi), PARAMETER :: M35N7RAxe = 19024 - INTEGER(IntKi), PARAMETER :: M35N8RAxe = 19025 - INTEGER(IntKi), PARAMETER :: M35N9RAxe = 19026 - INTEGER(IntKi), PARAMETER :: M36N1RAxe = 19027 - INTEGER(IntKi), PARAMETER :: M36N2RAxe = 19028 - INTEGER(IntKi), PARAMETER :: M36N3RAxe = 19029 - INTEGER(IntKi), PARAMETER :: M36N4RAxe = 19030 - INTEGER(IntKi), PARAMETER :: M36N5RAxe = 19031 - INTEGER(IntKi), PARAMETER :: M36N6RAxe = 19032 - INTEGER(IntKi), PARAMETER :: M36N7RAxe = 19033 - INTEGER(IntKi), PARAMETER :: M36N8RAxe = 19034 - INTEGER(IntKi), PARAMETER :: M36N9RAxe = 19035 - INTEGER(IntKi), PARAMETER :: M37N1RAxe = 19036 - INTEGER(IntKi), PARAMETER :: M37N2RAxe = 19037 - INTEGER(IntKi), PARAMETER :: M37N3RAxe = 19038 - INTEGER(IntKi), PARAMETER :: M37N4RAxe = 19039 - INTEGER(IntKi), PARAMETER :: M37N5RAxe = 19040 - INTEGER(IntKi), PARAMETER :: M37N6RAxe = 19041 - INTEGER(IntKi), PARAMETER :: M37N7RAxe = 19042 - INTEGER(IntKi), PARAMETER :: M37N8RAxe = 19043 - INTEGER(IntKi), PARAMETER :: M37N9RAxe = 19044 - INTEGER(IntKi), PARAMETER :: M38N1RAxe = 19045 - INTEGER(IntKi), PARAMETER :: M38N2RAxe = 19046 - INTEGER(IntKi), PARAMETER :: M38N3RAxe = 19047 - INTEGER(IntKi), PARAMETER :: M38N4RAxe = 19048 - INTEGER(IntKi), PARAMETER :: M38N5RAxe = 19049 - INTEGER(IntKi), PARAMETER :: M38N6RAxe = 19050 - INTEGER(IntKi), PARAMETER :: M38N7RAxe = 19051 - INTEGER(IntKi), PARAMETER :: M38N8RAxe = 19052 - INTEGER(IntKi), PARAMETER :: M38N9RAxe = 19053 - INTEGER(IntKi), PARAMETER :: M39N1RAxe = 19054 - INTEGER(IntKi), PARAMETER :: M39N2RAxe = 19055 - INTEGER(IntKi), PARAMETER :: M39N3RAxe = 19056 - INTEGER(IntKi), PARAMETER :: M39N4RAxe = 19057 - INTEGER(IntKi), PARAMETER :: M39N5RAxe = 19058 - INTEGER(IntKi), PARAMETER :: M39N6RAxe = 19059 - INTEGER(IntKi), PARAMETER :: M39N7RAxe = 19060 - INTEGER(IntKi), PARAMETER :: M39N8RAxe = 19061 - INTEGER(IntKi), PARAMETER :: M39N9RAxe = 19062 - INTEGER(IntKi), PARAMETER :: M40N1RAxe = 19063 - INTEGER(IntKi), PARAMETER :: M40N2RAxe = 19064 - INTEGER(IntKi), PARAMETER :: M40N3RAxe = 19065 - INTEGER(IntKi), PARAMETER :: M40N4RAxe = 19066 - INTEGER(IntKi), PARAMETER :: M40N5RAxe = 19067 - INTEGER(IntKi), PARAMETER :: M40N6RAxe = 19068 - INTEGER(IntKi), PARAMETER :: M40N7RAxe = 19069 - INTEGER(IntKi), PARAMETER :: M40N8RAxe = 19070 - INTEGER(IntKi), PARAMETER :: M40N9RAxe = 19071 - INTEGER(IntKi), PARAMETER :: M41N1RAxe = 19072 - INTEGER(IntKi), PARAMETER :: M41N2RAxe = 19073 - INTEGER(IntKi), PARAMETER :: M41N3RAxe = 19074 - INTEGER(IntKi), PARAMETER :: M41N4RAxe = 19075 - INTEGER(IntKi), PARAMETER :: M41N5RAxe = 19076 - INTEGER(IntKi), PARAMETER :: M41N6RAxe = 19077 - INTEGER(IntKi), PARAMETER :: M41N7RAxe = 19078 - INTEGER(IntKi), PARAMETER :: M41N8RAxe = 19079 - INTEGER(IntKi), PARAMETER :: M41N9RAxe = 19080 - INTEGER(IntKi), PARAMETER :: M42N1RAxe = 19081 - INTEGER(IntKi), PARAMETER :: M42N2RAxe = 19082 - INTEGER(IntKi), PARAMETER :: M42N3RAxe = 19083 - INTEGER(IntKi), PARAMETER :: M42N4RAxe = 19084 - INTEGER(IntKi), PARAMETER :: M42N5RAxe = 19085 - INTEGER(IntKi), PARAMETER :: M42N6RAxe = 19086 - INTEGER(IntKi), PARAMETER :: M42N7RAxe = 19087 - INTEGER(IntKi), PARAMETER :: M42N8RAxe = 19088 - INTEGER(IntKi), PARAMETER :: M42N9RAxe = 19089 - INTEGER(IntKi), PARAMETER :: M43N1RAxe = 19090 - INTEGER(IntKi), PARAMETER :: M43N2RAxe = 19091 - INTEGER(IntKi), PARAMETER :: M43N3RAxe = 19092 - INTEGER(IntKi), PARAMETER :: M43N4RAxe = 19093 - INTEGER(IntKi), PARAMETER :: M43N5RAxe = 19094 - INTEGER(IntKi), PARAMETER :: M43N6RAxe = 19095 - INTEGER(IntKi), PARAMETER :: M43N7RAxe = 19096 - INTEGER(IntKi), PARAMETER :: M43N8RAxe = 19097 - INTEGER(IntKi), PARAMETER :: M43N9RAxe = 19098 - INTEGER(IntKi), PARAMETER :: M44N1RAxe = 19099 - INTEGER(IntKi), PARAMETER :: M44N2RAxe = 19100 - INTEGER(IntKi), PARAMETER :: M44N3RAxe = 19101 - INTEGER(IntKi), PARAMETER :: M44N4RAxe = 19102 - INTEGER(IntKi), PARAMETER :: M44N5RAxe = 19103 - INTEGER(IntKi), PARAMETER :: M44N6RAxe = 19104 - INTEGER(IntKi), PARAMETER :: M44N7RAxe = 19105 - INTEGER(IntKi), PARAMETER :: M44N8RAxe = 19106 - INTEGER(IntKi), PARAMETER :: M44N9RAxe = 19107 - INTEGER(IntKi), PARAMETER :: M45N1RAxe = 19108 - INTEGER(IntKi), PARAMETER :: M45N2RAxe = 19109 - INTEGER(IntKi), PARAMETER :: M45N3RAxe = 19110 - INTEGER(IntKi), PARAMETER :: M45N4RAxe = 19111 - INTEGER(IntKi), PARAMETER :: M45N5RAxe = 19112 - INTEGER(IntKi), PARAMETER :: M45N6RAxe = 19113 - INTEGER(IntKi), PARAMETER :: M45N7RAxe = 19114 - INTEGER(IntKi), PARAMETER :: M45N8RAxe = 19115 - INTEGER(IntKi), PARAMETER :: M45N9RAxe = 19116 - INTEGER(IntKi), PARAMETER :: M46N1RAxe = 19117 - INTEGER(IntKi), PARAMETER :: M46N2RAxe = 19118 - INTEGER(IntKi), PARAMETER :: M46N3RAxe = 19119 - INTEGER(IntKi), PARAMETER :: M46N4RAxe = 19120 - INTEGER(IntKi), PARAMETER :: M46N5RAxe = 19121 - INTEGER(IntKi), PARAMETER :: M46N6RAxe = 19122 - INTEGER(IntKi), PARAMETER :: M46N7RAxe = 19123 - INTEGER(IntKi), PARAMETER :: M46N8RAxe = 19124 - INTEGER(IntKi), PARAMETER :: M46N9RAxe = 19125 - INTEGER(IntKi), PARAMETER :: M47N1RAxe = 19126 - INTEGER(IntKi), PARAMETER :: M47N2RAxe = 19127 - INTEGER(IntKi), PARAMETER :: M47N3RAxe = 19128 - INTEGER(IntKi), PARAMETER :: M47N4RAxe = 19129 - INTEGER(IntKi), PARAMETER :: M47N5RAxe = 19130 - INTEGER(IntKi), PARAMETER :: M47N6RAxe = 19131 - INTEGER(IntKi), PARAMETER :: M47N7RAxe = 19132 - INTEGER(IntKi), PARAMETER :: M47N8RAxe = 19133 - INTEGER(IntKi), PARAMETER :: M47N9RAxe = 19134 - INTEGER(IntKi), PARAMETER :: M48N1RAxe = 19135 - INTEGER(IntKi), PARAMETER :: M48N2RAxe = 19136 - INTEGER(IntKi), PARAMETER :: M48N3RAxe = 19137 - INTEGER(IntKi), PARAMETER :: M48N4RAxe = 19138 - INTEGER(IntKi), PARAMETER :: M48N5RAxe = 19139 - INTEGER(IntKi), PARAMETER :: M48N6RAxe = 19140 - INTEGER(IntKi), PARAMETER :: M48N7RAxe = 19141 - INTEGER(IntKi), PARAMETER :: M48N8RAxe = 19142 - INTEGER(IntKi), PARAMETER :: M48N9RAxe = 19143 - INTEGER(IntKi), PARAMETER :: M49N1RAxe = 19144 - INTEGER(IntKi), PARAMETER :: M49N2RAxe = 19145 - INTEGER(IntKi), PARAMETER :: M49N3RAxe = 19146 - INTEGER(IntKi), PARAMETER :: M49N4RAxe = 19147 - INTEGER(IntKi), PARAMETER :: M49N5RAxe = 19148 - INTEGER(IntKi), PARAMETER :: M49N6RAxe = 19149 - INTEGER(IntKi), PARAMETER :: M49N7RAxe = 19150 - INTEGER(IntKi), PARAMETER :: M49N8RAxe = 19151 - INTEGER(IntKi), PARAMETER :: M49N9RAxe = 19152 - INTEGER(IntKi), PARAMETER :: M50N1RAxe = 19153 - INTEGER(IntKi), PARAMETER :: M50N2RAxe = 19154 - INTEGER(IntKi), PARAMETER :: M50N3RAxe = 19155 - INTEGER(IntKi), PARAMETER :: M50N4RAxe = 19156 - INTEGER(IntKi), PARAMETER :: M50N5RAxe = 19157 - INTEGER(IntKi), PARAMETER :: M50N6RAxe = 19158 - INTEGER(IntKi), PARAMETER :: M50N7RAxe = 19159 - INTEGER(IntKi), PARAMETER :: M50N8RAxe = 19160 - INTEGER(IntKi), PARAMETER :: M50N9RAxe = 19161 - INTEGER(IntKi), PARAMETER :: M51N1RAxe = 19162 - INTEGER(IntKi), PARAMETER :: M51N2RAxe = 19163 - INTEGER(IntKi), PARAMETER :: M51N3RAxe = 19164 - INTEGER(IntKi), PARAMETER :: M51N4RAxe = 19165 - INTEGER(IntKi), PARAMETER :: M51N5RAxe = 19166 - INTEGER(IntKi), PARAMETER :: M51N6RAxe = 19167 - INTEGER(IntKi), PARAMETER :: M51N7RAxe = 19168 - INTEGER(IntKi), PARAMETER :: M51N8RAxe = 19169 - INTEGER(IntKi), PARAMETER :: M51N9RAxe = 19170 - INTEGER(IntKi), PARAMETER :: M52N1RAxe = 19171 - INTEGER(IntKi), PARAMETER :: M52N2RAxe = 19172 - INTEGER(IntKi), PARAMETER :: M52N3RAxe = 19173 - INTEGER(IntKi), PARAMETER :: M52N4RAxe = 19174 - INTEGER(IntKi), PARAMETER :: M52N5RAxe = 19175 - INTEGER(IntKi), PARAMETER :: M52N6RAxe = 19176 - INTEGER(IntKi), PARAMETER :: M52N7RAxe = 19177 - INTEGER(IntKi), PARAMETER :: M52N8RAxe = 19178 - INTEGER(IntKi), PARAMETER :: M52N9RAxe = 19179 - INTEGER(IntKi), PARAMETER :: M53N1RAxe = 19180 - INTEGER(IntKi), PARAMETER :: M53N2RAxe = 19181 - INTEGER(IntKi), PARAMETER :: M53N3RAxe = 19182 - INTEGER(IntKi), PARAMETER :: M53N4RAxe = 19183 - INTEGER(IntKi), PARAMETER :: M53N5RAxe = 19184 - INTEGER(IntKi), PARAMETER :: M53N6RAxe = 19185 - INTEGER(IntKi), PARAMETER :: M53N7RAxe = 19186 - INTEGER(IntKi), PARAMETER :: M53N8RAxe = 19187 - INTEGER(IntKi), PARAMETER :: M53N9RAxe = 19188 - INTEGER(IntKi), PARAMETER :: M54N1RAxe = 19189 - INTEGER(IntKi), PARAMETER :: M54N2RAxe = 19190 - INTEGER(IntKi), PARAMETER :: M54N3RAxe = 19191 - INTEGER(IntKi), PARAMETER :: M54N4RAxe = 19192 - INTEGER(IntKi), PARAMETER :: M54N5RAxe = 19193 - INTEGER(IntKi), PARAMETER :: M54N6RAxe = 19194 - INTEGER(IntKi), PARAMETER :: M54N7RAxe = 19195 - INTEGER(IntKi), PARAMETER :: M54N8RAxe = 19196 - INTEGER(IntKi), PARAMETER :: M54N9RAxe = 19197 - INTEGER(IntKi), PARAMETER :: M55N1RAxe = 19198 - INTEGER(IntKi), PARAMETER :: M55N2RAxe = 19199 - INTEGER(IntKi), PARAMETER :: M55N3RAxe = 19200 - INTEGER(IntKi), PARAMETER :: M55N4RAxe = 19201 - INTEGER(IntKi), PARAMETER :: M55N5RAxe = 19202 - INTEGER(IntKi), PARAMETER :: M55N6RAxe = 19203 - INTEGER(IntKi), PARAMETER :: M55N7RAxe = 19204 - INTEGER(IntKi), PARAMETER :: M55N8RAxe = 19205 - INTEGER(IntKi), PARAMETER :: M55N9RAxe = 19206 - INTEGER(IntKi), PARAMETER :: M56N1RAxe = 19207 - INTEGER(IntKi), PARAMETER :: M56N2RAxe = 19208 - INTEGER(IntKi), PARAMETER :: M56N3RAxe = 19209 - INTEGER(IntKi), PARAMETER :: M56N4RAxe = 19210 - INTEGER(IntKi), PARAMETER :: M56N5RAxe = 19211 - INTEGER(IntKi), PARAMETER :: M56N6RAxe = 19212 - INTEGER(IntKi), PARAMETER :: M56N7RAxe = 19213 - INTEGER(IntKi), PARAMETER :: M56N8RAxe = 19214 - INTEGER(IntKi), PARAMETER :: M56N9RAxe = 19215 - INTEGER(IntKi), PARAMETER :: M57N1RAxe = 19216 - INTEGER(IntKi), PARAMETER :: M57N2RAxe = 19217 - INTEGER(IntKi), PARAMETER :: M57N3RAxe = 19218 - INTEGER(IntKi), PARAMETER :: M57N4RAxe = 19219 - INTEGER(IntKi), PARAMETER :: M57N5RAxe = 19220 - INTEGER(IntKi), PARAMETER :: M57N6RAxe = 19221 - INTEGER(IntKi), PARAMETER :: M57N7RAxe = 19222 - INTEGER(IntKi), PARAMETER :: M57N8RAxe = 19223 - INTEGER(IntKi), PARAMETER :: M57N9RAxe = 19224 - INTEGER(IntKi), PARAMETER :: M58N1RAxe = 19225 - INTEGER(IntKi), PARAMETER :: M58N2RAxe = 19226 - INTEGER(IntKi), PARAMETER :: M58N3RAxe = 19227 - INTEGER(IntKi), PARAMETER :: M58N4RAxe = 19228 - INTEGER(IntKi), PARAMETER :: M58N5RAxe = 19229 - INTEGER(IntKi), PARAMETER :: M58N6RAxe = 19230 - INTEGER(IntKi), PARAMETER :: M58N7RAxe = 19231 - INTEGER(IntKi), PARAMETER :: M58N8RAxe = 19232 - INTEGER(IntKi), PARAMETER :: M58N9RAxe = 19233 - INTEGER(IntKi), PARAMETER :: M59N1RAxe = 19234 - INTEGER(IntKi), PARAMETER :: M59N2RAxe = 19235 - INTEGER(IntKi), PARAMETER :: M59N3RAxe = 19236 - INTEGER(IntKi), PARAMETER :: M59N4RAxe = 19237 - INTEGER(IntKi), PARAMETER :: M59N5RAxe = 19238 - INTEGER(IntKi), PARAMETER :: M59N6RAxe = 19239 - INTEGER(IntKi), PARAMETER :: M59N7RAxe = 19240 - INTEGER(IntKi), PARAMETER :: M59N8RAxe = 19241 - INTEGER(IntKi), PARAMETER :: M59N9RAxe = 19242 - INTEGER(IntKi), PARAMETER :: M60N1RAxe = 19243 - INTEGER(IntKi), PARAMETER :: M60N2RAxe = 19244 - INTEGER(IntKi), PARAMETER :: M60N3RAxe = 19245 - INTEGER(IntKi), PARAMETER :: M60N4RAxe = 19246 - INTEGER(IntKi), PARAMETER :: M60N5RAxe = 19247 - INTEGER(IntKi), PARAMETER :: M60N6RAxe = 19248 - INTEGER(IntKi), PARAMETER :: M60N7RAxe = 19249 - INTEGER(IntKi), PARAMETER :: M60N8RAxe = 19250 - INTEGER(IntKi), PARAMETER :: M60N9RAxe = 19251 - INTEGER(IntKi), PARAMETER :: M61N1RAxe = 19252 - INTEGER(IntKi), PARAMETER :: M61N2RAxe = 19253 - INTEGER(IntKi), PARAMETER :: M61N3RAxe = 19254 - INTEGER(IntKi), PARAMETER :: M61N4RAxe = 19255 - INTEGER(IntKi), PARAMETER :: M61N5RAxe = 19256 - INTEGER(IntKi), PARAMETER :: M61N6RAxe = 19257 - INTEGER(IntKi), PARAMETER :: M61N7RAxe = 19258 - INTEGER(IntKi), PARAMETER :: M61N8RAxe = 19259 - INTEGER(IntKi), PARAMETER :: M61N9RAxe = 19260 - INTEGER(IntKi), PARAMETER :: M62N1RAxe = 19261 - INTEGER(IntKi), PARAMETER :: M62N2RAxe = 19262 - INTEGER(IntKi), PARAMETER :: M62N3RAxe = 19263 - INTEGER(IntKi), PARAMETER :: M62N4RAxe = 19264 - INTEGER(IntKi), PARAMETER :: M62N5RAxe = 19265 - INTEGER(IntKi), PARAMETER :: M62N6RAxe = 19266 - INTEGER(IntKi), PARAMETER :: M62N7RAxe = 19267 - INTEGER(IntKi), PARAMETER :: M62N8RAxe = 19268 - INTEGER(IntKi), PARAMETER :: M62N9RAxe = 19269 - INTEGER(IntKi), PARAMETER :: M63N1RAxe = 19270 - INTEGER(IntKi), PARAMETER :: M63N2RAxe = 19271 - INTEGER(IntKi), PARAMETER :: M63N3RAxe = 19272 - INTEGER(IntKi), PARAMETER :: M63N4RAxe = 19273 - INTEGER(IntKi), PARAMETER :: M63N5RAxe = 19274 - INTEGER(IntKi), PARAMETER :: M63N6RAxe = 19275 - INTEGER(IntKi), PARAMETER :: M63N7RAxe = 19276 - INTEGER(IntKi), PARAMETER :: M63N8RAxe = 19277 - INTEGER(IntKi), PARAMETER :: M63N9RAxe = 19278 - INTEGER(IntKi), PARAMETER :: M64N1RAxe = 19279 - INTEGER(IntKi), PARAMETER :: M64N2RAxe = 19280 - INTEGER(IntKi), PARAMETER :: M64N3RAxe = 19281 - INTEGER(IntKi), PARAMETER :: M64N4RAxe = 19282 - INTEGER(IntKi), PARAMETER :: M64N5RAxe = 19283 - INTEGER(IntKi), PARAMETER :: M64N6RAxe = 19284 - INTEGER(IntKi), PARAMETER :: M64N7RAxe = 19285 - INTEGER(IntKi), PARAMETER :: M64N8RAxe = 19286 - INTEGER(IntKi), PARAMETER :: M64N9RAxe = 19287 - INTEGER(IntKi), PARAMETER :: M65N1RAxe = 19288 - INTEGER(IntKi), PARAMETER :: M65N2RAxe = 19289 - INTEGER(IntKi), PARAMETER :: M65N3RAxe = 19290 - INTEGER(IntKi), PARAMETER :: M65N4RAxe = 19291 - INTEGER(IntKi), PARAMETER :: M65N5RAxe = 19292 - INTEGER(IntKi), PARAMETER :: M65N6RAxe = 19293 - INTEGER(IntKi), PARAMETER :: M65N7RAxe = 19294 - INTEGER(IntKi), PARAMETER :: M65N8RAxe = 19295 - INTEGER(IntKi), PARAMETER :: M65N9RAxe = 19296 - INTEGER(IntKi), PARAMETER :: M66N1RAxe = 19297 - INTEGER(IntKi), PARAMETER :: M66N2RAxe = 19298 - INTEGER(IntKi), PARAMETER :: M66N3RAxe = 19299 - INTEGER(IntKi), PARAMETER :: M66N4RAxe = 19300 - INTEGER(IntKi), PARAMETER :: M66N5RAxe = 19301 - INTEGER(IntKi), PARAMETER :: M66N6RAxe = 19302 - INTEGER(IntKi), PARAMETER :: M66N7RAxe = 19303 - INTEGER(IntKi), PARAMETER :: M66N8RAxe = 19304 - INTEGER(IntKi), PARAMETER :: M66N9RAxe = 19305 - INTEGER(IntKi), PARAMETER :: M67N1RAxe = 19306 - INTEGER(IntKi), PARAMETER :: M67N2RAxe = 19307 - INTEGER(IntKi), PARAMETER :: M67N3RAxe = 19308 - INTEGER(IntKi), PARAMETER :: M67N4RAxe = 19309 - INTEGER(IntKi), PARAMETER :: M67N5RAxe = 19310 - INTEGER(IntKi), PARAMETER :: M67N6RAxe = 19311 - INTEGER(IntKi), PARAMETER :: M67N7RAxe = 19312 - INTEGER(IntKi), PARAMETER :: M67N8RAxe = 19313 - INTEGER(IntKi), PARAMETER :: M67N9RAxe = 19314 - INTEGER(IntKi), PARAMETER :: M68N1RAxe = 19315 - INTEGER(IntKi), PARAMETER :: M68N2RAxe = 19316 - INTEGER(IntKi), PARAMETER :: M68N3RAxe = 19317 - INTEGER(IntKi), PARAMETER :: M68N4RAxe = 19318 - INTEGER(IntKi), PARAMETER :: M68N5RAxe = 19319 - INTEGER(IntKi), PARAMETER :: M68N6RAxe = 19320 - INTEGER(IntKi), PARAMETER :: M68N7RAxe = 19321 - INTEGER(IntKi), PARAMETER :: M68N8RAxe = 19322 - INTEGER(IntKi), PARAMETER :: M68N9RAxe = 19323 - INTEGER(IntKi), PARAMETER :: M69N1RAxe = 19324 - INTEGER(IntKi), PARAMETER :: M69N2RAxe = 19325 - INTEGER(IntKi), PARAMETER :: M69N3RAxe = 19326 - INTEGER(IntKi), PARAMETER :: M69N4RAxe = 19327 - INTEGER(IntKi), PARAMETER :: M69N5RAxe = 19328 - INTEGER(IntKi), PARAMETER :: M69N6RAxe = 19329 - INTEGER(IntKi), PARAMETER :: M69N7RAxe = 19330 - INTEGER(IntKi), PARAMETER :: M69N8RAxe = 19331 - INTEGER(IntKi), PARAMETER :: M69N9RAxe = 19332 - INTEGER(IntKi), PARAMETER :: M70N1RAxe = 19333 - INTEGER(IntKi), PARAMETER :: M70N2RAxe = 19334 - INTEGER(IntKi), PARAMETER :: M70N3RAxe = 19335 - INTEGER(IntKi), PARAMETER :: M70N4RAxe = 19336 - INTEGER(IntKi), PARAMETER :: M70N5RAxe = 19337 - INTEGER(IntKi), PARAMETER :: M70N6RAxe = 19338 - INTEGER(IntKi), PARAMETER :: M70N7RAxe = 19339 - INTEGER(IntKi), PARAMETER :: M70N8RAxe = 19340 - INTEGER(IntKi), PARAMETER :: M70N9RAxe = 19341 - INTEGER(IntKi), PARAMETER :: M71N1RAxe = 19342 - INTEGER(IntKi), PARAMETER :: M71N2RAxe = 19343 - INTEGER(IntKi), PARAMETER :: M71N3RAxe = 19344 - INTEGER(IntKi), PARAMETER :: M71N4RAxe = 19345 - INTEGER(IntKi), PARAMETER :: M71N5RAxe = 19346 - INTEGER(IntKi), PARAMETER :: M71N6RAxe = 19347 - INTEGER(IntKi), PARAMETER :: M71N7RAxe = 19348 - INTEGER(IntKi), PARAMETER :: M71N8RAxe = 19349 - INTEGER(IntKi), PARAMETER :: M71N9RAxe = 19350 - INTEGER(IntKi), PARAMETER :: M72N1RAxe = 19351 - INTEGER(IntKi), PARAMETER :: M72N2RAxe = 19352 - INTEGER(IntKi), PARAMETER :: M72N3RAxe = 19353 - INTEGER(IntKi), PARAMETER :: M72N4RAxe = 19354 - INTEGER(IntKi), PARAMETER :: M72N5RAxe = 19355 - INTEGER(IntKi), PARAMETER :: M72N6RAxe = 19356 - INTEGER(IntKi), PARAMETER :: M72N7RAxe = 19357 - INTEGER(IntKi), PARAMETER :: M72N8RAxe = 19358 - INTEGER(IntKi), PARAMETER :: M72N9RAxe = 19359 - INTEGER(IntKi), PARAMETER :: M73N1RAxe = 19360 - INTEGER(IntKi), PARAMETER :: M73N2RAxe = 19361 - INTEGER(IntKi), PARAMETER :: M73N3RAxe = 19362 - INTEGER(IntKi), PARAMETER :: M73N4RAxe = 19363 - INTEGER(IntKi), PARAMETER :: M73N5RAxe = 19364 - INTEGER(IntKi), PARAMETER :: M73N6RAxe = 19365 - INTEGER(IntKi), PARAMETER :: M73N7RAxe = 19366 - INTEGER(IntKi), PARAMETER :: M73N8RAxe = 19367 - INTEGER(IntKi), PARAMETER :: M73N9RAxe = 19368 - INTEGER(IntKi), PARAMETER :: M74N1RAxe = 19369 - INTEGER(IntKi), PARAMETER :: M74N2RAxe = 19370 - INTEGER(IntKi), PARAMETER :: M74N3RAxe = 19371 - INTEGER(IntKi), PARAMETER :: M74N4RAxe = 19372 - INTEGER(IntKi), PARAMETER :: M74N5RAxe = 19373 - INTEGER(IntKi), PARAMETER :: M74N6RAxe = 19374 - INTEGER(IntKi), PARAMETER :: M74N7RAxe = 19375 - INTEGER(IntKi), PARAMETER :: M74N8RAxe = 19376 - INTEGER(IntKi), PARAMETER :: M74N9RAxe = 19377 - INTEGER(IntKi), PARAMETER :: M75N1RAxe = 19378 - INTEGER(IntKi), PARAMETER :: M75N2RAxe = 19379 - INTEGER(IntKi), PARAMETER :: M75N3RAxe = 19380 - INTEGER(IntKi), PARAMETER :: M75N4RAxe = 19381 - INTEGER(IntKi), PARAMETER :: M75N5RAxe = 19382 - INTEGER(IntKi), PARAMETER :: M75N6RAxe = 19383 - INTEGER(IntKi), PARAMETER :: M75N7RAxe = 19384 - INTEGER(IntKi), PARAMETER :: M75N8RAxe = 19385 - INTEGER(IntKi), PARAMETER :: M75N9RAxe = 19386 - INTEGER(IntKi), PARAMETER :: M76N1RAxe = 19387 - INTEGER(IntKi), PARAMETER :: M76N2RAxe = 19388 - INTEGER(IntKi), PARAMETER :: M76N3RAxe = 19389 - INTEGER(IntKi), PARAMETER :: M76N4RAxe = 19390 - INTEGER(IntKi), PARAMETER :: M76N5RAxe = 19391 - INTEGER(IntKi), PARAMETER :: M76N6RAxe = 19392 - INTEGER(IntKi), PARAMETER :: M76N7RAxe = 19393 - INTEGER(IntKi), PARAMETER :: M76N8RAxe = 19394 - INTEGER(IntKi), PARAMETER :: M76N9RAxe = 19395 - INTEGER(IntKi), PARAMETER :: M77N1RAxe = 19396 - INTEGER(IntKi), PARAMETER :: M77N2RAxe = 19397 - INTEGER(IntKi), PARAMETER :: M77N3RAxe = 19398 - INTEGER(IntKi), PARAMETER :: M77N4RAxe = 19399 - INTEGER(IntKi), PARAMETER :: M77N5RAxe = 19400 - INTEGER(IntKi), PARAMETER :: M77N6RAxe = 19401 - INTEGER(IntKi), PARAMETER :: M77N7RAxe = 19402 - INTEGER(IntKi), PARAMETER :: M77N8RAxe = 19403 - INTEGER(IntKi), PARAMETER :: M77N9RAxe = 19404 - INTEGER(IntKi), PARAMETER :: M78N1RAxe = 19405 - INTEGER(IntKi), PARAMETER :: M78N2RAxe = 19406 - INTEGER(IntKi), PARAMETER :: M78N3RAxe = 19407 - INTEGER(IntKi), PARAMETER :: M78N4RAxe = 19408 - INTEGER(IntKi), PARAMETER :: M78N5RAxe = 19409 - INTEGER(IntKi), PARAMETER :: M78N6RAxe = 19410 - INTEGER(IntKi), PARAMETER :: M78N7RAxe = 19411 - INTEGER(IntKi), PARAMETER :: M78N8RAxe = 19412 - INTEGER(IntKi), PARAMETER :: M78N9RAxe = 19413 - INTEGER(IntKi), PARAMETER :: M79N1RAxe = 19414 - INTEGER(IntKi), PARAMETER :: M79N2RAxe = 19415 - INTEGER(IntKi), PARAMETER :: M79N3RAxe = 19416 - INTEGER(IntKi), PARAMETER :: M79N4RAxe = 19417 - INTEGER(IntKi), PARAMETER :: M79N5RAxe = 19418 - INTEGER(IntKi), PARAMETER :: M79N6RAxe = 19419 - INTEGER(IntKi), PARAMETER :: M79N7RAxe = 19420 - INTEGER(IntKi), PARAMETER :: M79N8RAxe = 19421 - INTEGER(IntKi), PARAMETER :: M79N9RAxe = 19422 - INTEGER(IntKi), PARAMETER :: M80N1RAxe = 19423 - INTEGER(IntKi), PARAMETER :: M80N2RAxe = 19424 - INTEGER(IntKi), PARAMETER :: M80N3RAxe = 19425 - INTEGER(IntKi), PARAMETER :: M80N4RAxe = 19426 - INTEGER(IntKi), PARAMETER :: M80N5RAxe = 19427 - INTEGER(IntKi), PARAMETER :: M80N6RAxe = 19428 - INTEGER(IntKi), PARAMETER :: M80N7RAxe = 19429 - INTEGER(IntKi), PARAMETER :: M80N8RAxe = 19430 - INTEGER(IntKi), PARAMETER :: M80N9RAxe = 19431 - INTEGER(IntKi), PARAMETER :: M81N1RAxe = 19432 - INTEGER(IntKi), PARAMETER :: M81N2RAxe = 19433 - INTEGER(IntKi), PARAMETER :: M81N3RAxe = 19434 - INTEGER(IntKi), PARAMETER :: M81N4RAxe = 19435 - INTEGER(IntKi), PARAMETER :: M81N5RAxe = 19436 - INTEGER(IntKi), PARAMETER :: M81N6RAxe = 19437 - INTEGER(IntKi), PARAMETER :: M81N7RAxe = 19438 - INTEGER(IntKi), PARAMETER :: M81N8RAxe = 19439 - INTEGER(IntKi), PARAMETER :: M81N9RAxe = 19440 - INTEGER(IntKi), PARAMETER :: M82N1RAxe = 19441 - INTEGER(IntKi), PARAMETER :: M82N2RAxe = 19442 - INTEGER(IntKi), PARAMETER :: M82N3RAxe = 19443 - INTEGER(IntKi), PARAMETER :: M82N4RAxe = 19444 - INTEGER(IntKi), PARAMETER :: M82N5RAxe = 19445 - INTEGER(IntKi), PARAMETER :: M82N6RAxe = 19446 - INTEGER(IntKi), PARAMETER :: M82N7RAxe = 19447 - INTEGER(IntKi), PARAMETER :: M82N8RAxe = 19448 - INTEGER(IntKi), PARAMETER :: M82N9RAxe = 19449 - INTEGER(IntKi), PARAMETER :: M83N1RAxe = 19450 - INTEGER(IntKi), PARAMETER :: M83N2RAxe = 19451 - INTEGER(IntKi), PARAMETER :: M83N3RAxe = 19452 - INTEGER(IntKi), PARAMETER :: M83N4RAxe = 19453 - INTEGER(IntKi), PARAMETER :: M83N5RAxe = 19454 - INTEGER(IntKi), PARAMETER :: M83N6RAxe = 19455 - INTEGER(IntKi), PARAMETER :: M83N7RAxe = 19456 - INTEGER(IntKi), PARAMETER :: M83N8RAxe = 19457 - INTEGER(IntKi), PARAMETER :: M83N9RAxe = 19458 - INTEGER(IntKi), PARAMETER :: M84N1RAxe = 19459 - INTEGER(IntKi), PARAMETER :: M84N2RAxe = 19460 - INTEGER(IntKi), PARAMETER :: M84N3RAxe = 19461 - INTEGER(IntKi), PARAMETER :: M84N4RAxe = 19462 - INTEGER(IntKi), PARAMETER :: M84N5RAxe = 19463 - INTEGER(IntKi), PARAMETER :: M84N6RAxe = 19464 - INTEGER(IntKi), PARAMETER :: M84N7RAxe = 19465 - INTEGER(IntKi), PARAMETER :: M84N8RAxe = 19466 - INTEGER(IntKi), PARAMETER :: M84N9RAxe = 19467 - INTEGER(IntKi), PARAMETER :: M85N1RAxe = 19468 - INTEGER(IntKi), PARAMETER :: M85N2RAxe = 19469 - INTEGER(IntKi), PARAMETER :: M85N3RAxe = 19470 - INTEGER(IntKi), PARAMETER :: M85N4RAxe = 19471 - INTEGER(IntKi), PARAMETER :: M85N5RAxe = 19472 - INTEGER(IntKi), PARAMETER :: M85N6RAxe = 19473 - INTEGER(IntKi), PARAMETER :: M85N7RAxe = 19474 - INTEGER(IntKi), PARAMETER :: M85N8RAxe = 19475 - INTEGER(IntKi), PARAMETER :: M85N9RAxe = 19476 - INTEGER(IntKi), PARAMETER :: M86N1RAxe = 19477 - INTEGER(IntKi), PARAMETER :: M86N2RAxe = 19478 - INTEGER(IntKi), PARAMETER :: M86N3RAxe = 19479 - INTEGER(IntKi), PARAMETER :: M86N4RAxe = 19480 - INTEGER(IntKi), PARAMETER :: M86N5RAxe = 19481 - INTEGER(IntKi), PARAMETER :: M86N6RAxe = 19482 - INTEGER(IntKi), PARAMETER :: M86N7RAxe = 19483 - INTEGER(IntKi), PARAMETER :: M86N8RAxe = 19484 - INTEGER(IntKi), PARAMETER :: M86N9RAxe = 19485 - INTEGER(IntKi), PARAMETER :: M87N1RAxe = 19486 - INTEGER(IntKi), PARAMETER :: M87N2RAxe = 19487 - INTEGER(IntKi), PARAMETER :: M87N3RAxe = 19488 - INTEGER(IntKi), PARAMETER :: M87N4RAxe = 19489 - INTEGER(IntKi), PARAMETER :: M87N5RAxe = 19490 - INTEGER(IntKi), PARAMETER :: M87N6RAxe = 19491 - INTEGER(IntKi), PARAMETER :: M87N7RAxe = 19492 - INTEGER(IntKi), PARAMETER :: M87N8RAxe = 19493 - INTEGER(IntKi), PARAMETER :: M87N9RAxe = 19494 - INTEGER(IntKi), PARAMETER :: M88N1RAxe = 19495 - INTEGER(IntKi), PARAMETER :: M88N2RAxe = 19496 - INTEGER(IntKi), PARAMETER :: M88N3RAxe = 19497 - INTEGER(IntKi), PARAMETER :: M88N4RAxe = 19498 - INTEGER(IntKi), PARAMETER :: M88N5RAxe = 19499 - INTEGER(IntKi), PARAMETER :: M88N6RAxe = 19500 - INTEGER(IntKi), PARAMETER :: M88N7RAxe = 19501 - INTEGER(IntKi), PARAMETER :: M88N8RAxe = 19502 - INTEGER(IntKi), PARAMETER :: M88N9RAxe = 19503 - INTEGER(IntKi), PARAMETER :: M89N1RAxe = 19504 - INTEGER(IntKi), PARAMETER :: M89N2RAxe = 19505 - INTEGER(IntKi), PARAMETER :: M89N3RAxe = 19506 - INTEGER(IntKi), PARAMETER :: M89N4RAxe = 19507 - INTEGER(IntKi), PARAMETER :: M89N5RAxe = 19508 - INTEGER(IntKi), PARAMETER :: M89N6RAxe = 19509 - INTEGER(IntKi), PARAMETER :: M89N7RAxe = 19510 - INTEGER(IntKi), PARAMETER :: M89N8RAxe = 19511 - INTEGER(IntKi), PARAMETER :: M89N9RAxe = 19512 - INTEGER(IntKi), PARAMETER :: M90N1RAxe = 19513 - INTEGER(IntKi), PARAMETER :: M90N2RAxe = 19514 - INTEGER(IntKi), PARAMETER :: M90N3RAxe = 19515 - INTEGER(IntKi), PARAMETER :: M90N4RAxe = 19516 - INTEGER(IntKi), PARAMETER :: M90N5RAxe = 19517 - INTEGER(IntKi), PARAMETER :: M90N6RAxe = 19518 - INTEGER(IntKi), PARAMETER :: M90N7RAxe = 19519 - INTEGER(IntKi), PARAMETER :: M90N8RAxe = 19520 - INTEGER(IntKi), PARAMETER :: M90N9RAxe = 19521 - INTEGER(IntKi), PARAMETER :: M91N1RAxe = 19522 - INTEGER(IntKi), PARAMETER :: M91N2RAxe = 19523 - INTEGER(IntKi), PARAMETER :: M91N3RAxe = 19524 - INTEGER(IntKi), PARAMETER :: M91N4RAxe = 19525 - INTEGER(IntKi), PARAMETER :: M91N5RAxe = 19526 - INTEGER(IntKi), PARAMETER :: M91N6RAxe = 19527 - INTEGER(IntKi), PARAMETER :: M91N7RAxe = 19528 - INTEGER(IntKi), PARAMETER :: M91N8RAxe = 19529 - INTEGER(IntKi), PARAMETER :: M91N9RAxe = 19530 - INTEGER(IntKi), PARAMETER :: M92N1RAxe = 19531 - INTEGER(IntKi), PARAMETER :: M92N2RAxe = 19532 - INTEGER(IntKi), PARAMETER :: M92N3RAxe = 19533 - INTEGER(IntKi), PARAMETER :: M92N4RAxe = 19534 - INTEGER(IntKi), PARAMETER :: M92N5RAxe = 19535 - INTEGER(IntKi), PARAMETER :: M92N6RAxe = 19536 - INTEGER(IntKi), PARAMETER :: M92N7RAxe = 19537 - INTEGER(IntKi), PARAMETER :: M92N8RAxe = 19538 - INTEGER(IntKi), PARAMETER :: M92N9RAxe = 19539 - INTEGER(IntKi), PARAMETER :: M93N1RAxe = 19540 - INTEGER(IntKi), PARAMETER :: M93N2RAxe = 19541 - INTEGER(IntKi), PARAMETER :: M93N3RAxe = 19542 - INTEGER(IntKi), PARAMETER :: M93N4RAxe = 19543 - INTEGER(IntKi), PARAMETER :: M93N5RAxe = 19544 - INTEGER(IntKi), PARAMETER :: M93N6RAxe = 19545 - INTEGER(IntKi), PARAMETER :: M93N7RAxe = 19546 - INTEGER(IntKi), PARAMETER :: M93N8RAxe = 19547 - INTEGER(IntKi), PARAMETER :: M93N9RAxe = 19548 - INTEGER(IntKi), PARAMETER :: M94N1RAxe = 19549 - INTEGER(IntKi), PARAMETER :: M94N2RAxe = 19550 - INTEGER(IntKi), PARAMETER :: M94N3RAxe = 19551 - INTEGER(IntKi), PARAMETER :: M94N4RAxe = 19552 - INTEGER(IntKi), PARAMETER :: M94N5RAxe = 19553 - INTEGER(IntKi), PARAMETER :: M94N6RAxe = 19554 - INTEGER(IntKi), PARAMETER :: M94N7RAxe = 19555 - INTEGER(IntKi), PARAMETER :: M94N8RAxe = 19556 - INTEGER(IntKi), PARAMETER :: M94N9RAxe = 19557 - INTEGER(IntKi), PARAMETER :: M95N1RAxe = 19558 - INTEGER(IntKi), PARAMETER :: M95N2RAxe = 19559 - INTEGER(IntKi), PARAMETER :: M95N3RAxe = 19560 - INTEGER(IntKi), PARAMETER :: M95N4RAxe = 19561 - INTEGER(IntKi), PARAMETER :: M95N5RAxe = 19562 - INTEGER(IntKi), PARAMETER :: M95N6RAxe = 19563 - INTEGER(IntKi), PARAMETER :: M95N7RAxe = 19564 - INTEGER(IntKi), PARAMETER :: M95N8RAxe = 19565 - INTEGER(IntKi), PARAMETER :: M95N9RAxe = 19566 - INTEGER(IntKi), PARAMETER :: M96N1RAxe = 19567 - INTEGER(IntKi), PARAMETER :: M96N2RAxe = 19568 - INTEGER(IntKi), PARAMETER :: M96N3RAxe = 19569 - INTEGER(IntKi), PARAMETER :: M96N4RAxe = 19570 - INTEGER(IntKi), PARAMETER :: M96N5RAxe = 19571 - INTEGER(IntKi), PARAMETER :: M96N6RAxe = 19572 - INTEGER(IntKi), PARAMETER :: M96N7RAxe = 19573 - INTEGER(IntKi), PARAMETER :: M96N8RAxe = 19574 - INTEGER(IntKi), PARAMETER :: M96N9RAxe = 19575 - INTEGER(IntKi), PARAMETER :: M97N1RAxe = 19576 - INTEGER(IntKi), PARAMETER :: M97N2RAxe = 19577 - INTEGER(IntKi), PARAMETER :: M97N3RAxe = 19578 - INTEGER(IntKi), PARAMETER :: M97N4RAxe = 19579 - INTEGER(IntKi), PARAMETER :: M97N5RAxe = 19580 - INTEGER(IntKi), PARAMETER :: M97N6RAxe = 19581 - INTEGER(IntKi), PARAMETER :: M97N7RAxe = 19582 - INTEGER(IntKi), PARAMETER :: M97N8RAxe = 19583 - INTEGER(IntKi), PARAMETER :: M97N9RAxe = 19584 - INTEGER(IntKi), PARAMETER :: M98N1RAxe = 19585 - INTEGER(IntKi), PARAMETER :: M98N2RAxe = 19586 - INTEGER(IntKi), PARAMETER :: M98N3RAxe = 19587 - INTEGER(IntKi), PARAMETER :: M98N4RAxe = 19588 - INTEGER(IntKi), PARAMETER :: M98N5RAxe = 19589 - INTEGER(IntKi), PARAMETER :: M98N6RAxe = 19590 - INTEGER(IntKi), PARAMETER :: M98N7RAxe = 19591 - INTEGER(IntKi), PARAMETER :: M98N8RAxe = 19592 - INTEGER(IntKi), PARAMETER :: M98N9RAxe = 19593 - INTEGER(IntKi), PARAMETER :: M99N1RAxe = 19594 - INTEGER(IntKi), PARAMETER :: M99N2RAxe = 19595 - INTEGER(IntKi), PARAMETER :: M99N3RAxe = 19596 - INTEGER(IntKi), PARAMETER :: M99N4RAxe = 19597 - INTEGER(IntKi), PARAMETER :: M99N5RAxe = 19598 - INTEGER(IntKi), PARAMETER :: M99N6RAxe = 19599 - INTEGER(IntKi), PARAMETER :: M99N7RAxe = 19600 - INTEGER(IntKi), PARAMETER :: M99N8RAxe = 19601 - INTEGER(IntKi), PARAMETER :: M99N9RAxe = 19602 - INTEGER(IntKi), PARAMETER :: M01N1RAye = 19603 - INTEGER(IntKi), PARAMETER :: M01N2RAye = 19604 - INTEGER(IntKi), PARAMETER :: M01N3RAye = 19605 - INTEGER(IntKi), PARAMETER :: M01N4RAye = 19606 - INTEGER(IntKi), PARAMETER :: M01N5RAye = 19607 - INTEGER(IntKi), PARAMETER :: M01N6RAye = 19608 - INTEGER(IntKi), PARAMETER :: M01N7RAye = 19609 - INTEGER(IntKi), PARAMETER :: M01N8RAye = 19610 - INTEGER(IntKi), PARAMETER :: M01N9RAye = 19611 - INTEGER(IntKi), PARAMETER :: M02N1RAye = 19612 - INTEGER(IntKi), PARAMETER :: M02N2RAye = 19613 - INTEGER(IntKi), PARAMETER :: M02N3RAye = 19614 - INTEGER(IntKi), PARAMETER :: M02N4RAye = 19615 - INTEGER(IntKi), PARAMETER :: M02N5RAye = 19616 - INTEGER(IntKi), PARAMETER :: M02N6RAye = 19617 - INTEGER(IntKi), PARAMETER :: M02N7RAye = 19618 - INTEGER(IntKi), PARAMETER :: M02N8RAye = 19619 - INTEGER(IntKi), PARAMETER :: M02N9RAye = 19620 - INTEGER(IntKi), PARAMETER :: M03N1RAye = 19621 - INTEGER(IntKi), PARAMETER :: M03N2RAye = 19622 - INTEGER(IntKi), PARAMETER :: M03N3RAye = 19623 - INTEGER(IntKi), PARAMETER :: M03N4RAye = 19624 - INTEGER(IntKi), PARAMETER :: M03N5RAye = 19625 - INTEGER(IntKi), PARAMETER :: M03N6RAye = 19626 - INTEGER(IntKi), PARAMETER :: M03N7RAye = 19627 - INTEGER(IntKi), PARAMETER :: M03N8RAye = 19628 - INTEGER(IntKi), PARAMETER :: M03N9RAye = 19629 - INTEGER(IntKi), PARAMETER :: M04N1RAye = 19630 - INTEGER(IntKi), PARAMETER :: M04N2RAye = 19631 - INTEGER(IntKi), PARAMETER :: M04N3RAye = 19632 - INTEGER(IntKi), PARAMETER :: M04N4RAye = 19633 - INTEGER(IntKi), PARAMETER :: M04N5RAye = 19634 - INTEGER(IntKi), PARAMETER :: M04N6RAye = 19635 - INTEGER(IntKi), PARAMETER :: M04N7RAye = 19636 - INTEGER(IntKi), PARAMETER :: M04N8RAye = 19637 - INTEGER(IntKi), PARAMETER :: M04N9RAye = 19638 - INTEGER(IntKi), PARAMETER :: M05N1RAye = 19639 - INTEGER(IntKi), PARAMETER :: M05N2RAye = 19640 - INTEGER(IntKi), PARAMETER :: M05N3RAye = 19641 - INTEGER(IntKi), PARAMETER :: M05N4RAye = 19642 - INTEGER(IntKi), PARAMETER :: M05N5RAye = 19643 - INTEGER(IntKi), PARAMETER :: M05N6RAye = 19644 - INTEGER(IntKi), PARAMETER :: M05N7RAye = 19645 - INTEGER(IntKi), PARAMETER :: M05N8RAye = 19646 - INTEGER(IntKi), PARAMETER :: M05N9RAye = 19647 - INTEGER(IntKi), PARAMETER :: M06N1RAye = 19648 - INTEGER(IntKi), PARAMETER :: M06N2RAye = 19649 - INTEGER(IntKi), PARAMETER :: M06N3RAye = 19650 - INTEGER(IntKi), PARAMETER :: M06N4RAye = 19651 - INTEGER(IntKi), PARAMETER :: M06N5RAye = 19652 - INTEGER(IntKi), PARAMETER :: M06N6RAye = 19653 - INTEGER(IntKi), PARAMETER :: M06N7RAye = 19654 - INTEGER(IntKi), PARAMETER :: M06N8RAye = 19655 - INTEGER(IntKi), PARAMETER :: M06N9RAye = 19656 - INTEGER(IntKi), PARAMETER :: M07N1RAye = 19657 - INTEGER(IntKi), PARAMETER :: M07N2RAye = 19658 - INTEGER(IntKi), PARAMETER :: M07N3RAye = 19659 - INTEGER(IntKi), PARAMETER :: M07N4RAye = 19660 - INTEGER(IntKi), PARAMETER :: M07N5RAye = 19661 - INTEGER(IntKi), PARAMETER :: M07N6RAye = 19662 - INTEGER(IntKi), PARAMETER :: M07N7RAye = 19663 - INTEGER(IntKi), PARAMETER :: M07N8RAye = 19664 - INTEGER(IntKi), PARAMETER :: M07N9RAye = 19665 - INTEGER(IntKi), PARAMETER :: M08N1RAye = 19666 - INTEGER(IntKi), PARAMETER :: M08N2RAye = 19667 - INTEGER(IntKi), PARAMETER :: M08N3RAye = 19668 - INTEGER(IntKi), PARAMETER :: M08N4RAye = 19669 - INTEGER(IntKi), PARAMETER :: M08N5RAye = 19670 - INTEGER(IntKi), PARAMETER :: M08N6RAye = 19671 - INTEGER(IntKi), PARAMETER :: M08N7RAye = 19672 - INTEGER(IntKi), PARAMETER :: M08N8RAye = 19673 - INTEGER(IntKi), PARAMETER :: M08N9RAye = 19674 - INTEGER(IntKi), PARAMETER :: M09N1RAye = 19675 - INTEGER(IntKi), PARAMETER :: M09N2RAye = 19676 - INTEGER(IntKi), PARAMETER :: M09N3RAye = 19677 - INTEGER(IntKi), PARAMETER :: M09N4RAye = 19678 - INTEGER(IntKi), PARAMETER :: M09N5RAye = 19679 - INTEGER(IntKi), PARAMETER :: M09N6RAye = 19680 - INTEGER(IntKi), PARAMETER :: M09N7RAye = 19681 - INTEGER(IntKi), PARAMETER :: M09N8RAye = 19682 - INTEGER(IntKi), PARAMETER :: M09N9RAye = 19683 - INTEGER(IntKi), PARAMETER :: M10N1RAye = 19684 - INTEGER(IntKi), PARAMETER :: M10N2RAye = 19685 - INTEGER(IntKi), PARAMETER :: M10N3RAye = 19686 - INTEGER(IntKi), PARAMETER :: M10N4RAye = 19687 - INTEGER(IntKi), PARAMETER :: M10N5RAye = 19688 - INTEGER(IntKi), PARAMETER :: M10N6RAye = 19689 - INTEGER(IntKi), PARAMETER :: M10N7RAye = 19690 - INTEGER(IntKi), PARAMETER :: M10N8RAye = 19691 - INTEGER(IntKi), PARAMETER :: M10N9RAye = 19692 - INTEGER(IntKi), PARAMETER :: M11N1RAye = 19693 - INTEGER(IntKi), PARAMETER :: M11N2RAye = 19694 - INTEGER(IntKi), PARAMETER :: M11N3RAye = 19695 - INTEGER(IntKi), PARAMETER :: M11N4RAye = 19696 - INTEGER(IntKi), PARAMETER :: M11N5RAye = 19697 - INTEGER(IntKi), PARAMETER :: M11N6RAye = 19698 - INTEGER(IntKi), PARAMETER :: M11N7RAye = 19699 - INTEGER(IntKi), PARAMETER :: M11N8RAye = 19700 - INTEGER(IntKi), PARAMETER :: M11N9RAye = 19701 - INTEGER(IntKi), PARAMETER :: M12N1RAye = 19702 - INTEGER(IntKi), PARAMETER :: M12N2RAye = 19703 - INTEGER(IntKi), PARAMETER :: M12N3RAye = 19704 - INTEGER(IntKi), PARAMETER :: M12N4RAye = 19705 - INTEGER(IntKi), PARAMETER :: M12N5RAye = 19706 - INTEGER(IntKi), PARAMETER :: M12N6RAye = 19707 - INTEGER(IntKi), PARAMETER :: M12N7RAye = 19708 - INTEGER(IntKi), PARAMETER :: M12N8RAye = 19709 - INTEGER(IntKi), PARAMETER :: M12N9RAye = 19710 - INTEGER(IntKi), PARAMETER :: M13N1RAye = 19711 - INTEGER(IntKi), PARAMETER :: M13N2RAye = 19712 - INTEGER(IntKi), PARAMETER :: M13N3RAye = 19713 - INTEGER(IntKi), PARAMETER :: M13N4RAye = 19714 - INTEGER(IntKi), PARAMETER :: M13N5RAye = 19715 - INTEGER(IntKi), PARAMETER :: M13N6RAye = 19716 - INTEGER(IntKi), PARAMETER :: M13N7RAye = 19717 - INTEGER(IntKi), PARAMETER :: M13N8RAye = 19718 - INTEGER(IntKi), PARAMETER :: M13N9RAye = 19719 - INTEGER(IntKi), PARAMETER :: M14N1RAye = 19720 - INTEGER(IntKi), PARAMETER :: M14N2RAye = 19721 - INTEGER(IntKi), PARAMETER :: M14N3RAye = 19722 - INTEGER(IntKi), PARAMETER :: M14N4RAye = 19723 - INTEGER(IntKi), PARAMETER :: M14N5RAye = 19724 - INTEGER(IntKi), PARAMETER :: M14N6RAye = 19725 - INTEGER(IntKi), PARAMETER :: M14N7RAye = 19726 - INTEGER(IntKi), PARAMETER :: M14N8RAye = 19727 - INTEGER(IntKi), PARAMETER :: M14N9RAye = 19728 - INTEGER(IntKi), PARAMETER :: M15N1RAye = 19729 - INTEGER(IntKi), PARAMETER :: M15N2RAye = 19730 - INTEGER(IntKi), PARAMETER :: M15N3RAye = 19731 - INTEGER(IntKi), PARAMETER :: M15N4RAye = 19732 - INTEGER(IntKi), PARAMETER :: M15N5RAye = 19733 - INTEGER(IntKi), PARAMETER :: M15N6RAye = 19734 - INTEGER(IntKi), PARAMETER :: M15N7RAye = 19735 - INTEGER(IntKi), PARAMETER :: M15N8RAye = 19736 - INTEGER(IntKi), PARAMETER :: M15N9RAye = 19737 - INTEGER(IntKi), PARAMETER :: M16N1RAye = 19738 - INTEGER(IntKi), PARAMETER :: M16N2RAye = 19739 - INTEGER(IntKi), PARAMETER :: M16N3RAye = 19740 - INTEGER(IntKi), PARAMETER :: M16N4RAye = 19741 - INTEGER(IntKi), PARAMETER :: M16N5RAye = 19742 - INTEGER(IntKi), PARAMETER :: M16N6RAye = 19743 - INTEGER(IntKi), PARAMETER :: M16N7RAye = 19744 - INTEGER(IntKi), PARAMETER :: M16N8RAye = 19745 - INTEGER(IntKi), PARAMETER :: M16N9RAye = 19746 - INTEGER(IntKi), PARAMETER :: M17N1RAye = 19747 - INTEGER(IntKi), PARAMETER :: M17N2RAye = 19748 - INTEGER(IntKi), PARAMETER :: M17N3RAye = 19749 - INTEGER(IntKi), PARAMETER :: M17N4RAye = 19750 - INTEGER(IntKi), PARAMETER :: M17N5RAye = 19751 - INTEGER(IntKi), PARAMETER :: M17N6RAye = 19752 - INTEGER(IntKi), PARAMETER :: M17N7RAye = 19753 - INTEGER(IntKi), PARAMETER :: M17N8RAye = 19754 - INTEGER(IntKi), PARAMETER :: M17N9RAye = 19755 - INTEGER(IntKi), PARAMETER :: M18N1RAye = 19756 - INTEGER(IntKi), PARAMETER :: M18N2RAye = 19757 - INTEGER(IntKi), PARAMETER :: M18N3RAye = 19758 - INTEGER(IntKi), PARAMETER :: M18N4RAye = 19759 - INTEGER(IntKi), PARAMETER :: M18N5RAye = 19760 - INTEGER(IntKi), PARAMETER :: M18N6RAye = 19761 - INTEGER(IntKi), PARAMETER :: M18N7RAye = 19762 - INTEGER(IntKi), PARAMETER :: M18N8RAye = 19763 - INTEGER(IntKi), PARAMETER :: M18N9RAye = 19764 - INTEGER(IntKi), PARAMETER :: M19N1RAye = 19765 - INTEGER(IntKi), PARAMETER :: M19N2RAye = 19766 - INTEGER(IntKi), PARAMETER :: M19N3RAye = 19767 - INTEGER(IntKi), PARAMETER :: M19N4RAye = 19768 - INTEGER(IntKi), PARAMETER :: M19N5RAye = 19769 - INTEGER(IntKi), PARAMETER :: M19N6RAye = 19770 - INTEGER(IntKi), PARAMETER :: M19N7RAye = 19771 - INTEGER(IntKi), PARAMETER :: M19N8RAye = 19772 - INTEGER(IntKi), PARAMETER :: M19N9RAye = 19773 - INTEGER(IntKi), PARAMETER :: M20N1RAye = 19774 - INTEGER(IntKi), PARAMETER :: M20N2RAye = 19775 - INTEGER(IntKi), PARAMETER :: M20N3RAye = 19776 - INTEGER(IntKi), PARAMETER :: M20N4RAye = 19777 - INTEGER(IntKi), PARAMETER :: M20N5RAye = 19778 - INTEGER(IntKi), PARAMETER :: M20N6RAye = 19779 - INTEGER(IntKi), PARAMETER :: M20N7RAye = 19780 - INTEGER(IntKi), PARAMETER :: M20N8RAye = 19781 - INTEGER(IntKi), PARAMETER :: M20N9RAye = 19782 - INTEGER(IntKi), PARAMETER :: M21N1RAye = 19783 - INTEGER(IntKi), PARAMETER :: M21N2RAye = 19784 - INTEGER(IntKi), PARAMETER :: M21N3RAye = 19785 - INTEGER(IntKi), PARAMETER :: M21N4RAye = 19786 - INTEGER(IntKi), PARAMETER :: M21N5RAye = 19787 - INTEGER(IntKi), PARAMETER :: M21N6RAye = 19788 - INTEGER(IntKi), PARAMETER :: M21N7RAye = 19789 - INTEGER(IntKi), PARAMETER :: M21N8RAye = 19790 - INTEGER(IntKi), PARAMETER :: M21N9RAye = 19791 - INTEGER(IntKi), PARAMETER :: M22N1RAye = 19792 - INTEGER(IntKi), PARAMETER :: M22N2RAye = 19793 - INTEGER(IntKi), PARAMETER :: M22N3RAye = 19794 - INTEGER(IntKi), PARAMETER :: M22N4RAye = 19795 - INTEGER(IntKi), PARAMETER :: M22N5RAye = 19796 - INTEGER(IntKi), PARAMETER :: M22N6RAye = 19797 - INTEGER(IntKi), PARAMETER :: M22N7RAye = 19798 - INTEGER(IntKi), PARAMETER :: M22N8RAye = 19799 - INTEGER(IntKi), PARAMETER :: M22N9RAye = 19800 - INTEGER(IntKi), PARAMETER :: M23N1RAye = 19801 - INTEGER(IntKi), PARAMETER :: M23N2RAye = 19802 - INTEGER(IntKi), PARAMETER :: M23N3RAye = 19803 - INTEGER(IntKi), PARAMETER :: M23N4RAye = 19804 - INTEGER(IntKi), PARAMETER :: M23N5RAye = 19805 - INTEGER(IntKi), PARAMETER :: M23N6RAye = 19806 - INTEGER(IntKi), PARAMETER :: M23N7RAye = 19807 - INTEGER(IntKi), PARAMETER :: M23N8RAye = 19808 - INTEGER(IntKi), PARAMETER :: M23N9RAye = 19809 - INTEGER(IntKi), PARAMETER :: M24N1RAye = 19810 - INTEGER(IntKi), PARAMETER :: M24N2RAye = 19811 - INTEGER(IntKi), PARAMETER :: M24N3RAye = 19812 - INTEGER(IntKi), PARAMETER :: M24N4RAye = 19813 - INTEGER(IntKi), PARAMETER :: M24N5RAye = 19814 - INTEGER(IntKi), PARAMETER :: M24N6RAye = 19815 - INTEGER(IntKi), PARAMETER :: M24N7RAye = 19816 - INTEGER(IntKi), PARAMETER :: M24N8RAye = 19817 - INTEGER(IntKi), PARAMETER :: M24N9RAye = 19818 - INTEGER(IntKi), PARAMETER :: M25N1RAye = 19819 - INTEGER(IntKi), PARAMETER :: M25N2RAye = 19820 - INTEGER(IntKi), PARAMETER :: M25N3RAye = 19821 - INTEGER(IntKi), PARAMETER :: M25N4RAye = 19822 - INTEGER(IntKi), PARAMETER :: M25N5RAye = 19823 - INTEGER(IntKi), PARAMETER :: M25N6RAye = 19824 - INTEGER(IntKi), PARAMETER :: M25N7RAye = 19825 - INTEGER(IntKi), PARAMETER :: M25N8RAye = 19826 - INTEGER(IntKi), PARAMETER :: M25N9RAye = 19827 - INTEGER(IntKi), PARAMETER :: M26N1RAye = 19828 - INTEGER(IntKi), PARAMETER :: M26N2RAye = 19829 - INTEGER(IntKi), PARAMETER :: M26N3RAye = 19830 - INTEGER(IntKi), PARAMETER :: M26N4RAye = 19831 - INTEGER(IntKi), PARAMETER :: M26N5RAye = 19832 - INTEGER(IntKi), PARAMETER :: M26N6RAye = 19833 - INTEGER(IntKi), PARAMETER :: M26N7RAye = 19834 - INTEGER(IntKi), PARAMETER :: M26N8RAye = 19835 - INTEGER(IntKi), PARAMETER :: M26N9RAye = 19836 - INTEGER(IntKi), PARAMETER :: M27N1RAye = 19837 - INTEGER(IntKi), PARAMETER :: M27N2RAye = 19838 - INTEGER(IntKi), PARAMETER :: M27N3RAye = 19839 - INTEGER(IntKi), PARAMETER :: M27N4RAye = 19840 - INTEGER(IntKi), PARAMETER :: M27N5RAye = 19841 - INTEGER(IntKi), PARAMETER :: M27N6RAye = 19842 - INTEGER(IntKi), PARAMETER :: M27N7RAye = 19843 - INTEGER(IntKi), PARAMETER :: M27N8RAye = 19844 - INTEGER(IntKi), PARAMETER :: M27N9RAye = 19845 - INTEGER(IntKi), PARAMETER :: M28N1RAye = 19846 - INTEGER(IntKi), PARAMETER :: M28N2RAye = 19847 - INTEGER(IntKi), PARAMETER :: M28N3RAye = 19848 - INTEGER(IntKi), PARAMETER :: M28N4RAye = 19849 - INTEGER(IntKi), PARAMETER :: M28N5RAye = 19850 - INTEGER(IntKi), PARAMETER :: M28N6RAye = 19851 - INTEGER(IntKi), PARAMETER :: M28N7RAye = 19852 - INTEGER(IntKi), PARAMETER :: M28N8RAye = 19853 - INTEGER(IntKi), PARAMETER :: M28N9RAye = 19854 - INTEGER(IntKi), PARAMETER :: M29N1RAye = 19855 - INTEGER(IntKi), PARAMETER :: M29N2RAye = 19856 - INTEGER(IntKi), PARAMETER :: M29N3RAye = 19857 - INTEGER(IntKi), PARAMETER :: M29N4RAye = 19858 - INTEGER(IntKi), PARAMETER :: M29N5RAye = 19859 - INTEGER(IntKi), PARAMETER :: M29N6RAye = 19860 - INTEGER(IntKi), PARAMETER :: M29N7RAye = 19861 - INTEGER(IntKi), PARAMETER :: M29N8RAye = 19862 - INTEGER(IntKi), PARAMETER :: M29N9RAye = 19863 - INTEGER(IntKi), PARAMETER :: M30N1RAye = 19864 - INTEGER(IntKi), PARAMETER :: M30N2RAye = 19865 - INTEGER(IntKi), PARAMETER :: M30N3RAye = 19866 - INTEGER(IntKi), PARAMETER :: M30N4RAye = 19867 - INTEGER(IntKi), PARAMETER :: M30N5RAye = 19868 - INTEGER(IntKi), PARAMETER :: M30N6RAye = 19869 - INTEGER(IntKi), PARAMETER :: M30N7RAye = 19870 - INTEGER(IntKi), PARAMETER :: M30N8RAye = 19871 - INTEGER(IntKi), PARAMETER :: M30N9RAye = 19872 - INTEGER(IntKi), PARAMETER :: M31N1RAye = 19873 - INTEGER(IntKi), PARAMETER :: M31N2RAye = 19874 - INTEGER(IntKi), PARAMETER :: M31N3RAye = 19875 - INTEGER(IntKi), PARAMETER :: M31N4RAye = 19876 - INTEGER(IntKi), PARAMETER :: M31N5RAye = 19877 - INTEGER(IntKi), PARAMETER :: M31N6RAye = 19878 - INTEGER(IntKi), PARAMETER :: M31N7RAye = 19879 - INTEGER(IntKi), PARAMETER :: M31N8RAye = 19880 - INTEGER(IntKi), PARAMETER :: M31N9RAye = 19881 - INTEGER(IntKi), PARAMETER :: M32N1RAye = 19882 - INTEGER(IntKi), PARAMETER :: M32N2RAye = 19883 - INTEGER(IntKi), PARAMETER :: M32N3RAye = 19884 - INTEGER(IntKi), PARAMETER :: M32N4RAye = 19885 - INTEGER(IntKi), PARAMETER :: M32N5RAye = 19886 - INTEGER(IntKi), PARAMETER :: M32N6RAye = 19887 - INTEGER(IntKi), PARAMETER :: M32N7RAye = 19888 - INTEGER(IntKi), PARAMETER :: M32N8RAye = 19889 - INTEGER(IntKi), PARAMETER :: M32N9RAye = 19890 - INTEGER(IntKi), PARAMETER :: M33N1RAye = 19891 - INTEGER(IntKi), PARAMETER :: M33N2RAye = 19892 - INTEGER(IntKi), PARAMETER :: M33N3RAye = 19893 - INTEGER(IntKi), PARAMETER :: M33N4RAye = 19894 - INTEGER(IntKi), PARAMETER :: M33N5RAye = 19895 - INTEGER(IntKi), PARAMETER :: M33N6RAye = 19896 - INTEGER(IntKi), PARAMETER :: M33N7RAye = 19897 - INTEGER(IntKi), PARAMETER :: M33N8RAye = 19898 - INTEGER(IntKi), PARAMETER :: M33N9RAye = 19899 - INTEGER(IntKi), PARAMETER :: M34N1RAye = 19900 - INTEGER(IntKi), PARAMETER :: M34N2RAye = 19901 - INTEGER(IntKi), PARAMETER :: M34N3RAye = 19902 - INTEGER(IntKi), PARAMETER :: M34N4RAye = 19903 - INTEGER(IntKi), PARAMETER :: M34N5RAye = 19904 - INTEGER(IntKi), PARAMETER :: M34N6RAye = 19905 - INTEGER(IntKi), PARAMETER :: M34N7RAye = 19906 - INTEGER(IntKi), PARAMETER :: M34N8RAye = 19907 - INTEGER(IntKi), PARAMETER :: M34N9RAye = 19908 - INTEGER(IntKi), PARAMETER :: M35N1RAye = 19909 - INTEGER(IntKi), PARAMETER :: M35N2RAye = 19910 - INTEGER(IntKi), PARAMETER :: M35N3RAye = 19911 - INTEGER(IntKi), PARAMETER :: M35N4RAye = 19912 - INTEGER(IntKi), PARAMETER :: M35N5RAye = 19913 - INTEGER(IntKi), PARAMETER :: M35N6RAye = 19914 - INTEGER(IntKi), PARAMETER :: M35N7RAye = 19915 - INTEGER(IntKi), PARAMETER :: M35N8RAye = 19916 - INTEGER(IntKi), PARAMETER :: M35N9RAye = 19917 - INTEGER(IntKi), PARAMETER :: M36N1RAye = 19918 - INTEGER(IntKi), PARAMETER :: M36N2RAye = 19919 - INTEGER(IntKi), PARAMETER :: M36N3RAye = 19920 - INTEGER(IntKi), PARAMETER :: M36N4RAye = 19921 - INTEGER(IntKi), PARAMETER :: M36N5RAye = 19922 - INTEGER(IntKi), PARAMETER :: M36N6RAye = 19923 - INTEGER(IntKi), PARAMETER :: M36N7RAye = 19924 - INTEGER(IntKi), PARAMETER :: M36N8RAye = 19925 - INTEGER(IntKi), PARAMETER :: M36N9RAye = 19926 - INTEGER(IntKi), PARAMETER :: M37N1RAye = 19927 - INTEGER(IntKi), PARAMETER :: M37N2RAye = 19928 - INTEGER(IntKi), PARAMETER :: M37N3RAye = 19929 - INTEGER(IntKi), PARAMETER :: M37N4RAye = 19930 - INTEGER(IntKi), PARAMETER :: M37N5RAye = 19931 - INTEGER(IntKi), PARAMETER :: M37N6RAye = 19932 - INTEGER(IntKi), PARAMETER :: M37N7RAye = 19933 - INTEGER(IntKi), PARAMETER :: M37N8RAye = 19934 - INTEGER(IntKi), PARAMETER :: M37N9RAye = 19935 - INTEGER(IntKi), PARAMETER :: M38N1RAye = 19936 - INTEGER(IntKi), PARAMETER :: M38N2RAye = 19937 - INTEGER(IntKi), PARAMETER :: M38N3RAye = 19938 - INTEGER(IntKi), PARAMETER :: M38N4RAye = 19939 - INTEGER(IntKi), PARAMETER :: M38N5RAye = 19940 - INTEGER(IntKi), PARAMETER :: M38N6RAye = 19941 - INTEGER(IntKi), PARAMETER :: M38N7RAye = 19942 - INTEGER(IntKi), PARAMETER :: M38N8RAye = 19943 - INTEGER(IntKi), PARAMETER :: M38N9RAye = 19944 - INTEGER(IntKi), PARAMETER :: M39N1RAye = 19945 - INTEGER(IntKi), PARAMETER :: M39N2RAye = 19946 - INTEGER(IntKi), PARAMETER :: M39N3RAye = 19947 - INTEGER(IntKi), PARAMETER :: M39N4RAye = 19948 - INTEGER(IntKi), PARAMETER :: M39N5RAye = 19949 - INTEGER(IntKi), PARAMETER :: M39N6RAye = 19950 - INTEGER(IntKi), PARAMETER :: M39N7RAye = 19951 - INTEGER(IntKi), PARAMETER :: M39N8RAye = 19952 - INTEGER(IntKi), PARAMETER :: M39N9RAye = 19953 - INTEGER(IntKi), PARAMETER :: M40N1RAye = 19954 - INTEGER(IntKi), PARAMETER :: M40N2RAye = 19955 - INTEGER(IntKi), PARAMETER :: M40N3RAye = 19956 - INTEGER(IntKi), PARAMETER :: M40N4RAye = 19957 - INTEGER(IntKi), PARAMETER :: M40N5RAye = 19958 - INTEGER(IntKi), PARAMETER :: M40N6RAye = 19959 - INTEGER(IntKi), PARAMETER :: M40N7RAye = 19960 - INTEGER(IntKi), PARAMETER :: M40N8RAye = 19961 - INTEGER(IntKi), PARAMETER :: M40N9RAye = 19962 - INTEGER(IntKi), PARAMETER :: M41N1RAye = 19963 - INTEGER(IntKi), PARAMETER :: M41N2RAye = 19964 - INTEGER(IntKi), PARAMETER :: M41N3RAye = 19965 - INTEGER(IntKi), PARAMETER :: M41N4RAye = 19966 - INTEGER(IntKi), PARAMETER :: M41N5RAye = 19967 - INTEGER(IntKi), PARAMETER :: M41N6RAye = 19968 - INTEGER(IntKi), PARAMETER :: M41N7RAye = 19969 - INTEGER(IntKi), PARAMETER :: M41N8RAye = 19970 - INTEGER(IntKi), PARAMETER :: M41N9RAye = 19971 - INTEGER(IntKi), PARAMETER :: M42N1RAye = 19972 - INTEGER(IntKi), PARAMETER :: M42N2RAye = 19973 - INTEGER(IntKi), PARAMETER :: M42N3RAye = 19974 - INTEGER(IntKi), PARAMETER :: M42N4RAye = 19975 - INTEGER(IntKi), PARAMETER :: M42N5RAye = 19976 - INTEGER(IntKi), PARAMETER :: M42N6RAye = 19977 - INTEGER(IntKi), PARAMETER :: M42N7RAye = 19978 - INTEGER(IntKi), PARAMETER :: M42N8RAye = 19979 - INTEGER(IntKi), PARAMETER :: M42N9RAye = 19980 - INTEGER(IntKi), PARAMETER :: M43N1RAye = 19981 - INTEGER(IntKi), PARAMETER :: M43N2RAye = 19982 - INTEGER(IntKi), PARAMETER :: M43N3RAye = 19983 - INTEGER(IntKi), PARAMETER :: M43N4RAye = 19984 - INTEGER(IntKi), PARAMETER :: M43N5RAye = 19985 - INTEGER(IntKi), PARAMETER :: M43N6RAye = 19986 - INTEGER(IntKi), PARAMETER :: M43N7RAye = 19987 - INTEGER(IntKi), PARAMETER :: M43N8RAye = 19988 - INTEGER(IntKi), PARAMETER :: M43N9RAye = 19989 - INTEGER(IntKi), PARAMETER :: M44N1RAye = 19990 - INTEGER(IntKi), PARAMETER :: M44N2RAye = 19991 - INTEGER(IntKi), PARAMETER :: M44N3RAye = 19992 - INTEGER(IntKi), PARAMETER :: M44N4RAye = 19993 - INTEGER(IntKi), PARAMETER :: M44N5RAye = 19994 - INTEGER(IntKi), PARAMETER :: M44N6RAye = 19995 - INTEGER(IntKi), PARAMETER :: M44N7RAye = 19996 - INTEGER(IntKi), PARAMETER :: M44N8RAye = 19997 - INTEGER(IntKi), PARAMETER :: M44N9RAye = 19998 - INTEGER(IntKi), PARAMETER :: M45N1RAye = 19999 - INTEGER(IntKi), PARAMETER :: M45N2RAye = 20000 - INTEGER(IntKi), PARAMETER :: M45N3RAye = 20001 - INTEGER(IntKi), PARAMETER :: M45N4RAye = 20002 - INTEGER(IntKi), PARAMETER :: M45N5RAye = 20003 - INTEGER(IntKi), PARAMETER :: M45N6RAye = 20004 - INTEGER(IntKi), PARAMETER :: M45N7RAye = 20005 - INTEGER(IntKi), PARAMETER :: M45N8RAye = 20006 - INTEGER(IntKi), PARAMETER :: M45N9RAye = 20007 - INTEGER(IntKi), PARAMETER :: M46N1RAye = 20008 - INTEGER(IntKi), PARAMETER :: M46N2RAye = 20009 - INTEGER(IntKi), PARAMETER :: M46N3RAye = 20010 - INTEGER(IntKi), PARAMETER :: M46N4RAye = 20011 - INTEGER(IntKi), PARAMETER :: M46N5RAye = 20012 - INTEGER(IntKi), PARAMETER :: M46N6RAye = 20013 - INTEGER(IntKi), PARAMETER :: M46N7RAye = 20014 - INTEGER(IntKi), PARAMETER :: M46N8RAye = 20015 - INTEGER(IntKi), PARAMETER :: M46N9RAye = 20016 - INTEGER(IntKi), PARAMETER :: M47N1RAye = 20017 - INTEGER(IntKi), PARAMETER :: M47N2RAye = 20018 - INTEGER(IntKi), PARAMETER :: M47N3RAye = 20019 - INTEGER(IntKi), PARAMETER :: M47N4RAye = 20020 - INTEGER(IntKi), PARAMETER :: M47N5RAye = 20021 - INTEGER(IntKi), PARAMETER :: M47N6RAye = 20022 - INTEGER(IntKi), PARAMETER :: M47N7RAye = 20023 - INTEGER(IntKi), PARAMETER :: M47N8RAye = 20024 - INTEGER(IntKi), PARAMETER :: M47N9RAye = 20025 - INTEGER(IntKi), PARAMETER :: M48N1RAye = 20026 - INTEGER(IntKi), PARAMETER :: M48N2RAye = 20027 - INTEGER(IntKi), PARAMETER :: M48N3RAye = 20028 - INTEGER(IntKi), PARAMETER :: M48N4RAye = 20029 - INTEGER(IntKi), PARAMETER :: M48N5RAye = 20030 - INTEGER(IntKi), PARAMETER :: M48N6RAye = 20031 - INTEGER(IntKi), PARAMETER :: M48N7RAye = 20032 - INTEGER(IntKi), PARAMETER :: M48N8RAye = 20033 - INTEGER(IntKi), PARAMETER :: M48N9RAye = 20034 - INTEGER(IntKi), PARAMETER :: M49N1RAye = 20035 - INTEGER(IntKi), PARAMETER :: M49N2RAye = 20036 - INTEGER(IntKi), PARAMETER :: M49N3RAye = 20037 - INTEGER(IntKi), PARAMETER :: M49N4RAye = 20038 - INTEGER(IntKi), PARAMETER :: M49N5RAye = 20039 - INTEGER(IntKi), PARAMETER :: M49N6RAye = 20040 - INTEGER(IntKi), PARAMETER :: M49N7RAye = 20041 - INTEGER(IntKi), PARAMETER :: M49N8RAye = 20042 - INTEGER(IntKi), PARAMETER :: M49N9RAye = 20043 - INTEGER(IntKi), PARAMETER :: M50N1RAye = 20044 - INTEGER(IntKi), PARAMETER :: M50N2RAye = 20045 - INTEGER(IntKi), PARAMETER :: M50N3RAye = 20046 - INTEGER(IntKi), PARAMETER :: M50N4RAye = 20047 - INTEGER(IntKi), PARAMETER :: M50N5RAye = 20048 - INTEGER(IntKi), PARAMETER :: M50N6RAye = 20049 - INTEGER(IntKi), PARAMETER :: M50N7RAye = 20050 - INTEGER(IntKi), PARAMETER :: M50N8RAye = 20051 - INTEGER(IntKi), PARAMETER :: M50N9RAye = 20052 - INTEGER(IntKi), PARAMETER :: M51N1RAye = 20053 - INTEGER(IntKi), PARAMETER :: M51N2RAye = 20054 - INTEGER(IntKi), PARAMETER :: M51N3RAye = 20055 - INTEGER(IntKi), PARAMETER :: M51N4RAye = 20056 - INTEGER(IntKi), PARAMETER :: M51N5RAye = 20057 - INTEGER(IntKi), PARAMETER :: M51N6RAye = 20058 - INTEGER(IntKi), PARAMETER :: M51N7RAye = 20059 - INTEGER(IntKi), PARAMETER :: M51N8RAye = 20060 - INTEGER(IntKi), PARAMETER :: M51N9RAye = 20061 - INTEGER(IntKi), PARAMETER :: M52N1RAye = 20062 - INTEGER(IntKi), PARAMETER :: M52N2RAye = 20063 - INTEGER(IntKi), PARAMETER :: M52N3RAye = 20064 - INTEGER(IntKi), PARAMETER :: M52N4RAye = 20065 - INTEGER(IntKi), PARAMETER :: M52N5RAye = 20066 - INTEGER(IntKi), PARAMETER :: M52N6RAye = 20067 - INTEGER(IntKi), PARAMETER :: M52N7RAye = 20068 - INTEGER(IntKi), PARAMETER :: M52N8RAye = 20069 - INTEGER(IntKi), PARAMETER :: M52N9RAye = 20070 - INTEGER(IntKi), PARAMETER :: M53N1RAye = 20071 - INTEGER(IntKi), PARAMETER :: M53N2RAye = 20072 - INTEGER(IntKi), PARAMETER :: M53N3RAye = 20073 - INTEGER(IntKi), PARAMETER :: M53N4RAye = 20074 - INTEGER(IntKi), PARAMETER :: M53N5RAye = 20075 - INTEGER(IntKi), PARAMETER :: M53N6RAye = 20076 - INTEGER(IntKi), PARAMETER :: M53N7RAye = 20077 - INTEGER(IntKi), PARAMETER :: M53N8RAye = 20078 - INTEGER(IntKi), PARAMETER :: M53N9RAye = 20079 - INTEGER(IntKi), PARAMETER :: M54N1RAye = 20080 - INTEGER(IntKi), PARAMETER :: M54N2RAye = 20081 - INTEGER(IntKi), PARAMETER :: M54N3RAye = 20082 - INTEGER(IntKi), PARAMETER :: M54N4RAye = 20083 - INTEGER(IntKi), PARAMETER :: M54N5RAye = 20084 - INTEGER(IntKi), PARAMETER :: M54N6RAye = 20085 - INTEGER(IntKi), PARAMETER :: M54N7RAye = 20086 - INTEGER(IntKi), PARAMETER :: M54N8RAye = 20087 - INTEGER(IntKi), PARAMETER :: M54N9RAye = 20088 - INTEGER(IntKi), PARAMETER :: M55N1RAye = 20089 - INTEGER(IntKi), PARAMETER :: M55N2RAye = 20090 - INTEGER(IntKi), PARAMETER :: M55N3RAye = 20091 - INTEGER(IntKi), PARAMETER :: M55N4RAye = 20092 - INTEGER(IntKi), PARAMETER :: M55N5RAye = 20093 - INTEGER(IntKi), PARAMETER :: M55N6RAye = 20094 - INTEGER(IntKi), PARAMETER :: M55N7RAye = 20095 - INTEGER(IntKi), PARAMETER :: M55N8RAye = 20096 - INTEGER(IntKi), PARAMETER :: M55N9RAye = 20097 - INTEGER(IntKi), PARAMETER :: M56N1RAye = 20098 - INTEGER(IntKi), PARAMETER :: M56N2RAye = 20099 - INTEGER(IntKi), PARAMETER :: M56N3RAye = 20100 - INTEGER(IntKi), PARAMETER :: M56N4RAye = 20101 - INTEGER(IntKi), PARAMETER :: M56N5RAye = 20102 - INTEGER(IntKi), PARAMETER :: M56N6RAye = 20103 - INTEGER(IntKi), PARAMETER :: M56N7RAye = 20104 - INTEGER(IntKi), PARAMETER :: M56N8RAye = 20105 - INTEGER(IntKi), PARAMETER :: M56N9RAye = 20106 - INTEGER(IntKi), PARAMETER :: M57N1RAye = 20107 - INTEGER(IntKi), PARAMETER :: M57N2RAye = 20108 - INTEGER(IntKi), PARAMETER :: M57N3RAye = 20109 - INTEGER(IntKi), PARAMETER :: M57N4RAye = 20110 - INTEGER(IntKi), PARAMETER :: M57N5RAye = 20111 - INTEGER(IntKi), PARAMETER :: M57N6RAye = 20112 - INTEGER(IntKi), PARAMETER :: M57N7RAye = 20113 - INTEGER(IntKi), PARAMETER :: M57N8RAye = 20114 - INTEGER(IntKi), PARAMETER :: M57N9RAye = 20115 - INTEGER(IntKi), PARAMETER :: M58N1RAye = 20116 - INTEGER(IntKi), PARAMETER :: M58N2RAye = 20117 - INTEGER(IntKi), PARAMETER :: M58N3RAye = 20118 - INTEGER(IntKi), PARAMETER :: M58N4RAye = 20119 - INTEGER(IntKi), PARAMETER :: M58N5RAye = 20120 - INTEGER(IntKi), PARAMETER :: M58N6RAye = 20121 - INTEGER(IntKi), PARAMETER :: M58N7RAye = 20122 - INTEGER(IntKi), PARAMETER :: M58N8RAye = 20123 - INTEGER(IntKi), PARAMETER :: M58N9RAye = 20124 - INTEGER(IntKi), PARAMETER :: M59N1RAye = 20125 - INTEGER(IntKi), PARAMETER :: M59N2RAye = 20126 - INTEGER(IntKi), PARAMETER :: M59N3RAye = 20127 - INTEGER(IntKi), PARAMETER :: M59N4RAye = 20128 - INTEGER(IntKi), PARAMETER :: M59N5RAye = 20129 - INTEGER(IntKi), PARAMETER :: M59N6RAye = 20130 - INTEGER(IntKi), PARAMETER :: M59N7RAye = 20131 - INTEGER(IntKi), PARAMETER :: M59N8RAye = 20132 - INTEGER(IntKi), PARAMETER :: M59N9RAye = 20133 - INTEGER(IntKi), PARAMETER :: M60N1RAye = 20134 - INTEGER(IntKi), PARAMETER :: M60N2RAye = 20135 - INTEGER(IntKi), PARAMETER :: M60N3RAye = 20136 - INTEGER(IntKi), PARAMETER :: M60N4RAye = 20137 - INTEGER(IntKi), PARAMETER :: M60N5RAye = 20138 - INTEGER(IntKi), PARAMETER :: M60N6RAye = 20139 - INTEGER(IntKi), PARAMETER :: M60N7RAye = 20140 - INTEGER(IntKi), PARAMETER :: M60N8RAye = 20141 - INTEGER(IntKi), PARAMETER :: M60N9RAye = 20142 - INTEGER(IntKi), PARAMETER :: M61N1RAye = 20143 - INTEGER(IntKi), PARAMETER :: M61N2RAye = 20144 - INTEGER(IntKi), PARAMETER :: M61N3RAye = 20145 - INTEGER(IntKi), PARAMETER :: M61N4RAye = 20146 - INTEGER(IntKi), PARAMETER :: M61N5RAye = 20147 - INTEGER(IntKi), PARAMETER :: M61N6RAye = 20148 - INTEGER(IntKi), PARAMETER :: M61N7RAye = 20149 - INTEGER(IntKi), PARAMETER :: M61N8RAye = 20150 - INTEGER(IntKi), PARAMETER :: M61N9RAye = 20151 - INTEGER(IntKi), PARAMETER :: M62N1RAye = 20152 - INTEGER(IntKi), PARAMETER :: M62N2RAye = 20153 - INTEGER(IntKi), PARAMETER :: M62N3RAye = 20154 - INTEGER(IntKi), PARAMETER :: M62N4RAye = 20155 - INTEGER(IntKi), PARAMETER :: M62N5RAye = 20156 - INTEGER(IntKi), PARAMETER :: M62N6RAye = 20157 - INTEGER(IntKi), PARAMETER :: M62N7RAye = 20158 - INTEGER(IntKi), PARAMETER :: M62N8RAye = 20159 - INTEGER(IntKi), PARAMETER :: M62N9RAye = 20160 - INTEGER(IntKi), PARAMETER :: M63N1RAye = 20161 - INTEGER(IntKi), PARAMETER :: M63N2RAye = 20162 - INTEGER(IntKi), PARAMETER :: M63N3RAye = 20163 - INTEGER(IntKi), PARAMETER :: M63N4RAye = 20164 - INTEGER(IntKi), PARAMETER :: M63N5RAye = 20165 - INTEGER(IntKi), PARAMETER :: M63N6RAye = 20166 - INTEGER(IntKi), PARAMETER :: M63N7RAye = 20167 - INTEGER(IntKi), PARAMETER :: M63N8RAye = 20168 - INTEGER(IntKi), PARAMETER :: M63N9RAye = 20169 - INTEGER(IntKi), PARAMETER :: M64N1RAye = 20170 - INTEGER(IntKi), PARAMETER :: M64N2RAye = 20171 - INTEGER(IntKi), PARAMETER :: M64N3RAye = 20172 - INTEGER(IntKi), PARAMETER :: M64N4RAye = 20173 - INTEGER(IntKi), PARAMETER :: M64N5RAye = 20174 - INTEGER(IntKi), PARAMETER :: M64N6RAye = 20175 - INTEGER(IntKi), PARAMETER :: M64N7RAye = 20176 - INTEGER(IntKi), PARAMETER :: M64N8RAye = 20177 - INTEGER(IntKi), PARAMETER :: M64N9RAye = 20178 - INTEGER(IntKi), PARAMETER :: M65N1RAye = 20179 - INTEGER(IntKi), PARAMETER :: M65N2RAye = 20180 - INTEGER(IntKi), PARAMETER :: M65N3RAye = 20181 - INTEGER(IntKi), PARAMETER :: M65N4RAye = 20182 - INTEGER(IntKi), PARAMETER :: M65N5RAye = 20183 - INTEGER(IntKi), PARAMETER :: M65N6RAye = 20184 - INTEGER(IntKi), PARAMETER :: M65N7RAye = 20185 - INTEGER(IntKi), PARAMETER :: M65N8RAye = 20186 - INTEGER(IntKi), PARAMETER :: M65N9RAye = 20187 - INTEGER(IntKi), PARAMETER :: M66N1RAye = 20188 - INTEGER(IntKi), PARAMETER :: M66N2RAye = 20189 - INTEGER(IntKi), PARAMETER :: M66N3RAye = 20190 - INTEGER(IntKi), PARAMETER :: M66N4RAye = 20191 - INTEGER(IntKi), PARAMETER :: M66N5RAye = 20192 - INTEGER(IntKi), PARAMETER :: M66N6RAye = 20193 - INTEGER(IntKi), PARAMETER :: M66N7RAye = 20194 - INTEGER(IntKi), PARAMETER :: M66N8RAye = 20195 - INTEGER(IntKi), PARAMETER :: M66N9RAye = 20196 - INTEGER(IntKi), PARAMETER :: M67N1RAye = 20197 - INTEGER(IntKi), PARAMETER :: M67N2RAye = 20198 - INTEGER(IntKi), PARAMETER :: M67N3RAye = 20199 - INTEGER(IntKi), PARAMETER :: M67N4RAye = 20200 - INTEGER(IntKi), PARAMETER :: M67N5RAye = 20201 - INTEGER(IntKi), PARAMETER :: M67N6RAye = 20202 - INTEGER(IntKi), PARAMETER :: M67N7RAye = 20203 - INTEGER(IntKi), PARAMETER :: M67N8RAye = 20204 - INTEGER(IntKi), PARAMETER :: M67N9RAye = 20205 - INTEGER(IntKi), PARAMETER :: M68N1RAye = 20206 - INTEGER(IntKi), PARAMETER :: M68N2RAye = 20207 - INTEGER(IntKi), PARAMETER :: M68N3RAye = 20208 - INTEGER(IntKi), PARAMETER :: M68N4RAye = 20209 - INTEGER(IntKi), PARAMETER :: M68N5RAye = 20210 - INTEGER(IntKi), PARAMETER :: M68N6RAye = 20211 - INTEGER(IntKi), PARAMETER :: M68N7RAye = 20212 - INTEGER(IntKi), PARAMETER :: M68N8RAye = 20213 - INTEGER(IntKi), PARAMETER :: M68N9RAye = 20214 - INTEGER(IntKi), PARAMETER :: M69N1RAye = 20215 - INTEGER(IntKi), PARAMETER :: M69N2RAye = 20216 - INTEGER(IntKi), PARAMETER :: M69N3RAye = 20217 - INTEGER(IntKi), PARAMETER :: M69N4RAye = 20218 - INTEGER(IntKi), PARAMETER :: M69N5RAye = 20219 - INTEGER(IntKi), PARAMETER :: M69N6RAye = 20220 - INTEGER(IntKi), PARAMETER :: M69N7RAye = 20221 - INTEGER(IntKi), PARAMETER :: M69N8RAye = 20222 - INTEGER(IntKi), PARAMETER :: M69N9RAye = 20223 - INTEGER(IntKi), PARAMETER :: M70N1RAye = 20224 - INTEGER(IntKi), PARAMETER :: M70N2RAye = 20225 - INTEGER(IntKi), PARAMETER :: M70N3RAye = 20226 - INTEGER(IntKi), PARAMETER :: M70N4RAye = 20227 - INTEGER(IntKi), PARAMETER :: M70N5RAye = 20228 - INTEGER(IntKi), PARAMETER :: M70N6RAye = 20229 - INTEGER(IntKi), PARAMETER :: M70N7RAye = 20230 - INTEGER(IntKi), PARAMETER :: M70N8RAye = 20231 - INTEGER(IntKi), PARAMETER :: M70N9RAye = 20232 - INTEGER(IntKi), PARAMETER :: M71N1RAye = 20233 - INTEGER(IntKi), PARAMETER :: M71N2RAye = 20234 - INTEGER(IntKi), PARAMETER :: M71N3RAye = 20235 - INTEGER(IntKi), PARAMETER :: M71N4RAye = 20236 - INTEGER(IntKi), PARAMETER :: M71N5RAye = 20237 - INTEGER(IntKi), PARAMETER :: M71N6RAye = 20238 - INTEGER(IntKi), PARAMETER :: M71N7RAye = 20239 - INTEGER(IntKi), PARAMETER :: M71N8RAye = 20240 - INTEGER(IntKi), PARAMETER :: M71N9RAye = 20241 - INTEGER(IntKi), PARAMETER :: M72N1RAye = 20242 - INTEGER(IntKi), PARAMETER :: M72N2RAye = 20243 - INTEGER(IntKi), PARAMETER :: M72N3RAye = 20244 - INTEGER(IntKi), PARAMETER :: M72N4RAye = 20245 - INTEGER(IntKi), PARAMETER :: M72N5RAye = 20246 - INTEGER(IntKi), PARAMETER :: M72N6RAye = 20247 - INTEGER(IntKi), PARAMETER :: M72N7RAye = 20248 - INTEGER(IntKi), PARAMETER :: M72N8RAye = 20249 - INTEGER(IntKi), PARAMETER :: M72N9RAye = 20250 - INTEGER(IntKi), PARAMETER :: M73N1RAye = 20251 - INTEGER(IntKi), PARAMETER :: M73N2RAye = 20252 - INTEGER(IntKi), PARAMETER :: M73N3RAye = 20253 - INTEGER(IntKi), PARAMETER :: M73N4RAye = 20254 - INTEGER(IntKi), PARAMETER :: M73N5RAye = 20255 - INTEGER(IntKi), PARAMETER :: M73N6RAye = 20256 - INTEGER(IntKi), PARAMETER :: M73N7RAye = 20257 - INTEGER(IntKi), PARAMETER :: M73N8RAye = 20258 - INTEGER(IntKi), PARAMETER :: M73N9RAye = 20259 - INTEGER(IntKi), PARAMETER :: M74N1RAye = 20260 - INTEGER(IntKi), PARAMETER :: M74N2RAye = 20261 - INTEGER(IntKi), PARAMETER :: M74N3RAye = 20262 - INTEGER(IntKi), PARAMETER :: M74N4RAye = 20263 - INTEGER(IntKi), PARAMETER :: M74N5RAye = 20264 - INTEGER(IntKi), PARAMETER :: M74N6RAye = 20265 - INTEGER(IntKi), PARAMETER :: M74N7RAye = 20266 - INTEGER(IntKi), PARAMETER :: M74N8RAye = 20267 - INTEGER(IntKi), PARAMETER :: M74N9RAye = 20268 - INTEGER(IntKi), PARAMETER :: M75N1RAye = 20269 - INTEGER(IntKi), PARAMETER :: M75N2RAye = 20270 - INTEGER(IntKi), PARAMETER :: M75N3RAye = 20271 - INTEGER(IntKi), PARAMETER :: M75N4RAye = 20272 - INTEGER(IntKi), PARAMETER :: M75N5RAye = 20273 - INTEGER(IntKi), PARAMETER :: M75N6RAye = 20274 - INTEGER(IntKi), PARAMETER :: M75N7RAye = 20275 - INTEGER(IntKi), PARAMETER :: M75N8RAye = 20276 - INTEGER(IntKi), PARAMETER :: M75N9RAye = 20277 - INTEGER(IntKi), PARAMETER :: M76N1RAye = 20278 - INTEGER(IntKi), PARAMETER :: M76N2RAye = 20279 - INTEGER(IntKi), PARAMETER :: M76N3RAye = 20280 - INTEGER(IntKi), PARAMETER :: M76N4RAye = 20281 - INTEGER(IntKi), PARAMETER :: M76N5RAye = 20282 - INTEGER(IntKi), PARAMETER :: M76N6RAye = 20283 - INTEGER(IntKi), PARAMETER :: M76N7RAye = 20284 - INTEGER(IntKi), PARAMETER :: M76N8RAye = 20285 - INTEGER(IntKi), PARAMETER :: M76N9RAye = 20286 - INTEGER(IntKi), PARAMETER :: M77N1RAye = 20287 - INTEGER(IntKi), PARAMETER :: M77N2RAye = 20288 - INTEGER(IntKi), PARAMETER :: M77N3RAye = 20289 - INTEGER(IntKi), PARAMETER :: M77N4RAye = 20290 - INTEGER(IntKi), PARAMETER :: M77N5RAye = 20291 - INTEGER(IntKi), PARAMETER :: M77N6RAye = 20292 - INTEGER(IntKi), PARAMETER :: M77N7RAye = 20293 - INTEGER(IntKi), PARAMETER :: M77N8RAye = 20294 - INTEGER(IntKi), PARAMETER :: M77N9RAye = 20295 - INTEGER(IntKi), PARAMETER :: M78N1RAye = 20296 - INTEGER(IntKi), PARAMETER :: M78N2RAye = 20297 - INTEGER(IntKi), PARAMETER :: M78N3RAye = 20298 - INTEGER(IntKi), PARAMETER :: M78N4RAye = 20299 - INTEGER(IntKi), PARAMETER :: M78N5RAye = 20300 - INTEGER(IntKi), PARAMETER :: M78N6RAye = 20301 - INTEGER(IntKi), PARAMETER :: M78N7RAye = 20302 - INTEGER(IntKi), PARAMETER :: M78N8RAye = 20303 - INTEGER(IntKi), PARAMETER :: M78N9RAye = 20304 - INTEGER(IntKi), PARAMETER :: M79N1RAye = 20305 - INTEGER(IntKi), PARAMETER :: M79N2RAye = 20306 - INTEGER(IntKi), PARAMETER :: M79N3RAye = 20307 - INTEGER(IntKi), PARAMETER :: M79N4RAye = 20308 - INTEGER(IntKi), PARAMETER :: M79N5RAye = 20309 - INTEGER(IntKi), PARAMETER :: M79N6RAye = 20310 - INTEGER(IntKi), PARAMETER :: M79N7RAye = 20311 - INTEGER(IntKi), PARAMETER :: M79N8RAye = 20312 - INTEGER(IntKi), PARAMETER :: M79N9RAye = 20313 - INTEGER(IntKi), PARAMETER :: M80N1RAye = 20314 - INTEGER(IntKi), PARAMETER :: M80N2RAye = 20315 - INTEGER(IntKi), PARAMETER :: M80N3RAye = 20316 - INTEGER(IntKi), PARAMETER :: M80N4RAye = 20317 - INTEGER(IntKi), PARAMETER :: M80N5RAye = 20318 - INTEGER(IntKi), PARAMETER :: M80N6RAye = 20319 - INTEGER(IntKi), PARAMETER :: M80N7RAye = 20320 - INTEGER(IntKi), PARAMETER :: M80N8RAye = 20321 - INTEGER(IntKi), PARAMETER :: M80N9RAye = 20322 - INTEGER(IntKi), PARAMETER :: M81N1RAye = 20323 - INTEGER(IntKi), PARAMETER :: M81N2RAye = 20324 - INTEGER(IntKi), PARAMETER :: M81N3RAye = 20325 - INTEGER(IntKi), PARAMETER :: M81N4RAye = 20326 - INTEGER(IntKi), PARAMETER :: M81N5RAye = 20327 - INTEGER(IntKi), PARAMETER :: M81N6RAye = 20328 - INTEGER(IntKi), PARAMETER :: M81N7RAye = 20329 - INTEGER(IntKi), PARAMETER :: M81N8RAye = 20330 - INTEGER(IntKi), PARAMETER :: M81N9RAye = 20331 - INTEGER(IntKi), PARAMETER :: M82N1RAye = 20332 - INTEGER(IntKi), PARAMETER :: M82N2RAye = 20333 - INTEGER(IntKi), PARAMETER :: M82N3RAye = 20334 - INTEGER(IntKi), PARAMETER :: M82N4RAye = 20335 - INTEGER(IntKi), PARAMETER :: M82N5RAye = 20336 - INTEGER(IntKi), PARAMETER :: M82N6RAye = 20337 - INTEGER(IntKi), PARAMETER :: M82N7RAye = 20338 - INTEGER(IntKi), PARAMETER :: M82N8RAye = 20339 - INTEGER(IntKi), PARAMETER :: M82N9RAye = 20340 - INTEGER(IntKi), PARAMETER :: M83N1RAye = 20341 - INTEGER(IntKi), PARAMETER :: M83N2RAye = 20342 - INTEGER(IntKi), PARAMETER :: M83N3RAye = 20343 - INTEGER(IntKi), PARAMETER :: M83N4RAye = 20344 - INTEGER(IntKi), PARAMETER :: M83N5RAye = 20345 - INTEGER(IntKi), PARAMETER :: M83N6RAye = 20346 - INTEGER(IntKi), PARAMETER :: M83N7RAye = 20347 - INTEGER(IntKi), PARAMETER :: M83N8RAye = 20348 - INTEGER(IntKi), PARAMETER :: M83N9RAye = 20349 - INTEGER(IntKi), PARAMETER :: M84N1RAye = 20350 - INTEGER(IntKi), PARAMETER :: M84N2RAye = 20351 - INTEGER(IntKi), PARAMETER :: M84N3RAye = 20352 - INTEGER(IntKi), PARAMETER :: M84N4RAye = 20353 - INTEGER(IntKi), PARAMETER :: M84N5RAye = 20354 - INTEGER(IntKi), PARAMETER :: M84N6RAye = 20355 - INTEGER(IntKi), PARAMETER :: M84N7RAye = 20356 - INTEGER(IntKi), PARAMETER :: M84N8RAye = 20357 - INTEGER(IntKi), PARAMETER :: M84N9RAye = 20358 - INTEGER(IntKi), PARAMETER :: M85N1RAye = 20359 - INTEGER(IntKi), PARAMETER :: M85N2RAye = 20360 - INTEGER(IntKi), PARAMETER :: M85N3RAye = 20361 - INTEGER(IntKi), PARAMETER :: M85N4RAye = 20362 - INTEGER(IntKi), PARAMETER :: M85N5RAye = 20363 - INTEGER(IntKi), PARAMETER :: M85N6RAye = 20364 - INTEGER(IntKi), PARAMETER :: M85N7RAye = 20365 - INTEGER(IntKi), PARAMETER :: M85N8RAye = 20366 - INTEGER(IntKi), PARAMETER :: M85N9RAye = 20367 - INTEGER(IntKi), PARAMETER :: M86N1RAye = 20368 - INTEGER(IntKi), PARAMETER :: M86N2RAye = 20369 - INTEGER(IntKi), PARAMETER :: M86N3RAye = 20370 - INTEGER(IntKi), PARAMETER :: M86N4RAye = 20371 - INTEGER(IntKi), PARAMETER :: M86N5RAye = 20372 - INTEGER(IntKi), PARAMETER :: M86N6RAye = 20373 - INTEGER(IntKi), PARAMETER :: M86N7RAye = 20374 - INTEGER(IntKi), PARAMETER :: M86N8RAye = 20375 - INTEGER(IntKi), PARAMETER :: M86N9RAye = 20376 - INTEGER(IntKi), PARAMETER :: M87N1RAye = 20377 - INTEGER(IntKi), PARAMETER :: M87N2RAye = 20378 - INTEGER(IntKi), PARAMETER :: M87N3RAye = 20379 - INTEGER(IntKi), PARAMETER :: M87N4RAye = 20380 - INTEGER(IntKi), PARAMETER :: M87N5RAye = 20381 - INTEGER(IntKi), PARAMETER :: M87N6RAye = 20382 - INTEGER(IntKi), PARAMETER :: M87N7RAye = 20383 - INTEGER(IntKi), PARAMETER :: M87N8RAye = 20384 - INTEGER(IntKi), PARAMETER :: M87N9RAye = 20385 - INTEGER(IntKi), PARAMETER :: M88N1RAye = 20386 - INTEGER(IntKi), PARAMETER :: M88N2RAye = 20387 - INTEGER(IntKi), PARAMETER :: M88N3RAye = 20388 - INTEGER(IntKi), PARAMETER :: M88N4RAye = 20389 - INTEGER(IntKi), PARAMETER :: M88N5RAye = 20390 - INTEGER(IntKi), PARAMETER :: M88N6RAye = 20391 - INTEGER(IntKi), PARAMETER :: M88N7RAye = 20392 - INTEGER(IntKi), PARAMETER :: M88N8RAye = 20393 - INTEGER(IntKi), PARAMETER :: M88N9RAye = 20394 - INTEGER(IntKi), PARAMETER :: M89N1RAye = 20395 - INTEGER(IntKi), PARAMETER :: M89N2RAye = 20396 - INTEGER(IntKi), PARAMETER :: M89N3RAye = 20397 - INTEGER(IntKi), PARAMETER :: M89N4RAye = 20398 - INTEGER(IntKi), PARAMETER :: M89N5RAye = 20399 - INTEGER(IntKi), PARAMETER :: M89N6RAye = 20400 - INTEGER(IntKi), PARAMETER :: M89N7RAye = 20401 - INTEGER(IntKi), PARAMETER :: M89N8RAye = 20402 - INTEGER(IntKi), PARAMETER :: M89N9RAye = 20403 - INTEGER(IntKi), PARAMETER :: M90N1RAye = 20404 - INTEGER(IntKi), PARAMETER :: M90N2RAye = 20405 - INTEGER(IntKi), PARAMETER :: M90N3RAye = 20406 - INTEGER(IntKi), PARAMETER :: M90N4RAye = 20407 - INTEGER(IntKi), PARAMETER :: M90N5RAye = 20408 - INTEGER(IntKi), PARAMETER :: M90N6RAye = 20409 - INTEGER(IntKi), PARAMETER :: M90N7RAye = 20410 - INTEGER(IntKi), PARAMETER :: M90N8RAye = 20411 - INTEGER(IntKi), PARAMETER :: M90N9RAye = 20412 - INTEGER(IntKi), PARAMETER :: M91N1RAye = 20413 - INTEGER(IntKi), PARAMETER :: M91N2RAye = 20414 - INTEGER(IntKi), PARAMETER :: M91N3RAye = 20415 - INTEGER(IntKi), PARAMETER :: M91N4RAye = 20416 - INTEGER(IntKi), PARAMETER :: M91N5RAye = 20417 - INTEGER(IntKi), PARAMETER :: M91N6RAye = 20418 - INTEGER(IntKi), PARAMETER :: M91N7RAye = 20419 - INTEGER(IntKi), PARAMETER :: M91N8RAye = 20420 - INTEGER(IntKi), PARAMETER :: M91N9RAye = 20421 - INTEGER(IntKi), PARAMETER :: M92N1RAye = 20422 - INTEGER(IntKi), PARAMETER :: M92N2RAye = 20423 - INTEGER(IntKi), PARAMETER :: M92N3RAye = 20424 - INTEGER(IntKi), PARAMETER :: M92N4RAye = 20425 - INTEGER(IntKi), PARAMETER :: M92N5RAye = 20426 - INTEGER(IntKi), PARAMETER :: M92N6RAye = 20427 - INTEGER(IntKi), PARAMETER :: M92N7RAye = 20428 - INTEGER(IntKi), PARAMETER :: M92N8RAye = 20429 - INTEGER(IntKi), PARAMETER :: M92N9RAye = 20430 - INTEGER(IntKi), PARAMETER :: M93N1RAye = 20431 - INTEGER(IntKi), PARAMETER :: M93N2RAye = 20432 - INTEGER(IntKi), PARAMETER :: M93N3RAye = 20433 - INTEGER(IntKi), PARAMETER :: M93N4RAye = 20434 - INTEGER(IntKi), PARAMETER :: M93N5RAye = 20435 - INTEGER(IntKi), PARAMETER :: M93N6RAye = 20436 - INTEGER(IntKi), PARAMETER :: M93N7RAye = 20437 - INTEGER(IntKi), PARAMETER :: M93N8RAye = 20438 - INTEGER(IntKi), PARAMETER :: M93N9RAye = 20439 - INTEGER(IntKi), PARAMETER :: M94N1RAye = 20440 - INTEGER(IntKi), PARAMETER :: M94N2RAye = 20441 - INTEGER(IntKi), PARAMETER :: M94N3RAye = 20442 - INTEGER(IntKi), PARAMETER :: M94N4RAye = 20443 - INTEGER(IntKi), PARAMETER :: M94N5RAye = 20444 - INTEGER(IntKi), PARAMETER :: M94N6RAye = 20445 - INTEGER(IntKi), PARAMETER :: M94N7RAye = 20446 - INTEGER(IntKi), PARAMETER :: M94N8RAye = 20447 - INTEGER(IntKi), PARAMETER :: M94N9RAye = 20448 - INTEGER(IntKi), PARAMETER :: M95N1RAye = 20449 - INTEGER(IntKi), PARAMETER :: M95N2RAye = 20450 - INTEGER(IntKi), PARAMETER :: M95N3RAye = 20451 - INTEGER(IntKi), PARAMETER :: M95N4RAye = 20452 - INTEGER(IntKi), PARAMETER :: M95N5RAye = 20453 - INTEGER(IntKi), PARAMETER :: M95N6RAye = 20454 - INTEGER(IntKi), PARAMETER :: M95N7RAye = 20455 - INTEGER(IntKi), PARAMETER :: M95N8RAye = 20456 - INTEGER(IntKi), PARAMETER :: M95N9RAye = 20457 - INTEGER(IntKi), PARAMETER :: M96N1RAye = 20458 - INTEGER(IntKi), PARAMETER :: M96N2RAye = 20459 - INTEGER(IntKi), PARAMETER :: M96N3RAye = 20460 - INTEGER(IntKi), PARAMETER :: M96N4RAye = 20461 - INTEGER(IntKi), PARAMETER :: M96N5RAye = 20462 - INTEGER(IntKi), PARAMETER :: M96N6RAye = 20463 - INTEGER(IntKi), PARAMETER :: M96N7RAye = 20464 - INTEGER(IntKi), PARAMETER :: M96N8RAye = 20465 - INTEGER(IntKi), PARAMETER :: M96N9RAye = 20466 - INTEGER(IntKi), PARAMETER :: M97N1RAye = 20467 - INTEGER(IntKi), PARAMETER :: M97N2RAye = 20468 - INTEGER(IntKi), PARAMETER :: M97N3RAye = 20469 - INTEGER(IntKi), PARAMETER :: M97N4RAye = 20470 - INTEGER(IntKi), PARAMETER :: M97N5RAye = 20471 - INTEGER(IntKi), PARAMETER :: M97N6RAye = 20472 - INTEGER(IntKi), PARAMETER :: M97N7RAye = 20473 - INTEGER(IntKi), PARAMETER :: M97N8RAye = 20474 - INTEGER(IntKi), PARAMETER :: M97N9RAye = 20475 - INTEGER(IntKi), PARAMETER :: M98N1RAye = 20476 - INTEGER(IntKi), PARAMETER :: M98N2RAye = 20477 - INTEGER(IntKi), PARAMETER :: M98N3RAye = 20478 - INTEGER(IntKi), PARAMETER :: M98N4RAye = 20479 - INTEGER(IntKi), PARAMETER :: M98N5RAye = 20480 - INTEGER(IntKi), PARAMETER :: M98N6RAye = 20481 - INTEGER(IntKi), PARAMETER :: M98N7RAye = 20482 - INTEGER(IntKi), PARAMETER :: M98N8RAye = 20483 - INTEGER(IntKi), PARAMETER :: M98N9RAye = 20484 - INTEGER(IntKi), PARAMETER :: M99N1RAye = 20485 - INTEGER(IntKi), PARAMETER :: M99N2RAye = 20486 - INTEGER(IntKi), PARAMETER :: M99N3RAye = 20487 - INTEGER(IntKi), PARAMETER :: M99N4RAye = 20488 - INTEGER(IntKi), PARAMETER :: M99N5RAye = 20489 - INTEGER(IntKi), PARAMETER :: M99N6RAye = 20490 - INTEGER(IntKi), PARAMETER :: M99N7RAye = 20491 - INTEGER(IntKi), PARAMETER :: M99N8RAye = 20492 - INTEGER(IntKi), PARAMETER :: M99N9RAye = 20493 - INTEGER(IntKi), PARAMETER :: M01N1RAze = 20494 - INTEGER(IntKi), PARAMETER :: M01N2RAze = 20495 - INTEGER(IntKi), PARAMETER :: M01N3RAze = 20496 - INTEGER(IntKi), PARAMETER :: M01N4RAze = 20497 - INTEGER(IntKi), PARAMETER :: M01N5RAze = 20498 - INTEGER(IntKi), PARAMETER :: M01N6RAze = 20499 - INTEGER(IntKi), PARAMETER :: M01N7RAze = 20500 - INTEGER(IntKi), PARAMETER :: M01N8RAze = 20501 - INTEGER(IntKi), PARAMETER :: M01N9RAze = 20502 - INTEGER(IntKi), PARAMETER :: M02N1RAze = 20503 - INTEGER(IntKi), PARAMETER :: M02N2RAze = 20504 - INTEGER(IntKi), PARAMETER :: M02N3RAze = 20505 - INTEGER(IntKi), PARAMETER :: M02N4RAze = 20506 - INTEGER(IntKi), PARAMETER :: M02N5RAze = 20507 - INTEGER(IntKi), PARAMETER :: M02N6RAze = 20508 - INTEGER(IntKi), PARAMETER :: M02N7RAze = 20509 - INTEGER(IntKi), PARAMETER :: M02N8RAze = 20510 - INTEGER(IntKi), PARAMETER :: M02N9RAze = 20511 - INTEGER(IntKi), PARAMETER :: M03N1RAze = 20512 - INTEGER(IntKi), PARAMETER :: M03N2RAze = 20513 - INTEGER(IntKi), PARAMETER :: M03N3RAze = 20514 - INTEGER(IntKi), PARAMETER :: M03N4RAze = 20515 - INTEGER(IntKi), PARAMETER :: M03N5RAze = 20516 - INTEGER(IntKi), PARAMETER :: M03N6RAze = 20517 - INTEGER(IntKi), PARAMETER :: M03N7RAze = 20518 - INTEGER(IntKi), PARAMETER :: M03N8RAze = 20519 - INTEGER(IntKi), PARAMETER :: M03N9RAze = 20520 - INTEGER(IntKi), PARAMETER :: M04N1RAze = 20521 - INTEGER(IntKi), PARAMETER :: M04N2RAze = 20522 - INTEGER(IntKi), PARAMETER :: M04N3RAze = 20523 - INTEGER(IntKi), PARAMETER :: M04N4RAze = 20524 - INTEGER(IntKi), PARAMETER :: M04N5RAze = 20525 - INTEGER(IntKi), PARAMETER :: M04N6RAze = 20526 - INTEGER(IntKi), PARAMETER :: M04N7RAze = 20527 - INTEGER(IntKi), PARAMETER :: M04N8RAze = 20528 - INTEGER(IntKi), PARAMETER :: M04N9RAze = 20529 - INTEGER(IntKi), PARAMETER :: M05N1RAze = 20530 - INTEGER(IntKi), PARAMETER :: M05N2RAze = 20531 - INTEGER(IntKi), PARAMETER :: M05N3RAze = 20532 - INTEGER(IntKi), PARAMETER :: M05N4RAze = 20533 - INTEGER(IntKi), PARAMETER :: M05N5RAze = 20534 - INTEGER(IntKi), PARAMETER :: M05N6RAze = 20535 - INTEGER(IntKi), PARAMETER :: M05N7RAze = 20536 - INTEGER(IntKi), PARAMETER :: M05N8RAze = 20537 - INTEGER(IntKi), PARAMETER :: M05N9RAze = 20538 - INTEGER(IntKi), PARAMETER :: M06N1RAze = 20539 - INTEGER(IntKi), PARAMETER :: M06N2RAze = 20540 - INTEGER(IntKi), PARAMETER :: M06N3RAze = 20541 - INTEGER(IntKi), PARAMETER :: M06N4RAze = 20542 - INTEGER(IntKi), PARAMETER :: M06N5RAze = 20543 - INTEGER(IntKi), PARAMETER :: M06N6RAze = 20544 - INTEGER(IntKi), PARAMETER :: M06N7RAze = 20545 - INTEGER(IntKi), PARAMETER :: M06N8RAze = 20546 - INTEGER(IntKi), PARAMETER :: M06N9RAze = 20547 - INTEGER(IntKi), PARAMETER :: M07N1RAze = 20548 - INTEGER(IntKi), PARAMETER :: M07N2RAze = 20549 - INTEGER(IntKi), PARAMETER :: M07N3RAze = 20550 - INTEGER(IntKi), PARAMETER :: M07N4RAze = 20551 - INTEGER(IntKi), PARAMETER :: M07N5RAze = 20552 - INTEGER(IntKi), PARAMETER :: M07N6RAze = 20553 - INTEGER(IntKi), PARAMETER :: M07N7RAze = 20554 - INTEGER(IntKi), PARAMETER :: M07N8RAze = 20555 - INTEGER(IntKi), PARAMETER :: M07N9RAze = 20556 - INTEGER(IntKi), PARAMETER :: M08N1RAze = 20557 - INTEGER(IntKi), PARAMETER :: M08N2RAze = 20558 - INTEGER(IntKi), PARAMETER :: M08N3RAze = 20559 - INTEGER(IntKi), PARAMETER :: M08N4RAze = 20560 - INTEGER(IntKi), PARAMETER :: M08N5RAze = 20561 - INTEGER(IntKi), PARAMETER :: M08N6RAze = 20562 - INTEGER(IntKi), PARAMETER :: M08N7RAze = 20563 - INTEGER(IntKi), PARAMETER :: M08N8RAze = 20564 - INTEGER(IntKi), PARAMETER :: M08N9RAze = 20565 - INTEGER(IntKi), PARAMETER :: M09N1RAze = 20566 - INTEGER(IntKi), PARAMETER :: M09N2RAze = 20567 - INTEGER(IntKi), PARAMETER :: M09N3RAze = 20568 - INTEGER(IntKi), PARAMETER :: M09N4RAze = 20569 - INTEGER(IntKi), PARAMETER :: M09N5RAze = 20570 - INTEGER(IntKi), PARAMETER :: M09N6RAze = 20571 - INTEGER(IntKi), PARAMETER :: M09N7RAze = 20572 - INTEGER(IntKi), PARAMETER :: M09N8RAze = 20573 - INTEGER(IntKi), PARAMETER :: M09N9RAze = 20574 - INTEGER(IntKi), PARAMETER :: M10N1RAze = 20575 - INTEGER(IntKi), PARAMETER :: M10N2RAze = 20576 - INTEGER(IntKi), PARAMETER :: M10N3RAze = 20577 - INTEGER(IntKi), PARAMETER :: M10N4RAze = 20578 - INTEGER(IntKi), PARAMETER :: M10N5RAze = 20579 - INTEGER(IntKi), PARAMETER :: M10N6RAze = 20580 - INTEGER(IntKi), PARAMETER :: M10N7RAze = 20581 - INTEGER(IntKi), PARAMETER :: M10N8RAze = 20582 - INTEGER(IntKi), PARAMETER :: M10N9RAze = 20583 - INTEGER(IntKi), PARAMETER :: M11N1RAze = 20584 - INTEGER(IntKi), PARAMETER :: M11N2RAze = 20585 - INTEGER(IntKi), PARAMETER :: M11N3RAze = 20586 - INTEGER(IntKi), PARAMETER :: M11N4RAze = 20587 - INTEGER(IntKi), PARAMETER :: M11N5RAze = 20588 - INTEGER(IntKi), PARAMETER :: M11N6RAze = 20589 - INTEGER(IntKi), PARAMETER :: M11N7RAze = 20590 - INTEGER(IntKi), PARAMETER :: M11N8RAze = 20591 - INTEGER(IntKi), PARAMETER :: M11N9RAze = 20592 - INTEGER(IntKi), PARAMETER :: M12N1RAze = 20593 - INTEGER(IntKi), PARAMETER :: M12N2RAze = 20594 - INTEGER(IntKi), PARAMETER :: M12N3RAze = 20595 - INTEGER(IntKi), PARAMETER :: M12N4RAze = 20596 - INTEGER(IntKi), PARAMETER :: M12N5RAze = 20597 - INTEGER(IntKi), PARAMETER :: M12N6RAze = 20598 - INTEGER(IntKi), PARAMETER :: M12N7RAze = 20599 - INTEGER(IntKi), PARAMETER :: M12N8RAze = 20600 - INTEGER(IntKi), PARAMETER :: M12N9RAze = 20601 - INTEGER(IntKi), PARAMETER :: M13N1RAze = 20602 - INTEGER(IntKi), PARAMETER :: M13N2RAze = 20603 - INTEGER(IntKi), PARAMETER :: M13N3RAze = 20604 - INTEGER(IntKi), PARAMETER :: M13N4RAze = 20605 - INTEGER(IntKi), PARAMETER :: M13N5RAze = 20606 - INTEGER(IntKi), PARAMETER :: M13N6RAze = 20607 - INTEGER(IntKi), PARAMETER :: M13N7RAze = 20608 - INTEGER(IntKi), PARAMETER :: M13N8RAze = 20609 - INTEGER(IntKi), PARAMETER :: M13N9RAze = 20610 - INTEGER(IntKi), PARAMETER :: M14N1RAze = 20611 - INTEGER(IntKi), PARAMETER :: M14N2RAze = 20612 - INTEGER(IntKi), PARAMETER :: M14N3RAze = 20613 - INTEGER(IntKi), PARAMETER :: M14N4RAze = 20614 - INTEGER(IntKi), PARAMETER :: M14N5RAze = 20615 - INTEGER(IntKi), PARAMETER :: M14N6RAze = 20616 - INTEGER(IntKi), PARAMETER :: M14N7RAze = 20617 - INTEGER(IntKi), PARAMETER :: M14N8RAze = 20618 - INTEGER(IntKi), PARAMETER :: M14N9RAze = 20619 - INTEGER(IntKi), PARAMETER :: M15N1RAze = 20620 - INTEGER(IntKi), PARAMETER :: M15N2RAze = 20621 - INTEGER(IntKi), PARAMETER :: M15N3RAze = 20622 - INTEGER(IntKi), PARAMETER :: M15N4RAze = 20623 - INTEGER(IntKi), PARAMETER :: M15N5RAze = 20624 - INTEGER(IntKi), PARAMETER :: M15N6RAze = 20625 - INTEGER(IntKi), PARAMETER :: M15N7RAze = 20626 - INTEGER(IntKi), PARAMETER :: M15N8RAze = 20627 - INTEGER(IntKi), PARAMETER :: M15N9RAze = 20628 - INTEGER(IntKi), PARAMETER :: M16N1RAze = 20629 - INTEGER(IntKi), PARAMETER :: M16N2RAze = 20630 - INTEGER(IntKi), PARAMETER :: M16N3RAze = 20631 - INTEGER(IntKi), PARAMETER :: M16N4RAze = 20632 - INTEGER(IntKi), PARAMETER :: M16N5RAze = 20633 - INTEGER(IntKi), PARAMETER :: M16N6RAze = 20634 - INTEGER(IntKi), PARAMETER :: M16N7RAze = 20635 - INTEGER(IntKi), PARAMETER :: M16N8RAze = 20636 - INTEGER(IntKi), PARAMETER :: M16N9RAze = 20637 - INTEGER(IntKi), PARAMETER :: M17N1RAze = 20638 - INTEGER(IntKi), PARAMETER :: M17N2RAze = 20639 - INTEGER(IntKi), PARAMETER :: M17N3RAze = 20640 - INTEGER(IntKi), PARAMETER :: M17N4RAze = 20641 - INTEGER(IntKi), PARAMETER :: M17N5RAze = 20642 - INTEGER(IntKi), PARAMETER :: M17N6RAze = 20643 - INTEGER(IntKi), PARAMETER :: M17N7RAze = 20644 - INTEGER(IntKi), PARAMETER :: M17N8RAze = 20645 - INTEGER(IntKi), PARAMETER :: M17N9RAze = 20646 - INTEGER(IntKi), PARAMETER :: M18N1RAze = 20647 - INTEGER(IntKi), PARAMETER :: M18N2RAze = 20648 - INTEGER(IntKi), PARAMETER :: M18N3RAze = 20649 - INTEGER(IntKi), PARAMETER :: M18N4RAze = 20650 - INTEGER(IntKi), PARAMETER :: M18N5RAze = 20651 - INTEGER(IntKi), PARAMETER :: M18N6RAze = 20652 - INTEGER(IntKi), PARAMETER :: M18N7RAze = 20653 - INTEGER(IntKi), PARAMETER :: M18N8RAze = 20654 - INTEGER(IntKi), PARAMETER :: M18N9RAze = 20655 - INTEGER(IntKi), PARAMETER :: M19N1RAze = 20656 - INTEGER(IntKi), PARAMETER :: M19N2RAze = 20657 - INTEGER(IntKi), PARAMETER :: M19N3RAze = 20658 - INTEGER(IntKi), PARAMETER :: M19N4RAze = 20659 - INTEGER(IntKi), PARAMETER :: M19N5RAze = 20660 - INTEGER(IntKi), PARAMETER :: M19N6RAze = 20661 - INTEGER(IntKi), PARAMETER :: M19N7RAze = 20662 - INTEGER(IntKi), PARAMETER :: M19N8RAze = 20663 - INTEGER(IntKi), PARAMETER :: M19N9RAze = 20664 - INTEGER(IntKi), PARAMETER :: M20N1RAze = 20665 - INTEGER(IntKi), PARAMETER :: M20N2RAze = 20666 - INTEGER(IntKi), PARAMETER :: M20N3RAze = 20667 - INTEGER(IntKi), PARAMETER :: M20N4RAze = 20668 - INTEGER(IntKi), PARAMETER :: M20N5RAze = 20669 - INTEGER(IntKi), PARAMETER :: M20N6RAze = 20670 - INTEGER(IntKi), PARAMETER :: M20N7RAze = 20671 - INTEGER(IntKi), PARAMETER :: M20N8RAze = 20672 - INTEGER(IntKi), PARAMETER :: M20N9RAze = 20673 - INTEGER(IntKi), PARAMETER :: M21N1RAze = 20674 - INTEGER(IntKi), PARAMETER :: M21N2RAze = 20675 - INTEGER(IntKi), PARAMETER :: M21N3RAze = 20676 - INTEGER(IntKi), PARAMETER :: M21N4RAze = 20677 - INTEGER(IntKi), PARAMETER :: M21N5RAze = 20678 - INTEGER(IntKi), PARAMETER :: M21N6RAze = 20679 - INTEGER(IntKi), PARAMETER :: M21N7RAze = 20680 - INTEGER(IntKi), PARAMETER :: M21N8RAze = 20681 - INTEGER(IntKi), PARAMETER :: M21N9RAze = 20682 - INTEGER(IntKi), PARAMETER :: M22N1RAze = 20683 - INTEGER(IntKi), PARAMETER :: M22N2RAze = 20684 - INTEGER(IntKi), PARAMETER :: M22N3RAze = 20685 - INTEGER(IntKi), PARAMETER :: M22N4RAze = 20686 - INTEGER(IntKi), PARAMETER :: M22N5RAze = 20687 - INTEGER(IntKi), PARAMETER :: M22N6RAze = 20688 - INTEGER(IntKi), PARAMETER :: M22N7RAze = 20689 - INTEGER(IntKi), PARAMETER :: M22N8RAze = 20690 - INTEGER(IntKi), PARAMETER :: M22N9RAze = 20691 - INTEGER(IntKi), PARAMETER :: M23N1RAze = 20692 - INTEGER(IntKi), PARAMETER :: M23N2RAze = 20693 - INTEGER(IntKi), PARAMETER :: M23N3RAze = 20694 - INTEGER(IntKi), PARAMETER :: M23N4RAze = 20695 - INTEGER(IntKi), PARAMETER :: M23N5RAze = 20696 - INTEGER(IntKi), PARAMETER :: M23N6RAze = 20697 - INTEGER(IntKi), PARAMETER :: M23N7RAze = 20698 - INTEGER(IntKi), PARAMETER :: M23N8RAze = 20699 - INTEGER(IntKi), PARAMETER :: M23N9RAze = 20700 - INTEGER(IntKi), PARAMETER :: M24N1RAze = 20701 - INTEGER(IntKi), PARAMETER :: M24N2RAze = 20702 - INTEGER(IntKi), PARAMETER :: M24N3RAze = 20703 - INTEGER(IntKi), PARAMETER :: M24N4RAze = 20704 - INTEGER(IntKi), PARAMETER :: M24N5RAze = 20705 - INTEGER(IntKi), PARAMETER :: M24N6RAze = 20706 - INTEGER(IntKi), PARAMETER :: M24N7RAze = 20707 - INTEGER(IntKi), PARAMETER :: M24N8RAze = 20708 - INTEGER(IntKi), PARAMETER :: M24N9RAze = 20709 - INTEGER(IntKi), PARAMETER :: M25N1RAze = 20710 - INTEGER(IntKi), PARAMETER :: M25N2RAze = 20711 - INTEGER(IntKi), PARAMETER :: M25N3RAze = 20712 - INTEGER(IntKi), PARAMETER :: M25N4RAze = 20713 - INTEGER(IntKi), PARAMETER :: M25N5RAze = 20714 - INTEGER(IntKi), PARAMETER :: M25N6RAze = 20715 - INTEGER(IntKi), PARAMETER :: M25N7RAze = 20716 - INTEGER(IntKi), PARAMETER :: M25N8RAze = 20717 - INTEGER(IntKi), PARAMETER :: M25N9RAze = 20718 - INTEGER(IntKi), PARAMETER :: M26N1RAze = 20719 - INTEGER(IntKi), PARAMETER :: M26N2RAze = 20720 - INTEGER(IntKi), PARAMETER :: M26N3RAze = 20721 - INTEGER(IntKi), PARAMETER :: M26N4RAze = 20722 - INTEGER(IntKi), PARAMETER :: M26N5RAze = 20723 - INTEGER(IntKi), PARAMETER :: M26N6RAze = 20724 - INTEGER(IntKi), PARAMETER :: M26N7RAze = 20725 - INTEGER(IntKi), PARAMETER :: M26N8RAze = 20726 - INTEGER(IntKi), PARAMETER :: M26N9RAze = 20727 - INTEGER(IntKi), PARAMETER :: M27N1RAze = 20728 - INTEGER(IntKi), PARAMETER :: M27N2RAze = 20729 - INTEGER(IntKi), PARAMETER :: M27N3RAze = 20730 - INTEGER(IntKi), PARAMETER :: M27N4RAze = 20731 - INTEGER(IntKi), PARAMETER :: M27N5RAze = 20732 - INTEGER(IntKi), PARAMETER :: M27N6RAze = 20733 - INTEGER(IntKi), PARAMETER :: M27N7RAze = 20734 - INTEGER(IntKi), PARAMETER :: M27N8RAze = 20735 - INTEGER(IntKi), PARAMETER :: M27N9RAze = 20736 - INTEGER(IntKi), PARAMETER :: M28N1RAze = 20737 - INTEGER(IntKi), PARAMETER :: M28N2RAze = 20738 - INTEGER(IntKi), PARAMETER :: M28N3RAze = 20739 - INTEGER(IntKi), PARAMETER :: M28N4RAze = 20740 - INTEGER(IntKi), PARAMETER :: M28N5RAze = 20741 - INTEGER(IntKi), PARAMETER :: M28N6RAze = 20742 - INTEGER(IntKi), PARAMETER :: M28N7RAze = 20743 - INTEGER(IntKi), PARAMETER :: M28N8RAze = 20744 - INTEGER(IntKi), PARAMETER :: M28N9RAze = 20745 - INTEGER(IntKi), PARAMETER :: M29N1RAze = 20746 - INTEGER(IntKi), PARAMETER :: M29N2RAze = 20747 - INTEGER(IntKi), PARAMETER :: M29N3RAze = 20748 - INTEGER(IntKi), PARAMETER :: M29N4RAze = 20749 - INTEGER(IntKi), PARAMETER :: M29N5RAze = 20750 - INTEGER(IntKi), PARAMETER :: M29N6RAze = 20751 - INTEGER(IntKi), PARAMETER :: M29N7RAze = 20752 - INTEGER(IntKi), PARAMETER :: M29N8RAze = 20753 - INTEGER(IntKi), PARAMETER :: M29N9RAze = 20754 - INTEGER(IntKi), PARAMETER :: M30N1RAze = 20755 - INTEGER(IntKi), PARAMETER :: M30N2RAze = 20756 - INTEGER(IntKi), PARAMETER :: M30N3RAze = 20757 - INTEGER(IntKi), PARAMETER :: M30N4RAze = 20758 - INTEGER(IntKi), PARAMETER :: M30N5RAze = 20759 - INTEGER(IntKi), PARAMETER :: M30N6RAze = 20760 - INTEGER(IntKi), PARAMETER :: M30N7RAze = 20761 - INTEGER(IntKi), PARAMETER :: M30N8RAze = 20762 - INTEGER(IntKi), PARAMETER :: M30N9RAze = 20763 - INTEGER(IntKi), PARAMETER :: M31N1RAze = 20764 - INTEGER(IntKi), PARAMETER :: M31N2RAze = 20765 - INTEGER(IntKi), PARAMETER :: M31N3RAze = 20766 - INTEGER(IntKi), PARAMETER :: M31N4RAze = 20767 - INTEGER(IntKi), PARAMETER :: M31N5RAze = 20768 - INTEGER(IntKi), PARAMETER :: M31N6RAze = 20769 - INTEGER(IntKi), PARAMETER :: M31N7RAze = 20770 - INTEGER(IntKi), PARAMETER :: M31N8RAze = 20771 - INTEGER(IntKi), PARAMETER :: M31N9RAze = 20772 - INTEGER(IntKi), PARAMETER :: M32N1RAze = 20773 - INTEGER(IntKi), PARAMETER :: M32N2RAze = 20774 - INTEGER(IntKi), PARAMETER :: M32N3RAze = 20775 - INTEGER(IntKi), PARAMETER :: M32N4RAze = 20776 - INTEGER(IntKi), PARAMETER :: M32N5RAze = 20777 - INTEGER(IntKi), PARAMETER :: M32N6RAze = 20778 - INTEGER(IntKi), PARAMETER :: M32N7RAze = 20779 - INTEGER(IntKi), PARAMETER :: M32N8RAze = 20780 - INTEGER(IntKi), PARAMETER :: M32N9RAze = 20781 - INTEGER(IntKi), PARAMETER :: M33N1RAze = 20782 - INTEGER(IntKi), PARAMETER :: M33N2RAze = 20783 - INTEGER(IntKi), PARAMETER :: M33N3RAze = 20784 - INTEGER(IntKi), PARAMETER :: M33N4RAze = 20785 - INTEGER(IntKi), PARAMETER :: M33N5RAze = 20786 - INTEGER(IntKi), PARAMETER :: M33N6RAze = 20787 - INTEGER(IntKi), PARAMETER :: M33N7RAze = 20788 - INTEGER(IntKi), PARAMETER :: M33N8RAze = 20789 - INTEGER(IntKi), PARAMETER :: M33N9RAze = 20790 - INTEGER(IntKi), PARAMETER :: M34N1RAze = 20791 - INTEGER(IntKi), PARAMETER :: M34N2RAze = 20792 - INTEGER(IntKi), PARAMETER :: M34N3RAze = 20793 - INTEGER(IntKi), PARAMETER :: M34N4RAze = 20794 - INTEGER(IntKi), PARAMETER :: M34N5RAze = 20795 - INTEGER(IntKi), PARAMETER :: M34N6RAze = 20796 - INTEGER(IntKi), PARAMETER :: M34N7RAze = 20797 - INTEGER(IntKi), PARAMETER :: M34N8RAze = 20798 - INTEGER(IntKi), PARAMETER :: M34N9RAze = 20799 - INTEGER(IntKi), PARAMETER :: M35N1RAze = 20800 - INTEGER(IntKi), PARAMETER :: M35N2RAze = 20801 - INTEGER(IntKi), PARAMETER :: M35N3RAze = 20802 - INTEGER(IntKi), PARAMETER :: M35N4RAze = 20803 - INTEGER(IntKi), PARAMETER :: M35N5RAze = 20804 - INTEGER(IntKi), PARAMETER :: M35N6RAze = 20805 - INTEGER(IntKi), PARAMETER :: M35N7RAze = 20806 - INTEGER(IntKi), PARAMETER :: M35N8RAze = 20807 - INTEGER(IntKi), PARAMETER :: M35N9RAze = 20808 - INTEGER(IntKi), PARAMETER :: M36N1RAze = 20809 - INTEGER(IntKi), PARAMETER :: M36N2RAze = 20810 - INTEGER(IntKi), PARAMETER :: M36N3RAze = 20811 - INTEGER(IntKi), PARAMETER :: M36N4RAze = 20812 - INTEGER(IntKi), PARAMETER :: M36N5RAze = 20813 - INTEGER(IntKi), PARAMETER :: M36N6RAze = 20814 - INTEGER(IntKi), PARAMETER :: M36N7RAze = 20815 - INTEGER(IntKi), PARAMETER :: M36N8RAze = 20816 - INTEGER(IntKi), PARAMETER :: M36N9RAze = 20817 - INTEGER(IntKi), PARAMETER :: M37N1RAze = 20818 - INTEGER(IntKi), PARAMETER :: M37N2RAze = 20819 - INTEGER(IntKi), PARAMETER :: M37N3RAze = 20820 - INTEGER(IntKi), PARAMETER :: M37N4RAze = 20821 - INTEGER(IntKi), PARAMETER :: M37N5RAze = 20822 - INTEGER(IntKi), PARAMETER :: M37N6RAze = 20823 - INTEGER(IntKi), PARAMETER :: M37N7RAze = 20824 - INTEGER(IntKi), PARAMETER :: M37N8RAze = 20825 - INTEGER(IntKi), PARAMETER :: M37N9RAze = 20826 - INTEGER(IntKi), PARAMETER :: M38N1RAze = 20827 - INTEGER(IntKi), PARAMETER :: M38N2RAze = 20828 - INTEGER(IntKi), PARAMETER :: M38N3RAze = 20829 - INTEGER(IntKi), PARAMETER :: M38N4RAze = 20830 - INTEGER(IntKi), PARAMETER :: M38N5RAze = 20831 - INTEGER(IntKi), PARAMETER :: M38N6RAze = 20832 - INTEGER(IntKi), PARAMETER :: M38N7RAze = 20833 - INTEGER(IntKi), PARAMETER :: M38N8RAze = 20834 - INTEGER(IntKi), PARAMETER :: M38N9RAze = 20835 - INTEGER(IntKi), PARAMETER :: M39N1RAze = 20836 - INTEGER(IntKi), PARAMETER :: M39N2RAze = 20837 - INTEGER(IntKi), PARAMETER :: M39N3RAze = 20838 - INTEGER(IntKi), PARAMETER :: M39N4RAze = 20839 - INTEGER(IntKi), PARAMETER :: M39N5RAze = 20840 - INTEGER(IntKi), PARAMETER :: M39N6RAze = 20841 - INTEGER(IntKi), PARAMETER :: M39N7RAze = 20842 - INTEGER(IntKi), PARAMETER :: M39N8RAze = 20843 - INTEGER(IntKi), PARAMETER :: M39N9RAze = 20844 - INTEGER(IntKi), PARAMETER :: M40N1RAze = 20845 - INTEGER(IntKi), PARAMETER :: M40N2RAze = 20846 - INTEGER(IntKi), PARAMETER :: M40N3RAze = 20847 - INTEGER(IntKi), PARAMETER :: M40N4RAze = 20848 - INTEGER(IntKi), PARAMETER :: M40N5RAze = 20849 - INTEGER(IntKi), PARAMETER :: M40N6RAze = 20850 - INTEGER(IntKi), PARAMETER :: M40N7RAze = 20851 - INTEGER(IntKi), PARAMETER :: M40N8RAze = 20852 - INTEGER(IntKi), PARAMETER :: M40N9RAze = 20853 - INTEGER(IntKi), PARAMETER :: M41N1RAze = 20854 - INTEGER(IntKi), PARAMETER :: M41N2RAze = 20855 - INTEGER(IntKi), PARAMETER :: M41N3RAze = 20856 - INTEGER(IntKi), PARAMETER :: M41N4RAze = 20857 - INTEGER(IntKi), PARAMETER :: M41N5RAze = 20858 - INTEGER(IntKi), PARAMETER :: M41N6RAze = 20859 - INTEGER(IntKi), PARAMETER :: M41N7RAze = 20860 - INTEGER(IntKi), PARAMETER :: M41N8RAze = 20861 - INTEGER(IntKi), PARAMETER :: M41N9RAze = 20862 - INTEGER(IntKi), PARAMETER :: M42N1RAze = 20863 - INTEGER(IntKi), PARAMETER :: M42N2RAze = 20864 - INTEGER(IntKi), PARAMETER :: M42N3RAze = 20865 - INTEGER(IntKi), PARAMETER :: M42N4RAze = 20866 - INTEGER(IntKi), PARAMETER :: M42N5RAze = 20867 - INTEGER(IntKi), PARAMETER :: M42N6RAze = 20868 - INTEGER(IntKi), PARAMETER :: M42N7RAze = 20869 - INTEGER(IntKi), PARAMETER :: M42N8RAze = 20870 - INTEGER(IntKi), PARAMETER :: M42N9RAze = 20871 - INTEGER(IntKi), PARAMETER :: M43N1RAze = 20872 - INTEGER(IntKi), PARAMETER :: M43N2RAze = 20873 - INTEGER(IntKi), PARAMETER :: M43N3RAze = 20874 - INTEGER(IntKi), PARAMETER :: M43N4RAze = 20875 - INTEGER(IntKi), PARAMETER :: M43N5RAze = 20876 - INTEGER(IntKi), PARAMETER :: M43N6RAze = 20877 - INTEGER(IntKi), PARAMETER :: M43N7RAze = 20878 - INTEGER(IntKi), PARAMETER :: M43N8RAze = 20879 - INTEGER(IntKi), PARAMETER :: M43N9RAze = 20880 - INTEGER(IntKi), PARAMETER :: M44N1RAze = 20881 - INTEGER(IntKi), PARAMETER :: M44N2RAze = 20882 - INTEGER(IntKi), PARAMETER :: M44N3RAze = 20883 - INTEGER(IntKi), PARAMETER :: M44N4RAze = 20884 - INTEGER(IntKi), PARAMETER :: M44N5RAze = 20885 - INTEGER(IntKi), PARAMETER :: M44N6RAze = 20886 - INTEGER(IntKi), PARAMETER :: M44N7RAze = 20887 - INTEGER(IntKi), PARAMETER :: M44N8RAze = 20888 - INTEGER(IntKi), PARAMETER :: M44N9RAze = 20889 - INTEGER(IntKi), PARAMETER :: M45N1RAze = 20890 - INTEGER(IntKi), PARAMETER :: M45N2RAze = 20891 - INTEGER(IntKi), PARAMETER :: M45N3RAze = 20892 - INTEGER(IntKi), PARAMETER :: M45N4RAze = 20893 - INTEGER(IntKi), PARAMETER :: M45N5RAze = 20894 - INTEGER(IntKi), PARAMETER :: M45N6RAze = 20895 - INTEGER(IntKi), PARAMETER :: M45N7RAze = 20896 - INTEGER(IntKi), PARAMETER :: M45N8RAze = 20897 - INTEGER(IntKi), PARAMETER :: M45N9RAze = 20898 - INTEGER(IntKi), PARAMETER :: M46N1RAze = 20899 - INTEGER(IntKi), PARAMETER :: M46N2RAze = 20900 - INTEGER(IntKi), PARAMETER :: M46N3RAze = 20901 - INTEGER(IntKi), PARAMETER :: M46N4RAze = 20902 - INTEGER(IntKi), PARAMETER :: M46N5RAze = 20903 - INTEGER(IntKi), PARAMETER :: M46N6RAze = 20904 - INTEGER(IntKi), PARAMETER :: M46N7RAze = 20905 - INTEGER(IntKi), PARAMETER :: M46N8RAze = 20906 - INTEGER(IntKi), PARAMETER :: M46N9RAze = 20907 - INTEGER(IntKi), PARAMETER :: M47N1RAze = 20908 - INTEGER(IntKi), PARAMETER :: M47N2RAze = 20909 - INTEGER(IntKi), PARAMETER :: M47N3RAze = 20910 - INTEGER(IntKi), PARAMETER :: M47N4RAze = 20911 - INTEGER(IntKi), PARAMETER :: M47N5RAze = 20912 - INTEGER(IntKi), PARAMETER :: M47N6RAze = 20913 - INTEGER(IntKi), PARAMETER :: M47N7RAze = 20914 - INTEGER(IntKi), PARAMETER :: M47N8RAze = 20915 - INTEGER(IntKi), PARAMETER :: M47N9RAze = 20916 - INTEGER(IntKi), PARAMETER :: M48N1RAze = 20917 - INTEGER(IntKi), PARAMETER :: M48N2RAze = 20918 - INTEGER(IntKi), PARAMETER :: M48N3RAze = 20919 - INTEGER(IntKi), PARAMETER :: M48N4RAze = 20920 - INTEGER(IntKi), PARAMETER :: M48N5RAze = 20921 - INTEGER(IntKi), PARAMETER :: M48N6RAze = 20922 - INTEGER(IntKi), PARAMETER :: M48N7RAze = 20923 - INTEGER(IntKi), PARAMETER :: M48N8RAze = 20924 - INTEGER(IntKi), PARAMETER :: M48N9RAze = 20925 - INTEGER(IntKi), PARAMETER :: M49N1RAze = 20926 - INTEGER(IntKi), PARAMETER :: M49N2RAze = 20927 - INTEGER(IntKi), PARAMETER :: M49N3RAze = 20928 - INTEGER(IntKi), PARAMETER :: M49N4RAze = 20929 - INTEGER(IntKi), PARAMETER :: M49N5RAze = 20930 - INTEGER(IntKi), PARAMETER :: M49N6RAze = 20931 - INTEGER(IntKi), PARAMETER :: M49N7RAze = 20932 - INTEGER(IntKi), PARAMETER :: M49N8RAze = 20933 - INTEGER(IntKi), PARAMETER :: M49N9RAze = 20934 - INTEGER(IntKi), PARAMETER :: M50N1RAze = 20935 - INTEGER(IntKi), PARAMETER :: M50N2RAze = 20936 - INTEGER(IntKi), PARAMETER :: M50N3RAze = 20937 - INTEGER(IntKi), PARAMETER :: M50N4RAze = 20938 - INTEGER(IntKi), PARAMETER :: M50N5RAze = 20939 - INTEGER(IntKi), PARAMETER :: M50N6RAze = 20940 - INTEGER(IntKi), PARAMETER :: M50N7RAze = 20941 - INTEGER(IntKi), PARAMETER :: M50N8RAze = 20942 - INTEGER(IntKi), PARAMETER :: M50N9RAze = 20943 - INTEGER(IntKi), PARAMETER :: M51N1RAze = 20944 - INTEGER(IntKi), PARAMETER :: M51N2RAze = 20945 - INTEGER(IntKi), PARAMETER :: M51N3RAze = 20946 - INTEGER(IntKi), PARAMETER :: M51N4RAze = 20947 - INTEGER(IntKi), PARAMETER :: M51N5RAze = 20948 - INTEGER(IntKi), PARAMETER :: M51N6RAze = 20949 - INTEGER(IntKi), PARAMETER :: M51N7RAze = 20950 - INTEGER(IntKi), PARAMETER :: M51N8RAze = 20951 - INTEGER(IntKi), PARAMETER :: M51N9RAze = 20952 - INTEGER(IntKi), PARAMETER :: M52N1RAze = 20953 - INTEGER(IntKi), PARAMETER :: M52N2RAze = 20954 - INTEGER(IntKi), PARAMETER :: M52N3RAze = 20955 - INTEGER(IntKi), PARAMETER :: M52N4RAze = 20956 - INTEGER(IntKi), PARAMETER :: M52N5RAze = 20957 - INTEGER(IntKi), PARAMETER :: M52N6RAze = 20958 - INTEGER(IntKi), PARAMETER :: M52N7RAze = 20959 - INTEGER(IntKi), PARAMETER :: M52N8RAze = 20960 - INTEGER(IntKi), PARAMETER :: M52N9RAze = 20961 - INTEGER(IntKi), PARAMETER :: M53N1RAze = 20962 - INTEGER(IntKi), PARAMETER :: M53N2RAze = 20963 - INTEGER(IntKi), PARAMETER :: M53N3RAze = 20964 - INTEGER(IntKi), PARAMETER :: M53N4RAze = 20965 - INTEGER(IntKi), PARAMETER :: M53N5RAze = 20966 - INTEGER(IntKi), PARAMETER :: M53N6RAze = 20967 - INTEGER(IntKi), PARAMETER :: M53N7RAze = 20968 - INTEGER(IntKi), PARAMETER :: M53N8RAze = 20969 - INTEGER(IntKi), PARAMETER :: M53N9RAze = 20970 - INTEGER(IntKi), PARAMETER :: M54N1RAze = 20971 - INTEGER(IntKi), PARAMETER :: M54N2RAze = 20972 - INTEGER(IntKi), PARAMETER :: M54N3RAze = 20973 - INTEGER(IntKi), PARAMETER :: M54N4RAze = 20974 - INTEGER(IntKi), PARAMETER :: M54N5RAze = 20975 - INTEGER(IntKi), PARAMETER :: M54N6RAze = 20976 - INTEGER(IntKi), PARAMETER :: M54N7RAze = 20977 - INTEGER(IntKi), PARAMETER :: M54N8RAze = 20978 - INTEGER(IntKi), PARAMETER :: M54N9RAze = 20979 - INTEGER(IntKi), PARAMETER :: M55N1RAze = 20980 - INTEGER(IntKi), PARAMETER :: M55N2RAze = 20981 - INTEGER(IntKi), PARAMETER :: M55N3RAze = 20982 - INTEGER(IntKi), PARAMETER :: M55N4RAze = 20983 - INTEGER(IntKi), PARAMETER :: M55N5RAze = 20984 - INTEGER(IntKi), PARAMETER :: M55N6RAze = 20985 - INTEGER(IntKi), PARAMETER :: M55N7RAze = 20986 - INTEGER(IntKi), PARAMETER :: M55N8RAze = 20987 - INTEGER(IntKi), PARAMETER :: M55N9RAze = 20988 - INTEGER(IntKi), PARAMETER :: M56N1RAze = 20989 - INTEGER(IntKi), PARAMETER :: M56N2RAze = 20990 - INTEGER(IntKi), PARAMETER :: M56N3RAze = 20991 - INTEGER(IntKi), PARAMETER :: M56N4RAze = 20992 - INTEGER(IntKi), PARAMETER :: M56N5RAze = 20993 - INTEGER(IntKi), PARAMETER :: M56N6RAze = 20994 - INTEGER(IntKi), PARAMETER :: M56N7RAze = 20995 - INTEGER(IntKi), PARAMETER :: M56N8RAze = 20996 - INTEGER(IntKi), PARAMETER :: M56N9RAze = 20997 - INTEGER(IntKi), PARAMETER :: M57N1RAze = 20998 - INTEGER(IntKi), PARAMETER :: M57N2RAze = 20999 - INTEGER(IntKi), PARAMETER :: M57N3RAze = 21000 - INTEGER(IntKi), PARAMETER :: M57N4RAze = 21001 - INTEGER(IntKi), PARAMETER :: M57N5RAze = 21002 - INTEGER(IntKi), PARAMETER :: M57N6RAze = 21003 - INTEGER(IntKi), PARAMETER :: M57N7RAze = 21004 - INTEGER(IntKi), PARAMETER :: M57N8RAze = 21005 - INTEGER(IntKi), PARAMETER :: M57N9RAze = 21006 - INTEGER(IntKi), PARAMETER :: M58N1RAze = 21007 - INTEGER(IntKi), PARAMETER :: M58N2RAze = 21008 - INTEGER(IntKi), PARAMETER :: M58N3RAze = 21009 - INTEGER(IntKi), PARAMETER :: M58N4RAze = 21010 - INTEGER(IntKi), PARAMETER :: M58N5RAze = 21011 - INTEGER(IntKi), PARAMETER :: M58N6RAze = 21012 - INTEGER(IntKi), PARAMETER :: M58N7RAze = 21013 - INTEGER(IntKi), PARAMETER :: M58N8RAze = 21014 - INTEGER(IntKi), PARAMETER :: M58N9RAze = 21015 - INTEGER(IntKi), PARAMETER :: M59N1RAze = 21016 - INTEGER(IntKi), PARAMETER :: M59N2RAze = 21017 - INTEGER(IntKi), PARAMETER :: M59N3RAze = 21018 - INTEGER(IntKi), PARAMETER :: M59N4RAze = 21019 - INTEGER(IntKi), PARAMETER :: M59N5RAze = 21020 - INTEGER(IntKi), PARAMETER :: M59N6RAze = 21021 - INTEGER(IntKi), PARAMETER :: M59N7RAze = 21022 - INTEGER(IntKi), PARAMETER :: M59N8RAze = 21023 - INTEGER(IntKi), PARAMETER :: M59N9RAze = 21024 - INTEGER(IntKi), PARAMETER :: M60N1RAze = 21025 - INTEGER(IntKi), PARAMETER :: M60N2RAze = 21026 - INTEGER(IntKi), PARAMETER :: M60N3RAze = 21027 - INTEGER(IntKi), PARAMETER :: M60N4RAze = 21028 - INTEGER(IntKi), PARAMETER :: M60N5RAze = 21029 - INTEGER(IntKi), PARAMETER :: M60N6RAze = 21030 - INTEGER(IntKi), PARAMETER :: M60N7RAze = 21031 - INTEGER(IntKi), PARAMETER :: M60N8RAze = 21032 - INTEGER(IntKi), PARAMETER :: M60N9RAze = 21033 - INTEGER(IntKi), PARAMETER :: M61N1RAze = 21034 - INTEGER(IntKi), PARAMETER :: M61N2RAze = 21035 - INTEGER(IntKi), PARAMETER :: M61N3RAze = 21036 - INTEGER(IntKi), PARAMETER :: M61N4RAze = 21037 - INTEGER(IntKi), PARAMETER :: M61N5RAze = 21038 - INTEGER(IntKi), PARAMETER :: M61N6RAze = 21039 - INTEGER(IntKi), PARAMETER :: M61N7RAze = 21040 - INTEGER(IntKi), PARAMETER :: M61N8RAze = 21041 - INTEGER(IntKi), PARAMETER :: M61N9RAze = 21042 - INTEGER(IntKi), PARAMETER :: M62N1RAze = 21043 - INTEGER(IntKi), PARAMETER :: M62N2RAze = 21044 - INTEGER(IntKi), PARAMETER :: M62N3RAze = 21045 - INTEGER(IntKi), PARAMETER :: M62N4RAze = 21046 - INTEGER(IntKi), PARAMETER :: M62N5RAze = 21047 - INTEGER(IntKi), PARAMETER :: M62N6RAze = 21048 - INTEGER(IntKi), PARAMETER :: M62N7RAze = 21049 - INTEGER(IntKi), PARAMETER :: M62N8RAze = 21050 - INTEGER(IntKi), PARAMETER :: M62N9RAze = 21051 - INTEGER(IntKi), PARAMETER :: M63N1RAze = 21052 - INTEGER(IntKi), PARAMETER :: M63N2RAze = 21053 - INTEGER(IntKi), PARAMETER :: M63N3RAze = 21054 - INTEGER(IntKi), PARAMETER :: M63N4RAze = 21055 - INTEGER(IntKi), PARAMETER :: M63N5RAze = 21056 - INTEGER(IntKi), PARAMETER :: M63N6RAze = 21057 - INTEGER(IntKi), PARAMETER :: M63N7RAze = 21058 - INTEGER(IntKi), PARAMETER :: M63N8RAze = 21059 - INTEGER(IntKi), PARAMETER :: M63N9RAze = 21060 - INTEGER(IntKi), PARAMETER :: M64N1RAze = 21061 - INTEGER(IntKi), PARAMETER :: M64N2RAze = 21062 - INTEGER(IntKi), PARAMETER :: M64N3RAze = 21063 - INTEGER(IntKi), PARAMETER :: M64N4RAze = 21064 - INTEGER(IntKi), PARAMETER :: M64N5RAze = 21065 - INTEGER(IntKi), PARAMETER :: M64N6RAze = 21066 - INTEGER(IntKi), PARAMETER :: M64N7RAze = 21067 - INTEGER(IntKi), PARAMETER :: M64N8RAze = 21068 - INTEGER(IntKi), PARAMETER :: M64N9RAze = 21069 - INTEGER(IntKi), PARAMETER :: M65N1RAze = 21070 - INTEGER(IntKi), PARAMETER :: M65N2RAze = 21071 - INTEGER(IntKi), PARAMETER :: M65N3RAze = 21072 - INTEGER(IntKi), PARAMETER :: M65N4RAze = 21073 - INTEGER(IntKi), PARAMETER :: M65N5RAze = 21074 - INTEGER(IntKi), PARAMETER :: M65N6RAze = 21075 - INTEGER(IntKi), PARAMETER :: M65N7RAze = 21076 - INTEGER(IntKi), PARAMETER :: M65N8RAze = 21077 - INTEGER(IntKi), PARAMETER :: M65N9RAze = 21078 - INTEGER(IntKi), PARAMETER :: M66N1RAze = 21079 - INTEGER(IntKi), PARAMETER :: M66N2RAze = 21080 - INTEGER(IntKi), PARAMETER :: M66N3RAze = 21081 - INTEGER(IntKi), PARAMETER :: M66N4RAze = 21082 - INTEGER(IntKi), PARAMETER :: M66N5RAze = 21083 - INTEGER(IntKi), PARAMETER :: M66N6RAze = 21084 - INTEGER(IntKi), PARAMETER :: M66N7RAze = 21085 - INTEGER(IntKi), PARAMETER :: M66N8RAze = 21086 - INTEGER(IntKi), PARAMETER :: M66N9RAze = 21087 - INTEGER(IntKi), PARAMETER :: M67N1RAze = 21088 - INTEGER(IntKi), PARAMETER :: M67N2RAze = 21089 - INTEGER(IntKi), PARAMETER :: M67N3RAze = 21090 - INTEGER(IntKi), PARAMETER :: M67N4RAze = 21091 - INTEGER(IntKi), PARAMETER :: M67N5RAze = 21092 - INTEGER(IntKi), PARAMETER :: M67N6RAze = 21093 - INTEGER(IntKi), PARAMETER :: M67N7RAze = 21094 - INTEGER(IntKi), PARAMETER :: M67N8RAze = 21095 - INTEGER(IntKi), PARAMETER :: M67N9RAze = 21096 - INTEGER(IntKi), PARAMETER :: M68N1RAze = 21097 - INTEGER(IntKi), PARAMETER :: M68N2RAze = 21098 - INTEGER(IntKi), PARAMETER :: M68N3RAze = 21099 - INTEGER(IntKi), PARAMETER :: M68N4RAze = 21100 - INTEGER(IntKi), PARAMETER :: M68N5RAze = 21101 - INTEGER(IntKi), PARAMETER :: M68N6RAze = 21102 - INTEGER(IntKi), PARAMETER :: M68N7RAze = 21103 - INTEGER(IntKi), PARAMETER :: M68N8RAze = 21104 - INTEGER(IntKi), PARAMETER :: M68N9RAze = 21105 - INTEGER(IntKi), PARAMETER :: M69N1RAze = 21106 - INTEGER(IntKi), PARAMETER :: M69N2RAze = 21107 - INTEGER(IntKi), PARAMETER :: M69N3RAze = 21108 - INTEGER(IntKi), PARAMETER :: M69N4RAze = 21109 - INTEGER(IntKi), PARAMETER :: M69N5RAze = 21110 - INTEGER(IntKi), PARAMETER :: M69N6RAze = 21111 - INTEGER(IntKi), PARAMETER :: M69N7RAze = 21112 - INTEGER(IntKi), PARAMETER :: M69N8RAze = 21113 - INTEGER(IntKi), PARAMETER :: M69N9RAze = 21114 - INTEGER(IntKi), PARAMETER :: M70N1RAze = 21115 - INTEGER(IntKi), PARAMETER :: M70N2RAze = 21116 - INTEGER(IntKi), PARAMETER :: M70N3RAze = 21117 - INTEGER(IntKi), PARAMETER :: M70N4RAze = 21118 - INTEGER(IntKi), PARAMETER :: M70N5RAze = 21119 - INTEGER(IntKi), PARAMETER :: M70N6RAze = 21120 - INTEGER(IntKi), PARAMETER :: M70N7RAze = 21121 - INTEGER(IntKi), PARAMETER :: M70N8RAze = 21122 - INTEGER(IntKi), PARAMETER :: M70N9RAze = 21123 - INTEGER(IntKi), PARAMETER :: M71N1RAze = 21124 - INTEGER(IntKi), PARAMETER :: M71N2RAze = 21125 - INTEGER(IntKi), PARAMETER :: M71N3RAze = 21126 - INTEGER(IntKi), PARAMETER :: M71N4RAze = 21127 - INTEGER(IntKi), PARAMETER :: M71N5RAze = 21128 - INTEGER(IntKi), PARAMETER :: M71N6RAze = 21129 - INTEGER(IntKi), PARAMETER :: M71N7RAze = 21130 - INTEGER(IntKi), PARAMETER :: M71N8RAze = 21131 - INTEGER(IntKi), PARAMETER :: M71N9RAze = 21132 - INTEGER(IntKi), PARAMETER :: M72N1RAze = 21133 - INTEGER(IntKi), PARAMETER :: M72N2RAze = 21134 - INTEGER(IntKi), PARAMETER :: M72N3RAze = 21135 - INTEGER(IntKi), PARAMETER :: M72N4RAze = 21136 - INTEGER(IntKi), PARAMETER :: M72N5RAze = 21137 - INTEGER(IntKi), PARAMETER :: M72N6RAze = 21138 - INTEGER(IntKi), PARAMETER :: M72N7RAze = 21139 - INTEGER(IntKi), PARAMETER :: M72N8RAze = 21140 - INTEGER(IntKi), PARAMETER :: M72N9RAze = 21141 - INTEGER(IntKi), PARAMETER :: M73N1RAze = 21142 - INTEGER(IntKi), PARAMETER :: M73N2RAze = 21143 - INTEGER(IntKi), PARAMETER :: M73N3RAze = 21144 - INTEGER(IntKi), PARAMETER :: M73N4RAze = 21145 - INTEGER(IntKi), PARAMETER :: M73N5RAze = 21146 - INTEGER(IntKi), PARAMETER :: M73N6RAze = 21147 - INTEGER(IntKi), PARAMETER :: M73N7RAze = 21148 - INTEGER(IntKi), PARAMETER :: M73N8RAze = 21149 - INTEGER(IntKi), PARAMETER :: M73N9RAze = 21150 - INTEGER(IntKi), PARAMETER :: M74N1RAze = 21151 - INTEGER(IntKi), PARAMETER :: M74N2RAze = 21152 - INTEGER(IntKi), PARAMETER :: M74N3RAze = 21153 - INTEGER(IntKi), PARAMETER :: M74N4RAze = 21154 - INTEGER(IntKi), PARAMETER :: M74N5RAze = 21155 - INTEGER(IntKi), PARAMETER :: M74N6RAze = 21156 - INTEGER(IntKi), PARAMETER :: M74N7RAze = 21157 - INTEGER(IntKi), PARAMETER :: M74N8RAze = 21158 - INTEGER(IntKi), PARAMETER :: M74N9RAze = 21159 - INTEGER(IntKi), PARAMETER :: M75N1RAze = 21160 - INTEGER(IntKi), PARAMETER :: M75N2RAze = 21161 - INTEGER(IntKi), PARAMETER :: M75N3RAze = 21162 - INTEGER(IntKi), PARAMETER :: M75N4RAze = 21163 - INTEGER(IntKi), PARAMETER :: M75N5RAze = 21164 - INTEGER(IntKi), PARAMETER :: M75N6RAze = 21165 - INTEGER(IntKi), PARAMETER :: M75N7RAze = 21166 - INTEGER(IntKi), PARAMETER :: M75N8RAze = 21167 - INTEGER(IntKi), PARAMETER :: M75N9RAze = 21168 - INTEGER(IntKi), PARAMETER :: M76N1RAze = 21169 - INTEGER(IntKi), PARAMETER :: M76N2RAze = 21170 - INTEGER(IntKi), PARAMETER :: M76N3RAze = 21171 - INTEGER(IntKi), PARAMETER :: M76N4RAze = 21172 - INTEGER(IntKi), PARAMETER :: M76N5RAze = 21173 - INTEGER(IntKi), PARAMETER :: M76N6RAze = 21174 - INTEGER(IntKi), PARAMETER :: M76N7RAze = 21175 - INTEGER(IntKi), PARAMETER :: M76N8RAze = 21176 - INTEGER(IntKi), PARAMETER :: M76N9RAze = 21177 - INTEGER(IntKi), PARAMETER :: M77N1RAze = 21178 - INTEGER(IntKi), PARAMETER :: M77N2RAze = 21179 - INTEGER(IntKi), PARAMETER :: M77N3RAze = 21180 - INTEGER(IntKi), PARAMETER :: M77N4RAze = 21181 - INTEGER(IntKi), PARAMETER :: M77N5RAze = 21182 - INTEGER(IntKi), PARAMETER :: M77N6RAze = 21183 - INTEGER(IntKi), PARAMETER :: M77N7RAze = 21184 - INTEGER(IntKi), PARAMETER :: M77N8RAze = 21185 - INTEGER(IntKi), PARAMETER :: M77N9RAze = 21186 - INTEGER(IntKi), PARAMETER :: M78N1RAze = 21187 - INTEGER(IntKi), PARAMETER :: M78N2RAze = 21188 - INTEGER(IntKi), PARAMETER :: M78N3RAze = 21189 - INTEGER(IntKi), PARAMETER :: M78N4RAze = 21190 - INTEGER(IntKi), PARAMETER :: M78N5RAze = 21191 - INTEGER(IntKi), PARAMETER :: M78N6RAze = 21192 - INTEGER(IntKi), PARAMETER :: M78N7RAze = 21193 - INTEGER(IntKi), PARAMETER :: M78N8RAze = 21194 - INTEGER(IntKi), PARAMETER :: M78N9RAze = 21195 - INTEGER(IntKi), PARAMETER :: M79N1RAze = 21196 - INTEGER(IntKi), PARAMETER :: M79N2RAze = 21197 - INTEGER(IntKi), PARAMETER :: M79N3RAze = 21198 - INTEGER(IntKi), PARAMETER :: M79N4RAze = 21199 - INTEGER(IntKi), PARAMETER :: M79N5RAze = 21200 - INTEGER(IntKi), PARAMETER :: M79N6RAze = 21201 - INTEGER(IntKi), PARAMETER :: M79N7RAze = 21202 - INTEGER(IntKi), PARAMETER :: M79N8RAze = 21203 - INTEGER(IntKi), PARAMETER :: M79N9RAze = 21204 - INTEGER(IntKi), PARAMETER :: M80N1RAze = 21205 - INTEGER(IntKi), PARAMETER :: M80N2RAze = 21206 - INTEGER(IntKi), PARAMETER :: M80N3RAze = 21207 - INTEGER(IntKi), PARAMETER :: M80N4RAze = 21208 - INTEGER(IntKi), PARAMETER :: M80N5RAze = 21209 - INTEGER(IntKi), PARAMETER :: M80N6RAze = 21210 - INTEGER(IntKi), PARAMETER :: M80N7RAze = 21211 - INTEGER(IntKi), PARAMETER :: M80N8RAze = 21212 - INTEGER(IntKi), PARAMETER :: M80N9RAze = 21213 - INTEGER(IntKi), PARAMETER :: M81N1RAze = 21214 - INTEGER(IntKi), PARAMETER :: M81N2RAze = 21215 - INTEGER(IntKi), PARAMETER :: M81N3RAze = 21216 - INTEGER(IntKi), PARAMETER :: M81N4RAze = 21217 - INTEGER(IntKi), PARAMETER :: M81N5RAze = 21218 - INTEGER(IntKi), PARAMETER :: M81N6RAze = 21219 - INTEGER(IntKi), PARAMETER :: M81N7RAze = 21220 - INTEGER(IntKi), PARAMETER :: M81N8RAze = 21221 - INTEGER(IntKi), PARAMETER :: M81N9RAze = 21222 - INTEGER(IntKi), PARAMETER :: M82N1RAze = 21223 - INTEGER(IntKi), PARAMETER :: M82N2RAze = 21224 - INTEGER(IntKi), PARAMETER :: M82N3RAze = 21225 - INTEGER(IntKi), PARAMETER :: M82N4RAze = 21226 - INTEGER(IntKi), PARAMETER :: M82N5RAze = 21227 - INTEGER(IntKi), PARAMETER :: M82N6RAze = 21228 - INTEGER(IntKi), PARAMETER :: M82N7RAze = 21229 - INTEGER(IntKi), PARAMETER :: M82N8RAze = 21230 - INTEGER(IntKi), PARAMETER :: M82N9RAze = 21231 - INTEGER(IntKi), PARAMETER :: M83N1RAze = 21232 - INTEGER(IntKi), PARAMETER :: M83N2RAze = 21233 - INTEGER(IntKi), PARAMETER :: M83N3RAze = 21234 - INTEGER(IntKi), PARAMETER :: M83N4RAze = 21235 - INTEGER(IntKi), PARAMETER :: M83N5RAze = 21236 - INTEGER(IntKi), PARAMETER :: M83N6RAze = 21237 - INTEGER(IntKi), PARAMETER :: M83N7RAze = 21238 - INTEGER(IntKi), PARAMETER :: M83N8RAze = 21239 - INTEGER(IntKi), PARAMETER :: M83N9RAze = 21240 - INTEGER(IntKi), PARAMETER :: M84N1RAze = 21241 - INTEGER(IntKi), PARAMETER :: M84N2RAze = 21242 - INTEGER(IntKi), PARAMETER :: M84N3RAze = 21243 - INTEGER(IntKi), PARAMETER :: M84N4RAze = 21244 - INTEGER(IntKi), PARAMETER :: M84N5RAze = 21245 - INTEGER(IntKi), PARAMETER :: M84N6RAze = 21246 - INTEGER(IntKi), PARAMETER :: M84N7RAze = 21247 - INTEGER(IntKi), PARAMETER :: M84N8RAze = 21248 - INTEGER(IntKi), PARAMETER :: M84N9RAze = 21249 - INTEGER(IntKi), PARAMETER :: M85N1RAze = 21250 - INTEGER(IntKi), PARAMETER :: M85N2RAze = 21251 - INTEGER(IntKi), PARAMETER :: M85N3RAze = 21252 - INTEGER(IntKi), PARAMETER :: M85N4RAze = 21253 - INTEGER(IntKi), PARAMETER :: M85N5RAze = 21254 - INTEGER(IntKi), PARAMETER :: M85N6RAze = 21255 - INTEGER(IntKi), PARAMETER :: M85N7RAze = 21256 - INTEGER(IntKi), PARAMETER :: M85N8RAze = 21257 - INTEGER(IntKi), PARAMETER :: M85N9RAze = 21258 - INTEGER(IntKi), PARAMETER :: M86N1RAze = 21259 - INTEGER(IntKi), PARAMETER :: M86N2RAze = 21260 - INTEGER(IntKi), PARAMETER :: M86N3RAze = 21261 - INTEGER(IntKi), PARAMETER :: M86N4RAze = 21262 - INTEGER(IntKi), PARAMETER :: M86N5RAze = 21263 - INTEGER(IntKi), PARAMETER :: M86N6RAze = 21264 - INTEGER(IntKi), PARAMETER :: M86N7RAze = 21265 - INTEGER(IntKi), PARAMETER :: M86N8RAze = 21266 - INTEGER(IntKi), PARAMETER :: M86N9RAze = 21267 - INTEGER(IntKi), PARAMETER :: M87N1RAze = 21268 - INTEGER(IntKi), PARAMETER :: M87N2RAze = 21269 - INTEGER(IntKi), PARAMETER :: M87N3RAze = 21270 - INTEGER(IntKi), PARAMETER :: M87N4RAze = 21271 - INTEGER(IntKi), PARAMETER :: M87N5RAze = 21272 - INTEGER(IntKi), PARAMETER :: M87N6RAze = 21273 - INTEGER(IntKi), PARAMETER :: M87N7RAze = 21274 - INTEGER(IntKi), PARAMETER :: M87N8RAze = 21275 - INTEGER(IntKi), PARAMETER :: M87N9RAze = 21276 - INTEGER(IntKi), PARAMETER :: M88N1RAze = 21277 - INTEGER(IntKi), PARAMETER :: M88N2RAze = 21278 - INTEGER(IntKi), PARAMETER :: M88N3RAze = 21279 - INTEGER(IntKi), PARAMETER :: M88N4RAze = 21280 - INTEGER(IntKi), PARAMETER :: M88N5RAze = 21281 - INTEGER(IntKi), PARAMETER :: M88N6RAze = 21282 - INTEGER(IntKi), PARAMETER :: M88N7RAze = 21283 - INTEGER(IntKi), PARAMETER :: M88N8RAze = 21284 - INTEGER(IntKi), PARAMETER :: M88N9RAze = 21285 - INTEGER(IntKi), PARAMETER :: M89N1RAze = 21286 - INTEGER(IntKi), PARAMETER :: M89N2RAze = 21287 - INTEGER(IntKi), PARAMETER :: M89N3RAze = 21288 - INTEGER(IntKi), PARAMETER :: M89N4RAze = 21289 - INTEGER(IntKi), PARAMETER :: M89N5RAze = 21290 - INTEGER(IntKi), PARAMETER :: M89N6RAze = 21291 - INTEGER(IntKi), PARAMETER :: M89N7RAze = 21292 - INTEGER(IntKi), PARAMETER :: M89N8RAze = 21293 - INTEGER(IntKi), PARAMETER :: M89N9RAze = 21294 - INTEGER(IntKi), PARAMETER :: M90N1RAze = 21295 - INTEGER(IntKi), PARAMETER :: M90N2RAze = 21296 - INTEGER(IntKi), PARAMETER :: M90N3RAze = 21297 - INTEGER(IntKi), PARAMETER :: M90N4RAze = 21298 - INTEGER(IntKi), PARAMETER :: M90N5RAze = 21299 - INTEGER(IntKi), PARAMETER :: M90N6RAze = 21300 - INTEGER(IntKi), PARAMETER :: M90N7RAze = 21301 - INTEGER(IntKi), PARAMETER :: M90N8RAze = 21302 - INTEGER(IntKi), PARAMETER :: M90N9RAze = 21303 - INTEGER(IntKi), PARAMETER :: M91N1RAze = 21304 - INTEGER(IntKi), PARAMETER :: M91N2RAze = 21305 - INTEGER(IntKi), PARAMETER :: M91N3RAze = 21306 - INTEGER(IntKi), PARAMETER :: M91N4RAze = 21307 - INTEGER(IntKi), PARAMETER :: M91N5RAze = 21308 - INTEGER(IntKi), PARAMETER :: M91N6RAze = 21309 - INTEGER(IntKi), PARAMETER :: M91N7RAze = 21310 - INTEGER(IntKi), PARAMETER :: M91N8RAze = 21311 - INTEGER(IntKi), PARAMETER :: M91N9RAze = 21312 - INTEGER(IntKi), PARAMETER :: M92N1RAze = 21313 - INTEGER(IntKi), PARAMETER :: M92N2RAze = 21314 - INTEGER(IntKi), PARAMETER :: M92N3RAze = 21315 - INTEGER(IntKi), PARAMETER :: M92N4RAze = 21316 - INTEGER(IntKi), PARAMETER :: M92N5RAze = 21317 - INTEGER(IntKi), PARAMETER :: M92N6RAze = 21318 - INTEGER(IntKi), PARAMETER :: M92N7RAze = 21319 - INTEGER(IntKi), PARAMETER :: M92N8RAze = 21320 - INTEGER(IntKi), PARAMETER :: M92N9RAze = 21321 - INTEGER(IntKi), PARAMETER :: M93N1RAze = 21322 - INTEGER(IntKi), PARAMETER :: M93N2RAze = 21323 - INTEGER(IntKi), PARAMETER :: M93N3RAze = 21324 - INTEGER(IntKi), PARAMETER :: M93N4RAze = 21325 - INTEGER(IntKi), PARAMETER :: M93N5RAze = 21326 - INTEGER(IntKi), PARAMETER :: M93N6RAze = 21327 - INTEGER(IntKi), PARAMETER :: M93N7RAze = 21328 - INTEGER(IntKi), PARAMETER :: M93N8RAze = 21329 - INTEGER(IntKi), PARAMETER :: M93N9RAze = 21330 - INTEGER(IntKi), PARAMETER :: M94N1RAze = 21331 - INTEGER(IntKi), PARAMETER :: M94N2RAze = 21332 - INTEGER(IntKi), PARAMETER :: M94N3RAze = 21333 - INTEGER(IntKi), PARAMETER :: M94N4RAze = 21334 - INTEGER(IntKi), PARAMETER :: M94N5RAze = 21335 - INTEGER(IntKi), PARAMETER :: M94N6RAze = 21336 - INTEGER(IntKi), PARAMETER :: M94N7RAze = 21337 - INTEGER(IntKi), PARAMETER :: M94N8RAze = 21338 - INTEGER(IntKi), PARAMETER :: M94N9RAze = 21339 - INTEGER(IntKi), PARAMETER :: M95N1RAze = 21340 - INTEGER(IntKi), PARAMETER :: M95N2RAze = 21341 - INTEGER(IntKi), PARAMETER :: M95N3RAze = 21342 - INTEGER(IntKi), PARAMETER :: M95N4RAze = 21343 - INTEGER(IntKi), PARAMETER :: M95N5RAze = 21344 - INTEGER(IntKi), PARAMETER :: M95N6RAze = 21345 - INTEGER(IntKi), PARAMETER :: M95N7RAze = 21346 - INTEGER(IntKi), PARAMETER :: M95N8RAze = 21347 - INTEGER(IntKi), PARAMETER :: M95N9RAze = 21348 - INTEGER(IntKi), PARAMETER :: M96N1RAze = 21349 - INTEGER(IntKi), PARAMETER :: M96N2RAze = 21350 - INTEGER(IntKi), PARAMETER :: M96N3RAze = 21351 - INTEGER(IntKi), PARAMETER :: M96N4RAze = 21352 - INTEGER(IntKi), PARAMETER :: M96N5RAze = 21353 - INTEGER(IntKi), PARAMETER :: M96N6RAze = 21354 - INTEGER(IntKi), PARAMETER :: M96N7RAze = 21355 - INTEGER(IntKi), PARAMETER :: M96N8RAze = 21356 - INTEGER(IntKi), PARAMETER :: M96N9RAze = 21357 - INTEGER(IntKi), PARAMETER :: M97N1RAze = 21358 - INTEGER(IntKi), PARAMETER :: M97N2RAze = 21359 - INTEGER(IntKi), PARAMETER :: M97N3RAze = 21360 - INTEGER(IntKi), PARAMETER :: M97N4RAze = 21361 - INTEGER(IntKi), PARAMETER :: M97N5RAze = 21362 - INTEGER(IntKi), PARAMETER :: M97N6RAze = 21363 - INTEGER(IntKi), PARAMETER :: M97N7RAze = 21364 - INTEGER(IntKi), PARAMETER :: M97N8RAze = 21365 - INTEGER(IntKi), PARAMETER :: M97N9RAze = 21366 - INTEGER(IntKi), PARAMETER :: M98N1RAze = 21367 - INTEGER(IntKi), PARAMETER :: M98N2RAze = 21368 - INTEGER(IntKi), PARAMETER :: M98N3RAze = 21369 - INTEGER(IntKi), PARAMETER :: M98N4RAze = 21370 - INTEGER(IntKi), PARAMETER :: M98N5RAze = 21371 - INTEGER(IntKi), PARAMETER :: M98N6RAze = 21372 - INTEGER(IntKi), PARAMETER :: M98N7RAze = 21373 - INTEGER(IntKi), PARAMETER :: M98N8RAze = 21374 - INTEGER(IntKi), PARAMETER :: M98N9RAze = 21375 - INTEGER(IntKi), PARAMETER :: M99N1RAze = 21376 - INTEGER(IntKi), PARAMETER :: M99N2RAze = 21377 - INTEGER(IntKi), PARAMETER :: M99N3RAze = 21378 - INTEGER(IntKi), PARAMETER :: M99N4RAze = 21379 - INTEGER(IntKi), PARAMETER :: M99N5RAze = 21380 - INTEGER(IntKi), PARAMETER :: M99N6RAze = 21381 - INTEGER(IntKi), PARAMETER :: M99N7RAze = 21382 - INTEGER(IntKi), PARAMETER :: M99N8RAze = 21383 - INTEGER(IntKi), PARAMETER :: M99N9RAze = 21384 + INTEGER(IntKi), PARAMETER :: Intf1TAXss= 21499 + INTEGER(IntKi), PARAMETER :: Intf1TAYss= 21500 + INTEGER(IntKi), PARAMETER :: Intf1TAZss= 21501 + INTEGER(IntKi), PARAMETER :: Intf1RAXss= 21502 + INTEGER(IntKi), PARAMETER :: Intf1RAYss= 21503 + INTEGER(IntKi), PARAMETER :: Intf1RAZss= 21504 + INTEGER(IntKi), PARAMETER :: Intf2TAXss= 21505 + INTEGER(IntKi), PARAMETER :: Intf2TAYss= 21506 + INTEGER(IntKi), PARAMETER :: Intf2TAZss= 21507 + INTEGER(IntKi), PARAMETER :: Intf2RAXss= 21508 + INTEGER(IntKi), PARAMETER :: Intf2RAYss= 21509 + INTEGER(IntKi), PARAMETER :: Intf2RAZss= 21510 + INTEGER(IntKi), PARAMETER :: Intf3TAXss= 21511 + INTEGER(IntKi), PARAMETER :: Intf3TAYss= 21512 + INTEGER(IntKi), PARAMETER :: Intf3TAZss= 21513 + INTEGER(IntKi), PARAMETER :: Intf3RAXss= 21514 + INTEGER(IntKi), PARAMETER :: Intf3RAYss= 21515 + INTEGER(IntKi), PARAMETER :: Intf3RAZss= 21516 + INTEGER(IntKi), PARAMETER :: Intf4TAXss= 21517 + INTEGER(IntKi), PARAMETER :: Intf4TAYss= 21518 + INTEGER(IntKi), PARAMETER :: Intf4TAZss= 21519 + INTEGER(IntKi), PARAMETER :: Intf4RAXss= 21520 + INTEGER(IntKi), PARAMETER :: Intf4RAYss= 21521 + INTEGER(IntKi), PARAMETER :: Intf4RAZss= 21522 + INTEGER(IntKi), PARAMETER :: Intf5TAXss= 21523 + INTEGER(IntKi), PARAMETER :: Intf5TAYss= 21524 + INTEGER(IntKi), PARAMETER :: Intf5TAZss= 21525 + INTEGER(IntKi), PARAMETER :: Intf5RAXss= 21526 + INTEGER(IntKi), PARAMETER :: Intf5RAYss= 21527 + INTEGER(IntKi), PARAMETER :: Intf5RAZss= 21528 + INTEGER(IntKi), PARAMETER :: Intf6TAXss= 21529 + INTEGER(IntKi), PARAMETER :: Intf6TAYss= 21530 + INTEGER(IntKi), PARAMETER :: Intf6TAZss= 21531 + INTEGER(IntKi), PARAMETER :: Intf6RAXss= 21532 + INTEGER(IntKi), PARAMETER :: Intf6RAYss= 21533 + INTEGER(IntKi), PARAMETER :: Intf6RAZss= 21534 + INTEGER(IntKi), PARAMETER :: Intf7TAXss= 21535 + INTEGER(IntKi), PARAMETER :: Intf7TAYss= 21536 + INTEGER(IntKi), PARAMETER :: Intf7TAZss= 21537 + INTEGER(IntKi), PARAMETER :: Intf7RAXss= 21538 + INTEGER(IntKi), PARAMETER :: Intf7RAYss= 21539 + INTEGER(IntKi), PARAMETER :: Intf7RAZss= 21540 + INTEGER(IntKi), PARAMETER :: Intf8TAXss= 21541 + INTEGER(IntKi), PARAMETER :: Intf8TAYss= 21542 + INTEGER(IntKi), PARAMETER :: Intf8TAZss= 21543 + INTEGER(IntKi), PARAMETER :: Intf8RAXss= 21544 + INTEGER(IntKi), PARAMETER :: Intf8RAYss= 21545 + INTEGER(IntKi), PARAMETER :: Intf8RAZss= 21546 + INTEGER(IntKi), PARAMETER :: Intf9TAXss= 21547 + INTEGER(IntKi), PARAMETER :: Intf9TAYss= 21548 + INTEGER(IntKi), PARAMETER :: Intf9TAZss= 21549 + INTEGER(IntKi), PARAMETER :: Intf9RAXss= 21550 + INTEGER(IntKi), PARAMETER :: Intf9RAYss= 21551 + INTEGER(IntKi), PARAMETER :: Intf9RAZss= 21552 + ! Interface Deflections: - ! Reactions: + INTEGER(IntKi), PARAMETER :: Intf1TDXe = 21553 + INTEGER(IntKi), PARAMETER :: Intf1TDYe = 21554 + INTEGER(IntKi), PARAMETER :: Intf1TDZe = 21555 + INTEGER(IntKi), PARAMETER :: Intf1RDXe = 21556 + INTEGER(IntKi), PARAMETER :: Intf1RDYe = 21557 + INTEGER(IntKi), PARAMETER :: Intf1RDZe = 21558 + INTEGER(IntKi), PARAMETER :: Intf2TDXe = 21559 + INTEGER(IntKi), PARAMETER :: Intf2TDYe = 21560 + INTEGER(IntKi), PARAMETER :: Intf2TDZe = 21561 + INTEGER(IntKi), PARAMETER :: Intf2RDXe = 21562 + INTEGER(IntKi), PARAMETER :: Intf2RDYe = 21563 + INTEGER(IntKi), PARAMETER :: Intf2RDZe = 21564 + INTEGER(IntKi), PARAMETER :: Intf3TDXe = 21565 + INTEGER(IntKi), PARAMETER :: Intf3TDYe = 21566 + INTEGER(IntKi), PARAMETER :: Intf3TDZe = 21567 + INTEGER(IntKi), PARAMETER :: Intf3RDXe = 21568 + INTEGER(IntKi), PARAMETER :: Intf3RDYe = 21569 + INTEGER(IntKi), PARAMETER :: Intf3RDZe = 21570 + INTEGER(IntKi), PARAMETER :: Intf4TDXe = 21571 + INTEGER(IntKi), PARAMETER :: Intf4TDYe = 21572 + INTEGER(IntKi), PARAMETER :: Intf4TDZe = 21573 + INTEGER(IntKi), PARAMETER :: Intf4RDXe = 21574 + INTEGER(IntKi), PARAMETER :: Intf4RDYe = 21575 + INTEGER(IntKi), PARAMETER :: Intf4RDZe = 21576 + INTEGER(IntKi), PARAMETER :: Intf5TDXe = 21577 + INTEGER(IntKi), PARAMETER :: Intf5TDYe = 21578 + INTEGER(IntKi), PARAMETER :: Intf5TDZe = 21579 + INTEGER(IntKi), PARAMETER :: Intf5RDXe = 21580 + INTEGER(IntKi), PARAMETER :: Intf5RDYe = 21581 + INTEGER(IntKi), PARAMETER :: Intf5RDZe = 21582 + INTEGER(IntKi), PARAMETER :: Intf6TDXe = 21583 + INTEGER(IntKi), PARAMETER :: Intf6TDYe = 21584 + INTEGER(IntKi), PARAMETER :: Intf6TDZe = 21585 + INTEGER(IntKi), PARAMETER :: Intf6RDXe = 21586 + INTEGER(IntKi), PARAMETER :: Intf6RDYe = 21587 + INTEGER(IntKi), PARAMETER :: Intf6RDZe = 21588 + INTEGER(IntKi), PARAMETER :: Intf7TDXe = 21589 + INTEGER(IntKi), PARAMETER :: Intf7TDYe = 21590 + INTEGER(IntKi), PARAMETER :: Intf7TDZe = 21591 + INTEGER(IntKi), PARAMETER :: Intf7RDXe = 21592 + INTEGER(IntKi), PARAMETER :: Intf7RDYe = 21593 + INTEGER(IntKi), PARAMETER :: Intf7RDZe = 21594 + INTEGER(IntKi), PARAMETER :: Intf8TDXe = 21595 + INTEGER(IntKi), PARAMETER :: Intf8TDYe = 21596 + INTEGER(IntKi), PARAMETER :: Intf8TDZe = 21597 + INTEGER(IntKi), PARAMETER :: Intf8RDXe = 21598 + INTEGER(IntKi), PARAMETER :: Intf8RDYe = 21599 + INTEGER(IntKi), PARAMETER :: Intf8RDZe = 21600 + INTEGER(IntKi), PARAMETER :: Intf9TDXe = 21601 + INTEGER(IntKi), PARAMETER :: Intf9TDYe = 21602 + INTEGER(IntKi), PARAMETER :: Intf9TDZe = 21603 + INTEGER(IntKi), PARAMETER :: Intf9RDXe = 21604 + INTEGER(IntKi), PARAMETER :: Intf9RDYe = 21605 + INTEGER(IntKi), PARAMETER :: Intf9RDZe = 21606 - INTEGER(IntKi), PARAMETER :: ReactFXss = 21385 - INTEGER(IntKi), PARAMETER :: ReactFYss = 21386 - INTEGER(IntKi), PARAMETER :: ReactFZss = 21387 - INTEGER(IntKi), PARAMETER :: ReactMXss = 21388 - INTEGER(IntKi), PARAMETER :: ReactMYss = 21389 - INTEGER(IntKi), PARAMETER :: ReactMZss = 21390 - INTEGER(IntKi), PARAMETER :: IntfFXss = 21391 - INTEGER(IntKi), PARAMETER :: IntfFYss = 21392 - INTEGER(IntKi), PARAMETER :: IntfFZss = 21393 - INTEGER(IntKi), PARAMETER :: IntfMXss = 21394 - INTEGER(IntKi), PARAMETER :: IntfMYss = 21395 - INTEGER(IntKi), PARAMETER :: IntfMZss = 21396 + ! Modal Parameters: + INTEGER(IntKi), PARAMETER :: SSqm01 = 21607 + INTEGER(IntKi), PARAMETER :: SSqm02 = 21608 + INTEGER(IntKi), PARAMETER :: SSqm03 = 21609 + INTEGER(IntKi), PARAMETER :: SSqm04 = 21610 + INTEGER(IntKi), PARAMETER :: SSqm05 = 21611 + INTEGER(IntKi), PARAMETER :: SSqm06 = 21612 + INTEGER(IntKi), PARAMETER :: SSqm07 = 21613 + INTEGER(IntKi), PARAMETER :: SSqm08 = 21614 + INTEGER(IntKi), PARAMETER :: SSqm09 = 21615 + INTEGER(IntKi), PARAMETER :: SSqm10 = 21616 + INTEGER(IntKi), PARAMETER :: SSqm11 = 21617 + INTEGER(IntKi), PARAMETER :: SSqm12 = 21618 + INTEGER(IntKi), PARAMETER :: SSqm13 = 21619 + INTEGER(IntKi), PARAMETER :: SSqm14 = 21620 + INTEGER(IntKi), PARAMETER :: SSqm15 = 21621 + INTEGER(IntKi), PARAMETER :: SSqm16 = 21622 + INTEGER(IntKi), PARAMETER :: SSqm17 = 21623 + INTEGER(IntKi), PARAMETER :: SSqm18 = 21624 + INTEGER(IntKi), PARAMETER :: SSqm19 = 21625 + INTEGER(IntKi), PARAMETER :: SSqm20 = 21626 + INTEGER(IntKi), PARAMETER :: SSqm21 = 21627 + INTEGER(IntKi), PARAMETER :: SSqm22 = 21628 + INTEGER(IntKi), PARAMETER :: SSqm23 = 21629 + INTEGER(IntKi), PARAMETER :: SSqm24 = 21630 + INTEGER(IntKi), PARAMETER :: SSqm25 = 21631 + INTEGER(IntKi), PARAMETER :: SSqm26 = 21632 + INTEGER(IntKi), PARAMETER :: SSqm27 = 21633 + INTEGER(IntKi), PARAMETER :: SSqm28 = 21634 + INTEGER(IntKi), PARAMETER :: SSqm29 = 21635 + INTEGER(IntKi), PARAMETER :: SSqm30 = 21636 + INTEGER(IntKi), PARAMETER :: SSqm31 = 21637 + INTEGER(IntKi), PARAMETER :: SSqm32 = 21638 + INTEGER(IntKi), PARAMETER :: SSqm33 = 21639 + INTEGER(IntKi), PARAMETER :: SSqm34 = 21640 + INTEGER(IntKi), PARAMETER :: SSqm35 = 21641 + INTEGER(IntKi), PARAMETER :: SSqm36 = 21642 + INTEGER(IntKi), PARAMETER :: SSqm37 = 21643 + INTEGER(IntKi), PARAMETER :: SSqm38 = 21644 + INTEGER(IntKi), PARAMETER :: SSqm39 = 21645 + INTEGER(IntKi), PARAMETER :: SSqm40 = 21646 + INTEGER(IntKi), PARAMETER :: SSqm41 = 21647 + INTEGER(IntKi), PARAMETER :: SSqm42 = 21648 + INTEGER(IntKi), PARAMETER :: SSqm43 = 21649 + INTEGER(IntKi), PARAMETER :: SSqm44 = 21650 + INTEGER(IntKi), PARAMETER :: SSqm45 = 21651 + INTEGER(IntKi), PARAMETER :: SSqm46 = 21652 + INTEGER(IntKi), PARAMETER :: SSqm47 = 21653 + INTEGER(IntKi), PARAMETER :: SSqm48 = 21654 + INTEGER(IntKi), PARAMETER :: SSqm49 = 21655 + INTEGER(IntKi), PARAMETER :: SSqm50 = 21656 + INTEGER(IntKi), PARAMETER :: SSqm51 = 21657 + INTEGER(IntKi), PARAMETER :: SSqm52 = 21658 + INTEGER(IntKi), PARAMETER :: SSqm53 = 21659 + INTEGER(IntKi), PARAMETER :: SSqm54 = 21660 + INTEGER(IntKi), PARAMETER :: SSqm55 = 21661 + INTEGER(IntKi), PARAMETER :: SSqm56 = 21662 + INTEGER(IntKi), PARAMETER :: SSqm57 = 21663 + INTEGER(IntKi), PARAMETER :: SSqm58 = 21664 + INTEGER(IntKi), PARAMETER :: SSqm59 = 21665 + INTEGER(IntKi), PARAMETER :: SSqm60 = 21666 + INTEGER(IntKi), PARAMETER :: SSqm61 = 21667 + INTEGER(IntKi), PARAMETER :: SSqm62 = 21668 + INTEGER(IntKi), PARAMETER :: SSqm63 = 21669 + INTEGER(IntKi), PARAMETER :: SSqm64 = 21670 + INTEGER(IntKi), PARAMETER :: SSqm65 = 21671 + INTEGER(IntKi), PARAMETER :: SSqm66 = 21672 + INTEGER(IntKi), PARAMETER :: SSqm67 = 21673 + INTEGER(IntKi), PARAMETER :: SSqm68 = 21674 + INTEGER(IntKi), PARAMETER :: SSqm69 = 21675 + INTEGER(IntKi), PARAMETER :: SSqm70 = 21676 + INTEGER(IntKi), PARAMETER :: SSqm71 = 21677 + INTEGER(IntKi), PARAMETER :: SSqm72 = 21678 + INTEGER(IntKi), PARAMETER :: SSqm73 = 21679 + INTEGER(IntKi), PARAMETER :: SSqm74 = 21680 + INTEGER(IntKi), PARAMETER :: SSqm75 = 21681 + INTEGER(IntKi), PARAMETER :: SSqm76 = 21682 + INTEGER(IntKi), PARAMETER :: SSqm77 = 21683 + INTEGER(IntKi), PARAMETER :: SSqm78 = 21684 + INTEGER(IntKi), PARAMETER :: SSqm79 = 21685 + INTEGER(IntKi), PARAMETER :: SSqm80 = 21686 + INTEGER(IntKi), PARAMETER :: SSqm81 = 21687 + INTEGER(IntKi), PARAMETER :: SSqm82 = 21688 + INTEGER(IntKi), PARAMETER :: SSqm83 = 21689 + INTEGER(IntKi), PARAMETER :: SSqm84 = 21690 + INTEGER(IntKi), PARAMETER :: SSqm85 = 21691 + INTEGER(IntKi), PARAMETER :: SSqm86 = 21692 + INTEGER(IntKi), PARAMETER :: SSqm87 = 21693 + INTEGER(IntKi), PARAMETER :: SSqm88 = 21694 + INTEGER(IntKi), PARAMETER :: SSqm89 = 21695 + INTEGER(IntKi), PARAMETER :: SSqm90 = 21696 + INTEGER(IntKi), PARAMETER :: SSqm91 = 21697 + INTEGER(IntKi), PARAMETER :: SSqm92 = 21698 + INTEGER(IntKi), PARAMETER :: SSqm93 = 21699 + INTEGER(IntKi), PARAMETER :: SSqm94 = 21700 + INTEGER(IntKi), PARAMETER :: SSqm95 = 21701 + INTEGER(IntKi), PARAMETER :: SSqm96 = 21702 + INTEGER(IntKi), PARAMETER :: SSqm97 = 21703 + INTEGER(IntKi), PARAMETER :: SSqm98 = 21704 + INTEGER(IntKi), PARAMETER :: SSqm99 = 21705 + INTEGER(IntKi), PARAMETER :: SSqmd01 = 21706 + INTEGER(IntKi), PARAMETER :: SSqmd02 = 21707 + INTEGER(IntKi), PARAMETER :: SSqmd03 = 21708 + INTEGER(IntKi), PARAMETER :: SSqmd04 = 21709 + INTEGER(IntKi), PARAMETER :: SSqmd05 = 21710 + INTEGER(IntKi), PARAMETER :: SSqmd06 = 21711 + INTEGER(IntKi), PARAMETER :: SSqmd07 = 21712 + INTEGER(IntKi), PARAMETER :: SSqmd08 = 21713 + INTEGER(IntKi), PARAMETER :: SSqmd09 = 21714 + INTEGER(IntKi), PARAMETER :: SSqmd10 = 21715 + INTEGER(IntKi), PARAMETER :: SSqmd11 = 21716 + INTEGER(IntKi), PARAMETER :: SSqmd12 = 21717 + INTEGER(IntKi), PARAMETER :: SSqmd13 = 21718 + INTEGER(IntKi), PARAMETER :: SSqmd14 = 21719 + INTEGER(IntKi), PARAMETER :: SSqmd15 = 21720 + INTEGER(IntKi), PARAMETER :: SSqmd16 = 21721 + INTEGER(IntKi), PARAMETER :: SSqmd17 = 21722 + INTEGER(IntKi), PARAMETER :: SSqmd18 = 21723 + INTEGER(IntKi), PARAMETER :: SSqmd19 = 21724 + INTEGER(IntKi), PARAMETER :: SSqmd20 = 21725 + INTEGER(IntKi), PARAMETER :: SSqmd21 = 21726 + INTEGER(IntKi), PARAMETER :: SSqmd22 = 21727 + INTEGER(IntKi), PARAMETER :: SSqmd23 = 21728 + INTEGER(IntKi), PARAMETER :: SSqmd24 = 21729 + INTEGER(IntKi), PARAMETER :: SSqmd25 = 21730 + INTEGER(IntKi), PARAMETER :: SSqmd26 = 21731 + INTEGER(IntKi), PARAMETER :: SSqmd27 = 21732 + INTEGER(IntKi), PARAMETER :: SSqmd28 = 21733 + INTEGER(IntKi), PARAMETER :: SSqmd29 = 21734 + INTEGER(IntKi), PARAMETER :: SSqmd30 = 21735 + INTEGER(IntKi), PARAMETER :: SSqmd31 = 21736 + INTEGER(IntKi), PARAMETER :: SSqmd32 = 21737 + INTEGER(IntKi), PARAMETER :: SSqmd33 = 21738 + INTEGER(IntKi), PARAMETER :: SSqmd34 = 21739 + INTEGER(IntKi), PARAMETER :: SSqmd35 = 21740 + INTEGER(IntKi), PARAMETER :: SSqmd36 = 21741 + INTEGER(IntKi), PARAMETER :: SSqmd37 = 21742 + INTEGER(IntKi), PARAMETER :: SSqmd38 = 21743 + INTEGER(IntKi), PARAMETER :: SSqmd39 = 21744 + INTEGER(IntKi), PARAMETER :: SSqmd40 = 21745 + INTEGER(IntKi), PARAMETER :: SSqmd41 = 21746 + INTEGER(IntKi), PARAMETER :: SSqmd42 = 21747 + INTEGER(IntKi), PARAMETER :: SSqmd43 = 21748 + INTEGER(IntKi), PARAMETER :: SSqmd44 = 21749 + INTEGER(IntKi), PARAMETER :: SSqmd45 = 21750 + INTEGER(IntKi), PARAMETER :: SSqmd46 = 21751 + INTEGER(IntKi), PARAMETER :: SSqmd47 = 21752 + INTEGER(IntKi), PARAMETER :: SSqmd48 = 21753 + INTEGER(IntKi), PARAMETER :: SSqmd49 = 21754 + INTEGER(IntKi), PARAMETER :: SSqmd50 = 21755 + INTEGER(IntKi), PARAMETER :: SSqmd51 = 21756 + INTEGER(IntKi), PARAMETER :: SSqmd52 = 21757 + INTEGER(IntKi), PARAMETER :: SSqmd53 = 21758 + INTEGER(IntKi), PARAMETER :: SSqmd54 = 21759 + INTEGER(IntKi), PARAMETER :: SSqmd55 = 21760 + INTEGER(IntKi), PARAMETER :: SSqmd56 = 21761 + INTEGER(IntKi), PARAMETER :: SSqmd57 = 21762 + INTEGER(IntKi), PARAMETER :: SSqmd58 = 21763 + INTEGER(IntKi), PARAMETER :: SSqmd59 = 21764 + INTEGER(IntKi), PARAMETER :: SSqmd60 = 21765 + INTEGER(IntKi), PARAMETER :: SSqmd61 = 21766 + INTEGER(IntKi), PARAMETER :: SSqmd62 = 21767 + INTEGER(IntKi), PARAMETER :: SSqmd63 = 21768 + INTEGER(IntKi), PARAMETER :: SSqmd64 = 21769 + INTEGER(IntKi), PARAMETER :: SSqmd65 = 21770 + INTEGER(IntKi), PARAMETER :: SSqmd66 = 21771 + INTEGER(IntKi), PARAMETER :: SSqmd67 = 21772 + INTEGER(IntKi), PARAMETER :: SSqmd68 = 21773 + INTEGER(IntKi), PARAMETER :: SSqmd69 = 21774 + INTEGER(IntKi), PARAMETER :: SSqmd70 = 21775 + INTEGER(IntKi), PARAMETER :: SSqmd71 = 21776 + INTEGER(IntKi), PARAMETER :: SSqmd72 = 21777 + INTEGER(IntKi), PARAMETER :: SSqmd73 = 21778 + INTEGER(IntKi), PARAMETER :: SSqmd74 = 21779 + INTEGER(IntKi), PARAMETER :: SSqmd75 = 21780 + INTEGER(IntKi), PARAMETER :: SSqmd76 = 21781 + INTEGER(IntKi), PARAMETER :: SSqmd77 = 21782 + INTEGER(IntKi), PARAMETER :: SSqmd78 = 21783 + INTEGER(IntKi), PARAMETER :: SSqmd79 = 21784 + INTEGER(IntKi), PARAMETER :: SSqmd80 = 21785 + INTEGER(IntKi), PARAMETER :: SSqmd81 = 21786 + INTEGER(IntKi), PARAMETER :: SSqmd82 = 21787 + INTEGER(IntKi), PARAMETER :: SSqmd83 = 21788 + INTEGER(IntKi), PARAMETER :: SSqmd84 = 21789 + INTEGER(IntKi), PARAMETER :: SSqmd85 = 21790 + INTEGER(IntKi), PARAMETER :: SSqmd86 = 21791 + INTEGER(IntKi), PARAMETER :: SSqmd87 = 21792 + INTEGER(IntKi), PARAMETER :: SSqmd88 = 21793 + INTEGER(IntKi), PARAMETER :: SSqmd89 = 21794 + INTEGER(IntKi), PARAMETER :: SSqmd90 = 21795 + INTEGER(IntKi), PARAMETER :: SSqmd91 = 21796 + INTEGER(IntKi), PARAMETER :: SSqmd92 = 21797 + INTEGER(IntKi), PARAMETER :: SSqmd93 = 21798 + INTEGER(IntKi), PARAMETER :: SSqmd94 = 21799 + INTEGER(IntKi), PARAMETER :: SSqmd95 = 21800 + INTEGER(IntKi), PARAMETER :: SSqmd96 = 21801 + INTEGER(IntKi), PARAMETER :: SSqmd97 = 21802 + INTEGER(IntKi), PARAMETER :: SSqmd98 = 21803 + INTEGER(IntKi), PARAMETER :: SSqmd99 = 21804 + INTEGER(IntKi), PARAMETER :: SSqmdd01 = 21805 + INTEGER(IntKi), PARAMETER :: SSqmdd02 = 21806 + INTEGER(IntKi), PARAMETER :: SSqmdd03 = 21807 + INTEGER(IntKi), PARAMETER :: SSqmdd04 = 21808 + INTEGER(IntKi), PARAMETER :: SSqmdd05 = 21809 + INTEGER(IntKi), PARAMETER :: SSqmdd06 = 21810 + INTEGER(IntKi), PARAMETER :: SSqmdd07 = 21811 + INTEGER(IntKi), PARAMETER :: SSqmdd08 = 21812 + INTEGER(IntKi), PARAMETER :: SSqmdd09 = 21813 + INTEGER(IntKi), PARAMETER :: SSqmdd10 = 21814 + INTEGER(IntKi), PARAMETER :: SSqmdd11 = 21815 + INTEGER(IntKi), PARAMETER :: SSqmdd12 = 21816 + INTEGER(IntKi), PARAMETER :: SSqmdd13 = 21817 + INTEGER(IntKi), PARAMETER :: SSqmdd14 = 21818 + INTEGER(IntKi), PARAMETER :: SSqmdd15 = 21819 + INTEGER(IntKi), PARAMETER :: SSqmdd16 = 21820 + INTEGER(IntKi), PARAMETER :: SSqmdd17 = 21821 + INTEGER(IntKi), PARAMETER :: SSqmdd18 = 21822 + INTEGER(IntKi), PARAMETER :: SSqmdd19 = 21823 + INTEGER(IntKi), PARAMETER :: SSqmdd20 = 21824 + INTEGER(IntKi), PARAMETER :: SSqmdd21 = 21825 + INTEGER(IntKi), PARAMETER :: SSqmdd22 = 21826 + INTEGER(IntKi), PARAMETER :: SSqmdd23 = 21827 + INTEGER(IntKi), PARAMETER :: SSqmdd24 = 21828 + INTEGER(IntKi), PARAMETER :: SSqmdd25 = 21829 + INTEGER(IntKi), PARAMETER :: SSqmdd26 = 21830 + INTEGER(IntKi), PARAMETER :: SSqmdd27 = 21831 + INTEGER(IntKi), PARAMETER :: SSqmdd28 = 21832 + INTEGER(IntKi), PARAMETER :: SSqmdd29 = 21833 + INTEGER(IntKi), PARAMETER :: SSqmdd30 = 21834 + INTEGER(IntKi), PARAMETER :: SSqmdd31 = 21835 + INTEGER(IntKi), PARAMETER :: SSqmdd32 = 21836 + INTEGER(IntKi), PARAMETER :: SSqmdd33 = 21837 + INTEGER(IntKi), PARAMETER :: SSqmdd34 = 21838 + INTEGER(IntKi), PARAMETER :: SSqmdd35 = 21839 + INTEGER(IntKi), PARAMETER :: SSqmdd36 = 21840 + INTEGER(IntKi), PARAMETER :: SSqmdd37 = 21841 + INTEGER(IntKi), PARAMETER :: SSqmdd38 = 21842 + INTEGER(IntKi), PARAMETER :: SSqmdd39 = 21843 + INTEGER(IntKi), PARAMETER :: SSqmdd40 = 21844 + INTEGER(IntKi), PARAMETER :: SSqmdd41 = 21845 + INTEGER(IntKi), PARAMETER :: SSqmdd42 = 21846 + INTEGER(IntKi), PARAMETER :: SSqmdd43 = 21847 + INTEGER(IntKi), PARAMETER :: SSqmdd44 = 21848 + INTEGER(IntKi), PARAMETER :: SSqmdd45 = 21849 + INTEGER(IntKi), PARAMETER :: SSqmdd46 = 21850 + INTEGER(IntKi), PARAMETER :: SSqmdd47 = 21851 + INTEGER(IntKi), PARAMETER :: SSqmdd48 = 21852 + INTEGER(IntKi), PARAMETER :: SSqmdd49 = 21853 + INTEGER(IntKi), PARAMETER :: SSqmdd50 = 21854 + INTEGER(IntKi), PARAMETER :: SSqmdd51 = 21855 + INTEGER(IntKi), PARAMETER :: SSqmdd52 = 21856 + INTEGER(IntKi), PARAMETER :: SSqmdd53 = 21857 + INTEGER(IntKi), PARAMETER :: SSqmdd54 = 21858 + INTEGER(IntKi), PARAMETER :: SSqmdd55 = 21859 + INTEGER(IntKi), PARAMETER :: SSqmdd56 = 21860 + INTEGER(IntKi), PARAMETER :: SSqmdd57 = 21861 + INTEGER(IntKi), PARAMETER :: SSqmdd58 = 21862 + INTEGER(IntKi), PARAMETER :: SSqmdd59 = 21863 + INTEGER(IntKi), PARAMETER :: SSqmdd60 = 21864 + INTEGER(IntKi), PARAMETER :: SSqmdd61 = 21865 + INTEGER(IntKi), PARAMETER :: SSqmdd62 = 21866 + INTEGER(IntKi), PARAMETER :: SSqmdd63 = 21867 + INTEGER(IntKi), PARAMETER :: SSqmdd64 = 21868 + INTEGER(IntKi), PARAMETER :: SSqmdd65 = 21869 + INTEGER(IntKi), PARAMETER :: SSqmdd66 = 21870 + INTEGER(IntKi), PARAMETER :: SSqmdd67 = 21871 + INTEGER(IntKi), PARAMETER :: SSqmdd68 = 21872 + INTEGER(IntKi), PARAMETER :: SSqmdd69 = 21873 + INTEGER(IntKi), PARAMETER :: SSqmdd70 = 21874 + INTEGER(IntKi), PARAMETER :: SSqmdd71 = 21875 + INTEGER(IntKi), PARAMETER :: SSqmdd72 = 21876 + INTEGER(IntKi), PARAMETER :: SSqmdd73 = 21877 + INTEGER(IntKi), PARAMETER :: SSqmdd74 = 21878 + INTEGER(IntKi), PARAMETER :: SSqmdd75 = 21879 + INTEGER(IntKi), PARAMETER :: SSqmdd76 = 21880 + INTEGER(IntKi), PARAMETER :: SSqmdd77 = 21881 + INTEGER(IntKi), PARAMETER :: SSqmdd78 = 21882 + INTEGER(IntKi), PARAMETER :: SSqmdd79 = 21883 + INTEGER(IntKi), PARAMETER :: SSqmdd80 = 21884 + INTEGER(IntKi), PARAMETER :: SSqmdd81 = 21885 + INTEGER(IntKi), PARAMETER :: SSqmdd82 = 21886 + INTEGER(IntKi), PARAMETER :: SSqmdd83 = 21887 + INTEGER(IntKi), PARAMETER :: SSqmdd84 = 21888 + INTEGER(IntKi), PARAMETER :: SSqmdd85 = 21889 + INTEGER(IntKi), PARAMETER :: SSqmdd86 = 21890 + INTEGER(IntKi), PARAMETER :: SSqmdd87 = 21891 + INTEGER(IntKi), PARAMETER :: SSqmdd88 = 21892 + INTEGER(IntKi), PARAMETER :: SSqmdd89 = 21893 + INTEGER(IntKi), PARAMETER :: SSqmdd90 = 21894 + INTEGER(IntKi), PARAMETER :: SSqmdd91 = 21895 + INTEGER(IntKi), PARAMETER :: SSqmdd92 = 21896 + INTEGER(IntKi), PARAMETER :: SSqmdd93 = 21897 + INTEGER(IntKi), PARAMETER :: SSqmdd94 = 21898 + INTEGER(IntKi), PARAMETER :: SSqmdd95 = 21899 + INTEGER(IntKi), PARAMETER :: SSqmdd96 = 21900 + INTEGER(IntKi), PARAMETER :: SSqmdd97 = 21901 + INTEGER(IntKi), PARAMETER :: SSqmdd98 = 21902 + INTEGER(IntKi), PARAMETER :: SSqmdd99 = 21903 - ! Interface Deflections: + ! Rigid-Body Motion: - INTEGER(IntKi), PARAMETER :: IntfTDXss = 21397 - INTEGER(IntKi), PARAMETER :: IntfTDYss = 21398 - INTEGER(IntKi), PARAMETER :: IntfTDZss = 21399 - INTEGER(IntKi), PARAMETER :: IntfRDXss = 21400 - INTEGER(IntKi), PARAMETER :: IntfRDYss = 21401 - INTEGER(IntKi), PARAMETER :: IntfRDZss = 21402 + INTEGER(IntKi), PARAMETER :: RBTDXss = 21904 + INTEGER(IntKi), PARAMETER :: RBTDYss = 21905 + INTEGER(IntKi), PARAMETER :: RBTDZss = 21906 + INTEGER(IntKi), PARAMETER :: RBRDXss = 21907 + INTEGER(IntKi), PARAMETER :: RBRDYss = 21908 + INTEGER(IntKi), PARAMETER :: RBRDZss = 21909 + INTEGER(IntKi), PARAMETER :: RBTVXss = 21910 + INTEGER(IntKi), PARAMETER :: RBTVYss = 21911 + INTEGER(IntKi), PARAMETER :: RBTVZss = 21912 + INTEGER(IntKi), PARAMETER :: RBRVXss = 21913 + INTEGER(IntKi), PARAMETER :: RBRVYss = 21914 + INTEGER(IntKi), PARAMETER :: RBRVZss = 21915 + INTEGER(IntKi), PARAMETER :: RBTAXss = 21916 + INTEGER(IntKi), PARAMETER :: RBTAYss = 21917 + INTEGER(IntKi), PARAMETER :: RBTAZss = 21918 + INTEGER(IntKi), PARAMETER :: RBRAXss = 21919 + INTEGER(IntKi), PARAMETER :: RBRAYss = 21920 + INTEGER(IntKi), PARAMETER :: RBRAZss = 21921 - ! Interface Accelerations: + ! The maximum number of output channels which can be output by the code. + ! INTEGER(IntKi), PARAMETER :: MaxOutPts = 21921 - INTEGER(IntKi), PARAMETER :: IntfTAXss = 21403 - INTEGER(IntKi), PARAMETER :: IntfTAYss = 21404 - INTEGER(IntKi), PARAMETER :: IntfTAZss = 21405 - INTEGER(IntKi), PARAMETER :: IntfRAXss = 21406 - INTEGER(IntKi), PARAMETER :: IntfRAYss = 21407 - INTEGER(IntKi), PARAMETER :: IntfRAZss = 21408 - - ! Modal Parameters: - - INTEGER(IntKi), PARAMETER :: SSqm01 = 21409 - INTEGER(IntKi), PARAMETER :: SSqm02 = 21410 - INTEGER(IntKi), PARAMETER :: SSqm03 = 21411 - INTEGER(IntKi), PARAMETER :: SSqm04 = 21412 - INTEGER(IntKi), PARAMETER :: SSqm05 = 21413 - INTEGER(IntKi), PARAMETER :: SSqm06 = 21414 - INTEGER(IntKi), PARAMETER :: SSqm07 = 21415 - INTEGER(IntKi), PARAMETER :: SSqm08 = 21416 - INTEGER(IntKi), PARAMETER :: SSqm09 = 21417 - INTEGER(IntKi), PARAMETER :: SSqm10 = 21418 - INTEGER(IntKi), PARAMETER :: SSqm11 = 21419 - INTEGER(IntKi), PARAMETER :: SSqm12 = 21420 - INTEGER(IntKi), PARAMETER :: SSqm13 = 21421 - INTEGER(IntKi), PARAMETER :: SSqm14 = 21422 - INTEGER(IntKi), PARAMETER :: SSqm15 = 21423 - INTEGER(IntKi), PARAMETER :: SSqm16 = 21424 - INTEGER(IntKi), PARAMETER :: SSqm17 = 21425 - INTEGER(IntKi), PARAMETER :: SSqm18 = 21426 - INTEGER(IntKi), PARAMETER :: SSqm19 = 21427 - INTEGER(IntKi), PARAMETER :: SSqm20 = 21428 - INTEGER(IntKi), PARAMETER :: SSqm21 = 21429 - INTEGER(IntKi), PARAMETER :: SSqm22 = 21430 - INTEGER(IntKi), PARAMETER :: SSqm23 = 21431 - INTEGER(IntKi), PARAMETER :: SSqm24 = 21432 - INTEGER(IntKi), PARAMETER :: SSqm25 = 21433 - INTEGER(IntKi), PARAMETER :: SSqm26 = 21434 - INTEGER(IntKi), PARAMETER :: SSqm27 = 21435 - INTEGER(IntKi), PARAMETER :: SSqm28 = 21436 - INTEGER(IntKi), PARAMETER :: SSqm29 = 21437 - INTEGER(IntKi), PARAMETER :: SSqm30 = 21438 - INTEGER(IntKi), PARAMETER :: SSqm31 = 21439 - INTEGER(IntKi), PARAMETER :: SSqm32 = 21440 - INTEGER(IntKi), PARAMETER :: SSqm33 = 21441 - INTEGER(IntKi), PARAMETER :: SSqm34 = 21442 - INTEGER(IntKi), PARAMETER :: SSqm35 = 21443 - INTEGER(IntKi), PARAMETER :: SSqm36 = 21444 - INTEGER(IntKi), PARAMETER :: SSqm37 = 21445 - INTEGER(IntKi), PARAMETER :: SSqm38 = 21446 - INTEGER(IntKi), PARAMETER :: SSqm39 = 21447 - INTEGER(IntKi), PARAMETER :: SSqm40 = 21448 - INTEGER(IntKi), PARAMETER :: SSqm41 = 21449 - INTEGER(IntKi), PARAMETER :: SSqm42 = 21450 - INTEGER(IntKi), PARAMETER :: SSqm43 = 21451 - INTEGER(IntKi), PARAMETER :: SSqm44 = 21452 - INTEGER(IntKi), PARAMETER :: SSqm45 = 21453 - INTEGER(IntKi), PARAMETER :: SSqm46 = 21454 - INTEGER(IntKi), PARAMETER :: SSqm47 = 21455 - INTEGER(IntKi), PARAMETER :: SSqm48 = 21456 - INTEGER(IntKi), PARAMETER :: SSqm49 = 21457 - INTEGER(IntKi), PARAMETER :: SSqm50 = 21458 - INTEGER(IntKi), PARAMETER :: SSqm51 = 21459 - INTEGER(IntKi), PARAMETER :: SSqm52 = 21460 - INTEGER(IntKi), PARAMETER :: SSqm53 = 21461 - INTEGER(IntKi), PARAMETER :: SSqm54 = 21462 - INTEGER(IntKi), PARAMETER :: SSqm55 = 21463 - INTEGER(IntKi), PARAMETER :: SSqm56 = 21464 - INTEGER(IntKi), PARAMETER :: SSqm57 = 21465 - INTEGER(IntKi), PARAMETER :: SSqm58 = 21466 - INTEGER(IntKi), PARAMETER :: SSqm59 = 21467 - INTEGER(IntKi), PARAMETER :: SSqm60 = 21468 - INTEGER(IntKi), PARAMETER :: SSqm61 = 21469 - INTEGER(IntKi), PARAMETER :: SSqm62 = 21470 - INTEGER(IntKi), PARAMETER :: SSqm63 = 21471 - INTEGER(IntKi), PARAMETER :: SSqm64 = 21472 - INTEGER(IntKi), PARAMETER :: SSqm65 = 21473 - INTEGER(IntKi), PARAMETER :: SSqm66 = 21474 - INTEGER(IntKi), PARAMETER :: SSqm67 = 21475 - INTEGER(IntKi), PARAMETER :: SSqm68 = 21476 - INTEGER(IntKi), PARAMETER :: SSqm69 = 21477 - INTEGER(IntKi), PARAMETER :: SSqm70 = 21478 - INTEGER(IntKi), PARAMETER :: SSqm71 = 21479 - INTEGER(IntKi), PARAMETER :: SSqm72 = 21480 - INTEGER(IntKi), PARAMETER :: SSqm73 = 21481 - INTEGER(IntKi), PARAMETER :: SSqm74 = 21482 - INTEGER(IntKi), PARAMETER :: SSqm75 = 21483 - INTEGER(IntKi), PARAMETER :: SSqm76 = 21484 - INTEGER(IntKi), PARAMETER :: SSqm77 = 21485 - INTEGER(IntKi), PARAMETER :: SSqm78 = 21486 - INTEGER(IntKi), PARAMETER :: SSqm79 = 21487 - INTEGER(IntKi), PARAMETER :: SSqm80 = 21488 - INTEGER(IntKi), PARAMETER :: SSqm81 = 21489 - INTEGER(IntKi), PARAMETER :: SSqm82 = 21490 - INTEGER(IntKi), PARAMETER :: SSqm83 = 21491 - INTEGER(IntKi), PARAMETER :: SSqm84 = 21492 - INTEGER(IntKi), PARAMETER :: SSqm85 = 21493 - INTEGER(IntKi), PARAMETER :: SSqm86 = 21494 - INTEGER(IntKi), PARAMETER :: SSqm87 = 21495 - INTEGER(IntKi), PARAMETER :: SSqm88 = 21496 - INTEGER(IntKi), PARAMETER :: SSqm89 = 21497 - INTEGER(IntKi), PARAMETER :: SSqm90 = 21498 - INTEGER(IntKi), PARAMETER :: SSqm91 = 21499 - INTEGER(IntKi), PARAMETER :: SSqm92 = 21500 - INTEGER(IntKi), PARAMETER :: SSqm93 = 21501 - INTEGER(IntKi), PARAMETER :: SSqm94 = 21502 - INTEGER(IntKi), PARAMETER :: SSqm95 = 21503 - INTEGER(IntKi), PARAMETER :: SSqm96 = 21504 - INTEGER(IntKi), PARAMETER :: SSqm97 = 21505 - INTEGER(IntKi), PARAMETER :: SSqm98 = 21506 - INTEGER(IntKi), PARAMETER :: SSqm99 = 21507 - INTEGER(IntKi), PARAMETER :: SSqmd01 = 21508 - INTEGER(IntKi), PARAMETER :: SSqmd02 = 21509 - INTEGER(IntKi), PARAMETER :: SSqmd03 = 21510 - INTEGER(IntKi), PARAMETER :: SSqmd04 = 21511 - INTEGER(IntKi), PARAMETER :: SSqmd05 = 21512 - INTEGER(IntKi), PARAMETER :: SSqmd06 = 21513 - INTEGER(IntKi), PARAMETER :: SSqmd07 = 21514 - INTEGER(IntKi), PARAMETER :: SSqmd08 = 21515 - INTEGER(IntKi), PARAMETER :: SSqmd09 = 21516 - INTEGER(IntKi), PARAMETER :: SSqmd10 = 21517 - INTEGER(IntKi), PARAMETER :: SSqmd11 = 21518 - INTEGER(IntKi), PARAMETER :: SSqmd12 = 21519 - INTEGER(IntKi), PARAMETER :: SSqmd13 = 21520 - INTEGER(IntKi), PARAMETER :: SSqmd14 = 21521 - INTEGER(IntKi), PARAMETER :: SSqmd15 = 21522 - INTEGER(IntKi), PARAMETER :: SSqmd16 = 21523 - INTEGER(IntKi), PARAMETER :: SSqmd17 = 21524 - INTEGER(IntKi), PARAMETER :: SSqmd18 = 21525 - INTEGER(IntKi), PARAMETER :: SSqmd19 = 21526 - INTEGER(IntKi), PARAMETER :: SSqmd20 = 21527 - INTEGER(IntKi), PARAMETER :: SSqmd21 = 21528 - INTEGER(IntKi), PARAMETER :: SSqmd22 = 21529 - INTEGER(IntKi), PARAMETER :: SSqmd23 = 21530 - INTEGER(IntKi), PARAMETER :: SSqmd24 = 21531 - INTEGER(IntKi), PARAMETER :: SSqmd25 = 21532 - INTEGER(IntKi), PARAMETER :: SSqmd26 = 21533 - INTEGER(IntKi), PARAMETER :: SSqmd27 = 21534 - INTEGER(IntKi), PARAMETER :: SSqmd28 = 21535 - INTEGER(IntKi), PARAMETER :: SSqmd29 = 21536 - INTEGER(IntKi), PARAMETER :: SSqmd30 = 21537 - INTEGER(IntKi), PARAMETER :: SSqmd31 = 21538 - INTEGER(IntKi), PARAMETER :: SSqmd32 = 21539 - INTEGER(IntKi), PARAMETER :: SSqmd33 = 21540 - INTEGER(IntKi), PARAMETER :: SSqmd34 = 21541 - INTEGER(IntKi), PARAMETER :: SSqmd35 = 21542 - INTEGER(IntKi), PARAMETER :: SSqmd36 = 21543 - INTEGER(IntKi), PARAMETER :: SSqmd37 = 21544 - INTEGER(IntKi), PARAMETER :: SSqmd38 = 21545 - INTEGER(IntKi), PARAMETER :: SSqmd39 = 21546 - INTEGER(IntKi), PARAMETER :: SSqmd40 = 21547 - INTEGER(IntKi), PARAMETER :: SSqmd41 = 21548 - INTEGER(IntKi), PARAMETER :: SSqmd42 = 21549 - INTEGER(IntKi), PARAMETER :: SSqmd43 = 21550 - INTEGER(IntKi), PARAMETER :: SSqmd44 = 21551 - INTEGER(IntKi), PARAMETER :: SSqmd45 = 21552 - INTEGER(IntKi), PARAMETER :: SSqmd46 = 21553 - INTEGER(IntKi), PARAMETER :: SSqmd47 = 21554 - INTEGER(IntKi), PARAMETER :: SSqmd48 = 21555 - INTEGER(IntKi), PARAMETER :: SSqmd49 = 21556 - INTEGER(IntKi), PARAMETER :: SSqmd50 = 21557 - INTEGER(IntKi), PARAMETER :: SSqmd51 = 21558 - INTEGER(IntKi), PARAMETER :: SSqmd52 = 21559 - INTEGER(IntKi), PARAMETER :: SSqmd53 = 21560 - INTEGER(IntKi), PARAMETER :: SSqmd54 = 21561 - INTEGER(IntKi), PARAMETER :: SSqmd55 = 21562 - INTEGER(IntKi), PARAMETER :: SSqmd56 = 21563 - INTEGER(IntKi), PARAMETER :: SSqmd57 = 21564 - INTEGER(IntKi), PARAMETER :: SSqmd58 = 21565 - INTEGER(IntKi), PARAMETER :: SSqmd59 = 21566 - INTEGER(IntKi), PARAMETER :: SSqmd60 = 21567 - INTEGER(IntKi), PARAMETER :: SSqmd61 = 21568 - INTEGER(IntKi), PARAMETER :: SSqmd62 = 21569 - INTEGER(IntKi), PARAMETER :: SSqmd63 = 21570 - INTEGER(IntKi), PARAMETER :: SSqmd64 = 21571 - INTEGER(IntKi), PARAMETER :: SSqmd65 = 21572 - INTEGER(IntKi), PARAMETER :: SSqmd66 = 21573 - INTEGER(IntKi), PARAMETER :: SSqmd67 = 21574 - INTEGER(IntKi), PARAMETER :: SSqmd68 = 21575 - INTEGER(IntKi), PARAMETER :: SSqmd69 = 21576 - INTEGER(IntKi), PARAMETER :: SSqmd70 = 21577 - INTEGER(IntKi), PARAMETER :: SSqmd71 = 21578 - INTEGER(IntKi), PARAMETER :: SSqmd72 = 21579 - INTEGER(IntKi), PARAMETER :: SSqmd73 = 21580 - INTEGER(IntKi), PARAMETER :: SSqmd74 = 21581 - INTEGER(IntKi), PARAMETER :: SSqmd75 = 21582 - INTEGER(IntKi), PARAMETER :: SSqmd76 = 21583 - INTEGER(IntKi), PARAMETER :: SSqmd77 = 21584 - INTEGER(IntKi), PARAMETER :: SSqmd78 = 21585 - INTEGER(IntKi), PARAMETER :: SSqmd79 = 21586 - INTEGER(IntKi), PARAMETER :: SSqmd80 = 21587 - INTEGER(IntKi), PARAMETER :: SSqmd81 = 21588 - INTEGER(IntKi), PARAMETER :: SSqmd82 = 21589 - INTEGER(IntKi), PARAMETER :: SSqmd83 = 21590 - INTEGER(IntKi), PARAMETER :: SSqmd84 = 21591 - INTEGER(IntKi), PARAMETER :: SSqmd85 = 21592 - INTEGER(IntKi), PARAMETER :: SSqmd86 = 21593 - INTEGER(IntKi), PARAMETER :: SSqmd87 = 21594 - INTEGER(IntKi), PARAMETER :: SSqmd88 = 21595 - INTEGER(IntKi), PARAMETER :: SSqmd89 = 21596 - INTEGER(IntKi), PARAMETER :: SSqmd90 = 21597 - INTEGER(IntKi), PARAMETER :: SSqmd91 = 21598 - INTEGER(IntKi), PARAMETER :: SSqmd92 = 21599 - INTEGER(IntKi), PARAMETER :: SSqmd93 = 21600 - INTEGER(IntKi), PARAMETER :: SSqmd94 = 21601 - INTEGER(IntKi), PARAMETER :: SSqmd95 = 21602 - INTEGER(IntKi), PARAMETER :: SSqmd96 = 21603 - INTEGER(IntKi), PARAMETER :: SSqmd97 = 21604 - INTEGER(IntKi), PARAMETER :: SSqmd98 = 21605 - INTEGER(IntKi), PARAMETER :: SSqmd99 = 21606 - INTEGER(IntKi), PARAMETER :: SSqmdd01 = 21607 - INTEGER(IntKi), PARAMETER :: SSqmdd02 = 21608 - INTEGER(IntKi), PARAMETER :: SSqmdd03 = 21609 - INTEGER(IntKi), PARAMETER :: SSqmdd04 = 21610 - INTEGER(IntKi), PARAMETER :: SSqmdd05 = 21611 - INTEGER(IntKi), PARAMETER :: SSqmdd06 = 21612 - INTEGER(IntKi), PARAMETER :: SSqmdd07 = 21613 - INTEGER(IntKi), PARAMETER :: SSqmdd08 = 21614 - INTEGER(IntKi), PARAMETER :: SSqmdd09 = 21615 - INTEGER(IntKi), PARAMETER :: SSqmdd10 = 21616 - INTEGER(IntKi), PARAMETER :: SSqmdd11 = 21617 - INTEGER(IntKi), PARAMETER :: SSqmdd12 = 21618 - INTEGER(IntKi), PARAMETER :: SSqmdd13 = 21619 - INTEGER(IntKi), PARAMETER :: SSqmdd14 = 21620 - INTEGER(IntKi), PARAMETER :: SSqmdd15 = 21621 - INTEGER(IntKi), PARAMETER :: SSqmdd16 = 21622 - INTEGER(IntKi), PARAMETER :: SSqmdd17 = 21623 - INTEGER(IntKi), PARAMETER :: SSqmdd18 = 21624 - INTEGER(IntKi), PARAMETER :: SSqmdd19 = 21625 - INTEGER(IntKi), PARAMETER :: SSqmdd20 = 21626 - INTEGER(IntKi), PARAMETER :: SSqmdd21 = 21627 - INTEGER(IntKi), PARAMETER :: SSqmdd22 = 21628 - INTEGER(IntKi), PARAMETER :: SSqmdd23 = 21629 - INTEGER(IntKi), PARAMETER :: SSqmdd24 = 21630 - INTEGER(IntKi), PARAMETER :: SSqmdd25 = 21631 - INTEGER(IntKi), PARAMETER :: SSqmdd26 = 21632 - INTEGER(IntKi), PARAMETER :: SSqmdd27 = 21633 - INTEGER(IntKi), PARAMETER :: SSqmdd28 = 21634 - INTEGER(IntKi), PARAMETER :: SSqmdd29 = 21635 - INTEGER(IntKi), PARAMETER :: SSqmdd30 = 21636 - INTEGER(IntKi), PARAMETER :: SSqmdd31 = 21637 - INTEGER(IntKi), PARAMETER :: SSqmdd32 = 21638 - INTEGER(IntKi), PARAMETER :: SSqmdd33 = 21639 - INTEGER(IntKi), PARAMETER :: SSqmdd34 = 21640 - INTEGER(IntKi), PARAMETER :: SSqmdd35 = 21641 - INTEGER(IntKi), PARAMETER :: SSqmdd36 = 21642 - INTEGER(IntKi), PARAMETER :: SSqmdd37 = 21643 - INTEGER(IntKi), PARAMETER :: SSqmdd38 = 21644 - INTEGER(IntKi), PARAMETER :: SSqmdd39 = 21645 - INTEGER(IntKi), PARAMETER :: SSqmdd40 = 21646 - INTEGER(IntKi), PARAMETER :: SSqmdd41 = 21647 - INTEGER(IntKi), PARAMETER :: SSqmdd42 = 21648 - INTEGER(IntKi), PARAMETER :: SSqmdd43 = 21649 - INTEGER(IntKi), PARAMETER :: SSqmdd44 = 21650 - INTEGER(IntKi), PARAMETER :: SSqmdd45 = 21651 - INTEGER(IntKi), PARAMETER :: SSqmdd46 = 21652 - INTEGER(IntKi), PARAMETER :: SSqmdd47 = 21653 - INTEGER(IntKi), PARAMETER :: SSqmdd48 = 21654 - INTEGER(IntKi), PARAMETER :: SSqmdd49 = 21655 - INTEGER(IntKi), PARAMETER :: SSqmdd50 = 21656 - INTEGER(IntKi), PARAMETER :: SSqmdd51 = 21657 - INTEGER(IntKi), PARAMETER :: SSqmdd52 = 21658 - INTEGER(IntKi), PARAMETER :: SSqmdd53 = 21659 - INTEGER(IntKi), PARAMETER :: SSqmdd54 = 21660 - INTEGER(IntKi), PARAMETER :: SSqmdd55 = 21661 - INTEGER(IntKi), PARAMETER :: SSqmdd56 = 21662 - INTEGER(IntKi), PARAMETER :: SSqmdd57 = 21663 - INTEGER(IntKi), PARAMETER :: SSqmdd58 = 21664 - INTEGER(IntKi), PARAMETER :: SSqmdd59 = 21665 - INTEGER(IntKi), PARAMETER :: SSqmdd60 = 21666 - INTEGER(IntKi), PARAMETER :: SSqmdd61 = 21667 - INTEGER(IntKi), PARAMETER :: SSqmdd62 = 21668 - INTEGER(IntKi), PARAMETER :: SSqmdd63 = 21669 - INTEGER(IntKi), PARAMETER :: SSqmdd64 = 21670 - INTEGER(IntKi), PARAMETER :: SSqmdd65 = 21671 - INTEGER(IntKi), PARAMETER :: SSqmdd66 = 21672 - INTEGER(IntKi), PARAMETER :: SSqmdd67 = 21673 - INTEGER(IntKi), PARAMETER :: SSqmdd68 = 21674 - INTEGER(IntKi), PARAMETER :: SSqmdd69 = 21675 - INTEGER(IntKi), PARAMETER :: SSqmdd70 = 21676 - INTEGER(IntKi), PARAMETER :: SSqmdd71 = 21677 - INTEGER(IntKi), PARAMETER :: SSqmdd72 = 21678 - INTEGER(IntKi), PARAMETER :: SSqmdd73 = 21679 - INTEGER(IntKi), PARAMETER :: SSqmdd74 = 21680 - INTEGER(IntKi), PARAMETER :: SSqmdd75 = 21681 - INTEGER(IntKi), PARAMETER :: SSqmdd76 = 21682 - INTEGER(IntKi), PARAMETER :: SSqmdd77 = 21683 - INTEGER(IntKi), PARAMETER :: SSqmdd78 = 21684 - INTEGER(IntKi), PARAMETER :: SSqmdd79 = 21685 - INTEGER(IntKi), PARAMETER :: SSqmdd80 = 21686 - INTEGER(IntKi), PARAMETER :: SSqmdd81 = 21687 - INTEGER(IntKi), PARAMETER :: SSqmdd82 = 21688 - INTEGER(IntKi), PARAMETER :: SSqmdd83 = 21689 - INTEGER(IntKi), PARAMETER :: SSqmdd84 = 21690 - INTEGER(IntKi), PARAMETER :: SSqmdd85 = 21691 - INTEGER(IntKi), PARAMETER :: SSqmdd86 = 21692 - INTEGER(IntKi), PARAMETER :: SSqmdd87 = 21693 - INTEGER(IntKi), PARAMETER :: SSqmdd88 = 21694 - INTEGER(IntKi), PARAMETER :: SSqmdd89 = 21695 - INTEGER(IntKi), PARAMETER :: SSqmdd90 = 21696 - INTEGER(IntKi), PARAMETER :: SSqmdd91 = 21697 - INTEGER(IntKi), PARAMETER :: SSqmdd92 = 21698 - INTEGER(IntKi), PARAMETER :: SSqmdd93 = 21699 - INTEGER(IntKi), PARAMETER :: SSqmdd94 = 21700 - INTEGER(IntKi), PARAMETER :: SSqmdd95 = 21701 - INTEGER(IntKi), PARAMETER :: SSqmdd96 = 21702 - INTEGER(IntKi), PARAMETER :: SSqmdd97 = 21703 - INTEGER(IntKi), PARAMETER :: SSqmdd98 = 21704 - INTEGER(IntKi), PARAMETER :: SSqmdd99 = 21705 - - - ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER :: MaxOutPts = 21705 - - - INTEGER(IntKi), PARAMETER ::MNfmKe(6,9,99) = reshape((/ & + INTEGER(IntKi), PARAMETER :: MNfmKe(6,9,99) = reshape((/ & M01N1FKxe, M01N1FKye, M01N1FKze, M01N1MKxe, M01N1MKye, M01N1MKze, M01N2FKxe, M01N2FKye, M01N2FKze, M01N2MKxe, M01N2MKye, M01N2MKze, & M01N3FKxe, M01N3FKye, M01N3FKze, M01N3MKxe, M01N3MKye, M01N3MKze, M01N4FKxe, M01N4FKye, M01N4FKze, M01N4MKxe, M01N4MKye, M01N4MKze, & M01N5FKxe, M01N5FKye, M01N5FKze, M01N5MKxe, M01N5MKye, M01N5MKze, M01N6FKxe, M01N6FKye, M01N6FKze, M01N6MKxe, M01N6MKye, M01N6MKze, & @@ -22207,9 +22413,10 @@ module SubDyn_Output_Params M99N5FKxe, M99N5FKye, M99N5FKze, M99N5MKxe, M99N5MKye, M99N5MKze, M99N6FKxe, M99N6FKye, M99N6FKze, M99N6MKxe, M99N6MKye, M99N6MKze, & M99N7FKxe, M99N7FKye, M99N7FKze, M99N7MKxe, M99N7MKye, M99N7MKze, M99N8FKxe, M99N8FKye, M99N8FKze, M99N8MKxe, M99N8MKye, M99N8MKze, & M99N9FKxe, M99N9FKye, M99N9FKze, M99N9MKxe, M99N9MKye, M99N9MKze/),(/6,9,99/)) - - - INTEGER(IntKi), PARAMETER ::MNfmMe(6,9,99) = reshape((/ & + + + + INTEGER(IntKi), PARAMETER :: MNfmMe(6,9,99) = reshape((/ & M01N1FMxe, M01N1FMye, M01N1FMze, M01N1MMxe, M01N1MMye, M01N1MMze, M01N2FMxe, M01N2FMye, M01N2FMze, M01N2MMxe, M01N2MMye, M01N2MMze, & M01N3FMxe, M01N3FMye, M01N3FMze, M01N3MMxe, M01N3MMye, M01N3MMze, M01N4FMxe, M01N4FMye, M01N4FMze, M01N4MMxe, M01N4MMye, M01N4MMze, & M01N5FMxe, M01N5FMye, M01N5FMze, M01N5MMxe, M01N5MMye, M01N5MMze, M01N6FMxe, M01N6FMye, M01N6FMze, M01N6MMxe, M01N6MMye, M01N6MMze, & @@ -22656,235 +22863,237 @@ module SubDyn_Output_Params M99N5FMxe, M99N5FMye, M99N5FMze, M99N5MMxe, M99N5MMye, M99N5MMze, M99N6FMxe, M99N6FMye, M99N6FMze, M99N6MMxe, M99N6MMye, M99N6MMze, & M99N7FMxe, M99N7FMye, M99N7FMze, M99N7MMxe, M99N7MMye, M99N7MMze, M99N8FMxe, M99N8FMye, M99N8FMze, M99N8MMxe, M99N8MMye, M99N8MMze, & M99N9FMxe, M99N9FMye, M99N9FMze, M99N9MMxe, M99N9MMye, M99N9MMze/),(/6,9,99/)) - - - INTEGER(IntKi), PARAMETER ::MNTDss(3,9,99) = reshape((/ & - M01N1TDxss,M01N1TDyss,M01N1TDzss,M01N2TDxss,M01N2TDyss,M01N2TDzss,M01N3TDxss,M01N3TDyss,M01N3TDzss,M01N4TDxss,M01N4TDyss,M01N4TDzss, & - M01N5TDxss,M01N5TDyss,M01N5TDzss,M01N6TDxss,M01N6TDyss,M01N6TDzss,M01N7TDxss,M01N7TDyss,M01N7TDzss,M01N8TDxss,M01N8TDyss,M01N8TDzss, & - M01N9TDxss,M01N9TDyss,M01N9TDzss,M02N1TDxss,M02N1TDyss,M02N1TDzss,M02N2TDxss,M02N2TDyss,M02N2TDzss,M02N3TDxss,M02N3TDyss,M02N3TDzss, & - M02N4TDxss,M02N4TDyss,M02N4TDzss,M02N5TDxss,M02N5TDyss,M02N5TDzss,M02N6TDxss,M02N6TDyss,M02N6TDzss,M02N7TDxss,M02N7TDyss,M02N7TDzss, & - M02N8TDxss,M02N8TDyss,M02N8TDzss,M02N9TDxss,M02N9TDyss,M02N9TDzss,M03N1TDxss,M03N1TDyss,M03N1TDzss,M03N2TDxss,M03N2TDyss,M03N2TDzss, & - M03N3TDxss,M03N3TDyss,M03N3TDzss,M03N4TDxss,M03N4TDyss,M03N4TDzss,M03N5TDxss,M03N5TDyss,M03N5TDzss,M03N6TDxss,M03N6TDyss,M03N6TDzss, & - M03N7TDxss,M03N7TDyss,M03N7TDzss,M03N8TDxss,M03N8TDyss,M03N8TDzss,M03N9TDxss,M03N9TDyss,M03N9TDzss,M04N1TDxss,M04N1TDyss,M04N1TDzss, & - M04N2TDxss,M04N2TDyss,M04N2TDzss,M04N3TDxss,M04N3TDyss,M04N3TDzss,M04N4TDxss,M04N4TDyss,M04N4TDzss,M04N5TDxss,M04N5TDyss,M04N5TDzss, & - M04N6TDxss,M04N6TDyss,M04N6TDzss,M04N7TDxss,M04N7TDyss,M04N7TDzss,M04N8TDxss,M04N8TDyss,M04N8TDzss,M04N9TDxss,M04N9TDyss,M04N9TDzss, & - M05N1TDxss,M05N1TDyss,M05N1TDzss,M05N2TDxss,M05N2TDyss,M05N2TDzss,M05N3TDxss,M05N3TDyss,M05N3TDzss,M05N4TDxss,M05N4TDyss,M05N4TDzss, & - M05N5TDxss,M05N5TDyss,M05N5TDzss,M05N6TDxss,M05N6TDyss,M05N6TDzss,M05N7TDxss,M05N7TDyss,M05N7TDzss,M05N8TDxss,M05N8TDyss,M05N8TDzss, & - M05N9TDxss,M05N9TDyss,M05N9TDzss,M06N1TDxss,M06N1TDyss,M06N1TDzss,M06N2TDxss,M06N2TDyss,M06N2TDzss,M06N3TDxss,M06N3TDyss,M06N3TDzss, & - M06N4TDxss,M06N4TDyss,M06N4TDzss,M06N5TDxss,M06N5TDyss,M06N5TDzss,M06N6TDxss,M06N6TDyss,M06N6TDzss,M06N7TDxss,M06N7TDyss,M06N7TDzss, & - M06N8TDxss,M06N8TDyss,M06N8TDzss,M06N9TDxss,M06N9TDyss,M06N9TDzss,M07N1TDxss,M07N1TDyss,M07N1TDzss,M07N2TDxss,M07N2TDyss,M07N2TDzss, & - M07N3TDxss,M07N3TDyss,M07N3TDzss,M07N4TDxss,M07N4TDyss,M07N4TDzss,M07N5TDxss,M07N5TDyss,M07N5TDzss,M07N6TDxss,M07N6TDyss,M07N6TDzss, & - M07N7TDxss,M07N7TDyss,M07N7TDzss,M07N8TDxss,M07N8TDyss,M07N8TDzss,M07N9TDxss,M07N9TDyss,M07N9TDzss,M08N1TDxss,M08N1TDyss,M08N1TDzss, & - M08N2TDxss,M08N2TDyss,M08N2TDzss,M08N3TDxss,M08N3TDyss,M08N3TDzss,M08N4TDxss,M08N4TDyss,M08N4TDzss,M08N5TDxss,M08N5TDyss,M08N5TDzss, & - M08N6TDxss,M08N6TDyss,M08N6TDzss,M08N7TDxss,M08N7TDyss,M08N7TDzss,M08N8TDxss,M08N8TDyss,M08N8TDzss,M08N9TDxss,M08N9TDyss,M08N9TDzss, & - M09N1TDxss,M09N1TDyss,M09N1TDzss,M09N2TDxss,M09N2TDyss,M09N2TDzss,M09N3TDxss,M09N3TDyss,M09N3TDzss,M09N4TDxss,M09N4TDyss,M09N4TDzss, & - M09N5TDxss,M09N5TDyss,M09N5TDzss,M09N6TDxss,M09N6TDyss,M09N6TDzss,M09N7TDxss,M09N7TDyss,M09N7TDzss,M09N8TDxss,M09N8TDyss,M09N8TDzss, & - M09N9TDxss,M09N9TDyss,M09N9TDzss,M10N1TDxss,M10N1TDyss,M10N1TDzss,M10N2TDxss,M10N2TDyss,M10N2TDzss,M10N3TDxss,M10N3TDyss,M10N3TDzss, & - M10N4TDxss,M10N4TDyss,M10N4TDzss,M10N5TDxss,M10N5TDyss,M10N5TDzss,M10N6TDxss,M10N6TDyss,M10N6TDzss,M10N7TDxss,M10N7TDyss,M10N7TDzss, & - M10N8TDxss,M10N8TDyss,M10N8TDzss,M10N9TDxss,M10N9TDyss,M10N9TDzss,M11N1TDxss,M11N1TDyss,M11N1TDzss,M11N2TDxss,M11N2TDyss,M11N2TDzss, & - M11N3TDxss,M11N3TDyss,M11N3TDzss,M11N4TDxss,M11N4TDyss,M11N4TDzss,M11N5TDxss,M11N5TDyss,M11N5TDzss,M11N6TDxss,M11N6TDyss,M11N6TDzss, & - M11N7TDxss,M11N7TDyss,M11N7TDzss,M11N8TDxss,M11N8TDyss,M11N8TDzss,M11N9TDxss,M11N9TDyss,M11N9TDzss,M12N1TDxss,M12N1TDyss,M12N1TDzss, & - M12N2TDxss,M12N2TDyss,M12N2TDzss,M12N3TDxss,M12N3TDyss,M12N3TDzss,M12N4TDxss,M12N4TDyss,M12N4TDzss,M12N5TDxss,M12N5TDyss,M12N5TDzss, & - M12N6TDxss,M12N6TDyss,M12N6TDzss,M12N7TDxss,M12N7TDyss,M12N7TDzss,M12N8TDxss,M12N8TDyss,M12N8TDzss,M12N9TDxss,M12N9TDyss,M12N9TDzss, & - M13N1TDxss,M13N1TDyss,M13N1TDzss,M13N2TDxss,M13N2TDyss,M13N2TDzss,M13N3TDxss,M13N3TDyss,M13N3TDzss,M13N4TDxss,M13N4TDyss,M13N4TDzss, & - M13N5TDxss,M13N5TDyss,M13N5TDzss,M13N6TDxss,M13N6TDyss,M13N6TDzss,M13N7TDxss,M13N7TDyss,M13N7TDzss,M13N8TDxss,M13N8TDyss,M13N8TDzss, & - M13N9TDxss,M13N9TDyss,M13N9TDzss,M14N1TDxss,M14N1TDyss,M14N1TDzss,M14N2TDxss,M14N2TDyss,M14N2TDzss,M14N3TDxss,M14N3TDyss,M14N3TDzss, & - M14N4TDxss,M14N4TDyss,M14N4TDzss,M14N5TDxss,M14N5TDyss,M14N5TDzss,M14N6TDxss,M14N6TDyss,M14N6TDzss,M14N7TDxss,M14N7TDyss,M14N7TDzss, & - M14N8TDxss,M14N8TDyss,M14N8TDzss,M14N9TDxss,M14N9TDyss,M14N9TDzss,M15N1TDxss,M15N1TDyss,M15N1TDzss,M15N2TDxss,M15N2TDyss,M15N2TDzss, & - M15N3TDxss,M15N3TDyss,M15N3TDzss,M15N4TDxss,M15N4TDyss,M15N4TDzss,M15N5TDxss,M15N5TDyss,M15N5TDzss,M15N6TDxss,M15N6TDyss,M15N6TDzss, & - M15N7TDxss,M15N7TDyss,M15N7TDzss,M15N8TDxss,M15N8TDyss,M15N8TDzss,M15N9TDxss,M15N9TDyss,M15N9TDzss,M16N1TDxss,M16N1TDyss,M16N1TDzss, & - M16N2TDxss,M16N2TDyss,M16N2TDzss,M16N3TDxss,M16N3TDyss,M16N3TDzss,M16N4TDxss,M16N4TDyss,M16N4TDzss,M16N5TDxss,M16N5TDyss,M16N5TDzss, & - M16N6TDxss,M16N6TDyss,M16N6TDzss,M16N7TDxss,M16N7TDyss,M16N7TDzss,M16N8TDxss,M16N8TDyss,M16N8TDzss,M16N9TDxss,M16N9TDyss,M16N9TDzss, & - M17N1TDxss,M17N1TDyss,M17N1TDzss,M17N2TDxss,M17N2TDyss,M17N2TDzss,M17N3TDxss,M17N3TDyss,M17N3TDzss,M17N4TDxss,M17N4TDyss,M17N4TDzss, & - M17N5TDxss,M17N5TDyss,M17N5TDzss,M17N6TDxss,M17N6TDyss,M17N6TDzss,M17N7TDxss,M17N7TDyss,M17N7TDzss,M17N8TDxss,M17N8TDyss,M17N8TDzss, & - M17N9TDxss,M17N9TDyss,M17N9TDzss,M18N1TDxss,M18N1TDyss,M18N1TDzss,M18N2TDxss,M18N2TDyss,M18N2TDzss,M18N3TDxss,M18N3TDyss,M18N3TDzss, & - M18N4TDxss,M18N4TDyss,M18N4TDzss,M18N5TDxss,M18N5TDyss,M18N5TDzss,M18N6TDxss,M18N6TDyss,M18N6TDzss,M18N7TDxss,M18N7TDyss,M18N7TDzss, & - M18N8TDxss,M18N8TDyss,M18N8TDzss,M18N9TDxss,M18N9TDyss,M18N9TDzss,M19N1TDxss,M19N1TDyss,M19N1TDzss,M19N2TDxss,M19N2TDyss,M19N2TDzss, & - M19N3TDxss,M19N3TDyss,M19N3TDzss,M19N4TDxss,M19N4TDyss,M19N4TDzss,M19N5TDxss,M19N5TDyss,M19N5TDzss,M19N6TDxss,M19N6TDyss,M19N6TDzss, & - M19N7TDxss,M19N7TDyss,M19N7TDzss,M19N8TDxss,M19N8TDyss,M19N8TDzss,M19N9TDxss,M19N9TDyss,M19N9TDzss,M20N1TDxss,M20N1TDyss,M20N1TDzss, & - M20N2TDxss,M20N2TDyss,M20N2TDzss,M20N3TDxss,M20N3TDyss,M20N3TDzss,M20N4TDxss,M20N4TDyss,M20N4TDzss,M20N5TDxss,M20N5TDyss,M20N5TDzss, & - M20N6TDxss,M20N6TDyss,M20N6TDzss,M20N7TDxss,M20N7TDyss,M20N7TDzss,M20N8TDxss,M20N8TDyss,M20N8TDzss,M20N9TDxss,M20N9TDyss,M20N9TDzss, & - M21N1TDxss,M21N1TDyss,M21N1TDzss,M21N2TDxss,M21N2TDyss,M21N2TDzss,M21N3TDxss,M21N3TDyss,M21N3TDzss,M21N4TDxss,M21N4TDyss,M21N4TDzss, & - M21N5TDxss,M21N5TDyss,M21N5TDzss,M21N6TDxss,M21N6TDyss,M21N6TDzss,M21N7TDxss,M21N7TDyss,M21N7TDzss,M21N8TDxss,M21N8TDyss,M21N8TDzss, & - M21N9TDxss,M21N9TDyss,M21N9TDzss,M22N1TDxss,M22N1TDyss,M22N1TDzss,M22N2TDxss,M22N2TDyss,M22N2TDzss,M22N3TDxss,M22N3TDyss,M22N3TDzss, & - M22N4TDxss,M22N4TDyss,M22N4TDzss,M22N5TDxss,M22N5TDyss,M22N5TDzss,M22N6TDxss,M22N6TDyss,M22N6TDzss,M22N7TDxss,M22N7TDyss,M22N7TDzss, & - M22N8TDxss,M22N8TDyss,M22N8TDzss,M22N9TDxss,M22N9TDyss,M22N9TDzss,M23N1TDxss,M23N1TDyss,M23N1TDzss,M23N2TDxss,M23N2TDyss,M23N2TDzss, & - M23N3TDxss,M23N3TDyss,M23N3TDzss,M23N4TDxss,M23N4TDyss,M23N4TDzss,M23N5TDxss,M23N5TDyss,M23N5TDzss,M23N6TDxss,M23N6TDyss,M23N6TDzss, & - M23N7TDxss,M23N7TDyss,M23N7TDzss,M23N8TDxss,M23N8TDyss,M23N8TDzss,M23N9TDxss,M23N9TDyss,M23N9TDzss,M24N1TDxss,M24N1TDyss,M24N1TDzss, & - M24N2TDxss,M24N2TDyss,M24N2TDzss,M24N3TDxss,M24N3TDyss,M24N3TDzss,M24N4TDxss,M24N4TDyss,M24N4TDzss,M24N5TDxss,M24N5TDyss,M24N5TDzss, & - M24N6TDxss,M24N6TDyss,M24N6TDzss,M24N7TDxss,M24N7TDyss,M24N7TDzss,M24N8TDxss,M24N8TDyss,M24N8TDzss,M24N9TDxss,M24N9TDyss,M24N9TDzss, & - M25N1TDxss,M25N1TDyss,M25N1TDzss,M25N2TDxss,M25N2TDyss,M25N2TDzss,M25N3TDxss,M25N3TDyss,M25N3TDzss,M25N4TDxss,M25N4TDyss,M25N4TDzss, & - M25N5TDxss,M25N5TDyss,M25N5TDzss,M25N6TDxss,M25N6TDyss,M25N6TDzss,M25N7TDxss,M25N7TDyss,M25N7TDzss,M25N8TDxss,M25N8TDyss,M25N8TDzss, & - M25N9TDxss,M25N9TDyss,M25N9TDzss,M26N1TDxss,M26N1TDyss,M26N1TDzss,M26N2TDxss,M26N2TDyss,M26N2TDzss,M26N3TDxss,M26N3TDyss,M26N3TDzss, & - M26N4TDxss,M26N4TDyss,M26N4TDzss,M26N5TDxss,M26N5TDyss,M26N5TDzss,M26N6TDxss,M26N6TDyss,M26N6TDzss,M26N7TDxss,M26N7TDyss,M26N7TDzss, & - M26N8TDxss,M26N8TDyss,M26N8TDzss,M26N9TDxss,M26N9TDyss,M26N9TDzss,M27N1TDxss,M27N1TDyss,M27N1TDzss,M27N2TDxss,M27N2TDyss,M27N2TDzss, & - M27N3TDxss,M27N3TDyss,M27N3TDzss,M27N4TDxss,M27N4TDyss,M27N4TDzss,M27N5TDxss,M27N5TDyss,M27N5TDzss,M27N6TDxss,M27N6TDyss,M27N6TDzss, & - M27N7TDxss,M27N7TDyss,M27N7TDzss,M27N8TDxss,M27N8TDyss,M27N8TDzss,M27N9TDxss,M27N9TDyss,M27N9TDzss,M28N1TDxss,M28N1TDyss,M28N1TDzss, & - M28N2TDxss,M28N2TDyss,M28N2TDzss,M28N3TDxss,M28N3TDyss,M28N3TDzss,M28N4TDxss,M28N4TDyss,M28N4TDzss,M28N5TDxss,M28N5TDyss,M28N5TDzss, & - M28N6TDxss,M28N6TDyss,M28N6TDzss,M28N7TDxss,M28N7TDyss,M28N7TDzss,M28N8TDxss,M28N8TDyss,M28N8TDzss,M28N9TDxss,M28N9TDyss,M28N9TDzss, & - M29N1TDxss,M29N1TDyss,M29N1TDzss,M29N2TDxss,M29N2TDyss,M29N2TDzss,M29N3TDxss,M29N3TDyss,M29N3TDzss,M29N4TDxss,M29N4TDyss,M29N4TDzss, & - M29N5TDxss,M29N5TDyss,M29N5TDzss,M29N6TDxss,M29N6TDyss,M29N6TDzss,M29N7TDxss,M29N7TDyss,M29N7TDzss,M29N8TDxss,M29N8TDyss,M29N8TDzss, & - M29N9TDxss,M29N9TDyss,M29N9TDzss,M30N1TDxss,M30N1TDyss,M30N1TDzss,M30N2TDxss,M30N2TDyss,M30N2TDzss,M30N3TDxss,M30N3TDyss,M30N3TDzss, & - M30N4TDxss,M30N4TDyss,M30N4TDzss,M30N5TDxss,M30N5TDyss,M30N5TDzss,M30N6TDxss,M30N6TDyss,M30N6TDzss,M30N7TDxss,M30N7TDyss,M30N7TDzss, & - M30N8TDxss,M30N8TDyss,M30N8TDzss,M30N9TDxss,M30N9TDyss,M30N9TDzss,M31N1TDxss,M31N1TDyss,M31N1TDzss,M31N2TDxss,M31N2TDyss,M31N2TDzss, & - M31N3TDxss,M31N3TDyss,M31N3TDzss,M31N4TDxss,M31N4TDyss,M31N4TDzss,M31N5TDxss,M31N5TDyss,M31N5TDzss,M31N6TDxss,M31N6TDyss,M31N6TDzss, & - M31N7TDxss,M31N7TDyss,M31N7TDzss,M31N8TDxss,M31N8TDyss,M31N8TDzss,M31N9TDxss,M31N9TDyss,M31N9TDzss,M32N1TDxss,M32N1TDyss,M32N1TDzss, & - M32N2TDxss,M32N2TDyss,M32N2TDzss,M32N3TDxss,M32N3TDyss,M32N3TDzss,M32N4TDxss,M32N4TDyss,M32N4TDzss,M32N5TDxss,M32N5TDyss,M32N5TDzss, & - M32N6TDxss,M32N6TDyss,M32N6TDzss,M32N7TDxss,M32N7TDyss,M32N7TDzss,M32N8TDxss,M32N8TDyss,M32N8TDzss,M32N9TDxss,M32N9TDyss,M32N9TDzss, & - M33N1TDxss,M33N1TDyss,M33N1TDzss,M33N2TDxss,M33N2TDyss,M33N2TDzss,M33N3TDxss,M33N3TDyss,M33N3TDzss,M33N4TDxss,M33N4TDyss,M33N4TDzss, & - M33N5TDxss,M33N5TDyss,M33N5TDzss,M33N6TDxss,M33N6TDyss,M33N6TDzss,M33N7TDxss,M33N7TDyss,M33N7TDzss,M33N8TDxss,M33N8TDyss,M33N8TDzss, & - M33N9TDxss,M33N9TDyss,M33N9TDzss,M34N1TDxss,M34N1TDyss,M34N1TDzss,M34N2TDxss,M34N2TDyss,M34N2TDzss,M34N3TDxss,M34N3TDyss,M34N3TDzss, & - M34N4TDxss,M34N4TDyss,M34N4TDzss,M34N5TDxss,M34N5TDyss,M34N5TDzss,M34N6TDxss,M34N6TDyss,M34N6TDzss,M34N7TDxss,M34N7TDyss,M34N7TDzss, & - M34N8TDxss,M34N8TDyss,M34N8TDzss,M34N9TDxss,M34N9TDyss,M34N9TDzss,M35N1TDxss,M35N1TDyss,M35N1TDzss,M35N2TDxss,M35N2TDyss,M35N2TDzss, & - M35N3TDxss,M35N3TDyss,M35N3TDzss,M35N4TDxss,M35N4TDyss,M35N4TDzss,M35N5TDxss,M35N5TDyss,M35N5TDzss,M35N6TDxss,M35N6TDyss,M35N6TDzss, & - M35N7TDxss,M35N7TDyss,M35N7TDzss,M35N8TDxss,M35N8TDyss,M35N8TDzss,M35N9TDxss,M35N9TDyss,M35N9TDzss,M36N1TDxss,M36N1TDyss,M36N1TDzss, & - M36N2TDxss,M36N2TDyss,M36N2TDzss,M36N3TDxss,M36N3TDyss,M36N3TDzss,M36N4TDxss,M36N4TDyss,M36N4TDzss,M36N5TDxss,M36N5TDyss,M36N5TDzss, & - M36N6TDxss,M36N6TDyss,M36N6TDzss,M36N7TDxss,M36N7TDyss,M36N7TDzss,M36N8TDxss,M36N8TDyss,M36N8TDzss,M36N9TDxss,M36N9TDyss,M36N9TDzss, & - M37N1TDxss,M37N1TDyss,M37N1TDzss,M37N2TDxss,M37N2TDyss,M37N2TDzss,M37N3TDxss,M37N3TDyss,M37N3TDzss,M37N4TDxss,M37N4TDyss,M37N4TDzss, & - M37N5TDxss,M37N5TDyss,M37N5TDzss,M37N6TDxss,M37N6TDyss,M37N6TDzss,M37N7TDxss,M37N7TDyss,M37N7TDzss,M37N8TDxss,M37N8TDyss,M37N8TDzss, & - M37N9TDxss,M37N9TDyss,M37N9TDzss,M38N1TDxss,M38N1TDyss,M38N1TDzss,M38N2TDxss,M38N2TDyss,M38N2TDzss,M38N3TDxss,M38N3TDyss,M38N3TDzss, & - M38N4TDxss,M38N4TDyss,M38N4TDzss,M38N5TDxss,M38N5TDyss,M38N5TDzss,M38N6TDxss,M38N6TDyss,M38N6TDzss,M38N7TDxss,M38N7TDyss,M38N7TDzss, & - M38N8TDxss,M38N8TDyss,M38N8TDzss,M38N9TDxss,M38N9TDyss,M38N9TDzss,M39N1TDxss,M39N1TDyss,M39N1TDzss,M39N2TDxss,M39N2TDyss,M39N2TDzss, & - M39N3TDxss,M39N3TDyss,M39N3TDzss,M39N4TDxss,M39N4TDyss,M39N4TDzss,M39N5TDxss,M39N5TDyss,M39N5TDzss,M39N6TDxss,M39N6TDyss,M39N6TDzss, & - M39N7TDxss,M39N7TDyss,M39N7TDzss,M39N8TDxss,M39N8TDyss,M39N8TDzss,M39N9TDxss,M39N9TDyss,M39N9TDzss,M40N1TDxss,M40N1TDyss,M40N1TDzss, & - M40N2TDxss,M40N2TDyss,M40N2TDzss,M40N3TDxss,M40N3TDyss,M40N3TDzss,M40N4TDxss,M40N4TDyss,M40N4TDzss,M40N5TDxss,M40N5TDyss,M40N5TDzss, & - M40N6TDxss,M40N6TDyss,M40N6TDzss,M40N7TDxss,M40N7TDyss,M40N7TDzss,M40N8TDxss,M40N8TDyss,M40N8TDzss,M40N9TDxss,M40N9TDyss,M40N9TDzss, & - M41N1TDxss,M41N1TDyss,M41N1TDzss,M41N2TDxss,M41N2TDyss,M41N2TDzss,M41N3TDxss,M41N3TDyss,M41N3TDzss,M41N4TDxss,M41N4TDyss,M41N4TDzss, & - M41N5TDxss,M41N5TDyss,M41N5TDzss,M41N6TDxss,M41N6TDyss,M41N6TDzss,M41N7TDxss,M41N7TDyss,M41N7TDzss,M41N8TDxss,M41N8TDyss,M41N8TDzss, & - M41N9TDxss,M41N9TDyss,M41N9TDzss,M42N1TDxss,M42N1TDyss,M42N1TDzss,M42N2TDxss,M42N2TDyss,M42N2TDzss,M42N3TDxss,M42N3TDyss,M42N3TDzss, & - M42N4TDxss,M42N4TDyss,M42N4TDzss,M42N5TDxss,M42N5TDyss,M42N5TDzss,M42N6TDxss,M42N6TDyss,M42N6TDzss,M42N7TDxss,M42N7TDyss,M42N7TDzss, & - M42N8TDxss,M42N8TDyss,M42N8TDzss,M42N9TDxss,M42N9TDyss,M42N9TDzss,M43N1TDxss,M43N1TDyss,M43N1TDzss,M43N2TDxss,M43N2TDyss,M43N2TDzss, & - M43N3TDxss,M43N3TDyss,M43N3TDzss,M43N4TDxss,M43N4TDyss,M43N4TDzss,M43N5TDxss,M43N5TDyss,M43N5TDzss,M43N6TDxss,M43N6TDyss,M43N6TDzss, & - M43N7TDxss,M43N7TDyss,M43N7TDzss,M43N8TDxss,M43N8TDyss,M43N8TDzss,M43N9TDxss,M43N9TDyss,M43N9TDzss,M44N1TDxss,M44N1TDyss,M44N1TDzss, & - M44N2TDxss,M44N2TDyss,M44N2TDzss,M44N3TDxss,M44N3TDyss,M44N3TDzss,M44N4TDxss,M44N4TDyss,M44N4TDzss,M44N5TDxss,M44N5TDyss,M44N5TDzss, & - M44N6TDxss,M44N6TDyss,M44N6TDzss,M44N7TDxss,M44N7TDyss,M44N7TDzss,M44N8TDxss,M44N8TDyss,M44N8TDzss,M44N9TDxss,M44N9TDyss,M44N9TDzss, & - M45N1TDxss,M45N1TDyss,M45N1TDzss,M45N2TDxss,M45N2TDyss,M45N2TDzss,M45N3TDxss,M45N3TDyss,M45N3TDzss,M45N4TDxss,M45N4TDyss,M45N4TDzss, & - M45N5TDxss,M45N5TDyss,M45N5TDzss,M45N6TDxss,M45N6TDyss,M45N6TDzss,M45N7TDxss,M45N7TDyss,M45N7TDzss,M45N8TDxss,M45N8TDyss,M45N8TDzss, & - M45N9TDxss,M45N9TDyss,M45N9TDzss,M46N1TDxss,M46N1TDyss,M46N1TDzss,M46N2TDxss,M46N2TDyss,M46N2TDzss,M46N3TDxss,M46N3TDyss,M46N3TDzss, & - M46N4TDxss,M46N4TDyss,M46N4TDzss,M46N5TDxss,M46N5TDyss,M46N5TDzss,M46N6TDxss,M46N6TDyss,M46N6TDzss,M46N7TDxss,M46N7TDyss,M46N7TDzss, & - M46N8TDxss,M46N8TDyss,M46N8TDzss,M46N9TDxss,M46N9TDyss,M46N9TDzss,M47N1TDxss,M47N1TDyss,M47N1TDzss,M47N2TDxss,M47N2TDyss,M47N2TDzss, & - M47N3TDxss,M47N3TDyss,M47N3TDzss,M47N4TDxss,M47N4TDyss,M47N4TDzss,M47N5TDxss,M47N5TDyss,M47N5TDzss,M47N6TDxss,M47N6TDyss,M47N6TDzss, & - M47N7TDxss,M47N7TDyss,M47N7TDzss,M47N8TDxss,M47N8TDyss,M47N8TDzss,M47N9TDxss,M47N9TDyss,M47N9TDzss,M48N1TDxss,M48N1TDyss,M48N1TDzss, & - M48N2TDxss,M48N2TDyss,M48N2TDzss,M48N3TDxss,M48N3TDyss,M48N3TDzss,M48N4TDxss,M48N4TDyss,M48N4TDzss,M48N5TDxss,M48N5TDyss,M48N5TDzss, & - M48N6TDxss,M48N6TDyss,M48N6TDzss,M48N7TDxss,M48N7TDyss,M48N7TDzss,M48N8TDxss,M48N8TDyss,M48N8TDzss,M48N9TDxss,M48N9TDyss,M48N9TDzss, & - M49N1TDxss,M49N1TDyss,M49N1TDzss,M49N2TDxss,M49N2TDyss,M49N2TDzss,M49N3TDxss,M49N3TDyss,M49N3TDzss,M49N4TDxss,M49N4TDyss,M49N4TDzss, & - M49N5TDxss,M49N5TDyss,M49N5TDzss,M49N6TDxss,M49N6TDyss,M49N6TDzss,M49N7TDxss,M49N7TDyss,M49N7TDzss,M49N8TDxss,M49N8TDyss,M49N8TDzss, & - M49N9TDxss,M49N9TDyss,M49N9TDzss,M50N1TDxss,M50N1TDyss,M50N1TDzss,M50N2TDxss,M50N2TDyss,M50N2TDzss,M50N3TDxss,M50N3TDyss,M50N3TDzss, & - M50N4TDxss,M50N4TDyss,M50N4TDzss,M50N5TDxss,M50N5TDyss,M50N5TDzss,M50N6TDxss,M50N6TDyss,M50N6TDzss,M50N7TDxss,M50N7TDyss,M50N7TDzss, & - M50N8TDxss,M50N8TDyss,M50N8TDzss,M50N9TDxss,M50N9TDyss,M50N9TDzss,M51N1TDxss,M51N1TDyss,M51N1TDzss,M51N2TDxss,M51N2TDyss,M51N2TDzss, & - M51N3TDxss,M51N3TDyss,M51N3TDzss,M51N4TDxss,M51N4TDyss,M51N4TDzss,M51N5TDxss,M51N5TDyss,M51N5TDzss,M51N6TDxss,M51N6TDyss,M51N6TDzss, & - M51N7TDxss,M51N7TDyss,M51N7TDzss,M51N8TDxss,M51N8TDyss,M51N8TDzss,M51N9TDxss,M51N9TDyss,M51N9TDzss,M52N1TDxss,M52N1TDyss,M52N1TDzss, & - M52N2TDxss,M52N2TDyss,M52N2TDzss,M52N3TDxss,M52N3TDyss,M52N3TDzss,M52N4TDxss,M52N4TDyss,M52N4TDzss,M52N5TDxss,M52N5TDyss,M52N5TDzss, & - M52N6TDxss,M52N6TDyss,M52N6TDzss,M52N7TDxss,M52N7TDyss,M52N7TDzss,M52N8TDxss,M52N8TDyss,M52N8TDzss,M52N9TDxss,M52N9TDyss,M52N9TDzss, & - M53N1TDxss,M53N1TDyss,M53N1TDzss,M53N2TDxss,M53N2TDyss,M53N2TDzss,M53N3TDxss,M53N3TDyss,M53N3TDzss,M53N4TDxss,M53N4TDyss,M53N4TDzss, & - M53N5TDxss,M53N5TDyss,M53N5TDzss,M53N6TDxss,M53N6TDyss,M53N6TDzss,M53N7TDxss,M53N7TDyss,M53N7TDzss,M53N8TDxss,M53N8TDyss,M53N8TDzss, & - M53N9TDxss,M53N9TDyss,M53N9TDzss,M54N1TDxss,M54N1TDyss,M54N1TDzss,M54N2TDxss,M54N2TDyss,M54N2TDzss,M54N3TDxss,M54N3TDyss,M54N3TDzss, & - M54N4TDxss,M54N4TDyss,M54N4TDzss,M54N5TDxss,M54N5TDyss,M54N5TDzss,M54N6TDxss,M54N6TDyss,M54N6TDzss,M54N7TDxss,M54N7TDyss,M54N7TDzss, & - M54N8TDxss,M54N8TDyss,M54N8TDzss,M54N9TDxss,M54N9TDyss,M54N9TDzss,M55N1TDxss,M55N1TDyss,M55N1TDzss,M55N2TDxss,M55N2TDyss,M55N2TDzss, & - M55N3TDxss,M55N3TDyss,M55N3TDzss,M55N4TDxss,M55N4TDyss,M55N4TDzss,M55N5TDxss,M55N5TDyss,M55N5TDzss,M55N6TDxss,M55N6TDyss,M55N6TDzss, & - M55N7TDxss,M55N7TDyss,M55N7TDzss,M55N8TDxss,M55N8TDyss,M55N8TDzss,M55N9TDxss,M55N9TDyss,M55N9TDzss,M56N1TDxss,M56N1TDyss,M56N1TDzss, & - M56N2TDxss,M56N2TDyss,M56N2TDzss,M56N3TDxss,M56N3TDyss,M56N3TDzss,M56N4TDxss,M56N4TDyss,M56N4TDzss,M56N5TDxss,M56N5TDyss,M56N5TDzss, & - M56N6TDxss,M56N6TDyss,M56N6TDzss,M56N7TDxss,M56N7TDyss,M56N7TDzss,M56N8TDxss,M56N8TDyss,M56N8TDzss,M56N9TDxss,M56N9TDyss,M56N9TDzss, & - M57N1TDxss,M57N1TDyss,M57N1TDzss,M57N2TDxss,M57N2TDyss,M57N2TDzss,M57N3TDxss,M57N3TDyss,M57N3TDzss,M57N4TDxss,M57N4TDyss,M57N4TDzss, & - M57N5TDxss,M57N5TDyss,M57N5TDzss,M57N6TDxss,M57N6TDyss,M57N6TDzss,M57N7TDxss,M57N7TDyss,M57N7TDzss,M57N8TDxss,M57N8TDyss,M57N8TDzss, & - M57N9TDxss,M57N9TDyss,M57N9TDzss,M58N1TDxss,M58N1TDyss,M58N1TDzss,M58N2TDxss,M58N2TDyss,M58N2TDzss,M58N3TDxss,M58N3TDyss,M58N3TDzss, & - M58N4TDxss,M58N4TDyss,M58N4TDzss,M58N5TDxss,M58N5TDyss,M58N5TDzss,M58N6TDxss,M58N6TDyss,M58N6TDzss,M58N7TDxss,M58N7TDyss,M58N7TDzss, & - M58N8TDxss,M58N8TDyss,M58N8TDzss,M58N9TDxss,M58N9TDyss,M58N9TDzss,M59N1TDxss,M59N1TDyss,M59N1TDzss,M59N2TDxss,M59N2TDyss,M59N2TDzss, & - M59N3TDxss,M59N3TDyss,M59N3TDzss,M59N4TDxss,M59N4TDyss,M59N4TDzss,M59N5TDxss,M59N5TDyss,M59N5TDzss,M59N6TDxss,M59N6TDyss,M59N6TDzss, & - M59N7TDxss,M59N7TDyss,M59N7TDzss,M59N8TDxss,M59N8TDyss,M59N8TDzss,M59N9TDxss,M59N9TDyss,M59N9TDzss,M60N1TDxss,M60N1TDyss,M60N1TDzss, & - M60N2TDxss,M60N2TDyss,M60N2TDzss,M60N3TDxss,M60N3TDyss,M60N3TDzss,M60N4TDxss,M60N4TDyss,M60N4TDzss,M60N5TDxss,M60N5TDyss,M60N5TDzss, & - M60N6TDxss,M60N6TDyss,M60N6TDzss,M60N7TDxss,M60N7TDyss,M60N7TDzss,M60N8TDxss,M60N8TDyss,M60N8TDzss,M60N9TDxss,M60N9TDyss,M60N9TDzss, & - M61N1TDxss,M61N1TDyss,M61N1TDzss,M61N2TDxss,M61N2TDyss,M61N2TDzss,M61N3TDxss,M61N3TDyss,M61N3TDzss,M61N4TDxss,M61N4TDyss,M61N4TDzss, & - M61N5TDxss,M61N5TDyss,M61N5TDzss,M61N6TDxss,M61N6TDyss,M61N6TDzss,M61N7TDxss,M61N7TDyss,M61N7TDzss,M61N8TDxss,M61N8TDyss,M61N8TDzss, & - M61N9TDxss,M61N9TDyss,M61N9TDzss,M62N1TDxss,M62N1TDyss,M62N1TDzss,M62N2TDxss,M62N2TDyss,M62N2TDzss,M62N3TDxss,M62N3TDyss,M62N3TDzss, & - M62N4TDxss,M62N4TDyss,M62N4TDzss,M62N5TDxss,M62N5TDyss,M62N5TDzss,M62N6TDxss,M62N6TDyss,M62N6TDzss,M62N7TDxss,M62N7TDyss,M62N7TDzss, & - M62N8TDxss,M62N8TDyss,M62N8TDzss,M62N9TDxss,M62N9TDyss,M62N9TDzss,M63N1TDxss,M63N1TDyss,M63N1TDzss,M63N2TDxss,M63N2TDyss,M63N2TDzss, & - M63N3TDxss,M63N3TDyss,M63N3TDzss,M63N4TDxss,M63N4TDyss,M63N4TDzss,M63N5TDxss,M63N5TDyss,M63N5TDzss,M63N6TDxss,M63N6TDyss,M63N6TDzss, & - M63N7TDxss,M63N7TDyss,M63N7TDzss,M63N8TDxss,M63N8TDyss,M63N8TDzss,M63N9TDxss,M63N9TDyss,M63N9TDzss,M64N1TDxss,M64N1TDyss,M64N1TDzss, & - M64N2TDxss,M64N2TDyss,M64N2TDzss,M64N3TDxss,M64N3TDyss,M64N3TDzss,M64N4TDxss,M64N4TDyss,M64N4TDzss,M64N5TDxss,M64N5TDyss,M64N5TDzss, & - M64N6TDxss,M64N6TDyss,M64N6TDzss,M64N7TDxss,M64N7TDyss,M64N7TDzss,M64N8TDxss,M64N8TDyss,M64N8TDzss,M64N9TDxss,M64N9TDyss,M64N9TDzss, & - M65N1TDxss,M65N1TDyss,M65N1TDzss,M65N2TDxss,M65N2TDyss,M65N2TDzss,M65N3TDxss,M65N3TDyss,M65N3TDzss,M65N4TDxss,M65N4TDyss,M65N4TDzss, & - M65N5TDxss,M65N5TDyss,M65N5TDzss,M65N6TDxss,M65N6TDyss,M65N6TDzss,M65N7TDxss,M65N7TDyss,M65N7TDzss,M65N8TDxss,M65N8TDyss,M65N8TDzss, & - M65N9TDxss,M65N9TDyss,M65N9TDzss,M66N1TDxss,M66N1TDyss,M66N1TDzss,M66N2TDxss,M66N2TDyss,M66N2TDzss,M66N3TDxss,M66N3TDyss,M66N3TDzss, & - M66N4TDxss,M66N4TDyss,M66N4TDzss,M66N5TDxss,M66N5TDyss,M66N5TDzss,M66N6TDxss,M66N6TDyss,M66N6TDzss,M66N7TDxss,M66N7TDyss,M66N7TDzss, & - M66N8TDxss,M66N8TDyss,M66N8TDzss,M66N9TDxss,M66N9TDyss,M66N9TDzss,M67N1TDxss,M67N1TDyss,M67N1TDzss,M67N2TDxss,M67N2TDyss,M67N2TDzss, & - M67N3TDxss,M67N3TDyss,M67N3TDzss,M67N4TDxss,M67N4TDyss,M67N4TDzss,M67N5TDxss,M67N5TDyss,M67N5TDzss,M67N6TDxss,M67N6TDyss,M67N6TDzss, & - M67N7TDxss,M67N7TDyss,M67N7TDzss,M67N8TDxss,M67N8TDyss,M67N8TDzss,M67N9TDxss,M67N9TDyss,M67N9TDzss,M68N1TDxss,M68N1TDyss,M68N1TDzss, & - M68N2TDxss,M68N2TDyss,M68N2TDzss,M68N3TDxss,M68N3TDyss,M68N3TDzss,M68N4TDxss,M68N4TDyss,M68N4TDzss,M68N5TDxss,M68N5TDyss,M68N5TDzss, & - M68N6TDxss,M68N6TDyss,M68N6TDzss,M68N7TDxss,M68N7TDyss,M68N7TDzss,M68N8TDxss,M68N8TDyss,M68N8TDzss,M68N9TDxss,M68N9TDyss,M68N9TDzss, & - M69N1TDxss,M69N1TDyss,M69N1TDzss,M69N2TDxss,M69N2TDyss,M69N2TDzss,M69N3TDxss,M69N3TDyss,M69N3TDzss,M69N4TDxss,M69N4TDyss,M69N4TDzss, & - M69N5TDxss,M69N5TDyss,M69N5TDzss,M69N6TDxss,M69N6TDyss,M69N6TDzss,M69N7TDxss,M69N7TDyss,M69N7TDzss,M69N8TDxss,M69N8TDyss,M69N8TDzss, & - M69N9TDxss,M69N9TDyss,M69N9TDzss,M70N1TDxss,M70N1TDyss,M70N1TDzss,M70N2TDxss,M70N2TDyss,M70N2TDzss,M70N3TDxss,M70N3TDyss,M70N3TDzss, & - M70N4TDxss,M70N4TDyss,M70N4TDzss,M70N5TDxss,M70N5TDyss,M70N5TDzss,M70N6TDxss,M70N6TDyss,M70N6TDzss,M70N7TDxss,M70N7TDyss,M70N7TDzss, & - M70N8TDxss,M70N8TDyss,M70N8TDzss,M70N9TDxss,M70N9TDyss,M70N9TDzss,M71N1TDxss,M71N1TDyss,M71N1TDzss,M71N2TDxss,M71N2TDyss,M71N2TDzss, & - M71N3TDxss,M71N3TDyss,M71N3TDzss,M71N4TDxss,M71N4TDyss,M71N4TDzss,M71N5TDxss,M71N5TDyss,M71N5TDzss,M71N6TDxss,M71N6TDyss,M71N6TDzss, & - M71N7TDxss,M71N7TDyss,M71N7TDzss,M71N8TDxss,M71N8TDyss,M71N8TDzss,M71N9TDxss,M71N9TDyss,M71N9TDzss,M72N1TDxss,M72N1TDyss,M72N1TDzss, & - M72N2TDxss,M72N2TDyss,M72N2TDzss,M72N3TDxss,M72N3TDyss,M72N3TDzss,M72N4TDxss,M72N4TDyss,M72N4TDzss,M72N5TDxss,M72N5TDyss,M72N5TDzss, & - M72N6TDxss,M72N6TDyss,M72N6TDzss,M72N7TDxss,M72N7TDyss,M72N7TDzss,M72N8TDxss,M72N8TDyss,M72N8TDzss,M72N9TDxss,M72N9TDyss,M72N9TDzss, & - M73N1TDxss,M73N1TDyss,M73N1TDzss,M73N2TDxss,M73N2TDyss,M73N2TDzss,M73N3TDxss,M73N3TDyss,M73N3TDzss,M73N4TDxss,M73N4TDyss,M73N4TDzss, & - M73N5TDxss,M73N5TDyss,M73N5TDzss,M73N6TDxss,M73N6TDyss,M73N6TDzss,M73N7TDxss,M73N7TDyss,M73N7TDzss,M73N8TDxss,M73N8TDyss,M73N8TDzss, & - M73N9TDxss,M73N9TDyss,M73N9TDzss,M74N1TDxss,M74N1TDyss,M74N1TDzss,M74N2TDxss,M74N2TDyss,M74N2TDzss,M74N3TDxss,M74N3TDyss,M74N3TDzss, & - M74N4TDxss,M74N4TDyss,M74N4TDzss,M74N5TDxss,M74N5TDyss,M74N5TDzss,M74N6TDxss,M74N6TDyss,M74N6TDzss,M74N7TDxss,M74N7TDyss,M74N7TDzss, & - M74N8TDxss,M74N8TDyss,M74N8TDzss,M74N9TDxss,M74N9TDyss,M74N9TDzss,M75N1TDxss,M75N1TDyss,M75N1TDzss,M75N2TDxss,M75N2TDyss,M75N2TDzss, & - M75N3TDxss,M75N3TDyss,M75N3TDzss,M75N4TDxss,M75N4TDyss,M75N4TDzss,M75N5TDxss,M75N5TDyss,M75N5TDzss,M75N6TDxss,M75N6TDyss,M75N6TDzss, & - M75N7TDxss,M75N7TDyss,M75N7TDzss,M75N8TDxss,M75N8TDyss,M75N8TDzss,M75N9TDxss,M75N9TDyss,M75N9TDzss,M76N1TDxss,M76N1TDyss,M76N1TDzss, & - M76N2TDxss,M76N2TDyss,M76N2TDzss,M76N3TDxss,M76N3TDyss,M76N3TDzss,M76N4TDxss,M76N4TDyss,M76N4TDzss,M76N5TDxss,M76N5TDyss,M76N5TDzss, & - M76N6TDxss,M76N6TDyss,M76N6TDzss,M76N7TDxss,M76N7TDyss,M76N7TDzss,M76N8TDxss,M76N8TDyss,M76N8TDzss,M76N9TDxss,M76N9TDyss,M76N9TDzss, & - M77N1TDxss,M77N1TDyss,M77N1TDzss,M77N2TDxss,M77N2TDyss,M77N2TDzss,M77N3TDxss,M77N3TDyss,M77N3TDzss,M77N4TDxss,M77N4TDyss,M77N4TDzss, & - M77N5TDxss,M77N5TDyss,M77N5TDzss,M77N6TDxss,M77N6TDyss,M77N6TDzss,M77N7TDxss,M77N7TDyss,M77N7TDzss,M77N8TDxss,M77N8TDyss,M77N8TDzss, & - M77N9TDxss,M77N9TDyss,M77N9TDzss,M78N1TDxss,M78N1TDyss,M78N1TDzss,M78N2TDxss,M78N2TDyss,M78N2TDzss,M78N3TDxss,M78N3TDyss,M78N3TDzss, & - M78N4TDxss,M78N4TDyss,M78N4TDzss,M78N5TDxss,M78N5TDyss,M78N5TDzss,M78N6TDxss,M78N6TDyss,M78N6TDzss,M78N7TDxss,M78N7TDyss,M78N7TDzss, & - M78N8TDxss,M78N8TDyss,M78N8TDzss,M78N9TDxss,M78N9TDyss,M78N9TDzss,M79N1TDxss,M79N1TDyss,M79N1TDzss,M79N2TDxss,M79N2TDyss,M79N2TDzss, & - M79N3TDxss,M79N3TDyss,M79N3TDzss,M79N4TDxss,M79N4TDyss,M79N4TDzss,M79N5TDxss,M79N5TDyss,M79N5TDzss,M79N6TDxss,M79N6TDyss,M79N6TDzss, & - M79N7TDxss,M79N7TDyss,M79N7TDzss,M79N8TDxss,M79N8TDyss,M79N8TDzss,M79N9TDxss,M79N9TDyss,M79N9TDzss,M80N1TDxss,M80N1TDyss,M80N1TDzss, & - M80N2TDxss,M80N2TDyss,M80N2TDzss,M80N3TDxss,M80N3TDyss,M80N3TDzss,M80N4TDxss,M80N4TDyss,M80N4TDzss,M80N5TDxss,M80N5TDyss,M80N5TDzss, & - M80N6TDxss,M80N6TDyss,M80N6TDzss,M80N7TDxss,M80N7TDyss,M80N7TDzss,M80N8TDxss,M80N8TDyss,M80N8TDzss,M80N9TDxss,M80N9TDyss,M80N9TDzss, & - M81N1TDxss,M81N1TDyss,M81N1TDzss,M81N2TDxss,M81N2TDyss,M81N2TDzss,M81N3TDxss,M81N3TDyss,M81N3TDzss,M81N4TDxss,M81N4TDyss,M81N4TDzss, & - M81N5TDxss,M81N5TDyss,M81N5TDzss,M81N6TDxss,M81N6TDyss,M81N6TDzss,M81N7TDxss,M81N7TDyss,M81N7TDzss,M81N8TDxss,M81N8TDyss,M81N8TDzss, & - M81N9TDxss,M81N9TDyss,M81N9TDzss,M82N1TDxss,M82N1TDyss,M82N1TDzss,M82N2TDxss,M82N2TDyss,M82N2TDzss,M82N3TDxss,M82N3TDyss,M82N3TDzss, & - M82N4TDxss,M82N4TDyss,M82N4TDzss,M82N5TDxss,M82N5TDyss,M82N5TDzss,M82N6TDxss,M82N6TDyss,M82N6TDzss,M82N7TDxss,M82N7TDyss,M82N7TDzss, & - M82N8TDxss,M82N8TDyss,M82N8TDzss,M82N9TDxss,M82N9TDyss,M82N9TDzss,M83N1TDxss,M83N1TDyss,M83N1TDzss,M83N2TDxss,M83N2TDyss,M83N2TDzss, & - M83N3TDxss,M83N3TDyss,M83N3TDzss,M83N4TDxss,M83N4TDyss,M83N4TDzss,M83N5TDxss,M83N5TDyss,M83N5TDzss,M83N6TDxss,M83N6TDyss,M83N6TDzss, & - M83N7TDxss,M83N7TDyss,M83N7TDzss,M83N8TDxss,M83N8TDyss,M83N8TDzss,M83N9TDxss,M83N9TDyss,M83N9TDzss,M84N1TDxss,M84N1TDyss,M84N1TDzss, & - M84N2TDxss,M84N2TDyss,M84N2TDzss,M84N3TDxss,M84N3TDyss,M84N3TDzss,M84N4TDxss,M84N4TDyss,M84N4TDzss,M84N5TDxss,M84N5TDyss,M84N5TDzss, & - M84N6TDxss,M84N6TDyss,M84N6TDzss,M84N7TDxss,M84N7TDyss,M84N7TDzss,M84N8TDxss,M84N8TDyss,M84N8TDzss,M84N9TDxss,M84N9TDyss,M84N9TDzss, & - M85N1TDxss,M85N1TDyss,M85N1TDzss,M85N2TDxss,M85N2TDyss,M85N2TDzss,M85N3TDxss,M85N3TDyss,M85N3TDzss,M85N4TDxss,M85N4TDyss,M85N4TDzss, & - M85N5TDxss,M85N5TDyss,M85N5TDzss,M85N6TDxss,M85N6TDyss,M85N6TDzss,M85N7TDxss,M85N7TDyss,M85N7TDzss,M85N8TDxss,M85N8TDyss,M85N8TDzss, & - M85N9TDxss,M85N9TDyss,M85N9TDzss,M86N1TDxss,M86N1TDyss,M86N1TDzss,M86N2TDxss,M86N2TDyss,M86N2TDzss,M86N3TDxss,M86N3TDyss,M86N3TDzss, & - M86N4TDxss,M86N4TDyss,M86N4TDzss,M86N5TDxss,M86N5TDyss,M86N5TDzss,M86N6TDxss,M86N6TDyss,M86N6TDzss,M86N7TDxss,M86N7TDyss,M86N7TDzss, & - M86N8TDxss,M86N8TDyss,M86N8TDzss,M86N9TDxss,M86N9TDyss,M86N9TDzss,M87N1TDxss,M87N1TDyss,M87N1TDzss,M87N2TDxss,M87N2TDyss,M87N2TDzss, & - M87N3TDxss,M87N3TDyss,M87N3TDzss,M87N4TDxss,M87N4TDyss,M87N4TDzss,M87N5TDxss,M87N5TDyss,M87N5TDzss,M87N6TDxss,M87N6TDyss,M87N6TDzss, & - M87N7TDxss,M87N7TDyss,M87N7TDzss,M87N8TDxss,M87N8TDyss,M87N8TDzss,M87N9TDxss,M87N9TDyss,M87N9TDzss,M88N1TDxss,M88N1TDyss,M88N1TDzss, & - M88N2TDxss,M88N2TDyss,M88N2TDzss,M88N3TDxss,M88N3TDyss,M88N3TDzss,M88N4TDxss,M88N4TDyss,M88N4TDzss,M88N5TDxss,M88N5TDyss,M88N5TDzss, & - M88N6TDxss,M88N6TDyss,M88N6TDzss,M88N7TDxss,M88N7TDyss,M88N7TDzss,M88N8TDxss,M88N8TDyss,M88N8TDzss,M88N9TDxss,M88N9TDyss,M88N9TDzss, & - M89N1TDxss,M89N1TDyss,M89N1TDzss,M89N2TDxss,M89N2TDyss,M89N2TDzss,M89N3TDxss,M89N3TDyss,M89N3TDzss,M89N4TDxss,M89N4TDyss,M89N4TDzss, & - M89N5TDxss,M89N5TDyss,M89N5TDzss,M89N6TDxss,M89N6TDyss,M89N6TDzss,M89N7TDxss,M89N7TDyss,M89N7TDzss,M89N8TDxss,M89N8TDyss,M89N8TDzss, & - M89N9TDxss,M89N9TDyss,M89N9TDzss,M90N1TDxss,M90N1TDyss,M90N1TDzss,M90N2TDxss,M90N2TDyss,M90N2TDzss,M90N3TDxss,M90N3TDyss,M90N3TDzss, & - M90N4TDxss,M90N4TDyss,M90N4TDzss,M90N5TDxss,M90N5TDyss,M90N5TDzss,M90N6TDxss,M90N6TDyss,M90N6TDzss,M90N7TDxss,M90N7TDyss,M90N7TDzss, & - M90N8TDxss,M90N8TDyss,M90N8TDzss,M90N9TDxss,M90N9TDyss,M90N9TDzss,M91N1TDxss,M91N1TDyss,M91N1TDzss,M91N2TDxss,M91N2TDyss,M91N2TDzss, & - M91N3TDxss,M91N3TDyss,M91N3TDzss,M91N4TDxss,M91N4TDyss,M91N4TDzss,M91N5TDxss,M91N5TDyss,M91N5TDzss,M91N6TDxss,M91N6TDyss,M91N6TDzss, & - M91N7TDxss,M91N7TDyss,M91N7TDzss,M91N8TDxss,M91N8TDyss,M91N8TDzss,M91N9TDxss,M91N9TDyss,M91N9TDzss,M92N1TDxss,M92N1TDyss,M92N1TDzss, & - M92N2TDxss,M92N2TDyss,M92N2TDzss,M92N3TDxss,M92N3TDyss,M92N3TDzss,M92N4TDxss,M92N4TDyss,M92N4TDzss,M92N5TDxss,M92N5TDyss,M92N5TDzss, & - M92N6TDxss,M92N6TDyss,M92N6TDzss,M92N7TDxss,M92N7TDyss,M92N7TDzss,M92N8TDxss,M92N8TDyss,M92N8TDzss,M92N9TDxss,M92N9TDyss,M92N9TDzss, & - M93N1TDxss,M93N1TDyss,M93N1TDzss,M93N2TDxss,M93N2TDyss,M93N2TDzss,M93N3TDxss,M93N3TDyss,M93N3TDzss,M93N4TDxss,M93N4TDyss,M93N4TDzss, & - M93N5TDxss,M93N5TDyss,M93N5TDzss,M93N6TDxss,M93N6TDyss,M93N6TDzss,M93N7TDxss,M93N7TDyss,M93N7TDzss,M93N8TDxss,M93N8TDyss,M93N8TDzss, & - M93N9TDxss,M93N9TDyss,M93N9TDzss,M94N1TDxss,M94N1TDyss,M94N1TDzss,M94N2TDxss,M94N2TDyss,M94N2TDzss,M94N3TDxss,M94N3TDyss,M94N3TDzss, & - M94N4TDxss,M94N4TDyss,M94N4TDzss,M94N5TDxss,M94N5TDyss,M94N5TDzss,M94N6TDxss,M94N6TDyss,M94N6TDzss,M94N7TDxss,M94N7TDyss,M94N7TDzss, & - M94N8TDxss,M94N8TDyss,M94N8TDzss,M94N9TDxss,M94N9TDyss,M94N9TDzss,M95N1TDxss,M95N1TDyss,M95N1TDzss,M95N2TDxss,M95N2TDyss,M95N2TDzss, & - M95N3TDxss,M95N3TDyss,M95N3TDzss,M95N4TDxss,M95N4TDyss,M95N4TDzss,M95N5TDxss,M95N5TDyss,M95N5TDzss,M95N6TDxss,M95N6TDyss,M95N6TDzss, & - M95N7TDxss,M95N7TDyss,M95N7TDzss,M95N8TDxss,M95N8TDyss,M95N8TDzss,M95N9TDxss,M95N9TDyss,M95N9TDzss,M96N1TDxss,M96N1TDyss,M96N1TDzss, & - M96N2TDxss,M96N2TDyss,M96N2TDzss,M96N3TDxss,M96N3TDyss,M96N3TDzss,M96N4TDxss,M96N4TDyss,M96N4TDzss,M96N5TDxss,M96N5TDyss,M96N5TDzss, & - M96N6TDxss,M96N6TDyss,M96N6TDzss,M96N7TDxss,M96N7TDyss,M96N7TDzss,M96N8TDxss,M96N8TDyss,M96N8TDzss,M96N9TDxss,M96N9TDyss,M96N9TDzss, & - M97N1TDxss,M97N1TDyss,M97N1TDzss,M97N2TDxss,M97N2TDyss,M97N2TDzss,M97N3TDxss,M97N3TDyss,M97N3TDzss,M97N4TDxss,M97N4TDyss,M97N4TDzss, & - M97N5TDxss,M97N5TDyss,M97N5TDzss,M97N6TDxss,M97N6TDyss,M97N6TDzss,M97N7TDxss,M97N7TDyss,M97N7TDzss,M97N8TDxss,M97N8TDyss,M97N8TDzss, & - M97N9TDxss,M97N9TDyss,M97N9TDzss,M98N1TDxss,M98N1TDyss,M98N1TDzss,M98N2TDxss,M98N2TDyss,M98N2TDzss,M98N3TDxss,M98N3TDyss,M98N3TDzss, & - M98N4TDxss,M98N4TDyss,M98N4TDzss,M98N5TDxss,M98N5TDyss,M98N5TDzss,M98N6TDxss,M98N6TDyss,M98N6TDzss,M98N7TDxss,M98N7TDyss,M98N7TDzss, & - M98N8TDxss,M98N8TDyss,M98N8TDzss,M98N9TDxss,M98N9TDyss,M98N9TDzss,M99N1TDxss,M99N1TDyss,M99N1TDzss,M99N2TDxss,M99N2TDyss,M99N2TDzss, & - M99N3TDxss,M99N3TDyss,M99N3TDzss,M99N4TDxss,M99N4TDyss,M99N4TDzss,M99N5TDxss,M99N5TDyss,M99N5TDzss,M99N6TDxss,M99N6TDyss,M99N6TDzss, & - M99N7TDxss,M99N7TDyss,M99N7TDzss,M99N8TDxss,M99N8TDyss,M99N8TDzss,M99N9TDxss,M99N9TDyss,M99N9TDzss/),(/3,9,99/)) - - - INTEGER(IntKi), PARAMETER ::MNRDe(3,9,99) = reshape((/ & + + + + INTEGER(IntKi), PARAMETER :: MNTDss(3,9,99) = reshape((/ & + M01N1TDxss, M01N1TDyss, M01N1TDzss, M01N2TDxss, M01N2TDyss, M01N2TDzss, M01N3TDxss, M01N3TDyss, M01N3TDzss, M01N4TDxss, M01N4TDyss, M01N4TDzss, & + M01N5TDxss, M01N5TDyss, M01N5TDzss, M01N6TDxss, M01N6TDyss, M01N6TDzss, M01N7TDxss, M01N7TDyss, M01N7TDzss, M01N8TDxss, M01N8TDyss, M01N8TDzss, & + M01N9TDxss, M01N9TDyss, M01N9TDzss, M02N1TDxss, M02N1TDyss, M02N1TDzss, M02N2TDxss, M02N2TDyss, M02N2TDzss, M02N3TDxss, M02N3TDyss, M02N3TDzss, & + M02N4TDxss, M02N4TDyss, M02N4TDzss, M02N5TDxss, M02N5TDyss, M02N5TDzss, M02N6TDxss, M02N6TDyss, M02N6TDzss, M02N7TDxss, M02N7TDyss, M02N7TDzss, & + M02N8TDxss, M02N8TDyss, M02N8TDzss, M02N9TDxss, M02N9TDyss, M02N9TDzss, M03N1TDxss, M03N1TDyss, M03N1TDzss, M03N2TDxss, M03N2TDyss, M03N2TDzss, & + M03N3TDxss, M03N3TDyss, M03N3TDzss, M03N4TDxss, M03N4TDyss, M03N4TDzss, M03N5TDxss, M03N5TDyss, M03N5TDzss, M03N6TDxss, M03N6TDyss, M03N6TDzss, & + M03N7TDxss, M03N7TDyss, M03N7TDzss, M03N8TDxss, M03N8TDyss, M03N8TDzss, M03N9TDxss, M03N9TDyss, M03N9TDzss, M04N1TDxss, M04N1TDyss, M04N1TDzss, & + M04N2TDxss, M04N2TDyss, M04N2TDzss, M04N3TDxss, M04N3TDyss, M04N3TDzss, M04N4TDxss, M04N4TDyss, M04N4TDzss, M04N5TDxss, M04N5TDyss, M04N5TDzss, & + M04N6TDxss, M04N6TDyss, M04N6TDzss, M04N7TDxss, M04N7TDyss, M04N7TDzss, M04N8TDxss, M04N8TDyss, M04N8TDzss, M04N9TDxss, M04N9TDyss, M04N9TDzss, & + M05N1TDxss, M05N1TDyss, M05N1TDzss, M05N2TDxss, M05N2TDyss, M05N2TDzss, M05N3TDxss, M05N3TDyss, M05N3TDzss, M05N4TDxss, M05N4TDyss, M05N4TDzss, & + M05N5TDxss, M05N5TDyss, M05N5TDzss, M05N6TDxss, M05N6TDyss, M05N6TDzss, M05N7TDxss, M05N7TDyss, M05N7TDzss, M05N8TDxss, M05N8TDyss, M05N8TDzss, & + M05N9TDxss, M05N9TDyss, M05N9TDzss, M06N1TDxss, M06N1TDyss, M06N1TDzss, M06N2TDxss, M06N2TDyss, M06N2TDzss, M06N3TDxss, M06N3TDyss, M06N3TDzss, & + M06N4TDxss, M06N4TDyss, M06N4TDzss, M06N5TDxss, M06N5TDyss, M06N5TDzss, M06N6TDxss, M06N6TDyss, M06N6TDzss, M06N7TDxss, M06N7TDyss, M06N7TDzss, & + M06N8TDxss, M06N8TDyss, M06N8TDzss, M06N9TDxss, M06N9TDyss, M06N9TDzss, M07N1TDxss, M07N1TDyss, M07N1TDzss, M07N2TDxss, M07N2TDyss, M07N2TDzss, & + M07N3TDxss, M07N3TDyss, M07N3TDzss, M07N4TDxss, M07N4TDyss, M07N4TDzss, M07N5TDxss, M07N5TDyss, M07N5TDzss, M07N6TDxss, M07N6TDyss, M07N6TDzss, & + M07N7TDxss, M07N7TDyss, M07N7TDzss, M07N8TDxss, M07N8TDyss, M07N8TDzss, M07N9TDxss, M07N9TDyss, M07N9TDzss, M08N1TDxss, M08N1TDyss, M08N1TDzss, & + M08N2TDxss, M08N2TDyss, M08N2TDzss, M08N3TDxss, M08N3TDyss, M08N3TDzss, M08N4TDxss, M08N4TDyss, M08N4TDzss, M08N5TDxss, M08N5TDyss, M08N5TDzss, & + M08N6TDxss, M08N6TDyss, M08N6TDzss, M08N7TDxss, M08N7TDyss, M08N7TDzss, M08N8TDxss, M08N8TDyss, M08N8TDzss, M08N9TDxss, M08N9TDyss, M08N9TDzss, & + M09N1TDxss, M09N1TDyss, M09N1TDzss, M09N2TDxss, M09N2TDyss, M09N2TDzss, M09N3TDxss, M09N3TDyss, M09N3TDzss, M09N4TDxss, M09N4TDyss, M09N4TDzss, & + M09N5TDxss, M09N5TDyss, M09N5TDzss, M09N6TDxss, M09N6TDyss, M09N6TDzss, M09N7TDxss, M09N7TDyss, M09N7TDzss, M09N8TDxss, M09N8TDyss, M09N8TDzss, & + M09N9TDxss, M09N9TDyss, M09N9TDzss, M10N1TDxss, M10N1TDyss, M10N1TDzss, M10N2TDxss, M10N2TDyss, M10N2TDzss, M10N3TDxss, M10N3TDyss, M10N3TDzss, & + M10N4TDxss, M10N4TDyss, M10N4TDzss, M10N5TDxss, M10N5TDyss, M10N5TDzss, M10N6TDxss, M10N6TDyss, M10N6TDzss, M10N7TDxss, M10N7TDyss, M10N7TDzss, & + M10N8TDxss, M10N8TDyss, M10N8TDzss, M10N9TDxss, M10N9TDyss, M10N9TDzss, M11N1TDxss, M11N1TDyss, M11N1TDzss, M11N2TDxss, M11N2TDyss, M11N2TDzss, & + M11N3TDxss, M11N3TDyss, M11N3TDzss, M11N4TDxss, M11N4TDyss, M11N4TDzss, M11N5TDxss, M11N5TDyss, M11N5TDzss, M11N6TDxss, M11N6TDyss, M11N6TDzss, & + M11N7TDxss, M11N7TDyss, M11N7TDzss, M11N8TDxss, M11N8TDyss, M11N8TDzss, M11N9TDxss, M11N9TDyss, M11N9TDzss, M12N1TDxss, M12N1TDyss, M12N1TDzss, & + M12N2TDxss, M12N2TDyss, M12N2TDzss, M12N3TDxss, M12N3TDyss, M12N3TDzss, M12N4TDxss, M12N4TDyss, M12N4TDzss, M12N5TDxss, M12N5TDyss, M12N5TDzss, & + M12N6TDxss, M12N6TDyss, M12N6TDzss, M12N7TDxss, M12N7TDyss, M12N7TDzss, M12N8TDxss, M12N8TDyss, M12N8TDzss, M12N9TDxss, M12N9TDyss, M12N9TDzss, & + M13N1TDxss, M13N1TDyss, M13N1TDzss, M13N2TDxss, M13N2TDyss, M13N2TDzss, M13N3TDxss, M13N3TDyss, M13N3TDzss, M13N4TDxss, M13N4TDyss, M13N4TDzss, & + M13N5TDxss, M13N5TDyss, M13N5TDzss, M13N6TDxss, M13N6TDyss, M13N6TDzss, M13N7TDxss, M13N7TDyss, M13N7TDzss, M13N8TDxss, M13N8TDyss, M13N8TDzss, & + M13N9TDxss, M13N9TDyss, M13N9TDzss, M14N1TDxss, M14N1TDyss, M14N1TDzss, M14N2TDxss, M14N2TDyss, M14N2TDzss, M14N3TDxss, M14N3TDyss, M14N3TDzss, & + M14N4TDxss, M14N4TDyss, M14N4TDzss, M14N5TDxss, M14N5TDyss, M14N5TDzss, M14N6TDxss, M14N6TDyss, M14N6TDzss, M14N7TDxss, M14N7TDyss, M14N7TDzss, & + M14N8TDxss, M14N8TDyss, M14N8TDzss, M14N9TDxss, M14N9TDyss, M14N9TDzss, M15N1TDxss, M15N1TDyss, M15N1TDzss, M15N2TDxss, M15N2TDyss, M15N2TDzss, & + M15N3TDxss, M15N3TDyss, M15N3TDzss, M15N4TDxss, M15N4TDyss, M15N4TDzss, M15N5TDxss, M15N5TDyss, M15N5TDzss, M15N6TDxss, M15N6TDyss, M15N6TDzss, & + M15N7TDxss, M15N7TDyss, M15N7TDzss, M15N8TDxss, M15N8TDyss, M15N8TDzss, M15N9TDxss, M15N9TDyss, M15N9TDzss, M16N1TDxss, M16N1TDyss, M16N1TDzss, & + M16N2TDxss, M16N2TDyss, M16N2TDzss, M16N3TDxss, M16N3TDyss, M16N3TDzss, M16N4TDxss, M16N4TDyss, M16N4TDzss, M16N5TDxss, M16N5TDyss, M16N5TDzss, & + M16N6TDxss, M16N6TDyss, M16N6TDzss, M16N7TDxss, M16N7TDyss, M16N7TDzss, M16N8TDxss, M16N8TDyss, M16N8TDzss, M16N9TDxss, M16N9TDyss, M16N9TDzss, & + M17N1TDxss, M17N1TDyss, M17N1TDzss, M17N2TDxss, M17N2TDyss, M17N2TDzss, M17N3TDxss, M17N3TDyss, M17N3TDzss, M17N4TDxss, M17N4TDyss, M17N4TDzss, & + M17N5TDxss, M17N5TDyss, M17N5TDzss, M17N6TDxss, M17N6TDyss, M17N6TDzss, M17N7TDxss, M17N7TDyss, M17N7TDzss, M17N8TDxss, M17N8TDyss, M17N8TDzss, & + M17N9TDxss, M17N9TDyss, M17N9TDzss, M18N1TDxss, M18N1TDyss, M18N1TDzss, M18N2TDxss, M18N2TDyss, M18N2TDzss, M18N3TDxss, M18N3TDyss, M18N3TDzss, & + M18N4TDxss, M18N4TDyss, M18N4TDzss, M18N5TDxss, M18N5TDyss, M18N5TDzss, M18N6TDxss, M18N6TDyss, M18N6TDzss, M18N7TDxss, M18N7TDyss, M18N7TDzss, & + M18N8TDxss, M18N8TDyss, M18N8TDzss, M18N9TDxss, M18N9TDyss, M18N9TDzss, M19N1TDxss, M19N1TDyss, M19N1TDzss, M19N2TDxss, M19N2TDyss, M19N2TDzss, & + M19N3TDxss, M19N3TDyss, M19N3TDzss, M19N4TDxss, M19N4TDyss, M19N4TDzss, M19N5TDxss, M19N5TDyss, M19N5TDzss, M19N6TDxss, M19N6TDyss, M19N6TDzss, & + M19N7TDxss, M19N7TDyss, M19N7TDzss, M19N8TDxss, M19N8TDyss, M19N8TDzss, M19N9TDxss, M19N9TDyss, M19N9TDzss, M20N1TDxss, M20N1TDyss, M20N1TDzss, & + M20N2TDxss, M20N2TDyss, M20N2TDzss, M20N3TDxss, M20N3TDyss, M20N3TDzss, M20N4TDxss, M20N4TDyss, M20N4TDzss, M20N5TDxss, M20N5TDyss, M20N5TDzss, & + M20N6TDxss, M20N6TDyss, M20N6TDzss, M20N7TDxss, M20N7TDyss, M20N7TDzss, M20N8TDxss, M20N8TDyss, M20N8TDzss, M20N9TDxss, M20N9TDyss, M20N9TDzss, & + M21N1TDxss, M21N1TDyss, M21N1TDzss, M21N2TDxss, M21N2TDyss, M21N2TDzss, M21N3TDxss, M21N3TDyss, M21N3TDzss, M21N4TDxss, M21N4TDyss, M21N4TDzss, & + M21N5TDxss, M21N5TDyss, M21N5TDzss, M21N6TDxss, M21N6TDyss, M21N6TDzss, M21N7TDxss, M21N7TDyss, M21N7TDzss, M21N8TDxss, M21N8TDyss, M21N8TDzss, & + M21N9TDxss, M21N9TDyss, M21N9TDzss, M22N1TDxss, M22N1TDyss, M22N1TDzss, M22N2TDxss, M22N2TDyss, M22N2TDzss, M22N3TDxss, M22N3TDyss, M22N3TDzss, & + M22N4TDxss, M22N4TDyss, M22N4TDzss, M22N5TDxss, M22N5TDyss, M22N5TDzss, M22N6TDxss, M22N6TDyss, M22N6TDzss, M22N7TDxss, M22N7TDyss, M22N7TDzss, & + M22N8TDxss, M22N8TDyss, M22N8TDzss, M22N9TDxss, M22N9TDyss, M22N9TDzss, M23N1TDxss, M23N1TDyss, M23N1TDzss, M23N2TDxss, M23N2TDyss, M23N2TDzss, & + M23N3TDxss, M23N3TDyss, M23N3TDzss, M23N4TDxss, M23N4TDyss, M23N4TDzss, M23N5TDxss, M23N5TDyss, M23N5TDzss, M23N6TDxss, M23N6TDyss, M23N6TDzss, & + M23N7TDxss, M23N7TDyss, M23N7TDzss, M23N8TDxss, M23N8TDyss, M23N8TDzss, M23N9TDxss, M23N9TDyss, M23N9TDzss, M24N1TDxss, M24N1TDyss, M24N1TDzss, & + M24N2TDxss, M24N2TDyss, M24N2TDzss, M24N3TDxss, M24N3TDyss, M24N3TDzss, M24N4TDxss, M24N4TDyss, M24N4TDzss, M24N5TDxss, M24N5TDyss, M24N5TDzss, & + M24N6TDxss, M24N6TDyss, M24N6TDzss, M24N7TDxss, M24N7TDyss, M24N7TDzss, M24N8TDxss, M24N8TDyss, M24N8TDzss, M24N9TDxss, M24N9TDyss, M24N9TDzss, & + M25N1TDxss, M25N1TDyss, M25N1TDzss, M25N2TDxss, M25N2TDyss, M25N2TDzss, M25N3TDxss, M25N3TDyss, M25N3TDzss, M25N4TDxss, M25N4TDyss, M25N4TDzss, & + M25N5TDxss, M25N5TDyss, M25N5TDzss, M25N6TDxss, M25N6TDyss, M25N6TDzss, M25N7TDxss, M25N7TDyss, M25N7TDzss, M25N8TDxss, M25N8TDyss, M25N8TDzss, & + M25N9TDxss, M25N9TDyss, M25N9TDzss, M26N1TDxss, M26N1TDyss, M26N1TDzss, M26N2TDxss, M26N2TDyss, M26N2TDzss, M26N3TDxss, M26N3TDyss, M26N3TDzss, & + M26N4TDxss, M26N4TDyss, M26N4TDzss, M26N5TDxss, M26N5TDyss, M26N5TDzss, M26N6TDxss, M26N6TDyss, M26N6TDzss, M26N7TDxss, M26N7TDyss, M26N7TDzss, & + M26N8TDxss, M26N8TDyss, M26N8TDzss, M26N9TDxss, M26N9TDyss, M26N9TDzss, M27N1TDxss, M27N1TDyss, M27N1TDzss, M27N2TDxss, M27N2TDyss, M27N2TDzss, & + M27N3TDxss, M27N3TDyss, M27N3TDzss, M27N4TDxss, M27N4TDyss, M27N4TDzss, M27N5TDxss, M27N5TDyss, M27N5TDzss, M27N6TDxss, M27N6TDyss, M27N6TDzss, & + M27N7TDxss, M27N7TDyss, M27N7TDzss, M27N8TDxss, M27N8TDyss, M27N8TDzss, M27N9TDxss, M27N9TDyss, M27N9TDzss, M28N1TDxss, M28N1TDyss, M28N1TDzss, & + M28N2TDxss, M28N2TDyss, M28N2TDzss, M28N3TDxss, M28N3TDyss, M28N3TDzss, M28N4TDxss, M28N4TDyss, M28N4TDzss, M28N5TDxss, M28N5TDyss, M28N5TDzss, & + M28N6TDxss, M28N6TDyss, M28N6TDzss, M28N7TDxss, M28N7TDyss, M28N7TDzss, M28N8TDxss, M28N8TDyss, M28N8TDzss, M28N9TDxss, M28N9TDyss, M28N9TDzss, & + M29N1TDxss, M29N1TDyss, M29N1TDzss, M29N2TDxss, M29N2TDyss, M29N2TDzss, M29N3TDxss, M29N3TDyss, M29N3TDzss, M29N4TDxss, M29N4TDyss, M29N4TDzss, & + M29N5TDxss, M29N5TDyss, M29N5TDzss, M29N6TDxss, M29N6TDyss, M29N6TDzss, M29N7TDxss, M29N7TDyss, M29N7TDzss, M29N8TDxss, M29N8TDyss, M29N8TDzss, & + M29N9TDxss, M29N9TDyss, M29N9TDzss, M30N1TDxss, M30N1TDyss, M30N1TDzss, M30N2TDxss, M30N2TDyss, M30N2TDzss, M30N3TDxss, M30N3TDyss, M30N3TDzss, & + M30N4TDxss, M30N4TDyss, M30N4TDzss, M30N5TDxss, M30N5TDyss, M30N5TDzss, M30N6TDxss, M30N6TDyss, M30N6TDzss, M30N7TDxss, M30N7TDyss, M30N7TDzss, & + M30N8TDxss, M30N8TDyss, M30N8TDzss, M30N9TDxss, M30N9TDyss, M30N9TDzss, M31N1TDxss, M31N1TDyss, M31N1TDzss, M31N2TDxss, M31N2TDyss, M31N2TDzss, & + M31N3TDxss, M31N3TDyss, M31N3TDzss, M31N4TDxss, M31N4TDyss, M31N4TDzss, M31N5TDxss, M31N5TDyss, M31N5TDzss, M31N6TDxss, M31N6TDyss, M31N6TDzss, & + M31N7TDxss, M31N7TDyss, M31N7TDzss, M31N8TDxss, M31N8TDyss, M31N8TDzss, M31N9TDxss, M31N9TDyss, M31N9TDzss, M32N1TDxss, M32N1TDyss, M32N1TDzss, & + M32N2TDxss, M32N2TDyss, M32N2TDzss, M32N3TDxss, M32N3TDyss, M32N3TDzss, M32N4TDxss, M32N4TDyss, M32N4TDzss, M32N5TDxss, M32N5TDyss, M32N5TDzss, & + M32N6TDxss, M32N6TDyss, M32N6TDzss, M32N7TDxss, M32N7TDyss, M32N7TDzss, M32N8TDxss, M32N8TDyss, M32N8TDzss, M32N9TDxss, M32N9TDyss, M32N9TDzss, & + M33N1TDxss, M33N1TDyss, M33N1TDzss, M33N2TDxss, M33N2TDyss, M33N2TDzss, M33N3TDxss, M33N3TDyss, M33N3TDzss, M33N4TDxss, M33N4TDyss, M33N4TDzss, & + M33N5TDxss, M33N5TDyss, M33N5TDzss, M33N6TDxss, M33N6TDyss, M33N6TDzss, M33N7TDxss, M33N7TDyss, M33N7TDzss, M33N8TDxss, M33N8TDyss, M33N8TDzss, & + M33N9TDxss, M33N9TDyss, M33N9TDzss, M34N1TDxss, M34N1TDyss, M34N1TDzss, M34N2TDxss, M34N2TDyss, M34N2TDzss, M34N3TDxss, M34N3TDyss, M34N3TDzss, & + M34N4TDxss, M34N4TDyss, M34N4TDzss, M34N5TDxss, M34N5TDyss, M34N5TDzss, M34N6TDxss, M34N6TDyss, M34N6TDzss, M34N7TDxss, M34N7TDyss, M34N7TDzss, & + M34N8TDxss, M34N8TDyss, M34N8TDzss, M34N9TDxss, M34N9TDyss, M34N9TDzss, M35N1TDxss, M35N1TDyss, M35N1TDzss, M35N2TDxss, M35N2TDyss, M35N2TDzss, & + M35N3TDxss, M35N3TDyss, M35N3TDzss, M35N4TDxss, M35N4TDyss, M35N4TDzss, M35N5TDxss, M35N5TDyss, M35N5TDzss, M35N6TDxss, M35N6TDyss, M35N6TDzss, & + M35N7TDxss, M35N7TDyss, M35N7TDzss, M35N8TDxss, M35N8TDyss, M35N8TDzss, M35N9TDxss, M35N9TDyss, M35N9TDzss, M36N1TDxss, M36N1TDyss, M36N1TDzss, & + M36N2TDxss, M36N2TDyss, M36N2TDzss, M36N3TDxss, M36N3TDyss, M36N3TDzss, M36N4TDxss, M36N4TDyss, M36N4TDzss, M36N5TDxss, M36N5TDyss, M36N5TDzss, & + M36N6TDxss, M36N6TDyss, M36N6TDzss, M36N7TDxss, M36N7TDyss, M36N7TDzss, M36N8TDxss, M36N8TDyss, M36N8TDzss, M36N9TDxss, M36N9TDyss, M36N9TDzss, & + M37N1TDxss, M37N1TDyss, M37N1TDzss, M37N2TDxss, M37N2TDyss, M37N2TDzss, M37N3TDxss, M37N3TDyss, M37N3TDzss, M37N4TDxss, M37N4TDyss, M37N4TDzss, & + M37N5TDxss, M37N5TDyss, M37N5TDzss, M37N6TDxss, M37N6TDyss, M37N6TDzss, M37N7TDxss, M37N7TDyss, M37N7TDzss, M37N8TDxss, M37N8TDyss, M37N8TDzss, & + M37N9TDxss, M37N9TDyss, M37N9TDzss, M38N1TDxss, M38N1TDyss, M38N1TDzss, M38N2TDxss, M38N2TDyss, M38N2TDzss, M38N3TDxss, M38N3TDyss, M38N3TDzss, & + M38N4TDxss, M38N4TDyss, M38N4TDzss, M38N5TDxss, M38N5TDyss, M38N5TDzss, M38N6TDxss, M38N6TDyss, M38N6TDzss, M38N7TDxss, M38N7TDyss, M38N7TDzss, & + M38N8TDxss, M38N8TDyss, M38N8TDzss, M38N9TDxss, M38N9TDyss, M38N9TDzss, M39N1TDxss, M39N1TDyss, M39N1TDzss, M39N2TDxss, M39N2TDyss, M39N2TDzss, & + M39N3TDxss, M39N3TDyss, M39N3TDzss, M39N4TDxss, M39N4TDyss, M39N4TDzss, M39N5TDxss, M39N5TDyss, M39N5TDzss, M39N6TDxss, M39N6TDyss, M39N6TDzss, & + M39N7TDxss, M39N7TDyss, M39N7TDzss, M39N8TDxss, M39N8TDyss, M39N8TDzss, M39N9TDxss, M39N9TDyss, M39N9TDzss, M40N1TDxss, M40N1TDyss, M40N1TDzss, & + M40N2TDxss, M40N2TDyss, M40N2TDzss, M40N3TDxss, M40N3TDyss, M40N3TDzss, M40N4TDxss, M40N4TDyss, M40N4TDzss, M40N5TDxss, M40N5TDyss, M40N5TDzss, & + M40N6TDxss, M40N6TDyss, M40N6TDzss, M40N7TDxss, M40N7TDyss, M40N7TDzss, M40N8TDxss, M40N8TDyss, M40N8TDzss, M40N9TDxss, M40N9TDyss, M40N9TDzss, & + M41N1TDxss, M41N1TDyss, M41N1TDzss, M41N2TDxss, M41N2TDyss, M41N2TDzss, M41N3TDxss, M41N3TDyss, M41N3TDzss, M41N4TDxss, M41N4TDyss, M41N4TDzss, & + M41N5TDxss, M41N5TDyss, M41N5TDzss, M41N6TDxss, M41N6TDyss, M41N6TDzss, M41N7TDxss, M41N7TDyss, M41N7TDzss, M41N8TDxss, M41N8TDyss, M41N8TDzss, & + M41N9TDxss, M41N9TDyss, M41N9TDzss, M42N1TDxss, M42N1TDyss, M42N1TDzss, M42N2TDxss, M42N2TDyss, M42N2TDzss, M42N3TDxss, M42N3TDyss, M42N3TDzss, & + M42N4TDxss, M42N4TDyss, M42N4TDzss, M42N5TDxss, M42N5TDyss, M42N5TDzss, M42N6TDxss, M42N6TDyss, M42N6TDzss, M42N7TDxss, M42N7TDyss, M42N7TDzss, & + M42N8TDxss, M42N8TDyss, M42N8TDzss, M42N9TDxss, M42N9TDyss, M42N9TDzss, M43N1TDxss, M43N1TDyss, M43N1TDzss, M43N2TDxss, M43N2TDyss, M43N2TDzss, & + M43N3TDxss, M43N3TDyss, M43N3TDzss, M43N4TDxss, M43N4TDyss, M43N4TDzss, M43N5TDxss, M43N5TDyss, M43N5TDzss, M43N6TDxss, M43N6TDyss, M43N6TDzss, & + M43N7TDxss, M43N7TDyss, M43N7TDzss, M43N8TDxss, M43N8TDyss, M43N8TDzss, M43N9TDxss, M43N9TDyss, M43N9TDzss, M44N1TDxss, M44N1TDyss, M44N1TDzss, & + M44N2TDxss, M44N2TDyss, M44N2TDzss, M44N3TDxss, M44N3TDyss, M44N3TDzss, M44N4TDxss, M44N4TDyss, M44N4TDzss, M44N5TDxss, M44N5TDyss, M44N5TDzss, & + M44N6TDxss, M44N6TDyss, M44N6TDzss, M44N7TDxss, M44N7TDyss, M44N7TDzss, M44N8TDxss, M44N8TDyss, M44N8TDzss, M44N9TDxss, M44N9TDyss, M44N9TDzss, & + M45N1TDxss, M45N1TDyss, M45N1TDzss, M45N2TDxss, M45N2TDyss, M45N2TDzss, M45N3TDxss, M45N3TDyss, M45N3TDzss, M45N4TDxss, M45N4TDyss, M45N4TDzss, & + M45N5TDxss, M45N5TDyss, M45N5TDzss, M45N6TDxss, M45N6TDyss, M45N6TDzss, M45N7TDxss, M45N7TDyss, M45N7TDzss, M45N8TDxss, M45N8TDyss, M45N8TDzss, & + M45N9TDxss, M45N9TDyss, M45N9TDzss, M46N1TDxss, M46N1TDyss, M46N1TDzss, M46N2TDxss, M46N2TDyss, M46N2TDzss, M46N3TDxss, M46N3TDyss, M46N3TDzss, & + M46N4TDxss, M46N4TDyss, M46N4TDzss, M46N5TDxss, M46N5TDyss, M46N5TDzss, M46N6TDxss, M46N6TDyss, M46N6TDzss, M46N7TDxss, M46N7TDyss, M46N7TDzss, & + M46N8TDxss, M46N8TDyss, M46N8TDzss, M46N9TDxss, M46N9TDyss, M46N9TDzss, M47N1TDxss, M47N1TDyss, M47N1TDzss, M47N2TDxss, M47N2TDyss, M47N2TDzss, & + M47N3TDxss, M47N3TDyss, M47N3TDzss, M47N4TDxss, M47N4TDyss, M47N4TDzss, M47N5TDxss, M47N5TDyss, M47N5TDzss, M47N6TDxss, M47N6TDyss, M47N6TDzss, & + M47N7TDxss, M47N7TDyss, M47N7TDzss, M47N8TDxss, M47N8TDyss, M47N8TDzss, M47N9TDxss, M47N9TDyss, M47N9TDzss, M48N1TDxss, M48N1TDyss, M48N1TDzss, & + M48N2TDxss, M48N2TDyss, M48N2TDzss, M48N3TDxss, M48N3TDyss, M48N3TDzss, M48N4TDxss, M48N4TDyss, M48N4TDzss, M48N5TDxss, M48N5TDyss, M48N5TDzss, & + M48N6TDxss, M48N6TDyss, M48N6TDzss, M48N7TDxss, M48N7TDyss, M48N7TDzss, M48N8TDxss, M48N8TDyss, M48N8TDzss, M48N9TDxss, M48N9TDyss, M48N9TDzss, & + M49N1TDxss, M49N1TDyss, M49N1TDzss, M49N2TDxss, M49N2TDyss, M49N2TDzss, M49N3TDxss, M49N3TDyss, M49N3TDzss, M49N4TDxss, M49N4TDyss, M49N4TDzss, & + M49N5TDxss, M49N5TDyss, M49N5TDzss, M49N6TDxss, M49N6TDyss, M49N6TDzss, M49N7TDxss, M49N7TDyss, M49N7TDzss, M49N8TDxss, M49N8TDyss, M49N8TDzss, & + M49N9TDxss, M49N9TDyss, M49N9TDzss, M50N1TDxss, M50N1TDyss, M50N1TDzss, M50N2TDxss, M50N2TDyss, M50N2TDzss, M50N3TDxss, M50N3TDyss, M50N3TDzss, & + M50N4TDxss, M50N4TDyss, M50N4TDzss, M50N5TDxss, M50N5TDyss, M50N5TDzss, M50N6TDxss, M50N6TDyss, M50N6TDzss, M50N7TDxss, M50N7TDyss, M50N7TDzss, & + M50N8TDxss, M50N8TDyss, M50N8TDzss, M50N9TDxss, M50N9TDyss, M50N9TDzss, M51N1TDxss, M51N1TDyss, M51N1TDzss, M51N2TDxss, M51N2TDyss, M51N2TDzss, & + M51N3TDxss, M51N3TDyss, M51N3TDzss, M51N4TDxss, M51N4TDyss, M51N4TDzss, M51N5TDxss, M51N5TDyss, M51N5TDzss, M51N6TDxss, M51N6TDyss, M51N6TDzss, & + M51N7TDxss, M51N7TDyss, M51N7TDzss, M51N8TDxss, M51N8TDyss, M51N8TDzss, M51N9TDxss, M51N9TDyss, M51N9TDzss, M52N1TDxss, M52N1TDyss, M52N1TDzss, & + M52N2TDxss, M52N2TDyss, M52N2TDzss, M52N3TDxss, M52N3TDyss, M52N3TDzss, M52N4TDxss, M52N4TDyss, M52N4TDzss, M52N5TDxss, M52N5TDyss, M52N5TDzss, & + M52N6TDxss, M52N6TDyss, M52N6TDzss, M52N7TDxss, M52N7TDyss, M52N7TDzss, M52N8TDxss, M52N8TDyss, M52N8TDzss, M52N9TDxss, M52N9TDyss, M52N9TDzss, & + M53N1TDxss, M53N1TDyss, M53N1TDzss, M53N2TDxss, M53N2TDyss, M53N2TDzss, M53N3TDxss, M53N3TDyss, M53N3TDzss, M53N4TDxss, M53N4TDyss, M53N4TDzss, & + M53N5TDxss, M53N5TDyss, M53N5TDzss, M53N6TDxss, M53N6TDyss, M53N6TDzss, M53N7TDxss, M53N7TDyss, M53N7TDzss, M53N8TDxss, M53N8TDyss, M53N8TDzss, & + M53N9TDxss, M53N9TDyss, M53N9TDzss, M54N1TDxss, M54N1TDyss, M54N1TDzss, M54N2TDxss, M54N2TDyss, M54N2TDzss, M54N3TDxss, M54N3TDyss, M54N3TDzss, & + M54N4TDxss, M54N4TDyss, M54N4TDzss, M54N5TDxss, M54N5TDyss, M54N5TDzss, M54N6TDxss, M54N6TDyss, M54N6TDzss, M54N7TDxss, M54N7TDyss, M54N7TDzss, & + M54N8TDxss, M54N8TDyss, M54N8TDzss, M54N9TDxss, M54N9TDyss, M54N9TDzss, M55N1TDxss, M55N1TDyss, M55N1TDzss, M55N2TDxss, M55N2TDyss, M55N2TDzss, & + M55N3TDxss, M55N3TDyss, M55N3TDzss, M55N4TDxss, M55N4TDyss, M55N4TDzss, M55N5TDxss, M55N5TDyss, M55N5TDzss, M55N6TDxss, M55N6TDyss, M55N6TDzss, & + M55N7TDxss, M55N7TDyss, M55N7TDzss, M55N8TDxss, M55N8TDyss, M55N8TDzss, M55N9TDxss, M55N9TDyss, M55N9TDzss, M56N1TDxss, M56N1TDyss, M56N1TDzss, & + M56N2TDxss, M56N2TDyss, M56N2TDzss, M56N3TDxss, M56N3TDyss, M56N3TDzss, M56N4TDxss, M56N4TDyss, M56N4TDzss, M56N5TDxss, M56N5TDyss, M56N5TDzss, & + M56N6TDxss, M56N6TDyss, M56N6TDzss, M56N7TDxss, M56N7TDyss, M56N7TDzss, M56N8TDxss, M56N8TDyss, M56N8TDzss, M56N9TDxss, M56N9TDyss, M56N9TDzss, & + M57N1TDxss, M57N1TDyss, M57N1TDzss, M57N2TDxss, M57N2TDyss, M57N2TDzss, M57N3TDxss, M57N3TDyss, M57N3TDzss, M57N4TDxss, M57N4TDyss, M57N4TDzss, & + M57N5TDxss, M57N5TDyss, M57N5TDzss, M57N6TDxss, M57N6TDyss, M57N6TDzss, M57N7TDxss, M57N7TDyss, M57N7TDzss, M57N8TDxss, M57N8TDyss, M57N8TDzss, & + M57N9TDxss, M57N9TDyss, M57N9TDzss, M58N1TDxss, M58N1TDyss, M58N1TDzss, M58N2TDxss, M58N2TDyss, M58N2TDzss, M58N3TDxss, M58N3TDyss, M58N3TDzss, & + M58N4TDxss, M58N4TDyss, M58N4TDzss, M58N5TDxss, M58N5TDyss, M58N5TDzss, M58N6TDxss, M58N6TDyss, M58N6TDzss, M58N7TDxss, M58N7TDyss, M58N7TDzss, & + M58N8TDxss, M58N8TDyss, M58N8TDzss, M58N9TDxss, M58N9TDyss, M58N9TDzss, M59N1TDxss, M59N1TDyss, M59N1TDzss, M59N2TDxss, M59N2TDyss, M59N2TDzss, & + M59N3TDxss, M59N3TDyss, M59N3TDzss, M59N4TDxss, M59N4TDyss, M59N4TDzss, M59N5TDxss, M59N5TDyss, M59N5TDzss, M59N6TDxss, M59N6TDyss, M59N6TDzss, & + M59N7TDxss, M59N7TDyss, M59N7TDzss, M59N8TDxss, M59N8TDyss, M59N8TDzss, M59N9TDxss, M59N9TDyss, M59N9TDzss, M60N1TDxss, M60N1TDyss, M60N1TDzss, & + M60N2TDxss, M60N2TDyss, M60N2TDzss, M60N3TDxss, M60N3TDyss, M60N3TDzss, M60N4TDxss, M60N4TDyss, M60N4TDzss, M60N5TDxss, M60N5TDyss, M60N5TDzss, & + M60N6TDxss, M60N6TDyss, M60N6TDzss, M60N7TDxss, M60N7TDyss, M60N7TDzss, M60N8TDxss, M60N8TDyss, M60N8TDzss, M60N9TDxss, M60N9TDyss, M60N9TDzss, & + M61N1TDxss, M61N1TDyss, M61N1TDzss, M61N2TDxss, M61N2TDyss, M61N2TDzss, M61N3TDxss, M61N3TDyss, M61N3TDzss, M61N4TDxss, M61N4TDyss, M61N4TDzss, & + M61N5TDxss, M61N5TDyss, M61N5TDzss, M61N6TDxss, M61N6TDyss, M61N6TDzss, M61N7TDxss, M61N7TDyss, M61N7TDzss, M61N8TDxss, M61N8TDyss, M61N8TDzss, & + M61N9TDxss, M61N9TDyss, M61N9TDzss, M62N1TDxss, M62N1TDyss, M62N1TDzss, M62N2TDxss, M62N2TDyss, M62N2TDzss, M62N3TDxss, M62N3TDyss, M62N3TDzss, & + M62N4TDxss, M62N4TDyss, M62N4TDzss, M62N5TDxss, M62N5TDyss, M62N5TDzss, M62N6TDxss, M62N6TDyss, M62N6TDzss, M62N7TDxss, M62N7TDyss, M62N7TDzss, & + M62N8TDxss, M62N8TDyss, M62N8TDzss, M62N9TDxss, M62N9TDyss, M62N9TDzss, M63N1TDxss, M63N1TDyss, M63N1TDzss, M63N2TDxss, M63N2TDyss, M63N2TDzss, & + M63N3TDxss, M63N3TDyss, M63N3TDzss, M63N4TDxss, M63N4TDyss, M63N4TDzss, M63N5TDxss, M63N5TDyss, M63N5TDzss, M63N6TDxss, M63N6TDyss, M63N6TDzss, & + M63N7TDxss, M63N7TDyss, M63N7TDzss, M63N8TDxss, M63N8TDyss, M63N8TDzss, M63N9TDxss, M63N9TDyss, M63N9TDzss, M64N1TDxss, M64N1TDyss, M64N1TDzss, & + M64N2TDxss, M64N2TDyss, M64N2TDzss, M64N3TDxss, M64N3TDyss, M64N3TDzss, M64N4TDxss, M64N4TDyss, M64N4TDzss, M64N5TDxss, M64N5TDyss, M64N5TDzss, & + M64N6TDxss, M64N6TDyss, M64N6TDzss, M64N7TDxss, M64N7TDyss, M64N7TDzss, M64N8TDxss, M64N8TDyss, M64N8TDzss, M64N9TDxss, M64N9TDyss, M64N9TDzss, & + M65N1TDxss, M65N1TDyss, M65N1TDzss, M65N2TDxss, M65N2TDyss, M65N2TDzss, M65N3TDxss, M65N3TDyss, M65N3TDzss, M65N4TDxss, M65N4TDyss, M65N4TDzss, & + M65N5TDxss, M65N5TDyss, M65N5TDzss, M65N6TDxss, M65N6TDyss, M65N6TDzss, M65N7TDxss, M65N7TDyss, M65N7TDzss, M65N8TDxss, M65N8TDyss, M65N8TDzss, & + M65N9TDxss, M65N9TDyss, M65N9TDzss, M66N1TDxss, M66N1TDyss, M66N1TDzss, M66N2TDxss, M66N2TDyss, M66N2TDzss, M66N3TDxss, M66N3TDyss, M66N3TDzss, & + M66N4TDxss, M66N4TDyss, M66N4TDzss, M66N5TDxss, M66N5TDyss, M66N5TDzss, M66N6TDxss, M66N6TDyss, M66N6TDzss, M66N7TDxss, M66N7TDyss, M66N7TDzss, & + M66N8TDxss, M66N8TDyss, M66N8TDzss, M66N9TDxss, M66N9TDyss, M66N9TDzss, M67N1TDxss, M67N1TDyss, M67N1TDzss, M67N2TDxss, M67N2TDyss, M67N2TDzss, & + M67N3TDxss, M67N3TDyss, M67N3TDzss, M67N4TDxss, M67N4TDyss, M67N4TDzss, M67N5TDxss, M67N5TDyss, M67N5TDzss, M67N6TDxss, M67N6TDyss, M67N6TDzss, & + M67N7TDxss, M67N7TDyss, M67N7TDzss, M67N8TDxss, M67N8TDyss, M67N8TDzss, M67N9TDxss, M67N9TDyss, M67N9TDzss, M68N1TDxss, M68N1TDyss, M68N1TDzss, & + M68N2TDxss, M68N2TDyss, M68N2TDzss, M68N3TDxss, M68N3TDyss, M68N3TDzss, M68N4TDxss, M68N4TDyss, M68N4TDzss, M68N5TDxss, M68N5TDyss, M68N5TDzss, & + M68N6TDxss, M68N6TDyss, M68N6TDzss, M68N7TDxss, M68N7TDyss, M68N7TDzss, M68N8TDxss, M68N8TDyss, M68N8TDzss, M68N9TDxss, M68N9TDyss, M68N9TDzss, & + M69N1TDxss, M69N1TDyss, M69N1TDzss, M69N2TDxss, M69N2TDyss, M69N2TDzss, M69N3TDxss, M69N3TDyss, M69N3TDzss, M69N4TDxss, M69N4TDyss, M69N4TDzss, & + M69N5TDxss, M69N5TDyss, M69N5TDzss, M69N6TDxss, M69N6TDyss, M69N6TDzss, M69N7TDxss, M69N7TDyss, M69N7TDzss, M69N8TDxss, M69N8TDyss, M69N8TDzss, & + M69N9TDxss, M69N9TDyss, M69N9TDzss, M70N1TDxss, M70N1TDyss, M70N1TDzss, M70N2TDxss, M70N2TDyss, M70N2TDzss, M70N3TDxss, M70N3TDyss, M70N3TDzss, & + M70N4TDxss, M70N4TDyss, M70N4TDzss, M70N5TDxss, M70N5TDyss, M70N5TDzss, M70N6TDxss, M70N6TDyss, M70N6TDzss, M70N7TDxss, M70N7TDyss, M70N7TDzss, & + M70N8TDxss, M70N8TDyss, M70N8TDzss, M70N9TDxss, M70N9TDyss, M70N9TDzss, M71N1TDxss, M71N1TDyss, M71N1TDzss, M71N2TDxss, M71N2TDyss, M71N2TDzss, & + M71N3TDxss, M71N3TDyss, M71N3TDzss, M71N4TDxss, M71N4TDyss, M71N4TDzss, M71N5TDxss, M71N5TDyss, M71N5TDzss, M71N6TDxss, M71N6TDyss, M71N6TDzss, & + M71N7TDxss, M71N7TDyss, M71N7TDzss, M71N8TDxss, M71N8TDyss, M71N8TDzss, M71N9TDxss, M71N9TDyss, M71N9TDzss, M72N1TDxss, M72N1TDyss, M72N1TDzss, & + M72N2TDxss, M72N2TDyss, M72N2TDzss, M72N3TDxss, M72N3TDyss, M72N3TDzss, M72N4TDxss, M72N4TDyss, M72N4TDzss, M72N5TDxss, M72N5TDyss, M72N5TDzss, & + M72N6TDxss, M72N6TDyss, M72N6TDzss, M72N7TDxss, M72N7TDyss, M72N7TDzss, M72N8TDxss, M72N8TDyss, M72N8TDzss, M72N9TDxss, M72N9TDyss, M72N9TDzss, & + M73N1TDxss, M73N1TDyss, M73N1TDzss, M73N2TDxss, M73N2TDyss, M73N2TDzss, M73N3TDxss, M73N3TDyss, M73N3TDzss, M73N4TDxss, M73N4TDyss, M73N4TDzss, & + M73N5TDxss, M73N5TDyss, M73N5TDzss, M73N6TDxss, M73N6TDyss, M73N6TDzss, M73N7TDxss, M73N7TDyss, M73N7TDzss, M73N8TDxss, M73N8TDyss, M73N8TDzss, & + M73N9TDxss, M73N9TDyss, M73N9TDzss, M74N1TDxss, M74N1TDyss, M74N1TDzss, M74N2TDxss, M74N2TDyss, M74N2TDzss, M74N3TDxss, M74N3TDyss, M74N3TDzss, & + M74N4TDxss, M74N4TDyss, M74N4TDzss, M74N5TDxss, M74N5TDyss, M74N5TDzss, M74N6TDxss, M74N6TDyss, M74N6TDzss, M74N7TDxss, M74N7TDyss, M74N7TDzss, & + M74N8TDxss, M74N8TDyss, M74N8TDzss, M74N9TDxss, M74N9TDyss, M74N9TDzss, M75N1TDxss, M75N1TDyss, M75N1TDzss, M75N2TDxss, M75N2TDyss, M75N2TDzss, & + M75N3TDxss, M75N3TDyss, M75N3TDzss, M75N4TDxss, M75N4TDyss, M75N4TDzss, M75N5TDxss, M75N5TDyss, M75N5TDzss, M75N6TDxss, M75N6TDyss, M75N6TDzss, & + M75N7TDxss, M75N7TDyss, M75N7TDzss, M75N8TDxss, M75N8TDyss, M75N8TDzss, M75N9TDxss, M75N9TDyss, M75N9TDzss, M76N1TDxss, M76N1TDyss, M76N1TDzss, & + M76N2TDxss, M76N2TDyss, M76N2TDzss, M76N3TDxss, M76N3TDyss, M76N3TDzss, M76N4TDxss, M76N4TDyss, M76N4TDzss, M76N5TDxss, M76N5TDyss, M76N5TDzss, & + M76N6TDxss, M76N6TDyss, M76N6TDzss, M76N7TDxss, M76N7TDyss, M76N7TDzss, M76N8TDxss, M76N8TDyss, M76N8TDzss, M76N9TDxss, M76N9TDyss, M76N9TDzss, & + M77N1TDxss, M77N1TDyss, M77N1TDzss, M77N2TDxss, M77N2TDyss, M77N2TDzss, M77N3TDxss, M77N3TDyss, M77N3TDzss, M77N4TDxss, M77N4TDyss, M77N4TDzss, & + M77N5TDxss, M77N5TDyss, M77N5TDzss, M77N6TDxss, M77N6TDyss, M77N6TDzss, M77N7TDxss, M77N7TDyss, M77N7TDzss, M77N8TDxss, M77N8TDyss, M77N8TDzss, & + M77N9TDxss, M77N9TDyss, M77N9TDzss, M78N1TDxss, M78N1TDyss, M78N1TDzss, M78N2TDxss, M78N2TDyss, M78N2TDzss, M78N3TDxss, M78N3TDyss, M78N3TDzss, & + M78N4TDxss, M78N4TDyss, M78N4TDzss, M78N5TDxss, M78N5TDyss, M78N5TDzss, M78N6TDxss, M78N6TDyss, M78N6TDzss, M78N7TDxss, M78N7TDyss, M78N7TDzss, & + M78N8TDxss, M78N8TDyss, M78N8TDzss, M78N9TDxss, M78N9TDyss, M78N9TDzss, M79N1TDxss, M79N1TDyss, M79N1TDzss, M79N2TDxss, M79N2TDyss, M79N2TDzss, & + M79N3TDxss, M79N3TDyss, M79N3TDzss, M79N4TDxss, M79N4TDyss, M79N4TDzss, M79N5TDxss, M79N5TDyss, M79N5TDzss, M79N6TDxss, M79N6TDyss, M79N6TDzss, & + M79N7TDxss, M79N7TDyss, M79N7TDzss, M79N8TDxss, M79N8TDyss, M79N8TDzss, M79N9TDxss, M79N9TDyss, M79N9TDzss, M80N1TDxss, M80N1TDyss, M80N1TDzss, & + M80N2TDxss, M80N2TDyss, M80N2TDzss, M80N3TDxss, M80N3TDyss, M80N3TDzss, M80N4TDxss, M80N4TDyss, M80N4TDzss, M80N5TDxss, M80N5TDyss, M80N5TDzss, & + M80N6TDxss, M80N6TDyss, M80N6TDzss, M80N7TDxss, M80N7TDyss, M80N7TDzss, M80N8TDxss, M80N8TDyss, M80N8TDzss, M80N9TDxss, M80N9TDyss, M80N9TDzss, & + M81N1TDxss, M81N1TDyss, M81N1TDzss, M81N2TDxss, M81N2TDyss, M81N2TDzss, M81N3TDxss, M81N3TDyss, M81N3TDzss, M81N4TDxss, M81N4TDyss, M81N4TDzss, & + M81N5TDxss, M81N5TDyss, M81N5TDzss, M81N6TDxss, M81N6TDyss, M81N6TDzss, M81N7TDxss, M81N7TDyss, M81N7TDzss, M81N8TDxss, M81N8TDyss, M81N8TDzss, & + M81N9TDxss, M81N9TDyss, M81N9TDzss, M82N1TDxss, M82N1TDyss, M82N1TDzss, M82N2TDxss, M82N2TDyss, M82N2TDzss, M82N3TDxss, M82N3TDyss, M82N3TDzss, & + M82N4TDxss, M82N4TDyss, M82N4TDzss, M82N5TDxss, M82N5TDyss, M82N5TDzss, M82N6TDxss, M82N6TDyss, M82N6TDzss, M82N7TDxss, M82N7TDyss, M82N7TDzss, & + M82N8TDxss, M82N8TDyss, M82N8TDzss, M82N9TDxss, M82N9TDyss, M82N9TDzss, M83N1TDxss, M83N1TDyss, M83N1TDzss, M83N2TDxss, M83N2TDyss, M83N2TDzss, & + M83N3TDxss, M83N3TDyss, M83N3TDzss, M83N4TDxss, M83N4TDyss, M83N4TDzss, M83N5TDxss, M83N5TDyss, M83N5TDzss, M83N6TDxss, M83N6TDyss, M83N6TDzss, & + M83N7TDxss, M83N7TDyss, M83N7TDzss, M83N8TDxss, M83N8TDyss, M83N8TDzss, M83N9TDxss, M83N9TDyss, M83N9TDzss, M84N1TDxss, M84N1TDyss, M84N1TDzss, & + M84N2TDxss, M84N2TDyss, M84N2TDzss, M84N3TDxss, M84N3TDyss, M84N3TDzss, M84N4TDxss, M84N4TDyss, M84N4TDzss, M84N5TDxss, M84N5TDyss, M84N5TDzss, & + M84N6TDxss, M84N6TDyss, M84N6TDzss, M84N7TDxss, M84N7TDyss, M84N7TDzss, M84N8TDxss, M84N8TDyss, M84N8TDzss, M84N9TDxss, M84N9TDyss, M84N9TDzss, & + M85N1TDxss, M85N1TDyss, M85N1TDzss, M85N2TDxss, M85N2TDyss, M85N2TDzss, M85N3TDxss, M85N3TDyss, M85N3TDzss, M85N4TDxss, M85N4TDyss, M85N4TDzss, & + M85N5TDxss, M85N5TDyss, M85N5TDzss, M85N6TDxss, M85N6TDyss, M85N6TDzss, M85N7TDxss, M85N7TDyss, M85N7TDzss, M85N8TDxss, M85N8TDyss, M85N8TDzss, & + M85N9TDxss, M85N9TDyss, M85N9TDzss, M86N1TDxss, M86N1TDyss, M86N1TDzss, M86N2TDxss, M86N2TDyss, M86N2TDzss, M86N3TDxss, M86N3TDyss, M86N3TDzss, & + M86N4TDxss, M86N4TDyss, M86N4TDzss, M86N5TDxss, M86N5TDyss, M86N5TDzss, M86N6TDxss, M86N6TDyss, M86N6TDzss, M86N7TDxss, M86N7TDyss, M86N7TDzss, & + M86N8TDxss, M86N8TDyss, M86N8TDzss, M86N9TDxss, M86N9TDyss, M86N9TDzss, M87N1TDxss, M87N1TDyss, M87N1TDzss, M87N2TDxss, M87N2TDyss, M87N2TDzss, & + M87N3TDxss, M87N3TDyss, M87N3TDzss, M87N4TDxss, M87N4TDyss, M87N4TDzss, M87N5TDxss, M87N5TDyss, M87N5TDzss, M87N6TDxss, M87N6TDyss, M87N6TDzss, & + M87N7TDxss, M87N7TDyss, M87N7TDzss, M87N8TDxss, M87N8TDyss, M87N8TDzss, M87N9TDxss, M87N9TDyss, M87N9TDzss, M88N1TDxss, M88N1TDyss, M88N1TDzss, & + M88N2TDxss, M88N2TDyss, M88N2TDzss, M88N3TDxss, M88N3TDyss, M88N3TDzss, M88N4TDxss, M88N4TDyss, M88N4TDzss, M88N5TDxss, M88N5TDyss, M88N5TDzss, & + M88N6TDxss, M88N6TDyss, M88N6TDzss, M88N7TDxss, M88N7TDyss, M88N7TDzss, M88N8TDxss, M88N8TDyss, M88N8TDzss, M88N9TDxss, M88N9TDyss, M88N9TDzss, & + M89N1TDxss, M89N1TDyss, M89N1TDzss, M89N2TDxss, M89N2TDyss, M89N2TDzss, M89N3TDxss, M89N3TDyss, M89N3TDzss, M89N4TDxss, M89N4TDyss, M89N4TDzss, & + M89N5TDxss, M89N5TDyss, M89N5TDzss, M89N6TDxss, M89N6TDyss, M89N6TDzss, M89N7TDxss, M89N7TDyss, M89N7TDzss, M89N8TDxss, M89N8TDyss, M89N8TDzss, & + M89N9TDxss, M89N9TDyss, M89N9TDzss, M90N1TDxss, M90N1TDyss, M90N1TDzss, M90N2TDxss, M90N2TDyss, M90N2TDzss, M90N3TDxss, M90N3TDyss, M90N3TDzss, & + M90N4TDxss, M90N4TDyss, M90N4TDzss, M90N5TDxss, M90N5TDyss, M90N5TDzss, M90N6TDxss, M90N6TDyss, M90N6TDzss, M90N7TDxss, M90N7TDyss, M90N7TDzss, & + M90N8TDxss, M90N8TDyss, M90N8TDzss, M90N9TDxss, M90N9TDyss, M90N9TDzss, M91N1TDxss, M91N1TDyss, M91N1TDzss, M91N2TDxss, M91N2TDyss, M91N2TDzss, & + M91N3TDxss, M91N3TDyss, M91N3TDzss, M91N4TDxss, M91N4TDyss, M91N4TDzss, M91N5TDxss, M91N5TDyss, M91N5TDzss, M91N6TDxss, M91N6TDyss, M91N6TDzss, & + M91N7TDxss, M91N7TDyss, M91N7TDzss, M91N8TDxss, M91N8TDyss, M91N8TDzss, M91N9TDxss, M91N9TDyss, M91N9TDzss, M92N1TDxss, M92N1TDyss, M92N1TDzss, & + M92N2TDxss, M92N2TDyss, M92N2TDzss, M92N3TDxss, M92N3TDyss, M92N3TDzss, M92N4TDxss, M92N4TDyss, M92N4TDzss, M92N5TDxss, M92N5TDyss, M92N5TDzss, & + M92N6TDxss, M92N6TDyss, M92N6TDzss, M92N7TDxss, M92N7TDyss, M92N7TDzss, M92N8TDxss, M92N8TDyss, M92N8TDzss, M92N9TDxss, M92N9TDyss, M92N9TDzss, & + M93N1TDxss, M93N1TDyss, M93N1TDzss, M93N2TDxss, M93N2TDyss, M93N2TDzss, M93N3TDxss, M93N3TDyss, M93N3TDzss, M93N4TDxss, M93N4TDyss, M93N4TDzss, & + M93N5TDxss, M93N5TDyss, M93N5TDzss, M93N6TDxss, M93N6TDyss, M93N6TDzss, M93N7TDxss, M93N7TDyss, M93N7TDzss, M93N8TDxss, M93N8TDyss, M93N8TDzss, & + M93N9TDxss, M93N9TDyss, M93N9TDzss, M94N1TDxss, M94N1TDyss, M94N1TDzss, M94N2TDxss, M94N2TDyss, M94N2TDzss, M94N3TDxss, M94N3TDyss, M94N3TDzss, & + M94N4TDxss, M94N4TDyss, M94N4TDzss, M94N5TDxss, M94N5TDyss, M94N5TDzss, M94N6TDxss, M94N6TDyss, M94N6TDzss, M94N7TDxss, M94N7TDyss, M94N7TDzss, & + M94N8TDxss, M94N8TDyss, M94N8TDzss, M94N9TDxss, M94N9TDyss, M94N9TDzss, M95N1TDxss, M95N1TDyss, M95N1TDzss, M95N2TDxss, M95N2TDyss, M95N2TDzss, & + M95N3TDxss, M95N3TDyss, M95N3TDzss, M95N4TDxss, M95N4TDyss, M95N4TDzss, M95N5TDxss, M95N5TDyss, M95N5TDzss, M95N6TDxss, M95N6TDyss, M95N6TDzss, & + M95N7TDxss, M95N7TDyss, M95N7TDzss, M95N8TDxss, M95N8TDyss, M95N8TDzss, M95N9TDxss, M95N9TDyss, M95N9TDzss, M96N1TDxss, M96N1TDyss, M96N1TDzss, & + M96N2TDxss, M96N2TDyss, M96N2TDzss, M96N3TDxss, M96N3TDyss, M96N3TDzss, M96N4TDxss, M96N4TDyss, M96N4TDzss, M96N5TDxss, M96N5TDyss, M96N5TDzss, & + M96N6TDxss, M96N6TDyss, M96N6TDzss, M96N7TDxss, M96N7TDyss, M96N7TDzss, M96N8TDxss, M96N8TDyss, M96N8TDzss, M96N9TDxss, M96N9TDyss, M96N9TDzss, & + M97N1TDxss, M97N1TDyss, M97N1TDzss, M97N2TDxss, M97N2TDyss, M97N2TDzss, M97N3TDxss, M97N3TDyss, M97N3TDzss, M97N4TDxss, M97N4TDyss, M97N4TDzss, & + M97N5TDxss, M97N5TDyss, M97N5TDzss, M97N6TDxss, M97N6TDyss, M97N6TDzss, M97N7TDxss, M97N7TDyss, M97N7TDzss, M97N8TDxss, M97N8TDyss, M97N8TDzss, & + M97N9TDxss, M97N9TDyss, M97N9TDzss, M98N1TDxss, M98N1TDyss, M98N1TDzss, M98N2TDxss, M98N2TDyss, M98N2TDzss, M98N3TDxss, M98N3TDyss, M98N3TDzss, & + M98N4TDxss, M98N4TDyss, M98N4TDzss, M98N5TDxss, M98N5TDyss, M98N5TDzss, M98N6TDxss, M98N6TDyss, M98N6TDzss, M98N7TDxss, M98N7TDyss, M98N7TDzss, & + M98N8TDxss, M98N8TDyss, M98N8TDzss, M98N9TDxss, M98N9TDyss, M98N9TDzss, M99N1TDxss, M99N1TDyss, M99N1TDzss, M99N2TDxss, M99N2TDyss, M99N2TDzss, & + M99N3TDxss, M99N3TDyss, M99N3TDzss, M99N4TDxss, M99N4TDyss, M99N4TDzss, M99N5TDxss, M99N5TDyss, M99N5TDzss, M99N6TDxss, M99N6TDyss, M99N6TDzss, & + M99N7TDxss, M99N7TDyss, M99N7TDzss, M99N8TDxss, M99N8TDyss, M99N8TDzss, M99N9TDxss, M99N9TDyss, M99N9TDzss/),(/3,9,99/)) + + + + INTEGER(IntKi), PARAMETER :: MNRDe(3,9,99) = reshape((/ & M01N1RDxe, M01N1RDye, M01N1RDze, M01N2RDxe, M01N2RDye, M01N2RDze, M01N3RDxe, M01N3RDye, M01N3RDze, M01N4RDxe, M01N4RDye, M01N4RDze, & M01N5RDxe, M01N5RDye, M01N5RDze, M01N6RDxe, M01N6RDye, M01N6RDze, M01N7RDxe, M01N7RDye, M01N7RDze, M01N8RDxe, M01N8RDye, M01N8RDze, & M01N9RDxe, M01N9RDye, M01N9RDze, M02N1RDxe, M02N1RDye, M02N1RDze, M02N2RDxe, M02N2RDye, M02N2RDze, M02N3RDxe, M02N3RDye, M02N3RDze, & @@ -23108,9 +23317,10 @@ module SubDyn_Output_Params M98N8RDxe, M98N8RDye, M98N8RDze, M98N9RDxe, M98N9RDye, M98N9RDze, M99N1RDxe, M99N1RDye, M99N1RDze, M99N2RDxe, M99N2RDye, M99N2RDze, & M99N3RDxe, M99N3RDye, M99N3RDze, M99N4RDxe, M99N4RDye, M99N4RDze, M99N5RDxe, M99N5RDye, M99N5RDze, M99N6RDxe, M99N6RDye, M99N6RDze, & M99N7RDxe, M99N7RDye, M99N7RDze, M99N8RDxe, M99N8RDye, M99N8RDze, M99N9RDxe, M99N9RDye, M99N9RDze/),(/3,9,99/)) - - - INTEGER(IntKi), PARAMETER ::MNTRAe(6,9,99) = reshape((/ & + + + + INTEGER(IntKi), PARAMETER :: MNTRAe(6,9,99) = reshape((/ & M01N1TAxe, M01N1TAye, M01N1TAze, M01N1RAxe, M01N1RAye, M01N1RAze, M01N2TAxe, M01N2TAye, M01N2TAze, M01N2RAxe, M01N2RAye, M01N2RAze, & M01N3TAxe, M01N3TAye, M01N3TAze, M01N3RAxe, M01N3RAye, M01N3RAze, M01N4TAxe, M01N4TAye, M01N4TAze, M01N4RAxe, M01N4RAye, M01N4RAze, & M01N5TAxe, M01N5TAye, M01N5TAze, M01N5RAxe, M01N5RAye, M01N5RAze, M01N6TAxe, M01N6TAye, M01N6TAze, M01N6RAxe, M01N6RAye, M01N6RAze, & @@ -23557,743 +23767,799 @@ module SubDyn_Output_Params M99N5TAxe, M99N5TAye, M99N5TAze, M99N5RAxe, M99N5RAye, M99N5RAze, M99N6TAxe, M99N6TAye, M99N6TAze, M99N6RAxe, M99N6RAye, M99N6RAze, & M99N7TAxe, M99N7TAye, M99N7TAze, M99N7RAxe, M99N7RAye, M99N7RAze, M99N8TAxe, M99N8TAye, M99N8TAze, M99N8RAxe, M99N8RAye, M99N8RAze, & M99N9TAxe, M99N9TAye, M99N9TAze, M99N9RAxe, M99N9RAye, M99N9RAze/),(/6,9,99/)) + + + - - -!End of code generated by Matlab script Write_ChckOutLst -! =================================================================================================== - - INTEGER, PARAMETER :: ReactSS(6) = (/ReactFXss, ReactFYss, ReactFZss, & - ReactMXss, ReactMYss, ReactMZss/) - INTEGER, PARAMETER :: IntfSS(6) = (/IntfFXss, IntfFYss, IntfFZss , & - IntfMXss, IntfMYss, IntfMZss/) - INTEGER, PARAMETER :: IntfTRss(6) = (/IntfTDXss, IntfTDYss, IntfTDZss, & - IntfRDXss, IntfRDYss, IntfRDZss/) - INTEGER, PARAMETER :: IntfTRAss(6) = (/IntfTAXss, IntfTAYss, IntfTAZss, & - IntfRAXss, IntfRAYss, IntfRAZss/) + INTEGER, PARAMETER :: ReactSS(6) = (/ReactFXss, ReactFYss, ReactFZss, ReactMXss, ReactMYss, ReactMZss/) + INTEGER, PARAMETER :: IntfSS(6,9) = reshape((/Intf1FXss, Intf1FYss, Intf1FZss, Intf1MXss, Intf1MYss, Intf1MZss, & + Intf2FXss, Intf2FYss, Intf2FZss, Intf2MXss, Intf2MYss, Intf2MZss, & + Intf3FXss, Intf3FYss, Intf3FZss, Intf3MXss, Intf3MYss, Intf3MZss, & + Intf4FXss, Intf4FYss, Intf4FZss, Intf4MXss, Intf4MYss, Intf4MZss, & + Intf5FXss, Intf5FYss, Intf5FZss, Intf5MXss, Intf5MYss, Intf5MZss, & + Intf6FXss, Intf6FYss, Intf6FZss, Intf6MXss, Intf6MYss, Intf6MZss, & + Intf7FXss, Intf7FYss, Intf7FZss, Intf7MXss, Intf7MYss, Intf7MZss, & + Intf8FXss, Intf8FYss, Intf8FZss, Intf8MXss, Intf8MYss, Intf8MZss, & + Intf9FXss, Intf9FYss, Intf9FZss, Intf9MXss, Intf9MYss, Intf9MZss/),(/6,9/)) + INTEGER, PARAMETER :: IntfTRss(6,9) = reshape((/Intf1TDXss, Intf1TDYss, Intf1TDZss, Intf1RDXss, Intf1RDYss, Intf1RDZss, & + Intf2TDXss, Intf2TDYss, Intf2TDZss, Intf2RDXss, Intf2RDYss, Intf2RDZss, & + Intf3TDXss, Intf3TDYss, Intf3TDZss, Intf3RDXss, Intf3RDYss, Intf3RDZss, & + Intf4TDXss, Intf4TDYss, Intf4TDZss, Intf4RDXss, Intf4RDYss, Intf4RDZss, & + Intf5TDXss, Intf5TDYss, Intf5TDZss, Intf5RDXss, Intf5RDYss, Intf5RDZss, & + Intf6TDXss, Intf6TDYss, Intf6TDZss, Intf6RDXss, Intf6RDYss, Intf6RDZss, & + Intf7TDXss, Intf7TDYss, Intf7TDZss, Intf7RDXss, Intf7RDYss, Intf7RDZss, & + Intf8TDXss, Intf8TDYss, Intf8TDZss, Intf8RDXss, Intf8RDYss, Intf8RDZss, & + Intf9TDXss, Intf9TDYss, Intf9TDZss, Intf9RDXss, Intf9RDYss, Intf9RDZss/),(/6,9/)) + INTEGER, PARAMETER :: IntfTRAss(6,9) = reshape((/Intf1TAXss, Intf1TAYss, Intf1TAZss, Intf1RAXss, Intf1RAYss, Intf1RAZss, & + Intf2TAXss, Intf2TAYss, Intf2TAZss, Intf2RAXss, Intf2RAYss, Intf2RAZss, & + Intf3TAXss, Intf3TAYss, Intf3TAZss, Intf3RAXss, Intf3RAYss, Intf3RAZss, & + Intf4TAXss, Intf4TAYss, Intf4TAZss, Intf4RAXss, Intf4RAYss, Intf4RAZss, & + Intf5TAXss, Intf5TAYss, Intf5TAZss, Intf5RAXss, Intf5RAYss, Intf5RAZss, & + Intf6TAXss, Intf6TAYss, Intf6TAZss, Intf6RAXss, Intf6RAYss, Intf6RAZss, & + Intf7TAXss, Intf7TAYss, Intf7TAZss, Intf7RAXss, Intf7RAYss, Intf7RAZss, & + Intf8TAXss, Intf8TAYss, Intf8TAZss, Intf8RAXss, Intf8RAYss, Intf8RAZss, & + Intf9TAXss, Intf9TAYss, Intf9TAZss, Intf9RAXss, Intf9RAYss, Intf9RAZss/),(/6,9/)) + INTEGER, PARAMETER :: IntfTRe(6,9) = reshape((/Intf1TDXe, Intf1TDYe, Intf1TDZe, Intf1RDXe, Intf1RDYe, Intf1RDZe, & + Intf2TDXe, Intf2TDYe, Intf2TDZe, Intf2RDXe, Intf2RDYe, Intf2RDZe, & + Intf3TDXe, Intf3TDYe, Intf3TDZe, Intf3RDXe, Intf3RDYe, Intf3RDZe, & + Intf4TDXe, Intf4TDYe, Intf4TDZe, Intf4RDXe, Intf4RDYe, Intf4RDZe, & + Intf5TDXe, Intf5TDYe, Intf5TDZe, Intf5RDXe, Intf5RDYe, Intf5RDZe, & + Intf6TDXe, Intf6TDYe, Intf6TDZe, Intf6RDXe, Intf6RDYe, Intf6RDZe, & + Intf7TDXe, Intf7TDYe, Intf7TDZe, Intf7RDXe, Intf7RDYe, Intf7RDZe, & + Intf8TDXe, Intf8TDYe, Intf8TDZe, Intf8RDXe, Intf8RDYe, Intf8RDZe, & + Intf9TDXe, Intf9TDYe, Intf9TDZe, Intf9RDXe, Intf9RDYe, Intf9RDZe/),(/6,9/)) + INTEGER, PARAMETER :: RBTRAss(6) = (/RBTAXss, RBTAYss, RBTAZss, RBRAXss, RBRAYss, RBRAZss/) + INTEGER, PARAMETER :: RBTRVss(6) = (/RBTVXss, RBTVYss, RBTVZss, RBRVXss, RBRVYss, RBRVZss/) + INTEGER, PARAMETER :: RBTRDss(6) = (/RBTDXss, RBTDYss, RBTDZss, RBRDXss, RBRDYss, RBRDZss/) - - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry1(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "INTFFXSS ","INTFFYSS ","INTFFZSS ","INTFMXSS ","INTFMYSS ","INTFMZSS ","INTFRAXSS ", & - "INTFRAYSS ","INTFRAZSS ","INTFRDXSS ","INTFRDYSS ","INTFRDZSS ","INTFTAXSS ","INTFTAYSS ", & - "INTFTAZSS ","INTFTDXSS ","INTFTDYSS ","INTFTDZSS ","M01N1FKXE ","M01N1FKYE ","M01N1FKZE ", & - "M01N1FMXE ","M01N1FMYE ","M01N1FMZE ","M01N1MKXE ","M01N1MKYE ","M01N1MKZE ","M01N1MMXE ", & - "M01N1MMYE ","M01N1MMZE ","M01N1RAXE ","M01N1RAYE ","M01N1RAZE ","M01N1RDXE ","M01N1RDYE ", & - "M01N1RDZE ","M01N1TAXE ","M01N1TAYE ","M01N1TAZE ","M01N1TDXSS","M01N1TDYSS","M01N1TDZSS", & - "M01N2FKXE ","M01N2FKYE ","M01N2FKZE ","M01N2FMXE ","M01N2FMYE ","M01N2FMZE ","M01N2MKXE ", & - "M01N2MKYE ","M01N2MKZE ","M01N2MMXE ","M01N2MMYE ","M01N2MMZE ","M01N2RAXE ","M01N2RAYE ", & - "M01N2RAZE ","M01N2RDXE ","M01N2RDYE ","M01N2RDZE ","M01N2TAXE ","M01N2TAYE ","M01N2TAZE ", & - "M01N2TDXSS","M01N2TDYSS","M01N2TDZSS","M01N3FKXE ","M01N3FKYE ","M01N3FKZE ","M01N3FMXE ", & - "M01N3FMYE ","M01N3FMZE ","M01N3MKXE ","M01N3MKYE ","M01N3MKZE ","M01N3MMXE ","M01N3MMYE ", & - "M01N3MMZE ","M01N3RAXE ","M01N3RAYE ","M01N3RAZE ","M01N3RDXE ","M01N3RDYE ","M01N3RDZE ", & - "M01N3TAXE ","M01N3TAYE ","M01N3TAZE ","M01N3TDXSS","M01N3TDYSS","M01N3TDZSS","M01N4FKXE ", & - "M01N4FKYE ","M01N4FKZE ","M01N4FMXE ","M01N4FMYE ","M01N4FMZE ","M01N4MKXE ","M01N4MKYE ", & - "M01N4MKZE ","M01N4MMXE ","M01N4MMYE ","M01N4MMZE ","M01N4RAXE ","M01N4RAYE ","M01N4RAZE ", & - "M01N4RDXE ","M01N4RDYE ","M01N4RDZE ","M01N4TAXE ","M01N4TAYE ","M01N4TAZE ","M01N4TDXSS", & - "M01N4TDYSS","M01N4TDZSS","M01N5FKXE ","M01N5FKYE ","M01N5FKZE ","M01N5FMXE ","M01N5FMYE ", & - "M01N5FMZE ","M01N5MKXE ","M01N5MKYE ","M01N5MKZE ","M01N5MMXE ","M01N5MMYE ","M01N5MMZE ", & - "M01N5RAXE ","M01N5RAYE ","M01N5RAZE ","M01N5RDXE ","M01N5RDYE ","M01N5RDZE ","M01N5TAXE ", & - "M01N5TAYE ","M01N5TAZE ","M01N5TDXSS","M01N5TDYSS","M01N5TDZSS","M01N6FKXE ","M01N6FKYE ", & - "M01N6FKZE ","M01N6FMXE ","M01N6FMYE ","M01N6FMZE ","M01N6MKXE ","M01N6MKYE ","M01N6MKZE ", & - "M01N6MMXE ","M01N6MMYE ","M01N6MMZE ","M01N6RAXE ","M01N6RAYE ","M01N6RAZE ","M01N6RDXE ", & - "M01N6RDYE ","M01N6RDZE ","M01N6TAXE ","M01N6TAYE ","M01N6TAZE ","M01N6TDXSS","M01N6TDYSS", & - "M01N6TDZSS","M01N7FKXE ","M01N7FKYE ","M01N7FKZE ","M01N7FMXE ","M01N7FMYE ","M01N7FMZE ", & - "M01N7MKXE ","M01N7MKYE ","M01N7MKZE ","M01N7MMXE ","M01N7MMYE ","M01N7MMZE ","M01N7RAXE ", & - "M01N7RAYE ","M01N7RAZE ","M01N7RDXE ","M01N7RDYE ","M01N7RDZE ","M01N7TAXE ","M01N7TAYE ", & - "M01N7TAZE ","M01N7TDXSS","M01N7TDYSS","M01N7TDZSS","M01N8FKXE ","M01N8FKYE ","M01N8FKZE ", & - "M01N8FMXE ","M01N8FMYE ","M01N8FMZE ","M01N8MKXE ","M01N8MKYE ","M01N8MKZE ","M01N8MMXE ", & - "M01N8MMYE ","M01N8MMZE ","M01N8RAXE ","M01N8RAYE ","M01N8RAZE ","M01N8RDXE ","M01N8RDYE ", & - "M01N8RDZE ","M01N8TAXE ","M01N8TAYE ","M01N8TAZE ","M01N8TDXSS","M01N8TDYSS","M01N8TDZSS", & - "M01N9FKXE ","M01N9FKYE ","M01N9FKZE ","M01N9FMXE ","M01N9FMYE ","M01N9FMZE ","M01N9MKXE ", & - "M01N9MKYE ","M01N9MKZE ","M01N9MMXE ","M01N9MMYE ","M01N9MMZE ","M01N9RAXE ","M01N9RAYE ", & - "M01N9RAZE ","M01N9RDXE ","M01N9RDYE ","M01N9RDZE ","M01N9TAXE ","M01N9TAYE ","M01N9TAZE ", & - "M01N9TDXSS","M01N9TDYSS","M01N9TDZSS","M02N1FKXE ","M02N1FKYE ","M02N1FKZE ","M02N1FMXE ", & - "M02N1FMYE ","M02N1FMZE ","M02N1MKXE ","M02N1MKYE ","M02N1MKZE ","M02N1MMXE ","M02N1MMYE ", & - "M02N1MMZE ","M02N1RAXE ","M02N1RAYE ","M02N1RAZE ","M02N1RDXE ","M02N1RDYE ","M02N1RDZE ", & - "M02N1TAXE ","M02N1TAYE ","M02N1TAZE ","M02N1TDXSS","M02N1TDYSS","M02N1TDZSS","M02N2FKXE ", & - "M02N2FKYE ","M02N2FKZE ","M02N2FMXE ","M02N2FMYE ","M02N2FMZE ","M02N2MKXE ","M02N2MKYE ", & - "M02N2MKZE ","M02N2MMXE ","M02N2MMYE ","M02N2MMZE ","M02N2RAXE ","M02N2RAYE ","M02N2RAZE ", & - "M02N2RDXE ","M02N2RDYE ","M02N2RDZE ","M02N2TAXE ","M02N2TAYE ","M02N2TAZE ","M02N2TDXSS", & - "M02N2TDYSS","M02N2TDZSS","M02N3FKXE ","M02N3FKYE ","M02N3FKZE ","M02N3FMXE ","M02N3FMYE ", & - "M02N3FMZE ","M02N3MKXE ","M02N3MKYE ","M02N3MKZE ","M02N3MMXE ","M02N3MMYE ","M02N3MMZE ", & - "M02N3RAXE ","M02N3RAYE ","M02N3RAZE ","M02N3RDXE ","M02N3RDYE ","M02N3RDZE ","M02N3TAXE ", & - "M02N3TAYE ","M02N3TAZE ","M02N3TDXSS","M02N3TDYSS","M02N3TDZSS","M02N4FKXE ","M02N4FKYE ", & - "M02N4FKZE ","M02N4FMXE ","M02N4FMYE ","M02N4FMZE ","M02N4MKXE ","M02N4MKYE ","M02N4MKZE ", & - "M02N4MMXE ","M02N4MMYE ","M02N4MMZE ","M02N4RAXE ","M02N4RAYE ","M02N4RAZE ","M02N4RDXE ", & - "M02N4RDYE ","M02N4RDZE ","M02N4TAXE ","M02N4TAYE ","M02N4TAZE ","M02N4TDXSS","M02N4TDYSS", & - "M02N4TDZSS","M02N5FKXE ","M02N5FKYE ","M02N5FKZE ","M02N5FMXE ","M02N5FMYE ","M02N5FMZE ", & - "M02N5MKXE ","M02N5MKYE ","M02N5MKZE ","M02N5MMXE ","M02N5MMYE ","M02N5MMZE ","M02N5RAXE ", & - "M02N5RAYE ","M02N5RAZE ","M02N5RDXE ","M02N5RDYE ","M02N5RDZE ","M02N5TAXE ","M02N5TAYE ", & - "M02N5TAZE ","M02N5TDXSS","M02N5TDYSS","M02N5TDZSS","M02N6FKXE ","M02N6FKYE ","M02N6FKZE ", & - "M02N6FMXE ","M02N6FMYE ","M02N6FMZE ","M02N6MKXE ","M02N6MKYE ","M02N6MKZE ","M02N6MMXE ", & - "M02N6MMYE ","M02N6MMZE ","M02N6RAXE ","M02N6RAYE ","M02N6RAZE ","M02N6RDXE ","M02N6RDYE ", & - "M02N6RDZE ","M02N6TAXE ","M02N6TAYE ","M02N6TAZE ","M02N6TDXSS","M02N6TDYSS","M02N6TDZSS", & - "M02N7FKXE ","M02N7FKYE ","M02N7FKZE ","M02N7FMXE ","M02N7FMYE ","M02N7FMZE ","M02N7MKXE ", & - "M02N7MKYE ","M02N7MKZE ","M02N7MMXE ","M02N7MMYE ","M02N7MMZE ","M02N7RAXE ","M02N7RAYE ", & - "M02N7RAZE ","M02N7RDXE ","M02N7RDYE ","M02N7RDZE ","M02N7TAXE ","M02N7TAYE ","M02N7TAZE ", & - "M02N7TDXSS","M02N7TDYSS","M02N7TDZSS","M02N8FKXE ","M02N8FKYE ","M02N8FKZE ","M02N8FMXE ", & - "M02N8FMYE ","M02N8FMZE ","M02N8MKXE ","M02N8MKYE ","M02N8MKZE ","M02N8MMXE ","M02N8MMYE ", & - "M02N8MMZE ","M02N8RAXE ","M02N8RAYE ","M02N8RAZE ","M02N8RDXE ","M02N8RDYE ","M02N8RDZE ", & - "M02N8TAXE ","M02N8TAYE ","M02N8TAZE ","M02N8TDXSS","M02N8TDYSS","M02N8TDZSS","M02N9FKXE ", & - "M02N9FKYE ","M02N9FKZE ","M02N9FMXE ","M02N9FMYE ","M02N9FMZE ","M02N9MKXE ","M02N9MKYE ", & - "M02N9MKZE ","M02N9MMXE ","M02N9MMYE ","M02N9MMZE ","M02N9RAXE ","M02N9RAYE ","M02N9RAZE ", & - "M02N9RDXE ","M02N9RDYE ","M02N9RDZE ","M02N9TAXE ","M02N9TAYE ","M02N9TAZE ","M02N9TDXSS", & - "M02N9TDYSS","M02N9TDZSS","M03N1FKXE ","M03N1FKYE ","M03N1FKZE ","M03N1FMXE ","M03N1FMYE ", & - "M03N1FMZE ","M03N1MKXE ","M03N1MKYE ","M03N1MKZE ","M03N1MMXE ","M03N1MMYE ","M03N1MMZE ", & - "M03N1RAXE ","M03N1RAYE ","M03N1RAZE ","M03N1RDXE ","M03N1RDYE ","M03N1RDZE ","M03N1TAXE ", & - "M03N1TAYE ","M03N1TAZE ","M03N1TDXSS","M03N1TDYSS","M03N1TDZSS","M03N2FKXE ","M03N2FKYE ", & - "M03N2FKZE ","M03N2FMXE ","M03N2FMYE ","M03N2FMZE ","M03N2MKXE ","M03N2MKYE ","M03N2MKZE ", & - "M03N2MMXE ","M03N2MMYE ","M03N2MMZE ","M03N2RAXE ","M03N2RAYE ","M03N2RAZE ","M03N2RDXE ", & - "M03N2RDYE ","M03N2RDZE ","M03N2TAXE ","M03N2TAYE ","M03N2TAZE ","M03N2TDXSS","M03N2TDYSS", & - "M03N2TDZSS","M03N3FKXE ","M03N3FKYE ","M03N3FKZE ","M03N3FMXE ","M03N3FMYE ","M03N3FMZE ", & - "M03N3MKXE ","M03N3MKYE ","M03N3MKZE ","M03N3MMXE ","M03N3MMYE ","M03N3MMZE ","M03N3RAXE ", & - "M03N3RAYE ","M03N3RAZE ","M03N3RDXE ","M03N3RDYE ","M03N3RDZE ","M03N3TAXE ","M03N3TAYE ", & - "M03N3TAZE ","M03N3TDXSS","M03N3TDYSS","M03N3TDZSS","M03N4FKXE ","M03N4FKYE ","M03N4FKZE ", & - "M03N4FMXE ","M03N4FMYE ","M03N4FMZE ","M03N4MKXE ","M03N4MKYE ","M03N4MKZE ","M03N4MMXE ", & - "M03N4MMYE ","M03N4MMZE ","M03N4RAXE ","M03N4RAYE ","M03N4RAZE ","M03N4RDXE ","M03N4RDYE ", & - "M03N4RDZE ","M03N4TAXE ","M03N4TAYE ","M03N4TAZE ","M03N4TDXSS","M03N4TDYSS","M03N4TDZSS", & - "M03N5FKXE ","M03N5FKYE ","M03N5FKZE ","M03N5FMXE ","M03N5FMYE ","M03N5FMZE ","M03N5MKXE ", & - "M03N5MKYE ","M03N5MKZE ","M03N5MMXE ","M03N5MMYE ","M03N5MMZE ","M03N5RAXE ","M03N5RAYE ", & - "M03N5RAZE ","M03N5RDXE ","M03N5RDYE ","M03N5RDZE ","M03N5TAXE ","M03N5TAYE ","M03N5TAZE ", & - "M03N5TDXSS","M03N5TDYSS","M03N5TDZSS","M03N6FKXE ","M03N6FKYE ","M03N6FKZE ","M03N6FMXE ", & - "M03N6FMYE ","M03N6FMZE ","M03N6MKXE ","M03N6MKYE ","M03N6MKZE ","M03N6MMXE ","M03N6MMYE ", & - "M03N6MMZE ","M03N6RAXE ","M03N6RAYE ","M03N6RAZE ","M03N6RDXE ","M03N6RDYE ","M03N6RDZE ", & - "M03N6TAXE ","M03N6TAYE ","M03N6TAZE ","M03N6TDXSS","M03N6TDYSS","M03N6TDZSS","M03N7FKXE ", & - "M03N7FKYE ","M03N7FKZE ","M03N7FMXE ","M03N7FMYE ","M03N7FMZE ","M03N7MKXE ","M03N7MKYE ", & - "M03N7MKZE ","M03N7MMXE ","M03N7MMYE ","M03N7MMZE ","M03N7RAXE ","M03N7RAYE ","M03N7RAZE ", & - "M03N7RDXE ","M03N7RDYE ","M03N7RDZE ","M03N7TAXE ","M03N7TAYE ","M03N7TAZE ","M03N7TDXSS", & - "M03N7TDYSS","M03N7TDZSS","M03N8FKXE ","M03N8FKYE ","M03N8FKZE ","M03N8FMXE ","M03N8FMYE ", & - "M03N8FMZE ","M03N8MKXE ","M03N8MKYE ","M03N8MKZE ","M03N8MMXE ","M03N8MMYE ","M03N8MMZE ", & - "M03N8RAXE ","M03N8RAYE ","M03N8RAZE ","M03N8RDXE ","M03N8RDYE ","M03N8RDZE ","M03N8TAXE ", & - "M03N8TAYE ","M03N8TAZE ","M03N8TDXSS","M03N8TDYSS","M03N8TDZSS","M03N9FKXE ","M03N9FKYE ", & - "M03N9FKZE ","M03N9FMXE ","M03N9FMYE ","M03N9FMZE ","M03N9MKXE ","M03N9MKYE ","M03N9MKZE ", & - "M03N9MMXE ","M03N9MMYE ","M03N9MMZE ","M03N9RAXE ","M03N9RAYE ","M03N9RAZE ","M03N9RDXE ", & - "M03N9RDYE ","M03N9RDZE ","M03N9TAXE ","M03N9TAYE ","M03N9TAZE ","M03N9TDXSS","M03N9TDYSS", & - "M03N9TDZSS","M04N1FKXE ","M04N1FKYE ","M04N1FKZE ","M04N1FMXE ","M04N1FMYE ","M04N1FMZE ", & - "M04N1MKXE ","M04N1MKYE ","M04N1MKZE ","M04N1MMXE ","M04N1MMYE ","M04N1MMZE ","M04N1RAXE ", & - "M04N1RAYE ","M04N1RAZE ","M04N1RDXE ","M04N1RDYE ","M04N1RDZE ","M04N1TAXE ","M04N1TAYE ", & - "M04N1TAZE ","M04N1TDXSS","M04N1TDYSS","M04N1TDZSS","M04N2FKXE ","M04N2FKYE ","M04N2FKZE ", & - "M04N2FMXE ","M04N2FMYE ","M04N2FMZE ","M04N2MKXE ","M04N2MKYE ","M04N2MKZE ","M04N2MMXE ", & - "M04N2MMYE ","M04N2MMZE ","M04N2RAXE ","M04N2RAYE ","M04N2RAZE ","M04N2RDXE ","M04N2RDYE ", & - "M04N2RDZE ","M04N2TAXE ","M04N2TAYE ","M04N2TAZE ","M04N2TDXSS","M04N2TDYSS","M04N2TDZSS", & - "M04N3FKXE ","M04N3FKYE ","M04N3FKZE ","M04N3FMXE ","M04N3FMYE ","M04N3FMZE ","M04N3MKXE ", & - "M04N3MKYE ","M04N3MKZE ","M04N3MMXE ","M04N3MMYE ","M04N3MMZE ","M04N3RAXE ","M04N3RAYE ", & - "M04N3RAZE ","M04N3RDXE ","M04N3RDYE ","M04N3RDZE ","M04N3TAXE ","M04N3TAYE ","M04N3TAZE ", & - "M04N3TDXSS","M04N3TDYSS","M04N3TDZSS","M04N4FKXE ","M04N4FKYE ","M04N4FKZE ","M04N4FMXE ", & - "M04N4FMYE ","M04N4FMZE ","M04N4MKXE ","M04N4MKYE ","M04N4MKZE ","M04N4MMXE ","M04N4MMYE ", & - "M04N4MMZE ","M04N4RAXE ","M04N4RAYE ","M04N4RAZE ","M04N4RDXE ","M04N4RDYE ","M04N4RDZE ", & - "M04N4TAXE ","M04N4TAYE ","M04N4TAZE ","M04N4TDXSS","M04N4TDYSS","M04N4TDZSS","M04N5FKXE ", & - "M04N5FKYE ","M04N5FKZE ","M04N5FMXE ","M04N5FMYE ","M04N5FMZE ","M04N5MKXE ","M04N5MKYE ", & - "M04N5MKZE ","M04N5MMXE ","M04N5MMYE ","M04N5MMZE ","M04N5RAXE ","M04N5RAYE ","M04N5RAZE ", & - "M04N5RDXE ","M04N5RDYE ","M04N5RDZE ","M04N5TAXE ","M04N5TAYE ","M04N5TAZE ","M04N5TDXSS", & - "M04N5TDYSS","M04N5TDZSS","M04N6FKXE ","M04N6FKYE ","M04N6FKZE ","M04N6FMXE ","M04N6FMYE ", & - "M04N6FMZE ","M04N6MKXE ","M04N6MKYE ","M04N6MKZE ","M04N6MMXE ","M04N6MMYE ","M04N6MMZE ", & - "M04N6RAXE ","M04N6RAYE ","M04N6RAZE ","M04N6RDXE ","M04N6RDYE ","M04N6RDZE ","M04N6TAXE ", & - "M04N6TAYE ","M04N6TAZE ","M04N6TDXSS","M04N6TDYSS","M04N6TDZSS","M04N7FKXE ","M04N7FKYE ", & - "M04N7FKZE ","M04N7FMXE ","M04N7FMYE ","M04N7FMZE ","M04N7MKXE ","M04N7MKYE ","M04N7MKZE ", & - "M04N7MMXE ","M04N7MMYE ","M04N7MMZE ","M04N7RAXE ","M04N7RAYE ","M04N7RAZE ","M04N7RDXE ", & - "M04N7RDYE ","M04N7RDZE ","M04N7TAXE ","M04N7TAYE ","M04N7TAZE ","M04N7TDXSS","M04N7TDYSS", & - "M04N7TDZSS","M04N8FKXE ","M04N8FKYE ","M04N8FKZE ","M04N8FMXE ","M04N8FMYE ","M04N8FMZE ", & - "M04N8MKXE ","M04N8MKYE ","M04N8MKZE ","M04N8MMXE ","M04N8MMYE ","M04N8MMZE ","M04N8RAXE ", & - "M04N8RAYE ","M04N8RAZE ","M04N8RDXE ","M04N8RDYE ","M04N8RDZE ","M04N8TAXE ","M04N8TAYE ", & - "M04N8TAZE ","M04N8TDXSS","M04N8TDYSS","M04N8TDZSS","M04N9FKXE ","M04N9FKYE ","M04N9FKZE ", & - "M04N9FMXE ","M04N9FMYE ","M04N9FMZE ","M04N9MKXE ","M04N9MKYE ","M04N9MKZE ","M04N9MMXE ", & - "M04N9MMYE ","M04N9MMZE ","M04N9RAXE ","M04N9RAYE ","M04N9RAZE ","M04N9RDXE ","M04N9RDYE ", & - "M04N9RDZE ","M04N9TAXE ","M04N9TAYE ","M04N9TAZE ","M04N9TDXSS","M04N9TDYSS","M04N9TDZSS", & - "M05N1FKXE ","M05N1FKYE ","M05N1FKZE ","M05N1FMXE ","M05N1FMYE ","M05N1FMZE ","M05N1MKXE ", & - "M05N1MKYE ","M05N1MKZE ","M05N1MMXE ","M05N1MMYE ","M05N1MMZE ","M05N1RAXE ","M05N1RAYE ", & - "M05N1RAZE ","M05N1RDXE ","M05N1RDYE ","M05N1RDZE ","M05N1TAXE ","M05N1TAYE ","M05N1TAZE ", & - "M05N1TDXSS","M05N1TDYSS","M05N1TDZSS","M05N2FKXE ","M05N2FKYE ","M05N2FKZE ","M05N2FMXE ", & - "M05N2FMYE ","M05N2FMZE ","M05N2MKXE ","M05N2MKYE ","M05N2MKZE ","M05N2MMXE ","M05N2MMYE ", & - "M05N2MMZE ","M05N2RAXE ","M05N2RAYE ","M05N2RAZE ","M05N2RDXE ","M05N2RDYE ","M05N2RDZE ", & - "M05N2TAXE ","M05N2TAYE ","M05N2TAZE ","M05N2TDXSS","M05N2TDYSS","M05N2TDZSS","M05N3FKXE ", & - "M05N3FKYE ","M05N3FKZE ","M05N3FMXE ","M05N3FMYE ","M05N3FMZE ","M05N3MKXE ","M05N3MKYE ", & - "M05N3MKZE ","M05N3MMXE ","M05N3MMYE ","M05N3MMZE ","M05N3RAXE ","M05N3RAYE ","M05N3RAZE ", & - "M05N3RDXE ","M05N3RDYE ","M05N3RDZE ","M05N3TAXE ","M05N3TAYE ","M05N3TAZE ","M05N3TDXSS", & - "M05N3TDYSS","M05N3TDZSS","M05N4FKXE ","M05N4FKYE ","M05N4FKZE ","M05N4FMXE ","M05N4FMYE ", & - "M05N4FMZE ","M05N4MKXE ","M05N4MKYE ","M05N4MKZE ","M05N4MMXE ","M05N4MMYE ","M05N4MMZE ", & - "M05N4RAXE ","M05N4RAYE ","M05N4RAZE ","M05N4RDXE ","M05N4RDYE ","M05N4RDZE ","M05N4TAXE ", & - "M05N4TAYE ","M05N4TAZE ","M05N4TDXSS","M05N4TDYSS","M05N4TDZSS","M05N5FKXE ","M05N5FKYE ", & - "M05N5FKZE ","M05N5FMXE ","M05N5FMYE ","M05N5FMZE ","M05N5MKXE ","M05N5MKYE ","M05N5MKZE ", & - "M05N5MMXE ","M05N5MMYE ","M05N5MMZE ","M05N5RAXE ","M05N5RAYE ","M05N5RAZE ","M05N5RDXE ", & - "M05N5RDYE ","M05N5RDZE ","M05N5TAXE ","M05N5TAYE ","M05N5TAZE ","M05N5TDXSS","M05N5TDYSS", & - "M05N5TDZSS","M05N6FKXE ","M05N6FKYE ","M05N6FKZE ","M05N6FMXE ","M05N6FMYE ","M05N6FMZE ", & - "M05N6MKXE ","M05N6MKYE ","M05N6MKZE ","M05N6MMXE ","M05N6MMYE ","M05N6MMZE ","M05N6RAXE ", & - "M05N6RAYE ","M05N6RAZE ","M05N6RDXE ","M05N6RDYE ","M05N6RDZE ","M05N6TAXE ","M05N6TAYE ", & - "M05N6TAZE ","M05N6TDXSS","M05N6TDYSS","M05N6TDZSS","M05N7FKXE ","M05N7FKYE ","M05N7FKZE ", & - "M05N7FMXE ","M05N7FMYE ","M05N7FMZE ","M05N7MKXE ","M05N7MKYE ","M05N7MKZE ","M05N7MMXE ", & - "M05N7MMYE ","M05N7MMZE ","M05N7RAXE ","M05N7RAYE ","M05N7RAZE ","M05N7RDXE ","M05N7RDYE ", & - "M05N7RDZE ","M05N7TAXE ","M05N7TAYE ","M05N7TAZE ","M05N7TDXSS","M05N7TDYSS","M05N7TDZSS", & - "M05N8FKXE ","M05N8FKYE ","M05N8FKZE ","M05N8FMXE ","M05N8FMYE ","M05N8FMZE ","M05N8MKXE ", & - "M05N8MKYE ","M05N8MKZE ","M05N8MMXE ","M05N8MMYE ","M05N8MMZE ","M05N8RAXE ","M05N8RAYE ", & - "M05N8RAZE ","M05N8RDXE ","M05N8RDYE ","M05N8RDZE ","M05N8TAXE ","M05N8TAYE ","M05N8TAZE ", & - "M05N8TDXSS","M05N8TDYSS","M05N8TDZSS","M05N9FKXE ","M05N9FKYE ","M05N9FKZE ","M05N9FMXE ", & - "M05N9FMYE ","M05N9FMZE ","M05N9MKXE ","M05N9MKYE ","M05N9MKZE ","M05N9MMXE ","M05N9MMYE ", & - "M05N9MMZE ","M05N9RAXE ","M05N9RAYE ","M05N9RAZE ","M05N9RDXE ","M05N9RDYE ","M05N9RDZE ", & - "M05N9TAXE ","M05N9TAYE ","M05N9TAZE ","M05N9TDXSS","M05N9TDYSS","M05N9TDZSS","M06N1FKXE ", & - "M06N1FKYE ","M06N1FKZE ","M06N1FMXE ","M06N1FMYE ","M06N1FMZE ","M06N1MKXE ","M06N1MKYE ", & - "M06N1MKZE ","M06N1MMXE ","M06N1MMYE ","M06N1MMZE ","M06N1RAXE ","M06N1RAYE ","M06N1RAZE ", & - "M06N1RDXE ","M06N1RDYE ","M06N1RDZE ","M06N1TAXE ","M06N1TAYE ","M06N1TAZE ","M06N1TDXSS", & - "M06N1TDYSS","M06N1TDZSS","M06N2FKXE ","M06N2FKYE ","M06N2FKZE ","M06N2FMXE ","M06N2FMYE ", & - "M06N2FMZE ","M06N2MKXE ","M06N2MKYE ","M06N2MKZE ","M06N2MMXE ","M06N2MMYE ","M06N2MMZE ", & - "M06N2RAXE ","M06N2RAYE ","M06N2RAZE ","M06N2RDXE ","M06N2RDYE ","M06N2RDZE ","M06N2TAXE ", & - "M06N2TAYE ","M06N2TAZE ","M06N2TDXSS","M06N2TDYSS","M06N2TDZSS","M06N3FKXE ","M06N3FKYE ", & - "M06N3FKZE ","M06N3FMXE ","M06N3FMYE ","M06N3FMZE ","M06N3MKXE ","M06N3MKYE ","M06N3MKZE ", & - "M06N3MMXE ","M06N3MMYE ","M06N3MMZE ","M06N3RAXE ","M06N3RAYE ","M06N3RAZE ","M06N3RDXE ", & - "M06N3RDYE ","M06N3RDZE ","M06N3TAXE ","M06N3TAYE ","M06N3TAZE ","M06N3TDXSS","M06N3TDYSS", & - "M06N3TDZSS","M06N4FKXE ","M06N4FKYE ","M06N4FKZE ","M06N4FMXE ","M06N4FMYE ","M06N4FMZE ", & - "M06N4MKXE ","M06N4MKYE ","M06N4MKZE ","M06N4MMXE ","M06N4MMYE ","M06N4MMZE ","M06N4RAXE ", & - "M06N4RAYE ","M06N4RAZE ","M06N4RDXE ","M06N4RDYE ","M06N4RDZE ","M06N4TAXE ","M06N4TAYE ", & - "M06N4TAZE ","M06N4TDXSS","M06N4TDYSS","M06N4TDZSS","M06N5FKXE ","M06N5FKYE ","M06N5FKZE ", & - "M06N5FMXE ","M06N5FMYE ","M06N5FMZE ","M06N5MKXE ","M06N5MKYE ","M06N5MKZE ","M06N5MMXE ", & - "M06N5MMYE ","M06N5MMZE ","M06N5RAXE ","M06N5RAYE ","M06N5RAZE ","M06N5RDXE ","M06N5RDYE ", & - "M06N5RDZE ","M06N5TAXE ","M06N5TAYE ","M06N5TAZE ","M06N5TDXSS","M06N5TDYSS","M06N5TDZSS", & - "M06N6FKXE ","M06N6FKYE ","M06N6FKZE ","M06N6FMXE ","M06N6FMYE ","M06N6FMZE ","M06N6MKXE ", & - "M06N6MKYE ","M06N6MKZE ","M06N6MMXE ","M06N6MMYE ","M06N6MMZE ","M06N6RAXE ","M06N6RAYE ", & - "M06N6RAZE ","M06N6RDXE ","M06N6RDYE ","M06N6RDZE ","M06N6TAXE ","M06N6TAYE ","M06N6TAZE ", & - "M06N6TDXSS","M06N6TDYSS","M06N6TDZSS","M06N7FKXE ","M06N7FKYE ","M06N7FKZE ","M06N7FMXE ", & - "M06N7FMYE ","M06N7FMZE ","M06N7MKXE ","M06N7MKYE ","M06N7MKZE ","M06N7MMXE ","M06N7MMYE ", & - "M06N7MMZE ","M06N7RAXE ","M06N7RAYE ","M06N7RAZE ","M06N7RDXE ","M06N7RDYE ","M06N7RDZE ", & - "M06N7TAXE ","M06N7TAYE ","M06N7TAZE ","M06N7TDXSS","M06N7TDYSS","M06N7TDZSS","M06N8FKXE ", & - "M06N8FKYE ","M06N8FKZE ","M06N8FMXE ","M06N8FMYE ","M06N8FMZE ","M06N8MKXE ","M06N8MKYE ", & - "M06N8MKZE ","M06N8MMXE ","M06N8MMYE ","M06N8MMZE ","M06N8RAXE ","M06N8RAYE ","M06N8RAZE ", & - "M06N8RDXE ","M06N8RDYE ","M06N8RDZE ","M06N8TAXE ","M06N8TAYE ","M06N8TAZE ","M06N8TDXSS", & - "M06N8TDYSS","M06N8TDZSS","M06N9FKXE ","M06N9FKYE ","M06N9FKZE ","M06N9FMXE ","M06N9FMYE ", & - "M06N9FMZE ","M06N9MKXE ","M06N9MKYE ","M06N9MKZE ","M06N9MMXE ","M06N9MMYE ","M06N9MMZE ", & - "M06N9RAXE ","M06N9RAYE ","M06N9RAZE ","M06N9RDXE ","M06N9RDYE ","M06N9RDZE ","M06N9TAXE ", & - "M06N9TAYE ","M06N9TAZE ","M06N9TDXSS","M06N9TDYSS","M06N9TDZSS","M07N1FKXE ","M07N1FKYE ", & - "M07N1FKZE ","M07N1FMXE ","M07N1FMYE ","M07N1FMZE ","M07N1MKXE ","M07N1MKYE ","M07N1MKZE ", & - "M07N1MMXE ","M07N1MMYE ","M07N1MMZE ","M07N1RAXE ","M07N1RAYE ","M07N1RAZE ","M07N1RDXE ", & - "M07N1RDYE ","M07N1RDZE ","M07N1TAXE ","M07N1TAYE ","M07N1TAZE ","M07N1TDXSS","M07N1TDYSS", & - "M07N1TDZSS","M07N2FKXE ","M07N2FKYE ","M07N2FKZE ","M07N2FMXE ","M07N2FMYE ","M07N2FMZE ", & - "M07N2MKXE ","M07N2MKYE ","M07N2MKZE ","M07N2MMXE ","M07N2MMYE ","M07N2MMZE ","M07N2RAXE ", & - "M07N2RAYE ","M07N2RAZE ","M07N2RDXE ","M07N2RDYE ","M07N2RDZE ","M07N2TAXE ","M07N2TAYE ", & - "M07N2TAZE ","M07N2TDXSS","M07N2TDYSS","M07N2TDZSS","M07N3FKXE ","M07N3FKYE ","M07N3FKZE ", & - "M07N3FMXE ","M07N3FMYE ","M07N3FMZE ","M07N3MKXE ","M07N3MKYE ","M07N3MKZE ","M07N3MMXE ", & - "M07N3MMYE ","M07N3MMZE ","M07N3RAXE ","M07N3RAYE ","M07N3RAZE ","M07N3RDXE ","M07N3RDYE ", & - "M07N3RDZE ","M07N3TAXE ","M07N3TAYE ","M07N3TAZE ","M07N3TDXSS","M07N3TDYSS","M07N3TDZSS", & - "M07N4FKXE ","M07N4FKYE ","M07N4FKZE ","M07N4FMXE ","M07N4FMYE ","M07N4FMZE ","M07N4MKXE ", & - "M07N4MKYE ","M07N4MKZE ","M07N4MMXE ","M07N4MMYE ","M07N4MMZE ","M07N4RAXE ","M07N4RAYE ", & - "M07N4RAZE ","M07N4RDXE ","M07N4RDYE ","M07N4RDZE ","M07N4TAXE ","M07N4TAYE ","M07N4TAZE ", & - "M07N4TDXSS","M07N4TDYSS","M07N4TDZSS","M07N5FKXE ","M07N5FKYE ","M07N5FKZE ","M07N5FMXE ", & - "M07N5FMYE ","M07N5FMZE ","M07N5MKXE ","M07N5MKYE ","M07N5MKZE ","M07N5MMXE ","M07N5MMYE ", & - "M07N5MMZE ","M07N5RAXE ","M07N5RAYE ","M07N5RAZE ","M07N5RDXE ","M07N5RDYE ","M07N5RDZE ", & - "M07N5TAXE ","M07N5TAYE ","M07N5TAZE ","M07N5TDXSS","M07N5TDYSS","M07N5TDZSS","M07N6FKXE ", & - "M07N6FKYE ","M07N6FKZE ","M07N6FMXE ","M07N6FMYE ","M07N6FMZE ","M07N6MKXE ","M07N6MKYE ", & - "M07N6MKZE ","M07N6MMXE ","M07N6MMYE ","M07N6MMZE ","M07N6RAXE ","M07N6RAYE ","M07N6RAZE ", & - "M07N6RDXE ","M07N6RDYE ","M07N6RDZE ","M07N6TAXE ","M07N6TAYE ","M07N6TAZE ","M07N6TDXSS", & - "M07N6TDYSS","M07N6TDZSS","M07N7FKXE ","M07N7FKYE ","M07N7FKZE ","M07N7FMXE ","M07N7FMYE ", & - "M07N7FMZE ","M07N7MKXE ","M07N7MKYE ","M07N7MKZE ","M07N7MMXE ","M07N7MMYE ","M07N7MMZE ", & - "M07N7RAXE ","M07N7RAYE ","M07N7RAZE ","M07N7RDXE ","M07N7RDYE ","M07N7RDZE ","M07N7TAXE ", & - "M07N7TAYE ","M07N7TAZE ","M07N7TDXSS","M07N7TDYSS","M07N7TDZSS","M07N8FKXE ","M07N8FKYE ", & - "M07N8FKZE ","M07N8FMXE ","M07N8FMYE ","M07N8FMZE ","M07N8MKXE ","M07N8MKYE ","M07N8MKZE ", & - "M07N8MMXE ","M07N8MMYE ","M07N8MMZE ","M07N8RAXE ","M07N8RAYE ","M07N8RAZE ","M07N8RDXE ", & - "M07N8RDYE ","M07N8RDZE ","M07N8TAXE ","M07N8TAYE ","M07N8TAZE ","M07N8TDXSS","M07N8TDYSS", & - "M07N8TDZSS","M07N9FKXE ","M07N9FKYE ","M07N9FKZE ","M07N9FMXE ","M07N9FMYE ","M07N9FMZE ", & - "M07N9MKXE ","M07N9MKYE ","M07N9MKZE ","M07N9MMXE ","M07N9MMYE ","M07N9MMZE ","M07N9RAXE ", & - "M07N9RAYE ","M07N9RAZE ","M07N9RDXE ","M07N9RDYE ","M07N9RDZE ","M07N9TAXE ","M07N9TAYE ", & - "M07N9TAZE ","M07N9TDXSS","M07N9TDYSS","M07N9TDZSS","M08N1FKXE ","M08N1FKYE ","M08N1FKZE ", & - "M08N1FMXE ","M08N1FMYE ","M08N1FMZE ","M08N1MKXE ","M08N1MKYE ","M08N1MKZE ","M08N1MMXE ", & - "M08N1MMYE ","M08N1MMZE ","M08N1RAXE ","M08N1RAYE ","M08N1RAZE ","M08N1RDXE ","M08N1RDYE ", & - "M08N1RDZE ","M08N1TAXE ","M08N1TAYE ","M08N1TAZE ","M08N1TDXSS","M08N1TDYSS","M08N1TDZSS", & - "M08N2FKXE ","M08N2FKYE ","M08N2FKZE ","M08N2FMXE ","M08N2FMYE ","M08N2FMZE ","M08N2MKXE ", & - "M08N2MKYE ","M08N2MKZE ","M08N2MMXE ","M08N2MMYE ","M08N2MMZE ","M08N2RAXE ","M08N2RAYE ", & - "M08N2RAZE ","M08N2RDXE ","M08N2RDYE ","M08N2RDZE ","M08N2TAXE ","M08N2TAYE ","M08N2TAZE ", & - "M08N2TDXSS","M08N2TDYSS","M08N2TDZSS","M08N3FKXE ","M08N3FKYE ","M08N3FKZE ","M08N3FMXE ", & - "M08N3FMYE ","M08N3FMZE ","M08N3MKXE ","M08N3MKYE ","M08N3MKZE ","M08N3MMXE ","M08N3MMYE ", & - "M08N3MMZE ","M08N3RAXE ","M08N3RAYE ","M08N3RAZE ","M08N3RDXE ","M08N3RDYE ","M08N3RDZE ", & - "M08N3TAXE ","M08N3TAYE ","M08N3TAZE ","M08N3TDXSS","M08N3TDYSS","M08N3TDZSS","M08N4FKXE ", & - "M08N4FKYE ","M08N4FKZE ","M08N4FMXE ","M08N4FMYE ","M08N4FMZE ","M08N4MKXE ","M08N4MKYE ", & - "M08N4MKZE ","M08N4MMXE ","M08N4MMYE ","M08N4MMZE ","M08N4RAXE ","M08N4RAYE ","M08N4RAZE ", & - "M08N4RDXE ","M08N4RDYE ","M08N4RDZE ","M08N4TAXE ","M08N4TAYE ","M08N4TAZE ","M08N4TDXSS", & - "M08N4TDYSS","M08N4TDZSS","M08N5FKXE ","M08N5FKYE ","M08N5FKZE ","M08N5FMXE ","M08N5FMYE ", & - "M08N5FMZE ","M08N5MKXE ","M08N5MKYE ","M08N5MKZE ","M08N5MMXE ","M08N5MMYE ","M08N5MMZE ", & - "M08N5RAXE ","M08N5RAYE ","M08N5RAZE ","M08N5RDXE ","M08N5RDYE ","M08N5RDZE ","M08N5TAXE ", & - "M08N5TAYE ","M08N5TAZE ","M08N5TDXSS","M08N5TDYSS","M08N5TDZSS","M08N6FKXE ","M08N6FKYE ", & - "M08N6FKZE ","M08N6FMXE ","M08N6FMYE ","M08N6FMZE ","M08N6MKXE ","M08N6MKYE ","M08N6MKZE ", & - "M08N6MMXE ","M08N6MMYE ","M08N6MMZE ","M08N6RAXE ","M08N6RAYE ","M08N6RAZE ","M08N6RDXE ", & - "M08N6RDYE ","M08N6RDZE ","M08N6TAXE ","M08N6TAYE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry2(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M08N6TAZE ","M08N6TDXSS","M08N6TDYSS","M08N6TDZSS","M08N7FKXE ","M08N7FKYE ","M08N7FKZE ", & - "M08N7FMXE ","M08N7FMYE ","M08N7FMZE ","M08N7MKXE ","M08N7MKYE ","M08N7MKZE ","M08N7MMXE ", & - "M08N7MMYE ","M08N7MMZE ","M08N7RAXE ","M08N7RAYE ","M08N7RAZE ","M08N7RDXE ","M08N7RDYE ", & - "M08N7RDZE ","M08N7TAXE ","M08N7TAYE ","M08N7TAZE ","M08N7TDXSS","M08N7TDYSS","M08N7TDZSS", & - "M08N8FKXE ","M08N8FKYE ","M08N8FKZE ","M08N8FMXE ","M08N8FMYE ","M08N8FMZE ","M08N8MKXE ", & - "M08N8MKYE ","M08N8MKZE ","M08N8MMXE ","M08N8MMYE ","M08N8MMZE ","M08N8RAXE ","M08N8RAYE ", & - "M08N8RAZE ","M08N8RDXE ","M08N8RDYE ","M08N8RDZE ","M08N8TAXE ","M08N8TAYE ","M08N8TAZE ", & - "M08N8TDXSS","M08N8TDYSS","M08N8TDZSS","M08N9FKXE ","M08N9FKYE ","M08N9FKZE ","M08N9FMXE ", & - "M08N9FMYE ","M08N9FMZE ","M08N9MKXE ","M08N9MKYE ","M08N9MKZE ","M08N9MMXE ","M08N9MMYE ", & - "M08N9MMZE ","M08N9RAXE ","M08N9RAYE ","M08N9RAZE ","M08N9RDXE ","M08N9RDYE ","M08N9RDZE ", & - "M08N9TAXE ","M08N9TAYE ","M08N9TAZE ","M08N9TDXSS","M08N9TDYSS","M08N9TDZSS","M09N1FKXE ", & - "M09N1FKYE ","M09N1FKZE ","M09N1FMXE ","M09N1FMYE ","M09N1FMZE ","M09N1MKXE ","M09N1MKYE ", & - "M09N1MKZE ","M09N1MMXE ","M09N1MMYE ","M09N1MMZE ","M09N1RAXE ","M09N1RAYE ","M09N1RAZE ", & - "M09N1RDXE ","M09N1RDYE ","M09N1RDZE ","M09N1TAXE ","M09N1TAYE ","M09N1TAZE ","M09N1TDXSS", & - "M09N1TDYSS","M09N1TDZSS","M09N2FKXE ","M09N2FKYE ","M09N2FKZE ","M09N2FMXE ","M09N2FMYE ", & - "M09N2FMZE ","M09N2MKXE ","M09N2MKYE ","M09N2MKZE ","M09N2MMXE ","M09N2MMYE ","M09N2MMZE ", & - "M09N2RAXE ","M09N2RAYE ","M09N2RAZE ","M09N2RDXE ","M09N2RDYE ","M09N2RDZE ","M09N2TAXE ", & - "M09N2TAYE ","M09N2TAZE ","M09N2TDXSS","M09N2TDYSS","M09N2TDZSS","M09N3FKXE ","M09N3FKYE ", & - "M09N3FKZE ","M09N3FMXE ","M09N3FMYE ","M09N3FMZE ","M09N3MKXE ","M09N3MKYE ","M09N3MKZE ", & - "M09N3MMXE ","M09N3MMYE ","M09N3MMZE ","M09N3RAXE ","M09N3RAYE ","M09N3RAZE ","M09N3RDXE ", & - "M09N3RDYE ","M09N3RDZE ","M09N3TAXE ","M09N3TAYE ","M09N3TAZE ","M09N3TDXSS","M09N3TDYSS", & - "M09N3TDZSS","M09N4FKXE ","M09N4FKYE ","M09N4FKZE ","M09N4FMXE ","M09N4FMYE ","M09N4FMZE ", & - "M09N4MKXE ","M09N4MKYE ","M09N4MKZE ","M09N4MMXE ","M09N4MMYE ","M09N4MMZE ","M09N4RAXE ", & - "M09N4RAYE ","M09N4RAZE ","M09N4RDXE ","M09N4RDYE ","M09N4RDZE ","M09N4TAXE ","M09N4TAYE ", & - "M09N4TAZE ","M09N4TDXSS","M09N4TDYSS","M09N4TDZSS","M09N5FKXE ","M09N5FKYE ","M09N5FKZE ", & - "M09N5FMXE ","M09N5FMYE ","M09N5FMZE ","M09N5MKXE ","M09N5MKYE ","M09N5MKZE ","M09N5MMXE ", & - "M09N5MMYE ","M09N5MMZE ","M09N5RAXE ","M09N5RAYE ","M09N5RAZE ","M09N5RDXE ","M09N5RDYE ", & - "M09N5RDZE ","M09N5TAXE ","M09N5TAYE ","M09N5TAZE ","M09N5TDXSS","M09N5TDYSS","M09N5TDZSS", & - "M09N6FKXE ","M09N6FKYE ","M09N6FKZE ","M09N6FMXE ","M09N6FMYE ","M09N6FMZE ","M09N6MKXE ", & - "M09N6MKYE ","M09N6MKZE ","M09N6MMXE ","M09N6MMYE ","M09N6MMZE ","M09N6RAXE ","M09N6RAYE ", & - "M09N6RAZE ","M09N6RDXE ","M09N6RDYE ","M09N6RDZE ","M09N6TAXE ","M09N6TAYE ","M09N6TAZE ", & - "M09N6TDXSS","M09N6TDYSS","M09N6TDZSS","M09N7FKXE ","M09N7FKYE ","M09N7FKZE ","M09N7FMXE ", & - "M09N7FMYE ","M09N7FMZE ","M09N7MKXE ","M09N7MKYE ","M09N7MKZE ","M09N7MMXE ","M09N7MMYE ", & - "M09N7MMZE ","M09N7RAXE ","M09N7RAYE ","M09N7RAZE ","M09N7RDXE ","M09N7RDYE ","M09N7RDZE ", & - "M09N7TAXE ","M09N7TAYE ","M09N7TAZE ","M09N7TDXSS","M09N7TDYSS","M09N7TDZSS","M09N8FKXE ", & - "M09N8FKYE ","M09N8FKZE ","M09N8FMXE ","M09N8FMYE ","M09N8FMZE ","M09N8MKXE ","M09N8MKYE ", & - "M09N8MKZE ","M09N8MMXE ","M09N8MMYE ","M09N8MMZE ","M09N8RAXE ","M09N8RAYE ","M09N8RAZE ", & - "M09N8RDXE ","M09N8RDYE ","M09N8RDZE ","M09N8TAXE ","M09N8TAYE ","M09N8TAZE ","M09N8TDXSS", & - "M09N8TDYSS","M09N8TDZSS","M09N9FKXE ","M09N9FKYE ","M09N9FKZE ","M09N9FMXE ","M09N9FMYE ", & - "M09N9FMZE ","M09N9MKXE ","M09N9MKYE ","M09N9MKZE ","M09N9MMXE ","M09N9MMYE ","M09N9MMZE ", & - "M09N9RAXE ","M09N9RAYE ","M09N9RAZE ","M09N9RDXE ","M09N9RDYE ","M09N9RDZE ","M09N9TAXE ", & - "M09N9TAYE ","M09N9TAZE ","M09N9TDXSS","M09N9TDYSS","M09N9TDZSS","M10N1FKXE ","M10N1FKYE ", & - "M10N1FKZE ","M10N1FMXE ","M10N1FMYE ","M10N1FMZE ","M10N1MKXE ","M10N1MKYE ","M10N1MKZE ", & - "M10N1MMXE ","M10N1MMYE ","M10N1MMZE ","M10N1RAXE ","M10N1RAYE ","M10N1RAZE ","M10N1RDXE ", & - "M10N1RDYE ","M10N1RDZE ","M10N1TAXE ","M10N1TAYE ","M10N1TAZE ","M10N1TDXSS","M10N1TDYSS", & - "M10N1TDZSS","M10N2FKXE ","M10N2FKYE ","M10N2FKZE ","M10N2FMXE ","M10N2FMYE ","M10N2FMZE ", & - "M10N2MKXE ","M10N2MKYE ","M10N2MKZE ","M10N2MMXE ","M10N2MMYE ","M10N2MMZE ","M10N2RAXE ", & - "M10N2RAYE ","M10N2RAZE ","M10N2RDXE ","M10N2RDYE ","M10N2RDZE ","M10N2TAXE ","M10N2TAYE ", & - "M10N2TAZE ","M10N2TDXSS","M10N2TDYSS","M10N2TDZSS","M10N3FKXE ","M10N3FKYE ","M10N3FKZE ", & - "M10N3FMXE ","M10N3FMYE ","M10N3FMZE ","M10N3MKXE ","M10N3MKYE ","M10N3MKZE ","M10N3MMXE ", & - "M10N3MMYE ","M10N3MMZE ","M10N3RAXE ","M10N3RAYE ","M10N3RAZE ","M10N3RDXE ","M10N3RDYE ", & - "M10N3RDZE ","M10N3TAXE ","M10N3TAYE ","M10N3TAZE ","M10N3TDXSS","M10N3TDYSS","M10N3TDZSS", & - "M10N4FKXE ","M10N4FKYE ","M10N4FKZE ","M10N4FMXE ","M10N4FMYE ","M10N4FMZE ","M10N4MKXE ", & - "M10N4MKYE ","M10N4MKZE ","M10N4MMXE ","M10N4MMYE ","M10N4MMZE ","M10N4RAXE ","M10N4RAYE ", & - "M10N4RAZE ","M10N4RDXE ","M10N4RDYE ","M10N4RDZE ","M10N4TAXE ","M10N4TAYE ","M10N4TAZE ", & - "M10N4TDXSS","M10N4TDYSS","M10N4TDZSS","M10N5FKXE ","M10N5FKYE ","M10N5FKZE ","M10N5FMXE ", & - "M10N5FMYE ","M10N5FMZE ","M10N5MKXE ","M10N5MKYE ","M10N5MKZE ","M10N5MMXE ","M10N5MMYE ", & - "M10N5MMZE ","M10N5RAXE ","M10N5RAYE ","M10N5RAZE ","M10N5RDXE ","M10N5RDYE ","M10N5RDZE ", & - "M10N5TAXE ","M10N5TAYE ","M10N5TAZE ","M10N5TDXSS","M10N5TDYSS","M10N5TDZSS","M10N6FKXE ", & - "M10N6FKYE ","M10N6FKZE ","M10N6FMXE ","M10N6FMYE ","M10N6FMZE ","M10N6MKXE ","M10N6MKYE ", & - "M10N6MKZE ","M10N6MMXE ","M10N6MMYE ","M10N6MMZE ","M10N6RAXE ","M10N6RAYE ","M10N6RAZE ", & - "M10N6RDXE ","M10N6RDYE ","M10N6RDZE ","M10N6TAXE ","M10N6TAYE ","M10N6TAZE ","M10N6TDXSS", & - "M10N6TDYSS","M10N6TDZSS","M10N7FKXE ","M10N7FKYE ","M10N7FKZE ","M10N7FMXE ","M10N7FMYE ", & - "M10N7FMZE ","M10N7MKXE ","M10N7MKYE ","M10N7MKZE ","M10N7MMXE ","M10N7MMYE ","M10N7MMZE ", & - "M10N7RAXE ","M10N7RAYE ","M10N7RAZE ","M10N7RDXE ","M10N7RDYE ","M10N7RDZE ","M10N7TAXE ", & - "M10N7TAYE ","M10N7TAZE ","M10N7TDXSS","M10N7TDYSS","M10N7TDZSS","M10N8FKXE ","M10N8FKYE ", & - "M10N8FKZE ","M10N8FMXE ","M10N8FMYE ","M10N8FMZE ","M10N8MKXE ","M10N8MKYE ","M10N8MKZE ", & - "M10N8MMXE ","M10N8MMYE ","M10N8MMZE ","M10N8RAXE ","M10N8RAYE ","M10N8RAZE ","M10N8RDXE ", & - "M10N8RDYE ","M10N8RDZE ","M10N8TAXE ","M10N8TAYE ","M10N8TAZE ","M10N8TDXSS","M10N8TDYSS", & - "M10N8TDZSS","M10N9FKXE ","M10N9FKYE ","M10N9FKZE ","M10N9FMXE ","M10N9FMYE ","M10N9FMZE ", & - "M10N9MKXE ","M10N9MKYE ","M10N9MKZE ","M10N9MMXE ","M10N9MMYE ","M10N9MMZE ","M10N9RAXE ", & - "M10N9RAYE ","M10N9RAZE ","M10N9RDXE ","M10N9RDYE ","M10N9RDZE ","M10N9TAXE ","M10N9TAYE ", & - "M10N9TAZE ","M10N9TDXSS","M10N9TDYSS","M10N9TDZSS","M11N1FKXE ","M11N1FKYE ","M11N1FKZE ", & - "M11N1FMXE ","M11N1FMYE ","M11N1FMZE ","M11N1MKXE ","M11N1MKYE ","M11N1MKZE ","M11N1MMXE ", & - "M11N1MMYE ","M11N1MMZE ","M11N1RAXE ","M11N1RAYE ","M11N1RAZE ","M11N1RDXE ","M11N1RDYE ", & - "M11N1RDZE ","M11N1TAXE ","M11N1TAYE ","M11N1TAZE ","M11N1TDXSS","M11N1TDYSS","M11N1TDZSS", & - "M11N2FKXE ","M11N2FKYE ","M11N2FKZE ","M11N2FMXE ","M11N2FMYE ","M11N2FMZE ","M11N2MKXE ", & - "M11N2MKYE ","M11N2MKZE ","M11N2MMXE ","M11N2MMYE ","M11N2MMZE ","M11N2RAXE ","M11N2RAYE ", & - "M11N2RAZE ","M11N2RDXE ","M11N2RDYE ","M11N2RDZE ","M11N2TAXE ","M11N2TAYE ","M11N2TAZE ", & - "M11N2TDXSS","M11N2TDYSS","M11N2TDZSS","M11N3FKXE ","M11N3FKYE ","M11N3FKZE ","M11N3FMXE ", & - "M11N3FMYE ","M11N3FMZE ","M11N3MKXE ","M11N3MKYE ","M11N3MKZE ","M11N3MMXE ","M11N3MMYE ", & - "M11N3MMZE ","M11N3RAXE ","M11N3RAYE ","M11N3RAZE ","M11N3RDXE ","M11N3RDYE ","M11N3RDZE ", & - "M11N3TAXE ","M11N3TAYE ","M11N3TAZE ","M11N3TDXSS","M11N3TDYSS","M11N3TDZSS","M11N4FKXE ", & - "M11N4FKYE ","M11N4FKZE ","M11N4FMXE ","M11N4FMYE ","M11N4FMZE ","M11N4MKXE ","M11N4MKYE ", & - "M11N4MKZE ","M11N4MMXE ","M11N4MMYE ","M11N4MMZE ","M11N4RAXE ","M11N4RAYE ","M11N4RAZE ", & - "M11N4RDXE ","M11N4RDYE ","M11N4RDZE ","M11N4TAXE ","M11N4TAYE ","M11N4TAZE ","M11N4TDXSS", & - "M11N4TDYSS","M11N4TDZSS","M11N5FKXE ","M11N5FKYE ","M11N5FKZE ","M11N5FMXE ","M11N5FMYE ", & - "M11N5FMZE ","M11N5MKXE ","M11N5MKYE ","M11N5MKZE ","M11N5MMXE ","M11N5MMYE ","M11N5MMZE ", & - "M11N5RAXE ","M11N5RAYE ","M11N5RAZE ","M11N5RDXE ","M11N5RDYE ","M11N5RDZE ","M11N5TAXE ", & - "M11N5TAYE ","M11N5TAZE ","M11N5TDXSS","M11N5TDYSS","M11N5TDZSS","M11N6FKXE ","M11N6FKYE ", & - "M11N6FKZE ","M11N6FMXE ","M11N6FMYE ","M11N6FMZE ","M11N6MKXE ","M11N6MKYE ","M11N6MKZE ", & - "M11N6MMXE ","M11N6MMYE ","M11N6MMZE ","M11N6RAXE ","M11N6RAYE ","M11N6RAZE ","M11N6RDXE ", & - "M11N6RDYE ","M11N6RDZE ","M11N6TAXE ","M11N6TAYE ","M11N6TAZE ","M11N6TDXSS","M11N6TDYSS", & - "M11N6TDZSS","M11N7FKXE ","M11N7FKYE ","M11N7FKZE ","M11N7FMXE ","M11N7FMYE ","M11N7FMZE ", & - "M11N7MKXE ","M11N7MKYE ","M11N7MKZE ","M11N7MMXE ","M11N7MMYE ","M11N7MMZE ","M11N7RAXE ", & - "M11N7RAYE ","M11N7RAZE ","M11N7RDXE ","M11N7RDYE ","M11N7RDZE ","M11N7TAXE ","M11N7TAYE ", & - "M11N7TAZE ","M11N7TDXSS","M11N7TDYSS","M11N7TDZSS","M11N8FKXE ","M11N8FKYE ","M11N8FKZE ", & - "M11N8FMXE ","M11N8FMYE ","M11N8FMZE ","M11N8MKXE ","M11N8MKYE ","M11N8MKZE ","M11N8MMXE ", & - "M11N8MMYE ","M11N8MMZE ","M11N8RAXE ","M11N8RAYE ","M11N8RAZE ","M11N8RDXE ","M11N8RDYE ", & - "M11N8RDZE ","M11N8TAXE ","M11N8TAYE ","M11N8TAZE ","M11N8TDXSS","M11N8TDYSS","M11N8TDZSS", & - "M11N9FKXE ","M11N9FKYE ","M11N9FKZE ","M11N9FMXE ","M11N9FMYE ","M11N9FMZE ","M11N9MKXE ", & - "M11N9MKYE ","M11N9MKZE ","M11N9MMXE ","M11N9MMYE ","M11N9MMZE ","M11N9RAXE ","M11N9RAYE ", & - "M11N9RAZE ","M11N9RDXE ","M11N9RDYE ","M11N9RDZE ","M11N9TAXE ","M11N9TAYE ","M11N9TAZE ", & - "M11N9TDXSS","M11N9TDYSS","M11N9TDZSS","M12N1FKXE ","M12N1FKYE ","M12N1FKZE ","M12N1FMXE ", & - "M12N1FMYE ","M12N1FMZE ","M12N1MKXE ","M12N1MKYE ","M12N1MKZE ","M12N1MMXE ","M12N1MMYE ", & - "M12N1MMZE ","M12N1RAXE ","M12N1RAYE ","M12N1RAZE ","M12N1RDXE ","M12N1RDYE ","M12N1RDZE ", & - "M12N1TAXE ","M12N1TAYE ","M12N1TAZE ","M12N1TDXSS","M12N1TDYSS","M12N1TDZSS","M12N2FKXE ", & - "M12N2FKYE ","M12N2FKZE ","M12N2FMXE ","M12N2FMYE ","M12N2FMZE ","M12N2MKXE ","M12N2MKYE ", & - "M12N2MKZE ","M12N2MMXE ","M12N2MMYE ","M12N2MMZE ","M12N2RAXE ","M12N2RAYE ","M12N2RAZE ", & - "M12N2RDXE ","M12N2RDYE ","M12N2RDZE ","M12N2TAXE ","M12N2TAYE ","M12N2TAZE ","M12N2TDXSS", & - "M12N2TDYSS","M12N2TDZSS","M12N3FKXE ","M12N3FKYE ","M12N3FKZE ","M12N3FMXE ","M12N3FMYE ", & - "M12N3FMZE ","M12N3MKXE ","M12N3MKYE ","M12N3MKZE ","M12N3MMXE ","M12N3MMYE ","M12N3MMZE ", & - "M12N3RAXE ","M12N3RAYE ","M12N3RAZE ","M12N3RDXE ","M12N3RDYE ","M12N3RDZE ","M12N3TAXE ", & - "M12N3TAYE ","M12N3TAZE ","M12N3TDXSS","M12N3TDYSS","M12N3TDZSS","M12N4FKXE ","M12N4FKYE ", & - "M12N4FKZE ","M12N4FMXE ","M12N4FMYE ","M12N4FMZE ","M12N4MKXE ","M12N4MKYE ","M12N4MKZE ", & - "M12N4MMXE ","M12N4MMYE ","M12N4MMZE ","M12N4RAXE ","M12N4RAYE ","M12N4RAZE ","M12N4RDXE ", & - "M12N4RDYE ","M12N4RDZE ","M12N4TAXE ","M12N4TAYE ","M12N4TAZE ","M12N4TDXSS","M12N4TDYSS", & - "M12N4TDZSS","M12N5FKXE ","M12N5FKYE ","M12N5FKZE ","M12N5FMXE ","M12N5FMYE ","M12N5FMZE ", & - "M12N5MKXE ","M12N5MKYE ","M12N5MKZE ","M12N5MMXE ","M12N5MMYE ","M12N5MMZE ","M12N5RAXE ", & - "M12N5RAYE ","M12N5RAZE ","M12N5RDXE ","M12N5RDYE ","M12N5RDZE ","M12N5TAXE ","M12N5TAYE ", & - "M12N5TAZE ","M12N5TDXSS","M12N5TDYSS","M12N5TDZSS","M12N6FKXE ","M12N6FKYE ","M12N6FKZE ", & - "M12N6FMXE ","M12N6FMYE ","M12N6FMZE ","M12N6MKXE ","M12N6MKYE ","M12N6MKZE ","M12N6MMXE ", & - "M12N6MMYE ","M12N6MMZE ","M12N6RAXE ","M12N6RAYE ","M12N6RAZE ","M12N6RDXE ","M12N6RDYE ", & - "M12N6RDZE ","M12N6TAXE ","M12N6TAYE ","M12N6TAZE ","M12N6TDXSS","M12N6TDYSS","M12N6TDZSS", & - "M12N7FKXE ","M12N7FKYE ","M12N7FKZE ","M12N7FMXE ","M12N7FMYE ","M12N7FMZE ","M12N7MKXE ", & - "M12N7MKYE ","M12N7MKZE ","M12N7MMXE ","M12N7MMYE ","M12N7MMZE ","M12N7RAXE ","M12N7RAYE ", & - "M12N7RAZE ","M12N7RDXE ","M12N7RDYE ","M12N7RDZE ","M12N7TAXE ","M12N7TAYE ","M12N7TAZE ", & - "M12N7TDXSS","M12N7TDYSS","M12N7TDZSS","M12N8FKXE ","M12N8FKYE ","M12N8FKZE ","M12N8FMXE ", & - "M12N8FMYE ","M12N8FMZE ","M12N8MKXE ","M12N8MKYE ","M12N8MKZE ","M12N8MMXE ","M12N8MMYE ", & - "M12N8MMZE ","M12N8RAXE ","M12N8RAYE ","M12N8RAZE ","M12N8RDXE ","M12N8RDYE ","M12N8RDZE ", & - "M12N8TAXE ","M12N8TAYE ","M12N8TAZE ","M12N8TDXSS","M12N8TDYSS","M12N8TDZSS","M12N9FKXE ", & - "M12N9FKYE ","M12N9FKZE ","M12N9FMXE ","M12N9FMYE ","M12N9FMZE ","M12N9MKXE ","M12N9MKYE ", & - "M12N9MKZE ","M12N9MMXE ","M12N9MMYE ","M12N9MMZE ","M12N9RAXE ","M12N9RAYE ","M12N9RAZE ", & - "M12N9RDXE ","M12N9RDYE ","M12N9RDZE ","M12N9TAXE ","M12N9TAYE ","M12N9TAZE ","M12N9TDXSS", & - "M12N9TDYSS","M12N9TDZSS","M13N1FKXE ","M13N1FKYE ","M13N1FKZE ","M13N1FMXE ","M13N1FMYE ", & - "M13N1FMZE ","M13N1MKXE ","M13N1MKYE ","M13N1MKZE ","M13N1MMXE ","M13N1MMYE ","M13N1MMZE ", & - "M13N1RAXE ","M13N1RAYE ","M13N1RAZE ","M13N1RDXE ","M13N1RDYE ","M13N1RDZE ","M13N1TAXE ", & - "M13N1TAYE ","M13N1TAZE ","M13N1TDXSS","M13N1TDYSS","M13N1TDZSS","M13N2FKXE ","M13N2FKYE ", & - "M13N2FKZE ","M13N2FMXE ","M13N2FMYE ","M13N2FMZE ","M13N2MKXE ","M13N2MKYE ","M13N2MKZE ", & - "M13N2MMXE ","M13N2MMYE ","M13N2MMZE ","M13N2RAXE ","M13N2RAYE ","M13N2RAZE ","M13N2RDXE ", & - "M13N2RDYE ","M13N2RDZE ","M13N2TAXE ","M13N2TAYE ","M13N2TAZE ","M13N2TDXSS","M13N2TDYSS", & - "M13N2TDZSS","M13N3FKXE ","M13N3FKYE ","M13N3FKZE ","M13N3FMXE ","M13N3FMYE ","M13N3FMZE ", & - "M13N3MKXE ","M13N3MKYE ","M13N3MKZE ","M13N3MMXE ","M13N3MMYE ","M13N3MMZE ","M13N3RAXE ", & - "M13N3RAYE ","M13N3RAZE ","M13N3RDXE ","M13N3RDYE ","M13N3RDZE ","M13N3TAXE ","M13N3TAYE ", & - "M13N3TAZE ","M13N3TDXSS","M13N3TDYSS","M13N3TDZSS","M13N4FKXE ","M13N4FKYE ","M13N4FKZE ", & - "M13N4FMXE ","M13N4FMYE ","M13N4FMZE ","M13N4MKXE ","M13N4MKYE ","M13N4MKZE ","M13N4MMXE ", & - "M13N4MMYE ","M13N4MMZE ","M13N4RAXE ","M13N4RAYE ","M13N4RAZE ","M13N4RDXE ","M13N4RDYE ", & - "M13N4RDZE ","M13N4TAXE ","M13N4TAYE ","M13N4TAZE ","M13N4TDXSS","M13N4TDYSS","M13N4TDZSS", & - "M13N5FKXE ","M13N5FKYE ","M13N5FKZE ","M13N5FMXE ","M13N5FMYE ","M13N5FMZE ","M13N5MKXE ", & - "M13N5MKYE ","M13N5MKZE ","M13N5MMXE ","M13N5MMYE ","M13N5MMZE ","M13N5RAXE ","M13N5RAYE ", & - "M13N5RAZE ","M13N5RDXE ","M13N5RDYE ","M13N5RDZE ","M13N5TAXE ","M13N5TAYE ","M13N5TAZE ", & - "M13N5TDXSS","M13N5TDYSS","M13N5TDZSS","M13N6FKXE ","M13N6FKYE ","M13N6FKZE ","M13N6FMXE ", & - "M13N6FMYE ","M13N6FMZE ","M13N6MKXE ","M13N6MKYE ","M13N6MKZE ","M13N6MMXE ","M13N6MMYE ", & - "M13N6MMZE ","M13N6RAXE ","M13N6RAYE ","M13N6RAZE ","M13N6RDXE ","M13N6RDYE ","M13N6RDZE ", & - "M13N6TAXE ","M13N6TAYE ","M13N6TAZE ","M13N6TDXSS","M13N6TDYSS","M13N6TDZSS","M13N7FKXE ", & - "M13N7FKYE ","M13N7FKZE ","M13N7FMXE ","M13N7FMYE ","M13N7FMZE ","M13N7MKXE ","M13N7MKYE ", & - "M13N7MKZE ","M13N7MMXE ","M13N7MMYE ","M13N7MMZE ","M13N7RAXE ","M13N7RAYE ","M13N7RAZE ", & - "M13N7RDXE ","M13N7RDYE ","M13N7RDZE ","M13N7TAXE ","M13N7TAYE ","M13N7TAZE ","M13N7TDXSS", & - "M13N7TDYSS","M13N7TDZSS","M13N8FKXE ","M13N8FKYE ","M13N8FKZE ","M13N8FMXE ","M13N8FMYE ", & - "M13N8FMZE ","M13N8MKXE ","M13N8MKYE ","M13N8MKZE ","M13N8MMXE ","M13N8MMYE ","M13N8MMZE ", & - "M13N8RAXE ","M13N8RAYE ","M13N8RAZE ","M13N8RDXE ","M13N8RDYE ","M13N8RDZE ","M13N8TAXE ", & - "M13N8TAYE ","M13N8TAZE ","M13N8TDXSS","M13N8TDYSS","M13N8TDZSS","M13N9FKXE ","M13N9FKYE ", & - "M13N9FKZE ","M13N9FMXE ","M13N9FMYE ","M13N9FMZE ","M13N9MKXE ","M13N9MKYE ","M13N9MKZE ", & - "M13N9MMXE ","M13N9MMYE ","M13N9MMZE ","M13N9RAXE ","M13N9RAYE ","M13N9RAZE ","M13N9RDXE ", & - "M13N9RDYE ","M13N9RDZE ","M13N9TAXE ","M13N9TAYE ","M13N9TAZE ","M13N9TDXSS","M13N9TDYSS", & - "M13N9TDZSS","M14N1FKXE ","M14N1FKYE ","M14N1FKZE ","M14N1FMXE ","M14N1FMYE ","M14N1FMZE ", & - "M14N1MKXE ","M14N1MKYE ","M14N1MKZE ","M14N1MMXE ","M14N1MMYE ","M14N1MMZE ","M14N1RAXE ", & - "M14N1RAYE ","M14N1RAZE ","M14N1RDXE ","M14N1RDYE ","M14N1RDZE ","M14N1TAXE ","M14N1TAYE ", & - "M14N1TAZE ","M14N1TDXSS","M14N1TDYSS","M14N1TDZSS","M14N2FKXE ","M14N2FKYE ","M14N2FKZE ", & - "M14N2FMXE ","M14N2FMYE ","M14N2FMZE ","M14N2MKXE ","M14N2MKYE ","M14N2MKZE ","M14N2MMXE ", & - "M14N2MMYE ","M14N2MMZE ","M14N2RAXE ","M14N2RAYE ","M14N2RAZE ","M14N2RDXE ","M14N2RDYE ", & - "M14N2RDZE ","M14N2TAXE ","M14N2TAYE ","M14N2TAZE ","M14N2TDXSS","M14N2TDYSS","M14N2TDZSS", & - "M14N3FKXE ","M14N3FKYE ","M14N3FKZE ","M14N3FMXE ","M14N3FMYE ","M14N3FMZE ","M14N3MKXE ", & - "M14N3MKYE ","M14N3MKZE ","M14N3MMXE ","M14N3MMYE ","M14N3MMZE ","M14N3RAXE ","M14N3RAYE ", & - "M14N3RAZE ","M14N3RDXE ","M14N3RDYE ","M14N3RDZE ","M14N3TAXE ","M14N3TAYE ","M14N3TAZE ", & - "M14N3TDXSS","M14N3TDYSS","M14N3TDZSS","M14N4FKXE ","M14N4FKYE ","M14N4FKZE ","M14N4FMXE ", & - "M14N4FMYE ","M14N4FMZE ","M14N4MKXE ","M14N4MKYE ","M14N4MKZE ","M14N4MMXE ","M14N4MMYE ", & - "M14N4MMZE ","M14N4RAXE ","M14N4RAYE ","M14N4RAZE ","M14N4RDXE ","M14N4RDYE ","M14N4RDZE ", & - "M14N4TAXE ","M14N4TAYE ","M14N4TAZE ","M14N4TDXSS","M14N4TDYSS","M14N4TDZSS","M14N5FKXE ", & - "M14N5FKYE ","M14N5FKZE ","M14N5FMXE ","M14N5FMYE ","M14N5FMZE ","M14N5MKXE ","M14N5MKYE ", & - "M14N5MKZE ","M14N5MMXE ","M14N5MMYE ","M14N5MMZE ","M14N5RAXE ","M14N5RAYE ","M14N5RAZE ", & - "M14N5RDXE ","M14N5RDYE ","M14N5RDZE ","M14N5TAXE ","M14N5TAYE ","M14N5TAZE ","M14N5TDXSS", & - "M14N5TDYSS","M14N5TDZSS","M14N6FKXE ","M14N6FKYE ","M14N6FKZE ","M14N6FMXE ","M14N6FMYE ", & - "M14N6FMZE ","M14N6MKXE ","M14N6MKYE ","M14N6MKZE ","M14N6MMXE ","M14N6MMYE ","M14N6MMZE ", & - "M14N6RAXE ","M14N6RAYE ","M14N6RAZE ","M14N6RDXE ","M14N6RDYE ","M14N6RDZE ","M14N6TAXE ", & - "M14N6TAYE ","M14N6TAZE ","M14N6TDXSS","M14N6TDYSS","M14N6TDZSS","M14N7FKXE ","M14N7FKYE ", & - "M14N7FKZE ","M14N7FMXE ","M14N7FMYE ","M14N7FMZE ","M14N7MKXE ","M14N7MKYE ","M14N7MKZE ", & - "M14N7MMXE ","M14N7MMYE ","M14N7MMZE ","M14N7RAXE ","M14N7RAYE ","M14N7RAZE ","M14N7RDXE ", & - "M14N7RDYE ","M14N7RDZE ","M14N7TAXE ","M14N7TAYE ","M14N7TAZE ","M14N7TDXSS","M14N7TDYSS", & - "M14N7TDZSS","M14N8FKXE ","M14N8FKYE ","M14N8FKZE ","M14N8FMXE ","M14N8FMYE ","M14N8FMZE ", & - "M14N8MKXE ","M14N8MKYE ","M14N8MKZE ","M14N8MMXE ","M14N8MMYE ","M14N8MMZE ","M14N8RAXE ", & - "M14N8RAYE ","M14N8RAZE ","M14N8RDXE ","M14N8RDYE ","M14N8RDZE ","M14N8TAXE ","M14N8TAYE ", & - "M14N8TAZE ","M14N8TDXSS","M14N8TDYSS","M14N8TDZSS","M14N9FKXE ","M14N9FKYE ","M14N9FKZE ", & - "M14N9FMXE ","M14N9FMYE ","M14N9FMZE ","M14N9MKXE ","M14N9MKYE ","M14N9MKZE ","M14N9MMXE ", & - "M14N9MMYE ","M14N9MMZE ","M14N9RAXE ","M14N9RAYE ","M14N9RAZE ","M14N9RDXE ","M14N9RDYE ", & - "M14N9RDZE ","M14N9TAXE ","M14N9TAYE ","M14N9TAZE ","M14N9TDXSS","M14N9TDYSS","M14N9TDZSS", & - "M15N1FKXE ","M15N1FKYE ","M15N1FKZE ","M15N1FMXE ","M15N1FMYE ","M15N1FMZE ","M15N1MKXE ", & - "M15N1MKYE ","M15N1MKZE ","M15N1MMXE ","M15N1MMYE ","M15N1MMZE ","M15N1RAXE ","M15N1RAYE ", & - "M15N1RAZE ","M15N1RDXE ","M15N1RDYE ","M15N1RDZE ","M15N1TAXE ","M15N1TAYE ","M15N1TAZE ", & - "M15N1TDXSS","M15N1TDYSS","M15N1TDZSS","M15N2FKXE ","M15N2FKYE ","M15N2FKZE ","M15N2FMXE ", & - "M15N2FMYE ","M15N2FMZE ","M15N2MKXE ","M15N2MKYE ","M15N2MKZE ","M15N2MMXE ","M15N2MMYE ", & - "M15N2MMZE ","M15N2RAXE ","M15N2RAYE ","M15N2RAZE ","M15N2RDXE ","M15N2RDYE ","M15N2RDZE ", & - "M15N2TAXE ","M15N2TAYE ","M15N2TAZE ","M15N2TDXSS","M15N2TDYSS","M15N2TDZSS","M15N3FKXE ", & - "M15N3FKYE ","M15N3FKZE ","M15N3FMXE ","M15N3FMYE ","M15N3FMZE ","M15N3MKXE ","M15N3MKYE ", & - "M15N3MKZE ","M15N3MMXE ","M15N3MMYE ","M15N3MMZE ","M15N3RAXE ","M15N3RAYE ","M15N3RAZE ", & - "M15N3RDXE ","M15N3RDYE ","M15N3RDZE ","M15N3TAXE ","M15N3TAYE ","M15N3TAZE ","M15N3TDXSS", & - "M15N3TDYSS","M15N3TDZSS","M15N4FKXE ","M15N4FKYE ","M15N4FKZE ","M15N4FMXE ","M15N4FMYE ", & - "M15N4FMZE ","M15N4MKXE ","M15N4MKYE ","M15N4MKZE ","M15N4MMXE ","M15N4MMYE ","M15N4MMZE ", & - "M15N4RAXE ","M15N4RAYE ","M15N4RAZE ","M15N4RDXE ","M15N4RDYE ","M15N4RDZE ","M15N4TAXE ", & - "M15N4TAYE ","M15N4TAZE ","M15N4TDXSS","M15N4TDYSS","M15N4TDZSS","M15N5FKXE ","M15N5FKYE ", & - "M15N5FKZE ","M15N5FMXE ","M15N5FMYE ","M15N5FMZE ","M15N5MKXE ","M15N5MKYE ","M15N5MKZE ", & - "M15N5MMXE ","M15N5MMYE ","M15N5MMZE ","M15N5RAXE ","M15N5RAYE ","M15N5RAZE ","M15N5RDXE ", & - "M15N5RDYE ","M15N5RDZE ","M15N5TAXE ","M15N5TAYE ","M15N5TAZE ","M15N5TDXSS","M15N5TDYSS", & - "M15N5TDZSS","M15N6FKXE ","M15N6FKYE ","M15N6FKZE ","M15N6FMXE ","M15N6FMYE ","M15N6FMZE ", & - "M15N6MKXE ","M15N6MKYE ","M15N6MKZE ","M15N6MMXE ","M15N6MMYE ","M15N6MMZE ","M15N6RAXE ", & - "M15N6RAYE ","M15N6RAZE ","M15N6RDXE ","M15N6RDYE ","M15N6RDZE ","M15N6TAXE ","M15N6TAYE ", & - "M15N6TAZE ","M15N6TDXSS","M15N6TDYSS","M15N6TDZSS","M15N7FKXE ","M15N7FKYE ","M15N7FKZE ", & - "M15N7FMXE ","M15N7FMYE ","M15N7FMZE ","M15N7MKXE ","M15N7MKYE ","M15N7MKZE ","M15N7MMXE ", & - "M15N7MMYE ","M15N7MMZE ","M15N7RAXE ","M15N7RAYE ","M15N7RAZE ","M15N7RDXE ","M15N7RDYE ", & - "M15N7RDZE ","M15N7TAXE ","M15N7TAYE ","M15N7TAZE ","M15N7TDXSS","M15N7TDYSS","M15N7TDZSS", & - "M15N8FKXE ","M15N8FKYE ","M15N8FKZE ","M15N8FMXE ","M15N8FMYE ","M15N8FMZE ","M15N8MKXE ", & - "M15N8MKYE ","M15N8MKZE ","M15N8MMXE ","M15N8MMYE ","M15N8MMZE ","M15N8RAXE ","M15N8RAYE ", & - "M15N8RAZE ","M15N8RDXE ","M15N8RDYE ","M15N8RDZE ","M15N8TAXE ","M15N8TAYE ","M15N8TAZE ", & - "M15N8TDXSS","M15N8TDYSS","M15N8TDZSS","M15N9FKXE ","M15N9FKYE ","M15N9FKZE ","M15N9FMXE ", & - "M15N9FMYE ","M15N9FMZE ","M15N9MKXE ","M15N9MKYE ","M15N9MKZE ","M15N9MMXE ","M15N9MMYE ", & - "M15N9MMZE ","M15N9RAXE ","M15N9RAYE ","M15N9RAZE ","M15N9RDXE ","M15N9RDYE ","M15N9RDZE ", & - "M15N9TAXE ","M15N9TAYE ","M15N9TAZE ","M15N9TDXSS","M15N9TDYSS","M15N9TDZSS","M16N1FKXE ", & - "M16N1FKYE ","M16N1FKZE ","M16N1FMXE ","M16N1FMYE ","M16N1FMZE ","M16N1MKXE ","M16N1MKYE ", & - "M16N1MKZE ","M16N1MMXE ","M16N1MMYE ","M16N1MMZE ","M16N1RAXE ","M16N1RAYE ","M16N1RAZE ", & - "M16N1RDXE ","M16N1RDYE ","M16N1RDZE ","M16N1TAXE ","M16N1TAYE ","M16N1TAZE ","M16N1TDXSS", & - "M16N1TDYSS","M16N1TDZSS","M16N2FKXE ","M16N2FKYE ","M16N2FKZE ","M16N2FMXE ","M16N2FMYE ", & - "M16N2FMZE ","M16N2MKXE ","M16N2MKYE ","M16N2MKZE ","M16N2MMXE ","M16N2MMYE ","M16N2MMZE ", & - "M16N2RAXE ","M16N2RAYE ","M16N2RAZE ","M16N2RDXE ","M16N2RDYE ","M16N2RDZE ","M16N2TAXE ", & - "M16N2TAYE ","M16N2TAZE ","M16N2TDXSS","M16N2TDYSS","M16N2TDZSS","M16N3FKXE ","M16N3FKYE ", & - "M16N3FKZE ","M16N3FMXE ","M16N3FMYE ","M16N3FMZE ","M16N3MKXE ","M16N3MKYE ","M16N3MKZE ", & - "M16N3MMXE ","M16N3MMYE ","M16N3MMZE ","M16N3RAXE ","M16N3RAYE ","M16N3RAZE ","M16N3RDXE ", & - "M16N3RDYE ","M16N3RDZE ","M16N3TAXE ","M16N3TAYE ","M16N3TAZE ","M16N3TDXSS","M16N3TDYSS", & - "M16N3TDZSS","M16N4FKXE ","M16N4FKYE ","M16N4FKZE ","M16N4FMXE ","M16N4FMYE ","M16N4FMZE ", & - "M16N4MKXE ","M16N4MKYE ","M16N4MKZE ","M16N4MMXE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry3(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M16N4MMYE ","M16N4MMZE ","M16N4RAXE ","M16N4RAYE ","M16N4RAZE ","M16N4RDXE ","M16N4RDYE ", & - "M16N4RDZE ","M16N4TAXE ","M16N4TAYE ","M16N4TAZE ","M16N4TDXSS","M16N4TDYSS","M16N4TDZSS", & - "M16N5FKXE ","M16N5FKYE ","M16N5FKZE ","M16N5FMXE ","M16N5FMYE ","M16N5FMZE ","M16N5MKXE ", & - "M16N5MKYE ","M16N5MKZE ","M16N5MMXE ","M16N5MMYE ","M16N5MMZE ","M16N5RAXE ","M16N5RAYE ", & - "M16N5RAZE ","M16N5RDXE ","M16N5RDYE ","M16N5RDZE ","M16N5TAXE ","M16N5TAYE ","M16N5TAZE ", & - "M16N5TDXSS","M16N5TDYSS","M16N5TDZSS","M16N6FKXE ","M16N6FKYE ","M16N6FKZE ","M16N6FMXE ", & - "M16N6FMYE ","M16N6FMZE ","M16N6MKXE ","M16N6MKYE ","M16N6MKZE ","M16N6MMXE ","M16N6MMYE ", & - "M16N6MMZE ","M16N6RAXE ","M16N6RAYE ","M16N6RAZE ","M16N6RDXE ","M16N6RDYE ","M16N6RDZE ", & - "M16N6TAXE ","M16N6TAYE ","M16N6TAZE ","M16N6TDXSS","M16N6TDYSS","M16N6TDZSS","M16N7FKXE ", & - "M16N7FKYE ","M16N7FKZE ","M16N7FMXE ","M16N7FMYE ","M16N7FMZE ","M16N7MKXE ","M16N7MKYE ", & - "M16N7MKZE ","M16N7MMXE ","M16N7MMYE ","M16N7MMZE ","M16N7RAXE ","M16N7RAYE ","M16N7RAZE ", & - "M16N7RDXE ","M16N7RDYE ","M16N7RDZE ","M16N7TAXE ","M16N7TAYE ","M16N7TAZE ","M16N7TDXSS", & - "M16N7TDYSS","M16N7TDZSS","M16N8FKXE ","M16N8FKYE ","M16N8FKZE ","M16N8FMXE ","M16N8FMYE ", & - "M16N8FMZE ","M16N8MKXE ","M16N8MKYE ","M16N8MKZE ","M16N8MMXE ","M16N8MMYE ","M16N8MMZE ", & - "M16N8RAXE ","M16N8RAYE ","M16N8RAZE ","M16N8RDXE ","M16N8RDYE ","M16N8RDZE ","M16N8TAXE ", & - "M16N8TAYE ","M16N8TAZE ","M16N8TDXSS","M16N8TDYSS","M16N8TDZSS","M16N9FKXE ","M16N9FKYE ", & - "M16N9FKZE ","M16N9FMXE ","M16N9FMYE ","M16N9FMZE ","M16N9MKXE ","M16N9MKYE ","M16N9MKZE ", & - "M16N9MMXE ","M16N9MMYE ","M16N9MMZE ","M16N9RAXE ","M16N9RAYE ","M16N9RAZE ","M16N9RDXE ", & - "M16N9RDYE ","M16N9RDZE ","M16N9TAXE ","M16N9TAYE ","M16N9TAZE ","M16N9TDXSS","M16N9TDYSS", & - "M16N9TDZSS","M17N1FKXE ","M17N1FKYE ","M17N1FKZE ","M17N1FMXE ","M17N1FMYE ","M17N1FMZE ", & - "M17N1MKXE ","M17N1MKYE ","M17N1MKZE ","M17N1MMXE ","M17N1MMYE ","M17N1MMZE ","M17N1RAXE ", & - "M17N1RAYE ","M17N1RAZE ","M17N1RDXE ","M17N1RDYE ","M17N1RDZE ","M17N1TAXE ","M17N1TAYE ", & - "M17N1TAZE ","M17N1TDXSS","M17N1TDYSS","M17N1TDZSS","M17N2FKXE ","M17N2FKYE ","M17N2FKZE ", & - "M17N2FMXE ","M17N2FMYE ","M17N2FMZE ","M17N2MKXE ","M17N2MKYE ","M17N2MKZE ","M17N2MMXE ", & - "M17N2MMYE ","M17N2MMZE ","M17N2RAXE ","M17N2RAYE ","M17N2RAZE ","M17N2RDXE ","M17N2RDYE ", & - "M17N2RDZE ","M17N2TAXE ","M17N2TAYE ","M17N2TAZE ","M17N2TDXSS","M17N2TDYSS","M17N2TDZSS", & - "M17N3FKXE ","M17N3FKYE ","M17N3FKZE ","M17N3FMXE ","M17N3FMYE ","M17N3FMZE ","M17N3MKXE ", & - "M17N3MKYE ","M17N3MKZE ","M17N3MMXE ","M17N3MMYE ","M17N3MMZE ","M17N3RAXE ","M17N3RAYE ", & - "M17N3RAZE ","M17N3RDXE ","M17N3RDYE ","M17N3RDZE ","M17N3TAXE ","M17N3TAYE ","M17N3TAZE ", & - "M17N3TDXSS","M17N3TDYSS","M17N3TDZSS","M17N4FKXE ","M17N4FKYE ","M17N4FKZE ","M17N4FMXE ", & - "M17N4FMYE ","M17N4FMZE ","M17N4MKXE ","M17N4MKYE ","M17N4MKZE ","M17N4MMXE ","M17N4MMYE ", & - "M17N4MMZE ","M17N4RAXE ","M17N4RAYE ","M17N4RAZE ","M17N4RDXE ","M17N4RDYE ","M17N4RDZE ", & - "M17N4TAXE ","M17N4TAYE ","M17N4TAZE ","M17N4TDXSS","M17N4TDYSS","M17N4TDZSS","M17N5FKXE ", & - "M17N5FKYE ","M17N5FKZE ","M17N5FMXE ","M17N5FMYE ","M17N5FMZE ","M17N5MKXE ","M17N5MKYE ", & - "M17N5MKZE ","M17N5MMXE ","M17N5MMYE ","M17N5MMZE ","M17N5RAXE ","M17N5RAYE ","M17N5RAZE ", & - "M17N5RDXE ","M17N5RDYE ","M17N5RDZE ","M17N5TAXE ","M17N5TAYE ","M17N5TAZE ","M17N5TDXSS", & - "M17N5TDYSS","M17N5TDZSS","M17N6FKXE ","M17N6FKYE ","M17N6FKZE ","M17N6FMXE ","M17N6FMYE ", & - "M17N6FMZE ","M17N6MKXE ","M17N6MKYE ","M17N6MKZE ","M17N6MMXE ","M17N6MMYE ","M17N6MMZE ", & - "M17N6RAXE ","M17N6RAYE ","M17N6RAZE ","M17N6RDXE ","M17N6RDYE ","M17N6RDZE ","M17N6TAXE ", & - "M17N6TAYE ","M17N6TAZE ","M17N6TDXSS","M17N6TDYSS","M17N6TDZSS","M17N7FKXE ","M17N7FKYE ", & - "M17N7FKZE ","M17N7FMXE ","M17N7FMYE ","M17N7FMZE ","M17N7MKXE ","M17N7MKYE ","M17N7MKZE ", & - "M17N7MMXE ","M17N7MMYE ","M17N7MMZE ","M17N7RAXE ","M17N7RAYE ","M17N7RAZE ","M17N7RDXE ", & - "M17N7RDYE ","M17N7RDZE ","M17N7TAXE ","M17N7TAYE ","M17N7TAZE ","M17N7TDXSS","M17N7TDYSS", & - "M17N7TDZSS","M17N8FKXE ","M17N8FKYE ","M17N8FKZE ","M17N8FMXE ","M17N8FMYE ","M17N8FMZE ", & - "M17N8MKXE ","M17N8MKYE ","M17N8MKZE ","M17N8MMXE ","M17N8MMYE ","M17N8MMZE ","M17N8RAXE ", & - "M17N8RAYE ","M17N8RAZE ","M17N8RDXE ","M17N8RDYE ","M17N8RDZE ","M17N8TAXE ","M17N8TAYE ", & - "M17N8TAZE ","M17N8TDXSS","M17N8TDYSS","M17N8TDZSS","M17N9FKXE ","M17N9FKYE ","M17N9FKZE ", & - "M17N9FMXE ","M17N9FMYE ","M17N9FMZE ","M17N9MKXE ","M17N9MKYE ","M17N9MKZE ","M17N9MMXE ", & - "M17N9MMYE ","M17N9MMZE ","M17N9RAXE ","M17N9RAYE ","M17N9RAZE ","M17N9RDXE ","M17N9RDYE ", & - "M17N9RDZE ","M17N9TAXE ","M17N9TAYE ","M17N9TAZE ","M17N9TDXSS","M17N9TDYSS","M17N9TDZSS", & - "M18N1FKXE ","M18N1FKYE ","M18N1FKZE ","M18N1FMXE ","M18N1FMYE ","M18N1FMZE ","M18N1MKXE ", & - "M18N1MKYE ","M18N1MKZE ","M18N1MMXE ","M18N1MMYE ","M18N1MMZE ","M18N1RAXE ","M18N1RAYE ", & - "M18N1RAZE ","M18N1RDXE ","M18N1RDYE ","M18N1RDZE ","M18N1TAXE ","M18N1TAYE ","M18N1TAZE ", & - "M18N1TDXSS","M18N1TDYSS","M18N1TDZSS","M18N2FKXE ","M18N2FKYE ","M18N2FKZE ","M18N2FMXE ", & - "M18N2FMYE ","M18N2FMZE ","M18N2MKXE ","M18N2MKYE ","M18N2MKZE ","M18N2MMXE ","M18N2MMYE ", & - "M18N2MMZE ","M18N2RAXE ","M18N2RAYE ","M18N2RAZE ","M18N2RDXE ","M18N2RDYE ","M18N2RDZE ", & - "M18N2TAXE ","M18N2TAYE ","M18N2TAZE ","M18N2TDXSS","M18N2TDYSS","M18N2TDZSS","M18N3FKXE ", & - "M18N3FKYE ","M18N3FKZE ","M18N3FMXE ","M18N3FMYE ","M18N3FMZE ","M18N3MKXE ","M18N3MKYE ", & - "M18N3MKZE ","M18N3MMXE ","M18N3MMYE ","M18N3MMZE ","M18N3RAXE ","M18N3RAYE ","M18N3RAZE ", & - "M18N3RDXE ","M18N3RDYE ","M18N3RDZE ","M18N3TAXE ","M18N3TAYE ","M18N3TAZE ","M18N3TDXSS", & - "M18N3TDYSS","M18N3TDZSS","M18N4FKXE ","M18N4FKYE ","M18N4FKZE ","M18N4FMXE ","M18N4FMYE ", & - "M18N4FMZE ","M18N4MKXE ","M18N4MKYE ","M18N4MKZE ","M18N4MMXE ","M18N4MMYE ","M18N4MMZE ", & - "M18N4RAXE ","M18N4RAYE ","M18N4RAZE ","M18N4RDXE ","M18N4RDYE ","M18N4RDZE ","M18N4TAXE ", & - "M18N4TAYE ","M18N4TAZE ","M18N4TDXSS","M18N4TDYSS","M18N4TDZSS","M18N5FKXE ","M18N5FKYE ", & - "M18N5FKZE ","M18N5FMXE ","M18N5FMYE ","M18N5FMZE ","M18N5MKXE ","M18N5MKYE ","M18N5MKZE ", & - "M18N5MMXE ","M18N5MMYE ","M18N5MMZE ","M18N5RAXE ","M18N5RAYE ","M18N5RAZE ","M18N5RDXE ", & - "M18N5RDYE ","M18N5RDZE ","M18N5TAXE ","M18N5TAYE ","M18N5TAZE ","M18N5TDXSS","M18N5TDYSS", & - "M18N5TDZSS","M18N6FKXE ","M18N6FKYE ","M18N6FKZE ","M18N6FMXE ","M18N6FMYE ","M18N6FMZE ", & - "M18N6MKXE ","M18N6MKYE ","M18N6MKZE ","M18N6MMXE ","M18N6MMYE ","M18N6MMZE ","M18N6RAXE ", & - "M18N6RAYE ","M18N6RAZE ","M18N6RDXE ","M18N6RDYE ","M18N6RDZE ","M18N6TAXE ","M18N6TAYE ", & - "M18N6TAZE ","M18N6TDXSS","M18N6TDYSS","M18N6TDZSS","M18N7FKXE ","M18N7FKYE ","M18N7FKZE ", & - "M18N7FMXE ","M18N7FMYE ","M18N7FMZE ","M18N7MKXE ","M18N7MKYE ","M18N7MKZE ","M18N7MMXE ", & - "M18N7MMYE ","M18N7MMZE ","M18N7RAXE ","M18N7RAYE ","M18N7RAZE ","M18N7RDXE ","M18N7RDYE ", & - "M18N7RDZE ","M18N7TAXE ","M18N7TAYE ","M18N7TAZE ","M18N7TDXSS","M18N7TDYSS","M18N7TDZSS", & - "M18N8FKXE ","M18N8FKYE ","M18N8FKZE ","M18N8FMXE ","M18N8FMYE ","M18N8FMZE ","M18N8MKXE ", & - "M18N8MKYE ","M18N8MKZE ","M18N8MMXE ","M18N8MMYE ","M18N8MMZE ","M18N8RAXE ","M18N8RAYE ", & - "M18N8RAZE ","M18N8RDXE ","M18N8RDYE ","M18N8RDZE ","M18N8TAXE ","M18N8TAYE ","M18N8TAZE ", & - "M18N8TDXSS","M18N8TDYSS","M18N8TDZSS","M18N9FKXE ","M18N9FKYE ","M18N9FKZE ","M18N9FMXE ", & - "M18N9FMYE ","M18N9FMZE ","M18N9MKXE ","M18N9MKYE ","M18N9MKZE ","M18N9MMXE ","M18N9MMYE ", & - "M18N9MMZE ","M18N9RAXE ","M18N9RAYE ","M18N9RAZE ","M18N9RDXE ","M18N9RDYE ","M18N9RDZE ", & - "M18N9TAXE ","M18N9TAYE ","M18N9TAZE ","M18N9TDXSS","M18N9TDYSS","M18N9TDZSS","M19N1FKXE ", & - "M19N1FKYE ","M19N1FKZE ","M19N1FMXE ","M19N1FMYE ","M19N1FMZE ","M19N1MKXE ","M19N1MKYE ", & - "M19N1MKZE ","M19N1MMXE ","M19N1MMYE ","M19N1MMZE ","M19N1RAXE ","M19N1RAYE ","M19N1RAZE ", & - "M19N1RDXE ","M19N1RDYE ","M19N1RDZE ","M19N1TAXE ","M19N1TAYE ","M19N1TAZE ","M19N1TDXSS", & - "M19N1TDYSS","M19N1TDZSS","M19N2FKXE ","M19N2FKYE ","M19N2FKZE ","M19N2FMXE ","M19N2FMYE ", & - "M19N2FMZE ","M19N2MKXE ","M19N2MKYE ","M19N2MKZE ","M19N2MMXE ","M19N2MMYE ","M19N2MMZE ", & - "M19N2RAXE ","M19N2RAYE ","M19N2RAZE ","M19N2RDXE ","M19N2RDYE ","M19N2RDZE ","M19N2TAXE ", & - "M19N2TAYE ","M19N2TAZE ","M19N2TDXSS","M19N2TDYSS","M19N2TDZSS","M19N3FKXE ","M19N3FKYE ", & - "M19N3FKZE ","M19N3FMXE ","M19N3FMYE ","M19N3FMZE ","M19N3MKXE ","M19N3MKYE ","M19N3MKZE ", & - "M19N3MMXE ","M19N3MMYE ","M19N3MMZE ","M19N3RAXE ","M19N3RAYE ","M19N3RAZE ","M19N3RDXE ", & - "M19N3RDYE ","M19N3RDZE ","M19N3TAXE ","M19N3TAYE ","M19N3TAZE ","M19N3TDXSS","M19N3TDYSS", & - "M19N3TDZSS","M19N4FKXE ","M19N4FKYE ","M19N4FKZE ","M19N4FMXE ","M19N4FMYE ","M19N4FMZE ", & - "M19N4MKXE ","M19N4MKYE ","M19N4MKZE ","M19N4MMXE ","M19N4MMYE ","M19N4MMZE ","M19N4RAXE ", & - "M19N4RAYE ","M19N4RAZE ","M19N4RDXE ","M19N4RDYE ","M19N4RDZE ","M19N4TAXE ","M19N4TAYE ", & - "M19N4TAZE ","M19N4TDXSS","M19N4TDYSS","M19N4TDZSS","M19N5FKXE ","M19N5FKYE ","M19N5FKZE ", & - "M19N5FMXE ","M19N5FMYE ","M19N5FMZE ","M19N5MKXE ","M19N5MKYE ","M19N5MKZE ","M19N5MMXE ", & - "M19N5MMYE ","M19N5MMZE ","M19N5RAXE ","M19N5RAYE ","M19N5RAZE ","M19N5RDXE ","M19N5RDYE ", & - "M19N5RDZE ","M19N5TAXE ","M19N5TAYE ","M19N5TAZE ","M19N5TDXSS","M19N5TDYSS","M19N5TDZSS", & - "M19N6FKXE ","M19N6FKYE ","M19N6FKZE ","M19N6FMXE ","M19N6FMYE ","M19N6FMZE ","M19N6MKXE ", & - "M19N6MKYE ","M19N6MKZE ","M19N6MMXE ","M19N6MMYE ","M19N6MMZE ","M19N6RAXE ","M19N6RAYE ", & - "M19N6RAZE ","M19N6RDXE ","M19N6RDYE ","M19N6RDZE ","M19N6TAXE ","M19N6TAYE ","M19N6TAZE ", & - "M19N6TDXSS","M19N6TDYSS","M19N6TDZSS","M19N7FKXE ","M19N7FKYE ","M19N7FKZE ","M19N7FMXE ", & - "M19N7FMYE ","M19N7FMZE ","M19N7MKXE ","M19N7MKYE ","M19N7MKZE ","M19N7MMXE ","M19N7MMYE ", & - "M19N7MMZE ","M19N7RAXE ","M19N7RAYE ","M19N7RAZE ","M19N7RDXE ","M19N7RDYE ","M19N7RDZE ", & - "M19N7TAXE ","M19N7TAYE ","M19N7TAZE ","M19N7TDXSS","M19N7TDYSS","M19N7TDZSS","M19N8FKXE ", & - "M19N8FKYE ","M19N8FKZE ","M19N8FMXE ","M19N8FMYE ","M19N8FMZE ","M19N8MKXE ","M19N8MKYE ", & - "M19N8MKZE ","M19N8MMXE ","M19N8MMYE ","M19N8MMZE ","M19N8RAXE ","M19N8RAYE ","M19N8RAZE ", & - "M19N8RDXE ","M19N8RDYE ","M19N8RDZE ","M19N8TAXE ","M19N8TAYE ","M19N8TAZE ","M19N8TDXSS", & - "M19N8TDYSS","M19N8TDZSS","M19N9FKXE ","M19N9FKYE ","M19N9FKZE ","M19N9FMXE ","M19N9FMYE ", & - "M19N9FMZE ","M19N9MKXE ","M19N9MKYE ","M19N9MKZE ","M19N9MMXE ","M19N9MMYE ","M19N9MMZE ", & - "M19N9RAXE ","M19N9RAYE ","M19N9RAZE ","M19N9RDXE ","M19N9RDYE ","M19N9RDZE ","M19N9TAXE ", & - "M19N9TAYE ","M19N9TAZE ","M19N9TDXSS","M19N9TDYSS","M19N9TDZSS","M20N1FKXE ","M20N1FKYE ", & - "M20N1FKZE ","M20N1FMXE ","M20N1FMYE ","M20N1FMZE ","M20N1MKXE ","M20N1MKYE ","M20N1MKZE ", & - "M20N1MMXE ","M20N1MMYE ","M20N1MMZE ","M20N1RAXE ","M20N1RAYE ","M20N1RAZE ","M20N1RDXE ", & - "M20N1RDYE ","M20N1RDZE ","M20N1TAXE ","M20N1TAYE ","M20N1TAZE ","M20N1TDXSS","M20N1TDYSS", & - "M20N1TDZSS","M20N2FKXE ","M20N2FKYE ","M20N2FKZE ","M20N2FMXE ","M20N2FMYE ","M20N2FMZE ", & - "M20N2MKXE ","M20N2MKYE ","M20N2MKZE ","M20N2MMXE ","M20N2MMYE ","M20N2MMZE ","M20N2RAXE ", & - "M20N2RAYE ","M20N2RAZE ","M20N2RDXE ","M20N2RDYE ","M20N2RDZE ","M20N2TAXE ","M20N2TAYE ", & - "M20N2TAZE ","M20N2TDXSS","M20N2TDYSS","M20N2TDZSS","M20N3FKXE ","M20N3FKYE ","M20N3FKZE ", & - "M20N3FMXE ","M20N3FMYE ","M20N3FMZE ","M20N3MKXE ","M20N3MKYE ","M20N3MKZE ","M20N3MMXE ", & - "M20N3MMYE ","M20N3MMZE ","M20N3RAXE ","M20N3RAYE ","M20N3RAZE ","M20N3RDXE ","M20N3RDYE ", & - "M20N3RDZE ","M20N3TAXE ","M20N3TAYE ","M20N3TAZE ","M20N3TDXSS","M20N3TDYSS","M20N3TDZSS", & - "M20N4FKXE ","M20N4FKYE ","M20N4FKZE ","M20N4FMXE ","M20N4FMYE ","M20N4FMZE ","M20N4MKXE ", & - "M20N4MKYE ","M20N4MKZE ","M20N4MMXE ","M20N4MMYE ","M20N4MMZE ","M20N4RAXE ","M20N4RAYE ", & - "M20N4RAZE ","M20N4RDXE ","M20N4RDYE ","M20N4RDZE ","M20N4TAXE ","M20N4TAYE ","M20N4TAZE ", & - "M20N4TDXSS","M20N4TDYSS","M20N4TDZSS","M20N5FKXE ","M20N5FKYE ","M20N5FKZE ","M20N5FMXE ", & - "M20N5FMYE ","M20N5FMZE ","M20N5MKXE ","M20N5MKYE ","M20N5MKZE ","M20N5MMXE ","M20N5MMYE ", & - "M20N5MMZE ","M20N5RAXE ","M20N5RAYE ","M20N5RAZE ","M20N5RDXE ","M20N5RDYE ","M20N5RDZE ", & - "M20N5TAXE ","M20N5TAYE ","M20N5TAZE ","M20N5TDXSS","M20N5TDYSS","M20N5TDZSS","M20N6FKXE ", & - "M20N6FKYE ","M20N6FKZE ","M20N6FMXE ","M20N6FMYE ","M20N6FMZE ","M20N6MKXE ","M20N6MKYE ", & - "M20N6MKZE ","M20N6MMXE ","M20N6MMYE ","M20N6MMZE ","M20N6RAXE ","M20N6RAYE ","M20N6RAZE ", & - "M20N6RDXE ","M20N6RDYE ","M20N6RDZE ","M20N6TAXE ","M20N6TAYE ","M20N6TAZE ","M20N6TDXSS", & - "M20N6TDYSS","M20N6TDZSS","M20N7FKXE ","M20N7FKYE ","M20N7FKZE ","M20N7FMXE ","M20N7FMYE ", & - "M20N7FMZE ","M20N7MKXE ","M20N7MKYE ","M20N7MKZE ","M20N7MMXE ","M20N7MMYE ","M20N7MMZE ", & - "M20N7RAXE ","M20N7RAYE ","M20N7RAZE ","M20N7RDXE ","M20N7RDYE ","M20N7RDZE ","M20N7TAXE ", & - "M20N7TAYE ","M20N7TAZE ","M20N7TDXSS","M20N7TDYSS","M20N7TDZSS","M20N8FKXE ","M20N8FKYE ", & - "M20N8FKZE ","M20N8FMXE ","M20N8FMYE ","M20N8FMZE ","M20N8MKXE ","M20N8MKYE ","M20N8MKZE ", & - "M20N8MMXE ","M20N8MMYE ","M20N8MMZE ","M20N8RAXE ","M20N8RAYE ","M20N8RAZE ","M20N8RDXE ", & - "M20N8RDYE ","M20N8RDZE ","M20N8TAXE ","M20N8TAYE ","M20N8TAZE ","M20N8TDXSS","M20N8TDYSS", & - "M20N8TDZSS","M20N9FKXE ","M20N9FKYE ","M20N9FKZE ","M20N9FMXE ","M20N9FMYE ","M20N9FMZE ", & - "M20N9MKXE ","M20N9MKYE ","M20N9MKZE ","M20N9MMXE ","M20N9MMYE ","M20N9MMZE ","M20N9RAXE ", & - "M20N9RAYE ","M20N9RAZE ","M20N9RDXE ","M20N9RDYE ","M20N9RDZE ","M20N9TAXE ","M20N9TAYE ", & - "M20N9TAZE ","M20N9TDXSS","M20N9TDYSS","M20N9TDZSS","M21N1FKXE ","M21N1FKYE ","M21N1FKZE ", & - "M21N1FMXE ","M21N1FMYE ","M21N1FMZE ","M21N1MKXE ","M21N1MKYE ","M21N1MKZE ","M21N1MMXE ", & - "M21N1MMYE ","M21N1MMZE ","M21N1RAXE ","M21N1RAYE ","M21N1RAZE ","M21N1RDXE ","M21N1RDYE ", & - "M21N1RDZE ","M21N1TAXE ","M21N1TAYE ","M21N1TAZE ","M21N1TDXSS","M21N1TDYSS","M21N1TDZSS", & - "M21N2FKXE ","M21N2FKYE ","M21N2FKZE ","M21N2FMXE ","M21N2FMYE ","M21N2FMZE ","M21N2MKXE ", & - "M21N2MKYE ","M21N2MKZE ","M21N2MMXE ","M21N2MMYE ","M21N2MMZE ","M21N2RAXE ","M21N2RAYE ", & - "M21N2RAZE ","M21N2RDXE ","M21N2RDYE ","M21N2RDZE ","M21N2TAXE ","M21N2TAYE ","M21N2TAZE ", & - "M21N2TDXSS","M21N2TDYSS","M21N2TDZSS","M21N3FKXE ","M21N3FKYE ","M21N3FKZE ","M21N3FMXE ", & - "M21N3FMYE ","M21N3FMZE ","M21N3MKXE ","M21N3MKYE ","M21N3MKZE ","M21N3MMXE ","M21N3MMYE ", & - "M21N3MMZE ","M21N3RAXE ","M21N3RAYE ","M21N3RAZE ","M21N3RDXE ","M21N3RDYE ","M21N3RDZE ", & - "M21N3TAXE ","M21N3TAYE ","M21N3TAZE ","M21N3TDXSS","M21N3TDYSS","M21N3TDZSS","M21N4FKXE ", & - "M21N4FKYE ","M21N4FKZE ","M21N4FMXE ","M21N4FMYE ","M21N4FMZE ","M21N4MKXE ","M21N4MKYE ", & - "M21N4MKZE ","M21N4MMXE ","M21N4MMYE ","M21N4MMZE ","M21N4RAXE ","M21N4RAYE ","M21N4RAZE ", & - "M21N4RDXE ","M21N4RDYE ","M21N4RDZE ","M21N4TAXE ","M21N4TAYE ","M21N4TAZE ","M21N4TDXSS", & - "M21N4TDYSS","M21N4TDZSS","M21N5FKXE ","M21N5FKYE ","M21N5FKZE ","M21N5FMXE ","M21N5FMYE ", & - "M21N5FMZE ","M21N5MKXE ","M21N5MKYE ","M21N5MKZE ","M21N5MMXE ","M21N5MMYE ","M21N5MMZE ", & - "M21N5RAXE ","M21N5RAYE ","M21N5RAZE ","M21N5RDXE ","M21N5RDYE ","M21N5RDZE ","M21N5TAXE ", & - "M21N5TAYE ","M21N5TAZE ","M21N5TDXSS","M21N5TDYSS","M21N5TDZSS","M21N6FKXE ","M21N6FKYE ", & - "M21N6FKZE ","M21N6FMXE ","M21N6FMYE ","M21N6FMZE ","M21N6MKXE ","M21N6MKYE ","M21N6MKZE ", & - "M21N6MMXE ","M21N6MMYE ","M21N6MMZE ","M21N6RAXE ","M21N6RAYE ","M21N6RAZE ","M21N6RDXE ", & - "M21N6RDYE ","M21N6RDZE ","M21N6TAXE ","M21N6TAYE ","M21N6TAZE ","M21N6TDXSS","M21N6TDYSS", & - "M21N6TDZSS","M21N7FKXE ","M21N7FKYE ","M21N7FKZE ","M21N7FMXE ","M21N7FMYE ","M21N7FMZE ", & - "M21N7MKXE ","M21N7MKYE ","M21N7MKZE ","M21N7MMXE ","M21N7MMYE ","M21N7MMZE ","M21N7RAXE ", & - "M21N7RAYE ","M21N7RAZE ","M21N7RDXE ","M21N7RDYE ","M21N7RDZE ","M21N7TAXE ","M21N7TAYE ", & - "M21N7TAZE ","M21N7TDXSS","M21N7TDYSS","M21N7TDZSS","M21N8FKXE ","M21N8FKYE ","M21N8FKZE ", & - "M21N8FMXE ","M21N8FMYE ","M21N8FMZE ","M21N8MKXE ","M21N8MKYE ","M21N8MKZE ","M21N8MMXE ", & - "M21N8MMYE ","M21N8MMZE ","M21N8RAXE ","M21N8RAYE ","M21N8RAZE ","M21N8RDXE ","M21N8RDYE ", & - "M21N8RDZE ","M21N8TAXE ","M21N8TAYE ","M21N8TAZE ","M21N8TDXSS","M21N8TDYSS","M21N8TDZSS", & - "M21N9FKXE ","M21N9FKYE ","M21N9FKZE ","M21N9FMXE ","M21N9FMYE ","M21N9FMZE ","M21N9MKXE ", & - "M21N9MKYE ","M21N9MKZE ","M21N9MMXE ","M21N9MMYE ","M21N9MMZE ","M21N9RAXE ","M21N9RAYE ", & - "M21N9RAZE ","M21N9RDXE ","M21N9RDYE ","M21N9RDZE ","M21N9TAXE ","M21N9TAYE ","M21N9TAZE ", & - "M21N9TDXSS","M21N9TDYSS","M21N9TDZSS","M22N1FKXE ","M22N1FKYE ","M22N1FKZE ","M22N1FMXE ", & - "M22N1FMYE ","M22N1FMZE ","M22N1MKXE ","M22N1MKYE ","M22N1MKZE ","M22N1MMXE ","M22N1MMYE ", & - "M22N1MMZE ","M22N1RAXE ","M22N1RAYE ","M22N1RAZE ","M22N1RDXE ","M22N1RDYE ","M22N1RDZE ", & - "M22N1TAXE ","M22N1TAYE ","M22N1TAZE ","M22N1TDXSS","M22N1TDYSS","M22N1TDZSS","M22N2FKXE ", & - "M22N2FKYE ","M22N2FKZE ","M22N2FMXE ","M22N2FMYE ","M22N2FMZE ","M22N2MKXE ","M22N2MKYE ", & - "M22N2MKZE ","M22N2MMXE ","M22N2MMYE ","M22N2MMZE ","M22N2RAXE ","M22N2RAYE ","M22N2RAZE ", & - "M22N2RDXE ","M22N2RDYE ","M22N2RDZE ","M22N2TAXE ","M22N2TAYE ","M22N2TAZE ","M22N2TDXSS", & - "M22N2TDYSS","M22N2TDZSS","M22N3FKXE ","M22N3FKYE ","M22N3FKZE ","M22N3FMXE ","M22N3FMYE ", & - "M22N3FMZE ","M22N3MKXE ","M22N3MKYE ","M22N3MKZE ","M22N3MMXE ","M22N3MMYE ","M22N3MMZE ", & - "M22N3RAXE ","M22N3RAYE ","M22N3RAZE ","M22N3RDXE ","M22N3RDYE ","M22N3RDZE ","M22N3TAXE ", & - "M22N3TAYE ","M22N3TAZE ","M22N3TDXSS","M22N3TDYSS","M22N3TDZSS","M22N4FKXE ","M22N4FKYE ", & - "M22N4FKZE ","M22N4FMXE ","M22N4FMYE ","M22N4FMZE ","M22N4MKXE ","M22N4MKYE ","M22N4MKZE ", & - "M22N4MMXE ","M22N4MMYE ","M22N4MMZE ","M22N4RAXE ","M22N4RAYE ","M22N4RAZE ","M22N4RDXE ", & - "M22N4RDYE ","M22N4RDZE ","M22N4TAXE ","M22N4TAYE ","M22N4TAZE ","M22N4TDXSS","M22N4TDYSS", & - "M22N4TDZSS","M22N5FKXE ","M22N5FKYE ","M22N5FKZE ","M22N5FMXE ","M22N5FMYE ","M22N5FMZE ", & - "M22N5MKXE ","M22N5MKYE ","M22N5MKZE ","M22N5MMXE ","M22N5MMYE ","M22N5MMZE ","M22N5RAXE ", & - "M22N5RAYE ","M22N5RAZE ","M22N5RDXE ","M22N5RDYE ","M22N5RDZE ","M22N5TAXE ","M22N5TAYE ", & - "M22N5TAZE ","M22N5TDXSS","M22N5TDYSS","M22N5TDZSS","M22N6FKXE ","M22N6FKYE ","M22N6FKZE ", & - "M22N6FMXE ","M22N6FMYE ","M22N6FMZE ","M22N6MKXE ","M22N6MKYE ","M22N6MKZE ","M22N6MMXE ", & - "M22N6MMYE ","M22N6MMZE ","M22N6RAXE ","M22N6RAYE ","M22N6RAZE ","M22N6RDXE ","M22N6RDYE ", & - "M22N6RDZE ","M22N6TAXE ","M22N6TAYE ","M22N6TAZE ","M22N6TDXSS","M22N6TDYSS","M22N6TDZSS", & - "M22N7FKXE ","M22N7FKYE ","M22N7FKZE ","M22N7FMXE ","M22N7FMYE ","M22N7FMZE ","M22N7MKXE ", & - "M22N7MKYE ","M22N7MKZE ","M22N7MMXE ","M22N7MMYE ","M22N7MMZE ","M22N7RAXE ","M22N7RAYE ", & - "M22N7RAZE ","M22N7RDXE ","M22N7RDYE ","M22N7RDZE ","M22N7TAXE ","M22N7TAYE ","M22N7TAZE ", & - "M22N7TDXSS","M22N7TDYSS","M22N7TDZSS","M22N8FKXE ","M22N8FKYE ","M22N8FKZE ","M22N8FMXE ", & - "M22N8FMYE ","M22N8FMZE ","M22N8MKXE ","M22N8MKYE ","M22N8MKZE ","M22N8MMXE ","M22N8MMYE ", & - "M22N8MMZE ","M22N8RAXE ","M22N8RAYE ","M22N8RAZE ","M22N8RDXE ","M22N8RDYE ","M22N8RDZE ", & - "M22N8TAXE ","M22N8TAYE ","M22N8TAZE ","M22N8TDXSS","M22N8TDYSS","M22N8TDZSS","M22N9FKXE ", & - "M22N9FKYE ","M22N9FKZE ","M22N9FMXE ","M22N9FMYE ","M22N9FMZE ","M22N9MKXE ","M22N9MKYE ", & - "M22N9MKZE ","M22N9MMXE ","M22N9MMYE ","M22N9MMZE ","M22N9RAXE ","M22N9RAYE ","M22N9RAZE ", & - "M22N9RDXE ","M22N9RDYE ","M22N9RDZE ","M22N9TAXE ","M22N9TAYE ","M22N9TAZE ","M22N9TDXSS", & - "M22N9TDYSS","M22N9TDZSS","M23N1FKXE ","M23N1FKYE ","M23N1FKZE ","M23N1FMXE ","M23N1FMYE ", & - "M23N1FMZE ","M23N1MKXE ","M23N1MKYE ","M23N1MKZE ","M23N1MMXE ","M23N1MMYE ","M23N1MMZE ", & - "M23N1RAXE ","M23N1RAYE ","M23N1RAZE ","M23N1RDXE ","M23N1RDYE ","M23N1RDZE ","M23N1TAXE ", & - "M23N1TAYE ","M23N1TAZE ","M23N1TDXSS","M23N1TDYSS","M23N1TDZSS","M23N2FKXE ","M23N2FKYE ", & - "M23N2FKZE ","M23N2FMXE ","M23N2FMYE ","M23N2FMZE ","M23N2MKXE ","M23N2MKYE ","M23N2MKZE ", & - "M23N2MMXE ","M23N2MMYE ","M23N2MMZE ","M23N2RAXE ","M23N2RAYE ","M23N2RAZE ","M23N2RDXE ", & - "M23N2RDYE ","M23N2RDZE ","M23N2TAXE ","M23N2TAYE ","M23N2TAZE ","M23N2TDXSS","M23N2TDYSS", & - "M23N2TDZSS","M23N3FKXE ","M23N3FKYE ","M23N3FKZE ","M23N3FMXE ","M23N3FMYE ","M23N3FMZE ", & - "M23N3MKXE ","M23N3MKYE ","M23N3MKZE ","M23N3MMXE ","M23N3MMYE ","M23N3MMZE ","M23N3RAXE ", & - "M23N3RAYE ","M23N3RAZE ","M23N3RDXE ","M23N3RDYE ","M23N3RDZE ","M23N3TAXE ","M23N3TAYE ", & - "M23N3TAZE ","M23N3TDXSS","M23N3TDYSS","M23N3TDZSS","M23N4FKXE ","M23N4FKYE ","M23N4FKZE ", & - "M23N4FMXE ","M23N4FMYE ","M23N4FMZE ","M23N4MKXE ","M23N4MKYE ","M23N4MKZE ","M23N4MMXE ", & - "M23N4MMYE ","M23N4MMZE ","M23N4RAXE ","M23N4RAYE ","M23N4RAZE ","M23N4RDXE ","M23N4RDYE ", & - "M23N4RDZE ","M23N4TAXE ","M23N4TAYE ","M23N4TAZE ","M23N4TDXSS","M23N4TDYSS","M23N4TDZSS", & - "M23N5FKXE ","M23N5FKYE ","M23N5FKZE ","M23N5FMXE ","M23N5FMYE ","M23N5FMZE ","M23N5MKXE ", & - "M23N5MKYE ","M23N5MKZE ","M23N5MMXE ","M23N5MMYE ","M23N5MMZE ","M23N5RAXE ","M23N5RAYE ", & - "M23N5RAZE ","M23N5RDXE ","M23N5RDYE ","M23N5RDZE ","M23N5TAXE ","M23N5TAYE ","M23N5TAZE ", & - "M23N5TDXSS","M23N5TDYSS","M23N5TDZSS","M23N6FKXE ","M23N6FKYE ","M23N6FKZE ","M23N6FMXE ", & - "M23N6FMYE ","M23N6FMZE ","M23N6MKXE ","M23N6MKYE ","M23N6MKZE ","M23N6MMXE ","M23N6MMYE ", & - "M23N6MMZE ","M23N6RAXE ","M23N6RAYE ","M23N6RAZE ","M23N6RDXE ","M23N6RDYE ","M23N6RDZE ", & - "M23N6TAXE ","M23N6TAYE ","M23N6TAZE ","M23N6TDXSS","M23N6TDYSS","M23N6TDZSS","M23N7FKXE ", & - "M23N7FKYE ","M23N7FKZE ","M23N7FMXE ","M23N7FMYE ","M23N7FMZE ","M23N7MKXE ","M23N7MKYE ", & - "M23N7MKZE ","M23N7MMXE ","M23N7MMYE ","M23N7MMZE ","M23N7RAXE ","M23N7RAYE ","M23N7RAZE ", & - "M23N7RDXE ","M23N7RDYE ","M23N7RDZE ","M23N7TAXE ","M23N7TAYE ","M23N7TAZE ","M23N7TDXSS", & - "M23N7TDYSS","M23N7TDZSS","M23N8FKXE ","M23N8FKYE ","M23N8FKZE ","M23N8FMXE ","M23N8FMYE ", & - "M23N8FMZE ","M23N8MKXE ","M23N8MKYE ","M23N8MKZE ","M23N8MMXE ","M23N8MMYE ","M23N8MMZE ", & - "M23N8RAXE ","M23N8RAYE ","M23N8RAZE ","M23N8RDXE ","M23N8RDYE ","M23N8RDZE ","M23N8TAXE ", & - "M23N8TAYE ","M23N8TAZE ","M23N8TDXSS","M23N8TDYSS","M23N8TDZSS","M23N9FKXE ","M23N9FKYE ", & - "M23N9FKZE ","M23N9FMXE ","M23N9FMYE ","M23N9FMZE ","M23N9MKXE ","M23N9MKYE ","M23N9MKZE ", & - "M23N9MMXE ","M23N9MMYE ","M23N9MMZE ","M23N9RAXE ","M23N9RAYE ","M23N9RAZE ","M23N9RDXE ", & - "M23N9RDYE ","M23N9RDZE ","M23N9TAXE ","M23N9TAYE ","M23N9TAZE ","M23N9TDXSS","M23N9TDYSS", & - "M23N9TDZSS","M24N1FKXE ","M24N1FKYE ","M24N1FKZE ","M24N1FMXE ","M24N1FMYE ","M24N1FMZE ", & - "M24N1MKXE ","M24N1MKYE ","M24N1MKZE ","M24N1MMXE ","M24N1MMYE ","M24N1MMZE ","M24N1RAXE ", & - "M24N1RAYE ","M24N1RAZE ","M24N1RDXE ","M24N1RDYE ","M24N1RDZE ","M24N1TAXE ","M24N1TAYE ", & - "M24N1TAZE ","M24N1TDXSS","M24N1TDYSS","M24N1TDZSS"/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry4(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry1(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "INTF1FXSS ","INTF1FYSS ","INTF1FZSS ","INTF1MXSS ","INTF1MYSS ","INTF1MZSS ","INTF1RAXSS", & + "INTF1RAYSS","INTF1RAZSS","INTF1RDXE ","INTF1RDXSS","INTF1RDYE ","INTF1RDYSS","INTF1RDZE ", & + "INTF1RDZSS","INTF1TAXSS","INTF1TAYSS","INTF1TAZSS","INTF1TDXE ","INTF1TDXSS","INTF1TDYE ", & + "INTF1TDYSS","INTF1TDZE ","INTF1TDZSS","INTF2FXSS ","INTF2FYSS ","INTF2FZSS ","INTF2MXSS ", & + "INTF2MYSS ","INTF2MZSS ","INTF2RAXSS","INTF2RAYSS","INTF2RAZSS","INTF2RDXE ","INTF2RDXSS", & + "INTF2RDYE ","INTF2RDYSS","INTF2RDZE ","INTF2RDZSS","INTF2TAXSS","INTF2TAYSS","INTF2TAZSS", & + "INTF2TDXE ","INTF2TDXSS","INTF2TDYE ","INTF2TDYSS","INTF2TDZE ","INTF2TDZSS","INTF3FXSS ", & + "INTF3FYSS ","INTF3FZSS ","INTF3MXSS ","INTF3MYSS ","INTF3MZSS ","INTF3RAXSS","INTF3RAYSS", & + "INTF3RAZSS","INTF3RDXE ","INTF3RDXSS","INTF3RDYE ","INTF3RDYSS","INTF3RDZE ","INTF3RDZSS", & + "INTF3TAXSS","INTF3TAYSS","INTF3TAZSS","INTF3TDXE ","INTF3TDXSS","INTF3TDYE ","INTF3TDYSS", & + "INTF3TDZE ","INTF3TDZSS","INTF4FXSS ","INTF4FYSS ","INTF4FZSS ","INTF4MXSS ","INTF4MYSS ", & + "INTF4MZSS ","INTF4RAXSS","INTF4RAYSS","INTF4RAZSS","INTF4RDXE ","INTF4RDXSS","INTF4RDYE ", & + "INTF4RDYSS","INTF4RDZE ","INTF4RDZSS","INTF4TAXSS","INTF4TAYSS","INTF4TAZSS","INTF4TDXE ", & + "INTF4TDXSS","INTF4TDYE ","INTF4TDYSS","INTF4TDZE ","INTF4TDZSS","INTF5FXSS ","INTF5FYSS ", & + "INTF5FZSS ","INTF5MXSS ","INTF5MYSS ","INTF5MZSS ","INTF5RAXSS","INTF5RAYSS","INTF5RAZSS", & + "INTF5RDXE ","INTF5RDXSS","INTF5RDYE ","INTF5RDYSS","INTF5RDZE ","INTF5RDZSS","INTF5TAXSS", & + "INTF5TAYSS","INTF5TAZSS","INTF5TDXE ","INTF5TDXSS","INTF5TDYE ","INTF5TDYSS","INTF5TDZE ", & + "INTF5TDZSS","INTF6FXSS ","INTF6FYSS ","INTF6FZSS ","INTF6MXSS ","INTF6MYSS ","INTF6MZSS ", & + "INTF6RAXSS","INTF6RAYSS","INTF6RAZSS","INTF6RDXE ","INTF6RDXSS","INTF6RDYE ","INTF6RDYSS", & + "INTF6RDZE ","INTF6RDZSS","INTF6TAXSS","INTF6TAYSS","INTF6TAZSS","INTF6TDXE ","INTF6TDXSS", & + "INTF6TDYE ","INTF6TDYSS","INTF6TDZE ","INTF6TDZSS","INTF7FXSS ","INTF7FYSS ","INTF7FZSS ", & + "INTF7MXSS ","INTF7MYSS ","INTF7MZSS ","INTF7RAXSS","INTF7RAYSS","INTF7RAZSS","INTF7RDXE ", & + "INTF7RDXSS","INTF7RDYE ","INTF7RDYSS","INTF7RDZE ","INTF7RDZSS","INTF7TAXSS","INTF7TAYSS", & + "INTF7TAZSS","INTF7TDXE ","INTF7TDXSS","INTF7TDYE ","INTF7TDYSS","INTF7TDZE ","INTF7TDZSS", & + "INTF8FXSS ","INTF8FYSS ","INTF8FZSS ","INTF8MXSS ","INTF8MYSS ","INTF8MZSS ","INTF8RAXSS", & + "INTF8RAYSS","INTF8RAZSS","INTF8RDXE ","INTF8RDXSS","INTF8RDYE ","INTF8RDYSS","INTF8RDZE ", & + "INTF8RDZSS","INTF8TAXSS","INTF8TAYSS","INTF8TAZSS","INTF8TDXE ","INTF8TDXSS","INTF8TDYE ", & + "INTF8TDYSS","INTF8TDZE ","INTF8TDZSS","INTF9FXSS ","INTF9FYSS ","INTF9FZSS ","INTF9MXSS ", & + "INTF9MYSS ","INTF9MZSS ","INTF9RAXSS","INTF9RAYSS","INTF9RAZSS","INTF9RDXE ","INTF9RDXSS", & + "INTF9RDYE ","INTF9RDYSS","INTF9RDZE ","INTF9RDZSS","INTF9TAXSS","INTF9TAYSS","INTF9TAZSS", & + "INTF9TDXE ","INTF9TDXSS","INTF9TDYE ","INTF9TDYSS","INTF9TDZE ","INTF9TDZSS","M01N1FKXE ", & + "M01N1FKYE ","M01N1FKZE ","M01N1FMXE ","M01N1FMYE ","M01N1FMZE ","M01N1MKXE ","M01N1MKYE ", & + "M01N1MKZE ","M01N1MMXE ","M01N1MMYE ","M01N1MMZE ","M01N1RAXE ","M01N1RAYE ","M01N1RAZE ", & + "M01N1RDXE ","M01N1RDYE ","M01N1RDZE ","M01N1TAXE ","M01N1TAYE ","M01N1TAZE ","M01N1TDXSS", & + "M01N1TDYSS","M01N1TDZSS","M01N2FKXE ","M01N2FKYE ","M01N2FKZE ","M01N2FMXE ","M01N2FMYE ", & + "M01N2FMZE ","M01N2MKXE ","M01N2MKYE ","M01N2MKZE ","M01N2MMXE ","M01N2MMYE ","M01N2MMZE ", & + "M01N2RAXE ","M01N2RAYE ","M01N2RAZE ","M01N2RDXE ","M01N2RDYE ","M01N2RDZE ","M01N2TAXE ", & + "M01N2TAYE ","M01N2TAZE ","M01N2TDXSS","M01N2TDYSS","M01N2TDZSS","M01N3FKXE ","M01N3FKYE ", & + "M01N3FKZE ","M01N3FMXE ","M01N3FMYE ","M01N3FMZE ","M01N3MKXE ","M01N3MKYE ","M01N3MKZE ", & + "M01N3MMXE ","M01N3MMYE ","M01N3MMZE ","M01N3RAXE ","M01N3RAYE ","M01N3RAZE ","M01N3RDXE ", & + "M01N3RDYE ","M01N3RDZE ","M01N3TAXE ","M01N3TAYE ","M01N3TAZE ","M01N3TDXSS","M01N3TDYSS", & + "M01N3TDZSS","M01N4FKXE ","M01N4FKYE ","M01N4FKZE ","M01N4FMXE ","M01N4FMYE ","M01N4FMZE ", & + "M01N4MKXE ","M01N4MKYE ","M01N4MKZE ","M01N4MMXE ","M01N4MMYE ","M01N4MMZE ","M01N4RAXE ", & + "M01N4RAYE ","M01N4RAZE ","M01N4RDXE ","M01N4RDYE ","M01N4RDZE ","M01N4TAXE ","M01N4TAYE ", & + "M01N4TAZE ","M01N4TDXSS","M01N4TDYSS","M01N4TDZSS","M01N5FKXE ","M01N5FKYE ","M01N5FKZE ", & + "M01N5FMXE ","M01N5FMYE ","M01N5FMZE ","M01N5MKXE ","M01N5MKYE ","M01N5MKZE ","M01N5MMXE ", & + "M01N5MMYE ","M01N5MMZE ","M01N5RAXE ","M01N5RAYE ","M01N5RAZE ","M01N5RDXE ","M01N5RDYE ", & + "M01N5RDZE ","M01N5TAXE ","M01N5TAYE ","M01N5TAZE ","M01N5TDXSS","M01N5TDYSS","M01N5TDZSS", & + "M01N6FKXE ","M01N6FKYE ","M01N6FKZE ","M01N6FMXE ","M01N6FMYE ","M01N6FMZE ","M01N6MKXE ", & + "M01N6MKYE ","M01N6MKZE ","M01N6MMXE ","M01N6MMYE ","M01N6MMZE ","M01N6RAXE ","M01N6RAYE ", & + "M01N6RAZE ","M01N6RDXE ","M01N6RDYE ","M01N6RDZE ","M01N6TAXE ","M01N6TAYE ","M01N6TAZE ", & + "M01N6TDXSS","M01N6TDYSS","M01N6TDZSS","M01N7FKXE ","M01N7FKYE ","M01N7FKZE ","M01N7FMXE ", & + "M01N7FMYE ","M01N7FMZE ","M01N7MKXE ","M01N7MKYE ","M01N7MKZE ","M01N7MMXE ","M01N7MMYE ", & + "M01N7MMZE ","M01N7RAXE ","M01N7RAYE ","M01N7RAZE ","M01N7RDXE ","M01N7RDYE ","M01N7RDZE ", & + "M01N7TAXE ","M01N7TAYE ","M01N7TAZE ","M01N7TDXSS","M01N7TDYSS","M01N7TDZSS","M01N8FKXE ", & + "M01N8FKYE ","M01N8FKZE ","M01N8FMXE ","M01N8FMYE ","M01N8FMZE ","M01N8MKXE ","M01N8MKYE ", & + "M01N8MKZE ","M01N8MMXE ","M01N8MMYE ","M01N8MMZE ","M01N8RAXE ","M01N8RAYE ","M01N8RAZE ", & + "M01N8RDXE ","M01N8RDYE ","M01N8RDZE ","M01N8TAXE ","M01N8TAYE ","M01N8TAZE ","M01N8TDXSS", & + "M01N8TDYSS","M01N8TDZSS","M01N9FKXE ","M01N9FKYE ","M01N9FKZE ","M01N9FMXE ","M01N9FMYE ", & + "M01N9FMZE ","M01N9MKXE ","M01N9MKYE ","M01N9MKZE ","M01N9MMXE ","M01N9MMYE ","M01N9MMZE ", & + "M01N9RAXE ","M01N9RAYE ","M01N9RAZE ","M01N9RDXE ","M01N9RDYE ","M01N9RDZE ","M01N9TAXE ", & + "M01N9TAYE ","M01N9TAZE ","M01N9TDXSS","M01N9TDYSS","M01N9TDZSS","M02N1FKXE ","M02N1FKYE ", & + "M02N1FKZE ","M02N1FMXE ","M02N1FMYE ","M02N1FMZE ","M02N1MKXE ","M02N1MKYE ","M02N1MKZE ", & + "M02N1MMXE ","M02N1MMYE ","M02N1MMZE ","M02N1RAXE ","M02N1RAYE ","M02N1RAZE ","M02N1RDXE ", & + "M02N1RDYE ","M02N1RDZE ","M02N1TAXE ","M02N1TAYE ","M02N1TAZE ","M02N1TDXSS","M02N1TDYSS", & + "M02N1TDZSS","M02N2FKXE ","M02N2FKYE ","M02N2FKZE ","M02N2FMXE ","M02N2FMYE ","M02N2FMZE ", & + "M02N2MKXE ","M02N2MKYE ","M02N2MKZE ","M02N2MMXE ","M02N2MMYE ","M02N2MMZE ","M02N2RAXE ", & + "M02N2RAYE ","M02N2RAZE ","M02N2RDXE ","M02N2RDYE ","M02N2RDZE ","M02N2TAXE ","M02N2TAYE ", & + "M02N2TAZE ","M02N2TDXSS","M02N2TDYSS","M02N2TDZSS","M02N3FKXE ","M02N3FKYE ","M02N3FKZE ", & + "M02N3FMXE ","M02N3FMYE ","M02N3FMZE ","M02N3MKXE ","M02N3MKYE ","M02N3MKZE ","M02N3MMXE ", & + "M02N3MMYE ","M02N3MMZE ","M02N3RAXE ","M02N3RAYE ","M02N3RAZE ","M02N3RDXE ","M02N3RDYE ", & + "M02N3RDZE ","M02N3TAXE ","M02N3TAYE ","M02N3TAZE ","M02N3TDXSS","M02N3TDYSS","M02N3TDZSS", & + "M02N4FKXE ","M02N4FKYE ","M02N4FKZE ","M02N4FMXE ","M02N4FMYE ","M02N4FMZE ","M02N4MKXE ", & + "M02N4MKYE ","M02N4MKZE ","M02N4MMXE ","M02N4MMYE ","M02N4MMZE ","M02N4RAXE ","M02N4RAYE ", & + "M02N4RAZE ","M02N4RDXE ","M02N4RDYE ","M02N4RDZE ","M02N4TAXE ","M02N4TAYE ","M02N4TAZE ", & + "M02N4TDXSS","M02N4TDYSS","M02N4TDZSS","M02N5FKXE ","M02N5FKYE ","M02N5FKZE ","M02N5FMXE ", & + "M02N5FMYE ","M02N5FMZE ","M02N5MKXE ","M02N5MKYE ","M02N5MKZE ","M02N5MMXE ","M02N5MMYE ", & + "M02N5MMZE ","M02N5RAXE ","M02N5RAYE ","M02N5RAZE ","M02N5RDXE ","M02N5RDYE ","M02N5RDZE ", & + "M02N5TAXE ","M02N5TAYE ","M02N5TAZE ","M02N5TDXSS","M02N5TDYSS","M02N5TDZSS","M02N6FKXE ", & + "M02N6FKYE ","M02N6FKZE ","M02N6FMXE ","M02N6FMYE ","M02N6FMZE ","M02N6MKXE ","M02N6MKYE ", & + "M02N6MKZE ","M02N6MMXE ","M02N6MMYE ","M02N6MMZE ","M02N6RAXE ","M02N6RAYE ","M02N6RAZE ", & + "M02N6RDXE ","M02N6RDYE ","M02N6RDZE ","M02N6TAXE ","M02N6TAYE ","M02N6TAZE ","M02N6TDXSS", & + "M02N6TDYSS","M02N6TDZSS","M02N7FKXE ","M02N7FKYE ","M02N7FKZE ","M02N7FMXE ","M02N7FMYE ", & + "M02N7FMZE ","M02N7MKXE ","M02N7MKYE ","M02N7MKZE ","M02N7MMXE ","M02N7MMYE ","M02N7MMZE ", & + "M02N7RAXE ","M02N7RAYE ","M02N7RAZE ","M02N7RDXE ","M02N7RDYE ","M02N7RDZE ","M02N7TAXE ", & + "M02N7TAYE ","M02N7TAZE ","M02N7TDXSS","M02N7TDYSS","M02N7TDZSS","M02N8FKXE ","M02N8FKYE ", & + "M02N8FKZE ","M02N8FMXE ","M02N8FMYE ","M02N8FMZE ","M02N8MKXE ","M02N8MKYE ","M02N8MKZE ", & + "M02N8MMXE ","M02N8MMYE ","M02N8MMZE ","M02N8RAXE ","M02N8RAYE ","M02N8RAZE ","M02N8RDXE ", & + "M02N8RDYE ","M02N8RDZE ","M02N8TAXE ","M02N8TAYE ","M02N8TAZE ","M02N8TDXSS","M02N8TDYSS", & + "M02N8TDZSS","M02N9FKXE ","M02N9FKYE ","M02N9FKZE ","M02N9FMXE ","M02N9FMYE ","M02N9FMZE ", & + "M02N9MKXE ","M02N9MKYE ","M02N9MKZE ","M02N9MMXE ","M02N9MMYE ","M02N9MMZE ","M02N9RAXE ", & + "M02N9RAYE ","M02N9RAZE ","M02N9RDXE ","M02N9RDYE ","M02N9RDZE ","M02N9TAXE ","M02N9TAYE ", & + "M02N9TAZE ","M02N9TDXSS","M02N9TDYSS","M02N9TDZSS","M03N1FKXE ","M03N1FKYE ","M03N1FKZE ", & + "M03N1FMXE ","M03N1FMYE ","M03N1FMZE ","M03N1MKXE ","M03N1MKYE ","M03N1MKZE ","M03N1MMXE ", & + "M03N1MMYE ","M03N1MMZE ","M03N1RAXE ","M03N1RAYE ","M03N1RAZE ","M03N1RDXE ","M03N1RDYE ", & + "M03N1RDZE ","M03N1TAXE ","M03N1TAYE ","M03N1TAZE ","M03N1TDXSS","M03N1TDYSS","M03N1TDZSS", & + "M03N2FKXE ","M03N2FKYE ","M03N2FKZE ","M03N2FMXE ","M03N2FMYE ","M03N2FMZE ","M03N2MKXE ", & + "M03N2MKYE ","M03N2MKZE ","M03N2MMXE ","M03N2MMYE ","M03N2MMZE ","M03N2RAXE ","M03N2RAYE ", & + "M03N2RAZE ","M03N2RDXE ","M03N2RDYE ","M03N2RDZE ","M03N2TAXE ","M03N2TAYE ","M03N2TAZE ", & + "M03N2TDXSS","M03N2TDYSS","M03N2TDZSS","M03N3FKXE ","M03N3FKYE ","M03N3FKZE ","M03N3FMXE ", & + "M03N3FMYE ","M03N3FMZE ","M03N3MKXE ","M03N3MKYE ","M03N3MKZE ","M03N3MMXE ","M03N3MMYE ", & + "M03N3MMZE ","M03N3RAXE ","M03N3RAYE ","M03N3RAZE ","M03N3RDXE ","M03N3RDYE ","M03N3RDZE ", & + "M03N3TAXE ","M03N3TAYE ","M03N3TAZE ","M03N3TDXSS","M03N3TDYSS","M03N3TDZSS","M03N4FKXE ", & + "M03N4FKYE ","M03N4FKZE ","M03N4FMXE ","M03N4FMYE ","M03N4FMZE ","M03N4MKXE ","M03N4MKYE ", & + "M03N4MKZE ","M03N4MMXE ","M03N4MMYE ","M03N4MMZE ","M03N4RAXE ","M03N4RAYE ","M03N4RAZE ", & + "M03N4RDXE ","M03N4RDYE ","M03N4RDZE ","M03N4TAXE ","M03N4TAYE ","M03N4TAZE ","M03N4TDXSS", & + "M03N4TDYSS","M03N4TDZSS","M03N5FKXE ","M03N5FKYE ","M03N5FKZE ","M03N5FMXE ","M03N5FMYE ", & + "M03N5FMZE ","M03N5MKXE ","M03N5MKYE ","M03N5MKZE ","M03N5MMXE ","M03N5MMYE ","M03N5MMZE ", & + "M03N5RAXE ","M03N5RAYE ","M03N5RAZE ","M03N5RDXE ","M03N5RDYE ","M03N5RDZE ","M03N5TAXE ", & + "M03N5TAYE ","M03N5TAZE ","M03N5TDXSS","M03N5TDYSS","M03N5TDZSS","M03N6FKXE ","M03N6FKYE ", & + "M03N6FKZE ","M03N6FMXE ","M03N6FMYE ","M03N6FMZE ","M03N6MKXE ","M03N6MKYE ","M03N6MKZE ", & + "M03N6MMXE ","M03N6MMYE ","M03N6MMZE ","M03N6RAXE ","M03N6RAYE ","M03N6RAZE ","M03N6RDXE ", & + "M03N6RDYE ","M03N6RDZE ","M03N6TAXE ","M03N6TAYE ","M03N6TAZE ","M03N6TDXSS","M03N6TDYSS", & + "M03N6TDZSS","M03N7FKXE ","M03N7FKYE ","M03N7FKZE ","M03N7FMXE ","M03N7FMYE ","M03N7FMZE ", & + "M03N7MKXE ","M03N7MKYE ","M03N7MKZE ","M03N7MMXE ","M03N7MMYE ","M03N7MMZE ","M03N7RAXE ", & + "M03N7RAYE ","M03N7RAZE ","M03N7RDXE ","M03N7RDYE ","M03N7RDZE ","M03N7TAXE ","M03N7TAYE ", & + "M03N7TAZE ","M03N7TDXSS","M03N7TDYSS","M03N7TDZSS","M03N8FKXE ","M03N8FKYE ","M03N8FKZE ", & + "M03N8FMXE ","M03N8FMYE ","M03N8FMZE ","M03N8MKXE ","M03N8MKYE ","M03N8MKZE ","M03N8MMXE ", & + "M03N8MMYE ","M03N8MMZE ","M03N8RAXE ","M03N8RAYE ","M03N8RAZE ","M03N8RDXE ","M03N8RDYE ", & + "M03N8RDZE ","M03N8TAXE ","M03N8TAYE ","M03N8TAZE ","M03N8TDXSS","M03N8TDYSS","M03N8TDZSS", & + "M03N9FKXE ","M03N9FKYE ","M03N9FKZE ","M03N9FMXE ","M03N9FMYE ","M03N9FMZE ","M03N9MKXE ", & + "M03N9MKYE ","M03N9MKZE ","M03N9MMXE ","M03N9MMYE ","M03N9MMZE ","M03N9RAXE ","M03N9RAYE ", & + "M03N9RAZE ","M03N9RDXE ","M03N9RDYE ","M03N9RDZE ","M03N9TAXE ","M03N9TAYE ","M03N9TAZE ", & + "M03N9TDXSS","M03N9TDYSS","M03N9TDZSS","M04N1FKXE ","M04N1FKYE ","M04N1FKZE ","M04N1FMXE ", & + "M04N1FMYE ","M04N1FMZE ","M04N1MKXE ","M04N1MKYE ","M04N1MKZE ","M04N1MMXE ","M04N1MMYE ", & + "M04N1MMZE ","M04N1RAXE ","M04N1RAYE ","M04N1RAZE ","M04N1RDXE ","M04N1RDYE ","M04N1RDZE ", & + "M04N1TAXE ","M04N1TAYE ","M04N1TAZE ","M04N1TDXSS","M04N1TDYSS","M04N1TDZSS","M04N2FKXE ", & + "M04N2FKYE ","M04N2FKZE ","M04N2FMXE ","M04N2FMYE ","M04N2FMZE ","M04N2MKXE ","M04N2MKYE ", & + "M04N2MKZE ","M04N2MMXE ","M04N2MMYE ","M04N2MMZE ","M04N2RAXE ","M04N2RAYE ","M04N2RAZE ", & + "M04N2RDXE ","M04N2RDYE ","M04N2RDZE ","M04N2TAXE ","M04N2TAYE ","M04N2TAZE ","M04N2TDXSS", & + "M04N2TDYSS","M04N2TDZSS","M04N3FKXE ","M04N3FKYE ","M04N3FKZE ","M04N3FMXE ","M04N3FMYE ", & + "M04N3FMZE ","M04N3MKXE ","M04N3MKYE ","M04N3MKZE ","M04N3MMXE ","M04N3MMYE ","M04N3MMZE ", & + "M04N3RAXE ","M04N3RAYE ","M04N3RAZE ","M04N3RDXE ","M04N3RDYE ","M04N3RDZE ","M04N3TAXE ", & + "M04N3TAYE ","M04N3TAZE ","M04N3TDXSS","M04N3TDYSS","M04N3TDZSS","M04N4FKXE ","M04N4FKYE ", & + "M04N4FKZE ","M04N4FMXE ","M04N4FMYE ","M04N4FMZE ","M04N4MKXE ","M04N4MKYE ","M04N4MKZE ", & + "M04N4MMXE ","M04N4MMYE ","M04N4MMZE ","M04N4RAXE ","M04N4RAYE ","M04N4RAZE ","M04N4RDXE ", & + "M04N4RDYE ","M04N4RDZE ","M04N4TAXE ","M04N4TAYE ","M04N4TAZE ","M04N4TDXSS","M04N4TDYSS", & + "M04N4TDZSS","M04N5FKXE ","M04N5FKYE ","M04N5FKZE ","M04N5FMXE ","M04N5FMYE ","M04N5FMZE ", & + "M04N5MKXE ","M04N5MKYE ","M04N5MKZE ","M04N5MMXE ","M04N5MMYE ","M04N5MMZE ","M04N5RAXE ", & + "M04N5RAYE ","M04N5RAZE ","M04N5RDXE ","M04N5RDYE ","M04N5RDZE ","M04N5TAXE ","M04N5TAYE ", & + "M04N5TAZE ","M04N5TDXSS","M04N5TDYSS","M04N5TDZSS","M04N6FKXE ","M04N6FKYE ","M04N6FKZE ", & + "M04N6FMXE ","M04N6FMYE ","M04N6FMZE ","M04N6MKXE ","M04N6MKYE ","M04N6MKZE ","M04N6MMXE ", & + "M04N6MMYE ","M04N6MMZE ","M04N6RAXE ","M04N6RAYE ","M04N6RAZE ","M04N6RDXE ","M04N6RDYE ", & + "M04N6RDZE ","M04N6TAXE ","M04N6TAYE ","M04N6TAZE ","M04N6TDXSS","M04N6TDYSS","M04N6TDZSS", & + "M04N7FKXE ","M04N7FKYE ","M04N7FKZE ","M04N7FMXE ","M04N7FMYE ","M04N7FMZE ","M04N7MKXE ", & + "M04N7MKYE ","M04N7MKZE ","M04N7MMXE ","M04N7MMYE ","M04N7MMZE ","M04N7RAXE ","M04N7RAYE ", & + "M04N7RAZE ","M04N7RDXE ","M04N7RDYE ","M04N7RDZE ","M04N7TAXE ","M04N7TAYE ","M04N7TAZE ", & + "M04N7TDXSS","M04N7TDYSS","M04N7TDZSS","M04N8FKXE ","M04N8FKYE ","M04N8FKZE ","M04N8FMXE ", & + "M04N8FMYE ","M04N8FMZE ","M04N8MKXE ","M04N8MKYE ","M04N8MKZE ","M04N8MMXE ","M04N8MMYE ", & + "M04N8MMZE ","M04N8RAXE ","M04N8RAYE ","M04N8RAZE ","M04N8RDXE ","M04N8RDYE ","M04N8RDZE ", & + "M04N8TAXE ","M04N8TAYE ","M04N8TAZE ","M04N8TDXSS","M04N8TDYSS","M04N8TDZSS","M04N9FKXE ", & + "M04N9FKYE ","M04N9FKZE ","M04N9FMXE ","M04N9FMYE ","M04N9FMZE ","M04N9MKXE ","M04N9MKYE ", & + "M04N9MKZE ","M04N9MMXE ","M04N9MMYE ","M04N9MMZE ","M04N9RAXE ","M04N9RAYE ","M04N9RAZE ", & + "M04N9RDXE ","M04N9RDYE ","M04N9RDZE ","M04N9TAXE ","M04N9TAYE ","M04N9TAZE ","M04N9TDXSS", & + "M04N9TDYSS","M04N9TDZSS","M05N1FKXE ","M05N1FKYE ","M05N1FKZE ","M05N1FMXE ","M05N1FMYE ", & + "M05N1FMZE ","M05N1MKXE ","M05N1MKYE ","M05N1MKZE ","M05N1MMXE ","M05N1MMYE ","M05N1MMZE ", & + "M05N1RAXE ","M05N1RAYE ","M05N1RAZE ","M05N1RDXE ","M05N1RDYE ","M05N1RDZE ","M05N1TAXE ", & + "M05N1TAYE ","M05N1TAZE ","M05N1TDXSS","M05N1TDYSS","M05N1TDZSS","M05N2FKXE ","M05N2FKYE ", & + "M05N2FKZE ","M05N2FMXE ","M05N2FMYE ","M05N2FMZE ","M05N2MKXE ","M05N2MKYE ","M05N2MKZE ", & + "M05N2MMXE ","M05N2MMYE ","M05N2MMZE ","M05N2RAXE ","M05N2RAYE ","M05N2RAZE ","M05N2RDXE ", & + "M05N2RDYE ","M05N2RDZE ","M05N2TAXE ","M05N2TAYE ","M05N2TAZE ","M05N2TDXSS","M05N2TDYSS", & + "M05N2TDZSS","M05N3FKXE ","M05N3FKYE ","M05N3FKZE ","M05N3FMXE ","M05N3FMYE ","M05N3FMZE ", & + "M05N3MKXE ","M05N3MKYE ","M05N3MKZE ","M05N3MMXE ","M05N3MMYE ","M05N3MMZE ","M05N3RAXE ", & + "M05N3RAYE ","M05N3RAZE ","M05N3RDXE ","M05N3RDYE ","M05N3RDZE ","M05N3TAXE ","M05N3TAYE ", & + "M05N3TAZE ","M05N3TDXSS","M05N3TDYSS","M05N3TDZSS","M05N4FKXE ","M05N4FKYE ","M05N4FKZE ", & + "M05N4FMXE ","M05N4FMYE ","M05N4FMZE ","M05N4MKXE ","M05N4MKYE ","M05N4MKZE ","M05N4MMXE ", & + "M05N4MMYE ","M05N4MMZE ","M05N4RAXE ","M05N4RAYE ","M05N4RAZE ","M05N4RDXE ","M05N4RDYE ", & + "M05N4RDZE ","M05N4TAXE ","M05N4TAYE ","M05N4TAZE ","M05N4TDXSS","M05N4TDYSS","M05N4TDZSS", & + "M05N5FKXE ","M05N5FKYE ","M05N5FKZE ","M05N5FMXE ","M05N5FMYE ","M05N5FMZE ","M05N5MKXE ", & + "M05N5MKYE ","M05N5MKZE ","M05N5MMXE ","M05N5MMYE ","M05N5MMZE ","M05N5RAXE ","M05N5RAYE ", & + "M05N5RAZE ","M05N5RDXE ","M05N5RDYE ","M05N5RDZE ","M05N5TAXE ","M05N5TAYE ","M05N5TAZE ", & + "M05N5TDXSS","M05N5TDYSS","M05N5TDZSS","M05N6FKXE ","M05N6FKYE ","M05N6FKZE ","M05N6FMXE ", & + "M05N6FMYE ","M05N6FMZE ","M05N6MKXE ","M05N6MKYE ","M05N6MKZE ","M05N6MMXE ","M05N6MMYE ", & + "M05N6MMZE ","M05N6RAXE ","M05N6RAYE ","M05N6RAZE ","M05N6RDXE ","M05N6RDYE ","M05N6RDZE ", & + "M05N6TAXE ","M05N6TAYE ","M05N6TAZE ","M05N6TDXSS","M05N6TDYSS","M05N6TDZSS","M05N7FKXE ", & + "M05N7FKYE ","M05N7FKZE ","M05N7FMXE ","M05N7FMYE ","M05N7FMZE ","M05N7MKXE ","M05N7MKYE ", & + "M05N7MKZE ","M05N7MMXE ","M05N7MMYE ","M05N7MMZE ","M05N7RAXE ","M05N7RAYE ","M05N7RAZE ", & + "M05N7RDXE ","M05N7RDYE ","M05N7RDZE ","M05N7TAXE ","M05N7TAYE ","M05N7TAZE ","M05N7TDXSS", & + "M05N7TDYSS","M05N7TDZSS","M05N8FKXE ","M05N8FKYE ","M05N8FKZE ","M05N8FMXE ","M05N8FMYE ", & + "M05N8FMZE ","M05N8MKXE ","M05N8MKYE ","M05N8MKZE ","M05N8MMXE ","M05N8MMYE ","M05N8MMZE ", & + "M05N8RAXE ","M05N8RAYE ","M05N8RAZE ","M05N8RDXE ","M05N8RDYE ","M05N8RDZE ","M05N8TAXE ", & + "M05N8TAYE ","M05N8TAZE ","M05N8TDXSS","M05N8TDYSS","M05N8TDZSS","M05N9FKXE ","M05N9FKYE ", & + "M05N9FKZE ","M05N9FMXE ","M05N9FMYE ","M05N9FMZE ","M05N9MKXE ","M05N9MKYE ","M05N9MKZE ", & + "M05N9MMXE ","M05N9MMYE ","M05N9MMZE ","M05N9RAXE ","M05N9RAYE ","M05N9RAZE ","M05N9RDXE ", & + "M05N9RDYE ","M05N9RDZE ","M05N9TAXE ","M05N9TAYE ","M05N9TAZE ","M05N9TDXSS","M05N9TDYSS", & + "M05N9TDZSS","M06N1FKXE ","M06N1FKYE ","M06N1FKZE ","M06N1FMXE ","M06N1FMYE ","M06N1FMZE ", & + "M06N1MKXE ","M06N1MKYE ","M06N1MKZE ","M06N1MMXE ","M06N1MMYE ","M06N1MMZE ","M06N1RAXE ", & + "M06N1RAYE ","M06N1RAZE ","M06N1RDXE ","M06N1RDYE ","M06N1RDZE ","M06N1TAXE ","M06N1TAYE ", & + "M06N1TAZE ","M06N1TDXSS","M06N1TDYSS","M06N1TDZSS","M06N2FKXE ","M06N2FKYE ","M06N2FKZE ", & + "M06N2FMXE ","M06N2FMYE ","M06N2FMZE ","M06N2MKXE ","M06N2MKYE ","M06N2MKZE ","M06N2MMXE ", & + "M06N2MMYE ","M06N2MMZE ","M06N2RAXE ","M06N2RAYE ","M06N2RAZE ","M06N2RDXE ","M06N2RDYE ", & + "M06N2RDZE ","M06N2TAXE ","M06N2TAYE ","M06N2TAZE ","M06N2TDXSS","M06N2TDYSS","M06N2TDZSS", & + "M06N3FKXE ","M06N3FKYE ","M06N3FKZE ","M06N3FMXE ","M06N3FMYE ","M06N3FMZE ","M06N3MKXE ", & + "M06N3MKYE ","M06N3MKZE ","M06N3MMXE ","M06N3MMYE ","M06N3MMZE ","M06N3RAXE ","M06N3RAYE ", & + "M06N3RAZE ","M06N3RDXE ","M06N3RDYE ","M06N3RDZE ","M06N3TAXE ","M06N3TAYE ","M06N3TAZE ", & + "M06N3TDXSS","M06N3TDYSS","M06N3TDZSS","M06N4FKXE ","M06N4FKYE ","M06N4FKZE ","M06N4FMXE ", & + "M06N4FMYE ","M06N4FMZE ","M06N4MKXE ","M06N4MKYE ","M06N4MKZE ","M06N4MMXE ","M06N4MMYE ", & + "M06N4MMZE ","M06N4RAXE ","M06N4RAYE ","M06N4RAZE ","M06N4RDXE ","M06N4RDYE ","M06N4RDZE ", & + "M06N4TAXE ","M06N4TAYE ","M06N4TAZE ","M06N4TDXSS","M06N4TDYSS","M06N4TDZSS","M06N5FKXE ", & + "M06N5FKYE ","M06N5FKZE ","M06N5FMXE ","M06N5FMYE ","M06N5FMZE ","M06N5MKXE ","M06N5MKYE ", & + "M06N5MKZE ","M06N5MMXE ","M06N5MMYE ","M06N5MMZE ","M06N5RAXE ","M06N5RAYE ","M06N5RAZE ", & + "M06N5RDXE ","M06N5RDYE ","M06N5RDZE ","M06N5TAXE ","M06N5TAYE ","M06N5TAZE ","M06N5TDXSS", & + "M06N5TDYSS","M06N5TDZSS","M06N6FKXE ","M06N6FKYE ","M06N6FKZE ","M06N6FMXE ","M06N6FMYE ", & + "M06N6FMZE ","M06N6MKXE ","M06N6MKYE ","M06N6MKZE ","M06N6MMXE ","M06N6MMYE ","M06N6MMZE ", & + "M06N6RAXE ","M06N6RAYE ","M06N6RAZE ","M06N6RDXE ","M06N6RDYE ","M06N6RDZE ","M06N6TAXE ", & + "M06N6TAYE ","M06N6TAZE ","M06N6TDXSS","M06N6TDYSS","M06N6TDZSS","M06N7FKXE ","M06N7FKYE ", & + "M06N7FKZE ","M06N7FMXE ","M06N7FMYE ","M06N7FMZE ","M06N7MKXE ","M06N7MKYE ","M06N7MKZE ", & + "M06N7MMXE ","M06N7MMYE ","M06N7MMZE ","M06N7RAXE ","M06N7RAYE ","M06N7RAZE ","M06N7RDXE ", & + "M06N7RDYE ","M06N7RDZE ","M06N7TAXE ","M06N7TAYE ","M06N7TAZE ","M06N7TDXSS","M06N7TDYSS", & + "M06N7TDZSS","M06N8FKXE ","M06N8FKYE ","M06N8FKZE ","M06N8FMXE ","M06N8FMYE ","M06N8FMZE ", & + "M06N8MKXE ","M06N8MKYE ","M06N8MKZE ","M06N8MMXE ","M06N8MMYE ","M06N8MMZE ","M06N8RAXE ", & + "M06N8RAYE ","M06N8RAZE ","M06N8RDXE ","M06N8RDYE ","M06N8RDZE ","M06N8TAXE ","M06N8TAYE ", & + "M06N8TAZE ","M06N8TDXSS","M06N8TDYSS","M06N8TDZSS","M06N9FKXE ","M06N9FKYE ","M06N9FKZE ", & + "M06N9FMXE ","M06N9FMYE ","M06N9FMZE ","M06N9MKXE ","M06N9MKYE ","M06N9MKZE ","M06N9MMXE ", & + "M06N9MMYE ","M06N9MMZE ","M06N9RAXE ","M06N9RAYE ","M06N9RAZE ","M06N9RDXE ","M06N9RDYE ", & + "M06N9RDZE ","M06N9TAXE ","M06N9TAYE ","M06N9TAZE ","M06N9TDXSS","M06N9TDYSS","M06N9TDZSS", & + "M07N1FKXE ","M07N1FKYE ","M07N1FKZE ","M07N1FMXE ","M07N1FMYE ","M07N1FMZE ","M07N1MKXE ", & + "M07N1MKYE ","M07N1MKZE ","M07N1MMXE ","M07N1MMYE ","M07N1MMZE ","M07N1RAXE ","M07N1RAYE ", & + "M07N1RAZE ","M07N1RDXE ","M07N1RDYE ","M07N1RDZE ","M07N1TAXE ","M07N1TAYE ","M07N1TAZE ", & + "M07N1TDXSS","M07N1TDYSS","M07N1TDZSS","M07N2FKXE ","M07N2FKYE ","M07N2FKZE ","M07N2FMXE ", & + "M07N2FMYE ","M07N2FMZE ","M07N2MKXE ","M07N2MKYE ","M07N2MKZE ","M07N2MMXE ","M07N2MMYE ", & + "M07N2MMZE ","M07N2RAXE ","M07N2RAYE ","M07N2RAZE ","M07N2RDXE ","M07N2RDYE ","M07N2RDZE ", & + "M07N2TAXE ","M07N2TAYE ","M07N2TAZE ","M07N2TDXSS","M07N2TDYSS","M07N2TDZSS","M07N3FKXE ", & + "M07N3FKYE ","M07N3FKZE ","M07N3FMXE ","M07N3FMYE ","M07N3FMZE ","M07N3MKXE ","M07N3MKYE ", & + "M07N3MKZE ","M07N3MMXE ","M07N3MMYE ","M07N3MMZE ","M07N3RAXE ","M07N3RAYE ","M07N3RAZE ", & + "M07N3RDXE ","M07N3RDYE ","M07N3RDZE ","M07N3TAXE ","M07N3TAYE ","M07N3TAZE ","M07N3TDXSS", & + "M07N3TDYSS","M07N3TDZSS","M07N4FKXE ","M07N4FKYE ","M07N4FKZE ","M07N4FMXE ","M07N4FMYE ", & + "M07N4FMZE ","M07N4MKXE ","M07N4MKYE ","M07N4MKZE ","M07N4MMXE ","M07N4MMYE ","M07N4MMZE ", & + "M07N4RAXE ","M07N4RAYE ","M07N4RAZE ","M07N4RDXE ","M07N4RDYE ","M07N4RDZE ","M07N4TAXE ", & + "M07N4TAYE ","M07N4TAZE ","M07N4TDXSS","M07N4TDYSS","M07N4TDZSS","M07N5FKXE ","M07N5FKYE ", & + "M07N5FKZE ","M07N5FMXE ","M07N5FMYE ","M07N5FMZE ","M07N5MKXE ","M07N5MKYE ","M07N5MKZE ", & + "M07N5MMXE ","M07N5MMYE ","M07N5MMZE ","M07N5RAXE ","M07N5RAYE ","M07N5RAZE ","M07N5RDXE ", & + "M07N5RDYE ","M07N5RDZE ","M07N5TAXE ","M07N5TAYE ","M07N5TAZE ","M07N5TDXSS","M07N5TDYSS", & + "M07N5TDZSS","M07N6FKXE ","M07N6FKYE ","M07N6FKZE ","M07N6FMXE ","M07N6FMYE ","M07N6FMZE ", & + "M07N6MKXE ","M07N6MKYE ","M07N6MKZE ","M07N6MMXE ","M07N6MMYE ","M07N6MMZE ","M07N6RAXE ", & + "M07N6RAYE ","M07N6RAZE ","M07N6RDXE ","M07N6RDYE ","M07N6RDZE ","M07N6TAXE ","M07N6TAYE ", & + "M07N6TAZE ","M07N6TDXSS","M07N6TDYSS","M07N6TDZSS","M07N7FKXE ","M07N7FKYE ","M07N7FKZE ", & + "M07N7FMXE ","M07N7FMYE ","M07N7FMZE ","M07N7MKXE ","M07N7MKYE ","M07N7MKZE ","M07N7MMXE ", & + "M07N7MMYE ","M07N7MMZE ","M07N7RAXE ","M07N7RAYE ","M07N7RAZE ","M07N7RDXE ","M07N7RDYE ", & + "M07N7RDZE ","M07N7TAXE ","M07N7TAYE ","M07N7TAZE ","M07N7TDXSS","M07N7TDYSS","M07N7TDZSS", & + "M07N8FKXE ","M07N8FKYE ","M07N8FKZE ","M07N8FMXE ","M07N8FMYE ","M07N8FMZE ","M07N8MKXE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry2(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M07N8MKYE ","M07N8MKZE ","M07N8MMXE ","M07N8MMYE ","M07N8MMZE ","M07N8RAXE ","M07N8RAYE ", & + "M07N8RAZE ","M07N8RDXE ","M07N8RDYE ","M07N8RDZE ","M07N8TAXE ","M07N8TAYE ","M07N8TAZE ", & + "M07N8TDXSS","M07N8TDYSS","M07N8TDZSS","M07N9FKXE ","M07N9FKYE ","M07N9FKZE ","M07N9FMXE ", & + "M07N9FMYE ","M07N9FMZE ","M07N9MKXE ","M07N9MKYE ","M07N9MKZE ","M07N9MMXE ","M07N9MMYE ", & + "M07N9MMZE ","M07N9RAXE ","M07N9RAYE ","M07N9RAZE ","M07N9RDXE ","M07N9RDYE ","M07N9RDZE ", & + "M07N9TAXE ","M07N9TAYE ","M07N9TAZE ","M07N9TDXSS","M07N9TDYSS","M07N9TDZSS","M08N1FKXE ", & + "M08N1FKYE ","M08N1FKZE ","M08N1FMXE ","M08N1FMYE ","M08N1FMZE ","M08N1MKXE ","M08N1MKYE ", & + "M08N1MKZE ","M08N1MMXE ","M08N1MMYE ","M08N1MMZE ","M08N1RAXE ","M08N1RAYE ","M08N1RAZE ", & + "M08N1RDXE ","M08N1RDYE ","M08N1RDZE ","M08N1TAXE ","M08N1TAYE ","M08N1TAZE ","M08N1TDXSS", & + "M08N1TDYSS","M08N1TDZSS","M08N2FKXE ","M08N2FKYE ","M08N2FKZE ","M08N2FMXE ","M08N2FMYE ", & + "M08N2FMZE ","M08N2MKXE ","M08N2MKYE ","M08N2MKZE ","M08N2MMXE ","M08N2MMYE ","M08N2MMZE ", & + "M08N2RAXE ","M08N2RAYE ","M08N2RAZE ","M08N2RDXE ","M08N2RDYE ","M08N2RDZE ","M08N2TAXE ", & + "M08N2TAYE ","M08N2TAZE ","M08N2TDXSS","M08N2TDYSS","M08N2TDZSS","M08N3FKXE ","M08N3FKYE ", & + "M08N3FKZE ","M08N3FMXE ","M08N3FMYE ","M08N3FMZE ","M08N3MKXE ","M08N3MKYE ","M08N3MKZE ", & + "M08N3MMXE ","M08N3MMYE ","M08N3MMZE ","M08N3RAXE ","M08N3RAYE ","M08N3RAZE ","M08N3RDXE ", & + "M08N3RDYE ","M08N3RDZE ","M08N3TAXE ","M08N3TAYE ","M08N3TAZE ","M08N3TDXSS","M08N3TDYSS", & + "M08N3TDZSS","M08N4FKXE ","M08N4FKYE ","M08N4FKZE ","M08N4FMXE ","M08N4FMYE ","M08N4FMZE ", & + "M08N4MKXE ","M08N4MKYE ","M08N4MKZE ","M08N4MMXE ","M08N4MMYE ","M08N4MMZE ","M08N4RAXE ", & + "M08N4RAYE ","M08N4RAZE ","M08N4RDXE ","M08N4RDYE ","M08N4RDZE ","M08N4TAXE ","M08N4TAYE ", & + "M08N4TAZE ","M08N4TDXSS","M08N4TDYSS","M08N4TDZSS","M08N5FKXE ","M08N5FKYE ","M08N5FKZE ", & + "M08N5FMXE ","M08N5FMYE ","M08N5FMZE ","M08N5MKXE ","M08N5MKYE ","M08N5MKZE ","M08N5MMXE ", & + "M08N5MMYE ","M08N5MMZE ","M08N5RAXE ","M08N5RAYE ","M08N5RAZE ","M08N5RDXE ","M08N5RDYE ", & + "M08N5RDZE ","M08N5TAXE ","M08N5TAYE ","M08N5TAZE ","M08N5TDXSS","M08N5TDYSS","M08N5TDZSS", & + "M08N6FKXE ","M08N6FKYE ","M08N6FKZE ","M08N6FMXE ","M08N6FMYE ","M08N6FMZE ","M08N6MKXE ", & + "M08N6MKYE ","M08N6MKZE ","M08N6MMXE ","M08N6MMYE ","M08N6MMZE ","M08N6RAXE ","M08N6RAYE ", & + "M08N6RAZE ","M08N6RDXE ","M08N6RDYE ","M08N6RDZE ","M08N6TAXE ","M08N6TAYE ","M08N6TAZE ", & + "M08N6TDXSS","M08N6TDYSS","M08N6TDZSS","M08N7FKXE ","M08N7FKYE ","M08N7FKZE ","M08N7FMXE ", & + "M08N7FMYE ","M08N7FMZE ","M08N7MKXE ","M08N7MKYE ","M08N7MKZE ","M08N7MMXE ","M08N7MMYE ", & + "M08N7MMZE ","M08N7RAXE ","M08N7RAYE ","M08N7RAZE ","M08N7RDXE ","M08N7RDYE ","M08N7RDZE ", & + "M08N7TAXE ","M08N7TAYE ","M08N7TAZE ","M08N7TDXSS","M08N7TDYSS","M08N7TDZSS","M08N8FKXE ", & + "M08N8FKYE ","M08N8FKZE ","M08N8FMXE ","M08N8FMYE ","M08N8FMZE ","M08N8MKXE ","M08N8MKYE ", & + "M08N8MKZE ","M08N8MMXE ","M08N8MMYE ","M08N8MMZE ","M08N8RAXE ","M08N8RAYE ","M08N8RAZE ", & + "M08N8RDXE ","M08N8RDYE ","M08N8RDZE ","M08N8TAXE ","M08N8TAYE ","M08N8TAZE ","M08N8TDXSS", & + "M08N8TDYSS","M08N8TDZSS","M08N9FKXE ","M08N9FKYE ","M08N9FKZE ","M08N9FMXE ","M08N9FMYE ", & + "M08N9FMZE ","M08N9MKXE ","M08N9MKYE ","M08N9MKZE ","M08N9MMXE ","M08N9MMYE ","M08N9MMZE ", & + "M08N9RAXE ","M08N9RAYE ","M08N9RAZE ","M08N9RDXE ","M08N9RDYE ","M08N9RDZE ","M08N9TAXE ", & + "M08N9TAYE ","M08N9TAZE ","M08N9TDXSS","M08N9TDYSS","M08N9TDZSS","M09N1FKXE ","M09N1FKYE ", & + "M09N1FKZE ","M09N1FMXE ","M09N1FMYE ","M09N1FMZE ","M09N1MKXE ","M09N1MKYE ","M09N1MKZE ", & + "M09N1MMXE ","M09N1MMYE ","M09N1MMZE ","M09N1RAXE ","M09N1RAYE ","M09N1RAZE ","M09N1RDXE ", & + "M09N1RDYE ","M09N1RDZE ","M09N1TAXE ","M09N1TAYE ","M09N1TAZE ","M09N1TDXSS","M09N1TDYSS", & + "M09N1TDZSS","M09N2FKXE ","M09N2FKYE ","M09N2FKZE ","M09N2FMXE ","M09N2FMYE ","M09N2FMZE ", & + "M09N2MKXE ","M09N2MKYE ","M09N2MKZE ","M09N2MMXE ","M09N2MMYE ","M09N2MMZE ","M09N2RAXE ", & + "M09N2RAYE ","M09N2RAZE ","M09N2RDXE ","M09N2RDYE ","M09N2RDZE ","M09N2TAXE ","M09N2TAYE ", & + "M09N2TAZE ","M09N2TDXSS","M09N2TDYSS","M09N2TDZSS","M09N3FKXE ","M09N3FKYE ","M09N3FKZE ", & + "M09N3FMXE ","M09N3FMYE ","M09N3FMZE ","M09N3MKXE ","M09N3MKYE ","M09N3MKZE ","M09N3MMXE ", & + "M09N3MMYE ","M09N3MMZE ","M09N3RAXE ","M09N3RAYE ","M09N3RAZE ","M09N3RDXE ","M09N3RDYE ", & + "M09N3RDZE ","M09N3TAXE ","M09N3TAYE ","M09N3TAZE ","M09N3TDXSS","M09N3TDYSS","M09N3TDZSS", & + "M09N4FKXE ","M09N4FKYE ","M09N4FKZE ","M09N4FMXE ","M09N4FMYE ","M09N4FMZE ","M09N4MKXE ", & + "M09N4MKYE ","M09N4MKZE ","M09N4MMXE ","M09N4MMYE ","M09N4MMZE ","M09N4RAXE ","M09N4RAYE ", & + "M09N4RAZE ","M09N4RDXE ","M09N4RDYE ","M09N4RDZE ","M09N4TAXE ","M09N4TAYE ","M09N4TAZE ", & + "M09N4TDXSS","M09N4TDYSS","M09N4TDZSS","M09N5FKXE ","M09N5FKYE ","M09N5FKZE ","M09N5FMXE ", & + "M09N5FMYE ","M09N5FMZE ","M09N5MKXE ","M09N5MKYE ","M09N5MKZE ","M09N5MMXE ","M09N5MMYE ", & + "M09N5MMZE ","M09N5RAXE ","M09N5RAYE ","M09N5RAZE ","M09N5RDXE ","M09N5RDYE ","M09N5RDZE ", & + "M09N5TAXE ","M09N5TAYE ","M09N5TAZE ","M09N5TDXSS","M09N5TDYSS","M09N5TDZSS","M09N6FKXE ", & + "M09N6FKYE ","M09N6FKZE ","M09N6FMXE ","M09N6FMYE ","M09N6FMZE ","M09N6MKXE ","M09N6MKYE ", & + "M09N6MKZE ","M09N6MMXE ","M09N6MMYE ","M09N6MMZE ","M09N6RAXE ","M09N6RAYE ","M09N6RAZE ", & + "M09N6RDXE ","M09N6RDYE ","M09N6RDZE ","M09N6TAXE ","M09N6TAYE ","M09N6TAZE ","M09N6TDXSS", & + "M09N6TDYSS","M09N6TDZSS","M09N7FKXE ","M09N7FKYE ","M09N7FKZE ","M09N7FMXE ","M09N7FMYE ", & + "M09N7FMZE ","M09N7MKXE ","M09N7MKYE ","M09N7MKZE ","M09N7MMXE ","M09N7MMYE ","M09N7MMZE ", & + "M09N7RAXE ","M09N7RAYE ","M09N7RAZE ","M09N7RDXE ","M09N7RDYE ","M09N7RDZE ","M09N7TAXE ", & + "M09N7TAYE ","M09N7TAZE ","M09N7TDXSS","M09N7TDYSS","M09N7TDZSS","M09N8FKXE ","M09N8FKYE ", & + "M09N8FKZE ","M09N8FMXE ","M09N8FMYE ","M09N8FMZE ","M09N8MKXE ","M09N8MKYE ","M09N8MKZE ", & + "M09N8MMXE ","M09N8MMYE ","M09N8MMZE ","M09N8RAXE ","M09N8RAYE ","M09N8RAZE ","M09N8RDXE ", & + "M09N8RDYE ","M09N8RDZE ","M09N8TAXE ","M09N8TAYE ","M09N8TAZE ","M09N8TDXSS","M09N8TDYSS", & + "M09N8TDZSS","M09N9FKXE ","M09N9FKYE ","M09N9FKZE ","M09N9FMXE ","M09N9FMYE ","M09N9FMZE ", & + "M09N9MKXE ","M09N9MKYE ","M09N9MKZE ","M09N9MMXE ","M09N9MMYE ","M09N9MMZE ","M09N9RAXE ", & + "M09N9RAYE ","M09N9RAZE ","M09N9RDXE ","M09N9RDYE ","M09N9RDZE ","M09N9TAXE ","M09N9TAYE ", & + "M09N9TAZE ","M09N9TDXSS","M09N9TDYSS","M09N9TDZSS","M10N1FKXE ","M10N1FKYE ","M10N1FKZE ", & + "M10N1FMXE ","M10N1FMYE ","M10N1FMZE ","M10N1MKXE ","M10N1MKYE ","M10N1MKZE ","M10N1MMXE ", & + "M10N1MMYE ","M10N1MMZE ","M10N1RAXE ","M10N1RAYE ","M10N1RAZE ","M10N1RDXE ","M10N1RDYE ", & + "M10N1RDZE ","M10N1TAXE ","M10N1TAYE ","M10N1TAZE ","M10N1TDXSS","M10N1TDYSS","M10N1TDZSS", & + "M10N2FKXE ","M10N2FKYE ","M10N2FKZE ","M10N2FMXE ","M10N2FMYE ","M10N2FMZE ","M10N2MKXE ", & + "M10N2MKYE ","M10N2MKZE ","M10N2MMXE ","M10N2MMYE ","M10N2MMZE ","M10N2RAXE ","M10N2RAYE ", & + "M10N2RAZE ","M10N2RDXE ","M10N2RDYE ","M10N2RDZE ","M10N2TAXE ","M10N2TAYE ","M10N2TAZE ", & + "M10N2TDXSS","M10N2TDYSS","M10N2TDZSS","M10N3FKXE ","M10N3FKYE ","M10N3FKZE ","M10N3FMXE ", & + "M10N3FMYE ","M10N3FMZE ","M10N3MKXE ","M10N3MKYE ","M10N3MKZE ","M10N3MMXE ","M10N3MMYE ", & + "M10N3MMZE ","M10N3RAXE ","M10N3RAYE ","M10N3RAZE ","M10N3RDXE ","M10N3RDYE ","M10N3RDZE ", & + "M10N3TAXE ","M10N3TAYE ","M10N3TAZE ","M10N3TDXSS","M10N3TDYSS","M10N3TDZSS","M10N4FKXE ", & + "M10N4FKYE ","M10N4FKZE ","M10N4FMXE ","M10N4FMYE ","M10N4FMZE ","M10N4MKXE ","M10N4MKYE ", & + "M10N4MKZE ","M10N4MMXE ","M10N4MMYE ","M10N4MMZE ","M10N4RAXE ","M10N4RAYE ","M10N4RAZE ", & + "M10N4RDXE ","M10N4RDYE ","M10N4RDZE ","M10N4TAXE ","M10N4TAYE ","M10N4TAZE ","M10N4TDXSS", & + "M10N4TDYSS","M10N4TDZSS","M10N5FKXE ","M10N5FKYE ","M10N5FKZE ","M10N5FMXE ","M10N5FMYE ", & + "M10N5FMZE ","M10N5MKXE ","M10N5MKYE ","M10N5MKZE ","M10N5MMXE ","M10N5MMYE ","M10N5MMZE ", & + "M10N5RAXE ","M10N5RAYE ","M10N5RAZE ","M10N5RDXE ","M10N5RDYE ","M10N5RDZE ","M10N5TAXE ", & + "M10N5TAYE ","M10N5TAZE ","M10N5TDXSS","M10N5TDYSS","M10N5TDZSS","M10N6FKXE ","M10N6FKYE ", & + "M10N6FKZE ","M10N6FMXE ","M10N6FMYE ","M10N6FMZE ","M10N6MKXE ","M10N6MKYE ","M10N6MKZE ", & + "M10N6MMXE ","M10N6MMYE ","M10N6MMZE ","M10N6RAXE ","M10N6RAYE ","M10N6RAZE ","M10N6RDXE ", & + "M10N6RDYE ","M10N6RDZE ","M10N6TAXE ","M10N6TAYE ","M10N6TAZE ","M10N6TDXSS","M10N6TDYSS", & + "M10N6TDZSS","M10N7FKXE ","M10N7FKYE ","M10N7FKZE ","M10N7FMXE ","M10N7FMYE ","M10N7FMZE ", & + "M10N7MKXE ","M10N7MKYE ","M10N7MKZE ","M10N7MMXE ","M10N7MMYE ","M10N7MMZE ","M10N7RAXE ", & + "M10N7RAYE ","M10N7RAZE ","M10N7RDXE ","M10N7RDYE ","M10N7RDZE ","M10N7TAXE ","M10N7TAYE ", & + "M10N7TAZE ","M10N7TDXSS","M10N7TDYSS","M10N7TDZSS","M10N8FKXE ","M10N8FKYE ","M10N8FKZE ", & + "M10N8FMXE ","M10N8FMYE ","M10N8FMZE ","M10N8MKXE ","M10N8MKYE ","M10N8MKZE ","M10N8MMXE ", & + "M10N8MMYE ","M10N8MMZE ","M10N8RAXE ","M10N8RAYE ","M10N8RAZE ","M10N8RDXE ","M10N8RDYE ", & + "M10N8RDZE ","M10N8TAXE ","M10N8TAYE ","M10N8TAZE ","M10N8TDXSS","M10N8TDYSS","M10N8TDZSS", & + "M10N9FKXE ","M10N9FKYE ","M10N9FKZE ","M10N9FMXE ","M10N9FMYE ","M10N9FMZE ","M10N9MKXE ", & + "M10N9MKYE ","M10N9MKZE ","M10N9MMXE ","M10N9MMYE ","M10N9MMZE ","M10N9RAXE ","M10N9RAYE ", & + "M10N9RAZE ","M10N9RDXE ","M10N9RDYE ","M10N9RDZE ","M10N9TAXE ","M10N9TAYE ","M10N9TAZE ", & + "M10N9TDXSS","M10N9TDYSS","M10N9TDZSS","M11N1FKXE ","M11N1FKYE ","M11N1FKZE ","M11N1FMXE ", & + "M11N1FMYE ","M11N1FMZE ","M11N1MKXE ","M11N1MKYE ","M11N1MKZE ","M11N1MMXE ","M11N1MMYE ", & + "M11N1MMZE ","M11N1RAXE ","M11N1RAYE ","M11N1RAZE ","M11N1RDXE ","M11N1RDYE ","M11N1RDZE ", & + "M11N1TAXE ","M11N1TAYE ","M11N1TAZE ","M11N1TDXSS","M11N1TDYSS","M11N1TDZSS","M11N2FKXE ", & + "M11N2FKYE ","M11N2FKZE ","M11N2FMXE ","M11N2FMYE ","M11N2FMZE ","M11N2MKXE ","M11N2MKYE ", & + "M11N2MKZE ","M11N2MMXE ","M11N2MMYE ","M11N2MMZE ","M11N2RAXE ","M11N2RAYE ","M11N2RAZE ", & + "M11N2RDXE ","M11N2RDYE ","M11N2RDZE ","M11N2TAXE ","M11N2TAYE ","M11N2TAZE ","M11N2TDXSS", & + "M11N2TDYSS","M11N2TDZSS","M11N3FKXE ","M11N3FKYE ","M11N3FKZE ","M11N3FMXE ","M11N3FMYE ", & + "M11N3FMZE ","M11N3MKXE ","M11N3MKYE ","M11N3MKZE ","M11N3MMXE ","M11N3MMYE ","M11N3MMZE ", & + "M11N3RAXE ","M11N3RAYE ","M11N3RAZE ","M11N3RDXE ","M11N3RDYE ","M11N3RDZE ","M11N3TAXE ", & + "M11N3TAYE ","M11N3TAZE ","M11N3TDXSS","M11N3TDYSS","M11N3TDZSS","M11N4FKXE ","M11N4FKYE ", & + "M11N4FKZE ","M11N4FMXE ","M11N4FMYE ","M11N4FMZE ","M11N4MKXE ","M11N4MKYE ","M11N4MKZE ", & + "M11N4MMXE ","M11N4MMYE ","M11N4MMZE ","M11N4RAXE ","M11N4RAYE ","M11N4RAZE ","M11N4RDXE ", & + "M11N4RDYE ","M11N4RDZE ","M11N4TAXE ","M11N4TAYE ","M11N4TAZE ","M11N4TDXSS","M11N4TDYSS", & + "M11N4TDZSS","M11N5FKXE ","M11N5FKYE ","M11N5FKZE ","M11N5FMXE ","M11N5FMYE ","M11N5FMZE ", & + "M11N5MKXE ","M11N5MKYE ","M11N5MKZE ","M11N5MMXE ","M11N5MMYE ","M11N5MMZE ","M11N5RAXE ", & + "M11N5RAYE ","M11N5RAZE ","M11N5RDXE ","M11N5RDYE ","M11N5RDZE ","M11N5TAXE ","M11N5TAYE ", & + "M11N5TAZE ","M11N5TDXSS","M11N5TDYSS","M11N5TDZSS","M11N6FKXE ","M11N6FKYE ","M11N6FKZE ", & + "M11N6FMXE ","M11N6FMYE ","M11N6FMZE ","M11N6MKXE ","M11N6MKYE ","M11N6MKZE ","M11N6MMXE ", & + "M11N6MMYE ","M11N6MMZE ","M11N6RAXE ","M11N6RAYE ","M11N6RAZE ","M11N6RDXE ","M11N6RDYE ", & + "M11N6RDZE ","M11N6TAXE ","M11N6TAYE ","M11N6TAZE ","M11N6TDXSS","M11N6TDYSS","M11N6TDZSS", & + "M11N7FKXE ","M11N7FKYE ","M11N7FKZE ","M11N7FMXE ","M11N7FMYE ","M11N7FMZE ","M11N7MKXE ", & + "M11N7MKYE ","M11N7MKZE ","M11N7MMXE ","M11N7MMYE ","M11N7MMZE ","M11N7RAXE ","M11N7RAYE ", & + "M11N7RAZE ","M11N7RDXE ","M11N7RDYE ","M11N7RDZE ","M11N7TAXE ","M11N7TAYE ","M11N7TAZE ", & + "M11N7TDXSS","M11N7TDYSS","M11N7TDZSS","M11N8FKXE ","M11N8FKYE ","M11N8FKZE ","M11N8FMXE ", & + "M11N8FMYE ","M11N8FMZE ","M11N8MKXE ","M11N8MKYE ","M11N8MKZE ","M11N8MMXE ","M11N8MMYE ", & + "M11N8MMZE ","M11N8RAXE ","M11N8RAYE ","M11N8RAZE ","M11N8RDXE ","M11N8RDYE ","M11N8RDZE ", & + "M11N8TAXE ","M11N8TAYE ","M11N8TAZE ","M11N8TDXSS","M11N8TDYSS","M11N8TDZSS","M11N9FKXE ", & + "M11N9FKYE ","M11N9FKZE ","M11N9FMXE ","M11N9FMYE ","M11N9FMZE ","M11N9MKXE ","M11N9MKYE ", & + "M11N9MKZE ","M11N9MMXE ","M11N9MMYE ","M11N9MMZE ","M11N9RAXE ","M11N9RAYE ","M11N9RAZE ", & + "M11N9RDXE ","M11N9RDYE ","M11N9RDZE ","M11N9TAXE ","M11N9TAYE ","M11N9TAZE ","M11N9TDXSS", & + "M11N9TDYSS","M11N9TDZSS","M12N1FKXE ","M12N1FKYE ","M12N1FKZE ","M12N1FMXE ","M12N1FMYE ", & + "M12N1FMZE ","M12N1MKXE ","M12N1MKYE ","M12N1MKZE ","M12N1MMXE ","M12N1MMYE ","M12N1MMZE ", & + "M12N1RAXE ","M12N1RAYE ","M12N1RAZE ","M12N1RDXE ","M12N1RDYE ","M12N1RDZE ","M12N1TAXE ", & + "M12N1TAYE ","M12N1TAZE ","M12N1TDXSS","M12N1TDYSS","M12N1TDZSS","M12N2FKXE ","M12N2FKYE ", & + "M12N2FKZE ","M12N2FMXE ","M12N2FMYE ","M12N2FMZE ","M12N2MKXE ","M12N2MKYE ","M12N2MKZE ", & + "M12N2MMXE ","M12N2MMYE ","M12N2MMZE ","M12N2RAXE ","M12N2RAYE ","M12N2RAZE ","M12N2RDXE ", & + "M12N2RDYE ","M12N2RDZE ","M12N2TAXE ","M12N2TAYE ","M12N2TAZE ","M12N2TDXSS","M12N2TDYSS", & + "M12N2TDZSS","M12N3FKXE ","M12N3FKYE ","M12N3FKZE ","M12N3FMXE ","M12N3FMYE ","M12N3FMZE ", & + "M12N3MKXE ","M12N3MKYE ","M12N3MKZE ","M12N3MMXE ","M12N3MMYE ","M12N3MMZE ","M12N3RAXE ", & + "M12N3RAYE ","M12N3RAZE ","M12N3RDXE ","M12N3RDYE ","M12N3RDZE ","M12N3TAXE ","M12N3TAYE ", & + "M12N3TAZE ","M12N3TDXSS","M12N3TDYSS","M12N3TDZSS","M12N4FKXE ","M12N4FKYE ","M12N4FKZE ", & + "M12N4FMXE ","M12N4FMYE ","M12N4FMZE ","M12N4MKXE ","M12N4MKYE ","M12N4MKZE ","M12N4MMXE ", & + "M12N4MMYE ","M12N4MMZE ","M12N4RAXE ","M12N4RAYE ","M12N4RAZE ","M12N4RDXE ","M12N4RDYE ", & + "M12N4RDZE ","M12N4TAXE ","M12N4TAYE ","M12N4TAZE ","M12N4TDXSS","M12N4TDYSS","M12N4TDZSS", & + "M12N5FKXE ","M12N5FKYE ","M12N5FKZE ","M12N5FMXE ","M12N5FMYE ","M12N5FMZE ","M12N5MKXE ", & + "M12N5MKYE ","M12N5MKZE ","M12N5MMXE ","M12N5MMYE ","M12N5MMZE ","M12N5RAXE ","M12N5RAYE ", & + "M12N5RAZE ","M12N5RDXE ","M12N5RDYE ","M12N5RDZE ","M12N5TAXE ","M12N5TAYE ","M12N5TAZE ", & + "M12N5TDXSS","M12N5TDYSS","M12N5TDZSS","M12N6FKXE ","M12N6FKYE ","M12N6FKZE ","M12N6FMXE ", & + "M12N6FMYE ","M12N6FMZE ","M12N6MKXE ","M12N6MKYE ","M12N6MKZE ","M12N6MMXE ","M12N6MMYE ", & + "M12N6MMZE ","M12N6RAXE ","M12N6RAYE ","M12N6RAZE ","M12N6RDXE ","M12N6RDYE ","M12N6RDZE ", & + "M12N6TAXE ","M12N6TAYE ","M12N6TAZE ","M12N6TDXSS","M12N6TDYSS","M12N6TDZSS","M12N7FKXE ", & + "M12N7FKYE ","M12N7FKZE ","M12N7FMXE ","M12N7FMYE ","M12N7FMZE ","M12N7MKXE ","M12N7MKYE ", & + "M12N7MKZE ","M12N7MMXE ","M12N7MMYE ","M12N7MMZE ","M12N7RAXE ","M12N7RAYE ","M12N7RAZE ", & + "M12N7RDXE ","M12N7RDYE ","M12N7RDZE ","M12N7TAXE ","M12N7TAYE ","M12N7TAZE ","M12N7TDXSS", & + "M12N7TDYSS","M12N7TDZSS","M12N8FKXE ","M12N8FKYE ","M12N8FKZE ","M12N8FMXE ","M12N8FMYE ", & + "M12N8FMZE ","M12N8MKXE ","M12N8MKYE ","M12N8MKZE ","M12N8MMXE ","M12N8MMYE ","M12N8MMZE ", & + "M12N8RAXE ","M12N8RAYE ","M12N8RAZE ","M12N8RDXE ","M12N8RDYE ","M12N8RDZE ","M12N8TAXE ", & + "M12N8TAYE ","M12N8TAZE ","M12N8TDXSS","M12N8TDYSS","M12N8TDZSS","M12N9FKXE ","M12N9FKYE ", & + "M12N9FKZE ","M12N9FMXE ","M12N9FMYE ","M12N9FMZE ","M12N9MKXE ","M12N9MKYE ","M12N9MKZE ", & + "M12N9MMXE ","M12N9MMYE ","M12N9MMZE ","M12N9RAXE ","M12N9RAYE ","M12N9RAZE ","M12N9RDXE ", & + "M12N9RDYE ","M12N9RDZE ","M12N9TAXE ","M12N9TAYE ","M12N9TAZE ","M12N9TDXSS","M12N9TDYSS", & + "M12N9TDZSS","M13N1FKXE ","M13N1FKYE ","M13N1FKZE ","M13N1FMXE ","M13N1FMYE ","M13N1FMZE ", & + "M13N1MKXE ","M13N1MKYE ","M13N1MKZE ","M13N1MMXE ","M13N1MMYE ","M13N1MMZE ","M13N1RAXE ", & + "M13N1RAYE ","M13N1RAZE ","M13N1RDXE ","M13N1RDYE ","M13N1RDZE ","M13N1TAXE ","M13N1TAYE ", & + "M13N1TAZE ","M13N1TDXSS","M13N1TDYSS","M13N1TDZSS","M13N2FKXE ","M13N2FKYE ","M13N2FKZE ", & + "M13N2FMXE ","M13N2FMYE ","M13N2FMZE ","M13N2MKXE ","M13N2MKYE ","M13N2MKZE ","M13N2MMXE ", & + "M13N2MMYE ","M13N2MMZE ","M13N2RAXE ","M13N2RAYE ","M13N2RAZE ","M13N2RDXE ","M13N2RDYE ", & + "M13N2RDZE ","M13N2TAXE ","M13N2TAYE ","M13N2TAZE ","M13N2TDXSS","M13N2TDYSS","M13N2TDZSS", & + "M13N3FKXE ","M13N3FKYE ","M13N3FKZE ","M13N3FMXE ","M13N3FMYE ","M13N3FMZE ","M13N3MKXE ", & + "M13N3MKYE ","M13N3MKZE ","M13N3MMXE ","M13N3MMYE ","M13N3MMZE ","M13N3RAXE ","M13N3RAYE ", & + "M13N3RAZE ","M13N3RDXE ","M13N3RDYE ","M13N3RDZE ","M13N3TAXE ","M13N3TAYE ","M13N3TAZE ", & + "M13N3TDXSS","M13N3TDYSS","M13N3TDZSS","M13N4FKXE ","M13N4FKYE ","M13N4FKZE ","M13N4FMXE ", & + "M13N4FMYE ","M13N4FMZE ","M13N4MKXE ","M13N4MKYE ","M13N4MKZE ","M13N4MMXE ","M13N4MMYE ", & + "M13N4MMZE ","M13N4RAXE ","M13N4RAYE ","M13N4RAZE ","M13N4RDXE ","M13N4RDYE ","M13N4RDZE ", & + "M13N4TAXE ","M13N4TAYE ","M13N4TAZE ","M13N4TDXSS","M13N4TDYSS","M13N4TDZSS","M13N5FKXE ", & + "M13N5FKYE ","M13N5FKZE ","M13N5FMXE ","M13N5FMYE ","M13N5FMZE ","M13N5MKXE ","M13N5MKYE ", & + "M13N5MKZE ","M13N5MMXE ","M13N5MMYE ","M13N5MMZE ","M13N5RAXE ","M13N5RAYE ","M13N5RAZE ", & + "M13N5RDXE ","M13N5RDYE ","M13N5RDZE ","M13N5TAXE ","M13N5TAYE ","M13N5TAZE ","M13N5TDXSS", & + "M13N5TDYSS","M13N5TDZSS","M13N6FKXE ","M13N6FKYE ","M13N6FKZE ","M13N6FMXE ","M13N6FMYE ", & + "M13N6FMZE ","M13N6MKXE ","M13N6MKYE ","M13N6MKZE ","M13N6MMXE ","M13N6MMYE ","M13N6MMZE ", & + "M13N6RAXE ","M13N6RAYE ","M13N6RAZE ","M13N6RDXE ","M13N6RDYE ","M13N6RDZE ","M13N6TAXE ", & + "M13N6TAYE ","M13N6TAZE ","M13N6TDXSS","M13N6TDYSS","M13N6TDZSS","M13N7FKXE ","M13N7FKYE ", & + "M13N7FKZE ","M13N7FMXE ","M13N7FMYE ","M13N7FMZE ","M13N7MKXE ","M13N7MKYE ","M13N7MKZE ", & + "M13N7MMXE ","M13N7MMYE ","M13N7MMZE ","M13N7RAXE ","M13N7RAYE ","M13N7RAZE ","M13N7RDXE ", & + "M13N7RDYE ","M13N7RDZE ","M13N7TAXE ","M13N7TAYE ","M13N7TAZE ","M13N7TDXSS","M13N7TDYSS", & + "M13N7TDZSS","M13N8FKXE ","M13N8FKYE ","M13N8FKZE ","M13N8FMXE ","M13N8FMYE ","M13N8FMZE ", & + "M13N8MKXE ","M13N8MKYE ","M13N8MKZE ","M13N8MMXE ","M13N8MMYE ","M13N8MMZE ","M13N8RAXE ", & + "M13N8RAYE ","M13N8RAZE ","M13N8RDXE ","M13N8RDYE ","M13N8RDZE ","M13N8TAXE ","M13N8TAYE ", & + "M13N8TAZE ","M13N8TDXSS","M13N8TDYSS","M13N8TDZSS","M13N9FKXE ","M13N9FKYE ","M13N9FKZE ", & + "M13N9FMXE ","M13N9FMYE ","M13N9FMZE ","M13N9MKXE ","M13N9MKYE ","M13N9MKZE ","M13N9MMXE ", & + "M13N9MMYE ","M13N9MMZE ","M13N9RAXE ","M13N9RAYE ","M13N9RAZE ","M13N9RDXE ","M13N9RDYE ", & + "M13N9RDZE ","M13N9TAXE ","M13N9TAYE ","M13N9TAZE ","M13N9TDXSS","M13N9TDYSS","M13N9TDZSS", & + "M14N1FKXE ","M14N1FKYE ","M14N1FKZE ","M14N1FMXE ","M14N1FMYE ","M14N1FMZE ","M14N1MKXE ", & + "M14N1MKYE ","M14N1MKZE ","M14N1MMXE ","M14N1MMYE ","M14N1MMZE ","M14N1RAXE ","M14N1RAYE ", & + "M14N1RAZE ","M14N1RDXE ","M14N1RDYE ","M14N1RDZE ","M14N1TAXE ","M14N1TAYE ","M14N1TAZE ", & + "M14N1TDXSS","M14N1TDYSS","M14N1TDZSS","M14N2FKXE ","M14N2FKYE ","M14N2FKZE ","M14N2FMXE ", & + "M14N2FMYE ","M14N2FMZE ","M14N2MKXE ","M14N2MKYE ","M14N2MKZE ","M14N2MMXE ","M14N2MMYE ", & + "M14N2MMZE ","M14N2RAXE ","M14N2RAYE ","M14N2RAZE ","M14N2RDXE ","M14N2RDYE ","M14N2RDZE ", & + "M14N2TAXE ","M14N2TAYE ","M14N2TAZE ","M14N2TDXSS","M14N2TDYSS","M14N2TDZSS","M14N3FKXE ", & + "M14N3FKYE ","M14N3FKZE ","M14N3FMXE ","M14N3FMYE ","M14N3FMZE ","M14N3MKXE ","M14N3MKYE ", & + "M14N3MKZE ","M14N3MMXE ","M14N3MMYE ","M14N3MMZE ","M14N3RAXE ","M14N3RAYE ","M14N3RAZE ", & + "M14N3RDXE ","M14N3RDYE ","M14N3RDZE ","M14N3TAXE ","M14N3TAYE ","M14N3TAZE ","M14N3TDXSS", & + "M14N3TDYSS","M14N3TDZSS","M14N4FKXE ","M14N4FKYE ","M14N4FKZE ","M14N4FMXE ","M14N4FMYE ", & + "M14N4FMZE ","M14N4MKXE ","M14N4MKYE ","M14N4MKZE ","M14N4MMXE ","M14N4MMYE ","M14N4MMZE ", & + "M14N4RAXE ","M14N4RAYE ","M14N4RAZE ","M14N4RDXE ","M14N4RDYE ","M14N4RDZE ","M14N4TAXE ", & + "M14N4TAYE ","M14N4TAZE ","M14N4TDXSS","M14N4TDYSS","M14N4TDZSS","M14N5FKXE ","M14N5FKYE ", & + "M14N5FKZE ","M14N5FMXE ","M14N5FMYE ","M14N5FMZE ","M14N5MKXE ","M14N5MKYE ","M14N5MKZE ", & + "M14N5MMXE ","M14N5MMYE ","M14N5MMZE ","M14N5RAXE ","M14N5RAYE ","M14N5RAZE ","M14N5RDXE ", & + "M14N5RDYE ","M14N5RDZE ","M14N5TAXE ","M14N5TAYE ","M14N5TAZE ","M14N5TDXSS","M14N5TDYSS", & + "M14N5TDZSS","M14N6FKXE ","M14N6FKYE ","M14N6FKZE ","M14N6FMXE ","M14N6FMYE ","M14N6FMZE ", & + "M14N6MKXE ","M14N6MKYE ","M14N6MKZE ","M14N6MMXE ","M14N6MMYE ","M14N6MMZE ","M14N6RAXE ", & + "M14N6RAYE ","M14N6RAZE ","M14N6RDXE ","M14N6RDYE ","M14N6RDZE ","M14N6TAXE ","M14N6TAYE ", & + "M14N6TAZE ","M14N6TDXSS","M14N6TDYSS","M14N6TDZSS","M14N7FKXE ","M14N7FKYE ","M14N7FKZE ", & + "M14N7FMXE ","M14N7FMYE ","M14N7FMZE ","M14N7MKXE ","M14N7MKYE ","M14N7MKZE ","M14N7MMXE ", & + "M14N7MMYE ","M14N7MMZE ","M14N7RAXE ","M14N7RAYE ","M14N7RAZE ","M14N7RDXE ","M14N7RDYE ", & + "M14N7RDZE ","M14N7TAXE ","M14N7TAYE ","M14N7TAZE ","M14N7TDXSS","M14N7TDYSS","M14N7TDZSS", & + "M14N8FKXE ","M14N8FKYE ","M14N8FKZE ","M14N8FMXE ","M14N8FMYE ","M14N8FMZE ","M14N8MKXE ", & + "M14N8MKYE ","M14N8MKZE ","M14N8MMXE ","M14N8MMYE ","M14N8MMZE ","M14N8RAXE ","M14N8RAYE ", & + "M14N8RAZE ","M14N8RDXE ","M14N8RDYE ","M14N8RDZE ","M14N8TAXE ","M14N8TAYE ","M14N8TAZE ", & + "M14N8TDXSS","M14N8TDYSS","M14N8TDZSS","M14N9FKXE ","M14N9FKYE ","M14N9FKZE ","M14N9FMXE ", & + "M14N9FMYE ","M14N9FMZE ","M14N9MKXE ","M14N9MKYE ","M14N9MKZE ","M14N9MMXE ","M14N9MMYE ", & + "M14N9MMZE ","M14N9RAXE ","M14N9RAYE ","M14N9RAZE ","M14N9RDXE ","M14N9RDYE ","M14N9RDZE ", & + "M14N9TAXE ","M14N9TAYE ","M14N9TAZE ","M14N9TDXSS","M14N9TDYSS","M14N9TDZSS","M15N1FKXE ", & + "M15N1FKYE ","M15N1FKZE ","M15N1FMXE ","M15N1FMYE ","M15N1FMZE ","M15N1MKXE ","M15N1MKYE ", & + "M15N1MKZE ","M15N1MMXE ","M15N1MMYE ","M15N1MMZE ","M15N1RAXE ","M15N1RAYE ","M15N1RAZE ", & + "M15N1RDXE ","M15N1RDYE ","M15N1RDZE ","M15N1TAXE ","M15N1TAYE ","M15N1TAZE ","M15N1TDXSS", & + "M15N1TDYSS","M15N1TDZSS","M15N2FKXE ","M15N2FKYE ","M15N2FKZE ","M15N2FMXE ","M15N2FMYE ", & + "M15N2FMZE ","M15N2MKXE ","M15N2MKYE ","M15N2MKZE ","M15N2MMXE ","M15N2MMYE ","M15N2MMZE ", & + "M15N2RAXE ","M15N2RAYE ","M15N2RAZE ","M15N2RDXE ","M15N2RDYE ","M15N2RDZE ","M15N2TAXE ", & + "M15N2TAYE ","M15N2TAZE ","M15N2TDXSS","M15N2TDYSS","M15N2TDZSS","M15N3FKXE ","M15N3FKYE ", & + "M15N3FKZE ","M15N3FMXE ","M15N3FMYE ","M15N3FMZE ","M15N3MKXE ","M15N3MKYE ","M15N3MKZE ", & + "M15N3MMXE ","M15N3MMYE ","M15N3MMZE ","M15N3RAXE ","M15N3RAYE ","M15N3RAZE ","M15N3RDXE ", & + "M15N3RDYE ","M15N3RDZE ","M15N3TAXE ","M15N3TAYE ","M15N3TAZE ","M15N3TDXSS","M15N3TDYSS", & + "M15N3TDZSS","M15N4FKXE ","M15N4FKYE ","M15N4FKZE ","M15N4FMXE ","M15N4FMYE ","M15N4FMZE ", & + "M15N4MKXE ","M15N4MKYE ","M15N4MKZE ","M15N4MMXE ","M15N4MMYE ","M15N4MMZE ","M15N4RAXE ", & + "M15N4RAYE ","M15N4RAZE ","M15N4RDXE ","M15N4RDYE ","M15N4RDZE ","M15N4TAXE ","M15N4TAYE ", & + "M15N4TAZE ","M15N4TDXSS","M15N4TDYSS","M15N4TDZSS","M15N5FKXE ","M15N5FKYE ","M15N5FKZE ", & + "M15N5FMXE ","M15N5FMYE ","M15N5FMZE ","M15N5MKXE ","M15N5MKYE ","M15N5MKZE ","M15N5MMXE ", & + "M15N5MMYE ","M15N5MMZE ","M15N5RAXE ","M15N5RAYE ","M15N5RAZE ","M15N5RDXE ","M15N5RDYE ", & + "M15N5RDZE ","M15N5TAXE ","M15N5TAYE ","M15N5TAZE ","M15N5TDXSS","M15N5TDYSS","M15N5TDZSS", & + "M15N6FKXE ","M15N6FKYE ","M15N6FKZE ","M15N6FMXE ","M15N6FMYE ","M15N6FMZE ","M15N6MKXE ", & + "M15N6MKYE ","M15N6MKZE ","M15N6MMXE ","M15N6MMYE ","M15N6MMZE ","M15N6RAXE ","M15N6RAYE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry3(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M15N6RAZE ","M15N6RDXE ","M15N6RDYE ","M15N6RDZE ","M15N6TAXE ","M15N6TAYE ","M15N6TAZE ", & + "M15N6TDXSS","M15N6TDYSS","M15N6TDZSS","M15N7FKXE ","M15N7FKYE ","M15N7FKZE ","M15N7FMXE ", & + "M15N7FMYE ","M15N7FMZE ","M15N7MKXE ","M15N7MKYE ","M15N7MKZE ","M15N7MMXE ","M15N7MMYE ", & + "M15N7MMZE ","M15N7RAXE ","M15N7RAYE ","M15N7RAZE ","M15N7RDXE ","M15N7RDYE ","M15N7RDZE ", & + "M15N7TAXE ","M15N7TAYE ","M15N7TAZE ","M15N7TDXSS","M15N7TDYSS","M15N7TDZSS","M15N8FKXE ", & + "M15N8FKYE ","M15N8FKZE ","M15N8FMXE ","M15N8FMYE ","M15N8FMZE ","M15N8MKXE ","M15N8MKYE ", & + "M15N8MKZE ","M15N8MMXE ","M15N8MMYE ","M15N8MMZE ","M15N8RAXE ","M15N8RAYE ","M15N8RAZE ", & + "M15N8RDXE ","M15N8RDYE ","M15N8RDZE ","M15N8TAXE ","M15N8TAYE ","M15N8TAZE ","M15N8TDXSS", & + "M15N8TDYSS","M15N8TDZSS","M15N9FKXE ","M15N9FKYE ","M15N9FKZE ","M15N9FMXE ","M15N9FMYE ", & + "M15N9FMZE ","M15N9MKXE ","M15N9MKYE ","M15N9MKZE ","M15N9MMXE ","M15N9MMYE ","M15N9MMZE ", & + "M15N9RAXE ","M15N9RAYE ","M15N9RAZE ","M15N9RDXE ","M15N9RDYE ","M15N9RDZE ","M15N9TAXE ", & + "M15N9TAYE ","M15N9TAZE ","M15N9TDXSS","M15N9TDYSS","M15N9TDZSS","M16N1FKXE ","M16N1FKYE ", & + "M16N1FKZE ","M16N1FMXE ","M16N1FMYE ","M16N1FMZE ","M16N1MKXE ","M16N1MKYE ","M16N1MKZE ", & + "M16N1MMXE ","M16N1MMYE ","M16N1MMZE ","M16N1RAXE ","M16N1RAYE ","M16N1RAZE ","M16N1RDXE ", & + "M16N1RDYE ","M16N1RDZE ","M16N1TAXE ","M16N1TAYE ","M16N1TAZE ","M16N1TDXSS","M16N1TDYSS", & + "M16N1TDZSS","M16N2FKXE ","M16N2FKYE ","M16N2FKZE ","M16N2FMXE ","M16N2FMYE ","M16N2FMZE ", & + "M16N2MKXE ","M16N2MKYE ","M16N2MKZE ","M16N2MMXE ","M16N2MMYE ","M16N2MMZE ","M16N2RAXE ", & + "M16N2RAYE ","M16N2RAZE ","M16N2RDXE ","M16N2RDYE ","M16N2RDZE ","M16N2TAXE ","M16N2TAYE ", & + "M16N2TAZE ","M16N2TDXSS","M16N2TDYSS","M16N2TDZSS","M16N3FKXE ","M16N3FKYE ","M16N3FKZE ", & + "M16N3FMXE ","M16N3FMYE ","M16N3FMZE ","M16N3MKXE ","M16N3MKYE ","M16N3MKZE ","M16N3MMXE ", & + "M16N3MMYE ","M16N3MMZE ","M16N3RAXE ","M16N3RAYE ","M16N3RAZE ","M16N3RDXE ","M16N3RDYE ", & + "M16N3RDZE ","M16N3TAXE ","M16N3TAYE ","M16N3TAZE ","M16N3TDXSS","M16N3TDYSS","M16N3TDZSS", & + "M16N4FKXE ","M16N4FKYE ","M16N4FKZE ","M16N4FMXE ","M16N4FMYE ","M16N4FMZE ","M16N4MKXE ", & + "M16N4MKYE ","M16N4MKZE ","M16N4MMXE ","M16N4MMYE ","M16N4MMZE ","M16N4RAXE ","M16N4RAYE ", & + "M16N4RAZE ","M16N4RDXE ","M16N4RDYE ","M16N4RDZE ","M16N4TAXE ","M16N4TAYE ","M16N4TAZE ", & + "M16N4TDXSS","M16N4TDYSS","M16N4TDZSS","M16N5FKXE ","M16N5FKYE ","M16N5FKZE ","M16N5FMXE ", & + "M16N5FMYE ","M16N5FMZE ","M16N5MKXE ","M16N5MKYE ","M16N5MKZE ","M16N5MMXE ","M16N5MMYE ", & + "M16N5MMZE ","M16N5RAXE ","M16N5RAYE ","M16N5RAZE ","M16N5RDXE ","M16N5RDYE ","M16N5RDZE ", & + "M16N5TAXE ","M16N5TAYE ","M16N5TAZE ","M16N5TDXSS","M16N5TDYSS","M16N5TDZSS","M16N6FKXE ", & + "M16N6FKYE ","M16N6FKZE ","M16N6FMXE ","M16N6FMYE ","M16N6FMZE ","M16N6MKXE ","M16N6MKYE ", & + "M16N6MKZE ","M16N6MMXE ","M16N6MMYE ","M16N6MMZE ","M16N6RAXE ","M16N6RAYE ","M16N6RAZE ", & + "M16N6RDXE ","M16N6RDYE ","M16N6RDZE ","M16N6TAXE ","M16N6TAYE ","M16N6TAZE ","M16N6TDXSS", & + "M16N6TDYSS","M16N6TDZSS","M16N7FKXE ","M16N7FKYE ","M16N7FKZE ","M16N7FMXE ","M16N7FMYE ", & + "M16N7FMZE ","M16N7MKXE ","M16N7MKYE ","M16N7MKZE ","M16N7MMXE ","M16N7MMYE ","M16N7MMZE ", & + "M16N7RAXE ","M16N7RAYE ","M16N7RAZE ","M16N7RDXE ","M16N7RDYE ","M16N7RDZE ","M16N7TAXE ", & + "M16N7TAYE ","M16N7TAZE ","M16N7TDXSS","M16N7TDYSS","M16N7TDZSS","M16N8FKXE ","M16N8FKYE ", & + "M16N8FKZE ","M16N8FMXE ","M16N8FMYE ","M16N8FMZE ","M16N8MKXE ","M16N8MKYE ","M16N8MKZE ", & + "M16N8MMXE ","M16N8MMYE ","M16N8MMZE ","M16N8RAXE ","M16N8RAYE ","M16N8RAZE ","M16N8RDXE ", & + "M16N8RDYE ","M16N8RDZE ","M16N8TAXE ","M16N8TAYE ","M16N8TAZE ","M16N8TDXSS","M16N8TDYSS", & + "M16N8TDZSS","M16N9FKXE ","M16N9FKYE ","M16N9FKZE ","M16N9FMXE ","M16N9FMYE ","M16N9FMZE ", & + "M16N9MKXE ","M16N9MKYE ","M16N9MKZE ","M16N9MMXE ","M16N9MMYE ","M16N9MMZE ","M16N9RAXE ", & + "M16N9RAYE ","M16N9RAZE ","M16N9RDXE ","M16N9RDYE ","M16N9RDZE ","M16N9TAXE ","M16N9TAYE ", & + "M16N9TAZE ","M16N9TDXSS","M16N9TDYSS","M16N9TDZSS","M17N1FKXE ","M17N1FKYE ","M17N1FKZE ", & + "M17N1FMXE ","M17N1FMYE ","M17N1FMZE ","M17N1MKXE ","M17N1MKYE ","M17N1MKZE ","M17N1MMXE ", & + "M17N1MMYE ","M17N1MMZE ","M17N1RAXE ","M17N1RAYE ","M17N1RAZE ","M17N1RDXE ","M17N1RDYE ", & + "M17N1RDZE ","M17N1TAXE ","M17N1TAYE ","M17N1TAZE ","M17N1TDXSS","M17N1TDYSS","M17N1TDZSS", & + "M17N2FKXE ","M17N2FKYE ","M17N2FKZE ","M17N2FMXE ","M17N2FMYE ","M17N2FMZE ","M17N2MKXE ", & + "M17N2MKYE ","M17N2MKZE ","M17N2MMXE ","M17N2MMYE ","M17N2MMZE ","M17N2RAXE ","M17N2RAYE ", & + "M17N2RAZE ","M17N2RDXE ","M17N2RDYE ","M17N2RDZE ","M17N2TAXE ","M17N2TAYE ","M17N2TAZE ", & + "M17N2TDXSS","M17N2TDYSS","M17N2TDZSS","M17N3FKXE ","M17N3FKYE ","M17N3FKZE ","M17N3FMXE ", & + "M17N3FMYE ","M17N3FMZE ","M17N3MKXE ","M17N3MKYE ","M17N3MKZE ","M17N3MMXE ","M17N3MMYE ", & + "M17N3MMZE ","M17N3RAXE ","M17N3RAYE ","M17N3RAZE ","M17N3RDXE ","M17N3RDYE ","M17N3RDZE ", & + "M17N3TAXE ","M17N3TAYE ","M17N3TAZE ","M17N3TDXSS","M17N3TDYSS","M17N3TDZSS","M17N4FKXE ", & + "M17N4FKYE ","M17N4FKZE ","M17N4FMXE ","M17N4FMYE ","M17N4FMZE ","M17N4MKXE ","M17N4MKYE ", & + "M17N4MKZE ","M17N4MMXE ","M17N4MMYE ","M17N4MMZE ","M17N4RAXE ","M17N4RAYE ","M17N4RAZE ", & + "M17N4RDXE ","M17N4RDYE ","M17N4RDZE ","M17N4TAXE ","M17N4TAYE ","M17N4TAZE ","M17N4TDXSS", & + "M17N4TDYSS","M17N4TDZSS","M17N5FKXE ","M17N5FKYE ","M17N5FKZE ","M17N5FMXE ","M17N5FMYE ", & + "M17N5FMZE ","M17N5MKXE ","M17N5MKYE ","M17N5MKZE ","M17N5MMXE ","M17N5MMYE ","M17N5MMZE ", & + "M17N5RAXE ","M17N5RAYE ","M17N5RAZE ","M17N5RDXE ","M17N5RDYE ","M17N5RDZE ","M17N5TAXE ", & + "M17N5TAYE ","M17N5TAZE ","M17N5TDXSS","M17N5TDYSS","M17N5TDZSS","M17N6FKXE ","M17N6FKYE ", & + "M17N6FKZE ","M17N6FMXE ","M17N6FMYE ","M17N6FMZE ","M17N6MKXE ","M17N6MKYE ","M17N6MKZE ", & + "M17N6MMXE ","M17N6MMYE ","M17N6MMZE ","M17N6RAXE ","M17N6RAYE ","M17N6RAZE ","M17N6RDXE ", & + "M17N6RDYE ","M17N6RDZE ","M17N6TAXE ","M17N6TAYE ","M17N6TAZE ","M17N6TDXSS","M17N6TDYSS", & + "M17N6TDZSS","M17N7FKXE ","M17N7FKYE ","M17N7FKZE ","M17N7FMXE ","M17N7FMYE ","M17N7FMZE ", & + "M17N7MKXE ","M17N7MKYE ","M17N7MKZE ","M17N7MMXE ","M17N7MMYE ","M17N7MMZE ","M17N7RAXE ", & + "M17N7RAYE ","M17N7RAZE ","M17N7RDXE ","M17N7RDYE ","M17N7RDZE ","M17N7TAXE ","M17N7TAYE ", & + "M17N7TAZE ","M17N7TDXSS","M17N7TDYSS","M17N7TDZSS","M17N8FKXE ","M17N8FKYE ","M17N8FKZE ", & + "M17N8FMXE ","M17N8FMYE ","M17N8FMZE ","M17N8MKXE ","M17N8MKYE ","M17N8MKZE ","M17N8MMXE ", & + "M17N8MMYE ","M17N8MMZE ","M17N8RAXE ","M17N8RAYE ","M17N8RAZE ","M17N8RDXE ","M17N8RDYE ", & + "M17N8RDZE ","M17N8TAXE ","M17N8TAYE ","M17N8TAZE ","M17N8TDXSS","M17N8TDYSS","M17N8TDZSS", & + "M17N9FKXE ","M17N9FKYE ","M17N9FKZE ","M17N9FMXE ","M17N9FMYE ","M17N9FMZE ","M17N9MKXE ", & + "M17N9MKYE ","M17N9MKZE ","M17N9MMXE ","M17N9MMYE ","M17N9MMZE ","M17N9RAXE ","M17N9RAYE ", & + "M17N9RAZE ","M17N9RDXE ","M17N9RDYE ","M17N9RDZE ","M17N9TAXE ","M17N9TAYE ","M17N9TAZE ", & + "M17N9TDXSS","M17N9TDYSS","M17N9TDZSS","M18N1FKXE ","M18N1FKYE ","M18N1FKZE ","M18N1FMXE ", & + "M18N1FMYE ","M18N1FMZE ","M18N1MKXE ","M18N1MKYE ","M18N1MKZE ","M18N1MMXE ","M18N1MMYE ", & + "M18N1MMZE ","M18N1RAXE ","M18N1RAYE ","M18N1RAZE ","M18N1RDXE ","M18N1RDYE ","M18N1RDZE ", & + "M18N1TAXE ","M18N1TAYE ","M18N1TAZE ","M18N1TDXSS","M18N1TDYSS","M18N1TDZSS","M18N2FKXE ", & + "M18N2FKYE ","M18N2FKZE ","M18N2FMXE ","M18N2FMYE ","M18N2FMZE ","M18N2MKXE ","M18N2MKYE ", & + "M18N2MKZE ","M18N2MMXE ","M18N2MMYE ","M18N2MMZE ","M18N2RAXE ","M18N2RAYE ","M18N2RAZE ", & + "M18N2RDXE ","M18N2RDYE ","M18N2RDZE ","M18N2TAXE ","M18N2TAYE ","M18N2TAZE ","M18N2TDXSS", & + "M18N2TDYSS","M18N2TDZSS","M18N3FKXE ","M18N3FKYE ","M18N3FKZE ","M18N3FMXE ","M18N3FMYE ", & + "M18N3FMZE ","M18N3MKXE ","M18N3MKYE ","M18N3MKZE ","M18N3MMXE ","M18N3MMYE ","M18N3MMZE ", & + "M18N3RAXE ","M18N3RAYE ","M18N3RAZE ","M18N3RDXE ","M18N3RDYE ","M18N3RDZE ","M18N3TAXE ", & + "M18N3TAYE ","M18N3TAZE ","M18N3TDXSS","M18N3TDYSS","M18N3TDZSS","M18N4FKXE ","M18N4FKYE ", & + "M18N4FKZE ","M18N4FMXE ","M18N4FMYE ","M18N4FMZE ","M18N4MKXE ","M18N4MKYE ","M18N4MKZE ", & + "M18N4MMXE ","M18N4MMYE ","M18N4MMZE ","M18N4RAXE ","M18N4RAYE ","M18N4RAZE ","M18N4RDXE ", & + "M18N4RDYE ","M18N4RDZE ","M18N4TAXE ","M18N4TAYE ","M18N4TAZE ","M18N4TDXSS","M18N4TDYSS", & + "M18N4TDZSS","M18N5FKXE ","M18N5FKYE ","M18N5FKZE ","M18N5FMXE ","M18N5FMYE ","M18N5FMZE ", & + "M18N5MKXE ","M18N5MKYE ","M18N5MKZE ","M18N5MMXE ","M18N5MMYE ","M18N5MMZE ","M18N5RAXE ", & + "M18N5RAYE ","M18N5RAZE ","M18N5RDXE ","M18N5RDYE ","M18N5RDZE ","M18N5TAXE ","M18N5TAYE ", & + "M18N5TAZE ","M18N5TDXSS","M18N5TDYSS","M18N5TDZSS","M18N6FKXE ","M18N6FKYE ","M18N6FKZE ", & + "M18N6FMXE ","M18N6FMYE ","M18N6FMZE ","M18N6MKXE ","M18N6MKYE ","M18N6MKZE ","M18N6MMXE ", & + "M18N6MMYE ","M18N6MMZE ","M18N6RAXE ","M18N6RAYE ","M18N6RAZE ","M18N6RDXE ","M18N6RDYE ", & + "M18N6RDZE ","M18N6TAXE ","M18N6TAYE ","M18N6TAZE ","M18N6TDXSS","M18N6TDYSS","M18N6TDZSS", & + "M18N7FKXE ","M18N7FKYE ","M18N7FKZE ","M18N7FMXE ","M18N7FMYE ","M18N7FMZE ","M18N7MKXE ", & + "M18N7MKYE ","M18N7MKZE ","M18N7MMXE ","M18N7MMYE ","M18N7MMZE ","M18N7RAXE ","M18N7RAYE ", & + "M18N7RAZE ","M18N7RDXE ","M18N7RDYE ","M18N7RDZE ","M18N7TAXE ","M18N7TAYE ","M18N7TAZE ", & + "M18N7TDXSS","M18N7TDYSS","M18N7TDZSS","M18N8FKXE ","M18N8FKYE ","M18N8FKZE ","M18N8FMXE ", & + "M18N8FMYE ","M18N8FMZE ","M18N8MKXE ","M18N8MKYE ","M18N8MKZE ","M18N8MMXE ","M18N8MMYE ", & + "M18N8MMZE ","M18N8RAXE ","M18N8RAYE ","M18N8RAZE ","M18N8RDXE ","M18N8RDYE ","M18N8RDZE ", & + "M18N8TAXE ","M18N8TAYE ","M18N8TAZE ","M18N8TDXSS","M18N8TDYSS","M18N8TDZSS","M18N9FKXE ", & + "M18N9FKYE ","M18N9FKZE ","M18N9FMXE ","M18N9FMYE ","M18N9FMZE ","M18N9MKXE ","M18N9MKYE ", & + "M18N9MKZE ","M18N9MMXE ","M18N9MMYE ","M18N9MMZE ","M18N9RAXE ","M18N9RAYE ","M18N9RAZE ", & + "M18N9RDXE ","M18N9RDYE ","M18N9RDZE ","M18N9TAXE ","M18N9TAYE ","M18N9TAZE ","M18N9TDXSS", & + "M18N9TDYSS","M18N9TDZSS","M19N1FKXE ","M19N1FKYE ","M19N1FKZE ","M19N1FMXE ","M19N1FMYE ", & + "M19N1FMZE ","M19N1MKXE ","M19N1MKYE ","M19N1MKZE ","M19N1MMXE ","M19N1MMYE ","M19N1MMZE ", & + "M19N1RAXE ","M19N1RAYE ","M19N1RAZE ","M19N1RDXE ","M19N1RDYE ","M19N1RDZE ","M19N1TAXE ", & + "M19N1TAYE ","M19N1TAZE ","M19N1TDXSS","M19N1TDYSS","M19N1TDZSS","M19N2FKXE ","M19N2FKYE ", & + "M19N2FKZE ","M19N2FMXE ","M19N2FMYE ","M19N2FMZE ","M19N2MKXE ","M19N2MKYE ","M19N2MKZE ", & + "M19N2MMXE ","M19N2MMYE ","M19N2MMZE ","M19N2RAXE ","M19N2RAYE ","M19N2RAZE ","M19N2RDXE ", & + "M19N2RDYE ","M19N2RDZE ","M19N2TAXE ","M19N2TAYE ","M19N2TAZE ","M19N2TDXSS","M19N2TDYSS", & + "M19N2TDZSS","M19N3FKXE ","M19N3FKYE ","M19N3FKZE ","M19N3FMXE ","M19N3FMYE ","M19N3FMZE ", & + "M19N3MKXE ","M19N3MKYE ","M19N3MKZE ","M19N3MMXE ","M19N3MMYE ","M19N3MMZE ","M19N3RAXE ", & + "M19N3RAYE ","M19N3RAZE ","M19N3RDXE ","M19N3RDYE ","M19N3RDZE ","M19N3TAXE ","M19N3TAYE ", & + "M19N3TAZE ","M19N3TDXSS","M19N3TDYSS","M19N3TDZSS","M19N4FKXE ","M19N4FKYE ","M19N4FKZE ", & + "M19N4FMXE ","M19N4FMYE ","M19N4FMZE ","M19N4MKXE ","M19N4MKYE ","M19N4MKZE ","M19N4MMXE ", & + "M19N4MMYE ","M19N4MMZE ","M19N4RAXE ","M19N4RAYE ","M19N4RAZE ","M19N4RDXE ","M19N4RDYE ", & + "M19N4RDZE ","M19N4TAXE ","M19N4TAYE ","M19N4TAZE ","M19N4TDXSS","M19N4TDYSS","M19N4TDZSS", & + "M19N5FKXE ","M19N5FKYE ","M19N5FKZE ","M19N5FMXE ","M19N5FMYE ","M19N5FMZE ","M19N5MKXE ", & + "M19N5MKYE ","M19N5MKZE ","M19N5MMXE ","M19N5MMYE ","M19N5MMZE ","M19N5RAXE ","M19N5RAYE ", & + "M19N5RAZE ","M19N5RDXE ","M19N5RDYE ","M19N5RDZE ","M19N5TAXE ","M19N5TAYE ","M19N5TAZE ", & + "M19N5TDXSS","M19N5TDYSS","M19N5TDZSS","M19N6FKXE ","M19N6FKYE ","M19N6FKZE ","M19N6FMXE ", & + "M19N6FMYE ","M19N6FMZE ","M19N6MKXE ","M19N6MKYE ","M19N6MKZE ","M19N6MMXE ","M19N6MMYE ", & + "M19N6MMZE ","M19N6RAXE ","M19N6RAYE ","M19N6RAZE ","M19N6RDXE ","M19N6RDYE ","M19N6RDZE ", & + "M19N6TAXE ","M19N6TAYE ","M19N6TAZE ","M19N6TDXSS","M19N6TDYSS","M19N6TDZSS","M19N7FKXE ", & + "M19N7FKYE ","M19N7FKZE ","M19N7FMXE ","M19N7FMYE ","M19N7FMZE ","M19N7MKXE ","M19N7MKYE ", & + "M19N7MKZE ","M19N7MMXE ","M19N7MMYE ","M19N7MMZE ","M19N7RAXE ","M19N7RAYE ","M19N7RAZE ", & + "M19N7RDXE ","M19N7RDYE ","M19N7RDZE ","M19N7TAXE ","M19N7TAYE ","M19N7TAZE ","M19N7TDXSS", & + "M19N7TDYSS","M19N7TDZSS","M19N8FKXE ","M19N8FKYE ","M19N8FKZE ","M19N8FMXE ","M19N8FMYE ", & + "M19N8FMZE ","M19N8MKXE ","M19N8MKYE ","M19N8MKZE ","M19N8MMXE ","M19N8MMYE ","M19N8MMZE ", & + "M19N8RAXE ","M19N8RAYE ","M19N8RAZE ","M19N8RDXE ","M19N8RDYE ","M19N8RDZE ","M19N8TAXE ", & + "M19N8TAYE ","M19N8TAZE ","M19N8TDXSS","M19N8TDYSS","M19N8TDZSS","M19N9FKXE ","M19N9FKYE ", & + "M19N9FKZE ","M19N9FMXE ","M19N9FMYE ","M19N9FMZE ","M19N9MKXE ","M19N9MKYE ","M19N9MKZE ", & + "M19N9MMXE ","M19N9MMYE ","M19N9MMZE ","M19N9RAXE ","M19N9RAYE ","M19N9RAZE ","M19N9RDXE ", & + "M19N9RDYE ","M19N9RDZE ","M19N9TAXE ","M19N9TAYE ","M19N9TAZE ","M19N9TDXSS","M19N9TDYSS", & + "M19N9TDZSS","M20N1FKXE ","M20N1FKYE ","M20N1FKZE ","M20N1FMXE ","M20N1FMYE ","M20N1FMZE ", & + "M20N1MKXE ","M20N1MKYE ","M20N1MKZE ","M20N1MMXE ","M20N1MMYE ","M20N1MMZE ","M20N1RAXE ", & + "M20N1RAYE ","M20N1RAZE ","M20N1RDXE ","M20N1RDYE ","M20N1RDZE ","M20N1TAXE ","M20N1TAYE ", & + "M20N1TAZE ","M20N1TDXSS","M20N1TDYSS","M20N1TDZSS","M20N2FKXE ","M20N2FKYE ","M20N2FKZE ", & + "M20N2FMXE ","M20N2FMYE ","M20N2FMZE ","M20N2MKXE ","M20N2MKYE ","M20N2MKZE ","M20N2MMXE ", & + "M20N2MMYE ","M20N2MMZE ","M20N2RAXE ","M20N2RAYE ","M20N2RAZE ","M20N2RDXE ","M20N2RDYE ", & + "M20N2RDZE ","M20N2TAXE ","M20N2TAYE ","M20N2TAZE ","M20N2TDXSS","M20N2TDYSS","M20N2TDZSS", & + "M20N3FKXE ","M20N3FKYE ","M20N3FKZE ","M20N3FMXE ","M20N3FMYE ","M20N3FMZE ","M20N3MKXE ", & + "M20N3MKYE ","M20N3MKZE ","M20N3MMXE ","M20N3MMYE ","M20N3MMZE ","M20N3RAXE ","M20N3RAYE ", & + "M20N3RAZE ","M20N3RDXE ","M20N3RDYE ","M20N3RDZE ","M20N3TAXE ","M20N3TAYE ","M20N3TAZE ", & + "M20N3TDXSS","M20N3TDYSS","M20N3TDZSS","M20N4FKXE ","M20N4FKYE ","M20N4FKZE ","M20N4FMXE ", & + "M20N4FMYE ","M20N4FMZE ","M20N4MKXE ","M20N4MKYE ","M20N4MKZE ","M20N4MMXE ","M20N4MMYE ", & + "M20N4MMZE ","M20N4RAXE ","M20N4RAYE ","M20N4RAZE ","M20N4RDXE ","M20N4RDYE ","M20N4RDZE ", & + "M20N4TAXE ","M20N4TAYE ","M20N4TAZE ","M20N4TDXSS","M20N4TDYSS","M20N4TDZSS","M20N5FKXE ", & + "M20N5FKYE ","M20N5FKZE ","M20N5FMXE ","M20N5FMYE ","M20N5FMZE ","M20N5MKXE ","M20N5MKYE ", & + "M20N5MKZE ","M20N5MMXE ","M20N5MMYE ","M20N5MMZE ","M20N5RAXE ","M20N5RAYE ","M20N5RAZE ", & + "M20N5RDXE ","M20N5RDYE ","M20N5RDZE ","M20N5TAXE ","M20N5TAYE ","M20N5TAZE ","M20N5TDXSS", & + "M20N5TDYSS","M20N5TDZSS","M20N6FKXE ","M20N6FKYE ","M20N6FKZE ","M20N6FMXE ","M20N6FMYE ", & + "M20N6FMZE ","M20N6MKXE ","M20N6MKYE ","M20N6MKZE ","M20N6MMXE ","M20N6MMYE ","M20N6MMZE ", & + "M20N6RAXE ","M20N6RAYE ","M20N6RAZE ","M20N6RDXE ","M20N6RDYE ","M20N6RDZE ","M20N6TAXE ", & + "M20N6TAYE ","M20N6TAZE ","M20N6TDXSS","M20N6TDYSS","M20N6TDZSS","M20N7FKXE ","M20N7FKYE ", & + "M20N7FKZE ","M20N7FMXE ","M20N7FMYE ","M20N7FMZE ","M20N7MKXE ","M20N7MKYE ","M20N7MKZE ", & + "M20N7MMXE ","M20N7MMYE ","M20N7MMZE ","M20N7RAXE ","M20N7RAYE ","M20N7RAZE ","M20N7RDXE ", & + "M20N7RDYE ","M20N7RDZE ","M20N7TAXE ","M20N7TAYE ","M20N7TAZE ","M20N7TDXSS","M20N7TDYSS", & + "M20N7TDZSS","M20N8FKXE ","M20N8FKYE ","M20N8FKZE ","M20N8FMXE ","M20N8FMYE ","M20N8FMZE ", & + "M20N8MKXE ","M20N8MKYE ","M20N8MKZE ","M20N8MMXE ","M20N8MMYE ","M20N8MMZE ","M20N8RAXE ", & + "M20N8RAYE ","M20N8RAZE ","M20N8RDXE ","M20N8RDYE ","M20N8RDZE ","M20N8TAXE ","M20N8TAYE ", & + "M20N8TAZE ","M20N8TDXSS","M20N8TDYSS","M20N8TDZSS","M20N9FKXE ","M20N9FKYE ","M20N9FKZE ", & + "M20N9FMXE ","M20N9FMYE ","M20N9FMZE ","M20N9MKXE ","M20N9MKYE ","M20N9MKZE ","M20N9MMXE ", & + "M20N9MMYE ","M20N9MMZE ","M20N9RAXE ","M20N9RAYE ","M20N9RAZE ","M20N9RDXE ","M20N9RDYE ", & + "M20N9RDZE ","M20N9TAXE ","M20N9TAYE ","M20N9TAZE ","M20N9TDXSS","M20N9TDYSS","M20N9TDZSS", & + "M21N1FKXE ","M21N1FKYE ","M21N1FKZE ","M21N1FMXE ","M21N1FMYE ","M21N1FMZE ","M21N1MKXE ", & + "M21N1MKYE ","M21N1MKZE ","M21N1MMXE ","M21N1MMYE ","M21N1MMZE ","M21N1RAXE ","M21N1RAYE ", & + "M21N1RAZE ","M21N1RDXE ","M21N1RDYE ","M21N1RDZE ","M21N1TAXE ","M21N1TAYE ","M21N1TAZE ", & + "M21N1TDXSS","M21N1TDYSS","M21N1TDZSS","M21N2FKXE ","M21N2FKYE ","M21N2FKZE ","M21N2FMXE ", & + "M21N2FMYE ","M21N2FMZE ","M21N2MKXE ","M21N2MKYE ","M21N2MKZE ","M21N2MMXE ","M21N2MMYE ", & + "M21N2MMZE ","M21N2RAXE ","M21N2RAYE ","M21N2RAZE ","M21N2RDXE ","M21N2RDYE ","M21N2RDZE ", & + "M21N2TAXE ","M21N2TAYE ","M21N2TAZE ","M21N2TDXSS","M21N2TDYSS","M21N2TDZSS","M21N3FKXE ", & + "M21N3FKYE ","M21N3FKZE ","M21N3FMXE ","M21N3FMYE ","M21N3FMZE ","M21N3MKXE ","M21N3MKYE ", & + "M21N3MKZE ","M21N3MMXE ","M21N3MMYE ","M21N3MMZE ","M21N3RAXE ","M21N3RAYE ","M21N3RAZE ", & + "M21N3RDXE ","M21N3RDYE ","M21N3RDZE ","M21N3TAXE ","M21N3TAYE ","M21N3TAZE ","M21N3TDXSS", & + "M21N3TDYSS","M21N3TDZSS","M21N4FKXE ","M21N4FKYE ","M21N4FKZE ","M21N4FMXE ","M21N4FMYE ", & + "M21N4FMZE ","M21N4MKXE ","M21N4MKYE ","M21N4MKZE ","M21N4MMXE ","M21N4MMYE ","M21N4MMZE ", & + "M21N4RAXE ","M21N4RAYE ","M21N4RAZE ","M21N4RDXE ","M21N4RDYE ","M21N4RDZE ","M21N4TAXE ", & + "M21N4TAYE ","M21N4TAZE ","M21N4TDXSS","M21N4TDYSS","M21N4TDZSS","M21N5FKXE ","M21N5FKYE ", & + "M21N5FKZE ","M21N5FMXE ","M21N5FMYE ","M21N5FMZE ","M21N5MKXE ","M21N5MKYE ","M21N5MKZE ", & + "M21N5MMXE ","M21N5MMYE ","M21N5MMZE ","M21N5RAXE ","M21N5RAYE ","M21N5RAZE ","M21N5RDXE ", & + "M21N5RDYE ","M21N5RDZE ","M21N5TAXE ","M21N5TAYE ","M21N5TAZE ","M21N5TDXSS","M21N5TDYSS", & + "M21N5TDZSS","M21N6FKXE ","M21N6FKYE ","M21N6FKZE ","M21N6FMXE ","M21N6FMYE ","M21N6FMZE ", & + "M21N6MKXE ","M21N6MKYE ","M21N6MKZE ","M21N6MMXE ","M21N6MMYE ","M21N6MMZE ","M21N6RAXE ", & + "M21N6RAYE ","M21N6RAZE ","M21N6RDXE ","M21N6RDYE ","M21N6RDZE ","M21N6TAXE ","M21N6TAYE ", & + "M21N6TAZE ","M21N6TDXSS","M21N6TDYSS","M21N6TDZSS","M21N7FKXE ","M21N7FKYE ","M21N7FKZE ", & + "M21N7FMXE ","M21N7FMYE ","M21N7FMZE ","M21N7MKXE ","M21N7MKYE ","M21N7MKZE ","M21N7MMXE ", & + "M21N7MMYE ","M21N7MMZE ","M21N7RAXE ","M21N7RAYE ","M21N7RAZE ","M21N7RDXE ","M21N7RDYE ", & + "M21N7RDZE ","M21N7TAXE ","M21N7TAYE ","M21N7TAZE ","M21N7TDXSS","M21N7TDYSS","M21N7TDZSS", & + "M21N8FKXE ","M21N8FKYE ","M21N8FKZE ","M21N8FMXE ","M21N8FMYE ","M21N8FMZE ","M21N8MKXE ", & + "M21N8MKYE ","M21N8MKZE ","M21N8MMXE ","M21N8MMYE ","M21N8MMZE ","M21N8RAXE ","M21N8RAYE ", & + "M21N8RAZE ","M21N8RDXE ","M21N8RDYE ","M21N8RDZE ","M21N8TAXE ","M21N8TAYE ","M21N8TAZE ", & + "M21N8TDXSS","M21N8TDYSS","M21N8TDZSS","M21N9FKXE ","M21N9FKYE ","M21N9FKZE ","M21N9FMXE ", & + "M21N9FMYE ","M21N9FMZE ","M21N9MKXE ","M21N9MKYE ","M21N9MKZE ","M21N9MMXE ","M21N9MMYE ", & + "M21N9MMZE ","M21N9RAXE ","M21N9RAYE ","M21N9RAZE ","M21N9RDXE ","M21N9RDYE ","M21N9RDZE ", & + "M21N9TAXE ","M21N9TAYE ","M21N9TAZE ","M21N9TDXSS","M21N9TDYSS","M21N9TDZSS","M22N1FKXE ", & + "M22N1FKYE ","M22N1FKZE ","M22N1FMXE ","M22N1FMYE ","M22N1FMZE ","M22N1MKXE ","M22N1MKYE ", & + "M22N1MKZE ","M22N1MMXE ","M22N1MMYE ","M22N1MMZE ","M22N1RAXE ","M22N1RAYE ","M22N1RAZE ", & + "M22N1RDXE ","M22N1RDYE ","M22N1RDZE ","M22N1TAXE ","M22N1TAYE ","M22N1TAZE ","M22N1TDXSS", & + "M22N1TDYSS","M22N1TDZSS","M22N2FKXE ","M22N2FKYE ","M22N2FKZE ","M22N2FMXE ","M22N2FMYE ", & + "M22N2FMZE ","M22N2MKXE ","M22N2MKYE ","M22N2MKZE ","M22N2MMXE ","M22N2MMYE ","M22N2MMZE ", & + "M22N2RAXE ","M22N2RAYE ","M22N2RAZE ","M22N2RDXE ","M22N2RDYE ","M22N2RDZE ","M22N2TAXE ", & + "M22N2TAYE ","M22N2TAZE ","M22N2TDXSS","M22N2TDYSS","M22N2TDZSS","M22N3FKXE ","M22N3FKYE ", & + "M22N3FKZE ","M22N3FMXE ","M22N3FMYE ","M22N3FMZE ","M22N3MKXE ","M22N3MKYE ","M22N3MKZE ", & + "M22N3MMXE ","M22N3MMYE ","M22N3MMZE ","M22N3RAXE ","M22N3RAYE ","M22N3RAZE ","M22N3RDXE ", & + "M22N3RDYE ","M22N3RDZE ","M22N3TAXE ","M22N3TAYE ","M22N3TAZE ","M22N3TDXSS","M22N3TDYSS", & + "M22N3TDZSS","M22N4FKXE ","M22N4FKYE ","M22N4FKZE ","M22N4FMXE ","M22N4FMYE ","M22N4FMZE ", & + "M22N4MKXE ","M22N4MKYE ","M22N4MKZE ","M22N4MMXE ","M22N4MMYE ","M22N4MMZE ","M22N4RAXE ", & + "M22N4RAYE ","M22N4RAZE ","M22N4RDXE ","M22N4RDYE ","M22N4RDZE ","M22N4TAXE ","M22N4TAYE ", & + "M22N4TAZE ","M22N4TDXSS","M22N4TDYSS","M22N4TDZSS","M22N5FKXE ","M22N5FKYE ","M22N5FKZE ", & + "M22N5FMXE ","M22N5FMYE ","M22N5FMZE ","M22N5MKXE ","M22N5MKYE ","M22N5MKZE ","M22N5MMXE ", & + "M22N5MMYE ","M22N5MMZE ","M22N5RAXE ","M22N5RAYE ","M22N5RAZE ","M22N5RDXE ","M22N5RDYE ", & + "M22N5RDZE ","M22N5TAXE ","M22N5TAYE ","M22N5TAZE ","M22N5TDXSS","M22N5TDYSS","M22N5TDZSS", & + "M22N6FKXE ","M22N6FKYE ","M22N6FKZE ","M22N6FMXE ","M22N6FMYE ","M22N6FMZE ","M22N6MKXE ", & + "M22N6MKYE ","M22N6MKZE ","M22N6MMXE ","M22N6MMYE ","M22N6MMZE ","M22N6RAXE ","M22N6RAYE ", & + "M22N6RAZE ","M22N6RDXE ","M22N6RDYE ","M22N6RDZE ","M22N6TAXE ","M22N6TAYE ","M22N6TAZE ", & + "M22N6TDXSS","M22N6TDYSS","M22N6TDZSS","M22N7FKXE ","M22N7FKYE ","M22N7FKZE ","M22N7FMXE ", & + "M22N7FMYE ","M22N7FMZE ","M22N7MKXE ","M22N7MKYE ","M22N7MKZE ","M22N7MMXE ","M22N7MMYE ", & + "M22N7MMZE ","M22N7RAXE ","M22N7RAYE ","M22N7RAZE ","M22N7RDXE ","M22N7RDYE ","M22N7RDZE ", & + "M22N7TAXE ","M22N7TAYE ","M22N7TAZE ","M22N7TDXSS","M22N7TDYSS","M22N7TDZSS","M22N8FKXE ", & + "M22N8FKYE ","M22N8FKZE ","M22N8FMXE ","M22N8FMYE ","M22N8FMZE ","M22N8MKXE ","M22N8MKYE ", & + "M22N8MKZE ","M22N8MMXE ","M22N8MMYE ","M22N8MMZE ","M22N8RAXE ","M22N8RAYE ","M22N8RAZE ", & + "M22N8RDXE ","M22N8RDYE ","M22N8RDZE ","M22N8TAXE ","M22N8TAYE ","M22N8TAZE ","M22N8TDXSS", & + "M22N8TDYSS","M22N8TDZSS","M22N9FKXE ","M22N9FKYE ","M22N9FKZE ","M22N9FMXE ","M22N9FMYE ", & + "M22N9FMZE ","M22N9MKXE ","M22N9MKYE ","M22N9MKZE ","M22N9MMXE ","M22N9MMYE ","M22N9MMZE ", & + "M22N9RAXE ","M22N9RAYE ","M22N9RAZE ","M22N9RDXE ","M22N9RDYE ","M22N9RDZE ","M22N9TAXE ", & + "M22N9TAYE ","M22N9TAZE ","M22N9TDXSS","M22N9TDYSS","M22N9TDZSS","M23N1FKXE ","M23N1FKYE ", & + "M23N1FKZE ","M23N1FMXE ","M23N1FMYE ","M23N1FMZE ","M23N1MKXE ","M23N1MKYE ","M23N1MKZE ", & + "M23N1MMXE ","M23N1MMYE ","M23N1MMZE ","M23N1RAXE ","M23N1RAYE ","M23N1RAZE ","M23N1RDXE ", & + "M23N1RDYE ","M23N1RDZE ","M23N1TAXE ","M23N1TAYE ","M23N1TAZE ","M23N1TDXSS","M23N1TDYSS", & + "M23N1TDZSS","M23N2FKXE ","M23N2FKYE ","M23N2FKZE ","M23N2FMXE ","M23N2FMYE ","M23N2FMZE ", & + "M23N2MKXE ","M23N2MKYE ","M23N2MKZE ","M23N2MMXE ","M23N2MMYE ","M23N2MMZE ","M23N2RAXE ", & + "M23N2RAYE ","M23N2RAZE ","M23N2RDXE ","M23N2RDYE ","M23N2RDZE ","M23N2TAXE ","M23N2TAYE ", & + "M23N2TAZE ","M23N2TDXSS","M23N2TDYSS","M23N2TDZSS","M23N3FKXE ","M23N3FKYE ","M23N3FKZE ", & + "M23N3FMXE ","M23N3FMYE ","M23N3FMZE ","M23N3MKXE ","M23N3MKYE ","M23N3MKZE ","M23N3MMXE ", & + "M23N3MMYE ","M23N3MMZE ","M23N3RAXE ","M23N3RAYE ","M23N3RAZE ","M23N3RDXE ","M23N3RDYE ", & + "M23N3RDZE ","M23N3TAXE ","M23N3TAYE ","M23N3TAZE ","M23N3TDXSS","M23N3TDYSS","M23N3TDZSS", & + "M23N4FKXE ","M23N4FKYE ","M23N4FKZE ","M23N4FMXE ","M23N4FMYE ","M23N4FMZE ","M23N4MKXE ", & + "M23N4MKYE ","M23N4MKZE ","M23N4MMXE ","M23N4MMYE ","M23N4MMZE ","M23N4RAXE ","M23N4RAYE ", & + "M23N4RAZE ","M23N4RDXE ","M23N4RDYE ","M23N4RDZE ","M23N4TAXE ","M23N4TAYE ","M23N4TAZE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry4(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M23N4TDXSS","M23N4TDYSS","M23N4TDZSS","M23N5FKXE ","M23N5FKYE ","M23N5FKZE ","M23N5FMXE ", & + "M23N5FMYE ","M23N5FMZE ","M23N5MKXE ","M23N5MKYE ","M23N5MKZE ","M23N5MMXE ","M23N5MMYE ", & + "M23N5MMZE ","M23N5RAXE ","M23N5RAYE ","M23N5RAZE ","M23N5RDXE ","M23N5RDYE ","M23N5RDZE ", & + "M23N5TAXE ","M23N5TAYE ","M23N5TAZE ","M23N5TDXSS","M23N5TDYSS","M23N5TDZSS","M23N6FKXE ", & + "M23N6FKYE ","M23N6FKZE ","M23N6FMXE ","M23N6FMYE ","M23N6FMZE ","M23N6MKXE ","M23N6MKYE ", & + "M23N6MKZE ","M23N6MMXE ","M23N6MMYE ","M23N6MMZE ","M23N6RAXE ","M23N6RAYE ","M23N6RAZE ", & + "M23N6RDXE ","M23N6RDYE ","M23N6RDZE ","M23N6TAXE ","M23N6TAYE ","M23N6TAZE ","M23N6TDXSS", & + "M23N6TDYSS","M23N6TDZSS","M23N7FKXE ","M23N7FKYE ","M23N7FKZE ","M23N7FMXE ","M23N7FMYE ", & + "M23N7FMZE ","M23N7MKXE ","M23N7MKYE ","M23N7MKZE ","M23N7MMXE ","M23N7MMYE ","M23N7MMZE ", & + "M23N7RAXE ","M23N7RAYE ","M23N7RAZE ","M23N7RDXE ","M23N7RDYE ","M23N7RDZE ","M23N7TAXE ", & + "M23N7TAYE ","M23N7TAZE ","M23N7TDXSS","M23N7TDYSS","M23N7TDZSS","M23N8FKXE ","M23N8FKYE ", & + "M23N8FKZE ","M23N8FMXE ","M23N8FMYE ","M23N8FMZE ","M23N8MKXE ","M23N8MKYE ","M23N8MKZE ", & + "M23N8MMXE ","M23N8MMYE ","M23N8MMZE ","M23N8RAXE ","M23N8RAYE ","M23N8RAZE ","M23N8RDXE ", & + "M23N8RDYE ","M23N8RDZE ","M23N8TAXE ","M23N8TAYE ","M23N8TAZE ","M23N8TDXSS","M23N8TDYSS", & + "M23N8TDZSS","M23N9FKXE ","M23N9FKYE ","M23N9FKZE ","M23N9FMXE ","M23N9FMYE ","M23N9FMZE ", & + "M23N9MKXE ","M23N9MKYE ","M23N9MKZE ","M23N9MMXE ","M23N9MMYE ","M23N9MMZE ","M23N9RAXE ", & + "M23N9RAYE ","M23N9RAZE ","M23N9RDXE ","M23N9RDYE ","M23N9RDZE ","M23N9TAXE ","M23N9TAYE ", & + "M23N9TAZE ","M23N9TDXSS","M23N9TDYSS","M23N9TDZSS","M24N1FKXE ","M24N1FKYE ","M24N1FKZE ", & + "M24N1FMXE ","M24N1FMYE ","M24N1FMZE ","M24N1MKXE ","M24N1MKYE ","M24N1MKZE ","M24N1MMXE ", & + "M24N1MMYE ","M24N1MMZE ","M24N1RAXE ","M24N1RAYE ","M24N1RAZE ","M24N1RDXE ","M24N1RDYE ", & + "M24N1RDZE ","M24N1TAXE ","M24N1TAYE ","M24N1TAZE ","M24N1TDXSS","M24N1TDYSS","M24N1TDZSS", & "M24N2FKXE ","M24N2FKYE ","M24N2FKZE ","M24N2FMXE ","M24N2FMYE ","M24N2FMZE ","M24N2MKXE ", & "M24N2MKYE ","M24N2MKZE ","M24N2MMXE ","M24N2MMYE ","M24N2MMZE ","M24N2RAXE ","M24N2RAYE ", & "M24N2RAZE ","M24N2RDXE ","M24N2RDYE ","M24N2RDZE ","M24N2TAXE ","M24N2TAYE ","M24N2TAZE ", & @@ -24513,7 +24779,8 @@ module SubDyn_Output_Params "M31N2FKXE ","M31N2FKYE ","M31N2FKZE ","M31N2FMXE ","M31N2FMYE ","M31N2FMZE ","M31N2MKXE ", & "M31N2MKYE ","M31N2MKZE ","M31N2MMXE ","M31N2MMYE ","M31N2MMZE ","M31N2RAXE ","M31N2RAYE ", & "M31N2RAZE ","M31N2RDXE ","M31N2RDYE ","M31N2RDZE ","M31N2TAXE ","M31N2TAYE ","M31N2TAZE ", & - "M31N2TDXSS","M31N2TDYSS","M31N2TDZSS","M31N3FKXE ","M31N3FKYE ","M31N3FKZE ","M31N3FMXE ", & + "M31N2TDXSS","M31N2TDYSS","M31N2TDZSS","M31N3FKXE ","M31N3FKYE ","M31N3FKZE ","M31N3FMXE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry5(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically "M31N3FMYE ","M31N3FMZE ","M31N3MKXE ","M31N3MKYE ","M31N3MKZE ","M31N3MMXE ","M31N3MMYE ", & "M31N3MMZE ","M31N3RAXE ","M31N3RAYE ","M31N3RAZE ","M31N3RDXE ","M31N3RDYE ","M31N3RDZE ", & "M31N3TAXE ","M31N3TAYE ","M31N3TAZE ","M31N3TDXSS","M31N3TDYSS","M31N3TDZSS","M31N4FKXE ", & @@ -24532,1448 +24799,1444 @@ module SubDyn_Output_Params "M31N7RAYE ","M31N7RAZE ","M31N7RDXE ","M31N7RDYE ","M31N7RDZE ","M31N7TAXE ","M31N7TAYE ", & "M31N7TAZE ","M31N7TDXSS","M31N7TDYSS","M31N7TDZSS","M31N8FKXE ","M31N8FKYE ","M31N8FKZE ", & "M31N8FMXE ","M31N8FMYE ","M31N8FMZE ","M31N8MKXE ","M31N8MKYE ","M31N8MKZE ","M31N8MMXE ", & - "M31N8MMYE ","M31N8MMZE ","M31N8RAXE ","M31N8RAYE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry5(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M31N8RAZE ","M31N8RDXE ","M31N8RDYE ","M31N8RDZE ","M31N8TAXE ","M31N8TAYE ","M31N8TAZE ", & - "M31N8TDXSS","M31N8TDYSS","M31N8TDZSS","M31N9FKXE ","M31N9FKYE ","M31N9FKZE ","M31N9FMXE ", & - "M31N9FMYE ","M31N9FMZE ","M31N9MKXE ","M31N9MKYE ","M31N9MKZE ","M31N9MMXE ","M31N9MMYE ", & - "M31N9MMZE ","M31N9RAXE ","M31N9RAYE ","M31N9RAZE ","M31N9RDXE ","M31N9RDYE ","M31N9RDZE ", & - "M31N9TAXE ","M31N9TAYE ","M31N9TAZE ","M31N9TDXSS","M31N9TDYSS","M31N9TDZSS","M32N1FKXE ", & - "M32N1FKYE ","M32N1FKZE ","M32N1FMXE ","M32N1FMYE ","M32N1FMZE ","M32N1MKXE ","M32N1MKYE ", & - "M32N1MKZE ","M32N1MMXE ","M32N1MMYE ","M32N1MMZE ","M32N1RAXE ","M32N1RAYE ","M32N1RAZE ", & - "M32N1RDXE ","M32N1RDYE ","M32N1RDZE ","M32N1TAXE ","M32N1TAYE ","M32N1TAZE ","M32N1TDXSS", & - "M32N1TDYSS","M32N1TDZSS","M32N2FKXE ","M32N2FKYE ","M32N2FKZE ","M32N2FMXE ","M32N2FMYE ", & - "M32N2FMZE ","M32N2MKXE ","M32N2MKYE ","M32N2MKZE ","M32N2MMXE ","M32N2MMYE ","M32N2MMZE ", & - "M32N2RAXE ","M32N2RAYE ","M32N2RAZE ","M32N2RDXE ","M32N2RDYE ","M32N2RDZE ","M32N2TAXE ", & - "M32N2TAYE ","M32N2TAZE ","M32N2TDXSS","M32N2TDYSS","M32N2TDZSS","M32N3FKXE ","M32N3FKYE ", & - "M32N3FKZE ","M32N3FMXE ","M32N3FMYE ","M32N3FMZE ","M32N3MKXE ","M32N3MKYE ","M32N3MKZE ", & - "M32N3MMXE ","M32N3MMYE ","M32N3MMZE ","M32N3RAXE ","M32N3RAYE ","M32N3RAZE ","M32N3RDXE ", & - "M32N3RDYE ","M32N3RDZE ","M32N3TAXE ","M32N3TAYE ","M32N3TAZE ","M32N3TDXSS","M32N3TDYSS", & - "M32N3TDZSS","M32N4FKXE ","M32N4FKYE ","M32N4FKZE ","M32N4FMXE ","M32N4FMYE ","M32N4FMZE ", & - "M32N4MKXE ","M32N4MKYE ","M32N4MKZE ","M32N4MMXE ","M32N4MMYE ","M32N4MMZE ","M32N4RAXE ", & - "M32N4RAYE ","M32N4RAZE ","M32N4RDXE ","M32N4RDYE ","M32N4RDZE ","M32N4TAXE ","M32N4TAYE ", & - "M32N4TAZE ","M32N4TDXSS","M32N4TDYSS","M32N4TDZSS","M32N5FKXE ","M32N5FKYE ","M32N5FKZE ", & - "M32N5FMXE ","M32N5FMYE ","M32N5FMZE ","M32N5MKXE ","M32N5MKYE ","M32N5MKZE ","M32N5MMXE ", & - "M32N5MMYE ","M32N5MMZE ","M32N5RAXE ","M32N5RAYE ","M32N5RAZE ","M32N5RDXE ","M32N5RDYE ", & - "M32N5RDZE ","M32N5TAXE ","M32N5TAYE ","M32N5TAZE ","M32N5TDXSS","M32N5TDYSS","M32N5TDZSS", & - "M32N6FKXE ","M32N6FKYE ","M32N6FKZE ","M32N6FMXE ","M32N6FMYE ","M32N6FMZE ","M32N6MKXE ", & - "M32N6MKYE ","M32N6MKZE ","M32N6MMXE ","M32N6MMYE ","M32N6MMZE ","M32N6RAXE ","M32N6RAYE ", & - "M32N6RAZE ","M32N6RDXE ","M32N6RDYE ","M32N6RDZE ","M32N6TAXE ","M32N6TAYE ","M32N6TAZE ", & - "M32N6TDXSS","M32N6TDYSS","M32N6TDZSS","M32N7FKXE ","M32N7FKYE ","M32N7FKZE ","M32N7FMXE ", & - "M32N7FMYE ","M32N7FMZE ","M32N7MKXE ","M32N7MKYE ","M32N7MKZE ","M32N7MMXE ","M32N7MMYE ", & - "M32N7MMZE ","M32N7RAXE ","M32N7RAYE ","M32N7RAZE ","M32N7RDXE ","M32N7RDYE ","M32N7RDZE ", & - "M32N7TAXE ","M32N7TAYE ","M32N7TAZE ","M32N7TDXSS","M32N7TDYSS","M32N7TDZSS","M32N8FKXE ", & - "M32N8FKYE ","M32N8FKZE ","M32N8FMXE ","M32N8FMYE ","M32N8FMZE ","M32N8MKXE ","M32N8MKYE ", & - "M32N8MKZE ","M32N8MMXE ","M32N8MMYE ","M32N8MMZE ","M32N8RAXE ","M32N8RAYE ","M32N8RAZE ", & - "M32N8RDXE ","M32N8RDYE ","M32N8RDZE ","M32N8TAXE ","M32N8TAYE ","M32N8TAZE ","M32N8TDXSS", & - "M32N8TDYSS","M32N8TDZSS","M32N9FKXE ","M32N9FKYE ","M32N9FKZE ","M32N9FMXE ","M32N9FMYE ", & - "M32N9FMZE ","M32N9MKXE ","M32N9MKYE ","M32N9MKZE ","M32N9MMXE ","M32N9MMYE ","M32N9MMZE ", & - "M32N9RAXE ","M32N9RAYE ","M32N9RAZE ","M32N9RDXE ","M32N9RDYE ","M32N9RDZE ","M32N9TAXE ", & - "M32N9TAYE ","M32N9TAZE ","M32N9TDXSS","M32N9TDYSS","M32N9TDZSS","M33N1FKXE ","M33N1FKYE ", & - "M33N1FKZE ","M33N1FMXE ","M33N1FMYE ","M33N1FMZE ","M33N1MKXE ","M33N1MKYE ","M33N1MKZE ", & - "M33N1MMXE ","M33N1MMYE ","M33N1MMZE ","M33N1RAXE ","M33N1RAYE ","M33N1RAZE ","M33N1RDXE ", & - "M33N1RDYE ","M33N1RDZE ","M33N1TAXE ","M33N1TAYE ","M33N1TAZE ","M33N1TDXSS","M33N1TDYSS", & - "M33N1TDZSS","M33N2FKXE ","M33N2FKYE ","M33N2FKZE ","M33N2FMXE ","M33N2FMYE ","M33N2FMZE ", & - "M33N2MKXE ","M33N2MKYE ","M33N2MKZE ","M33N2MMXE ","M33N2MMYE ","M33N2MMZE ","M33N2RAXE ", & - "M33N2RAYE ","M33N2RAZE ","M33N2RDXE ","M33N2RDYE ","M33N2RDZE ","M33N2TAXE ","M33N2TAYE ", & - "M33N2TAZE ","M33N2TDXSS","M33N2TDYSS","M33N2TDZSS","M33N3FKXE ","M33N3FKYE ","M33N3FKZE ", & - "M33N3FMXE ","M33N3FMYE ","M33N3FMZE ","M33N3MKXE ","M33N3MKYE ","M33N3MKZE ","M33N3MMXE ", & - "M33N3MMYE ","M33N3MMZE ","M33N3RAXE ","M33N3RAYE ","M33N3RAZE ","M33N3RDXE ","M33N3RDYE ", & - "M33N3RDZE ","M33N3TAXE ","M33N3TAYE ","M33N3TAZE ","M33N3TDXSS","M33N3TDYSS","M33N3TDZSS", & - "M33N4FKXE ","M33N4FKYE ","M33N4FKZE ","M33N4FMXE ","M33N4FMYE ","M33N4FMZE ","M33N4MKXE ", & - "M33N4MKYE ","M33N4MKZE ","M33N4MMXE ","M33N4MMYE ","M33N4MMZE ","M33N4RAXE ","M33N4RAYE ", & - "M33N4RAZE ","M33N4RDXE ","M33N4RDYE ","M33N4RDZE ","M33N4TAXE ","M33N4TAYE ","M33N4TAZE ", & - "M33N4TDXSS","M33N4TDYSS","M33N4TDZSS","M33N5FKXE ","M33N5FKYE ","M33N5FKZE ","M33N5FMXE ", & - "M33N5FMYE ","M33N5FMZE ","M33N5MKXE ","M33N5MKYE ","M33N5MKZE ","M33N5MMXE ","M33N5MMYE ", & - "M33N5MMZE ","M33N5RAXE ","M33N5RAYE ","M33N5RAZE ","M33N5RDXE ","M33N5RDYE ","M33N5RDZE ", & - "M33N5TAXE ","M33N5TAYE ","M33N5TAZE ","M33N5TDXSS","M33N5TDYSS","M33N5TDZSS","M33N6FKXE ", & - "M33N6FKYE ","M33N6FKZE ","M33N6FMXE ","M33N6FMYE ","M33N6FMZE ","M33N6MKXE ","M33N6MKYE ", & - "M33N6MKZE ","M33N6MMXE ","M33N6MMYE ","M33N6MMZE ","M33N6RAXE ","M33N6RAYE ","M33N6RAZE ", & - "M33N6RDXE ","M33N6RDYE ","M33N6RDZE ","M33N6TAXE ","M33N6TAYE ","M33N6TAZE ","M33N6TDXSS", & - "M33N6TDYSS","M33N6TDZSS","M33N7FKXE ","M33N7FKYE ","M33N7FKZE ","M33N7FMXE ","M33N7FMYE ", & - "M33N7FMZE ","M33N7MKXE ","M33N7MKYE ","M33N7MKZE ","M33N7MMXE ","M33N7MMYE ","M33N7MMZE ", & - "M33N7RAXE ","M33N7RAYE ","M33N7RAZE ","M33N7RDXE ","M33N7RDYE ","M33N7RDZE ","M33N7TAXE ", & - "M33N7TAYE ","M33N7TAZE ","M33N7TDXSS","M33N7TDYSS","M33N7TDZSS","M33N8FKXE ","M33N8FKYE ", & - "M33N8FKZE ","M33N8FMXE ","M33N8FMYE ","M33N8FMZE ","M33N8MKXE ","M33N8MKYE ","M33N8MKZE ", & - "M33N8MMXE ","M33N8MMYE ","M33N8MMZE ","M33N8RAXE ","M33N8RAYE ","M33N8RAZE ","M33N8RDXE ", & - "M33N8RDYE ","M33N8RDZE ","M33N8TAXE ","M33N8TAYE ","M33N8TAZE ","M33N8TDXSS","M33N8TDYSS", & - "M33N8TDZSS","M33N9FKXE ","M33N9FKYE ","M33N9FKZE ","M33N9FMXE ","M33N9FMYE ","M33N9FMZE ", & - "M33N9MKXE ","M33N9MKYE ","M33N9MKZE ","M33N9MMXE ","M33N9MMYE ","M33N9MMZE ","M33N9RAXE ", & - "M33N9RAYE ","M33N9RAZE ","M33N9RDXE ","M33N9RDYE ","M33N9RDZE ","M33N9TAXE ","M33N9TAYE ", & - "M33N9TAZE ","M33N9TDXSS","M33N9TDYSS","M33N9TDZSS","M34N1FKXE ","M34N1FKYE ","M34N1FKZE ", & - "M34N1FMXE ","M34N1FMYE ","M34N1FMZE ","M34N1MKXE ","M34N1MKYE ","M34N1MKZE ","M34N1MMXE ", & - "M34N1MMYE ","M34N1MMZE ","M34N1RAXE ","M34N1RAYE ","M34N1RAZE ","M34N1RDXE ","M34N1RDYE ", & - "M34N1RDZE ","M34N1TAXE ","M34N1TAYE ","M34N1TAZE ","M34N1TDXSS","M34N1TDYSS","M34N1TDZSS", & - "M34N2FKXE ","M34N2FKYE ","M34N2FKZE ","M34N2FMXE ","M34N2FMYE ","M34N2FMZE ","M34N2MKXE ", & - "M34N2MKYE ","M34N2MKZE ","M34N2MMXE ","M34N2MMYE ","M34N2MMZE ","M34N2RAXE ","M34N2RAYE ", & - "M34N2RAZE ","M34N2RDXE ","M34N2RDYE ","M34N2RDZE ","M34N2TAXE ","M34N2TAYE ","M34N2TAZE ", & - "M34N2TDXSS","M34N2TDYSS","M34N2TDZSS","M34N3FKXE ","M34N3FKYE ","M34N3FKZE ","M34N3FMXE ", & - "M34N3FMYE ","M34N3FMZE ","M34N3MKXE ","M34N3MKYE ","M34N3MKZE ","M34N3MMXE ","M34N3MMYE ", & - "M34N3MMZE ","M34N3RAXE ","M34N3RAYE ","M34N3RAZE ","M34N3RDXE ","M34N3RDYE ","M34N3RDZE ", & - "M34N3TAXE ","M34N3TAYE ","M34N3TAZE ","M34N3TDXSS","M34N3TDYSS","M34N3TDZSS","M34N4FKXE ", & - "M34N4FKYE ","M34N4FKZE ","M34N4FMXE ","M34N4FMYE ","M34N4FMZE ","M34N4MKXE ","M34N4MKYE ", & - "M34N4MKZE ","M34N4MMXE ","M34N4MMYE ","M34N4MMZE ","M34N4RAXE ","M34N4RAYE ","M34N4RAZE ", & - "M34N4RDXE ","M34N4RDYE ","M34N4RDZE ","M34N4TAXE ","M34N4TAYE ","M34N4TAZE ","M34N4TDXSS", & - "M34N4TDYSS","M34N4TDZSS","M34N5FKXE ","M34N5FKYE ","M34N5FKZE ","M34N5FMXE ","M34N5FMYE ", & - "M34N5FMZE ","M34N5MKXE ","M34N5MKYE ","M34N5MKZE ","M34N5MMXE ","M34N5MMYE ","M34N5MMZE ", & - "M34N5RAXE ","M34N5RAYE ","M34N5RAZE ","M34N5RDXE ","M34N5RDYE ","M34N5RDZE ","M34N5TAXE ", & - "M34N5TAYE ","M34N5TAZE ","M34N5TDXSS","M34N5TDYSS","M34N5TDZSS","M34N6FKXE ","M34N6FKYE ", & - "M34N6FKZE ","M34N6FMXE ","M34N6FMYE ","M34N6FMZE ","M34N6MKXE ","M34N6MKYE ","M34N6MKZE ", & - "M34N6MMXE ","M34N6MMYE ","M34N6MMZE ","M34N6RAXE ","M34N6RAYE ","M34N6RAZE ","M34N6RDXE ", & - "M34N6RDYE ","M34N6RDZE ","M34N6TAXE ","M34N6TAYE ","M34N6TAZE ","M34N6TDXSS","M34N6TDYSS", & - "M34N6TDZSS","M34N7FKXE ","M34N7FKYE ","M34N7FKZE ","M34N7FMXE ","M34N7FMYE ","M34N7FMZE ", & - "M34N7MKXE ","M34N7MKYE ","M34N7MKZE ","M34N7MMXE ","M34N7MMYE ","M34N7MMZE ","M34N7RAXE ", & - "M34N7RAYE ","M34N7RAZE ","M34N7RDXE ","M34N7RDYE ","M34N7RDZE ","M34N7TAXE ","M34N7TAYE ", & - "M34N7TAZE ","M34N7TDXSS","M34N7TDYSS","M34N7TDZSS","M34N8FKXE ","M34N8FKYE ","M34N8FKZE ", & - "M34N8FMXE ","M34N8FMYE ","M34N8FMZE ","M34N8MKXE ","M34N8MKYE ","M34N8MKZE ","M34N8MMXE ", & - "M34N8MMYE ","M34N8MMZE ","M34N8RAXE ","M34N8RAYE ","M34N8RAZE ","M34N8RDXE ","M34N8RDYE ", & - "M34N8RDZE ","M34N8TAXE ","M34N8TAYE ","M34N8TAZE ","M34N8TDXSS","M34N8TDYSS","M34N8TDZSS", & - "M34N9FKXE ","M34N9FKYE ","M34N9FKZE ","M34N9FMXE ","M34N9FMYE ","M34N9FMZE ","M34N9MKXE ", & - "M34N9MKYE ","M34N9MKZE ","M34N9MMXE ","M34N9MMYE ","M34N9MMZE ","M34N9RAXE ","M34N9RAYE ", & - "M34N9RAZE ","M34N9RDXE ","M34N9RDYE ","M34N9RDZE ","M34N9TAXE ","M34N9TAYE ","M34N9TAZE ", & - "M34N9TDXSS","M34N9TDYSS","M34N9TDZSS","M35N1FKXE ","M35N1FKYE ","M35N1FKZE ","M35N1FMXE ", & - "M35N1FMYE ","M35N1FMZE ","M35N1MKXE ","M35N1MKYE ","M35N1MKZE ","M35N1MMXE ","M35N1MMYE ", & - "M35N1MMZE ","M35N1RAXE ","M35N1RAYE ","M35N1RAZE ","M35N1RDXE ","M35N1RDYE ","M35N1RDZE ", & - "M35N1TAXE ","M35N1TAYE ","M35N1TAZE ","M35N1TDXSS","M35N1TDYSS","M35N1TDZSS","M35N2FKXE ", & - "M35N2FKYE ","M35N2FKZE ","M35N2FMXE ","M35N2FMYE ","M35N2FMZE ","M35N2MKXE ","M35N2MKYE ", & - "M35N2MKZE ","M35N2MMXE ","M35N2MMYE ","M35N2MMZE ","M35N2RAXE ","M35N2RAYE ","M35N2RAZE ", & - "M35N2RDXE ","M35N2RDYE ","M35N2RDZE ","M35N2TAXE ","M35N2TAYE ","M35N2TAZE ","M35N2TDXSS", & - "M35N2TDYSS","M35N2TDZSS","M35N3FKXE ","M35N3FKYE ","M35N3FKZE ","M35N3FMXE ","M35N3FMYE ", & - "M35N3FMZE ","M35N3MKXE ","M35N3MKYE ","M35N3MKZE ","M35N3MMXE ","M35N3MMYE ","M35N3MMZE ", & - "M35N3RAXE ","M35N3RAYE ","M35N3RAZE ","M35N3RDXE ","M35N3RDYE ","M35N3RDZE ","M35N3TAXE ", & - "M35N3TAYE ","M35N3TAZE ","M35N3TDXSS","M35N3TDYSS","M35N3TDZSS","M35N4FKXE ","M35N4FKYE ", & - "M35N4FKZE ","M35N4FMXE ","M35N4FMYE ","M35N4FMZE ","M35N4MKXE ","M35N4MKYE ","M35N4MKZE ", & - "M35N4MMXE ","M35N4MMYE ","M35N4MMZE ","M35N4RAXE ","M35N4RAYE ","M35N4RAZE ","M35N4RDXE ", & - "M35N4RDYE ","M35N4RDZE ","M35N4TAXE ","M35N4TAYE ","M35N4TAZE ","M35N4TDXSS","M35N4TDYSS", & - "M35N4TDZSS","M35N5FKXE ","M35N5FKYE ","M35N5FKZE ","M35N5FMXE ","M35N5FMYE ","M35N5FMZE ", & - "M35N5MKXE ","M35N5MKYE ","M35N5MKZE ","M35N5MMXE ","M35N5MMYE ","M35N5MMZE ","M35N5RAXE ", & - "M35N5RAYE ","M35N5RAZE ","M35N5RDXE ","M35N5RDYE ","M35N5RDZE ","M35N5TAXE ","M35N5TAYE ", & - "M35N5TAZE ","M35N5TDXSS","M35N5TDYSS","M35N5TDZSS","M35N6FKXE ","M35N6FKYE ","M35N6FKZE ", & - "M35N6FMXE ","M35N6FMYE ","M35N6FMZE ","M35N6MKXE ","M35N6MKYE ","M35N6MKZE ","M35N6MMXE ", & - "M35N6MMYE ","M35N6MMZE ","M35N6RAXE ","M35N6RAYE ","M35N6RAZE ","M35N6RDXE ","M35N6RDYE ", & - "M35N6RDZE ","M35N6TAXE ","M35N6TAYE ","M35N6TAZE ","M35N6TDXSS","M35N6TDYSS","M35N6TDZSS", & - "M35N7FKXE ","M35N7FKYE ","M35N7FKZE ","M35N7FMXE ","M35N7FMYE ","M35N7FMZE ","M35N7MKXE ", & - "M35N7MKYE ","M35N7MKZE ","M35N7MMXE ","M35N7MMYE ","M35N7MMZE ","M35N7RAXE ","M35N7RAYE ", & - "M35N7RAZE ","M35N7RDXE ","M35N7RDYE ","M35N7RDZE ","M35N7TAXE ","M35N7TAYE ","M35N7TAZE ", & - "M35N7TDXSS","M35N7TDYSS","M35N7TDZSS","M35N8FKXE ","M35N8FKYE ","M35N8FKZE ","M35N8FMXE ", & - "M35N8FMYE ","M35N8FMZE ","M35N8MKXE ","M35N8MKYE ","M35N8MKZE ","M35N8MMXE ","M35N8MMYE ", & - "M35N8MMZE ","M35N8RAXE ","M35N8RAYE ","M35N8RAZE ","M35N8RDXE ","M35N8RDYE ","M35N8RDZE ", & - "M35N8TAXE ","M35N8TAYE ","M35N8TAZE ","M35N8TDXSS","M35N8TDYSS","M35N8TDZSS","M35N9FKXE ", & - "M35N9FKYE ","M35N9FKZE ","M35N9FMXE ","M35N9FMYE ","M35N9FMZE ","M35N9MKXE ","M35N9MKYE ", & - "M35N9MKZE ","M35N9MMXE ","M35N9MMYE ","M35N9MMZE ","M35N9RAXE ","M35N9RAYE ","M35N9RAZE ", & - "M35N9RDXE ","M35N9RDYE ","M35N9RDZE ","M35N9TAXE ","M35N9TAYE ","M35N9TAZE ","M35N9TDXSS", & - "M35N9TDYSS","M35N9TDZSS","M36N1FKXE ","M36N1FKYE ","M36N1FKZE ","M36N1FMXE ","M36N1FMYE ", & - "M36N1FMZE ","M36N1MKXE ","M36N1MKYE ","M36N1MKZE ","M36N1MMXE ","M36N1MMYE ","M36N1MMZE ", & - "M36N1RAXE ","M36N1RAYE ","M36N1RAZE ","M36N1RDXE ","M36N1RDYE ","M36N1RDZE ","M36N1TAXE ", & - "M36N1TAYE ","M36N1TAZE ","M36N1TDXSS","M36N1TDYSS","M36N1TDZSS","M36N2FKXE ","M36N2FKYE ", & - "M36N2FKZE ","M36N2FMXE ","M36N2FMYE ","M36N2FMZE ","M36N2MKXE ","M36N2MKYE ","M36N2MKZE ", & - "M36N2MMXE ","M36N2MMYE ","M36N2MMZE ","M36N2RAXE ","M36N2RAYE ","M36N2RAZE ","M36N2RDXE ", & - "M36N2RDYE ","M36N2RDZE ","M36N2TAXE ","M36N2TAYE ","M36N2TAZE ","M36N2TDXSS","M36N2TDYSS", & - "M36N2TDZSS","M36N3FKXE ","M36N3FKYE ","M36N3FKZE ","M36N3FMXE ","M36N3FMYE ","M36N3FMZE ", & - "M36N3MKXE ","M36N3MKYE ","M36N3MKZE ","M36N3MMXE ","M36N3MMYE ","M36N3MMZE ","M36N3RAXE ", & - "M36N3RAYE ","M36N3RAZE ","M36N3RDXE ","M36N3RDYE ","M36N3RDZE ","M36N3TAXE ","M36N3TAYE ", & - "M36N3TAZE ","M36N3TDXSS","M36N3TDYSS","M36N3TDZSS","M36N4FKXE ","M36N4FKYE ","M36N4FKZE ", & - "M36N4FMXE ","M36N4FMYE ","M36N4FMZE ","M36N4MKXE ","M36N4MKYE ","M36N4MKZE ","M36N4MMXE ", & - "M36N4MMYE ","M36N4MMZE ","M36N4RAXE ","M36N4RAYE ","M36N4RAZE ","M36N4RDXE ","M36N4RDYE ", & - "M36N4RDZE ","M36N4TAXE ","M36N4TAYE ","M36N4TAZE ","M36N4TDXSS","M36N4TDYSS","M36N4TDZSS", & - "M36N5FKXE ","M36N5FKYE ","M36N5FKZE ","M36N5FMXE ","M36N5FMYE ","M36N5FMZE ","M36N5MKXE ", & - "M36N5MKYE ","M36N5MKZE ","M36N5MMXE ","M36N5MMYE ","M36N5MMZE ","M36N5RAXE ","M36N5RAYE ", & - "M36N5RAZE ","M36N5RDXE ","M36N5RDYE ","M36N5RDZE ","M36N5TAXE ","M36N5TAYE ","M36N5TAZE ", & - "M36N5TDXSS","M36N5TDYSS","M36N5TDZSS","M36N6FKXE ","M36N6FKYE ","M36N6FKZE ","M36N6FMXE ", & - "M36N6FMYE ","M36N6FMZE ","M36N6MKXE ","M36N6MKYE ","M36N6MKZE ","M36N6MMXE ","M36N6MMYE ", & - "M36N6MMZE ","M36N6RAXE ","M36N6RAYE ","M36N6RAZE ","M36N6RDXE ","M36N6RDYE ","M36N6RDZE ", & - "M36N6TAXE ","M36N6TAYE ","M36N6TAZE ","M36N6TDXSS","M36N6TDYSS","M36N6TDZSS","M36N7FKXE ", & - "M36N7FKYE ","M36N7FKZE ","M36N7FMXE ","M36N7FMYE ","M36N7FMZE ","M36N7MKXE ","M36N7MKYE ", & - "M36N7MKZE ","M36N7MMXE ","M36N7MMYE ","M36N7MMZE ","M36N7RAXE ","M36N7RAYE ","M36N7RAZE ", & - "M36N7RDXE ","M36N7RDYE ","M36N7RDZE ","M36N7TAXE ","M36N7TAYE ","M36N7TAZE ","M36N7TDXSS", & - "M36N7TDYSS","M36N7TDZSS","M36N8FKXE ","M36N8FKYE ","M36N8FKZE ","M36N8FMXE ","M36N8FMYE ", & - "M36N8FMZE ","M36N8MKXE ","M36N8MKYE ","M36N8MKZE ","M36N8MMXE ","M36N8MMYE ","M36N8MMZE ", & - "M36N8RAXE ","M36N8RAYE ","M36N8RAZE ","M36N8RDXE ","M36N8RDYE ","M36N8RDZE ","M36N8TAXE ", & - "M36N8TAYE ","M36N8TAZE ","M36N8TDXSS","M36N8TDYSS","M36N8TDZSS","M36N9FKXE ","M36N9FKYE ", & - "M36N9FKZE ","M36N9FMXE ","M36N9FMYE ","M36N9FMZE ","M36N9MKXE ","M36N9MKYE ","M36N9MKZE ", & - "M36N9MMXE ","M36N9MMYE ","M36N9MMZE ","M36N9RAXE ","M36N9RAYE ","M36N9RAZE ","M36N9RDXE ", & - "M36N9RDYE ","M36N9RDZE ","M36N9TAXE ","M36N9TAYE ","M36N9TAZE ","M36N9TDXSS","M36N9TDYSS", & - "M36N9TDZSS","M37N1FKXE ","M37N1FKYE ","M37N1FKZE ","M37N1FMXE ","M37N1FMYE ","M37N1FMZE ", & - "M37N1MKXE ","M37N1MKYE ","M37N1MKZE ","M37N1MMXE ","M37N1MMYE ","M37N1MMZE ","M37N1RAXE ", & - "M37N1RAYE ","M37N1RAZE ","M37N1RDXE ","M37N1RDYE ","M37N1RDZE ","M37N1TAXE ","M37N1TAYE ", & - "M37N1TAZE ","M37N1TDXSS","M37N1TDYSS","M37N1TDZSS","M37N2FKXE ","M37N2FKYE ","M37N2FKZE ", & - "M37N2FMXE ","M37N2FMYE ","M37N2FMZE ","M37N2MKXE ","M37N2MKYE ","M37N2MKZE ","M37N2MMXE ", & - "M37N2MMYE ","M37N2MMZE ","M37N2RAXE ","M37N2RAYE ","M37N2RAZE ","M37N2RDXE ","M37N2RDYE ", & - "M37N2RDZE ","M37N2TAXE ","M37N2TAYE ","M37N2TAZE ","M37N2TDXSS","M37N2TDYSS","M37N2TDZSS", & - "M37N3FKXE ","M37N3FKYE ","M37N3FKZE ","M37N3FMXE ","M37N3FMYE ","M37N3FMZE ","M37N3MKXE ", & - "M37N3MKYE ","M37N3MKZE ","M37N3MMXE ","M37N3MMYE ","M37N3MMZE ","M37N3RAXE ","M37N3RAYE ", & - "M37N3RAZE ","M37N3RDXE ","M37N3RDYE ","M37N3RDZE ","M37N3TAXE ","M37N3TAYE ","M37N3TAZE ", & - "M37N3TDXSS","M37N3TDYSS","M37N3TDZSS","M37N4FKXE ","M37N4FKYE ","M37N4FKZE ","M37N4FMXE ", & - "M37N4FMYE ","M37N4FMZE ","M37N4MKXE ","M37N4MKYE ","M37N4MKZE ","M37N4MMXE ","M37N4MMYE ", & - "M37N4MMZE ","M37N4RAXE ","M37N4RAYE ","M37N4RAZE ","M37N4RDXE ","M37N4RDYE ","M37N4RDZE ", & - "M37N4TAXE ","M37N4TAYE ","M37N4TAZE ","M37N4TDXSS","M37N4TDYSS","M37N4TDZSS","M37N5FKXE ", & - "M37N5FKYE ","M37N5FKZE ","M37N5FMXE ","M37N5FMYE ","M37N5FMZE ","M37N5MKXE ","M37N5MKYE ", & - "M37N5MKZE ","M37N5MMXE ","M37N5MMYE ","M37N5MMZE ","M37N5RAXE ","M37N5RAYE ","M37N5RAZE ", & - "M37N5RDXE ","M37N5RDYE ","M37N5RDZE ","M37N5TAXE ","M37N5TAYE ","M37N5TAZE ","M37N5TDXSS", & - "M37N5TDYSS","M37N5TDZSS","M37N6FKXE ","M37N6FKYE ","M37N6FKZE ","M37N6FMXE ","M37N6FMYE ", & - "M37N6FMZE ","M37N6MKXE ","M37N6MKYE ","M37N6MKZE ","M37N6MMXE ","M37N6MMYE ","M37N6MMZE ", & - "M37N6RAXE ","M37N6RAYE ","M37N6RAZE ","M37N6RDXE ","M37N6RDYE ","M37N6RDZE ","M37N6TAXE ", & - "M37N6TAYE ","M37N6TAZE ","M37N6TDXSS","M37N6TDYSS","M37N6TDZSS","M37N7FKXE ","M37N7FKYE ", & - "M37N7FKZE ","M37N7FMXE ","M37N7FMYE ","M37N7FMZE ","M37N7MKXE ","M37N7MKYE ","M37N7MKZE ", & - "M37N7MMXE ","M37N7MMYE ","M37N7MMZE ","M37N7RAXE ","M37N7RAYE ","M37N7RAZE ","M37N7RDXE ", & - "M37N7RDYE ","M37N7RDZE ","M37N7TAXE ","M37N7TAYE ","M37N7TAZE ","M37N7TDXSS","M37N7TDYSS", & - "M37N7TDZSS","M37N8FKXE ","M37N8FKYE ","M37N8FKZE ","M37N8FMXE ","M37N8FMYE ","M37N8FMZE ", & - "M37N8MKXE ","M37N8MKYE ","M37N8MKZE ","M37N8MMXE ","M37N8MMYE ","M37N8MMZE ","M37N8RAXE ", & - "M37N8RAYE ","M37N8RAZE ","M37N8RDXE ","M37N8RDYE ","M37N8RDZE ","M37N8TAXE ","M37N8TAYE ", & - "M37N8TAZE ","M37N8TDXSS","M37N8TDYSS","M37N8TDZSS","M37N9FKXE ","M37N9FKYE ","M37N9FKZE ", & - "M37N9FMXE ","M37N9FMYE ","M37N9FMZE ","M37N9MKXE ","M37N9MKYE ","M37N9MKZE ","M37N9MMXE ", & - "M37N9MMYE ","M37N9MMZE ","M37N9RAXE ","M37N9RAYE ","M37N9RAZE ","M37N9RDXE ","M37N9RDYE ", & - "M37N9RDZE ","M37N9TAXE ","M37N9TAYE ","M37N9TAZE ","M37N9TDXSS","M37N9TDYSS","M37N9TDZSS", & - "M38N1FKXE ","M38N1FKYE ","M38N1FKZE ","M38N1FMXE ","M38N1FMYE ","M38N1FMZE ","M38N1MKXE ", & - "M38N1MKYE ","M38N1MKZE ","M38N1MMXE ","M38N1MMYE ","M38N1MMZE ","M38N1RAXE ","M38N1RAYE ", & - "M38N1RAZE ","M38N1RDXE ","M38N1RDYE ","M38N1RDZE ","M38N1TAXE ","M38N1TAYE ","M38N1TAZE ", & - "M38N1TDXSS","M38N1TDYSS","M38N1TDZSS","M38N2FKXE ","M38N2FKYE ","M38N2FKZE ","M38N2FMXE ", & - "M38N2FMYE ","M38N2FMZE ","M38N2MKXE ","M38N2MKYE ","M38N2MKZE ","M38N2MMXE ","M38N2MMYE ", & - "M38N2MMZE ","M38N2RAXE ","M38N2RAYE ","M38N2RAZE ","M38N2RDXE ","M38N2RDYE ","M38N2RDZE ", & - "M38N2TAXE ","M38N2TAYE ","M38N2TAZE ","M38N2TDXSS","M38N2TDYSS","M38N2TDZSS","M38N3FKXE ", & - "M38N3FKYE ","M38N3FKZE ","M38N3FMXE ","M38N3FMYE ","M38N3FMZE ","M38N3MKXE ","M38N3MKYE ", & - "M38N3MKZE ","M38N3MMXE ","M38N3MMYE ","M38N3MMZE ","M38N3RAXE ","M38N3RAYE ","M38N3RAZE ", & - "M38N3RDXE ","M38N3RDYE ","M38N3RDZE ","M38N3TAXE ","M38N3TAYE ","M38N3TAZE ","M38N3TDXSS", & - "M38N3TDYSS","M38N3TDZSS","M38N4FKXE ","M38N4FKYE ","M38N4FKZE ","M38N4FMXE ","M38N4FMYE ", & - "M38N4FMZE ","M38N4MKXE ","M38N4MKYE ","M38N4MKZE ","M38N4MMXE ","M38N4MMYE ","M38N4MMZE ", & - "M38N4RAXE ","M38N4RAYE ","M38N4RAZE ","M38N4RDXE ","M38N4RDYE ","M38N4RDZE ","M38N4TAXE ", & - "M38N4TAYE ","M38N4TAZE ","M38N4TDXSS","M38N4TDYSS","M38N4TDZSS","M38N5FKXE ","M38N5FKYE ", & - "M38N5FKZE ","M38N5FMXE ","M38N5FMYE ","M38N5FMZE ","M38N5MKXE ","M38N5MKYE ","M38N5MKZE ", & - "M38N5MMXE ","M38N5MMYE ","M38N5MMZE ","M38N5RAXE ","M38N5RAYE ","M38N5RAZE ","M38N5RDXE ", & - "M38N5RDYE ","M38N5RDZE ","M38N5TAXE ","M38N5TAYE ","M38N5TAZE ","M38N5TDXSS","M38N5TDYSS", & - "M38N5TDZSS","M38N6FKXE ","M38N6FKYE ","M38N6FKZE ","M38N6FMXE ","M38N6FMYE ","M38N6FMZE ", & - "M38N6MKXE ","M38N6MKYE ","M38N6MKZE ","M38N6MMXE ","M38N6MMYE ","M38N6MMZE ","M38N6RAXE ", & - "M38N6RAYE ","M38N6RAZE ","M38N6RDXE ","M38N6RDYE ","M38N6RDZE ","M38N6TAXE ","M38N6TAYE ", & - "M38N6TAZE ","M38N6TDXSS","M38N6TDYSS","M38N6TDZSS","M38N7FKXE ","M38N7FKYE ","M38N7FKZE ", & - "M38N7FMXE ","M38N7FMYE ","M38N7FMZE ","M38N7MKXE ","M38N7MKYE ","M38N7MKZE ","M38N7MMXE ", & - "M38N7MMYE ","M38N7MMZE ","M38N7RAXE ","M38N7RAYE ","M38N7RAZE ","M38N7RDXE ","M38N7RDYE ", & - "M38N7RDZE ","M38N7TAXE ","M38N7TAYE ","M38N7TAZE ","M38N7TDXSS","M38N7TDYSS","M38N7TDZSS", & - "M38N8FKXE ","M38N8FKYE ","M38N8FKZE ","M38N8FMXE ","M38N8FMYE ","M38N8FMZE ","M38N8MKXE ", & - "M38N8MKYE ","M38N8MKZE ","M38N8MMXE ","M38N8MMYE ","M38N8MMZE ","M38N8RAXE ","M38N8RAYE ", & - "M38N8RAZE ","M38N8RDXE ","M38N8RDYE ","M38N8RDZE ","M38N8TAXE ","M38N8TAYE ","M38N8TAZE ", & - "M38N8TDXSS","M38N8TDYSS","M38N8TDZSS","M38N9FKXE ","M38N9FKYE ","M38N9FKZE ","M38N9FMXE ", & - "M38N9FMYE ","M38N9FMZE ","M38N9MKXE ","M38N9MKYE ","M38N9MKZE ","M38N9MMXE ","M38N9MMYE ", & - "M38N9MMZE ","M38N9RAXE ","M38N9RAYE ","M38N9RAZE ","M38N9RDXE ","M38N9RDYE ","M38N9RDZE ", & - "M38N9TAXE ","M38N9TAYE ","M38N9TAZE ","M38N9TDXSS","M38N9TDYSS","M38N9TDZSS","M39N1FKXE ", & - "M39N1FKYE ","M39N1FKZE ","M39N1FMXE ","M39N1FMYE ","M39N1FMZE ","M39N1MKXE ","M39N1MKYE ", & - "M39N1MKZE ","M39N1MMXE ","M39N1MMYE ","M39N1MMZE ","M39N1RAXE ","M39N1RAYE ","M39N1RAZE ", & - "M39N1RDXE ","M39N1RDYE ","M39N1RDZE ","M39N1TAXE ","M39N1TAYE ","M39N1TAZE ","M39N1TDXSS", & - "M39N1TDYSS","M39N1TDZSS","M39N2FKXE ","M39N2FKYE ","M39N2FKZE ","M39N2FMXE ","M39N2FMYE ", & - "M39N2FMZE ","M39N2MKXE ","M39N2MKYE ","M39N2MKZE ","M39N2MMXE ","M39N2MMYE ","M39N2MMZE ", & - "M39N2RAXE ","M39N2RAYE ","M39N2RAZE ","M39N2RDXE ","M39N2RDYE ","M39N2RDZE ","M39N2TAXE ", & - "M39N2TAYE ","M39N2TAZE ","M39N2TDXSS","M39N2TDYSS","M39N2TDZSS","M39N3FKXE ","M39N3FKYE ", & - "M39N3FKZE ","M39N3FMXE ","M39N3FMYE ","M39N3FMZE ","M39N3MKXE ","M39N3MKYE ","M39N3MKZE ", & - "M39N3MMXE ","M39N3MMYE ","M39N3MMZE ","M39N3RAXE ","M39N3RAYE ","M39N3RAZE ","M39N3RDXE ", & - "M39N3RDYE ","M39N3RDZE ","M39N3TAXE ","M39N3TAYE ","M39N3TAZE ","M39N3TDXSS","M39N3TDYSS", & - "M39N3TDZSS","M39N4FKXE ","M39N4FKYE ","M39N4FKZE ","M39N4FMXE ","M39N4FMYE ","M39N4FMZE ", & - "M39N4MKXE ","M39N4MKYE ","M39N4MKZE ","M39N4MMXE ","M39N4MMYE ","M39N4MMZE ","M39N4RAXE ", & - "M39N4RAYE ","M39N4RAZE ","M39N4RDXE ","M39N4RDYE ","M39N4RDZE ","M39N4TAXE ","M39N4TAYE ", & - "M39N4TAZE ","M39N4TDXSS","M39N4TDYSS","M39N4TDZSS","M39N5FKXE ","M39N5FKYE ","M39N5FKZE ", & - "M39N5FMXE ","M39N5FMYE ","M39N5FMZE ","M39N5MKXE ","M39N5MKYE ","M39N5MKZE ","M39N5MMXE ", & - "M39N5MMYE ","M39N5MMZE ","M39N5RAXE ","M39N5RAYE ","M39N5RAZE ","M39N5RDXE ","M39N5RDYE ", & - "M39N5RDZE ","M39N5TAXE ","M39N5TAYE ","M39N5TAZE ","M39N5TDXSS","M39N5TDYSS","M39N5TDZSS", & - "M39N6FKXE ","M39N6FKYE ","M39N6FKZE ","M39N6FMXE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry6(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M39N6FMYE ","M39N6FMZE ","M39N6MKXE ","M39N6MKYE ","M39N6MKZE ","M39N6MMXE ","M39N6MMYE ", & - "M39N6MMZE ","M39N6RAXE ","M39N6RAYE ","M39N6RAZE ","M39N6RDXE ","M39N6RDYE ","M39N6RDZE ", & - "M39N6TAXE ","M39N6TAYE ","M39N6TAZE ","M39N6TDXSS","M39N6TDYSS","M39N6TDZSS","M39N7FKXE ", & - "M39N7FKYE ","M39N7FKZE ","M39N7FMXE ","M39N7FMYE ","M39N7FMZE ","M39N7MKXE ","M39N7MKYE ", & - "M39N7MKZE ","M39N7MMXE ","M39N7MMYE ","M39N7MMZE ","M39N7RAXE ","M39N7RAYE ","M39N7RAZE ", & - "M39N7RDXE ","M39N7RDYE ","M39N7RDZE ","M39N7TAXE ","M39N7TAYE ","M39N7TAZE ","M39N7TDXSS", & - "M39N7TDYSS","M39N7TDZSS","M39N8FKXE ","M39N8FKYE ","M39N8FKZE ","M39N8FMXE ","M39N8FMYE ", & - "M39N8FMZE ","M39N8MKXE ","M39N8MKYE ","M39N8MKZE ","M39N8MMXE ","M39N8MMYE ","M39N8MMZE ", & - "M39N8RAXE ","M39N8RAYE ","M39N8RAZE ","M39N8RDXE ","M39N8RDYE ","M39N8RDZE ","M39N8TAXE ", & - "M39N8TAYE ","M39N8TAZE ","M39N8TDXSS","M39N8TDYSS","M39N8TDZSS","M39N9FKXE ","M39N9FKYE ", & - "M39N9FKZE ","M39N9FMXE ","M39N9FMYE ","M39N9FMZE ","M39N9MKXE ","M39N9MKYE ","M39N9MKZE ", & - "M39N9MMXE ","M39N9MMYE ","M39N9MMZE ","M39N9RAXE ","M39N9RAYE ","M39N9RAZE ","M39N9RDXE ", & - "M39N9RDYE ","M39N9RDZE ","M39N9TAXE ","M39N9TAYE ","M39N9TAZE ","M39N9TDXSS","M39N9TDYSS", & - "M39N9TDZSS","M40N1FKXE ","M40N1FKYE ","M40N1FKZE ","M40N1FMXE ","M40N1FMYE ","M40N1FMZE ", & - "M40N1MKXE ","M40N1MKYE ","M40N1MKZE ","M40N1MMXE ","M40N1MMYE ","M40N1MMZE ","M40N1RAXE ", & - "M40N1RAYE ","M40N1RAZE ","M40N1RDXE ","M40N1RDYE ","M40N1RDZE ","M40N1TAXE ","M40N1TAYE ", & - "M40N1TAZE ","M40N1TDXSS","M40N1TDYSS","M40N1TDZSS","M40N2FKXE ","M40N2FKYE ","M40N2FKZE ", & - "M40N2FMXE ","M40N2FMYE ","M40N2FMZE ","M40N2MKXE ","M40N2MKYE ","M40N2MKZE ","M40N2MMXE ", & - "M40N2MMYE ","M40N2MMZE ","M40N2RAXE ","M40N2RAYE ","M40N2RAZE ","M40N2RDXE ","M40N2RDYE ", & - "M40N2RDZE ","M40N2TAXE ","M40N2TAYE ","M40N2TAZE ","M40N2TDXSS","M40N2TDYSS","M40N2TDZSS", & - "M40N3FKXE ","M40N3FKYE ","M40N3FKZE ","M40N3FMXE ","M40N3FMYE ","M40N3FMZE ","M40N3MKXE ", & - "M40N3MKYE ","M40N3MKZE ","M40N3MMXE ","M40N3MMYE ","M40N3MMZE ","M40N3RAXE ","M40N3RAYE ", & - "M40N3RAZE ","M40N3RDXE ","M40N3RDYE ","M40N3RDZE ","M40N3TAXE ","M40N3TAYE ","M40N3TAZE ", & - "M40N3TDXSS","M40N3TDYSS","M40N3TDZSS","M40N4FKXE ","M40N4FKYE ","M40N4FKZE ","M40N4FMXE ", & - "M40N4FMYE ","M40N4FMZE ","M40N4MKXE ","M40N4MKYE ","M40N4MKZE ","M40N4MMXE ","M40N4MMYE ", & - "M40N4MMZE ","M40N4RAXE ","M40N4RAYE ","M40N4RAZE ","M40N4RDXE ","M40N4RDYE ","M40N4RDZE ", & - "M40N4TAXE ","M40N4TAYE ","M40N4TAZE ","M40N4TDXSS","M40N4TDYSS","M40N4TDZSS","M40N5FKXE ", & - "M40N5FKYE ","M40N5FKZE ","M40N5FMXE ","M40N5FMYE ","M40N5FMZE ","M40N5MKXE ","M40N5MKYE ", & - "M40N5MKZE ","M40N5MMXE ","M40N5MMYE ","M40N5MMZE ","M40N5RAXE ","M40N5RAYE ","M40N5RAZE ", & - "M40N5RDXE ","M40N5RDYE ","M40N5RDZE ","M40N5TAXE ","M40N5TAYE ","M40N5TAZE ","M40N5TDXSS", & - "M40N5TDYSS","M40N5TDZSS","M40N6FKXE ","M40N6FKYE ","M40N6FKZE ","M40N6FMXE ","M40N6FMYE ", & - "M40N6FMZE ","M40N6MKXE ","M40N6MKYE ","M40N6MKZE ","M40N6MMXE ","M40N6MMYE ","M40N6MMZE ", & - "M40N6RAXE ","M40N6RAYE ","M40N6RAZE ","M40N6RDXE ","M40N6RDYE ","M40N6RDZE ","M40N6TAXE ", & - "M40N6TAYE ","M40N6TAZE ","M40N6TDXSS","M40N6TDYSS","M40N6TDZSS","M40N7FKXE ","M40N7FKYE ", & - "M40N7FKZE ","M40N7FMXE ","M40N7FMYE ","M40N7FMZE ","M40N7MKXE ","M40N7MKYE ","M40N7MKZE ", & - "M40N7MMXE ","M40N7MMYE ","M40N7MMZE ","M40N7RAXE ","M40N7RAYE ","M40N7RAZE ","M40N7RDXE ", & - "M40N7RDYE ","M40N7RDZE ","M40N7TAXE ","M40N7TAYE ","M40N7TAZE ","M40N7TDXSS","M40N7TDYSS", & - "M40N7TDZSS","M40N8FKXE ","M40N8FKYE ","M40N8FKZE ","M40N8FMXE ","M40N8FMYE ","M40N8FMZE ", & - "M40N8MKXE ","M40N8MKYE ","M40N8MKZE ","M40N8MMXE ","M40N8MMYE ","M40N8MMZE ","M40N8RAXE ", & - "M40N8RAYE ","M40N8RAZE ","M40N8RDXE ","M40N8RDYE ","M40N8RDZE ","M40N8TAXE ","M40N8TAYE ", & - "M40N8TAZE ","M40N8TDXSS","M40N8TDYSS","M40N8TDZSS","M40N9FKXE ","M40N9FKYE ","M40N9FKZE ", & - "M40N9FMXE ","M40N9FMYE ","M40N9FMZE ","M40N9MKXE ","M40N9MKYE ","M40N9MKZE ","M40N9MMXE ", & - "M40N9MMYE ","M40N9MMZE ","M40N9RAXE ","M40N9RAYE ","M40N9RAZE ","M40N9RDXE ","M40N9RDYE ", & - "M40N9RDZE ","M40N9TAXE ","M40N9TAYE ","M40N9TAZE ","M40N9TDXSS","M40N9TDYSS","M40N9TDZSS", & - "M41N1FKXE ","M41N1FKYE ","M41N1FKZE ","M41N1FMXE ","M41N1FMYE ","M41N1FMZE ","M41N1MKXE ", & - "M41N1MKYE ","M41N1MKZE ","M41N1MMXE ","M41N1MMYE ","M41N1MMZE ","M41N1RAXE ","M41N1RAYE ", & - "M41N1RAZE ","M41N1RDXE ","M41N1RDYE ","M41N1RDZE ","M41N1TAXE ","M41N1TAYE ","M41N1TAZE ", & - "M41N1TDXSS","M41N1TDYSS","M41N1TDZSS","M41N2FKXE ","M41N2FKYE ","M41N2FKZE ","M41N2FMXE ", & - "M41N2FMYE ","M41N2FMZE ","M41N2MKXE ","M41N2MKYE ","M41N2MKZE ","M41N2MMXE ","M41N2MMYE ", & - "M41N2MMZE ","M41N2RAXE ","M41N2RAYE ","M41N2RAZE ","M41N2RDXE ","M41N2RDYE ","M41N2RDZE ", & - "M41N2TAXE ","M41N2TAYE ","M41N2TAZE ","M41N2TDXSS","M41N2TDYSS","M41N2TDZSS","M41N3FKXE ", & - "M41N3FKYE ","M41N3FKZE ","M41N3FMXE ","M41N3FMYE ","M41N3FMZE ","M41N3MKXE ","M41N3MKYE ", & - "M41N3MKZE ","M41N3MMXE ","M41N3MMYE ","M41N3MMZE ","M41N3RAXE ","M41N3RAYE ","M41N3RAZE ", & - "M41N3RDXE ","M41N3RDYE ","M41N3RDZE ","M41N3TAXE ","M41N3TAYE ","M41N3TAZE ","M41N3TDXSS", & - "M41N3TDYSS","M41N3TDZSS","M41N4FKXE ","M41N4FKYE ","M41N4FKZE ","M41N4FMXE ","M41N4FMYE ", & - "M41N4FMZE ","M41N4MKXE ","M41N4MKYE ","M41N4MKZE ","M41N4MMXE ","M41N4MMYE ","M41N4MMZE ", & - "M41N4RAXE ","M41N4RAYE ","M41N4RAZE ","M41N4RDXE ","M41N4RDYE ","M41N4RDZE ","M41N4TAXE ", & - "M41N4TAYE ","M41N4TAZE ","M41N4TDXSS","M41N4TDYSS","M41N4TDZSS","M41N5FKXE ","M41N5FKYE ", & - "M41N5FKZE ","M41N5FMXE ","M41N5FMYE ","M41N5FMZE ","M41N5MKXE ","M41N5MKYE ","M41N5MKZE ", & - "M41N5MMXE ","M41N5MMYE ","M41N5MMZE ","M41N5RAXE ","M41N5RAYE ","M41N5RAZE ","M41N5RDXE ", & - "M41N5RDYE ","M41N5RDZE ","M41N5TAXE ","M41N5TAYE ","M41N5TAZE ","M41N5TDXSS","M41N5TDYSS", & - "M41N5TDZSS","M41N6FKXE ","M41N6FKYE ","M41N6FKZE ","M41N6FMXE ","M41N6FMYE ","M41N6FMZE ", & - "M41N6MKXE ","M41N6MKYE ","M41N6MKZE ","M41N6MMXE ","M41N6MMYE ","M41N6MMZE ","M41N6RAXE ", & - "M41N6RAYE ","M41N6RAZE ","M41N6RDXE ","M41N6RDYE ","M41N6RDZE ","M41N6TAXE ","M41N6TAYE ", & - "M41N6TAZE ","M41N6TDXSS","M41N6TDYSS","M41N6TDZSS","M41N7FKXE ","M41N7FKYE ","M41N7FKZE ", & - "M41N7FMXE ","M41N7FMYE ","M41N7FMZE ","M41N7MKXE ","M41N7MKYE ","M41N7MKZE ","M41N7MMXE ", & - "M41N7MMYE ","M41N7MMZE ","M41N7RAXE ","M41N7RAYE ","M41N7RAZE ","M41N7RDXE ","M41N7RDYE ", & - "M41N7RDZE ","M41N7TAXE ","M41N7TAYE ","M41N7TAZE ","M41N7TDXSS","M41N7TDYSS","M41N7TDZSS", & - "M41N8FKXE ","M41N8FKYE ","M41N8FKZE ","M41N8FMXE ","M41N8FMYE ","M41N8FMZE ","M41N8MKXE ", & - "M41N8MKYE ","M41N8MKZE ","M41N8MMXE ","M41N8MMYE ","M41N8MMZE ","M41N8RAXE ","M41N8RAYE ", & - "M41N8RAZE ","M41N8RDXE ","M41N8RDYE ","M41N8RDZE ","M41N8TAXE ","M41N8TAYE ","M41N8TAZE ", & - "M41N8TDXSS","M41N8TDYSS","M41N8TDZSS","M41N9FKXE ","M41N9FKYE ","M41N9FKZE ","M41N9FMXE ", & - "M41N9FMYE ","M41N9FMZE ","M41N9MKXE ","M41N9MKYE ","M41N9MKZE ","M41N9MMXE ","M41N9MMYE ", & - "M41N9MMZE ","M41N9RAXE ","M41N9RAYE ","M41N9RAZE ","M41N9RDXE ","M41N9RDYE ","M41N9RDZE ", & - "M41N9TAXE ","M41N9TAYE ","M41N9TAZE ","M41N9TDXSS","M41N9TDYSS","M41N9TDZSS","M42N1FKXE ", & - "M42N1FKYE ","M42N1FKZE ","M42N1FMXE ","M42N1FMYE ","M42N1FMZE ","M42N1MKXE ","M42N1MKYE ", & - "M42N1MKZE ","M42N1MMXE ","M42N1MMYE ","M42N1MMZE ","M42N1RAXE ","M42N1RAYE ","M42N1RAZE ", & - "M42N1RDXE ","M42N1RDYE ","M42N1RDZE ","M42N1TAXE ","M42N1TAYE ","M42N1TAZE ","M42N1TDXSS", & - "M42N1TDYSS","M42N1TDZSS","M42N2FKXE ","M42N2FKYE ","M42N2FKZE ","M42N2FMXE ","M42N2FMYE ", & - "M42N2FMZE ","M42N2MKXE ","M42N2MKYE ","M42N2MKZE ","M42N2MMXE ","M42N2MMYE ","M42N2MMZE ", & - "M42N2RAXE ","M42N2RAYE ","M42N2RAZE ","M42N2RDXE ","M42N2RDYE ","M42N2RDZE ","M42N2TAXE ", & - "M42N2TAYE ","M42N2TAZE ","M42N2TDXSS","M42N2TDYSS","M42N2TDZSS","M42N3FKXE ","M42N3FKYE ", & - "M42N3FKZE ","M42N3FMXE ","M42N3FMYE ","M42N3FMZE ","M42N3MKXE ","M42N3MKYE ","M42N3MKZE ", & - "M42N3MMXE ","M42N3MMYE ","M42N3MMZE ","M42N3RAXE ","M42N3RAYE ","M42N3RAZE ","M42N3RDXE ", & - "M42N3RDYE ","M42N3RDZE ","M42N3TAXE ","M42N3TAYE ","M42N3TAZE ","M42N3TDXSS","M42N3TDYSS", & - "M42N3TDZSS","M42N4FKXE ","M42N4FKYE ","M42N4FKZE ","M42N4FMXE ","M42N4FMYE ","M42N4FMZE ", & - "M42N4MKXE ","M42N4MKYE ","M42N4MKZE ","M42N4MMXE ","M42N4MMYE ","M42N4MMZE ","M42N4RAXE ", & - "M42N4RAYE ","M42N4RAZE ","M42N4RDXE ","M42N4RDYE ","M42N4RDZE ","M42N4TAXE ","M42N4TAYE ", & - "M42N4TAZE ","M42N4TDXSS","M42N4TDYSS","M42N4TDZSS","M42N5FKXE ","M42N5FKYE ","M42N5FKZE ", & - "M42N5FMXE ","M42N5FMYE ","M42N5FMZE ","M42N5MKXE ","M42N5MKYE ","M42N5MKZE ","M42N5MMXE ", & - "M42N5MMYE ","M42N5MMZE ","M42N5RAXE ","M42N5RAYE ","M42N5RAZE ","M42N5RDXE ","M42N5RDYE ", & - "M42N5RDZE ","M42N5TAXE ","M42N5TAYE ","M42N5TAZE ","M42N5TDXSS","M42N5TDYSS","M42N5TDZSS", & - "M42N6FKXE ","M42N6FKYE ","M42N6FKZE ","M42N6FMXE ","M42N6FMYE ","M42N6FMZE ","M42N6MKXE ", & - "M42N6MKYE ","M42N6MKZE ","M42N6MMXE ","M42N6MMYE ","M42N6MMZE ","M42N6RAXE ","M42N6RAYE ", & - "M42N6RAZE ","M42N6RDXE ","M42N6RDYE ","M42N6RDZE ","M42N6TAXE ","M42N6TAYE ","M42N6TAZE ", & - "M42N6TDXSS","M42N6TDYSS","M42N6TDZSS","M42N7FKXE ","M42N7FKYE ","M42N7FKZE ","M42N7FMXE ", & - "M42N7FMYE ","M42N7FMZE ","M42N7MKXE ","M42N7MKYE ","M42N7MKZE ","M42N7MMXE ","M42N7MMYE ", & - "M42N7MMZE ","M42N7RAXE ","M42N7RAYE ","M42N7RAZE ","M42N7RDXE ","M42N7RDYE ","M42N7RDZE ", & - "M42N7TAXE ","M42N7TAYE ","M42N7TAZE ","M42N7TDXSS","M42N7TDYSS","M42N7TDZSS","M42N8FKXE ", & - "M42N8FKYE ","M42N8FKZE ","M42N8FMXE ","M42N8FMYE ","M42N8FMZE ","M42N8MKXE ","M42N8MKYE ", & - "M42N8MKZE ","M42N8MMXE ","M42N8MMYE ","M42N8MMZE ","M42N8RAXE ","M42N8RAYE ","M42N8RAZE ", & - "M42N8RDXE ","M42N8RDYE ","M42N8RDZE ","M42N8TAXE ","M42N8TAYE ","M42N8TAZE ","M42N8TDXSS", & - "M42N8TDYSS","M42N8TDZSS","M42N9FKXE ","M42N9FKYE ","M42N9FKZE ","M42N9FMXE ","M42N9FMYE ", & - "M42N9FMZE ","M42N9MKXE ","M42N9MKYE ","M42N9MKZE ","M42N9MMXE ","M42N9MMYE ","M42N9MMZE ", & - "M42N9RAXE ","M42N9RAYE ","M42N9RAZE ","M42N9RDXE ","M42N9RDYE ","M42N9RDZE ","M42N9TAXE ", & - "M42N9TAYE ","M42N9TAZE ","M42N9TDXSS","M42N9TDYSS","M42N9TDZSS","M43N1FKXE ","M43N1FKYE ", & - "M43N1FKZE ","M43N1FMXE ","M43N1FMYE ","M43N1FMZE ","M43N1MKXE ","M43N1MKYE ","M43N1MKZE ", & - "M43N1MMXE ","M43N1MMYE ","M43N1MMZE ","M43N1RAXE ","M43N1RAYE ","M43N1RAZE ","M43N1RDXE ", & - "M43N1RDYE ","M43N1RDZE ","M43N1TAXE ","M43N1TAYE ","M43N1TAZE ","M43N1TDXSS","M43N1TDYSS", & - "M43N1TDZSS","M43N2FKXE ","M43N2FKYE ","M43N2FKZE ","M43N2FMXE ","M43N2FMYE ","M43N2FMZE ", & - "M43N2MKXE ","M43N2MKYE ","M43N2MKZE ","M43N2MMXE ","M43N2MMYE ","M43N2MMZE ","M43N2RAXE ", & - "M43N2RAYE ","M43N2RAZE ","M43N2RDXE ","M43N2RDYE ","M43N2RDZE ","M43N2TAXE ","M43N2TAYE ", & - "M43N2TAZE ","M43N2TDXSS","M43N2TDYSS","M43N2TDZSS","M43N3FKXE ","M43N3FKYE ","M43N3FKZE ", & - "M43N3FMXE ","M43N3FMYE ","M43N3FMZE ","M43N3MKXE ","M43N3MKYE ","M43N3MKZE ","M43N3MMXE ", & - "M43N3MMYE ","M43N3MMZE ","M43N3RAXE ","M43N3RAYE ","M43N3RAZE ","M43N3RDXE ","M43N3RDYE ", & - "M43N3RDZE ","M43N3TAXE ","M43N3TAYE ","M43N3TAZE ","M43N3TDXSS","M43N3TDYSS","M43N3TDZSS", & - "M43N4FKXE ","M43N4FKYE ","M43N4FKZE ","M43N4FMXE ","M43N4FMYE ","M43N4FMZE ","M43N4MKXE ", & - "M43N4MKYE ","M43N4MKZE ","M43N4MMXE ","M43N4MMYE ","M43N4MMZE ","M43N4RAXE ","M43N4RAYE ", & - "M43N4RAZE ","M43N4RDXE ","M43N4RDYE ","M43N4RDZE ","M43N4TAXE ","M43N4TAYE ","M43N4TAZE ", & - "M43N4TDXSS","M43N4TDYSS","M43N4TDZSS","M43N5FKXE ","M43N5FKYE ","M43N5FKZE ","M43N5FMXE ", & - "M43N5FMYE ","M43N5FMZE ","M43N5MKXE ","M43N5MKYE ","M43N5MKZE ","M43N5MMXE ","M43N5MMYE ", & - "M43N5MMZE ","M43N5RAXE ","M43N5RAYE ","M43N5RAZE ","M43N5RDXE ","M43N5RDYE ","M43N5RDZE ", & - "M43N5TAXE ","M43N5TAYE ","M43N5TAZE ","M43N5TDXSS","M43N5TDYSS","M43N5TDZSS","M43N6FKXE ", & - "M43N6FKYE ","M43N6FKZE ","M43N6FMXE ","M43N6FMYE ","M43N6FMZE ","M43N6MKXE ","M43N6MKYE ", & - "M43N6MKZE ","M43N6MMXE ","M43N6MMYE ","M43N6MMZE ","M43N6RAXE ","M43N6RAYE ","M43N6RAZE ", & - "M43N6RDXE ","M43N6RDYE ","M43N6RDZE ","M43N6TAXE ","M43N6TAYE ","M43N6TAZE ","M43N6TDXSS", & - "M43N6TDYSS","M43N6TDZSS","M43N7FKXE ","M43N7FKYE ","M43N7FKZE ","M43N7FMXE ","M43N7FMYE ", & - "M43N7FMZE ","M43N7MKXE ","M43N7MKYE ","M43N7MKZE ","M43N7MMXE ","M43N7MMYE ","M43N7MMZE ", & - "M43N7RAXE ","M43N7RAYE ","M43N7RAZE ","M43N7RDXE ","M43N7RDYE ","M43N7RDZE ","M43N7TAXE ", & - "M43N7TAYE ","M43N7TAZE ","M43N7TDXSS","M43N7TDYSS","M43N7TDZSS","M43N8FKXE ","M43N8FKYE ", & - "M43N8FKZE ","M43N8FMXE ","M43N8FMYE ","M43N8FMZE ","M43N8MKXE ","M43N8MKYE ","M43N8MKZE ", & - "M43N8MMXE ","M43N8MMYE ","M43N8MMZE ","M43N8RAXE ","M43N8RAYE ","M43N8RAZE ","M43N8RDXE ", & - "M43N8RDYE ","M43N8RDZE ","M43N8TAXE ","M43N8TAYE ","M43N8TAZE ","M43N8TDXSS","M43N8TDYSS", & - "M43N8TDZSS","M43N9FKXE ","M43N9FKYE ","M43N9FKZE ","M43N9FMXE ","M43N9FMYE ","M43N9FMZE ", & - "M43N9MKXE ","M43N9MKYE ","M43N9MKZE ","M43N9MMXE ","M43N9MMYE ","M43N9MMZE ","M43N9RAXE ", & - "M43N9RAYE ","M43N9RAZE ","M43N9RDXE ","M43N9RDYE ","M43N9RDZE ","M43N9TAXE ","M43N9TAYE ", & - "M43N9TAZE ","M43N9TDXSS","M43N9TDYSS","M43N9TDZSS","M44N1FKXE ","M44N1FKYE ","M44N1FKZE ", & - "M44N1FMXE ","M44N1FMYE ","M44N1FMZE ","M44N1MKXE ","M44N1MKYE ","M44N1MKZE ","M44N1MMXE ", & - "M44N1MMYE ","M44N1MMZE ","M44N1RAXE ","M44N1RAYE ","M44N1RAZE ","M44N1RDXE ","M44N1RDYE ", & - "M44N1RDZE ","M44N1TAXE ","M44N1TAYE ","M44N1TAZE ","M44N1TDXSS","M44N1TDYSS","M44N1TDZSS", & - "M44N2FKXE ","M44N2FKYE ","M44N2FKZE ","M44N2FMXE ","M44N2FMYE ","M44N2FMZE ","M44N2MKXE ", & - "M44N2MKYE ","M44N2MKZE ","M44N2MMXE ","M44N2MMYE ","M44N2MMZE ","M44N2RAXE ","M44N2RAYE ", & - "M44N2RAZE ","M44N2RDXE ","M44N2RDYE ","M44N2RDZE ","M44N2TAXE ","M44N2TAYE ","M44N2TAZE ", & - "M44N2TDXSS","M44N2TDYSS","M44N2TDZSS","M44N3FKXE ","M44N3FKYE ","M44N3FKZE ","M44N3FMXE ", & - "M44N3FMYE ","M44N3FMZE ","M44N3MKXE ","M44N3MKYE ","M44N3MKZE ","M44N3MMXE ","M44N3MMYE ", & - "M44N3MMZE ","M44N3RAXE ","M44N3RAYE ","M44N3RAZE ","M44N3RDXE ","M44N3RDYE ","M44N3RDZE ", & - "M44N3TAXE ","M44N3TAYE ","M44N3TAZE ","M44N3TDXSS","M44N3TDYSS","M44N3TDZSS","M44N4FKXE ", & - "M44N4FKYE ","M44N4FKZE ","M44N4FMXE ","M44N4FMYE ","M44N4FMZE ","M44N4MKXE ","M44N4MKYE ", & - "M44N4MKZE ","M44N4MMXE ","M44N4MMYE ","M44N4MMZE ","M44N4RAXE ","M44N4RAYE ","M44N4RAZE ", & - "M44N4RDXE ","M44N4RDYE ","M44N4RDZE ","M44N4TAXE ","M44N4TAYE ","M44N4TAZE ","M44N4TDXSS", & - "M44N4TDYSS","M44N4TDZSS","M44N5FKXE ","M44N5FKYE ","M44N5FKZE ","M44N5FMXE ","M44N5FMYE ", & - "M44N5FMZE ","M44N5MKXE ","M44N5MKYE ","M44N5MKZE ","M44N5MMXE ","M44N5MMYE ","M44N5MMZE ", & - "M44N5RAXE ","M44N5RAYE ","M44N5RAZE ","M44N5RDXE ","M44N5RDYE ","M44N5RDZE ","M44N5TAXE ", & - "M44N5TAYE ","M44N5TAZE ","M44N5TDXSS","M44N5TDYSS","M44N5TDZSS","M44N6FKXE ","M44N6FKYE ", & - "M44N6FKZE ","M44N6FMXE ","M44N6FMYE ","M44N6FMZE ","M44N6MKXE ","M44N6MKYE ","M44N6MKZE ", & - "M44N6MMXE ","M44N6MMYE ","M44N6MMZE ","M44N6RAXE ","M44N6RAYE ","M44N6RAZE ","M44N6RDXE ", & - "M44N6RDYE ","M44N6RDZE ","M44N6TAXE ","M44N6TAYE ","M44N6TAZE ","M44N6TDXSS","M44N6TDYSS", & - "M44N6TDZSS","M44N7FKXE ","M44N7FKYE ","M44N7FKZE ","M44N7FMXE ","M44N7FMYE ","M44N7FMZE ", & - "M44N7MKXE ","M44N7MKYE ","M44N7MKZE ","M44N7MMXE ","M44N7MMYE ","M44N7MMZE ","M44N7RAXE ", & - "M44N7RAYE ","M44N7RAZE ","M44N7RDXE ","M44N7RDYE ","M44N7RDZE ","M44N7TAXE ","M44N7TAYE ", & - "M44N7TAZE ","M44N7TDXSS","M44N7TDYSS","M44N7TDZSS","M44N8FKXE ","M44N8FKYE ","M44N8FKZE ", & - "M44N8FMXE ","M44N8FMYE ","M44N8FMZE ","M44N8MKXE ","M44N8MKYE ","M44N8MKZE ","M44N8MMXE ", & - "M44N8MMYE ","M44N8MMZE ","M44N8RAXE ","M44N8RAYE ","M44N8RAZE ","M44N8RDXE ","M44N8RDYE ", & - "M44N8RDZE ","M44N8TAXE ","M44N8TAYE ","M44N8TAZE ","M44N8TDXSS","M44N8TDYSS","M44N8TDZSS", & - "M44N9FKXE ","M44N9FKYE ","M44N9FKZE ","M44N9FMXE ","M44N9FMYE ","M44N9FMZE ","M44N9MKXE ", & - "M44N9MKYE ","M44N9MKZE ","M44N9MMXE ","M44N9MMYE ","M44N9MMZE ","M44N9RAXE ","M44N9RAYE ", & - "M44N9RAZE ","M44N9RDXE ","M44N9RDYE ","M44N9RDZE ","M44N9TAXE ","M44N9TAYE ","M44N9TAZE ", & - "M44N9TDXSS","M44N9TDYSS","M44N9TDZSS","M45N1FKXE ","M45N1FKYE ","M45N1FKZE ","M45N1FMXE ", & - "M45N1FMYE ","M45N1FMZE ","M45N1MKXE ","M45N1MKYE ","M45N1MKZE ","M45N1MMXE ","M45N1MMYE ", & - "M45N1MMZE ","M45N1RAXE ","M45N1RAYE ","M45N1RAZE ","M45N1RDXE ","M45N1RDYE ","M45N1RDZE ", & - "M45N1TAXE ","M45N1TAYE ","M45N1TAZE ","M45N1TDXSS","M45N1TDYSS","M45N1TDZSS","M45N2FKXE ", & - "M45N2FKYE ","M45N2FKZE ","M45N2FMXE ","M45N2FMYE ","M45N2FMZE ","M45N2MKXE ","M45N2MKYE ", & - "M45N2MKZE ","M45N2MMXE ","M45N2MMYE ","M45N2MMZE ","M45N2RAXE ","M45N2RAYE ","M45N2RAZE ", & - "M45N2RDXE ","M45N2RDYE ","M45N2RDZE ","M45N2TAXE ","M45N2TAYE ","M45N2TAZE ","M45N2TDXSS", & - "M45N2TDYSS","M45N2TDZSS","M45N3FKXE ","M45N3FKYE ","M45N3FKZE ","M45N3FMXE ","M45N3FMYE ", & - "M45N3FMZE ","M45N3MKXE ","M45N3MKYE ","M45N3MKZE ","M45N3MMXE ","M45N3MMYE ","M45N3MMZE ", & - "M45N3RAXE ","M45N3RAYE ","M45N3RAZE ","M45N3RDXE ","M45N3RDYE ","M45N3RDZE ","M45N3TAXE ", & - "M45N3TAYE ","M45N3TAZE ","M45N3TDXSS","M45N3TDYSS","M45N3TDZSS","M45N4FKXE ","M45N4FKYE ", & - "M45N4FKZE ","M45N4FMXE ","M45N4FMYE ","M45N4FMZE ","M45N4MKXE ","M45N4MKYE ","M45N4MKZE ", & - "M45N4MMXE ","M45N4MMYE ","M45N4MMZE ","M45N4RAXE ","M45N4RAYE ","M45N4RAZE ","M45N4RDXE ", & - "M45N4RDYE ","M45N4RDZE ","M45N4TAXE ","M45N4TAYE ","M45N4TAZE ","M45N4TDXSS","M45N4TDYSS", & - "M45N4TDZSS","M45N5FKXE ","M45N5FKYE ","M45N5FKZE ","M45N5FMXE ","M45N5FMYE ","M45N5FMZE ", & - "M45N5MKXE ","M45N5MKYE ","M45N5MKZE ","M45N5MMXE ","M45N5MMYE ","M45N5MMZE ","M45N5RAXE ", & - "M45N5RAYE ","M45N5RAZE ","M45N5RDXE ","M45N5RDYE ","M45N5RDZE ","M45N5TAXE ","M45N5TAYE ", & - "M45N5TAZE ","M45N5TDXSS","M45N5TDYSS","M45N5TDZSS","M45N6FKXE ","M45N6FKYE ","M45N6FKZE ", & - "M45N6FMXE ","M45N6FMYE ","M45N6FMZE ","M45N6MKXE ","M45N6MKYE ","M45N6MKZE ","M45N6MMXE ", & - "M45N6MMYE ","M45N6MMZE ","M45N6RAXE ","M45N6RAYE ","M45N6RAZE ","M45N6RDXE ","M45N6RDYE ", & - "M45N6RDZE ","M45N6TAXE ","M45N6TAYE ","M45N6TAZE ","M45N6TDXSS","M45N6TDYSS","M45N6TDZSS", & - "M45N7FKXE ","M45N7FKYE ","M45N7FKZE ","M45N7FMXE ","M45N7FMYE ","M45N7FMZE ","M45N7MKXE ", & - "M45N7MKYE ","M45N7MKZE ","M45N7MMXE ","M45N7MMYE ","M45N7MMZE ","M45N7RAXE ","M45N7RAYE ", & - "M45N7RAZE ","M45N7RDXE ","M45N7RDYE ","M45N7RDZE ","M45N7TAXE ","M45N7TAYE ","M45N7TAZE ", & - "M45N7TDXSS","M45N7TDYSS","M45N7TDZSS","M45N8FKXE ","M45N8FKYE ","M45N8FKZE ","M45N8FMXE ", & - "M45N8FMYE ","M45N8FMZE ","M45N8MKXE ","M45N8MKYE ","M45N8MKZE ","M45N8MMXE ","M45N8MMYE ", & - "M45N8MMZE ","M45N8RAXE ","M45N8RAYE ","M45N8RAZE ","M45N8RDXE ","M45N8RDYE ","M45N8RDZE ", & - "M45N8TAXE ","M45N8TAYE ","M45N8TAZE ","M45N8TDXSS","M45N8TDYSS","M45N8TDZSS","M45N9FKXE ", & - "M45N9FKYE ","M45N9FKZE ","M45N9FMXE ","M45N9FMYE ","M45N9FMZE ","M45N9MKXE ","M45N9MKYE ", & - "M45N9MKZE ","M45N9MMXE ","M45N9MMYE ","M45N9MMZE ","M45N9RAXE ","M45N9RAYE ","M45N9RAZE ", & - "M45N9RDXE ","M45N9RDYE ","M45N9RDZE ","M45N9TAXE ","M45N9TAYE ","M45N9TAZE ","M45N9TDXSS", & - "M45N9TDYSS","M45N9TDZSS","M46N1FKXE ","M46N1FKYE ","M46N1FKZE ","M46N1FMXE ","M46N1FMYE ", & - "M46N1FMZE ","M46N1MKXE ","M46N1MKYE ","M46N1MKZE ","M46N1MMXE ","M46N1MMYE ","M46N1MMZE ", & - "M46N1RAXE ","M46N1RAYE ","M46N1RAZE ","M46N1RDXE ","M46N1RDYE ","M46N1RDZE ","M46N1TAXE ", & - "M46N1TAYE ","M46N1TAZE ","M46N1TDXSS","M46N1TDYSS","M46N1TDZSS","M46N2FKXE ","M46N2FKYE ", & - "M46N2FKZE ","M46N2FMXE ","M46N2FMYE ","M46N2FMZE ","M46N2MKXE ","M46N2MKYE ","M46N2MKZE ", & - "M46N2MMXE ","M46N2MMYE ","M46N2MMZE ","M46N2RAXE ","M46N2RAYE ","M46N2RAZE ","M46N2RDXE ", & - "M46N2RDYE ","M46N2RDZE ","M46N2TAXE ","M46N2TAYE ","M46N2TAZE ","M46N2TDXSS","M46N2TDYSS", & - "M46N2TDZSS","M46N3FKXE ","M46N3FKYE ","M46N3FKZE ","M46N3FMXE ","M46N3FMYE ","M46N3FMZE ", & - "M46N3MKXE ","M46N3MKYE ","M46N3MKZE ","M46N3MMXE ","M46N3MMYE ","M46N3MMZE ","M46N3RAXE ", & - "M46N3RAYE ","M46N3RAZE ","M46N3RDXE ","M46N3RDYE ","M46N3RDZE ","M46N3TAXE ","M46N3TAYE ", & - "M46N3TAZE ","M46N3TDXSS","M46N3TDYSS","M46N3TDZSS","M46N4FKXE ","M46N4FKYE ","M46N4FKZE ", & - "M46N4FMXE ","M46N4FMYE ","M46N4FMZE ","M46N4MKXE ","M46N4MKYE ","M46N4MKZE ","M46N4MMXE ", & - "M46N4MMYE ","M46N4MMZE ","M46N4RAXE ","M46N4RAYE ","M46N4RAZE ","M46N4RDXE ","M46N4RDYE ", & - "M46N4RDZE ","M46N4TAXE ","M46N4TAYE ","M46N4TAZE ","M46N4TDXSS","M46N4TDYSS","M46N4TDZSS", & - "M46N5FKXE ","M46N5FKYE ","M46N5FKZE ","M46N5FMXE ","M46N5FMYE ","M46N5FMZE ","M46N5MKXE ", & - "M46N5MKYE ","M46N5MKZE ","M46N5MMXE ","M46N5MMYE ","M46N5MMZE ","M46N5RAXE ","M46N5RAYE ", & - "M46N5RAZE ","M46N5RDXE ","M46N5RDYE ","M46N5RDZE ","M46N5TAXE ","M46N5TAYE ","M46N5TAZE ", & - "M46N5TDXSS","M46N5TDYSS","M46N5TDZSS","M46N6FKXE ","M46N6FKYE ","M46N6FKZE ","M46N6FMXE ", & - "M46N6FMYE ","M46N6FMZE ","M46N6MKXE ","M46N6MKYE ","M46N6MKZE ","M46N6MMXE ","M46N6MMYE ", & - "M46N6MMZE ","M46N6RAXE ","M46N6RAYE ","M46N6RAZE ","M46N6RDXE ","M46N6RDYE ","M46N6RDZE ", & - "M46N6TAXE ","M46N6TAYE ","M46N6TAZE ","M46N6TDXSS","M46N6TDYSS","M46N6TDZSS","M46N7FKXE ", & - "M46N7FKYE ","M46N7FKZE ","M46N7FMXE ","M46N7FMYE ","M46N7FMZE ","M46N7MKXE ","M46N7MKYE ", & - "M46N7MKZE ","M46N7MMXE ","M46N7MMYE ","M46N7MMZE ","M46N7RAXE ","M46N7RAYE ","M46N7RAZE ", & - "M46N7RDXE ","M46N7RDYE ","M46N7RDZE ","M46N7TAXE ","M46N7TAYE ","M46N7TAZE ","M46N7TDXSS", & - "M46N7TDYSS","M46N7TDZSS","M46N8FKXE ","M46N8FKYE ","M46N8FKZE ","M46N8FMXE ","M46N8FMYE ", & - "M46N8FMZE ","M46N8MKXE ","M46N8MKYE ","M46N8MKZE ","M46N8MMXE ","M46N8MMYE ","M46N8MMZE ", & - "M46N8RAXE ","M46N8RAYE ","M46N8RAZE ","M46N8RDXE ","M46N8RDYE ","M46N8RDZE ","M46N8TAXE ", & - "M46N8TAYE ","M46N8TAZE ","M46N8TDXSS","M46N8TDYSS","M46N8TDZSS","M46N9FKXE ","M46N9FKYE ", & - "M46N9FKZE ","M46N9FMXE ","M46N9FMYE ","M46N9FMZE ","M46N9MKXE ","M46N9MKYE ","M46N9MKZE ", & - "M46N9MMXE ","M46N9MMYE ","M46N9MMZE ","M46N9RAXE ","M46N9RAYE ","M46N9RAZE ","M46N9RDXE ", & - "M46N9RDYE ","M46N9RDZE ","M46N9TAXE ","M46N9TAYE ","M46N9TAZE ","M46N9TDXSS","M46N9TDYSS", & - "M46N9TDZSS","M47N1FKXE ","M47N1FKYE ","M47N1FKZE ","M47N1FMXE ","M47N1FMYE ","M47N1FMZE ", & - "M47N1MKXE ","M47N1MKYE ","M47N1MKZE ","M47N1MMXE ","M47N1MMYE ","M47N1MMZE ","M47N1RAXE ", & - "M47N1RAYE ","M47N1RAZE ","M47N1RDXE ","M47N1RDYE ","M47N1RDZE ","M47N1TAXE ","M47N1TAYE ", & - "M47N1TAZE ","M47N1TDXSS","M47N1TDYSS","M47N1TDZSS","M47N2FKXE ","M47N2FKYE ","M47N2FKZE ", & - "M47N2FMXE ","M47N2FMYE ","M47N2FMZE ","M47N2MKXE ","M47N2MKYE ","M47N2MKZE ","M47N2MMXE ", & - "M47N2MMYE ","M47N2MMZE ","M47N2RAXE ","M47N2RAYE ","M47N2RAZE ","M47N2RDXE ","M47N2RDYE ", & - "M47N2RDZE ","M47N2TAXE ","M47N2TAYE ","M47N2TAZE ","M47N2TDXSS","M47N2TDYSS","M47N2TDZSS", & - "M47N3FKXE ","M47N3FKYE ","M47N3FKZE ","M47N3FMXE ","M47N3FMYE ","M47N3FMZE ","M47N3MKXE ", & - "M47N3MKYE ","M47N3MKZE ","M47N3MMXE ","M47N3MMYE ","M47N3MMZE ","M47N3RAXE ","M47N3RAYE ", & - "M47N3RAZE ","M47N3RDXE ","M47N3RDYE ","M47N3RDZE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry7(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M47N3TAXE ","M47N3TAYE ","M47N3TAZE ","M47N3TDXSS","M47N3TDYSS","M47N3TDZSS","M47N4FKXE ", & - "M47N4FKYE ","M47N4FKZE ","M47N4FMXE ","M47N4FMYE ","M47N4FMZE ","M47N4MKXE ","M47N4MKYE ", & - "M47N4MKZE ","M47N4MMXE ","M47N4MMYE ","M47N4MMZE ","M47N4RAXE ","M47N4RAYE ","M47N4RAZE ", & - "M47N4RDXE ","M47N4RDYE ","M47N4RDZE ","M47N4TAXE ","M47N4TAYE ","M47N4TAZE ","M47N4TDXSS", & - "M47N4TDYSS","M47N4TDZSS","M47N5FKXE ","M47N5FKYE ","M47N5FKZE ","M47N5FMXE ","M47N5FMYE ", & - "M47N5FMZE ","M47N5MKXE ","M47N5MKYE ","M47N5MKZE ","M47N5MMXE ","M47N5MMYE ","M47N5MMZE ", & - "M47N5RAXE ","M47N5RAYE ","M47N5RAZE ","M47N5RDXE ","M47N5RDYE ","M47N5RDZE ","M47N5TAXE ", & - "M47N5TAYE ","M47N5TAZE ","M47N5TDXSS","M47N5TDYSS","M47N5TDZSS","M47N6FKXE ","M47N6FKYE ", & - "M47N6FKZE ","M47N6FMXE ","M47N6FMYE ","M47N6FMZE ","M47N6MKXE ","M47N6MKYE ","M47N6MKZE ", & - "M47N6MMXE ","M47N6MMYE ","M47N6MMZE ","M47N6RAXE ","M47N6RAYE ","M47N6RAZE ","M47N6RDXE ", & - "M47N6RDYE ","M47N6RDZE ","M47N6TAXE ","M47N6TAYE ","M47N6TAZE ","M47N6TDXSS","M47N6TDYSS", & - "M47N6TDZSS","M47N7FKXE ","M47N7FKYE ","M47N7FKZE ","M47N7FMXE ","M47N7FMYE ","M47N7FMZE ", & - "M47N7MKXE ","M47N7MKYE ","M47N7MKZE ","M47N7MMXE ","M47N7MMYE ","M47N7MMZE ","M47N7RAXE ", & - "M47N7RAYE ","M47N7RAZE ","M47N7RDXE ","M47N7RDYE ","M47N7RDZE ","M47N7TAXE ","M47N7TAYE ", & - "M47N7TAZE ","M47N7TDXSS","M47N7TDYSS","M47N7TDZSS","M47N8FKXE ","M47N8FKYE ","M47N8FKZE ", & - "M47N8FMXE ","M47N8FMYE ","M47N8FMZE ","M47N8MKXE ","M47N8MKYE ","M47N8MKZE ","M47N8MMXE ", & - "M47N8MMYE ","M47N8MMZE ","M47N8RAXE ","M47N8RAYE ","M47N8RAZE ","M47N8RDXE ","M47N8RDYE ", & - "M47N8RDZE ","M47N8TAXE ","M47N8TAYE ","M47N8TAZE ","M47N8TDXSS","M47N8TDYSS","M47N8TDZSS", & - "M47N9FKXE ","M47N9FKYE ","M47N9FKZE ","M47N9FMXE ","M47N9FMYE ","M47N9FMZE ","M47N9MKXE ", & - "M47N9MKYE ","M47N9MKZE ","M47N9MMXE ","M47N9MMYE ","M47N9MMZE ","M47N9RAXE ","M47N9RAYE ", & - "M47N9RAZE ","M47N9RDXE ","M47N9RDYE ","M47N9RDZE ","M47N9TAXE ","M47N9TAYE ","M47N9TAZE ", & - "M47N9TDXSS","M47N9TDYSS","M47N9TDZSS","M48N1FKXE ","M48N1FKYE ","M48N1FKZE ","M48N1FMXE ", & - "M48N1FMYE ","M48N1FMZE ","M48N1MKXE ","M48N1MKYE ","M48N1MKZE ","M48N1MMXE ","M48N1MMYE ", & - "M48N1MMZE ","M48N1RAXE ","M48N1RAYE ","M48N1RAZE ","M48N1RDXE ","M48N1RDYE ","M48N1RDZE ", & - "M48N1TAXE ","M48N1TAYE ","M48N1TAZE ","M48N1TDXSS","M48N1TDYSS","M48N1TDZSS","M48N2FKXE ", & - "M48N2FKYE ","M48N2FKZE ","M48N2FMXE ","M48N2FMYE ","M48N2FMZE ","M48N2MKXE ","M48N2MKYE ", & - "M48N2MKZE ","M48N2MMXE ","M48N2MMYE ","M48N2MMZE ","M48N2RAXE ","M48N2RAYE ","M48N2RAZE ", & - "M48N2RDXE ","M48N2RDYE ","M48N2RDZE ","M48N2TAXE ","M48N2TAYE ","M48N2TAZE ","M48N2TDXSS", & - "M48N2TDYSS","M48N2TDZSS","M48N3FKXE ","M48N3FKYE ","M48N3FKZE ","M48N3FMXE ","M48N3FMYE ", & - "M48N3FMZE ","M48N3MKXE ","M48N3MKYE ","M48N3MKZE ","M48N3MMXE ","M48N3MMYE ","M48N3MMZE ", & - "M48N3RAXE ","M48N3RAYE ","M48N3RAZE ","M48N3RDXE ","M48N3RDYE ","M48N3RDZE ","M48N3TAXE ", & - "M48N3TAYE ","M48N3TAZE ","M48N3TDXSS","M48N3TDYSS","M48N3TDZSS","M48N4FKXE ","M48N4FKYE ", & - "M48N4FKZE ","M48N4FMXE ","M48N4FMYE ","M48N4FMZE ","M48N4MKXE ","M48N4MKYE ","M48N4MKZE ", & - "M48N4MMXE ","M48N4MMYE ","M48N4MMZE ","M48N4RAXE ","M48N4RAYE ","M48N4RAZE ","M48N4RDXE ", & - "M48N4RDYE ","M48N4RDZE ","M48N4TAXE ","M48N4TAYE ","M48N4TAZE ","M48N4TDXSS","M48N4TDYSS", & - "M48N4TDZSS","M48N5FKXE ","M48N5FKYE ","M48N5FKZE ","M48N5FMXE ","M48N5FMYE ","M48N5FMZE ", & - "M48N5MKXE ","M48N5MKYE ","M48N5MKZE ","M48N5MMXE ","M48N5MMYE ","M48N5MMZE ","M48N5RAXE ", & - "M48N5RAYE ","M48N5RAZE ","M48N5RDXE ","M48N5RDYE ","M48N5RDZE ","M48N5TAXE ","M48N5TAYE ", & - "M48N5TAZE ","M48N5TDXSS","M48N5TDYSS","M48N5TDZSS","M48N6FKXE ","M48N6FKYE ","M48N6FKZE ", & - "M48N6FMXE ","M48N6FMYE ","M48N6FMZE ","M48N6MKXE ","M48N6MKYE ","M48N6MKZE ","M48N6MMXE ", & - "M48N6MMYE ","M48N6MMZE ","M48N6RAXE ","M48N6RAYE ","M48N6RAZE ","M48N6RDXE ","M48N6RDYE ", & - "M48N6RDZE ","M48N6TAXE ","M48N6TAYE ","M48N6TAZE ","M48N6TDXSS","M48N6TDYSS","M48N6TDZSS", & - "M48N7FKXE ","M48N7FKYE ","M48N7FKZE ","M48N7FMXE ","M48N7FMYE ","M48N7FMZE ","M48N7MKXE ", & - "M48N7MKYE ","M48N7MKZE ","M48N7MMXE ","M48N7MMYE ","M48N7MMZE ","M48N7RAXE ","M48N7RAYE ", & - "M48N7RAZE ","M48N7RDXE ","M48N7RDYE ","M48N7RDZE ","M48N7TAXE ","M48N7TAYE ","M48N7TAZE ", & - "M48N7TDXSS","M48N7TDYSS","M48N7TDZSS","M48N8FKXE ","M48N8FKYE ","M48N8FKZE ","M48N8FMXE ", & - "M48N8FMYE ","M48N8FMZE ","M48N8MKXE ","M48N8MKYE ","M48N8MKZE ","M48N8MMXE ","M48N8MMYE ", & - "M48N8MMZE ","M48N8RAXE ","M48N8RAYE ","M48N8RAZE ","M48N8RDXE ","M48N8RDYE ","M48N8RDZE ", & - "M48N8TAXE ","M48N8TAYE ","M48N8TAZE ","M48N8TDXSS","M48N8TDYSS","M48N8TDZSS","M48N9FKXE ", & - "M48N9FKYE ","M48N9FKZE ","M48N9FMXE ","M48N9FMYE ","M48N9FMZE ","M48N9MKXE ","M48N9MKYE ", & - "M48N9MKZE ","M48N9MMXE ","M48N9MMYE ","M48N9MMZE ","M48N9RAXE ","M48N9RAYE ","M48N9RAZE ", & - "M48N9RDXE ","M48N9RDYE ","M48N9RDZE ","M48N9TAXE ","M48N9TAYE ","M48N9TAZE ","M48N9TDXSS", & - "M48N9TDYSS","M48N9TDZSS","M49N1FKXE ","M49N1FKYE ","M49N1FKZE ","M49N1FMXE ","M49N1FMYE ", & - "M49N1FMZE ","M49N1MKXE ","M49N1MKYE ","M49N1MKZE ","M49N1MMXE ","M49N1MMYE ","M49N1MMZE ", & - "M49N1RAXE ","M49N1RAYE ","M49N1RAZE ","M49N1RDXE ","M49N1RDYE ","M49N1RDZE ","M49N1TAXE ", & - "M49N1TAYE ","M49N1TAZE ","M49N1TDXSS","M49N1TDYSS","M49N1TDZSS","M49N2FKXE ","M49N2FKYE ", & - "M49N2FKZE ","M49N2FMXE ","M49N2FMYE ","M49N2FMZE ","M49N2MKXE ","M49N2MKYE ","M49N2MKZE ", & - "M49N2MMXE ","M49N2MMYE ","M49N2MMZE ","M49N2RAXE ","M49N2RAYE ","M49N2RAZE ","M49N2RDXE ", & - "M49N2RDYE ","M49N2RDZE ","M49N2TAXE ","M49N2TAYE ","M49N2TAZE ","M49N2TDXSS","M49N2TDYSS", & - "M49N2TDZSS","M49N3FKXE ","M49N3FKYE ","M49N3FKZE ","M49N3FMXE ","M49N3FMYE ","M49N3FMZE ", & - "M49N3MKXE ","M49N3MKYE ","M49N3MKZE ","M49N3MMXE ","M49N3MMYE ","M49N3MMZE ","M49N3RAXE ", & - "M49N3RAYE ","M49N3RAZE ","M49N3RDXE ","M49N3RDYE ","M49N3RDZE ","M49N3TAXE ","M49N3TAYE ", & - "M49N3TAZE ","M49N3TDXSS","M49N3TDYSS","M49N3TDZSS","M49N4FKXE ","M49N4FKYE ","M49N4FKZE ", & - "M49N4FMXE ","M49N4FMYE ","M49N4FMZE ","M49N4MKXE ","M49N4MKYE ","M49N4MKZE ","M49N4MMXE ", & - "M49N4MMYE ","M49N4MMZE ","M49N4RAXE ","M49N4RAYE ","M49N4RAZE ","M49N4RDXE ","M49N4RDYE ", & - "M49N4RDZE ","M49N4TAXE ","M49N4TAYE ","M49N4TAZE ","M49N4TDXSS","M49N4TDYSS","M49N4TDZSS", & - "M49N5FKXE ","M49N5FKYE ","M49N5FKZE ","M49N5FMXE ","M49N5FMYE ","M49N5FMZE ","M49N5MKXE ", & - "M49N5MKYE ","M49N5MKZE ","M49N5MMXE ","M49N5MMYE ","M49N5MMZE ","M49N5RAXE ","M49N5RAYE ", & - "M49N5RAZE ","M49N5RDXE ","M49N5RDYE ","M49N5RDZE ","M49N5TAXE ","M49N5TAYE ","M49N5TAZE ", & - "M49N5TDXSS","M49N5TDYSS","M49N5TDZSS","M49N6FKXE ","M49N6FKYE ","M49N6FKZE ","M49N6FMXE ", & - "M49N6FMYE ","M49N6FMZE ","M49N6MKXE ","M49N6MKYE ","M49N6MKZE ","M49N6MMXE ","M49N6MMYE ", & - "M49N6MMZE ","M49N6RAXE ","M49N6RAYE ","M49N6RAZE ","M49N6RDXE ","M49N6RDYE ","M49N6RDZE ", & - "M49N6TAXE ","M49N6TAYE ","M49N6TAZE ","M49N6TDXSS","M49N6TDYSS","M49N6TDZSS","M49N7FKXE ", & - "M49N7FKYE ","M49N7FKZE ","M49N7FMXE ","M49N7FMYE ","M49N7FMZE ","M49N7MKXE ","M49N7MKYE ", & - "M49N7MKZE ","M49N7MMXE ","M49N7MMYE ","M49N7MMZE ","M49N7RAXE ","M49N7RAYE ","M49N7RAZE ", & - "M49N7RDXE ","M49N7RDYE ","M49N7RDZE ","M49N7TAXE ","M49N7TAYE ","M49N7TAZE ","M49N7TDXSS", & - "M49N7TDYSS","M49N7TDZSS","M49N8FKXE ","M49N8FKYE ","M49N8FKZE ","M49N8FMXE ","M49N8FMYE ", & - "M49N8FMZE ","M49N8MKXE ","M49N8MKYE ","M49N8MKZE ","M49N8MMXE ","M49N8MMYE ","M49N8MMZE ", & - "M49N8RAXE ","M49N8RAYE ","M49N8RAZE ","M49N8RDXE ","M49N8RDYE ","M49N8RDZE ","M49N8TAXE ", & - "M49N8TAYE ","M49N8TAZE ","M49N8TDXSS","M49N8TDYSS","M49N8TDZSS","M49N9FKXE ","M49N9FKYE ", & - "M49N9FKZE ","M49N9FMXE ","M49N9FMYE ","M49N9FMZE ","M49N9MKXE ","M49N9MKYE ","M49N9MKZE ", & - "M49N9MMXE ","M49N9MMYE ","M49N9MMZE ","M49N9RAXE ","M49N9RAYE ","M49N9RAZE ","M49N9RDXE ", & - "M49N9RDYE ","M49N9RDZE ","M49N9TAXE ","M49N9TAYE ","M49N9TAZE ","M49N9TDXSS","M49N9TDYSS", & - "M49N9TDZSS","M50N1FKXE ","M50N1FKYE ","M50N1FKZE ","M50N1FMXE ","M50N1FMYE ","M50N1FMZE ", & - "M50N1MKXE ","M50N1MKYE ","M50N1MKZE ","M50N1MMXE ","M50N1MMYE ","M50N1MMZE ","M50N1RAXE ", & - "M50N1RAYE ","M50N1RAZE ","M50N1RDXE ","M50N1RDYE ","M50N1RDZE ","M50N1TAXE ","M50N1TAYE ", & - "M50N1TAZE ","M50N1TDXSS","M50N1TDYSS","M50N1TDZSS","M50N2FKXE ","M50N2FKYE ","M50N2FKZE ", & - "M50N2FMXE ","M50N2FMYE ","M50N2FMZE ","M50N2MKXE ","M50N2MKYE ","M50N2MKZE ","M50N2MMXE ", & - "M50N2MMYE ","M50N2MMZE ","M50N2RAXE ","M50N2RAYE ","M50N2RAZE ","M50N2RDXE ","M50N2RDYE ", & - "M50N2RDZE ","M50N2TAXE ","M50N2TAYE ","M50N2TAZE ","M50N2TDXSS","M50N2TDYSS","M50N2TDZSS", & - "M50N3FKXE ","M50N3FKYE ","M50N3FKZE ","M50N3FMXE ","M50N3FMYE ","M50N3FMZE ","M50N3MKXE ", & - "M50N3MKYE ","M50N3MKZE ","M50N3MMXE ","M50N3MMYE ","M50N3MMZE ","M50N3RAXE ","M50N3RAYE ", & - "M50N3RAZE ","M50N3RDXE ","M50N3RDYE ","M50N3RDZE ","M50N3TAXE ","M50N3TAYE ","M50N3TAZE ", & - "M50N3TDXSS","M50N3TDYSS","M50N3TDZSS","M50N4FKXE ","M50N4FKYE ","M50N4FKZE ","M50N4FMXE ", & - "M50N4FMYE ","M50N4FMZE ","M50N4MKXE ","M50N4MKYE ","M50N4MKZE ","M50N4MMXE ","M50N4MMYE ", & - "M50N4MMZE ","M50N4RAXE ","M50N4RAYE ","M50N4RAZE ","M50N4RDXE ","M50N4RDYE ","M50N4RDZE ", & - "M50N4TAXE ","M50N4TAYE ","M50N4TAZE ","M50N4TDXSS","M50N4TDYSS","M50N4TDZSS","M50N5FKXE ", & - "M50N5FKYE ","M50N5FKZE ","M50N5FMXE ","M50N5FMYE ","M50N5FMZE ","M50N5MKXE ","M50N5MKYE ", & - "M50N5MKZE ","M50N5MMXE ","M50N5MMYE ","M50N5MMZE ","M50N5RAXE ","M50N5RAYE ","M50N5RAZE ", & - "M50N5RDXE ","M50N5RDYE ","M50N5RDZE ","M50N5TAXE ","M50N5TAYE ","M50N5TAZE ","M50N5TDXSS", & - "M50N5TDYSS","M50N5TDZSS","M50N6FKXE ","M50N6FKYE ","M50N6FKZE ","M50N6FMXE ","M50N6FMYE ", & - "M50N6FMZE ","M50N6MKXE ","M50N6MKYE ","M50N6MKZE ","M50N6MMXE ","M50N6MMYE ","M50N6MMZE ", & - "M50N6RAXE ","M50N6RAYE ","M50N6RAZE ","M50N6RDXE ","M50N6RDYE ","M50N6RDZE ","M50N6TAXE ", & - "M50N6TAYE ","M50N6TAZE ","M50N6TDXSS","M50N6TDYSS","M50N6TDZSS","M50N7FKXE ","M50N7FKYE ", & - "M50N7FKZE ","M50N7FMXE ","M50N7FMYE ","M50N7FMZE ","M50N7MKXE ","M50N7MKYE ","M50N7MKZE ", & - "M50N7MMXE ","M50N7MMYE ","M50N7MMZE ","M50N7RAXE ","M50N7RAYE ","M50N7RAZE ","M50N7RDXE ", & - "M50N7RDYE ","M50N7RDZE ","M50N7TAXE ","M50N7TAYE ","M50N7TAZE ","M50N7TDXSS","M50N7TDYSS", & - "M50N7TDZSS","M50N8FKXE ","M50N8FKYE ","M50N8FKZE ","M50N8FMXE ","M50N8FMYE ","M50N8FMZE ", & - "M50N8MKXE ","M50N8MKYE ","M50N8MKZE ","M50N8MMXE ","M50N8MMYE ","M50N8MMZE ","M50N8RAXE ", & - "M50N8RAYE ","M50N8RAZE ","M50N8RDXE ","M50N8RDYE ","M50N8RDZE ","M50N8TAXE ","M50N8TAYE ", & - "M50N8TAZE ","M50N8TDXSS","M50N8TDYSS","M50N8TDZSS","M50N9FKXE ","M50N9FKYE ","M50N9FKZE ", & - "M50N9FMXE ","M50N9FMYE ","M50N9FMZE ","M50N9MKXE ","M50N9MKYE ","M50N9MKZE ","M50N9MMXE ", & - "M50N9MMYE ","M50N9MMZE ","M50N9RAXE ","M50N9RAYE ","M50N9RAZE ","M50N9RDXE ","M50N9RDYE ", & - "M50N9RDZE ","M50N9TAXE ","M50N9TAYE ","M50N9TAZE ","M50N9TDXSS","M50N9TDYSS","M50N9TDZSS", & - "M51N1FKXE ","M51N1FKYE ","M51N1FKZE ","M51N1FMXE ","M51N1FMYE ","M51N1FMZE ","M51N1MKXE ", & - "M51N1MKYE ","M51N1MKZE ","M51N1MMXE ","M51N1MMYE ","M51N1MMZE ","M51N1RAXE ","M51N1RAYE ", & - "M51N1RAZE ","M51N1RDXE ","M51N1RDYE ","M51N1RDZE ","M51N1TAXE ","M51N1TAYE ","M51N1TAZE ", & - "M51N1TDXSS","M51N1TDYSS","M51N1TDZSS","M51N2FKXE ","M51N2FKYE ","M51N2FKZE ","M51N2FMXE ", & - "M51N2FMYE ","M51N2FMZE ","M51N2MKXE ","M51N2MKYE ","M51N2MKZE ","M51N2MMXE ","M51N2MMYE ", & - "M51N2MMZE ","M51N2RAXE ","M51N2RAYE ","M51N2RAZE ","M51N2RDXE ","M51N2RDYE ","M51N2RDZE ", & - "M51N2TAXE ","M51N2TAYE ","M51N2TAZE ","M51N2TDXSS","M51N2TDYSS","M51N2TDZSS","M51N3FKXE ", & - "M51N3FKYE ","M51N3FKZE ","M51N3FMXE ","M51N3FMYE ","M51N3FMZE ","M51N3MKXE ","M51N3MKYE ", & - "M51N3MKZE ","M51N3MMXE ","M51N3MMYE ","M51N3MMZE ","M51N3RAXE ","M51N3RAYE ","M51N3RAZE ", & - "M51N3RDXE ","M51N3RDYE ","M51N3RDZE ","M51N3TAXE ","M51N3TAYE ","M51N3TAZE ","M51N3TDXSS", & - "M51N3TDYSS","M51N3TDZSS","M51N4FKXE ","M51N4FKYE ","M51N4FKZE ","M51N4FMXE ","M51N4FMYE ", & - "M51N4FMZE ","M51N4MKXE ","M51N4MKYE ","M51N4MKZE ","M51N4MMXE ","M51N4MMYE ","M51N4MMZE ", & - "M51N4RAXE ","M51N4RAYE ","M51N4RAZE ","M51N4RDXE ","M51N4RDYE ","M51N4RDZE ","M51N4TAXE ", & - "M51N4TAYE ","M51N4TAZE ","M51N4TDXSS","M51N4TDYSS","M51N4TDZSS","M51N5FKXE ","M51N5FKYE ", & - "M51N5FKZE ","M51N5FMXE ","M51N5FMYE ","M51N5FMZE ","M51N5MKXE ","M51N5MKYE ","M51N5MKZE ", & - "M51N5MMXE ","M51N5MMYE ","M51N5MMZE ","M51N5RAXE ","M51N5RAYE ","M51N5RAZE ","M51N5RDXE ", & - "M51N5RDYE ","M51N5RDZE ","M51N5TAXE ","M51N5TAYE ","M51N5TAZE ","M51N5TDXSS","M51N5TDYSS", & - "M51N5TDZSS","M51N6FKXE ","M51N6FKYE ","M51N6FKZE ","M51N6FMXE ","M51N6FMYE ","M51N6FMZE ", & - "M51N6MKXE ","M51N6MKYE ","M51N6MKZE ","M51N6MMXE ","M51N6MMYE ","M51N6MMZE ","M51N6RAXE ", & - "M51N6RAYE ","M51N6RAZE ","M51N6RDXE ","M51N6RDYE ","M51N6RDZE ","M51N6TAXE ","M51N6TAYE ", & - "M51N6TAZE ","M51N6TDXSS","M51N6TDYSS","M51N6TDZSS","M51N7FKXE ","M51N7FKYE ","M51N7FKZE ", & - "M51N7FMXE ","M51N7FMYE ","M51N7FMZE ","M51N7MKXE ","M51N7MKYE ","M51N7MKZE ","M51N7MMXE ", & - "M51N7MMYE ","M51N7MMZE ","M51N7RAXE ","M51N7RAYE ","M51N7RAZE ","M51N7RDXE ","M51N7RDYE ", & - "M51N7RDZE ","M51N7TAXE ","M51N7TAYE ","M51N7TAZE ","M51N7TDXSS","M51N7TDYSS","M51N7TDZSS", & - "M51N8FKXE ","M51N8FKYE ","M51N8FKZE ","M51N8FMXE ","M51N8FMYE ","M51N8FMZE ","M51N8MKXE ", & - "M51N8MKYE ","M51N8MKZE ","M51N8MMXE ","M51N8MMYE ","M51N8MMZE ","M51N8RAXE ","M51N8RAYE ", & - "M51N8RAZE ","M51N8RDXE ","M51N8RDYE ","M51N8RDZE ","M51N8TAXE ","M51N8TAYE ","M51N8TAZE ", & - "M51N8TDXSS","M51N8TDYSS","M51N8TDZSS","M51N9FKXE ","M51N9FKYE ","M51N9FKZE ","M51N9FMXE ", & - "M51N9FMYE ","M51N9FMZE ","M51N9MKXE ","M51N9MKYE ","M51N9MKZE ","M51N9MMXE ","M51N9MMYE ", & - "M51N9MMZE ","M51N9RAXE ","M51N9RAYE ","M51N9RAZE ","M51N9RDXE ","M51N9RDYE ","M51N9RDZE ", & - "M51N9TAXE ","M51N9TAYE ","M51N9TAZE ","M51N9TDXSS","M51N9TDYSS","M51N9TDZSS","M52N1FKXE ", & - "M52N1FKYE ","M52N1FKZE ","M52N1FMXE ","M52N1FMYE ","M52N1FMZE ","M52N1MKXE ","M52N1MKYE ", & - "M52N1MKZE ","M52N1MMXE ","M52N1MMYE ","M52N1MMZE ","M52N1RAXE ","M52N1RAYE ","M52N1RAZE ", & - "M52N1RDXE ","M52N1RDYE ","M52N1RDZE ","M52N1TAXE ","M52N1TAYE ","M52N1TAZE ","M52N1TDXSS", & - "M52N1TDYSS","M52N1TDZSS","M52N2FKXE ","M52N2FKYE ","M52N2FKZE ","M52N2FMXE ","M52N2FMYE ", & - "M52N2FMZE ","M52N2MKXE ","M52N2MKYE ","M52N2MKZE ","M52N2MMXE ","M52N2MMYE ","M52N2MMZE ", & - "M52N2RAXE ","M52N2RAYE ","M52N2RAZE ","M52N2RDXE ","M52N2RDYE ","M52N2RDZE ","M52N2TAXE ", & - "M52N2TAYE ","M52N2TAZE ","M52N2TDXSS","M52N2TDYSS","M52N2TDZSS","M52N3FKXE ","M52N3FKYE ", & - "M52N3FKZE ","M52N3FMXE ","M52N3FMYE ","M52N3FMZE ","M52N3MKXE ","M52N3MKYE ","M52N3MKZE ", & - "M52N3MMXE ","M52N3MMYE ","M52N3MMZE ","M52N3RAXE ","M52N3RAYE ","M52N3RAZE ","M52N3RDXE ", & - "M52N3RDYE ","M52N3RDZE ","M52N3TAXE ","M52N3TAYE ","M52N3TAZE ","M52N3TDXSS","M52N3TDYSS", & - "M52N3TDZSS","M52N4FKXE ","M52N4FKYE ","M52N4FKZE ","M52N4FMXE ","M52N4FMYE ","M52N4FMZE ", & - "M52N4MKXE ","M52N4MKYE ","M52N4MKZE ","M52N4MMXE ","M52N4MMYE ","M52N4MMZE ","M52N4RAXE ", & - "M52N4RAYE ","M52N4RAZE ","M52N4RDXE ","M52N4RDYE ","M52N4RDZE ","M52N4TAXE ","M52N4TAYE ", & - "M52N4TAZE ","M52N4TDXSS","M52N4TDYSS","M52N4TDZSS","M52N5FKXE ","M52N5FKYE ","M52N5FKZE ", & - "M52N5FMXE ","M52N5FMYE ","M52N5FMZE ","M52N5MKXE ","M52N5MKYE ","M52N5MKZE ","M52N5MMXE ", & - "M52N5MMYE ","M52N5MMZE ","M52N5RAXE ","M52N5RAYE ","M52N5RAZE ","M52N5RDXE ","M52N5RDYE ", & - "M52N5RDZE ","M52N5TAXE ","M52N5TAYE ","M52N5TAZE ","M52N5TDXSS","M52N5TDYSS","M52N5TDZSS", & - "M52N6FKXE ","M52N6FKYE ","M52N6FKZE ","M52N6FMXE ","M52N6FMYE ","M52N6FMZE ","M52N6MKXE ", & - "M52N6MKYE ","M52N6MKZE ","M52N6MMXE ","M52N6MMYE ","M52N6MMZE ","M52N6RAXE ","M52N6RAYE ", & - "M52N6RAZE ","M52N6RDXE ","M52N6RDYE ","M52N6RDZE ","M52N6TAXE ","M52N6TAYE ","M52N6TAZE ", & - "M52N6TDXSS","M52N6TDYSS","M52N6TDZSS","M52N7FKXE ","M52N7FKYE ","M52N7FKZE ","M52N7FMXE ", & - "M52N7FMYE ","M52N7FMZE ","M52N7MKXE ","M52N7MKYE ","M52N7MKZE ","M52N7MMXE ","M52N7MMYE ", & - "M52N7MMZE ","M52N7RAXE ","M52N7RAYE ","M52N7RAZE ","M52N7RDXE ","M52N7RDYE ","M52N7RDZE ", & - "M52N7TAXE ","M52N7TAYE ","M52N7TAZE ","M52N7TDXSS","M52N7TDYSS","M52N7TDZSS","M52N8FKXE ", & - "M52N8FKYE ","M52N8FKZE ","M52N8FMXE ","M52N8FMYE ","M52N8FMZE ","M52N8MKXE ","M52N8MKYE ", & - "M52N8MKZE ","M52N8MMXE ","M52N8MMYE ","M52N8MMZE ","M52N8RAXE ","M52N8RAYE ","M52N8RAZE ", & - "M52N8RDXE ","M52N8RDYE ","M52N8RDZE ","M52N8TAXE ","M52N8TAYE ","M52N8TAZE ","M52N8TDXSS", & - "M52N8TDYSS","M52N8TDZSS","M52N9FKXE ","M52N9FKYE ","M52N9FKZE ","M52N9FMXE ","M52N9FMYE ", & - "M52N9FMZE ","M52N9MKXE ","M52N9MKYE ","M52N9MKZE ","M52N9MMXE ","M52N9MMYE ","M52N9MMZE ", & - "M52N9RAXE ","M52N9RAYE ","M52N9RAZE ","M52N9RDXE ","M52N9RDYE ","M52N9RDZE ","M52N9TAXE ", & - "M52N9TAYE ","M52N9TAZE ","M52N9TDXSS","M52N9TDYSS","M52N9TDZSS","M53N1FKXE ","M53N1FKYE ", & - "M53N1FKZE ","M53N1FMXE ","M53N1FMYE ","M53N1FMZE ","M53N1MKXE ","M53N1MKYE ","M53N1MKZE ", & - "M53N1MMXE ","M53N1MMYE ","M53N1MMZE ","M53N1RAXE ","M53N1RAYE ","M53N1RAZE ","M53N1RDXE ", & - "M53N1RDYE ","M53N1RDZE ","M53N1TAXE ","M53N1TAYE ","M53N1TAZE ","M53N1TDXSS","M53N1TDYSS", & - "M53N1TDZSS","M53N2FKXE ","M53N2FKYE ","M53N2FKZE ","M53N2FMXE ","M53N2FMYE ","M53N2FMZE ", & - "M53N2MKXE ","M53N2MKYE ","M53N2MKZE ","M53N2MMXE ","M53N2MMYE ","M53N2MMZE ","M53N2RAXE ", & - "M53N2RAYE ","M53N2RAZE ","M53N2RDXE ","M53N2RDYE ","M53N2RDZE ","M53N2TAXE ","M53N2TAYE ", & - "M53N2TAZE ","M53N2TDXSS","M53N2TDYSS","M53N2TDZSS","M53N3FKXE ","M53N3FKYE ","M53N3FKZE ", & - "M53N3FMXE ","M53N3FMYE ","M53N3FMZE ","M53N3MKXE ","M53N3MKYE ","M53N3MKZE ","M53N3MMXE ", & - "M53N3MMYE ","M53N3MMZE ","M53N3RAXE ","M53N3RAYE ","M53N3RAZE ","M53N3RDXE ","M53N3RDYE ", & - "M53N3RDZE ","M53N3TAXE ","M53N3TAYE ","M53N3TAZE ","M53N3TDXSS","M53N3TDYSS","M53N3TDZSS", & - "M53N4FKXE ","M53N4FKYE ","M53N4FKZE ","M53N4FMXE ","M53N4FMYE ","M53N4FMZE ","M53N4MKXE ", & - "M53N4MKYE ","M53N4MKZE ","M53N4MMXE ","M53N4MMYE ","M53N4MMZE ","M53N4RAXE ","M53N4RAYE ", & - "M53N4RAZE ","M53N4RDXE ","M53N4RDYE ","M53N4RDZE ","M53N4TAXE ","M53N4TAYE ","M53N4TAZE ", & - "M53N4TDXSS","M53N4TDYSS","M53N4TDZSS","M53N5FKXE ","M53N5FKYE ","M53N5FKZE ","M53N5FMXE ", & - "M53N5FMYE ","M53N5FMZE ","M53N5MKXE ","M53N5MKYE ","M53N5MKZE ","M53N5MMXE ","M53N5MMYE ", & - "M53N5MMZE ","M53N5RAXE ","M53N5RAYE ","M53N5RAZE ","M53N5RDXE ","M53N5RDYE ","M53N5RDZE ", & - "M53N5TAXE ","M53N5TAYE ","M53N5TAZE ","M53N5TDXSS","M53N5TDYSS","M53N5TDZSS","M53N6FKXE ", & - "M53N6FKYE ","M53N6FKZE ","M53N6FMXE ","M53N6FMYE ","M53N6FMZE ","M53N6MKXE ","M53N6MKYE ", & - "M53N6MKZE ","M53N6MMXE ","M53N6MMYE ","M53N6MMZE ","M53N6RAXE ","M53N6RAYE ","M53N6RAZE ", & - "M53N6RDXE ","M53N6RDYE ","M53N6RDZE ","M53N6TAXE ","M53N6TAYE ","M53N6TAZE ","M53N6TDXSS", & - "M53N6TDYSS","M53N6TDZSS","M53N7FKXE ","M53N7FKYE ","M53N7FKZE ","M53N7FMXE ","M53N7FMYE ", & - "M53N7FMZE ","M53N7MKXE ","M53N7MKYE ","M53N7MKZE ","M53N7MMXE ","M53N7MMYE ","M53N7MMZE ", & - "M53N7RAXE ","M53N7RAYE ","M53N7RAZE ","M53N7RDXE ","M53N7RDYE ","M53N7RDZE ","M53N7TAXE ", & - "M53N7TAYE ","M53N7TAZE ","M53N7TDXSS","M53N7TDYSS","M53N7TDZSS","M53N8FKXE ","M53N8FKYE ", & - "M53N8FKZE ","M53N8FMXE ","M53N8FMYE ","M53N8FMZE ","M53N8MKXE ","M53N8MKYE ","M53N8MKZE ", & - "M53N8MMXE ","M53N8MMYE ","M53N8MMZE ","M53N8RAXE ","M53N8RAYE ","M53N8RAZE ","M53N8RDXE ", & - "M53N8RDYE ","M53N8RDZE ","M53N8TAXE ","M53N8TAYE ","M53N8TAZE ","M53N8TDXSS","M53N8TDYSS", & - "M53N8TDZSS","M53N9FKXE ","M53N9FKYE ","M53N9FKZE ","M53N9FMXE ","M53N9FMYE ","M53N9FMZE ", & - "M53N9MKXE ","M53N9MKYE ","M53N9MKZE ","M53N9MMXE ","M53N9MMYE ","M53N9MMZE ","M53N9RAXE ", & - "M53N9RAYE ","M53N9RAZE ","M53N9RDXE ","M53N9RDYE ","M53N9RDZE ","M53N9TAXE ","M53N9TAYE ", & - "M53N9TAZE ","M53N9TDXSS","M53N9TDYSS","M53N9TDZSS","M54N1FKXE ","M54N1FKYE ","M54N1FKZE ", & - "M54N1FMXE ","M54N1FMYE ","M54N1FMZE ","M54N1MKXE ","M54N1MKYE ","M54N1MKZE ","M54N1MMXE ", & - "M54N1MMYE ","M54N1MMZE ","M54N1RAXE ","M54N1RAYE ","M54N1RAZE ","M54N1RDXE ","M54N1RDYE ", & - "M54N1RDZE ","M54N1TAXE ","M54N1TAYE ","M54N1TAZE ","M54N1TDXSS","M54N1TDYSS","M54N1TDZSS", & - "M54N2FKXE ","M54N2FKYE ","M54N2FKZE ","M54N2FMXE ","M54N2FMYE ","M54N2FMZE ","M54N2MKXE ", & - "M54N2MKYE ","M54N2MKZE ","M54N2MMXE ","M54N2MMYE ","M54N2MMZE ","M54N2RAXE ","M54N2RAYE ", & - "M54N2RAZE ","M54N2RDXE ","M54N2RDYE ","M54N2RDZE ","M54N2TAXE ","M54N2TAYE ","M54N2TAZE ", & - "M54N2TDXSS","M54N2TDYSS","M54N2TDZSS","M54N3FKXE ","M54N3FKYE ","M54N3FKZE ","M54N3FMXE ", & - "M54N3FMYE ","M54N3FMZE ","M54N3MKXE ","M54N3MKYE ","M54N3MKZE ","M54N3MMXE ","M54N3MMYE ", & - "M54N3MMZE ","M54N3RAXE ","M54N3RAYE ","M54N3RAZE ","M54N3RDXE ","M54N3RDYE ","M54N3RDZE ", & - "M54N3TAXE ","M54N3TAYE ","M54N3TAZE ","M54N3TDXSS","M54N3TDYSS","M54N3TDZSS","M54N4FKXE ", & - "M54N4FKYE ","M54N4FKZE ","M54N4FMXE ","M54N4FMYE ","M54N4FMZE ","M54N4MKXE ","M54N4MKYE ", & - "M54N4MKZE ","M54N4MMXE ","M54N4MMYE ","M54N4MMZE ","M54N4RAXE ","M54N4RAYE ","M54N4RAZE ", & - "M54N4RDXE ","M54N4RDYE ","M54N4RDZE ","M54N4TAXE ","M54N4TAYE ","M54N4TAZE ","M54N4TDXSS", & - "M54N4TDYSS","M54N4TDZSS","M54N5FKXE ","M54N5FKYE ","M54N5FKZE ","M54N5FMXE ","M54N5FMYE ", & - "M54N5FMZE ","M54N5MKXE ","M54N5MKYE ","M54N5MKZE ","M54N5MMXE ","M54N5MMYE ","M54N5MMZE ", & - "M54N5RAXE ","M54N5RAYE ","M54N5RAZE ","M54N5RDXE ","M54N5RDYE ","M54N5RDZE ","M54N5TAXE ", & - "M54N5TAYE ","M54N5TAZE ","M54N5TDXSS","M54N5TDYSS","M54N5TDZSS","M54N6FKXE ","M54N6FKYE ", & - "M54N6FKZE ","M54N6FMXE ","M54N6FMYE ","M54N6FMZE ","M54N6MKXE ","M54N6MKYE ","M54N6MKZE ", & - "M54N6MMXE ","M54N6MMYE ","M54N6MMZE ","M54N6RAXE ","M54N6RAYE ","M54N6RAZE ","M54N6RDXE ", & - "M54N6RDYE ","M54N6RDZE ","M54N6TAXE ","M54N6TAYE ","M54N6TAZE ","M54N6TDXSS","M54N6TDYSS", & - "M54N6TDZSS","M54N7FKXE ","M54N7FKYE ","M54N7FKZE ","M54N7FMXE ","M54N7FMYE ","M54N7FMZE ", & - "M54N7MKXE ","M54N7MKYE ","M54N7MKZE ","M54N7MMXE ","M54N7MMYE ","M54N7MMZE ","M54N7RAXE ", & - "M54N7RAYE ","M54N7RAZE ","M54N7RDXE ","M54N7RDYE ","M54N7RDZE ","M54N7TAXE ","M54N7TAYE ", & - "M54N7TAZE ","M54N7TDXSS","M54N7TDYSS","M54N7TDZSS","M54N8FKXE ","M54N8FKYE ","M54N8FKZE ", & - "M54N8FMXE ","M54N8FMYE ","M54N8FMZE ","M54N8MKXE ","M54N8MKYE ","M54N8MKZE ","M54N8MMXE ", & - "M54N8MMYE ","M54N8MMZE ","M54N8RAXE ","M54N8RAYE ","M54N8RAZE ","M54N8RDXE ","M54N8RDYE ", & - "M54N8RDZE ","M54N8TAXE ","M54N8TAYE ","M54N8TAZE ","M54N8TDXSS","M54N8TDYSS","M54N8TDZSS", & - "M54N9FKXE ","M54N9FKYE ","M54N9FKZE ","M54N9FMXE ","M54N9FMYE ","M54N9FMZE ","M54N9MKXE ", & - "M54N9MKYE ","M54N9MKZE ","M54N9MMXE ","M54N9MMYE ","M54N9MMZE ","M54N9RAXE ","M54N9RAYE ", & - "M54N9RAZE ","M54N9RDXE ","M54N9RDYE ","M54N9RDZE ","M54N9TAXE ","M54N9TAYE ","M54N9TAZE ", & - "M54N9TDXSS","M54N9TDYSS","M54N9TDZSS","M55N1FKXE ","M55N1FKYE ","M55N1FKZE ","M55N1FMXE ", & - "M55N1FMYE ","M55N1FMZE ","M55N1MKXE ","M55N1MKYE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry8(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M55N1MKZE ","M55N1MMXE ","M55N1MMYE ","M55N1MMZE ","M55N1RAXE ","M55N1RAYE ","M55N1RAZE ", & - "M55N1RDXE ","M55N1RDYE ","M55N1RDZE ","M55N1TAXE ","M55N1TAYE ","M55N1TAZE ","M55N1TDXSS", & - "M55N1TDYSS","M55N1TDZSS","M55N2FKXE ","M55N2FKYE ","M55N2FKZE ","M55N2FMXE ","M55N2FMYE ", & - "M55N2FMZE ","M55N2MKXE ","M55N2MKYE ","M55N2MKZE ","M55N2MMXE ","M55N2MMYE ","M55N2MMZE ", & - "M55N2RAXE ","M55N2RAYE ","M55N2RAZE ","M55N2RDXE ","M55N2RDYE ","M55N2RDZE ","M55N2TAXE ", & - "M55N2TAYE ","M55N2TAZE ","M55N2TDXSS","M55N2TDYSS","M55N2TDZSS","M55N3FKXE ","M55N3FKYE ", & - "M55N3FKZE ","M55N3FMXE ","M55N3FMYE ","M55N3FMZE ","M55N3MKXE ","M55N3MKYE ","M55N3MKZE ", & - "M55N3MMXE ","M55N3MMYE ","M55N3MMZE ","M55N3RAXE ","M55N3RAYE ","M55N3RAZE ","M55N3RDXE ", & - "M55N3RDYE ","M55N3RDZE ","M55N3TAXE ","M55N3TAYE ","M55N3TAZE ","M55N3TDXSS","M55N3TDYSS", & - "M55N3TDZSS","M55N4FKXE ","M55N4FKYE ","M55N4FKZE ","M55N4FMXE ","M55N4FMYE ","M55N4FMZE ", & - "M55N4MKXE ","M55N4MKYE ","M55N4MKZE ","M55N4MMXE ","M55N4MMYE ","M55N4MMZE ","M55N4RAXE ", & - "M55N4RAYE ","M55N4RAZE ","M55N4RDXE ","M55N4RDYE ","M55N4RDZE ","M55N4TAXE ","M55N4TAYE ", & - "M55N4TAZE ","M55N4TDXSS","M55N4TDYSS","M55N4TDZSS","M55N5FKXE ","M55N5FKYE ","M55N5FKZE ", & - "M55N5FMXE ","M55N5FMYE ","M55N5FMZE ","M55N5MKXE ","M55N5MKYE ","M55N5MKZE ","M55N5MMXE ", & - "M55N5MMYE ","M55N5MMZE ","M55N5RAXE ","M55N5RAYE ","M55N5RAZE ","M55N5RDXE ","M55N5RDYE ", & - "M55N5RDZE ","M55N5TAXE ","M55N5TAYE ","M55N5TAZE ","M55N5TDXSS","M55N5TDYSS","M55N5TDZSS", & - "M55N6FKXE ","M55N6FKYE ","M55N6FKZE ","M55N6FMXE ","M55N6FMYE ","M55N6FMZE ","M55N6MKXE ", & - "M55N6MKYE ","M55N6MKZE ","M55N6MMXE ","M55N6MMYE ","M55N6MMZE ","M55N6RAXE ","M55N6RAYE ", & - "M55N6RAZE ","M55N6RDXE ","M55N6RDYE ","M55N6RDZE ","M55N6TAXE ","M55N6TAYE ","M55N6TAZE ", & - "M55N6TDXSS","M55N6TDYSS","M55N6TDZSS","M55N7FKXE ","M55N7FKYE ","M55N7FKZE ","M55N7FMXE ", & - "M55N7FMYE ","M55N7FMZE ","M55N7MKXE ","M55N7MKYE ","M55N7MKZE ","M55N7MMXE ","M55N7MMYE ", & - "M55N7MMZE ","M55N7RAXE ","M55N7RAYE ","M55N7RAZE ","M55N7RDXE ","M55N7RDYE ","M55N7RDZE ", & - "M55N7TAXE ","M55N7TAYE ","M55N7TAZE ","M55N7TDXSS","M55N7TDYSS","M55N7TDZSS","M55N8FKXE ", & - "M55N8FKYE ","M55N8FKZE ","M55N8FMXE ","M55N8FMYE ","M55N8FMZE ","M55N8MKXE ","M55N8MKYE ", & - "M55N8MKZE ","M55N8MMXE ","M55N8MMYE ","M55N8MMZE ","M55N8RAXE ","M55N8RAYE ","M55N8RAZE ", & - "M55N8RDXE ","M55N8RDYE ","M55N8RDZE ","M55N8TAXE ","M55N8TAYE ","M55N8TAZE ","M55N8TDXSS", & - "M55N8TDYSS","M55N8TDZSS","M55N9FKXE ","M55N9FKYE ","M55N9FKZE ","M55N9FMXE ","M55N9FMYE ", & - "M55N9FMZE ","M55N9MKXE ","M55N9MKYE ","M55N9MKZE ","M55N9MMXE ","M55N9MMYE ","M55N9MMZE ", & - "M55N9RAXE ","M55N9RAYE ","M55N9RAZE ","M55N9RDXE ","M55N9RDYE ","M55N9RDZE ","M55N9TAXE ", & - "M55N9TAYE ","M55N9TAZE ","M55N9TDXSS","M55N9TDYSS","M55N9TDZSS","M56N1FKXE ","M56N1FKYE ", & - "M56N1FKZE ","M56N1FMXE ","M56N1FMYE ","M56N1FMZE ","M56N1MKXE ","M56N1MKYE ","M56N1MKZE ", & - "M56N1MMXE ","M56N1MMYE ","M56N1MMZE ","M56N1RAXE ","M56N1RAYE ","M56N1RAZE ","M56N1RDXE ", & - "M56N1RDYE ","M56N1RDZE ","M56N1TAXE ","M56N1TAYE ","M56N1TAZE ","M56N1TDXSS","M56N1TDYSS", & - "M56N1TDZSS","M56N2FKXE ","M56N2FKYE ","M56N2FKZE ","M56N2FMXE ","M56N2FMYE ","M56N2FMZE ", & - "M56N2MKXE ","M56N2MKYE ","M56N2MKZE ","M56N2MMXE ","M56N2MMYE ","M56N2MMZE ","M56N2RAXE ", & - "M56N2RAYE ","M56N2RAZE ","M56N2RDXE ","M56N2RDYE ","M56N2RDZE ","M56N2TAXE ","M56N2TAYE ", & - "M56N2TAZE ","M56N2TDXSS","M56N2TDYSS","M56N2TDZSS","M56N3FKXE ","M56N3FKYE ","M56N3FKZE ", & - "M56N3FMXE ","M56N3FMYE ","M56N3FMZE ","M56N3MKXE ","M56N3MKYE ","M56N3MKZE ","M56N3MMXE ", & - "M56N3MMYE ","M56N3MMZE ","M56N3RAXE ","M56N3RAYE ","M56N3RAZE ","M56N3RDXE ","M56N3RDYE ", & - "M56N3RDZE ","M56N3TAXE ","M56N3TAYE ","M56N3TAZE ","M56N3TDXSS","M56N3TDYSS","M56N3TDZSS", & - "M56N4FKXE ","M56N4FKYE ","M56N4FKZE ","M56N4FMXE ","M56N4FMYE ","M56N4FMZE ","M56N4MKXE ", & - "M56N4MKYE ","M56N4MKZE ","M56N4MMXE ","M56N4MMYE ","M56N4MMZE ","M56N4RAXE ","M56N4RAYE ", & - "M56N4RAZE ","M56N4RDXE ","M56N4RDYE ","M56N4RDZE ","M56N4TAXE ","M56N4TAYE ","M56N4TAZE ", & - "M56N4TDXSS","M56N4TDYSS","M56N4TDZSS","M56N5FKXE ","M56N5FKYE ","M56N5FKZE ","M56N5FMXE ", & - "M56N5FMYE ","M56N5FMZE ","M56N5MKXE ","M56N5MKYE ","M56N5MKZE ","M56N5MMXE ","M56N5MMYE ", & - "M56N5MMZE ","M56N5RAXE ","M56N5RAYE ","M56N5RAZE ","M56N5RDXE ","M56N5RDYE ","M56N5RDZE ", & - "M56N5TAXE ","M56N5TAYE ","M56N5TAZE ","M56N5TDXSS","M56N5TDYSS","M56N5TDZSS","M56N6FKXE ", & - "M56N6FKYE ","M56N6FKZE ","M56N6FMXE ","M56N6FMYE ","M56N6FMZE ","M56N6MKXE ","M56N6MKYE ", & - "M56N6MKZE ","M56N6MMXE ","M56N6MMYE ","M56N6MMZE ","M56N6RAXE ","M56N6RAYE ","M56N6RAZE ", & - "M56N6RDXE ","M56N6RDYE ","M56N6RDZE ","M56N6TAXE ","M56N6TAYE ","M56N6TAZE ","M56N6TDXSS", & - "M56N6TDYSS","M56N6TDZSS","M56N7FKXE ","M56N7FKYE ","M56N7FKZE ","M56N7FMXE ","M56N7FMYE ", & - "M56N7FMZE ","M56N7MKXE ","M56N7MKYE ","M56N7MKZE ","M56N7MMXE ","M56N7MMYE ","M56N7MMZE ", & - "M56N7RAXE ","M56N7RAYE ","M56N7RAZE ","M56N7RDXE ","M56N7RDYE ","M56N7RDZE ","M56N7TAXE ", & - "M56N7TAYE ","M56N7TAZE ","M56N7TDXSS","M56N7TDYSS","M56N7TDZSS","M56N8FKXE ","M56N8FKYE ", & - "M56N8FKZE ","M56N8FMXE ","M56N8FMYE ","M56N8FMZE ","M56N8MKXE ","M56N8MKYE ","M56N8MKZE ", & - "M56N8MMXE ","M56N8MMYE ","M56N8MMZE ","M56N8RAXE ","M56N8RAYE ","M56N8RAZE ","M56N8RDXE ", & - "M56N8RDYE ","M56N8RDZE ","M56N8TAXE ","M56N8TAYE ","M56N8TAZE ","M56N8TDXSS","M56N8TDYSS", & - "M56N8TDZSS","M56N9FKXE ","M56N9FKYE ","M56N9FKZE ","M56N9FMXE ","M56N9FMYE ","M56N9FMZE ", & - "M56N9MKXE ","M56N9MKYE ","M56N9MKZE ","M56N9MMXE ","M56N9MMYE ","M56N9MMZE ","M56N9RAXE ", & - "M56N9RAYE ","M56N9RAZE ","M56N9RDXE ","M56N9RDYE ","M56N9RDZE ","M56N9TAXE ","M56N9TAYE ", & - "M56N9TAZE ","M56N9TDXSS","M56N9TDYSS","M56N9TDZSS","M57N1FKXE ","M57N1FKYE ","M57N1FKZE ", & - "M57N1FMXE ","M57N1FMYE ","M57N1FMZE ","M57N1MKXE ","M57N1MKYE ","M57N1MKZE ","M57N1MMXE ", & - "M57N1MMYE ","M57N1MMZE ","M57N1RAXE ","M57N1RAYE ","M57N1RAZE ","M57N1RDXE ","M57N1RDYE ", & - "M57N1RDZE ","M57N1TAXE ","M57N1TAYE ","M57N1TAZE ","M57N1TDXSS","M57N1TDYSS","M57N1TDZSS", & - "M57N2FKXE ","M57N2FKYE ","M57N2FKZE ","M57N2FMXE ","M57N2FMYE ","M57N2FMZE ","M57N2MKXE ", & - "M57N2MKYE ","M57N2MKZE ","M57N2MMXE ","M57N2MMYE ","M57N2MMZE ","M57N2RAXE ","M57N2RAYE ", & - "M57N2RAZE ","M57N2RDXE ","M57N2RDYE ","M57N2RDZE ","M57N2TAXE ","M57N2TAYE ","M57N2TAZE ", & - "M57N2TDXSS","M57N2TDYSS","M57N2TDZSS","M57N3FKXE ","M57N3FKYE ","M57N3FKZE ","M57N3FMXE ", & - "M57N3FMYE ","M57N3FMZE ","M57N3MKXE ","M57N3MKYE ","M57N3MKZE ","M57N3MMXE ","M57N3MMYE ", & - "M57N3MMZE ","M57N3RAXE ","M57N3RAYE ","M57N3RAZE ","M57N3RDXE ","M57N3RDYE ","M57N3RDZE ", & - "M57N3TAXE ","M57N3TAYE ","M57N3TAZE ","M57N3TDXSS","M57N3TDYSS","M57N3TDZSS","M57N4FKXE ", & - "M57N4FKYE ","M57N4FKZE ","M57N4FMXE ","M57N4FMYE ","M57N4FMZE ","M57N4MKXE ","M57N4MKYE ", & - "M57N4MKZE ","M57N4MMXE ","M57N4MMYE ","M57N4MMZE ","M57N4RAXE ","M57N4RAYE ","M57N4RAZE ", & - "M57N4RDXE ","M57N4RDYE ","M57N4RDZE ","M57N4TAXE ","M57N4TAYE ","M57N4TAZE ","M57N4TDXSS", & - "M57N4TDYSS","M57N4TDZSS","M57N5FKXE ","M57N5FKYE ","M57N5FKZE ","M57N5FMXE ","M57N5FMYE ", & - "M57N5FMZE ","M57N5MKXE ","M57N5MKYE ","M57N5MKZE ","M57N5MMXE ","M57N5MMYE ","M57N5MMZE ", & - "M57N5RAXE ","M57N5RAYE ","M57N5RAZE ","M57N5RDXE ","M57N5RDYE ","M57N5RDZE ","M57N5TAXE ", & - "M57N5TAYE ","M57N5TAZE ","M57N5TDXSS","M57N5TDYSS","M57N5TDZSS","M57N6FKXE ","M57N6FKYE ", & - "M57N6FKZE ","M57N6FMXE ","M57N6FMYE ","M57N6FMZE ","M57N6MKXE ","M57N6MKYE ","M57N6MKZE ", & - "M57N6MMXE ","M57N6MMYE ","M57N6MMZE ","M57N6RAXE ","M57N6RAYE ","M57N6RAZE ","M57N6RDXE ", & - "M57N6RDYE ","M57N6RDZE ","M57N6TAXE ","M57N6TAYE ","M57N6TAZE ","M57N6TDXSS","M57N6TDYSS", & - "M57N6TDZSS","M57N7FKXE ","M57N7FKYE ","M57N7FKZE ","M57N7FMXE ","M57N7FMYE ","M57N7FMZE ", & - "M57N7MKXE ","M57N7MKYE ","M57N7MKZE ","M57N7MMXE ","M57N7MMYE ","M57N7MMZE ","M57N7RAXE ", & - "M57N7RAYE ","M57N7RAZE ","M57N7RDXE ","M57N7RDYE ","M57N7RDZE ","M57N7TAXE ","M57N7TAYE ", & - "M57N7TAZE ","M57N7TDXSS","M57N7TDYSS","M57N7TDZSS","M57N8FKXE ","M57N8FKYE ","M57N8FKZE ", & - "M57N8FMXE ","M57N8FMYE ","M57N8FMZE ","M57N8MKXE ","M57N8MKYE ","M57N8MKZE ","M57N8MMXE ", & - "M57N8MMYE ","M57N8MMZE ","M57N8RAXE ","M57N8RAYE ","M57N8RAZE ","M57N8RDXE ","M57N8RDYE ", & - "M57N8RDZE ","M57N8TAXE ","M57N8TAYE ","M57N8TAZE ","M57N8TDXSS","M57N8TDYSS","M57N8TDZSS", & - "M57N9FKXE ","M57N9FKYE ","M57N9FKZE ","M57N9FMXE ","M57N9FMYE ","M57N9FMZE ","M57N9MKXE ", & - "M57N9MKYE ","M57N9MKZE ","M57N9MMXE ","M57N9MMYE ","M57N9MMZE ","M57N9RAXE ","M57N9RAYE ", & - "M57N9RAZE ","M57N9RDXE ","M57N9RDYE ","M57N9RDZE ","M57N9TAXE ","M57N9TAYE ","M57N9TAZE ", & - "M57N9TDXSS","M57N9TDYSS","M57N9TDZSS","M58N1FKXE ","M58N1FKYE ","M58N1FKZE ","M58N1FMXE ", & - "M58N1FMYE ","M58N1FMZE ","M58N1MKXE ","M58N1MKYE ","M58N1MKZE ","M58N1MMXE ","M58N1MMYE ", & - "M58N1MMZE ","M58N1RAXE ","M58N1RAYE ","M58N1RAZE ","M58N1RDXE ","M58N1RDYE ","M58N1RDZE ", & - "M58N1TAXE ","M58N1TAYE ","M58N1TAZE ","M58N1TDXSS","M58N1TDYSS","M58N1TDZSS","M58N2FKXE ", & - "M58N2FKYE ","M58N2FKZE ","M58N2FMXE ","M58N2FMYE ","M58N2FMZE ","M58N2MKXE ","M58N2MKYE ", & - "M58N2MKZE ","M58N2MMXE ","M58N2MMYE ","M58N2MMZE ","M58N2RAXE ","M58N2RAYE ","M58N2RAZE ", & - "M58N2RDXE ","M58N2RDYE ","M58N2RDZE ","M58N2TAXE ","M58N2TAYE ","M58N2TAZE ","M58N2TDXSS", & - "M58N2TDYSS","M58N2TDZSS","M58N3FKXE ","M58N3FKYE ","M58N3FKZE ","M58N3FMXE ","M58N3FMYE ", & - "M58N3FMZE ","M58N3MKXE ","M58N3MKYE ","M58N3MKZE ","M58N3MMXE ","M58N3MMYE ","M58N3MMZE ", & - "M58N3RAXE ","M58N3RAYE ","M58N3RAZE ","M58N3RDXE ","M58N3RDYE ","M58N3RDZE ","M58N3TAXE ", & - "M58N3TAYE ","M58N3TAZE ","M58N3TDXSS","M58N3TDYSS","M58N3TDZSS","M58N4FKXE ","M58N4FKYE ", & - "M58N4FKZE ","M58N4FMXE ","M58N4FMYE ","M58N4FMZE ","M58N4MKXE ","M58N4MKYE ","M58N4MKZE ", & - "M58N4MMXE ","M58N4MMYE ","M58N4MMZE ","M58N4RAXE ","M58N4RAYE ","M58N4RAZE ","M58N4RDXE ", & - "M58N4RDYE ","M58N4RDZE ","M58N4TAXE ","M58N4TAYE ","M58N4TAZE ","M58N4TDXSS","M58N4TDYSS", & - "M58N4TDZSS","M58N5FKXE ","M58N5FKYE ","M58N5FKZE ","M58N5FMXE ","M58N5FMYE ","M58N5FMZE ", & - "M58N5MKXE ","M58N5MKYE ","M58N5MKZE ","M58N5MMXE ","M58N5MMYE ","M58N5MMZE ","M58N5RAXE ", & - "M58N5RAYE ","M58N5RAZE ","M58N5RDXE ","M58N5RDYE ","M58N5RDZE ","M58N5TAXE ","M58N5TAYE ", & - "M58N5TAZE ","M58N5TDXSS","M58N5TDYSS","M58N5TDZSS","M58N6FKXE ","M58N6FKYE ","M58N6FKZE ", & - "M58N6FMXE ","M58N6FMYE ","M58N6FMZE ","M58N6MKXE ","M58N6MKYE ","M58N6MKZE ","M58N6MMXE ", & - "M58N6MMYE ","M58N6MMZE ","M58N6RAXE ","M58N6RAYE ","M58N6RAZE ","M58N6RDXE ","M58N6RDYE ", & - "M58N6RDZE ","M58N6TAXE ","M58N6TAYE ","M58N6TAZE ","M58N6TDXSS","M58N6TDYSS","M58N6TDZSS", & - "M58N7FKXE ","M58N7FKYE ","M58N7FKZE ","M58N7FMXE ","M58N7FMYE ","M58N7FMZE ","M58N7MKXE ", & - "M58N7MKYE ","M58N7MKZE ","M58N7MMXE ","M58N7MMYE ","M58N7MMZE ","M58N7RAXE ","M58N7RAYE ", & - "M58N7RAZE ","M58N7RDXE ","M58N7RDYE ","M58N7RDZE ","M58N7TAXE ","M58N7TAYE ","M58N7TAZE ", & - "M58N7TDXSS","M58N7TDYSS","M58N7TDZSS","M58N8FKXE ","M58N8FKYE ","M58N8FKZE ","M58N8FMXE ", & - "M58N8FMYE ","M58N8FMZE ","M58N8MKXE ","M58N8MKYE ","M58N8MKZE ","M58N8MMXE ","M58N8MMYE ", & - "M58N8MMZE ","M58N8RAXE ","M58N8RAYE ","M58N8RAZE ","M58N8RDXE ","M58N8RDYE ","M58N8RDZE ", & - "M58N8TAXE ","M58N8TAYE ","M58N8TAZE ","M58N8TDXSS","M58N8TDYSS","M58N8TDZSS","M58N9FKXE ", & - "M58N9FKYE ","M58N9FKZE ","M58N9FMXE ","M58N9FMYE ","M58N9FMZE ","M58N9MKXE ","M58N9MKYE ", & - "M58N9MKZE ","M58N9MMXE ","M58N9MMYE ","M58N9MMZE ","M58N9RAXE ","M58N9RAYE ","M58N9RAZE ", & - "M58N9RDXE ","M58N9RDYE ","M58N9RDZE ","M58N9TAXE ","M58N9TAYE ","M58N9TAZE ","M58N9TDXSS", & - "M58N9TDYSS","M58N9TDZSS","M59N1FKXE ","M59N1FKYE ","M59N1FKZE ","M59N1FMXE ","M59N1FMYE ", & - "M59N1FMZE ","M59N1MKXE ","M59N1MKYE ","M59N1MKZE ","M59N1MMXE ","M59N1MMYE ","M59N1MMZE ", & - "M59N1RAXE ","M59N1RAYE ","M59N1RAZE ","M59N1RDXE ","M59N1RDYE ","M59N1RDZE ","M59N1TAXE ", & - "M59N1TAYE ","M59N1TAZE ","M59N1TDXSS","M59N1TDYSS","M59N1TDZSS","M59N2FKXE ","M59N2FKYE ", & - "M59N2FKZE ","M59N2FMXE ","M59N2FMYE ","M59N2FMZE ","M59N2MKXE ","M59N2MKYE ","M59N2MKZE ", & - "M59N2MMXE ","M59N2MMYE ","M59N2MMZE ","M59N2RAXE ","M59N2RAYE ","M59N2RAZE ","M59N2RDXE ", & - "M59N2RDYE ","M59N2RDZE ","M59N2TAXE ","M59N2TAYE ","M59N2TAZE ","M59N2TDXSS","M59N2TDYSS", & - "M59N2TDZSS","M59N3FKXE ","M59N3FKYE ","M59N3FKZE ","M59N3FMXE ","M59N3FMYE ","M59N3FMZE ", & - "M59N3MKXE ","M59N3MKYE ","M59N3MKZE ","M59N3MMXE ","M59N3MMYE ","M59N3MMZE ","M59N3RAXE ", & - "M59N3RAYE ","M59N3RAZE ","M59N3RDXE ","M59N3RDYE ","M59N3RDZE ","M59N3TAXE ","M59N3TAYE ", & - "M59N3TAZE ","M59N3TDXSS","M59N3TDYSS","M59N3TDZSS","M59N4FKXE ","M59N4FKYE ","M59N4FKZE ", & - "M59N4FMXE ","M59N4FMYE ","M59N4FMZE ","M59N4MKXE ","M59N4MKYE ","M59N4MKZE ","M59N4MMXE ", & - "M59N4MMYE ","M59N4MMZE ","M59N4RAXE ","M59N4RAYE ","M59N4RAZE ","M59N4RDXE ","M59N4RDYE ", & - "M59N4RDZE ","M59N4TAXE ","M59N4TAYE ","M59N4TAZE ","M59N4TDXSS","M59N4TDYSS","M59N4TDZSS", & - "M59N5FKXE ","M59N5FKYE ","M59N5FKZE ","M59N5FMXE ","M59N5FMYE ","M59N5FMZE ","M59N5MKXE ", & - "M59N5MKYE ","M59N5MKZE ","M59N5MMXE ","M59N5MMYE ","M59N5MMZE ","M59N5RAXE ","M59N5RAYE ", & - "M59N5RAZE ","M59N5RDXE ","M59N5RDYE ","M59N5RDZE ","M59N5TAXE ","M59N5TAYE ","M59N5TAZE ", & - "M59N5TDXSS","M59N5TDYSS","M59N5TDZSS","M59N6FKXE ","M59N6FKYE ","M59N6FKZE ","M59N6FMXE ", & - "M59N6FMYE ","M59N6FMZE ","M59N6MKXE ","M59N6MKYE ","M59N6MKZE ","M59N6MMXE ","M59N6MMYE ", & - "M59N6MMZE ","M59N6RAXE ","M59N6RAYE ","M59N6RAZE ","M59N6RDXE ","M59N6RDYE ","M59N6RDZE ", & - "M59N6TAXE ","M59N6TAYE ","M59N6TAZE ","M59N6TDXSS","M59N6TDYSS","M59N6TDZSS","M59N7FKXE ", & - "M59N7FKYE ","M59N7FKZE ","M59N7FMXE ","M59N7FMYE ","M59N7FMZE ","M59N7MKXE ","M59N7MKYE ", & - "M59N7MKZE ","M59N7MMXE ","M59N7MMYE ","M59N7MMZE ","M59N7RAXE ","M59N7RAYE ","M59N7RAZE ", & - "M59N7RDXE ","M59N7RDYE ","M59N7RDZE ","M59N7TAXE ","M59N7TAYE ","M59N7TAZE ","M59N7TDXSS", & - "M59N7TDYSS","M59N7TDZSS","M59N8FKXE ","M59N8FKYE ","M59N8FKZE ","M59N8FMXE ","M59N8FMYE ", & - "M59N8FMZE ","M59N8MKXE ","M59N8MKYE ","M59N8MKZE ","M59N8MMXE ","M59N8MMYE ","M59N8MMZE ", & - "M59N8RAXE ","M59N8RAYE ","M59N8RAZE ","M59N8RDXE ","M59N8RDYE ","M59N8RDZE ","M59N8TAXE ", & - "M59N8TAYE ","M59N8TAZE ","M59N8TDXSS","M59N8TDYSS","M59N8TDZSS","M59N9FKXE ","M59N9FKYE ", & - "M59N9FKZE ","M59N9FMXE ","M59N9FMYE ","M59N9FMZE ","M59N9MKXE ","M59N9MKYE ","M59N9MKZE ", & - "M59N9MMXE ","M59N9MMYE ","M59N9MMZE ","M59N9RAXE ","M59N9RAYE ","M59N9RAZE ","M59N9RDXE ", & - "M59N9RDYE ","M59N9RDZE ","M59N9TAXE ","M59N9TAYE ","M59N9TAZE ","M59N9TDXSS","M59N9TDYSS", & - "M59N9TDZSS","M60N1FKXE ","M60N1FKYE ","M60N1FKZE ","M60N1FMXE ","M60N1FMYE ","M60N1FMZE ", & - "M60N1MKXE ","M60N1MKYE ","M60N1MKZE ","M60N1MMXE ","M60N1MMYE ","M60N1MMZE ","M60N1RAXE ", & - "M60N1RAYE ","M60N1RAZE ","M60N1RDXE ","M60N1RDYE ","M60N1RDZE ","M60N1TAXE ","M60N1TAYE ", & - "M60N1TAZE ","M60N1TDXSS","M60N1TDYSS","M60N1TDZSS","M60N2FKXE ","M60N2FKYE ","M60N2FKZE ", & - "M60N2FMXE ","M60N2FMYE ","M60N2FMZE ","M60N2MKXE ","M60N2MKYE ","M60N2MKZE ","M60N2MMXE ", & - "M60N2MMYE ","M60N2MMZE ","M60N2RAXE ","M60N2RAYE ","M60N2RAZE ","M60N2RDXE ","M60N2RDYE ", & - "M60N2RDZE ","M60N2TAXE ","M60N2TAYE ","M60N2TAZE ","M60N2TDXSS","M60N2TDYSS","M60N2TDZSS", & - "M60N3FKXE ","M60N3FKYE ","M60N3FKZE ","M60N3FMXE ","M60N3FMYE ","M60N3FMZE ","M60N3MKXE ", & - "M60N3MKYE ","M60N3MKZE ","M60N3MMXE ","M60N3MMYE ","M60N3MMZE ","M60N3RAXE ","M60N3RAYE ", & - "M60N3RAZE ","M60N3RDXE ","M60N3RDYE ","M60N3RDZE ","M60N3TAXE ","M60N3TAYE ","M60N3TAZE ", & - "M60N3TDXSS","M60N3TDYSS","M60N3TDZSS","M60N4FKXE ","M60N4FKYE ","M60N4FKZE ","M60N4FMXE ", & - "M60N4FMYE ","M60N4FMZE ","M60N4MKXE ","M60N4MKYE ","M60N4MKZE ","M60N4MMXE ","M60N4MMYE ", & - "M60N4MMZE ","M60N4RAXE ","M60N4RAYE ","M60N4RAZE ","M60N4RDXE ","M60N4RDYE ","M60N4RDZE ", & - "M60N4TAXE ","M60N4TAYE ","M60N4TAZE ","M60N4TDXSS","M60N4TDYSS","M60N4TDZSS","M60N5FKXE ", & - "M60N5FKYE ","M60N5FKZE ","M60N5FMXE ","M60N5FMYE ","M60N5FMZE ","M60N5MKXE ","M60N5MKYE ", & - "M60N5MKZE ","M60N5MMXE ","M60N5MMYE ","M60N5MMZE ","M60N5RAXE ","M60N5RAYE ","M60N5RAZE ", & - "M60N5RDXE ","M60N5RDYE ","M60N5RDZE ","M60N5TAXE ","M60N5TAYE ","M60N5TAZE ","M60N5TDXSS", & - "M60N5TDYSS","M60N5TDZSS","M60N6FKXE ","M60N6FKYE ","M60N6FKZE ","M60N6FMXE ","M60N6FMYE ", & - "M60N6FMZE ","M60N6MKXE ","M60N6MKYE ","M60N6MKZE ","M60N6MMXE ","M60N6MMYE ","M60N6MMZE ", & - "M60N6RAXE ","M60N6RAYE ","M60N6RAZE ","M60N6RDXE ","M60N6RDYE ","M60N6RDZE ","M60N6TAXE ", & - "M60N6TAYE ","M60N6TAZE ","M60N6TDXSS","M60N6TDYSS","M60N6TDZSS","M60N7FKXE ","M60N7FKYE ", & - "M60N7FKZE ","M60N7FMXE ","M60N7FMYE ","M60N7FMZE ","M60N7MKXE ","M60N7MKYE ","M60N7MKZE ", & - "M60N7MMXE ","M60N7MMYE ","M60N7MMZE ","M60N7RAXE ","M60N7RAYE ","M60N7RAZE ","M60N7RDXE ", & - "M60N7RDYE ","M60N7RDZE ","M60N7TAXE ","M60N7TAYE ","M60N7TAZE ","M60N7TDXSS","M60N7TDYSS", & - "M60N7TDZSS","M60N8FKXE ","M60N8FKYE ","M60N8FKZE ","M60N8FMXE ","M60N8FMYE ","M60N8FMZE ", & - "M60N8MKXE ","M60N8MKYE ","M60N8MKZE ","M60N8MMXE ","M60N8MMYE ","M60N8MMZE ","M60N8RAXE ", & - "M60N8RAYE ","M60N8RAZE ","M60N8RDXE ","M60N8RDYE ","M60N8RDZE ","M60N8TAXE ","M60N8TAYE ", & - "M60N8TAZE ","M60N8TDXSS","M60N8TDYSS","M60N8TDZSS","M60N9FKXE ","M60N9FKYE ","M60N9FKZE ", & - "M60N9FMXE ","M60N9FMYE ","M60N9FMZE ","M60N9MKXE ","M60N9MKYE ","M60N9MKZE ","M60N9MMXE ", & - "M60N9MMYE ","M60N9MMZE ","M60N9RAXE ","M60N9RAYE ","M60N9RAZE ","M60N9RDXE ","M60N9RDYE ", & - "M60N9RDZE ","M60N9TAXE ","M60N9TAYE ","M60N9TAZE ","M60N9TDXSS","M60N9TDYSS","M60N9TDZSS", & - "M61N1FKXE ","M61N1FKYE ","M61N1FKZE ","M61N1FMXE ","M61N1FMYE ","M61N1FMZE ","M61N1MKXE ", & - "M61N1MKYE ","M61N1MKZE ","M61N1MMXE ","M61N1MMYE ","M61N1MMZE ","M61N1RAXE ","M61N1RAYE ", & - "M61N1RAZE ","M61N1RDXE ","M61N1RDYE ","M61N1RDZE ","M61N1TAXE ","M61N1TAYE ","M61N1TAZE ", & - "M61N1TDXSS","M61N1TDYSS","M61N1TDZSS","M61N2FKXE ","M61N2FKYE ","M61N2FKZE ","M61N2FMXE ", & - "M61N2FMYE ","M61N2FMZE ","M61N2MKXE ","M61N2MKYE ","M61N2MKZE ","M61N2MMXE ","M61N2MMYE ", & - "M61N2MMZE ","M61N2RAXE ","M61N2RAYE ","M61N2RAZE ","M61N2RDXE ","M61N2RDYE ","M61N2RDZE ", & - "M61N2TAXE ","M61N2TAYE ","M61N2TAZE ","M61N2TDXSS","M61N2TDYSS","M61N2TDZSS","M61N3FKXE ", & - "M61N3FKYE ","M61N3FKZE ","M61N3FMXE ","M61N3FMYE ","M61N3FMZE ","M61N3MKXE ","M61N3MKYE ", & - "M61N3MKZE ","M61N3MMXE ","M61N3MMYE ","M61N3MMZE ","M61N3RAXE ","M61N3RAYE ","M61N3RAZE ", & - "M61N3RDXE ","M61N3RDYE ","M61N3RDZE ","M61N3TAXE ","M61N3TAYE ","M61N3TAZE ","M61N3TDXSS", & - "M61N3TDYSS","M61N3TDZSS","M61N4FKXE ","M61N4FKYE ","M61N4FKZE ","M61N4FMXE ","M61N4FMYE ", & - "M61N4FMZE ","M61N4MKXE ","M61N4MKYE ","M61N4MKZE ","M61N4MMXE ","M61N4MMYE ","M61N4MMZE ", & - "M61N4RAXE ","M61N4RAYE ","M61N4RAZE ","M61N4RDXE ","M61N4RDYE ","M61N4RDZE ","M61N4TAXE ", & - "M61N4TAYE ","M61N4TAZE ","M61N4TDXSS","M61N4TDYSS","M61N4TDZSS","M61N5FKXE ","M61N5FKYE ", & - "M61N5FKZE ","M61N5FMXE ","M61N5FMYE ","M61N5FMZE ","M61N5MKXE ","M61N5MKYE ","M61N5MKZE ", & - "M61N5MMXE ","M61N5MMYE ","M61N5MMZE ","M61N5RAXE ","M61N5RAYE ","M61N5RAZE ","M61N5RDXE ", & - "M61N5RDYE ","M61N5RDZE ","M61N5TAXE ","M61N5TAYE ","M61N5TAZE ","M61N5TDXSS","M61N5TDYSS", & - "M61N5TDZSS","M61N6FKXE ","M61N6FKYE ","M61N6FKZE ","M61N6FMXE ","M61N6FMYE ","M61N6FMZE ", & - "M61N6MKXE ","M61N6MKYE ","M61N6MKZE ","M61N6MMXE ","M61N6MMYE ","M61N6MMZE ","M61N6RAXE ", & - "M61N6RAYE ","M61N6RAZE ","M61N6RDXE ","M61N6RDYE ","M61N6RDZE ","M61N6TAXE ","M61N6TAYE ", & - "M61N6TAZE ","M61N6TDXSS","M61N6TDYSS","M61N6TDZSS","M61N7FKXE ","M61N7FKYE ","M61N7FKZE ", & - "M61N7FMXE ","M61N7FMYE ","M61N7FMZE ","M61N7MKXE ","M61N7MKYE ","M61N7MKZE ","M61N7MMXE ", & - "M61N7MMYE ","M61N7MMZE ","M61N7RAXE ","M61N7RAYE ","M61N7RAZE ","M61N7RDXE ","M61N7RDYE ", & - "M61N7RDZE ","M61N7TAXE ","M61N7TAYE ","M61N7TAZE ","M61N7TDXSS","M61N7TDYSS","M61N7TDZSS", & - "M61N8FKXE ","M61N8FKYE ","M61N8FKZE ","M61N8FMXE ","M61N8FMYE ","M61N8FMZE ","M61N8MKXE ", & - "M61N8MKYE ","M61N8MKZE ","M61N8MMXE ","M61N8MMYE ","M61N8MMZE ","M61N8RAXE ","M61N8RAYE ", & - "M61N8RAZE ","M61N8RDXE ","M61N8RDYE ","M61N8RDZE ","M61N8TAXE ","M61N8TAYE ","M61N8TAZE ", & - "M61N8TDXSS","M61N8TDYSS","M61N8TDZSS","M61N9FKXE ","M61N9FKYE ","M61N9FKZE ","M61N9FMXE ", & - "M61N9FMYE ","M61N9FMZE ","M61N9MKXE ","M61N9MKYE ","M61N9MKZE ","M61N9MMXE ","M61N9MMYE ", & - "M61N9MMZE ","M61N9RAXE ","M61N9RAYE ","M61N9RAZE ","M61N9RDXE ","M61N9RDYE ","M61N9RDZE ", & - "M61N9TAXE ","M61N9TAYE ","M61N9TAZE ","M61N9TDXSS","M61N9TDYSS","M61N9TDZSS","M62N1FKXE ", & - "M62N1FKYE ","M62N1FKZE ","M62N1FMXE ","M62N1FMYE ","M62N1FMZE ","M62N1MKXE ","M62N1MKYE ", & - "M62N1MKZE ","M62N1MMXE ","M62N1MMYE ","M62N1MMZE ","M62N1RAXE ","M62N1RAYE ","M62N1RAZE ", & - "M62N1RDXE ","M62N1RDYE ","M62N1RDZE ","M62N1TAXE ","M62N1TAYE ","M62N1TAZE ","M62N1TDXSS", & - "M62N1TDYSS","M62N1TDZSS","M62N2FKXE ","M62N2FKYE ","M62N2FKZE ","M62N2FMXE ","M62N2FMYE ", & - "M62N2FMZE ","M62N2MKXE ","M62N2MKYE ","M62N2MKZE ","M62N2MMXE ","M62N2MMYE ","M62N2MMZE ", & - "M62N2RAXE ","M62N2RAYE ","M62N2RAZE ","M62N2RDXE ","M62N2RDYE ","M62N2RDZE ","M62N2TAXE ", & - "M62N2TAYE ","M62N2TAZE ","M62N2TDXSS","M62N2TDYSS","M62N2TDZSS","M62N3FKXE ","M62N3FKYE ", & - "M62N3FKZE ","M62N3FMXE ","M62N3FMYE ","M62N3FMZE ","M62N3MKXE ","M62N3MKYE ","M62N3MKZE ", & - "M62N3MMXE ","M62N3MMYE ","M62N3MMZE ","M62N3RAXE ","M62N3RAYE ","M62N3RAZE ","M62N3RDXE ", & - "M62N3RDYE ","M62N3RDZE ","M62N3TAXE ","M62N3TAYE ","M62N3TAZE ","M62N3TDXSS","M62N3TDYSS", & - "M62N3TDZSS","M62N4FKXE ","M62N4FKYE ","M62N4FKZE ","M62N4FMXE ","M62N4FMYE ","M62N4FMZE ", & - "M62N4MKXE ","M62N4MKYE ","M62N4MKZE ","M62N4MMXE ","M62N4MMYE ","M62N4MMZE ","M62N4RAXE ", & - "M62N4RAYE ","M62N4RAZE ","M62N4RDXE ","M62N4RDYE ","M62N4RDZE ","M62N4TAXE ","M62N4TAYE ", & - "M62N4TAZE ","M62N4TDXSS","M62N4TDYSS","M62N4TDZSS","M62N5FKXE ","M62N5FKYE ","M62N5FKZE ", & - "M62N5FMXE ","M62N5FMYE ","M62N5FMZE ","M62N5MKXE ","M62N5MKYE ","M62N5MKZE ","M62N5MMXE ", & - "M62N5MMYE ","M62N5MMZE ","M62N5RAXE ","M62N5RAYE ","M62N5RAZE ","M62N5RDXE ","M62N5RDYE ", & - "M62N5RDZE ","M62N5TAXE ","M62N5TAYE ","M62N5TAZE ","M62N5TDXSS","M62N5TDYSS","M62N5TDZSS", & - "M62N6FKXE ","M62N6FKYE ","M62N6FKZE ","M62N6FMXE ","M62N6FMYE ","M62N6FMZE ","M62N6MKXE ", & - "M62N6MKYE ","M62N6MKZE ","M62N6MMXE ","M62N6MMYE ","M62N6MMZE ","M62N6RAXE ","M62N6RAYE ", & - "M62N6RAZE ","M62N6RDXE ","M62N6RDYE ","M62N6RDZE ","M62N6TAXE ","M62N6TAYE ","M62N6TAZE ", & - "M62N6TDXSS","M62N6TDYSS","M62N6TDZSS","M62N7FKXE ","M62N7FKYE ","M62N7FKZE ","M62N7FMXE ", & - "M62N7FMYE ","M62N7FMZE ","M62N7MKXE ","M62N7MKYE ","M62N7MKZE ","M62N7MMXE ","M62N7MMYE ", & - "M62N7MMZE ","M62N7RAXE ","M62N7RAYE ","M62N7RAZE ","M62N7RDXE ","M62N7RDYE ","M62N7RDZE ", & - "M62N7TAXE ","M62N7TAYE ","M62N7TAZE ","M62N7TDXSS"/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry9(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M62N7TDYSS","M62N7TDZSS","M62N8FKXE ","M62N8FKYE ","M62N8FKZE ","M62N8FMXE ","M62N8FMYE ", & - "M62N8FMZE ","M62N8MKXE ","M62N8MKYE ","M62N8MKZE ","M62N8MMXE ","M62N8MMYE ","M62N8MMZE ", & - "M62N8RAXE ","M62N8RAYE ","M62N8RAZE ","M62N8RDXE ","M62N8RDYE ","M62N8RDZE ","M62N8TAXE ", & - "M62N8TAYE ","M62N8TAZE ","M62N8TDXSS","M62N8TDYSS","M62N8TDZSS","M62N9FKXE ","M62N9FKYE ", & - "M62N9FKZE ","M62N9FMXE ","M62N9FMYE ","M62N9FMZE ","M62N9MKXE ","M62N9MKYE ","M62N9MKZE ", & - "M62N9MMXE ","M62N9MMYE ","M62N9MMZE ","M62N9RAXE ","M62N9RAYE ","M62N9RAZE ","M62N9RDXE ", & - "M62N9RDYE ","M62N9RDZE ","M62N9TAXE ","M62N9TAYE ","M62N9TAZE ","M62N9TDXSS","M62N9TDYSS", & - "M62N9TDZSS","M63N1FKXE ","M63N1FKYE ","M63N1FKZE ","M63N1FMXE ","M63N1FMYE ","M63N1FMZE ", & - "M63N1MKXE ","M63N1MKYE ","M63N1MKZE ","M63N1MMXE ","M63N1MMYE ","M63N1MMZE ","M63N1RAXE ", & - "M63N1RAYE ","M63N1RAZE ","M63N1RDXE ","M63N1RDYE ","M63N1RDZE ","M63N1TAXE ","M63N1TAYE ", & - "M63N1TAZE ","M63N1TDXSS","M63N1TDYSS","M63N1TDZSS","M63N2FKXE ","M63N2FKYE ","M63N2FKZE ", & - "M63N2FMXE ","M63N2FMYE ","M63N2FMZE ","M63N2MKXE ","M63N2MKYE ","M63N2MKZE ","M63N2MMXE ", & - "M63N2MMYE ","M63N2MMZE ","M63N2RAXE ","M63N2RAYE ","M63N2RAZE ","M63N2RDXE ","M63N2RDYE ", & - "M63N2RDZE ","M63N2TAXE ","M63N2TAYE ","M63N2TAZE ","M63N2TDXSS","M63N2TDYSS","M63N2TDZSS", & - "M63N3FKXE ","M63N3FKYE ","M63N3FKZE ","M63N3FMXE ","M63N3FMYE ","M63N3FMZE ","M63N3MKXE ", & - "M63N3MKYE ","M63N3MKZE ","M63N3MMXE ","M63N3MMYE ","M63N3MMZE ","M63N3RAXE ","M63N3RAYE ", & - "M63N3RAZE ","M63N3RDXE ","M63N3RDYE ","M63N3RDZE ","M63N3TAXE ","M63N3TAYE ","M63N3TAZE ", & - "M63N3TDXSS","M63N3TDYSS","M63N3TDZSS","M63N4FKXE ","M63N4FKYE ","M63N4FKZE ","M63N4FMXE ", & - "M63N4FMYE ","M63N4FMZE ","M63N4MKXE ","M63N4MKYE ","M63N4MKZE ","M63N4MMXE ","M63N4MMYE ", & - "M63N4MMZE ","M63N4RAXE ","M63N4RAYE ","M63N4RAZE ","M63N4RDXE ","M63N4RDYE ","M63N4RDZE ", & - "M63N4TAXE ","M63N4TAYE ","M63N4TAZE ","M63N4TDXSS","M63N4TDYSS","M63N4TDZSS","M63N5FKXE ", & - "M63N5FKYE ","M63N5FKZE ","M63N5FMXE ","M63N5FMYE ","M63N5FMZE ","M63N5MKXE ","M63N5MKYE ", & - "M63N5MKZE ","M63N5MMXE ","M63N5MMYE ","M63N5MMZE ","M63N5RAXE ","M63N5RAYE ","M63N5RAZE ", & - "M63N5RDXE ","M63N5RDYE ","M63N5RDZE ","M63N5TAXE ","M63N5TAYE ","M63N5TAZE ","M63N5TDXSS", & - "M63N5TDYSS","M63N5TDZSS","M63N6FKXE ","M63N6FKYE ","M63N6FKZE ","M63N6FMXE ","M63N6FMYE ", & - "M63N6FMZE ","M63N6MKXE ","M63N6MKYE ","M63N6MKZE ","M63N6MMXE ","M63N6MMYE ","M63N6MMZE ", & - "M63N6RAXE ","M63N6RAYE ","M63N6RAZE ","M63N6RDXE ","M63N6RDYE ","M63N6RDZE ","M63N6TAXE ", & - "M63N6TAYE ","M63N6TAZE ","M63N6TDXSS","M63N6TDYSS","M63N6TDZSS","M63N7FKXE ","M63N7FKYE ", & - "M63N7FKZE ","M63N7FMXE ","M63N7FMYE ","M63N7FMZE ","M63N7MKXE ","M63N7MKYE ","M63N7MKZE ", & - "M63N7MMXE ","M63N7MMYE ","M63N7MMZE ","M63N7RAXE ","M63N7RAYE ","M63N7RAZE ","M63N7RDXE ", & - "M63N7RDYE ","M63N7RDZE ","M63N7TAXE ","M63N7TAYE ","M63N7TAZE ","M63N7TDXSS","M63N7TDYSS", & - "M63N7TDZSS","M63N8FKXE ","M63N8FKYE ","M63N8FKZE ","M63N8FMXE ","M63N8FMYE ","M63N8FMZE ", & - "M63N8MKXE ","M63N8MKYE ","M63N8MKZE ","M63N8MMXE ","M63N8MMYE ","M63N8MMZE ","M63N8RAXE ", & - "M63N8RAYE ","M63N8RAZE ","M63N8RDXE ","M63N8RDYE ","M63N8RDZE ","M63N8TAXE ","M63N8TAYE ", & - "M63N8TAZE ","M63N8TDXSS","M63N8TDYSS","M63N8TDZSS","M63N9FKXE ","M63N9FKYE ","M63N9FKZE ", & - "M63N9FMXE ","M63N9FMYE ","M63N9FMZE ","M63N9MKXE ","M63N9MKYE ","M63N9MKZE ","M63N9MMXE ", & - "M63N9MMYE ","M63N9MMZE ","M63N9RAXE ","M63N9RAYE ","M63N9RAZE ","M63N9RDXE ","M63N9RDYE ", & - "M63N9RDZE ","M63N9TAXE ","M63N9TAYE ","M63N9TAZE ","M63N9TDXSS","M63N9TDYSS","M63N9TDZSS", & - "M64N1FKXE ","M64N1FKYE ","M64N1FKZE ","M64N1FMXE ","M64N1FMYE ","M64N1FMZE ","M64N1MKXE ", & - "M64N1MKYE ","M64N1MKZE ","M64N1MMXE ","M64N1MMYE ","M64N1MMZE ","M64N1RAXE ","M64N1RAYE ", & - "M64N1RAZE ","M64N1RDXE ","M64N1RDYE ","M64N1RDZE ","M64N1TAXE ","M64N1TAYE ","M64N1TAZE ", & - "M64N1TDXSS","M64N1TDYSS","M64N1TDZSS","M64N2FKXE ","M64N2FKYE ","M64N2FKZE ","M64N2FMXE ", & - "M64N2FMYE ","M64N2FMZE ","M64N2MKXE ","M64N2MKYE ","M64N2MKZE ","M64N2MMXE ","M64N2MMYE ", & - "M64N2MMZE ","M64N2RAXE ","M64N2RAYE ","M64N2RAZE ","M64N2RDXE ","M64N2RDYE ","M64N2RDZE ", & - "M64N2TAXE ","M64N2TAYE ","M64N2TAZE ","M64N2TDXSS","M64N2TDYSS","M64N2TDZSS","M64N3FKXE ", & - "M64N3FKYE ","M64N3FKZE ","M64N3FMXE ","M64N3FMYE ","M64N3FMZE ","M64N3MKXE ","M64N3MKYE ", & - "M64N3MKZE ","M64N3MMXE ","M64N3MMYE ","M64N3MMZE ","M64N3RAXE ","M64N3RAYE ","M64N3RAZE ", & - "M64N3RDXE ","M64N3RDYE ","M64N3RDZE ","M64N3TAXE ","M64N3TAYE ","M64N3TAZE ","M64N3TDXSS", & - "M64N3TDYSS","M64N3TDZSS","M64N4FKXE ","M64N4FKYE ","M64N4FKZE ","M64N4FMXE ","M64N4FMYE ", & - "M64N4FMZE ","M64N4MKXE ","M64N4MKYE ","M64N4MKZE ","M64N4MMXE ","M64N4MMYE ","M64N4MMZE ", & - "M64N4RAXE ","M64N4RAYE ","M64N4RAZE ","M64N4RDXE ","M64N4RDYE ","M64N4RDZE ","M64N4TAXE ", & - "M64N4TAYE ","M64N4TAZE ","M64N4TDXSS","M64N4TDYSS","M64N4TDZSS","M64N5FKXE ","M64N5FKYE ", & - "M64N5FKZE ","M64N5FMXE ","M64N5FMYE ","M64N5FMZE ","M64N5MKXE ","M64N5MKYE ","M64N5MKZE ", & - "M64N5MMXE ","M64N5MMYE ","M64N5MMZE ","M64N5RAXE ","M64N5RAYE ","M64N5RAZE ","M64N5RDXE ", & - "M64N5RDYE ","M64N5RDZE ","M64N5TAXE ","M64N5TAYE ","M64N5TAZE ","M64N5TDXSS","M64N5TDYSS", & - "M64N5TDZSS","M64N6FKXE ","M64N6FKYE ","M64N6FKZE ","M64N6FMXE ","M64N6FMYE ","M64N6FMZE ", & - "M64N6MKXE ","M64N6MKYE ","M64N6MKZE ","M64N6MMXE ","M64N6MMYE ","M64N6MMZE ","M64N6RAXE ", & - "M64N6RAYE ","M64N6RAZE ","M64N6RDXE ","M64N6RDYE ","M64N6RDZE ","M64N6TAXE ","M64N6TAYE ", & - "M64N6TAZE ","M64N6TDXSS","M64N6TDYSS","M64N6TDZSS","M64N7FKXE ","M64N7FKYE ","M64N7FKZE ", & - "M64N7FMXE ","M64N7FMYE ","M64N7FMZE ","M64N7MKXE ","M64N7MKYE ","M64N7MKZE ","M64N7MMXE ", & - "M64N7MMYE ","M64N7MMZE ","M64N7RAXE ","M64N7RAYE ","M64N7RAZE ","M64N7RDXE ","M64N7RDYE ", & - "M64N7RDZE ","M64N7TAXE ","M64N7TAYE ","M64N7TAZE ","M64N7TDXSS","M64N7TDYSS","M64N7TDZSS", & - "M64N8FKXE ","M64N8FKYE ","M64N8FKZE ","M64N8FMXE ","M64N8FMYE ","M64N8FMZE ","M64N8MKXE ", & - "M64N8MKYE ","M64N8MKZE ","M64N8MMXE ","M64N8MMYE ","M64N8MMZE ","M64N8RAXE ","M64N8RAYE ", & - "M64N8RAZE ","M64N8RDXE ","M64N8RDYE ","M64N8RDZE ","M64N8TAXE ","M64N8TAYE ","M64N8TAZE ", & - "M64N8TDXSS","M64N8TDYSS","M64N8TDZSS","M64N9FKXE ","M64N9FKYE ","M64N9FKZE ","M64N9FMXE ", & - "M64N9FMYE ","M64N9FMZE ","M64N9MKXE ","M64N9MKYE ","M64N9MKZE ","M64N9MMXE ","M64N9MMYE ", & - "M64N9MMZE ","M64N9RAXE ","M64N9RAYE ","M64N9RAZE ","M64N9RDXE ","M64N9RDYE ","M64N9RDZE ", & - "M64N9TAXE ","M64N9TAYE ","M64N9TAZE ","M64N9TDXSS","M64N9TDYSS","M64N9TDZSS","M65N1FKXE ", & - "M65N1FKYE ","M65N1FKZE ","M65N1FMXE ","M65N1FMYE ","M65N1FMZE ","M65N1MKXE ","M65N1MKYE ", & - "M65N1MKZE ","M65N1MMXE ","M65N1MMYE ","M65N1MMZE ","M65N1RAXE ","M65N1RAYE ","M65N1RAZE ", & - "M65N1RDXE ","M65N1RDYE ","M65N1RDZE ","M65N1TAXE ","M65N1TAYE ","M65N1TAZE ","M65N1TDXSS", & - "M65N1TDYSS","M65N1TDZSS","M65N2FKXE ","M65N2FKYE ","M65N2FKZE ","M65N2FMXE ","M65N2FMYE ", & - "M65N2FMZE ","M65N2MKXE ","M65N2MKYE ","M65N2MKZE ","M65N2MMXE ","M65N2MMYE ","M65N2MMZE ", & - "M65N2RAXE ","M65N2RAYE ","M65N2RAZE ","M65N2RDXE ","M65N2RDYE ","M65N2RDZE ","M65N2TAXE ", & - "M65N2TAYE ","M65N2TAZE ","M65N2TDXSS","M65N2TDYSS","M65N2TDZSS","M65N3FKXE ","M65N3FKYE ", & - "M65N3FKZE ","M65N3FMXE ","M65N3FMYE ","M65N3FMZE ","M65N3MKXE ","M65N3MKYE ","M65N3MKZE ", & - "M65N3MMXE ","M65N3MMYE ","M65N3MMZE ","M65N3RAXE ","M65N3RAYE ","M65N3RAZE ","M65N3RDXE ", & - "M65N3RDYE ","M65N3RDZE ","M65N3TAXE ","M65N3TAYE ","M65N3TAZE ","M65N3TDXSS","M65N3TDYSS", & - "M65N3TDZSS","M65N4FKXE ","M65N4FKYE ","M65N4FKZE ","M65N4FMXE ","M65N4FMYE ","M65N4FMZE ", & - "M65N4MKXE ","M65N4MKYE ","M65N4MKZE ","M65N4MMXE ","M65N4MMYE ","M65N4MMZE ","M65N4RAXE ", & - "M65N4RAYE ","M65N4RAZE ","M65N4RDXE ","M65N4RDYE ","M65N4RDZE ","M65N4TAXE ","M65N4TAYE ", & - "M65N4TAZE ","M65N4TDXSS","M65N4TDYSS","M65N4TDZSS","M65N5FKXE ","M65N5FKYE ","M65N5FKZE ", & - "M65N5FMXE ","M65N5FMYE ","M65N5FMZE ","M65N5MKXE ","M65N5MKYE ","M65N5MKZE ","M65N5MMXE ", & - "M65N5MMYE ","M65N5MMZE ","M65N5RAXE ","M65N5RAYE ","M65N5RAZE ","M65N5RDXE ","M65N5RDYE ", & - "M65N5RDZE ","M65N5TAXE ","M65N5TAYE ","M65N5TAZE ","M65N5TDXSS","M65N5TDYSS","M65N5TDZSS", & - "M65N6FKXE ","M65N6FKYE ","M65N6FKZE ","M65N6FMXE ","M65N6FMYE ","M65N6FMZE ","M65N6MKXE ", & - "M65N6MKYE ","M65N6MKZE ","M65N6MMXE ","M65N6MMYE ","M65N6MMZE ","M65N6RAXE ","M65N6RAYE ", & - "M65N6RAZE ","M65N6RDXE ","M65N6RDYE ","M65N6RDZE ","M65N6TAXE ","M65N6TAYE ","M65N6TAZE ", & - "M65N6TDXSS","M65N6TDYSS","M65N6TDZSS","M65N7FKXE ","M65N7FKYE ","M65N7FKZE ","M65N7FMXE ", & - "M65N7FMYE ","M65N7FMZE ","M65N7MKXE ","M65N7MKYE ","M65N7MKZE ","M65N7MMXE ","M65N7MMYE ", & - "M65N7MMZE ","M65N7RAXE ","M65N7RAYE ","M65N7RAZE ","M65N7RDXE ","M65N7RDYE ","M65N7RDZE ", & - "M65N7TAXE ","M65N7TAYE ","M65N7TAZE ","M65N7TDXSS","M65N7TDYSS","M65N7TDZSS","M65N8FKXE ", & - "M65N8FKYE ","M65N8FKZE ","M65N8FMXE ","M65N8FMYE ","M65N8FMZE ","M65N8MKXE ","M65N8MKYE ", & - "M65N8MKZE ","M65N8MMXE ","M65N8MMYE ","M65N8MMZE ","M65N8RAXE ","M65N8RAYE ","M65N8RAZE ", & - "M65N8RDXE ","M65N8RDYE ","M65N8RDZE ","M65N8TAXE ","M65N8TAYE ","M65N8TAZE ","M65N8TDXSS", & - "M65N8TDYSS","M65N8TDZSS","M65N9FKXE ","M65N9FKYE ","M65N9FKZE ","M65N9FMXE ","M65N9FMYE ", & - "M65N9FMZE ","M65N9MKXE ","M65N9MKYE ","M65N9MKZE ","M65N9MMXE ","M65N9MMYE ","M65N9MMZE ", & - "M65N9RAXE ","M65N9RAYE ","M65N9RAZE ","M65N9RDXE ","M65N9RDYE ","M65N9RDZE ","M65N9TAXE ", & - "M65N9TAYE ","M65N9TAZE ","M65N9TDXSS","M65N9TDYSS","M65N9TDZSS","M66N1FKXE ","M66N1FKYE ", & - "M66N1FKZE ","M66N1FMXE ","M66N1FMYE ","M66N1FMZE ","M66N1MKXE ","M66N1MKYE ","M66N1MKZE ", & - "M66N1MMXE ","M66N1MMYE ","M66N1MMZE ","M66N1RAXE ","M66N1RAYE ","M66N1RAZE ","M66N1RDXE ", & - "M66N1RDYE ","M66N1RDZE ","M66N1TAXE ","M66N1TAYE ","M66N1TAZE ","M66N1TDXSS","M66N1TDYSS", & - "M66N1TDZSS","M66N2FKXE ","M66N2FKYE ","M66N2FKZE ","M66N2FMXE ","M66N2FMYE ","M66N2FMZE ", & - "M66N2MKXE ","M66N2MKYE ","M66N2MKZE ","M66N2MMXE ","M66N2MMYE ","M66N2MMZE ","M66N2RAXE ", & - "M66N2RAYE ","M66N2RAZE ","M66N2RDXE ","M66N2RDYE ","M66N2RDZE ","M66N2TAXE ","M66N2TAYE ", & - "M66N2TAZE ","M66N2TDXSS","M66N2TDYSS","M66N2TDZSS","M66N3FKXE ","M66N3FKYE ","M66N3FKZE ", & - "M66N3FMXE ","M66N3FMYE ","M66N3FMZE ","M66N3MKXE ","M66N3MKYE ","M66N3MKZE ","M66N3MMXE ", & - "M66N3MMYE ","M66N3MMZE ","M66N3RAXE ","M66N3RAYE ","M66N3RAZE ","M66N3RDXE ","M66N3RDYE ", & - "M66N3RDZE ","M66N3TAXE ","M66N3TAYE ","M66N3TAZE ","M66N3TDXSS","M66N3TDYSS","M66N3TDZSS", & - "M66N4FKXE ","M66N4FKYE ","M66N4FKZE ","M66N4FMXE ","M66N4FMYE ","M66N4FMZE ","M66N4MKXE ", & - "M66N4MKYE ","M66N4MKZE ","M66N4MMXE ","M66N4MMYE ","M66N4MMZE ","M66N4RAXE ","M66N4RAYE ", & - "M66N4RAZE ","M66N4RDXE ","M66N4RDYE ","M66N4RDZE ","M66N4TAXE ","M66N4TAYE ","M66N4TAZE ", & - "M66N4TDXSS","M66N4TDYSS","M66N4TDZSS","M66N5FKXE ","M66N5FKYE ","M66N5FKZE ","M66N5FMXE ", & - "M66N5FMYE ","M66N5FMZE ","M66N5MKXE ","M66N5MKYE ","M66N5MKZE ","M66N5MMXE ","M66N5MMYE ", & - "M66N5MMZE ","M66N5RAXE ","M66N5RAYE ","M66N5RAZE ","M66N5RDXE ","M66N5RDYE ","M66N5RDZE ", & - "M66N5TAXE ","M66N5TAYE ","M66N5TAZE ","M66N5TDXSS","M66N5TDYSS","M66N5TDZSS","M66N6FKXE ", & - "M66N6FKYE ","M66N6FKZE ","M66N6FMXE ","M66N6FMYE ","M66N6FMZE ","M66N6MKXE ","M66N6MKYE ", & - "M66N6MKZE ","M66N6MMXE ","M66N6MMYE ","M66N6MMZE ","M66N6RAXE ","M66N6RAYE ","M66N6RAZE ", & - "M66N6RDXE ","M66N6RDYE ","M66N6RDZE ","M66N6TAXE ","M66N6TAYE ","M66N6TAZE ","M66N6TDXSS", & - "M66N6TDYSS","M66N6TDZSS","M66N7FKXE ","M66N7FKYE ","M66N7FKZE ","M66N7FMXE ","M66N7FMYE ", & - "M66N7FMZE ","M66N7MKXE ","M66N7MKYE ","M66N7MKZE ","M66N7MMXE ","M66N7MMYE ","M66N7MMZE ", & - "M66N7RAXE ","M66N7RAYE ","M66N7RAZE ","M66N7RDXE ","M66N7RDYE ","M66N7RDZE ","M66N7TAXE ", & - "M66N7TAYE ","M66N7TAZE ","M66N7TDXSS","M66N7TDYSS","M66N7TDZSS","M66N8FKXE ","M66N8FKYE ", & - "M66N8FKZE ","M66N8FMXE ","M66N8FMYE ","M66N8FMZE ","M66N8MKXE ","M66N8MKYE ","M66N8MKZE ", & - "M66N8MMXE ","M66N8MMYE ","M66N8MMZE ","M66N8RAXE ","M66N8RAYE ","M66N8RAZE ","M66N8RDXE ", & - "M66N8RDYE ","M66N8RDZE ","M66N8TAXE ","M66N8TAYE ","M66N8TAZE ","M66N8TDXSS","M66N8TDYSS", & - "M66N8TDZSS","M66N9FKXE ","M66N9FKYE ","M66N9FKZE ","M66N9FMXE ","M66N9FMYE ","M66N9FMZE ", & - "M66N9MKXE ","M66N9MKYE ","M66N9MKZE ","M66N9MMXE ","M66N9MMYE ","M66N9MMZE ","M66N9RAXE ", & - "M66N9RAYE ","M66N9RAZE ","M66N9RDXE ","M66N9RDYE ","M66N9RDZE ","M66N9TAXE ","M66N9TAYE ", & - "M66N9TAZE ","M66N9TDXSS","M66N9TDYSS","M66N9TDZSS","M67N1FKXE ","M67N1FKYE ","M67N1FKZE ", & - "M67N1FMXE ","M67N1FMYE ","M67N1FMZE ","M67N1MKXE ","M67N1MKYE ","M67N1MKZE ","M67N1MMXE ", & - "M67N1MMYE ","M67N1MMZE ","M67N1RAXE ","M67N1RAYE ","M67N1RAZE ","M67N1RDXE ","M67N1RDYE ", & - "M67N1RDZE ","M67N1TAXE ","M67N1TAYE ","M67N1TAZE ","M67N1TDXSS","M67N1TDYSS","M67N1TDZSS", & - "M67N2FKXE ","M67N2FKYE ","M67N2FKZE ","M67N2FMXE ","M67N2FMYE ","M67N2FMZE ","M67N2MKXE ", & - "M67N2MKYE ","M67N2MKZE ","M67N2MMXE ","M67N2MMYE ","M67N2MMZE ","M67N2RAXE ","M67N2RAYE ", & - "M67N2RAZE ","M67N2RDXE ","M67N2RDYE ","M67N2RDZE ","M67N2TAXE ","M67N2TAYE ","M67N2TAZE ", & - "M67N2TDXSS","M67N2TDYSS","M67N2TDZSS","M67N3FKXE ","M67N3FKYE ","M67N3FKZE ","M67N3FMXE ", & - "M67N3FMYE ","M67N3FMZE ","M67N3MKXE ","M67N3MKYE ","M67N3MKZE ","M67N3MMXE ","M67N3MMYE ", & - "M67N3MMZE ","M67N3RAXE ","M67N3RAYE ","M67N3RAZE ","M67N3RDXE ","M67N3RDYE ","M67N3RDZE ", & - "M67N3TAXE ","M67N3TAYE ","M67N3TAZE ","M67N3TDXSS","M67N3TDYSS","M67N3TDZSS","M67N4FKXE ", & - "M67N4FKYE ","M67N4FKZE ","M67N4FMXE ","M67N4FMYE ","M67N4FMZE ","M67N4MKXE ","M67N4MKYE ", & - "M67N4MKZE ","M67N4MMXE ","M67N4MMYE ","M67N4MMZE ","M67N4RAXE ","M67N4RAYE ","M67N4RAZE ", & - "M67N4RDXE ","M67N4RDYE ","M67N4RDZE ","M67N4TAXE ","M67N4TAYE ","M67N4TAZE ","M67N4TDXSS", & - "M67N4TDYSS","M67N4TDZSS","M67N5FKXE ","M67N5FKYE ","M67N5FKZE ","M67N5FMXE ","M67N5FMYE ", & - "M67N5FMZE ","M67N5MKXE ","M67N5MKYE ","M67N5MKZE ","M67N5MMXE ","M67N5MMYE ","M67N5MMZE ", & - "M67N5RAXE ","M67N5RAYE ","M67N5RAZE ","M67N5RDXE ","M67N5RDYE ","M67N5RDZE ","M67N5TAXE ", & - "M67N5TAYE ","M67N5TAZE ","M67N5TDXSS","M67N5TDYSS","M67N5TDZSS","M67N6FKXE ","M67N6FKYE ", & - "M67N6FKZE ","M67N6FMXE ","M67N6FMYE ","M67N6FMZE ","M67N6MKXE ","M67N6MKYE ","M67N6MKZE ", & - "M67N6MMXE ","M67N6MMYE ","M67N6MMZE ","M67N6RAXE ","M67N6RAYE ","M67N6RAZE ","M67N6RDXE ", & - "M67N6RDYE ","M67N6RDZE ","M67N6TAXE ","M67N6TAYE ","M67N6TAZE ","M67N6TDXSS","M67N6TDYSS", & - "M67N6TDZSS","M67N7FKXE ","M67N7FKYE ","M67N7FKZE ","M67N7FMXE ","M67N7FMYE ","M67N7FMZE ", & - "M67N7MKXE ","M67N7MKYE ","M67N7MKZE ","M67N7MMXE ","M67N7MMYE ","M67N7MMZE ","M67N7RAXE ", & - "M67N7RAYE ","M67N7RAZE ","M67N7RDXE ","M67N7RDYE ","M67N7RDZE ","M67N7TAXE ","M67N7TAYE ", & - "M67N7TAZE ","M67N7TDXSS","M67N7TDYSS","M67N7TDZSS","M67N8FKXE ","M67N8FKYE ","M67N8FKZE ", & - "M67N8FMXE ","M67N8FMYE ","M67N8FMZE ","M67N8MKXE ","M67N8MKYE ","M67N8MKZE ","M67N8MMXE ", & - "M67N8MMYE ","M67N8MMZE ","M67N8RAXE ","M67N8RAYE ","M67N8RAZE ","M67N8RDXE ","M67N8RDYE ", & - "M67N8RDZE ","M67N8TAXE ","M67N8TAYE ","M67N8TAZE ","M67N8TDXSS","M67N8TDYSS","M67N8TDZSS", & - "M67N9FKXE ","M67N9FKYE ","M67N9FKZE ","M67N9FMXE ","M67N9FMYE ","M67N9FMZE ","M67N9MKXE ", & - "M67N9MKYE ","M67N9MKZE ","M67N9MMXE ","M67N9MMYE ","M67N9MMZE ","M67N9RAXE ","M67N9RAYE ", & - "M67N9RAZE ","M67N9RDXE ","M67N9RDYE ","M67N9RDZE ","M67N9TAXE ","M67N9TAYE ","M67N9TAZE ", & - "M67N9TDXSS","M67N9TDYSS","M67N9TDZSS","M68N1FKXE ","M68N1FKYE ","M68N1FKZE ","M68N1FMXE ", & - "M68N1FMYE ","M68N1FMZE ","M68N1MKXE ","M68N1MKYE ","M68N1MKZE ","M68N1MMXE ","M68N1MMYE ", & - "M68N1MMZE ","M68N1RAXE ","M68N1RAYE ","M68N1RAZE ","M68N1RDXE ","M68N1RDYE ","M68N1RDZE ", & - "M68N1TAXE ","M68N1TAYE ","M68N1TAZE ","M68N1TDXSS","M68N1TDYSS","M68N1TDZSS","M68N2FKXE ", & - "M68N2FKYE ","M68N2FKZE ","M68N2FMXE ","M68N2FMYE ","M68N2FMZE ","M68N2MKXE ","M68N2MKYE ", & - "M68N2MKZE ","M68N2MMXE ","M68N2MMYE ","M68N2MMZE ","M68N2RAXE ","M68N2RAYE ","M68N2RAZE ", & - "M68N2RDXE ","M68N2RDYE ","M68N2RDZE ","M68N2TAXE ","M68N2TAYE ","M68N2TAZE ","M68N2TDXSS", & - "M68N2TDYSS","M68N2TDZSS","M68N3FKXE ","M68N3FKYE ","M68N3FKZE ","M68N3FMXE ","M68N3FMYE ", & - "M68N3FMZE ","M68N3MKXE ","M68N3MKYE ","M68N3MKZE ","M68N3MMXE ","M68N3MMYE ","M68N3MMZE ", & - "M68N3RAXE ","M68N3RAYE ","M68N3RAZE ","M68N3RDXE ","M68N3RDYE ","M68N3RDZE ","M68N3TAXE ", & - "M68N3TAYE ","M68N3TAZE ","M68N3TDXSS","M68N3TDYSS","M68N3TDZSS","M68N4FKXE ","M68N4FKYE ", & - "M68N4FKZE ","M68N4FMXE ","M68N4FMYE ","M68N4FMZE ","M68N4MKXE ","M68N4MKYE ","M68N4MKZE ", & - "M68N4MMXE ","M68N4MMYE ","M68N4MMZE ","M68N4RAXE ","M68N4RAYE ","M68N4RAZE ","M68N4RDXE ", & - "M68N4RDYE ","M68N4RDZE ","M68N4TAXE ","M68N4TAYE ","M68N4TAZE ","M68N4TDXSS","M68N4TDYSS", & - "M68N4TDZSS","M68N5FKXE ","M68N5FKYE ","M68N5FKZE ","M68N5FMXE ","M68N5FMYE ","M68N5FMZE ", & - "M68N5MKXE ","M68N5MKYE ","M68N5MKZE ","M68N5MMXE ","M68N5MMYE ","M68N5MMZE ","M68N5RAXE ", & - "M68N5RAYE ","M68N5RAZE ","M68N5RDXE ","M68N5RDYE ","M68N5RDZE ","M68N5TAXE ","M68N5TAYE ", & - "M68N5TAZE ","M68N5TDXSS","M68N5TDYSS","M68N5TDZSS","M68N6FKXE ","M68N6FKYE ","M68N6FKZE ", & - "M68N6FMXE ","M68N6FMYE ","M68N6FMZE ","M68N6MKXE ","M68N6MKYE ","M68N6MKZE ","M68N6MMXE ", & - "M68N6MMYE ","M68N6MMZE ","M68N6RAXE ","M68N6RAYE ","M68N6RAZE ","M68N6RDXE ","M68N6RDYE ", & - "M68N6RDZE ","M68N6TAXE ","M68N6TAYE ","M68N6TAZE ","M68N6TDXSS","M68N6TDYSS","M68N6TDZSS", & - "M68N7FKXE ","M68N7FKYE ","M68N7FKZE ","M68N7FMXE ","M68N7FMYE ","M68N7FMZE ","M68N7MKXE ", & - "M68N7MKYE ","M68N7MKZE ","M68N7MMXE ","M68N7MMYE ","M68N7MMZE ","M68N7RAXE ","M68N7RAYE ", & - "M68N7RAZE ","M68N7RDXE ","M68N7RDYE ","M68N7RDZE ","M68N7TAXE ","M68N7TAYE ","M68N7TAZE ", & - "M68N7TDXSS","M68N7TDYSS","M68N7TDZSS","M68N8FKXE ","M68N8FKYE ","M68N8FKZE ","M68N8FMXE ", & - "M68N8FMYE ","M68N8FMZE ","M68N8MKXE ","M68N8MKYE ","M68N8MKZE ","M68N8MMXE ","M68N8MMYE ", & - "M68N8MMZE ","M68N8RAXE ","M68N8RAYE ","M68N8RAZE ","M68N8RDXE ","M68N8RDYE ","M68N8RDZE ", & - "M68N8TAXE ","M68N8TAYE ","M68N8TAZE ","M68N8TDXSS","M68N8TDYSS","M68N8TDZSS","M68N9FKXE ", & - "M68N9FKYE ","M68N9FKZE ","M68N9FMXE ","M68N9FMYE ","M68N9FMZE ","M68N9MKXE ","M68N9MKYE ", & - "M68N9MKZE ","M68N9MMXE ","M68N9MMYE ","M68N9MMZE ","M68N9RAXE ","M68N9RAYE ","M68N9RAZE ", & - "M68N9RDXE ","M68N9RDYE ","M68N9RDZE ","M68N9TAXE ","M68N9TAYE ","M68N9TAZE ","M68N9TDXSS", & - "M68N9TDYSS","M68N9TDZSS","M69N1FKXE ","M69N1FKYE ","M69N1FKZE ","M69N1FMXE ","M69N1FMYE ", & - "M69N1FMZE ","M69N1MKXE ","M69N1MKYE ","M69N1MKZE ","M69N1MMXE ","M69N1MMYE ","M69N1MMZE ", & - "M69N1RAXE ","M69N1RAYE ","M69N1RAZE ","M69N1RDXE ","M69N1RDYE ","M69N1RDZE ","M69N1TAXE ", & - "M69N1TAYE ","M69N1TAZE ","M69N1TDXSS","M69N1TDYSS","M69N1TDZSS","M69N2FKXE ","M69N2FKYE ", & - "M69N2FKZE ","M69N2FMXE ","M69N2FMYE ","M69N2FMZE ","M69N2MKXE ","M69N2MKYE ","M69N2MKZE ", & - "M69N2MMXE ","M69N2MMYE ","M69N2MMZE ","M69N2RAXE ","M69N2RAYE ","M69N2RAZE ","M69N2RDXE ", & - "M69N2RDYE ","M69N2RDZE ","M69N2TAXE ","M69N2TAYE ","M69N2TAZE ","M69N2TDXSS","M69N2TDYSS", & - "M69N2TDZSS","M69N3FKXE ","M69N3FKYE ","M69N3FKZE ","M69N3FMXE ","M69N3FMYE ","M69N3FMZE ", & - "M69N3MKXE ","M69N3MKYE ","M69N3MKZE ","M69N3MMXE ","M69N3MMYE ","M69N3MMZE ","M69N3RAXE ", & - "M69N3RAYE ","M69N3RAZE ","M69N3RDXE ","M69N3RDYE ","M69N3RDZE ","M69N3TAXE ","M69N3TAYE ", & - "M69N3TAZE ","M69N3TDXSS","M69N3TDYSS","M69N3TDZSS","M69N4FKXE ","M69N4FKYE ","M69N4FKZE ", & - "M69N4FMXE ","M69N4FMYE ","M69N4FMZE ","M69N4MKXE ","M69N4MKYE ","M69N4MKZE ","M69N4MMXE ", & - "M69N4MMYE ","M69N4MMZE ","M69N4RAXE ","M69N4RAYE ","M69N4RAZE ","M69N4RDXE ","M69N4RDYE ", & - "M69N4RDZE ","M69N4TAXE ","M69N4TAYE ","M69N4TAZE ","M69N4TDXSS","M69N4TDYSS","M69N4TDZSS", & - "M69N5FKXE ","M69N5FKYE ","M69N5FKZE ","M69N5FMXE ","M69N5FMYE ","M69N5FMZE ","M69N5MKXE ", & - "M69N5MKYE ","M69N5MKZE ","M69N5MMXE ","M69N5MMYE ","M69N5MMZE ","M69N5RAXE ","M69N5RAYE ", & - "M69N5RAZE ","M69N5RDXE ","M69N5RDYE ","M69N5RDZE ","M69N5TAXE ","M69N5TAYE ","M69N5TAZE ", & - "M69N5TDXSS","M69N5TDYSS","M69N5TDZSS","M69N6FKXE ","M69N6FKYE ","M69N6FKZE ","M69N6FMXE ", & - "M69N6FMYE ","M69N6FMZE ","M69N6MKXE ","M69N6MKYE ","M69N6MKZE ","M69N6MMXE ","M69N6MMYE ", & - "M69N6MMZE ","M69N6RAXE ","M69N6RAYE ","M69N6RAZE ","M69N6RDXE ","M69N6RDYE ","M69N6RDZE ", & - "M69N6TAXE ","M69N6TAYE ","M69N6TAZE ","M69N6TDXSS","M69N6TDYSS","M69N6TDZSS","M69N7FKXE ", & - "M69N7FKYE ","M69N7FKZE ","M69N7FMXE ","M69N7FMYE ","M69N7FMZE ","M69N7MKXE ","M69N7MKYE ", & - "M69N7MKZE ","M69N7MMXE ","M69N7MMYE ","M69N7MMZE ","M69N7RAXE ","M69N7RAYE ","M69N7RAZE ", & - "M69N7RDXE ","M69N7RDYE ","M69N7RDZE ","M69N7TAXE ","M69N7TAYE ","M69N7TAZE ","M69N7TDXSS", & - "M69N7TDYSS","M69N7TDZSS","M69N8FKXE ","M69N8FKYE ","M69N8FKZE ","M69N8FMXE ","M69N8FMYE ", & - "M69N8FMZE ","M69N8MKXE ","M69N8MKYE ","M69N8MKZE ","M69N8MMXE ","M69N8MMYE ","M69N8MMZE ", & - "M69N8RAXE ","M69N8RAYE ","M69N8RAZE ","M69N8RDXE ","M69N8RDYE ","M69N8RDZE ","M69N8TAXE ", & - "M69N8TAYE ","M69N8TAZE ","M69N8TDXSS","M69N8TDYSS","M69N8TDZSS","M69N9FKXE ","M69N9FKYE ", & - "M69N9FKZE ","M69N9FMXE ","M69N9FMYE ","M69N9FMZE ","M69N9MKXE ","M69N9MKYE ","M69N9MKZE ", & - "M69N9MMXE ","M69N9MMYE ","M69N9MMZE ","M69N9RAXE ","M69N9RAYE ","M69N9RAZE ","M69N9RDXE ", & - "M69N9RDYE ","M69N9RDZE ","M69N9TAXE ","M69N9TAYE ","M69N9TAZE ","M69N9TDXSS","M69N9TDYSS", & - "M69N9TDZSS","M70N1FKXE ","M70N1FKYE ","M70N1FKZE ","M70N1FMXE ","M70N1FMYE ","M70N1FMZE ", & - "M70N1MKXE ","M70N1MKYE ","M70N1MKZE ","M70N1MMXE ","M70N1MMYE ","M70N1MMZE ","M70N1RAXE ", & - "M70N1RAYE ","M70N1RAZE ","M70N1RDXE ","M70N1RDYE ","M70N1RDZE ","M70N1TAXE ","M70N1TAYE ", & - "M70N1TAZE ","M70N1TDXSS","M70N1TDYSS","M70N1TDZSS","M70N2FKXE ","M70N2FKYE ","M70N2FKZE ", & - "M70N2FMXE ","M70N2FMYE ","M70N2FMZE ","M70N2MKXE ","M70N2MKYE ","M70N2MKZE ","M70N2MMXE ", & - "M70N2MMYE ","M70N2MMZE ","M70N2RAXE ","M70N2RAYE ","M70N2RAZE ","M70N2RDXE ","M70N2RDYE ", & - "M70N2RDZE ","M70N2TAXE ","M70N2TAYE ","M70N2TAZE ","M70N2TDXSS","M70N2TDYSS","M70N2TDZSS", & - "M70N3FKXE ","M70N3FKYE ","M70N3FKZE ","M70N3FMXE ","M70N3FMYE ","M70N3FMZE ","M70N3MKXE ", & - "M70N3MKYE ","M70N3MKZE ","M70N3MMXE ","M70N3MMYE ","M70N3MMZE ","M70N3RAXE ","M70N3RAYE ", & - "M70N3RAZE ","M70N3RDXE ","M70N3RDYE ","M70N3RDZE ","M70N3TAXE ","M70N3TAYE ","M70N3TAZE ", & - "M70N3TDXSS","M70N3TDYSS","M70N3TDZSS","M70N4FKXE ","M70N4FKYE ","M70N4FKZE ","M70N4FMXE ", & - "M70N4FMYE ","M70N4FMZE ","M70N4MKXE ","M70N4MKYE ","M70N4MKZE ","M70N4MMXE ","M70N4MMYE ", & - "M70N4MMZE ","M70N4RAXE ","M70N4RAYE ","M70N4RAZE ","M70N4RDXE ","M70N4RDYE ","M70N4RDZE ", & - "M70N4TAXE ","M70N4TAYE ","M70N4TAZE ","M70N4TDXSS","M70N4TDYSS","M70N4TDZSS","M70N5FKXE ", & - "M70N5FKYE ","M70N5FKZE ","M70N5FMXE ","M70N5FMYE ","M70N5FMZE ","M70N5MKXE ","M70N5MKYE ", & - "M70N5MKZE ","M70N5MMXE ","M70N5MMYE ","M70N5MMZE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry10(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M70N5RAXE ","M70N5RAYE ","M70N5RAZE ","M70N5RDXE ","M70N5RDYE ","M70N5RDZE ","M70N5TAXE ", & - "M70N5TAYE ","M70N5TAZE ","M70N5TDXSS","M70N5TDYSS","M70N5TDZSS","M70N6FKXE ","M70N6FKYE ", & - "M70N6FKZE ","M70N6FMXE ","M70N6FMYE ","M70N6FMZE ","M70N6MKXE ","M70N6MKYE ","M70N6MKZE ", & - "M70N6MMXE ","M70N6MMYE ","M70N6MMZE ","M70N6RAXE ","M70N6RAYE ","M70N6RAZE ","M70N6RDXE ", & - "M70N6RDYE ","M70N6RDZE ","M70N6TAXE ","M70N6TAYE ","M70N6TAZE ","M70N6TDXSS","M70N6TDYSS", & - "M70N6TDZSS","M70N7FKXE ","M70N7FKYE ","M70N7FKZE ","M70N7FMXE ","M70N7FMYE ","M70N7FMZE ", & - "M70N7MKXE ","M70N7MKYE ","M70N7MKZE ","M70N7MMXE ","M70N7MMYE ","M70N7MMZE ","M70N7RAXE ", & - "M70N7RAYE ","M70N7RAZE ","M70N7RDXE ","M70N7RDYE ","M70N7RDZE ","M70N7TAXE ","M70N7TAYE ", & - "M70N7TAZE ","M70N7TDXSS","M70N7TDYSS","M70N7TDZSS","M70N8FKXE ","M70N8FKYE ","M70N8FKZE ", & - "M70N8FMXE ","M70N8FMYE ","M70N8FMZE ","M70N8MKXE ","M70N8MKYE ","M70N8MKZE ","M70N8MMXE ", & - "M70N8MMYE ","M70N8MMZE ","M70N8RAXE ","M70N8RAYE ","M70N8RAZE ","M70N8RDXE ","M70N8RDYE ", & - "M70N8RDZE ","M70N8TAXE ","M70N8TAYE ","M70N8TAZE ","M70N8TDXSS","M70N8TDYSS","M70N8TDZSS", & - "M70N9FKXE ","M70N9FKYE ","M70N9FKZE ","M70N9FMXE ","M70N9FMYE ","M70N9FMZE ","M70N9MKXE ", & - "M70N9MKYE ","M70N9MKZE ","M70N9MMXE ","M70N9MMYE ","M70N9MMZE ","M70N9RAXE ","M70N9RAYE ", & - "M70N9RAZE ","M70N9RDXE ","M70N9RDYE ","M70N9RDZE ","M70N9TAXE ","M70N9TAYE ","M70N9TAZE ", & - "M70N9TDXSS","M70N9TDYSS","M70N9TDZSS","M71N1FKXE ","M71N1FKYE ","M71N1FKZE ","M71N1FMXE ", & - "M71N1FMYE ","M71N1FMZE ","M71N1MKXE ","M71N1MKYE ","M71N1MKZE ","M71N1MMXE ","M71N1MMYE ", & - "M71N1MMZE ","M71N1RAXE ","M71N1RAYE ","M71N1RAZE ","M71N1RDXE ","M71N1RDYE ","M71N1RDZE ", & - "M71N1TAXE ","M71N1TAYE ","M71N1TAZE ","M71N1TDXSS","M71N1TDYSS","M71N1TDZSS","M71N2FKXE ", & - "M71N2FKYE ","M71N2FKZE ","M71N2FMXE ","M71N2FMYE ","M71N2FMZE ","M71N2MKXE ","M71N2MKYE ", & - "M71N2MKZE ","M71N2MMXE ","M71N2MMYE ","M71N2MMZE ","M71N2RAXE ","M71N2RAYE ","M71N2RAZE ", & - "M71N2RDXE ","M71N2RDYE ","M71N2RDZE ","M71N2TAXE ","M71N2TAYE ","M71N2TAZE ","M71N2TDXSS", & - "M71N2TDYSS","M71N2TDZSS","M71N3FKXE ","M71N3FKYE ","M71N3FKZE ","M71N3FMXE ","M71N3FMYE ", & - "M71N3FMZE ","M71N3MKXE ","M71N3MKYE ","M71N3MKZE ","M71N3MMXE ","M71N3MMYE ","M71N3MMZE ", & - "M71N3RAXE ","M71N3RAYE ","M71N3RAZE ","M71N3RDXE ","M71N3RDYE ","M71N3RDZE ","M71N3TAXE ", & - "M71N3TAYE ","M71N3TAZE ","M71N3TDXSS","M71N3TDYSS","M71N3TDZSS","M71N4FKXE ","M71N4FKYE ", & - "M71N4FKZE ","M71N4FMXE ","M71N4FMYE ","M71N4FMZE ","M71N4MKXE ","M71N4MKYE ","M71N4MKZE ", & - "M71N4MMXE ","M71N4MMYE ","M71N4MMZE ","M71N4RAXE ","M71N4RAYE ","M71N4RAZE ","M71N4RDXE ", & - "M71N4RDYE ","M71N4RDZE ","M71N4TAXE ","M71N4TAYE ","M71N4TAZE ","M71N4TDXSS","M71N4TDYSS", & - "M71N4TDZSS","M71N5FKXE ","M71N5FKYE ","M71N5FKZE ","M71N5FMXE ","M71N5FMYE ","M71N5FMZE ", & - "M71N5MKXE ","M71N5MKYE ","M71N5MKZE ","M71N5MMXE ","M71N5MMYE ","M71N5MMZE ","M71N5RAXE ", & - "M71N5RAYE ","M71N5RAZE ","M71N5RDXE ","M71N5RDYE ","M71N5RDZE ","M71N5TAXE ","M71N5TAYE ", & - "M71N5TAZE ","M71N5TDXSS","M71N5TDYSS","M71N5TDZSS","M71N6FKXE ","M71N6FKYE ","M71N6FKZE ", & - "M71N6FMXE ","M71N6FMYE ","M71N6FMZE ","M71N6MKXE ","M71N6MKYE ","M71N6MKZE ","M71N6MMXE ", & - "M71N6MMYE ","M71N6MMZE ","M71N6RAXE ","M71N6RAYE ","M71N6RAZE ","M71N6RDXE ","M71N6RDYE ", & - "M71N6RDZE ","M71N6TAXE ","M71N6TAYE ","M71N6TAZE ","M71N6TDXSS","M71N6TDYSS","M71N6TDZSS", & - "M71N7FKXE ","M71N7FKYE ","M71N7FKZE ","M71N7FMXE ","M71N7FMYE ","M71N7FMZE ","M71N7MKXE ", & - "M71N7MKYE ","M71N7MKZE ","M71N7MMXE ","M71N7MMYE ","M71N7MMZE ","M71N7RAXE ","M71N7RAYE ", & - "M71N7RAZE ","M71N7RDXE ","M71N7RDYE ","M71N7RDZE ","M71N7TAXE ","M71N7TAYE ","M71N7TAZE ", & - "M71N7TDXSS","M71N7TDYSS","M71N7TDZSS","M71N8FKXE ","M71N8FKYE ","M71N8FKZE ","M71N8FMXE ", & - "M71N8FMYE ","M71N8FMZE ","M71N8MKXE ","M71N8MKYE ","M71N8MKZE ","M71N8MMXE ","M71N8MMYE ", & - "M71N8MMZE ","M71N8RAXE ","M71N8RAYE ","M71N8RAZE ","M71N8RDXE ","M71N8RDYE ","M71N8RDZE ", & - "M71N8TAXE ","M71N8TAYE ","M71N8TAZE ","M71N8TDXSS","M71N8TDYSS","M71N8TDZSS","M71N9FKXE ", & - "M71N9FKYE ","M71N9FKZE ","M71N9FMXE ","M71N9FMYE ","M71N9FMZE ","M71N9MKXE ","M71N9MKYE ", & - "M71N9MKZE ","M71N9MMXE ","M71N9MMYE ","M71N9MMZE ","M71N9RAXE ","M71N9RAYE ","M71N9RAZE ", & - "M71N9RDXE ","M71N9RDYE ","M71N9RDZE ","M71N9TAXE ","M71N9TAYE ","M71N9TAZE ","M71N9TDXSS", & - "M71N9TDYSS","M71N9TDZSS","M72N1FKXE ","M72N1FKYE ","M72N1FKZE ","M72N1FMXE ","M72N1FMYE ", & - "M72N1FMZE ","M72N1MKXE ","M72N1MKYE ","M72N1MKZE ","M72N1MMXE ","M72N1MMYE ","M72N1MMZE ", & - "M72N1RAXE ","M72N1RAYE ","M72N1RAZE ","M72N1RDXE ","M72N1RDYE ","M72N1RDZE ","M72N1TAXE ", & - "M72N1TAYE ","M72N1TAZE ","M72N1TDXSS","M72N1TDYSS","M72N1TDZSS","M72N2FKXE ","M72N2FKYE ", & - "M72N2FKZE ","M72N2FMXE ","M72N2FMYE ","M72N2FMZE ","M72N2MKXE ","M72N2MKYE ","M72N2MKZE ", & - "M72N2MMXE ","M72N2MMYE ","M72N2MMZE ","M72N2RAXE ","M72N2RAYE ","M72N2RAZE ","M72N2RDXE ", & - "M72N2RDYE ","M72N2RDZE ","M72N2TAXE ","M72N2TAYE ","M72N2TAZE ","M72N2TDXSS","M72N2TDYSS", & - "M72N2TDZSS","M72N3FKXE ","M72N3FKYE ","M72N3FKZE ","M72N3FMXE ","M72N3FMYE ","M72N3FMZE ", & - "M72N3MKXE ","M72N3MKYE ","M72N3MKZE ","M72N3MMXE ","M72N3MMYE ","M72N3MMZE ","M72N3RAXE ", & - "M72N3RAYE ","M72N3RAZE ","M72N3RDXE ","M72N3RDYE ","M72N3RDZE ","M72N3TAXE ","M72N3TAYE ", & - "M72N3TAZE ","M72N3TDXSS","M72N3TDYSS","M72N3TDZSS","M72N4FKXE ","M72N4FKYE ","M72N4FKZE ", & - "M72N4FMXE ","M72N4FMYE ","M72N4FMZE ","M72N4MKXE ","M72N4MKYE ","M72N4MKZE ","M72N4MMXE ", & - "M72N4MMYE ","M72N4MMZE ","M72N4RAXE ","M72N4RAYE ","M72N4RAZE ","M72N4RDXE ","M72N4RDYE ", & - "M72N4RDZE ","M72N4TAXE ","M72N4TAYE ","M72N4TAZE ","M72N4TDXSS","M72N4TDYSS","M72N4TDZSS", & - "M72N5FKXE ","M72N5FKYE ","M72N5FKZE ","M72N5FMXE ","M72N5FMYE ","M72N5FMZE ","M72N5MKXE ", & - "M72N5MKYE ","M72N5MKZE ","M72N5MMXE ","M72N5MMYE ","M72N5MMZE ","M72N5RAXE ","M72N5RAYE ", & - "M72N5RAZE ","M72N5RDXE ","M72N5RDYE ","M72N5RDZE ","M72N5TAXE ","M72N5TAYE ","M72N5TAZE ", & - "M72N5TDXSS","M72N5TDYSS","M72N5TDZSS","M72N6FKXE ","M72N6FKYE ","M72N6FKZE ","M72N6FMXE ", & - "M72N6FMYE ","M72N6FMZE ","M72N6MKXE ","M72N6MKYE ","M72N6MKZE ","M72N6MMXE ","M72N6MMYE ", & - "M72N6MMZE ","M72N6RAXE ","M72N6RAYE ","M72N6RAZE ","M72N6RDXE ","M72N6RDYE ","M72N6RDZE ", & - "M72N6TAXE ","M72N6TAYE ","M72N6TAZE ","M72N6TDXSS","M72N6TDYSS","M72N6TDZSS","M72N7FKXE ", & - "M72N7FKYE ","M72N7FKZE ","M72N7FMXE ","M72N7FMYE ","M72N7FMZE ","M72N7MKXE ","M72N7MKYE ", & - "M72N7MKZE ","M72N7MMXE ","M72N7MMYE ","M72N7MMZE ","M72N7RAXE ","M72N7RAYE ","M72N7RAZE ", & - "M72N7RDXE ","M72N7RDYE ","M72N7RDZE ","M72N7TAXE ","M72N7TAYE ","M72N7TAZE ","M72N7TDXSS", & - "M72N7TDYSS","M72N7TDZSS","M72N8FKXE ","M72N8FKYE ","M72N8FKZE ","M72N8FMXE ","M72N8FMYE ", & - "M72N8FMZE ","M72N8MKXE ","M72N8MKYE ","M72N8MKZE ","M72N8MMXE ","M72N8MMYE ","M72N8MMZE ", & - "M72N8RAXE ","M72N8RAYE ","M72N8RAZE ","M72N8RDXE ","M72N8RDYE ","M72N8RDZE ","M72N8TAXE ", & - "M72N8TAYE ","M72N8TAZE ","M72N8TDXSS","M72N8TDYSS","M72N8TDZSS","M72N9FKXE ","M72N9FKYE ", & - "M72N9FKZE ","M72N9FMXE ","M72N9FMYE ","M72N9FMZE ","M72N9MKXE ","M72N9MKYE ","M72N9MKZE ", & - "M72N9MMXE ","M72N9MMYE ","M72N9MMZE ","M72N9RAXE ","M72N9RAYE ","M72N9RAZE ","M72N9RDXE ", & - "M72N9RDYE ","M72N9RDZE ","M72N9TAXE ","M72N9TAYE ","M72N9TAZE ","M72N9TDXSS","M72N9TDYSS", & - "M72N9TDZSS","M73N1FKXE ","M73N1FKYE ","M73N1FKZE ","M73N1FMXE ","M73N1FMYE ","M73N1FMZE ", & - "M73N1MKXE ","M73N1MKYE ","M73N1MKZE ","M73N1MMXE ","M73N1MMYE ","M73N1MMZE ","M73N1RAXE ", & - "M73N1RAYE ","M73N1RAZE ","M73N1RDXE ","M73N1RDYE ","M73N1RDZE ","M73N1TAXE ","M73N1TAYE ", & - "M73N1TAZE ","M73N1TDXSS","M73N1TDYSS","M73N1TDZSS","M73N2FKXE ","M73N2FKYE ","M73N2FKZE ", & - "M73N2FMXE ","M73N2FMYE ","M73N2FMZE ","M73N2MKXE ","M73N2MKYE ","M73N2MKZE ","M73N2MMXE ", & - "M73N2MMYE ","M73N2MMZE ","M73N2RAXE ","M73N2RAYE ","M73N2RAZE ","M73N2RDXE ","M73N2RDYE ", & - "M73N2RDZE ","M73N2TAXE ","M73N2TAYE ","M73N2TAZE ","M73N2TDXSS","M73N2TDYSS","M73N2TDZSS", & - "M73N3FKXE ","M73N3FKYE ","M73N3FKZE ","M73N3FMXE ","M73N3FMYE ","M73N3FMZE ","M73N3MKXE ", & - "M73N3MKYE ","M73N3MKZE ","M73N3MMXE ","M73N3MMYE ","M73N3MMZE ","M73N3RAXE ","M73N3RAYE ", & - "M73N3RAZE ","M73N3RDXE ","M73N3RDYE ","M73N3RDZE ","M73N3TAXE ","M73N3TAYE ","M73N3TAZE ", & - "M73N3TDXSS","M73N3TDYSS","M73N3TDZSS","M73N4FKXE ","M73N4FKYE ","M73N4FKZE ","M73N4FMXE ", & - "M73N4FMYE ","M73N4FMZE ","M73N4MKXE ","M73N4MKYE ","M73N4MKZE ","M73N4MMXE ","M73N4MMYE ", & - "M73N4MMZE ","M73N4RAXE ","M73N4RAYE ","M73N4RAZE ","M73N4RDXE ","M73N4RDYE ","M73N4RDZE ", & - "M73N4TAXE ","M73N4TAYE ","M73N4TAZE ","M73N4TDXSS","M73N4TDYSS","M73N4TDZSS","M73N5FKXE ", & - "M73N5FKYE ","M73N5FKZE ","M73N5FMXE ","M73N5FMYE ","M73N5FMZE ","M73N5MKXE ","M73N5MKYE ", & - "M73N5MKZE ","M73N5MMXE ","M73N5MMYE ","M73N5MMZE ","M73N5RAXE ","M73N5RAYE ","M73N5RAZE ", & - "M73N5RDXE ","M73N5RDYE ","M73N5RDZE ","M73N5TAXE ","M73N5TAYE ","M73N5TAZE ","M73N5TDXSS", & - "M73N5TDYSS","M73N5TDZSS","M73N6FKXE ","M73N6FKYE ","M73N6FKZE ","M73N6FMXE ","M73N6FMYE ", & - "M73N6FMZE ","M73N6MKXE ","M73N6MKYE ","M73N6MKZE ","M73N6MMXE ","M73N6MMYE ","M73N6MMZE ", & - "M73N6RAXE ","M73N6RAYE ","M73N6RAZE ","M73N6RDXE ","M73N6RDYE ","M73N6RDZE ","M73N6TAXE ", & - "M73N6TAYE ","M73N6TAZE ","M73N6TDXSS","M73N6TDYSS","M73N6TDZSS","M73N7FKXE ","M73N7FKYE ", & - "M73N7FKZE ","M73N7FMXE ","M73N7FMYE ","M73N7FMZE ","M73N7MKXE ","M73N7MKYE ","M73N7MKZE ", & - "M73N7MMXE ","M73N7MMYE ","M73N7MMZE ","M73N7RAXE ","M73N7RAYE ","M73N7RAZE ","M73N7RDXE ", & - "M73N7RDYE ","M73N7RDZE ","M73N7TAXE ","M73N7TAYE ","M73N7TAZE ","M73N7TDXSS","M73N7TDYSS", & - "M73N7TDZSS","M73N8FKXE ","M73N8FKYE ","M73N8FKZE ","M73N8FMXE ","M73N8FMYE ","M73N8FMZE ", & - "M73N8MKXE ","M73N8MKYE ","M73N8MKZE ","M73N8MMXE ","M73N8MMYE ","M73N8MMZE ","M73N8RAXE ", & - "M73N8RAYE ","M73N8RAZE ","M73N8RDXE ","M73N8RDYE ","M73N8RDZE ","M73N8TAXE ","M73N8TAYE ", & - "M73N8TAZE ","M73N8TDXSS","M73N8TDYSS","M73N8TDZSS","M73N9FKXE ","M73N9FKYE ","M73N9FKZE ", & - "M73N9FMXE ","M73N9FMYE ","M73N9FMZE ","M73N9MKXE ","M73N9MKYE ","M73N9MKZE ","M73N9MMXE ", & - "M73N9MMYE ","M73N9MMZE ","M73N9RAXE ","M73N9RAYE ","M73N9RAZE ","M73N9RDXE ","M73N9RDYE ", & - "M73N9RDZE ","M73N9TAXE ","M73N9TAYE ","M73N9TAZE ","M73N9TDXSS","M73N9TDYSS","M73N9TDZSS", & - "M74N1FKXE ","M74N1FKYE ","M74N1FKZE ","M74N1FMXE ","M74N1FMYE ","M74N1FMZE ","M74N1MKXE ", & - "M74N1MKYE ","M74N1MKZE ","M74N1MMXE ","M74N1MMYE ","M74N1MMZE ","M74N1RAXE ","M74N1RAYE ", & - "M74N1RAZE ","M74N1RDXE ","M74N1RDYE ","M74N1RDZE ","M74N1TAXE ","M74N1TAYE ","M74N1TAZE ", & - "M74N1TDXSS","M74N1TDYSS","M74N1TDZSS","M74N2FKXE ","M74N2FKYE ","M74N2FKZE ","M74N2FMXE ", & - "M74N2FMYE ","M74N2FMZE ","M74N2MKXE ","M74N2MKYE ","M74N2MKZE ","M74N2MMXE ","M74N2MMYE ", & - "M74N2MMZE ","M74N2RAXE ","M74N2RAYE ","M74N2RAZE ","M74N2RDXE ","M74N2RDYE ","M74N2RDZE ", & - "M74N2TAXE ","M74N2TAYE ","M74N2TAZE ","M74N2TDXSS","M74N2TDYSS","M74N2TDZSS","M74N3FKXE ", & - "M74N3FKYE ","M74N3FKZE ","M74N3FMXE ","M74N3FMYE ","M74N3FMZE ","M74N3MKXE ","M74N3MKYE ", & - "M74N3MKZE ","M74N3MMXE ","M74N3MMYE ","M74N3MMZE ","M74N3RAXE ","M74N3RAYE ","M74N3RAZE ", & - "M74N3RDXE ","M74N3RDYE ","M74N3RDZE ","M74N3TAXE ","M74N3TAYE ","M74N3TAZE ","M74N3TDXSS", & - "M74N3TDYSS","M74N3TDZSS","M74N4FKXE ","M74N4FKYE ","M74N4FKZE ","M74N4FMXE ","M74N4FMYE ", & - "M74N4FMZE ","M74N4MKXE ","M74N4MKYE ","M74N4MKZE ","M74N4MMXE ","M74N4MMYE ","M74N4MMZE ", & - "M74N4RAXE ","M74N4RAYE ","M74N4RAZE ","M74N4RDXE ","M74N4RDYE ","M74N4RDZE ","M74N4TAXE ", & - "M74N4TAYE ","M74N4TAZE ","M74N4TDXSS","M74N4TDYSS","M74N4TDZSS","M74N5FKXE ","M74N5FKYE ", & - "M74N5FKZE ","M74N5FMXE ","M74N5FMYE ","M74N5FMZE ","M74N5MKXE ","M74N5MKYE ","M74N5MKZE ", & - "M74N5MMXE ","M74N5MMYE ","M74N5MMZE ","M74N5RAXE ","M74N5RAYE ","M74N5RAZE ","M74N5RDXE ", & - "M74N5RDYE ","M74N5RDZE ","M74N5TAXE ","M74N5TAYE ","M74N5TAZE ","M74N5TDXSS","M74N5TDYSS", & - "M74N5TDZSS","M74N6FKXE ","M74N6FKYE ","M74N6FKZE ","M74N6FMXE ","M74N6FMYE ","M74N6FMZE ", & - "M74N6MKXE ","M74N6MKYE ","M74N6MKZE ","M74N6MMXE ","M74N6MMYE ","M74N6MMZE ","M74N6RAXE ", & - "M74N6RAYE ","M74N6RAZE ","M74N6RDXE ","M74N6RDYE ","M74N6RDZE ","M74N6TAXE ","M74N6TAYE ", & - "M74N6TAZE ","M74N6TDXSS","M74N6TDYSS","M74N6TDZSS","M74N7FKXE ","M74N7FKYE ","M74N7FKZE ", & - "M74N7FMXE ","M74N7FMYE ","M74N7FMZE ","M74N7MKXE ","M74N7MKYE ","M74N7MKZE ","M74N7MMXE ", & - "M74N7MMYE ","M74N7MMZE ","M74N7RAXE ","M74N7RAYE ","M74N7RAZE ","M74N7RDXE ","M74N7RDYE ", & - "M74N7RDZE ","M74N7TAXE ","M74N7TAYE ","M74N7TAZE ","M74N7TDXSS","M74N7TDYSS","M74N7TDZSS", & - "M74N8FKXE ","M74N8FKYE ","M74N8FKZE ","M74N8FMXE ","M74N8FMYE ","M74N8FMZE ","M74N8MKXE ", & - "M74N8MKYE ","M74N8MKZE ","M74N8MMXE ","M74N8MMYE ","M74N8MMZE ","M74N8RAXE ","M74N8RAYE ", & - "M74N8RAZE ","M74N8RDXE ","M74N8RDYE ","M74N8RDZE ","M74N8TAXE ","M74N8TAYE ","M74N8TAZE ", & - "M74N8TDXSS","M74N8TDYSS","M74N8TDZSS","M74N9FKXE ","M74N9FKYE ","M74N9FKZE ","M74N9FMXE ", & - "M74N9FMYE ","M74N9FMZE ","M74N9MKXE ","M74N9MKYE ","M74N9MKZE ","M74N9MMXE ","M74N9MMYE ", & - "M74N9MMZE ","M74N9RAXE ","M74N9RAYE ","M74N9RAZE ","M74N9RDXE ","M74N9RDYE ","M74N9RDZE ", & - "M74N9TAXE ","M74N9TAYE ","M74N9TAZE ","M74N9TDXSS","M74N9TDYSS","M74N9TDZSS","M75N1FKXE ", & - "M75N1FKYE ","M75N1FKZE ","M75N1FMXE ","M75N1FMYE ","M75N1FMZE ","M75N1MKXE ","M75N1MKYE ", & - "M75N1MKZE ","M75N1MMXE ","M75N1MMYE ","M75N1MMZE ","M75N1RAXE ","M75N1RAYE ","M75N1RAZE ", & - "M75N1RDXE ","M75N1RDYE ","M75N1RDZE ","M75N1TAXE ","M75N1TAYE ","M75N1TAZE ","M75N1TDXSS", & - "M75N1TDYSS","M75N1TDZSS","M75N2FKXE ","M75N2FKYE ","M75N2FKZE ","M75N2FMXE ","M75N2FMYE ", & - "M75N2FMZE ","M75N2MKXE ","M75N2MKYE ","M75N2MKZE ","M75N2MMXE ","M75N2MMYE ","M75N2MMZE ", & - "M75N2RAXE ","M75N2RAYE ","M75N2RAZE ","M75N2RDXE ","M75N2RDYE ","M75N2RDZE ","M75N2TAXE ", & - "M75N2TAYE ","M75N2TAZE ","M75N2TDXSS","M75N2TDYSS","M75N2TDZSS","M75N3FKXE ","M75N3FKYE ", & - "M75N3FKZE ","M75N3FMXE ","M75N3FMYE ","M75N3FMZE ","M75N3MKXE ","M75N3MKYE ","M75N3MKZE ", & - "M75N3MMXE ","M75N3MMYE ","M75N3MMZE ","M75N3RAXE ","M75N3RAYE ","M75N3RAZE ","M75N3RDXE ", & - "M75N3RDYE ","M75N3RDZE ","M75N3TAXE ","M75N3TAYE ","M75N3TAZE ","M75N3TDXSS","M75N3TDYSS", & - "M75N3TDZSS","M75N4FKXE ","M75N4FKYE ","M75N4FKZE ","M75N4FMXE ","M75N4FMYE ","M75N4FMZE ", & - "M75N4MKXE ","M75N4MKYE ","M75N4MKZE ","M75N4MMXE ","M75N4MMYE ","M75N4MMZE ","M75N4RAXE ", & - "M75N4RAYE ","M75N4RAZE ","M75N4RDXE ","M75N4RDYE ","M75N4RDZE ","M75N4TAXE ","M75N4TAYE ", & - "M75N4TAZE ","M75N4TDXSS","M75N4TDYSS","M75N4TDZSS","M75N5FKXE ","M75N5FKYE ","M75N5FKZE ", & - "M75N5FMXE ","M75N5FMYE ","M75N5FMZE ","M75N5MKXE ","M75N5MKYE ","M75N5MKZE ","M75N5MMXE ", & - "M75N5MMYE ","M75N5MMZE ","M75N5RAXE ","M75N5RAYE ","M75N5RAZE ","M75N5RDXE ","M75N5RDYE ", & - "M75N5RDZE ","M75N5TAXE ","M75N5TAYE ","M75N5TAZE ","M75N5TDXSS","M75N5TDYSS","M75N5TDZSS", & - "M75N6FKXE ","M75N6FKYE ","M75N6FKZE ","M75N6FMXE ","M75N6FMYE ","M75N6FMZE ","M75N6MKXE ", & - "M75N6MKYE ","M75N6MKZE ","M75N6MMXE ","M75N6MMYE ","M75N6MMZE ","M75N6RAXE ","M75N6RAYE ", & - "M75N6RAZE ","M75N6RDXE ","M75N6RDYE ","M75N6RDZE ","M75N6TAXE ","M75N6TAYE ","M75N6TAZE ", & - "M75N6TDXSS","M75N6TDYSS","M75N6TDZSS","M75N7FKXE ","M75N7FKYE ","M75N7FKZE ","M75N7FMXE ", & - "M75N7FMYE ","M75N7FMZE ","M75N7MKXE ","M75N7MKYE ","M75N7MKZE ","M75N7MMXE ","M75N7MMYE ", & - "M75N7MMZE ","M75N7RAXE ","M75N7RAYE ","M75N7RAZE ","M75N7RDXE ","M75N7RDYE ","M75N7RDZE ", & - "M75N7TAXE ","M75N7TAYE ","M75N7TAZE ","M75N7TDXSS","M75N7TDYSS","M75N7TDZSS","M75N8FKXE ", & - "M75N8FKYE ","M75N8FKZE ","M75N8FMXE ","M75N8FMYE ","M75N8FMZE ","M75N8MKXE ","M75N8MKYE ", & - "M75N8MKZE ","M75N8MMXE ","M75N8MMYE ","M75N8MMZE ","M75N8RAXE ","M75N8RAYE ","M75N8RAZE ", & - "M75N8RDXE ","M75N8RDYE ","M75N8RDZE ","M75N8TAXE ","M75N8TAYE ","M75N8TAZE ","M75N8TDXSS", & - "M75N8TDYSS","M75N8TDZSS","M75N9FKXE ","M75N9FKYE ","M75N9FKZE ","M75N9FMXE ","M75N9FMYE ", & - "M75N9FMZE ","M75N9MKXE ","M75N9MKYE ","M75N9MKZE ","M75N9MMXE ","M75N9MMYE ","M75N9MMZE ", & - "M75N9RAXE ","M75N9RAYE ","M75N9RAZE ","M75N9RDXE ","M75N9RDYE ","M75N9RDZE ","M75N9TAXE ", & - "M75N9TAYE ","M75N9TAZE ","M75N9TDXSS","M75N9TDYSS","M75N9TDZSS","M76N1FKXE ","M76N1FKYE ", & - "M76N1FKZE ","M76N1FMXE ","M76N1FMYE ","M76N1FMZE ","M76N1MKXE ","M76N1MKYE ","M76N1MKZE ", & - "M76N1MMXE ","M76N1MMYE ","M76N1MMZE ","M76N1RAXE ","M76N1RAYE ","M76N1RAZE ","M76N1RDXE ", & - "M76N1RDYE ","M76N1RDZE ","M76N1TAXE ","M76N1TAYE ","M76N1TAZE ","M76N1TDXSS","M76N1TDYSS", & - "M76N1TDZSS","M76N2FKXE ","M76N2FKYE ","M76N2FKZE ","M76N2FMXE ","M76N2FMYE ","M76N2FMZE ", & - "M76N2MKXE ","M76N2MKYE ","M76N2MKZE ","M76N2MMXE ","M76N2MMYE ","M76N2MMZE ","M76N2RAXE ", & - "M76N2RAYE ","M76N2RAZE ","M76N2RDXE ","M76N2RDYE ","M76N2RDZE ","M76N2TAXE ","M76N2TAYE ", & - "M76N2TAZE ","M76N2TDXSS","M76N2TDYSS","M76N2TDZSS","M76N3FKXE ","M76N3FKYE ","M76N3FKZE ", & - "M76N3FMXE ","M76N3FMYE ","M76N3FMZE ","M76N3MKXE ","M76N3MKYE ","M76N3MKZE ","M76N3MMXE ", & - "M76N3MMYE ","M76N3MMZE ","M76N3RAXE ","M76N3RAYE ","M76N3RAZE ","M76N3RDXE ","M76N3RDYE ", & - "M76N3RDZE ","M76N3TAXE ","M76N3TAYE ","M76N3TAZE ","M76N3TDXSS","M76N3TDYSS","M76N3TDZSS", & - "M76N4FKXE ","M76N4FKYE ","M76N4FKZE ","M76N4FMXE ","M76N4FMYE ","M76N4FMZE ","M76N4MKXE ", & - "M76N4MKYE ","M76N4MKZE ","M76N4MMXE ","M76N4MMYE ","M76N4MMZE ","M76N4RAXE ","M76N4RAYE ", & - "M76N4RAZE ","M76N4RDXE ","M76N4RDYE ","M76N4RDZE ","M76N4TAXE ","M76N4TAYE ","M76N4TAZE ", & - "M76N4TDXSS","M76N4TDYSS","M76N4TDZSS","M76N5FKXE ","M76N5FKYE ","M76N5FKZE ","M76N5FMXE ", & - "M76N5FMYE ","M76N5FMZE ","M76N5MKXE ","M76N5MKYE ","M76N5MKZE ","M76N5MMXE ","M76N5MMYE ", & - "M76N5MMZE ","M76N5RAXE ","M76N5RAYE ","M76N5RAZE ","M76N5RDXE ","M76N5RDYE ","M76N5RDZE ", & - "M76N5TAXE ","M76N5TAYE ","M76N5TAZE ","M76N5TDXSS","M76N5TDYSS","M76N5TDZSS","M76N6FKXE ", & - "M76N6FKYE ","M76N6FKZE ","M76N6FMXE ","M76N6FMYE ","M76N6FMZE ","M76N6MKXE ","M76N6MKYE ", & - "M76N6MKZE ","M76N6MMXE ","M76N6MMYE ","M76N6MMZE ","M76N6RAXE ","M76N6RAYE ","M76N6RAZE ", & - "M76N6RDXE ","M76N6RDYE ","M76N6RDZE ","M76N6TAXE ","M76N6TAYE ","M76N6TAZE ","M76N6TDXSS", & - "M76N6TDYSS","M76N6TDZSS","M76N7FKXE ","M76N7FKYE ","M76N7FKZE ","M76N7FMXE ","M76N7FMYE ", & - "M76N7FMZE ","M76N7MKXE ","M76N7MKYE ","M76N7MKZE ","M76N7MMXE ","M76N7MMYE ","M76N7MMZE ", & - "M76N7RAXE ","M76N7RAYE ","M76N7RAZE ","M76N7RDXE ","M76N7RDYE ","M76N7RDZE ","M76N7TAXE ", & - "M76N7TAYE ","M76N7TAZE ","M76N7TDXSS","M76N7TDYSS","M76N7TDZSS","M76N8FKXE ","M76N8FKYE ", & - "M76N8FKZE ","M76N8FMXE ","M76N8FMYE ","M76N8FMZE ","M76N8MKXE ","M76N8MKYE ","M76N8MKZE ", & - "M76N8MMXE ","M76N8MMYE ","M76N8MMZE ","M76N8RAXE ","M76N8RAYE ","M76N8RAZE ","M76N8RDXE ", & - "M76N8RDYE ","M76N8RDZE ","M76N8TAXE ","M76N8TAYE ","M76N8TAZE ","M76N8TDXSS","M76N8TDYSS", & - "M76N8TDZSS","M76N9FKXE ","M76N9FKYE ","M76N9FKZE ","M76N9FMXE ","M76N9FMYE ","M76N9FMZE ", & - "M76N9MKXE ","M76N9MKYE ","M76N9MKZE ","M76N9MMXE ","M76N9MMYE ","M76N9MMZE ","M76N9RAXE ", & - "M76N9RAYE ","M76N9RAZE ","M76N9RDXE ","M76N9RDYE ","M76N9RDZE ","M76N9TAXE ","M76N9TAYE ", & - "M76N9TAZE ","M76N9TDXSS","M76N9TDYSS","M76N9TDZSS","M77N1FKXE ","M77N1FKYE ","M77N1FKZE ", & - "M77N1FMXE ","M77N1FMYE ","M77N1FMZE ","M77N1MKXE ","M77N1MKYE ","M77N1MKZE ","M77N1MMXE ", & - "M77N1MMYE ","M77N1MMZE ","M77N1RAXE ","M77N1RAYE ","M77N1RAZE ","M77N1RDXE ","M77N1RDYE ", & - "M77N1RDZE ","M77N1TAXE ","M77N1TAYE ","M77N1TAZE ","M77N1TDXSS","M77N1TDYSS","M77N1TDZSS", & - "M77N2FKXE ","M77N2FKYE ","M77N2FKZE ","M77N2FMXE ","M77N2FMYE ","M77N2FMZE ","M77N2MKXE ", & - "M77N2MKYE ","M77N2MKZE ","M77N2MMXE ","M77N2MMYE ","M77N2MMZE ","M77N2RAXE ","M77N2RAYE ", & - "M77N2RAZE ","M77N2RDXE ","M77N2RDYE ","M77N2RDZE ","M77N2TAXE ","M77N2TAYE ","M77N2TAZE ", & - "M77N2TDXSS","M77N2TDYSS","M77N2TDZSS","M77N3FKXE ","M77N3FKYE ","M77N3FKZE ","M77N3FMXE ", & - "M77N3FMYE ","M77N3FMZE ","M77N3MKXE ","M77N3MKYE ","M77N3MKZE ","M77N3MMXE ","M77N3MMYE ", & - "M77N3MMZE ","M77N3RAXE ","M77N3RAYE ","M77N3RAZE ","M77N3RDXE ","M77N3RDYE ","M77N3RDZE ", & - "M77N3TAXE ","M77N3TAYE ","M77N3TAZE ","M77N3TDXSS","M77N3TDYSS","M77N3TDZSS","M77N4FKXE ", & - "M77N4FKYE ","M77N4FKZE ","M77N4FMXE ","M77N4FMYE ","M77N4FMZE ","M77N4MKXE ","M77N4MKYE ", & - "M77N4MKZE ","M77N4MMXE ","M77N4MMYE ","M77N4MMZE ","M77N4RAXE ","M77N4RAYE ","M77N4RAZE ", & - "M77N4RDXE ","M77N4RDYE ","M77N4RDZE ","M77N4TAXE ","M77N4TAYE ","M77N4TAZE ","M77N4TDXSS", & - "M77N4TDYSS","M77N4TDZSS","M77N5FKXE ","M77N5FKYE ","M77N5FKZE ","M77N5FMXE ","M77N5FMYE ", & - "M77N5FMZE ","M77N5MKXE ","M77N5MKYE ","M77N5MKZE ","M77N5MMXE ","M77N5MMYE ","M77N5MMZE ", & - "M77N5RAXE ","M77N5RAYE ","M77N5RAZE ","M77N5RDXE ","M77N5RDYE ","M77N5RDZE ","M77N5TAXE ", & - "M77N5TAYE ","M77N5TAZE ","M77N5TDXSS","M77N5TDYSS","M77N5TDZSS","M77N6FKXE ","M77N6FKYE ", & - "M77N6FKZE ","M77N6FMXE ","M77N6FMYE ","M77N6FMZE ","M77N6MKXE ","M77N6MKYE ","M77N6MKZE ", & - "M77N6MMXE ","M77N6MMYE ","M77N6MMZE ","M77N6RAXE ","M77N6RAYE ","M77N6RAZE ","M77N6RDXE ", & - "M77N6RDYE ","M77N6RDZE ","M77N6TAXE ","M77N6TAYE ","M77N6TAZE ","M77N6TDXSS","M77N6TDYSS", & - "M77N6TDZSS","M77N7FKXE ","M77N7FKYE ","M77N7FKZE ","M77N7FMXE ","M77N7FMYE ","M77N7FMZE ", & - "M77N7MKXE ","M77N7MKYE ","M77N7MKZE ","M77N7MMXE ","M77N7MMYE ","M77N7MMZE ","M77N7RAXE ", & - "M77N7RAYE ","M77N7RAZE ","M77N7RDXE ","M77N7RDYE ","M77N7RDZE ","M77N7TAXE ","M77N7TAYE ", & - "M77N7TAZE ","M77N7TDXSS","M77N7TDYSS","M77N7TDZSS","M77N8FKXE ","M77N8FKYE ","M77N8FKZE ", & - "M77N8FMXE ","M77N8FMYE ","M77N8FMZE ","M77N8MKXE ","M77N8MKYE ","M77N8MKZE ","M77N8MMXE ", & - "M77N8MMYE ","M77N8MMZE ","M77N8RAXE ","M77N8RAYE ","M77N8RAZE ","M77N8RDXE ","M77N8RDYE ", & - "M77N8RDZE ","M77N8TAXE ","M77N8TAYE ","M77N8TAZE ","M77N8TDXSS","M77N8TDYSS","M77N8TDZSS", & - "M77N9FKXE ","M77N9FKYE ","M77N9FKZE ","M77N9FMXE ","M77N9FMYE ","M77N9FMZE ","M77N9MKXE ", & - "M77N9MKYE ","M77N9MKZE ","M77N9MMXE ","M77N9MMYE ","M77N9MMZE ","M77N9RAXE ","M77N9RAYE ", & - "M77N9RAZE ","M77N9RDXE ","M77N9RDYE ","M77N9RDZE ","M77N9TAXE ","M77N9TAYE ","M77N9TAZE ", & - "M77N9TDXSS","M77N9TDYSS","M77N9TDZSS","M78N1FKXE ","M78N1FKYE ","M78N1FKZE ","M78N1FMXE ", & - "M78N1FMYE ","M78N1FMZE ","M78N1MKXE ","M78N1MKYE ","M78N1MKZE ","M78N1MMXE ","M78N1MMYE ", & - "M78N1MMZE ","M78N1RAXE ","M78N1RAYE ","M78N1RAZE ","M78N1RDXE ","M78N1RDYE ","M78N1RDZE ", & - "M78N1TAXE ","M78N1TAYE ","M78N1TAZE ","M78N1TDXSS","M78N1TDYSS","M78N1TDZSS","M78N2FKXE ", & - "M78N2FKYE ","M78N2FKZE ","M78N2FMXE ","M78N2FMYE ","M78N2FMZE ","M78N2MKXE ","M78N2MKYE ", & - "M78N2MKZE ","M78N2MMXE ","M78N2MMYE ","M78N2MMZE ","M78N2RAXE ","M78N2RAYE ","M78N2RAZE ", & - "M78N2RDXE ","M78N2RDYE ","M78N2RDZE ","M78N2TAXE ","M78N2TAYE ","M78N2TAZE ","M78N2TDXSS", & - "M78N2TDYSS","M78N2TDZSS","M78N3FKXE ","M78N3FKYE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry11(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M31N8MMYE ","M31N8MMZE ","M31N8RAXE ","M31N8RAYE ","M31N8RAZE ","M31N8RDXE ","M31N8RDYE ", & + "M31N8RDZE ","M31N8TAXE ","M31N8TAYE ","M31N8TAZE ","M31N8TDXSS","M31N8TDYSS","M31N8TDZSS", & + "M31N9FKXE ","M31N9FKYE ","M31N9FKZE ","M31N9FMXE ","M31N9FMYE ","M31N9FMZE ","M31N9MKXE ", & + "M31N9MKYE ","M31N9MKZE ","M31N9MMXE ","M31N9MMYE ","M31N9MMZE ","M31N9RAXE ","M31N9RAYE ", & + "M31N9RAZE ","M31N9RDXE ","M31N9RDYE ","M31N9RDZE ","M31N9TAXE ","M31N9TAYE ","M31N9TAZE ", & + "M31N9TDXSS","M31N9TDYSS","M31N9TDZSS","M32N1FKXE ","M32N1FKYE ","M32N1FKZE ","M32N1FMXE ", & + "M32N1FMYE ","M32N1FMZE ","M32N1MKXE ","M32N1MKYE ","M32N1MKZE ","M32N1MMXE ","M32N1MMYE ", & + "M32N1MMZE ","M32N1RAXE ","M32N1RAYE ","M32N1RAZE ","M32N1RDXE ","M32N1RDYE ","M32N1RDZE ", & + "M32N1TAXE ","M32N1TAYE ","M32N1TAZE ","M32N1TDXSS","M32N1TDYSS","M32N1TDZSS","M32N2FKXE ", & + "M32N2FKYE ","M32N2FKZE ","M32N2FMXE ","M32N2FMYE ","M32N2FMZE ","M32N2MKXE ","M32N2MKYE ", & + "M32N2MKZE ","M32N2MMXE ","M32N2MMYE ","M32N2MMZE ","M32N2RAXE ","M32N2RAYE ","M32N2RAZE ", & + "M32N2RDXE ","M32N2RDYE ","M32N2RDZE ","M32N2TAXE ","M32N2TAYE ","M32N2TAZE ","M32N2TDXSS", & + "M32N2TDYSS","M32N2TDZSS","M32N3FKXE ","M32N3FKYE ","M32N3FKZE ","M32N3FMXE ","M32N3FMYE ", & + "M32N3FMZE ","M32N3MKXE ","M32N3MKYE ","M32N3MKZE ","M32N3MMXE ","M32N3MMYE ","M32N3MMZE ", & + "M32N3RAXE ","M32N3RAYE ","M32N3RAZE ","M32N3RDXE ","M32N3RDYE ","M32N3RDZE ","M32N3TAXE ", & + "M32N3TAYE ","M32N3TAZE ","M32N3TDXSS","M32N3TDYSS","M32N3TDZSS","M32N4FKXE ","M32N4FKYE ", & + "M32N4FKZE ","M32N4FMXE ","M32N4FMYE ","M32N4FMZE ","M32N4MKXE ","M32N4MKYE ","M32N4MKZE ", & + "M32N4MMXE ","M32N4MMYE ","M32N4MMZE ","M32N4RAXE ","M32N4RAYE ","M32N4RAZE ","M32N4RDXE ", & + "M32N4RDYE ","M32N4RDZE ","M32N4TAXE ","M32N4TAYE ","M32N4TAZE ","M32N4TDXSS","M32N4TDYSS", & + "M32N4TDZSS","M32N5FKXE ","M32N5FKYE ","M32N5FKZE ","M32N5FMXE ","M32N5FMYE ","M32N5FMZE ", & + "M32N5MKXE ","M32N5MKYE ","M32N5MKZE ","M32N5MMXE ","M32N5MMYE ","M32N5MMZE ","M32N5RAXE ", & + "M32N5RAYE ","M32N5RAZE ","M32N5RDXE ","M32N5RDYE ","M32N5RDZE ","M32N5TAXE ","M32N5TAYE ", & + "M32N5TAZE ","M32N5TDXSS","M32N5TDYSS","M32N5TDZSS","M32N6FKXE ","M32N6FKYE ","M32N6FKZE ", & + "M32N6FMXE ","M32N6FMYE ","M32N6FMZE ","M32N6MKXE ","M32N6MKYE ","M32N6MKZE ","M32N6MMXE ", & + "M32N6MMYE ","M32N6MMZE ","M32N6RAXE ","M32N6RAYE ","M32N6RAZE ","M32N6RDXE ","M32N6RDYE ", & + "M32N6RDZE ","M32N6TAXE ","M32N6TAYE ","M32N6TAZE ","M32N6TDXSS","M32N6TDYSS","M32N6TDZSS", & + "M32N7FKXE ","M32N7FKYE ","M32N7FKZE ","M32N7FMXE ","M32N7FMYE ","M32N7FMZE ","M32N7MKXE ", & + "M32N7MKYE ","M32N7MKZE ","M32N7MMXE ","M32N7MMYE ","M32N7MMZE ","M32N7RAXE ","M32N7RAYE ", & + "M32N7RAZE ","M32N7RDXE ","M32N7RDYE ","M32N7RDZE ","M32N7TAXE ","M32N7TAYE ","M32N7TAZE ", & + "M32N7TDXSS","M32N7TDYSS","M32N7TDZSS","M32N8FKXE ","M32N8FKYE ","M32N8FKZE ","M32N8FMXE ", & + "M32N8FMYE ","M32N8FMZE ","M32N8MKXE ","M32N8MKYE ","M32N8MKZE ","M32N8MMXE ","M32N8MMYE ", & + "M32N8MMZE ","M32N8RAXE ","M32N8RAYE ","M32N8RAZE ","M32N8RDXE ","M32N8RDYE ","M32N8RDZE ", & + "M32N8TAXE ","M32N8TAYE ","M32N8TAZE ","M32N8TDXSS","M32N8TDYSS","M32N8TDZSS","M32N9FKXE ", & + "M32N9FKYE ","M32N9FKZE ","M32N9FMXE ","M32N9FMYE ","M32N9FMZE ","M32N9MKXE ","M32N9MKYE ", & + "M32N9MKZE ","M32N9MMXE ","M32N9MMYE ","M32N9MMZE ","M32N9RAXE ","M32N9RAYE ","M32N9RAZE ", & + "M32N9RDXE ","M32N9RDYE ","M32N9RDZE ","M32N9TAXE ","M32N9TAYE ","M32N9TAZE ","M32N9TDXSS", & + "M32N9TDYSS","M32N9TDZSS","M33N1FKXE ","M33N1FKYE ","M33N1FKZE ","M33N1FMXE ","M33N1FMYE ", & + "M33N1FMZE ","M33N1MKXE ","M33N1MKYE ","M33N1MKZE ","M33N1MMXE ","M33N1MMYE ","M33N1MMZE ", & + "M33N1RAXE ","M33N1RAYE ","M33N1RAZE ","M33N1RDXE ","M33N1RDYE ","M33N1RDZE ","M33N1TAXE ", & + "M33N1TAYE ","M33N1TAZE ","M33N1TDXSS","M33N1TDYSS","M33N1TDZSS","M33N2FKXE ","M33N2FKYE ", & + "M33N2FKZE ","M33N2FMXE ","M33N2FMYE ","M33N2FMZE ","M33N2MKXE ","M33N2MKYE ","M33N2MKZE ", & + "M33N2MMXE ","M33N2MMYE ","M33N2MMZE ","M33N2RAXE ","M33N2RAYE ","M33N2RAZE ","M33N2RDXE ", & + "M33N2RDYE ","M33N2RDZE ","M33N2TAXE ","M33N2TAYE ","M33N2TAZE ","M33N2TDXSS","M33N2TDYSS", & + "M33N2TDZSS","M33N3FKXE ","M33N3FKYE ","M33N3FKZE ","M33N3FMXE ","M33N3FMYE ","M33N3FMZE ", & + "M33N3MKXE ","M33N3MKYE ","M33N3MKZE ","M33N3MMXE ","M33N3MMYE ","M33N3MMZE ","M33N3RAXE ", & + "M33N3RAYE ","M33N3RAZE ","M33N3RDXE ","M33N3RDYE ","M33N3RDZE ","M33N3TAXE ","M33N3TAYE ", & + "M33N3TAZE ","M33N3TDXSS","M33N3TDYSS","M33N3TDZSS","M33N4FKXE ","M33N4FKYE ","M33N4FKZE ", & + "M33N4FMXE ","M33N4FMYE ","M33N4FMZE ","M33N4MKXE ","M33N4MKYE ","M33N4MKZE ","M33N4MMXE ", & + "M33N4MMYE ","M33N4MMZE ","M33N4RAXE ","M33N4RAYE ","M33N4RAZE ","M33N4RDXE ","M33N4RDYE ", & + "M33N4RDZE ","M33N4TAXE ","M33N4TAYE ","M33N4TAZE ","M33N4TDXSS","M33N4TDYSS","M33N4TDZSS", & + "M33N5FKXE ","M33N5FKYE ","M33N5FKZE ","M33N5FMXE ","M33N5FMYE ","M33N5FMZE ","M33N5MKXE ", & + "M33N5MKYE ","M33N5MKZE ","M33N5MMXE ","M33N5MMYE ","M33N5MMZE ","M33N5RAXE ","M33N5RAYE ", & + "M33N5RAZE ","M33N5RDXE ","M33N5RDYE ","M33N5RDZE ","M33N5TAXE ","M33N5TAYE ","M33N5TAZE ", & + "M33N5TDXSS","M33N5TDYSS","M33N5TDZSS","M33N6FKXE ","M33N6FKYE ","M33N6FKZE ","M33N6FMXE ", & + "M33N6FMYE ","M33N6FMZE ","M33N6MKXE ","M33N6MKYE ","M33N6MKZE ","M33N6MMXE ","M33N6MMYE ", & + "M33N6MMZE ","M33N6RAXE ","M33N6RAYE ","M33N6RAZE ","M33N6RDXE ","M33N6RDYE ","M33N6RDZE ", & + "M33N6TAXE ","M33N6TAYE ","M33N6TAZE ","M33N6TDXSS","M33N6TDYSS","M33N6TDZSS","M33N7FKXE ", & + "M33N7FKYE ","M33N7FKZE ","M33N7FMXE ","M33N7FMYE ","M33N7FMZE ","M33N7MKXE ","M33N7MKYE ", & + "M33N7MKZE ","M33N7MMXE ","M33N7MMYE ","M33N7MMZE ","M33N7RAXE ","M33N7RAYE ","M33N7RAZE ", & + "M33N7RDXE ","M33N7RDYE ","M33N7RDZE ","M33N7TAXE ","M33N7TAYE ","M33N7TAZE ","M33N7TDXSS", & + "M33N7TDYSS","M33N7TDZSS","M33N8FKXE ","M33N8FKYE ","M33N8FKZE ","M33N8FMXE ","M33N8FMYE ", & + "M33N8FMZE ","M33N8MKXE ","M33N8MKYE ","M33N8MKZE ","M33N8MMXE ","M33N8MMYE ","M33N8MMZE ", & + "M33N8RAXE ","M33N8RAYE ","M33N8RAZE ","M33N8RDXE ","M33N8RDYE ","M33N8RDZE ","M33N8TAXE ", & + "M33N8TAYE ","M33N8TAZE ","M33N8TDXSS","M33N8TDYSS","M33N8TDZSS","M33N9FKXE ","M33N9FKYE ", & + "M33N9FKZE ","M33N9FMXE ","M33N9FMYE ","M33N9FMZE ","M33N9MKXE ","M33N9MKYE ","M33N9MKZE ", & + "M33N9MMXE ","M33N9MMYE ","M33N9MMZE ","M33N9RAXE ","M33N9RAYE ","M33N9RAZE ","M33N9RDXE ", & + "M33N9RDYE ","M33N9RDZE ","M33N9TAXE ","M33N9TAYE ","M33N9TAZE ","M33N9TDXSS","M33N9TDYSS", & + "M33N9TDZSS","M34N1FKXE ","M34N1FKYE ","M34N1FKZE ","M34N1FMXE ","M34N1FMYE ","M34N1FMZE ", & + "M34N1MKXE ","M34N1MKYE ","M34N1MKZE ","M34N1MMXE ","M34N1MMYE ","M34N1MMZE ","M34N1RAXE ", & + "M34N1RAYE ","M34N1RAZE ","M34N1RDXE ","M34N1RDYE ","M34N1RDZE ","M34N1TAXE ","M34N1TAYE ", & + "M34N1TAZE ","M34N1TDXSS","M34N1TDYSS","M34N1TDZSS","M34N2FKXE ","M34N2FKYE ","M34N2FKZE ", & + "M34N2FMXE ","M34N2FMYE ","M34N2FMZE ","M34N2MKXE ","M34N2MKYE ","M34N2MKZE ","M34N2MMXE ", & + "M34N2MMYE ","M34N2MMZE ","M34N2RAXE ","M34N2RAYE ","M34N2RAZE ","M34N2RDXE ","M34N2RDYE ", & + "M34N2RDZE ","M34N2TAXE ","M34N2TAYE ","M34N2TAZE ","M34N2TDXSS","M34N2TDYSS","M34N2TDZSS", & + "M34N3FKXE ","M34N3FKYE ","M34N3FKZE ","M34N3FMXE ","M34N3FMYE ","M34N3FMZE ","M34N3MKXE ", & + "M34N3MKYE ","M34N3MKZE ","M34N3MMXE ","M34N3MMYE ","M34N3MMZE ","M34N3RAXE ","M34N3RAYE ", & + "M34N3RAZE ","M34N3RDXE ","M34N3RDYE ","M34N3RDZE ","M34N3TAXE ","M34N3TAYE ","M34N3TAZE ", & + "M34N3TDXSS","M34N3TDYSS","M34N3TDZSS","M34N4FKXE ","M34N4FKYE ","M34N4FKZE ","M34N4FMXE ", & + "M34N4FMYE ","M34N4FMZE ","M34N4MKXE ","M34N4MKYE ","M34N4MKZE ","M34N4MMXE ","M34N4MMYE ", & + "M34N4MMZE ","M34N4RAXE ","M34N4RAYE ","M34N4RAZE ","M34N4RDXE ","M34N4RDYE ","M34N4RDZE ", & + "M34N4TAXE ","M34N4TAYE ","M34N4TAZE ","M34N4TDXSS","M34N4TDYSS","M34N4TDZSS","M34N5FKXE ", & + "M34N5FKYE ","M34N5FKZE ","M34N5FMXE ","M34N5FMYE ","M34N5FMZE ","M34N5MKXE ","M34N5MKYE ", & + "M34N5MKZE ","M34N5MMXE ","M34N5MMYE ","M34N5MMZE ","M34N5RAXE ","M34N5RAYE ","M34N5RAZE ", & + "M34N5RDXE ","M34N5RDYE ","M34N5RDZE ","M34N5TAXE ","M34N5TAYE ","M34N5TAZE ","M34N5TDXSS", & + "M34N5TDYSS","M34N5TDZSS","M34N6FKXE ","M34N6FKYE ","M34N6FKZE ","M34N6FMXE ","M34N6FMYE ", & + "M34N6FMZE ","M34N6MKXE ","M34N6MKYE ","M34N6MKZE ","M34N6MMXE ","M34N6MMYE ","M34N6MMZE ", & + "M34N6RAXE ","M34N6RAYE ","M34N6RAZE ","M34N6RDXE ","M34N6RDYE ","M34N6RDZE ","M34N6TAXE ", & + "M34N6TAYE ","M34N6TAZE ","M34N6TDXSS","M34N6TDYSS","M34N6TDZSS","M34N7FKXE ","M34N7FKYE ", & + "M34N7FKZE ","M34N7FMXE ","M34N7FMYE ","M34N7FMZE ","M34N7MKXE ","M34N7MKYE ","M34N7MKZE ", & + "M34N7MMXE ","M34N7MMYE ","M34N7MMZE ","M34N7RAXE ","M34N7RAYE ","M34N7RAZE ","M34N7RDXE ", & + "M34N7RDYE ","M34N7RDZE ","M34N7TAXE ","M34N7TAYE ","M34N7TAZE ","M34N7TDXSS","M34N7TDYSS", & + "M34N7TDZSS","M34N8FKXE ","M34N8FKYE ","M34N8FKZE ","M34N8FMXE ","M34N8FMYE ","M34N8FMZE ", & + "M34N8MKXE ","M34N8MKYE ","M34N8MKZE ","M34N8MMXE ","M34N8MMYE ","M34N8MMZE ","M34N8RAXE ", & + "M34N8RAYE ","M34N8RAZE ","M34N8RDXE ","M34N8RDYE ","M34N8RDZE ","M34N8TAXE ","M34N8TAYE ", & + "M34N8TAZE ","M34N8TDXSS","M34N8TDYSS","M34N8TDZSS","M34N9FKXE ","M34N9FKYE ","M34N9FKZE ", & + "M34N9FMXE ","M34N9FMYE ","M34N9FMZE ","M34N9MKXE ","M34N9MKYE ","M34N9MKZE ","M34N9MMXE ", & + "M34N9MMYE ","M34N9MMZE ","M34N9RAXE ","M34N9RAYE ","M34N9RAZE ","M34N9RDXE ","M34N9RDYE ", & + "M34N9RDZE ","M34N9TAXE ","M34N9TAYE ","M34N9TAZE ","M34N9TDXSS","M34N9TDYSS","M34N9TDZSS", & + "M35N1FKXE ","M35N1FKYE ","M35N1FKZE ","M35N1FMXE ","M35N1FMYE ","M35N1FMZE ","M35N1MKXE ", & + "M35N1MKYE ","M35N1MKZE ","M35N1MMXE ","M35N1MMYE ","M35N1MMZE ","M35N1RAXE ","M35N1RAYE ", & + "M35N1RAZE ","M35N1RDXE ","M35N1RDYE ","M35N1RDZE ","M35N1TAXE ","M35N1TAYE ","M35N1TAZE ", & + "M35N1TDXSS","M35N1TDYSS","M35N1TDZSS","M35N2FKXE ","M35N2FKYE ","M35N2FKZE ","M35N2FMXE ", & + "M35N2FMYE ","M35N2FMZE ","M35N2MKXE ","M35N2MKYE ","M35N2MKZE ","M35N2MMXE ","M35N2MMYE ", & + "M35N2MMZE ","M35N2RAXE ","M35N2RAYE ","M35N2RAZE ","M35N2RDXE ","M35N2RDYE ","M35N2RDZE ", & + "M35N2TAXE ","M35N2TAYE ","M35N2TAZE ","M35N2TDXSS","M35N2TDYSS","M35N2TDZSS","M35N3FKXE ", & + "M35N3FKYE ","M35N3FKZE ","M35N3FMXE ","M35N3FMYE ","M35N3FMZE ","M35N3MKXE ","M35N3MKYE ", & + "M35N3MKZE ","M35N3MMXE ","M35N3MMYE ","M35N3MMZE ","M35N3RAXE ","M35N3RAYE ","M35N3RAZE ", & + "M35N3RDXE ","M35N3RDYE ","M35N3RDZE ","M35N3TAXE ","M35N3TAYE ","M35N3TAZE ","M35N3TDXSS", & + "M35N3TDYSS","M35N3TDZSS","M35N4FKXE ","M35N4FKYE ","M35N4FKZE ","M35N4FMXE ","M35N4FMYE ", & + "M35N4FMZE ","M35N4MKXE ","M35N4MKYE ","M35N4MKZE ","M35N4MMXE ","M35N4MMYE ","M35N4MMZE ", & + "M35N4RAXE ","M35N4RAYE ","M35N4RAZE ","M35N4RDXE ","M35N4RDYE ","M35N4RDZE ","M35N4TAXE ", & + "M35N4TAYE ","M35N4TAZE ","M35N4TDXSS","M35N4TDYSS","M35N4TDZSS","M35N5FKXE ","M35N5FKYE ", & + "M35N5FKZE ","M35N5FMXE ","M35N5FMYE ","M35N5FMZE ","M35N5MKXE ","M35N5MKYE ","M35N5MKZE ", & + "M35N5MMXE ","M35N5MMYE ","M35N5MMZE ","M35N5RAXE ","M35N5RAYE ","M35N5RAZE ","M35N5RDXE ", & + "M35N5RDYE ","M35N5RDZE ","M35N5TAXE ","M35N5TAYE ","M35N5TAZE ","M35N5TDXSS","M35N5TDYSS", & + "M35N5TDZSS","M35N6FKXE ","M35N6FKYE ","M35N6FKZE ","M35N6FMXE ","M35N6FMYE ","M35N6FMZE ", & + "M35N6MKXE ","M35N6MKYE ","M35N6MKZE ","M35N6MMXE ","M35N6MMYE ","M35N6MMZE ","M35N6RAXE ", & + "M35N6RAYE ","M35N6RAZE ","M35N6RDXE ","M35N6RDYE ","M35N6RDZE ","M35N6TAXE ","M35N6TAYE ", & + "M35N6TAZE ","M35N6TDXSS","M35N6TDYSS","M35N6TDZSS","M35N7FKXE ","M35N7FKYE ","M35N7FKZE ", & + "M35N7FMXE ","M35N7FMYE ","M35N7FMZE ","M35N7MKXE ","M35N7MKYE ","M35N7MKZE ","M35N7MMXE ", & + "M35N7MMYE ","M35N7MMZE ","M35N7RAXE ","M35N7RAYE ","M35N7RAZE ","M35N7RDXE ","M35N7RDYE ", & + "M35N7RDZE ","M35N7TAXE ","M35N7TAYE ","M35N7TAZE ","M35N7TDXSS","M35N7TDYSS","M35N7TDZSS", & + "M35N8FKXE ","M35N8FKYE ","M35N8FKZE ","M35N8FMXE ","M35N8FMYE ","M35N8FMZE ","M35N8MKXE ", & + "M35N8MKYE ","M35N8MKZE ","M35N8MMXE ","M35N8MMYE ","M35N8MMZE ","M35N8RAXE ","M35N8RAYE ", & + "M35N8RAZE ","M35N8RDXE ","M35N8RDYE ","M35N8RDZE ","M35N8TAXE ","M35N8TAYE ","M35N8TAZE ", & + "M35N8TDXSS","M35N8TDYSS","M35N8TDZSS","M35N9FKXE ","M35N9FKYE ","M35N9FKZE ","M35N9FMXE ", & + "M35N9FMYE ","M35N9FMZE ","M35N9MKXE ","M35N9MKYE ","M35N9MKZE ","M35N9MMXE ","M35N9MMYE ", & + "M35N9MMZE ","M35N9RAXE ","M35N9RAYE ","M35N9RAZE ","M35N9RDXE ","M35N9RDYE ","M35N9RDZE ", & + "M35N9TAXE ","M35N9TAYE ","M35N9TAZE ","M35N9TDXSS","M35N9TDYSS","M35N9TDZSS","M36N1FKXE ", & + "M36N1FKYE ","M36N1FKZE ","M36N1FMXE ","M36N1FMYE ","M36N1FMZE ","M36N1MKXE ","M36N1MKYE ", & + "M36N1MKZE ","M36N1MMXE ","M36N1MMYE ","M36N1MMZE ","M36N1RAXE ","M36N1RAYE ","M36N1RAZE ", & + "M36N1RDXE ","M36N1RDYE ","M36N1RDZE ","M36N1TAXE ","M36N1TAYE ","M36N1TAZE ","M36N1TDXSS", & + "M36N1TDYSS","M36N1TDZSS","M36N2FKXE ","M36N2FKYE ","M36N2FKZE ","M36N2FMXE ","M36N2FMYE ", & + "M36N2FMZE ","M36N2MKXE ","M36N2MKYE ","M36N2MKZE ","M36N2MMXE ","M36N2MMYE ","M36N2MMZE ", & + "M36N2RAXE ","M36N2RAYE ","M36N2RAZE ","M36N2RDXE ","M36N2RDYE ","M36N2RDZE ","M36N2TAXE ", & + "M36N2TAYE ","M36N2TAZE ","M36N2TDXSS","M36N2TDYSS","M36N2TDZSS","M36N3FKXE ","M36N3FKYE ", & + "M36N3FKZE ","M36N3FMXE ","M36N3FMYE ","M36N3FMZE ","M36N3MKXE ","M36N3MKYE ","M36N3MKZE ", & + "M36N3MMXE ","M36N3MMYE ","M36N3MMZE ","M36N3RAXE ","M36N3RAYE ","M36N3RAZE ","M36N3RDXE ", & + "M36N3RDYE ","M36N3RDZE ","M36N3TAXE ","M36N3TAYE ","M36N3TAZE ","M36N3TDXSS","M36N3TDYSS", & + "M36N3TDZSS","M36N4FKXE ","M36N4FKYE ","M36N4FKZE ","M36N4FMXE ","M36N4FMYE ","M36N4FMZE ", & + "M36N4MKXE ","M36N4MKYE ","M36N4MKZE ","M36N4MMXE ","M36N4MMYE ","M36N4MMZE ","M36N4RAXE ", & + "M36N4RAYE ","M36N4RAZE ","M36N4RDXE ","M36N4RDYE ","M36N4RDZE ","M36N4TAXE ","M36N4TAYE ", & + "M36N4TAZE ","M36N4TDXSS","M36N4TDYSS","M36N4TDZSS","M36N5FKXE ","M36N5FKYE ","M36N5FKZE ", & + "M36N5FMXE ","M36N5FMYE ","M36N5FMZE ","M36N5MKXE ","M36N5MKYE ","M36N5MKZE ","M36N5MMXE ", & + "M36N5MMYE ","M36N5MMZE ","M36N5RAXE ","M36N5RAYE ","M36N5RAZE ","M36N5RDXE ","M36N5RDYE ", & + "M36N5RDZE ","M36N5TAXE ","M36N5TAYE ","M36N5TAZE ","M36N5TDXSS","M36N5TDYSS","M36N5TDZSS", & + "M36N6FKXE ","M36N6FKYE ","M36N6FKZE ","M36N6FMXE ","M36N6FMYE ","M36N6FMZE ","M36N6MKXE ", & + "M36N6MKYE ","M36N6MKZE ","M36N6MMXE ","M36N6MMYE ","M36N6MMZE ","M36N6RAXE ","M36N6RAYE ", & + "M36N6RAZE ","M36N6RDXE ","M36N6RDYE ","M36N6RDZE ","M36N6TAXE ","M36N6TAYE ","M36N6TAZE ", & + "M36N6TDXSS","M36N6TDYSS","M36N6TDZSS","M36N7FKXE ","M36N7FKYE ","M36N7FKZE ","M36N7FMXE ", & + "M36N7FMYE ","M36N7FMZE ","M36N7MKXE ","M36N7MKYE ","M36N7MKZE ","M36N7MMXE ","M36N7MMYE ", & + "M36N7MMZE ","M36N7RAXE ","M36N7RAYE ","M36N7RAZE ","M36N7RDXE ","M36N7RDYE ","M36N7RDZE ", & + "M36N7TAXE ","M36N7TAYE ","M36N7TAZE ","M36N7TDXSS","M36N7TDYSS","M36N7TDZSS","M36N8FKXE ", & + "M36N8FKYE ","M36N8FKZE ","M36N8FMXE ","M36N8FMYE ","M36N8FMZE ","M36N8MKXE ","M36N8MKYE ", & + "M36N8MKZE ","M36N8MMXE ","M36N8MMYE ","M36N8MMZE ","M36N8RAXE ","M36N8RAYE ","M36N8RAZE ", & + "M36N8RDXE ","M36N8RDYE ","M36N8RDZE ","M36N8TAXE ","M36N8TAYE ","M36N8TAZE ","M36N8TDXSS", & + "M36N8TDYSS","M36N8TDZSS","M36N9FKXE ","M36N9FKYE ","M36N9FKZE ","M36N9FMXE ","M36N9FMYE ", & + "M36N9FMZE ","M36N9MKXE ","M36N9MKYE ","M36N9MKZE ","M36N9MMXE ","M36N9MMYE ","M36N9MMZE ", & + "M36N9RAXE ","M36N9RAYE ","M36N9RAZE ","M36N9RDXE ","M36N9RDYE ","M36N9RDZE ","M36N9TAXE ", & + "M36N9TAYE ","M36N9TAZE ","M36N9TDXSS","M36N9TDYSS","M36N9TDZSS","M37N1FKXE ","M37N1FKYE ", & + "M37N1FKZE ","M37N1FMXE ","M37N1FMYE ","M37N1FMZE ","M37N1MKXE ","M37N1MKYE ","M37N1MKZE ", & + "M37N1MMXE ","M37N1MMYE ","M37N1MMZE ","M37N1RAXE ","M37N1RAYE ","M37N1RAZE ","M37N1RDXE ", & + "M37N1RDYE ","M37N1RDZE ","M37N1TAXE ","M37N1TAYE ","M37N1TAZE ","M37N1TDXSS","M37N1TDYSS", & + "M37N1TDZSS","M37N2FKXE ","M37N2FKYE ","M37N2FKZE ","M37N2FMXE ","M37N2FMYE ","M37N2FMZE ", & + "M37N2MKXE ","M37N2MKYE ","M37N2MKZE ","M37N2MMXE ","M37N2MMYE ","M37N2MMZE ","M37N2RAXE ", & + "M37N2RAYE ","M37N2RAZE ","M37N2RDXE ","M37N2RDYE ","M37N2RDZE ","M37N2TAXE ","M37N2TAYE ", & + "M37N2TAZE ","M37N2TDXSS","M37N2TDYSS","M37N2TDZSS","M37N3FKXE ","M37N3FKYE ","M37N3FKZE ", & + "M37N3FMXE ","M37N3FMYE ","M37N3FMZE ","M37N3MKXE ","M37N3MKYE ","M37N3MKZE ","M37N3MMXE ", & + "M37N3MMYE ","M37N3MMZE ","M37N3RAXE ","M37N3RAYE ","M37N3RAZE ","M37N3RDXE ","M37N3RDYE ", & + "M37N3RDZE ","M37N3TAXE ","M37N3TAYE ","M37N3TAZE ","M37N3TDXSS","M37N3TDYSS","M37N3TDZSS", & + "M37N4FKXE ","M37N4FKYE ","M37N4FKZE ","M37N4FMXE ","M37N4FMYE ","M37N4FMZE ","M37N4MKXE ", & + "M37N4MKYE ","M37N4MKZE ","M37N4MMXE ","M37N4MMYE ","M37N4MMZE ","M37N4RAXE ","M37N4RAYE ", & + "M37N4RAZE ","M37N4RDXE ","M37N4RDYE ","M37N4RDZE ","M37N4TAXE ","M37N4TAYE ","M37N4TAZE ", & + "M37N4TDXSS","M37N4TDYSS","M37N4TDZSS","M37N5FKXE ","M37N5FKYE ","M37N5FKZE ","M37N5FMXE ", & + "M37N5FMYE ","M37N5FMZE ","M37N5MKXE ","M37N5MKYE ","M37N5MKZE ","M37N5MMXE ","M37N5MMYE ", & + "M37N5MMZE ","M37N5RAXE ","M37N5RAYE ","M37N5RAZE ","M37N5RDXE ","M37N5RDYE ","M37N5RDZE ", & + "M37N5TAXE ","M37N5TAYE ","M37N5TAZE ","M37N5TDXSS","M37N5TDYSS","M37N5TDZSS","M37N6FKXE ", & + "M37N6FKYE ","M37N6FKZE ","M37N6FMXE ","M37N6FMYE ","M37N6FMZE ","M37N6MKXE ","M37N6MKYE ", & + "M37N6MKZE ","M37N6MMXE ","M37N6MMYE ","M37N6MMZE ","M37N6RAXE ","M37N6RAYE ","M37N6RAZE ", & + "M37N6RDXE ","M37N6RDYE ","M37N6RDZE ","M37N6TAXE ","M37N6TAYE ","M37N6TAZE ","M37N6TDXSS", & + "M37N6TDYSS","M37N6TDZSS","M37N7FKXE ","M37N7FKYE ","M37N7FKZE ","M37N7FMXE ","M37N7FMYE ", & + "M37N7FMZE ","M37N7MKXE ","M37N7MKYE ","M37N7MKZE ","M37N7MMXE ","M37N7MMYE ","M37N7MMZE ", & + "M37N7RAXE ","M37N7RAYE ","M37N7RAZE ","M37N7RDXE ","M37N7RDYE ","M37N7RDZE ","M37N7TAXE ", & + "M37N7TAYE ","M37N7TAZE ","M37N7TDXSS","M37N7TDYSS","M37N7TDZSS","M37N8FKXE ","M37N8FKYE ", & + "M37N8FKZE ","M37N8FMXE ","M37N8FMYE ","M37N8FMZE ","M37N8MKXE ","M37N8MKYE ","M37N8MKZE ", & + "M37N8MMXE ","M37N8MMYE ","M37N8MMZE ","M37N8RAXE ","M37N8RAYE ","M37N8RAZE ","M37N8RDXE ", & + "M37N8RDYE ","M37N8RDZE ","M37N8TAXE ","M37N8TAYE ","M37N8TAZE ","M37N8TDXSS","M37N8TDYSS", & + "M37N8TDZSS","M37N9FKXE ","M37N9FKYE ","M37N9FKZE ","M37N9FMXE ","M37N9FMYE ","M37N9FMZE ", & + "M37N9MKXE ","M37N9MKYE ","M37N9MKZE ","M37N9MMXE ","M37N9MMYE ","M37N9MMZE ","M37N9RAXE ", & + "M37N9RAYE ","M37N9RAZE ","M37N9RDXE ","M37N9RDYE ","M37N9RDZE ","M37N9TAXE ","M37N9TAYE ", & + "M37N9TAZE ","M37N9TDXSS","M37N9TDYSS","M37N9TDZSS","M38N1FKXE ","M38N1FKYE ","M38N1FKZE ", & + "M38N1FMXE ","M38N1FMYE ","M38N1FMZE ","M38N1MKXE ","M38N1MKYE ","M38N1MKZE ","M38N1MMXE ", & + "M38N1MMYE ","M38N1MMZE ","M38N1RAXE ","M38N1RAYE ","M38N1RAZE ","M38N1RDXE ","M38N1RDYE ", & + "M38N1RDZE ","M38N1TAXE ","M38N1TAYE ","M38N1TAZE ","M38N1TDXSS","M38N1TDYSS","M38N1TDZSS", & + "M38N2FKXE ","M38N2FKYE ","M38N2FKZE ","M38N2FMXE ","M38N2FMYE ","M38N2FMZE ","M38N2MKXE ", & + "M38N2MKYE ","M38N2MKZE ","M38N2MMXE ","M38N2MMYE ","M38N2MMZE ","M38N2RAXE ","M38N2RAYE ", & + "M38N2RAZE ","M38N2RDXE ","M38N2RDYE ","M38N2RDZE ","M38N2TAXE ","M38N2TAYE ","M38N2TAZE ", & + "M38N2TDXSS","M38N2TDYSS","M38N2TDZSS","M38N3FKXE ","M38N3FKYE ","M38N3FKZE ","M38N3FMXE ", & + "M38N3FMYE ","M38N3FMZE ","M38N3MKXE ","M38N3MKYE ","M38N3MKZE ","M38N3MMXE ","M38N3MMYE ", & + "M38N3MMZE ","M38N3RAXE ","M38N3RAYE ","M38N3RAZE ","M38N3RDXE ","M38N3RDYE ","M38N3RDZE ", & + "M38N3TAXE ","M38N3TAYE ","M38N3TAZE ","M38N3TDXSS","M38N3TDYSS","M38N3TDZSS","M38N4FKXE ", & + "M38N4FKYE ","M38N4FKZE ","M38N4FMXE ","M38N4FMYE ","M38N4FMZE ","M38N4MKXE ","M38N4MKYE ", & + "M38N4MKZE ","M38N4MMXE ","M38N4MMYE ","M38N4MMZE ","M38N4RAXE ","M38N4RAYE ","M38N4RAZE ", & + "M38N4RDXE ","M38N4RDYE ","M38N4RDZE ","M38N4TAXE ","M38N4TAYE ","M38N4TAZE ","M38N4TDXSS", & + "M38N4TDYSS","M38N4TDZSS","M38N5FKXE ","M38N5FKYE ","M38N5FKZE ","M38N5FMXE ","M38N5FMYE ", & + "M38N5FMZE ","M38N5MKXE ","M38N5MKYE ","M38N5MKZE ","M38N5MMXE ","M38N5MMYE ","M38N5MMZE ", & + "M38N5RAXE ","M38N5RAYE ","M38N5RAZE ","M38N5RDXE ","M38N5RDYE ","M38N5RDZE ","M38N5TAXE ", & + "M38N5TAYE ","M38N5TAZE ","M38N5TDXSS","M38N5TDYSS","M38N5TDZSS","M38N6FKXE ","M38N6FKYE ", & + "M38N6FKZE ","M38N6FMXE ","M38N6FMYE ","M38N6FMZE ","M38N6MKXE ","M38N6MKYE ","M38N6MKZE ", & + "M38N6MMXE ","M38N6MMYE ","M38N6MMZE ","M38N6RAXE ","M38N6RAYE ","M38N6RAZE ","M38N6RDXE ", & + "M38N6RDYE ","M38N6RDZE ","M38N6TAXE ","M38N6TAYE ","M38N6TAZE ","M38N6TDXSS","M38N6TDYSS", & + "M38N6TDZSS","M38N7FKXE ","M38N7FKYE ","M38N7FKZE ","M38N7FMXE ","M38N7FMYE ","M38N7FMZE ", & + "M38N7MKXE ","M38N7MKYE ","M38N7MKZE ","M38N7MMXE ","M38N7MMYE ","M38N7MMZE ","M38N7RAXE ", & + "M38N7RAYE ","M38N7RAZE ","M38N7RDXE ","M38N7RDYE ","M38N7RDZE ","M38N7TAXE ","M38N7TAYE ", & + "M38N7TAZE ","M38N7TDXSS","M38N7TDYSS","M38N7TDZSS","M38N8FKXE ","M38N8FKYE ","M38N8FKZE ", & + "M38N8FMXE ","M38N8FMYE ","M38N8FMZE ","M38N8MKXE ","M38N8MKYE ","M38N8MKZE ","M38N8MMXE ", & + "M38N8MMYE ","M38N8MMZE ","M38N8RAXE ","M38N8RAYE ","M38N8RAZE ","M38N8RDXE ","M38N8RDYE ", & + "M38N8RDZE ","M38N8TAXE ","M38N8TAYE ","M38N8TAZE ","M38N8TDXSS","M38N8TDYSS","M38N8TDZSS", & + "M38N9FKXE ","M38N9FKYE ","M38N9FKZE ","M38N9FMXE ","M38N9FMYE ","M38N9FMZE ","M38N9MKXE ", & + "M38N9MKYE ","M38N9MKZE ","M38N9MMXE ","M38N9MMYE ","M38N9MMZE ","M38N9RAXE ","M38N9RAYE ", & + "M38N9RAZE ","M38N9RDXE ","M38N9RDYE ","M38N9RDZE ","M38N9TAXE ","M38N9TAYE ","M38N9TAZE ", & + "M38N9TDXSS","M38N9TDYSS","M38N9TDZSS","M39N1FKXE ","M39N1FKYE ","M39N1FKZE ","M39N1FMXE ", & + "M39N1FMYE ","M39N1FMZE ","M39N1MKXE ","M39N1MKYE ","M39N1MKZE ","M39N1MMXE ","M39N1MMYE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry6(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M39N1MMZE ","M39N1RAXE ","M39N1RAYE ","M39N1RAZE ","M39N1RDXE ","M39N1RDYE ","M39N1RDZE ", & + "M39N1TAXE ","M39N1TAYE ","M39N1TAZE ","M39N1TDXSS","M39N1TDYSS","M39N1TDZSS","M39N2FKXE ", & + "M39N2FKYE ","M39N2FKZE ","M39N2FMXE ","M39N2FMYE ","M39N2FMZE ","M39N2MKXE ","M39N2MKYE ", & + "M39N2MKZE ","M39N2MMXE ","M39N2MMYE ","M39N2MMZE ","M39N2RAXE ","M39N2RAYE ","M39N2RAZE ", & + "M39N2RDXE ","M39N2RDYE ","M39N2RDZE ","M39N2TAXE ","M39N2TAYE ","M39N2TAZE ","M39N2TDXSS", & + "M39N2TDYSS","M39N2TDZSS","M39N3FKXE ","M39N3FKYE ","M39N3FKZE ","M39N3FMXE ","M39N3FMYE ", & + "M39N3FMZE ","M39N3MKXE ","M39N3MKYE ","M39N3MKZE ","M39N3MMXE ","M39N3MMYE ","M39N3MMZE ", & + "M39N3RAXE ","M39N3RAYE ","M39N3RAZE ","M39N3RDXE ","M39N3RDYE ","M39N3RDZE ","M39N3TAXE ", & + "M39N3TAYE ","M39N3TAZE ","M39N3TDXSS","M39N3TDYSS","M39N3TDZSS","M39N4FKXE ","M39N4FKYE ", & + "M39N4FKZE ","M39N4FMXE ","M39N4FMYE ","M39N4FMZE ","M39N4MKXE ","M39N4MKYE ","M39N4MKZE ", & + "M39N4MMXE ","M39N4MMYE ","M39N4MMZE ","M39N4RAXE ","M39N4RAYE ","M39N4RAZE ","M39N4RDXE ", & + "M39N4RDYE ","M39N4RDZE ","M39N4TAXE ","M39N4TAYE ","M39N4TAZE ","M39N4TDXSS","M39N4TDYSS", & + "M39N4TDZSS","M39N5FKXE ","M39N5FKYE ","M39N5FKZE ","M39N5FMXE ","M39N5FMYE ","M39N5FMZE ", & + "M39N5MKXE ","M39N5MKYE ","M39N5MKZE ","M39N5MMXE ","M39N5MMYE ","M39N5MMZE ","M39N5RAXE ", & + "M39N5RAYE ","M39N5RAZE ","M39N5RDXE ","M39N5RDYE ","M39N5RDZE ","M39N5TAXE ","M39N5TAYE ", & + "M39N5TAZE ","M39N5TDXSS","M39N5TDYSS","M39N5TDZSS","M39N6FKXE ","M39N6FKYE ","M39N6FKZE ", & + "M39N6FMXE ","M39N6FMYE ","M39N6FMZE ","M39N6MKXE ","M39N6MKYE ","M39N6MKZE ","M39N6MMXE ", & + "M39N6MMYE ","M39N6MMZE ","M39N6RAXE ","M39N6RAYE ","M39N6RAZE ","M39N6RDXE ","M39N6RDYE ", & + "M39N6RDZE ","M39N6TAXE ","M39N6TAYE ","M39N6TAZE ","M39N6TDXSS","M39N6TDYSS","M39N6TDZSS", & + "M39N7FKXE ","M39N7FKYE ","M39N7FKZE ","M39N7FMXE ","M39N7FMYE ","M39N7FMZE ","M39N7MKXE ", & + "M39N7MKYE ","M39N7MKZE ","M39N7MMXE ","M39N7MMYE ","M39N7MMZE ","M39N7RAXE ","M39N7RAYE ", & + "M39N7RAZE ","M39N7RDXE ","M39N7RDYE ","M39N7RDZE ","M39N7TAXE ","M39N7TAYE ","M39N7TAZE ", & + "M39N7TDXSS","M39N7TDYSS","M39N7TDZSS","M39N8FKXE ","M39N8FKYE ","M39N8FKZE ","M39N8FMXE ", & + "M39N8FMYE ","M39N8FMZE ","M39N8MKXE ","M39N8MKYE ","M39N8MKZE ","M39N8MMXE ","M39N8MMYE ", & + "M39N8MMZE ","M39N8RAXE ","M39N8RAYE ","M39N8RAZE ","M39N8RDXE ","M39N8RDYE ","M39N8RDZE ", & + "M39N8TAXE ","M39N8TAYE ","M39N8TAZE ","M39N8TDXSS","M39N8TDYSS","M39N8TDZSS","M39N9FKXE ", & + "M39N9FKYE ","M39N9FKZE ","M39N9FMXE ","M39N9FMYE ","M39N9FMZE ","M39N9MKXE ","M39N9MKYE ", & + "M39N9MKZE ","M39N9MMXE ","M39N9MMYE ","M39N9MMZE ","M39N9RAXE ","M39N9RAYE ","M39N9RAZE ", & + "M39N9RDXE ","M39N9RDYE ","M39N9RDZE ","M39N9TAXE ","M39N9TAYE ","M39N9TAZE ","M39N9TDXSS", & + "M39N9TDYSS","M39N9TDZSS","M40N1FKXE ","M40N1FKYE ","M40N1FKZE ","M40N1FMXE ","M40N1FMYE ", & + "M40N1FMZE ","M40N1MKXE ","M40N1MKYE ","M40N1MKZE ","M40N1MMXE ","M40N1MMYE ","M40N1MMZE ", & + "M40N1RAXE ","M40N1RAYE ","M40N1RAZE ","M40N1RDXE ","M40N1RDYE ","M40N1RDZE ","M40N1TAXE ", & + "M40N1TAYE ","M40N1TAZE ","M40N1TDXSS","M40N1TDYSS","M40N1TDZSS","M40N2FKXE ","M40N2FKYE ", & + "M40N2FKZE ","M40N2FMXE ","M40N2FMYE ","M40N2FMZE ","M40N2MKXE ","M40N2MKYE ","M40N2MKZE ", & + "M40N2MMXE ","M40N2MMYE ","M40N2MMZE ","M40N2RAXE ","M40N2RAYE ","M40N2RAZE ","M40N2RDXE ", & + "M40N2RDYE ","M40N2RDZE ","M40N2TAXE ","M40N2TAYE ","M40N2TAZE ","M40N2TDXSS","M40N2TDYSS", & + "M40N2TDZSS","M40N3FKXE ","M40N3FKYE ","M40N3FKZE ","M40N3FMXE ","M40N3FMYE ","M40N3FMZE ", & + "M40N3MKXE ","M40N3MKYE ","M40N3MKZE ","M40N3MMXE ","M40N3MMYE ","M40N3MMZE ","M40N3RAXE ", & + "M40N3RAYE ","M40N3RAZE ","M40N3RDXE ","M40N3RDYE ","M40N3RDZE ","M40N3TAXE ","M40N3TAYE ", & + "M40N3TAZE ","M40N3TDXSS","M40N3TDYSS","M40N3TDZSS","M40N4FKXE ","M40N4FKYE ","M40N4FKZE ", & + "M40N4FMXE ","M40N4FMYE ","M40N4FMZE ","M40N4MKXE ","M40N4MKYE ","M40N4MKZE ","M40N4MMXE ", & + "M40N4MMYE ","M40N4MMZE ","M40N4RAXE ","M40N4RAYE ","M40N4RAZE ","M40N4RDXE ","M40N4RDYE ", & + "M40N4RDZE ","M40N4TAXE ","M40N4TAYE ","M40N4TAZE ","M40N4TDXSS","M40N4TDYSS","M40N4TDZSS", & + "M40N5FKXE ","M40N5FKYE ","M40N5FKZE ","M40N5FMXE ","M40N5FMYE ","M40N5FMZE ","M40N5MKXE ", & + "M40N5MKYE ","M40N5MKZE ","M40N5MMXE ","M40N5MMYE ","M40N5MMZE ","M40N5RAXE ","M40N5RAYE ", & + "M40N5RAZE ","M40N5RDXE ","M40N5RDYE ","M40N5RDZE ","M40N5TAXE ","M40N5TAYE ","M40N5TAZE ", & + "M40N5TDXSS","M40N5TDYSS","M40N5TDZSS","M40N6FKXE ","M40N6FKYE ","M40N6FKZE ","M40N6FMXE ", & + "M40N6FMYE ","M40N6FMZE ","M40N6MKXE ","M40N6MKYE ","M40N6MKZE ","M40N6MMXE ","M40N6MMYE ", & + "M40N6MMZE ","M40N6RAXE ","M40N6RAYE ","M40N6RAZE ","M40N6RDXE ","M40N6RDYE ","M40N6RDZE ", & + "M40N6TAXE ","M40N6TAYE ","M40N6TAZE ","M40N6TDXSS","M40N6TDYSS","M40N6TDZSS","M40N7FKXE ", & + "M40N7FKYE ","M40N7FKZE ","M40N7FMXE ","M40N7FMYE ","M40N7FMZE ","M40N7MKXE ","M40N7MKYE ", & + "M40N7MKZE ","M40N7MMXE ","M40N7MMYE ","M40N7MMZE ","M40N7RAXE ","M40N7RAYE ","M40N7RAZE ", & + "M40N7RDXE ","M40N7RDYE ","M40N7RDZE ","M40N7TAXE ","M40N7TAYE ","M40N7TAZE ","M40N7TDXSS", & + "M40N7TDYSS","M40N7TDZSS","M40N8FKXE ","M40N8FKYE ","M40N8FKZE ","M40N8FMXE ","M40N8FMYE ", & + "M40N8FMZE ","M40N8MKXE ","M40N8MKYE ","M40N8MKZE ","M40N8MMXE ","M40N8MMYE ","M40N8MMZE ", & + "M40N8RAXE ","M40N8RAYE ","M40N8RAZE ","M40N8RDXE ","M40N8RDYE ","M40N8RDZE ","M40N8TAXE ", & + "M40N8TAYE ","M40N8TAZE ","M40N8TDXSS","M40N8TDYSS","M40N8TDZSS","M40N9FKXE ","M40N9FKYE ", & + "M40N9FKZE ","M40N9FMXE ","M40N9FMYE ","M40N9FMZE ","M40N9MKXE ","M40N9MKYE ","M40N9MKZE ", & + "M40N9MMXE ","M40N9MMYE ","M40N9MMZE ","M40N9RAXE ","M40N9RAYE ","M40N9RAZE ","M40N9RDXE ", & + "M40N9RDYE ","M40N9RDZE ","M40N9TAXE ","M40N9TAYE ","M40N9TAZE ","M40N9TDXSS","M40N9TDYSS", & + "M40N9TDZSS","M41N1FKXE ","M41N1FKYE ","M41N1FKZE ","M41N1FMXE ","M41N1FMYE ","M41N1FMZE ", & + "M41N1MKXE ","M41N1MKYE ","M41N1MKZE ","M41N1MMXE ","M41N1MMYE ","M41N1MMZE ","M41N1RAXE ", & + "M41N1RAYE ","M41N1RAZE ","M41N1RDXE ","M41N1RDYE ","M41N1RDZE ","M41N1TAXE ","M41N1TAYE ", & + "M41N1TAZE ","M41N1TDXSS","M41N1TDYSS","M41N1TDZSS","M41N2FKXE ","M41N2FKYE ","M41N2FKZE ", & + "M41N2FMXE ","M41N2FMYE ","M41N2FMZE ","M41N2MKXE ","M41N2MKYE ","M41N2MKZE ","M41N2MMXE ", & + "M41N2MMYE ","M41N2MMZE ","M41N2RAXE ","M41N2RAYE ","M41N2RAZE ","M41N2RDXE ","M41N2RDYE ", & + "M41N2RDZE ","M41N2TAXE ","M41N2TAYE ","M41N2TAZE ","M41N2TDXSS","M41N2TDYSS","M41N2TDZSS", & + "M41N3FKXE ","M41N3FKYE ","M41N3FKZE ","M41N3FMXE ","M41N3FMYE ","M41N3FMZE ","M41N3MKXE ", & + "M41N3MKYE ","M41N3MKZE ","M41N3MMXE ","M41N3MMYE ","M41N3MMZE ","M41N3RAXE ","M41N3RAYE ", & + "M41N3RAZE ","M41N3RDXE ","M41N3RDYE ","M41N3RDZE ","M41N3TAXE ","M41N3TAYE ","M41N3TAZE ", & + "M41N3TDXSS","M41N3TDYSS","M41N3TDZSS","M41N4FKXE ","M41N4FKYE ","M41N4FKZE ","M41N4FMXE ", & + "M41N4FMYE ","M41N4FMZE ","M41N4MKXE ","M41N4MKYE ","M41N4MKZE ","M41N4MMXE ","M41N4MMYE ", & + "M41N4MMZE ","M41N4RAXE ","M41N4RAYE ","M41N4RAZE ","M41N4RDXE ","M41N4RDYE ","M41N4RDZE ", & + "M41N4TAXE ","M41N4TAYE ","M41N4TAZE ","M41N4TDXSS","M41N4TDYSS","M41N4TDZSS","M41N5FKXE ", & + "M41N5FKYE ","M41N5FKZE ","M41N5FMXE ","M41N5FMYE ","M41N5FMZE ","M41N5MKXE ","M41N5MKYE ", & + "M41N5MKZE ","M41N5MMXE ","M41N5MMYE ","M41N5MMZE ","M41N5RAXE ","M41N5RAYE ","M41N5RAZE ", & + "M41N5RDXE ","M41N5RDYE ","M41N5RDZE ","M41N5TAXE ","M41N5TAYE ","M41N5TAZE ","M41N5TDXSS", & + "M41N5TDYSS","M41N5TDZSS","M41N6FKXE ","M41N6FKYE ","M41N6FKZE ","M41N6FMXE ","M41N6FMYE ", & + "M41N6FMZE ","M41N6MKXE ","M41N6MKYE ","M41N6MKZE ","M41N6MMXE ","M41N6MMYE ","M41N6MMZE ", & + "M41N6RAXE ","M41N6RAYE ","M41N6RAZE ","M41N6RDXE ","M41N6RDYE ","M41N6RDZE ","M41N6TAXE ", & + "M41N6TAYE ","M41N6TAZE ","M41N6TDXSS","M41N6TDYSS","M41N6TDZSS","M41N7FKXE ","M41N7FKYE ", & + "M41N7FKZE ","M41N7FMXE ","M41N7FMYE ","M41N7FMZE ","M41N7MKXE ","M41N7MKYE ","M41N7MKZE ", & + "M41N7MMXE ","M41N7MMYE ","M41N7MMZE ","M41N7RAXE ","M41N7RAYE ","M41N7RAZE ","M41N7RDXE ", & + "M41N7RDYE ","M41N7RDZE ","M41N7TAXE ","M41N7TAYE ","M41N7TAZE ","M41N7TDXSS","M41N7TDYSS", & + "M41N7TDZSS","M41N8FKXE ","M41N8FKYE ","M41N8FKZE ","M41N8FMXE ","M41N8FMYE ","M41N8FMZE ", & + "M41N8MKXE ","M41N8MKYE ","M41N8MKZE ","M41N8MMXE ","M41N8MMYE ","M41N8MMZE ","M41N8RAXE ", & + "M41N8RAYE ","M41N8RAZE ","M41N8RDXE ","M41N8RDYE ","M41N8RDZE ","M41N8TAXE ","M41N8TAYE ", & + "M41N8TAZE ","M41N8TDXSS","M41N8TDYSS","M41N8TDZSS","M41N9FKXE ","M41N9FKYE ","M41N9FKZE ", & + "M41N9FMXE ","M41N9FMYE ","M41N9FMZE ","M41N9MKXE ","M41N9MKYE ","M41N9MKZE ","M41N9MMXE ", & + "M41N9MMYE ","M41N9MMZE ","M41N9RAXE ","M41N9RAYE ","M41N9RAZE ","M41N9RDXE ","M41N9RDYE ", & + "M41N9RDZE ","M41N9TAXE ","M41N9TAYE ","M41N9TAZE ","M41N9TDXSS","M41N9TDYSS","M41N9TDZSS", & + "M42N1FKXE ","M42N1FKYE ","M42N1FKZE ","M42N1FMXE ","M42N1FMYE ","M42N1FMZE ","M42N1MKXE ", & + "M42N1MKYE ","M42N1MKZE ","M42N1MMXE ","M42N1MMYE ","M42N1MMZE ","M42N1RAXE ","M42N1RAYE ", & + "M42N1RAZE ","M42N1RDXE ","M42N1RDYE ","M42N1RDZE ","M42N1TAXE ","M42N1TAYE ","M42N1TAZE ", & + "M42N1TDXSS","M42N1TDYSS","M42N1TDZSS","M42N2FKXE ","M42N2FKYE ","M42N2FKZE ","M42N2FMXE ", & + "M42N2FMYE ","M42N2FMZE ","M42N2MKXE ","M42N2MKYE ","M42N2MKZE ","M42N2MMXE ","M42N2MMYE ", & + "M42N2MMZE ","M42N2RAXE ","M42N2RAYE ","M42N2RAZE ","M42N2RDXE ","M42N2RDYE ","M42N2RDZE ", & + "M42N2TAXE ","M42N2TAYE ","M42N2TAZE ","M42N2TDXSS","M42N2TDYSS","M42N2TDZSS","M42N3FKXE ", & + "M42N3FKYE ","M42N3FKZE ","M42N3FMXE ","M42N3FMYE ","M42N3FMZE ","M42N3MKXE ","M42N3MKYE ", & + "M42N3MKZE ","M42N3MMXE ","M42N3MMYE ","M42N3MMZE ","M42N3RAXE ","M42N3RAYE ","M42N3RAZE ", & + "M42N3RDXE ","M42N3RDYE ","M42N3RDZE ","M42N3TAXE ","M42N3TAYE ","M42N3TAZE ","M42N3TDXSS", & + "M42N3TDYSS","M42N3TDZSS","M42N4FKXE ","M42N4FKYE ","M42N4FKZE ","M42N4FMXE ","M42N4FMYE ", & + "M42N4FMZE ","M42N4MKXE ","M42N4MKYE ","M42N4MKZE ","M42N4MMXE ","M42N4MMYE ","M42N4MMZE ", & + "M42N4RAXE ","M42N4RAYE ","M42N4RAZE ","M42N4RDXE ","M42N4RDYE ","M42N4RDZE ","M42N4TAXE ", & + "M42N4TAYE ","M42N4TAZE ","M42N4TDXSS","M42N4TDYSS","M42N4TDZSS","M42N5FKXE ","M42N5FKYE ", & + "M42N5FKZE ","M42N5FMXE ","M42N5FMYE ","M42N5FMZE ","M42N5MKXE ","M42N5MKYE ","M42N5MKZE ", & + "M42N5MMXE ","M42N5MMYE ","M42N5MMZE ","M42N5RAXE ","M42N5RAYE ","M42N5RAZE ","M42N5RDXE ", & + "M42N5RDYE ","M42N5RDZE ","M42N5TAXE ","M42N5TAYE ","M42N5TAZE ","M42N5TDXSS","M42N5TDYSS", & + "M42N5TDZSS","M42N6FKXE ","M42N6FKYE ","M42N6FKZE ","M42N6FMXE ","M42N6FMYE ","M42N6FMZE ", & + "M42N6MKXE ","M42N6MKYE ","M42N6MKZE ","M42N6MMXE ","M42N6MMYE ","M42N6MMZE ","M42N6RAXE ", & + "M42N6RAYE ","M42N6RAZE ","M42N6RDXE ","M42N6RDYE ","M42N6RDZE ","M42N6TAXE ","M42N6TAYE ", & + "M42N6TAZE ","M42N6TDXSS","M42N6TDYSS","M42N6TDZSS","M42N7FKXE ","M42N7FKYE ","M42N7FKZE ", & + "M42N7FMXE ","M42N7FMYE ","M42N7FMZE ","M42N7MKXE ","M42N7MKYE ","M42N7MKZE ","M42N7MMXE ", & + "M42N7MMYE ","M42N7MMZE ","M42N7RAXE ","M42N7RAYE ","M42N7RAZE ","M42N7RDXE ","M42N7RDYE ", & + "M42N7RDZE ","M42N7TAXE ","M42N7TAYE ","M42N7TAZE ","M42N7TDXSS","M42N7TDYSS","M42N7TDZSS", & + "M42N8FKXE ","M42N8FKYE ","M42N8FKZE ","M42N8FMXE ","M42N8FMYE ","M42N8FMZE ","M42N8MKXE ", & + "M42N8MKYE ","M42N8MKZE ","M42N8MMXE ","M42N8MMYE ","M42N8MMZE ","M42N8RAXE ","M42N8RAYE ", & + "M42N8RAZE ","M42N8RDXE ","M42N8RDYE ","M42N8RDZE ","M42N8TAXE ","M42N8TAYE ","M42N8TAZE ", & + "M42N8TDXSS","M42N8TDYSS","M42N8TDZSS","M42N9FKXE ","M42N9FKYE ","M42N9FKZE ","M42N9FMXE ", & + "M42N9FMYE ","M42N9FMZE ","M42N9MKXE ","M42N9MKYE ","M42N9MKZE ","M42N9MMXE ","M42N9MMYE ", & + "M42N9MMZE ","M42N9RAXE ","M42N9RAYE ","M42N9RAZE ","M42N9RDXE ","M42N9RDYE ","M42N9RDZE ", & + "M42N9TAXE ","M42N9TAYE ","M42N9TAZE ","M42N9TDXSS","M42N9TDYSS","M42N9TDZSS","M43N1FKXE ", & + "M43N1FKYE ","M43N1FKZE ","M43N1FMXE ","M43N1FMYE ","M43N1FMZE ","M43N1MKXE ","M43N1MKYE ", & + "M43N1MKZE ","M43N1MMXE ","M43N1MMYE ","M43N1MMZE ","M43N1RAXE ","M43N1RAYE ","M43N1RAZE ", & + "M43N1RDXE ","M43N1RDYE ","M43N1RDZE ","M43N1TAXE ","M43N1TAYE ","M43N1TAZE ","M43N1TDXSS", & + "M43N1TDYSS","M43N1TDZSS","M43N2FKXE ","M43N2FKYE ","M43N2FKZE ","M43N2FMXE ","M43N2FMYE ", & + "M43N2FMZE ","M43N2MKXE ","M43N2MKYE ","M43N2MKZE ","M43N2MMXE ","M43N2MMYE ","M43N2MMZE ", & + "M43N2RAXE ","M43N2RAYE ","M43N2RAZE ","M43N2RDXE ","M43N2RDYE ","M43N2RDZE ","M43N2TAXE ", & + "M43N2TAYE ","M43N2TAZE ","M43N2TDXSS","M43N2TDYSS","M43N2TDZSS","M43N3FKXE ","M43N3FKYE ", & + "M43N3FKZE ","M43N3FMXE ","M43N3FMYE ","M43N3FMZE ","M43N3MKXE ","M43N3MKYE ","M43N3MKZE ", & + "M43N3MMXE ","M43N3MMYE ","M43N3MMZE ","M43N3RAXE ","M43N3RAYE ","M43N3RAZE ","M43N3RDXE ", & + "M43N3RDYE ","M43N3RDZE ","M43N3TAXE ","M43N3TAYE ","M43N3TAZE ","M43N3TDXSS","M43N3TDYSS", & + "M43N3TDZSS","M43N4FKXE ","M43N4FKYE ","M43N4FKZE ","M43N4FMXE ","M43N4FMYE ","M43N4FMZE ", & + "M43N4MKXE ","M43N4MKYE ","M43N4MKZE ","M43N4MMXE ","M43N4MMYE ","M43N4MMZE ","M43N4RAXE ", & + "M43N4RAYE ","M43N4RAZE ","M43N4RDXE ","M43N4RDYE ","M43N4RDZE ","M43N4TAXE ","M43N4TAYE ", & + "M43N4TAZE ","M43N4TDXSS","M43N4TDYSS","M43N4TDZSS","M43N5FKXE ","M43N5FKYE ","M43N5FKZE ", & + "M43N5FMXE ","M43N5FMYE ","M43N5FMZE ","M43N5MKXE ","M43N5MKYE ","M43N5MKZE ","M43N5MMXE ", & + "M43N5MMYE ","M43N5MMZE ","M43N5RAXE ","M43N5RAYE ","M43N5RAZE ","M43N5RDXE ","M43N5RDYE ", & + "M43N5RDZE ","M43N5TAXE ","M43N5TAYE ","M43N5TAZE ","M43N5TDXSS","M43N5TDYSS","M43N5TDZSS", & + "M43N6FKXE ","M43N6FKYE ","M43N6FKZE ","M43N6FMXE ","M43N6FMYE ","M43N6FMZE ","M43N6MKXE ", & + "M43N6MKYE ","M43N6MKZE ","M43N6MMXE ","M43N6MMYE ","M43N6MMZE ","M43N6RAXE ","M43N6RAYE ", & + "M43N6RAZE ","M43N6RDXE ","M43N6RDYE ","M43N6RDZE ","M43N6TAXE ","M43N6TAYE ","M43N6TAZE ", & + "M43N6TDXSS","M43N6TDYSS","M43N6TDZSS","M43N7FKXE ","M43N7FKYE ","M43N7FKZE ","M43N7FMXE ", & + "M43N7FMYE ","M43N7FMZE ","M43N7MKXE ","M43N7MKYE ","M43N7MKZE ","M43N7MMXE ","M43N7MMYE ", & + "M43N7MMZE ","M43N7RAXE ","M43N7RAYE ","M43N7RAZE ","M43N7RDXE ","M43N7RDYE ","M43N7RDZE ", & + "M43N7TAXE ","M43N7TAYE ","M43N7TAZE ","M43N7TDXSS","M43N7TDYSS","M43N7TDZSS","M43N8FKXE ", & + "M43N8FKYE ","M43N8FKZE ","M43N8FMXE ","M43N8FMYE ","M43N8FMZE ","M43N8MKXE ","M43N8MKYE ", & + "M43N8MKZE ","M43N8MMXE ","M43N8MMYE ","M43N8MMZE ","M43N8RAXE ","M43N8RAYE ","M43N8RAZE ", & + "M43N8RDXE ","M43N8RDYE ","M43N8RDZE ","M43N8TAXE ","M43N8TAYE ","M43N8TAZE ","M43N8TDXSS", & + "M43N8TDYSS","M43N8TDZSS","M43N9FKXE ","M43N9FKYE ","M43N9FKZE ","M43N9FMXE ","M43N9FMYE ", & + "M43N9FMZE ","M43N9MKXE ","M43N9MKYE ","M43N9MKZE ","M43N9MMXE ","M43N9MMYE ","M43N9MMZE ", & + "M43N9RAXE ","M43N9RAYE ","M43N9RAZE ","M43N9RDXE ","M43N9RDYE ","M43N9RDZE ","M43N9TAXE ", & + "M43N9TAYE ","M43N9TAZE ","M43N9TDXSS","M43N9TDYSS","M43N9TDZSS","M44N1FKXE ","M44N1FKYE ", & + "M44N1FKZE ","M44N1FMXE ","M44N1FMYE ","M44N1FMZE ","M44N1MKXE ","M44N1MKYE ","M44N1MKZE ", & + "M44N1MMXE ","M44N1MMYE ","M44N1MMZE ","M44N1RAXE ","M44N1RAYE ","M44N1RAZE ","M44N1RDXE ", & + "M44N1RDYE ","M44N1RDZE ","M44N1TAXE ","M44N1TAYE ","M44N1TAZE ","M44N1TDXSS","M44N1TDYSS", & + "M44N1TDZSS","M44N2FKXE ","M44N2FKYE ","M44N2FKZE ","M44N2FMXE ","M44N2FMYE ","M44N2FMZE ", & + "M44N2MKXE ","M44N2MKYE ","M44N2MKZE ","M44N2MMXE ","M44N2MMYE ","M44N2MMZE ","M44N2RAXE ", & + "M44N2RAYE ","M44N2RAZE ","M44N2RDXE ","M44N2RDYE ","M44N2RDZE ","M44N2TAXE ","M44N2TAYE ", & + "M44N2TAZE ","M44N2TDXSS","M44N2TDYSS","M44N2TDZSS","M44N3FKXE ","M44N3FKYE ","M44N3FKZE ", & + "M44N3FMXE ","M44N3FMYE ","M44N3FMZE ","M44N3MKXE ","M44N3MKYE ","M44N3MKZE ","M44N3MMXE ", & + "M44N3MMYE ","M44N3MMZE ","M44N3RAXE ","M44N3RAYE ","M44N3RAZE ","M44N3RDXE ","M44N3RDYE ", & + "M44N3RDZE ","M44N3TAXE ","M44N3TAYE ","M44N3TAZE ","M44N3TDXSS","M44N3TDYSS","M44N3TDZSS", & + "M44N4FKXE ","M44N4FKYE ","M44N4FKZE ","M44N4FMXE ","M44N4FMYE ","M44N4FMZE ","M44N4MKXE ", & + "M44N4MKYE ","M44N4MKZE ","M44N4MMXE ","M44N4MMYE ","M44N4MMZE ","M44N4RAXE ","M44N4RAYE ", & + "M44N4RAZE ","M44N4RDXE ","M44N4RDYE ","M44N4RDZE ","M44N4TAXE ","M44N4TAYE ","M44N4TAZE ", & + "M44N4TDXSS","M44N4TDYSS","M44N4TDZSS","M44N5FKXE ","M44N5FKYE ","M44N5FKZE ","M44N5FMXE ", & + "M44N5FMYE ","M44N5FMZE ","M44N5MKXE ","M44N5MKYE ","M44N5MKZE ","M44N5MMXE ","M44N5MMYE ", & + "M44N5MMZE ","M44N5RAXE ","M44N5RAYE ","M44N5RAZE ","M44N5RDXE ","M44N5RDYE ","M44N5RDZE ", & + "M44N5TAXE ","M44N5TAYE ","M44N5TAZE ","M44N5TDXSS","M44N5TDYSS","M44N5TDZSS","M44N6FKXE ", & + "M44N6FKYE ","M44N6FKZE ","M44N6FMXE ","M44N6FMYE ","M44N6FMZE ","M44N6MKXE ","M44N6MKYE ", & + "M44N6MKZE ","M44N6MMXE ","M44N6MMYE ","M44N6MMZE ","M44N6RAXE ","M44N6RAYE ","M44N6RAZE ", & + "M44N6RDXE ","M44N6RDYE ","M44N6RDZE ","M44N6TAXE ","M44N6TAYE ","M44N6TAZE ","M44N6TDXSS", & + "M44N6TDYSS","M44N6TDZSS","M44N7FKXE ","M44N7FKYE ","M44N7FKZE ","M44N7FMXE ","M44N7FMYE ", & + "M44N7FMZE ","M44N7MKXE ","M44N7MKYE ","M44N7MKZE ","M44N7MMXE ","M44N7MMYE ","M44N7MMZE ", & + "M44N7RAXE ","M44N7RAYE ","M44N7RAZE ","M44N7RDXE ","M44N7RDYE ","M44N7RDZE ","M44N7TAXE ", & + "M44N7TAYE ","M44N7TAZE ","M44N7TDXSS","M44N7TDYSS","M44N7TDZSS","M44N8FKXE ","M44N8FKYE ", & + "M44N8FKZE ","M44N8FMXE ","M44N8FMYE ","M44N8FMZE ","M44N8MKXE ","M44N8MKYE ","M44N8MKZE ", & + "M44N8MMXE ","M44N8MMYE ","M44N8MMZE ","M44N8RAXE ","M44N8RAYE ","M44N8RAZE ","M44N8RDXE ", & + "M44N8RDYE ","M44N8RDZE ","M44N8TAXE ","M44N8TAYE ","M44N8TAZE ","M44N8TDXSS","M44N8TDYSS", & + "M44N8TDZSS","M44N9FKXE ","M44N9FKYE ","M44N9FKZE ","M44N9FMXE ","M44N9FMYE ","M44N9FMZE ", & + "M44N9MKXE ","M44N9MKYE ","M44N9MKZE ","M44N9MMXE ","M44N9MMYE ","M44N9MMZE ","M44N9RAXE ", & + "M44N9RAYE ","M44N9RAZE ","M44N9RDXE ","M44N9RDYE ","M44N9RDZE ","M44N9TAXE ","M44N9TAYE ", & + "M44N9TAZE ","M44N9TDXSS","M44N9TDYSS","M44N9TDZSS","M45N1FKXE ","M45N1FKYE ","M45N1FKZE ", & + "M45N1FMXE ","M45N1FMYE ","M45N1FMZE ","M45N1MKXE ","M45N1MKYE ","M45N1MKZE ","M45N1MMXE ", & + "M45N1MMYE ","M45N1MMZE ","M45N1RAXE ","M45N1RAYE ","M45N1RAZE ","M45N1RDXE ","M45N1RDYE ", & + "M45N1RDZE ","M45N1TAXE ","M45N1TAYE ","M45N1TAZE ","M45N1TDXSS","M45N1TDYSS","M45N1TDZSS", & + "M45N2FKXE ","M45N2FKYE ","M45N2FKZE ","M45N2FMXE ","M45N2FMYE ","M45N2FMZE ","M45N2MKXE ", & + "M45N2MKYE ","M45N2MKZE ","M45N2MMXE ","M45N2MMYE ","M45N2MMZE ","M45N2RAXE ","M45N2RAYE ", & + "M45N2RAZE ","M45N2RDXE ","M45N2RDYE ","M45N2RDZE ","M45N2TAXE ","M45N2TAYE ","M45N2TAZE ", & + "M45N2TDXSS","M45N2TDYSS","M45N2TDZSS","M45N3FKXE ","M45N3FKYE ","M45N3FKZE ","M45N3FMXE ", & + "M45N3FMYE ","M45N3FMZE ","M45N3MKXE ","M45N3MKYE ","M45N3MKZE ","M45N3MMXE ","M45N3MMYE ", & + "M45N3MMZE ","M45N3RAXE ","M45N3RAYE ","M45N3RAZE ","M45N3RDXE ","M45N3RDYE ","M45N3RDZE ", & + "M45N3TAXE ","M45N3TAYE ","M45N3TAZE ","M45N3TDXSS","M45N3TDYSS","M45N3TDZSS","M45N4FKXE ", & + "M45N4FKYE ","M45N4FKZE ","M45N4FMXE ","M45N4FMYE ","M45N4FMZE ","M45N4MKXE ","M45N4MKYE ", & + "M45N4MKZE ","M45N4MMXE ","M45N4MMYE ","M45N4MMZE ","M45N4RAXE ","M45N4RAYE ","M45N4RAZE ", & + "M45N4RDXE ","M45N4RDYE ","M45N4RDZE ","M45N4TAXE ","M45N4TAYE ","M45N4TAZE ","M45N4TDXSS", & + "M45N4TDYSS","M45N4TDZSS","M45N5FKXE ","M45N5FKYE ","M45N5FKZE ","M45N5FMXE ","M45N5FMYE ", & + "M45N5FMZE ","M45N5MKXE ","M45N5MKYE ","M45N5MKZE ","M45N5MMXE ","M45N5MMYE ","M45N5MMZE ", & + "M45N5RAXE ","M45N5RAYE ","M45N5RAZE ","M45N5RDXE ","M45N5RDYE ","M45N5RDZE ","M45N5TAXE ", & + "M45N5TAYE ","M45N5TAZE ","M45N5TDXSS","M45N5TDYSS","M45N5TDZSS","M45N6FKXE ","M45N6FKYE ", & + "M45N6FKZE ","M45N6FMXE ","M45N6FMYE ","M45N6FMZE ","M45N6MKXE ","M45N6MKYE ","M45N6MKZE ", & + "M45N6MMXE ","M45N6MMYE ","M45N6MMZE ","M45N6RAXE ","M45N6RAYE ","M45N6RAZE ","M45N6RDXE ", & + "M45N6RDYE ","M45N6RDZE ","M45N6TAXE ","M45N6TAYE ","M45N6TAZE ","M45N6TDXSS","M45N6TDYSS", & + "M45N6TDZSS","M45N7FKXE ","M45N7FKYE ","M45N7FKZE ","M45N7FMXE ","M45N7FMYE ","M45N7FMZE ", & + "M45N7MKXE ","M45N7MKYE ","M45N7MKZE ","M45N7MMXE ","M45N7MMYE ","M45N7MMZE ","M45N7RAXE ", & + "M45N7RAYE ","M45N7RAZE ","M45N7RDXE ","M45N7RDYE ","M45N7RDZE ","M45N7TAXE ","M45N7TAYE ", & + "M45N7TAZE ","M45N7TDXSS","M45N7TDYSS","M45N7TDZSS","M45N8FKXE ","M45N8FKYE ","M45N8FKZE ", & + "M45N8FMXE ","M45N8FMYE ","M45N8FMZE ","M45N8MKXE ","M45N8MKYE ","M45N8MKZE ","M45N8MMXE ", & + "M45N8MMYE ","M45N8MMZE ","M45N8RAXE ","M45N8RAYE ","M45N8RAZE ","M45N8RDXE ","M45N8RDYE ", & + "M45N8RDZE ","M45N8TAXE ","M45N8TAYE ","M45N8TAZE ","M45N8TDXSS","M45N8TDYSS","M45N8TDZSS", & + "M45N9FKXE ","M45N9FKYE ","M45N9FKZE ","M45N9FMXE ","M45N9FMYE ","M45N9FMZE ","M45N9MKXE ", & + "M45N9MKYE ","M45N9MKZE ","M45N9MMXE ","M45N9MMYE ","M45N9MMZE ","M45N9RAXE ","M45N9RAYE ", & + "M45N9RAZE ","M45N9RDXE ","M45N9RDYE ","M45N9RDZE ","M45N9TAXE ","M45N9TAYE ","M45N9TAZE ", & + "M45N9TDXSS","M45N9TDYSS","M45N9TDZSS","M46N1FKXE ","M46N1FKYE ","M46N1FKZE ","M46N1FMXE ", & + "M46N1FMYE ","M46N1FMZE ","M46N1MKXE ","M46N1MKYE ","M46N1MKZE ","M46N1MMXE ","M46N1MMYE ", & + "M46N1MMZE ","M46N1RAXE ","M46N1RAYE ","M46N1RAZE ","M46N1RDXE ","M46N1RDYE ","M46N1RDZE ", & + "M46N1TAXE ","M46N1TAYE ","M46N1TAZE ","M46N1TDXSS","M46N1TDYSS","M46N1TDZSS","M46N2FKXE ", & + "M46N2FKYE ","M46N2FKZE ","M46N2FMXE ","M46N2FMYE ","M46N2FMZE ","M46N2MKXE ","M46N2MKYE ", & + "M46N2MKZE ","M46N2MMXE ","M46N2MMYE ","M46N2MMZE ","M46N2RAXE ","M46N2RAYE ","M46N2RAZE ", & + "M46N2RDXE ","M46N2RDYE ","M46N2RDZE ","M46N2TAXE ","M46N2TAYE ","M46N2TAZE ","M46N2TDXSS", & + "M46N2TDYSS","M46N2TDZSS","M46N3FKXE ","M46N3FKYE ","M46N3FKZE ","M46N3FMXE ","M46N3FMYE ", & + "M46N3FMZE ","M46N3MKXE ","M46N3MKYE ","M46N3MKZE ","M46N3MMXE ","M46N3MMYE ","M46N3MMZE ", & + "M46N3RAXE ","M46N3RAYE ","M46N3RAZE ","M46N3RDXE ","M46N3RDYE ","M46N3RDZE ","M46N3TAXE ", & + "M46N3TAYE ","M46N3TAZE ","M46N3TDXSS","M46N3TDYSS","M46N3TDZSS","M46N4FKXE ","M46N4FKYE ", & + "M46N4FKZE ","M46N4FMXE ","M46N4FMYE ","M46N4FMZE ","M46N4MKXE ","M46N4MKYE ","M46N4MKZE ", & + "M46N4MMXE ","M46N4MMYE ","M46N4MMZE ","M46N4RAXE ","M46N4RAYE ","M46N4RAZE ","M46N4RDXE ", & + "M46N4RDYE ","M46N4RDZE ","M46N4TAXE ","M46N4TAYE ","M46N4TAZE ","M46N4TDXSS","M46N4TDYSS", & + "M46N4TDZSS","M46N5FKXE ","M46N5FKYE ","M46N5FKZE ","M46N5FMXE ","M46N5FMYE ","M46N5FMZE ", & + "M46N5MKXE ","M46N5MKYE ","M46N5MKZE ","M46N5MMXE ","M46N5MMYE ","M46N5MMZE ","M46N5RAXE ", & + "M46N5RAYE ","M46N5RAZE ","M46N5RDXE ","M46N5RDYE ","M46N5RDZE ","M46N5TAXE ","M46N5TAYE ", & + "M46N5TAZE ","M46N5TDXSS","M46N5TDYSS","M46N5TDZSS","M46N6FKXE ","M46N6FKYE ","M46N6FKZE ", & + "M46N6FMXE ","M46N6FMYE ","M46N6FMZE ","M46N6MKXE ","M46N6MKYE ","M46N6MKZE ","M46N6MMXE ", & + "M46N6MMYE ","M46N6MMZE ","M46N6RAXE ","M46N6RAYE ","M46N6RAZE ","M46N6RDXE ","M46N6RDYE ", & + "M46N6RDZE ","M46N6TAXE ","M46N6TAYE ","M46N6TAZE ","M46N6TDXSS","M46N6TDYSS","M46N6TDZSS", & + "M46N7FKXE ","M46N7FKYE ","M46N7FKZE ","M46N7FMXE ","M46N7FMYE ","M46N7FMZE ","M46N7MKXE ", & + "M46N7MKYE ","M46N7MKZE ","M46N7MMXE ","M46N7MMYE ","M46N7MMZE ","M46N7RAXE ","M46N7RAYE ", & + "M46N7RAZE ","M46N7RDXE ","M46N7RDYE ","M46N7RDZE ","M46N7TAXE ","M46N7TAYE ","M46N7TAZE ", & + "M46N7TDXSS","M46N7TDYSS","M46N7TDZSS","M46N8FKXE ","M46N8FKYE ","M46N8FKZE ","M46N8FMXE ", & + "M46N8FMYE ","M46N8FMZE ","M46N8MKXE ","M46N8MKYE ","M46N8MKZE ","M46N8MMXE ","M46N8MMYE ", & + "M46N8MMZE ","M46N8RAXE ","M46N8RAYE ","M46N8RAZE ","M46N8RDXE ","M46N8RDYE ","M46N8RDZE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry7(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M46N8TAXE ","M46N8TAYE ","M46N8TAZE ","M46N8TDXSS","M46N8TDYSS","M46N8TDZSS","M46N9FKXE ", & + "M46N9FKYE ","M46N9FKZE ","M46N9FMXE ","M46N9FMYE ","M46N9FMZE ","M46N9MKXE ","M46N9MKYE ", & + "M46N9MKZE ","M46N9MMXE ","M46N9MMYE ","M46N9MMZE ","M46N9RAXE ","M46N9RAYE ","M46N9RAZE ", & + "M46N9RDXE ","M46N9RDYE ","M46N9RDZE ","M46N9TAXE ","M46N9TAYE ","M46N9TAZE ","M46N9TDXSS", & + "M46N9TDYSS","M46N9TDZSS","M47N1FKXE ","M47N1FKYE ","M47N1FKZE ","M47N1FMXE ","M47N1FMYE ", & + "M47N1FMZE ","M47N1MKXE ","M47N1MKYE ","M47N1MKZE ","M47N1MMXE ","M47N1MMYE ","M47N1MMZE ", & + "M47N1RAXE ","M47N1RAYE ","M47N1RAZE ","M47N1RDXE ","M47N1RDYE ","M47N1RDZE ","M47N1TAXE ", & + "M47N1TAYE ","M47N1TAZE ","M47N1TDXSS","M47N1TDYSS","M47N1TDZSS","M47N2FKXE ","M47N2FKYE ", & + "M47N2FKZE ","M47N2FMXE ","M47N2FMYE ","M47N2FMZE ","M47N2MKXE ","M47N2MKYE ","M47N2MKZE ", & + "M47N2MMXE ","M47N2MMYE ","M47N2MMZE ","M47N2RAXE ","M47N2RAYE ","M47N2RAZE ","M47N2RDXE ", & + "M47N2RDYE ","M47N2RDZE ","M47N2TAXE ","M47N2TAYE ","M47N2TAZE ","M47N2TDXSS","M47N2TDYSS", & + "M47N2TDZSS","M47N3FKXE ","M47N3FKYE ","M47N3FKZE ","M47N3FMXE ","M47N3FMYE ","M47N3FMZE ", & + "M47N3MKXE ","M47N3MKYE ","M47N3MKZE ","M47N3MMXE ","M47N3MMYE ","M47N3MMZE ","M47N3RAXE ", & + "M47N3RAYE ","M47N3RAZE ","M47N3RDXE ","M47N3RDYE ","M47N3RDZE ","M47N3TAXE ","M47N3TAYE ", & + "M47N3TAZE ","M47N3TDXSS","M47N3TDYSS","M47N3TDZSS","M47N4FKXE ","M47N4FKYE ","M47N4FKZE ", & + "M47N4FMXE ","M47N4FMYE ","M47N4FMZE ","M47N4MKXE ","M47N4MKYE ","M47N4MKZE ","M47N4MMXE ", & + "M47N4MMYE ","M47N4MMZE ","M47N4RAXE ","M47N4RAYE ","M47N4RAZE ","M47N4RDXE ","M47N4RDYE ", & + "M47N4RDZE ","M47N4TAXE ","M47N4TAYE ","M47N4TAZE ","M47N4TDXSS","M47N4TDYSS","M47N4TDZSS", & + "M47N5FKXE ","M47N5FKYE ","M47N5FKZE ","M47N5FMXE ","M47N5FMYE ","M47N5FMZE ","M47N5MKXE ", & + "M47N5MKYE ","M47N5MKZE ","M47N5MMXE ","M47N5MMYE ","M47N5MMZE ","M47N5RAXE ","M47N5RAYE ", & + "M47N5RAZE ","M47N5RDXE ","M47N5RDYE ","M47N5RDZE ","M47N5TAXE ","M47N5TAYE ","M47N5TAZE ", & + "M47N5TDXSS","M47N5TDYSS","M47N5TDZSS","M47N6FKXE ","M47N6FKYE ","M47N6FKZE ","M47N6FMXE ", & + "M47N6FMYE ","M47N6FMZE ","M47N6MKXE ","M47N6MKYE ","M47N6MKZE ","M47N6MMXE ","M47N6MMYE ", & + "M47N6MMZE ","M47N6RAXE ","M47N6RAYE ","M47N6RAZE ","M47N6RDXE ","M47N6RDYE ","M47N6RDZE ", & + "M47N6TAXE ","M47N6TAYE ","M47N6TAZE ","M47N6TDXSS","M47N6TDYSS","M47N6TDZSS","M47N7FKXE ", & + "M47N7FKYE ","M47N7FKZE ","M47N7FMXE ","M47N7FMYE ","M47N7FMZE ","M47N7MKXE ","M47N7MKYE ", & + "M47N7MKZE ","M47N7MMXE ","M47N7MMYE ","M47N7MMZE ","M47N7RAXE ","M47N7RAYE ","M47N7RAZE ", & + "M47N7RDXE ","M47N7RDYE ","M47N7RDZE ","M47N7TAXE ","M47N7TAYE ","M47N7TAZE ","M47N7TDXSS", & + "M47N7TDYSS","M47N7TDZSS","M47N8FKXE ","M47N8FKYE ","M47N8FKZE ","M47N8FMXE ","M47N8FMYE ", & + "M47N8FMZE ","M47N8MKXE ","M47N8MKYE ","M47N8MKZE ","M47N8MMXE ","M47N8MMYE ","M47N8MMZE ", & + "M47N8RAXE ","M47N8RAYE ","M47N8RAZE ","M47N8RDXE ","M47N8RDYE ","M47N8RDZE ","M47N8TAXE ", & + "M47N8TAYE ","M47N8TAZE ","M47N8TDXSS","M47N8TDYSS","M47N8TDZSS","M47N9FKXE ","M47N9FKYE ", & + "M47N9FKZE ","M47N9FMXE ","M47N9FMYE ","M47N9FMZE ","M47N9MKXE ","M47N9MKYE ","M47N9MKZE ", & + "M47N9MMXE ","M47N9MMYE ","M47N9MMZE ","M47N9RAXE ","M47N9RAYE ","M47N9RAZE ","M47N9RDXE ", & + "M47N9RDYE ","M47N9RDZE ","M47N9TAXE ","M47N9TAYE ","M47N9TAZE ","M47N9TDXSS","M47N9TDYSS", & + "M47N9TDZSS","M48N1FKXE ","M48N1FKYE ","M48N1FKZE ","M48N1FMXE ","M48N1FMYE ","M48N1FMZE ", & + "M48N1MKXE ","M48N1MKYE ","M48N1MKZE ","M48N1MMXE ","M48N1MMYE ","M48N1MMZE ","M48N1RAXE ", & + "M48N1RAYE ","M48N1RAZE ","M48N1RDXE ","M48N1RDYE ","M48N1RDZE ","M48N1TAXE ","M48N1TAYE ", & + "M48N1TAZE ","M48N1TDXSS","M48N1TDYSS","M48N1TDZSS","M48N2FKXE ","M48N2FKYE ","M48N2FKZE ", & + "M48N2FMXE ","M48N2FMYE ","M48N2FMZE ","M48N2MKXE ","M48N2MKYE ","M48N2MKZE ","M48N2MMXE ", & + "M48N2MMYE ","M48N2MMZE ","M48N2RAXE ","M48N2RAYE ","M48N2RAZE ","M48N2RDXE ","M48N2RDYE ", & + "M48N2RDZE ","M48N2TAXE ","M48N2TAYE ","M48N2TAZE ","M48N2TDXSS","M48N2TDYSS","M48N2TDZSS", & + "M48N3FKXE ","M48N3FKYE ","M48N3FKZE ","M48N3FMXE ","M48N3FMYE ","M48N3FMZE ","M48N3MKXE ", & + "M48N3MKYE ","M48N3MKZE ","M48N3MMXE ","M48N3MMYE ","M48N3MMZE ","M48N3RAXE ","M48N3RAYE ", & + "M48N3RAZE ","M48N3RDXE ","M48N3RDYE ","M48N3RDZE ","M48N3TAXE ","M48N3TAYE ","M48N3TAZE ", & + "M48N3TDXSS","M48N3TDYSS","M48N3TDZSS","M48N4FKXE ","M48N4FKYE ","M48N4FKZE ","M48N4FMXE ", & + "M48N4FMYE ","M48N4FMZE ","M48N4MKXE ","M48N4MKYE ","M48N4MKZE ","M48N4MMXE ","M48N4MMYE ", & + "M48N4MMZE ","M48N4RAXE ","M48N4RAYE ","M48N4RAZE ","M48N4RDXE ","M48N4RDYE ","M48N4RDZE ", & + "M48N4TAXE ","M48N4TAYE ","M48N4TAZE ","M48N4TDXSS","M48N4TDYSS","M48N4TDZSS","M48N5FKXE ", & + "M48N5FKYE ","M48N5FKZE ","M48N5FMXE ","M48N5FMYE ","M48N5FMZE ","M48N5MKXE ","M48N5MKYE ", & + "M48N5MKZE ","M48N5MMXE ","M48N5MMYE ","M48N5MMZE ","M48N5RAXE ","M48N5RAYE ","M48N5RAZE ", & + "M48N5RDXE ","M48N5RDYE ","M48N5RDZE ","M48N5TAXE ","M48N5TAYE ","M48N5TAZE ","M48N5TDXSS", & + "M48N5TDYSS","M48N5TDZSS","M48N6FKXE ","M48N6FKYE ","M48N6FKZE ","M48N6FMXE ","M48N6FMYE ", & + "M48N6FMZE ","M48N6MKXE ","M48N6MKYE ","M48N6MKZE ","M48N6MMXE ","M48N6MMYE ","M48N6MMZE ", & + "M48N6RAXE ","M48N6RAYE ","M48N6RAZE ","M48N6RDXE ","M48N6RDYE ","M48N6RDZE ","M48N6TAXE ", & + "M48N6TAYE ","M48N6TAZE ","M48N6TDXSS","M48N6TDYSS","M48N6TDZSS","M48N7FKXE ","M48N7FKYE ", & + "M48N7FKZE ","M48N7FMXE ","M48N7FMYE ","M48N7FMZE ","M48N7MKXE ","M48N7MKYE ","M48N7MKZE ", & + "M48N7MMXE ","M48N7MMYE ","M48N7MMZE ","M48N7RAXE ","M48N7RAYE ","M48N7RAZE ","M48N7RDXE ", & + "M48N7RDYE ","M48N7RDZE ","M48N7TAXE ","M48N7TAYE ","M48N7TAZE ","M48N7TDXSS","M48N7TDYSS", & + "M48N7TDZSS","M48N8FKXE ","M48N8FKYE ","M48N8FKZE ","M48N8FMXE ","M48N8FMYE ","M48N8FMZE ", & + "M48N8MKXE ","M48N8MKYE ","M48N8MKZE ","M48N8MMXE ","M48N8MMYE ","M48N8MMZE ","M48N8RAXE ", & + "M48N8RAYE ","M48N8RAZE ","M48N8RDXE ","M48N8RDYE ","M48N8RDZE ","M48N8TAXE ","M48N8TAYE ", & + "M48N8TAZE ","M48N8TDXSS","M48N8TDYSS","M48N8TDZSS","M48N9FKXE ","M48N9FKYE ","M48N9FKZE ", & + "M48N9FMXE ","M48N9FMYE ","M48N9FMZE ","M48N9MKXE ","M48N9MKYE ","M48N9MKZE ","M48N9MMXE ", & + "M48N9MMYE ","M48N9MMZE ","M48N9RAXE ","M48N9RAYE ","M48N9RAZE ","M48N9RDXE ","M48N9RDYE ", & + "M48N9RDZE ","M48N9TAXE ","M48N9TAYE ","M48N9TAZE ","M48N9TDXSS","M48N9TDYSS","M48N9TDZSS", & + "M49N1FKXE ","M49N1FKYE ","M49N1FKZE ","M49N1FMXE ","M49N1FMYE ","M49N1FMZE ","M49N1MKXE ", & + "M49N1MKYE ","M49N1MKZE ","M49N1MMXE ","M49N1MMYE ","M49N1MMZE ","M49N1RAXE ","M49N1RAYE ", & + "M49N1RAZE ","M49N1RDXE ","M49N1RDYE ","M49N1RDZE ","M49N1TAXE ","M49N1TAYE ","M49N1TAZE ", & + "M49N1TDXSS","M49N1TDYSS","M49N1TDZSS","M49N2FKXE ","M49N2FKYE ","M49N2FKZE ","M49N2FMXE ", & + "M49N2FMYE ","M49N2FMZE ","M49N2MKXE ","M49N2MKYE ","M49N2MKZE ","M49N2MMXE ","M49N2MMYE ", & + "M49N2MMZE ","M49N2RAXE ","M49N2RAYE ","M49N2RAZE ","M49N2RDXE ","M49N2RDYE ","M49N2RDZE ", & + "M49N2TAXE ","M49N2TAYE ","M49N2TAZE ","M49N2TDXSS","M49N2TDYSS","M49N2TDZSS","M49N3FKXE ", & + "M49N3FKYE ","M49N3FKZE ","M49N3FMXE ","M49N3FMYE ","M49N3FMZE ","M49N3MKXE ","M49N3MKYE ", & + "M49N3MKZE ","M49N3MMXE ","M49N3MMYE ","M49N3MMZE ","M49N3RAXE ","M49N3RAYE ","M49N3RAZE ", & + "M49N3RDXE ","M49N3RDYE ","M49N3RDZE ","M49N3TAXE ","M49N3TAYE ","M49N3TAZE ","M49N3TDXSS", & + "M49N3TDYSS","M49N3TDZSS","M49N4FKXE ","M49N4FKYE ","M49N4FKZE ","M49N4FMXE ","M49N4FMYE ", & + "M49N4FMZE ","M49N4MKXE ","M49N4MKYE ","M49N4MKZE ","M49N4MMXE ","M49N4MMYE ","M49N4MMZE ", & + "M49N4RAXE ","M49N4RAYE ","M49N4RAZE ","M49N4RDXE ","M49N4RDYE ","M49N4RDZE ","M49N4TAXE ", & + "M49N4TAYE ","M49N4TAZE ","M49N4TDXSS","M49N4TDYSS","M49N4TDZSS","M49N5FKXE ","M49N5FKYE ", & + "M49N5FKZE ","M49N5FMXE ","M49N5FMYE ","M49N5FMZE ","M49N5MKXE ","M49N5MKYE ","M49N5MKZE ", & + "M49N5MMXE ","M49N5MMYE ","M49N5MMZE ","M49N5RAXE ","M49N5RAYE ","M49N5RAZE ","M49N5RDXE ", & + "M49N5RDYE ","M49N5RDZE ","M49N5TAXE ","M49N5TAYE ","M49N5TAZE ","M49N5TDXSS","M49N5TDYSS", & + "M49N5TDZSS","M49N6FKXE ","M49N6FKYE ","M49N6FKZE ","M49N6FMXE ","M49N6FMYE ","M49N6FMZE ", & + "M49N6MKXE ","M49N6MKYE ","M49N6MKZE ","M49N6MMXE ","M49N6MMYE ","M49N6MMZE ","M49N6RAXE ", & + "M49N6RAYE ","M49N6RAZE ","M49N6RDXE ","M49N6RDYE ","M49N6RDZE ","M49N6TAXE ","M49N6TAYE ", & + "M49N6TAZE ","M49N6TDXSS","M49N6TDYSS","M49N6TDZSS","M49N7FKXE ","M49N7FKYE ","M49N7FKZE ", & + "M49N7FMXE ","M49N7FMYE ","M49N7FMZE ","M49N7MKXE ","M49N7MKYE ","M49N7MKZE ","M49N7MMXE ", & + "M49N7MMYE ","M49N7MMZE ","M49N7RAXE ","M49N7RAYE ","M49N7RAZE ","M49N7RDXE ","M49N7RDYE ", & + "M49N7RDZE ","M49N7TAXE ","M49N7TAYE ","M49N7TAZE ","M49N7TDXSS","M49N7TDYSS","M49N7TDZSS", & + "M49N8FKXE ","M49N8FKYE ","M49N8FKZE ","M49N8FMXE ","M49N8FMYE ","M49N8FMZE ","M49N8MKXE ", & + "M49N8MKYE ","M49N8MKZE ","M49N8MMXE ","M49N8MMYE ","M49N8MMZE ","M49N8RAXE ","M49N8RAYE ", & + "M49N8RAZE ","M49N8RDXE ","M49N8RDYE ","M49N8RDZE ","M49N8TAXE ","M49N8TAYE ","M49N8TAZE ", & + "M49N8TDXSS","M49N8TDYSS","M49N8TDZSS","M49N9FKXE ","M49N9FKYE ","M49N9FKZE ","M49N9FMXE ", & + "M49N9FMYE ","M49N9FMZE ","M49N9MKXE ","M49N9MKYE ","M49N9MKZE ","M49N9MMXE ","M49N9MMYE ", & + "M49N9MMZE ","M49N9RAXE ","M49N9RAYE ","M49N9RAZE ","M49N9RDXE ","M49N9RDYE ","M49N9RDZE ", & + "M49N9TAXE ","M49N9TAYE ","M49N9TAZE ","M49N9TDXSS","M49N9TDYSS","M49N9TDZSS","M50N1FKXE ", & + "M50N1FKYE ","M50N1FKZE ","M50N1FMXE ","M50N1FMYE ","M50N1FMZE ","M50N1MKXE ","M50N1MKYE ", & + "M50N1MKZE ","M50N1MMXE ","M50N1MMYE ","M50N1MMZE ","M50N1RAXE ","M50N1RAYE ","M50N1RAZE ", & + "M50N1RDXE ","M50N1RDYE ","M50N1RDZE ","M50N1TAXE ","M50N1TAYE ","M50N1TAZE ","M50N1TDXSS", & + "M50N1TDYSS","M50N1TDZSS","M50N2FKXE ","M50N2FKYE ","M50N2FKZE ","M50N2FMXE ","M50N2FMYE ", & + "M50N2FMZE ","M50N2MKXE ","M50N2MKYE ","M50N2MKZE ","M50N2MMXE ","M50N2MMYE ","M50N2MMZE ", & + "M50N2RAXE ","M50N2RAYE ","M50N2RAZE ","M50N2RDXE ","M50N2RDYE ","M50N2RDZE ","M50N2TAXE ", & + "M50N2TAYE ","M50N2TAZE ","M50N2TDXSS","M50N2TDYSS","M50N2TDZSS","M50N3FKXE ","M50N3FKYE ", & + "M50N3FKZE ","M50N3FMXE ","M50N3FMYE ","M50N3FMZE ","M50N3MKXE ","M50N3MKYE ","M50N3MKZE ", & + "M50N3MMXE ","M50N3MMYE ","M50N3MMZE ","M50N3RAXE ","M50N3RAYE ","M50N3RAZE ","M50N3RDXE ", & + "M50N3RDYE ","M50N3RDZE ","M50N3TAXE ","M50N3TAYE ","M50N3TAZE ","M50N3TDXSS","M50N3TDYSS", & + "M50N3TDZSS","M50N4FKXE ","M50N4FKYE ","M50N4FKZE ","M50N4FMXE ","M50N4FMYE ","M50N4FMZE ", & + "M50N4MKXE ","M50N4MKYE ","M50N4MKZE ","M50N4MMXE ","M50N4MMYE ","M50N4MMZE ","M50N4RAXE ", & + "M50N4RAYE ","M50N4RAZE ","M50N4RDXE ","M50N4RDYE ","M50N4RDZE ","M50N4TAXE ","M50N4TAYE ", & + "M50N4TAZE ","M50N4TDXSS","M50N4TDYSS","M50N4TDZSS","M50N5FKXE ","M50N5FKYE ","M50N5FKZE ", & + "M50N5FMXE ","M50N5FMYE ","M50N5FMZE ","M50N5MKXE ","M50N5MKYE ","M50N5MKZE ","M50N5MMXE ", & + "M50N5MMYE ","M50N5MMZE ","M50N5RAXE ","M50N5RAYE ","M50N5RAZE ","M50N5RDXE ","M50N5RDYE ", & + "M50N5RDZE ","M50N5TAXE ","M50N5TAYE ","M50N5TAZE ","M50N5TDXSS","M50N5TDYSS","M50N5TDZSS", & + "M50N6FKXE ","M50N6FKYE ","M50N6FKZE ","M50N6FMXE ","M50N6FMYE ","M50N6FMZE ","M50N6MKXE ", & + "M50N6MKYE ","M50N6MKZE ","M50N6MMXE ","M50N6MMYE ","M50N6MMZE ","M50N6RAXE ","M50N6RAYE ", & + "M50N6RAZE ","M50N6RDXE ","M50N6RDYE ","M50N6RDZE ","M50N6TAXE ","M50N6TAYE ","M50N6TAZE ", & + "M50N6TDXSS","M50N6TDYSS","M50N6TDZSS","M50N7FKXE ","M50N7FKYE ","M50N7FKZE ","M50N7FMXE ", & + "M50N7FMYE ","M50N7FMZE ","M50N7MKXE ","M50N7MKYE ","M50N7MKZE ","M50N7MMXE ","M50N7MMYE ", & + "M50N7MMZE ","M50N7RAXE ","M50N7RAYE ","M50N7RAZE ","M50N7RDXE ","M50N7RDYE ","M50N7RDZE ", & + "M50N7TAXE ","M50N7TAYE ","M50N7TAZE ","M50N7TDXSS","M50N7TDYSS","M50N7TDZSS","M50N8FKXE ", & + "M50N8FKYE ","M50N8FKZE ","M50N8FMXE ","M50N8FMYE ","M50N8FMZE ","M50N8MKXE ","M50N8MKYE ", & + "M50N8MKZE ","M50N8MMXE ","M50N8MMYE ","M50N8MMZE ","M50N8RAXE ","M50N8RAYE ","M50N8RAZE ", & + "M50N8RDXE ","M50N8RDYE ","M50N8RDZE ","M50N8TAXE ","M50N8TAYE ","M50N8TAZE ","M50N8TDXSS", & + "M50N8TDYSS","M50N8TDZSS","M50N9FKXE ","M50N9FKYE ","M50N9FKZE ","M50N9FMXE ","M50N9FMYE ", & + "M50N9FMZE ","M50N9MKXE ","M50N9MKYE ","M50N9MKZE ","M50N9MMXE ","M50N9MMYE ","M50N9MMZE ", & + "M50N9RAXE ","M50N9RAYE ","M50N9RAZE ","M50N9RDXE ","M50N9RDYE ","M50N9RDZE ","M50N9TAXE ", & + "M50N9TAYE ","M50N9TAZE ","M50N9TDXSS","M50N9TDYSS","M50N9TDZSS","M51N1FKXE ","M51N1FKYE ", & + "M51N1FKZE ","M51N1FMXE ","M51N1FMYE ","M51N1FMZE ","M51N1MKXE ","M51N1MKYE ","M51N1MKZE ", & + "M51N1MMXE ","M51N1MMYE ","M51N1MMZE ","M51N1RAXE ","M51N1RAYE ","M51N1RAZE ","M51N1RDXE ", & + "M51N1RDYE ","M51N1RDZE ","M51N1TAXE ","M51N1TAYE ","M51N1TAZE ","M51N1TDXSS","M51N1TDYSS", & + "M51N1TDZSS","M51N2FKXE ","M51N2FKYE ","M51N2FKZE ","M51N2FMXE ","M51N2FMYE ","M51N2FMZE ", & + "M51N2MKXE ","M51N2MKYE ","M51N2MKZE ","M51N2MMXE ","M51N2MMYE ","M51N2MMZE ","M51N2RAXE ", & + "M51N2RAYE ","M51N2RAZE ","M51N2RDXE ","M51N2RDYE ","M51N2RDZE ","M51N2TAXE ","M51N2TAYE ", & + "M51N2TAZE ","M51N2TDXSS","M51N2TDYSS","M51N2TDZSS","M51N3FKXE ","M51N3FKYE ","M51N3FKZE ", & + "M51N3FMXE ","M51N3FMYE ","M51N3FMZE ","M51N3MKXE ","M51N3MKYE ","M51N3MKZE ","M51N3MMXE ", & + "M51N3MMYE ","M51N3MMZE ","M51N3RAXE ","M51N3RAYE ","M51N3RAZE ","M51N3RDXE ","M51N3RDYE ", & + "M51N3RDZE ","M51N3TAXE ","M51N3TAYE ","M51N3TAZE ","M51N3TDXSS","M51N3TDYSS","M51N3TDZSS", & + "M51N4FKXE ","M51N4FKYE ","M51N4FKZE ","M51N4FMXE ","M51N4FMYE ","M51N4FMZE ","M51N4MKXE ", & + "M51N4MKYE ","M51N4MKZE ","M51N4MMXE ","M51N4MMYE ","M51N4MMZE ","M51N4RAXE ","M51N4RAYE ", & + "M51N4RAZE ","M51N4RDXE ","M51N4RDYE ","M51N4RDZE ","M51N4TAXE ","M51N4TAYE ","M51N4TAZE ", & + "M51N4TDXSS","M51N4TDYSS","M51N4TDZSS","M51N5FKXE ","M51N5FKYE ","M51N5FKZE ","M51N5FMXE ", & + "M51N5FMYE ","M51N5FMZE ","M51N5MKXE ","M51N5MKYE ","M51N5MKZE ","M51N5MMXE ","M51N5MMYE ", & + "M51N5MMZE ","M51N5RAXE ","M51N5RAYE ","M51N5RAZE ","M51N5RDXE ","M51N5RDYE ","M51N5RDZE ", & + "M51N5TAXE ","M51N5TAYE ","M51N5TAZE ","M51N5TDXSS","M51N5TDYSS","M51N5TDZSS","M51N6FKXE ", & + "M51N6FKYE ","M51N6FKZE ","M51N6FMXE ","M51N6FMYE ","M51N6FMZE ","M51N6MKXE ","M51N6MKYE ", & + "M51N6MKZE ","M51N6MMXE ","M51N6MMYE ","M51N6MMZE ","M51N6RAXE ","M51N6RAYE ","M51N6RAZE ", & + "M51N6RDXE ","M51N6RDYE ","M51N6RDZE ","M51N6TAXE ","M51N6TAYE ","M51N6TAZE ","M51N6TDXSS", & + "M51N6TDYSS","M51N6TDZSS","M51N7FKXE ","M51N7FKYE ","M51N7FKZE ","M51N7FMXE ","M51N7FMYE ", & + "M51N7FMZE ","M51N7MKXE ","M51N7MKYE ","M51N7MKZE ","M51N7MMXE ","M51N7MMYE ","M51N7MMZE ", & + "M51N7RAXE ","M51N7RAYE ","M51N7RAZE ","M51N7RDXE ","M51N7RDYE ","M51N7RDZE ","M51N7TAXE ", & + "M51N7TAYE ","M51N7TAZE ","M51N7TDXSS","M51N7TDYSS","M51N7TDZSS","M51N8FKXE ","M51N8FKYE ", & + "M51N8FKZE ","M51N8FMXE ","M51N8FMYE ","M51N8FMZE ","M51N8MKXE ","M51N8MKYE ","M51N8MKZE ", & + "M51N8MMXE ","M51N8MMYE ","M51N8MMZE ","M51N8RAXE ","M51N8RAYE ","M51N8RAZE ","M51N8RDXE ", & + "M51N8RDYE ","M51N8RDZE ","M51N8TAXE ","M51N8TAYE ","M51N8TAZE ","M51N8TDXSS","M51N8TDYSS", & + "M51N8TDZSS","M51N9FKXE ","M51N9FKYE ","M51N9FKZE ","M51N9FMXE ","M51N9FMYE ","M51N9FMZE ", & + "M51N9MKXE ","M51N9MKYE ","M51N9MKZE ","M51N9MMXE ","M51N9MMYE ","M51N9MMZE ","M51N9RAXE ", & + "M51N9RAYE ","M51N9RAZE ","M51N9RDXE ","M51N9RDYE ","M51N9RDZE ","M51N9TAXE ","M51N9TAYE ", & + "M51N9TAZE ","M51N9TDXSS","M51N9TDYSS","M51N9TDZSS","M52N1FKXE ","M52N1FKYE ","M52N1FKZE ", & + "M52N1FMXE ","M52N1FMYE ","M52N1FMZE ","M52N1MKXE ","M52N1MKYE ","M52N1MKZE ","M52N1MMXE ", & + "M52N1MMYE ","M52N1MMZE ","M52N1RAXE ","M52N1RAYE ","M52N1RAZE ","M52N1RDXE ","M52N1RDYE ", & + "M52N1RDZE ","M52N1TAXE ","M52N1TAYE ","M52N1TAZE ","M52N1TDXSS","M52N1TDYSS","M52N1TDZSS", & + "M52N2FKXE ","M52N2FKYE ","M52N2FKZE ","M52N2FMXE ","M52N2FMYE ","M52N2FMZE ","M52N2MKXE ", & + "M52N2MKYE ","M52N2MKZE ","M52N2MMXE ","M52N2MMYE ","M52N2MMZE ","M52N2RAXE ","M52N2RAYE ", & + "M52N2RAZE ","M52N2RDXE ","M52N2RDYE ","M52N2RDZE ","M52N2TAXE ","M52N2TAYE ","M52N2TAZE ", & + "M52N2TDXSS","M52N2TDYSS","M52N2TDZSS","M52N3FKXE ","M52N3FKYE ","M52N3FKZE ","M52N3FMXE ", & + "M52N3FMYE ","M52N3FMZE ","M52N3MKXE ","M52N3MKYE ","M52N3MKZE ","M52N3MMXE ","M52N3MMYE ", & + "M52N3MMZE ","M52N3RAXE ","M52N3RAYE ","M52N3RAZE ","M52N3RDXE ","M52N3RDYE ","M52N3RDZE ", & + "M52N3TAXE ","M52N3TAYE ","M52N3TAZE ","M52N3TDXSS","M52N3TDYSS","M52N3TDZSS","M52N4FKXE ", & + "M52N4FKYE ","M52N4FKZE ","M52N4FMXE ","M52N4FMYE ","M52N4FMZE ","M52N4MKXE ","M52N4MKYE ", & + "M52N4MKZE ","M52N4MMXE ","M52N4MMYE ","M52N4MMZE ","M52N4RAXE ","M52N4RAYE ","M52N4RAZE ", & + "M52N4RDXE ","M52N4RDYE ","M52N4RDZE ","M52N4TAXE ","M52N4TAYE ","M52N4TAZE ","M52N4TDXSS", & + "M52N4TDYSS","M52N4TDZSS","M52N5FKXE ","M52N5FKYE ","M52N5FKZE ","M52N5FMXE ","M52N5FMYE ", & + "M52N5FMZE ","M52N5MKXE ","M52N5MKYE ","M52N5MKZE ","M52N5MMXE ","M52N5MMYE ","M52N5MMZE ", & + "M52N5RAXE ","M52N5RAYE ","M52N5RAZE ","M52N5RDXE ","M52N5RDYE ","M52N5RDZE ","M52N5TAXE ", & + "M52N5TAYE ","M52N5TAZE ","M52N5TDXSS","M52N5TDYSS","M52N5TDZSS","M52N6FKXE ","M52N6FKYE ", & + "M52N6FKZE ","M52N6FMXE ","M52N6FMYE ","M52N6FMZE ","M52N6MKXE ","M52N6MKYE ","M52N6MKZE ", & + "M52N6MMXE ","M52N6MMYE ","M52N6MMZE ","M52N6RAXE ","M52N6RAYE ","M52N6RAZE ","M52N6RDXE ", & + "M52N6RDYE ","M52N6RDZE ","M52N6TAXE ","M52N6TAYE ","M52N6TAZE ","M52N6TDXSS","M52N6TDYSS", & + "M52N6TDZSS","M52N7FKXE ","M52N7FKYE ","M52N7FKZE ","M52N7FMXE ","M52N7FMYE ","M52N7FMZE ", & + "M52N7MKXE ","M52N7MKYE ","M52N7MKZE ","M52N7MMXE ","M52N7MMYE ","M52N7MMZE ","M52N7RAXE ", & + "M52N7RAYE ","M52N7RAZE ","M52N7RDXE ","M52N7RDYE ","M52N7RDZE ","M52N7TAXE ","M52N7TAYE ", & + "M52N7TAZE ","M52N7TDXSS","M52N7TDYSS","M52N7TDZSS","M52N8FKXE ","M52N8FKYE ","M52N8FKZE ", & + "M52N8FMXE ","M52N8FMYE ","M52N8FMZE ","M52N8MKXE ","M52N8MKYE ","M52N8MKZE ","M52N8MMXE ", & + "M52N8MMYE ","M52N8MMZE ","M52N8RAXE ","M52N8RAYE ","M52N8RAZE ","M52N8RDXE ","M52N8RDYE ", & + "M52N8RDZE ","M52N8TAXE ","M52N8TAYE ","M52N8TAZE ","M52N8TDXSS","M52N8TDYSS","M52N8TDZSS", & + "M52N9FKXE ","M52N9FKYE ","M52N9FKZE ","M52N9FMXE ","M52N9FMYE ","M52N9FMZE ","M52N9MKXE ", & + "M52N9MKYE ","M52N9MKZE ","M52N9MMXE ","M52N9MMYE ","M52N9MMZE ","M52N9RAXE ","M52N9RAYE ", & + "M52N9RAZE ","M52N9RDXE ","M52N9RDYE ","M52N9RDZE ","M52N9TAXE ","M52N9TAYE ","M52N9TAZE ", & + "M52N9TDXSS","M52N9TDYSS","M52N9TDZSS","M53N1FKXE ","M53N1FKYE ","M53N1FKZE ","M53N1FMXE ", & + "M53N1FMYE ","M53N1FMZE ","M53N1MKXE ","M53N1MKYE ","M53N1MKZE ","M53N1MMXE ","M53N1MMYE ", & + "M53N1MMZE ","M53N1RAXE ","M53N1RAYE ","M53N1RAZE ","M53N1RDXE ","M53N1RDYE ","M53N1RDZE ", & + "M53N1TAXE ","M53N1TAYE ","M53N1TAZE ","M53N1TDXSS","M53N1TDYSS","M53N1TDZSS","M53N2FKXE ", & + "M53N2FKYE ","M53N2FKZE ","M53N2FMXE ","M53N2FMYE ","M53N2FMZE ","M53N2MKXE ","M53N2MKYE ", & + "M53N2MKZE ","M53N2MMXE ","M53N2MMYE ","M53N2MMZE ","M53N2RAXE ","M53N2RAYE ","M53N2RAZE ", & + "M53N2RDXE ","M53N2RDYE ","M53N2RDZE ","M53N2TAXE ","M53N2TAYE ","M53N2TAZE ","M53N2TDXSS", & + "M53N2TDYSS","M53N2TDZSS","M53N3FKXE ","M53N3FKYE ","M53N3FKZE ","M53N3FMXE ","M53N3FMYE ", & + "M53N3FMZE ","M53N3MKXE ","M53N3MKYE ","M53N3MKZE ","M53N3MMXE ","M53N3MMYE ","M53N3MMZE ", & + "M53N3RAXE ","M53N3RAYE ","M53N3RAZE ","M53N3RDXE ","M53N3RDYE ","M53N3RDZE ","M53N3TAXE ", & + "M53N3TAYE ","M53N3TAZE ","M53N3TDXSS","M53N3TDYSS","M53N3TDZSS","M53N4FKXE ","M53N4FKYE ", & + "M53N4FKZE ","M53N4FMXE ","M53N4FMYE ","M53N4FMZE ","M53N4MKXE ","M53N4MKYE ","M53N4MKZE ", & + "M53N4MMXE ","M53N4MMYE ","M53N4MMZE ","M53N4RAXE ","M53N4RAYE ","M53N4RAZE ","M53N4RDXE ", & + "M53N4RDYE ","M53N4RDZE ","M53N4TAXE ","M53N4TAYE ","M53N4TAZE ","M53N4TDXSS","M53N4TDYSS", & + "M53N4TDZSS","M53N5FKXE ","M53N5FKYE ","M53N5FKZE ","M53N5FMXE ","M53N5FMYE ","M53N5FMZE ", & + "M53N5MKXE ","M53N5MKYE ","M53N5MKZE ","M53N5MMXE ","M53N5MMYE ","M53N5MMZE ","M53N5RAXE ", & + "M53N5RAYE ","M53N5RAZE ","M53N5RDXE ","M53N5RDYE ","M53N5RDZE ","M53N5TAXE ","M53N5TAYE ", & + "M53N5TAZE ","M53N5TDXSS","M53N5TDYSS","M53N5TDZSS","M53N6FKXE ","M53N6FKYE ","M53N6FKZE ", & + "M53N6FMXE ","M53N6FMYE ","M53N6FMZE ","M53N6MKXE ","M53N6MKYE ","M53N6MKZE ","M53N6MMXE ", & + "M53N6MMYE ","M53N6MMZE ","M53N6RAXE ","M53N6RAYE ","M53N6RAZE ","M53N6RDXE ","M53N6RDYE ", & + "M53N6RDZE ","M53N6TAXE ","M53N6TAYE ","M53N6TAZE ","M53N6TDXSS","M53N6TDYSS","M53N6TDZSS", & + "M53N7FKXE ","M53N7FKYE ","M53N7FKZE ","M53N7FMXE ","M53N7FMYE ","M53N7FMZE ","M53N7MKXE ", & + "M53N7MKYE ","M53N7MKZE ","M53N7MMXE ","M53N7MMYE ","M53N7MMZE ","M53N7RAXE ","M53N7RAYE ", & + "M53N7RAZE ","M53N7RDXE ","M53N7RDYE ","M53N7RDZE ","M53N7TAXE ","M53N7TAYE ","M53N7TAZE ", & + "M53N7TDXSS","M53N7TDYSS","M53N7TDZSS","M53N8FKXE ","M53N8FKYE ","M53N8FKZE ","M53N8FMXE ", & + "M53N8FMYE ","M53N8FMZE ","M53N8MKXE ","M53N8MKYE ","M53N8MKZE ","M53N8MMXE ","M53N8MMYE ", & + "M53N8MMZE ","M53N8RAXE ","M53N8RAYE ","M53N8RAZE ","M53N8RDXE ","M53N8RDYE ","M53N8RDZE ", & + "M53N8TAXE ","M53N8TAYE ","M53N8TAZE ","M53N8TDXSS","M53N8TDYSS","M53N8TDZSS","M53N9FKXE ", & + "M53N9FKYE ","M53N9FKZE ","M53N9FMXE ","M53N9FMYE ","M53N9FMZE ","M53N9MKXE ","M53N9MKYE ", & + "M53N9MKZE ","M53N9MMXE ","M53N9MMYE ","M53N9MMZE ","M53N9RAXE ","M53N9RAYE ","M53N9RAZE ", & + "M53N9RDXE ","M53N9RDYE ","M53N9RDZE ","M53N9TAXE ","M53N9TAYE ","M53N9TAZE ","M53N9TDXSS", & + "M53N9TDYSS","M53N9TDZSS","M54N1FKXE ","M54N1FKYE ","M54N1FKZE ","M54N1FMXE ","M54N1FMYE ", & + "M54N1FMZE ","M54N1MKXE ","M54N1MKYE ","M54N1MKZE ","M54N1MMXE ","M54N1MMYE ","M54N1MMZE ", & + "M54N1RAXE ","M54N1RAYE ","M54N1RAZE ","M54N1RDXE ","M54N1RDYE ","M54N1RDZE ","M54N1TAXE ", & + "M54N1TAYE ","M54N1TAZE ","M54N1TDXSS","M54N1TDYSS","M54N1TDZSS","M54N2FKXE ","M54N2FKYE ", & + "M54N2FKZE ","M54N2FMXE ","M54N2FMYE ","M54N2FMZE ","M54N2MKXE ","M54N2MKYE ","M54N2MKZE ", & + "M54N2MMXE ","M54N2MMYE ","M54N2MMZE ","M54N2RAXE ","M54N2RAYE ","M54N2RAZE ","M54N2RDXE ", & + "M54N2RDYE ","M54N2RDZE ","M54N2TAXE ","M54N2TAYE ","M54N2TAZE ","M54N2TDXSS","M54N2TDYSS", & + "M54N2TDZSS","M54N3FKXE ","M54N3FKYE ","M54N3FKZE ","M54N3FMXE ","M54N3FMYE ","M54N3FMZE ", & + "M54N3MKXE ","M54N3MKYE ","M54N3MKZE ","M54N3MMXE ","M54N3MMYE ","M54N3MMZE ","M54N3RAXE ", & + "M54N3RAYE ","M54N3RAZE ","M54N3RDXE ","M54N3RDYE ","M54N3RDZE ","M54N3TAXE ","M54N3TAYE ", & + "M54N3TAZE ","M54N3TDXSS","M54N3TDYSS","M54N3TDZSS","M54N4FKXE ","M54N4FKYE ","M54N4FKZE ", & + "M54N4FMXE ","M54N4FMYE ","M54N4FMZE ","M54N4MKXE ","M54N4MKYE ","M54N4MKZE ","M54N4MMXE ", & + "M54N4MMYE ","M54N4MMZE ","M54N4RAXE ","M54N4RAYE ","M54N4RAZE ","M54N4RDXE ","M54N4RDYE ", & + "M54N4RDZE ","M54N4TAXE ","M54N4TAYE ","M54N4TAZE ","M54N4TDXSS","M54N4TDYSS","M54N4TDZSS", & + "M54N5FKXE ","M54N5FKYE ","M54N5FKZE ","M54N5FMXE ","M54N5FMYE ","M54N5FMZE ","M54N5MKXE ", & + "M54N5MKYE ","M54N5MKZE ","M54N5MMXE ","M54N5MMYE ","M54N5MMZE ","M54N5RAXE ","M54N5RAYE ", & + "M54N5RAZE ","M54N5RDXE ","M54N5RDYE ","M54N5RDZE ","M54N5TAXE ","M54N5TAYE ","M54N5TAZE ", & + "M54N5TDXSS","M54N5TDYSS","M54N5TDZSS","M54N6FKXE ","M54N6FKYE ","M54N6FKZE ","M54N6FMXE ", & + "M54N6FMYE ","M54N6FMZE ","M54N6MKXE ","M54N6MKYE ","M54N6MKZE ","M54N6MMXE ","M54N6MMYE ", & + "M54N6MMZE ","M54N6RAXE ","M54N6RAYE ","M54N6RAZE ","M54N6RDXE ","M54N6RDYE ","M54N6RDZE ", & + "M54N6TAXE ","M54N6TAYE ","M54N6TAZE ","M54N6TDXSS","M54N6TDYSS","M54N6TDZSS","M54N7FKXE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry8(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M54N7FKYE ","M54N7FKZE ","M54N7FMXE ","M54N7FMYE ","M54N7FMZE ","M54N7MKXE ","M54N7MKYE ", & + "M54N7MKZE ","M54N7MMXE ","M54N7MMYE ","M54N7MMZE ","M54N7RAXE ","M54N7RAYE ","M54N7RAZE ", & + "M54N7RDXE ","M54N7RDYE ","M54N7RDZE ","M54N7TAXE ","M54N7TAYE ","M54N7TAZE ","M54N7TDXSS", & + "M54N7TDYSS","M54N7TDZSS","M54N8FKXE ","M54N8FKYE ","M54N8FKZE ","M54N8FMXE ","M54N8FMYE ", & + "M54N8FMZE ","M54N8MKXE ","M54N8MKYE ","M54N8MKZE ","M54N8MMXE ","M54N8MMYE ","M54N8MMZE ", & + "M54N8RAXE ","M54N8RAYE ","M54N8RAZE ","M54N8RDXE ","M54N8RDYE ","M54N8RDZE ","M54N8TAXE ", & + "M54N8TAYE ","M54N8TAZE ","M54N8TDXSS","M54N8TDYSS","M54N8TDZSS","M54N9FKXE ","M54N9FKYE ", & + "M54N9FKZE ","M54N9FMXE ","M54N9FMYE ","M54N9FMZE ","M54N9MKXE ","M54N9MKYE ","M54N9MKZE ", & + "M54N9MMXE ","M54N9MMYE ","M54N9MMZE ","M54N9RAXE ","M54N9RAYE ","M54N9RAZE ","M54N9RDXE ", & + "M54N9RDYE ","M54N9RDZE ","M54N9TAXE ","M54N9TAYE ","M54N9TAZE ","M54N9TDXSS","M54N9TDYSS", & + "M54N9TDZSS","M55N1FKXE ","M55N1FKYE ","M55N1FKZE ","M55N1FMXE ","M55N1FMYE ","M55N1FMZE ", & + "M55N1MKXE ","M55N1MKYE ","M55N1MKZE ","M55N1MMXE ","M55N1MMYE ","M55N1MMZE ","M55N1RAXE ", & + "M55N1RAYE ","M55N1RAZE ","M55N1RDXE ","M55N1RDYE ","M55N1RDZE ","M55N1TAXE ","M55N1TAYE ", & + "M55N1TAZE ","M55N1TDXSS","M55N1TDYSS","M55N1TDZSS","M55N2FKXE ","M55N2FKYE ","M55N2FKZE ", & + "M55N2FMXE ","M55N2FMYE ","M55N2FMZE ","M55N2MKXE ","M55N2MKYE ","M55N2MKZE ","M55N2MMXE ", & + "M55N2MMYE ","M55N2MMZE ","M55N2RAXE ","M55N2RAYE ","M55N2RAZE ","M55N2RDXE ","M55N2RDYE ", & + "M55N2RDZE ","M55N2TAXE ","M55N2TAYE ","M55N2TAZE ","M55N2TDXSS","M55N2TDYSS","M55N2TDZSS", & + "M55N3FKXE ","M55N3FKYE ","M55N3FKZE ","M55N3FMXE ","M55N3FMYE ","M55N3FMZE ","M55N3MKXE ", & + "M55N3MKYE ","M55N3MKZE ","M55N3MMXE ","M55N3MMYE ","M55N3MMZE ","M55N3RAXE ","M55N3RAYE ", & + "M55N3RAZE ","M55N3RDXE ","M55N3RDYE ","M55N3RDZE ","M55N3TAXE ","M55N3TAYE ","M55N3TAZE ", & + "M55N3TDXSS","M55N3TDYSS","M55N3TDZSS","M55N4FKXE ","M55N4FKYE ","M55N4FKZE ","M55N4FMXE ", & + "M55N4FMYE ","M55N4FMZE ","M55N4MKXE ","M55N4MKYE ","M55N4MKZE ","M55N4MMXE ","M55N4MMYE ", & + "M55N4MMZE ","M55N4RAXE ","M55N4RAYE ","M55N4RAZE ","M55N4RDXE ","M55N4RDYE ","M55N4RDZE ", & + "M55N4TAXE ","M55N4TAYE ","M55N4TAZE ","M55N4TDXSS","M55N4TDYSS","M55N4TDZSS","M55N5FKXE ", & + "M55N5FKYE ","M55N5FKZE ","M55N5FMXE ","M55N5FMYE ","M55N5FMZE ","M55N5MKXE ","M55N5MKYE ", & + "M55N5MKZE ","M55N5MMXE ","M55N5MMYE ","M55N5MMZE ","M55N5RAXE ","M55N5RAYE ","M55N5RAZE ", & + "M55N5RDXE ","M55N5RDYE ","M55N5RDZE ","M55N5TAXE ","M55N5TAYE ","M55N5TAZE ","M55N5TDXSS", & + "M55N5TDYSS","M55N5TDZSS","M55N6FKXE ","M55N6FKYE ","M55N6FKZE ","M55N6FMXE ","M55N6FMYE ", & + "M55N6FMZE ","M55N6MKXE ","M55N6MKYE ","M55N6MKZE ","M55N6MMXE ","M55N6MMYE ","M55N6MMZE ", & + "M55N6RAXE ","M55N6RAYE ","M55N6RAZE ","M55N6RDXE ","M55N6RDYE ","M55N6RDZE ","M55N6TAXE ", & + "M55N6TAYE ","M55N6TAZE ","M55N6TDXSS","M55N6TDYSS","M55N6TDZSS","M55N7FKXE ","M55N7FKYE ", & + "M55N7FKZE ","M55N7FMXE ","M55N7FMYE ","M55N7FMZE ","M55N7MKXE ","M55N7MKYE ","M55N7MKZE ", & + "M55N7MMXE ","M55N7MMYE ","M55N7MMZE ","M55N7RAXE ","M55N7RAYE ","M55N7RAZE ","M55N7RDXE ", & + "M55N7RDYE ","M55N7RDZE ","M55N7TAXE ","M55N7TAYE ","M55N7TAZE ","M55N7TDXSS","M55N7TDYSS", & + "M55N7TDZSS","M55N8FKXE ","M55N8FKYE ","M55N8FKZE ","M55N8FMXE ","M55N8FMYE ","M55N8FMZE ", & + "M55N8MKXE ","M55N8MKYE ","M55N8MKZE ","M55N8MMXE ","M55N8MMYE ","M55N8MMZE ","M55N8RAXE ", & + "M55N8RAYE ","M55N8RAZE ","M55N8RDXE ","M55N8RDYE ","M55N8RDZE ","M55N8TAXE ","M55N8TAYE ", & + "M55N8TAZE ","M55N8TDXSS","M55N8TDYSS","M55N8TDZSS","M55N9FKXE ","M55N9FKYE ","M55N9FKZE ", & + "M55N9FMXE ","M55N9FMYE ","M55N9FMZE ","M55N9MKXE ","M55N9MKYE ","M55N9MKZE ","M55N9MMXE ", & + "M55N9MMYE ","M55N9MMZE ","M55N9RAXE ","M55N9RAYE ","M55N9RAZE ","M55N9RDXE ","M55N9RDYE ", & + "M55N9RDZE ","M55N9TAXE ","M55N9TAYE ","M55N9TAZE ","M55N9TDXSS","M55N9TDYSS","M55N9TDZSS", & + "M56N1FKXE ","M56N1FKYE ","M56N1FKZE ","M56N1FMXE ","M56N1FMYE ","M56N1FMZE ","M56N1MKXE ", & + "M56N1MKYE ","M56N1MKZE ","M56N1MMXE ","M56N1MMYE ","M56N1MMZE ","M56N1RAXE ","M56N1RAYE ", & + "M56N1RAZE ","M56N1RDXE ","M56N1RDYE ","M56N1RDZE ","M56N1TAXE ","M56N1TAYE ","M56N1TAZE ", & + "M56N1TDXSS","M56N1TDYSS","M56N1TDZSS","M56N2FKXE ","M56N2FKYE ","M56N2FKZE ","M56N2FMXE ", & + "M56N2FMYE ","M56N2FMZE ","M56N2MKXE ","M56N2MKYE ","M56N2MKZE ","M56N2MMXE ","M56N2MMYE ", & + "M56N2MMZE ","M56N2RAXE ","M56N2RAYE ","M56N2RAZE ","M56N2RDXE ","M56N2RDYE ","M56N2RDZE ", & + "M56N2TAXE ","M56N2TAYE ","M56N2TAZE ","M56N2TDXSS","M56N2TDYSS","M56N2TDZSS","M56N3FKXE ", & + "M56N3FKYE ","M56N3FKZE ","M56N3FMXE ","M56N3FMYE ","M56N3FMZE ","M56N3MKXE ","M56N3MKYE ", & + "M56N3MKZE ","M56N3MMXE ","M56N3MMYE ","M56N3MMZE ","M56N3RAXE ","M56N3RAYE ","M56N3RAZE ", & + "M56N3RDXE ","M56N3RDYE ","M56N3RDZE ","M56N3TAXE ","M56N3TAYE ","M56N3TAZE ","M56N3TDXSS", & + "M56N3TDYSS","M56N3TDZSS","M56N4FKXE ","M56N4FKYE ","M56N4FKZE ","M56N4FMXE ","M56N4FMYE ", & + "M56N4FMZE ","M56N4MKXE ","M56N4MKYE ","M56N4MKZE ","M56N4MMXE ","M56N4MMYE ","M56N4MMZE ", & + "M56N4RAXE ","M56N4RAYE ","M56N4RAZE ","M56N4RDXE ","M56N4RDYE ","M56N4RDZE ","M56N4TAXE ", & + "M56N4TAYE ","M56N4TAZE ","M56N4TDXSS","M56N4TDYSS","M56N4TDZSS","M56N5FKXE ","M56N5FKYE ", & + "M56N5FKZE ","M56N5FMXE ","M56N5FMYE ","M56N5FMZE ","M56N5MKXE ","M56N5MKYE ","M56N5MKZE ", & + "M56N5MMXE ","M56N5MMYE ","M56N5MMZE ","M56N5RAXE ","M56N5RAYE ","M56N5RAZE ","M56N5RDXE ", & + "M56N5RDYE ","M56N5RDZE ","M56N5TAXE ","M56N5TAYE ","M56N5TAZE ","M56N5TDXSS","M56N5TDYSS", & + "M56N5TDZSS","M56N6FKXE ","M56N6FKYE ","M56N6FKZE ","M56N6FMXE ","M56N6FMYE ","M56N6FMZE ", & + "M56N6MKXE ","M56N6MKYE ","M56N6MKZE ","M56N6MMXE ","M56N6MMYE ","M56N6MMZE ","M56N6RAXE ", & + "M56N6RAYE ","M56N6RAZE ","M56N6RDXE ","M56N6RDYE ","M56N6RDZE ","M56N6TAXE ","M56N6TAYE ", & + "M56N6TAZE ","M56N6TDXSS","M56N6TDYSS","M56N6TDZSS","M56N7FKXE ","M56N7FKYE ","M56N7FKZE ", & + "M56N7FMXE ","M56N7FMYE ","M56N7FMZE ","M56N7MKXE ","M56N7MKYE ","M56N7MKZE ","M56N7MMXE ", & + "M56N7MMYE ","M56N7MMZE ","M56N7RAXE ","M56N7RAYE ","M56N7RAZE ","M56N7RDXE ","M56N7RDYE ", & + "M56N7RDZE ","M56N7TAXE ","M56N7TAYE ","M56N7TAZE ","M56N7TDXSS","M56N7TDYSS","M56N7TDZSS", & + "M56N8FKXE ","M56N8FKYE ","M56N8FKZE ","M56N8FMXE ","M56N8FMYE ","M56N8FMZE ","M56N8MKXE ", & + "M56N8MKYE ","M56N8MKZE ","M56N8MMXE ","M56N8MMYE ","M56N8MMZE ","M56N8RAXE ","M56N8RAYE ", & + "M56N8RAZE ","M56N8RDXE ","M56N8RDYE ","M56N8RDZE ","M56N8TAXE ","M56N8TAYE ","M56N8TAZE ", & + "M56N8TDXSS","M56N8TDYSS","M56N8TDZSS","M56N9FKXE ","M56N9FKYE ","M56N9FKZE ","M56N9FMXE ", & + "M56N9FMYE ","M56N9FMZE ","M56N9MKXE ","M56N9MKYE ","M56N9MKZE ","M56N9MMXE ","M56N9MMYE ", & + "M56N9MMZE ","M56N9RAXE ","M56N9RAYE ","M56N9RAZE ","M56N9RDXE ","M56N9RDYE ","M56N9RDZE ", & + "M56N9TAXE ","M56N9TAYE ","M56N9TAZE ","M56N9TDXSS","M56N9TDYSS","M56N9TDZSS","M57N1FKXE ", & + "M57N1FKYE ","M57N1FKZE ","M57N1FMXE ","M57N1FMYE ","M57N1FMZE ","M57N1MKXE ","M57N1MKYE ", & + "M57N1MKZE ","M57N1MMXE ","M57N1MMYE ","M57N1MMZE ","M57N1RAXE ","M57N1RAYE ","M57N1RAZE ", & + "M57N1RDXE ","M57N1RDYE ","M57N1RDZE ","M57N1TAXE ","M57N1TAYE ","M57N1TAZE ","M57N1TDXSS", & + "M57N1TDYSS","M57N1TDZSS","M57N2FKXE ","M57N2FKYE ","M57N2FKZE ","M57N2FMXE ","M57N2FMYE ", & + "M57N2FMZE ","M57N2MKXE ","M57N2MKYE ","M57N2MKZE ","M57N2MMXE ","M57N2MMYE ","M57N2MMZE ", & + "M57N2RAXE ","M57N2RAYE ","M57N2RAZE ","M57N2RDXE ","M57N2RDYE ","M57N2RDZE ","M57N2TAXE ", & + "M57N2TAYE ","M57N2TAZE ","M57N2TDXSS","M57N2TDYSS","M57N2TDZSS","M57N3FKXE ","M57N3FKYE ", & + "M57N3FKZE ","M57N3FMXE ","M57N3FMYE ","M57N3FMZE ","M57N3MKXE ","M57N3MKYE ","M57N3MKZE ", & + "M57N3MMXE ","M57N3MMYE ","M57N3MMZE ","M57N3RAXE ","M57N3RAYE ","M57N3RAZE ","M57N3RDXE ", & + "M57N3RDYE ","M57N3RDZE ","M57N3TAXE ","M57N3TAYE ","M57N3TAZE ","M57N3TDXSS","M57N3TDYSS", & + "M57N3TDZSS","M57N4FKXE ","M57N4FKYE ","M57N4FKZE ","M57N4FMXE ","M57N4FMYE ","M57N4FMZE ", & + "M57N4MKXE ","M57N4MKYE ","M57N4MKZE ","M57N4MMXE ","M57N4MMYE ","M57N4MMZE ","M57N4RAXE ", & + "M57N4RAYE ","M57N4RAZE ","M57N4RDXE ","M57N4RDYE ","M57N4RDZE ","M57N4TAXE ","M57N4TAYE ", & + "M57N4TAZE ","M57N4TDXSS","M57N4TDYSS","M57N4TDZSS","M57N5FKXE ","M57N5FKYE ","M57N5FKZE ", & + "M57N5FMXE ","M57N5FMYE ","M57N5FMZE ","M57N5MKXE ","M57N5MKYE ","M57N5MKZE ","M57N5MMXE ", & + "M57N5MMYE ","M57N5MMZE ","M57N5RAXE ","M57N5RAYE ","M57N5RAZE ","M57N5RDXE ","M57N5RDYE ", & + "M57N5RDZE ","M57N5TAXE ","M57N5TAYE ","M57N5TAZE ","M57N5TDXSS","M57N5TDYSS","M57N5TDZSS", & + "M57N6FKXE ","M57N6FKYE ","M57N6FKZE ","M57N6FMXE ","M57N6FMYE ","M57N6FMZE ","M57N6MKXE ", & + "M57N6MKYE ","M57N6MKZE ","M57N6MMXE ","M57N6MMYE ","M57N6MMZE ","M57N6RAXE ","M57N6RAYE ", & + "M57N6RAZE ","M57N6RDXE ","M57N6RDYE ","M57N6RDZE ","M57N6TAXE ","M57N6TAYE ","M57N6TAZE ", & + "M57N6TDXSS","M57N6TDYSS","M57N6TDZSS","M57N7FKXE ","M57N7FKYE ","M57N7FKZE ","M57N7FMXE ", & + "M57N7FMYE ","M57N7FMZE ","M57N7MKXE ","M57N7MKYE ","M57N7MKZE ","M57N7MMXE ","M57N7MMYE ", & + "M57N7MMZE ","M57N7RAXE ","M57N7RAYE ","M57N7RAZE ","M57N7RDXE ","M57N7RDYE ","M57N7RDZE ", & + "M57N7TAXE ","M57N7TAYE ","M57N7TAZE ","M57N7TDXSS","M57N7TDYSS","M57N7TDZSS","M57N8FKXE ", & + "M57N8FKYE ","M57N8FKZE ","M57N8FMXE ","M57N8FMYE ","M57N8FMZE ","M57N8MKXE ","M57N8MKYE ", & + "M57N8MKZE ","M57N8MMXE ","M57N8MMYE ","M57N8MMZE ","M57N8RAXE ","M57N8RAYE ","M57N8RAZE ", & + "M57N8RDXE ","M57N8RDYE ","M57N8RDZE ","M57N8TAXE ","M57N8TAYE ","M57N8TAZE ","M57N8TDXSS", & + "M57N8TDYSS","M57N8TDZSS","M57N9FKXE ","M57N9FKYE ","M57N9FKZE ","M57N9FMXE ","M57N9FMYE ", & + "M57N9FMZE ","M57N9MKXE ","M57N9MKYE ","M57N9MKZE ","M57N9MMXE ","M57N9MMYE ","M57N9MMZE ", & + "M57N9RAXE ","M57N9RAYE ","M57N9RAZE ","M57N9RDXE ","M57N9RDYE ","M57N9RDZE ","M57N9TAXE ", & + "M57N9TAYE ","M57N9TAZE ","M57N9TDXSS","M57N9TDYSS","M57N9TDZSS","M58N1FKXE ","M58N1FKYE ", & + "M58N1FKZE ","M58N1FMXE ","M58N1FMYE ","M58N1FMZE ","M58N1MKXE ","M58N1MKYE ","M58N1MKZE ", & + "M58N1MMXE ","M58N1MMYE ","M58N1MMZE ","M58N1RAXE ","M58N1RAYE ","M58N1RAZE ","M58N1RDXE ", & + "M58N1RDYE ","M58N1RDZE ","M58N1TAXE ","M58N1TAYE ","M58N1TAZE ","M58N1TDXSS","M58N1TDYSS", & + "M58N1TDZSS","M58N2FKXE ","M58N2FKYE ","M58N2FKZE ","M58N2FMXE ","M58N2FMYE ","M58N2FMZE ", & + "M58N2MKXE ","M58N2MKYE ","M58N2MKZE ","M58N2MMXE ","M58N2MMYE ","M58N2MMZE ","M58N2RAXE ", & + "M58N2RAYE ","M58N2RAZE ","M58N2RDXE ","M58N2RDYE ","M58N2RDZE ","M58N2TAXE ","M58N2TAYE ", & + "M58N2TAZE ","M58N2TDXSS","M58N2TDYSS","M58N2TDZSS","M58N3FKXE ","M58N3FKYE ","M58N3FKZE ", & + "M58N3FMXE ","M58N3FMYE ","M58N3FMZE ","M58N3MKXE ","M58N3MKYE ","M58N3MKZE ","M58N3MMXE ", & + "M58N3MMYE ","M58N3MMZE ","M58N3RAXE ","M58N3RAYE ","M58N3RAZE ","M58N3RDXE ","M58N3RDYE ", & + "M58N3RDZE ","M58N3TAXE ","M58N3TAYE ","M58N3TAZE ","M58N3TDXSS","M58N3TDYSS","M58N3TDZSS", & + "M58N4FKXE ","M58N4FKYE ","M58N4FKZE ","M58N4FMXE ","M58N4FMYE ","M58N4FMZE ","M58N4MKXE ", & + "M58N4MKYE ","M58N4MKZE ","M58N4MMXE ","M58N4MMYE ","M58N4MMZE ","M58N4RAXE ","M58N4RAYE ", & + "M58N4RAZE ","M58N4RDXE ","M58N4RDYE ","M58N4RDZE ","M58N4TAXE ","M58N4TAYE ","M58N4TAZE ", & + "M58N4TDXSS","M58N4TDYSS","M58N4TDZSS","M58N5FKXE ","M58N5FKYE ","M58N5FKZE ","M58N5FMXE ", & + "M58N5FMYE ","M58N5FMZE ","M58N5MKXE ","M58N5MKYE ","M58N5MKZE ","M58N5MMXE ","M58N5MMYE ", & + "M58N5MMZE ","M58N5RAXE ","M58N5RAYE ","M58N5RAZE ","M58N5RDXE ","M58N5RDYE ","M58N5RDZE ", & + "M58N5TAXE ","M58N5TAYE ","M58N5TAZE ","M58N5TDXSS","M58N5TDYSS","M58N5TDZSS","M58N6FKXE ", & + "M58N6FKYE ","M58N6FKZE ","M58N6FMXE ","M58N6FMYE ","M58N6FMZE ","M58N6MKXE ","M58N6MKYE ", & + "M58N6MKZE ","M58N6MMXE ","M58N6MMYE ","M58N6MMZE ","M58N6RAXE ","M58N6RAYE ","M58N6RAZE ", & + "M58N6RDXE ","M58N6RDYE ","M58N6RDZE ","M58N6TAXE ","M58N6TAYE ","M58N6TAZE ","M58N6TDXSS", & + "M58N6TDYSS","M58N6TDZSS","M58N7FKXE ","M58N7FKYE ","M58N7FKZE ","M58N7FMXE ","M58N7FMYE ", & + "M58N7FMZE ","M58N7MKXE ","M58N7MKYE ","M58N7MKZE ","M58N7MMXE ","M58N7MMYE ","M58N7MMZE ", & + "M58N7RAXE ","M58N7RAYE ","M58N7RAZE ","M58N7RDXE ","M58N7RDYE ","M58N7RDZE ","M58N7TAXE ", & + "M58N7TAYE ","M58N7TAZE ","M58N7TDXSS","M58N7TDYSS","M58N7TDZSS","M58N8FKXE ","M58N8FKYE ", & + "M58N8FKZE ","M58N8FMXE ","M58N8FMYE ","M58N8FMZE ","M58N8MKXE ","M58N8MKYE ","M58N8MKZE ", & + "M58N8MMXE ","M58N8MMYE ","M58N8MMZE ","M58N8RAXE ","M58N8RAYE ","M58N8RAZE ","M58N8RDXE ", & + "M58N8RDYE ","M58N8RDZE ","M58N8TAXE ","M58N8TAYE ","M58N8TAZE ","M58N8TDXSS","M58N8TDYSS", & + "M58N8TDZSS","M58N9FKXE ","M58N9FKYE ","M58N9FKZE ","M58N9FMXE ","M58N9FMYE ","M58N9FMZE ", & + "M58N9MKXE ","M58N9MKYE ","M58N9MKZE ","M58N9MMXE ","M58N9MMYE ","M58N9MMZE ","M58N9RAXE ", & + "M58N9RAYE ","M58N9RAZE ","M58N9RDXE ","M58N9RDYE ","M58N9RDZE ","M58N9TAXE ","M58N9TAYE ", & + "M58N9TAZE ","M58N9TDXSS","M58N9TDYSS","M58N9TDZSS","M59N1FKXE ","M59N1FKYE ","M59N1FKZE ", & + "M59N1FMXE ","M59N1FMYE ","M59N1FMZE ","M59N1MKXE ","M59N1MKYE ","M59N1MKZE ","M59N1MMXE ", & + "M59N1MMYE ","M59N1MMZE ","M59N1RAXE ","M59N1RAYE ","M59N1RAZE ","M59N1RDXE ","M59N1RDYE ", & + "M59N1RDZE ","M59N1TAXE ","M59N1TAYE ","M59N1TAZE ","M59N1TDXSS","M59N1TDYSS","M59N1TDZSS", & + "M59N2FKXE ","M59N2FKYE ","M59N2FKZE ","M59N2FMXE ","M59N2FMYE ","M59N2FMZE ","M59N2MKXE ", & + "M59N2MKYE ","M59N2MKZE ","M59N2MMXE ","M59N2MMYE ","M59N2MMZE ","M59N2RAXE ","M59N2RAYE ", & + "M59N2RAZE ","M59N2RDXE ","M59N2RDYE ","M59N2RDZE ","M59N2TAXE ","M59N2TAYE ","M59N2TAZE ", & + "M59N2TDXSS","M59N2TDYSS","M59N2TDZSS","M59N3FKXE ","M59N3FKYE ","M59N3FKZE ","M59N3FMXE ", & + "M59N3FMYE ","M59N3FMZE ","M59N3MKXE ","M59N3MKYE ","M59N3MKZE ","M59N3MMXE ","M59N3MMYE ", & + "M59N3MMZE ","M59N3RAXE ","M59N3RAYE ","M59N3RAZE ","M59N3RDXE ","M59N3RDYE ","M59N3RDZE ", & + "M59N3TAXE ","M59N3TAYE ","M59N3TAZE ","M59N3TDXSS","M59N3TDYSS","M59N3TDZSS","M59N4FKXE ", & + "M59N4FKYE ","M59N4FKZE ","M59N4FMXE ","M59N4FMYE ","M59N4FMZE ","M59N4MKXE ","M59N4MKYE ", & + "M59N4MKZE ","M59N4MMXE ","M59N4MMYE ","M59N4MMZE ","M59N4RAXE ","M59N4RAYE ","M59N4RAZE ", & + "M59N4RDXE ","M59N4RDYE ","M59N4RDZE ","M59N4TAXE ","M59N4TAYE ","M59N4TAZE ","M59N4TDXSS", & + "M59N4TDYSS","M59N4TDZSS","M59N5FKXE ","M59N5FKYE ","M59N5FKZE ","M59N5FMXE ","M59N5FMYE ", & + "M59N5FMZE ","M59N5MKXE ","M59N5MKYE ","M59N5MKZE ","M59N5MMXE ","M59N5MMYE ","M59N5MMZE ", & + "M59N5RAXE ","M59N5RAYE ","M59N5RAZE ","M59N5RDXE ","M59N5RDYE ","M59N5RDZE ","M59N5TAXE ", & + "M59N5TAYE ","M59N5TAZE ","M59N5TDXSS","M59N5TDYSS","M59N5TDZSS","M59N6FKXE ","M59N6FKYE ", & + "M59N6FKZE ","M59N6FMXE ","M59N6FMYE ","M59N6FMZE ","M59N6MKXE ","M59N6MKYE ","M59N6MKZE ", & + "M59N6MMXE ","M59N6MMYE ","M59N6MMZE ","M59N6RAXE ","M59N6RAYE ","M59N6RAZE ","M59N6RDXE ", & + "M59N6RDYE ","M59N6RDZE ","M59N6TAXE ","M59N6TAYE ","M59N6TAZE ","M59N6TDXSS","M59N6TDYSS", & + "M59N6TDZSS","M59N7FKXE ","M59N7FKYE ","M59N7FKZE ","M59N7FMXE ","M59N7FMYE ","M59N7FMZE ", & + "M59N7MKXE ","M59N7MKYE ","M59N7MKZE ","M59N7MMXE ","M59N7MMYE ","M59N7MMZE ","M59N7RAXE ", & + "M59N7RAYE ","M59N7RAZE ","M59N7RDXE ","M59N7RDYE ","M59N7RDZE ","M59N7TAXE ","M59N7TAYE ", & + "M59N7TAZE ","M59N7TDXSS","M59N7TDYSS","M59N7TDZSS","M59N8FKXE ","M59N8FKYE ","M59N8FKZE ", & + "M59N8FMXE ","M59N8FMYE ","M59N8FMZE ","M59N8MKXE ","M59N8MKYE ","M59N8MKZE ","M59N8MMXE ", & + "M59N8MMYE ","M59N8MMZE ","M59N8RAXE ","M59N8RAYE ","M59N8RAZE ","M59N8RDXE ","M59N8RDYE ", & + "M59N8RDZE ","M59N8TAXE ","M59N8TAYE ","M59N8TAZE ","M59N8TDXSS","M59N8TDYSS","M59N8TDZSS", & + "M59N9FKXE ","M59N9FKYE ","M59N9FKZE ","M59N9FMXE ","M59N9FMYE ","M59N9FMZE ","M59N9MKXE ", & + "M59N9MKYE ","M59N9MKZE ","M59N9MMXE ","M59N9MMYE ","M59N9MMZE ","M59N9RAXE ","M59N9RAYE ", & + "M59N9RAZE ","M59N9RDXE ","M59N9RDYE ","M59N9RDZE ","M59N9TAXE ","M59N9TAYE ","M59N9TAZE ", & + "M59N9TDXSS","M59N9TDYSS","M59N9TDZSS","M60N1FKXE ","M60N1FKYE ","M60N1FKZE ","M60N1FMXE ", & + "M60N1FMYE ","M60N1FMZE ","M60N1MKXE ","M60N1MKYE ","M60N1MKZE ","M60N1MMXE ","M60N1MMYE ", & + "M60N1MMZE ","M60N1RAXE ","M60N1RAYE ","M60N1RAZE ","M60N1RDXE ","M60N1RDYE ","M60N1RDZE ", & + "M60N1TAXE ","M60N1TAYE ","M60N1TAZE ","M60N1TDXSS","M60N1TDYSS","M60N1TDZSS","M60N2FKXE ", & + "M60N2FKYE ","M60N2FKZE ","M60N2FMXE ","M60N2FMYE ","M60N2FMZE ","M60N2MKXE ","M60N2MKYE ", & + "M60N2MKZE ","M60N2MMXE ","M60N2MMYE ","M60N2MMZE ","M60N2RAXE ","M60N2RAYE ","M60N2RAZE ", & + "M60N2RDXE ","M60N2RDYE ","M60N2RDZE ","M60N2TAXE ","M60N2TAYE ","M60N2TAZE ","M60N2TDXSS", & + "M60N2TDYSS","M60N2TDZSS","M60N3FKXE ","M60N3FKYE ","M60N3FKZE ","M60N3FMXE ","M60N3FMYE ", & + "M60N3FMZE ","M60N3MKXE ","M60N3MKYE ","M60N3MKZE ","M60N3MMXE ","M60N3MMYE ","M60N3MMZE ", & + "M60N3RAXE ","M60N3RAYE ","M60N3RAZE ","M60N3RDXE ","M60N3RDYE ","M60N3RDZE ","M60N3TAXE ", & + "M60N3TAYE ","M60N3TAZE ","M60N3TDXSS","M60N3TDYSS","M60N3TDZSS","M60N4FKXE ","M60N4FKYE ", & + "M60N4FKZE ","M60N4FMXE ","M60N4FMYE ","M60N4FMZE ","M60N4MKXE ","M60N4MKYE ","M60N4MKZE ", & + "M60N4MMXE ","M60N4MMYE ","M60N4MMZE ","M60N4RAXE ","M60N4RAYE ","M60N4RAZE ","M60N4RDXE ", & + "M60N4RDYE ","M60N4RDZE ","M60N4TAXE ","M60N4TAYE ","M60N4TAZE ","M60N4TDXSS","M60N4TDYSS", & + "M60N4TDZSS","M60N5FKXE ","M60N5FKYE ","M60N5FKZE ","M60N5FMXE ","M60N5FMYE ","M60N5FMZE ", & + "M60N5MKXE ","M60N5MKYE ","M60N5MKZE ","M60N5MMXE ","M60N5MMYE ","M60N5MMZE ","M60N5RAXE ", & + "M60N5RAYE ","M60N5RAZE ","M60N5RDXE ","M60N5RDYE ","M60N5RDZE ","M60N5TAXE ","M60N5TAYE ", & + "M60N5TAZE ","M60N5TDXSS","M60N5TDYSS","M60N5TDZSS","M60N6FKXE ","M60N6FKYE ","M60N6FKZE ", & + "M60N6FMXE ","M60N6FMYE ","M60N6FMZE ","M60N6MKXE ","M60N6MKYE ","M60N6MKZE ","M60N6MMXE ", & + "M60N6MMYE ","M60N6MMZE ","M60N6RAXE ","M60N6RAYE ","M60N6RAZE ","M60N6RDXE ","M60N6RDYE ", & + "M60N6RDZE ","M60N6TAXE ","M60N6TAYE ","M60N6TAZE ","M60N6TDXSS","M60N6TDYSS","M60N6TDZSS", & + "M60N7FKXE ","M60N7FKYE ","M60N7FKZE ","M60N7FMXE ","M60N7FMYE ","M60N7FMZE ","M60N7MKXE ", & + "M60N7MKYE ","M60N7MKZE ","M60N7MMXE ","M60N7MMYE ","M60N7MMZE ","M60N7RAXE ","M60N7RAYE ", & + "M60N7RAZE ","M60N7RDXE ","M60N7RDYE ","M60N7RDZE ","M60N7TAXE ","M60N7TAYE ","M60N7TAZE ", & + "M60N7TDXSS","M60N7TDYSS","M60N7TDZSS","M60N8FKXE ","M60N8FKYE ","M60N8FKZE ","M60N8FMXE ", & + "M60N8FMYE ","M60N8FMZE ","M60N8MKXE ","M60N8MKYE ","M60N8MKZE ","M60N8MMXE ","M60N8MMYE ", & + "M60N8MMZE ","M60N8RAXE ","M60N8RAYE ","M60N8RAZE ","M60N8RDXE ","M60N8RDYE ","M60N8RDZE ", & + "M60N8TAXE ","M60N8TAYE ","M60N8TAZE ","M60N8TDXSS","M60N8TDYSS","M60N8TDZSS","M60N9FKXE ", & + "M60N9FKYE ","M60N9FKZE ","M60N9FMXE ","M60N9FMYE ","M60N9FMZE ","M60N9MKXE ","M60N9MKYE ", & + "M60N9MKZE ","M60N9MMXE ","M60N9MMYE ","M60N9MMZE ","M60N9RAXE ","M60N9RAYE ","M60N9RAZE ", & + "M60N9RDXE ","M60N9RDYE ","M60N9RDZE ","M60N9TAXE ","M60N9TAYE ","M60N9TAZE ","M60N9TDXSS", & + "M60N9TDYSS","M60N9TDZSS","M61N1FKXE ","M61N1FKYE ","M61N1FKZE ","M61N1FMXE ","M61N1FMYE ", & + "M61N1FMZE ","M61N1MKXE ","M61N1MKYE ","M61N1MKZE ","M61N1MMXE ","M61N1MMYE ","M61N1MMZE ", & + "M61N1RAXE ","M61N1RAYE ","M61N1RAZE ","M61N1RDXE ","M61N1RDYE ","M61N1RDZE ","M61N1TAXE ", & + "M61N1TAYE ","M61N1TAZE ","M61N1TDXSS","M61N1TDYSS","M61N1TDZSS","M61N2FKXE ","M61N2FKYE ", & + "M61N2FKZE ","M61N2FMXE ","M61N2FMYE ","M61N2FMZE ","M61N2MKXE ","M61N2MKYE ","M61N2MKZE ", & + "M61N2MMXE ","M61N2MMYE ","M61N2MMZE ","M61N2RAXE ","M61N2RAYE ","M61N2RAZE ","M61N2RDXE ", & + "M61N2RDYE ","M61N2RDZE ","M61N2TAXE ","M61N2TAYE ","M61N2TAZE ","M61N2TDXSS","M61N2TDYSS", & + "M61N2TDZSS","M61N3FKXE ","M61N3FKYE ","M61N3FKZE ","M61N3FMXE ","M61N3FMYE ","M61N3FMZE ", & + "M61N3MKXE ","M61N3MKYE ","M61N3MKZE ","M61N3MMXE ","M61N3MMYE ","M61N3MMZE ","M61N3RAXE ", & + "M61N3RAYE ","M61N3RAZE ","M61N3RDXE ","M61N3RDYE ","M61N3RDZE ","M61N3TAXE ","M61N3TAYE ", & + "M61N3TAZE ","M61N3TDXSS","M61N3TDYSS","M61N3TDZSS","M61N4FKXE ","M61N4FKYE ","M61N4FKZE ", & + "M61N4FMXE ","M61N4FMYE ","M61N4FMZE ","M61N4MKXE ","M61N4MKYE ","M61N4MKZE ","M61N4MMXE ", & + "M61N4MMYE ","M61N4MMZE ","M61N4RAXE ","M61N4RAYE ","M61N4RAZE ","M61N4RDXE ","M61N4RDYE ", & + "M61N4RDZE ","M61N4TAXE ","M61N4TAYE ","M61N4TAZE ","M61N4TDXSS","M61N4TDYSS","M61N4TDZSS", & + "M61N5FKXE ","M61N5FKYE ","M61N5FKZE ","M61N5FMXE ","M61N5FMYE ","M61N5FMZE ","M61N5MKXE ", & + "M61N5MKYE ","M61N5MKZE ","M61N5MMXE ","M61N5MMYE ","M61N5MMZE ","M61N5RAXE ","M61N5RAYE ", & + "M61N5RAZE ","M61N5RDXE ","M61N5RDYE ","M61N5RDZE ","M61N5TAXE ","M61N5TAYE ","M61N5TAZE ", & + "M61N5TDXSS","M61N5TDYSS","M61N5TDZSS","M61N6FKXE ","M61N6FKYE ","M61N6FKZE ","M61N6FMXE ", & + "M61N6FMYE ","M61N6FMZE ","M61N6MKXE ","M61N6MKYE ","M61N6MKZE ","M61N6MMXE ","M61N6MMYE ", & + "M61N6MMZE ","M61N6RAXE ","M61N6RAYE ","M61N6RAZE ","M61N6RDXE ","M61N6RDYE ","M61N6RDZE ", & + "M61N6TAXE ","M61N6TAYE ","M61N6TAZE ","M61N6TDXSS","M61N6TDYSS","M61N6TDZSS","M61N7FKXE ", & + "M61N7FKYE ","M61N7FKZE ","M61N7FMXE ","M61N7FMYE ","M61N7FMZE ","M61N7MKXE ","M61N7MKYE ", & + "M61N7MKZE ","M61N7MMXE ","M61N7MMYE ","M61N7MMZE ","M61N7RAXE ","M61N7RAYE ","M61N7RAZE ", & + "M61N7RDXE ","M61N7RDYE ","M61N7RDZE ","M61N7TAXE ","M61N7TAYE ","M61N7TAZE ","M61N7TDXSS", & + "M61N7TDYSS","M61N7TDZSS","M61N8FKXE ","M61N8FKYE ","M61N8FKZE ","M61N8FMXE ","M61N8FMYE ", & + "M61N8FMZE ","M61N8MKXE ","M61N8MKYE ","M61N8MKZE ","M61N8MMXE ","M61N8MMYE ","M61N8MMZE ", & + "M61N8RAXE ","M61N8RAYE ","M61N8RAZE ","M61N8RDXE ","M61N8RDYE ","M61N8RDZE ","M61N8TAXE ", & + "M61N8TAYE ","M61N8TAZE ","M61N8TDXSS","M61N8TDYSS","M61N8TDZSS","M61N9FKXE ","M61N9FKYE ", & + "M61N9FKZE ","M61N9FMXE ","M61N9FMYE ","M61N9FMZE ","M61N9MKXE ","M61N9MKYE ","M61N9MKZE ", & + "M61N9MMXE ","M61N9MMYE ","M61N9MMZE ","M61N9RAXE ","M61N9RAYE ","M61N9RAZE ","M61N9RDXE ", & + "M61N9RDYE ","M61N9RDZE ","M61N9TAXE ","M61N9TAYE ","M61N9TAZE ","M61N9TDXSS","M61N9TDYSS", & + "M61N9TDZSS","M62N1FKXE ","M62N1FKYE ","M62N1FKZE ","M62N1FMXE ","M62N1FMYE ","M62N1FMZE ", & + "M62N1MKXE ","M62N1MKYE ","M62N1MKZE ","M62N1MMXE ","M62N1MMYE ","M62N1MMZE ","M62N1RAXE ", & + "M62N1RAYE ","M62N1RAZE ","M62N1RDXE ","M62N1RDYE ","M62N1RDZE ","M62N1TAXE ","M62N1TAYE ", & + "M62N1TAZE ","M62N1TDXSS","M62N1TDYSS","M62N1TDZSS","M62N2FKXE ","M62N2FKYE ","M62N2FKZE ", & + "M62N2FMXE ","M62N2FMYE ","M62N2FMZE ","M62N2MKXE ","M62N2MKYE ","M62N2MKZE ","M62N2MMXE ", & + "M62N2MMYE ","M62N2MMZE ","M62N2RAXE ","M62N2RAYE ","M62N2RAZE ","M62N2RDXE ","M62N2RDYE ", & + "M62N2RDZE ","M62N2TAXE ","M62N2TAYE ","M62N2TAZE ","M62N2TDXSS","M62N2TDYSS","M62N2TDZSS", & + "M62N3FKXE ","M62N3FKYE ","M62N3FKZE ","M62N3FMXE ","M62N3FMYE ","M62N3FMZE ","M62N3MKXE ", & + "M62N3MKYE ","M62N3MKZE ","M62N3MMXE ","M62N3MMYE ","M62N3MMZE ","M62N3RAXE ","M62N3RAYE ", & + "M62N3RAZE ","M62N3RDXE ","M62N3RDYE ","M62N3RDZE ","M62N3TAXE ","M62N3TAYE ","M62N3TAZE ", & + "M62N3TDXSS","M62N3TDYSS","M62N3TDZSS","M62N4FKXE ","M62N4FKYE ","M62N4FKZE ","M62N4FMXE ", & + "M62N4FMYE ","M62N4FMZE ","M62N4MKXE ","M62N4MKYE ","M62N4MKZE ","M62N4MMXE ","M62N4MMYE ", & + "M62N4MMZE ","M62N4RAXE ","M62N4RAYE ","M62N4RAZE ","M62N4RDXE ","M62N4RDYE ","M62N4RDZE ", & + "M62N4TAXE ","M62N4TAYE ","M62N4TAZE ","M62N4TDXSS","M62N4TDYSS","M62N4TDZSS","M62N5FKXE ", & + "M62N5FKYE ","M62N5FKZE ","M62N5FMXE ","M62N5FMYE ","M62N5FMZE ","M62N5MKXE ","M62N5MKYE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry9(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M62N5MKZE ","M62N5MMXE ","M62N5MMYE ","M62N5MMZE ","M62N5RAXE ","M62N5RAYE ","M62N5RAZE ", & + "M62N5RDXE ","M62N5RDYE ","M62N5RDZE ","M62N5TAXE ","M62N5TAYE ","M62N5TAZE ","M62N5TDXSS", & + "M62N5TDYSS","M62N5TDZSS","M62N6FKXE ","M62N6FKYE ","M62N6FKZE ","M62N6FMXE ","M62N6FMYE ", & + "M62N6FMZE ","M62N6MKXE ","M62N6MKYE ","M62N6MKZE ","M62N6MMXE ","M62N6MMYE ","M62N6MMZE ", & + "M62N6RAXE ","M62N6RAYE ","M62N6RAZE ","M62N6RDXE ","M62N6RDYE ","M62N6RDZE ","M62N6TAXE ", & + "M62N6TAYE ","M62N6TAZE ","M62N6TDXSS","M62N6TDYSS","M62N6TDZSS","M62N7FKXE ","M62N7FKYE ", & + "M62N7FKZE ","M62N7FMXE ","M62N7FMYE ","M62N7FMZE ","M62N7MKXE ","M62N7MKYE ","M62N7MKZE ", & + "M62N7MMXE ","M62N7MMYE ","M62N7MMZE ","M62N7RAXE ","M62N7RAYE ","M62N7RAZE ","M62N7RDXE ", & + "M62N7RDYE ","M62N7RDZE ","M62N7TAXE ","M62N7TAYE ","M62N7TAZE ","M62N7TDXSS","M62N7TDYSS", & + "M62N7TDZSS","M62N8FKXE ","M62N8FKYE ","M62N8FKZE ","M62N8FMXE ","M62N8FMYE ","M62N8FMZE ", & + "M62N8MKXE ","M62N8MKYE ","M62N8MKZE ","M62N8MMXE ","M62N8MMYE ","M62N8MMZE ","M62N8RAXE ", & + "M62N8RAYE ","M62N8RAZE ","M62N8RDXE ","M62N8RDYE ","M62N8RDZE ","M62N8TAXE ","M62N8TAYE ", & + "M62N8TAZE ","M62N8TDXSS","M62N8TDYSS","M62N8TDZSS","M62N9FKXE ","M62N9FKYE ","M62N9FKZE ", & + "M62N9FMXE ","M62N9FMYE ","M62N9FMZE ","M62N9MKXE ","M62N9MKYE ","M62N9MKZE ","M62N9MMXE ", & + "M62N9MMYE ","M62N9MMZE ","M62N9RAXE ","M62N9RAYE ","M62N9RAZE ","M62N9RDXE ","M62N9RDYE ", & + "M62N9RDZE ","M62N9TAXE ","M62N9TAYE ","M62N9TAZE ","M62N9TDXSS","M62N9TDYSS","M62N9TDZSS", & + "M63N1FKXE ","M63N1FKYE ","M63N1FKZE ","M63N1FMXE ","M63N1FMYE ","M63N1FMZE ","M63N1MKXE ", & + "M63N1MKYE ","M63N1MKZE ","M63N1MMXE ","M63N1MMYE ","M63N1MMZE ","M63N1RAXE ","M63N1RAYE ", & + "M63N1RAZE ","M63N1RDXE ","M63N1RDYE ","M63N1RDZE ","M63N1TAXE ","M63N1TAYE ","M63N1TAZE ", & + "M63N1TDXSS","M63N1TDYSS","M63N1TDZSS","M63N2FKXE ","M63N2FKYE ","M63N2FKZE ","M63N2FMXE ", & + "M63N2FMYE ","M63N2FMZE ","M63N2MKXE ","M63N2MKYE ","M63N2MKZE ","M63N2MMXE ","M63N2MMYE ", & + "M63N2MMZE ","M63N2RAXE ","M63N2RAYE ","M63N2RAZE ","M63N2RDXE ","M63N2RDYE ","M63N2RDZE ", & + "M63N2TAXE ","M63N2TAYE ","M63N2TAZE ","M63N2TDXSS","M63N2TDYSS","M63N2TDZSS","M63N3FKXE ", & + "M63N3FKYE ","M63N3FKZE ","M63N3FMXE ","M63N3FMYE ","M63N3FMZE ","M63N3MKXE ","M63N3MKYE ", & + "M63N3MKZE ","M63N3MMXE ","M63N3MMYE ","M63N3MMZE ","M63N3RAXE ","M63N3RAYE ","M63N3RAZE ", & + "M63N3RDXE ","M63N3RDYE ","M63N3RDZE ","M63N3TAXE ","M63N3TAYE ","M63N3TAZE ","M63N3TDXSS", & + "M63N3TDYSS","M63N3TDZSS","M63N4FKXE ","M63N4FKYE ","M63N4FKZE ","M63N4FMXE ","M63N4FMYE ", & + "M63N4FMZE ","M63N4MKXE ","M63N4MKYE ","M63N4MKZE ","M63N4MMXE ","M63N4MMYE ","M63N4MMZE ", & + "M63N4RAXE ","M63N4RAYE ","M63N4RAZE ","M63N4RDXE ","M63N4RDYE ","M63N4RDZE ","M63N4TAXE ", & + "M63N4TAYE ","M63N4TAZE ","M63N4TDXSS","M63N4TDYSS","M63N4TDZSS","M63N5FKXE ","M63N5FKYE ", & + "M63N5FKZE ","M63N5FMXE ","M63N5FMYE ","M63N5FMZE ","M63N5MKXE ","M63N5MKYE ","M63N5MKZE ", & + "M63N5MMXE ","M63N5MMYE ","M63N5MMZE ","M63N5RAXE ","M63N5RAYE ","M63N5RAZE ","M63N5RDXE ", & + "M63N5RDYE ","M63N5RDZE ","M63N5TAXE ","M63N5TAYE ","M63N5TAZE ","M63N5TDXSS","M63N5TDYSS", & + "M63N5TDZSS","M63N6FKXE ","M63N6FKYE ","M63N6FKZE ","M63N6FMXE ","M63N6FMYE ","M63N6FMZE ", & + "M63N6MKXE ","M63N6MKYE ","M63N6MKZE ","M63N6MMXE ","M63N6MMYE ","M63N6MMZE ","M63N6RAXE ", & + "M63N6RAYE ","M63N6RAZE ","M63N6RDXE ","M63N6RDYE ","M63N6RDZE ","M63N6TAXE ","M63N6TAYE ", & + "M63N6TAZE ","M63N6TDXSS","M63N6TDYSS","M63N6TDZSS","M63N7FKXE ","M63N7FKYE ","M63N7FKZE ", & + "M63N7FMXE ","M63N7FMYE ","M63N7FMZE ","M63N7MKXE ","M63N7MKYE ","M63N7MKZE ","M63N7MMXE ", & + "M63N7MMYE ","M63N7MMZE ","M63N7RAXE ","M63N7RAYE ","M63N7RAZE ","M63N7RDXE ","M63N7RDYE ", & + "M63N7RDZE ","M63N7TAXE ","M63N7TAYE ","M63N7TAZE ","M63N7TDXSS","M63N7TDYSS","M63N7TDZSS", & + "M63N8FKXE ","M63N8FKYE ","M63N8FKZE ","M63N8FMXE ","M63N8FMYE ","M63N8FMZE ","M63N8MKXE ", & + "M63N8MKYE ","M63N8MKZE ","M63N8MMXE ","M63N8MMYE ","M63N8MMZE ","M63N8RAXE ","M63N8RAYE ", & + "M63N8RAZE ","M63N8RDXE ","M63N8RDYE ","M63N8RDZE ","M63N8TAXE ","M63N8TAYE ","M63N8TAZE ", & + "M63N8TDXSS","M63N8TDYSS","M63N8TDZSS","M63N9FKXE ","M63N9FKYE ","M63N9FKZE ","M63N9FMXE ", & + "M63N9FMYE ","M63N9FMZE ","M63N9MKXE ","M63N9MKYE ","M63N9MKZE ","M63N9MMXE ","M63N9MMYE ", & + "M63N9MMZE ","M63N9RAXE ","M63N9RAYE ","M63N9RAZE ","M63N9RDXE ","M63N9RDYE ","M63N9RDZE ", & + "M63N9TAXE ","M63N9TAYE ","M63N9TAZE ","M63N9TDXSS","M63N9TDYSS","M63N9TDZSS","M64N1FKXE ", & + "M64N1FKYE ","M64N1FKZE ","M64N1FMXE ","M64N1FMYE ","M64N1FMZE ","M64N1MKXE ","M64N1MKYE ", & + "M64N1MKZE ","M64N1MMXE ","M64N1MMYE ","M64N1MMZE ","M64N1RAXE ","M64N1RAYE ","M64N1RAZE ", & + "M64N1RDXE ","M64N1RDYE ","M64N1RDZE ","M64N1TAXE ","M64N1TAYE ","M64N1TAZE ","M64N1TDXSS", & + "M64N1TDYSS","M64N1TDZSS","M64N2FKXE ","M64N2FKYE ","M64N2FKZE ","M64N2FMXE ","M64N2FMYE ", & + "M64N2FMZE ","M64N2MKXE ","M64N2MKYE ","M64N2MKZE ","M64N2MMXE ","M64N2MMYE ","M64N2MMZE ", & + "M64N2RAXE ","M64N2RAYE ","M64N2RAZE ","M64N2RDXE ","M64N2RDYE ","M64N2RDZE ","M64N2TAXE ", & + "M64N2TAYE ","M64N2TAZE ","M64N2TDXSS","M64N2TDYSS","M64N2TDZSS","M64N3FKXE ","M64N3FKYE ", & + "M64N3FKZE ","M64N3FMXE ","M64N3FMYE ","M64N3FMZE ","M64N3MKXE ","M64N3MKYE ","M64N3MKZE ", & + "M64N3MMXE ","M64N3MMYE ","M64N3MMZE ","M64N3RAXE ","M64N3RAYE ","M64N3RAZE ","M64N3RDXE ", & + "M64N3RDYE ","M64N3RDZE ","M64N3TAXE ","M64N3TAYE ","M64N3TAZE ","M64N3TDXSS","M64N3TDYSS", & + "M64N3TDZSS","M64N4FKXE ","M64N4FKYE ","M64N4FKZE ","M64N4FMXE ","M64N4FMYE ","M64N4FMZE ", & + "M64N4MKXE ","M64N4MKYE ","M64N4MKZE ","M64N4MMXE ","M64N4MMYE ","M64N4MMZE ","M64N4RAXE ", & + "M64N4RAYE ","M64N4RAZE ","M64N4RDXE ","M64N4RDYE ","M64N4RDZE ","M64N4TAXE ","M64N4TAYE ", & + "M64N4TAZE ","M64N4TDXSS","M64N4TDYSS","M64N4TDZSS","M64N5FKXE ","M64N5FKYE ","M64N5FKZE ", & + "M64N5FMXE ","M64N5FMYE ","M64N5FMZE ","M64N5MKXE ","M64N5MKYE ","M64N5MKZE ","M64N5MMXE ", & + "M64N5MMYE ","M64N5MMZE ","M64N5RAXE ","M64N5RAYE ","M64N5RAZE ","M64N5RDXE ","M64N5RDYE ", & + "M64N5RDZE ","M64N5TAXE ","M64N5TAYE ","M64N5TAZE ","M64N5TDXSS","M64N5TDYSS","M64N5TDZSS", & + "M64N6FKXE ","M64N6FKYE ","M64N6FKZE ","M64N6FMXE ","M64N6FMYE ","M64N6FMZE ","M64N6MKXE ", & + "M64N6MKYE ","M64N6MKZE ","M64N6MMXE ","M64N6MMYE ","M64N6MMZE ","M64N6RAXE ","M64N6RAYE ", & + "M64N6RAZE ","M64N6RDXE ","M64N6RDYE ","M64N6RDZE ","M64N6TAXE ","M64N6TAYE ","M64N6TAZE ", & + "M64N6TDXSS","M64N6TDYSS","M64N6TDZSS","M64N7FKXE ","M64N7FKYE ","M64N7FKZE ","M64N7FMXE ", & + "M64N7FMYE ","M64N7FMZE ","M64N7MKXE ","M64N7MKYE ","M64N7MKZE ","M64N7MMXE ","M64N7MMYE ", & + "M64N7MMZE ","M64N7RAXE ","M64N7RAYE ","M64N7RAZE ","M64N7RDXE ","M64N7RDYE ","M64N7RDZE ", & + "M64N7TAXE ","M64N7TAYE ","M64N7TAZE ","M64N7TDXSS","M64N7TDYSS","M64N7TDZSS","M64N8FKXE ", & + "M64N8FKYE ","M64N8FKZE ","M64N8FMXE ","M64N8FMYE ","M64N8FMZE ","M64N8MKXE ","M64N8MKYE ", & + "M64N8MKZE ","M64N8MMXE ","M64N8MMYE ","M64N8MMZE ","M64N8RAXE ","M64N8RAYE ","M64N8RAZE ", & + "M64N8RDXE ","M64N8RDYE ","M64N8RDZE ","M64N8TAXE ","M64N8TAYE ","M64N8TAZE ","M64N8TDXSS", & + "M64N8TDYSS","M64N8TDZSS","M64N9FKXE ","M64N9FKYE ","M64N9FKZE ","M64N9FMXE ","M64N9FMYE ", & + "M64N9FMZE ","M64N9MKXE ","M64N9MKYE ","M64N9MKZE ","M64N9MMXE ","M64N9MMYE ","M64N9MMZE ", & + "M64N9RAXE ","M64N9RAYE ","M64N9RAZE ","M64N9RDXE ","M64N9RDYE ","M64N9RDZE ","M64N9TAXE ", & + "M64N9TAYE ","M64N9TAZE ","M64N9TDXSS","M64N9TDYSS","M64N9TDZSS","M65N1FKXE ","M65N1FKYE ", & + "M65N1FKZE ","M65N1FMXE ","M65N1FMYE ","M65N1FMZE ","M65N1MKXE ","M65N1MKYE ","M65N1MKZE ", & + "M65N1MMXE ","M65N1MMYE ","M65N1MMZE ","M65N1RAXE ","M65N1RAYE ","M65N1RAZE ","M65N1RDXE ", & + "M65N1RDYE ","M65N1RDZE ","M65N1TAXE ","M65N1TAYE ","M65N1TAZE ","M65N1TDXSS","M65N1TDYSS", & + "M65N1TDZSS","M65N2FKXE ","M65N2FKYE ","M65N2FKZE ","M65N2FMXE ","M65N2FMYE ","M65N2FMZE ", & + "M65N2MKXE ","M65N2MKYE ","M65N2MKZE ","M65N2MMXE ","M65N2MMYE ","M65N2MMZE ","M65N2RAXE ", & + "M65N2RAYE ","M65N2RAZE ","M65N2RDXE ","M65N2RDYE ","M65N2RDZE ","M65N2TAXE ","M65N2TAYE ", & + "M65N2TAZE ","M65N2TDXSS","M65N2TDYSS","M65N2TDZSS","M65N3FKXE ","M65N3FKYE ","M65N3FKZE ", & + "M65N3FMXE ","M65N3FMYE ","M65N3FMZE ","M65N3MKXE ","M65N3MKYE ","M65N3MKZE ","M65N3MMXE ", & + "M65N3MMYE ","M65N3MMZE ","M65N3RAXE ","M65N3RAYE ","M65N3RAZE ","M65N3RDXE ","M65N3RDYE ", & + "M65N3RDZE ","M65N3TAXE ","M65N3TAYE ","M65N3TAZE ","M65N3TDXSS","M65N3TDYSS","M65N3TDZSS", & + "M65N4FKXE ","M65N4FKYE ","M65N4FKZE ","M65N4FMXE ","M65N4FMYE ","M65N4FMZE ","M65N4MKXE ", & + "M65N4MKYE ","M65N4MKZE ","M65N4MMXE ","M65N4MMYE ","M65N4MMZE ","M65N4RAXE ","M65N4RAYE ", & + "M65N4RAZE ","M65N4RDXE ","M65N4RDYE ","M65N4RDZE ","M65N4TAXE ","M65N4TAYE ","M65N4TAZE ", & + "M65N4TDXSS","M65N4TDYSS","M65N4TDZSS","M65N5FKXE ","M65N5FKYE ","M65N5FKZE ","M65N5FMXE ", & + "M65N5FMYE ","M65N5FMZE ","M65N5MKXE ","M65N5MKYE ","M65N5MKZE ","M65N5MMXE ","M65N5MMYE ", & + "M65N5MMZE ","M65N5RAXE ","M65N5RAYE ","M65N5RAZE ","M65N5RDXE ","M65N5RDYE ","M65N5RDZE ", & + "M65N5TAXE ","M65N5TAYE ","M65N5TAZE ","M65N5TDXSS","M65N5TDYSS","M65N5TDZSS","M65N6FKXE ", & + "M65N6FKYE ","M65N6FKZE ","M65N6FMXE ","M65N6FMYE ","M65N6FMZE ","M65N6MKXE ","M65N6MKYE ", & + "M65N6MKZE ","M65N6MMXE ","M65N6MMYE ","M65N6MMZE ","M65N6RAXE ","M65N6RAYE ","M65N6RAZE ", & + "M65N6RDXE ","M65N6RDYE ","M65N6RDZE ","M65N6TAXE ","M65N6TAYE ","M65N6TAZE ","M65N6TDXSS", & + "M65N6TDYSS","M65N6TDZSS","M65N7FKXE ","M65N7FKYE ","M65N7FKZE ","M65N7FMXE ","M65N7FMYE ", & + "M65N7FMZE ","M65N7MKXE ","M65N7MKYE ","M65N7MKZE ","M65N7MMXE ","M65N7MMYE ","M65N7MMZE ", & + "M65N7RAXE ","M65N7RAYE ","M65N7RAZE ","M65N7RDXE ","M65N7RDYE ","M65N7RDZE ","M65N7TAXE ", & + "M65N7TAYE ","M65N7TAZE ","M65N7TDXSS","M65N7TDYSS","M65N7TDZSS","M65N8FKXE ","M65N8FKYE ", & + "M65N8FKZE ","M65N8FMXE ","M65N8FMYE ","M65N8FMZE ","M65N8MKXE ","M65N8MKYE ","M65N8MKZE ", & + "M65N8MMXE ","M65N8MMYE ","M65N8MMZE ","M65N8RAXE ","M65N8RAYE ","M65N8RAZE ","M65N8RDXE ", & + "M65N8RDYE ","M65N8RDZE ","M65N8TAXE ","M65N8TAYE ","M65N8TAZE ","M65N8TDXSS","M65N8TDYSS", & + "M65N8TDZSS","M65N9FKXE ","M65N9FKYE ","M65N9FKZE ","M65N9FMXE ","M65N9FMYE ","M65N9FMZE ", & + "M65N9MKXE ","M65N9MKYE ","M65N9MKZE ","M65N9MMXE ","M65N9MMYE ","M65N9MMZE ","M65N9RAXE ", & + "M65N9RAYE ","M65N9RAZE ","M65N9RDXE ","M65N9RDYE ","M65N9RDZE ","M65N9TAXE ","M65N9TAYE ", & + "M65N9TAZE ","M65N9TDXSS","M65N9TDYSS","M65N9TDZSS","M66N1FKXE ","M66N1FKYE ","M66N1FKZE ", & + "M66N1FMXE ","M66N1FMYE ","M66N1FMZE ","M66N1MKXE ","M66N1MKYE ","M66N1MKZE ","M66N1MMXE ", & + "M66N1MMYE ","M66N1MMZE ","M66N1RAXE ","M66N1RAYE ","M66N1RAZE ","M66N1RDXE ","M66N1RDYE ", & + "M66N1RDZE ","M66N1TAXE ","M66N1TAYE ","M66N1TAZE ","M66N1TDXSS","M66N1TDYSS","M66N1TDZSS", & + "M66N2FKXE ","M66N2FKYE ","M66N2FKZE ","M66N2FMXE ","M66N2FMYE ","M66N2FMZE ","M66N2MKXE ", & + "M66N2MKYE ","M66N2MKZE ","M66N2MMXE ","M66N2MMYE ","M66N2MMZE ","M66N2RAXE ","M66N2RAYE ", & + "M66N2RAZE ","M66N2RDXE ","M66N2RDYE ","M66N2RDZE ","M66N2TAXE ","M66N2TAYE ","M66N2TAZE ", & + "M66N2TDXSS","M66N2TDYSS","M66N2TDZSS","M66N3FKXE ","M66N3FKYE ","M66N3FKZE ","M66N3FMXE ", & + "M66N3FMYE ","M66N3FMZE ","M66N3MKXE ","M66N3MKYE ","M66N3MKZE ","M66N3MMXE ","M66N3MMYE ", & + "M66N3MMZE ","M66N3RAXE ","M66N3RAYE ","M66N3RAZE ","M66N3RDXE ","M66N3RDYE ","M66N3RDZE ", & + "M66N3TAXE ","M66N3TAYE ","M66N3TAZE ","M66N3TDXSS","M66N3TDYSS","M66N3TDZSS","M66N4FKXE ", & + "M66N4FKYE ","M66N4FKZE ","M66N4FMXE ","M66N4FMYE ","M66N4FMZE ","M66N4MKXE ","M66N4MKYE ", & + "M66N4MKZE ","M66N4MMXE ","M66N4MMYE ","M66N4MMZE ","M66N4RAXE ","M66N4RAYE ","M66N4RAZE ", & + "M66N4RDXE ","M66N4RDYE ","M66N4RDZE ","M66N4TAXE ","M66N4TAYE ","M66N4TAZE ","M66N4TDXSS", & + "M66N4TDYSS","M66N4TDZSS","M66N5FKXE ","M66N5FKYE ","M66N5FKZE ","M66N5FMXE ","M66N5FMYE ", & + "M66N5FMZE ","M66N5MKXE ","M66N5MKYE ","M66N5MKZE ","M66N5MMXE ","M66N5MMYE ","M66N5MMZE ", & + "M66N5RAXE ","M66N5RAYE ","M66N5RAZE ","M66N5RDXE ","M66N5RDYE ","M66N5RDZE ","M66N5TAXE ", & + "M66N5TAYE ","M66N5TAZE ","M66N5TDXSS","M66N5TDYSS","M66N5TDZSS","M66N6FKXE ","M66N6FKYE ", & + "M66N6FKZE ","M66N6FMXE ","M66N6FMYE ","M66N6FMZE ","M66N6MKXE ","M66N6MKYE ","M66N6MKZE ", & + "M66N6MMXE ","M66N6MMYE ","M66N6MMZE ","M66N6RAXE ","M66N6RAYE ","M66N6RAZE ","M66N6RDXE ", & + "M66N6RDYE ","M66N6RDZE ","M66N6TAXE ","M66N6TAYE ","M66N6TAZE ","M66N6TDXSS","M66N6TDYSS", & + "M66N6TDZSS","M66N7FKXE ","M66N7FKYE ","M66N7FKZE ","M66N7FMXE ","M66N7FMYE ","M66N7FMZE ", & + "M66N7MKXE ","M66N7MKYE ","M66N7MKZE ","M66N7MMXE ","M66N7MMYE ","M66N7MMZE ","M66N7RAXE ", & + "M66N7RAYE ","M66N7RAZE ","M66N7RDXE ","M66N7RDYE ","M66N7RDZE ","M66N7TAXE ","M66N7TAYE ", & + "M66N7TAZE ","M66N7TDXSS","M66N7TDYSS","M66N7TDZSS","M66N8FKXE ","M66N8FKYE ","M66N8FKZE ", & + "M66N8FMXE ","M66N8FMYE ","M66N8FMZE ","M66N8MKXE ","M66N8MKYE ","M66N8MKZE ","M66N8MMXE ", & + "M66N8MMYE ","M66N8MMZE ","M66N8RAXE ","M66N8RAYE ","M66N8RAZE ","M66N8RDXE ","M66N8RDYE ", & + "M66N8RDZE ","M66N8TAXE ","M66N8TAYE ","M66N8TAZE ","M66N8TDXSS","M66N8TDYSS","M66N8TDZSS", & + "M66N9FKXE ","M66N9FKYE ","M66N9FKZE ","M66N9FMXE ","M66N9FMYE ","M66N9FMZE ","M66N9MKXE ", & + "M66N9MKYE ","M66N9MKZE ","M66N9MMXE ","M66N9MMYE ","M66N9MMZE ","M66N9RAXE ","M66N9RAYE ", & + "M66N9RAZE ","M66N9RDXE ","M66N9RDYE ","M66N9RDZE ","M66N9TAXE ","M66N9TAYE ","M66N9TAZE ", & + "M66N9TDXSS","M66N9TDYSS","M66N9TDZSS","M67N1FKXE ","M67N1FKYE ","M67N1FKZE ","M67N1FMXE ", & + "M67N1FMYE ","M67N1FMZE ","M67N1MKXE ","M67N1MKYE ","M67N1MKZE ","M67N1MMXE ","M67N1MMYE ", & + "M67N1MMZE ","M67N1RAXE ","M67N1RAYE ","M67N1RAZE ","M67N1RDXE ","M67N1RDYE ","M67N1RDZE ", & + "M67N1TAXE ","M67N1TAYE ","M67N1TAZE ","M67N1TDXSS","M67N1TDYSS","M67N1TDZSS","M67N2FKXE ", & + "M67N2FKYE ","M67N2FKZE ","M67N2FMXE ","M67N2FMYE ","M67N2FMZE ","M67N2MKXE ","M67N2MKYE ", & + "M67N2MKZE ","M67N2MMXE ","M67N2MMYE ","M67N2MMZE ","M67N2RAXE ","M67N2RAYE ","M67N2RAZE ", & + "M67N2RDXE ","M67N2RDYE ","M67N2RDZE ","M67N2TAXE ","M67N2TAYE ","M67N2TAZE ","M67N2TDXSS", & + "M67N2TDYSS","M67N2TDZSS","M67N3FKXE ","M67N3FKYE ","M67N3FKZE ","M67N3FMXE ","M67N3FMYE ", & + "M67N3FMZE ","M67N3MKXE ","M67N3MKYE ","M67N3MKZE ","M67N3MMXE ","M67N3MMYE ","M67N3MMZE ", & + "M67N3RAXE ","M67N3RAYE ","M67N3RAZE ","M67N3RDXE ","M67N3RDYE ","M67N3RDZE ","M67N3TAXE ", & + "M67N3TAYE ","M67N3TAZE ","M67N3TDXSS","M67N3TDYSS","M67N3TDZSS","M67N4FKXE ","M67N4FKYE ", & + "M67N4FKZE ","M67N4FMXE ","M67N4FMYE ","M67N4FMZE ","M67N4MKXE ","M67N4MKYE ","M67N4MKZE ", & + "M67N4MMXE ","M67N4MMYE ","M67N4MMZE ","M67N4RAXE ","M67N4RAYE ","M67N4RAZE ","M67N4RDXE ", & + "M67N4RDYE ","M67N4RDZE ","M67N4TAXE ","M67N4TAYE ","M67N4TAZE ","M67N4TDXSS","M67N4TDYSS", & + "M67N4TDZSS","M67N5FKXE ","M67N5FKYE ","M67N5FKZE ","M67N5FMXE ","M67N5FMYE ","M67N5FMZE ", & + "M67N5MKXE ","M67N5MKYE ","M67N5MKZE ","M67N5MMXE ","M67N5MMYE ","M67N5MMZE ","M67N5RAXE ", & + "M67N5RAYE ","M67N5RAZE ","M67N5RDXE ","M67N5RDYE ","M67N5RDZE ","M67N5TAXE ","M67N5TAYE ", & + "M67N5TAZE ","M67N5TDXSS","M67N5TDYSS","M67N5TDZSS","M67N6FKXE ","M67N6FKYE ","M67N6FKZE ", & + "M67N6FMXE ","M67N6FMYE ","M67N6FMZE ","M67N6MKXE ","M67N6MKYE ","M67N6MKZE ","M67N6MMXE ", & + "M67N6MMYE ","M67N6MMZE ","M67N6RAXE ","M67N6RAYE ","M67N6RAZE ","M67N6RDXE ","M67N6RDYE ", & + "M67N6RDZE ","M67N6TAXE ","M67N6TAYE ","M67N6TAZE ","M67N6TDXSS","M67N6TDYSS","M67N6TDZSS", & + "M67N7FKXE ","M67N7FKYE ","M67N7FKZE ","M67N7FMXE ","M67N7FMYE ","M67N7FMZE ","M67N7MKXE ", & + "M67N7MKYE ","M67N7MKZE ","M67N7MMXE ","M67N7MMYE ","M67N7MMZE ","M67N7RAXE ","M67N7RAYE ", & + "M67N7RAZE ","M67N7RDXE ","M67N7RDYE ","M67N7RDZE ","M67N7TAXE ","M67N7TAYE ","M67N7TAZE ", & + "M67N7TDXSS","M67N7TDYSS","M67N7TDZSS","M67N8FKXE ","M67N8FKYE ","M67N8FKZE ","M67N8FMXE ", & + "M67N8FMYE ","M67N8FMZE ","M67N8MKXE ","M67N8MKYE ","M67N8MKZE ","M67N8MMXE ","M67N8MMYE ", & + "M67N8MMZE ","M67N8RAXE ","M67N8RAYE ","M67N8RAZE ","M67N8RDXE ","M67N8RDYE ","M67N8RDZE ", & + "M67N8TAXE ","M67N8TAYE ","M67N8TAZE ","M67N8TDXSS","M67N8TDYSS","M67N8TDZSS","M67N9FKXE ", & + "M67N9FKYE ","M67N9FKZE ","M67N9FMXE ","M67N9FMYE ","M67N9FMZE ","M67N9MKXE ","M67N9MKYE ", & + "M67N9MKZE ","M67N9MMXE ","M67N9MMYE ","M67N9MMZE ","M67N9RAXE ","M67N9RAYE ","M67N9RAZE ", & + "M67N9RDXE ","M67N9RDYE ","M67N9RDZE ","M67N9TAXE ","M67N9TAYE ","M67N9TAZE ","M67N9TDXSS", & + "M67N9TDYSS","M67N9TDZSS","M68N1FKXE ","M68N1FKYE ","M68N1FKZE ","M68N1FMXE ","M68N1FMYE ", & + "M68N1FMZE ","M68N1MKXE ","M68N1MKYE ","M68N1MKZE ","M68N1MMXE ","M68N1MMYE ","M68N1MMZE ", & + "M68N1RAXE ","M68N1RAYE ","M68N1RAZE ","M68N1RDXE ","M68N1RDYE ","M68N1RDZE ","M68N1TAXE ", & + "M68N1TAYE ","M68N1TAZE ","M68N1TDXSS","M68N1TDYSS","M68N1TDZSS","M68N2FKXE ","M68N2FKYE ", & + "M68N2FKZE ","M68N2FMXE ","M68N2FMYE ","M68N2FMZE ","M68N2MKXE ","M68N2MKYE ","M68N2MKZE ", & + "M68N2MMXE ","M68N2MMYE ","M68N2MMZE ","M68N2RAXE ","M68N2RAYE ","M68N2RAZE ","M68N2RDXE ", & + "M68N2RDYE ","M68N2RDZE ","M68N2TAXE ","M68N2TAYE ","M68N2TAZE ","M68N2TDXSS","M68N2TDYSS", & + "M68N2TDZSS","M68N3FKXE ","M68N3FKYE ","M68N3FKZE ","M68N3FMXE ","M68N3FMYE ","M68N3FMZE ", & + "M68N3MKXE ","M68N3MKYE ","M68N3MKZE ","M68N3MMXE ","M68N3MMYE ","M68N3MMZE ","M68N3RAXE ", & + "M68N3RAYE ","M68N3RAZE ","M68N3RDXE ","M68N3RDYE ","M68N3RDZE ","M68N3TAXE ","M68N3TAYE ", & + "M68N3TAZE ","M68N3TDXSS","M68N3TDYSS","M68N3TDZSS","M68N4FKXE ","M68N4FKYE ","M68N4FKZE ", & + "M68N4FMXE ","M68N4FMYE ","M68N4FMZE ","M68N4MKXE ","M68N4MKYE ","M68N4MKZE ","M68N4MMXE ", & + "M68N4MMYE ","M68N4MMZE ","M68N4RAXE ","M68N4RAYE ","M68N4RAZE ","M68N4RDXE ","M68N4RDYE ", & + "M68N4RDZE ","M68N4TAXE ","M68N4TAYE ","M68N4TAZE ","M68N4TDXSS","M68N4TDYSS","M68N4TDZSS", & + "M68N5FKXE ","M68N5FKYE ","M68N5FKZE ","M68N5FMXE ","M68N5FMYE ","M68N5FMZE ","M68N5MKXE ", & + "M68N5MKYE ","M68N5MKZE ","M68N5MMXE ","M68N5MMYE ","M68N5MMZE ","M68N5RAXE ","M68N5RAYE ", & + "M68N5RAZE ","M68N5RDXE ","M68N5RDYE ","M68N5RDZE ","M68N5TAXE ","M68N5TAYE ","M68N5TAZE ", & + "M68N5TDXSS","M68N5TDYSS","M68N5TDZSS","M68N6FKXE ","M68N6FKYE ","M68N6FKZE ","M68N6FMXE ", & + "M68N6FMYE ","M68N6FMZE ","M68N6MKXE ","M68N6MKYE ","M68N6MKZE ","M68N6MMXE ","M68N6MMYE ", & + "M68N6MMZE ","M68N6RAXE ","M68N6RAYE ","M68N6RAZE ","M68N6RDXE ","M68N6RDYE ","M68N6RDZE ", & + "M68N6TAXE ","M68N6TAYE ","M68N6TAZE ","M68N6TDXSS","M68N6TDYSS","M68N6TDZSS","M68N7FKXE ", & + "M68N7FKYE ","M68N7FKZE ","M68N7FMXE ","M68N7FMYE ","M68N7FMZE ","M68N7MKXE ","M68N7MKYE ", & + "M68N7MKZE ","M68N7MMXE ","M68N7MMYE ","M68N7MMZE ","M68N7RAXE ","M68N7RAYE ","M68N7RAZE ", & + "M68N7RDXE ","M68N7RDYE ","M68N7RDZE ","M68N7TAXE ","M68N7TAYE ","M68N7TAZE ","M68N7TDXSS", & + "M68N7TDYSS","M68N7TDZSS","M68N8FKXE ","M68N8FKYE ","M68N8FKZE ","M68N8FMXE ","M68N8FMYE ", & + "M68N8FMZE ","M68N8MKXE ","M68N8MKYE ","M68N8MKZE ","M68N8MMXE ","M68N8MMYE ","M68N8MMZE ", & + "M68N8RAXE ","M68N8RAYE ","M68N8RAZE ","M68N8RDXE ","M68N8RDYE ","M68N8RDZE ","M68N8TAXE ", & + "M68N8TAYE ","M68N8TAZE ","M68N8TDXSS","M68N8TDYSS","M68N8TDZSS","M68N9FKXE ","M68N9FKYE ", & + "M68N9FKZE ","M68N9FMXE ","M68N9FMYE ","M68N9FMZE ","M68N9MKXE ","M68N9MKYE ","M68N9MKZE ", & + "M68N9MMXE ","M68N9MMYE ","M68N9MMZE ","M68N9RAXE ","M68N9RAYE ","M68N9RAZE ","M68N9RDXE ", & + "M68N9RDYE ","M68N9RDZE ","M68N9TAXE ","M68N9TAYE ","M68N9TAZE ","M68N9TDXSS","M68N9TDYSS", & + "M68N9TDZSS","M69N1FKXE ","M69N1FKYE ","M69N1FKZE ","M69N1FMXE ","M69N1FMYE ","M69N1FMZE ", & + "M69N1MKXE ","M69N1MKYE ","M69N1MKZE ","M69N1MMXE ","M69N1MMYE ","M69N1MMZE ","M69N1RAXE ", & + "M69N1RAYE ","M69N1RAZE ","M69N1RDXE ","M69N1RDYE ","M69N1RDZE ","M69N1TAXE ","M69N1TAYE ", & + "M69N1TAZE ","M69N1TDXSS","M69N1TDYSS","M69N1TDZSS","M69N2FKXE ","M69N2FKYE ","M69N2FKZE ", & + "M69N2FMXE ","M69N2FMYE ","M69N2FMZE ","M69N2MKXE ","M69N2MKYE ","M69N2MKZE ","M69N2MMXE ", & + "M69N2MMYE ","M69N2MMZE ","M69N2RAXE ","M69N2RAYE ","M69N2RAZE ","M69N2RDXE ","M69N2RDYE ", & + "M69N2RDZE ","M69N2TAXE ","M69N2TAYE ","M69N2TAZE ","M69N2TDXSS","M69N2TDYSS","M69N2TDZSS", & + "M69N3FKXE ","M69N3FKYE ","M69N3FKZE ","M69N3FMXE ","M69N3FMYE ","M69N3FMZE ","M69N3MKXE ", & + "M69N3MKYE ","M69N3MKZE ","M69N3MMXE ","M69N3MMYE ","M69N3MMZE ","M69N3RAXE ","M69N3RAYE ", & + "M69N3RAZE ","M69N3RDXE ","M69N3RDYE ","M69N3RDZE ","M69N3TAXE ","M69N3TAYE ","M69N3TAZE ", & + "M69N3TDXSS","M69N3TDYSS","M69N3TDZSS","M69N4FKXE ","M69N4FKYE ","M69N4FKZE ","M69N4FMXE ", & + "M69N4FMYE ","M69N4FMZE ","M69N4MKXE ","M69N4MKYE ","M69N4MKZE ","M69N4MMXE ","M69N4MMYE ", & + "M69N4MMZE ","M69N4RAXE ","M69N4RAYE ","M69N4RAZE ","M69N4RDXE ","M69N4RDYE ","M69N4RDZE ", & + "M69N4TAXE ","M69N4TAYE ","M69N4TAZE ","M69N4TDXSS","M69N4TDYSS","M69N4TDZSS","M69N5FKXE ", & + "M69N5FKYE ","M69N5FKZE ","M69N5FMXE ","M69N5FMYE ","M69N5FMZE ","M69N5MKXE ","M69N5MKYE ", & + "M69N5MKZE ","M69N5MMXE ","M69N5MMYE ","M69N5MMZE ","M69N5RAXE ","M69N5RAYE ","M69N5RAZE ", & + "M69N5RDXE ","M69N5RDYE ","M69N5RDZE ","M69N5TAXE ","M69N5TAYE ","M69N5TAZE ","M69N5TDXSS", & + "M69N5TDYSS","M69N5TDZSS","M69N6FKXE ","M69N6FKYE ","M69N6FKZE ","M69N6FMXE ","M69N6FMYE ", & + "M69N6FMZE ","M69N6MKXE ","M69N6MKYE ","M69N6MKZE ","M69N6MMXE ","M69N6MMYE ","M69N6MMZE ", & + "M69N6RAXE ","M69N6RAYE ","M69N6RAZE ","M69N6RDXE ","M69N6RDYE ","M69N6RDZE ","M69N6TAXE ", & + "M69N6TAYE ","M69N6TAZE ","M69N6TDXSS","M69N6TDYSS","M69N6TDZSS","M69N7FKXE ","M69N7FKYE ", & + "M69N7FKZE ","M69N7FMXE ","M69N7FMYE ","M69N7FMZE ","M69N7MKXE ","M69N7MKYE ","M69N7MKZE ", & + "M69N7MMXE ","M69N7MMYE ","M69N7MMZE ","M69N7RAXE ","M69N7RAYE ","M69N7RAZE ","M69N7RDXE ", & + "M69N7RDYE ","M69N7RDZE ","M69N7TAXE ","M69N7TAYE ","M69N7TAZE ","M69N7TDXSS","M69N7TDYSS", & + "M69N7TDZSS","M69N8FKXE ","M69N8FKYE ","M69N8FKZE ","M69N8FMXE ","M69N8FMYE ","M69N8FMZE ", & + "M69N8MKXE ","M69N8MKYE ","M69N8MKZE ","M69N8MMXE ","M69N8MMYE ","M69N8MMZE ","M69N8RAXE ", & + "M69N8RAYE ","M69N8RAZE ","M69N8RDXE ","M69N8RDYE ","M69N8RDZE ","M69N8TAXE ","M69N8TAYE ", & + "M69N8TAZE ","M69N8TDXSS","M69N8TDYSS","M69N8TDZSS","M69N9FKXE ","M69N9FKYE ","M69N9FKZE ", & + "M69N9FMXE ","M69N9FMYE ","M69N9FMZE ","M69N9MKXE ","M69N9MKYE ","M69N9MKZE ","M69N9MMXE ", & + "M69N9MMYE ","M69N9MMZE ","M69N9RAXE ","M69N9RAYE ","M69N9RAZE ","M69N9RDXE ","M69N9RDYE ", & + "M69N9RDZE ","M69N9TAXE ","M69N9TAYE ","M69N9TAZE ","M69N9TDXSS","M69N9TDYSS","M69N9TDZSS", & + "M70N1FKXE ","M70N1FKYE ","M70N1FKZE ","M70N1FMXE ","M70N1FMYE ","M70N1FMZE ","M70N1MKXE ", & + "M70N1MKYE ","M70N1MKZE ","M70N1MMXE ","M70N1MMYE ","M70N1MMZE ","M70N1RAXE ","M70N1RAYE ", & + "M70N1RAZE ","M70N1RDXE ","M70N1RDYE ","M70N1RDZE ","M70N1TAXE ","M70N1TAYE ","M70N1TAZE ", & + "M70N1TDXSS","M70N1TDYSS","M70N1TDZSS","M70N2FKXE ","M70N2FKYE ","M70N2FKZE ","M70N2FMXE ", & + "M70N2FMYE ","M70N2FMZE ","M70N2MKXE ","M70N2MKYE ","M70N2MKZE ","M70N2MMXE ","M70N2MMYE ", & + "M70N2MMZE ","M70N2RAXE ","M70N2RAYE ","M70N2RAZE ","M70N2RDXE ","M70N2RDYE ","M70N2RDZE ", & + "M70N2TAXE ","M70N2TAYE ","M70N2TAZE ","M70N2TDXSS","M70N2TDYSS","M70N2TDZSS","M70N3FKXE ", & + "M70N3FKYE ","M70N3FKZE ","M70N3FMXE ","M70N3FMYE ","M70N3FMZE ","M70N3MKXE ","M70N3MKYE ", & + "M70N3MKZE ","M70N3MMXE ","M70N3MMYE ","M70N3MMZE ","M70N3RAXE ","M70N3RAYE ","M70N3RAZE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry10(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M70N3RDXE ","M70N3RDYE ","M70N3RDZE ","M70N3TAXE ","M70N3TAYE ","M70N3TAZE ","M70N3TDXSS", & + "M70N3TDYSS","M70N3TDZSS","M70N4FKXE ","M70N4FKYE ","M70N4FKZE ","M70N4FMXE ","M70N4FMYE ", & + "M70N4FMZE ","M70N4MKXE ","M70N4MKYE ","M70N4MKZE ","M70N4MMXE ","M70N4MMYE ","M70N4MMZE ", & + "M70N4RAXE ","M70N4RAYE ","M70N4RAZE ","M70N4RDXE ","M70N4RDYE ","M70N4RDZE ","M70N4TAXE ", & + "M70N4TAYE ","M70N4TAZE ","M70N4TDXSS","M70N4TDYSS","M70N4TDZSS","M70N5FKXE ","M70N5FKYE ", & + "M70N5FKZE ","M70N5FMXE ","M70N5FMYE ","M70N5FMZE ","M70N5MKXE ","M70N5MKYE ","M70N5MKZE ", & + "M70N5MMXE ","M70N5MMYE ","M70N5MMZE ","M70N5RAXE ","M70N5RAYE ","M70N5RAZE ","M70N5RDXE ", & + "M70N5RDYE ","M70N5RDZE ","M70N5TAXE ","M70N5TAYE ","M70N5TAZE ","M70N5TDXSS","M70N5TDYSS", & + "M70N5TDZSS","M70N6FKXE ","M70N6FKYE ","M70N6FKZE ","M70N6FMXE ","M70N6FMYE ","M70N6FMZE ", & + "M70N6MKXE ","M70N6MKYE ","M70N6MKZE ","M70N6MMXE ","M70N6MMYE ","M70N6MMZE ","M70N6RAXE ", & + "M70N6RAYE ","M70N6RAZE ","M70N6RDXE ","M70N6RDYE ","M70N6RDZE ","M70N6TAXE ","M70N6TAYE ", & + "M70N6TAZE ","M70N6TDXSS","M70N6TDYSS","M70N6TDZSS","M70N7FKXE ","M70N7FKYE ","M70N7FKZE ", & + "M70N7FMXE ","M70N7FMYE ","M70N7FMZE ","M70N7MKXE ","M70N7MKYE ","M70N7MKZE ","M70N7MMXE ", & + "M70N7MMYE ","M70N7MMZE ","M70N7RAXE ","M70N7RAYE ","M70N7RAZE ","M70N7RDXE ","M70N7RDYE ", & + "M70N7RDZE ","M70N7TAXE ","M70N7TAYE ","M70N7TAZE ","M70N7TDXSS","M70N7TDYSS","M70N7TDZSS", & + "M70N8FKXE ","M70N8FKYE ","M70N8FKZE ","M70N8FMXE ","M70N8FMYE ","M70N8FMZE ","M70N8MKXE ", & + "M70N8MKYE ","M70N8MKZE ","M70N8MMXE ","M70N8MMYE ","M70N8MMZE ","M70N8RAXE ","M70N8RAYE ", & + "M70N8RAZE ","M70N8RDXE ","M70N8RDYE ","M70N8RDZE ","M70N8TAXE ","M70N8TAYE ","M70N8TAZE ", & + "M70N8TDXSS","M70N8TDYSS","M70N8TDZSS","M70N9FKXE ","M70N9FKYE ","M70N9FKZE ","M70N9FMXE ", & + "M70N9FMYE ","M70N9FMZE ","M70N9MKXE ","M70N9MKYE ","M70N9MKZE ","M70N9MMXE ","M70N9MMYE ", & + "M70N9MMZE ","M70N9RAXE ","M70N9RAYE ","M70N9RAZE ","M70N9RDXE ","M70N9RDYE ","M70N9RDZE ", & + "M70N9TAXE ","M70N9TAYE ","M70N9TAZE ","M70N9TDXSS","M70N9TDYSS","M70N9TDZSS","M71N1FKXE ", & + "M71N1FKYE ","M71N1FKZE ","M71N1FMXE ","M71N1FMYE ","M71N1FMZE ","M71N1MKXE ","M71N1MKYE ", & + "M71N1MKZE ","M71N1MMXE ","M71N1MMYE ","M71N1MMZE ","M71N1RAXE ","M71N1RAYE ","M71N1RAZE ", & + "M71N1RDXE ","M71N1RDYE ","M71N1RDZE ","M71N1TAXE ","M71N1TAYE ","M71N1TAZE ","M71N1TDXSS", & + "M71N1TDYSS","M71N1TDZSS","M71N2FKXE ","M71N2FKYE ","M71N2FKZE ","M71N2FMXE ","M71N2FMYE ", & + "M71N2FMZE ","M71N2MKXE ","M71N2MKYE ","M71N2MKZE ","M71N2MMXE ","M71N2MMYE ","M71N2MMZE ", & + "M71N2RAXE ","M71N2RAYE ","M71N2RAZE ","M71N2RDXE ","M71N2RDYE ","M71N2RDZE ","M71N2TAXE ", & + "M71N2TAYE ","M71N2TAZE ","M71N2TDXSS","M71N2TDYSS","M71N2TDZSS","M71N3FKXE ","M71N3FKYE ", & + "M71N3FKZE ","M71N3FMXE ","M71N3FMYE ","M71N3FMZE ","M71N3MKXE ","M71N3MKYE ","M71N3MKZE ", & + "M71N3MMXE ","M71N3MMYE ","M71N3MMZE ","M71N3RAXE ","M71N3RAYE ","M71N3RAZE ","M71N3RDXE ", & + "M71N3RDYE ","M71N3RDZE ","M71N3TAXE ","M71N3TAYE ","M71N3TAZE ","M71N3TDXSS","M71N3TDYSS", & + "M71N3TDZSS","M71N4FKXE ","M71N4FKYE ","M71N4FKZE ","M71N4FMXE ","M71N4FMYE ","M71N4FMZE ", & + "M71N4MKXE ","M71N4MKYE ","M71N4MKZE ","M71N4MMXE ","M71N4MMYE ","M71N4MMZE ","M71N4RAXE ", & + "M71N4RAYE ","M71N4RAZE ","M71N4RDXE ","M71N4RDYE ","M71N4RDZE ","M71N4TAXE ","M71N4TAYE ", & + "M71N4TAZE ","M71N4TDXSS","M71N4TDYSS","M71N4TDZSS","M71N5FKXE ","M71N5FKYE ","M71N5FKZE ", & + "M71N5FMXE ","M71N5FMYE ","M71N5FMZE ","M71N5MKXE ","M71N5MKYE ","M71N5MKZE ","M71N5MMXE ", & + "M71N5MMYE ","M71N5MMZE ","M71N5RAXE ","M71N5RAYE ","M71N5RAZE ","M71N5RDXE ","M71N5RDYE ", & + "M71N5RDZE ","M71N5TAXE ","M71N5TAYE ","M71N5TAZE ","M71N5TDXSS","M71N5TDYSS","M71N5TDZSS", & + "M71N6FKXE ","M71N6FKYE ","M71N6FKZE ","M71N6FMXE ","M71N6FMYE ","M71N6FMZE ","M71N6MKXE ", & + "M71N6MKYE ","M71N6MKZE ","M71N6MMXE ","M71N6MMYE ","M71N6MMZE ","M71N6RAXE ","M71N6RAYE ", & + "M71N6RAZE ","M71N6RDXE ","M71N6RDYE ","M71N6RDZE ","M71N6TAXE ","M71N6TAYE ","M71N6TAZE ", & + "M71N6TDXSS","M71N6TDYSS","M71N6TDZSS","M71N7FKXE ","M71N7FKYE ","M71N7FKZE ","M71N7FMXE ", & + "M71N7FMYE ","M71N7FMZE ","M71N7MKXE ","M71N7MKYE ","M71N7MKZE ","M71N7MMXE ","M71N7MMYE ", & + "M71N7MMZE ","M71N7RAXE ","M71N7RAYE ","M71N7RAZE ","M71N7RDXE ","M71N7RDYE ","M71N7RDZE ", & + "M71N7TAXE ","M71N7TAYE ","M71N7TAZE ","M71N7TDXSS","M71N7TDYSS","M71N7TDZSS","M71N8FKXE ", & + "M71N8FKYE ","M71N8FKZE ","M71N8FMXE ","M71N8FMYE ","M71N8FMZE ","M71N8MKXE ","M71N8MKYE ", & + "M71N8MKZE ","M71N8MMXE ","M71N8MMYE ","M71N8MMZE ","M71N8RAXE ","M71N8RAYE ","M71N8RAZE ", & + "M71N8RDXE ","M71N8RDYE ","M71N8RDZE ","M71N8TAXE ","M71N8TAYE ","M71N8TAZE ","M71N8TDXSS", & + "M71N8TDYSS","M71N8TDZSS","M71N9FKXE ","M71N9FKYE ","M71N9FKZE ","M71N9FMXE ","M71N9FMYE ", & + "M71N9FMZE ","M71N9MKXE ","M71N9MKYE ","M71N9MKZE ","M71N9MMXE ","M71N9MMYE ","M71N9MMZE ", & + "M71N9RAXE ","M71N9RAYE ","M71N9RAZE ","M71N9RDXE ","M71N9RDYE ","M71N9RDZE ","M71N9TAXE ", & + "M71N9TAYE ","M71N9TAZE ","M71N9TDXSS","M71N9TDYSS","M71N9TDZSS","M72N1FKXE ","M72N1FKYE ", & + "M72N1FKZE ","M72N1FMXE ","M72N1FMYE ","M72N1FMZE ","M72N1MKXE ","M72N1MKYE ","M72N1MKZE ", & + "M72N1MMXE ","M72N1MMYE ","M72N1MMZE ","M72N1RAXE ","M72N1RAYE ","M72N1RAZE ","M72N1RDXE ", & + "M72N1RDYE ","M72N1RDZE ","M72N1TAXE ","M72N1TAYE ","M72N1TAZE ","M72N1TDXSS","M72N1TDYSS", & + "M72N1TDZSS","M72N2FKXE ","M72N2FKYE ","M72N2FKZE ","M72N2FMXE ","M72N2FMYE ","M72N2FMZE ", & + "M72N2MKXE ","M72N2MKYE ","M72N2MKZE ","M72N2MMXE ","M72N2MMYE ","M72N2MMZE ","M72N2RAXE ", & + "M72N2RAYE ","M72N2RAZE ","M72N2RDXE ","M72N2RDYE ","M72N2RDZE ","M72N2TAXE ","M72N2TAYE ", & + "M72N2TAZE ","M72N2TDXSS","M72N2TDYSS","M72N2TDZSS","M72N3FKXE ","M72N3FKYE ","M72N3FKZE ", & + "M72N3FMXE ","M72N3FMYE ","M72N3FMZE ","M72N3MKXE ","M72N3MKYE ","M72N3MKZE ","M72N3MMXE ", & + "M72N3MMYE ","M72N3MMZE ","M72N3RAXE ","M72N3RAYE ","M72N3RAZE ","M72N3RDXE ","M72N3RDYE ", & + "M72N3RDZE ","M72N3TAXE ","M72N3TAYE ","M72N3TAZE ","M72N3TDXSS","M72N3TDYSS","M72N3TDZSS", & + "M72N4FKXE ","M72N4FKYE ","M72N4FKZE ","M72N4FMXE ","M72N4FMYE ","M72N4FMZE ","M72N4MKXE ", & + "M72N4MKYE ","M72N4MKZE ","M72N4MMXE ","M72N4MMYE ","M72N4MMZE ","M72N4RAXE ","M72N4RAYE ", & + "M72N4RAZE ","M72N4RDXE ","M72N4RDYE ","M72N4RDZE ","M72N4TAXE ","M72N4TAYE ","M72N4TAZE ", & + "M72N4TDXSS","M72N4TDYSS","M72N4TDZSS","M72N5FKXE ","M72N5FKYE ","M72N5FKZE ","M72N5FMXE ", & + "M72N5FMYE ","M72N5FMZE ","M72N5MKXE ","M72N5MKYE ","M72N5MKZE ","M72N5MMXE ","M72N5MMYE ", & + "M72N5MMZE ","M72N5RAXE ","M72N5RAYE ","M72N5RAZE ","M72N5RDXE ","M72N5RDYE ","M72N5RDZE ", & + "M72N5TAXE ","M72N5TAYE ","M72N5TAZE ","M72N5TDXSS","M72N5TDYSS","M72N5TDZSS","M72N6FKXE ", & + "M72N6FKYE ","M72N6FKZE ","M72N6FMXE ","M72N6FMYE ","M72N6FMZE ","M72N6MKXE ","M72N6MKYE ", & + "M72N6MKZE ","M72N6MMXE ","M72N6MMYE ","M72N6MMZE ","M72N6RAXE ","M72N6RAYE ","M72N6RAZE ", & + "M72N6RDXE ","M72N6RDYE ","M72N6RDZE ","M72N6TAXE ","M72N6TAYE ","M72N6TAZE ","M72N6TDXSS", & + "M72N6TDYSS","M72N6TDZSS","M72N7FKXE ","M72N7FKYE ","M72N7FKZE ","M72N7FMXE ","M72N7FMYE ", & + "M72N7FMZE ","M72N7MKXE ","M72N7MKYE ","M72N7MKZE ","M72N7MMXE ","M72N7MMYE ","M72N7MMZE ", & + "M72N7RAXE ","M72N7RAYE ","M72N7RAZE ","M72N7RDXE ","M72N7RDYE ","M72N7RDZE ","M72N7TAXE ", & + "M72N7TAYE ","M72N7TAZE ","M72N7TDXSS","M72N7TDYSS","M72N7TDZSS","M72N8FKXE ","M72N8FKYE ", & + "M72N8FKZE ","M72N8FMXE ","M72N8FMYE ","M72N8FMZE ","M72N8MKXE ","M72N8MKYE ","M72N8MKZE ", & + "M72N8MMXE ","M72N8MMYE ","M72N8MMZE ","M72N8RAXE ","M72N8RAYE ","M72N8RAZE ","M72N8RDXE ", & + "M72N8RDYE ","M72N8RDZE ","M72N8TAXE ","M72N8TAYE ","M72N8TAZE ","M72N8TDXSS","M72N8TDYSS", & + "M72N8TDZSS","M72N9FKXE ","M72N9FKYE ","M72N9FKZE ","M72N9FMXE ","M72N9FMYE ","M72N9FMZE ", & + "M72N9MKXE ","M72N9MKYE ","M72N9MKZE ","M72N9MMXE ","M72N9MMYE ","M72N9MMZE ","M72N9RAXE ", & + "M72N9RAYE ","M72N9RAZE ","M72N9RDXE ","M72N9RDYE ","M72N9RDZE ","M72N9TAXE ","M72N9TAYE ", & + "M72N9TAZE ","M72N9TDXSS","M72N9TDYSS","M72N9TDZSS","M73N1FKXE ","M73N1FKYE ","M73N1FKZE ", & + "M73N1FMXE ","M73N1FMYE ","M73N1FMZE ","M73N1MKXE ","M73N1MKYE ","M73N1MKZE ","M73N1MMXE ", & + "M73N1MMYE ","M73N1MMZE ","M73N1RAXE ","M73N1RAYE ","M73N1RAZE ","M73N1RDXE ","M73N1RDYE ", & + "M73N1RDZE ","M73N1TAXE ","M73N1TAYE ","M73N1TAZE ","M73N1TDXSS","M73N1TDYSS","M73N1TDZSS", & + "M73N2FKXE ","M73N2FKYE ","M73N2FKZE ","M73N2FMXE ","M73N2FMYE ","M73N2FMZE ","M73N2MKXE ", & + "M73N2MKYE ","M73N2MKZE ","M73N2MMXE ","M73N2MMYE ","M73N2MMZE ","M73N2RAXE ","M73N2RAYE ", & + "M73N2RAZE ","M73N2RDXE ","M73N2RDYE ","M73N2RDZE ","M73N2TAXE ","M73N2TAYE ","M73N2TAZE ", & + "M73N2TDXSS","M73N2TDYSS","M73N2TDZSS","M73N3FKXE ","M73N3FKYE ","M73N3FKZE ","M73N3FMXE ", & + "M73N3FMYE ","M73N3FMZE ","M73N3MKXE ","M73N3MKYE ","M73N3MKZE ","M73N3MMXE ","M73N3MMYE ", & + "M73N3MMZE ","M73N3RAXE ","M73N3RAYE ","M73N3RAZE ","M73N3RDXE ","M73N3RDYE ","M73N3RDZE ", & + "M73N3TAXE ","M73N3TAYE ","M73N3TAZE ","M73N3TDXSS","M73N3TDYSS","M73N3TDZSS","M73N4FKXE ", & + "M73N4FKYE ","M73N4FKZE ","M73N4FMXE ","M73N4FMYE ","M73N4FMZE ","M73N4MKXE ","M73N4MKYE ", & + "M73N4MKZE ","M73N4MMXE ","M73N4MMYE ","M73N4MMZE ","M73N4RAXE ","M73N4RAYE ","M73N4RAZE ", & + "M73N4RDXE ","M73N4RDYE ","M73N4RDZE ","M73N4TAXE ","M73N4TAYE ","M73N4TAZE ","M73N4TDXSS", & + "M73N4TDYSS","M73N4TDZSS","M73N5FKXE ","M73N5FKYE ","M73N5FKZE ","M73N5FMXE ","M73N5FMYE ", & + "M73N5FMZE ","M73N5MKXE ","M73N5MKYE ","M73N5MKZE ","M73N5MMXE ","M73N5MMYE ","M73N5MMZE ", & + "M73N5RAXE ","M73N5RAYE ","M73N5RAZE ","M73N5RDXE ","M73N5RDYE ","M73N5RDZE ","M73N5TAXE ", & + "M73N5TAYE ","M73N5TAZE ","M73N5TDXSS","M73N5TDYSS","M73N5TDZSS","M73N6FKXE ","M73N6FKYE ", & + "M73N6FKZE ","M73N6FMXE ","M73N6FMYE ","M73N6FMZE ","M73N6MKXE ","M73N6MKYE ","M73N6MKZE ", & + "M73N6MMXE ","M73N6MMYE ","M73N6MMZE ","M73N6RAXE ","M73N6RAYE ","M73N6RAZE ","M73N6RDXE ", & + "M73N6RDYE ","M73N6RDZE ","M73N6TAXE ","M73N6TAYE ","M73N6TAZE ","M73N6TDXSS","M73N6TDYSS", & + "M73N6TDZSS","M73N7FKXE ","M73N7FKYE ","M73N7FKZE ","M73N7FMXE ","M73N7FMYE ","M73N7FMZE ", & + "M73N7MKXE ","M73N7MKYE ","M73N7MKZE ","M73N7MMXE ","M73N7MMYE ","M73N7MMZE ","M73N7RAXE ", & + "M73N7RAYE ","M73N7RAZE ","M73N7RDXE ","M73N7RDYE ","M73N7RDZE ","M73N7TAXE ","M73N7TAYE ", & + "M73N7TAZE ","M73N7TDXSS","M73N7TDYSS","M73N7TDZSS","M73N8FKXE ","M73N8FKYE ","M73N8FKZE ", & + "M73N8FMXE ","M73N8FMYE ","M73N8FMZE ","M73N8MKXE ","M73N8MKYE ","M73N8MKZE ","M73N8MMXE ", & + "M73N8MMYE ","M73N8MMZE ","M73N8RAXE ","M73N8RAYE ","M73N8RAZE ","M73N8RDXE ","M73N8RDYE ", & + "M73N8RDZE ","M73N8TAXE ","M73N8TAYE ","M73N8TAZE ","M73N8TDXSS","M73N8TDYSS","M73N8TDZSS", & + "M73N9FKXE ","M73N9FKYE ","M73N9FKZE ","M73N9FMXE ","M73N9FMYE ","M73N9FMZE ","M73N9MKXE ", & + "M73N9MKYE ","M73N9MKZE ","M73N9MMXE ","M73N9MMYE ","M73N9MMZE ","M73N9RAXE ","M73N9RAYE ", & + "M73N9RAZE ","M73N9RDXE ","M73N9RDYE ","M73N9RDZE ","M73N9TAXE ","M73N9TAYE ","M73N9TAZE ", & + "M73N9TDXSS","M73N9TDYSS","M73N9TDZSS","M74N1FKXE ","M74N1FKYE ","M74N1FKZE ","M74N1FMXE ", & + "M74N1FMYE ","M74N1FMZE ","M74N1MKXE ","M74N1MKYE ","M74N1MKZE ","M74N1MMXE ","M74N1MMYE ", & + "M74N1MMZE ","M74N1RAXE ","M74N1RAYE ","M74N1RAZE ","M74N1RDXE ","M74N1RDYE ","M74N1RDZE ", & + "M74N1TAXE ","M74N1TAYE ","M74N1TAZE ","M74N1TDXSS","M74N1TDYSS","M74N1TDZSS","M74N2FKXE ", & + "M74N2FKYE ","M74N2FKZE ","M74N2FMXE ","M74N2FMYE ","M74N2FMZE ","M74N2MKXE ","M74N2MKYE ", & + "M74N2MKZE ","M74N2MMXE ","M74N2MMYE ","M74N2MMZE ","M74N2RAXE ","M74N2RAYE ","M74N2RAZE ", & + "M74N2RDXE ","M74N2RDYE ","M74N2RDZE ","M74N2TAXE ","M74N2TAYE ","M74N2TAZE ","M74N2TDXSS", & + "M74N2TDYSS","M74N2TDZSS","M74N3FKXE ","M74N3FKYE ","M74N3FKZE ","M74N3FMXE ","M74N3FMYE ", & + "M74N3FMZE ","M74N3MKXE ","M74N3MKYE ","M74N3MKZE ","M74N3MMXE ","M74N3MMYE ","M74N3MMZE ", & + "M74N3RAXE ","M74N3RAYE ","M74N3RAZE ","M74N3RDXE ","M74N3RDYE ","M74N3RDZE ","M74N3TAXE ", & + "M74N3TAYE ","M74N3TAZE ","M74N3TDXSS","M74N3TDYSS","M74N3TDZSS","M74N4FKXE ","M74N4FKYE ", & + "M74N4FKZE ","M74N4FMXE ","M74N4FMYE ","M74N4FMZE ","M74N4MKXE ","M74N4MKYE ","M74N4MKZE ", & + "M74N4MMXE ","M74N4MMYE ","M74N4MMZE ","M74N4RAXE ","M74N4RAYE ","M74N4RAZE ","M74N4RDXE ", & + "M74N4RDYE ","M74N4RDZE ","M74N4TAXE ","M74N4TAYE ","M74N4TAZE ","M74N4TDXSS","M74N4TDYSS", & + "M74N4TDZSS","M74N5FKXE ","M74N5FKYE ","M74N5FKZE ","M74N5FMXE ","M74N5FMYE ","M74N5FMZE ", & + "M74N5MKXE ","M74N5MKYE ","M74N5MKZE ","M74N5MMXE ","M74N5MMYE ","M74N5MMZE ","M74N5RAXE ", & + "M74N5RAYE ","M74N5RAZE ","M74N5RDXE ","M74N5RDYE ","M74N5RDZE ","M74N5TAXE ","M74N5TAYE ", & + "M74N5TAZE ","M74N5TDXSS","M74N5TDYSS","M74N5TDZSS","M74N6FKXE ","M74N6FKYE ","M74N6FKZE ", & + "M74N6FMXE ","M74N6FMYE ","M74N6FMZE ","M74N6MKXE ","M74N6MKYE ","M74N6MKZE ","M74N6MMXE ", & + "M74N6MMYE ","M74N6MMZE ","M74N6RAXE ","M74N6RAYE ","M74N6RAZE ","M74N6RDXE ","M74N6RDYE ", & + "M74N6RDZE ","M74N6TAXE ","M74N6TAYE ","M74N6TAZE ","M74N6TDXSS","M74N6TDYSS","M74N6TDZSS", & + "M74N7FKXE ","M74N7FKYE ","M74N7FKZE ","M74N7FMXE ","M74N7FMYE ","M74N7FMZE ","M74N7MKXE ", & + "M74N7MKYE ","M74N7MKZE ","M74N7MMXE ","M74N7MMYE ","M74N7MMZE ","M74N7RAXE ","M74N7RAYE ", & + "M74N7RAZE ","M74N7RDXE ","M74N7RDYE ","M74N7RDZE ","M74N7TAXE ","M74N7TAYE ","M74N7TAZE ", & + "M74N7TDXSS","M74N7TDYSS","M74N7TDZSS","M74N8FKXE ","M74N8FKYE ","M74N8FKZE ","M74N8FMXE ", & + "M74N8FMYE ","M74N8FMZE ","M74N8MKXE ","M74N8MKYE ","M74N8MKZE ","M74N8MMXE ","M74N8MMYE ", & + "M74N8MMZE ","M74N8RAXE ","M74N8RAYE ","M74N8RAZE ","M74N8RDXE ","M74N8RDYE ","M74N8RDZE ", & + "M74N8TAXE ","M74N8TAYE ","M74N8TAZE ","M74N8TDXSS","M74N8TDYSS","M74N8TDZSS","M74N9FKXE ", & + "M74N9FKYE ","M74N9FKZE ","M74N9FMXE ","M74N9FMYE ","M74N9FMZE ","M74N9MKXE ","M74N9MKYE ", & + "M74N9MKZE ","M74N9MMXE ","M74N9MMYE ","M74N9MMZE ","M74N9RAXE ","M74N9RAYE ","M74N9RAZE ", & + "M74N9RDXE ","M74N9RDYE ","M74N9RDZE ","M74N9TAXE ","M74N9TAYE ","M74N9TAZE ","M74N9TDXSS", & + "M74N9TDYSS","M74N9TDZSS","M75N1FKXE ","M75N1FKYE ","M75N1FKZE ","M75N1FMXE ","M75N1FMYE ", & + "M75N1FMZE ","M75N1MKXE ","M75N1MKYE ","M75N1MKZE ","M75N1MMXE ","M75N1MMYE ","M75N1MMZE ", & + "M75N1RAXE ","M75N1RAYE ","M75N1RAZE ","M75N1RDXE ","M75N1RDYE ","M75N1RDZE ","M75N1TAXE ", & + "M75N1TAYE ","M75N1TAZE ","M75N1TDXSS","M75N1TDYSS","M75N1TDZSS","M75N2FKXE ","M75N2FKYE ", & + "M75N2FKZE ","M75N2FMXE ","M75N2FMYE ","M75N2FMZE ","M75N2MKXE ","M75N2MKYE ","M75N2MKZE ", & + "M75N2MMXE ","M75N2MMYE ","M75N2MMZE ","M75N2RAXE ","M75N2RAYE ","M75N2RAZE ","M75N2RDXE ", & + "M75N2RDYE ","M75N2RDZE ","M75N2TAXE ","M75N2TAYE ","M75N2TAZE ","M75N2TDXSS","M75N2TDYSS", & + "M75N2TDZSS","M75N3FKXE ","M75N3FKYE ","M75N3FKZE ","M75N3FMXE ","M75N3FMYE ","M75N3FMZE ", & + "M75N3MKXE ","M75N3MKYE ","M75N3MKZE ","M75N3MMXE ","M75N3MMYE ","M75N3MMZE ","M75N3RAXE ", & + "M75N3RAYE ","M75N3RAZE ","M75N3RDXE ","M75N3RDYE ","M75N3RDZE ","M75N3TAXE ","M75N3TAYE ", & + "M75N3TAZE ","M75N3TDXSS","M75N3TDYSS","M75N3TDZSS","M75N4FKXE ","M75N4FKYE ","M75N4FKZE ", & + "M75N4FMXE ","M75N4FMYE ","M75N4FMZE ","M75N4MKXE ","M75N4MKYE ","M75N4MKZE ","M75N4MMXE ", & + "M75N4MMYE ","M75N4MMZE ","M75N4RAXE ","M75N4RAYE ","M75N4RAZE ","M75N4RDXE ","M75N4RDYE ", & + "M75N4RDZE ","M75N4TAXE ","M75N4TAYE ","M75N4TAZE ","M75N4TDXSS","M75N4TDYSS","M75N4TDZSS", & + "M75N5FKXE ","M75N5FKYE ","M75N5FKZE ","M75N5FMXE ","M75N5FMYE ","M75N5FMZE ","M75N5MKXE ", & + "M75N5MKYE ","M75N5MKZE ","M75N5MMXE ","M75N5MMYE ","M75N5MMZE ","M75N5RAXE ","M75N5RAYE ", & + "M75N5RAZE ","M75N5RDXE ","M75N5RDYE ","M75N5RDZE ","M75N5TAXE ","M75N5TAYE ","M75N5TAZE ", & + "M75N5TDXSS","M75N5TDYSS","M75N5TDZSS","M75N6FKXE ","M75N6FKYE ","M75N6FKZE ","M75N6FMXE ", & + "M75N6FMYE ","M75N6FMZE ","M75N6MKXE ","M75N6MKYE ","M75N6MKZE ","M75N6MMXE ","M75N6MMYE ", & + "M75N6MMZE ","M75N6RAXE ","M75N6RAYE ","M75N6RAZE ","M75N6RDXE ","M75N6RDYE ","M75N6RDZE ", & + "M75N6TAXE ","M75N6TAYE ","M75N6TAZE ","M75N6TDXSS","M75N6TDYSS","M75N6TDZSS","M75N7FKXE ", & + "M75N7FKYE ","M75N7FKZE ","M75N7FMXE ","M75N7FMYE ","M75N7FMZE ","M75N7MKXE ","M75N7MKYE ", & + "M75N7MKZE ","M75N7MMXE ","M75N7MMYE ","M75N7MMZE ","M75N7RAXE ","M75N7RAYE ","M75N7RAZE ", & + "M75N7RDXE ","M75N7RDYE ","M75N7RDZE ","M75N7TAXE ","M75N7TAYE ","M75N7TAZE ","M75N7TDXSS", & + "M75N7TDYSS","M75N7TDZSS","M75N8FKXE ","M75N8FKYE ","M75N8FKZE ","M75N8FMXE ","M75N8FMYE ", & + "M75N8FMZE ","M75N8MKXE ","M75N8MKYE ","M75N8MKZE ","M75N8MMXE ","M75N8MMYE ","M75N8MMZE ", & + "M75N8RAXE ","M75N8RAYE ","M75N8RAZE ","M75N8RDXE ","M75N8RDYE ","M75N8RDZE ","M75N8TAXE ", & + "M75N8TAYE ","M75N8TAZE ","M75N8TDXSS","M75N8TDYSS","M75N8TDZSS","M75N9FKXE ","M75N9FKYE ", & + "M75N9FKZE ","M75N9FMXE ","M75N9FMYE ","M75N9FMZE ","M75N9MKXE ","M75N9MKYE ","M75N9MKZE ", & + "M75N9MMXE ","M75N9MMYE ","M75N9MMZE ","M75N9RAXE ","M75N9RAYE ","M75N9RAZE ","M75N9RDXE ", & + "M75N9RDYE ","M75N9RDZE ","M75N9TAXE ","M75N9TAYE ","M75N9TAZE ","M75N9TDXSS","M75N9TDYSS", & + "M75N9TDZSS","M76N1FKXE ","M76N1FKYE ","M76N1FKZE ","M76N1FMXE ","M76N1FMYE ","M76N1FMZE ", & + "M76N1MKXE ","M76N1MKYE ","M76N1MKZE ","M76N1MMXE ","M76N1MMYE ","M76N1MMZE ","M76N1RAXE ", & + "M76N1RAYE ","M76N1RAZE ","M76N1RDXE ","M76N1RDYE ","M76N1RDZE ","M76N1TAXE ","M76N1TAYE ", & + "M76N1TAZE ","M76N1TDXSS","M76N1TDYSS","M76N1TDZSS","M76N2FKXE ","M76N2FKYE ","M76N2FKZE ", & + "M76N2FMXE ","M76N2FMYE ","M76N2FMZE ","M76N2MKXE ","M76N2MKYE ","M76N2MKZE ","M76N2MMXE ", & + "M76N2MMYE ","M76N2MMZE ","M76N2RAXE ","M76N2RAYE ","M76N2RAZE ","M76N2RDXE ","M76N2RDYE ", & + "M76N2RDZE ","M76N2TAXE ","M76N2TAYE ","M76N2TAZE ","M76N2TDXSS","M76N2TDYSS","M76N2TDZSS", & + "M76N3FKXE ","M76N3FKYE ","M76N3FKZE ","M76N3FMXE ","M76N3FMYE ","M76N3FMZE ","M76N3MKXE ", & + "M76N3MKYE ","M76N3MKZE ","M76N3MMXE ","M76N3MMYE ","M76N3MMZE ","M76N3RAXE ","M76N3RAYE ", & + "M76N3RAZE ","M76N3RDXE ","M76N3RDYE ","M76N3RDZE ","M76N3TAXE ","M76N3TAYE ","M76N3TAZE ", & + "M76N3TDXSS","M76N3TDYSS","M76N3TDZSS","M76N4FKXE ","M76N4FKYE ","M76N4FKZE ","M76N4FMXE ", & + "M76N4FMYE ","M76N4FMZE ","M76N4MKXE ","M76N4MKYE ","M76N4MKZE ","M76N4MMXE ","M76N4MMYE ", & + "M76N4MMZE ","M76N4RAXE ","M76N4RAYE ","M76N4RAZE ","M76N4RDXE ","M76N4RDYE ","M76N4RDZE ", & + "M76N4TAXE ","M76N4TAYE ","M76N4TAZE ","M76N4TDXSS","M76N4TDYSS","M76N4TDZSS","M76N5FKXE ", & + "M76N5FKYE ","M76N5FKZE ","M76N5FMXE ","M76N5FMYE ","M76N5FMZE ","M76N5MKXE ","M76N5MKYE ", & + "M76N5MKZE ","M76N5MMXE ","M76N5MMYE ","M76N5MMZE ","M76N5RAXE ","M76N5RAYE ","M76N5RAZE ", & + "M76N5RDXE ","M76N5RDYE ","M76N5RDZE ","M76N5TAXE ","M76N5TAYE ","M76N5TAZE ","M76N5TDXSS", & + "M76N5TDYSS","M76N5TDZSS","M76N6FKXE ","M76N6FKYE ","M76N6FKZE ","M76N6FMXE ","M76N6FMYE ", & + "M76N6FMZE ","M76N6MKXE ","M76N6MKYE ","M76N6MKZE ","M76N6MMXE ","M76N6MMYE ","M76N6MMZE ", & + "M76N6RAXE ","M76N6RAYE ","M76N6RAZE ","M76N6RDXE ","M76N6RDYE ","M76N6RDZE ","M76N6TAXE ", & + "M76N6TAYE ","M76N6TAZE ","M76N6TDXSS","M76N6TDYSS","M76N6TDZSS","M76N7FKXE ","M76N7FKYE ", & + "M76N7FKZE ","M76N7FMXE ","M76N7FMYE ","M76N7FMZE ","M76N7MKXE ","M76N7MKYE ","M76N7MKZE ", & + "M76N7MMXE ","M76N7MMYE ","M76N7MMZE ","M76N7RAXE ","M76N7RAYE ","M76N7RAZE ","M76N7RDXE ", & + "M76N7RDYE ","M76N7RDZE ","M76N7TAXE ","M76N7TAYE ","M76N7TAZE ","M76N7TDXSS","M76N7TDYSS", & + "M76N7TDZSS","M76N8FKXE ","M76N8FKYE ","M76N8FKZE ","M76N8FMXE ","M76N8FMYE ","M76N8FMZE ", & + "M76N8MKXE ","M76N8MKYE ","M76N8MKZE ","M76N8MMXE ","M76N8MMYE ","M76N8MMZE ","M76N8RAXE ", & + "M76N8RAYE ","M76N8RAZE ","M76N8RDXE ","M76N8RDYE ","M76N8RDZE ","M76N8TAXE ","M76N8TAYE ", & + "M76N8TAZE ","M76N8TDXSS","M76N8TDYSS","M76N8TDZSS","M76N9FKXE ","M76N9FKYE ","M76N9FKZE ", & + "M76N9FMXE ","M76N9FMYE ","M76N9FMZE ","M76N9MKXE ","M76N9MKYE ","M76N9MKZE ","M76N9MMXE ", & + "M76N9MMYE ","M76N9MMZE ","M76N9RAXE ","M76N9RAYE ","M76N9RAZE ","M76N9RDXE ","M76N9RDYE ", & + "M76N9RDZE ","M76N9TAXE ","M76N9TAYE ","M76N9TAZE ","M76N9TDXSS","M76N9TDYSS","M76N9TDZSS", & + "M77N1FKXE ","M77N1FKYE ","M77N1FKZE ","M77N1FMXE ","M77N1FMYE ","M77N1FMZE ","M77N1MKXE ", & + "M77N1MKYE ","M77N1MKZE ","M77N1MMXE ","M77N1MMYE ","M77N1MMZE ","M77N1RAXE ","M77N1RAYE ", & + "M77N1RAZE ","M77N1RDXE ","M77N1RDYE ","M77N1RDZE ","M77N1TAXE ","M77N1TAYE ","M77N1TAZE ", & + "M77N1TDXSS","M77N1TDYSS","M77N1TDZSS","M77N2FKXE ","M77N2FKYE ","M77N2FKZE ","M77N2FMXE ", & + "M77N2FMYE ","M77N2FMZE ","M77N2MKXE ","M77N2MKYE ","M77N2MKZE ","M77N2MMXE ","M77N2MMYE ", & + "M77N2MMZE ","M77N2RAXE ","M77N2RAYE ","M77N2RAZE ","M77N2RDXE ","M77N2RDYE ","M77N2RDZE ", & + "M77N2TAXE ","M77N2TAYE ","M77N2TAZE ","M77N2TDXSS","M77N2TDYSS","M77N2TDZSS","M77N3FKXE ", & + "M77N3FKYE ","M77N3FKZE ","M77N3FMXE ","M77N3FMYE ","M77N3FMZE ","M77N3MKXE ","M77N3MKYE ", & + "M77N3MKZE ","M77N3MMXE ","M77N3MMYE ","M77N3MMZE ","M77N3RAXE ","M77N3RAYE ","M77N3RAZE ", & + "M77N3RDXE ","M77N3RDYE ","M77N3RDZE ","M77N3TAXE ","M77N3TAYE ","M77N3TAZE ","M77N3TDXSS", & + "M77N3TDYSS","M77N3TDZSS","M77N4FKXE ","M77N4FKYE ","M77N4FKZE ","M77N4FMXE ","M77N4FMYE ", & + "M77N4FMZE ","M77N4MKXE ","M77N4MKYE ","M77N4MKZE ","M77N4MMXE ","M77N4MMYE ","M77N4MMZE ", & + "M77N4RAXE ","M77N4RAYE ","M77N4RAZE ","M77N4RDXE ","M77N4RDYE ","M77N4RDZE ","M77N4TAXE ", & + "M77N4TAYE ","M77N4TAZE ","M77N4TDXSS","M77N4TDYSS","M77N4TDZSS","M77N5FKXE ","M77N5FKYE ", & + "M77N5FKZE ","M77N5FMXE ","M77N5FMYE ","M77N5FMZE ","M77N5MKXE ","M77N5MKYE ","M77N5MKZE ", & + "M77N5MMXE ","M77N5MMYE ","M77N5MMZE ","M77N5RAXE ","M77N5RAYE ","M77N5RAZE ","M77N5RDXE ", & + "M77N5RDYE ","M77N5RDZE ","M77N5TAXE ","M77N5TAYE ","M77N5TAZE ","M77N5TDXSS","M77N5TDYSS", & + "M77N5TDZSS","M77N6FKXE ","M77N6FKYE ","M77N6FKZE ","M77N6FMXE ","M77N6FMYE ","M77N6FMZE ", & + "M77N6MKXE ","M77N6MKYE ","M77N6MKZE ","M77N6MMXE ","M77N6MMYE ","M77N6MMZE ","M77N6RAXE ", & + "M77N6RAYE ","M77N6RAZE ","M77N6RDXE ","M77N6RDYE ","M77N6RDZE ","M77N6TAXE ","M77N6TAYE ", & + "M77N6TAZE ","M77N6TDXSS","M77N6TDYSS","M77N6TDZSS","M77N7FKXE ","M77N7FKYE ","M77N7FKZE ", & + "M77N7FMXE ","M77N7FMYE ","M77N7FMZE ","M77N7MKXE ","M77N7MKYE ","M77N7MKZE ","M77N7MMXE ", & + "M77N7MMYE ","M77N7MMZE ","M77N7RAXE ","M77N7RAYE ","M77N7RAZE ","M77N7RDXE ","M77N7RDYE ", & + "M77N7RDZE ","M77N7TAXE ","M77N7TAYE ","M77N7TAZE ","M77N7TDXSS","M77N7TDYSS","M77N7TDZSS", & + "M77N8FKXE ","M77N8FKYE ","M77N8FKZE ","M77N8FMXE ","M77N8FMYE ","M77N8FMZE ","M77N8MKXE ", & + "M77N8MKYE ","M77N8MKZE ","M77N8MMXE ","M77N8MMYE ","M77N8MMZE ","M77N8RAXE ","M77N8RAYE ", & + "M77N8RAZE ","M77N8RDXE ","M77N8RDYE ","M77N8RDZE ","M77N8TAXE ","M77N8TAYE ","M77N8TAZE ", & + "M77N8TDXSS","M77N8TDYSS","M77N8TDZSS","M77N9FKXE ","M77N9FKYE ","M77N9FKZE ","M77N9FMXE ", & + "M77N9FMYE ","M77N9FMZE ","M77N9MKXE ","M77N9MKYE ","M77N9MKZE ","M77N9MMXE ","M77N9MMYE ", & + "M77N9MMZE ","M77N9RAXE ","M77N9RAYE ","M77N9RAZE ","M77N9RDXE ","M77N9RDYE ","M77N9RDZE ", & + "M77N9TAXE ","M77N9TAYE ","M77N9TAZE ","M77N9TDXSS","M77N9TDYSS","M77N9TDZSS","M78N1FKXE ", & + "M78N1FKYE ","M78N1FKZE ","M78N1FMXE ","M78N1FMYE ","M78N1FMZE ","M78N1MKXE ","M78N1MKYE ", & + "M78N1MKZE ","M78N1MMXE ","M78N1MMYE ","M78N1MMZE ","M78N1RAXE ","M78N1RAYE ","M78N1RAZE ", & + "M78N1RDXE ","M78N1RDYE ","M78N1RDZE ","M78N1TAXE ","M78N1TAYE ","M78N1TAZE ","M78N1TDXSS"/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry11(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M78N1TDYSS","M78N1TDZSS","M78N2FKXE ","M78N2FKYE ","M78N2FKZE ","M78N2FMXE ","M78N2FMYE ", & + "M78N2FMZE ","M78N2MKXE ","M78N2MKYE ","M78N2MKZE ","M78N2MMXE ","M78N2MMYE ","M78N2MMZE ", & + "M78N2RAXE ","M78N2RAYE ","M78N2RAZE ","M78N2RDXE ","M78N2RDYE ","M78N2RDZE ","M78N2TAXE ", & + "M78N2TAYE ","M78N2TAZE ","M78N2TDXSS","M78N2TDYSS","M78N2TDZSS","M78N3FKXE ","M78N3FKYE ", & "M78N3FKZE ","M78N3FMXE ","M78N3FMYE ","M78N3FMZE ","M78N3MKXE ","M78N3MKYE ","M78N3MKZE ", & "M78N3MMXE ","M78N3MMYE ","M78N3MMZE ","M78N3RAXE ","M78N3RAYE ","M78N3RAZE ","M78N3RDXE ", & "M78N3RDYE ","M78N3RDZE ","M78N3TAXE ","M78N3TAYE ","M78N3TAZE ","M78N3TDXSS","M78N3TDYSS", & @@ -26210,6732 +26473,6786 @@ module SubDyn_Output_Params "M85N8FKYE ","M85N8FKZE ","M85N8FMXE ","M85N8FMYE ","M85N8FMZE ","M85N8MKXE ","M85N8MKYE ", & "M85N8MKZE ","M85N8MMXE ","M85N8MMYE ","M85N8MMZE ","M85N8RAXE ","M85N8RAYE ","M85N8RAZE ", & "M85N8RDXE ","M85N8RDYE ","M85N8RDZE ","M85N8TAXE ","M85N8TAYE ","M85N8TAZE ","M85N8TDXSS", & - "M85N8TDYSS","M85N8TDZSS","M85N9FKXE ","M85N9FKYE ","M85N9FKZE ","M85N9FMXE ","M85N9FMYE ", & + "M85N8TDYSS","M85N8TDZSS","M85N9FKXE ","M85N9FKYE ","M85N9FKZE ","M85N9FMXE ","M85N9FMYE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry12(1687) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically "M85N9FMZE ","M85N9MKXE ","M85N9MKYE ","M85N9MKZE ","M85N9MMXE ","M85N9MMYE ","M85N9MMZE ", & - "M85N9RAXE ","M85N9RAYE ","M85N9RAZE ","M85N9RDXE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry12(1670) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M85N9RDYE ","M85N9RDZE ","M85N9TAXE ","M85N9TAYE ","M85N9TAZE ","M85N9TDXSS","M85N9TDYSS", & - "M85N9TDZSS","M86N1FKXE ","M86N1FKYE ","M86N1FKZE ","M86N1FMXE ","M86N1FMYE ","M86N1FMZE ", & - "M86N1MKXE ","M86N1MKYE ","M86N1MKZE ","M86N1MMXE ","M86N1MMYE ","M86N1MMZE ","M86N1RAXE ", & - "M86N1RAYE ","M86N1RAZE ","M86N1RDXE ","M86N1RDYE ","M86N1RDZE ","M86N1TAXE ","M86N1TAYE ", & - "M86N1TAZE ","M86N1TDXSS","M86N1TDYSS","M86N1TDZSS","M86N2FKXE ","M86N2FKYE ","M86N2FKZE ", & - "M86N2FMXE ","M86N2FMYE ","M86N2FMZE ","M86N2MKXE ","M86N2MKYE ","M86N2MKZE ","M86N2MMXE ", & - "M86N2MMYE ","M86N2MMZE ","M86N2RAXE ","M86N2RAYE ","M86N2RAZE ","M86N2RDXE ","M86N2RDYE ", & - "M86N2RDZE ","M86N2TAXE ","M86N2TAYE ","M86N2TAZE ","M86N2TDXSS","M86N2TDYSS","M86N2TDZSS", & - "M86N3FKXE ","M86N3FKYE ","M86N3FKZE ","M86N3FMXE ","M86N3FMYE ","M86N3FMZE ","M86N3MKXE ", & - "M86N3MKYE ","M86N3MKZE ","M86N3MMXE ","M86N3MMYE ","M86N3MMZE ","M86N3RAXE ","M86N3RAYE ", & - "M86N3RAZE ","M86N3RDXE ","M86N3RDYE ","M86N3RDZE ","M86N3TAXE ","M86N3TAYE ","M86N3TAZE ", & - "M86N3TDXSS","M86N3TDYSS","M86N3TDZSS","M86N4FKXE ","M86N4FKYE ","M86N4FKZE ","M86N4FMXE ", & - "M86N4FMYE ","M86N4FMZE ","M86N4MKXE ","M86N4MKYE ","M86N4MKZE ","M86N4MMXE ","M86N4MMYE ", & - "M86N4MMZE ","M86N4RAXE ","M86N4RAYE ","M86N4RAZE ","M86N4RDXE ","M86N4RDYE ","M86N4RDZE ", & - "M86N4TAXE ","M86N4TAYE ","M86N4TAZE ","M86N4TDXSS","M86N4TDYSS","M86N4TDZSS","M86N5FKXE ", & - "M86N5FKYE ","M86N5FKZE ","M86N5FMXE ","M86N5FMYE ","M86N5FMZE ","M86N5MKXE ","M86N5MKYE ", & - "M86N5MKZE ","M86N5MMXE ","M86N5MMYE ","M86N5MMZE ","M86N5RAXE ","M86N5RAYE ","M86N5RAZE ", & - "M86N5RDXE ","M86N5RDYE ","M86N5RDZE ","M86N5TAXE ","M86N5TAYE ","M86N5TAZE ","M86N5TDXSS", & - "M86N5TDYSS","M86N5TDZSS","M86N6FKXE ","M86N6FKYE ","M86N6FKZE ","M86N6FMXE ","M86N6FMYE ", & - "M86N6FMZE ","M86N6MKXE ","M86N6MKYE ","M86N6MKZE ","M86N6MMXE ","M86N6MMYE ","M86N6MMZE ", & - "M86N6RAXE ","M86N6RAYE ","M86N6RAZE ","M86N6RDXE ","M86N6RDYE ","M86N6RDZE ","M86N6TAXE ", & - "M86N6TAYE ","M86N6TAZE ","M86N6TDXSS","M86N6TDYSS","M86N6TDZSS","M86N7FKXE ","M86N7FKYE ", & - "M86N7FKZE ","M86N7FMXE ","M86N7FMYE ","M86N7FMZE ","M86N7MKXE ","M86N7MKYE ","M86N7MKZE ", & - "M86N7MMXE ","M86N7MMYE ","M86N7MMZE ","M86N7RAXE ","M86N7RAYE ","M86N7RAZE ","M86N7RDXE ", & - "M86N7RDYE ","M86N7RDZE ","M86N7TAXE ","M86N7TAYE ","M86N7TAZE ","M86N7TDXSS","M86N7TDYSS", & - "M86N7TDZSS","M86N8FKXE ","M86N8FKYE ","M86N8FKZE ","M86N8FMXE ","M86N8FMYE ","M86N8FMZE ", & - "M86N8MKXE ","M86N8MKYE ","M86N8MKZE ","M86N8MMXE ","M86N8MMYE ","M86N8MMZE ","M86N8RAXE ", & - "M86N8RAYE ","M86N8RAZE ","M86N8RDXE ","M86N8RDYE ","M86N8RDZE ","M86N8TAXE ","M86N8TAYE ", & - "M86N8TAZE ","M86N8TDXSS","M86N8TDYSS","M86N8TDZSS","M86N9FKXE ","M86N9FKYE ","M86N9FKZE ", & - "M86N9FMXE ","M86N9FMYE ","M86N9FMZE ","M86N9MKXE ","M86N9MKYE ","M86N9MKZE ","M86N9MMXE ", & - "M86N9MMYE ","M86N9MMZE ","M86N9RAXE ","M86N9RAYE ","M86N9RAZE ","M86N9RDXE ","M86N9RDYE ", & - "M86N9RDZE ","M86N9TAXE ","M86N9TAYE ","M86N9TAZE ","M86N9TDXSS","M86N9TDYSS","M86N9TDZSS", & - "M87N1FKXE ","M87N1FKYE ","M87N1FKZE ","M87N1FMXE ","M87N1FMYE ","M87N1FMZE ","M87N1MKXE ", & - "M87N1MKYE ","M87N1MKZE ","M87N1MMXE ","M87N1MMYE ","M87N1MMZE ","M87N1RAXE ","M87N1RAYE ", & - "M87N1RAZE ","M87N1RDXE ","M87N1RDYE ","M87N1RDZE ","M87N1TAXE ","M87N1TAYE ","M87N1TAZE ", & - "M87N1TDXSS","M87N1TDYSS","M87N1TDZSS","M87N2FKXE ","M87N2FKYE ","M87N2FKZE ","M87N2FMXE ", & - "M87N2FMYE ","M87N2FMZE ","M87N2MKXE ","M87N2MKYE ","M87N2MKZE ","M87N2MMXE ","M87N2MMYE ", & - "M87N2MMZE ","M87N2RAXE ","M87N2RAYE ","M87N2RAZE ","M87N2RDXE ","M87N2RDYE ","M87N2RDZE ", & - "M87N2TAXE ","M87N2TAYE ","M87N2TAZE ","M87N2TDXSS","M87N2TDYSS","M87N2TDZSS","M87N3FKXE ", & - "M87N3FKYE ","M87N3FKZE ","M87N3FMXE ","M87N3FMYE ","M87N3FMZE ","M87N3MKXE ","M87N3MKYE ", & - "M87N3MKZE ","M87N3MMXE ","M87N3MMYE ","M87N3MMZE ","M87N3RAXE ","M87N3RAYE ","M87N3RAZE ", & - "M87N3RDXE ","M87N3RDYE ","M87N3RDZE ","M87N3TAXE ","M87N3TAYE ","M87N3TAZE ","M87N3TDXSS", & - "M87N3TDYSS","M87N3TDZSS","M87N4FKXE ","M87N4FKYE ","M87N4FKZE ","M87N4FMXE ","M87N4FMYE ", & - "M87N4FMZE ","M87N4MKXE ","M87N4MKYE ","M87N4MKZE ","M87N4MMXE ","M87N4MMYE ","M87N4MMZE ", & - "M87N4RAXE ","M87N4RAYE ","M87N4RAZE ","M87N4RDXE ","M87N4RDYE ","M87N4RDZE ","M87N4TAXE ", & - "M87N4TAYE ","M87N4TAZE ","M87N4TDXSS","M87N4TDYSS","M87N4TDZSS","M87N5FKXE ","M87N5FKYE ", & - "M87N5FKZE ","M87N5FMXE ","M87N5FMYE ","M87N5FMZE ","M87N5MKXE ","M87N5MKYE ","M87N5MKZE ", & - "M87N5MMXE ","M87N5MMYE ","M87N5MMZE ","M87N5RAXE ","M87N5RAYE ","M87N5RAZE ","M87N5RDXE ", & - "M87N5RDYE ","M87N5RDZE ","M87N5TAXE ","M87N5TAYE ","M87N5TAZE ","M87N5TDXSS","M87N5TDYSS", & - "M87N5TDZSS","M87N6FKXE ","M87N6FKYE ","M87N6FKZE ","M87N6FMXE ","M87N6FMYE ","M87N6FMZE ", & - "M87N6MKXE ","M87N6MKYE ","M87N6MKZE ","M87N6MMXE ","M87N6MMYE ","M87N6MMZE ","M87N6RAXE ", & - "M87N6RAYE ","M87N6RAZE ","M87N6RDXE ","M87N6RDYE ","M87N6RDZE ","M87N6TAXE ","M87N6TAYE ", & - "M87N6TAZE ","M87N6TDXSS","M87N6TDYSS","M87N6TDZSS","M87N7FKXE ","M87N7FKYE ","M87N7FKZE ", & - "M87N7FMXE ","M87N7FMYE ","M87N7FMZE ","M87N7MKXE ","M87N7MKYE ","M87N7MKZE ","M87N7MMXE ", & - "M87N7MMYE ","M87N7MMZE ","M87N7RAXE ","M87N7RAYE ","M87N7RAZE ","M87N7RDXE ","M87N7RDYE ", & - "M87N7RDZE ","M87N7TAXE ","M87N7TAYE ","M87N7TAZE ","M87N7TDXSS","M87N7TDYSS","M87N7TDZSS", & - "M87N8FKXE ","M87N8FKYE ","M87N8FKZE ","M87N8FMXE ","M87N8FMYE ","M87N8FMZE ","M87N8MKXE ", & - "M87N8MKYE ","M87N8MKZE ","M87N8MMXE ","M87N8MMYE ","M87N8MMZE ","M87N8RAXE ","M87N8RAYE ", & - "M87N8RAZE ","M87N8RDXE ","M87N8RDYE ","M87N8RDZE ","M87N8TAXE ","M87N8TAYE ","M87N8TAZE ", & - "M87N8TDXSS","M87N8TDYSS","M87N8TDZSS","M87N9FKXE ","M87N9FKYE ","M87N9FKZE ","M87N9FMXE ", & - "M87N9FMYE ","M87N9FMZE ","M87N9MKXE ","M87N9MKYE ","M87N9MKZE ","M87N9MMXE ","M87N9MMYE ", & - "M87N9MMZE ","M87N9RAXE ","M87N9RAYE ","M87N9RAZE ","M87N9RDXE ","M87N9RDYE ","M87N9RDZE ", & - "M87N9TAXE ","M87N9TAYE ","M87N9TAZE ","M87N9TDXSS","M87N9TDYSS","M87N9TDZSS","M88N1FKXE ", & - "M88N1FKYE ","M88N1FKZE ","M88N1FMXE ","M88N1FMYE ","M88N1FMZE ","M88N1MKXE ","M88N1MKYE ", & - "M88N1MKZE ","M88N1MMXE ","M88N1MMYE ","M88N1MMZE ","M88N1RAXE ","M88N1RAYE ","M88N1RAZE ", & - "M88N1RDXE ","M88N1RDYE ","M88N1RDZE ","M88N1TAXE ","M88N1TAYE ","M88N1TAZE ","M88N1TDXSS", & - "M88N1TDYSS","M88N1TDZSS","M88N2FKXE ","M88N2FKYE ","M88N2FKZE ","M88N2FMXE ","M88N2FMYE ", & - "M88N2FMZE ","M88N2MKXE ","M88N2MKYE ","M88N2MKZE ","M88N2MMXE ","M88N2MMYE ","M88N2MMZE ", & - "M88N2RAXE ","M88N2RAYE ","M88N2RAZE ","M88N2RDXE ","M88N2RDYE ","M88N2RDZE ","M88N2TAXE ", & - "M88N2TAYE ","M88N2TAZE ","M88N2TDXSS","M88N2TDYSS","M88N2TDZSS","M88N3FKXE ","M88N3FKYE ", & - "M88N3FKZE ","M88N3FMXE ","M88N3FMYE ","M88N3FMZE ","M88N3MKXE ","M88N3MKYE ","M88N3MKZE ", & - "M88N3MMXE ","M88N3MMYE ","M88N3MMZE ","M88N3RAXE ","M88N3RAYE ","M88N3RAZE ","M88N3RDXE ", & - "M88N3RDYE ","M88N3RDZE ","M88N3TAXE ","M88N3TAYE ","M88N3TAZE ","M88N3TDXSS","M88N3TDYSS", & - "M88N3TDZSS","M88N4FKXE ","M88N4FKYE ","M88N4FKZE ","M88N4FMXE ","M88N4FMYE ","M88N4FMZE ", & - "M88N4MKXE ","M88N4MKYE ","M88N4MKZE ","M88N4MMXE ","M88N4MMYE ","M88N4MMZE ","M88N4RAXE ", & - "M88N4RAYE ","M88N4RAZE ","M88N4RDXE ","M88N4RDYE ","M88N4RDZE ","M88N4TAXE ","M88N4TAYE ", & - "M88N4TAZE ","M88N4TDXSS","M88N4TDYSS","M88N4TDZSS","M88N5FKXE ","M88N5FKYE ","M88N5FKZE ", & - "M88N5FMXE ","M88N5FMYE ","M88N5FMZE ","M88N5MKXE ","M88N5MKYE ","M88N5MKZE ","M88N5MMXE ", & - "M88N5MMYE ","M88N5MMZE ","M88N5RAXE ","M88N5RAYE ","M88N5RAZE ","M88N5RDXE ","M88N5RDYE ", & - "M88N5RDZE ","M88N5TAXE ","M88N5TAYE ","M88N5TAZE ","M88N5TDXSS","M88N5TDYSS","M88N5TDZSS", & - "M88N6FKXE ","M88N6FKYE ","M88N6FKZE ","M88N6FMXE ","M88N6FMYE ","M88N6FMZE ","M88N6MKXE ", & - "M88N6MKYE ","M88N6MKZE ","M88N6MMXE ","M88N6MMYE ","M88N6MMZE ","M88N6RAXE ","M88N6RAYE ", & - "M88N6RAZE ","M88N6RDXE ","M88N6RDYE ","M88N6RDZE ","M88N6TAXE ","M88N6TAYE ","M88N6TAZE ", & - "M88N6TDXSS","M88N6TDYSS","M88N6TDZSS","M88N7FKXE ","M88N7FKYE ","M88N7FKZE ","M88N7FMXE ", & - "M88N7FMYE ","M88N7FMZE ","M88N7MKXE ","M88N7MKYE ","M88N7MKZE ","M88N7MMXE ","M88N7MMYE ", & - "M88N7MMZE ","M88N7RAXE ","M88N7RAYE ","M88N7RAZE ","M88N7RDXE ","M88N7RDYE ","M88N7RDZE ", & - "M88N7TAXE ","M88N7TAYE ","M88N7TAZE ","M88N7TDXSS","M88N7TDYSS","M88N7TDZSS","M88N8FKXE ", & - "M88N8FKYE ","M88N8FKZE ","M88N8FMXE ","M88N8FMYE ","M88N8FMZE ","M88N8MKXE ","M88N8MKYE ", & - "M88N8MKZE ","M88N8MMXE ","M88N8MMYE ","M88N8MMZE ","M88N8RAXE ","M88N8RAYE ","M88N8RAZE ", & - "M88N8RDXE ","M88N8RDYE ","M88N8RDZE ","M88N8TAXE ","M88N8TAYE ","M88N8TAZE ","M88N8TDXSS", & - "M88N8TDYSS","M88N8TDZSS","M88N9FKXE ","M88N9FKYE ","M88N9FKZE ","M88N9FMXE ","M88N9FMYE ", & - "M88N9FMZE ","M88N9MKXE ","M88N9MKYE ","M88N9MKZE ","M88N9MMXE ","M88N9MMYE ","M88N9MMZE ", & - "M88N9RAXE ","M88N9RAYE ","M88N9RAZE ","M88N9RDXE ","M88N9RDYE ","M88N9RDZE ","M88N9TAXE ", & - "M88N9TAYE ","M88N9TAZE ","M88N9TDXSS","M88N9TDYSS","M88N9TDZSS","M89N1FKXE ","M89N1FKYE ", & - "M89N1FKZE ","M89N1FMXE ","M89N1FMYE ","M89N1FMZE ","M89N1MKXE ","M89N1MKYE ","M89N1MKZE ", & - "M89N1MMXE ","M89N1MMYE ","M89N1MMZE ","M89N1RAXE ","M89N1RAYE ","M89N1RAZE ","M89N1RDXE ", & - "M89N1RDYE ","M89N1RDZE ","M89N1TAXE ","M89N1TAYE ","M89N1TAZE ","M89N1TDXSS","M89N1TDYSS", & - "M89N1TDZSS","M89N2FKXE ","M89N2FKYE ","M89N2FKZE ","M89N2FMXE ","M89N2FMYE ","M89N2FMZE ", & - "M89N2MKXE ","M89N2MKYE ","M89N2MKZE ","M89N2MMXE ","M89N2MMYE ","M89N2MMZE ","M89N2RAXE ", & - "M89N2RAYE ","M89N2RAZE ","M89N2RDXE ","M89N2RDYE ","M89N2RDZE ","M89N2TAXE ","M89N2TAYE ", & - "M89N2TAZE ","M89N2TDXSS","M89N2TDYSS","M89N2TDZSS","M89N3FKXE ","M89N3FKYE ","M89N3FKZE ", & - "M89N3FMXE ","M89N3FMYE ","M89N3FMZE ","M89N3MKXE ","M89N3MKYE ","M89N3MKZE ","M89N3MMXE ", & - "M89N3MMYE ","M89N3MMZE ","M89N3RAXE ","M89N3RAYE ","M89N3RAZE ","M89N3RDXE ","M89N3RDYE ", & - "M89N3RDZE ","M89N3TAXE ","M89N3TAYE ","M89N3TAZE ","M89N3TDXSS","M89N3TDYSS","M89N3TDZSS", & - "M89N4FKXE ","M89N4FKYE ","M89N4FKZE ","M89N4FMXE ","M89N4FMYE ","M89N4FMZE ","M89N4MKXE ", & - "M89N4MKYE ","M89N4MKZE ","M89N4MMXE ","M89N4MMYE ","M89N4MMZE ","M89N4RAXE ","M89N4RAYE ", & - "M89N4RAZE ","M89N4RDXE ","M89N4RDYE ","M89N4RDZE ","M89N4TAXE ","M89N4TAYE ","M89N4TAZE ", & - "M89N4TDXSS","M89N4TDYSS","M89N4TDZSS","M89N5FKXE ","M89N5FKYE ","M89N5FKZE ","M89N5FMXE ", & - "M89N5FMYE ","M89N5FMZE ","M89N5MKXE ","M89N5MKYE ","M89N5MKZE ","M89N5MMXE ","M89N5MMYE ", & - "M89N5MMZE ","M89N5RAXE ","M89N5RAYE ","M89N5RAZE ","M89N5RDXE ","M89N5RDYE ","M89N5RDZE ", & - "M89N5TAXE ","M89N5TAYE ","M89N5TAZE ","M89N5TDXSS","M89N5TDYSS","M89N5TDZSS","M89N6FKXE ", & - "M89N6FKYE ","M89N6FKZE ","M89N6FMXE ","M89N6FMYE ","M89N6FMZE ","M89N6MKXE ","M89N6MKYE ", & - "M89N6MKZE ","M89N6MMXE ","M89N6MMYE ","M89N6MMZE ","M89N6RAXE ","M89N6RAYE ","M89N6RAZE ", & - "M89N6RDXE ","M89N6RDYE ","M89N6RDZE ","M89N6TAXE ","M89N6TAYE ","M89N6TAZE ","M89N6TDXSS", & - "M89N6TDYSS","M89N6TDZSS","M89N7FKXE ","M89N7FKYE ","M89N7FKZE ","M89N7FMXE ","M89N7FMYE ", & - "M89N7FMZE ","M89N7MKXE ","M89N7MKYE ","M89N7MKZE ","M89N7MMXE ","M89N7MMYE ","M89N7MMZE ", & - "M89N7RAXE ","M89N7RAYE ","M89N7RAZE ","M89N7RDXE ","M89N7RDYE ","M89N7RDZE ","M89N7TAXE ", & - "M89N7TAYE ","M89N7TAZE ","M89N7TDXSS","M89N7TDYSS","M89N7TDZSS","M89N8FKXE ","M89N8FKYE ", & - "M89N8FKZE ","M89N8FMXE ","M89N8FMYE ","M89N8FMZE ","M89N8MKXE ","M89N8MKYE ","M89N8MKZE ", & - "M89N8MMXE ","M89N8MMYE ","M89N8MMZE ","M89N8RAXE ","M89N8RAYE ","M89N8RAZE ","M89N8RDXE ", & - "M89N8RDYE ","M89N8RDZE ","M89N8TAXE ","M89N8TAYE ","M89N8TAZE ","M89N8TDXSS","M89N8TDYSS", & - "M89N8TDZSS","M89N9FKXE ","M89N9FKYE ","M89N9FKZE ","M89N9FMXE ","M89N9FMYE ","M89N9FMZE ", & - "M89N9MKXE ","M89N9MKYE ","M89N9MKZE ","M89N9MMXE ","M89N9MMYE ","M89N9MMZE ","M89N9RAXE ", & - "M89N9RAYE ","M89N9RAZE ","M89N9RDXE ","M89N9RDYE ","M89N9RDZE ","M89N9TAXE ","M89N9TAYE ", & - "M89N9TAZE ","M89N9TDXSS","M89N9TDYSS","M89N9TDZSS","M90N1FKXE ","M90N1FKYE ","M90N1FKZE ", & - "M90N1FMXE ","M90N1FMYE ","M90N1FMZE ","M90N1MKXE ","M90N1MKYE ","M90N1MKZE ","M90N1MMXE ", & - "M90N1MMYE ","M90N1MMZE ","M90N1RAXE ","M90N1RAYE ","M90N1RAZE ","M90N1RDXE ","M90N1RDYE ", & - "M90N1RDZE ","M90N1TAXE ","M90N1TAYE ","M90N1TAZE ","M90N1TDXSS","M90N1TDYSS","M90N1TDZSS", & - "M90N2FKXE ","M90N2FKYE ","M90N2FKZE ","M90N2FMXE ","M90N2FMYE ","M90N2FMZE ","M90N2MKXE ", & - "M90N2MKYE ","M90N2MKZE ","M90N2MMXE ","M90N2MMYE ","M90N2MMZE ","M90N2RAXE ","M90N2RAYE ", & - "M90N2RAZE ","M90N2RDXE ","M90N2RDYE ","M90N2RDZE ","M90N2TAXE ","M90N2TAYE ","M90N2TAZE ", & - "M90N2TDXSS","M90N2TDYSS","M90N2TDZSS","M90N3FKXE ","M90N3FKYE ","M90N3FKZE ","M90N3FMXE ", & - "M90N3FMYE ","M90N3FMZE ","M90N3MKXE ","M90N3MKYE ","M90N3MKZE ","M90N3MMXE ","M90N3MMYE ", & - "M90N3MMZE ","M90N3RAXE ","M90N3RAYE ","M90N3RAZE ","M90N3RDXE ","M90N3RDYE ","M90N3RDZE ", & - "M90N3TAXE ","M90N3TAYE ","M90N3TAZE ","M90N3TDXSS","M90N3TDYSS","M90N3TDZSS","M90N4FKXE ", & - "M90N4FKYE ","M90N4FKZE ","M90N4FMXE ","M90N4FMYE ","M90N4FMZE ","M90N4MKXE ","M90N4MKYE ", & - "M90N4MKZE ","M90N4MMXE ","M90N4MMYE ","M90N4MMZE ","M90N4RAXE ","M90N4RAYE ","M90N4RAZE ", & - "M90N4RDXE ","M90N4RDYE ","M90N4RDZE ","M90N4TAXE ","M90N4TAYE ","M90N4TAZE ","M90N4TDXSS", & - "M90N4TDYSS","M90N4TDZSS","M90N5FKXE ","M90N5FKYE ","M90N5FKZE ","M90N5FMXE ","M90N5FMYE ", & - "M90N5FMZE ","M90N5MKXE ","M90N5MKYE ","M90N5MKZE ","M90N5MMXE ","M90N5MMYE ","M90N5MMZE ", & - "M90N5RAXE ","M90N5RAYE ","M90N5RAZE ","M90N5RDXE ","M90N5RDYE ","M90N5RDZE ","M90N5TAXE ", & - "M90N5TAYE ","M90N5TAZE ","M90N5TDXSS","M90N5TDYSS","M90N5TDZSS","M90N6FKXE ","M90N6FKYE ", & - "M90N6FKZE ","M90N6FMXE ","M90N6FMYE ","M90N6FMZE ","M90N6MKXE ","M90N6MKYE ","M90N6MKZE ", & - "M90N6MMXE ","M90N6MMYE ","M90N6MMZE ","M90N6RAXE ","M90N6RAYE ","M90N6RAZE ","M90N6RDXE ", & - "M90N6RDYE ","M90N6RDZE ","M90N6TAXE ","M90N6TAYE ","M90N6TAZE ","M90N6TDXSS","M90N6TDYSS", & - "M90N6TDZSS","M90N7FKXE ","M90N7FKYE ","M90N7FKZE ","M90N7FMXE ","M90N7FMYE ","M90N7FMZE ", & - "M90N7MKXE ","M90N7MKYE ","M90N7MKZE ","M90N7MMXE ","M90N7MMYE ","M90N7MMZE ","M90N7RAXE ", & - "M90N7RAYE ","M90N7RAZE ","M90N7RDXE ","M90N7RDYE ","M90N7RDZE ","M90N7TAXE ","M90N7TAYE ", & - "M90N7TAZE ","M90N7TDXSS","M90N7TDYSS","M90N7TDZSS","M90N8FKXE ","M90N8FKYE ","M90N8FKZE ", & - "M90N8FMXE ","M90N8FMYE ","M90N8FMZE ","M90N8MKXE ","M90N8MKYE ","M90N8MKZE ","M90N8MMXE ", & - "M90N8MMYE ","M90N8MMZE ","M90N8RAXE ","M90N8RAYE ","M90N8RAZE ","M90N8RDXE ","M90N8RDYE ", & - "M90N8RDZE ","M90N8TAXE ","M90N8TAYE ","M90N8TAZE ","M90N8TDXSS","M90N8TDYSS","M90N8TDZSS", & - "M90N9FKXE ","M90N9FKYE ","M90N9FKZE ","M90N9FMXE ","M90N9FMYE ","M90N9FMZE ","M90N9MKXE ", & - "M90N9MKYE ","M90N9MKZE ","M90N9MMXE ","M90N9MMYE ","M90N9MMZE ","M90N9RAXE ","M90N9RAYE ", & - "M90N9RAZE ","M90N9RDXE ","M90N9RDYE ","M90N9RDZE ","M90N9TAXE ","M90N9TAYE ","M90N9TAZE ", & - "M90N9TDXSS","M90N9TDYSS","M90N9TDZSS","M91N1FKXE ","M91N1FKYE ","M91N1FKZE ","M91N1FMXE ", & - "M91N1FMYE ","M91N1FMZE ","M91N1MKXE ","M91N1MKYE ","M91N1MKZE ","M91N1MMXE ","M91N1MMYE ", & - "M91N1MMZE ","M91N1RAXE ","M91N1RAYE ","M91N1RAZE ","M91N1RDXE ","M91N1RDYE ","M91N1RDZE ", & - "M91N1TAXE ","M91N1TAYE ","M91N1TAZE ","M91N1TDXSS","M91N1TDYSS","M91N1TDZSS","M91N2FKXE ", & - "M91N2FKYE ","M91N2FKZE ","M91N2FMXE ","M91N2FMYE ","M91N2FMZE ","M91N2MKXE ","M91N2MKYE ", & - "M91N2MKZE ","M91N2MMXE ","M91N2MMYE ","M91N2MMZE ","M91N2RAXE ","M91N2RAYE ","M91N2RAZE ", & - "M91N2RDXE ","M91N2RDYE ","M91N2RDZE ","M91N2TAXE ","M91N2TAYE ","M91N2TAZE ","M91N2TDXSS", & - "M91N2TDYSS","M91N2TDZSS","M91N3FKXE ","M91N3FKYE ","M91N3FKZE ","M91N3FMXE ","M91N3FMYE ", & - "M91N3FMZE ","M91N3MKXE ","M91N3MKYE ","M91N3MKZE ","M91N3MMXE ","M91N3MMYE ","M91N3MMZE ", & - "M91N3RAXE ","M91N3RAYE ","M91N3RAZE ","M91N3RDXE ","M91N3RDYE ","M91N3RDZE ","M91N3TAXE ", & - "M91N3TAYE ","M91N3TAZE ","M91N3TDXSS","M91N3TDYSS","M91N3TDZSS","M91N4FKXE ","M91N4FKYE ", & - "M91N4FKZE ","M91N4FMXE ","M91N4FMYE ","M91N4FMZE ","M91N4MKXE ","M91N4MKYE ","M91N4MKZE ", & - "M91N4MMXE ","M91N4MMYE ","M91N4MMZE ","M91N4RAXE ","M91N4RAYE ","M91N4RAZE ","M91N4RDXE ", & - "M91N4RDYE ","M91N4RDZE ","M91N4TAXE ","M91N4TAYE ","M91N4TAZE ","M91N4TDXSS","M91N4TDYSS", & - "M91N4TDZSS","M91N5FKXE ","M91N5FKYE ","M91N5FKZE ","M91N5FMXE ","M91N5FMYE ","M91N5FMZE ", & - "M91N5MKXE ","M91N5MKYE ","M91N5MKZE ","M91N5MMXE ","M91N5MMYE ","M91N5MMZE ","M91N5RAXE ", & - "M91N5RAYE ","M91N5RAZE ","M91N5RDXE ","M91N5RDYE ","M91N5RDZE ","M91N5TAXE ","M91N5TAYE ", & - "M91N5TAZE ","M91N5TDXSS","M91N5TDYSS","M91N5TDZSS","M91N6FKXE ","M91N6FKYE ","M91N6FKZE ", & - "M91N6FMXE ","M91N6FMYE ","M91N6FMZE ","M91N6MKXE ","M91N6MKYE ","M91N6MKZE ","M91N6MMXE ", & - "M91N6MMYE ","M91N6MMZE ","M91N6RAXE ","M91N6RAYE ","M91N6RAZE ","M91N6RDXE ","M91N6RDYE ", & - "M91N6RDZE ","M91N6TAXE ","M91N6TAYE ","M91N6TAZE ","M91N6TDXSS","M91N6TDYSS","M91N6TDZSS", & - "M91N7FKXE ","M91N7FKYE ","M91N7FKZE ","M91N7FMXE ","M91N7FMYE ","M91N7FMZE ","M91N7MKXE ", & - "M91N7MKYE ","M91N7MKZE ","M91N7MMXE ","M91N7MMYE ","M91N7MMZE ","M91N7RAXE ","M91N7RAYE ", & - "M91N7RAZE ","M91N7RDXE ","M91N7RDYE ","M91N7RDZE ","M91N7TAXE ","M91N7TAYE ","M91N7TAZE ", & - "M91N7TDXSS","M91N7TDYSS","M91N7TDZSS","M91N8FKXE ","M91N8FKYE ","M91N8FKZE ","M91N8FMXE ", & - "M91N8FMYE ","M91N8FMZE ","M91N8MKXE ","M91N8MKYE ","M91N8MKZE ","M91N8MMXE ","M91N8MMYE ", & - "M91N8MMZE ","M91N8RAXE ","M91N8RAYE ","M91N8RAZE ","M91N8RDXE ","M91N8RDYE ","M91N8RDZE ", & - "M91N8TAXE ","M91N8TAYE ","M91N8TAZE ","M91N8TDXSS","M91N8TDYSS","M91N8TDZSS","M91N9FKXE ", & - "M91N9FKYE ","M91N9FKZE ","M91N9FMXE ","M91N9FMYE ","M91N9FMZE ","M91N9MKXE ","M91N9MKYE ", & - "M91N9MKZE ","M91N9MMXE ","M91N9MMYE ","M91N9MMZE ","M91N9RAXE ","M91N9RAYE ","M91N9RAZE ", & - "M91N9RDXE ","M91N9RDYE ","M91N9RDZE ","M91N9TAXE ","M91N9TAYE ","M91N9TAZE ","M91N9TDXSS", & - "M91N9TDYSS","M91N9TDZSS","M92N1FKXE ","M92N1FKYE ","M92N1FKZE ","M92N1FMXE ","M92N1FMYE ", & - "M92N1FMZE ","M92N1MKXE ","M92N1MKYE ","M92N1MKZE ","M92N1MMXE ","M92N1MMYE ","M92N1MMZE ", & - "M92N1RAXE ","M92N1RAYE ","M92N1RAZE ","M92N1RDXE ","M92N1RDYE ","M92N1RDZE ","M92N1TAXE ", & - "M92N1TAYE ","M92N1TAZE ","M92N1TDXSS","M92N1TDYSS","M92N1TDZSS","M92N2FKXE ","M92N2FKYE ", & - "M92N2FKZE ","M92N2FMXE ","M92N2FMYE ","M92N2FMZE ","M92N2MKXE ","M92N2MKYE ","M92N2MKZE ", & - "M92N2MMXE ","M92N2MMYE ","M92N2MMZE ","M92N2RAXE ","M92N2RAYE ","M92N2RAZE ","M92N2RDXE ", & - "M92N2RDYE ","M92N2RDZE ","M92N2TAXE ","M92N2TAYE ","M92N2TAZE ","M92N2TDXSS","M92N2TDYSS", & - "M92N2TDZSS","M92N3FKXE ","M92N3FKYE ","M92N3FKZE ","M92N3FMXE ","M92N3FMYE ","M92N3FMZE ", & - "M92N3MKXE ","M92N3MKYE ","M92N3MKZE ","M92N3MMXE ","M92N3MMYE ","M92N3MMZE ","M92N3RAXE ", & - "M92N3RAYE ","M92N3RAZE ","M92N3RDXE ","M92N3RDYE ","M92N3RDZE ","M92N3TAXE ","M92N3TAYE ", & - "M92N3TAZE ","M92N3TDXSS","M92N3TDYSS","M92N3TDZSS","M92N4FKXE ","M92N4FKYE ","M92N4FKZE ", & - "M92N4FMXE ","M92N4FMYE ","M92N4FMZE ","M92N4MKXE ","M92N4MKYE ","M92N4MKZE ","M92N4MMXE ", & - "M92N4MMYE ","M92N4MMZE ","M92N4RAXE ","M92N4RAYE ","M92N4RAZE ","M92N4RDXE ","M92N4RDYE ", & - "M92N4RDZE ","M92N4TAXE ","M92N4TAYE ","M92N4TAZE ","M92N4TDXSS","M92N4TDYSS","M92N4TDZSS", & - "M92N5FKXE ","M92N5FKYE ","M92N5FKZE ","M92N5FMXE ","M92N5FMYE ","M92N5FMZE ","M92N5MKXE ", & - "M92N5MKYE ","M92N5MKZE ","M92N5MMXE ","M92N5MMYE ","M92N5MMZE ","M92N5RAXE ","M92N5RAYE ", & - "M92N5RAZE ","M92N5RDXE ","M92N5RDYE ","M92N5RDZE ","M92N5TAXE ","M92N5TAYE ","M92N5TAZE ", & - "M92N5TDXSS","M92N5TDYSS","M92N5TDZSS","M92N6FKXE ","M92N6FKYE ","M92N6FKZE ","M92N6FMXE ", & - "M92N6FMYE ","M92N6FMZE ","M92N6MKXE ","M92N6MKYE ","M92N6MKZE ","M92N6MMXE ","M92N6MMYE ", & - "M92N6MMZE ","M92N6RAXE ","M92N6RAYE ","M92N6RAZE ","M92N6RDXE ","M92N6RDYE ","M92N6RDZE ", & - "M92N6TAXE ","M92N6TAYE ","M92N6TAZE ","M92N6TDXSS","M92N6TDYSS","M92N6TDZSS","M92N7FKXE ", & - "M92N7FKYE ","M92N7FKZE ","M92N7FMXE ","M92N7FMYE ","M92N7FMZE ","M92N7MKXE ","M92N7MKYE ", & - "M92N7MKZE ","M92N7MMXE ","M92N7MMYE ","M92N7MMZE ","M92N7RAXE ","M92N7RAYE ","M92N7RAZE ", & - "M92N7RDXE ","M92N7RDYE ","M92N7RDZE ","M92N7TAXE ","M92N7TAYE ","M92N7TAZE ","M92N7TDXSS", & - "M92N7TDYSS","M92N7TDZSS","M92N8FKXE ","M92N8FKYE ","M92N8FKZE ","M92N8FMXE ","M92N8FMYE ", & - "M92N8FMZE ","M92N8MKXE ","M92N8MKYE ","M92N8MKZE ","M92N8MMXE ","M92N8MMYE ","M92N8MMZE ", & - "M92N8RAXE ","M92N8RAYE ","M92N8RAZE ","M92N8RDXE ","M92N8RDYE ","M92N8RDZE ","M92N8TAXE ", & - "M92N8TAYE ","M92N8TAZE ","M92N8TDXSS","M92N8TDYSS","M92N8TDZSS","M92N9FKXE ","M92N9FKYE ", & - "M92N9FKZE ","M92N9FMXE ","M92N9FMYE ","M92N9FMZE ","M92N9MKXE ","M92N9MKYE ","M92N9MKZE ", & - "M92N9MMXE ","M92N9MMYE ","M92N9MMZE ","M92N9RAXE ","M92N9RAYE ","M92N9RAZE ","M92N9RDXE ", & - "M92N9RDYE ","M92N9RDZE ","M92N9TAXE ","M92N9TAYE ","M92N9TAZE ","M92N9TDXSS","M92N9TDYSS", & - "M92N9TDZSS","M93N1FKXE ","M93N1FKYE ","M93N1FKZE ","M93N1FMXE ","M93N1FMYE ","M93N1FMZE ", & - "M93N1MKXE ","M93N1MKYE ","M93N1MKZE ","M93N1MMXE ","M93N1MMYE ","M93N1MMZE ","M93N1RAXE ", & - "M93N1RAYE ","M93N1RAZE ","M93N1RDXE ","M93N1RDYE ","M93N1RDZE ","M93N1TAXE ","M93N1TAYE ", & - "M93N1TAZE ","M93N1TDXSS","M93N1TDYSS","M93N1TDZSS","M93N2FKXE ","M93N2FKYE ","M93N2FKZE ", & - "M93N2FMXE ","M93N2FMYE ","M93N2FMZE ","M93N2MKXE ","M93N2MKYE ","M93N2MKZE ","M93N2MMXE ", & - "M93N2MMYE ","M93N2MMZE ","M93N2RAXE ","M93N2RAYE ","M93N2RAZE ","M93N2RDXE ","M93N2RDYE ", & - "M93N2RDZE ","M93N2TAXE ","M93N2TAYE ","M93N2TAZE ","M93N2TDXSS","M93N2TDYSS","M93N2TDZSS", & - "M93N3FKXE ","M93N3FKYE ","M93N3FKZE ","M93N3FMXE ","M93N3FMYE ","M93N3FMZE ","M93N3MKXE ", & - "M93N3MKYE ","M93N3MKZE ","M93N3MMXE ","M93N3MMYE ","M93N3MMZE ","M93N3RAXE ","M93N3RAYE ", & - "M93N3RAZE ","M93N3RDXE ","M93N3RDYE ","M93N3RDZE ","M93N3TAXE ","M93N3TAYE ","M93N3TAZE ", & - "M93N3TDXSS","M93N3TDYSS","M93N3TDZSS","M93N4FKXE ","M93N4FKYE ","M93N4FKZE ","M93N4FMXE ", & - "M93N4FMYE ","M93N4FMZE ","M93N4MKXE ","M93N4MKYE ","M93N4MKZE ","M93N4MMXE ","M93N4MMYE ", & - "M93N4MMZE ","M93N4RAXE ","M93N4RAYE ","M93N4RAZE ","M93N4RDXE ","M93N4RDYE ","M93N4RDZE ", & - "M93N4TAXE ","M93N4TAYE ","M93N4TAZE ","M93N4TDXSS","M93N4TDYSS","M93N4TDZSS","M93N5FKXE ", & - "M93N5FKYE ","M93N5FKZE ","M93N5FMXE ","M93N5FMYE ","M93N5FMZE ","M93N5MKXE ","M93N5MKYE ", & - "M93N5MKZE ","M93N5MMXE ","M93N5MMYE ","M93N5MMZE ","M93N5RAXE ","M93N5RAYE ","M93N5RAZE ", & - "M93N5RDXE ","M93N5RDYE ","M93N5RDZE ","M93N5TAXE ","M93N5TAYE ","M93N5TAZE ","M93N5TDXSS", & - "M93N5TDYSS","M93N5TDZSS","M93N6FKXE ","M93N6FKYE ","M93N6FKZE ","M93N6FMXE ","M93N6FMYE ", & - "M93N6FMZE ","M93N6MKXE ","M93N6MKYE ","M93N6MKZE ","M93N6MMXE ","M93N6MMYE ","M93N6MMZE ", & - "M93N6RAXE ","M93N6RAYE ","M93N6RAZE ","M93N6RDXE ","M93N6RDYE ","M93N6RDZE ","M93N6TAXE ", & - "M93N6TAYE ","M93N6TAZE ","M93N6TDXSS","M93N6TDYSS","M93N6TDZSS","M93N7FKXE ","M93N7FKYE ", & - "M93N7FKZE ","M93N7FMXE ","M93N7FMYE ","M93N7FMZE "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry13(1665) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically - "M93N7MKXE ","M93N7MKYE ","M93N7MKZE ","M93N7MMXE ","M93N7MMYE ","M93N7MMZE ","M93N7RAXE ", & - "M93N7RAYE ","M93N7RAZE ","M93N7RDXE ","M93N7RDYE ","M93N7RDZE ","M93N7TAXE ","M93N7TAYE ", & - "M93N7TAZE ","M93N7TDXSS","M93N7TDYSS","M93N7TDZSS","M93N8FKXE ","M93N8FKYE ","M93N8FKZE ", & - "M93N8FMXE ","M93N8FMYE ","M93N8FMZE ","M93N8MKXE ","M93N8MKYE ","M93N8MKZE ","M93N8MMXE ", & - "M93N8MMYE ","M93N8MMZE ","M93N8RAXE ","M93N8RAYE ","M93N8RAZE ","M93N8RDXE ","M93N8RDYE ", & - "M93N8RDZE ","M93N8TAXE ","M93N8TAYE ","M93N8TAZE ","M93N8TDXSS","M93N8TDYSS","M93N8TDZSS", & - "M93N9FKXE ","M93N9FKYE ","M93N9FKZE ","M93N9FMXE ","M93N9FMYE ","M93N9FMZE ","M93N9MKXE ", & - "M93N9MKYE ","M93N9MKZE ","M93N9MMXE ","M93N9MMYE ","M93N9MMZE ","M93N9RAXE ","M93N9RAYE ", & - "M93N9RAZE ","M93N9RDXE ","M93N9RDYE ","M93N9RDZE ","M93N9TAXE ","M93N9TAYE ","M93N9TAZE ", & - "M93N9TDXSS","M93N9TDYSS","M93N9TDZSS","M94N1FKXE ","M94N1FKYE ","M94N1FKZE ","M94N1FMXE ", & - "M94N1FMYE ","M94N1FMZE ","M94N1MKXE ","M94N1MKYE ","M94N1MKZE ","M94N1MMXE ","M94N1MMYE ", & - "M94N1MMZE ","M94N1RAXE ","M94N1RAYE ","M94N1RAZE ","M94N1RDXE ","M94N1RDYE ","M94N1RDZE ", & - "M94N1TAXE ","M94N1TAYE ","M94N1TAZE ","M94N1TDXSS","M94N1TDYSS","M94N1TDZSS","M94N2FKXE ", & - "M94N2FKYE ","M94N2FKZE ","M94N2FMXE ","M94N2FMYE ","M94N2FMZE ","M94N2MKXE ","M94N2MKYE ", & - "M94N2MKZE ","M94N2MMXE ","M94N2MMYE ","M94N2MMZE ","M94N2RAXE ","M94N2RAYE ","M94N2RAZE ", & - "M94N2RDXE ","M94N2RDYE ","M94N2RDZE ","M94N2TAXE ","M94N2TAYE ","M94N2TAZE ","M94N2TDXSS", & - "M94N2TDYSS","M94N2TDZSS","M94N3FKXE ","M94N3FKYE ","M94N3FKZE ","M94N3FMXE ","M94N3FMYE ", & - "M94N3FMZE ","M94N3MKXE ","M94N3MKYE ","M94N3MKZE ","M94N3MMXE ","M94N3MMYE ","M94N3MMZE ", & - "M94N3RAXE ","M94N3RAYE ","M94N3RAZE ","M94N3RDXE ","M94N3RDYE ","M94N3RDZE ","M94N3TAXE ", & - "M94N3TAYE ","M94N3TAZE ","M94N3TDXSS","M94N3TDYSS","M94N3TDZSS","M94N4FKXE ","M94N4FKYE ", & - "M94N4FKZE ","M94N4FMXE ","M94N4FMYE ","M94N4FMZE ","M94N4MKXE ","M94N4MKYE ","M94N4MKZE ", & - "M94N4MMXE ","M94N4MMYE ","M94N4MMZE ","M94N4RAXE ","M94N4RAYE ","M94N4RAZE ","M94N4RDXE ", & - "M94N4RDYE ","M94N4RDZE ","M94N4TAXE ","M94N4TAYE ","M94N4TAZE ","M94N4TDXSS","M94N4TDYSS", & - "M94N4TDZSS","M94N5FKXE ","M94N5FKYE ","M94N5FKZE ","M94N5FMXE ","M94N5FMYE ","M94N5FMZE ", & - "M94N5MKXE ","M94N5MKYE ","M94N5MKZE ","M94N5MMXE ","M94N5MMYE ","M94N5MMZE ","M94N5RAXE ", & - "M94N5RAYE ","M94N5RAZE ","M94N5RDXE ","M94N5RDYE ","M94N5RDZE ","M94N5TAXE ","M94N5TAYE ", & - "M94N5TAZE ","M94N5TDXSS","M94N5TDYSS","M94N5TDZSS","M94N6FKXE ","M94N6FKYE ","M94N6FKZE ", & - "M94N6FMXE ","M94N6FMYE ","M94N6FMZE ","M94N6MKXE ","M94N6MKYE ","M94N6MKZE ","M94N6MMXE ", & - "M94N6MMYE ","M94N6MMZE ","M94N6RAXE ","M94N6RAYE ","M94N6RAZE ","M94N6RDXE ","M94N6RDYE ", & - "M94N6RDZE ","M94N6TAXE ","M94N6TAYE ","M94N6TAZE ","M94N6TDXSS","M94N6TDYSS","M94N6TDZSS", & - "M94N7FKXE ","M94N7FKYE ","M94N7FKZE ","M94N7FMXE ","M94N7FMYE ","M94N7FMZE ","M94N7MKXE ", & - "M94N7MKYE ","M94N7MKZE ","M94N7MMXE ","M94N7MMYE ","M94N7MMZE ","M94N7RAXE ","M94N7RAYE ", & - "M94N7RAZE ","M94N7RDXE ","M94N7RDYE ","M94N7RDZE ","M94N7TAXE ","M94N7TAYE ","M94N7TAZE ", & - "M94N7TDXSS","M94N7TDYSS","M94N7TDZSS","M94N8FKXE ","M94N8FKYE ","M94N8FKZE ","M94N8FMXE ", & - "M94N8FMYE ","M94N8FMZE ","M94N8MKXE ","M94N8MKYE ","M94N8MKZE ","M94N8MMXE ","M94N8MMYE ", & - "M94N8MMZE ","M94N8RAXE ","M94N8RAYE ","M94N8RAZE ","M94N8RDXE ","M94N8RDYE ","M94N8RDZE ", & - "M94N8TAXE ","M94N8TAYE ","M94N8TAZE ","M94N8TDXSS","M94N8TDYSS","M94N8TDZSS","M94N9FKXE ", & - "M94N9FKYE ","M94N9FKZE ","M94N9FMXE ","M94N9FMYE ","M94N9FMZE ","M94N9MKXE ","M94N9MKYE ", & - "M94N9MKZE ","M94N9MMXE ","M94N9MMYE ","M94N9MMZE ","M94N9RAXE ","M94N9RAYE ","M94N9RAZE ", & - "M94N9RDXE ","M94N9RDYE ","M94N9RDZE ","M94N9TAXE ","M94N9TAYE ","M94N9TAZE ","M94N9TDXSS", & - "M94N9TDYSS","M94N9TDZSS","M95N1FKXE ","M95N1FKYE ","M95N1FKZE ","M95N1FMXE ","M95N1FMYE ", & - "M95N1FMZE ","M95N1MKXE ","M95N1MKYE ","M95N1MKZE ","M95N1MMXE ","M95N1MMYE ","M95N1MMZE ", & - "M95N1RAXE ","M95N1RAYE ","M95N1RAZE ","M95N1RDXE ","M95N1RDYE ","M95N1RDZE ","M95N1TAXE ", & - "M95N1TAYE ","M95N1TAZE ","M95N1TDXSS","M95N1TDYSS","M95N1TDZSS","M95N2FKXE ","M95N2FKYE ", & - "M95N2FKZE ","M95N2FMXE ","M95N2FMYE ","M95N2FMZE ","M95N2MKXE ","M95N2MKYE ","M95N2MKZE ", & - "M95N2MMXE ","M95N2MMYE ","M95N2MMZE ","M95N2RAXE ","M95N2RAYE ","M95N2RAZE ","M95N2RDXE ", & - "M95N2RDYE ","M95N2RDZE ","M95N2TAXE ","M95N2TAYE ","M95N2TAZE ","M95N2TDXSS","M95N2TDYSS", & - "M95N2TDZSS","M95N3FKXE ","M95N3FKYE ","M95N3FKZE ","M95N3FMXE ","M95N3FMYE ","M95N3FMZE ", & - "M95N3MKXE ","M95N3MKYE ","M95N3MKZE ","M95N3MMXE ","M95N3MMYE ","M95N3MMZE ","M95N3RAXE ", & - "M95N3RAYE ","M95N3RAZE ","M95N3RDXE ","M95N3RDYE ","M95N3RDZE ","M95N3TAXE ","M95N3TAYE ", & - "M95N3TAZE ","M95N3TDXSS","M95N3TDYSS","M95N3TDZSS","M95N4FKXE ","M95N4FKYE ","M95N4FKZE ", & - "M95N4FMXE ","M95N4FMYE ","M95N4FMZE ","M95N4MKXE ","M95N4MKYE ","M95N4MKZE ","M95N4MMXE ", & - "M95N4MMYE ","M95N4MMZE ","M95N4RAXE ","M95N4RAYE ","M95N4RAZE ","M95N4RDXE ","M95N4RDYE ", & - "M95N4RDZE ","M95N4TAXE ","M95N4TAYE ","M95N4TAZE ","M95N4TDXSS","M95N4TDYSS","M95N4TDZSS", & - "M95N5FKXE ","M95N5FKYE ","M95N5FKZE ","M95N5FMXE ","M95N5FMYE ","M95N5FMZE ","M95N5MKXE ", & - "M95N5MKYE ","M95N5MKZE ","M95N5MMXE ","M95N5MMYE ","M95N5MMZE ","M95N5RAXE ","M95N5RAYE ", & - "M95N5RAZE ","M95N5RDXE ","M95N5RDYE ","M95N5RDZE ","M95N5TAXE ","M95N5TAYE ","M95N5TAZE ", & - "M95N5TDXSS","M95N5TDYSS","M95N5TDZSS","M95N6FKXE ","M95N6FKYE ","M95N6FKZE ","M95N6FMXE ", & - "M95N6FMYE ","M95N6FMZE ","M95N6MKXE ","M95N6MKYE ","M95N6MKZE ","M95N6MMXE ","M95N6MMYE ", & - "M95N6MMZE ","M95N6RAXE ","M95N6RAYE ","M95N6RAZE ","M95N6RDXE ","M95N6RDYE ","M95N6RDZE ", & - "M95N6TAXE ","M95N6TAYE ","M95N6TAZE ","M95N6TDXSS","M95N6TDYSS","M95N6TDZSS","M95N7FKXE ", & - "M95N7FKYE ","M95N7FKZE ","M95N7FMXE ","M95N7FMYE ","M95N7FMZE ","M95N7MKXE ","M95N7MKYE ", & - "M95N7MKZE ","M95N7MMXE ","M95N7MMYE ","M95N7MMZE ","M95N7RAXE ","M95N7RAYE ","M95N7RAZE ", & - "M95N7RDXE ","M95N7RDYE ","M95N7RDZE ","M95N7TAXE ","M95N7TAYE ","M95N7TAZE ","M95N7TDXSS", & - "M95N7TDYSS","M95N7TDZSS","M95N8FKXE ","M95N8FKYE ","M95N8FKZE ","M95N8FMXE ","M95N8FMYE ", & - "M95N8FMZE ","M95N8MKXE ","M95N8MKYE ","M95N8MKZE ","M95N8MMXE ","M95N8MMYE ","M95N8MMZE ", & - "M95N8RAXE ","M95N8RAYE ","M95N8RAZE ","M95N8RDXE ","M95N8RDYE ","M95N8RDZE ","M95N8TAXE ", & - "M95N8TAYE ","M95N8TAZE ","M95N8TDXSS","M95N8TDYSS","M95N8TDZSS","M95N9FKXE ","M95N9FKYE ", & - "M95N9FKZE ","M95N9FMXE ","M95N9FMYE ","M95N9FMZE ","M95N9MKXE ","M95N9MKYE ","M95N9MKZE ", & - "M95N9MMXE ","M95N9MMYE ","M95N9MMZE ","M95N9RAXE ","M95N9RAYE ","M95N9RAZE ","M95N9RDXE ", & - "M95N9RDYE ","M95N9RDZE ","M95N9TAXE ","M95N9TAYE ","M95N9TAZE ","M95N9TDXSS","M95N9TDYSS", & - "M95N9TDZSS","M96N1FKXE ","M96N1FKYE ","M96N1FKZE ","M96N1FMXE ","M96N1FMYE ","M96N1FMZE ", & - "M96N1MKXE ","M96N1MKYE ","M96N1MKZE ","M96N1MMXE ","M96N1MMYE ","M96N1MMZE ","M96N1RAXE ", & - "M96N1RAYE ","M96N1RAZE ","M96N1RDXE ","M96N1RDYE ","M96N1RDZE ","M96N1TAXE ","M96N1TAYE ", & - "M96N1TAZE ","M96N1TDXSS","M96N1TDYSS","M96N1TDZSS","M96N2FKXE ","M96N2FKYE ","M96N2FKZE ", & - "M96N2FMXE ","M96N2FMYE ","M96N2FMZE ","M96N2MKXE ","M96N2MKYE ","M96N2MKZE ","M96N2MMXE ", & - "M96N2MMYE ","M96N2MMZE ","M96N2RAXE ","M96N2RAYE ","M96N2RAZE ","M96N2RDXE ","M96N2RDYE ", & - "M96N2RDZE ","M96N2TAXE ","M96N2TAYE ","M96N2TAZE ","M96N2TDXSS","M96N2TDYSS","M96N2TDZSS", & - "M96N3FKXE ","M96N3FKYE ","M96N3FKZE ","M96N3FMXE ","M96N3FMYE ","M96N3FMZE ","M96N3MKXE ", & - "M96N3MKYE ","M96N3MKZE ","M96N3MMXE ","M96N3MMYE ","M96N3MMZE ","M96N3RAXE ","M96N3RAYE ", & - "M96N3RAZE ","M96N3RDXE ","M96N3RDYE ","M96N3RDZE ","M96N3TAXE ","M96N3TAYE ","M96N3TAZE ", & - "M96N3TDXSS","M96N3TDYSS","M96N3TDZSS","M96N4FKXE ","M96N4FKYE ","M96N4FKZE ","M96N4FMXE ", & - "M96N4FMYE ","M96N4FMZE ","M96N4MKXE ","M96N4MKYE ","M96N4MKZE ","M96N4MMXE ","M96N4MMYE ", & - "M96N4MMZE ","M96N4RAXE ","M96N4RAYE ","M96N4RAZE ","M96N4RDXE ","M96N4RDYE ","M96N4RDZE ", & - "M96N4TAXE ","M96N4TAYE ","M96N4TAZE ","M96N4TDXSS","M96N4TDYSS","M96N4TDZSS","M96N5FKXE ", & - "M96N5FKYE ","M96N5FKZE ","M96N5FMXE ","M96N5FMYE ","M96N5FMZE ","M96N5MKXE ","M96N5MKYE ", & - "M96N5MKZE ","M96N5MMXE ","M96N5MMYE ","M96N5MMZE ","M96N5RAXE ","M96N5RAYE ","M96N5RAZE ", & - "M96N5RDXE ","M96N5RDYE ","M96N5RDZE ","M96N5TAXE ","M96N5TAYE ","M96N5TAZE ","M96N5TDXSS", & - "M96N5TDYSS","M96N5TDZSS","M96N6FKXE ","M96N6FKYE ","M96N6FKZE ","M96N6FMXE ","M96N6FMYE ", & - "M96N6FMZE ","M96N6MKXE ","M96N6MKYE ","M96N6MKZE ","M96N6MMXE ","M96N6MMYE ","M96N6MMZE ", & - "M96N6RAXE ","M96N6RAYE ","M96N6RAZE ","M96N6RDXE ","M96N6RDYE ","M96N6RDZE ","M96N6TAXE ", & - "M96N6TAYE ","M96N6TAZE ","M96N6TDXSS","M96N6TDYSS","M96N6TDZSS","M96N7FKXE ","M96N7FKYE ", & - "M96N7FKZE ","M96N7FMXE ","M96N7FMYE ","M96N7FMZE ","M96N7MKXE ","M96N7MKYE ","M96N7MKZE ", & - "M96N7MMXE ","M96N7MMYE ","M96N7MMZE ","M96N7RAXE ","M96N7RAYE ","M96N7RAZE ","M96N7RDXE ", & - "M96N7RDYE ","M96N7RDZE ","M96N7TAXE ","M96N7TAYE ","M96N7TAZE ","M96N7TDXSS","M96N7TDYSS", & - "M96N7TDZSS","M96N8FKXE ","M96N8FKYE ","M96N8FKZE ","M96N8FMXE ","M96N8FMYE ","M96N8FMZE ", & - "M96N8MKXE ","M96N8MKYE ","M96N8MKZE ","M96N8MMXE ","M96N8MMYE ","M96N8MMZE ","M96N8RAXE ", & - "M96N8RAYE ","M96N8RAZE ","M96N8RDXE ","M96N8RDYE ","M96N8RDZE ","M96N8TAXE ","M96N8TAYE ", & - "M96N8TAZE ","M96N8TDXSS","M96N8TDYSS","M96N8TDZSS","M96N9FKXE ","M96N9FKYE ","M96N9FKZE ", & - "M96N9FMXE ","M96N9FMYE ","M96N9FMZE ","M96N9MKXE ","M96N9MKYE ","M96N9MKZE ","M96N9MMXE ", & - "M96N9MMYE ","M96N9MMZE ","M96N9RAXE ","M96N9RAYE ","M96N9RAZE ","M96N9RDXE ","M96N9RDYE ", & - "M96N9RDZE ","M96N9TAXE ","M96N9TAYE ","M96N9TAZE ","M96N9TDXSS","M96N9TDYSS","M96N9TDZSS", & - "M97N1FKXE ","M97N1FKYE ","M97N1FKZE ","M97N1FMXE ","M97N1FMYE ","M97N1FMZE ","M97N1MKXE ", & - "M97N1MKYE ","M97N1MKZE ","M97N1MMXE ","M97N1MMYE ","M97N1MMZE ","M97N1RAXE ","M97N1RAYE ", & - "M97N1RAZE ","M97N1RDXE ","M97N1RDYE ","M97N1RDZE ","M97N1TAXE ","M97N1TAYE ","M97N1TAZE ", & - "M97N1TDXSS","M97N1TDYSS","M97N1TDZSS","M97N2FKXE ","M97N2FKYE ","M97N2FKZE ","M97N2FMXE ", & - "M97N2FMYE ","M97N2FMZE ","M97N2MKXE ","M97N2MKYE ","M97N2MKZE ","M97N2MMXE ","M97N2MMYE ", & - "M97N2MMZE ","M97N2RAXE ","M97N2RAYE ","M97N2RAZE ","M97N2RDXE ","M97N2RDYE ","M97N2RDZE ", & - "M97N2TAXE ","M97N2TAYE ","M97N2TAZE ","M97N2TDXSS","M97N2TDYSS","M97N2TDZSS","M97N3FKXE ", & - "M97N3FKYE ","M97N3FKZE ","M97N3FMXE ","M97N3FMYE ","M97N3FMZE ","M97N3MKXE ","M97N3MKYE ", & - "M97N3MKZE ","M97N3MMXE ","M97N3MMYE ","M97N3MMZE ","M97N3RAXE ","M97N3RAYE ","M97N3RAZE ", & - "M97N3RDXE ","M97N3RDYE ","M97N3RDZE ","M97N3TAXE ","M97N3TAYE ","M97N3TAZE ","M97N3TDXSS", & - "M97N3TDYSS","M97N3TDZSS","M97N4FKXE ","M97N4FKYE ","M97N4FKZE ","M97N4FMXE ","M97N4FMYE ", & - "M97N4FMZE ","M97N4MKXE ","M97N4MKYE ","M97N4MKZE ","M97N4MMXE ","M97N4MMYE ","M97N4MMZE ", & - "M97N4RAXE ","M97N4RAYE ","M97N4RAZE ","M97N4RDXE ","M97N4RDYE ","M97N4RDZE ","M97N4TAXE ", & - "M97N4TAYE ","M97N4TAZE ","M97N4TDXSS","M97N4TDYSS","M97N4TDZSS","M97N5FKXE ","M97N5FKYE ", & - "M97N5FKZE ","M97N5FMXE ","M97N5FMYE ","M97N5FMZE ","M97N5MKXE ","M97N5MKYE ","M97N5MKZE ", & - "M97N5MMXE ","M97N5MMYE ","M97N5MMZE ","M97N5RAXE ","M97N5RAYE ","M97N5RAZE ","M97N5RDXE ", & - "M97N5RDYE ","M97N5RDZE ","M97N5TAXE ","M97N5TAYE ","M97N5TAZE ","M97N5TDXSS","M97N5TDYSS", & - "M97N5TDZSS","M97N6FKXE ","M97N6FKYE ","M97N6FKZE ","M97N6FMXE ","M97N6FMYE ","M97N6FMZE ", & - "M97N6MKXE ","M97N6MKYE ","M97N6MKZE ","M97N6MMXE ","M97N6MMYE ","M97N6MMZE ","M97N6RAXE ", & - "M97N6RAYE ","M97N6RAZE ","M97N6RDXE ","M97N6RDYE ","M97N6RDZE ","M97N6TAXE ","M97N6TAYE ", & - "M97N6TAZE ","M97N6TDXSS","M97N6TDYSS","M97N6TDZSS","M97N7FKXE ","M97N7FKYE ","M97N7FKZE ", & - "M97N7FMXE ","M97N7FMYE ","M97N7FMZE ","M97N7MKXE ","M97N7MKYE ","M97N7MKZE ","M97N7MMXE ", & - "M97N7MMYE ","M97N7MMZE ","M97N7RAXE ","M97N7RAYE ","M97N7RAZE ","M97N7RDXE ","M97N7RDYE ", & - "M97N7RDZE ","M97N7TAXE ","M97N7TAYE ","M97N7TAZE ","M97N7TDXSS","M97N7TDYSS","M97N7TDZSS", & - "M97N8FKXE ","M97N8FKYE ","M97N8FKZE ","M97N8FMXE ","M97N8FMYE ","M97N8FMZE ","M97N8MKXE ", & - "M97N8MKYE ","M97N8MKZE ","M97N8MMXE ","M97N8MMYE ","M97N8MMZE ","M97N8RAXE ","M97N8RAYE ", & - "M97N8RAZE ","M97N8RDXE ","M97N8RDYE ","M97N8RDZE ","M97N8TAXE ","M97N8TAYE ","M97N8TAZE ", & - "M97N8TDXSS","M97N8TDYSS","M97N8TDZSS","M97N9FKXE ","M97N9FKYE ","M97N9FKZE ","M97N9FMXE ", & - "M97N9FMYE ","M97N9FMZE ","M97N9MKXE ","M97N9MKYE ","M97N9MKZE ","M97N9MMXE ","M97N9MMYE ", & - "M97N9MMZE ","M97N9RAXE ","M97N9RAYE ","M97N9RAZE ","M97N9RDXE ","M97N9RDYE ","M97N9RDZE ", & - "M97N9TAXE ","M97N9TAYE ","M97N9TAZE ","M97N9TDXSS","M97N9TDYSS","M97N9TDZSS","M98N1FKXE ", & - "M98N1FKYE ","M98N1FKZE ","M98N1FMXE ","M98N1FMYE ","M98N1FMZE ","M98N1MKXE ","M98N1MKYE ", & - "M98N1MKZE ","M98N1MMXE ","M98N1MMYE ","M98N1MMZE ","M98N1RAXE ","M98N1RAYE ","M98N1RAZE ", & - "M98N1RDXE ","M98N1RDYE ","M98N1RDZE ","M98N1TAXE ","M98N1TAYE ","M98N1TAZE ","M98N1TDXSS", & - "M98N1TDYSS","M98N1TDZSS","M98N2FKXE ","M98N2FKYE ","M98N2FKZE ","M98N2FMXE ","M98N2FMYE ", & - "M98N2FMZE ","M98N2MKXE ","M98N2MKYE ","M98N2MKZE ","M98N2MMXE ","M98N2MMYE ","M98N2MMZE ", & - "M98N2RAXE ","M98N2RAYE ","M98N2RAZE ","M98N2RDXE ","M98N2RDYE ","M98N2RDZE ","M98N2TAXE ", & - "M98N2TAYE ","M98N2TAZE ","M98N2TDXSS","M98N2TDYSS","M98N2TDZSS","M98N3FKXE ","M98N3FKYE ", & - "M98N3FKZE ","M98N3FMXE ","M98N3FMYE ","M98N3FMZE ","M98N3MKXE ","M98N3MKYE ","M98N3MKZE ", & - "M98N3MMXE ","M98N3MMYE ","M98N3MMZE ","M98N3RAXE ","M98N3RAYE ","M98N3RAZE ","M98N3RDXE ", & - "M98N3RDYE ","M98N3RDZE ","M98N3TAXE ","M98N3TAYE ","M98N3TAZE ","M98N3TDXSS","M98N3TDYSS", & - "M98N3TDZSS","M98N4FKXE ","M98N4FKYE ","M98N4FKZE ","M98N4FMXE ","M98N4FMYE ","M98N4FMZE ", & - "M98N4MKXE ","M98N4MKYE ","M98N4MKZE ","M98N4MMXE ","M98N4MMYE ","M98N4MMZE ","M98N4RAXE ", & - "M98N4RAYE ","M98N4RAZE ","M98N4RDXE ","M98N4RDYE ","M98N4RDZE ","M98N4TAXE ","M98N4TAYE ", & - "M98N4TAZE ","M98N4TDXSS","M98N4TDYSS","M98N4TDZSS","M98N5FKXE ","M98N5FKYE ","M98N5FKZE ", & - "M98N5FMXE ","M98N5FMYE ","M98N5FMZE ","M98N5MKXE ","M98N5MKYE ","M98N5MKZE ","M98N5MMXE ", & - "M98N5MMYE ","M98N5MMZE ","M98N5RAXE ","M98N5RAYE ","M98N5RAZE ","M98N5RDXE ","M98N5RDYE ", & - "M98N5RDZE ","M98N5TAXE ","M98N5TAYE ","M98N5TAZE ","M98N5TDXSS","M98N5TDYSS","M98N5TDZSS", & - "M98N6FKXE ","M98N6FKYE ","M98N6FKZE ","M98N6FMXE ","M98N6FMYE ","M98N6FMZE ","M98N6MKXE ", & - "M98N6MKYE ","M98N6MKZE ","M98N6MMXE ","M98N6MMYE ","M98N6MMZE ","M98N6RAXE ","M98N6RAYE ", & - "M98N6RAZE ","M98N6RDXE ","M98N6RDYE ","M98N6RDZE ","M98N6TAXE ","M98N6TAYE ","M98N6TAZE ", & - "M98N6TDXSS","M98N6TDYSS","M98N6TDZSS","M98N7FKXE ","M98N7FKYE ","M98N7FKZE ","M98N7FMXE ", & - "M98N7FMYE ","M98N7FMZE ","M98N7MKXE ","M98N7MKYE ","M98N7MKZE ","M98N7MMXE ","M98N7MMYE ", & - "M98N7MMZE ","M98N7RAXE ","M98N7RAYE ","M98N7RAZE ","M98N7RDXE ","M98N7RDYE ","M98N7RDZE ", & - "M98N7TAXE ","M98N7TAYE ","M98N7TAZE ","M98N7TDXSS","M98N7TDYSS","M98N7TDZSS","M98N8FKXE ", & - "M98N8FKYE ","M98N8FKZE ","M98N8FMXE ","M98N8FMYE ","M98N8FMZE ","M98N8MKXE ","M98N8MKYE ", & - "M98N8MKZE ","M98N8MMXE ","M98N8MMYE ","M98N8MMZE ","M98N8RAXE ","M98N8RAYE ","M98N8RAZE ", & - "M98N8RDXE ","M98N8RDYE ","M98N8RDZE ","M98N8TAXE ","M98N8TAYE ","M98N8TAZE ","M98N8TDXSS", & - "M98N8TDYSS","M98N8TDZSS","M98N9FKXE ","M98N9FKYE ","M98N9FKZE ","M98N9FMXE ","M98N9FMYE ", & - "M98N9FMZE ","M98N9MKXE ","M98N9MKYE ","M98N9MKZE ","M98N9MMXE ","M98N9MMYE ","M98N9MMZE ", & - "M98N9RAXE ","M98N9RAYE ","M98N9RAZE ","M98N9RDXE ","M98N9RDYE ","M98N9RDZE ","M98N9TAXE ", & - "M98N9TAYE ","M98N9TAZE ","M98N9TDXSS","M98N9TDYSS","M98N9TDZSS","M99N1FKXE ","M99N1FKYE ", & - "M99N1FKZE ","M99N1FMXE ","M99N1FMYE ","M99N1FMZE ","M99N1MKXE ","M99N1MKYE ","M99N1MKZE ", & - "M99N1MMXE ","M99N1MMYE ","M99N1MMZE ","M99N1RAXE ","M99N1RAYE ","M99N1RAZE ","M99N1RDXE ", & - "M99N1RDYE ","M99N1RDZE ","M99N1TAXE ","M99N1TAYE ","M99N1TAZE ","M99N1TDXSS","M99N1TDYSS", & - "M99N1TDZSS","M99N2FKXE ","M99N2FKYE ","M99N2FKZE ","M99N2FMXE ","M99N2FMYE ","M99N2FMZE ", & - "M99N2MKXE ","M99N2MKYE ","M99N2MKZE ","M99N2MMXE ","M99N2MMYE ","M99N2MMZE ","M99N2RAXE ", & - "M99N2RAYE ","M99N2RAZE ","M99N2RDXE ","M99N2RDYE ","M99N2RDZE ","M99N2TAXE ","M99N2TAYE ", & - "M99N2TAZE ","M99N2TDXSS","M99N2TDYSS","M99N2TDZSS","M99N3FKXE ","M99N3FKYE ","M99N3FKZE ", & - "M99N3FMXE ","M99N3FMYE ","M99N3FMZE ","M99N3MKXE ","M99N3MKYE ","M99N3MKZE ","M99N3MMXE ", & - "M99N3MMYE ","M99N3MMZE ","M99N3RAXE ","M99N3RAYE ","M99N3RAZE ","M99N3RDXE ","M99N3RDYE ", & - "M99N3RDZE ","M99N3TAXE ","M99N3TAYE ","M99N3TAZE ","M99N3TDXSS","M99N3TDYSS","M99N3TDZSS", & - "M99N4FKXE ","M99N4FKYE ","M99N4FKZE ","M99N4FMXE ","M99N4FMYE ","M99N4FMZE ","M99N4MKXE ", & - "M99N4MKYE ","M99N4MKZE ","M99N4MMXE ","M99N4MMYE ","M99N4MMZE ","M99N4RAXE ","M99N4RAYE ", & - "M99N4RAZE ","M99N4RDXE ","M99N4RDYE ","M99N4RDZE ","M99N4TAXE ","M99N4TAYE ","M99N4TAZE ", & - "M99N4TDXSS","M99N4TDYSS","M99N4TDZSS","M99N5FKXE ","M99N5FKYE ","M99N5FKZE ","M99N5FMXE ", & - "M99N5FMYE ","M99N5FMZE ","M99N5MKXE ","M99N5MKYE ","M99N5MKZE ","M99N5MMXE ","M99N5MMYE ", & - "M99N5MMZE ","M99N5RAXE ","M99N5RAYE ","M99N5RAZE ","M99N5RDXE ","M99N5RDYE ","M99N5RDZE ", & - "M99N5TAXE ","M99N5TAYE ","M99N5TAZE ","M99N5TDXSS","M99N5TDYSS","M99N5TDZSS","M99N6FKXE ", & - "M99N6FKYE ","M99N6FKZE ","M99N6FMXE ","M99N6FMYE ","M99N6FMZE ","M99N6MKXE ","M99N6MKYE ", & - "M99N6MKZE ","M99N6MMXE ","M99N6MMYE ","M99N6MMZE ","M99N6RAXE ","M99N6RAYE ","M99N6RAZE ", & - "M99N6RDXE ","M99N6RDYE ","M99N6RDZE ","M99N6TAXE ","M99N6TAYE ","M99N6TAZE ","M99N6TDXSS", & - "M99N6TDYSS","M99N6TDZSS","M99N7FKXE ","M99N7FKYE ","M99N7FKZE ","M99N7FMXE ","M99N7FMYE ", & - "M99N7FMZE ","M99N7MKXE ","M99N7MKYE ","M99N7MKZE ","M99N7MMXE ","M99N7MMYE ","M99N7MMZE ", & - "M99N7RAXE ","M99N7RAYE ","M99N7RAZE ","M99N7RDXE ","M99N7RDYE ","M99N7RDZE ","M99N7TAXE ", & - "M99N7TAYE ","M99N7TAZE ","M99N7TDXSS","M99N7TDYSS","M99N7TDZSS","M99N8FKXE ","M99N8FKYE ", & - "M99N8FKZE ","M99N8FMXE ","M99N8FMYE ","M99N8FMZE ","M99N8MKXE ","M99N8MKYE ","M99N8MKZE ", & - "M99N8MMXE ","M99N8MMYE ","M99N8MMZE ","M99N8RAXE ","M99N8RAYE ","M99N8RAZE ","M99N8RDXE ", & - "M99N8RDYE ","M99N8RDZE ","M99N8TAXE ","M99N8TAYE ","M99N8TAZE ","M99N8TDXSS","M99N8TDYSS", & - "M99N8TDZSS","M99N9FKXE ","M99N9FKYE ","M99N9FKZE ","M99N9FMXE ","M99N9FMYE ","M99N9FMZE ", & - "M99N9MKXE ","M99N9MKYE ","M99N9MKZE ","M99N9MMXE ","M99N9MMYE ","M99N9MMZE ","M99N9RAXE ", & - "M99N9RAYE ","M99N9RAZE ","M99N9RDXE ","M99N9RDYE ","M99N9RDZE ","M99N9TAXE ","M99N9TAYE ", & - "M99N9TAZE ","M99N9TDXSS","M99N9TDYSS","M99N9TDZSS","REACTFXSS ","REACTFYSS ","REACTFZSS ", & - "REACTMXSS ","REACTMYSS ","REACTMZSS ","SSQM01 ","SSQM02 ","SSQM03 ","SSQM04 ", & - "SSQM05 ","SSQM06 ","SSQM07 ","SSQM08 ","SSQM09 ","SSQM10 ","SSQM11 ", & - "SSQM12 ","SSQM13 ","SSQM14 ","SSQM15 ","SSQM16 ","SSQM17 ","SSQM18 ", & - "SSQM19 ","SSQM20 ","SSQM21 ","SSQM22 ","SSQM23 ","SSQM24 ","SSQM25 ", & - "SSQM26 ","SSQM27 ","SSQM28 ","SSQM29 ","SSQM30 ","SSQM31 ","SSQM32 ", & - "SSQM33 ","SSQM34 ","SSQM35 ","SSQM36 ","SSQM37 ","SSQM38 ","SSQM39 ", & - "SSQM40 ","SSQM41 ","SSQM42 ","SSQM43 ","SSQM44 ","SSQM45 ","SSQM46 ", & - "SSQM47 ","SSQM48 ","SSQM49 ","SSQM50 ","SSQM51 ","SSQM52 ","SSQM53 ", & - "SSQM54 ","SSQM55 ","SSQM56 ","SSQM57 ","SSQM58 ","SSQM59 ","SSQM60 ", & - "SSQM61 ","SSQM62 ","SSQM63 ","SSQM64 ","SSQM65 ","SSQM66 ","SSQM67 ", & - "SSQM68 ","SSQM69 ","SSQM70 ","SSQM71 ","SSQM72 ","SSQM73 ","SSQM74 ", & - "SSQM75 ","SSQM76 ","SSQM77 ","SSQM78 ","SSQM79 ","SSQM80 ","SSQM81 ", & - "SSQM82 ","SSQM83 ","SSQM84 ","SSQM85 ","SSQM86 ","SSQM87 ","SSQM88 ", & - "SSQM89 ","SSQM90 ","SSQM91 ","SSQM92 ","SSQM93 ","SSQM94 ","SSQM95 ", & - "SSQM96 ","SSQM97 ","SSQM98 ","SSQM99 ","SSQMD01 ","SSQMD02 ","SSQMD03 ", & - "SSQMD04 ","SSQMD05 ","SSQMD06 ","SSQMD07 ","SSQMD08 ","SSQMD09 ","SSQMD10 ", & - "SSQMD11 ","SSQMD12 ","SSQMD13 ","SSQMD14 ","SSQMD15 ","SSQMD16 ","SSQMD17 ", & - "SSQMD18 ","SSQMD19 ","SSQMD20 ","SSQMD21 ","SSQMD22 ","SSQMD23 ","SSQMD24 ", & - "SSQMD25 ","SSQMD26 ","SSQMD27 ","SSQMD28 ","SSQMD29 ","SSQMD30 ","SSQMD31 ", & - "SSQMD32 ","SSQMD33 ","SSQMD34 ","SSQMD35 ","SSQMD36 ","SSQMD37 ","SSQMD38 ", & - "SSQMD39 ","SSQMD40 ","SSQMD41 ","SSQMD42 ","SSQMD43 ","SSQMD44 ","SSQMD45 ", & - "SSQMD46 ","SSQMD47 ","SSQMD48 ","SSQMD49 ","SSQMD50 ","SSQMD51 ","SSQMD52 ", & - "SSQMD53 ","SSQMD54 ","SSQMD55 ","SSQMD56 ","SSQMD57 ","SSQMD58 ","SSQMD59 ", & - "SSQMD60 ","SSQMD61 ","SSQMD62 ","SSQMD63 ","SSQMD64 ","SSQMD65 ","SSQMD66 ", & - "SSQMD67 ","SSQMD68 ","SSQMD69 ","SSQMD70 ","SSQMD71 ","SSQMD72 ","SSQMD73 ", & - "SSQMD74 ","SSQMD75 ","SSQMD76 ","SSQMD77 ","SSQMD78 ","SSQMD79 ","SSQMD80 ", & - "SSQMD81 ","SSQMD82 ","SSQMD83 ","SSQMD84 ","SSQMD85 ","SSQMD86 ","SSQMD87 ", & - "SSQMD88 ","SSQMD89 ","SSQMD90 ","SSQMD91 ","SSQMD92 ","SSQMD93 ","SSQMD94 ", & - "SSQMD95 ","SSQMD96 ","SSQMD97 ","SSQMD98 ","SSQMD99 ","SSQMDD01 ","SSQMDD02 ", & - "SSQMDD03 ","SSQMDD04 ","SSQMDD05 ","SSQMDD06 ","SSQMDD07 ","SSQMDD08 ","SSQMDD09 ", & - "SSQMDD10 ","SSQMDD11 ","SSQMDD12 ","SSQMDD13 ","SSQMDD14 ","SSQMDD15 ","SSQMDD16 ", & - "SSQMDD17 ","SSQMDD18 ","SSQMDD19 ","SSQMDD20 ","SSQMDD21 ","SSQMDD22 ","SSQMDD23 ", & - "SSQMDD24 ","SSQMDD25 ","SSQMDD26 ","SSQMDD27 ","SSQMDD28 ","SSQMDD29 ","SSQMDD30 ", & - "SSQMDD31 ","SSQMDD32 ","SSQMDD33 ","SSQMDD34 ","SSQMDD35 ","SSQMDD36 ","SSQMDD37 ", & - "SSQMDD38 ","SSQMDD39 ","SSQMDD40 ","SSQMDD41 ","SSQMDD42 ","SSQMDD43 ","SSQMDD44 ", & - "SSQMDD45 ","SSQMDD46 ","SSQMDD47 ","SSQMDD48 ","SSQMDD49 ","SSQMDD50 ","SSQMDD51 ", & - "SSQMDD52 ","SSQMDD53 ","SSQMDD54 ","SSQMDD55 ","SSQMDD56 ","SSQMDD57 ","SSQMDD58 ", & - "SSQMDD59 ","SSQMDD60 ","SSQMDD61 ","SSQMDD62 ","SSQMDD63 ","SSQMDD64 ","SSQMDD65 ", & - "SSQMDD66 ","SSQMDD67 ","SSQMDD68 ","SSQMDD69 ","SSQMDD70 ","SSQMDD71 ","SSQMDD72 ", & - "SSQMDD73 ","SSQMDD74 ","SSQMDD75 ","SSQMDD76 ","SSQMDD77 ","SSQMDD78 ","SSQMDD79 ", & - "SSQMDD80 ","SSQMDD81 ","SSQMDD82 ","SSQMDD83 ","SSQMDD84 ","SSQMDD85 ","SSQMDD86 ", & - "SSQMDD87 ","SSQMDD88 ","SSQMDD89 ","SSQMDD90 ","SSQMDD91 ","SSQMDD92 ","SSQMDD93 ", & - "SSQMDD94 ","SSQMDD95 ","SSQMDD96 ","SSQMDD97 ","SSQMDD98 ","SSQMDD99 "/) - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(21705) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M85N9RAXE ","M85N9RAYE ","M85N9RAZE ","M85N9RDXE ","M85N9RDYE ","M85N9RDZE ","M85N9TAXE ", & + "M85N9TAYE ","M85N9TAZE ","M85N9TDXSS","M85N9TDYSS","M85N9TDZSS","M86N1FKXE ","M86N1FKYE ", & + "M86N1FKZE ","M86N1FMXE ","M86N1FMYE ","M86N1FMZE ","M86N1MKXE ","M86N1MKYE ","M86N1MKZE ", & + "M86N1MMXE ","M86N1MMYE ","M86N1MMZE ","M86N1RAXE ","M86N1RAYE ","M86N1RAZE ","M86N1RDXE ", & + "M86N1RDYE ","M86N1RDZE ","M86N1TAXE ","M86N1TAYE ","M86N1TAZE ","M86N1TDXSS","M86N1TDYSS", & + "M86N1TDZSS","M86N2FKXE ","M86N2FKYE ","M86N2FKZE ","M86N2FMXE ","M86N2FMYE ","M86N2FMZE ", & + "M86N2MKXE ","M86N2MKYE ","M86N2MKZE ","M86N2MMXE ","M86N2MMYE ","M86N2MMZE ","M86N2RAXE ", & + "M86N2RAYE ","M86N2RAZE ","M86N2RDXE ","M86N2RDYE ","M86N2RDZE ","M86N2TAXE ","M86N2TAYE ", & + "M86N2TAZE ","M86N2TDXSS","M86N2TDYSS","M86N2TDZSS","M86N3FKXE ","M86N3FKYE ","M86N3FKZE ", & + "M86N3FMXE ","M86N3FMYE ","M86N3FMZE ","M86N3MKXE ","M86N3MKYE ","M86N3MKZE ","M86N3MMXE ", & + "M86N3MMYE ","M86N3MMZE ","M86N3RAXE ","M86N3RAYE ","M86N3RAZE ","M86N3RDXE ","M86N3RDYE ", & + "M86N3RDZE ","M86N3TAXE ","M86N3TAYE ","M86N3TAZE ","M86N3TDXSS","M86N3TDYSS","M86N3TDZSS", & + "M86N4FKXE ","M86N4FKYE ","M86N4FKZE ","M86N4FMXE ","M86N4FMYE ","M86N4FMZE ","M86N4MKXE ", & + "M86N4MKYE ","M86N4MKZE ","M86N4MMXE ","M86N4MMYE ","M86N4MMZE ","M86N4RAXE ","M86N4RAYE ", & + "M86N4RAZE ","M86N4RDXE ","M86N4RDYE ","M86N4RDZE ","M86N4TAXE ","M86N4TAYE ","M86N4TAZE ", & + "M86N4TDXSS","M86N4TDYSS","M86N4TDZSS","M86N5FKXE ","M86N5FKYE ","M86N5FKZE ","M86N5FMXE ", & + "M86N5FMYE ","M86N5FMZE ","M86N5MKXE ","M86N5MKYE ","M86N5MKZE ","M86N5MMXE ","M86N5MMYE ", & + "M86N5MMZE ","M86N5RAXE ","M86N5RAYE ","M86N5RAZE ","M86N5RDXE ","M86N5RDYE ","M86N5RDZE ", & + "M86N5TAXE ","M86N5TAYE ","M86N5TAZE ","M86N5TDXSS","M86N5TDYSS","M86N5TDZSS","M86N6FKXE ", & + "M86N6FKYE ","M86N6FKZE ","M86N6FMXE ","M86N6FMYE ","M86N6FMZE ","M86N6MKXE ","M86N6MKYE ", & + "M86N6MKZE ","M86N6MMXE ","M86N6MMYE ","M86N6MMZE ","M86N6RAXE ","M86N6RAYE ","M86N6RAZE ", & + "M86N6RDXE ","M86N6RDYE ","M86N6RDZE ","M86N6TAXE ","M86N6TAYE ","M86N6TAZE ","M86N6TDXSS", & + "M86N6TDYSS","M86N6TDZSS","M86N7FKXE ","M86N7FKYE ","M86N7FKZE ","M86N7FMXE ","M86N7FMYE ", & + "M86N7FMZE ","M86N7MKXE ","M86N7MKYE ","M86N7MKZE ","M86N7MMXE ","M86N7MMYE ","M86N7MMZE ", & + "M86N7RAXE ","M86N7RAYE ","M86N7RAZE ","M86N7RDXE ","M86N7RDYE ","M86N7RDZE ","M86N7TAXE ", & + "M86N7TAYE ","M86N7TAZE ","M86N7TDXSS","M86N7TDYSS","M86N7TDZSS","M86N8FKXE ","M86N8FKYE ", & + "M86N8FKZE ","M86N8FMXE ","M86N8FMYE ","M86N8FMZE ","M86N8MKXE ","M86N8MKYE ","M86N8MKZE ", & + "M86N8MMXE ","M86N8MMYE ","M86N8MMZE ","M86N8RAXE ","M86N8RAYE ","M86N8RAZE ","M86N8RDXE ", & + "M86N8RDYE ","M86N8RDZE ","M86N8TAXE ","M86N8TAYE ","M86N8TAZE ","M86N8TDXSS","M86N8TDYSS", & + "M86N8TDZSS","M86N9FKXE ","M86N9FKYE ","M86N9FKZE ","M86N9FMXE ","M86N9FMYE ","M86N9FMZE ", & + "M86N9MKXE ","M86N9MKYE ","M86N9MKZE ","M86N9MMXE ","M86N9MMYE ","M86N9MMZE ","M86N9RAXE ", & + "M86N9RAYE ","M86N9RAZE ","M86N9RDXE ","M86N9RDYE ","M86N9RDZE ","M86N9TAXE ","M86N9TAYE ", & + "M86N9TAZE ","M86N9TDXSS","M86N9TDYSS","M86N9TDZSS","M87N1FKXE ","M87N1FKYE ","M87N1FKZE ", & + "M87N1FMXE ","M87N1FMYE ","M87N1FMZE ","M87N1MKXE ","M87N1MKYE ","M87N1MKZE ","M87N1MMXE ", & + "M87N1MMYE ","M87N1MMZE ","M87N1RAXE ","M87N1RAYE ","M87N1RAZE ","M87N1RDXE ","M87N1RDYE ", & + "M87N1RDZE ","M87N1TAXE ","M87N1TAYE ","M87N1TAZE ","M87N1TDXSS","M87N1TDYSS","M87N1TDZSS", & + "M87N2FKXE ","M87N2FKYE ","M87N2FKZE ","M87N2FMXE ","M87N2FMYE ","M87N2FMZE ","M87N2MKXE ", & + "M87N2MKYE ","M87N2MKZE ","M87N2MMXE ","M87N2MMYE ","M87N2MMZE ","M87N2RAXE ","M87N2RAYE ", & + "M87N2RAZE ","M87N2RDXE ","M87N2RDYE ","M87N2RDZE ","M87N2TAXE ","M87N2TAYE ","M87N2TAZE ", & + "M87N2TDXSS","M87N2TDYSS","M87N2TDZSS","M87N3FKXE ","M87N3FKYE ","M87N3FKZE ","M87N3FMXE ", & + "M87N3FMYE ","M87N3FMZE ","M87N3MKXE ","M87N3MKYE ","M87N3MKZE ","M87N3MMXE ","M87N3MMYE ", & + "M87N3MMZE ","M87N3RAXE ","M87N3RAYE ","M87N3RAZE ","M87N3RDXE ","M87N3RDYE ","M87N3RDZE ", & + "M87N3TAXE ","M87N3TAYE ","M87N3TAZE ","M87N3TDXSS","M87N3TDYSS","M87N3TDZSS","M87N4FKXE ", & + "M87N4FKYE ","M87N4FKZE ","M87N4FMXE ","M87N4FMYE ","M87N4FMZE ","M87N4MKXE ","M87N4MKYE ", & + "M87N4MKZE ","M87N4MMXE ","M87N4MMYE ","M87N4MMZE ","M87N4RAXE ","M87N4RAYE ","M87N4RAZE ", & + "M87N4RDXE ","M87N4RDYE ","M87N4RDZE ","M87N4TAXE ","M87N4TAYE ","M87N4TAZE ","M87N4TDXSS", & + "M87N4TDYSS","M87N4TDZSS","M87N5FKXE ","M87N5FKYE ","M87N5FKZE ","M87N5FMXE ","M87N5FMYE ", & + "M87N5FMZE ","M87N5MKXE ","M87N5MKYE ","M87N5MKZE ","M87N5MMXE ","M87N5MMYE ","M87N5MMZE ", & + "M87N5RAXE ","M87N5RAYE ","M87N5RAZE ","M87N5RDXE ","M87N5RDYE ","M87N5RDZE ","M87N5TAXE ", & + "M87N5TAYE ","M87N5TAZE ","M87N5TDXSS","M87N5TDYSS","M87N5TDZSS","M87N6FKXE ","M87N6FKYE ", & + "M87N6FKZE ","M87N6FMXE ","M87N6FMYE ","M87N6FMZE ","M87N6MKXE ","M87N6MKYE ","M87N6MKZE ", & + "M87N6MMXE ","M87N6MMYE ","M87N6MMZE ","M87N6RAXE ","M87N6RAYE ","M87N6RAZE ","M87N6RDXE ", & + "M87N6RDYE ","M87N6RDZE ","M87N6TAXE ","M87N6TAYE ","M87N6TAZE ","M87N6TDXSS","M87N6TDYSS", & + "M87N6TDZSS","M87N7FKXE ","M87N7FKYE ","M87N7FKZE ","M87N7FMXE ","M87N7FMYE ","M87N7FMZE ", & + "M87N7MKXE ","M87N7MKYE ","M87N7MKZE ","M87N7MMXE ","M87N7MMYE ","M87N7MMZE ","M87N7RAXE ", & + "M87N7RAYE ","M87N7RAZE ","M87N7RDXE ","M87N7RDYE ","M87N7RDZE ","M87N7TAXE ","M87N7TAYE ", & + "M87N7TAZE ","M87N7TDXSS","M87N7TDYSS","M87N7TDZSS","M87N8FKXE ","M87N8FKYE ","M87N8FKZE ", & + "M87N8FMXE ","M87N8FMYE ","M87N8FMZE ","M87N8MKXE ","M87N8MKYE ","M87N8MKZE ","M87N8MMXE ", & + "M87N8MMYE ","M87N8MMZE ","M87N8RAXE ","M87N8RAYE ","M87N8RAZE ","M87N8RDXE ","M87N8RDYE ", & + "M87N8RDZE ","M87N8TAXE ","M87N8TAYE ","M87N8TAZE ","M87N8TDXSS","M87N8TDYSS","M87N8TDZSS", & + "M87N9FKXE ","M87N9FKYE ","M87N9FKZE ","M87N9FMXE ","M87N9FMYE ","M87N9FMZE ","M87N9MKXE ", & + "M87N9MKYE ","M87N9MKZE ","M87N9MMXE ","M87N9MMYE ","M87N9MMZE ","M87N9RAXE ","M87N9RAYE ", & + "M87N9RAZE ","M87N9RDXE ","M87N9RDYE ","M87N9RDZE ","M87N9TAXE ","M87N9TAYE ","M87N9TAZE ", & + "M87N9TDXSS","M87N9TDYSS","M87N9TDZSS","M88N1FKXE ","M88N1FKYE ","M88N1FKZE ","M88N1FMXE ", & + "M88N1FMYE ","M88N1FMZE ","M88N1MKXE ","M88N1MKYE ","M88N1MKZE ","M88N1MMXE ","M88N1MMYE ", & + "M88N1MMZE ","M88N1RAXE ","M88N1RAYE ","M88N1RAZE ","M88N1RDXE ","M88N1RDYE ","M88N1RDZE ", & + "M88N1TAXE ","M88N1TAYE ","M88N1TAZE ","M88N1TDXSS","M88N1TDYSS","M88N1TDZSS","M88N2FKXE ", & + "M88N2FKYE ","M88N2FKZE ","M88N2FMXE ","M88N2FMYE ","M88N2FMZE ","M88N2MKXE ","M88N2MKYE ", & + "M88N2MKZE ","M88N2MMXE ","M88N2MMYE ","M88N2MMZE ","M88N2RAXE ","M88N2RAYE ","M88N2RAZE ", & + "M88N2RDXE ","M88N2RDYE ","M88N2RDZE ","M88N2TAXE ","M88N2TAYE ","M88N2TAZE ","M88N2TDXSS", & + "M88N2TDYSS","M88N2TDZSS","M88N3FKXE ","M88N3FKYE ","M88N3FKZE ","M88N3FMXE ","M88N3FMYE ", & + "M88N3FMZE ","M88N3MKXE ","M88N3MKYE ","M88N3MKZE ","M88N3MMXE ","M88N3MMYE ","M88N3MMZE ", & + "M88N3RAXE ","M88N3RAYE ","M88N3RAZE ","M88N3RDXE ","M88N3RDYE ","M88N3RDZE ","M88N3TAXE ", & + "M88N3TAYE ","M88N3TAZE ","M88N3TDXSS","M88N3TDYSS","M88N3TDZSS","M88N4FKXE ","M88N4FKYE ", & + "M88N4FKZE ","M88N4FMXE ","M88N4FMYE ","M88N4FMZE ","M88N4MKXE ","M88N4MKYE ","M88N4MKZE ", & + "M88N4MMXE ","M88N4MMYE ","M88N4MMZE ","M88N4RAXE ","M88N4RAYE ","M88N4RAZE ","M88N4RDXE ", & + "M88N4RDYE ","M88N4RDZE ","M88N4TAXE ","M88N4TAYE ","M88N4TAZE ","M88N4TDXSS","M88N4TDYSS", & + "M88N4TDZSS","M88N5FKXE ","M88N5FKYE ","M88N5FKZE ","M88N5FMXE ","M88N5FMYE ","M88N5FMZE ", & + "M88N5MKXE ","M88N5MKYE ","M88N5MKZE ","M88N5MMXE ","M88N5MMYE ","M88N5MMZE ","M88N5RAXE ", & + "M88N5RAYE ","M88N5RAZE ","M88N5RDXE ","M88N5RDYE ","M88N5RDZE ","M88N5TAXE ","M88N5TAYE ", & + "M88N5TAZE ","M88N5TDXSS","M88N5TDYSS","M88N5TDZSS","M88N6FKXE ","M88N6FKYE ","M88N6FKZE ", & + "M88N6FMXE ","M88N6FMYE ","M88N6FMZE ","M88N6MKXE ","M88N6MKYE ","M88N6MKZE ","M88N6MMXE ", & + "M88N6MMYE ","M88N6MMZE ","M88N6RAXE ","M88N6RAYE ","M88N6RAZE ","M88N6RDXE ","M88N6RDYE ", & + "M88N6RDZE ","M88N6TAXE ","M88N6TAYE ","M88N6TAZE ","M88N6TDXSS","M88N6TDYSS","M88N6TDZSS", & + "M88N7FKXE ","M88N7FKYE ","M88N7FKZE ","M88N7FMXE ","M88N7FMYE ","M88N7FMZE ","M88N7MKXE ", & + "M88N7MKYE ","M88N7MKZE ","M88N7MMXE ","M88N7MMYE ","M88N7MMZE ","M88N7RAXE ","M88N7RAYE ", & + "M88N7RAZE ","M88N7RDXE ","M88N7RDYE ","M88N7RDZE ","M88N7TAXE ","M88N7TAYE ","M88N7TAZE ", & + "M88N7TDXSS","M88N7TDYSS","M88N7TDZSS","M88N8FKXE ","M88N8FKYE ","M88N8FKZE ","M88N8FMXE ", & + "M88N8FMYE ","M88N8FMZE ","M88N8MKXE ","M88N8MKYE ","M88N8MKZE ","M88N8MMXE ","M88N8MMYE ", & + "M88N8MMZE ","M88N8RAXE ","M88N8RAYE ","M88N8RAZE ","M88N8RDXE ","M88N8RDYE ","M88N8RDZE ", & + "M88N8TAXE ","M88N8TAYE ","M88N8TAZE ","M88N8TDXSS","M88N8TDYSS","M88N8TDZSS","M88N9FKXE ", & + "M88N9FKYE ","M88N9FKZE ","M88N9FMXE ","M88N9FMYE ","M88N9FMZE ","M88N9MKXE ","M88N9MKYE ", & + "M88N9MKZE ","M88N9MMXE ","M88N9MMYE ","M88N9MMZE ","M88N9RAXE ","M88N9RAYE ","M88N9RAZE ", & + "M88N9RDXE ","M88N9RDYE ","M88N9RDZE ","M88N9TAXE ","M88N9TAYE ","M88N9TAZE ","M88N9TDXSS", & + "M88N9TDYSS","M88N9TDZSS","M89N1FKXE ","M89N1FKYE ","M89N1FKZE ","M89N1FMXE ","M89N1FMYE ", & + "M89N1FMZE ","M89N1MKXE ","M89N1MKYE ","M89N1MKZE ","M89N1MMXE ","M89N1MMYE ","M89N1MMZE ", & + "M89N1RAXE ","M89N1RAYE ","M89N1RAZE ","M89N1RDXE ","M89N1RDYE ","M89N1RDZE ","M89N1TAXE ", & + "M89N1TAYE ","M89N1TAZE ","M89N1TDXSS","M89N1TDYSS","M89N1TDZSS","M89N2FKXE ","M89N2FKYE ", & + "M89N2FKZE ","M89N2FMXE ","M89N2FMYE ","M89N2FMZE ","M89N2MKXE ","M89N2MKYE ","M89N2MKZE ", & + "M89N2MMXE ","M89N2MMYE ","M89N2MMZE ","M89N2RAXE ","M89N2RAYE ","M89N2RAZE ","M89N2RDXE ", & + "M89N2RDYE ","M89N2RDZE ","M89N2TAXE ","M89N2TAYE ","M89N2TAZE ","M89N2TDXSS","M89N2TDYSS", & + "M89N2TDZSS","M89N3FKXE ","M89N3FKYE ","M89N3FKZE ","M89N3FMXE ","M89N3FMYE ","M89N3FMZE ", & + "M89N3MKXE ","M89N3MKYE ","M89N3MKZE ","M89N3MMXE ","M89N3MMYE ","M89N3MMZE ","M89N3RAXE ", & + "M89N3RAYE ","M89N3RAZE ","M89N3RDXE ","M89N3RDYE ","M89N3RDZE ","M89N3TAXE ","M89N3TAYE ", & + "M89N3TAZE ","M89N3TDXSS","M89N3TDYSS","M89N3TDZSS","M89N4FKXE ","M89N4FKYE ","M89N4FKZE ", & + "M89N4FMXE ","M89N4FMYE ","M89N4FMZE ","M89N4MKXE ","M89N4MKYE ","M89N4MKZE ","M89N4MMXE ", & + "M89N4MMYE ","M89N4MMZE ","M89N4RAXE ","M89N4RAYE ","M89N4RAZE ","M89N4RDXE ","M89N4RDYE ", & + "M89N4RDZE ","M89N4TAXE ","M89N4TAYE ","M89N4TAZE ","M89N4TDXSS","M89N4TDYSS","M89N4TDZSS", & + "M89N5FKXE ","M89N5FKYE ","M89N5FKZE ","M89N5FMXE ","M89N5FMYE ","M89N5FMZE ","M89N5MKXE ", & + "M89N5MKYE ","M89N5MKZE ","M89N5MMXE ","M89N5MMYE ","M89N5MMZE ","M89N5RAXE ","M89N5RAYE ", & + "M89N5RAZE ","M89N5RDXE ","M89N5RDYE ","M89N5RDZE ","M89N5TAXE ","M89N5TAYE ","M89N5TAZE ", & + "M89N5TDXSS","M89N5TDYSS","M89N5TDZSS","M89N6FKXE ","M89N6FKYE ","M89N6FKZE ","M89N6FMXE ", & + "M89N6FMYE ","M89N6FMZE ","M89N6MKXE ","M89N6MKYE ","M89N6MKZE ","M89N6MMXE ","M89N6MMYE ", & + "M89N6MMZE ","M89N6RAXE ","M89N6RAYE ","M89N6RAZE ","M89N6RDXE ","M89N6RDYE ","M89N6RDZE ", & + "M89N6TAXE ","M89N6TAYE ","M89N6TAZE ","M89N6TDXSS","M89N6TDYSS","M89N6TDZSS","M89N7FKXE ", & + "M89N7FKYE ","M89N7FKZE ","M89N7FMXE ","M89N7FMYE ","M89N7FMZE ","M89N7MKXE ","M89N7MKYE ", & + "M89N7MKZE ","M89N7MMXE ","M89N7MMYE ","M89N7MMZE ","M89N7RAXE ","M89N7RAYE ","M89N7RAZE ", & + "M89N7RDXE ","M89N7RDYE ","M89N7RDZE ","M89N7TAXE ","M89N7TAYE ","M89N7TAZE ","M89N7TDXSS", & + "M89N7TDYSS","M89N7TDZSS","M89N8FKXE ","M89N8FKYE ","M89N8FKZE ","M89N8FMXE ","M89N8FMYE ", & + "M89N8FMZE ","M89N8MKXE ","M89N8MKYE ","M89N8MKZE ","M89N8MMXE ","M89N8MMYE ","M89N8MMZE ", & + "M89N8RAXE ","M89N8RAYE ","M89N8RAZE ","M89N8RDXE ","M89N8RDYE ","M89N8RDZE ","M89N8TAXE ", & + "M89N8TAYE ","M89N8TAZE ","M89N8TDXSS","M89N8TDYSS","M89N8TDZSS","M89N9FKXE ","M89N9FKYE ", & + "M89N9FKZE ","M89N9FMXE ","M89N9FMYE ","M89N9FMZE ","M89N9MKXE ","M89N9MKYE ","M89N9MKZE ", & + "M89N9MMXE ","M89N9MMYE ","M89N9MMZE ","M89N9RAXE ","M89N9RAYE ","M89N9RAZE ","M89N9RDXE ", & + "M89N9RDYE ","M89N9RDZE ","M89N9TAXE ","M89N9TAYE ","M89N9TAZE ","M89N9TDXSS","M89N9TDYSS", & + "M89N9TDZSS","M90N1FKXE ","M90N1FKYE ","M90N1FKZE ","M90N1FMXE ","M90N1FMYE ","M90N1FMZE ", & + "M90N1MKXE ","M90N1MKYE ","M90N1MKZE ","M90N1MMXE ","M90N1MMYE ","M90N1MMZE ","M90N1RAXE ", & + "M90N1RAYE ","M90N1RAZE ","M90N1RDXE ","M90N1RDYE ","M90N1RDZE ","M90N1TAXE ","M90N1TAYE ", & + "M90N1TAZE ","M90N1TDXSS","M90N1TDYSS","M90N1TDZSS","M90N2FKXE ","M90N2FKYE ","M90N2FKZE ", & + "M90N2FMXE ","M90N2FMYE ","M90N2FMZE ","M90N2MKXE ","M90N2MKYE ","M90N2MKZE ","M90N2MMXE ", & + "M90N2MMYE ","M90N2MMZE ","M90N2RAXE ","M90N2RAYE ","M90N2RAZE ","M90N2RDXE ","M90N2RDYE ", & + "M90N2RDZE ","M90N2TAXE ","M90N2TAYE ","M90N2TAZE ","M90N2TDXSS","M90N2TDYSS","M90N2TDZSS", & + "M90N3FKXE ","M90N3FKYE ","M90N3FKZE ","M90N3FMXE ","M90N3FMYE ","M90N3FMZE ","M90N3MKXE ", & + "M90N3MKYE ","M90N3MKZE ","M90N3MMXE ","M90N3MMYE ","M90N3MMZE ","M90N3RAXE ","M90N3RAYE ", & + "M90N3RAZE ","M90N3RDXE ","M90N3RDYE ","M90N3RDZE ","M90N3TAXE ","M90N3TAYE ","M90N3TAZE ", & + "M90N3TDXSS","M90N3TDYSS","M90N3TDZSS","M90N4FKXE ","M90N4FKYE ","M90N4FKZE ","M90N4FMXE ", & + "M90N4FMYE ","M90N4FMZE ","M90N4MKXE ","M90N4MKYE ","M90N4MKZE ","M90N4MMXE ","M90N4MMYE ", & + "M90N4MMZE ","M90N4RAXE ","M90N4RAYE ","M90N4RAZE ","M90N4RDXE ","M90N4RDYE ","M90N4RDZE ", & + "M90N4TAXE ","M90N4TAYE ","M90N4TAZE ","M90N4TDXSS","M90N4TDYSS","M90N4TDZSS","M90N5FKXE ", & + "M90N5FKYE ","M90N5FKZE ","M90N5FMXE ","M90N5FMYE ","M90N5FMZE ","M90N5MKXE ","M90N5MKYE ", & + "M90N5MKZE ","M90N5MMXE ","M90N5MMYE ","M90N5MMZE ","M90N5RAXE ","M90N5RAYE ","M90N5RAZE ", & + "M90N5RDXE ","M90N5RDYE ","M90N5RDZE ","M90N5TAXE ","M90N5TAYE ","M90N5TAZE ","M90N5TDXSS", & + "M90N5TDYSS","M90N5TDZSS","M90N6FKXE ","M90N6FKYE ","M90N6FKZE ","M90N6FMXE ","M90N6FMYE ", & + "M90N6FMZE ","M90N6MKXE ","M90N6MKYE ","M90N6MKZE ","M90N6MMXE ","M90N6MMYE ","M90N6MMZE ", & + "M90N6RAXE ","M90N6RAYE ","M90N6RAZE ","M90N6RDXE ","M90N6RDYE ","M90N6RDZE ","M90N6TAXE ", & + "M90N6TAYE ","M90N6TAZE ","M90N6TDXSS","M90N6TDYSS","M90N6TDZSS","M90N7FKXE ","M90N7FKYE ", & + "M90N7FKZE ","M90N7FMXE ","M90N7FMYE ","M90N7FMZE ","M90N7MKXE ","M90N7MKYE ","M90N7MKZE ", & + "M90N7MMXE ","M90N7MMYE ","M90N7MMZE ","M90N7RAXE ","M90N7RAYE ","M90N7RAZE ","M90N7RDXE ", & + "M90N7RDYE ","M90N7RDZE ","M90N7TAXE ","M90N7TAYE ","M90N7TAZE ","M90N7TDXSS","M90N7TDYSS", & + "M90N7TDZSS","M90N8FKXE ","M90N8FKYE ","M90N8FKZE ","M90N8FMXE ","M90N8FMYE ","M90N8FMZE ", & + "M90N8MKXE ","M90N8MKYE ","M90N8MKZE ","M90N8MMXE ","M90N8MMYE ","M90N8MMZE ","M90N8RAXE ", & + "M90N8RAYE ","M90N8RAZE ","M90N8RDXE ","M90N8RDYE ","M90N8RDZE ","M90N8TAXE ","M90N8TAYE ", & + "M90N8TAZE ","M90N8TDXSS","M90N8TDYSS","M90N8TDZSS","M90N9FKXE ","M90N9FKYE ","M90N9FKZE ", & + "M90N9FMXE ","M90N9FMYE ","M90N9FMZE ","M90N9MKXE ","M90N9MKYE ","M90N9MKZE ","M90N9MMXE ", & + "M90N9MMYE ","M90N9MMZE ","M90N9RAXE ","M90N9RAYE ","M90N9RAZE ","M90N9RDXE ","M90N9RDYE ", & + "M90N9RDZE ","M90N9TAXE ","M90N9TAYE ","M90N9TAZE ","M90N9TDXSS","M90N9TDYSS","M90N9TDZSS", & + "M91N1FKXE ","M91N1FKYE ","M91N1FKZE ","M91N1FMXE ","M91N1FMYE ","M91N1FMZE ","M91N1MKXE ", & + "M91N1MKYE ","M91N1MKZE ","M91N1MMXE ","M91N1MMYE ","M91N1MMZE ","M91N1RAXE ","M91N1RAYE ", & + "M91N1RAZE ","M91N1RDXE ","M91N1RDYE ","M91N1RDZE ","M91N1TAXE ","M91N1TAYE ","M91N1TAZE ", & + "M91N1TDXSS","M91N1TDYSS","M91N1TDZSS","M91N2FKXE ","M91N2FKYE ","M91N2FKZE ","M91N2FMXE ", & + "M91N2FMYE ","M91N2FMZE ","M91N2MKXE ","M91N2MKYE ","M91N2MKZE ","M91N2MMXE ","M91N2MMYE ", & + "M91N2MMZE ","M91N2RAXE ","M91N2RAYE ","M91N2RAZE ","M91N2RDXE ","M91N2RDYE ","M91N2RDZE ", & + "M91N2TAXE ","M91N2TAYE ","M91N2TAZE ","M91N2TDXSS","M91N2TDYSS","M91N2TDZSS","M91N3FKXE ", & + "M91N3FKYE ","M91N3FKZE ","M91N3FMXE ","M91N3FMYE ","M91N3FMZE ","M91N3MKXE ","M91N3MKYE ", & + "M91N3MKZE ","M91N3MMXE ","M91N3MMYE ","M91N3MMZE ","M91N3RAXE ","M91N3RAYE ","M91N3RAZE ", & + "M91N3RDXE ","M91N3RDYE ","M91N3RDZE ","M91N3TAXE ","M91N3TAYE ","M91N3TAZE ","M91N3TDXSS", & + "M91N3TDYSS","M91N3TDZSS","M91N4FKXE ","M91N4FKYE ","M91N4FKZE ","M91N4FMXE ","M91N4FMYE ", & + "M91N4FMZE ","M91N4MKXE ","M91N4MKYE ","M91N4MKZE ","M91N4MMXE ","M91N4MMYE ","M91N4MMZE ", & + "M91N4RAXE ","M91N4RAYE ","M91N4RAZE ","M91N4RDXE ","M91N4RDYE ","M91N4RDZE ","M91N4TAXE ", & + "M91N4TAYE ","M91N4TAZE ","M91N4TDXSS","M91N4TDYSS","M91N4TDZSS","M91N5FKXE ","M91N5FKYE ", & + "M91N5FKZE ","M91N5FMXE ","M91N5FMYE ","M91N5FMZE ","M91N5MKXE ","M91N5MKYE ","M91N5MKZE ", & + "M91N5MMXE ","M91N5MMYE ","M91N5MMZE ","M91N5RAXE ","M91N5RAYE ","M91N5RAZE ","M91N5RDXE ", & + "M91N5RDYE ","M91N5RDZE ","M91N5TAXE ","M91N5TAYE ","M91N5TAZE ","M91N5TDXSS","M91N5TDYSS", & + "M91N5TDZSS","M91N6FKXE ","M91N6FKYE ","M91N6FKZE ","M91N6FMXE ","M91N6FMYE ","M91N6FMZE ", & + "M91N6MKXE ","M91N6MKYE ","M91N6MKZE ","M91N6MMXE ","M91N6MMYE ","M91N6MMZE ","M91N6RAXE ", & + "M91N6RAYE ","M91N6RAZE ","M91N6RDXE ","M91N6RDYE ","M91N6RDZE ","M91N6TAXE ","M91N6TAYE ", & + "M91N6TAZE ","M91N6TDXSS","M91N6TDYSS","M91N6TDZSS","M91N7FKXE ","M91N7FKYE ","M91N7FKZE ", & + "M91N7FMXE ","M91N7FMYE ","M91N7FMZE ","M91N7MKXE ","M91N7MKYE ","M91N7MKZE ","M91N7MMXE ", & + "M91N7MMYE ","M91N7MMZE ","M91N7RAXE ","M91N7RAYE ","M91N7RAZE ","M91N7RDXE ","M91N7RDYE ", & + "M91N7RDZE ","M91N7TAXE ","M91N7TAYE ","M91N7TAZE ","M91N7TDXSS","M91N7TDYSS","M91N7TDZSS", & + "M91N8FKXE ","M91N8FKYE ","M91N8FKZE ","M91N8FMXE ","M91N8FMYE ","M91N8FMZE ","M91N8MKXE ", & + "M91N8MKYE ","M91N8MKZE ","M91N8MMXE ","M91N8MMYE ","M91N8MMZE ","M91N8RAXE ","M91N8RAYE ", & + "M91N8RAZE ","M91N8RDXE ","M91N8RDYE ","M91N8RDZE ","M91N8TAXE ","M91N8TAYE ","M91N8TAZE ", & + "M91N8TDXSS","M91N8TDYSS","M91N8TDZSS","M91N9FKXE ","M91N9FKYE ","M91N9FKZE ","M91N9FMXE ", & + "M91N9FMYE ","M91N9FMZE ","M91N9MKXE ","M91N9MKYE ","M91N9MKZE ","M91N9MMXE ","M91N9MMYE ", & + "M91N9MMZE ","M91N9RAXE ","M91N9RAYE ","M91N9RAZE ","M91N9RDXE ","M91N9RDYE ","M91N9RDZE ", & + "M91N9TAXE ","M91N9TAYE ","M91N9TAZE ","M91N9TDXSS","M91N9TDYSS","M91N9TDZSS","M92N1FKXE ", & + "M92N1FKYE ","M92N1FKZE ","M92N1FMXE ","M92N1FMYE ","M92N1FMZE ","M92N1MKXE ","M92N1MKYE ", & + "M92N1MKZE ","M92N1MMXE ","M92N1MMYE ","M92N1MMZE ","M92N1RAXE ","M92N1RAYE ","M92N1RAZE ", & + "M92N1RDXE ","M92N1RDYE ","M92N1RDZE ","M92N1TAXE ","M92N1TAYE ","M92N1TAZE ","M92N1TDXSS", & + "M92N1TDYSS","M92N1TDZSS","M92N2FKXE ","M92N2FKYE ","M92N2FKZE ","M92N2FMXE ","M92N2FMYE ", & + "M92N2FMZE ","M92N2MKXE ","M92N2MKYE ","M92N2MKZE ","M92N2MMXE ","M92N2MMYE ","M92N2MMZE ", & + "M92N2RAXE ","M92N2RAYE ","M92N2RAZE ","M92N2RDXE ","M92N2RDYE ","M92N2RDZE ","M92N2TAXE ", & + "M92N2TAYE ","M92N2TAZE ","M92N2TDXSS","M92N2TDYSS","M92N2TDZSS","M92N3FKXE ","M92N3FKYE ", & + "M92N3FKZE ","M92N3FMXE ","M92N3FMYE ","M92N3FMZE ","M92N3MKXE ","M92N3MKYE ","M92N3MKZE ", & + "M92N3MMXE ","M92N3MMYE ","M92N3MMZE ","M92N3RAXE ","M92N3RAYE ","M92N3RAZE ","M92N3RDXE ", & + "M92N3RDYE ","M92N3RDZE ","M92N3TAXE ","M92N3TAYE ","M92N3TAZE ","M92N3TDXSS","M92N3TDYSS", & + "M92N3TDZSS","M92N4FKXE ","M92N4FKYE ","M92N4FKZE ","M92N4FMXE ","M92N4FMYE ","M92N4FMZE ", & + "M92N4MKXE ","M92N4MKYE ","M92N4MKZE ","M92N4MMXE ","M92N4MMYE ","M92N4MMZE ","M92N4RAXE ", & + "M92N4RAYE ","M92N4RAZE ","M92N4RDXE ","M92N4RDYE ","M92N4RDZE ","M92N4TAXE ","M92N4TAYE ", & + "M92N4TAZE ","M92N4TDXSS","M92N4TDYSS","M92N4TDZSS","M92N5FKXE ","M92N5FKYE ","M92N5FKZE ", & + "M92N5FMXE ","M92N5FMYE ","M92N5FMZE ","M92N5MKXE ","M92N5MKYE ","M92N5MKZE ","M92N5MMXE ", & + "M92N5MMYE ","M92N5MMZE ","M92N5RAXE ","M92N5RAYE ","M92N5RAZE ","M92N5RDXE ","M92N5RDYE ", & + "M92N5RDZE ","M92N5TAXE ","M92N5TAYE ","M92N5TAZE ","M92N5TDXSS","M92N5TDYSS","M92N5TDZSS", & + "M92N6FKXE ","M92N6FKYE ","M92N6FKZE ","M92N6FMXE ","M92N6FMYE ","M92N6FMZE ","M92N6MKXE ", & + "M92N6MKYE ","M92N6MKZE ","M92N6MMXE ","M92N6MMYE ","M92N6MMZE ","M92N6RAXE ","M92N6RAYE ", & + "M92N6RAZE ","M92N6RDXE ","M92N6RDYE ","M92N6RDZE ","M92N6TAXE ","M92N6TAYE ","M92N6TAZE ", & + "M92N6TDXSS","M92N6TDYSS","M92N6TDZSS","M92N7FKXE ","M92N7FKYE ","M92N7FKZE ","M92N7FMXE ", & + "M92N7FMYE ","M92N7FMZE ","M92N7MKXE ","M92N7MKYE ","M92N7MKZE ","M92N7MMXE ","M92N7MMYE ", & + "M92N7MMZE ","M92N7RAXE ","M92N7RAYE ","M92N7RAZE ","M92N7RDXE ","M92N7RDYE ","M92N7RDZE ", & + "M92N7TAXE ","M92N7TAYE ","M92N7TAZE ","M92N7TDXSS","M92N7TDYSS","M92N7TDZSS","M92N8FKXE ", & + "M92N8FKYE ","M92N8FKZE ","M92N8FMXE ","M92N8FMYE ","M92N8FMZE ","M92N8MKXE ","M92N8MKYE ", & + "M92N8MKZE ","M92N8MMXE ","M92N8MMYE ","M92N8MMZE ","M92N8RAXE ","M92N8RAYE ","M92N8RAZE ", & + "M92N8RDXE ","M92N8RDYE ","M92N8RDZE ","M92N8TAXE ","M92N8TAYE ","M92N8TAZE ","M92N8TDXSS", & + "M92N8TDYSS","M92N8TDZSS","M92N9FKXE ","M92N9FKYE ","M92N9FKZE ","M92N9FMXE ","M92N9FMYE ", & + "M92N9FMZE ","M92N9MKXE ","M92N9MKYE ","M92N9MKZE ","M92N9MMXE ","M92N9MMYE ","M92N9MMZE ", & + "M92N9RAXE ","M92N9RAYE ","M92N9RAZE ","M92N9RDXE ","M92N9RDYE ","M92N9RDZE ","M92N9TAXE ", & + "M92N9TAYE ","M92N9TAZE ","M92N9TDXSS","M92N9TDYSS","M92N9TDZSS","M93N1FKXE ","M93N1FKYE ", & + "M93N1FKZE ","M93N1FMXE ","M93N1FMYE ","M93N1FMZE ","M93N1MKXE ","M93N1MKYE ","M93N1MKZE ", & + "M93N1MMXE ","M93N1MMYE ","M93N1MMZE ","M93N1RAXE ","M93N1RAYE ","M93N1RAZE ","M93N1RDXE ", & + "M93N1RDYE ","M93N1RDZE ","M93N1TAXE ","M93N1TAYE ","M93N1TAZE ","M93N1TDXSS","M93N1TDYSS", & + "M93N1TDZSS","M93N2FKXE ","M93N2FKYE ","M93N2FKZE ","M93N2FMXE ","M93N2FMYE ","M93N2FMZE ", & + "M93N2MKXE ","M93N2MKYE ","M93N2MKZE ","M93N2MMXE ","M93N2MMYE ","M93N2MMZE ","M93N2RAXE ", & + "M93N2RAYE ","M93N2RAZE ","M93N2RDXE ","M93N2RDYE ","M93N2RDZE ","M93N2TAXE ","M93N2TAYE ", & + "M93N2TAZE ","M93N2TDXSS","M93N2TDYSS","M93N2TDZSS","M93N3FKXE ","M93N3FKYE ","M93N3FKZE ", & + "M93N3FMXE ","M93N3FMYE ","M93N3FMZE ","M93N3MKXE ","M93N3MKYE ","M93N3MKZE ","M93N3MMXE ", & + "M93N3MMYE ","M93N3MMZE ","M93N3RAXE ","M93N3RAYE ","M93N3RAZE ","M93N3RDXE ","M93N3RDYE ", & + "M93N3RDZE ","M93N3TAXE ","M93N3TAYE ","M93N3TAZE ","M93N3TDXSS","M93N3TDYSS","M93N3TDZSS", & + "M93N4FKXE ","M93N4FKYE ","M93N4FKZE ","M93N4FMXE ","M93N4FMYE ","M93N4FMZE ","M93N4MKXE ", & + "M93N4MKYE ","M93N4MKZE ","M93N4MMXE ","M93N4MMYE ","M93N4MMZE ","M93N4RAXE ","M93N4RAYE ", & + "M93N4RAZE ","M93N4RDXE ","M93N4RDYE ","M93N4RDZE ","M93N4TAXE ","M93N4TAYE ","M93N4TAZE ", & + "M93N4TDXSS","M93N4TDYSS","M93N4TDZSS","M93N5FKXE ","M93N5FKYE ","M93N5FKZE ","M93N5FMXE ", & + "M93N5FMYE ","M93N5FMZE ","M93N5MKXE ","M93N5MKYE ","M93N5MKZE ","M93N5MMXE ","M93N5MMYE ", & + "M93N5MMZE ","M93N5RAXE ","M93N5RAYE ","M93N5RAZE ","M93N5RDXE ","M93N5RDYE ","M93N5RDZE ", & + "M93N5TAXE ","M93N5TAYE ","M93N5TAZE ","M93N5TDXSS","M93N5TDYSS","M93N5TDZSS","M93N6FKXE ", & + "M93N6FKYE ","M93N6FKZE ","M93N6FMXE ","M93N6FMYE ","M93N6FMZE ","M93N6MKXE ","M93N6MKYE ", & + "M93N6MKZE ","M93N6MMXE ","M93N6MMYE ","M93N6MMZE ","M93N6RAXE ","M93N6RAYE ","M93N6RAZE ", & + "M93N6RDXE ","M93N6RDYE ","M93N6RDZE ","M93N6TAXE ","M93N6TAYE ","M93N6TAZE ","M93N6TDXSS", & + "M93N6TDYSS","M93N6TDZSS","M93N7FKXE ","M93N7FKYE ","M93N7FKZE ","M93N7FMXE ","M93N7FMYE ", & + "M93N7FMZE ","M93N7MKXE ","M93N7MKYE ","M93N7MKZE ","M93N7MMXE ","M93N7MMYE ","M93N7MMZE "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry13(1677) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + "M93N7RAXE ","M93N7RAYE ","M93N7RAZE ","M93N7RDXE ","M93N7RDYE ","M93N7RDZE ","M93N7TAXE ", & + "M93N7TAYE ","M93N7TAZE ","M93N7TDXSS","M93N7TDYSS","M93N7TDZSS","M93N8FKXE ","M93N8FKYE ", & + "M93N8FKZE ","M93N8FMXE ","M93N8FMYE ","M93N8FMZE ","M93N8MKXE ","M93N8MKYE ","M93N8MKZE ", & + "M93N8MMXE ","M93N8MMYE ","M93N8MMZE ","M93N8RAXE ","M93N8RAYE ","M93N8RAZE ","M93N8RDXE ", & + "M93N8RDYE ","M93N8RDZE ","M93N8TAXE ","M93N8TAYE ","M93N8TAZE ","M93N8TDXSS","M93N8TDYSS", & + "M93N8TDZSS","M93N9FKXE ","M93N9FKYE ","M93N9FKZE ","M93N9FMXE ","M93N9FMYE ","M93N9FMZE ", & + "M93N9MKXE ","M93N9MKYE ","M93N9MKZE ","M93N9MMXE ","M93N9MMYE ","M93N9MMZE ","M93N9RAXE ", & + "M93N9RAYE ","M93N9RAZE ","M93N9RDXE ","M93N9RDYE ","M93N9RDZE ","M93N9TAXE ","M93N9TAYE ", & + "M93N9TAZE ","M93N9TDXSS","M93N9TDYSS","M93N9TDZSS","M94N1FKXE ","M94N1FKYE ","M94N1FKZE ", & + "M94N1FMXE ","M94N1FMYE ","M94N1FMZE ","M94N1MKXE ","M94N1MKYE ","M94N1MKZE ","M94N1MMXE ", & + "M94N1MMYE ","M94N1MMZE ","M94N1RAXE ","M94N1RAYE ","M94N1RAZE ","M94N1RDXE ","M94N1RDYE ", & + "M94N1RDZE ","M94N1TAXE ","M94N1TAYE ","M94N1TAZE ","M94N1TDXSS","M94N1TDYSS","M94N1TDZSS", & + "M94N2FKXE ","M94N2FKYE ","M94N2FKZE ","M94N2FMXE ","M94N2FMYE ","M94N2FMZE ","M94N2MKXE ", & + "M94N2MKYE ","M94N2MKZE ","M94N2MMXE ","M94N2MMYE ","M94N2MMZE ","M94N2RAXE ","M94N2RAYE ", & + "M94N2RAZE ","M94N2RDXE ","M94N2RDYE ","M94N2RDZE ","M94N2TAXE ","M94N2TAYE ","M94N2TAZE ", & + "M94N2TDXSS","M94N2TDYSS","M94N2TDZSS","M94N3FKXE ","M94N3FKYE ","M94N3FKZE ","M94N3FMXE ", & + "M94N3FMYE ","M94N3FMZE ","M94N3MKXE ","M94N3MKYE ","M94N3MKZE ","M94N3MMXE ","M94N3MMYE ", & + "M94N3MMZE ","M94N3RAXE ","M94N3RAYE ","M94N3RAZE ","M94N3RDXE ","M94N3RDYE ","M94N3RDZE ", & + "M94N3TAXE ","M94N3TAYE ","M94N3TAZE ","M94N3TDXSS","M94N3TDYSS","M94N3TDZSS","M94N4FKXE ", & + "M94N4FKYE ","M94N4FKZE ","M94N4FMXE ","M94N4FMYE ","M94N4FMZE ","M94N4MKXE ","M94N4MKYE ", & + "M94N4MKZE ","M94N4MMXE ","M94N4MMYE ","M94N4MMZE ","M94N4RAXE ","M94N4RAYE ","M94N4RAZE ", & + "M94N4RDXE ","M94N4RDYE ","M94N4RDZE ","M94N4TAXE ","M94N4TAYE ","M94N4TAZE ","M94N4TDXSS", & + "M94N4TDYSS","M94N4TDZSS","M94N5FKXE ","M94N5FKYE ","M94N5FKZE ","M94N5FMXE ","M94N5FMYE ", & + "M94N5FMZE ","M94N5MKXE ","M94N5MKYE ","M94N5MKZE ","M94N5MMXE ","M94N5MMYE ","M94N5MMZE ", & + "M94N5RAXE ","M94N5RAYE ","M94N5RAZE ","M94N5RDXE ","M94N5RDYE ","M94N5RDZE ","M94N5TAXE ", & + "M94N5TAYE ","M94N5TAZE ","M94N5TDXSS","M94N5TDYSS","M94N5TDZSS","M94N6FKXE ","M94N6FKYE ", & + "M94N6FKZE ","M94N6FMXE ","M94N6FMYE ","M94N6FMZE ","M94N6MKXE ","M94N6MKYE ","M94N6MKZE ", & + "M94N6MMXE ","M94N6MMYE ","M94N6MMZE ","M94N6RAXE ","M94N6RAYE ","M94N6RAZE ","M94N6RDXE ", & + "M94N6RDYE ","M94N6RDZE ","M94N6TAXE ","M94N6TAYE ","M94N6TAZE ","M94N6TDXSS","M94N6TDYSS", & + "M94N6TDZSS","M94N7FKXE ","M94N7FKYE ","M94N7FKZE ","M94N7FMXE ","M94N7FMYE ","M94N7FMZE ", & + "M94N7MKXE ","M94N7MKYE ","M94N7MKZE ","M94N7MMXE ","M94N7MMYE ","M94N7MMZE ","M94N7RAXE ", & + "M94N7RAYE ","M94N7RAZE ","M94N7RDXE ","M94N7RDYE ","M94N7RDZE ","M94N7TAXE ","M94N7TAYE ", & + "M94N7TAZE ","M94N7TDXSS","M94N7TDYSS","M94N7TDZSS","M94N8FKXE ","M94N8FKYE ","M94N8FKZE ", & + "M94N8FMXE ","M94N8FMYE ","M94N8FMZE ","M94N8MKXE ","M94N8MKYE ","M94N8MKZE ","M94N8MMXE ", & + "M94N8MMYE ","M94N8MMZE ","M94N8RAXE ","M94N8RAYE ","M94N8RAZE ","M94N8RDXE ","M94N8RDYE ", & + "M94N8RDZE ","M94N8TAXE ","M94N8TAYE ","M94N8TAZE ","M94N8TDXSS","M94N8TDYSS","M94N8TDZSS", & + "M94N9FKXE ","M94N9FKYE ","M94N9FKZE ","M94N9FMXE ","M94N9FMYE ","M94N9FMZE ","M94N9MKXE ", & + "M94N9MKYE ","M94N9MKZE ","M94N9MMXE ","M94N9MMYE ","M94N9MMZE ","M94N9RAXE ","M94N9RAYE ", & + "M94N9RAZE ","M94N9RDXE ","M94N9RDYE ","M94N9RDZE ","M94N9TAXE ","M94N9TAYE ","M94N9TAZE ", & + "M94N9TDXSS","M94N9TDYSS","M94N9TDZSS","M95N1FKXE ","M95N1FKYE ","M95N1FKZE ","M95N1FMXE ", & + "M95N1FMYE ","M95N1FMZE ","M95N1MKXE ","M95N1MKYE ","M95N1MKZE ","M95N1MMXE ","M95N1MMYE ", & + "M95N1MMZE ","M95N1RAXE ","M95N1RAYE ","M95N1RAZE ","M95N1RDXE ","M95N1RDYE ","M95N1RDZE ", & + "M95N1TAXE ","M95N1TAYE ","M95N1TAZE ","M95N1TDXSS","M95N1TDYSS","M95N1TDZSS","M95N2FKXE ", & + "M95N2FKYE ","M95N2FKZE ","M95N2FMXE ","M95N2FMYE ","M95N2FMZE ","M95N2MKXE ","M95N2MKYE ", & + "M95N2MKZE ","M95N2MMXE ","M95N2MMYE ","M95N2MMZE ","M95N2RAXE ","M95N2RAYE ","M95N2RAZE ", & + "M95N2RDXE ","M95N2RDYE ","M95N2RDZE ","M95N2TAXE ","M95N2TAYE ","M95N2TAZE ","M95N2TDXSS", & + "M95N2TDYSS","M95N2TDZSS","M95N3FKXE ","M95N3FKYE ","M95N3FKZE ","M95N3FMXE ","M95N3FMYE ", & + "M95N3FMZE ","M95N3MKXE ","M95N3MKYE ","M95N3MKZE ","M95N3MMXE ","M95N3MMYE ","M95N3MMZE ", & + "M95N3RAXE ","M95N3RAYE ","M95N3RAZE ","M95N3RDXE ","M95N3RDYE ","M95N3RDZE ","M95N3TAXE ", & + "M95N3TAYE ","M95N3TAZE ","M95N3TDXSS","M95N3TDYSS","M95N3TDZSS","M95N4FKXE ","M95N4FKYE ", & + "M95N4FKZE ","M95N4FMXE ","M95N4FMYE ","M95N4FMZE ","M95N4MKXE ","M95N4MKYE ","M95N4MKZE ", & + "M95N4MMXE ","M95N4MMYE ","M95N4MMZE ","M95N4RAXE ","M95N4RAYE ","M95N4RAZE ","M95N4RDXE ", & + "M95N4RDYE ","M95N4RDZE ","M95N4TAXE ","M95N4TAYE ","M95N4TAZE ","M95N4TDXSS","M95N4TDYSS", & + "M95N4TDZSS","M95N5FKXE ","M95N5FKYE ","M95N5FKZE ","M95N5FMXE ","M95N5FMYE ","M95N5FMZE ", & + "M95N5MKXE ","M95N5MKYE ","M95N5MKZE ","M95N5MMXE ","M95N5MMYE ","M95N5MMZE ","M95N5RAXE ", & + "M95N5RAYE ","M95N5RAZE ","M95N5RDXE ","M95N5RDYE ","M95N5RDZE ","M95N5TAXE ","M95N5TAYE ", & + "M95N5TAZE ","M95N5TDXSS","M95N5TDYSS","M95N5TDZSS","M95N6FKXE ","M95N6FKYE ","M95N6FKZE ", & + "M95N6FMXE ","M95N6FMYE ","M95N6FMZE ","M95N6MKXE ","M95N6MKYE ","M95N6MKZE ","M95N6MMXE ", & + "M95N6MMYE ","M95N6MMZE ","M95N6RAXE ","M95N6RAYE ","M95N6RAZE ","M95N6RDXE ","M95N6RDYE ", & + "M95N6RDZE ","M95N6TAXE ","M95N6TAYE ","M95N6TAZE ","M95N6TDXSS","M95N6TDYSS","M95N6TDZSS", & + "M95N7FKXE ","M95N7FKYE ","M95N7FKZE ","M95N7FMXE ","M95N7FMYE ","M95N7FMZE ","M95N7MKXE ", & + "M95N7MKYE ","M95N7MKZE ","M95N7MMXE ","M95N7MMYE ","M95N7MMZE ","M95N7RAXE ","M95N7RAYE ", & + "M95N7RAZE ","M95N7RDXE ","M95N7RDYE ","M95N7RDZE ","M95N7TAXE ","M95N7TAYE ","M95N7TAZE ", & + "M95N7TDXSS","M95N7TDYSS","M95N7TDZSS","M95N8FKXE ","M95N8FKYE ","M95N8FKZE ","M95N8FMXE ", & + "M95N8FMYE ","M95N8FMZE ","M95N8MKXE ","M95N8MKYE ","M95N8MKZE ","M95N8MMXE ","M95N8MMYE ", & + "M95N8MMZE ","M95N8RAXE ","M95N8RAYE ","M95N8RAZE ","M95N8RDXE ","M95N8RDYE ","M95N8RDZE ", & + "M95N8TAXE ","M95N8TAYE ","M95N8TAZE ","M95N8TDXSS","M95N8TDYSS","M95N8TDZSS","M95N9FKXE ", & + "M95N9FKYE ","M95N9FKZE ","M95N9FMXE ","M95N9FMYE ","M95N9FMZE ","M95N9MKXE ","M95N9MKYE ", & + "M95N9MKZE ","M95N9MMXE ","M95N9MMYE ","M95N9MMZE ","M95N9RAXE ","M95N9RAYE ","M95N9RAZE ", & + "M95N9RDXE ","M95N9RDYE ","M95N9RDZE ","M95N9TAXE ","M95N9TAYE ","M95N9TAZE ","M95N9TDXSS", & + "M95N9TDYSS","M95N9TDZSS","M96N1FKXE ","M96N1FKYE ","M96N1FKZE ","M96N1FMXE ","M96N1FMYE ", & + "M96N1FMZE ","M96N1MKXE ","M96N1MKYE ","M96N1MKZE ","M96N1MMXE ","M96N1MMYE ","M96N1MMZE ", & + "M96N1RAXE ","M96N1RAYE ","M96N1RAZE ","M96N1RDXE ","M96N1RDYE ","M96N1RDZE ","M96N1TAXE ", & + "M96N1TAYE ","M96N1TAZE ","M96N1TDXSS","M96N1TDYSS","M96N1TDZSS","M96N2FKXE ","M96N2FKYE ", & + "M96N2FKZE ","M96N2FMXE ","M96N2FMYE ","M96N2FMZE ","M96N2MKXE ","M96N2MKYE ","M96N2MKZE ", & + "M96N2MMXE ","M96N2MMYE ","M96N2MMZE ","M96N2RAXE ","M96N2RAYE ","M96N2RAZE ","M96N2RDXE ", & + "M96N2RDYE ","M96N2RDZE ","M96N2TAXE ","M96N2TAYE ","M96N2TAZE ","M96N2TDXSS","M96N2TDYSS", & + "M96N2TDZSS","M96N3FKXE ","M96N3FKYE ","M96N3FKZE ","M96N3FMXE ","M96N3FMYE ","M96N3FMZE ", & + "M96N3MKXE ","M96N3MKYE ","M96N3MKZE ","M96N3MMXE ","M96N3MMYE ","M96N3MMZE ","M96N3RAXE ", & + "M96N3RAYE ","M96N3RAZE ","M96N3RDXE ","M96N3RDYE ","M96N3RDZE ","M96N3TAXE ","M96N3TAYE ", & + "M96N3TAZE ","M96N3TDXSS","M96N3TDYSS","M96N3TDZSS","M96N4FKXE ","M96N4FKYE ","M96N4FKZE ", & + "M96N4FMXE ","M96N4FMYE ","M96N4FMZE ","M96N4MKXE ","M96N4MKYE ","M96N4MKZE ","M96N4MMXE ", & + "M96N4MMYE ","M96N4MMZE ","M96N4RAXE ","M96N4RAYE ","M96N4RAZE ","M96N4RDXE ","M96N4RDYE ", & + "M96N4RDZE ","M96N4TAXE ","M96N4TAYE ","M96N4TAZE ","M96N4TDXSS","M96N4TDYSS","M96N4TDZSS", & + "M96N5FKXE ","M96N5FKYE ","M96N5FKZE ","M96N5FMXE ","M96N5FMYE ","M96N5FMZE ","M96N5MKXE ", & + "M96N5MKYE ","M96N5MKZE ","M96N5MMXE ","M96N5MMYE ","M96N5MMZE ","M96N5RAXE ","M96N5RAYE ", & + "M96N5RAZE ","M96N5RDXE ","M96N5RDYE ","M96N5RDZE ","M96N5TAXE ","M96N5TAYE ","M96N5TAZE ", & + "M96N5TDXSS","M96N5TDYSS","M96N5TDZSS","M96N6FKXE ","M96N6FKYE ","M96N6FKZE ","M96N6FMXE ", & + "M96N6FMYE ","M96N6FMZE ","M96N6MKXE ","M96N6MKYE ","M96N6MKZE ","M96N6MMXE ","M96N6MMYE ", & + "M96N6MMZE ","M96N6RAXE ","M96N6RAYE ","M96N6RAZE ","M96N6RDXE ","M96N6RDYE ","M96N6RDZE ", & + "M96N6TAXE ","M96N6TAYE ","M96N6TAZE ","M96N6TDXSS","M96N6TDYSS","M96N6TDZSS","M96N7FKXE ", & + "M96N7FKYE ","M96N7FKZE ","M96N7FMXE ","M96N7FMYE ","M96N7FMZE ","M96N7MKXE ","M96N7MKYE ", & + "M96N7MKZE ","M96N7MMXE ","M96N7MMYE ","M96N7MMZE ","M96N7RAXE ","M96N7RAYE ","M96N7RAZE ", & + "M96N7RDXE ","M96N7RDYE ","M96N7RDZE ","M96N7TAXE ","M96N7TAYE ","M96N7TAZE ","M96N7TDXSS", & + "M96N7TDYSS","M96N7TDZSS","M96N8FKXE ","M96N8FKYE ","M96N8FKZE ","M96N8FMXE ","M96N8FMYE ", & + "M96N8FMZE ","M96N8MKXE ","M96N8MKYE ","M96N8MKZE ","M96N8MMXE ","M96N8MMYE ","M96N8MMZE ", & + "M96N8RAXE ","M96N8RAYE ","M96N8RAZE ","M96N8RDXE ","M96N8RDYE ","M96N8RDZE ","M96N8TAXE ", & + "M96N8TAYE ","M96N8TAZE ","M96N8TDXSS","M96N8TDYSS","M96N8TDZSS","M96N9FKXE ","M96N9FKYE ", & + "M96N9FKZE ","M96N9FMXE ","M96N9FMYE ","M96N9FMZE ","M96N9MKXE ","M96N9MKYE ","M96N9MKZE ", & + "M96N9MMXE ","M96N9MMYE ","M96N9MMZE ","M96N9RAXE ","M96N9RAYE ","M96N9RAZE ","M96N9RDXE ", & + "M96N9RDYE ","M96N9RDZE ","M96N9TAXE ","M96N9TAYE ","M96N9TAZE ","M96N9TDXSS","M96N9TDYSS", & + "M96N9TDZSS","M97N1FKXE ","M97N1FKYE ","M97N1FKZE ","M97N1FMXE ","M97N1FMYE ","M97N1FMZE ", & + "M97N1MKXE ","M97N1MKYE ","M97N1MKZE ","M97N1MMXE ","M97N1MMYE ","M97N1MMZE ","M97N1RAXE ", & + "M97N1RAYE ","M97N1RAZE ","M97N1RDXE ","M97N1RDYE ","M97N1RDZE ","M97N1TAXE ","M97N1TAYE ", & + "M97N1TAZE ","M97N1TDXSS","M97N1TDYSS","M97N1TDZSS","M97N2FKXE ","M97N2FKYE ","M97N2FKZE ", & + "M97N2FMXE ","M97N2FMYE ","M97N2FMZE ","M97N2MKXE ","M97N2MKYE ","M97N2MKZE ","M97N2MMXE ", & + "M97N2MMYE ","M97N2MMZE ","M97N2RAXE ","M97N2RAYE ","M97N2RAZE ","M97N2RDXE ","M97N2RDYE ", & + "M97N2RDZE ","M97N2TAXE ","M97N2TAYE ","M97N2TAZE ","M97N2TDXSS","M97N2TDYSS","M97N2TDZSS", & + "M97N3FKXE ","M97N3FKYE ","M97N3FKZE ","M97N3FMXE ","M97N3FMYE ","M97N3FMZE ","M97N3MKXE ", & + "M97N3MKYE ","M97N3MKZE ","M97N3MMXE ","M97N3MMYE ","M97N3MMZE ","M97N3RAXE ","M97N3RAYE ", & + "M97N3RAZE ","M97N3RDXE ","M97N3RDYE ","M97N3RDZE ","M97N3TAXE ","M97N3TAYE ","M97N3TAZE ", & + "M97N3TDXSS","M97N3TDYSS","M97N3TDZSS","M97N4FKXE ","M97N4FKYE ","M97N4FKZE ","M97N4FMXE ", & + "M97N4FMYE ","M97N4FMZE ","M97N4MKXE ","M97N4MKYE ","M97N4MKZE ","M97N4MMXE ","M97N4MMYE ", & + "M97N4MMZE ","M97N4RAXE ","M97N4RAYE ","M97N4RAZE ","M97N4RDXE ","M97N4RDYE ","M97N4RDZE ", & + "M97N4TAXE ","M97N4TAYE ","M97N4TAZE ","M97N4TDXSS","M97N4TDYSS","M97N4TDZSS","M97N5FKXE ", & + "M97N5FKYE ","M97N5FKZE ","M97N5FMXE ","M97N5FMYE ","M97N5FMZE ","M97N5MKXE ","M97N5MKYE ", & + "M97N5MKZE ","M97N5MMXE ","M97N5MMYE ","M97N5MMZE ","M97N5RAXE ","M97N5RAYE ","M97N5RAZE ", & + "M97N5RDXE ","M97N5RDYE ","M97N5RDZE ","M97N5TAXE ","M97N5TAYE ","M97N5TAZE ","M97N5TDXSS", & + "M97N5TDYSS","M97N5TDZSS","M97N6FKXE ","M97N6FKYE ","M97N6FKZE ","M97N6FMXE ","M97N6FMYE ", & + "M97N6FMZE ","M97N6MKXE ","M97N6MKYE ","M97N6MKZE ","M97N6MMXE ","M97N6MMYE ","M97N6MMZE ", & + "M97N6RAXE ","M97N6RAYE ","M97N6RAZE ","M97N6RDXE ","M97N6RDYE ","M97N6RDZE ","M97N6TAXE ", & + "M97N6TAYE ","M97N6TAZE ","M97N6TDXSS","M97N6TDYSS","M97N6TDZSS","M97N7FKXE ","M97N7FKYE ", & + "M97N7FKZE ","M97N7FMXE ","M97N7FMYE ","M97N7FMZE ","M97N7MKXE ","M97N7MKYE ","M97N7MKZE ", & + "M97N7MMXE ","M97N7MMYE ","M97N7MMZE ","M97N7RAXE ","M97N7RAYE ","M97N7RAZE ","M97N7RDXE ", & + "M97N7RDYE ","M97N7RDZE ","M97N7TAXE ","M97N7TAYE ","M97N7TAZE ","M97N7TDXSS","M97N7TDYSS", & + "M97N7TDZSS","M97N8FKXE ","M97N8FKYE ","M97N8FKZE ","M97N8FMXE ","M97N8FMYE ","M97N8FMZE ", & + "M97N8MKXE ","M97N8MKYE ","M97N8MKZE ","M97N8MMXE ","M97N8MMYE ","M97N8MMZE ","M97N8RAXE ", & + "M97N8RAYE ","M97N8RAZE ","M97N8RDXE ","M97N8RDYE ","M97N8RDZE ","M97N8TAXE ","M97N8TAYE ", & + "M97N8TAZE ","M97N8TDXSS","M97N8TDYSS","M97N8TDZSS","M97N9FKXE ","M97N9FKYE ","M97N9FKZE ", & + "M97N9FMXE ","M97N9FMYE ","M97N9FMZE ","M97N9MKXE ","M97N9MKYE ","M97N9MKZE ","M97N9MMXE ", & + "M97N9MMYE ","M97N9MMZE ","M97N9RAXE ","M97N9RAYE ","M97N9RAZE ","M97N9RDXE ","M97N9RDYE ", & + "M97N9RDZE ","M97N9TAXE ","M97N9TAYE ","M97N9TAZE ","M97N9TDXSS","M97N9TDYSS","M97N9TDZSS", & + "M98N1FKXE ","M98N1FKYE ","M98N1FKZE ","M98N1FMXE ","M98N1FMYE ","M98N1FMZE ","M98N1MKXE ", & + "M98N1MKYE ","M98N1MKZE ","M98N1MMXE ","M98N1MMYE ","M98N1MMZE ","M98N1RAXE ","M98N1RAYE ", & + "M98N1RAZE ","M98N1RDXE ","M98N1RDYE ","M98N1RDZE ","M98N1TAXE ","M98N1TAYE ","M98N1TAZE ", & + "M98N1TDXSS","M98N1TDYSS","M98N1TDZSS","M98N2FKXE ","M98N2FKYE ","M98N2FKZE ","M98N2FMXE ", & + "M98N2FMYE ","M98N2FMZE ","M98N2MKXE ","M98N2MKYE ","M98N2MKZE ","M98N2MMXE ","M98N2MMYE ", & + "M98N2MMZE ","M98N2RAXE ","M98N2RAYE ","M98N2RAZE ","M98N2RDXE ","M98N2RDYE ","M98N2RDZE ", & + "M98N2TAXE ","M98N2TAYE ","M98N2TAZE ","M98N2TDXSS","M98N2TDYSS","M98N2TDZSS","M98N3FKXE ", & + "M98N3FKYE ","M98N3FKZE ","M98N3FMXE ","M98N3FMYE ","M98N3FMZE ","M98N3MKXE ","M98N3MKYE ", & + "M98N3MKZE ","M98N3MMXE ","M98N3MMYE ","M98N3MMZE ","M98N3RAXE ","M98N3RAYE ","M98N3RAZE ", & + "M98N3RDXE ","M98N3RDYE ","M98N3RDZE ","M98N3TAXE ","M98N3TAYE ","M98N3TAZE ","M98N3TDXSS", & + "M98N3TDYSS","M98N3TDZSS","M98N4FKXE ","M98N4FKYE ","M98N4FKZE ","M98N4FMXE ","M98N4FMYE ", & + "M98N4FMZE ","M98N4MKXE ","M98N4MKYE ","M98N4MKZE ","M98N4MMXE ","M98N4MMYE ","M98N4MMZE ", & + "M98N4RAXE ","M98N4RAYE ","M98N4RAZE ","M98N4RDXE ","M98N4RDYE ","M98N4RDZE ","M98N4TAXE ", & + "M98N4TAYE ","M98N4TAZE ","M98N4TDXSS","M98N4TDYSS","M98N4TDZSS","M98N5FKXE ","M98N5FKYE ", & + "M98N5FKZE ","M98N5FMXE ","M98N5FMYE ","M98N5FMZE ","M98N5MKXE ","M98N5MKYE ","M98N5MKZE ", & + "M98N5MMXE ","M98N5MMYE ","M98N5MMZE ","M98N5RAXE ","M98N5RAYE ","M98N5RAZE ","M98N5RDXE ", & + "M98N5RDYE ","M98N5RDZE ","M98N5TAXE ","M98N5TAYE ","M98N5TAZE ","M98N5TDXSS","M98N5TDYSS", & + "M98N5TDZSS","M98N6FKXE ","M98N6FKYE ","M98N6FKZE ","M98N6FMXE ","M98N6FMYE ","M98N6FMZE ", & + "M98N6MKXE ","M98N6MKYE ","M98N6MKZE ","M98N6MMXE ","M98N6MMYE ","M98N6MMZE ","M98N6RAXE ", & + "M98N6RAYE ","M98N6RAZE ","M98N6RDXE ","M98N6RDYE ","M98N6RDZE ","M98N6TAXE ","M98N6TAYE ", & + "M98N6TAZE ","M98N6TDXSS","M98N6TDYSS","M98N6TDZSS","M98N7FKXE ","M98N7FKYE ","M98N7FKZE ", & + "M98N7FMXE ","M98N7FMYE ","M98N7FMZE ","M98N7MKXE ","M98N7MKYE ","M98N7MKZE ","M98N7MMXE ", & + "M98N7MMYE ","M98N7MMZE ","M98N7RAXE ","M98N7RAYE ","M98N7RAZE ","M98N7RDXE ","M98N7RDYE ", & + "M98N7RDZE ","M98N7TAXE ","M98N7TAYE ","M98N7TAZE ","M98N7TDXSS","M98N7TDYSS","M98N7TDZSS", & + "M98N8FKXE ","M98N8FKYE ","M98N8FKZE ","M98N8FMXE ","M98N8FMYE ","M98N8FMZE ","M98N8MKXE ", & + "M98N8MKYE ","M98N8MKZE ","M98N8MMXE ","M98N8MMYE ","M98N8MMZE ","M98N8RAXE ","M98N8RAYE ", & + "M98N8RAZE ","M98N8RDXE ","M98N8RDYE ","M98N8RDZE ","M98N8TAXE ","M98N8TAYE ","M98N8TAZE ", & + "M98N8TDXSS","M98N8TDYSS","M98N8TDZSS","M98N9FKXE ","M98N9FKYE ","M98N9FKZE ","M98N9FMXE ", & + "M98N9FMYE ","M98N9FMZE ","M98N9MKXE ","M98N9MKYE ","M98N9MKZE ","M98N9MMXE ","M98N9MMYE ", & + "M98N9MMZE ","M98N9RAXE ","M98N9RAYE ","M98N9RAZE ","M98N9RDXE ","M98N9RDYE ","M98N9RDZE ", & + "M98N9TAXE ","M98N9TAYE ","M98N9TAZE ","M98N9TDXSS","M98N9TDYSS","M98N9TDZSS","M99N1FKXE ", & + "M99N1FKYE ","M99N1FKZE ","M99N1FMXE ","M99N1FMYE ","M99N1FMZE ","M99N1MKXE ","M99N1MKYE ", & + "M99N1MKZE ","M99N1MMXE ","M99N1MMYE ","M99N1MMZE ","M99N1RAXE ","M99N1RAYE ","M99N1RAZE ", & + "M99N1RDXE ","M99N1RDYE ","M99N1RDZE ","M99N1TAXE ","M99N1TAYE ","M99N1TAZE ","M99N1TDXSS", & + "M99N1TDYSS","M99N1TDZSS","M99N2FKXE ","M99N2FKYE ","M99N2FKZE ","M99N2FMXE ","M99N2FMYE ", & + "M99N2FMZE ","M99N2MKXE ","M99N2MKYE ","M99N2MKZE ","M99N2MMXE ","M99N2MMYE ","M99N2MMZE ", & + "M99N2RAXE ","M99N2RAYE ","M99N2RAZE ","M99N2RDXE ","M99N2RDYE ","M99N2RDZE ","M99N2TAXE ", & + "M99N2TAYE ","M99N2TAZE ","M99N2TDXSS","M99N2TDYSS","M99N2TDZSS","M99N3FKXE ","M99N3FKYE ", & + "M99N3FKZE ","M99N3FMXE ","M99N3FMYE ","M99N3FMZE ","M99N3MKXE ","M99N3MKYE ","M99N3MKZE ", & + "M99N3MMXE ","M99N3MMYE ","M99N3MMZE ","M99N3RAXE ","M99N3RAYE ","M99N3RAZE ","M99N3RDXE ", & + "M99N3RDYE ","M99N3RDZE ","M99N3TAXE ","M99N3TAYE ","M99N3TAZE ","M99N3TDXSS","M99N3TDYSS", & + "M99N3TDZSS","M99N4FKXE ","M99N4FKYE ","M99N4FKZE ","M99N4FMXE ","M99N4FMYE ","M99N4FMZE ", & + "M99N4MKXE ","M99N4MKYE ","M99N4MKZE ","M99N4MMXE ","M99N4MMYE ","M99N4MMZE ","M99N4RAXE ", & + "M99N4RAYE ","M99N4RAZE ","M99N4RDXE ","M99N4RDYE ","M99N4RDZE ","M99N4TAXE ","M99N4TAYE ", & + "M99N4TAZE ","M99N4TDXSS","M99N4TDYSS","M99N4TDZSS","M99N5FKXE ","M99N5FKYE ","M99N5FKZE ", & + "M99N5FMXE ","M99N5FMYE ","M99N5FMZE ","M99N5MKXE ","M99N5MKYE ","M99N5MKZE ","M99N5MMXE ", & + "M99N5MMYE ","M99N5MMZE ","M99N5RAXE ","M99N5RAYE ","M99N5RAZE ","M99N5RDXE ","M99N5RDYE ", & + "M99N5RDZE ","M99N5TAXE ","M99N5TAYE ","M99N5TAZE ","M99N5TDXSS","M99N5TDYSS","M99N5TDZSS", & + "M99N6FKXE ","M99N6FKYE ","M99N6FKZE ","M99N6FMXE ","M99N6FMYE ","M99N6FMZE ","M99N6MKXE ", & + "M99N6MKYE ","M99N6MKZE ","M99N6MMXE ","M99N6MMYE ","M99N6MMZE ","M99N6RAXE ","M99N6RAYE ", & + "M99N6RAZE ","M99N6RDXE ","M99N6RDYE ","M99N6RDZE ","M99N6TAXE ","M99N6TAYE ","M99N6TAZE ", & + "M99N6TDXSS","M99N6TDYSS","M99N6TDZSS","M99N7FKXE ","M99N7FKYE ","M99N7FKZE ","M99N7FMXE ", & + "M99N7FMYE ","M99N7FMZE ","M99N7MKXE ","M99N7MKYE ","M99N7MKZE ","M99N7MMXE ","M99N7MMYE ", & + "M99N7MMZE ","M99N7RAXE ","M99N7RAYE ","M99N7RAZE ","M99N7RDXE ","M99N7RDYE ","M99N7RDZE ", & + "M99N7TAXE ","M99N7TAYE ","M99N7TAZE ","M99N7TDXSS","M99N7TDYSS","M99N7TDZSS","M99N8FKXE ", & + "M99N8FKYE ","M99N8FKZE ","M99N8FMXE ","M99N8FMYE ","M99N8FMZE ","M99N8MKXE ","M99N8MKYE ", & + "M99N8MKZE ","M99N8MMXE ","M99N8MMYE ","M99N8MMZE ","M99N8RAXE ","M99N8RAYE ","M99N8RAZE ", & + "M99N8RDXE ","M99N8RDYE ","M99N8RDZE ","M99N8TAXE ","M99N8TAYE ","M99N8TAZE ","M99N8TDXSS", & + "M99N8TDYSS","M99N8TDZSS","M99N9FKXE ","M99N9FKYE ","M99N9FKZE ","M99N9FMXE ","M99N9FMYE ", & + "M99N9FMZE ","M99N9MKXE ","M99N9MKYE ","M99N9MKZE ","M99N9MMXE ","M99N9MMYE ","M99N9MMZE ", & + "M99N9RAXE ","M99N9RAYE ","M99N9RAZE ","M99N9RDXE ","M99N9RDYE ","M99N9RDZE ","M99N9TAXE ", & + "M99N9TAYE ","M99N9TAZE ","M99N9TDXSS","M99N9TDYSS","M99N9TDZSS","RBRAXSS ","RBRAYSS ", & + "RBRAZSS ","RBRDXSS ","RBRDYSS ","RBRDZSS ","RBRVXSS ","RBRVYSS ","RBRVZSS ", & + "RBTAXSS ","RBTAYSS ","RBTAZSS ","RBTDXSS ","RBTDYSS ","RBTDZSS ","RBTVXSS ", & + "RBTVYSS ","RBTVZSS ","REACTFXSS ","REACTFYSS ","REACTFZSS ","REACTMXSS ","REACTMYSS ", & + "REACTMZSS ","SSQM01 ","SSQM02 ","SSQM03 ","SSQM04 ","SSQM05 ","SSQM06 ", & + "SSQM07 ","SSQM08 ","SSQM09 ","SSQM10 ","SSQM11 ","SSQM12 ","SSQM13 ", & + "SSQM14 ","SSQM15 ","SSQM16 ","SSQM17 ","SSQM18 ","SSQM19 ","SSQM20 ", & + "SSQM21 ","SSQM22 ","SSQM23 ","SSQM24 ","SSQM25 ","SSQM26 ","SSQM27 ", & + "SSQM28 ","SSQM29 ","SSQM30 ","SSQM31 ","SSQM32 ","SSQM33 ","SSQM34 ", & + "SSQM35 ","SSQM36 ","SSQM37 ","SSQM38 ","SSQM39 ","SSQM40 ","SSQM41 ", & + "SSQM42 ","SSQM43 ","SSQM44 ","SSQM45 ","SSQM46 ","SSQM47 ","SSQM48 ", & + "SSQM49 ","SSQM50 ","SSQM51 ","SSQM52 ","SSQM53 ","SSQM54 ","SSQM55 ", & + "SSQM56 ","SSQM57 ","SSQM58 ","SSQM59 ","SSQM60 ","SSQM61 ","SSQM62 ", & + "SSQM63 ","SSQM64 ","SSQM65 ","SSQM66 ","SSQM67 ","SSQM68 ","SSQM69 ", & + "SSQM70 ","SSQM71 ","SSQM72 ","SSQM73 ","SSQM74 ","SSQM75 ","SSQM76 ", & + "SSQM77 ","SSQM78 ","SSQM79 ","SSQM80 ","SSQM81 ","SSQM82 ","SSQM83 ", & + "SSQM84 ","SSQM85 ","SSQM86 ","SSQM87 ","SSQM88 ","SSQM89 ","SSQM90 ", & + "SSQM91 ","SSQM92 ","SSQM93 ","SSQM94 ","SSQM95 ","SSQM96 ","SSQM97 ", & + "SSQM98 ","SSQM99 ","SSQMD01 ","SSQMD02 ","SSQMD03 ","SSQMD04 ","SSQMD05 ", & + "SSQMD06 ","SSQMD07 ","SSQMD08 ","SSQMD09 ","SSQMD10 ","SSQMD11 ","SSQMD12 ", & + "SSQMD13 ","SSQMD14 ","SSQMD15 ","SSQMD16 ","SSQMD17 ","SSQMD18 ","SSQMD19 ", & + "SSQMD20 ","SSQMD21 ","SSQMD22 ","SSQMD23 ","SSQMD24 ","SSQMD25 ","SSQMD26 ", & + "SSQMD27 ","SSQMD28 ","SSQMD29 ","SSQMD30 ","SSQMD31 ","SSQMD32 ","SSQMD33 ", & + "SSQMD34 ","SSQMD35 ","SSQMD36 ","SSQMD37 ","SSQMD38 ","SSQMD39 ","SSQMD40 ", & + "SSQMD41 ","SSQMD42 ","SSQMD43 ","SSQMD44 ","SSQMD45 ","SSQMD46 ","SSQMD47 ", & + "SSQMD48 ","SSQMD49 ","SSQMD50 ","SSQMD51 ","SSQMD52 ","SSQMD53 ","SSQMD54 ", & + "SSQMD55 ","SSQMD56 ","SSQMD57 ","SSQMD58 ","SSQMD59 ","SSQMD60 ","SSQMD61 ", & + "SSQMD62 ","SSQMD63 ","SSQMD64 ","SSQMD65 ","SSQMD66 ","SSQMD67 ","SSQMD68 ", & + "SSQMD69 ","SSQMD70 ","SSQMD71 ","SSQMD72 ","SSQMD73 ","SSQMD74 ","SSQMD75 ", & + "SSQMD76 ","SSQMD77 ","SSQMD78 ","SSQMD79 ","SSQMD80 ","SSQMD81 ","SSQMD82 ", & + "SSQMD83 ","SSQMD84 ","SSQMD85 ","SSQMD86 ","SSQMD87 ","SSQMD88 ","SSQMD89 ", & + "SSQMD90 ","SSQMD91 ","SSQMD92 ","SSQMD93 ","SSQMD94 ","SSQMD95 ","SSQMD96 ", & + "SSQMD97 ","SSQMD98 ","SSQMD99 ","SSQMDD01 ","SSQMDD02 ","SSQMDD03 ","SSQMDD04 ", & + "SSQMDD05 ","SSQMDD06 ","SSQMDD07 ","SSQMDD08 ","SSQMDD09 ","SSQMDD10 ","SSQMDD11 ", & + "SSQMDD12 ","SSQMDD13 ","SSQMDD14 ","SSQMDD15 ","SSQMDD16 ","SSQMDD17 ","SSQMDD18 ", & + "SSQMDD19 ","SSQMDD20 ","SSQMDD21 ","SSQMDD22 ","SSQMDD23 ","SSQMDD24 ","SSQMDD25 ", & + "SSQMDD26 ","SSQMDD27 ","SSQMDD28 ","SSQMDD29 ","SSQMDD30 ","SSQMDD31 ","SSQMDD32 ", & + "SSQMDD33 ","SSQMDD34 ","SSQMDD35 ","SSQMDD36 ","SSQMDD37 ","SSQMDD38 ","SSQMDD39 ", & + "SSQMDD40 ","SSQMDD41 ","SSQMDD42 ","SSQMDD43 ","SSQMDD44 ","SSQMDD45 ","SSQMDD46 ", & + "SSQMDD47 ","SSQMDD48 ","SSQMDD49 ","SSQMDD50 ","SSQMDD51 ","SSQMDD52 ","SSQMDD53 ", & + "SSQMDD54 ","SSQMDD55 ","SSQMDD56 ","SSQMDD57 ","SSQMDD58 ","SSQMDD59 ","SSQMDD60 ", & + "SSQMDD61 ","SSQMDD62 ","SSQMDD63 ","SSQMDD64 ","SSQMDD65 ","SSQMDD66 ","SSQMDD67 ", & + "SSQMDD68 ","SSQMDD69 ","SSQMDD70 ","SSQMDD71 ","SSQMDD72 ","SSQMDD73 ","SSQMDD74 ", & + "SSQMDD75 ","SSQMDD76 ","SSQMDD77 ","SSQMDD78 ","SSQMDD79 ","SSQMDD80 ","SSQMDD81 ", & + "SSQMDD82 ","SSQMDD83 ","SSQMDD84 ","SSQMDD85 ","SSQMDD86 ","SSQMDD87 ","SSQMDD88 ", & + "SSQMDD89 ","SSQMDD90 ","SSQMDD91 ","SSQMDD92 ","SSQMDD93 ","SSQMDD94 ","SSQMDD95 ", & + "SSQMDD96 ","SSQMDD97 ","SSQMDD98 ","SSQMDD99 "/) + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(21921) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically ValidParamAry1, ValidParamAry2, ValidParamAry3, ValidParamAry4, ValidParamAry5, ValidParamAry6, ValidParamAry7, ValidParamAry8, ValidParamAry9, ValidParamAry10, ValidParamAry11, ValidParamAry12, ValidParamAry13/) - INTEGER(IntKi), PARAMETER :: ParamIndxAry1(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - IntfFXss , IntfFYss , IntfFZss , IntfMXss , IntfMYss , IntfMZss , IntfRAXss , & - IntfRAYss , IntfRAZss , IntfRDXss , IntfRDYss , IntfRDZss , IntfTAXss , IntfTAYss , & - IntfTAZss , IntfTDXss , IntfTDYss , IntfTDZss , M01N1FKxe , M01N1FKye , M01N1FKze , & - M01N1FMxe , M01N1FMye , M01N1FMze , M01N1MKxe , M01N1MKye , M01N1MKze , M01N1MMxe , & - M01N1MMye , M01N1MMze , M01N1RAxe , M01N1RAye , M01N1RAze , M01N1RDxe , M01N1RDye , & - M01N1RDze , M01N1TAxe , M01N1TAye , M01N1TAze , M01N1TDxss , M01N1TDyss , M01N1TDzss , & - M01N2FKxe , M01N2FKye , M01N2FKze , M01N2FMxe , M01N2FMye , M01N2FMze , M01N2MKxe , & - M01N2MKye , M01N2MKze , M01N2MMxe , M01N2MMye , M01N2MMze , M01N2RAxe , M01N2RAye , & - M01N2RAze , M01N2RDxe , M01N2RDye , M01N2RDze , M01N2TAxe , M01N2TAye , M01N2TAze , & - M01N2TDxss , M01N2TDyss , M01N2TDzss , M01N3FKxe , M01N3FKye , M01N3FKze , M01N3FMxe , & - M01N3FMye , M01N3FMze , M01N3MKxe , M01N3MKye , M01N3MKze , M01N3MMxe , M01N3MMye , & - M01N3MMze , M01N3RAxe , M01N3RAye , M01N3RAze , M01N3RDxe , M01N3RDye , M01N3RDze , & - M01N3TAxe , M01N3TAye , M01N3TAze , M01N3TDxss , M01N3TDyss , M01N3TDzss , M01N4FKxe , & - M01N4FKye , M01N4FKze , M01N4FMxe , M01N4FMye , M01N4FMze , M01N4MKxe , M01N4MKye , & - M01N4MKze , M01N4MMxe , M01N4MMye , M01N4MMze , M01N4RAxe , M01N4RAye , M01N4RAze , & - M01N4RDxe , M01N4RDye , M01N4RDze , M01N4TAxe , M01N4TAye , M01N4TAze , M01N4TDxss , & - M01N4TDyss , M01N4TDzss , M01N5FKxe , M01N5FKye , M01N5FKze , M01N5FMxe , M01N5FMye , & - M01N5FMze , M01N5MKxe , M01N5MKye , M01N5MKze , M01N5MMxe , M01N5MMye , M01N5MMze , & - M01N5RAxe , M01N5RAye , M01N5RAze , M01N5RDxe , M01N5RDye , M01N5RDze , M01N5TAxe , & - M01N5TAye , M01N5TAze , M01N5TDxss , M01N5TDyss , M01N5TDzss , M01N6FKxe , M01N6FKye , & - M01N6FKze , M01N6FMxe , M01N6FMye , M01N6FMze , M01N6MKxe , M01N6MKye , M01N6MKze , & - M01N6MMxe , M01N6MMye , M01N6MMze , M01N6RAxe , M01N6RAye , M01N6RAze , M01N6RDxe , & - M01N6RDye , M01N6RDze , M01N6TAxe , M01N6TAye , M01N6TAze , M01N6TDxss , M01N6TDyss , & - M01N6TDzss , M01N7FKxe , M01N7FKye , M01N7FKze , M01N7FMxe , M01N7FMye , M01N7FMze , & - M01N7MKxe , M01N7MKye , M01N7MKze , M01N7MMxe , M01N7MMye , M01N7MMze , M01N7RAxe , & - M01N7RAye , M01N7RAze , M01N7RDxe , M01N7RDye , M01N7RDze , M01N7TAxe , M01N7TAye , & - M01N7TAze , M01N7TDxss , M01N7TDyss , M01N7TDzss , M01N8FKxe , M01N8FKye , M01N8FKze , & - M01N8FMxe , M01N8FMye , M01N8FMze , M01N8MKxe , M01N8MKye , M01N8MKze , M01N8MMxe , & - M01N8MMye , M01N8MMze , M01N8RAxe , M01N8RAye , M01N8RAze , M01N8RDxe , M01N8RDye , & - M01N8RDze , M01N8TAxe , M01N8TAye , M01N8TAze , M01N8TDxss , M01N8TDyss , M01N8TDzss , & - M01N9FKxe , M01N9FKye , M01N9FKze , M01N9FMxe , M01N9FMye , M01N9FMze , M01N9MKxe , & - M01N9MKye , M01N9MKze , M01N9MMxe , M01N9MMye , M01N9MMze , M01N9RAxe , M01N9RAye , & - M01N9RAze , M01N9RDxe , M01N9RDye , M01N9RDze , M01N9TAxe , M01N9TAye , M01N9TAze , & - M01N9TDxss , M01N9TDyss , M01N9TDzss , M02N1FKxe , M02N1FKye , M02N1FKze , M02N1FMxe , & - M02N1FMye , M02N1FMze , M02N1MKxe , M02N1MKye , M02N1MKze , M02N1MMxe , M02N1MMye , & - M02N1MMze , M02N1RAxe , M02N1RAye , M02N1RAze , M02N1RDxe , M02N1RDye , M02N1RDze , & - M02N1TAxe , M02N1TAye , M02N1TAze , M02N1TDxss , M02N1TDyss , M02N1TDzss , M02N2FKxe , & - M02N2FKye , M02N2FKze , M02N2FMxe , M02N2FMye , M02N2FMze , M02N2MKxe , M02N2MKye , & - M02N2MKze , M02N2MMxe , M02N2MMye , M02N2MMze , M02N2RAxe , M02N2RAye , M02N2RAze , & - M02N2RDxe , M02N2RDye , M02N2RDze , M02N2TAxe , M02N2TAye , M02N2TAze , M02N2TDxss , & - M02N2TDyss , M02N2TDzss , M02N3FKxe , M02N3FKye , M02N3FKze , M02N3FMxe , M02N3FMye , & - M02N3FMze , M02N3MKxe , M02N3MKye , M02N3MKze , M02N3MMxe , M02N3MMye , M02N3MMze , & - M02N3RAxe , M02N3RAye , M02N3RAze , M02N3RDxe , M02N3RDye , M02N3RDze , M02N3TAxe , & - M02N3TAye , M02N3TAze , M02N3TDxss , M02N3TDyss , M02N3TDzss , M02N4FKxe , M02N4FKye , & - M02N4FKze , M02N4FMxe , M02N4FMye , M02N4FMze , M02N4MKxe , M02N4MKye , M02N4MKze , & - M02N4MMxe , M02N4MMye , M02N4MMze , M02N4RAxe , M02N4RAye , M02N4RAze , M02N4RDxe , & - M02N4RDye , M02N4RDze , M02N4TAxe , M02N4TAye , M02N4TAze , M02N4TDxss , M02N4TDyss , & - M02N4TDzss , M02N5FKxe , M02N5FKye , M02N5FKze , M02N5FMxe , M02N5FMye , M02N5FMze , & - M02N5MKxe , M02N5MKye , M02N5MKze , M02N5MMxe , M02N5MMye , M02N5MMze , M02N5RAxe , & - M02N5RAye , M02N5RAze , M02N5RDxe , M02N5RDye , M02N5RDze , M02N5TAxe , M02N5TAye , & - M02N5TAze , M02N5TDxss , M02N5TDyss , M02N5TDzss , M02N6FKxe , M02N6FKye , M02N6FKze , & - M02N6FMxe , M02N6FMye , M02N6FMze , M02N6MKxe , M02N6MKye , M02N6MKze , M02N6MMxe , & - M02N6MMye , M02N6MMze , M02N6RAxe , M02N6RAye , M02N6RAze , M02N6RDxe , M02N6RDye , & - M02N6RDze , M02N6TAxe , M02N6TAye , M02N6TAze , M02N6TDxss , M02N6TDyss , M02N6TDzss , & - M02N7FKxe , M02N7FKye , M02N7FKze , M02N7FMxe , M02N7FMye , M02N7FMze , M02N7MKxe , & - M02N7MKye , M02N7MKze , M02N7MMxe , M02N7MMye , M02N7MMze , M02N7RAxe , M02N7RAye , & - M02N7RAze , M02N7RDxe , M02N7RDye , M02N7RDze , M02N7TAxe , M02N7TAye , M02N7TAze , & - M02N7TDxss , M02N7TDyss , M02N7TDzss , M02N8FKxe , M02N8FKye , M02N8FKze , M02N8FMxe , & - M02N8FMye , M02N8FMze , M02N8MKxe , M02N8MKye , M02N8MKze , M02N8MMxe , M02N8MMye , & - M02N8MMze , M02N8RAxe , M02N8RAye , M02N8RAze , M02N8RDxe , M02N8RDye , M02N8RDze , & - M02N8TAxe , M02N8TAye , M02N8TAze , M02N8TDxss , M02N8TDyss , M02N8TDzss , M02N9FKxe , & - M02N9FKye , M02N9FKze , M02N9FMxe , M02N9FMye , M02N9FMze , M02N9MKxe , M02N9MKye , & - M02N9MKze , M02N9MMxe , M02N9MMye , M02N9MMze , M02N9RAxe , M02N9RAye , M02N9RAze , & - M02N9RDxe , M02N9RDye , M02N9RDze , M02N9TAxe , M02N9TAye , M02N9TAze , M02N9TDxss , & - M02N9TDyss , M02N9TDzss , M03N1FKxe , M03N1FKye , M03N1FKze , M03N1FMxe , M03N1FMye , & - M03N1FMze , M03N1MKxe , M03N1MKye , M03N1MKze , M03N1MMxe , M03N1MMye , M03N1MMze , & - M03N1RAxe , M03N1RAye , M03N1RAze , M03N1RDxe , M03N1RDye , M03N1RDze , M03N1TAxe , & - M03N1TAye , M03N1TAze , M03N1TDxss , M03N1TDyss , M03N1TDzss , M03N2FKxe , M03N2FKye , & - M03N2FKze , M03N2FMxe , M03N2FMye , M03N2FMze , M03N2MKxe , M03N2MKye , M03N2MKze , & - M03N2MMxe , M03N2MMye , M03N2MMze , M03N2RAxe , M03N2RAye , M03N2RAze , M03N2RDxe , & - M03N2RDye , M03N2RDze , M03N2TAxe , M03N2TAye , M03N2TAze , M03N2TDxss , M03N2TDyss , & - M03N2TDzss , M03N3FKxe , M03N3FKye , M03N3FKze , M03N3FMxe , M03N3FMye , M03N3FMze , & - M03N3MKxe , M03N3MKye , M03N3MKze , M03N3MMxe , M03N3MMye , M03N3MMze , M03N3RAxe , & - M03N3RAye , M03N3RAze , M03N3RDxe , M03N3RDye , M03N3RDze , M03N3TAxe , M03N3TAye , & - M03N3TAze , M03N3TDxss , M03N3TDyss , M03N3TDzss , M03N4FKxe , M03N4FKye , M03N4FKze , & - M03N4FMxe , M03N4FMye , M03N4FMze , M03N4MKxe , M03N4MKye , M03N4MKze , M03N4MMxe , & - M03N4MMye , M03N4MMze , M03N4RAxe , M03N4RAye , M03N4RAze , M03N4RDxe , M03N4RDye , & - M03N4RDze , M03N4TAxe , M03N4TAye , M03N4TAze , M03N4TDxss , M03N4TDyss , M03N4TDzss , & - M03N5FKxe , M03N5FKye , M03N5FKze , M03N5FMxe , M03N5FMye , M03N5FMze , M03N5MKxe , & - M03N5MKye , M03N5MKze , M03N5MMxe , M03N5MMye , M03N5MMze , M03N5RAxe , M03N5RAye , & - M03N5RAze , M03N5RDxe , M03N5RDye , M03N5RDze , M03N5TAxe , M03N5TAye , M03N5TAze , & - M03N5TDxss , M03N5TDyss , M03N5TDzss , M03N6FKxe , M03N6FKye , M03N6FKze , M03N6FMxe , & - M03N6FMye , M03N6FMze , M03N6MKxe , M03N6MKye , M03N6MKze , M03N6MMxe , M03N6MMye , & - M03N6MMze , M03N6RAxe , M03N6RAye , M03N6RAze , M03N6RDxe , M03N6RDye , M03N6RDze , & - M03N6TAxe , M03N6TAye , M03N6TAze , M03N6TDxss , M03N6TDyss , M03N6TDzss , M03N7FKxe , & - M03N7FKye , M03N7FKze , M03N7FMxe , M03N7FMye , M03N7FMze , M03N7MKxe , M03N7MKye , & - M03N7MKze , M03N7MMxe , M03N7MMye , M03N7MMze , M03N7RAxe , M03N7RAye , M03N7RAze , & - M03N7RDxe , M03N7RDye , M03N7RDze , M03N7TAxe , M03N7TAye , M03N7TAze , M03N7TDxss , & - M03N7TDyss , M03N7TDzss , M03N8FKxe , M03N8FKye , M03N8FKze , M03N8FMxe , M03N8FMye , & - M03N8FMze , M03N8MKxe , M03N8MKye , M03N8MKze , M03N8MMxe , M03N8MMye , M03N8MMze , & - M03N8RAxe , M03N8RAye , M03N8RAze , M03N8RDxe , M03N8RDye , M03N8RDze , M03N8TAxe , & - M03N8TAye , M03N8TAze , M03N8TDxss , M03N8TDyss , M03N8TDzss , M03N9FKxe , M03N9FKye , & - M03N9FKze , M03N9FMxe , M03N9FMye , M03N9FMze , M03N9MKxe , M03N9MKye , M03N9MKze , & - M03N9MMxe , M03N9MMye , M03N9MMze , M03N9RAxe , M03N9RAye , M03N9RAze , M03N9RDxe , & - M03N9RDye , M03N9RDze , M03N9TAxe , M03N9TAye , M03N9TAze , M03N9TDxss , M03N9TDyss , & - M03N9TDzss , M04N1FKxe , M04N1FKye , M04N1FKze , M04N1FMxe , M04N1FMye , M04N1FMze , & - M04N1MKxe , M04N1MKye , M04N1MKze , M04N1MMxe , M04N1MMye , M04N1MMze , M04N1RAxe , & - M04N1RAye , M04N1RAze , M04N1RDxe , M04N1RDye , M04N1RDze , M04N1TAxe , M04N1TAye , & - M04N1TAze , M04N1TDxss , M04N1TDyss , M04N1TDzss , M04N2FKxe , M04N2FKye , M04N2FKze , & - M04N2FMxe , M04N2FMye , M04N2FMze , M04N2MKxe , M04N2MKye , M04N2MKze , M04N2MMxe , & - M04N2MMye , M04N2MMze , M04N2RAxe , M04N2RAye , M04N2RAze , M04N2RDxe , M04N2RDye , & - M04N2RDze , M04N2TAxe , M04N2TAye , M04N2TAze , M04N2TDxss , M04N2TDyss , M04N2TDzss , & - M04N3FKxe , M04N3FKye , M04N3FKze , M04N3FMxe , M04N3FMye , M04N3FMze , M04N3MKxe , & - M04N3MKye , M04N3MKze , M04N3MMxe , M04N3MMye , M04N3MMze , M04N3RAxe , M04N3RAye , & - M04N3RAze , M04N3RDxe , M04N3RDye , M04N3RDze , M04N3TAxe , M04N3TAye , M04N3TAze , & - M04N3TDxss , M04N3TDyss , M04N3TDzss , M04N4FKxe , M04N4FKye , M04N4FKze , M04N4FMxe , & - M04N4FMye , M04N4FMze , M04N4MKxe , M04N4MKye , M04N4MKze , M04N4MMxe , M04N4MMye , & - M04N4MMze , M04N4RAxe , M04N4RAye , M04N4RAze , M04N4RDxe , M04N4RDye , M04N4RDze , & - M04N4TAxe , M04N4TAye , M04N4TAze , M04N4TDxss , M04N4TDyss , M04N4TDzss , M04N5FKxe , & - M04N5FKye , M04N5FKze , M04N5FMxe , M04N5FMye , M04N5FMze , M04N5MKxe , M04N5MKye , & - M04N5MKze , M04N5MMxe , M04N5MMye , M04N5MMze , M04N5RAxe , M04N5RAye , M04N5RAze , & - M04N5RDxe , M04N5RDye , M04N5RDze , M04N5TAxe , M04N5TAye , M04N5TAze , M04N5TDxss , & - M04N5TDyss , M04N5TDzss , M04N6FKxe , M04N6FKye , M04N6FKze , M04N6FMxe , M04N6FMye , & - M04N6FMze , M04N6MKxe , M04N6MKye , M04N6MKze , M04N6MMxe , M04N6MMye , M04N6MMze , & - M04N6RAxe , M04N6RAye , M04N6RAze , M04N6RDxe , M04N6RDye , M04N6RDze , M04N6TAxe , & - M04N6TAye , M04N6TAze , M04N6TDxss , M04N6TDyss , M04N6TDzss , M04N7FKxe , M04N7FKye , & - M04N7FKze , M04N7FMxe , M04N7FMye , M04N7FMze , M04N7MKxe , M04N7MKye , M04N7MKze , & - M04N7MMxe , M04N7MMye , M04N7MMze , M04N7RAxe , M04N7RAye , M04N7RAze , M04N7RDxe , & - M04N7RDye , M04N7RDze , M04N7TAxe , M04N7TAye , M04N7TAze , M04N7TDxss , M04N7TDyss , & - M04N7TDzss , M04N8FKxe , M04N8FKye , M04N8FKze , M04N8FMxe , M04N8FMye , M04N8FMze , & - M04N8MKxe , M04N8MKye , M04N8MKze , M04N8MMxe , M04N8MMye , M04N8MMze , M04N8RAxe , & - M04N8RAye , M04N8RAze , M04N8RDxe , M04N8RDye , M04N8RDze , M04N8TAxe , M04N8TAye , & - M04N8TAze , M04N8TDxss , M04N8TDyss , M04N8TDzss , M04N9FKxe , M04N9FKye , M04N9FKze , & - M04N9FMxe , M04N9FMye , M04N9FMze , M04N9MKxe , M04N9MKye , M04N9MKze , M04N9MMxe , & - M04N9MMye , M04N9MMze , M04N9RAxe , M04N9RAye , M04N9RAze , M04N9RDxe , M04N9RDye , & - M04N9RDze , M04N9TAxe , M04N9TAye , M04N9TAze , M04N9TDxss , M04N9TDyss , M04N9TDzss , & - M05N1FKxe , M05N1FKye , M05N1FKze , M05N1FMxe , M05N1FMye , M05N1FMze , M05N1MKxe , & - M05N1MKye , M05N1MKze , M05N1MMxe , M05N1MMye , M05N1MMze , M05N1RAxe , M05N1RAye , & - M05N1RAze , M05N1RDxe , M05N1RDye , M05N1RDze , M05N1TAxe , M05N1TAye , M05N1TAze , & - M05N1TDxss , M05N1TDyss , M05N1TDzss , M05N2FKxe , M05N2FKye , M05N2FKze , M05N2FMxe , & - M05N2FMye , M05N2FMze , M05N2MKxe , M05N2MKye , M05N2MKze , M05N2MMxe , M05N2MMye , & - M05N2MMze , M05N2RAxe , M05N2RAye , M05N2RAze , M05N2RDxe , M05N2RDye , M05N2RDze , & - M05N2TAxe , M05N2TAye , M05N2TAze , M05N2TDxss , M05N2TDyss , M05N2TDzss , M05N3FKxe , & - M05N3FKye , M05N3FKze , M05N3FMxe , M05N3FMye , M05N3FMze , M05N3MKxe , M05N3MKye , & - M05N3MKze , M05N3MMxe , M05N3MMye , M05N3MMze , M05N3RAxe , M05N3RAye , M05N3RAze , & - M05N3RDxe , M05N3RDye , M05N3RDze , M05N3TAxe , M05N3TAye , M05N3TAze , M05N3TDxss , & - M05N3TDyss , M05N3TDzss , M05N4FKxe , M05N4FKye , M05N4FKze , M05N4FMxe , M05N4FMye , & - M05N4FMze , M05N4MKxe , M05N4MKye , M05N4MKze , M05N4MMxe , M05N4MMye , M05N4MMze , & - M05N4RAxe , M05N4RAye , M05N4RAze , M05N4RDxe , M05N4RDye , M05N4RDze , M05N4TAxe , & - M05N4TAye , M05N4TAze , M05N4TDxss , M05N4TDyss , M05N4TDzss , M05N5FKxe , M05N5FKye , & - M05N5FKze , M05N5FMxe , M05N5FMye , M05N5FMze , M05N5MKxe , M05N5MKye , M05N5MKze , & - M05N5MMxe , M05N5MMye , M05N5MMze , M05N5RAxe , M05N5RAye , M05N5RAze , M05N5RDxe , & - M05N5RDye , M05N5RDze , M05N5TAxe , M05N5TAye , M05N5TAze , M05N5TDxss , M05N5TDyss , & - M05N5TDzss , M05N6FKxe , M05N6FKye , M05N6FKze , M05N6FMxe , M05N6FMye , M05N6FMze , & - M05N6MKxe , M05N6MKye , M05N6MKze , M05N6MMxe , M05N6MMye , M05N6MMze , M05N6RAxe , & - M05N6RAye , M05N6RAze , M05N6RDxe , M05N6RDye , M05N6RDze , M05N6TAxe , M05N6TAye , & - M05N6TAze , M05N6TDxss , M05N6TDyss , M05N6TDzss , M05N7FKxe , M05N7FKye , M05N7FKze , & - M05N7FMxe , M05N7FMye , M05N7FMze , M05N7MKxe , M05N7MKye , M05N7MKze , M05N7MMxe , & - M05N7MMye , M05N7MMze , M05N7RAxe , M05N7RAye , M05N7RAze , M05N7RDxe , M05N7RDye , & - M05N7RDze , M05N7TAxe , M05N7TAye , M05N7TAze , M05N7TDxss , M05N7TDyss , M05N7TDzss , & - M05N8FKxe , M05N8FKye , M05N8FKze , M05N8FMxe , M05N8FMye , M05N8FMze , M05N8MKxe , & - M05N8MKye , M05N8MKze , M05N8MMxe , M05N8MMye , M05N8MMze , M05N8RAxe , M05N8RAye , & - M05N8RAze , M05N8RDxe , M05N8RDye , M05N8RDze , M05N8TAxe , M05N8TAye , M05N8TAze , & - M05N8TDxss , M05N8TDyss , M05N8TDzss , M05N9FKxe , M05N9FKye , M05N9FKze , M05N9FMxe , & - M05N9FMye , M05N9FMze , M05N9MKxe , M05N9MKye , M05N9MKze , M05N9MMxe , M05N9MMye , & - M05N9MMze , M05N9RAxe , M05N9RAye , M05N9RAze , M05N9RDxe , M05N9RDye , M05N9RDze , & - M05N9TAxe , M05N9TAye , M05N9TAze , M05N9TDxss , M05N9TDyss , M05N9TDzss , M06N1FKxe , & - M06N1FKye , M06N1FKze , M06N1FMxe , M06N1FMye , M06N1FMze , M06N1MKxe , M06N1MKye , & - M06N1MKze , M06N1MMxe , M06N1MMye , M06N1MMze , M06N1RAxe , M06N1RAye , M06N1RAze , & - M06N1RDxe , M06N1RDye , M06N1RDze , M06N1TAxe , M06N1TAye , M06N1TAze , M06N1TDxss , & - M06N1TDyss , M06N1TDzss , M06N2FKxe , M06N2FKye , M06N2FKze , M06N2FMxe , M06N2FMye , & - M06N2FMze , M06N2MKxe , M06N2MKye , M06N2MKze , M06N2MMxe , M06N2MMye , M06N2MMze , & - M06N2RAxe , M06N2RAye , M06N2RAze , M06N2RDxe , M06N2RDye , M06N2RDze , M06N2TAxe , & - M06N2TAye , M06N2TAze , M06N2TDxss , M06N2TDyss , M06N2TDzss , M06N3FKxe , M06N3FKye , & - M06N3FKze , M06N3FMxe , M06N3FMye , M06N3FMze , M06N3MKxe , M06N3MKye , M06N3MKze , & - M06N3MMxe , M06N3MMye , M06N3MMze , M06N3RAxe , M06N3RAye , M06N3RAze , M06N3RDxe , & - M06N3RDye , M06N3RDze , M06N3TAxe , M06N3TAye , M06N3TAze , M06N3TDxss , M06N3TDyss , & - M06N3TDzss , M06N4FKxe , M06N4FKye , M06N4FKze , M06N4FMxe , M06N4FMye , M06N4FMze , & - M06N4MKxe , M06N4MKye , M06N4MKze , M06N4MMxe , M06N4MMye , M06N4MMze , M06N4RAxe , & - M06N4RAye , M06N4RAze , M06N4RDxe , M06N4RDye , M06N4RDze , M06N4TAxe , M06N4TAye , & - M06N4TAze , M06N4TDxss , M06N4TDyss , M06N4TDzss , M06N5FKxe , M06N5FKye , M06N5FKze , & - M06N5FMxe , M06N5FMye , M06N5FMze , M06N5MKxe , M06N5MKye , M06N5MKze , M06N5MMxe , & - M06N5MMye , M06N5MMze , M06N5RAxe , M06N5RAye , M06N5RAze , M06N5RDxe , M06N5RDye , & - M06N5RDze , M06N5TAxe , M06N5TAye , M06N5TAze , M06N5TDxss , M06N5TDyss , M06N5TDzss , & - M06N6FKxe , M06N6FKye , M06N6FKze , M06N6FMxe , M06N6FMye , M06N6FMze , M06N6MKxe , & - M06N6MKye , M06N6MKze , M06N6MMxe , M06N6MMye , M06N6MMze , M06N6RAxe , M06N6RAye , & - M06N6RAze , M06N6RDxe , M06N6RDye , M06N6RDze , M06N6TAxe , M06N6TAye , M06N6TAze , & - M06N6TDxss , M06N6TDyss , M06N6TDzss , M06N7FKxe , M06N7FKye , M06N7FKze , M06N7FMxe , & - M06N7FMye , M06N7FMze , M06N7MKxe , M06N7MKye , M06N7MKze , M06N7MMxe , M06N7MMye , & - M06N7MMze , M06N7RAxe , M06N7RAye , M06N7RAze , M06N7RDxe , M06N7RDye , M06N7RDze , & - M06N7TAxe , M06N7TAye , M06N7TAze , M06N7TDxss , M06N7TDyss , M06N7TDzss , M06N8FKxe , & - M06N8FKye , M06N8FKze , M06N8FMxe , M06N8FMye , M06N8FMze , M06N8MKxe , M06N8MKye , & - M06N8MKze , M06N8MMxe , M06N8MMye , M06N8MMze , M06N8RAxe , M06N8RAye , M06N8RAze , & - M06N8RDxe , M06N8RDye , M06N8RDze , M06N8TAxe , M06N8TAye , M06N8TAze , M06N8TDxss , & - M06N8TDyss , M06N8TDzss , M06N9FKxe , M06N9FKye , M06N9FKze , M06N9FMxe , M06N9FMye , & - M06N9FMze , M06N9MKxe , M06N9MKye , M06N9MKze , M06N9MMxe , M06N9MMye , M06N9MMze , & - M06N9RAxe , M06N9RAye , M06N9RAze , M06N9RDxe , M06N9RDye , M06N9RDze , M06N9TAxe , & - M06N9TAye , M06N9TAze , M06N9TDxss , M06N9TDyss , M06N9TDzss , M07N1FKxe , M07N1FKye , & - M07N1FKze , M07N1FMxe , M07N1FMye , M07N1FMze , M07N1MKxe , M07N1MKye , M07N1MKze , & - M07N1MMxe , M07N1MMye , M07N1MMze , M07N1RAxe , M07N1RAye , M07N1RAze , M07N1RDxe , & - M07N1RDye , M07N1RDze , M07N1TAxe , M07N1TAye , M07N1TAze , M07N1TDxss , M07N1TDyss , & - M07N1TDzss , M07N2FKxe , M07N2FKye , M07N2FKze , M07N2FMxe , M07N2FMye , M07N2FMze , & - M07N2MKxe , M07N2MKye , M07N2MKze , M07N2MMxe , M07N2MMye , M07N2MMze , M07N2RAxe , & - M07N2RAye , M07N2RAze , M07N2RDxe , M07N2RDye , M07N2RDze , M07N2TAxe , M07N2TAye , & - M07N2TAze , M07N2TDxss , M07N2TDyss , M07N2TDzss , M07N3FKxe , M07N3FKye , M07N3FKze , & - M07N3FMxe , M07N3FMye , M07N3FMze , M07N3MKxe , M07N3MKye , M07N3MKze , M07N3MMxe , & - M07N3MMye , M07N3MMze , M07N3RAxe , M07N3RAye , M07N3RAze , M07N3RDxe , M07N3RDye , & - M07N3RDze , M07N3TAxe , M07N3TAye , M07N3TAze , M07N3TDxss , M07N3TDyss , M07N3TDzss , & - M07N4FKxe , M07N4FKye , M07N4FKze , M07N4FMxe , M07N4FMye , M07N4FMze , M07N4MKxe , & - M07N4MKye , M07N4MKze , M07N4MMxe , M07N4MMye , M07N4MMze , M07N4RAxe , M07N4RAye , & - M07N4RAze , M07N4RDxe , M07N4RDye , M07N4RDze , M07N4TAxe , M07N4TAye , M07N4TAze , & - M07N4TDxss , M07N4TDyss , M07N4TDzss , M07N5FKxe , M07N5FKye , M07N5FKze , M07N5FMxe , & - M07N5FMye , M07N5FMze , M07N5MKxe , M07N5MKye , M07N5MKze , M07N5MMxe , M07N5MMye , & - M07N5MMze , M07N5RAxe , M07N5RAye , M07N5RAze , M07N5RDxe , M07N5RDye , M07N5RDze , & - M07N5TAxe , M07N5TAye , M07N5TAze , M07N5TDxss , M07N5TDyss , M07N5TDzss , M07N6FKxe , & - M07N6FKye , M07N6FKze , M07N6FMxe , M07N6FMye , M07N6FMze , M07N6MKxe , M07N6MKye , & - M07N6MKze , M07N6MMxe , M07N6MMye , M07N6MMze , M07N6RAxe , M07N6RAye , M07N6RAze , & - M07N6RDxe , M07N6RDye , M07N6RDze , M07N6TAxe , M07N6TAye , M07N6TAze , M07N6TDxss , & - M07N6TDyss , M07N6TDzss , M07N7FKxe , M07N7FKye , M07N7FKze , M07N7FMxe , M07N7FMye , & - M07N7FMze , M07N7MKxe , M07N7MKye , M07N7MKze , M07N7MMxe , M07N7MMye , M07N7MMze , & - M07N7RAxe , M07N7RAye , M07N7RAze , M07N7RDxe , M07N7RDye , M07N7RDze , M07N7TAxe , & - M07N7TAye , M07N7TAze , M07N7TDxss , M07N7TDyss , M07N7TDzss , M07N8FKxe , M07N8FKye , & - M07N8FKze , M07N8FMxe , M07N8FMye , M07N8FMze , M07N8MKxe , M07N8MKye , M07N8MKze , & - M07N8MMxe , M07N8MMye , M07N8MMze , M07N8RAxe , M07N8RAye , M07N8RAze , M07N8RDxe , & - M07N8RDye , M07N8RDze , M07N8TAxe , M07N8TAye , M07N8TAze , M07N8TDxss , M07N8TDyss , & - M07N8TDzss , M07N9FKxe , M07N9FKye , M07N9FKze , M07N9FMxe , M07N9FMye , M07N9FMze , & - M07N9MKxe , M07N9MKye , M07N9MKze , M07N9MMxe , M07N9MMye , M07N9MMze , M07N9RAxe , & - M07N9RAye , M07N9RAze , M07N9RDxe , M07N9RDye , M07N9RDze , M07N9TAxe , M07N9TAye , & - M07N9TAze , M07N9TDxss , M07N9TDyss , M07N9TDzss , M08N1FKxe , M08N1FKye , M08N1FKze , & - M08N1FMxe , M08N1FMye , M08N1FMze , M08N1MKxe , M08N1MKye , M08N1MKze , M08N1MMxe , & - M08N1MMye , M08N1MMze , M08N1RAxe , M08N1RAye , M08N1RAze , M08N1RDxe , M08N1RDye , & - M08N1RDze , M08N1TAxe , M08N1TAye , M08N1TAze , M08N1TDxss , M08N1TDyss , M08N1TDzss , & - M08N2FKxe , M08N2FKye , M08N2FKze , M08N2FMxe , M08N2FMye , M08N2FMze , M08N2MKxe , & - M08N2MKye , M08N2MKze , M08N2MMxe , M08N2MMye , M08N2MMze , M08N2RAxe , M08N2RAye , & - M08N2RAze , M08N2RDxe , M08N2RDye , M08N2RDze , M08N2TAxe , M08N2TAye , M08N2TAze , & - M08N2TDxss , M08N2TDyss , M08N2TDzss , M08N3FKxe , M08N3FKye , M08N3FKze , M08N3FMxe , & - M08N3FMye , M08N3FMze , M08N3MKxe , M08N3MKye , M08N3MKze , M08N3MMxe , M08N3MMye , & - M08N3MMze , M08N3RAxe , M08N3RAye , M08N3RAze , M08N3RDxe , M08N3RDye , M08N3RDze , & - M08N3TAxe , M08N3TAye , M08N3TAze , M08N3TDxss , M08N3TDyss , M08N3TDzss , M08N4FKxe , & - M08N4FKye , M08N4FKze , M08N4FMxe , M08N4FMye , M08N4FMze , M08N4MKxe , M08N4MKye , & - M08N4MKze , M08N4MMxe , M08N4MMye , M08N4MMze , M08N4RAxe , M08N4RAye , M08N4RAze , & - M08N4RDxe , M08N4RDye , M08N4RDze , M08N4TAxe , M08N4TAye , M08N4TAze , M08N4TDxss , & - M08N4TDyss , M08N4TDzss , M08N5FKxe , M08N5FKye , M08N5FKze , M08N5FMxe , M08N5FMye , & - M08N5FMze , M08N5MKxe , M08N5MKye , M08N5MKze , M08N5MMxe , M08N5MMye , M08N5MMze , & - M08N5RAxe , M08N5RAye , M08N5RAze , M08N5RDxe , M08N5RDye , M08N5RDze , M08N5TAxe , & - M08N5TAye , M08N5TAze , M08N5TDxss , M08N5TDyss , M08N5TDzss , M08N6FKxe , M08N6FKye , & - M08N6FKze , M08N6FMxe , M08N6FMye , M08N6FMze , M08N6MKxe , M08N6MKye , M08N6MKze , & - M08N6MMxe , M08N6MMye , M08N6MMze , M08N6RAxe , M08N6RAye , M08N6RAze , M08N6RDxe , & - M08N6RDye , M08N6RDze , M08N6TAxe , M08N6TAye /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry2(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M08N6TAze , M08N6TDxss , M08N6TDyss , M08N6TDzss , M08N7FKxe , M08N7FKye , M08N7FKze , & - M08N7FMxe , M08N7FMye , M08N7FMze , M08N7MKxe , M08N7MKye , M08N7MKze , M08N7MMxe , & - M08N7MMye , M08N7MMze , M08N7RAxe , M08N7RAye , M08N7RAze , M08N7RDxe , M08N7RDye , & - M08N7RDze , M08N7TAxe , M08N7TAye , M08N7TAze , M08N7TDxss , M08N7TDyss , M08N7TDzss , & - M08N8FKxe , M08N8FKye , M08N8FKze , M08N8FMxe , M08N8FMye , M08N8FMze , M08N8MKxe , & - M08N8MKye , M08N8MKze , M08N8MMxe , M08N8MMye , M08N8MMze , M08N8RAxe , M08N8RAye , & - M08N8RAze , M08N8RDxe , M08N8RDye , M08N8RDze , M08N8TAxe , M08N8TAye , M08N8TAze , & - M08N8TDxss , M08N8TDyss , M08N8TDzss , M08N9FKxe , M08N9FKye , M08N9FKze , M08N9FMxe , & - M08N9FMye , M08N9FMze , M08N9MKxe , M08N9MKye , M08N9MKze , M08N9MMxe , M08N9MMye , & - M08N9MMze , M08N9RAxe , M08N9RAye , M08N9RAze , M08N9RDxe , M08N9RDye , M08N9RDze , & - M08N9TAxe , M08N9TAye , M08N9TAze , M08N9TDxss , M08N9TDyss , M08N9TDzss , M09N1FKxe , & - M09N1FKye , M09N1FKze , M09N1FMxe , M09N1FMye , M09N1FMze , M09N1MKxe , M09N1MKye , & - M09N1MKze , M09N1MMxe , M09N1MMye , M09N1MMze , M09N1RAxe , M09N1RAye , M09N1RAze , & - M09N1RDxe , M09N1RDye , M09N1RDze , M09N1TAxe , M09N1TAye , M09N1TAze , M09N1TDxss , & - M09N1TDyss , M09N1TDzss , M09N2FKxe , M09N2FKye , M09N2FKze , M09N2FMxe , M09N2FMye , & - M09N2FMze , M09N2MKxe , M09N2MKye , M09N2MKze , M09N2MMxe , M09N2MMye , M09N2MMze , & - M09N2RAxe , M09N2RAye , M09N2RAze , M09N2RDxe , M09N2RDye , M09N2RDze , M09N2TAxe , & - M09N2TAye , M09N2TAze , M09N2TDxss , M09N2TDyss , M09N2TDzss , M09N3FKxe , M09N3FKye , & - M09N3FKze , M09N3FMxe , M09N3FMye , M09N3FMze , M09N3MKxe , M09N3MKye , M09N3MKze , & - M09N3MMxe , M09N3MMye , M09N3MMze , M09N3RAxe , M09N3RAye , M09N3RAze , M09N3RDxe , & - M09N3RDye , M09N3RDze , M09N3TAxe , M09N3TAye , M09N3TAze , M09N3TDxss , M09N3TDyss , & - M09N3TDzss , M09N4FKxe , M09N4FKye , M09N4FKze , M09N4FMxe , M09N4FMye , M09N4FMze , & - M09N4MKxe , M09N4MKye , M09N4MKze , M09N4MMxe , M09N4MMye , M09N4MMze , M09N4RAxe , & - M09N4RAye , M09N4RAze , M09N4RDxe , M09N4RDye , M09N4RDze , M09N4TAxe , M09N4TAye , & - M09N4TAze , M09N4TDxss , M09N4TDyss , M09N4TDzss , M09N5FKxe , M09N5FKye , M09N5FKze , & - M09N5FMxe , M09N5FMye , M09N5FMze , M09N5MKxe , M09N5MKye , M09N5MKze , M09N5MMxe , & - M09N5MMye , M09N5MMze , M09N5RAxe , M09N5RAye , M09N5RAze , M09N5RDxe , M09N5RDye , & - M09N5RDze , M09N5TAxe , M09N5TAye , M09N5TAze , M09N5TDxss , M09N5TDyss , M09N5TDzss , & - M09N6FKxe , M09N6FKye , M09N6FKze , M09N6FMxe , M09N6FMye , M09N6FMze , M09N6MKxe , & - M09N6MKye , M09N6MKze , M09N6MMxe , M09N6MMye , M09N6MMze , M09N6RAxe , M09N6RAye , & - M09N6RAze , M09N6RDxe , M09N6RDye , M09N6RDze , M09N6TAxe , M09N6TAye , M09N6TAze , & - M09N6TDxss , M09N6TDyss , M09N6TDzss , M09N7FKxe , M09N7FKye , M09N7FKze , M09N7FMxe , & - M09N7FMye , M09N7FMze , M09N7MKxe , M09N7MKye , M09N7MKze , M09N7MMxe , M09N7MMye , & - M09N7MMze , M09N7RAxe , M09N7RAye , M09N7RAze , M09N7RDxe , M09N7RDye , M09N7RDze , & - M09N7TAxe , M09N7TAye , M09N7TAze , M09N7TDxss , M09N7TDyss , M09N7TDzss , M09N8FKxe , & - M09N8FKye , M09N8FKze , M09N8FMxe , M09N8FMye , M09N8FMze , M09N8MKxe , M09N8MKye , & - M09N8MKze , M09N8MMxe , M09N8MMye , M09N8MMze , M09N8RAxe , M09N8RAye , M09N8RAze , & - M09N8RDxe , M09N8RDye , M09N8RDze , M09N8TAxe , M09N8TAye , M09N8TAze , M09N8TDxss , & - M09N8TDyss , M09N8TDzss , M09N9FKxe , M09N9FKye , M09N9FKze , M09N9FMxe , M09N9FMye , & - M09N9FMze , M09N9MKxe , M09N9MKye , M09N9MKze , M09N9MMxe , M09N9MMye , M09N9MMze , & - M09N9RAxe , M09N9RAye , M09N9RAze , M09N9RDxe , M09N9RDye , M09N9RDze , M09N9TAxe , & - M09N9TAye , M09N9TAze , M09N9TDxss , M09N9TDyss , M09N9TDzss , M10N1FKxe , M10N1FKye , & - M10N1FKze , M10N1FMxe , M10N1FMye , M10N1FMze , M10N1MKxe , M10N1MKye , M10N1MKze , & - M10N1MMxe , M10N1MMye , M10N1MMze , M10N1RAxe , M10N1RAye , M10N1RAze , M10N1RDxe , & - M10N1RDye , M10N1RDze , M10N1TAxe , M10N1TAye , M10N1TAze , M10N1TDxss , M10N1TDyss , & - M10N1TDzss , M10N2FKxe , M10N2FKye , M10N2FKze , M10N2FMxe , M10N2FMye , M10N2FMze , & - M10N2MKxe , M10N2MKye , M10N2MKze , M10N2MMxe , M10N2MMye , M10N2MMze , M10N2RAxe , & - M10N2RAye , M10N2RAze , M10N2RDxe , M10N2RDye , M10N2RDze , M10N2TAxe , M10N2TAye , & - M10N2TAze , M10N2TDxss , M10N2TDyss , M10N2TDzss , M10N3FKxe , M10N3FKye , M10N3FKze , & - M10N3FMxe , M10N3FMye , M10N3FMze , M10N3MKxe , M10N3MKye , M10N3MKze , M10N3MMxe , & - M10N3MMye , M10N3MMze , M10N3RAxe , M10N3RAye , M10N3RAze , M10N3RDxe , M10N3RDye , & - M10N3RDze , M10N3TAxe , M10N3TAye , M10N3TAze , M10N3TDxss , M10N3TDyss , M10N3TDzss , & - M10N4FKxe , M10N4FKye , M10N4FKze , M10N4FMxe , M10N4FMye , M10N4FMze , M10N4MKxe , & - M10N4MKye , M10N4MKze , M10N4MMxe , M10N4MMye , M10N4MMze , M10N4RAxe , M10N4RAye , & - M10N4RAze , M10N4RDxe , M10N4RDye , M10N4RDze , M10N4TAxe , M10N4TAye , M10N4TAze , & - M10N4TDxss , M10N4TDyss , M10N4TDzss , M10N5FKxe , M10N5FKye , M10N5FKze , M10N5FMxe , & - M10N5FMye , M10N5FMze , M10N5MKxe , M10N5MKye , M10N5MKze , M10N5MMxe , M10N5MMye , & - M10N5MMze , M10N5RAxe , M10N5RAye , M10N5RAze , M10N5RDxe , M10N5RDye , M10N5RDze , & - M10N5TAxe , M10N5TAye , M10N5TAze , M10N5TDxss , M10N5TDyss , M10N5TDzss , M10N6FKxe , & - M10N6FKye , M10N6FKze , M10N6FMxe , M10N6FMye , M10N6FMze , M10N6MKxe , M10N6MKye , & - M10N6MKze , M10N6MMxe , M10N6MMye , M10N6MMze , M10N6RAxe , M10N6RAye , M10N6RAze , & - M10N6RDxe , M10N6RDye , M10N6RDze , M10N6TAxe , M10N6TAye , M10N6TAze , M10N6TDxss , & - M10N6TDyss , M10N6TDzss , M10N7FKxe , M10N7FKye , M10N7FKze , M10N7FMxe , M10N7FMye , & - M10N7FMze , M10N7MKxe , M10N7MKye , M10N7MKze , M10N7MMxe , M10N7MMye , M10N7MMze , & - M10N7RAxe , M10N7RAye , M10N7RAze , M10N7RDxe , M10N7RDye , M10N7RDze , M10N7TAxe , & - M10N7TAye , M10N7TAze , M10N7TDxss , M10N7TDyss , M10N7TDzss , M10N8FKxe , M10N8FKye , & - M10N8FKze , M10N8FMxe , M10N8FMye , M10N8FMze , M10N8MKxe , M10N8MKye , M10N8MKze , & - M10N8MMxe , M10N8MMye , M10N8MMze , M10N8RAxe , M10N8RAye , M10N8RAze , M10N8RDxe , & - M10N8RDye , M10N8RDze , M10N8TAxe , M10N8TAye , M10N8TAze , M10N8TDxss , M10N8TDyss , & - M10N8TDzss , M10N9FKxe , M10N9FKye , M10N9FKze , M10N9FMxe , M10N9FMye , M10N9FMze , & - M10N9MKxe , M10N9MKye , M10N9MKze , M10N9MMxe , M10N9MMye , M10N9MMze , M10N9RAxe , & - M10N9RAye , M10N9RAze , M10N9RDxe , M10N9RDye , M10N9RDze , M10N9TAxe , M10N9TAye , & - M10N9TAze , M10N9TDxss , M10N9TDyss , M10N9TDzss , M11N1FKxe , M11N1FKye , M11N1FKze , & - M11N1FMxe , M11N1FMye , M11N1FMze , M11N1MKxe , M11N1MKye , M11N1MKze , M11N1MMxe , & - M11N1MMye , M11N1MMze , M11N1RAxe , M11N1RAye , M11N1RAze , M11N1RDxe , M11N1RDye , & - M11N1RDze , M11N1TAxe , M11N1TAye , M11N1TAze , M11N1TDxss , M11N1TDyss , M11N1TDzss , & - M11N2FKxe , M11N2FKye , M11N2FKze , M11N2FMxe , M11N2FMye , M11N2FMze , M11N2MKxe , & - M11N2MKye , M11N2MKze , M11N2MMxe , M11N2MMye , M11N2MMze , M11N2RAxe , M11N2RAye , & - M11N2RAze , M11N2RDxe , M11N2RDye , M11N2RDze , M11N2TAxe , M11N2TAye , M11N2TAze , & - M11N2TDxss , M11N2TDyss , M11N2TDzss , M11N3FKxe , M11N3FKye , M11N3FKze , M11N3FMxe , & - M11N3FMye , M11N3FMze , M11N3MKxe , M11N3MKye , M11N3MKze , M11N3MMxe , M11N3MMye , & - M11N3MMze , M11N3RAxe , M11N3RAye , M11N3RAze , M11N3RDxe , M11N3RDye , M11N3RDze , & - M11N3TAxe , M11N3TAye , M11N3TAze , M11N3TDxss , M11N3TDyss , M11N3TDzss , M11N4FKxe , & - M11N4FKye , M11N4FKze , M11N4FMxe , M11N4FMye , M11N4FMze , M11N4MKxe , M11N4MKye , & - M11N4MKze , M11N4MMxe , M11N4MMye , M11N4MMze , M11N4RAxe , M11N4RAye , M11N4RAze , & - M11N4RDxe , M11N4RDye , M11N4RDze , M11N4TAxe , M11N4TAye , M11N4TAze , M11N4TDxss , & - M11N4TDyss , M11N4TDzss , M11N5FKxe , M11N5FKye , M11N5FKze , M11N5FMxe , M11N5FMye , & - M11N5FMze , M11N5MKxe , M11N5MKye , M11N5MKze , M11N5MMxe , M11N5MMye , M11N5MMze , & - M11N5RAxe , M11N5RAye , M11N5RAze , M11N5RDxe , M11N5RDye , M11N5RDze , M11N5TAxe , & - M11N5TAye , M11N5TAze , M11N5TDxss , M11N5TDyss , M11N5TDzss , M11N6FKxe , M11N6FKye , & - M11N6FKze , M11N6FMxe , M11N6FMye , M11N6FMze , M11N6MKxe , M11N6MKye , M11N6MKze , & - M11N6MMxe , M11N6MMye , M11N6MMze , M11N6RAxe , M11N6RAye , M11N6RAze , M11N6RDxe , & - M11N6RDye , M11N6RDze , M11N6TAxe , M11N6TAye , M11N6TAze , M11N6TDxss , M11N6TDyss , & - M11N6TDzss , M11N7FKxe , M11N7FKye , M11N7FKze , M11N7FMxe , M11N7FMye , M11N7FMze , & - M11N7MKxe , M11N7MKye , M11N7MKze , M11N7MMxe , M11N7MMye , M11N7MMze , M11N7RAxe , & - M11N7RAye , M11N7RAze , M11N7RDxe , M11N7RDye , M11N7RDze , M11N7TAxe , M11N7TAye , & - M11N7TAze , M11N7TDxss , M11N7TDyss , M11N7TDzss , M11N8FKxe , M11N8FKye , M11N8FKze , & - M11N8FMxe , M11N8FMye , M11N8FMze , M11N8MKxe , M11N8MKye , M11N8MKze , M11N8MMxe , & - M11N8MMye , M11N8MMze , M11N8RAxe , M11N8RAye , M11N8RAze , M11N8RDxe , M11N8RDye , & - M11N8RDze , M11N8TAxe , M11N8TAye , M11N8TAze , M11N8TDxss , M11N8TDyss , M11N8TDzss , & - M11N9FKxe , M11N9FKye , M11N9FKze , M11N9FMxe , M11N9FMye , M11N9FMze , M11N9MKxe , & - M11N9MKye , M11N9MKze , M11N9MMxe , M11N9MMye , M11N9MMze , M11N9RAxe , M11N9RAye , & - M11N9RAze , M11N9RDxe , M11N9RDye , M11N9RDze , M11N9TAxe , M11N9TAye , M11N9TAze , & - M11N9TDxss , M11N9TDyss , M11N9TDzss , M12N1FKxe , M12N1FKye , M12N1FKze , M12N1FMxe , & - M12N1FMye , M12N1FMze , M12N1MKxe , M12N1MKye , M12N1MKze , M12N1MMxe , M12N1MMye , & - M12N1MMze , M12N1RAxe , M12N1RAye , M12N1RAze , M12N1RDxe , M12N1RDye , M12N1RDze , & - M12N1TAxe , M12N1TAye , M12N1TAze , M12N1TDxss , M12N1TDyss , M12N1TDzss , M12N2FKxe , & - M12N2FKye , M12N2FKze , M12N2FMxe , M12N2FMye , M12N2FMze , M12N2MKxe , M12N2MKye , & - M12N2MKze , M12N2MMxe , M12N2MMye , M12N2MMze , M12N2RAxe , M12N2RAye , M12N2RAze , & - M12N2RDxe , M12N2RDye , M12N2RDze , M12N2TAxe , M12N2TAye , M12N2TAze , M12N2TDxss , & - M12N2TDyss , M12N2TDzss , M12N3FKxe , M12N3FKye , M12N3FKze , M12N3FMxe , M12N3FMye , & - M12N3FMze , M12N3MKxe , M12N3MKye , M12N3MKze , M12N3MMxe , M12N3MMye , M12N3MMze , & - M12N3RAxe , M12N3RAye , M12N3RAze , M12N3RDxe , M12N3RDye , M12N3RDze , M12N3TAxe , & - M12N3TAye , M12N3TAze , M12N3TDxss , M12N3TDyss , M12N3TDzss , M12N4FKxe , M12N4FKye , & - M12N4FKze , M12N4FMxe , M12N4FMye , M12N4FMze , M12N4MKxe , M12N4MKye , M12N4MKze , & - M12N4MMxe , M12N4MMye , M12N4MMze , M12N4RAxe , M12N4RAye , M12N4RAze , M12N4RDxe , & - M12N4RDye , M12N4RDze , M12N4TAxe , M12N4TAye , M12N4TAze , M12N4TDxss , M12N4TDyss , & - M12N4TDzss , M12N5FKxe , M12N5FKye , M12N5FKze , M12N5FMxe , M12N5FMye , M12N5FMze , & - M12N5MKxe , M12N5MKye , M12N5MKze , M12N5MMxe , M12N5MMye , M12N5MMze , M12N5RAxe , & - M12N5RAye , M12N5RAze , M12N5RDxe , M12N5RDye , M12N5RDze , M12N5TAxe , M12N5TAye , & - M12N5TAze , M12N5TDxss , M12N5TDyss , M12N5TDzss , M12N6FKxe , M12N6FKye , M12N6FKze , & - M12N6FMxe , M12N6FMye , M12N6FMze , M12N6MKxe , M12N6MKye , M12N6MKze , M12N6MMxe , & - M12N6MMye , M12N6MMze , M12N6RAxe , M12N6RAye , M12N6RAze , M12N6RDxe , M12N6RDye , & - M12N6RDze , M12N6TAxe , M12N6TAye , M12N6TAze , M12N6TDxss , M12N6TDyss , M12N6TDzss , & - M12N7FKxe , M12N7FKye , M12N7FKze , M12N7FMxe , M12N7FMye , M12N7FMze , M12N7MKxe , & - M12N7MKye , M12N7MKze , M12N7MMxe , M12N7MMye , M12N7MMze , M12N7RAxe , M12N7RAye , & - M12N7RAze , M12N7RDxe , M12N7RDye , M12N7RDze , M12N7TAxe , M12N7TAye , M12N7TAze , & - M12N7TDxss , M12N7TDyss , M12N7TDzss , M12N8FKxe , M12N8FKye , M12N8FKze , M12N8FMxe , & - M12N8FMye , M12N8FMze , M12N8MKxe , M12N8MKye , M12N8MKze , M12N8MMxe , M12N8MMye , & - M12N8MMze , M12N8RAxe , M12N8RAye , M12N8RAze , M12N8RDxe , M12N8RDye , M12N8RDze , & - M12N8TAxe , M12N8TAye , M12N8TAze , M12N8TDxss , M12N8TDyss , M12N8TDzss , M12N9FKxe , & - M12N9FKye , M12N9FKze , M12N9FMxe , M12N9FMye , M12N9FMze , M12N9MKxe , M12N9MKye , & - M12N9MKze , M12N9MMxe , M12N9MMye , M12N9MMze , M12N9RAxe , M12N9RAye , M12N9RAze , & - M12N9RDxe , M12N9RDye , M12N9RDze , M12N9TAxe , M12N9TAye , M12N9TAze , M12N9TDxss , & - M12N9TDyss , M12N9TDzss , M13N1FKxe , M13N1FKye , M13N1FKze , M13N1FMxe , M13N1FMye , & - M13N1FMze , M13N1MKxe , M13N1MKye , M13N1MKze , M13N1MMxe , M13N1MMye , M13N1MMze , & - M13N1RAxe , M13N1RAye , M13N1RAze , M13N1RDxe , M13N1RDye , M13N1RDze , M13N1TAxe , & - M13N1TAye , M13N1TAze , M13N1TDxss , M13N1TDyss , M13N1TDzss , M13N2FKxe , M13N2FKye , & - M13N2FKze , M13N2FMxe , M13N2FMye , M13N2FMze , M13N2MKxe , M13N2MKye , M13N2MKze , & - M13N2MMxe , M13N2MMye , M13N2MMze , M13N2RAxe , M13N2RAye , M13N2RAze , M13N2RDxe , & - M13N2RDye , M13N2RDze , M13N2TAxe , M13N2TAye , M13N2TAze , M13N2TDxss , M13N2TDyss , & - M13N2TDzss , M13N3FKxe , M13N3FKye , M13N3FKze , M13N3FMxe , M13N3FMye , M13N3FMze , & - M13N3MKxe , M13N3MKye , M13N3MKze , M13N3MMxe , M13N3MMye , M13N3MMze , M13N3RAxe , & - M13N3RAye , M13N3RAze , M13N3RDxe , M13N3RDye , M13N3RDze , M13N3TAxe , M13N3TAye , & - M13N3TAze , M13N3TDxss , M13N3TDyss , M13N3TDzss , M13N4FKxe , M13N4FKye , M13N4FKze , & - M13N4FMxe , M13N4FMye , M13N4FMze , M13N4MKxe , M13N4MKye , M13N4MKze , M13N4MMxe , & - M13N4MMye , M13N4MMze , M13N4RAxe , M13N4RAye , M13N4RAze , M13N4RDxe , M13N4RDye , & - M13N4RDze , M13N4TAxe , M13N4TAye , M13N4TAze , M13N4TDxss , M13N4TDyss , M13N4TDzss , & - M13N5FKxe , M13N5FKye , M13N5FKze , M13N5FMxe , M13N5FMye , M13N5FMze , M13N5MKxe , & - M13N5MKye , M13N5MKze , M13N5MMxe , M13N5MMye , M13N5MMze , M13N5RAxe , M13N5RAye , & - M13N5RAze , M13N5RDxe , M13N5RDye , M13N5RDze , M13N5TAxe , M13N5TAye , M13N5TAze , & - M13N5TDxss , M13N5TDyss , M13N5TDzss , M13N6FKxe , M13N6FKye , M13N6FKze , M13N6FMxe , & - M13N6FMye , M13N6FMze , M13N6MKxe , M13N6MKye , M13N6MKze , M13N6MMxe , M13N6MMye , & - M13N6MMze , M13N6RAxe , M13N6RAye , M13N6RAze , M13N6RDxe , M13N6RDye , M13N6RDze , & - M13N6TAxe , M13N6TAye , M13N6TAze , M13N6TDxss , M13N6TDyss , M13N6TDzss , M13N7FKxe , & - M13N7FKye , M13N7FKze , M13N7FMxe , M13N7FMye , M13N7FMze , M13N7MKxe , M13N7MKye , & - M13N7MKze , M13N7MMxe , M13N7MMye , M13N7MMze , M13N7RAxe , M13N7RAye , M13N7RAze , & - M13N7RDxe , M13N7RDye , M13N7RDze , M13N7TAxe , M13N7TAye , M13N7TAze , M13N7TDxss , & - M13N7TDyss , M13N7TDzss , M13N8FKxe , M13N8FKye , M13N8FKze , M13N8FMxe , M13N8FMye , & - M13N8FMze , M13N8MKxe , M13N8MKye , M13N8MKze , M13N8MMxe , M13N8MMye , M13N8MMze , & - M13N8RAxe , M13N8RAye , M13N8RAze , M13N8RDxe , M13N8RDye , M13N8RDze , M13N8TAxe , & - M13N8TAye , M13N8TAze , M13N8TDxss , M13N8TDyss , M13N8TDzss , M13N9FKxe , M13N9FKye , & - M13N9FKze , M13N9FMxe , M13N9FMye , M13N9FMze , M13N9MKxe , M13N9MKye , M13N9MKze , & - M13N9MMxe , M13N9MMye , M13N9MMze , M13N9RAxe , M13N9RAye , M13N9RAze , M13N9RDxe , & - M13N9RDye , M13N9RDze , M13N9TAxe , M13N9TAye , M13N9TAze , M13N9TDxss , M13N9TDyss , & - M13N9TDzss , M14N1FKxe , M14N1FKye , M14N1FKze , M14N1FMxe , M14N1FMye , M14N1FMze , & - M14N1MKxe , M14N1MKye , M14N1MKze , M14N1MMxe , M14N1MMye , M14N1MMze , M14N1RAxe , & - M14N1RAye , M14N1RAze , M14N1RDxe , M14N1RDye , M14N1RDze , M14N1TAxe , M14N1TAye , & - M14N1TAze , M14N1TDxss , M14N1TDyss , M14N1TDzss , M14N2FKxe , M14N2FKye , M14N2FKze , & - M14N2FMxe , M14N2FMye , M14N2FMze , M14N2MKxe , M14N2MKye , M14N2MKze , M14N2MMxe , & - M14N2MMye , M14N2MMze , M14N2RAxe , M14N2RAye , M14N2RAze , M14N2RDxe , M14N2RDye , & - M14N2RDze , M14N2TAxe , M14N2TAye , M14N2TAze , M14N2TDxss , M14N2TDyss , M14N2TDzss , & - M14N3FKxe , M14N3FKye , M14N3FKze , M14N3FMxe , M14N3FMye , M14N3FMze , M14N3MKxe , & - M14N3MKye , M14N3MKze , M14N3MMxe , M14N3MMye , M14N3MMze , M14N3RAxe , M14N3RAye , & - M14N3RAze , M14N3RDxe , M14N3RDye , M14N3RDze , M14N3TAxe , M14N3TAye , M14N3TAze , & - M14N3TDxss , M14N3TDyss , M14N3TDzss , M14N4FKxe , M14N4FKye , M14N4FKze , M14N4FMxe , & - M14N4FMye , M14N4FMze , M14N4MKxe , M14N4MKye , M14N4MKze , M14N4MMxe , M14N4MMye , & - M14N4MMze , M14N4RAxe , M14N4RAye , M14N4RAze , M14N4RDxe , M14N4RDye , M14N4RDze , & - M14N4TAxe , M14N4TAye , M14N4TAze , M14N4TDxss , M14N4TDyss , M14N4TDzss , M14N5FKxe , & - M14N5FKye , M14N5FKze , M14N5FMxe , M14N5FMye , M14N5FMze , M14N5MKxe , M14N5MKye , & - M14N5MKze , M14N5MMxe , M14N5MMye , M14N5MMze , M14N5RAxe , M14N5RAye , M14N5RAze , & - M14N5RDxe , M14N5RDye , M14N5RDze , M14N5TAxe , M14N5TAye , M14N5TAze , M14N5TDxss , & - M14N5TDyss , M14N5TDzss , M14N6FKxe , M14N6FKye , M14N6FKze , M14N6FMxe , M14N6FMye , & - M14N6FMze , M14N6MKxe , M14N6MKye , M14N6MKze , M14N6MMxe , M14N6MMye , M14N6MMze , & - M14N6RAxe , M14N6RAye , M14N6RAze , M14N6RDxe , M14N6RDye , M14N6RDze , M14N6TAxe , & - M14N6TAye , M14N6TAze , M14N6TDxss , M14N6TDyss , M14N6TDzss , M14N7FKxe , M14N7FKye , & - M14N7FKze , M14N7FMxe , M14N7FMye , M14N7FMze , M14N7MKxe , M14N7MKye , M14N7MKze , & - M14N7MMxe , M14N7MMye , M14N7MMze , M14N7RAxe , M14N7RAye , M14N7RAze , M14N7RDxe , & - M14N7RDye , M14N7RDze , M14N7TAxe , M14N7TAye , M14N7TAze , M14N7TDxss , M14N7TDyss , & - M14N7TDzss , M14N8FKxe , M14N8FKye , M14N8FKze , M14N8FMxe , M14N8FMye , M14N8FMze , & - M14N8MKxe , M14N8MKye , M14N8MKze , M14N8MMxe , M14N8MMye , M14N8MMze , M14N8RAxe , & - M14N8RAye , M14N8RAze , M14N8RDxe , M14N8RDye , M14N8RDze , M14N8TAxe , M14N8TAye , & - M14N8TAze , M14N8TDxss , M14N8TDyss , M14N8TDzss , M14N9FKxe , M14N9FKye , M14N9FKze , & - M14N9FMxe , M14N9FMye , M14N9FMze , M14N9MKxe , M14N9MKye , M14N9MKze , M14N9MMxe , & - M14N9MMye , M14N9MMze , M14N9RAxe , M14N9RAye , M14N9RAze , M14N9RDxe , M14N9RDye , & - M14N9RDze , M14N9TAxe , M14N9TAye , M14N9TAze , M14N9TDxss , M14N9TDyss , M14N9TDzss , & - M15N1FKxe , M15N1FKye , M15N1FKze , M15N1FMxe , M15N1FMye , M15N1FMze , M15N1MKxe , & - M15N1MKye , M15N1MKze , M15N1MMxe , M15N1MMye , M15N1MMze , M15N1RAxe , M15N1RAye , & - M15N1RAze , M15N1RDxe , M15N1RDye , M15N1RDze , M15N1TAxe , M15N1TAye , M15N1TAze , & - M15N1TDxss , M15N1TDyss , M15N1TDzss , M15N2FKxe , M15N2FKye , M15N2FKze , M15N2FMxe , & - M15N2FMye , M15N2FMze , M15N2MKxe , M15N2MKye , M15N2MKze , M15N2MMxe , M15N2MMye , & - M15N2MMze , M15N2RAxe , M15N2RAye , M15N2RAze , M15N2RDxe , M15N2RDye , M15N2RDze , & - M15N2TAxe , M15N2TAye , M15N2TAze , M15N2TDxss , M15N2TDyss , M15N2TDzss , M15N3FKxe , & - M15N3FKye , M15N3FKze , M15N3FMxe , M15N3FMye , M15N3FMze , M15N3MKxe , M15N3MKye , & - M15N3MKze , M15N3MMxe , M15N3MMye , M15N3MMze , M15N3RAxe , M15N3RAye , M15N3RAze , & - M15N3RDxe , M15N3RDye , M15N3RDze , M15N3TAxe , M15N3TAye , M15N3TAze , M15N3TDxss , & - M15N3TDyss , M15N3TDzss , M15N4FKxe , M15N4FKye , M15N4FKze , M15N4FMxe , M15N4FMye , & - M15N4FMze , M15N4MKxe , M15N4MKye , M15N4MKze , M15N4MMxe , M15N4MMye , M15N4MMze , & - M15N4RAxe , M15N4RAye , M15N4RAze , M15N4RDxe , M15N4RDye , M15N4RDze , M15N4TAxe , & - M15N4TAye , M15N4TAze , M15N4TDxss , M15N4TDyss , M15N4TDzss , M15N5FKxe , M15N5FKye , & - M15N5FKze , M15N5FMxe , M15N5FMye , M15N5FMze , M15N5MKxe , M15N5MKye , M15N5MKze , & - M15N5MMxe , M15N5MMye , M15N5MMze , M15N5RAxe , M15N5RAye , M15N5RAze , M15N5RDxe , & - M15N5RDye , M15N5RDze , M15N5TAxe , M15N5TAye , M15N5TAze , M15N5TDxss , M15N5TDyss , & - M15N5TDzss , M15N6FKxe , M15N6FKye , M15N6FKze , M15N6FMxe , M15N6FMye , M15N6FMze , & - M15N6MKxe , M15N6MKye , M15N6MKze , M15N6MMxe , M15N6MMye , M15N6MMze , M15N6RAxe , & - M15N6RAye , M15N6RAze , M15N6RDxe , M15N6RDye , M15N6RDze , M15N6TAxe , M15N6TAye , & - M15N6TAze , M15N6TDxss , M15N6TDyss , M15N6TDzss , M15N7FKxe , M15N7FKye , M15N7FKze , & - M15N7FMxe , M15N7FMye , M15N7FMze , M15N7MKxe , M15N7MKye , M15N7MKze , M15N7MMxe , & - M15N7MMye , M15N7MMze , M15N7RAxe , M15N7RAye , M15N7RAze , M15N7RDxe , M15N7RDye , & - M15N7RDze , M15N7TAxe , M15N7TAye , M15N7TAze , M15N7TDxss , M15N7TDyss , M15N7TDzss , & - M15N8FKxe , M15N8FKye , M15N8FKze , M15N8FMxe , M15N8FMye , M15N8FMze , M15N8MKxe , & - M15N8MKye , M15N8MKze , M15N8MMxe , M15N8MMye , M15N8MMze , M15N8RAxe , M15N8RAye , & - M15N8RAze , M15N8RDxe , M15N8RDye , M15N8RDze , M15N8TAxe , M15N8TAye , M15N8TAze , & - M15N8TDxss , M15N8TDyss , M15N8TDzss , M15N9FKxe , M15N9FKye , M15N9FKze , M15N9FMxe , & - M15N9FMye , M15N9FMze , M15N9MKxe , M15N9MKye , M15N9MKze , M15N9MMxe , M15N9MMye , & - M15N9MMze , M15N9RAxe , M15N9RAye , M15N9RAze , M15N9RDxe , M15N9RDye , M15N9RDze , & - M15N9TAxe , M15N9TAye , M15N9TAze , M15N9TDxss , M15N9TDyss , M15N9TDzss , M16N1FKxe , & - M16N1FKye , M16N1FKze , M16N1FMxe , M16N1FMye , M16N1FMze , M16N1MKxe , M16N1MKye , & - M16N1MKze , M16N1MMxe , M16N1MMye , M16N1MMze , M16N1RAxe , M16N1RAye , M16N1RAze , & - M16N1RDxe , M16N1RDye , M16N1RDze , M16N1TAxe , M16N1TAye , M16N1TAze , M16N1TDxss , & - M16N1TDyss , M16N1TDzss , M16N2FKxe , M16N2FKye , M16N2FKze , M16N2FMxe , M16N2FMye , & - M16N2FMze , M16N2MKxe , M16N2MKye , M16N2MKze , M16N2MMxe , M16N2MMye , M16N2MMze , & - M16N2RAxe , M16N2RAye , M16N2RAze , M16N2RDxe , M16N2RDye , M16N2RDze , M16N2TAxe , & - M16N2TAye , M16N2TAze , M16N2TDxss , M16N2TDyss , M16N2TDzss , M16N3FKxe , M16N3FKye , & - M16N3FKze , M16N3FMxe , M16N3FMye , M16N3FMze , M16N3MKxe , M16N3MKye , M16N3MKze , & - M16N3MMxe , M16N3MMye , M16N3MMze , M16N3RAxe , M16N3RAye , M16N3RAze , M16N3RDxe , & - M16N3RDye , M16N3RDze , M16N3TAxe , M16N3TAye , M16N3TAze , M16N3TDxss , M16N3TDyss , & - M16N3TDzss , M16N4FKxe , M16N4FKye , M16N4FKze , M16N4FMxe , M16N4FMye , M16N4FMze , & - M16N4MKxe , M16N4MKye , M16N4MKze , M16N4MMxe /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry3(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M16N4MMye , M16N4MMze , M16N4RAxe , M16N4RAye , M16N4RAze , M16N4RDxe , M16N4RDye , & - M16N4RDze , M16N4TAxe , M16N4TAye , M16N4TAze , M16N4TDxss , M16N4TDyss , M16N4TDzss , & - M16N5FKxe , M16N5FKye , M16N5FKze , M16N5FMxe , M16N5FMye , M16N5FMze , M16N5MKxe , & - M16N5MKye , M16N5MKze , M16N5MMxe , M16N5MMye , M16N5MMze , M16N5RAxe , M16N5RAye , & - M16N5RAze , M16N5RDxe , M16N5RDye , M16N5RDze , M16N5TAxe , M16N5TAye , M16N5TAze , & - M16N5TDxss , M16N5TDyss , M16N5TDzss , M16N6FKxe , M16N6FKye , M16N6FKze , M16N6FMxe , & - M16N6FMye , M16N6FMze , M16N6MKxe , M16N6MKye , M16N6MKze , M16N6MMxe , M16N6MMye , & - M16N6MMze , M16N6RAxe , M16N6RAye , M16N6RAze , M16N6RDxe , M16N6RDye , M16N6RDze , & - M16N6TAxe , M16N6TAye , M16N6TAze , M16N6TDxss , M16N6TDyss , M16N6TDzss , M16N7FKxe , & - M16N7FKye , M16N7FKze , M16N7FMxe , M16N7FMye , M16N7FMze , M16N7MKxe , M16N7MKye , & - M16N7MKze , M16N7MMxe , M16N7MMye , M16N7MMze , M16N7RAxe , M16N7RAye , M16N7RAze , & - M16N7RDxe , M16N7RDye , M16N7RDze , M16N7TAxe , M16N7TAye , M16N7TAze , M16N7TDxss , & - M16N7TDyss , M16N7TDzss , M16N8FKxe , M16N8FKye , M16N8FKze , M16N8FMxe , M16N8FMye , & - M16N8FMze , M16N8MKxe , M16N8MKye , M16N8MKze , M16N8MMxe , M16N8MMye , M16N8MMze , & - M16N8RAxe , M16N8RAye , M16N8RAze , M16N8RDxe , M16N8RDye , M16N8RDze , M16N8TAxe , & - M16N8TAye , M16N8TAze , M16N8TDxss , M16N8TDyss , M16N8TDzss , M16N9FKxe , M16N9FKye , & - M16N9FKze , M16N9FMxe , M16N9FMye , M16N9FMze , M16N9MKxe , M16N9MKye , M16N9MKze , & - M16N9MMxe , M16N9MMye , M16N9MMze , M16N9RAxe , M16N9RAye , M16N9RAze , M16N9RDxe , & - M16N9RDye , M16N9RDze , M16N9TAxe , M16N9TAye , M16N9TAze , M16N9TDxss , M16N9TDyss , & - M16N9TDzss , M17N1FKxe , M17N1FKye , M17N1FKze , M17N1FMxe , M17N1FMye , M17N1FMze , & - M17N1MKxe , M17N1MKye , M17N1MKze , M17N1MMxe , M17N1MMye , M17N1MMze , M17N1RAxe , & - M17N1RAye , M17N1RAze , M17N1RDxe , M17N1RDye , M17N1RDze , M17N1TAxe , M17N1TAye , & - M17N1TAze , M17N1TDxss , M17N1TDyss , M17N1TDzss , M17N2FKxe , M17N2FKye , M17N2FKze , & - M17N2FMxe , M17N2FMye , M17N2FMze , M17N2MKxe , M17N2MKye , M17N2MKze , M17N2MMxe , & - M17N2MMye , M17N2MMze , M17N2RAxe , M17N2RAye , M17N2RAze , M17N2RDxe , M17N2RDye , & - M17N2RDze , M17N2TAxe , M17N2TAye , M17N2TAze , M17N2TDxss , M17N2TDyss , M17N2TDzss , & - M17N3FKxe , M17N3FKye , M17N3FKze , M17N3FMxe , M17N3FMye , M17N3FMze , M17N3MKxe , & - M17N3MKye , M17N3MKze , M17N3MMxe , M17N3MMye , M17N3MMze , M17N3RAxe , M17N3RAye , & - M17N3RAze , M17N3RDxe , M17N3RDye , M17N3RDze , M17N3TAxe , M17N3TAye , M17N3TAze , & - M17N3TDxss , M17N3TDyss , M17N3TDzss , M17N4FKxe , M17N4FKye , M17N4FKze , M17N4FMxe , & - M17N4FMye , M17N4FMze , M17N4MKxe , M17N4MKye , M17N4MKze , M17N4MMxe , M17N4MMye , & - M17N4MMze , M17N4RAxe , M17N4RAye , M17N4RAze , M17N4RDxe , M17N4RDye , M17N4RDze , & - M17N4TAxe , M17N4TAye , M17N4TAze , M17N4TDxss , M17N4TDyss , M17N4TDzss , M17N5FKxe , & - M17N5FKye , M17N5FKze , M17N5FMxe , M17N5FMye , M17N5FMze , M17N5MKxe , M17N5MKye , & - M17N5MKze , M17N5MMxe , M17N5MMye , M17N5MMze , M17N5RAxe , M17N5RAye , M17N5RAze , & - M17N5RDxe , M17N5RDye , M17N5RDze , M17N5TAxe , M17N5TAye , M17N5TAze , M17N5TDxss , & - M17N5TDyss , M17N5TDzss , M17N6FKxe , M17N6FKye , M17N6FKze , M17N6FMxe , M17N6FMye , & - M17N6FMze , M17N6MKxe , M17N6MKye , M17N6MKze , M17N6MMxe , M17N6MMye , M17N6MMze , & - M17N6RAxe , M17N6RAye , M17N6RAze , M17N6RDxe , M17N6RDye , M17N6RDze , M17N6TAxe , & - M17N6TAye , M17N6TAze , M17N6TDxss , M17N6TDyss , M17N6TDzss , M17N7FKxe , M17N7FKye , & - M17N7FKze , M17N7FMxe , M17N7FMye , M17N7FMze , M17N7MKxe , M17N7MKye , M17N7MKze , & - M17N7MMxe , M17N7MMye , M17N7MMze , M17N7RAxe , M17N7RAye , M17N7RAze , M17N7RDxe , & - M17N7RDye , M17N7RDze , M17N7TAxe , M17N7TAye , M17N7TAze , M17N7TDxss , M17N7TDyss , & - M17N7TDzss , M17N8FKxe , M17N8FKye , M17N8FKze , M17N8FMxe , M17N8FMye , M17N8FMze , & - M17N8MKxe , M17N8MKye , M17N8MKze , M17N8MMxe , M17N8MMye , M17N8MMze , M17N8RAxe , & - M17N8RAye , M17N8RAze , M17N8RDxe , M17N8RDye , M17N8RDze , M17N8TAxe , M17N8TAye , & - M17N8TAze , M17N8TDxss , M17N8TDyss , M17N8TDzss , M17N9FKxe , M17N9FKye , M17N9FKze , & - M17N9FMxe , M17N9FMye , M17N9FMze , M17N9MKxe , M17N9MKye , M17N9MKze , M17N9MMxe , & - M17N9MMye , M17N9MMze , M17N9RAxe , M17N9RAye , M17N9RAze , M17N9RDxe , M17N9RDye , & - M17N9RDze , M17N9TAxe , M17N9TAye , M17N9TAze , M17N9TDxss , M17N9TDyss , M17N9TDzss , & - M18N1FKxe , M18N1FKye , M18N1FKze , M18N1FMxe , M18N1FMye , M18N1FMze , M18N1MKxe , & - M18N1MKye , M18N1MKze , M18N1MMxe , M18N1MMye , M18N1MMze , M18N1RAxe , M18N1RAye , & - M18N1RAze , M18N1RDxe , M18N1RDye , M18N1RDze , M18N1TAxe , M18N1TAye , M18N1TAze , & - M18N1TDxss , M18N1TDyss , M18N1TDzss , M18N2FKxe , M18N2FKye , M18N2FKze , M18N2FMxe , & - M18N2FMye , M18N2FMze , M18N2MKxe , M18N2MKye , M18N2MKze , M18N2MMxe , M18N2MMye , & - M18N2MMze , M18N2RAxe , M18N2RAye , M18N2RAze , M18N2RDxe , M18N2RDye , M18N2RDze , & - M18N2TAxe , M18N2TAye , M18N2TAze , M18N2TDxss , M18N2TDyss , M18N2TDzss , M18N3FKxe , & - M18N3FKye , M18N3FKze , M18N3FMxe , M18N3FMye , M18N3FMze , M18N3MKxe , M18N3MKye , & - M18N3MKze , M18N3MMxe , M18N3MMye , M18N3MMze , M18N3RAxe , M18N3RAye , M18N3RAze , & - M18N3RDxe , M18N3RDye , M18N3RDze , M18N3TAxe , M18N3TAye , M18N3TAze , M18N3TDxss , & - M18N3TDyss , M18N3TDzss , M18N4FKxe , M18N4FKye , M18N4FKze , M18N4FMxe , M18N4FMye , & - M18N4FMze , M18N4MKxe , M18N4MKye , M18N4MKze , M18N4MMxe , M18N4MMye , M18N4MMze , & - M18N4RAxe , M18N4RAye , M18N4RAze , M18N4RDxe , M18N4RDye , M18N4RDze , M18N4TAxe , & - M18N4TAye , M18N4TAze , M18N4TDxss , M18N4TDyss , M18N4TDzss , M18N5FKxe , M18N5FKye , & - M18N5FKze , M18N5FMxe , M18N5FMye , M18N5FMze , M18N5MKxe , M18N5MKye , M18N5MKze , & - M18N5MMxe , M18N5MMye , M18N5MMze , M18N5RAxe , M18N5RAye , M18N5RAze , M18N5RDxe , & - M18N5RDye , M18N5RDze , M18N5TAxe , M18N5TAye , M18N5TAze , M18N5TDxss , M18N5TDyss , & - M18N5TDzss , M18N6FKxe , M18N6FKye , M18N6FKze , M18N6FMxe , M18N6FMye , M18N6FMze , & - M18N6MKxe , M18N6MKye , M18N6MKze , M18N6MMxe , M18N6MMye , M18N6MMze , M18N6RAxe , & - M18N6RAye , M18N6RAze , M18N6RDxe , M18N6RDye , M18N6RDze , M18N6TAxe , M18N6TAye , & - M18N6TAze , M18N6TDxss , M18N6TDyss , M18N6TDzss , M18N7FKxe , M18N7FKye , M18N7FKze , & - M18N7FMxe , M18N7FMye , M18N7FMze , M18N7MKxe , M18N7MKye , M18N7MKze , M18N7MMxe , & - M18N7MMye , M18N7MMze , M18N7RAxe , M18N7RAye , M18N7RAze , M18N7RDxe , M18N7RDye , & - M18N7RDze , M18N7TAxe , M18N7TAye , M18N7TAze , M18N7TDxss , M18N7TDyss , M18N7TDzss , & - M18N8FKxe , M18N8FKye , M18N8FKze , M18N8FMxe , M18N8FMye , M18N8FMze , M18N8MKxe , & - M18N8MKye , M18N8MKze , M18N8MMxe , M18N8MMye , M18N8MMze , M18N8RAxe , M18N8RAye , & - M18N8RAze , M18N8RDxe , M18N8RDye , M18N8RDze , M18N8TAxe , M18N8TAye , M18N8TAze , & - M18N8TDxss , M18N8TDyss , M18N8TDzss , M18N9FKxe , M18N9FKye , M18N9FKze , M18N9FMxe , & - M18N9FMye , M18N9FMze , M18N9MKxe , M18N9MKye , M18N9MKze , M18N9MMxe , M18N9MMye , & - M18N9MMze , M18N9RAxe , M18N9RAye , M18N9RAze , M18N9RDxe , M18N9RDye , M18N9RDze , & - M18N9TAxe , M18N9TAye , M18N9TAze , M18N9TDxss , M18N9TDyss , M18N9TDzss , M19N1FKxe , & - M19N1FKye , M19N1FKze , M19N1FMxe , M19N1FMye , M19N1FMze , M19N1MKxe , M19N1MKye , & - M19N1MKze , M19N1MMxe , M19N1MMye , M19N1MMze , M19N1RAxe , M19N1RAye , M19N1RAze , & - M19N1RDxe , M19N1RDye , M19N1RDze , M19N1TAxe , M19N1TAye , M19N1TAze , M19N1TDxss , & - M19N1TDyss , M19N1TDzss , M19N2FKxe , M19N2FKye , M19N2FKze , M19N2FMxe , M19N2FMye , & - M19N2FMze , M19N2MKxe , M19N2MKye , M19N2MKze , M19N2MMxe , M19N2MMye , M19N2MMze , & - M19N2RAxe , M19N2RAye , M19N2RAze , M19N2RDxe , M19N2RDye , M19N2RDze , M19N2TAxe , & - M19N2TAye , M19N2TAze , M19N2TDxss , M19N2TDyss , M19N2TDzss , M19N3FKxe , M19N3FKye , & - M19N3FKze , M19N3FMxe , M19N3FMye , M19N3FMze , M19N3MKxe , M19N3MKye , M19N3MKze , & - M19N3MMxe , M19N3MMye , M19N3MMze , M19N3RAxe , M19N3RAye , M19N3RAze , M19N3RDxe , & - M19N3RDye , M19N3RDze , M19N3TAxe , M19N3TAye , M19N3TAze , M19N3TDxss , M19N3TDyss , & - M19N3TDzss , M19N4FKxe , M19N4FKye , M19N4FKze , M19N4FMxe , M19N4FMye , M19N4FMze , & - M19N4MKxe , M19N4MKye , M19N4MKze , M19N4MMxe , M19N4MMye , M19N4MMze , M19N4RAxe , & - M19N4RAye , M19N4RAze , M19N4RDxe , M19N4RDye , M19N4RDze , M19N4TAxe , M19N4TAye , & - M19N4TAze , M19N4TDxss , M19N4TDyss , M19N4TDzss , M19N5FKxe , M19N5FKye , M19N5FKze , & - M19N5FMxe , M19N5FMye , M19N5FMze , M19N5MKxe , M19N5MKye , M19N5MKze , M19N5MMxe , & - M19N5MMye , M19N5MMze , M19N5RAxe , M19N5RAye , M19N5RAze , M19N5RDxe , M19N5RDye , & - M19N5RDze , M19N5TAxe , M19N5TAye , M19N5TAze , M19N5TDxss , M19N5TDyss , M19N5TDzss , & - M19N6FKxe , M19N6FKye , M19N6FKze , M19N6FMxe , M19N6FMye , M19N6FMze , M19N6MKxe , & - M19N6MKye , M19N6MKze , M19N6MMxe , M19N6MMye , M19N6MMze , M19N6RAxe , M19N6RAye , & - M19N6RAze , M19N6RDxe , M19N6RDye , M19N6RDze , M19N6TAxe , M19N6TAye , M19N6TAze , & - M19N6TDxss , M19N6TDyss , M19N6TDzss , M19N7FKxe , M19N7FKye , M19N7FKze , M19N7FMxe , & - M19N7FMye , M19N7FMze , M19N7MKxe , M19N7MKye , M19N7MKze , M19N7MMxe , M19N7MMye , & - M19N7MMze , M19N7RAxe , M19N7RAye , M19N7RAze , M19N7RDxe , M19N7RDye , M19N7RDze , & - M19N7TAxe , M19N7TAye , M19N7TAze , M19N7TDxss , M19N7TDyss , M19N7TDzss , M19N8FKxe , & - M19N8FKye , M19N8FKze , M19N8FMxe , M19N8FMye , M19N8FMze , M19N8MKxe , M19N8MKye , & - M19N8MKze , M19N8MMxe , M19N8MMye , M19N8MMze , M19N8RAxe , M19N8RAye , M19N8RAze , & - M19N8RDxe , M19N8RDye , M19N8RDze , M19N8TAxe , M19N8TAye , M19N8TAze , M19N8TDxss , & - M19N8TDyss , M19N8TDzss , M19N9FKxe , M19N9FKye , M19N9FKze , M19N9FMxe , M19N9FMye , & - M19N9FMze , M19N9MKxe , M19N9MKye , M19N9MKze , M19N9MMxe , M19N9MMye , M19N9MMze , & - M19N9RAxe , M19N9RAye , M19N9RAze , M19N9RDxe , M19N9RDye , M19N9RDze , M19N9TAxe , & - M19N9TAye , M19N9TAze , M19N9TDxss , M19N9TDyss , M19N9TDzss , M20N1FKxe , M20N1FKye , & - M20N1FKze , M20N1FMxe , M20N1FMye , M20N1FMze , M20N1MKxe , M20N1MKye , M20N1MKze , & - M20N1MMxe , M20N1MMye , M20N1MMze , M20N1RAxe , M20N1RAye , M20N1RAze , M20N1RDxe , & - M20N1RDye , M20N1RDze , M20N1TAxe , M20N1TAye , M20N1TAze , M20N1TDxss , M20N1TDyss , & - M20N1TDzss , M20N2FKxe , M20N2FKye , M20N2FKze , M20N2FMxe , M20N2FMye , M20N2FMze , & - M20N2MKxe , M20N2MKye , M20N2MKze , M20N2MMxe , M20N2MMye , M20N2MMze , M20N2RAxe , & - M20N2RAye , M20N2RAze , M20N2RDxe , M20N2RDye , M20N2RDze , M20N2TAxe , M20N2TAye , & - M20N2TAze , M20N2TDxss , M20N2TDyss , M20N2TDzss , M20N3FKxe , M20N3FKye , M20N3FKze , & - M20N3FMxe , M20N3FMye , M20N3FMze , M20N3MKxe , M20N3MKye , M20N3MKze , M20N3MMxe , & - M20N3MMye , M20N3MMze , M20N3RAxe , M20N3RAye , M20N3RAze , M20N3RDxe , M20N3RDye , & - M20N3RDze , M20N3TAxe , M20N3TAye , M20N3TAze , M20N3TDxss , M20N3TDyss , M20N3TDzss , & - M20N4FKxe , M20N4FKye , M20N4FKze , M20N4FMxe , M20N4FMye , M20N4FMze , M20N4MKxe , & - M20N4MKye , M20N4MKze , M20N4MMxe , M20N4MMye , M20N4MMze , M20N4RAxe , M20N4RAye , & - M20N4RAze , M20N4RDxe , M20N4RDye , M20N4RDze , M20N4TAxe , M20N4TAye , M20N4TAze , & - M20N4TDxss , M20N4TDyss , M20N4TDzss , M20N5FKxe , M20N5FKye , M20N5FKze , M20N5FMxe , & - M20N5FMye , M20N5FMze , M20N5MKxe , M20N5MKye , M20N5MKze , M20N5MMxe , M20N5MMye , & - M20N5MMze , M20N5RAxe , M20N5RAye , M20N5RAze , M20N5RDxe , M20N5RDye , M20N5RDze , & - M20N5TAxe , M20N5TAye , M20N5TAze , M20N5TDxss , M20N5TDyss , M20N5TDzss , M20N6FKxe , & - M20N6FKye , M20N6FKze , M20N6FMxe , M20N6FMye , M20N6FMze , M20N6MKxe , M20N6MKye , & - M20N6MKze , M20N6MMxe , M20N6MMye , M20N6MMze , M20N6RAxe , M20N6RAye , M20N6RAze , & - M20N6RDxe , M20N6RDye , M20N6RDze , M20N6TAxe , M20N6TAye , M20N6TAze , M20N6TDxss , & - M20N6TDyss , M20N6TDzss , M20N7FKxe , M20N7FKye , M20N7FKze , M20N7FMxe , M20N7FMye , & - M20N7FMze , M20N7MKxe , M20N7MKye , M20N7MKze , M20N7MMxe , M20N7MMye , M20N7MMze , & - M20N7RAxe , M20N7RAye , M20N7RAze , M20N7RDxe , M20N7RDye , M20N7RDze , M20N7TAxe , & - M20N7TAye , M20N7TAze , M20N7TDxss , M20N7TDyss , M20N7TDzss , M20N8FKxe , M20N8FKye , & - M20N8FKze , M20N8FMxe , M20N8FMye , M20N8FMze , M20N8MKxe , M20N8MKye , M20N8MKze , & - M20N8MMxe , M20N8MMye , M20N8MMze , M20N8RAxe , M20N8RAye , M20N8RAze , M20N8RDxe , & - M20N8RDye , M20N8RDze , M20N8TAxe , M20N8TAye , M20N8TAze , M20N8TDxss , M20N8TDyss , & - M20N8TDzss , M20N9FKxe , M20N9FKye , M20N9FKze , M20N9FMxe , M20N9FMye , M20N9FMze , & - M20N9MKxe , M20N9MKye , M20N9MKze , M20N9MMxe , M20N9MMye , M20N9MMze , M20N9RAxe , & - M20N9RAye , M20N9RAze , M20N9RDxe , M20N9RDye , M20N9RDze , M20N9TAxe , M20N9TAye , & - M20N9TAze , M20N9TDxss , M20N9TDyss , M20N9TDzss , M21N1FKxe , M21N1FKye , M21N1FKze , & - M21N1FMxe , M21N1FMye , M21N1FMze , M21N1MKxe , M21N1MKye , M21N1MKze , M21N1MMxe , & - M21N1MMye , M21N1MMze , M21N1RAxe , M21N1RAye , M21N1RAze , M21N1RDxe , M21N1RDye , & - M21N1RDze , M21N1TAxe , M21N1TAye , M21N1TAze , M21N1TDxss , M21N1TDyss , M21N1TDzss , & - M21N2FKxe , M21N2FKye , M21N2FKze , M21N2FMxe , M21N2FMye , M21N2FMze , M21N2MKxe , & - M21N2MKye , M21N2MKze , M21N2MMxe , M21N2MMye , M21N2MMze , M21N2RAxe , M21N2RAye , & - M21N2RAze , M21N2RDxe , M21N2RDye , M21N2RDze , M21N2TAxe , M21N2TAye , M21N2TAze , & - M21N2TDxss , M21N2TDyss , M21N2TDzss , M21N3FKxe , M21N3FKye , M21N3FKze , M21N3FMxe , & - M21N3FMye , M21N3FMze , M21N3MKxe , M21N3MKye , M21N3MKze , M21N3MMxe , M21N3MMye , & - M21N3MMze , M21N3RAxe , M21N3RAye , M21N3RAze , M21N3RDxe , M21N3RDye , M21N3RDze , & - M21N3TAxe , M21N3TAye , M21N3TAze , M21N3TDxss , M21N3TDyss , M21N3TDzss , M21N4FKxe , & - M21N4FKye , M21N4FKze , M21N4FMxe , M21N4FMye , M21N4FMze , M21N4MKxe , M21N4MKye , & - M21N4MKze , M21N4MMxe , M21N4MMye , M21N4MMze , M21N4RAxe , M21N4RAye , M21N4RAze , & - M21N4RDxe , M21N4RDye , M21N4RDze , M21N4TAxe , M21N4TAye , M21N4TAze , M21N4TDxss , & - M21N4TDyss , M21N4TDzss , M21N5FKxe , M21N5FKye , M21N5FKze , M21N5FMxe , M21N5FMye , & - M21N5FMze , M21N5MKxe , M21N5MKye , M21N5MKze , M21N5MMxe , M21N5MMye , M21N5MMze , & - M21N5RAxe , M21N5RAye , M21N5RAze , M21N5RDxe , M21N5RDye , M21N5RDze , M21N5TAxe , & - M21N5TAye , M21N5TAze , M21N5TDxss , M21N5TDyss , M21N5TDzss , M21N6FKxe , M21N6FKye , & - M21N6FKze , M21N6FMxe , M21N6FMye , M21N6FMze , M21N6MKxe , M21N6MKye , M21N6MKze , & - M21N6MMxe , M21N6MMye , M21N6MMze , M21N6RAxe , M21N6RAye , M21N6RAze , M21N6RDxe , & - M21N6RDye , M21N6RDze , M21N6TAxe , M21N6TAye , M21N6TAze , M21N6TDxss , M21N6TDyss , & - M21N6TDzss , M21N7FKxe , M21N7FKye , M21N7FKze , M21N7FMxe , M21N7FMye , M21N7FMze , & - M21N7MKxe , M21N7MKye , M21N7MKze , M21N7MMxe , M21N7MMye , M21N7MMze , M21N7RAxe , & - M21N7RAye , M21N7RAze , M21N7RDxe , M21N7RDye , M21N7RDze , M21N7TAxe , M21N7TAye , & - M21N7TAze , M21N7TDxss , M21N7TDyss , M21N7TDzss , M21N8FKxe , M21N8FKye , M21N8FKze , & - M21N8FMxe , M21N8FMye , M21N8FMze , M21N8MKxe , M21N8MKye , M21N8MKze , M21N8MMxe , & - M21N8MMye , M21N8MMze , M21N8RAxe , M21N8RAye , M21N8RAze , M21N8RDxe , M21N8RDye , & - M21N8RDze , M21N8TAxe , M21N8TAye , M21N8TAze , M21N8TDxss , M21N8TDyss , M21N8TDzss , & - M21N9FKxe , M21N9FKye , M21N9FKze , M21N9FMxe , M21N9FMye , M21N9FMze , M21N9MKxe , & - M21N9MKye , M21N9MKze , M21N9MMxe , M21N9MMye , M21N9MMze , M21N9RAxe , M21N9RAye , & - M21N9RAze , M21N9RDxe , M21N9RDye , M21N9RDze , M21N9TAxe , M21N9TAye , M21N9TAze , & - M21N9TDxss , M21N9TDyss , M21N9TDzss , M22N1FKxe , M22N1FKye , M22N1FKze , M22N1FMxe , & - M22N1FMye , M22N1FMze , M22N1MKxe , M22N1MKye , M22N1MKze , M22N1MMxe , M22N1MMye , & - M22N1MMze , M22N1RAxe , M22N1RAye , M22N1RAze , M22N1RDxe , M22N1RDye , M22N1RDze , & - M22N1TAxe , M22N1TAye , M22N1TAze , M22N1TDxss , M22N1TDyss , M22N1TDzss , M22N2FKxe , & - M22N2FKye , M22N2FKze , M22N2FMxe , M22N2FMye , M22N2FMze , M22N2MKxe , M22N2MKye , & - M22N2MKze , M22N2MMxe , M22N2MMye , M22N2MMze , M22N2RAxe , M22N2RAye , M22N2RAze , & - M22N2RDxe , M22N2RDye , M22N2RDze , M22N2TAxe , M22N2TAye , M22N2TAze , M22N2TDxss , & - M22N2TDyss , M22N2TDzss , M22N3FKxe , M22N3FKye , M22N3FKze , M22N3FMxe , M22N3FMye , & - M22N3FMze , M22N3MKxe , M22N3MKye , M22N3MKze , M22N3MMxe , M22N3MMye , M22N3MMze , & - M22N3RAxe , M22N3RAye , M22N3RAze , M22N3RDxe , M22N3RDye , M22N3RDze , M22N3TAxe , & - M22N3TAye , M22N3TAze , M22N3TDxss , M22N3TDyss , M22N3TDzss , M22N4FKxe , M22N4FKye , & - M22N4FKze , M22N4FMxe , M22N4FMye , M22N4FMze , M22N4MKxe , M22N4MKye , M22N4MKze , & - M22N4MMxe , M22N4MMye , M22N4MMze , M22N4RAxe , M22N4RAye , M22N4RAze , M22N4RDxe , & - M22N4RDye , M22N4RDze , M22N4TAxe , M22N4TAye , M22N4TAze , M22N4TDxss , M22N4TDyss , & - M22N4TDzss , M22N5FKxe , M22N5FKye , M22N5FKze , M22N5FMxe , M22N5FMye , M22N5FMze , & - M22N5MKxe , M22N5MKye , M22N5MKze , M22N5MMxe , M22N5MMye , M22N5MMze , M22N5RAxe , & - M22N5RAye , M22N5RAze , M22N5RDxe , M22N5RDye , M22N5RDze , M22N5TAxe , M22N5TAye , & - M22N5TAze , M22N5TDxss , M22N5TDyss , M22N5TDzss , M22N6FKxe , M22N6FKye , M22N6FKze , & - M22N6FMxe , M22N6FMye , M22N6FMze , M22N6MKxe , M22N6MKye , M22N6MKze , M22N6MMxe , & - M22N6MMye , M22N6MMze , M22N6RAxe , M22N6RAye , M22N6RAze , M22N6RDxe , M22N6RDye , & - M22N6RDze , M22N6TAxe , M22N6TAye , M22N6TAze , M22N6TDxss , M22N6TDyss , M22N6TDzss , & - M22N7FKxe , M22N7FKye , M22N7FKze , M22N7FMxe , M22N7FMye , M22N7FMze , M22N7MKxe , & - M22N7MKye , M22N7MKze , M22N7MMxe , M22N7MMye , M22N7MMze , M22N7RAxe , M22N7RAye , & - M22N7RAze , M22N7RDxe , M22N7RDye , M22N7RDze , M22N7TAxe , M22N7TAye , M22N7TAze , & - M22N7TDxss , M22N7TDyss , M22N7TDzss , M22N8FKxe , M22N8FKye , M22N8FKze , M22N8FMxe , & - M22N8FMye , M22N8FMze , M22N8MKxe , M22N8MKye , M22N8MKze , M22N8MMxe , M22N8MMye , & - M22N8MMze , M22N8RAxe , M22N8RAye , M22N8RAze , M22N8RDxe , M22N8RDye , M22N8RDze , & - M22N8TAxe , M22N8TAye , M22N8TAze , M22N8TDxss , M22N8TDyss , M22N8TDzss , M22N9FKxe , & - M22N9FKye , M22N9FKze , M22N9FMxe , M22N9FMye , M22N9FMze , M22N9MKxe , M22N9MKye , & - M22N9MKze , M22N9MMxe , M22N9MMye , M22N9MMze , M22N9RAxe , M22N9RAye , M22N9RAze , & - M22N9RDxe , M22N9RDye , M22N9RDze , M22N9TAxe , M22N9TAye , M22N9TAze , M22N9TDxss , & - M22N9TDyss , M22N9TDzss , M23N1FKxe , M23N1FKye , M23N1FKze , M23N1FMxe , M23N1FMye , & - M23N1FMze , M23N1MKxe , M23N1MKye , M23N1MKze , M23N1MMxe , M23N1MMye , M23N1MMze , & - M23N1RAxe , M23N1RAye , M23N1RAze , M23N1RDxe , M23N1RDye , M23N1RDze , M23N1TAxe , & - M23N1TAye , M23N1TAze , M23N1TDxss , M23N1TDyss , M23N1TDzss , M23N2FKxe , M23N2FKye , & - M23N2FKze , M23N2FMxe , M23N2FMye , M23N2FMze , M23N2MKxe , M23N2MKye , M23N2MKze , & - M23N2MMxe , M23N2MMye , M23N2MMze , M23N2RAxe , M23N2RAye , M23N2RAze , M23N2RDxe , & - M23N2RDye , M23N2RDze , M23N2TAxe , M23N2TAye , M23N2TAze , M23N2TDxss , M23N2TDyss , & - M23N2TDzss , M23N3FKxe , M23N3FKye , M23N3FKze , M23N3FMxe , M23N3FMye , M23N3FMze , & - M23N3MKxe , M23N3MKye , M23N3MKze , M23N3MMxe , M23N3MMye , M23N3MMze , M23N3RAxe , & - M23N3RAye , M23N3RAze , M23N3RDxe , M23N3RDye , M23N3RDze , M23N3TAxe , M23N3TAye , & - M23N3TAze , M23N3TDxss , M23N3TDyss , M23N3TDzss , M23N4FKxe , M23N4FKye , M23N4FKze , & - M23N4FMxe , M23N4FMye , M23N4FMze , M23N4MKxe , M23N4MKye , M23N4MKze , M23N4MMxe , & - M23N4MMye , M23N4MMze , M23N4RAxe , M23N4RAye , M23N4RAze , M23N4RDxe , M23N4RDye , & - M23N4RDze , M23N4TAxe , M23N4TAye , M23N4TAze , M23N4TDxss , M23N4TDyss , M23N4TDzss , & - M23N5FKxe , M23N5FKye , M23N5FKze , M23N5FMxe , M23N5FMye , M23N5FMze , M23N5MKxe , & - M23N5MKye , M23N5MKze , M23N5MMxe , M23N5MMye , M23N5MMze , M23N5RAxe , M23N5RAye , & - M23N5RAze , M23N5RDxe , M23N5RDye , M23N5RDze , M23N5TAxe , M23N5TAye , M23N5TAze , & - M23N5TDxss , M23N5TDyss , M23N5TDzss , M23N6FKxe , M23N6FKye , M23N6FKze , M23N6FMxe , & - M23N6FMye , M23N6FMze , M23N6MKxe , M23N6MKye , M23N6MKze , M23N6MMxe , M23N6MMye , & - M23N6MMze , M23N6RAxe , M23N6RAye , M23N6RAze , M23N6RDxe , M23N6RDye , M23N6RDze , & - M23N6TAxe , M23N6TAye , M23N6TAze , M23N6TDxss , M23N6TDyss , M23N6TDzss , M23N7FKxe , & - M23N7FKye , M23N7FKze , M23N7FMxe , M23N7FMye , M23N7FMze , M23N7MKxe , M23N7MKye , & - M23N7MKze , M23N7MMxe , M23N7MMye , M23N7MMze , M23N7RAxe , M23N7RAye , M23N7RAze , & - M23N7RDxe , M23N7RDye , M23N7RDze , M23N7TAxe , M23N7TAye , M23N7TAze , M23N7TDxss , & - M23N7TDyss , M23N7TDzss , M23N8FKxe , M23N8FKye , M23N8FKze , M23N8FMxe , M23N8FMye , & - M23N8FMze , M23N8MKxe , M23N8MKye , M23N8MKze , M23N8MMxe , M23N8MMye , M23N8MMze , & - M23N8RAxe , M23N8RAye , M23N8RAze , M23N8RDxe , M23N8RDye , M23N8RDze , M23N8TAxe , & - M23N8TAye , M23N8TAze , M23N8TDxss , M23N8TDyss , M23N8TDzss , M23N9FKxe , M23N9FKye , & - M23N9FKze , M23N9FMxe , M23N9FMye , M23N9FMze , M23N9MKxe , M23N9MKye , M23N9MKze , & - M23N9MMxe , M23N9MMye , M23N9MMze , M23N9RAxe , M23N9RAye , M23N9RAze , M23N9RDxe , & - M23N9RDye , M23N9RDze , M23N9TAxe , M23N9TAye , M23N9TAze , M23N9TDxss , M23N9TDyss , & - M23N9TDzss , M24N1FKxe , M24N1FKye , M24N1FKze , M24N1FMxe , M24N1FMye , M24N1FMze , & - M24N1MKxe , M24N1MKye , M24N1MKze , M24N1MMxe , M24N1MMye , M24N1MMze , M24N1RAxe , & - M24N1RAye , M24N1RAze , M24N1RDxe , M24N1RDye , M24N1RDze , M24N1TAxe , M24N1TAye , & - M24N1TAze , M24N1TDxss , M24N1TDyss , M24N1TDzss /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry4(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M24N2FKxe , M24N2FKye , M24N2FKze , M24N2FMxe , M24N2FMye , M24N2FMze , M24N2MKxe , & - M24N2MKye , M24N2MKze , M24N2MMxe , M24N2MMye , M24N2MMze , M24N2RAxe , M24N2RAye , & - M24N2RAze , M24N2RDxe , M24N2RDye , M24N2RDze , M24N2TAxe , M24N2TAye , M24N2TAze , & - M24N2TDxss , M24N2TDyss , M24N2TDzss , M24N3FKxe , M24N3FKye , M24N3FKze , M24N3FMxe , & - M24N3FMye , M24N3FMze , M24N3MKxe , M24N3MKye , M24N3MKze , M24N3MMxe , M24N3MMye , & - M24N3MMze , M24N3RAxe , M24N3RAye , M24N3RAze , M24N3RDxe , M24N3RDye , M24N3RDze , & - M24N3TAxe , M24N3TAye , M24N3TAze , M24N3TDxss , M24N3TDyss , M24N3TDzss , M24N4FKxe , & - M24N4FKye , M24N4FKze , M24N4FMxe , M24N4FMye , M24N4FMze , M24N4MKxe , M24N4MKye , & - M24N4MKze , M24N4MMxe , M24N4MMye , M24N4MMze , M24N4RAxe , M24N4RAye , M24N4RAze , & - M24N4RDxe , M24N4RDye , M24N4RDze , M24N4TAxe , M24N4TAye , M24N4TAze , M24N4TDxss , & - M24N4TDyss , M24N4TDzss , M24N5FKxe , M24N5FKye , M24N5FKze , M24N5FMxe , M24N5FMye , & - M24N5FMze , M24N5MKxe , M24N5MKye , M24N5MKze , M24N5MMxe , M24N5MMye , M24N5MMze , & - M24N5RAxe , M24N5RAye , M24N5RAze , M24N5RDxe , M24N5RDye , M24N5RDze , M24N5TAxe , & - M24N5TAye , M24N5TAze , M24N5TDxss , M24N5TDyss , M24N5TDzss , M24N6FKxe , M24N6FKye , & - M24N6FKze , M24N6FMxe , M24N6FMye , M24N6FMze , M24N6MKxe , M24N6MKye , M24N6MKze , & - M24N6MMxe , M24N6MMye , M24N6MMze , M24N6RAxe , M24N6RAye , M24N6RAze , M24N6RDxe , & - M24N6RDye , M24N6RDze , M24N6TAxe , M24N6TAye , M24N6TAze , M24N6TDxss , M24N6TDyss , & - M24N6TDzss , M24N7FKxe , M24N7FKye , M24N7FKze , M24N7FMxe , M24N7FMye , M24N7FMze , & - M24N7MKxe , M24N7MKye , M24N7MKze , M24N7MMxe , M24N7MMye , M24N7MMze , M24N7RAxe , & - M24N7RAye , M24N7RAze , M24N7RDxe , M24N7RDye , M24N7RDze , M24N7TAxe , M24N7TAye , & - M24N7TAze , M24N7TDxss , M24N7TDyss , M24N7TDzss , M24N8FKxe , M24N8FKye , M24N8FKze , & - M24N8FMxe , M24N8FMye , M24N8FMze , M24N8MKxe , M24N8MKye , M24N8MKze , M24N8MMxe , & - M24N8MMye , M24N8MMze , M24N8RAxe , M24N8RAye , M24N8RAze , M24N8RDxe , M24N8RDye , & - M24N8RDze , M24N8TAxe , M24N8TAye , M24N8TAze , M24N8TDxss , M24N8TDyss , M24N8TDzss , & - M24N9FKxe , M24N9FKye , M24N9FKze , M24N9FMxe , M24N9FMye , M24N9FMze , M24N9MKxe , & - M24N9MKye , M24N9MKze , M24N9MMxe , M24N9MMye , M24N9MMze , M24N9RAxe , M24N9RAye , & - M24N9RAze , M24N9RDxe , M24N9RDye , M24N9RDze , M24N9TAxe , M24N9TAye , M24N9TAze , & - M24N9TDxss , M24N9TDyss , M24N9TDzss , M25N1FKxe , M25N1FKye , M25N1FKze , M25N1FMxe , & - M25N1FMye , M25N1FMze , M25N1MKxe , M25N1MKye , M25N1MKze , M25N1MMxe , M25N1MMye , & - M25N1MMze , M25N1RAxe , M25N1RAye , M25N1RAze , M25N1RDxe , M25N1RDye , M25N1RDze , & - M25N1TAxe , M25N1TAye , M25N1TAze , M25N1TDxss , M25N1TDyss , M25N1TDzss , M25N2FKxe , & - M25N2FKye , M25N2FKze , M25N2FMxe , M25N2FMye , M25N2FMze , M25N2MKxe , M25N2MKye , & - M25N2MKze , M25N2MMxe , M25N2MMye , M25N2MMze , M25N2RAxe , M25N2RAye , M25N2RAze , & - M25N2RDxe , M25N2RDye , M25N2RDze , M25N2TAxe , M25N2TAye , M25N2TAze , M25N2TDxss , & - M25N2TDyss , M25N2TDzss , M25N3FKxe , M25N3FKye , M25N3FKze , M25N3FMxe , M25N3FMye , & - M25N3FMze , M25N3MKxe , M25N3MKye , M25N3MKze , M25N3MMxe , M25N3MMye , M25N3MMze , & - M25N3RAxe , M25N3RAye , M25N3RAze , M25N3RDxe , M25N3RDye , M25N3RDze , M25N3TAxe , & - M25N3TAye , M25N3TAze , M25N3TDxss , M25N3TDyss , M25N3TDzss , M25N4FKxe , M25N4FKye , & - M25N4FKze , M25N4FMxe , M25N4FMye , M25N4FMze , M25N4MKxe , M25N4MKye , M25N4MKze , & - M25N4MMxe , M25N4MMye , M25N4MMze , M25N4RAxe , M25N4RAye , M25N4RAze , M25N4RDxe , & - M25N4RDye , M25N4RDze , M25N4TAxe , M25N4TAye , M25N4TAze , M25N4TDxss , M25N4TDyss , & - M25N4TDzss , M25N5FKxe , M25N5FKye , M25N5FKze , M25N5FMxe , M25N5FMye , M25N5FMze , & - M25N5MKxe , M25N5MKye , M25N5MKze , M25N5MMxe , M25N5MMye , M25N5MMze , M25N5RAxe , & - M25N5RAye , M25N5RAze , M25N5RDxe , M25N5RDye , M25N5RDze , M25N5TAxe , M25N5TAye , & - M25N5TAze , M25N5TDxss , M25N5TDyss , M25N5TDzss , M25N6FKxe , M25N6FKye , M25N6FKze , & - M25N6FMxe , M25N6FMye , M25N6FMze , M25N6MKxe , M25N6MKye , M25N6MKze , M25N6MMxe , & - M25N6MMye , M25N6MMze , M25N6RAxe , M25N6RAye , M25N6RAze , M25N6RDxe , M25N6RDye , & - M25N6RDze , M25N6TAxe , M25N6TAye , M25N6TAze , M25N6TDxss , M25N6TDyss , M25N6TDzss , & - M25N7FKxe , M25N7FKye , M25N7FKze , M25N7FMxe , M25N7FMye , M25N7FMze , M25N7MKxe , & - M25N7MKye , M25N7MKze , M25N7MMxe , M25N7MMye , M25N7MMze , M25N7RAxe , M25N7RAye , & - M25N7RAze , M25N7RDxe , M25N7RDye , M25N7RDze , M25N7TAxe , M25N7TAye , M25N7TAze , & - M25N7TDxss , M25N7TDyss , M25N7TDzss , M25N8FKxe , M25N8FKye , M25N8FKze , M25N8FMxe , & - M25N8FMye , M25N8FMze , M25N8MKxe , M25N8MKye , M25N8MKze , M25N8MMxe , M25N8MMye , & - M25N8MMze , M25N8RAxe , M25N8RAye , M25N8RAze , M25N8RDxe , M25N8RDye , M25N8RDze , & - M25N8TAxe , M25N8TAye , M25N8TAze , M25N8TDxss , M25N8TDyss , M25N8TDzss , M25N9FKxe , & - M25N9FKye , M25N9FKze , M25N9FMxe , M25N9FMye , M25N9FMze , M25N9MKxe , M25N9MKye , & - M25N9MKze , M25N9MMxe , M25N9MMye , M25N9MMze , M25N9RAxe , M25N9RAye , M25N9RAze , & - M25N9RDxe , M25N9RDye , M25N9RDze , M25N9TAxe , M25N9TAye , M25N9TAze , M25N9TDxss , & - M25N9TDyss , M25N9TDzss , M26N1FKxe , M26N1FKye , M26N1FKze , M26N1FMxe , M26N1FMye , & - M26N1FMze , M26N1MKxe , M26N1MKye , M26N1MKze , M26N1MMxe , M26N1MMye , M26N1MMze , & - M26N1RAxe , M26N1RAye , M26N1RAze , M26N1RDxe , M26N1RDye , M26N1RDze , M26N1TAxe , & - M26N1TAye , M26N1TAze , M26N1TDxss , M26N1TDyss , M26N1TDzss , M26N2FKxe , M26N2FKye , & - M26N2FKze , M26N2FMxe , M26N2FMye , M26N2FMze , M26N2MKxe , M26N2MKye , M26N2MKze , & - M26N2MMxe , M26N2MMye , M26N2MMze , M26N2RAxe , M26N2RAye , M26N2RAze , M26N2RDxe , & - M26N2RDye , M26N2RDze , M26N2TAxe , M26N2TAye , M26N2TAze , M26N2TDxss , M26N2TDyss , & - M26N2TDzss , M26N3FKxe , M26N3FKye , M26N3FKze , M26N3FMxe , M26N3FMye , M26N3FMze , & - M26N3MKxe , M26N3MKye , M26N3MKze , M26N3MMxe , M26N3MMye , M26N3MMze , M26N3RAxe , & - M26N3RAye , M26N3RAze , M26N3RDxe , M26N3RDye , M26N3RDze , M26N3TAxe , M26N3TAye , & - M26N3TAze , M26N3TDxss , M26N3TDyss , M26N3TDzss , M26N4FKxe , M26N4FKye , M26N4FKze , & - M26N4FMxe , M26N4FMye , M26N4FMze , M26N4MKxe , M26N4MKye , M26N4MKze , M26N4MMxe , & - M26N4MMye , M26N4MMze , M26N4RAxe , M26N4RAye , M26N4RAze , M26N4RDxe , M26N4RDye , & - M26N4RDze , M26N4TAxe , M26N4TAye , M26N4TAze , M26N4TDxss , M26N4TDyss , M26N4TDzss , & - M26N5FKxe , M26N5FKye , M26N5FKze , M26N5FMxe , M26N5FMye , M26N5FMze , M26N5MKxe , & - M26N5MKye , M26N5MKze , M26N5MMxe , M26N5MMye , M26N5MMze , M26N5RAxe , M26N5RAye , & - M26N5RAze , M26N5RDxe , M26N5RDye , M26N5RDze , M26N5TAxe , M26N5TAye , M26N5TAze , & - M26N5TDxss , M26N5TDyss , M26N5TDzss , M26N6FKxe , M26N6FKye , M26N6FKze , M26N6FMxe , & - M26N6FMye , M26N6FMze , M26N6MKxe , M26N6MKye , M26N6MKze , M26N6MMxe , M26N6MMye , & - M26N6MMze , M26N6RAxe , M26N6RAye , M26N6RAze , M26N6RDxe , M26N6RDye , M26N6RDze , & - M26N6TAxe , M26N6TAye , M26N6TAze , M26N6TDxss , M26N6TDyss , M26N6TDzss , M26N7FKxe , & - M26N7FKye , M26N7FKze , M26N7FMxe , M26N7FMye , M26N7FMze , M26N7MKxe , M26N7MKye , & - M26N7MKze , M26N7MMxe , M26N7MMye , M26N7MMze , M26N7RAxe , M26N7RAye , M26N7RAze , & - M26N7RDxe , M26N7RDye , M26N7RDze , M26N7TAxe , M26N7TAye , M26N7TAze , M26N7TDxss , & - M26N7TDyss , M26N7TDzss , M26N8FKxe , M26N8FKye , M26N8FKze , M26N8FMxe , M26N8FMye , & - M26N8FMze , M26N8MKxe , M26N8MKye , M26N8MKze , M26N8MMxe , M26N8MMye , M26N8MMze , & - M26N8RAxe , M26N8RAye , M26N8RAze , M26N8RDxe , M26N8RDye , M26N8RDze , M26N8TAxe , & - M26N8TAye , M26N8TAze , M26N8TDxss , M26N8TDyss , M26N8TDzss , M26N9FKxe , M26N9FKye , & - M26N9FKze , M26N9FMxe , M26N9FMye , M26N9FMze , M26N9MKxe , M26N9MKye , M26N9MKze , & - M26N9MMxe , M26N9MMye , M26N9MMze , M26N9RAxe , M26N9RAye , M26N9RAze , M26N9RDxe , & - M26N9RDye , M26N9RDze , M26N9TAxe , M26N9TAye , M26N9TAze , M26N9TDxss , M26N9TDyss , & - M26N9TDzss , M27N1FKxe , M27N1FKye , M27N1FKze , M27N1FMxe , M27N1FMye , M27N1FMze , & - M27N1MKxe , M27N1MKye , M27N1MKze , M27N1MMxe , M27N1MMye , M27N1MMze , M27N1RAxe , & - M27N1RAye , M27N1RAze , M27N1RDxe , M27N1RDye , M27N1RDze , M27N1TAxe , M27N1TAye , & - M27N1TAze , M27N1TDxss , M27N1TDyss , M27N1TDzss , M27N2FKxe , M27N2FKye , M27N2FKze , & - M27N2FMxe , M27N2FMye , M27N2FMze , M27N2MKxe , M27N2MKye , M27N2MKze , M27N2MMxe , & - M27N2MMye , M27N2MMze , M27N2RAxe , M27N2RAye , M27N2RAze , M27N2RDxe , M27N2RDye , & - M27N2RDze , M27N2TAxe , M27N2TAye , M27N2TAze , M27N2TDxss , M27N2TDyss , M27N2TDzss , & - M27N3FKxe , M27N3FKye , M27N3FKze , M27N3FMxe , M27N3FMye , M27N3FMze , M27N3MKxe , & - M27N3MKye , M27N3MKze , M27N3MMxe , M27N3MMye , M27N3MMze , M27N3RAxe , M27N3RAye , & - M27N3RAze , M27N3RDxe , M27N3RDye , M27N3RDze , M27N3TAxe , M27N3TAye , M27N3TAze , & - M27N3TDxss , M27N3TDyss , M27N3TDzss , M27N4FKxe , M27N4FKye , M27N4FKze , M27N4FMxe , & - M27N4FMye , M27N4FMze , M27N4MKxe , M27N4MKye , M27N4MKze , M27N4MMxe , M27N4MMye , & - M27N4MMze , M27N4RAxe , M27N4RAye , M27N4RAze , M27N4RDxe , M27N4RDye , M27N4RDze , & - M27N4TAxe , M27N4TAye , M27N4TAze , M27N4TDxss , M27N4TDyss , M27N4TDzss , M27N5FKxe , & - M27N5FKye , M27N5FKze , M27N5FMxe , M27N5FMye , M27N5FMze , M27N5MKxe , M27N5MKye , & - M27N5MKze , M27N5MMxe , M27N5MMye , M27N5MMze , M27N5RAxe , M27N5RAye , M27N5RAze , & - M27N5RDxe , M27N5RDye , M27N5RDze , M27N5TAxe , M27N5TAye , M27N5TAze , M27N5TDxss , & - M27N5TDyss , M27N5TDzss , M27N6FKxe , M27N6FKye , M27N6FKze , M27N6FMxe , M27N6FMye , & - M27N6FMze , M27N6MKxe , M27N6MKye , M27N6MKze , M27N6MMxe , M27N6MMye , M27N6MMze , & - M27N6RAxe , M27N6RAye , M27N6RAze , M27N6RDxe , M27N6RDye , M27N6RDze , M27N6TAxe , & - M27N6TAye , M27N6TAze , M27N6TDxss , M27N6TDyss , M27N6TDzss , M27N7FKxe , M27N7FKye , & - M27N7FKze , M27N7FMxe , M27N7FMye , M27N7FMze , M27N7MKxe , M27N7MKye , M27N7MKze , & - M27N7MMxe , M27N7MMye , M27N7MMze , M27N7RAxe , M27N7RAye , M27N7RAze , M27N7RDxe , & - M27N7RDye , M27N7RDze , M27N7TAxe , M27N7TAye , M27N7TAze , M27N7TDxss , M27N7TDyss , & - M27N7TDzss , M27N8FKxe , M27N8FKye , M27N8FKze , M27N8FMxe , M27N8FMye , M27N8FMze , & - M27N8MKxe , M27N8MKye , M27N8MKze , M27N8MMxe , M27N8MMye , M27N8MMze , M27N8RAxe , & - M27N8RAye , M27N8RAze , M27N8RDxe , M27N8RDye , M27N8RDze , M27N8TAxe , M27N8TAye , & - M27N8TAze , M27N8TDxss , M27N8TDyss , M27N8TDzss , M27N9FKxe , M27N9FKye , M27N9FKze , & - M27N9FMxe , M27N9FMye , M27N9FMze , M27N9MKxe , M27N9MKye , M27N9MKze , M27N9MMxe , & - M27N9MMye , M27N9MMze , M27N9RAxe , M27N9RAye , M27N9RAze , M27N9RDxe , M27N9RDye , & - M27N9RDze , M27N9TAxe , M27N9TAye , M27N9TAze , M27N9TDxss , M27N9TDyss , M27N9TDzss , & - M28N1FKxe , M28N1FKye , M28N1FKze , M28N1FMxe , M28N1FMye , M28N1FMze , M28N1MKxe , & - M28N1MKye , M28N1MKze , M28N1MMxe , M28N1MMye , M28N1MMze , M28N1RAxe , M28N1RAye , & - M28N1RAze , M28N1RDxe , M28N1RDye , M28N1RDze , M28N1TAxe , M28N1TAye , M28N1TAze , & - M28N1TDxss , M28N1TDyss , M28N1TDzss , M28N2FKxe , M28N2FKye , M28N2FKze , M28N2FMxe , & - M28N2FMye , M28N2FMze , M28N2MKxe , M28N2MKye , M28N2MKze , M28N2MMxe , M28N2MMye , & - M28N2MMze , M28N2RAxe , M28N2RAye , M28N2RAze , M28N2RDxe , M28N2RDye , M28N2RDze , & - M28N2TAxe , M28N2TAye , M28N2TAze , M28N2TDxss , M28N2TDyss , M28N2TDzss , M28N3FKxe , & - M28N3FKye , M28N3FKze , M28N3FMxe , M28N3FMye , M28N3FMze , M28N3MKxe , M28N3MKye , & - M28N3MKze , M28N3MMxe , M28N3MMye , M28N3MMze , M28N3RAxe , M28N3RAye , M28N3RAze , & - M28N3RDxe , M28N3RDye , M28N3RDze , M28N3TAxe , M28N3TAye , M28N3TAze , M28N3TDxss , & - M28N3TDyss , M28N3TDzss , M28N4FKxe , M28N4FKye , M28N4FKze , M28N4FMxe , M28N4FMye , & - M28N4FMze , M28N4MKxe , M28N4MKye , M28N4MKze , M28N4MMxe , M28N4MMye , M28N4MMze , & - M28N4RAxe , M28N4RAye , M28N4RAze , M28N4RDxe , M28N4RDye , M28N4RDze , M28N4TAxe , & - M28N4TAye , M28N4TAze , M28N4TDxss , M28N4TDyss , M28N4TDzss , M28N5FKxe , M28N5FKye , & - M28N5FKze , M28N5FMxe , M28N5FMye , M28N5FMze , M28N5MKxe , M28N5MKye , M28N5MKze , & - M28N5MMxe , M28N5MMye , M28N5MMze , M28N5RAxe , M28N5RAye , M28N5RAze , M28N5RDxe , & - M28N5RDye , M28N5RDze , M28N5TAxe , M28N5TAye , M28N5TAze , M28N5TDxss , M28N5TDyss , & - M28N5TDzss , M28N6FKxe , M28N6FKye , M28N6FKze , M28N6FMxe , M28N6FMye , M28N6FMze , & - M28N6MKxe , M28N6MKye , M28N6MKze , M28N6MMxe , M28N6MMye , M28N6MMze , M28N6RAxe , & - M28N6RAye , M28N6RAze , M28N6RDxe , M28N6RDye , M28N6RDze , M28N6TAxe , M28N6TAye , & - M28N6TAze , M28N6TDxss , M28N6TDyss , M28N6TDzss , M28N7FKxe , M28N7FKye , M28N7FKze , & - M28N7FMxe , M28N7FMye , M28N7FMze , M28N7MKxe , M28N7MKye , M28N7MKze , M28N7MMxe , & - M28N7MMye , M28N7MMze , M28N7RAxe , M28N7RAye , M28N7RAze , M28N7RDxe , M28N7RDye , & - M28N7RDze , M28N7TAxe , M28N7TAye , M28N7TAze , M28N7TDxss , M28N7TDyss , M28N7TDzss , & - M28N8FKxe , M28N8FKye , M28N8FKze , M28N8FMxe , M28N8FMye , M28N8FMze , M28N8MKxe , & - M28N8MKye , M28N8MKze , M28N8MMxe , M28N8MMye , M28N8MMze , M28N8RAxe , M28N8RAye , & - M28N8RAze , M28N8RDxe , M28N8RDye , M28N8RDze , M28N8TAxe , M28N8TAye , M28N8TAze , & - M28N8TDxss , M28N8TDyss , M28N8TDzss , M28N9FKxe , M28N9FKye , M28N9FKze , M28N9FMxe , & - M28N9FMye , M28N9FMze , M28N9MKxe , M28N9MKye , M28N9MKze , M28N9MMxe , M28N9MMye , & - M28N9MMze , M28N9RAxe , M28N9RAye , M28N9RAze , M28N9RDxe , M28N9RDye , M28N9RDze , & - M28N9TAxe , M28N9TAye , M28N9TAze , M28N9TDxss , M28N9TDyss , M28N9TDzss , M29N1FKxe , & - M29N1FKye , M29N1FKze , M29N1FMxe , M29N1FMye , M29N1FMze , M29N1MKxe , M29N1MKye , & - M29N1MKze , M29N1MMxe , M29N1MMye , M29N1MMze , M29N1RAxe , M29N1RAye , M29N1RAze , & - M29N1RDxe , M29N1RDye , M29N1RDze , M29N1TAxe , M29N1TAye , M29N1TAze , M29N1TDxss , & - M29N1TDyss , M29N1TDzss , M29N2FKxe , M29N2FKye , M29N2FKze , M29N2FMxe , M29N2FMye , & - M29N2FMze , M29N2MKxe , M29N2MKye , M29N2MKze , M29N2MMxe , M29N2MMye , M29N2MMze , & - M29N2RAxe , M29N2RAye , M29N2RAze , M29N2RDxe , M29N2RDye , M29N2RDze , M29N2TAxe , & - M29N2TAye , M29N2TAze , M29N2TDxss , M29N2TDyss , M29N2TDzss , M29N3FKxe , M29N3FKye , & - M29N3FKze , M29N3FMxe , M29N3FMye , M29N3FMze , M29N3MKxe , M29N3MKye , M29N3MKze , & - M29N3MMxe , M29N3MMye , M29N3MMze , M29N3RAxe , M29N3RAye , M29N3RAze , M29N3RDxe , & - M29N3RDye , M29N3RDze , M29N3TAxe , M29N3TAye , M29N3TAze , M29N3TDxss , M29N3TDyss , & - M29N3TDzss , M29N4FKxe , M29N4FKye , M29N4FKze , M29N4FMxe , M29N4FMye , M29N4FMze , & - M29N4MKxe , M29N4MKye , M29N4MKze , M29N4MMxe , M29N4MMye , M29N4MMze , M29N4RAxe , & - M29N4RAye , M29N4RAze , M29N4RDxe , M29N4RDye , M29N4RDze , M29N4TAxe , M29N4TAye , & - M29N4TAze , M29N4TDxss , M29N4TDyss , M29N4TDzss , M29N5FKxe , M29N5FKye , M29N5FKze , & - M29N5FMxe , M29N5FMye , M29N5FMze , M29N5MKxe , M29N5MKye , M29N5MKze , M29N5MMxe , & - M29N5MMye , M29N5MMze , M29N5RAxe , M29N5RAye , M29N5RAze , M29N5RDxe , M29N5RDye , & - M29N5RDze , M29N5TAxe , M29N5TAye , M29N5TAze , M29N5TDxss , M29N5TDyss , M29N5TDzss , & - M29N6FKxe , M29N6FKye , M29N6FKze , M29N6FMxe , M29N6FMye , M29N6FMze , M29N6MKxe , & - M29N6MKye , M29N6MKze , M29N6MMxe , M29N6MMye , M29N6MMze , M29N6RAxe , M29N6RAye , & - M29N6RAze , M29N6RDxe , M29N6RDye , M29N6RDze , M29N6TAxe , M29N6TAye , M29N6TAze , & - M29N6TDxss , M29N6TDyss , M29N6TDzss , M29N7FKxe , M29N7FKye , M29N7FKze , M29N7FMxe , & - M29N7FMye , M29N7FMze , M29N7MKxe , M29N7MKye , M29N7MKze , M29N7MMxe , M29N7MMye , & - M29N7MMze , M29N7RAxe , M29N7RAye , M29N7RAze , M29N7RDxe , M29N7RDye , M29N7RDze , & - M29N7TAxe , M29N7TAye , M29N7TAze , M29N7TDxss , M29N7TDyss , M29N7TDzss , M29N8FKxe , & - M29N8FKye , M29N8FKze , M29N8FMxe , M29N8FMye , M29N8FMze , M29N8MKxe , M29N8MKye , & - M29N8MKze , M29N8MMxe , M29N8MMye , M29N8MMze , M29N8RAxe , M29N8RAye , M29N8RAze , & - M29N8RDxe , M29N8RDye , M29N8RDze , M29N8TAxe , M29N8TAye , M29N8TAze , M29N8TDxss , & - M29N8TDyss , M29N8TDzss , M29N9FKxe , M29N9FKye , M29N9FKze , M29N9FMxe , M29N9FMye , & - M29N9FMze , M29N9MKxe , M29N9MKye , M29N9MKze , M29N9MMxe , M29N9MMye , M29N9MMze , & - M29N9RAxe , M29N9RAye , M29N9RAze , M29N9RDxe , M29N9RDye , M29N9RDze , M29N9TAxe , & - M29N9TAye , M29N9TAze , M29N9TDxss , M29N9TDyss , M29N9TDzss , M30N1FKxe , M30N1FKye , & - M30N1FKze , M30N1FMxe , M30N1FMye , M30N1FMze , M30N1MKxe , M30N1MKye , M30N1MKze , & - M30N1MMxe , M30N1MMye , M30N1MMze , M30N1RAxe , M30N1RAye , M30N1RAze , M30N1RDxe , & - M30N1RDye , M30N1RDze , M30N1TAxe , M30N1TAye , M30N1TAze , M30N1TDxss , M30N1TDyss , & - M30N1TDzss , M30N2FKxe , M30N2FKye , M30N2FKze , M30N2FMxe , M30N2FMye , M30N2FMze , & - M30N2MKxe , M30N2MKye , M30N2MKze , M30N2MMxe , M30N2MMye , M30N2MMze , M30N2RAxe , & - M30N2RAye , M30N2RAze , M30N2RDxe , M30N2RDye , M30N2RDze , M30N2TAxe , M30N2TAye , & - M30N2TAze , M30N2TDxss , M30N2TDyss , M30N2TDzss , M30N3FKxe , M30N3FKye , M30N3FKze , & - M30N3FMxe , M30N3FMye , M30N3FMze , M30N3MKxe , M30N3MKye , M30N3MKze , M30N3MMxe , & - M30N3MMye , M30N3MMze , M30N3RAxe , M30N3RAye , M30N3RAze , M30N3RDxe , M30N3RDye , & - M30N3RDze , M30N3TAxe , M30N3TAye , M30N3TAze , M30N3TDxss , M30N3TDyss , M30N3TDzss , & - M30N4FKxe , M30N4FKye , M30N4FKze , M30N4FMxe , M30N4FMye , M30N4FMze , M30N4MKxe , & - M30N4MKye , M30N4MKze , M30N4MMxe , M30N4MMye , M30N4MMze , M30N4RAxe , M30N4RAye , & - M30N4RAze , M30N4RDxe , M30N4RDye , M30N4RDze , M30N4TAxe , M30N4TAye , M30N4TAze , & - M30N4TDxss , M30N4TDyss , M30N4TDzss , M30N5FKxe , M30N5FKye , M30N5FKze , M30N5FMxe , & - M30N5FMye , M30N5FMze , M30N5MKxe , M30N5MKye , M30N5MKze , M30N5MMxe , M30N5MMye , & - M30N5MMze , M30N5RAxe , M30N5RAye , M30N5RAze , M30N5RDxe , M30N5RDye , M30N5RDze , & - M30N5TAxe , M30N5TAye , M30N5TAze , M30N5TDxss , M30N5TDyss , M30N5TDzss , M30N6FKxe , & - M30N6FKye , M30N6FKze , M30N6FMxe , M30N6FMye , M30N6FMze , M30N6MKxe , M30N6MKye , & - M30N6MKze , M30N6MMxe , M30N6MMye , M30N6MMze , M30N6RAxe , M30N6RAye , M30N6RAze , & - M30N6RDxe , M30N6RDye , M30N6RDze , M30N6TAxe , M30N6TAye , M30N6TAze , M30N6TDxss , & - M30N6TDyss , M30N6TDzss , M30N7FKxe , M30N7FKye , M30N7FKze , M30N7FMxe , M30N7FMye , & - M30N7FMze , M30N7MKxe , M30N7MKye , M30N7MKze , M30N7MMxe , M30N7MMye , M30N7MMze , & - M30N7RAxe , M30N7RAye , M30N7RAze , M30N7RDxe , M30N7RDye , M30N7RDze , M30N7TAxe , & - M30N7TAye , M30N7TAze , M30N7TDxss , M30N7TDyss , M30N7TDzss , M30N8FKxe , M30N8FKye , & - M30N8FKze , M30N8FMxe , M30N8FMye , M30N8FMze , M30N8MKxe , M30N8MKye , M30N8MKze , & - M30N8MMxe , M30N8MMye , M30N8MMze , M30N8RAxe , M30N8RAye , M30N8RAze , M30N8RDxe , & - M30N8RDye , M30N8RDze , M30N8TAxe , M30N8TAye , M30N8TAze , M30N8TDxss , M30N8TDyss , & - M30N8TDzss , M30N9FKxe , M30N9FKye , M30N9FKze , M30N9FMxe , M30N9FMye , M30N9FMze , & - M30N9MKxe , M30N9MKye , M30N9MKze , M30N9MMxe , M30N9MMye , M30N9MMze , M30N9RAxe , & - M30N9RAye , M30N9RAze , M30N9RDxe , M30N9RDye , M30N9RDze , M30N9TAxe , M30N9TAye , & - M30N9TAze , M30N9TDxss , M30N9TDyss , M30N9TDzss , M31N1FKxe , M31N1FKye , M31N1FKze , & - M31N1FMxe , M31N1FMye , M31N1FMze , M31N1MKxe , M31N1MKye , M31N1MKze , M31N1MMxe , & - M31N1MMye , M31N1MMze , M31N1RAxe , M31N1RAye , M31N1RAze , M31N1RDxe , M31N1RDye , & - M31N1RDze , M31N1TAxe , M31N1TAye , M31N1TAze , M31N1TDxss , M31N1TDyss , M31N1TDzss , & - M31N2FKxe , M31N2FKye , M31N2FKze , M31N2FMxe , M31N2FMye , M31N2FMze , M31N2MKxe , & - M31N2MKye , M31N2MKze , M31N2MMxe , M31N2MMye , M31N2MMze , M31N2RAxe , M31N2RAye , & - M31N2RAze , M31N2RDxe , M31N2RDye , M31N2RDze , M31N2TAxe , M31N2TAye , M31N2TAze , & - M31N2TDxss , M31N2TDyss , M31N2TDzss , M31N3FKxe , M31N3FKye , M31N3FKze , M31N3FMxe , & - M31N3FMye , M31N3FMze , M31N3MKxe , M31N3MKye , M31N3MKze , M31N3MMxe , M31N3MMye , & - M31N3MMze , M31N3RAxe , M31N3RAye , M31N3RAze , M31N3RDxe , M31N3RDye , M31N3RDze , & - M31N3TAxe , M31N3TAye , M31N3TAze , M31N3TDxss , M31N3TDyss , M31N3TDzss , M31N4FKxe , & - M31N4FKye , M31N4FKze , M31N4FMxe , M31N4FMye , M31N4FMze , M31N4MKxe , M31N4MKye , & - M31N4MKze , M31N4MMxe , M31N4MMye , M31N4MMze , M31N4RAxe , M31N4RAye , M31N4RAze , & - M31N4RDxe , M31N4RDye , M31N4RDze , M31N4TAxe , M31N4TAye , M31N4TAze , M31N4TDxss , & - M31N4TDyss , M31N4TDzss , M31N5FKxe , M31N5FKye , M31N5FKze , M31N5FMxe , M31N5FMye , & - M31N5FMze , M31N5MKxe , M31N5MKye , M31N5MKze , M31N5MMxe , M31N5MMye , M31N5MMze , & - M31N5RAxe , M31N5RAye , M31N5RAze , M31N5RDxe , M31N5RDye , M31N5RDze , M31N5TAxe , & - M31N5TAye , M31N5TAze , M31N5TDxss , M31N5TDyss , M31N5TDzss , M31N6FKxe , M31N6FKye , & - M31N6FKze , M31N6FMxe , M31N6FMye , M31N6FMze , M31N6MKxe , M31N6MKye , M31N6MKze , & - M31N6MMxe , M31N6MMye , M31N6MMze , M31N6RAxe , M31N6RAye , M31N6RAze , M31N6RDxe , & - M31N6RDye , M31N6RDze , M31N6TAxe , M31N6TAye , M31N6TAze , M31N6TDxss , M31N6TDyss , & - M31N6TDzss , M31N7FKxe , M31N7FKye , M31N7FKze , M31N7FMxe , M31N7FMye , M31N7FMze , & - M31N7MKxe , M31N7MKye , M31N7MKze , M31N7MMxe , M31N7MMye , M31N7MMze , M31N7RAxe , & - M31N7RAye , M31N7RAze , M31N7RDxe , M31N7RDye , M31N7RDze , M31N7TAxe , M31N7TAye , & - M31N7TAze , M31N7TDxss , M31N7TDyss , M31N7TDzss , M31N8FKxe , M31N8FKye , M31N8FKze , & - M31N8FMxe , M31N8FMye , M31N8FMze , M31N8MKxe , M31N8MKye , M31N8MKze , M31N8MMxe , & - M31N8MMye , M31N8MMze , M31N8RAxe , M31N8RAye /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry5(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M31N8RAze , M31N8RDxe , M31N8RDye , M31N8RDze , M31N8TAxe , M31N8TAye , M31N8TAze , & - M31N8TDxss , M31N8TDyss , M31N8TDzss , M31N9FKxe , M31N9FKye , M31N9FKze , M31N9FMxe , & - M31N9FMye , M31N9FMze , M31N9MKxe , M31N9MKye , M31N9MKze , M31N9MMxe , M31N9MMye , & - M31N9MMze , M31N9RAxe , M31N9RAye , M31N9RAze , M31N9RDxe , M31N9RDye , M31N9RDze , & - M31N9TAxe , M31N9TAye , M31N9TAze , M31N9TDxss , M31N9TDyss , M31N9TDzss , M32N1FKxe , & - M32N1FKye , M32N1FKze , M32N1FMxe , M32N1FMye , M32N1FMze , M32N1MKxe , M32N1MKye , & - M32N1MKze , M32N1MMxe , M32N1MMye , M32N1MMze , M32N1RAxe , M32N1RAye , M32N1RAze , & - M32N1RDxe , M32N1RDye , M32N1RDze , M32N1TAxe , M32N1TAye , M32N1TAze , M32N1TDxss , & - M32N1TDyss , M32N1TDzss , M32N2FKxe , M32N2FKye , M32N2FKze , M32N2FMxe , M32N2FMye , & - M32N2FMze , M32N2MKxe , M32N2MKye , M32N2MKze , M32N2MMxe , M32N2MMye , M32N2MMze , & - M32N2RAxe , M32N2RAye , M32N2RAze , M32N2RDxe , M32N2RDye , M32N2RDze , M32N2TAxe , & - M32N2TAye , M32N2TAze , M32N2TDxss , M32N2TDyss , M32N2TDzss , M32N3FKxe , M32N3FKye , & - M32N3FKze , M32N3FMxe , M32N3FMye , M32N3FMze , M32N3MKxe , M32N3MKye , M32N3MKze , & - M32N3MMxe , M32N3MMye , M32N3MMze , M32N3RAxe , M32N3RAye , M32N3RAze , M32N3RDxe , & - M32N3RDye , M32N3RDze , M32N3TAxe , M32N3TAye , M32N3TAze , M32N3TDxss , M32N3TDyss , & - M32N3TDzss , M32N4FKxe , M32N4FKye , M32N4FKze , M32N4FMxe , M32N4FMye , M32N4FMze , & - M32N4MKxe , M32N4MKye , M32N4MKze , M32N4MMxe , M32N4MMye , M32N4MMze , M32N4RAxe , & - M32N4RAye , M32N4RAze , M32N4RDxe , M32N4RDye , M32N4RDze , M32N4TAxe , M32N4TAye , & - M32N4TAze , M32N4TDxss , M32N4TDyss , M32N4TDzss , M32N5FKxe , M32N5FKye , M32N5FKze , & - M32N5FMxe , M32N5FMye , M32N5FMze , M32N5MKxe , M32N5MKye , M32N5MKze , M32N5MMxe , & - M32N5MMye , M32N5MMze , M32N5RAxe , M32N5RAye , M32N5RAze , M32N5RDxe , M32N5RDye , & - M32N5RDze , M32N5TAxe , M32N5TAye , M32N5TAze , M32N5TDxss , M32N5TDyss , M32N5TDzss , & - M32N6FKxe , M32N6FKye , M32N6FKze , M32N6FMxe , M32N6FMye , M32N6FMze , M32N6MKxe , & - M32N6MKye , M32N6MKze , M32N6MMxe , M32N6MMye , M32N6MMze , M32N6RAxe , M32N6RAye , & - M32N6RAze , M32N6RDxe , M32N6RDye , M32N6RDze , M32N6TAxe , M32N6TAye , M32N6TAze , & - M32N6TDxss , M32N6TDyss , M32N6TDzss , M32N7FKxe , M32N7FKye , M32N7FKze , M32N7FMxe , & - M32N7FMye , M32N7FMze , M32N7MKxe , M32N7MKye , M32N7MKze , M32N7MMxe , M32N7MMye , & - M32N7MMze , M32N7RAxe , M32N7RAye , M32N7RAze , M32N7RDxe , M32N7RDye , M32N7RDze , & - M32N7TAxe , M32N7TAye , M32N7TAze , M32N7TDxss , M32N7TDyss , M32N7TDzss , M32N8FKxe , & - M32N8FKye , M32N8FKze , M32N8FMxe , M32N8FMye , M32N8FMze , M32N8MKxe , M32N8MKye , & - M32N8MKze , M32N8MMxe , M32N8MMye , M32N8MMze , M32N8RAxe , M32N8RAye , M32N8RAze , & - M32N8RDxe , M32N8RDye , M32N8RDze , M32N8TAxe , M32N8TAye , M32N8TAze , M32N8TDxss , & - M32N8TDyss , M32N8TDzss , M32N9FKxe , M32N9FKye , M32N9FKze , M32N9FMxe , M32N9FMye , & - M32N9FMze , M32N9MKxe , M32N9MKye , M32N9MKze , M32N9MMxe , M32N9MMye , M32N9MMze , & - M32N9RAxe , M32N9RAye , M32N9RAze , M32N9RDxe , M32N9RDye , M32N9RDze , M32N9TAxe , & - M32N9TAye , M32N9TAze , M32N9TDxss , M32N9TDyss , M32N9TDzss , M33N1FKxe , M33N1FKye , & - M33N1FKze , M33N1FMxe , M33N1FMye , M33N1FMze , M33N1MKxe , M33N1MKye , M33N1MKze , & - M33N1MMxe , M33N1MMye , M33N1MMze , M33N1RAxe , M33N1RAye , M33N1RAze , M33N1RDxe , & - M33N1RDye , M33N1RDze , M33N1TAxe , M33N1TAye , M33N1TAze , M33N1TDxss , M33N1TDyss , & - M33N1TDzss , M33N2FKxe , M33N2FKye , M33N2FKze , M33N2FMxe , M33N2FMye , M33N2FMze , & - M33N2MKxe , M33N2MKye , M33N2MKze , M33N2MMxe , M33N2MMye , M33N2MMze , M33N2RAxe , & - M33N2RAye , M33N2RAze , M33N2RDxe , M33N2RDye , M33N2RDze , M33N2TAxe , M33N2TAye , & - M33N2TAze , M33N2TDxss , M33N2TDyss , M33N2TDzss , M33N3FKxe , M33N3FKye , M33N3FKze , & - M33N3FMxe , M33N3FMye , M33N3FMze , M33N3MKxe , M33N3MKye , M33N3MKze , M33N3MMxe , & - M33N3MMye , M33N3MMze , M33N3RAxe , M33N3RAye , M33N3RAze , M33N3RDxe , M33N3RDye , & - M33N3RDze , M33N3TAxe , M33N3TAye , M33N3TAze , M33N3TDxss , M33N3TDyss , M33N3TDzss , & - M33N4FKxe , M33N4FKye , M33N4FKze , M33N4FMxe , M33N4FMye , M33N4FMze , M33N4MKxe , & - M33N4MKye , M33N4MKze , M33N4MMxe , M33N4MMye , M33N4MMze , M33N4RAxe , M33N4RAye , & - M33N4RAze , M33N4RDxe , M33N4RDye , M33N4RDze , M33N4TAxe , M33N4TAye , M33N4TAze , & - M33N4TDxss , M33N4TDyss , M33N4TDzss , M33N5FKxe , M33N5FKye , M33N5FKze , M33N5FMxe , & - M33N5FMye , M33N5FMze , M33N5MKxe , M33N5MKye , M33N5MKze , M33N5MMxe , M33N5MMye , & - M33N5MMze , M33N5RAxe , M33N5RAye , M33N5RAze , M33N5RDxe , M33N5RDye , M33N5RDze , & - M33N5TAxe , M33N5TAye , M33N5TAze , M33N5TDxss , M33N5TDyss , M33N5TDzss , M33N6FKxe , & - M33N6FKye , M33N6FKze , M33N6FMxe , M33N6FMye , M33N6FMze , M33N6MKxe , M33N6MKye , & - M33N6MKze , M33N6MMxe , M33N6MMye , M33N6MMze , M33N6RAxe , M33N6RAye , M33N6RAze , & - M33N6RDxe , M33N6RDye , M33N6RDze , M33N6TAxe , M33N6TAye , M33N6TAze , M33N6TDxss , & - M33N6TDyss , M33N6TDzss , M33N7FKxe , M33N7FKye , M33N7FKze , M33N7FMxe , M33N7FMye , & - M33N7FMze , M33N7MKxe , M33N7MKye , M33N7MKze , M33N7MMxe , M33N7MMye , M33N7MMze , & - M33N7RAxe , M33N7RAye , M33N7RAze , M33N7RDxe , M33N7RDye , M33N7RDze , M33N7TAxe , & - M33N7TAye , M33N7TAze , M33N7TDxss , M33N7TDyss , M33N7TDzss , M33N8FKxe , M33N8FKye , & - M33N8FKze , M33N8FMxe , M33N8FMye , M33N8FMze , M33N8MKxe , M33N8MKye , M33N8MKze , & - M33N8MMxe , M33N8MMye , M33N8MMze , M33N8RAxe , M33N8RAye , M33N8RAze , M33N8RDxe , & - M33N8RDye , M33N8RDze , M33N8TAxe , M33N8TAye , M33N8TAze , M33N8TDxss , M33N8TDyss , & - M33N8TDzss , M33N9FKxe , M33N9FKye , M33N9FKze , M33N9FMxe , M33N9FMye , M33N9FMze , & - M33N9MKxe , M33N9MKye , M33N9MKze , M33N9MMxe , M33N9MMye , M33N9MMze , M33N9RAxe , & - M33N9RAye , M33N9RAze , M33N9RDxe , M33N9RDye , M33N9RDze , M33N9TAxe , M33N9TAye , & - M33N9TAze , M33N9TDxss , M33N9TDyss , M33N9TDzss , M34N1FKxe , M34N1FKye , M34N1FKze , & - M34N1FMxe , M34N1FMye , M34N1FMze , M34N1MKxe , M34N1MKye , M34N1MKze , M34N1MMxe , & - M34N1MMye , M34N1MMze , M34N1RAxe , M34N1RAye , M34N1RAze , M34N1RDxe , M34N1RDye , & - M34N1RDze , M34N1TAxe , M34N1TAye , M34N1TAze , M34N1TDxss , M34N1TDyss , M34N1TDzss , & - M34N2FKxe , M34N2FKye , M34N2FKze , M34N2FMxe , M34N2FMye , M34N2FMze , M34N2MKxe , & - M34N2MKye , M34N2MKze , M34N2MMxe , M34N2MMye , M34N2MMze , M34N2RAxe , M34N2RAye , & - M34N2RAze , M34N2RDxe , M34N2RDye , M34N2RDze , M34N2TAxe , M34N2TAye , M34N2TAze , & - M34N2TDxss , M34N2TDyss , M34N2TDzss , M34N3FKxe , M34N3FKye , M34N3FKze , M34N3FMxe , & - M34N3FMye , M34N3FMze , M34N3MKxe , M34N3MKye , M34N3MKze , M34N3MMxe , M34N3MMye , & - M34N3MMze , M34N3RAxe , M34N3RAye , M34N3RAze , M34N3RDxe , M34N3RDye , M34N3RDze , & - M34N3TAxe , M34N3TAye , M34N3TAze , M34N3TDxss , M34N3TDyss , M34N3TDzss , M34N4FKxe , & - M34N4FKye , M34N4FKze , M34N4FMxe , M34N4FMye , M34N4FMze , M34N4MKxe , M34N4MKye , & - M34N4MKze , M34N4MMxe , M34N4MMye , M34N4MMze , M34N4RAxe , M34N4RAye , M34N4RAze , & - M34N4RDxe , M34N4RDye , M34N4RDze , M34N4TAxe , M34N4TAye , M34N4TAze , M34N4TDxss , & - M34N4TDyss , M34N4TDzss , M34N5FKxe , M34N5FKye , M34N5FKze , M34N5FMxe , M34N5FMye , & - M34N5FMze , M34N5MKxe , M34N5MKye , M34N5MKze , M34N5MMxe , M34N5MMye , M34N5MMze , & - M34N5RAxe , M34N5RAye , M34N5RAze , M34N5RDxe , M34N5RDye , M34N5RDze , M34N5TAxe , & - M34N5TAye , M34N5TAze , M34N5TDxss , M34N5TDyss , M34N5TDzss , M34N6FKxe , M34N6FKye , & - M34N6FKze , M34N6FMxe , M34N6FMye , M34N6FMze , M34N6MKxe , M34N6MKye , M34N6MKze , & - M34N6MMxe , M34N6MMye , M34N6MMze , M34N6RAxe , M34N6RAye , M34N6RAze , M34N6RDxe , & - M34N6RDye , M34N6RDze , M34N6TAxe , M34N6TAye , M34N6TAze , M34N6TDxss , M34N6TDyss , & - M34N6TDzss , M34N7FKxe , M34N7FKye , M34N7FKze , M34N7FMxe , M34N7FMye , M34N7FMze , & - M34N7MKxe , M34N7MKye , M34N7MKze , M34N7MMxe , M34N7MMye , M34N7MMze , M34N7RAxe , & - M34N7RAye , M34N7RAze , M34N7RDxe , M34N7RDye , M34N7RDze , M34N7TAxe , M34N7TAye , & - M34N7TAze , M34N7TDxss , M34N7TDyss , M34N7TDzss , M34N8FKxe , M34N8FKye , M34N8FKze , & - M34N8FMxe , M34N8FMye , M34N8FMze , M34N8MKxe , M34N8MKye , M34N8MKze , M34N8MMxe , & - M34N8MMye , M34N8MMze , M34N8RAxe , M34N8RAye , M34N8RAze , M34N8RDxe , M34N8RDye , & - M34N8RDze , M34N8TAxe , M34N8TAye , M34N8TAze , M34N8TDxss , M34N8TDyss , M34N8TDzss , & - M34N9FKxe , M34N9FKye , M34N9FKze , M34N9FMxe , M34N9FMye , M34N9FMze , M34N9MKxe , & - M34N9MKye , M34N9MKze , M34N9MMxe , M34N9MMye , M34N9MMze , M34N9RAxe , M34N9RAye , & - M34N9RAze , M34N9RDxe , M34N9RDye , M34N9RDze , M34N9TAxe , M34N9TAye , M34N9TAze , & - M34N9TDxss , M34N9TDyss , M34N9TDzss , M35N1FKxe , M35N1FKye , M35N1FKze , M35N1FMxe , & - M35N1FMye , M35N1FMze , M35N1MKxe , M35N1MKye , M35N1MKze , M35N1MMxe , M35N1MMye , & - M35N1MMze , M35N1RAxe , M35N1RAye , M35N1RAze , M35N1RDxe , M35N1RDye , M35N1RDze , & - M35N1TAxe , M35N1TAye , M35N1TAze , M35N1TDxss , M35N1TDyss , M35N1TDzss , M35N2FKxe , & - M35N2FKye , M35N2FKze , M35N2FMxe , M35N2FMye , M35N2FMze , M35N2MKxe , M35N2MKye , & - M35N2MKze , M35N2MMxe , M35N2MMye , M35N2MMze , M35N2RAxe , M35N2RAye , M35N2RAze , & - M35N2RDxe , M35N2RDye , M35N2RDze , M35N2TAxe , M35N2TAye , M35N2TAze , M35N2TDxss , & - M35N2TDyss , M35N2TDzss , M35N3FKxe , M35N3FKye , M35N3FKze , M35N3FMxe , M35N3FMye , & - M35N3FMze , M35N3MKxe , M35N3MKye , M35N3MKze , M35N3MMxe , M35N3MMye , M35N3MMze , & - M35N3RAxe , M35N3RAye , M35N3RAze , M35N3RDxe , M35N3RDye , M35N3RDze , M35N3TAxe , & - M35N3TAye , M35N3TAze , M35N3TDxss , M35N3TDyss , M35N3TDzss , M35N4FKxe , M35N4FKye , & - M35N4FKze , M35N4FMxe , M35N4FMye , M35N4FMze , M35N4MKxe , M35N4MKye , M35N4MKze , & - M35N4MMxe , M35N4MMye , M35N4MMze , M35N4RAxe , M35N4RAye , M35N4RAze , M35N4RDxe , & - M35N4RDye , M35N4RDze , M35N4TAxe , M35N4TAye , M35N4TAze , M35N4TDxss , M35N4TDyss , & - M35N4TDzss , M35N5FKxe , M35N5FKye , M35N5FKze , M35N5FMxe , M35N5FMye , M35N5FMze , & - M35N5MKxe , M35N5MKye , M35N5MKze , M35N5MMxe , M35N5MMye , M35N5MMze , M35N5RAxe , & - M35N5RAye , M35N5RAze , M35N5RDxe , M35N5RDye , M35N5RDze , M35N5TAxe , M35N5TAye , & - M35N5TAze , M35N5TDxss , M35N5TDyss , M35N5TDzss , M35N6FKxe , M35N6FKye , M35N6FKze , & - M35N6FMxe , M35N6FMye , M35N6FMze , M35N6MKxe , M35N6MKye , M35N6MKze , M35N6MMxe , & - M35N6MMye , M35N6MMze , M35N6RAxe , M35N6RAye , M35N6RAze , M35N6RDxe , M35N6RDye , & - M35N6RDze , M35N6TAxe , M35N6TAye , M35N6TAze , M35N6TDxss , M35N6TDyss , M35N6TDzss , & - M35N7FKxe , M35N7FKye , M35N7FKze , M35N7FMxe , M35N7FMye , M35N7FMze , M35N7MKxe , & - M35N7MKye , M35N7MKze , M35N7MMxe , M35N7MMye , M35N7MMze , M35N7RAxe , M35N7RAye , & - M35N7RAze , M35N7RDxe , M35N7RDye , M35N7RDze , M35N7TAxe , M35N7TAye , M35N7TAze , & - M35N7TDxss , M35N7TDyss , M35N7TDzss , M35N8FKxe , M35N8FKye , M35N8FKze , M35N8FMxe , & - M35N8FMye , M35N8FMze , M35N8MKxe , M35N8MKye , M35N8MKze , M35N8MMxe , M35N8MMye , & - M35N8MMze , M35N8RAxe , M35N8RAye , M35N8RAze , M35N8RDxe , M35N8RDye , M35N8RDze , & - M35N8TAxe , M35N8TAye , M35N8TAze , M35N8TDxss , M35N8TDyss , M35N8TDzss , M35N9FKxe , & - M35N9FKye , M35N9FKze , M35N9FMxe , M35N9FMye , M35N9FMze , M35N9MKxe , M35N9MKye , & - M35N9MKze , M35N9MMxe , M35N9MMye , M35N9MMze , M35N9RAxe , M35N9RAye , M35N9RAze , & - M35N9RDxe , M35N9RDye , M35N9RDze , M35N9TAxe , M35N9TAye , M35N9TAze , M35N9TDxss , & - M35N9TDyss , M35N9TDzss , M36N1FKxe , M36N1FKye , M36N1FKze , M36N1FMxe , M36N1FMye , & - M36N1FMze , M36N1MKxe , M36N1MKye , M36N1MKze , M36N1MMxe , M36N1MMye , M36N1MMze , & - M36N1RAxe , M36N1RAye , M36N1RAze , M36N1RDxe , M36N1RDye , M36N1RDze , M36N1TAxe , & - M36N1TAye , M36N1TAze , M36N1TDxss , M36N1TDyss , M36N1TDzss , M36N2FKxe , M36N2FKye , & - M36N2FKze , M36N2FMxe , M36N2FMye , M36N2FMze , M36N2MKxe , M36N2MKye , M36N2MKze , & - M36N2MMxe , M36N2MMye , M36N2MMze , M36N2RAxe , M36N2RAye , M36N2RAze , M36N2RDxe , & - M36N2RDye , M36N2RDze , M36N2TAxe , M36N2TAye , M36N2TAze , M36N2TDxss , M36N2TDyss , & - M36N2TDzss , M36N3FKxe , M36N3FKye , M36N3FKze , M36N3FMxe , M36N3FMye , M36N3FMze , & - M36N3MKxe , M36N3MKye , M36N3MKze , M36N3MMxe , M36N3MMye , M36N3MMze , M36N3RAxe , & - M36N3RAye , M36N3RAze , M36N3RDxe , M36N3RDye , M36N3RDze , M36N3TAxe , M36N3TAye , & - M36N3TAze , M36N3TDxss , M36N3TDyss , M36N3TDzss , M36N4FKxe , M36N4FKye , M36N4FKze , & - M36N4FMxe , M36N4FMye , M36N4FMze , M36N4MKxe , M36N4MKye , M36N4MKze , M36N4MMxe , & - M36N4MMye , M36N4MMze , M36N4RAxe , M36N4RAye , M36N4RAze , M36N4RDxe , M36N4RDye , & - M36N4RDze , M36N4TAxe , M36N4TAye , M36N4TAze , M36N4TDxss , M36N4TDyss , M36N4TDzss , & - M36N5FKxe , M36N5FKye , M36N5FKze , M36N5FMxe , M36N5FMye , M36N5FMze , M36N5MKxe , & - M36N5MKye , M36N5MKze , M36N5MMxe , M36N5MMye , M36N5MMze , M36N5RAxe , M36N5RAye , & - M36N5RAze , M36N5RDxe , M36N5RDye , M36N5RDze , M36N5TAxe , M36N5TAye , M36N5TAze , & - M36N5TDxss , M36N5TDyss , M36N5TDzss , M36N6FKxe , M36N6FKye , M36N6FKze , M36N6FMxe , & - M36N6FMye , M36N6FMze , M36N6MKxe , M36N6MKye , M36N6MKze , M36N6MMxe , M36N6MMye , & - M36N6MMze , M36N6RAxe , M36N6RAye , M36N6RAze , M36N6RDxe , M36N6RDye , M36N6RDze , & - M36N6TAxe , M36N6TAye , M36N6TAze , M36N6TDxss , M36N6TDyss , M36N6TDzss , M36N7FKxe , & - M36N7FKye , M36N7FKze , M36N7FMxe , M36N7FMye , M36N7FMze , M36N7MKxe , M36N7MKye , & - M36N7MKze , M36N7MMxe , M36N7MMye , M36N7MMze , M36N7RAxe , M36N7RAye , M36N7RAze , & - M36N7RDxe , M36N7RDye , M36N7RDze , M36N7TAxe , M36N7TAye , M36N7TAze , M36N7TDxss , & - M36N7TDyss , M36N7TDzss , M36N8FKxe , M36N8FKye , M36N8FKze , M36N8FMxe , M36N8FMye , & - M36N8FMze , M36N8MKxe , M36N8MKye , M36N8MKze , M36N8MMxe , M36N8MMye , M36N8MMze , & - M36N8RAxe , M36N8RAye , M36N8RAze , M36N8RDxe , M36N8RDye , M36N8RDze , M36N8TAxe , & - M36N8TAye , M36N8TAze , M36N8TDxss , M36N8TDyss , M36N8TDzss , M36N9FKxe , M36N9FKye , & - M36N9FKze , M36N9FMxe , M36N9FMye , M36N9FMze , M36N9MKxe , M36N9MKye , M36N9MKze , & - M36N9MMxe , M36N9MMye , M36N9MMze , M36N9RAxe , M36N9RAye , M36N9RAze , M36N9RDxe , & - M36N9RDye , M36N9RDze , M36N9TAxe , M36N9TAye , M36N9TAze , M36N9TDxss , M36N9TDyss , & - M36N9TDzss , M37N1FKxe , M37N1FKye , M37N1FKze , M37N1FMxe , M37N1FMye , M37N1FMze , & - M37N1MKxe , M37N1MKye , M37N1MKze , M37N1MMxe , M37N1MMye , M37N1MMze , M37N1RAxe , & - M37N1RAye , M37N1RAze , M37N1RDxe , M37N1RDye , M37N1RDze , M37N1TAxe , M37N1TAye , & - M37N1TAze , M37N1TDxss , M37N1TDyss , M37N1TDzss , M37N2FKxe , M37N2FKye , M37N2FKze , & - M37N2FMxe , M37N2FMye , M37N2FMze , M37N2MKxe , M37N2MKye , M37N2MKze , M37N2MMxe , & - M37N2MMye , M37N2MMze , M37N2RAxe , M37N2RAye , M37N2RAze , M37N2RDxe , M37N2RDye , & - M37N2RDze , M37N2TAxe , M37N2TAye , M37N2TAze , M37N2TDxss , M37N2TDyss , M37N2TDzss , & - M37N3FKxe , M37N3FKye , M37N3FKze , M37N3FMxe , M37N3FMye , M37N3FMze , M37N3MKxe , & - M37N3MKye , M37N3MKze , M37N3MMxe , M37N3MMye , M37N3MMze , M37N3RAxe , M37N3RAye , & - M37N3RAze , M37N3RDxe , M37N3RDye , M37N3RDze , M37N3TAxe , M37N3TAye , M37N3TAze , & - M37N3TDxss , M37N3TDyss , M37N3TDzss , M37N4FKxe , M37N4FKye , M37N4FKze , M37N4FMxe , & - M37N4FMye , M37N4FMze , M37N4MKxe , M37N4MKye , M37N4MKze , M37N4MMxe , M37N4MMye , & - M37N4MMze , M37N4RAxe , M37N4RAye , M37N4RAze , M37N4RDxe , M37N4RDye , M37N4RDze , & - M37N4TAxe , M37N4TAye , M37N4TAze , M37N4TDxss , M37N4TDyss , M37N4TDzss , M37N5FKxe , & - M37N5FKye , M37N5FKze , M37N5FMxe , M37N5FMye , M37N5FMze , M37N5MKxe , M37N5MKye , & - M37N5MKze , M37N5MMxe , M37N5MMye , M37N5MMze , M37N5RAxe , M37N5RAye , M37N5RAze , & - M37N5RDxe , M37N5RDye , M37N5RDze , M37N5TAxe , M37N5TAye , M37N5TAze , M37N5TDxss , & - M37N5TDyss , M37N5TDzss , M37N6FKxe , M37N6FKye , M37N6FKze , M37N6FMxe , M37N6FMye , & - M37N6FMze , M37N6MKxe , M37N6MKye , M37N6MKze , M37N6MMxe , M37N6MMye , M37N6MMze , & - M37N6RAxe , M37N6RAye , M37N6RAze , M37N6RDxe , M37N6RDye , M37N6RDze , M37N6TAxe , & - M37N6TAye , M37N6TAze , M37N6TDxss , M37N6TDyss , M37N6TDzss , M37N7FKxe , M37N7FKye , & - M37N7FKze , M37N7FMxe , M37N7FMye , M37N7FMze , M37N7MKxe , M37N7MKye , M37N7MKze , & - M37N7MMxe , M37N7MMye , M37N7MMze , M37N7RAxe , M37N7RAye , M37N7RAze , M37N7RDxe , & - M37N7RDye , M37N7RDze , M37N7TAxe , M37N7TAye , M37N7TAze , M37N7TDxss , M37N7TDyss , & - M37N7TDzss , M37N8FKxe , M37N8FKye , M37N8FKze , M37N8FMxe , M37N8FMye , M37N8FMze , & - M37N8MKxe , M37N8MKye , M37N8MKze , M37N8MMxe , M37N8MMye , M37N8MMze , M37N8RAxe , & - M37N8RAye , M37N8RAze , M37N8RDxe , M37N8RDye , M37N8RDze , M37N8TAxe , M37N8TAye , & - M37N8TAze , M37N8TDxss , M37N8TDyss , M37N8TDzss , M37N9FKxe , M37N9FKye , M37N9FKze , & - M37N9FMxe , M37N9FMye , M37N9FMze , M37N9MKxe , M37N9MKye , M37N9MKze , M37N9MMxe , & - M37N9MMye , M37N9MMze , M37N9RAxe , M37N9RAye , M37N9RAze , M37N9RDxe , M37N9RDye , & - M37N9RDze , M37N9TAxe , M37N9TAye , M37N9TAze , M37N9TDxss , M37N9TDyss , M37N9TDzss , & - M38N1FKxe , M38N1FKye , M38N1FKze , M38N1FMxe , M38N1FMye , M38N1FMze , M38N1MKxe , & - M38N1MKye , M38N1MKze , M38N1MMxe , M38N1MMye , M38N1MMze , M38N1RAxe , M38N1RAye , & - M38N1RAze , M38N1RDxe , M38N1RDye , M38N1RDze , M38N1TAxe , M38N1TAye , M38N1TAze , & - M38N1TDxss , M38N1TDyss , M38N1TDzss , M38N2FKxe , M38N2FKye , M38N2FKze , M38N2FMxe , & - M38N2FMye , M38N2FMze , M38N2MKxe , M38N2MKye , M38N2MKze , M38N2MMxe , M38N2MMye , & - M38N2MMze , M38N2RAxe , M38N2RAye , M38N2RAze , M38N2RDxe , M38N2RDye , M38N2RDze , & - M38N2TAxe , M38N2TAye , M38N2TAze , M38N2TDxss , M38N2TDyss , M38N2TDzss , M38N3FKxe , & - M38N3FKye , M38N3FKze , M38N3FMxe , M38N3FMye , M38N3FMze , M38N3MKxe , M38N3MKye , & - M38N3MKze , M38N3MMxe , M38N3MMye , M38N3MMze , M38N3RAxe , M38N3RAye , M38N3RAze , & - M38N3RDxe , M38N3RDye , M38N3RDze , M38N3TAxe , M38N3TAye , M38N3TAze , M38N3TDxss , & - M38N3TDyss , M38N3TDzss , M38N4FKxe , M38N4FKye , M38N4FKze , M38N4FMxe , M38N4FMye , & - M38N4FMze , M38N4MKxe , M38N4MKye , M38N4MKze , M38N4MMxe , M38N4MMye , M38N4MMze , & - M38N4RAxe , M38N4RAye , M38N4RAze , M38N4RDxe , M38N4RDye , M38N4RDze , M38N4TAxe , & - M38N4TAye , M38N4TAze , M38N4TDxss , M38N4TDyss , M38N4TDzss , M38N5FKxe , M38N5FKye , & - M38N5FKze , M38N5FMxe , M38N5FMye , M38N5FMze , M38N5MKxe , M38N5MKye , M38N5MKze , & - M38N5MMxe , M38N5MMye , M38N5MMze , M38N5RAxe , M38N5RAye , M38N5RAze , M38N5RDxe , & - M38N5RDye , M38N5RDze , M38N5TAxe , M38N5TAye , M38N5TAze , M38N5TDxss , M38N5TDyss , & - M38N5TDzss , M38N6FKxe , M38N6FKye , M38N6FKze , M38N6FMxe , M38N6FMye , M38N6FMze , & - M38N6MKxe , M38N6MKye , M38N6MKze , M38N6MMxe , M38N6MMye , M38N6MMze , M38N6RAxe , & - M38N6RAye , M38N6RAze , M38N6RDxe , M38N6RDye , M38N6RDze , M38N6TAxe , M38N6TAye , & - M38N6TAze , M38N6TDxss , M38N6TDyss , M38N6TDzss , M38N7FKxe , M38N7FKye , M38N7FKze , & - M38N7FMxe , M38N7FMye , M38N7FMze , M38N7MKxe , M38N7MKye , M38N7MKze , M38N7MMxe , & - M38N7MMye , M38N7MMze , M38N7RAxe , M38N7RAye , M38N7RAze , M38N7RDxe , M38N7RDye , & - M38N7RDze , M38N7TAxe , M38N7TAye , M38N7TAze , M38N7TDxss , M38N7TDyss , M38N7TDzss , & - M38N8FKxe , M38N8FKye , M38N8FKze , M38N8FMxe , M38N8FMye , M38N8FMze , M38N8MKxe , & - M38N8MKye , M38N8MKze , M38N8MMxe , M38N8MMye , M38N8MMze , M38N8RAxe , M38N8RAye , & - M38N8RAze , M38N8RDxe , M38N8RDye , M38N8RDze , M38N8TAxe , M38N8TAye , M38N8TAze , & - M38N8TDxss , M38N8TDyss , M38N8TDzss , M38N9FKxe , M38N9FKye , M38N9FKze , M38N9FMxe , & - M38N9FMye , M38N9FMze , M38N9MKxe , M38N9MKye , M38N9MKze , M38N9MMxe , M38N9MMye , & - M38N9MMze , M38N9RAxe , M38N9RAye , M38N9RAze , M38N9RDxe , M38N9RDye , M38N9RDze , & - M38N9TAxe , M38N9TAye , M38N9TAze , M38N9TDxss , M38N9TDyss , M38N9TDzss , M39N1FKxe , & - M39N1FKye , M39N1FKze , M39N1FMxe , M39N1FMye , M39N1FMze , M39N1MKxe , M39N1MKye , & - M39N1MKze , M39N1MMxe , M39N1MMye , M39N1MMze , M39N1RAxe , M39N1RAye , M39N1RAze , & - M39N1RDxe , M39N1RDye , M39N1RDze , M39N1TAxe , M39N1TAye , M39N1TAze , M39N1TDxss , & - M39N1TDyss , M39N1TDzss , M39N2FKxe , M39N2FKye , M39N2FKze , M39N2FMxe , M39N2FMye , & - M39N2FMze , M39N2MKxe , M39N2MKye , M39N2MKze , M39N2MMxe , M39N2MMye , M39N2MMze , & - M39N2RAxe , M39N2RAye , M39N2RAze , M39N2RDxe , M39N2RDye , M39N2RDze , M39N2TAxe , & - M39N2TAye , M39N2TAze , M39N2TDxss , M39N2TDyss , M39N2TDzss , M39N3FKxe , M39N3FKye , & - M39N3FKze , M39N3FMxe , M39N3FMye , M39N3FMze , M39N3MKxe , M39N3MKye , M39N3MKze , & - M39N3MMxe , M39N3MMye , M39N3MMze , M39N3RAxe , M39N3RAye , M39N3RAze , M39N3RDxe , & - M39N3RDye , M39N3RDze , M39N3TAxe , M39N3TAye , M39N3TAze , M39N3TDxss , M39N3TDyss , & - M39N3TDzss , M39N4FKxe , M39N4FKye , M39N4FKze , M39N4FMxe , M39N4FMye , M39N4FMze , & - M39N4MKxe , M39N4MKye , M39N4MKze , M39N4MMxe , M39N4MMye , M39N4MMze , M39N4RAxe , & - M39N4RAye , M39N4RAze , M39N4RDxe , M39N4RDye , M39N4RDze , M39N4TAxe , M39N4TAye , & - M39N4TAze , M39N4TDxss , M39N4TDyss , M39N4TDzss , M39N5FKxe , M39N5FKye , M39N5FKze , & - M39N5FMxe , M39N5FMye , M39N5FMze , M39N5MKxe , M39N5MKye , M39N5MKze , M39N5MMxe , & - M39N5MMye , M39N5MMze , M39N5RAxe , M39N5RAye , M39N5RAze , M39N5RDxe , M39N5RDye , & - M39N5RDze , M39N5TAxe , M39N5TAye , M39N5TAze , M39N5TDxss , M39N5TDyss , M39N5TDzss , & - M39N6FKxe , M39N6FKye , M39N6FKze , M39N6FMxe /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry6(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M39N6FMye , M39N6FMze , M39N6MKxe , M39N6MKye , M39N6MKze , M39N6MMxe , M39N6MMye , & - M39N6MMze , M39N6RAxe , M39N6RAye , M39N6RAze , M39N6RDxe , M39N6RDye , M39N6RDze , & - M39N6TAxe , M39N6TAye , M39N6TAze , M39N6TDxss , M39N6TDyss , M39N6TDzss , M39N7FKxe , & - M39N7FKye , M39N7FKze , M39N7FMxe , M39N7FMye , M39N7FMze , M39N7MKxe , M39N7MKye , & - M39N7MKze , M39N7MMxe , M39N7MMye , M39N7MMze , M39N7RAxe , M39N7RAye , M39N7RAze , & - M39N7RDxe , M39N7RDye , M39N7RDze , M39N7TAxe , M39N7TAye , M39N7TAze , M39N7TDxss , & - M39N7TDyss , M39N7TDzss , M39N8FKxe , M39N8FKye , M39N8FKze , M39N8FMxe , M39N8FMye , & - M39N8FMze , M39N8MKxe , M39N8MKye , M39N8MKze , M39N8MMxe , M39N8MMye , M39N8MMze , & - M39N8RAxe , M39N8RAye , M39N8RAze , M39N8RDxe , M39N8RDye , M39N8RDze , M39N8TAxe , & - M39N8TAye , M39N8TAze , M39N8TDxss , M39N8TDyss , M39N8TDzss , M39N9FKxe , M39N9FKye , & - M39N9FKze , M39N9FMxe , M39N9FMye , M39N9FMze , M39N9MKxe , M39N9MKye , M39N9MKze , & - M39N9MMxe , M39N9MMye , M39N9MMze , M39N9RAxe , M39N9RAye , M39N9RAze , M39N9RDxe , & - M39N9RDye , M39N9RDze , M39N9TAxe , M39N9TAye , M39N9TAze , M39N9TDxss , M39N9TDyss , & - M39N9TDzss , M40N1FKxe , M40N1FKye , M40N1FKze , M40N1FMxe , M40N1FMye , M40N1FMze , & - M40N1MKxe , M40N1MKye , M40N1MKze , M40N1MMxe , M40N1MMye , M40N1MMze , M40N1RAxe , & - M40N1RAye , M40N1RAze , M40N1RDxe , M40N1RDye , M40N1RDze , M40N1TAxe , M40N1TAye , & - M40N1TAze , M40N1TDxss , M40N1TDyss , M40N1TDzss , M40N2FKxe , M40N2FKye , M40N2FKze , & - M40N2FMxe , M40N2FMye , M40N2FMze , M40N2MKxe , M40N2MKye , M40N2MKze , M40N2MMxe , & - M40N2MMye , M40N2MMze , M40N2RAxe , M40N2RAye , M40N2RAze , M40N2RDxe , M40N2RDye , & - M40N2RDze , M40N2TAxe , M40N2TAye , M40N2TAze , M40N2TDxss , M40N2TDyss , M40N2TDzss , & - M40N3FKxe , M40N3FKye , M40N3FKze , M40N3FMxe , M40N3FMye , M40N3FMze , M40N3MKxe , & - M40N3MKye , M40N3MKze , M40N3MMxe , M40N3MMye , M40N3MMze , M40N3RAxe , M40N3RAye , & - M40N3RAze , M40N3RDxe , M40N3RDye , M40N3RDze , M40N3TAxe , M40N3TAye , M40N3TAze , & - M40N3TDxss , M40N3TDyss , M40N3TDzss , M40N4FKxe , M40N4FKye , M40N4FKze , M40N4FMxe , & - M40N4FMye , M40N4FMze , M40N4MKxe , M40N4MKye , M40N4MKze , M40N4MMxe , M40N4MMye , & - M40N4MMze , M40N4RAxe , M40N4RAye , M40N4RAze , M40N4RDxe , M40N4RDye , M40N4RDze , & - M40N4TAxe , M40N4TAye , M40N4TAze , M40N4TDxss , M40N4TDyss , M40N4TDzss , M40N5FKxe , & - M40N5FKye , M40N5FKze , M40N5FMxe , M40N5FMye , M40N5FMze , M40N5MKxe , M40N5MKye , & - M40N5MKze , M40N5MMxe , M40N5MMye , M40N5MMze , M40N5RAxe , M40N5RAye , M40N5RAze , & - M40N5RDxe , M40N5RDye , M40N5RDze , M40N5TAxe , M40N5TAye , M40N5TAze , M40N5TDxss , & - M40N5TDyss , M40N5TDzss , M40N6FKxe , M40N6FKye , M40N6FKze , M40N6FMxe , M40N6FMye , & - M40N6FMze , M40N6MKxe , M40N6MKye , M40N6MKze , M40N6MMxe , M40N6MMye , M40N6MMze , & - M40N6RAxe , M40N6RAye , M40N6RAze , M40N6RDxe , M40N6RDye , M40N6RDze , M40N6TAxe , & - M40N6TAye , M40N6TAze , M40N6TDxss , M40N6TDyss , M40N6TDzss , M40N7FKxe , M40N7FKye , & - M40N7FKze , M40N7FMxe , M40N7FMye , M40N7FMze , M40N7MKxe , M40N7MKye , M40N7MKze , & - M40N7MMxe , M40N7MMye , M40N7MMze , M40N7RAxe , M40N7RAye , M40N7RAze , M40N7RDxe , & - M40N7RDye , M40N7RDze , M40N7TAxe , M40N7TAye , M40N7TAze , M40N7TDxss , M40N7TDyss , & - M40N7TDzss , M40N8FKxe , M40N8FKye , M40N8FKze , M40N8FMxe , M40N8FMye , M40N8FMze , & - M40N8MKxe , M40N8MKye , M40N8MKze , M40N8MMxe , M40N8MMye , M40N8MMze , M40N8RAxe , & - M40N8RAye , M40N8RAze , M40N8RDxe , M40N8RDye , M40N8RDze , M40N8TAxe , M40N8TAye , & - M40N8TAze , M40N8TDxss , M40N8TDyss , M40N8TDzss , M40N9FKxe , M40N9FKye , M40N9FKze , & - M40N9FMxe , M40N9FMye , M40N9FMze , M40N9MKxe , M40N9MKye , M40N9MKze , M40N9MMxe , & - M40N9MMye , M40N9MMze , M40N9RAxe , M40N9RAye , M40N9RAze , M40N9RDxe , M40N9RDye , & - M40N9RDze , M40N9TAxe , M40N9TAye , M40N9TAze , M40N9TDxss , M40N9TDyss , M40N9TDzss , & - M41N1FKxe , M41N1FKye , M41N1FKze , M41N1FMxe , M41N1FMye , M41N1FMze , M41N1MKxe , & - M41N1MKye , M41N1MKze , M41N1MMxe , M41N1MMye , M41N1MMze , M41N1RAxe , M41N1RAye , & - M41N1RAze , M41N1RDxe , M41N1RDye , M41N1RDze , M41N1TAxe , M41N1TAye , M41N1TAze , & - M41N1TDxss , M41N1TDyss , M41N1TDzss , M41N2FKxe , M41N2FKye , M41N2FKze , M41N2FMxe , & - M41N2FMye , M41N2FMze , M41N2MKxe , M41N2MKye , M41N2MKze , M41N2MMxe , M41N2MMye , & - M41N2MMze , M41N2RAxe , M41N2RAye , M41N2RAze , M41N2RDxe , M41N2RDye , M41N2RDze , & - M41N2TAxe , M41N2TAye , M41N2TAze , M41N2TDxss , M41N2TDyss , M41N2TDzss , M41N3FKxe , & - M41N3FKye , M41N3FKze , M41N3FMxe , M41N3FMye , M41N3FMze , M41N3MKxe , M41N3MKye , & - M41N3MKze , M41N3MMxe , M41N3MMye , M41N3MMze , M41N3RAxe , M41N3RAye , M41N3RAze , & - M41N3RDxe , M41N3RDye , M41N3RDze , M41N3TAxe , M41N3TAye , M41N3TAze , M41N3TDxss , & - M41N3TDyss , M41N3TDzss , M41N4FKxe , M41N4FKye , M41N4FKze , M41N4FMxe , M41N4FMye , & - M41N4FMze , M41N4MKxe , M41N4MKye , M41N4MKze , M41N4MMxe , M41N4MMye , M41N4MMze , & - M41N4RAxe , M41N4RAye , M41N4RAze , M41N4RDxe , M41N4RDye , M41N4RDze , M41N4TAxe , & - M41N4TAye , M41N4TAze , M41N4TDxss , M41N4TDyss , M41N4TDzss , M41N5FKxe , M41N5FKye , & - M41N5FKze , M41N5FMxe , M41N5FMye , M41N5FMze , M41N5MKxe , M41N5MKye , M41N5MKze , & - M41N5MMxe , M41N5MMye , M41N5MMze , M41N5RAxe , M41N5RAye , M41N5RAze , M41N5RDxe , & - M41N5RDye , M41N5RDze , M41N5TAxe , M41N5TAye , M41N5TAze , M41N5TDxss , M41N5TDyss , & - M41N5TDzss , M41N6FKxe , M41N6FKye , M41N6FKze , M41N6FMxe , M41N6FMye , M41N6FMze , & - M41N6MKxe , M41N6MKye , M41N6MKze , M41N6MMxe , M41N6MMye , M41N6MMze , M41N6RAxe , & - M41N6RAye , M41N6RAze , M41N6RDxe , M41N6RDye , M41N6RDze , M41N6TAxe , M41N6TAye , & - M41N6TAze , M41N6TDxss , M41N6TDyss , M41N6TDzss , M41N7FKxe , M41N7FKye , M41N7FKze , & - M41N7FMxe , M41N7FMye , M41N7FMze , M41N7MKxe , M41N7MKye , M41N7MKze , M41N7MMxe , & - M41N7MMye , M41N7MMze , M41N7RAxe , M41N7RAye , M41N7RAze , M41N7RDxe , M41N7RDye , & - M41N7RDze , M41N7TAxe , M41N7TAye , M41N7TAze , M41N7TDxss , M41N7TDyss , M41N7TDzss , & - M41N8FKxe , M41N8FKye , M41N8FKze , M41N8FMxe , M41N8FMye , M41N8FMze , M41N8MKxe , & - M41N8MKye , M41N8MKze , M41N8MMxe , M41N8MMye , M41N8MMze , M41N8RAxe , M41N8RAye , & - M41N8RAze , M41N8RDxe , M41N8RDye , M41N8RDze , M41N8TAxe , M41N8TAye , M41N8TAze , & - M41N8TDxss , M41N8TDyss , M41N8TDzss , M41N9FKxe , M41N9FKye , M41N9FKze , M41N9FMxe , & - M41N9FMye , M41N9FMze , M41N9MKxe , M41N9MKye , M41N9MKze , M41N9MMxe , M41N9MMye , & - M41N9MMze , M41N9RAxe , M41N9RAye , M41N9RAze , M41N9RDxe , M41N9RDye , M41N9RDze , & - M41N9TAxe , M41N9TAye , M41N9TAze , M41N9TDxss , M41N9TDyss , M41N9TDzss , M42N1FKxe , & - M42N1FKye , M42N1FKze , M42N1FMxe , M42N1FMye , M42N1FMze , M42N1MKxe , M42N1MKye , & - M42N1MKze , M42N1MMxe , M42N1MMye , M42N1MMze , M42N1RAxe , M42N1RAye , M42N1RAze , & - M42N1RDxe , M42N1RDye , M42N1RDze , M42N1TAxe , M42N1TAye , M42N1TAze , M42N1TDxss , & - M42N1TDyss , M42N1TDzss , M42N2FKxe , M42N2FKye , M42N2FKze , M42N2FMxe , M42N2FMye , & - M42N2FMze , M42N2MKxe , M42N2MKye , M42N2MKze , M42N2MMxe , M42N2MMye , M42N2MMze , & - M42N2RAxe , M42N2RAye , M42N2RAze , M42N2RDxe , M42N2RDye , M42N2RDze , M42N2TAxe , & - M42N2TAye , M42N2TAze , M42N2TDxss , M42N2TDyss , M42N2TDzss , M42N3FKxe , M42N3FKye , & - M42N3FKze , M42N3FMxe , M42N3FMye , M42N3FMze , M42N3MKxe , M42N3MKye , M42N3MKze , & - M42N3MMxe , M42N3MMye , M42N3MMze , M42N3RAxe , M42N3RAye , M42N3RAze , M42N3RDxe , & - M42N3RDye , M42N3RDze , M42N3TAxe , M42N3TAye , M42N3TAze , M42N3TDxss , M42N3TDyss , & - M42N3TDzss , M42N4FKxe , M42N4FKye , M42N4FKze , M42N4FMxe , M42N4FMye , M42N4FMze , & - M42N4MKxe , M42N4MKye , M42N4MKze , M42N4MMxe , M42N4MMye , M42N4MMze , M42N4RAxe , & - M42N4RAye , M42N4RAze , M42N4RDxe , M42N4RDye , M42N4RDze , M42N4TAxe , M42N4TAye , & - M42N4TAze , M42N4TDxss , M42N4TDyss , M42N4TDzss , M42N5FKxe , M42N5FKye , M42N5FKze , & - M42N5FMxe , M42N5FMye , M42N5FMze , M42N5MKxe , M42N5MKye , M42N5MKze , M42N5MMxe , & - M42N5MMye , M42N5MMze , M42N5RAxe , M42N5RAye , M42N5RAze , M42N5RDxe , M42N5RDye , & - M42N5RDze , M42N5TAxe , M42N5TAye , M42N5TAze , M42N5TDxss , M42N5TDyss , M42N5TDzss , & - M42N6FKxe , M42N6FKye , M42N6FKze , M42N6FMxe , M42N6FMye , M42N6FMze , M42N6MKxe , & - M42N6MKye , M42N6MKze , M42N6MMxe , M42N6MMye , M42N6MMze , M42N6RAxe , M42N6RAye , & - M42N6RAze , M42N6RDxe , M42N6RDye , M42N6RDze , M42N6TAxe , M42N6TAye , M42N6TAze , & - M42N6TDxss , M42N6TDyss , M42N6TDzss , M42N7FKxe , M42N7FKye , M42N7FKze , M42N7FMxe , & - M42N7FMye , M42N7FMze , M42N7MKxe , M42N7MKye , M42N7MKze , M42N7MMxe , M42N7MMye , & - M42N7MMze , M42N7RAxe , M42N7RAye , M42N7RAze , M42N7RDxe , M42N7RDye , M42N7RDze , & - M42N7TAxe , M42N7TAye , M42N7TAze , M42N7TDxss , M42N7TDyss , M42N7TDzss , M42N8FKxe , & - M42N8FKye , M42N8FKze , M42N8FMxe , M42N8FMye , M42N8FMze , M42N8MKxe , M42N8MKye , & - M42N8MKze , M42N8MMxe , M42N8MMye , M42N8MMze , M42N8RAxe , M42N8RAye , M42N8RAze , & - M42N8RDxe , M42N8RDye , M42N8RDze , M42N8TAxe , M42N8TAye , M42N8TAze , M42N8TDxss , & - M42N8TDyss , M42N8TDzss , M42N9FKxe , M42N9FKye , M42N9FKze , M42N9FMxe , M42N9FMye , & - M42N9FMze , M42N9MKxe , M42N9MKye , M42N9MKze , M42N9MMxe , M42N9MMye , M42N9MMze , & - M42N9RAxe , M42N9RAye , M42N9RAze , M42N9RDxe , M42N9RDye , M42N9RDze , M42N9TAxe , & - M42N9TAye , M42N9TAze , M42N9TDxss , M42N9TDyss , M42N9TDzss , M43N1FKxe , M43N1FKye , & - M43N1FKze , M43N1FMxe , M43N1FMye , M43N1FMze , M43N1MKxe , M43N1MKye , M43N1MKze , & - M43N1MMxe , M43N1MMye , M43N1MMze , M43N1RAxe , M43N1RAye , M43N1RAze , M43N1RDxe , & - M43N1RDye , M43N1RDze , M43N1TAxe , M43N1TAye , M43N1TAze , M43N1TDxss , M43N1TDyss , & - M43N1TDzss , M43N2FKxe , M43N2FKye , M43N2FKze , M43N2FMxe , M43N2FMye , M43N2FMze , & - M43N2MKxe , M43N2MKye , M43N2MKze , M43N2MMxe , M43N2MMye , M43N2MMze , M43N2RAxe , & - M43N2RAye , M43N2RAze , M43N2RDxe , M43N2RDye , M43N2RDze , M43N2TAxe , M43N2TAye , & - M43N2TAze , M43N2TDxss , M43N2TDyss , M43N2TDzss , M43N3FKxe , M43N3FKye , M43N3FKze , & - M43N3FMxe , M43N3FMye , M43N3FMze , M43N3MKxe , M43N3MKye , M43N3MKze , M43N3MMxe , & - M43N3MMye , M43N3MMze , M43N3RAxe , M43N3RAye , M43N3RAze , M43N3RDxe , M43N3RDye , & - M43N3RDze , M43N3TAxe , M43N3TAye , M43N3TAze , M43N3TDxss , M43N3TDyss , M43N3TDzss , & - M43N4FKxe , M43N4FKye , M43N4FKze , M43N4FMxe , M43N4FMye , M43N4FMze , M43N4MKxe , & - M43N4MKye , M43N4MKze , M43N4MMxe , M43N4MMye , M43N4MMze , M43N4RAxe , M43N4RAye , & - M43N4RAze , M43N4RDxe , M43N4RDye , M43N4RDze , M43N4TAxe , M43N4TAye , M43N4TAze , & - M43N4TDxss , M43N4TDyss , M43N4TDzss , M43N5FKxe , M43N5FKye , M43N5FKze , M43N5FMxe , & - M43N5FMye , M43N5FMze , M43N5MKxe , M43N5MKye , M43N5MKze , M43N5MMxe , M43N5MMye , & - M43N5MMze , M43N5RAxe , M43N5RAye , M43N5RAze , M43N5RDxe , M43N5RDye , M43N5RDze , & - M43N5TAxe , M43N5TAye , M43N5TAze , M43N5TDxss , M43N5TDyss , M43N5TDzss , M43N6FKxe , & - M43N6FKye , M43N6FKze , M43N6FMxe , M43N6FMye , M43N6FMze , M43N6MKxe , M43N6MKye , & - M43N6MKze , M43N6MMxe , M43N6MMye , M43N6MMze , M43N6RAxe , M43N6RAye , M43N6RAze , & - M43N6RDxe , M43N6RDye , M43N6RDze , M43N6TAxe , M43N6TAye , M43N6TAze , M43N6TDxss , & - M43N6TDyss , M43N6TDzss , M43N7FKxe , M43N7FKye , M43N7FKze , M43N7FMxe , M43N7FMye , & - M43N7FMze , M43N7MKxe , M43N7MKye , M43N7MKze , M43N7MMxe , M43N7MMye , M43N7MMze , & - M43N7RAxe , M43N7RAye , M43N7RAze , M43N7RDxe , M43N7RDye , M43N7RDze , M43N7TAxe , & - M43N7TAye , M43N7TAze , M43N7TDxss , M43N7TDyss , M43N7TDzss , M43N8FKxe , M43N8FKye , & - M43N8FKze , M43N8FMxe , M43N8FMye , M43N8FMze , M43N8MKxe , M43N8MKye , M43N8MKze , & - M43N8MMxe , M43N8MMye , M43N8MMze , M43N8RAxe , M43N8RAye , M43N8RAze , M43N8RDxe , & - M43N8RDye , M43N8RDze , M43N8TAxe , M43N8TAye , M43N8TAze , M43N8TDxss , M43N8TDyss , & - M43N8TDzss , M43N9FKxe , M43N9FKye , M43N9FKze , M43N9FMxe , M43N9FMye , M43N9FMze , & - M43N9MKxe , M43N9MKye , M43N9MKze , M43N9MMxe , M43N9MMye , M43N9MMze , M43N9RAxe , & - M43N9RAye , M43N9RAze , M43N9RDxe , M43N9RDye , M43N9RDze , M43N9TAxe , M43N9TAye , & - M43N9TAze , M43N9TDxss , M43N9TDyss , M43N9TDzss , M44N1FKxe , M44N1FKye , M44N1FKze , & - M44N1FMxe , M44N1FMye , M44N1FMze , M44N1MKxe , M44N1MKye , M44N1MKze , M44N1MMxe , & - M44N1MMye , M44N1MMze , M44N1RAxe , M44N1RAye , M44N1RAze , M44N1RDxe , M44N1RDye , & - M44N1RDze , M44N1TAxe , M44N1TAye , M44N1TAze , M44N1TDxss , M44N1TDyss , M44N1TDzss , & - M44N2FKxe , M44N2FKye , M44N2FKze , M44N2FMxe , M44N2FMye , M44N2FMze , M44N2MKxe , & - M44N2MKye , M44N2MKze , M44N2MMxe , M44N2MMye , M44N2MMze , M44N2RAxe , M44N2RAye , & - M44N2RAze , M44N2RDxe , M44N2RDye , M44N2RDze , M44N2TAxe , M44N2TAye , M44N2TAze , & - M44N2TDxss , M44N2TDyss , M44N2TDzss , M44N3FKxe , M44N3FKye , M44N3FKze , M44N3FMxe , & - M44N3FMye , M44N3FMze , M44N3MKxe , M44N3MKye , M44N3MKze , M44N3MMxe , M44N3MMye , & - M44N3MMze , M44N3RAxe , M44N3RAye , M44N3RAze , M44N3RDxe , M44N3RDye , M44N3RDze , & - M44N3TAxe , M44N3TAye , M44N3TAze , M44N3TDxss , M44N3TDyss , M44N3TDzss , M44N4FKxe , & - M44N4FKye , M44N4FKze , M44N4FMxe , M44N4FMye , M44N4FMze , M44N4MKxe , M44N4MKye , & - M44N4MKze , M44N4MMxe , M44N4MMye , M44N4MMze , M44N4RAxe , M44N4RAye , M44N4RAze , & - M44N4RDxe , M44N4RDye , M44N4RDze , M44N4TAxe , M44N4TAye , M44N4TAze , M44N4TDxss , & - M44N4TDyss , M44N4TDzss , M44N5FKxe , M44N5FKye , M44N5FKze , M44N5FMxe , M44N5FMye , & - M44N5FMze , M44N5MKxe , M44N5MKye , M44N5MKze , M44N5MMxe , M44N5MMye , M44N5MMze , & - M44N5RAxe , M44N5RAye , M44N5RAze , M44N5RDxe , M44N5RDye , M44N5RDze , M44N5TAxe , & - M44N5TAye , M44N5TAze , M44N5TDxss , M44N5TDyss , M44N5TDzss , M44N6FKxe , M44N6FKye , & - M44N6FKze , M44N6FMxe , M44N6FMye , M44N6FMze , M44N6MKxe , M44N6MKye , M44N6MKze , & - M44N6MMxe , M44N6MMye , M44N6MMze , M44N6RAxe , M44N6RAye , M44N6RAze , M44N6RDxe , & - M44N6RDye , M44N6RDze , M44N6TAxe , M44N6TAye , M44N6TAze , M44N6TDxss , M44N6TDyss , & - M44N6TDzss , M44N7FKxe , M44N7FKye , M44N7FKze , M44N7FMxe , M44N7FMye , M44N7FMze , & - M44N7MKxe , M44N7MKye , M44N7MKze , M44N7MMxe , M44N7MMye , M44N7MMze , M44N7RAxe , & - M44N7RAye , M44N7RAze , M44N7RDxe , M44N7RDye , M44N7RDze , M44N7TAxe , M44N7TAye , & - M44N7TAze , M44N7TDxss , M44N7TDyss , M44N7TDzss , M44N8FKxe , M44N8FKye , M44N8FKze , & - M44N8FMxe , M44N8FMye , M44N8FMze , M44N8MKxe , M44N8MKye , M44N8MKze , M44N8MMxe , & - M44N8MMye , M44N8MMze , M44N8RAxe , M44N8RAye , M44N8RAze , M44N8RDxe , M44N8RDye , & - M44N8RDze , M44N8TAxe , M44N8TAye , M44N8TAze , M44N8TDxss , M44N8TDyss , M44N8TDzss , & - M44N9FKxe , M44N9FKye , M44N9FKze , M44N9FMxe , M44N9FMye , M44N9FMze , M44N9MKxe , & - M44N9MKye , M44N9MKze , M44N9MMxe , M44N9MMye , M44N9MMze , M44N9RAxe , M44N9RAye , & - M44N9RAze , M44N9RDxe , M44N9RDye , M44N9RDze , M44N9TAxe , M44N9TAye , M44N9TAze , & - M44N9TDxss , M44N9TDyss , M44N9TDzss , M45N1FKxe , M45N1FKye , M45N1FKze , M45N1FMxe , & - M45N1FMye , M45N1FMze , M45N1MKxe , M45N1MKye , M45N1MKze , M45N1MMxe , M45N1MMye , & - M45N1MMze , M45N1RAxe , M45N1RAye , M45N1RAze , M45N1RDxe , M45N1RDye , M45N1RDze , & - M45N1TAxe , M45N1TAye , M45N1TAze , M45N1TDxss , M45N1TDyss , M45N1TDzss , M45N2FKxe , & - M45N2FKye , M45N2FKze , M45N2FMxe , M45N2FMye , M45N2FMze , M45N2MKxe , M45N2MKye , & - M45N2MKze , M45N2MMxe , M45N2MMye , M45N2MMze , M45N2RAxe , M45N2RAye , M45N2RAze , & - M45N2RDxe , M45N2RDye , M45N2RDze , M45N2TAxe , M45N2TAye , M45N2TAze , M45N2TDxss , & - M45N2TDyss , M45N2TDzss , M45N3FKxe , M45N3FKye , M45N3FKze , M45N3FMxe , M45N3FMye , & - M45N3FMze , M45N3MKxe , M45N3MKye , M45N3MKze , M45N3MMxe , M45N3MMye , M45N3MMze , & - M45N3RAxe , M45N3RAye , M45N3RAze , M45N3RDxe , M45N3RDye , M45N3RDze , M45N3TAxe , & - M45N3TAye , M45N3TAze , M45N3TDxss , M45N3TDyss , M45N3TDzss , M45N4FKxe , M45N4FKye , & - M45N4FKze , M45N4FMxe , M45N4FMye , M45N4FMze , M45N4MKxe , M45N4MKye , M45N4MKze , & - M45N4MMxe , M45N4MMye , M45N4MMze , M45N4RAxe , M45N4RAye , M45N4RAze , M45N4RDxe , & - M45N4RDye , M45N4RDze , M45N4TAxe , M45N4TAye , M45N4TAze , M45N4TDxss , M45N4TDyss , & - M45N4TDzss , M45N5FKxe , M45N5FKye , M45N5FKze , M45N5FMxe , M45N5FMye , M45N5FMze , & - M45N5MKxe , M45N5MKye , M45N5MKze , M45N5MMxe , M45N5MMye , M45N5MMze , M45N5RAxe , & - M45N5RAye , M45N5RAze , M45N5RDxe , M45N5RDye , M45N5RDze , M45N5TAxe , M45N5TAye , & - M45N5TAze , M45N5TDxss , M45N5TDyss , M45N5TDzss , M45N6FKxe , M45N6FKye , M45N6FKze , & - M45N6FMxe , M45N6FMye , M45N6FMze , M45N6MKxe , M45N6MKye , M45N6MKze , M45N6MMxe , & - M45N6MMye , M45N6MMze , M45N6RAxe , M45N6RAye , M45N6RAze , M45N6RDxe , M45N6RDye , & - M45N6RDze , M45N6TAxe , M45N6TAye , M45N6TAze , M45N6TDxss , M45N6TDyss , M45N6TDzss , & - M45N7FKxe , M45N7FKye , M45N7FKze , M45N7FMxe , M45N7FMye , M45N7FMze , M45N7MKxe , & - M45N7MKye , M45N7MKze , M45N7MMxe , M45N7MMye , M45N7MMze , M45N7RAxe , M45N7RAye , & - M45N7RAze , M45N7RDxe , M45N7RDye , M45N7RDze , M45N7TAxe , M45N7TAye , M45N7TAze , & - M45N7TDxss , M45N7TDyss , M45N7TDzss , M45N8FKxe , M45N8FKye , M45N8FKze , M45N8FMxe , & - M45N8FMye , M45N8FMze , M45N8MKxe , M45N8MKye , M45N8MKze , M45N8MMxe , M45N8MMye , & - M45N8MMze , M45N8RAxe , M45N8RAye , M45N8RAze , M45N8RDxe , M45N8RDye , M45N8RDze , & - M45N8TAxe , M45N8TAye , M45N8TAze , M45N8TDxss , M45N8TDyss , M45N8TDzss , M45N9FKxe , & - M45N9FKye , M45N9FKze , M45N9FMxe , M45N9FMye , M45N9FMze , M45N9MKxe , M45N9MKye , & - M45N9MKze , M45N9MMxe , M45N9MMye , M45N9MMze , M45N9RAxe , M45N9RAye , M45N9RAze , & - M45N9RDxe , M45N9RDye , M45N9RDze , M45N9TAxe , M45N9TAye , M45N9TAze , M45N9TDxss , & - M45N9TDyss , M45N9TDzss , M46N1FKxe , M46N1FKye , M46N1FKze , M46N1FMxe , M46N1FMye , & - M46N1FMze , M46N1MKxe , M46N1MKye , M46N1MKze , M46N1MMxe , M46N1MMye , M46N1MMze , & - M46N1RAxe , M46N1RAye , M46N1RAze , M46N1RDxe , M46N1RDye , M46N1RDze , M46N1TAxe , & - M46N1TAye , M46N1TAze , M46N1TDxss , M46N1TDyss , M46N1TDzss , M46N2FKxe , M46N2FKye , & - M46N2FKze , M46N2FMxe , M46N2FMye , M46N2FMze , M46N2MKxe , M46N2MKye , M46N2MKze , & - M46N2MMxe , M46N2MMye , M46N2MMze , M46N2RAxe , M46N2RAye , M46N2RAze , M46N2RDxe , & - M46N2RDye , M46N2RDze , M46N2TAxe , M46N2TAye , M46N2TAze , M46N2TDxss , M46N2TDyss , & - M46N2TDzss , M46N3FKxe , M46N3FKye , M46N3FKze , M46N3FMxe , M46N3FMye , M46N3FMze , & - M46N3MKxe , M46N3MKye , M46N3MKze , M46N3MMxe , M46N3MMye , M46N3MMze , M46N3RAxe , & - M46N3RAye , M46N3RAze , M46N3RDxe , M46N3RDye , M46N3RDze , M46N3TAxe , M46N3TAye , & - M46N3TAze , M46N3TDxss , M46N3TDyss , M46N3TDzss , M46N4FKxe , M46N4FKye , M46N4FKze , & - M46N4FMxe , M46N4FMye , M46N4FMze , M46N4MKxe , M46N4MKye , M46N4MKze , M46N4MMxe , & - M46N4MMye , M46N4MMze , M46N4RAxe , M46N4RAye , M46N4RAze , M46N4RDxe , M46N4RDye , & - M46N4RDze , M46N4TAxe , M46N4TAye , M46N4TAze , M46N4TDxss , M46N4TDyss , M46N4TDzss , & - M46N5FKxe , M46N5FKye , M46N5FKze , M46N5FMxe , M46N5FMye , M46N5FMze , M46N5MKxe , & - M46N5MKye , M46N5MKze , M46N5MMxe , M46N5MMye , M46N5MMze , M46N5RAxe , M46N5RAye , & - M46N5RAze , M46N5RDxe , M46N5RDye , M46N5RDze , M46N5TAxe , M46N5TAye , M46N5TAze , & - M46N5TDxss , M46N5TDyss , M46N5TDzss , M46N6FKxe , M46N6FKye , M46N6FKze , M46N6FMxe , & - M46N6FMye , M46N6FMze , M46N6MKxe , M46N6MKye , M46N6MKze , M46N6MMxe , M46N6MMye , & - M46N6MMze , M46N6RAxe , M46N6RAye , M46N6RAze , M46N6RDxe , M46N6RDye , M46N6RDze , & - M46N6TAxe , M46N6TAye , M46N6TAze , M46N6TDxss , M46N6TDyss , M46N6TDzss , M46N7FKxe , & - M46N7FKye , M46N7FKze , M46N7FMxe , M46N7FMye , M46N7FMze , M46N7MKxe , M46N7MKye , & - M46N7MKze , M46N7MMxe , M46N7MMye , M46N7MMze , M46N7RAxe , M46N7RAye , M46N7RAze , & - M46N7RDxe , M46N7RDye , M46N7RDze , M46N7TAxe , M46N7TAye , M46N7TAze , M46N7TDxss , & - M46N7TDyss , M46N7TDzss , M46N8FKxe , M46N8FKye , M46N8FKze , M46N8FMxe , M46N8FMye , & - M46N8FMze , M46N8MKxe , M46N8MKye , M46N8MKze , M46N8MMxe , M46N8MMye , M46N8MMze , & - M46N8RAxe , M46N8RAye , M46N8RAze , M46N8RDxe , M46N8RDye , M46N8RDze , M46N8TAxe , & - M46N8TAye , M46N8TAze , M46N8TDxss , M46N8TDyss , M46N8TDzss , M46N9FKxe , M46N9FKye , & - M46N9FKze , M46N9FMxe , M46N9FMye , M46N9FMze , M46N9MKxe , M46N9MKye , M46N9MKze , & - M46N9MMxe , M46N9MMye , M46N9MMze , M46N9RAxe , M46N9RAye , M46N9RAze , M46N9RDxe , & - M46N9RDye , M46N9RDze , M46N9TAxe , M46N9TAye , M46N9TAze , M46N9TDxss , M46N9TDyss , & - M46N9TDzss , M47N1FKxe , M47N1FKye , M47N1FKze , M47N1FMxe , M47N1FMye , M47N1FMze , & - M47N1MKxe , M47N1MKye , M47N1MKze , M47N1MMxe , M47N1MMye , M47N1MMze , M47N1RAxe , & - M47N1RAye , M47N1RAze , M47N1RDxe , M47N1RDye , M47N1RDze , M47N1TAxe , M47N1TAye , & - M47N1TAze , M47N1TDxss , M47N1TDyss , M47N1TDzss , M47N2FKxe , M47N2FKye , M47N2FKze , & - M47N2FMxe , M47N2FMye , M47N2FMze , M47N2MKxe , M47N2MKye , M47N2MKze , M47N2MMxe , & - M47N2MMye , M47N2MMze , M47N2RAxe , M47N2RAye , M47N2RAze , M47N2RDxe , M47N2RDye , & - M47N2RDze , M47N2TAxe , M47N2TAye , M47N2TAze , M47N2TDxss , M47N2TDyss , M47N2TDzss , & - M47N3FKxe , M47N3FKye , M47N3FKze , M47N3FMxe , M47N3FMye , M47N3FMze , M47N3MKxe , & - M47N3MKye , M47N3MKze , M47N3MMxe , M47N3MMye , M47N3MMze , M47N3RAxe , M47N3RAye , & - M47N3RAze , M47N3RDxe , M47N3RDye , M47N3RDze /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry7(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M47N3TAxe , M47N3TAye , M47N3TAze , M47N3TDxss , M47N3TDyss , M47N3TDzss , M47N4FKxe , & - M47N4FKye , M47N4FKze , M47N4FMxe , M47N4FMye , M47N4FMze , M47N4MKxe , M47N4MKye , & - M47N4MKze , M47N4MMxe , M47N4MMye , M47N4MMze , M47N4RAxe , M47N4RAye , M47N4RAze , & - M47N4RDxe , M47N4RDye , M47N4RDze , M47N4TAxe , M47N4TAye , M47N4TAze , M47N4TDxss , & - M47N4TDyss , M47N4TDzss , M47N5FKxe , M47N5FKye , M47N5FKze , M47N5FMxe , M47N5FMye , & - M47N5FMze , M47N5MKxe , M47N5MKye , M47N5MKze , M47N5MMxe , M47N5MMye , M47N5MMze , & - M47N5RAxe , M47N5RAye , M47N5RAze , M47N5RDxe , M47N5RDye , M47N5RDze , M47N5TAxe , & - M47N5TAye , M47N5TAze , M47N5TDxss , M47N5TDyss , M47N5TDzss , M47N6FKxe , M47N6FKye , & - M47N6FKze , M47N6FMxe , M47N6FMye , M47N6FMze , M47N6MKxe , M47N6MKye , M47N6MKze , & - M47N6MMxe , M47N6MMye , M47N6MMze , M47N6RAxe , M47N6RAye , M47N6RAze , M47N6RDxe , & - M47N6RDye , M47N6RDze , M47N6TAxe , M47N6TAye , M47N6TAze , M47N6TDxss , M47N6TDyss , & - M47N6TDzss , M47N7FKxe , M47N7FKye , M47N7FKze , M47N7FMxe , M47N7FMye , M47N7FMze , & - M47N7MKxe , M47N7MKye , M47N7MKze , M47N7MMxe , M47N7MMye , M47N7MMze , M47N7RAxe , & - M47N7RAye , M47N7RAze , M47N7RDxe , M47N7RDye , M47N7RDze , M47N7TAxe , M47N7TAye , & - M47N7TAze , M47N7TDxss , M47N7TDyss , M47N7TDzss , M47N8FKxe , M47N8FKye , M47N8FKze , & - M47N8FMxe , M47N8FMye , M47N8FMze , M47N8MKxe , M47N8MKye , M47N8MKze , M47N8MMxe , & - M47N8MMye , M47N8MMze , M47N8RAxe , M47N8RAye , M47N8RAze , M47N8RDxe , M47N8RDye , & - M47N8RDze , M47N8TAxe , M47N8TAye , M47N8TAze , M47N8TDxss , M47N8TDyss , M47N8TDzss , & - M47N9FKxe , M47N9FKye , M47N9FKze , M47N9FMxe , M47N9FMye , M47N9FMze , M47N9MKxe , & - M47N9MKye , M47N9MKze , M47N9MMxe , M47N9MMye , M47N9MMze , M47N9RAxe , M47N9RAye , & - M47N9RAze , M47N9RDxe , M47N9RDye , M47N9RDze , M47N9TAxe , M47N9TAye , M47N9TAze , & - M47N9TDxss , M47N9TDyss , M47N9TDzss , M48N1FKxe , M48N1FKye , M48N1FKze , M48N1FMxe , & - M48N1FMye , M48N1FMze , M48N1MKxe , M48N1MKye , M48N1MKze , M48N1MMxe , M48N1MMye , & - M48N1MMze , M48N1RAxe , M48N1RAye , M48N1RAze , M48N1RDxe , M48N1RDye , M48N1RDze , & - M48N1TAxe , M48N1TAye , M48N1TAze , M48N1TDxss , M48N1TDyss , M48N1TDzss , M48N2FKxe , & - M48N2FKye , M48N2FKze , M48N2FMxe , M48N2FMye , M48N2FMze , M48N2MKxe , M48N2MKye , & - M48N2MKze , M48N2MMxe , M48N2MMye , M48N2MMze , M48N2RAxe , M48N2RAye , M48N2RAze , & - M48N2RDxe , M48N2RDye , M48N2RDze , M48N2TAxe , M48N2TAye , M48N2TAze , M48N2TDxss , & - M48N2TDyss , M48N2TDzss , M48N3FKxe , M48N3FKye , M48N3FKze , M48N3FMxe , M48N3FMye , & - M48N3FMze , M48N3MKxe , M48N3MKye , M48N3MKze , M48N3MMxe , M48N3MMye , M48N3MMze , & - M48N3RAxe , M48N3RAye , M48N3RAze , M48N3RDxe , M48N3RDye , M48N3RDze , M48N3TAxe , & - M48N3TAye , M48N3TAze , M48N3TDxss , M48N3TDyss , M48N3TDzss , M48N4FKxe , M48N4FKye , & - M48N4FKze , M48N4FMxe , M48N4FMye , M48N4FMze , M48N4MKxe , M48N4MKye , M48N4MKze , & - M48N4MMxe , M48N4MMye , M48N4MMze , M48N4RAxe , M48N4RAye , M48N4RAze , M48N4RDxe , & - M48N4RDye , M48N4RDze , M48N4TAxe , M48N4TAye , M48N4TAze , M48N4TDxss , M48N4TDyss , & - M48N4TDzss , M48N5FKxe , M48N5FKye , M48N5FKze , M48N5FMxe , M48N5FMye , M48N5FMze , & - M48N5MKxe , M48N5MKye , M48N5MKze , M48N5MMxe , M48N5MMye , M48N5MMze , M48N5RAxe , & - M48N5RAye , M48N5RAze , M48N5RDxe , M48N5RDye , M48N5RDze , M48N5TAxe , M48N5TAye , & - M48N5TAze , M48N5TDxss , M48N5TDyss , M48N5TDzss , M48N6FKxe , M48N6FKye , M48N6FKze , & - M48N6FMxe , M48N6FMye , M48N6FMze , M48N6MKxe , M48N6MKye , M48N6MKze , M48N6MMxe , & - M48N6MMye , M48N6MMze , M48N6RAxe , M48N6RAye , M48N6RAze , M48N6RDxe , M48N6RDye , & - M48N6RDze , M48N6TAxe , M48N6TAye , M48N6TAze , M48N6TDxss , M48N6TDyss , M48N6TDzss , & - M48N7FKxe , M48N7FKye , M48N7FKze , M48N7FMxe , M48N7FMye , M48N7FMze , M48N7MKxe , & - M48N7MKye , M48N7MKze , M48N7MMxe , M48N7MMye , M48N7MMze , M48N7RAxe , M48N7RAye , & - M48N7RAze , M48N7RDxe , M48N7RDye , M48N7RDze , M48N7TAxe , M48N7TAye , M48N7TAze , & - M48N7TDxss , M48N7TDyss , M48N7TDzss , M48N8FKxe , M48N8FKye , M48N8FKze , M48N8FMxe , & - M48N8FMye , M48N8FMze , M48N8MKxe , M48N8MKye , M48N8MKze , M48N8MMxe , M48N8MMye , & - M48N8MMze , M48N8RAxe , M48N8RAye , M48N8RAze , M48N8RDxe , M48N8RDye , M48N8RDze , & - M48N8TAxe , M48N8TAye , M48N8TAze , M48N8TDxss , M48N8TDyss , M48N8TDzss , M48N9FKxe , & - M48N9FKye , M48N9FKze , M48N9FMxe , M48N9FMye , M48N9FMze , M48N9MKxe , M48N9MKye , & - M48N9MKze , M48N9MMxe , M48N9MMye , M48N9MMze , M48N9RAxe , M48N9RAye , M48N9RAze , & - M48N9RDxe , M48N9RDye , M48N9RDze , M48N9TAxe , M48N9TAye , M48N9TAze , M48N9TDxss , & - M48N9TDyss , M48N9TDzss , M49N1FKxe , M49N1FKye , M49N1FKze , M49N1FMxe , M49N1FMye , & - M49N1FMze , M49N1MKxe , M49N1MKye , M49N1MKze , M49N1MMxe , M49N1MMye , M49N1MMze , & - M49N1RAxe , M49N1RAye , M49N1RAze , M49N1RDxe , M49N1RDye , M49N1RDze , M49N1TAxe , & - M49N1TAye , M49N1TAze , M49N1TDxss , M49N1TDyss , M49N1TDzss , M49N2FKxe , M49N2FKye , & - M49N2FKze , M49N2FMxe , M49N2FMye , M49N2FMze , M49N2MKxe , M49N2MKye , M49N2MKze , & - M49N2MMxe , M49N2MMye , M49N2MMze , M49N2RAxe , M49N2RAye , M49N2RAze , M49N2RDxe , & - M49N2RDye , M49N2RDze , M49N2TAxe , M49N2TAye , M49N2TAze , M49N2TDxss , M49N2TDyss , & - M49N2TDzss , M49N3FKxe , M49N3FKye , M49N3FKze , M49N3FMxe , M49N3FMye , M49N3FMze , & - M49N3MKxe , M49N3MKye , M49N3MKze , M49N3MMxe , M49N3MMye , M49N3MMze , M49N3RAxe , & - M49N3RAye , M49N3RAze , M49N3RDxe , M49N3RDye , M49N3RDze , M49N3TAxe , M49N3TAye , & - M49N3TAze , M49N3TDxss , M49N3TDyss , M49N3TDzss , M49N4FKxe , M49N4FKye , M49N4FKze , & - M49N4FMxe , M49N4FMye , M49N4FMze , M49N4MKxe , M49N4MKye , M49N4MKze , M49N4MMxe , & - M49N4MMye , M49N4MMze , M49N4RAxe , M49N4RAye , M49N4RAze , M49N4RDxe , M49N4RDye , & - M49N4RDze , M49N4TAxe , M49N4TAye , M49N4TAze , M49N4TDxss , M49N4TDyss , M49N4TDzss , & - M49N5FKxe , M49N5FKye , M49N5FKze , M49N5FMxe , M49N5FMye , M49N5FMze , M49N5MKxe , & - M49N5MKye , M49N5MKze , M49N5MMxe , M49N5MMye , M49N5MMze , M49N5RAxe , M49N5RAye , & - M49N5RAze , M49N5RDxe , M49N5RDye , M49N5RDze , M49N5TAxe , M49N5TAye , M49N5TAze , & - M49N5TDxss , M49N5TDyss , M49N5TDzss , M49N6FKxe , M49N6FKye , M49N6FKze , M49N6FMxe , & - M49N6FMye , M49N6FMze , M49N6MKxe , M49N6MKye , M49N6MKze , M49N6MMxe , M49N6MMye , & - M49N6MMze , M49N6RAxe , M49N6RAye , M49N6RAze , M49N6RDxe , M49N6RDye , M49N6RDze , & - M49N6TAxe , M49N6TAye , M49N6TAze , M49N6TDxss , M49N6TDyss , M49N6TDzss , M49N7FKxe , & - M49N7FKye , M49N7FKze , M49N7FMxe , M49N7FMye , M49N7FMze , M49N7MKxe , M49N7MKye , & - M49N7MKze , M49N7MMxe , M49N7MMye , M49N7MMze , M49N7RAxe , M49N7RAye , M49N7RAze , & - M49N7RDxe , M49N7RDye , M49N7RDze , M49N7TAxe , M49N7TAye , M49N7TAze , M49N7TDxss , & - M49N7TDyss , M49N7TDzss , M49N8FKxe , M49N8FKye , M49N8FKze , M49N8FMxe , M49N8FMye , & - M49N8FMze , M49N8MKxe , M49N8MKye , M49N8MKze , M49N8MMxe , M49N8MMye , M49N8MMze , & - M49N8RAxe , M49N8RAye , M49N8RAze , M49N8RDxe , M49N8RDye , M49N8RDze , M49N8TAxe , & - M49N8TAye , M49N8TAze , M49N8TDxss , M49N8TDyss , M49N8TDzss , M49N9FKxe , M49N9FKye , & - M49N9FKze , M49N9FMxe , M49N9FMye , M49N9FMze , M49N9MKxe , M49N9MKye , M49N9MKze , & - M49N9MMxe , M49N9MMye , M49N9MMze , M49N9RAxe , M49N9RAye , M49N9RAze , M49N9RDxe , & - M49N9RDye , M49N9RDze , M49N9TAxe , M49N9TAye , M49N9TAze , M49N9TDxss , M49N9TDyss , & - M49N9TDzss , M50N1FKxe , M50N1FKye , M50N1FKze , M50N1FMxe , M50N1FMye , M50N1FMze , & - M50N1MKxe , M50N1MKye , M50N1MKze , M50N1MMxe , M50N1MMye , M50N1MMze , M50N1RAxe , & - M50N1RAye , M50N1RAze , M50N1RDxe , M50N1RDye , M50N1RDze , M50N1TAxe , M50N1TAye , & - M50N1TAze , M50N1TDxss , M50N1TDyss , M50N1TDzss , M50N2FKxe , M50N2FKye , M50N2FKze , & - M50N2FMxe , M50N2FMye , M50N2FMze , M50N2MKxe , M50N2MKye , M50N2MKze , M50N2MMxe , & - M50N2MMye , M50N2MMze , M50N2RAxe , M50N2RAye , M50N2RAze , M50N2RDxe , M50N2RDye , & - M50N2RDze , M50N2TAxe , M50N2TAye , M50N2TAze , M50N2TDxss , M50N2TDyss , M50N2TDzss , & - M50N3FKxe , M50N3FKye , M50N3FKze , M50N3FMxe , M50N3FMye , M50N3FMze , M50N3MKxe , & - M50N3MKye , M50N3MKze , M50N3MMxe , M50N3MMye , M50N3MMze , M50N3RAxe , M50N3RAye , & - M50N3RAze , M50N3RDxe , M50N3RDye , M50N3RDze , M50N3TAxe , M50N3TAye , M50N3TAze , & - M50N3TDxss , M50N3TDyss , M50N3TDzss , M50N4FKxe , M50N4FKye , M50N4FKze , M50N4FMxe , & - M50N4FMye , M50N4FMze , M50N4MKxe , M50N4MKye , M50N4MKze , M50N4MMxe , M50N4MMye , & - M50N4MMze , M50N4RAxe , M50N4RAye , M50N4RAze , M50N4RDxe , M50N4RDye , M50N4RDze , & - M50N4TAxe , M50N4TAye , M50N4TAze , M50N4TDxss , M50N4TDyss , M50N4TDzss , M50N5FKxe , & - M50N5FKye , M50N5FKze , M50N5FMxe , M50N5FMye , M50N5FMze , M50N5MKxe , M50N5MKye , & - M50N5MKze , M50N5MMxe , M50N5MMye , M50N5MMze , M50N5RAxe , M50N5RAye , M50N5RAze , & - M50N5RDxe , M50N5RDye , M50N5RDze , M50N5TAxe , M50N5TAye , M50N5TAze , M50N5TDxss , & - M50N5TDyss , M50N5TDzss , M50N6FKxe , M50N6FKye , M50N6FKze , M50N6FMxe , M50N6FMye , & - M50N6FMze , M50N6MKxe , M50N6MKye , M50N6MKze , M50N6MMxe , M50N6MMye , M50N6MMze , & - M50N6RAxe , M50N6RAye , M50N6RAze , M50N6RDxe , M50N6RDye , M50N6RDze , M50N6TAxe , & - M50N6TAye , M50N6TAze , M50N6TDxss , M50N6TDyss , M50N6TDzss , M50N7FKxe , M50N7FKye , & - M50N7FKze , M50N7FMxe , M50N7FMye , M50N7FMze , M50N7MKxe , M50N7MKye , M50N7MKze , & - M50N7MMxe , M50N7MMye , M50N7MMze , M50N7RAxe , M50N7RAye , M50N7RAze , M50N7RDxe , & - M50N7RDye , M50N7RDze , M50N7TAxe , M50N7TAye , M50N7TAze , M50N7TDxss , M50N7TDyss , & - M50N7TDzss , M50N8FKxe , M50N8FKye , M50N8FKze , M50N8FMxe , M50N8FMye , M50N8FMze , & - M50N8MKxe , M50N8MKye , M50N8MKze , M50N8MMxe , M50N8MMye , M50N8MMze , M50N8RAxe , & - M50N8RAye , M50N8RAze , M50N8RDxe , M50N8RDye , M50N8RDze , M50N8TAxe , M50N8TAye , & - M50N8TAze , M50N8TDxss , M50N8TDyss , M50N8TDzss , M50N9FKxe , M50N9FKye , M50N9FKze , & - M50N9FMxe , M50N9FMye , M50N9FMze , M50N9MKxe , M50N9MKye , M50N9MKze , M50N9MMxe , & - M50N9MMye , M50N9MMze , M50N9RAxe , M50N9RAye , M50N9RAze , M50N9RDxe , M50N9RDye , & - M50N9RDze , M50N9TAxe , M50N9TAye , M50N9TAze , M50N9TDxss , M50N9TDyss , M50N9TDzss , & - M51N1FKxe , M51N1FKye , M51N1FKze , M51N1FMxe , M51N1FMye , M51N1FMze , M51N1MKxe , & - M51N1MKye , M51N1MKze , M51N1MMxe , M51N1MMye , M51N1MMze , M51N1RAxe , M51N1RAye , & - M51N1RAze , M51N1RDxe , M51N1RDye , M51N1RDze , M51N1TAxe , M51N1TAye , M51N1TAze , & - M51N1TDxss , M51N1TDyss , M51N1TDzss , M51N2FKxe , M51N2FKye , M51N2FKze , M51N2FMxe , & - M51N2FMye , M51N2FMze , M51N2MKxe , M51N2MKye , M51N2MKze , M51N2MMxe , M51N2MMye , & - M51N2MMze , M51N2RAxe , M51N2RAye , M51N2RAze , M51N2RDxe , M51N2RDye , M51N2RDze , & - M51N2TAxe , M51N2TAye , M51N2TAze , M51N2TDxss , M51N2TDyss , M51N2TDzss , M51N3FKxe , & - M51N3FKye , M51N3FKze , M51N3FMxe , M51N3FMye , M51N3FMze , M51N3MKxe , M51N3MKye , & - M51N3MKze , M51N3MMxe , M51N3MMye , M51N3MMze , M51N3RAxe , M51N3RAye , M51N3RAze , & - M51N3RDxe , M51N3RDye , M51N3RDze , M51N3TAxe , M51N3TAye , M51N3TAze , M51N3TDxss , & - M51N3TDyss , M51N3TDzss , M51N4FKxe , M51N4FKye , M51N4FKze , M51N4FMxe , M51N4FMye , & - M51N4FMze , M51N4MKxe , M51N4MKye , M51N4MKze , M51N4MMxe , M51N4MMye , M51N4MMze , & - M51N4RAxe , M51N4RAye , M51N4RAze , M51N4RDxe , M51N4RDye , M51N4RDze , M51N4TAxe , & - M51N4TAye , M51N4TAze , M51N4TDxss , M51N4TDyss , M51N4TDzss , M51N5FKxe , M51N5FKye , & - M51N5FKze , M51N5FMxe , M51N5FMye , M51N5FMze , M51N5MKxe , M51N5MKye , M51N5MKze , & - M51N5MMxe , M51N5MMye , M51N5MMze , M51N5RAxe , M51N5RAye , M51N5RAze , M51N5RDxe , & - M51N5RDye , M51N5RDze , M51N5TAxe , M51N5TAye , M51N5TAze , M51N5TDxss , M51N5TDyss , & - M51N5TDzss , M51N6FKxe , M51N6FKye , M51N6FKze , M51N6FMxe , M51N6FMye , M51N6FMze , & - M51N6MKxe , M51N6MKye , M51N6MKze , M51N6MMxe , M51N6MMye , M51N6MMze , M51N6RAxe , & - M51N6RAye , M51N6RAze , M51N6RDxe , M51N6RDye , M51N6RDze , M51N6TAxe , M51N6TAye , & - M51N6TAze , M51N6TDxss , M51N6TDyss , M51N6TDzss , M51N7FKxe , M51N7FKye , M51N7FKze , & - M51N7FMxe , M51N7FMye , M51N7FMze , M51N7MKxe , M51N7MKye , M51N7MKze , M51N7MMxe , & - M51N7MMye , M51N7MMze , M51N7RAxe , M51N7RAye , M51N7RAze , M51N7RDxe , M51N7RDye , & - M51N7RDze , M51N7TAxe , M51N7TAye , M51N7TAze , M51N7TDxss , M51N7TDyss , M51N7TDzss , & - M51N8FKxe , M51N8FKye , M51N8FKze , M51N8FMxe , M51N8FMye , M51N8FMze , M51N8MKxe , & - M51N8MKye , M51N8MKze , M51N8MMxe , M51N8MMye , M51N8MMze , M51N8RAxe , M51N8RAye , & - M51N8RAze , M51N8RDxe , M51N8RDye , M51N8RDze , M51N8TAxe , M51N8TAye , M51N8TAze , & - M51N8TDxss , M51N8TDyss , M51N8TDzss , M51N9FKxe , M51N9FKye , M51N9FKze , M51N9FMxe , & - M51N9FMye , M51N9FMze , M51N9MKxe , M51N9MKye , M51N9MKze , M51N9MMxe , M51N9MMye , & - M51N9MMze , M51N9RAxe , M51N9RAye , M51N9RAze , M51N9RDxe , M51N9RDye , M51N9RDze , & - M51N9TAxe , M51N9TAye , M51N9TAze , M51N9TDxss , M51N9TDyss , M51N9TDzss , M52N1FKxe , & - M52N1FKye , M52N1FKze , M52N1FMxe , M52N1FMye , M52N1FMze , M52N1MKxe , M52N1MKye , & - M52N1MKze , M52N1MMxe , M52N1MMye , M52N1MMze , M52N1RAxe , M52N1RAye , M52N1RAze , & - M52N1RDxe , M52N1RDye , M52N1RDze , M52N1TAxe , M52N1TAye , M52N1TAze , M52N1TDxss , & - M52N1TDyss , M52N1TDzss , M52N2FKxe , M52N2FKye , M52N2FKze , M52N2FMxe , M52N2FMye , & - M52N2FMze , M52N2MKxe , M52N2MKye , M52N2MKze , M52N2MMxe , M52N2MMye , M52N2MMze , & - M52N2RAxe , M52N2RAye , M52N2RAze , M52N2RDxe , M52N2RDye , M52N2RDze , M52N2TAxe , & - M52N2TAye , M52N2TAze , M52N2TDxss , M52N2TDyss , M52N2TDzss , M52N3FKxe , M52N3FKye , & - M52N3FKze , M52N3FMxe , M52N3FMye , M52N3FMze , M52N3MKxe , M52N3MKye , M52N3MKze , & - M52N3MMxe , M52N3MMye , M52N3MMze , M52N3RAxe , M52N3RAye , M52N3RAze , M52N3RDxe , & - M52N3RDye , M52N3RDze , M52N3TAxe , M52N3TAye , M52N3TAze , M52N3TDxss , M52N3TDyss , & - M52N3TDzss , M52N4FKxe , M52N4FKye , M52N4FKze , M52N4FMxe , M52N4FMye , M52N4FMze , & - M52N4MKxe , M52N4MKye , M52N4MKze , M52N4MMxe , M52N4MMye , M52N4MMze , M52N4RAxe , & - M52N4RAye , M52N4RAze , M52N4RDxe , M52N4RDye , M52N4RDze , M52N4TAxe , M52N4TAye , & - M52N4TAze , M52N4TDxss , M52N4TDyss , M52N4TDzss , M52N5FKxe , M52N5FKye , M52N5FKze , & - M52N5FMxe , M52N5FMye , M52N5FMze , M52N5MKxe , M52N5MKye , M52N5MKze , M52N5MMxe , & - M52N5MMye , M52N5MMze , M52N5RAxe , M52N5RAye , M52N5RAze , M52N5RDxe , M52N5RDye , & - M52N5RDze , M52N5TAxe , M52N5TAye , M52N5TAze , M52N5TDxss , M52N5TDyss , M52N5TDzss , & - M52N6FKxe , M52N6FKye , M52N6FKze , M52N6FMxe , M52N6FMye , M52N6FMze , M52N6MKxe , & - M52N6MKye , M52N6MKze , M52N6MMxe , M52N6MMye , M52N6MMze , M52N6RAxe , M52N6RAye , & - M52N6RAze , M52N6RDxe , M52N6RDye , M52N6RDze , M52N6TAxe , M52N6TAye , M52N6TAze , & - M52N6TDxss , M52N6TDyss , M52N6TDzss , M52N7FKxe , M52N7FKye , M52N7FKze , M52N7FMxe , & - M52N7FMye , M52N7FMze , M52N7MKxe , M52N7MKye , M52N7MKze , M52N7MMxe , M52N7MMye , & - M52N7MMze , M52N7RAxe , M52N7RAye , M52N7RAze , M52N7RDxe , M52N7RDye , M52N7RDze , & - M52N7TAxe , M52N7TAye , M52N7TAze , M52N7TDxss , M52N7TDyss , M52N7TDzss , M52N8FKxe , & - M52N8FKye , M52N8FKze , M52N8FMxe , M52N8FMye , M52N8FMze , M52N8MKxe , M52N8MKye , & - M52N8MKze , M52N8MMxe , M52N8MMye , M52N8MMze , M52N8RAxe , M52N8RAye , M52N8RAze , & - M52N8RDxe , M52N8RDye , M52N8RDze , M52N8TAxe , M52N8TAye , M52N8TAze , M52N8TDxss , & - M52N8TDyss , M52N8TDzss , M52N9FKxe , M52N9FKye , M52N9FKze , M52N9FMxe , M52N9FMye , & - M52N9FMze , M52N9MKxe , M52N9MKye , M52N9MKze , M52N9MMxe , M52N9MMye , M52N9MMze , & - M52N9RAxe , M52N9RAye , M52N9RAze , M52N9RDxe , M52N9RDye , M52N9RDze , M52N9TAxe , & - M52N9TAye , M52N9TAze , M52N9TDxss , M52N9TDyss , M52N9TDzss , M53N1FKxe , M53N1FKye , & - M53N1FKze , M53N1FMxe , M53N1FMye , M53N1FMze , M53N1MKxe , M53N1MKye , M53N1MKze , & - M53N1MMxe , M53N1MMye , M53N1MMze , M53N1RAxe , M53N1RAye , M53N1RAze , M53N1RDxe , & - M53N1RDye , M53N1RDze , M53N1TAxe , M53N1TAye , M53N1TAze , M53N1TDxss , M53N1TDyss , & - M53N1TDzss , M53N2FKxe , M53N2FKye , M53N2FKze , M53N2FMxe , M53N2FMye , M53N2FMze , & - M53N2MKxe , M53N2MKye , M53N2MKze , M53N2MMxe , M53N2MMye , M53N2MMze , M53N2RAxe , & - M53N2RAye , M53N2RAze , M53N2RDxe , M53N2RDye , M53N2RDze , M53N2TAxe , M53N2TAye , & - M53N2TAze , M53N2TDxss , M53N2TDyss , M53N2TDzss , M53N3FKxe , M53N3FKye , M53N3FKze , & - M53N3FMxe , M53N3FMye , M53N3FMze , M53N3MKxe , M53N3MKye , M53N3MKze , M53N3MMxe , & - M53N3MMye , M53N3MMze , M53N3RAxe , M53N3RAye , M53N3RAze , M53N3RDxe , M53N3RDye , & - M53N3RDze , M53N3TAxe , M53N3TAye , M53N3TAze , M53N3TDxss , M53N3TDyss , M53N3TDzss , & - M53N4FKxe , M53N4FKye , M53N4FKze , M53N4FMxe , M53N4FMye , M53N4FMze , M53N4MKxe , & - M53N4MKye , M53N4MKze , M53N4MMxe , M53N4MMye , M53N4MMze , M53N4RAxe , M53N4RAye , & - M53N4RAze , M53N4RDxe , M53N4RDye , M53N4RDze , M53N4TAxe , M53N4TAye , M53N4TAze , & - M53N4TDxss , M53N4TDyss , M53N4TDzss , M53N5FKxe , M53N5FKye , M53N5FKze , M53N5FMxe , & - M53N5FMye , M53N5FMze , M53N5MKxe , M53N5MKye , M53N5MKze , M53N5MMxe , M53N5MMye , & - M53N5MMze , M53N5RAxe , M53N5RAye , M53N5RAze , M53N5RDxe , M53N5RDye , M53N5RDze , & - M53N5TAxe , M53N5TAye , M53N5TAze , M53N5TDxss , M53N5TDyss , M53N5TDzss , M53N6FKxe , & - M53N6FKye , M53N6FKze , M53N6FMxe , M53N6FMye , M53N6FMze , M53N6MKxe , M53N6MKye , & - M53N6MKze , M53N6MMxe , M53N6MMye , M53N6MMze , M53N6RAxe , M53N6RAye , M53N6RAze , & - M53N6RDxe , M53N6RDye , M53N6RDze , M53N6TAxe , M53N6TAye , M53N6TAze , M53N6TDxss , & - M53N6TDyss , M53N6TDzss , M53N7FKxe , M53N7FKye , M53N7FKze , M53N7FMxe , M53N7FMye , & - M53N7FMze , M53N7MKxe , M53N7MKye , M53N7MKze , M53N7MMxe , M53N7MMye , M53N7MMze , & - M53N7RAxe , M53N7RAye , M53N7RAze , M53N7RDxe , M53N7RDye , M53N7RDze , M53N7TAxe , & - M53N7TAye , M53N7TAze , M53N7TDxss , M53N7TDyss , M53N7TDzss , M53N8FKxe , M53N8FKye , & - M53N8FKze , M53N8FMxe , M53N8FMye , M53N8FMze , M53N8MKxe , M53N8MKye , M53N8MKze , & - M53N8MMxe , M53N8MMye , M53N8MMze , M53N8RAxe , M53N8RAye , M53N8RAze , M53N8RDxe , & - M53N8RDye , M53N8RDze , M53N8TAxe , M53N8TAye , M53N8TAze , M53N8TDxss , M53N8TDyss , & - M53N8TDzss , M53N9FKxe , M53N9FKye , M53N9FKze , M53N9FMxe , M53N9FMye , M53N9FMze , & - M53N9MKxe , M53N9MKye , M53N9MKze , M53N9MMxe , M53N9MMye , M53N9MMze , M53N9RAxe , & - M53N9RAye , M53N9RAze , M53N9RDxe , M53N9RDye , M53N9RDze , M53N9TAxe , M53N9TAye , & - M53N9TAze , M53N9TDxss , M53N9TDyss , M53N9TDzss , M54N1FKxe , M54N1FKye , M54N1FKze , & - M54N1FMxe , M54N1FMye , M54N1FMze , M54N1MKxe , M54N1MKye , M54N1MKze , M54N1MMxe , & - M54N1MMye , M54N1MMze , M54N1RAxe , M54N1RAye , M54N1RAze , M54N1RDxe , M54N1RDye , & - M54N1RDze , M54N1TAxe , M54N1TAye , M54N1TAze , M54N1TDxss , M54N1TDyss , M54N1TDzss , & - M54N2FKxe , M54N2FKye , M54N2FKze , M54N2FMxe , M54N2FMye , M54N2FMze , M54N2MKxe , & - M54N2MKye , M54N2MKze , M54N2MMxe , M54N2MMye , M54N2MMze , M54N2RAxe , M54N2RAye , & - M54N2RAze , M54N2RDxe , M54N2RDye , M54N2RDze , M54N2TAxe , M54N2TAye , M54N2TAze , & - M54N2TDxss , M54N2TDyss , M54N2TDzss , M54N3FKxe , M54N3FKye , M54N3FKze , M54N3FMxe , & - M54N3FMye , M54N3FMze , M54N3MKxe , M54N3MKye , M54N3MKze , M54N3MMxe , M54N3MMye , & - M54N3MMze , M54N3RAxe , M54N3RAye , M54N3RAze , M54N3RDxe , M54N3RDye , M54N3RDze , & - M54N3TAxe , M54N3TAye , M54N3TAze , M54N3TDxss , M54N3TDyss , M54N3TDzss , M54N4FKxe , & - M54N4FKye , M54N4FKze , M54N4FMxe , M54N4FMye , M54N4FMze , M54N4MKxe , M54N4MKye , & - M54N4MKze , M54N4MMxe , M54N4MMye , M54N4MMze , M54N4RAxe , M54N4RAye , M54N4RAze , & - M54N4RDxe , M54N4RDye , M54N4RDze , M54N4TAxe , M54N4TAye , M54N4TAze , M54N4TDxss , & - M54N4TDyss , M54N4TDzss , M54N5FKxe , M54N5FKye , M54N5FKze , M54N5FMxe , M54N5FMye , & - M54N5FMze , M54N5MKxe , M54N5MKye , M54N5MKze , M54N5MMxe , M54N5MMye , M54N5MMze , & - M54N5RAxe , M54N5RAye , M54N5RAze , M54N5RDxe , M54N5RDye , M54N5RDze , M54N5TAxe , & - M54N5TAye , M54N5TAze , M54N5TDxss , M54N5TDyss , M54N5TDzss , M54N6FKxe , M54N6FKye , & - M54N6FKze , M54N6FMxe , M54N6FMye , M54N6FMze , M54N6MKxe , M54N6MKye , M54N6MKze , & - M54N6MMxe , M54N6MMye , M54N6MMze , M54N6RAxe , M54N6RAye , M54N6RAze , M54N6RDxe , & - M54N6RDye , M54N6RDze , M54N6TAxe , M54N6TAye , M54N6TAze , M54N6TDxss , M54N6TDyss , & - M54N6TDzss , M54N7FKxe , M54N7FKye , M54N7FKze , M54N7FMxe , M54N7FMye , M54N7FMze , & - M54N7MKxe , M54N7MKye , M54N7MKze , M54N7MMxe , M54N7MMye , M54N7MMze , M54N7RAxe , & - M54N7RAye , M54N7RAze , M54N7RDxe , M54N7RDye , M54N7RDze , M54N7TAxe , M54N7TAye , & - M54N7TAze , M54N7TDxss , M54N7TDyss , M54N7TDzss , M54N8FKxe , M54N8FKye , M54N8FKze , & - M54N8FMxe , M54N8FMye , M54N8FMze , M54N8MKxe , M54N8MKye , M54N8MKze , M54N8MMxe , & - M54N8MMye , M54N8MMze , M54N8RAxe , M54N8RAye , M54N8RAze , M54N8RDxe , M54N8RDye , & - M54N8RDze , M54N8TAxe , M54N8TAye , M54N8TAze , M54N8TDxss , M54N8TDyss , M54N8TDzss , & - M54N9FKxe , M54N9FKye , M54N9FKze , M54N9FMxe , M54N9FMye , M54N9FMze , M54N9MKxe , & - M54N9MKye , M54N9MKze , M54N9MMxe , M54N9MMye , M54N9MMze , M54N9RAxe , M54N9RAye , & - M54N9RAze , M54N9RDxe , M54N9RDye , M54N9RDze , M54N9TAxe , M54N9TAye , M54N9TAze , & - M54N9TDxss , M54N9TDyss , M54N9TDzss , M55N1FKxe , M55N1FKye , M55N1FKze , M55N1FMxe , & - M55N1FMye , M55N1FMze , M55N1MKxe , M55N1MKye /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry8(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M55N1MKze , M55N1MMxe , M55N1MMye , M55N1MMze , M55N1RAxe , M55N1RAye , M55N1RAze , & - M55N1RDxe , M55N1RDye , M55N1RDze , M55N1TAxe , M55N1TAye , M55N1TAze , M55N1TDxss , & - M55N1TDyss , M55N1TDzss , M55N2FKxe , M55N2FKye , M55N2FKze , M55N2FMxe , M55N2FMye , & - M55N2FMze , M55N2MKxe , M55N2MKye , M55N2MKze , M55N2MMxe , M55N2MMye , M55N2MMze , & - M55N2RAxe , M55N2RAye , M55N2RAze , M55N2RDxe , M55N2RDye , M55N2RDze , M55N2TAxe , & - M55N2TAye , M55N2TAze , M55N2TDxss , M55N2TDyss , M55N2TDzss , M55N3FKxe , M55N3FKye , & - M55N3FKze , M55N3FMxe , M55N3FMye , M55N3FMze , M55N3MKxe , M55N3MKye , M55N3MKze , & - M55N3MMxe , M55N3MMye , M55N3MMze , M55N3RAxe , M55N3RAye , M55N3RAze , M55N3RDxe , & - M55N3RDye , M55N3RDze , M55N3TAxe , M55N3TAye , M55N3TAze , M55N3TDxss , M55N3TDyss , & - M55N3TDzss , M55N4FKxe , M55N4FKye , M55N4FKze , M55N4FMxe , M55N4FMye , M55N4FMze , & - M55N4MKxe , M55N4MKye , M55N4MKze , M55N4MMxe , M55N4MMye , M55N4MMze , M55N4RAxe , & - M55N4RAye , M55N4RAze , M55N4RDxe , M55N4RDye , M55N4RDze , M55N4TAxe , M55N4TAye , & - M55N4TAze , M55N4TDxss , M55N4TDyss , M55N4TDzss , M55N5FKxe , M55N5FKye , M55N5FKze , & - M55N5FMxe , M55N5FMye , M55N5FMze , M55N5MKxe , M55N5MKye , M55N5MKze , M55N5MMxe , & - M55N5MMye , M55N5MMze , M55N5RAxe , M55N5RAye , M55N5RAze , M55N5RDxe , M55N5RDye , & - M55N5RDze , M55N5TAxe , M55N5TAye , M55N5TAze , M55N5TDxss , M55N5TDyss , M55N5TDzss , & - M55N6FKxe , M55N6FKye , M55N6FKze , M55N6FMxe , M55N6FMye , M55N6FMze , M55N6MKxe , & - M55N6MKye , M55N6MKze , M55N6MMxe , M55N6MMye , M55N6MMze , M55N6RAxe , M55N6RAye , & - M55N6RAze , M55N6RDxe , M55N6RDye , M55N6RDze , M55N6TAxe , M55N6TAye , M55N6TAze , & - M55N6TDxss , M55N6TDyss , M55N6TDzss , M55N7FKxe , M55N7FKye , M55N7FKze , M55N7FMxe , & - M55N7FMye , M55N7FMze , M55N7MKxe , M55N7MKye , M55N7MKze , M55N7MMxe , M55N7MMye , & - M55N7MMze , M55N7RAxe , M55N7RAye , M55N7RAze , M55N7RDxe , M55N7RDye , M55N7RDze , & - M55N7TAxe , M55N7TAye , M55N7TAze , M55N7TDxss , M55N7TDyss , M55N7TDzss , M55N8FKxe , & - M55N8FKye , M55N8FKze , M55N8FMxe , M55N8FMye , M55N8FMze , M55N8MKxe , M55N8MKye , & - M55N8MKze , M55N8MMxe , M55N8MMye , M55N8MMze , M55N8RAxe , M55N8RAye , M55N8RAze , & - M55N8RDxe , M55N8RDye , M55N8RDze , M55N8TAxe , M55N8TAye , M55N8TAze , M55N8TDxss , & - M55N8TDyss , M55N8TDzss , M55N9FKxe , M55N9FKye , M55N9FKze , M55N9FMxe , M55N9FMye , & - M55N9FMze , M55N9MKxe , M55N9MKye , M55N9MKze , M55N9MMxe , M55N9MMye , M55N9MMze , & - M55N9RAxe , M55N9RAye , M55N9RAze , M55N9RDxe , M55N9RDye , M55N9RDze , M55N9TAxe , & - M55N9TAye , M55N9TAze , M55N9TDxss , M55N9TDyss , M55N9TDzss , M56N1FKxe , M56N1FKye , & - M56N1FKze , M56N1FMxe , M56N1FMye , M56N1FMze , M56N1MKxe , M56N1MKye , M56N1MKze , & - M56N1MMxe , M56N1MMye , M56N1MMze , M56N1RAxe , M56N1RAye , M56N1RAze , M56N1RDxe , & - M56N1RDye , M56N1RDze , M56N1TAxe , M56N1TAye , M56N1TAze , M56N1TDxss , M56N1TDyss , & - M56N1TDzss , M56N2FKxe , M56N2FKye , M56N2FKze , M56N2FMxe , M56N2FMye , M56N2FMze , & - M56N2MKxe , M56N2MKye , M56N2MKze , M56N2MMxe , M56N2MMye , M56N2MMze , M56N2RAxe , & - M56N2RAye , M56N2RAze , M56N2RDxe , M56N2RDye , M56N2RDze , M56N2TAxe , M56N2TAye , & - M56N2TAze , M56N2TDxss , M56N2TDyss , M56N2TDzss , M56N3FKxe , M56N3FKye , M56N3FKze , & - M56N3FMxe , M56N3FMye , M56N3FMze , M56N3MKxe , M56N3MKye , M56N3MKze , M56N3MMxe , & - M56N3MMye , M56N3MMze , M56N3RAxe , M56N3RAye , M56N3RAze , M56N3RDxe , M56N3RDye , & - M56N3RDze , M56N3TAxe , M56N3TAye , M56N3TAze , M56N3TDxss , M56N3TDyss , M56N3TDzss , & - M56N4FKxe , M56N4FKye , M56N4FKze , M56N4FMxe , M56N4FMye , M56N4FMze , M56N4MKxe , & - M56N4MKye , M56N4MKze , M56N4MMxe , M56N4MMye , M56N4MMze , M56N4RAxe , M56N4RAye , & - M56N4RAze , M56N4RDxe , M56N4RDye , M56N4RDze , M56N4TAxe , M56N4TAye , M56N4TAze , & - M56N4TDxss , M56N4TDyss , M56N4TDzss , M56N5FKxe , M56N5FKye , M56N5FKze , M56N5FMxe , & - M56N5FMye , M56N5FMze , M56N5MKxe , M56N5MKye , M56N5MKze , M56N5MMxe , M56N5MMye , & - M56N5MMze , M56N5RAxe , M56N5RAye , M56N5RAze , M56N5RDxe , M56N5RDye , M56N5RDze , & - M56N5TAxe , M56N5TAye , M56N5TAze , M56N5TDxss , M56N5TDyss , M56N5TDzss , M56N6FKxe , & - M56N6FKye , M56N6FKze , M56N6FMxe , M56N6FMye , M56N6FMze , M56N6MKxe , M56N6MKye , & - M56N6MKze , M56N6MMxe , M56N6MMye , M56N6MMze , M56N6RAxe , M56N6RAye , M56N6RAze , & - M56N6RDxe , M56N6RDye , M56N6RDze , M56N6TAxe , M56N6TAye , M56N6TAze , M56N6TDxss , & - M56N6TDyss , M56N6TDzss , M56N7FKxe , M56N7FKye , M56N7FKze , M56N7FMxe , M56N7FMye , & - M56N7FMze , M56N7MKxe , M56N7MKye , M56N7MKze , M56N7MMxe , M56N7MMye , M56N7MMze , & - M56N7RAxe , M56N7RAye , M56N7RAze , M56N7RDxe , M56N7RDye , M56N7RDze , M56N7TAxe , & - M56N7TAye , M56N7TAze , M56N7TDxss , M56N7TDyss , M56N7TDzss , M56N8FKxe , M56N8FKye , & - M56N8FKze , M56N8FMxe , M56N8FMye , M56N8FMze , M56N8MKxe , M56N8MKye , M56N8MKze , & - M56N8MMxe , M56N8MMye , M56N8MMze , M56N8RAxe , M56N8RAye , M56N8RAze , M56N8RDxe , & - M56N8RDye , M56N8RDze , M56N8TAxe , M56N8TAye , M56N8TAze , M56N8TDxss , M56N8TDyss , & - M56N8TDzss , M56N9FKxe , M56N9FKye , M56N9FKze , M56N9FMxe , M56N9FMye , M56N9FMze , & - M56N9MKxe , M56N9MKye , M56N9MKze , M56N9MMxe , M56N9MMye , M56N9MMze , M56N9RAxe , & - M56N9RAye , M56N9RAze , M56N9RDxe , M56N9RDye , M56N9RDze , M56N9TAxe , M56N9TAye , & - M56N9TAze , M56N9TDxss , M56N9TDyss , M56N9TDzss , M57N1FKxe , M57N1FKye , M57N1FKze , & - M57N1FMxe , M57N1FMye , M57N1FMze , M57N1MKxe , M57N1MKye , M57N1MKze , M57N1MMxe , & - M57N1MMye , M57N1MMze , M57N1RAxe , M57N1RAye , M57N1RAze , M57N1RDxe , M57N1RDye , & - M57N1RDze , M57N1TAxe , M57N1TAye , M57N1TAze , M57N1TDxss , M57N1TDyss , M57N1TDzss , & - M57N2FKxe , M57N2FKye , M57N2FKze , M57N2FMxe , M57N2FMye , M57N2FMze , M57N2MKxe , & - M57N2MKye , M57N2MKze , M57N2MMxe , M57N2MMye , M57N2MMze , M57N2RAxe , M57N2RAye , & - M57N2RAze , M57N2RDxe , M57N2RDye , M57N2RDze , M57N2TAxe , M57N2TAye , M57N2TAze , & - M57N2TDxss , M57N2TDyss , M57N2TDzss , M57N3FKxe , M57N3FKye , M57N3FKze , M57N3FMxe , & - M57N3FMye , M57N3FMze , M57N3MKxe , M57N3MKye , M57N3MKze , M57N3MMxe , M57N3MMye , & - M57N3MMze , M57N3RAxe , M57N3RAye , M57N3RAze , M57N3RDxe , M57N3RDye , M57N3RDze , & - M57N3TAxe , M57N3TAye , M57N3TAze , M57N3TDxss , M57N3TDyss , M57N3TDzss , M57N4FKxe , & - M57N4FKye , M57N4FKze , M57N4FMxe , M57N4FMye , M57N4FMze , M57N4MKxe , M57N4MKye , & - M57N4MKze , M57N4MMxe , M57N4MMye , M57N4MMze , M57N4RAxe , M57N4RAye , M57N4RAze , & - M57N4RDxe , M57N4RDye , M57N4RDze , M57N4TAxe , M57N4TAye , M57N4TAze , M57N4TDxss , & - M57N4TDyss , M57N4TDzss , M57N5FKxe , M57N5FKye , M57N5FKze , M57N5FMxe , M57N5FMye , & - M57N5FMze , M57N5MKxe , M57N5MKye , M57N5MKze , M57N5MMxe , M57N5MMye , M57N5MMze , & - M57N5RAxe , M57N5RAye , M57N5RAze , M57N5RDxe , M57N5RDye , M57N5RDze , M57N5TAxe , & - M57N5TAye , M57N5TAze , M57N5TDxss , M57N5TDyss , M57N5TDzss , M57N6FKxe , M57N6FKye , & - M57N6FKze , M57N6FMxe , M57N6FMye , M57N6FMze , M57N6MKxe , M57N6MKye , M57N6MKze , & - M57N6MMxe , M57N6MMye , M57N6MMze , M57N6RAxe , M57N6RAye , M57N6RAze , M57N6RDxe , & - M57N6RDye , M57N6RDze , M57N6TAxe , M57N6TAye , M57N6TAze , M57N6TDxss , M57N6TDyss , & - M57N6TDzss , M57N7FKxe , M57N7FKye , M57N7FKze , M57N7FMxe , M57N7FMye , M57N7FMze , & - M57N7MKxe , M57N7MKye , M57N7MKze , M57N7MMxe , M57N7MMye , M57N7MMze , M57N7RAxe , & - M57N7RAye , M57N7RAze , M57N7RDxe , M57N7RDye , M57N7RDze , M57N7TAxe , M57N7TAye , & - M57N7TAze , M57N7TDxss , M57N7TDyss , M57N7TDzss , M57N8FKxe , M57N8FKye , M57N8FKze , & - M57N8FMxe , M57N8FMye , M57N8FMze , M57N8MKxe , M57N8MKye , M57N8MKze , M57N8MMxe , & - M57N8MMye , M57N8MMze , M57N8RAxe , M57N8RAye , M57N8RAze , M57N8RDxe , M57N8RDye , & - M57N8RDze , M57N8TAxe , M57N8TAye , M57N8TAze , M57N8TDxss , M57N8TDyss , M57N8TDzss , & - M57N9FKxe , M57N9FKye , M57N9FKze , M57N9FMxe , M57N9FMye , M57N9FMze , M57N9MKxe , & - M57N9MKye , M57N9MKze , M57N9MMxe , M57N9MMye , M57N9MMze , M57N9RAxe , M57N9RAye , & - M57N9RAze , M57N9RDxe , M57N9RDye , M57N9RDze , M57N9TAxe , M57N9TAye , M57N9TAze , & - M57N9TDxss , M57N9TDyss , M57N9TDzss , M58N1FKxe , M58N1FKye , M58N1FKze , M58N1FMxe , & - M58N1FMye , M58N1FMze , M58N1MKxe , M58N1MKye , M58N1MKze , M58N1MMxe , M58N1MMye , & - M58N1MMze , M58N1RAxe , M58N1RAye , M58N1RAze , M58N1RDxe , M58N1RDye , M58N1RDze , & - M58N1TAxe , M58N1TAye , M58N1TAze , M58N1TDxss , M58N1TDyss , M58N1TDzss , M58N2FKxe , & - M58N2FKye , M58N2FKze , M58N2FMxe , M58N2FMye , M58N2FMze , M58N2MKxe , M58N2MKye , & - M58N2MKze , M58N2MMxe , M58N2MMye , M58N2MMze , M58N2RAxe , M58N2RAye , M58N2RAze , & - M58N2RDxe , M58N2RDye , M58N2RDze , M58N2TAxe , M58N2TAye , M58N2TAze , M58N2TDxss , & - M58N2TDyss , M58N2TDzss , M58N3FKxe , M58N3FKye , M58N3FKze , M58N3FMxe , M58N3FMye , & - M58N3FMze , M58N3MKxe , M58N3MKye , M58N3MKze , M58N3MMxe , M58N3MMye , M58N3MMze , & - M58N3RAxe , M58N3RAye , M58N3RAze , M58N3RDxe , M58N3RDye , M58N3RDze , M58N3TAxe , & - M58N3TAye , M58N3TAze , M58N3TDxss , M58N3TDyss , M58N3TDzss , M58N4FKxe , M58N4FKye , & - M58N4FKze , M58N4FMxe , M58N4FMye , M58N4FMze , M58N4MKxe , M58N4MKye , M58N4MKze , & - M58N4MMxe , M58N4MMye , M58N4MMze , M58N4RAxe , M58N4RAye , M58N4RAze , M58N4RDxe , & - M58N4RDye , M58N4RDze , M58N4TAxe , M58N4TAye , M58N4TAze , M58N4TDxss , M58N4TDyss , & - M58N4TDzss , M58N5FKxe , M58N5FKye , M58N5FKze , M58N5FMxe , M58N5FMye , M58N5FMze , & - M58N5MKxe , M58N5MKye , M58N5MKze , M58N5MMxe , M58N5MMye , M58N5MMze , M58N5RAxe , & - M58N5RAye , M58N5RAze , M58N5RDxe , M58N5RDye , M58N5RDze , M58N5TAxe , M58N5TAye , & - M58N5TAze , M58N5TDxss , M58N5TDyss , M58N5TDzss , M58N6FKxe , M58N6FKye , M58N6FKze , & - M58N6FMxe , M58N6FMye , M58N6FMze , M58N6MKxe , M58N6MKye , M58N6MKze , M58N6MMxe , & - M58N6MMye , M58N6MMze , M58N6RAxe , M58N6RAye , M58N6RAze , M58N6RDxe , M58N6RDye , & - M58N6RDze , M58N6TAxe , M58N6TAye , M58N6TAze , M58N6TDxss , M58N6TDyss , M58N6TDzss , & - M58N7FKxe , M58N7FKye , M58N7FKze , M58N7FMxe , M58N7FMye , M58N7FMze , M58N7MKxe , & - M58N7MKye , M58N7MKze , M58N7MMxe , M58N7MMye , M58N7MMze , M58N7RAxe , M58N7RAye , & - M58N7RAze , M58N7RDxe , M58N7RDye , M58N7RDze , M58N7TAxe , M58N7TAye , M58N7TAze , & - M58N7TDxss , M58N7TDyss , M58N7TDzss , M58N8FKxe , M58N8FKye , M58N8FKze , M58N8FMxe , & - M58N8FMye , M58N8FMze , M58N8MKxe , M58N8MKye , M58N8MKze , M58N8MMxe , M58N8MMye , & - M58N8MMze , M58N8RAxe , M58N8RAye , M58N8RAze , M58N8RDxe , M58N8RDye , M58N8RDze , & - M58N8TAxe , M58N8TAye , M58N8TAze , M58N8TDxss , M58N8TDyss , M58N8TDzss , M58N9FKxe , & - M58N9FKye , M58N9FKze , M58N9FMxe , M58N9FMye , M58N9FMze , M58N9MKxe , M58N9MKye , & - M58N9MKze , M58N9MMxe , M58N9MMye , M58N9MMze , M58N9RAxe , M58N9RAye , M58N9RAze , & - M58N9RDxe , M58N9RDye , M58N9RDze , M58N9TAxe , M58N9TAye , M58N9TAze , M58N9TDxss , & - M58N9TDyss , M58N9TDzss , M59N1FKxe , M59N1FKye , M59N1FKze , M59N1FMxe , M59N1FMye , & - M59N1FMze , M59N1MKxe , M59N1MKye , M59N1MKze , M59N1MMxe , M59N1MMye , M59N1MMze , & - M59N1RAxe , M59N1RAye , M59N1RAze , M59N1RDxe , M59N1RDye , M59N1RDze , M59N1TAxe , & - M59N1TAye , M59N1TAze , M59N1TDxss , M59N1TDyss , M59N1TDzss , M59N2FKxe , M59N2FKye , & - M59N2FKze , M59N2FMxe , M59N2FMye , M59N2FMze , M59N2MKxe , M59N2MKye , M59N2MKze , & - M59N2MMxe , M59N2MMye , M59N2MMze , M59N2RAxe , M59N2RAye , M59N2RAze , M59N2RDxe , & - M59N2RDye , M59N2RDze , M59N2TAxe , M59N2TAye , M59N2TAze , M59N2TDxss , M59N2TDyss , & - M59N2TDzss , M59N3FKxe , M59N3FKye , M59N3FKze , M59N3FMxe , M59N3FMye , M59N3FMze , & - M59N3MKxe , M59N3MKye , M59N3MKze , M59N3MMxe , M59N3MMye , M59N3MMze , M59N3RAxe , & - M59N3RAye , M59N3RAze , M59N3RDxe , M59N3RDye , M59N3RDze , M59N3TAxe , M59N3TAye , & - M59N3TAze , M59N3TDxss , M59N3TDyss , M59N3TDzss , M59N4FKxe , M59N4FKye , M59N4FKze , & - M59N4FMxe , M59N4FMye , M59N4FMze , M59N4MKxe , M59N4MKye , M59N4MKze , M59N4MMxe , & - M59N4MMye , M59N4MMze , M59N4RAxe , M59N4RAye , M59N4RAze , M59N4RDxe , M59N4RDye , & - M59N4RDze , M59N4TAxe , M59N4TAye , M59N4TAze , M59N4TDxss , M59N4TDyss , M59N4TDzss , & - M59N5FKxe , M59N5FKye , M59N5FKze , M59N5FMxe , M59N5FMye , M59N5FMze , M59N5MKxe , & - M59N5MKye , M59N5MKze , M59N5MMxe , M59N5MMye , M59N5MMze , M59N5RAxe , M59N5RAye , & - M59N5RAze , M59N5RDxe , M59N5RDye , M59N5RDze , M59N5TAxe , M59N5TAye , M59N5TAze , & - M59N5TDxss , M59N5TDyss , M59N5TDzss , M59N6FKxe , M59N6FKye , M59N6FKze , M59N6FMxe , & - M59N6FMye , M59N6FMze , M59N6MKxe , M59N6MKye , M59N6MKze , M59N6MMxe , M59N6MMye , & - M59N6MMze , M59N6RAxe , M59N6RAye , M59N6RAze , M59N6RDxe , M59N6RDye , M59N6RDze , & - M59N6TAxe , M59N6TAye , M59N6TAze , M59N6TDxss , M59N6TDyss , M59N6TDzss , M59N7FKxe , & - M59N7FKye , M59N7FKze , M59N7FMxe , M59N7FMye , M59N7FMze , M59N7MKxe , M59N7MKye , & - M59N7MKze , M59N7MMxe , M59N7MMye , M59N7MMze , M59N7RAxe , M59N7RAye , M59N7RAze , & - M59N7RDxe , M59N7RDye , M59N7RDze , M59N7TAxe , M59N7TAye , M59N7TAze , M59N7TDxss , & - M59N7TDyss , M59N7TDzss , M59N8FKxe , M59N8FKye , M59N8FKze , M59N8FMxe , M59N8FMye , & - M59N8FMze , M59N8MKxe , M59N8MKye , M59N8MKze , M59N8MMxe , M59N8MMye , M59N8MMze , & - M59N8RAxe , M59N8RAye , M59N8RAze , M59N8RDxe , M59N8RDye , M59N8RDze , M59N8TAxe , & - M59N8TAye , M59N8TAze , M59N8TDxss , M59N8TDyss , M59N8TDzss , M59N9FKxe , M59N9FKye , & - M59N9FKze , M59N9FMxe , M59N9FMye , M59N9FMze , M59N9MKxe , M59N9MKye , M59N9MKze , & - M59N9MMxe , M59N9MMye , M59N9MMze , M59N9RAxe , M59N9RAye , M59N9RAze , M59N9RDxe , & - M59N9RDye , M59N9RDze , M59N9TAxe , M59N9TAye , M59N9TAze , M59N9TDxss , M59N9TDyss , & - M59N9TDzss , M60N1FKxe , M60N1FKye , M60N1FKze , M60N1FMxe , M60N1FMye , M60N1FMze , & - M60N1MKxe , M60N1MKye , M60N1MKze , M60N1MMxe , M60N1MMye , M60N1MMze , M60N1RAxe , & - M60N1RAye , M60N1RAze , M60N1RDxe , M60N1RDye , M60N1RDze , M60N1TAxe , M60N1TAye , & - M60N1TAze , M60N1TDxss , M60N1TDyss , M60N1TDzss , M60N2FKxe , M60N2FKye , M60N2FKze , & - M60N2FMxe , M60N2FMye , M60N2FMze , M60N2MKxe , M60N2MKye , M60N2MKze , M60N2MMxe , & - M60N2MMye , M60N2MMze , M60N2RAxe , M60N2RAye , M60N2RAze , M60N2RDxe , M60N2RDye , & - M60N2RDze , M60N2TAxe , M60N2TAye , M60N2TAze , M60N2TDxss , M60N2TDyss , M60N2TDzss , & - M60N3FKxe , M60N3FKye , M60N3FKze , M60N3FMxe , M60N3FMye , M60N3FMze , M60N3MKxe , & - M60N3MKye , M60N3MKze , M60N3MMxe , M60N3MMye , M60N3MMze , M60N3RAxe , M60N3RAye , & - M60N3RAze , M60N3RDxe , M60N3RDye , M60N3RDze , M60N3TAxe , M60N3TAye , M60N3TAze , & - M60N3TDxss , M60N3TDyss , M60N3TDzss , M60N4FKxe , M60N4FKye , M60N4FKze , M60N4FMxe , & - M60N4FMye , M60N4FMze , M60N4MKxe , M60N4MKye , M60N4MKze , M60N4MMxe , M60N4MMye , & - M60N4MMze , M60N4RAxe , M60N4RAye , M60N4RAze , M60N4RDxe , M60N4RDye , M60N4RDze , & - M60N4TAxe , M60N4TAye , M60N4TAze , M60N4TDxss , M60N4TDyss , M60N4TDzss , M60N5FKxe , & - M60N5FKye , M60N5FKze , M60N5FMxe , M60N5FMye , M60N5FMze , M60N5MKxe , M60N5MKye , & - M60N5MKze , M60N5MMxe , M60N5MMye , M60N5MMze , M60N5RAxe , M60N5RAye , M60N5RAze , & - M60N5RDxe , M60N5RDye , M60N5RDze , M60N5TAxe , M60N5TAye , M60N5TAze , M60N5TDxss , & - M60N5TDyss , M60N5TDzss , M60N6FKxe , M60N6FKye , M60N6FKze , M60N6FMxe , M60N6FMye , & - M60N6FMze , M60N6MKxe , M60N6MKye , M60N6MKze , M60N6MMxe , M60N6MMye , M60N6MMze , & - M60N6RAxe , M60N6RAye , M60N6RAze , M60N6RDxe , M60N6RDye , M60N6RDze , M60N6TAxe , & - M60N6TAye , M60N6TAze , M60N6TDxss , M60N6TDyss , M60N6TDzss , M60N7FKxe , M60N7FKye , & - M60N7FKze , M60N7FMxe , M60N7FMye , M60N7FMze , M60N7MKxe , M60N7MKye , M60N7MKze , & - M60N7MMxe , M60N7MMye , M60N7MMze , M60N7RAxe , M60N7RAye , M60N7RAze , M60N7RDxe , & - M60N7RDye , M60N7RDze , M60N7TAxe , M60N7TAye , M60N7TAze , M60N7TDxss , M60N7TDyss , & - M60N7TDzss , M60N8FKxe , M60N8FKye , M60N8FKze , M60N8FMxe , M60N8FMye , M60N8FMze , & - M60N8MKxe , M60N8MKye , M60N8MKze , M60N8MMxe , M60N8MMye , M60N8MMze , M60N8RAxe , & - M60N8RAye , M60N8RAze , M60N8RDxe , M60N8RDye , M60N8RDze , M60N8TAxe , M60N8TAye , & - M60N8TAze , M60N8TDxss , M60N8TDyss , M60N8TDzss , M60N9FKxe , M60N9FKye , M60N9FKze , & - M60N9FMxe , M60N9FMye , M60N9FMze , M60N9MKxe , M60N9MKye , M60N9MKze , M60N9MMxe , & - M60N9MMye , M60N9MMze , M60N9RAxe , M60N9RAye , M60N9RAze , M60N9RDxe , M60N9RDye , & - M60N9RDze , M60N9TAxe , M60N9TAye , M60N9TAze , M60N9TDxss , M60N9TDyss , M60N9TDzss , & - M61N1FKxe , M61N1FKye , M61N1FKze , M61N1FMxe , M61N1FMye , M61N1FMze , M61N1MKxe , & - M61N1MKye , M61N1MKze , M61N1MMxe , M61N1MMye , M61N1MMze , M61N1RAxe , M61N1RAye , & - M61N1RAze , M61N1RDxe , M61N1RDye , M61N1RDze , M61N1TAxe , M61N1TAye , M61N1TAze , & - M61N1TDxss , M61N1TDyss , M61N1TDzss , M61N2FKxe , M61N2FKye , M61N2FKze , M61N2FMxe , & - M61N2FMye , M61N2FMze , M61N2MKxe , M61N2MKye , M61N2MKze , M61N2MMxe , M61N2MMye , & - M61N2MMze , M61N2RAxe , M61N2RAye , M61N2RAze , M61N2RDxe , M61N2RDye , M61N2RDze , & - M61N2TAxe , M61N2TAye , M61N2TAze , M61N2TDxss , M61N2TDyss , M61N2TDzss , M61N3FKxe , & - M61N3FKye , M61N3FKze , M61N3FMxe , M61N3FMye , M61N3FMze , M61N3MKxe , M61N3MKye , & - M61N3MKze , M61N3MMxe , M61N3MMye , M61N3MMze , M61N3RAxe , M61N3RAye , M61N3RAze , & - M61N3RDxe , M61N3RDye , M61N3RDze , M61N3TAxe , M61N3TAye , M61N3TAze , M61N3TDxss , & - M61N3TDyss , M61N3TDzss , M61N4FKxe , M61N4FKye , M61N4FKze , M61N4FMxe , M61N4FMye , & - M61N4FMze , M61N4MKxe , M61N4MKye , M61N4MKze , M61N4MMxe , M61N4MMye , M61N4MMze , & - M61N4RAxe , M61N4RAye , M61N4RAze , M61N4RDxe , M61N4RDye , M61N4RDze , M61N4TAxe , & - M61N4TAye , M61N4TAze , M61N4TDxss , M61N4TDyss , M61N4TDzss , M61N5FKxe , M61N5FKye , & - M61N5FKze , M61N5FMxe , M61N5FMye , M61N5FMze , M61N5MKxe , M61N5MKye , M61N5MKze , & - M61N5MMxe , M61N5MMye , M61N5MMze , M61N5RAxe , M61N5RAye , M61N5RAze , M61N5RDxe , & - M61N5RDye , M61N5RDze , M61N5TAxe , M61N5TAye , M61N5TAze , M61N5TDxss , M61N5TDyss , & - M61N5TDzss , M61N6FKxe , M61N6FKye , M61N6FKze , M61N6FMxe , M61N6FMye , M61N6FMze , & - M61N6MKxe , M61N6MKye , M61N6MKze , M61N6MMxe , M61N6MMye , M61N6MMze , M61N6RAxe , & - M61N6RAye , M61N6RAze , M61N6RDxe , M61N6RDye , M61N6RDze , M61N6TAxe , M61N6TAye , & - M61N6TAze , M61N6TDxss , M61N6TDyss , M61N6TDzss , M61N7FKxe , M61N7FKye , M61N7FKze , & - M61N7FMxe , M61N7FMye , M61N7FMze , M61N7MKxe , M61N7MKye , M61N7MKze , M61N7MMxe , & - M61N7MMye , M61N7MMze , M61N7RAxe , M61N7RAye , M61N7RAze , M61N7RDxe , M61N7RDye , & - M61N7RDze , M61N7TAxe , M61N7TAye , M61N7TAze , M61N7TDxss , M61N7TDyss , M61N7TDzss , & - M61N8FKxe , M61N8FKye , M61N8FKze , M61N8FMxe , M61N8FMye , M61N8FMze , M61N8MKxe , & - M61N8MKye , M61N8MKze , M61N8MMxe , M61N8MMye , M61N8MMze , M61N8RAxe , M61N8RAye , & - M61N8RAze , M61N8RDxe , M61N8RDye , M61N8RDze , M61N8TAxe , M61N8TAye , M61N8TAze , & - M61N8TDxss , M61N8TDyss , M61N8TDzss , M61N9FKxe , M61N9FKye , M61N9FKze , M61N9FMxe , & - M61N9FMye , M61N9FMze , M61N9MKxe , M61N9MKye , M61N9MKze , M61N9MMxe , M61N9MMye , & - M61N9MMze , M61N9RAxe , M61N9RAye , M61N9RAze , M61N9RDxe , M61N9RDye , M61N9RDze , & - M61N9TAxe , M61N9TAye , M61N9TAze , M61N9TDxss , M61N9TDyss , M61N9TDzss , M62N1FKxe , & - M62N1FKye , M62N1FKze , M62N1FMxe , M62N1FMye , M62N1FMze , M62N1MKxe , M62N1MKye , & - M62N1MKze , M62N1MMxe , M62N1MMye , M62N1MMze , M62N1RAxe , M62N1RAye , M62N1RAze , & - M62N1RDxe , M62N1RDye , M62N1RDze , M62N1TAxe , M62N1TAye , M62N1TAze , M62N1TDxss , & - M62N1TDyss , M62N1TDzss , M62N2FKxe , M62N2FKye , M62N2FKze , M62N2FMxe , M62N2FMye , & - M62N2FMze , M62N2MKxe , M62N2MKye , M62N2MKze , M62N2MMxe , M62N2MMye , M62N2MMze , & - M62N2RAxe , M62N2RAye , M62N2RAze , M62N2RDxe , M62N2RDye , M62N2RDze , M62N2TAxe , & - M62N2TAye , M62N2TAze , M62N2TDxss , M62N2TDyss , M62N2TDzss , M62N3FKxe , M62N3FKye , & - M62N3FKze , M62N3FMxe , M62N3FMye , M62N3FMze , M62N3MKxe , M62N3MKye , M62N3MKze , & - M62N3MMxe , M62N3MMye , M62N3MMze , M62N3RAxe , M62N3RAye , M62N3RAze , M62N3RDxe , & - M62N3RDye , M62N3RDze , M62N3TAxe , M62N3TAye , M62N3TAze , M62N3TDxss , M62N3TDyss , & - M62N3TDzss , M62N4FKxe , M62N4FKye , M62N4FKze , M62N4FMxe , M62N4FMye , M62N4FMze , & - M62N4MKxe , M62N4MKye , M62N4MKze , M62N4MMxe , M62N4MMye , M62N4MMze , M62N4RAxe , & - M62N4RAye , M62N4RAze , M62N4RDxe , M62N4RDye , M62N4RDze , M62N4TAxe , M62N4TAye , & - M62N4TAze , M62N4TDxss , M62N4TDyss , M62N4TDzss , M62N5FKxe , M62N5FKye , M62N5FKze , & - M62N5FMxe , M62N5FMye , M62N5FMze , M62N5MKxe , M62N5MKye , M62N5MKze , M62N5MMxe , & - M62N5MMye , M62N5MMze , M62N5RAxe , M62N5RAye , M62N5RAze , M62N5RDxe , M62N5RDye , & - M62N5RDze , M62N5TAxe , M62N5TAye , M62N5TAze , M62N5TDxss , M62N5TDyss , M62N5TDzss , & - M62N6FKxe , M62N6FKye , M62N6FKze , M62N6FMxe , M62N6FMye , M62N6FMze , M62N6MKxe , & - M62N6MKye , M62N6MKze , M62N6MMxe , M62N6MMye , M62N6MMze , M62N6RAxe , M62N6RAye , & - M62N6RAze , M62N6RDxe , M62N6RDye , M62N6RDze , M62N6TAxe , M62N6TAye , M62N6TAze , & - M62N6TDxss , M62N6TDyss , M62N6TDzss , M62N7FKxe , M62N7FKye , M62N7FKze , M62N7FMxe , & - M62N7FMye , M62N7FMze , M62N7MKxe , M62N7MKye , M62N7MKze , M62N7MMxe , M62N7MMye , & - M62N7MMze , M62N7RAxe , M62N7RAye , M62N7RAze , M62N7RDxe , M62N7RDye , M62N7RDze , & - M62N7TAxe , M62N7TAye , M62N7TAze , M62N7TDxss /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry9(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M62N7TDyss , M62N7TDzss , M62N8FKxe , M62N8FKye , M62N8FKze , M62N8FMxe , M62N8FMye , & - M62N8FMze , M62N8MKxe , M62N8MKye , M62N8MKze , M62N8MMxe , M62N8MMye , M62N8MMze , & - M62N8RAxe , M62N8RAye , M62N8RAze , M62N8RDxe , M62N8RDye , M62N8RDze , M62N8TAxe , & - M62N8TAye , M62N8TAze , M62N8TDxss , M62N8TDyss , M62N8TDzss , M62N9FKxe , M62N9FKye , & - M62N9FKze , M62N9FMxe , M62N9FMye , M62N9FMze , M62N9MKxe , M62N9MKye , M62N9MKze , & - M62N9MMxe , M62N9MMye , M62N9MMze , M62N9RAxe , M62N9RAye , M62N9RAze , M62N9RDxe , & - M62N9RDye , M62N9RDze , M62N9TAxe , M62N9TAye , M62N9TAze , M62N9TDxss , M62N9TDyss , & - M62N9TDzss , M63N1FKxe , M63N1FKye , M63N1FKze , M63N1FMxe , M63N1FMye , M63N1FMze , & - M63N1MKxe , M63N1MKye , M63N1MKze , M63N1MMxe , M63N1MMye , M63N1MMze , M63N1RAxe , & - M63N1RAye , M63N1RAze , M63N1RDxe , M63N1RDye , M63N1RDze , M63N1TAxe , M63N1TAye , & - M63N1TAze , M63N1TDxss , M63N1TDyss , M63N1TDzss , M63N2FKxe , M63N2FKye , M63N2FKze , & - M63N2FMxe , M63N2FMye , M63N2FMze , M63N2MKxe , M63N2MKye , M63N2MKze , M63N2MMxe , & - M63N2MMye , M63N2MMze , M63N2RAxe , M63N2RAye , M63N2RAze , M63N2RDxe , M63N2RDye , & - M63N2RDze , M63N2TAxe , M63N2TAye , M63N2TAze , M63N2TDxss , M63N2TDyss , M63N2TDzss , & - M63N3FKxe , M63N3FKye , M63N3FKze , M63N3FMxe , M63N3FMye , M63N3FMze , M63N3MKxe , & - M63N3MKye , M63N3MKze , M63N3MMxe , M63N3MMye , M63N3MMze , M63N3RAxe , M63N3RAye , & - M63N3RAze , M63N3RDxe , M63N3RDye , M63N3RDze , M63N3TAxe , M63N3TAye , M63N3TAze , & - M63N3TDxss , M63N3TDyss , M63N3TDzss , M63N4FKxe , M63N4FKye , M63N4FKze , M63N4FMxe , & - M63N4FMye , M63N4FMze , M63N4MKxe , M63N4MKye , M63N4MKze , M63N4MMxe , M63N4MMye , & - M63N4MMze , M63N4RAxe , M63N4RAye , M63N4RAze , M63N4RDxe , M63N4RDye , M63N4RDze , & - M63N4TAxe , M63N4TAye , M63N4TAze , M63N4TDxss , M63N4TDyss , M63N4TDzss , M63N5FKxe , & - M63N5FKye , M63N5FKze , M63N5FMxe , M63N5FMye , M63N5FMze , M63N5MKxe , M63N5MKye , & - M63N5MKze , M63N5MMxe , M63N5MMye , M63N5MMze , M63N5RAxe , M63N5RAye , M63N5RAze , & - M63N5RDxe , M63N5RDye , M63N5RDze , M63N5TAxe , M63N5TAye , M63N5TAze , M63N5TDxss , & - M63N5TDyss , M63N5TDzss , M63N6FKxe , M63N6FKye , M63N6FKze , M63N6FMxe , M63N6FMye , & - M63N6FMze , M63N6MKxe , M63N6MKye , M63N6MKze , M63N6MMxe , M63N6MMye , M63N6MMze , & - M63N6RAxe , M63N6RAye , M63N6RAze , M63N6RDxe , M63N6RDye , M63N6RDze , M63N6TAxe , & - M63N6TAye , M63N6TAze , M63N6TDxss , M63N6TDyss , M63N6TDzss , M63N7FKxe , M63N7FKye , & - M63N7FKze , M63N7FMxe , M63N7FMye , M63N7FMze , M63N7MKxe , M63N7MKye , M63N7MKze , & - M63N7MMxe , M63N7MMye , M63N7MMze , M63N7RAxe , M63N7RAye , M63N7RAze , M63N7RDxe , & - M63N7RDye , M63N7RDze , M63N7TAxe , M63N7TAye , M63N7TAze , M63N7TDxss , M63N7TDyss , & - M63N7TDzss , M63N8FKxe , M63N8FKye , M63N8FKze , M63N8FMxe , M63N8FMye , M63N8FMze , & - M63N8MKxe , M63N8MKye , M63N8MKze , M63N8MMxe , M63N8MMye , M63N8MMze , M63N8RAxe , & - M63N8RAye , M63N8RAze , M63N8RDxe , M63N8RDye , M63N8RDze , M63N8TAxe , M63N8TAye , & - M63N8TAze , M63N8TDxss , M63N8TDyss , M63N8TDzss , M63N9FKxe , M63N9FKye , M63N9FKze , & - M63N9FMxe , M63N9FMye , M63N9FMze , M63N9MKxe , M63N9MKye , M63N9MKze , M63N9MMxe , & - M63N9MMye , M63N9MMze , M63N9RAxe , M63N9RAye , M63N9RAze , M63N9RDxe , M63N9RDye , & - M63N9RDze , M63N9TAxe , M63N9TAye , M63N9TAze , M63N9TDxss , M63N9TDyss , M63N9TDzss , & - M64N1FKxe , M64N1FKye , M64N1FKze , M64N1FMxe , M64N1FMye , M64N1FMze , M64N1MKxe , & - M64N1MKye , M64N1MKze , M64N1MMxe , M64N1MMye , M64N1MMze , M64N1RAxe , M64N1RAye , & - M64N1RAze , M64N1RDxe , M64N1RDye , M64N1RDze , M64N1TAxe , M64N1TAye , M64N1TAze , & - M64N1TDxss , M64N1TDyss , M64N1TDzss , M64N2FKxe , M64N2FKye , M64N2FKze , M64N2FMxe , & - M64N2FMye , M64N2FMze , M64N2MKxe , M64N2MKye , M64N2MKze , M64N2MMxe , M64N2MMye , & - M64N2MMze , M64N2RAxe , M64N2RAye , M64N2RAze , M64N2RDxe , M64N2RDye , M64N2RDze , & - M64N2TAxe , M64N2TAye , M64N2TAze , M64N2TDxss , M64N2TDyss , M64N2TDzss , M64N3FKxe , & - M64N3FKye , M64N3FKze , M64N3FMxe , M64N3FMye , M64N3FMze , M64N3MKxe , M64N3MKye , & - M64N3MKze , M64N3MMxe , M64N3MMye , M64N3MMze , M64N3RAxe , M64N3RAye , M64N3RAze , & - M64N3RDxe , M64N3RDye , M64N3RDze , M64N3TAxe , M64N3TAye , M64N3TAze , M64N3TDxss , & - M64N3TDyss , M64N3TDzss , M64N4FKxe , M64N4FKye , M64N4FKze , M64N4FMxe , M64N4FMye , & - M64N4FMze , M64N4MKxe , M64N4MKye , M64N4MKze , M64N4MMxe , M64N4MMye , M64N4MMze , & - M64N4RAxe , M64N4RAye , M64N4RAze , M64N4RDxe , M64N4RDye , M64N4RDze , M64N4TAxe , & - M64N4TAye , M64N4TAze , M64N4TDxss , M64N4TDyss , M64N4TDzss , M64N5FKxe , M64N5FKye , & - M64N5FKze , M64N5FMxe , M64N5FMye , M64N5FMze , M64N5MKxe , M64N5MKye , M64N5MKze , & - M64N5MMxe , M64N5MMye , M64N5MMze , M64N5RAxe , M64N5RAye , M64N5RAze , M64N5RDxe , & - M64N5RDye , M64N5RDze , M64N5TAxe , M64N5TAye , M64N5TAze , M64N5TDxss , M64N5TDyss , & - M64N5TDzss , M64N6FKxe , M64N6FKye , M64N6FKze , M64N6FMxe , M64N6FMye , M64N6FMze , & - M64N6MKxe , M64N6MKye , M64N6MKze , M64N6MMxe , M64N6MMye , M64N6MMze , M64N6RAxe , & - M64N6RAye , M64N6RAze , M64N6RDxe , M64N6RDye , M64N6RDze , M64N6TAxe , M64N6TAye , & - M64N6TAze , M64N6TDxss , M64N6TDyss , M64N6TDzss , M64N7FKxe , M64N7FKye , M64N7FKze , & - M64N7FMxe , M64N7FMye , M64N7FMze , M64N7MKxe , M64N7MKye , M64N7MKze , M64N7MMxe , & - M64N7MMye , M64N7MMze , M64N7RAxe , M64N7RAye , M64N7RAze , M64N7RDxe , M64N7RDye , & - M64N7RDze , M64N7TAxe , M64N7TAye , M64N7TAze , M64N7TDxss , M64N7TDyss , M64N7TDzss , & - M64N8FKxe , M64N8FKye , M64N8FKze , M64N8FMxe , M64N8FMye , M64N8FMze , M64N8MKxe , & - M64N8MKye , M64N8MKze , M64N8MMxe , M64N8MMye , M64N8MMze , M64N8RAxe , M64N8RAye , & - M64N8RAze , M64N8RDxe , M64N8RDye , M64N8RDze , M64N8TAxe , M64N8TAye , M64N8TAze , & - M64N8TDxss , M64N8TDyss , M64N8TDzss , M64N9FKxe , M64N9FKye , M64N9FKze , M64N9FMxe , & - M64N9FMye , M64N9FMze , M64N9MKxe , M64N9MKye , M64N9MKze , M64N9MMxe , M64N9MMye , & - M64N9MMze , M64N9RAxe , M64N9RAye , M64N9RAze , M64N9RDxe , M64N9RDye , M64N9RDze , & - M64N9TAxe , M64N9TAye , M64N9TAze , M64N9TDxss , M64N9TDyss , M64N9TDzss , M65N1FKxe , & - M65N1FKye , M65N1FKze , M65N1FMxe , M65N1FMye , M65N1FMze , M65N1MKxe , M65N1MKye , & - M65N1MKze , M65N1MMxe , M65N1MMye , M65N1MMze , M65N1RAxe , M65N1RAye , M65N1RAze , & - M65N1RDxe , M65N1RDye , M65N1RDze , M65N1TAxe , M65N1TAye , M65N1TAze , M65N1TDxss , & - M65N1TDyss , M65N1TDzss , M65N2FKxe , M65N2FKye , M65N2FKze , M65N2FMxe , M65N2FMye , & - M65N2FMze , M65N2MKxe , M65N2MKye , M65N2MKze , M65N2MMxe , M65N2MMye , M65N2MMze , & - M65N2RAxe , M65N2RAye , M65N2RAze , M65N2RDxe , M65N2RDye , M65N2RDze , M65N2TAxe , & - M65N2TAye , M65N2TAze , M65N2TDxss , M65N2TDyss , M65N2TDzss , M65N3FKxe , M65N3FKye , & - M65N3FKze , M65N3FMxe , M65N3FMye , M65N3FMze , M65N3MKxe , M65N3MKye , M65N3MKze , & - M65N3MMxe , M65N3MMye , M65N3MMze , M65N3RAxe , M65N3RAye , M65N3RAze , M65N3RDxe , & - M65N3RDye , M65N3RDze , M65N3TAxe , M65N3TAye , M65N3TAze , M65N3TDxss , M65N3TDyss , & - M65N3TDzss , M65N4FKxe , M65N4FKye , M65N4FKze , M65N4FMxe , M65N4FMye , M65N4FMze , & - M65N4MKxe , M65N4MKye , M65N4MKze , M65N4MMxe , M65N4MMye , M65N4MMze , M65N4RAxe , & - M65N4RAye , M65N4RAze , M65N4RDxe , M65N4RDye , M65N4RDze , M65N4TAxe , M65N4TAye , & - M65N4TAze , M65N4TDxss , M65N4TDyss , M65N4TDzss , M65N5FKxe , M65N5FKye , M65N5FKze , & - M65N5FMxe , M65N5FMye , M65N5FMze , M65N5MKxe , M65N5MKye , M65N5MKze , M65N5MMxe , & - M65N5MMye , M65N5MMze , M65N5RAxe , M65N5RAye , M65N5RAze , M65N5RDxe , M65N5RDye , & - M65N5RDze , M65N5TAxe , M65N5TAye , M65N5TAze , M65N5TDxss , M65N5TDyss , M65N5TDzss , & - M65N6FKxe , M65N6FKye , M65N6FKze , M65N6FMxe , M65N6FMye , M65N6FMze , M65N6MKxe , & - M65N6MKye , M65N6MKze , M65N6MMxe , M65N6MMye , M65N6MMze , M65N6RAxe , M65N6RAye , & - M65N6RAze , M65N6RDxe , M65N6RDye , M65N6RDze , M65N6TAxe , M65N6TAye , M65N6TAze , & - M65N6TDxss , M65N6TDyss , M65N6TDzss , M65N7FKxe , M65N7FKye , M65N7FKze , M65N7FMxe , & - M65N7FMye , M65N7FMze , M65N7MKxe , M65N7MKye , M65N7MKze , M65N7MMxe , M65N7MMye , & - M65N7MMze , M65N7RAxe , M65N7RAye , M65N7RAze , M65N7RDxe , M65N7RDye , M65N7RDze , & - M65N7TAxe , M65N7TAye , M65N7TAze , M65N7TDxss , M65N7TDyss , M65N7TDzss , M65N8FKxe , & - M65N8FKye , M65N8FKze , M65N8FMxe , M65N8FMye , M65N8FMze , M65N8MKxe , M65N8MKye , & - M65N8MKze , M65N8MMxe , M65N8MMye , M65N8MMze , M65N8RAxe , M65N8RAye , M65N8RAze , & - M65N8RDxe , M65N8RDye , M65N8RDze , M65N8TAxe , M65N8TAye , M65N8TAze , M65N8TDxss , & - M65N8TDyss , M65N8TDzss , M65N9FKxe , M65N9FKye , M65N9FKze , M65N9FMxe , M65N9FMye , & - M65N9FMze , M65N9MKxe , M65N9MKye , M65N9MKze , M65N9MMxe , M65N9MMye , M65N9MMze , & - M65N9RAxe , M65N9RAye , M65N9RAze , M65N9RDxe , M65N9RDye , M65N9RDze , M65N9TAxe , & - M65N9TAye , M65N9TAze , M65N9TDxss , M65N9TDyss , M65N9TDzss , M66N1FKxe , M66N1FKye , & - M66N1FKze , M66N1FMxe , M66N1FMye , M66N1FMze , M66N1MKxe , M66N1MKye , M66N1MKze , & - M66N1MMxe , M66N1MMye , M66N1MMze , M66N1RAxe , M66N1RAye , M66N1RAze , M66N1RDxe , & - M66N1RDye , M66N1RDze , M66N1TAxe , M66N1TAye , M66N1TAze , M66N1TDxss , M66N1TDyss , & - M66N1TDzss , M66N2FKxe , M66N2FKye , M66N2FKze , M66N2FMxe , M66N2FMye , M66N2FMze , & - M66N2MKxe , M66N2MKye , M66N2MKze , M66N2MMxe , M66N2MMye , M66N2MMze , M66N2RAxe , & - M66N2RAye , M66N2RAze , M66N2RDxe , M66N2RDye , M66N2RDze , M66N2TAxe , M66N2TAye , & - M66N2TAze , M66N2TDxss , M66N2TDyss , M66N2TDzss , M66N3FKxe , M66N3FKye , M66N3FKze , & - M66N3FMxe , M66N3FMye , M66N3FMze , M66N3MKxe , M66N3MKye , M66N3MKze , M66N3MMxe , & - M66N3MMye , M66N3MMze , M66N3RAxe , M66N3RAye , M66N3RAze , M66N3RDxe , M66N3RDye , & - M66N3RDze , M66N3TAxe , M66N3TAye , M66N3TAze , M66N3TDxss , M66N3TDyss , M66N3TDzss , & - M66N4FKxe , M66N4FKye , M66N4FKze , M66N4FMxe , M66N4FMye , M66N4FMze , M66N4MKxe , & - M66N4MKye , M66N4MKze , M66N4MMxe , M66N4MMye , M66N4MMze , M66N4RAxe , M66N4RAye , & - M66N4RAze , M66N4RDxe , M66N4RDye , M66N4RDze , M66N4TAxe , M66N4TAye , M66N4TAze , & - M66N4TDxss , M66N4TDyss , M66N4TDzss , M66N5FKxe , M66N5FKye , M66N5FKze , M66N5FMxe , & - M66N5FMye , M66N5FMze , M66N5MKxe , M66N5MKye , M66N5MKze , M66N5MMxe , M66N5MMye , & - M66N5MMze , M66N5RAxe , M66N5RAye , M66N5RAze , M66N5RDxe , M66N5RDye , M66N5RDze , & - M66N5TAxe , M66N5TAye , M66N5TAze , M66N5TDxss , M66N5TDyss , M66N5TDzss , M66N6FKxe , & - M66N6FKye , M66N6FKze , M66N6FMxe , M66N6FMye , M66N6FMze , M66N6MKxe , M66N6MKye , & - M66N6MKze , M66N6MMxe , M66N6MMye , M66N6MMze , M66N6RAxe , M66N6RAye , M66N6RAze , & - M66N6RDxe , M66N6RDye , M66N6RDze , M66N6TAxe , M66N6TAye , M66N6TAze , M66N6TDxss , & - M66N6TDyss , M66N6TDzss , M66N7FKxe , M66N7FKye , M66N7FKze , M66N7FMxe , M66N7FMye , & - M66N7FMze , M66N7MKxe , M66N7MKye , M66N7MKze , M66N7MMxe , M66N7MMye , M66N7MMze , & - M66N7RAxe , M66N7RAye , M66N7RAze , M66N7RDxe , M66N7RDye , M66N7RDze , M66N7TAxe , & - M66N7TAye , M66N7TAze , M66N7TDxss , M66N7TDyss , M66N7TDzss , M66N8FKxe , M66N8FKye , & - M66N8FKze , M66N8FMxe , M66N8FMye , M66N8FMze , M66N8MKxe , M66N8MKye , M66N8MKze , & - M66N8MMxe , M66N8MMye , M66N8MMze , M66N8RAxe , M66N8RAye , M66N8RAze , M66N8RDxe , & - M66N8RDye , M66N8RDze , M66N8TAxe , M66N8TAye , M66N8TAze , M66N8TDxss , M66N8TDyss , & - M66N8TDzss , M66N9FKxe , M66N9FKye , M66N9FKze , M66N9FMxe , M66N9FMye , M66N9FMze , & - M66N9MKxe , M66N9MKye , M66N9MKze , M66N9MMxe , M66N9MMye , M66N9MMze , M66N9RAxe , & - M66N9RAye , M66N9RAze , M66N9RDxe , M66N9RDye , M66N9RDze , M66N9TAxe , M66N9TAye , & - M66N9TAze , M66N9TDxss , M66N9TDyss , M66N9TDzss , M67N1FKxe , M67N1FKye , M67N1FKze , & - M67N1FMxe , M67N1FMye , M67N1FMze , M67N1MKxe , M67N1MKye , M67N1MKze , M67N1MMxe , & - M67N1MMye , M67N1MMze , M67N1RAxe , M67N1RAye , M67N1RAze , M67N1RDxe , M67N1RDye , & - M67N1RDze , M67N1TAxe , M67N1TAye , M67N1TAze , M67N1TDxss , M67N1TDyss , M67N1TDzss , & - M67N2FKxe , M67N2FKye , M67N2FKze , M67N2FMxe , M67N2FMye , M67N2FMze , M67N2MKxe , & - M67N2MKye , M67N2MKze , M67N2MMxe , M67N2MMye , M67N2MMze , M67N2RAxe , M67N2RAye , & - M67N2RAze , M67N2RDxe , M67N2RDye , M67N2RDze , M67N2TAxe , M67N2TAye , M67N2TAze , & - M67N2TDxss , M67N2TDyss , M67N2TDzss , M67N3FKxe , M67N3FKye , M67N3FKze , M67N3FMxe , & - M67N3FMye , M67N3FMze , M67N3MKxe , M67N3MKye , M67N3MKze , M67N3MMxe , M67N3MMye , & - M67N3MMze , M67N3RAxe , M67N3RAye , M67N3RAze , M67N3RDxe , M67N3RDye , M67N3RDze , & - M67N3TAxe , M67N3TAye , M67N3TAze , M67N3TDxss , M67N3TDyss , M67N3TDzss , M67N4FKxe , & - M67N4FKye , M67N4FKze , M67N4FMxe , M67N4FMye , M67N4FMze , M67N4MKxe , M67N4MKye , & - M67N4MKze , M67N4MMxe , M67N4MMye , M67N4MMze , M67N4RAxe , M67N4RAye , M67N4RAze , & - M67N4RDxe , M67N4RDye , M67N4RDze , M67N4TAxe , M67N4TAye , M67N4TAze , M67N4TDxss , & - M67N4TDyss , M67N4TDzss , M67N5FKxe , M67N5FKye , M67N5FKze , M67N5FMxe , M67N5FMye , & - M67N5FMze , M67N5MKxe , M67N5MKye , M67N5MKze , M67N5MMxe , M67N5MMye , M67N5MMze , & - M67N5RAxe , M67N5RAye , M67N5RAze , M67N5RDxe , M67N5RDye , M67N5RDze , M67N5TAxe , & - M67N5TAye , M67N5TAze , M67N5TDxss , M67N5TDyss , M67N5TDzss , M67N6FKxe , M67N6FKye , & - M67N6FKze , M67N6FMxe , M67N6FMye , M67N6FMze , M67N6MKxe , M67N6MKye , M67N6MKze , & - M67N6MMxe , M67N6MMye , M67N6MMze , M67N6RAxe , M67N6RAye , M67N6RAze , M67N6RDxe , & - M67N6RDye , M67N6RDze , M67N6TAxe , M67N6TAye , M67N6TAze , M67N6TDxss , M67N6TDyss , & - M67N6TDzss , M67N7FKxe , M67N7FKye , M67N7FKze , M67N7FMxe , M67N7FMye , M67N7FMze , & - M67N7MKxe , M67N7MKye , M67N7MKze , M67N7MMxe , M67N7MMye , M67N7MMze , M67N7RAxe , & - M67N7RAye , M67N7RAze , M67N7RDxe , M67N7RDye , M67N7RDze , M67N7TAxe , M67N7TAye , & - M67N7TAze , M67N7TDxss , M67N7TDyss , M67N7TDzss , M67N8FKxe , M67N8FKye , M67N8FKze , & - M67N8FMxe , M67N8FMye , M67N8FMze , M67N8MKxe , M67N8MKye , M67N8MKze , M67N8MMxe , & - M67N8MMye , M67N8MMze , M67N8RAxe , M67N8RAye , M67N8RAze , M67N8RDxe , M67N8RDye , & - M67N8RDze , M67N8TAxe , M67N8TAye , M67N8TAze , M67N8TDxss , M67N8TDyss , M67N8TDzss , & - M67N9FKxe , M67N9FKye , M67N9FKze , M67N9FMxe , M67N9FMye , M67N9FMze , M67N9MKxe , & - M67N9MKye , M67N9MKze , M67N9MMxe , M67N9MMye , M67N9MMze , M67N9RAxe , M67N9RAye , & - M67N9RAze , M67N9RDxe , M67N9RDye , M67N9RDze , M67N9TAxe , M67N9TAye , M67N9TAze , & - M67N9TDxss , M67N9TDyss , M67N9TDzss , M68N1FKxe , M68N1FKye , M68N1FKze , M68N1FMxe , & - M68N1FMye , M68N1FMze , M68N1MKxe , M68N1MKye , M68N1MKze , M68N1MMxe , M68N1MMye , & - M68N1MMze , M68N1RAxe , M68N1RAye , M68N1RAze , M68N1RDxe , M68N1RDye , M68N1RDze , & - M68N1TAxe , M68N1TAye , M68N1TAze , M68N1TDxss , M68N1TDyss , M68N1TDzss , M68N2FKxe , & - M68N2FKye , M68N2FKze , M68N2FMxe , M68N2FMye , M68N2FMze , M68N2MKxe , M68N2MKye , & - M68N2MKze , M68N2MMxe , M68N2MMye , M68N2MMze , M68N2RAxe , M68N2RAye , M68N2RAze , & - M68N2RDxe , M68N2RDye , M68N2RDze , M68N2TAxe , M68N2TAye , M68N2TAze , M68N2TDxss , & - M68N2TDyss , M68N2TDzss , M68N3FKxe , M68N3FKye , M68N3FKze , M68N3FMxe , M68N3FMye , & - M68N3FMze , M68N3MKxe , M68N3MKye , M68N3MKze , M68N3MMxe , M68N3MMye , M68N3MMze , & - M68N3RAxe , M68N3RAye , M68N3RAze , M68N3RDxe , M68N3RDye , M68N3RDze , M68N3TAxe , & - M68N3TAye , M68N3TAze , M68N3TDxss , M68N3TDyss , M68N3TDzss , M68N4FKxe , M68N4FKye , & - M68N4FKze , M68N4FMxe , M68N4FMye , M68N4FMze , M68N4MKxe , M68N4MKye , M68N4MKze , & - M68N4MMxe , M68N4MMye , M68N4MMze , M68N4RAxe , M68N4RAye , M68N4RAze , M68N4RDxe , & - M68N4RDye , M68N4RDze , M68N4TAxe , M68N4TAye , M68N4TAze , M68N4TDxss , M68N4TDyss , & - M68N4TDzss , M68N5FKxe , M68N5FKye , M68N5FKze , M68N5FMxe , M68N5FMye , M68N5FMze , & - M68N5MKxe , M68N5MKye , M68N5MKze , M68N5MMxe , M68N5MMye , M68N5MMze , M68N5RAxe , & - M68N5RAye , M68N5RAze , M68N5RDxe , M68N5RDye , M68N5RDze , M68N5TAxe , M68N5TAye , & - M68N5TAze , M68N5TDxss , M68N5TDyss , M68N5TDzss , M68N6FKxe , M68N6FKye , M68N6FKze , & - M68N6FMxe , M68N6FMye , M68N6FMze , M68N6MKxe , M68N6MKye , M68N6MKze , M68N6MMxe , & - M68N6MMye , M68N6MMze , M68N6RAxe , M68N6RAye , M68N6RAze , M68N6RDxe , M68N6RDye , & - M68N6RDze , M68N6TAxe , M68N6TAye , M68N6TAze , M68N6TDxss , M68N6TDyss , M68N6TDzss , & - M68N7FKxe , M68N7FKye , M68N7FKze , M68N7FMxe , M68N7FMye , M68N7FMze , M68N7MKxe , & - M68N7MKye , M68N7MKze , M68N7MMxe , M68N7MMye , M68N7MMze , M68N7RAxe , M68N7RAye , & - M68N7RAze , M68N7RDxe , M68N7RDye , M68N7RDze , M68N7TAxe , M68N7TAye , M68N7TAze , & - M68N7TDxss , M68N7TDyss , M68N7TDzss , M68N8FKxe , M68N8FKye , M68N8FKze , M68N8FMxe , & - M68N8FMye , M68N8FMze , M68N8MKxe , M68N8MKye , M68N8MKze , M68N8MMxe , M68N8MMye , & - M68N8MMze , M68N8RAxe , M68N8RAye , M68N8RAze , M68N8RDxe , M68N8RDye , M68N8RDze , & - M68N8TAxe , M68N8TAye , M68N8TAze , M68N8TDxss , M68N8TDyss , M68N8TDzss , M68N9FKxe , & - M68N9FKye , M68N9FKze , M68N9FMxe , M68N9FMye , M68N9FMze , M68N9MKxe , M68N9MKye , & - M68N9MKze , M68N9MMxe , M68N9MMye , M68N9MMze , M68N9RAxe , M68N9RAye , M68N9RAze , & - M68N9RDxe , M68N9RDye , M68N9RDze , M68N9TAxe , M68N9TAye , M68N9TAze , M68N9TDxss , & - M68N9TDyss , M68N9TDzss , M69N1FKxe , M69N1FKye , M69N1FKze , M69N1FMxe , M69N1FMye , & - M69N1FMze , M69N1MKxe , M69N1MKye , M69N1MKze , M69N1MMxe , M69N1MMye , M69N1MMze , & - M69N1RAxe , M69N1RAye , M69N1RAze , M69N1RDxe , M69N1RDye , M69N1RDze , M69N1TAxe , & - M69N1TAye , M69N1TAze , M69N1TDxss , M69N1TDyss , M69N1TDzss , M69N2FKxe , M69N2FKye , & - M69N2FKze , M69N2FMxe , M69N2FMye , M69N2FMze , M69N2MKxe , M69N2MKye , M69N2MKze , & - M69N2MMxe , M69N2MMye , M69N2MMze , M69N2RAxe , M69N2RAye , M69N2RAze , M69N2RDxe , & - M69N2RDye , M69N2RDze , M69N2TAxe , M69N2TAye , M69N2TAze , M69N2TDxss , M69N2TDyss , & - M69N2TDzss , M69N3FKxe , M69N3FKye , M69N3FKze , M69N3FMxe , M69N3FMye , M69N3FMze , & - M69N3MKxe , M69N3MKye , M69N3MKze , M69N3MMxe , M69N3MMye , M69N3MMze , M69N3RAxe , & - M69N3RAye , M69N3RAze , M69N3RDxe , M69N3RDye , M69N3RDze , M69N3TAxe , M69N3TAye , & - M69N3TAze , M69N3TDxss , M69N3TDyss , M69N3TDzss , M69N4FKxe , M69N4FKye , M69N4FKze , & - M69N4FMxe , M69N4FMye , M69N4FMze , M69N4MKxe , M69N4MKye , M69N4MKze , M69N4MMxe , & - M69N4MMye , M69N4MMze , M69N4RAxe , M69N4RAye , M69N4RAze , M69N4RDxe , M69N4RDye , & - M69N4RDze , M69N4TAxe , M69N4TAye , M69N4TAze , M69N4TDxss , M69N4TDyss , M69N4TDzss , & - M69N5FKxe , M69N5FKye , M69N5FKze , M69N5FMxe , M69N5FMye , M69N5FMze , M69N5MKxe , & - M69N5MKye , M69N5MKze , M69N5MMxe , M69N5MMye , M69N5MMze , M69N5RAxe , M69N5RAye , & - M69N5RAze , M69N5RDxe , M69N5RDye , M69N5RDze , M69N5TAxe , M69N5TAye , M69N5TAze , & - M69N5TDxss , M69N5TDyss , M69N5TDzss , M69N6FKxe , M69N6FKye , M69N6FKze , M69N6FMxe , & - M69N6FMye , M69N6FMze , M69N6MKxe , M69N6MKye , M69N6MKze , M69N6MMxe , M69N6MMye , & - M69N6MMze , M69N6RAxe , M69N6RAye , M69N6RAze , M69N6RDxe , M69N6RDye , M69N6RDze , & - M69N6TAxe , M69N6TAye , M69N6TAze , M69N6TDxss , M69N6TDyss , M69N6TDzss , M69N7FKxe , & - M69N7FKye , M69N7FKze , M69N7FMxe , M69N7FMye , M69N7FMze , M69N7MKxe , M69N7MKye , & - M69N7MKze , M69N7MMxe , M69N7MMye , M69N7MMze , M69N7RAxe , M69N7RAye , M69N7RAze , & - M69N7RDxe , M69N7RDye , M69N7RDze , M69N7TAxe , M69N7TAye , M69N7TAze , M69N7TDxss , & - M69N7TDyss , M69N7TDzss , M69N8FKxe , M69N8FKye , M69N8FKze , M69N8FMxe , M69N8FMye , & - M69N8FMze , M69N8MKxe , M69N8MKye , M69N8MKze , M69N8MMxe , M69N8MMye , M69N8MMze , & - M69N8RAxe , M69N8RAye , M69N8RAze , M69N8RDxe , M69N8RDye , M69N8RDze , M69N8TAxe , & - M69N8TAye , M69N8TAze , M69N8TDxss , M69N8TDyss , M69N8TDzss , M69N9FKxe , M69N9FKye , & - M69N9FKze , M69N9FMxe , M69N9FMye , M69N9FMze , M69N9MKxe , M69N9MKye , M69N9MKze , & - M69N9MMxe , M69N9MMye , M69N9MMze , M69N9RAxe , M69N9RAye , M69N9RAze , M69N9RDxe , & - M69N9RDye , M69N9RDze , M69N9TAxe , M69N9TAye , M69N9TAze , M69N9TDxss , M69N9TDyss , & - M69N9TDzss , M70N1FKxe , M70N1FKye , M70N1FKze , M70N1FMxe , M70N1FMye , M70N1FMze , & - M70N1MKxe , M70N1MKye , M70N1MKze , M70N1MMxe , M70N1MMye , M70N1MMze , M70N1RAxe , & - M70N1RAye , M70N1RAze , M70N1RDxe , M70N1RDye , M70N1RDze , M70N1TAxe , M70N1TAye , & - M70N1TAze , M70N1TDxss , M70N1TDyss , M70N1TDzss , M70N2FKxe , M70N2FKye , M70N2FKze , & - M70N2FMxe , M70N2FMye , M70N2FMze , M70N2MKxe , M70N2MKye , M70N2MKze , M70N2MMxe , & - M70N2MMye , M70N2MMze , M70N2RAxe , M70N2RAye , M70N2RAze , M70N2RDxe , M70N2RDye , & - M70N2RDze , M70N2TAxe , M70N2TAye , M70N2TAze , M70N2TDxss , M70N2TDyss , M70N2TDzss , & - M70N3FKxe , M70N3FKye , M70N3FKze , M70N3FMxe , M70N3FMye , M70N3FMze , M70N3MKxe , & - M70N3MKye , M70N3MKze , M70N3MMxe , M70N3MMye , M70N3MMze , M70N3RAxe , M70N3RAye , & - M70N3RAze , M70N3RDxe , M70N3RDye , M70N3RDze , M70N3TAxe , M70N3TAye , M70N3TAze , & - M70N3TDxss , M70N3TDyss , M70N3TDzss , M70N4FKxe , M70N4FKye , M70N4FKze , M70N4FMxe , & - M70N4FMye , M70N4FMze , M70N4MKxe , M70N4MKye , M70N4MKze , M70N4MMxe , M70N4MMye , & - M70N4MMze , M70N4RAxe , M70N4RAye , M70N4RAze , M70N4RDxe , M70N4RDye , M70N4RDze , & - M70N4TAxe , M70N4TAye , M70N4TAze , M70N4TDxss , M70N4TDyss , M70N4TDzss , M70N5FKxe , & - M70N5FKye , M70N5FKze , M70N5FMxe , M70N5FMye , M70N5FMze , M70N5MKxe , M70N5MKye , & - M70N5MKze , M70N5MMxe , M70N5MMye , M70N5MMze /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry10(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M70N5RAxe , M70N5RAye , M70N5RAze , M70N5RDxe , M70N5RDye , M70N5RDze , M70N5TAxe , & - M70N5TAye , M70N5TAze , M70N5TDxss , M70N5TDyss , M70N5TDzss , M70N6FKxe , M70N6FKye , & - M70N6FKze , M70N6FMxe , M70N6FMye , M70N6FMze , M70N6MKxe , M70N6MKye , M70N6MKze , & - M70N6MMxe , M70N6MMye , M70N6MMze , M70N6RAxe , M70N6RAye , M70N6RAze , M70N6RDxe , & - M70N6RDye , M70N6RDze , M70N6TAxe , M70N6TAye , M70N6TAze , M70N6TDxss , M70N6TDyss , & - M70N6TDzss , M70N7FKxe , M70N7FKye , M70N7FKze , M70N7FMxe , M70N7FMye , M70N7FMze , & - M70N7MKxe , M70N7MKye , M70N7MKze , M70N7MMxe , M70N7MMye , M70N7MMze , M70N7RAxe , & - M70N7RAye , M70N7RAze , M70N7RDxe , M70N7RDye , M70N7RDze , M70N7TAxe , M70N7TAye , & - M70N7TAze , M70N7TDxss , M70N7TDyss , M70N7TDzss , M70N8FKxe , M70N8FKye , M70N8FKze , & - M70N8FMxe , M70N8FMye , M70N8FMze , M70N8MKxe , M70N8MKye , M70N8MKze , M70N8MMxe , & - M70N8MMye , M70N8MMze , M70N8RAxe , M70N8RAye , M70N8RAze , M70N8RDxe , M70N8RDye , & - M70N8RDze , M70N8TAxe , M70N8TAye , M70N8TAze , M70N8TDxss , M70N8TDyss , M70N8TDzss , & - M70N9FKxe , M70N9FKye , M70N9FKze , M70N9FMxe , M70N9FMye , M70N9FMze , M70N9MKxe , & - M70N9MKye , M70N9MKze , M70N9MMxe , M70N9MMye , M70N9MMze , M70N9RAxe , M70N9RAye , & - M70N9RAze , M70N9RDxe , M70N9RDye , M70N9RDze , M70N9TAxe , M70N9TAye , M70N9TAze , & - M70N9TDxss , M70N9TDyss , M70N9TDzss , M71N1FKxe , M71N1FKye , M71N1FKze , M71N1FMxe , & - M71N1FMye , M71N1FMze , M71N1MKxe , M71N1MKye , M71N1MKze , M71N1MMxe , M71N1MMye , & - M71N1MMze , M71N1RAxe , M71N1RAye , M71N1RAze , M71N1RDxe , M71N1RDye , M71N1RDze , & - M71N1TAxe , M71N1TAye , M71N1TAze , M71N1TDxss , M71N1TDyss , M71N1TDzss , M71N2FKxe , & - M71N2FKye , M71N2FKze , M71N2FMxe , M71N2FMye , M71N2FMze , M71N2MKxe , M71N2MKye , & - M71N2MKze , M71N2MMxe , M71N2MMye , M71N2MMze , M71N2RAxe , M71N2RAye , M71N2RAze , & - M71N2RDxe , M71N2RDye , M71N2RDze , M71N2TAxe , M71N2TAye , M71N2TAze , M71N2TDxss , & - M71N2TDyss , M71N2TDzss , M71N3FKxe , M71N3FKye , M71N3FKze , M71N3FMxe , M71N3FMye , & - M71N3FMze , M71N3MKxe , M71N3MKye , M71N3MKze , M71N3MMxe , M71N3MMye , M71N3MMze , & - M71N3RAxe , M71N3RAye , M71N3RAze , M71N3RDxe , M71N3RDye , M71N3RDze , M71N3TAxe , & - M71N3TAye , M71N3TAze , M71N3TDxss , M71N3TDyss , M71N3TDzss , M71N4FKxe , M71N4FKye , & - M71N4FKze , M71N4FMxe , M71N4FMye , M71N4FMze , M71N4MKxe , M71N4MKye , M71N4MKze , & - M71N4MMxe , M71N4MMye , M71N4MMze , M71N4RAxe , M71N4RAye , M71N4RAze , M71N4RDxe , & - M71N4RDye , M71N4RDze , M71N4TAxe , M71N4TAye , M71N4TAze , M71N4TDxss , M71N4TDyss , & - M71N4TDzss , M71N5FKxe , M71N5FKye , M71N5FKze , M71N5FMxe , M71N5FMye , M71N5FMze , & - M71N5MKxe , M71N5MKye , M71N5MKze , M71N5MMxe , M71N5MMye , M71N5MMze , M71N5RAxe , & - M71N5RAye , M71N5RAze , M71N5RDxe , M71N5RDye , M71N5RDze , M71N5TAxe , M71N5TAye , & - M71N5TAze , M71N5TDxss , M71N5TDyss , M71N5TDzss , M71N6FKxe , M71N6FKye , M71N6FKze , & - M71N6FMxe , M71N6FMye , M71N6FMze , M71N6MKxe , M71N6MKye , M71N6MKze , M71N6MMxe , & - M71N6MMye , M71N6MMze , M71N6RAxe , M71N6RAye , M71N6RAze , M71N6RDxe , M71N6RDye , & - M71N6RDze , M71N6TAxe , M71N6TAye , M71N6TAze , M71N6TDxss , M71N6TDyss , M71N6TDzss , & - M71N7FKxe , M71N7FKye , M71N7FKze , M71N7FMxe , M71N7FMye , M71N7FMze , M71N7MKxe , & - M71N7MKye , M71N7MKze , M71N7MMxe , M71N7MMye , M71N7MMze , M71N7RAxe , M71N7RAye , & - M71N7RAze , M71N7RDxe , M71N7RDye , M71N7RDze , M71N7TAxe , M71N7TAye , M71N7TAze , & - M71N7TDxss , M71N7TDyss , M71N7TDzss , M71N8FKxe , M71N8FKye , M71N8FKze , M71N8FMxe , & - M71N8FMye , M71N8FMze , M71N8MKxe , M71N8MKye , M71N8MKze , M71N8MMxe , M71N8MMye , & - M71N8MMze , M71N8RAxe , M71N8RAye , M71N8RAze , M71N8RDxe , M71N8RDye , M71N8RDze , & - M71N8TAxe , M71N8TAye , M71N8TAze , M71N8TDxss , M71N8TDyss , M71N8TDzss , M71N9FKxe , & - M71N9FKye , M71N9FKze , M71N9FMxe , M71N9FMye , M71N9FMze , M71N9MKxe , M71N9MKye , & - M71N9MKze , M71N9MMxe , M71N9MMye , M71N9MMze , M71N9RAxe , M71N9RAye , M71N9RAze , & - M71N9RDxe , M71N9RDye , M71N9RDze , M71N9TAxe , M71N9TAye , M71N9TAze , M71N9TDxss , & - M71N9TDyss , M71N9TDzss , M72N1FKxe , M72N1FKye , M72N1FKze , M72N1FMxe , M72N1FMye , & - M72N1FMze , M72N1MKxe , M72N1MKye , M72N1MKze , M72N1MMxe , M72N1MMye , M72N1MMze , & - M72N1RAxe , M72N1RAye , M72N1RAze , M72N1RDxe , M72N1RDye , M72N1RDze , M72N1TAxe , & - M72N1TAye , M72N1TAze , M72N1TDxss , M72N1TDyss , M72N1TDzss , M72N2FKxe , M72N2FKye , & - M72N2FKze , M72N2FMxe , M72N2FMye , M72N2FMze , M72N2MKxe , M72N2MKye , M72N2MKze , & - M72N2MMxe , M72N2MMye , M72N2MMze , M72N2RAxe , M72N2RAye , M72N2RAze , M72N2RDxe , & - M72N2RDye , M72N2RDze , M72N2TAxe , M72N2TAye , M72N2TAze , M72N2TDxss , M72N2TDyss , & - M72N2TDzss , M72N3FKxe , M72N3FKye , M72N3FKze , M72N3FMxe , M72N3FMye , M72N3FMze , & - M72N3MKxe , M72N3MKye , M72N3MKze , M72N3MMxe , M72N3MMye , M72N3MMze , M72N3RAxe , & - M72N3RAye , M72N3RAze , M72N3RDxe , M72N3RDye , M72N3RDze , M72N3TAxe , M72N3TAye , & - M72N3TAze , M72N3TDxss , M72N3TDyss , M72N3TDzss , M72N4FKxe , M72N4FKye , M72N4FKze , & - M72N4FMxe , M72N4FMye , M72N4FMze , M72N4MKxe , M72N4MKye , M72N4MKze , M72N4MMxe , & - M72N4MMye , M72N4MMze , M72N4RAxe , M72N4RAye , M72N4RAze , M72N4RDxe , M72N4RDye , & - M72N4RDze , M72N4TAxe , M72N4TAye , M72N4TAze , M72N4TDxss , M72N4TDyss , M72N4TDzss , & - M72N5FKxe , M72N5FKye , M72N5FKze , M72N5FMxe , M72N5FMye , M72N5FMze , M72N5MKxe , & - M72N5MKye , M72N5MKze , M72N5MMxe , M72N5MMye , M72N5MMze , M72N5RAxe , M72N5RAye , & - M72N5RAze , M72N5RDxe , M72N5RDye , M72N5RDze , M72N5TAxe , M72N5TAye , M72N5TAze , & - M72N5TDxss , M72N5TDyss , M72N5TDzss , M72N6FKxe , M72N6FKye , M72N6FKze , M72N6FMxe , & - M72N6FMye , M72N6FMze , M72N6MKxe , M72N6MKye , M72N6MKze , M72N6MMxe , M72N6MMye , & - M72N6MMze , M72N6RAxe , M72N6RAye , M72N6RAze , M72N6RDxe , M72N6RDye , M72N6RDze , & - M72N6TAxe , M72N6TAye , M72N6TAze , M72N6TDxss , M72N6TDyss , M72N6TDzss , M72N7FKxe , & - M72N7FKye , M72N7FKze , M72N7FMxe , M72N7FMye , M72N7FMze , M72N7MKxe , M72N7MKye , & - M72N7MKze , M72N7MMxe , M72N7MMye , M72N7MMze , M72N7RAxe , M72N7RAye , M72N7RAze , & - M72N7RDxe , M72N7RDye , M72N7RDze , M72N7TAxe , M72N7TAye , M72N7TAze , M72N7TDxss , & - M72N7TDyss , M72N7TDzss , M72N8FKxe , M72N8FKye , M72N8FKze , M72N8FMxe , M72N8FMye , & - M72N8FMze , M72N8MKxe , M72N8MKye , M72N8MKze , M72N8MMxe , M72N8MMye , M72N8MMze , & - M72N8RAxe , M72N8RAye , M72N8RAze , M72N8RDxe , M72N8RDye , M72N8RDze , M72N8TAxe , & - M72N8TAye , M72N8TAze , M72N8TDxss , M72N8TDyss , M72N8TDzss , M72N9FKxe , M72N9FKye , & - M72N9FKze , M72N9FMxe , M72N9FMye , M72N9FMze , M72N9MKxe , M72N9MKye , M72N9MKze , & - M72N9MMxe , M72N9MMye , M72N9MMze , M72N9RAxe , M72N9RAye , M72N9RAze , M72N9RDxe , & - M72N9RDye , M72N9RDze , M72N9TAxe , M72N9TAye , M72N9TAze , M72N9TDxss , M72N9TDyss , & - M72N9TDzss , M73N1FKxe , M73N1FKye , M73N1FKze , M73N1FMxe , M73N1FMye , M73N1FMze , & - M73N1MKxe , M73N1MKye , M73N1MKze , M73N1MMxe , M73N1MMye , M73N1MMze , M73N1RAxe , & - M73N1RAye , M73N1RAze , M73N1RDxe , M73N1RDye , M73N1RDze , M73N1TAxe , M73N1TAye , & - M73N1TAze , M73N1TDxss , M73N1TDyss , M73N1TDzss , M73N2FKxe , M73N2FKye , M73N2FKze , & - M73N2FMxe , M73N2FMye , M73N2FMze , M73N2MKxe , M73N2MKye , M73N2MKze , M73N2MMxe , & - M73N2MMye , M73N2MMze , M73N2RAxe , M73N2RAye , M73N2RAze , M73N2RDxe , M73N2RDye , & - M73N2RDze , M73N2TAxe , M73N2TAye , M73N2TAze , M73N2TDxss , M73N2TDyss , M73N2TDzss , & - M73N3FKxe , M73N3FKye , M73N3FKze , M73N3FMxe , M73N3FMye , M73N3FMze , M73N3MKxe , & - M73N3MKye , M73N3MKze , M73N3MMxe , M73N3MMye , M73N3MMze , M73N3RAxe , M73N3RAye , & - M73N3RAze , M73N3RDxe , M73N3RDye , M73N3RDze , M73N3TAxe , M73N3TAye , M73N3TAze , & - M73N3TDxss , M73N3TDyss , M73N3TDzss , M73N4FKxe , M73N4FKye , M73N4FKze , M73N4FMxe , & - M73N4FMye , M73N4FMze , M73N4MKxe , M73N4MKye , M73N4MKze , M73N4MMxe , M73N4MMye , & - M73N4MMze , M73N4RAxe , M73N4RAye , M73N4RAze , M73N4RDxe , M73N4RDye , M73N4RDze , & - M73N4TAxe , M73N4TAye , M73N4TAze , M73N4TDxss , M73N4TDyss , M73N4TDzss , M73N5FKxe , & - M73N5FKye , M73N5FKze , M73N5FMxe , M73N5FMye , M73N5FMze , M73N5MKxe , M73N5MKye , & - M73N5MKze , M73N5MMxe , M73N5MMye , M73N5MMze , M73N5RAxe , M73N5RAye , M73N5RAze , & - M73N5RDxe , M73N5RDye , M73N5RDze , M73N5TAxe , M73N5TAye , M73N5TAze , M73N5TDxss , & - M73N5TDyss , M73N5TDzss , M73N6FKxe , M73N6FKye , M73N6FKze , M73N6FMxe , M73N6FMye , & - M73N6FMze , M73N6MKxe , M73N6MKye , M73N6MKze , M73N6MMxe , M73N6MMye , M73N6MMze , & - M73N6RAxe , M73N6RAye , M73N6RAze , M73N6RDxe , M73N6RDye , M73N6RDze , M73N6TAxe , & - M73N6TAye , M73N6TAze , M73N6TDxss , M73N6TDyss , M73N6TDzss , M73N7FKxe , M73N7FKye , & - M73N7FKze , M73N7FMxe , M73N7FMye , M73N7FMze , M73N7MKxe , M73N7MKye , M73N7MKze , & - M73N7MMxe , M73N7MMye , M73N7MMze , M73N7RAxe , M73N7RAye , M73N7RAze , M73N7RDxe , & - M73N7RDye , M73N7RDze , M73N7TAxe , M73N7TAye , M73N7TAze , M73N7TDxss , M73N7TDyss , & - M73N7TDzss , M73N8FKxe , M73N8FKye , M73N8FKze , M73N8FMxe , M73N8FMye , M73N8FMze , & - M73N8MKxe , M73N8MKye , M73N8MKze , M73N8MMxe , M73N8MMye , M73N8MMze , M73N8RAxe , & - M73N8RAye , M73N8RAze , M73N8RDxe , M73N8RDye , M73N8RDze , M73N8TAxe , M73N8TAye , & - M73N8TAze , M73N8TDxss , M73N8TDyss , M73N8TDzss , M73N9FKxe , M73N9FKye , M73N9FKze , & - M73N9FMxe , M73N9FMye , M73N9FMze , M73N9MKxe , M73N9MKye , M73N9MKze , M73N9MMxe , & - M73N9MMye , M73N9MMze , M73N9RAxe , M73N9RAye , M73N9RAze , M73N9RDxe , M73N9RDye , & - M73N9RDze , M73N9TAxe , M73N9TAye , M73N9TAze , M73N9TDxss , M73N9TDyss , M73N9TDzss , & - M74N1FKxe , M74N1FKye , M74N1FKze , M74N1FMxe , M74N1FMye , M74N1FMze , M74N1MKxe , & - M74N1MKye , M74N1MKze , M74N1MMxe , M74N1MMye , M74N1MMze , M74N1RAxe , M74N1RAye , & - M74N1RAze , M74N1RDxe , M74N1RDye , M74N1RDze , M74N1TAxe , M74N1TAye , M74N1TAze , & - M74N1TDxss , M74N1TDyss , M74N1TDzss , M74N2FKxe , M74N2FKye , M74N2FKze , M74N2FMxe , & - M74N2FMye , M74N2FMze , M74N2MKxe , M74N2MKye , M74N2MKze , M74N2MMxe , M74N2MMye , & - M74N2MMze , M74N2RAxe , M74N2RAye , M74N2RAze , M74N2RDxe , M74N2RDye , M74N2RDze , & - M74N2TAxe , M74N2TAye , M74N2TAze , M74N2TDxss , M74N2TDyss , M74N2TDzss , M74N3FKxe , & - M74N3FKye , M74N3FKze , M74N3FMxe , M74N3FMye , M74N3FMze , M74N3MKxe , M74N3MKye , & - M74N3MKze , M74N3MMxe , M74N3MMye , M74N3MMze , M74N3RAxe , M74N3RAye , M74N3RAze , & - M74N3RDxe , M74N3RDye , M74N3RDze , M74N3TAxe , M74N3TAye , M74N3TAze , M74N3TDxss , & - M74N3TDyss , M74N3TDzss , M74N4FKxe , M74N4FKye , M74N4FKze , M74N4FMxe , M74N4FMye , & - M74N4FMze , M74N4MKxe , M74N4MKye , M74N4MKze , M74N4MMxe , M74N4MMye , M74N4MMze , & - M74N4RAxe , M74N4RAye , M74N4RAze , M74N4RDxe , M74N4RDye , M74N4RDze , M74N4TAxe , & - M74N4TAye , M74N4TAze , M74N4TDxss , M74N4TDyss , M74N4TDzss , M74N5FKxe , M74N5FKye , & - M74N5FKze , M74N5FMxe , M74N5FMye , M74N5FMze , M74N5MKxe , M74N5MKye , M74N5MKze , & - M74N5MMxe , M74N5MMye , M74N5MMze , M74N5RAxe , M74N5RAye , M74N5RAze , M74N5RDxe , & - M74N5RDye , M74N5RDze , M74N5TAxe , M74N5TAye , M74N5TAze , M74N5TDxss , M74N5TDyss , & - M74N5TDzss , M74N6FKxe , M74N6FKye , M74N6FKze , M74N6FMxe , M74N6FMye , M74N6FMze , & - M74N6MKxe , M74N6MKye , M74N6MKze , M74N6MMxe , M74N6MMye , M74N6MMze , M74N6RAxe , & - M74N6RAye , M74N6RAze , M74N6RDxe , M74N6RDye , M74N6RDze , M74N6TAxe , M74N6TAye , & - M74N6TAze , M74N6TDxss , M74N6TDyss , M74N6TDzss , M74N7FKxe , M74N7FKye , M74N7FKze , & - M74N7FMxe , M74N7FMye , M74N7FMze , M74N7MKxe , M74N7MKye , M74N7MKze , M74N7MMxe , & - M74N7MMye , M74N7MMze , M74N7RAxe , M74N7RAye , M74N7RAze , M74N7RDxe , M74N7RDye , & - M74N7RDze , M74N7TAxe , M74N7TAye , M74N7TAze , M74N7TDxss , M74N7TDyss , M74N7TDzss , & - M74N8FKxe , M74N8FKye , M74N8FKze , M74N8FMxe , M74N8FMye , M74N8FMze , M74N8MKxe , & - M74N8MKye , M74N8MKze , M74N8MMxe , M74N8MMye , M74N8MMze , M74N8RAxe , M74N8RAye , & - M74N8RAze , M74N8RDxe , M74N8RDye , M74N8RDze , M74N8TAxe , M74N8TAye , M74N8TAze , & - M74N8TDxss , M74N8TDyss , M74N8TDzss , M74N9FKxe , M74N9FKye , M74N9FKze , M74N9FMxe , & - M74N9FMye , M74N9FMze , M74N9MKxe , M74N9MKye , M74N9MKze , M74N9MMxe , M74N9MMye , & - M74N9MMze , M74N9RAxe , M74N9RAye , M74N9RAze , M74N9RDxe , M74N9RDye , M74N9RDze , & - M74N9TAxe , M74N9TAye , M74N9TAze , M74N9TDxss , M74N9TDyss , M74N9TDzss , M75N1FKxe , & - M75N1FKye , M75N1FKze , M75N1FMxe , M75N1FMye , M75N1FMze , M75N1MKxe , M75N1MKye , & - M75N1MKze , M75N1MMxe , M75N1MMye , M75N1MMze , M75N1RAxe , M75N1RAye , M75N1RAze , & - M75N1RDxe , M75N1RDye , M75N1RDze , M75N1TAxe , M75N1TAye , M75N1TAze , M75N1TDxss , & - M75N1TDyss , M75N1TDzss , M75N2FKxe , M75N2FKye , M75N2FKze , M75N2FMxe , M75N2FMye , & - M75N2FMze , M75N2MKxe , M75N2MKye , M75N2MKze , M75N2MMxe , M75N2MMye , M75N2MMze , & - M75N2RAxe , M75N2RAye , M75N2RAze , M75N2RDxe , M75N2RDye , M75N2RDze , M75N2TAxe , & - M75N2TAye , M75N2TAze , M75N2TDxss , M75N2TDyss , M75N2TDzss , M75N3FKxe , M75N3FKye , & - M75N3FKze , M75N3FMxe , M75N3FMye , M75N3FMze , M75N3MKxe , M75N3MKye , M75N3MKze , & - M75N3MMxe , M75N3MMye , M75N3MMze , M75N3RAxe , M75N3RAye , M75N3RAze , M75N3RDxe , & - M75N3RDye , M75N3RDze , M75N3TAxe , M75N3TAye , M75N3TAze , M75N3TDxss , M75N3TDyss , & - M75N3TDzss , M75N4FKxe , M75N4FKye , M75N4FKze , M75N4FMxe , M75N4FMye , M75N4FMze , & - M75N4MKxe , M75N4MKye , M75N4MKze , M75N4MMxe , M75N4MMye , M75N4MMze , M75N4RAxe , & - M75N4RAye , M75N4RAze , M75N4RDxe , M75N4RDye , M75N4RDze , M75N4TAxe , M75N4TAye , & - M75N4TAze , M75N4TDxss , M75N4TDyss , M75N4TDzss , M75N5FKxe , M75N5FKye , M75N5FKze , & - M75N5FMxe , M75N5FMye , M75N5FMze , M75N5MKxe , M75N5MKye , M75N5MKze , M75N5MMxe , & - M75N5MMye , M75N5MMze , M75N5RAxe , M75N5RAye , M75N5RAze , M75N5RDxe , M75N5RDye , & - M75N5RDze , M75N5TAxe , M75N5TAye , M75N5TAze , M75N5TDxss , M75N5TDyss , M75N5TDzss , & - M75N6FKxe , M75N6FKye , M75N6FKze , M75N6FMxe , M75N6FMye , M75N6FMze , M75N6MKxe , & - M75N6MKye , M75N6MKze , M75N6MMxe , M75N6MMye , M75N6MMze , M75N6RAxe , M75N6RAye , & - M75N6RAze , M75N6RDxe , M75N6RDye , M75N6RDze , M75N6TAxe , M75N6TAye , M75N6TAze , & - M75N6TDxss , M75N6TDyss , M75N6TDzss , M75N7FKxe , M75N7FKye , M75N7FKze , M75N7FMxe , & - M75N7FMye , M75N7FMze , M75N7MKxe , M75N7MKye , M75N7MKze , M75N7MMxe , M75N7MMye , & - M75N7MMze , M75N7RAxe , M75N7RAye , M75N7RAze , M75N7RDxe , M75N7RDye , M75N7RDze , & - M75N7TAxe , M75N7TAye , M75N7TAze , M75N7TDxss , M75N7TDyss , M75N7TDzss , M75N8FKxe , & - M75N8FKye , M75N8FKze , M75N8FMxe , M75N8FMye , M75N8FMze , M75N8MKxe , M75N8MKye , & - M75N8MKze , M75N8MMxe , M75N8MMye , M75N8MMze , M75N8RAxe , M75N8RAye , M75N8RAze , & - M75N8RDxe , M75N8RDye , M75N8RDze , M75N8TAxe , M75N8TAye , M75N8TAze , M75N8TDxss , & - M75N8TDyss , M75N8TDzss , M75N9FKxe , M75N9FKye , M75N9FKze , M75N9FMxe , M75N9FMye , & - M75N9FMze , M75N9MKxe , M75N9MKye , M75N9MKze , M75N9MMxe , M75N9MMye , M75N9MMze , & - M75N9RAxe , M75N9RAye , M75N9RAze , M75N9RDxe , M75N9RDye , M75N9RDze , M75N9TAxe , & - M75N9TAye , M75N9TAze , M75N9TDxss , M75N9TDyss , M75N9TDzss , M76N1FKxe , M76N1FKye , & - M76N1FKze , M76N1FMxe , M76N1FMye , M76N1FMze , M76N1MKxe , M76N1MKye , M76N1MKze , & - M76N1MMxe , M76N1MMye , M76N1MMze , M76N1RAxe , M76N1RAye , M76N1RAze , M76N1RDxe , & - M76N1RDye , M76N1RDze , M76N1TAxe , M76N1TAye , M76N1TAze , M76N1TDxss , M76N1TDyss , & - M76N1TDzss , M76N2FKxe , M76N2FKye , M76N2FKze , M76N2FMxe , M76N2FMye , M76N2FMze , & - M76N2MKxe , M76N2MKye , M76N2MKze , M76N2MMxe , M76N2MMye , M76N2MMze , M76N2RAxe , & - M76N2RAye , M76N2RAze , M76N2RDxe , M76N2RDye , M76N2RDze , M76N2TAxe , M76N2TAye , & - M76N2TAze , M76N2TDxss , M76N2TDyss , M76N2TDzss , M76N3FKxe , M76N3FKye , M76N3FKze , & - M76N3FMxe , M76N3FMye , M76N3FMze , M76N3MKxe , M76N3MKye , M76N3MKze , M76N3MMxe , & - M76N3MMye , M76N3MMze , M76N3RAxe , M76N3RAye , M76N3RAze , M76N3RDxe , M76N3RDye , & - M76N3RDze , M76N3TAxe , M76N3TAye , M76N3TAze , M76N3TDxss , M76N3TDyss , M76N3TDzss , & - M76N4FKxe , M76N4FKye , M76N4FKze , M76N4FMxe , M76N4FMye , M76N4FMze , M76N4MKxe , & - M76N4MKye , M76N4MKze , M76N4MMxe , M76N4MMye , M76N4MMze , M76N4RAxe , M76N4RAye , & - M76N4RAze , M76N4RDxe , M76N4RDye , M76N4RDze , M76N4TAxe , M76N4TAye , M76N4TAze , & - M76N4TDxss , M76N4TDyss , M76N4TDzss , M76N5FKxe , M76N5FKye , M76N5FKze , M76N5FMxe , & - M76N5FMye , M76N5FMze , M76N5MKxe , M76N5MKye , M76N5MKze , M76N5MMxe , M76N5MMye , & - M76N5MMze , M76N5RAxe , M76N5RAye , M76N5RAze , M76N5RDxe , M76N5RDye , M76N5RDze , & - M76N5TAxe , M76N5TAye , M76N5TAze , M76N5TDxss , M76N5TDyss , M76N5TDzss , M76N6FKxe , & - M76N6FKye , M76N6FKze , M76N6FMxe , M76N6FMye , M76N6FMze , M76N6MKxe , M76N6MKye , & - M76N6MKze , M76N6MMxe , M76N6MMye , M76N6MMze , M76N6RAxe , M76N6RAye , M76N6RAze , & - M76N6RDxe , M76N6RDye , M76N6RDze , M76N6TAxe , M76N6TAye , M76N6TAze , M76N6TDxss , & - M76N6TDyss , M76N6TDzss , M76N7FKxe , M76N7FKye , M76N7FKze , M76N7FMxe , M76N7FMye , & - M76N7FMze , M76N7MKxe , M76N7MKye , M76N7MKze , M76N7MMxe , M76N7MMye , M76N7MMze , & - M76N7RAxe , M76N7RAye , M76N7RAze , M76N7RDxe , M76N7RDye , M76N7RDze , M76N7TAxe , & - M76N7TAye , M76N7TAze , M76N7TDxss , M76N7TDyss , M76N7TDzss , M76N8FKxe , M76N8FKye , & - M76N8FKze , M76N8FMxe , M76N8FMye , M76N8FMze , M76N8MKxe , M76N8MKye , M76N8MKze , & - M76N8MMxe , M76N8MMye , M76N8MMze , M76N8RAxe , M76N8RAye , M76N8RAze , M76N8RDxe , & - M76N8RDye , M76N8RDze , M76N8TAxe , M76N8TAye , M76N8TAze , M76N8TDxss , M76N8TDyss , & - M76N8TDzss , M76N9FKxe , M76N9FKye , M76N9FKze , M76N9FMxe , M76N9FMye , M76N9FMze , & - M76N9MKxe , M76N9MKye , M76N9MKze , M76N9MMxe , M76N9MMye , M76N9MMze , M76N9RAxe , & - M76N9RAye , M76N9RAze , M76N9RDxe , M76N9RDye , M76N9RDze , M76N9TAxe , M76N9TAye , & - M76N9TAze , M76N9TDxss , M76N9TDyss , M76N9TDzss , M77N1FKxe , M77N1FKye , M77N1FKze , & - M77N1FMxe , M77N1FMye , M77N1FMze , M77N1MKxe , M77N1MKye , M77N1MKze , M77N1MMxe , & - M77N1MMye , M77N1MMze , M77N1RAxe , M77N1RAye , M77N1RAze , M77N1RDxe , M77N1RDye , & - M77N1RDze , M77N1TAxe , M77N1TAye , M77N1TAze , M77N1TDxss , M77N1TDyss , M77N1TDzss , & - M77N2FKxe , M77N2FKye , M77N2FKze , M77N2FMxe , M77N2FMye , M77N2FMze , M77N2MKxe , & - M77N2MKye , M77N2MKze , M77N2MMxe , M77N2MMye , M77N2MMze , M77N2RAxe , M77N2RAye , & - M77N2RAze , M77N2RDxe , M77N2RDye , M77N2RDze , M77N2TAxe , M77N2TAye , M77N2TAze , & - M77N2TDxss , M77N2TDyss , M77N2TDzss , M77N3FKxe , M77N3FKye , M77N3FKze , M77N3FMxe , & - M77N3FMye , M77N3FMze , M77N3MKxe , M77N3MKye , M77N3MKze , M77N3MMxe , M77N3MMye , & - M77N3MMze , M77N3RAxe , M77N3RAye , M77N3RAze , M77N3RDxe , M77N3RDye , M77N3RDze , & - M77N3TAxe , M77N3TAye , M77N3TAze , M77N3TDxss , M77N3TDyss , M77N3TDzss , M77N4FKxe , & - M77N4FKye , M77N4FKze , M77N4FMxe , M77N4FMye , M77N4FMze , M77N4MKxe , M77N4MKye , & - M77N4MKze , M77N4MMxe , M77N4MMye , M77N4MMze , M77N4RAxe , M77N4RAye , M77N4RAze , & - M77N4RDxe , M77N4RDye , M77N4RDze , M77N4TAxe , M77N4TAye , M77N4TAze , M77N4TDxss , & - M77N4TDyss , M77N4TDzss , M77N5FKxe , M77N5FKye , M77N5FKze , M77N5FMxe , M77N5FMye , & - M77N5FMze , M77N5MKxe , M77N5MKye , M77N5MKze , M77N5MMxe , M77N5MMye , M77N5MMze , & - M77N5RAxe , M77N5RAye , M77N5RAze , M77N5RDxe , M77N5RDye , M77N5RDze , M77N5TAxe , & - M77N5TAye , M77N5TAze , M77N5TDxss , M77N5TDyss , M77N5TDzss , M77N6FKxe , M77N6FKye , & - M77N6FKze , M77N6FMxe , M77N6FMye , M77N6FMze , M77N6MKxe , M77N6MKye , M77N6MKze , & - M77N6MMxe , M77N6MMye , M77N6MMze , M77N6RAxe , M77N6RAye , M77N6RAze , M77N6RDxe , & - M77N6RDye , M77N6RDze , M77N6TAxe , M77N6TAye , M77N6TAze , M77N6TDxss , M77N6TDyss , & - M77N6TDzss , M77N7FKxe , M77N7FKye , M77N7FKze , M77N7FMxe , M77N7FMye , M77N7FMze , & - M77N7MKxe , M77N7MKye , M77N7MKze , M77N7MMxe , M77N7MMye , M77N7MMze , M77N7RAxe , & - M77N7RAye , M77N7RAze , M77N7RDxe , M77N7RDye , M77N7RDze , M77N7TAxe , M77N7TAye , & - M77N7TAze , M77N7TDxss , M77N7TDyss , M77N7TDzss , M77N8FKxe , M77N8FKye , M77N8FKze , & - M77N8FMxe , M77N8FMye , M77N8FMze , M77N8MKxe , M77N8MKye , M77N8MKze , M77N8MMxe , & - M77N8MMye , M77N8MMze , M77N8RAxe , M77N8RAye , M77N8RAze , M77N8RDxe , M77N8RDye , & - M77N8RDze , M77N8TAxe , M77N8TAye , M77N8TAze , M77N8TDxss , M77N8TDyss , M77N8TDzss , & - M77N9FKxe , M77N9FKye , M77N9FKze , M77N9FMxe , M77N9FMye , M77N9FMze , M77N9MKxe , & - M77N9MKye , M77N9MKze , M77N9MMxe , M77N9MMye , M77N9MMze , M77N9RAxe , M77N9RAye , & - M77N9RAze , M77N9RDxe , M77N9RDye , M77N9RDze , M77N9TAxe , M77N9TAye , M77N9TAze , & - M77N9TDxss , M77N9TDyss , M77N9TDzss , M78N1FKxe , M78N1FKye , M78N1FKze , M78N1FMxe , & - M78N1FMye , M78N1FMze , M78N1MKxe , M78N1MKye , M78N1MKze , M78N1MMxe , M78N1MMye , & - M78N1MMze , M78N1RAxe , M78N1RAye , M78N1RAze , M78N1RDxe , M78N1RDye , M78N1RDze , & - M78N1TAxe , M78N1TAye , M78N1TAze , M78N1TDxss , M78N1TDyss , M78N1TDzss , M78N2FKxe , & - M78N2FKye , M78N2FKze , M78N2FMxe , M78N2FMye , M78N2FMze , M78N2MKxe , M78N2MKye , & - M78N2MKze , M78N2MMxe , M78N2MMye , M78N2MMze , M78N2RAxe , M78N2RAye , M78N2RAze , & - M78N2RDxe , M78N2RDye , M78N2RDze , M78N2TAxe , M78N2TAye , M78N2TAze , M78N2TDxss , & - M78N2TDyss , M78N2TDzss , M78N3FKxe , M78N3FKye /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry11(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M78N3FKze , M78N3FMxe , M78N3FMye , M78N3FMze , M78N3MKxe , M78N3MKye , M78N3MKze , & - M78N3MMxe , M78N3MMye , M78N3MMze , M78N3RAxe , M78N3RAye , M78N3RAze , M78N3RDxe , & - M78N3RDye , M78N3RDze , M78N3TAxe , M78N3TAye , M78N3TAze , M78N3TDxss , M78N3TDyss , & - M78N3TDzss , M78N4FKxe , M78N4FKye , M78N4FKze , M78N4FMxe , M78N4FMye , M78N4FMze , & - M78N4MKxe , M78N4MKye , M78N4MKze , M78N4MMxe , M78N4MMye , M78N4MMze , M78N4RAxe , & - M78N4RAye , M78N4RAze , M78N4RDxe , M78N4RDye , M78N4RDze , M78N4TAxe , M78N4TAye , & - M78N4TAze , M78N4TDxss , M78N4TDyss , M78N4TDzss , M78N5FKxe , M78N5FKye , M78N5FKze , & - M78N5FMxe , M78N5FMye , M78N5FMze , M78N5MKxe , M78N5MKye , M78N5MKze , M78N5MMxe , & - M78N5MMye , M78N5MMze , M78N5RAxe , M78N5RAye , M78N5RAze , M78N5RDxe , M78N5RDye , & - M78N5RDze , M78N5TAxe , M78N5TAye , M78N5TAze , M78N5TDxss , M78N5TDyss , M78N5TDzss , & - M78N6FKxe , M78N6FKye , M78N6FKze , M78N6FMxe , M78N6FMye , M78N6FMze , M78N6MKxe , & - M78N6MKye , M78N6MKze , M78N6MMxe , M78N6MMye , M78N6MMze , M78N6RAxe , M78N6RAye , & - M78N6RAze , M78N6RDxe , M78N6RDye , M78N6RDze , M78N6TAxe , M78N6TAye , M78N6TAze , & - M78N6TDxss , M78N6TDyss , M78N6TDzss , M78N7FKxe , M78N7FKye , M78N7FKze , M78N7FMxe , & - M78N7FMye , M78N7FMze , M78N7MKxe , M78N7MKye , M78N7MKze , M78N7MMxe , M78N7MMye , & - M78N7MMze , M78N7RAxe , M78N7RAye , M78N7RAze , M78N7RDxe , M78N7RDye , M78N7RDze , & - M78N7TAxe , M78N7TAye , M78N7TAze , M78N7TDxss , M78N7TDyss , M78N7TDzss , M78N8FKxe , & - M78N8FKye , M78N8FKze , M78N8FMxe , M78N8FMye , M78N8FMze , M78N8MKxe , M78N8MKye , & - M78N8MKze , M78N8MMxe , M78N8MMye , M78N8MMze , M78N8RAxe , M78N8RAye , M78N8RAze , & - M78N8RDxe , M78N8RDye , M78N8RDze , M78N8TAxe , M78N8TAye , M78N8TAze , M78N8TDxss , & - M78N8TDyss , M78N8TDzss , M78N9FKxe , M78N9FKye , M78N9FKze , M78N9FMxe , M78N9FMye , & - M78N9FMze , M78N9MKxe , M78N9MKye , M78N9MKze , M78N9MMxe , M78N9MMye , M78N9MMze , & - M78N9RAxe , M78N9RAye , M78N9RAze , M78N9RDxe , M78N9RDye , M78N9RDze , M78N9TAxe , & - M78N9TAye , M78N9TAze , M78N9TDxss , M78N9TDyss , M78N9TDzss , M79N1FKxe , M79N1FKye , & - M79N1FKze , M79N1FMxe , M79N1FMye , M79N1FMze , M79N1MKxe , M79N1MKye , M79N1MKze , & - M79N1MMxe , M79N1MMye , M79N1MMze , M79N1RAxe , M79N1RAye , M79N1RAze , M79N1RDxe , & - M79N1RDye , M79N1RDze , M79N1TAxe , M79N1TAye , M79N1TAze , M79N1TDxss , M79N1TDyss , & - M79N1TDzss , M79N2FKxe , M79N2FKye , M79N2FKze , M79N2FMxe , M79N2FMye , M79N2FMze , & - M79N2MKxe , M79N2MKye , M79N2MKze , M79N2MMxe , M79N2MMye , M79N2MMze , M79N2RAxe , & - M79N2RAye , M79N2RAze , M79N2RDxe , M79N2RDye , M79N2RDze , M79N2TAxe , M79N2TAye , & - M79N2TAze , M79N2TDxss , M79N2TDyss , M79N2TDzss , M79N3FKxe , M79N3FKye , M79N3FKze , & - M79N3FMxe , M79N3FMye , M79N3FMze , M79N3MKxe , M79N3MKye , M79N3MKze , M79N3MMxe , & - M79N3MMye , M79N3MMze , M79N3RAxe , M79N3RAye , M79N3RAze , M79N3RDxe , M79N3RDye , & - M79N3RDze , M79N3TAxe , M79N3TAye , M79N3TAze , M79N3TDxss , M79N3TDyss , M79N3TDzss , & - M79N4FKxe , M79N4FKye , M79N4FKze , M79N4FMxe , M79N4FMye , M79N4FMze , M79N4MKxe , & - M79N4MKye , M79N4MKze , M79N4MMxe , M79N4MMye , M79N4MMze , M79N4RAxe , M79N4RAye , & - M79N4RAze , M79N4RDxe , M79N4RDye , M79N4RDze , M79N4TAxe , M79N4TAye , M79N4TAze , & - M79N4TDxss , M79N4TDyss , M79N4TDzss , M79N5FKxe , M79N5FKye , M79N5FKze , M79N5FMxe , & - M79N5FMye , M79N5FMze , M79N5MKxe , M79N5MKye , M79N5MKze , M79N5MMxe , M79N5MMye , & - M79N5MMze , M79N5RAxe , M79N5RAye , M79N5RAze , M79N5RDxe , M79N5RDye , M79N5RDze , & - M79N5TAxe , M79N5TAye , M79N5TAze , M79N5TDxss , M79N5TDyss , M79N5TDzss , M79N6FKxe , & - M79N6FKye , M79N6FKze , M79N6FMxe , M79N6FMye , M79N6FMze , M79N6MKxe , M79N6MKye , & - M79N6MKze , M79N6MMxe , M79N6MMye , M79N6MMze , M79N6RAxe , M79N6RAye , M79N6RAze , & - M79N6RDxe , M79N6RDye , M79N6RDze , M79N6TAxe , M79N6TAye , M79N6TAze , M79N6TDxss , & - M79N6TDyss , M79N6TDzss , M79N7FKxe , M79N7FKye , M79N7FKze , M79N7FMxe , M79N7FMye , & - M79N7FMze , M79N7MKxe , M79N7MKye , M79N7MKze , M79N7MMxe , M79N7MMye , M79N7MMze , & - M79N7RAxe , M79N7RAye , M79N7RAze , M79N7RDxe , M79N7RDye , M79N7RDze , M79N7TAxe , & - M79N7TAye , M79N7TAze , M79N7TDxss , M79N7TDyss , M79N7TDzss , M79N8FKxe , M79N8FKye , & - M79N8FKze , M79N8FMxe , M79N8FMye , M79N8FMze , M79N8MKxe , M79N8MKye , M79N8MKze , & - M79N8MMxe , M79N8MMye , M79N8MMze , M79N8RAxe , M79N8RAye , M79N8RAze , M79N8RDxe , & - M79N8RDye , M79N8RDze , M79N8TAxe , M79N8TAye , M79N8TAze , M79N8TDxss , M79N8TDyss , & - M79N8TDzss , M79N9FKxe , M79N9FKye , M79N9FKze , M79N9FMxe , M79N9FMye , M79N9FMze , & - M79N9MKxe , M79N9MKye , M79N9MKze , M79N9MMxe , M79N9MMye , M79N9MMze , M79N9RAxe , & - M79N9RAye , M79N9RAze , M79N9RDxe , M79N9RDye , M79N9RDze , M79N9TAxe , M79N9TAye , & - M79N9TAze , M79N9TDxss , M79N9TDyss , M79N9TDzss , M80N1FKxe , M80N1FKye , M80N1FKze , & - M80N1FMxe , M80N1FMye , M80N1FMze , M80N1MKxe , M80N1MKye , M80N1MKze , M80N1MMxe , & - M80N1MMye , M80N1MMze , M80N1RAxe , M80N1RAye , M80N1RAze , M80N1RDxe , M80N1RDye , & - M80N1RDze , M80N1TAxe , M80N1TAye , M80N1TAze , M80N1TDxss , M80N1TDyss , M80N1TDzss , & - M80N2FKxe , M80N2FKye , M80N2FKze , M80N2FMxe , M80N2FMye , M80N2FMze , M80N2MKxe , & - M80N2MKye , M80N2MKze , M80N2MMxe , M80N2MMye , M80N2MMze , M80N2RAxe , M80N2RAye , & - M80N2RAze , M80N2RDxe , M80N2RDye , M80N2RDze , M80N2TAxe , M80N2TAye , M80N2TAze , & - M80N2TDxss , M80N2TDyss , M80N2TDzss , M80N3FKxe , M80N3FKye , M80N3FKze , M80N3FMxe , & - M80N3FMye , M80N3FMze , M80N3MKxe , M80N3MKye , M80N3MKze , M80N3MMxe , M80N3MMye , & - M80N3MMze , M80N3RAxe , M80N3RAye , M80N3RAze , M80N3RDxe , M80N3RDye , M80N3RDze , & - M80N3TAxe , M80N3TAye , M80N3TAze , M80N3TDxss , M80N3TDyss , M80N3TDzss , M80N4FKxe , & - M80N4FKye , M80N4FKze , M80N4FMxe , M80N4FMye , M80N4FMze , M80N4MKxe , M80N4MKye , & - M80N4MKze , M80N4MMxe , M80N4MMye , M80N4MMze , M80N4RAxe , M80N4RAye , M80N4RAze , & - M80N4RDxe , M80N4RDye , M80N4RDze , M80N4TAxe , M80N4TAye , M80N4TAze , M80N4TDxss , & - M80N4TDyss , M80N4TDzss , M80N5FKxe , M80N5FKye , M80N5FKze , M80N5FMxe , M80N5FMye , & - M80N5FMze , M80N5MKxe , M80N5MKye , M80N5MKze , M80N5MMxe , M80N5MMye , M80N5MMze , & - M80N5RAxe , M80N5RAye , M80N5RAze , M80N5RDxe , M80N5RDye , M80N5RDze , M80N5TAxe , & - M80N5TAye , M80N5TAze , M80N5TDxss , M80N5TDyss , M80N5TDzss , M80N6FKxe , M80N6FKye , & - M80N6FKze , M80N6FMxe , M80N6FMye , M80N6FMze , M80N6MKxe , M80N6MKye , M80N6MKze , & - M80N6MMxe , M80N6MMye , M80N6MMze , M80N6RAxe , M80N6RAye , M80N6RAze , M80N6RDxe , & - M80N6RDye , M80N6RDze , M80N6TAxe , M80N6TAye , M80N6TAze , M80N6TDxss , M80N6TDyss , & - M80N6TDzss , M80N7FKxe , M80N7FKye , M80N7FKze , M80N7FMxe , M80N7FMye , M80N7FMze , & - M80N7MKxe , M80N7MKye , M80N7MKze , M80N7MMxe , M80N7MMye , M80N7MMze , M80N7RAxe , & - M80N7RAye , M80N7RAze , M80N7RDxe , M80N7RDye , M80N7RDze , M80N7TAxe , M80N7TAye , & - M80N7TAze , M80N7TDxss , M80N7TDyss , M80N7TDzss , M80N8FKxe , M80N8FKye , M80N8FKze , & - M80N8FMxe , M80N8FMye , M80N8FMze , M80N8MKxe , M80N8MKye , M80N8MKze , M80N8MMxe , & - M80N8MMye , M80N8MMze , M80N8RAxe , M80N8RAye , M80N8RAze , M80N8RDxe , M80N8RDye , & - M80N8RDze , M80N8TAxe , M80N8TAye , M80N8TAze , M80N8TDxss , M80N8TDyss , M80N8TDzss , & - M80N9FKxe , M80N9FKye , M80N9FKze , M80N9FMxe , M80N9FMye , M80N9FMze , M80N9MKxe , & - M80N9MKye , M80N9MKze , M80N9MMxe , M80N9MMye , M80N9MMze , M80N9RAxe , M80N9RAye , & - M80N9RAze , M80N9RDxe , M80N9RDye , M80N9RDze , M80N9TAxe , M80N9TAye , M80N9TAze , & - M80N9TDxss , M80N9TDyss , M80N9TDzss , M81N1FKxe , M81N1FKye , M81N1FKze , M81N1FMxe , & - M81N1FMye , M81N1FMze , M81N1MKxe , M81N1MKye , M81N1MKze , M81N1MMxe , M81N1MMye , & - M81N1MMze , M81N1RAxe , M81N1RAye , M81N1RAze , M81N1RDxe , M81N1RDye , M81N1RDze , & - M81N1TAxe , M81N1TAye , M81N1TAze , M81N1TDxss , M81N1TDyss , M81N1TDzss , M81N2FKxe , & - M81N2FKye , M81N2FKze , M81N2FMxe , M81N2FMye , M81N2FMze , M81N2MKxe , M81N2MKye , & - M81N2MKze , M81N2MMxe , M81N2MMye , M81N2MMze , M81N2RAxe , M81N2RAye , M81N2RAze , & - M81N2RDxe , M81N2RDye , M81N2RDze , M81N2TAxe , M81N2TAye , M81N2TAze , M81N2TDxss , & - M81N2TDyss , M81N2TDzss , M81N3FKxe , M81N3FKye , M81N3FKze , M81N3FMxe , M81N3FMye , & - M81N3FMze , M81N3MKxe , M81N3MKye , M81N3MKze , M81N3MMxe , M81N3MMye , M81N3MMze , & - M81N3RAxe , M81N3RAye , M81N3RAze , M81N3RDxe , M81N3RDye , M81N3RDze , M81N3TAxe , & - M81N3TAye , M81N3TAze , M81N3TDxss , M81N3TDyss , M81N3TDzss , M81N4FKxe , M81N4FKye , & - M81N4FKze , M81N4FMxe , M81N4FMye , M81N4FMze , M81N4MKxe , M81N4MKye , M81N4MKze , & - M81N4MMxe , M81N4MMye , M81N4MMze , M81N4RAxe , M81N4RAye , M81N4RAze , M81N4RDxe , & - M81N4RDye , M81N4RDze , M81N4TAxe , M81N4TAye , M81N4TAze , M81N4TDxss , M81N4TDyss , & - M81N4TDzss , M81N5FKxe , M81N5FKye , M81N5FKze , M81N5FMxe , M81N5FMye , M81N5FMze , & - M81N5MKxe , M81N5MKye , M81N5MKze , M81N5MMxe , M81N5MMye , M81N5MMze , M81N5RAxe , & - M81N5RAye , M81N5RAze , M81N5RDxe , M81N5RDye , M81N5RDze , M81N5TAxe , M81N5TAye , & - M81N5TAze , M81N5TDxss , M81N5TDyss , M81N5TDzss , M81N6FKxe , M81N6FKye , M81N6FKze , & - M81N6FMxe , M81N6FMye , M81N6FMze , M81N6MKxe , M81N6MKye , M81N6MKze , M81N6MMxe , & - M81N6MMye , M81N6MMze , M81N6RAxe , M81N6RAye , M81N6RAze , M81N6RDxe , M81N6RDye , & - M81N6RDze , M81N6TAxe , M81N6TAye , M81N6TAze , M81N6TDxss , M81N6TDyss , M81N6TDzss , & - M81N7FKxe , M81N7FKye , M81N7FKze , M81N7FMxe , M81N7FMye , M81N7FMze , M81N7MKxe , & - M81N7MKye , M81N7MKze , M81N7MMxe , M81N7MMye , M81N7MMze , M81N7RAxe , M81N7RAye , & - M81N7RAze , M81N7RDxe , M81N7RDye , M81N7RDze , M81N7TAxe , M81N7TAye , M81N7TAze , & - M81N7TDxss , M81N7TDyss , M81N7TDzss , M81N8FKxe , M81N8FKye , M81N8FKze , M81N8FMxe , & - M81N8FMye , M81N8FMze , M81N8MKxe , M81N8MKye , M81N8MKze , M81N8MMxe , M81N8MMye , & - M81N8MMze , M81N8RAxe , M81N8RAye , M81N8RAze , M81N8RDxe , M81N8RDye , M81N8RDze , & - M81N8TAxe , M81N8TAye , M81N8TAze , M81N8TDxss , M81N8TDyss , M81N8TDzss , M81N9FKxe , & - M81N9FKye , M81N9FKze , M81N9FMxe , M81N9FMye , M81N9FMze , M81N9MKxe , M81N9MKye , & - M81N9MKze , M81N9MMxe , M81N9MMye , M81N9MMze , M81N9RAxe , M81N9RAye , M81N9RAze , & - M81N9RDxe , M81N9RDye , M81N9RDze , M81N9TAxe , M81N9TAye , M81N9TAze , M81N9TDxss , & - M81N9TDyss , M81N9TDzss , M82N1FKxe , M82N1FKye , M82N1FKze , M82N1FMxe , M82N1FMye , & - M82N1FMze , M82N1MKxe , M82N1MKye , M82N1MKze , M82N1MMxe , M82N1MMye , M82N1MMze , & - M82N1RAxe , M82N1RAye , M82N1RAze , M82N1RDxe , M82N1RDye , M82N1RDze , M82N1TAxe , & - M82N1TAye , M82N1TAze , M82N1TDxss , M82N1TDyss , M82N1TDzss , M82N2FKxe , M82N2FKye , & - M82N2FKze , M82N2FMxe , M82N2FMye , M82N2FMze , M82N2MKxe , M82N2MKye , M82N2MKze , & - M82N2MMxe , M82N2MMye , M82N2MMze , M82N2RAxe , M82N2RAye , M82N2RAze , M82N2RDxe , & - M82N2RDye , M82N2RDze , M82N2TAxe , M82N2TAye , M82N2TAze , M82N2TDxss , M82N2TDyss , & - M82N2TDzss , M82N3FKxe , M82N3FKye , M82N3FKze , M82N3FMxe , M82N3FMye , M82N3FMze , & - M82N3MKxe , M82N3MKye , M82N3MKze , M82N3MMxe , M82N3MMye , M82N3MMze , M82N3RAxe , & - M82N3RAye , M82N3RAze , M82N3RDxe , M82N3RDye , M82N3RDze , M82N3TAxe , M82N3TAye , & - M82N3TAze , M82N3TDxss , M82N3TDyss , M82N3TDzss , M82N4FKxe , M82N4FKye , M82N4FKze , & - M82N4FMxe , M82N4FMye , M82N4FMze , M82N4MKxe , M82N4MKye , M82N4MKze , M82N4MMxe , & - M82N4MMye , M82N4MMze , M82N4RAxe , M82N4RAye , M82N4RAze , M82N4RDxe , M82N4RDye , & - M82N4RDze , M82N4TAxe , M82N4TAye , M82N4TAze , M82N4TDxss , M82N4TDyss , M82N4TDzss , & - M82N5FKxe , M82N5FKye , M82N5FKze , M82N5FMxe , M82N5FMye , M82N5FMze , M82N5MKxe , & - M82N5MKye , M82N5MKze , M82N5MMxe , M82N5MMye , M82N5MMze , M82N5RAxe , M82N5RAye , & - M82N5RAze , M82N5RDxe , M82N5RDye , M82N5RDze , M82N5TAxe , M82N5TAye , M82N5TAze , & - M82N5TDxss , M82N5TDyss , M82N5TDzss , M82N6FKxe , M82N6FKye , M82N6FKze , M82N6FMxe , & - M82N6FMye , M82N6FMze , M82N6MKxe , M82N6MKye , M82N6MKze , M82N6MMxe , M82N6MMye , & - M82N6MMze , M82N6RAxe , M82N6RAye , M82N6RAze , M82N6RDxe , M82N6RDye , M82N6RDze , & - M82N6TAxe , M82N6TAye , M82N6TAze , M82N6TDxss , M82N6TDyss , M82N6TDzss , M82N7FKxe , & - M82N7FKye , M82N7FKze , M82N7FMxe , M82N7FMye , M82N7FMze , M82N7MKxe , M82N7MKye , & - M82N7MKze , M82N7MMxe , M82N7MMye , M82N7MMze , M82N7RAxe , M82N7RAye , M82N7RAze , & - M82N7RDxe , M82N7RDye , M82N7RDze , M82N7TAxe , M82N7TAye , M82N7TAze , M82N7TDxss , & - M82N7TDyss , M82N7TDzss , M82N8FKxe , M82N8FKye , M82N8FKze , M82N8FMxe , M82N8FMye , & - M82N8FMze , M82N8MKxe , M82N8MKye , M82N8MKze , M82N8MMxe , M82N8MMye , M82N8MMze , & - M82N8RAxe , M82N8RAye , M82N8RAze , M82N8RDxe , M82N8RDye , M82N8RDze , M82N8TAxe , & - M82N8TAye , M82N8TAze , M82N8TDxss , M82N8TDyss , M82N8TDzss , M82N9FKxe , M82N9FKye , & - M82N9FKze , M82N9FMxe , M82N9FMye , M82N9FMze , M82N9MKxe , M82N9MKye , M82N9MKze , & - M82N9MMxe , M82N9MMye , M82N9MMze , M82N9RAxe , M82N9RAye , M82N9RAze , M82N9RDxe , & - M82N9RDye , M82N9RDze , M82N9TAxe , M82N9TAye , M82N9TAze , M82N9TDxss , M82N9TDyss , & - M82N9TDzss , M83N1FKxe , M83N1FKye , M83N1FKze , M83N1FMxe , M83N1FMye , M83N1FMze , & - M83N1MKxe , M83N1MKye , M83N1MKze , M83N1MMxe , M83N1MMye , M83N1MMze , M83N1RAxe , & - M83N1RAye , M83N1RAze , M83N1RDxe , M83N1RDye , M83N1RDze , M83N1TAxe , M83N1TAye , & - M83N1TAze , M83N1TDxss , M83N1TDyss , M83N1TDzss , M83N2FKxe , M83N2FKye , M83N2FKze , & - M83N2FMxe , M83N2FMye , M83N2FMze , M83N2MKxe , M83N2MKye , M83N2MKze , M83N2MMxe , & - M83N2MMye , M83N2MMze , M83N2RAxe , M83N2RAye , M83N2RAze , M83N2RDxe , M83N2RDye , & - M83N2RDze , M83N2TAxe , M83N2TAye , M83N2TAze , M83N2TDxss , M83N2TDyss , M83N2TDzss , & - M83N3FKxe , M83N3FKye , M83N3FKze , M83N3FMxe , M83N3FMye , M83N3FMze , M83N3MKxe , & - M83N3MKye , M83N3MKze , M83N3MMxe , M83N3MMye , M83N3MMze , M83N3RAxe , M83N3RAye , & - M83N3RAze , M83N3RDxe , M83N3RDye , M83N3RDze , M83N3TAxe , M83N3TAye , M83N3TAze , & - M83N3TDxss , M83N3TDyss , M83N3TDzss , M83N4FKxe , M83N4FKye , M83N4FKze , M83N4FMxe , & - M83N4FMye , M83N4FMze , M83N4MKxe , M83N4MKye , M83N4MKze , M83N4MMxe , M83N4MMye , & - M83N4MMze , M83N4RAxe , M83N4RAye , M83N4RAze , M83N4RDxe , M83N4RDye , M83N4RDze , & - M83N4TAxe , M83N4TAye , M83N4TAze , M83N4TDxss , M83N4TDyss , M83N4TDzss , M83N5FKxe , & - M83N5FKye , M83N5FKze , M83N5FMxe , M83N5FMye , M83N5FMze , M83N5MKxe , M83N5MKye , & - M83N5MKze , M83N5MMxe , M83N5MMye , M83N5MMze , M83N5RAxe , M83N5RAye , M83N5RAze , & - M83N5RDxe , M83N5RDye , M83N5RDze , M83N5TAxe , M83N5TAye , M83N5TAze , M83N5TDxss , & - M83N5TDyss , M83N5TDzss , M83N6FKxe , M83N6FKye , M83N6FKze , M83N6FMxe , M83N6FMye , & - M83N6FMze , M83N6MKxe , M83N6MKye , M83N6MKze , M83N6MMxe , M83N6MMye , M83N6MMze , & - M83N6RAxe , M83N6RAye , M83N6RAze , M83N6RDxe , M83N6RDye , M83N6RDze , M83N6TAxe , & - M83N6TAye , M83N6TAze , M83N6TDxss , M83N6TDyss , M83N6TDzss , M83N7FKxe , M83N7FKye , & - M83N7FKze , M83N7FMxe , M83N7FMye , M83N7FMze , M83N7MKxe , M83N7MKye , M83N7MKze , & - M83N7MMxe , M83N7MMye , M83N7MMze , M83N7RAxe , M83N7RAye , M83N7RAze , M83N7RDxe , & - M83N7RDye , M83N7RDze , M83N7TAxe , M83N7TAye , M83N7TAze , M83N7TDxss , M83N7TDyss , & - M83N7TDzss , M83N8FKxe , M83N8FKye , M83N8FKze , M83N8FMxe , M83N8FMye , M83N8FMze , & - M83N8MKxe , M83N8MKye , M83N8MKze , M83N8MMxe , M83N8MMye , M83N8MMze , M83N8RAxe , & - M83N8RAye , M83N8RAze , M83N8RDxe , M83N8RDye , M83N8RDze , M83N8TAxe , M83N8TAye , & - M83N8TAze , M83N8TDxss , M83N8TDyss , M83N8TDzss , M83N9FKxe , M83N9FKye , M83N9FKze , & - M83N9FMxe , M83N9FMye , M83N9FMze , M83N9MKxe , M83N9MKye , M83N9MKze , M83N9MMxe , & - M83N9MMye , M83N9MMze , M83N9RAxe , M83N9RAye , M83N9RAze , M83N9RDxe , M83N9RDye , & - M83N9RDze , M83N9TAxe , M83N9TAye , M83N9TAze , M83N9TDxss , M83N9TDyss , M83N9TDzss , & - M84N1FKxe , M84N1FKye , M84N1FKze , M84N1FMxe , M84N1FMye , M84N1FMze , M84N1MKxe , & - M84N1MKye , M84N1MKze , M84N1MMxe , M84N1MMye , M84N1MMze , M84N1RAxe , M84N1RAye , & - M84N1RAze , M84N1RDxe , M84N1RDye , M84N1RDze , M84N1TAxe , M84N1TAye , M84N1TAze , & - M84N1TDxss , M84N1TDyss , M84N1TDzss , M84N2FKxe , M84N2FKye , M84N2FKze , M84N2FMxe , & - M84N2FMye , M84N2FMze , M84N2MKxe , M84N2MKye , M84N2MKze , M84N2MMxe , M84N2MMye , & - M84N2MMze , M84N2RAxe , M84N2RAye , M84N2RAze , M84N2RDxe , M84N2RDye , M84N2RDze , & - M84N2TAxe , M84N2TAye , M84N2TAze , M84N2TDxss , M84N2TDyss , M84N2TDzss , M84N3FKxe , & - M84N3FKye , M84N3FKze , M84N3FMxe , M84N3FMye , M84N3FMze , M84N3MKxe , M84N3MKye , & - M84N3MKze , M84N3MMxe , M84N3MMye , M84N3MMze , M84N3RAxe , M84N3RAye , M84N3RAze , & - M84N3RDxe , M84N3RDye , M84N3RDze , M84N3TAxe , M84N3TAye , M84N3TAze , M84N3TDxss , & - M84N3TDyss , M84N3TDzss , M84N4FKxe , M84N4FKye , M84N4FKze , M84N4FMxe , M84N4FMye , & - M84N4FMze , M84N4MKxe , M84N4MKye , M84N4MKze , M84N4MMxe , M84N4MMye , M84N4MMze , & - M84N4RAxe , M84N4RAye , M84N4RAze , M84N4RDxe , M84N4RDye , M84N4RDze , M84N4TAxe , & - M84N4TAye , M84N4TAze , M84N4TDxss , M84N4TDyss , M84N4TDzss , M84N5FKxe , M84N5FKye , & - M84N5FKze , M84N5FMxe , M84N5FMye , M84N5FMze , M84N5MKxe , M84N5MKye , M84N5MKze , & - M84N5MMxe , M84N5MMye , M84N5MMze , M84N5RAxe , M84N5RAye , M84N5RAze , M84N5RDxe , & - M84N5RDye , M84N5RDze , M84N5TAxe , M84N5TAye , M84N5TAze , M84N5TDxss , M84N5TDyss , & - M84N5TDzss , M84N6FKxe , M84N6FKye , M84N6FKze , M84N6FMxe , M84N6FMye , M84N6FMze , & - M84N6MKxe , M84N6MKye , M84N6MKze , M84N6MMxe , M84N6MMye , M84N6MMze , M84N6RAxe , & - M84N6RAye , M84N6RAze , M84N6RDxe , M84N6RDye , M84N6RDze , M84N6TAxe , M84N6TAye , & - M84N6TAze , M84N6TDxss , M84N6TDyss , M84N6TDzss , M84N7FKxe , M84N7FKye , M84N7FKze , & - M84N7FMxe , M84N7FMye , M84N7FMze , M84N7MKxe , M84N7MKye , M84N7MKze , M84N7MMxe , & - M84N7MMye , M84N7MMze , M84N7RAxe , M84N7RAye , M84N7RAze , M84N7RDxe , M84N7RDye , & - M84N7RDze , M84N7TAxe , M84N7TAye , M84N7TAze , M84N7TDxss , M84N7TDyss , M84N7TDzss , & - M84N8FKxe , M84N8FKye , M84N8FKze , M84N8FMxe , M84N8FMye , M84N8FMze , M84N8MKxe , & - M84N8MKye , M84N8MKze , M84N8MMxe , M84N8MMye , M84N8MMze , M84N8RAxe , M84N8RAye , & - M84N8RAze , M84N8RDxe , M84N8RDye , M84N8RDze , M84N8TAxe , M84N8TAye , M84N8TAze , & - M84N8TDxss , M84N8TDyss , M84N8TDzss , M84N9FKxe , M84N9FKye , M84N9FKze , M84N9FMxe , & - M84N9FMye , M84N9FMze , M84N9MKxe , M84N9MKye , M84N9MKze , M84N9MMxe , M84N9MMye , & - M84N9MMze , M84N9RAxe , M84N9RAye , M84N9RAze , M84N9RDxe , M84N9RDye , M84N9RDze , & - M84N9TAxe , M84N9TAye , M84N9TAze , M84N9TDxss , M84N9TDyss , M84N9TDzss , M85N1FKxe , & - M85N1FKye , M85N1FKze , M85N1FMxe , M85N1FMye , M85N1FMze , M85N1MKxe , M85N1MKye , & - M85N1MKze , M85N1MMxe , M85N1MMye , M85N1MMze , M85N1RAxe , M85N1RAye , M85N1RAze , & - M85N1RDxe , M85N1RDye , M85N1RDze , M85N1TAxe , M85N1TAye , M85N1TAze , M85N1TDxss , & - M85N1TDyss , M85N1TDzss , M85N2FKxe , M85N2FKye , M85N2FKze , M85N2FMxe , M85N2FMye , & - M85N2FMze , M85N2MKxe , M85N2MKye , M85N2MKze , M85N2MMxe , M85N2MMye , M85N2MMze , & - M85N2RAxe , M85N2RAye , M85N2RAze , M85N2RDxe , M85N2RDye , M85N2RDze , M85N2TAxe , & - M85N2TAye , M85N2TAze , M85N2TDxss , M85N2TDyss , M85N2TDzss , M85N3FKxe , M85N3FKye , & - M85N3FKze , M85N3FMxe , M85N3FMye , M85N3FMze , M85N3MKxe , M85N3MKye , M85N3MKze , & - M85N3MMxe , M85N3MMye , M85N3MMze , M85N3RAxe , M85N3RAye , M85N3RAze , M85N3RDxe , & - M85N3RDye , M85N3RDze , M85N3TAxe , M85N3TAye , M85N3TAze , M85N3TDxss , M85N3TDyss , & - M85N3TDzss , M85N4FKxe , M85N4FKye , M85N4FKze , M85N4FMxe , M85N4FMye , M85N4FMze , & - M85N4MKxe , M85N4MKye , M85N4MKze , M85N4MMxe , M85N4MMye , M85N4MMze , M85N4RAxe , & - M85N4RAye , M85N4RAze , M85N4RDxe , M85N4RDye , M85N4RDze , M85N4TAxe , M85N4TAye , & - M85N4TAze , M85N4TDxss , M85N4TDyss , M85N4TDzss , M85N5FKxe , M85N5FKye , M85N5FKze , & - M85N5FMxe , M85N5FMye , M85N5FMze , M85N5MKxe , M85N5MKye , M85N5MKze , M85N5MMxe , & - M85N5MMye , M85N5MMze , M85N5RAxe , M85N5RAye , M85N5RAze , M85N5RDxe , M85N5RDye , & - M85N5RDze , M85N5TAxe , M85N5TAye , M85N5TAze , M85N5TDxss , M85N5TDyss , M85N5TDzss , & - M85N6FKxe , M85N6FKye , M85N6FKze , M85N6FMxe , M85N6FMye , M85N6FMze , M85N6MKxe , & - M85N6MKye , M85N6MKze , M85N6MMxe , M85N6MMye , M85N6MMze , M85N6RAxe , M85N6RAye , & - M85N6RAze , M85N6RDxe , M85N6RDye , M85N6RDze , M85N6TAxe , M85N6TAye , M85N6TAze , & - M85N6TDxss , M85N6TDyss , M85N6TDzss , M85N7FKxe , M85N7FKye , M85N7FKze , M85N7FMxe , & - M85N7FMye , M85N7FMze , M85N7MKxe , M85N7MKye , M85N7MKze , M85N7MMxe , M85N7MMye , & - M85N7MMze , M85N7RAxe , M85N7RAye , M85N7RAze , M85N7RDxe , M85N7RDye , M85N7RDze , & - M85N7TAxe , M85N7TAye , M85N7TAze , M85N7TDxss , M85N7TDyss , M85N7TDzss , M85N8FKxe , & - M85N8FKye , M85N8FKze , M85N8FMxe , M85N8FMye , M85N8FMze , M85N8MKxe , M85N8MKye , & - M85N8MKze , M85N8MMxe , M85N8MMye , M85N8MMze , M85N8RAxe , M85N8RAye , M85N8RAze , & - M85N8RDxe , M85N8RDye , M85N8RDze , M85N8TAxe , M85N8TAye , M85N8TAze , M85N8TDxss , & - M85N8TDyss , M85N8TDzss , M85N9FKxe , M85N9FKye , M85N9FKze , M85N9FMxe , M85N9FMye , & - M85N9FMze , M85N9MKxe , M85N9MKye , M85N9MKze , M85N9MMxe , M85N9MMye , M85N9MMze , & - M85N9RAxe , M85N9RAye , M85N9RAze , M85N9RDxe /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry12(1670) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M85N9RDye , M85N9RDze , M85N9TAxe , M85N9TAye , M85N9TAze , M85N9TDxss , M85N9TDyss , & - M85N9TDzss , M86N1FKxe , M86N1FKye , M86N1FKze , M86N1FMxe , M86N1FMye , M86N1FMze , & - M86N1MKxe , M86N1MKye , M86N1MKze , M86N1MMxe , M86N1MMye , M86N1MMze , M86N1RAxe , & - M86N1RAye , M86N1RAze , M86N1RDxe , M86N1RDye , M86N1RDze , M86N1TAxe , M86N1TAye , & - M86N1TAze , M86N1TDxss , M86N1TDyss , M86N1TDzss , M86N2FKxe , M86N2FKye , M86N2FKze , & - M86N2FMxe , M86N2FMye , M86N2FMze , M86N2MKxe , M86N2MKye , M86N2MKze , M86N2MMxe , & - M86N2MMye , M86N2MMze , M86N2RAxe , M86N2RAye , M86N2RAze , M86N2RDxe , M86N2RDye , & - M86N2RDze , M86N2TAxe , M86N2TAye , M86N2TAze , M86N2TDxss , M86N2TDyss , M86N2TDzss , & - M86N3FKxe , M86N3FKye , M86N3FKze , M86N3FMxe , M86N3FMye , M86N3FMze , M86N3MKxe , & - M86N3MKye , M86N3MKze , M86N3MMxe , M86N3MMye , M86N3MMze , M86N3RAxe , M86N3RAye , & - M86N3RAze , M86N3RDxe , M86N3RDye , M86N3RDze , M86N3TAxe , M86N3TAye , M86N3TAze , & - M86N3TDxss , M86N3TDyss , M86N3TDzss , M86N4FKxe , M86N4FKye , M86N4FKze , M86N4FMxe , & - M86N4FMye , M86N4FMze , M86N4MKxe , M86N4MKye , M86N4MKze , M86N4MMxe , M86N4MMye , & - M86N4MMze , M86N4RAxe , M86N4RAye , M86N4RAze , M86N4RDxe , M86N4RDye , M86N4RDze , & - M86N4TAxe , M86N4TAye , M86N4TAze , M86N4TDxss , M86N4TDyss , M86N4TDzss , M86N5FKxe , & - M86N5FKye , M86N5FKze , M86N5FMxe , M86N5FMye , M86N5FMze , M86N5MKxe , M86N5MKye , & - M86N5MKze , M86N5MMxe , M86N5MMye , M86N5MMze , M86N5RAxe , M86N5RAye , M86N5RAze , & - M86N5RDxe , M86N5RDye , M86N5RDze , M86N5TAxe , M86N5TAye , M86N5TAze , M86N5TDxss , & - M86N5TDyss , M86N5TDzss , M86N6FKxe , M86N6FKye , M86N6FKze , M86N6FMxe , M86N6FMye , & - M86N6FMze , M86N6MKxe , M86N6MKye , M86N6MKze , M86N6MMxe , M86N6MMye , M86N6MMze , & - M86N6RAxe , M86N6RAye , M86N6RAze , M86N6RDxe , M86N6RDye , M86N6RDze , M86N6TAxe , & - M86N6TAye , M86N6TAze , M86N6TDxss , M86N6TDyss , M86N6TDzss , M86N7FKxe , M86N7FKye , & - M86N7FKze , M86N7FMxe , M86N7FMye , M86N7FMze , M86N7MKxe , M86N7MKye , M86N7MKze , & - M86N7MMxe , M86N7MMye , M86N7MMze , M86N7RAxe , M86N7RAye , M86N7RAze , M86N7RDxe , & - M86N7RDye , M86N7RDze , M86N7TAxe , M86N7TAye , M86N7TAze , M86N7TDxss , M86N7TDyss , & - M86N7TDzss , M86N8FKxe , M86N8FKye , M86N8FKze , M86N8FMxe , M86N8FMye , M86N8FMze , & - M86N8MKxe , M86N8MKye , M86N8MKze , M86N8MMxe , M86N8MMye , M86N8MMze , M86N8RAxe , & - M86N8RAye , M86N8RAze , M86N8RDxe , M86N8RDye , M86N8RDze , M86N8TAxe , M86N8TAye , & - M86N8TAze , M86N8TDxss , M86N8TDyss , M86N8TDzss , M86N9FKxe , M86N9FKye , M86N9FKze , & - M86N9FMxe , M86N9FMye , M86N9FMze , M86N9MKxe , M86N9MKye , M86N9MKze , M86N9MMxe , & - M86N9MMye , M86N9MMze , M86N9RAxe , M86N9RAye , M86N9RAze , M86N9RDxe , M86N9RDye , & - M86N9RDze , M86N9TAxe , M86N9TAye , M86N9TAze , M86N9TDxss , M86N9TDyss , M86N9TDzss , & - M87N1FKxe , M87N1FKye , M87N1FKze , M87N1FMxe , M87N1FMye , M87N1FMze , M87N1MKxe , & - M87N1MKye , M87N1MKze , M87N1MMxe , M87N1MMye , M87N1MMze , M87N1RAxe , M87N1RAye , & - M87N1RAze , M87N1RDxe , M87N1RDye , M87N1RDze , M87N1TAxe , M87N1TAye , M87N1TAze , & - M87N1TDxss , M87N1TDyss , M87N1TDzss , M87N2FKxe , M87N2FKye , M87N2FKze , M87N2FMxe , & - M87N2FMye , M87N2FMze , M87N2MKxe , M87N2MKye , M87N2MKze , M87N2MMxe , M87N2MMye , & - M87N2MMze , M87N2RAxe , M87N2RAye , M87N2RAze , M87N2RDxe , M87N2RDye , M87N2RDze , & - M87N2TAxe , M87N2TAye , M87N2TAze , M87N2TDxss , M87N2TDyss , M87N2TDzss , M87N3FKxe , & - M87N3FKye , M87N3FKze , M87N3FMxe , M87N3FMye , M87N3FMze , M87N3MKxe , M87N3MKye , & - M87N3MKze , M87N3MMxe , M87N3MMye , M87N3MMze , M87N3RAxe , M87N3RAye , M87N3RAze , & - M87N3RDxe , M87N3RDye , M87N3RDze , M87N3TAxe , M87N3TAye , M87N3TAze , M87N3TDxss , & - M87N3TDyss , M87N3TDzss , M87N4FKxe , M87N4FKye , M87N4FKze , M87N4FMxe , M87N4FMye , & - M87N4FMze , M87N4MKxe , M87N4MKye , M87N4MKze , M87N4MMxe , M87N4MMye , M87N4MMze , & - M87N4RAxe , M87N4RAye , M87N4RAze , M87N4RDxe , M87N4RDye , M87N4RDze , M87N4TAxe , & - M87N4TAye , M87N4TAze , M87N4TDxss , M87N4TDyss , M87N4TDzss , M87N5FKxe , M87N5FKye , & - M87N5FKze , M87N5FMxe , M87N5FMye , M87N5FMze , M87N5MKxe , M87N5MKye , M87N5MKze , & - M87N5MMxe , M87N5MMye , M87N5MMze , M87N5RAxe , M87N5RAye , M87N5RAze , M87N5RDxe , & - M87N5RDye , M87N5RDze , M87N5TAxe , M87N5TAye , M87N5TAze , M87N5TDxss , M87N5TDyss , & - M87N5TDzss , M87N6FKxe , M87N6FKye , M87N6FKze , M87N6FMxe , M87N6FMye , M87N6FMze , & - M87N6MKxe , M87N6MKye , M87N6MKze , M87N6MMxe , M87N6MMye , M87N6MMze , M87N6RAxe , & - M87N6RAye , M87N6RAze , M87N6RDxe , M87N6RDye , M87N6RDze , M87N6TAxe , M87N6TAye , & - M87N6TAze , M87N6TDxss , M87N6TDyss , M87N6TDzss , M87N7FKxe , M87N7FKye , M87N7FKze , & - M87N7FMxe , M87N7FMye , M87N7FMze , M87N7MKxe , M87N7MKye , M87N7MKze , M87N7MMxe , & - M87N7MMye , M87N7MMze , M87N7RAxe , M87N7RAye , M87N7RAze , M87N7RDxe , M87N7RDye , & - M87N7RDze , M87N7TAxe , M87N7TAye , M87N7TAze , M87N7TDxss , M87N7TDyss , M87N7TDzss , & - M87N8FKxe , M87N8FKye , M87N8FKze , M87N8FMxe , M87N8FMye , M87N8FMze , M87N8MKxe , & - M87N8MKye , M87N8MKze , M87N8MMxe , M87N8MMye , M87N8MMze , M87N8RAxe , M87N8RAye , & - M87N8RAze , M87N8RDxe , M87N8RDye , M87N8RDze , M87N8TAxe , M87N8TAye , M87N8TAze , & - M87N8TDxss , M87N8TDyss , M87N8TDzss , M87N9FKxe , M87N9FKye , M87N9FKze , M87N9FMxe , & - M87N9FMye , M87N9FMze , M87N9MKxe , M87N9MKye , M87N9MKze , M87N9MMxe , M87N9MMye , & - M87N9MMze , M87N9RAxe , M87N9RAye , M87N9RAze , M87N9RDxe , M87N9RDye , M87N9RDze , & - M87N9TAxe , M87N9TAye , M87N9TAze , M87N9TDxss , M87N9TDyss , M87N9TDzss , M88N1FKxe , & - M88N1FKye , M88N1FKze , M88N1FMxe , M88N1FMye , M88N1FMze , M88N1MKxe , M88N1MKye , & - M88N1MKze , M88N1MMxe , M88N1MMye , M88N1MMze , M88N1RAxe , M88N1RAye , M88N1RAze , & - M88N1RDxe , M88N1RDye , M88N1RDze , M88N1TAxe , M88N1TAye , M88N1TAze , M88N1TDxss , & - M88N1TDyss , M88N1TDzss , M88N2FKxe , M88N2FKye , M88N2FKze , M88N2FMxe , M88N2FMye , & - M88N2FMze , M88N2MKxe , M88N2MKye , M88N2MKze , M88N2MMxe , M88N2MMye , M88N2MMze , & - M88N2RAxe , M88N2RAye , M88N2RAze , M88N2RDxe , M88N2RDye , M88N2RDze , M88N2TAxe , & - M88N2TAye , M88N2TAze , M88N2TDxss , M88N2TDyss , M88N2TDzss , M88N3FKxe , M88N3FKye , & - M88N3FKze , M88N3FMxe , M88N3FMye , M88N3FMze , M88N3MKxe , M88N3MKye , M88N3MKze , & - M88N3MMxe , M88N3MMye , M88N3MMze , M88N3RAxe , M88N3RAye , M88N3RAze , M88N3RDxe , & - M88N3RDye , M88N3RDze , M88N3TAxe , M88N3TAye , M88N3TAze , M88N3TDxss , M88N3TDyss , & - M88N3TDzss , M88N4FKxe , M88N4FKye , M88N4FKze , M88N4FMxe , M88N4FMye , M88N4FMze , & - M88N4MKxe , M88N4MKye , M88N4MKze , M88N4MMxe , M88N4MMye , M88N4MMze , M88N4RAxe , & - M88N4RAye , M88N4RAze , M88N4RDxe , M88N4RDye , M88N4RDze , M88N4TAxe , M88N4TAye , & - M88N4TAze , M88N4TDxss , M88N4TDyss , M88N4TDzss , M88N5FKxe , M88N5FKye , M88N5FKze , & - M88N5FMxe , M88N5FMye , M88N5FMze , M88N5MKxe , M88N5MKye , M88N5MKze , M88N5MMxe , & - M88N5MMye , M88N5MMze , M88N5RAxe , M88N5RAye , M88N5RAze , M88N5RDxe , M88N5RDye , & - M88N5RDze , M88N5TAxe , M88N5TAye , M88N5TAze , M88N5TDxss , M88N5TDyss , M88N5TDzss , & - M88N6FKxe , M88N6FKye , M88N6FKze , M88N6FMxe , M88N6FMye , M88N6FMze , M88N6MKxe , & - M88N6MKye , M88N6MKze , M88N6MMxe , M88N6MMye , M88N6MMze , M88N6RAxe , M88N6RAye , & - M88N6RAze , M88N6RDxe , M88N6RDye , M88N6RDze , M88N6TAxe , M88N6TAye , M88N6TAze , & - M88N6TDxss , M88N6TDyss , M88N6TDzss , M88N7FKxe , M88N7FKye , M88N7FKze , M88N7FMxe , & - M88N7FMye , M88N7FMze , M88N7MKxe , M88N7MKye , M88N7MKze , M88N7MMxe , M88N7MMye , & - M88N7MMze , M88N7RAxe , M88N7RAye , M88N7RAze , M88N7RDxe , M88N7RDye , M88N7RDze , & - M88N7TAxe , M88N7TAye , M88N7TAze , M88N7TDxss , M88N7TDyss , M88N7TDzss , M88N8FKxe , & - M88N8FKye , M88N8FKze , M88N8FMxe , M88N8FMye , M88N8FMze , M88N8MKxe , M88N8MKye , & - M88N8MKze , M88N8MMxe , M88N8MMye , M88N8MMze , M88N8RAxe , M88N8RAye , M88N8RAze , & - M88N8RDxe , M88N8RDye , M88N8RDze , M88N8TAxe , M88N8TAye , M88N8TAze , M88N8TDxss , & - M88N8TDyss , M88N8TDzss , M88N9FKxe , M88N9FKye , M88N9FKze , M88N9FMxe , M88N9FMye , & - M88N9FMze , M88N9MKxe , M88N9MKye , M88N9MKze , M88N9MMxe , M88N9MMye , M88N9MMze , & - M88N9RAxe , M88N9RAye , M88N9RAze , M88N9RDxe , M88N9RDye , M88N9RDze , M88N9TAxe , & - M88N9TAye , M88N9TAze , M88N9TDxss , M88N9TDyss , M88N9TDzss , M89N1FKxe , M89N1FKye , & - M89N1FKze , M89N1FMxe , M89N1FMye , M89N1FMze , M89N1MKxe , M89N1MKye , M89N1MKze , & - M89N1MMxe , M89N1MMye , M89N1MMze , M89N1RAxe , M89N1RAye , M89N1RAze , M89N1RDxe , & - M89N1RDye , M89N1RDze , M89N1TAxe , M89N1TAye , M89N1TAze , M89N1TDxss , M89N1TDyss , & - M89N1TDzss , M89N2FKxe , M89N2FKye , M89N2FKze , M89N2FMxe , M89N2FMye , M89N2FMze , & - M89N2MKxe , M89N2MKye , M89N2MKze , M89N2MMxe , M89N2MMye , M89N2MMze , M89N2RAxe , & - M89N2RAye , M89N2RAze , M89N2RDxe , M89N2RDye , M89N2RDze , M89N2TAxe , M89N2TAye , & - M89N2TAze , M89N2TDxss , M89N2TDyss , M89N2TDzss , M89N3FKxe , M89N3FKye , M89N3FKze , & - M89N3FMxe , M89N3FMye , M89N3FMze , M89N3MKxe , M89N3MKye , M89N3MKze , M89N3MMxe , & - M89N3MMye , M89N3MMze , M89N3RAxe , M89N3RAye , M89N3RAze , M89N3RDxe , M89N3RDye , & - M89N3RDze , M89N3TAxe , M89N3TAye , M89N3TAze , M89N3TDxss , M89N3TDyss , M89N3TDzss , & - M89N4FKxe , M89N4FKye , M89N4FKze , M89N4FMxe , M89N4FMye , M89N4FMze , M89N4MKxe , & - M89N4MKye , M89N4MKze , M89N4MMxe , M89N4MMye , M89N4MMze , M89N4RAxe , M89N4RAye , & - M89N4RAze , M89N4RDxe , M89N4RDye , M89N4RDze , M89N4TAxe , M89N4TAye , M89N4TAze , & - M89N4TDxss , M89N4TDyss , M89N4TDzss , M89N5FKxe , M89N5FKye , M89N5FKze , M89N5FMxe , & - M89N5FMye , M89N5FMze , M89N5MKxe , M89N5MKye , M89N5MKze , M89N5MMxe , M89N5MMye , & - M89N5MMze , M89N5RAxe , M89N5RAye , M89N5RAze , M89N5RDxe , M89N5RDye , M89N5RDze , & - M89N5TAxe , M89N5TAye , M89N5TAze , M89N5TDxss , M89N5TDyss , M89N5TDzss , M89N6FKxe , & - M89N6FKye , M89N6FKze , M89N6FMxe , M89N6FMye , M89N6FMze , M89N6MKxe , M89N6MKye , & - M89N6MKze , M89N6MMxe , M89N6MMye , M89N6MMze , M89N6RAxe , M89N6RAye , M89N6RAze , & - M89N6RDxe , M89N6RDye , M89N6RDze , M89N6TAxe , M89N6TAye , M89N6TAze , M89N6TDxss , & - M89N6TDyss , M89N6TDzss , M89N7FKxe , M89N7FKye , M89N7FKze , M89N7FMxe , M89N7FMye , & - M89N7FMze , M89N7MKxe , M89N7MKye , M89N7MKze , M89N7MMxe , M89N7MMye , M89N7MMze , & - M89N7RAxe , M89N7RAye , M89N7RAze , M89N7RDxe , M89N7RDye , M89N7RDze , M89N7TAxe , & - M89N7TAye , M89N7TAze , M89N7TDxss , M89N7TDyss , M89N7TDzss , M89N8FKxe , M89N8FKye , & - M89N8FKze , M89N8FMxe , M89N8FMye , M89N8FMze , M89N8MKxe , M89N8MKye , M89N8MKze , & - M89N8MMxe , M89N8MMye , M89N8MMze , M89N8RAxe , M89N8RAye , M89N8RAze , M89N8RDxe , & - M89N8RDye , M89N8RDze , M89N8TAxe , M89N8TAye , M89N8TAze , M89N8TDxss , M89N8TDyss , & - M89N8TDzss , M89N9FKxe , M89N9FKye , M89N9FKze , M89N9FMxe , M89N9FMye , M89N9FMze , & - M89N9MKxe , M89N9MKye , M89N9MKze , M89N9MMxe , M89N9MMye , M89N9MMze , M89N9RAxe , & - M89N9RAye , M89N9RAze , M89N9RDxe , M89N9RDye , M89N9RDze , M89N9TAxe , M89N9TAye , & - M89N9TAze , M89N9TDxss , M89N9TDyss , M89N9TDzss , M90N1FKxe , M90N1FKye , M90N1FKze , & - M90N1FMxe , M90N1FMye , M90N1FMze , M90N1MKxe , M90N1MKye , M90N1MKze , M90N1MMxe , & - M90N1MMye , M90N1MMze , M90N1RAxe , M90N1RAye , M90N1RAze , M90N1RDxe , M90N1RDye , & - M90N1RDze , M90N1TAxe , M90N1TAye , M90N1TAze , M90N1TDxss , M90N1TDyss , M90N1TDzss , & - M90N2FKxe , M90N2FKye , M90N2FKze , M90N2FMxe , M90N2FMye , M90N2FMze , M90N2MKxe , & - M90N2MKye , M90N2MKze , M90N2MMxe , M90N2MMye , M90N2MMze , M90N2RAxe , M90N2RAye , & - M90N2RAze , M90N2RDxe , M90N2RDye , M90N2RDze , M90N2TAxe , M90N2TAye , M90N2TAze , & - M90N2TDxss , M90N2TDyss , M90N2TDzss , M90N3FKxe , M90N3FKye , M90N3FKze , M90N3FMxe , & - M90N3FMye , M90N3FMze , M90N3MKxe , M90N3MKye , M90N3MKze , M90N3MMxe , M90N3MMye , & - M90N3MMze , M90N3RAxe , M90N3RAye , M90N3RAze , M90N3RDxe , M90N3RDye , M90N3RDze , & - M90N3TAxe , M90N3TAye , M90N3TAze , M90N3TDxss , M90N3TDyss , M90N3TDzss , M90N4FKxe , & - M90N4FKye , M90N4FKze , M90N4FMxe , M90N4FMye , M90N4FMze , M90N4MKxe , M90N4MKye , & - M90N4MKze , M90N4MMxe , M90N4MMye , M90N4MMze , M90N4RAxe , M90N4RAye , M90N4RAze , & - M90N4RDxe , M90N4RDye , M90N4RDze , M90N4TAxe , M90N4TAye , M90N4TAze , M90N4TDxss , & - M90N4TDyss , M90N4TDzss , M90N5FKxe , M90N5FKye , M90N5FKze , M90N5FMxe , M90N5FMye , & - M90N5FMze , M90N5MKxe , M90N5MKye , M90N5MKze , M90N5MMxe , M90N5MMye , M90N5MMze , & - M90N5RAxe , M90N5RAye , M90N5RAze , M90N5RDxe , M90N5RDye , M90N5RDze , M90N5TAxe , & - M90N5TAye , M90N5TAze , M90N5TDxss , M90N5TDyss , M90N5TDzss , M90N6FKxe , M90N6FKye , & - M90N6FKze , M90N6FMxe , M90N6FMye , M90N6FMze , M90N6MKxe , M90N6MKye , M90N6MKze , & - M90N6MMxe , M90N6MMye , M90N6MMze , M90N6RAxe , M90N6RAye , M90N6RAze , M90N6RDxe , & - M90N6RDye , M90N6RDze , M90N6TAxe , M90N6TAye , M90N6TAze , M90N6TDxss , M90N6TDyss , & - M90N6TDzss , M90N7FKxe , M90N7FKye , M90N7FKze , M90N7FMxe , M90N7FMye , M90N7FMze , & - M90N7MKxe , M90N7MKye , M90N7MKze , M90N7MMxe , M90N7MMye , M90N7MMze , M90N7RAxe , & - M90N7RAye , M90N7RAze , M90N7RDxe , M90N7RDye , M90N7RDze , M90N7TAxe , M90N7TAye , & - M90N7TAze , M90N7TDxss , M90N7TDyss , M90N7TDzss , M90N8FKxe , M90N8FKye , M90N8FKze , & - M90N8FMxe , M90N8FMye , M90N8FMze , M90N8MKxe , M90N8MKye , M90N8MKze , M90N8MMxe , & - M90N8MMye , M90N8MMze , M90N8RAxe , M90N8RAye , M90N8RAze , M90N8RDxe , M90N8RDye , & - M90N8RDze , M90N8TAxe , M90N8TAye , M90N8TAze , M90N8TDxss , M90N8TDyss , M90N8TDzss , & - M90N9FKxe , M90N9FKye , M90N9FKze , M90N9FMxe , M90N9FMye , M90N9FMze , M90N9MKxe , & - M90N9MKye , M90N9MKze , M90N9MMxe , M90N9MMye , M90N9MMze , M90N9RAxe , M90N9RAye , & - M90N9RAze , M90N9RDxe , M90N9RDye , M90N9RDze , M90N9TAxe , M90N9TAye , M90N9TAze , & - M90N9TDxss , M90N9TDyss , M90N9TDzss , M91N1FKxe , M91N1FKye , M91N1FKze , M91N1FMxe , & - M91N1FMye , M91N1FMze , M91N1MKxe , M91N1MKye , M91N1MKze , M91N1MMxe , M91N1MMye , & - M91N1MMze , M91N1RAxe , M91N1RAye , M91N1RAze , M91N1RDxe , M91N1RDye , M91N1RDze , & - M91N1TAxe , M91N1TAye , M91N1TAze , M91N1TDxss , M91N1TDyss , M91N1TDzss , M91N2FKxe , & - M91N2FKye , M91N2FKze , M91N2FMxe , M91N2FMye , M91N2FMze , M91N2MKxe , M91N2MKye , & - M91N2MKze , M91N2MMxe , M91N2MMye , M91N2MMze , M91N2RAxe , M91N2RAye , M91N2RAze , & - M91N2RDxe , M91N2RDye , M91N2RDze , M91N2TAxe , M91N2TAye , M91N2TAze , M91N2TDxss , & - M91N2TDyss , M91N2TDzss , M91N3FKxe , M91N3FKye , M91N3FKze , M91N3FMxe , M91N3FMye , & - M91N3FMze , M91N3MKxe , M91N3MKye , M91N3MKze , M91N3MMxe , M91N3MMye , M91N3MMze , & - M91N3RAxe , M91N3RAye , M91N3RAze , M91N3RDxe , M91N3RDye , M91N3RDze , M91N3TAxe , & - M91N3TAye , M91N3TAze , M91N3TDxss , M91N3TDyss , M91N3TDzss , M91N4FKxe , M91N4FKye , & - M91N4FKze , M91N4FMxe , M91N4FMye , M91N4FMze , M91N4MKxe , M91N4MKye , M91N4MKze , & - M91N4MMxe , M91N4MMye , M91N4MMze , M91N4RAxe , M91N4RAye , M91N4RAze , M91N4RDxe , & - M91N4RDye , M91N4RDze , M91N4TAxe , M91N4TAye , M91N4TAze , M91N4TDxss , M91N4TDyss , & - M91N4TDzss , M91N5FKxe , M91N5FKye , M91N5FKze , M91N5FMxe , M91N5FMye , M91N5FMze , & - M91N5MKxe , M91N5MKye , M91N5MKze , M91N5MMxe , M91N5MMye , M91N5MMze , M91N5RAxe , & - M91N5RAye , M91N5RAze , M91N5RDxe , M91N5RDye , M91N5RDze , M91N5TAxe , M91N5TAye , & - M91N5TAze , M91N5TDxss , M91N5TDyss , M91N5TDzss , M91N6FKxe , M91N6FKye , M91N6FKze , & - M91N6FMxe , M91N6FMye , M91N6FMze , M91N6MKxe , M91N6MKye , M91N6MKze , M91N6MMxe , & - M91N6MMye , M91N6MMze , M91N6RAxe , M91N6RAye , M91N6RAze , M91N6RDxe , M91N6RDye , & - M91N6RDze , M91N6TAxe , M91N6TAye , M91N6TAze , M91N6TDxss , M91N6TDyss , M91N6TDzss , & - M91N7FKxe , M91N7FKye , M91N7FKze , M91N7FMxe , M91N7FMye , M91N7FMze , M91N7MKxe , & - M91N7MKye , M91N7MKze , M91N7MMxe , M91N7MMye , M91N7MMze , M91N7RAxe , M91N7RAye , & - M91N7RAze , M91N7RDxe , M91N7RDye , M91N7RDze , M91N7TAxe , M91N7TAye , M91N7TAze , & - M91N7TDxss , M91N7TDyss , M91N7TDzss , M91N8FKxe , M91N8FKye , M91N8FKze , M91N8FMxe , & - M91N8FMye , M91N8FMze , M91N8MKxe , M91N8MKye , M91N8MKze , M91N8MMxe , M91N8MMye , & - M91N8MMze , M91N8RAxe , M91N8RAye , M91N8RAze , M91N8RDxe , M91N8RDye , M91N8RDze , & - M91N8TAxe , M91N8TAye , M91N8TAze , M91N8TDxss , M91N8TDyss , M91N8TDzss , M91N9FKxe , & - M91N9FKye , M91N9FKze , M91N9FMxe , M91N9FMye , M91N9FMze , M91N9MKxe , M91N9MKye , & - M91N9MKze , M91N9MMxe , M91N9MMye , M91N9MMze , M91N9RAxe , M91N9RAye , M91N9RAze , & - M91N9RDxe , M91N9RDye , M91N9RDze , M91N9TAxe , M91N9TAye , M91N9TAze , M91N9TDxss , & - M91N9TDyss , M91N9TDzss , M92N1FKxe , M92N1FKye , M92N1FKze , M92N1FMxe , M92N1FMye , & - M92N1FMze , M92N1MKxe , M92N1MKye , M92N1MKze , M92N1MMxe , M92N1MMye , M92N1MMze , & - M92N1RAxe , M92N1RAye , M92N1RAze , M92N1RDxe , M92N1RDye , M92N1RDze , M92N1TAxe , & - M92N1TAye , M92N1TAze , M92N1TDxss , M92N1TDyss , M92N1TDzss , M92N2FKxe , M92N2FKye , & - M92N2FKze , M92N2FMxe , M92N2FMye , M92N2FMze , M92N2MKxe , M92N2MKye , M92N2MKze , & - M92N2MMxe , M92N2MMye , M92N2MMze , M92N2RAxe , M92N2RAye , M92N2RAze , M92N2RDxe , & - M92N2RDye , M92N2RDze , M92N2TAxe , M92N2TAye , M92N2TAze , M92N2TDxss , M92N2TDyss , & - M92N2TDzss , M92N3FKxe , M92N3FKye , M92N3FKze , M92N3FMxe , M92N3FMye , M92N3FMze , & - M92N3MKxe , M92N3MKye , M92N3MKze , M92N3MMxe , M92N3MMye , M92N3MMze , M92N3RAxe , & - M92N3RAye , M92N3RAze , M92N3RDxe , M92N3RDye , M92N3RDze , M92N3TAxe , M92N3TAye , & - M92N3TAze , M92N3TDxss , M92N3TDyss , M92N3TDzss , M92N4FKxe , M92N4FKye , M92N4FKze , & - M92N4FMxe , M92N4FMye , M92N4FMze , M92N4MKxe , M92N4MKye , M92N4MKze , M92N4MMxe , & - M92N4MMye , M92N4MMze , M92N4RAxe , M92N4RAye , M92N4RAze , M92N4RDxe , M92N4RDye , & - M92N4RDze , M92N4TAxe , M92N4TAye , M92N4TAze , M92N4TDxss , M92N4TDyss , M92N4TDzss , & - M92N5FKxe , M92N5FKye , M92N5FKze , M92N5FMxe , M92N5FMye , M92N5FMze , M92N5MKxe , & - M92N5MKye , M92N5MKze , M92N5MMxe , M92N5MMye , M92N5MMze , M92N5RAxe , M92N5RAye , & - M92N5RAze , M92N5RDxe , M92N5RDye , M92N5RDze , M92N5TAxe , M92N5TAye , M92N5TAze , & - M92N5TDxss , M92N5TDyss , M92N5TDzss , M92N6FKxe , M92N6FKye , M92N6FKze , M92N6FMxe , & - M92N6FMye , M92N6FMze , M92N6MKxe , M92N6MKye , M92N6MKze , M92N6MMxe , M92N6MMye , & - M92N6MMze , M92N6RAxe , M92N6RAye , M92N6RAze , M92N6RDxe , M92N6RDye , M92N6RDze , & - M92N6TAxe , M92N6TAye , M92N6TAze , M92N6TDxss , M92N6TDyss , M92N6TDzss , M92N7FKxe , & - M92N7FKye , M92N7FKze , M92N7FMxe , M92N7FMye , M92N7FMze , M92N7MKxe , M92N7MKye , & - M92N7MKze , M92N7MMxe , M92N7MMye , M92N7MMze , M92N7RAxe , M92N7RAye , M92N7RAze , & - M92N7RDxe , M92N7RDye , M92N7RDze , M92N7TAxe , M92N7TAye , M92N7TAze , M92N7TDxss , & - M92N7TDyss , M92N7TDzss , M92N8FKxe , M92N8FKye , M92N8FKze , M92N8FMxe , M92N8FMye , & - M92N8FMze , M92N8MKxe , M92N8MKye , M92N8MKze , M92N8MMxe , M92N8MMye , M92N8MMze , & - M92N8RAxe , M92N8RAye , M92N8RAze , M92N8RDxe , M92N8RDye , M92N8RDze , M92N8TAxe , & - M92N8TAye , M92N8TAze , M92N8TDxss , M92N8TDyss , M92N8TDzss , M92N9FKxe , M92N9FKye , & - M92N9FKze , M92N9FMxe , M92N9FMye , M92N9FMze , M92N9MKxe , M92N9MKye , M92N9MKze , & - M92N9MMxe , M92N9MMye , M92N9MMze , M92N9RAxe , M92N9RAye , M92N9RAze , M92N9RDxe , & - M92N9RDye , M92N9RDze , M92N9TAxe , M92N9TAye , M92N9TAze , M92N9TDxss , M92N9TDyss , & - M92N9TDzss , M93N1FKxe , M93N1FKye , M93N1FKze , M93N1FMxe , M93N1FMye , M93N1FMze , & - M93N1MKxe , M93N1MKye , M93N1MKze , M93N1MMxe , M93N1MMye , M93N1MMze , M93N1RAxe , & - M93N1RAye , M93N1RAze , M93N1RDxe , M93N1RDye , M93N1RDze , M93N1TAxe , M93N1TAye , & - M93N1TAze , M93N1TDxss , M93N1TDyss , M93N1TDzss , M93N2FKxe , M93N2FKye , M93N2FKze , & - M93N2FMxe , M93N2FMye , M93N2FMze , M93N2MKxe , M93N2MKye , M93N2MKze , M93N2MMxe , & - M93N2MMye , M93N2MMze , M93N2RAxe , M93N2RAye , M93N2RAze , M93N2RDxe , M93N2RDye , & - M93N2RDze , M93N2TAxe , M93N2TAye , M93N2TAze , M93N2TDxss , M93N2TDyss , M93N2TDzss , & - M93N3FKxe , M93N3FKye , M93N3FKze , M93N3FMxe , M93N3FMye , M93N3FMze , M93N3MKxe , & - M93N3MKye , M93N3MKze , M93N3MMxe , M93N3MMye , M93N3MMze , M93N3RAxe , M93N3RAye , & - M93N3RAze , M93N3RDxe , M93N3RDye , M93N3RDze , M93N3TAxe , M93N3TAye , M93N3TAze , & - M93N3TDxss , M93N3TDyss , M93N3TDzss , M93N4FKxe , M93N4FKye , M93N4FKze , M93N4FMxe , & - M93N4FMye , M93N4FMze , M93N4MKxe , M93N4MKye , M93N4MKze , M93N4MMxe , M93N4MMye , & - M93N4MMze , M93N4RAxe , M93N4RAye , M93N4RAze , M93N4RDxe , M93N4RDye , M93N4RDze , & - M93N4TAxe , M93N4TAye , M93N4TAze , M93N4TDxss , M93N4TDyss , M93N4TDzss , M93N5FKxe , & - M93N5FKye , M93N5FKze , M93N5FMxe , M93N5FMye , M93N5FMze , M93N5MKxe , M93N5MKye , & - M93N5MKze , M93N5MMxe , M93N5MMye , M93N5MMze , M93N5RAxe , M93N5RAye , M93N5RAze , & - M93N5RDxe , M93N5RDye , M93N5RDze , M93N5TAxe , M93N5TAye , M93N5TAze , M93N5TDxss , & - M93N5TDyss , M93N5TDzss , M93N6FKxe , M93N6FKye , M93N6FKze , M93N6FMxe , M93N6FMye , & - M93N6FMze , M93N6MKxe , M93N6MKye , M93N6MKze , M93N6MMxe , M93N6MMye , M93N6MMze , & - M93N6RAxe , M93N6RAye , M93N6RAze , M93N6RDxe , M93N6RDye , M93N6RDze , M93N6TAxe , & - M93N6TAye , M93N6TAze , M93N6TDxss , M93N6TDyss , M93N6TDzss , M93N7FKxe , M93N7FKye , & - M93N7FKze , M93N7FMxe , M93N7FMye , M93N7FMze /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry13(1665) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) - M93N7MKxe , M93N7MKye , M93N7MKze , M93N7MMxe , M93N7MMye , M93N7MMze , M93N7RAxe , & - M93N7RAye , M93N7RAze , M93N7RDxe , M93N7RDye , M93N7RDze , M93N7TAxe , M93N7TAye , & - M93N7TAze , M93N7TDxss , M93N7TDyss , M93N7TDzss , M93N8FKxe , M93N8FKye , M93N8FKze , & - M93N8FMxe , M93N8FMye , M93N8FMze , M93N8MKxe , M93N8MKye , M93N8MKze , M93N8MMxe , & - M93N8MMye , M93N8MMze , M93N8RAxe , M93N8RAye , M93N8RAze , M93N8RDxe , M93N8RDye , & - M93N8RDze , M93N8TAxe , M93N8TAye , M93N8TAze , M93N8TDxss , M93N8TDyss , M93N8TDzss , & - M93N9FKxe , M93N9FKye , M93N9FKze , M93N9FMxe , M93N9FMye , M93N9FMze , M93N9MKxe , & - M93N9MKye , M93N9MKze , M93N9MMxe , M93N9MMye , M93N9MMze , M93N9RAxe , M93N9RAye , & - M93N9RAze , M93N9RDxe , M93N9RDye , M93N9RDze , M93N9TAxe , M93N9TAye , M93N9TAze , & - M93N9TDxss , M93N9TDyss , M93N9TDzss , M94N1FKxe , M94N1FKye , M94N1FKze , M94N1FMxe , & - M94N1FMye , M94N1FMze , M94N1MKxe , M94N1MKye , M94N1MKze , M94N1MMxe , M94N1MMye , & - M94N1MMze , M94N1RAxe , M94N1RAye , M94N1RAze , M94N1RDxe , M94N1RDye , M94N1RDze , & - M94N1TAxe , M94N1TAye , M94N1TAze , M94N1TDxss , M94N1TDyss , M94N1TDzss , M94N2FKxe , & - M94N2FKye , M94N2FKze , M94N2FMxe , M94N2FMye , M94N2FMze , M94N2MKxe , M94N2MKye , & - M94N2MKze , M94N2MMxe , M94N2MMye , M94N2MMze , M94N2RAxe , M94N2RAye , M94N2RAze , & - M94N2RDxe , M94N2RDye , M94N2RDze , M94N2TAxe , M94N2TAye , M94N2TAze , M94N2TDxss , & - M94N2TDyss , M94N2TDzss , M94N3FKxe , M94N3FKye , M94N3FKze , M94N3FMxe , M94N3FMye , & - M94N3FMze , M94N3MKxe , M94N3MKye , M94N3MKze , M94N3MMxe , M94N3MMye , M94N3MMze , & - M94N3RAxe , M94N3RAye , M94N3RAze , M94N3RDxe , M94N3RDye , M94N3RDze , M94N3TAxe , & - M94N3TAye , M94N3TAze , M94N3TDxss , M94N3TDyss , M94N3TDzss , M94N4FKxe , M94N4FKye , & - M94N4FKze , M94N4FMxe , M94N4FMye , M94N4FMze , M94N4MKxe , M94N4MKye , M94N4MKze , & - M94N4MMxe , M94N4MMye , M94N4MMze , M94N4RAxe , M94N4RAye , M94N4RAze , M94N4RDxe , & - M94N4RDye , M94N4RDze , M94N4TAxe , M94N4TAye , M94N4TAze , M94N4TDxss , M94N4TDyss , & - M94N4TDzss , M94N5FKxe , M94N5FKye , M94N5FKze , M94N5FMxe , M94N5FMye , M94N5FMze , & - M94N5MKxe , M94N5MKye , M94N5MKze , M94N5MMxe , M94N5MMye , M94N5MMze , M94N5RAxe , & - M94N5RAye , M94N5RAze , M94N5RDxe , M94N5RDye , M94N5RDze , M94N5TAxe , M94N5TAye , & - M94N5TAze , M94N5TDxss , M94N5TDyss , M94N5TDzss , M94N6FKxe , M94N6FKye , M94N6FKze , & - M94N6FMxe , M94N6FMye , M94N6FMze , M94N6MKxe , M94N6MKye , M94N6MKze , M94N6MMxe , & - M94N6MMye , M94N6MMze , M94N6RAxe , M94N6RAye , M94N6RAze , M94N6RDxe , M94N6RDye , & - M94N6RDze , M94N6TAxe , M94N6TAye , M94N6TAze , M94N6TDxss , M94N6TDyss , M94N6TDzss , & - M94N7FKxe , M94N7FKye , M94N7FKze , M94N7FMxe , M94N7FMye , M94N7FMze , M94N7MKxe , & - M94N7MKye , M94N7MKze , M94N7MMxe , M94N7MMye , M94N7MMze , M94N7RAxe , M94N7RAye , & - M94N7RAze , M94N7RDxe , M94N7RDye , M94N7RDze , M94N7TAxe , M94N7TAye , M94N7TAze , & - M94N7TDxss , M94N7TDyss , M94N7TDzss , M94N8FKxe , M94N8FKye , M94N8FKze , M94N8FMxe , & - M94N8FMye , M94N8FMze , M94N8MKxe , M94N8MKye , M94N8MKze , M94N8MMxe , M94N8MMye , & - M94N8MMze , M94N8RAxe , M94N8RAye , M94N8RAze , M94N8RDxe , M94N8RDye , M94N8RDze , & - M94N8TAxe , M94N8TAye , M94N8TAze , M94N8TDxss , M94N8TDyss , M94N8TDzss , M94N9FKxe , & - M94N9FKye , M94N9FKze , M94N9FMxe , M94N9FMye , M94N9FMze , M94N9MKxe , M94N9MKye , & - M94N9MKze , M94N9MMxe , M94N9MMye , M94N9MMze , M94N9RAxe , M94N9RAye , M94N9RAze , & - M94N9RDxe , M94N9RDye , M94N9RDze , M94N9TAxe , M94N9TAye , M94N9TAze , M94N9TDxss , & - M94N9TDyss , M94N9TDzss , M95N1FKxe , M95N1FKye , M95N1FKze , M95N1FMxe , M95N1FMye , & - M95N1FMze , M95N1MKxe , M95N1MKye , M95N1MKze , M95N1MMxe , M95N1MMye , M95N1MMze , & - M95N1RAxe , M95N1RAye , M95N1RAze , M95N1RDxe , M95N1RDye , M95N1RDze , M95N1TAxe , & - M95N1TAye , M95N1TAze , M95N1TDxss , M95N1TDyss , M95N1TDzss , M95N2FKxe , M95N2FKye , & - M95N2FKze , M95N2FMxe , M95N2FMye , M95N2FMze , M95N2MKxe , M95N2MKye , M95N2MKze , & - M95N2MMxe , M95N2MMye , M95N2MMze , M95N2RAxe , M95N2RAye , M95N2RAze , M95N2RDxe , & - M95N2RDye , M95N2RDze , M95N2TAxe , M95N2TAye , M95N2TAze , M95N2TDxss , M95N2TDyss , & - M95N2TDzss , M95N3FKxe , M95N3FKye , M95N3FKze , M95N3FMxe , M95N3FMye , M95N3FMze , & - M95N3MKxe , M95N3MKye , M95N3MKze , M95N3MMxe , M95N3MMye , M95N3MMze , M95N3RAxe , & - M95N3RAye , M95N3RAze , M95N3RDxe , M95N3RDye , M95N3RDze , M95N3TAxe , M95N3TAye , & - M95N3TAze , M95N3TDxss , M95N3TDyss , M95N3TDzss , M95N4FKxe , M95N4FKye , M95N4FKze , & - M95N4FMxe , M95N4FMye , M95N4FMze , M95N4MKxe , M95N4MKye , M95N4MKze , M95N4MMxe , & - M95N4MMye , M95N4MMze , M95N4RAxe , M95N4RAye , M95N4RAze , M95N4RDxe , M95N4RDye , & - M95N4RDze , M95N4TAxe , M95N4TAye , M95N4TAze , M95N4TDxss , M95N4TDyss , M95N4TDzss , & - M95N5FKxe , M95N5FKye , M95N5FKze , M95N5FMxe , M95N5FMye , M95N5FMze , M95N5MKxe , & - M95N5MKye , M95N5MKze , M95N5MMxe , M95N5MMye , M95N5MMze , M95N5RAxe , M95N5RAye , & - M95N5RAze , M95N5RDxe , M95N5RDye , M95N5RDze , M95N5TAxe , M95N5TAye , M95N5TAze , & - M95N5TDxss , M95N5TDyss , M95N5TDzss , M95N6FKxe , M95N6FKye , M95N6FKze , M95N6FMxe , & - M95N6FMye , M95N6FMze , M95N6MKxe , M95N6MKye , M95N6MKze , M95N6MMxe , M95N6MMye , & - M95N6MMze , M95N6RAxe , M95N6RAye , M95N6RAze , M95N6RDxe , M95N6RDye , M95N6RDze , & - M95N6TAxe , M95N6TAye , M95N6TAze , M95N6TDxss , M95N6TDyss , M95N6TDzss , M95N7FKxe , & - M95N7FKye , M95N7FKze , M95N7FMxe , M95N7FMye , M95N7FMze , M95N7MKxe , M95N7MKye , & - M95N7MKze , M95N7MMxe , M95N7MMye , M95N7MMze , M95N7RAxe , M95N7RAye , M95N7RAze , & - M95N7RDxe , M95N7RDye , M95N7RDze , M95N7TAxe , M95N7TAye , M95N7TAze , M95N7TDxss , & - M95N7TDyss , M95N7TDzss , M95N8FKxe , M95N8FKye , M95N8FKze , M95N8FMxe , M95N8FMye , & - M95N8FMze , M95N8MKxe , M95N8MKye , M95N8MKze , M95N8MMxe , M95N8MMye , M95N8MMze , & - M95N8RAxe , M95N8RAye , M95N8RAze , M95N8RDxe , M95N8RDye , M95N8RDze , M95N8TAxe , & - M95N8TAye , M95N8TAze , M95N8TDxss , M95N8TDyss , M95N8TDzss , M95N9FKxe , M95N9FKye , & - M95N9FKze , M95N9FMxe , M95N9FMye , M95N9FMze , M95N9MKxe , M95N9MKye , M95N9MKze , & - M95N9MMxe , M95N9MMye , M95N9MMze , M95N9RAxe , M95N9RAye , M95N9RAze , M95N9RDxe , & - M95N9RDye , M95N9RDze , M95N9TAxe , M95N9TAye , M95N9TAze , M95N9TDxss , M95N9TDyss , & - M95N9TDzss , M96N1FKxe , M96N1FKye , M96N1FKze , M96N1FMxe , M96N1FMye , M96N1FMze , & - M96N1MKxe , M96N1MKye , M96N1MKze , M96N1MMxe , M96N1MMye , M96N1MMze , M96N1RAxe , & - M96N1RAye , M96N1RAze , M96N1RDxe , M96N1RDye , M96N1RDze , M96N1TAxe , M96N1TAye , & - M96N1TAze , M96N1TDxss , M96N1TDyss , M96N1TDzss , M96N2FKxe , M96N2FKye , M96N2FKze , & - M96N2FMxe , M96N2FMye , M96N2FMze , M96N2MKxe , M96N2MKye , M96N2MKze , M96N2MMxe , & - M96N2MMye , M96N2MMze , M96N2RAxe , M96N2RAye , M96N2RAze , M96N2RDxe , M96N2RDye , & - M96N2RDze , M96N2TAxe , M96N2TAye , M96N2TAze , M96N2TDxss , M96N2TDyss , M96N2TDzss , & - M96N3FKxe , M96N3FKye , M96N3FKze , M96N3FMxe , M96N3FMye , M96N3FMze , M96N3MKxe , & - M96N3MKye , M96N3MKze , M96N3MMxe , M96N3MMye , M96N3MMze , M96N3RAxe , M96N3RAye , & - M96N3RAze , M96N3RDxe , M96N3RDye , M96N3RDze , M96N3TAxe , M96N3TAye , M96N3TAze , & - M96N3TDxss , M96N3TDyss , M96N3TDzss , M96N4FKxe , M96N4FKye , M96N4FKze , M96N4FMxe , & - M96N4FMye , M96N4FMze , M96N4MKxe , M96N4MKye , M96N4MKze , M96N4MMxe , M96N4MMye , & - M96N4MMze , M96N4RAxe , M96N4RAye , M96N4RAze , M96N4RDxe , M96N4RDye , M96N4RDze , & - M96N4TAxe , M96N4TAye , M96N4TAze , M96N4TDxss , M96N4TDyss , M96N4TDzss , M96N5FKxe , & - M96N5FKye , M96N5FKze , M96N5FMxe , M96N5FMye , M96N5FMze , M96N5MKxe , M96N5MKye , & - M96N5MKze , M96N5MMxe , M96N5MMye , M96N5MMze , M96N5RAxe , M96N5RAye , M96N5RAze , & - M96N5RDxe , M96N5RDye , M96N5RDze , M96N5TAxe , M96N5TAye , M96N5TAze , M96N5TDxss , & - M96N5TDyss , M96N5TDzss , M96N6FKxe , M96N6FKye , M96N6FKze , M96N6FMxe , M96N6FMye , & - M96N6FMze , M96N6MKxe , M96N6MKye , M96N6MKze , M96N6MMxe , M96N6MMye , M96N6MMze , & - M96N6RAxe , M96N6RAye , M96N6RAze , M96N6RDxe , M96N6RDye , M96N6RDze , M96N6TAxe , & - M96N6TAye , M96N6TAze , M96N6TDxss , M96N6TDyss , M96N6TDzss , M96N7FKxe , M96N7FKye , & - M96N7FKze , M96N7FMxe , M96N7FMye , M96N7FMze , M96N7MKxe , M96N7MKye , M96N7MKze , & - M96N7MMxe , M96N7MMye , M96N7MMze , M96N7RAxe , M96N7RAye , M96N7RAze , M96N7RDxe , & - M96N7RDye , M96N7RDze , M96N7TAxe , M96N7TAye , M96N7TAze , M96N7TDxss , M96N7TDyss , & - M96N7TDzss , M96N8FKxe , M96N8FKye , M96N8FKze , M96N8FMxe , M96N8FMye , M96N8FMze , & - M96N8MKxe , M96N8MKye , M96N8MKze , M96N8MMxe , M96N8MMye , M96N8MMze , M96N8RAxe , & - M96N8RAye , M96N8RAze , M96N8RDxe , M96N8RDye , M96N8RDze , M96N8TAxe , M96N8TAye , & - M96N8TAze , M96N8TDxss , M96N8TDyss , M96N8TDzss , M96N9FKxe , M96N9FKye , M96N9FKze , & - M96N9FMxe , M96N9FMye , M96N9FMze , M96N9MKxe , M96N9MKye , M96N9MKze , M96N9MMxe , & - M96N9MMye , M96N9MMze , M96N9RAxe , M96N9RAye , M96N9RAze , M96N9RDxe , M96N9RDye , & - M96N9RDze , M96N9TAxe , M96N9TAye , M96N9TAze , M96N9TDxss , M96N9TDyss , M96N9TDzss , & - M97N1FKxe , M97N1FKye , M97N1FKze , M97N1FMxe , M97N1FMye , M97N1FMze , M97N1MKxe , & - M97N1MKye , M97N1MKze , M97N1MMxe , M97N1MMye , M97N1MMze , M97N1RAxe , M97N1RAye , & - M97N1RAze , M97N1RDxe , M97N1RDye , M97N1RDze , M97N1TAxe , M97N1TAye , M97N1TAze , & - M97N1TDxss , M97N1TDyss , M97N1TDzss , M97N2FKxe , M97N2FKye , M97N2FKze , M97N2FMxe , & - M97N2FMye , M97N2FMze , M97N2MKxe , M97N2MKye , M97N2MKze , M97N2MMxe , M97N2MMye , & - M97N2MMze , M97N2RAxe , M97N2RAye , M97N2RAze , M97N2RDxe , M97N2RDye , M97N2RDze , & - M97N2TAxe , M97N2TAye , M97N2TAze , M97N2TDxss , M97N2TDyss , M97N2TDzss , M97N3FKxe , & - M97N3FKye , M97N3FKze , M97N3FMxe , M97N3FMye , M97N3FMze , M97N3MKxe , M97N3MKye , & - M97N3MKze , M97N3MMxe , M97N3MMye , M97N3MMze , M97N3RAxe , M97N3RAye , M97N3RAze , & - M97N3RDxe , M97N3RDye , M97N3RDze , M97N3TAxe , M97N3TAye , M97N3TAze , M97N3TDxss , & - M97N3TDyss , M97N3TDzss , M97N4FKxe , M97N4FKye , M97N4FKze , M97N4FMxe , M97N4FMye , & - M97N4FMze , M97N4MKxe , M97N4MKye , M97N4MKze , M97N4MMxe , M97N4MMye , M97N4MMze , & - M97N4RAxe , M97N4RAye , M97N4RAze , M97N4RDxe , M97N4RDye , M97N4RDze , M97N4TAxe , & - M97N4TAye , M97N4TAze , M97N4TDxss , M97N4TDyss , M97N4TDzss , M97N5FKxe , M97N5FKye , & - M97N5FKze , M97N5FMxe , M97N5FMye , M97N5FMze , M97N5MKxe , M97N5MKye , M97N5MKze , & - M97N5MMxe , M97N5MMye , M97N5MMze , M97N5RAxe , M97N5RAye , M97N5RAze , M97N5RDxe , & - M97N5RDye , M97N5RDze , M97N5TAxe , M97N5TAye , M97N5TAze , M97N5TDxss , M97N5TDyss , & - M97N5TDzss , M97N6FKxe , M97N6FKye , M97N6FKze , M97N6FMxe , M97N6FMye , M97N6FMze , & - M97N6MKxe , M97N6MKye , M97N6MKze , M97N6MMxe , M97N6MMye , M97N6MMze , M97N6RAxe , & - M97N6RAye , M97N6RAze , M97N6RDxe , M97N6RDye , M97N6RDze , M97N6TAxe , M97N6TAye , & - M97N6TAze , M97N6TDxss , M97N6TDyss , M97N6TDzss , M97N7FKxe , M97N7FKye , M97N7FKze , & - M97N7FMxe , M97N7FMye , M97N7FMze , M97N7MKxe , M97N7MKye , M97N7MKze , M97N7MMxe , & - M97N7MMye , M97N7MMze , M97N7RAxe , M97N7RAye , M97N7RAze , M97N7RDxe , M97N7RDye , & - M97N7RDze , M97N7TAxe , M97N7TAye , M97N7TAze , M97N7TDxss , M97N7TDyss , M97N7TDzss , & - M97N8FKxe , M97N8FKye , M97N8FKze , M97N8FMxe , M97N8FMye , M97N8FMze , M97N8MKxe , & - M97N8MKye , M97N8MKze , M97N8MMxe , M97N8MMye , M97N8MMze , M97N8RAxe , M97N8RAye , & - M97N8RAze , M97N8RDxe , M97N8RDye , M97N8RDze , M97N8TAxe , M97N8TAye , M97N8TAze , & - M97N8TDxss , M97N8TDyss , M97N8TDzss , M97N9FKxe , M97N9FKye , M97N9FKze , M97N9FMxe , & - M97N9FMye , M97N9FMze , M97N9MKxe , M97N9MKye , M97N9MKze , M97N9MMxe , M97N9MMye , & - M97N9MMze , M97N9RAxe , M97N9RAye , M97N9RAze , M97N9RDxe , M97N9RDye , M97N9RDze , & - M97N9TAxe , M97N9TAye , M97N9TAze , M97N9TDxss , M97N9TDyss , M97N9TDzss , M98N1FKxe , & - M98N1FKye , M98N1FKze , M98N1FMxe , M98N1FMye , M98N1FMze , M98N1MKxe , M98N1MKye , & - M98N1MKze , M98N1MMxe , M98N1MMye , M98N1MMze , M98N1RAxe , M98N1RAye , M98N1RAze , & - M98N1RDxe , M98N1RDye , M98N1RDze , M98N1TAxe , M98N1TAye , M98N1TAze , M98N1TDxss , & - M98N1TDyss , M98N1TDzss , M98N2FKxe , M98N2FKye , M98N2FKze , M98N2FMxe , M98N2FMye , & - M98N2FMze , M98N2MKxe , M98N2MKye , M98N2MKze , M98N2MMxe , M98N2MMye , M98N2MMze , & - M98N2RAxe , M98N2RAye , M98N2RAze , M98N2RDxe , M98N2RDye , M98N2RDze , M98N2TAxe , & - M98N2TAye , M98N2TAze , M98N2TDxss , M98N2TDyss , M98N2TDzss , M98N3FKxe , M98N3FKye , & - M98N3FKze , M98N3FMxe , M98N3FMye , M98N3FMze , M98N3MKxe , M98N3MKye , M98N3MKze , & - M98N3MMxe , M98N3MMye , M98N3MMze , M98N3RAxe , M98N3RAye , M98N3RAze , M98N3RDxe , & - M98N3RDye , M98N3RDze , M98N3TAxe , M98N3TAye , M98N3TAze , M98N3TDxss , M98N3TDyss , & - M98N3TDzss , M98N4FKxe , M98N4FKye , M98N4FKze , M98N4FMxe , M98N4FMye , M98N4FMze , & - M98N4MKxe , M98N4MKye , M98N4MKze , M98N4MMxe , M98N4MMye , M98N4MMze , M98N4RAxe , & - M98N4RAye , M98N4RAze , M98N4RDxe , M98N4RDye , M98N4RDze , M98N4TAxe , M98N4TAye , & - M98N4TAze , M98N4TDxss , M98N4TDyss , M98N4TDzss , M98N5FKxe , M98N5FKye , M98N5FKze , & - M98N5FMxe , M98N5FMye , M98N5FMze , M98N5MKxe , M98N5MKye , M98N5MKze , M98N5MMxe , & - M98N5MMye , M98N5MMze , M98N5RAxe , M98N5RAye , M98N5RAze , M98N5RDxe , M98N5RDye , & - M98N5RDze , M98N5TAxe , M98N5TAye , M98N5TAze , M98N5TDxss , M98N5TDyss , M98N5TDzss , & - M98N6FKxe , M98N6FKye , M98N6FKze , M98N6FMxe , M98N6FMye , M98N6FMze , M98N6MKxe , & - M98N6MKye , M98N6MKze , M98N6MMxe , M98N6MMye , M98N6MMze , M98N6RAxe , M98N6RAye , & - M98N6RAze , M98N6RDxe , M98N6RDye , M98N6RDze , M98N6TAxe , M98N6TAye , M98N6TAze , & - M98N6TDxss , M98N6TDyss , M98N6TDzss , M98N7FKxe , M98N7FKye , M98N7FKze , M98N7FMxe , & - M98N7FMye , M98N7FMze , M98N7MKxe , M98N7MKye , M98N7MKze , M98N7MMxe , M98N7MMye , & - M98N7MMze , M98N7RAxe , M98N7RAye , M98N7RAze , M98N7RDxe , M98N7RDye , M98N7RDze , & - M98N7TAxe , M98N7TAye , M98N7TAze , M98N7TDxss , M98N7TDyss , M98N7TDzss , M98N8FKxe , & - M98N8FKye , M98N8FKze , M98N8FMxe , M98N8FMye , M98N8FMze , M98N8MKxe , M98N8MKye , & - M98N8MKze , M98N8MMxe , M98N8MMye , M98N8MMze , M98N8RAxe , M98N8RAye , M98N8RAze , & - M98N8RDxe , M98N8RDye , M98N8RDze , M98N8TAxe , M98N8TAye , M98N8TAze , M98N8TDxss , & - M98N8TDyss , M98N8TDzss , M98N9FKxe , M98N9FKye , M98N9FKze , M98N9FMxe , M98N9FMye , & - M98N9FMze , M98N9MKxe , M98N9MKye , M98N9MKze , M98N9MMxe , M98N9MMye , M98N9MMze , & - M98N9RAxe , M98N9RAye , M98N9RAze , M98N9RDxe , M98N9RDye , M98N9RDze , M98N9TAxe , & - M98N9TAye , M98N9TAze , M98N9TDxss , M98N9TDyss , M98N9TDzss , M99N1FKxe , M99N1FKye , & - M99N1FKze , M99N1FMxe , M99N1FMye , M99N1FMze , M99N1MKxe , M99N1MKye , M99N1MKze , & - M99N1MMxe , M99N1MMye , M99N1MMze , M99N1RAxe , M99N1RAye , M99N1RAze , M99N1RDxe , & - M99N1RDye , M99N1RDze , M99N1TAxe , M99N1TAye , M99N1TAze , M99N1TDxss , M99N1TDyss , & - M99N1TDzss , M99N2FKxe , M99N2FKye , M99N2FKze , M99N2FMxe , M99N2FMye , M99N2FMze , & - M99N2MKxe , M99N2MKye , M99N2MKze , M99N2MMxe , M99N2MMye , M99N2MMze , M99N2RAxe , & - M99N2RAye , M99N2RAze , M99N2RDxe , M99N2RDye , M99N2RDze , M99N2TAxe , M99N2TAye , & - M99N2TAze , M99N2TDxss , M99N2TDyss , M99N2TDzss , M99N3FKxe , M99N3FKye , M99N3FKze , & - M99N3FMxe , M99N3FMye , M99N3FMze , M99N3MKxe , M99N3MKye , M99N3MKze , M99N3MMxe , & - M99N3MMye , M99N3MMze , M99N3RAxe , M99N3RAye , M99N3RAze , M99N3RDxe , M99N3RDye , & - M99N3RDze , M99N3TAxe , M99N3TAye , M99N3TAze , M99N3TDxss , M99N3TDyss , M99N3TDzss , & - M99N4FKxe , M99N4FKye , M99N4FKze , M99N4FMxe , M99N4FMye , M99N4FMze , M99N4MKxe , & - M99N4MKye , M99N4MKze , M99N4MMxe , M99N4MMye , M99N4MMze , M99N4RAxe , M99N4RAye , & - M99N4RAze , M99N4RDxe , M99N4RDye , M99N4RDze , M99N4TAxe , M99N4TAye , M99N4TAze , & - M99N4TDxss , M99N4TDyss , M99N4TDzss , M99N5FKxe , M99N5FKye , M99N5FKze , M99N5FMxe , & - M99N5FMye , M99N5FMze , M99N5MKxe , M99N5MKye , M99N5MKze , M99N5MMxe , M99N5MMye , & - M99N5MMze , M99N5RAxe , M99N5RAye , M99N5RAze , M99N5RDxe , M99N5RDye , M99N5RDze , & - M99N5TAxe , M99N5TAye , M99N5TAze , M99N5TDxss , M99N5TDyss , M99N5TDzss , M99N6FKxe , & - M99N6FKye , M99N6FKze , M99N6FMxe , M99N6FMye , M99N6FMze , M99N6MKxe , M99N6MKye , & - M99N6MKze , M99N6MMxe , M99N6MMye , M99N6MMze , M99N6RAxe , M99N6RAye , M99N6RAze , & - M99N6RDxe , M99N6RDye , M99N6RDze , M99N6TAxe , M99N6TAye , M99N6TAze , M99N6TDxss , & - M99N6TDyss , M99N6TDzss , M99N7FKxe , M99N7FKye , M99N7FKze , M99N7FMxe , M99N7FMye , & - M99N7FMze , M99N7MKxe , M99N7MKye , M99N7MKze , M99N7MMxe , M99N7MMye , M99N7MMze , & - M99N7RAxe , M99N7RAye , M99N7RAze , M99N7RDxe , M99N7RDye , M99N7RDze , M99N7TAxe , & - M99N7TAye , M99N7TAze , M99N7TDxss , M99N7TDyss , M99N7TDzss , M99N8FKxe , M99N8FKye , & - M99N8FKze , M99N8FMxe , M99N8FMye , M99N8FMze , M99N8MKxe , M99N8MKye , M99N8MKze , & - M99N8MMxe , M99N8MMye , M99N8MMze , M99N8RAxe , M99N8RAye , M99N8RAze , M99N8RDxe , & - M99N8RDye , M99N8RDze , M99N8TAxe , M99N8TAye , M99N8TAze , M99N8TDxss , M99N8TDyss , & - M99N8TDzss , M99N9FKxe , M99N9FKye , M99N9FKze , M99N9FMxe , M99N9FMye , M99N9FMze , & - M99N9MKxe , M99N9MKye , M99N9MKze , M99N9MMxe , M99N9MMye , M99N9MMze , M99N9RAxe , & - M99N9RAye , M99N9RAze , M99N9RDxe , M99N9RDye , M99N9RDze , M99N9TAxe , M99N9TAye , & - M99N9TAze , M99N9TDxss , M99N9TDyss , M99N9TDzss , ReactFXss , ReactFYss , ReactFZss , & - ReactMXss , ReactMYss , ReactMZss , SSqm01 , SSqm02 , SSqm03 , SSqm04 , & - SSqm05 , SSqm06 , SSqm07 , SSqm08 , SSqm09 , SSqm10 , SSqm11 , & - SSqm12 , SSqm13 , SSqm14 , SSqm15 , SSqm16 , SSqm17 , SSqm18 , & - SSqm19 , SSqm20 , SSqm21 , SSqm22 , SSqm23 , SSqm24 , SSqm25 , & - SSqm26 , SSqm27 , SSqm28 , SSqm29 , SSqm30 , SSqm31 , SSqm32 , & - SSqm33 , SSqm34 , SSqm35 , SSqm36 , SSqm37 , SSqm38 , SSqm39 , & - SSqm40 , SSqm41 , SSqm42 , SSqm43 , SSqm44 , SSqm45 , SSqm46 , & - SSqm47 , SSqm48 , SSqm49 , SSqm50 , SSqm51 , SSqm52 , SSqm53 , & - SSqm54 , SSqm55 , SSqm56 , SSqm57 , SSqm58 , SSqm59 , SSqm60 , & - SSqm61 , SSqm62 , SSqm63 , SSqm64 , SSqm65 , SSqm66 , SSqm67 , & - SSqm68 , SSqm69 , SSqm70 , SSqm71 , SSqm72 , SSqm73 , SSqm74 , & - SSqm75 , SSqm76 , SSqm77 , SSqm78 , SSqm79 , SSqm80 , SSqm81 , & - SSqm82 , SSqm83 , SSqm84 , SSqm85 , SSqm86 , SSqm87 , SSqm88 , & - SSqm89 , SSqm90 , SSqm91 , SSqm92 , SSqm93 , SSqm94 , SSqm95 , & - SSqm96 , SSqm97 , SSqm98 , SSqm99 , SSqmd01 , SSqmd02 , SSqmd03 , & - SSqmd04 , SSqmd05 , SSqmd06 , SSqmd07 , SSqmd08 , SSqmd09 , SSqmd10 , & - SSqmd11 , SSqmd12 , SSqmd13 , SSqmd14 , SSqmd15 , SSqmd16 , SSqmd17 , & - SSqmd18 , SSqmd19 , SSqmd20 , SSqmd21 , SSqmd22 , SSqmd23 , SSqmd24 , & - SSqmd25 , SSqmd26 , SSqmd27 , SSqmd28 , SSqmd29 , SSqmd30 , SSqmd31 , & - SSqmd32 , SSqmd33 , SSqmd34 , SSqmd35 , SSqmd36 , SSqmd37 , SSqmd38 , & - SSqmd39 , SSqmd40 , SSqmd41 , SSqmd42 , SSqmd43 , SSqmd44 , SSqmd45 , & - SSqmd46 , SSqmd47 , SSqmd48 , SSqmd49 , SSqmd50 , SSqmd51 , SSqmd52 , & - SSqmd53 , SSqmd54 , SSqmd55 , SSqmd56 , SSqmd57 , SSqmd58 , SSqmd59 , & - SSqmd60 , SSqmd61 , SSqmd62 , SSqmd63 , SSqmd64 , SSqmd65 , SSqmd66 , & - SSqmd67 , SSqmd68 , SSqmd69 , SSqmd70 , SSqmd71 , SSqmd72 , SSqmd73 , & - SSqmd74 , SSqmd75 , SSqmd76 , SSqmd77 , SSqmd78 , SSqmd79 , SSqmd80 , & - SSqmd81 , SSqmd82 , SSqmd83 , SSqmd84 , SSqmd85 , SSqmd86 , SSqmd87 , & - SSqmd88 , SSqmd89 , SSqmd90 , SSqmd91 , SSqmd92 , SSqmd93 , SSqmd94 , & - SSqmd95 , SSqmd96 , SSqmd97 , SSqmd98 , SSqmd99 , SSqmdd01 , SSqmdd02 , & - SSqmdd03 , SSqmdd04 , SSqmdd05 , SSqmdd06 , SSqmdd07 , SSqmdd08 , SSqmdd09 , & - SSqmdd10 , SSqmdd11 , SSqmdd12 , SSqmdd13 , SSqmdd14 , SSqmdd15 , SSqmdd16 , & - SSqmdd17 , SSqmdd18 , SSqmdd19 , SSqmdd20 , SSqmdd21 , SSqmdd22 , SSqmdd23 , & - SSqmdd24 , SSqmdd25 , SSqmdd26 , SSqmdd27 , SSqmdd28 , SSqmdd29 , SSqmdd30 , & - SSqmdd31 , SSqmdd32 , SSqmdd33 , SSqmdd34 , SSqmdd35 , SSqmdd36 , SSqmdd37 , & - SSqmdd38 , SSqmdd39 , SSqmdd40 , SSqmdd41 , SSqmdd42 , SSqmdd43 , SSqmdd44 , & - SSqmdd45 , SSqmdd46 , SSqmdd47 , SSqmdd48 , SSqmdd49 , SSqmdd50 , SSqmdd51 , & - SSqmdd52 , SSqmdd53 , SSqmdd54 , SSqmdd55 , SSqmdd56 , SSqmdd57 , SSqmdd58 , & - SSqmdd59 , SSqmdd60 , SSqmdd61 , SSqmdd62 , SSqmdd63 , SSqmdd64 , SSqmdd65 , & - SSqmdd66 , SSqmdd67 , SSqmdd68 , SSqmdd69 , SSqmdd70 , SSqmdd71 , SSqmdd72 , & - SSqmdd73 , SSqmdd74 , SSqmdd75 , SSqmdd76 , SSqmdd77 , SSqmdd78 , SSqmdd79 , & - SSqmdd80 , SSqmdd81 , SSqmdd82 , SSqmdd83 , SSqmdd84 , SSqmdd85 , SSqmdd86 , & - SSqmdd87 , SSqmdd88 , SSqmdd89 , SSqmdd90 , SSqmdd91 , SSqmdd92 , SSqmdd93 , & - SSqmdd94 , SSqmdd95 , SSqmdd96 , SSqmdd97 , SSqmdd98 , SSqmdd99 /) - INTEGER(IntKi), PARAMETER :: ParamIndxAry(21705) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + INTEGER(IntKi), PARAMETER :: ParamIndxAry1(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + Intf1FXss , Intf1FYss , Intf1FZss , Intf1MXss , Intf1MYss , Intf1MZss , Intf1RAXss , & + Intf1RAYss , Intf1RAZss , Intf1RDXe , Intf1RDXss , Intf1RDYe , Intf1RDYss , Intf1RDZe , & + Intf1RDZss , Intf1TAXss , Intf1TAYss , Intf1TAZss , Intf1TDXe , Intf1TDXss , Intf1TDYe , & + Intf1TDYss , Intf1TDZe , Intf1TDZss , Intf2FXss , Intf2FYss , Intf2FZss , Intf2MXss , & + Intf2MYss , Intf2MZss , Intf2RAXss , Intf2RAYss , Intf2RAZss , Intf2RDXe , Intf2RDXss , & + Intf2RDYe , Intf2RDYss , Intf2RDZe , Intf2RDZss , Intf2TAXss , Intf2TAYss , Intf2TAZss , & + Intf2TDXe , Intf2TDXss , Intf2TDYe , Intf2TDYss , Intf2TDZe , Intf2TDZss , Intf3FXss , & + Intf3FYss , Intf3FZss , Intf3MXss , Intf3MYss , Intf3MZss , Intf3RAXss , Intf3RAYss , & + Intf3RAZss , Intf3RDXe , Intf3RDXss , Intf3RDYe , Intf3RDYss , Intf3RDZe , Intf3RDZss , & + Intf3TAXss , Intf3TAYss , Intf3TAZss , Intf3TDXe , Intf3TDXss , Intf3TDYe , Intf3TDYss , & + Intf3TDZe , Intf3TDZss , Intf4FXss , Intf4FYss , Intf4FZss , Intf4MXss , Intf4MYss , & + Intf4MZss , Intf4RAXss , Intf4RAYss , Intf4RAZss , Intf4RDXe , Intf4RDXss , Intf4RDYe , & + Intf4RDYss , Intf4RDZe , Intf4RDZss , Intf4TAXss , Intf4TAYss , Intf4TAZss , Intf4TDXe , & + Intf4TDXss , Intf4TDYe , Intf4TDYss , Intf4TDZe , Intf4TDZss , Intf5FXss , Intf5FYss , & + Intf5FZss , Intf5MXss , Intf5MYss , Intf5MZss , Intf5RAXss , Intf5RAYss , Intf5RAZss , & + Intf5RDXe , Intf5RDXss , Intf5RDYe , Intf5RDYss , Intf5RDZe , Intf5RDZss , Intf5TAXss , & + Intf5TAYss , Intf5TAZss , Intf5TDXe , Intf5TDXss , Intf5TDYe , Intf5TDYss , Intf5TDZe , & + Intf5TDZss , Intf6FXss , Intf6FYss , Intf6FZss , Intf6MXss , Intf6MYss , Intf6MZss , & + Intf6RAXss , Intf6RAYss , Intf6RAZss , Intf6RDXe , Intf6RDXss , Intf6RDYe , Intf6RDYss , & + Intf6RDZe , Intf6RDZss , Intf6TAXss , Intf6TAYss , Intf6TAZss , Intf6TDXe , Intf6TDXss , & + Intf6TDYe , Intf6TDYss , Intf6TDZe , Intf6TDZss , Intf7FXss , Intf7FYss , Intf7FZss , & + Intf7MXss , Intf7MYss , Intf7MZss , Intf7RAXss , Intf7RAYss , Intf7RAZss , Intf7RDXe , & + Intf7RDXss , Intf7RDYe , Intf7RDYss , Intf7RDZe , Intf7RDZss , Intf7TAXss , Intf7TAYss , & + Intf7TAZss , Intf7TDXe , Intf7TDXss , Intf7TDYe , Intf7TDYss , Intf7TDZe , Intf7TDZss , & + Intf8FXss , Intf8FYss , Intf8FZss , Intf8MXss , Intf8MYss , Intf8MZss , Intf8RAXss , & + Intf8RAYss , Intf8RAZss , Intf8RDXe , Intf8RDXss , Intf8RDYe , Intf8RDYss , Intf8RDZe , & + Intf8RDZss , Intf8TAXss , Intf8TAYss , Intf8TAZss , Intf8TDXe , Intf8TDXss , Intf8TDYe , & + Intf8TDYss , Intf8TDZe , Intf8TDZss , Intf9FXss , Intf9FYss , Intf9FZss , Intf9MXss , & + Intf9MYss , Intf9MZss , Intf9RAXss , Intf9RAYss , Intf9RAZss , Intf9RDXe , Intf9RDXss , & + Intf9RDYe , Intf9RDYss , Intf9RDZe , Intf9RDZss , Intf9TAXss , Intf9TAYss , Intf9TAZss , & + Intf9TDXe , Intf9TDXss , Intf9TDYe , Intf9TDYss , Intf9TDZe , Intf9TDZss , M01N1FKxe , & + M01N1FKye , M01N1FKze , M01N1FMxe , M01N1FMye , M01N1FMze , M01N1MKxe , M01N1MKye , & + M01N1MKze , M01N1MMxe , M01N1MMye , M01N1MMze , M01N1RAxe , M01N1RAye , M01N1RAze , & + M01N1RDxe , M01N1RDye , M01N1RDze , M01N1TAxe , M01N1TAye , M01N1TAze , M01N1TDxss , & + M01N1TDyss , M01N1TDzss , M01N2FKxe , M01N2FKye , M01N2FKze , M01N2FMxe , M01N2FMye , & + M01N2FMze , M01N2MKxe , M01N2MKye , M01N2MKze , M01N2MMxe , M01N2MMye , M01N2MMze , & + M01N2RAxe , M01N2RAye , M01N2RAze , M01N2RDxe , M01N2RDye , M01N2RDze , M01N2TAxe , & + M01N2TAye , M01N2TAze , M01N2TDxss , M01N2TDyss , M01N2TDzss , M01N3FKxe , M01N3FKye , & + M01N3FKze , M01N3FMxe , M01N3FMye , M01N3FMze , M01N3MKxe , M01N3MKye , M01N3MKze , & + M01N3MMxe , M01N3MMye , M01N3MMze , M01N3RAxe , M01N3RAye , M01N3RAze , M01N3RDxe , & + M01N3RDye , M01N3RDze , M01N3TAxe , M01N3TAye , M01N3TAze , M01N3TDxss , M01N3TDyss , & + M01N3TDzss , M01N4FKxe , M01N4FKye , M01N4FKze , M01N4FMxe , M01N4FMye , M01N4FMze , & + M01N4MKxe , M01N4MKye , M01N4MKze , M01N4MMxe , M01N4MMye , M01N4MMze , M01N4RAxe , & + M01N4RAye , M01N4RAze , M01N4RDxe , M01N4RDye , M01N4RDze , M01N4TAxe , M01N4TAye , & + M01N4TAze , M01N4TDxss , M01N4TDyss , M01N4TDzss , M01N5FKxe , M01N5FKye , M01N5FKze , & + M01N5FMxe , M01N5FMye , M01N5FMze , M01N5MKxe , M01N5MKye , M01N5MKze , M01N5MMxe , & + M01N5MMye , M01N5MMze , M01N5RAxe , M01N5RAye , M01N5RAze , M01N5RDxe , M01N5RDye , & + M01N5RDze , M01N5TAxe , M01N5TAye , M01N5TAze , M01N5TDxss , M01N5TDyss , M01N5TDzss , & + M01N6FKxe , M01N6FKye , M01N6FKze , M01N6FMxe , M01N6FMye , M01N6FMze , M01N6MKxe , & + M01N6MKye , M01N6MKze , M01N6MMxe , M01N6MMye , M01N6MMze , M01N6RAxe , M01N6RAye , & + M01N6RAze , M01N6RDxe , M01N6RDye , M01N6RDze , M01N6TAxe , M01N6TAye , M01N6TAze , & + M01N6TDxss , M01N6TDyss , M01N6TDzss , M01N7FKxe , M01N7FKye , M01N7FKze , M01N7FMxe , & + M01N7FMye , M01N7FMze , M01N7MKxe , M01N7MKye , M01N7MKze , M01N7MMxe , M01N7MMye , & + M01N7MMze , M01N7RAxe , M01N7RAye , M01N7RAze , M01N7RDxe , M01N7RDye , M01N7RDze , & + M01N7TAxe , M01N7TAye , M01N7TAze , M01N7TDxss , M01N7TDyss , M01N7TDzss , M01N8FKxe , & + M01N8FKye , M01N8FKze , M01N8FMxe , M01N8FMye , M01N8FMze , M01N8MKxe , M01N8MKye , & + M01N8MKze , M01N8MMxe , M01N8MMye , M01N8MMze , M01N8RAxe , M01N8RAye , M01N8RAze , & + M01N8RDxe , M01N8RDye , M01N8RDze , M01N8TAxe , M01N8TAye , M01N8TAze , M01N8TDxss , & + M01N8TDyss , M01N8TDzss , M01N9FKxe , M01N9FKye , M01N9FKze , M01N9FMxe , M01N9FMye , & + M01N9FMze , M01N9MKxe , M01N9MKye , M01N9MKze , M01N9MMxe , M01N9MMye , M01N9MMze , & + M01N9RAxe , M01N9RAye , M01N9RAze , M01N9RDxe , M01N9RDye , M01N9RDze , M01N9TAxe , & + M01N9TAye , M01N9TAze , M01N9TDxss , M01N9TDyss , M01N9TDzss , M02N1FKxe , M02N1FKye , & + M02N1FKze , M02N1FMxe , M02N1FMye , M02N1FMze , M02N1MKxe , M02N1MKye , M02N1MKze , & + M02N1MMxe , M02N1MMye , M02N1MMze , M02N1RAxe , M02N1RAye , M02N1RAze , M02N1RDxe , & + M02N1RDye , M02N1RDze , M02N1TAxe , M02N1TAye , M02N1TAze , M02N1TDxss , M02N1TDyss , & + M02N1TDzss , M02N2FKxe , M02N2FKye , M02N2FKze , M02N2FMxe , M02N2FMye , M02N2FMze , & + M02N2MKxe , M02N2MKye , M02N2MKze , M02N2MMxe , M02N2MMye , M02N2MMze , M02N2RAxe , & + M02N2RAye , M02N2RAze , M02N2RDxe , M02N2RDye , M02N2RDze , M02N2TAxe , M02N2TAye , & + M02N2TAze , M02N2TDxss , M02N2TDyss , M02N2TDzss , M02N3FKxe , M02N3FKye , M02N3FKze , & + M02N3FMxe , M02N3FMye , M02N3FMze , M02N3MKxe , M02N3MKye , M02N3MKze , M02N3MMxe , & + M02N3MMye , M02N3MMze , M02N3RAxe , M02N3RAye , M02N3RAze , M02N3RDxe , M02N3RDye , & + M02N3RDze , M02N3TAxe , M02N3TAye , M02N3TAze , M02N3TDxss , M02N3TDyss , M02N3TDzss , & + M02N4FKxe , M02N4FKye , M02N4FKze , M02N4FMxe , M02N4FMye , M02N4FMze , M02N4MKxe , & + M02N4MKye , M02N4MKze , M02N4MMxe , M02N4MMye , M02N4MMze , M02N4RAxe , M02N4RAye , & + M02N4RAze , M02N4RDxe , M02N4RDye , M02N4RDze , M02N4TAxe , M02N4TAye , M02N4TAze , & + M02N4TDxss , M02N4TDyss , M02N4TDzss , M02N5FKxe , M02N5FKye , M02N5FKze , M02N5FMxe , & + M02N5FMye , M02N5FMze , M02N5MKxe , M02N5MKye , M02N5MKze , M02N5MMxe , M02N5MMye , & + M02N5MMze , M02N5RAxe , M02N5RAye , M02N5RAze , M02N5RDxe , M02N5RDye , M02N5RDze , & + M02N5TAxe , M02N5TAye , M02N5TAze , M02N5TDxss , M02N5TDyss , M02N5TDzss , M02N6FKxe , & + M02N6FKye , M02N6FKze , M02N6FMxe , M02N6FMye , M02N6FMze , M02N6MKxe , M02N6MKye , & + M02N6MKze , M02N6MMxe , M02N6MMye , M02N6MMze , M02N6RAxe , M02N6RAye , M02N6RAze , & + M02N6RDxe , M02N6RDye , M02N6RDze , M02N6TAxe , M02N6TAye , M02N6TAze , M02N6TDxss , & + M02N6TDyss , M02N6TDzss , M02N7FKxe , M02N7FKye , M02N7FKze , M02N7FMxe , M02N7FMye , & + M02N7FMze , M02N7MKxe , M02N7MKye , M02N7MKze , M02N7MMxe , M02N7MMye , M02N7MMze , & + M02N7RAxe , M02N7RAye , M02N7RAze , M02N7RDxe , M02N7RDye , M02N7RDze , M02N7TAxe , & + M02N7TAye , M02N7TAze , M02N7TDxss , M02N7TDyss , M02N7TDzss , M02N8FKxe , M02N8FKye , & + M02N8FKze , M02N8FMxe , M02N8FMye , M02N8FMze , M02N8MKxe , M02N8MKye , M02N8MKze , & + M02N8MMxe , M02N8MMye , M02N8MMze , M02N8RAxe , M02N8RAye , M02N8RAze , M02N8RDxe , & + M02N8RDye , M02N8RDze , M02N8TAxe , M02N8TAye , M02N8TAze , M02N8TDxss , M02N8TDyss , & + M02N8TDzss , M02N9FKxe , M02N9FKye , M02N9FKze , M02N9FMxe , M02N9FMye , M02N9FMze , & + M02N9MKxe , M02N9MKye , M02N9MKze , M02N9MMxe , M02N9MMye , M02N9MMze , M02N9RAxe , & + M02N9RAye , M02N9RAze , M02N9RDxe , M02N9RDye , M02N9RDze , M02N9TAxe , M02N9TAye , & + M02N9TAze , M02N9TDxss , M02N9TDyss , M02N9TDzss , M03N1FKxe , M03N1FKye , M03N1FKze , & + M03N1FMxe , M03N1FMye , M03N1FMze , M03N1MKxe , M03N1MKye , M03N1MKze , M03N1MMxe , & + M03N1MMye , M03N1MMze , M03N1RAxe , M03N1RAye , M03N1RAze , M03N1RDxe , M03N1RDye , & + M03N1RDze , M03N1TAxe , M03N1TAye , M03N1TAze , M03N1TDxss , M03N1TDyss , M03N1TDzss , & + M03N2FKxe , M03N2FKye , M03N2FKze , M03N2FMxe , M03N2FMye , M03N2FMze , M03N2MKxe , & + M03N2MKye , M03N2MKze , M03N2MMxe , M03N2MMye , M03N2MMze , M03N2RAxe , M03N2RAye , & + M03N2RAze , M03N2RDxe , M03N2RDye , M03N2RDze , M03N2TAxe , M03N2TAye , M03N2TAze , & + M03N2TDxss , M03N2TDyss , M03N2TDzss , M03N3FKxe , M03N3FKye , M03N3FKze , M03N3FMxe , & + M03N3FMye , M03N3FMze , M03N3MKxe , M03N3MKye , M03N3MKze , M03N3MMxe , M03N3MMye , & + M03N3MMze , M03N3RAxe , M03N3RAye , M03N3RAze , M03N3RDxe , M03N3RDye , M03N3RDze , & + M03N3TAxe , M03N3TAye , M03N3TAze , M03N3TDxss , M03N3TDyss , M03N3TDzss , M03N4FKxe , & + M03N4FKye , M03N4FKze , M03N4FMxe , M03N4FMye , M03N4FMze , M03N4MKxe , M03N4MKye , & + M03N4MKze , M03N4MMxe , M03N4MMye , M03N4MMze , M03N4RAxe , M03N4RAye , M03N4RAze , & + M03N4RDxe , M03N4RDye , M03N4RDze , M03N4TAxe , M03N4TAye , M03N4TAze , M03N4TDxss , & + M03N4TDyss , M03N4TDzss , M03N5FKxe , M03N5FKye , M03N5FKze , M03N5FMxe , M03N5FMye , & + M03N5FMze , M03N5MKxe , M03N5MKye , M03N5MKze , M03N5MMxe , M03N5MMye , M03N5MMze , & + M03N5RAxe , M03N5RAye , M03N5RAze , M03N5RDxe , M03N5RDye , M03N5RDze , M03N5TAxe , & + M03N5TAye , M03N5TAze , M03N5TDxss , M03N5TDyss , M03N5TDzss , M03N6FKxe , M03N6FKye , & + M03N6FKze , M03N6FMxe , M03N6FMye , M03N6FMze , M03N6MKxe , M03N6MKye , M03N6MKze , & + M03N6MMxe , M03N6MMye , M03N6MMze , M03N6RAxe , M03N6RAye , M03N6RAze , M03N6RDxe , & + M03N6RDye , M03N6RDze , M03N6TAxe , M03N6TAye , M03N6TAze , M03N6TDxss , M03N6TDyss , & + M03N6TDzss , M03N7FKxe , M03N7FKye , M03N7FKze , M03N7FMxe , M03N7FMye , M03N7FMze , & + M03N7MKxe , M03N7MKye , M03N7MKze , M03N7MMxe , M03N7MMye , M03N7MMze , M03N7RAxe , & + M03N7RAye , M03N7RAze , M03N7RDxe , M03N7RDye , M03N7RDze , M03N7TAxe , M03N7TAye , & + M03N7TAze , M03N7TDxss , M03N7TDyss , M03N7TDzss , M03N8FKxe , M03N8FKye , M03N8FKze , & + M03N8FMxe , M03N8FMye , M03N8FMze , M03N8MKxe , M03N8MKye , M03N8MKze , M03N8MMxe , & + M03N8MMye , M03N8MMze , M03N8RAxe , M03N8RAye , M03N8RAze , M03N8RDxe , M03N8RDye , & + M03N8RDze , M03N8TAxe , M03N8TAye , M03N8TAze , M03N8TDxss , M03N8TDyss , M03N8TDzss , & + M03N9FKxe , M03N9FKye , M03N9FKze , M03N9FMxe , M03N9FMye , M03N9FMze , M03N9MKxe , & + M03N9MKye , M03N9MKze , M03N9MMxe , M03N9MMye , M03N9MMze , M03N9RAxe , M03N9RAye , & + M03N9RAze , M03N9RDxe , M03N9RDye , M03N9RDze , M03N9TAxe , M03N9TAye , M03N9TAze , & + M03N9TDxss , M03N9TDyss , M03N9TDzss , M04N1FKxe , M04N1FKye , M04N1FKze , M04N1FMxe , & + M04N1FMye , M04N1FMze , M04N1MKxe , M04N1MKye , M04N1MKze , M04N1MMxe , M04N1MMye , & + M04N1MMze , M04N1RAxe , M04N1RAye , M04N1RAze , M04N1RDxe , M04N1RDye , M04N1RDze , & + M04N1TAxe , M04N1TAye , M04N1TAze , M04N1TDxss , M04N1TDyss , M04N1TDzss , M04N2FKxe , & + M04N2FKye , M04N2FKze , M04N2FMxe , M04N2FMye , M04N2FMze , M04N2MKxe , M04N2MKye , & + M04N2MKze , M04N2MMxe , M04N2MMye , M04N2MMze , M04N2RAxe , M04N2RAye , M04N2RAze , & + M04N2RDxe , M04N2RDye , M04N2RDze , M04N2TAxe , M04N2TAye , M04N2TAze , M04N2TDxss , & + M04N2TDyss , M04N2TDzss , M04N3FKxe , M04N3FKye , M04N3FKze , M04N3FMxe , M04N3FMye , & + M04N3FMze , M04N3MKxe , M04N3MKye , M04N3MKze , M04N3MMxe , M04N3MMye , M04N3MMze , & + M04N3RAxe , M04N3RAye , M04N3RAze , M04N3RDxe , M04N3RDye , M04N3RDze , M04N3TAxe , & + M04N3TAye , M04N3TAze , M04N3TDxss , M04N3TDyss , M04N3TDzss , M04N4FKxe , M04N4FKye , & + M04N4FKze , M04N4FMxe , M04N4FMye , M04N4FMze , M04N4MKxe , M04N4MKye , M04N4MKze , & + M04N4MMxe , M04N4MMye , M04N4MMze , M04N4RAxe , M04N4RAye , M04N4RAze , M04N4RDxe , & + M04N4RDye , M04N4RDze , M04N4TAxe , M04N4TAye , M04N4TAze , M04N4TDxss , M04N4TDyss , & + M04N4TDzss , M04N5FKxe , M04N5FKye , M04N5FKze , M04N5FMxe , M04N5FMye , M04N5FMze , & + M04N5MKxe , M04N5MKye , M04N5MKze , M04N5MMxe , M04N5MMye , M04N5MMze , M04N5RAxe , & + M04N5RAye , M04N5RAze , M04N5RDxe , M04N5RDye , M04N5RDze , M04N5TAxe , M04N5TAye , & + M04N5TAze , M04N5TDxss , M04N5TDyss , M04N5TDzss , M04N6FKxe , M04N6FKye , M04N6FKze , & + M04N6FMxe , M04N6FMye , M04N6FMze , M04N6MKxe , M04N6MKye , M04N6MKze , M04N6MMxe , & + M04N6MMye , M04N6MMze , M04N6RAxe , M04N6RAye , M04N6RAze , M04N6RDxe , M04N6RDye , & + M04N6RDze , M04N6TAxe , M04N6TAye , M04N6TAze , M04N6TDxss , M04N6TDyss , M04N6TDzss , & + M04N7FKxe , M04N7FKye , M04N7FKze , M04N7FMxe , M04N7FMye , M04N7FMze , M04N7MKxe , & + M04N7MKye , M04N7MKze , M04N7MMxe , M04N7MMye , M04N7MMze , M04N7RAxe , M04N7RAye , & + M04N7RAze , M04N7RDxe , M04N7RDye , M04N7RDze , M04N7TAxe , M04N7TAye , M04N7TAze , & + M04N7TDxss , M04N7TDyss , M04N7TDzss , M04N8FKxe , M04N8FKye , M04N8FKze , M04N8FMxe , & + M04N8FMye , M04N8FMze , M04N8MKxe , M04N8MKye , M04N8MKze , M04N8MMxe , M04N8MMye , & + M04N8MMze , M04N8RAxe , M04N8RAye , M04N8RAze , M04N8RDxe , M04N8RDye , M04N8RDze , & + M04N8TAxe , M04N8TAye , M04N8TAze , M04N8TDxss , M04N8TDyss , M04N8TDzss , M04N9FKxe , & + M04N9FKye , M04N9FKze , M04N9FMxe , M04N9FMye , M04N9FMze , M04N9MKxe , M04N9MKye , & + M04N9MKze , M04N9MMxe , M04N9MMye , M04N9MMze , M04N9RAxe , M04N9RAye , M04N9RAze , & + M04N9RDxe , M04N9RDye , M04N9RDze , M04N9TAxe , M04N9TAye , M04N9TAze , M04N9TDxss , & + M04N9TDyss , M04N9TDzss , M05N1FKxe , M05N1FKye , M05N1FKze , M05N1FMxe , M05N1FMye , & + M05N1FMze , M05N1MKxe , M05N1MKye , M05N1MKze , M05N1MMxe , M05N1MMye , M05N1MMze , & + M05N1RAxe , M05N1RAye , M05N1RAze , M05N1RDxe , M05N1RDye , M05N1RDze , M05N1TAxe , & + M05N1TAye , M05N1TAze , M05N1TDxss , M05N1TDyss , M05N1TDzss , M05N2FKxe , M05N2FKye , & + M05N2FKze , M05N2FMxe , M05N2FMye , M05N2FMze , M05N2MKxe , M05N2MKye , M05N2MKze , & + M05N2MMxe , M05N2MMye , M05N2MMze , M05N2RAxe , M05N2RAye , M05N2RAze , M05N2RDxe , & + M05N2RDye , M05N2RDze , M05N2TAxe , M05N2TAye , M05N2TAze , M05N2TDxss , M05N2TDyss , & + M05N2TDzss , M05N3FKxe , M05N3FKye , M05N3FKze , M05N3FMxe , M05N3FMye , M05N3FMze , & + M05N3MKxe , M05N3MKye , M05N3MKze , M05N3MMxe , M05N3MMye , M05N3MMze , M05N3RAxe , & + M05N3RAye , M05N3RAze , M05N3RDxe , M05N3RDye , M05N3RDze , M05N3TAxe , M05N3TAye , & + M05N3TAze , M05N3TDxss , M05N3TDyss , M05N3TDzss , M05N4FKxe , M05N4FKye , M05N4FKze , & + M05N4FMxe , M05N4FMye , M05N4FMze , M05N4MKxe , M05N4MKye , M05N4MKze , M05N4MMxe , & + M05N4MMye , M05N4MMze , M05N4RAxe , M05N4RAye , M05N4RAze , M05N4RDxe , M05N4RDye , & + M05N4RDze , M05N4TAxe , M05N4TAye , M05N4TAze , M05N4TDxss , M05N4TDyss , M05N4TDzss , & + M05N5FKxe , M05N5FKye , M05N5FKze , M05N5FMxe , M05N5FMye , M05N5FMze , M05N5MKxe , & + M05N5MKye , M05N5MKze , M05N5MMxe , M05N5MMye , M05N5MMze , M05N5RAxe , M05N5RAye , & + M05N5RAze , M05N5RDxe , M05N5RDye , M05N5RDze , M05N5TAxe , M05N5TAye , M05N5TAze , & + M05N5TDxss , M05N5TDyss , M05N5TDzss , M05N6FKxe , M05N6FKye , M05N6FKze , M05N6FMxe , & + M05N6FMye , M05N6FMze , M05N6MKxe , M05N6MKye , M05N6MKze , M05N6MMxe , M05N6MMye , & + M05N6MMze , M05N6RAxe , M05N6RAye , M05N6RAze , M05N6RDxe , M05N6RDye , M05N6RDze , & + M05N6TAxe , M05N6TAye , M05N6TAze , M05N6TDxss , M05N6TDyss , M05N6TDzss , M05N7FKxe , & + M05N7FKye , M05N7FKze , M05N7FMxe , M05N7FMye , M05N7FMze , M05N7MKxe , M05N7MKye , & + M05N7MKze , M05N7MMxe , M05N7MMye , M05N7MMze , M05N7RAxe , M05N7RAye , M05N7RAze , & + M05N7RDxe , M05N7RDye , M05N7RDze , M05N7TAxe , M05N7TAye , M05N7TAze , M05N7TDxss , & + M05N7TDyss , M05N7TDzss , M05N8FKxe , M05N8FKye , M05N8FKze , M05N8FMxe , M05N8FMye , & + M05N8FMze , M05N8MKxe , M05N8MKye , M05N8MKze , M05N8MMxe , M05N8MMye , M05N8MMze , & + M05N8RAxe , M05N8RAye , M05N8RAze , M05N8RDxe , M05N8RDye , M05N8RDze , M05N8TAxe , & + M05N8TAye , M05N8TAze , M05N8TDxss , M05N8TDyss , M05N8TDzss , M05N9FKxe , M05N9FKye , & + M05N9FKze , M05N9FMxe , M05N9FMye , M05N9FMze , M05N9MKxe , M05N9MKye , M05N9MKze , & + M05N9MMxe , M05N9MMye , M05N9MMze , M05N9RAxe , M05N9RAye , M05N9RAze , M05N9RDxe , & + M05N9RDye , M05N9RDze , M05N9TAxe , M05N9TAye , M05N9TAze , M05N9TDxss , M05N9TDyss , & + M05N9TDzss , M06N1FKxe , M06N1FKye , M06N1FKze , M06N1FMxe , M06N1FMye , M06N1FMze , & + M06N1MKxe , M06N1MKye , M06N1MKze , M06N1MMxe , M06N1MMye , M06N1MMze , M06N1RAxe , & + M06N1RAye , M06N1RAze , M06N1RDxe , M06N1RDye , M06N1RDze , M06N1TAxe , M06N1TAye , & + M06N1TAze , M06N1TDxss , M06N1TDyss , M06N1TDzss , M06N2FKxe , M06N2FKye , M06N2FKze , & + M06N2FMxe , M06N2FMye , M06N2FMze , M06N2MKxe , M06N2MKye , M06N2MKze , M06N2MMxe , & + M06N2MMye , M06N2MMze , M06N2RAxe , M06N2RAye , M06N2RAze , M06N2RDxe , M06N2RDye , & + M06N2RDze , M06N2TAxe , M06N2TAye , M06N2TAze , M06N2TDxss , M06N2TDyss , M06N2TDzss , & + M06N3FKxe , M06N3FKye , M06N3FKze , M06N3FMxe , M06N3FMye , M06N3FMze , M06N3MKxe , & + M06N3MKye , M06N3MKze , M06N3MMxe , M06N3MMye , M06N3MMze , M06N3RAxe , M06N3RAye , & + M06N3RAze , M06N3RDxe , M06N3RDye , M06N3RDze , M06N3TAxe , M06N3TAye , M06N3TAze , & + M06N3TDxss , M06N3TDyss , M06N3TDzss , M06N4FKxe , M06N4FKye , M06N4FKze , M06N4FMxe , & + M06N4FMye , M06N4FMze , M06N4MKxe , M06N4MKye , M06N4MKze , M06N4MMxe , M06N4MMye , & + M06N4MMze , M06N4RAxe , M06N4RAye , M06N4RAze , M06N4RDxe , M06N4RDye , M06N4RDze , & + M06N4TAxe , M06N4TAye , M06N4TAze , M06N4TDxss , M06N4TDyss , M06N4TDzss , M06N5FKxe , & + M06N5FKye , M06N5FKze , M06N5FMxe , M06N5FMye , M06N5FMze , M06N5MKxe , M06N5MKye , & + M06N5MKze , M06N5MMxe , M06N5MMye , M06N5MMze , M06N5RAxe , M06N5RAye , M06N5RAze , & + M06N5RDxe , M06N5RDye , M06N5RDze , M06N5TAxe , M06N5TAye , M06N5TAze , M06N5TDxss , & + M06N5TDyss , M06N5TDzss , M06N6FKxe , M06N6FKye , M06N6FKze , M06N6FMxe , M06N6FMye , & + M06N6FMze , M06N6MKxe , M06N6MKye , M06N6MKze , M06N6MMxe , M06N6MMye , M06N6MMze , & + M06N6RAxe , M06N6RAye , M06N6RAze , M06N6RDxe , M06N6RDye , M06N6RDze , M06N6TAxe , & + M06N6TAye , M06N6TAze , M06N6TDxss , M06N6TDyss , M06N6TDzss , M06N7FKxe , M06N7FKye , & + M06N7FKze , M06N7FMxe , M06N7FMye , M06N7FMze , M06N7MKxe , M06N7MKye , M06N7MKze , & + M06N7MMxe , M06N7MMye , M06N7MMze , M06N7RAxe , M06N7RAye , M06N7RAze , M06N7RDxe , & + M06N7RDye , M06N7RDze , M06N7TAxe , M06N7TAye , M06N7TAze , M06N7TDxss , M06N7TDyss , & + M06N7TDzss , M06N8FKxe , M06N8FKye , M06N8FKze , M06N8FMxe , M06N8FMye , M06N8FMze , & + M06N8MKxe , M06N8MKye , M06N8MKze , M06N8MMxe , M06N8MMye , M06N8MMze , M06N8RAxe , & + M06N8RAye , M06N8RAze , M06N8RDxe , M06N8RDye , M06N8RDze , M06N8TAxe , M06N8TAye , & + M06N8TAze , M06N8TDxss , M06N8TDyss , M06N8TDzss , M06N9FKxe , M06N9FKye , M06N9FKze , & + M06N9FMxe , M06N9FMye , M06N9FMze , M06N9MKxe , M06N9MKye , M06N9MKze , M06N9MMxe , & + M06N9MMye , M06N9MMze , M06N9RAxe , M06N9RAye , M06N9RAze , M06N9RDxe , M06N9RDye , & + M06N9RDze , M06N9TAxe , M06N9TAye , M06N9TAze , M06N9TDxss , M06N9TDyss , M06N9TDzss , & + M07N1FKxe , M07N1FKye , M07N1FKze , M07N1FMxe , M07N1FMye , M07N1FMze , M07N1MKxe , & + M07N1MKye , M07N1MKze , M07N1MMxe , M07N1MMye , M07N1MMze , M07N1RAxe , M07N1RAye , & + M07N1RAze , M07N1RDxe , M07N1RDye , M07N1RDze , M07N1TAxe , M07N1TAye , M07N1TAze , & + M07N1TDxss , M07N1TDyss , M07N1TDzss , M07N2FKxe , M07N2FKye , M07N2FKze , M07N2FMxe , & + M07N2FMye , M07N2FMze , M07N2MKxe , M07N2MKye , M07N2MKze , M07N2MMxe , M07N2MMye , & + M07N2MMze , M07N2RAxe , M07N2RAye , M07N2RAze , M07N2RDxe , M07N2RDye , M07N2RDze , & + M07N2TAxe , M07N2TAye , M07N2TAze , M07N2TDxss , M07N2TDyss , M07N2TDzss , M07N3FKxe , & + M07N3FKye , M07N3FKze , M07N3FMxe , M07N3FMye , M07N3FMze , M07N3MKxe , M07N3MKye , & + M07N3MKze , M07N3MMxe , M07N3MMye , M07N3MMze , M07N3RAxe , M07N3RAye , M07N3RAze , & + M07N3RDxe , M07N3RDye , M07N3RDze , M07N3TAxe , M07N3TAye , M07N3TAze , M07N3TDxss , & + M07N3TDyss , M07N3TDzss , M07N4FKxe , M07N4FKye , M07N4FKze , M07N4FMxe , M07N4FMye , & + M07N4FMze , M07N4MKxe , M07N4MKye , M07N4MKze , M07N4MMxe , M07N4MMye , M07N4MMze , & + M07N4RAxe , M07N4RAye , M07N4RAze , M07N4RDxe , M07N4RDye , M07N4RDze , M07N4TAxe , & + M07N4TAye , M07N4TAze , M07N4TDxss , M07N4TDyss , M07N4TDzss , M07N5FKxe , M07N5FKye , & + M07N5FKze , M07N5FMxe , M07N5FMye , M07N5FMze , M07N5MKxe , M07N5MKye , M07N5MKze , & + M07N5MMxe , M07N5MMye , M07N5MMze , M07N5RAxe , M07N5RAye , M07N5RAze , M07N5RDxe , & + M07N5RDye , M07N5RDze , M07N5TAxe , M07N5TAye , M07N5TAze , M07N5TDxss , M07N5TDyss , & + M07N5TDzss , M07N6FKxe , M07N6FKye , M07N6FKze , M07N6FMxe , M07N6FMye , M07N6FMze , & + M07N6MKxe , M07N6MKye , M07N6MKze , M07N6MMxe , M07N6MMye , M07N6MMze , M07N6RAxe , & + M07N6RAye , M07N6RAze , M07N6RDxe , M07N6RDye , M07N6RDze , M07N6TAxe , M07N6TAye , & + M07N6TAze , M07N6TDxss , M07N6TDyss , M07N6TDzss , M07N7FKxe , M07N7FKye , M07N7FKze , & + M07N7FMxe , M07N7FMye , M07N7FMze , M07N7MKxe , M07N7MKye , M07N7MKze , M07N7MMxe , & + M07N7MMye , M07N7MMze , M07N7RAxe , M07N7RAye , M07N7RAze , M07N7RDxe , M07N7RDye , & + M07N7RDze , M07N7TAxe , M07N7TAye , M07N7TAze , M07N7TDxss , M07N7TDyss , M07N7TDzss , & + M07N8FKxe , M07N8FKye , M07N8FKze , M07N8FMxe , M07N8FMye , M07N8FMze , M07N8MKxe /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry2(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M07N8MKye , M07N8MKze , M07N8MMxe , M07N8MMye , M07N8MMze , M07N8RAxe , M07N8RAye , & + M07N8RAze , M07N8RDxe , M07N8RDye , M07N8RDze , M07N8TAxe , M07N8TAye , M07N8TAze , & + M07N8TDxss , M07N8TDyss , M07N8TDzss , M07N9FKxe , M07N9FKye , M07N9FKze , M07N9FMxe , & + M07N9FMye , M07N9FMze , M07N9MKxe , M07N9MKye , M07N9MKze , M07N9MMxe , M07N9MMye , & + M07N9MMze , M07N9RAxe , M07N9RAye , M07N9RAze , M07N9RDxe , M07N9RDye , M07N9RDze , & + M07N9TAxe , M07N9TAye , M07N9TAze , M07N9TDxss , M07N9TDyss , M07N9TDzss , M08N1FKxe , & + M08N1FKye , M08N1FKze , M08N1FMxe , M08N1FMye , M08N1FMze , M08N1MKxe , M08N1MKye , & + M08N1MKze , M08N1MMxe , M08N1MMye , M08N1MMze , M08N1RAxe , M08N1RAye , M08N1RAze , & + M08N1RDxe , M08N1RDye , M08N1RDze , M08N1TAxe , M08N1TAye , M08N1TAze , M08N1TDxss , & + M08N1TDyss , M08N1TDzss , M08N2FKxe , M08N2FKye , M08N2FKze , M08N2FMxe , M08N2FMye , & + M08N2FMze , M08N2MKxe , M08N2MKye , M08N2MKze , M08N2MMxe , M08N2MMye , M08N2MMze , & + M08N2RAxe , M08N2RAye , M08N2RAze , M08N2RDxe , M08N2RDye , M08N2RDze , M08N2TAxe , & + M08N2TAye , M08N2TAze , M08N2TDxss , M08N2TDyss , M08N2TDzss , M08N3FKxe , M08N3FKye , & + M08N3FKze , M08N3FMxe , M08N3FMye , M08N3FMze , M08N3MKxe , M08N3MKye , M08N3MKze , & + M08N3MMxe , M08N3MMye , M08N3MMze , M08N3RAxe , M08N3RAye , M08N3RAze , M08N3RDxe , & + M08N3RDye , M08N3RDze , M08N3TAxe , M08N3TAye , M08N3TAze , M08N3TDxss , M08N3TDyss , & + M08N3TDzss , M08N4FKxe , M08N4FKye , M08N4FKze , M08N4FMxe , M08N4FMye , M08N4FMze , & + M08N4MKxe , M08N4MKye , M08N4MKze , M08N4MMxe , M08N4MMye , M08N4MMze , M08N4RAxe , & + M08N4RAye , M08N4RAze , M08N4RDxe , M08N4RDye , M08N4RDze , M08N4TAxe , M08N4TAye , & + M08N4TAze , M08N4TDxss , M08N4TDyss , M08N4TDzss , M08N5FKxe , M08N5FKye , M08N5FKze , & + M08N5FMxe , M08N5FMye , M08N5FMze , M08N5MKxe , M08N5MKye , M08N5MKze , M08N5MMxe , & + M08N5MMye , M08N5MMze , M08N5RAxe , M08N5RAye , M08N5RAze , M08N5RDxe , M08N5RDye , & + M08N5RDze , M08N5TAxe , M08N5TAye , M08N5TAze , M08N5TDxss , M08N5TDyss , M08N5TDzss , & + M08N6FKxe , M08N6FKye , M08N6FKze , M08N6FMxe , M08N6FMye , M08N6FMze , M08N6MKxe , & + M08N6MKye , M08N6MKze , M08N6MMxe , M08N6MMye , M08N6MMze , M08N6RAxe , M08N6RAye , & + M08N6RAze , M08N6RDxe , M08N6RDye , M08N6RDze , M08N6TAxe , M08N6TAye , M08N6TAze , & + M08N6TDxss , M08N6TDyss , M08N6TDzss , M08N7FKxe , M08N7FKye , M08N7FKze , M08N7FMxe , & + M08N7FMye , M08N7FMze , M08N7MKxe , M08N7MKye , M08N7MKze , M08N7MMxe , M08N7MMye , & + M08N7MMze , M08N7RAxe , M08N7RAye , M08N7RAze , M08N7RDxe , M08N7RDye , M08N7RDze , & + M08N7TAxe , M08N7TAye , M08N7TAze , M08N7TDxss , M08N7TDyss , M08N7TDzss , M08N8FKxe , & + M08N8FKye , M08N8FKze , M08N8FMxe , M08N8FMye , M08N8FMze , M08N8MKxe , M08N8MKye , & + M08N8MKze , M08N8MMxe , M08N8MMye , M08N8MMze , M08N8RAxe , M08N8RAye , M08N8RAze , & + M08N8RDxe , M08N8RDye , M08N8RDze , M08N8TAxe , M08N8TAye , M08N8TAze , M08N8TDxss , & + M08N8TDyss , M08N8TDzss , M08N9FKxe , M08N9FKye , M08N9FKze , M08N9FMxe , M08N9FMye , & + M08N9FMze , M08N9MKxe , M08N9MKye , M08N9MKze , M08N9MMxe , M08N9MMye , M08N9MMze , & + M08N9RAxe , M08N9RAye , M08N9RAze , M08N9RDxe , M08N9RDye , M08N9RDze , M08N9TAxe , & + M08N9TAye , M08N9TAze , M08N9TDxss , M08N9TDyss , M08N9TDzss , M09N1FKxe , M09N1FKye , & + M09N1FKze , M09N1FMxe , M09N1FMye , M09N1FMze , M09N1MKxe , M09N1MKye , M09N1MKze , & + M09N1MMxe , M09N1MMye , M09N1MMze , M09N1RAxe , M09N1RAye , M09N1RAze , M09N1RDxe , & + M09N1RDye , M09N1RDze , M09N1TAxe , M09N1TAye , M09N1TAze , M09N1TDxss , M09N1TDyss , & + M09N1TDzss , M09N2FKxe , M09N2FKye , M09N2FKze , M09N2FMxe , M09N2FMye , M09N2FMze , & + M09N2MKxe , M09N2MKye , M09N2MKze , M09N2MMxe , M09N2MMye , M09N2MMze , M09N2RAxe , & + M09N2RAye , M09N2RAze , M09N2RDxe , M09N2RDye , M09N2RDze , M09N2TAxe , M09N2TAye , & + M09N2TAze , M09N2TDxss , M09N2TDyss , M09N2TDzss , M09N3FKxe , M09N3FKye , M09N3FKze , & + M09N3FMxe , M09N3FMye , M09N3FMze , M09N3MKxe , M09N3MKye , M09N3MKze , M09N3MMxe , & + M09N3MMye , M09N3MMze , M09N3RAxe , M09N3RAye , M09N3RAze , M09N3RDxe , M09N3RDye , & + M09N3RDze , M09N3TAxe , M09N3TAye , M09N3TAze , M09N3TDxss , M09N3TDyss , M09N3TDzss , & + M09N4FKxe , M09N4FKye , M09N4FKze , M09N4FMxe , M09N4FMye , M09N4FMze , M09N4MKxe , & + M09N4MKye , M09N4MKze , M09N4MMxe , M09N4MMye , M09N4MMze , M09N4RAxe , M09N4RAye , & + M09N4RAze , M09N4RDxe , M09N4RDye , M09N4RDze , M09N4TAxe , M09N4TAye , M09N4TAze , & + M09N4TDxss , M09N4TDyss , M09N4TDzss , M09N5FKxe , M09N5FKye , M09N5FKze , M09N5FMxe , & + M09N5FMye , M09N5FMze , M09N5MKxe , M09N5MKye , M09N5MKze , M09N5MMxe , M09N5MMye , & + M09N5MMze , M09N5RAxe , M09N5RAye , M09N5RAze , M09N5RDxe , M09N5RDye , M09N5RDze , & + M09N5TAxe , M09N5TAye , M09N5TAze , M09N5TDxss , M09N5TDyss , M09N5TDzss , M09N6FKxe , & + M09N6FKye , M09N6FKze , M09N6FMxe , M09N6FMye , M09N6FMze , M09N6MKxe , M09N6MKye , & + M09N6MKze , M09N6MMxe , M09N6MMye , M09N6MMze , M09N6RAxe , M09N6RAye , M09N6RAze , & + M09N6RDxe , M09N6RDye , M09N6RDze , M09N6TAxe , M09N6TAye , M09N6TAze , M09N6TDxss , & + M09N6TDyss , M09N6TDzss , M09N7FKxe , M09N7FKye , M09N7FKze , M09N7FMxe , M09N7FMye , & + M09N7FMze , M09N7MKxe , M09N7MKye , M09N7MKze , M09N7MMxe , M09N7MMye , M09N7MMze , & + M09N7RAxe , M09N7RAye , M09N7RAze , M09N7RDxe , M09N7RDye , M09N7RDze , M09N7TAxe , & + M09N7TAye , M09N7TAze , M09N7TDxss , M09N7TDyss , M09N7TDzss , M09N8FKxe , M09N8FKye , & + M09N8FKze , M09N8FMxe , M09N8FMye , M09N8FMze , M09N8MKxe , M09N8MKye , M09N8MKze , & + M09N8MMxe , M09N8MMye , M09N8MMze , M09N8RAxe , M09N8RAye , M09N8RAze , M09N8RDxe , & + M09N8RDye , M09N8RDze , M09N8TAxe , M09N8TAye , M09N8TAze , M09N8TDxss , M09N8TDyss , & + M09N8TDzss , M09N9FKxe , M09N9FKye , M09N9FKze , M09N9FMxe , M09N9FMye , M09N9FMze , & + M09N9MKxe , M09N9MKye , M09N9MKze , M09N9MMxe , M09N9MMye , M09N9MMze , M09N9RAxe , & + M09N9RAye , M09N9RAze , M09N9RDxe , M09N9RDye , M09N9RDze , M09N9TAxe , M09N9TAye , & + M09N9TAze , M09N9TDxss , M09N9TDyss , M09N9TDzss , M10N1FKxe , M10N1FKye , M10N1FKze , & + M10N1FMxe , M10N1FMye , M10N1FMze , M10N1MKxe , M10N1MKye , M10N1MKze , M10N1MMxe , & + M10N1MMye , M10N1MMze , M10N1RAxe , M10N1RAye , M10N1RAze , M10N1RDxe , M10N1RDye , & + M10N1RDze , M10N1TAxe , M10N1TAye , M10N1TAze , M10N1TDxss , M10N1TDyss , M10N1TDzss , & + M10N2FKxe , M10N2FKye , M10N2FKze , M10N2FMxe , M10N2FMye , M10N2FMze , M10N2MKxe , & + M10N2MKye , M10N2MKze , M10N2MMxe , M10N2MMye , M10N2MMze , M10N2RAxe , M10N2RAye , & + M10N2RAze , M10N2RDxe , M10N2RDye , M10N2RDze , M10N2TAxe , M10N2TAye , M10N2TAze , & + M10N2TDxss , M10N2TDyss , M10N2TDzss , M10N3FKxe , M10N3FKye , M10N3FKze , M10N3FMxe , & + M10N3FMye , M10N3FMze , M10N3MKxe , M10N3MKye , M10N3MKze , M10N3MMxe , M10N3MMye , & + M10N3MMze , M10N3RAxe , M10N3RAye , M10N3RAze , M10N3RDxe , M10N3RDye , M10N3RDze , & + M10N3TAxe , M10N3TAye , M10N3TAze , M10N3TDxss , M10N3TDyss , M10N3TDzss , M10N4FKxe , & + M10N4FKye , M10N4FKze , M10N4FMxe , M10N4FMye , M10N4FMze , M10N4MKxe , M10N4MKye , & + M10N4MKze , M10N4MMxe , M10N4MMye , M10N4MMze , M10N4RAxe , M10N4RAye , M10N4RAze , & + M10N4RDxe , M10N4RDye , M10N4RDze , M10N4TAxe , M10N4TAye , M10N4TAze , M10N4TDxss , & + M10N4TDyss , M10N4TDzss , M10N5FKxe , M10N5FKye , M10N5FKze , M10N5FMxe , M10N5FMye , & + M10N5FMze , M10N5MKxe , M10N5MKye , M10N5MKze , M10N5MMxe , M10N5MMye , M10N5MMze , & + M10N5RAxe , M10N5RAye , M10N5RAze , M10N5RDxe , M10N5RDye , M10N5RDze , M10N5TAxe , & + M10N5TAye , M10N5TAze , M10N5TDxss , M10N5TDyss , M10N5TDzss , M10N6FKxe , M10N6FKye , & + M10N6FKze , M10N6FMxe , M10N6FMye , M10N6FMze , M10N6MKxe , M10N6MKye , M10N6MKze , & + M10N6MMxe , M10N6MMye , M10N6MMze , M10N6RAxe , M10N6RAye , M10N6RAze , M10N6RDxe , & + M10N6RDye , M10N6RDze , M10N6TAxe , M10N6TAye , M10N6TAze , M10N6TDxss , M10N6TDyss , & + M10N6TDzss , M10N7FKxe , M10N7FKye , M10N7FKze , M10N7FMxe , M10N7FMye , M10N7FMze , & + M10N7MKxe , M10N7MKye , M10N7MKze , M10N7MMxe , M10N7MMye , M10N7MMze , M10N7RAxe , & + M10N7RAye , M10N7RAze , M10N7RDxe , M10N7RDye , M10N7RDze , M10N7TAxe , M10N7TAye , & + M10N7TAze , M10N7TDxss , M10N7TDyss , M10N7TDzss , M10N8FKxe , M10N8FKye , M10N8FKze , & + M10N8FMxe , M10N8FMye , M10N8FMze , M10N8MKxe , M10N8MKye , M10N8MKze , M10N8MMxe , & + M10N8MMye , M10N8MMze , M10N8RAxe , M10N8RAye , M10N8RAze , M10N8RDxe , M10N8RDye , & + M10N8RDze , M10N8TAxe , M10N8TAye , M10N8TAze , M10N8TDxss , M10N8TDyss , M10N8TDzss , & + M10N9FKxe , M10N9FKye , M10N9FKze , M10N9FMxe , M10N9FMye , M10N9FMze , M10N9MKxe , & + M10N9MKye , M10N9MKze , M10N9MMxe , M10N9MMye , M10N9MMze , M10N9RAxe , M10N9RAye , & + M10N9RAze , M10N9RDxe , M10N9RDye , M10N9RDze , M10N9TAxe , M10N9TAye , M10N9TAze , & + M10N9TDxss , M10N9TDyss , M10N9TDzss , M11N1FKxe , M11N1FKye , M11N1FKze , M11N1FMxe , & + M11N1FMye , M11N1FMze , M11N1MKxe , M11N1MKye , M11N1MKze , M11N1MMxe , M11N1MMye , & + M11N1MMze , M11N1RAxe , M11N1RAye , M11N1RAze , M11N1RDxe , M11N1RDye , M11N1RDze , & + M11N1TAxe , M11N1TAye , M11N1TAze , M11N1TDxss , M11N1TDyss , M11N1TDzss , M11N2FKxe , & + M11N2FKye , M11N2FKze , M11N2FMxe , M11N2FMye , M11N2FMze , M11N2MKxe , M11N2MKye , & + M11N2MKze , M11N2MMxe , M11N2MMye , M11N2MMze , M11N2RAxe , M11N2RAye , M11N2RAze , & + M11N2RDxe , M11N2RDye , M11N2RDze , M11N2TAxe , M11N2TAye , M11N2TAze , M11N2TDxss , & + M11N2TDyss , M11N2TDzss , M11N3FKxe , M11N3FKye , M11N3FKze , M11N3FMxe , M11N3FMye , & + M11N3FMze , M11N3MKxe , M11N3MKye , M11N3MKze , M11N3MMxe , M11N3MMye , M11N3MMze , & + M11N3RAxe , M11N3RAye , M11N3RAze , M11N3RDxe , M11N3RDye , M11N3RDze , M11N3TAxe , & + M11N3TAye , M11N3TAze , M11N3TDxss , M11N3TDyss , M11N3TDzss , M11N4FKxe , M11N4FKye , & + M11N4FKze , M11N4FMxe , M11N4FMye , M11N4FMze , M11N4MKxe , M11N4MKye , M11N4MKze , & + M11N4MMxe , M11N4MMye , M11N4MMze , M11N4RAxe , M11N4RAye , M11N4RAze , M11N4RDxe , & + M11N4RDye , M11N4RDze , M11N4TAxe , M11N4TAye , M11N4TAze , M11N4TDxss , M11N4TDyss , & + M11N4TDzss , M11N5FKxe , M11N5FKye , M11N5FKze , M11N5FMxe , M11N5FMye , M11N5FMze , & + M11N5MKxe , M11N5MKye , M11N5MKze , M11N5MMxe , M11N5MMye , M11N5MMze , M11N5RAxe , & + M11N5RAye , M11N5RAze , M11N5RDxe , M11N5RDye , M11N5RDze , M11N5TAxe , M11N5TAye , & + M11N5TAze , M11N5TDxss , M11N5TDyss , M11N5TDzss , M11N6FKxe , M11N6FKye , M11N6FKze , & + M11N6FMxe , M11N6FMye , M11N6FMze , M11N6MKxe , M11N6MKye , M11N6MKze , M11N6MMxe , & + M11N6MMye , M11N6MMze , M11N6RAxe , M11N6RAye , M11N6RAze , M11N6RDxe , M11N6RDye , & + M11N6RDze , M11N6TAxe , M11N6TAye , M11N6TAze , M11N6TDxss , M11N6TDyss , M11N6TDzss , & + M11N7FKxe , M11N7FKye , M11N7FKze , M11N7FMxe , M11N7FMye , M11N7FMze , M11N7MKxe , & + M11N7MKye , M11N7MKze , M11N7MMxe , M11N7MMye , M11N7MMze , M11N7RAxe , M11N7RAye , & + M11N7RAze , M11N7RDxe , M11N7RDye , M11N7RDze , M11N7TAxe , M11N7TAye , M11N7TAze , & + M11N7TDxss , M11N7TDyss , M11N7TDzss , M11N8FKxe , M11N8FKye , M11N8FKze , M11N8FMxe , & + M11N8FMye , M11N8FMze , M11N8MKxe , M11N8MKye , M11N8MKze , M11N8MMxe , M11N8MMye , & + M11N8MMze , M11N8RAxe , M11N8RAye , M11N8RAze , M11N8RDxe , M11N8RDye , M11N8RDze , & + M11N8TAxe , M11N8TAye , M11N8TAze , M11N8TDxss , M11N8TDyss , M11N8TDzss , M11N9FKxe , & + M11N9FKye , M11N9FKze , M11N9FMxe , M11N9FMye , M11N9FMze , M11N9MKxe , M11N9MKye , & + M11N9MKze , M11N9MMxe , M11N9MMye , M11N9MMze , M11N9RAxe , M11N9RAye , M11N9RAze , & + M11N9RDxe , M11N9RDye , M11N9RDze , M11N9TAxe , M11N9TAye , M11N9TAze , M11N9TDxss , & + M11N9TDyss , M11N9TDzss , M12N1FKxe , M12N1FKye , M12N1FKze , M12N1FMxe , M12N1FMye , & + M12N1FMze , M12N1MKxe , M12N1MKye , M12N1MKze , M12N1MMxe , M12N1MMye , M12N1MMze , & + M12N1RAxe , M12N1RAye , M12N1RAze , M12N1RDxe , M12N1RDye , M12N1RDze , M12N1TAxe , & + M12N1TAye , M12N1TAze , M12N1TDxss , M12N1TDyss , M12N1TDzss , M12N2FKxe , M12N2FKye , & + M12N2FKze , M12N2FMxe , M12N2FMye , M12N2FMze , M12N2MKxe , M12N2MKye , M12N2MKze , & + M12N2MMxe , M12N2MMye , M12N2MMze , M12N2RAxe , M12N2RAye , M12N2RAze , M12N2RDxe , & + M12N2RDye , M12N2RDze , M12N2TAxe , M12N2TAye , M12N2TAze , M12N2TDxss , M12N2TDyss , & + M12N2TDzss , M12N3FKxe , M12N3FKye , M12N3FKze , M12N3FMxe , M12N3FMye , M12N3FMze , & + M12N3MKxe , M12N3MKye , M12N3MKze , M12N3MMxe , M12N3MMye , M12N3MMze , M12N3RAxe , & + M12N3RAye , M12N3RAze , M12N3RDxe , M12N3RDye , M12N3RDze , M12N3TAxe , M12N3TAye , & + M12N3TAze , M12N3TDxss , M12N3TDyss , M12N3TDzss , M12N4FKxe , M12N4FKye , M12N4FKze , & + M12N4FMxe , M12N4FMye , M12N4FMze , M12N4MKxe , M12N4MKye , M12N4MKze , M12N4MMxe , & + M12N4MMye , M12N4MMze , M12N4RAxe , M12N4RAye , M12N4RAze , M12N4RDxe , M12N4RDye , & + M12N4RDze , M12N4TAxe , M12N4TAye , M12N4TAze , M12N4TDxss , M12N4TDyss , M12N4TDzss , & + M12N5FKxe , M12N5FKye , M12N5FKze , M12N5FMxe , M12N5FMye , M12N5FMze , M12N5MKxe , & + M12N5MKye , M12N5MKze , M12N5MMxe , M12N5MMye , M12N5MMze , M12N5RAxe , M12N5RAye , & + M12N5RAze , M12N5RDxe , M12N5RDye , M12N5RDze , M12N5TAxe , M12N5TAye , M12N5TAze , & + M12N5TDxss , M12N5TDyss , M12N5TDzss , M12N6FKxe , M12N6FKye , M12N6FKze , M12N6FMxe , & + M12N6FMye , M12N6FMze , M12N6MKxe , M12N6MKye , M12N6MKze , M12N6MMxe , M12N6MMye , & + M12N6MMze , M12N6RAxe , M12N6RAye , M12N6RAze , M12N6RDxe , M12N6RDye , M12N6RDze , & + M12N6TAxe , M12N6TAye , M12N6TAze , M12N6TDxss , M12N6TDyss , M12N6TDzss , M12N7FKxe , & + M12N7FKye , M12N7FKze , M12N7FMxe , M12N7FMye , M12N7FMze , M12N7MKxe , M12N7MKye , & + M12N7MKze , M12N7MMxe , M12N7MMye , M12N7MMze , M12N7RAxe , M12N7RAye , M12N7RAze , & + M12N7RDxe , M12N7RDye , M12N7RDze , M12N7TAxe , M12N7TAye , M12N7TAze , M12N7TDxss , & + M12N7TDyss , M12N7TDzss , M12N8FKxe , M12N8FKye , M12N8FKze , M12N8FMxe , M12N8FMye , & + M12N8FMze , M12N8MKxe , M12N8MKye , M12N8MKze , M12N8MMxe , M12N8MMye , M12N8MMze , & + M12N8RAxe , M12N8RAye , M12N8RAze , M12N8RDxe , M12N8RDye , M12N8RDze , M12N8TAxe , & + M12N8TAye , M12N8TAze , M12N8TDxss , M12N8TDyss , M12N8TDzss , M12N9FKxe , M12N9FKye , & + M12N9FKze , M12N9FMxe , M12N9FMye , M12N9FMze , M12N9MKxe , M12N9MKye , M12N9MKze , & + M12N9MMxe , M12N9MMye , M12N9MMze , M12N9RAxe , M12N9RAye , M12N9RAze , M12N9RDxe , & + M12N9RDye , M12N9RDze , M12N9TAxe , M12N9TAye , M12N9TAze , M12N9TDxss , M12N9TDyss , & + M12N9TDzss , M13N1FKxe , M13N1FKye , M13N1FKze , M13N1FMxe , M13N1FMye , M13N1FMze , & + M13N1MKxe , M13N1MKye , M13N1MKze , M13N1MMxe , M13N1MMye , M13N1MMze , M13N1RAxe , & + M13N1RAye , M13N1RAze , M13N1RDxe , M13N1RDye , M13N1RDze , M13N1TAxe , M13N1TAye , & + M13N1TAze , M13N1TDxss , M13N1TDyss , M13N1TDzss , M13N2FKxe , M13N2FKye , M13N2FKze , & + M13N2FMxe , M13N2FMye , M13N2FMze , M13N2MKxe , M13N2MKye , M13N2MKze , M13N2MMxe , & + M13N2MMye , M13N2MMze , M13N2RAxe , M13N2RAye , M13N2RAze , M13N2RDxe , M13N2RDye , & + M13N2RDze , M13N2TAxe , M13N2TAye , M13N2TAze , M13N2TDxss , M13N2TDyss , M13N2TDzss , & + M13N3FKxe , M13N3FKye , M13N3FKze , M13N3FMxe , M13N3FMye , M13N3FMze , M13N3MKxe , & + M13N3MKye , M13N3MKze , M13N3MMxe , M13N3MMye , M13N3MMze , M13N3RAxe , M13N3RAye , & + M13N3RAze , M13N3RDxe , M13N3RDye , M13N3RDze , M13N3TAxe , M13N3TAye , M13N3TAze , & + M13N3TDxss , M13N3TDyss , M13N3TDzss , M13N4FKxe , M13N4FKye , M13N4FKze , M13N4FMxe , & + M13N4FMye , M13N4FMze , M13N4MKxe , M13N4MKye , M13N4MKze , M13N4MMxe , M13N4MMye , & + M13N4MMze , M13N4RAxe , M13N4RAye , M13N4RAze , M13N4RDxe , M13N4RDye , M13N4RDze , & + M13N4TAxe , M13N4TAye , M13N4TAze , M13N4TDxss , M13N4TDyss , M13N4TDzss , M13N5FKxe , & + M13N5FKye , M13N5FKze , M13N5FMxe , M13N5FMye , M13N5FMze , M13N5MKxe , M13N5MKye , & + M13N5MKze , M13N5MMxe , M13N5MMye , M13N5MMze , M13N5RAxe , M13N5RAye , M13N5RAze , & + M13N5RDxe , M13N5RDye , M13N5RDze , M13N5TAxe , M13N5TAye , M13N5TAze , M13N5TDxss , & + M13N5TDyss , M13N5TDzss , M13N6FKxe , M13N6FKye , M13N6FKze , M13N6FMxe , M13N6FMye , & + M13N6FMze , M13N6MKxe , M13N6MKye , M13N6MKze , M13N6MMxe , M13N6MMye , M13N6MMze , & + M13N6RAxe , M13N6RAye , M13N6RAze , M13N6RDxe , M13N6RDye , M13N6RDze , M13N6TAxe , & + M13N6TAye , M13N6TAze , M13N6TDxss , M13N6TDyss , M13N6TDzss , M13N7FKxe , M13N7FKye , & + M13N7FKze , M13N7FMxe , M13N7FMye , M13N7FMze , M13N7MKxe , M13N7MKye , M13N7MKze , & + M13N7MMxe , M13N7MMye , M13N7MMze , M13N7RAxe , M13N7RAye , M13N7RAze , M13N7RDxe , & + M13N7RDye , M13N7RDze , M13N7TAxe , M13N7TAye , M13N7TAze , M13N7TDxss , M13N7TDyss , & + M13N7TDzss , M13N8FKxe , M13N8FKye , M13N8FKze , M13N8FMxe , M13N8FMye , M13N8FMze , & + M13N8MKxe , M13N8MKye , M13N8MKze , M13N8MMxe , M13N8MMye , M13N8MMze , M13N8RAxe , & + M13N8RAye , M13N8RAze , M13N8RDxe , M13N8RDye , M13N8RDze , M13N8TAxe , M13N8TAye , & + M13N8TAze , M13N8TDxss , M13N8TDyss , M13N8TDzss , M13N9FKxe , M13N9FKye , M13N9FKze , & + M13N9FMxe , M13N9FMye , M13N9FMze , M13N9MKxe , M13N9MKye , M13N9MKze , M13N9MMxe , & + M13N9MMye , M13N9MMze , M13N9RAxe , M13N9RAye , M13N9RAze , M13N9RDxe , M13N9RDye , & + M13N9RDze , M13N9TAxe , M13N9TAye , M13N9TAze , M13N9TDxss , M13N9TDyss , M13N9TDzss , & + M14N1FKxe , M14N1FKye , M14N1FKze , M14N1FMxe , M14N1FMye , M14N1FMze , M14N1MKxe , & + M14N1MKye , M14N1MKze , M14N1MMxe , M14N1MMye , M14N1MMze , M14N1RAxe , M14N1RAye , & + M14N1RAze , M14N1RDxe , M14N1RDye , M14N1RDze , M14N1TAxe , M14N1TAye , M14N1TAze , & + M14N1TDxss , M14N1TDyss , M14N1TDzss , M14N2FKxe , M14N2FKye , M14N2FKze , M14N2FMxe , & + M14N2FMye , M14N2FMze , M14N2MKxe , M14N2MKye , M14N2MKze , M14N2MMxe , M14N2MMye , & + M14N2MMze , M14N2RAxe , M14N2RAye , M14N2RAze , M14N2RDxe , M14N2RDye , M14N2RDze , & + M14N2TAxe , M14N2TAye , M14N2TAze , M14N2TDxss , M14N2TDyss , M14N2TDzss , M14N3FKxe , & + M14N3FKye , M14N3FKze , M14N3FMxe , M14N3FMye , M14N3FMze , M14N3MKxe , M14N3MKye , & + M14N3MKze , M14N3MMxe , M14N3MMye , M14N3MMze , M14N3RAxe , M14N3RAye , M14N3RAze , & + M14N3RDxe , M14N3RDye , M14N3RDze , M14N3TAxe , M14N3TAye , M14N3TAze , M14N3TDxss , & + M14N3TDyss , M14N3TDzss , M14N4FKxe , M14N4FKye , M14N4FKze , M14N4FMxe , M14N4FMye , & + M14N4FMze , M14N4MKxe , M14N4MKye , M14N4MKze , M14N4MMxe , M14N4MMye , M14N4MMze , & + M14N4RAxe , M14N4RAye , M14N4RAze , M14N4RDxe , M14N4RDye , M14N4RDze , M14N4TAxe , & + M14N4TAye , M14N4TAze , M14N4TDxss , M14N4TDyss , M14N4TDzss , M14N5FKxe , M14N5FKye , & + M14N5FKze , M14N5FMxe , M14N5FMye , M14N5FMze , M14N5MKxe , M14N5MKye , M14N5MKze , & + M14N5MMxe , M14N5MMye , M14N5MMze , M14N5RAxe , M14N5RAye , M14N5RAze , M14N5RDxe , & + M14N5RDye , M14N5RDze , M14N5TAxe , M14N5TAye , M14N5TAze , M14N5TDxss , M14N5TDyss , & + M14N5TDzss , M14N6FKxe , M14N6FKye , M14N6FKze , M14N6FMxe , M14N6FMye , M14N6FMze , & + M14N6MKxe , M14N6MKye , M14N6MKze , M14N6MMxe , M14N6MMye , M14N6MMze , M14N6RAxe , & + M14N6RAye , M14N6RAze , M14N6RDxe , M14N6RDye , M14N6RDze , M14N6TAxe , M14N6TAye , & + M14N6TAze , M14N6TDxss , M14N6TDyss , M14N6TDzss , M14N7FKxe , M14N7FKye , M14N7FKze , & + M14N7FMxe , M14N7FMye , M14N7FMze , M14N7MKxe , M14N7MKye , M14N7MKze , M14N7MMxe , & + M14N7MMye , M14N7MMze , M14N7RAxe , M14N7RAye , M14N7RAze , M14N7RDxe , M14N7RDye , & + M14N7RDze , M14N7TAxe , M14N7TAye , M14N7TAze , M14N7TDxss , M14N7TDyss , M14N7TDzss , & + M14N8FKxe , M14N8FKye , M14N8FKze , M14N8FMxe , M14N8FMye , M14N8FMze , M14N8MKxe , & + M14N8MKye , M14N8MKze , M14N8MMxe , M14N8MMye , M14N8MMze , M14N8RAxe , M14N8RAye , & + M14N8RAze , M14N8RDxe , M14N8RDye , M14N8RDze , M14N8TAxe , M14N8TAye , M14N8TAze , & + M14N8TDxss , M14N8TDyss , M14N8TDzss , M14N9FKxe , M14N9FKye , M14N9FKze , M14N9FMxe , & + M14N9FMye , M14N9FMze , M14N9MKxe , M14N9MKye , M14N9MKze , M14N9MMxe , M14N9MMye , & + M14N9MMze , M14N9RAxe , M14N9RAye , M14N9RAze , M14N9RDxe , M14N9RDye , M14N9RDze , & + M14N9TAxe , M14N9TAye , M14N9TAze , M14N9TDxss , M14N9TDyss , M14N9TDzss , M15N1FKxe , & + M15N1FKye , M15N1FKze , M15N1FMxe , M15N1FMye , M15N1FMze , M15N1MKxe , M15N1MKye , & + M15N1MKze , M15N1MMxe , M15N1MMye , M15N1MMze , M15N1RAxe , M15N1RAye , M15N1RAze , & + M15N1RDxe , M15N1RDye , M15N1RDze , M15N1TAxe , M15N1TAye , M15N1TAze , M15N1TDxss , & + M15N1TDyss , M15N1TDzss , M15N2FKxe , M15N2FKye , M15N2FKze , M15N2FMxe , M15N2FMye , & + M15N2FMze , M15N2MKxe , M15N2MKye , M15N2MKze , M15N2MMxe , M15N2MMye , M15N2MMze , & + M15N2RAxe , M15N2RAye , M15N2RAze , M15N2RDxe , M15N2RDye , M15N2RDze , M15N2TAxe , & + M15N2TAye , M15N2TAze , M15N2TDxss , M15N2TDyss , M15N2TDzss , M15N3FKxe , M15N3FKye , & + M15N3FKze , M15N3FMxe , M15N3FMye , M15N3FMze , M15N3MKxe , M15N3MKye , M15N3MKze , & + M15N3MMxe , M15N3MMye , M15N3MMze , M15N3RAxe , M15N3RAye , M15N3RAze , M15N3RDxe , & + M15N3RDye , M15N3RDze , M15N3TAxe , M15N3TAye , M15N3TAze , M15N3TDxss , M15N3TDyss , & + M15N3TDzss , M15N4FKxe , M15N4FKye , M15N4FKze , M15N4FMxe , M15N4FMye , M15N4FMze , & + M15N4MKxe , M15N4MKye , M15N4MKze , M15N4MMxe , M15N4MMye , M15N4MMze , M15N4RAxe , & + M15N4RAye , M15N4RAze , M15N4RDxe , M15N4RDye , M15N4RDze , M15N4TAxe , M15N4TAye , & + M15N4TAze , M15N4TDxss , M15N4TDyss , M15N4TDzss , M15N5FKxe , M15N5FKye , M15N5FKze , & + M15N5FMxe , M15N5FMye , M15N5FMze , M15N5MKxe , M15N5MKye , M15N5MKze , M15N5MMxe , & + M15N5MMye , M15N5MMze , M15N5RAxe , M15N5RAye , M15N5RAze , M15N5RDxe , M15N5RDye , & + M15N5RDze , M15N5TAxe , M15N5TAye , M15N5TAze , M15N5TDxss , M15N5TDyss , M15N5TDzss , & + M15N6FKxe , M15N6FKye , M15N6FKze , M15N6FMxe , M15N6FMye , M15N6FMze , M15N6MKxe , & + M15N6MKye , M15N6MKze , M15N6MMxe , M15N6MMye , M15N6MMze , M15N6RAxe , M15N6RAye /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry3(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M15N6RAze , M15N6RDxe , M15N6RDye , M15N6RDze , M15N6TAxe , M15N6TAye , M15N6TAze , & + M15N6TDxss , M15N6TDyss , M15N6TDzss , M15N7FKxe , M15N7FKye , M15N7FKze , M15N7FMxe , & + M15N7FMye , M15N7FMze , M15N7MKxe , M15N7MKye , M15N7MKze , M15N7MMxe , M15N7MMye , & + M15N7MMze , M15N7RAxe , M15N7RAye , M15N7RAze , M15N7RDxe , M15N7RDye , M15N7RDze , & + M15N7TAxe , M15N7TAye , M15N7TAze , M15N7TDxss , M15N7TDyss , M15N7TDzss , M15N8FKxe , & + M15N8FKye , M15N8FKze , M15N8FMxe , M15N8FMye , M15N8FMze , M15N8MKxe , M15N8MKye , & + M15N8MKze , M15N8MMxe , M15N8MMye , M15N8MMze , M15N8RAxe , M15N8RAye , M15N8RAze , & + M15N8RDxe , M15N8RDye , M15N8RDze , M15N8TAxe , M15N8TAye , M15N8TAze , M15N8TDxss , & + M15N8TDyss , M15N8TDzss , M15N9FKxe , M15N9FKye , M15N9FKze , M15N9FMxe , M15N9FMye , & + M15N9FMze , M15N9MKxe , M15N9MKye , M15N9MKze , M15N9MMxe , M15N9MMye , M15N9MMze , & + M15N9RAxe , M15N9RAye , M15N9RAze , M15N9RDxe , M15N9RDye , M15N9RDze , M15N9TAxe , & + M15N9TAye , M15N9TAze , M15N9TDxss , M15N9TDyss , M15N9TDzss , M16N1FKxe , M16N1FKye , & + M16N1FKze , M16N1FMxe , M16N1FMye , M16N1FMze , M16N1MKxe , M16N1MKye , M16N1MKze , & + M16N1MMxe , M16N1MMye , M16N1MMze , M16N1RAxe , M16N1RAye , M16N1RAze , M16N1RDxe , & + M16N1RDye , M16N1RDze , M16N1TAxe , M16N1TAye , M16N1TAze , M16N1TDxss , M16N1TDyss , & + M16N1TDzss , M16N2FKxe , M16N2FKye , M16N2FKze , M16N2FMxe , M16N2FMye , M16N2FMze , & + M16N2MKxe , M16N2MKye , M16N2MKze , M16N2MMxe , M16N2MMye , M16N2MMze , M16N2RAxe , & + M16N2RAye , M16N2RAze , M16N2RDxe , M16N2RDye , M16N2RDze , M16N2TAxe , M16N2TAye , & + M16N2TAze , M16N2TDxss , M16N2TDyss , M16N2TDzss , M16N3FKxe , M16N3FKye , M16N3FKze , & + M16N3FMxe , M16N3FMye , M16N3FMze , M16N3MKxe , M16N3MKye , M16N3MKze , M16N3MMxe , & + M16N3MMye , M16N3MMze , M16N3RAxe , M16N3RAye , M16N3RAze , M16N3RDxe , M16N3RDye , & + M16N3RDze , M16N3TAxe , M16N3TAye , M16N3TAze , M16N3TDxss , M16N3TDyss , M16N3TDzss , & + M16N4FKxe , M16N4FKye , M16N4FKze , M16N4FMxe , M16N4FMye , M16N4FMze , M16N4MKxe , & + M16N4MKye , M16N4MKze , M16N4MMxe , M16N4MMye , M16N4MMze , M16N4RAxe , M16N4RAye , & + M16N4RAze , M16N4RDxe , M16N4RDye , M16N4RDze , M16N4TAxe , M16N4TAye , M16N4TAze , & + M16N4TDxss , M16N4TDyss , M16N4TDzss , M16N5FKxe , M16N5FKye , M16N5FKze , M16N5FMxe , & + M16N5FMye , M16N5FMze , M16N5MKxe , M16N5MKye , M16N5MKze , M16N5MMxe , M16N5MMye , & + M16N5MMze , M16N5RAxe , M16N5RAye , M16N5RAze , M16N5RDxe , M16N5RDye , M16N5RDze , & + M16N5TAxe , M16N5TAye , M16N5TAze , M16N5TDxss , M16N5TDyss , M16N5TDzss , M16N6FKxe , & + M16N6FKye , M16N6FKze , M16N6FMxe , M16N6FMye , M16N6FMze , M16N6MKxe , M16N6MKye , & + M16N6MKze , M16N6MMxe , M16N6MMye , M16N6MMze , M16N6RAxe , M16N6RAye , M16N6RAze , & + M16N6RDxe , M16N6RDye , M16N6RDze , M16N6TAxe , M16N6TAye , M16N6TAze , M16N6TDxss , & + M16N6TDyss , M16N6TDzss , M16N7FKxe , M16N7FKye , M16N7FKze , M16N7FMxe , M16N7FMye , & + M16N7FMze , M16N7MKxe , M16N7MKye , M16N7MKze , M16N7MMxe , M16N7MMye , M16N7MMze , & + M16N7RAxe , M16N7RAye , M16N7RAze , M16N7RDxe , M16N7RDye , M16N7RDze , M16N7TAxe , & + M16N7TAye , M16N7TAze , M16N7TDxss , M16N7TDyss , M16N7TDzss , M16N8FKxe , M16N8FKye , & + M16N8FKze , M16N8FMxe , M16N8FMye , M16N8FMze , M16N8MKxe , M16N8MKye , M16N8MKze , & + M16N8MMxe , M16N8MMye , M16N8MMze , M16N8RAxe , M16N8RAye , M16N8RAze , M16N8RDxe , & + M16N8RDye , M16N8RDze , M16N8TAxe , M16N8TAye , M16N8TAze , M16N8TDxss , M16N8TDyss , & + M16N8TDzss , M16N9FKxe , M16N9FKye , M16N9FKze , M16N9FMxe , M16N9FMye , M16N9FMze , & + M16N9MKxe , M16N9MKye , M16N9MKze , M16N9MMxe , M16N9MMye , M16N9MMze , M16N9RAxe , & + M16N9RAye , M16N9RAze , M16N9RDxe , M16N9RDye , M16N9RDze , M16N9TAxe , M16N9TAye , & + M16N9TAze , M16N9TDxss , M16N9TDyss , M16N9TDzss , M17N1FKxe , M17N1FKye , M17N1FKze , & + M17N1FMxe , M17N1FMye , M17N1FMze , M17N1MKxe , M17N1MKye , M17N1MKze , M17N1MMxe , & + M17N1MMye , M17N1MMze , M17N1RAxe , M17N1RAye , M17N1RAze , M17N1RDxe , M17N1RDye , & + M17N1RDze , M17N1TAxe , M17N1TAye , M17N1TAze , M17N1TDxss , M17N1TDyss , M17N1TDzss , & + M17N2FKxe , M17N2FKye , M17N2FKze , M17N2FMxe , M17N2FMye , M17N2FMze , M17N2MKxe , & + M17N2MKye , M17N2MKze , M17N2MMxe , M17N2MMye , M17N2MMze , M17N2RAxe , M17N2RAye , & + M17N2RAze , M17N2RDxe , M17N2RDye , M17N2RDze , M17N2TAxe , M17N2TAye , M17N2TAze , & + M17N2TDxss , M17N2TDyss , M17N2TDzss , M17N3FKxe , M17N3FKye , M17N3FKze , M17N3FMxe , & + M17N3FMye , M17N3FMze , M17N3MKxe , M17N3MKye , M17N3MKze , M17N3MMxe , M17N3MMye , & + M17N3MMze , M17N3RAxe , M17N3RAye , M17N3RAze , M17N3RDxe , M17N3RDye , M17N3RDze , & + M17N3TAxe , M17N3TAye , M17N3TAze , M17N3TDxss , M17N3TDyss , M17N3TDzss , M17N4FKxe , & + M17N4FKye , M17N4FKze , M17N4FMxe , M17N4FMye , M17N4FMze , M17N4MKxe , M17N4MKye , & + M17N4MKze , M17N4MMxe , M17N4MMye , M17N4MMze , M17N4RAxe , M17N4RAye , M17N4RAze , & + M17N4RDxe , M17N4RDye , M17N4RDze , M17N4TAxe , M17N4TAye , M17N4TAze , M17N4TDxss , & + M17N4TDyss , M17N4TDzss , M17N5FKxe , M17N5FKye , M17N5FKze , M17N5FMxe , M17N5FMye , & + M17N5FMze , M17N5MKxe , M17N5MKye , M17N5MKze , M17N5MMxe , M17N5MMye , M17N5MMze , & + M17N5RAxe , M17N5RAye , M17N5RAze , M17N5RDxe , M17N5RDye , M17N5RDze , M17N5TAxe , & + M17N5TAye , M17N5TAze , M17N5TDxss , M17N5TDyss , M17N5TDzss , M17N6FKxe , M17N6FKye , & + M17N6FKze , M17N6FMxe , M17N6FMye , M17N6FMze , M17N6MKxe , M17N6MKye , M17N6MKze , & + M17N6MMxe , M17N6MMye , M17N6MMze , M17N6RAxe , M17N6RAye , M17N6RAze , M17N6RDxe , & + M17N6RDye , M17N6RDze , M17N6TAxe , M17N6TAye , M17N6TAze , M17N6TDxss , M17N6TDyss , & + M17N6TDzss , M17N7FKxe , M17N7FKye , M17N7FKze , M17N7FMxe , M17N7FMye , M17N7FMze , & + M17N7MKxe , M17N7MKye , M17N7MKze , M17N7MMxe , M17N7MMye , M17N7MMze , M17N7RAxe , & + M17N7RAye , M17N7RAze , M17N7RDxe , M17N7RDye , M17N7RDze , M17N7TAxe , M17N7TAye , & + M17N7TAze , M17N7TDxss , M17N7TDyss , M17N7TDzss , M17N8FKxe , M17N8FKye , M17N8FKze , & + M17N8FMxe , M17N8FMye , M17N8FMze , M17N8MKxe , M17N8MKye , M17N8MKze , M17N8MMxe , & + M17N8MMye , M17N8MMze , M17N8RAxe , M17N8RAye , M17N8RAze , M17N8RDxe , M17N8RDye , & + M17N8RDze , M17N8TAxe , M17N8TAye , M17N8TAze , M17N8TDxss , M17N8TDyss , M17N8TDzss , & + M17N9FKxe , M17N9FKye , M17N9FKze , M17N9FMxe , M17N9FMye , M17N9FMze , M17N9MKxe , & + M17N9MKye , M17N9MKze , M17N9MMxe , M17N9MMye , M17N9MMze , M17N9RAxe , M17N9RAye , & + M17N9RAze , M17N9RDxe , M17N9RDye , M17N9RDze , M17N9TAxe , M17N9TAye , M17N9TAze , & + M17N9TDxss , M17N9TDyss , M17N9TDzss , M18N1FKxe , M18N1FKye , M18N1FKze , M18N1FMxe , & + M18N1FMye , M18N1FMze , M18N1MKxe , M18N1MKye , M18N1MKze , M18N1MMxe , M18N1MMye , & + M18N1MMze , M18N1RAxe , M18N1RAye , M18N1RAze , M18N1RDxe , M18N1RDye , M18N1RDze , & + M18N1TAxe , M18N1TAye , M18N1TAze , M18N1TDxss , M18N1TDyss , M18N1TDzss , M18N2FKxe , & + M18N2FKye , M18N2FKze , M18N2FMxe , M18N2FMye , M18N2FMze , M18N2MKxe , M18N2MKye , & + M18N2MKze , M18N2MMxe , M18N2MMye , M18N2MMze , M18N2RAxe , M18N2RAye , M18N2RAze , & + M18N2RDxe , M18N2RDye , M18N2RDze , M18N2TAxe , M18N2TAye , M18N2TAze , M18N2TDxss , & + M18N2TDyss , M18N2TDzss , M18N3FKxe , M18N3FKye , M18N3FKze , M18N3FMxe , M18N3FMye , & + M18N3FMze , M18N3MKxe , M18N3MKye , M18N3MKze , M18N3MMxe , M18N3MMye , M18N3MMze , & + M18N3RAxe , M18N3RAye , M18N3RAze , M18N3RDxe , M18N3RDye , M18N3RDze , M18N3TAxe , & + M18N3TAye , M18N3TAze , M18N3TDxss , M18N3TDyss , M18N3TDzss , M18N4FKxe , M18N4FKye , & + M18N4FKze , M18N4FMxe , M18N4FMye , M18N4FMze , M18N4MKxe , M18N4MKye , M18N4MKze , & + M18N4MMxe , M18N4MMye , M18N4MMze , M18N4RAxe , M18N4RAye , M18N4RAze , M18N4RDxe , & + M18N4RDye , M18N4RDze , M18N4TAxe , M18N4TAye , M18N4TAze , M18N4TDxss , M18N4TDyss , & + M18N4TDzss , M18N5FKxe , M18N5FKye , M18N5FKze , M18N5FMxe , M18N5FMye , M18N5FMze , & + M18N5MKxe , M18N5MKye , M18N5MKze , M18N5MMxe , M18N5MMye , M18N5MMze , M18N5RAxe , & + M18N5RAye , M18N5RAze , M18N5RDxe , M18N5RDye , M18N5RDze , M18N5TAxe , M18N5TAye , & + M18N5TAze , M18N5TDxss , M18N5TDyss , M18N5TDzss , M18N6FKxe , M18N6FKye , M18N6FKze , & + M18N6FMxe , M18N6FMye , M18N6FMze , M18N6MKxe , M18N6MKye , M18N6MKze , M18N6MMxe , & + M18N6MMye , M18N6MMze , M18N6RAxe , M18N6RAye , M18N6RAze , M18N6RDxe , M18N6RDye , & + M18N6RDze , M18N6TAxe , M18N6TAye , M18N6TAze , M18N6TDxss , M18N6TDyss , M18N6TDzss , & + M18N7FKxe , M18N7FKye , M18N7FKze , M18N7FMxe , M18N7FMye , M18N7FMze , M18N7MKxe , & + M18N7MKye , M18N7MKze , M18N7MMxe , M18N7MMye , M18N7MMze , M18N7RAxe , M18N7RAye , & + M18N7RAze , M18N7RDxe , M18N7RDye , M18N7RDze , M18N7TAxe , M18N7TAye , M18N7TAze , & + M18N7TDxss , M18N7TDyss , M18N7TDzss , M18N8FKxe , M18N8FKye , M18N8FKze , M18N8FMxe , & + M18N8FMye , M18N8FMze , M18N8MKxe , M18N8MKye , M18N8MKze , M18N8MMxe , M18N8MMye , & + M18N8MMze , M18N8RAxe , M18N8RAye , M18N8RAze , M18N8RDxe , M18N8RDye , M18N8RDze , & + M18N8TAxe , M18N8TAye , M18N8TAze , M18N8TDxss , M18N8TDyss , M18N8TDzss , M18N9FKxe , & + M18N9FKye , M18N9FKze , M18N9FMxe , M18N9FMye , M18N9FMze , M18N9MKxe , M18N9MKye , & + M18N9MKze , M18N9MMxe , M18N9MMye , M18N9MMze , M18N9RAxe , M18N9RAye , M18N9RAze , & + M18N9RDxe , M18N9RDye , M18N9RDze , M18N9TAxe , M18N9TAye , M18N9TAze , M18N9TDxss , & + M18N9TDyss , M18N9TDzss , M19N1FKxe , M19N1FKye , M19N1FKze , M19N1FMxe , M19N1FMye , & + M19N1FMze , M19N1MKxe , M19N1MKye , M19N1MKze , M19N1MMxe , M19N1MMye , M19N1MMze , & + M19N1RAxe , M19N1RAye , M19N1RAze , M19N1RDxe , M19N1RDye , M19N1RDze , M19N1TAxe , & + M19N1TAye , M19N1TAze , M19N1TDxss , M19N1TDyss , M19N1TDzss , M19N2FKxe , M19N2FKye , & + M19N2FKze , M19N2FMxe , M19N2FMye , M19N2FMze , M19N2MKxe , M19N2MKye , M19N2MKze , & + M19N2MMxe , M19N2MMye , M19N2MMze , M19N2RAxe , M19N2RAye , M19N2RAze , M19N2RDxe , & + M19N2RDye , M19N2RDze , M19N2TAxe , M19N2TAye , M19N2TAze , M19N2TDxss , M19N2TDyss , & + M19N2TDzss , M19N3FKxe , M19N3FKye , M19N3FKze , M19N3FMxe , M19N3FMye , M19N3FMze , & + M19N3MKxe , M19N3MKye , M19N3MKze , M19N3MMxe , M19N3MMye , M19N3MMze , M19N3RAxe , & + M19N3RAye , M19N3RAze , M19N3RDxe , M19N3RDye , M19N3RDze , M19N3TAxe , M19N3TAye , & + M19N3TAze , M19N3TDxss , M19N3TDyss , M19N3TDzss , M19N4FKxe , M19N4FKye , M19N4FKze , & + M19N4FMxe , M19N4FMye , M19N4FMze , M19N4MKxe , M19N4MKye , M19N4MKze , M19N4MMxe , & + M19N4MMye , M19N4MMze , M19N4RAxe , M19N4RAye , M19N4RAze , M19N4RDxe , M19N4RDye , & + M19N4RDze , M19N4TAxe , M19N4TAye , M19N4TAze , M19N4TDxss , M19N4TDyss , M19N4TDzss , & + M19N5FKxe , M19N5FKye , M19N5FKze , M19N5FMxe , M19N5FMye , M19N5FMze , M19N5MKxe , & + M19N5MKye , M19N5MKze , M19N5MMxe , M19N5MMye , M19N5MMze , M19N5RAxe , M19N5RAye , & + M19N5RAze , M19N5RDxe , M19N5RDye , M19N5RDze , M19N5TAxe , M19N5TAye , M19N5TAze , & + M19N5TDxss , M19N5TDyss , M19N5TDzss , M19N6FKxe , M19N6FKye , M19N6FKze , M19N6FMxe , & + M19N6FMye , M19N6FMze , M19N6MKxe , M19N6MKye , M19N6MKze , M19N6MMxe , M19N6MMye , & + M19N6MMze , M19N6RAxe , M19N6RAye , M19N6RAze , M19N6RDxe , M19N6RDye , M19N6RDze , & + M19N6TAxe , M19N6TAye , M19N6TAze , M19N6TDxss , M19N6TDyss , M19N6TDzss , M19N7FKxe , & + M19N7FKye , M19N7FKze , M19N7FMxe , M19N7FMye , M19N7FMze , M19N7MKxe , M19N7MKye , & + M19N7MKze , M19N7MMxe , M19N7MMye , M19N7MMze , M19N7RAxe , M19N7RAye , M19N7RAze , & + M19N7RDxe , M19N7RDye , M19N7RDze , M19N7TAxe , M19N7TAye , M19N7TAze , M19N7TDxss , & + M19N7TDyss , M19N7TDzss , M19N8FKxe , M19N8FKye , M19N8FKze , M19N8FMxe , M19N8FMye , & + M19N8FMze , M19N8MKxe , M19N8MKye , M19N8MKze , M19N8MMxe , M19N8MMye , M19N8MMze , & + M19N8RAxe , M19N8RAye , M19N8RAze , M19N8RDxe , M19N8RDye , M19N8RDze , M19N8TAxe , & + M19N8TAye , M19N8TAze , M19N8TDxss , M19N8TDyss , M19N8TDzss , M19N9FKxe , M19N9FKye , & + M19N9FKze , M19N9FMxe , M19N9FMye , M19N9FMze , M19N9MKxe , M19N9MKye , M19N9MKze , & + M19N9MMxe , M19N9MMye , M19N9MMze , M19N9RAxe , M19N9RAye , M19N9RAze , M19N9RDxe , & + M19N9RDye , M19N9RDze , M19N9TAxe , M19N9TAye , M19N9TAze , M19N9TDxss , M19N9TDyss , & + M19N9TDzss , M20N1FKxe , M20N1FKye , M20N1FKze , M20N1FMxe , M20N1FMye , M20N1FMze , & + M20N1MKxe , M20N1MKye , M20N1MKze , M20N1MMxe , M20N1MMye , M20N1MMze , M20N1RAxe , & + M20N1RAye , M20N1RAze , M20N1RDxe , M20N1RDye , M20N1RDze , M20N1TAxe , M20N1TAye , & + M20N1TAze , M20N1TDxss , M20N1TDyss , M20N1TDzss , M20N2FKxe , M20N2FKye , M20N2FKze , & + M20N2FMxe , M20N2FMye , M20N2FMze , M20N2MKxe , M20N2MKye , M20N2MKze , M20N2MMxe , & + M20N2MMye , M20N2MMze , M20N2RAxe , M20N2RAye , M20N2RAze , M20N2RDxe , M20N2RDye , & + M20N2RDze , M20N2TAxe , M20N2TAye , M20N2TAze , M20N2TDxss , M20N2TDyss , M20N2TDzss , & + M20N3FKxe , M20N3FKye , M20N3FKze , M20N3FMxe , M20N3FMye , M20N3FMze , M20N3MKxe , & + M20N3MKye , M20N3MKze , M20N3MMxe , M20N3MMye , M20N3MMze , M20N3RAxe , M20N3RAye , & + M20N3RAze , M20N3RDxe , M20N3RDye , M20N3RDze , M20N3TAxe , M20N3TAye , M20N3TAze , & + M20N3TDxss , M20N3TDyss , M20N3TDzss , M20N4FKxe , M20N4FKye , M20N4FKze , M20N4FMxe , & + M20N4FMye , M20N4FMze , M20N4MKxe , M20N4MKye , M20N4MKze , M20N4MMxe , M20N4MMye , & + M20N4MMze , M20N4RAxe , M20N4RAye , M20N4RAze , M20N4RDxe , M20N4RDye , M20N4RDze , & + M20N4TAxe , M20N4TAye , M20N4TAze , M20N4TDxss , M20N4TDyss , M20N4TDzss , M20N5FKxe , & + M20N5FKye , M20N5FKze , M20N5FMxe , M20N5FMye , M20N5FMze , M20N5MKxe , M20N5MKye , & + M20N5MKze , M20N5MMxe , M20N5MMye , M20N5MMze , M20N5RAxe , M20N5RAye , M20N5RAze , & + M20N5RDxe , M20N5RDye , M20N5RDze , M20N5TAxe , M20N5TAye , M20N5TAze , M20N5TDxss , & + M20N5TDyss , M20N5TDzss , M20N6FKxe , M20N6FKye , M20N6FKze , M20N6FMxe , M20N6FMye , & + M20N6FMze , M20N6MKxe , M20N6MKye , M20N6MKze , M20N6MMxe , M20N6MMye , M20N6MMze , & + M20N6RAxe , M20N6RAye , M20N6RAze , M20N6RDxe , M20N6RDye , M20N6RDze , M20N6TAxe , & + M20N6TAye , M20N6TAze , M20N6TDxss , M20N6TDyss , M20N6TDzss , M20N7FKxe , M20N7FKye , & + M20N7FKze , M20N7FMxe , M20N7FMye , M20N7FMze , M20N7MKxe , M20N7MKye , M20N7MKze , & + M20N7MMxe , M20N7MMye , M20N7MMze , M20N7RAxe , M20N7RAye , M20N7RAze , M20N7RDxe , & + M20N7RDye , M20N7RDze , M20N7TAxe , M20N7TAye , M20N7TAze , M20N7TDxss , M20N7TDyss , & + M20N7TDzss , M20N8FKxe , M20N8FKye , M20N8FKze , M20N8FMxe , M20N8FMye , M20N8FMze , & + M20N8MKxe , M20N8MKye , M20N8MKze , M20N8MMxe , M20N8MMye , M20N8MMze , M20N8RAxe , & + M20N8RAye , M20N8RAze , M20N8RDxe , M20N8RDye , M20N8RDze , M20N8TAxe , M20N8TAye , & + M20N8TAze , M20N8TDxss , M20N8TDyss , M20N8TDzss , M20N9FKxe , M20N9FKye , M20N9FKze , & + M20N9FMxe , M20N9FMye , M20N9FMze , M20N9MKxe , M20N9MKye , M20N9MKze , M20N9MMxe , & + M20N9MMye , M20N9MMze , M20N9RAxe , M20N9RAye , M20N9RAze , M20N9RDxe , M20N9RDye , & + M20N9RDze , M20N9TAxe , M20N9TAye , M20N9TAze , M20N9TDxss , M20N9TDyss , M20N9TDzss , & + M21N1FKxe , M21N1FKye , M21N1FKze , M21N1FMxe , M21N1FMye , M21N1FMze , M21N1MKxe , & + M21N1MKye , M21N1MKze , M21N1MMxe , M21N1MMye , M21N1MMze , M21N1RAxe , M21N1RAye , & + M21N1RAze , M21N1RDxe , M21N1RDye , M21N1RDze , M21N1TAxe , M21N1TAye , M21N1TAze , & + M21N1TDxss , M21N1TDyss , M21N1TDzss , M21N2FKxe , M21N2FKye , M21N2FKze , M21N2FMxe , & + M21N2FMye , M21N2FMze , M21N2MKxe , M21N2MKye , M21N2MKze , M21N2MMxe , M21N2MMye , & + M21N2MMze , M21N2RAxe , M21N2RAye , M21N2RAze , M21N2RDxe , M21N2RDye , M21N2RDze , & + M21N2TAxe , M21N2TAye , M21N2TAze , M21N2TDxss , M21N2TDyss , M21N2TDzss , M21N3FKxe , & + M21N3FKye , M21N3FKze , M21N3FMxe , M21N3FMye , M21N3FMze , M21N3MKxe , M21N3MKye , & + M21N3MKze , M21N3MMxe , M21N3MMye , M21N3MMze , M21N3RAxe , M21N3RAye , M21N3RAze , & + M21N3RDxe , M21N3RDye , M21N3RDze , M21N3TAxe , M21N3TAye , M21N3TAze , M21N3TDxss , & + M21N3TDyss , M21N3TDzss , M21N4FKxe , M21N4FKye , M21N4FKze , M21N4FMxe , M21N4FMye , & + M21N4FMze , M21N4MKxe , M21N4MKye , M21N4MKze , M21N4MMxe , M21N4MMye , M21N4MMze , & + M21N4RAxe , M21N4RAye , M21N4RAze , M21N4RDxe , M21N4RDye , M21N4RDze , M21N4TAxe , & + M21N4TAye , M21N4TAze , M21N4TDxss , M21N4TDyss , M21N4TDzss , M21N5FKxe , M21N5FKye , & + M21N5FKze , M21N5FMxe , M21N5FMye , M21N5FMze , M21N5MKxe , M21N5MKye , M21N5MKze , & + M21N5MMxe , M21N5MMye , M21N5MMze , M21N5RAxe , M21N5RAye , M21N5RAze , M21N5RDxe , & + M21N5RDye , M21N5RDze , M21N5TAxe , M21N5TAye , M21N5TAze , M21N5TDxss , M21N5TDyss , & + M21N5TDzss , M21N6FKxe , M21N6FKye , M21N6FKze , M21N6FMxe , M21N6FMye , M21N6FMze , & + M21N6MKxe , M21N6MKye , M21N6MKze , M21N6MMxe , M21N6MMye , M21N6MMze , M21N6RAxe , & + M21N6RAye , M21N6RAze , M21N6RDxe , M21N6RDye , M21N6RDze , M21N6TAxe , M21N6TAye , & + M21N6TAze , M21N6TDxss , M21N6TDyss , M21N6TDzss , M21N7FKxe , M21N7FKye , M21N7FKze , & + M21N7FMxe , M21N7FMye , M21N7FMze , M21N7MKxe , M21N7MKye , M21N7MKze , M21N7MMxe , & + M21N7MMye , M21N7MMze , M21N7RAxe , M21N7RAye , M21N7RAze , M21N7RDxe , M21N7RDye , & + M21N7RDze , M21N7TAxe , M21N7TAye , M21N7TAze , M21N7TDxss , M21N7TDyss , M21N7TDzss , & + M21N8FKxe , M21N8FKye , M21N8FKze , M21N8FMxe , M21N8FMye , M21N8FMze , M21N8MKxe , & + M21N8MKye , M21N8MKze , M21N8MMxe , M21N8MMye , M21N8MMze , M21N8RAxe , M21N8RAye , & + M21N8RAze , M21N8RDxe , M21N8RDye , M21N8RDze , M21N8TAxe , M21N8TAye , M21N8TAze , & + M21N8TDxss , M21N8TDyss , M21N8TDzss , M21N9FKxe , M21N9FKye , M21N9FKze , M21N9FMxe , & + M21N9FMye , M21N9FMze , M21N9MKxe , M21N9MKye , M21N9MKze , M21N9MMxe , M21N9MMye , & + M21N9MMze , M21N9RAxe , M21N9RAye , M21N9RAze , M21N9RDxe , M21N9RDye , M21N9RDze , & + M21N9TAxe , M21N9TAye , M21N9TAze , M21N9TDxss , M21N9TDyss , M21N9TDzss , M22N1FKxe , & + M22N1FKye , M22N1FKze , M22N1FMxe , M22N1FMye , M22N1FMze , M22N1MKxe , M22N1MKye , & + M22N1MKze , M22N1MMxe , M22N1MMye , M22N1MMze , M22N1RAxe , M22N1RAye , M22N1RAze , & + M22N1RDxe , M22N1RDye , M22N1RDze , M22N1TAxe , M22N1TAye , M22N1TAze , M22N1TDxss , & + M22N1TDyss , M22N1TDzss , M22N2FKxe , M22N2FKye , M22N2FKze , M22N2FMxe , M22N2FMye , & + M22N2FMze , M22N2MKxe , M22N2MKye , M22N2MKze , M22N2MMxe , M22N2MMye , M22N2MMze , & + M22N2RAxe , M22N2RAye , M22N2RAze , M22N2RDxe , M22N2RDye , M22N2RDze , M22N2TAxe , & + M22N2TAye , M22N2TAze , M22N2TDxss , M22N2TDyss , M22N2TDzss , M22N3FKxe , M22N3FKye , & + M22N3FKze , M22N3FMxe , M22N3FMye , M22N3FMze , M22N3MKxe , M22N3MKye , M22N3MKze , & + M22N3MMxe , M22N3MMye , M22N3MMze , M22N3RAxe , M22N3RAye , M22N3RAze , M22N3RDxe , & + M22N3RDye , M22N3RDze , M22N3TAxe , M22N3TAye , M22N3TAze , M22N3TDxss , M22N3TDyss , & + M22N3TDzss , M22N4FKxe , M22N4FKye , M22N4FKze , M22N4FMxe , M22N4FMye , M22N4FMze , & + M22N4MKxe , M22N4MKye , M22N4MKze , M22N4MMxe , M22N4MMye , M22N4MMze , M22N4RAxe , & + M22N4RAye , M22N4RAze , M22N4RDxe , M22N4RDye , M22N4RDze , M22N4TAxe , M22N4TAye , & + M22N4TAze , M22N4TDxss , M22N4TDyss , M22N4TDzss , M22N5FKxe , M22N5FKye , M22N5FKze , & + M22N5FMxe , M22N5FMye , M22N5FMze , M22N5MKxe , M22N5MKye , M22N5MKze , M22N5MMxe , & + M22N5MMye , M22N5MMze , M22N5RAxe , M22N5RAye , M22N5RAze , M22N5RDxe , M22N5RDye , & + M22N5RDze , M22N5TAxe , M22N5TAye , M22N5TAze , M22N5TDxss , M22N5TDyss , M22N5TDzss , & + M22N6FKxe , M22N6FKye , M22N6FKze , M22N6FMxe , M22N6FMye , M22N6FMze , M22N6MKxe , & + M22N6MKye , M22N6MKze , M22N6MMxe , M22N6MMye , M22N6MMze , M22N6RAxe , M22N6RAye , & + M22N6RAze , M22N6RDxe , M22N6RDye , M22N6RDze , M22N6TAxe , M22N6TAye , M22N6TAze , & + M22N6TDxss , M22N6TDyss , M22N6TDzss , M22N7FKxe , M22N7FKye , M22N7FKze , M22N7FMxe , & + M22N7FMye , M22N7FMze , M22N7MKxe , M22N7MKye , M22N7MKze , M22N7MMxe , M22N7MMye , & + M22N7MMze , M22N7RAxe , M22N7RAye , M22N7RAze , M22N7RDxe , M22N7RDye , M22N7RDze , & + M22N7TAxe , M22N7TAye , M22N7TAze , M22N7TDxss , M22N7TDyss , M22N7TDzss , M22N8FKxe , & + M22N8FKye , M22N8FKze , M22N8FMxe , M22N8FMye , M22N8FMze , M22N8MKxe , M22N8MKye , & + M22N8MKze , M22N8MMxe , M22N8MMye , M22N8MMze , M22N8RAxe , M22N8RAye , M22N8RAze , & + M22N8RDxe , M22N8RDye , M22N8RDze , M22N8TAxe , M22N8TAye , M22N8TAze , M22N8TDxss , & + M22N8TDyss , M22N8TDzss , M22N9FKxe , M22N9FKye , M22N9FKze , M22N9FMxe , M22N9FMye , & + M22N9FMze , M22N9MKxe , M22N9MKye , M22N9MKze , M22N9MMxe , M22N9MMye , M22N9MMze , & + M22N9RAxe , M22N9RAye , M22N9RAze , M22N9RDxe , M22N9RDye , M22N9RDze , M22N9TAxe , & + M22N9TAye , M22N9TAze , M22N9TDxss , M22N9TDyss , M22N9TDzss , M23N1FKxe , M23N1FKye , & + M23N1FKze , M23N1FMxe , M23N1FMye , M23N1FMze , M23N1MKxe , M23N1MKye , M23N1MKze , & + M23N1MMxe , M23N1MMye , M23N1MMze , M23N1RAxe , M23N1RAye , M23N1RAze , M23N1RDxe , & + M23N1RDye , M23N1RDze , M23N1TAxe , M23N1TAye , M23N1TAze , M23N1TDxss , M23N1TDyss , & + M23N1TDzss , M23N2FKxe , M23N2FKye , M23N2FKze , M23N2FMxe , M23N2FMye , M23N2FMze , & + M23N2MKxe , M23N2MKye , M23N2MKze , M23N2MMxe , M23N2MMye , M23N2MMze , M23N2RAxe , & + M23N2RAye , M23N2RAze , M23N2RDxe , M23N2RDye , M23N2RDze , M23N2TAxe , M23N2TAye , & + M23N2TAze , M23N2TDxss , M23N2TDyss , M23N2TDzss , M23N3FKxe , M23N3FKye , M23N3FKze , & + M23N3FMxe , M23N3FMye , M23N3FMze , M23N3MKxe , M23N3MKye , M23N3MKze , M23N3MMxe , & + M23N3MMye , M23N3MMze , M23N3RAxe , M23N3RAye , M23N3RAze , M23N3RDxe , M23N3RDye , & + M23N3RDze , M23N3TAxe , M23N3TAye , M23N3TAze , M23N3TDxss , M23N3TDyss , M23N3TDzss , & + M23N4FKxe , M23N4FKye , M23N4FKze , M23N4FMxe , M23N4FMye , M23N4FMze , M23N4MKxe , & + M23N4MKye , M23N4MKze , M23N4MMxe , M23N4MMye , M23N4MMze , M23N4RAxe , M23N4RAye , & + M23N4RAze , M23N4RDxe , M23N4RDye , M23N4RDze , M23N4TAxe , M23N4TAye , M23N4TAze /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry4(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M23N4TDxss , M23N4TDyss , M23N4TDzss , M23N5FKxe , M23N5FKye , M23N5FKze , M23N5FMxe , & + M23N5FMye , M23N5FMze , M23N5MKxe , M23N5MKye , M23N5MKze , M23N5MMxe , M23N5MMye , & + M23N5MMze , M23N5RAxe , M23N5RAye , M23N5RAze , M23N5RDxe , M23N5RDye , M23N5RDze , & + M23N5TAxe , M23N5TAye , M23N5TAze , M23N5TDxss , M23N5TDyss , M23N5TDzss , M23N6FKxe , & + M23N6FKye , M23N6FKze , M23N6FMxe , M23N6FMye , M23N6FMze , M23N6MKxe , M23N6MKye , & + M23N6MKze , M23N6MMxe , M23N6MMye , M23N6MMze , M23N6RAxe , M23N6RAye , M23N6RAze , & + M23N6RDxe , M23N6RDye , M23N6RDze , M23N6TAxe , M23N6TAye , M23N6TAze , M23N6TDxss , & + M23N6TDyss , M23N6TDzss , M23N7FKxe , M23N7FKye , M23N7FKze , M23N7FMxe , M23N7FMye , & + M23N7FMze , M23N7MKxe , M23N7MKye , M23N7MKze , M23N7MMxe , M23N7MMye , M23N7MMze , & + M23N7RAxe , M23N7RAye , M23N7RAze , M23N7RDxe , M23N7RDye , M23N7RDze , M23N7TAxe , & + M23N7TAye , M23N7TAze , M23N7TDxss , M23N7TDyss , M23N7TDzss , M23N8FKxe , M23N8FKye , & + M23N8FKze , M23N8FMxe , M23N8FMye , M23N8FMze , M23N8MKxe , M23N8MKye , M23N8MKze , & + M23N8MMxe , M23N8MMye , M23N8MMze , M23N8RAxe , M23N8RAye , M23N8RAze , M23N8RDxe , & + M23N8RDye , M23N8RDze , M23N8TAxe , M23N8TAye , M23N8TAze , M23N8TDxss , M23N8TDyss , & + M23N8TDzss , M23N9FKxe , M23N9FKye , M23N9FKze , M23N9FMxe , M23N9FMye , M23N9FMze , & + M23N9MKxe , M23N9MKye , M23N9MKze , M23N9MMxe , M23N9MMye , M23N9MMze , M23N9RAxe , & + M23N9RAye , M23N9RAze , M23N9RDxe , M23N9RDye , M23N9RDze , M23N9TAxe , M23N9TAye , & + M23N9TAze , M23N9TDxss , M23N9TDyss , M23N9TDzss , M24N1FKxe , M24N1FKye , M24N1FKze , & + M24N1FMxe , M24N1FMye , M24N1FMze , M24N1MKxe , M24N1MKye , M24N1MKze , M24N1MMxe , & + M24N1MMye , M24N1MMze , M24N1RAxe , M24N1RAye , M24N1RAze , M24N1RDxe , M24N1RDye , & + M24N1RDze , M24N1TAxe , M24N1TAye , M24N1TAze , M24N1TDxss , M24N1TDyss , M24N1TDzss , & + M24N2FKxe , M24N2FKye , M24N2FKze , M24N2FMxe , M24N2FMye , M24N2FMze , M24N2MKxe , & + M24N2MKye , M24N2MKze , M24N2MMxe , M24N2MMye , M24N2MMze , M24N2RAxe , M24N2RAye , & + M24N2RAze , M24N2RDxe , M24N2RDye , M24N2RDze , M24N2TAxe , M24N2TAye , M24N2TAze , & + M24N2TDxss , M24N2TDyss , M24N2TDzss , M24N3FKxe , M24N3FKye , M24N3FKze , M24N3FMxe , & + M24N3FMye , M24N3FMze , M24N3MKxe , M24N3MKye , M24N3MKze , M24N3MMxe , M24N3MMye , & + M24N3MMze , M24N3RAxe , M24N3RAye , M24N3RAze , M24N3RDxe , M24N3RDye , M24N3RDze , & + M24N3TAxe , M24N3TAye , M24N3TAze , M24N3TDxss , M24N3TDyss , M24N3TDzss , M24N4FKxe , & + M24N4FKye , M24N4FKze , M24N4FMxe , M24N4FMye , M24N4FMze , M24N4MKxe , M24N4MKye , & + M24N4MKze , M24N4MMxe , M24N4MMye , M24N4MMze , M24N4RAxe , M24N4RAye , M24N4RAze , & + M24N4RDxe , M24N4RDye , M24N4RDze , M24N4TAxe , M24N4TAye , M24N4TAze , M24N4TDxss , & + M24N4TDyss , M24N4TDzss , M24N5FKxe , M24N5FKye , M24N5FKze , M24N5FMxe , M24N5FMye , & + M24N5FMze , M24N5MKxe , M24N5MKye , M24N5MKze , M24N5MMxe , M24N5MMye , M24N5MMze , & + M24N5RAxe , M24N5RAye , M24N5RAze , M24N5RDxe , M24N5RDye , M24N5RDze , M24N5TAxe , & + M24N5TAye , M24N5TAze , M24N5TDxss , M24N5TDyss , M24N5TDzss , M24N6FKxe , M24N6FKye , & + M24N6FKze , M24N6FMxe , M24N6FMye , M24N6FMze , M24N6MKxe , M24N6MKye , M24N6MKze , & + M24N6MMxe , M24N6MMye , M24N6MMze , M24N6RAxe , M24N6RAye , M24N6RAze , M24N6RDxe , & + M24N6RDye , M24N6RDze , M24N6TAxe , M24N6TAye , M24N6TAze , M24N6TDxss , M24N6TDyss , & + M24N6TDzss , M24N7FKxe , M24N7FKye , M24N7FKze , M24N7FMxe , M24N7FMye , M24N7FMze , & + M24N7MKxe , M24N7MKye , M24N7MKze , M24N7MMxe , M24N7MMye , M24N7MMze , M24N7RAxe , & + M24N7RAye , M24N7RAze , M24N7RDxe , M24N7RDye , M24N7RDze , M24N7TAxe , M24N7TAye , & + M24N7TAze , M24N7TDxss , M24N7TDyss , M24N7TDzss , M24N8FKxe , M24N8FKye , M24N8FKze , & + M24N8FMxe , M24N8FMye , M24N8FMze , M24N8MKxe , M24N8MKye , M24N8MKze , M24N8MMxe , & + M24N8MMye , M24N8MMze , M24N8RAxe , M24N8RAye , M24N8RAze , M24N8RDxe , M24N8RDye , & + M24N8RDze , M24N8TAxe , M24N8TAye , M24N8TAze , M24N8TDxss , M24N8TDyss , M24N8TDzss , & + M24N9FKxe , M24N9FKye , M24N9FKze , M24N9FMxe , M24N9FMye , M24N9FMze , M24N9MKxe , & + M24N9MKye , M24N9MKze , M24N9MMxe , M24N9MMye , M24N9MMze , M24N9RAxe , M24N9RAye , & + M24N9RAze , M24N9RDxe , M24N9RDye , M24N9RDze , M24N9TAxe , M24N9TAye , M24N9TAze , & + M24N9TDxss , M24N9TDyss , M24N9TDzss , M25N1FKxe , M25N1FKye , M25N1FKze , M25N1FMxe , & + M25N1FMye , M25N1FMze , M25N1MKxe , M25N1MKye , M25N1MKze , M25N1MMxe , M25N1MMye , & + M25N1MMze , M25N1RAxe , M25N1RAye , M25N1RAze , M25N1RDxe , M25N1RDye , M25N1RDze , & + M25N1TAxe , M25N1TAye , M25N1TAze , M25N1TDxss , M25N1TDyss , M25N1TDzss , M25N2FKxe , & + M25N2FKye , M25N2FKze , M25N2FMxe , M25N2FMye , M25N2FMze , M25N2MKxe , M25N2MKye , & + M25N2MKze , M25N2MMxe , M25N2MMye , M25N2MMze , M25N2RAxe , M25N2RAye , M25N2RAze , & + M25N2RDxe , M25N2RDye , M25N2RDze , M25N2TAxe , M25N2TAye , M25N2TAze , M25N2TDxss , & + M25N2TDyss , M25N2TDzss , M25N3FKxe , M25N3FKye , M25N3FKze , M25N3FMxe , M25N3FMye , & + M25N3FMze , M25N3MKxe , M25N3MKye , M25N3MKze , M25N3MMxe , M25N3MMye , M25N3MMze , & + M25N3RAxe , M25N3RAye , M25N3RAze , M25N3RDxe , M25N3RDye , M25N3RDze , M25N3TAxe , & + M25N3TAye , M25N3TAze , M25N3TDxss , M25N3TDyss , M25N3TDzss , M25N4FKxe , M25N4FKye , & + M25N4FKze , M25N4FMxe , M25N4FMye , M25N4FMze , M25N4MKxe , M25N4MKye , M25N4MKze , & + M25N4MMxe , M25N4MMye , M25N4MMze , M25N4RAxe , M25N4RAye , M25N4RAze , M25N4RDxe , & + M25N4RDye , M25N4RDze , M25N4TAxe , M25N4TAye , M25N4TAze , M25N4TDxss , M25N4TDyss , & + M25N4TDzss , M25N5FKxe , M25N5FKye , M25N5FKze , M25N5FMxe , M25N5FMye , M25N5FMze , & + M25N5MKxe , M25N5MKye , M25N5MKze , M25N5MMxe , M25N5MMye , M25N5MMze , M25N5RAxe , & + M25N5RAye , M25N5RAze , M25N5RDxe , M25N5RDye , M25N5RDze , M25N5TAxe , M25N5TAye , & + M25N5TAze , M25N5TDxss , M25N5TDyss , M25N5TDzss , M25N6FKxe , M25N6FKye , M25N6FKze , & + M25N6FMxe , M25N6FMye , M25N6FMze , M25N6MKxe , M25N6MKye , M25N6MKze , M25N6MMxe , & + M25N6MMye , M25N6MMze , M25N6RAxe , M25N6RAye , M25N6RAze , M25N6RDxe , M25N6RDye , & + M25N6RDze , M25N6TAxe , M25N6TAye , M25N6TAze , M25N6TDxss , M25N6TDyss , M25N6TDzss , & + M25N7FKxe , M25N7FKye , M25N7FKze , M25N7FMxe , M25N7FMye , M25N7FMze , M25N7MKxe , & + M25N7MKye , M25N7MKze , M25N7MMxe , M25N7MMye , M25N7MMze , M25N7RAxe , M25N7RAye , & + M25N7RAze , M25N7RDxe , M25N7RDye , M25N7RDze , M25N7TAxe , M25N7TAye , M25N7TAze , & + M25N7TDxss , M25N7TDyss , M25N7TDzss , M25N8FKxe , M25N8FKye , M25N8FKze , M25N8FMxe , & + M25N8FMye , M25N8FMze , M25N8MKxe , M25N8MKye , M25N8MKze , M25N8MMxe , M25N8MMye , & + M25N8MMze , M25N8RAxe , M25N8RAye , M25N8RAze , M25N8RDxe , M25N8RDye , M25N8RDze , & + M25N8TAxe , M25N8TAye , M25N8TAze , M25N8TDxss , M25N8TDyss , M25N8TDzss , M25N9FKxe , & + M25N9FKye , M25N9FKze , M25N9FMxe , M25N9FMye , M25N9FMze , M25N9MKxe , M25N9MKye , & + M25N9MKze , M25N9MMxe , M25N9MMye , M25N9MMze , M25N9RAxe , M25N9RAye , M25N9RAze , & + M25N9RDxe , M25N9RDye , M25N9RDze , M25N9TAxe , M25N9TAye , M25N9TAze , M25N9TDxss , & + M25N9TDyss , M25N9TDzss , M26N1FKxe , M26N1FKye , M26N1FKze , M26N1FMxe , M26N1FMye , & + M26N1FMze , M26N1MKxe , M26N1MKye , M26N1MKze , M26N1MMxe , M26N1MMye , M26N1MMze , & + M26N1RAxe , M26N1RAye , M26N1RAze , M26N1RDxe , M26N1RDye , M26N1RDze , M26N1TAxe , & + M26N1TAye , M26N1TAze , M26N1TDxss , M26N1TDyss , M26N1TDzss , M26N2FKxe , M26N2FKye , & + M26N2FKze , M26N2FMxe , M26N2FMye , M26N2FMze , M26N2MKxe , M26N2MKye , M26N2MKze , & + M26N2MMxe , M26N2MMye , M26N2MMze , M26N2RAxe , M26N2RAye , M26N2RAze , M26N2RDxe , & + M26N2RDye , M26N2RDze , M26N2TAxe , M26N2TAye , M26N2TAze , M26N2TDxss , M26N2TDyss , & + M26N2TDzss , M26N3FKxe , M26N3FKye , M26N3FKze , M26N3FMxe , M26N3FMye , M26N3FMze , & + M26N3MKxe , M26N3MKye , M26N3MKze , M26N3MMxe , M26N3MMye , M26N3MMze , M26N3RAxe , & + M26N3RAye , M26N3RAze , M26N3RDxe , M26N3RDye , M26N3RDze , M26N3TAxe , M26N3TAye , & + M26N3TAze , M26N3TDxss , M26N3TDyss , M26N3TDzss , M26N4FKxe , M26N4FKye , M26N4FKze , & + M26N4FMxe , M26N4FMye , M26N4FMze , M26N4MKxe , M26N4MKye , M26N4MKze , M26N4MMxe , & + M26N4MMye , M26N4MMze , M26N4RAxe , M26N4RAye , M26N4RAze , M26N4RDxe , M26N4RDye , & + M26N4RDze , M26N4TAxe , M26N4TAye , M26N4TAze , M26N4TDxss , M26N4TDyss , M26N4TDzss , & + M26N5FKxe , M26N5FKye , M26N5FKze , M26N5FMxe , M26N5FMye , M26N5FMze , M26N5MKxe , & + M26N5MKye , M26N5MKze , M26N5MMxe , M26N5MMye , M26N5MMze , M26N5RAxe , M26N5RAye , & + M26N5RAze , M26N5RDxe , M26N5RDye , M26N5RDze , M26N5TAxe , M26N5TAye , M26N5TAze , & + M26N5TDxss , M26N5TDyss , M26N5TDzss , M26N6FKxe , M26N6FKye , M26N6FKze , M26N6FMxe , & + M26N6FMye , M26N6FMze , M26N6MKxe , M26N6MKye , M26N6MKze , M26N6MMxe , M26N6MMye , & + M26N6MMze , M26N6RAxe , M26N6RAye , M26N6RAze , M26N6RDxe , M26N6RDye , M26N6RDze , & + M26N6TAxe , M26N6TAye , M26N6TAze , M26N6TDxss , M26N6TDyss , M26N6TDzss , M26N7FKxe , & + M26N7FKye , M26N7FKze , M26N7FMxe , M26N7FMye , M26N7FMze , M26N7MKxe , M26N7MKye , & + M26N7MKze , M26N7MMxe , M26N7MMye , M26N7MMze , M26N7RAxe , M26N7RAye , M26N7RAze , & + M26N7RDxe , M26N7RDye , M26N7RDze , M26N7TAxe , M26N7TAye , M26N7TAze , M26N7TDxss , & + M26N7TDyss , M26N7TDzss , M26N8FKxe , M26N8FKye , M26N8FKze , M26N8FMxe , M26N8FMye , & + M26N8FMze , M26N8MKxe , M26N8MKye , M26N8MKze , M26N8MMxe , M26N8MMye , M26N8MMze , & + M26N8RAxe , M26N8RAye , M26N8RAze , M26N8RDxe , M26N8RDye , M26N8RDze , M26N8TAxe , & + M26N8TAye , M26N8TAze , M26N8TDxss , M26N8TDyss , M26N8TDzss , M26N9FKxe , M26N9FKye , & + M26N9FKze , M26N9FMxe , M26N9FMye , M26N9FMze , M26N9MKxe , M26N9MKye , M26N9MKze , & + M26N9MMxe , M26N9MMye , M26N9MMze , M26N9RAxe , M26N9RAye , M26N9RAze , M26N9RDxe , & + M26N9RDye , M26N9RDze , M26N9TAxe , M26N9TAye , M26N9TAze , M26N9TDxss , M26N9TDyss , & + M26N9TDzss , M27N1FKxe , M27N1FKye , M27N1FKze , M27N1FMxe , M27N1FMye , M27N1FMze , & + M27N1MKxe , M27N1MKye , M27N1MKze , M27N1MMxe , M27N1MMye , M27N1MMze , M27N1RAxe , & + M27N1RAye , M27N1RAze , M27N1RDxe , M27N1RDye , M27N1RDze , M27N1TAxe , M27N1TAye , & + M27N1TAze , M27N1TDxss , M27N1TDyss , M27N1TDzss , M27N2FKxe , M27N2FKye , M27N2FKze , & + M27N2FMxe , M27N2FMye , M27N2FMze , M27N2MKxe , M27N2MKye , M27N2MKze , M27N2MMxe , & + M27N2MMye , M27N2MMze , M27N2RAxe , M27N2RAye , M27N2RAze , M27N2RDxe , M27N2RDye , & + M27N2RDze , M27N2TAxe , M27N2TAye , M27N2TAze , M27N2TDxss , M27N2TDyss , M27N2TDzss , & + M27N3FKxe , M27N3FKye , M27N3FKze , M27N3FMxe , M27N3FMye , M27N3FMze , M27N3MKxe , & + M27N3MKye , M27N3MKze , M27N3MMxe , M27N3MMye , M27N3MMze , M27N3RAxe , M27N3RAye , & + M27N3RAze , M27N3RDxe , M27N3RDye , M27N3RDze , M27N3TAxe , M27N3TAye , M27N3TAze , & + M27N3TDxss , M27N3TDyss , M27N3TDzss , M27N4FKxe , M27N4FKye , M27N4FKze , M27N4FMxe , & + M27N4FMye , M27N4FMze , M27N4MKxe , M27N4MKye , M27N4MKze , M27N4MMxe , M27N4MMye , & + M27N4MMze , M27N4RAxe , M27N4RAye , M27N4RAze , M27N4RDxe , M27N4RDye , M27N4RDze , & + M27N4TAxe , M27N4TAye , M27N4TAze , M27N4TDxss , M27N4TDyss , M27N4TDzss , M27N5FKxe , & + M27N5FKye , M27N5FKze , M27N5FMxe , M27N5FMye , M27N5FMze , M27N5MKxe , M27N5MKye , & + M27N5MKze , M27N5MMxe , M27N5MMye , M27N5MMze , M27N5RAxe , M27N5RAye , M27N5RAze , & + M27N5RDxe , M27N5RDye , M27N5RDze , M27N5TAxe , M27N5TAye , M27N5TAze , M27N5TDxss , & + M27N5TDyss , M27N5TDzss , M27N6FKxe , M27N6FKye , M27N6FKze , M27N6FMxe , M27N6FMye , & + M27N6FMze , M27N6MKxe , M27N6MKye , M27N6MKze , M27N6MMxe , M27N6MMye , M27N6MMze , & + M27N6RAxe , M27N6RAye , M27N6RAze , M27N6RDxe , M27N6RDye , M27N6RDze , M27N6TAxe , & + M27N6TAye , M27N6TAze , M27N6TDxss , M27N6TDyss , M27N6TDzss , M27N7FKxe , M27N7FKye , & + M27N7FKze , M27N7FMxe , M27N7FMye , M27N7FMze , M27N7MKxe , M27N7MKye , M27N7MKze , & + M27N7MMxe , M27N7MMye , M27N7MMze , M27N7RAxe , M27N7RAye , M27N7RAze , M27N7RDxe , & + M27N7RDye , M27N7RDze , M27N7TAxe , M27N7TAye , M27N7TAze , M27N7TDxss , M27N7TDyss , & + M27N7TDzss , M27N8FKxe , M27N8FKye , M27N8FKze , M27N8FMxe , M27N8FMye , M27N8FMze , & + M27N8MKxe , M27N8MKye , M27N8MKze , M27N8MMxe , M27N8MMye , M27N8MMze , M27N8RAxe , & + M27N8RAye , M27N8RAze , M27N8RDxe , M27N8RDye , M27N8RDze , M27N8TAxe , M27N8TAye , & + M27N8TAze , M27N8TDxss , M27N8TDyss , M27N8TDzss , M27N9FKxe , M27N9FKye , M27N9FKze , & + M27N9FMxe , M27N9FMye , M27N9FMze , M27N9MKxe , M27N9MKye , M27N9MKze , M27N9MMxe , & + M27N9MMye , M27N9MMze , M27N9RAxe , M27N9RAye , M27N9RAze , M27N9RDxe , M27N9RDye , & + M27N9RDze , M27N9TAxe , M27N9TAye , M27N9TAze , M27N9TDxss , M27N9TDyss , M27N9TDzss , & + M28N1FKxe , M28N1FKye , M28N1FKze , M28N1FMxe , M28N1FMye , M28N1FMze , M28N1MKxe , & + M28N1MKye , M28N1MKze , M28N1MMxe , M28N1MMye , M28N1MMze , M28N1RAxe , M28N1RAye , & + M28N1RAze , M28N1RDxe , M28N1RDye , M28N1RDze , M28N1TAxe , M28N1TAye , M28N1TAze , & + M28N1TDxss , M28N1TDyss , M28N1TDzss , M28N2FKxe , M28N2FKye , M28N2FKze , M28N2FMxe , & + M28N2FMye , M28N2FMze , M28N2MKxe , M28N2MKye , M28N2MKze , M28N2MMxe , M28N2MMye , & + M28N2MMze , M28N2RAxe , M28N2RAye , M28N2RAze , M28N2RDxe , M28N2RDye , M28N2RDze , & + M28N2TAxe , M28N2TAye , M28N2TAze , M28N2TDxss , M28N2TDyss , M28N2TDzss , M28N3FKxe , & + M28N3FKye , M28N3FKze , M28N3FMxe , M28N3FMye , M28N3FMze , M28N3MKxe , M28N3MKye , & + M28N3MKze , M28N3MMxe , M28N3MMye , M28N3MMze , M28N3RAxe , M28N3RAye , M28N3RAze , & + M28N3RDxe , M28N3RDye , M28N3RDze , M28N3TAxe , M28N3TAye , M28N3TAze , M28N3TDxss , & + M28N3TDyss , M28N3TDzss , M28N4FKxe , M28N4FKye , M28N4FKze , M28N4FMxe , M28N4FMye , & + M28N4FMze , M28N4MKxe , M28N4MKye , M28N4MKze , M28N4MMxe , M28N4MMye , M28N4MMze , & + M28N4RAxe , M28N4RAye , M28N4RAze , M28N4RDxe , M28N4RDye , M28N4RDze , M28N4TAxe , & + M28N4TAye , M28N4TAze , M28N4TDxss , M28N4TDyss , M28N4TDzss , M28N5FKxe , M28N5FKye , & + M28N5FKze , M28N5FMxe , M28N5FMye , M28N5FMze , M28N5MKxe , M28N5MKye , M28N5MKze , & + M28N5MMxe , M28N5MMye , M28N5MMze , M28N5RAxe , M28N5RAye , M28N5RAze , M28N5RDxe , & + M28N5RDye , M28N5RDze , M28N5TAxe , M28N5TAye , M28N5TAze , M28N5TDxss , M28N5TDyss , & + M28N5TDzss , M28N6FKxe , M28N6FKye , M28N6FKze , M28N6FMxe , M28N6FMye , M28N6FMze , & + M28N6MKxe , M28N6MKye , M28N6MKze , M28N6MMxe , M28N6MMye , M28N6MMze , M28N6RAxe , & + M28N6RAye , M28N6RAze , M28N6RDxe , M28N6RDye , M28N6RDze , M28N6TAxe , M28N6TAye , & + M28N6TAze , M28N6TDxss , M28N6TDyss , M28N6TDzss , M28N7FKxe , M28N7FKye , M28N7FKze , & + M28N7FMxe , M28N7FMye , M28N7FMze , M28N7MKxe , M28N7MKye , M28N7MKze , M28N7MMxe , & + M28N7MMye , M28N7MMze , M28N7RAxe , M28N7RAye , M28N7RAze , M28N7RDxe , M28N7RDye , & + M28N7RDze , M28N7TAxe , M28N7TAye , M28N7TAze , M28N7TDxss , M28N7TDyss , M28N7TDzss , & + M28N8FKxe , M28N8FKye , M28N8FKze , M28N8FMxe , M28N8FMye , M28N8FMze , M28N8MKxe , & + M28N8MKye , M28N8MKze , M28N8MMxe , M28N8MMye , M28N8MMze , M28N8RAxe , M28N8RAye , & + M28N8RAze , M28N8RDxe , M28N8RDye , M28N8RDze , M28N8TAxe , M28N8TAye , M28N8TAze , & + M28N8TDxss , M28N8TDyss , M28N8TDzss , M28N9FKxe , M28N9FKye , M28N9FKze , M28N9FMxe , & + M28N9FMye , M28N9FMze , M28N9MKxe , M28N9MKye , M28N9MKze , M28N9MMxe , M28N9MMye , & + M28N9MMze , M28N9RAxe , M28N9RAye , M28N9RAze , M28N9RDxe , M28N9RDye , M28N9RDze , & + M28N9TAxe , M28N9TAye , M28N9TAze , M28N9TDxss , M28N9TDyss , M28N9TDzss , M29N1FKxe , & + M29N1FKye , M29N1FKze , M29N1FMxe , M29N1FMye , M29N1FMze , M29N1MKxe , M29N1MKye , & + M29N1MKze , M29N1MMxe , M29N1MMye , M29N1MMze , M29N1RAxe , M29N1RAye , M29N1RAze , & + M29N1RDxe , M29N1RDye , M29N1RDze , M29N1TAxe , M29N1TAye , M29N1TAze , M29N1TDxss , & + M29N1TDyss , M29N1TDzss , M29N2FKxe , M29N2FKye , M29N2FKze , M29N2FMxe , M29N2FMye , & + M29N2FMze , M29N2MKxe , M29N2MKye , M29N2MKze , M29N2MMxe , M29N2MMye , M29N2MMze , & + M29N2RAxe , M29N2RAye , M29N2RAze , M29N2RDxe , M29N2RDye , M29N2RDze , M29N2TAxe , & + M29N2TAye , M29N2TAze , M29N2TDxss , M29N2TDyss , M29N2TDzss , M29N3FKxe , M29N3FKye , & + M29N3FKze , M29N3FMxe , M29N3FMye , M29N3FMze , M29N3MKxe , M29N3MKye , M29N3MKze , & + M29N3MMxe , M29N3MMye , M29N3MMze , M29N3RAxe , M29N3RAye , M29N3RAze , M29N3RDxe , & + M29N3RDye , M29N3RDze , M29N3TAxe , M29N3TAye , M29N3TAze , M29N3TDxss , M29N3TDyss , & + M29N3TDzss , M29N4FKxe , M29N4FKye , M29N4FKze , M29N4FMxe , M29N4FMye , M29N4FMze , & + M29N4MKxe , M29N4MKye , M29N4MKze , M29N4MMxe , M29N4MMye , M29N4MMze , M29N4RAxe , & + M29N4RAye , M29N4RAze , M29N4RDxe , M29N4RDye , M29N4RDze , M29N4TAxe , M29N4TAye , & + M29N4TAze , M29N4TDxss , M29N4TDyss , M29N4TDzss , M29N5FKxe , M29N5FKye , M29N5FKze , & + M29N5FMxe , M29N5FMye , M29N5FMze , M29N5MKxe , M29N5MKye , M29N5MKze , M29N5MMxe , & + M29N5MMye , M29N5MMze , M29N5RAxe , M29N5RAye , M29N5RAze , M29N5RDxe , M29N5RDye , & + M29N5RDze , M29N5TAxe , M29N5TAye , M29N5TAze , M29N5TDxss , M29N5TDyss , M29N5TDzss , & + M29N6FKxe , M29N6FKye , M29N6FKze , M29N6FMxe , M29N6FMye , M29N6FMze , M29N6MKxe , & + M29N6MKye , M29N6MKze , M29N6MMxe , M29N6MMye , M29N6MMze , M29N6RAxe , M29N6RAye , & + M29N6RAze , M29N6RDxe , M29N6RDye , M29N6RDze , M29N6TAxe , M29N6TAye , M29N6TAze , & + M29N6TDxss , M29N6TDyss , M29N6TDzss , M29N7FKxe , M29N7FKye , M29N7FKze , M29N7FMxe , & + M29N7FMye , M29N7FMze , M29N7MKxe , M29N7MKye , M29N7MKze , M29N7MMxe , M29N7MMye , & + M29N7MMze , M29N7RAxe , M29N7RAye , M29N7RAze , M29N7RDxe , M29N7RDye , M29N7RDze , & + M29N7TAxe , M29N7TAye , M29N7TAze , M29N7TDxss , M29N7TDyss , M29N7TDzss , M29N8FKxe , & + M29N8FKye , M29N8FKze , M29N8FMxe , M29N8FMye , M29N8FMze , M29N8MKxe , M29N8MKye , & + M29N8MKze , M29N8MMxe , M29N8MMye , M29N8MMze , M29N8RAxe , M29N8RAye , M29N8RAze , & + M29N8RDxe , M29N8RDye , M29N8RDze , M29N8TAxe , M29N8TAye , M29N8TAze , M29N8TDxss , & + M29N8TDyss , M29N8TDzss , M29N9FKxe , M29N9FKye , M29N9FKze , M29N9FMxe , M29N9FMye , & + M29N9FMze , M29N9MKxe , M29N9MKye , M29N9MKze , M29N9MMxe , M29N9MMye , M29N9MMze , & + M29N9RAxe , M29N9RAye , M29N9RAze , M29N9RDxe , M29N9RDye , M29N9RDze , M29N9TAxe , & + M29N9TAye , M29N9TAze , M29N9TDxss , M29N9TDyss , M29N9TDzss , M30N1FKxe , M30N1FKye , & + M30N1FKze , M30N1FMxe , M30N1FMye , M30N1FMze , M30N1MKxe , M30N1MKye , M30N1MKze , & + M30N1MMxe , M30N1MMye , M30N1MMze , M30N1RAxe , M30N1RAye , M30N1RAze , M30N1RDxe , & + M30N1RDye , M30N1RDze , M30N1TAxe , M30N1TAye , M30N1TAze , M30N1TDxss , M30N1TDyss , & + M30N1TDzss , M30N2FKxe , M30N2FKye , M30N2FKze , M30N2FMxe , M30N2FMye , M30N2FMze , & + M30N2MKxe , M30N2MKye , M30N2MKze , M30N2MMxe , M30N2MMye , M30N2MMze , M30N2RAxe , & + M30N2RAye , M30N2RAze , M30N2RDxe , M30N2RDye , M30N2RDze , M30N2TAxe , M30N2TAye , & + M30N2TAze , M30N2TDxss , M30N2TDyss , M30N2TDzss , M30N3FKxe , M30N3FKye , M30N3FKze , & + M30N3FMxe , M30N3FMye , M30N3FMze , M30N3MKxe , M30N3MKye , M30N3MKze , M30N3MMxe , & + M30N3MMye , M30N3MMze , M30N3RAxe , M30N3RAye , M30N3RAze , M30N3RDxe , M30N3RDye , & + M30N3RDze , M30N3TAxe , M30N3TAye , M30N3TAze , M30N3TDxss , M30N3TDyss , M30N3TDzss , & + M30N4FKxe , M30N4FKye , M30N4FKze , M30N4FMxe , M30N4FMye , M30N4FMze , M30N4MKxe , & + M30N4MKye , M30N4MKze , M30N4MMxe , M30N4MMye , M30N4MMze , M30N4RAxe , M30N4RAye , & + M30N4RAze , M30N4RDxe , M30N4RDye , M30N4RDze , M30N4TAxe , M30N4TAye , M30N4TAze , & + M30N4TDxss , M30N4TDyss , M30N4TDzss , M30N5FKxe , M30N5FKye , M30N5FKze , M30N5FMxe , & + M30N5FMye , M30N5FMze , M30N5MKxe , M30N5MKye , M30N5MKze , M30N5MMxe , M30N5MMye , & + M30N5MMze , M30N5RAxe , M30N5RAye , M30N5RAze , M30N5RDxe , M30N5RDye , M30N5RDze , & + M30N5TAxe , M30N5TAye , M30N5TAze , M30N5TDxss , M30N5TDyss , M30N5TDzss , M30N6FKxe , & + M30N6FKye , M30N6FKze , M30N6FMxe , M30N6FMye , M30N6FMze , M30N6MKxe , M30N6MKye , & + M30N6MKze , M30N6MMxe , M30N6MMye , M30N6MMze , M30N6RAxe , M30N6RAye , M30N6RAze , & + M30N6RDxe , M30N6RDye , M30N6RDze , M30N6TAxe , M30N6TAye , M30N6TAze , M30N6TDxss , & + M30N6TDyss , M30N6TDzss , M30N7FKxe , M30N7FKye , M30N7FKze , M30N7FMxe , M30N7FMye , & + M30N7FMze , M30N7MKxe , M30N7MKye , M30N7MKze , M30N7MMxe , M30N7MMye , M30N7MMze , & + M30N7RAxe , M30N7RAye , M30N7RAze , M30N7RDxe , M30N7RDye , M30N7RDze , M30N7TAxe , & + M30N7TAye , M30N7TAze , M30N7TDxss , M30N7TDyss , M30N7TDzss , M30N8FKxe , M30N8FKye , & + M30N8FKze , M30N8FMxe , M30N8FMye , M30N8FMze , M30N8MKxe , M30N8MKye , M30N8MKze , & + M30N8MMxe , M30N8MMye , M30N8MMze , M30N8RAxe , M30N8RAye , M30N8RAze , M30N8RDxe , & + M30N8RDye , M30N8RDze , M30N8TAxe , M30N8TAye , M30N8TAze , M30N8TDxss , M30N8TDyss , & + M30N8TDzss , M30N9FKxe , M30N9FKye , M30N9FKze , M30N9FMxe , M30N9FMye , M30N9FMze , & + M30N9MKxe , M30N9MKye , M30N9MKze , M30N9MMxe , M30N9MMye , M30N9MMze , M30N9RAxe , & + M30N9RAye , M30N9RAze , M30N9RDxe , M30N9RDye , M30N9RDze , M30N9TAxe , M30N9TAye , & + M30N9TAze , M30N9TDxss , M30N9TDyss , M30N9TDzss , M31N1FKxe , M31N1FKye , M31N1FKze , & + M31N1FMxe , M31N1FMye , M31N1FMze , M31N1MKxe , M31N1MKye , M31N1MKze , M31N1MMxe , & + M31N1MMye , M31N1MMze , M31N1RAxe , M31N1RAye , M31N1RAze , M31N1RDxe , M31N1RDye , & + M31N1RDze , M31N1TAxe , M31N1TAye , M31N1TAze , M31N1TDxss , M31N1TDyss , M31N1TDzss , & + M31N2FKxe , M31N2FKye , M31N2FKze , M31N2FMxe , M31N2FMye , M31N2FMze , M31N2MKxe , & + M31N2MKye , M31N2MKze , M31N2MMxe , M31N2MMye , M31N2MMze , M31N2RAxe , M31N2RAye , & + M31N2RAze , M31N2RDxe , M31N2RDye , M31N2RDze , M31N2TAxe , M31N2TAye , M31N2TAze , & + M31N2TDxss , M31N2TDyss , M31N2TDzss , M31N3FKxe , M31N3FKye , M31N3FKze , M31N3FMxe /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry5(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M31N3FMye , M31N3FMze , M31N3MKxe , M31N3MKye , M31N3MKze , M31N3MMxe , M31N3MMye , & + M31N3MMze , M31N3RAxe , M31N3RAye , M31N3RAze , M31N3RDxe , M31N3RDye , M31N3RDze , & + M31N3TAxe , M31N3TAye , M31N3TAze , M31N3TDxss , M31N3TDyss , M31N3TDzss , M31N4FKxe , & + M31N4FKye , M31N4FKze , M31N4FMxe , M31N4FMye , M31N4FMze , M31N4MKxe , M31N4MKye , & + M31N4MKze , M31N4MMxe , M31N4MMye , M31N4MMze , M31N4RAxe , M31N4RAye , M31N4RAze , & + M31N4RDxe , M31N4RDye , M31N4RDze , M31N4TAxe , M31N4TAye , M31N4TAze , M31N4TDxss , & + M31N4TDyss , M31N4TDzss , M31N5FKxe , M31N5FKye , M31N5FKze , M31N5FMxe , M31N5FMye , & + M31N5FMze , M31N5MKxe , M31N5MKye , M31N5MKze , M31N5MMxe , M31N5MMye , M31N5MMze , & + M31N5RAxe , M31N5RAye , M31N5RAze , M31N5RDxe , M31N5RDye , M31N5RDze , M31N5TAxe , & + M31N5TAye , M31N5TAze , M31N5TDxss , M31N5TDyss , M31N5TDzss , M31N6FKxe , M31N6FKye , & + M31N6FKze , M31N6FMxe , M31N6FMye , M31N6FMze , M31N6MKxe , M31N6MKye , M31N6MKze , & + M31N6MMxe , M31N6MMye , M31N6MMze , M31N6RAxe , M31N6RAye , M31N6RAze , M31N6RDxe , & + M31N6RDye , M31N6RDze , M31N6TAxe , M31N6TAye , M31N6TAze , M31N6TDxss , M31N6TDyss , & + M31N6TDzss , M31N7FKxe , M31N7FKye , M31N7FKze , M31N7FMxe , M31N7FMye , M31N7FMze , & + M31N7MKxe , M31N7MKye , M31N7MKze , M31N7MMxe , M31N7MMye , M31N7MMze , M31N7RAxe , & + M31N7RAye , M31N7RAze , M31N7RDxe , M31N7RDye , M31N7RDze , M31N7TAxe , M31N7TAye , & + M31N7TAze , M31N7TDxss , M31N7TDyss , M31N7TDzss , M31N8FKxe , M31N8FKye , M31N8FKze , & + M31N8FMxe , M31N8FMye , M31N8FMze , M31N8MKxe , M31N8MKye , M31N8MKze , M31N8MMxe , & + M31N8MMye , M31N8MMze , M31N8RAxe , M31N8RAye , M31N8RAze , M31N8RDxe , M31N8RDye , & + M31N8RDze , M31N8TAxe , M31N8TAye , M31N8TAze , M31N8TDxss , M31N8TDyss , M31N8TDzss , & + M31N9FKxe , M31N9FKye , M31N9FKze , M31N9FMxe , M31N9FMye , M31N9FMze , M31N9MKxe , & + M31N9MKye , M31N9MKze , M31N9MMxe , M31N9MMye , M31N9MMze , M31N9RAxe , M31N9RAye , & + M31N9RAze , M31N9RDxe , M31N9RDye , M31N9RDze , M31N9TAxe , M31N9TAye , M31N9TAze , & + M31N9TDxss , M31N9TDyss , M31N9TDzss , M32N1FKxe , M32N1FKye , M32N1FKze , M32N1FMxe , & + M32N1FMye , M32N1FMze , M32N1MKxe , M32N1MKye , M32N1MKze , M32N1MMxe , M32N1MMye , & + M32N1MMze , M32N1RAxe , M32N1RAye , M32N1RAze , M32N1RDxe , M32N1RDye , M32N1RDze , & + M32N1TAxe , M32N1TAye , M32N1TAze , M32N1TDxss , M32N1TDyss , M32N1TDzss , M32N2FKxe , & + M32N2FKye , M32N2FKze , M32N2FMxe , M32N2FMye , M32N2FMze , M32N2MKxe , M32N2MKye , & + M32N2MKze , M32N2MMxe , M32N2MMye , M32N2MMze , M32N2RAxe , M32N2RAye , M32N2RAze , & + M32N2RDxe , M32N2RDye , M32N2RDze , M32N2TAxe , M32N2TAye , M32N2TAze , M32N2TDxss , & + M32N2TDyss , M32N2TDzss , M32N3FKxe , M32N3FKye , M32N3FKze , M32N3FMxe , M32N3FMye , & + M32N3FMze , M32N3MKxe , M32N3MKye , M32N3MKze , M32N3MMxe , M32N3MMye , M32N3MMze , & + M32N3RAxe , M32N3RAye , M32N3RAze , M32N3RDxe , M32N3RDye , M32N3RDze , M32N3TAxe , & + M32N3TAye , M32N3TAze , M32N3TDxss , M32N3TDyss , M32N3TDzss , M32N4FKxe , M32N4FKye , & + M32N4FKze , M32N4FMxe , M32N4FMye , M32N4FMze , M32N4MKxe , M32N4MKye , M32N4MKze , & + M32N4MMxe , M32N4MMye , M32N4MMze , M32N4RAxe , M32N4RAye , M32N4RAze , M32N4RDxe , & + M32N4RDye , M32N4RDze , M32N4TAxe , M32N4TAye , M32N4TAze , M32N4TDxss , M32N4TDyss , & + M32N4TDzss , M32N5FKxe , M32N5FKye , M32N5FKze , M32N5FMxe , M32N5FMye , M32N5FMze , & + M32N5MKxe , M32N5MKye , M32N5MKze , M32N5MMxe , M32N5MMye , M32N5MMze , M32N5RAxe , & + M32N5RAye , M32N5RAze , M32N5RDxe , M32N5RDye , M32N5RDze , M32N5TAxe , M32N5TAye , & + M32N5TAze , M32N5TDxss , M32N5TDyss , M32N5TDzss , M32N6FKxe , M32N6FKye , M32N6FKze , & + M32N6FMxe , M32N6FMye , M32N6FMze , M32N6MKxe , M32N6MKye , M32N6MKze , M32N6MMxe , & + M32N6MMye , M32N6MMze , M32N6RAxe , M32N6RAye , M32N6RAze , M32N6RDxe , M32N6RDye , & + M32N6RDze , M32N6TAxe , M32N6TAye , M32N6TAze , M32N6TDxss , M32N6TDyss , M32N6TDzss , & + M32N7FKxe , M32N7FKye , M32N7FKze , M32N7FMxe , M32N7FMye , M32N7FMze , M32N7MKxe , & + M32N7MKye , M32N7MKze , M32N7MMxe , M32N7MMye , M32N7MMze , M32N7RAxe , M32N7RAye , & + M32N7RAze , M32N7RDxe , M32N7RDye , M32N7RDze , M32N7TAxe , M32N7TAye , M32N7TAze , & + M32N7TDxss , M32N7TDyss , M32N7TDzss , M32N8FKxe , M32N8FKye , M32N8FKze , M32N8FMxe , & + M32N8FMye , M32N8FMze , M32N8MKxe , M32N8MKye , M32N8MKze , M32N8MMxe , M32N8MMye , & + M32N8MMze , M32N8RAxe , M32N8RAye , M32N8RAze , M32N8RDxe , M32N8RDye , M32N8RDze , & + M32N8TAxe , M32N8TAye , M32N8TAze , M32N8TDxss , M32N8TDyss , M32N8TDzss , M32N9FKxe , & + M32N9FKye , M32N9FKze , M32N9FMxe , M32N9FMye , M32N9FMze , M32N9MKxe , M32N9MKye , & + M32N9MKze , M32N9MMxe , M32N9MMye , M32N9MMze , M32N9RAxe , M32N9RAye , M32N9RAze , & + M32N9RDxe , M32N9RDye , M32N9RDze , M32N9TAxe , M32N9TAye , M32N9TAze , M32N9TDxss , & + M32N9TDyss , M32N9TDzss , M33N1FKxe , M33N1FKye , M33N1FKze , M33N1FMxe , M33N1FMye , & + M33N1FMze , M33N1MKxe , M33N1MKye , M33N1MKze , M33N1MMxe , M33N1MMye , M33N1MMze , & + M33N1RAxe , M33N1RAye , M33N1RAze , M33N1RDxe , M33N1RDye , M33N1RDze , M33N1TAxe , & + M33N1TAye , M33N1TAze , M33N1TDxss , M33N1TDyss , M33N1TDzss , M33N2FKxe , M33N2FKye , & + M33N2FKze , M33N2FMxe , M33N2FMye , M33N2FMze , M33N2MKxe , M33N2MKye , M33N2MKze , & + M33N2MMxe , M33N2MMye , M33N2MMze , M33N2RAxe , M33N2RAye , M33N2RAze , M33N2RDxe , & + M33N2RDye , M33N2RDze , M33N2TAxe , M33N2TAye , M33N2TAze , M33N2TDxss , M33N2TDyss , & + M33N2TDzss , M33N3FKxe , M33N3FKye , M33N3FKze , M33N3FMxe , M33N3FMye , M33N3FMze , & + M33N3MKxe , M33N3MKye , M33N3MKze , M33N3MMxe , M33N3MMye , M33N3MMze , M33N3RAxe , & + M33N3RAye , M33N3RAze , M33N3RDxe , M33N3RDye , M33N3RDze , M33N3TAxe , M33N3TAye , & + M33N3TAze , M33N3TDxss , M33N3TDyss , M33N3TDzss , M33N4FKxe , M33N4FKye , M33N4FKze , & + M33N4FMxe , M33N4FMye , M33N4FMze , M33N4MKxe , M33N4MKye , M33N4MKze , M33N4MMxe , & + M33N4MMye , M33N4MMze , M33N4RAxe , M33N4RAye , M33N4RAze , M33N4RDxe , M33N4RDye , & + M33N4RDze , M33N4TAxe , M33N4TAye , M33N4TAze , M33N4TDxss , M33N4TDyss , M33N4TDzss , & + M33N5FKxe , M33N5FKye , M33N5FKze , M33N5FMxe , M33N5FMye , M33N5FMze , M33N5MKxe , & + M33N5MKye , M33N5MKze , M33N5MMxe , M33N5MMye , M33N5MMze , M33N5RAxe , M33N5RAye , & + M33N5RAze , M33N5RDxe , M33N5RDye , M33N5RDze , M33N5TAxe , M33N5TAye , M33N5TAze , & + M33N5TDxss , M33N5TDyss , M33N5TDzss , M33N6FKxe , M33N6FKye , M33N6FKze , M33N6FMxe , & + M33N6FMye , M33N6FMze , M33N6MKxe , M33N6MKye , M33N6MKze , M33N6MMxe , M33N6MMye , & + M33N6MMze , M33N6RAxe , M33N6RAye , M33N6RAze , M33N6RDxe , M33N6RDye , M33N6RDze , & + M33N6TAxe , M33N6TAye , M33N6TAze , M33N6TDxss , M33N6TDyss , M33N6TDzss , M33N7FKxe , & + M33N7FKye , M33N7FKze , M33N7FMxe , M33N7FMye , M33N7FMze , M33N7MKxe , M33N7MKye , & + M33N7MKze , M33N7MMxe , M33N7MMye , M33N7MMze , M33N7RAxe , M33N7RAye , M33N7RAze , & + M33N7RDxe , M33N7RDye , M33N7RDze , M33N7TAxe , M33N7TAye , M33N7TAze , M33N7TDxss , & + M33N7TDyss , M33N7TDzss , M33N8FKxe , M33N8FKye , M33N8FKze , M33N8FMxe , M33N8FMye , & + M33N8FMze , M33N8MKxe , M33N8MKye , M33N8MKze , M33N8MMxe , M33N8MMye , M33N8MMze , & + M33N8RAxe , M33N8RAye , M33N8RAze , M33N8RDxe , M33N8RDye , M33N8RDze , M33N8TAxe , & + M33N8TAye , M33N8TAze , M33N8TDxss , M33N8TDyss , M33N8TDzss , M33N9FKxe , M33N9FKye , & + M33N9FKze , M33N9FMxe , M33N9FMye , M33N9FMze , M33N9MKxe , M33N9MKye , M33N9MKze , & + M33N9MMxe , M33N9MMye , M33N9MMze , M33N9RAxe , M33N9RAye , M33N9RAze , M33N9RDxe , & + M33N9RDye , M33N9RDze , M33N9TAxe , M33N9TAye , M33N9TAze , M33N9TDxss , M33N9TDyss , & + M33N9TDzss , M34N1FKxe , M34N1FKye , M34N1FKze , M34N1FMxe , M34N1FMye , M34N1FMze , & + M34N1MKxe , M34N1MKye , M34N1MKze , M34N1MMxe , M34N1MMye , M34N1MMze , M34N1RAxe , & + M34N1RAye , M34N1RAze , M34N1RDxe , M34N1RDye , M34N1RDze , M34N1TAxe , M34N1TAye , & + M34N1TAze , M34N1TDxss , M34N1TDyss , M34N1TDzss , M34N2FKxe , M34N2FKye , M34N2FKze , & + M34N2FMxe , M34N2FMye , M34N2FMze , M34N2MKxe , M34N2MKye , M34N2MKze , M34N2MMxe , & + M34N2MMye , M34N2MMze , M34N2RAxe , M34N2RAye , M34N2RAze , M34N2RDxe , M34N2RDye , & + M34N2RDze , M34N2TAxe , M34N2TAye , M34N2TAze , M34N2TDxss , M34N2TDyss , M34N2TDzss , & + M34N3FKxe , M34N3FKye , M34N3FKze , M34N3FMxe , M34N3FMye , M34N3FMze , M34N3MKxe , & + M34N3MKye , M34N3MKze , M34N3MMxe , M34N3MMye , M34N3MMze , M34N3RAxe , M34N3RAye , & + M34N3RAze , M34N3RDxe , M34N3RDye , M34N3RDze , M34N3TAxe , M34N3TAye , M34N3TAze , & + M34N3TDxss , M34N3TDyss , M34N3TDzss , M34N4FKxe , M34N4FKye , M34N4FKze , M34N4FMxe , & + M34N4FMye , M34N4FMze , M34N4MKxe , M34N4MKye , M34N4MKze , M34N4MMxe , M34N4MMye , & + M34N4MMze , M34N4RAxe , M34N4RAye , M34N4RAze , M34N4RDxe , M34N4RDye , M34N4RDze , & + M34N4TAxe , M34N4TAye , M34N4TAze , M34N4TDxss , M34N4TDyss , M34N4TDzss , M34N5FKxe , & + M34N5FKye , M34N5FKze , M34N5FMxe , M34N5FMye , M34N5FMze , M34N5MKxe , M34N5MKye , & + M34N5MKze , M34N5MMxe , M34N5MMye , M34N5MMze , M34N5RAxe , M34N5RAye , M34N5RAze , & + M34N5RDxe , M34N5RDye , M34N5RDze , M34N5TAxe , M34N5TAye , M34N5TAze , M34N5TDxss , & + M34N5TDyss , M34N5TDzss , M34N6FKxe , M34N6FKye , M34N6FKze , M34N6FMxe , M34N6FMye , & + M34N6FMze , M34N6MKxe , M34N6MKye , M34N6MKze , M34N6MMxe , M34N6MMye , M34N6MMze , & + M34N6RAxe , M34N6RAye , M34N6RAze , M34N6RDxe , M34N6RDye , M34N6RDze , M34N6TAxe , & + M34N6TAye , M34N6TAze , M34N6TDxss , M34N6TDyss , M34N6TDzss , M34N7FKxe , M34N7FKye , & + M34N7FKze , M34N7FMxe , M34N7FMye , M34N7FMze , M34N7MKxe , M34N7MKye , M34N7MKze , & + M34N7MMxe , M34N7MMye , M34N7MMze , M34N7RAxe , M34N7RAye , M34N7RAze , M34N7RDxe , & + M34N7RDye , M34N7RDze , M34N7TAxe , M34N7TAye , M34N7TAze , M34N7TDxss , M34N7TDyss , & + M34N7TDzss , M34N8FKxe , M34N8FKye , M34N8FKze , M34N8FMxe , M34N8FMye , M34N8FMze , & + M34N8MKxe , M34N8MKye , M34N8MKze , M34N8MMxe , M34N8MMye , M34N8MMze , M34N8RAxe , & + M34N8RAye , M34N8RAze , M34N8RDxe , M34N8RDye , M34N8RDze , M34N8TAxe , M34N8TAye , & + M34N8TAze , M34N8TDxss , M34N8TDyss , M34N8TDzss , M34N9FKxe , M34N9FKye , M34N9FKze , & + M34N9FMxe , M34N9FMye , M34N9FMze , M34N9MKxe , M34N9MKye , M34N9MKze , M34N9MMxe , & + M34N9MMye , M34N9MMze , M34N9RAxe , M34N9RAye , M34N9RAze , M34N9RDxe , M34N9RDye , & + M34N9RDze , M34N9TAxe , M34N9TAye , M34N9TAze , M34N9TDxss , M34N9TDyss , M34N9TDzss , & + M35N1FKxe , M35N1FKye , M35N1FKze , M35N1FMxe , M35N1FMye , M35N1FMze , M35N1MKxe , & + M35N1MKye , M35N1MKze , M35N1MMxe , M35N1MMye , M35N1MMze , M35N1RAxe , M35N1RAye , & + M35N1RAze , M35N1RDxe , M35N1RDye , M35N1RDze , M35N1TAxe , M35N1TAye , M35N1TAze , & + M35N1TDxss , M35N1TDyss , M35N1TDzss , M35N2FKxe , M35N2FKye , M35N2FKze , M35N2FMxe , & + M35N2FMye , M35N2FMze , M35N2MKxe , M35N2MKye , M35N2MKze , M35N2MMxe , M35N2MMye , & + M35N2MMze , M35N2RAxe , M35N2RAye , M35N2RAze , M35N2RDxe , M35N2RDye , M35N2RDze , & + M35N2TAxe , M35N2TAye , M35N2TAze , M35N2TDxss , M35N2TDyss , M35N2TDzss , M35N3FKxe , & + M35N3FKye , M35N3FKze , M35N3FMxe , M35N3FMye , M35N3FMze , M35N3MKxe , M35N3MKye , & + M35N3MKze , M35N3MMxe , M35N3MMye , M35N3MMze , M35N3RAxe , M35N3RAye , M35N3RAze , & + M35N3RDxe , M35N3RDye , M35N3RDze , M35N3TAxe , M35N3TAye , M35N3TAze , M35N3TDxss , & + M35N3TDyss , M35N3TDzss , M35N4FKxe , M35N4FKye , M35N4FKze , M35N4FMxe , M35N4FMye , & + M35N4FMze , M35N4MKxe , M35N4MKye , M35N4MKze , M35N4MMxe , M35N4MMye , M35N4MMze , & + M35N4RAxe , M35N4RAye , M35N4RAze , M35N4RDxe , M35N4RDye , M35N4RDze , M35N4TAxe , & + M35N4TAye , M35N4TAze , M35N4TDxss , M35N4TDyss , M35N4TDzss , M35N5FKxe , M35N5FKye , & + M35N5FKze , M35N5FMxe , M35N5FMye , M35N5FMze , M35N5MKxe , M35N5MKye , M35N5MKze , & + M35N5MMxe , M35N5MMye , M35N5MMze , M35N5RAxe , M35N5RAye , M35N5RAze , M35N5RDxe , & + M35N5RDye , M35N5RDze , M35N5TAxe , M35N5TAye , M35N5TAze , M35N5TDxss , M35N5TDyss , & + M35N5TDzss , M35N6FKxe , M35N6FKye , M35N6FKze , M35N6FMxe , M35N6FMye , M35N6FMze , & + M35N6MKxe , M35N6MKye , M35N6MKze , M35N6MMxe , M35N6MMye , M35N6MMze , M35N6RAxe , & + M35N6RAye , M35N6RAze , M35N6RDxe , M35N6RDye , M35N6RDze , M35N6TAxe , M35N6TAye , & + M35N6TAze , M35N6TDxss , M35N6TDyss , M35N6TDzss , M35N7FKxe , M35N7FKye , M35N7FKze , & + M35N7FMxe , M35N7FMye , M35N7FMze , M35N7MKxe , M35N7MKye , M35N7MKze , M35N7MMxe , & + M35N7MMye , M35N7MMze , M35N7RAxe , M35N7RAye , M35N7RAze , M35N7RDxe , M35N7RDye , & + M35N7RDze , M35N7TAxe , M35N7TAye , M35N7TAze , M35N7TDxss , M35N7TDyss , M35N7TDzss , & + M35N8FKxe , M35N8FKye , M35N8FKze , M35N8FMxe , M35N8FMye , M35N8FMze , M35N8MKxe , & + M35N8MKye , M35N8MKze , M35N8MMxe , M35N8MMye , M35N8MMze , M35N8RAxe , M35N8RAye , & + M35N8RAze , M35N8RDxe , M35N8RDye , M35N8RDze , M35N8TAxe , M35N8TAye , M35N8TAze , & + M35N8TDxss , M35N8TDyss , M35N8TDzss , M35N9FKxe , M35N9FKye , M35N9FKze , M35N9FMxe , & + M35N9FMye , M35N9FMze , M35N9MKxe , M35N9MKye , M35N9MKze , M35N9MMxe , M35N9MMye , & + M35N9MMze , M35N9RAxe , M35N9RAye , M35N9RAze , M35N9RDxe , M35N9RDye , M35N9RDze , & + M35N9TAxe , M35N9TAye , M35N9TAze , M35N9TDxss , M35N9TDyss , M35N9TDzss , M36N1FKxe , & + M36N1FKye , M36N1FKze , M36N1FMxe , M36N1FMye , M36N1FMze , M36N1MKxe , M36N1MKye , & + M36N1MKze , M36N1MMxe , M36N1MMye , M36N1MMze , M36N1RAxe , M36N1RAye , M36N1RAze , & + M36N1RDxe , M36N1RDye , M36N1RDze , M36N1TAxe , M36N1TAye , M36N1TAze , M36N1TDxss , & + M36N1TDyss , M36N1TDzss , M36N2FKxe , M36N2FKye , M36N2FKze , M36N2FMxe , M36N2FMye , & + M36N2FMze , M36N2MKxe , M36N2MKye , M36N2MKze , M36N2MMxe , M36N2MMye , M36N2MMze , & + M36N2RAxe , M36N2RAye , M36N2RAze , M36N2RDxe , M36N2RDye , M36N2RDze , M36N2TAxe , & + M36N2TAye , M36N2TAze , M36N2TDxss , M36N2TDyss , M36N2TDzss , M36N3FKxe , M36N3FKye , & + M36N3FKze , M36N3FMxe , M36N3FMye , M36N3FMze , M36N3MKxe , M36N3MKye , M36N3MKze , & + M36N3MMxe , M36N3MMye , M36N3MMze , M36N3RAxe , M36N3RAye , M36N3RAze , M36N3RDxe , & + M36N3RDye , M36N3RDze , M36N3TAxe , M36N3TAye , M36N3TAze , M36N3TDxss , M36N3TDyss , & + M36N3TDzss , M36N4FKxe , M36N4FKye , M36N4FKze , M36N4FMxe , M36N4FMye , M36N4FMze , & + M36N4MKxe , M36N4MKye , M36N4MKze , M36N4MMxe , M36N4MMye , M36N4MMze , M36N4RAxe , & + M36N4RAye , M36N4RAze , M36N4RDxe , M36N4RDye , M36N4RDze , M36N4TAxe , M36N4TAye , & + M36N4TAze , M36N4TDxss , M36N4TDyss , M36N4TDzss , M36N5FKxe , M36N5FKye , M36N5FKze , & + M36N5FMxe , M36N5FMye , M36N5FMze , M36N5MKxe , M36N5MKye , M36N5MKze , M36N5MMxe , & + M36N5MMye , M36N5MMze , M36N5RAxe , M36N5RAye , M36N5RAze , M36N5RDxe , M36N5RDye , & + M36N5RDze , M36N5TAxe , M36N5TAye , M36N5TAze , M36N5TDxss , M36N5TDyss , M36N5TDzss , & + M36N6FKxe , M36N6FKye , M36N6FKze , M36N6FMxe , M36N6FMye , M36N6FMze , M36N6MKxe , & + M36N6MKye , M36N6MKze , M36N6MMxe , M36N6MMye , M36N6MMze , M36N6RAxe , M36N6RAye , & + M36N6RAze , M36N6RDxe , M36N6RDye , M36N6RDze , M36N6TAxe , M36N6TAye , M36N6TAze , & + M36N6TDxss , M36N6TDyss , M36N6TDzss , M36N7FKxe , M36N7FKye , M36N7FKze , M36N7FMxe , & + M36N7FMye , M36N7FMze , M36N7MKxe , M36N7MKye , M36N7MKze , M36N7MMxe , M36N7MMye , & + M36N7MMze , M36N7RAxe , M36N7RAye , M36N7RAze , M36N7RDxe , M36N7RDye , M36N7RDze , & + M36N7TAxe , M36N7TAye , M36N7TAze , M36N7TDxss , M36N7TDyss , M36N7TDzss , M36N8FKxe , & + M36N8FKye , M36N8FKze , M36N8FMxe , M36N8FMye , M36N8FMze , M36N8MKxe , M36N8MKye , & + M36N8MKze , M36N8MMxe , M36N8MMye , M36N8MMze , M36N8RAxe , M36N8RAye , M36N8RAze , & + M36N8RDxe , M36N8RDye , M36N8RDze , M36N8TAxe , M36N8TAye , M36N8TAze , M36N8TDxss , & + M36N8TDyss , M36N8TDzss , M36N9FKxe , M36N9FKye , M36N9FKze , M36N9FMxe , M36N9FMye , & + M36N9FMze , M36N9MKxe , M36N9MKye , M36N9MKze , M36N9MMxe , M36N9MMye , M36N9MMze , & + M36N9RAxe , M36N9RAye , M36N9RAze , M36N9RDxe , M36N9RDye , M36N9RDze , M36N9TAxe , & + M36N9TAye , M36N9TAze , M36N9TDxss , M36N9TDyss , M36N9TDzss , M37N1FKxe , M37N1FKye , & + M37N1FKze , M37N1FMxe , M37N1FMye , M37N1FMze , M37N1MKxe , M37N1MKye , M37N1MKze , & + M37N1MMxe , M37N1MMye , M37N1MMze , M37N1RAxe , M37N1RAye , M37N1RAze , M37N1RDxe , & + M37N1RDye , M37N1RDze , M37N1TAxe , M37N1TAye , M37N1TAze , M37N1TDxss , M37N1TDyss , & + M37N1TDzss , M37N2FKxe , M37N2FKye , M37N2FKze , M37N2FMxe , M37N2FMye , M37N2FMze , & + M37N2MKxe , M37N2MKye , M37N2MKze , M37N2MMxe , M37N2MMye , M37N2MMze , M37N2RAxe , & + M37N2RAye , M37N2RAze , M37N2RDxe , M37N2RDye , M37N2RDze , M37N2TAxe , M37N2TAye , & + M37N2TAze , M37N2TDxss , M37N2TDyss , M37N2TDzss , M37N3FKxe , M37N3FKye , M37N3FKze , & + M37N3FMxe , M37N3FMye , M37N3FMze , M37N3MKxe , M37N3MKye , M37N3MKze , M37N3MMxe , & + M37N3MMye , M37N3MMze , M37N3RAxe , M37N3RAye , M37N3RAze , M37N3RDxe , M37N3RDye , & + M37N3RDze , M37N3TAxe , M37N3TAye , M37N3TAze , M37N3TDxss , M37N3TDyss , M37N3TDzss , & + M37N4FKxe , M37N4FKye , M37N4FKze , M37N4FMxe , M37N4FMye , M37N4FMze , M37N4MKxe , & + M37N4MKye , M37N4MKze , M37N4MMxe , M37N4MMye , M37N4MMze , M37N4RAxe , M37N4RAye , & + M37N4RAze , M37N4RDxe , M37N4RDye , M37N4RDze , M37N4TAxe , M37N4TAye , M37N4TAze , & + M37N4TDxss , M37N4TDyss , M37N4TDzss , M37N5FKxe , M37N5FKye , M37N5FKze , M37N5FMxe , & + M37N5FMye , M37N5FMze , M37N5MKxe , M37N5MKye , M37N5MKze , M37N5MMxe , M37N5MMye , & + M37N5MMze , M37N5RAxe , M37N5RAye , M37N5RAze , M37N5RDxe , M37N5RDye , M37N5RDze , & + M37N5TAxe , M37N5TAye , M37N5TAze , M37N5TDxss , M37N5TDyss , M37N5TDzss , M37N6FKxe , & + M37N6FKye , M37N6FKze , M37N6FMxe , M37N6FMye , M37N6FMze , M37N6MKxe , M37N6MKye , & + M37N6MKze , M37N6MMxe , M37N6MMye , M37N6MMze , M37N6RAxe , M37N6RAye , M37N6RAze , & + M37N6RDxe , M37N6RDye , M37N6RDze , M37N6TAxe , M37N6TAye , M37N6TAze , M37N6TDxss , & + M37N6TDyss , M37N6TDzss , M37N7FKxe , M37N7FKye , M37N7FKze , M37N7FMxe , M37N7FMye , & + M37N7FMze , M37N7MKxe , M37N7MKye , M37N7MKze , M37N7MMxe , M37N7MMye , M37N7MMze , & + M37N7RAxe , M37N7RAye , M37N7RAze , M37N7RDxe , M37N7RDye , M37N7RDze , M37N7TAxe , & + M37N7TAye , M37N7TAze , M37N7TDxss , M37N7TDyss , M37N7TDzss , M37N8FKxe , M37N8FKye , & + M37N8FKze , M37N8FMxe , M37N8FMye , M37N8FMze , M37N8MKxe , M37N8MKye , M37N8MKze , & + M37N8MMxe , M37N8MMye , M37N8MMze , M37N8RAxe , M37N8RAye , M37N8RAze , M37N8RDxe , & + M37N8RDye , M37N8RDze , M37N8TAxe , M37N8TAye , M37N8TAze , M37N8TDxss , M37N8TDyss , & + M37N8TDzss , M37N9FKxe , M37N9FKye , M37N9FKze , M37N9FMxe , M37N9FMye , M37N9FMze , & + M37N9MKxe , M37N9MKye , M37N9MKze , M37N9MMxe , M37N9MMye , M37N9MMze , M37N9RAxe , & + M37N9RAye , M37N9RAze , M37N9RDxe , M37N9RDye , M37N9RDze , M37N9TAxe , M37N9TAye , & + M37N9TAze , M37N9TDxss , M37N9TDyss , M37N9TDzss , M38N1FKxe , M38N1FKye , M38N1FKze , & + M38N1FMxe , M38N1FMye , M38N1FMze , M38N1MKxe , M38N1MKye , M38N1MKze , M38N1MMxe , & + M38N1MMye , M38N1MMze , M38N1RAxe , M38N1RAye , M38N1RAze , M38N1RDxe , M38N1RDye , & + M38N1RDze , M38N1TAxe , M38N1TAye , M38N1TAze , M38N1TDxss , M38N1TDyss , M38N1TDzss , & + M38N2FKxe , M38N2FKye , M38N2FKze , M38N2FMxe , M38N2FMye , M38N2FMze , M38N2MKxe , & + M38N2MKye , M38N2MKze , M38N2MMxe , M38N2MMye , M38N2MMze , M38N2RAxe , M38N2RAye , & + M38N2RAze , M38N2RDxe , M38N2RDye , M38N2RDze , M38N2TAxe , M38N2TAye , M38N2TAze , & + M38N2TDxss , M38N2TDyss , M38N2TDzss , M38N3FKxe , M38N3FKye , M38N3FKze , M38N3FMxe , & + M38N3FMye , M38N3FMze , M38N3MKxe , M38N3MKye , M38N3MKze , M38N3MMxe , M38N3MMye , & + M38N3MMze , M38N3RAxe , M38N3RAye , M38N3RAze , M38N3RDxe , M38N3RDye , M38N3RDze , & + M38N3TAxe , M38N3TAye , M38N3TAze , M38N3TDxss , M38N3TDyss , M38N3TDzss , M38N4FKxe , & + M38N4FKye , M38N4FKze , M38N4FMxe , M38N4FMye , M38N4FMze , M38N4MKxe , M38N4MKye , & + M38N4MKze , M38N4MMxe , M38N4MMye , M38N4MMze , M38N4RAxe , M38N4RAye , M38N4RAze , & + M38N4RDxe , M38N4RDye , M38N4RDze , M38N4TAxe , M38N4TAye , M38N4TAze , M38N4TDxss , & + M38N4TDyss , M38N4TDzss , M38N5FKxe , M38N5FKye , M38N5FKze , M38N5FMxe , M38N5FMye , & + M38N5FMze , M38N5MKxe , M38N5MKye , M38N5MKze , M38N5MMxe , M38N5MMye , M38N5MMze , & + M38N5RAxe , M38N5RAye , M38N5RAze , M38N5RDxe , M38N5RDye , M38N5RDze , M38N5TAxe , & + M38N5TAye , M38N5TAze , M38N5TDxss , M38N5TDyss , M38N5TDzss , M38N6FKxe , M38N6FKye , & + M38N6FKze , M38N6FMxe , M38N6FMye , M38N6FMze , M38N6MKxe , M38N6MKye , M38N6MKze , & + M38N6MMxe , M38N6MMye , M38N6MMze , M38N6RAxe , M38N6RAye , M38N6RAze , M38N6RDxe , & + M38N6RDye , M38N6RDze , M38N6TAxe , M38N6TAye , M38N6TAze , M38N6TDxss , M38N6TDyss , & + M38N6TDzss , M38N7FKxe , M38N7FKye , M38N7FKze , M38N7FMxe , M38N7FMye , M38N7FMze , & + M38N7MKxe , M38N7MKye , M38N7MKze , M38N7MMxe , M38N7MMye , M38N7MMze , M38N7RAxe , & + M38N7RAye , M38N7RAze , M38N7RDxe , M38N7RDye , M38N7RDze , M38N7TAxe , M38N7TAye , & + M38N7TAze , M38N7TDxss , M38N7TDyss , M38N7TDzss , M38N8FKxe , M38N8FKye , M38N8FKze , & + M38N8FMxe , M38N8FMye , M38N8FMze , M38N8MKxe , M38N8MKye , M38N8MKze , M38N8MMxe , & + M38N8MMye , M38N8MMze , M38N8RAxe , M38N8RAye , M38N8RAze , M38N8RDxe , M38N8RDye , & + M38N8RDze , M38N8TAxe , M38N8TAye , M38N8TAze , M38N8TDxss , M38N8TDyss , M38N8TDzss , & + M38N9FKxe , M38N9FKye , M38N9FKze , M38N9FMxe , M38N9FMye , M38N9FMze , M38N9MKxe , & + M38N9MKye , M38N9MKze , M38N9MMxe , M38N9MMye , M38N9MMze , M38N9RAxe , M38N9RAye , & + M38N9RAze , M38N9RDxe , M38N9RDye , M38N9RDze , M38N9TAxe , M38N9TAye , M38N9TAze , & + M38N9TDxss , M38N9TDyss , M38N9TDzss , M39N1FKxe , M39N1FKye , M39N1FKze , M39N1FMxe , & + M39N1FMye , M39N1FMze , M39N1MKxe , M39N1MKye , M39N1MKze , M39N1MMxe , M39N1MMye /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry6(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M39N1MMze , M39N1RAxe , M39N1RAye , M39N1RAze , M39N1RDxe , M39N1RDye , M39N1RDze , & + M39N1TAxe , M39N1TAye , M39N1TAze , M39N1TDxss , M39N1TDyss , M39N1TDzss , M39N2FKxe , & + M39N2FKye , M39N2FKze , M39N2FMxe , M39N2FMye , M39N2FMze , M39N2MKxe , M39N2MKye , & + M39N2MKze , M39N2MMxe , M39N2MMye , M39N2MMze , M39N2RAxe , M39N2RAye , M39N2RAze , & + M39N2RDxe , M39N2RDye , M39N2RDze , M39N2TAxe , M39N2TAye , M39N2TAze , M39N2TDxss , & + M39N2TDyss , M39N2TDzss , M39N3FKxe , M39N3FKye , M39N3FKze , M39N3FMxe , M39N3FMye , & + M39N3FMze , M39N3MKxe , M39N3MKye , M39N3MKze , M39N3MMxe , M39N3MMye , M39N3MMze , & + M39N3RAxe , M39N3RAye , M39N3RAze , M39N3RDxe , M39N3RDye , M39N3RDze , M39N3TAxe , & + M39N3TAye , M39N3TAze , M39N3TDxss , M39N3TDyss , M39N3TDzss , M39N4FKxe , M39N4FKye , & + M39N4FKze , M39N4FMxe , M39N4FMye , M39N4FMze , M39N4MKxe , M39N4MKye , M39N4MKze , & + M39N4MMxe , M39N4MMye , M39N4MMze , M39N4RAxe , M39N4RAye , M39N4RAze , M39N4RDxe , & + M39N4RDye , M39N4RDze , M39N4TAxe , M39N4TAye , M39N4TAze , M39N4TDxss , M39N4TDyss , & + M39N4TDzss , M39N5FKxe , M39N5FKye , M39N5FKze , M39N5FMxe , M39N5FMye , M39N5FMze , & + M39N5MKxe , M39N5MKye , M39N5MKze , M39N5MMxe , M39N5MMye , M39N5MMze , M39N5RAxe , & + M39N5RAye , M39N5RAze , M39N5RDxe , M39N5RDye , M39N5RDze , M39N5TAxe , M39N5TAye , & + M39N5TAze , M39N5TDxss , M39N5TDyss , M39N5TDzss , M39N6FKxe , M39N6FKye , M39N6FKze , & + M39N6FMxe , M39N6FMye , M39N6FMze , M39N6MKxe , M39N6MKye , M39N6MKze , M39N6MMxe , & + M39N6MMye , M39N6MMze , M39N6RAxe , M39N6RAye , M39N6RAze , M39N6RDxe , M39N6RDye , & + M39N6RDze , M39N6TAxe , M39N6TAye , M39N6TAze , M39N6TDxss , M39N6TDyss , M39N6TDzss , & + M39N7FKxe , M39N7FKye , M39N7FKze , M39N7FMxe , M39N7FMye , M39N7FMze , M39N7MKxe , & + M39N7MKye , M39N7MKze , M39N7MMxe , M39N7MMye , M39N7MMze , M39N7RAxe , M39N7RAye , & + M39N7RAze , M39N7RDxe , M39N7RDye , M39N7RDze , M39N7TAxe , M39N7TAye , M39N7TAze , & + M39N7TDxss , M39N7TDyss , M39N7TDzss , M39N8FKxe , M39N8FKye , M39N8FKze , M39N8FMxe , & + M39N8FMye , M39N8FMze , M39N8MKxe , M39N8MKye , M39N8MKze , M39N8MMxe , M39N8MMye , & + M39N8MMze , M39N8RAxe , M39N8RAye , M39N8RAze , M39N8RDxe , M39N8RDye , M39N8RDze , & + M39N8TAxe , M39N8TAye , M39N8TAze , M39N8TDxss , M39N8TDyss , M39N8TDzss , M39N9FKxe , & + M39N9FKye , M39N9FKze , M39N9FMxe , M39N9FMye , M39N9FMze , M39N9MKxe , M39N9MKye , & + M39N9MKze , M39N9MMxe , M39N9MMye , M39N9MMze , M39N9RAxe , M39N9RAye , M39N9RAze , & + M39N9RDxe , M39N9RDye , M39N9RDze , M39N9TAxe , M39N9TAye , M39N9TAze , M39N9TDxss , & + M39N9TDyss , M39N9TDzss , M40N1FKxe , M40N1FKye , M40N1FKze , M40N1FMxe , M40N1FMye , & + M40N1FMze , M40N1MKxe , M40N1MKye , M40N1MKze , M40N1MMxe , M40N1MMye , M40N1MMze , & + M40N1RAxe , M40N1RAye , M40N1RAze , M40N1RDxe , M40N1RDye , M40N1RDze , M40N1TAxe , & + M40N1TAye , M40N1TAze , M40N1TDxss , M40N1TDyss , M40N1TDzss , M40N2FKxe , M40N2FKye , & + M40N2FKze , M40N2FMxe , M40N2FMye , M40N2FMze , M40N2MKxe , M40N2MKye , M40N2MKze , & + M40N2MMxe , M40N2MMye , M40N2MMze , M40N2RAxe , M40N2RAye , M40N2RAze , M40N2RDxe , & + M40N2RDye , M40N2RDze , M40N2TAxe , M40N2TAye , M40N2TAze , M40N2TDxss , M40N2TDyss , & + M40N2TDzss , M40N3FKxe , M40N3FKye , M40N3FKze , M40N3FMxe , M40N3FMye , M40N3FMze , & + M40N3MKxe , M40N3MKye , M40N3MKze , M40N3MMxe , M40N3MMye , M40N3MMze , M40N3RAxe , & + M40N3RAye , M40N3RAze , M40N3RDxe , M40N3RDye , M40N3RDze , M40N3TAxe , M40N3TAye , & + M40N3TAze , M40N3TDxss , M40N3TDyss , M40N3TDzss , M40N4FKxe , M40N4FKye , M40N4FKze , & + M40N4FMxe , M40N4FMye , M40N4FMze , M40N4MKxe , M40N4MKye , M40N4MKze , M40N4MMxe , & + M40N4MMye , M40N4MMze , M40N4RAxe , M40N4RAye , M40N4RAze , M40N4RDxe , M40N4RDye , & + M40N4RDze , M40N4TAxe , M40N4TAye , M40N4TAze , M40N4TDxss , M40N4TDyss , M40N4TDzss , & + M40N5FKxe , M40N5FKye , M40N5FKze , M40N5FMxe , M40N5FMye , M40N5FMze , M40N5MKxe , & + M40N5MKye , M40N5MKze , M40N5MMxe , M40N5MMye , M40N5MMze , M40N5RAxe , M40N5RAye , & + M40N5RAze , M40N5RDxe , M40N5RDye , M40N5RDze , M40N5TAxe , M40N5TAye , M40N5TAze , & + M40N5TDxss , M40N5TDyss , M40N5TDzss , M40N6FKxe , M40N6FKye , M40N6FKze , M40N6FMxe , & + M40N6FMye , M40N6FMze , M40N6MKxe , M40N6MKye , M40N6MKze , M40N6MMxe , M40N6MMye , & + M40N6MMze , M40N6RAxe , M40N6RAye , M40N6RAze , M40N6RDxe , M40N6RDye , M40N6RDze , & + M40N6TAxe , M40N6TAye , M40N6TAze , M40N6TDxss , M40N6TDyss , M40N6TDzss , M40N7FKxe , & + M40N7FKye , M40N7FKze , M40N7FMxe , M40N7FMye , M40N7FMze , M40N7MKxe , M40N7MKye , & + M40N7MKze , M40N7MMxe , M40N7MMye , M40N7MMze , M40N7RAxe , M40N7RAye , M40N7RAze , & + M40N7RDxe , M40N7RDye , M40N7RDze , M40N7TAxe , M40N7TAye , M40N7TAze , M40N7TDxss , & + M40N7TDyss , M40N7TDzss , M40N8FKxe , M40N8FKye , M40N8FKze , M40N8FMxe , M40N8FMye , & + M40N8FMze , M40N8MKxe , M40N8MKye , M40N8MKze , M40N8MMxe , M40N8MMye , M40N8MMze , & + M40N8RAxe , M40N8RAye , M40N8RAze , M40N8RDxe , M40N8RDye , M40N8RDze , M40N8TAxe , & + M40N8TAye , M40N8TAze , M40N8TDxss , M40N8TDyss , M40N8TDzss , M40N9FKxe , M40N9FKye , & + M40N9FKze , M40N9FMxe , M40N9FMye , M40N9FMze , M40N9MKxe , M40N9MKye , M40N9MKze , & + M40N9MMxe , M40N9MMye , M40N9MMze , M40N9RAxe , M40N9RAye , M40N9RAze , M40N9RDxe , & + M40N9RDye , M40N9RDze , M40N9TAxe , M40N9TAye , M40N9TAze , M40N9TDxss , M40N9TDyss , & + M40N9TDzss , M41N1FKxe , M41N1FKye , M41N1FKze , M41N1FMxe , M41N1FMye , M41N1FMze , & + M41N1MKxe , M41N1MKye , M41N1MKze , M41N1MMxe , M41N1MMye , M41N1MMze , M41N1RAxe , & + M41N1RAye , M41N1RAze , M41N1RDxe , M41N1RDye , M41N1RDze , M41N1TAxe , M41N1TAye , & + M41N1TAze , M41N1TDxss , M41N1TDyss , M41N1TDzss , M41N2FKxe , M41N2FKye , M41N2FKze , & + M41N2FMxe , M41N2FMye , M41N2FMze , M41N2MKxe , M41N2MKye , M41N2MKze , M41N2MMxe , & + M41N2MMye , M41N2MMze , M41N2RAxe , M41N2RAye , M41N2RAze , M41N2RDxe , M41N2RDye , & + M41N2RDze , M41N2TAxe , M41N2TAye , M41N2TAze , M41N2TDxss , M41N2TDyss , M41N2TDzss , & + M41N3FKxe , M41N3FKye , M41N3FKze , M41N3FMxe , M41N3FMye , M41N3FMze , M41N3MKxe , & + M41N3MKye , M41N3MKze , M41N3MMxe , M41N3MMye , M41N3MMze , M41N3RAxe , M41N3RAye , & + M41N3RAze , M41N3RDxe , M41N3RDye , M41N3RDze , M41N3TAxe , M41N3TAye , M41N3TAze , & + M41N3TDxss , M41N3TDyss , M41N3TDzss , M41N4FKxe , M41N4FKye , M41N4FKze , M41N4FMxe , & + M41N4FMye , M41N4FMze , M41N4MKxe , M41N4MKye , M41N4MKze , M41N4MMxe , M41N4MMye , & + M41N4MMze , M41N4RAxe , M41N4RAye , M41N4RAze , M41N4RDxe , M41N4RDye , M41N4RDze , & + M41N4TAxe , M41N4TAye , M41N4TAze , M41N4TDxss , M41N4TDyss , M41N4TDzss , M41N5FKxe , & + M41N5FKye , M41N5FKze , M41N5FMxe , M41N5FMye , M41N5FMze , M41N5MKxe , M41N5MKye , & + M41N5MKze , M41N5MMxe , M41N5MMye , M41N5MMze , M41N5RAxe , M41N5RAye , M41N5RAze , & + M41N5RDxe , M41N5RDye , M41N5RDze , M41N5TAxe , M41N5TAye , M41N5TAze , M41N5TDxss , & + M41N5TDyss , M41N5TDzss , M41N6FKxe , M41N6FKye , M41N6FKze , M41N6FMxe , M41N6FMye , & + M41N6FMze , M41N6MKxe , M41N6MKye , M41N6MKze , M41N6MMxe , M41N6MMye , M41N6MMze , & + M41N6RAxe , M41N6RAye , M41N6RAze , M41N6RDxe , M41N6RDye , M41N6RDze , M41N6TAxe , & + M41N6TAye , M41N6TAze , M41N6TDxss , M41N6TDyss , M41N6TDzss , M41N7FKxe , M41N7FKye , & + M41N7FKze , M41N7FMxe , M41N7FMye , M41N7FMze , M41N7MKxe , M41N7MKye , M41N7MKze , & + M41N7MMxe , M41N7MMye , M41N7MMze , M41N7RAxe , M41N7RAye , M41N7RAze , M41N7RDxe , & + M41N7RDye , M41N7RDze , M41N7TAxe , M41N7TAye , M41N7TAze , M41N7TDxss , M41N7TDyss , & + M41N7TDzss , M41N8FKxe , M41N8FKye , M41N8FKze , M41N8FMxe , M41N8FMye , M41N8FMze , & + M41N8MKxe , M41N8MKye , M41N8MKze , M41N8MMxe , M41N8MMye , M41N8MMze , M41N8RAxe , & + M41N8RAye , M41N8RAze , M41N8RDxe , M41N8RDye , M41N8RDze , M41N8TAxe , M41N8TAye , & + M41N8TAze , M41N8TDxss , M41N8TDyss , M41N8TDzss , M41N9FKxe , M41N9FKye , M41N9FKze , & + M41N9FMxe , M41N9FMye , M41N9FMze , M41N9MKxe , M41N9MKye , M41N9MKze , M41N9MMxe , & + M41N9MMye , M41N9MMze , M41N9RAxe , M41N9RAye , M41N9RAze , M41N9RDxe , M41N9RDye , & + M41N9RDze , M41N9TAxe , M41N9TAye , M41N9TAze , M41N9TDxss , M41N9TDyss , M41N9TDzss , & + M42N1FKxe , M42N1FKye , M42N1FKze , M42N1FMxe , M42N1FMye , M42N1FMze , M42N1MKxe , & + M42N1MKye , M42N1MKze , M42N1MMxe , M42N1MMye , M42N1MMze , M42N1RAxe , M42N1RAye , & + M42N1RAze , M42N1RDxe , M42N1RDye , M42N1RDze , M42N1TAxe , M42N1TAye , M42N1TAze , & + M42N1TDxss , M42N1TDyss , M42N1TDzss , M42N2FKxe , M42N2FKye , M42N2FKze , M42N2FMxe , & + M42N2FMye , M42N2FMze , M42N2MKxe , M42N2MKye , M42N2MKze , M42N2MMxe , M42N2MMye , & + M42N2MMze , M42N2RAxe , M42N2RAye , M42N2RAze , M42N2RDxe , M42N2RDye , M42N2RDze , & + M42N2TAxe , M42N2TAye , M42N2TAze , M42N2TDxss , M42N2TDyss , M42N2TDzss , M42N3FKxe , & + M42N3FKye , M42N3FKze , M42N3FMxe , M42N3FMye , M42N3FMze , M42N3MKxe , M42N3MKye , & + M42N3MKze , M42N3MMxe , M42N3MMye , M42N3MMze , M42N3RAxe , M42N3RAye , M42N3RAze , & + M42N3RDxe , M42N3RDye , M42N3RDze , M42N3TAxe , M42N3TAye , M42N3TAze , M42N3TDxss , & + M42N3TDyss , M42N3TDzss , M42N4FKxe , M42N4FKye , M42N4FKze , M42N4FMxe , M42N4FMye , & + M42N4FMze , M42N4MKxe , M42N4MKye , M42N4MKze , M42N4MMxe , M42N4MMye , M42N4MMze , & + M42N4RAxe , M42N4RAye , M42N4RAze , M42N4RDxe , M42N4RDye , M42N4RDze , M42N4TAxe , & + M42N4TAye , M42N4TAze , M42N4TDxss , M42N4TDyss , M42N4TDzss , M42N5FKxe , M42N5FKye , & + M42N5FKze , M42N5FMxe , M42N5FMye , M42N5FMze , M42N5MKxe , M42N5MKye , M42N5MKze , & + M42N5MMxe , M42N5MMye , M42N5MMze , M42N5RAxe , M42N5RAye , M42N5RAze , M42N5RDxe , & + M42N5RDye , M42N5RDze , M42N5TAxe , M42N5TAye , M42N5TAze , M42N5TDxss , M42N5TDyss , & + M42N5TDzss , M42N6FKxe , M42N6FKye , M42N6FKze , M42N6FMxe , M42N6FMye , M42N6FMze , & + M42N6MKxe , M42N6MKye , M42N6MKze , M42N6MMxe , M42N6MMye , M42N6MMze , M42N6RAxe , & + M42N6RAye , M42N6RAze , M42N6RDxe , M42N6RDye , M42N6RDze , M42N6TAxe , M42N6TAye , & + M42N6TAze , M42N6TDxss , M42N6TDyss , M42N6TDzss , M42N7FKxe , M42N7FKye , M42N7FKze , & + M42N7FMxe , M42N7FMye , M42N7FMze , M42N7MKxe , M42N7MKye , M42N7MKze , M42N7MMxe , & + M42N7MMye , M42N7MMze , M42N7RAxe , M42N7RAye , M42N7RAze , M42N7RDxe , M42N7RDye , & + M42N7RDze , M42N7TAxe , M42N7TAye , M42N7TAze , M42N7TDxss , M42N7TDyss , M42N7TDzss , & + M42N8FKxe , M42N8FKye , M42N8FKze , M42N8FMxe , M42N8FMye , M42N8FMze , M42N8MKxe , & + M42N8MKye , M42N8MKze , M42N8MMxe , M42N8MMye , M42N8MMze , M42N8RAxe , M42N8RAye , & + M42N8RAze , M42N8RDxe , M42N8RDye , M42N8RDze , M42N8TAxe , M42N8TAye , M42N8TAze , & + M42N8TDxss , M42N8TDyss , M42N8TDzss , M42N9FKxe , M42N9FKye , M42N9FKze , M42N9FMxe , & + M42N9FMye , M42N9FMze , M42N9MKxe , M42N9MKye , M42N9MKze , M42N9MMxe , M42N9MMye , & + M42N9MMze , M42N9RAxe , M42N9RAye , M42N9RAze , M42N9RDxe , M42N9RDye , M42N9RDze , & + M42N9TAxe , M42N9TAye , M42N9TAze , M42N9TDxss , M42N9TDyss , M42N9TDzss , M43N1FKxe , & + M43N1FKye , M43N1FKze , M43N1FMxe , M43N1FMye , M43N1FMze , M43N1MKxe , M43N1MKye , & + M43N1MKze , M43N1MMxe , M43N1MMye , M43N1MMze , M43N1RAxe , M43N1RAye , M43N1RAze , & + M43N1RDxe , M43N1RDye , M43N1RDze , M43N1TAxe , M43N1TAye , M43N1TAze , M43N1TDxss , & + M43N1TDyss , M43N1TDzss , M43N2FKxe , M43N2FKye , M43N2FKze , M43N2FMxe , M43N2FMye , & + M43N2FMze , M43N2MKxe , M43N2MKye , M43N2MKze , M43N2MMxe , M43N2MMye , M43N2MMze , & + M43N2RAxe , M43N2RAye , M43N2RAze , M43N2RDxe , M43N2RDye , M43N2RDze , M43N2TAxe , & + M43N2TAye , M43N2TAze , M43N2TDxss , M43N2TDyss , M43N2TDzss , M43N3FKxe , M43N3FKye , & + M43N3FKze , M43N3FMxe , M43N3FMye , M43N3FMze , M43N3MKxe , M43N3MKye , M43N3MKze , & + M43N3MMxe , M43N3MMye , M43N3MMze , M43N3RAxe , M43N3RAye , M43N3RAze , M43N3RDxe , & + M43N3RDye , M43N3RDze , M43N3TAxe , M43N3TAye , M43N3TAze , M43N3TDxss , M43N3TDyss , & + M43N3TDzss , M43N4FKxe , M43N4FKye , M43N4FKze , M43N4FMxe , M43N4FMye , M43N4FMze , & + M43N4MKxe , M43N4MKye , M43N4MKze , M43N4MMxe , M43N4MMye , M43N4MMze , M43N4RAxe , & + M43N4RAye , M43N4RAze , M43N4RDxe , M43N4RDye , M43N4RDze , M43N4TAxe , M43N4TAye , & + M43N4TAze , M43N4TDxss , M43N4TDyss , M43N4TDzss , M43N5FKxe , M43N5FKye , M43N5FKze , & + M43N5FMxe , M43N5FMye , M43N5FMze , M43N5MKxe , M43N5MKye , M43N5MKze , M43N5MMxe , & + M43N5MMye , M43N5MMze , M43N5RAxe , M43N5RAye , M43N5RAze , M43N5RDxe , M43N5RDye , & + M43N5RDze , M43N5TAxe , M43N5TAye , M43N5TAze , M43N5TDxss , M43N5TDyss , M43N5TDzss , & + M43N6FKxe , M43N6FKye , M43N6FKze , M43N6FMxe , M43N6FMye , M43N6FMze , M43N6MKxe , & + M43N6MKye , M43N6MKze , M43N6MMxe , M43N6MMye , M43N6MMze , M43N6RAxe , M43N6RAye , & + M43N6RAze , M43N6RDxe , M43N6RDye , M43N6RDze , M43N6TAxe , M43N6TAye , M43N6TAze , & + M43N6TDxss , M43N6TDyss , M43N6TDzss , M43N7FKxe , M43N7FKye , M43N7FKze , M43N7FMxe , & + M43N7FMye , M43N7FMze , M43N7MKxe , M43N7MKye , M43N7MKze , M43N7MMxe , M43N7MMye , & + M43N7MMze , M43N7RAxe , M43N7RAye , M43N7RAze , M43N7RDxe , M43N7RDye , M43N7RDze , & + M43N7TAxe , M43N7TAye , M43N7TAze , M43N7TDxss , M43N7TDyss , M43N7TDzss , M43N8FKxe , & + M43N8FKye , M43N8FKze , M43N8FMxe , M43N8FMye , M43N8FMze , M43N8MKxe , M43N8MKye , & + M43N8MKze , M43N8MMxe , M43N8MMye , M43N8MMze , M43N8RAxe , M43N8RAye , M43N8RAze , & + M43N8RDxe , M43N8RDye , M43N8RDze , M43N8TAxe , M43N8TAye , M43N8TAze , M43N8TDxss , & + M43N8TDyss , M43N8TDzss , M43N9FKxe , M43N9FKye , M43N9FKze , M43N9FMxe , M43N9FMye , & + M43N9FMze , M43N9MKxe , M43N9MKye , M43N9MKze , M43N9MMxe , M43N9MMye , M43N9MMze , & + M43N9RAxe , M43N9RAye , M43N9RAze , M43N9RDxe , M43N9RDye , M43N9RDze , M43N9TAxe , & + M43N9TAye , M43N9TAze , M43N9TDxss , M43N9TDyss , M43N9TDzss , M44N1FKxe , M44N1FKye , & + M44N1FKze , M44N1FMxe , M44N1FMye , M44N1FMze , M44N1MKxe , M44N1MKye , M44N1MKze , & + M44N1MMxe , M44N1MMye , M44N1MMze , M44N1RAxe , M44N1RAye , M44N1RAze , M44N1RDxe , & + M44N1RDye , M44N1RDze , M44N1TAxe , M44N1TAye , M44N1TAze , M44N1TDxss , M44N1TDyss , & + M44N1TDzss , M44N2FKxe , M44N2FKye , M44N2FKze , M44N2FMxe , M44N2FMye , M44N2FMze , & + M44N2MKxe , M44N2MKye , M44N2MKze , M44N2MMxe , M44N2MMye , M44N2MMze , M44N2RAxe , & + M44N2RAye , M44N2RAze , M44N2RDxe , M44N2RDye , M44N2RDze , M44N2TAxe , M44N2TAye , & + M44N2TAze , M44N2TDxss , M44N2TDyss , M44N2TDzss , M44N3FKxe , M44N3FKye , M44N3FKze , & + M44N3FMxe , M44N3FMye , M44N3FMze , M44N3MKxe , M44N3MKye , M44N3MKze , M44N3MMxe , & + M44N3MMye , M44N3MMze , M44N3RAxe , M44N3RAye , M44N3RAze , M44N3RDxe , M44N3RDye , & + M44N3RDze , M44N3TAxe , M44N3TAye , M44N3TAze , M44N3TDxss , M44N3TDyss , M44N3TDzss , & + M44N4FKxe , M44N4FKye , M44N4FKze , M44N4FMxe , M44N4FMye , M44N4FMze , M44N4MKxe , & + M44N4MKye , M44N4MKze , M44N4MMxe , M44N4MMye , M44N4MMze , M44N4RAxe , M44N4RAye , & + M44N4RAze , M44N4RDxe , M44N4RDye , M44N4RDze , M44N4TAxe , M44N4TAye , M44N4TAze , & + M44N4TDxss , M44N4TDyss , M44N4TDzss , M44N5FKxe , M44N5FKye , M44N5FKze , M44N5FMxe , & + M44N5FMye , M44N5FMze , M44N5MKxe , M44N5MKye , M44N5MKze , M44N5MMxe , M44N5MMye , & + M44N5MMze , M44N5RAxe , M44N5RAye , M44N5RAze , M44N5RDxe , M44N5RDye , M44N5RDze , & + M44N5TAxe , M44N5TAye , M44N5TAze , M44N5TDxss , M44N5TDyss , M44N5TDzss , M44N6FKxe , & + M44N6FKye , M44N6FKze , M44N6FMxe , M44N6FMye , M44N6FMze , M44N6MKxe , M44N6MKye , & + M44N6MKze , M44N6MMxe , M44N6MMye , M44N6MMze , M44N6RAxe , M44N6RAye , M44N6RAze , & + M44N6RDxe , M44N6RDye , M44N6RDze , M44N6TAxe , M44N6TAye , M44N6TAze , M44N6TDxss , & + M44N6TDyss , M44N6TDzss , M44N7FKxe , M44N7FKye , M44N7FKze , M44N7FMxe , M44N7FMye , & + M44N7FMze , M44N7MKxe , M44N7MKye , M44N7MKze , M44N7MMxe , M44N7MMye , M44N7MMze , & + M44N7RAxe , M44N7RAye , M44N7RAze , M44N7RDxe , M44N7RDye , M44N7RDze , M44N7TAxe , & + M44N7TAye , M44N7TAze , M44N7TDxss , M44N7TDyss , M44N7TDzss , M44N8FKxe , M44N8FKye , & + M44N8FKze , M44N8FMxe , M44N8FMye , M44N8FMze , M44N8MKxe , M44N8MKye , M44N8MKze , & + M44N8MMxe , M44N8MMye , M44N8MMze , M44N8RAxe , M44N8RAye , M44N8RAze , M44N8RDxe , & + M44N8RDye , M44N8RDze , M44N8TAxe , M44N8TAye , M44N8TAze , M44N8TDxss , M44N8TDyss , & + M44N8TDzss , M44N9FKxe , M44N9FKye , M44N9FKze , M44N9FMxe , M44N9FMye , M44N9FMze , & + M44N9MKxe , M44N9MKye , M44N9MKze , M44N9MMxe , M44N9MMye , M44N9MMze , M44N9RAxe , & + M44N9RAye , M44N9RAze , M44N9RDxe , M44N9RDye , M44N9RDze , M44N9TAxe , M44N9TAye , & + M44N9TAze , M44N9TDxss , M44N9TDyss , M44N9TDzss , M45N1FKxe , M45N1FKye , M45N1FKze , & + M45N1FMxe , M45N1FMye , M45N1FMze , M45N1MKxe , M45N1MKye , M45N1MKze , M45N1MMxe , & + M45N1MMye , M45N1MMze , M45N1RAxe , M45N1RAye , M45N1RAze , M45N1RDxe , M45N1RDye , & + M45N1RDze , M45N1TAxe , M45N1TAye , M45N1TAze , M45N1TDxss , M45N1TDyss , M45N1TDzss , & + M45N2FKxe , M45N2FKye , M45N2FKze , M45N2FMxe , M45N2FMye , M45N2FMze , M45N2MKxe , & + M45N2MKye , M45N2MKze , M45N2MMxe , M45N2MMye , M45N2MMze , M45N2RAxe , M45N2RAye , & + M45N2RAze , M45N2RDxe , M45N2RDye , M45N2RDze , M45N2TAxe , M45N2TAye , M45N2TAze , & + M45N2TDxss , M45N2TDyss , M45N2TDzss , M45N3FKxe , M45N3FKye , M45N3FKze , M45N3FMxe , & + M45N3FMye , M45N3FMze , M45N3MKxe , M45N3MKye , M45N3MKze , M45N3MMxe , M45N3MMye , & + M45N3MMze , M45N3RAxe , M45N3RAye , M45N3RAze , M45N3RDxe , M45N3RDye , M45N3RDze , & + M45N3TAxe , M45N3TAye , M45N3TAze , M45N3TDxss , M45N3TDyss , M45N3TDzss , M45N4FKxe , & + M45N4FKye , M45N4FKze , M45N4FMxe , M45N4FMye , M45N4FMze , M45N4MKxe , M45N4MKye , & + M45N4MKze , M45N4MMxe , M45N4MMye , M45N4MMze , M45N4RAxe , M45N4RAye , M45N4RAze , & + M45N4RDxe , M45N4RDye , M45N4RDze , M45N4TAxe , M45N4TAye , M45N4TAze , M45N4TDxss , & + M45N4TDyss , M45N4TDzss , M45N5FKxe , M45N5FKye , M45N5FKze , M45N5FMxe , M45N5FMye , & + M45N5FMze , M45N5MKxe , M45N5MKye , M45N5MKze , M45N5MMxe , M45N5MMye , M45N5MMze , & + M45N5RAxe , M45N5RAye , M45N5RAze , M45N5RDxe , M45N5RDye , M45N5RDze , M45N5TAxe , & + M45N5TAye , M45N5TAze , M45N5TDxss , M45N5TDyss , M45N5TDzss , M45N6FKxe , M45N6FKye , & + M45N6FKze , M45N6FMxe , M45N6FMye , M45N6FMze , M45N6MKxe , M45N6MKye , M45N6MKze , & + M45N6MMxe , M45N6MMye , M45N6MMze , M45N6RAxe , M45N6RAye , M45N6RAze , M45N6RDxe , & + M45N6RDye , M45N6RDze , M45N6TAxe , M45N6TAye , M45N6TAze , M45N6TDxss , M45N6TDyss , & + M45N6TDzss , M45N7FKxe , M45N7FKye , M45N7FKze , M45N7FMxe , M45N7FMye , M45N7FMze , & + M45N7MKxe , M45N7MKye , M45N7MKze , M45N7MMxe , M45N7MMye , M45N7MMze , M45N7RAxe , & + M45N7RAye , M45N7RAze , M45N7RDxe , M45N7RDye , M45N7RDze , M45N7TAxe , M45N7TAye , & + M45N7TAze , M45N7TDxss , M45N7TDyss , M45N7TDzss , M45N8FKxe , M45N8FKye , M45N8FKze , & + M45N8FMxe , M45N8FMye , M45N8FMze , M45N8MKxe , M45N8MKye , M45N8MKze , M45N8MMxe , & + M45N8MMye , M45N8MMze , M45N8RAxe , M45N8RAye , M45N8RAze , M45N8RDxe , M45N8RDye , & + M45N8RDze , M45N8TAxe , M45N8TAye , M45N8TAze , M45N8TDxss , M45N8TDyss , M45N8TDzss , & + M45N9FKxe , M45N9FKye , M45N9FKze , M45N9FMxe , M45N9FMye , M45N9FMze , M45N9MKxe , & + M45N9MKye , M45N9MKze , M45N9MMxe , M45N9MMye , M45N9MMze , M45N9RAxe , M45N9RAye , & + M45N9RAze , M45N9RDxe , M45N9RDye , M45N9RDze , M45N9TAxe , M45N9TAye , M45N9TAze , & + M45N9TDxss , M45N9TDyss , M45N9TDzss , M46N1FKxe , M46N1FKye , M46N1FKze , M46N1FMxe , & + M46N1FMye , M46N1FMze , M46N1MKxe , M46N1MKye , M46N1MKze , M46N1MMxe , M46N1MMye , & + M46N1MMze , M46N1RAxe , M46N1RAye , M46N1RAze , M46N1RDxe , M46N1RDye , M46N1RDze , & + M46N1TAxe , M46N1TAye , M46N1TAze , M46N1TDxss , M46N1TDyss , M46N1TDzss , M46N2FKxe , & + M46N2FKye , M46N2FKze , M46N2FMxe , M46N2FMye , M46N2FMze , M46N2MKxe , M46N2MKye , & + M46N2MKze , M46N2MMxe , M46N2MMye , M46N2MMze , M46N2RAxe , M46N2RAye , M46N2RAze , & + M46N2RDxe , M46N2RDye , M46N2RDze , M46N2TAxe , M46N2TAye , M46N2TAze , M46N2TDxss , & + M46N2TDyss , M46N2TDzss , M46N3FKxe , M46N3FKye , M46N3FKze , M46N3FMxe , M46N3FMye , & + M46N3FMze , M46N3MKxe , M46N3MKye , M46N3MKze , M46N3MMxe , M46N3MMye , M46N3MMze , & + M46N3RAxe , M46N3RAye , M46N3RAze , M46N3RDxe , M46N3RDye , M46N3RDze , M46N3TAxe , & + M46N3TAye , M46N3TAze , M46N3TDxss , M46N3TDyss , M46N3TDzss , M46N4FKxe , M46N4FKye , & + M46N4FKze , M46N4FMxe , M46N4FMye , M46N4FMze , M46N4MKxe , M46N4MKye , M46N4MKze , & + M46N4MMxe , M46N4MMye , M46N4MMze , M46N4RAxe , M46N4RAye , M46N4RAze , M46N4RDxe , & + M46N4RDye , M46N4RDze , M46N4TAxe , M46N4TAye , M46N4TAze , M46N4TDxss , M46N4TDyss , & + M46N4TDzss , M46N5FKxe , M46N5FKye , M46N5FKze , M46N5FMxe , M46N5FMye , M46N5FMze , & + M46N5MKxe , M46N5MKye , M46N5MKze , M46N5MMxe , M46N5MMye , M46N5MMze , M46N5RAxe , & + M46N5RAye , M46N5RAze , M46N5RDxe , M46N5RDye , M46N5RDze , M46N5TAxe , M46N5TAye , & + M46N5TAze , M46N5TDxss , M46N5TDyss , M46N5TDzss , M46N6FKxe , M46N6FKye , M46N6FKze , & + M46N6FMxe , M46N6FMye , M46N6FMze , M46N6MKxe , M46N6MKye , M46N6MKze , M46N6MMxe , & + M46N6MMye , M46N6MMze , M46N6RAxe , M46N6RAye , M46N6RAze , M46N6RDxe , M46N6RDye , & + M46N6RDze , M46N6TAxe , M46N6TAye , M46N6TAze , M46N6TDxss , M46N6TDyss , M46N6TDzss , & + M46N7FKxe , M46N7FKye , M46N7FKze , M46N7FMxe , M46N7FMye , M46N7FMze , M46N7MKxe , & + M46N7MKye , M46N7MKze , M46N7MMxe , M46N7MMye , M46N7MMze , M46N7RAxe , M46N7RAye , & + M46N7RAze , M46N7RDxe , M46N7RDye , M46N7RDze , M46N7TAxe , M46N7TAye , M46N7TAze , & + M46N7TDxss , M46N7TDyss , M46N7TDzss , M46N8FKxe , M46N8FKye , M46N8FKze , M46N8FMxe , & + M46N8FMye , M46N8FMze , M46N8MKxe , M46N8MKye , M46N8MKze , M46N8MMxe , M46N8MMye , & + M46N8MMze , M46N8RAxe , M46N8RAye , M46N8RAze , M46N8RDxe , M46N8RDye , M46N8RDze /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry7(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M46N8TAxe , M46N8TAye , M46N8TAze , M46N8TDxss , M46N8TDyss , M46N8TDzss , M46N9FKxe , & + M46N9FKye , M46N9FKze , M46N9FMxe , M46N9FMye , M46N9FMze , M46N9MKxe , M46N9MKye , & + M46N9MKze , M46N9MMxe , M46N9MMye , M46N9MMze , M46N9RAxe , M46N9RAye , M46N9RAze , & + M46N9RDxe , M46N9RDye , M46N9RDze , M46N9TAxe , M46N9TAye , M46N9TAze , M46N9TDxss , & + M46N9TDyss , M46N9TDzss , M47N1FKxe , M47N1FKye , M47N1FKze , M47N1FMxe , M47N1FMye , & + M47N1FMze , M47N1MKxe , M47N1MKye , M47N1MKze , M47N1MMxe , M47N1MMye , M47N1MMze , & + M47N1RAxe , M47N1RAye , M47N1RAze , M47N1RDxe , M47N1RDye , M47N1RDze , M47N1TAxe , & + M47N1TAye , M47N1TAze , M47N1TDxss , M47N1TDyss , M47N1TDzss , M47N2FKxe , M47N2FKye , & + M47N2FKze , M47N2FMxe , M47N2FMye , M47N2FMze , M47N2MKxe , M47N2MKye , M47N2MKze , & + M47N2MMxe , M47N2MMye , M47N2MMze , M47N2RAxe , M47N2RAye , M47N2RAze , M47N2RDxe , & + M47N2RDye , M47N2RDze , M47N2TAxe , M47N2TAye , M47N2TAze , M47N2TDxss , M47N2TDyss , & + M47N2TDzss , M47N3FKxe , M47N3FKye , M47N3FKze , M47N3FMxe , M47N3FMye , M47N3FMze , & + M47N3MKxe , M47N3MKye , M47N3MKze , M47N3MMxe , M47N3MMye , M47N3MMze , M47N3RAxe , & + M47N3RAye , M47N3RAze , M47N3RDxe , M47N3RDye , M47N3RDze , M47N3TAxe , M47N3TAye , & + M47N3TAze , M47N3TDxss , M47N3TDyss , M47N3TDzss , M47N4FKxe , M47N4FKye , M47N4FKze , & + M47N4FMxe , M47N4FMye , M47N4FMze , M47N4MKxe , M47N4MKye , M47N4MKze , M47N4MMxe , & + M47N4MMye , M47N4MMze , M47N4RAxe , M47N4RAye , M47N4RAze , M47N4RDxe , M47N4RDye , & + M47N4RDze , M47N4TAxe , M47N4TAye , M47N4TAze , M47N4TDxss , M47N4TDyss , M47N4TDzss , & + M47N5FKxe , M47N5FKye , M47N5FKze , M47N5FMxe , M47N5FMye , M47N5FMze , M47N5MKxe , & + M47N5MKye , M47N5MKze , M47N5MMxe , M47N5MMye , M47N5MMze , M47N5RAxe , M47N5RAye , & + M47N5RAze , M47N5RDxe , M47N5RDye , M47N5RDze , M47N5TAxe , M47N5TAye , M47N5TAze , & + M47N5TDxss , M47N5TDyss , M47N5TDzss , M47N6FKxe , M47N6FKye , M47N6FKze , M47N6FMxe , & + M47N6FMye , M47N6FMze , M47N6MKxe , M47N6MKye , M47N6MKze , M47N6MMxe , M47N6MMye , & + M47N6MMze , M47N6RAxe , M47N6RAye , M47N6RAze , M47N6RDxe , M47N6RDye , M47N6RDze , & + M47N6TAxe , M47N6TAye , M47N6TAze , M47N6TDxss , M47N6TDyss , M47N6TDzss , M47N7FKxe , & + M47N7FKye , M47N7FKze , M47N7FMxe , M47N7FMye , M47N7FMze , M47N7MKxe , M47N7MKye , & + M47N7MKze , M47N7MMxe , M47N7MMye , M47N7MMze , M47N7RAxe , M47N7RAye , M47N7RAze , & + M47N7RDxe , M47N7RDye , M47N7RDze , M47N7TAxe , M47N7TAye , M47N7TAze , M47N7TDxss , & + M47N7TDyss , M47N7TDzss , M47N8FKxe , M47N8FKye , M47N8FKze , M47N8FMxe , M47N8FMye , & + M47N8FMze , M47N8MKxe , M47N8MKye , M47N8MKze , M47N8MMxe , M47N8MMye , M47N8MMze , & + M47N8RAxe , M47N8RAye , M47N8RAze , M47N8RDxe , M47N8RDye , M47N8RDze , M47N8TAxe , & + M47N8TAye , M47N8TAze , M47N8TDxss , M47N8TDyss , M47N8TDzss , M47N9FKxe , M47N9FKye , & + M47N9FKze , M47N9FMxe , M47N9FMye , M47N9FMze , M47N9MKxe , M47N9MKye , M47N9MKze , & + M47N9MMxe , M47N9MMye , M47N9MMze , M47N9RAxe , M47N9RAye , M47N9RAze , M47N9RDxe , & + M47N9RDye , M47N9RDze , M47N9TAxe , M47N9TAye , M47N9TAze , M47N9TDxss , M47N9TDyss , & + M47N9TDzss , M48N1FKxe , M48N1FKye , M48N1FKze , M48N1FMxe , M48N1FMye , M48N1FMze , & + M48N1MKxe , M48N1MKye , M48N1MKze , M48N1MMxe , M48N1MMye , M48N1MMze , M48N1RAxe , & + M48N1RAye , M48N1RAze , M48N1RDxe , M48N1RDye , M48N1RDze , M48N1TAxe , M48N1TAye , & + M48N1TAze , M48N1TDxss , M48N1TDyss , M48N1TDzss , M48N2FKxe , M48N2FKye , M48N2FKze , & + M48N2FMxe , M48N2FMye , M48N2FMze , M48N2MKxe , M48N2MKye , M48N2MKze , M48N2MMxe , & + M48N2MMye , M48N2MMze , M48N2RAxe , M48N2RAye , M48N2RAze , M48N2RDxe , M48N2RDye , & + M48N2RDze , M48N2TAxe , M48N2TAye , M48N2TAze , M48N2TDxss , M48N2TDyss , M48N2TDzss , & + M48N3FKxe , M48N3FKye , M48N3FKze , M48N3FMxe , M48N3FMye , M48N3FMze , M48N3MKxe , & + M48N3MKye , M48N3MKze , M48N3MMxe , M48N3MMye , M48N3MMze , M48N3RAxe , M48N3RAye , & + M48N3RAze , M48N3RDxe , M48N3RDye , M48N3RDze , M48N3TAxe , M48N3TAye , M48N3TAze , & + M48N3TDxss , M48N3TDyss , M48N3TDzss , M48N4FKxe , M48N4FKye , M48N4FKze , M48N4FMxe , & + M48N4FMye , M48N4FMze , M48N4MKxe , M48N4MKye , M48N4MKze , M48N4MMxe , M48N4MMye , & + M48N4MMze , M48N4RAxe , M48N4RAye , M48N4RAze , M48N4RDxe , M48N4RDye , M48N4RDze , & + M48N4TAxe , M48N4TAye , M48N4TAze , M48N4TDxss , M48N4TDyss , M48N4TDzss , M48N5FKxe , & + M48N5FKye , M48N5FKze , M48N5FMxe , M48N5FMye , M48N5FMze , M48N5MKxe , M48N5MKye , & + M48N5MKze , M48N5MMxe , M48N5MMye , M48N5MMze , M48N5RAxe , M48N5RAye , M48N5RAze , & + M48N5RDxe , M48N5RDye , M48N5RDze , M48N5TAxe , M48N5TAye , M48N5TAze , M48N5TDxss , & + M48N5TDyss , M48N5TDzss , M48N6FKxe , M48N6FKye , M48N6FKze , M48N6FMxe , M48N6FMye , & + M48N6FMze , M48N6MKxe , M48N6MKye , M48N6MKze , M48N6MMxe , M48N6MMye , M48N6MMze , & + M48N6RAxe , M48N6RAye , M48N6RAze , M48N6RDxe , M48N6RDye , M48N6RDze , M48N6TAxe , & + M48N6TAye , M48N6TAze , M48N6TDxss , M48N6TDyss , M48N6TDzss , M48N7FKxe , M48N7FKye , & + M48N7FKze , M48N7FMxe , M48N7FMye , M48N7FMze , M48N7MKxe , M48N7MKye , M48N7MKze , & + M48N7MMxe , M48N7MMye , M48N7MMze , M48N7RAxe , M48N7RAye , M48N7RAze , M48N7RDxe , & + M48N7RDye , M48N7RDze , M48N7TAxe , M48N7TAye , M48N7TAze , M48N7TDxss , M48N7TDyss , & + M48N7TDzss , M48N8FKxe , M48N8FKye , M48N8FKze , M48N8FMxe , M48N8FMye , M48N8FMze , & + M48N8MKxe , M48N8MKye , M48N8MKze , M48N8MMxe , M48N8MMye , M48N8MMze , M48N8RAxe , & + M48N8RAye , M48N8RAze , M48N8RDxe , M48N8RDye , M48N8RDze , M48N8TAxe , M48N8TAye , & + M48N8TAze , M48N8TDxss , M48N8TDyss , M48N8TDzss , M48N9FKxe , M48N9FKye , M48N9FKze , & + M48N9FMxe , M48N9FMye , M48N9FMze , M48N9MKxe , M48N9MKye , M48N9MKze , M48N9MMxe , & + M48N9MMye , M48N9MMze , M48N9RAxe , M48N9RAye , M48N9RAze , M48N9RDxe , M48N9RDye , & + M48N9RDze , M48N9TAxe , M48N9TAye , M48N9TAze , M48N9TDxss , M48N9TDyss , M48N9TDzss , & + M49N1FKxe , M49N1FKye , M49N1FKze , M49N1FMxe , M49N1FMye , M49N1FMze , M49N1MKxe , & + M49N1MKye , M49N1MKze , M49N1MMxe , M49N1MMye , M49N1MMze , M49N1RAxe , M49N1RAye , & + M49N1RAze , M49N1RDxe , M49N1RDye , M49N1RDze , M49N1TAxe , M49N1TAye , M49N1TAze , & + M49N1TDxss , M49N1TDyss , M49N1TDzss , M49N2FKxe , M49N2FKye , M49N2FKze , M49N2FMxe , & + M49N2FMye , M49N2FMze , M49N2MKxe , M49N2MKye , M49N2MKze , M49N2MMxe , M49N2MMye , & + M49N2MMze , M49N2RAxe , M49N2RAye , M49N2RAze , M49N2RDxe , M49N2RDye , M49N2RDze , & + M49N2TAxe , M49N2TAye , M49N2TAze , M49N2TDxss , M49N2TDyss , M49N2TDzss , M49N3FKxe , & + M49N3FKye , M49N3FKze , M49N3FMxe , M49N3FMye , M49N3FMze , M49N3MKxe , M49N3MKye , & + M49N3MKze , M49N3MMxe , M49N3MMye , M49N3MMze , M49N3RAxe , M49N3RAye , M49N3RAze , & + M49N3RDxe , M49N3RDye , M49N3RDze , M49N3TAxe , M49N3TAye , M49N3TAze , M49N3TDxss , & + M49N3TDyss , M49N3TDzss , M49N4FKxe , M49N4FKye , M49N4FKze , M49N4FMxe , M49N4FMye , & + M49N4FMze , M49N4MKxe , M49N4MKye , M49N4MKze , M49N4MMxe , M49N4MMye , M49N4MMze , & + M49N4RAxe , M49N4RAye , M49N4RAze , M49N4RDxe , M49N4RDye , M49N4RDze , M49N4TAxe , & + M49N4TAye , M49N4TAze , M49N4TDxss , M49N4TDyss , M49N4TDzss , M49N5FKxe , M49N5FKye , & + M49N5FKze , M49N5FMxe , M49N5FMye , M49N5FMze , M49N5MKxe , M49N5MKye , M49N5MKze , & + M49N5MMxe , M49N5MMye , M49N5MMze , M49N5RAxe , M49N5RAye , M49N5RAze , M49N5RDxe , & + M49N5RDye , M49N5RDze , M49N5TAxe , M49N5TAye , M49N5TAze , M49N5TDxss , M49N5TDyss , & + M49N5TDzss , M49N6FKxe , M49N6FKye , M49N6FKze , M49N6FMxe , M49N6FMye , M49N6FMze , & + M49N6MKxe , M49N6MKye , M49N6MKze , M49N6MMxe , M49N6MMye , M49N6MMze , M49N6RAxe , & + M49N6RAye , M49N6RAze , M49N6RDxe , M49N6RDye , M49N6RDze , M49N6TAxe , M49N6TAye , & + M49N6TAze , M49N6TDxss , M49N6TDyss , M49N6TDzss , M49N7FKxe , M49N7FKye , M49N7FKze , & + M49N7FMxe , M49N7FMye , M49N7FMze , M49N7MKxe , M49N7MKye , M49N7MKze , M49N7MMxe , & + M49N7MMye , M49N7MMze , M49N7RAxe , M49N7RAye , M49N7RAze , M49N7RDxe , M49N7RDye , & + M49N7RDze , M49N7TAxe , M49N7TAye , M49N7TAze , M49N7TDxss , M49N7TDyss , M49N7TDzss , & + M49N8FKxe , M49N8FKye , M49N8FKze , M49N8FMxe , M49N8FMye , M49N8FMze , M49N8MKxe , & + M49N8MKye , M49N8MKze , M49N8MMxe , M49N8MMye , M49N8MMze , M49N8RAxe , M49N8RAye , & + M49N8RAze , M49N8RDxe , M49N8RDye , M49N8RDze , M49N8TAxe , M49N8TAye , M49N8TAze , & + M49N8TDxss , M49N8TDyss , M49N8TDzss , M49N9FKxe , M49N9FKye , M49N9FKze , M49N9FMxe , & + M49N9FMye , M49N9FMze , M49N9MKxe , M49N9MKye , M49N9MKze , M49N9MMxe , M49N9MMye , & + M49N9MMze , M49N9RAxe , M49N9RAye , M49N9RAze , M49N9RDxe , M49N9RDye , M49N9RDze , & + M49N9TAxe , M49N9TAye , M49N9TAze , M49N9TDxss , M49N9TDyss , M49N9TDzss , M50N1FKxe , & + M50N1FKye , M50N1FKze , M50N1FMxe , M50N1FMye , M50N1FMze , M50N1MKxe , M50N1MKye , & + M50N1MKze , M50N1MMxe , M50N1MMye , M50N1MMze , M50N1RAxe , M50N1RAye , M50N1RAze , & + M50N1RDxe , M50N1RDye , M50N1RDze , M50N1TAxe , M50N1TAye , M50N1TAze , M50N1TDxss , & + M50N1TDyss , M50N1TDzss , M50N2FKxe , M50N2FKye , M50N2FKze , M50N2FMxe , M50N2FMye , & + M50N2FMze , M50N2MKxe , M50N2MKye , M50N2MKze , M50N2MMxe , M50N2MMye , M50N2MMze , & + M50N2RAxe , M50N2RAye , M50N2RAze , M50N2RDxe , M50N2RDye , M50N2RDze , M50N2TAxe , & + M50N2TAye , M50N2TAze , M50N2TDxss , M50N2TDyss , M50N2TDzss , M50N3FKxe , M50N3FKye , & + M50N3FKze , M50N3FMxe , M50N3FMye , M50N3FMze , M50N3MKxe , M50N3MKye , M50N3MKze , & + M50N3MMxe , M50N3MMye , M50N3MMze , M50N3RAxe , M50N3RAye , M50N3RAze , M50N3RDxe , & + M50N3RDye , M50N3RDze , M50N3TAxe , M50N3TAye , M50N3TAze , M50N3TDxss , M50N3TDyss , & + M50N3TDzss , M50N4FKxe , M50N4FKye , M50N4FKze , M50N4FMxe , M50N4FMye , M50N4FMze , & + M50N4MKxe , M50N4MKye , M50N4MKze , M50N4MMxe , M50N4MMye , M50N4MMze , M50N4RAxe , & + M50N4RAye , M50N4RAze , M50N4RDxe , M50N4RDye , M50N4RDze , M50N4TAxe , M50N4TAye , & + M50N4TAze , M50N4TDxss , M50N4TDyss , M50N4TDzss , M50N5FKxe , M50N5FKye , M50N5FKze , & + M50N5FMxe , M50N5FMye , M50N5FMze , M50N5MKxe , M50N5MKye , M50N5MKze , M50N5MMxe , & + M50N5MMye , M50N5MMze , M50N5RAxe , M50N5RAye , M50N5RAze , M50N5RDxe , M50N5RDye , & + M50N5RDze , M50N5TAxe , M50N5TAye , M50N5TAze , M50N5TDxss , M50N5TDyss , M50N5TDzss , & + M50N6FKxe , M50N6FKye , M50N6FKze , M50N6FMxe , M50N6FMye , M50N6FMze , M50N6MKxe , & + M50N6MKye , M50N6MKze , M50N6MMxe , M50N6MMye , M50N6MMze , M50N6RAxe , M50N6RAye , & + M50N6RAze , M50N6RDxe , M50N6RDye , M50N6RDze , M50N6TAxe , M50N6TAye , M50N6TAze , & + M50N6TDxss , M50N6TDyss , M50N6TDzss , M50N7FKxe , M50N7FKye , M50N7FKze , M50N7FMxe , & + M50N7FMye , M50N7FMze , M50N7MKxe , M50N7MKye , M50N7MKze , M50N7MMxe , M50N7MMye , & + M50N7MMze , M50N7RAxe , M50N7RAye , M50N7RAze , M50N7RDxe , M50N7RDye , M50N7RDze , & + M50N7TAxe , M50N7TAye , M50N7TAze , M50N7TDxss , M50N7TDyss , M50N7TDzss , M50N8FKxe , & + M50N8FKye , M50N8FKze , M50N8FMxe , M50N8FMye , M50N8FMze , M50N8MKxe , M50N8MKye , & + M50N8MKze , M50N8MMxe , M50N8MMye , M50N8MMze , M50N8RAxe , M50N8RAye , M50N8RAze , & + M50N8RDxe , M50N8RDye , M50N8RDze , M50N8TAxe , M50N8TAye , M50N8TAze , M50N8TDxss , & + M50N8TDyss , M50N8TDzss , M50N9FKxe , M50N9FKye , M50N9FKze , M50N9FMxe , M50N9FMye , & + M50N9FMze , M50N9MKxe , M50N9MKye , M50N9MKze , M50N9MMxe , M50N9MMye , M50N9MMze , & + M50N9RAxe , M50N9RAye , M50N9RAze , M50N9RDxe , M50N9RDye , M50N9RDze , M50N9TAxe , & + M50N9TAye , M50N9TAze , M50N9TDxss , M50N9TDyss , M50N9TDzss , M51N1FKxe , M51N1FKye , & + M51N1FKze , M51N1FMxe , M51N1FMye , M51N1FMze , M51N1MKxe , M51N1MKye , M51N1MKze , & + M51N1MMxe , M51N1MMye , M51N1MMze , M51N1RAxe , M51N1RAye , M51N1RAze , M51N1RDxe , & + M51N1RDye , M51N1RDze , M51N1TAxe , M51N1TAye , M51N1TAze , M51N1TDxss , M51N1TDyss , & + M51N1TDzss , M51N2FKxe , M51N2FKye , M51N2FKze , M51N2FMxe , M51N2FMye , M51N2FMze , & + M51N2MKxe , M51N2MKye , M51N2MKze , M51N2MMxe , M51N2MMye , M51N2MMze , M51N2RAxe , & + M51N2RAye , M51N2RAze , M51N2RDxe , M51N2RDye , M51N2RDze , M51N2TAxe , M51N2TAye , & + M51N2TAze , M51N2TDxss , M51N2TDyss , M51N2TDzss , M51N3FKxe , M51N3FKye , M51N3FKze , & + M51N3FMxe , M51N3FMye , M51N3FMze , M51N3MKxe , M51N3MKye , M51N3MKze , M51N3MMxe , & + M51N3MMye , M51N3MMze , M51N3RAxe , M51N3RAye , M51N3RAze , M51N3RDxe , M51N3RDye , & + M51N3RDze , M51N3TAxe , M51N3TAye , M51N3TAze , M51N3TDxss , M51N3TDyss , M51N3TDzss , & + M51N4FKxe , M51N4FKye , M51N4FKze , M51N4FMxe , M51N4FMye , M51N4FMze , M51N4MKxe , & + M51N4MKye , M51N4MKze , M51N4MMxe , M51N4MMye , M51N4MMze , M51N4RAxe , M51N4RAye , & + M51N4RAze , M51N4RDxe , M51N4RDye , M51N4RDze , M51N4TAxe , M51N4TAye , M51N4TAze , & + M51N4TDxss , M51N4TDyss , M51N4TDzss , M51N5FKxe , M51N5FKye , M51N5FKze , M51N5FMxe , & + M51N5FMye , M51N5FMze , M51N5MKxe , M51N5MKye , M51N5MKze , M51N5MMxe , M51N5MMye , & + M51N5MMze , M51N5RAxe , M51N5RAye , M51N5RAze , M51N5RDxe , M51N5RDye , M51N5RDze , & + M51N5TAxe , M51N5TAye , M51N5TAze , M51N5TDxss , M51N5TDyss , M51N5TDzss , M51N6FKxe , & + M51N6FKye , M51N6FKze , M51N6FMxe , M51N6FMye , M51N6FMze , M51N6MKxe , M51N6MKye , & + M51N6MKze , M51N6MMxe , M51N6MMye , M51N6MMze , M51N6RAxe , M51N6RAye , M51N6RAze , & + M51N6RDxe , M51N6RDye , M51N6RDze , M51N6TAxe , M51N6TAye , M51N6TAze , M51N6TDxss , & + M51N6TDyss , M51N6TDzss , M51N7FKxe , M51N7FKye , M51N7FKze , M51N7FMxe , M51N7FMye , & + M51N7FMze , M51N7MKxe , M51N7MKye , M51N7MKze , M51N7MMxe , M51N7MMye , M51N7MMze , & + M51N7RAxe , M51N7RAye , M51N7RAze , M51N7RDxe , M51N7RDye , M51N7RDze , M51N7TAxe , & + M51N7TAye , M51N7TAze , M51N7TDxss , M51N7TDyss , M51N7TDzss , M51N8FKxe , M51N8FKye , & + M51N8FKze , M51N8FMxe , M51N8FMye , M51N8FMze , M51N8MKxe , M51N8MKye , M51N8MKze , & + M51N8MMxe , M51N8MMye , M51N8MMze , M51N8RAxe , M51N8RAye , M51N8RAze , M51N8RDxe , & + M51N8RDye , M51N8RDze , M51N8TAxe , M51N8TAye , M51N8TAze , M51N8TDxss , M51N8TDyss , & + M51N8TDzss , M51N9FKxe , M51N9FKye , M51N9FKze , M51N9FMxe , M51N9FMye , M51N9FMze , & + M51N9MKxe , M51N9MKye , M51N9MKze , M51N9MMxe , M51N9MMye , M51N9MMze , M51N9RAxe , & + M51N9RAye , M51N9RAze , M51N9RDxe , M51N9RDye , M51N9RDze , M51N9TAxe , M51N9TAye , & + M51N9TAze , M51N9TDxss , M51N9TDyss , M51N9TDzss , M52N1FKxe , M52N1FKye , M52N1FKze , & + M52N1FMxe , M52N1FMye , M52N1FMze , M52N1MKxe , M52N1MKye , M52N1MKze , M52N1MMxe , & + M52N1MMye , M52N1MMze , M52N1RAxe , M52N1RAye , M52N1RAze , M52N1RDxe , M52N1RDye , & + M52N1RDze , M52N1TAxe , M52N1TAye , M52N1TAze , M52N1TDxss , M52N1TDyss , M52N1TDzss , & + M52N2FKxe , M52N2FKye , M52N2FKze , M52N2FMxe , M52N2FMye , M52N2FMze , M52N2MKxe , & + M52N2MKye , M52N2MKze , M52N2MMxe , M52N2MMye , M52N2MMze , M52N2RAxe , M52N2RAye , & + M52N2RAze , M52N2RDxe , M52N2RDye , M52N2RDze , M52N2TAxe , M52N2TAye , M52N2TAze , & + M52N2TDxss , M52N2TDyss , M52N2TDzss , M52N3FKxe , M52N3FKye , M52N3FKze , M52N3FMxe , & + M52N3FMye , M52N3FMze , M52N3MKxe , M52N3MKye , M52N3MKze , M52N3MMxe , M52N3MMye , & + M52N3MMze , M52N3RAxe , M52N3RAye , M52N3RAze , M52N3RDxe , M52N3RDye , M52N3RDze , & + M52N3TAxe , M52N3TAye , M52N3TAze , M52N3TDxss , M52N3TDyss , M52N3TDzss , M52N4FKxe , & + M52N4FKye , M52N4FKze , M52N4FMxe , M52N4FMye , M52N4FMze , M52N4MKxe , M52N4MKye , & + M52N4MKze , M52N4MMxe , M52N4MMye , M52N4MMze , M52N4RAxe , M52N4RAye , M52N4RAze , & + M52N4RDxe , M52N4RDye , M52N4RDze , M52N4TAxe , M52N4TAye , M52N4TAze , M52N4TDxss , & + M52N4TDyss , M52N4TDzss , M52N5FKxe , M52N5FKye , M52N5FKze , M52N5FMxe , M52N5FMye , & + M52N5FMze , M52N5MKxe , M52N5MKye , M52N5MKze , M52N5MMxe , M52N5MMye , M52N5MMze , & + M52N5RAxe , M52N5RAye , M52N5RAze , M52N5RDxe , M52N5RDye , M52N5RDze , M52N5TAxe , & + M52N5TAye , M52N5TAze , M52N5TDxss , M52N5TDyss , M52N5TDzss , M52N6FKxe , M52N6FKye , & + M52N6FKze , M52N6FMxe , M52N6FMye , M52N6FMze , M52N6MKxe , M52N6MKye , M52N6MKze , & + M52N6MMxe , M52N6MMye , M52N6MMze , M52N6RAxe , M52N6RAye , M52N6RAze , M52N6RDxe , & + M52N6RDye , M52N6RDze , M52N6TAxe , M52N6TAye , M52N6TAze , M52N6TDxss , M52N6TDyss , & + M52N6TDzss , M52N7FKxe , M52N7FKye , M52N7FKze , M52N7FMxe , M52N7FMye , M52N7FMze , & + M52N7MKxe , M52N7MKye , M52N7MKze , M52N7MMxe , M52N7MMye , M52N7MMze , M52N7RAxe , & + M52N7RAye , M52N7RAze , M52N7RDxe , M52N7RDye , M52N7RDze , M52N7TAxe , M52N7TAye , & + M52N7TAze , M52N7TDxss , M52N7TDyss , M52N7TDzss , M52N8FKxe , M52N8FKye , M52N8FKze , & + M52N8FMxe , M52N8FMye , M52N8FMze , M52N8MKxe , M52N8MKye , M52N8MKze , M52N8MMxe , & + M52N8MMye , M52N8MMze , M52N8RAxe , M52N8RAye , M52N8RAze , M52N8RDxe , M52N8RDye , & + M52N8RDze , M52N8TAxe , M52N8TAye , M52N8TAze , M52N8TDxss , M52N8TDyss , M52N8TDzss , & + M52N9FKxe , M52N9FKye , M52N9FKze , M52N9FMxe , M52N9FMye , M52N9FMze , M52N9MKxe , & + M52N9MKye , M52N9MKze , M52N9MMxe , M52N9MMye , M52N9MMze , M52N9RAxe , M52N9RAye , & + M52N9RAze , M52N9RDxe , M52N9RDye , M52N9RDze , M52N9TAxe , M52N9TAye , M52N9TAze , & + M52N9TDxss , M52N9TDyss , M52N9TDzss , M53N1FKxe , M53N1FKye , M53N1FKze , M53N1FMxe , & + M53N1FMye , M53N1FMze , M53N1MKxe , M53N1MKye , M53N1MKze , M53N1MMxe , M53N1MMye , & + M53N1MMze , M53N1RAxe , M53N1RAye , M53N1RAze , M53N1RDxe , M53N1RDye , M53N1RDze , & + M53N1TAxe , M53N1TAye , M53N1TAze , M53N1TDxss , M53N1TDyss , M53N1TDzss , M53N2FKxe , & + M53N2FKye , M53N2FKze , M53N2FMxe , M53N2FMye , M53N2FMze , M53N2MKxe , M53N2MKye , & + M53N2MKze , M53N2MMxe , M53N2MMye , M53N2MMze , M53N2RAxe , M53N2RAye , M53N2RAze , & + M53N2RDxe , M53N2RDye , M53N2RDze , M53N2TAxe , M53N2TAye , M53N2TAze , M53N2TDxss , & + M53N2TDyss , M53N2TDzss , M53N3FKxe , M53N3FKye , M53N3FKze , M53N3FMxe , M53N3FMye , & + M53N3FMze , M53N3MKxe , M53N3MKye , M53N3MKze , M53N3MMxe , M53N3MMye , M53N3MMze , & + M53N3RAxe , M53N3RAye , M53N3RAze , M53N3RDxe , M53N3RDye , M53N3RDze , M53N3TAxe , & + M53N3TAye , M53N3TAze , M53N3TDxss , M53N3TDyss , M53N3TDzss , M53N4FKxe , M53N4FKye , & + M53N4FKze , M53N4FMxe , M53N4FMye , M53N4FMze , M53N4MKxe , M53N4MKye , M53N4MKze , & + M53N4MMxe , M53N4MMye , M53N4MMze , M53N4RAxe , M53N4RAye , M53N4RAze , M53N4RDxe , & + M53N4RDye , M53N4RDze , M53N4TAxe , M53N4TAye , M53N4TAze , M53N4TDxss , M53N4TDyss , & + M53N4TDzss , M53N5FKxe , M53N5FKye , M53N5FKze , M53N5FMxe , M53N5FMye , M53N5FMze , & + M53N5MKxe , M53N5MKye , M53N5MKze , M53N5MMxe , M53N5MMye , M53N5MMze , M53N5RAxe , & + M53N5RAye , M53N5RAze , M53N5RDxe , M53N5RDye , M53N5RDze , M53N5TAxe , M53N5TAye , & + M53N5TAze , M53N5TDxss , M53N5TDyss , M53N5TDzss , M53N6FKxe , M53N6FKye , M53N6FKze , & + M53N6FMxe , M53N6FMye , M53N6FMze , M53N6MKxe , M53N6MKye , M53N6MKze , M53N6MMxe , & + M53N6MMye , M53N6MMze , M53N6RAxe , M53N6RAye , M53N6RAze , M53N6RDxe , M53N6RDye , & + M53N6RDze , M53N6TAxe , M53N6TAye , M53N6TAze , M53N6TDxss , M53N6TDyss , M53N6TDzss , & + M53N7FKxe , M53N7FKye , M53N7FKze , M53N7FMxe , M53N7FMye , M53N7FMze , M53N7MKxe , & + M53N7MKye , M53N7MKze , M53N7MMxe , M53N7MMye , M53N7MMze , M53N7RAxe , M53N7RAye , & + M53N7RAze , M53N7RDxe , M53N7RDye , M53N7RDze , M53N7TAxe , M53N7TAye , M53N7TAze , & + M53N7TDxss , M53N7TDyss , M53N7TDzss , M53N8FKxe , M53N8FKye , M53N8FKze , M53N8FMxe , & + M53N8FMye , M53N8FMze , M53N8MKxe , M53N8MKye , M53N8MKze , M53N8MMxe , M53N8MMye , & + M53N8MMze , M53N8RAxe , M53N8RAye , M53N8RAze , M53N8RDxe , M53N8RDye , M53N8RDze , & + M53N8TAxe , M53N8TAye , M53N8TAze , M53N8TDxss , M53N8TDyss , M53N8TDzss , M53N9FKxe , & + M53N9FKye , M53N9FKze , M53N9FMxe , M53N9FMye , M53N9FMze , M53N9MKxe , M53N9MKye , & + M53N9MKze , M53N9MMxe , M53N9MMye , M53N9MMze , M53N9RAxe , M53N9RAye , M53N9RAze , & + M53N9RDxe , M53N9RDye , M53N9RDze , M53N9TAxe , M53N9TAye , M53N9TAze , M53N9TDxss , & + M53N9TDyss , M53N9TDzss , M54N1FKxe , M54N1FKye , M54N1FKze , M54N1FMxe , M54N1FMye , & + M54N1FMze , M54N1MKxe , M54N1MKye , M54N1MKze , M54N1MMxe , M54N1MMye , M54N1MMze , & + M54N1RAxe , M54N1RAye , M54N1RAze , M54N1RDxe , M54N1RDye , M54N1RDze , M54N1TAxe , & + M54N1TAye , M54N1TAze , M54N1TDxss , M54N1TDyss , M54N1TDzss , M54N2FKxe , M54N2FKye , & + M54N2FKze , M54N2FMxe , M54N2FMye , M54N2FMze , M54N2MKxe , M54N2MKye , M54N2MKze , & + M54N2MMxe , M54N2MMye , M54N2MMze , M54N2RAxe , M54N2RAye , M54N2RAze , M54N2RDxe , & + M54N2RDye , M54N2RDze , M54N2TAxe , M54N2TAye , M54N2TAze , M54N2TDxss , M54N2TDyss , & + M54N2TDzss , M54N3FKxe , M54N3FKye , M54N3FKze , M54N3FMxe , M54N3FMye , M54N3FMze , & + M54N3MKxe , M54N3MKye , M54N3MKze , M54N3MMxe , M54N3MMye , M54N3MMze , M54N3RAxe , & + M54N3RAye , M54N3RAze , M54N3RDxe , M54N3RDye , M54N3RDze , M54N3TAxe , M54N3TAye , & + M54N3TAze , M54N3TDxss , M54N3TDyss , M54N3TDzss , M54N4FKxe , M54N4FKye , M54N4FKze , & + M54N4FMxe , M54N4FMye , M54N4FMze , M54N4MKxe , M54N4MKye , M54N4MKze , M54N4MMxe , & + M54N4MMye , M54N4MMze , M54N4RAxe , M54N4RAye , M54N4RAze , M54N4RDxe , M54N4RDye , & + M54N4RDze , M54N4TAxe , M54N4TAye , M54N4TAze , M54N4TDxss , M54N4TDyss , M54N4TDzss , & + M54N5FKxe , M54N5FKye , M54N5FKze , M54N5FMxe , M54N5FMye , M54N5FMze , M54N5MKxe , & + M54N5MKye , M54N5MKze , M54N5MMxe , M54N5MMye , M54N5MMze , M54N5RAxe , M54N5RAye , & + M54N5RAze , M54N5RDxe , M54N5RDye , M54N5RDze , M54N5TAxe , M54N5TAye , M54N5TAze , & + M54N5TDxss , M54N5TDyss , M54N5TDzss , M54N6FKxe , M54N6FKye , M54N6FKze , M54N6FMxe , & + M54N6FMye , M54N6FMze , M54N6MKxe , M54N6MKye , M54N6MKze , M54N6MMxe , M54N6MMye , & + M54N6MMze , M54N6RAxe , M54N6RAye , M54N6RAze , M54N6RDxe , M54N6RDye , M54N6RDze , & + M54N6TAxe , M54N6TAye , M54N6TAze , M54N6TDxss , M54N6TDyss , M54N6TDzss , M54N7FKxe /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry8(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M54N7FKye , M54N7FKze , M54N7FMxe , M54N7FMye , M54N7FMze , M54N7MKxe , M54N7MKye , & + M54N7MKze , M54N7MMxe , M54N7MMye , M54N7MMze , M54N7RAxe , M54N7RAye , M54N7RAze , & + M54N7RDxe , M54N7RDye , M54N7RDze , M54N7TAxe , M54N7TAye , M54N7TAze , M54N7TDxss , & + M54N7TDyss , M54N7TDzss , M54N8FKxe , M54N8FKye , M54N8FKze , M54N8FMxe , M54N8FMye , & + M54N8FMze , M54N8MKxe , M54N8MKye , M54N8MKze , M54N8MMxe , M54N8MMye , M54N8MMze , & + M54N8RAxe , M54N8RAye , M54N8RAze , M54N8RDxe , M54N8RDye , M54N8RDze , M54N8TAxe , & + M54N8TAye , M54N8TAze , M54N8TDxss , M54N8TDyss , M54N8TDzss , M54N9FKxe , M54N9FKye , & + M54N9FKze , M54N9FMxe , M54N9FMye , M54N9FMze , M54N9MKxe , M54N9MKye , M54N9MKze , & + M54N9MMxe , M54N9MMye , M54N9MMze , M54N9RAxe , M54N9RAye , M54N9RAze , M54N9RDxe , & + M54N9RDye , M54N9RDze , M54N9TAxe , M54N9TAye , M54N9TAze , M54N9TDxss , M54N9TDyss , & + M54N9TDzss , M55N1FKxe , M55N1FKye , M55N1FKze , M55N1FMxe , M55N1FMye , M55N1FMze , & + M55N1MKxe , M55N1MKye , M55N1MKze , M55N1MMxe , M55N1MMye , M55N1MMze , M55N1RAxe , & + M55N1RAye , M55N1RAze , M55N1RDxe , M55N1RDye , M55N1RDze , M55N1TAxe , M55N1TAye , & + M55N1TAze , M55N1TDxss , M55N1TDyss , M55N1TDzss , M55N2FKxe , M55N2FKye , M55N2FKze , & + M55N2FMxe , M55N2FMye , M55N2FMze , M55N2MKxe , M55N2MKye , M55N2MKze , M55N2MMxe , & + M55N2MMye , M55N2MMze , M55N2RAxe , M55N2RAye , M55N2RAze , M55N2RDxe , M55N2RDye , & + M55N2RDze , M55N2TAxe , M55N2TAye , M55N2TAze , M55N2TDxss , M55N2TDyss , M55N2TDzss , & + M55N3FKxe , M55N3FKye , M55N3FKze , M55N3FMxe , M55N3FMye , M55N3FMze , M55N3MKxe , & + M55N3MKye , M55N3MKze , M55N3MMxe , M55N3MMye , M55N3MMze , M55N3RAxe , M55N3RAye , & + M55N3RAze , M55N3RDxe , M55N3RDye , M55N3RDze , M55N3TAxe , M55N3TAye , M55N3TAze , & + M55N3TDxss , M55N3TDyss , M55N3TDzss , M55N4FKxe , M55N4FKye , M55N4FKze , M55N4FMxe , & + M55N4FMye , M55N4FMze , M55N4MKxe , M55N4MKye , M55N4MKze , M55N4MMxe , M55N4MMye , & + M55N4MMze , M55N4RAxe , M55N4RAye , M55N4RAze , M55N4RDxe , M55N4RDye , M55N4RDze , & + M55N4TAxe , M55N4TAye , M55N4TAze , M55N4TDxss , M55N4TDyss , M55N4TDzss , M55N5FKxe , & + M55N5FKye , M55N5FKze , M55N5FMxe , M55N5FMye , M55N5FMze , M55N5MKxe , M55N5MKye , & + M55N5MKze , M55N5MMxe , M55N5MMye , M55N5MMze , M55N5RAxe , M55N5RAye , M55N5RAze , & + M55N5RDxe , M55N5RDye , M55N5RDze , M55N5TAxe , M55N5TAye , M55N5TAze , M55N5TDxss , & + M55N5TDyss , M55N5TDzss , M55N6FKxe , M55N6FKye , M55N6FKze , M55N6FMxe , M55N6FMye , & + M55N6FMze , M55N6MKxe , M55N6MKye , M55N6MKze , M55N6MMxe , M55N6MMye , M55N6MMze , & + M55N6RAxe , M55N6RAye , M55N6RAze , M55N6RDxe , M55N6RDye , M55N6RDze , M55N6TAxe , & + M55N6TAye , M55N6TAze , M55N6TDxss , M55N6TDyss , M55N6TDzss , M55N7FKxe , M55N7FKye , & + M55N7FKze , M55N7FMxe , M55N7FMye , M55N7FMze , M55N7MKxe , M55N7MKye , M55N7MKze , & + M55N7MMxe , M55N7MMye , M55N7MMze , M55N7RAxe , M55N7RAye , M55N7RAze , M55N7RDxe , & + M55N7RDye , M55N7RDze , M55N7TAxe , M55N7TAye , M55N7TAze , M55N7TDxss , M55N7TDyss , & + M55N7TDzss , M55N8FKxe , M55N8FKye , M55N8FKze , M55N8FMxe , M55N8FMye , M55N8FMze , & + M55N8MKxe , M55N8MKye , M55N8MKze , M55N8MMxe , M55N8MMye , M55N8MMze , M55N8RAxe , & + M55N8RAye , M55N8RAze , M55N8RDxe , M55N8RDye , M55N8RDze , M55N8TAxe , M55N8TAye , & + M55N8TAze , M55N8TDxss , M55N8TDyss , M55N8TDzss , M55N9FKxe , M55N9FKye , M55N9FKze , & + M55N9FMxe , M55N9FMye , M55N9FMze , M55N9MKxe , M55N9MKye , M55N9MKze , M55N9MMxe , & + M55N9MMye , M55N9MMze , M55N9RAxe , M55N9RAye , M55N9RAze , M55N9RDxe , M55N9RDye , & + M55N9RDze , M55N9TAxe , M55N9TAye , M55N9TAze , M55N9TDxss , M55N9TDyss , M55N9TDzss , & + M56N1FKxe , M56N1FKye , M56N1FKze , M56N1FMxe , M56N1FMye , M56N1FMze , M56N1MKxe , & + M56N1MKye , M56N1MKze , M56N1MMxe , M56N1MMye , M56N1MMze , M56N1RAxe , M56N1RAye , & + M56N1RAze , M56N1RDxe , M56N1RDye , M56N1RDze , M56N1TAxe , M56N1TAye , M56N1TAze , & + M56N1TDxss , M56N1TDyss , M56N1TDzss , M56N2FKxe , M56N2FKye , M56N2FKze , M56N2FMxe , & + M56N2FMye , M56N2FMze , M56N2MKxe , M56N2MKye , M56N2MKze , M56N2MMxe , M56N2MMye , & + M56N2MMze , M56N2RAxe , M56N2RAye , M56N2RAze , M56N2RDxe , M56N2RDye , M56N2RDze , & + M56N2TAxe , M56N2TAye , M56N2TAze , M56N2TDxss , M56N2TDyss , M56N2TDzss , M56N3FKxe , & + M56N3FKye , M56N3FKze , M56N3FMxe , M56N3FMye , M56N3FMze , M56N3MKxe , M56N3MKye , & + M56N3MKze , M56N3MMxe , M56N3MMye , M56N3MMze , M56N3RAxe , M56N3RAye , M56N3RAze , & + M56N3RDxe , M56N3RDye , M56N3RDze , M56N3TAxe , M56N3TAye , M56N3TAze , M56N3TDxss , & + M56N3TDyss , M56N3TDzss , M56N4FKxe , M56N4FKye , M56N4FKze , M56N4FMxe , M56N4FMye , & + M56N4FMze , M56N4MKxe , M56N4MKye , M56N4MKze , M56N4MMxe , M56N4MMye , M56N4MMze , & + M56N4RAxe , M56N4RAye , M56N4RAze , M56N4RDxe , M56N4RDye , M56N4RDze , M56N4TAxe , & + M56N4TAye , M56N4TAze , M56N4TDxss , M56N4TDyss , M56N4TDzss , M56N5FKxe , M56N5FKye , & + M56N5FKze , M56N5FMxe , M56N5FMye , M56N5FMze , M56N5MKxe , M56N5MKye , M56N5MKze , & + M56N5MMxe , M56N5MMye , M56N5MMze , M56N5RAxe , M56N5RAye , M56N5RAze , M56N5RDxe , & + M56N5RDye , M56N5RDze , M56N5TAxe , M56N5TAye , M56N5TAze , M56N5TDxss , M56N5TDyss , & + M56N5TDzss , M56N6FKxe , M56N6FKye , M56N6FKze , M56N6FMxe , M56N6FMye , M56N6FMze , & + M56N6MKxe , M56N6MKye , M56N6MKze , M56N6MMxe , M56N6MMye , M56N6MMze , M56N6RAxe , & + M56N6RAye , M56N6RAze , M56N6RDxe , M56N6RDye , M56N6RDze , M56N6TAxe , M56N6TAye , & + M56N6TAze , M56N6TDxss , M56N6TDyss , M56N6TDzss , M56N7FKxe , M56N7FKye , M56N7FKze , & + M56N7FMxe , M56N7FMye , M56N7FMze , M56N7MKxe , M56N7MKye , M56N7MKze , M56N7MMxe , & + M56N7MMye , M56N7MMze , M56N7RAxe , M56N7RAye , M56N7RAze , M56N7RDxe , M56N7RDye , & + M56N7RDze , M56N7TAxe , M56N7TAye , M56N7TAze , M56N7TDxss , M56N7TDyss , M56N7TDzss , & + M56N8FKxe , M56N8FKye , M56N8FKze , M56N8FMxe , M56N8FMye , M56N8FMze , M56N8MKxe , & + M56N8MKye , M56N8MKze , M56N8MMxe , M56N8MMye , M56N8MMze , M56N8RAxe , M56N8RAye , & + M56N8RAze , M56N8RDxe , M56N8RDye , M56N8RDze , M56N8TAxe , M56N8TAye , M56N8TAze , & + M56N8TDxss , M56N8TDyss , M56N8TDzss , M56N9FKxe , M56N9FKye , M56N9FKze , M56N9FMxe , & + M56N9FMye , M56N9FMze , M56N9MKxe , M56N9MKye , M56N9MKze , M56N9MMxe , M56N9MMye , & + M56N9MMze , M56N9RAxe , M56N9RAye , M56N9RAze , M56N9RDxe , M56N9RDye , M56N9RDze , & + M56N9TAxe , M56N9TAye , M56N9TAze , M56N9TDxss , M56N9TDyss , M56N9TDzss , M57N1FKxe , & + M57N1FKye , M57N1FKze , M57N1FMxe , M57N1FMye , M57N1FMze , M57N1MKxe , M57N1MKye , & + M57N1MKze , M57N1MMxe , M57N1MMye , M57N1MMze , M57N1RAxe , M57N1RAye , M57N1RAze , & + M57N1RDxe , M57N1RDye , M57N1RDze , M57N1TAxe , M57N1TAye , M57N1TAze , M57N1TDxss , & + M57N1TDyss , M57N1TDzss , M57N2FKxe , M57N2FKye , M57N2FKze , M57N2FMxe , M57N2FMye , & + M57N2FMze , M57N2MKxe , M57N2MKye , M57N2MKze , M57N2MMxe , M57N2MMye , M57N2MMze , & + M57N2RAxe , M57N2RAye , M57N2RAze , M57N2RDxe , M57N2RDye , M57N2RDze , M57N2TAxe , & + M57N2TAye , M57N2TAze , M57N2TDxss , M57N2TDyss , M57N2TDzss , M57N3FKxe , M57N3FKye , & + M57N3FKze , M57N3FMxe , M57N3FMye , M57N3FMze , M57N3MKxe , M57N3MKye , M57N3MKze , & + M57N3MMxe , M57N3MMye , M57N3MMze , M57N3RAxe , M57N3RAye , M57N3RAze , M57N3RDxe , & + M57N3RDye , M57N3RDze , M57N3TAxe , M57N3TAye , M57N3TAze , M57N3TDxss , M57N3TDyss , & + M57N3TDzss , M57N4FKxe , M57N4FKye , M57N4FKze , M57N4FMxe , M57N4FMye , M57N4FMze , & + M57N4MKxe , M57N4MKye , M57N4MKze , M57N4MMxe , M57N4MMye , M57N4MMze , M57N4RAxe , & + M57N4RAye , M57N4RAze , M57N4RDxe , M57N4RDye , M57N4RDze , M57N4TAxe , M57N4TAye , & + M57N4TAze , M57N4TDxss , M57N4TDyss , M57N4TDzss , M57N5FKxe , M57N5FKye , M57N5FKze , & + M57N5FMxe , M57N5FMye , M57N5FMze , M57N5MKxe , M57N5MKye , M57N5MKze , M57N5MMxe , & + M57N5MMye , M57N5MMze , M57N5RAxe , M57N5RAye , M57N5RAze , M57N5RDxe , M57N5RDye , & + M57N5RDze , M57N5TAxe , M57N5TAye , M57N5TAze , M57N5TDxss , M57N5TDyss , M57N5TDzss , & + M57N6FKxe , M57N6FKye , M57N6FKze , M57N6FMxe , M57N6FMye , M57N6FMze , M57N6MKxe , & + M57N6MKye , M57N6MKze , M57N6MMxe , M57N6MMye , M57N6MMze , M57N6RAxe , M57N6RAye , & + M57N6RAze , M57N6RDxe , M57N6RDye , M57N6RDze , M57N6TAxe , M57N6TAye , M57N6TAze , & + M57N6TDxss , M57N6TDyss , M57N6TDzss , M57N7FKxe , M57N7FKye , M57N7FKze , M57N7FMxe , & + M57N7FMye , M57N7FMze , M57N7MKxe , M57N7MKye , M57N7MKze , M57N7MMxe , M57N7MMye , & + M57N7MMze , M57N7RAxe , M57N7RAye , M57N7RAze , M57N7RDxe , M57N7RDye , M57N7RDze , & + M57N7TAxe , M57N7TAye , M57N7TAze , M57N7TDxss , M57N7TDyss , M57N7TDzss , M57N8FKxe , & + M57N8FKye , M57N8FKze , M57N8FMxe , M57N8FMye , M57N8FMze , M57N8MKxe , M57N8MKye , & + M57N8MKze , M57N8MMxe , M57N8MMye , M57N8MMze , M57N8RAxe , M57N8RAye , M57N8RAze , & + M57N8RDxe , M57N8RDye , M57N8RDze , M57N8TAxe , M57N8TAye , M57N8TAze , M57N8TDxss , & + M57N8TDyss , M57N8TDzss , M57N9FKxe , M57N9FKye , M57N9FKze , M57N9FMxe , M57N9FMye , & + M57N9FMze , M57N9MKxe , M57N9MKye , M57N9MKze , M57N9MMxe , M57N9MMye , M57N9MMze , & + M57N9RAxe , M57N9RAye , M57N9RAze , M57N9RDxe , M57N9RDye , M57N9RDze , M57N9TAxe , & + M57N9TAye , M57N9TAze , M57N9TDxss , M57N9TDyss , M57N9TDzss , M58N1FKxe , M58N1FKye , & + M58N1FKze , M58N1FMxe , M58N1FMye , M58N1FMze , M58N1MKxe , M58N1MKye , M58N1MKze , & + M58N1MMxe , M58N1MMye , M58N1MMze , M58N1RAxe , M58N1RAye , M58N1RAze , M58N1RDxe , & + M58N1RDye , M58N1RDze , M58N1TAxe , M58N1TAye , M58N1TAze , M58N1TDxss , M58N1TDyss , & + M58N1TDzss , M58N2FKxe , M58N2FKye , M58N2FKze , M58N2FMxe , M58N2FMye , M58N2FMze , & + M58N2MKxe , M58N2MKye , M58N2MKze , M58N2MMxe , M58N2MMye , M58N2MMze , M58N2RAxe , & + M58N2RAye , M58N2RAze , M58N2RDxe , M58N2RDye , M58N2RDze , M58N2TAxe , M58N2TAye , & + M58N2TAze , M58N2TDxss , M58N2TDyss , M58N2TDzss , M58N3FKxe , M58N3FKye , M58N3FKze , & + M58N3FMxe , M58N3FMye , M58N3FMze , M58N3MKxe , M58N3MKye , M58N3MKze , M58N3MMxe , & + M58N3MMye , M58N3MMze , M58N3RAxe , M58N3RAye , M58N3RAze , M58N3RDxe , M58N3RDye , & + M58N3RDze , M58N3TAxe , M58N3TAye , M58N3TAze , M58N3TDxss , M58N3TDyss , M58N3TDzss , & + M58N4FKxe , M58N4FKye , M58N4FKze , M58N4FMxe , M58N4FMye , M58N4FMze , M58N4MKxe , & + M58N4MKye , M58N4MKze , M58N4MMxe , M58N4MMye , M58N4MMze , M58N4RAxe , M58N4RAye , & + M58N4RAze , M58N4RDxe , M58N4RDye , M58N4RDze , M58N4TAxe , M58N4TAye , M58N4TAze , & + M58N4TDxss , M58N4TDyss , M58N4TDzss , M58N5FKxe , M58N5FKye , M58N5FKze , M58N5FMxe , & + M58N5FMye , M58N5FMze , M58N5MKxe , M58N5MKye , M58N5MKze , M58N5MMxe , M58N5MMye , & + M58N5MMze , M58N5RAxe , M58N5RAye , M58N5RAze , M58N5RDxe , M58N5RDye , M58N5RDze , & + M58N5TAxe , M58N5TAye , M58N5TAze , M58N5TDxss , M58N5TDyss , M58N5TDzss , M58N6FKxe , & + M58N6FKye , M58N6FKze , M58N6FMxe , M58N6FMye , M58N6FMze , M58N6MKxe , M58N6MKye , & + M58N6MKze , M58N6MMxe , M58N6MMye , M58N6MMze , M58N6RAxe , M58N6RAye , M58N6RAze , & + M58N6RDxe , M58N6RDye , M58N6RDze , M58N6TAxe , M58N6TAye , M58N6TAze , M58N6TDxss , & + M58N6TDyss , M58N6TDzss , M58N7FKxe , M58N7FKye , M58N7FKze , M58N7FMxe , M58N7FMye , & + M58N7FMze , M58N7MKxe , M58N7MKye , M58N7MKze , M58N7MMxe , M58N7MMye , M58N7MMze , & + M58N7RAxe , M58N7RAye , M58N7RAze , M58N7RDxe , M58N7RDye , M58N7RDze , M58N7TAxe , & + M58N7TAye , M58N7TAze , M58N7TDxss , M58N7TDyss , M58N7TDzss , M58N8FKxe , M58N8FKye , & + M58N8FKze , M58N8FMxe , M58N8FMye , M58N8FMze , M58N8MKxe , M58N8MKye , M58N8MKze , & + M58N8MMxe , M58N8MMye , M58N8MMze , M58N8RAxe , M58N8RAye , M58N8RAze , M58N8RDxe , & + M58N8RDye , M58N8RDze , M58N8TAxe , M58N8TAye , M58N8TAze , M58N8TDxss , M58N8TDyss , & + M58N8TDzss , M58N9FKxe , M58N9FKye , M58N9FKze , M58N9FMxe , M58N9FMye , M58N9FMze , & + M58N9MKxe , M58N9MKye , M58N9MKze , M58N9MMxe , M58N9MMye , M58N9MMze , M58N9RAxe , & + M58N9RAye , M58N9RAze , M58N9RDxe , M58N9RDye , M58N9RDze , M58N9TAxe , M58N9TAye , & + M58N9TAze , M58N9TDxss , M58N9TDyss , M58N9TDzss , M59N1FKxe , M59N1FKye , M59N1FKze , & + M59N1FMxe , M59N1FMye , M59N1FMze , M59N1MKxe , M59N1MKye , M59N1MKze , M59N1MMxe , & + M59N1MMye , M59N1MMze , M59N1RAxe , M59N1RAye , M59N1RAze , M59N1RDxe , M59N1RDye , & + M59N1RDze , M59N1TAxe , M59N1TAye , M59N1TAze , M59N1TDxss , M59N1TDyss , M59N1TDzss , & + M59N2FKxe , M59N2FKye , M59N2FKze , M59N2FMxe , M59N2FMye , M59N2FMze , M59N2MKxe , & + M59N2MKye , M59N2MKze , M59N2MMxe , M59N2MMye , M59N2MMze , M59N2RAxe , M59N2RAye , & + M59N2RAze , M59N2RDxe , M59N2RDye , M59N2RDze , M59N2TAxe , M59N2TAye , M59N2TAze , & + M59N2TDxss , M59N2TDyss , M59N2TDzss , M59N3FKxe , M59N3FKye , M59N3FKze , M59N3FMxe , & + M59N3FMye , M59N3FMze , M59N3MKxe , M59N3MKye , M59N3MKze , M59N3MMxe , M59N3MMye , & + M59N3MMze , M59N3RAxe , M59N3RAye , M59N3RAze , M59N3RDxe , M59N3RDye , M59N3RDze , & + M59N3TAxe , M59N3TAye , M59N3TAze , M59N3TDxss , M59N3TDyss , M59N3TDzss , M59N4FKxe , & + M59N4FKye , M59N4FKze , M59N4FMxe , M59N4FMye , M59N4FMze , M59N4MKxe , M59N4MKye , & + M59N4MKze , M59N4MMxe , M59N4MMye , M59N4MMze , M59N4RAxe , M59N4RAye , M59N4RAze , & + M59N4RDxe , M59N4RDye , M59N4RDze , M59N4TAxe , M59N4TAye , M59N4TAze , M59N4TDxss , & + M59N4TDyss , M59N4TDzss , M59N5FKxe , M59N5FKye , M59N5FKze , M59N5FMxe , M59N5FMye , & + M59N5FMze , M59N5MKxe , M59N5MKye , M59N5MKze , M59N5MMxe , M59N5MMye , M59N5MMze , & + M59N5RAxe , M59N5RAye , M59N5RAze , M59N5RDxe , M59N5RDye , M59N5RDze , M59N5TAxe , & + M59N5TAye , M59N5TAze , M59N5TDxss , M59N5TDyss , M59N5TDzss , M59N6FKxe , M59N6FKye , & + M59N6FKze , M59N6FMxe , M59N6FMye , M59N6FMze , M59N6MKxe , M59N6MKye , M59N6MKze , & + M59N6MMxe , M59N6MMye , M59N6MMze , M59N6RAxe , M59N6RAye , M59N6RAze , M59N6RDxe , & + M59N6RDye , M59N6RDze , M59N6TAxe , M59N6TAye , M59N6TAze , M59N6TDxss , M59N6TDyss , & + M59N6TDzss , M59N7FKxe , M59N7FKye , M59N7FKze , M59N7FMxe , M59N7FMye , M59N7FMze , & + M59N7MKxe , M59N7MKye , M59N7MKze , M59N7MMxe , M59N7MMye , M59N7MMze , M59N7RAxe , & + M59N7RAye , M59N7RAze , M59N7RDxe , M59N7RDye , M59N7RDze , M59N7TAxe , M59N7TAye , & + M59N7TAze , M59N7TDxss , M59N7TDyss , M59N7TDzss , M59N8FKxe , M59N8FKye , M59N8FKze , & + M59N8FMxe , M59N8FMye , M59N8FMze , M59N8MKxe , M59N8MKye , M59N8MKze , M59N8MMxe , & + M59N8MMye , M59N8MMze , M59N8RAxe , M59N8RAye , M59N8RAze , M59N8RDxe , M59N8RDye , & + M59N8RDze , M59N8TAxe , M59N8TAye , M59N8TAze , M59N8TDxss , M59N8TDyss , M59N8TDzss , & + M59N9FKxe , M59N9FKye , M59N9FKze , M59N9FMxe , M59N9FMye , M59N9FMze , M59N9MKxe , & + M59N9MKye , M59N9MKze , M59N9MMxe , M59N9MMye , M59N9MMze , M59N9RAxe , M59N9RAye , & + M59N9RAze , M59N9RDxe , M59N9RDye , M59N9RDze , M59N9TAxe , M59N9TAye , M59N9TAze , & + M59N9TDxss , M59N9TDyss , M59N9TDzss , M60N1FKxe , M60N1FKye , M60N1FKze , M60N1FMxe , & + M60N1FMye , M60N1FMze , M60N1MKxe , M60N1MKye , M60N1MKze , M60N1MMxe , M60N1MMye , & + M60N1MMze , M60N1RAxe , M60N1RAye , M60N1RAze , M60N1RDxe , M60N1RDye , M60N1RDze , & + M60N1TAxe , M60N1TAye , M60N1TAze , M60N1TDxss , M60N1TDyss , M60N1TDzss , M60N2FKxe , & + M60N2FKye , M60N2FKze , M60N2FMxe , M60N2FMye , M60N2FMze , M60N2MKxe , M60N2MKye , & + M60N2MKze , M60N2MMxe , M60N2MMye , M60N2MMze , M60N2RAxe , M60N2RAye , M60N2RAze , & + M60N2RDxe , M60N2RDye , M60N2RDze , M60N2TAxe , M60N2TAye , M60N2TAze , M60N2TDxss , & + M60N2TDyss , M60N2TDzss , M60N3FKxe , M60N3FKye , M60N3FKze , M60N3FMxe , M60N3FMye , & + M60N3FMze , M60N3MKxe , M60N3MKye , M60N3MKze , M60N3MMxe , M60N3MMye , M60N3MMze , & + M60N3RAxe , M60N3RAye , M60N3RAze , M60N3RDxe , M60N3RDye , M60N3RDze , M60N3TAxe , & + M60N3TAye , M60N3TAze , M60N3TDxss , M60N3TDyss , M60N3TDzss , M60N4FKxe , M60N4FKye , & + M60N4FKze , M60N4FMxe , M60N4FMye , M60N4FMze , M60N4MKxe , M60N4MKye , M60N4MKze , & + M60N4MMxe , M60N4MMye , M60N4MMze , M60N4RAxe , M60N4RAye , M60N4RAze , M60N4RDxe , & + M60N4RDye , M60N4RDze , M60N4TAxe , M60N4TAye , M60N4TAze , M60N4TDxss , M60N4TDyss , & + M60N4TDzss , M60N5FKxe , M60N5FKye , M60N5FKze , M60N5FMxe , M60N5FMye , M60N5FMze , & + M60N5MKxe , M60N5MKye , M60N5MKze , M60N5MMxe , M60N5MMye , M60N5MMze , M60N5RAxe , & + M60N5RAye , M60N5RAze , M60N5RDxe , M60N5RDye , M60N5RDze , M60N5TAxe , M60N5TAye , & + M60N5TAze , M60N5TDxss , M60N5TDyss , M60N5TDzss , M60N6FKxe , M60N6FKye , M60N6FKze , & + M60N6FMxe , M60N6FMye , M60N6FMze , M60N6MKxe , M60N6MKye , M60N6MKze , M60N6MMxe , & + M60N6MMye , M60N6MMze , M60N6RAxe , M60N6RAye , M60N6RAze , M60N6RDxe , M60N6RDye , & + M60N6RDze , M60N6TAxe , M60N6TAye , M60N6TAze , M60N6TDxss , M60N6TDyss , M60N6TDzss , & + M60N7FKxe , M60N7FKye , M60N7FKze , M60N7FMxe , M60N7FMye , M60N7FMze , M60N7MKxe , & + M60N7MKye , M60N7MKze , M60N7MMxe , M60N7MMye , M60N7MMze , M60N7RAxe , M60N7RAye , & + M60N7RAze , M60N7RDxe , M60N7RDye , M60N7RDze , M60N7TAxe , M60N7TAye , M60N7TAze , & + M60N7TDxss , M60N7TDyss , M60N7TDzss , M60N8FKxe , M60N8FKye , M60N8FKze , M60N8FMxe , & + M60N8FMye , M60N8FMze , M60N8MKxe , M60N8MKye , M60N8MKze , M60N8MMxe , M60N8MMye , & + M60N8MMze , M60N8RAxe , M60N8RAye , M60N8RAze , M60N8RDxe , M60N8RDye , M60N8RDze , & + M60N8TAxe , M60N8TAye , M60N8TAze , M60N8TDxss , M60N8TDyss , M60N8TDzss , M60N9FKxe , & + M60N9FKye , M60N9FKze , M60N9FMxe , M60N9FMye , M60N9FMze , M60N9MKxe , M60N9MKye , & + M60N9MKze , M60N9MMxe , M60N9MMye , M60N9MMze , M60N9RAxe , M60N9RAye , M60N9RAze , & + M60N9RDxe , M60N9RDye , M60N9RDze , M60N9TAxe , M60N9TAye , M60N9TAze , M60N9TDxss , & + M60N9TDyss , M60N9TDzss , M61N1FKxe , M61N1FKye , M61N1FKze , M61N1FMxe , M61N1FMye , & + M61N1FMze , M61N1MKxe , M61N1MKye , M61N1MKze , M61N1MMxe , M61N1MMye , M61N1MMze , & + M61N1RAxe , M61N1RAye , M61N1RAze , M61N1RDxe , M61N1RDye , M61N1RDze , M61N1TAxe , & + M61N1TAye , M61N1TAze , M61N1TDxss , M61N1TDyss , M61N1TDzss , M61N2FKxe , M61N2FKye , & + M61N2FKze , M61N2FMxe , M61N2FMye , M61N2FMze , M61N2MKxe , M61N2MKye , M61N2MKze , & + M61N2MMxe , M61N2MMye , M61N2MMze , M61N2RAxe , M61N2RAye , M61N2RAze , M61N2RDxe , & + M61N2RDye , M61N2RDze , M61N2TAxe , M61N2TAye , M61N2TAze , M61N2TDxss , M61N2TDyss , & + M61N2TDzss , M61N3FKxe , M61N3FKye , M61N3FKze , M61N3FMxe , M61N3FMye , M61N3FMze , & + M61N3MKxe , M61N3MKye , M61N3MKze , M61N3MMxe , M61N3MMye , M61N3MMze , M61N3RAxe , & + M61N3RAye , M61N3RAze , M61N3RDxe , M61N3RDye , M61N3RDze , M61N3TAxe , M61N3TAye , & + M61N3TAze , M61N3TDxss , M61N3TDyss , M61N3TDzss , M61N4FKxe , M61N4FKye , M61N4FKze , & + M61N4FMxe , M61N4FMye , M61N4FMze , M61N4MKxe , M61N4MKye , M61N4MKze , M61N4MMxe , & + M61N4MMye , M61N4MMze , M61N4RAxe , M61N4RAye , M61N4RAze , M61N4RDxe , M61N4RDye , & + M61N4RDze , M61N4TAxe , M61N4TAye , M61N4TAze , M61N4TDxss , M61N4TDyss , M61N4TDzss , & + M61N5FKxe , M61N5FKye , M61N5FKze , M61N5FMxe , M61N5FMye , M61N5FMze , M61N5MKxe , & + M61N5MKye , M61N5MKze , M61N5MMxe , M61N5MMye , M61N5MMze , M61N5RAxe , M61N5RAye , & + M61N5RAze , M61N5RDxe , M61N5RDye , M61N5RDze , M61N5TAxe , M61N5TAye , M61N5TAze , & + M61N5TDxss , M61N5TDyss , M61N5TDzss , M61N6FKxe , M61N6FKye , M61N6FKze , M61N6FMxe , & + M61N6FMye , M61N6FMze , M61N6MKxe , M61N6MKye , M61N6MKze , M61N6MMxe , M61N6MMye , & + M61N6MMze , M61N6RAxe , M61N6RAye , M61N6RAze , M61N6RDxe , M61N6RDye , M61N6RDze , & + M61N6TAxe , M61N6TAye , M61N6TAze , M61N6TDxss , M61N6TDyss , M61N6TDzss , M61N7FKxe , & + M61N7FKye , M61N7FKze , M61N7FMxe , M61N7FMye , M61N7FMze , M61N7MKxe , M61N7MKye , & + M61N7MKze , M61N7MMxe , M61N7MMye , M61N7MMze , M61N7RAxe , M61N7RAye , M61N7RAze , & + M61N7RDxe , M61N7RDye , M61N7RDze , M61N7TAxe , M61N7TAye , M61N7TAze , M61N7TDxss , & + M61N7TDyss , M61N7TDzss , M61N8FKxe , M61N8FKye , M61N8FKze , M61N8FMxe , M61N8FMye , & + M61N8FMze , M61N8MKxe , M61N8MKye , M61N8MKze , M61N8MMxe , M61N8MMye , M61N8MMze , & + M61N8RAxe , M61N8RAye , M61N8RAze , M61N8RDxe , M61N8RDye , M61N8RDze , M61N8TAxe , & + M61N8TAye , M61N8TAze , M61N8TDxss , M61N8TDyss , M61N8TDzss , M61N9FKxe , M61N9FKye , & + M61N9FKze , M61N9FMxe , M61N9FMye , M61N9FMze , M61N9MKxe , M61N9MKye , M61N9MKze , & + M61N9MMxe , M61N9MMye , M61N9MMze , M61N9RAxe , M61N9RAye , M61N9RAze , M61N9RDxe , & + M61N9RDye , M61N9RDze , M61N9TAxe , M61N9TAye , M61N9TAze , M61N9TDxss , M61N9TDyss , & + M61N9TDzss , M62N1FKxe , M62N1FKye , M62N1FKze , M62N1FMxe , M62N1FMye , M62N1FMze , & + M62N1MKxe , M62N1MKye , M62N1MKze , M62N1MMxe , M62N1MMye , M62N1MMze , M62N1RAxe , & + M62N1RAye , M62N1RAze , M62N1RDxe , M62N1RDye , M62N1RDze , M62N1TAxe , M62N1TAye , & + M62N1TAze , M62N1TDxss , M62N1TDyss , M62N1TDzss , M62N2FKxe , M62N2FKye , M62N2FKze , & + M62N2FMxe , M62N2FMye , M62N2FMze , M62N2MKxe , M62N2MKye , M62N2MKze , M62N2MMxe , & + M62N2MMye , M62N2MMze , M62N2RAxe , M62N2RAye , M62N2RAze , M62N2RDxe , M62N2RDye , & + M62N2RDze , M62N2TAxe , M62N2TAye , M62N2TAze , M62N2TDxss , M62N2TDyss , M62N2TDzss , & + M62N3FKxe , M62N3FKye , M62N3FKze , M62N3FMxe , M62N3FMye , M62N3FMze , M62N3MKxe , & + M62N3MKye , M62N3MKze , M62N3MMxe , M62N3MMye , M62N3MMze , M62N3RAxe , M62N3RAye , & + M62N3RAze , M62N3RDxe , M62N3RDye , M62N3RDze , M62N3TAxe , M62N3TAye , M62N3TAze , & + M62N3TDxss , M62N3TDyss , M62N3TDzss , M62N4FKxe , M62N4FKye , M62N4FKze , M62N4FMxe , & + M62N4FMye , M62N4FMze , M62N4MKxe , M62N4MKye , M62N4MKze , M62N4MMxe , M62N4MMye , & + M62N4MMze , M62N4RAxe , M62N4RAye , M62N4RAze , M62N4RDxe , M62N4RDye , M62N4RDze , & + M62N4TAxe , M62N4TAye , M62N4TAze , M62N4TDxss , M62N4TDyss , M62N4TDzss , M62N5FKxe , & + M62N5FKye , M62N5FKze , M62N5FMxe , M62N5FMye , M62N5FMze , M62N5MKxe , M62N5MKye /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry9(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M62N5MKze , M62N5MMxe , M62N5MMye , M62N5MMze , M62N5RAxe , M62N5RAye , M62N5RAze , & + M62N5RDxe , M62N5RDye , M62N5RDze , M62N5TAxe , M62N5TAye , M62N5TAze , M62N5TDxss , & + M62N5TDyss , M62N5TDzss , M62N6FKxe , M62N6FKye , M62N6FKze , M62N6FMxe , M62N6FMye , & + M62N6FMze , M62N6MKxe , M62N6MKye , M62N6MKze , M62N6MMxe , M62N6MMye , M62N6MMze , & + M62N6RAxe , M62N6RAye , M62N6RAze , M62N6RDxe , M62N6RDye , M62N6RDze , M62N6TAxe , & + M62N6TAye , M62N6TAze , M62N6TDxss , M62N6TDyss , M62N6TDzss , M62N7FKxe , M62N7FKye , & + M62N7FKze , M62N7FMxe , M62N7FMye , M62N7FMze , M62N7MKxe , M62N7MKye , M62N7MKze , & + M62N7MMxe , M62N7MMye , M62N7MMze , M62N7RAxe , M62N7RAye , M62N7RAze , M62N7RDxe , & + M62N7RDye , M62N7RDze , M62N7TAxe , M62N7TAye , M62N7TAze , M62N7TDxss , M62N7TDyss , & + M62N7TDzss , M62N8FKxe , M62N8FKye , M62N8FKze , M62N8FMxe , M62N8FMye , M62N8FMze , & + M62N8MKxe , M62N8MKye , M62N8MKze , M62N8MMxe , M62N8MMye , M62N8MMze , M62N8RAxe , & + M62N8RAye , M62N8RAze , M62N8RDxe , M62N8RDye , M62N8RDze , M62N8TAxe , M62N8TAye , & + M62N8TAze , M62N8TDxss , M62N8TDyss , M62N8TDzss , M62N9FKxe , M62N9FKye , M62N9FKze , & + M62N9FMxe , M62N9FMye , M62N9FMze , M62N9MKxe , M62N9MKye , M62N9MKze , M62N9MMxe , & + M62N9MMye , M62N9MMze , M62N9RAxe , M62N9RAye , M62N9RAze , M62N9RDxe , M62N9RDye , & + M62N9RDze , M62N9TAxe , M62N9TAye , M62N9TAze , M62N9TDxss , M62N9TDyss , M62N9TDzss , & + M63N1FKxe , M63N1FKye , M63N1FKze , M63N1FMxe , M63N1FMye , M63N1FMze , M63N1MKxe , & + M63N1MKye , M63N1MKze , M63N1MMxe , M63N1MMye , M63N1MMze , M63N1RAxe , M63N1RAye , & + M63N1RAze , M63N1RDxe , M63N1RDye , M63N1RDze , M63N1TAxe , M63N1TAye , M63N1TAze , & + M63N1TDxss , M63N1TDyss , M63N1TDzss , M63N2FKxe , M63N2FKye , M63N2FKze , M63N2FMxe , & + M63N2FMye , M63N2FMze , M63N2MKxe , M63N2MKye , M63N2MKze , M63N2MMxe , M63N2MMye , & + M63N2MMze , M63N2RAxe , M63N2RAye , M63N2RAze , M63N2RDxe , M63N2RDye , M63N2RDze , & + M63N2TAxe , M63N2TAye , M63N2TAze , M63N2TDxss , M63N2TDyss , M63N2TDzss , M63N3FKxe , & + M63N3FKye , M63N3FKze , M63N3FMxe , M63N3FMye , M63N3FMze , M63N3MKxe , M63N3MKye , & + M63N3MKze , M63N3MMxe , M63N3MMye , M63N3MMze , M63N3RAxe , M63N3RAye , M63N3RAze , & + M63N3RDxe , M63N3RDye , M63N3RDze , M63N3TAxe , M63N3TAye , M63N3TAze , M63N3TDxss , & + M63N3TDyss , M63N3TDzss , M63N4FKxe , M63N4FKye , M63N4FKze , M63N4FMxe , M63N4FMye , & + M63N4FMze , M63N4MKxe , M63N4MKye , M63N4MKze , M63N4MMxe , M63N4MMye , M63N4MMze , & + M63N4RAxe , M63N4RAye , M63N4RAze , M63N4RDxe , M63N4RDye , M63N4RDze , M63N4TAxe , & + M63N4TAye , M63N4TAze , M63N4TDxss , M63N4TDyss , M63N4TDzss , M63N5FKxe , M63N5FKye , & + M63N5FKze , M63N5FMxe , M63N5FMye , M63N5FMze , M63N5MKxe , M63N5MKye , M63N5MKze , & + M63N5MMxe , M63N5MMye , M63N5MMze , M63N5RAxe , M63N5RAye , M63N5RAze , M63N5RDxe , & + M63N5RDye , M63N5RDze , M63N5TAxe , M63N5TAye , M63N5TAze , M63N5TDxss , M63N5TDyss , & + M63N5TDzss , M63N6FKxe , M63N6FKye , M63N6FKze , M63N6FMxe , M63N6FMye , M63N6FMze , & + M63N6MKxe , M63N6MKye , M63N6MKze , M63N6MMxe , M63N6MMye , M63N6MMze , M63N6RAxe , & + M63N6RAye , M63N6RAze , M63N6RDxe , M63N6RDye , M63N6RDze , M63N6TAxe , M63N6TAye , & + M63N6TAze , M63N6TDxss , M63N6TDyss , M63N6TDzss , M63N7FKxe , M63N7FKye , M63N7FKze , & + M63N7FMxe , M63N7FMye , M63N7FMze , M63N7MKxe , M63N7MKye , M63N7MKze , M63N7MMxe , & + M63N7MMye , M63N7MMze , M63N7RAxe , M63N7RAye , M63N7RAze , M63N7RDxe , M63N7RDye , & + M63N7RDze , M63N7TAxe , M63N7TAye , M63N7TAze , M63N7TDxss , M63N7TDyss , M63N7TDzss , & + M63N8FKxe , M63N8FKye , M63N8FKze , M63N8FMxe , M63N8FMye , M63N8FMze , M63N8MKxe , & + M63N8MKye , M63N8MKze , M63N8MMxe , M63N8MMye , M63N8MMze , M63N8RAxe , M63N8RAye , & + M63N8RAze , M63N8RDxe , M63N8RDye , M63N8RDze , M63N8TAxe , M63N8TAye , M63N8TAze , & + M63N8TDxss , M63N8TDyss , M63N8TDzss , M63N9FKxe , M63N9FKye , M63N9FKze , M63N9FMxe , & + M63N9FMye , M63N9FMze , M63N9MKxe , M63N9MKye , M63N9MKze , M63N9MMxe , M63N9MMye , & + M63N9MMze , M63N9RAxe , M63N9RAye , M63N9RAze , M63N9RDxe , M63N9RDye , M63N9RDze , & + M63N9TAxe , M63N9TAye , M63N9TAze , M63N9TDxss , M63N9TDyss , M63N9TDzss , M64N1FKxe , & + M64N1FKye , M64N1FKze , M64N1FMxe , M64N1FMye , M64N1FMze , M64N1MKxe , M64N1MKye , & + M64N1MKze , M64N1MMxe , M64N1MMye , M64N1MMze , M64N1RAxe , M64N1RAye , M64N1RAze , & + M64N1RDxe , M64N1RDye , M64N1RDze , M64N1TAxe , M64N1TAye , M64N1TAze , M64N1TDxss , & + M64N1TDyss , M64N1TDzss , M64N2FKxe , M64N2FKye , M64N2FKze , M64N2FMxe , M64N2FMye , & + M64N2FMze , M64N2MKxe , M64N2MKye , M64N2MKze , M64N2MMxe , M64N2MMye , M64N2MMze , & + M64N2RAxe , M64N2RAye , M64N2RAze , M64N2RDxe , M64N2RDye , M64N2RDze , M64N2TAxe , & + M64N2TAye , M64N2TAze , M64N2TDxss , M64N2TDyss , M64N2TDzss , M64N3FKxe , M64N3FKye , & + M64N3FKze , M64N3FMxe , M64N3FMye , M64N3FMze , M64N3MKxe , M64N3MKye , M64N3MKze , & + M64N3MMxe , M64N3MMye , M64N3MMze , M64N3RAxe , M64N3RAye , M64N3RAze , M64N3RDxe , & + M64N3RDye , M64N3RDze , M64N3TAxe , M64N3TAye , M64N3TAze , M64N3TDxss , M64N3TDyss , & + M64N3TDzss , M64N4FKxe , M64N4FKye , M64N4FKze , M64N4FMxe , M64N4FMye , M64N4FMze , & + M64N4MKxe , M64N4MKye , M64N4MKze , M64N4MMxe , M64N4MMye , M64N4MMze , M64N4RAxe , & + M64N4RAye , M64N4RAze , M64N4RDxe , M64N4RDye , M64N4RDze , M64N4TAxe , M64N4TAye , & + M64N4TAze , M64N4TDxss , M64N4TDyss , M64N4TDzss , M64N5FKxe , M64N5FKye , M64N5FKze , & + M64N5FMxe , M64N5FMye , M64N5FMze , M64N5MKxe , M64N5MKye , M64N5MKze , M64N5MMxe , & + M64N5MMye , M64N5MMze , M64N5RAxe , M64N5RAye , M64N5RAze , M64N5RDxe , M64N5RDye , & + M64N5RDze , M64N5TAxe , M64N5TAye , M64N5TAze , M64N5TDxss , M64N5TDyss , M64N5TDzss , & + M64N6FKxe , M64N6FKye , M64N6FKze , M64N6FMxe , M64N6FMye , M64N6FMze , M64N6MKxe , & + M64N6MKye , M64N6MKze , M64N6MMxe , M64N6MMye , M64N6MMze , M64N6RAxe , M64N6RAye , & + M64N6RAze , M64N6RDxe , M64N6RDye , M64N6RDze , M64N6TAxe , M64N6TAye , M64N6TAze , & + M64N6TDxss , M64N6TDyss , M64N6TDzss , M64N7FKxe , M64N7FKye , M64N7FKze , M64N7FMxe , & + M64N7FMye , M64N7FMze , M64N7MKxe , M64N7MKye , M64N7MKze , M64N7MMxe , M64N7MMye , & + M64N7MMze , M64N7RAxe , M64N7RAye , M64N7RAze , M64N7RDxe , M64N7RDye , M64N7RDze , & + M64N7TAxe , M64N7TAye , M64N7TAze , M64N7TDxss , M64N7TDyss , M64N7TDzss , M64N8FKxe , & + M64N8FKye , M64N8FKze , M64N8FMxe , M64N8FMye , M64N8FMze , M64N8MKxe , M64N8MKye , & + M64N8MKze , M64N8MMxe , M64N8MMye , M64N8MMze , M64N8RAxe , M64N8RAye , M64N8RAze , & + M64N8RDxe , M64N8RDye , M64N8RDze , M64N8TAxe , M64N8TAye , M64N8TAze , M64N8TDxss , & + M64N8TDyss , M64N8TDzss , M64N9FKxe , M64N9FKye , M64N9FKze , M64N9FMxe , M64N9FMye , & + M64N9FMze , M64N9MKxe , M64N9MKye , M64N9MKze , M64N9MMxe , M64N9MMye , M64N9MMze , & + M64N9RAxe , M64N9RAye , M64N9RAze , M64N9RDxe , M64N9RDye , M64N9RDze , M64N9TAxe , & + M64N9TAye , M64N9TAze , M64N9TDxss , M64N9TDyss , M64N9TDzss , M65N1FKxe , M65N1FKye , & + M65N1FKze , M65N1FMxe , M65N1FMye , M65N1FMze , M65N1MKxe , M65N1MKye , M65N1MKze , & + M65N1MMxe , M65N1MMye , M65N1MMze , M65N1RAxe , M65N1RAye , M65N1RAze , M65N1RDxe , & + M65N1RDye , M65N1RDze , M65N1TAxe , M65N1TAye , M65N1TAze , M65N1TDxss , M65N1TDyss , & + M65N1TDzss , M65N2FKxe , M65N2FKye , M65N2FKze , M65N2FMxe , M65N2FMye , M65N2FMze , & + M65N2MKxe , M65N2MKye , M65N2MKze , M65N2MMxe , M65N2MMye , M65N2MMze , M65N2RAxe , & + M65N2RAye , M65N2RAze , M65N2RDxe , M65N2RDye , M65N2RDze , M65N2TAxe , M65N2TAye , & + M65N2TAze , M65N2TDxss , M65N2TDyss , M65N2TDzss , M65N3FKxe , M65N3FKye , M65N3FKze , & + M65N3FMxe , M65N3FMye , M65N3FMze , M65N3MKxe , M65N3MKye , M65N3MKze , M65N3MMxe , & + M65N3MMye , M65N3MMze , M65N3RAxe , M65N3RAye , M65N3RAze , M65N3RDxe , M65N3RDye , & + M65N3RDze , M65N3TAxe , M65N3TAye , M65N3TAze , M65N3TDxss , M65N3TDyss , M65N3TDzss , & + M65N4FKxe , M65N4FKye , M65N4FKze , M65N4FMxe , M65N4FMye , M65N4FMze , M65N4MKxe , & + M65N4MKye , M65N4MKze , M65N4MMxe , M65N4MMye , M65N4MMze , M65N4RAxe , M65N4RAye , & + M65N4RAze , M65N4RDxe , M65N4RDye , M65N4RDze , M65N4TAxe , M65N4TAye , M65N4TAze , & + M65N4TDxss , M65N4TDyss , M65N4TDzss , M65N5FKxe , M65N5FKye , M65N5FKze , M65N5FMxe , & + M65N5FMye , M65N5FMze , M65N5MKxe , M65N5MKye , M65N5MKze , M65N5MMxe , M65N5MMye , & + M65N5MMze , M65N5RAxe , M65N5RAye , M65N5RAze , M65N5RDxe , M65N5RDye , M65N5RDze , & + M65N5TAxe , M65N5TAye , M65N5TAze , M65N5TDxss , M65N5TDyss , M65N5TDzss , M65N6FKxe , & + M65N6FKye , M65N6FKze , M65N6FMxe , M65N6FMye , M65N6FMze , M65N6MKxe , M65N6MKye , & + M65N6MKze , M65N6MMxe , M65N6MMye , M65N6MMze , M65N6RAxe , M65N6RAye , M65N6RAze , & + M65N6RDxe , M65N6RDye , M65N6RDze , M65N6TAxe , M65N6TAye , M65N6TAze , M65N6TDxss , & + M65N6TDyss , M65N6TDzss , M65N7FKxe , M65N7FKye , M65N7FKze , M65N7FMxe , M65N7FMye , & + M65N7FMze , M65N7MKxe , M65N7MKye , M65N7MKze , M65N7MMxe , M65N7MMye , M65N7MMze , & + M65N7RAxe , M65N7RAye , M65N7RAze , M65N7RDxe , M65N7RDye , M65N7RDze , M65N7TAxe , & + M65N7TAye , M65N7TAze , M65N7TDxss , M65N7TDyss , M65N7TDzss , M65N8FKxe , M65N8FKye , & + M65N8FKze , M65N8FMxe , M65N8FMye , M65N8FMze , M65N8MKxe , M65N8MKye , M65N8MKze , & + M65N8MMxe , M65N8MMye , M65N8MMze , M65N8RAxe , M65N8RAye , M65N8RAze , M65N8RDxe , & + M65N8RDye , M65N8RDze , M65N8TAxe , M65N8TAye , M65N8TAze , M65N8TDxss , M65N8TDyss , & + M65N8TDzss , M65N9FKxe , M65N9FKye , M65N9FKze , M65N9FMxe , M65N9FMye , M65N9FMze , & + M65N9MKxe , M65N9MKye , M65N9MKze , M65N9MMxe , M65N9MMye , M65N9MMze , M65N9RAxe , & + M65N9RAye , M65N9RAze , M65N9RDxe , M65N9RDye , M65N9RDze , M65N9TAxe , M65N9TAye , & + M65N9TAze , M65N9TDxss , M65N9TDyss , M65N9TDzss , M66N1FKxe , M66N1FKye , M66N1FKze , & + M66N1FMxe , M66N1FMye , M66N1FMze , M66N1MKxe , M66N1MKye , M66N1MKze , M66N1MMxe , & + M66N1MMye , M66N1MMze , M66N1RAxe , M66N1RAye , M66N1RAze , M66N1RDxe , M66N1RDye , & + M66N1RDze , M66N1TAxe , M66N1TAye , M66N1TAze , M66N1TDxss , M66N1TDyss , M66N1TDzss , & + M66N2FKxe , M66N2FKye , M66N2FKze , M66N2FMxe , M66N2FMye , M66N2FMze , M66N2MKxe , & + M66N2MKye , M66N2MKze , M66N2MMxe , M66N2MMye , M66N2MMze , M66N2RAxe , M66N2RAye , & + M66N2RAze , M66N2RDxe , M66N2RDye , M66N2RDze , M66N2TAxe , M66N2TAye , M66N2TAze , & + M66N2TDxss , M66N2TDyss , M66N2TDzss , M66N3FKxe , M66N3FKye , M66N3FKze , M66N3FMxe , & + M66N3FMye , M66N3FMze , M66N3MKxe , M66N3MKye , M66N3MKze , M66N3MMxe , M66N3MMye , & + M66N3MMze , M66N3RAxe , M66N3RAye , M66N3RAze , M66N3RDxe , M66N3RDye , M66N3RDze , & + M66N3TAxe , M66N3TAye , M66N3TAze , M66N3TDxss , M66N3TDyss , M66N3TDzss , M66N4FKxe , & + M66N4FKye , M66N4FKze , M66N4FMxe , M66N4FMye , M66N4FMze , M66N4MKxe , M66N4MKye , & + M66N4MKze , M66N4MMxe , M66N4MMye , M66N4MMze , M66N4RAxe , M66N4RAye , M66N4RAze , & + M66N4RDxe , M66N4RDye , M66N4RDze , M66N4TAxe , M66N4TAye , M66N4TAze , M66N4TDxss , & + M66N4TDyss , M66N4TDzss , M66N5FKxe , M66N5FKye , M66N5FKze , M66N5FMxe , M66N5FMye , & + M66N5FMze , M66N5MKxe , M66N5MKye , M66N5MKze , M66N5MMxe , M66N5MMye , M66N5MMze , & + M66N5RAxe , M66N5RAye , M66N5RAze , M66N5RDxe , M66N5RDye , M66N5RDze , M66N5TAxe , & + M66N5TAye , M66N5TAze , M66N5TDxss , M66N5TDyss , M66N5TDzss , M66N6FKxe , M66N6FKye , & + M66N6FKze , M66N6FMxe , M66N6FMye , M66N6FMze , M66N6MKxe , M66N6MKye , M66N6MKze , & + M66N6MMxe , M66N6MMye , M66N6MMze , M66N6RAxe , M66N6RAye , M66N6RAze , M66N6RDxe , & + M66N6RDye , M66N6RDze , M66N6TAxe , M66N6TAye , M66N6TAze , M66N6TDxss , M66N6TDyss , & + M66N6TDzss , M66N7FKxe , M66N7FKye , M66N7FKze , M66N7FMxe , M66N7FMye , M66N7FMze , & + M66N7MKxe , M66N7MKye , M66N7MKze , M66N7MMxe , M66N7MMye , M66N7MMze , M66N7RAxe , & + M66N7RAye , M66N7RAze , M66N7RDxe , M66N7RDye , M66N7RDze , M66N7TAxe , M66N7TAye , & + M66N7TAze , M66N7TDxss , M66N7TDyss , M66N7TDzss , M66N8FKxe , M66N8FKye , M66N8FKze , & + M66N8FMxe , M66N8FMye , M66N8FMze , M66N8MKxe , M66N8MKye , M66N8MKze , M66N8MMxe , & + M66N8MMye , M66N8MMze , M66N8RAxe , M66N8RAye , M66N8RAze , M66N8RDxe , M66N8RDye , & + M66N8RDze , M66N8TAxe , M66N8TAye , M66N8TAze , M66N8TDxss , M66N8TDyss , M66N8TDzss , & + M66N9FKxe , M66N9FKye , M66N9FKze , M66N9FMxe , M66N9FMye , M66N9FMze , M66N9MKxe , & + M66N9MKye , M66N9MKze , M66N9MMxe , M66N9MMye , M66N9MMze , M66N9RAxe , M66N9RAye , & + M66N9RAze , M66N9RDxe , M66N9RDye , M66N9RDze , M66N9TAxe , M66N9TAye , M66N9TAze , & + M66N9TDxss , M66N9TDyss , M66N9TDzss , M67N1FKxe , M67N1FKye , M67N1FKze , M67N1FMxe , & + M67N1FMye , M67N1FMze , M67N1MKxe , M67N1MKye , M67N1MKze , M67N1MMxe , M67N1MMye , & + M67N1MMze , M67N1RAxe , M67N1RAye , M67N1RAze , M67N1RDxe , M67N1RDye , M67N1RDze , & + M67N1TAxe , M67N1TAye , M67N1TAze , M67N1TDxss , M67N1TDyss , M67N1TDzss , M67N2FKxe , & + M67N2FKye , M67N2FKze , M67N2FMxe , M67N2FMye , M67N2FMze , M67N2MKxe , M67N2MKye , & + M67N2MKze , M67N2MMxe , M67N2MMye , M67N2MMze , M67N2RAxe , M67N2RAye , M67N2RAze , & + M67N2RDxe , M67N2RDye , M67N2RDze , M67N2TAxe , M67N2TAye , M67N2TAze , M67N2TDxss , & + M67N2TDyss , M67N2TDzss , M67N3FKxe , M67N3FKye , M67N3FKze , M67N3FMxe , M67N3FMye , & + M67N3FMze , M67N3MKxe , M67N3MKye , M67N3MKze , M67N3MMxe , M67N3MMye , M67N3MMze , & + M67N3RAxe , M67N3RAye , M67N3RAze , M67N3RDxe , M67N3RDye , M67N3RDze , M67N3TAxe , & + M67N3TAye , M67N3TAze , M67N3TDxss , M67N3TDyss , M67N3TDzss , M67N4FKxe , M67N4FKye , & + M67N4FKze , M67N4FMxe , M67N4FMye , M67N4FMze , M67N4MKxe , M67N4MKye , M67N4MKze , & + M67N4MMxe , M67N4MMye , M67N4MMze , M67N4RAxe , M67N4RAye , M67N4RAze , M67N4RDxe , & + M67N4RDye , M67N4RDze , M67N4TAxe , M67N4TAye , M67N4TAze , M67N4TDxss , M67N4TDyss , & + M67N4TDzss , M67N5FKxe , M67N5FKye , M67N5FKze , M67N5FMxe , M67N5FMye , M67N5FMze , & + M67N5MKxe , M67N5MKye , M67N5MKze , M67N5MMxe , M67N5MMye , M67N5MMze , M67N5RAxe , & + M67N5RAye , M67N5RAze , M67N5RDxe , M67N5RDye , M67N5RDze , M67N5TAxe , M67N5TAye , & + M67N5TAze , M67N5TDxss , M67N5TDyss , M67N5TDzss , M67N6FKxe , M67N6FKye , M67N6FKze , & + M67N6FMxe , M67N6FMye , M67N6FMze , M67N6MKxe , M67N6MKye , M67N6MKze , M67N6MMxe , & + M67N6MMye , M67N6MMze , M67N6RAxe , M67N6RAye , M67N6RAze , M67N6RDxe , M67N6RDye , & + M67N6RDze , M67N6TAxe , M67N6TAye , M67N6TAze , M67N6TDxss , M67N6TDyss , M67N6TDzss , & + M67N7FKxe , M67N7FKye , M67N7FKze , M67N7FMxe , M67N7FMye , M67N7FMze , M67N7MKxe , & + M67N7MKye , M67N7MKze , M67N7MMxe , M67N7MMye , M67N7MMze , M67N7RAxe , M67N7RAye , & + M67N7RAze , M67N7RDxe , M67N7RDye , M67N7RDze , M67N7TAxe , M67N7TAye , M67N7TAze , & + M67N7TDxss , M67N7TDyss , M67N7TDzss , M67N8FKxe , M67N8FKye , M67N8FKze , M67N8FMxe , & + M67N8FMye , M67N8FMze , M67N8MKxe , M67N8MKye , M67N8MKze , M67N8MMxe , M67N8MMye , & + M67N8MMze , M67N8RAxe , M67N8RAye , M67N8RAze , M67N8RDxe , M67N8RDye , M67N8RDze , & + M67N8TAxe , M67N8TAye , M67N8TAze , M67N8TDxss , M67N8TDyss , M67N8TDzss , M67N9FKxe , & + M67N9FKye , M67N9FKze , M67N9FMxe , M67N9FMye , M67N9FMze , M67N9MKxe , M67N9MKye , & + M67N9MKze , M67N9MMxe , M67N9MMye , M67N9MMze , M67N9RAxe , M67N9RAye , M67N9RAze , & + M67N9RDxe , M67N9RDye , M67N9RDze , M67N9TAxe , M67N9TAye , M67N9TAze , M67N9TDxss , & + M67N9TDyss , M67N9TDzss , M68N1FKxe , M68N1FKye , M68N1FKze , M68N1FMxe , M68N1FMye , & + M68N1FMze , M68N1MKxe , M68N1MKye , M68N1MKze , M68N1MMxe , M68N1MMye , M68N1MMze , & + M68N1RAxe , M68N1RAye , M68N1RAze , M68N1RDxe , M68N1RDye , M68N1RDze , M68N1TAxe , & + M68N1TAye , M68N1TAze , M68N1TDxss , M68N1TDyss , M68N1TDzss , M68N2FKxe , M68N2FKye , & + M68N2FKze , M68N2FMxe , M68N2FMye , M68N2FMze , M68N2MKxe , M68N2MKye , M68N2MKze , & + M68N2MMxe , M68N2MMye , M68N2MMze , M68N2RAxe , M68N2RAye , M68N2RAze , M68N2RDxe , & + M68N2RDye , M68N2RDze , M68N2TAxe , M68N2TAye , M68N2TAze , M68N2TDxss , M68N2TDyss , & + M68N2TDzss , M68N3FKxe , M68N3FKye , M68N3FKze , M68N3FMxe , M68N3FMye , M68N3FMze , & + M68N3MKxe , M68N3MKye , M68N3MKze , M68N3MMxe , M68N3MMye , M68N3MMze , M68N3RAxe , & + M68N3RAye , M68N3RAze , M68N3RDxe , M68N3RDye , M68N3RDze , M68N3TAxe , M68N3TAye , & + M68N3TAze , M68N3TDxss , M68N3TDyss , M68N3TDzss , M68N4FKxe , M68N4FKye , M68N4FKze , & + M68N4FMxe , M68N4FMye , M68N4FMze , M68N4MKxe , M68N4MKye , M68N4MKze , M68N4MMxe , & + M68N4MMye , M68N4MMze , M68N4RAxe , M68N4RAye , M68N4RAze , M68N4RDxe , M68N4RDye , & + M68N4RDze , M68N4TAxe , M68N4TAye , M68N4TAze , M68N4TDxss , M68N4TDyss , M68N4TDzss , & + M68N5FKxe , M68N5FKye , M68N5FKze , M68N5FMxe , M68N5FMye , M68N5FMze , M68N5MKxe , & + M68N5MKye , M68N5MKze , M68N5MMxe , M68N5MMye , M68N5MMze , M68N5RAxe , M68N5RAye , & + M68N5RAze , M68N5RDxe , M68N5RDye , M68N5RDze , M68N5TAxe , M68N5TAye , M68N5TAze , & + M68N5TDxss , M68N5TDyss , M68N5TDzss , M68N6FKxe , M68N6FKye , M68N6FKze , M68N6FMxe , & + M68N6FMye , M68N6FMze , M68N6MKxe , M68N6MKye , M68N6MKze , M68N6MMxe , M68N6MMye , & + M68N6MMze , M68N6RAxe , M68N6RAye , M68N6RAze , M68N6RDxe , M68N6RDye , M68N6RDze , & + M68N6TAxe , M68N6TAye , M68N6TAze , M68N6TDxss , M68N6TDyss , M68N6TDzss , M68N7FKxe , & + M68N7FKye , M68N7FKze , M68N7FMxe , M68N7FMye , M68N7FMze , M68N7MKxe , M68N7MKye , & + M68N7MKze , M68N7MMxe , M68N7MMye , M68N7MMze , M68N7RAxe , M68N7RAye , M68N7RAze , & + M68N7RDxe , M68N7RDye , M68N7RDze , M68N7TAxe , M68N7TAye , M68N7TAze , M68N7TDxss , & + M68N7TDyss , M68N7TDzss , M68N8FKxe , M68N8FKye , M68N8FKze , M68N8FMxe , M68N8FMye , & + M68N8FMze , M68N8MKxe , M68N8MKye , M68N8MKze , M68N8MMxe , M68N8MMye , M68N8MMze , & + M68N8RAxe , M68N8RAye , M68N8RAze , M68N8RDxe , M68N8RDye , M68N8RDze , M68N8TAxe , & + M68N8TAye , M68N8TAze , M68N8TDxss , M68N8TDyss , M68N8TDzss , M68N9FKxe , M68N9FKye , & + M68N9FKze , M68N9FMxe , M68N9FMye , M68N9FMze , M68N9MKxe , M68N9MKye , M68N9MKze , & + M68N9MMxe , M68N9MMye , M68N9MMze , M68N9RAxe , M68N9RAye , M68N9RAze , M68N9RDxe , & + M68N9RDye , M68N9RDze , M68N9TAxe , M68N9TAye , M68N9TAze , M68N9TDxss , M68N9TDyss , & + M68N9TDzss , M69N1FKxe , M69N1FKye , M69N1FKze , M69N1FMxe , M69N1FMye , M69N1FMze , & + M69N1MKxe , M69N1MKye , M69N1MKze , M69N1MMxe , M69N1MMye , M69N1MMze , M69N1RAxe , & + M69N1RAye , M69N1RAze , M69N1RDxe , M69N1RDye , M69N1RDze , M69N1TAxe , M69N1TAye , & + M69N1TAze , M69N1TDxss , M69N1TDyss , M69N1TDzss , M69N2FKxe , M69N2FKye , M69N2FKze , & + M69N2FMxe , M69N2FMye , M69N2FMze , M69N2MKxe , M69N2MKye , M69N2MKze , M69N2MMxe , & + M69N2MMye , M69N2MMze , M69N2RAxe , M69N2RAye , M69N2RAze , M69N2RDxe , M69N2RDye , & + M69N2RDze , M69N2TAxe , M69N2TAye , M69N2TAze , M69N2TDxss , M69N2TDyss , M69N2TDzss , & + M69N3FKxe , M69N3FKye , M69N3FKze , M69N3FMxe , M69N3FMye , M69N3FMze , M69N3MKxe , & + M69N3MKye , M69N3MKze , M69N3MMxe , M69N3MMye , M69N3MMze , M69N3RAxe , M69N3RAye , & + M69N3RAze , M69N3RDxe , M69N3RDye , M69N3RDze , M69N3TAxe , M69N3TAye , M69N3TAze , & + M69N3TDxss , M69N3TDyss , M69N3TDzss , M69N4FKxe , M69N4FKye , M69N4FKze , M69N4FMxe , & + M69N4FMye , M69N4FMze , M69N4MKxe , M69N4MKye , M69N4MKze , M69N4MMxe , M69N4MMye , & + M69N4MMze , M69N4RAxe , M69N4RAye , M69N4RAze , M69N4RDxe , M69N4RDye , M69N4RDze , & + M69N4TAxe , M69N4TAye , M69N4TAze , M69N4TDxss , M69N4TDyss , M69N4TDzss , M69N5FKxe , & + M69N5FKye , M69N5FKze , M69N5FMxe , M69N5FMye , M69N5FMze , M69N5MKxe , M69N5MKye , & + M69N5MKze , M69N5MMxe , M69N5MMye , M69N5MMze , M69N5RAxe , M69N5RAye , M69N5RAze , & + M69N5RDxe , M69N5RDye , M69N5RDze , M69N5TAxe , M69N5TAye , M69N5TAze , M69N5TDxss , & + M69N5TDyss , M69N5TDzss , M69N6FKxe , M69N6FKye , M69N6FKze , M69N6FMxe , M69N6FMye , & + M69N6FMze , M69N6MKxe , M69N6MKye , M69N6MKze , M69N6MMxe , M69N6MMye , M69N6MMze , & + M69N6RAxe , M69N6RAye , M69N6RAze , M69N6RDxe , M69N6RDye , M69N6RDze , M69N6TAxe , & + M69N6TAye , M69N6TAze , M69N6TDxss , M69N6TDyss , M69N6TDzss , M69N7FKxe , M69N7FKye , & + M69N7FKze , M69N7FMxe , M69N7FMye , M69N7FMze , M69N7MKxe , M69N7MKye , M69N7MKze , & + M69N7MMxe , M69N7MMye , M69N7MMze , M69N7RAxe , M69N7RAye , M69N7RAze , M69N7RDxe , & + M69N7RDye , M69N7RDze , M69N7TAxe , M69N7TAye , M69N7TAze , M69N7TDxss , M69N7TDyss , & + M69N7TDzss , M69N8FKxe , M69N8FKye , M69N8FKze , M69N8FMxe , M69N8FMye , M69N8FMze , & + M69N8MKxe , M69N8MKye , M69N8MKze , M69N8MMxe , M69N8MMye , M69N8MMze , M69N8RAxe , & + M69N8RAye , M69N8RAze , M69N8RDxe , M69N8RDye , M69N8RDze , M69N8TAxe , M69N8TAye , & + M69N8TAze , M69N8TDxss , M69N8TDyss , M69N8TDzss , M69N9FKxe , M69N9FKye , M69N9FKze , & + M69N9FMxe , M69N9FMye , M69N9FMze , M69N9MKxe , M69N9MKye , M69N9MKze , M69N9MMxe , & + M69N9MMye , M69N9MMze , M69N9RAxe , M69N9RAye , M69N9RAze , M69N9RDxe , M69N9RDye , & + M69N9RDze , M69N9TAxe , M69N9TAye , M69N9TAze , M69N9TDxss , M69N9TDyss , M69N9TDzss , & + M70N1FKxe , M70N1FKye , M70N1FKze , M70N1FMxe , M70N1FMye , M70N1FMze , M70N1MKxe , & + M70N1MKye , M70N1MKze , M70N1MMxe , M70N1MMye , M70N1MMze , M70N1RAxe , M70N1RAye , & + M70N1RAze , M70N1RDxe , M70N1RDye , M70N1RDze , M70N1TAxe , M70N1TAye , M70N1TAze , & + M70N1TDxss , M70N1TDyss , M70N1TDzss , M70N2FKxe , M70N2FKye , M70N2FKze , M70N2FMxe , & + M70N2FMye , M70N2FMze , M70N2MKxe , M70N2MKye , M70N2MKze , M70N2MMxe , M70N2MMye , & + M70N2MMze , M70N2RAxe , M70N2RAye , M70N2RAze , M70N2RDxe , M70N2RDye , M70N2RDze , & + M70N2TAxe , M70N2TAye , M70N2TAze , M70N2TDxss , M70N2TDyss , M70N2TDzss , M70N3FKxe , & + M70N3FKye , M70N3FKze , M70N3FMxe , M70N3FMye , M70N3FMze , M70N3MKxe , M70N3MKye , & + M70N3MKze , M70N3MMxe , M70N3MMye , M70N3MMze , M70N3RAxe , M70N3RAye , M70N3RAze /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry10(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M70N3RDxe , M70N3RDye , M70N3RDze , M70N3TAxe , M70N3TAye , M70N3TAze , M70N3TDxss , & + M70N3TDyss , M70N3TDzss , M70N4FKxe , M70N4FKye , M70N4FKze , M70N4FMxe , M70N4FMye , & + M70N4FMze , M70N4MKxe , M70N4MKye , M70N4MKze , M70N4MMxe , M70N4MMye , M70N4MMze , & + M70N4RAxe , M70N4RAye , M70N4RAze , M70N4RDxe , M70N4RDye , M70N4RDze , M70N4TAxe , & + M70N4TAye , M70N4TAze , M70N4TDxss , M70N4TDyss , M70N4TDzss , M70N5FKxe , M70N5FKye , & + M70N5FKze , M70N5FMxe , M70N5FMye , M70N5FMze , M70N5MKxe , M70N5MKye , M70N5MKze , & + M70N5MMxe , M70N5MMye , M70N5MMze , M70N5RAxe , M70N5RAye , M70N5RAze , M70N5RDxe , & + M70N5RDye , M70N5RDze , M70N5TAxe , M70N5TAye , M70N5TAze , M70N5TDxss , M70N5TDyss , & + M70N5TDzss , M70N6FKxe , M70N6FKye , M70N6FKze , M70N6FMxe , M70N6FMye , M70N6FMze , & + M70N6MKxe , M70N6MKye , M70N6MKze , M70N6MMxe , M70N6MMye , M70N6MMze , M70N6RAxe , & + M70N6RAye , M70N6RAze , M70N6RDxe , M70N6RDye , M70N6RDze , M70N6TAxe , M70N6TAye , & + M70N6TAze , M70N6TDxss , M70N6TDyss , M70N6TDzss , M70N7FKxe , M70N7FKye , M70N7FKze , & + M70N7FMxe , M70N7FMye , M70N7FMze , M70N7MKxe , M70N7MKye , M70N7MKze , M70N7MMxe , & + M70N7MMye , M70N7MMze , M70N7RAxe , M70N7RAye , M70N7RAze , M70N7RDxe , M70N7RDye , & + M70N7RDze , M70N7TAxe , M70N7TAye , M70N7TAze , M70N7TDxss , M70N7TDyss , M70N7TDzss , & + M70N8FKxe , M70N8FKye , M70N8FKze , M70N8FMxe , M70N8FMye , M70N8FMze , M70N8MKxe , & + M70N8MKye , M70N8MKze , M70N8MMxe , M70N8MMye , M70N8MMze , M70N8RAxe , M70N8RAye , & + M70N8RAze , M70N8RDxe , M70N8RDye , M70N8RDze , M70N8TAxe , M70N8TAye , M70N8TAze , & + M70N8TDxss , M70N8TDyss , M70N8TDzss , M70N9FKxe , M70N9FKye , M70N9FKze , M70N9FMxe , & + M70N9FMye , M70N9FMze , M70N9MKxe , M70N9MKye , M70N9MKze , M70N9MMxe , M70N9MMye , & + M70N9MMze , M70N9RAxe , M70N9RAye , M70N9RAze , M70N9RDxe , M70N9RDye , M70N9RDze , & + M70N9TAxe , M70N9TAye , M70N9TAze , M70N9TDxss , M70N9TDyss , M70N9TDzss , M71N1FKxe , & + M71N1FKye , M71N1FKze , M71N1FMxe , M71N1FMye , M71N1FMze , M71N1MKxe , M71N1MKye , & + M71N1MKze , M71N1MMxe , M71N1MMye , M71N1MMze , M71N1RAxe , M71N1RAye , M71N1RAze , & + M71N1RDxe , M71N1RDye , M71N1RDze , M71N1TAxe , M71N1TAye , M71N1TAze , M71N1TDxss , & + M71N1TDyss , M71N1TDzss , M71N2FKxe , M71N2FKye , M71N2FKze , M71N2FMxe , M71N2FMye , & + M71N2FMze , M71N2MKxe , M71N2MKye , M71N2MKze , M71N2MMxe , M71N2MMye , M71N2MMze , & + M71N2RAxe , M71N2RAye , M71N2RAze , M71N2RDxe , M71N2RDye , M71N2RDze , M71N2TAxe , & + M71N2TAye , M71N2TAze , M71N2TDxss , M71N2TDyss , M71N2TDzss , M71N3FKxe , M71N3FKye , & + M71N3FKze , M71N3FMxe , M71N3FMye , M71N3FMze , M71N3MKxe , M71N3MKye , M71N3MKze , & + M71N3MMxe , M71N3MMye , M71N3MMze , M71N3RAxe , M71N3RAye , M71N3RAze , M71N3RDxe , & + M71N3RDye , M71N3RDze , M71N3TAxe , M71N3TAye , M71N3TAze , M71N3TDxss , M71N3TDyss , & + M71N3TDzss , M71N4FKxe , M71N4FKye , M71N4FKze , M71N4FMxe , M71N4FMye , M71N4FMze , & + M71N4MKxe , M71N4MKye , M71N4MKze , M71N4MMxe , M71N4MMye , M71N4MMze , M71N4RAxe , & + M71N4RAye , M71N4RAze , M71N4RDxe , M71N4RDye , M71N4RDze , M71N4TAxe , M71N4TAye , & + M71N4TAze , M71N4TDxss , M71N4TDyss , M71N4TDzss , M71N5FKxe , M71N5FKye , M71N5FKze , & + M71N5FMxe , M71N5FMye , M71N5FMze , M71N5MKxe , M71N5MKye , M71N5MKze , M71N5MMxe , & + M71N5MMye , M71N5MMze , M71N5RAxe , M71N5RAye , M71N5RAze , M71N5RDxe , M71N5RDye , & + M71N5RDze , M71N5TAxe , M71N5TAye , M71N5TAze , M71N5TDxss , M71N5TDyss , M71N5TDzss , & + M71N6FKxe , M71N6FKye , M71N6FKze , M71N6FMxe , M71N6FMye , M71N6FMze , M71N6MKxe , & + M71N6MKye , M71N6MKze , M71N6MMxe , M71N6MMye , M71N6MMze , M71N6RAxe , M71N6RAye , & + M71N6RAze , M71N6RDxe , M71N6RDye , M71N6RDze , M71N6TAxe , M71N6TAye , M71N6TAze , & + M71N6TDxss , M71N6TDyss , M71N6TDzss , M71N7FKxe , M71N7FKye , M71N7FKze , M71N7FMxe , & + M71N7FMye , M71N7FMze , M71N7MKxe , M71N7MKye , M71N7MKze , M71N7MMxe , M71N7MMye , & + M71N7MMze , M71N7RAxe , M71N7RAye , M71N7RAze , M71N7RDxe , M71N7RDye , M71N7RDze , & + M71N7TAxe , M71N7TAye , M71N7TAze , M71N7TDxss , M71N7TDyss , M71N7TDzss , M71N8FKxe , & + M71N8FKye , M71N8FKze , M71N8FMxe , M71N8FMye , M71N8FMze , M71N8MKxe , M71N8MKye , & + M71N8MKze , M71N8MMxe , M71N8MMye , M71N8MMze , M71N8RAxe , M71N8RAye , M71N8RAze , & + M71N8RDxe , M71N8RDye , M71N8RDze , M71N8TAxe , M71N8TAye , M71N8TAze , M71N8TDxss , & + M71N8TDyss , M71N8TDzss , M71N9FKxe , M71N9FKye , M71N9FKze , M71N9FMxe , M71N9FMye , & + M71N9FMze , M71N9MKxe , M71N9MKye , M71N9MKze , M71N9MMxe , M71N9MMye , M71N9MMze , & + M71N9RAxe , M71N9RAye , M71N9RAze , M71N9RDxe , M71N9RDye , M71N9RDze , M71N9TAxe , & + M71N9TAye , M71N9TAze , M71N9TDxss , M71N9TDyss , M71N9TDzss , M72N1FKxe , M72N1FKye , & + M72N1FKze , M72N1FMxe , M72N1FMye , M72N1FMze , M72N1MKxe , M72N1MKye , M72N1MKze , & + M72N1MMxe , M72N1MMye , M72N1MMze , M72N1RAxe , M72N1RAye , M72N1RAze , M72N1RDxe , & + M72N1RDye , M72N1RDze , M72N1TAxe , M72N1TAye , M72N1TAze , M72N1TDxss , M72N1TDyss , & + M72N1TDzss , M72N2FKxe , M72N2FKye , M72N2FKze , M72N2FMxe , M72N2FMye , M72N2FMze , & + M72N2MKxe , M72N2MKye , M72N2MKze , M72N2MMxe , M72N2MMye , M72N2MMze , M72N2RAxe , & + M72N2RAye , M72N2RAze , M72N2RDxe , M72N2RDye , M72N2RDze , M72N2TAxe , M72N2TAye , & + M72N2TAze , M72N2TDxss , M72N2TDyss , M72N2TDzss , M72N3FKxe , M72N3FKye , M72N3FKze , & + M72N3FMxe , M72N3FMye , M72N3FMze , M72N3MKxe , M72N3MKye , M72N3MKze , M72N3MMxe , & + M72N3MMye , M72N3MMze , M72N3RAxe , M72N3RAye , M72N3RAze , M72N3RDxe , M72N3RDye , & + M72N3RDze , M72N3TAxe , M72N3TAye , M72N3TAze , M72N3TDxss , M72N3TDyss , M72N3TDzss , & + M72N4FKxe , M72N4FKye , M72N4FKze , M72N4FMxe , M72N4FMye , M72N4FMze , M72N4MKxe , & + M72N4MKye , M72N4MKze , M72N4MMxe , M72N4MMye , M72N4MMze , M72N4RAxe , M72N4RAye , & + M72N4RAze , M72N4RDxe , M72N4RDye , M72N4RDze , M72N4TAxe , M72N4TAye , M72N4TAze , & + M72N4TDxss , M72N4TDyss , M72N4TDzss , M72N5FKxe , M72N5FKye , M72N5FKze , M72N5FMxe , & + M72N5FMye , M72N5FMze , M72N5MKxe , M72N5MKye , M72N5MKze , M72N5MMxe , M72N5MMye , & + M72N5MMze , M72N5RAxe , M72N5RAye , M72N5RAze , M72N5RDxe , M72N5RDye , M72N5RDze , & + M72N5TAxe , M72N5TAye , M72N5TAze , M72N5TDxss , M72N5TDyss , M72N5TDzss , M72N6FKxe , & + M72N6FKye , M72N6FKze , M72N6FMxe , M72N6FMye , M72N6FMze , M72N6MKxe , M72N6MKye , & + M72N6MKze , M72N6MMxe , M72N6MMye , M72N6MMze , M72N6RAxe , M72N6RAye , M72N6RAze , & + M72N6RDxe , M72N6RDye , M72N6RDze , M72N6TAxe , M72N6TAye , M72N6TAze , M72N6TDxss , & + M72N6TDyss , M72N6TDzss , M72N7FKxe , M72N7FKye , M72N7FKze , M72N7FMxe , M72N7FMye , & + M72N7FMze , M72N7MKxe , M72N7MKye , M72N7MKze , M72N7MMxe , M72N7MMye , M72N7MMze , & + M72N7RAxe , M72N7RAye , M72N7RAze , M72N7RDxe , M72N7RDye , M72N7RDze , M72N7TAxe , & + M72N7TAye , M72N7TAze , M72N7TDxss , M72N7TDyss , M72N7TDzss , M72N8FKxe , M72N8FKye , & + M72N8FKze , M72N8FMxe , M72N8FMye , M72N8FMze , M72N8MKxe , M72N8MKye , M72N8MKze , & + M72N8MMxe , M72N8MMye , M72N8MMze , M72N8RAxe , M72N8RAye , M72N8RAze , M72N8RDxe , & + M72N8RDye , M72N8RDze , M72N8TAxe , M72N8TAye , M72N8TAze , M72N8TDxss , M72N8TDyss , & + M72N8TDzss , M72N9FKxe , M72N9FKye , M72N9FKze , M72N9FMxe , M72N9FMye , M72N9FMze , & + M72N9MKxe , M72N9MKye , M72N9MKze , M72N9MMxe , M72N9MMye , M72N9MMze , M72N9RAxe , & + M72N9RAye , M72N9RAze , M72N9RDxe , M72N9RDye , M72N9RDze , M72N9TAxe , M72N9TAye , & + M72N9TAze , M72N9TDxss , M72N9TDyss , M72N9TDzss , M73N1FKxe , M73N1FKye , M73N1FKze , & + M73N1FMxe , M73N1FMye , M73N1FMze , M73N1MKxe , M73N1MKye , M73N1MKze , M73N1MMxe , & + M73N1MMye , M73N1MMze , M73N1RAxe , M73N1RAye , M73N1RAze , M73N1RDxe , M73N1RDye , & + M73N1RDze , M73N1TAxe , M73N1TAye , M73N1TAze , M73N1TDxss , M73N1TDyss , M73N1TDzss , & + M73N2FKxe , M73N2FKye , M73N2FKze , M73N2FMxe , M73N2FMye , M73N2FMze , M73N2MKxe , & + M73N2MKye , M73N2MKze , M73N2MMxe , M73N2MMye , M73N2MMze , M73N2RAxe , M73N2RAye , & + M73N2RAze , M73N2RDxe , M73N2RDye , M73N2RDze , M73N2TAxe , M73N2TAye , M73N2TAze , & + M73N2TDxss , M73N2TDyss , M73N2TDzss , M73N3FKxe , M73N3FKye , M73N3FKze , M73N3FMxe , & + M73N3FMye , M73N3FMze , M73N3MKxe , M73N3MKye , M73N3MKze , M73N3MMxe , M73N3MMye , & + M73N3MMze , M73N3RAxe , M73N3RAye , M73N3RAze , M73N3RDxe , M73N3RDye , M73N3RDze , & + M73N3TAxe , M73N3TAye , M73N3TAze , M73N3TDxss , M73N3TDyss , M73N3TDzss , M73N4FKxe , & + M73N4FKye , M73N4FKze , M73N4FMxe , M73N4FMye , M73N4FMze , M73N4MKxe , M73N4MKye , & + M73N4MKze , M73N4MMxe , M73N4MMye , M73N4MMze , M73N4RAxe , M73N4RAye , M73N4RAze , & + M73N4RDxe , M73N4RDye , M73N4RDze , M73N4TAxe , M73N4TAye , M73N4TAze , M73N4TDxss , & + M73N4TDyss , M73N4TDzss , M73N5FKxe , M73N5FKye , M73N5FKze , M73N5FMxe , M73N5FMye , & + M73N5FMze , M73N5MKxe , M73N5MKye , M73N5MKze , M73N5MMxe , M73N5MMye , M73N5MMze , & + M73N5RAxe , M73N5RAye , M73N5RAze , M73N5RDxe , M73N5RDye , M73N5RDze , M73N5TAxe , & + M73N5TAye , M73N5TAze , M73N5TDxss , M73N5TDyss , M73N5TDzss , M73N6FKxe , M73N6FKye , & + M73N6FKze , M73N6FMxe , M73N6FMye , M73N6FMze , M73N6MKxe , M73N6MKye , M73N6MKze , & + M73N6MMxe , M73N6MMye , M73N6MMze , M73N6RAxe , M73N6RAye , M73N6RAze , M73N6RDxe , & + M73N6RDye , M73N6RDze , M73N6TAxe , M73N6TAye , M73N6TAze , M73N6TDxss , M73N6TDyss , & + M73N6TDzss , M73N7FKxe , M73N7FKye , M73N7FKze , M73N7FMxe , M73N7FMye , M73N7FMze , & + M73N7MKxe , M73N7MKye , M73N7MKze , M73N7MMxe , M73N7MMye , M73N7MMze , M73N7RAxe , & + M73N7RAye , M73N7RAze , M73N7RDxe , M73N7RDye , M73N7RDze , M73N7TAxe , M73N7TAye , & + M73N7TAze , M73N7TDxss , M73N7TDyss , M73N7TDzss , M73N8FKxe , M73N8FKye , M73N8FKze , & + M73N8FMxe , M73N8FMye , M73N8FMze , M73N8MKxe , M73N8MKye , M73N8MKze , M73N8MMxe , & + M73N8MMye , M73N8MMze , M73N8RAxe , M73N8RAye , M73N8RAze , M73N8RDxe , M73N8RDye , & + M73N8RDze , M73N8TAxe , M73N8TAye , M73N8TAze , M73N8TDxss , M73N8TDyss , M73N8TDzss , & + M73N9FKxe , M73N9FKye , M73N9FKze , M73N9FMxe , M73N9FMye , M73N9FMze , M73N9MKxe , & + M73N9MKye , M73N9MKze , M73N9MMxe , M73N9MMye , M73N9MMze , M73N9RAxe , M73N9RAye , & + M73N9RAze , M73N9RDxe , M73N9RDye , M73N9RDze , M73N9TAxe , M73N9TAye , M73N9TAze , & + M73N9TDxss , M73N9TDyss , M73N9TDzss , M74N1FKxe , M74N1FKye , M74N1FKze , M74N1FMxe , & + M74N1FMye , M74N1FMze , M74N1MKxe , M74N1MKye , M74N1MKze , M74N1MMxe , M74N1MMye , & + M74N1MMze , M74N1RAxe , M74N1RAye , M74N1RAze , M74N1RDxe , M74N1RDye , M74N1RDze , & + M74N1TAxe , M74N1TAye , M74N1TAze , M74N1TDxss , M74N1TDyss , M74N1TDzss , M74N2FKxe , & + M74N2FKye , M74N2FKze , M74N2FMxe , M74N2FMye , M74N2FMze , M74N2MKxe , M74N2MKye , & + M74N2MKze , M74N2MMxe , M74N2MMye , M74N2MMze , M74N2RAxe , M74N2RAye , M74N2RAze , & + M74N2RDxe , M74N2RDye , M74N2RDze , M74N2TAxe , M74N2TAye , M74N2TAze , M74N2TDxss , & + M74N2TDyss , M74N2TDzss , M74N3FKxe , M74N3FKye , M74N3FKze , M74N3FMxe , M74N3FMye , & + M74N3FMze , M74N3MKxe , M74N3MKye , M74N3MKze , M74N3MMxe , M74N3MMye , M74N3MMze , & + M74N3RAxe , M74N3RAye , M74N3RAze , M74N3RDxe , M74N3RDye , M74N3RDze , M74N3TAxe , & + M74N3TAye , M74N3TAze , M74N3TDxss , M74N3TDyss , M74N3TDzss , M74N4FKxe , M74N4FKye , & + M74N4FKze , M74N4FMxe , M74N4FMye , M74N4FMze , M74N4MKxe , M74N4MKye , M74N4MKze , & + M74N4MMxe , M74N4MMye , M74N4MMze , M74N4RAxe , M74N4RAye , M74N4RAze , M74N4RDxe , & + M74N4RDye , M74N4RDze , M74N4TAxe , M74N4TAye , M74N4TAze , M74N4TDxss , M74N4TDyss , & + M74N4TDzss , M74N5FKxe , M74N5FKye , M74N5FKze , M74N5FMxe , M74N5FMye , M74N5FMze , & + M74N5MKxe , M74N5MKye , M74N5MKze , M74N5MMxe , M74N5MMye , M74N5MMze , M74N5RAxe , & + M74N5RAye , M74N5RAze , M74N5RDxe , M74N5RDye , M74N5RDze , M74N5TAxe , M74N5TAye , & + M74N5TAze , M74N5TDxss , M74N5TDyss , M74N5TDzss , M74N6FKxe , M74N6FKye , M74N6FKze , & + M74N6FMxe , M74N6FMye , M74N6FMze , M74N6MKxe , M74N6MKye , M74N6MKze , M74N6MMxe , & + M74N6MMye , M74N6MMze , M74N6RAxe , M74N6RAye , M74N6RAze , M74N6RDxe , M74N6RDye , & + M74N6RDze , M74N6TAxe , M74N6TAye , M74N6TAze , M74N6TDxss , M74N6TDyss , M74N6TDzss , & + M74N7FKxe , M74N7FKye , M74N7FKze , M74N7FMxe , M74N7FMye , M74N7FMze , M74N7MKxe , & + M74N7MKye , M74N7MKze , M74N7MMxe , M74N7MMye , M74N7MMze , M74N7RAxe , M74N7RAye , & + M74N7RAze , M74N7RDxe , M74N7RDye , M74N7RDze , M74N7TAxe , M74N7TAye , M74N7TAze , & + M74N7TDxss , M74N7TDyss , M74N7TDzss , M74N8FKxe , M74N8FKye , M74N8FKze , M74N8FMxe , & + M74N8FMye , M74N8FMze , M74N8MKxe , M74N8MKye , M74N8MKze , M74N8MMxe , M74N8MMye , & + M74N8MMze , M74N8RAxe , M74N8RAye , M74N8RAze , M74N8RDxe , M74N8RDye , M74N8RDze , & + M74N8TAxe , M74N8TAye , M74N8TAze , M74N8TDxss , M74N8TDyss , M74N8TDzss , M74N9FKxe , & + M74N9FKye , M74N9FKze , M74N9FMxe , M74N9FMye , M74N9FMze , M74N9MKxe , M74N9MKye , & + M74N9MKze , M74N9MMxe , M74N9MMye , M74N9MMze , M74N9RAxe , M74N9RAye , M74N9RAze , & + M74N9RDxe , M74N9RDye , M74N9RDze , M74N9TAxe , M74N9TAye , M74N9TAze , M74N9TDxss , & + M74N9TDyss , M74N9TDzss , M75N1FKxe , M75N1FKye , M75N1FKze , M75N1FMxe , M75N1FMye , & + M75N1FMze , M75N1MKxe , M75N1MKye , M75N1MKze , M75N1MMxe , M75N1MMye , M75N1MMze , & + M75N1RAxe , M75N1RAye , M75N1RAze , M75N1RDxe , M75N1RDye , M75N1RDze , M75N1TAxe , & + M75N1TAye , M75N1TAze , M75N1TDxss , M75N1TDyss , M75N1TDzss , M75N2FKxe , M75N2FKye , & + M75N2FKze , M75N2FMxe , M75N2FMye , M75N2FMze , M75N2MKxe , M75N2MKye , M75N2MKze , & + M75N2MMxe , M75N2MMye , M75N2MMze , M75N2RAxe , M75N2RAye , M75N2RAze , M75N2RDxe , & + M75N2RDye , M75N2RDze , M75N2TAxe , M75N2TAye , M75N2TAze , M75N2TDxss , M75N2TDyss , & + M75N2TDzss , M75N3FKxe , M75N3FKye , M75N3FKze , M75N3FMxe , M75N3FMye , M75N3FMze , & + M75N3MKxe , M75N3MKye , M75N3MKze , M75N3MMxe , M75N3MMye , M75N3MMze , M75N3RAxe , & + M75N3RAye , M75N3RAze , M75N3RDxe , M75N3RDye , M75N3RDze , M75N3TAxe , M75N3TAye , & + M75N3TAze , M75N3TDxss , M75N3TDyss , M75N3TDzss , M75N4FKxe , M75N4FKye , M75N4FKze , & + M75N4FMxe , M75N4FMye , M75N4FMze , M75N4MKxe , M75N4MKye , M75N4MKze , M75N4MMxe , & + M75N4MMye , M75N4MMze , M75N4RAxe , M75N4RAye , M75N4RAze , M75N4RDxe , M75N4RDye , & + M75N4RDze , M75N4TAxe , M75N4TAye , M75N4TAze , M75N4TDxss , M75N4TDyss , M75N4TDzss , & + M75N5FKxe , M75N5FKye , M75N5FKze , M75N5FMxe , M75N5FMye , M75N5FMze , M75N5MKxe , & + M75N5MKye , M75N5MKze , M75N5MMxe , M75N5MMye , M75N5MMze , M75N5RAxe , M75N5RAye , & + M75N5RAze , M75N5RDxe , M75N5RDye , M75N5RDze , M75N5TAxe , M75N5TAye , M75N5TAze , & + M75N5TDxss , M75N5TDyss , M75N5TDzss , M75N6FKxe , M75N6FKye , M75N6FKze , M75N6FMxe , & + M75N6FMye , M75N6FMze , M75N6MKxe , M75N6MKye , M75N6MKze , M75N6MMxe , M75N6MMye , & + M75N6MMze , M75N6RAxe , M75N6RAye , M75N6RAze , M75N6RDxe , M75N6RDye , M75N6RDze , & + M75N6TAxe , M75N6TAye , M75N6TAze , M75N6TDxss , M75N6TDyss , M75N6TDzss , M75N7FKxe , & + M75N7FKye , M75N7FKze , M75N7FMxe , M75N7FMye , M75N7FMze , M75N7MKxe , M75N7MKye , & + M75N7MKze , M75N7MMxe , M75N7MMye , M75N7MMze , M75N7RAxe , M75N7RAye , M75N7RAze , & + M75N7RDxe , M75N7RDye , M75N7RDze , M75N7TAxe , M75N7TAye , M75N7TAze , M75N7TDxss , & + M75N7TDyss , M75N7TDzss , M75N8FKxe , M75N8FKye , M75N8FKze , M75N8FMxe , M75N8FMye , & + M75N8FMze , M75N8MKxe , M75N8MKye , M75N8MKze , M75N8MMxe , M75N8MMye , M75N8MMze , & + M75N8RAxe , M75N8RAye , M75N8RAze , M75N8RDxe , M75N8RDye , M75N8RDze , M75N8TAxe , & + M75N8TAye , M75N8TAze , M75N8TDxss , M75N8TDyss , M75N8TDzss , M75N9FKxe , M75N9FKye , & + M75N9FKze , M75N9FMxe , M75N9FMye , M75N9FMze , M75N9MKxe , M75N9MKye , M75N9MKze , & + M75N9MMxe , M75N9MMye , M75N9MMze , M75N9RAxe , M75N9RAye , M75N9RAze , M75N9RDxe , & + M75N9RDye , M75N9RDze , M75N9TAxe , M75N9TAye , M75N9TAze , M75N9TDxss , M75N9TDyss , & + M75N9TDzss , M76N1FKxe , M76N1FKye , M76N1FKze , M76N1FMxe , M76N1FMye , M76N1FMze , & + M76N1MKxe , M76N1MKye , M76N1MKze , M76N1MMxe , M76N1MMye , M76N1MMze , M76N1RAxe , & + M76N1RAye , M76N1RAze , M76N1RDxe , M76N1RDye , M76N1RDze , M76N1TAxe , M76N1TAye , & + M76N1TAze , M76N1TDxss , M76N1TDyss , M76N1TDzss , M76N2FKxe , M76N2FKye , M76N2FKze , & + M76N2FMxe , M76N2FMye , M76N2FMze , M76N2MKxe , M76N2MKye , M76N2MKze , M76N2MMxe , & + M76N2MMye , M76N2MMze , M76N2RAxe , M76N2RAye , M76N2RAze , M76N2RDxe , M76N2RDye , & + M76N2RDze , M76N2TAxe , M76N2TAye , M76N2TAze , M76N2TDxss , M76N2TDyss , M76N2TDzss , & + M76N3FKxe , M76N3FKye , M76N3FKze , M76N3FMxe , M76N3FMye , M76N3FMze , M76N3MKxe , & + M76N3MKye , M76N3MKze , M76N3MMxe , M76N3MMye , M76N3MMze , M76N3RAxe , M76N3RAye , & + M76N3RAze , M76N3RDxe , M76N3RDye , M76N3RDze , M76N3TAxe , M76N3TAye , M76N3TAze , & + M76N3TDxss , M76N3TDyss , M76N3TDzss , M76N4FKxe , M76N4FKye , M76N4FKze , M76N4FMxe , & + M76N4FMye , M76N4FMze , M76N4MKxe , M76N4MKye , M76N4MKze , M76N4MMxe , M76N4MMye , & + M76N4MMze , M76N4RAxe , M76N4RAye , M76N4RAze , M76N4RDxe , M76N4RDye , M76N4RDze , & + M76N4TAxe , M76N4TAye , M76N4TAze , M76N4TDxss , M76N4TDyss , M76N4TDzss , M76N5FKxe , & + M76N5FKye , M76N5FKze , M76N5FMxe , M76N5FMye , M76N5FMze , M76N5MKxe , M76N5MKye , & + M76N5MKze , M76N5MMxe , M76N5MMye , M76N5MMze , M76N5RAxe , M76N5RAye , M76N5RAze , & + M76N5RDxe , M76N5RDye , M76N5RDze , M76N5TAxe , M76N5TAye , M76N5TAze , M76N5TDxss , & + M76N5TDyss , M76N5TDzss , M76N6FKxe , M76N6FKye , M76N6FKze , M76N6FMxe , M76N6FMye , & + M76N6FMze , M76N6MKxe , M76N6MKye , M76N6MKze , M76N6MMxe , M76N6MMye , M76N6MMze , & + M76N6RAxe , M76N6RAye , M76N6RAze , M76N6RDxe , M76N6RDye , M76N6RDze , M76N6TAxe , & + M76N6TAye , M76N6TAze , M76N6TDxss , M76N6TDyss , M76N6TDzss , M76N7FKxe , M76N7FKye , & + M76N7FKze , M76N7FMxe , M76N7FMye , M76N7FMze , M76N7MKxe , M76N7MKye , M76N7MKze , & + M76N7MMxe , M76N7MMye , M76N7MMze , M76N7RAxe , M76N7RAye , M76N7RAze , M76N7RDxe , & + M76N7RDye , M76N7RDze , M76N7TAxe , M76N7TAye , M76N7TAze , M76N7TDxss , M76N7TDyss , & + M76N7TDzss , M76N8FKxe , M76N8FKye , M76N8FKze , M76N8FMxe , M76N8FMye , M76N8FMze , & + M76N8MKxe , M76N8MKye , M76N8MKze , M76N8MMxe , M76N8MMye , M76N8MMze , M76N8RAxe , & + M76N8RAye , M76N8RAze , M76N8RDxe , M76N8RDye , M76N8RDze , M76N8TAxe , M76N8TAye , & + M76N8TAze , M76N8TDxss , M76N8TDyss , M76N8TDzss , M76N9FKxe , M76N9FKye , M76N9FKze , & + M76N9FMxe , M76N9FMye , M76N9FMze , M76N9MKxe , M76N9MKye , M76N9MKze , M76N9MMxe , & + M76N9MMye , M76N9MMze , M76N9RAxe , M76N9RAye , M76N9RAze , M76N9RDxe , M76N9RDye , & + M76N9RDze , M76N9TAxe , M76N9TAye , M76N9TAze , M76N9TDxss , M76N9TDyss , M76N9TDzss , & + M77N1FKxe , M77N1FKye , M77N1FKze , M77N1FMxe , M77N1FMye , M77N1FMze , M77N1MKxe , & + M77N1MKye , M77N1MKze , M77N1MMxe , M77N1MMye , M77N1MMze , M77N1RAxe , M77N1RAye , & + M77N1RAze , M77N1RDxe , M77N1RDye , M77N1RDze , M77N1TAxe , M77N1TAye , M77N1TAze , & + M77N1TDxss , M77N1TDyss , M77N1TDzss , M77N2FKxe , M77N2FKye , M77N2FKze , M77N2FMxe , & + M77N2FMye , M77N2FMze , M77N2MKxe , M77N2MKye , M77N2MKze , M77N2MMxe , M77N2MMye , & + M77N2MMze , M77N2RAxe , M77N2RAye , M77N2RAze , M77N2RDxe , M77N2RDye , M77N2RDze , & + M77N2TAxe , M77N2TAye , M77N2TAze , M77N2TDxss , M77N2TDyss , M77N2TDzss , M77N3FKxe , & + M77N3FKye , M77N3FKze , M77N3FMxe , M77N3FMye , M77N3FMze , M77N3MKxe , M77N3MKye , & + M77N3MKze , M77N3MMxe , M77N3MMye , M77N3MMze , M77N3RAxe , M77N3RAye , M77N3RAze , & + M77N3RDxe , M77N3RDye , M77N3RDze , M77N3TAxe , M77N3TAye , M77N3TAze , M77N3TDxss , & + M77N3TDyss , M77N3TDzss , M77N4FKxe , M77N4FKye , M77N4FKze , M77N4FMxe , M77N4FMye , & + M77N4FMze , M77N4MKxe , M77N4MKye , M77N4MKze , M77N4MMxe , M77N4MMye , M77N4MMze , & + M77N4RAxe , M77N4RAye , M77N4RAze , M77N4RDxe , M77N4RDye , M77N4RDze , M77N4TAxe , & + M77N4TAye , M77N4TAze , M77N4TDxss , M77N4TDyss , M77N4TDzss , M77N5FKxe , M77N5FKye , & + M77N5FKze , M77N5FMxe , M77N5FMye , M77N5FMze , M77N5MKxe , M77N5MKye , M77N5MKze , & + M77N5MMxe , M77N5MMye , M77N5MMze , M77N5RAxe , M77N5RAye , M77N5RAze , M77N5RDxe , & + M77N5RDye , M77N5RDze , M77N5TAxe , M77N5TAye , M77N5TAze , M77N5TDxss , M77N5TDyss , & + M77N5TDzss , M77N6FKxe , M77N6FKye , M77N6FKze , M77N6FMxe , M77N6FMye , M77N6FMze , & + M77N6MKxe , M77N6MKye , M77N6MKze , M77N6MMxe , M77N6MMye , M77N6MMze , M77N6RAxe , & + M77N6RAye , M77N6RAze , M77N6RDxe , M77N6RDye , M77N6RDze , M77N6TAxe , M77N6TAye , & + M77N6TAze , M77N6TDxss , M77N6TDyss , M77N6TDzss , M77N7FKxe , M77N7FKye , M77N7FKze , & + M77N7FMxe , M77N7FMye , M77N7FMze , M77N7MKxe , M77N7MKye , M77N7MKze , M77N7MMxe , & + M77N7MMye , M77N7MMze , M77N7RAxe , M77N7RAye , M77N7RAze , M77N7RDxe , M77N7RDye , & + M77N7RDze , M77N7TAxe , M77N7TAye , M77N7TAze , M77N7TDxss , M77N7TDyss , M77N7TDzss , & + M77N8FKxe , M77N8FKye , M77N8FKze , M77N8FMxe , M77N8FMye , M77N8FMze , M77N8MKxe , & + M77N8MKye , M77N8MKze , M77N8MMxe , M77N8MMye , M77N8MMze , M77N8RAxe , M77N8RAye , & + M77N8RAze , M77N8RDxe , M77N8RDye , M77N8RDze , M77N8TAxe , M77N8TAye , M77N8TAze , & + M77N8TDxss , M77N8TDyss , M77N8TDzss , M77N9FKxe , M77N9FKye , M77N9FKze , M77N9FMxe , & + M77N9FMye , M77N9FMze , M77N9MKxe , M77N9MKye , M77N9MKze , M77N9MMxe , M77N9MMye , & + M77N9MMze , M77N9RAxe , M77N9RAye , M77N9RAze , M77N9RDxe , M77N9RDye , M77N9RDze , & + M77N9TAxe , M77N9TAye , M77N9TAze , M77N9TDxss , M77N9TDyss , M77N9TDzss , M78N1FKxe , & + M78N1FKye , M78N1FKze , M78N1FMxe , M78N1FMye , M78N1FMze , M78N1MKxe , M78N1MKye , & + M78N1MKze , M78N1MMxe , M78N1MMye , M78N1MMze , M78N1RAxe , M78N1RAye , M78N1RAze , & + M78N1RDxe , M78N1RDye , M78N1RDze , M78N1TAxe , M78N1TAye , M78N1TAze , M78N1TDxss /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry11(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M78N1TDyss , M78N1TDzss , M78N2FKxe , M78N2FKye , M78N2FKze , M78N2FMxe , M78N2FMye , & + M78N2FMze , M78N2MKxe , M78N2MKye , M78N2MKze , M78N2MMxe , M78N2MMye , M78N2MMze , & + M78N2RAxe , M78N2RAye , M78N2RAze , M78N2RDxe , M78N2RDye , M78N2RDze , M78N2TAxe , & + M78N2TAye , M78N2TAze , M78N2TDxss , M78N2TDyss , M78N2TDzss , M78N3FKxe , M78N3FKye , & + M78N3FKze , M78N3FMxe , M78N3FMye , M78N3FMze , M78N3MKxe , M78N3MKye , M78N3MKze , & + M78N3MMxe , M78N3MMye , M78N3MMze , M78N3RAxe , M78N3RAye , M78N3RAze , M78N3RDxe , & + M78N3RDye , M78N3RDze , M78N3TAxe , M78N3TAye , M78N3TAze , M78N3TDxss , M78N3TDyss , & + M78N3TDzss , M78N4FKxe , M78N4FKye , M78N4FKze , M78N4FMxe , M78N4FMye , M78N4FMze , & + M78N4MKxe , M78N4MKye , M78N4MKze , M78N4MMxe , M78N4MMye , M78N4MMze , M78N4RAxe , & + M78N4RAye , M78N4RAze , M78N4RDxe , M78N4RDye , M78N4RDze , M78N4TAxe , M78N4TAye , & + M78N4TAze , M78N4TDxss , M78N4TDyss , M78N4TDzss , M78N5FKxe , M78N5FKye , M78N5FKze , & + M78N5FMxe , M78N5FMye , M78N5FMze , M78N5MKxe , M78N5MKye , M78N5MKze , M78N5MMxe , & + M78N5MMye , M78N5MMze , M78N5RAxe , M78N5RAye , M78N5RAze , M78N5RDxe , M78N5RDye , & + M78N5RDze , M78N5TAxe , M78N5TAye , M78N5TAze , M78N5TDxss , M78N5TDyss , M78N5TDzss , & + M78N6FKxe , M78N6FKye , M78N6FKze , M78N6FMxe , M78N6FMye , M78N6FMze , M78N6MKxe , & + M78N6MKye , M78N6MKze , M78N6MMxe , M78N6MMye , M78N6MMze , M78N6RAxe , M78N6RAye , & + M78N6RAze , M78N6RDxe , M78N6RDye , M78N6RDze , M78N6TAxe , M78N6TAye , M78N6TAze , & + M78N6TDxss , M78N6TDyss , M78N6TDzss , M78N7FKxe , M78N7FKye , M78N7FKze , M78N7FMxe , & + M78N7FMye , M78N7FMze , M78N7MKxe , M78N7MKye , M78N7MKze , M78N7MMxe , M78N7MMye , & + M78N7MMze , M78N7RAxe , M78N7RAye , M78N7RAze , M78N7RDxe , M78N7RDye , M78N7RDze , & + M78N7TAxe , M78N7TAye , M78N7TAze , M78N7TDxss , M78N7TDyss , M78N7TDzss , M78N8FKxe , & + M78N8FKye , M78N8FKze , M78N8FMxe , M78N8FMye , M78N8FMze , M78N8MKxe , M78N8MKye , & + M78N8MKze , M78N8MMxe , M78N8MMye , M78N8MMze , M78N8RAxe , M78N8RAye , M78N8RAze , & + M78N8RDxe , M78N8RDye , M78N8RDze , M78N8TAxe , M78N8TAye , M78N8TAze , M78N8TDxss , & + M78N8TDyss , M78N8TDzss , M78N9FKxe , M78N9FKye , M78N9FKze , M78N9FMxe , M78N9FMye , & + M78N9FMze , M78N9MKxe , M78N9MKye , M78N9MKze , M78N9MMxe , M78N9MMye , M78N9MMze , & + M78N9RAxe , M78N9RAye , M78N9RAze , M78N9RDxe , M78N9RDye , M78N9RDze , M78N9TAxe , & + M78N9TAye , M78N9TAze , M78N9TDxss , M78N9TDyss , M78N9TDzss , M79N1FKxe , M79N1FKye , & + M79N1FKze , M79N1FMxe , M79N1FMye , M79N1FMze , M79N1MKxe , M79N1MKye , M79N1MKze , & + M79N1MMxe , M79N1MMye , M79N1MMze , M79N1RAxe , M79N1RAye , M79N1RAze , M79N1RDxe , & + M79N1RDye , M79N1RDze , M79N1TAxe , M79N1TAye , M79N1TAze , M79N1TDxss , M79N1TDyss , & + M79N1TDzss , M79N2FKxe , M79N2FKye , M79N2FKze , M79N2FMxe , M79N2FMye , M79N2FMze , & + M79N2MKxe , M79N2MKye , M79N2MKze , M79N2MMxe , M79N2MMye , M79N2MMze , M79N2RAxe , & + M79N2RAye , M79N2RAze , M79N2RDxe , M79N2RDye , M79N2RDze , M79N2TAxe , M79N2TAye , & + M79N2TAze , M79N2TDxss , M79N2TDyss , M79N2TDzss , M79N3FKxe , M79N3FKye , M79N3FKze , & + M79N3FMxe , M79N3FMye , M79N3FMze , M79N3MKxe , M79N3MKye , M79N3MKze , M79N3MMxe , & + M79N3MMye , M79N3MMze , M79N3RAxe , M79N3RAye , M79N3RAze , M79N3RDxe , M79N3RDye , & + M79N3RDze , M79N3TAxe , M79N3TAye , M79N3TAze , M79N3TDxss , M79N3TDyss , M79N3TDzss , & + M79N4FKxe , M79N4FKye , M79N4FKze , M79N4FMxe , M79N4FMye , M79N4FMze , M79N4MKxe , & + M79N4MKye , M79N4MKze , M79N4MMxe , M79N4MMye , M79N4MMze , M79N4RAxe , M79N4RAye , & + M79N4RAze , M79N4RDxe , M79N4RDye , M79N4RDze , M79N4TAxe , M79N4TAye , M79N4TAze , & + M79N4TDxss , M79N4TDyss , M79N4TDzss , M79N5FKxe , M79N5FKye , M79N5FKze , M79N5FMxe , & + M79N5FMye , M79N5FMze , M79N5MKxe , M79N5MKye , M79N5MKze , M79N5MMxe , M79N5MMye , & + M79N5MMze , M79N5RAxe , M79N5RAye , M79N5RAze , M79N5RDxe , M79N5RDye , M79N5RDze , & + M79N5TAxe , M79N5TAye , M79N5TAze , M79N5TDxss , M79N5TDyss , M79N5TDzss , M79N6FKxe , & + M79N6FKye , M79N6FKze , M79N6FMxe , M79N6FMye , M79N6FMze , M79N6MKxe , M79N6MKye , & + M79N6MKze , M79N6MMxe , M79N6MMye , M79N6MMze , M79N6RAxe , M79N6RAye , M79N6RAze , & + M79N6RDxe , M79N6RDye , M79N6RDze , M79N6TAxe , M79N6TAye , M79N6TAze , M79N6TDxss , & + M79N6TDyss , M79N6TDzss , M79N7FKxe , M79N7FKye , M79N7FKze , M79N7FMxe , M79N7FMye , & + M79N7FMze , M79N7MKxe , M79N7MKye , M79N7MKze , M79N7MMxe , M79N7MMye , M79N7MMze , & + M79N7RAxe , M79N7RAye , M79N7RAze , M79N7RDxe , M79N7RDye , M79N7RDze , M79N7TAxe , & + M79N7TAye , M79N7TAze , M79N7TDxss , M79N7TDyss , M79N7TDzss , M79N8FKxe , M79N8FKye , & + M79N8FKze , M79N8FMxe , M79N8FMye , M79N8FMze , M79N8MKxe , M79N8MKye , M79N8MKze , & + M79N8MMxe , M79N8MMye , M79N8MMze , M79N8RAxe , M79N8RAye , M79N8RAze , M79N8RDxe , & + M79N8RDye , M79N8RDze , M79N8TAxe , M79N8TAye , M79N8TAze , M79N8TDxss , M79N8TDyss , & + M79N8TDzss , M79N9FKxe , M79N9FKye , M79N9FKze , M79N9FMxe , M79N9FMye , M79N9FMze , & + M79N9MKxe , M79N9MKye , M79N9MKze , M79N9MMxe , M79N9MMye , M79N9MMze , M79N9RAxe , & + M79N9RAye , M79N9RAze , M79N9RDxe , M79N9RDye , M79N9RDze , M79N9TAxe , M79N9TAye , & + M79N9TAze , M79N9TDxss , M79N9TDyss , M79N9TDzss , M80N1FKxe , M80N1FKye , M80N1FKze , & + M80N1FMxe , M80N1FMye , M80N1FMze , M80N1MKxe , M80N1MKye , M80N1MKze , M80N1MMxe , & + M80N1MMye , M80N1MMze , M80N1RAxe , M80N1RAye , M80N1RAze , M80N1RDxe , M80N1RDye , & + M80N1RDze , M80N1TAxe , M80N1TAye , M80N1TAze , M80N1TDxss , M80N1TDyss , M80N1TDzss , & + M80N2FKxe , M80N2FKye , M80N2FKze , M80N2FMxe , M80N2FMye , M80N2FMze , M80N2MKxe , & + M80N2MKye , M80N2MKze , M80N2MMxe , M80N2MMye , M80N2MMze , M80N2RAxe , M80N2RAye , & + M80N2RAze , M80N2RDxe , M80N2RDye , M80N2RDze , M80N2TAxe , M80N2TAye , M80N2TAze , & + M80N2TDxss , M80N2TDyss , M80N2TDzss , M80N3FKxe , M80N3FKye , M80N3FKze , M80N3FMxe , & + M80N3FMye , M80N3FMze , M80N3MKxe , M80N3MKye , M80N3MKze , M80N3MMxe , M80N3MMye , & + M80N3MMze , M80N3RAxe , M80N3RAye , M80N3RAze , M80N3RDxe , M80N3RDye , M80N3RDze , & + M80N3TAxe , M80N3TAye , M80N3TAze , M80N3TDxss , M80N3TDyss , M80N3TDzss , M80N4FKxe , & + M80N4FKye , M80N4FKze , M80N4FMxe , M80N4FMye , M80N4FMze , M80N4MKxe , M80N4MKye , & + M80N4MKze , M80N4MMxe , M80N4MMye , M80N4MMze , M80N4RAxe , M80N4RAye , M80N4RAze , & + M80N4RDxe , M80N4RDye , M80N4RDze , M80N4TAxe , M80N4TAye , M80N4TAze , M80N4TDxss , & + M80N4TDyss , M80N4TDzss , M80N5FKxe , M80N5FKye , M80N5FKze , M80N5FMxe , M80N5FMye , & + M80N5FMze , M80N5MKxe , M80N5MKye , M80N5MKze , M80N5MMxe , M80N5MMye , M80N5MMze , & + M80N5RAxe , M80N5RAye , M80N5RAze , M80N5RDxe , M80N5RDye , M80N5RDze , M80N5TAxe , & + M80N5TAye , M80N5TAze , M80N5TDxss , M80N5TDyss , M80N5TDzss , M80N6FKxe , M80N6FKye , & + M80N6FKze , M80N6FMxe , M80N6FMye , M80N6FMze , M80N6MKxe , M80N6MKye , M80N6MKze , & + M80N6MMxe , M80N6MMye , M80N6MMze , M80N6RAxe , M80N6RAye , M80N6RAze , M80N6RDxe , & + M80N6RDye , M80N6RDze , M80N6TAxe , M80N6TAye , M80N6TAze , M80N6TDxss , M80N6TDyss , & + M80N6TDzss , M80N7FKxe , M80N7FKye , M80N7FKze , M80N7FMxe , M80N7FMye , M80N7FMze , & + M80N7MKxe , M80N7MKye , M80N7MKze , M80N7MMxe , M80N7MMye , M80N7MMze , M80N7RAxe , & + M80N7RAye , M80N7RAze , M80N7RDxe , M80N7RDye , M80N7RDze , M80N7TAxe , M80N7TAye , & + M80N7TAze , M80N7TDxss , M80N7TDyss , M80N7TDzss , M80N8FKxe , M80N8FKye , M80N8FKze , & + M80N8FMxe , M80N8FMye , M80N8FMze , M80N8MKxe , M80N8MKye , M80N8MKze , M80N8MMxe , & + M80N8MMye , M80N8MMze , M80N8RAxe , M80N8RAye , M80N8RAze , M80N8RDxe , M80N8RDye , & + M80N8RDze , M80N8TAxe , M80N8TAye , M80N8TAze , M80N8TDxss , M80N8TDyss , M80N8TDzss , & + M80N9FKxe , M80N9FKye , M80N9FKze , M80N9FMxe , M80N9FMye , M80N9FMze , M80N9MKxe , & + M80N9MKye , M80N9MKze , M80N9MMxe , M80N9MMye , M80N9MMze , M80N9RAxe , M80N9RAye , & + M80N9RAze , M80N9RDxe , M80N9RDye , M80N9RDze , M80N9TAxe , M80N9TAye , M80N9TAze , & + M80N9TDxss , M80N9TDyss , M80N9TDzss , M81N1FKxe , M81N1FKye , M81N1FKze , M81N1FMxe , & + M81N1FMye , M81N1FMze , M81N1MKxe , M81N1MKye , M81N1MKze , M81N1MMxe , M81N1MMye , & + M81N1MMze , M81N1RAxe , M81N1RAye , M81N1RAze , M81N1RDxe , M81N1RDye , M81N1RDze , & + M81N1TAxe , M81N1TAye , M81N1TAze , M81N1TDxss , M81N1TDyss , M81N1TDzss , M81N2FKxe , & + M81N2FKye , M81N2FKze , M81N2FMxe , M81N2FMye , M81N2FMze , M81N2MKxe , M81N2MKye , & + M81N2MKze , M81N2MMxe , M81N2MMye , M81N2MMze , M81N2RAxe , M81N2RAye , M81N2RAze , & + M81N2RDxe , M81N2RDye , M81N2RDze , M81N2TAxe , M81N2TAye , M81N2TAze , M81N2TDxss , & + M81N2TDyss , M81N2TDzss , M81N3FKxe , M81N3FKye , M81N3FKze , M81N3FMxe , M81N3FMye , & + M81N3FMze , M81N3MKxe , M81N3MKye , M81N3MKze , M81N3MMxe , M81N3MMye , M81N3MMze , & + M81N3RAxe , M81N3RAye , M81N3RAze , M81N3RDxe , M81N3RDye , M81N3RDze , M81N3TAxe , & + M81N3TAye , M81N3TAze , M81N3TDxss , M81N3TDyss , M81N3TDzss , M81N4FKxe , M81N4FKye , & + M81N4FKze , M81N4FMxe , M81N4FMye , M81N4FMze , M81N4MKxe , M81N4MKye , M81N4MKze , & + M81N4MMxe , M81N4MMye , M81N4MMze , M81N4RAxe , M81N4RAye , M81N4RAze , M81N4RDxe , & + M81N4RDye , M81N4RDze , M81N4TAxe , M81N4TAye , M81N4TAze , M81N4TDxss , M81N4TDyss , & + M81N4TDzss , M81N5FKxe , M81N5FKye , M81N5FKze , M81N5FMxe , M81N5FMye , M81N5FMze , & + M81N5MKxe , M81N5MKye , M81N5MKze , M81N5MMxe , M81N5MMye , M81N5MMze , M81N5RAxe , & + M81N5RAye , M81N5RAze , M81N5RDxe , M81N5RDye , M81N5RDze , M81N5TAxe , M81N5TAye , & + M81N5TAze , M81N5TDxss , M81N5TDyss , M81N5TDzss , M81N6FKxe , M81N6FKye , M81N6FKze , & + M81N6FMxe , M81N6FMye , M81N6FMze , M81N6MKxe , M81N6MKye , M81N6MKze , M81N6MMxe , & + M81N6MMye , M81N6MMze , M81N6RAxe , M81N6RAye , M81N6RAze , M81N6RDxe , M81N6RDye , & + M81N6RDze , M81N6TAxe , M81N6TAye , M81N6TAze , M81N6TDxss , M81N6TDyss , M81N6TDzss , & + M81N7FKxe , M81N7FKye , M81N7FKze , M81N7FMxe , M81N7FMye , M81N7FMze , M81N7MKxe , & + M81N7MKye , M81N7MKze , M81N7MMxe , M81N7MMye , M81N7MMze , M81N7RAxe , M81N7RAye , & + M81N7RAze , M81N7RDxe , M81N7RDye , M81N7RDze , M81N7TAxe , M81N7TAye , M81N7TAze , & + M81N7TDxss , M81N7TDyss , M81N7TDzss , M81N8FKxe , M81N8FKye , M81N8FKze , M81N8FMxe , & + M81N8FMye , M81N8FMze , M81N8MKxe , M81N8MKye , M81N8MKze , M81N8MMxe , M81N8MMye , & + M81N8MMze , M81N8RAxe , M81N8RAye , M81N8RAze , M81N8RDxe , M81N8RDye , M81N8RDze , & + M81N8TAxe , M81N8TAye , M81N8TAze , M81N8TDxss , M81N8TDyss , M81N8TDzss , M81N9FKxe , & + M81N9FKye , M81N9FKze , M81N9FMxe , M81N9FMye , M81N9FMze , M81N9MKxe , M81N9MKye , & + M81N9MKze , M81N9MMxe , M81N9MMye , M81N9MMze , M81N9RAxe , M81N9RAye , M81N9RAze , & + M81N9RDxe , M81N9RDye , M81N9RDze , M81N9TAxe , M81N9TAye , M81N9TAze , M81N9TDxss , & + M81N9TDyss , M81N9TDzss , M82N1FKxe , M82N1FKye , M82N1FKze , M82N1FMxe , M82N1FMye , & + M82N1FMze , M82N1MKxe , M82N1MKye , M82N1MKze , M82N1MMxe , M82N1MMye , M82N1MMze , & + M82N1RAxe , M82N1RAye , M82N1RAze , M82N1RDxe , M82N1RDye , M82N1RDze , M82N1TAxe , & + M82N1TAye , M82N1TAze , M82N1TDxss , M82N1TDyss , M82N1TDzss , M82N2FKxe , M82N2FKye , & + M82N2FKze , M82N2FMxe , M82N2FMye , M82N2FMze , M82N2MKxe , M82N2MKye , M82N2MKze , & + M82N2MMxe , M82N2MMye , M82N2MMze , M82N2RAxe , M82N2RAye , M82N2RAze , M82N2RDxe , & + M82N2RDye , M82N2RDze , M82N2TAxe , M82N2TAye , M82N2TAze , M82N2TDxss , M82N2TDyss , & + M82N2TDzss , M82N3FKxe , M82N3FKye , M82N3FKze , M82N3FMxe , M82N3FMye , M82N3FMze , & + M82N3MKxe , M82N3MKye , M82N3MKze , M82N3MMxe , M82N3MMye , M82N3MMze , M82N3RAxe , & + M82N3RAye , M82N3RAze , M82N3RDxe , M82N3RDye , M82N3RDze , M82N3TAxe , M82N3TAye , & + M82N3TAze , M82N3TDxss , M82N3TDyss , M82N3TDzss , M82N4FKxe , M82N4FKye , M82N4FKze , & + M82N4FMxe , M82N4FMye , M82N4FMze , M82N4MKxe , M82N4MKye , M82N4MKze , M82N4MMxe , & + M82N4MMye , M82N4MMze , M82N4RAxe , M82N4RAye , M82N4RAze , M82N4RDxe , M82N4RDye , & + M82N4RDze , M82N4TAxe , M82N4TAye , M82N4TAze , M82N4TDxss , M82N4TDyss , M82N4TDzss , & + M82N5FKxe , M82N5FKye , M82N5FKze , M82N5FMxe , M82N5FMye , M82N5FMze , M82N5MKxe , & + M82N5MKye , M82N5MKze , M82N5MMxe , M82N5MMye , M82N5MMze , M82N5RAxe , M82N5RAye , & + M82N5RAze , M82N5RDxe , M82N5RDye , M82N5RDze , M82N5TAxe , M82N5TAye , M82N5TAze , & + M82N5TDxss , M82N5TDyss , M82N5TDzss , M82N6FKxe , M82N6FKye , M82N6FKze , M82N6FMxe , & + M82N6FMye , M82N6FMze , M82N6MKxe , M82N6MKye , M82N6MKze , M82N6MMxe , M82N6MMye , & + M82N6MMze , M82N6RAxe , M82N6RAye , M82N6RAze , M82N6RDxe , M82N6RDye , M82N6RDze , & + M82N6TAxe , M82N6TAye , M82N6TAze , M82N6TDxss , M82N6TDyss , M82N6TDzss , M82N7FKxe , & + M82N7FKye , M82N7FKze , M82N7FMxe , M82N7FMye , M82N7FMze , M82N7MKxe , M82N7MKye , & + M82N7MKze , M82N7MMxe , M82N7MMye , M82N7MMze , M82N7RAxe , M82N7RAye , M82N7RAze , & + M82N7RDxe , M82N7RDye , M82N7RDze , M82N7TAxe , M82N7TAye , M82N7TAze , M82N7TDxss , & + M82N7TDyss , M82N7TDzss , M82N8FKxe , M82N8FKye , M82N8FKze , M82N8FMxe , M82N8FMye , & + M82N8FMze , M82N8MKxe , M82N8MKye , M82N8MKze , M82N8MMxe , M82N8MMye , M82N8MMze , & + M82N8RAxe , M82N8RAye , M82N8RAze , M82N8RDxe , M82N8RDye , M82N8RDze , M82N8TAxe , & + M82N8TAye , M82N8TAze , M82N8TDxss , M82N8TDyss , M82N8TDzss , M82N9FKxe , M82N9FKye , & + M82N9FKze , M82N9FMxe , M82N9FMye , M82N9FMze , M82N9MKxe , M82N9MKye , M82N9MKze , & + M82N9MMxe , M82N9MMye , M82N9MMze , M82N9RAxe , M82N9RAye , M82N9RAze , M82N9RDxe , & + M82N9RDye , M82N9RDze , M82N9TAxe , M82N9TAye , M82N9TAze , M82N9TDxss , M82N9TDyss , & + M82N9TDzss , M83N1FKxe , M83N1FKye , M83N1FKze , M83N1FMxe , M83N1FMye , M83N1FMze , & + M83N1MKxe , M83N1MKye , M83N1MKze , M83N1MMxe , M83N1MMye , M83N1MMze , M83N1RAxe , & + M83N1RAye , M83N1RAze , M83N1RDxe , M83N1RDye , M83N1RDze , M83N1TAxe , M83N1TAye , & + M83N1TAze , M83N1TDxss , M83N1TDyss , M83N1TDzss , M83N2FKxe , M83N2FKye , M83N2FKze , & + M83N2FMxe , M83N2FMye , M83N2FMze , M83N2MKxe , M83N2MKye , M83N2MKze , M83N2MMxe , & + M83N2MMye , M83N2MMze , M83N2RAxe , M83N2RAye , M83N2RAze , M83N2RDxe , M83N2RDye , & + M83N2RDze , M83N2TAxe , M83N2TAye , M83N2TAze , M83N2TDxss , M83N2TDyss , M83N2TDzss , & + M83N3FKxe , M83N3FKye , M83N3FKze , M83N3FMxe , M83N3FMye , M83N3FMze , M83N3MKxe , & + M83N3MKye , M83N3MKze , M83N3MMxe , M83N3MMye , M83N3MMze , M83N3RAxe , M83N3RAye , & + M83N3RAze , M83N3RDxe , M83N3RDye , M83N3RDze , M83N3TAxe , M83N3TAye , M83N3TAze , & + M83N3TDxss , M83N3TDyss , M83N3TDzss , M83N4FKxe , M83N4FKye , M83N4FKze , M83N4FMxe , & + M83N4FMye , M83N4FMze , M83N4MKxe , M83N4MKye , M83N4MKze , M83N4MMxe , M83N4MMye , & + M83N4MMze , M83N4RAxe , M83N4RAye , M83N4RAze , M83N4RDxe , M83N4RDye , M83N4RDze , & + M83N4TAxe , M83N4TAye , M83N4TAze , M83N4TDxss , M83N4TDyss , M83N4TDzss , M83N5FKxe , & + M83N5FKye , M83N5FKze , M83N5FMxe , M83N5FMye , M83N5FMze , M83N5MKxe , M83N5MKye , & + M83N5MKze , M83N5MMxe , M83N5MMye , M83N5MMze , M83N5RAxe , M83N5RAye , M83N5RAze , & + M83N5RDxe , M83N5RDye , M83N5RDze , M83N5TAxe , M83N5TAye , M83N5TAze , M83N5TDxss , & + M83N5TDyss , M83N5TDzss , M83N6FKxe , M83N6FKye , M83N6FKze , M83N6FMxe , M83N6FMye , & + M83N6FMze , M83N6MKxe , M83N6MKye , M83N6MKze , M83N6MMxe , M83N6MMye , M83N6MMze , & + M83N6RAxe , M83N6RAye , M83N6RAze , M83N6RDxe , M83N6RDye , M83N6RDze , M83N6TAxe , & + M83N6TAye , M83N6TAze , M83N6TDxss , M83N6TDyss , M83N6TDzss , M83N7FKxe , M83N7FKye , & + M83N7FKze , M83N7FMxe , M83N7FMye , M83N7FMze , M83N7MKxe , M83N7MKye , M83N7MKze , & + M83N7MMxe , M83N7MMye , M83N7MMze , M83N7RAxe , M83N7RAye , M83N7RAze , M83N7RDxe , & + M83N7RDye , M83N7RDze , M83N7TAxe , M83N7TAye , M83N7TAze , M83N7TDxss , M83N7TDyss , & + M83N7TDzss , M83N8FKxe , M83N8FKye , M83N8FKze , M83N8FMxe , M83N8FMye , M83N8FMze , & + M83N8MKxe , M83N8MKye , M83N8MKze , M83N8MMxe , M83N8MMye , M83N8MMze , M83N8RAxe , & + M83N8RAye , M83N8RAze , M83N8RDxe , M83N8RDye , M83N8RDze , M83N8TAxe , M83N8TAye , & + M83N8TAze , M83N8TDxss , M83N8TDyss , M83N8TDzss , M83N9FKxe , M83N9FKye , M83N9FKze , & + M83N9FMxe , M83N9FMye , M83N9FMze , M83N9MKxe , M83N9MKye , M83N9MKze , M83N9MMxe , & + M83N9MMye , M83N9MMze , M83N9RAxe , M83N9RAye , M83N9RAze , M83N9RDxe , M83N9RDye , & + M83N9RDze , M83N9TAxe , M83N9TAye , M83N9TAze , M83N9TDxss , M83N9TDyss , M83N9TDzss , & + M84N1FKxe , M84N1FKye , M84N1FKze , M84N1FMxe , M84N1FMye , M84N1FMze , M84N1MKxe , & + M84N1MKye , M84N1MKze , M84N1MMxe , M84N1MMye , M84N1MMze , M84N1RAxe , M84N1RAye , & + M84N1RAze , M84N1RDxe , M84N1RDye , M84N1RDze , M84N1TAxe , M84N1TAye , M84N1TAze , & + M84N1TDxss , M84N1TDyss , M84N1TDzss , M84N2FKxe , M84N2FKye , M84N2FKze , M84N2FMxe , & + M84N2FMye , M84N2FMze , M84N2MKxe , M84N2MKye , M84N2MKze , M84N2MMxe , M84N2MMye , & + M84N2MMze , M84N2RAxe , M84N2RAye , M84N2RAze , M84N2RDxe , M84N2RDye , M84N2RDze , & + M84N2TAxe , M84N2TAye , M84N2TAze , M84N2TDxss , M84N2TDyss , M84N2TDzss , M84N3FKxe , & + M84N3FKye , M84N3FKze , M84N3FMxe , M84N3FMye , M84N3FMze , M84N3MKxe , M84N3MKye , & + M84N3MKze , M84N3MMxe , M84N3MMye , M84N3MMze , M84N3RAxe , M84N3RAye , M84N3RAze , & + M84N3RDxe , M84N3RDye , M84N3RDze , M84N3TAxe , M84N3TAye , M84N3TAze , M84N3TDxss , & + M84N3TDyss , M84N3TDzss , M84N4FKxe , M84N4FKye , M84N4FKze , M84N4FMxe , M84N4FMye , & + M84N4FMze , M84N4MKxe , M84N4MKye , M84N4MKze , M84N4MMxe , M84N4MMye , M84N4MMze , & + M84N4RAxe , M84N4RAye , M84N4RAze , M84N4RDxe , M84N4RDye , M84N4RDze , M84N4TAxe , & + M84N4TAye , M84N4TAze , M84N4TDxss , M84N4TDyss , M84N4TDzss , M84N5FKxe , M84N5FKye , & + M84N5FKze , M84N5FMxe , M84N5FMye , M84N5FMze , M84N5MKxe , M84N5MKye , M84N5MKze , & + M84N5MMxe , M84N5MMye , M84N5MMze , M84N5RAxe , M84N5RAye , M84N5RAze , M84N5RDxe , & + M84N5RDye , M84N5RDze , M84N5TAxe , M84N5TAye , M84N5TAze , M84N5TDxss , M84N5TDyss , & + M84N5TDzss , M84N6FKxe , M84N6FKye , M84N6FKze , M84N6FMxe , M84N6FMye , M84N6FMze , & + M84N6MKxe , M84N6MKye , M84N6MKze , M84N6MMxe , M84N6MMye , M84N6MMze , M84N6RAxe , & + M84N6RAye , M84N6RAze , M84N6RDxe , M84N6RDye , M84N6RDze , M84N6TAxe , M84N6TAye , & + M84N6TAze , M84N6TDxss , M84N6TDyss , M84N6TDzss , M84N7FKxe , M84N7FKye , M84N7FKze , & + M84N7FMxe , M84N7FMye , M84N7FMze , M84N7MKxe , M84N7MKye , M84N7MKze , M84N7MMxe , & + M84N7MMye , M84N7MMze , M84N7RAxe , M84N7RAye , M84N7RAze , M84N7RDxe , M84N7RDye , & + M84N7RDze , M84N7TAxe , M84N7TAye , M84N7TAze , M84N7TDxss , M84N7TDyss , M84N7TDzss , & + M84N8FKxe , M84N8FKye , M84N8FKze , M84N8FMxe , M84N8FMye , M84N8FMze , M84N8MKxe , & + M84N8MKye , M84N8MKze , M84N8MMxe , M84N8MMye , M84N8MMze , M84N8RAxe , M84N8RAye , & + M84N8RAze , M84N8RDxe , M84N8RDye , M84N8RDze , M84N8TAxe , M84N8TAye , M84N8TAze , & + M84N8TDxss , M84N8TDyss , M84N8TDzss , M84N9FKxe , M84N9FKye , M84N9FKze , M84N9FMxe , & + M84N9FMye , M84N9FMze , M84N9MKxe , M84N9MKye , M84N9MKze , M84N9MMxe , M84N9MMye , & + M84N9MMze , M84N9RAxe , M84N9RAye , M84N9RAze , M84N9RDxe , M84N9RDye , M84N9RDze , & + M84N9TAxe , M84N9TAye , M84N9TAze , M84N9TDxss , M84N9TDyss , M84N9TDzss , M85N1FKxe , & + M85N1FKye , M85N1FKze , M85N1FMxe , M85N1FMye , M85N1FMze , M85N1MKxe , M85N1MKye , & + M85N1MKze , M85N1MMxe , M85N1MMye , M85N1MMze , M85N1RAxe , M85N1RAye , M85N1RAze , & + M85N1RDxe , M85N1RDye , M85N1RDze , M85N1TAxe , M85N1TAye , M85N1TAze , M85N1TDxss , & + M85N1TDyss , M85N1TDzss , M85N2FKxe , M85N2FKye , M85N2FKze , M85N2FMxe , M85N2FMye , & + M85N2FMze , M85N2MKxe , M85N2MKye , M85N2MKze , M85N2MMxe , M85N2MMye , M85N2MMze , & + M85N2RAxe , M85N2RAye , M85N2RAze , M85N2RDxe , M85N2RDye , M85N2RDze , M85N2TAxe , & + M85N2TAye , M85N2TAze , M85N2TDxss , M85N2TDyss , M85N2TDzss , M85N3FKxe , M85N3FKye , & + M85N3FKze , M85N3FMxe , M85N3FMye , M85N3FMze , M85N3MKxe , M85N3MKye , M85N3MKze , & + M85N3MMxe , M85N3MMye , M85N3MMze , M85N3RAxe , M85N3RAye , M85N3RAze , M85N3RDxe , & + M85N3RDye , M85N3RDze , M85N3TAxe , M85N3TAye , M85N3TAze , M85N3TDxss , M85N3TDyss , & + M85N3TDzss , M85N4FKxe , M85N4FKye , M85N4FKze , M85N4FMxe , M85N4FMye , M85N4FMze , & + M85N4MKxe , M85N4MKye , M85N4MKze , M85N4MMxe , M85N4MMye , M85N4MMze , M85N4RAxe , & + M85N4RAye , M85N4RAze , M85N4RDxe , M85N4RDye , M85N4RDze , M85N4TAxe , M85N4TAye , & + M85N4TAze , M85N4TDxss , M85N4TDyss , M85N4TDzss , M85N5FKxe , M85N5FKye , M85N5FKze , & + M85N5FMxe , M85N5FMye , M85N5FMze , M85N5MKxe , M85N5MKye , M85N5MKze , M85N5MMxe , & + M85N5MMye , M85N5MMze , M85N5RAxe , M85N5RAye , M85N5RAze , M85N5RDxe , M85N5RDye , & + M85N5RDze , M85N5TAxe , M85N5TAye , M85N5TAze , M85N5TDxss , M85N5TDyss , M85N5TDzss , & + M85N6FKxe , M85N6FKye , M85N6FKze , M85N6FMxe , M85N6FMye , M85N6FMze , M85N6MKxe , & + M85N6MKye , M85N6MKze , M85N6MMxe , M85N6MMye , M85N6MMze , M85N6RAxe , M85N6RAye , & + M85N6RAze , M85N6RDxe , M85N6RDye , M85N6RDze , M85N6TAxe , M85N6TAye , M85N6TAze , & + M85N6TDxss , M85N6TDyss , M85N6TDzss , M85N7FKxe , M85N7FKye , M85N7FKze , M85N7FMxe , & + M85N7FMye , M85N7FMze , M85N7MKxe , M85N7MKye , M85N7MKze , M85N7MMxe , M85N7MMye , & + M85N7MMze , M85N7RAxe , M85N7RAye , M85N7RAze , M85N7RDxe , M85N7RDye , M85N7RDze , & + M85N7TAxe , M85N7TAye , M85N7TAze , M85N7TDxss , M85N7TDyss , M85N7TDzss , M85N8FKxe , & + M85N8FKye , M85N8FKze , M85N8FMxe , M85N8FMye , M85N8FMze , M85N8MKxe , M85N8MKye , & + M85N8MKze , M85N8MMxe , M85N8MMye , M85N8MMze , M85N8RAxe , M85N8RAye , M85N8RAze , & + M85N8RDxe , M85N8RDye , M85N8RDze , M85N8TAxe , M85N8TAye , M85N8TAze , M85N8TDxss , & + M85N8TDyss , M85N8TDzss , M85N9FKxe , M85N9FKye , M85N9FKze , M85N9FMxe , M85N9FMye /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry12(1687) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M85N9FMze , M85N9MKxe , M85N9MKye , M85N9MKze , M85N9MMxe , M85N9MMye , M85N9MMze , & + M85N9RAxe , M85N9RAye , M85N9RAze , M85N9RDxe , M85N9RDye , M85N9RDze , M85N9TAxe , & + M85N9TAye , M85N9TAze , M85N9TDxss , M85N9TDyss , M85N9TDzss , M86N1FKxe , M86N1FKye , & + M86N1FKze , M86N1FMxe , M86N1FMye , M86N1FMze , M86N1MKxe , M86N1MKye , M86N1MKze , & + M86N1MMxe , M86N1MMye , M86N1MMze , M86N1RAxe , M86N1RAye , M86N1RAze , M86N1RDxe , & + M86N1RDye , M86N1RDze , M86N1TAxe , M86N1TAye , M86N1TAze , M86N1TDxss , M86N1TDyss , & + M86N1TDzss , M86N2FKxe , M86N2FKye , M86N2FKze , M86N2FMxe , M86N2FMye , M86N2FMze , & + M86N2MKxe , M86N2MKye , M86N2MKze , M86N2MMxe , M86N2MMye , M86N2MMze , M86N2RAxe , & + M86N2RAye , M86N2RAze , M86N2RDxe , M86N2RDye , M86N2RDze , M86N2TAxe , M86N2TAye , & + M86N2TAze , M86N2TDxss , M86N2TDyss , M86N2TDzss , M86N3FKxe , M86N3FKye , M86N3FKze , & + M86N3FMxe , M86N3FMye , M86N3FMze , M86N3MKxe , M86N3MKye , M86N3MKze , M86N3MMxe , & + M86N3MMye , M86N3MMze , M86N3RAxe , M86N3RAye , M86N3RAze , M86N3RDxe , M86N3RDye , & + M86N3RDze , M86N3TAxe , M86N3TAye , M86N3TAze , M86N3TDxss , M86N3TDyss , M86N3TDzss , & + M86N4FKxe , M86N4FKye , M86N4FKze , M86N4FMxe , M86N4FMye , M86N4FMze , M86N4MKxe , & + M86N4MKye , M86N4MKze , M86N4MMxe , M86N4MMye , M86N4MMze , M86N4RAxe , M86N4RAye , & + M86N4RAze , M86N4RDxe , M86N4RDye , M86N4RDze , M86N4TAxe , M86N4TAye , M86N4TAze , & + M86N4TDxss , M86N4TDyss , M86N4TDzss , M86N5FKxe , M86N5FKye , M86N5FKze , M86N5FMxe , & + M86N5FMye , M86N5FMze , M86N5MKxe , M86N5MKye , M86N5MKze , M86N5MMxe , M86N5MMye , & + M86N5MMze , M86N5RAxe , M86N5RAye , M86N5RAze , M86N5RDxe , M86N5RDye , M86N5RDze , & + M86N5TAxe , M86N5TAye , M86N5TAze , M86N5TDxss , M86N5TDyss , M86N5TDzss , M86N6FKxe , & + M86N6FKye , M86N6FKze , M86N6FMxe , M86N6FMye , M86N6FMze , M86N6MKxe , M86N6MKye , & + M86N6MKze , M86N6MMxe , M86N6MMye , M86N6MMze , M86N6RAxe , M86N6RAye , M86N6RAze , & + M86N6RDxe , M86N6RDye , M86N6RDze , M86N6TAxe , M86N6TAye , M86N6TAze , M86N6TDxss , & + M86N6TDyss , M86N6TDzss , M86N7FKxe , M86N7FKye , M86N7FKze , M86N7FMxe , M86N7FMye , & + M86N7FMze , M86N7MKxe , M86N7MKye , M86N7MKze , M86N7MMxe , M86N7MMye , M86N7MMze , & + M86N7RAxe , M86N7RAye , M86N7RAze , M86N7RDxe , M86N7RDye , M86N7RDze , M86N7TAxe , & + M86N7TAye , M86N7TAze , M86N7TDxss , M86N7TDyss , M86N7TDzss , M86N8FKxe , M86N8FKye , & + M86N8FKze , M86N8FMxe , M86N8FMye , M86N8FMze , M86N8MKxe , M86N8MKye , M86N8MKze , & + M86N8MMxe , M86N8MMye , M86N8MMze , M86N8RAxe , M86N8RAye , M86N8RAze , M86N8RDxe , & + M86N8RDye , M86N8RDze , M86N8TAxe , M86N8TAye , M86N8TAze , M86N8TDxss , M86N8TDyss , & + M86N8TDzss , M86N9FKxe , M86N9FKye , M86N9FKze , M86N9FMxe , M86N9FMye , M86N9FMze , & + M86N9MKxe , M86N9MKye , M86N9MKze , M86N9MMxe , M86N9MMye , M86N9MMze , M86N9RAxe , & + M86N9RAye , M86N9RAze , M86N9RDxe , M86N9RDye , M86N9RDze , M86N9TAxe , M86N9TAye , & + M86N9TAze , M86N9TDxss , M86N9TDyss , M86N9TDzss , M87N1FKxe , M87N1FKye , M87N1FKze , & + M87N1FMxe , M87N1FMye , M87N1FMze , M87N1MKxe , M87N1MKye , M87N1MKze , M87N1MMxe , & + M87N1MMye , M87N1MMze , M87N1RAxe , M87N1RAye , M87N1RAze , M87N1RDxe , M87N1RDye , & + M87N1RDze , M87N1TAxe , M87N1TAye , M87N1TAze , M87N1TDxss , M87N1TDyss , M87N1TDzss , & + M87N2FKxe , M87N2FKye , M87N2FKze , M87N2FMxe , M87N2FMye , M87N2FMze , M87N2MKxe , & + M87N2MKye , M87N2MKze , M87N2MMxe , M87N2MMye , M87N2MMze , M87N2RAxe , M87N2RAye , & + M87N2RAze , M87N2RDxe , M87N2RDye , M87N2RDze , M87N2TAxe , M87N2TAye , M87N2TAze , & + M87N2TDxss , M87N2TDyss , M87N2TDzss , M87N3FKxe , M87N3FKye , M87N3FKze , M87N3FMxe , & + M87N3FMye , M87N3FMze , M87N3MKxe , M87N3MKye , M87N3MKze , M87N3MMxe , M87N3MMye , & + M87N3MMze , M87N3RAxe , M87N3RAye , M87N3RAze , M87N3RDxe , M87N3RDye , M87N3RDze , & + M87N3TAxe , M87N3TAye , M87N3TAze , M87N3TDxss , M87N3TDyss , M87N3TDzss , M87N4FKxe , & + M87N4FKye , M87N4FKze , M87N4FMxe , M87N4FMye , M87N4FMze , M87N4MKxe , M87N4MKye , & + M87N4MKze , M87N4MMxe , M87N4MMye , M87N4MMze , M87N4RAxe , M87N4RAye , M87N4RAze , & + M87N4RDxe , M87N4RDye , M87N4RDze , M87N4TAxe , M87N4TAye , M87N4TAze , M87N4TDxss , & + M87N4TDyss , M87N4TDzss , M87N5FKxe , M87N5FKye , M87N5FKze , M87N5FMxe , M87N5FMye , & + M87N5FMze , M87N5MKxe , M87N5MKye , M87N5MKze , M87N5MMxe , M87N5MMye , M87N5MMze , & + M87N5RAxe , M87N5RAye , M87N5RAze , M87N5RDxe , M87N5RDye , M87N5RDze , M87N5TAxe , & + M87N5TAye , M87N5TAze , M87N5TDxss , M87N5TDyss , M87N5TDzss , M87N6FKxe , M87N6FKye , & + M87N6FKze , M87N6FMxe , M87N6FMye , M87N6FMze , M87N6MKxe , M87N6MKye , M87N6MKze , & + M87N6MMxe , M87N6MMye , M87N6MMze , M87N6RAxe , M87N6RAye , M87N6RAze , M87N6RDxe , & + M87N6RDye , M87N6RDze , M87N6TAxe , M87N6TAye , M87N6TAze , M87N6TDxss , M87N6TDyss , & + M87N6TDzss , M87N7FKxe , M87N7FKye , M87N7FKze , M87N7FMxe , M87N7FMye , M87N7FMze , & + M87N7MKxe , M87N7MKye , M87N7MKze , M87N7MMxe , M87N7MMye , M87N7MMze , M87N7RAxe , & + M87N7RAye , M87N7RAze , M87N7RDxe , M87N7RDye , M87N7RDze , M87N7TAxe , M87N7TAye , & + M87N7TAze , M87N7TDxss , M87N7TDyss , M87N7TDzss , M87N8FKxe , M87N8FKye , M87N8FKze , & + M87N8FMxe , M87N8FMye , M87N8FMze , M87N8MKxe , M87N8MKye , M87N8MKze , M87N8MMxe , & + M87N8MMye , M87N8MMze , M87N8RAxe , M87N8RAye , M87N8RAze , M87N8RDxe , M87N8RDye , & + M87N8RDze , M87N8TAxe , M87N8TAye , M87N8TAze , M87N8TDxss , M87N8TDyss , M87N8TDzss , & + M87N9FKxe , M87N9FKye , M87N9FKze , M87N9FMxe , M87N9FMye , M87N9FMze , M87N9MKxe , & + M87N9MKye , M87N9MKze , M87N9MMxe , M87N9MMye , M87N9MMze , M87N9RAxe , M87N9RAye , & + M87N9RAze , M87N9RDxe , M87N9RDye , M87N9RDze , M87N9TAxe , M87N9TAye , M87N9TAze , & + M87N9TDxss , M87N9TDyss , M87N9TDzss , M88N1FKxe , M88N1FKye , M88N1FKze , M88N1FMxe , & + M88N1FMye , M88N1FMze , M88N1MKxe , M88N1MKye , M88N1MKze , M88N1MMxe , M88N1MMye , & + M88N1MMze , M88N1RAxe , M88N1RAye , M88N1RAze , M88N1RDxe , M88N1RDye , M88N1RDze , & + M88N1TAxe , M88N1TAye , M88N1TAze , M88N1TDxss , M88N1TDyss , M88N1TDzss , M88N2FKxe , & + M88N2FKye , M88N2FKze , M88N2FMxe , M88N2FMye , M88N2FMze , M88N2MKxe , M88N2MKye , & + M88N2MKze , M88N2MMxe , M88N2MMye , M88N2MMze , M88N2RAxe , M88N2RAye , M88N2RAze , & + M88N2RDxe , M88N2RDye , M88N2RDze , M88N2TAxe , M88N2TAye , M88N2TAze , M88N2TDxss , & + M88N2TDyss , M88N2TDzss , M88N3FKxe , M88N3FKye , M88N3FKze , M88N3FMxe , M88N3FMye , & + M88N3FMze , M88N3MKxe , M88N3MKye , M88N3MKze , M88N3MMxe , M88N3MMye , M88N3MMze , & + M88N3RAxe , M88N3RAye , M88N3RAze , M88N3RDxe , M88N3RDye , M88N3RDze , M88N3TAxe , & + M88N3TAye , M88N3TAze , M88N3TDxss , M88N3TDyss , M88N3TDzss , M88N4FKxe , M88N4FKye , & + M88N4FKze , M88N4FMxe , M88N4FMye , M88N4FMze , M88N4MKxe , M88N4MKye , M88N4MKze , & + M88N4MMxe , M88N4MMye , M88N4MMze , M88N4RAxe , M88N4RAye , M88N4RAze , M88N4RDxe , & + M88N4RDye , M88N4RDze , M88N4TAxe , M88N4TAye , M88N4TAze , M88N4TDxss , M88N4TDyss , & + M88N4TDzss , M88N5FKxe , M88N5FKye , M88N5FKze , M88N5FMxe , M88N5FMye , M88N5FMze , & + M88N5MKxe , M88N5MKye , M88N5MKze , M88N5MMxe , M88N5MMye , M88N5MMze , M88N5RAxe , & + M88N5RAye , M88N5RAze , M88N5RDxe , M88N5RDye , M88N5RDze , M88N5TAxe , M88N5TAye , & + M88N5TAze , M88N5TDxss , M88N5TDyss , M88N5TDzss , M88N6FKxe , M88N6FKye , M88N6FKze , & + M88N6FMxe , M88N6FMye , M88N6FMze , M88N6MKxe , M88N6MKye , M88N6MKze , M88N6MMxe , & + M88N6MMye , M88N6MMze , M88N6RAxe , M88N6RAye , M88N6RAze , M88N6RDxe , M88N6RDye , & + M88N6RDze , M88N6TAxe , M88N6TAye , M88N6TAze , M88N6TDxss , M88N6TDyss , M88N6TDzss , & + M88N7FKxe , M88N7FKye , M88N7FKze , M88N7FMxe , M88N7FMye , M88N7FMze , M88N7MKxe , & + M88N7MKye , M88N7MKze , M88N7MMxe , M88N7MMye , M88N7MMze , M88N7RAxe , M88N7RAye , & + M88N7RAze , M88N7RDxe , M88N7RDye , M88N7RDze , M88N7TAxe , M88N7TAye , M88N7TAze , & + M88N7TDxss , M88N7TDyss , M88N7TDzss , M88N8FKxe , M88N8FKye , M88N8FKze , M88N8FMxe , & + M88N8FMye , M88N8FMze , M88N8MKxe , M88N8MKye , M88N8MKze , M88N8MMxe , M88N8MMye , & + M88N8MMze , M88N8RAxe , M88N8RAye , M88N8RAze , M88N8RDxe , M88N8RDye , M88N8RDze , & + M88N8TAxe , M88N8TAye , M88N8TAze , M88N8TDxss , M88N8TDyss , M88N8TDzss , M88N9FKxe , & + M88N9FKye , M88N9FKze , M88N9FMxe , M88N9FMye , M88N9FMze , M88N9MKxe , M88N9MKye , & + M88N9MKze , M88N9MMxe , M88N9MMye , M88N9MMze , M88N9RAxe , M88N9RAye , M88N9RAze , & + M88N9RDxe , M88N9RDye , M88N9RDze , M88N9TAxe , M88N9TAye , M88N9TAze , M88N9TDxss , & + M88N9TDyss , M88N9TDzss , M89N1FKxe , M89N1FKye , M89N1FKze , M89N1FMxe , M89N1FMye , & + M89N1FMze , M89N1MKxe , M89N1MKye , M89N1MKze , M89N1MMxe , M89N1MMye , M89N1MMze , & + M89N1RAxe , M89N1RAye , M89N1RAze , M89N1RDxe , M89N1RDye , M89N1RDze , M89N1TAxe , & + M89N1TAye , M89N1TAze , M89N1TDxss , M89N1TDyss , M89N1TDzss , M89N2FKxe , M89N2FKye , & + M89N2FKze , M89N2FMxe , M89N2FMye , M89N2FMze , M89N2MKxe , M89N2MKye , M89N2MKze , & + M89N2MMxe , M89N2MMye , M89N2MMze , M89N2RAxe , M89N2RAye , M89N2RAze , M89N2RDxe , & + M89N2RDye , M89N2RDze , M89N2TAxe , M89N2TAye , M89N2TAze , M89N2TDxss , M89N2TDyss , & + M89N2TDzss , M89N3FKxe , M89N3FKye , M89N3FKze , M89N3FMxe , M89N3FMye , M89N3FMze , & + M89N3MKxe , M89N3MKye , M89N3MKze , M89N3MMxe , M89N3MMye , M89N3MMze , M89N3RAxe , & + M89N3RAye , M89N3RAze , M89N3RDxe , M89N3RDye , M89N3RDze , M89N3TAxe , M89N3TAye , & + M89N3TAze , M89N3TDxss , M89N3TDyss , M89N3TDzss , M89N4FKxe , M89N4FKye , M89N4FKze , & + M89N4FMxe , M89N4FMye , M89N4FMze , M89N4MKxe , M89N4MKye , M89N4MKze , M89N4MMxe , & + M89N4MMye , M89N4MMze , M89N4RAxe , M89N4RAye , M89N4RAze , M89N4RDxe , M89N4RDye , & + M89N4RDze , M89N4TAxe , M89N4TAye , M89N4TAze , M89N4TDxss , M89N4TDyss , M89N4TDzss , & + M89N5FKxe , M89N5FKye , M89N5FKze , M89N5FMxe , M89N5FMye , M89N5FMze , M89N5MKxe , & + M89N5MKye , M89N5MKze , M89N5MMxe , M89N5MMye , M89N5MMze , M89N5RAxe , M89N5RAye , & + M89N5RAze , M89N5RDxe , M89N5RDye , M89N5RDze , M89N5TAxe , M89N5TAye , M89N5TAze , & + M89N5TDxss , M89N5TDyss , M89N5TDzss , M89N6FKxe , M89N6FKye , M89N6FKze , M89N6FMxe , & + M89N6FMye , M89N6FMze , M89N6MKxe , M89N6MKye , M89N6MKze , M89N6MMxe , M89N6MMye , & + M89N6MMze , M89N6RAxe , M89N6RAye , M89N6RAze , M89N6RDxe , M89N6RDye , M89N6RDze , & + M89N6TAxe , M89N6TAye , M89N6TAze , M89N6TDxss , M89N6TDyss , M89N6TDzss , M89N7FKxe , & + M89N7FKye , M89N7FKze , M89N7FMxe , M89N7FMye , M89N7FMze , M89N7MKxe , M89N7MKye , & + M89N7MKze , M89N7MMxe , M89N7MMye , M89N7MMze , M89N7RAxe , M89N7RAye , M89N7RAze , & + M89N7RDxe , M89N7RDye , M89N7RDze , M89N7TAxe , M89N7TAye , M89N7TAze , M89N7TDxss , & + M89N7TDyss , M89N7TDzss , M89N8FKxe , M89N8FKye , M89N8FKze , M89N8FMxe , M89N8FMye , & + M89N8FMze , M89N8MKxe , M89N8MKye , M89N8MKze , M89N8MMxe , M89N8MMye , M89N8MMze , & + M89N8RAxe , M89N8RAye , M89N8RAze , M89N8RDxe , M89N8RDye , M89N8RDze , M89N8TAxe , & + M89N8TAye , M89N8TAze , M89N8TDxss , M89N8TDyss , M89N8TDzss , M89N9FKxe , M89N9FKye , & + M89N9FKze , M89N9FMxe , M89N9FMye , M89N9FMze , M89N9MKxe , M89N9MKye , M89N9MKze , & + M89N9MMxe , M89N9MMye , M89N9MMze , M89N9RAxe , M89N9RAye , M89N9RAze , M89N9RDxe , & + M89N9RDye , M89N9RDze , M89N9TAxe , M89N9TAye , M89N9TAze , M89N9TDxss , M89N9TDyss , & + M89N9TDzss , M90N1FKxe , M90N1FKye , M90N1FKze , M90N1FMxe , M90N1FMye , M90N1FMze , & + M90N1MKxe , M90N1MKye , M90N1MKze , M90N1MMxe , M90N1MMye , M90N1MMze , M90N1RAxe , & + M90N1RAye , M90N1RAze , M90N1RDxe , M90N1RDye , M90N1RDze , M90N1TAxe , M90N1TAye , & + M90N1TAze , M90N1TDxss , M90N1TDyss , M90N1TDzss , M90N2FKxe , M90N2FKye , M90N2FKze , & + M90N2FMxe , M90N2FMye , M90N2FMze , M90N2MKxe , M90N2MKye , M90N2MKze , M90N2MMxe , & + M90N2MMye , M90N2MMze , M90N2RAxe , M90N2RAye , M90N2RAze , M90N2RDxe , M90N2RDye , & + M90N2RDze , M90N2TAxe , M90N2TAye , M90N2TAze , M90N2TDxss , M90N2TDyss , M90N2TDzss , & + M90N3FKxe , M90N3FKye , M90N3FKze , M90N3FMxe , M90N3FMye , M90N3FMze , M90N3MKxe , & + M90N3MKye , M90N3MKze , M90N3MMxe , M90N3MMye , M90N3MMze , M90N3RAxe , M90N3RAye , & + M90N3RAze , M90N3RDxe , M90N3RDye , M90N3RDze , M90N3TAxe , M90N3TAye , M90N3TAze , & + M90N3TDxss , M90N3TDyss , M90N3TDzss , M90N4FKxe , M90N4FKye , M90N4FKze , M90N4FMxe , & + M90N4FMye , M90N4FMze , M90N4MKxe , M90N4MKye , M90N4MKze , M90N4MMxe , M90N4MMye , & + M90N4MMze , M90N4RAxe , M90N4RAye , M90N4RAze , M90N4RDxe , M90N4RDye , M90N4RDze , & + M90N4TAxe , M90N4TAye , M90N4TAze , M90N4TDxss , M90N4TDyss , M90N4TDzss , M90N5FKxe , & + M90N5FKye , M90N5FKze , M90N5FMxe , M90N5FMye , M90N5FMze , M90N5MKxe , M90N5MKye , & + M90N5MKze , M90N5MMxe , M90N5MMye , M90N5MMze , M90N5RAxe , M90N5RAye , M90N5RAze , & + M90N5RDxe , M90N5RDye , M90N5RDze , M90N5TAxe , M90N5TAye , M90N5TAze , M90N5TDxss , & + M90N5TDyss , M90N5TDzss , M90N6FKxe , M90N6FKye , M90N6FKze , M90N6FMxe , M90N6FMye , & + M90N6FMze , M90N6MKxe , M90N6MKye , M90N6MKze , M90N6MMxe , M90N6MMye , M90N6MMze , & + M90N6RAxe , M90N6RAye , M90N6RAze , M90N6RDxe , M90N6RDye , M90N6RDze , M90N6TAxe , & + M90N6TAye , M90N6TAze , M90N6TDxss , M90N6TDyss , M90N6TDzss , M90N7FKxe , M90N7FKye , & + M90N7FKze , M90N7FMxe , M90N7FMye , M90N7FMze , M90N7MKxe , M90N7MKye , M90N7MKze , & + M90N7MMxe , M90N7MMye , M90N7MMze , M90N7RAxe , M90N7RAye , M90N7RAze , M90N7RDxe , & + M90N7RDye , M90N7RDze , M90N7TAxe , M90N7TAye , M90N7TAze , M90N7TDxss , M90N7TDyss , & + M90N7TDzss , M90N8FKxe , M90N8FKye , M90N8FKze , M90N8FMxe , M90N8FMye , M90N8FMze , & + M90N8MKxe , M90N8MKye , M90N8MKze , M90N8MMxe , M90N8MMye , M90N8MMze , M90N8RAxe , & + M90N8RAye , M90N8RAze , M90N8RDxe , M90N8RDye , M90N8RDze , M90N8TAxe , M90N8TAye , & + M90N8TAze , M90N8TDxss , M90N8TDyss , M90N8TDzss , M90N9FKxe , M90N9FKye , M90N9FKze , & + M90N9FMxe , M90N9FMye , M90N9FMze , M90N9MKxe , M90N9MKye , M90N9MKze , M90N9MMxe , & + M90N9MMye , M90N9MMze , M90N9RAxe , M90N9RAye , M90N9RAze , M90N9RDxe , M90N9RDye , & + M90N9RDze , M90N9TAxe , M90N9TAye , M90N9TAze , M90N9TDxss , M90N9TDyss , M90N9TDzss , & + M91N1FKxe , M91N1FKye , M91N1FKze , M91N1FMxe , M91N1FMye , M91N1FMze , M91N1MKxe , & + M91N1MKye , M91N1MKze , M91N1MMxe , M91N1MMye , M91N1MMze , M91N1RAxe , M91N1RAye , & + M91N1RAze , M91N1RDxe , M91N1RDye , M91N1RDze , M91N1TAxe , M91N1TAye , M91N1TAze , & + M91N1TDxss , M91N1TDyss , M91N1TDzss , M91N2FKxe , M91N2FKye , M91N2FKze , M91N2FMxe , & + M91N2FMye , M91N2FMze , M91N2MKxe , M91N2MKye , M91N2MKze , M91N2MMxe , M91N2MMye , & + M91N2MMze , M91N2RAxe , M91N2RAye , M91N2RAze , M91N2RDxe , M91N2RDye , M91N2RDze , & + M91N2TAxe , M91N2TAye , M91N2TAze , M91N2TDxss , M91N2TDyss , M91N2TDzss , M91N3FKxe , & + M91N3FKye , M91N3FKze , M91N3FMxe , M91N3FMye , M91N3FMze , M91N3MKxe , M91N3MKye , & + M91N3MKze , M91N3MMxe , M91N3MMye , M91N3MMze , M91N3RAxe , M91N3RAye , M91N3RAze , & + M91N3RDxe , M91N3RDye , M91N3RDze , M91N3TAxe , M91N3TAye , M91N3TAze , M91N3TDxss , & + M91N3TDyss , M91N3TDzss , M91N4FKxe , M91N4FKye , M91N4FKze , M91N4FMxe , M91N4FMye , & + M91N4FMze , M91N4MKxe , M91N4MKye , M91N4MKze , M91N4MMxe , M91N4MMye , M91N4MMze , & + M91N4RAxe , M91N4RAye , M91N4RAze , M91N4RDxe , M91N4RDye , M91N4RDze , M91N4TAxe , & + M91N4TAye , M91N4TAze , M91N4TDxss , M91N4TDyss , M91N4TDzss , M91N5FKxe , M91N5FKye , & + M91N5FKze , M91N5FMxe , M91N5FMye , M91N5FMze , M91N5MKxe , M91N5MKye , M91N5MKze , & + M91N5MMxe , M91N5MMye , M91N5MMze , M91N5RAxe , M91N5RAye , M91N5RAze , M91N5RDxe , & + M91N5RDye , M91N5RDze , M91N5TAxe , M91N5TAye , M91N5TAze , M91N5TDxss , M91N5TDyss , & + M91N5TDzss , M91N6FKxe , M91N6FKye , M91N6FKze , M91N6FMxe , M91N6FMye , M91N6FMze , & + M91N6MKxe , M91N6MKye , M91N6MKze , M91N6MMxe , M91N6MMye , M91N6MMze , M91N6RAxe , & + M91N6RAye , M91N6RAze , M91N6RDxe , M91N6RDye , M91N6RDze , M91N6TAxe , M91N6TAye , & + M91N6TAze , M91N6TDxss , M91N6TDyss , M91N6TDzss , M91N7FKxe , M91N7FKye , M91N7FKze , & + M91N7FMxe , M91N7FMye , M91N7FMze , M91N7MKxe , M91N7MKye , M91N7MKze , M91N7MMxe , & + M91N7MMye , M91N7MMze , M91N7RAxe , M91N7RAye , M91N7RAze , M91N7RDxe , M91N7RDye , & + M91N7RDze , M91N7TAxe , M91N7TAye , M91N7TAze , M91N7TDxss , M91N7TDyss , M91N7TDzss , & + M91N8FKxe , M91N8FKye , M91N8FKze , M91N8FMxe , M91N8FMye , M91N8FMze , M91N8MKxe , & + M91N8MKye , M91N8MKze , M91N8MMxe , M91N8MMye , M91N8MMze , M91N8RAxe , M91N8RAye , & + M91N8RAze , M91N8RDxe , M91N8RDye , M91N8RDze , M91N8TAxe , M91N8TAye , M91N8TAze , & + M91N8TDxss , M91N8TDyss , M91N8TDzss , M91N9FKxe , M91N9FKye , M91N9FKze , M91N9FMxe , & + M91N9FMye , M91N9FMze , M91N9MKxe , M91N9MKye , M91N9MKze , M91N9MMxe , M91N9MMye , & + M91N9MMze , M91N9RAxe , M91N9RAye , M91N9RAze , M91N9RDxe , M91N9RDye , M91N9RDze , & + M91N9TAxe , M91N9TAye , M91N9TAze , M91N9TDxss , M91N9TDyss , M91N9TDzss , M92N1FKxe , & + M92N1FKye , M92N1FKze , M92N1FMxe , M92N1FMye , M92N1FMze , M92N1MKxe , M92N1MKye , & + M92N1MKze , M92N1MMxe , M92N1MMye , M92N1MMze , M92N1RAxe , M92N1RAye , M92N1RAze , & + M92N1RDxe , M92N1RDye , M92N1RDze , M92N1TAxe , M92N1TAye , M92N1TAze , M92N1TDxss , & + M92N1TDyss , M92N1TDzss , M92N2FKxe , M92N2FKye , M92N2FKze , M92N2FMxe , M92N2FMye , & + M92N2FMze , M92N2MKxe , M92N2MKye , M92N2MKze , M92N2MMxe , M92N2MMye , M92N2MMze , & + M92N2RAxe , M92N2RAye , M92N2RAze , M92N2RDxe , M92N2RDye , M92N2RDze , M92N2TAxe , & + M92N2TAye , M92N2TAze , M92N2TDxss , M92N2TDyss , M92N2TDzss , M92N3FKxe , M92N3FKye , & + M92N3FKze , M92N3FMxe , M92N3FMye , M92N3FMze , M92N3MKxe , M92N3MKye , M92N3MKze , & + M92N3MMxe , M92N3MMye , M92N3MMze , M92N3RAxe , M92N3RAye , M92N3RAze , M92N3RDxe , & + M92N3RDye , M92N3RDze , M92N3TAxe , M92N3TAye , M92N3TAze , M92N3TDxss , M92N3TDyss , & + M92N3TDzss , M92N4FKxe , M92N4FKye , M92N4FKze , M92N4FMxe , M92N4FMye , M92N4FMze , & + M92N4MKxe , M92N4MKye , M92N4MKze , M92N4MMxe , M92N4MMye , M92N4MMze , M92N4RAxe , & + M92N4RAye , M92N4RAze , M92N4RDxe , M92N4RDye , M92N4RDze , M92N4TAxe , M92N4TAye , & + M92N4TAze , M92N4TDxss , M92N4TDyss , M92N4TDzss , M92N5FKxe , M92N5FKye , M92N5FKze , & + M92N5FMxe , M92N5FMye , M92N5FMze , M92N5MKxe , M92N5MKye , M92N5MKze , M92N5MMxe , & + M92N5MMye , M92N5MMze , M92N5RAxe , M92N5RAye , M92N5RAze , M92N5RDxe , M92N5RDye , & + M92N5RDze , M92N5TAxe , M92N5TAye , M92N5TAze , M92N5TDxss , M92N5TDyss , M92N5TDzss , & + M92N6FKxe , M92N6FKye , M92N6FKze , M92N6FMxe , M92N6FMye , M92N6FMze , M92N6MKxe , & + M92N6MKye , M92N6MKze , M92N6MMxe , M92N6MMye , M92N6MMze , M92N6RAxe , M92N6RAye , & + M92N6RAze , M92N6RDxe , M92N6RDye , M92N6RDze , M92N6TAxe , M92N6TAye , M92N6TAze , & + M92N6TDxss , M92N6TDyss , M92N6TDzss , M92N7FKxe , M92N7FKye , M92N7FKze , M92N7FMxe , & + M92N7FMye , M92N7FMze , M92N7MKxe , M92N7MKye , M92N7MKze , M92N7MMxe , M92N7MMye , & + M92N7MMze , M92N7RAxe , M92N7RAye , M92N7RAze , M92N7RDxe , M92N7RDye , M92N7RDze , & + M92N7TAxe , M92N7TAye , M92N7TAze , M92N7TDxss , M92N7TDyss , M92N7TDzss , M92N8FKxe , & + M92N8FKye , M92N8FKze , M92N8FMxe , M92N8FMye , M92N8FMze , M92N8MKxe , M92N8MKye , & + M92N8MKze , M92N8MMxe , M92N8MMye , M92N8MMze , M92N8RAxe , M92N8RAye , M92N8RAze , & + M92N8RDxe , M92N8RDye , M92N8RDze , M92N8TAxe , M92N8TAye , M92N8TAze , M92N8TDxss , & + M92N8TDyss , M92N8TDzss , M92N9FKxe , M92N9FKye , M92N9FKze , M92N9FMxe , M92N9FMye , & + M92N9FMze , M92N9MKxe , M92N9MKye , M92N9MKze , M92N9MMxe , M92N9MMye , M92N9MMze , & + M92N9RAxe , M92N9RAye , M92N9RAze , M92N9RDxe , M92N9RDye , M92N9RDze , M92N9TAxe , & + M92N9TAye , M92N9TAze , M92N9TDxss , M92N9TDyss , M92N9TDzss , M93N1FKxe , M93N1FKye , & + M93N1FKze , M93N1FMxe , M93N1FMye , M93N1FMze , M93N1MKxe , M93N1MKye , M93N1MKze , & + M93N1MMxe , M93N1MMye , M93N1MMze , M93N1RAxe , M93N1RAye , M93N1RAze , M93N1RDxe , & + M93N1RDye , M93N1RDze , M93N1TAxe , M93N1TAye , M93N1TAze , M93N1TDxss , M93N1TDyss , & + M93N1TDzss , M93N2FKxe , M93N2FKye , M93N2FKze , M93N2FMxe , M93N2FMye , M93N2FMze , & + M93N2MKxe , M93N2MKye , M93N2MKze , M93N2MMxe , M93N2MMye , M93N2MMze , M93N2RAxe , & + M93N2RAye , M93N2RAze , M93N2RDxe , M93N2RDye , M93N2RDze , M93N2TAxe , M93N2TAye , & + M93N2TAze , M93N2TDxss , M93N2TDyss , M93N2TDzss , M93N3FKxe , M93N3FKye , M93N3FKze , & + M93N3FMxe , M93N3FMye , M93N3FMze , M93N3MKxe , M93N3MKye , M93N3MKze , M93N3MMxe , & + M93N3MMye , M93N3MMze , M93N3RAxe , M93N3RAye , M93N3RAze , M93N3RDxe , M93N3RDye , & + M93N3RDze , M93N3TAxe , M93N3TAye , M93N3TAze , M93N3TDxss , M93N3TDyss , M93N3TDzss , & + M93N4FKxe , M93N4FKye , M93N4FKze , M93N4FMxe , M93N4FMye , M93N4FMze , M93N4MKxe , & + M93N4MKye , M93N4MKze , M93N4MMxe , M93N4MMye , M93N4MMze , M93N4RAxe , M93N4RAye , & + M93N4RAze , M93N4RDxe , M93N4RDye , M93N4RDze , M93N4TAxe , M93N4TAye , M93N4TAze , & + M93N4TDxss , M93N4TDyss , M93N4TDzss , M93N5FKxe , M93N5FKye , M93N5FKze , M93N5FMxe , & + M93N5FMye , M93N5FMze , M93N5MKxe , M93N5MKye , M93N5MKze , M93N5MMxe , M93N5MMye , & + M93N5MMze , M93N5RAxe , M93N5RAye , M93N5RAze , M93N5RDxe , M93N5RDye , M93N5RDze , & + M93N5TAxe , M93N5TAye , M93N5TAze , M93N5TDxss , M93N5TDyss , M93N5TDzss , M93N6FKxe , & + M93N6FKye , M93N6FKze , M93N6FMxe , M93N6FMye , M93N6FMze , M93N6MKxe , M93N6MKye , & + M93N6MKze , M93N6MMxe , M93N6MMye , M93N6MMze , M93N6RAxe , M93N6RAye , M93N6RAze , & + M93N6RDxe , M93N6RDye , M93N6RDze , M93N6TAxe , M93N6TAye , M93N6TAze , M93N6TDxss , & + M93N6TDyss , M93N6TDzss , M93N7FKxe , M93N7FKye , M93N7FKze , M93N7FMxe , M93N7FMye , & + M93N7FMze , M93N7MKxe , M93N7MKye , M93N7MKze , M93N7MMxe , M93N7MMye , M93N7MMze /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry13(1677) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + M93N7RAxe , M93N7RAye , M93N7RAze , M93N7RDxe , M93N7RDye , M93N7RDze , M93N7TAxe , & + M93N7TAye , M93N7TAze , M93N7TDxss , M93N7TDyss , M93N7TDzss , M93N8FKxe , M93N8FKye , & + M93N8FKze , M93N8FMxe , M93N8FMye , M93N8FMze , M93N8MKxe , M93N8MKye , M93N8MKze , & + M93N8MMxe , M93N8MMye , M93N8MMze , M93N8RAxe , M93N8RAye , M93N8RAze , M93N8RDxe , & + M93N8RDye , M93N8RDze , M93N8TAxe , M93N8TAye , M93N8TAze , M93N8TDxss , M93N8TDyss , & + M93N8TDzss , M93N9FKxe , M93N9FKye , M93N9FKze , M93N9FMxe , M93N9FMye , M93N9FMze , & + M93N9MKxe , M93N9MKye , M93N9MKze , M93N9MMxe , M93N9MMye , M93N9MMze , M93N9RAxe , & + M93N9RAye , M93N9RAze , M93N9RDxe , M93N9RDye , M93N9RDze , M93N9TAxe , M93N9TAye , & + M93N9TAze , M93N9TDxss , M93N9TDyss , M93N9TDzss , M94N1FKxe , M94N1FKye , M94N1FKze , & + M94N1FMxe , M94N1FMye , M94N1FMze , M94N1MKxe , M94N1MKye , M94N1MKze , M94N1MMxe , & + M94N1MMye , M94N1MMze , M94N1RAxe , M94N1RAye , M94N1RAze , M94N1RDxe , M94N1RDye , & + M94N1RDze , M94N1TAxe , M94N1TAye , M94N1TAze , M94N1TDxss , M94N1TDyss , M94N1TDzss , & + M94N2FKxe , M94N2FKye , M94N2FKze , M94N2FMxe , M94N2FMye , M94N2FMze , M94N2MKxe , & + M94N2MKye , M94N2MKze , M94N2MMxe , M94N2MMye , M94N2MMze , M94N2RAxe , M94N2RAye , & + M94N2RAze , M94N2RDxe , M94N2RDye , M94N2RDze , M94N2TAxe , M94N2TAye , M94N2TAze , & + M94N2TDxss , M94N2TDyss , M94N2TDzss , M94N3FKxe , M94N3FKye , M94N3FKze , M94N3FMxe , & + M94N3FMye , M94N3FMze , M94N3MKxe , M94N3MKye , M94N3MKze , M94N3MMxe , M94N3MMye , & + M94N3MMze , M94N3RAxe , M94N3RAye , M94N3RAze , M94N3RDxe , M94N3RDye , M94N3RDze , & + M94N3TAxe , M94N3TAye , M94N3TAze , M94N3TDxss , M94N3TDyss , M94N3TDzss , M94N4FKxe , & + M94N4FKye , M94N4FKze , M94N4FMxe , M94N4FMye , M94N4FMze , M94N4MKxe , M94N4MKye , & + M94N4MKze , M94N4MMxe , M94N4MMye , M94N4MMze , M94N4RAxe , M94N4RAye , M94N4RAze , & + M94N4RDxe , M94N4RDye , M94N4RDze , M94N4TAxe , M94N4TAye , M94N4TAze , M94N4TDxss , & + M94N4TDyss , M94N4TDzss , M94N5FKxe , M94N5FKye , M94N5FKze , M94N5FMxe , M94N5FMye , & + M94N5FMze , M94N5MKxe , M94N5MKye , M94N5MKze , M94N5MMxe , M94N5MMye , M94N5MMze , & + M94N5RAxe , M94N5RAye , M94N5RAze , M94N5RDxe , M94N5RDye , M94N5RDze , M94N5TAxe , & + M94N5TAye , M94N5TAze , M94N5TDxss , M94N5TDyss , M94N5TDzss , M94N6FKxe , M94N6FKye , & + M94N6FKze , M94N6FMxe , M94N6FMye , M94N6FMze , M94N6MKxe , M94N6MKye , M94N6MKze , & + M94N6MMxe , M94N6MMye , M94N6MMze , M94N6RAxe , M94N6RAye , M94N6RAze , M94N6RDxe , & + M94N6RDye , M94N6RDze , M94N6TAxe , M94N6TAye , M94N6TAze , M94N6TDxss , M94N6TDyss , & + M94N6TDzss , M94N7FKxe , M94N7FKye , M94N7FKze , M94N7FMxe , M94N7FMye , M94N7FMze , & + M94N7MKxe , M94N7MKye , M94N7MKze , M94N7MMxe , M94N7MMye , M94N7MMze , M94N7RAxe , & + M94N7RAye , M94N7RAze , M94N7RDxe , M94N7RDye , M94N7RDze , M94N7TAxe , M94N7TAye , & + M94N7TAze , M94N7TDxss , M94N7TDyss , M94N7TDzss , M94N8FKxe , M94N8FKye , M94N8FKze , & + M94N8FMxe , M94N8FMye , M94N8FMze , M94N8MKxe , M94N8MKye , M94N8MKze , M94N8MMxe , & + M94N8MMye , M94N8MMze , M94N8RAxe , M94N8RAye , M94N8RAze , M94N8RDxe , M94N8RDye , & + M94N8RDze , M94N8TAxe , M94N8TAye , M94N8TAze , M94N8TDxss , M94N8TDyss , M94N8TDzss , & + M94N9FKxe , M94N9FKye , M94N9FKze , M94N9FMxe , M94N9FMye , M94N9FMze , M94N9MKxe , & + M94N9MKye , M94N9MKze , M94N9MMxe , M94N9MMye , M94N9MMze , M94N9RAxe , M94N9RAye , & + M94N9RAze , M94N9RDxe , M94N9RDye , M94N9RDze , M94N9TAxe , M94N9TAye , M94N9TAze , & + M94N9TDxss , M94N9TDyss , M94N9TDzss , M95N1FKxe , M95N1FKye , M95N1FKze , M95N1FMxe , & + M95N1FMye , M95N1FMze , M95N1MKxe , M95N1MKye , M95N1MKze , M95N1MMxe , M95N1MMye , & + M95N1MMze , M95N1RAxe , M95N1RAye , M95N1RAze , M95N1RDxe , M95N1RDye , M95N1RDze , & + M95N1TAxe , M95N1TAye , M95N1TAze , M95N1TDxss , M95N1TDyss , M95N1TDzss , M95N2FKxe , & + M95N2FKye , M95N2FKze , M95N2FMxe , M95N2FMye , M95N2FMze , M95N2MKxe , M95N2MKye , & + M95N2MKze , M95N2MMxe , M95N2MMye , M95N2MMze , M95N2RAxe , M95N2RAye , M95N2RAze , & + M95N2RDxe , M95N2RDye , M95N2RDze , M95N2TAxe , M95N2TAye , M95N2TAze , M95N2TDxss , & + M95N2TDyss , M95N2TDzss , M95N3FKxe , M95N3FKye , M95N3FKze , M95N3FMxe , M95N3FMye , & + M95N3FMze , M95N3MKxe , M95N3MKye , M95N3MKze , M95N3MMxe , M95N3MMye , M95N3MMze , & + M95N3RAxe , M95N3RAye , M95N3RAze , M95N3RDxe , M95N3RDye , M95N3RDze , M95N3TAxe , & + M95N3TAye , M95N3TAze , M95N3TDxss , M95N3TDyss , M95N3TDzss , M95N4FKxe , M95N4FKye , & + M95N4FKze , M95N4FMxe , M95N4FMye , M95N4FMze , M95N4MKxe , M95N4MKye , M95N4MKze , & + M95N4MMxe , M95N4MMye , M95N4MMze , M95N4RAxe , M95N4RAye , M95N4RAze , M95N4RDxe , & + M95N4RDye , M95N4RDze , M95N4TAxe , M95N4TAye , M95N4TAze , M95N4TDxss , M95N4TDyss , & + M95N4TDzss , M95N5FKxe , M95N5FKye , M95N5FKze , M95N5FMxe , M95N5FMye , M95N5FMze , & + M95N5MKxe , M95N5MKye , M95N5MKze , M95N5MMxe , M95N5MMye , M95N5MMze , M95N5RAxe , & + M95N5RAye , M95N5RAze , M95N5RDxe , M95N5RDye , M95N5RDze , M95N5TAxe , M95N5TAye , & + M95N5TAze , M95N5TDxss , M95N5TDyss , M95N5TDzss , M95N6FKxe , M95N6FKye , M95N6FKze , & + M95N6FMxe , M95N6FMye , M95N6FMze , M95N6MKxe , M95N6MKye , M95N6MKze , M95N6MMxe , & + M95N6MMye , M95N6MMze , M95N6RAxe , M95N6RAye , M95N6RAze , M95N6RDxe , M95N6RDye , & + M95N6RDze , M95N6TAxe , M95N6TAye , M95N6TAze , M95N6TDxss , M95N6TDyss , M95N6TDzss , & + M95N7FKxe , M95N7FKye , M95N7FKze , M95N7FMxe , M95N7FMye , M95N7FMze , M95N7MKxe , & + M95N7MKye , M95N7MKze , M95N7MMxe , M95N7MMye , M95N7MMze , M95N7RAxe , M95N7RAye , & + M95N7RAze , M95N7RDxe , M95N7RDye , M95N7RDze , M95N7TAxe , M95N7TAye , M95N7TAze , & + M95N7TDxss , M95N7TDyss , M95N7TDzss , M95N8FKxe , M95N8FKye , M95N8FKze , M95N8FMxe , & + M95N8FMye , M95N8FMze , M95N8MKxe , M95N8MKye , M95N8MKze , M95N8MMxe , M95N8MMye , & + M95N8MMze , M95N8RAxe , M95N8RAye , M95N8RAze , M95N8RDxe , M95N8RDye , M95N8RDze , & + M95N8TAxe , M95N8TAye , M95N8TAze , M95N8TDxss , M95N8TDyss , M95N8TDzss , M95N9FKxe , & + M95N9FKye , M95N9FKze , M95N9FMxe , M95N9FMye , M95N9FMze , M95N9MKxe , M95N9MKye , & + M95N9MKze , M95N9MMxe , M95N9MMye , M95N9MMze , M95N9RAxe , M95N9RAye , M95N9RAze , & + M95N9RDxe , M95N9RDye , M95N9RDze , M95N9TAxe , M95N9TAye , M95N9TAze , M95N9TDxss , & + M95N9TDyss , M95N9TDzss , M96N1FKxe , M96N1FKye , M96N1FKze , M96N1FMxe , M96N1FMye , & + M96N1FMze , M96N1MKxe , M96N1MKye , M96N1MKze , M96N1MMxe , M96N1MMye , M96N1MMze , & + M96N1RAxe , M96N1RAye , M96N1RAze , M96N1RDxe , M96N1RDye , M96N1RDze , M96N1TAxe , & + M96N1TAye , M96N1TAze , M96N1TDxss , M96N1TDyss , M96N1TDzss , M96N2FKxe , M96N2FKye , & + M96N2FKze , M96N2FMxe , M96N2FMye , M96N2FMze , M96N2MKxe , M96N2MKye , M96N2MKze , & + M96N2MMxe , M96N2MMye , M96N2MMze , M96N2RAxe , M96N2RAye , M96N2RAze , M96N2RDxe , & + M96N2RDye , M96N2RDze , M96N2TAxe , M96N2TAye , M96N2TAze , M96N2TDxss , M96N2TDyss , & + M96N2TDzss , M96N3FKxe , M96N3FKye , M96N3FKze , M96N3FMxe , M96N3FMye , M96N3FMze , & + M96N3MKxe , M96N3MKye , M96N3MKze , M96N3MMxe , M96N3MMye , M96N3MMze , M96N3RAxe , & + M96N3RAye , M96N3RAze , M96N3RDxe , M96N3RDye , M96N3RDze , M96N3TAxe , M96N3TAye , & + M96N3TAze , M96N3TDxss , M96N3TDyss , M96N3TDzss , M96N4FKxe , M96N4FKye , M96N4FKze , & + M96N4FMxe , M96N4FMye , M96N4FMze , M96N4MKxe , M96N4MKye , M96N4MKze , M96N4MMxe , & + M96N4MMye , M96N4MMze , M96N4RAxe , M96N4RAye , M96N4RAze , M96N4RDxe , M96N4RDye , & + M96N4RDze , M96N4TAxe , M96N4TAye , M96N4TAze , M96N4TDxss , M96N4TDyss , M96N4TDzss , & + M96N5FKxe , M96N5FKye , M96N5FKze , M96N5FMxe , M96N5FMye , M96N5FMze , M96N5MKxe , & + M96N5MKye , M96N5MKze , M96N5MMxe , M96N5MMye , M96N5MMze , M96N5RAxe , M96N5RAye , & + M96N5RAze , M96N5RDxe , M96N5RDye , M96N5RDze , M96N5TAxe , M96N5TAye , M96N5TAze , & + M96N5TDxss , M96N5TDyss , M96N5TDzss , M96N6FKxe , M96N6FKye , M96N6FKze , M96N6FMxe , & + M96N6FMye , M96N6FMze , M96N6MKxe , M96N6MKye , M96N6MKze , M96N6MMxe , M96N6MMye , & + M96N6MMze , M96N6RAxe , M96N6RAye , M96N6RAze , M96N6RDxe , M96N6RDye , M96N6RDze , & + M96N6TAxe , M96N6TAye , M96N6TAze , M96N6TDxss , M96N6TDyss , M96N6TDzss , M96N7FKxe , & + M96N7FKye , M96N7FKze , M96N7FMxe , M96N7FMye , M96N7FMze , M96N7MKxe , M96N7MKye , & + M96N7MKze , M96N7MMxe , M96N7MMye , M96N7MMze , M96N7RAxe , M96N7RAye , M96N7RAze , & + M96N7RDxe , M96N7RDye , M96N7RDze , M96N7TAxe , M96N7TAye , M96N7TAze , M96N7TDxss , & + M96N7TDyss , M96N7TDzss , M96N8FKxe , M96N8FKye , M96N8FKze , M96N8FMxe , M96N8FMye , & + M96N8FMze , M96N8MKxe , M96N8MKye , M96N8MKze , M96N8MMxe , M96N8MMye , M96N8MMze , & + M96N8RAxe , M96N8RAye , M96N8RAze , M96N8RDxe , M96N8RDye , M96N8RDze , M96N8TAxe , & + M96N8TAye , M96N8TAze , M96N8TDxss , M96N8TDyss , M96N8TDzss , M96N9FKxe , M96N9FKye , & + M96N9FKze , M96N9FMxe , M96N9FMye , M96N9FMze , M96N9MKxe , M96N9MKye , M96N9MKze , & + M96N9MMxe , M96N9MMye , M96N9MMze , M96N9RAxe , M96N9RAye , M96N9RAze , M96N9RDxe , & + M96N9RDye , M96N9RDze , M96N9TAxe , M96N9TAye , M96N9TAze , M96N9TDxss , M96N9TDyss , & + M96N9TDzss , M97N1FKxe , M97N1FKye , M97N1FKze , M97N1FMxe , M97N1FMye , M97N1FMze , & + M97N1MKxe , M97N1MKye , M97N1MKze , M97N1MMxe , M97N1MMye , M97N1MMze , M97N1RAxe , & + M97N1RAye , M97N1RAze , M97N1RDxe , M97N1RDye , M97N1RDze , M97N1TAxe , M97N1TAye , & + M97N1TAze , M97N1TDxss , M97N1TDyss , M97N1TDzss , M97N2FKxe , M97N2FKye , M97N2FKze , & + M97N2FMxe , M97N2FMye , M97N2FMze , M97N2MKxe , M97N2MKye , M97N2MKze , M97N2MMxe , & + M97N2MMye , M97N2MMze , M97N2RAxe , M97N2RAye , M97N2RAze , M97N2RDxe , M97N2RDye , & + M97N2RDze , M97N2TAxe , M97N2TAye , M97N2TAze , M97N2TDxss , M97N2TDyss , M97N2TDzss , & + M97N3FKxe , M97N3FKye , M97N3FKze , M97N3FMxe , M97N3FMye , M97N3FMze , M97N3MKxe , & + M97N3MKye , M97N3MKze , M97N3MMxe , M97N3MMye , M97N3MMze , M97N3RAxe , M97N3RAye , & + M97N3RAze , M97N3RDxe , M97N3RDye , M97N3RDze , M97N3TAxe , M97N3TAye , M97N3TAze , & + M97N3TDxss , M97N3TDyss , M97N3TDzss , M97N4FKxe , M97N4FKye , M97N4FKze , M97N4FMxe , & + M97N4FMye , M97N4FMze , M97N4MKxe , M97N4MKye , M97N4MKze , M97N4MMxe , M97N4MMye , & + M97N4MMze , M97N4RAxe , M97N4RAye , M97N4RAze , M97N4RDxe , M97N4RDye , M97N4RDze , & + M97N4TAxe , M97N4TAye , M97N4TAze , M97N4TDxss , M97N4TDyss , M97N4TDzss , M97N5FKxe , & + M97N5FKye , M97N5FKze , M97N5FMxe , M97N5FMye , M97N5FMze , M97N5MKxe , M97N5MKye , & + M97N5MKze , M97N5MMxe , M97N5MMye , M97N5MMze , M97N5RAxe , M97N5RAye , M97N5RAze , & + M97N5RDxe , M97N5RDye , M97N5RDze , M97N5TAxe , M97N5TAye , M97N5TAze , M97N5TDxss , & + M97N5TDyss , M97N5TDzss , M97N6FKxe , M97N6FKye , M97N6FKze , M97N6FMxe , M97N6FMye , & + M97N6FMze , M97N6MKxe , M97N6MKye , M97N6MKze , M97N6MMxe , M97N6MMye , M97N6MMze , & + M97N6RAxe , M97N6RAye , M97N6RAze , M97N6RDxe , M97N6RDye , M97N6RDze , M97N6TAxe , & + M97N6TAye , M97N6TAze , M97N6TDxss , M97N6TDyss , M97N6TDzss , M97N7FKxe , M97N7FKye , & + M97N7FKze , M97N7FMxe , M97N7FMye , M97N7FMze , M97N7MKxe , M97N7MKye , M97N7MKze , & + M97N7MMxe , M97N7MMye , M97N7MMze , M97N7RAxe , M97N7RAye , M97N7RAze , M97N7RDxe , & + M97N7RDye , M97N7RDze , M97N7TAxe , M97N7TAye , M97N7TAze , M97N7TDxss , M97N7TDyss , & + M97N7TDzss , M97N8FKxe , M97N8FKye , M97N8FKze , M97N8FMxe , M97N8FMye , M97N8FMze , & + M97N8MKxe , M97N8MKye , M97N8MKze , M97N8MMxe , M97N8MMye , M97N8MMze , M97N8RAxe , & + M97N8RAye , M97N8RAze , M97N8RDxe , M97N8RDye , M97N8RDze , M97N8TAxe , M97N8TAye , & + M97N8TAze , M97N8TDxss , M97N8TDyss , M97N8TDzss , M97N9FKxe , M97N9FKye , M97N9FKze , & + M97N9FMxe , M97N9FMye , M97N9FMze , M97N9MKxe , M97N9MKye , M97N9MKze , M97N9MMxe , & + M97N9MMye , M97N9MMze , M97N9RAxe , M97N9RAye , M97N9RAze , M97N9RDxe , M97N9RDye , & + M97N9RDze , M97N9TAxe , M97N9TAye , M97N9TAze , M97N9TDxss , M97N9TDyss , M97N9TDzss , & + M98N1FKxe , M98N1FKye , M98N1FKze , M98N1FMxe , M98N1FMye , M98N1FMze , M98N1MKxe , & + M98N1MKye , M98N1MKze , M98N1MMxe , M98N1MMye , M98N1MMze , M98N1RAxe , M98N1RAye , & + M98N1RAze , M98N1RDxe , M98N1RDye , M98N1RDze , M98N1TAxe , M98N1TAye , M98N1TAze , & + M98N1TDxss , M98N1TDyss , M98N1TDzss , M98N2FKxe , M98N2FKye , M98N2FKze , M98N2FMxe , & + M98N2FMye , M98N2FMze , M98N2MKxe , M98N2MKye , M98N2MKze , M98N2MMxe , M98N2MMye , & + M98N2MMze , M98N2RAxe , M98N2RAye , M98N2RAze , M98N2RDxe , M98N2RDye , M98N2RDze , & + M98N2TAxe , M98N2TAye , M98N2TAze , M98N2TDxss , M98N2TDyss , M98N2TDzss , M98N3FKxe , & + M98N3FKye , M98N3FKze , M98N3FMxe , M98N3FMye , M98N3FMze , M98N3MKxe , M98N3MKye , & + M98N3MKze , M98N3MMxe , M98N3MMye , M98N3MMze , M98N3RAxe , M98N3RAye , M98N3RAze , & + M98N3RDxe , M98N3RDye , M98N3RDze , M98N3TAxe , M98N3TAye , M98N3TAze , M98N3TDxss , & + M98N3TDyss , M98N3TDzss , M98N4FKxe , M98N4FKye , M98N4FKze , M98N4FMxe , M98N4FMye , & + M98N4FMze , M98N4MKxe , M98N4MKye , M98N4MKze , M98N4MMxe , M98N4MMye , M98N4MMze , & + M98N4RAxe , M98N4RAye , M98N4RAze , M98N4RDxe , M98N4RDye , M98N4RDze , M98N4TAxe , & + M98N4TAye , M98N4TAze , M98N4TDxss , M98N4TDyss , M98N4TDzss , M98N5FKxe , M98N5FKye , & + M98N5FKze , M98N5FMxe , M98N5FMye , M98N5FMze , M98N5MKxe , M98N5MKye , M98N5MKze , & + M98N5MMxe , M98N5MMye , M98N5MMze , M98N5RAxe , M98N5RAye , M98N5RAze , M98N5RDxe , & + M98N5RDye , M98N5RDze , M98N5TAxe , M98N5TAye , M98N5TAze , M98N5TDxss , M98N5TDyss , & + M98N5TDzss , M98N6FKxe , M98N6FKye , M98N6FKze , M98N6FMxe , M98N6FMye , M98N6FMze , & + M98N6MKxe , M98N6MKye , M98N6MKze , M98N6MMxe , M98N6MMye , M98N6MMze , M98N6RAxe , & + M98N6RAye , M98N6RAze , M98N6RDxe , M98N6RDye , M98N6RDze , M98N6TAxe , M98N6TAye , & + M98N6TAze , M98N6TDxss , M98N6TDyss , M98N6TDzss , M98N7FKxe , M98N7FKye , M98N7FKze , & + M98N7FMxe , M98N7FMye , M98N7FMze , M98N7MKxe , M98N7MKye , M98N7MKze , M98N7MMxe , & + M98N7MMye , M98N7MMze , M98N7RAxe , M98N7RAye , M98N7RAze , M98N7RDxe , M98N7RDye , & + M98N7RDze , M98N7TAxe , M98N7TAye , M98N7TAze , M98N7TDxss , M98N7TDyss , M98N7TDzss , & + M98N8FKxe , M98N8FKye , M98N8FKze , M98N8FMxe , M98N8FMye , M98N8FMze , M98N8MKxe , & + M98N8MKye , M98N8MKze , M98N8MMxe , M98N8MMye , M98N8MMze , M98N8RAxe , M98N8RAye , & + M98N8RAze , M98N8RDxe , M98N8RDye , M98N8RDze , M98N8TAxe , M98N8TAye , M98N8TAze , & + M98N8TDxss , M98N8TDyss , M98N8TDzss , M98N9FKxe , M98N9FKye , M98N9FKze , M98N9FMxe , & + M98N9FMye , M98N9FMze , M98N9MKxe , M98N9MKye , M98N9MKze , M98N9MMxe , M98N9MMye , & + M98N9MMze , M98N9RAxe , M98N9RAye , M98N9RAze , M98N9RDxe , M98N9RDye , M98N9RDze , & + M98N9TAxe , M98N9TAye , M98N9TAze , M98N9TDxss , M98N9TDyss , M98N9TDzss , M99N1FKxe , & + M99N1FKye , M99N1FKze , M99N1FMxe , M99N1FMye , M99N1FMze , M99N1MKxe , M99N1MKye , & + M99N1MKze , M99N1MMxe , M99N1MMye , M99N1MMze , M99N1RAxe , M99N1RAye , M99N1RAze , & + M99N1RDxe , M99N1RDye , M99N1RDze , M99N1TAxe , M99N1TAye , M99N1TAze , M99N1TDxss , & + M99N1TDyss , M99N1TDzss , M99N2FKxe , M99N2FKye , M99N2FKze , M99N2FMxe , M99N2FMye , & + M99N2FMze , M99N2MKxe , M99N2MKye , M99N2MKze , M99N2MMxe , M99N2MMye , M99N2MMze , & + M99N2RAxe , M99N2RAye , M99N2RAze , M99N2RDxe , M99N2RDye , M99N2RDze , M99N2TAxe , & + M99N2TAye , M99N2TAze , M99N2TDxss , M99N2TDyss , M99N2TDzss , M99N3FKxe , M99N3FKye , & + M99N3FKze , M99N3FMxe , M99N3FMye , M99N3FMze , M99N3MKxe , M99N3MKye , M99N3MKze , & + M99N3MMxe , M99N3MMye , M99N3MMze , M99N3RAxe , M99N3RAye , M99N3RAze , M99N3RDxe , & + M99N3RDye , M99N3RDze , M99N3TAxe , M99N3TAye , M99N3TAze , M99N3TDxss , M99N3TDyss , & + M99N3TDzss , M99N4FKxe , M99N4FKye , M99N4FKze , M99N4FMxe , M99N4FMye , M99N4FMze , & + M99N4MKxe , M99N4MKye , M99N4MKze , M99N4MMxe , M99N4MMye , M99N4MMze , M99N4RAxe , & + M99N4RAye , M99N4RAze , M99N4RDxe , M99N4RDye , M99N4RDze , M99N4TAxe , M99N4TAye , & + M99N4TAze , M99N4TDxss , M99N4TDyss , M99N4TDzss , M99N5FKxe , M99N5FKye , M99N5FKze , & + M99N5FMxe , M99N5FMye , M99N5FMze , M99N5MKxe , M99N5MKye , M99N5MKze , M99N5MMxe , & + M99N5MMye , M99N5MMze , M99N5RAxe , M99N5RAye , M99N5RAze , M99N5RDxe , M99N5RDye , & + M99N5RDze , M99N5TAxe , M99N5TAye , M99N5TAze , M99N5TDxss , M99N5TDyss , M99N5TDzss , & + M99N6FKxe , M99N6FKye , M99N6FKze , M99N6FMxe , M99N6FMye , M99N6FMze , M99N6MKxe , & + M99N6MKye , M99N6MKze , M99N6MMxe , M99N6MMye , M99N6MMze , M99N6RAxe , M99N6RAye , & + M99N6RAze , M99N6RDxe , M99N6RDye , M99N6RDze , M99N6TAxe , M99N6TAye , M99N6TAze , & + M99N6TDxss , M99N6TDyss , M99N6TDzss , M99N7FKxe , M99N7FKye , M99N7FKze , M99N7FMxe , & + M99N7FMye , M99N7FMze , M99N7MKxe , M99N7MKye , M99N7MKze , M99N7MMxe , M99N7MMye , & + M99N7MMze , M99N7RAxe , M99N7RAye , M99N7RAze , M99N7RDxe , M99N7RDye , M99N7RDze , & + M99N7TAxe , M99N7TAye , M99N7TAze , M99N7TDxss , M99N7TDyss , M99N7TDzss , M99N8FKxe , & + M99N8FKye , M99N8FKze , M99N8FMxe , M99N8FMye , M99N8FMze , M99N8MKxe , M99N8MKye , & + M99N8MKze , M99N8MMxe , M99N8MMye , M99N8MMze , M99N8RAxe , M99N8RAye , M99N8RAze , & + M99N8RDxe , M99N8RDye , M99N8RDze , M99N8TAxe , M99N8TAye , M99N8TAze , M99N8TDxss , & + M99N8TDyss , M99N8TDzss , M99N9FKxe , M99N9FKye , M99N9FKze , M99N9FMxe , M99N9FMye , & + M99N9FMze , M99N9MKxe , M99N9MKye , M99N9MKze , M99N9MMxe , M99N9MMye , M99N9MMze , & + M99N9RAxe , M99N9RAye , M99N9RAze , M99N9RDxe , M99N9RDye , M99N9RDze , M99N9TAxe , & + M99N9TAye , M99N9TAze , M99N9TDxss , M99N9TDyss , M99N9TDzss , RBRAXss , RBRAYss , & + RBRAZss , RBRDXss , RBRDYss , RBRDZss , RBRVXss , RBRVYss , RBRVZss , & + RBTAXss , RBTAYss , RBTAZss , RBTDXss , RBTDYss , RBTDZss , RBTVXss , & + RBTVYss , RBTVZss , ReactFXss , ReactFYss , ReactFZss , ReactMXss , ReactMYss , & + ReactMZss , SSqm01 , SSqm02 , SSqm03 , SSqm04 , SSqm05 , SSqm06 , & + SSqm07 , SSqm08 , SSqm09 , SSqm10 , SSqm11 , SSqm12 , SSqm13 , & + SSqm14 , SSqm15 , SSqm16 , SSqm17 , SSqm18 , SSqm19 , SSqm20 , & + SSqm21 , SSqm22 , SSqm23 , SSqm24 , SSqm25 , SSqm26 , SSqm27 , & + SSqm28 , SSqm29 , SSqm30 , SSqm31 , SSqm32 , SSqm33 , SSqm34 , & + SSqm35 , SSqm36 , SSqm37 , SSqm38 , SSqm39 , SSqm40 , SSqm41 , & + SSqm42 , SSqm43 , SSqm44 , SSqm45 , SSqm46 , SSqm47 , SSqm48 , & + SSqm49 , SSqm50 , SSqm51 , SSqm52 , SSqm53 , SSqm54 , SSqm55 , & + SSqm56 , SSqm57 , SSqm58 , SSqm59 , SSqm60 , SSqm61 , SSqm62 , & + SSqm63 , SSqm64 , SSqm65 , SSqm66 , SSqm67 , SSqm68 , SSqm69 , & + SSqm70 , SSqm71 , SSqm72 , SSqm73 , SSqm74 , SSqm75 , SSqm76 , & + SSqm77 , SSqm78 , SSqm79 , SSqm80 , SSqm81 , SSqm82 , SSqm83 , & + SSqm84 , SSqm85 , SSqm86 , SSqm87 , SSqm88 , SSqm89 , SSqm90 , & + SSqm91 , SSqm92 , SSqm93 , SSqm94 , SSqm95 , SSqm96 , SSqm97 , & + SSqm98 , SSqm99 , SSqmd01 , SSqmd02 , SSqmd03 , SSqmd04 , SSqmd05 , & + SSqmd06 , SSqmd07 , SSqmd08 , SSqmd09 , SSqmd10 , SSqmd11 , SSqmd12 , & + SSqmd13 , SSqmd14 , SSqmd15 , SSqmd16 , SSqmd17 , SSqmd18 , SSqmd19 , & + SSqmd20 , SSqmd21 , SSqmd22 , SSqmd23 , SSqmd24 , SSqmd25 , SSqmd26 , & + SSqmd27 , SSqmd28 , SSqmd29 , SSqmd30 , SSqmd31 , SSqmd32 , SSqmd33 , & + SSqmd34 , SSqmd35 , SSqmd36 , SSqmd37 , SSqmd38 , SSqmd39 , SSqmd40 , & + SSqmd41 , SSqmd42 , SSqmd43 , SSqmd44 , SSqmd45 , SSqmd46 , SSqmd47 , & + SSqmd48 , SSqmd49 , SSqmd50 , SSqmd51 , SSqmd52 , SSqmd53 , SSqmd54 , & + SSqmd55 , SSqmd56 , SSqmd57 , SSqmd58 , SSqmd59 , SSqmd60 , SSqmd61 , & + SSqmd62 , SSqmd63 , SSqmd64 , SSqmd65 , SSqmd66 , SSqmd67 , SSqmd68 , & + SSqmd69 , SSqmd70 , SSqmd71 , SSqmd72 , SSqmd73 , SSqmd74 , SSqmd75 , & + SSqmd76 , SSqmd77 , SSqmd78 , SSqmd79 , SSqmd80 , SSqmd81 , SSqmd82 , & + SSqmd83 , SSqmd84 , SSqmd85 , SSqmd86 , SSqmd87 , SSqmd88 , SSqmd89 , & + SSqmd90 , SSqmd91 , SSqmd92 , SSqmd93 , SSqmd94 , SSqmd95 , SSqmd96 , & + SSqmd97 , SSqmd98 , SSqmd99 , SSqmdd01 , SSqmdd02 , SSqmdd03 , SSqmdd04 , & + SSqmdd05 , SSqmdd06 , SSqmdd07 , SSqmdd08 , SSqmdd09 , SSqmdd10 , SSqmdd11 , & + SSqmdd12 , SSqmdd13 , SSqmdd14 , SSqmdd15 , SSqmdd16 , SSqmdd17 , SSqmdd18 , & + SSqmdd19 , SSqmdd20 , SSqmdd21 , SSqmdd22 , SSqmdd23 , SSqmdd24 , SSqmdd25 , & + SSqmdd26 , SSqmdd27 , SSqmdd28 , SSqmdd29 , SSqmdd30 , SSqmdd31 , SSqmdd32 , & + SSqmdd33 , SSqmdd34 , SSqmdd35 , SSqmdd36 , SSqmdd37 , SSqmdd38 , SSqmdd39 , & + SSqmdd40 , SSqmdd41 , SSqmdd42 , SSqmdd43 , SSqmdd44 , SSqmdd45 , SSqmdd46 , & + SSqmdd47 , SSqmdd48 , SSqmdd49 , SSqmdd50 , SSqmdd51 , SSqmdd52 , SSqmdd53 , & + SSqmdd54 , SSqmdd55 , SSqmdd56 , SSqmdd57 , SSqmdd58 , SSqmdd59 , SSqmdd60 , & + SSqmdd61 , SSqmdd62 , SSqmdd63 , SSqmdd64 , SSqmdd65 , SSqmdd66 , SSqmdd67 , & + SSqmdd68 , SSqmdd69 , SSqmdd70 , SSqmdd71 , SSqmdd72 , SSqmdd73 , SSqmdd74 , & + SSqmdd75 , SSqmdd76 , SSqmdd77 , SSqmdd78 , SSqmdd79 , SSqmdd80 , SSqmdd81 , & + SSqmdd82 , SSqmdd83 , SSqmdd84 , SSqmdd85 , SSqmdd86 , SSqmdd87 , SSqmdd88 , & + SSqmdd89 , SSqmdd90 , SSqmdd91 , SSqmdd92 , SSqmdd93 , SSqmdd94 , SSqmdd95 , & + SSqmdd96 , SSqmdd97 , SSqmdd98 , SSqmdd99 /) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(21921) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) ParamIndxAry1, ParamIndxAry2, ParamIndxAry3, ParamIndxAry4, ParamIndxAry5, ParamIndxAry6, ParamIndxAry7, ParamIndxAry8, ParamIndxAry9, ParamIndxAry10, ParamIndxAry11, ParamIndxAry12, ParamIndxAry13/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry1(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry2(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry3(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry4(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)"/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry5(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry6(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry7(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry8(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry9(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry10(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry11(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry12(1670) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) "/) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry13(1665) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ", & - "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)", & - "(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & - "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ", & - "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)", & - "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & - "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & - "(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ", & - "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & - "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & - "(N*m) ","(N*m) ","(N*m) ","(rad/s^2)","(rad/s^2)","(rad/s^2)","(rad) ", & - "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & - "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2)", & - "(rad/s^2)","(rad/s^2)","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & - "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & - "(N*m) ","(N*m) ","(N*m) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & - "(-) ","(-) ","(-) ","(-) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & - "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & - "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) "/) - CHARACTER(OutStrLenM1), PARAMETER :: ParamUnitsAry(21705) = (/ & ! This lists the units corresponding to the allowed parameters + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry1(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry2(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry3(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry4(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry5(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry6(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry7(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry8(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry9(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry10(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry11(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry12(1687) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry13(1677) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ", & + "(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ", & + "(m) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ", & + "(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ", & + "(m/s^2) ","(m) ","(m) ","(m) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ", & + "(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ", & + "(m) ","(m) ","(m) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(N*m) ","(N*m) ","(N*m) ","(rad/s^2) ","(rad/s^2) ","(rad/s^2) ", & + "(rad) ","(rad) ","(rad) ","(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ", & + "(m) ","(m) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ","(N*m) ", & + "(rad/s^2) ","(rad/s^2) ","(rad/s^2) ","(rad) ","(rad) ","(rad) ","(m/s^2) ", & + "(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(rad/s^2) ","(rad/s^2) ", & + "(rad/s^2) ","(rad) ","(rad) ","(rad) ","(rad/s) ","(rad/s) ","(rad/s) ", & + "(m/s^2) ","(m/s^2) ","(m/s^2) ","(m) ","(m) ","(m) ","(m/s) ", & + "(m/s) ","(m/s) ","(N) ","(N) ","(N) ","(N*m) ","(N*m) ", & + "(N*m) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(-) ","(-) ","(-) ","(-) ","(-) ", & + "(-) ","(-) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ","(1/s) ", & + "(1/s) ","(1/s) ","(1/s) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) ", & + "(1/s^2) ","(1/s^2) ","(1/s^2) ","(1/s^2) "/) + CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(21921) = (/ & ! This lists the units corresponding to the allowed parameters ParamUnitsAry1, ParamUnitsAry2, ParamUnitsAry3, ParamUnitsAry4, ParamUnitsAry5, ParamUnitsAry6, ParamUnitsAry7, ParamUnitsAry8, ParamUnitsAry9, ParamUnitsAry10, ParamUnitsAry11, ParamUnitsAry12, ParamUnitsAry13/) diff --git a/modules/subdyn/src/SubDyn_Registry.txt b/modules/subdyn/src/SubDyn_Registry.txt index 2c11d63158..4b75262c79 100644 --- a/modules/subdyn/src/SubDyn_Registry.txt +++ b/modules/subdyn/src/SubDyn_Registry.txt @@ -73,7 +73,8 @@ typedef ^ InitInputType CHARACTER(1024) SDInputFile - - - "Name of th typedef ^ InitInputType CHARACTER(1024) RootName - - - "SubDyn rootname" typedef ^ InitInputType ReKi g - - - "Gravity acceleration" typedef ^ InitInputType ReKi WtrDpth - - - "Water Depth (positive valued)" -typedef ^ InitInputType ReKi TP_RefPoint {3} - - "global position of transition piece reference point (could also be defined in SubDyn itself)" +typedef ^ InitInputType INTEGER NTP - - - "Number of coupled transition pieces" +typedef ^ InitInputType ReKi TP_RefPoint {3}{:} - - "global position of transition piece reference point (could also be defined in SubDyn itself)" typedef ^ InitInputType ReKi SubRotateZ - - - "Rotation angle in degrees about global Z" typedef ^ InitInputType ReKi SoilStiffness ::: - - "Soil stiffness matrices from SoilDyn" '(N/m, N-m/rad)' typedef ^ InitInputType MeshType SoilMesh - - - "Mesh for soil stiffness locations" - @@ -83,24 +84,21 @@ typedef ^ InitInputType Logical Linearize - .FALSE. - "Flag that typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - typedef ^ InitOutputType ProgDesc Ver - - - "This module's name, version, and date" - -# Linearization -typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - -typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -typedef ^ InitOutputType LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - -typedef ^ InitOutputType LOGICAL RotFrame_x {:} - - "Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame (not used for glue)" - -typedef ^ InitOutputType LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - -typedef ^ InitOutputType LOGICAL IsLoad_u {:} - - "Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix)" - -typedef ^ InitOutputType IntKi DerivOrder_x {:} - - "Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization" - +typedef ^ InitOutputType ModVarsType Vars - - - "Module Variables" +typedef ^ InitOutputType logical IsFloating - - - "Flag indicating if the substructure is floating" +typedef ^ InitOutputType logical SDHasRBDoF - - - "Flag indicating if SubDyn is tracking rigid-body motion internally; only true if floating with multiple transition pieces" +typedef ^ InitOutputType R8Ki PlatformPos {6} - - "Initial rigid-body displacement at the PRP (only if SDHasRBDoF=true)" typedef ^ ^ LOGICAL CableCChanRqst {:} .FALSE. - "flag indicating control channel for active cable tensioning is requested" - # ============================== Define initialization data (not from glue code) here: ============================================================================================================================================ typedef ^ SD_InitType CHARACTER(1024) RootName - - - "SubDyn rootname" -typedef ^ SD_InitType ReKi TP_RefPoint {3} - - "global position of transition piece reference point (could also be defined in SubDyn itself)" +typedef ^ SD_InitType ReKi TP_RefPoint {3}{:} - - "global position of transition piece reference point (could also be defined in SubDyn itself)" typedef ^ SD_InitType ReKi SubRotateZ - - - "Rotation angle in degrees about global Z" typedef ^ SD_InitType ReKi g - - - "Gravity acceleration" m/s^2 typedef ^ SD_InitType DbKi DT - - - "Time step from Glue Code" seconds +typedef ^ SD_InitType INTEGER NTP - - - "Number of coupled transition pieces" typedef ^ SD_InitType INTEGER NJoints - - - "Number of joints of the sub structure" +typedef ^ SD_InitType INTEGER RB_RefJoint - - - "Input joint ID of the rigid-body reference joint" typedef ^ SD_InitType INTEGER NPropSetsX - - - "Number of extended property sets" typedef ^ SD_InitType INTEGER NPropSetsBC - - - "Number of property sets for beams with a circular section" typedef ^ SD_InitType INTEGER NPropSetsBR - - - "Number of property sets for beams with a rectangular section" @@ -124,7 +122,8 @@ typedef ^ SD_InitType ReKi CMass {:}{:} - - "Concentra typedef ^ SD_InitType ReKi JDampings {:} - - "Damping coefficients for internal modes" typedef ^ SD_InitType IntKi GuyanDampMod - - - "Guyan damping [0=none, 1=Rayleigh Damping, 2= user specified 6x6 matrix]" typedef ^ SD_InitType ReKi RayleighDamp {2} - - "Mass and stiffness proportional damping coefficients (Rayleigh Damping) [only if GuyanDampMod=1]" -typedef ^ SD_InitType ReKi GuyanDampMat {6}{6} - - "Guyan Damping Matrix, see also CBB" +typedef ^ SD_InitType IntKi GuyanDampSize - - - "Size of Guyan damping matrix" +typedef ^ SD_InitType ReKi GuyanDampMat {:}{:} - - "Guyan Damping Matrix, see also CBB" typedef ^ SD_InitType INTEGER Members {:}{:} - - "Member joints connection " typedef ^ SD_InitType ReKi MemberSpin {:} - - "Member spin angle about its axis - for rectangular members " rad typedef ^ SD_InitType CHARACTER(ChanLen) SSOutList {:} - - "List of Output Channels " @@ -156,55 +155,22 @@ typedef ^ SD_InitType INTEGER MemberNodes {:}{:} - - "Member nu typedef ^ SD_InitType INTEGER NodesConnN {:}{:} - - "Nodes that connect to a common node " typedef ^ SD_InitType INTEGER NodesConnE {:}{:} - - "Elements that connect to a common node" typedef ^ SD_InitType LOGICAL SSSum - - - "SubDyn Summary File Flag " +typedef ^ SD_InitType R8Ki qR0 {6} - - "Initial rigid-body displacement (floating only)" # ============================== States ============================================================================================================================================ typedef ^ ContinuousStateType R8Ki qm {:} - - "Virtual states, Nmod elements" typedef ^ ContinuousStateType R8Ki qmdot {:} - - "Derivative of states, Nmod elements" +typedef ^ ContinuousStateType R8Ki qR {:} - - "Rigid-body displacement" +typedef ^ ContinuousStateType R8Ki qRdot {:} - - "Derivative of rigid-body displacement" -typedef ^ DiscreteStateType ReKi DummyDiscState - - - "Remove this variable if you have discrete states" +typedef ^ DiscreteStateType ReKi DummyDiscState - - - "Remove this variable if you have discrete states" typedef ^ ConstraintStateType ReKi DummyConstrState - - - "Remove this variable if you have constraint states" - typedef ^ OtherStateType SD_ContinuousStateType xdot {:} - - "previous state derivs for m-step time integrator" typedef ^ ^ IntKi n - - - "tracks time step for which OtherState was updated last" -# ..... Misc/Optimization variables................................................................................................. -# Define any data that are used only for efficiency purposes (these variables are not associated with time): -# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. -typedef ^ MiscVarType ReKi qmdotdot {:} - - "2nd Derivative of states, used only for output-file purposes" -typedef ^ MiscVarType ReKi u_TP 6 - - -typedef ^ MiscVarType ReKi udot_TP 6 - - -typedef ^ MiscVarType ReKi udotdot_TP 6 - - -typedef ^ MiscVarType ReKi F_L {:} - - "Loads on internal DOF, size nL" -typedef ^ MiscVarType ReKi F_L2 {:} - - "Loads on internal DOF, size nL, used for SIM and ADM4" -typedef ^ MiscVarType ReKi UR_bar {:} - - -typedef ^ MiscVarType ReKi UR_bar_dot {:} - - -typedef ^ MiscVarType ReKi UR_bar_dotdot {:} - - -typedef ^ MiscVarType ReKi UL {:} - - "Internal DOFs (L) displacements " -typedef ^ MiscVarType ReKi UL_NS {:} - - "Internal DOFs (L) displacements, No SIM (NS)" -typedef ^ MiscVarType ReKi UL_dot {:} - - -typedef ^ MiscVarType ReKi UL_dotdot {:} - - -typedef ^ MiscVarType ReKi DU_full {:} - - "Delta U used for extra moment, size nDOF" -typedef ^ MiscVarType ReKi U_full {:} - - "Displacement of all DOFs (full system) with SIM" -typedef ^ MiscVarType ReKi U_full_NS {:} - - "Displacement of all DOFs (full system), No SIM (NS)" -typedef ^ MiscVarType ReKi U_full_dot {:} - - -typedef ^ MiscVarType ReKi U_full_dotdot {:} - - -typedef ^ MiscVarType ReKi U_full_elast {:} - - "Elastic displacements for computation of K ue (without rigid body mode for floating), includes SIM" -typedef ^ MiscVarType ReKi U_red {:} - - -typedef ^ MiscVarType ReKi FC_unit {:} - - "Cable Force vector (for varying cable load, of unit cable load)" N -typedef ^ MiscVarType ReKi SDWrOutput {:} - - "Data from previous step to be written to a SubDyn output file" -typedef ^ MiscVarType ReKi AllOuts {:} - - "Data for output file" -typedef ^ MiscVarType DbKi LastOutTime - - - "The time of the most recent stored output data" "s" -typedef ^ MiscVarType IntKi Decimat - - - "Current output decimation counter" "-" -typedef ^ MiscVarType ReKi Fext {:} - - "External loads on unconstrained DOFs" "-" -typedef ^ MiscVarType ReKi Fext_red {:} - - "External loads on constrained DOFs, Fext_red= T^t Fext" "-" -typedef ^ MiscVarType R8Ki FG {:} - - "Gravity force vector (without initial cable force T0) based on the instantaneous platform orientation, not reduced (floating only)" N -# SIM -typedef ^ MiscVarType ReKi UL_SIM {:} - - "UL for SIM = PhiL qL0- PhiM qm0, size nL" -typedef ^ MiscVarType ReKi UL_0m {:} - - "Intermediate UL term for SIM = PhiM qm0, size nL" -### data for writing to an output file (this data is associated with time, but saved/written in CalcOutput so not stored as an other state) ### - # ============================== Parameters ============================================================================================================================================ +typedef ^ ParameterType ModVarsType Vars - - - "Module Variables" # --- Parameters - Algo typedef ^ ParameterType ReKi g - - - "Gravity acceleration" m/s^2 typedef ^ ParameterType DbKi SDDeltaT - - - "Time step (for integration of continuous states)" seconds @@ -220,6 +186,7 @@ typedef ^ ParameterType R8Ki FC {:} - - "Initial cable typedef ^ ParameterType R8Ki FG {:} - - "Gravity force vector, not reduced" N typedef ^ ParameterType ReKi DP0 {:}{:} - - "Vector from TP to a Node at t=0, used for Floating Rigid Body motion" m typedef ^ ParameterType ReKi rPG {:} - - "Vector from TP to rigid-body CoG in the Guyan (rigid-body) frame, used for Floating Rigid Body Motion" m +typedef ^ ParameterType ReKi rTP0 {3}{:} - - "Vector from rigid-body reference point to transition pieces" m typedef ^ ParameterType IntKi NodeID2JointID {:} - - "Store Joint ID for each NodeID since SubDyn re-label nodes (and add more nodes)" "-" typedef ^ ParameterType IntKi CMassNode {:} - - "Node indices for concentrated masses" typedef ^ ParameterType ReKi CMassWeight {:} - - "Weight of concentrated masses" N @@ -235,9 +202,11 @@ typedef ^ ParameterType IntKi DOFred2Nodes {:}{:} - - "nDOFRed x 3, # --- Parameters - Control typedef ^ ParameterType IntKi CtrlElem2Channel {:}{:} - - "nCtrlCable x 2, for each CtrlCable, Elem index, and Channel Index" # --- Parameters - CB reduction +typedef ^ ParameterType ReKi RBRefPt {3} - - "global position of transition piece reference point (could also be defined in SubDyn itself)" +typedef ^ ParameterType LOGICAL TP1IsRBRefPt - - - "If the first transition-piece is a dummy one for rigid-body motion - floating only" typedef ^ ParameterType IntKi nDOFM - - - "retained degrees of freedom (modes)" +typedef ^ ParameterType IntKi nDOFRB - - - "number of rigid-body modes" typedef ^ ParameterType IntKi SttcSolve - - - "Solve dynamics about static equilibrium point (flag)" -typedef ^ ParameterType Logical GuyanLoadCorrection - - - "Add Extra lever arm contribution to interface reaction outputs" typedef ^ ParameterType Logical Floating - - - "True if floating bottom (the 6 DOF are free at all reaction nodes)" typedef ^ ParameterType ReKi KMMDiag {:} - - "Diagonal coefficients of Kmm (OmegaM squared)" typedef ^ ParameterType ReKi CMMDiag {:} - - "Diagonal coefficients of Cmm (~2 Zeta OmegaM))" @@ -261,11 +230,22 @@ typedef ^ ParameterType ReKi MBM {:}{:} - - "Matrix after C-B reduc typedef ^ ParameterType ReKi PhiL_T {:}{:} - - "Transpose of Matrix of C-B modes" typedef ^ ParameterType ReKi PhiLInvOmgL2 {:}{:} - - "Matrix of C-B modes times the inverse of OmegaL**2 (Phi_L*(Omg**2)^-1)" typedef ^ ParameterType ReKi KLLm1 {:}{:} - - "KLL^{-1}, inverse of matrix KLL, for static solve only" -typedef ^ ParameterType ReKi AM2Jac {:}{:} - - "Jacobian (factored) for Adams-Boulton 2nd order Integration" -typedef ^ ParameterType IntKi AM2JacPiv {:} - - "Pivot array for Jacobian factorization (for Adams-Boulton 2nd order Integration)" typedef ^ ParameterType ReKi TI {:}{:} - - "Matrix to calculate TP reference point reaction at top of structure" typedef ^ ParameterType ReKi TIreact {:}{:} - - "Matrix to calculate single point reaction at base of structure" +typedef ^ ParameterType ReKi GMat {:}{:} - - "Matrix to convert the first 6 Guyan modes to rigid-body modes" +typedef ^ ParameterType R8Ki EOM_LHS {:}{:} - - "(Inverse of) the left-hand side matrix of the combined equations of motion" +typedef ^ ParameterType R8Ki EOM_LHS1 {:}{:} - - "(Inverse of) the left-hand side matrix of the rigid-body equations of motion" +typedef ^ ParameterType R8Ki EOM_RHS1_1 {:}{:} - - +typedef ^ ParameterType R8Ki EOM_RHS1_2 {:}{:} - - +typedef ^ ParameterType R8Ki EOM_RHS1_3 {:}{:} - - +typedef ^ ParameterType R8Ki EOM_RHS1_4 {:}{:} - - +typedef ^ ParameterType R8Ki EOM_RHS1_5 {:}{:} - - +typedef ^ ParameterType R8Ki EOM_RHS1_6 {:}{:} - - +typedef ^ ParameterType R8Ki EOM_RHS2_1 {:}{:} - - +typedef ^ ParameterType R8Ki EOM_RHS3_1 {:}{:} - - # --- Parameters - Partitioning I L C Y, R=[C I] +typedef ^ ParameterType IntKi nTP - - - "Total number of transition pieces" +typedef ^ ParameterType IntKi TPIdx {:} - - "Transition piece index associated with each interface node" typedef ^ ParameterType IntKi nNodes - - - "Total number of nodes" typedef ^ ParameterType IntKi nNodes_I - - - "Number of Interface nodes" typedef ^ ParameterType IntKi nNodes_L - - - "Number of Internal nodes" @@ -277,6 +257,7 @@ typedef ^ ParameterType IntKi nDOFI__ - - - "Size of IDI__" typedef ^ ParameterType IntKi nDOFI_Rb - - - "Size of IDI_Rb" typedef ^ ParameterType IntKi nDOFI_F - - - "Size of IDI_F" typedef ^ ParameterType IntKi nDOFL_L - - - "Size of IDL_L" +typedef ^ ParameterType IntKi nDOFL_TP - - - "Number of transition-piece DoF" typedef ^ ParameterType IntKi nDOFC__ - - - "Size of IDC__" typedef ^ ParameterType IntKi nDOFC_Rb - - - "Size of IDC_Rb" typedef ^ ParameterType IntKi nDOFC_L - - - "Size of IDC_L" @@ -290,9 +271,9 @@ typedef ^ ParameterType IntKi IDI_Rb {:} - - "Index array of the int typedef ^ ParameterType IntKi IDI_F {:} - - "Index array of the interface (nodes connect to TP) dofs that are fixed DOF" typedef ^ ParameterType IntKi IDL_L {:} - - "Index array of the internal dofs coming from internal nodes" typedef ^ ParameterType IntKi IDC__ {:} - - "Index of all bottom DOF" -typedef ^ ParameterType IntKi IDC_Rb {:} - - "Index array of the contraint dofs that are retained/master/follower DOF" -typedef ^ ParameterType IntKi IDC_L {:} - - "Index array of the contraint dofs that are follower/internal DOF" -typedef ^ ParameterType IntKi IDC_F {:} - - "Index array of the contraint dofs that are fixd DOF" +typedef ^ ParameterType IntKi IDC_Rb {:} - - "Index array of the constraint dofs that are retained/master/follower DOF" +typedef ^ ParameterType IntKi IDC_L {:} - - "Index array of the constraint dofs that are follower/internal DOF" +typedef ^ ParameterType IntKi IDC_F {:} - - "Index array of the constraint dofs that are fixd DOF" typedef ^ ParameterType IntKi IDR__ {:} - - "Index array of the interface and restraint dofs" typedef ^ ParameterType IntKi ID__Rb {:} - - "Index array of all the retained/leader/master dofs (from any nodes of the structure)" typedef ^ ParameterType IntKi ID__L {:} - - "Index array of all the follower/internal dofs (from any nodes of the structure)" @@ -316,21 +297,65 @@ typedef ^ ParameterType LOGICAL OutReact - - - "Flag to check typedef ^ ParameterType IntKi OutAllInt - - - "Integer version of OutAll" typedef ^ ParameterType IntKi OutAllDims - - - "Integer version of OutAll" typedef ^ ParameterType IntKi OutDec - - - "Output Decimation for Requested Channels" -# --- Parametesr - Linearization -typedef ^ ParameterType Integer Jac_u_indx {:}{:} - - "matrix to help fill/pack the u vector in computing the jacobian" - -typedef ^ ParameterType R8Ki du {:} - - "vector that determines size of perturbation for u (inputs)" -typedef ^ ParameterType R8Ki dx {2} - - "vector that determines size of perturbation for x (continuous states)" -typedef ^ ParameterType Integer Jac_ny - - - "number of outputs in jacobian matrix" - -typedef ^ ParameterType Integer Jac_nx - - - "half the number of continuous states in jacobian matrix" - -typedef ^ ParameterType logical RotStates - - - "Orient states in rotating frame during linearization? (flag)" - # ============================== Inputs ============================================================================================================================================ -typedef ^ InputType MeshType TPMesh - - - "Transition piece inputs on a point mesh" +typedef ^ InputType MeshType TPMesh {:} - - "Transition piece inputs on a point mesh" typedef ^ InputType MeshType LMesh - - - "Point mesh for interior node inputs" typedef ^ InputType ReKi CableDeltaL {:} - - "Cable tension, control input" # ============================== Outputs ============================================================================================================================================ -typedef ^ OutputType MeshType Y1Mesh - - - "Transition piece outputs on a point mesh" +typedef ^ OutputType MeshType Y0Mesh - - - "Motion mesh for the rigid-body reference point" +typedef ^ OutputType MeshType Y1Mesh {:} - - "Transition piece outputs on a point mesh" typedef ^ OutputType MeshType Y2Mesh - - - "Interior+Interface nodes rigid body displacements + elastic velocities and accelerations on a point mesh" typedef ^ OutputType MeshType Y3Mesh - - - "Interior+Interface nodes full elastic displacements/velocities and accelerations on a point mesh" typedef ^ OutputType ReKi WriteOutput {:} - - "Data to be written to an output file" + +# ============================== Misc/Optimization variables ======================================================================================================================== +# Define any data that are used only for efficiency purposes (these variables are not associated with time): +# e.g. indices for searching in an array, large arrays that are local variables in any routine called multiple times, etc. +typedef ^ MiscVarType ModJacType Jac - - - "Values corresponding to module variables" +typedef ^ MiscVarType SD_ContinuousStateType x_perturb - - - "" +typedef ^ MiscVarType SD_ContinuousStateType dxdt_lin - - - "" +typedef ^ MiscVarType SD_InputType u_perturb - - - "" +typedef ^ MiscVarType SD_OutputType y_lin - - - "" +typedef ^ MiscVarType R8Ki AM2Jac {:}{:} - - "" +typedef ^ MiscVarType R8Ki AM2xq {:}{:} - - "" +typedef ^ MiscVarType R8Ki AM2xq2 {:}{:} - - "" +typedef ^ MiscVarType ReKi qmdotdot {:} - - "2nd Derivative of states, used only for output-file purposes" +typedef ^ MiscVarType R8Ki qRdotdot {:} - - "2nd derivative of rigid-body states (floating only)" +typedef ^ MiscVarType ReKi F_TP {:} - - +typedef ^ MiscVarType ReKi u_TP {:} - - +typedef ^ MiscVarType ReKi udot_TP {:} - - +typedef ^ MiscVarType ReKi udotdot_TP {:} - - +typedef ^ MiscVarType ReKi Y1 {:} - - +typedef ^ MiscVarType ReKi Y1_Guy_R {:} - - +typedef ^ MiscVarType ReKi Y1_Guy_L {:} - - +typedef ^ MiscVarType ReKi F_L {:} - - "Loads on internal DOF, size nL" +typedef ^ MiscVarType ReKi F_L2 {:} - - "Loads on internal DOF, size nL, used for SIM and ADM4" +typedef ^ MiscVarType ReKi UR_bar {:} - - +typedef ^ MiscVarType ReKi UR_bar_dot {:} - - +typedef ^ MiscVarType ReKi UR_bar_dotdot {:} - - +typedef ^ MiscVarType ReKi UL {:} - - "Internal DOFs (L) displacements " +typedef ^ MiscVarType ReKi UL_NS {:} - - "Internal DOFs (L) displacements, No SIM (NS)" +typedef ^ MiscVarType ReKi UL_dot {:} - - +typedef ^ MiscVarType ReKi UL_dotdot {:} - - +typedef ^ MiscVarType R8Ki DU_full {:} - - "Delta U used for extra moment, size nDOF" +typedef ^ MiscVarType R8Ki U_full {:} - - "Displacement of all DOFs (full system) with SIM" +typedef ^ MiscVarType R8Ki U_full_NS {:} - - "Displacement of all DOFs (full system), No SIM (NS)" +typedef ^ MiscVarType R8Ki U_full_dot {:} - - +typedef ^ MiscVarType R8Ki U_full_dotdot {:} - - +typedef ^ MiscVarType R8Ki U_full_elast {:} - - "Elastic displacements for computation of K ue (without rigid body mode for floating), includes SIM" +typedef ^ MiscVarType R8Ki U_red {:} - - +typedef ^ MiscVarType R8Ki x_full {:} - - +typedef ^ MiscVarType ReKi FC_unit {:} - - "Cable Force vector (for varying cable load, of unit cable load)" N +typedef ^ MiscVarType ReKi SDWrOutput {:} - - "Data from previous step to be written to a SubDyn output file" +typedef ^ MiscVarType ReKi AllOuts {:} - - "Data for output file" +typedef ^ MiscVarType DbKi LastOutTime - - - "The time of the most recent stored output data" "s" +typedef ^ MiscVarType IntKi Decimat - - - "Current output decimation counter" "-" +typedef ^ MiscVarType ReKi Fext {:} - - "External loads on unconstrained DOFs" "-" +typedef ^ MiscVarType ReKi Fext_red {:} - - "External loads on constrained DOFs, Fext_red= T^t Fext" "-" +typedef ^ MiscVarType R8Ki FG {:} - - "Gravity force vector (without initial cable force T0) based on the instantaneous platform orientation, not reduced (floating only)" N +# SIM +typedef ^ MiscVarType ReKi UL_SIM {:} - - "UL for SIM = PhiL qL0- PhiM qm0, size nL" +typedef ^ MiscVarType ReKi UL_0m {:} - - "Intermediate UL term for SIM = PhiM qm0, size nL" +### data for writing to an output file (this data is associated with time, but saved/written in CalcOutput so not stored as an other state) ### diff --git a/modules/subdyn/src/SubDyn_Types.f90 b/modules/subdyn/src/SubDyn_Types.f90 index b14e3c83bd..d57e94644b 100644 --- a/modules/subdyn/src/SubDyn_Types.f90 +++ b/modules/subdyn/src/SubDyn_Types.f90 @@ -110,7 +110,8 @@ MODULE SubDyn_Types CHARACTER(1024) :: RootName !< SubDyn rootname [-] REAL(ReKi) :: g = 0.0_ReKi !< Gravity acceleration [-] REAL(ReKi) :: WtrDpth = 0.0_ReKi !< Water Depth (positive valued) [-] - REAL(ReKi) , DIMENSION(1:3) :: TP_RefPoint = 0.0_ReKi !< global position of transition piece reference point (could also be defined in SubDyn itself) [-] + INTEGER(IntKi) :: NTP = 0_IntKi !< Number of coupled transition pieces [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TP_RefPoint !< global position of transition piece reference point (could also be defined in SubDyn itself) [-] REAL(ReKi) :: SubRotateZ = 0.0_ReKi !< Rotation angle in degrees about global Z [-] REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: SoilStiffness !< Soil stiffness matrices from SoilDyn ['(N/m,] TYPE(MeshType) :: SoilMesh !< Mesh for soil stiffness locations [-] @@ -122,25 +123,23 @@ MODULE SubDyn_Types CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputHdr !< Names of the output-to-file channels [-] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: WriteOutputUnt !< Units of the output-to-file channels [-] TYPE(ProgDesc) :: Ver !< This module's name, version, and date [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_y !< Names of the outputs used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_x !< Names of the continuous states used in linearization [-] - CHARACTER(LinChanLen) , DIMENSION(:), ALLOCATABLE :: LinNames_u !< Names of the inputs used in linearization [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_y !< Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_x !< Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame (not used for glue) [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: RotFrame_u !< Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame [-] - LOGICAL , DIMENSION(:), ALLOCATABLE :: IsLoad_u !< Flag that tells FAST if the inputs used in linearization are loads (for preconditioning matrix) [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: DerivOrder_x !< Integer that tells FAST/MBC3 the maximum derivative order of continuous states used in linearization [-] + TYPE(ModVarsType) :: Vars !< Module Variables [-] + LOGICAL :: IsFloating = .false. !< Flag indicating if the substructure is floating [-] + LOGICAL :: SDHasRBDoF = .false. !< Flag indicating if SubDyn is tracking rigid-body motion internally; only true if floating with multiple transition pieces [-] + REAL(R8Ki) , DIMENSION(1:6) :: PlatformPos = 0.0_R8Ki !< Initial rigid-body displacement at the PRP (only if SDHasRBDoF=true) [-] LOGICAL , DIMENSION(:), ALLOCATABLE :: CableCChanRqst !< flag indicating control channel for active cable tensioning is requested [-] END TYPE SD_InitOutputType ! ======================= ! ========= SD_InitType ======= TYPE, PUBLIC :: SD_InitType CHARACTER(1024) :: RootName !< SubDyn rootname [-] - REAL(ReKi) , DIMENSION(1:3) :: TP_RefPoint = 0.0_ReKi !< global position of transition piece reference point (could also be defined in SubDyn itself) [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TP_RefPoint !< global position of transition piece reference point (could also be defined in SubDyn itself) [-] REAL(ReKi) :: SubRotateZ = 0.0_ReKi !< Rotation angle in degrees about global Z [-] REAL(ReKi) :: g = 0.0_ReKi !< Gravity acceleration [m/s^2] REAL(DbKi) :: DT = 0.0_R8Ki !< Time step from Glue Code [seconds] + INTEGER(IntKi) :: NTP = 0_IntKi !< Number of coupled transition pieces [-] INTEGER(IntKi) :: NJoints = 0_IntKi !< Number of joints of the sub structure [-] + INTEGER(IntKi) :: RB_RefJoint = 0_IntKi !< Input joint ID of the rigid-body reference joint [-] INTEGER(IntKi) :: NPropSetsX = 0_IntKi !< Number of extended property sets [-] INTEGER(IntKi) :: NPropSetsBC = 0_IntKi !< Number of property sets for beams with a circular section [-] INTEGER(IntKi) :: NPropSetsBR = 0_IntKi !< Number of property sets for beams with a rectangular section [-] @@ -164,7 +163,8 @@ MODULE SubDyn_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: JDampings !< Damping coefficients for internal modes [-] INTEGER(IntKi) :: GuyanDampMod = 0_IntKi !< Guyan damping [0=none, 1=Rayleigh Damping, 2= user specified 6x6 matrix] [-] REAL(ReKi) , DIMENSION(1:2) :: RayleighDamp = 0.0_ReKi !< Mass and stiffness proportional damping coefficients (Rayleigh Damping) [only if GuyanDampMod=1] [-] - REAL(ReKi) , DIMENSION(1:6,1:6) :: GuyanDampMat = 0.0_ReKi !< Guyan Damping Matrix, see also CBB [-] + INTEGER(IntKi) :: GuyanDampSize = 0_IntKi !< Size of Guyan damping matrix [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: GuyanDampMat !< Guyan Damping Matrix, see also CBB [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Members !< Member joints connection [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: MemberSpin !< Member spin angle about its axis - for rectangular members [rad] CHARACTER(ChanLen) , DIMENSION(:), ALLOCATABLE :: SSOutList !< List of Output Channels [-] @@ -196,12 +196,15 @@ MODULE SubDyn_Types INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: NodesConnN !< Nodes that connect to a common node [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: NodesConnE !< Elements that connect to a common node [-] LOGICAL :: SSSum = .false. !< SubDyn Summary File Flag [-] + REAL(R8Ki) , DIMENSION(1:6) :: qR0 = 0.0_R8Ki !< Initial rigid-body displacement (floating only) [-] END TYPE SD_InitType ! ======================= ! ========= SD_ContinuousStateType ======= TYPE, PUBLIC :: SD_ContinuousStateType REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: qm !< Virtual states, Nmod elements [-] REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: qmdot !< Derivative of states, Nmod elements [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: qR !< Rigid-body displacement [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: qRdot !< Derivative of rigid-body displacement [-] END TYPE SD_ContinuousStateType ! ======================= ! ========= SD_DiscreteStateType ======= @@ -220,42 +223,9 @@ MODULE SubDyn_Types INTEGER(IntKi) :: n = 0_IntKi !< tracks time step for which OtherState was updated last [-] END TYPE SD_OtherStateType ! ======================= -! ========= SD_MiscVarType ======= - TYPE, PUBLIC :: SD_MiscVarType - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qmdotdot !< 2nd Derivative of states, used only for output-file purposes [-] - REAL(ReKi) , DIMENSION(1:6) :: u_TP = 0.0_ReKi - REAL(ReKi) , DIMENSION(1:6) :: udot_TP = 0.0_ReKi - REAL(ReKi) , DIMENSION(1:6) :: udotdot_TP = 0.0_ReKi - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_L !< Loads on internal DOF, size nL [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_L2 !< Loads on internal DOF, size nL, used for SIM and ADM4 [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UR_bar - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UR_bar_dot - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UR_bar_dotdot - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL !< Internal DOFs (L) displacements [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_NS !< Internal DOFs (L) displacements, No SIM (NS) [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_dot - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_dotdot - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: DU_full !< Delta U used for extra moment, size nDOF [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: U_full !< Displacement of all DOFs (full system) with SIM [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: U_full_NS !< Displacement of all DOFs (full system), No SIM (NS) [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: U_full_dot - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: U_full_dotdot - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: U_full_elast !< Elastic displacements for computation of K ue (without rigid body mode for floating), includes SIM [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: U_red - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FC_unit !< Cable Force vector (for varying cable load, of unit cable load) [N] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: SDWrOutput !< Data from previous step to be written to a SubDyn output file [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AllOuts !< Data for output file [-] - REAL(DbKi) :: LastOutTime = 0.0_R8Ki !< The time of the most recent stored output data [s] - INTEGER(IntKi) :: Decimat = 0_IntKi !< Current output decimation counter [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Fext !< External loads on unconstrained DOFs [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Fext_red !< External loads on constrained DOFs, Fext_red= T^t Fext [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: FG !< Gravity force vector (without initial cable force T0) based on the instantaneous platform orientation, not reduced (floating only) [N] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_SIM !< UL for SIM = PhiL qL0- PhiM qm0, size nL [-] - REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_0m !< Intermediate UL term for SIM = PhiM qm0, size nL [-] - END TYPE SD_MiscVarType -! ======================= ! ========= SD_ParameterType ======= TYPE, PUBLIC :: SD_ParameterType + TYPE(ModVarsType) :: Vars !< Module Variables [-] REAL(ReKi) :: g = 0.0_ReKi !< Gravity acceleration [m/s^2] REAL(DbKi) :: SDDeltaT = 0.0_R8Ki !< Time step (for integration of continuous states) [seconds] INTEGER(IntKi) :: IntMethod = 0_IntKi !< Integration Method (1/2/3)Length of y2 array [-] @@ -269,6 +239,7 @@ MODULE SubDyn_Types REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: FG !< Gravity force vector, not reduced [N] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DP0 !< Vector from TP to a Node at t=0, used for Floating Rigid Body motion [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: rPG !< Vector from TP to rigid-body CoG in the Guyan (rigid-body) frame, used for Floating Rigid Body Motion [m] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: rTP0 !< Vector from rigid-body reference point to transition pieces [m] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: NodeID2JointID !< Store Joint ID for each NodeID since SubDyn re-label nodes (and add more nodes) [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: CMassNode !< Node indices for concentrated masses [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: CMassWeight !< Weight of concentrated masses [N] @@ -281,9 +252,11 @@ MODULE SubDyn_Types INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: ElemsDOF !< 12 DOF indices of node 1 and 2 of a given member in unconstrained assembled system [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: DOFred2Nodes !< nDOFRed x 3, for each constrained DOF, col1 node index, col2 number of DOF, col3 DOF starting from 1 [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: CtrlElem2Channel !< nCtrlCable x 2, for each CtrlCable, Elem index, and Channel Index [-] + REAL(ReKi) , DIMENSION(1:3) :: RBRefPt = 0.0_ReKi !< global position of transition piece reference point (could also be defined in SubDyn itself) [-] + LOGICAL :: TP1IsRBRefPt = .false. !< If the first transition-piece is a dummy one for rigid-body motion - floating only [-] INTEGER(IntKi) :: nDOFM = 0_IntKi !< retained degrees of freedom (modes) [-] + INTEGER(IntKi) :: nDOFRB = 0_IntKi !< number of rigid-body modes [-] INTEGER(IntKi) :: SttcSolve = 0_IntKi !< Solve dynamics about static equilibrium point (flag) [-] - LOGICAL :: GuyanLoadCorrection = .false. !< Add Extra lever arm contribution to interface reaction outputs [-] LOGICAL :: Floating = .false. !< True if floating bottom (the 6 DOF are free at all reaction nodes) [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: KMMDiag !< Diagonal coefficients of Kmm (OmegaM squared) [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: CMMDiag !< Diagonal coefficients of Cmm (~2 Zeta OmegaM)) [-] @@ -307,10 +280,21 @@ MODULE SubDyn_Types REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PhiL_T !< Transpose of Matrix of C-B modes [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: PhiLInvOmgL2 !< Matrix of C-B modes times the inverse of OmegaL**2 (Phi_L*(Omg**2)^-1) [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: KLLm1 !< KLL^{-1}, inverse of matrix KLL, for static solve only [-] - REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: AM2Jac !< Jacobian (factored) for Adams-Boulton 2nd order Integration [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: AM2JacPiv !< Pivot array for Jacobian factorization (for Adams-Boulton 2nd order Integration) [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TI !< Matrix to calculate TP reference point reaction at top of structure [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: TIreact !< Matrix to calculate single point reaction at base of structure [-] + REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: GMat !< Matrix to convert the first 6 Guyan modes to rigid-body modes [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_LHS !< (Inverse of) the left-hand side matrix of the combined equations of motion [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_LHS1 !< (Inverse of) the left-hand side matrix of the rigid-body equations of motion [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_RHS1_1 + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_RHS1_2 + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_RHS1_3 + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_RHS1_4 + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_RHS1_5 + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_RHS1_6 + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_RHS2_1 + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: EOM_RHS3_1 + INTEGER(IntKi) :: nTP = 0_IntKi !< Total number of transition pieces [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: TPIdx !< Transition piece index associated with each interface node [-] INTEGER(IntKi) :: nNodes = 0_IntKi !< Total number of nodes [-] INTEGER(IntKi) :: nNodes_I = 0_IntKi !< Number of Interface nodes [-] INTEGER(IntKi) :: nNodes_L = 0_IntKi !< Number of Internal nodes [-] @@ -322,6 +306,7 @@ MODULE SubDyn_Types INTEGER(IntKi) :: nDOFI_Rb = 0_IntKi !< Size of IDI_Rb [-] INTEGER(IntKi) :: nDOFI_F = 0_IntKi !< Size of IDI_F [-] INTEGER(IntKi) :: nDOFL_L = 0_IntKi !< Size of IDL_L [-] + INTEGER(IntKi) :: nDOFL_TP = 0_IntKi !< Number of transition-piece DoF [-] INTEGER(IntKi) :: nDOFC__ = 0_IntKi !< Size of IDC__ [-] INTEGER(IntKi) :: nDOFC_Rb = 0_IntKi !< Size of IDC_Rb [-] INTEGER(IntKi) :: nDOFC_L = 0_IntKi !< Size of IDC_L [-] @@ -335,9 +320,9 @@ MODULE SubDyn_Types INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDI_F !< Index array of the interface (nodes connect to TP) dofs that are fixed DOF [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDL_L !< Index array of the internal dofs coming from internal nodes [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDC__ !< Index of all bottom DOF [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDC_Rb !< Index array of the contraint dofs that are retained/master/follower DOF [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDC_L !< Index array of the contraint dofs that are follower/internal DOF [-] - INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDC_F !< Index array of the contraint dofs that are fixd DOF [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDC_Rb !< Index array of the constraint dofs that are retained/master/follower DOF [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDC_L !< Index array of the constraint dofs that are follower/internal DOF [-] + INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDC_F !< Index array of the constraint dofs that are fixd DOF [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: IDR__ !< Index array of the interface and restraint dofs [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: ID__Rb !< Index array of all the retained/leader/master dofs (from any nodes of the structure) [-] INTEGER(IntKi) , DIMENSION(:), ALLOCATABLE :: ID__L !< Index array of all the follower/internal dofs (from any nodes of the structure) [-] @@ -360,30 +345,86 @@ MODULE SubDyn_Types INTEGER(IntKi) :: OutAllInt = 0_IntKi !< Integer version of OutAll [-] INTEGER(IntKi) :: OutAllDims = 0_IntKi !< Integer version of OutAll [-] INTEGER(IntKi) :: OutDec = 0_IntKi !< Output Decimation for Requested Channels [-] - INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: Jac_u_indx !< matrix to help fill/pack the u vector in computing the jacobian [-] - REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: du !< vector that determines size of perturbation for u (inputs) [-] - REAL(R8Ki) , DIMENSION(1:2) :: dx = 0.0_R8Ki !< vector that determines size of perturbation for x (continuous states) [-] - INTEGER(IntKi) :: Jac_ny = 0_IntKi !< number of outputs in jacobian matrix [-] - INTEGER(IntKi) :: Jac_nx = 0_IntKi !< half the number of continuous states in jacobian matrix [-] - LOGICAL :: RotStates = .false. !< Orient states in rotating frame during linearization? (flag) [-] END TYPE SD_ParameterType ! ======================= ! ========= SD_InputType ======= TYPE, PUBLIC :: SD_InputType - TYPE(MeshType) :: TPMesh !< Transition piece inputs on a point mesh [-] + TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: TPMesh !< Transition piece inputs on a point mesh [-] TYPE(MeshType) :: LMesh !< Point mesh for interior node inputs [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: CableDeltaL !< Cable tension, control input [-] END TYPE SD_InputType ! ======================= ! ========= SD_OutputType ======= TYPE, PUBLIC :: SD_OutputType - TYPE(MeshType) :: Y1Mesh !< Transition piece outputs on a point mesh [-] + TYPE(MeshType) :: Y0Mesh !< Motion mesh for the rigid-body reference point [-] + TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: Y1Mesh !< Transition piece outputs on a point mesh [-] TYPE(MeshType) :: Y2Mesh !< Interior+Interface nodes rigid body displacements + elastic velocities and accelerations on a point mesh [-] TYPE(MeshType) :: Y3Mesh !< Interior+Interface nodes full elastic displacements/velocities and accelerations on a point mesh [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: WriteOutput !< Data to be written to an output file [-] END TYPE SD_OutputType ! ======================= -CONTAINS +! ========= SD_MiscVarType ======= + TYPE, PUBLIC :: SD_MiscVarType + TYPE(ModJacType) :: Jac !< Values corresponding to module variables [-] + TYPE(SD_ContinuousStateType) :: x_perturb !< [-] + TYPE(SD_ContinuousStateType) :: dxdt_lin !< [-] + TYPE(SD_InputType) :: u_perturb !< [-] + TYPE(SD_OutputType) :: y_lin !< [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: AM2Jac !< [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: AM2xq !< [-] + REAL(R8Ki) , DIMENSION(:,:), ALLOCATABLE :: AM2xq2 !< [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: qmdotdot !< 2nd Derivative of states, used only for output-file purposes [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: qRdotdot !< 2nd derivative of rigid-body states (floating only) [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_TP + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: u_TP + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: udot_TP + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: udotdot_TP + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Y1 + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Y1_Guy_R + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Y1_Guy_L + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_L !< Loads on internal DOF, size nL [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: F_L2 !< Loads on internal DOF, size nL, used for SIM and ADM4 [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UR_bar + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UR_bar_dot + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UR_bar_dotdot + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL !< Internal DOFs (L) displacements [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_NS !< Internal DOFs (L) displacements, No SIM (NS) [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_dot + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_dotdot + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: DU_full !< Delta U used for extra moment, size nDOF [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: U_full !< Displacement of all DOFs (full system) with SIM [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: U_full_NS !< Displacement of all DOFs (full system), No SIM (NS) [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: U_full_dot + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: U_full_dotdot + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: U_full_elast !< Elastic displacements for computation of K ue (without rigid body mode for floating), includes SIM [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: U_red + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: x_full + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: FC_unit !< Cable Force vector (for varying cable load, of unit cable load) [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: SDWrOutput !< Data from previous step to be written to a SubDyn output file [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: AllOuts !< Data for output file [-] + REAL(DbKi) :: LastOutTime = 0.0_R8Ki !< The time of the most recent stored output data [s] + INTEGER(IntKi) :: Decimat = 0_IntKi !< Current output decimation counter [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Fext !< External loads on unconstrained DOFs [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: Fext_red !< External loads on constrained DOFs, Fext_red= T^t Fext [-] + REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: FG !< Gravity force vector (without initial cable force T0) based on the instantaneous platform orientation, not reduced (floating only) [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_SIM !< UL for SIM = PhiL qL0- PhiM qm0, size nL [-] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: UL_0m !< Intermediate UL term for SIM = PhiM qm0, size nL [-] + END TYPE SD_MiscVarType +! ======================= + integer(IntKi), public, parameter :: SD_x_qm = 1 ! SD%qm + integer(IntKi), public, parameter :: SD_x_qmdot = 2 ! SD%qmdot + integer(IntKi), public, parameter :: SD_x_qR = 3 ! SD%qR + integer(IntKi), public, parameter :: SD_x_qRdot = 4 ! SD%qRdot + integer(IntKi), public, parameter :: SD_u_TPMesh = 5 ! SD%TPMesh(DL%i1) + integer(IntKi), public, parameter :: SD_u_LMesh = 6 ! SD%LMesh + integer(IntKi), public, parameter :: SD_u_CableDeltaL = 7 ! SD%CableDeltaL + integer(IntKi), public, parameter :: SD_y_Y0Mesh = 8 ! SD%Y0Mesh + integer(IntKi), public, parameter :: SD_y_Y1Mesh = 9 ! SD%Y1Mesh(DL%i1) + integer(IntKi), public, parameter :: SD_y_Y2Mesh = 10 ! SD%Y2Mesh + integer(IntKi), public, parameter :: SD_y_Y3Mesh = 11 ! SD%Y3Mesh + integer(IntKi), public, parameter :: SD_y_WriteOutput = 12 ! SD%WriteOutput + +contains subroutine SD_CopyIList(SrcIListData, DstIListData, CtrlCode, ErrStat, ErrMsg) type(IList), intent(in) :: SrcIListData @@ -917,7 +958,19 @@ subroutine SD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSta DstInitInputData%RootName = SrcInitInputData%RootName DstInitInputData%g = SrcInitInputData%g DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth - DstInitInputData%TP_RefPoint = SrcInitInputData%TP_RefPoint + DstInitInputData%NTP = SrcInitInputData%NTP + if (allocated(SrcInitInputData%TP_RefPoint)) then + LB(1:2) = lbound(SrcInitInputData%TP_RefPoint) + UB(1:2) = ubound(SrcInitInputData%TP_RefPoint) + if (.not. allocated(DstInitInputData%TP_RefPoint)) then + allocate(DstInitInputData%TP_RefPoint(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitInputData%TP_RefPoint.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInitInputData%TP_RefPoint = SrcInitInputData%TP_RefPoint + end if DstInitInputData%SubRotateZ = SrcInitInputData%SubRotateZ if (allocated(SrcInitInputData%SoilStiffness)) then LB(1:3) = lbound(SrcInitInputData%SoilStiffness) @@ -946,6 +999,9 @@ subroutine SD_DestroyInitInput(InitInputData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'SD_DestroyInitInput' ErrStat = ErrID_None ErrMsg = '' + if (allocated(InitInputData%TP_RefPoint)) then + deallocate(InitInputData%TP_RefPoint) + end if if (allocated(InitInputData%SoilStiffness)) then deallocate(InitInputData%SoilStiffness) end if @@ -962,7 +1018,8 @@ subroutine SD_PackInitInput(RF, Indata) call RegPack(RF, InData%RootName) call RegPack(RF, InData%g) call RegPack(RF, InData%WtrDpth) - call RegPack(RF, InData%TP_RefPoint) + call RegPack(RF, InData%NTP) + call RegPackAlloc(RF, InData%TP_RefPoint) call RegPack(RF, InData%SubRotateZ) call RegPackAlloc(RF, InData%SoilStiffness) call MeshPack(RF, InData%SoilMesh) @@ -982,7 +1039,8 @@ subroutine SD_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%g); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WtrDpth); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TP_RefPoint); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NTP); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TP_RefPoint); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SubRotateZ); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%SoilStiffness); if (RegCheckErr(RF, RoutineName)) return call MeshUnpack(RF, OutData%SoilMesh) ! SoilMesh @@ -1028,102 +1086,12 @@ subroutine SD_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, Err call NWTC_Library_CopyProgDesc(SrcInitOutputData%Ver, DstInitOutputData%Ver, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return - if (allocated(SrcInitOutputData%LinNames_y)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_y) - UB(1:1) = ubound(SrcInitOutputData%LinNames_y) - if (.not. allocated(DstInitOutputData%LinNames_y)) then - allocate(DstInitOutputData%LinNames_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_y = SrcInitOutputData%LinNames_y - end if - if (allocated(SrcInitOutputData%LinNames_x)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_x) - UB(1:1) = ubound(SrcInitOutputData%LinNames_x) - if (.not. allocated(DstInitOutputData%LinNames_x)) then - allocate(DstInitOutputData%LinNames_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_x = SrcInitOutputData%LinNames_x - end if - if (allocated(SrcInitOutputData%LinNames_u)) then - LB(1:1) = lbound(SrcInitOutputData%LinNames_u) - UB(1:1) = ubound(SrcInitOutputData%LinNames_u) - if (.not. allocated(DstInitOutputData%LinNames_u)) then - allocate(DstInitOutputData%LinNames_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%LinNames_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%LinNames_u = SrcInitOutputData%LinNames_u - end if - if (allocated(SrcInitOutputData%RotFrame_y)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_y) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_y) - if (.not. allocated(DstInitOutputData%RotFrame_y)) then - allocate(DstInitOutputData%RotFrame_y(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_y.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_y = SrcInitOutputData%RotFrame_y - end if - if (allocated(SrcInitOutputData%RotFrame_x)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_x) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_x) - if (.not. allocated(DstInitOutputData%RotFrame_x)) then - allocate(DstInitOutputData%RotFrame_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_x = SrcInitOutputData%RotFrame_x - end if - if (allocated(SrcInitOutputData%RotFrame_u)) then - LB(1:1) = lbound(SrcInitOutputData%RotFrame_u) - UB(1:1) = ubound(SrcInitOutputData%RotFrame_u) - if (.not. allocated(DstInitOutputData%RotFrame_u)) then - allocate(DstInitOutputData%RotFrame_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%RotFrame_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%RotFrame_u = SrcInitOutputData%RotFrame_u - end if - if (allocated(SrcInitOutputData%IsLoad_u)) then - LB(1:1) = lbound(SrcInitOutputData%IsLoad_u) - UB(1:1) = ubound(SrcInitOutputData%IsLoad_u) - if (.not. allocated(DstInitOutputData%IsLoad_u)) then - allocate(DstInitOutputData%IsLoad_u(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%IsLoad_u.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%IsLoad_u = SrcInitOutputData%IsLoad_u - end if - if (allocated(SrcInitOutputData%DerivOrder_x)) then - LB(1:1) = lbound(SrcInitOutputData%DerivOrder_x) - UB(1:1) = ubound(SrcInitOutputData%DerivOrder_x) - if (.not. allocated(DstInitOutputData%DerivOrder_x)) then - allocate(DstInitOutputData%DerivOrder_x(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstInitOutputData%DerivOrder_x.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstInitOutputData%DerivOrder_x = SrcInitOutputData%DerivOrder_x - end if + call NWTC_Library_CopyModVarsType(SrcInitOutputData%Vars, DstInitOutputData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstInitOutputData%IsFloating = SrcInitOutputData%IsFloating + DstInitOutputData%SDHasRBDoF = SrcInitOutputData%SDHasRBDoF + DstInitOutputData%PlatformPos = SrcInitOutputData%PlatformPos if (allocated(SrcInitOutputData%CableCChanRqst)) then LB(1:1) = lbound(SrcInitOutputData%CableCChanRqst) UB(1:1) = ubound(SrcInitOutputData%CableCChanRqst) @@ -1155,30 +1123,8 @@ subroutine SD_DestroyInitOutput(InitOutputData, ErrStat, ErrMsg) end if call NWTC_Library_DestroyProgDesc(InitOutputData%Ver, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(InitOutputData%LinNames_y)) then - deallocate(InitOutputData%LinNames_y) - end if - if (allocated(InitOutputData%LinNames_x)) then - deallocate(InitOutputData%LinNames_x) - end if - if (allocated(InitOutputData%LinNames_u)) then - deallocate(InitOutputData%LinNames_u) - end if - if (allocated(InitOutputData%RotFrame_y)) then - deallocate(InitOutputData%RotFrame_y) - end if - if (allocated(InitOutputData%RotFrame_x)) then - deallocate(InitOutputData%RotFrame_x) - end if - if (allocated(InitOutputData%RotFrame_u)) then - deallocate(InitOutputData%RotFrame_u) - end if - if (allocated(InitOutputData%IsLoad_u)) then - deallocate(InitOutputData%IsLoad_u) - end if - if (allocated(InitOutputData%DerivOrder_x)) then - deallocate(InitOutputData%DerivOrder_x) - end if + call NWTC_Library_DestroyModVarsType(InitOutputData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(InitOutputData%CableCChanRqst)) then deallocate(InitOutputData%CableCChanRqst) end if @@ -1192,14 +1138,10 @@ subroutine SD_PackInitOutput(RF, Indata) call RegPackAlloc(RF, InData%WriteOutputHdr) call RegPackAlloc(RF, InData%WriteOutputUnt) call NWTC_Library_PackProgDesc(RF, InData%Ver) - call RegPackAlloc(RF, InData%LinNames_y) - call RegPackAlloc(RF, InData%LinNames_x) - call RegPackAlloc(RF, InData%LinNames_u) - call RegPackAlloc(RF, InData%RotFrame_y) - call RegPackAlloc(RF, InData%RotFrame_x) - call RegPackAlloc(RF, InData%RotFrame_u) - call RegPackAlloc(RF, InData%IsLoad_u) - call RegPackAlloc(RF, InData%DerivOrder_x) + call NWTC_Library_PackModVarsType(RF, InData%Vars) + call RegPack(RF, InData%IsFloating) + call RegPack(RF, InData%SDHasRBDoF) + call RegPack(RF, InData%PlatformPos) call RegPackAlloc(RF, InData%CableCChanRqst) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1215,14 +1157,10 @@ subroutine SD_UnPackInitOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%WriteOutputHdr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WriteOutputUnt); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackProgDesc(RF, OutData%Ver) ! Ver - call RegUnpackAlloc(RF, OutData%LinNames_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%LinNames_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_y); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_x); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%RotFrame_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%IsLoad_u); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DerivOrder_x); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars + call RegUnpack(RF, OutData%IsFloating); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%SDHasRBDoF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PlatformPos); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%CableCChanRqst); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1238,11 +1176,24 @@ subroutine SD_CopyInitType(SrcInitTypeData, DstInitTypeData, CtrlCode, ErrStat, ErrStat = ErrID_None ErrMsg = '' DstInitTypeData%RootName = SrcInitTypeData%RootName - DstInitTypeData%TP_RefPoint = SrcInitTypeData%TP_RefPoint + if (allocated(SrcInitTypeData%TP_RefPoint)) then + LB(1:2) = lbound(SrcInitTypeData%TP_RefPoint) + UB(1:2) = ubound(SrcInitTypeData%TP_RefPoint) + if (.not. allocated(DstInitTypeData%TP_RefPoint)) then + allocate(DstInitTypeData%TP_RefPoint(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitTypeData%TP_RefPoint.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInitTypeData%TP_RefPoint = SrcInitTypeData%TP_RefPoint + end if DstInitTypeData%SubRotateZ = SrcInitTypeData%SubRotateZ DstInitTypeData%g = SrcInitTypeData%g DstInitTypeData%DT = SrcInitTypeData%DT + DstInitTypeData%NTP = SrcInitTypeData%NTP DstInitTypeData%NJoints = SrcInitTypeData%NJoints + DstInitTypeData%RB_RefJoint = SrcInitTypeData%RB_RefJoint DstInitTypeData%NPropSetsX = SrcInitTypeData%NPropSetsX DstInitTypeData%NPropSetsBC = SrcInitTypeData%NPropSetsBC DstInitTypeData%NPropSetsBR = SrcInitTypeData%NPropSetsBR @@ -1376,7 +1327,19 @@ subroutine SD_CopyInitType(SrcInitTypeData, DstInitTypeData, CtrlCode, ErrStat, end if DstInitTypeData%GuyanDampMod = SrcInitTypeData%GuyanDampMod DstInitTypeData%RayleighDamp = SrcInitTypeData%RayleighDamp - DstInitTypeData%GuyanDampMat = SrcInitTypeData%GuyanDampMat + DstInitTypeData%GuyanDampSize = SrcInitTypeData%GuyanDampSize + if (allocated(SrcInitTypeData%GuyanDampMat)) then + LB(1:2) = lbound(SrcInitTypeData%GuyanDampMat) + UB(1:2) = ubound(SrcInitTypeData%GuyanDampMat) + if (.not. allocated(DstInitTypeData%GuyanDampMat)) then + allocate(DstInitTypeData%GuyanDampMat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInitTypeData%GuyanDampMat.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstInitTypeData%GuyanDampMat = SrcInitTypeData%GuyanDampMat + end if if (allocated(SrcInitTypeData%Members)) then LB(1:2) = lbound(SrcInitTypeData%Members) UB(1:2) = ubound(SrcInitTypeData%Members) @@ -1639,6 +1602,7 @@ subroutine SD_CopyInitType(SrcInitTypeData, DstInitTypeData, CtrlCode, ErrStat, DstInitTypeData%NodesConnE = SrcInitTypeData%NodesConnE end if DstInitTypeData%SSSum = SrcInitTypeData%SSSum + DstInitTypeData%qR0 = SrcInitTypeData%qR0 end subroutine subroutine SD_DestroyInitType(InitTypeData, ErrStat, ErrMsg) @@ -1648,6 +1612,9 @@ subroutine SD_DestroyInitType(InitTypeData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'SD_DestroyInitType' ErrStat = ErrID_None ErrMsg = '' + if (allocated(InitTypeData%TP_RefPoint)) then + deallocate(InitTypeData%TP_RefPoint) + end if if (allocated(InitTypeData%Joints)) then deallocate(InitTypeData%Joints) end if @@ -1678,6 +1645,9 @@ subroutine SD_DestroyInitType(InitTypeData, ErrStat, ErrMsg) if (allocated(InitTypeData%JDampings)) then deallocate(InitTypeData%JDampings) end if + if (allocated(InitTypeData%GuyanDampMat)) then + deallocate(InitTypeData%GuyanDampMat) + end if if (allocated(InitTypeData%Members)) then deallocate(InitTypeData%Members) end if @@ -1749,11 +1719,13 @@ subroutine SD_PackInitType(RF, Indata) character(*), parameter :: RoutineName = 'SD_PackInitType' if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%RootName) - call RegPack(RF, InData%TP_RefPoint) + call RegPackAlloc(RF, InData%TP_RefPoint) call RegPack(RF, InData%SubRotateZ) call RegPack(RF, InData%g) call RegPack(RF, InData%DT) + call RegPack(RF, InData%NTP) call RegPack(RF, InData%NJoints) + call RegPack(RF, InData%RB_RefJoint) call RegPack(RF, InData%NPropSetsX) call RegPack(RF, InData%NPropSetsBC) call RegPack(RF, InData%NPropSetsBR) @@ -1777,7 +1749,8 @@ subroutine SD_PackInitType(RF, Indata) call RegPackAlloc(RF, InData%JDampings) call RegPack(RF, InData%GuyanDampMod) call RegPack(RF, InData%RayleighDamp) - call RegPack(RF, InData%GuyanDampMat) + call RegPack(RF, InData%GuyanDampSize) + call RegPackAlloc(RF, InData%GuyanDampMat) call RegPackAlloc(RF, InData%Members) call RegPackAlloc(RF, InData%MemberSpin) call RegPackAlloc(RF, InData%SSOutList) @@ -1809,6 +1782,7 @@ subroutine SD_PackInitType(RF, Indata) call RegPackAlloc(RF, InData%NodesConnN) call RegPackAlloc(RF, InData%NodesConnE) call RegPack(RF, InData%SSSum) + call RegPack(RF, InData%qR0) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1821,11 +1795,13 @@ subroutine SD_UnPackInitType(RF, OutData) logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%TP_RefPoint); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TP_RefPoint); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SubRotateZ); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%g); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DT); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NTP); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NJoints); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RB_RefJoint); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NPropSetsX); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NPropSetsBC); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NPropSetsBR); if (RegCheckErr(RF, RoutineName)) return @@ -1849,7 +1825,8 @@ subroutine SD_UnPackInitType(RF, OutData) call RegUnpackAlloc(RF, OutData%JDampings); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GuyanDampMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RayleighDamp); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%GuyanDampMat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%GuyanDampSize); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%GuyanDampMat); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Members); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%MemberSpin); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%SSOutList); if (RegCheckErr(RF, RoutineName)) return @@ -1881,6 +1858,7 @@ subroutine SD_UnPackInitType(RF, OutData) call RegUnpackAlloc(RF, OutData%NodesConnN); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%NodesConnE); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SSSum); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%qR0); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine SD_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrStat, ErrMsg) @@ -1918,6 +1896,30 @@ subroutine SD_CopyContState(SrcContStateData, DstContStateData, CtrlCode, ErrSta end if DstContStateData%qmdot = SrcContStateData%qmdot end if + if (allocated(SrcContStateData%qR)) then + LB(1:1) = lbound(SrcContStateData%qR) + UB(1:1) = ubound(SrcContStateData%qR) + if (.not. allocated(DstContStateData%qR)) then + allocate(DstContStateData%qR(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstContStateData%qR.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstContStateData%qR = SrcContStateData%qR + end if + if (allocated(SrcContStateData%qRdot)) then + LB(1:1) = lbound(SrcContStateData%qRdot) + UB(1:1) = ubound(SrcContStateData%qRdot) + if (.not. allocated(DstContStateData%qRdot)) then + allocate(DstContStateData%qRdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstContStateData%qRdot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstContStateData%qRdot = SrcContStateData%qRdot + end if end subroutine subroutine SD_DestroyContState(ContStateData, ErrStat, ErrMsg) @@ -1933,6 +1935,12 @@ subroutine SD_DestroyContState(ContStateData, ErrStat, ErrMsg) if (allocated(ContStateData%qmdot)) then deallocate(ContStateData%qmdot) end if + if (allocated(ContStateData%qR)) then + deallocate(ContStateData%qR) + end if + if (allocated(ContStateData%qRdot)) then + deallocate(ContStateData%qRdot) + end if end subroutine subroutine SD_PackContState(RF, Indata) @@ -1942,6 +1950,8 @@ subroutine SD_PackContState(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call RegPackAlloc(RF, InData%qm) call RegPackAlloc(RF, InData%qmdot) + call RegPackAlloc(RF, InData%qR) + call RegPackAlloc(RF, InData%qRdot) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -1955,6 +1965,8 @@ subroutine SD_UnPackContState(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpackAlloc(RF, OutData%qm); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%qmdot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qR); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qRdot); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine SD_CopyDiscState(SrcDiscStateData, DstDiscStateData, CtrlCode, ErrStat, ErrMsg) @@ -2132,1049 +2144,707 @@ subroutine SD_UnPackOtherState(RF, OutData) call RegUnpack(RF, OutData%n); if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine SD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) - type(SD_MiscVarType), intent(in) :: SrcMiscData - type(SD_MiscVarType), intent(inout) :: DstMiscData +subroutine SD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) + type(SD_ParameterType), intent(in) :: SrcParamData + type(SD_ParameterType), intent(inout) :: DstParamData integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg - integer(B4Ki) :: LB(1), UB(1) + integer(B4Ki) :: i1, i2 + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: ErrStat2 - character(*), parameter :: RoutineName = 'SD_CopyMisc' + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SD_CopyParam' ErrStat = ErrID_None ErrMsg = '' - if (allocated(SrcMiscData%qmdotdot)) then - LB(1:1) = lbound(SrcMiscData%qmdotdot) - UB(1:1) = ubound(SrcMiscData%qmdotdot) - if (.not. allocated(DstMiscData%qmdotdot)) then - allocate(DstMiscData%qmdotdot(LB(1):UB(1)), stat=ErrStat2) + call NWTC_Library_CopyModVarsType(SrcParamData%Vars, DstParamData%Vars, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + DstParamData%g = SrcParamData%g + DstParamData%SDDeltaT = SrcParamData%SDDeltaT + DstParamData%IntMethod = SrcParamData%IntMethod + DstParamData%nDOF = SrcParamData%nDOF + DstParamData%nDOF_red = SrcParamData%nDOF_red + DstParamData%Nmembers = SrcParamData%Nmembers + if (allocated(SrcParamData%Elems)) then + LB(1:2) = lbound(SrcParamData%Elems) + UB(1:2) = ubound(SrcParamData%Elems) + if (.not. allocated(DstParamData%Elems)) then + allocate(DstParamData%Elems(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%qmdotdot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Elems.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%qmdotdot = SrcMiscData%qmdotdot + DstParamData%Elems = SrcParamData%Elems end if - DstMiscData%u_TP = SrcMiscData%u_TP - DstMiscData%udot_TP = SrcMiscData%udot_TP - DstMiscData%udotdot_TP = SrcMiscData%udotdot_TP - if (allocated(SrcMiscData%F_L)) then - LB(1:1) = lbound(SrcMiscData%F_L) - UB(1:1) = ubound(SrcMiscData%F_L) - if (.not. allocated(DstMiscData%F_L)) then - allocate(DstMiscData%F_L(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%ElemSpin)) then + LB(1:1) = lbound(SrcParamData%ElemSpin) + UB(1:1) = ubound(SrcParamData%ElemSpin) + if (.not. allocated(DstParamData%ElemSpin)) then + allocate(DstParamData%ElemSpin(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_L.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ElemSpin.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%F_L = SrcMiscData%F_L + DstParamData%ElemSpin = SrcParamData%ElemSpin end if - if (allocated(SrcMiscData%F_L2)) then - LB(1:1) = lbound(SrcMiscData%F_L2) - UB(1:1) = ubound(SrcMiscData%F_L2) - if (.not. allocated(DstMiscData%F_L2)) then - allocate(DstMiscData%F_L2(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%ElemProps)) then + LB(1:1) = lbound(SrcParamData%ElemProps) + UB(1:1) = ubound(SrcParamData%ElemProps) + if (.not. allocated(DstParamData%ElemProps)) then + allocate(DstParamData%ElemProps(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_L2.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ElemProps.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%F_L2 = SrcMiscData%F_L2 + do i1 = LB(1), UB(1) + call SD_CopyElemPropType(SrcParamData%ElemProps(i1), DstParamData%ElemProps(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcMiscData%UR_bar)) then - LB(1:1) = lbound(SrcMiscData%UR_bar) - UB(1:1) = ubound(SrcMiscData%UR_bar) - if (.not. allocated(DstMiscData%UR_bar)) then - allocate(DstMiscData%UR_bar(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%FC)) then + LB(1:1) = lbound(SrcParamData%FC) + UB(1:1) = ubound(SrcParamData%FC) + if (.not. allocated(DstParamData%FC)) then + allocate(DstParamData%FC(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UR_bar.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%FC.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%UR_bar = SrcMiscData%UR_bar + DstParamData%FC = SrcParamData%FC end if - if (allocated(SrcMiscData%UR_bar_dot)) then - LB(1:1) = lbound(SrcMiscData%UR_bar_dot) - UB(1:1) = ubound(SrcMiscData%UR_bar_dot) - if (.not. allocated(DstMiscData%UR_bar_dot)) then - allocate(DstMiscData%UR_bar_dot(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%FG)) then + LB(1:1) = lbound(SrcParamData%FG) + UB(1:1) = ubound(SrcParamData%FG) + if (.not. allocated(DstParamData%FG)) then + allocate(DstParamData%FG(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UR_bar_dot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%FG.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%UR_bar_dot = SrcMiscData%UR_bar_dot + DstParamData%FG = SrcParamData%FG end if - if (allocated(SrcMiscData%UR_bar_dotdot)) then - LB(1:1) = lbound(SrcMiscData%UR_bar_dotdot) - UB(1:1) = ubound(SrcMiscData%UR_bar_dotdot) - if (.not. allocated(DstMiscData%UR_bar_dotdot)) then - allocate(DstMiscData%UR_bar_dotdot(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%DP0)) then + LB(1:2) = lbound(SrcParamData%DP0) + UB(1:2) = ubound(SrcParamData%DP0) + if (.not. allocated(DstParamData%DP0)) then + allocate(DstParamData%DP0(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UR_bar_dotdot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DP0.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%UR_bar_dotdot = SrcMiscData%UR_bar_dotdot + DstParamData%DP0 = SrcParamData%DP0 end if - if (allocated(SrcMiscData%UL)) then - LB(1:1) = lbound(SrcMiscData%UL) - UB(1:1) = ubound(SrcMiscData%UL) - if (.not. allocated(DstMiscData%UL)) then - allocate(DstMiscData%UL(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%rPG)) then + LB(1:1) = lbound(SrcParamData%rPG) + UB(1:1) = ubound(SrcParamData%rPG) + if (.not. allocated(DstParamData%rPG)) then + allocate(DstParamData%rPG(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%rPG.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%UL = SrcMiscData%UL + DstParamData%rPG = SrcParamData%rPG end if - if (allocated(SrcMiscData%UL_NS)) then - LB(1:1) = lbound(SrcMiscData%UL_NS) - UB(1:1) = ubound(SrcMiscData%UL_NS) - if (.not. allocated(DstMiscData%UL_NS)) then - allocate(DstMiscData%UL_NS(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%rTP0)) then + LB(1:2) = lbound(SrcParamData%rTP0) + UB(1:2) = ubound(SrcParamData%rTP0) + if (.not. allocated(DstParamData%rTP0)) then + allocate(DstParamData%rTP0(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_NS.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%rTP0.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%UL_NS = SrcMiscData%UL_NS + DstParamData%rTP0 = SrcParamData%rTP0 end if - if (allocated(SrcMiscData%UL_dot)) then - LB(1:1) = lbound(SrcMiscData%UL_dot) - UB(1:1) = ubound(SrcMiscData%UL_dot) - if (.not. allocated(DstMiscData%UL_dot)) then - allocate(DstMiscData%UL_dot(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%NodeID2JointID)) then + LB(1:1) = lbound(SrcParamData%NodeID2JointID) + UB(1:1) = ubound(SrcParamData%NodeID2JointID) + if (.not. allocated(DstParamData%NodeID2JointID)) then + allocate(DstParamData%NodeID2JointID(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_dot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NodeID2JointID.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%UL_dot = SrcMiscData%UL_dot + DstParamData%NodeID2JointID = SrcParamData%NodeID2JointID end if - if (allocated(SrcMiscData%UL_dotdot)) then - LB(1:1) = lbound(SrcMiscData%UL_dotdot) - UB(1:1) = ubound(SrcMiscData%UL_dotdot) - if (.not. allocated(DstMiscData%UL_dotdot)) then - allocate(DstMiscData%UL_dotdot(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%CMassNode)) then + LB(1:1) = lbound(SrcParamData%CMassNode) + UB(1:1) = ubound(SrcParamData%CMassNode) + if (.not. allocated(DstParamData%CMassNode)) then + allocate(DstParamData%CMassNode(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_dotdot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMassNode.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%UL_dotdot = SrcMiscData%UL_dotdot + DstParamData%CMassNode = SrcParamData%CMassNode end if - if (allocated(SrcMiscData%DU_full)) then - LB(1:1) = lbound(SrcMiscData%DU_full) - UB(1:1) = ubound(SrcMiscData%DU_full) - if (.not. allocated(DstMiscData%DU_full)) then - allocate(DstMiscData%DU_full(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%CMassWeight)) then + LB(1:1) = lbound(SrcParamData%CMassWeight) + UB(1:1) = ubound(SrcParamData%CMassWeight) + if (.not. allocated(DstParamData%CMassWeight)) then + allocate(DstParamData%CMassWeight(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%DU_full.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMassWeight.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%DU_full = SrcMiscData%DU_full + DstParamData%CMassWeight = SrcParamData%CMassWeight end if - if (allocated(SrcMiscData%U_full)) then - LB(1:1) = lbound(SrcMiscData%U_full) - UB(1:1) = ubound(SrcMiscData%U_full) - if (.not. allocated(DstMiscData%U_full)) then - allocate(DstMiscData%U_full(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%CMassOffset)) then + LB(1:2) = lbound(SrcParamData%CMassOffset) + UB(1:2) = ubound(SrcParamData%CMassOffset) + if (.not. allocated(DstParamData%CMassOffset)) then + allocate(DstParamData%CMassOffset(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMassOffset.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%U_full = SrcMiscData%U_full + DstParamData%CMassOffset = SrcParamData%CMassOffset end if - if (allocated(SrcMiscData%U_full_NS)) then - LB(1:1) = lbound(SrcMiscData%U_full_NS) - UB(1:1) = ubound(SrcMiscData%U_full_NS) - if (.not. allocated(DstMiscData%U_full_NS)) then - allocate(DstMiscData%U_full_NS(LB(1):UB(1)), stat=ErrStat2) + DstParamData%reduced = SrcParamData%reduced + if (allocated(SrcParamData%T_red)) then + LB(1:2) = lbound(SrcParamData%T_red) + UB(1:2) = ubound(SrcParamData%T_red) + if (.not. allocated(DstParamData%T_red)) then + allocate(DstParamData%T_red(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full_NS.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%T_red.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%U_full_NS = SrcMiscData%U_full_NS + DstParamData%T_red = SrcParamData%T_red end if - if (allocated(SrcMiscData%U_full_dot)) then - LB(1:1) = lbound(SrcMiscData%U_full_dot) - UB(1:1) = ubound(SrcMiscData%U_full_dot) - if (.not. allocated(DstMiscData%U_full_dot)) then - allocate(DstMiscData%U_full_dot(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%T_red_T)) then + LB(1:2) = lbound(SrcParamData%T_red_T) + UB(1:2) = ubound(SrcParamData%T_red_T) + if (.not. allocated(DstParamData%T_red_T)) then + allocate(DstParamData%T_red_T(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full_dot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%T_red_T.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%U_full_dot = SrcMiscData%U_full_dot + DstParamData%T_red_T = SrcParamData%T_red_T end if - if (allocated(SrcMiscData%U_full_dotdot)) then - LB(1:1) = lbound(SrcMiscData%U_full_dotdot) - UB(1:1) = ubound(SrcMiscData%U_full_dotdot) - if (.not. allocated(DstMiscData%U_full_dotdot)) then - allocate(DstMiscData%U_full_dotdot(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%NodesDOF)) then + LB(1:1) = lbound(SrcParamData%NodesDOF) + UB(1:1) = ubound(SrcParamData%NodesDOF) + if (.not. allocated(DstParamData%NodesDOF)) then + allocate(DstParamData%NodesDOF(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full_dotdot.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NodesDOF.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%U_full_dotdot = SrcMiscData%U_full_dotdot + do i1 = LB(1), UB(1) + call SD_CopyIList(SrcParamData%NodesDOF(i1), DstParamData%NodesDOF(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcMiscData%U_full_elast)) then - LB(1:1) = lbound(SrcMiscData%U_full_elast) - UB(1:1) = ubound(SrcMiscData%U_full_elast) - if (.not. allocated(DstMiscData%U_full_elast)) then - allocate(DstMiscData%U_full_elast(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%NodesDOFred)) then + LB(1:1) = lbound(SrcParamData%NodesDOFred) + UB(1:1) = ubound(SrcParamData%NodesDOFred) + if (.not. allocated(DstParamData%NodesDOFred)) then + allocate(DstParamData%NodesDOFred(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full_elast.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NodesDOFred.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%U_full_elast = SrcMiscData%U_full_elast + do i1 = LB(1), UB(1) + call SD_CopyIList(SrcParamData%NodesDOFred(i1), DstParamData%NodesDOFred(i1), CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do end if - if (allocated(SrcMiscData%U_red)) then - LB(1:1) = lbound(SrcMiscData%U_red) - UB(1:1) = ubound(SrcMiscData%U_red) - if (.not. allocated(DstMiscData%U_red)) then - allocate(DstMiscData%U_red(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%ElemsDOF)) then + LB(1:2) = lbound(SrcParamData%ElemsDOF) + UB(1:2) = ubound(SrcParamData%ElemsDOF) + if (.not. allocated(DstParamData%ElemsDOF)) then + allocate(DstParamData%ElemsDOF(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_red.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ElemsDOF.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%U_red = SrcMiscData%U_red + DstParamData%ElemsDOF = SrcParamData%ElemsDOF end if - if (allocated(SrcMiscData%FC_unit)) then - LB(1:1) = lbound(SrcMiscData%FC_unit) - UB(1:1) = ubound(SrcMiscData%FC_unit) - if (.not. allocated(DstMiscData%FC_unit)) then - allocate(DstMiscData%FC_unit(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%DOFred2Nodes)) then + LB(1:2) = lbound(SrcParamData%DOFred2Nodes) + UB(1:2) = ubound(SrcParamData%DOFred2Nodes) + if (.not. allocated(DstParamData%DOFred2Nodes)) then + allocate(DstParamData%DOFred2Nodes(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FC_unit.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DOFred2Nodes.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%FC_unit = SrcMiscData%FC_unit + DstParamData%DOFred2Nodes = SrcParamData%DOFred2Nodes end if - if (allocated(SrcMiscData%SDWrOutput)) then - LB(1:1) = lbound(SrcMiscData%SDWrOutput) - UB(1:1) = ubound(SrcMiscData%SDWrOutput) - if (.not. allocated(DstMiscData%SDWrOutput)) then - allocate(DstMiscData%SDWrOutput(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%CtrlElem2Channel)) then + LB(1:2) = lbound(SrcParamData%CtrlElem2Channel) + UB(1:2) = ubound(SrcParamData%CtrlElem2Channel) + if (.not. allocated(DstParamData%CtrlElem2Channel)) then + allocate(DstParamData%CtrlElem2Channel(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%SDWrOutput.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CtrlElem2Channel.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%SDWrOutput = SrcMiscData%SDWrOutput + DstParamData%CtrlElem2Channel = SrcParamData%CtrlElem2Channel end if - if (allocated(SrcMiscData%AllOuts)) then - LB(1:1) = lbound(SrcMiscData%AllOuts) - UB(1:1) = ubound(SrcMiscData%AllOuts) - if (.not. allocated(DstMiscData%AllOuts)) then - allocate(DstMiscData%AllOuts(LB(1):UB(1)), stat=ErrStat2) + DstParamData%RBRefPt = SrcParamData%RBRefPt + DstParamData%TP1IsRBRefPt = SrcParamData%TP1IsRBRefPt + DstParamData%nDOFM = SrcParamData%nDOFM + DstParamData%nDOFRB = SrcParamData%nDOFRB + DstParamData%SttcSolve = SrcParamData%SttcSolve + DstParamData%Floating = SrcParamData%Floating + if (allocated(SrcParamData%KMMDiag)) then + LB(1:1) = lbound(SrcParamData%KMMDiag) + UB(1:1) = ubound(SrcParamData%KMMDiag) + if (.not. allocated(DstParamData%KMMDiag)) then + allocate(DstParamData%KMMDiag(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AllOuts.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%KMMDiag.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%AllOuts = SrcMiscData%AllOuts + DstParamData%KMMDiag = SrcParamData%KMMDiag end if - DstMiscData%LastOutTime = SrcMiscData%LastOutTime - DstMiscData%Decimat = SrcMiscData%Decimat - if (allocated(SrcMiscData%Fext)) then - LB(1:1) = lbound(SrcMiscData%Fext) - UB(1:1) = ubound(SrcMiscData%Fext) - if (.not. allocated(DstMiscData%Fext)) then - allocate(DstMiscData%Fext(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%CMMDiag)) then + LB(1:1) = lbound(SrcParamData%CMMDiag) + UB(1:1) = ubound(SrcParamData%CMMDiag) + if (.not. allocated(DstParamData%CMMDiag)) then + allocate(DstParamData%CMMDiag(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Fext.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMMDiag.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%Fext = SrcMiscData%Fext + DstParamData%CMMDiag = SrcParamData%CMMDiag end if - if (allocated(SrcMiscData%Fext_red)) then - LB(1:1) = lbound(SrcMiscData%Fext_red) - UB(1:1) = ubound(SrcMiscData%Fext_red) - if (.not. allocated(DstMiscData%Fext_red)) then - allocate(DstMiscData%Fext_red(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%MMB)) then + LB(1:2) = lbound(SrcParamData%MMB) + UB(1:2) = ubound(SrcParamData%MMB) + if (.not. allocated(DstParamData%MMB)) then + allocate(DstParamData%MMB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Fext_red.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MMB.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%Fext_red = SrcMiscData%Fext_red + DstParamData%MMB = SrcParamData%MMB end if - if (allocated(SrcMiscData%FG)) then - LB(1:1) = lbound(SrcMiscData%FG) - UB(1:1) = ubound(SrcMiscData%FG) - if (.not. allocated(DstMiscData%FG)) then - allocate(DstMiscData%FG(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%MBmmB)) then + LB(1:2) = lbound(SrcParamData%MBmmB) + UB(1:2) = ubound(SrcParamData%MBmmB) + if (.not. allocated(DstParamData%MBmmB)) then + allocate(DstParamData%MBmmB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FG.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MBmmB.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%FG = SrcMiscData%FG + DstParamData%MBmmB = SrcParamData%MBmmB end if - if (allocated(SrcMiscData%UL_SIM)) then - LB(1:1) = lbound(SrcMiscData%UL_SIM) - UB(1:1) = ubound(SrcMiscData%UL_SIM) - if (.not. allocated(DstMiscData%UL_SIM)) then - allocate(DstMiscData%UL_SIM(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%C1_11)) then + LB(1:2) = lbound(SrcParamData%C1_11) + UB(1:2) = ubound(SrcParamData%C1_11) + if (.not. allocated(DstParamData%C1_11)) then + allocate(DstParamData%C1_11(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_SIM.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C1_11.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%UL_SIM = SrcMiscData%UL_SIM + DstParamData%C1_11 = SrcParamData%C1_11 end if - if (allocated(SrcMiscData%UL_0m)) then - LB(1:1) = lbound(SrcMiscData%UL_0m) - UB(1:1) = ubound(SrcMiscData%UL_0m) - if (.not. allocated(DstMiscData%UL_0m)) then - allocate(DstMiscData%UL_0m(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%C1_12)) then + LB(1:2) = lbound(SrcParamData%C1_12) + UB(1:2) = ubound(SrcParamData%C1_12) + if (.not. allocated(DstParamData%C1_12)) then + allocate(DstParamData%C1_12(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_0m.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C1_12.', ErrStat, ErrMsg, RoutineName) return end if end if - DstMiscData%UL_0m = SrcMiscData%UL_0m + DstParamData%C1_12 = SrcParamData%C1_12 end if -end subroutine - -subroutine SD_DestroyMisc(MiscData, ErrStat, ErrMsg) - type(SD_MiscVarType), intent(inout) :: MiscData - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - character(*), parameter :: RoutineName = 'SD_DestroyMisc' - ErrStat = ErrID_None - ErrMsg = '' - if (allocated(MiscData%qmdotdot)) then - deallocate(MiscData%qmdotdot) - end if - if (allocated(MiscData%F_L)) then - deallocate(MiscData%F_L) - end if - if (allocated(MiscData%F_L2)) then - deallocate(MiscData%F_L2) - end if - if (allocated(MiscData%UR_bar)) then - deallocate(MiscData%UR_bar) - end if - if (allocated(MiscData%UR_bar_dot)) then - deallocate(MiscData%UR_bar_dot) - end if - if (allocated(MiscData%UR_bar_dotdot)) then - deallocate(MiscData%UR_bar_dotdot) - end if - if (allocated(MiscData%UL)) then - deallocate(MiscData%UL) - end if - if (allocated(MiscData%UL_NS)) then - deallocate(MiscData%UL_NS) - end if - if (allocated(MiscData%UL_dot)) then - deallocate(MiscData%UL_dot) - end if - if (allocated(MiscData%UL_dotdot)) then - deallocate(MiscData%UL_dotdot) - end if - if (allocated(MiscData%DU_full)) then - deallocate(MiscData%DU_full) - end if - if (allocated(MiscData%U_full)) then - deallocate(MiscData%U_full) - end if - if (allocated(MiscData%U_full_NS)) then - deallocate(MiscData%U_full_NS) - end if - if (allocated(MiscData%U_full_dot)) then - deallocate(MiscData%U_full_dot) - end if - if (allocated(MiscData%U_full_dotdot)) then - deallocate(MiscData%U_full_dotdot) - end if - if (allocated(MiscData%U_full_elast)) then - deallocate(MiscData%U_full_elast) - end if - if (allocated(MiscData%U_red)) then - deallocate(MiscData%U_red) - end if - if (allocated(MiscData%FC_unit)) then - deallocate(MiscData%FC_unit) - end if - if (allocated(MiscData%SDWrOutput)) then - deallocate(MiscData%SDWrOutput) - end if - if (allocated(MiscData%AllOuts)) then - deallocate(MiscData%AllOuts) - end if - if (allocated(MiscData%Fext)) then - deallocate(MiscData%Fext) - end if - if (allocated(MiscData%Fext_red)) then - deallocate(MiscData%Fext_red) - end if - if (allocated(MiscData%FG)) then - deallocate(MiscData%FG) - end if - if (allocated(MiscData%UL_SIM)) then - deallocate(MiscData%UL_SIM) - end if - if (allocated(MiscData%UL_0m)) then - deallocate(MiscData%UL_0m) - end if -end subroutine - -subroutine SD_PackMisc(RF, Indata) - type(RegFile), intent(inout) :: RF - type(SD_MiscVarType), intent(in) :: InData - character(*), parameter :: RoutineName = 'SD_PackMisc' - if (RF%ErrStat >= AbortErrLev) return - call RegPackAlloc(RF, InData%qmdotdot) - call RegPack(RF, InData%u_TP) - call RegPack(RF, InData%udot_TP) - call RegPack(RF, InData%udotdot_TP) - call RegPackAlloc(RF, InData%F_L) - call RegPackAlloc(RF, InData%F_L2) - call RegPackAlloc(RF, InData%UR_bar) - call RegPackAlloc(RF, InData%UR_bar_dot) - call RegPackAlloc(RF, InData%UR_bar_dotdot) - call RegPackAlloc(RF, InData%UL) - call RegPackAlloc(RF, InData%UL_NS) - call RegPackAlloc(RF, InData%UL_dot) - call RegPackAlloc(RF, InData%UL_dotdot) - call RegPackAlloc(RF, InData%DU_full) - call RegPackAlloc(RF, InData%U_full) - call RegPackAlloc(RF, InData%U_full_NS) - call RegPackAlloc(RF, InData%U_full_dot) - call RegPackAlloc(RF, InData%U_full_dotdot) - call RegPackAlloc(RF, InData%U_full_elast) - call RegPackAlloc(RF, InData%U_red) - call RegPackAlloc(RF, InData%FC_unit) - call RegPackAlloc(RF, InData%SDWrOutput) - call RegPackAlloc(RF, InData%AllOuts) - call RegPack(RF, InData%LastOutTime) - call RegPack(RF, InData%Decimat) - call RegPackAlloc(RF, InData%Fext) - call RegPackAlloc(RF, InData%Fext_red) - call RegPackAlloc(RF, InData%FG) - call RegPackAlloc(RF, InData%UL_SIM) - call RegPackAlloc(RF, InData%UL_0m) - if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine SD_UnPackMisc(RF, OutData) - type(RegFile), intent(inout) :: RF - type(SD_MiscVarType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SD_UnPackMisc' - integer(B4Ki) :: LB(1), UB(1) - integer(IntKi) :: stat - logical :: IsAllocAssoc - if (RF%ErrStat /= ErrID_None) return - call RegUnpackAlloc(RF, OutData%qmdotdot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%u_TP); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%udot_TP); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%udotdot_TP); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%F_L); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%F_L2); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%UR_bar); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%UR_bar_dot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%UR_bar_dotdot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%UL); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%UL_NS); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%UL_dot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%UL_dotdot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%DU_full); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%U_full); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%U_full_NS); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%U_full_dot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%U_full_dotdot); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%U_full_elast); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%U_red); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%FC_unit); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%SDWrOutput); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AllOuts); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%LastOutTime); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Decimat); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Fext); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Fext_red); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%FG); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%UL_SIM); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%UL_0m); if (RegCheckErr(RF, RoutineName)) return -end subroutine - -subroutine SD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) - type(SD_ParameterType), intent(in) :: SrcParamData - type(SD_ParameterType), intent(inout) :: DstParamData - integer(IntKi), intent(in ) :: CtrlCode - integer(IntKi), intent( out) :: ErrStat - character(*), intent( out) :: ErrMsg - integer(B4Ki) :: i1, i2 - integer(B4Ki) :: LB(2), UB(2) - integer(IntKi) :: ErrStat2 - character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SD_CopyParam' - ErrStat = ErrID_None - ErrMsg = '' - DstParamData%g = SrcParamData%g - DstParamData%SDDeltaT = SrcParamData%SDDeltaT - DstParamData%IntMethod = SrcParamData%IntMethod - DstParamData%nDOF = SrcParamData%nDOF - DstParamData%nDOF_red = SrcParamData%nDOF_red - DstParamData%Nmembers = SrcParamData%Nmembers - if (allocated(SrcParamData%Elems)) then - LB(1:2) = lbound(SrcParamData%Elems) - UB(1:2) = ubound(SrcParamData%Elems) - if (.not. allocated(DstParamData%Elems)) then - allocate(DstParamData%Elems(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%D1_141)) then + LB(1:2) = lbound(SrcParamData%D1_141) + UB(1:2) = ubound(SrcParamData%D1_141) + if (.not. allocated(DstParamData%D1_141)) then + allocate(DstParamData%D1_141(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Elems.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D1_141.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%Elems = SrcParamData%Elems + DstParamData%D1_141 = SrcParamData%D1_141 end if - if (allocated(SrcParamData%ElemSpin)) then - LB(1:1) = lbound(SrcParamData%ElemSpin) - UB(1:1) = ubound(SrcParamData%ElemSpin) - if (.not. allocated(DstParamData%ElemSpin)) then - allocate(DstParamData%ElemSpin(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%D1_142)) then + LB(1:2) = lbound(SrcParamData%D1_142) + UB(1:2) = ubound(SrcParamData%D1_142) + if (.not. allocated(DstParamData%D1_142)) then + allocate(DstParamData%D1_142(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ElemSpin.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D1_142.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%ElemSpin = SrcParamData%ElemSpin + DstParamData%D1_142 = SrcParamData%D1_142 end if - if (allocated(SrcParamData%ElemProps)) then - LB(1:1) = lbound(SrcParamData%ElemProps) - UB(1:1) = ubound(SrcParamData%ElemProps) - if (.not. allocated(DstParamData%ElemProps)) then - allocate(DstParamData%ElemProps(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%PhiM)) then + LB(1:2) = lbound(SrcParamData%PhiM) + UB(1:2) = ubound(SrcParamData%PhiM) + if (.not. allocated(DstParamData%PhiM)) then + allocate(DstParamData%PhiM(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ElemProps.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PhiM.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call SD_CopyElemPropType(SrcParamData%ElemProps(i1), DstParamData%ElemProps(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%PhiM = SrcParamData%PhiM end if - if (allocated(SrcParamData%FC)) then - LB(1:1) = lbound(SrcParamData%FC) - UB(1:1) = ubound(SrcParamData%FC) - if (.not. allocated(DstParamData%FC)) then - allocate(DstParamData%FC(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%C2_61)) then + LB(1:2) = lbound(SrcParamData%C2_61) + UB(1:2) = ubound(SrcParamData%C2_61) + if (.not. allocated(DstParamData%C2_61)) then + allocate(DstParamData%C2_61(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%FC.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C2_61.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%FC = SrcParamData%FC + DstParamData%C2_61 = SrcParamData%C2_61 end if - if (allocated(SrcParamData%FG)) then - LB(1:1) = lbound(SrcParamData%FG) - UB(1:1) = ubound(SrcParamData%FG) - if (.not. allocated(DstParamData%FG)) then - allocate(DstParamData%FG(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%C2_62)) then + LB(1:2) = lbound(SrcParamData%C2_62) + UB(1:2) = ubound(SrcParamData%C2_62) + if (.not. allocated(DstParamData%C2_62)) then + allocate(DstParamData%C2_62(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%FG.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C2_62.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%FG = SrcParamData%FG + DstParamData%C2_62 = SrcParamData%C2_62 end if - if (allocated(SrcParamData%DP0)) then - LB(1:2) = lbound(SrcParamData%DP0) - UB(1:2) = ubound(SrcParamData%DP0) - if (.not. allocated(DstParamData%DP0)) then - allocate(DstParamData%DP0(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DP0.', ErrStat, ErrMsg, RoutineName) + if (allocated(SrcParamData%PhiRb_TI)) then + LB(1:2) = lbound(SrcParamData%PhiRb_TI) + UB(1:2) = ubound(SrcParamData%PhiRb_TI) + if (.not. allocated(DstParamData%PhiRb_TI)) then + allocate(DstParamData%PhiRb_TI(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PhiRb_TI.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%DP0 = SrcParamData%DP0 + DstParamData%PhiRb_TI = SrcParamData%PhiRb_TI end if - if (allocated(SrcParamData%rPG)) then - LB(1:1) = lbound(SrcParamData%rPG) - UB(1:1) = ubound(SrcParamData%rPG) - if (.not. allocated(DstParamData%rPG)) then - allocate(DstParamData%rPG(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%D2_63)) then + LB(1:2) = lbound(SrcParamData%D2_63) + UB(1:2) = ubound(SrcParamData%D2_63) + if (.not. allocated(DstParamData%D2_63)) then + allocate(DstParamData%D2_63(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%rPG.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D2_63.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%rPG = SrcParamData%rPG + DstParamData%D2_63 = SrcParamData%D2_63 end if - if (allocated(SrcParamData%NodeID2JointID)) then - LB(1:1) = lbound(SrcParamData%NodeID2JointID) - UB(1:1) = ubound(SrcParamData%NodeID2JointID) - if (.not. allocated(DstParamData%NodeID2JointID)) then - allocate(DstParamData%NodeID2JointID(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%D2_64)) then + LB(1:2) = lbound(SrcParamData%D2_64) + UB(1:2) = ubound(SrcParamData%D2_64) + if (.not. allocated(DstParamData%D2_64)) then + allocate(DstParamData%D2_64(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NodeID2JointID.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D2_64.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%NodeID2JointID = SrcParamData%NodeID2JointID + DstParamData%D2_64 = SrcParamData%D2_64 end if - if (allocated(SrcParamData%CMassNode)) then - LB(1:1) = lbound(SrcParamData%CMassNode) - UB(1:1) = ubound(SrcParamData%CMassNode) - if (.not. allocated(DstParamData%CMassNode)) then - allocate(DstParamData%CMassNode(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%MBB)) then + LB(1:2) = lbound(SrcParamData%MBB) + UB(1:2) = ubound(SrcParamData%MBB) + if (.not. allocated(DstParamData%MBB)) then + allocate(DstParamData%MBB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMassNode.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MBB.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%CMassNode = SrcParamData%CMassNode + DstParamData%MBB = SrcParamData%MBB end if - if (allocated(SrcParamData%CMassWeight)) then - LB(1:1) = lbound(SrcParamData%CMassWeight) - UB(1:1) = ubound(SrcParamData%CMassWeight) - if (.not. allocated(DstParamData%CMassWeight)) then - allocate(DstParamData%CMassWeight(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%KBB)) then + LB(1:2) = lbound(SrcParamData%KBB) + UB(1:2) = ubound(SrcParamData%KBB) + if (.not. allocated(DstParamData%KBB)) then + allocate(DstParamData%KBB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMassWeight.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%KBB.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%CMassWeight = SrcParamData%CMassWeight + DstParamData%KBB = SrcParamData%KBB end if - if (allocated(SrcParamData%CMassOffset)) then - LB(1:2) = lbound(SrcParamData%CMassOffset) - UB(1:2) = ubound(SrcParamData%CMassOffset) - if (.not. allocated(DstParamData%CMassOffset)) then - allocate(DstParamData%CMassOffset(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%CBB)) then + LB(1:2) = lbound(SrcParamData%CBB) + UB(1:2) = ubound(SrcParamData%CBB) + if (.not. allocated(DstParamData%CBB)) then + allocate(DstParamData%CBB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMassOffset.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CBB.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%CMassOffset = SrcParamData%CMassOffset + DstParamData%CBB = SrcParamData%CBB end if - DstParamData%reduced = SrcParamData%reduced - if (allocated(SrcParamData%T_red)) then - LB(1:2) = lbound(SrcParamData%T_red) - UB(1:2) = ubound(SrcParamData%T_red) - if (.not. allocated(DstParamData%T_red)) then - allocate(DstParamData%T_red(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%CMM)) then + LB(1:2) = lbound(SrcParamData%CMM) + UB(1:2) = ubound(SrcParamData%CMM) + if (.not. allocated(DstParamData%CMM)) then + allocate(DstParamData%CMM(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%T_red.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMM.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%T_red = SrcParamData%T_red + DstParamData%CMM = SrcParamData%CMM end if - if (allocated(SrcParamData%T_red_T)) then - LB(1:2) = lbound(SrcParamData%T_red_T) - UB(1:2) = ubound(SrcParamData%T_red_T) - if (.not. allocated(DstParamData%T_red_T)) then - allocate(DstParamData%T_red_T(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%MBM)) then + LB(1:2) = lbound(SrcParamData%MBM) + UB(1:2) = ubound(SrcParamData%MBM) + if (.not. allocated(DstParamData%MBM)) then + allocate(DstParamData%MBM(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%T_red_T.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MBM.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%T_red_T = SrcParamData%T_red_T + DstParamData%MBM = SrcParamData%MBM end if - if (allocated(SrcParamData%NodesDOF)) then - LB(1:1) = lbound(SrcParamData%NodesDOF) - UB(1:1) = ubound(SrcParamData%NodesDOF) - if (.not. allocated(DstParamData%NodesDOF)) then - allocate(DstParamData%NodesDOF(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%PhiL_T)) then + LB(1:2) = lbound(SrcParamData%PhiL_T) + UB(1:2) = ubound(SrcParamData%PhiL_T) + if (.not. allocated(DstParamData%PhiL_T)) then + allocate(DstParamData%PhiL_T(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NodesDOF.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PhiL_T.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call SD_CopyIList(SrcParamData%NodesDOF(i1), DstParamData%NodesDOF(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%PhiL_T = SrcParamData%PhiL_T end if - if (allocated(SrcParamData%NodesDOFred)) then - LB(1:1) = lbound(SrcParamData%NodesDOFred) - UB(1:1) = ubound(SrcParamData%NodesDOFred) - if (.not. allocated(DstParamData%NodesDOFred)) then - allocate(DstParamData%NodesDOFred(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%PhiLInvOmgL2)) then + LB(1:2) = lbound(SrcParamData%PhiLInvOmgL2) + UB(1:2) = ubound(SrcParamData%PhiLInvOmgL2) + if (.not. allocated(DstParamData%PhiLInvOmgL2)) then + allocate(DstParamData%PhiLInvOmgL2(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%NodesDOFred.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PhiLInvOmgL2.', ErrStat, ErrMsg, RoutineName) return end if end if - do i1 = LB(1), UB(1) - call SD_CopyIList(SrcParamData%NodesDOFred(i1), DstParamData%NodesDOFred(i1), CtrlCode, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return - end do + DstParamData%PhiLInvOmgL2 = SrcParamData%PhiLInvOmgL2 end if - if (allocated(SrcParamData%ElemsDOF)) then - LB(1:2) = lbound(SrcParamData%ElemsDOF) - UB(1:2) = ubound(SrcParamData%ElemsDOF) - if (.not. allocated(DstParamData%ElemsDOF)) then - allocate(DstParamData%ElemsDOF(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%KLLm1)) then + LB(1:2) = lbound(SrcParamData%KLLm1) + UB(1:2) = ubound(SrcParamData%KLLm1) + if (.not. allocated(DstParamData%KLLm1)) then + allocate(DstParamData%KLLm1(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%ElemsDOF.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%KLLm1.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%ElemsDOF = SrcParamData%ElemsDOF + DstParamData%KLLm1 = SrcParamData%KLLm1 end if - if (allocated(SrcParamData%DOFred2Nodes)) then - LB(1:2) = lbound(SrcParamData%DOFred2Nodes) - UB(1:2) = ubound(SrcParamData%DOFred2Nodes) - if (.not. allocated(DstParamData%DOFred2Nodes)) then - allocate(DstParamData%DOFred2Nodes(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%TI)) then + LB(1:2) = lbound(SrcParamData%TI) + UB(1:2) = ubound(SrcParamData%TI) + if (.not. allocated(DstParamData%TI)) then + allocate(DstParamData%TI(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%DOFred2Nodes.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TI.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%DOFred2Nodes = SrcParamData%DOFred2Nodes + DstParamData%TI = SrcParamData%TI end if - if (allocated(SrcParamData%CtrlElem2Channel)) then - LB(1:2) = lbound(SrcParamData%CtrlElem2Channel) - UB(1:2) = ubound(SrcParamData%CtrlElem2Channel) - if (.not. allocated(DstParamData%CtrlElem2Channel)) then - allocate(DstParamData%CtrlElem2Channel(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%TIreact)) then + LB(1:2) = lbound(SrcParamData%TIreact) + UB(1:2) = ubound(SrcParamData%TIreact) + if (.not. allocated(DstParamData%TIreact)) then + allocate(DstParamData%TIreact(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CtrlElem2Channel.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TIreact.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%CtrlElem2Channel = SrcParamData%CtrlElem2Channel + DstParamData%TIreact = SrcParamData%TIreact end if - DstParamData%nDOFM = SrcParamData%nDOFM - DstParamData%SttcSolve = SrcParamData%SttcSolve - DstParamData%GuyanLoadCorrection = SrcParamData%GuyanLoadCorrection - DstParamData%Floating = SrcParamData%Floating - if (allocated(SrcParamData%KMMDiag)) then - LB(1:1) = lbound(SrcParamData%KMMDiag) - UB(1:1) = ubound(SrcParamData%KMMDiag) - if (.not. allocated(DstParamData%KMMDiag)) then - allocate(DstParamData%KMMDiag(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%GMat)) then + LB(1:2) = lbound(SrcParamData%GMat) + UB(1:2) = ubound(SrcParamData%GMat) + if (.not. allocated(DstParamData%GMat)) then + allocate(DstParamData%GMat(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%KMMDiag.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%GMat.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%KMMDiag = SrcParamData%KMMDiag + DstParamData%GMat = SrcParamData%GMat end if - if (allocated(SrcParamData%CMMDiag)) then - LB(1:1) = lbound(SrcParamData%CMMDiag) - UB(1:1) = ubound(SrcParamData%CMMDiag) - if (.not. allocated(DstParamData%CMMDiag)) then - allocate(DstParamData%CMMDiag(LB(1):UB(1)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_LHS)) then + LB(1:2) = lbound(SrcParamData%EOM_LHS) + UB(1:2) = ubound(SrcParamData%EOM_LHS) + if (.not. allocated(DstParamData%EOM_LHS)) then + allocate(DstParamData%EOM_LHS(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMMDiag.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_LHS.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%CMMDiag = SrcParamData%CMMDiag + DstParamData%EOM_LHS = SrcParamData%EOM_LHS end if - if (allocated(SrcParamData%MMB)) then - LB(1:2) = lbound(SrcParamData%MMB) - UB(1:2) = ubound(SrcParamData%MMB) - if (.not. allocated(DstParamData%MMB)) then - allocate(DstParamData%MMB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_LHS1)) then + LB(1:2) = lbound(SrcParamData%EOM_LHS1) + UB(1:2) = ubound(SrcParamData%EOM_LHS1) + if (.not. allocated(DstParamData%EOM_LHS1)) then + allocate(DstParamData%EOM_LHS1(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MMB.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_LHS1.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%MMB = SrcParamData%MMB + DstParamData%EOM_LHS1 = SrcParamData%EOM_LHS1 end if - if (allocated(SrcParamData%MBmmB)) then - LB(1:2) = lbound(SrcParamData%MBmmB) - UB(1:2) = ubound(SrcParamData%MBmmB) - if (.not. allocated(DstParamData%MBmmB)) then - allocate(DstParamData%MBmmB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_RHS1_1)) then + LB(1:2) = lbound(SrcParamData%EOM_RHS1_1) + UB(1:2) = ubound(SrcParamData%EOM_RHS1_1) + if (.not. allocated(DstParamData%EOM_RHS1_1)) then + allocate(DstParamData%EOM_RHS1_1(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MBmmB.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_RHS1_1.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%MBmmB = SrcParamData%MBmmB + DstParamData%EOM_RHS1_1 = SrcParamData%EOM_RHS1_1 end if - if (allocated(SrcParamData%C1_11)) then - LB(1:2) = lbound(SrcParamData%C1_11) - UB(1:2) = ubound(SrcParamData%C1_11) - if (.not. allocated(DstParamData%C1_11)) then - allocate(DstParamData%C1_11(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_RHS1_2)) then + LB(1:2) = lbound(SrcParamData%EOM_RHS1_2) + UB(1:2) = ubound(SrcParamData%EOM_RHS1_2) + if (.not. allocated(DstParamData%EOM_RHS1_2)) then + allocate(DstParamData%EOM_RHS1_2(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C1_11.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_RHS1_2.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%C1_11 = SrcParamData%C1_11 + DstParamData%EOM_RHS1_2 = SrcParamData%EOM_RHS1_2 end if - if (allocated(SrcParamData%C1_12)) then - LB(1:2) = lbound(SrcParamData%C1_12) - UB(1:2) = ubound(SrcParamData%C1_12) - if (.not. allocated(DstParamData%C1_12)) then - allocate(DstParamData%C1_12(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_RHS1_3)) then + LB(1:2) = lbound(SrcParamData%EOM_RHS1_3) + UB(1:2) = ubound(SrcParamData%EOM_RHS1_3) + if (.not. allocated(DstParamData%EOM_RHS1_3)) then + allocate(DstParamData%EOM_RHS1_3(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C1_12.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_RHS1_3.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%C1_12 = SrcParamData%C1_12 + DstParamData%EOM_RHS1_3 = SrcParamData%EOM_RHS1_3 end if - if (allocated(SrcParamData%D1_141)) then - LB(1:2) = lbound(SrcParamData%D1_141) - UB(1:2) = ubound(SrcParamData%D1_141) - if (.not. allocated(DstParamData%D1_141)) then - allocate(DstParamData%D1_141(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_RHS1_4)) then + LB(1:2) = lbound(SrcParamData%EOM_RHS1_4) + UB(1:2) = ubound(SrcParamData%EOM_RHS1_4) + if (.not. allocated(DstParamData%EOM_RHS1_4)) then + allocate(DstParamData%EOM_RHS1_4(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D1_141.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_RHS1_4.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%D1_141 = SrcParamData%D1_141 + DstParamData%EOM_RHS1_4 = SrcParamData%EOM_RHS1_4 end if - if (allocated(SrcParamData%D1_142)) then - LB(1:2) = lbound(SrcParamData%D1_142) - UB(1:2) = ubound(SrcParamData%D1_142) - if (.not. allocated(DstParamData%D1_142)) then - allocate(DstParamData%D1_142(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_RHS1_5)) then + LB(1:2) = lbound(SrcParamData%EOM_RHS1_5) + UB(1:2) = ubound(SrcParamData%EOM_RHS1_5) + if (.not. allocated(DstParamData%EOM_RHS1_5)) then + allocate(DstParamData%EOM_RHS1_5(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D1_142.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_RHS1_5.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%D1_142 = SrcParamData%D1_142 + DstParamData%EOM_RHS1_5 = SrcParamData%EOM_RHS1_5 end if - if (allocated(SrcParamData%PhiM)) then - LB(1:2) = lbound(SrcParamData%PhiM) - UB(1:2) = ubound(SrcParamData%PhiM) - if (.not. allocated(DstParamData%PhiM)) then - allocate(DstParamData%PhiM(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_RHS1_6)) then + LB(1:2) = lbound(SrcParamData%EOM_RHS1_6) + UB(1:2) = ubound(SrcParamData%EOM_RHS1_6) + if (.not. allocated(DstParamData%EOM_RHS1_6)) then + allocate(DstParamData%EOM_RHS1_6(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PhiM.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_RHS1_6.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%PhiM = SrcParamData%PhiM + DstParamData%EOM_RHS1_6 = SrcParamData%EOM_RHS1_6 end if - if (allocated(SrcParamData%C2_61)) then - LB(1:2) = lbound(SrcParamData%C2_61) - UB(1:2) = ubound(SrcParamData%C2_61) - if (.not. allocated(DstParamData%C2_61)) then - allocate(DstParamData%C2_61(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C2_61.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%C2_61 = SrcParamData%C2_61 - end if - if (allocated(SrcParamData%C2_62)) then - LB(1:2) = lbound(SrcParamData%C2_62) - UB(1:2) = ubound(SrcParamData%C2_62) - if (.not. allocated(DstParamData%C2_62)) then - allocate(DstParamData%C2_62(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%C2_62.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%C2_62 = SrcParamData%C2_62 - end if - if (allocated(SrcParamData%PhiRb_TI)) then - LB(1:2) = lbound(SrcParamData%PhiRb_TI) - UB(1:2) = ubound(SrcParamData%PhiRb_TI) - if (.not. allocated(DstParamData%PhiRb_TI)) then - allocate(DstParamData%PhiRb_TI(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PhiRb_TI.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%PhiRb_TI = SrcParamData%PhiRb_TI - end if - if (allocated(SrcParamData%D2_63)) then - LB(1:2) = lbound(SrcParamData%D2_63) - UB(1:2) = ubound(SrcParamData%D2_63) - if (.not. allocated(DstParamData%D2_63)) then - allocate(DstParamData%D2_63(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D2_63.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%D2_63 = SrcParamData%D2_63 - end if - if (allocated(SrcParamData%D2_64)) then - LB(1:2) = lbound(SrcParamData%D2_64) - UB(1:2) = ubound(SrcParamData%D2_64) - if (.not. allocated(DstParamData%D2_64)) then - allocate(DstParamData%D2_64(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%D2_64.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%D2_64 = SrcParamData%D2_64 - end if - if (allocated(SrcParamData%MBB)) then - LB(1:2) = lbound(SrcParamData%MBB) - UB(1:2) = ubound(SrcParamData%MBB) - if (.not. allocated(DstParamData%MBB)) then - allocate(DstParamData%MBB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MBB.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%MBB = SrcParamData%MBB - end if - if (allocated(SrcParamData%KBB)) then - LB(1:2) = lbound(SrcParamData%KBB) - UB(1:2) = ubound(SrcParamData%KBB) - if (.not. allocated(DstParamData%KBB)) then - allocate(DstParamData%KBB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%KBB.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%KBB = SrcParamData%KBB - end if - if (allocated(SrcParamData%CBB)) then - LB(1:2) = lbound(SrcParamData%CBB) - UB(1:2) = ubound(SrcParamData%CBB) - if (.not. allocated(DstParamData%CBB)) then - allocate(DstParamData%CBB(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CBB.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%CBB = SrcParamData%CBB - end if - if (allocated(SrcParamData%CMM)) then - LB(1:2) = lbound(SrcParamData%CMM) - UB(1:2) = ubound(SrcParamData%CMM) - if (.not. allocated(DstParamData%CMM)) then - allocate(DstParamData%CMM(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%CMM.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%CMM = SrcParamData%CMM - end if - if (allocated(SrcParamData%MBM)) then - LB(1:2) = lbound(SrcParamData%MBM) - UB(1:2) = ubound(SrcParamData%MBM) - if (.not. allocated(DstParamData%MBM)) then - allocate(DstParamData%MBM(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%MBM.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%MBM = SrcParamData%MBM - end if - if (allocated(SrcParamData%PhiL_T)) then - LB(1:2) = lbound(SrcParamData%PhiL_T) - UB(1:2) = ubound(SrcParamData%PhiL_T) - if (.not. allocated(DstParamData%PhiL_T)) then - allocate(DstParamData%PhiL_T(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PhiL_T.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%PhiL_T = SrcParamData%PhiL_T - end if - if (allocated(SrcParamData%PhiLInvOmgL2)) then - LB(1:2) = lbound(SrcParamData%PhiLInvOmgL2) - UB(1:2) = ubound(SrcParamData%PhiLInvOmgL2) - if (.not. allocated(DstParamData%PhiLInvOmgL2)) then - allocate(DstParamData%PhiLInvOmgL2(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%PhiLInvOmgL2.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%PhiLInvOmgL2 = SrcParamData%PhiLInvOmgL2 - end if - if (allocated(SrcParamData%KLLm1)) then - LB(1:2) = lbound(SrcParamData%KLLm1) - UB(1:2) = ubound(SrcParamData%KLLm1) - if (.not. allocated(DstParamData%KLLm1)) then - allocate(DstParamData%KLLm1(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%KLLm1.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%KLLm1 = SrcParamData%KLLm1 - end if - if (allocated(SrcParamData%AM2Jac)) then - LB(1:2) = lbound(SrcParamData%AM2Jac) - UB(1:2) = ubound(SrcParamData%AM2Jac) - if (.not. allocated(DstParamData%AM2Jac)) then - allocate(DstParamData%AM2Jac(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_RHS2_1)) then + LB(1:2) = lbound(SrcParamData%EOM_RHS2_1) + UB(1:2) = ubound(SrcParamData%EOM_RHS2_1) + if (.not. allocated(DstParamData%EOM_RHS2_1)) then + allocate(DstParamData%EOM_RHS2_1(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AM2Jac.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_RHS2_1.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%AM2Jac = SrcParamData%AM2Jac + DstParamData%EOM_RHS2_1 = SrcParamData%EOM_RHS2_1 end if - if (allocated(SrcParamData%AM2JacPiv)) then - LB(1:1) = lbound(SrcParamData%AM2JacPiv) - UB(1:1) = ubound(SrcParamData%AM2JacPiv) - if (.not. allocated(DstParamData%AM2JacPiv)) then - allocate(DstParamData%AM2JacPiv(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%AM2JacPiv.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%AM2JacPiv = SrcParamData%AM2JacPiv - end if - if (allocated(SrcParamData%TI)) then - LB(1:2) = lbound(SrcParamData%TI) - UB(1:2) = ubound(SrcParamData%TI) - if (.not. allocated(DstParamData%TI)) then - allocate(DstParamData%TI(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (allocated(SrcParamData%EOM_RHS3_1)) then + LB(1:2) = lbound(SrcParamData%EOM_RHS3_1) + UB(1:2) = ubound(SrcParamData%EOM_RHS3_1) + if (.not. allocated(DstParamData%EOM_RHS3_1)) then + allocate(DstParamData%EOM_RHS3_1(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TI.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%EOM_RHS3_1.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%TI = SrcParamData%TI + DstParamData%EOM_RHS3_1 = SrcParamData%EOM_RHS3_1 end if - if (allocated(SrcParamData%TIreact)) then - LB(1:2) = lbound(SrcParamData%TIreact) - UB(1:2) = ubound(SrcParamData%TIreact) - if (.not. allocated(DstParamData%TIreact)) then - allocate(DstParamData%TIreact(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + DstParamData%nTP = SrcParamData%nTP + if (allocated(SrcParamData%TPIdx)) then + LB(1:1) = lbound(SrcParamData%TPIdx) + UB(1:1) = ubound(SrcParamData%TPIdx) + if (.not. allocated(DstParamData%TPIdx)) then + allocate(DstParamData%TPIdx(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TIreact.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%TPIdx.', ErrStat, ErrMsg, RoutineName) return end if end if - DstParamData%TIreact = SrcParamData%TIreact + DstParamData%TPIdx = SrcParamData%TPIdx end if DstParamData%nNodes = SrcParamData%nNodes DstParamData%nNodes_I = SrcParamData%nNodes_I @@ -3220,6 +2890,7 @@ subroutine SD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%nDOFI_Rb = SrcParamData%nDOFI_Rb DstParamData%nDOFI_F = SrcParamData%nDOFI_F DstParamData%nDOFL_L = SrcParamData%nDOFL_L + DstParamData%nDOFL_TP = SrcParamData%nDOFL_TP DstParamData%nDOFC__ = SrcParamData%nDOFC__ DstParamData%nDOFC_Rb = SrcParamData%nDOFC_Rb DstParamData%nDOFC_L = SrcParamData%nDOFC_L @@ -3450,34 +3121,6 @@ subroutine SD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%OutAllInt = SrcParamData%OutAllInt DstParamData%OutAllDims = SrcParamData%OutAllDims DstParamData%OutDec = SrcParamData%OutDec - if (allocated(SrcParamData%Jac_u_indx)) then - LB(1:2) = lbound(SrcParamData%Jac_u_indx) - UB(1:2) = ubound(SrcParamData%Jac_u_indx) - if (.not. allocated(DstParamData%Jac_u_indx)) then - allocate(DstParamData%Jac_u_indx(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%Jac_u_indx.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%Jac_u_indx = SrcParamData%Jac_u_indx - end if - if (allocated(SrcParamData%du)) then - LB(1:1) = lbound(SrcParamData%du) - UB(1:1) = ubound(SrcParamData%du) - if (.not. allocated(DstParamData%du)) then - allocate(DstParamData%du(LB(1):UB(1)), stat=ErrStat2) - if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstParamData%du.', ErrStat, ErrMsg, RoutineName) - return - end if - end if - DstParamData%du = SrcParamData%du - end if - DstParamData%dx = SrcParamData%dx - DstParamData%Jac_ny = SrcParamData%Jac_ny - DstParamData%Jac_nx = SrcParamData%Jac_nx - DstParamData%RotStates = SrcParamData%RotStates end subroutine subroutine SD_DestroyParam(ParamData, ErrStat, ErrMsg) @@ -3491,6 +3134,8 @@ subroutine SD_DestroyParam(ParamData, ErrStat, ErrMsg) character(*), parameter :: RoutineName = 'SD_DestroyParam' ErrStat = ErrID_None ErrMsg = '' + call NWTC_Library_DestroyModVarsType(ParamData%Vars, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(ParamData%Elems)) then deallocate(ParamData%Elems) end if @@ -3518,6 +3163,9 @@ subroutine SD_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%rPG)) then deallocate(ParamData%rPG) end if + if (allocated(ParamData%rTP0)) then + deallocate(ParamData%rTP0) + end if if (allocated(ParamData%NodeID2JointID)) then deallocate(ParamData%NodeID2JointID) end if @@ -3629,18 +3277,48 @@ subroutine SD_DestroyParam(ParamData, ErrStat, ErrMsg) if (allocated(ParamData%KLLm1)) then deallocate(ParamData%KLLm1) end if - if (allocated(ParamData%AM2Jac)) then - deallocate(ParamData%AM2Jac) - end if - if (allocated(ParamData%AM2JacPiv)) then - deallocate(ParamData%AM2JacPiv) - end if if (allocated(ParamData%TI)) then deallocate(ParamData%TI) end if if (allocated(ParamData%TIreact)) then deallocate(ParamData%TIreact) end if + if (allocated(ParamData%GMat)) then + deallocate(ParamData%GMat) + end if + if (allocated(ParamData%EOM_LHS)) then + deallocate(ParamData%EOM_LHS) + end if + if (allocated(ParamData%EOM_LHS1)) then + deallocate(ParamData%EOM_LHS1) + end if + if (allocated(ParamData%EOM_RHS1_1)) then + deallocate(ParamData%EOM_RHS1_1) + end if + if (allocated(ParamData%EOM_RHS1_2)) then + deallocate(ParamData%EOM_RHS1_2) + end if + if (allocated(ParamData%EOM_RHS1_3)) then + deallocate(ParamData%EOM_RHS1_3) + end if + if (allocated(ParamData%EOM_RHS1_4)) then + deallocate(ParamData%EOM_RHS1_4) + end if + if (allocated(ParamData%EOM_RHS1_5)) then + deallocate(ParamData%EOM_RHS1_5) + end if + if (allocated(ParamData%EOM_RHS1_6)) then + deallocate(ParamData%EOM_RHS1_6) + end if + if (allocated(ParamData%EOM_RHS2_1)) then + deallocate(ParamData%EOM_RHS2_1) + end if + if (allocated(ParamData%EOM_RHS3_1)) then + deallocate(ParamData%EOM_RHS3_1) + end if + if (allocated(ParamData%TPIdx)) then + deallocate(ParamData%TPIdx) + end if if (allocated(ParamData%Nodes_I)) then deallocate(ParamData%Nodes_I) end if @@ -3722,12 +3400,6 @@ subroutine SD_DestroyParam(ParamData, ErrStat, ErrMsg) end do deallocate(ParamData%OutParam) end if - if (allocated(ParamData%Jac_u_indx)) then - deallocate(ParamData%Jac_u_indx) - end if - if (allocated(ParamData%du)) then - deallocate(ParamData%du) - end if end subroutine subroutine SD_PackParam(RF, Indata) @@ -3737,6 +3409,7 @@ subroutine SD_PackParam(RF, Indata) integer(B4Ki) :: i1, i2 integer(B4Ki) :: LB(2), UB(2) if (RF%ErrStat >= AbortErrLev) return + call NWTC_Library_PackModVarsType(RF, InData%Vars) call RegPack(RF, InData%g) call RegPack(RF, InData%SDDeltaT) call RegPack(RF, InData%IntMethod) @@ -3758,6 +3431,7 @@ subroutine SD_PackParam(RF, Indata) call RegPackAlloc(RF, InData%FG) call RegPackAlloc(RF, InData%DP0) call RegPackAlloc(RF, InData%rPG) + call RegPackAlloc(RF, InData%rTP0) call RegPackAlloc(RF, InData%NodeID2JointID) call RegPackAlloc(RF, InData%CMassNode) call RegPackAlloc(RF, InData%CMassWeight) @@ -3786,9 +3460,11 @@ subroutine SD_PackParam(RF, Indata) call RegPackAlloc(RF, InData%ElemsDOF) call RegPackAlloc(RF, InData%DOFred2Nodes) call RegPackAlloc(RF, InData%CtrlElem2Channel) + call RegPack(RF, InData%RBRefPt) + call RegPack(RF, InData%TP1IsRBRefPt) call RegPack(RF, InData%nDOFM) + call RegPack(RF, InData%nDOFRB) call RegPack(RF, InData%SttcSolve) - call RegPack(RF, InData%GuyanLoadCorrection) call RegPack(RF, InData%Floating) call RegPackAlloc(RF, InData%KMMDiag) call RegPackAlloc(RF, InData%CMMDiag) @@ -3812,10 +3488,21 @@ subroutine SD_PackParam(RF, Indata) call RegPackAlloc(RF, InData%PhiL_T) call RegPackAlloc(RF, InData%PhiLInvOmgL2) call RegPackAlloc(RF, InData%KLLm1) - call RegPackAlloc(RF, InData%AM2Jac) - call RegPackAlloc(RF, InData%AM2JacPiv) call RegPackAlloc(RF, InData%TI) call RegPackAlloc(RF, InData%TIreact) + call RegPackAlloc(RF, InData%GMat) + call RegPackAlloc(RF, InData%EOM_LHS) + call RegPackAlloc(RF, InData%EOM_LHS1) + call RegPackAlloc(RF, InData%EOM_RHS1_1) + call RegPackAlloc(RF, InData%EOM_RHS1_2) + call RegPackAlloc(RF, InData%EOM_RHS1_3) + call RegPackAlloc(RF, InData%EOM_RHS1_4) + call RegPackAlloc(RF, InData%EOM_RHS1_5) + call RegPackAlloc(RF, InData%EOM_RHS1_6) + call RegPackAlloc(RF, InData%EOM_RHS2_1) + call RegPackAlloc(RF, InData%EOM_RHS3_1) + call RegPack(RF, InData%nTP) + call RegPackAlloc(RF, InData%TPIdx) call RegPack(RF, InData%nNodes) call RegPack(RF, InData%nNodes_I) call RegPack(RF, InData%nNodes_L) @@ -3827,6 +3514,7 @@ subroutine SD_PackParam(RF, Indata) call RegPack(RF, InData%nDOFI_Rb) call RegPack(RF, InData%nDOFI_F) call RegPack(RF, InData%nDOFL_L) + call RegPack(RF, InData%nDOFL_TP) call RegPack(RF, InData%nDOFC__) call RegPack(RF, InData%nDOFC_Rb) call RegPack(RF, InData%nDOFC_L) @@ -3897,12 +3585,6 @@ subroutine SD_PackParam(RF, Indata) call RegPack(RF, InData%OutAllInt) call RegPack(RF, InData%OutAllDims) call RegPack(RF, InData%OutDec) - call RegPackAlloc(RF, InData%Jac_u_indx) - call RegPackAlloc(RF, InData%du) - call RegPack(RF, InData%dx) - call RegPack(RF, InData%Jac_ny) - call RegPack(RF, InData%Jac_nx) - call RegPack(RF, InData%RotStates) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -3915,6 +3597,7 @@ subroutine SD_UnPackParam(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call NWTC_Library_UnpackModVarsType(RF, OutData%Vars) ! Vars call RegUnpack(RF, OutData%g); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SDDeltaT); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%IntMethod); if (RegCheckErr(RF, RoutineName)) return @@ -3940,6 +3623,7 @@ subroutine SD_UnPackParam(RF, OutData) call RegUnpackAlloc(RF, OutData%FG); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%DP0); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%rPG); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%rTP0); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%NodeID2JointID); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%CMassNode); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%CMassWeight); if (RegCheckErr(RF, RoutineName)) return @@ -3976,9 +3660,11 @@ subroutine SD_UnPackParam(RF, OutData) call RegUnpackAlloc(RF, OutData%ElemsDOF); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%DOFred2Nodes); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%CtrlElem2Channel); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RBRefPt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%TP1IsRBRefPt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nDOFM); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nDOFRB); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%SttcSolve); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%GuyanLoadCorrection); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Floating); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%KMMDiag); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%CMMDiag); if (RegCheckErr(RF, RoutineName)) return @@ -4002,10 +3688,21 @@ subroutine SD_UnPackParam(RF, OutData) call RegUnpackAlloc(RF, OutData%PhiL_T); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%PhiLInvOmgL2); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%KLLm1); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AM2Jac); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%AM2JacPiv); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%TI); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%TIreact); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%GMat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_LHS); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_LHS1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_RHS1_1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_RHS1_2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_RHS1_3); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_RHS1_4); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_RHS1_5); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_RHS1_6); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_RHS2_1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%EOM_RHS3_1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nTP); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%TPIdx); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nNodes); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nNodes_I); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nNodes_L); if (RegCheckErr(RF, RoutineName)) return @@ -4017,6 +3714,7 @@ subroutine SD_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%nDOFI_Rb); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nDOFI_F); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nDOFL_L); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%nDOFL_TP); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nDOFC__); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nDOFC_Rb); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nDOFC_L); if (RegCheckErr(RF, RoutineName)) return @@ -4103,12 +3801,6 @@ subroutine SD_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%OutAllInt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%OutAllDims); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%OutDec); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%Jac_u_indx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpackAlloc(RF, OutData%du); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%dx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_ny); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%Jac_nx); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%RotStates); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine SD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) @@ -4117,15 +3809,29 @@ subroutine SD_CopyInput(SrcInputData, DstInputData, CtrlCode, ErrStat, ErrMsg) integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'SD_CopyInput' ErrStat = ErrID_None ErrMsg = '' - call MeshCopy(SrcInputData%TPMesh, DstInputData%TPMesh, CtrlCode, ErrStat2, ErrMsg2 ) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (ErrStat >= AbortErrLev) return + if (allocated(SrcInputData%TPMesh)) then + LB(1:1) = lbound(SrcInputData%TPMesh) + UB(1:1) = ubound(SrcInputData%TPMesh) + if (.not. allocated(DstInputData%TPMesh)) then + allocate(DstInputData%TPMesh(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstInputData%TPMesh.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MeshCopy(SrcInputData%TPMesh(i1), DstInputData%TPMesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if call MeshCopy(SrcInputData%LMesh, DstInputData%LMesh, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -4147,13 +3853,22 @@ subroutine SD_DestroyInput(InputData, ErrStat, ErrMsg) type(SD_InputType), intent(inout) :: InputData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'SD_DestroyInput' ErrStat = ErrID_None ErrMsg = '' - call MeshDestroy( InputData%TPMesh, ErrStat2, ErrMsg2) - call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(InputData%TPMesh)) then + LB(1:1) = lbound(InputData%TPMesh) + UB(1:1) = ubound(InputData%TPMesh) + do i1 = LB(1), UB(1) + call MeshDestroy( InputData%TPMesh(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(InputData%TPMesh) + end if call MeshDestroy( InputData%LMesh, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (allocated(InputData%CableDeltaL)) then @@ -4165,8 +3880,18 @@ subroutine SD_PackInput(RF, Indata) type(RegFile), intent(inout) :: RF type(SD_InputType), intent(in) :: InData character(*), parameter :: RoutineName = 'SD_PackInput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) if (RF%ErrStat >= AbortErrLev) return - call MeshPack(RF, InData%TPMesh) + call RegPack(RF, allocated(InData%TPMesh)) + if (allocated(InData%TPMesh)) then + call RegPackBounds(RF, 1, lbound(InData%TPMesh), ubound(InData%TPMesh)) + LB(1:1) = lbound(InData%TPMesh) + UB(1:1) = ubound(InData%TPMesh) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%TPMesh(i1)) + end do + end if call MeshPack(RF, InData%LMesh) call RegPackAlloc(RF, InData%CableDeltaL) if (RegCheckErr(RF, RoutineName)) return @@ -4176,11 +3901,24 @@ subroutine SD_UnPackInput(RF, OutData) type(RegFile), intent(inout) :: RF type(SD_InputType), intent(inout) :: OutData character(*), parameter :: RoutineName = 'SD_UnPackInput' + integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call MeshUnpack(RF, OutData%TPMesh) ! TPMesh + if (allocated(OutData%TPMesh)) deallocate(OutData%TPMesh) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%TPMesh(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%TPMesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%TPMesh(i1)) ! TPMesh + end do + end if call MeshUnpack(RF, OutData%LMesh) ! LMesh call RegUnpackAlloc(RF, OutData%CableDeltaL); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -4191,15 +3929,32 @@ subroutine SD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg integer(IntKi), intent(in ) :: CtrlCode integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 integer(B4Ki) :: LB(1), UB(1) integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'SD_CopyOutput' ErrStat = ErrID_None ErrMsg = '' - call MeshCopy(SrcOutputData%Y1Mesh, DstOutputData%Y1Mesh, CtrlCode, ErrStat2, ErrMsg2 ) + call MeshCopy(SrcOutputData%Y0Mesh, DstOutputData%Y0Mesh, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + if (allocated(SrcOutputData%Y1Mesh)) then + LB(1:1) = lbound(SrcOutputData%Y1Mesh) + UB(1:1) = ubound(SrcOutputData%Y1Mesh) + if (.not. allocated(DstOutputData%Y1Mesh)) then + allocate(DstOutputData%Y1Mesh(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%Y1Mesh.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + do i1 = LB(1), UB(1) + call MeshCopy(SrcOutputData%Y1Mesh(i1), DstOutputData%Y1Mesh(i1), CtrlCode, ErrStat2, ErrMsg2 ) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + end do + end if call MeshCopy(SrcOutputData%Y2Mesh, DstOutputData%Y2Mesh, CtrlCode, ErrStat2, ErrMsg2 ) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return @@ -4212,58 +3967,807 @@ subroutine SD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg if (.not. allocated(DstOutputData%WriteOutput)) then allocate(DstOutputData%WriteOutput(LB(1):UB(1)), stat=ErrStat2) if (ErrStat2 /= 0) then - call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg, RoutineName) + call SetErrStat(ErrID_Fatal, 'Error allocating DstOutputData%WriteOutput.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstOutputData%WriteOutput = SrcOutputData%WriteOutput + end if +end subroutine + +subroutine SD_DestroyOutput(OutputData, ErrStat, ErrMsg) + type(SD_OutputType), intent(inout) :: OutputData + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SD_DestroyOutput' + ErrStat = ErrID_None + ErrMsg = '' + call MeshDestroy( OutputData%Y0Mesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(OutputData%Y1Mesh)) then + LB(1:1) = lbound(OutputData%Y1Mesh) + UB(1:1) = ubound(OutputData%Y1Mesh) + do i1 = LB(1), UB(1) + call MeshDestroy( OutputData%Y1Mesh(i1), ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + end do + deallocate(OutputData%Y1Mesh) + end if + call MeshDestroy( OutputData%Y2Mesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call MeshDestroy( OutputData%Y3Mesh, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(OutputData%WriteOutput)) then + deallocate(OutputData%WriteOutput) + end if +end subroutine + +subroutine SD_PackOutput(RF, Indata) + type(RegFile), intent(inout) :: RF + type(SD_OutputType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SD_PackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + if (RF%ErrStat >= AbortErrLev) return + call MeshPack(RF, InData%Y0Mesh) + call RegPack(RF, allocated(InData%Y1Mesh)) + if (allocated(InData%Y1Mesh)) then + call RegPackBounds(RF, 1, lbound(InData%Y1Mesh), ubound(InData%Y1Mesh)) + LB(1:1) = lbound(InData%Y1Mesh) + UB(1:1) = ubound(InData%Y1Mesh) + do i1 = LB(1), UB(1) + call MeshPack(RF, InData%Y1Mesh(i1)) + end do + end if + call MeshPack(RF, InData%Y2Mesh) + call MeshPack(RF, InData%Y3Mesh) + call RegPackAlloc(RF, InData%WriteOutput) + if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SD_UnPackOutput(RF, OutData) + type(RegFile), intent(inout) :: RF + type(SD_OutputType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SD_UnPackOutput' + integer(B4Ki) :: i1 + integer(B4Ki) :: LB(1), UB(1) + integer(IntKi) :: stat + logical :: IsAllocAssoc + if (RF%ErrStat /= ErrID_None) return + call MeshUnpack(RF, OutData%Y0Mesh) ! Y0Mesh + if (allocated(OutData%Y1Mesh)) deallocate(OutData%Y1Mesh) + call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return + if (IsAllocAssoc) then + call RegUnpackBounds(RF, 1, LB, UB); if (RegCheckErr(RF, RoutineName)) return + allocate(OutData%Y1Mesh(LB(1):UB(1)),stat=stat) + if (stat /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating OutData%Y1Mesh.', RF%ErrStat, RF%ErrMsg, RoutineName) + return + end if + do i1 = LB(1), UB(1) + call MeshUnpack(RF, OutData%Y1Mesh(i1)) ! Y1Mesh + end do + end if + call MeshUnpack(RF, OutData%Y2Mesh) ! Y2Mesh + call MeshUnpack(RF, OutData%Y3Mesh) ! Y3Mesh + call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return +end subroutine + +subroutine SD_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) + type(SD_MiscVarType), intent(inout) :: SrcMiscData + type(SD_MiscVarType), intent(inout) :: DstMiscData + integer(IntKi), intent(in ) :: CtrlCode + integer(IntKi), intent( out) :: ErrStat + character(*), intent( out) :: ErrMsg + integer(B4Ki) :: LB(2), UB(2) + integer(IntKi) :: ErrStat2 + character(ErrMsgLen) :: ErrMsg2 + character(*), parameter :: RoutineName = 'SD_CopyMisc' + ErrStat = ErrID_None + ErrMsg = '' + call NWTC_Library_CopyModJacType(SrcMiscData%Jac, DstMiscData%Jac, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SD_CopyContState(SrcMiscData%x_perturb, DstMiscData%x_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SD_CopyContState(SrcMiscData%dxdt_lin, DstMiscData%dxdt_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SD_CopyInput(SrcMiscData%u_perturb, DstMiscData%u_perturb, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + call SD_CopyOutput(SrcMiscData%y_lin, DstMiscData%y_lin, CtrlCode, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (ErrStat >= AbortErrLev) return + if (allocated(SrcMiscData%AM2Jac)) then + LB(1:2) = lbound(SrcMiscData%AM2Jac) + UB(1:2) = ubound(SrcMiscData%AM2Jac) + if (.not. allocated(DstMiscData%AM2Jac)) then + allocate(DstMiscData%AM2Jac(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AM2Jac.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AM2Jac = SrcMiscData%AM2Jac + end if + if (allocated(SrcMiscData%AM2xq)) then + LB(1:2) = lbound(SrcMiscData%AM2xq) + UB(1:2) = ubound(SrcMiscData%AM2xq) + if (.not. allocated(DstMiscData%AM2xq)) then + allocate(DstMiscData%AM2xq(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AM2xq.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AM2xq = SrcMiscData%AM2xq + end if + if (allocated(SrcMiscData%AM2xq2)) then + LB(1:2) = lbound(SrcMiscData%AM2xq2) + UB(1:2) = ubound(SrcMiscData%AM2xq2) + if (.not. allocated(DstMiscData%AM2xq2)) then + allocate(DstMiscData%AM2xq2(LB(1):UB(1),LB(2):UB(2)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AM2xq2.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AM2xq2 = SrcMiscData%AM2xq2 + end if + if (allocated(SrcMiscData%qmdotdot)) then + LB(1:1) = lbound(SrcMiscData%qmdotdot) + UB(1:1) = ubound(SrcMiscData%qmdotdot) + if (.not. allocated(DstMiscData%qmdotdot)) then + allocate(DstMiscData%qmdotdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%qmdotdot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%qmdotdot = SrcMiscData%qmdotdot + end if + if (allocated(SrcMiscData%qRdotdot)) then + LB(1:1) = lbound(SrcMiscData%qRdotdot) + UB(1:1) = ubound(SrcMiscData%qRdotdot) + if (.not. allocated(DstMiscData%qRdotdot)) then + allocate(DstMiscData%qRdotdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%qRdotdot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%qRdotdot = SrcMiscData%qRdotdot + end if + if (allocated(SrcMiscData%F_TP)) then + LB(1:1) = lbound(SrcMiscData%F_TP) + UB(1:1) = ubound(SrcMiscData%F_TP) + if (.not. allocated(DstMiscData%F_TP)) then + allocate(DstMiscData%F_TP(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_TP.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%F_TP = SrcMiscData%F_TP + end if + if (allocated(SrcMiscData%u_TP)) then + LB(1:1) = lbound(SrcMiscData%u_TP) + UB(1:1) = ubound(SrcMiscData%u_TP) + if (.not. allocated(DstMiscData%u_TP)) then + allocate(DstMiscData%u_TP(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%u_TP.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%u_TP = SrcMiscData%u_TP + end if + if (allocated(SrcMiscData%udot_TP)) then + LB(1:1) = lbound(SrcMiscData%udot_TP) + UB(1:1) = ubound(SrcMiscData%udot_TP) + if (.not. allocated(DstMiscData%udot_TP)) then + allocate(DstMiscData%udot_TP(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%udot_TP.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%udot_TP = SrcMiscData%udot_TP + end if + if (allocated(SrcMiscData%udotdot_TP)) then + LB(1:1) = lbound(SrcMiscData%udotdot_TP) + UB(1:1) = ubound(SrcMiscData%udotdot_TP) + if (.not. allocated(DstMiscData%udotdot_TP)) then + allocate(DstMiscData%udotdot_TP(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%udotdot_TP.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%udotdot_TP = SrcMiscData%udotdot_TP + end if + if (allocated(SrcMiscData%Y1)) then + LB(1:1) = lbound(SrcMiscData%Y1) + UB(1:1) = ubound(SrcMiscData%Y1) + if (.not. allocated(DstMiscData%Y1)) then + allocate(DstMiscData%Y1(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Y1.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%Y1 = SrcMiscData%Y1 + end if + if (allocated(SrcMiscData%Y1_Guy_R)) then + LB(1:1) = lbound(SrcMiscData%Y1_Guy_R) + UB(1:1) = ubound(SrcMiscData%Y1_Guy_R) + if (.not. allocated(DstMiscData%Y1_Guy_R)) then + allocate(DstMiscData%Y1_Guy_R(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Y1_Guy_R.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%Y1_Guy_R = SrcMiscData%Y1_Guy_R + end if + if (allocated(SrcMiscData%Y1_Guy_L)) then + LB(1:1) = lbound(SrcMiscData%Y1_Guy_L) + UB(1:1) = ubound(SrcMiscData%Y1_Guy_L) + if (.not. allocated(DstMiscData%Y1_Guy_L)) then + allocate(DstMiscData%Y1_Guy_L(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Y1_Guy_L.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%Y1_Guy_L = SrcMiscData%Y1_Guy_L + end if + if (allocated(SrcMiscData%F_L)) then + LB(1:1) = lbound(SrcMiscData%F_L) + UB(1:1) = ubound(SrcMiscData%F_L) + if (.not. allocated(DstMiscData%F_L)) then + allocate(DstMiscData%F_L(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_L.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%F_L = SrcMiscData%F_L + end if + if (allocated(SrcMiscData%F_L2)) then + LB(1:1) = lbound(SrcMiscData%F_L2) + UB(1:1) = ubound(SrcMiscData%F_L2) + if (.not. allocated(DstMiscData%F_L2)) then + allocate(DstMiscData%F_L2(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%F_L2.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%F_L2 = SrcMiscData%F_L2 + end if + if (allocated(SrcMiscData%UR_bar)) then + LB(1:1) = lbound(SrcMiscData%UR_bar) + UB(1:1) = ubound(SrcMiscData%UR_bar) + if (.not. allocated(DstMiscData%UR_bar)) then + allocate(DstMiscData%UR_bar(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UR_bar.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%UR_bar = SrcMiscData%UR_bar + end if + if (allocated(SrcMiscData%UR_bar_dot)) then + LB(1:1) = lbound(SrcMiscData%UR_bar_dot) + UB(1:1) = ubound(SrcMiscData%UR_bar_dot) + if (.not. allocated(DstMiscData%UR_bar_dot)) then + allocate(DstMiscData%UR_bar_dot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UR_bar_dot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%UR_bar_dot = SrcMiscData%UR_bar_dot + end if + if (allocated(SrcMiscData%UR_bar_dotdot)) then + LB(1:1) = lbound(SrcMiscData%UR_bar_dotdot) + UB(1:1) = ubound(SrcMiscData%UR_bar_dotdot) + if (.not. allocated(DstMiscData%UR_bar_dotdot)) then + allocate(DstMiscData%UR_bar_dotdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UR_bar_dotdot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%UR_bar_dotdot = SrcMiscData%UR_bar_dotdot + end if + if (allocated(SrcMiscData%UL)) then + LB(1:1) = lbound(SrcMiscData%UL) + UB(1:1) = ubound(SrcMiscData%UL) + if (.not. allocated(DstMiscData%UL)) then + allocate(DstMiscData%UL(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%UL = SrcMiscData%UL + end if + if (allocated(SrcMiscData%UL_NS)) then + LB(1:1) = lbound(SrcMiscData%UL_NS) + UB(1:1) = ubound(SrcMiscData%UL_NS) + if (.not. allocated(DstMiscData%UL_NS)) then + allocate(DstMiscData%UL_NS(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_NS.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%UL_NS = SrcMiscData%UL_NS + end if + if (allocated(SrcMiscData%UL_dot)) then + LB(1:1) = lbound(SrcMiscData%UL_dot) + UB(1:1) = ubound(SrcMiscData%UL_dot) + if (.not. allocated(DstMiscData%UL_dot)) then + allocate(DstMiscData%UL_dot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_dot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%UL_dot = SrcMiscData%UL_dot + end if + if (allocated(SrcMiscData%UL_dotdot)) then + LB(1:1) = lbound(SrcMiscData%UL_dotdot) + UB(1:1) = ubound(SrcMiscData%UL_dotdot) + if (.not. allocated(DstMiscData%UL_dotdot)) then + allocate(DstMiscData%UL_dotdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_dotdot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%UL_dotdot = SrcMiscData%UL_dotdot + end if + if (allocated(SrcMiscData%DU_full)) then + LB(1:1) = lbound(SrcMiscData%DU_full) + UB(1:1) = ubound(SrcMiscData%DU_full) + if (.not. allocated(DstMiscData%DU_full)) then + allocate(DstMiscData%DU_full(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%DU_full.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%DU_full = SrcMiscData%DU_full + end if + if (allocated(SrcMiscData%U_full)) then + LB(1:1) = lbound(SrcMiscData%U_full) + UB(1:1) = ubound(SrcMiscData%U_full) + if (.not. allocated(DstMiscData%U_full)) then + allocate(DstMiscData%U_full(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%U_full = SrcMiscData%U_full + end if + if (allocated(SrcMiscData%U_full_NS)) then + LB(1:1) = lbound(SrcMiscData%U_full_NS) + UB(1:1) = ubound(SrcMiscData%U_full_NS) + if (.not. allocated(DstMiscData%U_full_NS)) then + allocate(DstMiscData%U_full_NS(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full_NS.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%U_full_NS = SrcMiscData%U_full_NS + end if + if (allocated(SrcMiscData%U_full_dot)) then + LB(1:1) = lbound(SrcMiscData%U_full_dot) + UB(1:1) = ubound(SrcMiscData%U_full_dot) + if (.not. allocated(DstMiscData%U_full_dot)) then + allocate(DstMiscData%U_full_dot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full_dot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%U_full_dot = SrcMiscData%U_full_dot + end if + if (allocated(SrcMiscData%U_full_dotdot)) then + LB(1:1) = lbound(SrcMiscData%U_full_dotdot) + UB(1:1) = ubound(SrcMiscData%U_full_dotdot) + if (.not. allocated(DstMiscData%U_full_dotdot)) then + allocate(DstMiscData%U_full_dotdot(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full_dotdot.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%U_full_dotdot = SrcMiscData%U_full_dotdot + end if + if (allocated(SrcMiscData%U_full_elast)) then + LB(1:1) = lbound(SrcMiscData%U_full_elast) + UB(1:1) = ubound(SrcMiscData%U_full_elast) + if (.not. allocated(DstMiscData%U_full_elast)) then + allocate(DstMiscData%U_full_elast(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_full_elast.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%U_full_elast = SrcMiscData%U_full_elast + end if + if (allocated(SrcMiscData%U_red)) then + LB(1:1) = lbound(SrcMiscData%U_red) + UB(1:1) = ubound(SrcMiscData%U_red) + if (.not. allocated(DstMiscData%U_red)) then + allocate(DstMiscData%U_red(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%U_red.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%U_red = SrcMiscData%U_red + end if + if (allocated(SrcMiscData%x_full)) then + LB(1:1) = lbound(SrcMiscData%x_full) + UB(1:1) = ubound(SrcMiscData%x_full) + if (.not. allocated(DstMiscData%x_full)) then + allocate(DstMiscData%x_full(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%x_full.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%x_full = SrcMiscData%x_full + end if + if (allocated(SrcMiscData%FC_unit)) then + LB(1:1) = lbound(SrcMiscData%FC_unit) + UB(1:1) = ubound(SrcMiscData%FC_unit) + if (.not. allocated(DstMiscData%FC_unit)) then + allocate(DstMiscData%FC_unit(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FC_unit.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%FC_unit = SrcMiscData%FC_unit + end if + if (allocated(SrcMiscData%SDWrOutput)) then + LB(1:1) = lbound(SrcMiscData%SDWrOutput) + UB(1:1) = ubound(SrcMiscData%SDWrOutput) + if (.not. allocated(DstMiscData%SDWrOutput)) then + allocate(DstMiscData%SDWrOutput(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%SDWrOutput.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%SDWrOutput = SrcMiscData%SDWrOutput + end if + if (allocated(SrcMiscData%AllOuts)) then + LB(1:1) = lbound(SrcMiscData%AllOuts) + UB(1:1) = ubound(SrcMiscData%AllOuts) + if (.not. allocated(DstMiscData%AllOuts)) then + allocate(DstMiscData%AllOuts(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%AllOuts.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%AllOuts = SrcMiscData%AllOuts + end if + DstMiscData%LastOutTime = SrcMiscData%LastOutTime + DstMiscData%Decimat = SrcMiscData%Decimat + if (allocated(SrcMiscData%Fext)) then + LB(1:1) = lbound(SrcMiscData%Fext) + UB(1:1) = ubound(SrcMiscData%Fext) + if (.not. allocated(DstMiscData%Fext)) then + allocate(DstMiscData%Fext(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Fext.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%Fext = SrcMiscData%Fext + end if + if (allocated(SrcMiscData%Fext_red)) then + LB(1:1) = lbound(SrcMiscData%Fext_red) + UB(1:1) = ubound(SrcMiscData%Fext_red) + if (.not. allocated(DstMiscData%Fext_red)) then + allocate(DstMiscData%Fext_red(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%Fext_red.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%Fext_red = SrcMiscData%Fext_red + end if + if (allocated(SrcMiscData%FG)) then + LB(1:1) = lbound(SrcMiscData%FG) + UB(1:1) = ubound(SrcMiscData%FG) + if (.not. allocated(DstMiscData%FG)) then + allocate(DstMiscData%FG(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%FG.', ErrStat, ErrMsg, RoutineName) return end if end if - DstOutputData%WriteOutput = SrcOutputData%WriteOutput + DstMiscData%FG = SrcMiscData%FG + end if + if (allocated(SrcMiscData%UL_SIM)) then + LB(1:1) = lbound(SrcMiscData%UL_SIM) + UB(1:1) = ubound(SrcMiscData%UL_SIM) + if (.not. allocated(DstMiscData%UL_SIM)) then + allocate(DstMiscData%UL_SIM(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_SIM.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%UL_SIM = SrcMiscData%UL_SIM + end if + if (allocated(SrcMiscData%UL_0m)) then + LB(1:1) = lbound(SrcMiscData%UL_0m) + UB(1:1) = ubound(SrcMiscData%UL_0m) + if (.not. allocated(DstMiscData%UL_0m)) then + allocate(DstMiscData%UL_0m(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstMiscData%UL_0m.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstMiscData%UL_0m = SrcMiscData%UL_0m end if end subroutine -subroutine SD_DestroyOutput(OutputData, ErrStat, ErrMsg) - type(SD_OutputType), intent(inout) :: OutputData +subroutine SD_DestroyMisc(MiscData, ErrStat, ErrMsg) + type(SD_MiscVarType), intent(inout) :: MiscData integer(IntKi), intent( out) :: ErrStat character(*), intent( out) :: ErrMsg integer(IntKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 - character(*), parameter :: RoutineName = 'SD_DestroyOutput' + character(*), parameter :: RoutineName = 'SD_DestroyMisc' ErrStat = ErrID_None ErrMsg = '' - call MeshDestroy( OutputData%Y1Mesh, ErrStat2, ErrMsg2) + call NWTC_Library_DestroyModJacType(MiscData%Jac, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( OutputData%Y2Mesh, ErrStat2, ErrMsg2) + call SD_DestroyContState(MiscData%x_perturb, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - call MeshDestroy( OutputData%Y3Mesh, ErrStat2, ErrMsg2) + call SD_DestroyContState(MiscData%dxdt_lin, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) - if (allocated(OutputData%WriteOutput)) then - deallocate(OutputData%WriteOutput) + call SD_DestroyInput(MiscData%u_perturb, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + call SD_DestroyOutput(MiscData%y_lin, ErrStat2, ErrMsg2) + call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) + if (allocated(MiscData%AM2Jac)) then + deallocate(MiscData%AM2Jac) + end if + if (allocated(MiscData%AM2xq)) then + deallocate(MiscData%AM2xq) + end if + if (allocated(MiscData%AM2xq2)) then + deallocate(MiscData%AM2xq2) + end if + if (allocated(MiscData%qmdotdot)) then + deallocate(MiscData%qmdotdot) + end if + if (allocated(MiscData%qRdotdot)) then + deallocate(MiscData%qRdotdot) + end if + if (allocated(MiscData%F_TP)) then + deallocate(MiscData%F_TP) + end if + if (allocated(MiscData%u_TP)) then + deallocate(MiscData%u_TP) + end if + if (allocated(MiscData%udot_TP)) then + deallocate(MiscData%udot_TP) + end if + if (allocated(MiscData%udotdot_TP)) then + deallocate(MiscData%udotdot_TP) + end if + if (allocated(MiscData%Y1)) then + deallocate(MiscData%Y1) + end if + if (allocated(MiscData%Y1_Guy_R)) then + deallocate(MiscData%Y1_Guy_R) + end if + if (allocated(MiscData%Y1_Guy_L)) then + deallocate(MiscData%Y1_Guy_L) + end if + if (allocated(MiscData%F_L)) then + deallocate(MiscData%F_L) + end if + if (allocated(MiscData%F_L2)) then + deallocate(MiscData%F_L2) + end if + if (allocated(MiscData%UR_bar)) then + deallocate(MiscData%UR_bar) + end if + if (allocated(MiscData%UR_bar_dot)) then + deallocate(MiscData%UR_bar_dot) + end if + if (allocated(MiscData%UR_bar_dotdot)) then + deallocate(MiscData%UR_bar_dotdot) + end if + if (allocated(MiscData%UL)) then + deallocate(MiscData%UL) + end if + if (allocated(MiscData%UL_NS)) then + deallocate(MiscData%UL_NS) + end if + if (allocated(MiscData%UL_dot)) then + deallocate(MiscData%UL_dot) + end if + if (allocated(MiscData%UL_dotdot)) then + deallocate(MiscData%UL_dotdot) + end if + if (allocated(MiscData%DU_full)) then + deallocate(MiscData%DU_full) + end if + if (allocated(MiscData%U_full)) then + deallocate(MiscData%U_full) + end if + if (allocated(MiscData%U_full_NS)) then + deallocate(MiscData%U_full_NS) + end if + if (allocated(MiscData%U_full_dot)) then + deallocate(MiscData%U_full_dot) + end if + if (allocated(MiscData%U_full_dotdot)) then + deallocate(MiscData%U_full_dotdot) + end if + if (allocated(MiscData%U_full_elast)) then + deallocate(MiscData%U_full_elast) + end if + if (allocated(MiscData%U_red)) then + deallocate(MiscData%U_red) + end if + if (allocated(MiscData%x_full)) then + deallocate(MiscData%x_full) + end if + if (allocated(MiscData%FC_unit)) then + deallocate(MiscData%FC_unit) + end if + if (allocated(MiscData%SDWrOutput)) then + deallocate(MiscData%SDWrOutput) + end if + if (allocated(MiscData%AllOuts)) then + deallocate(MiscData%AllOuts) + end if + if (allocated(MiscData%Fext)) then + deallocate(MiscData%Fext) + end if + if (allocated(MiscData%Fext_red)) then + deallocate(MiscData%Fext_red) + end if + if (allocated(MiscData%FG)) then + deallocate(MiscData%FG) + end if + if (allocated(MiscData%UL_SIM)) then + deallocate(MiscData%UL_SIM) + end if + if (allocated(MiscData%UL_0m)) then + deallocate(MiscData%UL_0m) end if end subroutine -subroutine SD_PackOutput(RF, Indata) +subroutine SD_PackMisc(RF, Indata) type(RegFile), intent(inout) :: RF - type(SD_OutputType), intent(in) :: InData - character(*), parameter :: RoutineName = 'SD_PackOutput' + type(SD_MiscVarType), intent(in) :: InData + character(*), parameter :: RoutineName = 'SD_PackMisc' if (RF%ErrStat >= AbortErrLev) return - call MeshPack(RF, InData%Y1Mesh) - call MeshPack(RF, InData%Y2Mesh) - call MeshPack(RF, InData%Y3Mesh) - call RegPackAlloc(RF, InData%WriteOutput) + call NWTC_Library_PackModJacType(RF, InData%Jac) + call SD_PackContState(RF, InData%x_perturb) + call SD_PackContState(RF, InData%dxdt_lin) + call SD_PackInput(RF, InData%u_perturb) + call SD_PackOutput(RF, InData%y_lin) + call RegPackAlloc(RF, InData%AM2Jac) + call RegPackAlloc(RF, InData%AM2xq) + call RegPackAlloc(RF, InData%AM2xq2) + call RegPackAlloc(RF, InData%qmdotdot) + call RegPackAlloc(RF, InData%qRdotdot) + call RegPackAlloc(RF, InData%F_TP) + call RegPackAlloc(RF, InData%u_TP) + call RegPackAlloc(RF, InData%udot_TP) + call RegPackAlloc(RF, InData%udotdot_TP) + call RegPackAlloc(RF, InData%Y1) + call RegPackAlloc(RF, InData%Y1_Guy_R) + call RegPackAlloc(RF, InData%Y1_Guy_L) + call RegPackAlloc(RF, InData%F_L) + call RegPackAlloc(RF, InData%F_L2) + call RegPackAlloc(RF, InData%UR_bar) + call RegPackAlloc(RF, InData%UR_bar_dot) + call RegPackAlloc(RF, InData%UR_bar_dotdot) + call RegPackAlloc(RF, InData%UL) + call RegPackAlloc(RF, InData%UL_NS) + call RegPackAlloc(RF, InData%UL_dot) + call RegPackAlloc(RF, InData%UL_dotdot) + call RegPackAlloc(RF, InData%DU_full) + call RegPackAlloc(RF, InData%U_full) + call RegPackAlloc(RF, InData%U_full_NS) + call RegPackAlloc(RF, InData%U_full_dot) + call RegPackAlloc(RF, InData%U_full_dotdot) + call RegPackAlloc(RF, InData%U_full_elast) + call RegPackAlloc(RF, InData%U_red) + call RegPackAlloc(RF, InData%x_full) + call RegPackAlloc(RF, InData%FC_unit) + call RegPackAlloc(RF, InData%SDWrOutput) + call RegPackAlloc(RF, InData%AllOuts) + call RegPack(RF, InData%LastOutTime) + call RegPack(RF, InData%Decimat) + call RegPackAlloc(RF, InData%Fext) + call RegPackAlloc(RF, InData%Fext_red) + call RegPackAlloc(RF, InData%FG) + call RegPackAlloc(RF, InData%UL_SIM) + call RegPackAlloc(RF, InData%UL_0m) if (RegCheckErr(RF, RoutineName)) return end subroutine -subroutine SD_UnPackOutput(RF, OutData) +subroutine SD_UnPackMisc(RF, OutData) type(RegFile), intent(inout) :: RF - type(SD_OutputType), intent(inout) :: OutData - character(*), parameter :: RoutineName = 'SD_UnPackOutput' - integer(B4Ki) :: LB(1), UB(1) + type(SD_MiscVarType), intent(inout) :: OutData + character(*), parameter :: RoutineName = 'SD_UnPackMisc' + integer(B4Ki) :: LB(2), UB(2) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return - call MeshUnpack(RF, OutData%Y1Mesh) ! Y1Mesh - call MeshUnpack(RF, OutData%Y2Mesh) ! Y2Mesh - call MeshUnpack(RF, OutData%Y3Mesh) ! Y3Mesh - call RegUnpackAlloc(RF, OutData%WriteOutput); if (RegCheckErr(RF, RoutineName)) return + call NWTC_Library_UnpackModJacType(RF, OutData%Jac) ! Jac + call SD_UnpackContState(RF, OutData%x_perturb) ! x_perturb + call SD_UnpackContState(RF, OutData%dxdt_lin) ! dxdt_lin + call SD_UnpackInput(RF, OutData%u_perturb) ! u_perturb + call SD_UnpackOutput(RF, OutData%y_lin) ! y_lin + call RegUnpackAlloc(RF, OutData%AM2Jac); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AM2xq); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AM2xq2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qmdotdot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%qRdotdot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%F_TP); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%u_TP); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%udot_TP); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%udotdot_TP); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Y1); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Y1_Guy_R); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Y1_Guy_L); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%F_L); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%F_L2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UR_bar); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UR_bar_dot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UR_bar_dotdot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UL); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UL_NS); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UL_dot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UL_dotdot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%DU_full); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%U_full); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%U_full_NS); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%U_full_dot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%U_full_dotdot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%U_full_elast); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%U_red); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%x_full); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%FC_unit); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%SDWrOutput); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%AllOuts); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%LastOutTime); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%Decimat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Fext); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%Fext_red); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%FG); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UL_SIM); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%UL_0m); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine SD_Input_ExtrapInterp(u, t, u_out, t_out, ErrStat, ErrMsg) @@ -4363,8 +4867,12 @@ SUBROUTINE SD_Input_ExtrapInterp1(u1, u2, tin, u_out, tin_out, ErrStat, ErrMsg ) a1 = -(t_out - t(2))/t(2) a2 = t_out/t(2) - CALL MeshExtrapInterp1(u1%TPMesh, u2%TPMesh, tin, u_out%TPMesh, tin_out, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%TPMesh) .AND. ALLOCATED(u1%TPMesh)) THEN + do i1 = lbound(u_out%TPMesh,1),ubound(u_out%TPMesh,1) + CALL MeshExtrapInterp1(u1%TPMesh(i1), u2%TPMesh(i1), tin, u_out%TPMesh(i1), tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END DO + END IF ! check if allocated CALL MeshExtrapInterp1(u1%LMesh, u2%LMesh, tin, u_out%LMesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ALLOCATED(u_out%CableDeltaL) .AND. ALLOCATED(u1%CableDeltaL)) THEN @@ -4427,8 +4935,12 @@ SUBROUTINE SD_Input_ExtrapInterp2(u1, u2, u3, tin, u_out, tin_out, ErrStat, ErrM a1 = (t_out - t(2))*(t_out - t(3))/((t(1) - t(2))*(t(1) - t(3))) a2 = (t_out - t(1))*(t_out - t(3))/((t(2) - t(1))*(t(2) - t(3))) a3 = (t_out - t(1))*(t_out - t(2))/((t(3) - t(1))*(t(3) - t(2))) - CALL MeshExtrapInterp2(u1%TPMesh, u2%TPMesh, u3%TPMesh, tin, u_out%TPMesh, tin_out, ErrStat2, ErrMsg2) - CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(u_out%TPMesh) .AND. ALLOCATED(u1%TPMesh)) THEN + do i1 = lbound(u_out%TPMesh,1),ubound(u_out%TPMesh,1) + CALL MeshExtrapInterp2(u1%TPMesh(i1), u2%TPMesh(i1), u3%TPMesh(i1), tin, u_out%TPMesh(i1), tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END DO + END IF ! check if allocated CALL MeshExtrapInterp2(u1%LMesh, u2%LMesh, u3%LMesh, tin, u_out%LMesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) IF (ALLOCATED(u_out%CableDeltaL) .AND. ALLOCATED(u1%CableDeltaL)) THEN @@ -4533,8 +5045,14 @@ SUBROUTINE SD_Output_ExtrapInterp1(y1, y2, tin, y_out, tin_out, ErrStat, ErrMsg a1 = -(t_out - t(2))/t(2) a2 = t_out/t(2) - CALL MeshExtrapInterp1(y1%Y1Mesh, y2%Y1Mesh, tin, y_out%Y1Mesh, tin_out, ErrStat2, ErrMsg2) + CALL MeshExtrapInterp1(y1%Y0Mesh, y2%Y0Mesh, tin, y_out%Y0Mesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(y_out%Y1Mesh) .AND. ALLOCATED(y1%Y1Mesh)) THEN + do i1 = lbound(y_out%Y1Mesh,1),ubound(y_out%Y1Mesh,1) + CALL MeshExtrapInterp1(y1%Y1Mesh(i1), y2%Y1Mesh(i1), tin, y_out%Y1Mesh(i1), tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END DO + END IF ! check if allocated CALL MeshExtrapInterp1(y1%Y2Mesh, y2%Y2Mesh, tin, y_out%Y2Mesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp1(y1%Y3Mesh, y2%Y3Mesh, tin, y_out%Y3Mesh, tin_out, ErrStat2, ErrMsg2) @@ -4599,8 +5117,14 @@ SUBROUTINE SD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Err a1 = (t_out - t(2))*(t_out - t(3))/((t(1) - t(2))*(t(1) - t(3))) a2 = (t_out - t(1))*(t_out - t(3))/((t(2) - t(1))*(t(2) - t(3))) a3 = (t_out - t(1))*(t_out - t(2))/((t(3) - t(1))*(t(3) - t(2))) - CALL MeshExtrapInterp2(y1%Y1Mesh, y2%Y1Mesh, y3%Y1Mesh, tin, y_out%Y1Mesh, tin_out, ErrStat2, ErrMsg2) + CALL MeshExtrapInterp2(y1%Y0Mesh, y2%Y0Mesh, y3%Y0Mesh, tin, y_out%Y0Mesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + IF (ALLOCATED(y_out%Y1Mesh) .AND. ALLOCATED(y1%Y1Mesh)) THEN + do i1 = lbound(y_out%Y1Mesh,1),ubound(y_out%Y1Mesh,1) + CALL MeshExtrapInterp2(y1%Y1Mesh(i1), y2%Y1Mesh(i1), y3%Y1Mesh(i1), tin, y_out%Y1Mesh(i1), tin_out, ErrStat2, ErrMsg2) + CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) + END DO + END IF ! check if allocated CALL MeshExtrapInterp2(y1%Y2Mesh, y2%Y2Mesh, y3%Y2Mesh, tin, y_out%Y2Mesh, tin_out, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg,RoutineName) CALL MeshExtrapInterp2(y1%Y3Mesh, y2%Y3Mesh, y3%Y3Mesh, tin, y_out%Y3Mesh, tin_out, ErrStat2, ErrMsg2) @@ -4609,5 +5133,292 @@ SUBROUTINE SD_Output_ExtrapInterp2(y1, y2, y3, tin, y_out, tin_out, ErrStat, Err y_out%WriteOutput = a1*y1%WriteOutput + a2*y2%WriteOutput + a3*y3%WriteOutput END IF ! check if allocated END SUBROUTINE + +function SD_InputMeshPointer(u, DL) result(Mesh) + type(SD_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (SD_u_TPMesh) + Mesh => u%TPMesh(DL%i1) + case (SD_u_LMesh) + Mesh => u%LMesh + end select +end function + +function SD_OutputMeshPointer(y, DL) result(Mesh) + type(SD_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + case (SD_y_Y0Mesh) + Mesh => y%Y0Mesh + case (SD_y_Y1Mesh) + Mesh => y%Y1Mesh(DL%i1) + case (SD_y_Y2Mesh) + Mesh => y%Y2Mesh + case (SD_y_Y3Mesh) + Mesh => y%Y3Mesh + end select +end function + +subroutine SD_VarsPackContState(Vars, x, ValAry) + type(SD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SD_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SD_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SD_x_qm) + VarVals = x%qm(V%iLB:V%iUB) ! Rank 1 Array + case (SD_x_qmdot) + VarVals = x%qmdot(V%iLB:V%iUB) ! Rank 1 Array + case (SD_x_qR) + VarVals = x%qR(V%iLB:V%iUB) ! Rank 1 Array + case (SD_x_qRdot) + VarVals = x%qRdot(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SD_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SD_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SD_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine SD_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SD_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SD_x_qm) + x%qm(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SD_x_qmdot) + x%qmdot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SD_x_qR) + x%qR(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (SD_x_qRdot) + x%qRdot(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SD_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SD_x_qm) + Name = "x%qm" + case (SD_x_qmdot) + Name = "x%qmdot" + case (SD_x_qR) + Name = "x%qR" + case (SD_x_qRdot) + Name = "x%qRdot" + case default + Name = "Unknown Field" + end select +end function + +subroutine SD_VarsPackContStateDeriv(Vars, x, ValAry) + type(SD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call SD_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine SD_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(SD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SD_x_qm) + VarVals = x%qm(V%iLB:V%iUB) ! Rank 1 Array + case (SD_x_qmdot) + VarVals = x%qmdot(V%iLB:V%iUB) ! Rank 1 Array + case (SD_x_qR) + VarVals = x%qR(V%iLB:V%iUB) ! Rank 1 Array + case (SD_x_qRdot) + VarVals = x%qRdot(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SD_VarsPackInput(Vars, u, ValAry) + type(SD_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SD_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine SD_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(SD_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SD_u_TPMesh) + call MV_PackMesh(V, u%TPMesh(DL%i1), ValAry) ! Mesh + case (SD_u_LMesh) + call MV_PackMesh(V, u%LMesh, ValAry) ! Mesh + case (SD_u_CableDeltaL) + VarVals = u%CableDeltaL(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SD_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SD_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call SD_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine SD_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SD_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SD_u_TPMesh) + call MV_UnpackMesh(V, ValAry, u%TPMesh(DL%i1)) ! Mesh + case (SD_u_LMesh) + call MV_UnpackMesh(V, ValAry, u%LMesh) ! Mesh + case (SD_u_CableDeltaL) + u%CableDeltaL(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SD_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SD_u_TPMesh) + Name = "u%TPMesh("//trim(Num2LStr(DL%i1))//")" + case (SD_u_LMesh) + Name = "u%LMesh" + case (SD_u_CableDeltaL) + Name = "u%CableDeltaL" + case default + Name = "Unknown Field" + end select +end function + +subroutine SD_VarsPackOutput(Vars, y, ValAry) + type(SD_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SD_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine SD_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(SD_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SD_y_Y0Mesh) + call MV_PackMesh(V, y%Y0Mesh, ValAry) ! Mesh + case (SD_y_Y1Mesh) + call MV_PackMesh(V, y%Y1Mesh(DL%i1), ValAry) ! Mesh + case (SD_y_Y2Mesh) + call MV_PackMesh(V, y%Y2Mesh, ValAry) ! Mesh + case (SD_y_Y3Mesh) + call MV_PackMesh(V, y%Y3Mesh, ValAry) ! Mesh + case (SD_y_WriteOutput) + VarVals = y%WriteOutput(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine SD_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(SD_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call SD_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine SD_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(SD_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (SD_y_Y0Mesh) + call MV_UnpackMesh(V, ValAry, y%Y0Mesh) ! Mesh + case (SD_y_Y1Mesh) + call MV_UnpackMesh(V, ValAry, y%Y1Mesh(DL%i1)) ! Mesh + case (SD_y_Y2Mesh) + call MV_UnpackMesh(V, ValAry, y%Y2Mesh) ! Mesh + case (SD_y_Y3Mesh) + call MV_UnpackMesh(V, ValAry, y%Y3Mesh) ! Mesh + case (SD_y_WriteOutput) + y%WriteOutput(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function SD_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (SD_y_Y0Mesh) + Name = "y%Y0Mesh" + case (SD_y_Y1Mesh) + Name = "y%Y1Mesh("//trim(Num2LStr(DL%i1))//")" + case (SD_y_Y2Mesh) + Name = "y%Y2Mesh" + case (SD_y_Y3Mesh) + Name = "y%Y3Mesh" + case (SD_y_WriteOutput) + Name = "y%WriteOutput" + case default + Name = "Unknown Field" + end select +end function + END MODULE SubDyn_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/modules/version/tests/versioninfo_utest.F90 b/modules/version/tests/versioninfo_utest.F90 index c58ba55614..a272f413d5 100644 --- a/modules/version/tests/versioninfo_utest.F90 +++ b/modules/version/tests/versioninfo_utest.F90 @@ -20,7 +20,7 @@ program versioninfo_utest do is = 1, size(testsuites) write (error_unit, fmt) "Testing:", testsuites(is)%name - call run_testsuite(testsuites(is)%collect, error_unit, stat) + call run_testsuite(testsuites(is)%collect, error_unit, stat, parallel=.false.) end do if (stat > 0) then diff --git a/modules/wakedynamics/src/WakeDynamics.f90 b/modules/wakedynamics/src/WakeDynamics.f90 index 8a9e0b4bd9..6664c6e44f 100644 --- a/modules/wakedynamics/src/WakeDynamics.f90 +++ b/modules/wakedynamics/src/WakeDynamics.f90 @@ -352,6 +352,7 @@ subroutine ThomasAlgorithm(nr, a, b, c, d, x, errStat, errMsg) do i = 1,nr-2 if ( abs(b(i)) <= ( abs(a(i))+abs(c(i)) ) ) then ! TEST: E17 + print *,'Found error:',i,a(i),b(i),c(i) call SetErrStat( ErrID_Fatal, 'Tridiagonal matrix is not diagonally dominant, i.e., abs(b(i)) <= ( abs(a(i))+abs(c(i)) ). Try reducing the FAST.Farm timestep.', errStat, errMsg, RoutineName ) return end if @@ -427,8 +428,11 @@ subroutine WD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut p%DT_low = interval ! Parameters from input file p%Mod_Wake = InitInp%InputFileData%Mod_Wake - p%NumPlanes = InitInp%InputFileData%NumPlanes + p%MaxNumPlanes = InitInp%MaxNumPlanes p%NumRadii = InitInp%InputFileData%NumRadii + p%x_Full = InitInp%InputFileData%NumDFull * InitInp%InputFileData%RotorDiamRef + p%d_Buff = InitInp%InputFileData%NumDBuff * InitInp%InputFileData%RotorDiamRef + p%x_Buff = p%x_Full + p%d_Buff p%dr = InitInp%InputFileData%dr p%C_HWkDfl_O = InitInp%InputFileData%C_HWkDfl_O p%C_HWkDfl_OY = InitInp%InputFileData%C_HWkDfl_OY @@ -492,7 +496,7 @@ subroutine WD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut ! Define and initialize inputs here !............................................................................................ - allocate( u%V_plane (3,0:p%NumPlanes-1),stat=errStat2); if (Failed0('u%V_plane.' )) return; + allocate( u%V_plane (3,0:p%MaxNumPlanes-1),stat=errStat2); if (Failed0('u%V_plane.' )) return; allocate( u%Ct_azavg ( 0:p%NumRadii-1 ),stat=errStat2); if (Failed0('u%Ct_azavg.')) return; allocate( u%Cq_azavg ( 0:p%NumRadii-1 ),stat=errStat2); if (Failed0('u%Cq_azavg.')) return; if (errStat /= ErrID_None) return @@ -515,28 +519,29 @@ subroutine WD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut x%DummyContState = 0.0_ReKi z%DummyConstrState = 0.0_ReKi - allocate ( xd%xhat_plane (3, 0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%xhat_plane.' )) return; - allocate ( xd%p_plane (3, 0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%p_plane.' )) return; - allocate ( xd%V_plane_filt (3, 0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%V_plane_filt.' )) return; - allocate ( xd%Vx_wind_disk_filt( 0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vx_wind_disk_filt.')) return; - allocate ( xd%x_plane ( 0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%x_plane.' )) return; - allocate ( xd%YawErr_filt ( 0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%YawErr_filt.' )) return; - allocate ( xd%TI_amb_filt ( 0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%TI_amb_filt.' )) return; - allocate ( xd%D_rotor_filt ( 0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%D_rotor_filt.' )) return; + allocate ( xd%xhat_plane (3, 0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%xhat_plane.' )) return; + allocate ( xd%p_plane (3, 0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%p_plane.' )) return; + allocate ( xd%V_plane_filt (3, 0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%V_plane_filt.' )) return; + allocate ( xd%Vx_wind_disk_filt( 0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vx_wind_disk_filt.')) return; + allocate ( xd%x_plane ( 0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%x_plane.' )) return; + allocate ( xd%YawErr_filt ( 0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%YawErr_filt.' )) return; + allocate ( xd%TI_amb_filt ( 0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%TI_amb_filt.' )) return; + allocate ( xd%D_rotor_filt ( 0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%D_rotor_filt.' )) return; allocate ( xd%Ct_azavg_filt ( 0:p%NumRadii-1 ), STAT=ErrStat2 ); if (Failed0('xd%Ct_azavg_filt.' )) return; allocate ( xd%Cq_azavg_filt ( 0:p%NumRadii-1 ), STAT=ErrStat2 ); if (Failed0('xd%Cq_azavg_filt.' )) return; - allocate ( xd%Vx_wake (0:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vx_wake.' )) return; - allocate ( xd%Vr_wake (0:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vr_wake.' )) return; - allocate ( xd%Vx_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vx_wake.')) return; + allocate ( xd%Vx_wake (0:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vx_wake.' )) return; + allocate ( xd%Vr_wake (0:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vr_wake.' )) return; + allocate ( xd%Vx_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vx_wake.')) return; ! Curl - allocate ( xd%Vy_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vy_wake.')) return; - allocate ( xd%Vz_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vz_wake.')) return; + allocate ( xd%Vy_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vy_wake.')) return; + allocate ( xd%Vz_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('xd%Vz_wake.')) return; xd%YawErr_filt = 0.0_ReKi !NOTE: initialized in InitStatesWithInputs xd%psi_skew_filt = 0.0_ReKi !NOTE: initialized in InitStatesWithInputs xd%chi_skew_filt = 0.0_ReKi !NOTE: initialized in InitStatesWithInputs + xd%NumPlanes = 2.0_ReKi xd%xhat_plane = 0.0_ReKi xd%p_plane = 0.0_ReKi xd%x_plane = 0.0_ReKi @@ -554,11 +559,11 @@ subroutine WD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut ! miscvars to avoid the allocation per timestep ! Cartesian eddy viscosity (allocated even for polar if plane outputs are requested) - allocate ( m%vt_tot2(-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%vt_tot2.')) return; - allocate ( m%vt_amb2(-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%vt_amb2.')) return; - allocate ( m%vt_shr2(-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%vt_shr2.')) return; - allocate ( m%dvx_dy (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%dvx_dy.')) return; - allocate ( m%dvx_dz (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%dvx_dz.')) return; + allocate ( m%vt_tot2(-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%vt_tot2.')) return; + allocate ( m%vt_amb2(-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%vt_amb2.')) return; + allocate ( m%vt_shr2(-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%vt_shr2.')) return; + allocate ( m%dvx_dy (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%dvx_dy.')) return; + allocate ( m%dvx_dz (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('m%dvx_dz.')) return; m%vt_tot2 = 0.0_ReKi m%vt_amb2 = 0.0_ReKi m%vt_shr2 = 0.0_ReKi @@ -566,9 +571,9 @@ subroutine WD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut m%dvx_dz = 0.0_ReKi if (p%Mod_Wake == Mod_Wake_Polar) then allocate ( m%dvtdr (0:p%NumRadii-1 ) , STAT=ErrStat2 ); if (Failed0('m%dvtdr.')) return; - allocate ( m%vt_tot (0:p%NumRadii-1,0:p%NumPlanes-1 ) , STAT=ErrStat2 ); if (Failed0('m%vt_tot.')) return; - allocate ( m%vt_amb (0:p%NumRadii-1,0:p%NumPlanes-1 ) , STAT=ErrStat2 ); if (Failed0('m%vt_amb.')) return; - allocate ( m%vt_shr (0:p%NumRadii-1,0:p%NumPlanes-1 ) , STAT=ErrStat2 ); if (Failed0('m%vt_shr.')) return; + allocate ( m%vt_tot (0:p%NumRadii-1,0:p%MaxNumPlanes-1 ) , STAT=ErrStat2 ); if (Failed0('m%vt_tot.')) return; + allocate ( m%vt_amb (0:p%NumRadii-1,0:p%MaxNumPlanes-1 ) , STAT=ErrStat2 ); if (Failed0('m%vt_amb.')) return; + allocate ( m%vt_shr (0:p%NumRadii-1,0:p%MaxNumPlanes-1 ) , STAT=ErrStat2 ); if (Failed0('m%vt_shr.')) return; else if (p%Mod_Wake == Mod_Wake_Cartesian .or. p%Mod_Wake == Mod_Wake_Curl) then allocate ( m%nu_dvx_dy(-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1), STAT=ErrStat2 ); if (Failed0('m%nu_dvx_dy.')) return; allocate ( m%nu_dvx_dz(-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1), STAT=ErrStat2 ); if (Failed0('m%nu_dvx_dz.')) return; @@ -600,18 +605,18 @@ subroutine WD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut InitOut%Ver = WD_Ver - allocate ( y%xhat_plane(3,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%xhat_plane.')) return; - allocate ( y%p_plane (3,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%p_plane.' )) return; - allocate ( y%Vx_wake (0:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vx_wake.' )) return; - allocate ( y%Vr_wake (0:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vr_wake.' )) return; - - allocate ( y%Vx_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vx_wake.')) return; - allocate ( y%Vy_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vy_wake.')) return; - allocate ( y%Vz_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vz_wake.')) return; - - allocate ( y%D_wake (0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%D_wake.' )) return; - allocate ( y%x_plane (0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%x_plane.')) return; - allocate ( y%WAT_k (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%NumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%WAT_k.')) return; + allocate ( y%xhat_plane(3,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%xhat_plane.')) return; + allocate ( y%p_plane (3,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%p_plane.' )) return; + allocate ( y%Vx_wake (0:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vx_wake.' )) return; + allocate ( y%Vr_wake (0:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vr_wake.' )) return; + + allocate ( y%Vx_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vx_wake.')) return; + allocate ( y%Vy_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vy_wake.')) return; + allocate ( y%Vz_wake2 (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%Vz_wake.')) return; + + allocate ( y%D_wake (0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%D_wake.' )) return; + allocate ( y%x_plane (0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%x_plane.')) return; + allocate ( y%WAT_k (-p%NumRadii+1:p%NumRadii-1,-p%NumRadii+1:p%NumRadii-1,0:p%MaxNumPlanes-1), STAT=ErrStat2 ); if (Failed0('y%WAT_k.')) return; y%xhat_plane = 0.0_Reki y%p_plane = 0.0_Reki @@ -722,7 +727,7 @@ subroutine WD_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errMsg ! Check if we are fully initialized if ( OtherState%firstPass ) then - call InitStatesWithInputs(p%NumPlanes, p%NumRadii, u, p, xd, m, errStat2, errMsg2) + call InitStatesWithInputs(p%MaxNumPlanes, p%NumRadii, u, p, xd, m, errStat2, errMsg2) call SetErrStat(errStat2, errMsg2, errStat, errMsg, RoutineName) OtherState%firstPass = .false. if (errStat >= AbortErrLev) then @@ -737,15 +742,15 @@ subroutine WD_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errMsg ! --- Update states for all planes except disk plane ! -------------------------------------------------------------------------------- ! --- Update V_plane_filt to [n+1]: - maxPln = min(n,p%NumPlanes-2) + maxPln = NINT(xd%NumPlanes)-2 do i = 0,maxPln xd%V_plane_filt(:,i ) = xd%V_plane_filt(:,i)*p%filtParam + u%V_plane(:,i )*p%oneMinusFiltParam end do xd%V_plane_filt (:,maxPln+1) = u%V_plane(:,maxPln+1) - - maxPln = min(n+2,p%NumPlanes-1) - + maxPln = min( NINT(xd%NumPlanes) , p%MaxNumPlanes-1 ) + + ! --- Compute eddy viscosity terms ! compute eddy-viscosity terms for all planes, NOTE: starting from maxPln+1 here do i = maxPln+1, 1, -1 @@ -830,8 +835,8 @@ subroutine WD_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errMsg dx = dot_product(xd%xhat_plane(:,i-1),u%V_plane(:,i-1))*p%DT_low ! Update these states to [n+1] - xd%x_plane (i) = xd%x_plane (i-1) + abs(dx) ! dx = dot_product(xd%xhat_plane(:,i-1),xd%V_plane_filt(:,i-1))*p%DT_low ; don't use absdx here - xd%YawErr_filt (i) = xd%YawErr_filt(i-1) + xd%x_plane (i) = xd%x_plane (i-1) + abs(dx) ! dx = dot_product(xd%xhat_plane(:,i-1),xd%V_plane_filt(:,i-1))*p%DT_low ; don't use absdx here + xd%YawErr_filt (i) = xd%YawErr_filt (i-1) xd%xhat_plane(:,i) = xd%xhat_plane(:,i-1) ! The function state-related arguments must be at time [n+1], so we must update YawErr_filt and xhat_plane before computing the deflection @@ -852,8 +857,8 @@ subroutine WD_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errMsg xd%TI_amb_filt (i) = xd%TI_amb_filt(i-1) xd%D_rotor_filt (i) = xd%D_rotor_filt(i-1) - end do ! loop on planes i = maxPln+1, 1, -1 - + end do ! loop on planes i = maxPln, 1, -1 + ! -------------------------------------------------------------------------------- ! --- Update states at disk-plane (0) to time [n+1] ! -------------------------------------------------------------------------------- @@ -946,7 +951,65 @@ subroutine WD_UpdateStates( t, n, u, p, x, xd, z, OtherState, m, errStat, errMsg endif !Used for debugging: write(51,'(I5,100(1x,ES10.2E2))') n, xd%x_plane(n), xd%x_plane(n)/xd%D_rotor_filt(n), xd%Vx_wind_disk_filt(n) + xd%Vx_wake(:,n), xd%Vr_wake(:,n) - + + xd%NumPlanes = xd%NumPlanes + 1.0 + if ( NINT(xd%NumPlanes) > p%MaxNumPlanes ) then + xd%NumPlanes = real(p%MaxNumPlanes,ReKi) + call SetErrStat(ErrID_Warn, ' The number of wake planes of turbine '//trim(num2lstr(p%TurbNum))//' exceeded the allowed number ('//trim(num2lstr(p%MaxNumPlanes))//'). Excess plane(s) removed. ', errStat, errMsg, RoutineName) + if (errStat >= AbortErrLev) then + call Cleanup() + return + end if + end if + if ( NINT(xd%NumPlanes) < 2 ) then + ! Check just in case following implementation plan; however, this should never happen. Consider removing in the future. + call SetErrStat(ErrID_Fatal, ' The number of wake planes of turbine '//trim(num2lstr(p%TurbNum))//' has dropped below 2. ', errStat, errMsg, RoutineName) + end if + + maxPln = NINT(xd%NumPlanes) - 1 + + do i=maxPln,0,-1 + + if ( xd%x_plane(i) > p%x_Buff ) then + + xd%NumPlanes = max( xd%NumPlanes - 1.0, 2.0 ) + + else if ( i+1 < NINT(xd%NumPlanes) .and. xd%x_plane(i) >= xd%x_plane(i+1) ) then + + call SetErrStat(ErrID_Warn, ' Turbine '//trim(num2lstr(p%TurbNum))//' wake plane '//trim(num2lstr(i))//' (x_plane='//trim(num2lstr(xd%x_plane(i)))//') has overtaken wake plane '//trim(num2lstr(i+1))//' (x_plane='//trim(num2lstr(xd%x_plane(i+1)))//'). Offending wake plane removed. Reduce f_c to prevent planes from passing each other. ', errStat, errMsg, RoutineName) + if (errStat >= AbortErrLev) then + call Cleanup() + return + end if + + ! Remove offending plane and shift everything behind up + + xd%NumPlanes = xd%NumPlanes - 1.0 + + ! Didn't check xd%NumPlanes >= 2 here. The first wake plane is unlikely to move upwind of the rotor. + + do j = i+1,NINT(xd%NumPlanes)-1 + + xd%Vx_wind_disk_filt(j-1) = xd%Vx_wind_disk_filt(j) + xd%x_plane ( j-1) = xd%x_plane ( j) + xd%TI_amb_filt ( j-1) = xd%TI_amb_filt ( j) + xd%D_rotor_filt ( j-1) = xd%D_rotor_filt ( j) + xd%YawErr_filt ( j-1) = xd%YawErr_filt ( j) + xd%p_plane ( :,j-1) = xd%p_plane ( :,j) + xd%xhat_plane ( :,j-1) = xd%xhat_plane ( :,j) + xd%V_plane_filt ( :,j-1) = xd%V_plane_filt ( :,j) + xd%Vx_wake ( :,j-1) = xd%Vx_wake ( :,j) + xd%Vr_wake ( :,j-1) = xd%Vr_wake ( :,j) + xd%Vx_wake2 (:,:,j-1) = xd%Vx_wake2 (:,:,j) + xd%Vy_wake2 (:,:,j-1) = xd%Vy_wake2 (:,:,j) + xd%Vz_wake2 (:,:,j-1) = xd%Vz_wake2 (:,:,j) + + end do + + end if + + end do + call Cleanup() contains @@ -1012,7 +1075,7 @@ subroutine updateVelocityPolar() - real(2*j-1,ReKi)*p%dr * ( xd%Vx_wake(j,i) + xd%Vx_wake(j-1,i) - xd%Vx_wake(j,i-1) - xd%Vx_wake(j-1,i-1) ) / ( real(4*j,ReKi) * absdx ) end do end if - end do ! i = 1,min(n+2,p%NumPlanes-1) + end do ! i = maxPln, 1, -1 end subroutine updateVelocityPolar !> @@ -1274,8 +1337,8 @@ subroutine filter_angles2(psi_filt, chi_filt, psi, chi, alpha, alpha_bar) DCM1 = EulerConstruct( (/ psi_filt, 0.0_ReKi, chi_filt /) ) DCM2 = EulerConstruct( (/ psi, 0.0_ReKi, chi /) ) ! Compute the logarithmic map of the DCMs: - CALL DCM_logMap( DCM1, lambda(:,1), errStat, errMsg) - CALL DCM_logMap( DCM2, lambda(:,2), errStat, errMsg) + CALL DCM_logMap(DCM1, lambda(:,1)) + CALL DCM_logMap(DCM2, lambda(:,2)) !Make sure we don't cross a 2pi boundary: CALL DCM_SetLogMapForInterp( lambda ) !Interpolate the logarithmic map: @@ -1484,12 +1547,12 @@ subroutine WD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, errStat, errMsg ) character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'WD_CalcOutput' real(ReKi) :: correction(3) - real(ReKi) :: C, S, dvdr, dvdtheta_r, R, r_tmp + real(ReKi) :: C, S, dvdr, dvdtheta_r, R, r_tmp, ScBuff errStat = ErrID_None errMsg = "" n = nint(t/p%DT_low) - maxPln = min(n+1,p%NumPlanes-1) + maxPln = NINT(xd%NumPlanes) - 1 ! Check if we are fully initialized if ( OtherState%firstPass ) then @@ -1510,6 +1573,8 @@ subroutine WD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, errStat, errMsg ) ! NOTE: Since we are in firstPass=T, then xd%Vx_wake is already set to zero, so just pass that into WakeDiam y%D_wake(i) = WakeDiam( p%Mod_WakeDiam, p%NumRadii, p%dr, p%r, xd%Vx_wake(:,i), u%Vx_wind_disk, u%D_rotor, p%C_WakeDiam) + + y%NumPlanes = 2.0 end do ! Initialze Vx_wake; Vr_wake is already initialized to zero, so, we don't need to do that here. @@ -1538,13 +1603,24 @@ subroutine WD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, errStat, errMsg ) y%xhat_plane = xd%xhat_plane y%Vx_wake = xd%Vx_wake y%Vr_wake = xd%Vr_wake - do i = 0, min(n+1,p%NumPlanes-1) + do i = 0, maxPln y%D_wake(i) = WakeDiam( p%Mod_WakeDiam, p%NumRadii, p%dr, p%r, xd%Vx_wake(:,i), xd%Vx_wind_disk_filt(i), xd%D_rotor_filt(i), p%C_WakeDiam) end do + y%NumPlanes = xd%NumPlanes end if + ! --- Linearly decay wake deficits in the buffer region based on distance + do i = 0,maxPln + if ( xd%x_plane(i) > p%x_full ) then + ! Note: Clamp to zero just in case, but all wake planes that propagated past x_buff should have been removed. + ScBuff = max( ( p%x_buff - xd%x_plane(i) ) / p%d_buff , 0.0 ) + y%Vx_wake(:,i) = y%Vx_wake(:,i) * ScBuff + y%Vr_wake(:,i) = y%Vr_wake(:,i) * ScBuff + end if + end do + ! --- Velocity deficits on Cartesian grid if (p%Mod_Wake == Mod_Wake_Polar) then ! Convert to Cartesian @@ -1642,7 +1718,7 @@ subroutine WD_WritePlaneOutputs( t, u, p, x, xd, z, OtherState, y, m, errStat, e type(WD_MiscVarType), intent(IN ) :: m !< Misc/optimization variables INTEGER(IntKi), INTENT( OUT) :: errStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: errMsg !< Error message if errStat /= ErrID_None - integer(intKi) :: n, i + integer(intKi) :: n, i, maxPln integer(intKi) :: ErrStat2 character(ErrMsgLen) :: ErrMsg2 character(*), parameter :: RoutineName = 'WD_WritePlaneOutputs' @@ -1655,11 +1731,12 @@ subroutine WD_WritePlaneOutputs( t, u, p, x, xd, z, OtherState, y, m, errStat, e errMsg = "" n = nint(t/p%DT_low) + maxPln = NINT(xd%NumPlanes)-1 ! --- VTK outputs per plane if (p%OutAllPlanes) then call vtk_misc_init(mvtk) call set_vtk_binary_format(.false., mvtk) - do i = 0, min(n-1,p%NumPlanes-1), 1 + do i = 0, maxPln, 1 ! if (EqualRealNos(t,0.0_DbKi) ) then ! write(Filename,'(A,I4.4,A)') trim(p%OutFileVTKDir)//'/PlaneOutputsAtPlane_',i,'_Init.vtk' ! else @@ -1815,7 +1892,6 @@ SUBROUTINE ValidateInitInputData( DT_low, InitInp, InputFileData, errStat, errMs ! TEST: E13, !if (NumBl > MaxBl .or. NumBl < 1) call SetErrStat( ErrID_Fatal, 'Number of blades must be between 1 and '//trim(num2lstr(MaxBl))//'.', ErrSTat, errMsg, RoutineName ) if ( DT_low <= 0.0) call SetErrStat ( ErrID_Fatal, 'DT_low must be greater than zero.', errStat, errMsg, RoutineName ) - if ( InputFileData%NumPlanes < 2 ) call SetErrStat ( ErrID_Fatal, 'Number of wake planes must be greater than one.', ErrSTat, errMsg, RoutineName ) if ( InputFileData%NumRadii < 2 ) call SetErrStat ( ErrID_Fatal, 'Number of radii in the radial finite-difference grid must be greater than one.', ErrSTat, errMsg, RoutineName ) if ( InputFileData%dr <= 0.0) call SetErrStat ( ErrID_Fatal, 'dr must be greater than zero.', errStat, errMsg, RoutineName ) if ( InputFileData%f_c <= 0.0) call SetErrStat ( ErrID_Fatal, 'f_c must be greater than or equal to zero.', errStat, errMsg, RoutineName ) diff --git a/modules/wakedynamics/src/WakeDynamics_Registry.txt b/modules/wakedynamics/src/WakeDynamics_Registry.txt index ef9d3e040c..56ae0024ef 100644 --- a/modules/wakedynamics/src/WakeDynamics_Registry.txt +++ b/modules/wakedynamics/src/WakeDynamics_Registry.txt @@ -25,7 +25,8 @@ param ^ - INTEGER Mod_Wake_Cartesian # ..... InputFile Data ....................................................................................................... typedef ^ WD_InputFileType ReKi dr - - - "Radial increment of radial finite-difference grid [>0.0]" m typedef ^ WD_InputFileType IntKi NumRadii - - - "Number of radii in the radial finite-difference grid [>=2]" - -typedef ^ WD_InputFileType IntKi NumPlanes - - - "Number of wake planes [>=2]" - +typedef ^ WD_InputFileType IntKi NumDFull - - - "Distance of full wake propagation as a multiple of RotorDiamRef" - +typedef ^ WD_InputFileType IntKi NumDBuff - - - "Length of wake propagation buffer region as a multiple of RotorDiamRef" - typedef ^ WD_InputFileType IntKi Mod_Wake - - - "Switch between wake formulations 1=Polar, 2=Cartesian, 3=Curl" - typedef ^ WD_InputFileType ReKi f_c - - - "Cut-off frequency of the low-pass time-filter for the wake advection, deflection, and meandering model [>0.0]" Hz typedef ^ WD_InputFileType ReKi C_HWkDfl_O - - - "Calibrated parameter in the correction for wake deflection defining the horizontal offset at the rotor" m @@ -66,6 +67,7 @@ typedef ^ WD_InputFileType ReKi WAT_k_Grad_FMin - - typedef ^ WD_InputFileType ReKi WAT_k_Grad_DMin - - - "Calibrated parameter in the eddy viscosity filter function for the WAT radial velocity gradient of the wake deficit defining the transitional diameter fraction between the minimum and exponential regions [>=0.0] or DEFAULT [DEFAULT=0.0]" - typedef ^ WD_InputFileType ReKi WAT_k_Grad_DMax - - - "Calibrated parameter in the eddy viscosity filter function for the WAT radial velocity gradient of the wake deficit defining the transitional diameter fraction between the exponential and maximum regions [> WAT_k_Grad_DMin] or DEFAULT [DEFAULT=12.0]" - typedef ^ WD_InputFileType ReKi WAT_k_Grad_Exp - - - "Calibrated parameter in the eddy viscosity filter function for the WAT radial velocity gradient of the wake deficit defining the exponent in the exponential region [> 0.0] or DEFAULT [DEFAULT=0.65]" - +typedef ^ WD_InputFileType ReKi RotorDiamRef - - - "Reference rotor diameter" m # ..... Initialization data ....................................................................................................... # Define inputs that the initialization routine may need here: @@ -73,7 +75,7 @@ typedef ^ WD_InputFileType ReKi WAT_k_Grad_Exp - - typedef ^ InitInputType WD_InputFileType InputFileData - - - "FAST.Farm input-file data for wake dynamics" - typedef ^ InitInputType IntKi TurbNum - 0 - "Turbine ID number (start with 1; end with number of turbines)" - typedef ^ InitInputType CHARACTER(1024) OutFileRoot - - - "The root name derived from the primary FAST.Farm input file" - - +typedef ^ InitInputType IntKi MaxNumPlanes - - - "Maximum number of wake planes allowed" - # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - @@ -86,6 +88,7 @@ typedef ^ InitOutputType ProgDesc Ver - typedef ^ ContinuousStateType ReKi DummyContState - - - "Remove this variable if you have continuous states" - # Define discrete (nondifferentiable) states here: +typedef ^ DiscreteStateType ReKi NumPlanes - - - "Number of active wake planes (>=2)" - typedef ^ DiscreteStateType ReKi xhat_plane {:}{:} - - "Orientations of wake planes, normal to wake planes" - typedef ^ DiscreteStateType ReKi YawErr_filt {:} - - "Time-filtered nacelle-yaw error at the wake planes" rad typedef ^ DiscreteStateType ReKi psi_skew_filt - - - "Time-filtered azimuth angle from skew vertical axis" rad @@ -137,15 +140,18 @@ typedef ^ MiscVarType ReKi Vx_polar {:} - - "Vx as function of typedef ^ MiscVarType ReKi Vt_wake {:} - - "Vr as function of r for Cartesian implementation" typedef ^ MiscVarType ReKi GammaCurl - - - "Circulation used in Curled wake model" typedef ^ MiscVarType ReKi Ct_avg - - - "Circulation used in Curled wake model" - + # ..... Parameters ................................................................................................................ # Define parameters here: # Time step for integration of continuous states (if a fixed-step integrator is used) and update of discrete states: typedef ^ ParameterType DbKi dt_low - - - "Time interval for wake dynamics calculations {or default}" s #typedef ^ ParameterType DbKi tmax - - - "Total run time" seconds -typedef ^ ParameterType IntKi NumPlanes - - - "Number of wake planes" - +typedef ^ ParameterType IntKi MaxNumPlanes - - - "Maximum number of wake planes" - typedef ^ ParameterType IntKi NumRadii - - - "Number of radii in the radial finite-difference grid" - +typedef ^ ParameterType ReKi x_Full - - - "Distance of full wake propagation" m +typedef ^ ParameterType ReKi x_Buff - - - "Distance of full wake propagation plus buffer region" m +typedef ^ ParameterType ReKi d_Buff - - - "Length of buffer region" m typedef ^ ParameterType ReKi dr - - - "Radial increment of radial finite-difference grid" m typedef ^ ParameterType ReKi r {:} - - "Discretization of radial finite-difference grid" m typedef ^ ParameterType ReKi y {:} - - "Horizontal discretization of each wake plane (size ny=2nr-1)" m @@ -211,6 +217,7 @@ typedef ^ InputType ReKi Cq_azavg {:} - # ..... Outputs ................................................................................................................... # Define outputs that are contained on the mesh here: +typedef ^ OutputType ReKi NumPlanes - - - "Number of active wake planes (>=2)" - typedef ^ OutputType ReKi xhat_plane {:}{:} - - "Orientations of wake planes, normal to wake planes" - typedef ^ OutputType ReKi p_plane {:}{:} - - "Center positions of wake planes" m typedef ^ OutputType ReKi Vx_wake {:}{:} - - "Axial wake velocity deficit at wake planes, distributed radially" m/s diff --git a/modules/wakedynamics/src/WakeDynamics_Types.f90 b/modules/wakedynamics/src/WakeDynamics_Types.f90 index 289e7e42b8..23368a4d45 100644 --- a/modules/wakedynamics/src/WakeDynamics_Types.f90 +++ b/modules/wakedynamics/src/WakeDynamics_Types.f90 @@ -33,18 +33,19 @@ MODULE WakeDynamics_Types !--------------------------------------------------------------------------------------------------------------------------------- USE NWTC_Library IMPLICIT NONE - INTEGER(IntKi), PUBLIC, PARAMETER :: WakeDiamMod_RotDiam = 1 ! Wake diameter calculation model: rotor diameter [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WakeDiamMod_Velocity = 2 ! Wake diameter calculation model: velocity-based [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WakeDiamMod_MassFlux = 3 ! Wake diameter calculation model: mass-flux based [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: WakeDiamMod_MtmFlux = 4 ! Wake diameter calculation model: momentum-flux based [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_Wake_Polar = 1 ! Wake model [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_Wake_Curl = 2 ! Wake model [-] - INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_Wake_Cartesian = 3 ! Wake model [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WakeDiamMod_RotDiam = 1 ! Wake diameter calculation model: rotor diameter [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WakeDiamMod_Velocity = 2 ! Wake diameter calculation model: velocity-based [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WakeDiamMod_MassFlux = 3 ! Wake diameter calculation model: mass-flux based [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: WakeDiamMod_MtmFlux = 4 ! Wake diameter calculation model: momentum-flux based [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_Wake_Polar = 1 ! Wake model [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_Wake_Curl = 2 ! Wake model [-] + INTEGER(IntKi), PUBLIC, PARAMETER :: Mod_Wake_Cartesian = 3 ! Wake model [-] ! ========= WD_InputFileType ======= TYPE, PUBLIC :: WD_InputFileType REAL(ReKi) :: dr = 0.0_ReKi !< Radial increment of radial finite-difference grid [>0.0] [m] INTEGER(IntKi) :: NumRadii = 0_IntKi !< Number of radii in the radial finite-difference grid [>=2] [-] - INTEGER(IntKi) :: NumPlanes = 0_IntKi !< Number of wake planes [>=2] [-] + INTEGER(IntKi) :: NumDFull = 0_IntKi !< Distance of full wake propagation as a multiple of RotorDiamRef [-] + INTEGER(IntKi) :: NumDBuff = 0_IntKi !< Length of wake propagation buffer region as a multiple of RotorDiamRef [-] INTEGER(IntKi) :: Mod_Wake = 0_IntKi !< Switch between wake formulations 1=Polar, 2=Cartesian, 3=Curl [-] REAL(ReKi) :: f_c = 0.0_ReKi !< Cut-off frequency of the low-pass time-filter for the wake advection, deflection, and meandering model [>0.0] [Hz] REAL(ReKi) :: C_HWkDfl_O = 0.0_ReKi !< Calibrated parameter in the correction for wake deflection defining the horizontal offset at the rotor [m] @@ -82,6 +83,7 @@ MODULE WakeDynamics_Types REAL(ReKi) :: WAT_k_Grad_DMin = 0.0_ReKi !< Calibrated parameter in the eddy viscosity filter function for the WAT radial velocity gradient of the wake deficit defining the transitional diameter fraction between the minimum and exponential regions [>=0.0] or DEFAULT [DEFAULT=0.0] [-] REAL(ReKi) :: WAT_k_Grad_DMax = 0.0_ReKi !< Calibrated parameter in the eddy viscosity filter function for the WAT radial velocity gradient of the wake deficit defining the transitional diameter fraction between the exponential and maximum regions [> WAT_k_Grad_DMin] or DEFAULT [DEFAULT=12.0] [-] REAL(ReKi) :: WAT_k_Grad_Exp = 0.0_ReKi !< Calibrated parameter in the eddy viscosity filter function for the WAT radial velocity gradient of the wake deficit defining the exponent in the exponential region [> 0.0] or DEFAULT [DEFAULT=0.65] [-] + REAL(ReKi) :: RotorDiamRef = 0.0_ReKi !< Reference rotor diameter [m] END TYPE WD_InputFileType ! ======================= ! ========= WD_InitInputType ======= @@ -89,6 +91,7 @@ MODULE WakeDynamics_Types TYPE(WD_InputFileType) :: InputFileData !< FAST.Farm input-file data for wake dynamics [-] INTEGER(IntKi) :: TurbNum = 0 !< Turbine ID number (start with 1; end with number of turbines) [-] CHARACTER(1024) :: OutFileRoot !< The root name derived from the primary FAST.Farm input file [-] + INTEGER(IntKi) :: MaxNumPlanes = 0_IntKi !< Maximum number of wake planes allowed [-] END TYPE WD_InitInputType ! ======================= ! ========= WD_InitOutputType ======= @@ -105,6 +108,7 @@ MODULE WakeDynamics_Types ! ======================= ! ========= WD_DiscreteStateType ======= TYPE, PUBLIC :: WD_DiscreteStateType + REAL(ReKi) :: NumPlanes = 0.0_ReKi !< Number of active wake planes (>=2) [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: xhat_plane !< Orientations of wake planes, normal to wake planes [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: YawErr_filt !< Time-filtered nacelle-yaw error at the wake planes [rad] REAL(ReKi) :: psi_skew_filt = 0.0_ReKi !< Time-filtered azimuth angle from skew vertical axis [rad] @@ -165,8 +169,11 @@ MODULE WakeDynamics_Types ! ========= WD_ParameterType ======= TYPE, PUBLIC :: WD_ParameterType REAL(DbKi) :: dt_low = 0.0_R8Ki !< Time interval for wake dynamics calculations {or default} [s] - INTEGER(IntKi) :: NumPlanes = 0_IntKi !< Number of wake planes [-] + INTEGER(IntKi) :: MaxNumPlanes = 0_IntKi !< Maximum number of wake planes [-] INTEGER(IntKi) :: NumRadii = 0_IntKi !< Number of radii in the radial finite-difference grid [-] + REAL(ReKi) :: x_Full = 0.0_ReKi !< Distance of full wake propagation [m] + REAL(ReKi) :: x_Buff = 0.0_ReKi !< Distance of full wake propagation plus buffer region [m] + REAL(ReKi) :: d_Buff = 0.0_ReKi !< Length of buffer region [m] REAL(ReKi) :: dr = 0.0_ReKi !< Radial increment of radial finite-difference grid [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: r !< Discretization of radial finite-difference grid [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: y !< Horizontal discretization of each wake plane (size ny=2nr-1) [m] @@ -232,6 +239,7 @@ MODULE WakeDynamics_Types ! ======================= ! ========= WD_OutputType ======= TYPE, PUBLIC :: WD_OutputType + REAL(ReKi) :: NumPlanes = 0.0_ReKi !< Number of active wake planes (>=2) [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: xhat_plane !< Orientations of wake planes, normal to wake planes [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: p_plane !< Center positions of wake planes [m] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: Vx_wake !< Axial wake velocity deficit at wake planes, distributed radially [m/s] @@ -244,7 +252,32 @@ MODULE WakeDynamics_Types REAL(ReKi) , DIMENSION(:,:,:), ALLOCATABLE :: WAT_k !< Scaling factor k_mt(iP,y,z) for wake-added turbulence [-] END TYPE WD_OutputType ! ======================= -CONTAINS + integer(IntKi), public, parameter :: WD_x_DummyContState = 1 ! WD%DummyContState + integer(IntKi), public, parameter :: WD_u_xhat_disk = 2 ! WD%xhat_disk + integer(IntKi), public, parameter :: WD_u_YawErr = 3 ! WD%YawErr + integer(IntKi), public, parameter :: WD_u_psi_skew = 4 ! WD%psi_skew + integer(IntKi), public, parameter :: WD_u_chi_skew = 5 ! WD%chi_skew + integer(IntKi), public, parameter :: WD_u_p_hub = 6 ! WD%p_hub + integer(IntKi), public, parameter :: WD_u_V_plane = 7 ! WD%V_plane + integer(IntKi), public, parameter :: WD_u_Vx_wind_disk = 8 ! WD%Vx_wind_disk + integer(IntKi), public, parameter :: WD_u_TI_amb = 9 ! WD%TI_amb + integer(IntKi), public, parameter :: WD_u_D_rotor = 10 ! WD%D_rotor + integer(IntKi), public, parameter :: WD_u_Vx_rel_disk = 11 ! WD%Vx_rel_disk + integer(IntKi), public, parameter :: WD_u_Ct_azavg = 12 ! WD%Ct_azavg + integer(IntKi), public, parameter :: WD_u_Cq_azavg = 13 ! WD%Cq_azavg + integer(IntKi), public, parameter :: WD_y_NumPlanes = 14 ! WD%NumPlanes + integer(IntKi), public, parameter :: WD_y_xhat_plane = 15 ! WD%xhat_plane + integer(IntKi), public, parameter :: WD_y_p_plane = 16 ! WD%p_plane + integer(IntKi), public, parameter :: WD_y_Vx_wake = 17 ! WD%Vx_wake + integer(IntKi), public, parameter :: WD_y_Vr_wake = 18 ! WD%Vr_wake + integer(IntKi), public, parameter :: WD_y_Vx_wake2 = 19 ! WD%Vx_wake2 + integer(IntKi), public, parameter :: WD_y_Vy_wake2 = 20 ! WD%Vy_wake2 + integer(IntKi), public, parameter :: WD_y_Vz_wake2 = 21 ! WD%Vz_wake2 + integer(IntKi), public, parameter :: WD_y_D_wake = 22 ! WD%D_wake + integer(IntKi), public, parameter :: WD_y_x_plane = 23 ! WD%x_plane + integer(IntKi), public, parameter :: WD_y_WAT_k = 24 ! WD%WAT_k + +contains subroutine WD_CopyInputFileType(SrcInputFileTypeData, DstInputFileTypeData, CtrlCode, ErrStat, ErrMsg) type(WD_InputFileType), intent(in) :: SrcInputFileTypeData @@ -257,7 +290,8 @@ subroutine WD_CopyInputFileType(SrcInputFileTypeData, DstInputFileTypeData, Ctrl ErrMsg = '' DstInputFileTypeData%dr = SrcInputFileTypeData%dr DstInputFileTypeData%NumRadii = SrcInputFileTypeData%NumRadii - DstInputFileTypeData%NumPlanes = SrcInputFileTypeData%NumPlanes + DstInputFileTypeData%NumDFull = SrcInputFileTypeData%NumDFull + DstInputFileTypeData%NumDBuff = SrcInputFileTypeData%NumDBuff DstInputFileTypeData%Mod_Wake = SrcInputFileTypeData%Mod_Wake DstInputFileTypeData%f_c = SrcInputFileTypeData%f_c DstInputFileTypeData%C_HWkDfl_O = SrcInputFileTypeData%C_HWkDfl_O @@ -295,6 +329,7 @@ subroutine WD_CopyInputFileType(SrcInputFileTypeData, DstInputFileTypeData, Ctrl DstInputFileTypeData%WAT_k_Grad_DMin = SrcInputFileTypeData%WAT_k_Grad_DMin DstInputFileTypeData%WAT_k_Grad_DMax = SrcInputFileTypeData%WAT_k_Grad_DMax DstInputFileTypeData%WAT_k_Grad_Exp = SrcInputFileTypeData%WAT_k_Grad_Exp + DstInputFileTypeData%RotorDiamRef = SrcInputFileTypeData%RotorDiamRef end subroutine subroutine WD_DestroyInputFileType(InputFileTypeData, ErrStat, ErrMsg) @@ -313,7 +348,8 @@ subroutine WD_PackInputFileType(RF, Indata) if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%dr) call RegPack(RF, InData%NumRadii) - call RegPack(RF, InData%NumPlanes) + call RegPack(RF, InData%NumDFull) + call RegPack(RF, InData%NumDBuff) call RegPack(RF, InData%Mod_Wake) call RegPack(RF, InData%f_c) call RegPack(RF, InData%C_HWkDfl_O) @@ -351,6 +387,7 @@ subroutine WD_PackInputFileType(RF, Indata) call RegPack(RF, InData%WAT_k_Grad_DMin) call RegPack(RF, InData%WAT_k_Grad_DMax) call RegPack(RF, InData%WAT_k_Grad_Exp) + call RegPack(RF, InData%RotorDiamRef) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -361,7 +398,8 @@ subroutine WD_UnPackInputFileType(RF, OutData) if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%dr); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumRadii); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumPlanes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumDFull); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NumDBuff); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Mod_Wake); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%f_c); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%C_HWkDfl_O); if (RegCheckErr(RF, RoutineName)) return @@ -399,6 +437,7 @@ subroutine WD_UnPackInputFileType(RF, OutData) call RegUnpack(RF, OutData%WAT_k_Grad_DMin); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WAT_k_Grad_DMax); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%WAT_k_Grad_Exp); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotorDiamRef); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine WD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) @@ -417,6 +456,7 @@ subroutine WD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSta if (ErrStat >= AbortErrLev) return DstInitInputData%TurbNum = SrcInitInputData%TurbNum DstInitInputData%OutFileRoot = SrcInitInputData%OutFileRoot + DstInitInputData%MaxNumPlanes = SrcInitInputData%MaxNumPlanes end subroutine subroutine WD_DestroyInitInput(InitInputData, ErrStat, ErrMsg) @@ -440,6 +480,7 @@ subroutine WD_PackInitInput(RF, Indata) call WD_PackInputFileType(RF, InData%InputFileData) call RegPack(RF, InData%TurbNum) call RegPack(RF, InData%OutFileRoot) + call RegPack(RF, InData%MaxNumPlanes) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -451,6 +492,7 @@ subroutine WD_UnPackInitInput(RF, OutData) call WD_UnpackInputFileType(RF, OutData%InputFileData) ! InputFileData call RegUnpack(RF, OutData%TurbNum); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%OutFileRoot); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MaxNumPlanes); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine WD_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg) @@ -586,6 +628,7 @@ subroutine WD_CopyDiscState(SrcDiscStateData, DstDiscStateData, CtrlCode, ErrSta character(*), parameter :: RoutineName = 'WD_CopyDiscState' ErrStat = ErrID_None ErrMsg = '' + DstDiscStateData%NumPlanes = SrcDiscStateData%NumPlanes if (allocated(SrcDiscStateData%xhat_plane)) then LB(1:2) = lbound(SrcDiscStateData%xhat_plane) UB(1:2) = ubound(SrcDiscStateData%xhat_plane) @@ -830,6 +873,7 @@ subroutine WD_PackDiscState(RF, Indata) type(WD_DiscreteStateType), intent(in) :: InData character(*), parameter :: RoutineName = 'WD_PackDiscState' if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%NumPlanes) call RegPackAlloc(RF, InData%xhat_plane) call RegPackAlloc(RF, InData%YawErr_filt) call RegPack(RF, InData%psi_skew_filt) @@ -859,6 +903,7 @@ subroutine WD_UnPackDiscState(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%NumPlanes); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%xhat_plane); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%YawErr_filt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%psi_skew_filt); if (RegCheckErr(RF, RoutineName)) return @@ -1370,8 +1415,11 @@ subroutine WD_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) ErrStat = ErrID_None ErrMsg = '' DstParamData%dt_low = SrcParamData%dt_low - DstParamData%NumPlanes = SrcParamData%NumPlanes + DstParamData%MaxNumPlanes = SrcParamData%MaxNumPlanes DstParamData%NumRadii = SrcParamData%NumRadii + DstParamData%x_Full = SrcParamData%x_Full + DstParamData%x_Buff = SrcParamData%x_Buff + DstParamData%d_Buff = SrcParamData%d_Buff DstParamData%dr = SrcParamData%dr if (allocated(SrcParamData%r)) then LB(1:1) = lbound(SrcParamData%r) @@ -1476,8 +1524,11 @@ subroutine WD_PackParam(RF, Indata) character(*), parameter :: RoutineName = 'WD_PackParam' if (RF%ErrStat >= AbortErrLev) return call RegPack(RF, InData%dt_low) - call RegPack(RF, InData%NumPlanes) + call RegPack(RF, InData%MaxNumPlanes) call RegPack(RF, InData%NumRadii) + call RegPack(RF, InData%x_Full) + call RegPack(RF, InData%x_Buff) + call RegPack(RF, InData%d_Buff) call RegPack(RF, InData%dr) call RegPackAlloc(RF, InData%r) call RegPackAlloc(RF, InData%y) @@ -1535,8 +1586,11 @@ subroutine WD_UnPackParam(RF, OutData) logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return call RegUnpack(RF, OutData%dt_low); if (RegCheckErr(RF, RoutineName)) return - call RegUnpack(RF, OutData%NumPlanes); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MaxNumPlanes); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumRadii); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%x_Full); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%x_Buff); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%d_Buff); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%dr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%r); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%y); if (RegCheckErr(RF, RoutineName)) return @@ -1713,6 +1767,7 @@ subroutine WD_CopyOutput(SrcOutputData, DstOutputData, CtrlCode, ErrStat, ErrMsg character(*), parameter :: RoutineName = 'WD_CopyOutput' ErrStat = ErrID_None ErrMsg = '' + DstOutputData%NumPlanes = SrcOutputData%NumPlanes if (allocated(SrcOutputData%xhat_plane)) then LB(1:2) = lbound(SrcOutputData%xhat_plane) UB(1:2) = ubound(SrcOutputData%xhat_plane) @@ -1879,6 +1934,7 @@ subroutine WD_PackOutput(RF, Indata) type(WD_OutputType), intent(in) :: InData character(*), parameter :: RoutineName = 'WD_PackOutput' if (RF%ErrStat >= AbortErrLev) return + call RegPack(RF, InData%NumPlanes) call RegPackAlloc(RF, InData%xhat_plane) call RegPackAlloc(RF, InData%p_plane) call RegPackAlloc(RF, InData%Vx_wake) @@ -1900,6 +1956,7 @@ subroutine WD_UnPackOutput(RF, OutData) integer(IntKi) :: stat logical :: IsAllocAssoc if (RF%ErrStat /= ErrID_None) return + call RegUnpack(RF, OutData%NumPlanes); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%xhat_plane); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%p_plane); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%Vx_wake); if (RegCheckErr(RF, RoutineName)) return @@ -1911,5 +1968,346 @@ subroutine WD_UnPackOutput(RF, OutData) call RegUnpackAlloc(RF, OutData%x_plane); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%WAT_k); if (RegCheckErr(RF, RoutineName)) return end subroutine + +function WD_InputMeshPointer(u, DL) result(Mesh) + type(WD_InputType), target, intent(in) :: u + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +function WD_OutputMeshPointer(y, DL) result(Mesh) + type(WD_OutputType), target, intent(in) :: y + type(DatLoc), intent(in) :: DL + type(MeshType), pointer :: Mesh + nullify(Mesh) + select case (DL%Num) + end select +end function + +subroutine WD_VarsPackContState(Vars, x, ValAry) + type(WD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call WD_VarPackContState(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine WD_VarPackContState(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(WD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WD_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine WD_VarsUnpackContState(Vars, ValAry, x) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(WD_ContinuousStateType), intent(inout) :: x + integer(IntKi) :: i + do i = 1, size(Vars%x) + call WD_VarUnpackContState(Vars%x(i), ValAry, x) + end do +end subroutine + +subroutine WD_VarUnpackContState(V, ValAry, x) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(WD_ContinuousStateType), intent(inout) :: x + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WD_x_DummyContState) + x%DummyContState = VarVals(1) ! Scalar + end select + end associate +end subroutine + +function WD_ContinuousStateFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (WD_x_DummyContState) + Name = "x%DummyContState" + case default + Name = "Unknown Field" + end select +end function + +subroutine WD_VarsPackContStateDeriv(Vars, x, ValAry) + type(WD_ContinuousStateType), intent(in) :: x + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%x) + call WD_VarPackContStateDeriv(Vars%x(i), x, ValAry) + end do +end subroutine + +subroutine WD_VarPackContStateDeriv(V, x, ValAry) + type(ModVarType), intent(in) :: V + type(WD_ContinuousStateType), intent(in) :: x + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WD_x_DummyContState) + VarVals(1) = x%DummyContState ! Scalar + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine WD_VarsPackInput(Vars, u, ValAry) + type(WD_InputType), intent(in) :: u + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%u) + call WD_VarPackInput(Vars%u(i), u, ValAry) + end do +end subroutine + +subroutine WD_VarPackInput(V, u, ValAry) + type(ModVarType), intent(in) :: V + type(WD_InputType), intent(in) :: u + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WD_u_xhat_disk) + VarVals = u%xhat_disk(V%iLB:V%iUB) ! Rank 1 Array + case (WD_u_YawErr) + VarVals(1) = u%YawErr ! Scalar + case (WD_u_psi_skew) + VarVals(1) = u%psi_skew ! Scalar + case (WD_u_chi_skew) + VarVals(1) = u%chi_skew ! Scalar + case (WD_u_p_hub) + VarVals = u%p_hub(V%iLB:V%iUB) ! Rank 1 Array + case (WD_u_V_plane) + VarVals = u%V_plane(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (WD_u_Vx_wind_disk) + VarVals(1) = u%Vx_wind_disk ! Scalar + case (WD_u_TI_amb) + VarVals(1) = u%TI_amb ! Scalar + case (WD_u_D_rotor) + VarVals(1) = u%D_rotor ! Scalar + case (WD_u_Vx_rel_disk) + VarVals(1) = u%Vx_rel_disk ! Scalar + case (WD_u_Ct_azavg) + VarVals = u%Ct_azavg(V%iLB:V%iUB) ! Rank 1 Array + case (WD_u_Cq_azavg) + VarVals = u%Cq_azavg(V%iLB:V%iUB) ! Rank 1 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine WD_VarsUnpackInput(Vars, ValAry, u) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(WD_InputType), intent(inout) :: u + integer(IntKi) :: i + do i = 1, size(Vars%u) + call WD_VarUnpackInput(Vars%u(i), ValAry, u) + end do +end subroutine + +subroutine WD_VarUnpackInput(V, ValAry, u) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(WD_InputType), intent(inout) :: u + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WD_u_xhat_disk) + u%xhat_disk(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (WD_u_YawErr) + u%YawErr = VarVals(1) ! Scalar + case (WD_u_psi_skew) + u%psi_skew = VarVals(1) ! Scalar + case (WD_u_chi_skew) + u%chi_skew = VarVals(1) ! Scalar + case (WD_u_p_hub) + u%p_hub(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (WD_u_V_plane) + u%V_plane(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (WD_u_Vx_wind_disk) + u%Vx_wind_disk = VarVals(1) ! Scalar + case (WD_u_TI_amb) + u%TI_amb = VarVals(1) ! Scalar + case (WD_u_D_rotor) + u%D_rotor = VarVals(1) ! Scalar + case (WD_u_Vx_rel_disk) + u%Vx_rel_disk = VarVals(1) ! Scalar + case (WD_u_Ct_azavg) + u%Ct_azavg(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (WD_u_Cq_azavg) + u%Cq_azavg(V%iLB:V%iUB) = VarVals ! Rank 1 Array + end select + end associate +end subroutine + +function WD_InputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (WD_u_xhat_disk) + Name = "u%xhat_disk" + case (WD_u_YawErr) + Name = "u%YawErr" + case (WD_u_psi_skew) + Name = "u%psi_skew" + case (WD_u_chi_skew) + Name = "u%chi_skew" + case (WD_u_p_hub) + Name = "u%p_hub" + case (WD_u_V_plane) + Name = "u%V_plane" + case (WD_u_Vx_wind_disk) + Name = "u%Vx_wind_disk" + case (WD_u_TI_amb) + Name = "u%TI_amb" + case (WD_u_D_rotor) + Name = "u%D_rotor" + case (WD_u_Vx_rel_disk) + Name = "u%Vx_rel_disk" + case (WD_u_Ct_azavg) + Name = "u%Ct_azavg" + case (WD_u_Cq_azavg) + Name = "u%Cq_azavg" + case default + Name = "Unknown Field" + end select +end function + +subroutine WD_VarsPackOutput(Vars, y, ValAry) + type(WD_OutputType), intent(in) :: y + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(inout) :: ValAry(:) + integer(IntKi) :: i + do i = 1, size(Vars%y) + call WD_VarPackOutput(Vars%y(i), y, ValAry) + end do +end subroutine + +subroutine WD_VarPackOutput(V, y, ValAry) + type(ModVarType), intent(in) :: V + type(WD_OutputType), intent(in) :: y + real(R8Ki), intent(inout) :: ValAry(:) + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WD_y_NumPlanes) + VarVals(1) = y%NumPlanes ! Scalar + case (WD_y_xhat_plane) + VarVals = y%xhat_plane(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (WD_y_p_plane) + VarVals = y%p_plane(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (WD_y_Vx_wake) + VarVals = y%Vx_wake(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (WD_y_Vr_wake) + VarVals = y%Vr_wake(V%iLB:V%iUB,V%j) ! Rank 2 Array + case (WD_y_Vx_wake2) + VarVals = y%Vx_wake2(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (WD_y_Vy_wake2) + VarVals = y%Vy_wake2(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (WD_y_Vz_wake2) + VarVals = y%Vz_wake2(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case (WD_y_D_wake) + VarVals = y%D_wake(V%iLB:V%iUB) ! Rank 1 Array + case (WD_y_x_plane) + VarVals = y%x_plane(V%iLB:V%iUB) ! Rank 1 Array + case (WD_y_WAT_k) + VarVals = y%WAT_k(V%iLB:V%iUB, V%j, V%k) ! Rank 3 Array + case default + VarVals = 0.0_R8Ki + end select + end associate +end subroutine + +subroutine WD_VarsUnpackOutput(Vars, ValAry, y) + type(ModVarsType), intent(in) :: Vars + real(R8Ki), intent(in) :: ValAry(:) + type(WD_OutputType), intent(inout) :: y + integer(IntKi) :: i + do i = 1, size(Vars%y) + call WD_VarUnpackOutput(Vars%y(i), ValAry, y) + end do +end subroutine + +subroutine WD_VarUnpackOutput(V, ValAry, y) + type(ModVarType), intent(in) :: V + real(R8Ki), intent(in) :: ValAry(:) + type(WD_OutputType), intent(inout) :: y + associate (DL => V%DL, VarVals => ValAry(V%iLoc(1):V%iLoc(2))) + select case (DL%Num) + case (WD_y_NumPlanes) + y%NumPlanes = VarVals(1) ! Scalar + case (WD_y_xhat_plane) + y%xhat_plane(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (WD_y_p_plane) + y%p_plane(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (WD_y_Vx_wake) + y%Vx_wake(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (WD_y_Vr_wake) + y%Vr_wake(V%iLB:V%iUB, V%j) = VarVals ! Rank 2 Array + case (WD_y_Vx_wake2) + y%Vx_wake2(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (WD_y_Vy_wake2) + y%Vy_wake2(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (WD_y_Vz_wake2) + y%Vz_wake2(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + case (WD_y_D_wake) + y%D_wake(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (WD_y_x_plane) + y%x_plane(V%iLB:V%iUB) = VarVals ! Rank 1 Array + case (WD_y_WAT_k) + y%WAT_k(V%iLB:V%iUB, V%j, V%k) = VarVals ! Rank 3 Array + end select + end associate +end subroutine + +function WD_OutputFieldName(DL) result(Name) + type(DatLoc), intent(in) :: DL + character(32) :: Name + select case (DL%Num) + case (WD_y_NumPlanes) + Name = "y%NumPlanes" + case (WD_y_xhat_plane) + Name = "y%xhat_plane" + case (WD_y_p_plane) + Name = "y%p_plane" + case (WD_y_Vx_wake) + Name = "y%Vx_wake" + case (WD_y_Vr_wake) + Name = "y%Vr_wake" + case (WD_y_Vx_wake2) + Name = "y%Vx_wake2" + case (WD_y_Vy_wake2) + Name = "y%Vy_wake2" + case (WD_y_Vz_wake2) + Name = "y%Vz_wake2" + case (WD_y_D_wake) + Name = "y%D_wake" + case (WD_y_x_plane) + Name = "y%x_plane" + case (WD_y_WAT_k) + Name = "y%WAT_k" + case default + Name = "Unknown Field" + end select +end function + END MODULE WakeDynamics_Types + !ENDOFREGISTRYGENERATEDFILE diff --git a/openfast_io/openfast_io/FAST_reader.py b/openfast_io/openfast_io/FAST_reader.py index 7f28ce44b0..07f7d0d2ed 100644 --- a/openfast_io/openfast_io/FAST_reader.py +++ b/openfast_io/openfast_io/FAST_reader.py @@ -1,3 +1,4 @@ +from numbers import Number import os, re, copy import numpy as np from functools import reduce @@ -121,7 +122,8 @@ def bool_read(text): if 'default' in text.lower(): return str(text) else: - if text.lower() == 'true': + text = text.lower() + if text == 'true' or text == 't': return True else: return False @@ -334,13 +336,18 @@ def read_MainInput(self): self.fst_vt['Fst']['AbortLevel'] = quoted_read(f.readline().split()[0]) self.fst_vt['Fst']['TMax'] = float_read(f.readline().split()[0]) self.fst_vt['Fst']['DT'] = float_read(f.readline().split()[0]) + self.fst_vt['Fst']['ModCoupling'] = int(f.readline().split()[0]) self.fst_vt['Fst']['InterpOrder'] = int(f.readline().split()[0]) self.fst_vt['Fst']['NumCrctn'] = int(f.readline().split()[0]) + self.fst_vt['Fst']['RhoInf'] = float_read(f.readline().split()[0]) + self.fst_vt['Fst']['ConvTol'] = float_read(f.readline().split()[0]) + self.fst_vt['Fst']['MaxConvIter'] = int(f.readline().split()[0]) self.fst_vt['Fst']['DT_UJac'] = float_read(f.readline().split()[0]) self.fst_vt['Fst']['UJacSclFact'] = float_read(f.readline().split()[0]) # Feature Switches and Flags (ftr_swtchs_flgs) f.readline() + self.fst_vt['Fst']['NRotors'] = int(f.readline().split()[0]) self.fst_vt['Fst']['CompElast'] = int(f.readline().split()[0]) self.fst_vt['Fst']['CompInflow'] = int(f.readline().split()[0]) self.fst_vt['Fst']['CompAero'] = int(f.readline().split()[0]) @@ -350,7 +357,13 @@ def read_MainInput(self): self.fst_vt['Fst']['CompSub'] = int(f.readline().split()[0]) self.fst_vt['Fst']['CompMooring'] = int(f.readline().split()[0]) self.fst_vt['Fst']['CompIce'] = int(f.readline().split()[0]) + self.fst_vt['Fst']['CompSoil'] = int(f.readline().split()[0]) self.fst_vt['Fst']['MHK'] = int(f.readline().split()[0]) + self.fst_vt['Fst']['MirrorRotor'] = read_array(f, self.fst_vt['Fst']['NRotors'], array_type=bool) + + if self.fst_vt['Fst']['NRotors'] > 1: + raise ValueError('openfast_io does not currently support multi-rotor turbines (NRotors > 1),' + + 'this feature will be added in a future release') # Environmental conditions f.readline() @@ -378,6 +391,19 @@ def read_MainInput(self): self.fst_vt['Fst']['SubFile'] = quoted_read(f.readline().split()[0]) self.fst_vt['Fst']['MooringFile'] = quoted_read(f.readline().split()[0]) self.fst_vt['Fst']['IceFile'] = quoted_read(f.readline().split()[0]) + self.fst_vt['Fst']['SoilFile'] = quoted_read(f.readline().split()[0]) + # self.fst_vt['Fst']['EDFiles'] = [self.fst_vt['Fst']['EDFile']] + # self.fst_vt['Fst']['BDBldFiles(1)'] = [self.fst_vt['Fst']['BDBldFile(1)']] + # self.fst_vt['Fst']['BDBldFiles(2)'] = [self.fst_vt['Fst']['BDBldFile(2)']] + # self.fst_vt['Fst']['BDBldFiles(3)'] = [self.fst_vt['Fst']['BDBldFile(3)']] + # self.fst_vt['Fst']['ServoFiles'] = [self.fst_vt['Fst']['ServoFile']] + # for i in range(1, self.fst_vt['Fst']['NRotors']): + # f.readline() + # self.fst_vt['Fst']['EDFiles'].append(quoted_read(f.readline().split()[0])) + # self.fst_vt['Fst']['BDBldFiles(1)'].append(quoted_read(f.readline().split()[0])) + # self.fst_vt['Fst']['BDBldFiles(2)'].append(quoted_read(f.readline().split()[0])) + # self.fst_vt['Fst']['BDBldFiles(3)'].append(quoted_read(f.readline().split()[0])) + # self.fst_vt['Fst']['ServoFiles'].append(quoted_read(f.readline().split()[0])) # FAST Output Parameters (fst_output_params) f.readline() @@ -448,6 +474,7 @@ def read_ElastoDyn(self, ed_file): self.fst_vt['ElastoDyn']['FlapDOF1'] = bool_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['FlapDOF2'] = bool_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['EdgeDOF'] = bool_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['PitchDOF'] = bool_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['TeetDOF'] = bool_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['DrTrDOF'] = bool_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['GenDOF'] = bool_read(f.readline().split()[0]) @@ -511,6 +538,8 @@ def read_ElastoDyn(self, ed_file): self.fst_vt['ElastoDyn']['PtfmCMxt'] = float_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['PtfmCMyt'] = float_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['PtfmCMzt'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['PtfmRefxt'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['PtfmRefyt'] = float_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['PtfmRefzt'] = float_read(f.readline().split()[0]) # Mass and Inertia (mass_inertia) @@ -518,6 +547,12 @@ def read_ElastoDyn(self, ed_file): self.fst_vt['ElastoDyn']['TipMass(1)'] = float_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['TipMass(2)'] = float_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['TipMass(3)'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['PBrIner(1)'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['PBrIner(2)'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['PBrIner(3)'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['BlPIner(1)'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['BlPIner(2)'] = float_read(f.readline().split()[0]) + self.fst_vt['ElastoDyn']['BlPIner(3)'] = float_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['HubMass'] = float_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['HubIner'] = float_read(f.readline().split()[0]) self.fst_vt['ElastoDyn']['HubIner_Teeter'] = float_read(f.readline().split()[0]) @@ -698,12 +733,11 @@ def read_ElastoDynBlade(self, blade_file, BladeNumber = 0): self.fst_vt['ElastoDynBlade'][BladeNumber]['AdjFlSt'] = float_read(f.readline().split()[0]) self.fst_vt['ElastoDynBlade'][BladeNumber]['AdjEdSt'] = float_read(f.readline().split()[0]) - # Distrilbuted Blade Properties + # Distributed Blade Properties f.readline() f.readline() f.readline() self.fst_vt['ElastoDynBlade'][BladeNumber]['BlFract'] = [None] * self.fst_vt['ElastoDynBlade'][BladeNumber]['NBlInpSt'] - self.fst_vt['ElastoDynBlade'][BladeNumber]['PitchAxis'] = [None] * self.fst_vt['ElastoDynBlade'][BladeNumber]['NBlInpSt'] self.fst_vt['ElastoDynBlade'][BladeNumber]['StrcTwst'] = [None] * self.fst_vt['ElastoDynBlade'][BladeNumber]['NBlInpSt'] self.fst_vt['ElastoDynBlade'][BladeNumber]['BMassDen'] = [None] * self.fst_vt['ElastoDynBlade'][BladeNumber]['NBlInpSt'] self.fst_vt['ElastoDynBlade'][BladeNumber]['FlpStff'] = [None] * self.fst_vt['ElastoDynBlade'][BladeNumber]['NBlInpSt'] @@ -712,11 +746,10 @@ def read_ElastoDynBlade(self, blade_file, BladeNumber = 0): for i in range(self.fst_vt['ElastoDynBlade'][BladeNumber]['NBlInpSt']): data = f.readline().split() self.fst_vt['ElastoDynBlade'][BladeNumber]['BlFract'][i] = float_read(data[0]) - self.fst_vt['ElastoDynBlade'][BladeNumber]['PitchAxis'][i] = float_read(data[1]) - self.fst_vt['ElastoDynBlade'][BladeNumber]['StrcTwst'][i] = float_read(data[2]) - self.fst_vt['ElastoDynBlade'][BladeNumber]['BMassDen'][i] = float_read(data[3]) - self.fst_vt['ElastoDynBlade'][BladeNumber]['FlpStff'][i] = float_read(data[4]) - self.fst_vt['ElastoDynBlade'][BladeNumber]['EdgStff'][i] = float_read(data[5]) + self.fst_vt['ElastoDynBlade'][BladeNumber]['StrcTwst'][i] = float_read(data[1]) + self.fst_vt['ElastoDynBlade'][BladeNumber]['BMassDen'][i] = float_read(data[2]) + self.fst_vt['ElastoDynBlade'][BladeNumber]['FlpStff'][i] = float_read(data[3]) + self.fst_vt['ElastoDynBlade'][BladeNumber]['EdgStff'][i] = float_read(data[4]) f.readline() self.fst_vt['ElastoDynBlade'][BladeNumber]['BldFl1Sh'] = [None] * 5 @@ -846,12 +879,6 @@ def read_BeamDyn(self, bd_file, BladeNumber = 0): #---------------------- MATERIAL PARAMETER -------------------------------------- f.readline() self.fst_vt['BeamDyn'][BladeNumber]['BldFile'] = f.readline().split()[0].replace('"','').replace("'",'') - #---------------------- PITCH ACTUATOR PARAMETERS ------------------------------- - f.readline() - self.fst_vt['BeamDyn'][BladeNumber]['UsePitchAct'] = bool_read(f.readline().split()[0]) - self.fst_vt['BeamDyn'][BladeNumber]['PitchJ'] = float_read(f.readline().split()[0]) - self.fst_vt['BeamDyn'][BladeNumber]['PitchK'] = float_read(f.readline().split()[0]) - self.fst_vt['BeamDyn'][BladeNumber]['PitchC'] = float_read(f.readline().split()[0]) #---------------------- OUTPUTS ------------------------------------------------- f.readline() self.fst_vt['BeamDyn'][BladeNumber]['SumPrint'] = bool_read(f.readline().split()[0]) @@ -896,7 +923,7 @@ def read_BeamDynBlade(self, beamdyn_blade_file, BladeNumber = 0): f.readline() f.readline() f.readline() - #---------------------- DAMPING COEFFICIENT------------------------------------ + #------ Stiffness-Proportional Damping [used only if damp_type=1] --------------- ln = f.readline().split() self.fst_vt['BeamDynBlade'][BladeNumber]['mu1'] = float(ln[0]) self.fst_vt['BeamDynBlade'][BladeNumber]['mu2'] = float(ln[1]) @@ -905,7 +932,12 @@ def read_BeamDynBlade(self, beamdyn_blade_file, BladeNumber = 0): self.fst_vt['BeamDynBlade'][BladeNumber]['mu5'] = float(ln[4]) self.fst_vt['BeamDynBlade'][BladeNumber]['mu6'] = float(ln[5]) f.readline() - #---------------------- DISTRIBUTED PROPERTIES--------------------------------- + # ------ Modal Damping [used only if damp_type=2] -------------------------------- + n_modes = int(f.readline().split()[0]) + self.fst_vt['BeamDynBlade'][BladeNumber]['n_modes'] = n_modes + self.fst_vt['BeamDynBlade'][BladeNumber]['zeta'] = np.array(f.readline().strip().replace(',', ' ').split()[:n_modes], dtype=float).tolist() + f.readline() + #------ Distributed Properties -------------------------------------------------- self.fst_vt['BeamDynBlade'][BladeNumber]['radial_stations'] = np.zeros((self.fst_vt['BeamDynBlade'][BladeNumber]['station_total'])) self.fst_vt['BeamDynBlade'][BladeNumber]['beam_stiff'] = np.zeros((self.fst_vt['BeamDynBlade'][BladeNumber]['station_total'], 6, 6)) @@ -1037,7 +1069,6 @@ def read_AeroDyn(self): self.fst_vt['AeroDyn']['TwrShadow'] = int(f.readline().split()[0]) self.fst_vt['AeroDyn']['TwrAero'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn']['CavitCheck'] = bool_read(f.readline().split()[0]) - self.fst_vt['AeroDyn']['Buoyancy'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn']['NacelleDrag'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn']['CompAA'] = bool_read(f.readline().split()[0]) self.fst_vt['AeroDyn']['AA_InputFile'] = f.readline().split()[0] @@ -1156,6 +1187,8 @@ def read_AeroDyn(self): self.fst_vt['AeroDyn']['TwrCd'] = [None]*self.fst_vt['AeroDyn']['NumTwrNds'] self.fst_vt['AeroDyn']['TwrTI'] = [None]*self.fst_vt['AeroDyn']['NumTwrNds'] self.fst_vt['AeroDyn']['TwrCb'] = [None]*self.fst_vt['AeroDyn']['NumTwrNds'] + self.fst_vt['AeroDyn']['TwrCp'] = [None]*self.fst_vt['AeroDyn']['NumTwrNds'] + self.fst_vt['AeroDyn']['TwrCa'] = [None]*self.fst_vt['AeroDyn']['NumTwrNds'] for i in range(self.fst_vt['AeroDyn']['NumTwrNds']): data = [float(val) for val in f.readline().split()] self.fst_vt['AeroDyn']['TwrElev'][i] = data[0] @@ -1163,6 +1196,8 @@ def read_AeroDyn(self): self.fst_vt['AeroDyn']['TwrCd'][i] = data[2] self.fst_vt['AeroDyn']['TwrTI'][i] = data[3] self.fst_vt['AeroDyn']['TwrCb'][i] = data[4] + self.fst_vt['AeroDyn']['TwrCp'][i] = data[5] + self.fst_vt['AeroDyn']['TwrCa'][i] = data[6] # Outputs f.readline() @@ -1237,6 +1272,7 @@ def read_AeroDynBlade(self, ad_blade_file, BladeNumber = 0): f.readline() f.readline() self.fst_vt['AeroDynBlade'][BladeNumber]['BlSpn'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] + self.fst_vt['AeroDynBlade'][BladeNumber]['t_c'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] self.fst_vt['AeroDynBlade'][BladeNumber]['BlCrvAC'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] self.fst_vt['AeroDynBlade'][BladeNumber]['BlSwpAC'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] self.fst_vt['AeroDynBlade'][BladeNumber]['BlCrvAng'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] @@ -1246,6 +1282,11 @@ def read_AeroDynBlade(self, ad_blade_file, BladeNumber = 0): self.fst_vt['AeroDynBlade'][BladeNumber]['BlCb'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] self.fst_vt['AeroDynBlade'][BladeNumber]['BlCenBn'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] self.fst_vt['AeroDynBlade'][BladeNumber]['BlCenBt'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCpn'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCpt'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCan'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCat'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCam'] = [None]*self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds'] for i in range(self.fst_vt['AeroDynBlade'][BladeNumber]['NumBlNds']): data = [float(val) for val in f.readline().split()] self.fst_vt['AeroDynBlade'][BladeNumber]['BlSpn'][i] = data[0] @@ -1255,14 +1296,26 @@ def read_AeroDynBlade(self, ad_blade_file, BladeNumber = 0): self.fst_vt['AeroDynBlade'][BladeNumber]['BlTwist'][i] = data[4] self.fst_vt['AeroDynBlade'][BladeNumber]['BlChord'][i] = data[5] self.fst_vt['AeroDynBlade'][BladeNumber]['BlAFID'][i] = data[6] - if len(data) == 9: - self.fst_vt['AeroDynBlade'][BladeNumber]['BlCb'][i] = data[7] - self.fst_vt['AeroDynBlade'][BladeNumber]['BlCenBn'][i] = data[8] - self.fst_vt['AeroDynBlade'][BladeNumber]['BlCenBt'][i] = data[9] + if len(data) == 16: + self.fst_vt['AeroDynBlade'][BladeNumber]['t_c'][i] = data[7] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCb'][i] = data[8] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCenBn'][i] = data[9] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCenBt'][i] = data[10] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCpn'][i] = data[11] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCpt'][i] = data[12] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCan'][i] = data[13] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCat'][i] = data[14] + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCam'][i] = data[15] else: + self.fst_vt['AeroDynBlade'][BladeNumber]['t_c'][i] = 0.0 self.fst_vt['AeroDynBlade'][BladeNumber]['BlCb'][i] = 0.0 self.fst_vt['AeroDynBlade'][BladeNumber]['BlCenBn'][i] = 0.0 self.fst_vt['AeroDynBlade'][BladeNumber]['BlCenBt'][i] = 0.0 + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCpn'][i] = 0.0 + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCpt'][i] = 0.0 + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCan'][i] = 0.0 + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCat'][i] = 0.0 + self.fst_vt['AeroDynBlade'][BladeNumber]['BlCam'][i] = 0.0 f.close() @@ -1513,9 +1566,18 @@ def read_ServoDyn(self): f.readline() self.fst_vt['ServoDyn']['PCMode'] = int(f.readline().split()[0]) self.fst_vt['ServoDyn']['TPCOn'] = float_read(f.readline().split()[0]) - self.fst_vt['ServoDyn']['TPitManS1'] = float_read(f.readline().split()[0]) - self.fst_vt['ServoDyn']['TPitManS2'] = float_read(f.readline().split()[0]) - self.fst_vt['ServoDyn']['TPitManS3'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['PitNeut(1)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['PitNeut(2)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['PitNeut(3)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['PitSpr(1)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['PitSpr(2)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['PitSpr(3)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['PitDamp(1)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['PitDamp(2)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['PitDamp(3)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['TPitManS(1)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['TPitManS(2)'] = float_read(f.readline().split()[0]) + self.fst_vt['ServoDyn']['TPitManS(3)'] = float_read(f.readline().split()[0]) self.fst_vt['ServoDyn']['PitManRat(1)'] = float_read(f.readline().split()[0]) self.fst_vt['ServoDyn']['PitManRat(2)'] = float_read(f.readline().split()[0]) self.fst_vt['ServoDyn']['PitManRat(3)'] = float_read(f.readline().split()[0]) @@ -1678,7 +1740,7 @@ def read_StC(self,filename): f.readline() StC_vt['Echo'] = bool_read(f.readline().split()[0]) # Echo - Echo input data to .ech (flag) f.readline() # StC DEGREES OF FREEDOM - StC_vt['StC_DOF_MODE'] = int_read(f.readline().split()[0]) # 4 StC_DOF_MODE - DOF mode (switch) {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: TLCD; 4: Prescribed force/moment time series} + StC_vt['StC_DOF_MODE'] = int_read(f.readline().split()[0]) # 4 StC_DOF_MODE - DOF mode (switch) {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: StC_XYZ_DOF (Omni-Directional StC); 5: TLCD; 6: Prescribed force/moment time series; 7: Force determined by external DLL} StC_vt['StC_X_DOF'] = bool_read(f.readline().split()[0]) # false StC_X_DOF - DOF on or off for StC X (flag) [Used only when StC_DOF_MODE=1] StC_vt['StC_Y_DOF'] = bool_read(f.readline().split()[0]) # false StC_Y_DOF - DOF on or off for StC Y (flag) [Used only when StC_DOF_MODE=1] StC_vt['StC_Z_DOF'] = bool_read(f.readline().split()[0]) # false StC_Z_DOF - DOF on or off for StC Z (flag) [Used only when StC_DOF_MODE=1] @@ -1702,7 +1764,7 @@ def read_StC(self,filename): StC_vt['StC_X_M'] = float_read(f.readline().split()[0]) # 0 StC_X_M - StC X mass (kg) [must equal StC_Y_M for StC_DOF_MODE = 2] StC_vt['StC_Y_M'] = float_read(f.readline().split()[0]) # 50 StC_Y_M - StC Y mass (kg) [must equal StC_X_M for StC_DOF_MODE = 2] StC_vt['StC_Z_M'] = float_read(f.readline().split()[0]) # 0 StC_Z_M - StC Z mass (kg) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] - StC_vt['StC_XY_M'] = float_read(f.readline().split()[0]) # 0 StC_XY_M - StC XY mass (kg) [used only when StC_DOF_MODE=2] + StC_vt['StC_Omni_M'] = float_read(f.readline().split()[0]) # 0 StC_Omni_M - StC omni mass (kg) [used only when StC_DOF_MODE=2 or 3] StC_vt['StC_X_K'] = float_read(f.readline().split()[0]) # 2300 StC_X_K - StC X stiffness (N/m) StC_vt['StC_Y_K'] = float_read(f.readline().split()[0]) # 2300 StC_Y_K - StC Y stiffness (N/m) StC_vt['StC_Z_K'] = float_read(f.readline().split()[0]) # 0 StC_Z_K - StC Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE] @@ -1748,7 +1810,7 @@ def read_StC(self,filename): # StructCtrl CONTROL, skip this readline() because it already happened f.readline() - StC_vt['StC_CMODE'] = int_read(f.readline().split()[0]) # 5 StC_CMODE - Control mode (switch) {0:none; 1: Semi-Active Control Mode; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} + StC_vt['StC_CMODE'] = int_read(f.readline().split()[0]) # 5 StC_CMODE - Control mode (switch) {0:none; 1: Semi-Active Control Mode; 3: Active Control Mode through user subroutine; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface} StC_vt['StC_CChan'] = int_read(f.readline().split()[0]) # 0 StC_CChan - Control channel group (1:10) for stiffness and damping (StC_[XYZ]_K, StC_[XYZ]_C, and StC_[XYZ]_Brake) (specify additional channels for blade instances of StC active control -- one channel per blade) [used only when StC_DOF_MODE=1 or 2, and StC_CMODE=4 or 5] StC_vt['StC_SA_MODE'] = int_read(f.readline().split()[0]) # 1 StC_SA_MODE - Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} (-) StC_vt['StC_X_C_LOW'] = float_read(f.readline().split()[0]) # 0 StC_X_C_LOW - StC X low damping for ground hook control @@ -1881,6 +1943,7 @@ def read_HydroDyn(self, hd_file): self.fst_vt['HydroDyn']['PtfmVol0'] = read_array(f,self.fst_vt['HydroDyn']['NBody'], array_type=float) self.fst_vt['HydroDyn']['PtfmCOBxt'] = read_array(f,self.fst_vt['HydroDyn']['NBody'], array_type=float) self.fst_vt['HydroDyn']['PtfmCOByt'] = read_array(f,self.fst_vt['HydroDyn']['NBody'], array_type=float) + self.fst_vt['HydroDyn']['NAddDOF'] = read_array(f,self.fst_vt['HydroDyn']['NBody'], array_type=int) # 2ND-ORDER FLOATING PLATFORM FORCES f.readline() @@ -1908,6 +1971,7 @@ def read_HydroDyn(self, hd_file): f.readline() self.fst_vt['HydroDyn']['WaveDisp'] = int_read(f.readline().split()[0]) self.fst_vt['HydroDyn']['AMMod'] = int_read(f.readline().split()[0]) + self.fst_vt['HydroDyn']['HstMod'] = int_read(f.readline().split()[0]) #AXIAL COEFFICIENTS f.readline() @@ -2387,6 +2451,7 @@ def read_SeaState(self, ss_file): f.readline() self.fst_vt['SeaState']['WaveMod'] = int_read(f.readline().split()[0]) self.fst_vt['SeaState']['WaveStMod'] = int_read(f.readline().split()[0]) + self.fst_vt['SeaState']['WvCrntMod'] = int_read(f.readline().split()[0]) self.fst_vt['SeaState']['WaveTMax'] = float_read(f.readline().split()[0]) self.fst_vt['SeaState']['WaveDT'] = float_read(f.readline().split()[0]) self.fst_vt['SeaState']['WaveHs'] = float_read(f.readline().split()[0]) @@ -2488,7 +2553,20 @@ def read_SubDyn(self, sd_file): self.fst_vt['SubDyn']['GuyanDampMod'] = int_read(f.readline().split()[0]) self.fst_vt['SubDyn']['RayleighDamp'] = read_array(f,2,array_type=float) self.fst_vt['SubDyn']['GuyanDampSize'] = int_read(f.readline().split()[0]) - self.fst_vt['SubDyn']['GuyanDamp'] = np.array([[float(idx) for idx in f.readline().strip().split()[:6]] for i in range(self.fst_vt['SubDyn']['GuyanDampSize'])]) + self.fst_vt['SubDyn']['GuyanDamp'] = np.array([[float(idx) for idx in f.readline().strip().split()[:self.fst_vt['SubDyn']['GuyanDampSize']]] for i in range(self.fst_vt['SubDyn']['GuyanDampSize'])]) + + f.readline() + f.readline() + f.readline() + # INITIAL RIGID-BODY POSITION + ln = f.readline().split() + self.fst_vt['SubDyn']['RBSurge'] = float(ln[0]) + self.fst_vt['SubDyn']['RBSway'] = float(ln[1]) + self.fst_vt['SubDyn']['RBHeave'] = float(ln[2]) + self.fst_vt['SubDyn']['RBRoll'] = float(ln[3]) + self.fst_vt['SubDyn']['RBPitch'] = float(ln[4]) + self.fst_vt['SubDyn']['RBYaw'] = float(ln[5]) + f.readline() # STRUCTURE JOINTS self.fst_vt['SubDyn']['NJoints'] = int_read(f.readline().split()[0]) @@ -2542,8 +2620,9 @@ def read_SubDyn(self, sd_file): self.fst_vt['SubDyn']['Rct_SoilFile'][i] = 'None' f.readline() # INTERFACE JOINTS - self.fst_vt['SubDyn']['NInterf'] = int_read(f.readline().split()[0]) + self.fst_vt['SubDyn']['NInterf'] = int_read(f.readline().split()[0]) self.fst_vt['SubDyn']['IJointID'] = [None]*self.fst_vt['SubDyn']['NInterf'] + self.fst_vt['SubDyn']['TPID'] = [None]*self.fst_vt['SubDyn']['NInterf'] self.fst_vt['SubDyn']['ItfTDXss'] = [None]*self.fst_vt['SubDyn']['NInterf'] self.fst_vt['SubDyn']['ItfTDYss'] = [None]*self.fst_vt['SubDyn']['NInterf'] self.fst_vt['SubDyn']['ItfTDZss'] = [None]*self.fst_vt['SubDyn']['NInterf'] @@ -2555,12 +2634,13 @@ def read_SubDyn(self, sd_file): for i in range(self.fst_vt['SubDyn']['NInterf']): ln = f.readline().split() self.fst_vt['SubDyn']['IJointID'][i] = int(ln[0]) - self.fst_vt['SubDyn']['ItfTDXss'][i] = int(ln[1]) - self.fst_vt['SubDyn']['ItfTDYss'][i] = int(ln[2]) - self.fst_vt['SubDyn']['ItfTDZss'][i] = int(ln[3]) - self.fst_vt['SubDyn']['ItfRDXss'][i] = int(ln[4]) - self.fst_vt['SubDyn']['ItfRDYss'][i] = int(ln[5]) - self.fst_vt['SubDyn']['ItfRDZss'][i] = int(ln[6]) + self.fst_vt['SubDyn']['TPID'][i] = int(ln[1]) + self.fst_vt['SubDyn']['ItfTDXss'][i] = int(ln[2]) + self.fst_vt['SubDyn']['ItfTDYss'][i] = int(ln[3]) + self.fst_vt['SubDyn']['ItfTDZss'][i] = int(ln[4]) + self.fst_vt['SubDyn']['ItfRDXss'][i] = int(ln[5]) + self.fst_vt['SubDyn']['ItfRDYss'][i] = int(ln[6]) + self.fst_vt['SubDyn']['ItfRDZss'][i] = int(ln[7]) f.readline() # MEMBERS self.fst_vt['SubDyn']['NMembers'] = int_read(f.readline().split()[0]) @@ -2595,16 +2675,16 @@ def read_SubDyn(self, sd_file): self.fst_vt['SubDyn']['M_COSMID'][i] = -1 f.readline() # MEMBER X-SECTION PROPERTY data 1/3 - self.fst_vt['SubDyn']['NBCPropSets'] = int_read(f.readline().split()[0]) - self.fst_vt['SubDyn']['PropSetID1'] = [None]*self.fst_vt['SubDyn']['NBCPropSets'] - self.fst_vt['SubDyn']['YoungE1'] = [None]*self.fst_vt['SubDyn']['NBCPropSets'] - self.fst_vt['SubDyn']['ShearG1'] = [None]*self.fst_vt['SubDyn']['NBCPropSets'] - self.fst_vt['SubDyn']['MatDens1'] = [None]*self.fst_vt['SubDyn']['NBCPropSets'] - self.fst_vt['SubDyn']['XsecD'] = [None]*self.fst_vt['SubDyn']['NBCPropSets'] - self.fst_vt['SubDyn']['XsecT'] = [None]*self.fst_vt['SubDyn']['NBCPropSets'] + self.fst_vt['SubDyn']['NPropSetsCyl'] = int_read(f.readline().split()[0]) + self.fst_vt['SubDyn']['PropSetID1'] = [None]*self.fst_vt['SubDyn']['NPropSetsCyl'] + self.fst_vt['SubDyn']['YoungE1'] = [None]*self.fst_vt['SubDyn']['NPropSetsCyl'] + self.fst_vt['SubDyn']['ShearG1'] = [None]*self.fst_vt['SubDyn']['NPropSetsCyl'] + self.fst_vt['SubDyn']['MatDens1'] = [None]*self.fst_vt['SubDyn']['NPropSetsCyl'] + self.fst_vt['SubDyn']['XsecD'] = [None]*self.fst_vt['SubDyn']['NPropSetsCyl'] + self.fst_vt['SubDyn']['XsecT'] = [None]*self.fst_vt['SubDyn']['NPropSetsCyl'] ln = f.readline().split() ln = f.readline().split() - for i in range(self.fst_vt['SubDyn']['NBCPropSets']): + for i in range(self.fst_vt['SubDyn']['NPropSetsCyl']): ln = f.readline().split() self.fst_vt['SubDyn']['PropSetID1'][i] = int(ln[0]) self.fst_vt['SubDyn']['YoungE1'][i] = float(ln[1]) @@ -2614,17 +2694,17 @@ def read_SubDyn(self, sd_file): self.fst_vt['SubDyn']['XsecT'][i] = float(ln[5]) f.readline() # MEMBER X-SECTION PROPERTY data 2/3 - self.fst_vt['SubDyn']['NBRPropSets'] = int_read(f.readline().split()[0]) - self.fst_vt['SubDyn']['PropSetID2'] = [None]*self.fst_vt['SubDyn']['NBRPropSets'] - self.fst_vt['SubDyn']['YoungE2'] = [None]*self.fst_vt['SubDyn']['NBRPropSets'] - self.fst_vt['SubDyn']['ShearG2'] = [None]*self.fst_vt['SubDyn']['NBRPropSets'] - self.fst_vt['SubDyn']['MatDens2'] = [None]*self.fst_vt['SubDyn']['NBRPropSets'] - self.fst_vt['SubDyn']['XsecSa'] = [None]*self.fst_vt['SubDyn']['NBRPropSets'] - self.fst_vt['SubDyn']['XsecSb'] = [None]*self.fst_vt['SubDyn']['NBRPropSets'] - self.fst_vt['SubDyn']['XsecT2'] = [None]*self.fst_vt['SubDyn']['NBRPropSets'] + self.fst_vt['SubDyn']['NPropSetsRec'] = int_read(f.readline().split()[0]) + self.fst_vt['SubDyn']['PropSetID2'] = [None]*self.fst_vt['SubDyn']['NPropSetsRec'] + self.fst_vt['SubDyn']['YoungE2'] = [None]*self.fst_vt['SubDyn']['NPropSetsRec'] + self.fst_vt['SubDyn']['ShearG2'] = [None]*self.fst_vt['SubDyn']['NPropSetsRec'] + self.fst_vt['SubDyn']['MatDens2'] = [None]*self.fst_vt['SubDyn']['NPropSetsRec'] + self.fst_vt['SubDyn']['XsecSa'] = [None]*self.fst_vt['SubDyn']['NPropSetsRec'] + self.fst_vt['SubDyn']['XsecSb'] = [None]*self.fst_vt['SubDyn']['NPropSetsRec'] + self.fst_vt['SubDyn']['XsecT2'] = [None]*self.fst_vt['SubDyn']['NPropSetsRec'] ln = f.readline().split() ln = f.readline().split() - for i in range(self.fst_vt['SubDyn']['NBRPropSets']): + for i in range(self.fst_vt['SubDyn']['NPropSetsRec']): ln = f.readline().split() self.fst_vt['SubDyn']['PropSetID2'][i] = int(ln[0]) self.fst_vt['SubDyn']['YoungE2'][i] = float(ln[1]) @@ -2823,9 +2903,8 @@ def read_ExtPtfm(self, ep_file): f.readline() # Reduction inputs - self.fst_vt['ExtPtfm']['FileFormat'] = int_read(f.readline().split()[0]) + self.fst_vt['ExtPtfm']['RBMod'] = int_read(f.readline().split()[0]) self.fst_vt['ExtPtfm']['Red_FileName'] = os.path.join(os.path.dirname(ep_file), quoted_read(f.readline().split()[0])) - self.fst_vt['ExtPtfm']['RedCst_FileName'] = os.path.join(os.path.dirname(ep_file), quoted_read(f.readline().split()[0])) self.fst_vt['ExtPtfm']['NActiveDOFList'] = int_read(f.readline().split()[0]) self.fst_vt['ExtPtfm']['ActiveDOFList'] = read_array(f,None,split_val='ActiveDOFList',array_type=int) self.fst_vt['ExtPtfm']['NInitPosList'] = int_read(f.readline().split()[0]) @@ -2834,6 +2913,18 @@ def read_ExtPtfm(self, ep_file): self.fst_vt['ExtPtfm']['InitVelList'] = read_array(f,None,split_val='InitVelList',array_type=float) f.readline() + # Connection inputs + self.fst_vt['ExtPtfm']['HasConnections'] = bool_read(f.readline().split()[0]) + self.fst_vt['ExtPtfm']['Conn_FileName'] = os.path.join(os.path.dirname(ep_file), quoted_read(f.readline().split()[0])) + f.readline() + + # User forcing inputs + self.fst_vt['ExtPtfm']['HasUserForcing'] = bool_read(f.readline().split()[0]) + self.fst_vt['ExtPtfm']['Force_FileName'] = os.path.join(os.path.dirname(ep_file), quoted_read(f.readline().split()[0])) + self.fst_vt['ExtPtfm']['HasConnForcing'] = bool_read(f.readline().split()[0]) + self.fst_vt['ExtPtfm']['FConn_FileName'] = os.path.join(os.path.dirname(ep_file), quoted_read(f.readline().split()[0])) + f.readline() + # Output self.fst_vt['ExtPtfm']['SumPrint'] = bool_read(f.readline().split()[0]) self.fst_vt['ExtPtfm']['OutFile'] = int_read(f.readline().split()[0]) @@ -2862,18 +2953,25 @@ def read_ExtPtfm(self, ep_file): self.set_outlist(self.fst_vt['outlist']['ExtPtfm'], channel_list) # TODO: Need to figure this out as we dont have a full outlist for now, similar to MoorDyn data = f.readline() - if self.fst_vt['ExtPtfm']['FileFormat'] == 0: - self.fst_vt['ExtPtfm']['Guyan'] = {} - # self.read_Guyan(f) # TODO: need to impliment this. An example file not found to test - elif self.fst_vt['ExtPtfm']['FileFormat'] == 1: - self.fst_vt['ExtPtfm']['FlexASCII'] = {} - self.read_Superelement(self.fst_vt['ExtPtfm']['Red_FileName']) + self.fst_vt['ExtPtfm']['FlexASCII'] = {} + self.read_Superelement(self.fst_vt['ExtPtfm']['Red_FileName']) + + if self.fst_vt['ExtPtfm']['HasConnections']: + self.fst_vt['ExtPtfm']['Connections'] = {} + self.read_Connections(self.fst_vt['ExtPtfm']['Conn_FileName'], self.fst_vt['ExtPtfm']['FlexASCII']['nDOF']) + + if self.fst_vt['ExtPtfm']['HasUserForcing']: + self.fst_vt['ExtPtfm']['UserForcing'] = {} + self.read_UserForcing(self.fst_vt['ExtPtfm']['Force_FileName'], self.fst_vt['ExtPtfm']['FlexASCII']['nDOF']) + + if self.fst_vt['ExtPtfm']['HasConnForcing']: + self.fst_vt['ExtPtfm']['ConnForcing'] = {} + self.read_ConnForcing(self.fst_vt['ExtPtfm']['FConn_FileName'], self.fst_vt['ExtPtfm']['Connections']['nConn']) f.close() def read_Superelement(self, superelement_file): - def detectAndReadExtPtfmSE(lines): # Function based on https://github.com/OpenFAST/openfast_toolbox/blob/353643ed917d113ec8dfd765813fef7d09752757/openfast_toolbox/io/fast_input_file.py#L1932 @@ -2885,59 +2983,43 @@ def readmat(n,m,lines,iStart): i=iStart+j M[j,:]=np.array(lines[i].split()).astype(float) return M - - if len(lines)<10: - return False - if not (lines[0][0]=='!' and lines[1][0]=='!'): - return False - if lines[1].lower().find('flex')<0: - return - if lines[2].lower().find('!dimension')<0: - return - + # --- At this stage we assume it's in the proper format - nDOFCommon = -1 - i=2 + nDOF = -1 + i=0 try: while i0: if l[0]=='!': if l.find('!dimension')==0: self.fst_vt['ExtPtfm']['FlexASCII']['nDOF'] = int(l.split(':')[1]) - nDOFCommon = self.fst_vt['ExtPtfm']['FlexASCII']['nDOF'] - elif l.find('!time increment')==0: - self.fst_vt['ExtPtfm']['FlexASCII']['dt'] = float(l.split(':')[1]) - elif l.find('!total simulation time')==0: - self.fst_vt['ExtPtfm']['FlexASCII']['T'] = float(l.split(':')[1]) + nDOF = self.fst_vt['ExtPtfm']['FlexASCII']['nDOF'] elif len(l.strip())==0: pass else: @@ -2957,6 +3039,159 @@ def readmat(n,m,lines,iStart): raise NameError('Could not read Superelement file') f.close() + + def read_Connections(self, connection_file, nDOF): + + def detectAndReadExtPtfmConnections(lines): + # Function based on https://github.com/OpenFAST/openfast_toolbox/blob/353643ed917d113ec8dfd765813fef7d09752757/openfast_toolbox/io/fast_input_file.py#L1932 + # Developed by Emmanuel Branlard (https://github.com/ebranlard) + + def readmat(n,m,lines,iStart): + M=np.zeros((n,m)) + for j in np.arange(n): + i=iStart+j + M[j,:]=np.array(lines[i].split()).astype(float) + return M + + # --- At this stage we assume it's in the proper format + nConn = -1 + i=0 + try: + while i0: + if l[0]=='!': + if l.find('!nconn')==0: + self.fst_vt['ExtPtfm']['Connections']['nConn'] = int(l.split(':')[1]) + nConn = self.fst_vt['ExtPtfm']['Connections']['nConn'] + elif len(l.strip())==0: + pass + else: + raise NameError('Unexcepted content found on line {}'.format(i)) + i+=1 + except NameError as e: + raise e + except: + raise + + return True + + + f = open(connection_file) + lines=f.read().splitlines() + if not detectAndReadExtPtfmConnections(lines): + raise NameError('Could not read Connections file') + f.close() + + + def read_UserForcing(self, userforcing_file, nDOF): + + def detectAndReadExtPtfmUserForcing(lines): + # Function based on https://github.com/OpenFAST/openfast_toolbox/blob/353643ed917d113ec8dfd765813fef7d09752757/openfast_toolbox/io/fast_input_file.py#L1932 + # Developed by Emmanuel Branlard (https://github.com/ebranlard) + + def readmat(n,m,lines,iStart): + M=np.zeros((n,m)) + for j in np.arange(n): + i=iStart+j + M[j,:]=np.array(lines[i].split()).astype(float) + return M + + # --- At this stage we assume it's in the proper format + NSteps = -1 + i=0 + try: + while i0: + if l[0]=='!': + if l.find('!nsteps')==0: + self.fst_vt['ExtPtfm']['UserForcing']['nSteps'] = int(l.split(':')[1]) + nSteps = self.fst_vt['ExtPtfm']['UserForcing']['nSteps'] + elif len(l.strip())==0: + pass + else: + raise NameError('Unexcepted content found on line {}'.format(i)) + i+=1 + except NameError as e: + raise e + except: + raise + + return True + + + f = open(userforcing_file) + lines=f.read().splitlines() + if not detectAndReadExtPtfmUserForcing(lines): + raise NameError('Could not read User Forcing file') + f.close() + + + def read_ConnForcing(self, connforcing_file, nConn): + + def detectAndReadExtPtfmConnForcing(lines): + # Function based on https://github.com/OpenFAST/openfast_toolbox/blob/353643ed917d113ec8dfd765813fef7d09752757/openfast_toolbox/io/fast_input_file.py#L1932 + # Developed by Emmanuel Branlard (https://github.com/ebranlard) + + def readmat(n,m,lines,iStart): + M=np.zeros((n,m)) + for j in np.arange(n): + i=iStart+j + M[j,:]=np.array(lines[i].split()).astype(float) + return M + + # --- At this stage we assume it's in the proper format + NSteps = -1 + i=0 + try: + while i0: + if l[0]=='!': + if l.find('!nsteps')==0: + self.fst_vt['ExtPtfm']['ConnForcing']['nSteps'] = int(l.split(':')[1]) + nSteps = self.fst_vt['ExtPtfm']['ConnForcing']['nSteps'] + elif len(l.strip())==0: + pass + else: + raise NameError('Unexcepted content found on line {}'.format(i)) + i+=1 + except NameError as e: + raise e + except: + raise + + return True + + + f = open(connforcing_file) + lines=f.read().splitlines() + if not detectAndReadExtPtfmConnForcing(lines): + raise NameError('Could not read Connections Forcing file') + f.close() + + def read_MAP(self, map_file): # MAP++ diff --git a/openfast_io/openfast_io/FAST_vars_out.py b/openfast_io/openfast_io/FAST_vars_out.py index fb551bdaaf..b92a0a2abe 100644 --- a/openfast_io/openfast_io/FAST_vars_out.py +++ b/openfast_io/openfast_io/FAST_vars_out.py @@ -9602,55 +9602,96 @@ ExtPtfm['IntrfMx'] = False # - Platform interface moment - Directed along the x-direction (Nm) ExtPtfm['IntrfMy'] = False # - Platform interface moment - Directed along the y-direction (Nm) ExtPtfm['IntrfMz'] = False # - Platform interface moment - Directed along the z-direction (Nm) -ExtPtfm['InpF_Fx'] = False # - Reduced Input force at interface point - Directed along the x-direction (N) -ExtPtfm['InpF_Fy'] = False # - Reduced Input force at interface point - Directed along the y-direction (N) -ExtPtfm['InpF_Fz'] = False # - Reduced Input force at interface point - Directed along the z-direction (N) -ExtPtfm['InpF_Mx'] = False # - Reduced Input moment at interface point - Directed along the x-direction (Nm) -ExtPtfm['InpF_My'] = False # - Reduced Input moment at interface point - Directed along the y-direction (Nm) -ExtPtfm['InpF_Mz'] = False # - Reduced Input moment at interface point - Directed along the z-direction (Nm) -ExtPtfm['CBQ_001'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_002'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_003'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_004'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_005'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_006'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_007'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_010'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_011'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_012'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_013'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_014'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_015'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_016'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_017'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_020'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_021'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_022'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_023'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_024'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBQ_025'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_001'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_002'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_003'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_004'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_005'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_006'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_007'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_010'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_011'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_012'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_013'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_014'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_015'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_016'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_017'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_020'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_021'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_022'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_023'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_024'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['CBF_025'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) -ExtPtfm['WavElev'] = False # - Wave elevation (m) +ExtPtfm['ExtrnFx'] = False # - Reduced Input force at interface point - Directed along the x-direction (N) +ExtPtfm['ExtrnFy'] = False # - Reduced Input force at interface point - Directed along the y-direction (N) +ExtPtfm['ExtrnFz'] = False # - Reduced Input force at interface point - Directed along the z-direction (N) +ExtPtfm['ExtrnMx'] = False # - Reduced Input moment at interface point - Directed along the x-direction (Nm) +ExtPtfm['ExtrnMy'] = False # - Reduced Input moment at interface point - Directed along the y-direction (Nm) +ExtPtfm['ExtrnMz'] = False # - Reduced Input moment at interface point - Directed along the z-direction (Nm) +ExtPtfm['CBD001'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD002'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD003'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD004'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD005'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD006'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD007'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD010'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD011'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD012'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD013'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD014'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD015'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD016'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD017'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD020'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD021'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD022'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD023'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD024'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBD025'] = False # - Modal displacement of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV001'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV002'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV003'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV004'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV005'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV006'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV007'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV010'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV011'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV012'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV013'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV014'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV015'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV016'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV017'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV020'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV021'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV022'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV023'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV024'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBV025'] = False # - Modal velocity of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA001'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA002'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA003'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA004'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA005'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA006'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA007'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA010'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA011'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA012'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA013'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA014'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA015'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA016'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA017'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA020'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA021'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA022'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA023'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA024'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBA025'] = False # - Modal acceleration of internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF001'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF002'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF003'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF004'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF005'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF006'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF007'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF010'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF011'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF012'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF013'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF014'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF015'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF016'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF017'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF020'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF021'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF022'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF023'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF024'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) +ExtPtfm['CBF025'] = False # - Modal force on internal Craig-Bampton mode number XXX (-) """ AeroDisk """ AeroDisk = {} @@ -9745,4 +9786,4 @@ FstOutput['MoorDyn'] = MoorDyn FstOutput['ExtPtfm'] = ExtPtfm FstOutput['AeroDisk'] = AeroDisk -FstOutput['SimpleElastoDyn'] = SimpleElastoDyn \ No newline at end of file +FstOutput['SimpleElastoDyn'] = SimpleElastoDyn diff --git a/openfast_io/openfast_io/FAST_writer.py b/openfast_io/openfast_io/FAST_writer.py index f9c3cf6017..e9998d6fbf 100644 --- a/openfast_io/openfast_io/FAST_writer.py +++ b/openfast_io/openfast_io/FAST_writer.py @@ -288,11 +288,16 @@ def write_MainInput(self): f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['AbortLevel']+'"', 'AbortLevel', '- Error level when simulation should abort (string) {"WARNING", "SEVERE", "FATAL"}\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['TMax'], 'TMax', '- Total run time (s)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['DT'], 'DT', '- Recommended module time step (s)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['ModCoupling'], 'ModCoupling', '- Module coupling method (switch) {1=loose; 2=tight with fixed Jacobian updates (DT_UJac); 3=tight with automatic Jacobian updates}\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['InterpOrder'], 'InterpOrder', '- Interpolation order for input/output time history (-) {1=linear, 2=quadratic}\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['NumCrctn'], 'NumCrctn', '- Number of correction iterations (-) {0=explicit calculation, i.e., no corrections}\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['NumCrctn'], 'NumCrctn', '- Numerical damping parameter for tight coupling generalized-alpha integrator (-) [0.0 to 1.0]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['RhoInf'], 'RhoInf', '- Convergence iteration error tolerance for tight coupling generalized alpha integrator (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['ConvTol'], 'ConvTol', '- Maximum number of convergence iterations for tight coupling generalized alpha integrator (-)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['MaxConvIter'], 'MaxConvIter', '- Number of correction iterations (-) {0=explicit calculation, i.e., no corrections}\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['DT_UJac'], 'DT_UJac', '- Time between calls to get Jacobians (s)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['UJacSclFact'], 'UJacSclFact', '- Scaling factor used in Jacobians (-)\n')) f.write('---------------------- FEATURE SWITCHES AND FLAGS ------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['NRotors'], 'NRotors', '- Number of rotors in turbine\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['CompElast'], 'CompElast', '- Compute structural dynamics (switch) {1=ElastoDyn; 2=ElastoDyn + BeamDyn for blades; 3=Simplified ElastoDyn}\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['CompInflow'], 'CompInflow', '- Compute inflow wind velocities (switch) {0=still air; 1=InflowWind; 2=external from ExtInflow}\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['CompAero'], 'CompAero', '- Compute aerodynamic loads (switch) {0=None; 1=AeroDisk; 2=AeroDyn; 3=ExtLoads}\n')) @@ -302,7 +307,9 @@ def write_MainInput(self): f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['CompSub'], 'CompSub', '- Compute sub-structural dynamics (switch) {0=None; 1=SubDyn; 2=External Platform MCKF}\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['CompMooring'], 'CompMooring', '- Compute mooring system (switch) {0=None; 1=MAP++; 2=FEAMooring; 3=MoorDyn; 4=OrcaFlex}\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['CompIce'], 'CompIce', '- Compute ice loads (switch) {0=None; 1=IceFloe; 2=IceDyn}\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['CompSoil'], 'CompSoil', '- Compute soil-structural dynamics (switch) {0=None; 1=SoilDyn}\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['MHK'], 'MHK', '- MHK turbine type (switch) {0=Not an MHK turbine; 1=Fixed MHK turbine; 2=Floating MHK turbine}\n')) + f.write('{:<22} {:<11} {:}'.format(' '.join([str(b)[0] for b in np.array(self.fst_vt['Fst']['MirrorRotor'], dtype=bool)]), 'MirrorRotor', '- List of rotor rotation directions [1 to NRotors] {0=CCW, 1=CW}\n')) f.write('---------------------- ENVIRONMENTAL CONDITIONS --------------------------------\n') f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['Gravity'], 'Gravity', '- Gravitational acceleration (m/s^2)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['AirDens'], 'AirDens', '- Air density (kg/m^3)\n')) @@ -326,6 +333,14 @@ def write_MainInput(self): f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['SubFile']+'"', 'SubFile', '- Name of file containing sub-structural input parameters (quoted string)\n')) f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['MooringFile']+'"', 'MooringFile', '- Name of file containing mooring system input parameters (quoted string)\n')) f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['IceFile']+'"', 'IceFile', '- Name of file containing ice input parameters (quoted string)\n')) + f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['SoilFile']+'"', 'SoilFile', '- Name of file containing soil input parameters (quoted string)\n')) + # for i in range(1, self.fst_vt['Fst']['NRotors']): + # f.write('---------------------- INPUT FILES Rotor '+str(i+1)+' -------------------------------------\n') + # f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['EDFiles'][i]+'"', 'EDFile', '- Name of file containing ElastoDyn input parameters (quoted string)\n')) + # f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['BDBldFiles(1)'][i]+'"', 'BDBldFile(1)', '- Name of file containing BeamDyn input parameters for blade 1 (quoted string)\n')) + # f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['BDBldFiles(2)'][i]+'"', 'BDBldFile(2)', '- Name of file containing BeamDyn input parameters for blade 2 (quoted string)\n')) + # f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['BDBldFiles(3)'][i]+'"', 'BDBldFile(3)', '- Name of file containing BeamDyn input parameters for blade 3 (quoted string)\n')) + # f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['Fst']['ServoFiles'][i]+'"', 'ServoFile', '- Name of file containing control and electrical-drive input parameters (quoted string)\n')) f.write('---------------------- OUTPUT --------------------------------------------------\n') f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['Fst']['SumPrint'], 'SumPrint', '- Print summary data to ".sum" (flag)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['Fst']['SttsTime'], 'SttsTime', '- Amount of time between screen status messages (s)\n')) @@ -377,6 +392,7 @@ def write_ElastoDyn(self): f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['FlapDOF1'], 'FlapDOF1', '- First flapwise blade mode DOF (flag)\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['FlapDOF2'], 'FlapDOF2', '- Second flapwise blade mode DOF (flag)\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['EdgeDOF'], 'EdgeDOF', '- First edgewise blade mode DOF (flag)\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PitchDOF'], 'PitchDOF', '- Blade pitch DOF (flag)\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['TeetDOF'], 'TeetDOF', '- Rotor-teeter DOF (flag) [unused for 3 blades]\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['DrTrDOF'], 'DrTrDOF', '- Drivetrain rotational-flexibility DOF (flag)\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['GenDOF'], 'GenDOF', '- Generator DOF (flag)\n')) @@ -435,11 +451,19 @@ def write_ElastoDyn(self): f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PtfmCMxt'], 'PtfmCMxt', '- Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform CM (meters)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PtfmCMyt'], 'PtfmCMyt', '- Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform CM (meters)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PtfmCMzt'], 'PtfmCMzt', '- Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform CM (meters)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PtfmRefxt'], 'PtfmRefxt', '- Downwind distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PtfmRefyt'], 'PtfmRefyt', '- Lateral distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PtfmRefzt'], 'PtfmRefzt', '- Vertical distance from the ground level [onshore], MSL [offshore wind or floating MHK], or seabed [fixed MHK] to the platform reference point (meters)\n')) f.write('---------------------- MASS AND INERTIA ----------------------------------------\n') f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['TipMass(1)'], 'TipMass(1)', '- Tip-brake mass, blade 1 (kg)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['TipMass(2)'], 'TipMass(2)', '- Tip-brake mass, blade 2 (kg)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['TipMass(3)'], 'TipMass(3)', '- Tip-brake mass, blade 3 (kg) [unused for 2 blades]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PBrIner(1)'], 'PBrIner(1)', '- Pitch bearing inertia, blade 1 (kg m^2)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PBrIner(2)'], 'PBrIner(2)', '- Pitch bearing inertia, blade 2 (kg m^2)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['PBrIner(3)'], 'PBrIner(3)', '- Pitch bearing inertia, blade 3 (kg m^2) [unused for 2 blades]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['BlPIner(1)'], 'BlPIner(1)', '- Blade pitch inertia, blade 1 (kg m^2)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['BlPIner(2)'], 'BlPIner(2)', '- Blade pitch inertia, blade 2 (kg m^2)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['BlPIner(3)'], 'BlPIner(3)', '- Blade pitch inertia, blade 3 (kg m^2) [unused for 2 blades]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['HubMass'], 'HubMass', '- Hub mass (kg)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['HubIner'], 'HubIner', 'Hub inertia about rotor axis (2 or 3-blades) (kg m^2)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ElastoDyn']['HubIner_Teeter'], 'HubIner_Teeter', 'Hub inertia about teeter axis (2-blades) (kg m^2)\n')) @@ -611,16 +635,15 @@ def write_ElastoDynBlade(self, bldInd = None): f.write('{:<22} {:<11} {:}'.format(EDbld_dict['AdjFlSt'], 'AdjFlSt', '- Factor to adjust blade flap stiffness (-)\n')) f.write('{:<22} {:<11} {:}'.format(EDbld_dict['AdjEdSt'], 'AdjEdSt', '- Factor to adjust blade edge stiffness (-)\n')) f.write('---------------------- DISTRIBUTED BLADE PROPERTIES ----------------------------\n') - f.write(' BlFract PitchAxis StrcTwst BMassDen FlpStff EdgStff\n') - f.write(' (-) (-) (deg) (kg/m) (Nm^2) (Nm^2)\n') + f.write(' BlFract StrcTwst BMassDen FlpStff EdgStff\n') + f.write(' (-) (deg) (kg/m) (Nm^2) (Nm^2)\n') BlFract = EDbld_dict['BlFract'] - PitchAxis = EDbld_dict['PitchAxis'] StrcTwst = EDbld_dict['StrcTwst'] BMassDen = EDbld_dict['BMassDen'] FlpStff = EDbld_dict['FlpStff'] EdgStff = EDbld_dict['EdgStff'] - for BlFracti, PitchAxisi, StrcTwsti, BMassDeni, FlpStffi, EdgStffi in zip(BlFract, PitchAxis, StrcTwst, BMassDen, FlpStff, EdgStff): - f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e}\n'.format(BlFracti, PitchAxisi, StrcTwsti, BMassDeni, FlpStffi, EdgStffi)) + for BlFracti, StrcTwsti, BMassDeni, FlpStffi, EdgStffi in zip(BlFract, StrcTwst, BMassDen, FlpStff, EdgStff): + f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e}\n'.format(BlFracti, StrcTwsti, BMassDeni, FlpStffi, EdgStffi)) f.write('---------------------- BLADE MODE SHAPES ---------------------------------------\n') f.write('{:<22} {:<11} {:}'.format(EDbld_dict['BldFl1Sh'][0], 'BldFl1Sh(2)', '- Flap mode 1, coeff of x^2\n')) f.write('{:<22} {:<11} {:}'.format(EDbld_dict['BldFl1Sh'][1], 'BldFl1Sh(3)', '- , coeff of x^3\n')) @@ -755,11 +778,6 @@ def write_BeamDyn(self, bldInd = None): f.write('{:<22d} {:<11} {:}'.format(bd_dict['order_elem'], 'order_elem', '- Order of interpolation (basis) function (-)\n')) f.write('---------------------- MATERIAL PARAMETER --------------------------------------\n') f.write('{:<22} {:<11} {:}'.format('"'+bd_dict['BldFile']+'"', 'BldFile', '- Name of file containing properties for blade (quoted string)\n')) - f.write('---------------------- PITCH ACTUATOR PARAMETERS -------------------------------\n') - f.write('{!s:<22} {:<11} {:}'.format(bd_dict['UsePitchAct'], 'UsePitchAct', '- Whether a pitch actuator should be used (flag)\n')) - f.write('{:<22} {:<11} {:}'.format(bd_dict['PitchJ'], 'PitchJ', '- Pitch actuator inertia (kg-m^2) [used only when UsePitchAct is true]\n')) - f.write('{:<22} {:<11} {:}'.format(bd_dict['PitchK'], 'PitchK', '- Pitch actuator stiffness (kg-m^2/s^2) [used only when UsePitchAct is true]\n')) - f.write('{:<22} {:<11} {:}'.format(bd_dict['PitchC'], 'PitchC', '- Pitch actuator damping (kg-m^2/s) [used only when UsePitchAct is true]\n')) f.write('---------------------- OUTPUTS -------------------------------------------------\n') f.write('{!s:<22} {:<11} {:}'.format(bd_dict['SumPrint'], 'SumPrint', '- Print summary data to ".sum" (flag)\n')) f.write('{:<22} {:<11} {:}'.format('"'+bd_dict['OutFmt']+'"', 'OutFmt', '- Format used for text tabular output, excluding the time channel.\n')) @@ -803,16 +821,18 @@ def write_BeamDynBlade(self, bldInd = None): f.write('------- BEAMDYN INDIVIDUAL BLADE INPUT FILE --------------------------\n') f.write('Generated with OpenFAST_IO\n') - f.write('---------------------- BLADE PARAMETERS --------------------------------------\n') + f.write('------ Blade Parameters --------------------------------------------------------\n') f.write('{:<22} {:<11} {:}'.format(bd_blade_dict['station_total'], 'station_total', '- Number of blade input stations (-)\n')) - f.write('{:<22} {:<11} {:}'.format(bd_blade_dict['damp_type'], 'damp_type', '- Damping type: 0: no damping; 1: damped\n')) - f.write('---------------------- DAMPING COEFFICIENT------------------------------------\n') + f.write('{:<22} {:<11} {:}'.format(bd_blade_dict['damp_type'], 'damp_type', '- Damping type (switch) {0: none, 1: stiffness-proportional, 2: modal}\n')) + f.write('------ Stiffness-Proportional Damping [used only if damp_type=1] ---------------\n') f.write(" ".join(['{:^11s}'.format(i) for i in ['mu1','mu2','mu3','mu4','mu5','mu6']])+'\n') f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)','(-)','(-)','(-)','(-)','(-)']])+'\n') mu = [bd_blade_dict['mu1'], bd_blade_dict['mu2'], bd_blade_dict['mu3'], bd_blade_dict['mu4'], bd_blade_dict['mu5'], bd_blade_dict['mu6']] f.write(" ".join(['{:^11f}'.format(i) for i in mu])+'\n') - f.write('---------------------- DISTRIBUTED PROPERTIES---------------------------------\n') - + f.write('------ Modal Damping [used only if damp_type=2] --------------------------------\n') + f.write('{:<22} {:<11} {:}\n'.format(bd_blade_dict['n_modes'], 'n_modes', '- Number of modal damping coefficients (-)')) + f.write('{:<22} {:<11} {:}\n'.format(" ".join([repr(v) for v in bd_blade_dict['zeta']]), 'zeta', ' - Damping coefficients for mode 1 through n_modes')) + f.write('------ Distributed Properties --------------------------------------------------\n') for i in range(len(bd_blade_dict['radial_stations'])): f.write('{: 2.15e}\n'.format(bd_blade_dict['radial_stations'][i])) for j in range(6): @@ -958,7 +978,6 @@ def write_AeroDyn(self): f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn']['TwrShadow'], 'TwrShadow', '- Calculate tower influence on wind based on downstream tower shadow (switch) {0=none, 1=Powles model, 2=Eames model}\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['TwrAero'], 'TwrAero', '- Calculate tower aerodynamic loads? (flag)\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['CavitCheck'], 'CavitCheck', '- Perform cavitation check? (flag) [UA_Mod must be 0 when CavitCheck=true]\n')) - f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['Buoyancy'], 'Buoyancy', '- Include buoyancy effects? (flag)\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['NacelleDrag'], 'NacelleDrag', '- Include Nacelle Drag effects? (flag)\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['CompAA'], 'CompAA', '- Flag to compute AeroAcoustics calculation [used only when Wake_Mod = 1 or 2]\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['AA_InputFile'], 'AA_InputFile', '- AeroAcoustics input file [used only when CompAA=true]\n')) @@ -1022,10 +1041,10 @@ def write_AeroDyn(self): f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['AeroDyn']['ADBlFile1']+'"', 'ADBlFile(1)', '- Name of file containing distributed aerodynamic properties for Blade #1 (-)\n')) f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['AeroDyn']['ADBlFile2']+'"', 'ADBlFile(2)', '- Name of file containing distributed aerodynamic properties for Blade #2 (-) [unused if NumBl < 2]\n')) f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['AeroDyn']['ADBlFile3']+'"', 'ADBlFile(3)', '- Name of file containing distributed aerodynamic properties for Blade #3 (-) [unused if NumBl < 3]\n')) - f.write('====== Hub Properties ============================================================================== [used only when Buoyancy=True]\n') + f.write('====== Hub Properties ============================================================================== [used only when MHK=1 or 2]\n') f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['VolHub'], 'VolHub', '- Hub volume (m^3)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['HubCenBx'], 'HubCenBx', '- Hub center of buoyancy x direction offset (m)\n')) - f.write('====== Nacelle Properties ========================================================================== [used only when Buoyancy=True or NacelleDrag=True]\n') + f.write('====== Nacelle Properties ========================================================================== [used only when MHK=1 or 2 or when NacelleDrag=True]\n') f.write('{:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['VolNac'], 'VolNac', '- Nacelle volume (m^3)\n')) f.write('{:<22} {:<11} {:}'.format(', '.join(np.array(self.fst_vt['AeroDyn']['NacCenB'], dtype=str)), 'NacCenB', '- Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m)\n')) f.write('{:<22} {:<11} {:}'.format(', '.join(np.array(self.fst_vt['AeroDyn']['NacArea'], dtype=str)), 'NacArea', '- Projected area of the nacelle in X, Y, Z in the nacelle coordinate system (m^2)\n')) @@ -1034,12 +1053,12 @@ def write_AeroDyn(self): f.write('====== Tail Fin Aerodynamics ========================================================================\n') f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['TFinAero'], 'TFinAero', '- Calculate tail fin aerodynamics model (flag)\n')) f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['AeroDyn']['TFinFile']+'"', 'TFinFile', '- Input file for tail fin aerodynamics [used only when TFinAero=True]\n')) - f.write('====== Tower Influence and Aerodynamics ============================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True]\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn']['NumTwrNds'], 'NumTwrNds', '- Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or Buoyancy=True]\n')) - f.write('TwrElev TwrDiam TwrCd TwrTI TwrCb !TwrTI used only when TwrShadow=2; TwrCb used only when Buoyancy=True\n') - f.write('(m) (m) (-) (-) (-)\n') - for TwrElev, TwrDiam, TwrCd, TwrTI, TwrCb in zip(self.fst_vt['AeroDyn']['TwrElev'], self.fst_vt['AeroDyn']['TwrDiam'], self.fst_vt['AeroDyn']['TwrCd'], self.fst_vt['AeroDyn']['TwrTI'], self.fst_vt['AeroDyn']['TwrCb']): - f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} \n'.format(TwrElev, TwrDiam, TwrCd, TwrTI, TwrCb)) + f.write('====== Tower Influence and Aerodynamics ============================================================ [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2]\n') + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn']['NumTwrNds'], 'NumTwrNds', '- Number of tower nodes used in the analysis (-) [used only when TwrPotent/=0, TwrShadow/=0, TwrAero=True, or MHK=1 or 2]\n')) + f.write('TwrElev TwrDiam TwrCd TwrTI TwrCb TwrCp TwrCa !TwrTI used only with TwrShadow=2, TwrCb/TwrCp/TwrCa used only with MHK=1 or 2\n') + f.write('(m) (m) (-) (-) (-) (-) (-)\n') + for TwrElev, TwrDiam, TwrCd, TwrTI, TwrCb, TwrCp, TwrCa in zip(self.fst_vt['AeroDyn']['TwrElev'], self.fst_vt['AeroDyn']['TwrDiam'], self.fst_vt['AeroDyn']['TwrCd'], self.fst_vt['AeroDyn']['TwrTI'], self.fst_vt['AeroDyn']['TwrCb'], self.fst_vt['AeroDyn']['TwrCp'], self.fst_vt['AeroDyn']['TwrCa']): + f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} \n'.format(TwrElev, TwrDiam, TwrCd, TwrTI, TwrCb, TwrCp, TwrCa)) f.write('====== Outputs ====================================================================================\n') f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['AeroDyn']['SumPrint'], 'SumPrint', '- Generate a summary file listing input options and interpolated properties to ".AD.sum"? (flag)\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['AeroDyn']['NBlOuts'], 'NBlOuts', '- Number of blade node outputs [0 - 9] (-)\n')) @@ -1091,8 +1110,8 @@ def write_AeroDynBlade(self, bldInd = None): f.write('Generated with OpenFAST_IO\n') f.write('====== Blade Properties =================================================================\n') f.write('{:<11d} {:<11} {:}'.format(adBld_dict['NumBlNds'], 'NumBlNds', '- Number of blade nodes used in the analysis (-)\n')) - f.write(' BlSpn BlCrvAC BlSwpAC BlCrvAng BlTwist BlChord BlAFID BlCb BlCenBn BlCenBt\n') - f.write(' (m) (m) (m) (deg) (deg) (m) (-) (-) (m) (m)\n') + f.write(' BlSpn BlCrvAC BlSwpAC BlCrvAng BlTwist BlChord BlAFID t_c BlCb BlCenBn BlCenBt BlCpn BlCpt BlCan BlCat BlCam\n') + f.write(' (m) (m) (m) (deg) (deg) (m) (-) (-) (-) (m) (m) (-) (-) (-) (-) (-)\n') BlSpn = adBld_dict['BlSpn'] BlCrvAC = adBld_dict['BlCrvAC'] BlSwpAC = adBld_dict['BlSwpAC'] @@ -1100,11 +1119,17 @@ def write_AeroDynBlade(self, bldInd = None): BlTwist = adBld_dict['BlTwist'] BlChord = adBld_dict['BlChord'] BlAFID = adBld_dict['BlAFID'] + t_c = adBld_dict['t_c'] BlCb = adBld_dict['BlCb'] BlCenBn = adBld_dict['BlCenBn'] BlCenBt = adBld_dict['BlCenBt'] - for Spn, CrvAC, SwpAC, CrvAng, Twist, Chord, AFID, BlCb, BlCenBn, BlCenBt in zip(BlSpn, BlCrvAC, BlSwpAC, BlCrvAng, BlTwist, BlChord, BlAFID, BlCb, BlCenBn, BlCenBt): - f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 8d} {: 2.15e} {: 2.15e} {: 2.15e}\n'.format(Spn, CrvAC, SwpAC, CrvAng, Twist, Chord, int(AFID), BlCb, BlCenBn, BlCenBt)) + BlCpn = adBld_dict['BlCpn'] + BlCpt = adBld_dict['BlCpt'] + BlCan = adBld_dict['BlCan'] + BlCat = adBld_dict['BlCat'] + BlCam = adBld_dict['BlCam'] + for Spn, CrvAC, SwpAC, CrvAng, Twist, Chord, AFID, t_c, BlCb, BlCenBn, BlCenBt, BlCpn, BlCpt, BlCan, BlCat, BlCam in zip(BlSpn, BlCrvAC, BlSwpAC, BlCrvAng, BlTwist, BlChord, BlAFID, t_c, BlCb, BlCenBn, BlCenBt, BlCpn, BlCpt, BlCan, BlCat, BlCam): + f.write('{: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 8d} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e} {: 2.15e}\n'.format(Spn, CrvAC, SwpAC, CrvAng, Twist, Chord, int(AFID), t_c, BlCb, BlCenBn, BlCenBt, BlCpn, BlCpt, BlCan, BlCat, BlCam)) f.flush() os.fsync(f) @@ -1414,9 +1439,18 @@ def write_ServoDyn(self): f.write('---------------------- PITCH CONTROL -------------------------------------------\n') f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PCMode'], 'PCMode', '- Pitch control mode {0: none, 3: user-defined from routine PitchCntrl, 4: user-defined from Simulink/Labview, 5: user-defined from Bladed-style DLL} (switch)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPCOn'], 'TPCOn', '- Time to enable active pitch control (s) [unused when PCMode=0]\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPitManS1'], 'TPitManS(1)', '- Time to start override pitch maneuver for blade 1 and end standard pitch control (s)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPitManS2'], 'TPitManS(2)', '- Time to start override pitch maneuver for blade 2 and end standard pitch control (s)\n')) - f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPitManS3'], 'TPitManS(3)', '- Time to start override pitch maneuver for blade 3 and end standard pitch control (s) [unused for 2 blades]\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitNeut(1)'], 'PitNeut(1)', '- Blade 1 neutral pitch position--pitch spring moment is zero at this pitch (degrees)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitNeut(2)'], 'PitNeut(2)', '- Blade 2 neutral pitch position--pitch spring moment is zero at this pitch (degrees)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitNeut(3)'], 'PitNeut(3)', '- Blade 3 neutral pitch position--pitch spring moment is zero at this pitch (degrees)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitSpr(1)'], 'PitSpr(1)', '- Blade 1 pitch spring constant (N-m/rad)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitSpr(2)'], 'PitSpr(2)', '- Blade 2 pitch spring constant (N-m/rad)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitSpr(3)'], 'PitSpr(3)', '- Blade 3 pitch spring constant (N-m/rad)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitDamp(1)'], 'PitDamp(1)', '- Blade 1 pitch damping constant (N-m/(rad/s))\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitDamp(2)'], 'PitDamp(2)', '- Blade 2 pitch damping constant (N-m/(rad/s))\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitDamp(3)'], 'PitDamp(3)', '- Blade 3 pitch damping constant (N-m/(rad/s))\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPitManS(1)'], 'TPitManS(1)', '- Time to start override pitch maneuver for blade 1 and end standard pitch control (s)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPitManS(2)'], 'TPitManS(2)', '- Time to start override pitch maneuver for blade 2 and end standard pitch control (s)\n')) + f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['TPitManS(3)'], 'TPitManS(3)', '- Time to start override pitch maneuver for blade 3 and end standard pitch control (s) [unused for 2 blades]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitManRat(1)'], 'PitManRat(1)', '- Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 1 (deg/s)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitManRat(2)'], 'PitManRat(2)', '- Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 2 (deg/s)\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['ServoDyn']['PitManRat(3)'], 'PitManRat(3)', '- Pitch rate at which override pitch maneuver heads toward final pitch angle for blade 3 (deg/s) [unused for 2 blades]\n')) @@ -1612,6 +1646,7 @@ def write_HydroDyn(self): f.write('{:<22} {:<11} {:}'.format(', '.join([f'{val}' for val in self.fst_vt['HydroDyn']['PtfmVol0']]), 'PtfmVol0', '- Displaced volume of water when the body is in its undisplaced position (m^3) [1 to NBody] [only used when PotMod=1; USE THE SAME VALUE COMPUTED BY WAMIT AS OUTPUT IN THE .OUT FILE!]\n')) f.write('{:<22} {:<11} {:}'.format(', '.join([f'{val}' for val in self.fst_vt['HydroDyn']['PtfmCOBxt']]), 'PtfmCOBxt', '- The xt offset of the center of buoyancy (COB) from (0,0) (meters) [1 to NBody] [only used when PotMod=1]\n')) f.write('{:<22} {:<11} {:}'.format(', '.join([f'{val}' for val in self.fst_vt['HydroDyn']['PtfmCOByt']]), 'PtfmCOByt', '- The yt offset of the center of buoyancy (COB) from (0,0) (meters) [1 to NBody] [only used when PotMod=1]\n')) + f.write('{:<22} {:<11} {:}'.format(', '.join([f'{val}' for val in self.fst_vt['HydroDyn']['NAddDOF']]), 'NAddDOF', '- Number of additional generalized DOF of each WAMIT body (-) [1 to NBody] [>=0; =0 if NBody>1; only used when PotMod=1]\n')) f.write('---------------------- 2ND-ORDER FLOATING PLATFORM FORCES ---------------------- [unused with WaveMod=0 or 6, or PotMod=0 or 2]\n') f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['MnDrift'], 'MnDrift', "- Mean-drift 2nd-order forces computed {0: None; [7, 8, 9, 10, 11, or 12]: WAMIT file to use} [Only one of MnDrift, NewmanApp, or DiffQTF can be non-zero]\n")) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['HydroDyn']['NewmanApp'], 'NewmanApp', "- Mean- and slow-drift 2nd-order forces computed with Newman's approximation {0: None; [7, 8, 9, 10, 11, or 12]: WAMIT file to use} [Only one of MnDrift, NewmanApp, or DiffQTF can be non-zero. Used only when WaveDirMod=0]\n")) @@ -1664,12 +1699,13 @@ def write_HydroDyn(self): f.write('---------------------- STRIP THEORY OPTIONS --------------------------------------\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['WaveDisp'], 'WaveDisp', '- Method of computing Wave Kinematics {0: use undisplaced position, 1: use displaced position) } (switch)\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['AMMod'], 'AMMod', '- Method of computing distributed added-mass force. (0: Only and always on nodes below SWL at the undisplaced position. 2: Up to the instantaneous free surface) [overwrite to 0 when WaveMod = 0 or 6 or when WaveStMod = 0 in SeaState]\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['AMMod'], 'AMMod', '- Method of computing distributed added-mass force. (0: Only and always on nodes below SWL at the undisplaced position. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveStMod = 0 in SeaState]]\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['HstMod'], 'HstMod', '- Method of computing hydrostatic loads. (0: Up to the still water level. 1: Up to the instantaneous free surface) [overwrite to 0 when WaveStMod = 0 in SeaState]]\n')) f.write('---------------------- AXIAL COEFFICIENTS --------------------------------------\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['HydroDyn']['NAxCoef'], 'NAxCoef', '- Number of axial coefficients (-)\n')) f.write(" ".join(['{:^11s}'.format(i) for i in ['AxCoefID', 'AxCd', 'AxCa', 'AxCp', 'AxFDMod', 'AxVnCOff', 'AxFDLoFSc']])+'\n') - f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)']*7])+'\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)','(-)','(-)','(-)','(switch)','(Hz)','(-)']])+'\n') for i in range(self.fst_vt['HydroDyn']['NAxCoef']): ln = [] ln.append('{:^11d}'.format(self.fst_vt['HydroDyn']['AxCoefID'][i])) @@ -1981,7 +2017,8 @@ def write_SeaState(self): f.write('---------------------- WAVES ---------------------------------------------------\n') f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveMod'], 'WaveMod', '- Incident wave kinematics model {0: none=still water, 1: regular (periodic), 1P#: regular with user-specified phase, 2: JONSWAP/Pierson-Moskowitz spectrum (irregular), 3: White noise spectrum (irregular), 4: user-defined spectrum from routine UserWaveSpctrm (irregular), 5: Externally generated wave-elevation time series, 6: Externally generated full wave-kinematics time series [option 6 is invalid for PotMod/=0]} (switch)\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveStMod'], 'WaveStMod', '- Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching} (switch) [unused when WaveMod=0 or when PotMod/=0]\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveStMod'], 'WaveStMod', '- Model for stretching incident wave kinematics to instantaneous free surface {0: none=no stretching, 1: vertical stretching, 2: extrapolation stretching, 3: Wheeler stretching} (switch)\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SeaState']['WvCrntMod'], 'WvCrntMod', '- Combined wave-current modeling option {0: simple superposition, 1: include Doppler effect, 2: include both Doppler effect and wave amplitude/spectrum scaling} (switch) [unused when WaveMod=0 or WaveMod=6. Also unused when there is no current from SeaState (CurrMod=0) or from InflowWind if MHK.]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveTMax'], 'WaveTMax', '- Analysis time for incident wave calculations (sec) [unused when WaveMod=0; determines WaveDOmega=2Pi/WaveTMax in the IFFT]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveDT'], 'WaveDT', '- Time step for incident wave calculations (sec) [unused when WaveMod=0 or 7; 0.1<=WaveDT<=1.0 recommended; determines WaveOmegaMax=Pi/WaveDT in the IFFT]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveHs'], 'WaveHs', '- Significant wave height of incident waves (meters) [used only when WaveMod=1, 2, or 3]\n')) @@ -1997,7 +2034,7 @@ def write_SeaState(self): f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WvLowCOff'], 'WvLowCOff', '- Low cut-off frequency or lower frequency limit of the wave spectrum beyond which the wave spectrum is zeroed (rad/s) [unused when WaveMod=0, 1, or 6]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WvHiCOff'], 'WvHiCOff', '- High cut-off frequency or upper frequency limit of the wave spectrum beyond which the wave spectrum is zeroed (rad/s) [unused when WaveMod=0, 1, or 6]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveDir'], 'WaveDir', '- Incident wave propagation heading direction (degrees) [unused when WaveMod=0, 6 or 7]\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveDirMod'], 'WaveDirMod', '- Directional spreading function {0: none, 1: COS2S} (-) [only used when WaveMod=2,3, or 4]\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveDirMod'], 'WaveDirMod', '- Directional spreading function {0: none, 1: COS2S} (-) [only used when WaveMod=2,3, or 4; must be 0 if WvCrntMod/=0]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveDirSpread'], 'WaveDirSpread', '- Wave direction spreading coefficient ( > 0 ) (-) [only used when WaveMod=2,3, or 4 and WaveDirMod=1]\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveNDir'], 'WaveNDir', '- Number of wave directions (-) [only used when WaveMod=2,3, or 4 and WaveDirMod=1; odd number only]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveDirRange'], 'WaveDirRange', '- Range of wave directions (full range: WaveDir +/- 1/2*WaveDirRange) (degrees) [only used when WaveMod=2,3,or 4 and WaveDirMod=1]\n')) @@ -2012,8 +2049,8 @@ def write_SeaState(self): f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WaveNDAmp'], 'WaveNDAmp', '- Flag for normally distributed amplitudes (flag) [only used when WaveMod=2, 3, or 4]\n')) f.write('{:<22} {:<11} {:}'.format('"'+self.fst_vt['SeaState']['WvKinFile']+'"', 'WvKinFile', '- Root name of externally generated wave data file(s) (quoted string) [used only when WaveMod=5, 6 or 7]\n')) f.write('---------------------- 2ND-ORDER WAVES ----------------------------------------- [unused with WaveMod=0 or 6]\n') - f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WvDiffQTF'], 'WvDiffQTF', '- Full difference-frequency 2nd-order wave kinematics (flag)\n')) - f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WvSumQTF'], 'WvSumQTF', '- Full summation-frequency 2nd-order wave kinematics (flag)\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WvDiffQTF'], 'WvDiffQTF', '- Full difference-frequency 2nd-order wave kinematics (flag) [Must be false if WvCrntMod/=0]\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WvSumQTF'], 'WvSumQTF', '- Full summation-frequency 2nd-order wave kinematics (flag) [Must be false if WvCrntMod/=0]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WvLowCOffD'], 'WvLowCOffD', '- Low frequency cutoff used in the difference-frequencies (rad/s) [Only used with a difference-frequency method]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WvHiCOffD'], 'WvHiCOffD', '- High frequency cutoff used in the difference-frequencies (rad/s) [Only used with a difference-frequency method]\n')) f.write('{:<22} {:<11} {:}'.format(self.fst_vt['SeaState']['WvLowCOffS'], 'WvLowCOffS', '- Low frequency cutoff used in the summation-frequencies (rad/s) [Only used with a summation-frequency method]\n')) @@ -2091,7 +2128,7 @@ def write_SubDyn(self): f.write('{:<22} {:<11} {:}'.format(", ".join([f'{d:f}' for d in self.fst_vt['SubDyn']['JDampings']]), 'JDampings', '- Damping Ratios for each retained mode (% of critical) If Nmodes>0, list Nmodes structural damping ratios for each retained mode (% of critical), or a single damping ratio to be applied to all retained modes. (last entered value will be used for all remaining modes).\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['GuyanDampMod'], 'GuyanDampMod', '- Guyan damping {0=none, 1=Rayleigh Damping, 2=user specified 6x6 matrix}.\n')) f.write('{:<10} {:<10} {:<11} {:}'.format(self.fst_vt['SubDyn']['RayleighDamp'][0], self.fst_vt['SubDyn']['RayleighDamp'][1], 'RayleighDamp', '- Mass and stiffness proportional damping coefficients (Rayleigh Damping) [only if GuyanDampMod=1].\n')) - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['GuyanDampSize'], 'GuyanDampSize', '- Guyan damping matrix (6x6) [only if GuyanDampMod=2].\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['GuyanDampSize'], 'GuyanDampSize', '- Guyan damping matrix (6nTPx6nTP if fixed bottom or 6(nTP-1)-by-6(nTP-1) if floating) [only if GuyanDampMod=2].\n')) for j in range(self.fst_vt['SubDyn']['GuyanDampSize']): try: ln = " ".join(['{:14}'.format(i) for i in self.fst_vt['SubDyn']['GuyanDamp'][j,:]]) @@ -2100,6 +2137,18 @@ def write_SubDyn(self): ln += "\n" f.write(ln) + f.write('------- INITIAL RIGID-BODY POSITION [used only for floating structure with more than one transition pieces] -------\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['RBSurge', 'RBSway', 'RBHeave', 'RBRoll', 'RBPitch', 'RBYaw']])+'\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['(m)', '(m)', '(m)', '(deg)', '(deg)', '(deg)']])+'\n') + ln = [] + ln.append('{:^11}'.format(self.fst_vt['SubDyn']['RBSurge'])) + ln.append('{:^11}'.format(self.fst_vt['SubDyn']['RBSway'])) + ln.append('{:^11}'.format(self.fst_vt['SubDyn']['RBHeave'])) + ln.append('{:^11}'.format(self.fst_vt['SubDyn']['RBRoll'])) + ln.append('{:^11}'.format(self.fst_vt['SubDyn']['RBPitch'])) + ln.append('{:^11}'.format(self.fst_vt['SubDyn']['RBYaw'])) + f.write(" ".join(ln) + '\n') + f.write('---- STRUCTURE JOINTS: joints connect structure members (~Hydrodyn Input File)---\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NJoints'], 'NJoints', '- Number of joints (-)\n')) f.write(" ".join(['{:^11s}'.format(i) for i in ['JointID','JointXss','JointYss','JointZss','JointType','JointDirX','JointDirY','JointDirZ','JointStiff']])+' ![Coordinates of Member joints in SS-Coordinate System][JointType={1:cantilever, 2:universal joint, 3:revolute joint, 4:spherical joint}]\n') @@ -2133,11 +2182,12 @@ def write_SubDyn(self): f.write(" ".join(ln) + '\n') f.write('------- INTERFACE JOINTS: 1/0 for Locked (to the TP)/Free DOF @each Interface Joint (only Locked-to-TP implemented thus far (=rigid TP)) ---------\n') f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NInterf'], 'NInterf', '- Number of interface joints locked to the Transition Piece (TP): be sure to remove all rigid motion dofs\n')) - f.write(" ".join(['{:^11s}'.format(i) for i in ['IJointID', 'ItfTDXss', 'ItfTDYss', 'ItfTDZss', 'ItfRDXss', 'ItfRDYss', 'ItfRDZss']])+'\n') - f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(flag)', '(flag)', '(flag)', '(flag)', '(flag)', '(flag)']])+'\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['IJointID', 'TPID', 'ItfTDXss', 'ItfTDYss', 'ItfTDZss', 'ItfRDXss', 'ItfRDYss', 'ItfRDZss']])+'\n') + f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)', '(-)', '(flag)', '(flag)', '(flag)', '(flag)', '(flag)', '(flag)']])+'\n') for i in range(self.fst_vt['SubDyn']['NInterf']): ln = [] ln.append('{:^11d}'.format(self.fst_vt['SubDyn']['IJointID'][i])) + ln.append('{:^11d}'.format(self.fst_vt['SubDyn']['TPID'][i])) ln.append('{:^11d}'.format(self.fst_vt['SubDyn']['ItfTDXss'][i])) ln.append('{:^11d}'.format(self.fst_vt['SubDyn']['ItfTDYss'][i])) ln.append('{:^11d}'.format(self.fst_vt['SubDyn']['ItfTDZss'][i])) @@ -2171,10 +2221,10 @@ def write_SubDyn(self): ln.append('{:^11}'.format(self.fst_vt['SubDyn']['M_Spin'][i])) f.write(" ".join(ln) + '\n') f.write('------------------ CIRCULAR BEAM CROSS-SECTION PROPERTIES -----------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NBCPropSets'], 'NPropSets', '- Number of structurally unique circular cross-sections\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NPropSetsCyl'], 'NPropSetsCyl', '- Number of structurally unique circular cross-sections (if 0 the following table is ignored)\n')) f.write(" ".join(['{:^11s}'.format(i) for i in ['PropSetID', 'YoungE', 'ShearG', 'MatDens', 'XsecD', 'XsecT']])+'\n') f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)','(N/m2)','(N/m2)','(kg/m3)','(m)','(m)']])+'\n') - for i in range(self.fst_vt['SubDyn']['NBCPropSets']): + for i in range(self.fst_vt['SubDyn']['NPropSetsCyl']): ln = [] ln.append('{:^11d}'.format(self.fst_vt['SubDyn']['PropSetID1'][i])) ln.append('{:^11e}'.format(self.fst_vt['SubDyn']['YoungE1'][i])) @@ -2184,10 +2234,10 @@ def write_SubDyn(self): ln.append('{:^11}'.format(self.fst_vt['SubDyn']['XsecT'][i])) f.write(" ".join(ln) + '\n') f.write('------------------ RECTANGULAR BEAM CROSS-SECTION PROPERTIES -----------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NBRPropSets'], 'NPropSets', '- Number of structurally unique rectangular cross-sections\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['SubDyn']['NPropSetsRec'], 'NPropSetsRec', '- Number of structurally unique rectangular cross-sections (if 0 the following table is ignored)\n')) f.write(" ".join(['{:^11s}'.format(i) for i in ['PropSetID', 'YoungE', 'ShearG', 'MatDens', 'XsecSa', 'XsecSb', 'XsecT']])+'\n') f.write(" ".join(['{:^11s}'.format(i) for i in ['(-)','(N/m2)','(N/m2)','(kg/m3)','(m)','(m)','(m)']])+'\n') - for i in range(self.fst_vt['SubDyn']['NBRPropSets']): + for i in range(self.fst_vt['SubDyn']['NPropSetsRec']): ln = [] ln.append('{:^11d}'.format(self.fst_vt['SubDyn']['PropSetID2'][i])) ln.append('{:^11e}'.format(self.fst_vt['SubDyn']['YoungE2'][i])) @@ -2320,14 +2370,18 @@ def write_SubDyn(self): f.close() def write_ExtPtfm(self): - # Generate ExtPtfm input file + # Generate ExtPtfm input files - if self.fst_vt['ExtPtfm']['FileFormat'] == 0: - None - # self.write_Guyan() # TODO: need to impliment this. An example file not found to test - elif self.fst_vt['ExtPtfm']['FileFormat'] == 1: - self.write_Superelement() + self.write_Superelement() + if self.fst_vt['ExtPtfm']['HasConnections']: + self.write_Connections() + + if self.fst_vt['ExtPtfm']['HasUserForcing']: + self.write_UserForcing() + + if self.fst_vt['ExtPtfm']['HasConnForcing']: + self.write_ConnForcing() self.fst_vt['Fst']['SubFile'] = self.FAST_namingOut + '_ExtPtfm.dat' ep_file = os.path.join(self.FAST_runDirectory, self.fst_vt['Fst']['SubFile']) @@ -2340,16 +2394,22 @@ def write_ExtPtfm(self): f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['DT'], 'DT', '- Communication interval for controllers (s) (or "default")\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['IntMethod'], 'IntMethod', '- Integration Method {1:RK4; 2:AB4, 3:ABM4} (switch)\n')) f.write('---------------------- REDUCTION INPUTS ----------------------------------------\n') - f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['FileFormat'], 'FileFormat', '- File Format {0:Guyan; 1:FlexASCII} (switch)\n')) + f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['RBMod'], 'RBMod', '- Method for handling rigid-body motion (switch) {0: No special handling for rigid-body motion; 1: Transform to rigid-body frame of reference; 2: Transform to rigid-body frame of reference and add fictitious forces and exact self-weight}\n')) f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['Red_FileName'], 'Red_FileName', '- Path of the file containing Guyan/Craig-Bampton inputs (-)\n')) - f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['RedCst_FileName'], 'RedCst_FileName', '- Path of the file containing Guyan/Craig-Bampton constant inputs (-) (currently unused)\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['NActiveDOFList'], 'NActiveDOFList', '- Number of active CB mode listed in ActiveDOFList, use -1 for all modes (integer)\n')) f.write('{:<22} {:<11} {:}'.format(', '.join([f'{val}' for val in self.fst_vt['ExtPtfm']['ActiveDOFList']]), 'ActiveDOFList', '- List of CB modes index that are active, [unused if NActiveDOFList<=0]\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['NInitPosList'], 'NInitPosList', '- Number of initial positions listed in InitPosList, using 0 implies all DOF initialized to 0 (integer)\n')) f.write('{:<22} {:<11} {:}'.format(', '.join([f'{val}' for val in self.fst_vt['ExtPtfm']['InitPosList']]), 'InitPosList', '- List of initial positions for the CB modes [unused if NInitPosList<=0 or EquilStart=True]\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['NInitVelList'], 'NInitVelList', '- Number of initial positions listed in InitVelList, using 0 implies all DOF initialized to 0 (integer)\n')) f.write('{:<22} {:<11} {:}'.format(', '.join([f'{val}' for val in self.fst_vt['ExtPtfm']['InitVelList']]), 'InitVelList', '- List of initial velocities for the CB modes [unused if NInitVelPosList<=0 or EquilStart=True]\n')) - + f.write('---------------------- CONNECTION INPUTS ---------------------------------------\n') + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['HasConnections'], 'Connections', '- Flag for connection points on the structure (flag)\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['Conn_FileName'], 'Conn_FileName', '- Path of the file containing connection points (-)\n')) + f.write('---------------------- USER FORCING INPUTS -------------------------------------\n') + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['HasUserForcing'], 'UserForcing', '- Flag for user-prescribed modal forcing (flag)\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['Force_FileName'], 'Force_FileName', '- Path of the file containing user forcing time series (-)\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['HasConnForcing'], 'ConnForcing', '- Flag for user-prescribed connection forcing (flag)\n')) + f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['FConn_FileName'], 'FConn_FileName', '- Path of the file containing user connection force time series (-)\n')) f.write('---------------------- OUTPUT --------------------------------------------------\n') f.write('{!s:<22} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['SumPrint'], 'SumPrint', '- Print summary data to .sum (flag)\n')) f.write('{:<22d} {:<11} {:}'.format(self.fst_vt['ExtPtfm']['OutFile'], 'OutFile', '- Switch to determine where output will be placed: {1: in module output file only; 2: in glue code output file only; 3: both} (currently unused)\n')) @@ -2368,34 +2428,29 @@ def write_ExtPtfm(self): f.close() - def write_Superelement(self): def toString(SuperElement): # Function based on https://github.com/OpenFAST/openfast_toolbox/blob/353643ed917d113ec8dfd765813fef7d09752757/openfast_toolbox/io/fast_input_file.py#L2034 # Developed by Emmanuel Branlard (https://github.com/ebranlard) s='' - s+='!Comment\n' - s+='!Comment Flex 5 Format\n' s+='!Dimension: {}\n'.format(SuperElement['nDOF']) - s+='!Time increment in simulation: {}\n'.format(SuperElement['dt']) - s+='!Total simulation time in file: {}\n'.format(SuperElement['T']) s+='\n!Mass Matrix\n' - s+='!Dimension: {}\n'.format(SuperElement['nDOF']) s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in SuperElement['MassMatrix']) s+='\n\n!Stiffness Matrix\n' - s+='!Dimension: {}\n'.format(SuperElement['nDOF']) s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in SuperElement['StiffnessMatrix']) s+='\n\n!Damping Matrix\n' - s+='!Dimension: {}\n'.format(SuperElement['nDOF']) s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in SuperElement['DampingMatrix']) - s+='\n\n!Loading and Wave Elevation\n' - s+='!Dimension: 1 time column - {} force columns\n'.format(SuperElement['nDOF']) - s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in SuperElement['Loading']) + s+='\n\n!Weight constant\n' + s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in SuperElement['WeightConstant']) + + s+='\n\n!Weight stiffness matrix\n' + s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in SuperElement['WeightStiffness']) + return s # Generate Superelement input file @@ -2409,6 +2464,85 @@ def toString(SuperElement): os.fsync(f) f.close() + + def write_Connections(self): + + def toString(Connections): + # Function based on https://github.com/OpenFAST/openfast_toolbox/blob/353643ed917d113ec8dfd765813fef7d09752757/openfast_toolbox/io/fast_input_file.py#L2034 + # Developed by Emmanuel Branlard (https://github.com/ebranlard) + s='' + s+='!nConn: {}\n'.format(Connections['nConn']) + + s+='\n!Connections\n' + s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in Connections['Position']) + + s+='\n\n!Displacement\n' + s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in Connections['Displacement']) + + return s + + # Generate Superelement input file + self.fst_vt['ExtPtfm']['Conn_FileName'] = self.FAST_namingOut + '_ExtPtfm_Conn.dat' + conn_file = os.path.join(self.FAST_runDirectory, self.fst_vt['ExtPtfm']['Conn_FileName']) + f = open(conn_file, 'w') + + f.write(toString(self.fst_vt['ExtPtfm']['Connections'])) + + f.flush() + os.fsync(f) + f.close() + + + def write_UserForcing(self): + + def toString(UserForcing): + # Function based on https://github.com/OpenFAST/openfast_toolbox/blob/353643ed917d113ec8dfd765813fef7d09752757/openfast_toolbox/io/fast_input_file.py#L2034 + # Developed by Emmanuel Branlard (https://github.com/ebranlard) + s='' + s+='!nSteps: {}\n'.format(UserForcing['nSteps']) + + s+='\n!Forcing:\n' + s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in UserForcing['ForceTimeSeries']) + + return s + + # Generate user forcing input file + self.fst_vt['ExtPtfm']['Force_FileName'] = self.FAST_namingOut + '_ExtPtfm_UserFrc.dat' + UserFrc_file = os.path.join(self.FAST_runDirectory, self.fst_vt['ExtPtfm']['Force_FileName']) + f = open(UserFrc_file, 'w') + + f.write(toString(self.fst_vt['ExtPtfm']['UserForcing'])) + + f.flush() + os.fsync(f) + f.close() + + + def write_ConnForcing(self): + + def toString(ConnForcing): + # Function based on https://github.com/OpenFAST/openfast_toolbox/blob/353643ed917d113ec8dfd765813fef7d09752757/openfast_toolbox/io/fast_input_file.py#L2034 + # Developed by Emmanuel Branlard (https://github.com/ebranlard) + s='' + s+='!nSteps: {}\n'.format(ConnForcing['nSteps']) + + s+='\n!Forcing:\n' + s+='\n'.join(''.join('{:16.8e}'.format(x) for x in y) for y in ConnForcing['ForceTimeSeries']) + + return s + + # Generate user forcing input file + self.fst_vt['ExtPtfm']['FConn_FileName'] = self.FAST_namingOut + '_ExtPtfm_ConnFrc.dat' + ConnFrc_file = os.path.join(self.FAST_runDirectory, self.fst_vt['ExtPtfm']['FConn_FileName']) + f = open(ConnFrc_file, 'w') + + f.write(toString(self.fst_vt['ExtPtfm']['ConnForcing'])) + + f.flush() + os.fsync(f) + f.close() + + def write_MAP(self): # Generate MAP++ input file @@ -2709,7 +2843,8 @@ def write_NonLinearEA(self,Stiffness_file, Linetype, NonLinearEA): def write_StC(self,StC_vt,StC_filename): - stc_file = os.path.join(self.FAST_runDirectory, StC_filename) + sd_file = os.path.normpath(os.path.join(self.FAST_runDirectory, self.fst_vt['Fst']['ServoFile'])) + stc_file = os.path.join(os.path.dirname(sd_file), StC_filename) f = open(stc_file, 'w') f.write('------- STRUCTURAL CONTROL (StC) INPUT FILE ----------------------------\n') @@ -2719,7 +2854,7 @@ def write_StC(self,StC_vt,StC_filename): f.write('{!s:<22} {:<11} {:}'.format(StC_vt['Echo'], 'Echo', '- Echo input data to ".SD.ech" (flag)\n')) f.write('---------------------- StC DEGREES OF FREEDOM ----------------------------------\n') - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_DOF_MODE'], 'StC_DOF_MODE', '- DOF mode (switch) {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: TLCD; 4: Prescribed force/moment time series}\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_DOF_MODE'], 'StC_DOF_MODE', '- DOF mode (switch) {0: No StC or TLCD DOF; 1: StC_X_DOF, StC_Y_DOF, and/or StC_Z_DOF (three independent StC DOFs); 2: StC_XY_DOF (Omni-Directional StC); 3: StC_XYZ_DOF (Omni-Directional StC); 5: TLCD; 6: Prescribed force/moment time series; 7: Force determined by external DLL}\n')) f.write('{!s:<22} {:<11} {:}'.format(StC_vt['StC_X_DOF'], 'StC_X_DOF', '- DOF on or off for StC X (flag) [Used only when StC_DOF_MODE=1]\n')) f.write('{!s:<22} {:<11} {:}'.format(StC_vt['StC_Y_DOF'], 'StC_Y_DOF', '- DOF on or off for StC Y (flag) [Used only when StC_DOF_MODE=1]\n')) f.write('{!s:<22} {:<11} {:}'.format(StC_vt['StC_Z_DOF'], 'StC_Z_DOF', '- DOF on or off for StC Z (flag) [Used only when StC_DOF_MODE=1]\n')) @@ -2729,43 +2864,43 @@ def write_StC(self,StC_vt,StC_filename): f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_P_Y'], 'StC_P_Y', '- At rest Y position of StC (m)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_P_Z'], 'StC_P_Z', '- At rest Z position of StC (m)\n')) - f.write('---------------------- StC INITIAL CONDITIONS --------------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('---------------------- StC INITIAL CONDITIONS --------------------------------- [used only when StC_DOF_MODE=1, 2, or 3]\n') f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_DSP'], 'StC_X_DSP', '- StC X initial displacement (m) [relative to at rest position]\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_DSP'], 'StC_Y_DSP', '- StC Y initial displacement (m) [relative to at rest position]\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_DSP'], 'StC_Z_DSP', '- StC Z initial displacement (m) [relative to at rest position; used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) - f.write('{!s:<22} {:<11} {:}'.format(StC_vt['StC_Z_PreLd'], 'StC_Z_PreLd', '- StC Z pre-load (N) {"gravity" to offset for gravity load; "none" or 0 to turn off} [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_DSP'], 'StC_Z_DSP', '- StC Z initial displacement (m) [relative to at rest position; used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) + f.write('{!s:<22} {:<11} {:}'.format(StC_vt['StC_Z_PreLd'], 'StC_Z_PreLd', '- StC Z pre-load (N) {"gravity" to offset for gravity load; "none" or 0 to turn off} [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) - f.write('---------------------- StC CONFIGURATION -------------------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('---------------------- StC CONFIGURATION -------------------------------------- [used only when StC_DOF_MODE=1, 2, or 3]\n') f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_PSP'], 'StC_X_PSP', '- Positive stop position (maximum X mass displacement) (m)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_NSP'], 'StC_X_NSP', '- Negative stop position (minimum X mass displacement) (m)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_PSP'], 'StC_Y_PSP', '- Positive stop position (maximum Y mass displacement) (m)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_NSP'], 'StC_Y_NSP', '- Negative stop position (minimum Y mass displacement) (m)\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_PSP'], 'StC_Z_PSP', '- Positive stop position (maximum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_NSP'], 'StC_Z_NSP', '- Negative stop position (minimum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_PSP'], 'StC_Z_PSP', '- Positive stop position (maximum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_NSP'], 'StC_Z_NSP', '- Negative stop position (minimum Z mass displacement) (m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) - f.write('---------------------- StC MASS, STIFFNESS, & DAMPING ------------------------- [used only when StC_DOF_MODE=1 or 2]\n') - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_M'], 'StC_X_M', '- StC X mass (kg) [must equal StC_Y_M for StC_DOF_MODE = 2]\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_M'], 'StC_Y_M', '- StC Y mass (kg) [must equal StC_X_M for StC_DOF_MODE = 2]\n')) + f.write('---------------------- StC MASS, STIFFNESS, & DAMPING ------------------------- [used only when StC_DOF_MODE=1, 2, or 3]\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_M'], 'StC_X_M', '- StC X mass (kg) [used only when StC_DOF_MODE=1 and StC_X_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_M'], 'StC_Y_M', '- StC Y mass (kg) [used only when StC_DOF_MODE=1 and StC_Y_DOF=TRUE]\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_M'], 'StC_Z_M', '- StC Z mass (kg) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_XY_M'], 'StC_XY_M', '- StC Z mass (kg) [used only when StC_DOF_MODE=2]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Omni_M'], 'StC_Omni_M', '- StC omni mass (kg) [used only when StC_DOF_MODE=2 or 3]\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_K'], 'StC_X_K', '- StC X stiffness (N/m)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_K'], 'StC_Y_K', '- StC Y stiffness (N/m)\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_K'], 'StC_Z_K', '- StC Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_K'], 'StC_Z_K', '- StC Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_C'], 'StC_X_C', '- StC X damping (N/(m/s))\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_C'], 'StC_Y_C', '- StC Y damping (N/(m/s))\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C'], 'StC_Z_C', '- StC Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C'], 'StC_Z_C', '- StC Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_KS'], 'StC_X_KS', '- Stop spring X stiffness (N/m)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_KS'], 'StC_Y_KS', '- Stop spring Y stiffness (N/m)\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_KS'], 'StC_Z_KS', '- Stop spring Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_KS'], 'StC_Z_KS', '- Stop spring Z stiffness (N/m) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_CS'], 'StC_X_CS', '- Stop spring X damping (N/(m/s))\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_CS'], 'StC_Y_CS', '- Stop spring Y damping (N/(m/s))\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_CS'], 'StC_Z_CS', '- Stop spring Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_CS'], 'StC_Z_CS', '- Stop spring Z damping (N/(m/s)) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) - f.write('---------------------- StC USER-DEFINED SPRING FORCES ------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('---------------------- StC USER-DEFINED SPRING FORCES ------------------------- [used only when StC_DOF_MODE=1, 2, or 3]\n') f.write('{!s:<22} {:<11} {:}'.format(StC_vt['Use_F_TBL'], 'Use_F_TBL', '- Use spring force from user-defined table (flag)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['NKInpSt'], 'NKInpSt', '- Number of spring force input stations\n')) - f.write('---------------------- StC SPRING FORCES TABLE -------------------------------- [used only when StC_DOF_MODE=1 or 2]\n') + f.write('---------------------- StC SPRING FORCES TABLE -------------------------------- [used only when StC_DOF_MODE=1, 2, or 3]\n') f.write('X F_X Y F_Y Z F_Z\n') f.write('(m) (N) (m) (N) (m) (N)\n') table = StC_vt['SpringForceTable'] @@ -2773,21 +2908,21 @@ def write_StC(self,StC_vt,StC_filename): row = [x, f_x, y, f_y, z, f_z] f.write(' '.join(['{: 2.8e}'.format(val) for val in row])+'\n') - f.write('---------------------- StructUserProp CONTROL -------------------------------------------- [used only when StC_DOF_MODE=1 or 2]\n') - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_CMODE'], 'StC_CMODE', '- Control mode (switch) {0:none; 1: Semi-Active Control Mode; 2: Active Control Mode}\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_CChan'], 'StC_CChan', '- Control channel group (1:10) for stiffness and damping (StC_[XYZ]_K, StC_[XYZ]_C, and StC_[XYZ]_Brake) (specify additional channels for blade instances of StC active control -- one channel per blade) [used only when StC_DOF_MODE=1 or 2, and StC_CMODE=4 or 5]\n')) + f.write('---------------------- StructUserProp CONTROL -------------------------------------------- [used only when StC_DOF_MODE=1, 2, 3, or 7]\n') + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_CMODE'], 'StC_CMODE', '- Control mode (switch) {0:none; 1: Semi-Active Control Mode; 3: Active Control Mode through user subroutine; 4: Active Control Mode through Simulink (not available); 5: Active Control Mode through Bladed interface}\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_CChan'], 'StC_CChan', '- Control channel group (1:10) for stiffness and damping (StC_[XYZ]_K, StC_[XYZ]_C, and StC_[XYZ]_Brake) (specify additional channels for blade instances of StC active control -- one channel per blade) [used only when StC_DOF_MODE=1, 2, 3, or 7, and StC_CMODE=4 or 5]\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_SA_MODE'], 'StC_SA_MODE', '- Semi-Active control mode {1: velocity-based ground hook control; 2: Inverse velocity-based ground hook control; 3: displacement-based ground hook control 4: Phase difference Algorithm with Friction Force 5: Phase difference Algorithm with Damping Force} (-)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_C_HIGH'], 'StC_X_C_HIGH', '- StC X high damping for ground hook control\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_C_LOW'], 'StC_X_C_LOW', '- StC X low damping for ground hook control\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_C_HIGH'], 'StC_Y_C_HIGH', '- StC Y high damping for ground hook control\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_C_LOW'], 'StC_Y_C_LOW', '- StC Y low damping for ground hook control\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C_HIGH'], 'StC_Z_C_HIGH', '- StC Z high damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C_LOW'], 'StC_Z_C_LOW', '- StC Z low damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C_HIGH'], 'StC_Z_C_HIGH', '- StC Z high damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C_LOW'], 'StC_Z_C_LOW', '- StC Z low damping for ground hook control [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_X_C_BRAKE'], 'StC_X_C_BRAKE', '- StC X high damping for braking the StC (Don''t use it now. should be zero)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Y_C_BRAKE'], 'StC_Y_C_BRAKE', '- StC Y high damping for braking the StC (Don''t use it now. should be zero)\n')) - f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C_BRAKE'], 'StC_Z_C_BRAKE', '- StC Z high damping for braking the StC (Don''t use it now. should be zero) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE]\n')) + f.write('{:<22} {:<11} {:}'.format(StC_vt['StC_Z_C_BRAKE'], 'StC_Z_C_BRAKE', '- StC Z high damping for braking the StC (Don''t use it now. should be zero) [used only when StC_DOF_MODE=1 and StC_Z_DOF=TRUE or when StC_DOF_MODE=3]\n')) - f.write('---------------------- TLCD --------------------------------------------------- [used only when StC_DOF_MODE=3]\n') + f.write('---------------------- TLCD --------------------------------------------------- [used only when StC_DOF_MODE=5]\n') f.write('{:<22} {:<11} {:}'.format(StC_vt['L_X'], 'L_X', '- X TLCD total length (m)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['B_X'], 'B_X', '- X TLCD horizontal length (m)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['area_X'], 'area_X', '- X TLCD cross-sectional area of vertical column (m^2)\n')) @@ -2801,7 +2936,7 @@ def write_StC(self,StC_vt,StC_filename): f.write('{:<22} {:<11} {:}'.format(StC_vt['headLossCoeff_Y'], 'headLossCoeff_Y', '- Y TLCD head loss coeff (-)\n')) f.write('{:<22} {:<11} {:}'.format(StC_vt['rho_Y'], 'rho_Y', '- Y TLCD liquid density (kg/m^3)\n')) - f.write('---------------------- PRESCRIBED TIME SERIES --------------------------------- [used only when StC_DOF_MODE=4]\n') + f.write('---------------------- PRESCRIBED TIME SERIES --------------------------------- [used only when StC_DOF_MODE=6]\n') f.write('{:<22} {:<11} {:}'.format(StC_vt['PrescribedForcesCoord'], 'PrescribedForcesCoord', '- Prescribed forces are in global or local coordinates (switch) {1: global; 2: local}\n')) f.write('{!s:<22} {:<11} {:}'.format(StC_vt['PrescribedForcesFile'], 'PrescribedForcesFile', '- Time series force and moment (7 columns of time, FX, FY, FZ, MX, MY, MZ)\n')) f.write('-------------------------------------------------------------------------------\n') diff --git a/openfast_io/openfast_io/FileTools.py b/openfast_io/openfast_io/FileTools.py index e372ee2e72..b9ee030ca4 100644 --- a/openfast_io/openfast_io/FileTools.py +++ b/openfast_io/openfast_io/FileTools.py @@ -389,7 +389,7 @@ def cleanup_fstvt(fst_vt, ignoreVars=None, removeFileRef=False, removeArrayProps 'HydroFile', 'SubFile', 'MooringFile', - 'Red_FileName', + 'Red_FileName', 'Conn_FileName', 'Force_FileName', 'FConn_FileName', 'PrescribedForcesFile', 'actuatorDiskFile', 'BDBldFile(1)', 'BDBldFile(2)', 'BDBldFile(3)', diff --git a/openfast_io/openfast_io/tests/test_of_io_pytest.py b/openfast_io/openfast_io/tests/test_of_io_pytest.py index 49c864968f..d6c4f8dac1 100644 --- a/openfast_io/openfast_io/tests/test_of_io_pytest.py +++ b/openfast_io/openfast_io/tests/test_of_io_pytest.py @@ -13,8 +13,7 @@ from conftest import REPOSITORY_ROOT, BUILD_DIR, OF_PATH - -# Exercising the various OpenFAST modules +# Exercising the various OpenFAST modules FOLDERS_TO_RUN = [ "AWT_YFix_WSt" , # "openfast;elastodyn;aerodyn;servodyn" "AWT_WSt_StartUp_HighSpShutDown" , # "openfast;elastodyn;aerodyn;servodyn" @@ -56,6 +55,7 @@ "5MW_Land_DLL_WTurb_ADsk" , # "openfast;elastodyn;aerodisk" "5MW_Land_DLL_WTurb_ADsk_SED" , # "openfast;simple-elastodyn;aerodisk" "5MW_Land_DLL_WTurb_SED" , # "openfast;simple-elastodyn;aerodyn" + # "5MW_MRSemi_DLL_WSt_WavesIrr" , # "openfast;elastodyn;aerodyn;servodyn;hydrodyn;moordyn;offshore;subdyn;olaf;multirotor" ] @@ -337,4 +337,4 @@ def main(): Run the main function if the script is run directly or through VSCode debugger """ - main() \ No newline at end of file + main() diff --git a/openfast_io/pyproject.toml b/openfast_io/pyproject.toml index 965631b514..e5c1aaba7a 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.2.1" +version = "5.0.0" description = "Readers and writers for OpenFAST files." license = {file = "../LICENSE"} authors = [ diff --git a/reg_tests/CMakeLists.txt b/reg_tests/CMakeLists.txt index b65adf048f..4c99654a21 100644 --- a/reg_tests/CMakeLists.txt +++ b/reg_tests/CMakeLists.txt @@ -93,99 +93,61 @@ file(MAKE_DIRECTORY ${CTEST_BINARY_DIR}) foreach(regTest glue-codes/openfast glue-codes/openfast-cpp modules/aerodyn modules/beamdyn modules/hydrodyn modules/inflowwind modules/moordyn modules/subdyn openfast_io) file(MAKE_DIRECTORY ${CTEST_BINARY_DIR}/${regTest}) endforeach() +foreach(srcDir BAR_Baseline) + file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/modules/aerodyn/${srcDir}" + DESTINATION "${CTEST_BINARY_DIR}/modules/aerodyn/") +endforeach() +foreach(srcDir seastate_wr_kin1) + file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/modules/seastate/${srcDir}" + DESTINATION "${CTEST_BINARY_DIR}/modules/seastate/") +endforeach() -## openfast seed -foreach(turbineDirectory 5MW_Baseline AOC AWT27 SWRT UAE_VI WP_Baseline) - file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/${turbineDirectory}" - DESTINATION "${CTEST_BINARY_DIR}/glue-codes/openfast/") +## openfast test directories +foreach(srcDir 5MW_Baseline AOC AWT27 SWRT UAE_VI WP_Baseline) + file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/${srcDir}" + DESTINATION "${CTEST_BINARY_DIR}/glue-codes/openfast/") endforeach() -foreach(turbineDirectory 5MW_Baseline) - file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/${turbineDirectory}" - DESTINATION "${CTEST_BINARY_DIR}/glue-codes/python/") +## python test directories +foreach(srcDir 5MW_Baseline) + file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/${srcDir}" + DESTINATION "${CTEST_BINARY_DIR}/glue-codes/python/") endforeach() ## fastfarm seed -foreach(turbineDirectory 5MW_Baseline) - file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/fast-farm/${turbineDirectory}" - DESTINATION "${CTEST_BINARY_DIR}/glue-codes/fast-farm/") +foreach(srcDir 5MW_Baseline WAT_MannBoxDB) + file(COPY "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/fast-farm/${srcDir}" + DESTINATION "${CTEST_BINARY_DIR}/glue-codes/fast-farm/") endforeach() # add the tests include(${CMAKE_CURRENT_LIST_DIR}/CTestList.cmake) # Copy the DISCON controllers to the 5MW turbine directories -set(src "${CMAKE_CURRENT_LIST_DIR}/r-test/glue-codes/openfast/5MW_Baseline/ServoData") - set(of_dest "${CTEST_BINARY_DIR}/glue-codes/openfast/5MW_Baseline/ServoData/") -add_custom_command( - OUTPUT "${of_dest}/DISCON.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${of_dest}" -) -add_custom_command( - OUTPUT "${of_dest}/DISCON_ITIBarge.dll" - DEPENDS DISCON_ITIBarge - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_ITI/build/DISCON_ITIBarge.dll" "${of_dest}" - ) -add_custom_command( - OUTPUT "${of_dest}/DISCON_OC3Hywind.dll" - DEPENDS DISCON_OC3Hywind - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_OC3/build/DISCON_OC3Hywind.dll" "${of_dest}" -) - set(ofpy_dest "${CTEST_BINARY_DIR}/glue-codes/python/5MW_Baseline/ServoData/") -add_custom_command( - OUTPUT "${ofpy_dest}/DISCON.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ofpy_dest}" -) -add_custom_command( - OUTPUT "${ofpy_dest}/DISCON_ITIBarge.dll" - DEPENDS DISCON_ITIBarge - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_ITI/build/DISCON_ITIBarge.dll" "${ofpy_dest}" -) -add_custom_command( - OUTPUT "${ofpy_dest}/DISCON_OC3Hywind.dll" - DEPENDS DISCON_OC3Hywind - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON_OC3/build/DISCON_OC3Hywind.dll" "${ofpy_dest}" -) - set(ff_dest "${CTEST_BINARY_DIR}/glue-codes/fast-farm/5MW_Baseline/ServoData/") -add_custom_command( - OUTPUT "${ff_dest}/DISCON_WT1.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT1.dll" -) -add_custom_command( - OUTPUT "${ff_dest}/DISCON_WT2.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT2.dll" -) -add_custom_command( - OUTPUT "${ff_dest}/DISCON_WT3.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT3.dll" -) -add_custom_command( - OUTPUT "${ff_dest}/DISCON_WT4.dll" - DEPENDS DISCON - COMMAND "${CMAKE_COMMAND}" -E copy "${src}/DISCON/build/DISCON.dll" "${ff_dest}/DISCON_WT4.dll" -) - add_custom_target( regression_test_controllers DEPENDS - "${of_dest}/DISCON.dll" - "${of_dest}/DISCON_ITIBarge.dll" - "${of_dest}/DISCON_OC3Hywind.dll" - "${ofpy_dest}/DISCON.dll" - "${ofpy_dest}/DISCON_ITIBarge.dll" - "${ofpy_dest}/DISCON_OC3Hywind.dll" - "${ff_dest}/DISCON_WT1.dll" - "${ff_dest}/DISCON_WT2.dll" - "${ff_dest}/DISCON_WT3.dll" - "${ff_dest}/DISCON_WT4.dll" + DISCON + DISCON_ITIBarge + DISCON_OC3Hywind + # OpenFAST + COMMAND "${CMAKE_COMMAND}" -E copy $ ${of_dest} + COMMAND "${CMAKE_COMMAND}" -E copy $ ${of_dest} + COMMAND "${CMAKE_COMMAND}" -E copy $ ${of_dest} + COMMAND "${CMAKE_COMMAND}" -E copy $ ${of_dest}/DISCON_OC3Hywind-1.dll + COMMAND "${CMAKE_COMMAND}" -E copy $ ${of_dest}/DISCON_OC3Hywind-2.dll + # Python + COMMAND "${CMAKE_COMMAND}" -E copy $ ${ofpy_dest} + COMMAND "${CMAKE_COMMAND}" -E copy $ ${ofpy_dest} + COMMAND "${CMAKE_COMMAND}" -E copy $ ${ofpy_dest} + # FAST.Farm + COMMAND "${CMAKE_COMMAND}" -E copy $ ${ff_dest}/DISCON_WT1.dll + COMMAND "${CMAKE_COMMAND}" -E copy $ ${ff_dest}/DISCON_WT2.dll + COMMAND "${CMAKE_COMMAND}" -E copy $ ${ff_dest}/DISCON_WT3.dll + COMMAND "${CMAKE_COMMAND}" -E copy $ ${ff_dest}/DISCON_WT4.dll ) add_custom_target( diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index ac8076581f..5cd10e4da6 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -350,7 +350,10 @@ of_regression("SWRT_YFree_VS_EDC01" "openfast;elastodyn;aerod of_regression("SWRT_YFree_VS_WTurb" "openfast;elastodyn;aerodyn;servodyn") of_regression("5MW_Land_DLL_WTurb" "openfast;elastodyn;aerodyn;servodyn") of_regression("5MW_Land_DLL_WTurb_wNacDrag" "openfast;elastodyn;aerodyn;servodyn") +of_regression("5MW_Land_DLL_WTurb_wBlPDyn" "openfast;elastodyn;aerodyn;servodyn") of_regression("5MW_OC3Mnpl_DLL_WTurb_WavesIrr" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;subdyn;offshore") +of_regression("5MW_OC3Mnpl_DLL_WTurb_WavesIrr_IceDyn" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;subdyn;icedyn;offshore") +of_regression("5MW_OC3Mnpl_DLL_WTurb_WavesIrr_IceFloe" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;subdyn;icefloe;offshore") of_regression("5MW_OC3Mnpl_DLL_WTurb_WavesIrr_Restart" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;subdyn;offshore;restart") of_regression("5MW_OC3Trpd_DLL_WSt_WavesReg" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;subdyn;offshore") of_regression("5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;subdyn;offshore") @@ -358,14 +361,18 @@ of_regression("5MW_ITIBarge_DLL_WTurb_WavesIrr" "openfast;elastodyn;aerod of_regression("5MW_TLP_DLL_WTurb_WavesIrr_WavesMulti" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;map;offshore") of_regression("5MW_OC3Spar_DLL_WTurb_WavesIrr" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;map;offshore") of_regression("5MW_OC4Semi_WSt_WavesWN" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;moordyn;offshore") +of_regression("5MW_MRSemi_DLL_WSt_WavesIrr" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;moordyn;offshore;subdyn;olaf;multirotor") of_regression("5MW_Land_BD_DLL_WTurb" "openfast;beamdyn;aerodyn;servodyn") +of_regression("5MW_Land_BD_DLL_WTurb_StC" "openfast;beamdyn;aerodyn;servodyn;stc") of_regression("5MW_Land_BD_Init" "openfast;beamdyn;aerodyn;servodyn") -of_regression("5MW_OC4Jckt_ExtPtfm" "openfast;elastodyn;extptfm") +of_regression("5MW_OC4Jckt_ExtPtfm" "openfast;elastodyn;extptfm;offshore") 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("StC_test_OC4Semi_blade2" "openfast;servodyn;hydrodyn;moordyn;offshore;stc") 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_MR" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;moordyn;multirotor;offshore") of_regression("MHK_RM1_Floating_wNacDrag" "openfast;elastodyn;aerodyn;hydrodyn;moordyn;mhk;offshore") of_regression("MHK_RM1_Floating_Tank-scaled" "openfast;elastodyn;aerodyn;hydrodyn;moordyn;mhk;offshore;scaled") of_regression("Tailfin_FreeYaw1DOF_PolarBased" "openfast;elastodyn;aerodyn") @@ -373,7 +380,9 @@ of_regression("Tailfin_FreeYaw1DOF_Unsteady" "openfast;elastodyn;aerod of_regression("5MW_Land_DLL_WTurb_ADsk" "openfast;elastodyn;aerodisk") of_regression("5MW_Land_DLL_WTurb_ADsk_SED" "openfast;simple-elastodyn;aerodisk") of_regression("5MW_Land_DLL_WTurb_SED" "openfast;simple-elastodyn;aerodyn") - +of_regression("IEA22MW_ModalDamping" "openfast;beamdyn;servodyn") +of_regression("IEA22MW_ModalDampingLoose" "openfast;beamdyn;servodyn") +of_regression("OC6_phaseII" "openfast;soildyn;subdyn;hydrodyn;offshore;stc") of_regression("MinimalExample" "openfast;elastodyn") of_aeromap_regression("5MW_Land_AeroMap" "aeromap;elastodyn;aerodyn") @@ -410,6 +419,9 @@ of_regression_linear("Fake5MW_AeroLin_B3_UA6" "-highpass=0.05" "openfas of_regression_linear("WP_Stationary_Linear" "" "openfast;linear;elastodyn") of_regression_linear("Ideal_Beam_Fixed_Free_Linear" "-highpass=0.10" "openfast;linear;beamdyn") of_regression_linear("Ideal_Beam_Free_Free_Linear" "-highpass=0.10" "openfast;linear;beamdyn") +of_regression_linear("Damped_Beam_Fixed" "-highpass=0.10" "openfast;linear;beamdyn") +of_regression_linear("Damped_Beam_Rotating" "-highpass=0.10" "openfast;linear;beamdyn") +of_regression_linear("Damped_Beam_Rotated" "-highpass=0.10" "openfast;linear;beamdyn") of_regression_linear("5MW_Land_Linear_Aero" "-highpass=0.25" "openfast;linear;elastodyn;servodyn;aerodyn") of_regression_linear("5MW_Land_Linear_Aero_CalcSteady" "-highpass=0.25" "openfast;linear;elastodyn;servodyn;aerodyn") of_regression_linear("5MW_Land_BD_Linear" "" "openfast;linear;beamdyn;servodyn") @@ -421,12 +433,13 @@ of_regression_linear("StC_test_OC4Semi_Linear_Tow" "" "openfas of_regression_linear("WP_Stationary_Linear" "" "openfast;linear;elastodyn") of_regression_linear("5MW_OC3Spar_Linear" "" "openfast;linear;map;hydrodyn") of_regression_linear("5MW_OC3Mnpl_Linear" "" "openfast;linear;hydrodyn;servodyn;moordyn") +of_regression_linear("MHK_RM1_Floating_MR_Linear" "-highpass=0.05" "openfast;linear;elastodyn;aerodyn;servodyn;hydrodyn;moordyn;multirotor;offshore;mhk") # FAST Farm regression tests if(BUILD_FASTFARM) + ff_regression("AMReX" "" "fastfarm") ff_regression("TSinflow" "" "fastfarm") ff_regression("LESinflow" "" "fastfarm") -# ff_regression("Uninflow_curl" "" "fastfarm") ff_regression("TSinflow_curl" "" "fastfarm") ff_regression("ModAmb_3" "" "fastfarm") ff_regression("TSinflowADskSED" "" "fastfarm;aerodisk;simple-elastodyn") @@ -450,6 +463,7 @@ ad_regression("ad_BAR_SineMotion" "aerodyn;bem") ad_regression("ad_BAR_SineMotion_UA4_DBEMT3" "aerodyn;bem") ad_regression("ad_BAR_RNAMotion" "aerodyn;bem") ad_regression("ad_B1n2_OLAF" "aerodyn;OLAF") +ad_regression("ad_Sphere_OLAF" "aerodyn;OLAF") py_ad_regression("py_ad_5MW_OC4Semi_WSt_WavesWN" "aerodyn;bem;python") py_ad_regression("py_ad_B1n2_OLAF" "aerodyn;OLAF;python") @@ -457,9 +471,10 @@ py_ad_regression("py_ad_B1n2_OLAF" "aerodyn;OLAF;python") ua_regression("ua_redfreq" "unsteadyaero") # BeamDyn regression tests -bd_regression("bd_5MW_dynamic" "beamdyn;dynamic") -bd_regression("bd_5MW_dynamic_gravity_Az00" "beamdyn;dynamic") -bd_regression("bd_5MW_dynamic_gravity_Az90" "beamdyn;dynamic") +bd_regression("bd_5MW_dynamic" "beamdyn;dynamic") +bd_regression("bd_5MW_dynamic_gravity_Az00" "beamdyn;dynamic") +bd_regression("bd_5MW_dynamic_gravity_Az90" "beamdyn;dynamic") +bd_regression("bd_5MW_dynamic_modal_damping" "beamdyn;dynamic") bd_regression("bd_curved_beam" "beamdyn;static") bd_regression("bd_isotropic_rollup" "beamdyn;static") bd_regression("bd_static_cantilever_beam" "beamdyn;static") @@ -533,6 +548,8 @@ seast_regression("seastate_CNW2" "seastate") seast_regression("seastate_WaveMod7_WaveStMod1" "seastate") seast_regression("seastate_WaveMod7_WaveStMod2" "seastate") seast_regression("seastate_WaveMod7_WaveStMod3" "seastate") +seast_regression("seastate_WvCrntMod1" "seastate") +seast_regression("seastate_WvCrntMod2" "seastate") seast_regression("seastate_wavemod5" "seastate") # place at end since it reads outputs generated by seastate_wr_kin1 py_seast_regression("py_seastate_1" "seastate;python") diff --git a/reg_tests/executeAerodynRegressionCase.py b/reg_tests/executeAerodynRegressionCase.py index 30fe3c2b90..51f7622469 100644 --- a/reg_tests/executeAerodynRegressionCase.py +++ b/reg_tests/executeAerodynRegressionCase.py @@ -118,6 +118,24 @@ localOutFile = localOutFileCase4 baselineOutFile = os.path.join(targetOutputDirectory, os.path.basename(localOutFile)) +# --- Specific test for sphere (no output file generated) +if caseName=='ad_Sphere_OLAF': + vtk_file = os.path.join(testBuildDirectory, 'vtk_fvw', 'ad_driver.FVW_Glb.SrcPnl.000000002.vtk') + if os.path.exists(vtk_file): + # Note: would need the VTKFile reader from openfast_toolbox to run PlotCp.py + CpMax = float(list(open(vtk_file))[1061]) # Read line 1062 ... + CpMaxRef = -1.259784 # Based on current resolution, not analytical + if np.abs(CpMax-CpMaxRef)<0.1: + print(f'[ OK ] Sphere Cp Max is {CpMax}') + sys.exit(0) + else: + print(f'[FAIL] Sphere Cp Max is {CpMax} instead of {CpMax}') + sys.exit(1) + else: + print(f'Error: source panel vtk file was not generated: {vtk_file}') + sys.exit(1) + +# --- Regular .outb comparison rtl.validateFileOrExit(localOutFile) rtl.validateFileOrExit(baselineOutFile) diff --git a/reg_tests/executeFASTFarmRegressionCase.py b/reg_tests/executeFASTFarmRegressionCase.py index ce092f851d..f8b6dc5287 100644 --- a/reg_tests/executeFASTFarmRegressionCase.py +++ b/reg_tests/executeFASTFarmRegressionCase.py @@ -36,7 +36,7 @@ from errorPlotting import exportCaseSummary ##### Helper functions -excludeExt=['.out','.outb','.ech','.yaml','.sum','.log'] +excludeExt=['.ech','.yaml','.sum','.log'] ##### Main program @@ -125,7 +125,8 @@ # create the local output directory if it does not already exist if not os.path.isdir(testBuildDirectory): - rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt) + rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt, + renameExtDict={'.out':'.ref.out', '.outb':'.ref.outb'}) caseName='FAST.Farm' # for ease of comparison diff --git a/reg_tests/executeOpenfastAeroAcousticRegressionCase.py b/reg_tests/executeOpenfastAeroAcousticRegressionCase.py index e78bee7ba7..ecdae78844 100644 --- a/reg_tests/executeOpenfastAeroAcousticRegressionCase.py +++ b/reg_tests/executeOpenfastAeroAcousticRegressionCase.py @@ -37,7 +37,7 @@ from errorPlotting import exportCaseSummary ##### Helper functions -excludeExt=['.out','.outb','.ech','.yaml','.sum','.log'] +excludeExt=['.ech','.yaml','.sum','.log'] ##### Main program @@ -96,7 +96,8 @@ # create the local output directory if it does not already exist # and initialize it with input files for all test cases if not os.path.isdir(testBuildDirectory): - rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt) + rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt, + renameExtDict={'.out':'.ref.out', '.outb':'.ref.outb'}) ### Run openfast on the test case if not noExec: diff --git a/reg_tests/executeOpenfastCppRegressionCase.py b/reg_tests/executeOpenfastCppRegressionCase.py index 7aaae53217..d00e193373 100644 --- a/reg_tests/executeOpenfastCppRegressionCase.py +++ b/reg_tests/executeOpenfastCppRegressionCase.py @@ -29,7 +29,7 @@ import glob ##### Helper functions -excludeExt=['.out','.outb','.ech','.sum','.log'] +excludeExt=['.ech','.sum','.log'] ##### Main program @@ -101,7 +101,8 @@ shutil.copy2(srcname, dstname) if not os.path.isdir(testBuildDirectory): - rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt) + rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt, + renameExtDict={'.outb':'.ref.outb', '.out':'.ref.out'}) ### Run openfast on the test case if not noExec: @@ -124,7 +125,7 @@ ### Build the filesystem navigation variables for running the regression test localOutFile = os.path.join(testBuildDirectory, "5MW_Land_DLL_WTurb_cpp.outb") -baselineOutFile = os.path.join(inputsDirectory, "5MW_Land_DLL_WTurb_cpp.outb.gold") +baselineOutFile = os.path.join(inputsDirectory, "5MW_Land_DLL_WTurb_cpp.outb") rtl.validateFileOrExit(localOutFile) rtl.validateFileOrExit(baselineOutFile) diff --git a/reg_tests/executeOpenfastLinearRegressionCase.py b/reg_tests/executeOpenfastLinearRegressionCase.py index c5bb641041..ff9aabeb1b 100644 --- a/reg_tests/executeOpenfastLinearRegressionCase.py +++ b/reg_tests/executeOpenfastLinearRegressionCase.py @@ -39,7 +39,7 @@ # from weio.fast_linearization_file import FASTLinearizationFile ##### Helper functions -excludeExt=['.out','.outb','.ech','.yaml','.sum','.log','.md'] +excludeExt=['.ech','.yaml','.sum','.log','.md'] def file_line_count(filename): file_handle = open(filename, 'r') @@ -139,7 +139,7 @@ def indent(msg, sindent='\t'): # create the local output directory if it does not already exist # and initialize it with input files for all test cases -for data in ["Ideal_Beam", "WP_Baseline"]: +for data in ["Ideal_Beam", "WP_Baseline", "Damped_Beam"]: dataDir = os.path.join(buildDirectory, data) if not os.path.isdir(dataDir): rtl.copyTree(os.path.join(moduleDirectory, data), dataDir, excludeExt=excludeExt) @@ -161,10 +161,11 @@ def indent(msg, sindent='\t'): rtl.copyTree(srcname, dstname, excludeExt=excludeExt) else: shutil.copy2(srcname, dstname) -# -# Copying the actual test directory + +# Copy the actual test directory if not os.path.isdir(testBuildDirectory): - rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt, renameExtDict={'.lin':'.ref_lin'}) + rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt, + renameExtDict={'.lin':'.ref_lin', '.out': '.ref.out', '.outb': '.ref.outb'}) ### Run openfast on the test case if not noExec: @@ -432,7 +433,7 @@ def freqFileClose(file_freq_ref,file_freq_new): ErrorsLoc, ElemErrorsLoc = compareLin(f,ff1,ff2) Errors += ErrorsLoc if len(ElemErrorsLoc)>0: - Errors += ElemErrorsLoc[:3] # Just a couple of them + Errors += ElemErrorsLoc[:5] # Just a couple of them freqFileClose(ff1,ff2) @@ -440,6 +441,14 @@ def freqFileClose(file_freq_ref,file_freq_new): if len(Errors)>0: exitWithError('See errors below: \n'+'\n'.join(Errors)) +# If able to import openfast_toolbox, generate input file for visualization +# try: +# import openfast_toolbox.linearization as lin +# CDDOP, MBCOP = lin.getCampbellDataOP(caseInputFile, writeModes=True, verbose=True) +# vizfile = lin.writeVizFile(caseInputFile, verbose=True, VTKLinModes=1, VTKLinScale=10, VTKModes="1", VTKLinTim=2) +# except ImportError as e: +# pass + # passing case sys.exit(0) diff --git a/reg_tests/executeOpenfastRegressionCase.py b/reg_tests/executeOpenfastRegressionCase.py index ae863d3a46..0d0832aabc 100644 --- a/reg_tests/executeOpenfastRegressionCase.py +++ b/reg_tests/executeOpenfastRegressionCase.py @@ -37,7 +37,7 @@ from errorPlotting import exportCaseSummary ##### Helper functions -excludeExt=['.out','.outb','.ech','.yaml','.sum','.log'] +excludeExt=['.ech','.yaml','.sum','.log'] ##### Main program @@ -96,31 +96,14 @@ # create the local output directory if it does not already exist # and initialize it with input files for all test cases -for data in ["AOC", "AWT27", "_DummyTurbineData", "SWRT", "UAE_VI", "WP_Baseline"]: +for data in ["5MW_Baseline", "AOC", "AWT27", "_DummyTurbineData", "SWRT", "UAE_VI", "WP_Baseline"]: dataDir = os.path.join(buildDirectory, data) if not os.path.isdir(dataDir): rtl.copyTree(os.path.join(moduleDirectory, data), dataDir, excludeExt=excludeExt) -# Special copy for the 5MW_Baseline folder because the Windows python-only workflow may have already created data in the subfolder ServoData -dst = os.path.join(buildDirectory, "5MW_Baseline") -src = os.path.join(moduleDirectory, "5MW_Baseline") -if not os.path.isdir(dst): - rtl.copyTree(src, dst, excludeExt=excludeExt) -else: - names = os.listdir(src) - for name in names: - if name == "ServoData": - continue - srcname = os.path.join(src, name) - dstname = os.path.join(dst, name) - if os.path.isdir(srcname): - if not os.path.isdir(dstname): - rtl.copyTree(srcname, dstname, excludeExt=excludeExt) - else: - shutil.copy2(srcname, dstname) - if not os.path.isdir(testBuildDirectory): - rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt) + rtl.copyTree(inputsDirectory, testBuildDirectory, excludeExt=excludeExt, + renameExtDict={'.out': '.ref.out', '.outb': '.ref.outb'}) ### Run openfast on the test case if not noExec: diff --git a/reg_tests/executePythonRegressionCase.py b/reg_tests/executePythonRegressionCase.py index 96d8beee21..7a7d13eb03 100644 --- a/reg_tests/executePythonRegressionCase.py +++ b/reg_tests/executePythonRegressionCase.py @@ -141,12 +141,21 @@ ### Build the filesystem navigation variables for running the regression test localOutFile = os.path.join(testBuildDirectory, caseName + ".outb") baselineOutFile = os.path.join(targetOutputDirectory, caseName + ".outb") +rtl.validateFileOrExit(localOutFile) rtl.validateFileOrExit(baselineOutFile) -testInfo = { - "attribute_names": output_channel_names -} +testInfo = {"attribute_names": output_channel_names} testData = openfastlib.output_values + +# Remove columns that shouldn't be compared +for col in 'ConvIter ConvError NumUJac'.split(): + try: + i = testInfo['attribute_names'].index(col) + del testInfo['attribute_names'][i] + testData = np.delete(testData, i, axis=1) + except ValueError as e: + continue + baselineData, baselineInfo, _ = pass_fail.readFASTOut(baselineOutFile) passing_channels = pass_fail.passing_channels(testData.T, baselineData.T, rtol, atol) diff --git a/reg_tests/executeSeaStateRegressionCase.py b/reg_tests/executeSeaStateRegressionCase.py index caab272448..2784060bff 100644 --- a/reg_tests/executeSeaStateRegressionCase.py +++ b/reg_tests/executeSeaStateRegressionCase.py @@ -88,17 +88,6 @@ if not os.path.isdir(inputsDirectory): rtl.exitWithError("The test data inputs directory, {}, does not exist. Verify your local repository is up to date.".format(inputsDirectory)) -# Special case, copy the seastate_wr_kin1 files first since seastate_wavemod5 requires them -dst = os.path.join(buildDirectory, "seastate_wr_kin1") -src = os.path.join(moduleDirectory, "seastate_wr_kin1") -try: - rtl.copyTree(src, dst) -except: - # This can fail if two processes are copying the file at the same time - print('>>> Copy failed') - import time - time.sleep(1) - # create the local output directory and initialize it with input files if not os.path.isdir(testBuildDirectory): rtl.copyTree(inputsDirectory, testBuildDirectory, renameDict={'seastate.SeaSt.out':'seastate.SeaSt.Ref.out'}) diff --git a/reg_tests/lib/errorPlotting.py b/reg_tests/lib/errorPlotting.py index 7de955b21b..37b10fe188 100644 --- a/reg_tests/lib/errorPlotting.py +++ b/reg_tests/lib/errorPlotting.py @@ -42,6 +42,23 @@ def _validateAndExpandInputs(argv): def _parseSolution(solution): try: data, info, _ = load_output(solution) + + # Remove solution iteration columns + for col in 'ConvIter ConvError NumUJac'.split(): + + # If column exists, get index + try: + i = info['attribute_names'].index(col) + except ValueError as e: + continue + + # Remove column from data array + data = np.delete(data, i, axis=1) + + # Remove column from attribute names and units + del info['attribute_names'][i] + del info['attribute_units'][i] + return (data, info) except Exception as e: rtl.exitWithError("Error: {}".format(e)) diff --git a/reg_tests/lib/fast_linearization_file.py b/reg_tests/lib/fast_linearization_file.py index bda25b1ba2..a7e89ffacd 100644 --- a/reg_tests/lib/fast_linearization_file.py +++ b/reg_tests/lib/fast_linearization_file.py @@ -112,7 +112,9 @@ def readMat(fid, n, m, name=''): # Read rows from file, raise exception on failure try: - vals = np.genfromtxt(fid, dtype=np.float64, max_rows=n) + vals = np.empty([n,m], np.float64) + for i in range(n): + vals[i,:] = f.readline().split() except: raise Exception('Failed to convert into an array of float the matrix `{}`\n\tin linfile: {}'.format(name, self.filename)) @@ -172,6 +174,9 @@ def readMat(fid, n, m, name=''): self['C'] = readMat(f, ny, nx, 'C') elif line.find('D:')>=0: self['D'] = readMat(f, ny, nu, 'D') + elif line.find('J:')>=0: + _, rows, _, cols = line.split() + self['J'] = readMat(f, int(rows), int(cols), 'J') elif line.find('dUdu:')>=0: self['dUdu'] = readMat(f, nu, nu,'dUdu') elif line.find('dUdy:')>=0: diff --git a/reg_tests/lib/pass_fail.py b/reg_tests/lib/pass_fail.py index 1a9e0f1e75..2c8be35b62 100644 --- a/reg_tests/lib/pass_fail.py +++ b/reg_tests/lib/pass_fail.py @@ -26,7 +26,26 @@ def readFASTOut(fastoutput): try: - return load_output(fastoutput) + # Load output file + data, info, _ = load_output(fastoutput) + + # Remove solution iteration columns + for col in 'ConvIter ConvError NumUJac'.split(): + + # If column exists, get index + try: + i = info['attribute_names'].index(col) + except ValueError as e: + continue + + # Remove column from data array + data = np.delete(data, i, axis=1) + + # Remove column from attribute names and units + del info['attribute_names'][i] + del info['attribute_units'][i] + + return data, info, 1 except Exception as e: rtl.exitWithError("Error: {}".format(e)) @@ -65,7 +84,7 @@ def passing_channels(test, baseline, RTOL_MAGNITUDE, ATOL_MAGNITUDE) -> np.ndarr where_not_nan = ~np.isnan(test) where_not_inf = ~np.isinf(test) - passing_channels = np.all(where_close * where_not_nan * where_not_inf, axis=1) + passing_channels = np.all(where_close & where_not_nan & where_not_inf, axis=1) return passing_channels def maxnorm(data, axis=0): diff --git a/reg_tests/r-test b/reg_tests/r-test index 6fda1b18fe..dd5feaaaa5 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 6fda1b18fe6d720fdd47c6b18823b3a755cd004c +Subproject commit dd5feaaaa500ba7283140107806300d551cff0a7 diff --git a/requirements.txt b/requirements.txt index 1006eeb363..38826c3697 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,3 +4,4 @@ vtk Bokeh>=2.4,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3 pytest nptdms +pandas diff --git a/share/template-module/src/ModuleName_Registry.txt b/share/template-module/src/ModuleName_Registry.txt index 424928843c..053f51346f 100644 --- a/share/template-module/src/ModuleName_Registry.txt +++ b/share/template-module/src/ModuleName_Registry.txt @@ -23,17 +23,7 @@ typedef ^ ^ LOGICAL Linearize - .FALSE. - # Define outputs from the initialization routine here: typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputHdr {:} - - "Names of the output-to-file channels" - typedef ^ InitOutputType CHARACTER(ChanLen) WriteOutputUnt {:} - - "Units of the output-to-file channels" - -# if this module has implemented linearization, return the names of the rows/columns of the Jacobian matrices: -#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_y {:} - - "Names of the outputs used in linearization" - -#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_x {:} - - "Names of the continuous states used in linearization" - -#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_xd {:} - - "Names of the discrete states used in linearization" - -#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_z {:} - - "Names of the constraint states used in linearization" - -#typedef ^ InitOutputType CHARACTER(LinChanLen) LinNames_u {:} - - "Names of the inputs used in linearization" - -#typedef ^ InitOutputType LOGICAL RotFrame_y {:} - - "Flag that tells FAST/MBC3 if the outputs used in linearization are in the rotating frame" - -#typedef ^ InitOutputType LOGICAL RotFrame_x {:} - - "Flag that tells FAST/MBC3 if the continuous states used in linearization are in the rotating frame" - -#typedef ^ InitOutputType LOGICAL RotFrame_xd {:} - - "Flag that tells FAST if the discrete states used in linearization are in the rotating frame" - -#typedef ^ InitOutputType LOGICAL RotFrame_z {:} - - "Flag that tells FAST if the constraint states used in linearization are in the rotating frame" - -#typedef ^ InitOutputType LOGICAL RotFrame_u {:} - - "Flag that tells FAST/MBC3 if the inputs used in linearization are in the rotating frame" - +typedef ^ InitOutputType ModVarsType Vars - - - "Module Variables for solver and linearization" - # ..... States .................................................................................................................... diff --git a/unit_tests/CMakeLists.txt b/unit_tests/CMakeLists.txt index 853c8198d6..c441a90a20 100644 --- a/unit_tests/CMakeLists.txt +++ b/unit_tests/CMakeLists.txt @@ -91,4 +91,21 @@ add_custom_target( beamdyn_utest aerodyn_utest inflowwind_utest -) \ No newline at end of file +) + +if (AMREX_READER AND BUILD_FASTFARM) + # Need input files + add_custom_target(copy_amrex_reader_utest_files ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/modules/awae/tests/data ${CMAKE_BINARY_DIR}/unit_tests/data + ) + # FAST.Farm AMReX reader test + add_executable(amrex_reader_utest + ${CMAKE_SOURCE_DIR}/modules/awae/tests/AMReX_reader_utest.F90 + ${CMAKE_SOURCE_DIR}/modules/awae/tests/test_AMReX_reader.f90 + ) + target_link_libraries(amrex_reader_utest awaelib nwtclibs testdrivelib) + add_test(NAME amrex_reader_utest COMMAND amrex_reader_utest) + add_dependencies(amrex_reader_utest copy_amrex_reader_utest_files) # copy input files needed for this test + add_dependencies(unit_tests amrex_reader_utest) # add to the unit_tests target +endif() + diff --git a/vs-build/.gitignore b/vs-build/.gitignore new file mode 100644 index 0000000000..5253e137da --- /dev/null +++ b/vs-build/.gitignore @@ -0,0 +1,4 @@ +.vs +*.user +*.u2d +gitVersionInfo.h \ No newline at end of file diff --git a/vs-build/AeroDisk/AeroDisk_Driver.sln b/vs-build/AeroDisk/AeroDisk_Driver.sln deleted file mode 100644 index be507fe647..0000000000 --- a/vs-build/AeroDisk/AeroDisk_Driver.sln +++ /dev/null @@ -1,61 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.40629.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{38C3D685-B817-4E00-A9A9-F3898DC01990}") = "AeroDisk_Driver", "AeroDisk_Driver.vfproj", "{C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Debug|Win32.ActiveCfg = Debug|Win32 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Debug|Win32.Build.0 = Debug|Win32 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Debug|x64.ActiveCfg = Debug|x64 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Debug|x64.Build.0 = Debug|x64 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Release_Double|x64.Build.0 = Release_Double|x64 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Release|Win32.ActiveCfg = Release|Win32 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Release|Win32.Build.0 = Release|Win32 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Release|x64.ActiveCfg = Release|x64 - {C5F53AB0-6FE8-405C-A7F6-59BBF5E6D5C2}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/vs-build/AeroDisk/AeroDisk_Driver.vfproj b/vs-build/AeroDisk/AeroDisk_Driver.vfproj deleted file mode 100644 index ec2307e6c8..0000000000 --- a/vs-build/AeroDisk/AeroDisk_Driver.vfproj +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/AeroDyn/AeroDyn_Driver.sln b/vs-build/AeroDyn/AeroDyn_Driver.sln deleted file mode 100644 index f9a1f191eb..0000000000 --- a/vs-build/AeroDyn/AeroDyn_Driver.sln +++ /dev/null @@ -1,74 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AeroDyn_Driver", "AeroDyn_Driver.vfproj", "{97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release_OpenMP|Win32 = Release_OpenMP|Win32 - Release_OpenMP|x64 = Release_OpenMP|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Debug|Win32.ActiveCfg = Debug|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Debug|Win32.Build.0 = Debug|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Debug|x64.ActiveCfg = Debug|x64 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Debug|x64.Build.0 = Debug|x64 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release_Double|x64.Build.0 = Release_Double|x64 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release_OpenMP|Win32.ActiveCfg = Release_OpenMP|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release_OpenMP|Win32.Build.0 = Release_OpenMP|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release_OpenMP|x64.ActiveCfg = Release_OpenMP|x64 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release_OpenMP|x64.Build.0 = Release_OpenMP|x64 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release|Win32.ActiveCfg = Release|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release|Win32.Build.0 = Release|Win32 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release|x64.ActiveCfg = Release|x64 - {97CEFEB9-1DCB-470E-A231-E1DA2F21A9CE}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {B3809791-8085-4B91-AC43-EB756F90F448} - EndGlobalSection -EndGlobal diff --git a/vs-build/AeroDyn/AeroDyn_Driver.vfproj b/vs-build/AeroDyn/AeroDyn_Driver.vfproj deleted file mode 100644 index 0e65bf9cfa..0000000000 --- a/vs-build/AeroDyn/AeroDyn_Driver.vfproj +++ /dev/null @@ -1,970 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.sln b/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.sln deleted file mode 100644 index 295a6d1e8d..0000000000 --- a/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.sln +++ /dev/null @@ -1,74 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AeroDyn_Inflow_c_binding", "AeroDyn_Inflow_c_binding.vfproj", "{5D991B19-D4F1-4F29-8A9D-FC36DFF07290}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release_OpenMP|Win32 = Release_OpenMP|Win32 - Release_OpenMP|x64 = Release_OpenMP|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug|Win32.ActiveCfg = Debug|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug|Win32.Build.0 = Debug|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug|x64.ActiveCfg = Debug|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug|x64.Build.0 = Debug|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_Double|x64.Build.0 = Release_Double|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_OpenMP|Win32.ActiveCfg = Release_OpenMP|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_OpenMP|Win32.Build.0 = Release_OpenMP|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_OpenMP|x64.ActiveCfg = Release_OpenMP|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_OpenMP|x64.Build.0 = Release_OpenMP|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release|Win32.ActiveCfg = Release|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release|Win32.Build.0 = Release|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release|x64.ActiveCfg = Release|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {B13CCB9E-BD8C-4663-9AB3-710E72075526} - EndGlobalSection -EndGlobal diff --git a/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.vfproj b/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.vfproj deleted file mode 100644 index 27a4cdee72..0000000000 --- a/vs-build/AeroDyn_Inflow_c_binding/AeroDyn_Inflow_c_binding.vfproj +++ /dev/null @@ -1,1079 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/BeamDyn/BeamDyn-w-registry.sln b/vs-build/BeamDyn/BeamDyn-w-registry.sln deleted file mode 100644 index 573fd9f26f..0000000000 --- a/vs-build/BeamDyn/BeamDyn-w-registry.sln +++ /dev/null @@ -1,64 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "BeamDyn", "BeamDyn.vfproj", "{815C302F-A93D-4C22-9329-7112345113C0}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {815C302F-A93D-4C22-9329-7112345113C0}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-7112345113C0}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-7112345113C0}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {815C302F-A93D-4C22-9329-7112345113C0}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {815C302F-A93D-4C22-9329-7112345113C0}.Debug|Win32.ActiveCfg = Debug|Win32 - {815C302F-A93D-4C22-9329-7112345113C0}.Debug|Win32.Build.0 = Debug|Win32 - {815C302F-A93D-4C22-9329-7112345113C0}.Debug|x64.ActiveCfg = Debug|x64 - {815C302F-A93D-4C22-9329-7112345113C0}.Debug|x64.Build.0 = Debug|x64 - {815C302F-A93D-4C22-9329-7112345113C0}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {815C302F-A93D-4C22-9329-7112345113C0}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {815C302F-A93D-4C22-9329-7112345113C0}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {815C302F-A93D-4C22-9329-7112345113C0}.Release_Double|x64.Build.0 = Release_Double|x64 - {815C302F-A93D-4C22-9329-7112345113C0}.Release|Win32.ActiveCfg = Release|Win32 - {815C302F-A93D-4C22-9329-7112345113C0}.Release|Win32.Build.0 = Release|Win32 - {815C302F-A93D-4C22-9329-7112345113C0}.Release|x64.ActiveCfg = Release|x64 - {815C302F-A93D-4C22-9329-7112345113C0}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {37F40376-E0A4-4BB3-A987-A3CF5A440217} - EndGlobalSection -EndGlobal diff --git a/vs-build/BeamDyn/BeamDyn.vfproj b/vs-build/BeamDyn/BeamDyn.vfproj deleted file mode 100644 index a13f410c99..0000000000 --- a/vs-build/BeamDyn/BeamDyn.vfproj +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/Discon/Discon.sln b/vs-build/Discon/Discon.sln deleted file mode 100644 index 7c5b5beb58..0000000000 --- a/vs-build/Discon/Discon.sln +++ /dev/null @@ -1,51 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27428.2043 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "Discon", "Discon.vfproj", "{183CC593-AD4C-4A15-81C1-7D6D20A9A5ED}" -EndProject -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "Discon_ITIBarge", "Discon_ITIBarge.vfproj", "{11A28263-1385-47DF-9122-30BF9C0DF013}" -EndProject -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "Discon_OC3Hywind", "Discon_OC3Hywind.vfproj", "{3BA7CEDE-8D58-4D18-8A59-A4114FB70B9C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {183CC593-AD4C-4A15-81C1-7D6D20A9A5ED}.Debug|Win32.ActiveCfg = Debug|Win32 - {183CC593-AD4C-4A15-81C1-7D6D20A9A5ED}.Debug|Win32.Build.0 = Debug|Win32 - {183CC593-AD4C-4A15-81C1-7D6D20A9A5ED}.Debug|x64.ActiveCfg = Debug|x64 - {183CC593-AD4C-4A15-81C1-7D6D20A9A5ED}.Debug|x64.Build.0 = Debug|x64 - {183CC593-AD4C-4A15-81C1-7D6D20A9A5ED}.Release|Win32.ActiveCfg = Release|Win32 - {183CC593-AD4C-4A15-81C1-7D6D20A9A5ED}.Release|Win32.Build.0 = Release|Win32 - {183CC593-AD4C-4A15-81C1-7D6D20A9A5ED}.Release|x64.ActiveCfg = Release|x64 - {183CC593-AD4C-4A15-81C1-7D6D20A9A5ED}.Release|x64.Build.0 = Release|x64 - {11A28263-1385-47DF-9122-30BF9C0DF013}.Debug|Win32.ActiveCfg = Debug|Win32 - {11A28263-1385-47DF-9122-30BF9C0DF013}.Debug|Win32.Build.0 = Debug|Win32 - {11A28263-1385-47DF-9122-30BF9C0DF013}.Debug|x64.ActiveCfg = Debug|x64 - {11A28263-1385-47DF-9122-30BF9C0DF013}.Debug|x64.Build.0 = Debug|x64 - {11A28263-1385-47DF-9122-30BF9C0DF013}.Release|Win32.ActiveCfg = Release|Win32 - {11A28263-1385-47DF-9122-30BF9C0DF013}.Release|Win32.Build.0 = Release|Win32 - {11A28263-1385-47DF-9122-30BF9C0DF013}.Release|x64.ActiveCfg = Release|x64 - {11A28263-1385-47DF-9122-30BF9C0DF013}.Release|x64.Build.0 = Release|x64 - {3BA7CEDE-8D58-4D18-8A59-A4114FB70B9C}.Debug|Win32.ActiveCfg = Debug|Win32 - {3BA7CEDE-8D58-4D18-8A59-A4114FB70B9C}.Debug|Win32.Build.0 = Debug|Win32 - {3BA7CEDE-8D58-4D18-8A59-A4114FB70B9C}.Debug|x64.ActiveCfg = Debug|x64 - {3BA7CEDE-8D58-4D18-8A59-A4114FB70B9C}.Debug|x64.Build.0 = Debug|x64 - {3BA7CEDE-8D58-4D18-8A59-A4114FB70B9C}.Release|Win32.ActiveCfg = Release|Win32 - {3BA7CEDE-8D58-4D18-8A59-A4114FB70B9C}.Release|Win32.Build.0 = Release|Win32 - {3BA7CEDE-8D58-4D18-8A59-A4114FB70B9C}.Release|x64.ActiveCfg = Release|x64 - {3BA7CEDE-8D58-4D18-8A59-A4114FB70B9C}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {A4EE85D3-EA0C-4285-B446-0E8D70945A10} - EndGlobalSection -EndGlobal diff --git a/vs-build/Discon/Discon.vfproj b/vs-build/Discon/Discon.vfproj deleted file mode 100644 index 30d07a9dc4..0000000000 --- a/vs-build/Discon/Discon.vfproj +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/Discon/Discon_ITIBarge.vfproj b/vs-build/Discon/Discon_ITIBarge.vfproj deleted file mode 100644 index d263c96c12..0000000000 --- a/vs-build/Discon/Discon_ITIBarge.vfproj +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/Discon/Discon_OC3Hywind.vfproj b/vs-build/Discon/Discon_OC3Hywind.vfproj deleted file mode 100644 index f821f3dcfc..0000000000 --- a/vs-build/Discon/Discon_OC3Hywind.vfproj +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/FAST-farm/FAST-Farm.sln b/vs-build/FAST-farm/FAST-Farm.sln deleted file mode 100644 index bab76b0d32..0000000000 --- a/vs-build/FAST-farm/FAST-Farm.sln +++ /dev/null @@ -1,89 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "FASTlib", "..\FASTlib\FASTlib.vfproj", "{1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}" - ProjectSection(ProjectDependencies) = postProject - {BF86702A-CB17-4050-8AE9-078CDC5910D3} = {BF86702A-CB17-4050-8AE9-078CDC5910D3} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MAP_dll", "..\MAPlib\MAP_dll.vcxproj", "{BF86702A-CB17-4050-8AE9-078CDC5910D3}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "FAST-Farm", "FAST-Farm.vfproj", "{F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}" - ProjectSection(ProjectDependencies) = postProject - {BF86702A-CB17-4050-8AE9-078CDC5910D3} = {BF86702A-CB17-4050-8AE9-078CDC5910D3} - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9} = {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_OpenMP|Win32 = Release_OpenMP|Win32 - Release_OpenMP|x64 = Release_OpenMP|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug|Win32.ActiveCfg = Debug|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug|Win32.Build.0 = Debug|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug|x64.ActiveCfg = Debug|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug|x64.Build.0 = Debug|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_OpenMP|Win32.ActiveCfg = Release_OpenMP|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_OpenMP|Win32.Build.0 = Release_OpenMP|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_OpenMP|x64.ActiveCfg = Release_OpenMP|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_OpenMP|x64.Build.0 = Release_OpenMP|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release|Win32.ActiveCfg = Release|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release|Win32.Build.0 = Release|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release|x64.ActiveCfg = Release|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release|x64.Build.0 = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug|Win32.Build.0 = Debug|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug|x64.ActiveCfg = Debug|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug|x64.Build.0 = Debug|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_OpenMP|Win32.ActiveCfg = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_OpenMP|Win32.Build.0 = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_OpenMP|x64.ActiveCfg = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_OpenMP|x64.Build.0 = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release|Win32.ActiveCfg = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release|Win32.Build.0 = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release|x64.ActiveCfg = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Debug|Win32.ActiveCfg = Debug|Win32 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Debug|Win32.Build.0 = Debug|Win32 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Debug|x64.ActiveCfg = Debug|x64 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Debug|x64.Build.0 = Debug|x64 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Release_OpenMP|Win32.ActiveCfg = Release_OpenMP|Win32 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Release_OpenMP|Win32.Build.0 = Release_OpenMP|Win32 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Release_OpenMP|x64.ActiveCfg = Release_OpenMP|x64 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Release_OpenMP|x64.Build.0 = Release_OpenMP|x64 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Release|Win32.ActiveCfg = Release|Win32 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Release|Win32.Build.0 = Release|Win32 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Release|x64.ActiveCfg = Release|x64 - {F47C7C94-2A7F-4CBE-B834-1BC7DD3FE692}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {13BD9A6C-E2B3-4423-AA37-D06CB518B5B2} - EndGlobalSection -EndGlobal diff --git a/vs-build/FAST-farm/FAST-Farm.vfproj b/vs-build/FAST-farm/FAST-Farm.vfproj deleted file mode 100644 index df2c6cb580..0000000000 --- a/vs-build/FAST-farm/FAST-Farm.vfproj +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/FAST/FAST.sln b/vs-build/FAST/FAST.sln deleted file mode 100644 index 795885ea98..0000000000 --- a/vs-build/FAST/FAST.sln +++ /dev/null @@ -1,162 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "FAST", "FAST.vfproj", "{18AE8067-CCC6-4479-A0DB-C4089EF9FE71}" - ProjectSection(ProjectDependencies) = postProject - {BF86702A-CB17-4050-8AE9-078CDC5910D3} = {BF86702A-CB17-4050-8AE9-078CDC5910D3} - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9} = {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9} - EndProjectSection -EndProject -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "FASTlib", "..\FASTlib\FASTlib.vfproj", "{1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}" - ProjectSection(ProjectDependencies) = postProject - {BF86702A-CB17-4050-8AE9-078CDC5910D3} = {BF86702A-CB17-4050-8AE9-078CDC5910D3} - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MAP_dll", "..\MAPlib\MAP_dll.vcxproj", "{BF86702A-CB17-4050-8AE9-078CDC5910D3}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "OpenFAST-Simulink", "..\OpenFAST-Simulink\OpenFAST-Simulink.vfproj", "{C3C93CC0-EDD7-438F-988C-1F917FAEFA67}" - ProjectSection(ProjectDependencies) = postProject - {BF86702A-CB17-4050-8AE9-078CDC5910D3} = {BF86702A-CB17-4050-8AE9-078CDC5910D3} - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9} = {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug_Matlab|Win32 = Debug_Matlab|Win32 - Debug_Matlab|x64 = Debug_Matlab|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release_Matlab|Win32 = Release_Matlab|Win32 - Release_Matlab|x64 = Release_Matlab|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug_Matlab|Win32.ActiveCfg = Debug|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug_Matlab|x64.ActiveCfg = Debug|x64 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug|Win32.ActiveCfg = Debug|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug|Win32.Build.0 = Debug|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug|x64.ActiveCfg = Debug|x64 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Debug|x64.Build.0 = Debug|x64 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release_Double|x64.Build.0 = Release_Double|x64 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release_Matlab|Win32.ActiveCfg = Release|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release_Matlab|x64.ActiveCfg = Release|x64 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release|Win32.ActiveCfg = Release|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release|Win32.Build.0 = Release|Win32 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release|x64.ActiveCfg = Release|x64 - {18AE8067-CCC6-4479-A0DB-C4089EF9FE71}.Release|x64.Build.0 = Release|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug_Matlab|Win32.ActiveCfg = Debug_Matlab|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug_Matlab|Win32.Build.0 = Debug_Matlab|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug_Matlab|x64.ActiveCfg = Debug_Matlab|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug_Matlab|x64.Build.0 = Debug_Matlab|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug|Win32.ActiveCfg = Debug|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug|Win32.Build.0 = Debug|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug|x64.ActiveCfg = Debug|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Debug|x64.Build.0 = Debug|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_Double|x64.Build.0 = Release_Double|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_Matlab|Win32.ActiveCfg = Release_Matlab|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_Matlab|Win32.Build.0 = Release_Matlab|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_Matlab|x64.ActiveCfg = Release_Matlab|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release_Matlab|x64.Build.0 = Release_Matlab|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release|Win32.ActiveCfg = Release|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release|Win32.Build.0 = Release|Win32 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release|x64.ActiveCfg = Release|x64 - {1A440C5B-CBA6-47D9-9CC2-C1CBA8C00BF9}.Release|x64.Build.0 = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug_Double|Win32.ActiveCfg = Debug|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug_Double|Win32.Build.0 = Debug|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug_Double|x64.ActiveCfg = Debug|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug_Double|x64.Build.0 = Debug|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug_Matlab|Win32.ActiveCfg = Debug|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug_Matlab|Win32.Build.0 = Debug|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug_Matlab|x64.ActiveCfg = Debug|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug_Matlab|x64.Build.0 = Debug|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug|Win32.ActiveCfg = Debug|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug|Win32.Build.0 = Debug|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug|x64.ActiveCfg = Debug|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Debug|x64.Build.0 = Debug|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_Double|Win32.ActiveCfg = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_Double|Win32.Build.0 = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_Double|x64.ActiveCfg = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_Double|x64.Build.0 = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_Matlab|Win32.ActiveCfg = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_Matlab|Win32.Build.0 = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_Matlab|x64.ActiveCfg = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release_Matlab|x64.Build.0 = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release|Win32.ActiveCfg = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release|Win32.Build.0 = Release|Win32 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release|x64.ActiveCfg = Release|x64 - {BF86702A-CB17-4050-8AE9-078CDC5910D3}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Matlab|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Matlab|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Matlab|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Matlab|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Matlab|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Matlab|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Matlab|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Matlab|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug_Double|Win32.ActiveCfg = Debug_Matlab|Win32 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug_Double|x64.ActiveCfg = Debug_Matlab|x64 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug_Matlab|Win32.ActiveCfg = Debug_Matlab|Win32 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug_Matlab|Win32.Build.0 = Debug_Matlab|Win32 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug_Matlab|x64.ActiveCfg = Debug_Matlab|x64 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug_Matlab|x64.Build.0 = Debug_Matlab|x64 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug|Win32.ActiveCfg = Debug_Matlab|Win32 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug|x64.ActiveCfg = Debug_Matlab|x64 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release_Double|Win32.ActiveCfg = Release_Matlab|Win32 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release_Double|x64.ActiveCfg = Release_Matlab|x64 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release_Matlab|Win32.ActiveCfg = Release_Matlab|Win32 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release_Matlab|Win32.Build.0 = Release_Matlab|Win32 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release_Matlab|x64.ActiveCfg = Release_Matlab|x64 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release_Matlab|x64.Build.0 = Release_Matlab|x64 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release|Win32.ActiveCfg = Release_Matlab|Win32 - {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release|x64.ActiveCfg = Release_Matlab|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {60B1042F-6137-4E78-9A9D-75E796E6E22B} - EndGlobalSection -EndGlobal diff --git a/vs-build/FAST/FAST.vfproj b/vs-build/FAST/FAST.vfproj deleted file mode 100644 index 0a8d09d99b..0000000000 --- a/vs-build/FAST/FAST.vfproj +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/FASTlib/FASTlib.vfproj b/vs-build/FASTlib/FASTlib.vfproj deleted file mode 100644 index f4cacd3b7c..0000000000 --- a/vs-build/FASTlib/FASTlib.vfproj +++ /dev/null @@ -1,2442 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/HydroDyn/HydroDynDriver.sln b/vs-build/HydroDyn/HydroDynDriver.sln deleted file mode 100644 index 17c738b756..0000000000 --- a/vs-build/HydroDyn/HydroDynDriver.sln +++ /dev/null @@ -1,43 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "HydroDynDriver", "HydroDynDriver.vfproj", "{815C302F-A93D-4C22-9329-717B085113C0}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|Win32.ActiveCfg = Debug|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|Win32.Build.0 = Debug|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|x64.ActiveCfg = Debug|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|x64.Build.0 = Debug|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|x64.Build.0 = Release_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|Win32.ActiveCfg = Release|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|Win32.Build.0 = Release|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|x64.ActiveCfg = Release|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D73C5D81-14CD-4C14-8B52-6885B380AE3E} - EndGlobalSection -EndGlobal diff --git a/vs-build/HydroDyn/HydroDynDriver.vfproj b/vs-build/HydroDyn/HydroDynDriver.vfproj deleted file mode 100644 index 1b60204924..0000000000 --- a/vs-build/HydroDyn/HydroDynDriver.vfproj +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.sln b/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.sln deleted file mode 100644 index 753bece4fc..0000000000 --- a/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.sln +++ /dev/null @@ -1,64 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "HydroDyn_c_binding", "HydroDyn_c_binding.vfproj", "{FDA4A02B-B3A7-4D06-847C-941BE44E76FB}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Debug|Win32.ActiveCfg = Debug|Win32 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Debug|Win32.Build.0 = Debug|Win32 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Debug|x64.ActiveCfg = Debug|x64 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Debug|x64.Build.0 = Debug|x64 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Release_Double|x64.Build.0 = Release_Double|x64 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Release|Win32.ActiveCfg = Release|Win32 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Release|Win32.Build.0 = Release|Win32 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Release|x64.ActiveCfg = Release|x64 - {FDA4A02B-B3A7-4D06-847C-941BE44E76FB}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {49DA4583-1BAB-4459-8F53-EB898075680D} - EndGlobalSection -EndGlobal diff --git a/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.vfproj b/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.vfproj deleted file mode 100644 index 801edf151e..0000000000 --- a/vs-build/HydroDyn_c_binding/HydroDyn_c_binding.vfproj +++ /dev/null @@ -1,397 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/InflowWind/InflowWind_driver.sln b/vs-build/InflowWind/InflowWind_driver.sln deleted file mode 100644 index 6bc82e29a1..0000000000 --- a/vs-build/InflowWind/InflowWind_driver.sln +++ /dev/null @@ -1,74 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "InflowWind_driver", "InflowWind_driver.vfproj", "{3BBE2741-5B28-47BC-9E7F-3E1D172838FB}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release_OpenMP|Win32 = Release_OpenMP|Win32 - Release_OpenMP|x64 = Release_OpenMP|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Debug|Win32.ActiveCfg = Debug|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Debug|Win32.Build.0 = Debug|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Debug|x64.ActiveCfg = Debug|x64 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Debug|x64.Build.0 = Debug|x64 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release_Double|x64.Build.0 = Release_Double|x64 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release_OpenMP|Win32.ActiveCfg = Release_OpenMP|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release_OpenMP|Win32.Build.0 = Release_OpenMP|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release_OpenMP|x64.ActiveCfg = Release_OpenMP|x64 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release_OpenMP|x64.Build.0 = Release_OpenMP|x64 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release|Win32.ActiveCfg = Release|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release|Win32.Build.0 = Release|Win32 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release|x64.ActiveCfg = Release|x64 - {3BBE2741-5B28-47BC-9E7F-3E1D172838FB}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_OpenMP|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {85ED1246-76D4-47AA-8595-CA41DF479510} - EndGlobalSection -EndGlobal diff --git a/vs-build/InflowWind/InflowWind_driver.vfproj b/vs-build/InflowWind/InflowWind_driver.vfproj deleted file mode 100644 index 3f4cd8d250..0000000000 --- a/vs-build/InflowWind/InflowWind_driver.vfproj +++ /dev/null @@ -1,270 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/InflowWind_c_binding/InflowWind_c_binding.sln b/vs-build/InflowWind_c_binding/InflowWind_c_binding.sln deleted file mode 100644 index 24fde71ef9..0000000000 --- a/vs-build/InflowWind_c_binding/InflowWind_c_binding.sln +++ /dev/null @@ -1,64 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "InflowWind_c_binding", "InflowWind_c_binding.vfproj", "{5D991B19-D4F1-4F29-8A9D-FC36DFF07290}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug|Win32.ActiveCfg = Debug|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug|Win32.Build.0 = Debug|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug|x64.ActiveCfg = Debug|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Debug|x64.Build.0 = Debug|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release_Double|x64.Build.0 = Release_Double|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release|Win32.ActiveCfg = Release|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release|Win32.Build.0 = Release|Win32 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release|x64.ActiveCfg = Release|x64 - {5D991B19-D4F1-4F29-8A9D-FC36DFF07290}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {7DBCF286-C404-4F79-A1F2-3A04C4859A09} - EndGlobalSection -EndGlobal diff --git a/vs-build/InflowWind_c_binding/InflowWind_c_binding.vfproj b/vs-build/InflowWind_c_binding/InflowWind_c_binding.vfproj deleted file mode 100644 index 192df54c69..0000000000 --- a/vs-build/InflowWind_c_binding/InflowWind_c_binding.vfproj +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/MoorDyn/MoorDynDriver.sln b/vs-build/MoorDyn/MoorDynDriver.sln deleted file mode 100644 index 29001b4108..0000000000 --- a/vs-build/MoorDyn/MoorDynDriver.sln +++ /dev/null @@ -1,37 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{A1373E92-2C9A-4B4D-BE47-0B46E317E1A8}") = "MoorDynDriver", "MoorDynDriver.vfproj", "{E91DED35-18F8-415F-9719-59DFBA79CB2C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Debug|Win32.ActiveCfg = Debug|Win32 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Debug|Win32.Build.0 = Debug|Win32 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Debug|x64.ActiveCfg = Debug|x64 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Debug|x64.Build.0 = Debug|x64 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Release|Win32.ActiveCfg = Release|Win32 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Release|Win32.Build.0 = Release|Win32 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Release|x64.ActiveCfg = Release|x64 - {E91DED35-18F8-415F-9719-59DFBA79CB2C}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {3BDEA0AD-7777-4CFC-8533-3247B1C17E90} - EndGlobalSection -EndGlobal diff --git a/vs-build/MoorDyn/MoorDynDriver.vfproj b/vs-build/MoorDyn/MoorDynDriver.vfproj deleted file mode 100644 index 9d936b59cc..0000000000 --- a/vs-build/MoorDyn/MoorDynDriver.vfproj +++ /dev/null @@ -1,425 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.sln b/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.sln deleted file mode 100644 index d9d928b345..0000000000 --- a/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.sln +++ /dev/null @@ -1,64 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "MoorDyn_c_binding", "MoorDyn_c_binding.vfproj", "{25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Debug|Win32.ActiveCfg = Debug|Win32 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Debug|Win32.Build.0 = Debug|Win32 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Debug|x64.ActiveCfg = Debug|x64 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Debug|x64.Build.0 = Debug|x64 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Release_Double|x64.Build.0 = Release_Double|x64 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Release|Win32.ActiveCfg = Release|Win32 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Release|Win32.Build.0 = Release|Win32 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Release|x64.ActiveCfg = Release|x64 - {25689C95-9A3C-41A1-B0E6-5B292B6EFBE9}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {30CE352E-CDFB-459E-A6B7-9D142AA73673} - EndGlobalSection -EndGlobal diff --git a/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.vfproj b/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.vfproj deleted file mode 100644 index a9e9da955d..0000000000 --- a/vs-build/MoorDyn_c_binding/MoorDyn_c_binding.vfproj +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/OpenFAST-Simulink/OpenFAST-Simulink.vfproj b/vs-build/OpenFAST-Simulink/OpenFAST-Simulink.vfproj deleted file mode 100644 index 655b2435a6..0000000000 --- a/vs-build/OpenFAST-Simulink/OpenFAST-Simulink.vfproj +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/OpenFAST.sln b/vs-build/OpenFAST.sln new file mode 100644 index 0000000000..8ec8938fcb --- /dev/null +++ b/vs-build/OpenFAST.sln @@ -0,0 +1,2460 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.13.35919.96 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Registry", "modules\Registry.vcxproj", "{EC73DA51-78CF-41DB-9DFA-88360BF2EA93}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AeroDyn", "modules\AeroDyn.vfproj", "{5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}" + ProjectSection(ProjectDependencies) = postProject + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "NWTC-Library", "modules\NWTC-Library.vfproj", "{EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}" + ProjectSection(ProjectDependencies) = postProject + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "InflowWind", "modules\InflowWind.vfproj", "{9CB36EC2-18AF-468E-BE43-FE63E383AA3A}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "VersionInfo", "modules\VersionInfo.vfproj", "{12DF411B-C7DA-47BA-BB85-7714D5FD2A16}" + ProjectSection(ProjectDependencies) = postProject + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "BeamDyn", "modules\BeamDyn.vfproj", "{A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AeroDisk", "modules\AeroDisk.vfproj", "{731C6D0A-CF24-4FD3-ABAC-17F31D97A188}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "ElastoDyn", "modules\ElastoDyn.vfproj", "{E8C5BB9B-9709-41FA-B6F2-F334B112663A}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "ExternalInflow", "modules\ExternalInflow.vfproj", "{B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} + {2467FDD4-622B-4628-993A-73994FB8172E} = {2467FDD4-622B-4628-993A-73994FB8172E} + {3000393A-702F-488E-B918-1D37955FA8D3} = {3000393A-702F-488E-B918-1D37955FA8D3} + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} = {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} = {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} + {471EEB17-A1AA-43B0-ACEE-719B80BB4811} = {471EEB17-A1AA-43B0-ACEE-719B80BB4811} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} = {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} = {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} + {676276A1-DC23-4287-8386-07076303C39D} = {676276A1-DC23-4287-8386-07076303C39D} + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} = {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} + {774BDC53-33C4-4926-B01D-DC376DAE055B} = {774BDC53-33C4-4926-B01D-DC376DAE055B} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} = {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} + {B50C776E-F931-4E83-916F-C4E6977E40A3} = {B50C776E-F931-4E83-916F-C4E6977E40A3} + {D029FC73-035C-4EB8-96DA-5B1131706A2D} = {D029FC73-035C-4EB8-96DA-5B1131706A2D} + {E8C5BB9B-9709-41FA-B6F2-F334B112663A} = {E8C5BB9B-9709-41FA-B6F2-F334B112663A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + {F8C26AB7-4B2F-4610-A18B-A8C860926B21} = {F8C26AB7-4B2F-4610-A18B-A8C860926B21} + {FE80CE9A-7E16-476D-B63A-F9F870ACB662} = {FE80CE9A-7E16-476D-B63A-F9F870ACB662} + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} = {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "ExtLoads", "modules\ExtLoads.vfproj", "{AD8D7798-F800-4C73-B896-7E48EF1D52D3}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} + {2467FDD4-622B-4628-993A-73994FB8172E} = {2467FDD4-622B-4628-993A-73994FB8172E} + {3000393A-702F-488E-B918-1D37955FA8D3} = {3000393A-702F-488E-B918-1D37955FA8D3} + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} = {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} = {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} + {471EEB17-A1AA-43B0-ACEE-719B80BB4811} = {471EEB17-A1AA-43B0-ACEE-719B80BB4811} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} = {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} = {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} + {676276A1-DC23-4287-8386-07076303C39D} = {676276A1-DC23-4287-8386-07076303C39D} + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} = {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} + {774BDC53-33C4-4926-B01D-DC376DAE055B} = {774BDC53-33C4-4926-B01D-DC376DAE055B} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} = {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} + {B50C776E-F931-4E83-916F-C4E6977E40A3} = {B50C776E-F931-4E83-916F-C4E6977E40A3} + {D029FC73-035C-4EB8-96DA-5B1131706A2D} = {D029FC73-035C-4EB8-96DA-5B1131706A2D} + {E8C5BB9B-9709-41FA-B6F2-F334B112663A} = {E8C5BB9B-9709-41FA-B6F2-F334B112663A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {FE80CE9A-7E16-476D-B63A-F9F870ACB662} = {FE80CE9A-7E16-476D-B63A-F9F870ACB662} + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} = {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "ExtPtfm", "modules\ExtPtfm.vfproj", "{3000393A-702F-488E-B918-1D37955FA8D3}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "FEAMooring", "modules\FEAMooring.vfproj", "{676276A1-DC23-4287-8386-07076303C39D}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "HydroDyn", "modules\HydroDyn.vfproj", "{1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SeaState", "modules\SeaState.vfproj", "{951A453F-1999-483D-848A-9B63C282F43D}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "IceDyn", "modules\IceDyn.vfproj", "{D029FC73-035C-4EB8-96DA-5B1131706A2D}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "IceFloe", "modules\IceFloe.vfproj", "{FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "MAP", "modules\MAP.vfproj", "{5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "MoorDyn", "modules\MoorDyn.vfproj", "{923F8E1F-F5FC-4572-9C32-94C90F04A5A9}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MAP-C", "modules\MAP-C.vcxproj", "{471EEB17-A1AA-43B0-ACEE-719B80BB4811}" + ProjectSection(ProjectDependencies) = postProject + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} = {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "OrcaFlex", "modules\OrcaFlex.vfproj", "{B50C776E-F931-4E83-916F-C4E6977E40A3}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "ServoDyn", "modules\ServoDyn.vfproj", "{46EB37F1-EEBA-4F35-A173-A37D42D97B5B}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SimpleElastoDyn", "modules\SimpleElastoDyn.vfproj", "{2467FDD4-622B-4628-993A-73994FB8172E}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SubDyn", "modules\SubDyn.vfproj", "{648CD825-ECB0-46D1-B1AA-A28F5C36CD91}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "OpenFAST-Prelib", "modules\OpenFAST-Prelib.vfproj", "{FE80CE9A-7E16-476D-B63A-F9F870ACB662}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} + {2467FDD4-622B-4628-993A-73994FB8172E} = {2467FDD4-622B-4628-993A-73994FB8172E} + {3000393A-702F-488E-B918-1D37955FA8D3} = {3000393A-702F-488E-B918-1D37955FA8D3} + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} = {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} = {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} = {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} = {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} + {676276A1-DC23-4287-8386-07076303C39D} = {676276A1-DC23-4287-8386-07076303C39D} + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} = {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} + {774BDC53-33C4-4926-B01D-DC376DAE055B} = {774BDC53-33C4-4926-B01D-DC376DAE055B} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} = {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} + {B50C776E-F931-4E83-916F-C4E6977E40A3} = {B50C776E-F931-4E83-916F-C4E6977E40A3} + {D029FC73-035C-4EB8-96DA-5B1131706A2D} = {D029FC73-035C-4EB8-96DA-5B1131706A2D} + {E8C5BB9B-9709-41FA-B6F2-F334B112663A} = {E8C5BB9B-9709-41FA-B6F2-F334B112663A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + {F8C26AB7-4B2F-4610-A18B-A8C860926B21} = {F8C26AB7-4B2F-4610-A18B-A8C860926B21} + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} = {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "WakeDynamics", "modules\WakeDynamics.vfproj", "{029204DD-3D5B-47C6-8CAA-A933886D4674}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "ExternalInflow_Types", "modules\ExternalInflow_Types.vfproj", "{3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}" + ProjectSection(ProjectDependencies) = postProject + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "ExtLoads_Types", "modules\ExtLoads_Types.vfproj", "{774BDC53-33C4-4926-B01D-DC376DAE055B}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Modules", "Modules", "{272B8080-A022-4F4A-BDD6-835871E44C23}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "OpenFAST-Library", "modules\OpenFAST-Library.vfproj", "{6906E75C-2A54-431B-A11D-145864FCDD5C}" + ProjectSection(ProjectDependencies) = postProject + {029204DD-3D5B-47C6-8CAA-A933886D4674} = {029204DD-3D5B-47C6-8CAA-A933886D4674} + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} + {2467FDD4-622B-4628-993A-73994FB8172E} = {2467FDD4-622B-4628-993A-73994FB8172E} + {3000393A-702F-488E-B918-1D37955FA8D3} = {3000393A-702F-488E-B918-1D37955FA8D3} + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} = {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} = {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} + {471EEB17-A1AA-43B0-ACEE-719B80BB4811} = {471EEB17-A1AA-43B0-ACEE-719B80BB4811} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} = {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} = {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} + {676276A1-DC23-4287-8386-07076303C39D} = {676276A1-DC23-4287-8386-07076303C39D} + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} = {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} + {774BDC53-33C4-4926-B01D-DC376DAE055B} = {774BDC53-33C4-4926-B01D-DC376DAE055B} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} = {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} + {AD8D7798-F800-4C73-B896-7E48EF1D52D3} = {AD8D7798-F800-4C73-B896-7E48EF1D52D3} + {B50C776E-F931-4E83-916F-C4E6977E40A3} = {B50C776E-F931-4E83-916F-C4E6977E40A3} + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A} = {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A} + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D} = {CA8A0366-3C47-439A-8E9A-25BB36E3C10D} + {D029FC73-035C-4EB8-96DA-5B1131706A2D} = {D029FC73-035C-4EB8-96DA-5B1131706A2D} + {E8C5BB9B-9709-41FA-B6F2-F334B112663A} = {E8C5BB9B-9709-41FA-B6F2-F334B112663A} + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492} = {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + {F8C26AB7-4B2F-4610-A18B-A8C860926B21} = {F8C26AB7-4B2F-4610-A18B-A8C860926B21} + {FE80CE9A-7E16-476D-B63A-F9F870ACB662} = {FE80CE9A-7E16-476D-B63A-F9F870ACB662} + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} = {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AeroDyn_Inflow", "modules\AeroDyn_Inflow.vfproj", "{ACF05685-6592-462C-A3B3-9CDE2CAFD958}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AeroDyn_Driver_Subs", "modules\AeroDyn_Driver_Subs.vfproj", "{60BA8F27-5C49-42DA-9CE4-F85A8215D02A}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {ACF05685-6592-462C-A3B3-9CDE2CAFD958} = {ACF05685-6592-462C-A3B3-9CDE2CAFD958} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AeroDyn_Inflow_C_Binding", "c-bindings\AeroDyn_Inflow_C_Binding.vfproj", "{DB03A086-3362-41E5-930A-B151D137ACCF}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A} = {60BA8F27-5C49-42DA-9CE4-F85A8215D02A} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {ACF05685-6592-462C-A3B3-9CDE2CAFD958} = {ACF05685-6592-462C-A3B3-9CDE2CAFD958} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AWAE", "modules\AWAE.vfproj", "{CA8A0366-3C47-439A-8E9A-25BB36E3C10D}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {94F38C02-84E4-4364-806E-3CC45730F6BD} = {94F38C02-84E4-4364-806E-3CC45730F6BD} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Glue Codes", "Glue Codes", "{D7D6BEC5-A67B-4D15-81F9-D846A7041C5D}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "OpenFAST", "glue-codes\OpenFAST.vfproj", "{6E5137FC-19EB-4A7F-AAE8-523AAF95A861}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} + {2467FDD4-622B-4628-993A-73994FB8172E} = {2467FDD4-622B-4628-993A-73994FB8172E} + {3000393A-702F-488E-B918-1D37955FA8D3} = {3000393A-702F-488E-B918-1D37955FA8D3} + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} = {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} = {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} + {471EEB17-A1AA-43B0-ACEE-719B80BB4811} = {471EEB17-A1AA-43B0-ACEE-719B80BB4811} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} = {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} = {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} + {676276A1-DC23-4287-8386-07076303C39D} = {676276A1-DC23-4287-8386-07076303C39D} + {6906E75C-2A54-431B-A11D-145864FCDD5C} = {6906E75C-2A54-431B-A11D-145864FCDD5C} + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} = {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} + {774BDC53-33C4-4926-B01D-DC376DAE055B} = {774BDC53-33C4-4926-B01D-DC376DAE055B} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} = {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} + {AD8D7798-F800-4C73-B896-7E48EF1D52D3} = {AD8D7798-F800-4C73-B896-7E48EF1D52D3} + {B50C776E-F931-4E83-916F-C4E6977E40A3} = {B50C776E-F931-4E83-916F-C4E6977E40A3} + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A} = {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A} + {D029FC73-035C-4EB8-96DA-5B1131706A2D} = {D029FC73-035C-4EB8-96DA-5B1131706A2D} + {E8C5BB9B-9709-41FA-B6F2-F334B112663A} = {E8C5BB9B-9709-41FA-B6F2-F334B112663A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {F8C26AB7-4B2F-4610-A18B-A8C860926B21} = {F8C26AB7-4B2F-4610-A18B-A8C860926B21} + {FE80CE9A-7E16-476D-B63A-F9F870ACB662} = {FE80CE9A-7E16-476D-B63A-F9F870ACB662} + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} = {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "FAST.Farm", "glue-codes\FAST.Farm.vfproj", "{4A398285-E3C7-4CD9-8F43-51A017D5A48A}" + ProjectSection(ProjectDependencies) = postProject + {029204DD-3D5B-47C6-8CAA-A933886D4674} = {029204DD-3D5B-47C6-8CAA-A933886D4674} + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} + {2467FDD4-622B-4628-993A-73994FB8172E} = {2467FDD4-622B-4628-993A-73994FB8172E} + {3000393A-702F-488E-B918-1D37955FA8D3} = {3000393A-702F-488E-B918-1D37955FA8D3} + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} = {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} = {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} + {471EEB17-A1AA-43B0-ACEE-719B80BB4811} = {471EEB17-A1AA-43B0-ACEE-719B80BB4811} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} = {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} = {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} + {676276A1-DC23-4287-8386-07076303C39D} = {676276A1-DC23-4287-8386-07076303C39D} + {6906E75C-2A54-431B-A11D-145864FCDD5C} = {6906E75C-2A54-431B-A11D-145864FCDD5C} + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} = {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} + {774BDC53-33C4-4926-B01D-DC376DAE055B} = {774BDC53-33C4-4926-B01D-DC376DAE055B} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} + {94F38C02-84E4-4364-806E-3CC45730F6BD} = {94F38C02-84E4-4364-806E-3CC45730F6BD} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} = {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} + {ACF05685-6592-462C-A3B3-9CDE2CAFD958} = {ACF05685-6592-462C-A3B3-9CDE2CAFD958} + {AD8D7798-F800-4C73-B896-7E48EF1D52D3} = {AD8D7798-F800-4C73-B896-7E48EF1D52D3} + {B50C776E-F931-4E83-916F-C4E6977E40A3} = {B50C776E-F931-4E83-916F-C4E6977E40A3} + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A} = {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A} + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D} = {CA8A0366-3C47-439A-8E9A-25BB36E3C10D} + {D029FC73-035C-4EB8-96DA-5B1131706A2D} = {D029FC73-035C-4EB8-96DA-5B1131706A2D} + {D9220A21-8C69-42E4-B085-E5D996B867D9} = {D9220A21-8C69-42E4-B085-E5D996B867D9} + {E8C5BB9B-9709-41FA-B6F2-F334B112663A} = {E8C5BB9B-9709-41FA-B6F2-F334B112663A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {F8C26AB7-4B2F-4610-A18B-A8C860926B21} = {F8C26AB7-4B2F-4610-A18B-A8C860926B21} + {FE80CE9A-7E16-476D-B63A-F9F870ACB662} = {FE80CE9A-7E16-476D-B63A-F9F870ACB662} + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} = {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Drivers", "Drivers", "{3517E990-350F-4471-A518-8B0BC77CFDDB}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AeroDyn_Driver", "drivers\AeroDyn_Driver.vfproj", "{D9220A21-8C69-42E4-B085-E5D996B867D9}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A} = {60BA8F27-5C49-42DA-9CE4-F85A8215D02A} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {ACF05685-6592-462C-A3B3-9CDE2CAFD958} = {ACF05685-6592-462C-A3B3-9CDE2CAFD958} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "BeamDyn_Driver", "drivers\BeamDyn_Driver.vfproj", "{E32296E3-72E8-435B-9BF3-2FAE02189CA5}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} = {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "MoorDyn_Driver", "drivers\MoorDyn_Driver.vfproj", "{9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "OrcaFlex_Driver", "drivers\OrcaFlex_Driver.vfproj", "{4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {B50C776E-F931-4E83-916F-C4E6977E40A3} = {B50C776E-F931-4E83-916F-C4E6977E40A3} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SeaState_Driver", "drivers\SeaState_Driver.vfproj", "{F861FB71-8FE4-42A5-8FB4-684F60D50B9C}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SubDyn_Driver", "drivers\SubDyn_Driver.vfproj", "{09919696-2DC4-48A3-B862-7BBF5CFD59CE}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} = {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SED_Driver", "drivers\SED_Driver.vfproj", "{C271833A-06D0-441D-A5A8-DDAB0AA4740C}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {2467FDD4-622B-4628-993A-73994FB8172E} = {2467FDD4-622B-4628-993A-73994FB8172E} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "TurbSim", "drivers\TurbSim.vfproj", "{5DA54439-78F9-48BD-A928-D2A856924E7E}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "HydroDyn_Driver", "drivers\HydroDyn_Driver.vfproj", "{6AAA9C6D-9884-476E-B868-40A1C08BF0C3}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "AeroDisk_Driver", "drivers\AeroDisk_Driver.vfproj", "{2153CAE1-90AC-4F06-A62C-EB162CED1192}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} = {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "InflowWind_Driver", "drivers\InflowWind_Driver.vfproj", "{F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "UnsteadyAero_Driver", "drivers\UnsteadyAero_Driver.vfproj", "{FD3D570E-D4D4-4EB3-8894-8C1190EC7989}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492} = {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "LinDyn", "modules\LinDyn.vfproj", "{EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "C-Bindings", "C-Bindings", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "IfW_C_Binding", "c-bindings\IfW_C_Binding.vfproj", "{49A73297-8D2F-4C60-BDC8-B20533516368}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "HydroDyn_C_Binding", "c-bindings\HydroDyn_C_Binding.vfproj", "{457CA498-DEB4-43D6-97A3-73FA2DFE99D8}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "MoorDyn_C_Binding", "c-bindings\MoorDyn_C_Binding.vfproj", "{EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SeaState_C_Binding", "c-bindings\SeaState_C_Binding.vfproj", "{71E6A09C-4569-4C24-87AF-8C9EE0C545BA}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AWAE-C", "modules\AWAE-C.vcxproj", "{94F38C02-84E4-4364-806E-3CC45730F6BD}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "OpenFAST-Simulink", "glue-codes\OpenFAST-Simulink.vfproj", "{C3C93CC0-EDD7-438F-988C-1F917FAEFA67}" + ProjectSection(ProjectDependencies) = postProject + {029204DD-3D5B-47C6-8CAA-A933886D4674} = {029204DD-3D5B-47C6-8CAA-A933886D4674} + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} + {2467FDD4-622B-4628-993A-73994FB8172E} = {2467FDD4-622B-4628-993A-73994FB8172E} + {3000393A-702F-488E-B918-1D37955FA8D3} = {3000393A-702F-488E-B918-1D37955FA8D3} + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} = {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} = {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} + {471EEB17-A1AA-43B0-ACEE-719B80BB4811} = {471EEB17-A1AA-43B0-ACEE-719B80BB4811} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} = {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} = {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} + {676276A1-DC23-4287-8386-07076303C39D} = {676276A1-DC23-4287-8386-07076303C39D} + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} = {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} + {774BDC53-33C4-4926-B01D-DC376DAE055B} = {774BDC53-33C4-4926-B01D-DC376DAE055B} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} + {951A453F-1999-483D-848A-9B63C282F43D} = {951A453F-1999-483D-848A-9B63C282F43D} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} = {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} + {AD8D7798-F800-4C73-B896-7E48EF1D52D3} = {AD8D7798-F800-4C73-B896-7E48EF1D52D3} + {B50C776E-F931-4E83-916F-C4E6977E40A3} = {B50C776E-F931-4E83-916F-C4E6977E40A3} + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A} = {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A} + {D029FC73-035C-4EB8-96DA-5B1131706A2D} = {D029FC73-035C-4EB8-96DA-5B1131706A2D} + {E8C5BB9B-9709-41FA-B6F2-F334B112663A} = {E8C5BB9B-9709-41FA-B6F2-F334B112663A} + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492} = {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {F8C26AB7-4B2F-4610-A18B-A8C860926B21} = {F8C26AB7-4B2F-4610-A18B-A8C860926B21} + {FE80CE9A-7E16-476D-B63A-F9F870ACB662} = {FE80CE9A-7E16-476D-B63A-F9F870ACB662} + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} = {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Controllers", "Controllers", "{76DE56EB-E48F-4F1A-8961-F97A71E7937B}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "DISCON", "controllers\DISCON.vfproj", "{AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "DISCON_ITIBarge", "controllers\DISCON_ITIBarge.vfproj", "{9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "DISCON_OC3Hywind", "controllers\DISCON_OC3Hywind.vfproj", "{4AB5A895-5B6B-406D-AE36-85F5F5940974}" +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SoilDyn", "modules\SoilDyn.vfproj", "{F8C26AB7-4B2F-4610-A18B-A8C860926B21}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} + EndProjectSection +EndProject +Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SoilDyn_Driver", "drivers\SoilDyn_Driver.vfproj", "{9779535B-8DE4-4484-8B59-6E78344D658A}" + ProjectSection(ProjectDependencies) = postProject + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} + {F8C26AB7-4B2F-4610-A18B-A8C860926B21} = {F8C26AB7-4B2F-4610-A18B-A8C860926B21} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Double_Debug|x64 = Double_Debug|x64 + Double_Debug|x86 = Double_Debug|x86 + Double_OpenMP_Release|x64 = Double_OpenMP_Release|x64 + Double_OpenMP_Release|x86 = Double_OpenMP_Release|x86 + Double_Release|x64 = Double_Release|x64 + Double_Release|x86 = Double_Release|x86 + Matlab_Debug|x64 = Matlab_Debug|x64 + Matlab_Debug|x86 = Matlab_Debug|x86 + Matlab_Release|x64 = Matlab_Release|x64 + Matlab_Release|x86 = Matlab_Release|x86 + OpenMP_Release|x64 = OpenMP_Release|x64 + OpenMP_Release|x86 = OpenMP_Release|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Debug|x64.ActiveCfg = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Debug|x64.Build.0 = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Debug|x86.ActiveCfg = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Debug|x86.Build.0 = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_Debug|x64.ActiveCfg = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_Debug|x64.Build.0 = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_Debug|x86.ActiveCfg = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_Debug|x86.Build.0 = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_OpenMP_Release|x64.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_OpenMP_Release|x64.Build.0 = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_OpenMP_Release|x86.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_OpenMP_Release|x86.Build.0 = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_Release|x64.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_Release|x64.Build.0 = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_Release|x86.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Double_Release|x86.Build.0 = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Matlab_Debug|x64.Build.0 = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Matlab_Debug|x86.Build.0 = Debug|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Matlab_Release|x64.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Matlab_Release|x64.Build.0 = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Matlab_Release|x86.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Matlab_Release|x86.Build.0 = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.OpenMP_Release|x64.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.OpenMP_Release|x64.Build.0 = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.OpenMP_Release|x86.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.OpenMP_Release|x86.Build.0 = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Release|x64.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Release|x64.Build.0 = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Release|x86.ActiveCfg = Release|x64 + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93}.Release|x86.Build.0 = Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Debug|x64.ActiveCfg = Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Debug|x64.Build.0 = Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Debug|x86.ActiveCfg = Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Debug|x86.Build.0 = Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_Release|x64.Build.0 = Double_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Double_Release|x86.Build.0 = Double_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Matlab_Debug|x86.Build.0 = Debug|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Matlab_Release|x86.ActiveCfg = Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Matlab_Release|x86.Build.0 = Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Release|x64.ActiveCfg = Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Release|x64.Build.0 = Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Release|x86.ActiveCfg = Release|x64 + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E}.Release|x86.Build.0 = Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Debug|x64.ActiveCfg = Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Debug|x64.Build.0 = Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Debug|x86.ActiveCfg = Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Debug|x86.Build.0 = Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_Release|x64.Build.0 = Double_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Double_Release|x86.Build.0 = Double_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Matlab_Debug|x86.Build.0 = Debug|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Matlab_Release|x86.ActiveCfg = Matlab_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Matlab_Release|x86.Build.0 = Matlab_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Release|x64.ActiveCfg = Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Release|x64.Build.0 = Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Release|x86.ActiveCfg = Release|x64 + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9}.Release|x86.Build.0 = Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Debug|x64.ActiveCfg = Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Debug|x64.Build.0 = Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Debug|x86.ActiveCfg = Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Debug|x86.Build.0 = Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_Release|x64.Build.0 = Double_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Double_Release|x86.Build.0 = Double_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Matlab_Debug|x86.Build.0 = Debug|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Matlab_Release|x86.ActiveCfg = Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Matlab_Release|x86.Build.0 = Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Release|x64.ActiveCfg = Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Release|x64.Build.0 = Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Release|x86.ActiveCfg = Release|x64 + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A}.Release|x86.Build.0 = Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Debug|x64.ActiveCfg = Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Debug|x64.Build.0 = Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Debug|x86.ActiveCfg = Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Debug|x86.Build.0 = Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_Release|x64.Build.0 = Double_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Double_Release|x86.Build.0 = Double_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Matlab_Debug|x86.Build.0 = Debug|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Matlab_Release|x86.ActiveCfg = Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Matlab_Release|x86.Build.0 = Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Release|x64.ActiveCfg = Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Release|x64.Build.0 = Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Release|x86.ActiveCfg = Release|x64 + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16}.Release|x86.Build.0 = Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Debug|x64.ActiveCfg = Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Debug|x64.Build.0 = Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Debug|x86.ActiveCfg = Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Debug|x86.Build.0 = Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_Release|x64.Build.0 = Double_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Double_Release|x86.Build.0 = Double_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Matlab_Debug|x86.Build.0 = Debug|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Matlab_Release|x86.ActiveCfg = Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Matlab_Release|x86.Build.0 = Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Release|x64.ActiveCfg = Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Release|x64.Build.0 = Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Release|x86.ActiveCfg = Release|x64 + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D}.Release|x86.Build.0 = Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Debug|x64.ActiveCfg = Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Debug|x64.Build.0 = Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Debug|x86.ActiveCfg = Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Debug|x86.Build.0 = Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_Release|x64.Build.0 = Double_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Double_Release|x86.Build.0 = Double_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Matlab_Debug|x86.Build.0 = Debug|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Matlab_Release|x86.ActiveCfg = Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Matlab_Release|x86.Build.0 = Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Release|x64.ActiveCfg = Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Release|x64.Build.0 = Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Release|x86.ActiveCfg = Release|x64 + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188}.Release|x86.Build.0 = Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Debug|x64.ActiveCfg = Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Debug|x64.Build.0 = Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Debug|x86.ActiveCfg = Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Debug|x86.Build.0 = Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_Release|x64.Build.0 = Double_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Double_Release|x86.Build.0 = Double_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Matlab_Debug|x86.Build.0 = Debug|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Matlab_Release|x86.ActiveCfg = Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Matlab_Release|x86.Build.0 = Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Release|x64.ActiveCfg = Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Release|x64.Build.0 = Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Release|x86.ActiveCfg = Release|x64 + {E8C5BB9B-9709-41FA-B6F2-F334B112663A}.Release|x86.Build.0 = Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Debug|x64.ActiveCfg = Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Debug|x64.Build.0 = Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Debug|x86.ActiveCfg = Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Debug|x86.Build.0 = Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_Release|x64.Build.0 = Double_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Double_Release|x86.Build.0 = Double_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Matlab_Debug|x86.Build.0 = Debug|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Matlab_Release|x86.ActiveCfg = Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Matlab_Release|x86.Build.0 = Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Release|x64.ActiveCfg = Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Release|x64.Build.0 = Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Release|x86.ActiveCfg = Release|x64 + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A}.Release|x86.Build.0 = Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Debug|x64.ActiveCfg = Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Debug|x64.Build.0 = Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Debug|x86.ActiveCfg = Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Debug|x86.Build.0 = Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_Release|x64.Build.0 = Double_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Double_Release|x86.Build.0 = Double_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Matlab_Debug|x86.Build.0 = Debug|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Matlab_Release|x86.ActiveCfg = Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Matlab_Release|x86.Build.0 = Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Release|x64.ActiveCfg = Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Release|x64.Build.0 = Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Release|x86.ActiveCfg = Release|x64 + {AD8D7798-F800-4C73-B896-7E48EF1D52D3}.Release|x86.Build.0 = Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Debug|x64.ActiveCfg = Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Debug|x64.Build.0 = Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Debug|x86.ActiveCfg = Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Debug|x86.Build.0 = Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_Release|x64.Build.0 = Double_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Double_Release|x86.Build.0 = Double_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Matlab_Debug|x86.Build.0 = Debug|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Matlab_Release|x86.ActiveCfg = Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Matlab_Release|x86.Build.0 = Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Release|x64.ActiveCfg = Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Release|x64.Build.0 = Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Release|x86.ActiveCfg = Release|x64 + {3000393A-702F-488E-B918-1D37955FA8D3}.Release|x86.Build.0 = Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Debug|x64.ActiveCfg = Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Debug|x64.Build.0 = Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Debug|x86.ActiveCfg = Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Debug|x86.Build.0 = Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_Release|x64.Build.0 = Double_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Double_Release|x86.Build.0 = Double_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Matlab_Debug|x86.Build.0 = Debug|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Matlab_Release|x86.ActiveCfg = Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Matlab_Release|x86.Build.0 = Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Release|x64.ActiveCfg = Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Release|x64.Build.0 = Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Release|x86.ActiveCfg = Release|x64 + {676276A1-DC23-4287-8386-07076303C39D}.Release|x86.Build.0 = Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Debug|x64.ActiveCfg = Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Debug|x64.Build.0 = Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Debug|x86.ActiveCfg = Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Debug|x86.Build.0 = Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_Release|x64.Build.0 = Double_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Double_Release|x86.Build.0 = Double_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Matlab_Debug|x86.Build.0 = Debug|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Matlab_Release|x86.ActiveCfg = Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Matlab_Release|x86.Build.0 = Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Release|x64.ActiveCfg = Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Release|x64.Build.0 = Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Release|x86.ActiveCfg = Release|x64 + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA}.Release|x86.Build.0 = Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Debug|x64.ActiveCfg = Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Debug|x64.Build.0 = Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Debug|x86.ActiveCfg = Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Debug|x86.Build.0 = Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_Release|x64.Build.0 = Double_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Double_Release|x86.Build.0 = Double_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Matlab_Debug|x86.Build.0 = Debug|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Matlab_Release|x86.ActiveCfg = Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Matlab_Release|x86.Build.0 = Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Release|x64.ActiveCfg = Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Release|x64.Build.0 = Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Release|x86.ActiveCfg = Release|x64 + {951A453F-1999-483D-848A-9B63C282F43D}.Release|x86.Build.0 = Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Debug|x64.ActiveCfg = Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Debug|x64.Build.0 = Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Debug|x86.ActiveCfg = Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Debug|x86.Build.0 = Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_Release|x64.Build.0 = Double_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Double_Release|x86.Build.0 = Double_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Matlab_Debug|x86.Build.0 = Debug|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Matlab_Release|x86.ActiveCfg = Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Matlab_Release|x86.Build.0 = Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Release|x64.ActiveCfg = Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Release|x64.Build.0 = Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Release|x86.ActiveCfg = Release|x64 + {D029FC73-035C-4EB8-96DA-5B1131706A2D}.Release|x86.Build.0 = Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Debug|x64.ActiveCfg = Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Debug|x64.Build.0 = Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Debug|x86.ActiveCfg = Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Debug|x86.Build.0 = Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_Release|x64.Build.0 = Double_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Double_Release|x86.Build.0 = Double_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Matlab_Debug|x86.Build.0 = Debug|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Matlab_Release|x86.ActiveCfg = Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Matlab_Release|x86.Build.0 = Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Release|x64.ActiveCfg = Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Release|x64.Build.0 = Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Release|x86.ActiveCfg = Release|x64 + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD}.Release|x86.Build.0 = Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Debug|x64.ActiveCfg = Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Debug|x64.Build.0 = Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Debug|x86.ActiveCfg = Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Debug|x86.Build.0 = Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_Release|x64.Build.0 = Double_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Double_Release|x86.Build.0 = Double_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Matlab_Debug|x86.Build.0 = Debug|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Matlab_Release|x86.ActiveCfg = Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Matlab_Release|x86.Build.0 = Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Release|x64.ActiveCfg = Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Release|x64.Build.0 = Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Release|x86.ActiveCfg = Release|x64 + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19}.Release|x86.Build.0 = Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Debug|x64.ActiveCfg = Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Debug|x64.Build.0 = Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Debug|x86.ActiveCfg = Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Debug|x86.Build.0 = Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_Release|x64.Build.0 = Double_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Double_Release|x86.Build.0 = Double_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Matlab_Debug|x86.Build.0 = Debug|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Matlab_Release|x86.ActiveCfg = Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Matlab_Release|x86.Build.0 = Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Release|x64.ActiveCfg = Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Release|x64.Build.0 = Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Release|x86.ActiveCfg = Release|x64 + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9}.Release|x86.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Debug|x64.ActiveCfg = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Debug|x64.Build.0 = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Debug|x86.ActiveCfg = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Debug|x86.Build.0 = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_Debug|x64.ActiveCfg = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_Debug|x64.Build.0 = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_Debug|x86.ActiveCfg = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_Debug|x86.Build.0 = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_OpenMP_Release|x64.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_OpenMP_Release|x64.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_OpenMP_Release|x86.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_OpenMP_Release|x86.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_Release|x64.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_Release|x64.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_Release|x86.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Double_Release|x86.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Matlab_Debug|x64.Build.0 = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Matlab_Debug|x86.Build.0 = Debug|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Matlab_Release|x64.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Matlab_Release|x64.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Matlab_Release|x86.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Matlab_Release|x86.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.OpenMP_Release|x64.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.OpenMP_Release|x64.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.OpenMP_Release|x86.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.OpenMP_Release|x86.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Release|x64.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Release|x64.Build.0 = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Release|x86.ActiveCfg = Release|x64 + {471EEB17-A1AA-43B0-ACEE-719B80BB4811}.Release|x86.Build.0 = Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Debug|x64.ActiveCfg = Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Debug|x64.Build.0 = Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Debug|x86.ActiveCfg = Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Debug|x86.Build.0 = Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_Release|x64.Build.0 = Double_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Double_Release|x86.Build.0 = Double_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Matlab_Debug|x64.Build.0 = Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Matlab_Debug|x86.Build.0 = Debug|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Matlab_Release|x86.ActiveCfg = Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Matlab_Release|x86.Build.0 = Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Release|x64.ActiveCfg = Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Release|x64.Build.0 = Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Release|x86.ActiveCfg = Release|x64 + {B50C776E-F931-4E83-916F-C4E6977E40A3}.Release|x86.Build.0 = Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Debug|x64.ActiveCfg = Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Debug|x64.Build.0 = Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Debug|x86.ActiveCfg = Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Debug|x86.Build.0 = Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_Release|x64.Build.0 = Double_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Double_Release|x86.Build.0 = Double_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Matlab_Debug|x86.Build.0 = Debug|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Matlab_Release|x86.ActiveCfg = Matlab_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Matlab_Release|x86.Build.0 = Matlab_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Release|x64.ActiveCfg = Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Release|x64.Build.0 = Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Release|x86.ActiveCfg = Release|x64 + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B}.Release|x86.Build.0 = Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Debug|x64.ActiveCfg = Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Debug|x64.Build.0 = Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Debug|x86.ActiveCfg = Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Debug|x86.Build.0 = Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_Release|x64.Build.0 = Double_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Double_Release|x86.Build.0 = Double_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Matlab_Debug|x86.Build.0 = Debug|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Matlab_Release|x86.ActiveCfg = Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Matlab_Release|x86.Build.0 = Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Release|x64.ActiveCfg = Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Release|x64.Build.0 = Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Release|x86.ActiveCfg = Release|x64 + {2467FDD4-622B-4628-993A-73994FB8172E}.Release|x86.Build.0 = Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Debug|x64.ActiveCfg = Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Debug|x64.Build.0 = Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Debug|x86.ActiveCfg = Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Debug|x86.Build.0 = Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_Release|x64.Build.0 = Double_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Double_Release|x86.Build.0 = Double_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Matlab_Debug|x86.Build.0 = Debug|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Matlab_Release|x86.ActiveCfg = Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Matlab_Release|x86.Build.0 = Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Release|x64.ActiveCfg = Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Release|x64.Build.0 = Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Release|x86.ActiveCfg = Release|x64 + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91}.Release|x86.Build.0 = Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Debug|x64.ActiveCfg = Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Debug|x64.Build.0 = Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Debug|x86.ActiveCfg = Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Debug|x86.Build.0 = Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_Release|x64.Build.0 = Double_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Double_Release|x86.Build.0 = Double_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Matlab_Debug|x86.Build.0 = Debug|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Matlab_Release|x86.ActiveCfg = Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Matlab_Release|x86.Build.0 = Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Release|x64.ActiveCfg = Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Release|x64.Build.0 = Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Release|x86.ActiveCfg = Release|x64 + {FE80CE9A-7E16-476D-B63A-F9F870ACB662}.Release|x86.Build.0 = Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Debug|x64.ActiveCfg = Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Debug|x64.Build.0 = Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Debug|x86.ActiveCfg = Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Debug|x86.Build.0 = Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_Release|x64.Build.0 = Double_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Double_Release|x86.Build.0 = Double_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Matlab_Debug|x86.Build.0 = Debug|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Matlab_Release|x86.ActiveCfg = Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Matlab_Release|x86.Build.0 = Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Release|x64.ActiveCfg = Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Release|x64.Build.0 = Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Release|x86.ActiveCfg = Release|x64 + {029204DD-3D5B-47C6-8CAA-A933886D4674}.Release|x86.Build.0 = Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Debug|x64.ActiveCfg = Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Debug|x64.Build.0 = Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Debug|x86.ActiveCfg = Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Debug|x86.Build.0 = Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_Release|x64.Build.0 = Double_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Double_Release|x86.Build.0 = Double_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Matlab_Debug|x86.Build.0 = Debug|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Matlab_Release|x86.ActiveCfg = Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Matlab_Release|x86.Build.0 = Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Release|x64.ActiveCfg = Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Release|x64.Build.0 = Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Release|x86.ActiveCfg = Release|x64 + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C}.Release|x86.Build.0 = Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Debug|x64.ActiveCfg = Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Debug|x64.Build.0 = Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Debug|x86.ActiveCfg = Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Debug|x86.Build.0 = Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_Release|x64.Build.0 = Double_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Double_Release|x86.Build.0 = Double_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Matlab_Debug|x86.Build.0 = Debug|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Matlab_Release|x86.ActiveCfg = Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Matlab_Release|x86.Build.0 = Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Release|x64.ActiveCfg = Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Release|x64.Build.0 = Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Release|x86.ActiveCfg = Release|x64 + {774BDC53-33C4-4926-B01D-DC376DAE055B}.Release|x86.Build.0 = Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Debug|x64.ActiveCfg = Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Debug|x64.Build.0 = Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Debug|x86.ActiveCfg = Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Debug|x86.Build.0 = Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_Release|x64.Build.0 = Double_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Double_Release|x86.Build.0 = Double_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Matlab_Debug|x86.Build.0 = Debug|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Matlab_Release|x86.ActiveCfg = Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Matlab_Release|x86.Build.0 = Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Release|x64.ActiveCfg = Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Release|x64.Build.0 = Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Release|x86.ActiveCfg = Release|x64 + {6906E75C-2A54-431B-A11D-145864FCDD5C}.Release|x86.Build.0 = Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Debug|x64.ActiveCfg = Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Debug|x64.Build.0 = Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Debug|x86.ActiveCfg = Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Debug|x86.Build.0 = Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_Release|x64.Build.0 = Double_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Double_Release|x86.Build.0 = Double_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Matlab_Debug|x86.Build.0 = Debug|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Matlab_Release|x64.ActiveCfg = Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Matlab_Release|x86.ActiveCfg = Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Matlab_Release|x86.Build.0 = Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Release|x64.ActiveCfg = Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Release|x64.Build.0 = Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Release|x86.ActiveCfg = Release|x64 + {ACF05685-6592-462C-A3B3-9CDE2CAFD958}.Release|x86.Build.0 = Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Debug|x64.ActiveCfg = Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Debug|x64.Build.0 = Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Debug|x86.ActiveCfg = Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Debug|x86.Build.0 = Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_Release|x64.Build.0 = Double_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Double_Release|x86.Build.0 = Double_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Matlab_Debug|x86.Build.0 = Debug|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Matlab_Release|x64.ActiveCfg = Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Matlab_Release|x86.ActiveCfg = Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Matlab_Release|x86.Build.0 = Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Release|x64.ActiveCfg = Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Release|x64.Build.0 = Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Release|x86.ActiveCfg = Release|x64 + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A}.Release|x86.Build.0 = Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Debug|x64.ActiveCfg = Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Debug|x64.Build.0 = Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Debug|x86.ActiveCfg = Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Debug|x86.Build.0 = Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_Release|x64.Build.0 = Double_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Double_Release|x86.Build.0 = Double_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Matlab_Debug|x86.Build.0 = Debug|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Matlab_Release|x64.ActiveCfg = Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Matlab_Release|x86.ActiveCfg = Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Matlab_Release|x86.Build.0 = Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Release|x64.ActiveCfg = Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Release|x64.Build.0 = Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Release|x86.ActiveCfg = Release|x64 + {DB03A086-3362-41E5-930A-B151D137ACCF}.Release|x86.Build.0 = Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Debug|x64.ActiveCfg = Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Debug|x64.Build.0 = Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Debug|x86.ActiveCfg = Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Debug|x86.Build.0 = Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_Release|x64.Build.0 = Double_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Double_Release|x86.Build.0 = Double_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Matlab_Debug|x86.Build.0 = Debug|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Matlab_Release|x86.ActiveCfg = Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Matlab_Release|x86.Build.0 = Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Release|x64.ActiveCfg = Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Release|x64.Build.0 = Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Release|x86.ActiveCfg = Release|x64 + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D}.Release|x86.Build.0 = Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Debug|x64.ActiveCfg = Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Debug|x64.Build.0 = Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Debug|x86.ActiveCfg = Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Debug|x86.Build.0 = Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_Release|x64.Build.0 = Double_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Double_Release|x86.Build.0 = Double_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Matlab_Debug|x86.Build.0 = Debug|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Matlab_Release|x64.ActiveCfg = Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Matlab_Release|x86.ActiveCfg = Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Matlab_Release|x86.Build.0 = Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Release|x64.ActiveCfg = Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Release|x64.Build.0 = Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Release|x86.ActiveCfg = Release|x64 + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861}.Release|x86.Build.0 = Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Debug|x64.ActiveCfg = Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Debug|x64.Build.0 = Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Debug|x86.ActiveCfg = Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Debug|x86.Build.0 = Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_Release|x64.Build.0 = Double_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Double_Release|x86.Build.0 = Double_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Matlab_Debug|x86.Build.0 = Debug|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Matlab_Release|x64.ActiveCfg = Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Matlab_Release|x86.ActiveCfg = Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Matlab_Release|x86.Build.0 = Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Release|x64.ActiveCfg = Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Release|x64.Build.0 = Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Release|x86.ActiveCfg = Release|x64 + {4A398285-E3C7-4CD9-8F43-51A017D5A48A}.Release|x86.Build.0 = Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Debug|x64.ActiveCfg = Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Debug|x64.Build.0 = Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Debug|x86.ActiveCfg = Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Debug|x86.Build.0 = Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_Release|x64.Build.0 = Double_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Double_Release|x86.Build.0 = Double_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Matlab_Debug|x86.Build.0 = Debug|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Matlab_Release|x64.ActiveCfg = Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Matlab_Release|x86.ActiveCfg = Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Matlab_Release|x86.Build.0 = Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Release|x64.ActiveCfg = Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Release|x64.Build.0 = Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Release|x86.ActiveCfg = Release|x64 + {D9220A21-8C69-42E4-B085-E5D996B867D9}.Release|x86.Build.0 = Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Debug|x64.ActiveCfg = Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Debug|x64.Build.0 = Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Debug|x86.ActiveCfg = Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Debug|x86.Build.0 = Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_Release|x64.Build.0 = Double_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Double_Release|x86.Build.0 = Double_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Matlab_Debug|x86.Build.0 = Debug|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Matlab_Release|x64.ActiveCfg = Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Matlab_Release|x86.ActiveCfg = Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Matlab_Release|x86.Build.0 = Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Release|x64.ActiveCfg = Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Release|x64.Build.0 = Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Release|x86.ActiveCfg = Release|x64 + {E32296E3-72E8-435B-9BF3-2FAE02189CA5}.Release|x86.Build.0 = Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Debug|x64.ActiveCfg = Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Debug|x64.Build.0 = Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Debug|x86.ActiveCfg = Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Debug|x86.Build.0 = Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_Release|x64.Build.0 = Double_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Double_Release|x86.Build.0 = Double_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Matlab_Debug|x86.Build.0 = Debug|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Matlab_Release|x64.ActiveCfg = Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Matlab_Release|x86.ActiveCfg = Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Matlab_Release|x86.Build.0 = Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Release|x64.ActiveCfg = Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Release|x64.Build.0 = Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Release|x86.ActiveCfg = Release|x64 + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53}.Release|x86.Build.0 = Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Debug|x64.ActiveCfg = Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Debug|x64.Build.0 = Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Debug|x86.ActiveCfg = Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Debug|x86.Build.0 = Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_Release|x64.Build.0 = Double_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Double_Release|x86.Build.0 = Double_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Matlab_Debug|x86.Build.0 = Debug|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Matlab_Release|x64.ActiveCfg = Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Matlab_Release|x86.ActiveCfg = Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Matlab_Release|x86.Build.0 = Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Release|x64.ActiveCfg = Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Release|x64.Build.0 = Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Release|x86.ActiveCfg = Release|x64 + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD}.Release|x86.Build.0 = Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Debug|x64.ActiveCfg = Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Debug|x64.Build.0 = Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Debug|x86.ActiveCfg = Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Debug|x86.Build.0 = Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_Release|x64.Build.0 = Double_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Double_Release|x86.Build.0 = Double_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Matlab_Debug|x86.Build.0 = Debug|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Matlab_Release|x64.ActiveCfg = Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Matlab_Release|x86.ActiveCfg = Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Matlab_Release|x86.Build.0 = Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Release|x64.ActiveCfg = Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Release|x64.Build.0 = Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Release|x86.ActiveCfg = Release|x64 + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C}.Release|x86.Build.0 = Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Debug|x64.ActiveCfg = Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Debug|x64.Build.0 = Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Debug|x86.ActiveCfg = Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Debug|x86.Build.0 = Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_Release|x64.Build.0 = Double_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Double_Release|x86.Build.0 = Double_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Matlab_Debug|x86.Build.0 = Debug|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Matlab_Release|x64.ActiveCfg = Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Matlab_Release|x86.ActiveCfg = Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Matlab_Release|x86.Build.0 = Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Release|x64.ActiveCfg = Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Release|x64.Build.0 = Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Release|x86.ActiveCfg = Release|x64 + {09919696-2DC4-48A3-B862-7BBF5CFD59CE}.Release|x86.Build.0 = Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Debug|x64.ActiveCfg = Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Debug|x64.Build.0 = Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Debug|x86.ActiveCfg = Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Debug|x86.Build.0 = Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_Release|x64.Build.0 = Double_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Double_Release|x86.Build.0 = Double_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Matlab_Debug|x86.Build.0 = Debug|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Matlab_Release|x64.ActiveCfg = Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Matlab_Release|x86.ActiveCfg = Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Matlab_Release|x86.Build.0 = Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Release|x64.ActiveCfg = Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Release|x64.Build.0 = Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Release|x86.ActiveCfg = Release|x64 + {C271833A-06D0-441D-A5A8-DDAB0AA4740C}.Release|x86.Build.0 = Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Debug|x64.ActiveCfg = Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Debug|x64.Build.0 = Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Debug|x86.ActiveCfg = Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Debug|x86.Build.0 = Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_Release|x64.Build.0 = Double_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Double_Release|x86.Build.0 = Double_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Matlab_Debug|x86.Build.0 = Debug|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Matlab_Release|x64.ActiveCfg = Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Matlab_Release|x86.ActiveCfg = Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Matlab_Release|x86.Build.0 = Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Release|x64.ActiveCfg = Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Release|x64.Build.0 = Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Release|x86.ActiveCfg = Release|x64 + {5DA54439-78F9-48BD-A928-D2A856924E7E}.Release|x86.Build.0 = Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Debug|x64.ActiveCfg = Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Debug|x64.Build.0 = Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Debug|x86.ActiveCfg = Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Debug|x86.Build.0 = Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_Release|x64.Build.0 = Double_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Double_Release|x86.Build.0 = Double_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Matlab_Debug|x86.Build.0 = Debug|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Matlab_Release|x64.ActiveCfg = Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Matlab_Release|x86.ActiveCfg = Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Matlab_Release|x86.Build.0 = Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Release|x64.ActiveCfg = Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Release|x64.Build.0 = Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Release|x86.ActiveCfg = Release|x64 + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3}.Release|x86.Build.0 = Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Debug|x64.ActiveCfg = Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Debug|x64.Build.0 = Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Debug|x86.ActiveCfg = Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Debug|x86.Build.0 = Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_Release|x64.Build.0 = Double_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Double_Release|x86.Build.0 = Double_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Matlab_Debug|x86.Build.0 = Debug|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Matlab_Release|x64.ActiveCfg = Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Matlab_Release|x86.ActiveCfg = Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Matlab_Release|x86.Build.0 = Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Release|x64.ActiveCfg = Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Release|x64.Build.0 = Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Release|x86.ActiveCfg = Release|x64 + {2153CAE1-90AC-4F06-A62C-EB162CED1192}.Release|x86.Build.0 = Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Debug|x64.ActiveCfg = Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Debug|x64.Build.0 = Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Debug|x86.ActiveCfg = Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Debug|x86.Build.0 = Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_Release|x64.Build.0 = Double_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Double_Release|x86.Build.0 = Double_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Matlab_Debug|x86.Build.0 = Debug|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Matlab_Release|x64.ActiveCfg = Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Matlab_Release|x86.ActiveCfg = Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Matlab_Release|x86.Build.0 = Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Release|x64.ActiveCfg = Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Release|x64.Build.0 = Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Release|x86.ActiveCfg = Release|x64 + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E}.Release|x86.Build.0 = Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Debug|x64.ActiveCfg = Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Debug|x64.Build.0 = Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Debug|x86.ActiveCfg = Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Debug|x86.Build.0 = Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_Release|x64.Build.0 = Double_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Double_Release|x86.Build.0 = Double_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Matlab_Debug|x86.Build.0 = Debug|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Matlab_Release|x64.ActiveCfg = Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Matlab_Release|x86.ActiveCfg = Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Matlab_Release|x86.Build.0 = Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Release|x64.ActiveCfg = Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Release|x64.Build.0 = Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Release|x86.ActiveCfg = Release|x64 + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989}.Release|x86.Build.0 = Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Debug|x64.ActiveCfg = Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Debug|x64.Build.0 = Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Debug|x86.ActiveCfg = Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Debug|x86.Build.0 = Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_Release|x64.Build.0 = Double_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Double_Release|x86.Build.0 = Double_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Matlab_Debug|x86.Build.0 = Debug|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Matlab_Release|x86.ActiveCfg = Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Matlab_Release|x86.Build.0 = Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Release|x64.ActiveCfg = Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Release|x64.Build.0 = Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Release|x86.ActiveCfg = Release|x64 + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492}.Release|x86.Build.0 = Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Debug|x64.ActiveCfg = Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Debug|x64.Build.0 = Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Debug|x86.ActiveCfg = Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Debug|x86.Build.0 = Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_Release|x64.Build.0 = Double_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Double_Release|x86.Build.0 = Double_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Matlab_Debug|x86.Build.0 = Debug|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Matlab_Release|x64.ActiveCfg = Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Matlab_Release|x86.ActiveCfg = Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Matlab_Release|x86.Build.0 = Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Release|x64.ActiveCfg = Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Release|x64.Build.0 = Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Release|x86.ActiveCfg = Release|x64 + {49A73297-8D2F-4C60-BDC8-B20533516368}.Release|x86.Build.0 = Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Debug|x64.ActiveCfg = Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Debug|x64.Build.0 = Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Debug|x86.ActiveCfg = Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Debug|x86.Build.0 = Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_Release|x64.Build.0 = Double_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Double_Release|x86.Build.0 = Double_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Matlab_Debug|x86.Build.0 = Debug|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Matlab_Release|x64.ActiveCfg = Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Matlab_Release|x86.ActiveCfg = Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Matlab_Release|x86.Build.0 = Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Release|x64.ActiveCfg = Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Release|x64.Build.0 = Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Release|x86.ActiveCfg = Release|x64 + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8}.Release|x86.Build.0 = Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Debug|x64.ActiveCfg = Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Debug|x64.Build.0 = Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Debug|x86.ActiveCfg = Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Debug|x86.Build.0 = Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_Release|x64.Build.0 = Double_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Double_Release|x86.Build.0 = Double_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Matlab_Debug|x86.Build.0 = Debug|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Matlab_Release|x64.ActiveCfg = Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Matlab_Release|x86.ActiveCfg = Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Matlab_Release|x86.Build.0 = Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Release|x64.ActiveCfg = Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Release|x64.Build.0 = Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Release|x86.ActiveCfg = Release|x64 + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418}.Release|x86.Build.0 = Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Debug|x64.ActiveCfg = Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Debug|x64.Build.0 = Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Debug|x86.ActiveCfg = Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Debug|x86.Build.0 = Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_Release|x64.Build.0 = Double_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Double_Release|x86.Build.0 = Double_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Matlab_Debug|x86.Build.0 = Debug|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Matlab_Release|x64.ActiveCfg = Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Matlab_Release|x86.ActiveCfg = Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Matlab_Release|x86.Build.0 = Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Release|x64.ActiveCfg = Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Release|x64.Build.0 = Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Release|x86.ActiveCfg = Release|x64 + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA}.Release|x86.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Debug|x64.ActiveCfg = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Debug|x64.Build.0 = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Debug|x86.ActiveCfg = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Debug|x86.Build.0 = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_Debug|x64.ActiveCfg = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_Debug|x64.Build.0 = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_Debug|x86.ActiveCfg = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_Debug|x86.Build.0 = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_OpenMP_Release|x64.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_OpenMP_Release|x64.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_OpenMP_Release|x86.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_OpenMP_Release|x86.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_Release|x64.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_Release|x64.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_Release|x86.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Double_Release|x86.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Matlab_Debug|x64.Build.0 = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Matlab_Debug|x86.Build.0 = Debug|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Matlab_Release|x64.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Matlab_Release|x64.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Matlab_Release|x86.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Matlab_Release|x86.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.OpenMP_Release|x64.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.OpenMP_Release|x64.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.OpenMP_Release|x86.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.OpenMP_Release|x86.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Release|x64.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Release|x64.Build.0 = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Release|x86.ActiveCfg = Release|x64 + {94F38C02-84E4-4364-806E-3CC45730F6BD}.Release|x86.Build.0 = Release|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug|x64.ActiveCfg = Matlab_Debug|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug|x86.ActiveCfg = Matlab_Debug|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Debug|x86.Build.0 = Matlab_Debug|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Double_Debug|x64.ActiveCfg = Matlab_Release|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Double_Debug|x86.ActiveCfg = Matlab_Release|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Double_Debug|x86.Build.0 = Matlab_Release|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Double_OpenMP_Release|x64.ActiveCfg = Matlab_Release|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Double_OpenMP_Release|x86.ActiveCfg = Matlab_Release|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Double_OpenMP_Release|x86.Build.0 = Matlab_Release|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Double_Release|x64.ActiveCfg = Matlab_Release|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Double_Release|x86.ActiveCfg = Matlab_Release|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Double_Release|x86.Build.0 = Matlab_Release|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Matlab_Debug|x86.ActiveCfg = Matlab_Debug|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Matlab_Debug|x86.Build.0 = Matlab_Debug|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Matlab_Release|x86.ActiveCfg = Matlab_Debug|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Matlab_Release|x86.Build.0 = Matlab_Debug|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.OpenMP_Release|x64.ActiveCfg = Matlab_Release|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.OpenMP_Release|x86.ActiveCfg = Matlab_Release|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.OpenMP_Release|x86.Build.0 = Matlab_Release|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release|x64.ActiveCfg = Matlab_Release|x64 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release|x86.ActiveCfg = Matlab_Release|Win32 + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67}.Release|x86.Build.0 = Matlab_Release|Win32 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Debug|x64.ActiveCfg = Debug|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Debug|x64.Build.0 = Debug|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Debug|x86.ActiveCfg = Debug|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Debug|x86.Build.0 = Debug|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_Debug|x64.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_Debug|x64.Build.0 = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_Debug|x86.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_Debug|x86.Build.0 = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_OpenMP_Release|x64.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_OpenMP_Release|x64.Build.0 = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_OpenMP_Release|x86.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_OpenMP_Release|x86.Build.0 = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_Release|x64.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_Release|x64.Build.0 = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_Release|x86.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Double_Release|x86.Build.0 = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Matlab_Debug|x86.Build.0 = Debug|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Matlab_Release|x64.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Matlab_Release|x86.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Matlab_Release|x86.Build.0 = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.OpenMP_Release|x64.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.OpenMP_Release|x86.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.OpenMP_Release|x86.Build.0 = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Release|x64.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Release|x64.Build.0 = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Release|x86.ActiveCfg = Release|x64 + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D}.Release|x86.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Debug|x64.ActiveCfg = Debug|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Debug|x64.Build.0 = Debug|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Debug|x86.ActiveCfg = Debug|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Debug|x86.Build.0 = Debug|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_Debug|x64.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_Debug|x64.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_Debug|x86.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_Debug|x86.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_OpenMP_Release|x64.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_OpenMP_Release|x64.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_OpenMP_Release|x86.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_OpenMP_Release|x86.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_Release|x64.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_Release|x64.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_Release|x86.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Double_Release|x86.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Matlab_Debug|x86.Build.0 = Debug|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Matlab_Release|x64.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Matlab_Release|x86.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Matlab_Release|x86.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.OpenMP_Release|x64.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.OpenMP_Release|x86.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.OpenMP_Release|x86.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Release|x64.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Release|x64.Build.0 = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Release|x86.ActiveCfg = Release|x64 + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E}.Release|x86.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Debug|x64.ActiveCfg = Debug|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Debug|x64.Build.0 = Debug|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Debug|x86.ActiveCfg = Debug|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Debug|x86.Build.0 = Debug|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_Debug|x64.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_Debug|x64.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_Debug|x86.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_Debug|x86.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_OpenMP_Release|x64.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_OpenMP_Release|x64.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_OpenMP_Release|x86.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_OpenMP_Release|x86.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_Release|x64.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_Release|x64.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_Release|x86.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Double_Release|x86.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Matlab_Debug|x86.ActiveCfg = Debug|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Matlab_Debug|x86.Build.0 = Debug|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Matlab_Release|x64.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Matlab_Release|x86.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Matlab_Release|x86.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.OpenMP_Release|x64.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.OpenMP_Release|x86.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.OpenMP_Release|x86.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Release|x64.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Release|x64.Build.0 = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Release|x86.ActiveCfg = Release|x64 + {4AB5A895-5B6B-406D-AE36-85F5F5940974}.Release|x86.Build.0 = Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Debug|x64.ActiveCfg = Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Debug|x64.Build.0 = Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Debug|x86.ActiveCfg = Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Debug|x86.Build.0 = Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_Release|x64.Build.0 = Double_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Double_Release|x86.Build.0 = Double_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Matlab_Debug|x64.ActiveCfg = Matlab_Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Matlab_Debug|x64.Build.0 = Matlab_Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Matlab_Debug|x86.ActiveCfg = Double_Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Matlab_Debug|x86.Build.0 = Double_Debug|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Matlab_Release|x64.ActiveCfg = Matlab_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Matlab_Release|x64.Build.0 = Matlab_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Matlab_Release|x86.ActiveCfg = Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Matlab_Release|x86.Build.0 = Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.OpenMP_Release|x64.Build.0 = OpenMP_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Release|x64.ActiveCfg = Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Release|x64.Build.0 = Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Release|x86.ActiveCfg = Release|x64 + {F8C26AB7-4B2F-4610-A18B-A8C860926B21}.Release|x86.Build.0 = Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Debug|x64.ActiveCfg = Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Debug|x64.Build.0 = Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Debug|x86.ActiveCfg = Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Debug|x86.Build.0 = Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_Debug|x64.ActiveCfg = Double_Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_Debug|x64.Build.0 = Double_Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_Debug|x86.ActiveCfg = Double_Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_Debug|x86.Build.0 = Double_Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_OpenMP_Release|x64.ActiveCfg = Double_OpenMP_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_OpenMP_Release|x64.Build.0 = Double_OpenMP_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_OpenMP_Release|x86.ActiveCfg = Double_OpenMP_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_OpenMP_Release|x86.Build.0 = Double_OpenMP_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_Release|x64.ActiveCfg = Double_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_Release|x64.Build.0 = Double_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_Release|x86.ActiveCfg = Double_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Double_Release|x86.Build.0 = Double_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Matlab_Debug|x64.ActiveCfg = Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Matlab_Debug|x86.ActiveCfg = Double_Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Matlab_Debug|x86.Build.0 = Double_Debug|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Matlab_Release|x64.ActiveCfg = Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Matlab_Release|x86.ActiveCfg = Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Matlab_Release|x86.Build.0 = Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.OpenMP_Release|x64.ActiveCfg = OpenMP_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.OpenMP_Release|x86.ActiveCfg = OpenMP_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.OpenMP_Release|x86.Build.0 = OpenMP_Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Release|x64.ActiveCfg = Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Release|x64.Build.0 = Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Release|x86.ActiveCfg = Release|x64 + {9779535B-8DE4-4484-8B59-6E78344D658A}.Release|x86.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {EC73DA51-78CF-41DB-9DFA-88360BF2EA93} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {5ADBD025-C654-42C2-BA7C-10F3C3CEEB0E} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {EAF5E602-E6CD-4194-8CCA-0827AA4CCEC9} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {9CB36EC2-18AF-468E-BE43-FE63E383AA3A} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {12DF411B-C7DA-47BA-BB85-7714D5FD2A16} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {A0BB16B8-FBCD-452A-A644-FDD2B21DD05D} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {731C6D0A-CF24-4FD3-ABAC-17F31D97A188} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {E8C5BB9B-9709-41FA-B6F2-F334B112663A} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {B93E20A0-2230-4A2E-A1A6-DDA3240E8C8A} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {AD8D7798-F800-4C73-B896-7E48EF1D52D3} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {3000393A-702F-488E-B918-1D37955FA8D3} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {676276A1-DC23-4287-8386-07076303C39D} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {1DA9F21A-F9FE-45BC-A1CF-37A22220A9DA} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {951A453F-1999-483D-848A-9B63C282F43D} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {D029FC73-035C-4EB8-96DA-5B1131706A2D} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {FEE80C0E-EF4F-459D-85F9-D7C53B633DBD} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {5F0B72CC-2FBA-4BCF-AB9E-9968A848BC19} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {923F8E1F-F5FC-4572-9C32-94C90F04A5A9} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {471EEB17-A1AA-43B0-ACEE-719B80BB4811} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {B50C776E-F931-4E83-916F-C4E6977E40A3} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {46EB37F1-EEBA-4F35-A173-A37D42D97B5B} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {2467FDD4-622B-4628-993A-73994FB8172E} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {648CD825-ECB0-46D1-B1AA-A28F5C36CD91} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {FE80CE9A-7E16-476D-B63A-F9F870ACB662} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {029204DD-3D5B-47C6-8CAA-A933886D4674} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {3C27CA2D-259A-4A45-AA19-DB64F44FBE3C} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {774BDC53-33C4-4926-B01D-DC376DAE055B} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {6906E75C-2A54-431B-A11D-145864FCDD5C} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {ACF05685-6592-462C-A3B3-9CDE2CAFD958} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {60BA8F27-5C49-42DA-9CE4-F85A8215D02A} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {DB03A086-3362-41E5-930A-B151D137ACCF} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {CA8A0366-3C47-439A-8E9A-25BB36E3C10D} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {6E5137FC-19EB-4A7F-AAE8-523AAF95A861} = {D7D6BEC5-A67B-4D15-81F9-D846A7041C5D} + {4A398285-E3C7-4CD9-8F43-51A017D5A48A} = {D7D6BEC5-A67B-4D15-81F9-D846A7041C5D} + {D9220A21-8C69-42E4-B085-E5D996B867D9} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {E32296E3-72E8-435B-9BF3-2FAE02189CA5} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {9E1FBABD-B8BD-450F-B53D-72FEE6E78C53} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {4CE0CEBB-4A29-4E09-8EF5-240C46343ECD} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {F861FB71-8FE4-42A5-8FB4-684F60D50B9C} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {09919696-2DC4-48A3-B862-7BBF5CFD59CE} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {C271833A-06D0-441D-A5A8-DDAB0AA4740C} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {5DA54439-78F9-48BD-A928-D2A856924E7E} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {6AAA9C6D-9884-476E-B868-40A1C08BF0C3} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {2153CAE1-90AC-4F06-A62C-EB162CED1192} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {F4FA3CA2-D803-4A01-877B-ADF0AE48DE5E} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {FD3D570E-D4D4-4EB3-8894-8C1190EC7989} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + {EA57ACC1-EE1F-4565-B4DA-FA04D11A2492} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {49A73297-8D2F-4C60-BDC8-B20533516368} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {457CA498-DEB4-43D6-97A3-73FA2DFE99D8} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {EA3CEB08-28EE-4A74-B09F-34CBC5CD9418} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {71E6A09C-4569-4C24-87AF-8C9EE0C545BA} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8} + {94F38C02-84E4-4364-806E-3CC45730F6BD} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {C3C93CC0-EDD7-438F-988C-1F917FAEFA67} = {D7D6BEC5-A67B-4D15-81F9-D846A7041C5D} + {AC22FAE4-AD5D-40CA-9AAB-6F7AB2AA915D} = {76DE56EB-E48F-4F1A-8961-F97A71E7937B} + {9425AE4C-5879-4ED4-AA29-6A07F7C1B62E} = {76DE56EB-E48F-4F1A-8961-F97A71E7937B} + {4AB5A895-5B6B-406D-AE36-85F5F5940974} = {76DE56EB-E48F-4F1A-8961-F97A71E7937B} + {F8C26AB7-4B2F-4610-A18B-A8C860926B21} = {272B8080-A022-4F4A-BDD6-835871E44C23} + {9779535B-8DE4-4484-8B59-6E78344D658A} = {3517E990-350F-4471-A518-8B0BC77CFDDB} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B362252D-3254-4C68-B527-CC85CE3CCF75} + EndGlobalSection +EndGlobal diff --git a/vs-build/ReadMe.md b/vs-build/ReadMe.md deleted file mode 100644 index fd53760a70..0000000000 --- a/vs-build/ReadMe.md +++ /dev/null @@ -1,27 +0,0 @@ -# Visual Studio builds for Windows -The following solution files are available for code development on Windows using the Intel Fortran compiler with Visual Studio. - -- [OpenFAST](FAST/FAST.sln) - This contains builds for both the command-line OpenFAST executable as well as the DLL for use with the OpenFAST-Simulink interface. -- [FAST.Farm](FAST-farm/FAST-Farm.sln) - This contains the build configurations for FAST.Farm. -- Module-level drivers: - - AeroDynamics and HydroDynamics: - - [AeroDyn driver](AeroDyn/AeroDyn_Driver.sln) - - [UnsteadyAero driver](UnsteadyAero/UnsteadyAero.sln) - - [HydroDyn driver](HydroDyn/HydroDynDriver.sln) - - Structural: - - [BeamDyn driver](BeamDyn/BeamDyn-w-registry.sln) - - [SubDyn driver](SubDyn/SubDyn.sln) - - Wind/Wave conditions: - - [TurbSim](TurbSim/TurbSim.sln) Generates wind files - - [InflowWind driver](InflowWind/InflowWind_driver.sln) Reads and interpolates existing wind files - - [InflowWind c binding](InflowWind/InflowWind_c_binding.sln) Creates a library (DLL/so) of the InflowWind routines that can be called from a C interface. **TO DO: Combine this with InflowWind driver for easier maintenance** - - [SeaState driver](SeaState/SeaStateDriver.sln) Waves and currents -- Other: - - [Discon](Discon/Discon.sln) - This solution file contains all 3 controllers used in the OpenFAST r-test (with the historical NREL 5MW model). - It also contains the controller used with the FAST.Farm super-controller. - - [SC_DLL](SC_DLL.sln) This solution file builds a template supercontroller to be used with FAST.Farm. - - [OpenFAST Registry](Registry/Registry.sln) - The Registry project is included in almost every other solution file, so this solution file is only for debugging changes to the OpenFAST Registry. diff --git a/vs-build/Registry/FAST_Registry.sln b/vs-build/Registry/FAST_Registry.sln deleted file mode 100644 index c79ad0bab2..0000000000 --- a/vs-build/Registry/FAST_Registry.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Debug|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Debug|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {E46DCC9C-7BC9-40BA-8EF9-BDE0CD4C584B} - EndGlobalSection -EndGlobal diff --git a/vs-build/Registry/FAST_Registry.vcxproj b/vs-build/Registry/FAST_Registry.vcxproj deleted file mode 100644 index c6b337e3cc..0000000000 --- a/vs-build/Registry/FAST_Registry.vcxproj +++ /dev/null @@ -1,172 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - Win32Proj - FAST_Registry_c - 10.0 - - - - Application - true - Unicode - v142 - - - Application - true - Unicode - v142 - - - Application - false - true - Unicode - v142 - - - Application - false - true - Unicode - v142 - - - - - - - - - - - - - - - - - - - true - Registry - ..\..\build\bin\ - - - true - Registry - ..\..\build\bin\ - $(Configuration)\ - - - false - ..\..\build\bin\ - Registry - false - - - Registry - false - false - ..\..\build\bin\ - $(Configuration)\ - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - 4996 - - - Console - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - 4996 - - - Console - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - 4996 - - - Console - true - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - MultiThreaded - 4996 - - - Console - true - true - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vs-build/RunRegistry.bat b/vs-build/RunRegistry.bat index 76558bfe37..f413323c6e 100644 --- a/vs-build/RunRegistry.bat +++ b/vs-build/RunRegistry.bat @@ -43,6 +43,7 @@ SET ExtPtfm_Loc=%Modules_Loc%\extptfm\src SET AD_Loc=%Modules_Loc%\aerodyn\src SET SrvD_Loc=%Modules_Loc%\servodyn\src SET BD_Loc=%Modules_Loc%\beamdyn\src +SET SlD_Loc=%Modules_Loc%\soildyn\src SET SC_Loc=%Modules_Loc%\supercontroller\src SET ADsk_Loc=%Modules_Loc%\aerodisk\src @@ -53,7 +54,7 @@ SET WD_Loc=%Modules_Loc%\wakedynamics\src SET Farm_Loc=%Root_Loc%\glue-codes\fast-farm\src SET ALL_FAST_Includes=-I "%FAST_Loc%" -I "%NWTC_Lib_Loc%" -I "%ED_Loc%" -I "%SED_Loc%" -I^ - "%SrvD_Loc%" -I "%AD_Loc%" -I "%ADsk_Loc%" -I "%BD_Loc%" -I "%SC_Loc%" -I^ + "%SrvD_Loc%" -I "%AD_Loc%" -I "%ADsk_Loc%" -I "%BD_Loc%" -I "%SlD_Loc%" -I "%SC_Loc%" -I^ "%IfW_Loc%" -I "%SD_Loc%" -I "%HD_Loc%" -I "%SEAST_Loc%" -I "%MAP_Loc%" -I "%FEAM_Loc%" -I^ "%IceF_Loc%" -I "%IceD_Loc%" -I "%MD_Loc%" -I "%ExtInfw_Loc%" -I "%Orca_Loc%" -I "%ExtPtfm_Loc%" -I "%ExtLoads_Loc%" @@ -68,7 +69,7 @@ REM ---------------------------------------------------------------------------- :NWTC_Lib SET CURR_LOC=%NWTC_Lib_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\Registry_NWTC_Library_base.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" -noextrap +%REGISTRY% "%CURR_LOC%\Registry_NWTC_Library_base.txt" %ALL_FAST_Includes% -O "%Output_Loc%" -noextrap GOTO checkError :GridInterp @@ -80,14 +81,13 @@ GOTO checkError :MAP SET CURR_LOC=%MAP_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -ccode -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" -:: %REGISTRY% "%CURR_LOC%\MAP_Fortran_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" -noextrap +%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -ccode %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError :MAP_Fortran SET CURR_LOC=%MAP_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" -noextrap +%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" -noextrap GOTO checkError :FAST @@ -96,12 +96,24 @@ SET Output_Loc=%CURR_LOC% %REGISTRY% "%CURR_LOC%\FAST_Registry.txt" %ALL_FAST_Includes% -noextrap -O "%Output_Loc%" GOTO checkError +:Glue +SET CURR_LOC=%FAST_Loc% +SET Output_Loc=%CURR_LOC% +%REGISTRY% "%CURR_LOC%\Glue_Registry.txt" %ALL_FAST_Includes% -noextrap -O "%Output_Loc%" +GOTO checkError + :BeamDyn SET CURR_LOC=%BD_Loc% SET Output_Loc=%CURR_LOC% %REGISTRY% "%CURR_LOC%\Registry_BeamDyn.txt" -I "%NWTC_Lib_Loc%" -O "%Output_Loc%" GOTO checkError +:SoilDyn +SET CURR_LOC=%SlD_Loc% +SET Output_Loc=%CURR_LOC% +%REGISTRY% "%CURR_LOC%\SoilDyn_Registry.txt" -I "%NWTC_Lib_Loc%" -O "%Output_Loc%" +GOTO checkError + :SuperController SET CURR_LOC=%SC_Loc% SET Output_Loc=%CURR_LOC% @@ -131,45 +143,45 @@ GOTO checkError :ServoDyn SET CURR_LOC=%SrvD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError :Lidar :InflowWind SET CURR_LOC=%IfW_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError :IfW_FlowField :InflowWind_IO SET CURR_LOC=%IfW_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -noextrap -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" %ALL_FAST_Includes% -noextrap -O "%Output_Loc%" GOTO checkError :InflowWind_Driver SET CURR_LOC=%IfW_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -noextrap -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" %ALL_FAST_Includes% -noextrap -O "%Output_Loc%" GOTO checkError :ExternalInflow SET CURR_LOC=%ExtInfw_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%IfW_Loc%" -ccode -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" %ALL_FAST_Includes% -ccode -O "%Output_Loc%" GOTO checkError :ExtLoads SET CURR_LOC=%ExtLoads_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -I "%IfW_Loc%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError :ExtLoadsDX SET CURR_LOC=%ExtLoads_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -I "%NWTC_Lib_Loc%" -ccode -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" %ALL_FAST_Includes% -ccode -O "%Output_Loc%" GOTO checkError :AeroDyn @@ -177,19 +189,19 @@ GOTO checkError :DBEMT SET CURR_LOC=%AD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%IfW_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError :AeroDyn_Driver SET CURR_LOC=%AD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\AeroDyn_Driver_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%IfW_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" -noextrap +%REGISTRY% "%CURR_LOC%\AeroDyn_Driver_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" -noextrap GOTO checkError :ADI SET CURR_LOC=%AD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\AeroDyn_Inflow_Registry.txt" -I "%NWTC_Lib_Loc%" -I %IfW_Loc% -I "%CURR_LOC%" -O "%Output_Loc%" -noextrap +%REGISTRY% "%CURR_LOC%\AeroDyn_Inflow_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" -noextrap GOTO checkError :ADI_cbind @@ -202,31 +214,31 @@ GOTO checkError :AFI SET CURR_LOC=%AD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\AirfoilInfo_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" -noextrap +%REGISTRY% "%CURR_LOC%\AirfoilInfo_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" -noextrap GOTO checkError :UA SET CURR_LOC=%AD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\UnsteadyAero_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\UnsteadyAero_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError -:LD +:LinDyn SET CURR_LOC=%LD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\LinDyn_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\LinDyn_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError :FVW SET CURR_LOC=%AD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\FVW_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\FVW_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError :AA SET CURR_LOC=%AD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\AeroAcoustics_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -O "%Output_Loc%" -noextrap +%REGISTRY% "%CURR_LOC%\AeroAcoustics_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" -noextrap GOTO checkError :HydroDyn @@ -238,7 +250,7 @@ GOTO checkError :Morison SET CURR_LOC=%HD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -I "%SEAST_Loc%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError :SeaState @@ -249,7 +261,7 @@ GOTO checkError SET CURR_LOC=%SEAST_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" -I "%NWTC_Lib_Loc%" -I "%CURR_LOC%" -noextrap -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%.txt" %ALL_FAST_Includes% -noextrap -O "%Output_Loc%" GOTO checkError :SubDyn @@ -267,7 +279,7 @@ GOTO checkError :MoorDyn SET CURR_LOC=%MD_Loc% SET Output_Loc=%CURR_LOC% -%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" -I "%NWTC_Lib_Loc%" -I "%SEAST_Loc%" -O "%Output_Loc%" +%REGISTRY% "%CURR_LOC%\%ModuleName%_Registry.txt" %ALL_FAST_Includes% -O "%Output_Loc%" GOTO checkError :IceFloe diff --git a/vs-build/SC_DLL/SC_DLL.sln b/vs-build/SC_DLL/SC_DLL.sln deleted file mode 100644 index ce221a58ed..0000000000 --- a/vs-build/SC_DLL/SC_DLL.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SC_DLL", "SC_DLL.vfproj", "{183CC593-AD4C-9643-81C1-7D6085A9A5ED}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {183CC593-AD4C-9643-81C1-7D6085A9A5ED}.Debug|Win32.ActiveCfg = Debug|Win32 - {183CC593-AD4C-9643-81C1-7D6085A9A5ED}.Debug|Win32.Build.0 = Debug|Win32 - {183CC593-AD4C-9643-81C1-7D6085A9A5ED}.Debug|x64.ActiveCfg = Debug|x64 - {183CC593-AD4C-9643-81C1-7D6085A9A5ED}.Debug|x64.Build.0 = Debug|x64 - {183CC593-AD4C-9643-81C1-7D6085A9A5ED}.Release|Win32.ActiveCfg = Release|Win32 - {183CC593-AD4C-9643-81C1-7D6085A9A5ED}.Release|Win32.Build.0 = Release|Win32 - {183CC593-AD4C-9643-81C1-7D6085A9A5ED}.Release|x64.ActiveCfg = Release|x64 - {183CC593-AD4C-9643-81C1-7D6085A9A5ED}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/vs-build/SC_DLL/SC_DLL.vfproj b/vs-build/SC_DLL/SC_DLL.vfproj deleted file mode 100644 index efc2191044..0000000000 --- a/vs-build/SC_DLL/SC_DLL.vfproj +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/SeaState/SeaStateDriver.sln b/vs-build/SeaState/SeaStateDriver.sln deleted file mode 100644 index ee23e926c1..0000000000 --- a/vs-build/SeaState/SeaStateDriver.sln +++ /dev/null @@ -1,37 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30503.244 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-21924BCA7E90}") = "SeaStateDriver", "SeaStateDriver.vfproj", "{815C302F-A93D-4C22-9329-717B4BC113C0}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug|Win32.ActiveCfg = Debug|Win32 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug|Win32.Build.0 = Debug|Win32 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug|x64.ActiveCfg = Debug|x64 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Debug|x64.Build.0 = Debug|x64 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Release|Win32.ActiveCfg = Release|Win32 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Release|Win32.Build.0 = Release|Win32 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Release|x64.ActiveCfg = Release|x64 - {815C302F-A93D-4C22-9329-717B4BC113C0}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {D73C5D81-14CD-4C14-8B52-6885B380AE3E} - EndGlobalSection -EndGlobal diff --git a/vs-build/SeaState/SeaStateDriver.vfproj b/vs-build/SeaState/SeaStateDriver.vfproj deleted file mode 100644 index f7825846a6..0000000000 --- a/vs-build/SeaState/SeaStateDriver.vfproj +++ /dev/null @@ -1,366 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/SeaState_c_binding/SeaState_c_binding.sln b/vs-build/SeaState_c_binding/SeaState_c_binding.sln deleted file mode 100644 index 16bae50940..0000000000 --- a/vs-build/SeaState_c_binding/SeaState_c_binding.sln +++ /dev/null @@ -1,64 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8A7732CE-4ADA-4074-973E-8E797747D444}") = "SeaState_c_binding", "SeaState_c_binding.vfproj", "{84782F71-FD4C-4427-AD62-B33EF3C9FFE2}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Debug|Win32.ActiveCfg = Debug|Win32 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Debug|Win32.Build.0 = Debug|Win32 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Debug|x64.ActiveCfg = Debug|x64 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Debug|x64.Build.0 = Debug|x64 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Release_Double|x64.Build.0 = Release_Double|x64 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Release|Win32.ActiveCfg = Release|Win32 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Release|Win32.Build.0 = Release|Win32 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Release|x64.ActiveCfg = Release|x64 - {84782F71-FD4C-4427-AD62-B33EF3C9FFE2}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {49DA4583-1BAB-4459-8F53-EB898075680D} - EndGlobalSection -EndGlobal diff --git a/vs-build/SeaState_c_binding/SeaState_c_binding.vfproj b/vs-build/SeaState_c_binding/SeaState_c_binding.vfproj deleted file mode 100644 index 817bff1514..0000000000 --- a/vs-build/SeaState_c_binding/SeaState_c_binding.vfproj +++ /dev/null @@ -1,285 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/SimpleElastoDyn/SimpleElastoDyn_Driver.sln b/vs-build/SimpleElastoDyn/SimpleElastoDyn_Driver.sln deleted file mode 100644 index 956126eccf..0000000000 --- a/vs-build/SimpleElastoDyn/SimpleElastoDyn_Driver.sln +++ /dev/null @@ -1,61 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.40629.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2EF6BE3F-01AD-4236-81A5-69E813EF3897}") = "SimpleElastoDyn_Driver", "SimpleElastoDyn_Driver.vfproj", "{ABF8EC9F-A94B-460C-8AB5-17733D51820B}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Debug|Win32.ActiveCfg = Debug|Win32 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Debug|Win32.Build.0 = Debug|Win32 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Debug|x64.ActiveCfg = Debug|x64 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Debug|x64.Build.0 = Debug|x64 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Release_Double|x64.Build.0 = Release_Double|x64 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Release|Win32.ActiveCfg = Release|Win32 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Release|Win32.Build.0 = Release|Win32 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Release|x64.ActiveCfg = Release|x64 - {ABF8EC9F-A94B-460C-8AB5-17733D51820B}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|Win32 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/vs-build/SimpleElastoDyn/SimpleElastoDyn_Driver.vfproj b/vs-build/SimpleElastoDyn/SimpleElastoDyn_Driver.vfproj deleted file mode 100644 index 4e3f17a83a..0000000000 --- a/vs-build/SimpleElastoDyn/SimpleElastoDyn_Driver.vfproj +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/SubDyn/SubDyn.sln b/vs-build/SubDyn/SubDyn.sln deleted file mode 100644 index fc06af462c..0000000000 --- a/vs-build/SubDyn/SubDyn.sln +++ /dev/null @@ -1,64 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "SubDyn", "SubDyn.vfproj", "{815C302F-A93D-4C22-9329-717B085113C0}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|Win32.ActiveCfg = Debug|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|Win32.Build.0 = Debug|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|x64.ActiveCfg = Debug|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|x64.Build.0 = Debug|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|x64.Build.0 = Release_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|Win32.ActiveCfg = Release|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|Win32.Build.0 = Release|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|x64.ActiveCfg = Release|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {BC2FB3AB-97DC-4701-90B3-DDAF966FAB07} - EndGlobalSection -EndGlobal diff --git a/vs-build/SubDyn/SubDyn.vfproj b/vs-build/SubDyn/SubDyn.vfproj deleted file mode 100644 index fb5db9d8af..0000000000 --- a/vs-build/SubDyn/SubDyn.vfproj +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/TurbSim/TurbSim.vfproj b/vs-build/TurbSim/TurbSim.vfproj deleted file mode 100644 index 7b22a12bac..0000000000 --- a/vs-build/TurbSim/TurbSim.vfproj +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/UnsteadyAero/UnsteadyAero.sln b/vs-build/UnsteadyAero/UnsteadyAero.sln deleted file mode 100644 index 9fbf677f9f..0000000000 --- a/vs-build/UnsteadyAero/UnsteadyAero.sln +++ /dev/null @@ -1,64 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.902 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{6989167D-11E4-40FE-8C1A-2192A86A7E90}") = "UnsteadyAero", "UnsteadyAero.vfproj", "{815C302F-A93D-4C22-9329-717B085113C0}" - ProjectSection(ProjectDependencies) = postProject - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} = {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FAST_Registry", "..\Registry\FAST_Registry.vcxproj", "{DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_Double|Win32 = Debug_Double|Win32 - Debug_Double|x64 = Debug_Double|x64 - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release_Double|Win32 = Release_Double|Win32 - Release_Double|x64 = Release_Double|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|Win32.ActiveCfg = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|Win32.Build.0 = Debug_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|x64.ActiveCfg = Debug_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug_Double|x64.Build.0 = Debug_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|Win32.ActiveCfg = Debug|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|Win32.Build.0 = Debug|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|x64.ActiveCfg = Debug|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Debug|x64.Build.0 = Debug|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|Win32.ActiveCfg = Release_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|Win32.Build.0 = Release_Double|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|x64.ActiveCfg = Release_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release_Double|x64.Build.0 = Release_Double|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|Win32.ActiveCfg = Release|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|Win32.Build.0 = Release|Win32 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|x64.ActiveCfg = Release|x64 - {815C302F-A93D-4C22-9329-717B085113C0}.Release|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Debug|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release_Double|x64.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|Win32.Build.0 = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.ActiveCfg = Release|x64 - {DA16A3A6-3297-4628-9E46-C6FA0E3C4D16}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {367EADB6-7C90-46F7-B3DD-31AFA0C0D727} - EndGlobalSection -EndGlobal diff --git a/vs-build/UnsteadyAero/UnsteadyAero.vfproj b/vs-build/UnsteadyAero/UnsteadyAero.vfproj deleted file mode 100644 index 5f23d47eab..0000000000 --- a/vs-build/UnsteadyAero/UnsteadyAero.vfproj +++ /dev/null @@ -1,359 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/c-bindings/AeroDyn_Inflow_C_Binding.vfproj b/vs-build/c-bindings/AeroDyn_Inflow_C_Binding.vfproj new file mode 100644 index 0000000000..126c78c66f --- /dev/null +++ b/vs-build/c-bindings/AeroDyn_Inflow_C_Binding.vfproj @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/c-bindings/HydroDyn_C_Binding.vfproj b/vs-build/c-bindings/HydroDyn_C_Binding.vfproj new file mode 100644 index 0000000000..e02326505d --- /dev/null +++ b/vs-build/c-bindings/HydroDyn_C_Binding.vfproj @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/c-bindings/IfW_C_Binding.vfproj b/vs-build/c-bindings/IfW_C_Binding.vfproj new file mode 100644 index 0000000000..ba8d9ae200 --- /dev/null +++ b/vs-build/c-bindings/IfW_C_Binding.vfproj @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/c-bindings/MoorDyn_C_Binding.vfproj b/vs-build/c-bindings/MoorDyn_C_Binding.vfproj new file mode 100644 index 0000000000..82fc60a56b --- /dev/null +++ b/vs-build/c-bindings/MoorDyn_C_Binding.vfproj @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/c-bindings/SeaState_C_Binding.vfproj b/vs-build/c-bindings/SeaState_C_Binding.vfproj new file mode 100644 index 0000000000..fa1e50487e --- /dev/null +++ b/vs-build/c-bindings/SeaState_C_Binding.vfproj @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/controllers/DISCON.vfproj b/vs-build/controllers/DISCON.vfproj new file mode 100644 index 0000000000..e07d77d5a2 --- /dev/null +++ b/vs-build/controllers/DISCON.vfproj @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/controllers/DISCON_ITIBarge.vfproj b/vs-build/controllers/DISCON_ITIBarge.vfproj new file mode 100644 index 0000000000..38ecb2a76c --- /dev/null +++ b/vs-build/controllers/DISCON_ITIBarge.vfproj @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/controllers/DISCON_OC3Hywind.vfproj b/vs-build/controllers/DISCON_OC3Hywind.vfproj new file mode 100644 index 0000000000..12076b30d8 --- /dev/null +++ b/vs-build/controllers/DISCON_OC3Hywind.vfproj @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/AeroDisk_Driver.vfproj b/vs-build/drivers/AeroDisk_Driver.vfproj new file mode 100644 index 0000000000..091cbc0968 --- /dev/null +++ b/vs-build/drivers/AeroDisk_Driver.vfproj @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/AeroDyn_Driver.vfproj b/vs-build/drivers/AeroDyn_Driver.vfproj new file mode 100644 index 0000000000..82fb478c96 --- /dev/null +++ b/vs-build/drivers/AeroDyn_Driver.vfproj @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/BeamDyn_Driver.vfproj b/vs-build/drivers/BeamDyn_Driver.vfproj new file mode 100644 index 0000000000..81e69cea94 --- /dev/null +++ b/vs-build/drivers/BeamDyn_Driver.vfproj @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/HydroDyn_Driver.vfproj b/vs-build/drivers/HydroDyn_Driver.vfproj new file mode 100644 index 0000000000..a570acf88e --- /dev/null +++ b/vs-build/drivers/HydroDyn_Driver.vfproj @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/InflowWind_Driver.vfproj b/vs-build/drivers/InflowWind_Driver.vfproj new file mode 100644 index 0000000000..ee1073a6ed --- /dev/null +++ b/vs-build/drivers/InflowWind_Driver.vfproj @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/MoorDyn_Driver.vfproj b/vs-build/drivers/MoorDyn_Driver.vfproj new file mode 100644 index 0000000000..09fe64e79e --- /dev/null +++ b/vs-build/drivers/MoorDyn_Driver.vfproj @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/OrcaFlex_Driver.vfproj b/vs-build/drivers/OrcaFlex_Driver.vfproj new file mode 100644 index 0000000000..aaf37c2df1 --- /dev/null +++ b/vs-build/drivers/OrcaFlex_Driver.vfproj @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/SED_Driver.vfproj b/vs-build/drivers/SED_Driver.vfproj new file mode 100644 index 0000000000..a76a0a53bc --- /dev/null +++ b/vs-build/drivers/SED_Driver.vfproj @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/SeaState_Driver.vfproj b/vs-build/drivers/SeaState_Driver.vfproj new file mode 100644 index 0000000000..74576b487b --- /dev/null +++ b/vs-build/drivers/SeaState_Driver.vfproj @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/SoilDyn_Driver.vfproj b/vs-build/drivers/SoilDyn_Driver.vfproj new file mode 100644 index 0000000000..d3e405de68 --- /dev/null +++ b/vs-build/drivers/SoilDyn_Driver.vfproj @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/SubDyn_Driver.vfproj b/vs-build/drivers/SubDyn_Driver.vfproj new file mode 100644 index 0000000000..074fac0947 --- /dev/null +++ b/vs-build/drivers/SubDyn_Driver.vfproj @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/TurbSim.vfproj b/vs-build/drivers/TurbSim.vfproj new file mode 100644 index 0000000000..ec996e77d2 --- /dev/null +++ b/vs-build/drivers/TurbSim.vfproj @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/drivers/UnsteadyAero_Driver.vfproj b/vs-build/drivers/UnsteadyAero_Driver.vfproj new file mode 100644 index 0000000000..d36bf39d90 --- /dev/null +++ b/vs-build/drivers/UnsteadyAero_Driver.vfproj @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/glue-codes/FAST.Farm.vfproj b/vs-build/glue-codes/FAST.Farm.vfproj new file mode 100644 index 0000000000..0be9099c4f --- /dev/null +++ b/vs-build/glue-codes/FAST.Farm.vfproj @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/glue-codes/OpenFAST-Simulink.vfproj b/vs-build/glue-codes/OpenFAST-Simulink.vfproj new file mode 100644 index 0000000000..12a22420d8 --- /dev/null +++ b/vs-build/glue-codes/OpenFAST-Simulink.vfproj @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/glue-codes/OpenFAST.vfproj b/vs-build/glue-codes/OpenFAST.vfproj new file mode 100644 index 0000000000..525bc2092e --- /dev/null +++ b/vs-build/glue-codes/OpenFAST.vfproj @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/AWAE-C.vcxproj b/vs-build/modules/AWAE-C.vcxproj new file mode 100644 index 0000000000..a4a4e9aadc --- /dev/null +++ b/vs-build/modules/AWAE-C.vcxproj @@ -0,0 +1,108 @@ + + + + + Debug + x64 + + + Release + x64 + + + + + + + 17.0 + Win32Proj + {94F38C02-84E4-4364-806E-3CC45730F6BD} + MAPC + 10.0 + + + + StaticLibrary + true + Unicode + v143 + + + StaticLibrary + false + v143 + Unicode + + + + + + + + + + + + + + + ..\..\build\lib\ + ..\..\build\$(Configuration)_$(Platform)\$(ProjectName)\ + ..\..\modules\nwtc-library\include;$(IncludePath) + $(ProjectName)_$(Configuration) + + + ..\..\build\lib\ + ..\..\build\$(Configuration)_$(Platform)\$(ProjectName)\ + ..\..\modules\nwtc-library\include;$(IncludePath) + $(ProjectName)_$(Configuration) + + + + Level3 + true + _DEBUG;_LIB;MAP_DLL_EXPORTS;CMINPACK_NO_DLL;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + NotUsing + pch.h + true + MultiThreadedDebug + ProgramDatabase + + + + + true + + + true + + + + + Level3 + true + true + true + NDEBUG;_LIB;MAP_DLL_EXPORTS;CMINPACK_NO_DLL;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + NotUsing + pch.h + true + MultiThreaded + + + + + true + true + true + + + true + + + + + + \ No newline at end of file diff --git a/vs-build/modules/AWAE.vfproj b/vs-build/modules/AWAE.vfproj new file mode 100644 index 0000000000..95ceae90ea --- /dev/null +++ b/vs-build/modules/AWAE.vfproj @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/AeroDisk.vfproj b/vs-build/modules/AeroDisk.vfproj new file mode 100644 index 0000000000..cf14ce216d --- /dev/null +++ b/vs-build/modules/AeroDisk.vfproj @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/AeroDyn.vfproj b/vs-build/modules/AeroDyn.vfproj new file mode 100644 index 0000000000..19b702a15c --- /dev/null +++ b/vs-build/modules/AeroDyn.vfproj @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/AeroDyn_Driver_Subs.vfproj b/vs-build/modules/AeroDyn_Driver_Subs.vfproj new file mode 100644 index 0000000000..1e8ae0ec2b --- /dev/null +++ b/vs-build/modules/AeroDyn_Driver_Subs.vfproj @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/AeroDyn_Inflow.vfproj b/vs-build/modules/AeroDyn_Inflow.vfproj new file mode 100644 index 0000000000..da6398b18f --- /dev/null +++ b/vs-build/modules/AeroDyn_Inflow.vfproj @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/BeamDyn.vfproj b/vs-build/modules/BeamDyn.vfproj new file mode 100644 index 0000000000..cb4aa18962 --- /dev/null +++ b/vs-build/modules/BeamDyn.vfproj @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/ElastoDyn.vfproj b/vs-build/modules/ElastoDyn.vfproj new file mode 100644 index 0000000000..d9b2acef70 --- /dev/null +++ b/vs-build/modules/ElastoDyn.vfproj @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/ExtLoads.vfproj b/vs-build/modules/ExtLoads.vfproj new file mode 100644 index 0000000000..e0c84181cd --- /dev/null +++ b/vs-build/modules/ExtLoads.vfproj @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + diff --git a/vs-build/modules/ExtLoads_Types.vfproj b/vs-build/modules/ExtLoads_Types.vfproj new file mode 100644 index 0000000000..8afdbe9f2a --- /dev/null +++ b/vs-build/modules/ExtLoads_Types.vfproj @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/ExtPtfm.vfproj b/vs-build/modules/ExtPtfm.vfproj new file mode 100644 index 0000000000..b37ed48277 --- /dev/null +++ b/vs-build/modules/ExtPtfm.vfproj @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/ExternalInflow.vfproj b/vs-build/modules/ExternalInflow.vfproj new file mode 100644 index 0000000000..e73e73a760 --- /dev/null +++ b/vs-build/modules/ExternalInflow.vfproj @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + diff --git a/vs-build/modules/ExternalInflow_Types.vfproj b/vs-build/modules/ExternalInflow_Types.vfproj new file mode 100644 index 0000000000..cf5b36a55f --- /dev/null +++ b/vs-build/modules/ExternalInflow_Types.vfproj @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/FEAMooring.vfproj b/vs-build/modules/FEAMooring.vfproj new file mode 100644 index 0000000000..0aac9f8ad4 --- /dev/null +++ b/vs-build/modules/FEAMooring.vfproj @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/HydroDyn.vfproj b/vs-build/modules/HydroDyn.vfproj new file mode 100644 index 0000000000..e07f77c920 --- /dev/null +++ b/vs-build/modules/HydroDyn.vfproj @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/IceDyn.vfproj b/vs-build/modules/IceDyn.vfproj new file mode 100644 index 0000000000..ce7756d993 --- /dev/null +++ b/vs-build/modules/IceDyn.vfproj @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/IceFloe.vfproj b/vs-build/modules/IceFloe.vfproj new file mode 100644 index 0000000000..5b417f7a90 --- /dev/null +++ b/vs-build/modules/IceFloe.vfproj @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/InflowWind.vfproj b/vs-build/modules/InflowWind.vfproj new file mode 100644 index 0000000000..9f60d9b6dc --- /dev/null +++ b/vs-build/modules/InflowWind.vfproj @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/LinDyn.vfproj b/vs-build/modules/LinDyn.vfproj new file mode 100644 index 0000000000..afd7a7f5a9 --- /dev/null +++ b/vs-build/modules/LinDyn.vfproj @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/MAPlib/MAP_dll.vcxproj b/vs-build/modules/MAP-C.vcxproj similarity index 55% rename from vs-build/MAPlib/MAP_dll.vcxproj rename to vs-build/modules/MAP-C.vcxproj index 4ba5c06d02..3da0dc2a92 100644 --- a/vs-build/MAPlib/MAP_dll.vcxproj +++ b/vs-build/modules/MAP-C.vcxproj @@ -1,205 +1,147 @@ - + - - Debug - Win32 - Debug x64 - - Release - Win32 - Release x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - {BF86702A-CB17-4050-8AE9-078CDC5910D3} + 17.0 Win32Proj - MAP_DLL + {471eeb17-a1aa-43b0-acee-719b80bb4811} + MAPC 10.0 - - StaticLibrary - true - Unicode - v142 - StaticLibrary true + v143 Unicode - v142 - - - StaticLibrary - false - true - Unicode - v142 StaticLibrary false - true + v143 Unicode - v142 - - - - - + - + - + - - true - ..\..\build\bin\ - MAP_$(PlatformName) - - MAP_$(PlatformName) - true - ..\..\build\bin\ - $(PlatformName)\$(ConfigurationName) - - - false - ..\..\build\bin\ - MAP_$(PlatformName) + ..\..\build\lib\ + ..\..\build\$(Configuration)_$(Platform)\$(ProjectName)\ + $(ProjectName)_$(Configuration) - MAP_$(PlatformName) - false - ..\..\build\bin\ - $(PlatformName)\$(ConfigurationName) + ..\..\build\lib\ + ..\..\build\$(Configuration)_$(Platform)\$(ProjectName)\ + $(ProjectName)_$(Configuration) - - - NotUsing - Level3 - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;CMINPACK_NO_DLL;%(PreprocessorDefinitions) - true - MultiThreadedDebug - ..\..\modules\map\src - - - Windows - true - - - NotUsing Level3 - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;CMINPACK_NO_DLL;%(PreprocessorDefinitions) true + _DEBUG;_LIB;MAP_DLL_EXPORTS;CMINPACK_NO_DLL;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + NotUsing + pch.h + true MultiThreadedDebug + ProgramDatabase - Windows + + true - - - - Level3 - NotUsing - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;CMINPACK_NO_DLL;%(PreprocessorDefinitions) - true - MultiThreaded - - - Windows - true - true - + + true + Level3 - NotUsing - MaxSpeed true true - WIN32;NDEBUG;_WINDOWS;_USRDLL;CMINPACK_NO_DLL;%(PreprocessorDefinitions) true + NDEBUG;_LIB;MAP_DLL_EXPORTS;CMINPACK_NO_DLL;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + NotUsing + pch.h + true MultiThreaded - Windows + + true true + true + + true + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vs-build/modules/MAP.vfproj b/vs-build/modules/MAP.vfproj new file mode 100644 index 0000000000..efb5f758b3 --- /dev/null +++ b/vs-build/modules/MAP.vfproj @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/MoorDyn.vfproj b/vs-build/modules/MoorDyn.vfproj new file mode 100644 index 0000000000..d2e951ba95 --- /dev/null +++ b/vs-build/modules/MoorDyn.vfproj @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/NWTC-Library.vfproj b/vs-build/modules/NWTC-Library.vfproj new file mode 100644 index 0000000000..abce4b81ca --- /dev/null +++ b/vs-build/modules/NWTC-Library.vfproj @@ -0,0 +1,240 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/OpenFAST-Library.vfproj b/vs-build/modules/OpenFAST-Library.vfproj new file mode 100644 index 0000000000..ece570e47a --- /dev/null +++ b/vs-build/modules/OpenFAST-Library.vfproj @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/OpenFAST-Prelib.vfproj b/vs-build/modules/OpenFAST-Prelib.vfproj new file mode 100644 index 0000000000..5910a53f81 --- /dev/null +++ b/vs-build/modules/OpenFAST-Prelib.vfproj @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/OrcaFlex.vfproj b/vs-build/modules/OrcaFlex.vfproj new file mode 100644 index 0000000000..0bcfc3014f --- /dev/null +++ b/vs-build/modules/OrcaFlex.vfproj @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/Registry.vcxproj b/vs-build/modules/Registry.vcxproj new file mode 100644 index 0000000000..aa417c16e7 --- /dev/null +++ b/vs-build/modules/Registry.vcxproj @@ -0,0 +1,99 @@ + + + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + 17.0 + Win32Proj + {ec73da51-78cf-41db-9dfa-88360bf2ea93} + openfastregistry + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + Unicode + + + + + + + + + + + + + + + ..\..\build\bin\ + ..\..\build\$(Configuration)_$(Platform)\$(ProjectName)\ + $(ProjectName) + + + ..\..\build\bin\ + ..\..\build\$(Configuration)_$(Platform)\$(ProjectName)\ + $(ProjectName) + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + true + + + Console + true + true + true + + + + + + \ No newline at end of file diff --git a/vs-build/modules/SeaState.vfproj b/vs-build/modules/SeaState.vfproj new file mode 100644 index 0000000000..10fe6249c6 --- /dev/null +++ b/vs-build/modules/SeaState.vfproj @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/ServoDyn.vfproj b/vs-build/modules/ServoDyn.vfproj new file mode 100644 index 0000000000..b865db6d17 --- /dev/null +++ b/vs-build/modules/ServoDyn.vfproj @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/SimpleElastoDyn.vfproj b/vs-build/modules/SimpleElastoDyn.vfproj new file mode 100644 index 0000000000..ca795dd952 --- /dev/null +++ b/vs-build/modules/SimpleElastoDyn.vfproj @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/SoilDyn.vfproj b/vs-build/modules/SoilDyn.vfproj new file mode 100644 index 0000000000..d011cada32 --- /dev/null +++ b/vs-build/modules/SoilDyn.vfproj @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/SubDyn.vfproj b/vs-build/modules/SubDyn.vfproj new file mode 100644 index 0000000000..cce6203fc5 --- /dev/null +++ b/vs-build/modules/SubDyn.vfproj @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/modules/VersionInfo.vfproj b/vs-build/modules/VersionInfo.vfproj new file mode 100644 index 0000000000..9ec48e4940 --- /dev/null +++ b/vs-build/modules/VersionInfo.vfproj @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + diff --git a/vs-build/modules/WakeDynamics.vfproj b/vs-build/modules/WakeDynamics.vfproj new file mode 100644 index 0000000000..359458c9b4 --- /dev/null +++ b/vs-build/modules/WakeDynamics.vfproj @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vs-build/update-vfproj.py b/vs-build/update-vfproj.py new file mode 100644 index 0000000000..75ee42fa74 --- /dev/null +++ b/vs-build/update-vfproj.py @@ -0,0 +1,128 @@ +from pathlib import Path + +import bs4 +import copy + +formatter = bs4.formatter.HTMLFormatter(indent=4) + +options_debug_release = {"Debug": {}, "Release": {}} + +cfg_names = [ + "Debug|x64", + "Double_Debug|x64", + "Matlab_Debug|x64", + "Release|x64", + "Double_Release|x64", + "Matlab_Release|x64", + "OpenMP_Release|x64", + "Double_OpenMP_Release|x64", +] + +for path in Path(".").rglob("*.vfproj"): + + print(path) + with open(path) as fp: + soup = bs4.BeautifulSoup(fp, "xml") + cfgs = soup.find("Configurations") + cfg_map = { + "Debug|x64": cfgs.find("Configuration", Name="Debug|x64"), + "Release|x64": cfgs.find("Configuration", Name="Release|x64"), + } + cfgs.clear() + for cfg_name in cfg_names: + if "Debug" in cfg_name: + cfg = copy.copy(cfg_map["Debug|x64"]) + else: + cfg = copy.copy(cfg_map["Release|x64"]) + cfg["Name"] = cfg_name + + # Get tool elements + compiler_tool = cfg.find("Tool", Name="VFFortranCompilerTool") + linker_tool = cfg.find("Tool", Name="VFLinkerTool") + prebuild_tool = cfg.find("Tool", Name="VFPreBuildEventTool") + + # Compiler tool settings + compiler_tool["Preprocess"] = "preprocessYes" + compiler_tool["MultiProcessorCompilation"] = "true" + compiler_tool["UseMkl"] = "mklSequential" + compiler_tool["WarnUnusedVariables"] = "false" + if "Debug" in cfg["Name"]: + compiler_tool["RuntimeLibrary"] = "rtMultiThreadedDebug" + else: + compiler_tool["RuntimeLibrary"] = "rtMultiThreaded" + + # Determine project type (static lib, shared lib, executable) + if cfg.attrs.get("ConfigurationType", "") == "typeStaticLibrary": + cfg["OutputDirectory"] = "..\\..\\build\\lib" + elif cfg.attrs.get("ConfigurationType", "") == "typeDynamicLibrary": + cfg["OutputDirectory"] = "..\\..\\build\\bin" + if 'Debug' in cfg_name: + compiler_tool["FloatingPointExceptionHandling"] = "fpe0" + linker_tool["StackReserveSize"] = "9999999" + elif linker_tool != None and linker_tool["SubSystem"] == "subSystemConsole": + cfg["OutputDirectory"] = "..\\..\\build\\bin" + if 'Debug' in cfg_name: + compiler_tool["FloatingPointExceptionHandling"] = "fpe0" + linker_tool["StackReserveSize"] = "9999999" + linker_tool['GenerateManifest'] = "false" + else: + print("unknown project type") + continue + + # Set intermediate build directory + cfg["IntermediateDirectory"] = ( + "..\\..\\build\\$(Configuration)_$(Platform)\\$(ProjectName)\\" + ) + + # Preprocessor defines + defines = [] + + # Project specific settings + if "NWTC" in str(path): + # defines.append("HAS_FORTRAN2008_FEATURES") + pass + if "VersionInfo" in str(path): + defines.append("GIT_INCLUDE_FILE='..\\gitVersionInfo.h'") + prebuild_tool["CommandLine"] = "..\\CreateGitVersion.bat" + + # Configuration spectific settings + if "Double" in cfg["Name"]: + compiler_tool["RealKIND"] = "realKIND8" + compiler_tool["DoublePrecisionKIND"] = "doublePrecisionKIND8" + if "NWTC" in str(path): + defines.append("OPENFAST_DOUBLE_PRECISION") + if "OpenMP" in cfg["Name"]: + compiler_tool["OpenMP"] = "OpenMPParallelCode" + compiler_tool["EnableOpenMPSupport"] = "OpenMPParallelCodeIFX" + if "Matlab" in cfg["Name"]: + defines.append("COMPILE_SIMULINK") + defines.append("CONSOLE_FILE") + + # Preprocessor defines + compiler_tool["PreprocessorDefinitions"] = ";".join(defines) + + # Add config to configs + cfgs.append(cfg) + + # Update registry file configurations + for f in soup.find_all("File"): + fcs = f.find_all("FileConfiguration") + if len(fcs) == 0: + continue + fc_base = copy.copy(fcs[0]) + for fc in f.find_all("FileConfiguration"): + fc.decompose() + for cfg_name in cfg_names: + fc = copy.copy(fc_base) + fc["Name"] = cfg_name + f.append(fc) + + # Write file + with open(path, "w") as fp: + for line in soup.prettify().splitlines(): + try: + n = line.index("<") + except: + n = 0 + line = ("\t" * n) + line[n:] + "\n" + fp.write(line)